From 630c3b4815aea7bacbfab1ba10570fd91e1ecb55 Mon Sep 17 00:00:00 2001 From: Jacob Brewer Date: Sun, 3 Nov 2024 10:29:07 +0000 Subject: [PATCH 1/3] Using an updated version of tidb --- go.mod | 56 +- go.sum | 162 +- pkg/generation/load.go | 7 +- pkg/generation/template_helpers.go | 122 + pkg/models/column.go | 86 +- pkg/models/constraint.go | 6 +- pkg/models/table.go | 4 +- vendor/github.com/BurntSushi/toml/.gitignore | 5 - vendor/github.com/BurntSushi/toml/.travis.yml | 15 - vendor/github.com/BurntSushi/toml/COMPATIBLE | 3 - vendor/github.com/BurntSushi/toml/Makefile | 19 - vendor/github.com/BurntSushi/toml/README.md | 218 - vendor/github.com/BurntSushi/toml/decode.go | 509 - .../github.com/BurntSushi/toml/decode_meta.go | 121 - vendor/github.com/BurntSushi/toml/doc.go | 27 - vendor/github.com/BurntSushi/toml/encode.go | 568 - .../BurntSushi/toml/encoding_types.go | 19 - .../BurntSushi/toml/encoding_types_1.1.go | 18 - vendor/github.com/BurntSushi/toml/lex.go | 953 - vendor/github.com/BurntSushi/toml/parse.go | 592 - vendor/github.com/BurntSushi/toml/session.vim | 1 - .../github.com/BurntSushi/toml/type_check.go | 91 - .../github.com/BurntSushi/toml/type_fields.go | 242 - .../github.com/Masterminds/semver/.travis.yml | 2 + .../Masterminds/semver/CHANGELOG.md | 23 + .../github.com/Masterminds/semver/LICENSE.txt | 3 +- .../github.com/Masterminds/semver/README.md | 43 +- .../Masterminds/semver/constraints.go | 43 +- vendor/github.com/Masterminds/semver/doc.go | 2 +- .../github.com/Masterminds/semver/version.go | 16 +- .../Masterminds/semver/version_fuzz.go | 10 + .../codahale/hdrhistogram/.travis.yml | 5 - .../codahale/hdrhistogram/README.md | 15 - .../github.com/codahale/hdrhistogram/hdr.go | 564 - .../codahale/hdrhistogram/window.go | 45 - vendor/github.com/cznic/mathutil/AUTHORS | 13 - vendor/github.com/cznic/mathutil/CONTRIBUTORS | 14 - vendor/github.com/cznic/mathutil/LICENSE | 27 - vendor/github.com/cznic/mathutil/Makefile | 57 - vendor/github.com/cznic/mathutil/README | 10 - vendor/github.com/cznic/mathutil/bits.go | 207 - vendor/github.com/cznic/mathutil/envelope.go | 46 - vendor/github.com/cznic/mathutil/int.go | 155 - vendor/github.com/cznic/mathutil/mathutil.go | 1416 - .../cznic/mathutil/nist-sts-2-1-1-report | 267 - vendor/github.com/cznic/mathutil/permute.go | 39 - vendor/github.com/cznic/mathutil/poly.go | 248 - vendor/github.com/cznic/mathutil/primes.go | 335 - vendor/github.com/cznic/mathutil/rat.go | 27 - vendor/github.com/cznic/mathutil/rnd.go | 383 - vendor/github.com/cznic/mathutil/tables.go | 6995 ----- vendor/github.com/cznic/mathutil/test_deps.go | 11 - vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 28 - .../golang/protobuf/jsonpb/decode.go | 530 - .../golang/protobuf/jsonpb/encode.go | 559 - .../github.com/golang/protobuf/jsonpb/json.go | 69 - .../golang/protobuf/proto/buffer.go | 324 - .../golang/protobuf/proto/defaults.go | 63 - .../golang/protobuf/proto/deprecated.go | 113 - .../golang/protobuf/proto/discard.go | 58 - .../golang/protobuf/proto/extensions.go | 356 - .../golang/protobuf/proto/properties.go | 306 - .../github.com/golang/protobuf/proto/proto.go | 167 - .../golang/protobuf/proto/registry.go | 317 - .../golang/protobuf/proto/text_decode.go | 801 - .../golang/protobuf/proto/text_encode.go | 560 - .../github.com/golang/protobuf/proto/wire.go | 78 - .../golang/protobuf/proto/wrappers.go | 34 - .../github.com/golang/protobuf/ptypes/any.go | 179 - .../golang/protobuf/ptypes/any/any.pb.go | 62 - .../github.com/golang/protobuf/ptypes/doc.go | 10 - .../golang/protobuf/ptypes/duration.go | 76 - .../protobuf/ptypes/duration/duration.pb.go | 63 - .../golang/protobuf/ptypes/timestamp.go | 112 - .../protobuf/ptypes/timestamp/timestamp.pb.go | 64 - vendor/github.com/golang/snappy/.gitignore | 16 - vendor/github.com/golang/snappy/AUTHORS | 15 - vendor/github.com/golang/snappy/CONTRIBUTORS | 37 - vendor/github.com/golang/snappy/LICENSE | 27 - vendor/github.com/golang/snappy/README | 107 - vendor/github.com/golang/snappy/decode.go | 237 - .../github.com/golang/snappy/decode_amd64.go | 14 - .../github.com/golang/snappy/decode_amd64.s | 490 - .../github.com/golang/snappy/decode_other.go | 101 - vendor/github.com/golang/snappy/encode.go | 285 - .../github.com/golang/snappy/encode_amd64.go | 29 - .../github.com/golang/snappy/encode_amd64.s | 730 - .../github.com/golang/snappy/encode_other.go | 238 - vendor/github.com/golang/snappy/snappy.go | 98 - vendor/github.com/google/uuid/.travis.yml | 9 - vendor/github.com/google/uuid/CHANGELOG.md | 10 + vendor/github.com/google/uuid/CONTRIBUTING.md | 16 + vendor/github.com/google/uuid/README.md | 10 +- vendor/github.com/google/uuid/node_js.go | 2 +- vendor/github.com/google/uuid/uuid.go | 10 +- .../github.com/imdario/mergo/.deepsource.toml | 12 + vendor/github.com/imdario/mergo/.travis.yml | 2 + vendor/github.com/imdario/mergo/README.md | 83 +- vendor/github.com/imdario/mergo/doc.go | 141 +- vendor/github.com/imdario/mergo/map.go | 4 + vendor/github.com/imdario/mergo/merge.go | 170 +- vendor/github.com/imdario/mergo/mergo.go | 21 +- vendor/github.com/juju/errors/LICENSE | 191 - vendor/github.com/juju/errors/Makefile | 11 - vendor/github.com/juju/errors/README.md | 543 - vendor/github.com/juju/errors/doc.go | 81 - vendor/github.com/juju/errors/error.go | 172 - vendor/github.com/juju/errors/errortypes.go | 309 - vendor/github.com/juju/errors/functions.go | 330 - vendor/github.com/juju/errors/path.go | 38 - .../go-windows-terminal-sequences/LICENSE | 9 - .../go-windows-terminal-sequences/README.md | 42 - .../sequences.go | 35 - .../sequences_dummy.go | 11 - .../opentracing/opentracing-go/.gitignore | 13 - .../opentracing/opentracing-go/.travis.yml | 14 - .../opentracing/opentracing-go/CHANGELOG.md | 14 - .../opentracing/opentracing-go/LICENSE | 21 - .../opentracing/opentracing-go/Makefile | 32 - .../opentracing/opentracing-go/README.md | 147 - .../opentracing/opentracing-go/ext/tags.go | 198 - .../opentracing-go/globaltracer.go | 32 - .../opentracing/opentracing-go/gocontext.go | 57 - .../opentracing/opentracing-go/log/field.go | 245 - .../opentracing/opentracing-go/log/util.go | 54 - .../opentracing/opentracing-go/noop.go | 64 - .../opentracing/opentracing-go/propagation.go | 176 - .../opentracing/opentracing-go/span.go | 185 - .../opentracing/opentracing-go/tracer.go | 305 - .../{pkg => pingcap}/errors/.gitignore | 1 + vendor/github.com/pingcap/errors/.travis.yml | 11 + .../{pkg => pingcap}/errors/LICENSE | 0 .../{pkg => pingcap}/errors/README.md | 13 +- .../pingcap/errors/compatible_shim.go | 98 + .../{pkg => pingcap}/errors/errors.go | 162 +- vendor/github.com/pingcap/errors/group.go | 42 + .../github.com/pingcap/errors/juju_adaptor.go | 154 + vendor/github.com/pingcap/errors/normalize.go | 377 + .../{pkg => pingcap}/errors/stack.go | 141 +- .../github.com/pingcap/failpoint/.codecov.yml | 39 + .../github.com/pingcap/failpoint/.gitignore | 27 + .../pingcap/failpoint/CONTRIBUTING.md | 94 + .../failpoint}/LICENSE | 0 .../pingcap/failpoint/MAINTAINERS.md | 12 + vendor/github.com/pingcap/failpoint/Makefile | 78 + vendor/github.com/pingcap/failpoint/README.md | 557 + .../github.com/pingcap/failpoint/failpoint.go | 150 + .../pingcap/failpoint/failpoints.go | 324 + vendor/github.com/pingcap/failpoint/http.go | 110 + vendor/github.com/pingcap/failpoint/marker.go | 100 + vendor/github.com/pingcap/failpoint/terms.go | 376 + vendor/github.com/pingcap/goleveldb/LICENSE | 24 - .../pingcap/goleveldb/leveldb/batch.go | 349 - .../pingcap/goleveldb/leveldb/cache/cache.go | 705 - .../pingcap/goleveldb/leveldb/cache/lru.go | 195 - .../pingcap/goleveldb/leveldb/comparer.go | 67 - .../leveldb/comparer/bytes_comparer.go | 51 - .../goleveldb/leveldb/comparer/comparer.go | 57 - .../pingcap/goleveldb/leveldb/db.go | 1091 - .../goleveldb/leveldb/db_compaction.go | 826 - .../pingcap/goleveldb/leveldb/db_iter.go | 360 - .../pingcap/goleveldb/leveldb/db_snapshot.go | 183 - .../pingcap/goleveldb/leveldb/db_state.go | 239 - .../goleveldb/leveldb/db_transaction.go | 325 - .../pingcap/goleveldb/leveldb/db_util.go | 102 - .../pingcap/goleveldb/leveldb/db_write.go | 452 - .../pingcap/goleveldb/leveldb/doc.go | 92 - .../pingcap/goleveldb/leveldb/errors.go | 20 - .../goleveldb/leveldb/errors/errors.go | 78 - .../pingcap/goleveldb/leveldb/filter.go | 31 - .../pingcap/goleveldb/leveldb/filter/bloom.go | 116 - .../goleveldb/leveldb/filter/filter.go | 60 - .../goleveldb/leveldb/iterator/array_iter.go | 184 - .../leveldb/iterator/indexed_iter.go | 242 - .../goleveldb/leveldb/iterator/iter.go | 132 - .../goleveldb/leveldb/iterator/merged_iter.go | 304 - .../goleveldb/leveldb/journal/journal.go | 524 - .../pingcap/goleveldb/leveldb/key.go | 143 - .../pingcap/goleveldb/leveldb/memdb/memdb.go | 524 - .../pingcap/goleveldb/leveldb/opt/options.go | 684 - .../pingcap/goleveldb/leveldb/options.go | 107 - .../pingcap/goleveldb/leveldb/session.go | 210 - .../goleveldb/leveldb/session_compaction.go | 302 - .../goleveldb/leveldb/session_record.go | 323 - .../pingcap/goleveldb/leveldb/session_util.go | 271 - .../goleveldb/leveldb/storage/file_storage.go | 599 - .../leveldb/storage/file_storage_nacl.go | 34 - .../leveldb/storage/file_storage_plan9.go | 65 - .../leveldb/storage/file_storage_solaris.go | 81 - .../leveldb/storage/file_storage_unix.go | 86 - .../leveldb/storage/file_storage_windows.go | 78 - .../goleveldb/leveldb/storage/mem_storage.go | 218 - .../goleveldb/leveldb/storage/storage.go | 179 - .../pingcap/goleveldb/leveldb/table.go | 529 - .../pingcap/goleveldb/leveldb/table/reader.go | 1135 - .../pingcap/goleveldb/leveldb/table/table.go | 177 - .../pingcap/goleveldb/leveldb/table/writer.go | 375 - .../pingcap/goleveldb/leveldb/util.go | 98 - .../pingcap/goleveldb/leveldb/util/buffer.go | 293 - .../goleveldb/leveldb/util/buffer_pool.go | 239 - .../pingcap/goleveldb/leveldb/util/crc32.go | 30 - .../pingcap/goleveldb/leveldb/util/hash.go | 48 - .../pingcap/goleveldb/leveldb/util/range.go | 32 - .../pingcap/goleveldb/leveldb/util/util.go | 73 - .../pingcap/goleveldb/leveldb/version.go | 528 - .../logrus => pingcap/log}/.gitignore | 2 +- .../{uber/jaeger-lib => pingcap/log}/LICENSE | 0 vendor/github.com/pingcap/log/README.md | 4 + vendor/github.com/pingcap/log/config.go | 110 + vendor/github.com/pingcap/log/global.go | 84 + vendor/github.com/pingcap/log/log.go | 242 + .../github.com/pingcap/log/zap_test_logger.go | 80 + .../github.com/pingcap/log/zap_text_core.go | 91 + .../pingcap/log/zap_text_encoder.go | 664 + vendor/github.com/pingcap/tidb/CONTRIBUTORS | 124 - vendor/github.com/pingcap/tidb/LICENSE | 201 - vendor/github.com/pingcap/tidb/ast/ddl.go | 865 - vendor/github.com/pingcap/tidb/ast/dml.go | 1034 - .../github.com/pingcap/tidb/ast/functions.go | 507 - vendor/github.com/pingcap/tidb/ast/misc.go | 812 - vendor/github.com/pingcap/tidb/ast/stats.go | 89 - .../github.com/pingcap/tidb/config/config.go | 378 - .../pingcap/tidb/config/config.toml.example | 239 - .../pingcap/tidb/kv/buffer_store.go | 117 - vendor/github.com/pingcap/tidb/kv/error.go | 107 - .../pingcap/tidb/kv/fault_injection.go | 143 - vendor/github.com/pingcap/tidb/kv/iter.go | 29 - vendor/github.com/pingcap/tidb/kv/key.go | 96 - vendor/github.com/pingcap/tidb/kv/kv.go | 274 - .../pingcap/tidb/kv/memdb_buffer.go | 181 - vendor/github.com/pingcap/tidb/kv/mock.go | 216 - vendor/github.com/pingcap/tidb/kv/txn.go | 124 - .../github.com/pingcap/tidb/kv/union_iter.go | 185 - .../github.com/pingcap/tidb/kv/union_store.go | 266 - vendor/github.com/pingcap/tidb/kv/utils.go | 60 - vendor/github.com/pingcap/tidb/kv/version.go | 51 - .../pingcap/tidb/meta/autoid/autoid.go | 262 - vendor/github.com/pingcap/tidb/meta/meta.go | 723 - vendor/github.com/pingcap/tidb/metrics/ddl.go | 124 - .../pingcap/tidb/metrics/distsql.go | 62 - .../github.com/pingcap/tidb/metrics/domain.go | 54 - .../pingcap/tidb/metrics/executor.go | 44 - .../github.com/pingcap/tidb/metrics/meta.go | 53 - .../pingcap/tidb/metrics/metrics.go | 53 - .../github.com/pingcap/tidb/metrics/owner.go | 58 - .../github.com/pingcap/tidb/metrics/server.go | 138 - .../pingcap/tidb/metrics/session.go | 123 - .../github.com/pingcap/tidb/metrics/stats.go | 80 - .../pingcap/tidb/metrics/tikvclient.go | 211 - vendor/github.com/pingcap/tidb/model/ddl.go | 352 - vendor/github.com/pingcap/tidb/model/model.go | 413 - .../github.com/pingcap/tidb/mysql/errcode.go | 906 - .../github.com/pingcap/tidb/mysql/errname.go | 901 - .../github.com/pingcap/tidb/parser/lexer.go | 767 - vendor/github.com/pingcap/tidb/parser/misc.go | 608 - .../pingcap/tidb/parser/opcode/opcode.go | 138 - .../github.com/pingcap/tidb/parser/parser.go | 11036 ------- .../github.com/pingcap/tidb/parser/parser.y | 6761 ---- .../pingcap/tidb/parser/yy_parser.go | 242 - .../pingcap/tidb/pkg/parser/.editorconfig | 12 + .../pingcap/tidb/pkg/parser/.gitignore | 6 + .../pingcap/tidb/pkg/parser/BUILD.bazel | 68 + .../pingcap/tidb/pkg/parser}/LICENSE | 1 - .../pingcap/tidb/pkg/parser/Makefile | 36 + .../github.com/pingcap/tidb/pkg/parser/OWNERS | 10 + .../pingcap/tidb/pkg/parser/README.md | 69 + .../pingcap/tidb/pkg/parser/SECURITY.md | 31 + .../pingcap/tidb/pkg/parser/ast/BUILD.bazel | 62 + .../pingcap/tidb/{ => pkg/parser}/ast/ast.go | 208 +- .../pingcap/tidb/{ => pkg/parser}/ast/base.go | 62 +- .../pingcap/tidb/pkg/parser/ast/ddl.go | 4955 +++ .../pingcap/tidb/pkg/parser/ast/dml.go | 4020 +++ .../tidb/{ => pkg/parser}/ast/expressions.go | 841 +- .../pingcap/tidb/{ => pkg/parser}/ast/flag.go | 24 +- .../pingcap/tidb/pkg/parser/ast/functions.go | 1184 + .../pingcap/tidb/pkg/parser/ast/misc.go | 4307 +++ .../pingcap/tidb/pkg/parser/ast/procedure.go | 1176 + .../pingcap/tidb/pkg/parser/ast/stats.go | 351 + .../parser/ast/util.go} | 47 +- .../pingcap/tidb/pkg/parser/auth/BUILD.bazel | 36 + .../pingcap/tidb/pkg/parser/auth/auth.go | 95 + .../tidb/pkg/parser/auth/caching_sha2.go | 245 + .../parser/auth/mysql_native_password.go} | 64 +- .../pingcap/tidb/pkg/parser/auth/tidb_sm3.go | 216 + .../tidb/pkg/parser/charset/BUILD.bazel | 49 + .../tidb/pkg/parser/charset/charset.go | 663 + .../tidb/pkg/parser/charset/encoding.go | 159 + .../tidb/pkg/parser/charset/encoding_ascii.go | 85 + .../tidb/pkg/parser/charset/encoding_base.go | 145 + .../tidb/pkg/parser/charset/encoding_bin.go | 68 + .../tidb/pkg/parser/charset/encoding_gbk.go | 175 + .../pkg/parser/charset/encoding_latin1.go | 60 + .../parser}/charset/encoding_table.go | 5 + .../tidb/pkg/parser/charset/encoding_utf8.go | 136 + .../pingcap/tidb/pkg/parser/digester.go | 665 + .../tidb/pkg/parser/duration/BUILD.bazel | 18 + .../tidb/pkg/parser/duration/duration.go | 73 + .../tidb/pkg/parser/format/BUILD.bazel | 21 + .../pingcap/tidb/pkg/parser/format/format.go | 485 + .../pingcap/tidb/pkg/parser/generate.go | 4 + .../pingcap/tidb/pkg/parser/hintparser.go | 1592 + .../pingcap/tidb/pkg/parser/hintparser.y | 794 + .../pingcap/tidb/pkg/parser/hintparserimpl.go | 164 + .../pingcap/tidb/pkg/parser/keywords.go | 682 + .../pingcap/tidb/pkg/parser/lexer.go | 1107 + .../pingcap/tidb/pkg/parser/misc.go | 1145 + .../pingcap/tidb/pkg/parser/model/BUILD.bazel | 18 + .../pingcap/tidb/pkg/parser/model/model.go | 407 + .../pingcap/tidb/pkg/parser/mysql/BUILD.bazel | 38 + .../tidb/{ => pkg/parser}/mysql/charset.go | 106 +- .../tidb/{ => pkg/parser}/mysql/const.go | 439 +- .../pingcap/tidb/pkg/parser/mysql/errcode.go | 979 + .../pingcap/tidb/pkg/parser/mysql/errname.go | 984 + .../tidb/{ => pkg/parser}/mysql/error.go | 11 +- .../{ => pkg/parser}/mysql/locale_format.go | 16 +- .../pingcap/tidb/pkg/parser/mysql/privs.go | 329 + .../tidb/{ => pkg/parser}/mysql/state.go | 12 +- .../tidb/{ => pkg/parser}/mysql/type.go | 61 +- .../tidb/{ => pkg/parser}/mysql/util.go | 35 +- .../tidb/pkg/parser/opcode/BUILD.bazel | 17 + .../pingcap/tidb/pkg/parser/opcode/opcode.go | 246 + .../pingcap/tidb/pkg/parser/parser.go | 25472 ++++++++++++++++ .../pingcap/tidb/pkg/parser/parser.y | 16527 ++++++++++ .../tidb/pkg/parser/terror/BUILD.bazel | 27 + .../pingcap/tidb/pkg/parser/terror/terror.go | 337 + .../pingcap/tidb/pkg/parser/test.sh | 3 + .../tidb/pkg/parser/test_driver/BUILD.bazel | 21 + .../pkg/parser/test_driver/test_driver.go | 231 + .../parser/test_driver/test_driver_datum.go | 513 + .../parser/test_driver/test_driver_helper.go | 73 + .../test_driver/test_driver_mydecimal.go | 287 + .../pingcap/tidb/pkg/parser/tidb/BUILD.bazel | 8 + .../pingcap/tidb/pkg/parser/tidb/features.go | 58 + .../pingcap/tidb/pkg/parser/types/BUILD.bazel | 38 + .../pingcap/tidb/pkg/parser/types/etc.go | 171 + .../tidb/{ => pkg/parser}/types/eval_type.go | 37 +- .../tidb/pkg/parser/types/field_type.go | 776 + .../pingcap/tidb/pkg/parser/yy_parser.go | 449 + .../pingcap/tidb/sessionctx/context.go | 118 - .../tidb/sessionctx/stmtctx/stmtctx.go | 225 - .../tidb/sessionctx/variable/session.go | 594 - .../tidb/sessionctx/variable/statusvar.go | 172 - .../tidb/sessionctx/variable/sysvar.go | 687 - .../tidb/sessionctx/variable/tidb_vars.go | 201 - .../tidb/sessionctx/variable/varsutil.go | 213 - .../pingcap/tidb/store/tikv/oracle/oracle.go | 55 - .../github.com/pingcap/tidb/structure/hash.go | 302 - .../github.com/pingcap/tidb/structure/list.go | 243 - .../pingcap/tidb/structure/string.go | 79 - .../pingcap/tidb/structure/structure.go | 53 - .../github.com/pingcap/tidb/structure/type.go | 116 - .../github.com/pingcap/tidb/terror/terror.go | 345 - .../pingcap/tidb/types/binary_literal.go | 227 - .../github.com/pingcap/tidb/types/compare.go | 58 - .../github.com/pingcap/tidb/types/convert.go | 463 - vendor/github.com/pingcap/tidb/types/datum.go | 1834 -- .../pingcap/tidb/types/datum_eval.go | 568 - vendor/github.com/pingcap/tidb/types/enum.go | 62 - .../github.com/pingcap/tidb/types/errors.go | 109 - vendor/github.com/pingcap/tidb/types/etc.go | 213 - .../pingcap/tidb/types/field_type.go | 1421 - vendor/github.com/pingcap/tidb/types/fsp.go | 97 - .../github.com/pingcap/tidb/types/helper.go | 158 - .../pingcap/tidb/types/json/binary.go | 619 - .../tidb/types/json/binary_functions.go | 691 - .../pingcap/tidb/types/json/constants.go | 223 - .../pingcap/tidb/types/json/path_expr.go | 209 - .../pingcap/tidb/types/mydecimal.go | 2198 -- .../github.com/pingcap/tidb/types/mytime.go | 460 - .../github.com/pingcap/tidb/types/overflow.go | 189 - vendor/github.com/pingcap/tidb/types/row.go | 152 - vendor/github.com/pingcap/tidb/types/set.go | 111 - vendor/github.com/pingcap/tidb/types/time.go | 2478 -- .../pingcap/tidb/util/charset/charset.go | 417 - .../pingcap/tidb/util/chunk/chunk.go | 664 - .../pingcap/tidb/util/chunk/compare.go | 231 - .../pingcap/tidb/util/chunk/iterator.go | 279 - .../pingcap/tidb/util/chunk/list.go | 154 - .../pingcap/tidb/util/chunk/mutrow.go | 348 - .../pingcap/tidb/util/codec/bytes.go | 208 - .../pingcap/tidb/util/codec/codec.go | 652 - .../pingcap/tidb/util/codec/decimal.go | 56 - .../pingcap/tidb/util/codec/float.go | 65 - .../pingcap/tidb/util/codec/number.go | 284 - .../tidb/util/execdetails/execdetails.go | 54 - .../pingcap/tidb/util/format/format.go | 195 - .../github.com/pingcap/tidb/util/hack/hack.go | 43 - .../pingcap/tidb/util/kvcache/sharded_lru.go | 58 - .../pingcap/tidb/util/kvcache/simple_lru.go | 91 - .../pingcap/tidb/util/logutil/log.go | 285 - .../pingcap/tidb/util/memory/action.go | 75 - .../pingcap/tidb/util/memory/tracker.go | 200 - vendor/github.com/pingcap/tidb/util/misc.go | 55 - .../pingcap/tidb/util/prefix_helper.go | 97 - .../pingcap/tidb/util/processinfo.go | 39 - vendor/github.com/pingcap/tidb/util/random.go | 31 - vendor/github.com/pingcap/tipb/LICENSE | 201 - .../pingcap/tipb/go-binlog/binlog.pb.go | 1344 - .../pingcap/tipb/go-binlog/cistern.pb.go | 1134 - .../pingcap/tipb/go-binlog/pump.pb.go | 1281 - vendor/github.com/pkg/errors/.travis.yml | 10 - vendor/github.com/pkg/errors/Makefile | 44 - vendor/github.com/pkg/errors/appveyor.yml | 32 - vendor/github.com/pkg/errors/go113.go | 38 - .../github.com/sirupsen/logrus/.golangci.yml | 40 - vendor/github.com/sirupsen/logrus/.travis.yml | 17 - .../github.com/sirupsen/logrus/CHANGELOG.md | 223 - vendor/github.com/sirupsen/logrus/README.md | 513 - vendor/github.com/sirupsen/logrus/alt_exit.go | 76 - .../github.com/sirupsen/logrus/appveyor.yml | 14 - vendor/github.com/sirupsen/logrus/doc.go | 26 - vendor/github.com/sirupsen/logrus/entry.go | 426 - vendor/github.com/sirupsen/logrus/exported.go | 225 - .../github.com/sirupsen/logrus/formatter.go | 78 - vendor/github.com/sirupsen/logrus/hooks.go | 34 - .../sirupsen/logrus/json_formatter.go | 125 - vendor/github.com/sirupsen/logrus/logger.go | 352 - vendor/github.com/sirupsen/logrus/logrus.go | 186 - .../logrus/terminal_check_appengine.go | 11 - .../sirupsen/logrus/terminal_check_bsd.go | 13 - .../sirupsen/logrus/terminal_check_js.go | 7 - .../logrus/terminal_check_no_terminal.go | 11 - .../logrus/terminal_check_notappengine.go | 17 - .../sirupsen/logrus/terminal_check_solaris.go | 11 - .../sirupsen/logrus/terminal_check_unix.go | 13 - .../sirupsen/logrus/terminal_check_windows.go | 34 - .../sirupsen/logrus/text_formatter.go | 334 - vendor/github.com/sirupsen/logrus/writer.go | 70 - .../github.com/spaolacci/murmur3/.gitignore | 22 - .../github.com/spaolacci/murmur3/.travis.yml | 7 - vendor/github.com/spaolacci/murmur3/LICENSE | 24 - vendor/github.com/spaolacci/murmur3/README.md | 86 - vendor/github.com/spaolacci/murmur3/murmur.go | 64 - .../github.com/spaolacci/murmur3/murmur128.go | 203 - .../github.com/spaolacci/murmur3/murmur32.go | 167 - .../github.com/spaolacci/murmur3/murmur64.go | 57 - .../uber/jaeger-client-go/.gitignore | 15 - .../uber/jaeger-client-go/.gitmodules | 3 - .../uber/jaeger-client-go/.travis.yml | 48 - .../uber/jaeger-client-go/CHANGELOG.md | 180 - .../uber/jaeger-client-go/CONTRIBUTING.md | 170 - vendor/github.com/uber/jaeger-client-go/DCO | 37 - .../uber/jaeger-client-go/Gopkg.lock | 164 - .../uber/jaeger-client-go/Gopkg.toml | 27 - .../github.com/uber/jaeger-client-go/Makefile | 117 - .../uber/jaeger-client-go/README.md | 260 - .../uber/jaeger-client-go/RELEASE.md | 11 - .../uber/jaeger-client-go/baggage_setter.go | 77 - .../uber/jaeger-client-go/config/config.go | 372 - .../jaeger-client-go/config/config_env.go | 205 - .../uber/jaeger-client-go/config/options.go | 140 - .../uber/jaeger-client-go/constants.go | 85 - .../uber/jaeger-client-go/context.go | 258 - .../uber/jaeger-client-go/contrib_observer.go | 56 - .../github.com/uber/jaeger-client-go/doc.go | 24 - .../uber/jaeger-client-go/glide.lock | 89 - .../uber/jaeger-client-go/glide.yaml | 22 - .../uber/jaeger-client-go/header.go | 64 - .../internal/baggage/remote/options.go | 101 - .../baggage/remote/restriction_manager.go | 157 - .../internal/baggage/restriction_manager.go | 71 - .../jaeger-client-go/internal/spanlog/json.go | 81 - .../internal/throttler/remote/options.go | 99 - .../internal/throttler/remote/throttler.go | 216 - .../internal/throttler/throttler.go | 32 - .../uber/jaeger-client-go/interop.go | 55 - .../uber/jaeger-client-go/jaeger_tag.go | 84 - .../jaeger-client-go/jaeger_thrift_span.go | 179 - .../uber/jaeger-client-go/log/logger.go | 90 - .../uber/jaeger-client-go/logger.go | 53 - .../uber/jaeger-client-go/metrics.go | 107 - .../uber/jaeger-client-go/observer.go | 88 - .../uber/jaeger-client-go/process.go | 29 - .../uber/jaeger-client-go/propagation.go | 300 - .../uber/jaeger-client-go/reference.go | 23 - .../uber/jaeger-client-go/reporter.go | 289 - .../uber/jaeger-client-go/reporter_options.go | 69 - .../jaeger-client-go/rpcmetrics/README.md | 5 - .../uber/jaeger-client-go/rpcmetrics/doc.go | 16 - .../jaeger-client-go/rpcmetrics/endpoints.go | 63 - .../jaeger-client-go/rpcmetrics/metrics.go | 124 - .../jaeger-client-go/rpcmetrics/normalizer.go | 101 - .../jaeger-client-go/rpcmetrics/observer.go | 171 - .../uber/jaeger-client-go/sampler.go | 556 - .../uber/jaeger-client-go/sampler_options.go | 81 - .../github.com/uber/jaeger-client-go/span.go | 249 - .../thrift-gen/agent/agent.go | 411 - .../thrift-gen/agent/constants.go | 23 - .../thrift-gen/agent/ttypes.go | 21 - .../baggage/baggagerestrictionmanager.go | 435 - .../thrift-gen/baggage/constants.go | 18 - .../thrift-gen/baggage/ttypes.go | 154 - .../thrift-gen/jaeger/agent.go | 242 - .../thrift-gen/jaeger/constants.go | 18 - .../thrift-gen/jaeger/ttypes.go | 1838 -- .../thrift-gen/sampling/constants.go | 18 - .../thrift-gen/sampling/samplingmanager.go | 410 - .../thrift-gen/sampling/ttypes.go | 873 - .../thrift-gen/zipkincore/constants.go | 32 - .../thrift-gen/zipkincore/ttypes.go | 1247 - .../thrift-gen/zipkincore/zipkincollector.go | 446 - .../uber/jaeger-client-go/thrift/.nocover | 0 .../uber/jaeger-client-go/thrift/README.md | 7 - .../thrift/application_exception.go | 142 - .../thrift/binary_protocol.go | 514 - .../thrift/compact_protocol.go | 815 - .../uber/jaeger-client-go/thrift/exception.go | 44 - .../jaeger-client-go/thrift/memory_buffer.go | 79 - .../jaeger-client-go/thrift/messagetype.go | 31 - .../uber/jaeger-client-go/thrift/numeric.go | 164 - .../uber/jaeger-client-go/thrift/processor.go | 30 - .../uber/jaeger-client-go/thrift/protocol.go | 175 - .../thrift/protocol_exception.go | 78 - .../thrift/protocol_factory.go | 25 - .../jaeger-client-go/thrift/rich_transport.go | 69 - .../jaeger-client-go/thrift/serializer.go | 75 - .../thrift/simple_json_protocol.go | 1337 - .../uber/jaeger-client-go/thrift/transport.go | 68 - .../thrift/transport_exception.go | 90 - .../thrift/transport_factory.go | 39 - .../uber/jaeger-client-go/thrift/type.go | 69 - .../uber/jaeger-client-go/tracer.go | 421 - .../uber/jaeger-client-go/tracer_options.go | 153 - .../uber/jaeger-client-go/transport.go | 38 - .../uber/jaeger-client-go/transport_udp.go | 131 - .../uber/jaeger-client-go/utils/http_json.go | 54 - .../uber/jaeger-client-go/utils/localip.go | 84 - .../uber/jaeger-client-go/utils/rand.go | 46 - .../jaeger-client-go/utils/rate_limiter.go | 77 - .../uber/jaeger-client-go/utils/udp_client.go | 98 - .../uber/jaeger-client-go/utils/utils.go | 87 - .../uber/jaeger-client-go/zipkin.go | 76 - .../jaeger-client-go/zipkin_thrift_span.go | 325 - .../uber/jaeger-lib/metrics/counter.go | 28 - .../uber/jaeger-lib/metrics/factory.go | 35 - .../uber/jaeger-lib/metrics/gauge.go | 28 - .../uber/jaeger-lib/metrics/local.go | 337 - .../uber/jaeger-lib/metrics/metrics.go | 85 - .../uber/jaeger-lib/metrics/stopwatch.go | 43 - .../uber/jaeger-lib/metrics/timer.go | 33 - vendor/go.uber.org/atomic/.codecov.yml | 19 + vendor/go.uber.org/atomic/.gitignore | 15 + vendor/go.uber.org/atomic/CHANGELOG.md | 127 + .../atomic/LICENSE.txt} | 4 +- vendor/go.uber.org/atomic/Makefile | 79 + vendor/go.uber.org/atomic/README.md | 63 + vendor/go.uber.org/atomic/bool.go | 88 + vendor/go.uber.org/atomic/bool_ext.go | 53 + vendor/go.uber.org/atomic/doc.go | 23 + vendor/go.uber.org/atomic/duration.go | 89 + vendor/go.uber.org/atomic/duration_ext.go | 40 + vendor/go.uber.org/atomic/error.go | 72 + vendor/go.uber.org/atomic/error_ext.go | 39 + vendor/go.uber.org/atomic/float32.go | 77 + vendor/go.uber.org/atomic/float32_ext.go | 76 + vendor/go.uber.org/atomic/float64.go | 77 + vendor/go.uber.org/atomic/float64_ext.go | 76 + vendor/go.uber.org/atomic/gen.go | 27 + vendor/go.uber.org/atomic/int32.go | 109 + vendor/go.uber.org/atomic/int64.go | 109 + vendor/go.uber.org/atomic/nocmp.go | 35 + vendor/go.uber.org/atomic/pointer_go118.go | 31 + .../atomic/pointer_go118_pre119.go | 60 + vendor/go.uber.org/atomic/pointer_go119.go | 61 + vendor/go.uber.org/atomic/string.go | 72 + vendor/go.uber.org/atomic/string_ext.go | 54 + vendor/go.uber.org/atomic/time.go | 55 + vendor/go.uber.org/atomic/time_ext.go | 36 + vendor/go.uber.org/atomic/uint32.go | 109 + vendor/go.uber.org/atomic/uint64.go | 109 + vendor/go.uber.org/atomic/uintptr.go | 109 + vendor/go.uber.org/atomic/unsafe_pointer.go | 65 + vendor/go.uber.org/atomic/value.go | 31 + vendor/go.uber.org/multierr/.codecov.yml | 15 + vendor/go.uber.org/multierr/.gitignore | 4 + vendor/go.uber.org/multierr/CHANGELOG.md | 95 + .../multierr/LICENSE.txt} | 4 +- vendor/go.uber.org/multierr/Makefile | 38 + vendor/go.uber.org/multierr/README.md | 43 + vendor/go.uber.org/multierr/error.go | 646 + .../go.uber.org/multierr/error_post_go120.go | 48 + .../go.uber.org/multierr/error_pre_go120.go | 79 + vendor/go.uber.org/zap/.codecov.yml | 17 + .../errors => go.uber.org/zap}/.gitignore | 9 + vendor/go.uber.org/zap/.golangci.yml | 77 + vendor/go.uber.org/zap/.readme.tmpl | 117 + vendor/go.uber.org/zap/CHANGELOG.md | 687 + vendor/go.uber.org/zap/CODE_OF_CONDUCT.md | 75 + vendor/go.uber.org/zap/CONTRIBUTING.md | 70 + vendor/go.uber.org/zap/FAQ.md | 164 + .../hdrhistogram => go.uber.org/zap}/LICENSE | 4 +- vendor/go.uber.org/zap/Makefile | 76 + vendor/go.uber.org/zap/README.md | 149 + vendor/go.uber.org/zap/array.go | 447 + vendor/go.uber.org/zap/buffer/buffer.go | 146 + vendor/go.uber.org/zap/buffer/pool.go | 53 + vendor/go.uber.org/zap/checklicense.sh | 17 + vendor/go.uber.org/zap/config.go | 330 + vendor/go.uber.org/zap/doc.go | 117 + vendor/go.uber.org/zap/encoder.go | 79 + vendor/go.uber.org/zap/error.go | 82 + vendor/go.uber.org/zap/field.go | 615 + vendor/go.uber.org/zap/flag.go | 39 + vendor/go.uber.org/zap/glide.yaml | 34 + vendor/go.uber.org/zap/global.go | 169 + vendor/go.uber.org/zap/http_handler.go | 140 + .../zap/internal/bufferpool/bufferpool.go | 31 + .../go.uber.org/zap/internal/color/color.go | 44 + vendor/go.uber.org/zap/internal/exit/exit.go | 66 + .../go.uber.org/zap/internal/level_enabler.go | 37 + vendor/go.uber.org/zap/internal/pool/pool.go | 58 + .../zap/internal/stacktrace/stack.go | 181 + .../go.uber.org/zap/internal/ztest/clock.go | 153 + vendor/go.uber.org/zap/internal/ztest/doc.go | 24 + .../go.uber.org/zap/internal/ztest/timeout.go | 59 + .../go.uber.org/zap/internal/ztest/writer.go | 96 + vendor/go.uber.org/zap/level.go | 153 + vendor/go.uber.org/zap/logger.go | 435 + vendor/go.uber.org/zap/options.go | 182 + vendor/go.uber.org/zap/sink.go | 180 + vendor/go.uber.org/zap/sugar.go | 476 + vendor/go.uber.org/zap/time.go | 27 + vendor/go.uber.org/zap/writer.go | 98 + .../zap/zapcore/buffered_write_syncer.go | 219 + vendor/go.uber.org/zap/zapcore/clock.go | 48 + .../zap/zapcore/console_encoder.go | 157 + vendor/go.uber.org/zap/zapcore/core.go | 122 + vendor/go.uber.org/zap/zapcore/doc.go | 24 + vendor/go.uber.org/zap/zapcore/encoder.go | 466 + vendor/go.uber.org/zap/zapcore/entry.go | 298 + vendor/go.uber.org/zap/zapcore/error.go | 136 + vendor/go.uber.org/zap/zapcore/field.go | 233 + vendor/go.uber.org/zap/zapcore/hook.go | 77 + .../go.uber.org/zap/zapcore/increase_level.go | 75 + .../go.uber.org/zap/zapcore/json_encoder.go | 583 + vendor/go.uber.org/zap/zapcore/lazy_with.go | 54 + vendor/go.uber.org/zap/zapcore/level.go | 229 + .../go.uber.org/zap/zapcore/level_strings.go | 46 + vendor/go.uber.org/zap/zapcore/marshaler.go | 61 + .../go.uber.org/zap/zapcore/memory_encoder.go | 179 + .../zap/zapcore/reflected_encoder.go | 41 + vendor/go.uber.org/zap/zapcore/sampler.go | 229 + vendor/go.uber.org/zap/zapcore/tee.go | 96 + .../go.uber.org/zap/zapcore/write_syncer.go | 122 + vendor/go.uber.org/zap/zaptest/doc.go | 22 + vendor/go.uber.org/zap/zaptest/logger.go | 157 + vendor/go.uber.org/zap/zaptest/testingt.go | 47 + vendor/go.uber.org/zap/zaptest/timeout.go | 45 + vendor/go.uber.org/zap/zaptest/writer.go | 44 + vendor/golang.org/x/net/context/context.go | 56 - vendor/golang.org/x/net/context/go17.go | 72 - vendor/golang.org/x/net/context/go19.go | 20 - vendor/golang.org/x/net/context/pre_go17.go | 300 - vendor/golang.org/x/net/context/pre_go19.go | 109 - .../x/net/internal/timeseries/timeseries.go | 525 - vendor/golang.org/x/net/trace/events.go | 532 - vendor/golang.org/x/net/trace/histogram.go | 365 - vendor/golang.org/x/net/trace/trace.go | 1130 - vendor/golang.org/x/text/LICENSE | 4 +- .../googleapis/rpc/status/status.pb.go | 203 - vendor/google.golang.org/grpc/AUTHORS | 1 - .../google.golang.org/grpc/CODE-OF-CONDUCT.md | 3 - vendor/google.golang.org/grpc/CONTRIBUTING.md | 73 - vendor/google.golang.org/grpc/GOVERNANCE.md | 1 - vendor/google.golang.org/grpc/LICENSE | 202 - vendor/google.golang.org/grpc/MAINTAINERS.md | 28 - vendor/google.golang.org/grpc/Makefile | 46 - vendor/google.golang.org/grpc/NOTICE.txt | 13 - vendor/google.golang.org/grpc/README.md | 141 - vendor/google.golang.org/grpc/SECURITY.md | 3 - .../grpc/attributes/attributes.go | 130 - vendor/google.golang.org/grpc/backoff.go | 61 - .../google.golang.org/grpc/backoff/backoff.go | 52 - .../grpc/balancer/balancer.go | 404 - .../grpc/balancer/base/balancer.go | 254 - .../grpc/balancer/base/base.go | 71 - .../grpc/balancer/conn_state_evaluator.go | 74 - .../grpc/balancer/grpclb/state/state.go | 51 - .../grpc/balancer/roundrobin/roundrobin.go | 81 - .../grpc/balancer_conn_wrappers.go | 459 - .../grpc_binarylog_v1/binarylog.pb.go | 1183 - vendor/google.golang.org/grpc/call.go | 79 - .../grpc/channelz/channelz.go | 36 - vendor/google.golang.org/grpc/clientconn.go | 1908 -- vendor/google.golang.org/grpc/codec.go | 50 - vendor/google.golang.org/grpc/codegen.sh | 17 - .../grpc/codes/code_string.go | 111 - vendor/google.golang.org/grpc/codes/codes.go | 244 - .../grpc/connectivity/connectivity.go | 94 - .../grpc/credentials/credentials.go | 291 - .../grpc/credentials/insecure/insecure.go | 98 - .../google.golang.org/grpc/credentials/tls.go | 236 - vendor/google.golang.org/grpc/dialoptions.go | 678 - vendor/google.golang.org/grpc/doc.go | 26 - .../grpc/encoding/encoding.go | 135 - .../grpc/encoding/proto/proto.go | 58 - .../grpc/grpclog/component.go | 117 - .../google.golang.org/grpc/grpclog/grpclog.go | 132 - .../google.golang.org/grpc/grpclog/logger.go | 87 - .../grpc/grpclog/loggerv2.go | 258 - vendor/google.golang.org/grpc/idle.go | 287 - vendor/google.golang.org/grpc/interceptor.go | 104 - .../grpc/internal/backoff/backoff.go | 73 - .../balancer/gracefulswitch/gracefulswitch.go | 384 - .../grpc/internal/balancerload/load.go | 46 - .../grpc/internal/binarylog/binarylog.go | 192 - .../internal/binarylog/binarylog_testutil.go | 42 - .../grpc/internal/binarylog/env_config.go | 208 - .../grpc/internal/binarylog/method_logger.go | 445 - .../grpc/internal/binarylog/sink.go | 170 - .../grpc/internal/buffer/unbounded.go | 105 - .../grpc/internal/channelz/funcs.go | 789 - .../grpc/internal/channelz/id.go | 75 - .../grpc/internal/channelz/logging.go | 79 - .../grpc/internal/channelz/types.go | 722 - .../grpc/internal/channelz/types_linux.go | 51 - .../grpc/internal/channelz/types_nonlinux.go | 43 - .../grpc/internal/channelz/util_linux.go | 37 - .../grpc/internal/channelz/util_nonlinux.go | 27 - .../grpc/internal/credentials/credentials.go | 49 - .../grpc/internal/credentials/spiffe.go | 75 - .../grpc/internal/credentials/syscallconn.go | 58 - .../grpc/internal/credentials/util.go | 52 - .../grpc/internal/envconfig/envconfig.go | 66 - .../grpc/internal/envconfig/observability.go | 42 - .../grpc/internal/envconfig/xds.go | 95 - .../grpc/internal/grpclog/grpclog.go | 126 - .../grpc/internal/grpclog/prefixLogger.go | 93 - .../grpc/internal/grpcrand/grpcrand.go | 88 - .../internal/grpcsync/callback_serializer.go | 119 - .../grpc/internal/grpcsync/event.go | 61 - .../grpc/internal/grpcsync/oncefunc.go | 32 - .../grpc/internal/grpcutil/compressor.go | 47 - .../grpc/internal/grpcutil/encode_duration.go | 63 - .../grpc/internal/grpcutil/grpcutil.go | 20 - .../grpc/internal/grpcutil/metadata.go | 40 - .../grpc/internal/grpcutil/method.go | 88 - .../grpc/internal/grpcutil/regex.go | 31 - .../grpc/internal/internal.go | 194 - .../grpc/internal/metadata/metadata.go | 132 - .../grpc/internal/pretty/pretty.go | 82 - .../grpc/internal/resolver/config_selector.go | 167 - .../internal/resolver/dns/dns_resolver.go | 458 - .../resolver/passthrough/passthrough.go | 64 - .../grpc/internal/resolver/unix/unix.go | 74 - .../grpc/internal/serviceconfig/duration.go | 130 - .../internal/serviceconfig/serviceconfig.go | 180 - .../grpc/internal/status/status.go | 176 - .../grpc/internal/syscall/syscall_linux.go | 112 - .../grpc/internal/syscall/syscall_nonlinux.go | 77 - .../grpc/internal/transport/bdp_estimator.go | 141 - .../grpc/internal/transport/controlbuf.go | 1007 - .../grpc/internal/transport/defaults.go | 55 - .../grpc/internal/transport/flowcontrol.go | 215 - .../grpc/internal/transport/handler_server.go | 480 - .../grpc/internal/transport/http2_client.go | 1798 -- .../grpc/internal/transport/http2_server.go | 1464 - .../grpc/internal/transport/http_util.go | 432 - .../grpc/internal/transport/logging.go | 40 - .../transport/networktype/networktype.go | 46 - .../grpc/internal/transport/proxy.go | 142 - .../grpc/internal/transport/transport.go | 842 - .../grpc/internal/xds_handshake_cluster.go | 40 - .../grpc/keepalive/keepalive.go | 85 - .../grpc/metadata/metadata.go | 295 - vendor/google.golang.org/grpc/peer/peer.go | 51 - .../google.golang.org/grpc/picker_wrapper.go | 216 - vendor/google.golang.org/grpc/pickfirst.go | 227 - vendor/google.golang.org/grpc/preloader.go | 67 - vendor/google.golang.org/grpc/regenerate.sh | 123 - vendor/google.golang.org/grpc/resolver/map.go | 138 - .../grpc/resolver/resolver.go | 330 - .../grpc/resolver_conn_wrapper.go | 239 - vendor/google.golang.org/grpc/rpc_util.go | 953 - vendor/google.golang.org/grpc/server.go | 2081 -- .../google.golang.org/grpc/service_config.go | 347 - .../grpc/serviceconfig/serviceconfig.go | 44 - .../google.golang.org/grpc/stats/handlers.go | 63 - vendor/google.golang.org/grpc/stats/stats.go | 333 - .../google.golang.org/grpc/status/status.go | 160 - vendor/google.golang.org/grpc/stream.go | 1776 -- vendor/google.golang.org/grpc/tap/tap.go | 56 - vendor/google.golang.org/grpc/trace.go | 123 - vendor/google.golang.org/grpc/version.go | 22 - vendor/google.golang.org/grpc/vet.sh | 208 - .../protobuf/encoding/protojson/decode.go | 685 - .../protobuf/encoding/protojson/doc.go | 11 - .../protobuf/encoding/protojson/encode.go | 382 - .../encoding/protojson/well_known_types.go | 876 - .../internal/editionssupport/editions.go | 13 - .../protobuf/internal/encoding/json/decode.go | 340 - .../internal/encoding/json/decode_number.go | 254 - .../internal/encoding/json/decode_string.go | 91 - .../internal/encoding/json/decode_token.go | 192 - .../protobuf/internal/encoding/json/encode.go | 278 - .../protobuf/reflect/protodesc/desc.go | 286 - .../protobuf/reflect/protodesc/desc_init.go | 285 - .../reflect/protodesc/desc_resolve.go | 291 - .../reflect/protodesc/desc_validate.go | 371 - .../protobuf/reflect/protodesc/editions.go | 145 - .../protobuf/reflect/protodesc/proto.go | 274 - .../types/descriptorpb/descriptor.pb.go | 5825 ---- .../types/gofeaturespb/go_features.pb.go | 181 - .../protobuf/types/known/anypb/any.pb.go | 496 - .../types/known/durationpb/duration.pb.go | 374 - .../natefinch/lumberjack.v2/.travis.yml | 11 + .../natefinch/lumberjack.v2/README.md | 7 +- .../natefinch/lumberjack.v2/chown_linux.go | 6 +- .../natefinch/lumberjack.v2/lumberjack.go | 18 +- vendor/modules.txt | 268 +- 812 files changed, 92267 insertions(+), 161521 deletions(-) delete mode 100644 vendor/github.com/BurntSushi/toml/.gitignore delete mode 100644 vendor/github.com/BurntSushi/toml/.travis.yml delete mode 100644 vendor/github.com/BurntSushi/toml/COMPATIBLE delete mode 100644 vendor/github.com/BurntSushi/toml/Makefile delete mode 100644 vendor/github.com/BurntSushi/toml/README.md delete mode 100644 vendor/github.com/BurntSushi/toml/decode.go delete mode 100644 vendor/github.com/BurntSushi/toml/decode_meta.go delete mode 100644 vendor/github.com/BurntSushi/toml/doc.go delete mode 100644 vendor/github.com/BurntSushi/toml/encode.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types_1.1.go delete mode 100644 vendor/github.com/BurntSushi/toml/lex.go delete mode 100644 vendor/github.com/BurntSushi/toml/parse.go delete mode 100644 vendor/github.com/BurntSushi/toml/session.vim delete mode 100644 vendor/github.com/BurntSushi/toml/type_check.go delete mode 100644 vendor/github.com/BurntSushi/toml/type_fields.go create mode 100644 vendor/github.com/Masterminds/semver/version_fuzz.go delete mode 100644 vendor/github.com/codahale/hdrhistogram/.travis.yml delete mode 100644 vendor/github.com/codahale/hdrhistogram/README.md delete mode 100644 vendor/github.com/codahale/hdrhistogram/hdr.go delete mode 100644 vendor/github.com/codahale/hdrhistogram/window.go delete mode 100644 vendor/github.com/cznic/mathutil/AUTHORS delete mode 100644 vendor/github.com/cznic/mathutil/CONTRIBUTORS delete mode 100644 vendor/github.com/cznic/mathutil/LICENSE delete mode 100644 vendor/github.com/cznic/mathutil/Makefile delete mode 100644 vendor/github.com/cznic/mathutil/README delete mode 100644 vendor/github.com/cznic/mathutil/bits.go delete mode 100644 vendor/github.com/cznic/mathutil/envelope.go delete mode 100644 vendor/github.com/cznic/mathutil/int.go delete mode 100644 vendor/github.com/cznic/mathutil/mathutil.go delete mode 100644 vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report delete mode 100644 vendor/github.com/cznic/mathutil/permute.go delete mode 100644 vendor/github.com/cznic/mathutil/poly.go delete mode 100644 vendor/github.com/cznic/mathutil/primes.go delete mode 100644 vendor/github.com/cznic/mathutil/rat.go delete mode 100644 vendor/github.com/cznic/mathutil/rnd.go delete mode 100644 vendor/github.com/cznic/mathutil/tables.go delete mode 100644 vendor/github.com/cznic/mathutil/test_deps.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/jsonpb/decode.go delete mode 100644 vendor/github.com/golang/protobuf/jsonpb/encode.go delete mode 100644 vendor/github.com/golang/protobuf/jsonpb/json.go delete mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go delete mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go delete mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/proto.go delete mode 100644 vendor/github.com/golang/protobuf/proto/registry.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wire.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go delete mode 100644 vendor/github.com/golang/snappy/.gitignore delete mode 100644 vendor/github.com/golang/snappy/AUTHORS delete mode 100644 vendor/github.com/golang/snappy/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/snappy/LICENSE delete mode 100644 vendor/github.com/golang/snappy/README delete mode 100644 vendor/github.com/golang/snappy/decode.go delete mode 100644 vendor/github.com/golang/snappy/decode_amd64.go delete mode 100644 vendor/github.com/golang/snappy/decode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/decode_other.go delete mode 100644 vendor/github.com/golang/snappy/encode.go delete mode 100644 vendor/github.com/golang/snappy/encode_amd64.go delete mode 100644 vendor/github.com/golang/snappy/encode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/encode_other.go delete mode 100644 vendor/github.com/golang/snappy/snappy.go delete mode 100644 vendor/github.com/google/uuid/.travis.yml create mode 100644 vendor/github.com/google/uuid/CHANGELOG.md create mode 100644 vendor/github.com/imdario/mergo/.deepsource.toml delete mode 100644 vendor/github.com/juju/errors/LICENSE delete mode 100644 vendor/github.com/juju/errors/Makefile delete mode 100644 vendor/github.com/juju/errors/README.md delete mode 100644 vendor/github.com/juju/errors/doc.go delete mode 100644 vendor/github.com/juju/errors/error.go delete mode 100644 vendor/github.com/juju/errors/errortypes.go delete mode 100644 vendor/github.com/juju/errors/functions.go delete mode 100644 vendor/github.com/juju/errors/path.go delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/README.md delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/.gitignore delete mode 100644 vendor/github.com/opentracing/opentracing-go/.travis.yml delete mode 100644 vendor/github.com/opentracing/opentracing-go/CHANGELOG.md delete mode 100644 vendor/github.com/opentracing/opentracing-go/LICENSE delete mode 100644 vendor/github.com/opentracing/opentracing-go/Makefile delete mode 100644 vendor/github.com/opentracing/opentracing-go/README.md delete mode 100644 vendor/github.com/opentracing/opentracing-go/ext/tags.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/globaltracer.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/gocontext.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/log/field.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/log/util.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/noop.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/propagation.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/span.go delete mode 100644 vendor/github.com/opentracing/opentracing-go/tracer.go rename vendor/github.com/{pkg => pingcap}/errors/.gitignore (97%) create mode 100644 vendor/github.com/pingcap/errors/.travis.yml rename vendor/github.com/{pkg => pingcap}/errors/LICENSE (100%) rename vendor/github.com/{pkg => pingcap}/errors/README.md (78%) create mode 100644 vendor/github.com/pingcap/errors/compatible_shim.go rename vendor/github.com/{pkg => pingcap}/errors/errors.go (58%) create mode 100644 vendor/github.com/pingcap/errors/group.go create mode 100644 vendor/github.com/pingcap/errors/juju_adaptor.go create mode 100644 vendor/github.com/pingcap/errors/normalize.go rename vendor/github.com/{pkg => pingcap}/errors/stack.go (50%) create mode 100644 vendor/github.com/pingcap/failpoint/.codecov.yml create mode 100644 vendor/github.com/pingcap/failpoint/.gitignore create mode 100644 vendor/github.com/pingcap/failpoint/CONTRIBUTING.md rename vendor/github.com/{uber/jaeger-client-go => pingcap/failpoint}/LICENSE (100%) create mode 100644 vendor/github.com/pingcap/failpoint/MAINTAINERS.md create mode 100644 vendor/github.com/pingcap/failpoint/Makefile create mode 100644 vendor/github.com/pingcap/failpoint/README.md create mode 100644 vendor/github.com/pingcap/failpoint/failpoint.go create mode 100644 vendor/github.com/pingcap/failpoint/failpoints.go create mode 100644 vendor/github.com/pingcap/failpoint/http.go create mode 100644 vendor/github.com/pingcap/failpoint/marker.go create mode 100644 vendor/github.com/pingcap/failpoint/terms.go delete mode 100644 vendor/github.com/pingcap/goleveldb/LICENSE delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/batch.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/cache/cache.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/cache/lru.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/comparer.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/comparer/bytes_comparer.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/comparer/comparer.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_compaction.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_iter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_snapshot.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_state.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_transaction.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_util.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/db_write.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/doc.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/errors.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/errors/errors.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/filter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/filter/bloom.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/filter/filter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/iterator/array_iter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/iterator/indexed_iter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/iterator/iter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/iterator/merged_iter.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/journal/journal.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/key.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/memdb/memdb.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/opt/options.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/options.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/session.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/session_compaction.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/session_record.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/session_util.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage_nacl.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage_plan9.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage_solaris.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage_unix.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/file_storage_windows.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/mem_storage.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/storage/storage.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/table.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/table/reader.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/table/table.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/table/writer.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/buffer.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/buffer_pool.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/crc32.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/hash.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/range.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/util/util.go delete mode 100644 vendor/github.com/pingcap/goleveldb/leveldb/version.go rename vendor/github.com/{sirupsen/logrus => pingcap/log}/.gitignore (50%) rename vendor/github.com/{uber/jaeger-lib => pingcap/log}/LICENSE (100%) create mode 100644 vendor/github.com/pingcap/log/README.md create mode 100644 vendor/github.com/pingcap/log/config.go create mode 100644 vendor/github.com/pingcap/log/global.go create mode 100644 vendor/github.com/pingcap/log/log.go create mode 100644 vendor/github.com/pingcap/log/zap_test_logger.go create mode 100644 vendor/github.com/pingcap/log/zap_text_core.go create mode 100644 vendor/github.com/pingcap/log/zap_text_encoder.go delete mode 100644 vendor/github.com/pingcap/tidb/CONTRIBUTORS delete mode 100644 vendor/github.com/pingcap/tidb/LICENSE delete mode 100644 vendor/github.com/pingcap/tidb/ast/ddl.go delete mode 100644 vendor/github.com/pingcap/tidb/ast/dml.go delete mode 100644 vendor/github.com/pingcap/tidb/ast/functions.go delete mode 100644 vendor/github.com/pingcap/tidb/ast/misc.go delete mode 100644 vendor/github.com/pingcap/tidb/ast/stats.go delete mode 100644 vendor/github.com/pingcap/tidb/config/config.go delete mode 100644 vendor/github.com/pingcap/tidb/config/config.toml.example delete mode 100644 vendor/github.com/pingcap/tidb/kv/buffer_store.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/error.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/fault_injection.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/iter.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/key.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/kv.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/memdb_buffer.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/mock.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/txn.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/union_iter.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/union_store.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/utils.go delete mode 100644 vendor/github.com/pingcap/tidb/kv/version.go delete mode 100644 vendor/github.com/pingcap/tidb/meta/autoid/autoid.go delete mode 100644 vendor/github.com/pingcap/tidb/meta/meta.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/ddl.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/distsql.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/domain.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/executor.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/meta.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/metrics.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/owner.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/server.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/session.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/stats.go delete mode 100644 vendor/github.com/pingcap/tidb/metrics/tikvclient.go delete mode 100644 vendor/github.com/pingcap/tidb/model/ddl.go delete mode 100644 vendor/github.com/pingcap/tidb/model/model.go delete mode 100644 vendor/github.com/pingcap/tidb/mysql/errcode.go delete mode 100644 vendor/github.com/pingcap/tidb/mysql/errname.go delete mode 100644 vendor/github.com/pingcap/tidb/parser/lexer.go delete mode 100644 vendor/github.com/pingcap/tidb/parser/misc.go delete mode 100644 vendor/github.com/pingcap/tidb/parser/opcode/opcode.go delete mode 100644 vendor/github.com/pingcap/tidb/parser/parser.go delete mode 100644 vendor/github.com/pingcap/tidb/parser/parser.y delete mode 100644 vendor/github.com/pingcap/tidb/parser/yy_parser.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/.editorconfig create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/.gitignore create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/BUILD.bazel rename vendor/{google.golang.org/genproto => github.com/pingcap/tidb/pkg/parser}/LICENSE (99%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/Makefile create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/OWNERS create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/README.md create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/SECURITY.md create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/BUILD.bazel rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/ast/ast.go (55%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/ast/base.go (67%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/ddl.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/dml.go rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/ast/expressions.go (51%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/ast/flag.go (88%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/functions.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/misc.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/procedure.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/ast/stats.go rename vendor/github.com/pingcap/tidb/{ast/read_only_checker.go => pkg/parser/ast/util.go} (58%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/auth/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/auth/auth.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/auth/caching_sha2.go rename vendor/github.com/pingcap/tidb/{util/auth/auth.go => pkg/parser/auth/mysql_native_password.go} (60%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/auth/tidb_sm3.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/charset.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_ascii.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_base.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_bin.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_gbk.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_latin1.go rename vendor/github.com/pingcap/tidb/{util => pkg/parser}/charset/encoding_table.go (99%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/charset/encoding_utf8.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/digester.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/duration/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/duration/duration.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/format/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/format/format.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/generate.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/hintparser.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/hintparser.y create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/hintparserimpl.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/keywords.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/lexer.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/misc.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/model/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/model/model.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/mysql/BUILD.bazel rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/charset.go (88%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/const.go (57%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/mysql/errcode.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/mysql/errname.go rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/error.go (83%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/locale_format.go (89%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/mysql/privs.go rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/state.go (95%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/type.go (66%) rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/mysql/util.go (71%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/opcode/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/opcode/opcode.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/parser.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/parser.y create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/terror/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/terror/terror.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test.sh create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test_driver/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test_driver/test_driver.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test_driver/test_driver_datum.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test_driver/test_driver_helper.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/test_driver/test_driver_mydecimal.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/tidb/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/tidb/features.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/types/BUILD.bazel create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/types/etc.go rename vendor/github.com/pingcap/tidb/{ => pkg/parser}/types/eval_type.go (63%) create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/types/field_type.go create mode 100644 vendor/github.com/pingcap/tidb/pkg/parser/yy_parser.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/context.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/stmtctx/stmtctx.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/variable/session.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/variable/statusvar.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/variable/sysvar.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/variable/tidb_vars.go delete mode 100644 vendor/github.com/pingcap/tidb/sessionctx/variable/varsutil.go delete mode 100644 vendor/github.com/pingcap/tidb/store/tikv/oracle/oracle.go delete mode 100644 vendor/github.com/pingcap/tidb/structure/hash.go delete mode 100644 vendor/github.com/pingcap/tidb/structure/list.go delete mode 100644 vendor/github.com/pingcap/tidb/structure/string.go delete mode 100644 vendor/github.com/pingcap/tidb/structure/structure.go delete mode 100644 vendor/github.com/pingcap/tidb/structure/type.go delete mode 100644 vendor/github.com/pingcap/tidb/terror/terror.go delete mode 100644 vendor/github.com/pingcap/tidb/types/binary_literal.go delete mode 100644 vendor/github.com/pingcap/tidb/types/compare.go delete mode 100644 vendor/github.com/pingcap/tidb/types/convert.go delete mode 100644 vendor/github.com/pingcap/tidb/types/datum.go delete mode 100644 vendor/github.com/pingcap/tidb/types/datum_eval.go delete mode 100644 vendor/github.com/pingcap/tidb/types/enum.go delete mode 100644 vendor/github.com/pingcap/tidb/types/errors.go delete mode 100644 vendor/github.com/pingcap/tidb/types/etc.go delete mode 100644 vendor/github.com/pingcap/tidb/types/field_type.go delete mode 100644 vendor/github.com/pingcap/tidb/types/fsp.go delete mode 100644 vendor/github.com/pingcap/tidb/types/helper.go delete mode 100644 vendor/github.com/pingcap/tidb/types/json/binary.go delete mode 100644 vendor/github.com/pingcap/tidb/types/json/binary_functions.go delete mode 100644 vendor/github.com/pingcap/tidb/types/json/constants.go delete mode 100644 vendor/github.com/pingcap/tidb/types/json/path_expr.go delete mode 100644 vendor/github.com/pingcap/tidb/types/mydecimal.go delete mode 100644 vendor/github.com/pingcap/tidb/types/mytime.go delete mode 100644 vendor/github.com/pingcap/tidb/types/overflow.go delete mode 100644 vendor/github.com/pingcap/tidb/types/row.go delete mode 100644 vendor/github.com/pingcap/tidb/types/set.go delete mode 100644 vendor/github.com/pingcap/tidb/types/time.go delete mode 100644 vendor/github.com/pingcap/tidb/util/charset/charset.go delete mode 100644 vendor/github.com/pingcap/tidb/util/chunk/chunk.go delete mode 100644 vendor/github.com/pingcap/tidb/util/chunk/compare.go delete mode 100644 vendor/github.com/pingcap/tidb/util/chunk/iterator.go delete mode 100644 vendor/github.com/pingcap/tidb/util/chunk/list.go delete mode 100644 vendor/github.com/pingcap/tidb/util/chunk/mutrow.go delete mode 100644 vendor/github.com/pingcap/tidb/util/codec/bytes.go delete mode 100644 vendor/github.com/pingcap/tidb/util/codec/codec.go delete mode 100644 vendor/github.com/pingcap/tidb/util/codec/decimal.go delete mode 100644 vendor/github.com/pingcap/tidb/util/codec/float.go delete mode 100644 vendor/github.com/pingcap/tidb/util/codec/number.go delete mode 100644 vendor/github.com/pingcap/tidb/util/execdetails/execdetails.go delete mode 100644 vendor/github.com/pingcap/tidb/util/format/format.go delete mode 100644 vendor/github.com/pingcap/tidb/util/hack/hack.go delete mode 100644 vendor/github.com/pingcap/tidb/util/kvcache/sharded_lru.go delete mode 100644 vendor/github.com/pingcap/tidb/util/kvcache/simple_lru.go delete mode 100644 vendor/github.com/pingcap/tidb/util/logutil/log.go delete mode 100644 vendor/github.com/pingcap/tidb/util/memory/action.go delete mode 100644 vendor/github.com/pingcap/tidb/util/memory/tracker.go delete mode 100644 vendor/github.com/pingcap/tidb/util/misc.go delete mode 100644 vendor/github.com/pingcap/tidb/util/prefix_helper.go delete mode 100644 vendor/github.com/pingcap/tidb/util/processinfo.go delete mode 100644 vendor/github.com/pingcap/tidb/util/random.go delete mode 100644 vendor/github.com/pingcap/tipb/LICENSE delete mode 100644 vendor/github.com/pingcap/tipb/go-binlog/binlog.pb.go delete mode 100644 vendor/github.com/pingcap/tipb/go-binlog/cistern.pb.go delete mode 100644 vendor/github.com/pingcap/tipb/go-binlog/pump.pb.go delete mode 100644 vendor/github.com/pkg/errors/.travis.yml delete mode 100644 vendor/github.com/pkg/errors/Makefile delete mode 100644 vendor/github.com/pkg/errors/appveyor.yml delete mode 100644 vendor/github.com/pkg/errors/go113.go delete mode 100644 vendor/github.com/sirupsen/logrus/.golangci.yml delete mode 100644 vendor/github.com/sirupsen/logrus/.travis.yml delete mode 100644 vendor/github.com/sirupsen/logrus/CHANGELOG.md delete mode 100644 vendor/github.com/sirupsen/logrus/README.md delete mode 100644 vendor/github.com/sirupsen/logrus/alt_exit.go delete mode 100644 vendor/github.com/sirupsen/logrus/appveyor.yml delete mode 100644 vendor/github.com/sirupsen/logrus/doc.go delete mode 100644 vendor/github.com/sirupsen/logrus/entry.go delete mode 100644 vendor/github.com/sirupsen/logrus/exported.go delete mode 100644 vendor/github.com/sirupsen/logrus/formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/hooks.go delete mode 100644 vendor/github.com/sirupsen/logrus/json_formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/logger.go delete mode 100644 vendor/github.com/sirupsen/logrus/logrus.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_appengine.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_bsd.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_js.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_unix.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_windows.go delete mode 100644 vendor/github.com/sirupsen/logrus/text_formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/writer.go delete mode 100644 vendor/github.com/spaolacci/murmur3/.gitignore delete mode 100644 vendor/github.com/spaolacci/murmur3/.travis.yml delete mode 100644 vendor/github.com/spaolacci/murmur3/LICENSE delete mode 100644 vendor/github.com/spaolacci/murmur3/README.md delete mode 100644 vendor/github.com/spaolacci/murmur3/murmur.go delete mode 100644 vendor/github.com/spaolacci/murmur3/murmur128.go delete mode 100644 vendor/github.com/spaolacci/murmur3/murmur32.go delete mode 100644 vendor/github.com/spaolacci/murmur3/murmur64.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/.gitignore delete mode 100644 vendor/github.com/uber/jaeger-client-go/.gitmodules delete mode 100644 vendor/github.com/uber/jaeger-client-go/.travis.yml delete mode 100644 vendor/github.com/uber/jaeger-client-go/CHANGELOG.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/DCO delete mode 100644 vendor/github.com/uber/jaeger-client-go/Gopkg.lock delete mode 100644 vendor/github.com/uber/jaeger-client-go/Gopkg.toml delete mode 100644 vendor/github.com/uber/jaeger-client-go/Makefile delete mode 100644 vendor/github.com/uber/jaeger-client-go/README.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/RELEASE.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/baggage_setter.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/config/config.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/config/config_env.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/config/options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/context.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/contrib_observer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/doc.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/glide.lock delete mode 100644 vendor/github.com/uber/jaeger-client-go/glide.yaml delete mode 100644 vendor/github.com/uber/jaeger-client-go/header.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/interop.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/jaeger_tag.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/log/logger.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/logger.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/metrics.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/observer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/process.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/propagation.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/reference.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/reporter.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/reporter_options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/sampler.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/sampler_options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/span.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/.nocover delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/README.md delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/exception.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/numeric.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/processor.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/serializer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/type.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/tracer.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/tracer_options.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/transport.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/transport_udp.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/http_json.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/localip.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/rand.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/udp_client.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/utils/utils.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/zipkin.go delete mode 100644 vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/counter.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/factory.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/gauge.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/local.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/metrics.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go delete mode 100644 vendor/github.com/uber/jaeger-lib/metrics/timer.go create mode 100644 vendor/go.uber.org/atomic/.codecov.yml create mode 100644 vendor/go.uber.org/atomic/.gitignore create mode 100644 vendor/go.uber.org/atomic/CHANGELOG.md rename vendor/{github.com/BurntSushi/toml/COPYING => go.uber.org/atomic/LICENSE.txt} (94%) create mode 100644 vendor/go.uber.org/atomic/Makefile create mode 100644 vendor/go.uber.org/atomic/README.md create mode 100644 vendor/go.uber.org/atomic/bool.go create mode 100644 vendor/go.uber.org/atomic/bool_ext.go create mode 100644 vendor/go.uber.org/atomic/doc.go create mode 100644 vendor/go.uber.org/atomic/duration.go create mode 100644 vendor/go.uber.org/atomic/duration_ext.go create mode 100644 vendor/go.uber.org/atomic/error.go create mode 100644 vendor/go.uber.org/atomic/error_ext.go create mode 100644 vendor/go.uber.org/atomic/float32.go create mode 100644 vendor/go.uber.org/atomic/float32_ext.go create mode 100644 vendor/go.uber.org/atomic/float64.go create mode 100644 vendor/go.uber.org/atomic/float64_ext.go create mode 100644 vendor/go.uber.org/atomic/gen.go create mode 100644 vendor/go.uber.org/atomic/int32.go create mode 100644 vendor/go.uber.org/atomic/int64.go create mode 100644 vendor/go.uber.org/atomic/nocmp.go create mode 100644 vendor/go.uber.org/atomic/pointer_go118.go create mode 100644 vendor/go.uber.org/atomic/pointer_go118_pre119.go create mode 100644 vendor/go.uber.org/atomic/pointer_go119.go create mode 100644 vendor/go.uber.org/atomic/string.go create mode 100644 vendor/go.uber.org/atomic/string_ext.go create mode 100644 vendor/go.uber.org/atomic/time.go create mode 100644 vendor/go.uber.org/atomic/time_ext.go create mode 100644 vendor/go.uber.org/atomic/uint32.go create mode 100644 vendor/go.uber.org/atomic/uint64.go create mode 100644 vendor/go.uber.org/atomic/uintptr.go create mode 100644 vendor/go.uber.org/atomic/unsafe_pointer.go create mode 100644 vendor/go.uber.org/atomic/value.go create mode 100644 vendor/go.uber.org/multierr/.codecov.yml create mode 100644 vendor/go.uber.org/multierr/.gitignore create mode 100644 vendor/go.uber.org/multierr/CHANGELOG.md rename vendor/{github.com/sirupsen/logrus/LICENSE => go.uber.org/multierr/LICENSE.txt} (94%) create mode 100644 vendor/go.uber.org/multierr/Makefile create mode 100644 vendor/go.uber.org/multierr/README.md create mode 100644 vendor/go.uber.org/multierr/error.go create mode 100644 vendor/go.uber.org/multierr/error_post_go120.go create mode 100644 vendor/go.uber.org/multierr/error_pre_go120.go create mode 100644 vendor/go.uber.org/zap/.codecov.yml rename vendor/{github.com/juju/errors => go.uber.org/zap}/.gitignore (80%) create mode 100644 vendor/go.uber.org/zap/.golangci.yml create mode 100644 vendor/go.uber.org/zap/.readme.tmpl create mode 100644 vendor/go.uber.org/zap/CHANGELOG.md create mode 100644 vendor/go.uber.org/zap/CODE_OF_CONDUCT.md create mode 100644 vendor/go.uber.org/zap/CONTRIBUTING.md create mode 100644 vendor/go.uber.org/zap/FAQ.md rename vendor/{github.com/codahale/hdrhistogram => go.uber.org/zap}/LICENSE (95%) create mode 100644 vendor/go.uber.org/zap/Makefile create mode 100644 vendor/go.uber.org/zap/README.md create mode 100644 vendor/go.uber.org/zap/array.go create mode 100644 vendor/go.uber.org/zap/buffer/buffer.go create mode 100644 vendor/go.uber.org/zap/buffer/pool.go create mode 100644 vendor/go.uber.org/zap/checklicense.sh create mode 100644 vendor/go.uber.org/zap/config.go create mode 100644 vendor/go.uber.org/zap/doc.go create mode 100644 vendor/go.uber.org/zap/encoder.go create mode 100644 vendor/go.uber.org/zap/error.go create mode 100644 vendor/go.uber.org/zap/field.go create mode 100644 vendor/go.uber.org/zap/flag.go create mode 100644 vendor/go.uber.org/zap/glide.yaml create mode 100644 vendor/go.uber.org/zap/global.go create mode 100644 vendor/go.uber.org/zap/http_handler.go create mode 100644 vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go create mode 100644 vendor/go.uber.org/zap/internal/color/color.go create mode 100644 vendor/go.uber.org/zap/internal/exit/exit.go create mode 100644 vendor/go.uber.org/zap/internal/level_enabler.go create mode 100644 vendor/go.uber.org/zap/internal/pool/pool.go create mode 100644 vendor/go.uber.org/zap/internal/stacktrace/stack.go create mode 100644 vendor/go.uber.org/zap/internal/ztest/clock.go create mode 100644 vendor/go.uber.org/zap/internal/ztest/doc.go create mode 100644 vendor/go.uber.org/zap/internal/ztest/timeout.go create mode 100644 vendor/go.uber.org/zap/internal/ztest/writer.go create mode 100644 vendor/go.uber.org/zap/level.go create mode 100644 vendor/go.uber.org/zap/logger.go create mode 100644 vendor/go.uber.org/zap/options.go create mode 100644 vendor/go.uber.org/zap/sink.go create mode 100644 vendor/go.uber.org/zap/sugar.go create mode 100644 vendor/go.uber.org/zap/time.go create mode 100644 vendor/go.uber.org/zap/writer.go create mode 100644 vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go create mode 100644 vendor/go.uber.org/zap/zapcore/clock.go create mode 100644 vendor/go.uber.org/zap/zapcore/console_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/core.go create mode 100644 vendor/go.uber.org/zap/zapcore/doc.go create mode 100644 vendor/go.uber.org/zap/zapcore/encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/entry.go create mode 100644 vendor/go.uber.org/zap/zapcore/error.go create mode 100644 vendor/go.uber.org/zap/zapcore/field.go create mode 100644 vendor/go.uber.org/zap/zapcore/hook.go create mode 100644 vendor/go.uber.org/zap/zapcore/increase_level.go create mode 100644 vendor/go.uber.org/zap/zapcore/json_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/lazy_with.go create mode 100644 vendor/go.uber.org/zap/zapcore/level.go create mode 100644 vendor/go.uber.org/zap/zapcore/level_strings.go create mode 100644 vendor/go.uber.org/zap/zapcore/marshaler.go create mode 100644 vendor/go.uber.org/zap/zapcore/memory_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/reflected_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/sampler.go create mode 100644 vendor/go.uber.org/zap/zapcore/tee.go create mode 100644 vendor/go.uber.org/zap/zapcore/write_syncer.go create mode 100644 vendor/go.uber.org/zap/zaptest/doc.go create mode 100644 vendor/go.uber.org/zap/zaptest/logger.go create mode 100644 vendor/go.uber.org/zap/zaptest/testingt.go create mode 100644 vendor/go.uber.org/zap/zaptest/timeout.go create mode 100644 vendor/go.uber.org/zap/zaptest/writer.go delete mode 100644 vendor/golang.org/x/net/context/context.go delete mode 100644 vendor/golang.org/x/net/context/go17.go delete mode 100644 vendor/golang.org/x/net/context/go19.go delete mode 100644 vendor/golang.org/x/net/context/pre_go17.go delete mode 100644 vendor/golang.org/x/net/context/pre_go19.go delete mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go delete mode 100644 vendor/golang.org/x/net/trace/events.go delete mode 100644 vendor/golang.org/x/net/trace/histogram.go delete mode 100644 vendor/golang.org/x/net/trace/trace.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go delete mode 100644 vendor/google.golang.org/grpc/AUTHORS delete mode 100644 vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md delete mode 100644 vendor/google.golang.org/grpc/CONTRIBUTING.md delete mode 100644 vendor/google.golang.org/grpc/GOVERNANCE.md delete mode 100644 vendor/google.golang.org/grpc/LICENSE delete mode 100644 vendor/google.golang.org/grpc/MAINTAINERS.md delete mode 100644 vendor/google.golang.org/grpc/Makefile delete mode 100644 vendor/google.golang.org/grpc/NOTICE.txt delete mode 100644 vendor/google.golang.org/grpc/README.md delete mode 100644 vendor/google.golang.org/grpc/SECURITY.md delete mode 100644 vendor/google.golang.org/grpc/attributes/attributes.go delete mode 100644 vendor/google.golang.org/grpc/backoff.go delete mode 100644 vendor/google.golang.org/grpc/backoff/backoff.go delete mode 100644 vendor/google.golang.org/grpc/balancer/balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/base/balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/base/base.go delete mode 100644 vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/state/state.go delete mode 100644 vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go delete mode 100644 vendor/google.golang.org/grpc/balancer_conn_wrappers.go delete mode 100644 vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go delete mode 100644 vendor/google.golang.org/grpc/call.go delete mode 100644 vendor/google.golang.org/grpc/channelz/channelz.go delete mode 100644 vendor/google.golang.org/grpc/clientconn.go delete mode 100644 vendor/google.golang.org/grpc/codec.go delete mode 100644 vendor/google.golang.org/grpc/codegen.sh delete mode 100644 vendor/google.golang.org/grpc/codes/code_string.go delete mode 100644 vendor/google.golang.org/grpc/codes/codes.go delete mode 100644 vendor/google.golang.org/grpc/connectivity/connectivity.go delete mode 100644 vendor/google.golang.org/grpc/credentials/credentials.go delete mode 100644 vendor/google.golang.org/grpc/credentials/insecure/insecure.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls.go delete mode 100644 vendor/google.golang.org/grpc/dialoptions.go delete mode 100644 vendor/google.golang.org/grpc/doc.go delete mode 100644 vendor/google.golang.org/grpc/encoding/encoding.go delete mode 100644 vendor/google.golang.org/grpc/encoding/proto/proto.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/component.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/logger.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go delete mode 100644 vendor/google.golang.org/grpc/idle.go delete mode 100644 vendor/google.golang.org/grpc/interceptor.go delete mode 100644 vendor/google.golang.org/grpc/internal/backoff/backoff.go delete mode 100644 vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go delete mode 100644 vendor/google.golang.org/grpc/internal/balancerload/load.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/env_config.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/method_logger.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/sink.go delete mode 100644 vendor/google.golang.org/grpc/internal/buffer/unbounded.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/funcs.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/id.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/logging.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/credentials/credentials.go delete mode 100644 vendor/google.golang.org/grpc/internal/credentials/spiffe.go delete mode 100644 vendor/google.golang.org/grpc/internal/credentials/syscallconn.go delete mode 100644 vendor/google.golang.org/grpc/internal/credentials/util.go delete mode 100644 vendor/google.golang.org/grpc/internal/envconfig/envconfig.go delete mode 100644 vendor/google.golang.org/grpc/internal/envconfig/observability.go delete mode 100644 vendor/google.golang.org/grpc/internal/envconfig/xds.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpclog/grpclog.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/event.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/compressor.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/metadata.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/method.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/regex.go delete mode 100644 vendor/google.golang.org/grpc/internal/internal.go delete mode 100644 vendor/google.golang.org/grpc/internal/metadata/metadata.go delete mode 100644 vendor/google.golang.org/grpc/internal/pretty/pretty.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/config_selector.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/unix/unix.go delete mode 100644 vendor/google.golang.org/grpc/internal/serviceconfig/duration.go delete mode 100644 vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go delete mode 100644 vendor/google.golang.org/grpc/internal/status/status.go delete mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/controlbuf.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/defaults.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/flowcontrol.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/handler_server.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_client.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_server.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http_util.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/logging.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/proxy.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/transport.go delete mode 100644 vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go delete mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go delete mode 100644 vendor/google.golang.org/grpc/metadata/metadata.go delete mode 100644 vendor/google.golang.org/grpc/peer/peer.go delete mode 100644 vendor/google.golang.org/grpc/picker_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/pickfirst.go delete mode 100644 vendor/google.golang.org/grpc/preloader.go delete mode 100644 vendor/google.golang.org/grpc/regenerate.sh delete mode 100644 vendor/google.golang.org/grpc/resolver/map.go delete mode 100644 vendor/google.golang.org/grpc/resolver/resolver.go delete mode 100644 vendor/google.golang.org/grpc/resolver_conn_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/rpc_util.go delete mode 100644 vendor/google.golang.org/grpc/server.go delete mode 100644 vendor/google.golang.org/grpc/service_config.go delete mode 100644 vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go delete mode 100644 vendor/google.golang.org/grpc/stats/handlers.go delete mode 100644 vendor/google.golang.org/grpc/stats/stats.go delete mode 100644 vendor/google.golang.org/grpc/status/status.go delete mode 100644 vendor/google.golang.org/grpc/stream.go delete mode 100644 vendor/google.golang.org/grpc/tap/tap.go delete mode 100644 vendor/google.golang.org/grpc/trace.go delete mode 100644 vendor/google.golang.org/grpc/version.go delete mode 100644 vendor/google.golang.org/grpc/vet.sh delete mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/decode.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/doc.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/encode.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go delete mode 100644 vendor/google.golang.org/protobuf/internal/editionssupport/editions.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/encode.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go delete mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go create mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/.travis.yml diff --git a/go.mod b/go.mod index a6e0ae4..b79676b 100644 --- a/go.mod +++ b/go.mod @@ -12,31 +12,21 @@ require ( github.com/huandu/xstrings v1.5.0 github.com/jacobbrewer1/vaulty v0.1.3 github.com/jmoiron/sqlx v1.4.0 - github.com/pingcap/tidb v2.0.7+incompatible + github.com/pingcap/tidb/pkg/parser v0.0.0-20241101162255-241c10294b9c github.com/prometheus/client_golang v1.20.5 github.com/stretchr/testify v1.9.0 ) require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/BurntSushi/toml v0.0.0-20170626110600-a368813c5e64 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.4.2 // indirect + github.com/Masterminds/semver v1.5.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect - github.com/coreos/etcd v3.2.18+incompatible // indirect - github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 // indirect - github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/go-jose/go-jose/v4 v4.0.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect - github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -48,51 +38,31 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/vault/api/auth/approle v0.8.0 // indirect github.com/hashicorp/vault/api/auth/userpass v0.8.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/juju/errors v0.0.0-20170703010042-c7d06af17c68 // indirect - github.com/juju/loggo v0.0.0-20180524022052-584905176618 // indirect - github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect - github.com/kr/text v0.2.0 // indirect + github.com/imdario/mergo v0.3.11 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 // indirect - github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef // indirect - github.com/onsi/ginkgo v1.6.0 // indirect - github.com/onsi/gomega v1.4.2 // indirect - github.com/opentracing/opentracing-go v1.0.2 // indirect - github.com/pingcap/check v0.0.0-20171206051426-1c287c953996 // indirect - github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e // indirect - github.com/pingcap/kvproto v0.0.0-20180906040556-529c652955d8 // indirect - github.com/pingcap/pd v2.0.5+incompatible // indirect - github.com/pingcap/tipb v0.0.0-20180621072330-658ea9c14169 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb // indirect + github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 // indirect + github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/sirupsen/logrus v1.6.0 // indirect - github.com/spaolacci/murmur3 v0.0.0-20170819071325-9f5d223c6079 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/twinj/uuid v1.0.0 // indirect - github.com/uber-go/atomic v1.3.2 // indirect - github.com/uber/jaeger-client-go v2.14.0+incompatible // indirect - github.com/uber/jaeger-lib v1.5.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.24.0 // indirect golang.org/x/net v0.26.0 // indirect golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.3 // indirect google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -replace github.com/pingcap/tidb v2.0.7+incompatible => github.com/jacobbrewer1/tidb v2.0.6-0.20180920112946-471a025d5769+incompatible diff --git a/go.sum b/go.sum index dcdbebc..1d45747 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,14 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/BurntSushi/toml v0.0.0-20170626110600-a368813c5e64 h1:BuYewlQyh/jroxY8qx41SrzD8Go17GkyCyAeVmprvQI= -github.com/BurntSushi/toml v0.0.0-20170626110600-a368813c5e64/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= @@ -16,15 +16,6 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/coreos/etcd v3.2.18+incompatible h1:E8oIF72eom0bDAB74G/H31rAe1JVoiLE5NMn+WUCNLc= -github.com/coreos/etcd v3.2.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk= -github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE= -github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -32,32 +23,18 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/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/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -87,30 +64,21 @@ github.com/hashicorp/vault/api/auth/approle v0.8.0 h1:FuVtWZ0xD6+wz1x0l5s0b4852R github.com/hashicorp/vault/api/auth/approle v0.8.0/go.mod h1:NV7O9r5JUtNdVnqVZeMHva81AIdpG0WoIQohNt1VCPM= github.com/hashicorp/vault/api/auth/userpass v0.8.0 h1:JFFzMld+VO/S1v8HQNJzcy+3o+xfx/iH49dsiQ1G5jk= github.com/hashicorp/vault/api/auth/userpass v0.8.0/go.mod h1:+XbsSnbbyo+yjySfKcIsyl28kO4C/c4Czo7og0XCtUo= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/jacobbrewer1/tidb v2.0.6-0.20180920112946-471a025d5769+incompatible h1:AkcjkbeEHW1j1r0YdtnTBV/hvMmLCyty/DzSYlnGva0= -github.com/jacobbrewer1/tidb v2.0.6-0.20180920112946-471a025d5769+incompatible/go.mod h1:vD3Ebyc/YQYMraopzRFxbXgMt38m6iZV3psHE5EhPxA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jacobbrewer1/vaulty v0.1.3 h1:0L3JnmzqcxL91COVMUkT+HWje3jTy9YjYbpFOyGmHBo= github.com/jacobbrewer1/vaulty v0.1.3/go.mod h1:c1miXLEnUIejWOZpp2mEl7Jc/0jlVPtcKTrPbmnASXk= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/juju/errors v0.0.0-20170703010042-c7d06af17c68 h1:d2hBkTvi7B89+OXY8+bBBshPlc+7JYacGrG/dFak8SQ= -github.com/juju/errors v0.0.0-20170703010042-c7d06af17c68/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -136,28 +104,16 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/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/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pingcap/check v0.0.0-20171206051426-1c287c953996 h1:ZBdiJCMan6GSo/aPAM7gywcUKa0z58gczVrnG6TQnAQ= -github.com/pingcap/check v0.0.0-20171206051426-1c287c953996/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= -github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rGrobssy1nVy2VaVpNCuLpCbr+FEaTA8= -github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= -github.com/pingcap/kvproto v0.0.0-20180906040556-529c652955d8 h1:cmWumETj5QiNUy5Do9ZFX7GuZpn2oUTGfiYPficmSxg= -github.com/pingcap/kvproto v0.0.0-20180906040556-529c652955d8/go.mod h1:0gwbe1F2iBIjuQ9AH0DbQhL+Dpr5GofU8fgYyXk+ykk= -github.com/pingcap/pd v2.0.5+incompatible h1:nUTetzzM/tLbd03DoMB76AAvI57oYftNib9sUE3KPFk= -github.com/pingcap/pd v2.0.5+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E= -github.com/pingcap/tipb v0.0.0-20180621072330-658ea9c14169 h1:Xpxw0Y0D/56v8Ueg6i/ZU5CQ9dWzUbsgByrLhlZU5Oc= -github.com/pingcap/tipb v0.0.0-20180621072330-658ea9c14169/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb h1:3pSi4EDG6hg0orE1ndHkXvX6Qdq2cZn8gAPir8ymKZk= +github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 h1:tdMsjOqUR7YXHoBitzdebTvOjs/swniBTOLy5XiMtuE= +github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86/go.mod h1:exzhVYca3WRtd6gclGNErRWb1qEgff3LYta0LvRmON4= +github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 h1:2SOzvGvE8beiC1Y4g9Onkvu6UmuBBOeWRGQEjJaT/JY= +github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/tidb/pkg/parser v0.0.0-20241101162255-241c10294b9c h1:YRD6Qlb71cbKkU4utVKMka4GcZf0K9BJWErUhFOA8D8= +github.com/pingcap/tidb/pkg/parser v0.0.0-20241101162255-241c10294b9c/go.mod h1:Hju1TEWZvrctQKbztTRwXH7rd41Yq0Pgmq4PrEKcq7o= +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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -170,69 +126,71 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20170819071325-9f5d223c6079 h1:lDiM+yMjW7Ork8mhl0YN0qO1Z02qGoe1vwzGc1gP/8U= -github.com/spaolacci/murmur3 v0.0.0-20170819071325-9f5d223c6079/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk= -github.com/twinj/uuid v1.0.0/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY= -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.14.0+incompatible h1:1KGTNRby0tDiVDDhvzL0pz0N26M9DobVCfSqz4Z/UPc= -github.com/uber/jaeger-client-go v2.14.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo= -github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI= -gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -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.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/generation/load.go b/pkg/generation/load.go index b5f89f4..ce4ce09 100644 --- a/pkg/generation/load.go +++ b/pkg/generation/load.go @@ -7,8 +7,9 @@ import ( "strings" "github.com/jacobbrewer1/goschema/pkg/models" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + _ "github.com/pingcap/tidb/pkg/parser/test_driver" ) // LoadSQL loads all SQL files in the given paths and parses them @@ -67,7 +68,7 @@ func parseSQL(p *parser.Parser, path string) ([]*models.Table, error) { } sql = []byte(strings.Join(lines, "\n")) - stmts, err := p.Parse(string(sql), "", "") + stmts, _, err := p.ParseSQL(string(sql)) if err != nil { return nil, fmt.Errorf("error parsing SQL: %w", err) } diff --git a/pkg/generation/template_helpers.go b/pkg/generation/template_helpers.go index 3c13fb1..4424ec3 100644 --- a/pkg/generation/template_helpers.go +++ b/pkg/generation/template_helpers.go @@ -24,6 +24,8 @@ var Helpers = template.FuncMap{ "enum_columns": enumColumns, "unique_column_keys": uniqueColumnKeys, "sorted_columns": sortedColumns, + "get_type": getType, + "get_tags": getTags, } // hasPrimaryKey returns true if the table has a primary key @@ -171,3 +173,123 @@ func sortedColumns(t *models.Table) []*models.Column { sort.SliceStable(ret, func(i, j int) bool { return ret[i].Name < ret[j].Name }) return ret } + +func getType(col *models.Column) string { + switch strings.ToLower(col.Type) { + case "bigint": + if col.Nullable { + return "usql.NullInt64" + } + if col.Unsigned { + return "uint64" + } + return "int64" + case "int": + if col.Nullable { + return "usql.NullInt64" + } + if col.Unsigned { + return "uint" + } + return "int" + case "tinyint": + if col.TypeSize == 1 { + if col.Nullable { + return "usql.NullBool" + } + return "bool" + } + if col.Nullable { + return "usql.NullInt64" + } + if col.Unsigned { + return "uint8" + } + return "int8" + case "smallint": + if col.Nullable { + return "usql.NullInt64" + } + if col.Unsigned { + return "uint16" + } + return "int16" + case "mediumint": + if col.Nullable { + return "usql.NullInt64" + } + if col.Unsigned { + return "uint32" + } + return "int32" + case "float": + if col.Nullable { + return "usql.NullFloat64" + } + if col.TypeSize < 25 { + return "float32" + } + return "float64" + case "decimal", "double": + if col.Nullable { + return "usql.NullFloat64" + } + return "float64" + case "char", "varchar", "tinytext", "text", "mediumtext", "longtext", "string": + if col.Nullable { + return "usql.NullString" + } + return "string" + case "binary", "varbinary", "tinyblob", "blob", "mediumblob", "longblob": + return "[]byte" + case "enum": + if col.Nullable { + return "usql.NullEnum" + } + return "usql.Enum" + case "year", "date", "datetime", "timestamp": + if col.Nullable { + return "usql.NullTime" + } + return "time.Time" + case "time": + if col.Nullable { + return "usql.NullDuration" + } + return "usql.Duration" + default: + fmt.Println("Unknown type:", col.Type) + return "unknown" + } +} + +func getTags(col *models.Column) string { + tags := fmt.Sprintf("`db:\"%s", col.Name) + if col.InPrimaryKey { + tags += ",pk" + } + if col.AutoIncrementing { + tags += ",autoinc" + } + if col.HasDefault { + tags += ",default" + } + if col.Nullable { + tags += ",nullable" + } + if col.Unsigned { + tags += ",unsigned" + } + if col.ZeroFilled { + tags += ",zerofill" + } + if col.Binary { + tags += ",binary" + } + if col.InUniqueKey { + tags += ",unique" + } + tags += "\"`" + + return tags +} diff --git a/pkg/models/column.go b/pkg/models/column.go index fb9b87a..d5d7335 100644 --- a/pkg/models/column.go +++ b/pkg/models/column.go @@ -3,12 +3,11 @@ package models import ( "log/slog" "math/big" - "strconv" "time" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/parser/types" ) // FunctionCall represents a MySQL function call @@ -34,11 +33,12 @@ type Column struct { } func (c *Column) setTypeInfo(tp *types.FieldType) { - c.Type = types.TypeToStr(tp.Tp, tp.Charset) - c.TypeSize = tp.Flen - c.TypePrecision = tp.Decimal - if tp.Tp == mysql.TypeEnum { - c.Elements = tp.Elems + c.Type = tp.EvalType().String() + c.TypeSize = tp.GetFlen() + c.TypePrecision = tp.GetDecimal() + if tp.GetType() == mysql.TypeEnum { + c.Type = "enum" + c.Elements = tp.GetElems() } } @@ -56,8 +56,8 @@ func (c *Column) setOptions(col *ast.ColumnDef) error { case ast.ColumnOptionDefaultValue: c.HasDefault = true switch v := opt.Expr.(type) { - case *ast.ValueExpr: - if v != nil && !v.IsNull() { + case ast.ValueExpr: + if v != nil && v.GetValue() != nil { if err := c.setDefaultValue(col, v); err != nil { return err } @@ -71,7 +71,7 @@ func (c *Column) setOptions(col *ast.ColumnDef) error { case ast.ColumnOptionAutoIncrement: c.AutoIncrementing = true case ast.ColumnOptionComment: - c.Comment = opt.Expr.GetValue().(string) + c.Comment = opt.Expr.Text() case ast.ColumnOptionPrimaryKey: c.InPrimaryKey = true c.InUniqueKey = true @@ -86,8 +86,8 @@ func (c *Column) setOptions(col *ast.ColumnDef) error { return nil } -func (c *Column) setDefaultValue(col *ast.ColumnDef, v *ast.ValueExpr) (err error) { - if v.IsNull() { +func (c *Column) setDefaultValue(col *ast.ColumnDef, v ast.ValueExpr) (err error) { + if v.GetValue() == nil { return nil } @@ -95,48 +95,52 @@ func (c *Column) setDefaultValue(col *ast.ColumnDef, v *ast.ValueExpr) (err erro // invalid schemas then schema2go should try to do the right thing, or at least the least-wrong thing. switch col.Tp.EvalType() { case types.ETDatetime: - var t types.Time - if col.Tp.Tp == mysql.TypeDate { - t, _ = types.ParseDate(nil, v.GetString()) - c.Default, err = t.Time.GoTime(time.UTC) - if types.ErrInvalidTimeFormat.Equal(err) { + if col.Tp.GetType() == mysql.TypeDate { + c.Default, err = time.Parse(time.DateOnly, v.GetString()) + if err != nil { c.Default = time.Time{} return nil } + c.Default = v.GetString() return nil } - t, _ = types.ParseDatetime(nil, v.GetString()) - c.Default, err = t.Time.GoTime(time.UTC) - if types.ErrInvalidTimeFormat.Equal(err) { + c.Default, err = time.Parse(time.DateTime, v.GetString()) + if err != nil { c.Default = time.Time{} return nil } + c.Default = v.GetString() return err case types.ETTimestamp: - t, _ := types.ParseTimestamp(nil, v.GetString()) - c.Default, _ = t.Time.GoTime(time.UTC) + t, err := time.Parse(time.DateTime, v.GetString()) + if err != nil { + c.Default = time.Time{} + return nil + } + + c.Default = t return nil case types.ETDuration: - c.Default = v.GetMysqlDuration().Duration - if c.Default.(time.Duration) == 0 { - d, _ := types.ParseDuration(v.GetString(), types.GetFsp(v.GetString())) - c.Default = d.Duration + d, err := time.ParseDuration(v.GetString()) + if err != nil { + c.Default = time.Duration(0) + return nil } + + c.Default = d + return nil case types.ETDecimal, types.ETReal: - switch v.Kind() { - case types.KindFloat32: - c.Default = v.GetFloat32() - case types.KindFloat64: - c.Default = v.GetFloat64() - case types.KindMysqlDecimal: - d := v.GetMysqlDecimal() - prec, _ := d.PrecisionAndFrac() - c.Default, _, err = big.ParseFloat(string(d.ToString()), 10, uint(prec), big.ToNearestEven) - case types.KindString: - c.Default, err = strconv.ParseFloat(v.GetString(), 64) + switch v.GetType().GetType() { + case mysql.TypeFloat, mysql.TypeDouble: + c.Default = v.GetValue() + return nil + case mysql.TypeNewDecimal: + d := v.GetString() + precision := col.Tp.GetFlen() + c.Default, _, err = big.ParseFloat(d, 10, uint(precision), big.ToNearestEven) } return err case types.ETInt: @@ -152,9 +156,9 @@ func (c *Column) setDefaultValue(col *ast.ColumnDef, v *ast.ValueExpr) (err erro } return nil } - c.Default = v.GetInt64() + c.Default = v.GetValue() case types.ETJson: - c.Default = v.GetMysqlJSON().String() + c.Default = v.GetString() case types.ETString: c.Default = v.GetString() default: diff --git a/pkg/models/constraint.go b/pkg/models/constraint.go index 790d240..230d3b4 100644 --- a/pkg/models/constraint.go +++ b/pkg/models/constraint.go @@ -1,6 +1,8 @@ package models -import "github.com/pingcap/tidb/ast" +import ( + "github.com/pingcap/tidb/pkg/parser/ast" +) // Constraint represents a MySQL foreign key constraint type Constraint struct { @@ -13,6 +15,6 @@ type Constraint struct { func (c *Constraint) setReferences(con *ast.Constraint) { c.References = make(map[string]string, len(con.Keys)) for i, col := range con.Keys { - c.References[col.Column.String()] = con.Refer.IndexColNames[i].Column.String() + c.References[col.Column.String()] = con.Refer.IndexPartSpecifications[i].Column.String() } } diff --git a/pkg/models/table.go b/pkg/models/table.go index 8660a40..718bc63 100644 --- a/pkg/models/table.go +++ b/pkg/models/table.go @@ -4,7 +4,7 @@ import ( "log" "log/slog" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/tidb/pkg/parser/ast" ) // Table represents a MySQL table definition @@ -24,7 +24,7 @@ func (t *Table) setColumns(ct *ast.CreateTableStmt) error { Name: col.Name.String(), } t.Columns[i].setTypeInfo(col.Tp) - t.Columns[i].setFlags(col.Tp.Flag) + t.Columns[i].setFlags(col.Tp.GetFlag()) if err := t.Columns[i].setOptions(col); err != nil { return err } diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore deleted file mode 100644 index 0cd3800..0000000 --- a/vendor/github.com/BurntSushi/toml/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -TAGS -tags -.*.swp -tomlcheck/tomlcheck -toml.test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml deleted file mode 100644 index 8b8afc4..0000000 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - tip -install: - - go install ./... - - go get github.com/BurntSushi/toml-test -script: - - export PATH="$PATH:$HOME/gopath/bin" - - make test diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE deleted file mode 100644 index 6efcfd0..0000000 --- a/vendor/github.com/BurntSushi/toml/COMPATIBLE +++ /dev/null @@ -1,3 +0,0 @@ -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) - diff --git a/vendor/github.com/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile deleted file mode 100644 index 3600848..0000000 --- a/vendor/github.com/BurntSushi/toml/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -install: - go install ./... - -test: install - go test -v - toml-test toml-test-decoder - toml-test -encoder toml-test-encoder - -fmt: - gofmt -w *.go */*.go - colcheck *.go */*.go - -tags: - find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS - -push: - git push origin master - git push github master - diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md deleted file mode 100644 index 7c1b37e..0000000 --- a/vendor/github.com/BurntSushi/toml/README.md +++ /dev/null @@ -1,218 +0,0 @@ -## TOML parser and encoder for Go with reflection - -TOML stands for Tom's Obvious, Minimal Language. This Go package provides a -reflection interface similar to Go's standard library `json` and `xml` -packages. This package also supports the `encoding.TextUnmarshaler` and -`encoding.TextMarshaler` interfaces so that you can define custom data -representations. (There is an example of this below.) - -Spec: https://github.com/toml-lang/toml - -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) - -Documentation: https://godoc.org/github.com/BurntSushi/toml - -Installation: - -```bash -go get github.com/BurntSushi/toml -``` - -Try the toml validator: - -```bash -go get github.com/BurntSushi/toml/cmd/tomlv -tomlv some-toml-file.toml -``` - -[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml) - -### Testing - -This package passes all tests in -[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder -and the encoder. - -### Examples - -This package works similarly to how the Go standard library handles `XML` -and `JSON`. Namely, data is loaded into Go values via reflection. - -For the simplest example, consider some TOML file as just a list of keys -and values: - -```toml -Age = 25 -Cats = [ "Cauchy", "Plato" ] -Pi = 3.14 -Perfection = [ 6, 28, 496, 8128 ] -DOB = 1987-07-05T05:45:00Z -``` - -Which could be defined in Go as: - -```go -type Config struct { - Age int - Cats []string - Pi float64 - Perfection []int - DOB time.Time // requires `import time` -} -``` - -And then decoded with: - -```go -var conf Config -if _, err := toml.Decode(tomlData, &conf); err != nil { - // handle error -} -``` - -You can also use struct tags if your struct field name doesn't map to a TOML -key value directly: - -```toml -some_key_NAME = "wat" -``` - -```go -type TOML struct { - ObscureKey string `toml:"some_key_NAME"` -} -``` - -### Using the `encoding.TextUnmarshaler` interface - -Here's an example that automatically parses duration strings into -`time.Duration` values: - -```toml -[[song]] -name = "Thunder Road" -duration = "4m49s" - -[[song]] -name = "Stairway to Heaven" -duration = "8m03s" -``` - -Which can be decoded with: - -```go -type song struct { - Name string - Duration duration -} -type songs struct { - Song []song -} -var favorites songs -if _, err := toml.Decode(blob, &favorites); err != nil { - log.Fatal(err) -} - -for _, s := range favorites.Song { - fmt.Printf("%s (%s)\n", s.Name, s.Duration) -} -``` - -And you'll also need a `duration` type that satisfies the -`encoding.TextUnmarshaler` interface: - -```go -type duration struct { - time.Duration -} - -func (d *duration) UnmarshalText(text []byte) error { - var err error - d.Duration, err = time.ParseDuration(string(text)) - return err -} -``` - -### More complex usage - -Here's an example of how to load the example from the official spec page: - -```toml -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] -``` - -And the corresponding Go types are: - -```go -type tomlConfig struct { - Title string - Owner ownerInfo - DB database `toml:"database"` - Servers map[string]server - Clients clients -} - -type ownerInfo struct { - Name string - Org string `toml:"organization"` - Bio string - DOB time.Time -} - -type database struct { - Server string - Ports []int - ConnMax int `toml:"connection_max"` - Enabled bool -} - -type server struct { - IP string - DC string -} - -type clients struct { - Data [][]interface{} - Hosts []string -} -``` - -Note that a case insensitive match will be tried if an exact match can't be -found. - -A working example of the above can be found in `_examples/example.{go,toml}`. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go deleted file mode 100644 index b0fd51d..0000000 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ /dev/null @@ -1,509 +0,0 @@ -package toml - -import ( - "fmt" - "io" - "io/ioutil" - "math" - "reflect" - "strings" - "time" -) - -func e(format string, args ...interface{}) error { - return fmt.Errorf("toml: "+format, args...) -} - -// Unmarshaler is the interface implemented by objects that can unmarshal a -// TOML description of themselves. -type Unmarshaler interface { - UnmarshalTOML(interface{}) error -} - -// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. -func Unmarshal(p []byte, v interface{}) error { - _, err := Decode(string(p), v) - return err -} - -// Primitive is a TOML value that hasn't been decoded into a Go value. -// When using the various `Decode*` functions, the type `Primitive` may -// be given to any value, and its decoding will be delayed. -// -// A `Primitive` value can be decoded using the `PrimitiveDecode` function. -// -// The underlying representation of a `Primitive` value is subject to change. -// Do not rely on it. -// -// N.B. Primitive values are still parsed, so using them will only avoid -// the overhead of reflection. They can be useful when you don't know the -// exact type of TOML data until run time. -type Primitive struct { - undecoded interface{} - context Key -} - -// DEPRECATED! -// -// Use MetaData.PrimitiveDecode instead. -func PrimitiveDecode(primValue Primitive, v interface{}) error { - md := MetaData{decoded: make(map[string]bool)} - return md.unify(primValue.undecoded, rvalue(v)) -} - -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) -// -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) -func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { - md.context = primValue.context - defer func() { md.context = nil }() - return md.unify(primValue.undecoded, rvalue(v)) -} - -// Decode will decode the contents of `data` in TOML format into a pointer -// `v`. -// -// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be -// used interchangeably.) -// -// TOML arrays of tables correspond to either a slice of structs or a slice -// of maps. -// -// TOML datetimes correspond to Go `time.Time` values. -// -// All other TOML types (float, string, int, bool and array) correspond -// to the obvious Go types. -// -// An exception to the above rules is if a type implements the -// encoding.TextUnmarshaler interface. In this case, any primitive TOML value -// (floats, strings, integers, booleans and datetimes) will be converted to -// a byte string and given to the value's UnmarshalText method. See the -// Unmarshaler example for a demonstration with time duration strings. -// -// Key mapping -// -// TOML keys can map to either keys in a Go map or field names in a Go -// struct. The special `toml` struct tag may be used to map TOML keys to -// struct fields that don't match the key name exactly. (See the example.) -// A case insensitive match to struct names will be tried if an exact match -// can't be found. -// -// The mapping between TOML values and Go values is loose. That is, there -// may exist TOML values that cannot be placed into your representation, and -// there may be parts of your representation that do not correspond to -// TOML values. This loose mapping can be made stricter by using the IsDefined -// and/or Undecoded methods on the MetaData returned. -// -// This decoder will not handle cyclic types. If a cyclic type is passed, -// `Decode` will not terminate. -func Decode(data string, v interface{}) (MetaData, error) { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr { - return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) - } - if rv.IsNil() { - return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) - } - p, err := parse(data) - if err != nil { - return MetaData{}, err - } - md := MetaData{ - p.mapping, p.types, p.ordered, - make(map[string]bool, len(p.ordered)), nil, - } - return md, md.unify(p.mapping, indirect(rv)) -} - -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at `fpath` and decode it for you. -func DecodeFile(fpath string, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadFile(fpath) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// DecodeReader is just like Decode, except it will consume all bytes -// from the reader and decode it for you. -func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadAll(r) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// unify performs a sort of type unification based on the structure of `rv`, -// which is the client representation. -// -// Any type mismatch produces an error. Finding a type that we don't know -// how to handle produces an unsupported type error. -func (md *MetaData) unify(data interface{}, rv reflect.Value) error { - - // Special case. Look for a `Primitive` value. - if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { - // Save the undecoded data and the key context into the primitive - // value. - context := make(Key, len(md.context)) - copy(context, md.context) - rv.Set(reflect.ValueOf(Primitive{ - undecoded: data, - context: context, - })) - return nil - } - - // Special case. Unmarshaler Interface support. - if rv.CanAddr() { - if v, ok := rv.Addr().Interface().(Unmarshaler); ok { - return v.UnmarshalTOML(data) - } - } - - // Special case. Handle time.Time values specifically. - // TODO: Remove this code when we decide to drop support for Go 1.1. - // This isn't necessary in Go 1.2 because time.Time satisfies the encoding - // interfaces. - if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { - return md.unifyDatetime(data, rv) - } - - // Special case. Look for a value satisfying the TextUnmarshaler interface. - if v, ok := rv.Interface().(TextUnmarshaler); ok { - return md.unifyText(data, v) - } - // BUG(burntsushi) - // The behavior here is incorrect whenever a Go type satisfies the - // encoding.TextUnmarshaler interface but also corresponds to a TOML - // hash or array. In particular, the unmarshaler should only be applied - // to primitive TOML values. But at this point, it will be applied to - // all kinds of values and produce an incorrect error whenever those values - // are hashes or arrays (including arrays of tables). - - k := rv.Kind() - - // laziness - if k >= reflect.Int && k <= reflect.Uint64 { - return md.unifyInt(data, rv) - } - switch k { - case reflect.Ptr: - elem := reflect.New(rv.Type().Elem()) - err := md.unify(data, reflect.Indirect(elem)) - if err != nil { - return err - } - rv.Set(elem) - return nil - case reflect.Struct: - return md.unifyStruct(data, rv) - case reflect.Map: - return md.unifyMap(data, rv) - case reflect.Array: - return md.unifyArray(data, rv) - case reflect.Slice: - return md.unifySlice(data, rv) - case reflect.String: - return md.unifyString(data, rv) - case reflect.Bool: - return md.unifyBool(data, rv) - case reflect.Interface: - // we only support empty interfaces. - if rv.NumMethod() > 0 { - return e("unsupported type %s", rv.Type()) - } - return md.unifyAnything(data, rv) - case reflect.Float32: - fallthrough - case reflect.Float64: - return md.unifyFloat64(data, rv) - } - return e("unsupported type %s", rv.Kind()) -} - -func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if mapping == nil { - return nil - } - return e("type mismatch for %s: expected table but found %T", - rv.Type().String(), mapping) - } - - for key, datum := range tmap { - var f *field - fields := cachedTypeFields(rv.Type()) - for i := range fields { - ff := &fields[i] - if ff.name == key { - f = ff - break - } - if f == nil && strings.EqualFold(ff.name, key) { - f = ff - } - } - if f != nil { - subv := rv - for _, i := range f.index { - subv = indirect(subv.Field(i)) - } - if isUnifiable(subv) { - md.decoded[md.context.add(key).String()] = true - md.context = append(md.context, key) - if err := md.unify(datum, subv); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - } else if f.name != "" { - // Bad user! No soup for you! - return e("cannot write unexported field %s.%s", - rv.Type().String(), f.name) - } - } - } - return nil -} - -func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if tmap == nil { - return nil - } - return badtype("map", mapping) - } - if rv.IsNil() { - rv.Set(reflect.MakeMap(rv.Type())) - } - for k, v := range tmap { - md.decoded[md.context.add(k).String()] = true - md.context = append(md.context, k) - - rvkey := indirect(reflect.New(rv.Type().Key())) - rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) - if err := md.unify(v, rvval); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - - rvkey.SetString(k) - rv.SetMapIndex(rvkey, rvval) - } - return nil -} - -func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - sliceLen := datav.Len() - if sliceLen != rv.Len() { - return e("expected array length %d; got TOML array of length %d", - rv.Len(), sliceLen) - } - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - n := datav.Len() - if rv.IsNil() || rv.Cap() < n { - rv.Set(reflect.MakeSlice(rv.Type(), n, n)) - } - rv.SetLen(n) - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { - sliceLen := data.Len() - for i := 0; i < sliceLen; i++ { - v := data.Index(i).Interface() - sliceval := indirect(rv.Index(i)) - if err := md.unify(v, sliceval); err != nil { - return err - } - } - return nil -} - -func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { - if _, ok := data.(time.Time); ok { - rv.Set(reflect.ValueOf(data)) - return nil - } - return badtype("time.Time", data) -} - -func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { - if s, ok := data.(string); ok { - rv.SetString(s) - return nil - } - return badtype("string", data) -} - -func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { - if num, ok := data.(float64); ok { - switch rv.Kind() { - case reflect.Float32: - fallthrough - case reflect.Float64: - rv.SetFloat(num) - default: - panic("bug") - } - return nil - } - return badtype("float", data) -} - -func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { - if num, ok := data.(int64); ok { - if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { - switch rv.Kind() { - case reflect.Int, reflect.Int64: - // No bounds checking necessary. - case reflect.Int8: - if num < math.MinInt8 || num > math.MaxInt8 { - return e("value %d is out of range for int8", num) - } - case reflect.Int16: - if num < math.MinInt16 || num > math.MaxInt16 { - return e("value %d is out of range for int16", num) - } - case reflect.Int32: - if num < math.MinInt32 || num > math.MaxInt32 { - return e("value %d is out of range for int32", num) - } - } - rv.SetInt(num) - } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { - unum := uint64(num) - switch rv.Kind() { - case reflect.Uint, reflect.Uint64: - // No bounds checking necessary. - case reflect.Uint8: - if num < 0 || unum > math.MaxUint8 { - return e("value %d is out of range for uint8", num) - } - case reflect.Uint16: - if num < 0 || unum > math.MaxUint16 { - return e("value %d is out of range for uint16", num) - } - case reflect.Uint32: - if num < 0 || unum > math.MaxUint32 { - return e("value %d is out of range for uint32", num) - } - } - rv.SetUint(unum) - } else { - panic("unreachable") - } - return nil - } - return badtype("integer", data) -} - -func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { - if b, ok := data.(bool); ok { - rv.SetBool(b) - return nil - } - return badtype("boolean", data) -} - -func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { - rv.Set(reflect.ValueOf(data)) - return nil -} - -func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { - var s string - switch sdata := data.(type) { - case TextMarshaler: - text, err := sdata.MarshalText() - if err != nil { - return err - } - s = string(text) - case fmt.Stringer: - s = sdata.String() - case string: - s = sdata - case bool: - s = fmt.Sprintf("%v", sdata) - case int64: - s = fmt.Sprintf("%d", sdata) - case float64: - s = fmt.Sprintf("%f", sdata) - default: - return badtype("primitive (string-like)", data) - } - if err := v.UnmarshalText([]byte(s)); err != nil { - return err - } - return nil -} - -// rvalue returns a reflect.Value of `v`. All pointers are resolved. -func rvalue(v interface{}) reflect.Value { - return indirect(reflect.ValueOf(v)) -} - -// indirect returns the value pointed to by a pointer. -// Pointers are followed until the value is not a pointer. -// New values are allocated for each nil pointer. -// -// An exception to this rule is if the value satisfies an interface of -// interest to us (like encoding.TextUnmarshaler). -func indirect(v reflect.Value) reflect.Value { - if v.Kind() != reflect.Ptr { - if v.CanSet() { - pv := v.Addr() - if _, ok := pv.Interface().(TextUnmarshaler); ok { - return pv - } - } - return v - } - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - return indirect(reflect.Indirect(v)) -} - -func isUnifiable(rv reflect.Value) bool { - if rv.CanSet() { - return true - } - if _, ok := rv.Interface().(TextUnmarshaler); ok { - return true - } - return false -} - -func badtype(expected string, data interface{}) error { - return e("cannot load TOML value of type %T into a Go %s", data, expected) -} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go deleted file mode 100644 index b9914a6..0000000 --- a/vendor/github.com/BurntSushi/toml/decode_meta.go +++ /dev/null @@ -1,121 +0,0 @@ -package toml - -import "strings" - -// MetaData allows access to meta information about TOML data that may not -// be inferrable via reflection. In particular, whether a key has been defined -// and the TOML type of a key. -type MetaData struct { - mapping map[string]interface{} - types map[string]tomlType - keys []Key - decoded map[string]bool - context Key // Used only during decoding. -} - -// IsDefined returns true if the key given exists in the TOML data. The key -// should be specified hierarchially. e.g., -// -// // access the TOML key 'a.b.c' -// IsDefined("a", "b", "c") -// -// IsDefined will return false if an empty key given. Keys are case sensitive. -func (md *MetaData) IsDefined(key ...string) bool { - if len(key) == 0 { - return false - } - - var hash map[string]interface{} - var ok bool - var hashOrVal interface{} = md.mapping - for _, k := range key { - if hash, ok = hashOrVal.(map[string]interface{}); !ok { - return false - } - if hashOrVal, ok = hash[k]; !ok { - return false - } - } - return true -} - -// Type returns a string representation of the type of the key specified. -// -// Type will return the empty string if given an empty key or a key that -// does not exist. Keys are case sensitive. -func (md *MetaData) Type(key ...string) string { - fullkey := strings.Join(key, ".") - if typ, ok := md.types[fullkey]; ok { - return typ.typeString() - } - return "" -} - -// Key is the type of any TOML key, including key groups. Use (MetaData).Keys -// to get values of this type. -type Key []string - -func (k Key) String() string { - return strings.Join(k, ".") -} - -func (k Key) maybeQuotedAll() string { - var ss []string - for i := range k { - ss = append(ss, k.maybeQuoted(i)) - } - return strings.Join(ss, ".") -} - -func (k Key) maybeQuoted(i int) string { - quote := false - for _, c := range k[i] { - if !isBareKeyChar(c) { - quote = true - break - } - } - if quote { - return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" - } - return k[i] -} - -func (k Key) add(piece string) Key { - newKey := make(Key, len(k)+1) - copy(newKey, k) - newKey[len(k)] = piece - return newKey -} - -// Keys returns a slice of every key in the TOML data, including key groups. -// Each key is itself a slice, where the first element is the top of the -// hierarchy and the last is the most specific. -// -// The list will have the same order as the keys appeared in the TOML data. -// -// All keys returned are non-empty. -func (md *MetaData) Keys() []Key { - return md.keys -} - -// Undecoded returns all keys that have not been decoded in the order in which -// they appear in the original TOML document. -// -// This includes keys that haven't been decoded because of a Primitive value. -// Once the Primitive value is decoded, the keys will be considered decoded. -// -// Also note that decoding into an empty interface will result in no decoding, -// and so no keys will be considered decoded. -// -// In this sense, the Undecoded keys correspond to keys in the TOML document -// that do not have a concrete type in your representation. -func (md *MetaData) Undecoded() []Key { - undecoded := make([]Key, 0, len(md.keys)) - for _, key := range md.keys { - if !md.decoded[key.String()] { - undecoded = append(undecoded, key) - } - } - return undecoded -} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go deleted file mode 100644 index b371f39..0000000 --- a/vendor/github.com/BurntSushi/toml/doc.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Package toml provides facilities for decoding and encoding TOML configuration -files via reflection. There is also support for delaying decoding with -the Primitive type, and querying the set of keys in a TOML document with the -MetaData type. - -The specification implemented: https://github.com/toml-lang/toml - -The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify -whether a file is a valid TOML document. It can also be used to print the -type of each key in a TOML document. - -Testing - -There are two important types of tests used for this package. The first is -contained inside '*_test.go' files and uses the standard Go unit testing -framework. These tests are primarily devoted to holistically testing the -decoder and encoder. - -The second type of testing is used to verify the implementation's adherence -to the TOML specification. These tests have been factored into their own -project: https://github.com/BurntSushi/toml-test - -The reason the tests are in a separate project is so that they can be used by -any implementation of TOML. Namely, it is language agnostic. -*/ -package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go deleted file mode 100644 index d905c21..0000000 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ /dev/null @@ -1,568 +0,0 @@ -package toml - -import ( - "bufio" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - "time" -) - -type tomlEncodeError struct{ error } - -var ( - errArrayMixedElementTypes = errors.New( - "toml: cannot encode array with mixed element types") - errArrayNilElement = errors.New( - "toml: cannot encode array with nil element") - errNonString = errors.New( - "toml: cannot encode a map with non-string key type") - errAnonNonStruct = errors.New( - "toml: cannot encode an anonymous field that is not a struct") - errArrayNoTable = errors.New( - "toml: TOML array element cannot contain a table") - errNoKey = errors.New( - "toml: top-level values must be Go maps or structs") - errAnything = errors.New("") // used in testing -) - -var quotedReplacer = strings.NewReplacer( - "\t", "\\t", - "\n", "\\n", - "\r", "\\r", - "\"", "\\\"", - "\\", "\\\\", -) - -// Encoder controls the encoding of Go values to a TOML document to some -// io.Writer. -// -// The indentation level can be controlled with the Indent field. -type Encoder struct { - // A single indentation level. By default it is two spaces. - Indent string - - // hasWritten is whether we have written any output to w yet. - hasWritten bool - w *bufio.Writer -} - -// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer -// given. By default, a single indentation level is 2 spaces. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - w: bufio.NewWriter(w), - Indent: " ", - } -} - -// Encode writes a TOML representation of the Go value to the underlying -// io.Writer. If the value given cannot be encoded to a valid TOML document, -// then an error is returned. -// -// The mapping between Go values and TOML values should be precisely the same -// as for the Decode* functions. Similarly, the TextMarshaler interface is -// supported by encoding the resulting bytes as strings. (If you want to write -// arbitrary binary data then you will need to use something like base64 since -// TOML does not have any binary types.) -// -// When encoding TOML hashes (i.e., Go maps or structs), keys without any -// sub-hashes are encoded first. -// -// If a Go map is encoded, then its keys are sorted alphabetically for -// deterministic output. More control over this behavior may be provided if -// there is demand for it. -// -// Encoding Go values without a corresponding TOML representation---like map -// types with non-string keys---will cause an error to be returned. Similarly -// for mixed arrays/slices, arrays/slices with nil elements, embedded -// non-struct types and nested slices containing maps or structs. -// (e.g., [][]map[string]string is not allowed but []map[string]string is OK -// and so is []map[string][]string.) -func (enc *Encoder) Encode(v interface{}) error { - rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { - return err - } - return enc.w.Flush() -} - -func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { - defer func() { - if r := recover(); r != nil { - if terr, ok := r.(tomlEncodeError); ok { - err = terr.error - return - } - panic(r) - } - }() - enc.encode(key, rv) - return nil -} - -func (enc *Encoder) encode(key Key, rv reflect.Value) { - // Special case. Time needs to be in ISO8601 format. - // Special case. If we can marshal the type to text, then we used that. - // Basically, this prevents the encoder for handling these types as - // generic structs (or whatever the underlying type of a TextMarshaler is). - switch rv.Interface().(type) { - case time.Time, TextMarshaler: - enc.keyEqElement(key, rv) - return - } - - k := rv.Kind() - switch k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64, - reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: - enc.keyEqElement(key, rv) - case reflect.Array, reflect.Slice: - if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { - enc.eArrayOfTables(key, rv) - } else { - enc.keyEqElement(key, rv) - } - case reflect.Interface: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Map: - if rv.IsNil() { - return - } - enc.eTable(key, rv) - case reflect.Ptr: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Struct: - enc.eTable(key, rv) - default: - panic(e("unsupported type for key '%s': %s", key, k)) - } -} - -// eElement encodes any value that can be an array element (primitives and -// arrays). -func (enc *Encoder) eElement(rv reflect.Value) { - switch v := rv.Interface().(type) { - case time.Time: - // Special case time.Time as a primitive. Has to come before - // TextMarshaler below because time.Time implements - // encoding.TextMarshaler, but we need to always use UTC. - enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) - return - case TextMarshaler: - // Special case. Use text marshaler if it's available for this value. - if s, err := v.MarshalText(); err != nil { - encPanic(err) - } else { - enc.writeQuoted(string(s)) - } - return - } - switch rv.Kind() { - case reflect.Bool: - enc.wf(strconv.FormatBool(rv.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64: - enc.wf(strconv.FormatInt(rv.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, - reflect.Uint32, reflect.Uint64: - enc.wf(strconv.FormatUint(rv.Uint(), 10)) - case reflect.Float32: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) - case reflect.Float64: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) - case reflect.Array, reflect.Slice: - enc.eArrayOrSliceElement(rv) - case reflect.Interface: - enc.eElement(rv.Elem()) - case reflect.String: - enc.writeQuoted(rv.String()) - default: - panic(e("unexpected primitive type: %s", rv.Kind())) - } -} - -// By the TOML spec, all floats must have a decimal with at least one -// number on either side. -func floatAddDecimal(fstr string) string { - if !strings.Contains(fstr, ".") { - return fstr + ".0" - } - return fstr -} - -func (enc *Encoder) writeQuoted(s string) { - enc.wf("\"%s\"", quotedReplacer.Replace(s)) -} - -func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { - length := rv.Len() - enc.wf("[") - for i := 0; i < length; i++ { - elem := rv.Index(i) - enc.eElement(elem) - if i != length-1 { - enc.wf(", ") - } - } - enc.wf("]") -} - -func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - for i := 0; i < rv.Len(); i++ { - trv := rv.Index(i) - if isNil(trv) { - continue - } - panicIfInvalidKey(key) - enc.newline() - enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - enc.eMapOrStruct(key, trv) - } -} - -func (enc *Encoder) eTable(key Key, rv reflect.Value) { - panicIfInvalidKey(key) - if len(key) == 1 { - // Output an extra newline between top-level tables. - // (The newline isn't written if nothing else has been written though.) - enc.newline() - } - if len(key) > 0 { - enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - } - enc.eMapOrStruct(key, rv) -} - -func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { - switch rv := eindirect(rv); rv.Kind() { - case reflect.Map: - enc.eMap(key, rv) - case reflect.Struct: - enc.eStruct(key, rv) - default: - panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) - } -} - -func (enc *Encoder) eMap(key Key, rv reflect.Value) { - rt := rv.Type() - if rt.Key().Kind() != reflect.String { - encPanic(errNonString) - } - - // Sort keys so that we have deterministic output. And write keys directly - // underneath this key first, before writing sub-structs or sub-maps. - var mapKeysDirect, mapKeysSub []string - for _, mapKey := range rv.MapKeys() { - k := mapKey.String() - if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { - mapKeysSub = append(mapKeysSub, k) - } else { - mapKeysDirect = append(mapKeysDirect, k) - } - } - - var writeMapKeys = func(mapKeys []string) { - sort.Strings(mapKeys) - for _, mapKey := range mapKeys { - mrv := rv.MapIndex(reflect.ValueOf(mapKey)) - if isNil(mrv) { - // Don't write anything for nil fields. - continue - } - enc.encode(key.add(mapKey), mrv) - } - } - writeMapKeys(mapKeysDirect) - writeMapKeys(mapKeysSub) -} - -func (enc *Encoder) eStruct(key Key, rv reflect.Value) { - // Write keys for fields directly under this key first, because if we write - // a field that creates a new table, then all keys under it will be in that - // table (not the one we're writing here). - rt := rv.Type() - var fieldsDirect, fieldsSub [][]int - var addFields func(rt reflect.Type, rv reflect.Value, start []int) - addFields = func(rt reflect.Type, rv reflect.Value, start []int) { - for i := 0; i < rt.NumField(); i++ { - f := rt.Field(i) - // skip unexported fields - if f.PkgPath != "" && !f.Anonymous { - continue - } - frv := rv.Field(i) - if f.Anonymous { - t := f.Type - switch t.Kind() { - case reflect.Struct: - // Treat anonymous struct fields with - // tag names as though they are not - // anonymous, like encoding/json does. - if getOptions(f.Tag).name == "" { - addFields(t, frv, f.Index) - continue - } - case reflect.Ptr: - if t.Elem().Kind() == reflect.Struct && - getOptions(f.Tag).name == "" { - if !frv.IsNil() { - addFields(t.Elem(), frv.Elem(), f.Index) - } - continue - } - // Fall through to the normal field encoding logic below - // for non-struct anonymous fields. - } - } - - if typeIsHash(tomlTypeOfGo(frv)) { - fieldsSub = append(fieldsSub, append(start, f.Index...)) - } else { - fieldsDirect = append(fieldsDirect, append(start, f.Index...)) - } - } - } - addFields(rt, rv, nil) - - var writeFields = func(fields [][]int) { - for _, fieldIndex := range fields { - sft := rt.FieldByIndex(fieldIndex) - sf := rv.FieldByIndex(fieldIndex) - if isNil(sf) { - // Don't write anything for nil fields. - continue - } - - opts := getOptions(sft.Tag) - if opts.skip { - continue - } - keyName := sft.Name - if opts.name != "" { - keyName = opts.name - } - if opts.omitempty && isEmpty(sf) { - continue - } - if opts.omitzero && isZero(sf) { - continue - } - - enc.encode(key.add(keyName), sf) - } - } - writeFields(fieldsDirect) - writeFields(fieldsSub) -} - -// tomlTypeName returns the TOML type name of the Go value's type. It is -// used to determine whether the types of array elements are mixed (which is -// forbidden). If the Go value is nil, then it is illegal for it to be an array -// element, and valueIsNil is returned as true. - -// Returns the TOML type of a Go value. The type may be `nil`, which means -// no concrete TOML type could be found. -func tomlTypeOfGo(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() { - return nil - } - switch rv.Kind() { - case reflect.Bool: - return tomlBool - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64: - return tomlInteger - case reflect.Float32, reflect.Float64: - return tomlFloat - case reflect.Array, reflect.Slice: - if typeEqual(tomlHash, tomlArrayType(rv)) { - return tomlArrayHash - } - return tomlArray - case reflect.Ptr, reflect.Interface: - return tomlTypeOfGo(rv.Elem()) - case reflect.String: - return tomlString - case reflect.Map: - return tomlHash - case reflect.Struct: - switch rv.Interface().(type) { - case time.Time: - return tomlDatetime - case TextMarshaler: - return tomlString - default: - return tomlHash - } - default: - panic("unexpected reflect.Kind: " + rv.Kind().String()) - } -} - -// tomlArrayType returns the element type of a TOML array. The type returned -// may be nil if it cannot be determined (e.g., a nil slice or a zero length -// slize). This function may also panic if it finds a type that cannot be -// expressed in TOML (such as nil elements, heterogeneous arrays or directly -// nested arrays of tables). -func tomlArrayType(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { - return nil - } - firstType := tomlTypeOfGo(rv.Index(0)) - if firstType == nil { - encPanic(errArrayNilElement) - } - - rvlen := rv.Len() - for i := 1; i < rvlen; i++ { - elem := rv.Index(i) - switch elemType := tomlTypeOfGo(elem); { - case elemType == nil: - encPanic(errArrayNilElement) - case !typeEqual(firstType, elemType): - encPanic(errArrayMixedElementTypes) - } - } - // If we have a nested array, then we must make sure that the nested - // array contains ONLY primitives. - // This checks arbitrarily nested arrays. - if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { - nest := tomlArrayType(eindirect(rv.Index(0))) - if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { - encPanic(errArrayNoTable) - } - } - return firstType -} - -type tagOptions struct { - skip bool // "-" - name string - omitempty bool - omitzero bool -} - -func getOptions(tag reflect.StructTag) tagOptions { - t := tag.Get("toml") - if t == "-" { - return tagOptions{skip: true} - } - var opts tagOptions - parts := strings.Split(t, ",") - opts.name = parts[0] - for _, s := range parts[1:] { - switch s { - case "omitempty": - opts.omitempty = true - case "omitzero": - opts.omitzero = true - } - } - return opts -} - -func isZero(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return rv.Uint() == 0 - case reflect.Float32, reflect.Float64: - return rv.Float() == 0.0 - } - return false -} - -func isEmpty(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Array, reflect.Slice, reflect.Map, reflect.String: - return rv.Len() == 0 - case reflect.Bool: - return !rv.Bool() - } - return false -} - -func (enc *Encoder) newline() { - if enc.hasWritten { - enc.wf("\n") - } -} - -func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - panicIfInvalidKey(key) - enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) - enc.eElement(val) - enc.newline() -} - -func (enc *Encoder) wf(format string, v ...interface{}) { - if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { - encPanic(err) - } - enc.hasWritten = true -} - -func (enc *Encoder) indentStr(key Key) string { - return strings.Repeat(enc.Indent, len(key)-1) -} - -func encPanic(err error) { - panic(tomlEncodeError{err}) -} - -func eindirect(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - return eindirect(v.Elem()) - default: - return v - } -} - -func isNil(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return rv.IsNil() - default: - return false - } -} - -func panicIfInvalidKey(key Key) { - for _, k := range key { - if len(k) == 0 { - encPanic(e("Key '%s' is not a valid table name. Key names "+ - "cannot be empty.", key.maybeQuotedAll())) - } - } -} - -func isValidKeyName(s string) bool { - return len(s) != 0 -} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go deleted file mode 100644 index d36e1dd..0000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.2 - -package toml - -// In order to support Go 1.1, we define our own TextMarshaler and -// TextUnmarshaler types. For Go 1.2+, we just alias them with the -// standard library interfaces. - -import ( - "encoding" -) - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler encoding.TextMarshaler - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go deleted file mode 100644 index e8d503d..0000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !go1.2 - -package toml - -// These interfaces were introduced in Go 1.2, so we add them manually when -// compiling for Go 1.1. - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler interface { - MarshalText() (text []byte, err error) -} - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go deleted file mode 100644 index e0a742a..0000000 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ /dev/null @@ -1,953 +0,0 @@ -package toml - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -type itemType int - -const ( - itemError itemType = iota - itemNIL // used in the parser to indicate no type - itemEOF - itemText - itemString - itemRawString - itemMultilineString - itemRawMultilineString - itemBool - itemInteger - itemFloat - itemDatetime - itemArray // the start of an array - itemArrayEnd - itemTableStart - itemTableEnd - itemArrayTableStart - itemArrayTableEnd - itemKeyStart - itemCommentStart - itemInlineTableStart - itemInlineTableEnd -) - -const ( - eof = 0 - comma = ',' - tableStart = '[' - tableEnd = ']' - arrayTableStart = '[' - arrayTableEnd = ']' - tableSep = '.' - keySep = '=' - arrayStart = '[' - arrayEnd = ']' - commentStart = '#' - stringStart = '"' - stringEnd = '"' - rawStringStart = '\'' - rawStringEnd = '\'' - inlineTableStart = '{' - inlineTableEnd = '}' -) - -type stateFn func(lx *lexer) stateFn - -type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item - - // Allow for backing up up to three runes. - // This is necessary because TOML contains 3-rune tokens (""" and '''). - prevWidths [3]int - nprev int // how many of prevWidths are in use - // If we emit an eof, we can still back up, but it is not OK to call - // next again. - atEOF bool - - // A stack of state functions used to maintain context. - // The idea is to reuse parts of the state machine in various places. - // For example, values can appear at the top level or within arbitrarily - // nested arrays. The last state on the stack is used after a value has - // been lexed. Similarly for comments. - stack []stateFn -} - -type item struct { - typ itemType - val string - line int -} - -func (lx *lexer) nextItem() item { - for { - select { - case item := <-lx.items: - return item - default: - lx.state = lx.state(lx) - } - } -} - -func lex(input string) *lexer { - lx := &lexer{ - input: input, - state: lexTop, - line: 1, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), - } - return lx -} - -func (lx *lexer) push(state stateFn) { - lx.stack = append(lx.stack, state) -} - -func (lx *lexer) pop() stateFn { - if len(lx.stack) == 0 { - return lx.errorf("BUG in lexer: no states to pop") - } - last := lx.stack[len(lx.stack)-1] - lx.stack = lx.stack[0 : len(lx.stack)-1] - return last -} - -func (lx *lexer) current() string { - return lx.input[lx.start:lx.pos] -} - -func (lx *lexer) emit(typ itemType) { - lx.items <- item{typ, lx.current(), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) emitTrim(typ itemType) { - lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) next() (r rune) { - if lx.atEOF { - panic("next called after EOF") - } - if lx.pos >= len(lx.input) { - lx.atEOF = true - return eof - } - - if lx.input[lx.pos] == '\n' { - lx.line++ - } - lx.prevWidths[2] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[0] - if lx.nprev < 3 { - lx.nprev++ - } - r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) - lx.prevWidths[0] = w - lx.pos += w - return r -} - -// ignore skips over the pending input before this point. -func (lx *lexer) ignore() { - lx.start = lx.pos -} - -// backup steps back one rune. Can be called only twice between calls to next. -func (lx *lexer) backup() { - if lx.atEOF { - lx.atEOF = false - return - } - if lx.nprev < 1 { - panic("backed up too far") - } - w := lx.prevWidths[0] - lx.prevWidths[0] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[2] - lx.nprev-- - lx.pos -= w - if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { - lx.line-- - } -} - -// accept consumes the next rune if it's equal to `valid`. -func (lx *lexer) accept(valid rune) bool { - if lx.next() == valid { - return true - } - lx.backup() - return false -} - -// peek returns but does not consume the next rune in the input. -func (lx *lexer) peek() rune { - r := lx.next() - lx.backup() - return r -} - -// skip ignores all input that matches the given predicate. -func (lx *lexer) skip(pred func(rune) bool) { - for { - r := lx.next() - if pred(r) { - continue - } - lx.backup() - lx.ignore() - return - } -} - -// errorf stops all lexing by emitting an error and returning `nil`. -// Note that any value that is a character is escaped if it's a special -// character (newlines, tabs, etc.). -func (lx *lexer) errorf(format string, values ...interface{}) stateFn { - lx.items <- item{ - itemError, - fmt.Sprintf(format, values...), - lx.line, - } - return nil -} - -// lexTop consumes elements at the top level of TOML data. -func lexTop(lx *lexer) stateFn { - r := lx.next() - if isWhitespace(r) || isNL(r) { - return lexSkip(lx, lexTop) - } - switch r { - case commentStart: - lx.push(lexTop) - return lexCommentStart - case tableStart: - return lexTableStart - case eof: - if lx.pos > lx.start { - return lx.errorf("unexpected EOF") - } - lx.emit(itemEOF) - return nil - } - - // At this point, the only valid item can be a key, so we back up - // and let the key lexer do the rest. - lx.backup() - lx.push(lexTopEnd) - return lexKeyStart -} - -// lexTopEnd is entered whenever a top-level item has been consumed. (A value -// or a table.) It must see only whitespace, and will turn back to lexTop -// upon a newline. If it sees EOF, it will quit the lexer successfully. -func lexTopEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case r == commentStart: - // a comment will read to a newline for us. - lx.push(lexTop) - return lexCommentStart - case isWhitespace(r): - return lexTopEnd - case isNL(r): - lx.ignore() - return lexTop - case r == eof: - lx.emit(itemEOF) - return nil - } - return lx.errorf("expected a top-level item to end with a newline, "+ - "comment, or EOF, but got %q instead", r) -} - -// lexTable lexes the beginning of a table. Namely, it makes sure that -// it starts with a character other than '.' and ']'. -// It assumes that '[' has already been consumed. -// It also handles the case that this is an item in an array of tables. -// e.g., '[[name]]'. -func lexTableStart(lx *lexer) stateFn { - if lx.peek() == arrayTableStart { - lx.next() - lx.emit(itemArrayTableStart) - lx.push(lexArrayTableEnd) - } else { - lx.emit(itemTableStart) - lx.push(lexTableEnd) - } - return lexTableNameStart -} - -func lexTableEnd(lx *lexer) stateFn { - lx.emit(itemTableEnd) - return lexTopEnd -} - -func lexArrayTableEnd(lx *lexer) stateFn { - if r := lx.next(); r != arrayTableEnd { - return lx.errorf("expected end of table array name delimiter %q, "+ - "but got %q instead", arrayTableEnd, r) - } - lx.emit(itemArrayTableEnd) - return lexTopEnd -} - -func lexTableNameStart(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.peek(); { - case r == tableEnd || r == eof: - return lx.errorf("unexpected end of table name " + - "(table names cannot be empty)") - case r == tableSep: - return lx.errorf("unexpected table separator " + - "(table names cannot be empty)") - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.push(lexTableNameEnd) - return lexValue // reuse string lexing - default: - return lexBareTableName - } -} - -// lexBareTableName lexes the name of a table. It assumes that at least one -// valid character for the table has already been read. -func lexBareTableName(lx *lexer) stateFn { - r := lx.next() - if isBareKeyChar(r) { - return lexBareTableName - } - lx.backup() - lx.emit(itemText) - return lexTableNameEnd -} - -// lexTableNameEnd reads the end of a piece of a table name, optionally -// consuming whitespace. -func lexTableNameEnd(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.next(); { - case isWhitespace(r): - return lexTableNameEnd - case r == tableSep: - lx.ignore() - return lexTableNameStart - case r == tableEnd: - return lx.pop() - default: - return lx.errorf("expected '.' or ']' to end table name, "+ - "but got %q instead", r) - } -} - -// lexKeyStart consumes a key name up until the first non-whitespace character. -// lexKeyStart will ignore whitespace. -func lexKeyStart(lx *lexer) stateFn { - r := lx.peek() - switch { - case r == keySep: - return lx.errorf("unexpected key separator %q", keySep) - case isWhitespace(r) || isNL(r): - lx.next() - return lexSkip(lx, lexKeyStart) - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.emit(itemKeyStart) - lx.push(lexKeyEnd) - return lexValue // reuse string lexing - default: - lx.ignore() - lx.emit(itemKeyStart) - return lexBareKey - } -} - -// lexBareKey consumes the text of a bare key. Assumes that the first character -// (which is not whitespace) has not yet been consumed. -func lexBareKey(lx *lexer) stateFn { - switch r := lx.next(); { - case isBareKeyChar(r): - return lexBareKey - case isWhitespace(r): - lx.backup() - lx.emit(itemText) - return lexKeyEnd - case r == keySep: - lx.backup() - lx.emit(itemText) - return lexKeyEnd - default: - return lx.errorf("bare keys cannot contain %q", r) - } -} - -// lexKeyEnd consumes the end of a key and trims whitespace (up to the key -// separator). -func lexKeyEnd(lx *lexer) stateFn { - switch r := lx.next(); { - case r == keySep: - return lexSkip(lx, lexValue) - case isWhitespace(r): - return lexSkip(lx, lexKeyEnd) - default: - return lx.errorf("expected key separator %q, but got %q instead", - keySep, r) - } -} - -// lexValue starts the consumption of a value anywhere a value is expected. -// lexValue will ignore whitespace. -// After a value is lexed, the last state on the next is popped and returned. -func lexValue(lx *lexer) stateFn { - // We allow whitespace to precede a value, but NOT newlines. - // In array syntax, the array states are responsible for ignoring newlines. - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexValue) - case isDigit(r): - lx.backup() // avoid an extra state and use the same as above - return lexNumberOrDateStart - } - switch r { - case arrayStart: - lx.ignore() - lx.emit(itemArray) - return lexArrayValue - case inlineTableStart: - lx.ignore() - lx.emit(itemInlineTableStart) - return lexInlineTableValue - case stringStart: - if lx.accept(stringStart) { - if lx.accept(stringStart) { - lx.ignore() // Ignore """ - return lexMultilineString - } - lx.backup() - } - lx.ignore() // ignore the '"' - return lexString - case rawStringStart: - if lx.accept(rawStringStart) { - if lx.accept(rawStringStart) { - lx.ignore() // Ignore """ - return lexMultilineRawString - } - lx.backup() - } - lx.ignore() // ignore the "'" - return lexRawString - case '+', '-': - return lexNumberStart - case '.': // special error case, be kind to users - return lx.errorf("floats must start with a digit, not '.'") - } - if unicode.IsLetter(r) { - // Be permissive here; lexBool will give a nice error if the - // user wrote something like - // x = foo - // (i.e. not 'true' or 'false' but is something else word-like.) - lx.backup() - return lexBool - } - return lx.errorf("expected value but found %q instead", r) -} - -// lexArrayValue consumes one value in an array. It assumes that '[' or ',' -// have already been consumed. All whitespace and newlines are ignored. -func lexArrayValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValue) - case r == commentStart: - lx.push(lexArrayValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == arrayEnd: - // NOTE(caleb): The spec isn't clear about whether you can have - // a trailing comma or not, so we'll allow it. - return lexArrayEnd - } - - lx.backup() - lx.push(lexArrayValueEnd) - return lexValue -} - -// lexArrayValueEnd consumes everything between the end of an array value and -// the next value (or the end of the array): it ignores whitespace and newlines -// and expects either a ',' or a ']'. -func lexArrayValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValueEnd) - case r == commentStart: - lx.push(lexArrayValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexArrayValue // move on to the next value - case r == arrayEnd: - return lexArrayEnd - } - return lx.errorf( - "expected a comma or array terminator %q, but got %q instead", - arrayEnd, r, - ) -} - -// lexArrayEnd finishes the lexing of an array. -// It assumes that a ']' has just been consumed. -func lexArrayEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemArrayEnd) - return lx.pop() -} - -// lexInlineTableValue consumes one key/value pair in an inline table. -// It assumes that '{' or ',' have already been consumed. Whitespace is ignored. -func lexInlineTableValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValue) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == inlineTableEnd: - return lexInlineTableEnd - } - lx.backup() - lx.push(lexInlineTableValueEnd) - return lexKeyStart -} - -// lexInlineTableValueEnd consumes everything between the end of an inline table -// key/value pair and the next pair (or the end of the table): -// it ignores whitespace and expects either a ',' or a '}'. -func lexInlineTableValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValueEnd) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexInlineTableValue - case r == inlineTableEnd: - return lexInlineTableEnd - } - return lx.errorf("expected a comma or an inline table terminator %q, "+ - "but got %q instead", inlineTableEnd, r) -} - -// lexInlineTableEnd finishes the lexing of an inline table. -// It assumes that a '}' has just been consumed. -func lexInlineTableEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemInlineTableEnd) - return lx.pop() -} - -// lexString consumes the inner contents of a string. It assumes that the -// beginning '"' has already been consumed and ignored. -func lexString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == '\\': - lx.push(lexString) - return lexStringEscape - case r == stringEnd: - lx.backup() - lx.emit(itemString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexString -} - -// lexMultilineString consumes the inner contents of a string. It assumes that -// the beginning '"""' has already been consumed and ignored. -func lexMultilineString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case '\\': - return lexMultilineStringEscape - case stringEnd: - if lx.accept(stringEnd) { - if lx.accept(stringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineString -} - -// lexRawString consumes a raw string. Nothing can be escaped in such a string. -// It assumes that the beginning "'" has already been consumed and ignored. -func lexRawString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == rawStringEnd: - lx.backup() - lx.emit(itemRawString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexRawString -} - -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning "'''" has already been consumed and -// ignored. -func lexMultilineRawString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case rawStringEnd: - if lx.accept(rawStringEnd) { - if lx.accept(rawStringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemRawMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineRawString -} - -// lexMultilineStringEscape consumes an escaped character. It assumes that the -// preceding '\\' has already been consumed. -func lexMultilineStringEscape(lx *lexer) stateFn { - // Handle the special case first: - if isNL(lx.next()) { - return lexMultilineString - } - lx.backup() - lx.push(lexMultilineString) - return lexStringEscape(lx) -} - -func lexStringEscape(lx *lexer) stateFn { - r := lx.next() - switch r { - case 'b': - fallthrough - case 't': - fallthrough - case 'n': - fallthrough - case 'f': - fallthrough - case 'r': - fallthrough - case '"': - fallthrough - case '\\': - return lx.pop() - case 'u': - return lexShortUnicodeEscape - case 'U': - return lexLongUnicodeEscape - } - return lx.errorf("invalid escape character %q; only the following "+ - "escape characters are allowed: "+ - `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) -} - -func lexShortUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 4; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected four hexadecimal digits after '\u', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -func lexLongUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 8; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected eight hexadecimal digits after '\U', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -// lexNumberOrDateStart consumes either an integer, a float, or datetime. -func lexNumberOrDateStart(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '_': - return lexNumber - case 'e', 'E': - return lexFloat - case '.': - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) -} - -// lexNumberOrDate consumes either an integer, float or datetime. -func lexNumberOrDate(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '-': - return lexDatetime - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexDatetime consumes a Datetime, to a first approximation. -// The parser validates that it matches one of the accepted formats. -func lexDatetime(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexDatetime - } - switch r { - case '-', 'T', ':', '.', 'Z', '+': - return lexDatetime - } - - lx.backup() - lx.emit(itemDatetime) - return lx.pop() -} - -// lexNumberStart consumes either an integer or a float. It assumes that a sign -// has already been read, but that *no* digits have been consumed. -// lexNumberStart will move to the appropriate integer or float states. -func lexNumberStart(lx *lexer) stateFn { - // We MUST see a digit. Even floats have to start with a digit. - r := lx.next() - if !isDigit(r) { - if r == '.' { - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) - } - return lexNumber -} - -// lexNumber consumes an integer or a float after seeing the first digit. -func lexNumber(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumber - } - switch r { - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexFloat consumes the elements of a float. It allows any sequence of -// float-like characters, so floats emitted by the lexer are only a first -// approximation and must be validated by the parser. -func lexFloat(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexFloat - } - switch r { - case '_', '.', '-', '+', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemFloat) - return lx.pop() -} - -// lexBool consumes a bool string: 'true' or 'false. -func lexBool(lx *lexer) stateFn { - var rs []rune - for { - r := lx.next() - if !unicode.IsLetter(r) { - lx.backup() - break - } - rs = append(rs, r) - } - s := string(rs) - switch s { - case "true", "false": - lx.emit(itemBool) - return lx.pop() - } - return lx.errorf("expected value but found %q instead", s) -} - -// lexCommentStart begins the lexing of a comment. It will emit -// itemCommentStart and consume no characters, passing control to lexComment. -func lexCommentStart(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemCommentStart) - return lexComment -} - -// lexComment lexes an entire comment. It assumes that '#' has been consumed. -// It will consume *up to* the first newline character, and pass control -// back to the last state on the stack. -func lexComment(lx *lexer) stateFn { - r := lx.peek() - if isNL(r) || r == eof { - lx.emit(itemText) - return lx.pop() - } - lx.next() - return lexComment -} - -// lexSkip ignores all slurped input and moves on to the next state. -func lexSkip(lx *lexer, nextState stateFn) stateFn { - return func(lx *lexer) stateFn { - lx.ignore() - return nextState - } -} - -// isWhitespace returns true if `r` is a whitespace character according -// to the spec. -func isWhitespace(r rune) bool { - return r == '\t' || r == ' ' -} - -func isNL(r rune) bool { - return r == '\n' || r == '\r' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -func isHexadecimal(r rune) bool { - return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') -} - -func isBareKeyChar(r rune) bool { - return (r >= 'A' && r <= 'Z') || - (r >= 'a' && r <= 'z') || - (r >= '0' && r <= '9') || - r == '_' || - r == '-' -} - -func (itype itemType) String() string { - switch itype { - case itemError: - return "Error" - case itemNIL: - return "NIL" - case itemEOF: - return "EOF" - case itemText: - return "Text" - case itemString, itemRawString, itemMultilineString, itemRawMultilineString: - return "String" - case itemBool: - return "Bool" - case itemInteger: - return "Integer" - case itemFloat: - return "Float" - case itemDatetime: - return "DateTime" - case itemTableStart: - return "TableStart" - case itemTableEnd: - return "TableEnd" - case itemKeyStart: - return "KeyStart" - case itemArray: - return "Array" - case itemArrayEnd: - return "ArrayEnd" - case itemCommentStart: - return "CommentStart" - } - panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) -} - -func (item item) String() string { - return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) -} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go deleted file mode 100644 index 50869ef..0000000 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ /dev/null @@ -1,592 +0,0 @@ -package toml - -import ( - "fmt" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -type parser struct { - mapping map[string]interface{} - types map[string]tomlType - lx *lexer - - // A list of keys in the order that they appear in the TOML data. - ordered []Key - - // the full key for the current hash in scope - context Key - - // the base key name for everything except hashes - currentKey string - - // rough approximation of line number - approxLine int - - // A map of 'key.group.names' to whether they were created implicitly. - implicits map[string]bool -} - -type parseError string - -func (pe parseError) Error() string { - return string(pe) -} - -func parse(data string) (p *parser, err error) { - defer func() { - if r := recover(); r != nil { - var ok bool - if err, ok = r.(parseError); ok { - return - } - panic(r) - } - }() - - p = &parser{ - mapping: make(map[string]interface{}), - types: make(map[string]tomlType), - lx: lex(data), - ordered: make([]Key, 0), - implicits: make(map[string]bool), - } - for { - item := p.next() - if item.typ == itemEOF { - break - } - p.topLevel(item) - } - - return p, nil -} - -func (p *parser) panicf(format string, v ...interface{}) { - msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", - p.approxLine, p.current(), fmt.Sprintf(format, v...)) - panic(parseError(msg)) -} - -func (p *parser) next() item { - it := p.lx.nextItem() - if it.typ == itemError { - p.panicf("%s", it.val) - } - return it -} - -func (p *parser) bug(format string, v ...interface{}) { - panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) -} - -func (p *parser) expect(typ itemType) item { - it := p.next() - p.assertEqual(typ, it.typ) - return it -} - -func (p *parser) assertEqual(expected, got itemType) { - if expected != got { - p.bug("Expected '%s' but got '%s'.", expected, got) - } -} - -func (p *parser) topLevel(item item) { - switch item.typ { - case itemCommentStart: - p.approxLine = item.line - p.expect(itemText) - case itemTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemTableEnd, kg.typ) - - p.establishContext(key, false) - p.setType("", tomlHash) - p.ordered = append(p.ordered, key) - case itemArrayTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemArrayTableEnd, kg.typ) - - p.establishContext(key, true) - p.setType("", tomlArrayHash) - p.ordered = append(p.ordered, key) - case itemKeyStart: - kname := p.next() - p.approxLine = kname.line - p.currentKey = p.keyString(kname) - - val, typ := p.value(p.next()) - p.setValue(p.currentKey, val) - p.setType(p.currentKey, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - p.currentKey = "" - default: - p.bug("Unexpected type at top level: %s", item.typ) - } -} - -// Gets a string for a key (or part of a key in a table name). -func (p *parser) keyString(it item) string { - switch it.typ { - case itemText: - return it.val - case itemString, itemMultilineString, - itemRawString, itemRawMultilineString: - s, _ := p.value(it) - return s.(string) - default: - p.bug("Unexpected key type: %s", it.typ) - panic("unreachable") - } -} - -// value translates an expected value from the lexer into a Go value wrapped -// as an empty interface. -func (p *parser) value(it item) (interface{}, tomlType) { - switch it.typ { - case itemString: - return p.replaceEscapes(it.val), p.typeOfPrimitive(it) - case itemMultilineString: - trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) - return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) - case itemRawString: - return it.val, p.typeOfPrimitive(it) - case itemRawMultilineString: - return stripFirstNewline(it.val), p.typeOfPrimitive(it) - case itemBool: - switch it.val { - case "true": - return true, p.typeOfPrimitive(it) - case "false": - return false, p.typeOfPrimitive(it) - } - p.bug("Expected boolean value, but got '%s'.", it.val) - case itemInteger: - if !numUnderscoresOK(it.val) { - p.panicf("Invalid integer %q: underscores must be surrounded by digits", - it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseInt(val, 10, 64) - if err != nil { - // Distinguish integer values. Normally, it'd be a bug if the lexer - // provides an invalid integer, but it's possible that the number is - // out of range of valid values (which the lexer cannot determine). - // So mark the former as a bug but the latter as a legitimate user - // error. - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Integer '%s' is out of the range of 64-bit "+ - "signed integers.", it.val) - } else { - p.bug("Expected integer value, but got '%s'.", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemFloat: - parts := strings.FieldsFunc(it.val, func(r rune) bool { - switch r { - case '.', 'e', 'E': - return true - } - return false - }) - for _, part := range parts { - if !numUnderscoresOK(part) { - p.panicf("Invalid float %q: underscores must be "+ - "surrounded by digits", it.val) - } - } - if !numPeriodsOK(it.val) { - // As a special case, numbers like '123.' or '1.e2', - // which are valid as far as Go/strconv are concerned, - // must be rejected because TOML says that a fractional - // part consists of '.' followed by 1+ digits. - p.panicf("Invalid float %q: '.' must be followed "+ - "by one or more digits", it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseFloat(val, 64) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Float '%s' is out of the range of 64-bit "+ - "IEEE-754 floating-point numbers.", it.val) - } else { - p.panicf("Invalid float value: %q", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemDatetime: - var t time.Time - var ok bool - var err error - for _, format := range []string{ - "2006-01-02T15:04:05Z07:00", - "2006-01-02T15:04:05", - "2006-01-02", - } { - t, err = time.ParseInLocation(format, it.val, time.Local) - if err == nil { - ok = true - break - } - } - if !ok { - p.panicf("Invalid TOML Datetime: %q.", it.val) - } - return t, p.typeOfPrimitive(it) - case itemArray: - array := make([]interface{}, 0) - types := make([]tomlType, 0) - - for it = p.next(); it.typ != itemArrayEnd; it = p.next() { - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - val, typ := p.value(it) - array = append(array, val) - types = append(types, typ) - } - return array, p.typeOfArray(types) - case itemInlineTableStart: - var ( - hash = make(map[string]interface{}) - outerContext = p.context - outerKey = p.currentKey - ) - - p.context = append(p.context, p.currentKey) - p.currentKey = "" - for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { - if it.typ != itemKeyStart { - p.bug("Expected key start but instead found %q, around line %d", - it.val, p.approxLine) - } - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - // retrieve key - k := p.next() - p.approxLine = k.line - kname := p.keyString(k) - - // retrieve value - p.currentKey = kname - val, typ := p.value(p.next()) - // make sure we keep metadata up to date - p.setType(kname, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - hash[kname] = val - } - p.context = outerContext - p.currentKey = outerKey - return hash, tomlHash - } - p.bug("Unexpected value type: %s", it.typ) - panic("unreachable") -} - -// numUnderscoresOK checks whether each underscore in s is surrounded by -// characters that are not underscores. -func numUnderscoresOK(s string) bool { - accept := false - for _, r := range s { - if r == '_' { - if !accept { - return false - } - accept = false - continue - } - accept = true - } - return accept -} - -// numPeriodsOK checks whether every period in s is followed by a digit. -func numPeriodsOK(s string) bool { - period := false - for _, r := range s { - if period && !isDigit(r) { - return false - } - period = r == '.' - } - return !period -} - -// establishContext sets the current context of the parser, -// where the context is either a hash or an array of hashes. Which one is -// set depends on the value of the `array` parameter. -// -// Establishing the context also makes sure that the key isn't a duplicate, and -// will create implicit hashes automatically. -func (p *parser) establishContext(key Key, array bool) { - var ok bool - - // Always start at the top level and drill down for our context. - hashContext := p.mapping - keyContext := make(Key, 0) - - // We only need implicit hashes for key[0:-1] - for _, k := range key[0 : len(key)-1] { - _, ok = hashContext[k] - keyContext = append(keyContext, k) - - // No key? Make an implicit hash and move on. - if !ok { - p.addImplicit(keyContext) - hashContext[k] = make(map[string]interface{}) - } - - // If the hash context is actually an array of tables, then set - // the hash context to the last element in that array. - // - // Otherwise, it better be a table, since this MUST be a key group (by - // virtue of it not being the last element in a key). - switch t := hashContext[k].(type) { - case []map[string]interface{}: - hashContext = t[len(t)-1] - case map[string]interface{}: - hashContext = t - default: - p.panicf("Key '%s' was already created as a hash.", keyContext) - } - } - - p.context = keyContext - if array { - // If this is the first element for this array, then allocate a new - // list of tables for it. - k := key[len(key)-1] - if _, ok := hashContext[k]; !ok { - hashContext[k] = make([]map[string]interface{}, 0, 5) - } - - // Add a new table. But make sure the key hasn't already been used - // for something else. - if hash, ok := hashContext[k].([]map[string]interface{}); ok { - hashContext[k] = append(hash, make(map[string]interface{})) - } else { - p.panicf("Key '%s' was already created and cannot be used as "+ - "an array.", keyContext) - } - } else { - p.setValue(key[len(key)-1], make(map[string]interface{})) - } - p.context = append(p.context, key[len(key)-1]) -} - -// setValue sets the given key to the given value in the current context. -// It will make sure that the key hasn't already been defined, account for -// implicit key groups. -func (p *parser) setValue(key string, value interface{}) { - var tmpHash interface{} - var ok bool - - hash := p.mapping - keyContext := make(Key, 0) - for _, k := range p.context { - keyContext = append(keyContext, k) - if tmpHash, ok = hash[k]; !ok { - p.bug("Context for key '%s' has not been established.", keyContext) - } - switch t := tmpHash.(type) { - case []map[string]interface{}: - // The context is a table of hashes. Pick the most recent table - // defined as the current hash. - hash = t[len(t)-1] - case map[string]interface{}: - hash = t - default: - p.bug("Expected hash to have type 'map[string]interface{}', but "+ - "it has '%T' instead.", tmpHash) - } - } - keyContext = append(keyContext, key) - - if _, ok := hash[key]; ok { - // Typically, if the given key has already been set, then we have - // to raise an error since duplicate keys are disallowed. However, - // it's possible that a key was previously defined implicitly. In this - // case, it is allowed to be redefined concretely. (See the - // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) - // - // But we have to make sure to stop marking it as an implicit. (So that - // another redefinition provokes an error.) - // - // Note that since it has already been defined (as a hash), we don't - // want to overwrite it. So our business is done. - if p.isImplicit(keyContext) { - p.removeImplicit(keyContext) - return - } - - // Otherwise, we have a concrete key trying to override a previous - // key, which is *always* wrong. - p.panicf("Key '%s' has already been defined.", keyContext) - } - hash[key] = value -} - -// setType sets the type of a particular value at a given key. -// It should be called immediately AFTER setValue. -// -// Note that if `key` is empty, then the type given will be applied to the -// current context (which is either a table or an array of tables). -func (p *parser) setType(key string, typ tomlType) { - keyContext := make(Key, 0, len(p.context)+1) - for _, k := range p.context { - keyContext = append(keyContext, k) - } - if len(key) > 0 { // allow type setting for hashes - keyContext = append(keyContext, key) - } - p.types[keyContext.String()] = typ -} - -// addImplicit sets the given Key as having been created implicitly. -func (p *parser) addImplicit(key Key) { - p.implicits[key.String()] = true -} - -// removeImplicit stops tagging the given key as having been implicitly -// created. -func (p *parser) removeImplicit(key Key) { - p.implicits[key.String()] = false -} - -// isImplicit returns true if the key group pointed to by the key was created -// implicitly. -func (p *parser) isImplicit(key Key) bool { - return p.implicits[key.String()] -} - -// current returns the full key name of the current context. -func (p *parser) current() string { - if len(p.currentKey) == 0 { - return p.context.String() - } - if len(p.context) == 0 { - return p.currentKey - } - return fmt.Sprintf("%s.%s", p.context, p.currentKey) -} - -func stripFirstNewline(s string) string { - if len(s) == 0 || s[0] != '\n' { - return s - } - return s[1:] -} - -func stripEscapedWhitespace(s string) string { - esc := strings.Split(s, "\\\n") - if len(esc) > 1 { - for i := 1; i < len(esc); i++ { - esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) - } - } - return strings.Join(esc, "") -} - -func (p *parser) replaceEscapes(str string) string { - var replaced []rune - s := []byte(str) - r := 0 - for r < len(s) { - if s[r] != '\\' { - c, size := utf8.DecodeRune(s[r:]) - r += size - replaced = append(replaced, c) - continue - } - r += 1 - if r >= len(s) { - p.bug("Escape sequence at end of string.") - return "" - } - switch s[r] { - default: - p.bug("Expected valid escape code after \\, but got %q.", s[r]) - return "" - case 'b': - replaced = append(replaced, rune(0x0008)) - r += 1 - case 't': - replaced = append(replaced, rune(0x0009)) - r += 1 - case 'n': - replaced = append(replaced, rune(0x000A)) - r += 1 - case 'f': - replaced = append(replaced, rune(0x000C)) - r += 1 - case 'r': - replaced = append(replaced, rune(0x000D)) - r += 1 - case '"': - replaced = append(replaced, rune(0x0022)) - r += 1 - case '\\': - replaced = append(replaced, rune(0x005C)) - r += 1 - case 'u': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+5). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) - replaced = append(replaced, escaped) - r += 5 - case 'U': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+9). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) - replaced = append(replaced, escaped) - r += 9 - } - } - return string(replaced) -} - -func (p *parser) asciiEscapeToUnicode(bs []byte) rune { - s := string(bs) - hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) - if err != nil { - p.bug("Could not parse '%s' as a hexadecimal number, but the "+ - "lexer claims it's OK: %s", s, err) - } - if !utf8.ValidRune(rune(hex)) { - p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) - } - return rune(hex) -} - -func isStringType(ty itemType) bool { - return ty == itemString || ty == itemMultilineString || - ty == itemRawString || ty == itemRawMultilineString -} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim deleted file mode 100644 index 562164b..0000000 --- a/vendor/github.com/BurntSushi/toml/session.vim +++ /dev/null @@ -1 +0,0 @@ -au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go deleted file mode 100644 index c73f8af..0000000 --- a/vendor/github.com/BurntSushi/toml/type_check.go +++ /dev/null @@ -1,91 +0,0 @@ -package toml - -// tomlType represents any Go type that corresponds to a TOML type. -// While the first draft of the TOML spec has a simplistic type system that -// probably doesn't need this level of sophistication, we seem to be militating -// toward adding real composite types. -type tomlType interface { - typeString() string -} - -// typeEqual accepts any two types and returns true if they are equal. -func typeEqual(t1, t2 tomlType) bool { - if t1 == nil || t2 == nil { - return false - } - return t1.typeString() == t2.typeString() -} - -func typeIsHash(t tomlType) bool { - return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) -} - -type tomlBaseType string - -func (btype tomlBaseType) typeString() string { - return string(btype) -} - -func (btype tomlBaseType) String() string { - return btype.typeString() -} - -var ( - tomlInteger tomlBaseType = "Integer" - tomlFloat tomlBaseType = "Float" - tomlDatetime tomlBaseType = "Datetime" - tomlString tomlBaseType = "String" - tomlBool tomlBaseType = "Bool" - tomlArray tomlBaseType = "Array" - tomlHash tomlBaseType = "Hash" - tomlArrayHash tomlBaseType = "ArrayHash" -) - -// typeOfPrimitive returns a tomlType of any primitive value in TOML. -// Primitive values are: Integer, Float, Datetime, String and Bool. -// -// Passing a lexer item other than the following will cause a BUG message -// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. -func (p *parser) typeOfPrimitive(lexItem item) tomlType { - switch lexItem.typ { - case itemInteger: - return tomlInteger - case itemFloat: - return tomlFloat - case itemDatetime: - return tomlDatetime - case itemString: - return tomlString - case itemMultilineString: - return tomlString - case itemRawString: - return tomlString - case itemRawMultilineString: - return tomlString - case itemBool: - return tomlBool - } - p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) - panic("unreachable") -} - -// typeOfArray returns a tomlType for an array given a list of types of its -// values. -// -// In the current spec, if an array is homogeneous, then its type is always -// "Array". If the array is not homogeneous, an error is generated. -func (p *parser) typeOfArray(types []tomlType) tomlType { - // Empty arrays are cool. - if len(types) == 0 { - return tomlArray - } - - theType := types[0] - for _, t := range types[1:] { - if !typeEqual(theType, t) { - p.panicf("Array contains values of type '%s' and '%s', but "+ - "arrays must be homogeneous.", theType, t) - } - } - return tomlArray -} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go deleted file mode 100644 index 608997c..0000000 --- a/vendor/github.com/BurntSushi/toml/type_fields.go +++ /dev/null @@ -1,242 +0,0 @@ -package toml - -// Struct field handling is adapted from code in encoding/json: -// -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the Go distribution. - -import ( - "reflect" - "sort" - "sync" -) - -// A field represents a single field found in a struct. -type field struct { - name string // the name of the field (`toml` tag included) - tag bool // whether field has a `toml` tag - index []int // represents the depth of an anonymous field - typ reflect.Type // the type of the field -} - -// byName sorts field by name, breaking ties with depth, -// then breaking ties with "name came from toml tag", then -// breaking ties with index sequence. -type byName []field - -func (x byName) Len() int { return len(x) } - -func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byName) Less(i, j int) bool { - if x[i].name != x[j].name { - return x[i].name < x[j].name - } - if len(x[i].index) != len(x[j].index) { - return len(x[i].index) < len(x[j].index) - } - if x[i].tag != x[j].tag { - return x[i].tag - } - return byIndex(x).Less(i, j) -} - -// byIndex sorts field by index sequence. -type byIndex []field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - for k, xik := range x[i].index { - if k >= len(x[j].index) { - return false - } - if xik != x[j].index[k] { - return xik < x[j].index[k] - } - } - return len(x[i].index) < len(x[j].index) -} - -// typeFields returns a list of fields that TOML should recognize for the given -// type. The algorithm is breadth-first search over the set of structs to -// include - the top struct and then any reachable anonymous structs. -func typeFields(t reflect.Type) []field { - // Anonymous fields to explore at the current level and the next. - current := []field{} - next := []field{{typ: t}} - - // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} - - // Types already visited at an earlier level. - visited := map[reflect.Type]bool{} - - // Fields found. - var fields []field - - for len(next) > 0 { - current, next = next, current[:0] - count, nextCount = nextCount, map[reflect.Type]int{} - - for _, f := range current { - if visited[f.typ] { - continue - } - visited[f.typ] = true - - // Scan f.typ for fields to include. - for i := 0; i < f.typ.NumField(); i++ { - sf := f.typ.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - opts := getOptions(sf.Tag) - if opts.skip { - continue - } - index := make([]int, len(f.index)+1) - copy(index, f.index) - index[len(f.index)] = i - - ft := sf.Type - if ft.Name() == "" && ft.Kind() == reflect.Ptr { - // Follow pointer. - ft = ft.Elem() - } - - // Record found field and index sequence. - if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { - tagged := opts.name != "" - name := opts.name - if name == "" { - name = sf.Name - } - fields = append(fields, field{name, tagged, index, ft}) - if count[f.typ] > 1 { - // If there were multiple instances, add a second, - // so that the annihilation code will see a duplicate. - // It only cares about the distinction between 1 or 2, - // so don't bother generating any more copies. - fields = append(fields, fields[len(fields)-1]) - } - continue - } - - // Record new anonymous struct to explore in next round. - nextCount[ft]++ - if nextCount[ft] == 1 { - f := field{name: ft.Name(), index: index, typ: ft} - next = append(next, f) - } - } - } - } - - sort.Sort(byName(fields)) - - // Delete all fields that are hidden by the Go rules for embedded fields, - // except that fields with TOML tags are promoted. - - // The fields are sorted in primary order of name, secondary order - // of field index length. Loop over names; for each name, delete - // hidden fields by choosing the one dominant field that survives. - out := fields[:0] - for advance, i := 0, 0; i < len(fields); i += advance { - // One iteration per name. - // Find the sequence of fields with the name of this first field. - fi := fields[i] - name := fi.name - for advance = 1; i+advance < len(fields); advance++ { - fj := fields[i+advance] - if fj.name != name { - break - } - } - if advance == 1 { // Only one field with this name - out = append(out, fi) - continue - } - dominant, ok := dominantField(fields[i : i+advance]) - if ok { - out = append(out, dominant) - } - } - - fields = out - sort.Sort(byIndex(fields)) - - return fields -} - -// dominantField looks through the fields, all of which are known to -// have the same name, to find the single field that dominates the -// others using Go's embedding rules, modified by the presence of -// TOML tags. If there are multiple top-level fields, the boolean -// will be false: This condition is an error in Go and we skip all -// the fields. -func dominantField(fields []field) (field, bool) { - // The fields are sorted in increasing index-length order. The winner - // must therefore be one with the shortest index length. Drop all - // longer entries, which is easy: just truncate the slice. - length := len(fields[0].index) - tagged := -1 // Index of first tagged field. - for i, f := range fields { - if len(f.index) > length { - fields = fields[:i] - break - } - if f.tag { - if tagged >= 0 { - // Multiple tagged fields at the same level: conflict. - // Return no field. - return field{}, false - } - tagged = i - } - } - if tagged >= 0 { - return fields[tagged], true - } - // All remaining fields have the same length. If there's more than one, - // we have a conflict (two fields named "X" at the same level) and we - // return no field. - if len(fields) > 1 { - return field{}, false - } - return fields[0], true -} - -var fieldCache struct { - sync.RWMutex - m map[reflect.Type][]field -} - -// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -func cachedTypeFields(t reflect.Type) []field { - fieldCache.RLock() - f := fieldCache.m[t] - fieldCache.RUnlock() - if f != nil { - return f - } - - // Compute fields without lock. - // Might duplicate effort but won't hold other computations back. - f = typeFields(t) - if f == nil { - f = []field{} - } - - fieldCache.Lock() - if fieldCache.m == nil { - fieldCache.m = map[reflect.Type][]field{} - } - fieldCache.m[t] = f - fieldCache.Unlock() - return f -} diff --git a/vendor/github.com/Masterminds/semver/.travis.yml b/vendor/github.com/Masterminds/semver/.travis.yml index 3d9ebad..096369d 100644 --- a/vendor/github.com/Masterminds/semver/.travis.yml +++ b/vendor/github.com/Masterminds/semver/.travis.yml @@ -6,6 +6,8 @@ go: - 1.8.x - 1.9.x - 1.10.x + - 1.11.x + - 1.12.x - tip # Setting sudo access to false will let Travis CI use containers rather than diff --git a/vendor/github.com/Masterminds/semver/CHANGELOG.md b/vendor/github.com/Masterminds/semver/CHANGELOG.md index b888e20..e405c9a 100644 --- a/vendor/github.com/Masterminds/semver/CHANGELOG.md +++ b/vendor/github.com/Masterminds/semver/CHANGELOG.md @@ -1,3 +1,26 @@ +# 1.5.0 (2019-09-11) + +## Added + +- #103: Add basic fuzzing for `NewVersion()` (thanks @jesse-c) + +## Changed + +- #82: Clarify wildcard meaning in range constraints and update tests for it (thanks @greysteil) +- #83: Clarify caret operator range for pre-1.0.0 dependencies (thanks @greysteil) +- #72: Adding docs comment pointing to vert for a cli +- #71: Update the docs on pre-release comparator handling +- #89: Test with new go versions (thanks @thedevsaddam) +- #87: Added $ to ValidPrerelease for better validation (thanks @jeremycarroll) + +## Fixed + +- #78: Fix unchecked error in example code (thanks @ravron) +- #70: Fix the handling of pre-releases and the 0.0.0 release edge case +- #97: Fixed copyright file for proper display on GitHub +- #107: Fix handling prerelease when sorting alphanum and num +- #109: Fixed where Validate sometimes returns wrong message on error + # 1.4.2 (2018-04-10) ## Changed diff --git a/vendor/github.com/Masterminds/semver/LICENSE.txt b/vendor/github.com/Masterminds/semver/LICENSE.txt index 0da4aea..9ff7da9 100644 --- a/vendor/github.com/Masterminds/semver/LICENSE.txt +++ b/vendor/github.com/Masterminds/semver/LICENSE.txt @@ -1,5 +1,4 @@ -The Masterminds -Copyright (C) 2014-2015, Matt Butcher and Matt Farina +Copyright (C) 2014-2019, Matt Butcher and Matt Farina Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/Masterminds/semver/README.md b/vendor/github.com/Masterminds/semver/README.md index 3e934ed..1b52d2f 100644 --- a/vendor/github.com/Masterminds/semver/README.md +++ b/vendor/github.com/Masterminds/semver/README.md @@ -11,6 +11,9 @@ The `semver` package provides the ability to work with [Semantic Versions](http: Active](https://masterminds.github.io/stability/active.svg)](https://masterminds.github.io/stability/active.html) [![Build Status](https://travis-ci.org/Masterminds/semver.svg)](https://travis-ci.org/Masterminds/semver) [![Build status](https://ci.appveyor.com/api/projects/status/jfk66lib7hb985k8/branch/master?svg=true&passingText=windows%20build%20passing&failingText=windows%20build%20failing)](https://ci.appveyor.com/project/mattfarina/semver/branch/master) [![GoDoc](https://godoc.org/github.com/Masterminds/semver?status.svg)](https://godoc.org/github.com/Masterminds/semver) [![Go Report Card](https://goreportcard.com/badge/github.com/Masterminds/semver)](https://goreportcard.com/report/github.com/Masterminds/semver) +If you are looking for a command line tool for version comparisons please see +[vert](https://github.com/Masterminds/vert) which uses this library. + ## Parsing Semantic Versions To parse a semantic version use the `NewVersion` function. For example, @@ -80,14 +83,32 @@ The basic comparisons are: * `>=`: greater than or equal to * `<=`: less than or equal to -_Note, according to the Semantic Version specification pre-releases may not be -API compliant with their release counterpart. It says,_ +## Working With Pre-release Versions + +Pre-releases, for those not familiar with them, are used for software releases +prior to stable or generally available releases. Examples of pre-releases include +development, alpha, beta, and release candidate releases. A pre-release may be +a version such as `1.2.3-beta.1` while the stable release would be `1.2.3`. In the +order of precidence, pre-releases come before their associated releases. In this +example `1.2.3-beta.1 < 1.2.3`. + +According to the Semantic Version specification pre-releases may not be +API compliant with their release counterpart. It says, + +> A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version. -> _A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version._ +SemVer comparisons without a pre-release comparator will skip pre-release versions. +For example, `>=1.2.3` will skip pre-releases when looking at a list of releases +while `>=1.2.3-0` will evaluate and find pre-releases. -_SemVer comparisons without a pre-release value will skip pre-release versions. -For example, `>1.2.3` will skip pre-releases when looking at a list of values -while `>1.2.3-alpha.1` will evaluate pre-releases._ +The reason for the `0` as a pre-release version in the example comparison is +because pre-releases can only contain ASCII alphanumerics and hyphens (along with +`.` separators), per the spec. Sorting happens in ASCII sort order, again per the spec. The lowest character is a `0` in ASCII sort order (see an [ASCII Table](http://www.asciitable.com/)) + +Understanding ASCII sort ordering is important because A-Z comes before a-z. That +means `>=1.2.3-BETA` will return `1.2.3-alpha`. What you might expect from case +sensitivity doesn't apply here. This is due to ASCII sort ordering which is what +the spec specifies. ## Hyphen Range Comparisons @@ -105,7 +126,7 @@ back to the pack level comparison (see tilde below). For example, * `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` * `>= 1.2.x` is equivalent to `>= 1.2.0` -* `<= 2.x` is equivalent to `<= 3` +* `<= 2.x` is equivalent to `< 3` * `*` is equivalent to `>= 0.0.0` ## Tilde Range Comparisons (Patch) @@ -126,6 +147,7 @@ The caret (`^`) comparison operator is for major level changes. This is useful when comparisons of API versions as a major change is API breaking. For example, * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` +* `^0.0.1` is equivalent to `>= 0.0.1, < 1.0.0` * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` * `^2.3` is equivalent to `>= 2.3, < 3` * `^2.x` is equivalent to `>= 2.0.0, < 3` @@ -159,6 +181,13 @@ version didn't meet the constraint is returned. For example, } ``` +# Fuzzing + + [dvyukov/go-fuzz](https://github.com/dvyukov/go-fuzz) is used for fuzzing. + +1. `go-fuzz-build` +2. `go-fuzz -workdir=fuzz` + # Contribute If you find an issue or want to contribute please file an [issue](https://github.com/Masterminds/semver/issues) diff --git a/vendor/github.com/Masterminds/semver/constraints.go b/vendor/github.com/Masterminds/semver/constraints.go index a41a6a7..b94b934 100644 --- a/vendor/github.com/Masterminds/semver/constraints.go +++ b/vendor/github.com/Masterminds/semver/constraints.go @@ -65,13 +65,30 @@ func (cs Constraints) Check(v *Version) bool { func (cs Constraints) Validate(v *Version) (bool, []error) { // loop over the ORs and check the inner ANDs var e []error + + // Capture the prerelease message only once. When it happens the first time + // this var is marked + var prerelesase bool for _, o := range cs.constraints { joy := true for _, c := range o { - if !c.check(v) { - em := fmt.Errorf(c.msg, v, c.orig) - e = append(e, em) + // Before running the check handle the case there the version is + // a prerelease and the check is not searching for prereleases. + if c.con.pre == "" && v.pre != "" { + if !prerelesase { + em := fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + e = append(e, em) + prerelesase = true + } joy = false + + } else { + + if !c.check(v) { + em := fmt.Errorf(c.msg, v, c.orig) + e = append(e, em) + joy = false + } } } @@ -233,12 +250,6 @@ func constraintNotEqual(v *Version, c *constraint) bool { func constraintGreaterThan(v *Version, c *constraint) bool { - // An edge case the constraint is 0.0.0 and the version is 0.0.0-someprerelease - // exists. This that case. - if !isNonZero(c.con) && isNonZero(v) { - return true - } - // If there is a pre-release on the version but the constraint isn't looking // for them assume that pre-releases are not compatible. See issue 21 for // more details. @@ -271,11 +282,6 @@ func constraintLessThan(v *Version, c *constraint) bool { } func constraintGreaterThanEqual(v *Version, c *constraint) bool { - // An edge case the constraint is 0.0.0 and the version is 0.0.0-someprerelease - // exists. This that case. - if !isNonZero(c.con) && isNonZero(v) { - return true - } // If there is a pre-release on the version but the constraint isn't looking // for them assume that pre-releases are not compatible. See issue 21 for @@ -415,12 +421,3 @@ func rewriteRange(i string) string { return o } - -// Detect if a version is not zero (0.0.0) -func isNonZero(v *Version) bool { - if v.Major() != 0 || v.Minor() != 0 || v.Patch() != 0 || v.Prerelease() != "" { - return true - } - - return false -} diff --git a/vendor/github.com/Masterminds/semver/doc.go b/vendor/github.com/Masterminds/semver/doc.go index e00f65e..6a6c24c 100644 --- a/vendor/github.com/Masterminds/semver/doc.go +++ b/vendor/github.com/Masterminds/semver/doc.go @@ -47,7 +47,7 @@ parts of the package. // Handle constraint not being parseable. } - v, _ := semver.NewVersion("1.3") + v, err := semver.NewVersion("1.3") if err != nil { // Handle version not being parseable. } diff --git a/vendor/github.com/Masterminds/semver/version.go b/vendor/github.com/Masterminds/semver/version.go index 9d22ea6..400d4f9 100644 --- a/vendor/github.com/Masterminds/semver/version.go +++ b/vendor/github.com/Masterminds/semver/version.go @@ -34,7 +34,7 @@ const SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` + // ValidPrerelease is the regular expression which validates // both prerelease and metadata values. -const ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)` +const ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)$` // Version represents a single semantic version. type Version struct { @@ -106,7 +106,7 @@ func MustParse(v string) *Version { // Note, if the original version contained a leading v this version will not. // See the Original() method to retrieve the original value. Semantic Versions // don't contain a leading v per the spec. Instead it's optional on -// impelementation. +// implementation. func (v *Version) String() string { var buf bytes.Buffer @@ -394,10 +394,14 @@ func comparePrePart(s, o string) int { } // When comparing strings "99" is greater than "103". To handle - // cases like this we need to detect numbers and compare them. - - oi, n1 := strconv.ParseInt(o, 10, 64) - si, n2 := strconv.ParseInt(s, 10, 64) + // cases like this we need to detect numbers and compare them. According + // to the semver spec, numbers are always positive. If there is a - at the + // start like -99 this is to be evaluated as an alphanum. numbers always + // have precedence over alphanum. Parsing as Uints because negative numbers + // are ignored. + + oi, n1 := strconv.ParseUint(o, 10, 64) + si, n2 := strconv.ParseUint(s, 10, 64) // The case where both are strings compare the strings if n1 != nil && n2 != nil { diff --git a/vendor/github.com/Masterminds/semver/version_fuzz.go b/vendor/github.com/Masterminds/semver/version_fuzz.go new file mode 100644 index 0000000..b42bcd6 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/version_fuzz.go @@ -0,0 +1,10 @@ +// +build gofuzz + +package semver + +func Fuzz(data []byte) int { + if _, err := NewVersion(string(data)); err != nil { + return 0 + } + return 1 +} diff --git a/vendor/github.com/codahale/hdrhistogram/.travis.yml b/vendor/github.com/codahale/hdrhistogram/.travis.yml deleted file mode 100644 index 7960fc9..0000000 --- a/vendor/github.com/codahale/hdrhistogram/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: go -go: - - 1.5 - - 1.6 - - tip diff --git a/vendor/github.com/codahale/hdrhistogram/README.md b/vendor/github.com/codahale/hdrhistogram/README.md deleted file mode 100644 index 614b197..0000000 --- a/vendor/github.com/codahale/hdrhistogram/README.md +++ /dev/null @@ -1,15 +0,0 @@ -hdrhistogram -============ - -[![Build Status](https://travis-ci.org/codahale/hdrhistogram.png?branch=master)](https://travis-ci.org/codahale/hdrhistogram) - -A pure Go implementation of the [HDR Histogram](https://github.com/HdrHistogram/HdrHistogram). - -> A Histogram that supports recording and analyzing sampled data value counts -> across a configurable integer value range with configurable value precision -> within the range. Value precision is expressed as the number of significant -> digits in the value recording, and provides control over value quantization -> behavior across the value range and the subsequent value resolution at any -> given level. - -For documentation, check [godoc](http://godoc.org/github.com/codahale/hdrhistogram). diff --git a/vendor/github.com/codahale/hdrhistogram/hdr.go b/vendor/github.com/codahale/hdrhistogram/hdr.go deleted file mode 100644 index c978429..0000000 --- a/vendor/github.com/codahale/hdrhistogram/hdr.go +++ /dev/null @@ -1,564 +0,0 @@ -// Package hdrhistogram provides an implementation of Gil Tene's HDR Histogram -// data structure. The HDR Histogram allows for fast and accurate analysis of -// the extreme ranges of data with non-normal distributions, like latency. -package hdrhistogram - -import ( - "fmt" - "math" -) - -// A Bracket is a part of a cumulative distribution. -type Bracket struct { - Quantile float64 - Count, ValueAt int64 -} - -// A Snapshot is an exported view of a Histogram, useful for serializing them. -// A Histogram can be constructed from it by passing it to Import. -type Snapshot struct { - LowestTrackableValue int64 - HighestTrackableValue int64 - SignificantFigures int64 - Counts []int64 -} - -// A Histogram is a lossy data structure used to record the distribution of -// non-normally distributed data (like latency) with a high degree of accuracy -// and a bounded degree of precision. -type Histogram struct { - lowestTrackableValue int64 - highestTrackableValue int64 - unitMagnitude int64 - significantFigures int64 - subBucketHalfCountMagnitude int32 - subBucketHalfCount int32 - subBucketMask int64 - subBucketCount int32 - bucketCount int32 - countsLen int32 - totalCount int64 - counts []int64 -} - -// New returns a new Histogram instance capable of tracking values in the given -// range and with the given amount of precision. -func New(minValue, maxValue int64, sigfigs int) *Histogram { - if sigfigs < 1 || 5 < sigfigs { - panic(fmt.Errorf("sigfigs must be [1,5] (was %d)", sigfigs)) - } - - largestValueWithSingleUnitResolution := 2 * math.Pow10(sigfigs) - subBucketCountMagnitude := int32(math.Ceil(math.Log2(float64(largestValueWithSingleUnitResolution)))) - - subBucketHalfCountMagnitude := subBucketCountMagnitude - if subBucketHalfCountMagnitude < 1 { - subBucketHalfCountMagnitude = 1 - } - subBucketHalfCountMagnitude-- - - unitMagnitude := int32(math.Floor(math.Log2(float64(minValue)))) - if unitMagnitude < 0 { - unitMagnitude = 0 - } - - subBucketCount := int32(math.Pow(2, float64(subBucketHalfCountMagnitude)+1)) - - subBucketHalfCount := subBucketCount / 2 - subBucketMask := int64(subBucketCount-1) << uint(unitMagnitude) - - // determine exponent range needed to support the trackable value with no - // overflow: - smallestUntrackableValue := int64(subBucketCount) << uint(unitMagnitude) - bucketsNeeded := int32(1) - for smallestUntrackableValue < maxValue { - smallestUntrackableValue <<= 1 - bucketsNeeded++ - } - - bucketCount := bucketsNeeded - countsLen := (bucketCount + 1) * (subBucketCount / 2) - - return &Histogram{ - lowestTrackableValue: minValue, - highestTrackableValue: maxValue, - unitMagnitude: int64(unitMagnitude), - significantFigures: int64(sigfigs), - subBucketHalfCountMagnitude: subBucketHalfCountMagnitude, - subBucketHalfCount: subBucketHalfCount, - subBucketMask: subBucketMask, - subBucketCount: subBucketCount, - bucketCount: bucketCount, - countsLen: countsLen, - totalCount: 0, - counts: make([]int64, countsLen), - } -} - -// ByteSize returns an estimate of the amount of memory allocated to the -// histogram in bytes. -// -// N.B.: This does not take into account the overhead for slices, which are -// small, constant, and specific to the compiler version. -func (h *Histogram) ByteSize() int { - return 6*8 + 5*4 + len(h.counts)*8 -} - -// Merge merges the data stored in the given histogram with the receiver, -// returning the number of recorded values which had to be dropped. -func (h *Histogram) Merge(from *Histogram) (dropped int64) { - i := from.rIterator() - for i.next() { - v := i.valueFromIdx - c := i.countAtIdx - - if h.RecordValues(v, c) != nil { - dropped += c - } - } - - return -} - -// TotalCount returns total number of values recorded. -func (h *Histogram) TotalCount() int64 { - return h.totalCount -} - -// Max returns the approximate maximum recorded value. -func (h *Histogram) Max() int64 { - var max int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - max = i.highestEquivalentValue - } - } - return h.highestEquivalentValue(max) -} - -// Min returns the approximate minimum recorded value. -func (h *Histogram) Min() int64 { - var min int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 && min == 0 { - min = i.highestEquivalentValue - break - } - } - return h.lowestEquivalentValue(min) -} - -// Mean returns the approximate arithmetic mean of the recorded values. -func (h *Histogram) Mean() float64 { - if h.totalCount == 0 { - return 0 - } - var total int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - total += i.countAtIdx * h.medianEquivalentValue(i.valueFromIdx) - } - } - return float64(total) / float64(h.totalCount) -} - -// StdDev returns the approximate standard deviation of the recorded values. -func (h *Histogram) StdDev() float64 { - if h.totalCount == 0 { - return 0 - } - - mean := h.Mean() - geometricDevTotal := 0.0 - - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - dev := float64(h.medianEquivalentValue(i.valueFromIdx)) - mean - geometricDevTotal += (dev * dev) * float64(i.countAtIdx) - } - } - - return math.Sqrt(geometricDevTotal / float64(h.totalCount)) -} - -// Reset deletes all recorded values and restores the histogram to its original -// state. -func (h *Histogram) Reset() { - h.totalCount = 0 - for i := range h.counts { - h.counts[i] = 0 - } -} - -// RecordValue records the given value, returning an error if the value is out -// of range. -func (h *Histogram) RecordValue(v int64) error { - return h.RecordValues(v, 1) -} - -// RecordCorrectedValue records the given value, correcting for stalls in the -// recording process. This only works for processes which are recording values -// at an expected interval (e.g., doing jitter analysis). Processes which are -// recording ad-hoc values (e.g., latency for incoming requests) can't take -// advantage of this. -func (h *Histogram) RecordCorrectedValue(v, expectedInterval int64) error { - if err := h.RecordValue(v); err != nil { - return err - } - - if expectedInterval <= 0 || v <= expectedInterval { - return nil - } - - missingValue := v - expectedInterval - for missingValue >= expectedInterval { - if err := h.RecordValue(missingValue); err != nil { - return err - } - missingValue -= expectedInterval - } - - return nil -} - -// RecordValues records n occurrences of the given value, returning an error if -// the value is out of range. -func (h *Histogram) RecordValues(v, n int64) error { - idx := h.countsIndexFor(v) - if idx < 0 || int(h.countsLen) <= idx { - return fmt.Errorf("value %d is too large to be recorded", v) - } - h.counts[idx] += n - h.totalCount += n - - return nil -} - -// ValueAtQuantile returns the recorded value at the given quantile (0..100). -func (h *Histogram) ValueAtQuantile(q float64) int64 { - if q > 100 { - q = 100 - } - - total := int64(0) - countAtPercentile := int64(((q / 100) * float64(h.totalCount)) + 0.5) - - i := h.iterator() - for i.next() { - total += i.countAtIdx - if total >= countAtPercentile { - return h.highestEquivalentValue(i.valueFromIdx) - } - } - - return 0 -} - -// CumulativeDistribution returns an ordered list of brackets of the -// distribution of recorded values. -func (h *Histogram) CumulativeDistribution() []Bracket { - var result []Bracket - - i := h.pIterator(1) - for i.next() { - result = append(result, Bracket{ - Quantile: i.percentile, - Count: i.countToIdx, - ValueAt: i.highestEquivalentValue, - }) - } - - return result -} - -// SignificantFigures returns the significant figures used to create the -// histogram -func (h *Histogram) SignificantFigures() int64 { - return h.significantFigures -} - -// LowestTrackableValue returns the lower bound on values that will be added -// to the histogram -func (h *Histogram) LowestTrackableValue() int64 { - return h.lowestTrackableValue -} - -// HighestTrackableValue returns the upper bound on values that will be added -// to the histogram -func (h *Histogram) HighestTrackableValue() int64 { - return h.highestTrackableValue -} - -// Histogram bar for plotting -type Bar struct { - From, To, Count int64 -} - -// Pretty print as csv for easy plotting -func (b Bar) String() string { - return fmt.Sprintf("%v, %v, %v\n", b.From, b.To, b.Count) -} - -// Distribution returns an ordered list of bars of the -// distribution of recorded values, counts can be normalized to a probability -func (h *Histogram) Distribution() (result []Bar) { - i := h.iterator() - for i.next() { - result = append(result, Bar{ - Count: i.countAtIdx, - From: h.lowestEquivalentValue(i.valueFromIdx), - To: i.highestEquivalentValue, - }) - } - - return result -} - -// Equals returns true if the two Histograms are equivalent, false if not. -func (h *Histogram) Equals(other *Histogram) bool { - switch { - case - h.lowestTrackableValue != other.lowestTrackableValue, - h.highestTrackableValue != other.highestTrackableValue, - h.unitMagnitude != other.unitMagnitude, - h.significantFigures != other.significantFigures, - h.subBucketHalfCountMagnitude != other.subBucketHalfCountMagnitude, - h.subBucketHalfCount != other.subBucketHalfCount, - h.subBucketMask != other.subBucketMask, - h.subBucketCount != other.subBucketCount, - h.bucketCount != other.bucketCount, - h.countsLen != other.countsLen, - h.totalCount != other.totalCount: - return false - default: - for i, c := range h.counts { - if c != other.counts[i] { - return false - } - } - } - return true -} - -// Export returns a snapshot view of the Histogram. This can be later passed to -// Import to construct a new Histogram with the same state. -func (h *Histogram) Export() *Snapshot { - return &Snapshot{ - LowestTrackableValue: h.lowestTrackableValue, - HighestTrackableValue: h.highestTrackableValue, - SignificantFigures: h.significantFigures, - Counts: append([]int64(nil), h.counts...), // copy - } -} - -// Import returns a new Histogram populated from the Snapshot data (which the -// caller must stop accessing). -func Import(s *Snapshot) *Histogram { - h := New(s.LowestTrackableValue, s.HighestTrackableValue, int(s.SignificantFigures)) - h.counts = s.Counts - totalCount := int64(0) - for i := int32(0); i < h.countsLen; i++ { - countAtIndex := h.counts[i] - if countAtIndex > 0 { - totalCount += countAtIndex - } - } - h.totalCount = totalCount - return h -} - -func (h *Histogram) iterator() *iterator { - return &iterator{ - h: h, - subBucketIdx: -1, - } -} - -func (h *Histogram) rIterator() *rIterator { - return &rIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - } -} - -func (h *Histogram) pIterator(ticksPerHalfDistance int32) *pIterator { - return &pIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - ticksPerHalfDistance: ticksPerHalfDistance, - } -} - -func (h *Histogram) sizeOfEquivalentValueRange(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - adjustedBucket := bucketIdx - if subBucketIdx >= h.subBucketCount { - adjustedBucket++ - } - return int64(1) << uint(h.unitMagnitude+int64(adjustedBucket)) -} - -func (h *Histogram) valueFromIndex(bucketIdx, subBucketIdx int32) int64 { - return int64(subBucketIdx) << uint(int64(bucketIdx)+h.unitMagnitude) -} - -func (h *Histogram) lowestEquivalentValue(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return h.valueFromIndex(bucketIdx, subBucketIdx) -} - -func (h *Histogram) nextNonEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + h.sizeOfEquivalentValueRange(v) -} - -func (h *Histogram) highestEquivalentValue(v int64) int64 { - return h.nextNonEquivalentValue(v) - 1 -} - -func (h *Histogram) medianEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + (h.sizeOfEquivalentValueRange(v) >> 1) -} - -func (h *Histogram) getCountAtIndex(bucketIdx, subBucketIdx int32) int64 { - return h.counts[h.countsIndex(bucketIdx, subBucketIdx)] -} - -func (h *Histogram) countsIndex(bucketIdx, subBucketIdx int32) int32 { - bucketBaseIdx := (bucketIdx + 1) << uint(h.subBucketHalfCountMagnitude) - offsetInBucket := subBucketIdx - h.subBucketHalfCount - return bucketBaseIdx + offsetInBucket -} - -func (h *Histogram) getBucketIndex(v int64) int32 { - pow2Ceiling := bitLen(v | h.subBucketMask) - return int32(pow2Ceiling - int64(h.unitMagnitude) - - int64(h.subBucketHalfCountMagnitude+1)) -} - -func (h *Histogram) getSubBucketIdx(v int64, idx int32) int32 { - return int32(v >> uint(int64(idx)+int64(h.unitMagnitude))) -} - -func (h *Histogram) countsIndexFor(v int64) int { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return int(h.countsIndex(bucketIdx, subBucketIdx)) -} - -type iterator struct { - h *Histogram - bucketIdx, subBucketIdx int32 - countAtIdx, countToIdx, valueFromIdx int64 - highestEquivalentValue int64 -} - -func (i *iterator) next() bool { - if i.countToIdx >= i.h.totalCount { - return false - } - - // increment bucket - i.subBucketIdx++ - if i.subBucketIdx >= i.h.subBucketCount { - i.subBucketIdx = i.h.subBucketHalfCount - i.bucketIdx++ - } - - if i.bucketIdx >= i.h.bucketCount { - return false - } - - i.countAtIdx = i.h.getCountAtIndex(i.bucketIdx, i.subBucketIdx) - i.countToIdx += i.countAtIdx - i.valueFromIdx = i.h.valueFromIndex(i.bucketIdx, i.subBucketIdx) - i.highestEquivalentValue = i.h.highestEquivalentValue(i.valueFromIdx) - - return true -} - -type rIterator struct { - iterator - countAddedThisStep int64 -} - -func (r *rIterator) next() bool { - for r.iterator.next() { - if r.countAtIdx != 0 { - r.countAddedThisStep = r.countAtIdx - return true - } - } - return false -} - -type pIterator struct { - iterator - seenLastValue bool - ticksPerHalfDistance int32 - percentileToIteratorTo float64 - percentile float64 -} - -func (p *pIterator) next() bool { - if !(p.countToIdx < p.h.totalCount) { - if p.seenLastValue { - return false - } - - p.seenLastValue = true - p.percentile = 100 - - return true - } - - if p.subBucketIdx == -1 && !p.iterator.next() { - return false - } - - var done = false - for !done { - currentPercentile := (100.0 * float64(p.countToIdx)) / float64(p.h.totalCount) - if p.countAtIdx != 0 && p.percentileToIteratorTo <= currentPercentile { - p.percentile = p.percentileToIteratorTo - halfDistance := math.Trunc(math.Pow(2, math.Trunc(math.Log2(100.0/(100.0-p.percentileToIteratorTo)))+1)) - percentileReportingTicks := float64(p.ticksPerHalfDistance) * halfDistance - p.percentileToIteratorTo += 100.0 / percentileReportingTicks - return true - } - done = !p.iterator.next() - } - - return true -} - -func bitLen(x int64) (n int64) { - for ; x >= 0x8000; x >>= 16 { - n += 16 - } - if x >= 0x80 { - x >>= 8 - n += 8 - } - if x >= 0x8 { - x >>= 4 - n += 4 - } - if x >= 0x2 { - x >>= 2 - n += 2 - } - if x >= 0x1 { - n++ - } - return -} diff --git a/vendor/github.com/codahale/hdrhistogram/window.go b/vendor/github.com/codahale/hdrhistogram/window.go deleted file mode 100644 index dc43612..0000000 --- a/vendor/github.com/codahale/hdrhistogram/window.go +++ /dev/null @@ -1,45 +0,0 @@ -package hdrhistogram - -// A WindowedHistogram combines histograms to provide windowed statistics. -type WindowedHistogram struct { - idx int - h []Histogram - m *Histogram - - Current *Histogram -} - -// NewWindowed creates a new WindowedHistogram with N underlying histograms with -// the given parameters. -func NewWindowed(n int, minValue, maxValue int64, sigfigs int) *WindowedHistogram { - w := WindowedHistogram{ - idx: -1, - h: make([]Histogram, n), - m: New(minValue, maxValue, sigfigs), - } - - for i := range w.h { - w.h[i] = *New(minValue, maxValue, sigfigs) - } - w.Rotate() - - return &w -} - -// Merge returns a histogram which includes the recorded values from all the -// sections of the window. -func (w *WindowedHistogram) Merge() *Histogram { - w.m.Reset() - for _, h := range w.h { - w.m.Merge(&h) - } - return w.m -} - -// Rotate resets the oldest histogram and rotates it to be used as the current -// histogram. -func (w *WindowedHistogram) Rotate() { - w.idx++ - w.Current = &w.h[w.idx%len(w.h)] - w.Current.Reset() -} diff --git a/vendor/github.com/cznic/mathutil/AUTHORS b/vendor/github.com/cznic/mathutil/AUTHORS deleted file mode 100644 index c0a01b6..0000000 --- a/vendor/github.com/cznic/mathutil/AUTHORS +++ /dev/null @@ -1,13 +0,0 @@ -# This file lists authors for copyright purposes. This file is distinct from -# the CONTRIBUTORS files. See the latter for an explanation. -# -# Names should be added to this file as: -# Name or Organization -# -# The email address is not required for organizations. -# -# Please keep the list sorted. - -CZ.NIC z.s.p.o. -Edward Betts -Jan Mercl <0xjnml@gmail.com> diff --git a/vendor/github.com/cznic/mathutil/CONTRIBUTORS b/vendor/github.com/cznic/mathutil/CONTRIBUTORS deleted file mode 100644 index 8f2b983..0000000 --- a/vendor/github.com/cznic/mathutil/CONTRIBUTORS +++ /dev/null @@ -1,14 +0,0 @@ -# This file lists people who contributed code to this repository. The AUTHORS -# file lists the copyright holders; this file lists people. -# -# Names should be added to this file like so: -# Name -# -# Please keep the list sorted. - -Bodecker DellaMaria -Edward Betts -Faiz Abbasi -Gary Burd -Jan Mercl <0xjnml@gmail.com> -Muhammad Surya diff --git a/vendor/github.com/cznic/mathutil/LICENSE b/vendor/github.com/cznic/mathutil/LICENSE deleted file mode 100644 index 128a1b6..0000000 --- a/vendor/github.com/cznic/mathutil/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The mathutil Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/mathutil/Makefile b/vendor/github.com/cznic/mathutil/Makefile deleted file mode 100644 index a9f9e8a..0000000 --- a/vendor/github.com/cznic/mathutil/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2016 The mathutil Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -.PHONY: all clean cover cpu editor internalError later mem nuke todo edit - -grep=--include=*.go --include=*.l --include=*.y --include=*.yy -ngrep='TODOOK\|parser\.go\|scanner\.go\|.*_string\.go' - -all: editor - go vet 2>&1 | grep -v $(ngrep) || true - golint 2>&1 | grep -v $(ngrep) || true - make todo - unused . || true - misspell *.go - gosimple || true - unconvert || true - maligned || true - -clean: - go clean - rm -f *~ *.test *.out - -cover: - t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t - -cpu: clean - go test -run @ -bench . -cpuprofile cpu.out - go tool pprof -lines *.test cpu.out - -edit: - @ 1>/dev/null 2>/dev/null gvim -p Makefile *.go - -editor: - gofmt -l -s -w *.go - go test - go build - -internalError: - egrep -ho '"internal error.*"' *.go | sort | cat -n - -later: - @grep -n $(grep) LATER * || true - @grep -n $(grep) MAYBE * || true - -mem: clean - go test -run @ -bench . -memprofile mem.out -memprofilerate 1 -timeout 24h - go tool pprof -lines -web -alloc_space *.test mem.out - -nuke: clean - go clean -i - -todo: - @grep -nr $(grep) ^[[:space:]]*_[[:space:]]*=[[:space:]][[:alpha:]][[:alnum:]]* * | grep -v $(ngrep) || true - @grep -nr $(grep) TODO * | grep -v $(ngrep) || true - @grep -nr $(grep) BUG * | grep -v $(ngrep) || true - @grep -nr $(grep) [^[:alpha:]]println * | grep -v $(ngrep) || true diff --git a/vendor/github.com/cznic/mathutil/README b/vendor/github.com/cznic/mathutil/README deleted file mode 100644 index a9ee59c..0000000 --- a/vendor/github.com/cznic/mathutil/README +++ /dev/null @@ -1,10 +0,0 @@ -This is a goinstall-able mirror of modified code already published at: -http://git.nic.cz/redmine/projects/gornd/repository - -Packages in this repository: - -Install: $ go get github.com/cznic/mathutil -Godocs: http://godoc.org/github.com/cznic/mathutil - -Install: $ go get github.com/cznic/mathutil/mersenne -Godocs: http://godoc.org/github.com/cznic/mathutil/mersenne diff --git a/vendor/github.com/cznic/mathutil/bits.go b/vendor/github.com/cznic/mathutil/bits.go deleted file mode 100644 index fee4c03..0000000 --- a/vendor/github.com/cznic/mathutil/bits.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "math/big" -) - -// BitLenByte returns the bit width of the non zero part of n. -func BitLenByte(n byte) int { - return log2[n] + 1 -} - -// BitLenUint16 returns the bit width of the non zero part of n. -func BitLenUint16(n uint16) int { - if b := n >> 8; b != 0 { - return log2[b] + 8 + 1 - } - - return log2[n] + 1 -} - -// BitLenUint32 returns the bit width of the non zero part of n. -func BitLenUint32(n uint32) int { - if b := n >> 24; b != 0 { - return log2[b] + 24 + 1 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 + 1 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 + 1 - } - - return log2[n] + 1 -} - -// BitLen returns the bit width of the non zero part of n. -func BitLen(n int) int { // Should handle correctly [future] 64 bit Go ints - if IntBits == 64 { - return BitLenUint64(uint64(n)) - } - - if b := byte(n >> 24); b != 0 { - return log2[b] + 24 + 1 - } - - if b := byte(n >> 16); b != 0 { - return log2[b] + 16 + 1 - } - - if b := byte(n >> 8); b != 0 { - return log2[b] + 8 + 1 - } - - return log2[byte(n)] + 1 -} - -// BitLenUint returns the bit width of the non zero part of n. -func BitLenUint(n uint) int { // Should handle correctly [future] 64 bit Go uints - if IntBits == 64 { - return BitLenUint64(uint64(n)) - } - - if b := n >> 24; b != 0 { - return log2[b] + 24 + 1 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 + 1 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 + 1 - } - - return log2[n] + 1 -} - -// BitLenUint64 returns the bit width of the non zero part of n. -func BitLenUint64(n uint64) int { - if b := n >> 56; b != 0 { - return log2[b] + 56 + 1 - } - - if b := n >> 48; b != 0 { - return log2[b] + 48 + 1 - } - - if b := n >> 40; b != 0 { - return log2[b] + 40 + 1 - } - - if b := n >> 32; b != 0 { - return log2[b] + 32 + 1 - } - - if b := n >> 24; b != 0 { - return log2[b] + 24 + 1 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 + 1 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 + 1 - } - - return log2[n] + 1 -} - -// BitLenUintptr returns the bit width of the non zero part of n. -func BitLenUintptr(n uintptr) int { - if b := n >> 56; b != 0 { - return log2[b] + 56 + 1 - } - - if b := n >> 48; b != 0 { - return log2[b] + 48 + 1 - } - - if b := n >> 40; b != 0 { - return log2[b] + 40 + 1 - } - - if b := n >> 32; b != 0 { - return log2[b] + 32 + 1 - } - - if b := n >> 24; b != 0 { - return log2[b] + 24 + 1 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 + 1 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 + 1 - } - - return log2[n] + 1 -} - -// PopCountByte returns population count of n (number of bits set in n). -func PopCountByte(n byte) int { - return int(popcnt[n]) -} - -// PopCountUint16 returns population count of n (number of bits set in n). -func PopCountUint16(n uint16) int { - return int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) -} - -// PopCountUint32 returns population count of n (number of bits set in n). -func PopCountUint32(n uint32) int { - return int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) + - int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) -} - -// PopCount returns population count of n (number of bits set in n). -func PopCount(n int) int { // Should handle correctly [future] 64 bit Go ints - if IntBits == 64 { - return PopCountUint64(uint64(n)) - } - - return PopCountUint32(uint32(n)) -} - -// PopCountUint returns population count of n (number of bits set in n). -func PopCountUint(n uint) int { // Should handle correctly [future] 64 bit Go uints - if IntBits == 64 { - return PopCountUint64(uint64(n)) - } - - return PopCountUint32(uint32(n)) -} - -// PopCountUintptr returns population count of n (number of bits set in n). -func PopCountUintptr(n uintptr) int { - if UintPtrBits == 64 { - return PopCountUint64(uint64(n)) - } - - return PopCountUint32(uint32(n)) -} - -// PopCountUint64 returns population count of n (number of bits set in n). -func PopCountUint64(n uint64) int { - return int(popcnt[byte(n>>56)]) + int(popcnt[byte(n>>48)]) + - int(popcnt[byte(n>>40)]) + int(popcnt[byte(n>>32)]) + - int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) + - int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) -} - -// PopCountBigInt returns population count of |n| (number of bits set in |n|). -func PopCountBigInt(n *big.Int) (r int) { - for _, v := range n.Bits() { - r += PopCountUintptr(uintptr(v)) - } - return -} diff --git a/vendor/github.com/cznic/mathutil/envelope.go b/vendor/github.com/cznic/mathutil/envelope.go deleted file mode 100644 index ff8e601..0000000 --- a/vendor/github.com/cznic/mathutil/envelope.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "math" -) - -// Approximation type determines approximation methods used by e.g. Envelope. -type Approximation int - -// Specific approximation method tags -const ( - _ Approximation = iota - Linear // As named - Sinusoidal // Smooth for all derivations -) - -// Envelope is an utility for defining simple curves using a small (usually) -// set of data points. Envelope returns a value defined by x, points and -// approximation. The value of x must be in [0,1) otherwise the result is -// undefined or the function may panic. Points are interpreted as dividing the -// [0,1) interval in len(points)-1 sections, so len(points) must be > 1 or the -// function may panic. According to the left and right points closing/adjacent -// to the section the resulting value is interpolated using the chosen -// approximation method. Unsupported values of approximation are silently -// interpreted as 'Linear'. -func Envelope(x float64, points []float64, approximation Approximation) float64 { - step := 1 / float64(len(points)-1) - fslot := math.Floor(x / step) - mod := x - fslot*step - slot := int(fslot) - l, r := points[slot], points[slot+1] - rmod := mod / step - switch approximation { - case Sinusoidal: - k := (math.Sin(math.Pi*(rmod-0.5)) + 1) / 2 - return l + (r-l)*k - case Linear: - fallthrough - default: - return l + (r-l)*rmod - } -} diff --git a/vendor/github.com/cznic/mathutil/int.go b/vendor/github.com/cznic/mathutil/int.go deleted file mode 100644 index 8255c42..0000000 --- a/vendor/github.com/cznic/mathutil/int.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2018 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "fmt" - "math" - "math/big" -) - -var ( - // The maximun Int128 value. - MaxInt128 *big.Int - // The minimun Int128 value. - MinInt128 *big.Int -) - -func init() { - MaxInt128 = big.NewInt(0) - MaxInt128.SetBit(MaxInt128, 127, 1) - MaxInt128.Sub(MaxInt128, _1) - MinInt128 = big.NewInt(0) - MinInt128.Set(MaxInt128) - MinInt128.Add(MinInt128, _1) - MinInt128.Neg(MinInt128) -} - -// Int128 is an 128 bit integer. -type Int128 struct { - Lo int64 // Bits 63..0. - Hi int64 // Bits 127..64. -} - -// Add returns the sum of x and y and a carry indication. -func (x Int128) Add(y Int128) (r Int128, cy bool) { - r.Lo = x.Lo + y.Lo - r.Hi = x.Hi + y.Hi - if uint64(r.Lo) < uint64(x.Lo) { - r.Hi++ - } - return r, (r.Cmp(x) < 0) == (y.Sign() >= 0) -} - -// BigInt returns x in the form of a big.Int. -func (x Int128) BigInt() *big.Int { - r := big.NewInt(x.Hi) - r.Lsh(r, 64) - lo := big.NewInt(0) - lo.SetUint64(uint64(x.Lo)) - return r.Add(r, lo) -} - -// Cmp compares x and y and returns: -// -// -1 if x < y -// 0 if x == y -// +1 if x > y -func (x Int128) Cmp(y Int128) int { - if x.Hi > y.Hi { - return 1 - } - - if x.Hi < y.Hi { - return -1 - } - - if uint64(x.Lo) > uint64(y.Lo) { - return 1 - } - - if uint64(x.Lo) < uint64(y.Lo) { - return -1 - } - - return 0 -} - -// Neg returns -x and an indication that x was not equal to MinInt128. -func (x Int128) Neg() (r Int128, ok bool) { - if x == (Int128{Hi: math.MinInt64}) { - return x, false - } - - x.Lo = ^x.Lo - x.Hi = ^x.Hi - r, _ = x.Add(Int128{Lo: 1}) - return r, true -} - -// SetBigInt sets x to y, returns x and an error, if any. -func (x *Int128) SetBigInt(y *big.Int) (r Int128, err error) { - if y.Cmp(MaxInt128) > 0 { - return *x, fmt.Errorf("%T.SetInt: overflow", x) - } - if y.Cmp(MinInt128) < 0 { - return *x, fmt.Errorf("%T.SetInt: underflow", x) - } - neg := y.Sign() < 0 - var z big.Int - z.Set(y) - if neg { - z.Neg(&z) - } - r.Lo = z.Int64() - z.Rsh(&z, 64) - r.Hi = z.Int64() - if neg { - r, _ = r.Neg() - } - *x = r - return r, nil -} - -// SetInt64 sets x to y and returns x. -func (x *Int128) SetInt64(y int64) (r Int128) { - r.Lo = y - if y >= 0 { - r.Hi = 0 - *x = r - return r - } - - r.Hi = -1 - *x = r - return r -} - -// SetInt64 sets x to y and returns x. -func (x *Int128) SetUint64(y uint64) (r Int128) { - r = Int128{Lo: int64(y)} - *x = r - return r -} - -// Sign returns: -// -// -1 if x < 0 -// 0 if x == 0 -// +1 if x > 0 -func (x Int128) Sign() int { - if x.Hi < 0 { - return -1 - } - - if x.Hi != 0 || x.Lo != 0 { - return 1 - } - - return 0 -} - -// String implements fmt.Stringer() -func (x Int128) String() string { return x.BigInt().String() } diff --git a/vendor/github.com/cznic/mathutil/mathutil.go b/vendor/github.com/cznic/mathutil/mathutil.go deleted file mode 100644 index 01c823e..0000000 --- a/vendor/github.com/cznic/mathutil/mathutil.go +++ /dev/null @@ -1,1416 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package mathutil provides utilities supplementing the standard 'math' and -// 'math/rand' packages. -// -// Release history and compatibility issues -// -// 2018-04-25: New functions for determing Max/Min of nullable values. Ex: -// func MaxPtr(a, b *int) *int { -// func MinPtr(a, b *int) *int { -// func MaxBytePtr(a, b *byte) *byte { -// func MinBytePtr(a, b *byte) *byte { -// ... -// -// 2017-10-14: New variadic functions for Max/Min. Ex: -// func MaxVal(val int, vals ...int) int { -// func MinVal(val int, vals ...int) int { -// func MaxByteVal(val byte, vals ...byte) byte { -// func MinByteVal(val byte, vals ...byte) byte { -// ... -// -// 2016-10-10: New functions QuadPolyDiscriminant and QuadPolyFactors. -// -// 2013-12-13: The following functions have been REMOVED -// -// func Uint64ToBigInt(n uint64) *big.Int -// func Uint64FromBigInt(n *big.Int) (uint64, bool) -// -// 2013-05-13: The following functions are now DEPRECATED -// -// func Uint64ToBigInt(n uint64) *big.Int -// func Uint64FromBigInt(n *big.Int) (uint64, bool) -// -// These functions will be REMOVED with Go release 1.1+1. -// -// 2013-01-21: The following functions have been REMOVED -// -// func MaxInt() int -// func MinInt() int -// func MaxUint() uint -// func UintPtrBits() int -// -// They are now replaced by untyped constants -// -// MaxInt -// MinInt -// MaxUint -// UintPtrBits -// -// Additionally one more untyped constant was added -// -// IntBits -// -// This change breaks any existing code depending on the above removed -// functions. They should have not been published in the first place, that was -// unfortunate. Instead, defining such architecture and/or implementation -// specific integer limits and bit widths as untyped constants improves -// performance and allows for static dead code elimination if it depends on -// these values. Thanks to minux for pointing it out in the mail list -// (https://groups.google.com/d/msg/golang-nuts/tlPpLW6aJw8/NT3mpToH-a4J). -// -// 2012-12-12: The following functions will be DEPRECATED with Go release -// 1.0.3+1 and REMOVED with Go release 1.0.3+2, b/c of -// http://code.google.com/p/go/source/detail?r=954a79ee3ea8 -// -// func Uint64ToBigInt(n uint64) *big.Int -// func Uint64FromBigInt(n *big.Int) (uint64, bool) -package mathutil - -import ( - "math" - "math/big" -) - -// Architecture and/or implementation specific integer limits and bit widths. -const ( - MaxInt = 1<<(IntBits-1) - 1 - MinInt = -MaxInt - 1 - MaxUint = 1<>32&1 + ^uint(0)>>16&1 + ^uint(0)>>8&1 + 3) - UintPtrBits = 1 << (^uintptr(0)>>32&1 + ^uintptr(0)>>16&1 + ^uintptr(0)>>8&1 + 3) -) - -var ( - _m1 = big.NewInt(-1) - _1 = big.NewInt(1) - _2 = big.NewInt(2) -) - -// GCDByte returns the greatest common divisor of a and b. Based on: -// http://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations -func GCDByte(a, b byte) byte { - for b != 0 { - a, b = b, a%b - } - return a -} - -// GCDUint16 returns the greatest common divisor of a and b. -func GCDUint16(a, b uint16) uint16 { - for b != 0 { - a, b = b, a%b - } - return a -} - -// GCDUint32 returns the greatest common divisor of a and b. -func GCDUint32(a, b uint32) uint32 { - for b != 0 { - a, b = b, a%b - } - return a -} - -// GCDUint64 returns the greatest common divisor of a and b. -func GCDUint64(a, b uint64) uint64 { - for b != 0 { - a, b = b, a%b - } - return a -} - -// ISqrt returns floor(sqrt(n)). Typical run time is few hundreds of ns. -func ISqrt(n uint32) (x uint32) { - if n == 0 { - return - } - - if n >= math.MaxUint16*math.MaxUint16 { - return math.MaxUint16 - } - - var px, nx uint32 - for x = n; ; px, x = x, nx { - nx = (x + n/x) / 2 - if nx == x || nx == px { - break - } - } - return -} - -// SqrtUint64 returns floor(sqrt(n)). Typical run time is about 0.5 µs. -func SqrtUint64(n uint64) (x uint64) { - if n == 0 { - return - } - - if n >= math.MaxUint32*math.MaxUint32 { - return math.MaxUint32 - } - - var px, nx uint64 - for x = n; ; px, x = x, nx { - nx = (x + n/x) / 2 - if nx == x || nx == px { - break - } - } - return -} - -// SqrtBig returns floor(sqrt(n)). It panics on n < 0. -func SqrtBig(n *big.Int) (x *big.Int) { - switch n.Sign() { - case -1: - panic(-1) - case 0: - return big.NewInt(0) - } - - var px, nx big.Int - x = big.NewInt(0) - x.SetBit(x, n.BitLen()/2+1, 1) - for { - nx.Rsh(nx.Add(x, nx.Div(n, x)), 1) - if nx.Cmp(x) == 0 || nx.Cmp(&px) == 0 { - break - } - px.Set(x) - x.Set(&nx) - } - return -} - -// Log2Byte returns log base 2 of n. It's the same as index of the highest -// bit set in n. For n == 0 -1 is returned. -func Log2Byte(n byte) int { - return log2[n] -} - -// Log2Uint16 returns log base 2 of n. It's the same as index of the highest -// bit set in n. For n == 0 -1 is returned. -func Log2Uint16(n uint16) int { - if b := n >> 8; b != 0 { - return log2[b] + 8 - } - - return log2[n] -} - -// Log2Uint32 returns log base 2 of n. It's the same as index of the highest -// bit set in n. For n == 0 -1 is returned. -func Log2Uint32(n uint32) int { - if b := n >> 24; b != 0 { - return log2[b] + 24 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 - } - - return log2[n] -} - -// Log2Uint64 returns log base 2 of n. It's the same as index of the highest -// bit set in n. For n == 0 -1 is returned. -func Log2Uint64(n uint64) int { - if b := n >> 56; b != 0 { - return log2[b] + 56 - } - - if b := n >> 48; b != 0 { - return log2[b] + 48 - } - - if b := n >> 40; b != 0 { - return log2[b] + 40 - } - - if b := n >> 32; b != 0 { - return log2[b] + 32 - } - - if b := n >> 24; b != 0 { - return log2[b] + 24 - } - - if b := n >> 16; b != 0 { - return log2[b] + 16 - } - - if b := n >> 8; b != 0 { - return log2[b] + 8 - } - - return log2[n] -} - -// ModPowByte computes (b^e)%m. It panics for m == 0 || b == e == 0. -// -// See also: http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method -func ModPowByte(b, e, m byte) byte { - if b == 0 && e == 0 { - panic(0) - } - - if m == 1 { - return 0 - } - - r := uint16(1) - for b, m := uint16(b), uint16(m); e > 0; b, e = b*b%m, e>>1 { - if e&1 == 1 { - r = r * b % m - } - } - return byte(r) -} - -// ModPowUint16 computes (b^e)%m. It panics for m == 0 || b == e == 0. -func ModPowUint16(b, e, m uint16) uint16 { - if b == 0 && e == 0 { - panic(0) - } - - if m == 1 { - return 0 - } - - r := uint32(1) - for b, m := uint32(b), uint32(m); e > 0; b, e = b*b%m, e>>1 { - if e&1 == 1 { - r = r * b % m - } - } - return uint16(r) -} - -// ModPowUint32 computes (b^e)%m. It panics for m == 0 || b == e == 0. -func ModPowUint32(b, e, m uint32) uint32 { - if b == 0 && e == 0 { - panic(0) - } - - if m == 1 { - return 0 - } - - r := uint64(1) - for b, m := uint64(b), uint64(m); e > 0; b, e = b*b%m, e>>1 { - if e&1 == 1 { - r = r * b % m - } - } - return uint32(r) -} - -// ModPowUint64 computes (b^e)%m. It panics for m == 0 || b == e == 0. -func ModPowUint64(b, e, m uint64) (r uint64) { - if b == 0 && e == 0 { - panic(0) - } - - if m == 1 { - return 0 - } - - return modPowBigInt(big.NewInt(0).SetUint64(b), big.NewInt(0).SetUint64(e), big.NewInt(0).SetUint64(m)).Uint64() -} - -func modPowBigInt(b, e, m *big.Int) (r *big.Int) { - r = big.NewInt(1) - for i, n := 0, e.BitLen(); i < n; i++ { - if e.Bit(i) != 0 { - r.Mod(r.Mul(r, b), m) - } - b.Mod(b.Mul(b, b), m) - } - return -} - -// ModPowBigInt computes (b^e)%m. Returns nil for e < 0. It panics for m == 0 || b == e == 0. -func ModPowBigInt(b, e, m *big.Int) (r *big.Int) { - if b.Sign() == 0 && e.Sign() == 0 { - panic(0) - } - - if m.Cmp(_1) == 0 { - return big.NewInt(0) - } - - if e.Sign() < 0 { - return - } - - return modPowBigInt(big.NewInt(0).Set(b), big.NewInt(0).Set(e), m) -} - -var uint64ToBigIntDelta big.Int - -func init() { - uint64ToBigIntDelta.SetBit(&uint64ToBigIntDelta, 63, 1) -} - -var uintptrBits int - -func init() { - x := uint64(math.MaxUint64) - uintptrBits = BitLenUintptr(uintptr(x)) -} - -// UintptrBits returns the bit width of an uintptr at the executing machine. -func UintptrBits() int { - return uintptrBits -} - -// AddUint128_64 returns the uint128 sum of uint64 a and b. -func AddUint128_64(a, b uint64) (hi uint64, lo uint64) { - lo = a + b - if lo < a { - hi = 1 - } - return hi, lo -} - -// MulUint128_64 returns the uint128 bit product of uint64 a and b. -func MulUint128_64(a, b uint64) (hi, lo uint64) { - /* - 2^(2 W) ahi bhi + 2^W alo bhi + 2^W ahi blo + alo blo - - FEDCBA98 76543210 FEDCBA98 76543210 - ---- alo*blo ---- - ---- alo*bhi ---- - ---- ahi*blo ---- - ---- ahi*bhi ---- - */ - const w = 32 - const m = 1<>w, b>>w, a&m, b&m - lo = alo * blo - mid1 := alo * bhi - mid2 := ahi * blo - c1, lo := AddUint128_64(lo, mid1<>w+mid2>>w+c1+c2) - return -} - -// PowerizeBigInt returns (e, p) such that e is the smallest number for which p -// == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is returned. -// -// NOTE: Run time for large values of n (above about 2^1e6 ~= 1e300000) can be -// significant and/or unacceptabe. For any smaller values of n the function -// typically performs in sub second time. For "small" values of n (cca bellow -// 2^1e3 ~= 1e300) the same can be easily below 10 µs. -// -// A special (and trivial) case of b == 2 is handled separately and performs -// much faster. -func PowerizeBigInt(b, n *big.Int) (e uint32, p *big.Int) { - switch { - case b.Cmp(_2) < 0 || n.Sign() < 0: - return - case n.Sign() == 0 || n.Cmp(_1) == 0: - return 0, big.NewInt(1) - case b.Cmp(_2) == 0: - p = big.NewInt(0) - e = uint32(n.BitLen() - 1) - p.SetBit(p, int(e), 1) - if p.Cmp(n) < 0 { - p.Mul(p, _2) - e++ - } - return - } - - bw := b.BitLen() - nw := n.BitLen() - p = big.NewInt(1) - var bb, r big.Int - for { - switch p.Cmp(n) { - case -1: - x := uint32((nw - p.BitLen()) / bw) - if x == 0 { - x = 1 - } - e += x - switch x { - case 1: - p.Mul(p, b) - default: - r.Set(_1) - bb.Set(b) - e := x - for { - if e&1 != 0 { - r.Mul(&r, &bb) - } - if e >>= 1; e == 0 { - break - } - - bb.Mul(&bb, &bb) - } - p.Mul(p, &r) - } - case 0, 1: - return - } - } -} - -// PowerizeUint32BigInt returns (e, p) such that e is the smallest number for -// which p == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is -// returned. -// -// More info: see PowerizeBigInt. -func PowerizeUint32BigInt(b uint32, n *big.Int) (e uint32, p *big.Int) { - switch { - case b < 2 || n.Sign() < 0: - return - case n.Sign() == 0 || n.Cmp(_1) == 0: - return 0, big.NewInt(1) - case b == 2: - p = big.NewInt(0) - e = uint32(n.BitLen() - 1) - p.SetBit(p, int(e), 1) - if p.Cmp(n) < 0 { - p.Mul(p, _2) - e++ - } - return - } - - var bb big.Int - bb.SetInt64(int64(b)) - return PowerizeBigInt(&bb, n) -} - -/* -ProbablyPrimeUint32 returns true if n is prime or n is a pseudoprime to base a. -It implements the Miller-Rabin primality test for one specific value of 'a' and -k == 1. - -Wrt pseudocode shown at -http://en.wikipedia.org/wiki/Miller-Rabin_primality_test#Algorithm_and_running_time - - Input: n > 3, an odd integer to be tested for primality; - Input: k, a parameter that determines the accuracy of the test - Output: composite if n is composite, otherwise probably prime - write n − 1 as 2^s·d with d odd by factoring powers of 2 from n − 1 - LOOP: repeat k times: - pick a random integer a in the range [2, n − 2] - x ← a^d mod n - if x = 1 or x = n − 1 then do next LOOP - for r = 1 .. s − 1 - x ← x^2 mod n - if x = 1 then return composite - if x = n − 1 then do next LOOP - return composite - return probably prime - -... this function behaves like passing 1 for 'k' and additionally a -fixed/non-random 'a'. Otherwise it's the same algorithm. - -See also: http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html -*/ -func ProbablyPrimeUint32(n, a uint32) bool { - d, s := n-1, 0 - for ; d&1 == 0; d, s = d>>1, s+1 { - } - x := uint64(ModPowUint32(a, d, n)) - if x == 1 || uint32(x) == n-1 { - return true - } - - for ; s > 1; s-- { - if x = x * x % uint64(n); x == 1 { - return false - } - - if uint32(x) == n-1 { - return true - } - } - return false -} - -// ProbablyPrimeUint64_32 returns true if n is prime or n is a pseudoprime to -// base a. It implements the Miller-Rabin primality test for one specific value -// of 'a' and k == 1. See also ProbablyPrimeUint32. -func ProbablyPrimeUint64_32(n uint64, a uint32) bool { - d, s := n-1, 0 - for ; d&1 == 0; d, s = d>>1, s+1 { - } - x := ModPowUint64(uint64(a), d, n) - if x == 1 || x == n-1 { - return true - } - - bx, bn := big.NewInt(0).SetUint64(x), big.NewInt(0).SetUint64(n) - for ; s > 1; s-- { - if x = bx.Mod(bx.Mul(bx, bx), bn).Uint64(); x == 1 { - return false - } - - if x == n-1 { - return true - } - } - return false -} - -// ProbablyPrimeBigInt_32 returns true if n is prime or n is a pseudoprime to -// base a. It implements the Miller-Rabin primality test for one specific value -// of 'a' and k == 1. See also ProbablyPrimeUint32. -func ProbablyPrimeBigInt_32(n *big.Int, a uint32) bool { - var d big.Int - d.Set(n) - d.Sub(&d, _1) // d <- n-1 - s := 0 - for ; d.Bit(s) == 0; s++ { - } - nMinus1 := big.NewInt(0).Set(&d) - d.Rsh(&d, uint(s)) - - x := ModPowBigInt(big.NewInt(int64(a)), &d, n) - if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 { - return true - } - - for ; s > 1; s-- { - if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 { - return false - } - - if x.Cmp(nMinus1) == 0 { - return true - } - } - return false -} - -// ProbablyPrimeBigInt returns true if n is prime or n is a pseudoprime to base -// a. It implements the Miller-Rabin primality test for one specific value of -// 'a' and k == 1. See also ProbablyPrimeUint32. -func ProbablyPrimeBigInt(n, a *big.Int) bool { - var d big.Int - d.Set(n) - d.Sub(&d, _1) // d <- n-1 - s := 0 - for ; d.Bit(s) == 0; s++ { - } - nMinus1 := big.NewInt(0).Set(&d) - d.Rsh(&d, uint(s)) - - x := ModPowBigInt(a, &d, n) - if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 { - return true - } - - for ; s > 1; s-- { - if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 { - return false - } - - if x.Cmp(nMinus1) == 0 { - return true - } - } - return false -} - -// Max returns the larger of a and b. -func Max(a, b int) int { - if a > b { - return a - } - - return b -} - -// Min returns the smaller of a and b. -func Min(a, b int) int { - if a < b { - return a - } - - return b -} - -// MaxPtr returns a pointer to the larger of a and b, or nil. -func MaxPtr(a, b *int) *int { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinPtr returns a pointer to the smaller of a and b, or nil. -func MinPtr(a, b *int) *int { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxVal returns the largest argument passed. -func MaxVal(val int, vals ...int) int { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinVal returns the smallest argument passed. -func MinVal(val int, vals ...int) int { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// Clamp returns a value restricted between lo and hi. -func Clamp(v, lo, hi int) int { - return Min(Max(v, lo), hi) -} - -// UMax returns the larger of a and b. -func UMax(a, b uint) uint { - if a > b { - return a - } - - return b -} - -// UMin returns the smaller of a and b. -func UMin(a, b uint) uint { - if a < b { - return a - } - - return b -} - -// UMaxPtr returns a pointer to the larger of a and b, or nil. -func UMaxPtr(a, b *uint) *uint { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// UMinPtr returns a pointer to the smaller of a and b, or nil. -func UMinPtr(a, b *uint) *uint { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// UMaxVal returns the largest argument passed. -func UMaxVal(val uint, vals ...uint) uint { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// UMinVal returns the smallest argument passed. -func UMinVal(val uint, vals ...uint) uint { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// UClamp returns a value restricted between lo and hi. -func UClamp(v, lo, hi uint) uint { - return UMin(UMax(v, lo), hi) -} - -// MaxByte returns the larger of a and b. -func MaxByte(a, b byte) byte { - if a > b { - return a - } - - return b -} - -// MinByte returns the smaller of a and b. -func MinByte(a, b byte) byte { - if a < b { - return a - } - - return b -} - -// MaxBytePtr returns a pointer to the larger of a and b, or nil. -func MaxBytePtr(a, b *byte) *byte { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinBytePtr returns a pointer to the smaller of a and b, or nil. -func MinBytePtr(a, b *byte) *byte { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxByteVal returns the largest argument passed. -func MaxByteVal(val byte, vals ...byte) byte { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinByteVal returns the smallest argument passed. -func MinByteVal(val byte, vals ...byte) byte { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampByte returns a value restricted between lo and hi. -func ClampByte(v, lo, hi byte) byte { - return MinByte(MaxByte(v, lo), hi) -} - -// MaxInt8 returns the larger of a and b. -func MaxInt8(a, b int8) int8 { - if a > b { - return a - } - - return b -} - -// MinInt8 returns the smaller of a and b. -func MinInt8(a, b int8) int8 { - if a < b { - return a - } - - return b -} - -// MaxInt8Ptr returns a pointer to the larger of a and b, or nil. -func MaxInt8Ptr(a, b *int8) *int8 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinInt8Ptr returns a pointer to the smaller of a and b, or nil. -func MinInt8Ptr(a, b *int8) *int8 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxInt8Val returns the largest argument passed. -func MaxInt8Val(val int8, vals ...int8) int8 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinInt8Val returns the smallest argument passed. -func MinInt8Val(val int8, vals ...int8) int8 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampInt8 returns a value restricted between lo and hi. -func ClampInt8(v, lo, hi int8) int8 { - return MinInt8(MaxInt8(v, lo), hi) -} - -// MaxUint16 returns the larger of a and b. -func MaxUint16(a, b uint16) uint16 { - if a > b { - return a - } - - return b -} - -// MinUint16 returns the smaller of a and b. -func MinUint16(a, b uint16) uint16 { - if a < b { - return a - } - - return b -} - -// MaxUint16Ptr returns a pointer to the larger of a and b, or nil. -func MaxUint16Ptr(a, b *uint16) *uint16 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinUint16Ptr returns a pointer to the smaller of a and b, or nil. -func MinUint16Ptr(a, b *uint16) *uint16 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxUint16Val returns the largest argument passed. -func MaxUint16Val(val uint16, vals ...uint16) uint16 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinUint16Val returns the smallest argument passed. -func MinUint16Val(val uint16, vals ...uint16) uint16 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampUint16 returns a value restricted between lo and hi. -func ClampUint16(v, lo, hi uint16) uint16 { - return MinUint16(MaxUint16(v, lo), hi) -} - -// MaxInt16 returns the larger of a and b. -func MaxInt16(a, b int16) int16 { - if a > b { - return a - } - - return b -} - -// MinInt16 returns the smaller of a and b. -func MinInt16(a, b int16) int16 { - if a < b { - return a - } - - return b -} - -// MaxInt16Ptr returns a pointer to the larger of a and b, or nil. -func MaxInt16Ptr(a, b *int16) *int16 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinInt16Ptr returns a pointer to the smaller of a and b, or nil. -func MinInt16Ptr(a, b *int16) *int16 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxInt16Val returns the largest argument passed. -func MaxInt16Val(val int16, vals ...int16) int16 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinInt16Val returns the smallest argument passed. -func MinInt16Val(val int16, vals ...int16) int16 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampInt16 returns a value restricted between lo and hi. -func ClampInt16(v, lo, hi int16) int16 { - return MinInt16(MaxInt16(v, lo), hi) -} - -// MaxUint32 returns the larger of a and b. -func MaxUint32(a, b uint32) uint32 { - if a > b { - return a - } - - return b -} - -// MinUint32 returns the smaller of a and b. -func MinUint32(a, b uint32) uint32 { - if a < b { - return a - } - - return b -} - -// MaxUint32Ptr returns a pointer to the larger of a and b, or nil. -func MaxUint32Ptr(a, b *uint32) *uint32 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinUint32Ptr returns a pointer to the smaller of a and b, or nil. -func MinUint32Ptr(a, b *uint32) *uint32 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxUint32Val returns the largest argument passed. -func MaxUint32Val(val uint32, vals ...uint32) uint32 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinUint32Val returns the smallest argument passed. -func MinUint32Val(val uint32, vals ...uint32) uint32 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampUint32 returns a value restricted between lo and hi. -func ClampUint32(v, lo, hi uint32) uint32 { - return MinUint32(MaxUint32(v, lo), hi) -} - -// MaxInt32 returns the larger of a and b. -func MaxInt32(a, b int32) int32 { - if a > b { - return a - } - - return b -} - -// MinInt32 returns the smaller of a and b. -func MinInt32(a, b int32) int32 { - if a < b { - return a - } - - return b -} - -// MaxInt32Ptr returns a pointer to the larger of a and b, or nil. -func MaxInt32Ptr(a, b *int32) *int32 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinInt32Ptr returns a pointer to the smaller of a and b, or nil. -func MinInt32Ptr(a, b *int32) *int32 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxInt32Val returns the largest argument passed. -func MaxInt32Val(val int32, vals ...int32) int32 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinInt32Val returns the smallest argument passed. -func MinInt32Val(val int32, vals ...int32) int32 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampInt32 returns a value restricted between lo and hi. -func ClampInt32(v, lo, hi int32) int32 { - return MinInt32(MaxInt32(v, lo), hi) -} - -// MaxUint64 returns the larger of a and b. -func MaxUint64(a, b uint64) uint64 { - if a > b { - return a - } - - return b -} - -// MinUint64 returns the smaller of a and b. -func MinUint64(a, b uint64) uint64 { - if a < b { - return a - } - - return b -} - -// MaxUint64Ptr returns a pointer to the larger of a and b, or nil. -func MaxUint64Ptr(a, b *uint64) *uint64 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinUint64Ptr returns a pointer to the smaller of a and b, or nil. -func MinUint64Ptr(a, b *uint64) *uint64 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxUint64Val returns the largest argument passed. -func MaxUint64Val(val uint64, vals ...uint64) uint64 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinUint64Val returns the smallest argument passed. -func MinUint64Val(val uint64, vals ...uint64) uint64 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampUint64 returns a value restricted between lo and hi. -func ClampUint64(v, lo, hi uint64) uint64 { - return MinUint64(MaxUint64(v, lo), hi) -} - -// MaxInt64 returns the larger of a and b. -func MaxInt64(a, b int64) int64 { - if a > b { - return a - } - - return b -} - -// MinInt64 returns the smaller of a and b. -func MinInt64(a, b int64) int64 { - if a < b { - return a - } - - return b -} - -// MaxInt64Ptr returns a pointer to the larger of a and b, or nil. -func MaxInt64Ptr(a, b *int64) *int64 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a > *b { - return a - } - - return b -} - -// MinInt64Ptr returns a pointer to the smaller of a and b, or nil. -func MinInt64Ptr(a, b *int64) *int64 { - if a == nil { - return b - } - if b == nil { - return a - } - if *a < *b { - return a - } - - return b -} - -// MaxInt64Val returns the largest argument passed. -func MaxInt64Val(val int64, vals ...int64) int64 { - res := val - for _, v := range vals { - if v > res { - res = v - } - } - return res -} - -// MinInt64Val returns the smallest argument passed. -func MinInt64Val(val int64, vals ...int64) int64 { - res := val - for _, v := range vals { - if v < res { - res = v - } - } - return res -} - -// ClampInt64 returns a value restricted between lo and hi. -func ClampInt64(v, lo, hi int64) int64 { - return MinInt64(MaxInt64(v, lo), hi) -} - -// ToBase produces n in base b. For example -// -// ToBase(2047, 22) -> [1, 5, 4] -// -// 1 * 22^0 1 -// 5 * 22^1 110 -// 4 * 22^2 1936 -// ---- -// 2047 -// -// ToBase panics for bases < 2. -func ToBase(n *big.Int, b int) []int { - var nn big.Int - nn.Set(n) - if b < 2 { - panic("invalid base") - } - - k := 1 - switch nn.Sign() { - case -1: - nn.Neg(&nn) - k = -1 - case 0: - return []int{0} - } - - bb := big.NewInt(int64(b)) - var r []int - rem := big.NewInt(0) - for nn.Sign() != 0 { - nn.QuoRem(&nn, bb, rem) - r = append(r, k*int(rem.Int64())) - } - return r -} diff --git a/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report b/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report deleted file mode 100644 index 20e686c..0000000 --- a/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report +++ /dev/null @@ -1,267 +0,0 @@ -$ ./example -max 100000000 > rnd.dat -$ ./assess 1000000 - G E N E R A T O R S E L E C T I O N - ______________________________________ - - [0] Input File [1] Linear Congruential - [2] Quadratic Congruential I [3] Quadratic Congruential II - [4] Cubic Congruential [5] XOR - [6] Modular Exponentiation [7] Blum-Blum-Shub - [8] Micali-Schnorr [9] G Using SHA-1 - - Enter Choice: 0 - - - User Prescribed Input File: rnd.dat - - S T A T I S T I C A L T E S T S - _________________________________ - - [01] Frequency [02] Block Frequency - [03] Cumulative Sums [04] Runs - [05] Longest Run of Ones [06] Rank - [07] Discrete Fourier Transform [08] Nonperiodic Template Matchings - [09] Overlapping Template Matchings [10] Universal Statistical - [11] Approximate Entropy [12] Random Excursions - [13] Random Excursions Variant [14] Serial - [15] Linear Complexity - - INSTRUCTIONS - Enter 0 if you DO NOT want to apply all of the - statistical tests to each sequence and 1 if you DO. - - Enter Choice: 1 - - P a r a m e t e r A d j u s t m e n t s - ----------------------------------------- - [1] Block Frequency Test - block length(M): 128 - [2] NonOverlapping Template Test - block length(m): 9 - [3] Overlapping Template Test - block length(m): 9 - [4] Approximate Entropy Test - block length(m): 10 - [5] Serial Test - block length(m): 16 - [6] Linear Complexity Test - block length(M): 500 - - Select Test (0 to continue): 0 - - How many bitstreams? 200 - - Input File Format: - [0] ASCII - A sequence of ASCII 0's and 1's - [1] Binary - Each byte in data file contains 8 bits of data - - Select input mode: 1 - - Statistical Testing In Progress......... - - Statistical Testing Complete!!!!!!!!!!!! - -$ cat experiments/AlgorithmTesting/finalAnalysisReport.txt ------------------------------------------------------------------------------- -RESULTS FOR THE UNIFORMITY OF P-VALUES AND THE PROPORTION OF PASSING SEQUENCES ------------------------------------------------------------------------------- - generator is ------------------------------------------------------------------------------- - C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 P-VALUE PROPORTION STATISTICAL TEST ------------------------------------------------------------------------------- - 28 22 17 19 15 8 24 23 19 25 0.093720 198/200 Frequency - 20 18 24 14 18 17 16 28 21 24 0.504219 199/200 BlockFrequency - 25 22 17 24 19 21 22 15 16 19 0.825505 197/200 CumulativeSums - 27 17 16 22 14 26 14 25 19 20 0.304126 199/200 CumulativeSums - 22 19 14 23 22 22 13 28 13 24 0.224821 199/200 Runs - 20 24 18 21 15 13 22 23 24 20 0.719747 197/200 LongestRun - 22 26 18 22 26 15 17 22 20 12 0.410055 199/200 Rank - 25 22 26 22 20 16 20 20 16 13 0.585209 195/200 FFT - 22 11 15 26 33 24 21 13 14 21 0.013102 197/200 NonOverlappingTemplate - 17 11 16 27 19 24 19 20 28 19 0.219006 200/200 NonOverlappingTemplate - 23 27 24 15 21 11 18 27 15 19 0.162606 197/200 NonOverlappingTemplate - 21 18 13 20 19 23 20 17 26 23 0.749884 197/200 NonOverlappingTemplate - 24 22 24 24 24 21 13 15 17 16 0.494392 196/200 NonOverlappingTemplate - 24 16 23 15 23 18 25 16 18 22 0.699313 199/200 NonOverlappingTemplate - 19 23 21 16 27 18 17 20 18 21 0.859637 198/200 NonOverlappingTemplate - 12 20 16 19 26 14 30 20 24 19 0.141256 198/200 NonOverlappingTemplate - 18 21 17 21 20 14 25 19 24 21 0.859637 198/200 NonOverlappingTemplate - 24 25 21 18 23 15 23 17 16 18 0.749884 199/200 NonOverlappingTemplate - 20 22 22 18 16 22 28 16 14 22 0.574903 198/200 NonOverlappingTemplate - 18 23 22 17 24 25 19 16 23 13 0.626709 199/200 NonOverlappingTemplate - 17 22 14 19 21 21 18 19 24 25 0.842937 198/200 NonOverlappingTemplate - 18 17 26 21 22 15 22 18 21 20 0.883171 197/200 NonOverlappingTemplate - 19 25 16 32 15 19 20 18 16 20 0.236810 199/200 NonOverlappingTemplate - 19 18 15 21 24 22 18 21 20 22 0.964295 200/200 NonOverlappingTemplate - 21 14 17 23 26 19 20 22 20 18 0.834308 196/200 NonOverlappingTemplate - 15 21 17 27 26 23 21 17 24 9 0.129620 198/200 NonOverlappingTemplate - 25 17 19 19 18 22 21 22 21 16 0.951205 196/200 NonOverlappingTemplate - 20 19 24 21 19 24 16 18 17 22 0.946308 197/200 NonOverlappingTemplate - 27 16 19 18 23 19 22 17 22 17 0.807412 197/200 NonOverlappingTemplate - 14 18 21 23 23 20 14 22 20 25 0.719747 198/200 NonOverlappingTemplate - 18 22 19 12 24 25 25 22 18 15 0.474986 198/200 NonOverlappingTemplate - 21 18 23 17 19 18 28 19 20 17 0.825505 198/200 NonOverlappingTemplate - 20 19 15 16 27 20 26 17 20 20 0.657933 198/200 NonOverlappingTemplate - 17 25 21 21 11 19 22 16 27 21 0.401199 198/200 NonOverlappingTemplate - 19 16 15 18 24 19 25 25 19 20 0.769527 199/200 NonOverlappingTemplate - 18 20 20 26 20 12 24 25 19 16 0.524101 198/200 NonOverlappingTemplate - 14 16 18 23 21 21 19 19 28 21 0.668321 197/200 NonOverlappingTemplate - 21 20 23 25 21 22 19 17 14 18 0.875539 197/200 NonOverlappingTemplate - 14 16 29 22 23 13 20 29 17 17 0.099513 197/200 NonOverlappingTemplate - 14 19 27 19 17 23 18 24 20 19 0.709558 199/200 NonOverlappingTemplate - 18 15 21 19 27 22 21 23 17 17 0.779188 198/200 NonOverlappingTemplate - 13 23 13 22 22 23 22 21 21 20 0.689019 199/200 NonOverlappingTemplate - 17 14 26 26 16 21 30 15 21 14 0.096578 199/200 NonOverlappingTemplate - 18 21 24 23 21 13 23 23 19 15 0.719747 197/200 NonOverlappingTemplate - 19 21 14 32 20 15 16 18 24 21 0.202268 199/200 NonOverlappingTemplate - 27 22 20 21 21 14 15 22 14 24 0.474986 196/200 NonOverlappingTemplate - 31 12 25 11 21 18 19 16 24 23 0.050305 197/200 NonOverlappingTemplate - 17 26 20 22 15 27 22 19 12 20 0.383827 199/200 NonOverlappingTemplate - 15 22 14 14 31 15 27 18 23 21 0.078086 194/200 NonOverlappingTemplate - 19 19 14 15 24 21 25 21 20 22 0.788728 197/200 NonOverlappingTemplate - 20 21 19 22 25 18 13 24 28 10 0.153763 195/200 NonOverlappingTemplate - 23 17 21 25 21 20 13 30 14 16 0.196920 196/200 NonOverlappingTemplate - 17 31 17 22 16 15 28 23 11 20 0.050305 197/200 NonOverlappingTemplate - 15 21 26 27 15 18 19 21 18 20 0.605916 198/200 NonOverlappingTemplate - 23 18 15 14 20 21 20 20 20 29 0.554420 200/200 NonOverlappingTemplate - 22 19 19 18 19 17 22 21 31 12 0.311542 199/200 NonOverlappingTemplate - 16 22 23 21 19 19 18 24 21 17 0.960198 197/200 NonOverlappingTemplate - 21 21 17 20 16 23 25 22 18 17 0.917870 200/200 NonOverlappingTemplate - 27 17 17 16 21 20 22 18 21 21 0.859637 197/200 NonOverlappingTemplate - 18 24 15 27 18 21 18 16 24 19 0.657933 199/200 NonOverlappingTemplate - 13 16 21 21 15 25 18 22 29 20 0.326749 198/200 NonOverlappingTemplate - 18 17 23 23 15 19 26 30 11 18 0.125927 198/200 NonOverlappingTemplate - 30 21 18 22 17 21 15 17 21 18 0.544254 195/200 NonOverlappingTemplate - 12 18 19 24 16 24 18 24 28 17 0.311542 199/200 NonOverlappingTemplate - 20 15 23 15 18 30 23 18 17 21 0.410055 196/200 NonOverlappingTemplate - 15 18 23 16 29 21 22 16 19 21 0.544254 200/200 NonOverlappingTemplate - 18 16 27 13 21 22 22 21 16 24 0.534146 199/200 NonOverlappingTemplate - 20 25 18 21 16 21 17 28 21 13 0.484646 200/200 NonOverlappingTemplate - 23 22 13 22 14 20 26 18 19 23 0.574903 197/200 NonOverlappingTemplate - 21 24 25 13 19 22 18 13 24 21 0.504219 199/200 NonOverlappingTemplate - 19 13 18 25 22 15 23 28 19 18 0.410055 195/200 NonOverlappingTemplate - 20 15 27 22 26 26 14 13 21 16 0.181557 198/200 NonOverlappingTemplate - 18 18 19 23 18 20 19 21 24 20 0.991468 200/200 NonOverlappingTemplate - 18 23 17 14 20 25 22 22 22 17 0.816537 198/200 NonOverlappingTemplate - 26 15 15 11 23 21 21 16 36 16 0.005557 196/200 NonOverlappingTemplate - 27 13 21 23 21 16 19 20 16 24 0.544254 198/200 NonOverlappingTemplate - 16 15 32 17 20 23 22 19 20 16 0.262249 200/200 NonOverlappingTemplate - 26 19 24 13 24 16 18 18 13 29 0.137282 199/200 NonOverlappingTemplate - 15 18 14 27 32 21 15 20 19 19 0.112047 198/200 NonOverlappingTemplate - 22 23 22 18 20 23 19 22 16 15 0.924076 196/200 NonOverlappingTemplate - 18 17 21 22 14 17 22 24 20 25 0.798139 199/200 NonOverlappingTemplate - 15 17 19 24 21 23 17 25 23 16 0.739918 196/200 NonOverlappingTemplate - 22 11 15 26 32 25 21 13 14 21 0.017305 197/200 NonOverlappingTemplate - 22 16 19 23 22 21 21 19 17 20 0.985788 200/200 NonOverlappingTemplate - 22 28 18 24 14 20 23 21 20 10 0.230755 198/200 NonOverlappingTemplate - 14 13 22 28 14 28 17 22 23 19 0.129620 197/200 NonOverlappingTemplate - 22 16 22 20 21 21 16 19 18 25 0.935716 198/200 NonOverlappingTemplate - 15 20 23 17 19 22 21 23 18 22 0.951205 200/200 NonOverlappingTemplate - 20 24 21 19 17 19 19 24 15 22 0.930026 198/200 NonOverlappingTemplate - 18 21 15 21 17 28 24 22 20 14 0.534146 200/200 NonOverlappingTemplate - 19 15 19 19 20 20 15 25 23 25 0.779188 198/200 NonOverlappingTemplate - 17 24 25 16 15 21 18 19 23 22 0.788728 198/200 NonOverlappingTemplate - 15 20 18 25 24 15 21 31 18 13 0.141256 200/200 NonOverlappingTemplate - 24 17 19 20 18 21 15 22 24 20 0.924076 196/200 NonOverlappingTemplate - 23 18 17 21 17 28 23 21 18 14 0.605916 197/200 NonOverlappingTemplate - 21 19 22 23 16 17 20 21 22 19 0.985788 200/200 NonOverlappingTemplate - 27 17 21 27 24 15 15 17 15 22 0.304126 199/200 NonOverlappingTemplate - 25 28 20 24 13 14 16 22 19 19 0.304126 197/200 NonOverlappingTemplate - 27 16 14 24 22 18 24 20 18 17 0.564639 196/200 NonOverlappingTemplate - 18 18 24 19 19 19 26 11 27 19 0.375313 195/200 NonOverlappingTemplate - 20 15 29 19 26 16 21 11 18 25 0.141256 197/200 NonOverlappingTemplate - 19 14 21 25 11 23 22 25 26 14 0.176657 199/200 NonOverlappingTemplate - 18 23 20 17 19 18 29 22 26 8 0.102526 199/200 NonOverlappingTemplate - 22 17 18 16 18 20 19 19 25 26 0.834308 198/200 NonOverlappingTemplate - 25 18 14 16 16 24 18 18 30 21 0.268917 198/200 NonOverlappingTemplate - 24 21 23 13 12 22 20 23 20 22 0.554420 196/200 NonOverlappingTemplate - 18 21 21 30 22 17 19 14 18 20 0.534146 197/200 NonOverlappingTemplate - 25 20 22 21 15 18 17 20 17 25 0.825505 199/200 NonOverlappingTemplate - 18 21 22 21 18 20 26 16 20 18 0.941144 197/200 NonOverlappingTemplate - 23 18 22 25 12 16 17 19 26 22 0.474986 198/200 NonOverlappingTemplate - 22 18 29 23 19 23 17 17 15 17 0.534146 198/200 NonOverlappingTemplate - 19 21 17 26 18 15 22 26 15 21 0.626709 197/200 NonOverlappingTemplate - 16 20 20 23 18 21 18 18 25 21 0.955835 199/200 NonOverlappingTemplate - 23 21 20 21 22 10 15 27 15 26 0.186566 198/200 NonOverlappingTemplate - 18 26 20 26 26 18 17 17 20 12 0.358641 198/200 NonOverlappingTemplate - 24 20 21 18 24 12 19 27 14 21 0.401199 195/200 NonOverlappingTemplate - 16 25 15 21 24 18 18 25 22 16 0.657933 199/200 NonOverlappingTemplate - 24 14 17 26 15 17 17 25 21 24 0.428095 200/200 NonOverlappingTemplate - 22 24 11 20 22 24 19 18 12 28 0.176657 196/200 NonOverlappingTemplate - 27 16 27 18 27 14 13 16 21 21 0.141256 197/200 NonOverlappingTemplate - 23 25 20 18 23 17 15 23 19 17 0.834308 196/200 NonOverlappingTemplate - 19 21 20 27 16 16 18 25 16 22 0.678686 199/200 NonOverlappingTemplate - 25 22 21 19 15 19 22 19 25 13 0.657933 197/200 NonOverlappingTemplate - 19 28 21 25 20 12 18 13 29 15 0.073417 198/200 NonOverlappingTemplate - 20 24 21 19 21 15 17 24 20 19 0.941144 198/200 NonOverlappingTemplate - 18 29 23 17 24 19 17 18 16 19 0.585209 200/200 NonOverlappingTemplate - 18 28 18 16 25 21 18 20 14 22 0.544254 198/200 NonOverlappingTemplate - 22 19 23 22 22 21 21 26 12 12 0.401199 199/200 NonOverlappingTemplate - 22 15 25 16 21 27 14 22 21 17 0.484646 199/200 NonOverlappingTemplate - 18 25 20 23 30 17 13 22 18 14 0.213309 200/200 NonOverlappingTemplate - 20 23 21 21 23 29 16 13 16 18 0.410055 199/200 NonOverlappingTemplate - 21 19 16 22 31 18 20 17 18 18 0.514124 198/200 NonOverlappingTemplate - 26 22 12 14 23 17 21 24 21 20 0.455937 197/200 NonOverlappingTemplate - 21 17 18 17 14 32 21 26 18 16 0.162606 197/200 NonOverlappingTemplate - 22 24 22 23 11 15 17 18 29 19 0.230755 198/200 NonOverlappingTemplate - 19 27 20 19 23 15 24 15 21 17 0.657933 198/200 NonOverlappingTemplate - 20 25 16 10 24 13 23 21 21 27 0.149495 200/200 NonOverlappingTemplate - 19 21 21 27 17 17 19 21 21 17 0.904708 200/200 NonOverlappingTemplate - 18 23 15 19 24 21 23 21 13 23 0.719747 198/200 NonOverlappingTemplate - 26 16 28 19 19 18 17 17 16 24 0.474986 199/200 NonOverlappingTemplate - 24 32 17 18 20 13 18 18 19 21 0.236810 195/200 NonOverlappingTemplate - 26 25 18 17 12 19 20 23 21 19 0.585209 196/200 NonOverlappingTemplate - 18 26 25 12 18 16 24 19 18 24 0.410055 199/200 NonOverlappingTemplate - 27 21 22 27 21 14 18 14 23 13 0.219006 197/200 NonOverlappingTemplate - 18 23 24 16 19 21 16 26 20 17 0.798139 199/200 NonOverlappingTemplate - 19 30 15 27 14 19 24 11 22 19 0.073417 198/200 NonOverlappingTemplate - 20 23 22 20 22 15 22 21 18 17 0.964295 198/200 NonOverlappingTemplate - 22 31 16 26 13 19 17 22 24 10 0.037566 197/200 NonOverlappingTemplate - 18 24 22 14 23 19 16 18 19 27 0.637119 197/200 NonOverlappingTemplate - 19 20 21 22 21 18 19 22 20 18 0.999438 198/200 NonOverlappingTemplate - 27 15 21 18 28 18 15 23 18 17 0.375313 195/200 NonOverlappingTemplate - 26 23 20 20 23 19 20 23 14 12 0.514124 199/200 NonOverlappingTemplate - 18 19 11 15 21 24 20 26 23 23 0.428095 198/200 NonOverlappingTemplate - 19 16 21 25 19 21 15 24 24 16 0.749884 197/200 NonOverlappingTemplate - 17 26 23 18 20 26 23 14 18 15 0.494392 198/200 NonOverlappingTemplate - 15 17 19 24 21 23 17 25 23 16 0.739918 196/200 NonOverlappingTemplate - 26 19 20 20 24 22 22 13 14 20 0.605916 198/200 OverlappingTemplate - 29 24 17 21 18 13 18 21 17 22 0.446556 196/200 Universal - 22 18 22 20 20 21 22 21 18 16 0.992952 198/200 ApproximateEntropy - 14 8 13 9 11 13 13 8 7 10 0.719747 106/106 RandomExcursions - 13 18 9 7 12 12 9 6 12 8 0.236810 104/106 RandomExcursions - 11 15 10 7 11 14 9 6 12 11 0.595549 106/106 RandomExcursions - 15 7 12 12 9 11 16 8 10 6 0.350485 106/106 RandomExcursions - 10 10 12 16 10 12 10 7 13 6 0.554420 106/106 RandomExcursions - 8 7 12 10 11 16 11 13 10 8 0.657933 106/106 RandomExcursions - 9 6 12 12 14 9 11 13 10 10 0.816537 104/106 RandomExcursions - 10 10 7 12 11 9 10 13 14 10 0.911413 105/106 RandomExcursions - 8 8 12 9 10 5 13 12 17 12 0.319084 104/106 RandomExcursionsVariant - 5 11 10 11 7 11 10 15 11 15 0.455937 104/106 RandomExcursionsVariant - 6 12 11 8 12 12 12 13 13 7 0.699313 104/106 RandomExcursionsVariant - 14 10 11 6 12 9 8 12 11 13 0.779188 104/106 RandomExcursionsVariant - 12 12 10 7 17 6 6 12 13 11 0.262249 103/106 RandomExcursionsVariant - 13 8 14 13 7 6 6 13 15 11 0.249284 102/106 RandomExcursionsVariant - 12 12 12 13 7 9 6 13 12 10 0.739918 105/106 RandomExcursionsVariant - 13 15 12 8 9 10 6 9 14 10 0.574903 106/106 RandomExcursionsVariant - 10 15 9 12 14 10 8 11 7 10 0.739918 105/106 RandomExcursionsVariant - 13 12 8 11 12 11 9 10 11 9 0.978072 103/106 RandomExcursionsVariant - 10 13 12 12 8 13 8 9 14 7 0.739918 104/106 RandomExcursionsVariant - 12 10 10 14 7 8 7 13 14 11 0.657933 106/106 RandomExcursionsVariant - 10 13 10 10 13 10 12 6 10 12 0.897763 106/106 RandomExcursionsVariant - 9 12 15 8 13 8 12 8 11 10 0.779188 106/106 RandomExcursionsVariant - 9 13 15 10 10 10 8 14 6 11 0.616305 106/106 RandomExcursionsVariant - 7 17 9 12 9 11 10 16 4 11 0.129620 106/106 RandomExcursionsVariant - 10 9 10 15 7 12 7 8 12 16 0.419021 106/106 RandomExcursionsVariant - 9 12 11 8 8 9 15 12 9 13 0.798139 106/106 RandomExcursionsVariant - 17 34 11 22 22 17 19 20 13 25 0.026057 199/200 Serial - 22 20 16 22 20 18 20 18 23 21 0.989786 199/200 Serial - 12 33 25 29 21 11 21 15 14 19 0.003996 199/200 LinearComplexity - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -The minimum pass rate for each statistical test with the exception of the -random excursion (variant) test is approximately = 193 for a -sample size = 200 binary sequences. - -The minimum pass rate for the random excursion (variant) test -is approximately = 101 for a sample size = 106 binary sequences. - -For further guidelines construct a probability table using the MAPLE program -provided in the addendum section of the documentation. -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -$ diff --git a/vendor/github.com/cznic/mathutil/permute.go b/vendor/github.com/cznic/mathutil/permute.go deleted file mode 100644 index 82ad791..0000000 --- a/vendor/github.com/cznic/mathutil/permute.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "sort" -) - -// PermutationFirst generates the first permutation of data. -func PermutationFirst(data sort.Interface) { - sort.Sort(data) -} - -// PermutationNext generates the next permutation of data if possible and -// return true. Return false if there is no more permutation left. Based on -// the algorithm described here: -// http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order -func PermutationNext(data sort.Interface) bool { - var k, l int - for k = data.Len() - 2; ; k-- { // 1. - if k < 0 { - return false - } - - if data.Less(k, k+1) { - break - } - } - for l = data.Len() - 1; !data.Less(k, l); l-- { // 2. - } - data.Swap(k, l) // 3. - for i, j := k+1, data.Len()-1; i < j; i++ { // 4. - data.Swap(i, j) - j-- - } - return true -} diff --git a/vendor/github.com/cznic/mathutil/poly.go b/vendor/github.com/cznic/mathutil/poly.go deleted file mode 100644 index 52b58ff..0000000 --- a/vendor/github.com/cznic/mathutil/poly.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) 2016 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "fmt" - "math/big" -) - -func abs(n int) uint64 { - if n >= 0 { - return uint64(n) - } - - return uint64(-n) -} - -// QuadPolyDiscriminant returns the discriminant of a quadratic polynomial in -// one variable of the form a*x^2+b*x+c with integer coefficients a, b, c, or -// an error on overflow. -// -// ds is the square of the discriminant. If |ds| is a square number, d is set -// to sqrt(|ds|), otherwise d is < 0. -func QuadPolyDiscriminant(a, b, c int) (ds, d int, _ error) { - if 2*BitLenUint64(abs(b)) > IntBits-1 || - 2+BitLenUint64(abs(a))+BitLenUint64(abs(c)) > IntBits-1 { - return 0, 0, fmt.Errorf("overflow") - } - - ds = b*b - 4*a*c - s := ds - if s < 0 { - s = -s - } - d64 := SqrtUint64(uint64(s)) - if d64*d64 != uint64(s) { - return ds, -1, nil - } - - return ds, int(d64), nil -} - -// PolyFactor describes an irreducible factor of a polynomial in one variable -// with integer coefficients P, Q of the form P*x+Q. -type PolyFactor struct { - P, Q int -} - -// QuadPolyFactors returns the content and the irreducible factors of the -// primitive part of a quadratic polynomial in one variable with integer -// coefficients a, b, c of the form a*x^2+b*x+c in integers, or an error on -// overflow. -// -// If the factorization in integers does not exists, the return value is (0, -// nil, nil). -// -// See also: -// https://en.wikipedia.org/wiki/Factorization_of_polynomials#Primitive_part.E2.80.93content_factorization -func QuadPolyFactors(a, b, c int) (content int, primitivePart []PolyFactor, _ error) { - content = int(GCDUint64(abs(a), GCDUint64(abs(b), abs(c)))) - switch { - case content == 0: - content = 1 - case content > 0: - if a < 0 || a == 0 && b < 0 { - content = -content - } - } - a /= content - b /= content - c /= content - if a == 0 { - if b == 0 { - return content, []PolyFactor{{0, c}}, nil - } - - if b < 0 && c < 0 { - b = -b - c = -c - } - if b < 0 { - b = -b - c = -c - } - return content, []PolyFactor{{b, c}}, nil - } - - ds, d, err := QuadPolyDiscriminant(a, b, c) - if err != nil { - return 0, nil, err - } - - if ds < 0 || d < 0 { - return 0, nil, nil - } - - x1num := -b + d - x1denom := 2 * a - gcd := int(GCDUint64(abs(x1num), abs(x1denom))) - x1num /= gcd - x1denom /= gcd - - x2num := -b - d - x2denom := 2 * a - gcd = int(GCDUint64(abs(x2num), abs(x2denom))) - x2num /= gcd - x2denom /= gcd - - return content, []PolyFactor{{x1denom, -x1num}, {x2denom, -x2num}}, nil -} - -// QuadPolyDiscriminantBig returns the discriminant of a quadratic polynomial -// in one variable of the form a*x^2+b*x+c with integer coefficients a, b, c. -// -// ds is the square of the discriminant. If |ds| is a square number, d is set -// to sqrt(|ds|), otherwise d is nil. -func QuadPolyDiscriminantBig(a, b, c *big.Int) (ds, d *big.Int) { - ds = big.NewInt(0).Set(b) - ds.Mul(ds, b) - x := big.NewInt(4) - x.Mul(x, a) - x.Mul(x, c) - ds.Sub(ds, x) - - s := big.NewInt(0).Set(ds) - if s.Sign() < 0 { - s.Neg(s) - } - - if s.Bit(1) != 0 { // s is not a square number - return ds, nil - } - - d = SqrtBig(s) - x.Set(d) - x.Mul(x, x) - if x.Cmp(s) != 0 { // s is not a square number - d = nil - } - return ds, d -} - -// PolyFactorBig describes an irreducible factor of a polynomial in one -// variable with integer coefficients P, Q of the form P*x+Q. -type PolyFactorBig struct { - P, Q *big.Int -} - -// QuadPolyFactorsBig returns the content and the irreducible factors of the -// primitive part of a quadratic polynomial in one variable with integer -// coefficients a, b, c of the form a*x^2+b*x+c in integers. -// -// If the factorization in integers does not exists, the return value is (nil, -// nil). -// -// See also: -// https://en.wikipedia.org/wiki/Factorization_of_polynomials#Primitive_part.E2.80.93content_factorization -func QuadPolyFactorsBig(a, b, c *big.Int) (content *big.Int, primitivePart []PolyFactorBig) { - content = bigGCD(bigAbs(a), bigGCD(bigAbs(b), bigAbs(c))) - switch { - case content.Sign() == 0: - content.SetInt64(1) - case content.Sign() > 0: - if a.Sign() < 0 || a.Sign() == 0 && b.Sign() < 0 { - content = bigNeg(content) - } - } - a = bigDiv(a, content) - b = bigDiv(b, content) - c = bigDiv(c, content) - - if a.Sign() == 0 { - if b.Sign() == 0 { - return content, []PolyFactorBig{{big.NewInt(0), c}} - } - - if b.Sign() < 0 && c.Sign() < 0 { - b = bigNeg(b) - c = bigNeg(c) - } - if b.Sign() < 0 { - b = bigNeg(b) - c = bigNeg(c) - } - return content, []PolyFactorBig{{b, c}} - } - - ds, d := QuadPolyDiscriminantBig(a, b, c) - if ds.Sign() < 0 || d == nil { - return nil, nil - } - - x1num := bigAdd(bigNeg(b), d) - x1denom := bigMul(_2, a) - gcd := bigGCD(bigAbs(x1num), bigAbs(x1denom)) - x1num = bigDiv(x1num, gcd) - x1denom = bigDiv(x1denom, gcd) - - x2num := bigAdd(bigNeg(b), bigNeg(d)) - x2denom := bigMul(_2, a) - gcd = bigGCD(bigAbs(x2num), bigAbs(x2denom)) - x2num = bigDiv(x2num, gcd) - x2denom = bigDiv(x2denom, gcd) - - return content, []PolyFactorBig{{x1denom, bigNeg(x1num)}, {x2denom, bigNeg(x2num)}} -} - -func bigAbs(n *big.Int) *big.Int { - n = big.NewInt(0).Set(n) - if n.Sign() >= 0 { - return n - } - - return n.Neg(n) -} - -func bigDiv(a, b *big.Int) *big.Int { - a = big.NewInt(0).Set(a) - return a.Div(a, b) -} - -func bigGCD(a, b *big.Int) *big.Int { - a = big.NewInt(0).Set(a) - b = big.NewInt(0).Set(b) - for b.Sign() != 0 { - c := big.NewInt(0) - c.Mod(a, b) - a, b = b, c - } - return a -} - -func bigNeg(n *big.Int) *big.Int { - n = big.NewInt(0).Set(n) - return n.Neg(n) -} - -func bigMul(a, b *big.Int) *big.Int { - r := big.NewInt(0).Set(a) - return r.Mul(r, b) -} - -func bigAdd(a, b *big.Int) *big.Int { - r := big.NewInt(0).Set(a) - return r.Add(r, b) -} diff --git a/vendor/github.com/cznic/mathutil/primes.go b/vendor/github.com/cznic/mathutil/primes.go deleted file mode 100644 index bd10fe6..0000000 --- a/vendor/github.com/cznic/mathutil/primes.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "math" -) - -// IsPrimeUint16 returns true if n is prime. Typical run time is few ns. -func IsPrimeUint16(n uint16) bool { - return n > 0 && primes16[n-1] == 1 -} - -// NextPrimeUint16 returns first prime > n and true if successful or an -// undefined value and false if there is no next prime in the uint16 limits. -// Typical run time is few ns. -func NextPrimeUint16(n uint16) (p uint16, ok bool) { - return n + uint16(primes16[n]), n < 65521 -} - -// IsPrime returns true if n is prime. Typical run time is about 100 ns. -// -//TODO rename to IsPrimeUint32 -func IsPrime(n uint32) bool { - switch { - case n&1 == 0: - return n == 2 - case n%3 == 0: - return n == 3 - case n%5 == 0: - return n == 5 - case n%7 == 0: - return n == 7 - case n%11 == 0: - return n == 11 - case n%13 == 0: - return n == 13 - case n%17 == 0: - return n == 17 - case n%19 == 0: - return n == 19 - case n%23 == 0: - return n == 23 - case n%29 == 0: - return n == 29 - case n%31 == 0: - return n == 31 - case n%37 == 0: - return n == 37 - case n%41 == 0: - return n == 41 - case n%43 == 0: - return n == 43 - case n%47 == 0: - return n == 47 - case n%53 == 0: - return n == 53 // Benchmarked optimum - case n < 65536: - // use table data - return IsPrimeUint16(uint16(n)) - default: - mod := ModPowUint32(2, (n+1)/2, n) - if mod != 2 && mod != n-2 { - return false - } - blk := &lohi[n>>24] - lo, hi := blk.lo, blk.hi - for lo <= hi { - index := (lo + hi) >> 1 - liar := liars[index] - switch { - case n > liar: - lo = index + 1 - case n < liar: - hi = index - 1 - default: - return false - } - } - return true - } -} - -// IsPrimeUint64 returns true if n is prime. Typical run time is few tens of µs. -// -// SPRP bases: http://miller-rabin.appspot.com -func IsPrimeUint64(n uint64) bool { - switch { - case n%2 == 0: - return n == 2 - case n%3 == 0: - return n == 3 - case n%5 == 0: - return n == 5 - case n%7 == 0: - return n == 7 - case n%11 == 0: - return n == 11 - case n%13 == 0: - return n == 13 - case n%17 == 0: - return n == 17 - case n%19 == 0: - return n == 19 - case n%23 == 0: - return n == 23 - case n%29 == 0: - return n == 29 - case n%31 == 0: - return n == 31 - case n%37 == 0: - return n == 37 - case n%41 == 0: - return n == 41 - case n%43 == 0: - return n == 43 - case n%47 == 0: - return n == 47 - case n%53 == 0: - return n == 53 - case n%59 == 0: - return n == 59 - case n%61 == 0: - return n == 61 - case n%67 == 0: - return n == 67 - case n%71 == 0: - return n == 71 - case n%73 == 0: - return n == 73 - case n%79 == 0: - return n == 79 - case n%83 == 0: - return n == 83 - case n%89 == 0: - return n == 89 // Benchmarked optimum - case n <= math.MaxUint16: - return IsPrimeUint16(uint16(n)) - case n <= math.MaxUint32: - return ProbablyPrimeUint32(uint32(n), 11000544) && - ProbablyPrimeUint32(uint32(n), 31481107) - case n < 105936894253: - return ProbablyPrimeUint64_32(n, 2) && - ProbablyPrimeUint64_32(n, 1005905886) && - ProbablyPrimeUint64_32(n, 1340600841) - case n < 31858317218647: - return ProbablyPrimeUint64_32(n, 2) && - ProbablyPrimeUint64_32(n, 642735) && - ProbablyPrimeUint64_32(n, 553174392) && - ProbablyPrimeUint64_32(n, 3046413974) - case n < 3071837692357849: - return ProbablyPrimeUint64_32(n, 2) && - ProbablyPrimeUint64_32(n, 75088) && - ProbablyPrimeUint64_32(n, 642735) && - ProbablyPrimeUint64_32(n, 203659041) && - ProbablyPrimeUint64_32(n, 3613982119) - default: - return ProbablyPrimeUint64_32(n, 2) && - ProbablyPrimeUint64_32(n, 325) && - ProbablyPrimeUint64_32(n, 9375) && - ProbablyPrimeUint64_32(n, 28178) && - ProbablyPrimeUint64_32(n, 450775) && - ProbablyPrimeUint64_32(n, 9780504) && - ProbablyPrimeUint64_32(n, 1795265022) - } -} - -// NextPrime returns first prime > n and true if successful or an undefined value and false if there -// is no next prime in the uint32 limits. Typical run time is about 2 µs. -// -//TODO rename to NextPrimeUint32 -func NextPrime(n uint32) (p uint32, ok bool) { - switch { - case n < 65521: - p16, _ := NextPrimeUint16(uint16(n)) - return uint32(p16), true - case n >= math.MaxUint32-4: - return - } - - n++ - var d0, d uint32 - switch mod := n % 6; mod { - case 0: - d0, d = 1, 4 - case 1: - d = 4 - case 2, 3, 4: - d0, d = 5-mod, 2 - case 5: - d = 2 - } - - p = n + d0 - if p < n { // overflow - return - } - - for { - if IsPrime(p) { - return p, true - } - - p0 := p - p += d - if p < p0 { // overflow - break - } - - d ^= 6 - } - return -} - -// NextPrimeUint64 returns first prime > n and true if successful or an undefined value and false if there -// is no next prime in the uint64 limits. Typical run time is in hundreds of µs. -func NextPrimeUint64(n uint64) (p uint64, ok bool) { - switch { - case n < 65521: - p16, _ := NextPrimeUint16(uint16(n)) - return uint64(p16), true - case n >= 18446744073709551557: // last uint64 prime - return - } - - n++ - var d0, d uint64 - switch mod := n % 6; mod { - case 0: - d0, d = 1, 4 - case 1: - d = 4 - case 2, 3, 4: - d0, d = 5-mod, 2 - case 5: - d = 2 - } - - p = n + d0 - if p < n { // overflow - return - } - - for { - if ok = IsPrimeUint64(p); ok { - break - } - - p0 := p - p += d - if p < p0 { // overflow - break - } - - d ^= 6 - } - return -} - -// FactorTerm is one term of an integer factorization. -type FactorTerm struct { - Prime uint32 // The divisor - Power uint32 // Term == Prime^Power -} - -// FactorTerms represent a factorization of an integer -type FactorTerms []FactorTerm - -// FactorInt returns prime factorization of n > 1 or nil otherwise. -// Resulting factors are ordered by Prime. Typical run time is few µs. -func FactorInt(n uint32) (f FactorTerms) { - switch { - case n < 2: - return - case IsPrime(n): - return []FactorTerm{{n, 1}} - } - - f, w := make([]FactorTerm, 9), 0 - for p := 2; p < len(primes16); p += int(primes16[p]) { - if uint(p*p) > uint(n) { - break - } - - power := uint32(0) - for n%uint32(p) == 0 { - n /= uint32(p) - power++ - } - if power != 0 { - f[w] = FactorTerm{uint32(p), power} - w++ - } - if n == 1 { - break - } - } - if n != 1 { - f[w] = FactorTerm{n, 1} - w++ - } - return f[:w] -} - -// PrimorialProductsUint32 returns a slice of numbers in [lo, hi] which are a -// product of max 'max' primorials. The slice is not sorted. -// -// See also: http://en.wikipedia.org/wiki/Primorial -func PrimorialProductsUint32(lo, hi, max uint32) (r []uint32) { - lo64, hi64 := int64(lo), int64(hi) - if max > 31 { // N/A - max = 31 - } - - var f func(int64, int64, uint32) - f = func(n, p int64, emax uint32) { - e := uint32(1) - for n <= hi64 && e <= emax { - n *= p - if n >= lo64 && n <= hi64 { - r = append(r, uint32(n)) - } - if n < hi64 { - p, _ := NextPrime(uint32(p)) - f(n, int64(p), e) - } - e++ - } - } - - f(1, 2, max) - return -} diff --git a/vendor/github.com/cznic/mathutil/rat.go b/vendor/github.com/cznic/mathutil/rat.go deleted file mode 100644 index 91b1c6f..0000000 --- a/vendor/github.com/cznic/mathutil/rat.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -// QCmpUint32 compares a/b and c/d and returns: -// -// -1 if a/b < c/d -// 0 if a/b == c/d -// +1 if a/b > c/d -// -func QCmpUint32(a, b, c, d uint32) int { - switch x, y := uint64(a)*uint64(d), uint64(b)*uint64(c); { - case x < y: - return -1 - case x == y: - return 0 - default: // x > y - return 1 - } -} - -// QScaleUint32 returns a such that a/b >= c/d. -func QScaleUint32(b, c, d uint32) (a uint64) { - return 1 + (uint64(b)*uint64(c))/uint64(d) -} diff --git a/vendor/github.com/cznic/mathutil/rnd.go b/vendor/github.com/cznic/mathutil/rnd.go deleted file mode 100644 index 9132dc0..0000000 --- a/vendor/github.com/cznic/mathutil/rnd.go +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -import ( - "fmt" - "math" - "math/big" -) - -// FC32 is a full cycle PRNG covering the 32 bit signed integer range. -// In contrast to full cycle generators shown at e.g. http://en.wikipedia.org/wiki/Full_cycle, -// this code doesn't produce values at constant delta (mod cycle length). -// The 32 bit limit is per this implementation, the algorithm used has no intrinsic limit on the cycle size. -// Properties include: -// - Adjustable limits on creation (hi, lo). -// - Positionable/randomly accessible (Pos, Seek). -// - Repeatable (deterministic). -// - Can run forward or backward (Next, Prev). -// - For a billion numbers cycle the Next/Prev PRN can be produced in cca 100-150ns. -// That's like 5-10 times slower compared to PRNs generated using the (non FC) rand package. -type FC32 struct { - cycle int64 // On average: 3 * delta / 2, (HQ: 2 * delta) - delta int64 // hi - lo - factors [][]int64 // This trades some space for hopefully a bit of speed (multiple adding vs multiplying). - lo int - mods []int // pos % set - pos int64 // Within cycle. - primes []int64 // Ordered. ∏ primes == cycle. - set []int64 // Reordered primes (magnitude order bases) according to seed. -} - -// NewFC32 returns a newly created FC32 adjusted for the closed interval [lo, hi] or an Error if any. -// If hq == true then trade some generation time for improved (pseudo)randomness. -func NewFC32(lo, hi int, hq bool) (r *FC32, err error) { - if lo > hi { - return nil, fmt.Errorf("invalid range %d > %d", lo, hi) - } - - if uint64(hi)-uint64(lo) > math.MaxUint32 { - return nil, fmt.Errorf("range out of int32 limits %d, %d", lo, hi) - } - - delta := int64(hi) - int64(lo) - // Find the primorial covering whole delta - n, set, p := int64(1), []int64{}, uint32(2) - if hq { - p++ - } - for { - set = append(set, int64(p)) - n *= int64(p) - if n > delta { - break - } - p, _ = NextPrime(p) - } - - // Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta]) - // while keeping the cardinality of the set (correlates with the statistic "randomness quality") - // at max, i.e. discard atmost one member. - i := -1 // no candidate prime - if n > 2*(delta+1) { - for j, p := range set { - q := n / p - if q < delta+1 { - break - } - - i = j // mark the highest candidate prime set index - } - } - if i >= 0 { // shrink the inner cycle - n = n / set[i] - set = delete(set, i) - } - r = &FC32{ - cycle: n, - delta: delta, - factors: make([][]int64, len(set)), - lo: lo, - mods: make([]int, len(set)), - primes: set, - } - r.Seed(1) // the default seed should be always non zero - return -} - -// Cycle reports the length of the inner FCPRNG cycle. -// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1). -func (r *FC32) Cycle() int64 { - return r.cycle -} - -// Next returns the first PRN after Pos. -func (r *FC32) Next() int { - return r.step(1) -} - -// Pos reports the current position within the inner cycle. -func (r *FC32) Pos() int64 { - return r.pos -} - -// Prev return the first PRN before Pos. -func (r *FC32) Prev() int { - return r.step(-1) -} - -// Seed uses the provided seed value to initialize the generator to a deterministic state. -// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds. -// Still, the FC property holds for any seed value. -func (r *FC32) Seed(seed int64) { - u := uint64(seed) - r.set = mix(r.primes, &u) - n := int64(1) - for i, p := range r.set { - k := make([]int64, p) - v := int64(0) - for j := range k { - k[j] = v - v += n - } - n *= p - r.factors[i] = mix(k, &u) - } -} - -// Seek sets Pos to |pos| % Cycle. -func (r *FC32) Seek(pos int64) { //vet:ignore - if pos < 0 { - pos = -pos - } - pos %= r.cycle - r.pos = pos - for i, p := range r.set { - r.mods[i] = int(pos % p) - } -} - -func (r *FC32) step(dir int) int { - for { // avg loops per step: 3/2 (HQ: 2) - y := int64(0) - pos := r.pos - pos += int64(dir) - switch { - case pos < 0: - pos = r.cycle - 1 - case pos >= r.cycle: - pos = 0 - } - r.pos = pos - for i, mod := range r.mods { - mod += dir - p := int(r.set[i]) - switch { - case mod < 0: - mod = p - 1 - case mod >= p: - mod = 0 - } - r.mods[i] = mod - y += r.factors[i][mod] - } - if y <= r.delta { - return int(y) + r.lo - } - } -} - -func delete(set []int64, i int) (y []int64) { - for j, v := range set { - if j != i { - y = append(y, v) - } - } - return -} - -func mix(set []int64, seed *uint64) (y []int64) { - for len(set) != 0 { - *seed = rol(*seed) - i := int(*seed % uint64(len(set))) - y = append(y, set[i]) - set = delete(set, i) - } - return -} - -func rol(u uint64) (y uint64) { - y = u << 1 - if int64(u) < 0 { - y |= 1 - } - return -} - -// FCBig is a full cycle PRNG covering ranges outside of the int32 limits. -// For more info see the FC32 docs. -// Next/Prev PRN on a 1e15 cycle can be produced in about 2 µsec. -type FCBig struct { - cycle *big.Int // On average: 3 * delta / 2, (HQ: 2 * delta) - delta *big.Int // hi - lo - factors [][]*big.Int // This trades some space for hopefully a bit of speed (multiple adding vs multiplying). - lo *big.Int - mods []int // pos % set - pos *big.Int // Within cycle. - primes []int64 // Ordered. ∏ primes == cycle. - set []int64 // Reordered primes (magnitude order bases) according to seed. -} - -// NewFCBig returns a newly created FCBig adjusted for the closed interval [lo, hi] or an Error if any. -// If hq == true then trade some generation time for improved (pseudo)randomness. -func NewFCBig(lo, hi *big.Int, hq bool) (r *FCBig, err error) { - if lo.Cmp(hi) > 0 { - return nil, fmt.Errorf("invalid range %d > %d", lo, hi) - } - - delta := big.NewInt(0) - delta.Add(delta, hi).Sub(delta, lo) - - // Find the primorial covering whole delta - n, set, pp, p := big.NewInt(1), []int64{}, big.NewInt(0), uint32(2) - if hq { - p++ - } - for { - set = append(set, int64(p)) - pp.SetInt64(int64(p)) - n.Mul(n, pp) - if n.Cmp(delta) > 0 { - break - } - p, _ = NextPrime(p) - } - - // Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta]) - // while keeping the cardinality of the set (correlates with the statistic "randomness quality") - // at max, i.e. discard atmost one member. - dd1 := big.NewInt(1) - dd1.Add(dd1, delta) - dd2 := big.NewInt(0) - dd2.Lsh(dd1, 1) - i := -1 // no candidate prime - if n.Cmp(dd2) > 0 { - q := big.NewInt(0) - for j, p := range set { - pp.SetInt64(p) - q.Set(n) - q.Div(q, pp) - if q.Cmp(dd1) < 0 { - break - } - - i = j // mark the highest candidate prime set index - } - } - if i >= 0 { // shrink the inner cycle - pp.SetInt64(set[i]) - n.Div(n, pp) - set = delete(set, i) - } - r = &FCBig{ - cycle: n, - delta: delta, - factors: make([][]*big.Int, len(set)), - lo: lo, - mods: make([]int, len(set)), - pos: big.NewInt(0), - primes: set, - } - r.Seed(1) // the default seed should be always non zero - return -} - -// Cycle reports the length of the inner FCPRNG cycle. -// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1). -func (r *FCBig) Cycle() *big.Int { - return r.cycle -} - -// Next returns the first PRN after Pos. -func (r *FCBig) Next() *big.Int { - return r.step(1) -} - -// Pos reports the current position within the inner cycle. -func (r *FCBig) Pos() *big.Int { - return r.pos -} - -// Prev return the first PRN before Pos. -func (r *FCBig) Prev() *big.Int { - return r.step(-1) -} - -// Seed uses the provided seed value to initialize the generator to a deterministic state. -// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds. -// Still, the FC property holds for any seed value. -func (r *FCBig) Seed(seed int64) { - u := uint64(seed) - r.set = mix(r.primes, &u) - n := big.NewInt(1) - v := big.NewInt(0) - pp := big.NewInt(0) - for i, p := range r.set { - k := make([]*big.Int, p) - v.SetInt64(0) - for j := range k { - k[j] = big.NewInt(0) - k[j].Set(v) - v.Add(v, n) - } - pp.SetInt64(p) - n.Mul(n, pp) - r.factors[i] = mixBig(k, &u) - } -} - -// Seek sets Pos to |pos| % Cycle. -func (r *FCBig) Seek(pos *big.Int) { - r.pos.Set(pos) - r.pos.Abs(r.pos) - r.pos.Mod(r.pos, r.cycle) - mod := big.NewInt(0) - pp := big.NewInt(0) - for i, p := range r.set { - pp.SetInt64(p) - r.mods[i] = int(mod.Mod(r.pos, pp).Int64()) - } -} - -func (r *FCBig) step(dir int) (y *big.Int) { - y = big.NewInt(0) - d := big.NewInt(int64(dir)) - for { // avg loops per step: 3/2 (HQ: 2) - r.pos.Add(r.pos, d) - switch { - case r.pos.Sign() < 0: - r.pos.Add(r.pos, r.cycle) - case r.pos.Cmp(r.cycle) >= 0: - r.pos.SetInt64(0) - } - for i, mod := range r.mods { - mod += dir - p := int(r.set[i]) - switch { - case mod < 0: - mod = p - 1 - case mod >= p: - mod = 0 - } - r.mods[i] = mod - y.Add(y, r.factors[i][mod]) - } - if y.Cmp(r.delta) <= 0 { - y.Add(y, r.lo) - return - } - y.SetInt64(0) - } -} - -func deleteBig(set []*big.Int, i int) (y []*big.Int) { - for j, v := range set { - if j != i { - y = append(y, v) - } - } - return -} - -func mixBig(set []*big.Int, seed *uint64) (y []*big.Int) { - for len(set) != 0 { - *seed = rol(*seed) - i := int(*seed % uint64(len(set))) - y = append(y, set[i]) - set = deleteBig(set, i) - } - return -} diff --git a/vendor/github.com/cznic/mathutil/tables.go b/vendor/github.com/cznic/mathutil/tables.go deleted file mode 100644 index f32952c..0000000 --- a/vendor/github.com/cznic/mathutil/tables.go +++ /dev/null @@ -1,6995 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// "Static" data - -package mathutil - -var ( - // Set bits count in a byte - popcnt = [256]byte{ - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, // 0 - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 1 - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 2 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 3 - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 4 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 5 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 6 - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 7 - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 8 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 9 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 10 - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 11 - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 12 - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 13 - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 14 - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, // 15 - } - - // Highest set bit index in a byte - log2 = [256]int{ - -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, // 0 - - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 1 - - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 2 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 3 - - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 4 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 5 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 6 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 7 - - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 8 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 9 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 10 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 11 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 12 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 13 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 14 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 15 - } - - // "Predivisors": 2-53 - liars = [3660]uint32{ - 31621, 42799, 49141, 49981, 65077, 65281, 80581, 83333, 88357, 90751, - 104653, 130561, 164737, 188057, 194221, 196093, 215749, 219781, 220729, 253241, - 256999, 271951, 280601, 282133, 357761, 390937, 458989, 486737, 489997, 514447, - 580337, 587861, 611701, 647089, 653333, 657901, 665281, 665333, 688213, 710533, - 721801, 722261, 738541, 741751, 742813, 745889, 769757, 818201, 838861, 873181, - 877099, 916327, 976873, 983401, 1016801, 1018921, 1053761, 1064053, 1073021, 1082401, - 1109461, 1132657, 1145257, 1168513, 1194649, 1207361, 1251949, 1252697, 1302451, 1325843, - 1357441, 1373653, 1397419, 1441091, 1493857, 1507963, 1509709, 1530787, 1584133, 1678541, - 1690501, 1730977, 1735841, 1811573, 1876393, 1969417, 1987021, 2004403, 2081713, 2163001, - 2181961, 2205967, 2261953, 2264369, 2269093, 2284453, 2304167, 2387797, 2487941, 2510569, - 2670361, 2746477, 2748023, 2757241, 2811271, 2909197, 2944261, 2976487, 3048841, 3090091, - 3116107, 3125281, 3225601, 3363121, 3375041, 3400013, 3413533, 3429037, 3539101, 3542533, - 3567481, 3568661, 3605429, 3656449, 3763801, 3828001, 3898129, 3911197, 3985921, 4072729, - 4181921, 4188889, 4209661, 4360621, 4469471, 4480477, 4513841, 4835209, 4863127, 4869313, - 4877641, 4922413, 5016191, 5044033, 5095177, 5173169, 5173601, 5176153, 5256091, 5271841, - 5284333, 5351537, 5489641, 5590621, 5672041, 5919187, 6027193, 6118141, 6140161, 6159301, - 6189121, 6226193, 6233977, 6236257, 6278533, 6334351, 6368689, 6386993, 6631549, 6658669, - 6779137, 6787327, 6836233, 6952037, 6955541, 6998881, 7017193, 7232321, 7306261, 7306561, - 7429117, 7462001, 7674967, 7725901, 7759937, 7820201, 7883731, 8036033, 8095447, 8239477, - 8384513, 8534233, 8725753, 8727391, 8902741, 9006401, 9056501, 9073513, 9131401, 9345541, - 9371251, 9439201, 9480461, 9533701, 9564169, 9567673, 9588151, 9591661, 9729301, 9774181, - 9863461, 10024561, 10084177, 10323769, 10331141, 10386241, 10425511, 10610063, 10700761, 10712857, - 10763653, 10974881, 11081459, 11115037, 11335501, 11541307, 11585293, 11592397, 11777599, 12032021, - 12096613, 12263131, 12322133, 12327121, 12599233, 12854437, 13057787, 13338371, 13446253, 13500313, - 13635289, 13694761, 13747361, 13773061, 14026897, 14154337, 14179537, 14324473, 14469841, 14671801, - 14676481, 14709241, 14794081, 14796289, 14865121, 15101893, 15139199, 15162941, 15188557, 15220951, - 15247621, 15479777, 15525241, 15603391, 15621409, 15700301, 15802681, 15976747, 15978007, 16070429, - 16132321, 16149169, 16153633, 16324001, 16349477, 16360381, 16705021, 16773121, 16822081, 16843009, - 16853077, 16879501, 16973393, 17098369, 17116837, 17134043, 17208601, 17236801, 17327773, 17375249, - 17405537, 17585969, 17870561, 18067501, 18073817, 18366937, 18443701, 18454921, 18535177, 18653353, - 18740971, 19328653, 19384289, 19404139, 19471033, 19607561, 20261251, 20417311, 20647621, 20968501, - 21042001, 21303343, 21306157, 21359521, 21397381, 21400481, 21623659, 21654533, 22075579, 22087477, - 22369621, 22591301, 22669501, 22711873, 22849481, 22953673, 23247901, 23382529, 23464033, 23577497, - 23634181, 23734901, 23828017, 23872213, 23963869, 24214051, 24356377, 25080101, 25150501, 25276421, - 25326001, 25457833, 25629913, 25696133, 25768261, 25909453, 26280073, 26377921, 26821601, 26840269, - 26877421, 26886817, 27108397, 27118601, 27219697, 27271151, 27279409, 27331921, 27380831, 27392041, - 27409541, 27491237, 27509653, 27664033, 27798461, 27808463, 28325881, 28527049, 28572961, 29111881, - 29214541, 29581501, 30022129, 30090817, 30185569, 30219757, 30295141, 30338593, 30388753, 30418957, - 30576151, 30662497, 30740417, 30881551, 30894307, 31040833, 31166803, 31436123, 31735621, 31759121, - 32091781, 32095057, 32168117, 32285041, 32497921, 32676481, 33146717, 33298337, 33600533, 33627301, - 33704101, 33872593, 34003061, 34043101, 34124641, 34540801, 34856167, 34944001, 35576599, 35703361, - 35820937, 35851037, 36291193, 36307981, 36861901, 36919681, 36974341, 37109467, 37376509, 37439201, - 37964809, 37988497, 38010307, 38046817, 38118763, 38210323, 39465091, 39512773, 39655153, 39684157, - 40165093, 40238797, 40315441, 40361197, 40629601, 40782589, 40827473, 40987201, 41121433, 41568101, - 41604109, 41642681, 41662297, 41840809, 42009217, 42485119, 42623017, 42984589, 43224397, 43363601, - 43661257, 44070841, 44314129, 44465221, 44482901, 45100177, 45175201, 45219329, 45414433, 45819541, - 45879941, 46094401, 46325029, 46386589, 46469809, 46517857, 46679761, 46860001, 47220367, 47903701, - 47918581, 48064021, 48191653, 48269761, 48316969, 48400753, 48448661, 48551161, 48563089, 49075417, - 49303801, 49411801, 49459801, 50155733, 50201089, 50443201, 50523661, 51030601, 51129781, 51302353, - 51500521, 52072021, 52119289, 52204237, 53283169, 53399449, 53656021, 53675623, 53695721, 53711113, - 54029741, 54449431, 55109401, 55176097, 55318957, 55729957, 56052361, 56420033, 56479897, 56810137, - 57762433, 58003213, 58422409, 58449847, 58509977, 58679941, 58755877, 59631211, 59840537, 59913157, - 59953741, 60155201, 60352921, 60547831, 60566431, 60581401, 60696661, 60738257, 60957361, 61201009, - 61219789, 61377109, 61832377, 62756641, 63001801, 63002501, 63065281, 63167743, 63318169, 63328469, - 63346999, 63388033, 64148717, 64605041, 64735897, 65144501, 65254393, 65301013, 65350801, 65359477, - 66096253, 67194401, 67642513, 67928221, 68102641, 68154001, 68165761, 68512867, 68621701, 68839597, - 69030901, 69128641, 69176647, 69228967, 69231061, 69485281, 69612061, 69885649, 70149631, 70463489, - 70593931, 70728121, 71079661, 71734417, 72498253, 72543547, 73562833, 73645001, 74411131, 74927161, - 75140137, 75565873, 76725091, 76745101, 77533123, 77648941, 77812153, 77817979, 78939089, 79398901, - 79411201, 79417801, 79464533, 79786523, 80142761, 80146909, 80375707, 80556337, 80687881, 80891009, - 81433591, 81954133, 82273201, 82506439, 82870517, 82929001, 83083001, 83103329, 83204801, 84164033, - 84350561, 84421081, 84487457, 84998503, 85328717, 85519337, 85823401, 86027329, 86438857, 86530621, - 86999837, 87499651, 87694261, 88256449, 88368853, 88661861, 89308771, 89784581, 90270613, 90278161, - 90341197, 90665789, 90698401, 91433281, 91659283, 92438581, 92625121, 93431521, 93541537, 93571633, - 93643201, 93677761, 93926197, 94316401, 94502701, 95451361, 95452781, 96135601, 96618397, 96791881, - 96888641, 96895441, 96904081, 96925921, 97255801, 97496449, 97796953, 97863529, 97924217, 99036001, - 99115297, 99486889, 99789673, 99898801, 100463443, 100618933, 100943201, 101152133, 101218921, 101270251, - 101276579, 101649241, 102004421, 102678031, 102690677, 102690901, 103301633, 104078857, 104524421, 104988673, - 105305443, 105919633, 106485121, 106622353, 106743073, 107360641, 107543333, 108596953, 109231229, 109437751, - 109541461, 109879837, 110135821, 110139499, 110312773, 110413333, 110717861, 111370141, 111654401, 112032001, - 112402981, 112828801, 113589601, 113605201, 113730481, 113892589, 114305441, 114329881, 114701341, 114842677, - 114910489, 115039081, 115174681, 115497901, 115804501, 115873801, 116090081, 116321617, 116617289, 116682721, - 116696161, 116998669, 117987841, 118466401, 118901521, 119092801, 119204809, 119261113, 119327041, 119558011, - 119743537, 119940853, 120296677, 120517021, 120838609, 121062001, 121374241, 121472359, 121609489, 122166307, - 122396737, 122941981, 123481777, 123671671, 123877081, 123987793, 124145473, 124630273, 124818601, 125284141, - 125686241, 125848577, 126132553, 127050067, 128079409, 128124151, 128396921, 128468957, 128665319, 128987429, - 129205781, 129256273, 129357061, 129461617, 129524669, 130556329, 130693393, 130944133, 131023201, 131567929, - 131938561, 132332201, 132338881, 132440521, 132575071, 133216381, 133302781, 133467517, 133800661, 134696801, - 134767153, 134868029, 135263269, 135296053, 135308881, 135945853, 135969401, 136043641, 136661201, 136722433, - 137415821, 137763037, 138030721, 138403981, 138828821, 139295701, 139487041, 140197051, 142525333, 142922413, - 143106133, 143168581, 145348529, 146156617, 146272901, 146659801, 146843929, 146884393, 147028001, 147287141, - 148109473, 148171769, 148910653, 149389633, 150379693, 150960239, 150988753, 151533377, 151589881, 152716537, - 152922001, 152991841, 153369061, 153589801, 153754873, 153928133, 154287451, 154513633, 154944533, 155203361, - 156114061, 156532799, 157069189, 157368661, 157405249, 157725829, 158068153, 158192317, 158397247, 158496911, - 158544401, 158895281, 160348189, 160378861, 160491329, 160587841, 160672201, 160730389, 161184013, 161216021, - 161289649, 161304001, 161423377, 162026869, 162067441, 162690481, 162771337, 162776041, 163442551, 163954561, - 164111281, 165061909, 165224321, 165938653, 166082309, 166339057, 166406561, 166827943, 167579497, 167582377, - 167692141, 167881121, 168566501, 169655641, 170640961, 170782921, 170856533, 171454321, 172116181, 172436713, - 172947529, 173401621, 174479729, 176030977, 176597821, 176609441, 176977921, 177167233, 177254533, 177693521, - 177927641, 177951973, 178837201, 178956971, 179083601, 179285137, 179820257, 180115489, 180497633, 180703451, - 181285001, 181285537, 181542601, 181647497, 182383111, 183677341, 184411567, 185653333, 186183469, 186393481, - 186983521, 187050529, 187667969, 187761241, 188516329, 188985961, 189714193, 189738361, 189941761, 190212181, - 190382161, 190913297, 191233813, 191648161, 191981609, 192346153, 192857761, 193330237, 193638337, 193949641, - 194556451, 196035001, 196049701, 196231393, 198982759, 199674721, 200143351, 200753281, 201261061, 202130197, - 202156813, 202538857, 203505697, 204280501, 204582457, 204766381, 205057561, 206304961, 206453509, 206504033, - 206529737, 207008569, 207030541, 207132481, 207477001, 207618781, 208051201, 208969223, 209246701, 209404369, - 209990881, 210592873, 210842113, 213035761, 214038533, 214110541, 214852609, 214858717, 215436241, 216821881, - 217123069, 217875571, 218603617, 218642029, 218947121, 219621781, 220531501, 220883521, 221368153, 221415781, - 221884001, 222010721, 222630193, 223449463, 223625851, 223782263, 224074369, 224136013, 224769241, 224957893, - 225853633, 226359547, 226450297, 227132641, 227444101, 227475481, 228652201, 228842209, 228988033, 229589413, - 230357761, 231383461, 231405701, 231927781, 232114433, 232460821, 232771501, 233110081, 234869009, 235426913, - 235928071, 237791143, 238001653, 238833421, 240068041, 240371713, 240694513, 240785047, 241505377, 242067841, - 242650717, 242860069, 243583201, 243955141, 244883981, 245006623, 245950561, 246099317, 246282511, 246434761, - 246658441, 247318957, 247321301, 247416101, 249582481, 250436033, 250958401, 250988173, 251528401, 251663837, - 251855893, 252853921, 253610281, 253893397, 255416897, 256831433, 257590661, 258020473, 258043229, 258234401, - 258944401, 259763093, 259765747, 260156101, 260518801, 260736341, 260963389, 261186001, 261703417, 262979501, - 263428181, 264269449, 264384469, 265020001, 265584133, 265735969, 265836161, 266790481, 266925601, 270525737, - 271272569, 271763467, 271826629, 271950829, 273361789, 273480637, 274701913, 274810241, 274919401, 275283401, - 275619961, 276018913, 276131137, 276542401, 276638321, 277787141, 278943061, 279377281, 280885153, 282253141, - 282471853, 282769771, 283900961, 284166877, 284301751, 284736091, 284834299, 285820501, 286316801, 287160301, - 287449091, 287715121, 288099001, 288117721, 288735277, 290643601, 290706781, 290953921, 291088513, 291461633, - 292153681, 292290181, 292433321, 292902481, 293346637, 293847721, 293938261, 295419097, 295743017, 297624961, - 297798961, 298212601, 299367877, 299736181, 301413001, 302635351, 304080001, 307629401, 307694323, 307972801, - 308483209, 309666361, 310474249, 310978027, 311177213, 311411629, 311655829, 311671361, 312408113, 312614021, - 314184487, 315034513, 315351521, 317137969, 317365933, 317641171, 317796119, 319053281, 319374577, 319440769, - 319726177, 320326003, 321324589, 321850849, 322469701, 322941881, 324477697, 325028089, 325352101, 325546873, - 326266051, 326405713, 326469137, 326628721, 326694301, 326695141, 327073601, 327093409, 327398009, 328302901, - 329153653, 329769721, 330198331, 330759617, 331658081, 331934989, 337135501, 337420679, 337665901, 337783981, - 338125537, 338458807, 338914369, 339195097, 339492169, 339794641, 341958121, 341994131, 343017529, 343052833, - 344201441, 344255551, 344776301, 346080391, 348989101, 349752913, 350031973, 350244577, 351058753, 351177769, - 352802803, 352932337, 353815801, 353932801, 354062809, 356604421, 356836819, 357348601, 357872971, 358416577, - 359394751, 359727073, 360145633, 360375181, 360787771, 361307521, 361312337, 362569201, 363170837, 363430637, - 364550761, 365077373, 365231401, 366487201, 366532321, 366652201, 367559501, 367632301, 368016949, 368476501, - 369667561, 371011801, 371611153, 372167101, 373012777, 373533617, 373669453, 373906513, 374346361, 374988661, - 376957153, 377192353, 377334497, 377458849, 377806687, 377869031, 378792649, 379732501, 380137633, 382304161, - 384100001, 385175113, 385319089, 387072661, 388695301, 390609941, 390612221, 391014937, 392679737, 393611653, - 394723177, 396864469, 399156661, 399302581, 399647221, 400385701, 400557109, 401100881, 403095967, 403293313, - 405739681, 405782623, 407737201, 407889161, 409302001, 409458241, 410613809, 410680357, 411618241, 411851389, - 412836689, 413138881, 413429801, 413778817, 414216461, 414368641, 415200361, 415204501, 415476343, 416964241, - 417767201, 417779909, 418044563, 418226581, 418616161, 418617281, 418667401, 419184481, 420607441, 421942951, - 422429041, 422928101, 423384001, 423465001, 424175761, 424411501, 424431541, 425967301, 426174101, 426219649, - 426770437, 426783811, 427294141, 428180191, 428758201, 429135841, 429509837, 430046857, 430381921, 430646401, - 430733701, 432227449, 434042801, 435016187, 435358657, 435993301, 436465501, 437247841, 437462101, 437597101, - 437866087, 439309261, 441354497, 441650591, 441758461, 442050577, 442181291, 442543553, 444660421, 445429693, - 446414621, 446619617, 449501761, 450807481, 450866021, 450872573, 452990401, 453366029, 453967739, 454745773, - 455198563, 457274161, 457320533, 459785089, 460251733, 460585861, 461151121, 461272267, 461329601, 462587329, - 462639409, 462701513, 464012033, 464955857, 465505633, 466290949, 466758181, 467100937, 468410113, 468950021, - 470120257, 470268137, 470644021, 471535373, 471664513, 472814413, 473581057, 474892741, 474970501, 474983881, - 475723849, 478614067, 479962009, 480668347, 481153501, 481239361, 482488393, 482824669, 482921297, 483006889, - 483029821, 483945601, 484200289, 486063001, 486902929, 487896601, 488104681, 488169289, 488585521, 488656981, - 489994201, 490950461, 491738801, 493108481, 494288677, 495909871, 496109729, 496560349, 497148599, 497285713, - 498662561, 498706651, 498905189, 500747293, 501172241, 501472333, 502686713, 504870241, 505473263, 505532773, - 505798213, 506349421, 507142567, 507323521, 508606771, 509302873, 509551201, 510925609, 511098521, 511215521, - 511611673, 512330281, 514738981, 516045197, 516259657, 516764063, 517662001, 518216201, 518548801, 521501473, - 522390109, 522758233, 523756711, 526067821, 526359289, 526686889, 528013333, 528043753, 528220117, 530630701, - 531095029, 531681281, 532126801, 532758241, 532800133, 533429881, 534782293, 535252867, 535428577, 535517581, - 536003333, 536114197, 536342419, 536870911, 540207097, 540621181, 540654409, 540680141, 542497201, 542536457, - 544861633, 545550433, 545622401, 546102481, 546117301, 546322201, 548080513, 548989561, 549308761, 550132741, - 550230409, 550635373, 550853137, 551313001, 552573793, 553027201, 554487121, 554599051, 554964001, 555321007, - 555465601, 556001377, 556069849, 556095433, 556114609, 557165209, 558235109, 558900821, 558977761, 561448487, - 562367821, 563298061, 563947141, 564298489, 564689381, 565664761, 565707061, 567358513, 567596401, 568902001, - 568967221, 569332177, 569495809, 570941881, 572123521, 572228929, 572430769, 572567353, 572936869, 573817861, - 573862021, 574998841, 575326033, 576724219, 577210181, 577352641, 577613261, 579606301, 579956653, 581618143, - 582389641, 582799951, 585261637, 586706821, 587343541, 588049001, 591242653, 591822001, 592467451, 592468777, - 593682169, 593728489, 595405201, 595590841, 597537361, 597717121, 599135767, 599945293, 600893921, 601606487, - 602379181, 604584221, 605454917, 605961049, 606872449, 607148653, 607750681, 608421637, 608917753, 609361567, - 609813781, 611097401, 611374453, 611770513, 611812321, 611817421, 612006253, 613849601, 614742241, 615361183, - 615760133, 615895897, 616280897, 617087701, 619239457, 619365121, 619480601, 620169409, 620544961, 620755537, - 621769669, 622137601, 623735953, 624303241, 624732421, 625060801, 625482001, 626717471, 627886657, 628868467, - 629134081, 630496621, 630622753, 630811513, 631767943, 631974613, 633289807, 635155291, 635291077, 635319361, - 636287653, 636337073, 636936697, 638502913, 638837761, 639305921, 639807781, 640650931, 640977373, 643036321, - 643316461, 643552909, 644004817, 644453633, 644457551, 644731357, 644900257, 645556481, 648056449, 648328801, - 651011329, 651064681, 651151801, 651514753, 652469641, 653235841, 653260633, 655264369, 657732349, 659526601, - 659846021, 660095641, 660754117, 661122881, 661207177, 662134201, 663760681, 665462081, 668498321, 670976641, - 670987021, 671716921, 672103001, 672108193, 673778827, 675260477, 676359391, 678481693, 680983817, 681019921, - 681124207, 681303241, 682528687, 683316001, 683362681, 684350833, 686059921, 687741401, 689537441, 690035713, - 690562601, 691131349, 692535637, 693456521, 694116893, 696042901, 696321949, 696998251, 697821857, 698192041, - 698819711, 702683101, 705303457, 705351583, 706728377, 707691601, 709409993, 710382401, 710617861, 710721001, - 714490481, 717096641, 717653129, 717831211, 720767521, 722955773, 724160251, 724969087, 725508241, 731276521, - 732805681, 734166217, 736668013, 739444021, 739576801, 740988151, 741182401, 741214237, 742017181, 742550401, - 744500641, 745493761, 745745461, 746331041, 747406801, 748638001, 749172821, 749640161, 750632137, 751226401, - 751705597, 752186593, 753233717, 753574537, 753594001, 754020361, 754874257, 756205633, 756271909, 756980137, - 758581651, 758687581, 758901701, 759252367, 759266621, 759638881, 762699649, 763907741, 764033999, 764240611, - 765378241, 766303693, 766823797, 770201221, 770909107, 770937931, 771043201, 771337891, 772495777, 773131927, - 773807401, 775368901, 775896181, 776443769, 777218989, 781471001, 782823281, 784450393, 784777393, 784783477, - 784966297, 787085857, 787209277, 788046901, 788931361, 789082001, 790453049, 791118043, 792144161, 792145729, - 794201333, 794399041, 794937601, 795064909, 796072003, 796200901, 796560703, 797418997, 797834017, 799162561, - 799630753, 799898833, 799916101, 801093011, 801227269, 801866647, 804978721, 805505957, 805771501, 807115753, - 807218413, 808214161, 809790881, 810023881, 810455101, 811110301, 811478533, 811607777, 811730923, 815430533, - 815796413, 816024161, 816215401, 816549121, 817832329, 818401321, 819466201, 819743233, 822018961, 822531841, - 824389441, 826004467, 829512001, 830664451, 831933901, 832048447, 832127489, 832169857, 833610751, 837766217, - 839268139, 839280691, 839908217, 840749761, 841217653, 841660961, 842785841, 842824981, 842960981, 843161887, - 844545271, 845376533, 846961321, 848090377, 848755969, 849548671, 852432769, 854094781, 854868257, 855734401, - 857100421, 857902861, 858687103, 859096477, 860334301, 862082677, 862678081, 863196181, 863609113, 863984881, - 865242841, 867022747, 867110501, 867638201, 868088341, 868111597, 868691401, 870985223, 871157233, 871195561, - 871908481, 876850801, 877542481, 878492941, 878940833, 879995689, 880870513, 880922657, 883276549, 884304037, - 884952001, 886180429, 887795221, 888868441, 892740853, 893692819, 894264337, 896901461, 897087361, 897283213, - 899019353, 900736411, 901848301, 902566501, 903108821, 903390643, 905040953, 907378669, 907670501, 907711561, - 908005249, 910202509, 910867481, 911484421, 914348737, 914906539, 920375821, 920696653, 921858631, 922845241, - 923437213, 926756881, 927106561, 927877001, 929159941, 930530701, 932148253, 933729421, 935794081, 936421141, - 937675393, 938376181, 939947009, 940123801, 941056273, 941734657, 943271569, 944832533, 946034057, 946787377, - 947878081, 949317217, 949697233, 952893881, 954924013, 957600541, 957631249, 958131157, 958735681, 960269377, - 960946321, 962442001, 962489557, 962523169, 964412837, 965501857, 967266451, 967287751, 967790401, 968283247, - 968413217, 968751241, 969528337, 970586713, 971975071, 974113601, 974471243, 974774401, 975576281, 976396961, - 977483449, 979363153, 980056507, 980725201, 981484561, 983456377, 984133441, 984252001, 985052881, 985075681, - 987842101, 994133479, 995586373, 995650921, 997836841, 998489017, 998590601, 998596741, 998724481, 999828727, - 1002261781, 1003062061, 1005402133, 1005833971, 1006800829, 1008777001, 1008839999, 1009025263, 1009140161, 1011319501, - 1011333061, 1011570457, 1011909271, 1012438391, 1013833153, 1015339441, 1015626151, 1017748057, 1020515761, 1021281301, - 1022336611, 1024041853, 1024123501, 1024605121, 1025035129, 1026738161, 1027744453, 1028494429, 1034252929, 1034958601, - 1040234231, 1049584313, 1050102901, 1050535501, 1054999441, 1055009117, 1056121453, 1057426651, 1063212481, 1065508321, - 1065602281, 1066972301, 1069388497, 1070639389, 1070941987, 1071512749, 1071643249, 1072898711, 1073159281, 1073288581, - 1073484823, 1075100041, 1077133397, 1078467589, 1081798061, 1082472553, 1084241341, 1084444481, 1090858081, 1093150081, - 1093352833, 1093526353, 1094042321, 1097416321, 1098743563, 1100624857, 1101623381, 1101673501, 1102573501, 1102750013, - 1104194521, 1105038871, 1106529761, 1106580817, 1106595493, 1107138961, 1108135381, 1109304913, 1110582947, 1111205873, - 1111939201, 1112671603, 1114277221, 1116379301, 1117202557, 1117785881, 1117828001, 1117890019, 1119412321, 1120076281, - 1120981021, 1121176981, 1123406047, 1123625501, 1123727617, 1124396521, 1125038377, 1127040769, 1130933429, 1134367777, - 1138289041, 1138607233, 1139137057, 1140573601, 1142466151, 1147434289, 1148578201, 1150229761, 1151670001, 1153164097, - 1153440289, 1154343961, 1154691409, 1154987209, 1155939709, 1156761911, 1156993373, 1157839381, 1159421509, 1160844821, - 1163098249, 1163227759, 1164218641, 1165717129, 1166475601, 1166598217, 1168221121, 1168256953, 1168492417, 1173229201, - 1173545533, 1174300093, 1180970407, 1181566219, 1183338241, 1184554801, 1186325981, 1187235193, 1191153937, 1191216133, - 1192314817, 1192412033, 1192903531, 1193229577, 1193557093, 1195524181, 1196852273, 1198650961, 1198880261, 1200456577, - 1200778753, 1202142061, 1204205449, 1205606533, 1205772499, 1209998077, 1210393801, 1210562701, 1210653541, 1213619761, - 1217181061, 1217823517, 1217924159, 1219816261, 1219858921, 1220114377, 1221127013, 1222861271, 1223531677, 1223941657, - 1225128829, 1226230297, 1226855293, 1227220801, 1229491063, 1229751667, 1230446653, 1231362793, 1232445677, 1234125721, - 1234646533, 1235188597, 1235864033, 1236313501, 1236442421, 1238825569, 1242171349, 1242858317, 1249166881, 1249785941, - 1250656621, 1252236421, 1254277909, 1255665613, 1257102001, 1258903981, 1260332137, 1263293281, 1264145401, 1265477791, - 1266003461, 1266273793, 1266425101, 1267345081, 1269295201, 1269835201, 1270193401, 1270489621, 1270667353, 1272558739, - 1272866167, 1282447477, 1282568741, 1285636801, 1286298133, 1286298263, 1296613501, 1297443913, 1299072721, 1299784141, - 1299963601, 1301509249, 1301926081, 1302745481, 1306836001, 1307004641, 1307520469, 1307823661, 1308758533, 1308998741, - 1309723213, 1309983901, 1310329567, 1311255661, 1311616153, 1312332001, 1312573123, 1313396221, 1315858381, 1316169541, - 1318126321, 1318717531, 1319978701, 1319992181, 1320793813, 1321058213, 1323668917, 1325172421, 1325329297, 1328256247, - 1329174601, 1329431689, 1331973329, 1341010577, 1341926401, 1343575381, 1344597577, 1344975721, 1345514101, 1345523401, - 1347387361, 1348964401, 1350685001, 1351126261, 1352453257, 1353051517, 1356241321, 1356328121, 1357459183, 1362463807, - 1362515701, 1362742561, 1365662917, 1366587661, 1366608377, 1368769681, 1371908137, 1372681861, 1375322101, 1376799577, - 1378646179, 1379464633, 1382453333, 1383283129, 1385656829, 1386705433, 1388972353, 1389353941, 1389975149, 1391890033, - 1393851553, 1394640941, 1394746081, 1394942473, 1397357851, 1398883201, 1400859847, 1401840833, 1404008369, 1404253369, - 1406826241, 1406851249, 1409372779, 1413803197, 1414154827, 1414529533, 1415969101, 1417986901, 1421475031, 1424503849, - 1425860101, 1426319563, 1426534201, 1427771089, 1428966001, 1432354901, 1435091377, 1438648993, 1440231941, 1440922891, - 1441139641, 1441678411, 1442945689, 1443388481, 1443742273, 1446298309, 1446434677, 1446818651, 1448921633, 1451635201, - 1454282449, 1454445413, 1456527461, 1457378449, 1461307717, 1463065501, 1463178817, 1463992661, 1464568381, 1465908193, - 1465945417, 1468540477, 1468824787, 1469059481, 1469960377, 1470080501, 1470650851, 1471628401, 1472221921, 1473580001, - 1477289941, 1481626513, 1482274513, 1482876673, 1483873861, 1483918801, 1485061471, 1486564301, 1493114149, 1495190699, - 1497221281, 1497965713, 1499971457, 1499989177, 1500142001, 1501165097, 1502171117, 1502403121, 1503240559, 1503705601, - 1504139521, 1504832033, 1507746241, 1509156013, 1510870241, 1511558533, 1515175087, 1515785041, 1517039371, 1518014689, - 1518290707, 1520190341, 1521221473, 1522302121, 1526732803, 1529648231, 1529819971, 1530495289, 1532419099, 1532569681, - 1532755369, 1533343261, 1534063081, 1535020133, 1536112001, 1536251047, 1536883357, 1537433899, 1537641691, 1538012449, - 1539583921, 1539804001, 1540454761, 1540550413, 1541047813, 1541849761, 1541955409, 1544145121, 1545019813, 1545177581, - 1546106773, 1546340401, 1546508057, 1547140841, 1547543161, 1547712601, 1550924873, 1554270481, 1557118081, 1560312001, - 1560620041, 1561800833, 1565893201, 1566594551, 1567830241, 1568916311, 1574362441, 1574601601, 1577983489, 1578009401, - 1580449201, 1581576641, 1581714481, 1582783777, 1583230241, 1583658649, 1586436193, 1587650401, 1590394313, 1593706201, - 1595647351, 1595887921, 1598197201, 1602517949, 1603765021, 1603810561, 1603994701, 1609916491, 1609935913, 1612121473, - 1614508267, 1617795181, 1617921667, 1619447741, 1620646177, 1627103521, 1627898401, 1628692201, 1630062253, 1630307617, - 1631314609, 1632286673, 1632513601, 1633044241, 1636185601, 1637434657, 1637436457, 1637930893, 1638294661, 1639351981, - 1639846391, 1641971701, 1642814653, 1644637051, 1645413001, 1647225529, 1648076041, 1649430889, 1650265549, 1650682153, - 1654940509, 1655660761, 1656229921, 1656280033, 1656917377, 1659009601, 1661202113, 1668037621, 1668926629, 1669893661, - 1671603667, 1671714241, 1672125131, 1674091141, 1674658133, 1675978193, 1678274581, 1679130641, 1680901381, 1683174533, - 1685433413, 1686001861, 1687248001, 1691745821, 1692605041, 1694128129, 1695158921, 1696893101, 1698707377, 1699279441, - 1700250049, 1709909293, 1710753001, 1712392321, 1714322377, 1716160321, 1716714793, 1716774481, 1718013133, 1718088301, - 1719197621, 1721061497, 1721986313, 1722007169, 1722685777, 1725675451, 1726372441, 1731048937, 1731995497, 1732924001, - 1734059291, 1734285601, 1735071913, 1736481601, 1738687469, 1740214841, 1742288881, 1742815621, 1743166441, 1744605097, - 1746692641, 1746721681, 1749124829, 1750412161, 1754818561, 1757148121, 1760014561, 1766984389, 1767234613, 1769091241, - 1769267761, 1770236893, 1771303801, 1772267281, 1773582977, 1776439261, 1776820033, 1779649381, 1779892577, 1784306273, - 1784638309, 1785843547, 1786005521, 1787934881, 1790023861, 1791426787, 1792442737, 1792588813, 1794814103, 1801558201, - 1801774081, 1802510669, 1803768091, 1804906517, 1805947313, 1809888967, 1816408273, 1817067169, 1819829749, 1820306953, - 1821514633, 1828682101, 1828887061, 1831258601, 1835114401, 1837156049, 1837599769, 1839568981, 1841034961, 1841099261, - 1841479501, 1844028961, 1846171781, 1847811673, 1849964117, 1850233897, 1850598961, 1852496761, 1853926777, 1854084649, - 1854940231, 1856689453, 1857221281, 1858098497, 1858197961, 1860373241, 1861026133, 1861880689, 1862880401, 1866409861, - 1867906721, 1868682241, 1871987041, 1872937057, 1873177693, 1874634721, 1874849929, 1878691753, 1879111697, 1879623157, - 1879775501, 1883509633, 1883785681, 1885915841, 1894909141, 1894955311, 1897700113, 1899081757, 1899525601, 1900687381, - 1903447841, 1904658913, 1905958891, 1908088001, 1909566073, 1910134309, 1911197947, 1912950241, 1914303841, 1915391521, - 1916987593, 1917397637, 1920301951, 1921309633, 1922092567, 1922687293, 1923224689, 1923311317, 1923845801, 1924201501, - 1925042737, 1928903971, 1929862849, 1930403333, 1930447501, 1930534453, 1930915169, 1934350351, 1938264241, 1940048881, - 1943951041, 1944125633, 1945042181, 1950987193, 1952513369, 1952968753, 1957705177, 1959659857, 1960708261, 1963149553, - 1965007601, 1968002149, 1970065681, 1974474049, 1977257441, 1982123893, 1982826961, 1988071801, 1988713189, 1988835713, - 1988965861, 1989192277, 1991063449, 1995784961, 1995830761, 1996231189, 1996339649, 1997844157, 1998780001, 1999053601, - 1999111801, 1999743661, 2004299641, 2007646961, 2013554869, 2013834961, 2016481477, 2017021333, 2017509601, 2019564769, - 2021392369, 2021884343, 2027675701, 2028279793, 2028631361, 2028812399, 2029830409, 2030600833, 2036224321, 2043173273, - 2049293401, 2050617713, 2052149221, 2054711381, 2055634561, 2057267941, 2057835781, 2058072041, 2059739221, 2062612033, - 2068867841, 2070739441, 2072624761, 2076192007, 2081039297, 2081551753, 2082146617, 2083034113, 2083997441, 2085453649, - 2085882661, 2086645009, 2093300401, 2095627153, 2096046457, 2097317377, 2100292841, 2101470541, 2101744837, 2104994449, - 2106147457, 2107148761, 2114643217, 2115769633, 2115986557, 2116483027, 2116541221, 2117031263, 2117555641, 2118621097, - 2120096161, 2123601751, 2124078653, 2124691213, 2127197489, 2128104001, 2129304997, 2130134533, 2131004737, 2131811501, - 2140699681, 2140771609, 2141340833, 2144961253, 2147418113, 2147429509, 2152627801, 2154446641, 2155416251, 2156151313, - 2164282177, 2168431201, 2170282969, 2172155819, 2173499329, 2173540951, 2173579801, 2175126601, 2175406201, 2175646177, - 2177374321, 2177645557, 2178082901, 2178939221, 2180221201, 2182281601, 2182802689, 2185362233, 2187717761, 2193980881, - 2199617701, 2200115713, 2201924341, 2202101761, 2202205897, 2203649197, 2203856497, 2206095589, 2210578759, 2213431729, - 2216960929, 2217879901, 2219072017, 2224252801, 2229468697, 2231332357, 2233031701, 2240507821, 2241880033, 2241982009, - 2244932281, 2245519981, 2246762899, 2248354153, 2251732033, 2254314241, 2254757077, 2256197761, 2256748777, 2256751837, - 2262861901, 2269307587, 2274584089, 2283289681, 2284416181, 2289251669, 2289624793, 2290316377, 2290910257, 2291205461, - 2292068143, 2295209281, 2296995121, 2299190401, 2300628601, 2300795353, 2301745249, 2304120001, 2308966661, 2309241601, - 2309405617, 2311558021, 2311575001, 2315137261, 2320527613, 2323147201, 2324867399, 2329584217, 2330569541, 2331181621, - 2335341601, 2338157597, 2338728001, 2340460487, 2345907961, 2347597981, 2352371251, 2354453561, 2355230749, 2355320101, - 2355622721, 2355649921, 2355735089, 2358534361, 2360261989, 2370771181, 2370928337, 2371350101, 2372976563, 2374232977, - 2375415841, 2377166401, 2378309041, 2381782597, 2382678101, 2383164577, 2385574201, 2389072321, 2389544977, 2393708761, - 2394311233, 2398393661, 2404912501, 2411128441, 2412172153, 2412675721, 2413973071, 2422296241, 2423401681, 2425249601, - 2428648967, 2428870753, 2428986913, 2429407961, 2430697513, 2431136401, 2431144801, 2432761633, 2432860273, 2433791593, - 2434964321, 2434974433, 2435091221, 2436691321, 2437907779, 2438778413, 2442050353, 2442454561, 2443708961, 2444950561, - 2448039497, 2448374689, 2453473049, 2454285751, 2456536681, 2457846161, 2463713281, 2471205361, 2473120961, 2473189441, - 2473823353, 2474308069, 2474676949, 2476283239, 2477814193, 2478643907, 2480147521, 2480343553, 2482435981, 2482682131, - 2484408301, 2486017249, 2488420801, 2488591117, 2492480233, 2494660033, 2494984321, 2495834329, 2499327041, 2501012599, - 2501771329, 2502525637, 2504008609, 2506529257, 2506733189, 2507121037, 2508178843, 2513230891, 2516684801, 2519297089, - 2525070241, 2526566041, 2528291341, 2529410281, 2529827821, 2529854713, 2530351561, 2532630787, 2533465661, 2533797017, - 2535516173, 2537105761, 2539406281, 2539736257, 2540469901, 2541660367, 2542479481, 2544590161, 2545934077, 2548051801, - 2550139253, 2550780277, 2551365769, 2552418761, 2553272929, 2555391481, 2561945401, 2564536201, 2565186137, 2570087521, - 2571180247, 2575060949, 2575737361, 2577345541, 2582092189, 2582246701, 2582952769, 2583322381, 2584460701, 2588054401, - 2588582089, 2590663681, 2593065721, 2595276353, 2597289241, 2597294701, 2598933481, 2600611861, 2602343521, 2602378721, - 2604465013, 2604803701, 2611122229, 2611461529, 2613382201, 2614688801, 2616180821, 2617563031, 2621080741, 2621977627, - 2622993661, 2624549929, 2625903601, 2626783921, 2627284987, 2630643401, 2632605049, 2634284801, 2634804481, 2634820813, - 2638067881, 2639099233, 2642159809, 2642582251, 2646751249, 2646790033, 2648662777, 2649907201, 2650820329, 2651507713, - 2654716321, 2656494271, 2658630913, 2658696301, 2659265701, 2668095181, 2668469431, 2670972949, 2672605657, 2672651521, - 2676053333, 2677147201, 2677821121, 2678785621, 2681041843, 2682823681, 2683742491, 2684284441, 2687655169, 2688124001, - 2689427281, 2690408533, 2690867401, 2693739751, 2695115473, 2700818017, 2700891839, 2701878941, 2704957909, 2706863833, - 2707661501, 2716157989, 2716275007, 2717428033, 2719319513, 2721666817, 2721721939, 2723859001, 2725357249, 2733156029, - 2736316301, 2738184697, 2740336561, 2744329909, 2746021741, 2753333227, 2753538001, 2759392633, 2765323397, 2766006253, - 2767672189, 2769080161, 2769602333, 2774295577, 2777887297, 2778304273, 2779477741, 2781117721, 2781226477, 2786028337, - 2787998641, 2789218909, 2800352011, 2805762961, 2809635901, 2812672981, 2814748201, 2823570433, 2824256377, 2824804693, - 2824854913, 2828205397, 2832384133, 2832743713, 2837697773, 2837917633, 2840634109, 2840871041, 2841190381, 2847894377, - 2848466281, 2848722131, 2855046421, 2855071801, 2855512909, 2862066481, 2865483601, 2866005139, 2866527841, 2870377309, - 2871536561, 2872527733, 2872948321, 2874382853, 2877769501, 2881429741, 2882370481, 2885594497, 2887955533, 2890316801, - 2890414873, 2892426029, 2894667781, 2895004927, 2899294889, 2903776129, 2915953633, 2916247819, 2918295451, 2920691161, - 2923042141, 2924158001, 2929062533, 2929106753, 2930831641, 2931708097, 2932327549, 2936227603, 2936958181, 2941174897, - 2941343633, 2944555681, 2944677961, 2945208001, 2945549881, 2951136343, 2956724317, 2957320351, 2965700233, 2967053953, - 2968206601, 2974506841, 2975377429, 2976930001, 2978766341, 2980689601, 2986025677, 2987414977, 2990152901, 2993462713, - 2993495041, 2994098281, 2994415201, 2998202353, 2998919873, 3000688381, 3001561441, 3002647829, 3004443679, 3009628301, - 3011421841, 3014101261, 3015502181, 3016957381, 3017444761, 3018147217, 3018576689, 3019916461, 3025350343, 3026575553, - 3028586471, 3030393901, 3033332641, 3034402681, 3034817209, 3035375047, 3036079729, 3037295801, 3037781251, 3038880473, - 3039681457, 3041984353, 3042630533, 3048159841, 3050190163, 3056100623, 3056160929, 3057886591, 3058670677, 3059397793, - 3063685633, 3065998717, 3076505209, 3077122133, 3079496551, 3082054697, 3082068013, 3083053387, 3083537689, 3083884651, - 3088408429, 3089013313, 3091019777, 3094763851, 3099670657, 3103800701, 3112974481, 3114125071, 3115667521, 3120445697, - 3122287981, 3129914881, 3133899409, 3135040133, 3143282221, 3145410761, 3150972917, 3156599161, 3156643141, 3157579861, - 3163106953, 3166504273, 3167442721, 3170262409, 3172658653, 3175204531, 3175255717, 3178375201, 3181356263, 3181391641, - 3182606857, 3182655361, 3182891401, 3185472001, 3187035113, 3187421077, 3187939921, 3196397821, 3196431829, 3197565001, - 3197632441, 3197911001, 3197911741, 3199164901, 3205663921, 3207297773, 3208902491, 3212465437, 3215031751, 3217412881, - 3219808411, 3221580281, 3222693421, 3224143441, 3225081473, 3227082823, 3227209057, 3229131137, 3233558021, 3237992101, - 3242533897, 3248236309, 3250348417, 3250700737, 3252148621, 3257334541, 3258647809, 3258892801, 3261114601, 3263097641, - 3263568901, 3263626957, 3264820001, 3265122451, 3267417677, 3268506541, 3268841941, 3270933121, 3271999249, 3272030401, - 3272702497, 3274264033, 3275671969, 3276075709, 3277047649, 3278640289, 3280067129, 3282974857, 3287174129, 3288757249, - 3295362727, 3296403601, 3299246833, 3302322241, 3304307341, 3305829073, 3306686659, 3306957593, 3310858777, 3312489577, - 3312536569, 3313196881, 3315139717, 3320669437, 3323308501, 3323590463, 3323829169, 3328354801, 3332800021, 3334350781, - 3340214413, 3342005633, 3344191241, 3346172189, 3347908801, 3349218881, 3350993969, 3352091557, 3355382857, 3355953001, - 3357417181, 3359737921, 3360511981, 3369139201, 3371024521, 3371452921, 3371693063, 3372667121, 3373086601, 3381052177, - 3381901921, 3385842877, 3386603221, 3387014401, 3387487351, 3389030261, 3395091311, 3399205591, 3399890413, 3402234749, - 3407609221, 3407772817, 3407952169, 3408135121, 3409339393, 3411250081, 3411574801, 3411829693, 3412575097, 3415379701, - 3415832137, 3417522841, 3420143941, 3421845001, 3423222757, 3423580481, 3427050673, 3428133103, 3429457921, 3429982081, - 3430804297, 3432695921, 3432997537, 3433458073, 3434575327, 3435973837, 3440195713, 3443704261, 3449768513, 3450717901, - 3453900913, 3458257741, 3461861761, 3463907761, 3464236901, 3466158361, 3470716657, 3474335437, 3480174001, 3482161261, - 3485747521, 3489958697, 3491763493, 3492178873, 3492883081, 3493262761, 3497607433, 3504132113, 3512030497, 3512291021, - 3512369857, 3513604657, 3516565057, 3519318721, 3524086333, 3525088961, 3529119361, 3529864391, 3532687201, 3533662129, - 3533856913, 3538213381, 3542303047, 3543203333, 3548378341, 3549286001, 3549988261, 3552158521, 3553567057, 3557646401, - 3562963973, 3563340457, 3566428301, 3574891757, 3582711841, 3583249921, 3583604161, 3584800801, 3586833253, 3587553971, - 3589937261, 3590409439, 3593276353, 3594110081, 3596491907, 3596815169, 3598772761, 3602006101, 3605151241, 3611571121, - 3612298321, 3612825221, 3614770573, 3616574081, 3620631169, 3628526287, 3630596257, 3631828481, 3632452741, 3635993089, - 3649116277, 3649965281, 3650158849, 3651572609, 3656355841, 3658730893, 3662387977, 3662503093, 3663084541, 3668926801, - 3669587533, 3672754633, 3677180797, 3679657997, 3682471321, 3685647701, 3685775741, 3692307161, 3695628133, 3697278427, - 3700801861, 3705582073, 3705623281, 3708123301, 3708905341, 3709626961, 3712887289, 3713287801, 3713448769, 3718226401, - 3721486081, 3723410161, 3723699373, 3725016749, 3727828501, 3729097633, 3733761739, 3736293461, 3745192001, 3746101189, - 3749383681, 3751554581, 3751782737, 3754680403, 3756668401, 3759781369, 3760622689, 3760896133, 3762110881, 3767640601, - 3773061337, 3774337201, 3784123501, 3787491457, 3798040471, 3798626833, 3799111681, 3800084401, 3805699501, 3807112123, - 3807308269, 3807749821, 3809018947, 3813919453, 3817561777, 3817706621, 3821233121, 3827035237, 3832807681, 3833208961, - 3842941741, 3846174151, 3846532801, 3847106803, 3850058689, 3852800033, 3863326897, 3865604023, 3867183937, 3874471147, - 3874523017, 3875096893, 3875965417, 3886515361, 3886643801, 3887423437, 3887635753, 3891892421, 3891919417, 3894053311, - 3896079281, 3897241129, 3897869201, 3898906129, 3900327241, 3903711841, 3905533721, 3905876501, 3907577521, 3907752241, - 3912174421, 3914880337, 3914923211, 3915467341, 3915604421, 3915921241, 3918227437, 3922321561, 3926912669, 3929293061, - 3934940833, 3935864017, 3936123601, 3945165841, 3947233201, 3947383201, 3953408801, 3953949421, 3955572001, 3958597301, - 3958930441, 3959578801, 3960728641, 3962037061, 3966350203, 3967343161, 3971095301, 3973556837, 3979485931, 3982017601, - 3987528793, 3987960913, 3991124341, 3992697997, 3997536427, 4005660961, 4007365741, 4011996871, 4015548769, 4017684529, - 4018283501, 4020144133, 4026822577, 4027012021, 4027518961, 4028465873, 4028771849, 4031223841, 4034969401, 4034993269, - 4035498409, 4036395581, 4042538497, 4044601751, 4044884689, 4048493983, 4053267217, 4054039841, 4057195309, 4058433931, - 4059776533, 4060942381, 4061009971, 4064633821, 4067039461, 4067887501, 4068671881, 4071644893, 4075241633, 4075721921, - 4076009857, 4079665633, 4079682361, 4083376067, 4085074909, 4088147617, 4088838913, 4092929149, 4098258707, 4099180801, - 4100934241, 4103745689, 4105691393, 4108970251, 4109461709, 4109711581, 4110320663, 4113013141, 4115891893, 4117058221, - 4117447441, 4121286907, 4127050621, 4129914673, 4133928761, 4135847101, 4136916001, 4137262541, 4138838401, 4139015987, - 4150174393, 4155375349, 4157008813, 4162880401, 4166032873, 4183664101, 4185636781, 4186561633, 4187360341, 4191864013, - 4192060699, 4195843037, 4196323561, 4204344601, 4206006229, 4206295433, 4212105409, 4215885697, 4218900001, 4220122321, - 4232966251, 4234224601, 4237212061, 4243744201, 4244022301, 4244663651, 4247990917, 4250920459, 4251904273, 4255695013, - 4257003353, 4261352869, 4271267333, 4275011401, 4277526901, 4278305651, 4282867213, 4285148981, 4293088801, 4294901761, - } - - primes16 = [65536]byte{ - 2, 1, 1, 2, 1, 2, 1, 4, 3, 2, // 0-9 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 10-19 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 20-29 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30-39 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 40-49 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50-59 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60-69 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 70-79 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 80-89 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 90-99 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 100-109 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 110-119 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 120-129 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 130-139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 140-149 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 150-159 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 160-169 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 170-179 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 180-189 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 190-199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 200-209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 210-219 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 220-229 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 230-239 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 240-249 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 250-259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 260-269 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 270-279 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 280-289 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 290-299 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 300-309 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 310-319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 320-329 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 330-339 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 340-349 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 350-359 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 360-369 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 370-379 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 380-389 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 390-399 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 400-409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 410-419 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 420-429 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 430-439 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 440-449 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 450-459 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 460-469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 470-479 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 480-489 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 490-499 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 500-509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 510-519 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 520-529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 530-539 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 540-549 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 550-559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 560-569 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 570-579 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 580-589 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 590-599 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 600-609 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 610-619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 620-629 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 630-639 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 640-649 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 650-659 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 660-669 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 670-679 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 680-689 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 690-699 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 700-709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 710-719 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 720-729 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 730-739 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 740-749 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 750-759 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 760-769 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 770-779 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 780-789 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 790-799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 800-809 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 810-819 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 820-829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 830-839 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 840-849 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 850-859 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 860-869 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 870-879 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 880-889 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 890-899 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 900-909 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 910-919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 920-929 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 930-939 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 940-949 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 950-959 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 960-969 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 970-979 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 980-989 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 990-999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 1000-1009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1010-1019 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1020-1029 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 1030-1039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1040-1049 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1050-1059 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 1060-1069 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1070-1079 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1080-1089 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 1090-1099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1100-1109 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1110-1119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 1120-1129 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 1130-1139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1140-1149 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 1150-1159 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1160-1169 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1170-1179 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1180-1189 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1190-1199 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1200-1209 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 1210-1219 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1220-1229 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 1230-1239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 1240-1249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 1250-1259 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1260-1269 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 1270-1279 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1280-1289 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1290-1299 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 1300-1309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1310-1319 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 1320-1329 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 1330-1339 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 1340-1349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1350-1359 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1360-1369 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1370-1379 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 1380-1389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 1390-1399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 1400-1409 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1410-1419 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1420-1429 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1430-1439 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1440-1449 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 1450-1459 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1460-1469 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1470-1479 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1480-1489 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 1490-1499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1500-1509 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1510-1519 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1520-1529 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1530-1539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 1540-1549 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1550-1559 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1560-1569 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 1570-1579 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 1580-1589 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1590-1599 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 1600-1609 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1610-1619 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 1620-1629 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 1630-1639 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1640-1649 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1650-1659 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 1660-1669 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 1670-1679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1680-1689 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 1690-1699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 1700-1709 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1710-1719 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 1720-1729 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1730-1739 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1740-1749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 1750-1759 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1760-1769 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1770-1779 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 1780-1789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1790-1799 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1800-1809 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1810-1819 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1820-1829 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1830-1839 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 1840-1849 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1850-1859 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1860-1869 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 1870-1879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 1880-1889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1890-1899 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1900-1909 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 1910-1919 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1920-1929 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 1930-1939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1940-1949 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 1950-1959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1960-1969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1970-1979 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1980-1989 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1990-1999 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2000-2009 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2010-2019 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 2020-2029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2030-2039 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2040-2049 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 2050-2059 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 2060-2069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2070-2079 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 2080-2089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 2090-2099 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2100-2109 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2110-2119 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2120-2129 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2130-2139 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 2140-2149 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2150-2159 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2160-2169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 2170-2179 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2180-2189 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2190-2199 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2200-2209 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2210-2219 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 2220-2229 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2230-2239 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2240-2249 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 2250-2259 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2260-2269 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2270-2279 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2280-2289 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 2290-2299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2300-2309 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2310-2319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2320-2329 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2330-2339 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2340-2349 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 2350-2359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2360-2369 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2370-2379 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 2380-2389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 2390-2399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2400-2409 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2410-2419 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2420-2429 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2430-2439 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2440-2449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2450-2459 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2460-2469 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 2470-2479 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2480-2489 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2490-2499 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 2500-2509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2510-2519 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2520-2529 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 2530-2539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2540-2549 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 2550-2559 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2560-2569 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 2570-2579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2580-2589 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2590-2599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2600-2609 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2610-2619 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2620-2629 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2630-2639 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2640-2649 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2650-2659 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2660-2669 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2670-2679 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 2680-2689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 2690-2699 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2700-2709 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 2710-2719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2720-2729 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2730-2739 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 2740-2749 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2750-2759 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2760-2769 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2770-2779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2780-2789 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2790-2799 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2800-2809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2810-2819 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2820-2829 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2830-2839 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2840-2849 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2850-2859 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2860-2869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2870-2879 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2880-2889 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2890-2899 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 2900-2909 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2910-2919 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2920-2929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2930-2939 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2940-2949 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2950-2959 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2960-2969 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 2970-2979 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2980-2989 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2990-2999 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3000-3009 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 3010-3019 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3020-3029 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3030-3039 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3040-3049 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3050-3059 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 3060-3069 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 3070-3079 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 3080-3089 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3090-3099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 3100-3109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3110-3119 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3120-3129 - 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 3130-3139 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 3140-3149 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3150-3159 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 3160-3169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3170-3179 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3180-3189 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3190-3199 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 3200-3209 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3210-3219 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 3220-3229 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3230-3239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3240-3249 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 3250-3259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3260-3269 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 3270-3279 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3280-3289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3290-3299 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3300-3309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 3310-3319 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3320-3329 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3330-3339 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 3340-3349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3350-3359 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3360-3369 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3370-3379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3380-3389 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3390-3399 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3400-3409 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 3410-3419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3420-3429 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3430-3439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 3440-3449 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3450-3459 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 3460-3469 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3470-3479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3480-3489 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3490-3499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3500-3509 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 3510-3519 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 3520-3529 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3530-3539 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 3540-3549 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 3550-3559 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3560-3569 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3570-3579 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3580-3589 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3590-3599 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3600-3609 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 3610-3619 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 3620-3629 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3630-3639 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3640-3649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3650-3659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3660-3669 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 3670-3679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3680-3689 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3690-3699 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 3700-3709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 3710-3719 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3720-3729 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 3730-3739 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3740-3749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3750-3759 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 3760-3769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 3770-3779 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3780-3789 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 3790-3799 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 3800-3809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3810-3819 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3820-3829 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3830-3839 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3840-3849 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3850-3859 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3860-3869 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3870-3879 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 3880-3889 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3890-3899 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3900-3909 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 3910-3919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3920-3929 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3930-3939 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 3940-3949 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3950-3959 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 3960-3969 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3970-3979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3980-3989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3990-3999 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 4000-4009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4010-4019 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 4020-4029 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 4030-4039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 4040-4049 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 4050-4059 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4060-4069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4070-4079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4080-4089 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4090-4099 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4100-4109 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4110-4119 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4120-4129 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 4130-4139 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4140-4149 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 4150-4159 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4160-4169 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 4170-4179 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 4180-4189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4190-4199 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4200-4209 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 4210-4219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 4220-4229 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4230-4239 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4240-4249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4250-4259 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4260-4269 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4270-4279 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 4280-4289 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 4290-4299 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 4300-4309 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4310-4319 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 4320-4329 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 4330-4339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 4340-4349 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4350-4359 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4360-4369 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4370-4379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4380-4389 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 4390-4399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 4400-4409 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4410-4419 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4420-4429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4430-4439 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 4440-4449 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4450-4459 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4460-4469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4470-4479 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4480-4489 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 4490-4499 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4500-4509 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 4510-4519 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 4520-4529 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4530-4539 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 4540-4549 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4550-4559 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 4560-4569 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4570-4579 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 4580-4589 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4590-4599 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4600-4609 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4610-4619 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4620-4629 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4630-4639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4640-4649 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4650-4659 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4660-4669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4670-4679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4680-4689 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4690-4699 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4700-4709 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4710-4719 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 4720-4729 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4730-4739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4740-4749 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 4750-4759 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 4760-4769 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4770-4779 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 4780-4789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4790-4799 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4800-4809 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 4810-4819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4820-4829 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 4830-4839 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 4840-4849 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4850-4859 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4860-4869 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 4870-4879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 4880-4889 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4890-4899 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 4900-4909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 4910-4919 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4920-4929 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 4930-4939 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 4940-4949 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 4950-4959 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4960-4969 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 4970-4979 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4980-4989 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 4990-4999 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5000-5009 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5010-5019 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 5020-5029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 5030-5039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5040-5049 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 5050-5059 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5060-5069 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5070-5079 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5080-5089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5090-5099 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5100-5109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 5110-5119 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 5120-5129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5130-5139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5140-5149 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 5150-5159 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5160-5169 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 5170-5179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 5180-5189 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5190-5199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 5200-5209 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5210-5219 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5220-5229 - 1, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 5230-5239 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5240-5249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5250-5259 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5260-5269 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5270-5279 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5280-5289 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5290-5299 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 5300-5309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5310-5319 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 5320-5329 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 5330-5339 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5340-5349 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 5350-5359 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5360-5369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5370-5379 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5380-5389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 5390-5399 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5400-5409 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 5410-5419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5420-5429 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5430-5439 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 5440-5449 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5450-5459 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5460-5469 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 5470-5479 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 5480-5489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5490-5499 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 5500-5509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5510-5519 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5520-5529 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 5530-5539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5540-5549 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5550-5559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 5560-5569 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5570-5579 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5580-5589 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 5590-5599 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 5600-5609 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5610-5619 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 5620-5629 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5630-5639 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5640-5649 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 5650-5659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 5660-5669 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5670-5679 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 5680-5689 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5690-5699 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5700-5709 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 5710-5719 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5720-5729 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5730-5739 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 5740-5749 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 5750-5759 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 5760-5769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 5770-5779 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5780-5789 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5790-5799 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5800-5809 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5810-5819 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5820-5829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 5830-5839 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5840-5849 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5850-5859 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 5860-5869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5870-5879 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5880-5889 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5890-5899 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 5900-5909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5910-5919 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 5920-5929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 5930-5939 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5940-5949 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 5950-5959 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5960-5969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5970-5979 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 5980-5989 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5990-5999 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6000-6009 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6010-6019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6020-6029 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6030-6039 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 6040-6049 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 6050-6059 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6060-6069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6070-6079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6080-6089 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6090-6099 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6100-6109 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6110-6119 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6120-6129 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6130-6139 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6140-6149 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6150-6159 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6160-6169 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 6170-6179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6180-6189 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 6190-6199 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6200-6209 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6210-6219 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6220-6229 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6230-6239 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 6240-6249 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6250-6259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6260-6269 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 6270-6279 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 6280-6289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6290-6299 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6300-6309 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6310-6319 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 6320-6329 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6330-6339 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6340-6349 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6350-6359 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6360-6369 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6370-6379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6380-6389 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 6390-6399 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6400-6409 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6410-6419 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 6420-6429 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6430-6439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6440-6449 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6450-6459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 6460-6469 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6470-6479 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6480-6489 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 6490-6499 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6500-6509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6510-6519 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6520-6529 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6530-6539 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6540-6549 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6550-6559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6560-6569 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6570-6579 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6580-6589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6590-6599 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 6600-6609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6610-6619 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6620-6629 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 6630-6639 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6640-6649 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6650-6659 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6660-6669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6670-6679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6680-6689 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6690-6699 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6700-6709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 6710-6719 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6720-6729 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 6730-6739 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6740-6749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6750-6759 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 6760-6769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6770-6779 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6780-6789 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6790-6799 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 6800-6809 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6810-6819 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 6820-6829 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6830-6839 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6840-6849 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6850-6859 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6860-6869 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6870-6879 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 6880-6889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6890-6899 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6900-6909 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 6910-6919 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 6920-6929 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6930-6939 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 6940-6949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6950-6959 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6960-6969 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6970-6979 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6980-6989 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6990-6999 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7000-7009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 7010-7019 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7020-7029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7030-7039 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7040-7049 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7050-7059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 7060-7069 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 7070-7079 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7080-7089 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7090-7099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 7100-7109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7110-7119 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 7120-7129 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 7130-7139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7140-7149 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 7150-7159 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7160-7169 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7170-7179 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7180-7189 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7190-7199 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7200-7209 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 7210-7219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7220-7229 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7230-7239 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 7240-7249 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 7250-7259 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7260-7269 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7270-7279 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7280-7289 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7290-7299 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 7300-7309 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7310-7319 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7320-7329 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 7330-7339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7340-7349 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7350-7359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 7360-7369 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7370-7379 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7380-7389 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7390-7399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7400-7409 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 7410-7419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7420-7429 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7430-7439 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7440-7449 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 7450-7459 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7460-7469 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7470-7479 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 7480-7489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7490-7499 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7500-7509 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7510-7519 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 7520-7529 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7530-7539 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 7540-7549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7550-7559 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7560-7569 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 7570-7579 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 7580-7589 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7590-7599 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 7600-7609 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7610-7619 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7620-7629 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7630-7639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 7640-7649 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7650-7659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7660-7669 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 7670-7679 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7680-7689 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7690-7699 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7700-7709 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7710-7719 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 7720-7729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7730-7739 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7740-7749 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 7750-7759 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 7760-7769 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7770-7779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7780-7789 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 7790-7799 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7800-7809 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7810-7819 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 7820-7829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7830-7839 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7840-7849 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7850-7859 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7860-7869 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 7870-7879 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7880-7889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7890-7899 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7900-7909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7910-7919 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7920-7929 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 7930-7939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7940-7949 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7950-7959 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 7960-7969 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7970-7979 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7980-7989 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 7990-7999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8000-8009 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 8010-8019 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8020-8029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 8030-8039 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8040-8049 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 8050-8059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8060-8069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8070-8079 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 8080-8089 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8090-8099 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8100-8109 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8110-8119 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 8120-8129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8130-8139 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 8140-8149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8150-8159 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8160-8169 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8170-8179 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8180-8189 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8190-8199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 8200-8209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8210-8219 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8220-8229 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 8230-8239 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8240-8249 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8250-8259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 8260-8269 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 8270-8279 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8280-8289 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 8290-8299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8300-8309 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 8310-8319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 8320-8329 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 8330-8339 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8340-8349 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 8350-8359 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8360-8369 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 8370-8379 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 8380-8389 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 8390-8399 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8400-8409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8410-8419 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 8420-8429 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8430-8439 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 8440-8449 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8450-8459 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 8460-8469 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 8470-8479 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 8480-8489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8490-8499 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8500-8509 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8510-8519 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 8520-8529 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 8530-8539 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8540-8549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8550-8559 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 8560-8569 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8570-8579 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8580-8589 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 8590-8599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 8600-8609 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8610-8619 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 8620-8629 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8630-8639 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 8640-8649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8650-8659 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8660-8669 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8670-8679 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8680-8689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8690-8699 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8700-8709 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 8710-8719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8720-8729 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8730-8739 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8740-8749 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8750-8759 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8760-8769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8770-8779 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8780-8789 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8790-8799 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 8800-8809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8810-8819 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8820-8829 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 8830-8839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8840-8849 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8850-8859 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 8860-8869 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8870-8879 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8880-8889 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 8890-8899 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 8900-8909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8910-8919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 8920-8929 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8930-8939 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8940-8949 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8950-8959 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 8960-8969 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 8970-8979 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8980-8989 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8990-8999 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9000-9009 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 9010-9019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 9020-9029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9030-9039 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 9040-9049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 9050-9059 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 9060-9069 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9070-9079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9080-9089 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9090-9099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 9100-9109 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9110-9119 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9120-9129 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 9130-9139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9140-9149 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9150-9159 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9160-9169 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 9170-9179 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9180-9189 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9190-9199 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9200-9209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9210-9219 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9220-9229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 9230-9239 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9240-9249 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 9250-9259 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9260-9269 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9270-9279 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 9280-9289 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 9290-9299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9300-9309 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9310-9319 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 9320-9329 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9330-9339 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 9340-9349 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9350-9359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9360-9369 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9370-9379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9380-9389 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9390-9399 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 9400-9409 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9410-9419 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9420-9429 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 9430-9439 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9440-9449 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9450-9459 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 9460-9469 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9470-9479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9480-9489 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9490-9499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9500-9509 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9510-9519 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9520-9529 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 9530-9539 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9540-9549 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 9550-9559 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 9560-9569 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9570-9579 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9580-9589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9590-9599 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9600-9609 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 9610-9619 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9620-9629 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9630-9639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9640-9649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9650-9659 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9660-9669 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 9670-9679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 9680-9689 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 9690-9699 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 9700-9709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 9710-9719 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9720-9729 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 9730-9739 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 9740-9749 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9750-9759 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 9760-9769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9770-9779 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9780-9789 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9790-9799 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 9800-9809 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9810-9819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9820-9829 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9830-9839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9840-9849 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 9850-9859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9860-9869 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9870-9879 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 9880-9889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9890-9899 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 9900-9909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9910-9919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9920-9929 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9930-9939 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 9940-9949 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9950-9959 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9960-9969 - 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 9970-9979 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 9980-9989 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9990-9999 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 10000-10009 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10010-10019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10020-10029 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 10030-10039 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10040-10049 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10050-10059 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 10060-10069 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10070-10079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10080-10089 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 10090-10099 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 10100-10109 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 10110-10119 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10120-10129 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10130-10139 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10140-10149 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 10150-10159 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10160-10169 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10170-10179 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10180-10189 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 10190-10199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10200-10209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10210-10219 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 10220-10229 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10230-10239 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 10240-10249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10250-10259 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10260-10269 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 10270-10279 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10280-10289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10290-10299 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 10300-10309 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 10310-10319 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10320-10329 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 10330-10339 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10340-10349 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 10350-10359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 10360-10369 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10370-10379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10380-10389 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 10390-10399 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10400-10409 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10410-10419 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 10420-10429 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 10430-10439 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10440-10449 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 10450-10459 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10460-10469 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 10470-10479 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 10480-10489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10490-10499 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10500-10509 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 10510-10519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10520-10529 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 10530-10539 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10540-10549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10550-10559 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 10560-10569 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10570-10579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10580-10589 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10590-10599 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10600-10609 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10610-10619 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10620-10629 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10630-10639 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10640-10649 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10650-10659 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 10660-10669 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10670-10679 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10680-10689 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10690-10699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10700-10709 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10710-10719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 10720-10729 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 10730-10739 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10740-10749 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 10750-10759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10760-10769 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10770-10779 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 10780-10789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 10790-10799 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 10800-10809 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10810-10819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10820-10829 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 10830-10839 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10840-10849 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10850-10859 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 10860-10869 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10870-10879 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10880-10889 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10890-10899 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 10900-10909 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10910-10919 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10920-10929 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 10930-10939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10940-10949 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 10950-10959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10960-10969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10970-10979 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10980-10989 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 10990-10999 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 11000-11009 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11010-11019 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11020-11029 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11030-11039 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 11040-11049 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 11050-11059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11060-11069 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11070-11079 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 11080-11089 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 11090-11099 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11100-11109 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 11110-11119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11120-11129 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11130-11139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 11140-11149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11150-11159 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11160-11169 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11170-11179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11180-11189 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 11190-11199 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11200-11209 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 11210-11219 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11220-11229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 11230-11239 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 11240-11249 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11250-11259 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11260-11269 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 11270-11279 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 11280-11289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 11290-11299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11300-11309 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11310-11319 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 11320-11329 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 11330-11339 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11340-11349 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 11350-11359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 11360-11369 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11370-11379 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 11380-11389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 11390-11399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11400-11409 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11410-11419 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 11420-11429 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11430-11439 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11440-11449 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11450-11459 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11460-11469 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11470-11479 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 11480-11489 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11490-11499 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 11500-11509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 11510-11519 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 11520-11529 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11530-11539 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11540-11549 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 11550-11559 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11560-11569 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 11570-11579 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11580-11589 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11590-11599 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11600-11609 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11610-11619 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11620-11629 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 11630-11639 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11640-11649 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11650-11659 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11660-11669 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11670-11679 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 11680-11689 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11690-11699 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11700-11709 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 11710-11719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11720-11729 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11730-11739 - 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 11740-11749 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 11750-11759 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11760-11769 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 11770-11779 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 11780-11789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11790-11799 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11800-11809 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 11810-11819 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11820-11829 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 11830-11839 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 11840-11849 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11850-11859 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11860-11869 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11870-11879 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 11880-11889 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11890-11899 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 11900-11909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11910-11919 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 11920-11929 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 11930-11939 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11940-11949 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 11950-11959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11960-11969 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11970-11979 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11980-11989 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11990-11999 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12000-12009 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 12010-12019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12020-12029 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12030-12039 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 12040-12049 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 12050-12059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12060-12069 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 12070-12079 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12080-12089 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12090-12099 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 12100-12109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 12110-12119 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12120-12129 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12130-12139 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12140-12149 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12150-12159 - 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 12160-12169 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 12170-12179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12180-12189 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12190-12199 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12200-12209 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12210-12219 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 12220-12229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 12230-12239 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12240-12249 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 12250-12259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12260-12269 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12270-12279 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 12280-12289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12290-12299 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12300-12309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12310-12319 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 12320-12329 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12330-12339 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 12340-12349 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12350-12359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12360-12369 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 12370-12379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12380-12389 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12390-12399 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12400-12409 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12410-12419 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12420-12429 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 12430-12439 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12440-12449 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 12450-12459 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12460-12469 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12470-12479 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12480-12489 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12490-12499 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12500-12509 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 12510-12519 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 12520-12529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 12530-12539 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12540-12549 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 12550-12559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 12560-12569 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12570-12579 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12580-12589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12590-12599 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12600-12609 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 12610-12619 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12620-12629 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12630-12639 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12640-12649 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12650-12659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12660-12669 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12670-12679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 12680-12689 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12690-12699 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 12700-12709 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12710-12719 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12720-12729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12730-12739 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 12740-12749 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12750-12759 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12760-12769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12770-12779 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12780-12789 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 12790-12799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 12800-12809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12810-12819 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12820-12829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12830-12839 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12840-12849 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 12850-12859 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 12860-12869 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12870-12879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12880-12889 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12890-12899 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12900-12909 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 12910-12919 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12920-12929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12930-12939 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12940-12949 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12950-12959 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12960-12969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 12970-12979 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12980-12989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12990-12999 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 13000-13009 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13010-13019 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13020-13029 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 13030-13039 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 13040-13049 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13050-13059 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 13060-13069 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13070-13079 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13080-13089 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 13090-13099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 13100-13109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13110-13119 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 13120-13129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13130-13139 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13140-13149 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 13150-13159 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 13160-13169 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13170-13179 - 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 13180-13189 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13190-13199 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13200-13209 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 13210-13219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 13220-13229 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13230-13239 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13240-13249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 13250-13259 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 13260-13269 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13270-13279 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13280-13289 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 13290-13299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 13300-13309 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13310-13319 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13320-13329 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 13330-13339 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13340-13349 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13350-13359 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 13360-13369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13370-13379 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13380-13389 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 13390-13399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13400-13409 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13410-13419 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13420-13429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13430-13439 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13440-13449 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13450-13459 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 13460-13469 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 13470-13479 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 13480-13489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 13490-13499 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13500-13509 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 13510-13519 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13520-13529 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 13530-13539 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13540-13549 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13550-13559 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 13560-13569 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 13570-13579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13580-13589 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 13590-13599 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13600-13609 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 13610-13619 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13620-13629 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 13630-13639 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 13640-13649 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13650-13659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13660-13669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13670-13679 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13680-13689 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 13690-13699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13700-13709 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13710-13719 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 13720-13729 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13730-13739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13740-13749 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 13750-13759 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 13760-13769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13770-13779 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13780-13789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 13790-13799 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 13800-13809 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13810-13819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13820-13829 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13830-13839 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13840-13849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 13850-13859 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13860-13869 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 13870-13879 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 13880-13889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13890-13899 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 13900-13909 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 13910-13919 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13920-13929 - 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 13930-13939 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13940-13949 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13950-13959 - 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 13960-13969 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13970-13979 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13980-13989 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 13990-13999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 14000-14009 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14010-14019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14020-14029 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 14030-14039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14040-14049 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 14050-14059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14060-14069 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14070-14079 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 14080-14089 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14090-14099 - 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 14100-14109 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 14110-14119 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14120-14129 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14130-14139 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 14140-14149 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 14150-14159 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14160-14169 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 14170-14179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14180-14189 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 14190-14199 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 14200-14209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14210-14219 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14220-14229 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14230-14239 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 14240-14249 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 14250-14259 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14260-14269 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14270-14279 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14280-14289 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 14290-14299 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 14300-14309 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14310-14319 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 14320-14329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14330-14339 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 14340-14349 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14350-14359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 14360-14369 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14370-14379 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 14380-14389 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14390-14399 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14400-14409 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14410-14419 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14420-14429 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 14430-14439 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 14440-14449 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14450-14459 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14460-14469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 14470-14479 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14480-14489 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14490-14499 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 14500-14509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14510-14519 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14520-14529 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 14530-14539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 14540-14549 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14550-14559 - 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 14560-14569 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14570-14579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14580-14589 - 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 14590-14599 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14600-14609 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14610-14619 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 14620-14629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 14630-14639 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14640-14649 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 14650-14659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14660-14669 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14670-14679 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 14680-14689 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14690-14699 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14700-14709 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 14710-14719 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14720-14729 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14730-14739 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 14740-14749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 14750-14759 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14760-14769 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14770-14779 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 14780-14789 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 14790-14799 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14800-14809 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14810-14819 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14820-14829 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14830-14839 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14840-14849 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14850-14859 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 14860-14869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 14870-14879 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14880-14889 - 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 14890-14899 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14900-14909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14910-14919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 14920-14929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 14930-14939 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14940-14949 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 14950-14959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14960-14969 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14970-14979 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 14980-14989 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14990-14999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15000-15009 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 15010-15019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15020-15029 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 15030-15039 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15040-15049 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15050-15059 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15060-15069 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 15070-15079 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15080-15089 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15090-15099 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 15100-15109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15110-15119 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15120-15129 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 15130-15139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15140-15149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15150-15159 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15160-15169 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15170-15179 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15180-15189 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 15190-15199 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15200-15209 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 15210-15219 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15220-15229 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15230-15239 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15240-15249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15250-15259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 15260-15269 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 15270-15279 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 15280-15289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 15290-15299 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15300-15309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 15310-15319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 15320-15329 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15330-15339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15340-15349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 15350-15359 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15360-15369 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 15370-15379 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15380-15389 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15390-15399 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15400-15409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15410-15419 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 15420-15429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15430-15439 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15440-15449 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15450-15459 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15460-15469 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 15470-15479 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15480-15489 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 15490-15499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15500-15509 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15510-15519 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 15520-15529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15530-15539 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15540-15549 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15550-15559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15560-15569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15570-15579 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 15580-15589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15590-15599 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 15600-15609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15610-15619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15620-15629 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15630-15639 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 15640-15649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15650-15659 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15660-15669 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15670-15679 - 3, 2, 1, 44, 43, 42, 41, 40, 39, 38, // 15680-15689 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 15690-15699 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 15700-15709 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15710-15719 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15720-15729 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 15730-15739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15740-15749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15750-15759 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15760-15769 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15770-15779 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15780-15789 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15790-15799 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 15800-15809 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15810-15819 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 15820-15829 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 15830-15839 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15840-15849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 15850-15859 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15860-15869 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15870-15879 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 15880-15889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15890-15899 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15900-15909 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 15910-15919 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15920-15929 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 15930-15939 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15940-15949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15950-15959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15960-15969 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 15970-15979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15980-15989 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15990-15999 - 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 16000-16009 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16010-16019 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16020-16029 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16030-16039 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16040-16049 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16050-16059 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 16060-16069 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16070-16079 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16080-16089 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16090-16099 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 16100-16109 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16110-16119 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 16120-16129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16130-16139 - 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 16140-16149 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 16150-16159 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16160-16169 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16170-16179 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 16180-16189 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16190-16199 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16200-16209 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16210-16219 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 16220-16229 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16230-16239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16240-16249 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16250-16259 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16260-16269 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 16270-16279 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16280-16289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16290-16299 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16300-16309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 16310-16319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16320-16329 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 16330-16339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16340-16349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16350-16359 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 16360-16369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16370-16379 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 16380-16389 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16390-16399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16400-16409 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16410-16419 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16420-16429 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16430-16439 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16440-16449 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16450-16459 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16460-16469 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16470-16479 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16480-16489 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 16490-16499 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16500-16509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 16510-16519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 16520-16529 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16530-16539 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16540-16549 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 16550-16559 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16560-16569 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 16570-16579 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16580-16589 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16590-16599 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 16600-16609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16610-16619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16620-16629 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 16630-16639 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16640-16649 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16650-16659 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16660-16669 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16670-16679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16680-16689 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 16690-16699 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 16700-16709 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16710-16719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16720-16729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16730-16739 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 16740-16749 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16750-16759 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16760-16769 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16770-16779 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 16780-16789 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16790-16799 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16800-16809 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16810-16819 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 16820-16829 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16830-16839 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 16840-16849 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16850-16859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16860-16869 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16870-16879 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 16880-16889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16890-16899 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16900-16909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16910-16919 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16920-16929 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16930-16939 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 16940-16949 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16950-16959 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 16960-16969 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16970-16979 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16980-16989 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16990-16999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17000-17009 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17010-17019 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 17020-17029 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17030-17039 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17040-17049 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 17050-17059 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17060-17069 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 17070-17079 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17080-17089 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 17090-17099 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17100-17109 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17110-17119 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 17120-17129 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 17130-17139 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17140-17149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 17150-17159 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 17160-17169 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17170-17179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17180-17189 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17190-17199 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 17200-17209 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 17210-17219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17220-17229 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17230-17239 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17240-17249 - 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 17250-17259 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 17260-17269 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 17270-17279 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17280-17289 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 17290-17299 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17300-17309 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17310-17319 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17320-17329 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17330-17339 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17340-17349 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17350-17359 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17360-17369 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17370-17379 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 17380-17389 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17390-17399 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17400-17409 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17410-17419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17420-17429 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17430-17439 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 17440-17449 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17450-17459 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17460-17469 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17470-17479 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17480-17489 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 17490-17499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 17500-17509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 17510-17519 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17520-17529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 17530-17539 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17540-17549 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17550-17559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 17560-17569 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17570-17579 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17580-17589 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 17590-17599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 17600-17609 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17610-17619 - 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 17620-17629 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 17630-17639 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17640-17649 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 17650-17659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 17660-17669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17670-17679 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 17680-17689 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17690-17699 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17700-17709 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 17710-17719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 17720-17729 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17730-17739 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17740-17749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17750-17759 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 17760-17769 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17770-17779 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17780-17789 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17790-17799 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 17800-17809 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17810-17819 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17820-17829 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17830-17839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17840-17849 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17850-17859 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 17860-17869 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17870-17879 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17880-17889 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17890-17899 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17900-17909 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17910-17919 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 17920-17929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17930-17939 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17940-17949 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17950-17959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17960-17969 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17970-17979 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 17980-17989 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 17990-17999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18000-18009 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 18010-18019 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18020-18029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18030-18039 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 18040-18049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18050-18059 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18060-18069 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 18070-18079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 18080-18089 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 18090-18099 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18100-18109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18110-18119 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18120-18129 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 18130-18139 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 18140-18149 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18150-18159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18160-18169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18170-18179 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18180-18189 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18190-18199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18200-18209 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18210-18219 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 18220-18229 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 18230-18239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18240-18249 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 18250-18259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 18260-18269 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18270-18279 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 18280-18289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18290-18299 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18300-18309 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 18310-18319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18320-18329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18330-18339 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18340-18349 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18350-18359 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18360-18369 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 18370-18379 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18380-18389 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18390-18399 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18400-18409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18410-18419 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18420-18429 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 18430-18439 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 18440-18449 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18450-18459 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18460-18469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18470-18479 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18480-18489 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 18490-18499 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18500-18509 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18510-18519 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 18520-18529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18530-18539 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18540-18549 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 18550-18559 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 18560-18569 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18570-18579 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 18580-18589 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 18590-18599 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18600-18609 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 18610-18619 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18620-18629 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 18630-18639 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18640-18649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18650-18659 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18660-18669 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18670-18679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18680-18689 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18690-18699 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18700-18709 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 18710-18719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18720-18729 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18730-18739 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 18740-18749 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 18750-18759 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18760-18769 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18770-18779 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18780-18789 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 18790-18799 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 18800-18809 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 18810-18819 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18820-18829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 18830-18839 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18840-18849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 18850-18859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 18860-18869 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 18870-18879 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18880-18889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18890-18899 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18900-18909 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 28, // 18910-18919 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 18920-18929 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18930-18939 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 18940-18949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 18950-18959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18960-18969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 18970-18979 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18980-18989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18990-18999 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 19000-19009 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 19010-19019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19020-19029 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 19030-19039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19040-19049 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19050-19059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 19060-19069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19070-19079 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 19080-19089 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 19090-19099 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19100-19109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19110-19119 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19120-19129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 19130-19139 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 19140-19149 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19150-19159 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 19160-19169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19170-19179 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 19180-19189 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 19190-19199 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19200-19209 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19210-19219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19220-19229 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19230-19239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 19240-19249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 19250-19259 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19260-19269 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 19270-19279 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19280-19289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19290-19299 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 19300-19309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 19310-19319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19320-19329 - 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 19330-19339 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 19340-19349 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 19350-19359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19360-19369 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19370-19379 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19380-19389 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19390-19399 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19400-19409 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19410-19419 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 19420-19429 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19430-19439 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19440-19449 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19450-19459 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19460-19469 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19470-19479 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19480-19489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19490-19499 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 19500-19509 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19510-19519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19520-19529 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19530-19539 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19540-19549 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19550-19559 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19560-19569 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19570-19579 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19580-19589 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19590-19599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 52, // 19600-19609 - 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 19610-19619 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 19620-19629 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 19630-19639 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19640-19649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19650-19659 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19660-19669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19670-19679 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19680-19689 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 19690-19699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 19700-19709 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19710-19719 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19720-19729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19730-19739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19740-19749 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 19750-19759 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19760-19769 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 19770-19779 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19780-19789 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19790-19799 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19800-19809 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 19810-19819 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19820-19829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19830-19839 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19840-19849 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19850-19859 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 19860-19869 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19870-19879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 19880-19889 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 19890-19899 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19900-19909 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 19910-19919 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19920-19929 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19930-19939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19940-19949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19950-19959 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19960-19969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19970-19979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19980-19989 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 19990-19999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20000-20009 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20010-20019 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 20020-20029 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20030-20039 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 20040-20049 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20050-20059 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 20060-20069 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20070-20079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20080-20089 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20090-20099 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 20100-20109 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20110-20119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 20120-20129 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20130-20139 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 20140-20149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20150-20159 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20160-20169 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20170-20179 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20180-20189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20190-20199 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20200-20209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20210-20219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20220-20229 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 20230-20239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20240-20249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20250-20259 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 20260-20269 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20270-20279 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20280-20289 - 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 20290-20299 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20300-20309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20310-20319 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20320-20329 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 20330-20339 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 20340-20349 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 20350-20359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 20360-20369 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20370-20379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 20380-20389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 20390-20399 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 20400-20409 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 20410-20419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20420-20429 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20430-20439 - 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 20440-20449 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 20450-20459 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20460-20469 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 20470-20479 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 20480-20489 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20490-20499 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 20500-20509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20510-20519 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20520-20529 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 20530-20539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 20540-20549 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20550-20559 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 20560-20569 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20570-20579 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20580-20589 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 20590-20599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20600-20609 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20610-20619 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 20620-20629 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 20630-20639 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20640-20649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20650-20659 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20660-20669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20670-20679 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20680-20689 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 20690-20699 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20700-20709 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 20710-20719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20720-20729 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20730-20739 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 20740-20749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 20750-20759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20760-20769 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 20770-20779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 20780-20789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20790-20799 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 40, // 20800-20809 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 20810-20819 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 20820-20829 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20830-20839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 20840-20849 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 20850-20859 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20860-20869 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 20870-20879 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20880-20889 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 20890-20899 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20900-20909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20910-20919 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 20920-20929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 20930-20939 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 20940-20949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 20950-20959 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20960-20969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20970-20979 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20980-20989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20990-20999 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21000-21009 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 21010-21019 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21020-21029 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 21030-21039 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21040-21049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21050-21059 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 21060-21069 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21070-21079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 21080-21089 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21090-21099 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21100-21109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21110-21119 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21120-21129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21130-21139 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 21140-21149 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21150-21159 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 21160-21169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21170-21179 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21180-21189 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21190-21199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21200-21209 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21210-21219 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 21220-21229 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21230-21239 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 21240-21249 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21250-21259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21260-21269 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21270-21279 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 21280-21289 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 21290-21299 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21300-21309 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 21310-21319 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21320-21329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21330-21339 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 21340-21349 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21350-21359 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21360-21369 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 21370-21379 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21380-21389 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21390-21399 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 21400-21409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 21410-21419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21420-21429 - 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 21430-21439 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21440-21449 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21450-21459 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21460-21469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21470-21479 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21480-21489 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 21490-21499 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21500-21509 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21510-21519 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 21520-21529 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21530-21539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21540-21549 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 21550-21559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 21560-21569 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21570-21579 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 21580-21589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21590-21599 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21600-21609 - 1, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 21610-21619 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21620-21629 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21630-21639 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 21640-21649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21650-21659 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21660-21669 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 21670-21679 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21680-21689 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21690-21699 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21700-21709 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21710-21719 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21720-21729 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 21730-21739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21740-21749 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21750-21759 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21760-21769 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21770-21779 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 21780-21789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21790-21799 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21800-21809 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21810-21819 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21820-21829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21830-21839 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21840-21849 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21850-21859 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21860-21869 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21870-21879 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21880-21889 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21890-21899 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21900-21909 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21910-21919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21920-21929 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21930-21939 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21940-21949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21950-21959 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21960-21969 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21970-21979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21980-21989 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21990-21999 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22000-22009 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 22010-22019 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22020-22029 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 22030-22039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22040-22049 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22050-22059 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 22060-22069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 22070-22079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22080-22089 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 22090-22099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 22100-22109 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22110-22119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 22120-22129 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 22130-22139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22140-22149 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 22150-22159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22160-22169 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22170-22179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 22180-22189 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 22190-22199 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 22200-22209 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22210-22219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 22220-22229 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22230-22239 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22240-22249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22250-22259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22260-22269 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 22270-22279 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22280-22289 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22290-22299 - 3, 2, 1, 4, 3, 2, 1, 36, 35, 34, // 22300-22309 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22310-22319 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22320-22329 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22330-22339 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 22340-22349 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22350-22359 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 22360-22369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22370-22379 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22380-22389 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22390-22399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 22400-22409 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22410-22419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22420-22429 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22430-22439 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22440-22449 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 22450-22459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22460-22469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22470-22479 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 22480-22489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22490-22499 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22500-22509 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 22510-22519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22520-22529 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22530-22539 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 22540-22549 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22550-22559 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22560-22569 - 1, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 22570-22579 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22580-22589 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22590-22599 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22600-22609 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 22610-22619 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22620-22629 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 22630-22639 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22640-22649 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22650-22659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 22660-22669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22670-22679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22680-22689 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 22690-22699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 22700-22709 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22710-22719 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22720-22729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 22730-22739 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22740-22749 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22750-22759 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 22760-22769 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22770-22779 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 22780-22789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22790-22799 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22800-22809 - 1, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 22810-22819 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22820-22829 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22830-22839 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22840-22849 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 22850-22859 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22860-22869 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 22870-22879 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 22880-22889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22890-22899 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 22900-22909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22910-22919 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22920-22929 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22930-22939 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 22940-22949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22950-22959 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22960-22969 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 22970-22979 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22980-22989 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22990-22999 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23000-23009 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23010-23019 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 23020-23029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23030-23039 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23040-23049 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 23050-23059 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23060-23069 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23070-23079 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23080-23089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 23090-23099 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23100-23109 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23110-23119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23120-23129 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23130-23139 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23140-23149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23150-23159 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23160-23169 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23170-23179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23180-23189 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23190-23199 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 23200-23209 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23210-23219 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 23220-23229 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23230-23239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23240-23249 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23250-23259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 23260-23269 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 23270-23279 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23280-23289 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 23290-23299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23300-23309 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23310-23319 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23320-23329 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 23330-23339 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23340-23349 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23350-23359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23360-23369 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 23370-23379 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23380-23389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 23390-23399 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23400-23409 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23410-23419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23420-23429 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23430-23439 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23440-23449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 23450-23459 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23460-23469 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 23470-23479 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23480-23489 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23490-23499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 23500-23509 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23510-23519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23520-23529 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 23530-23539 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23540-23549 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23550-23559 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 23560-23569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23570-23579 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23580-23589 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 23590-23599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 23600-23609 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23610-23619 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 23620-23629 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 23630-23639 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 23640-23649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23650-23659 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 23660-23669 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 23670-23679 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 23680-23689 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 23690-23699 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23700-23709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 23710-23719 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23720-23729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23730-23739 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 23740-23749 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23750-23759 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23760-23769 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23770-23779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 23780-23789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23790-23799 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23800-23809 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 23810-23819 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23820-23829 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 23830-23839 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23840-23849 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23850-23859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 23860-23869 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 23870-23879 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23880-23889 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 23890-23899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23900-23909 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23910-23919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 23920-23929 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 23930-23939 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23940-23949 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23950-23959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23960-23969 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23970-23979 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23980-23989 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23990-23999 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24000-24009 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24010-24019 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 24020-24029 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24030-24039 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 24040-24049 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24050-24059 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24060-24069 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24070-24079 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24080-24089 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24090-24099 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 24100-24109 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24110-24119 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24120-24129 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 24130-24139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24140-24149 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24150-24159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 24160-24169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 24170-24179 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24180-24189 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24190-24199 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 24200-24209 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24210-24219 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 24220-24229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24230-24239 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24240-24249 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 24250-24259 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24260-24269 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24270-24279 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 24280-24289 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 24290-24299 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24300-24309 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24310-24319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24320-24329 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 24330-24339 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24340-24349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24350-24359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24360-24369 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 24370-24379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24380-24389 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24390-24399 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24400-24409 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 24410-24419 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24420-24429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24430-24439 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 24440-24449 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24450-24459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24460-24469 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24470-24479 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24480-24489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 24490-24499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24500-24509 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 24510-24519 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24520-24529 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 24530-24539 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24540-24549 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24550-24559 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24560-24569 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24570-24579 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24580-24589 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 24590-24599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24600-24609 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24610-24619 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24620-24629 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 24630-24639 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24640-24649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24650-24659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24660-24669 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24670-24679 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24680-24689 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24690-24699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 24700-24709 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24710-24719 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24720-24729 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 24730-24739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 24740-24749 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24750-24759 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 24760-24769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24770-24779 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24780-24789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 24790-24799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24800-24809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24810-24819 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24820-24829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24830-24839 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24840-24849 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 24850-24859 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24860-24869 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24870-24879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 24880-24889 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24890-24899 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 24900-24909 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 24910-24919 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 24920-24929 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24930-24939 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 24940-24949 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 24950-24959 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24960-24969 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 24970-24979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 24980-24989 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24990-24999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25000-25009 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 25010-25019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25020-25029 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 25030-25039 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25040-25049 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 25050-25059 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25060-25069 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25070-25079 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25080-25089 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 25090-25099 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25100-25109 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 25110-25119 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 25120-25129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25130-25139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25140-25149 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25150-25159 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25160-25169 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25170-25179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 25180-25189 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 25190-25199 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25200-25209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 25210-25219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 25220-25229 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25230-25239 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 25240-25249 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25250-25259 - 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 25260-25269 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 25270-25279 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25280-25289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25290-25299 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 25300-25309 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25310-25319 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25320-25329 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 25330-25339 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 25340-25349 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25350-25359 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25360-25369 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 25370-25379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25380-25389 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25390-25399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 25400-25409 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25410-25419 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 25420-25429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 25430-25439 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25440-25449 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 25450-25459 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25460-25469 - 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 25470-25479 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 25480-25489 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 25490-25499 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 25500-25509 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25510-25519 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25520-25529 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 25530-25539 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25540-25549 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25550-25559 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25560-25569 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 25570-25579 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25580-25589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25590-25599 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25600-25609 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25610-25619 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25620-25629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 25630-25639 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25640-25649 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25650-25659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25660-25669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 25670-25679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25680-25689 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25690-25699 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25700-25709 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 25710-25719 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25720-25729 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25730-25739 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 25740-25749 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 25750-25759 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25760-25769 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 25770-25779 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25780-25789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25790-25799 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25800-25809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 25810-25819 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25820-25829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25830-25839 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 25840-25849 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25850-25859 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25860-25869 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 25870-25879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 25880-25889 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25890-25899 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25900-25909 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25910-25919 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25920-25929 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 25930-25939 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25940-25949 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25950-25959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 25960-25969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25970-25979 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25980-25989 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 25990-25999 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 26000-26009 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26010-26019 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26020-26029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26030-26039 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26040-26049 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 26050-26059 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 26060-26069 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26070-26079 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 26080-26089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26090-26099 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26100-26109 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 26110-26119 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 26120-26129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26130-26139 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26140-26149 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26150-26159 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26160-26169 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26170-26179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 26180-26189 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26190-26199 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 26200-26209 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26210-26219 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26220-26229 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 26230-26239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 26240-26249 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26250-26259 - 1, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 26260-26269 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 26270-26279 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26280-26289 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 26290-26299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26300-26309 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26310-26319 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26320-26329 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26330-26339 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26340-26349 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 26350-26359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26360-26369 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26370-26379 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26380-26389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 26390-26399 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26400-26409 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26410-26419 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26420-26429 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 26430-26439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 26440-26449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 26450-26459 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26460-26469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 26470-26479 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26480-26489 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26490-26499 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26500-26509 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 26510-26519 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26520-26529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 26530-26539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26540-26549 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26550-26559 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26560-26569 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26570-26579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26580-26589 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 26590-26599 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 26600-26609 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26610-26619 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26620-26629 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26630-26639 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 26640-26649 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26650-26659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26660-26669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26670-26679 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 26680-26689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 26690-26699 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26700-26709 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 26710-26719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 26720-26729 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 26730-26739 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26740-26749 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 26750-26759 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26760-26769 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26770-26779 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26780-26789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26790-26799 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26800-26809 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26810-26819 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26820-26829 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 26830-26839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26840-26849 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26850-26859 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 26860-26869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 26870-26879 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26880-26889 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 26890-26899 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26900-26909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26910-26919 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 26920-26929 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26930-26939 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26940-26949 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 26950-26959 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 26960-26969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26970-26979 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26980-26989 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26990-26999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27000-27009 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27010-27019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27020-27029 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27030-27039 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27040-27049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27050-27059 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27060-27069 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 27070-27079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27080-27089 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27090-27099 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 27100-27109 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27110-27119 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 27120-27129 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27130-27139 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 27140-27149 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27150-27159 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27160-27169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 27170-27179 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27180-27189 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27190-27199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27200-27209 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27210-27219 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27220-27229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27230-27239 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27240-27249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 27250-27259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27260-27269 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27270-27279 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27280-27289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 27290-27299 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27300-27309 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27310-27319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 27320-27329 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 27330-27339 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27340-27349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27350-27359 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 27360-27369 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 27370-27379 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27380-27389 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 27390-27399 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 27400-27409 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27410-27419 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27420-27429 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 27430-27439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 27440-27449 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 27450-27459 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27460-27469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27470-27479 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 27480-27489 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27490-27499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 27500-27509 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27510-27519 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 27520-27529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27530-27539 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27540-27549 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 27550-27559 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27560-27569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27570-27579 - 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 27580-27589 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27590-27599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27600-27609 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27610-27619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27620-27629 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27630-27639 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27640-27649 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 27650-27659 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27660-27669 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27670-27679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27680-27689 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27690-27699 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 27700-27709 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 27710-27719 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27720-27729 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 27730-27739 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 27740-27749 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27750-27759 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 27760-27769 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 27770-27779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27780-27789 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 27790-27799 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 27800-27809 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27810-27819 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 27820-27829 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27830-27839 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27840-27849 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 27850-27859 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 27860-27869 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27870-27879 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 27880-27889 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 27890-27899 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27900-27909 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 27910-27919 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27920-27929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27930-27939 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 27940-27949 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 27950-27959 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 27960-27969 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27970-27979 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 27980-27989 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27990-27999 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28000-28009 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 28010-28019 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28020-28029 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28030-28039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28040-28049 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 28050-28059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28060-28069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28070-28079 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28080-28089 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28090-28099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28100-28109 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28110-28119 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 28120-28129 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28130-28139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28140-28149 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28150-28159 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 28160-28169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28170-28179 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 28180-28189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28190-28199 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28200-28209 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 28210-28219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 48, // 28220-28229 - 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, // 28230-28239 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 28240-28249 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 28250-28259 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28260-28269 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 28270-28279 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28280-28289 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28290-28299 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28300-28309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 28310-28319 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 28320-28329 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28330-28339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28340-28349 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 28350-28359 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 28360-28369 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28370-28379 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28380-28389 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 28390-28399 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 28400-28409 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28410-28419 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 28420-28429 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28430-28439 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 28440-28449 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28450-28459 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 28460-28469 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 28470-28479 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28480-28489 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 28490-28499 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28500-28509 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 28510-28519 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28520-28529 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28530-28539 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28540-28549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28550-28559 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28560-28569 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 28570-28579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28580-28589 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28590-28599 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 28600-28609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28610-28619 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28620-28629 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28630-28639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28640-28649 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28650-28659 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 28660-28669 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28670-28679 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28680-28689 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28690-28699 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 28700-28709 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28710-28719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 28720-28729 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28730-28739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28740-28749 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 28750-28759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28760-28769 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28770-28779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 28780-28789 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 28790-28799 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28800-28809 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 28810-28819 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28820-28829 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28830-28839 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 28840-28849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 28850-28859 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28860-28869 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 28870-28879 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28880-28889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28890-28899 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28900-28909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28910-28919 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28920-28929 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 28930-28939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28940-28949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28950-28959 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28960-28969 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 28970-28979 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 28980-28989 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28990-28999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 29000-29009 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29010-29019 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 29020-29029 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 29030-29039 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29040-29049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 29050-29059 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 29060-29069 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 29070-29079 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 29080-29089 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29090-29099 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29100-29109 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29110-29119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29120-29129 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 29130-29139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29140-29149 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 29150-29159 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29160-29169 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 29170-29179 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29180-29189 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29190-29199 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 29200-29209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29210-29219 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29220-29229 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29230-29239 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29240-29249 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29250-29259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 29260-29269 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29270-29279 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 29280-29289 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29290-29299 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29300-29309 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29310-29319 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29320-29329 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 29330-29339 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 29340-29349 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29350-29359 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 29360-29369 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29370-29379 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 29380-29389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 29390-29399 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29400-29409 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29410-29419 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 29420-29429 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29430-29439 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 29440-29449 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 29450-29459 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29460-29469 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 29470-29479 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 29480-29489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29490-29499 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29500-29509 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29510-29519 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29520-29529 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 29530-29539 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29540-29549 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29550-29559 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 29560-29569 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29570-29579 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 29580-29589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 29590-29599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29600-29609 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29610-29619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 29620-29629 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29630-29639 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29640-29649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29650-29659 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29660-29669 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29670-29679 - 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 29680-29689 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29690-29699 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29700-29709 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29710-29719 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 29720-29729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29730-29739 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29740-29749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29750-29759 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 29760-29769 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29770-29779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 29780-29789 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29790-29799 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 29800-29809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 29810-29819 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29820-29829 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 29830-29839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29840-29849 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29850-29859 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 29860-29869 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29870-29879 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 29880-29889 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29890-29899 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29900-29909 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29910-29919 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 29920-29929 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29930-29939 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 29940-29949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 29950-29959 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29960-29969 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29970-29979 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 29980-29989 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 29990-29999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30000-30009 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 30010-30019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 30020-30029 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30030-30039 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30040-30049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 30050-30059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30060-30069 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30070-30079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30080-30089 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30090-30099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 30100-30109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 30110-30119 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30120-30129 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 30130-30139 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30140-30149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30150-30159 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 30160-30169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30170-30179 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 30180-30189 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30190-30199 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 30200-30209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30210-30219 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30220-30229 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30230-30239 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30240-30249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 30250-30259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30260-30269 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30270-30279 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30280-30289 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 30290-30299 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30300-30309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 30310-30319 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30320-30329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30330-30339 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 30340-30349 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30350-30359 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 30360-30369 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30370-30379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30380-30389 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30390-30399 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 30400-30409 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30410-30419 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30420-30429 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30430-30439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 30440-30449 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30450-30459 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 30460-30469 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30470-30479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30480-30489 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 30490-30499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 30500-30509 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30510-30519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 30520-30529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 30530-30539 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30540-30549 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 30550-30559 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30560-30569 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 30570-30579 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30580-30589 - 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 30590-30599 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 30600-30609 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30610-30619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30620-30629 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30630-30639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 30640-30649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30650-30659 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30660-30669 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30670-30679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 30680-30689 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30690-30699 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 30700-30709 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 30710-30719 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 30720-30729 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 30730-30739 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30740-30749 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30750-30759 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 30760-30769 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 30770-30779 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30780-30789 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30790-30799 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 30800-30809 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30810-30819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 30820-30829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30830-30839 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30840-30849 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 30850-30859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30860-30869 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30870-30879 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30880-30889 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30890-30899 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30900-30909 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30910-30919 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30920-30929 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30930-30939 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 30940-30949 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30950-30959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30960-30969 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30970-30979 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 30980-30989 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30990-30999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31000-31009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 31010-31019 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31020-31029 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 31030-31039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31040-31049 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31050-31059 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 31060-31069 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31070-31079 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31080-31089 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 31090-31099 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31100-31109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31110-31119 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 31120-31129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31130-31139 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31140-31149 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 31150-31159 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31160-31169 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31170-31179 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 31180-31189 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 31190-31199 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31200-31209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 31210-31219 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31220-31229 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 31230-31239 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 31240-31249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 31250-31259 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31260-31269 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 31270-31279 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31280-31289 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31290-31299 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 31300-31309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31310-31319 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31320-31329 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31330-31339 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31340-31349 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 31350-31359 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31360-31369 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31370-31379 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31380-31389 - 1, 2, 1, 4, 3, 2, 1, 72, 71, 70, // 31390-31399 - 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, // 31400-31409 - 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, // 31410-31419 - 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 31420-31429 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 31430-31439 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 31440-31449 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31450-31459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31460-31469 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31470-31479 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 31480-31489 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31490-31499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31500-31509 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 31510-31519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31520-31529 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31530-31539 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31540-31549 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31550-31559 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31560-31569 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31570-31579 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 31580-31589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31590-31599 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 31600-31609 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31610-31619 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 31620-31629 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31630-31639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 31640-31649 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31650-31659 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31660-31669 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31670-31679 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 31680-31689 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 31690-31699 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31700-31709 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31710-31719 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 31720-31729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31730-31739 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31740-31749 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31750-31759 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31760-31769 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 31770-31779 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31780-31789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 31790-31799 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31800-31809 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 31810-31819 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31820-31829 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31830-31839 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 31840-31849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 31850-31859 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31860-31869 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31870-31879 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31880-31889 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31890-31899 - 7, 6, 5, 4, 3, 2, 1, 50, 49, 48, // 31900-31909 - 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, // 31910-31919 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 31920-31929 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31930-31939 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31940-31949 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31950-31959 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31960-31969 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31970-31979 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31980-31989 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31990-31999 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 32000-32009 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32010-32019 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 32020-32029 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32030-32039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32040-32049 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 32050-32059 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32060-32069 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32070-32079 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 32080-32089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 32090-32099 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32100-32109 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 32110-32119 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32120-32129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32130-32139 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 32140-32149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 32150-32159 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32160-32169 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32170-32179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32180-32189 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32190-32199 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32200-32209 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 32210-32219 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32220-32229 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 32230-32239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32240-32249 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32250-32259 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 32260-32269 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 32270-32279 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32280-32289 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 32290-32299 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 32300-32309 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32310-32319 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 32320-32329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32330-32339 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32340-32349 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32350-32359 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32360-32369 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32370-32379 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32380-32389 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32390-32399 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32400-32409 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32410-32419 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 32420-32429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32430-32439 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 32440-32449 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32450-32459 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 32460-32469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 32470-32479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32480-32489 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32490-32499 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 32500-32509 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32510-32519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32520-32529 - 1, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 32530-32539 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32540-32549 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32550-32559 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32560-32569 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32570-32579 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 32580-32589 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32590-32599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32600-32609 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32610-32619 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32620-32629 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 32630-32639 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32640-32649 - 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 32650-32659 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 32660-32669 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32670-32679 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32680-32689 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 32690-32699 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32700-32709 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 32710-32719 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 32720-32729 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32730-32739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 32740-32749 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32750-32759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32760-32769 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 32770-32779 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32780-32789 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32790-32799 - 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 32800-32809 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32810-32819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32820-32829 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32830-32839 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 32840-32849 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32850-32859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 32860-32869 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32870-32879 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 32880-32889 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32890-32899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 32900-32909 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 32910-32919 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32920-32929 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32930-32939 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32940-32949 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 32950-32959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 32960-32969 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32970-32979 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 32980-32989 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 32990-32999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33000-33009 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33010-33019 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33020-33029 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33030-33039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33040-33049 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33050-33059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33060-33069 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33070-33079 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33080-33089 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33090-33099 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33100-33109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 33110-33119 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 33120-33129 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33130-33139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33140-33149 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33150-33159 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33160-33169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33170-33179 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33180-33189 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33190-33199 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33200-33209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33210-33219 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 33220-33229 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33230-33239 - 7, 6, 5, 4, 3, 2, 1, 40, 39, 38, // 33240-33249 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 33250-33259 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33260-33269 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33270-33279 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 33280-33289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33290-33299 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33300-33309 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33310-33319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33320-33329 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33330-33339 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 33340-33349 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 33350-33359 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33360-33369 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 33370-33379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33380-33389 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33390-33399 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 33400-33409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 33410-33419 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 33420-33429 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33430-33439 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33440-33449 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33450-33459 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 33460-33469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 33470-33479 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33480-33489 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33490-33499 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33500-33509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33510-33519 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33520-33529 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 33530-33539 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 33540-33549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33550-33559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33560-33569 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33570-33579 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 33580-33589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33590-33599 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33600-33609 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 33610-33619 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33620-33629 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33630-33639 - 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 33640-33649 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 33650-33659 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33660-33669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 33670-33679 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 33680-33689 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33690-33699 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33700-33709 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33710-33719 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33720-33729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 33730-33739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33740-33749 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 33750-33759 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 33760-33769 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33770-33779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33780-33789 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33790-33799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33800-33809 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33810-33819 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 33820-33829 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 33830-33839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33840-33849 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33850-33859 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33860-33869 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33870-33879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33880-33889 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33890-33899 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33900-33909 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33910-33919 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33920-33929 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33930-33939 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 33940-33949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33950-33959 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 33960-33969 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33970-33979 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33980-33989 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 33990-33999 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34000-34009 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 34010-34019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34020-34029 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 34030-34039 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34040-34049 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 34050-34059 - 1, 62, 61, 60, 59, 58, 57, 56, 55, 54, // 34060-34069 - 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 34070-34079 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 34080-34089 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34090-34099 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34100-34109 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34110-34119 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 34120-34129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34130-34139 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34140-34149 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 34150-34159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34160-34169 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34170-34179 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 34180-34189 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34190-34199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34200-34209 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 34210-34219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34220-34229 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34230-34239 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34240-34249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 34250-34259 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34260-34269 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34270-34279 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 34280-34289 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 34290-34299 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34300-34309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 34310-34319 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34320-34329 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 34330-34339 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34340-34349 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34350-34359 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 34360-34369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34370-34379 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34380-34389 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34390-34399 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34400-34409 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34410-34419 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34420-34429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 34430-34439 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34440-34449 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 34450-34459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34460-34469 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34470-34479 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 34480-34489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34490-34499 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34500-34509 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 34510-34519 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34520-34529 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34530-34539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 34, // 34540-34549 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34550-34559 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34560-34569 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34570-34579 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 34580-34589 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34590-34599 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 34600-34609 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34610-34619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34620-34629 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34630-34639 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34640-34649 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34650-34659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34660-34669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 34670-34679 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34680-34689 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34690-34699 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34700-34709 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34710-34719 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34720-34729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 34730-34739 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34740-34749 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 34750-34759 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34760-34769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34770-34779 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 34780-34789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34790-34799 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 34800-34809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 34810-34819 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34820-34829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34830-34839 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 34840-34849 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34850-34859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34860-34869 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34870-34879 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 34880-34889 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 34890-34899 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34900-34909 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 34910-34919 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34920-34929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34930-34939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 34940-34949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34950-34959 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34960-34969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34970-34979 - 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 34980-34989 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34990-34999 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 35000-35009 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35010-35019 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 35020-35029 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35030-35039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35040-35049 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35050-35059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 35060-35069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35070-35079 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35080-35089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 35090-35099 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35100-35109 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35110-35119 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 35120-35129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35130-35139 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35140-35149 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 35150-35159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35160-35169 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35170-35179 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35180-35189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35190-35199 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35200-35209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35210-35219 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 35220-35229 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35230-35239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35240-35249 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 35250-35259 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35260-35269 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 35270-35279 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35280-35289 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35290-35299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35300-35309 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35310-35319 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 35320-35329 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 35330-35339 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35340-35349 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35350-35359 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35360-35369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35370-35379 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35380-35389 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 35390-35399 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35400-35409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35410-35419 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 35420-35429 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 35430-35439 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35440-35449 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35450-35459 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35460-35469 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35470-35479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35480-35489 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35490-35499 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35500-35509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35510-35519 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35520-35529 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 35530-35539 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 35540-35549 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 35550-35559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35560-35569 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35570-35579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35580-35589 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 35590-35599 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 35600-35609 - 7, 6, 5, 4, 3, 2, 1, 54, 53, 52, // 35610-35619 - 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 35620-35629 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 35630-35639 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35640-35649 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35650-35659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35660-35669 - 1, 6, 5, 4, 3, 2, 1, 52, 51, 50, // 35670-35679 - 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 35680-35689 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 35690-35699 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 35700-35709 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 35710-35719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 35720-35729 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35730-35739 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35740-35749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 35750-35759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35760-35769 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 35770-35779 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35780-35789 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35790-35799 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 35800-35809 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35810-35819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35820-35829 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35830-35839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35840-35849 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35850-35859 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35860-35869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 35870-35879 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35880-35889 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35890-35899 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35900-35909 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35910-35919 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35920-35929 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35930-35939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35940-35949 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35950-35959 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 35960-35969 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35970-35979 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35980-35989 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 35990-35999 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36000-36009 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 36010-36019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36020-36029 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 36030-36039 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36040-36049 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36050-36059 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36060-36069 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36070-36079 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 36080-36089 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36090-36099 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 36100-36109 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36110-36119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36120-36129 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 36130-36139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36140-36149 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36150-36159 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 36160-36169 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36170-36179 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36180-36189 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36190-36199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36200-36209 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36210-36219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36220-36229 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36230-36239 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36240-36249 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36250-36259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 36260-36269 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 36270-36279 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36280-36289 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 36290-36299 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36300-36309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 36310-36319 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36320-36329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36330-36339 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36340-36349 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 36350-36359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36360-36369 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36370-36379 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 44, // 36380-36389 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 36390-36399 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 36400-36409 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36410-36419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36420-36429 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 36430-36439 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36440-36449 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36450-36459 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 36460-36469 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 36470-36479 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36480-36489 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 36490-36499 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36500-36509 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36510-36519 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 36520-36529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36530-36539 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36540-36549 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 36550-36559 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36560-36569 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36570-36579 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 36580-36589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36590-36599 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 36600-36609 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36610-36619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36620-36629 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36630-36639 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36640-36649 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 36650-36659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36660-36669 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36670-36679 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36680-36689 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36690-36699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 36700-36709 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36710-36719 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36720-36729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 36730-36739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36740-36749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36750-36759 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36760-36769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 36770-36779 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36780-36789 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 36790-36799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36800-36809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36810-36819 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36820-36829 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 36830-36839 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36840-36849 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 36850-36859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36860-36869 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36870-36879 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36880-36889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 36890-36899 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36900-36909 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 36910-36919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 36920-36929 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36930-36939 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 36940-36949 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36950-36959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36960-36969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 36970-36979 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36980-36989 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36990-36999 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37000-37009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 37010-37019 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 37020-37029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37030-37039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37040-37049 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37050-37059 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37060-37069 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37070-37079 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37080-37089 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 37090-37099 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37100-37109 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37110-37119 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 37120-37129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 37130-37139 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 37140-37149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 37150-37159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37160-37169 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37170-37179 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37180-37189 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 37190-37199 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37200-37209 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37210-37219 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37220-37229 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37230-37239 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37240-37249 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37250-37259 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37260-37269 - 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 37270-37279 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37280-37289 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37290-37299 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 37300-37309 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37310-37319 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37320-37329 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 37330-37339 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37340-37349 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37350-37359 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 37360-37369 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 37370-37379 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37380-37389 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37390-37399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 37400-37409 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37410-37419 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 37420-37429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37430-37439 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 37440-37449 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37450-37459 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37460-37469 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37470-37479 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 37480-37489 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37490-37499 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37500-37509 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37510-37519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37520-37529 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37530-37539 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 37540-37549 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37550-37559 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37560-37569 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 37570-37579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 37580-37589 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37590-37599 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37600-37609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 37610-37619 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37620-37629 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37630-37639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 37640-37649 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37650-37659 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 37660-37669 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37670-37679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37680-37689 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 37690-37699 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37700-37709 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 37710-37719 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37720-37729 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37730-37739 - 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 37740-37749 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 37750-37759 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37760-37769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37770-37779 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 37780-37789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 37790-37799 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37800-37809 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 37810-37819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37820-37829 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37830-37839 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37840-37849 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37850-37859 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37860-37869 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37870-37879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37880-37889 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37890-37899 - 7, 6, 5, 4, 3, 2, 1, 44, 43, 42, // 37900-37909 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 37910-37919 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 37920-37929 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37930-37939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37940-37949 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37950-37959 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 37960-37969 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37970-37979 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37980-37989 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 37990-37999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38000-38009 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 38010-38019 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38020-38029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 38030-38039 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38040-38049 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 38050-38059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 38060-38069 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38070-38079 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 38080-38089 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38090-38099 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38100-38109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 38110-38119 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 38120-38129 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38130-38139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 38140-38149 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38150-38159 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 38160-38169 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38170-38179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38180-38189 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38190-38199 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38200-38209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 38210-38219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38220-38229 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 38230-38239 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38240-38249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38250-38259 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38260-38269 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 38270-38279 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 38280-38289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 38290-38299 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38300-38309 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38310-38319 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 38320-38329 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38330-38339 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38340-38349 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38350-38359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38360-38369 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38370-38379 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38380-38389 - 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 38390-38399 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 38400-38409 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38410-38419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38420-38429 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 38430-38439 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 38440-38449 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 38450-38459 - 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 38460-38469 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 38470-38479 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38480-38489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38490-38499 - 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 38500-38509 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 38510-38519 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38520-38529 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38530-38539 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38540-38549 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38550-38559 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 38560-38569 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38570-38579 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38580-38589 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38590-38599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 38600-38609 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38610-38619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 38620-38629 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 38630-38639 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38640-38649 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 38650-38659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 38660-38669 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38670-38679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38680-38689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38690-38699 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38700-38709 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38710-38719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38720-38729 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 38730-38739 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 38740-38749 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 38750-38759 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38760-38769 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38770-38779 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 38780-38789 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38790-38799 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38800-38809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38810-38819 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38820-38829 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 38830-38839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38840-38849 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38850-38859 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38860-38869 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38870-38879 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38880-38889 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38890-38899 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38900-38909 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38910-38919 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38920-38929 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 38930-38939 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38940-38949 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 38950-38959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38960-38969 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38970-38979 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38980-38989 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 38990-38999 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39000-39009 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39010-39019 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39020-39029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39030-39039 - 1, 2, 1, 4, 3, 2, 1, 32, 31, 30, // 39040-39049 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39050-39059 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39060-39069 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39070-39079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39080-39089 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39090-39099 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 39100-39109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 39110-39119 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39120-39129 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 39130-39139 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 39140-39149 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39150-39159 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39160-39169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39170-39179 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39180-39189 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39190-39199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39200-39209 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 39210-39219 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 39220-39229 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 39230-39239 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39240-39249 - 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 39250-39259 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 39260-39269 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 39270-39279 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39280-39289 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39290-39299 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39300-39309 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 39310-39319 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39320-39329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39330-39339 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 39340-39349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39350-39359 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39360-39369 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 39370-39379 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 39380-39389 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 39390-39399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39400-39409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 39410-39419 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39420-39429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39430-39439 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39440-39449 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39450-39459 - 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 39460-39469 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39470-39479 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39480-39489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39490-39499 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 39500-39509 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39510-39519 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 39520-39529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39530-39539 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39540-39549 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39550-39559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 39560-39569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39570-39579 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 39580-39589 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 39590-39599 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 39600-39609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39610-39619 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39620-39629 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39630-39639 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39640-39649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39650-39659 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39660-39669 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 39670-39679 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 39680-39689 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39690-39699 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 39700-39709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39710-39719 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39720-39729 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 39730-39739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 39740-39749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39750-39759 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39760-39769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 39770-39779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39780-39789 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 39790-39799 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 39800-39809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39810-39819 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 39820-39829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 39830-39839 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 39840-39849 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39850-39859 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 39860-39869 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39870-39879 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 39880-39889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39890-39899 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39900-39909 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39910-39919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39920-39929 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 39930-39939 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39940-39949 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39950-39959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39960-39969 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39970-39979 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 39980-39989 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39990-39999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40000-40009 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40010-40019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40020-40029 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 40030-40039 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40040-40049 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40050-40059 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40060-40069 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40070-40079 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40080-40089 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 40090-40099 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40100-40109 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40110-40119 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 40120-40129 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 40130-40139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40140-40149 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 40150-40159 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 40160-40169 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40170-40179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40180-40189 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 40190-40199 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40200-40209 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40210-40219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40220-40229 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 40230-40239 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40240-40249 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40250-40259 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40260-40269 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40270-40279 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 54, // 40280-40289 - 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 40290-40299 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 40300-40309 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40310-40319 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40320-40329 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40330-40339 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40340-40349 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 40350-40359 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 40360-40369 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40370-40379 - 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 40380-40389 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40390-40399 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40400-40409 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40410-40419 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 40420-40429 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 40430-40439 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 40440-40449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40450-40459 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40460-40469 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40470-40479 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 40480-40489 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 40490-40499 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40500-40509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 40510-40519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 40520-40529 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40530-40539 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 40540-40549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 40550-40559 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40560-40569 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40570-40579 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40580-40589 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40590-40599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 40600-40609 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40610-40619 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 40620-40629 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 54, // 40630-40639 - 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 40640-40649 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 40650-40659 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40660-40669 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40670-40679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40680-40689 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 40690-40699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 40700-40709 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 40710-40719 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 40720-40729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40730-40739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40740-40749 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40750-40759 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40760-40769 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40770-40779 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 40780-40789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40790-40799 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40800-40809 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 40810-40819 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 40820-40829 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40830-40839 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 40840-40849 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 40850-40859 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40860-40869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40870-40879 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 40880-40889 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40890-40899 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40900-40909 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40910-40919 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40920-40929 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 40930-40939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40940-40949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40950-40959 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40960-40969 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 40970-40979 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40980-40989 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40990-40999 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41000-41009 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41010-41019 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41020-41029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41030-41039 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41040-41049 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 41050-41059 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41060-41069 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41070-41079 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 41080-41089 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41090-41099 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41100-41109 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 41110-41119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41120-41129 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41130-41139 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41140-41149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41150-41159 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41160-41169 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 41170-41179 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41180-41189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41190-41199 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41200-41209 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41210-41219 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41220-41229 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41230-41239 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 41240-41249 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41250-41259 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41260-41269 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41270-41279 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41280-41289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 34, // 41290-41299 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 41300-41309 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41310-41319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41320-41329 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41330-41339 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41340-41349 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 41350-41359 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 41360-41369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41370-41379 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 41380-41389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41390-41399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41400-41409 - 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 41410-41419 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41420-41429 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41430-41439 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41440-41449 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 41450-41459 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 41460-41469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41470-41479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41480-41489 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41490-41499 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41500-41509 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41510-41519 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41520-41529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 41530-41539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 41540-41549 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 41550-41559 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41560-41569 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 41570-41579 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41580-41589 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 41590-41599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41600-41609 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41610-41619 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 41620-41629 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41630-41639 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41640-41649 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 41650-41659 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41660-41669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41670-41679 - 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 41680-41689 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 41690-41699 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41700-41709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 41710-41719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41720-41729 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 41730-41739 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41740-41749 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 41750-41759 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41760-41769 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 41770-41779 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 41780-41789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41790-41799 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 41800-41809 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 41810-41819 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41820-41829 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41830-41839 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41840-41849 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41850-41859 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41860-41869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41870-41879 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41880-41889 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 41890-41899 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41900-41909 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41910-41919 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 41920-41929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41930-41939 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41940-41949 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 41950-41959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41960-41969 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41970-41979 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41980-41989 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 41990-41999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42000-42009 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 42010-42019 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 42020-42029 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42030-42039 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 42040-42049 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42050-42059 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42060-42069 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42070-42079 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 42080-42089 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42090-42099 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 42100-42109 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42110-42119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42120-42129 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 42130-42139 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42140-42149 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42150-42159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42160-42169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42170-42179 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42180-42189 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 42190-42199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 42200-42209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42210-42219 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 42220-42229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 42230-42239 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42240-42249 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 42250-42259 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42260-42269 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42270-42279 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42280-42289 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42290-42299 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 42300-42309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42310-42319 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42320-42329 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42330-42339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42340-42349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 42350-42359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42360-42369 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 42370-42379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42380-42389 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42390-42399 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 42400-42409 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42410-42419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42420-42429 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 42430-42439 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42440-42449 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42450-42459 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 42460-42469 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 42470-42479 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42480-42489 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42490-42499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 42500-42509 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42510-42519 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42520-42529 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 42530-42539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42540-42549 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42550-42559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42560-42569 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42570-42579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 42580-42589 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42590-42599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42600-42609 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 42610-42619 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42620-42629 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42630-42639 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 42640-42649 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42650-42659 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 42660-42669 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42670-42679 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42680-42689 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42690-42699 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 42700-42709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 42710-42719 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 42720-42729 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42730-42739 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42740-42749 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42750-42759 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42760-42769 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 42770-42779 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42780-42789 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 42790-42799 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42800-42809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42810-42819 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42820-42829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42830-42839 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42840-42849 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 42850-42859 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 42860-42869 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 42870-42879 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 42880-42889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42890-42899 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42900-42909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42910-42919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42920-42929 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42930-42939 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42940-42949 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42950-42959 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42960-42969 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42970-42979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 42980-42989 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42990-42999 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43000-43009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 43010-43019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43020-43029 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43030-43039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43040-43049 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43050-43059 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 43060-43069 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43070-43079 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43080-43089 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43090-43099 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43100-43109 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 43110-43119 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43120-43129 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 43130-43139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43140-43149 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 43150-43159 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43160-43169 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43170-43179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 43180-43189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43190-43199 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 43200-43209 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43210-43219 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43220-43229 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43230-43239 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43240-43249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43250-43259 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43260-43269 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43270-43279 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43280-43289 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43290-43299 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43300-43309 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 43310-43319 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43320-43329 - 1, 60, 59, 58, 57, 56, 55, 54, 53, 52, // 43330-43339 - 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 43340-43349 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 43350-43359 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 43360-43369 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43370-43379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43380-43389 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 43390-43399 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43400-43409 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43410-43419 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 43420-43429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43430-43439 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43440-43449 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43450-43459 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43460-43469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43470-43479 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43480-43489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 43490-43499 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43500-43509 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43510-43519 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43520-43529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43530-43539 - 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 43540-43549 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43550-43559 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43560-43569 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 43570-43579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43580-43589 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 43590-43599 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 43600-43609 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43610-43619 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 43620-43629 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 43630-43639 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43640-43649 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43650-43659 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 43660-43669 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43670-43679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43680-43689 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43690-43699 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43700-43709 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43710-43719 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 43720-43729 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43730-43739 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43740-43749 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 43750-43759 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43760-43769 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43770-43779 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 43780-43789 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43790-43799 - 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 43800-43809 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 43810-43819 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 43820-43829 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43830-43839 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43840-43849 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43850-43859 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 43860-43869 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 43870-43879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43880-43889 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43890-43899 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43900-43909 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 43910-43919 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43920-43929 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43930-43939 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43940-43949 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43950-43959 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 43960-43969 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43970-43979 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43980-43989 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 43990-43999 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44000-44009 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44010-44019 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 44020-44029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44030-44039 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44040-44049 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 44050-44059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44060-44069 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44070-44079 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 44080-44089 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44090-44099 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44100-44109 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44110-44119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 44120-44129 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44130-44139 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44140-44149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44150-44159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44160-44169 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 44170-44179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44180-44189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44190-44199 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 44200-44209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44210-44219 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44220-44229 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44230-44239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44240-44249 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 44250-44259 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 44260-44269 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 44270-44279 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44280-44289 - 3, 2, 1, 58, 57, 56, 55, 54, 53, 52, // 44290-44299 - 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 44300-44309 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 44310-44319 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 44320-44329 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 44330-44339 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44340-44349 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 44350-44359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44360-44369 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44370-44379 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 44380-44389 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 44390-44399 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44400-44409 - 7, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 44410-44419 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44420-44429 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44430-44439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44440-44449 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 44450-44459 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 44460-44469 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44470-44479 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44480-44489 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44490-44499 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44500-44509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44510-44519 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44520-44529 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 44530-44539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 44540-44549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44550-44559 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 44560-44569 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44570-44579 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 44580-44589 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 44590-44599 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44600-44609 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44610-44619 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 44620-44629 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44630-44639 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44640-44649 - 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 44650-44659 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 44660-44669 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44670-44679 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 44680-44689 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 44690-44699 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44700-44709 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44710-44719 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44720-44729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44730-44739 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44740-44749 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 44750-44759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44760-44769 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 44770-44779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44780-44789 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44790-44799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 44800-44809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 44810-44819 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44820-44829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44830-44839 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44840-44849 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44850-44859 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44860-44869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44870-44879 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 44880-44889 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 44890-44899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44900-44909 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 44910-44919 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44920-44929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 44930-44939 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44940-44949 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 44950-44959 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44960-44969 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44970-44979 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 44980-44989 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44990-44999 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45000-45009 - 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 45010-45019 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45020-45029 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45030-45039 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45040-45049 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45050-45059 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45060-45069 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45070-45079 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 45080-45089 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 45090-45099 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45100-45109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 45110-45119 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45120-45129 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 45130-45139 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 45140-45149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45150-45159 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45160-45169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 45170-45179 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45180-45189 - 1, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 45190-45199 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45200-45209 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45210-45219 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45220-45229 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45230-45239 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 45240-45249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 45250-45259 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45260-45269 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45270-45279 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 45280-45289 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45290-45299 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 45300-45309 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 45310-45319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 45320-45329 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45330-45339 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45340-45349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45350-45359 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45360-45369 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 45370-45379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 45380-45389 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45390-45399 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45400-45409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45410-45419 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45420-45429 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 42, // 45430-45439 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 45440-45449 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 45450-45459 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 45460-45469 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45470-45479 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45480-45489 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45490-45499 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 45500-45509 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45510-45519 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45520-45529 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45530-45539 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45540-45549 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 45550-45559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 45560-45569 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45570-45579 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 45580-45589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 45590-45599 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45600-45609 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45610-45619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45620-45629 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45630-45639 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45640-45649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 45650-45659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45660-45669 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 45670-45679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45680-45689 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 45690-45699 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 45700-45709 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 45710-45719 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45720-45729 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 45730-45739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45740-45749 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45750-45759 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 45760-45769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 38, // 45770-45779 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 45780-45789 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 45790-45799 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45800-45809 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45810-45819 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 45820-45829 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45830-45839 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45840-45849 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45850-45859 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 45860-45869 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45870-45879 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45880-45889 - 3, 2, 1, 50, 49, 48, 47, 46, 45, 44, // 45890-45899 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 45900-45909 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45910-45919 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45920-45929 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45930-45939 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 45940-45949 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 45950-45959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45960-45969 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 45970-45979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 45980-45989 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 45990-45999 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46000-46009 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46010-46019 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 46020-46029 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46030-46039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46040-46049 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46050-46059 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46060-46069 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 46070-46079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46080-46089 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 46090-46099 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 46100-46109 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46110-46119 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46120-46129 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 46130-46139 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 46140-46149 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 46150-46159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46160-46169 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46170-46179 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 46180-46189 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 46190-46199 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46200-46209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46210-46219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46220-46229 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 46230-46239 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46240-46249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46250-46259 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46260-46269 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 46270-46279 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46280-46289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46290-46299 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 46300-46309 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46310-46319 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 46320-46329 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46330-46339 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46340-46349 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 46350-46359 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46360-46369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46370-46379 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46380-46389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 46390-46399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46400-46409 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 46410-46419 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46420-46429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46430-46439 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46440-46449 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 46450-46459 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46460-46469 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46470-46479 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46480-46489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46490-46499 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46500-46509 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46510-46519 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 46520-46529 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46530-46539 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46540-46549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46550-46559 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 46560-46569 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 46570-46579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46580-46589 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46590-46599 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46600-46609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 46610-46619 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46620-46629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 46630-46639 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 46640-46649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46650-46659 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 46660-46669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46670-46679 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46680-46689 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46690-46699 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 46700-46709 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46710-46719 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 46720-46729 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46730-46739 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46740-46749 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46750-46759 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46760-46769 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 46770-46779 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 46780-46789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46790-46799 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46800-46809 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 46810-46819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46820-46829 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46830-46839 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46840-46849 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 46850-46859 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 46860-46869 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46870-46879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 46880-46889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46890-46899 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46900-46909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 46910-46919 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46920-46929 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 46930-46939 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46940-46949 - 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 46950-46959 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 46960-46969 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46970-46979 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46980-46989 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 46990-46999 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47000-47009 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 47010-47019 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47020-47029 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47030-47039 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47040-47049 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 47050-47059 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47060-47069 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47070-47079 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47080-47089 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 47090-47099 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47100-47109 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 47110-47119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47120-47129 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47130-47139 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 47140-47149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47150-47159 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 47160-47169 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47170-47179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 47180-47189 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47190-47199 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 47200-47209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47210-47219 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47220-47229 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 47230-47239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47240-47249 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47250-47259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 47260-47269 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 47270-47279 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47280-47289 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 47290-47299 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47300-47309 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 47310-47319 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47320-47329 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 47330-47339 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47340-47349 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 47350-47359 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 47360-47369 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47370-47379 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 47380-47389 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47390-47399 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 47400-47409 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 47410-47419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47420-47429 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47430-47439 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47440-47449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 47450-47459 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 47460-47469 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47470-47479 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47480-47489 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47490-47499 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47500-47509 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 47510-47519 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47520-47529 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 47530-47539 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 47540-47549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47550-47559 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 47560-47569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47570-47579 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47580-47589 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 47590-47599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 47600-47609 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47610-47619 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 47620-47629 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 47630-47639 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47640-47649 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 47650-47659 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47660-47669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47670-47679 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47680-47689 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 47690-47699 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47700-47709 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 47710-47719 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47720-47729 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47730-47739 - 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 47740-47749 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47750-47759 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47760-47769 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 47770-47779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47780-47789 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 47790-47799 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 47800-47809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 47810-47819 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47820-47829 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47830-47839 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 47840-47849 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 47850-47859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 47860-47869 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47870-47879 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 47880-47889 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47890-47899 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 47900-47909 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 47910-47919 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47920-47929 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47930-47939 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47940-47949 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47950-47959 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47960-47969 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47970-47979 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 47980-47989 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47990-47999 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48000-48009 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48010-48019 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 48020-48029 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48030-48039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 48040-48049 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48050-48059 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48060-48069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 48070-48079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48080-48089 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48090-48099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 48100-48109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48110-48119 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48120-48129 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 48130-48139 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48140-48149 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48150-48159 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 48160-48169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48170-48179 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48180-48189 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 48190-48199 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 48200-48209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48210-48219 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48220-48229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48230-48239 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48240-48249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 48250-48259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48260-48269 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48270-48279 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48280-48289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 48290-48299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48300-48309 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48310-48319 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48320-48329 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48330-48339 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48340-48349 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48350-48359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48360-48369 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48370-48379 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 48380-48389 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 48390-48399 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 48400-48409 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48410-48419 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48420-48429 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48430-48439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 48440-48449 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48450-48459 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 48460-48469 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 48470-48479 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48480-48489 - 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 48490-48499 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48500-48509 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48510-48519 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 48520-48529 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 48530-48539 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48540-48549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48550-48559 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 48560-48569 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48570-48579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 48580-48589 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48590-48599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48600-48609 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 48610-48619 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48620-48629 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48630-48639 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 48640-48649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48650-48659 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48660-48669 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 52, // 48670-48679 - 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 48680-48689 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 48690-48699 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 48700-48709 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 48710-48719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48720-48729 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48730-48739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48740-48749 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48750-48759 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48760-48769 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48770-48779 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48780-48789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 48790-48799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48800-48809 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48810-48819 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48820-48829 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48830-48839 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 48840-48849 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 48850-48859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48860-48869 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48870-48879 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 48880-48889 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48890-48899 - 7, 6, 5, 4, 3, 2, 1, 40, 39, 38, // 48900-48909 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 48910-48919 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 48920-48929 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48930-48939 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48940-48949 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 48950-48959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48960-48969 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 48970-48979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48980-48989 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48990-48999 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 49000-49009 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 49010-49019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49020-49029 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 49030-49039 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49040-49049 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49050-49059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 49060-49069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49070-49079 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49080-49089 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49090-49099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 49100-49109 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49110-49119 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 49120-49129 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 49130-49139 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49140-49149 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49150-49159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49160-49169 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 49170-49179 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49180-49189 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 49190-49199 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49200-49209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49210-49219 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 49220-49229 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49230-49239 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49240-49249 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 49250-49259 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49260-49269 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 49270-49279 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49280-49289 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49290-49299 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 49300-49309 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49310-49319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49320-49329 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 49330-49339 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49340-49349 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49350-49359 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 49360-49369 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49370-49379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49380-49389 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 49390-49399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49400-49409 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49410-49419 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 49420-49429 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 49430-49439 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49440-49449 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 49450-49459 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49460-49469 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49470-49479 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 49480-49489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 49490-49499 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49500-49509 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49510-49519 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 49520-49529 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49530-49539 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 49540-49549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 38, // 49550-49559 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 49560-49569 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 49570-49579 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49580-49589 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 49590-49599 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 49600-49609 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49610-49619 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 49620-49629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 49630-49639 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49640-49649 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49650-49659 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 49660-49669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49670-49679 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49680-49689 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 49690-49699 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49700-49709 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49710-49719 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49720-49729 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49730-49739 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49740-49749 - 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 49750-49759 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49760-49769 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49770-49779 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 49780-49789 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49790-49799 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49800-49809 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49810-49819 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 49820-49829 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49830-49839 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 49840-49849 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 49850-49859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49860-49869 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 49870-49879 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49880-49889 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 49890-49899 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 49900-49909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49910-49919 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49920-49929 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 49930-49939 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49940-49949 - 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 49950-49959 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 49960-49969 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49970-49979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49980-49989 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 49990-49999 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50000-50009 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50010-50019 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50020-50029 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50030-50039 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50040-50049 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 50050-50059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 50060-50069 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 50070-50079 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50080-50089 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50090-50099 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50100-50109 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50110-50119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50120-50129 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50130-50139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50140-50149 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 50150-50159 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50160-50169 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 50170-50179 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50180-50189 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50190-50199 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 50200-50209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50210-50219 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50220-50229 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50230-50239 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50240-50249 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50250-50259 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50260-50269 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50270-50279 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50280-50289 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50290-50299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50300-50309 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50310-50319 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50320-50329 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50330-50339 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50340-50349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50350-50359 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50360-50369 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50370-50379 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 50380-50389 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50390-50399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50400-50409 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50410-50419 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50420-50429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50430-50439 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50440-50449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 50450-50459 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 50460-50469 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50470-50479 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50480-50489 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50490-50499 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50500-50509 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50510-50519 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 50520-50529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50530-50539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50540-50549 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50550-50559 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50560-50569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50570-50579 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50580-50589 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 50590-50599 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50600-50609 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50610-50619 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 50620-50629 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50630-50639 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50640-50649 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50650-50659 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50660-50669 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50670-50679 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 50680-50689 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50690-50699 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 50700-50709 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50710-50719 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50720-50729 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50730-50739 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50740-50749 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50750-50759 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50760-50769 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 50770-50779 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 50780-50789 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50790-50799 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50800-50809 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50810-50819 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50820-50829 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 50830-50839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 50840-50849 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 50850-50859 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50860-50869 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50870-50879 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50880-50889 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 50890-50899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 50900-50909 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50910-50919 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 50920-50929 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50930-50939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50940-50949 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 50950-50959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 50960-50969 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50970-50979 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50980-50989 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50990-50999 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 51000-51009 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51010-51019 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51020-51029 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51030-51039 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 51040-51049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51050-51059 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51060-51069 - 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 51070-51079 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 51080-51089 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51090-51099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 51100-51109 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51110-51119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51120-51129 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 51130-51139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51140-51149 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51150-51159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 51160-51169 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51170-51179 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51180-51189 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 51190-51199 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51200-51209 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51210-51219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 51220-51229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51230-51239 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51240-51249 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51250-51259 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 51260-51269 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51270-51279 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 51280-51289 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51290-51299 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 51300-51309 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51310-51319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51320-51329 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51330-51339 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 51340-51349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51350-51359 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51360-51369 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51370-51379 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 51380-51389 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51390-51399 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51400-51409 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51410-51419 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51420-51429 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 51430-51439 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51440-51449 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51450-51459 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51460-51469 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51470-51479 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 51480-51489 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51490-51499 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 51500-51509 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51510-51519 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51520-51529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51530-51539 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51540-51549 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51550-51559 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51560-51569 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51570-51579 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51580-51589 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 51590-51599 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51600-51609 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 51610-51619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51620-51629 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51630-51639 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51640-51649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 51650-51659 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51660-51669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 51670-51679 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 51680-51689 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51690-51699 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51700-51709 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51710-51719 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 51720-51729 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51730-51739 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 51740-51749 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51750-51759 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 51760-51769 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51770-51779 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51780-51789 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51790-51799 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51800-51809 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51810-51819 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 51820-51829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 51830-51839 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51840-51849 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 51850-51859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51860-51869 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51870-51879 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51880-51889 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 51890-51899 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51900-51909 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 51910-51919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51920-51929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51930-51939 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 51940-51949 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51950-51959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51960-51969 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 51970-51979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51980-51989 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51990-51999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52000-52009 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52010-52019 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 52020-52029 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 52030-52039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52040-52049 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 52050-52059 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 52060-52069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52070-52079 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52080-52089 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52090-52099 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 52100-52109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52110-52119 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 52120-52129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52130-52139 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52140-52149 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 52150-52159 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52160-52169 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52170-52179 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 52180-52189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52190-52199 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52200-52209 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52210-52219 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52220-52229 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52230-52239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52240-52249 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 52250-52259 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 52260-52269 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52270-52279 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52280-52289 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52290-52299 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52300-52309 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52310-52319 - 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 52320-52329 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 52330-52339 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 52340-52349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52350-52359 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 52360-52369 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 52370-52379 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52380-52389 - 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 52390-52399 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 52400-52409 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52410-52419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52420-52429 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 52430-52439 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52440-52449 - 3, 2, 1, 4, 3, 2, 1, 32, 31, 30, // 52450-52459 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 52460-52469 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52470-52479 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52480-52489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52490-52499 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52500-52509 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52510-52519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52520-52529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52530-52539 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 52540-52549 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52550-52559 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52560-52569 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52570-52579 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 52580-52589 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52590-52599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 52600-52609 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52610-52619 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52620-52629 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 52630-52639 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 52640-52649 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52650-52659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52660-52669 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 52670-52679 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52680-52689 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52690-52699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52700-52709 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52710-52719 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52720-52729 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52730-52739 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 52740-52749 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52750-52759 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 52760-52769 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52770-52779 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 52780-52789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52790-52799 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52800-52809 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 52810-52819 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52820-52829 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 52830-52839 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52840-52849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52850-52859 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52860-52869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52870-52879 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 52880-52889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52890-52899 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 52900-52909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 52910-52919 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52920-52929 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 52930-52939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52940-52949 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52950-52959 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 52960-52969 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52970-52979 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52980-52989 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52990-52999 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 53000-53009 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 53010-53019 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53020-53029 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53030-53039 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53040-53049 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53050-53059 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53060-53069 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 53070-53079 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 53080-53089 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53090-53099 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53100-53109 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53110-53119 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 53120-53129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53130-53139 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 53140-53149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53150-53159 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53160-53169 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 53170-53179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53180-53189 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53190-53199 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 53200-53209 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53210-53219 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53220-53229 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 53230-53239 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53240-53249 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53250-53259 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 53260-53269 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53270-53279 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53280-53289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 53290-53299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 53300-53309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53310-53319 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 53320-53329 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53330-53339 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53340-53349 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 53350-53359 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53360-53369 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53370-53379 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53380-53389 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53390-53399 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53400-53409 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 53410-53419 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53420-53429 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53430-53439 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53440-53449 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 53450-53459 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53460-53469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 53470-53479 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53480-53489 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53490-53499 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 53500-53509 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53510-53519 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 53520-53529 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53530-53539 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53540-53549 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53550-53559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 53560-53569 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53570-53579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53580-53589 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53590-53599 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53600-53609 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53610-53619 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 53620-53629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 53630-53639 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53640-53649 - 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 53650-53659 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53660-53669 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53670-53679 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53680-53689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 53690-53699 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53700-53709 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 53710-53719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53720-53729 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 53730-53739 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53740-53749 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 53750-53759 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53760-53769 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 53770-53779 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53780-53789 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53790-53799 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53800-53809 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 53810-53819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53820-53829 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53830-53839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53840-53849 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53850-53859 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53860-53869 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53870-53879 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53880-53889 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 53890-53899 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53900-53909 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53910-53919 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53920-53929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 53930-53939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53940-53949 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 53950-53959 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53960-53969 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53970-53979 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53980-53989 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53990-53999 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54000-54009 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 54010-54019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54020-54029 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54030-54039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 54040-54049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 54050-54059 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 54060-54069 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54070-54079 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54080-54089 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54090-54099 - 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54100-54109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54110-54119 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54120-54129 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 54130-54139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54140-54149 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54150-54159 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 54160-54169 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54170-54179 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54180-54189 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 54190-54199 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54200-54209 - 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 54210-54219 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 54220-54229 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54230-54239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54240-54249 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54250-54259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 54260-54269 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 54270-54279 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54280-54289 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54290-54299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54300-54309 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54310-54319 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54320-54329 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54330-54339 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 54340-54349 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54350-54359 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54360-54369 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 54370-54379 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54380-54389 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54390-54399 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 54400-54409 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 54410-54419 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54420-54429 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54430-54439 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 54440-54449 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54450-54459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 54460-54469 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 54470-54479 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54480-54489 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 54490-54499 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 54500-54509 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54510-54519 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54520-54529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 54530-54539 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54540-54549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54550-54559 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 54560-54569 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54570-54579 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54580-54589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54590-54599 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54600-54609 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54610-54619 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 54620-54629 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54630-54639 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 54640-54649 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54650-54659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54660-54669 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 54670-54679 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 54680-54689 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54690-54699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54700-54709 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54710-54719 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 54720-54729 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54730-54739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54740-54749 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54750-54759 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54760-54769 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 54770-54779 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54780-54789 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 54790-54799 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 54800-54809 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54810-54819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54820-54829 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54830-54839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54840-54849 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54850-54859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 54860-54869 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54870-54879 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 54880-54889 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54890-54899 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 54900-54909 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 54910-54919 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54920-54929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54930-54939 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 54940-54949 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 54950-54959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54960-54969 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 54970-54979 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54980-54989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54990-54999 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55000-55009 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55010-55019 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55020-55029 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55030-55039 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55040-55049 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55050-55059 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55060-55069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 55070-55079 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55080-55089 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55090-55099 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55100-55109 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 55110-55119 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 55120-55129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55130-55139 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 55140-55149 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55150-55159 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55160-55169 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 55170-55179 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55180-55189 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55190-55199 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55200-55209 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 55210-55219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 55220-55229 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55230-55239 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 55240-55249 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 55250-55259 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 55260-55269 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55270-55279 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55280-55289 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55290-55299 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55300-55309 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 55310-55319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55320-55329 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 55330-55339 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55340-55349 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55350-55359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55360-55369 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55370-55379 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55380-55389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55390-55399 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55400-55409 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55410-55419 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55420-55429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55430-55439 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55440-55449 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 55450-55459 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 55460-55469 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55470-55479 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 55480-55489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55490-55499 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55500-55509 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55510-55519 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55520-55529 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55530-55539 - 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 55540-55549 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55550-55559 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55560-55569 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 55570-55579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 55580-55589 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55590-55599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 55600-55609 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55610-55619 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55620-55629 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 55630-55639 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55640-55649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55650-55659 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 55660-55669 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55670-55679 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55680-55689 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 55690-55699 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55700-55709 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55710-55719 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55720-55729 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 55730-55739 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55740-55749 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55750-55759 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 55760-55769 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55770-55779 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55780-55789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55790-55799 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55800-55809 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 55810-55819 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55820-55829 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55830-55839 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 55840-55849 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55850-55859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55860-55869 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55870-55879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 55880-55889 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55890-55899 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 55900-55909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55910-55919 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55920-55929 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 55930-55939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 55940-55949 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55950-55959 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 55960-55969 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55970-55979 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 55980-55989 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55990-55999 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 56000-56009 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 56010-56019 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56020-56029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 56030-56039 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56040-56049 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 56050-56059 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 56060-56069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56070-56079 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56080-56089 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 56090-56099 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56100-56109 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56110-56119 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56120-56129 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56130-56139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 56140-56149 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56150-56159 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 56160-56169 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 56170-56179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56180-56189 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 56190-56199 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 56200-56209 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 56210-56219 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56220-56229 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 56230-56239 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 56240-56249 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56250-56259 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 56260-56269 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 56270-56279 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56280-56289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 56290-56299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56300-56309 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 56310-56319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56320-56329 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56330-56339 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56340-56349 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 56350-56359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 56360-56369 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56370-56379 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56380-56389 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56390-56399 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56400-56409 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 56410-56419 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56420-56429 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56430-56439 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56440-56449 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 56450-56459 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56460-56469 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 56470-56479 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 56480-56489 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56490-56499 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 56500-56509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 56510-56519 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 56520-56529 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56530-56539 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56540-56549 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56550-56559 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 56560-56569 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 56570-56579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56580-56589 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 56590-56599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56600-56609 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56610-56619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 56620-56629 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56630-56639 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56640-56649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 56650-56659 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56660-56669 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56670-56679 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 56680-56689 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56690-56699 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56700-56709 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 56710-56719 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56720-56729 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 56730-56739 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 56740-56749 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56750-56759 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56760-56769 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 56770-56779 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 56780-56789 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56790-56799 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 56800-56809 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56810-56819 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 56820-56829 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56830-56839 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 56840-56849 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 56850-56859 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56860-56869 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 56870-56879 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56880-56889 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 56890-56899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 56900-56909 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56910-56919 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 56920-56929 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56930-56939 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56940-56949 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56950-56959 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 56960-56969 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56970-56979 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 56980-56989 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 38, // 56990-56999 - 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 57000-57009 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57010-57019 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57020-57029 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57030-57039 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57040-57049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 57050-57059 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57060-57069 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 57070-57079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57080-57089 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 57090-57099 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57100-57109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 57110-57119 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57120-57129 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57130-57139 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 57140-57149 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57150-57159 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57160-57169 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 57170-57179 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57180-57189 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57190-57199 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 57200-57209 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57210-57219 - 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 57220-57229 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57230-57239 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57240-57249 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57250-57259 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57260-57269 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57270-57279 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 57280-57289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57290-57299 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 57300-57309 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57310-57319 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57320-57329 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57330-57339 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 57340-57349 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57350-57359 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57360-57369 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57370-57379 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 57380-57389 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 57390-57399 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57400-57409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 57410-57419 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 57420-57429 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57430-57439 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57440-57449 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 57450-57459 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 57460-57469 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57470-57479 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57480-57489 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57490-57499 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 57500-57509 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57510-57519 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 57520-57529 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57530-57539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57540-57549 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 57550-57559 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57560-57569 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57570-57579 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57580-57589 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 57590-57599 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 57600-57609 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57610-57619 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57620-57629 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57630-57639 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57640-57649 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 57650-57659 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57660-57669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57670-57679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57680-57689 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57690-57699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57700-57709 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 57710-57719 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57720-57729 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 57730-57739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57740-57749 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57750-57759 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57760-57769 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 57770-57779 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57780-57789 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57790-57799 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 57800-57809 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57810-57819 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57820-57829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57830-57839 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57840-57849 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 57850-57859 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 57860-57869 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57870-57879 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57880-57889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57890-57899 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57900-57909 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57910-57919 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 57920-57929 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57930-57939 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 57940-57949 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57950-57959 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57960-57969 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 57970-57979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57980-57989 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57990-57999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58000-58009 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 58010-58019 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58020-58029 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58030-58039 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 58040-58049 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58050-58059 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58060-58069 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 58070-58079 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58080-58089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 58090-58099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58100-58109 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58110-58119 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 58120-58129 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58130-58139 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58140-58149 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 58150-58159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58160-58169 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58170-58179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 58180-58189 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 58190-58199 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58200-58209 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58210-58219 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58220-58229 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58230-58239 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 58240-58249 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58250-58259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58260-58269 - 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 58270-58279 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 58280-58289 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58290-58299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 58300-58309 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58310-58319 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58320-58329 - 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 58330-58339 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 58340-58349 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58350-58359 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 58360-58369 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 58370-58379 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58380-58389 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 58390-58399 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58400-58409 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 58410-58419 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58420-58429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58430-58439 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58440-58449 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 58450-58459 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58460-58469 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58470-58479 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 58480-58489 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58490-58499 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58500-58509 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 58510-58519 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58520-58529 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58530-58539 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 58540-58549 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58550-58559 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58560-58569 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 58570-58579 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58580-58589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58590-58599 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 58600-58609 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 58610-58619 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58620-58629 - 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 58630-58639 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58640-58649 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58650-58659 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58660-58669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 58670-58679 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58680-58689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 58690-58699 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58700-58709 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58710-58719 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58720-58729 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58730-58739 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58740-58749 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58750-58759 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58760-58769 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58770-58779 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 42, // 58780-58789 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 58790-58799 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 58800-58809 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58810-58819 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58820-58829 - 1, 58, 57, 56, 55, 54, 53, 52, 51, 50, // 58830-58839 - 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 58840-58849 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 58850-58859 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 58860-58869 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58870-58879 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 58880-58889 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58890-58899 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 58900-58909 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58910-58919 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58920-58929 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58930-58939 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 58940-58949 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58950-58959 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 58960-58969 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 58970-58979 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58980-58989 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58990-58999 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 59000-59009 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59010-59019 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 59020-59029 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59030-59039 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59040-59049 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59050-59059 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59060-59069 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59070-59079 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59080-59089 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59090-59099 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59100-59109 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 59110-59119 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 59120-59129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59130-59139 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 59140-59149 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59150-59159 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 59160-59169 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59170-59179 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59180-59189 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59190-59199 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 59200-59209 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 59210-59219 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59220-59229 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 59230-59239 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 59240-59249 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59250-59259 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59260-59269 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 59270-59279 - 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 59280-59289 - 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 59290-59299 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 59300-59309 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59310-59319 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59320-59329 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 59330-59339 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59340-59349 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 59350-59359 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59360-59369 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59370-59379 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59380-59389 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59390-59399 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59400-59409 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 59410-59419 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59420-59429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59430-59439 - 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 59440-59449 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59450-59459 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59460-59469 - 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 59470-59479 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 59480-59489 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 59490-59499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 59500-59509 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 59510-59519 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 59520-59529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 59530-59539 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 59540-59549 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59550-59559 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 59560-59569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59570-59579 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 59580-59589 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59590-59599 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59600-59609 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59610-59619 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 59620-59629 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59630-59639 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59640-59649 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 59650-59659 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 59660-59669 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59670-59679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59680-59689 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59690-59699 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 59700-59709 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59710-59719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 59720-59729 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59730-59739 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 59740-59749 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 59750-59759 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59760-59769 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 59770-59779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59780-59789 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 59790-59799 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 59800-59809 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59810-59819 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59820-59829 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 59830-59839 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59840-59849 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59850-59859 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 59860-59869 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59870-59879 - 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 59880-59889 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 59890-59899 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59900-59909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59910-59919 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 59920-59929 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59930-59939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59940-59949 - 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 59950-59959 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59960-59969 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59970-59979 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 59980-59989 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 59990-59999 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60000-60009 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 60010-60019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60020-60029 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60030-60039 - 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 60040-60049 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 60050-60059 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60060-60069 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60070-60079 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 60080-60089 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60090-60099 - 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 60100-60109 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60110-60119 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60120-60129 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 60130-60139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60140-60149 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60150-60159 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 40, // 60160-60169 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60170-60179 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60180-60189 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60190-60199 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60200-60209 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60210-60219 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 60220-60229 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 60230-60239 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60240-60249 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 60250-60259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60260-60269 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60270-60279 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 60280-60289 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 60290-60299 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60300-60309 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 60310-60319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60320-60329 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60330-60339 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60340-60349 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 60350-60359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60360-60369 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60370-60379 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60380-60389 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 60390-60399 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60400-60409 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60410-60419 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 60420-60429 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60430-60439 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 60440-60449 - 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 60450-60459 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 60460-60469 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 60470-60479 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60480-60489 - 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 60490-60499 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60500-60509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60510-60519 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 60520-60529 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 50, // 60530-60539 - 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 60540-60549 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60550-60559 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60560-60569 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60570-60579 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60580-60589 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60590-60599 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60600-60609 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60610-60619 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 60620-60629 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 60630-60639 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 60640-60649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 60650-60659 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60660-60669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 60670-60679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 60680-60689 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60690-60699 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 60700-60709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60710-60719 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60720-60729 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 60730-60739 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60740-60749 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60750-60759 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60760-60769 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 60770-60779 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60780-60789 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 60790-60799 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60800-60809 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60810-60819 - 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60820-60829 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60830-60839 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60840-60849 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 60850-60859 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 60860-60869 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60870-60879 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 60880-60889 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 60890-60899 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60900-60909 - 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 60910-60919 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60920-60929 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60930-60939 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60940-60949 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 60950-60959 - 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 60960-60969 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 60970-60979 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 60980-60989 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60990-60999 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 61000-61009 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61010-61019 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61020-61029 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61030-61039 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61040-61049 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 61050-61059 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61060-61069 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61070-61079 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61080-61089 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 61090-61099 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61100-61109 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61110-61119 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 61120-61129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61130-61139 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61140-61149 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61150-61159 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 42, // 61160-61169 - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 61170-61179 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61180-61189 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61190-61199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61200-61209 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61210-61219 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61220-61229 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61230-61239 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61240-61249 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61250-61259 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61260-61269 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61270-61279 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61280-61289 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 61290-61299 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61300-61309 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61310-61319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61320-61329 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 61330-61339 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61340-61349 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61350-61359 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61360-61369 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 61370-61379 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61380-61389 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61390-61399 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 61400-61409 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 61410-61419 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61420-61429 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61430-61439 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61440-61449 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61450-61459 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 61460-61469 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61470-61479 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 61480-61489 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61490-61499 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61500-61509 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 61510-61519 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61520-61529 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61530-61539 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 61540-61549 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 61550-61559 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61560-61569 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61570-61579 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 61580-61589 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61590-61599 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 61600-61609 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61610-61619 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61620-61629 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61630-61639 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61640-61649 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 61650-61659 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61660-61669 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61670-61679 - 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 61680-61689 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61690-61699 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61700-61709 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61710-61719 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 61720-61729 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61730-61739 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61740-61749 - 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 61750-61759 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61760-61769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61770-61779 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 61780-61789 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61790-61799 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61800-61809 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 61810-61819 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61820-61829 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61830-61839 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 61840-61849 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61850-61859 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61860-61869 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 61870-61879 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 61880-61889 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 61890-61899 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 61900-61909 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61910-61919 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61920-61929 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61930-61939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 61940-61949 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61950-61959 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 61960-61969 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 61970-61979 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61980-61989 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61990-61999 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62000-62009 - 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 62010-62019 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62020-62029 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62030-62039 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62040-62049 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 62050-62059 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62060-62069 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62070-62079 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62080-62089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 62090-62099 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62100-62109 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 62110-62119 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62120-62129 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62130-62139 - 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 62140-62149 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 62150-62159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62160-62169 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62170-62179 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62180-62189 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62190-62199 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62200-62209 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 62210-62219 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62220-62229 - 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 62230-62239 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 62240-62249 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62250-62259 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62260-62269 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 62270-62279 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62280-62289 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 62290-62299 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62300-62309 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62310-62319 - 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 62320-62329 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62330-62339 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62340-62349 - 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 62350-62359 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62360-62369 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62370-62379 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62380-62389 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62390-62399 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62400-62409 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62410-62419 - 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 62420-62429 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 62430-62439 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62440-62449 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62450-62459 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62460-62469 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 62470-62479 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 62480-62489 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62490-62499 - 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 62500-62509 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62510-62519 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62520-62529 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 62530-62539 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 62540-62549 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62550-62559 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62560-62569 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62570-62579 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62580-62589 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62590-62599 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 62600-62609 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 62610-62619 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62620-62629 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 62630-62639 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62640-62649 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 62650-62659 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62660-62669 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62670-62679 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 62680-62689 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62690-62699 - 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62700-62709 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62710-62719 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62720-62729 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62730-62739 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 62740-62749 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62750-62759 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62760-62769 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62770-62779 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62780-62789 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62790-62799 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62800-62809 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62810-62819 - 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 62820-62829 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 62830-62839 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62840-62849 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62850-62859 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 62860-62869 - 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 62870-62879 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62880-62889 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62890-62899 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62900-62909 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62910-62919 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 62920-62929 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 62930-62939 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 62940-62949 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62950-62959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62960-62969 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62970-62979 - 1, 2, 1, 4, 3, 2, 1, 2, 1, 40, // 62980-62989 - 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 62990-62999 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63000-63009 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63010-63019 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63020-63029 - 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63030-63039 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63040-63049 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63050-63059 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63060-63069 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 63070-63079 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63080-63089 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63090-63099 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 63100-63109 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 63110-63119 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63120-63129 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63130-63139 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 63140-63149 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63150-63159 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63160-63169 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63170-63179 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63180-63189 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 63190-63199 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63200-63209 - 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 63210-63219 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63220-63229 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63230-63239 - 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 63240-63249 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 63250-63259 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63260-63269 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63270-63279 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63280-63289 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 63290-63299 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63300-63309 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 63310-63319 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63320-63329 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63330-63339 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63340-63349 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63350-63359 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63360-63369 - 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63370-63379 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63380-63389 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63390-63399 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 63400-63409 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63410-63419 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63420-63429 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 63430-63439 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 63440-63449 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63450-63459 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 63460-63469 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 63470-63479 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63480-63489 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 63490-63499 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63500-63509 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63510-63519 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63520-63529 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63530-63539 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63540-63549 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63550-63559 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63560-63569 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63570-63579 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 63580-63589 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63590-63599 - 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63600-63609 - 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63610-63619 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63620-63629 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63630-63639 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 63640-63649 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63650-63659 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63660-63669 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63670-63679 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63680-63689 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63690-63699 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 63700-63709 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63710-63719 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63720-63729 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63730-63739 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 63740-63749 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63750-63759 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63760-63769 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63770-63779 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63780-63789 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 63790-63799 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 63800-63809 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63810-63819 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 63820-63829 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63830-63839 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63840-63849 - 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 63850-63859 - 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 63860-63869 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 63870-63879 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63880-63889 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63890-63899 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63900-63909 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 63910-63919 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 63920-63929 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63930-63939 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 63940-63949 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 63950-63959 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63960-63969 - 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 63970-63979 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63980-63989 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63990-63999 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64000-64009 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 64010-64019 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64020-64029 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 64030-64039 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64040-64049 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64050-64059 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 64060-64069 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64070-64079 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64080-64089 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64090-64099 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64100-64109 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64110-64119 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 64120-64129 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64130-64139 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64140-64149 - 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 64150-64159 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64160-64169 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64170-64179 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 64180-64189 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64190-64199 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64200-64209 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64210-64219 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64220-64229 - 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 64230-64239 - 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 64240-64249 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64250-64259 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64260-64269 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64270-64279 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64280-64289 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64290-64299 - 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 64300-64309 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 64310-64319 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64320-64329 - 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 64330-64339 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 64340-64349 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64350-64359 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64360-64369 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64370-64379 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64380-64389 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64390-64399 - 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 64400-64409 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64410-64419 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64420-64429 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 64430-64439 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64440-64449 - 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 64450-64459 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64460-64469 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64470-64479 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 64480-64489 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64490-64499 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64500-64509 - 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 64510-64519 - 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 64520-64529 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64530-64539 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64540-64549 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 64550-64559 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 64560-64569 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 64570-64579 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64580-64589 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64590-64599 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64600-64609 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64610-64619 - 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64620-64629 - 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 64630-64639 - 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64640-64649 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64650-64659 - 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 64660-64669 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64670-64679 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64680-64689 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 64690-64699 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 64700-64709 - 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 64710-64719 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64720-64729 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64730-64739 - 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 64740-64749 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64750-64759 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64760-64769 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64770-64779 - 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 64780-64789 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64790-64799 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64800-64809 - 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 64810-64819 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 64820-64829 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64830-64839 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64840-64849 - 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64850-64859 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64860-64869 - 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 64870-64879 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64880-64889 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64890-64899 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64900-64909 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 64910-64919 - 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 64920-64929 - 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 64930-64939 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64940-64949 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64950-64959 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 64960-64969 - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64970-64979 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64980-64989 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64990-64999 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 65000-65009 - 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65010-65019 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 65020-65029 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 65030-65039 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65040-65049 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 65050-65059 - 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 65060-65069 - 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65070-65079 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 65080-65089 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 65090-65099 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65100-65109 - 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 65110-65119 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 65120-65129 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65130-65139 - 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 65140-65149 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65150-65159 - 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 65160-65169 - 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 65170-65179 - 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 65180-65189 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65190-65199 - 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 65200-65209 - 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 65210-65219 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65220-65229 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 65230-65239 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65240-65249 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 65250-65259 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 65260-65269 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65270-65279 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 65280-65289 - 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 65290-65299 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 65300-65309 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65310-65319 - 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 65320-65329 - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 65330-65339 - 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65340-65349 - 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 65350-65359 - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65360-65369 - 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65370-65379 - 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65380-65389 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 65390-65399 - 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 65400-65409 - 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 65410-65419 - 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 65420-65429 - 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 65430-65439 - 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 65440-65449 - 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 65450-65459 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65460-65469 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 65470-65479 - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65480-65489 - 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 65490-65499 - 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65500-65509 - 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 65510-65519 - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 65520-65529 - 0, 0, 0, 0, 0, 0, - } - - lohi [256]struct{ lo, hi int } -) - -func init() { - for i, v := range liars { - blk := v >> 24 - x := &lohi[blk] - if x.lo == 0 || i < x.lo { - x.lo = i - } - if i > x.hi { - x.hi = i - } - } -} diff --git a/vendor/github.com/cznic/mathutil/test_deps.go b/vendor/github.com/cznic/mathutil/test_deps.go deleted file mode 100644 index 40054dc..0000000 --- a/vendor/github.com/cznic/mathutil/test_deps.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2014 The mathutil Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mathutil - -// Pull test dependencies too. -// Enables easy 'go test X' after 'go get X' -import ( -// nothing yet -) diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 0f64693..0000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/golang/protobuf/jsonpb/decode.go b/vendor/github.com/golang/protobuf/jsonpb/decode.go deleted file mode 100644 index 6c16c25..0000000 --- a/vendor/github.com/golang/protobuf/jsonpb/decode.go +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jsonpb - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "math" - "reflect" - "strconv" - "strings" - "time" - - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/encoding/protojson" - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapJSONUnmarshalV2 = false - -// UnmarshalNext unmarshals the next JSON object from d into m. -func UnmarshalNext(d *json.Decoder, m proto.Message) error { - return new(Unmarshaler).UnmarshalNext(d, m) -} - -// Unmarshal unmarshals a JSON object from r into m. -func Unmarshal(r io.Reader, m proto.Message) error { - return new(Unmarshaler).Unmarshal(r, m) -} - -// UnmarshalString unmarshals a JSON object from s into m. -func UnmarshalString(s string, m proto.Message) error { - return new(Unmarshaler).Unmarshal(strings.NewReader(s), m) -} - -// Unmarshaler is a configurable object for converting from a JSON -// representation to a protocol buffer object. -type Unmarshaler struct { - // AllowUnknownFields specifies whether to allow messages to contain - // unknown JSON fields, as opposed to failing to unmarshal. - AllowUnknownFields bool - - // AnyResolver is used to resolve the google.protobuf.Any well-known type. - // If unset, the global registry is used by default. - AnyResolver AnyResolver -} - -// JSONPBUnmarshaler is implemented by protobuf messages that customize the way -// they are unmarshaled from JSON. Messages that implement this should also -// implement JSONPBMarshaler so that the custom format can be produced. -// -// The JSON unmarshaling must follow the JSON to proto specification: -// https://developers.google.com/protocol-buffers/docs/proto3#json -// -// Deprecated: Custom types should implement protobuf reflection instead. -type JSONPBUnmarshaler interface { - UnmarshalJSONPB(*Unmarshaler, []byte) error -} - -// Unmarshal unmarshals a JSON object from r into m. -func (u *Unmarshaler) Unmarshal(r io.Reader, m proto.Message) error { - return u.UnmarshalNext(json.NewDecoder(r), m) -} - -// UnmarshalNext unmarshals the next JSON object from d into m. -func (u *Unmarshaler) UnmarshalNext(d *json.Decoder, m proto.Message) error { - if m == nil { - return errors.New("invalid nil message") - } - - // Parse the next JSON object from the stream. - raw := json.RawMessage{} - if err := d.Decode(&raw); err != nil { - return err - } - - // Check for custom unmarshalers first since they may not properly - // implement protobuf reflection that the logic below relies on. - if jsu, ok := m.(JSONPBUnmarshaler); ok { - return jsu.UnmarshalJSONPB(u, raw) - } - - mr := proto.MessageReflect(m) - - // NOTE: For historical reasons, a top-level null is treated as a noop. - // This is incorrect, but kept for compatibility. - if string(raw) == "null" && mr.Descriptor().FullName() != "google.protobuf.Value" { - return nil - } - - if wrapJSONUnmarshalV2 { - // NOTE: If input message is non-empty, we need to preserve merge semantics - // of the old jsonpb implementation. These semantics are not supported by - // the protobuf JSON specification. - isEmpty := true - mr.Range(func(protoreflect.FieldDescriptor, protoreflect.Value) bool { - isEmpty = false // at least one iteration implies non-empty - return false - }) - if !isEmpty { - // Perform unmarshaling into a newly allocated, empty message. - mr = mr.New() - - // Use a defer to copy all unmarshaled fields into the original message. - dst := proto.MessageReflect(m) - defer mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - dst.Set(fd, v) - return true - }) - } - - // Unmarshal using the v2 JSON unmarshaler. - opts := protojson.UnmarshalOptions{ - DiscardUnknown: u.AllowUnknownFields, - } - if u.AnyResolver != nil { - opts.Resolver = anyResolver{u.AnyResolver} - } - return opts.Unmarshal(raw, mr.Interface()) - } else { - if err := u.unmarshalMessage(mr, raw); err != nil { - return err - } - return protoV2.CheckInitialized(mr.Interface()) - } -} - -func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error { - md := m.Descriptor() - fds := md.Fields() - - if jsu, ok := proto.MessageV1(m.Interface()).(JSONPBUnmarshaler); ok { - return jsu.UnmarshalJSONPB(u, in) - } - - if string(in) == "null" && md.FullName() != "google.protobuf.Value" { - return nil - } - - switch wellKnownType(md.FullName()) { - case "Any": - var jsonObject map[string]json.RawMessage - if err := json.Unmarshal(in, &jsonObject); err != nil { - return err - } - - rawTypeURL, ok := jsonObject["@type"] - if !ok { - return errors.New("Any JSON doesn't have '@type'") - } - typeURL, err := unquoteString(string(rawTypeURL)) - if err != nil { - return fmt.Errorf("can't unmarshal Any's '@type': %q", rawTypeURL) - } - m.Set(fds.ByNumber(1), protoreflect.ValueOfString(typeURL)) - - var m2 protoreflect.Message - if u.AnyResolver != nil { - mi, err := u.AnyResolver.Resolve(typeURL) - if err != nil { - return err - } - m2 = proto.MessageReflect(mi) - } else { - mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL) - if err != nil { - if err == protoregistry.NotFound { - return fmt.Errorf("could not resolve Any message type: %v", typeURL) - } - return err - } - m2 = mt.New() - } - - if wellKnownType(m2.Descriptor().FullName()) != "" { - rawValue, ok := jsonObject["value"] - if !ok { - return errors.New("Any JSON doesn't have 'value'") - } - if err := u.unmarshalMessage(m2, rawValue); err != nil { - return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err) - } - } else { - delete(jsonObject, "@type") - rawJSON, err := json.Marshal(jsonObject) - if err != nil { - return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) - } - if err = u.unmarshalMessage(m2, rawJSON); err != nil { - return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err) - } - } - - rawWire, err := protoV2.Marshal(m2.Interface()) - if err != nil { - return fmt.Errorf("can't marshal proto %v into Any.Value: %v", typeURL, err) - } - m.Set(fds.ByNumber(2), protoreflect.ValueOfBytes(rawWire)) - return nil - case "BoolValue", "BytesValue", "StringValue", - "Int32Value", "UInt32Value", "FloatValue", - "Int64Value", "UInt64Value", "DoubleValue": - fd := fds.ByNumber(1) - v, err := u.unmarshalValue(m.NewField(fd), in, fd) - if err != nil { - return err - } - m.Set(fd, v) - return nil - case "Duration": - v, err := unquoteString(string(in)) - if err != nil { - return err - } - d, err := time.ParseDuration(v) - if err != nil { - return fmt.Errorf("bad Duration: %v", err) - } - - sec := d.Nanoseconds() / 1e9 - nsec := d.Nanoseconds() % 1e9 - m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec))) - m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec))) - return nil - case "Timestamp": - v, err := unquoteString(string(in)) - if err != nil { - return err - } - t, err := time.Parse(time.RFC3339Nano, v) - if err != nil { - return fmt.Errorf("bad Timestamp: %v", err) - } - - sec := t.Unix() - nsec := t.Nanosecond() - m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec))) - m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec))) - return nil - case "Value": - switch { - case string(in) == "null": - m.Set(fds.ByNumber(1), protoreflect.ValueOfEnum(0)) - case string(in) == "true": - m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(true)) - case string(in) == "false": - m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(false)) - case hasPrefixAndSuffix('"', in, '"'): - s, err := unquoteString(string(in)) - if err != nil { - return fmt.Errorf("unrecognized type for Value %q", in) - } - m.Set(fds.ByNumber(3), protoreflect.ValueOfString(s)) - case hasPrefixAndSuffix('[', in, ']'): - v := m.Mutable(fds.ByNumber(6)) - return u.unmarshalMessage(v.Message(), in) - case hasPrefixAndSuffix('{', in, '}'): - v := m.Mutable(fds.ByNumber(5)) - return u.unmarshalMessage(v.Message(), in) - default: - f, err := strconv.ParseFloat(string(in), 0) - if err != nil { - return fmt.Errorf("unrecognized type for Value %q", in) - } - m.Set(fds.ByNumber(2), protoreflect.ValueOfFloat64(f)) - } - return nil - case "ListValue": - var jsonArray []json.RawMessage - if err := json.Unmarshal(in, &jsonArray); err != nil { - return fmt.Errorf("bad ListValue: %v", err) - } - - lv := m.Mutable(fds.ByNumber(1)).List() - for _, raw := range jsonArray { - ve := lv.NewElement() - if err := u.unmarshalMessage(ve.Message(), raw); err != nil { - return err - } - lv.Append(ve) - } - return nil - case "Struct": - var jsonObject map[string]json.RawMessage - if err := json.Unmarshal(in, &jsonObject); err != nil { - return fmt.Errorf("bad StructValue: %v", err) - } - - mv := m.Mutable(fds.ByNumber(1)).Map() - for key, raw := range jsonObject { - kv := protoreflect.ValueOf(key).MapKey() - vv := mv.NewValue() - if err := u.unmarshalMessage(vv.Message(), raw); err != nil { - return fmt.Errorf("bad value in StructValue for key %q: %v", key, err) - } - mv.Set(kv, vv) - } - return nil - } - - var jsonObject map[string]json.RawMessage - if err := json.Unmarshal(in, &jsonObject); err != nil { - return err - } - - // Handle known fields. - for i := 0; i < fds.Len(); i++ { - fd := fds.Get(i) - if fd.IsWeak() && fd.Message().IsPlaceholder() { - continue // weak reference is not linked in - } - - // Search for any raw JSON value associated with this field. - var raw json.RawMessage - name := string(fd.Name()) - if fd.Kind() == protoreflect.GroupKind { - name = string(fd.Message().Name()) - } - if v, ok := jsonObject[name]; ok { - delete(jsonObject, name) - raw = v - } - name = string(fd.JSONName()) - if v, ok := jsonObject[name]; ok { - delete(jsonObject, name) - raw = v - } - - field := m.NewField(fd) - // Unmarshal the field value. - if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) { - continue - } - v, err := u.unmarshalValue(field, raw, fd) - if err != nil { - return err - } - m.Set(fd, v) - } - - // Handle extension fields. - for name, raw := range jsonObject { - if !strings.HasPrefix(name, "[") || !strings.HasSuffix(name, "]") { - continue - } - - // Resolve the extension field by name. - xname := protoreflect.FullName(name[len("[") : len(name)-len("]")]) - xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname) - if xt == nil && isMessageSet(md) { - xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension")) - } - if xt == nil { - continue - } - delete(jsonObject, name) - fd := xt.TypeDescriptor() - if fd.ContainingMessage().FullName() != m.Descriptor().FullName() { - return fmt.Errorf("extension field %q does not extend message %q", xname, m.Descriptor().FullName()) - } - - field := m.NewField(fd) - // Unmarshal the field value. - if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) { - continue - } - v, err := u.unmarshalValue(field, raw, fd) - if err != nil { - return err - } - m.Set(fd, v) - } - - if !u.AllowUnknownFields && len(jsonObject) > 0 { - for name := range jsonObject { - return fmt.Errorf("unknown field %q in %v", name, md.FullName()) - } - } - return nil -} - -func isSingularWellKnownValue(fd protoreflect.FieldDescriptor) bool { - if fd.Cardinality() == protoreflect.Repeated { - return false - } - if md := fd.Message(); md != nil { - return md.FullName() == "google.protobuf.Value" - } - if ed := fd.Enum(); ed != nil { - return ed.FullName() == "google.protobuf.NullValue" - } - return false -} - -func isSingularJSONPBUnmarshaler(v protoreflect.Value, fd protoreflect.FieldDescriptor) bool { - if fd.Message() != nil && fd.Cardinality() != protoreflect.Repeated { - _, ok := proto.MessageV1(v.Interface()).(JSONPBUnmarshaler) - return ok - } - return false -} - -func (u *Unmarshaler) unmarshalValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - switch { - case fd.IsList(): - var jsonArray []json.RawMessage - if err := json.Unmarshal(in, &jsonArray); err != nil { - return v, err - } - lv := v.List() - for _, raw := range jsonArray { - ve, err := u.unmarshalSingularValue(lv.NewElement(), raw, fd) - if err != nil { - return v, err - } - lv.Append(ve) - } - return v, nil - case fd.IsMap(): - var jsonObject map[string]json.RawMessage - if err := json.Unmarshal(in, &jsonObject); err != nil { - return v, err - } - kfd := fd.MapKey() - vfd := fd.MapValue() - mv := v.Map() - for key, raw := range jsonObject { - var kv protoreflect.MapKey - if kfd.Kind() == protoreflect.StringKind { - kv = protoreflect.ValueOf(key).MapKey() - } else { - v, err := u.unmarshalSingularValue(kfd.Default(), []byte(key), kfd) - if err != nil { - return v, err - } - kv = v.MapKey() - } - - vv, err := u.unmarshalSingularValue(mv.NewValue(), raw, vfd) - if err != nil { - return v, err - } - mv.Set(kv, vv) - } - return v, nil - default: - return u.unmarshalSingularValue(v, in, fd) - } -} - -var nonFinite = map[string]float64{ - `"NaN"`: math.NaN(), - `"Infinity"`: math.Inf(+1), - `"-Infinity"`: math.Inf(-1), -} - -func (u *Unmarshaler) unmarshalSingularValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - switch fd.Kind() { - case protoreflect.BoolKind: - return unmarshalValue(in, new(bool)) - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - return unmarshalValue(trimQuote(in), new(int32)) - case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return unmarshalValue(trimQuote(in), new(int64)) - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - return unmarshalValue(trimQuote(in), new(uint32)) - case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return unmarshalValue(trimQuote(in), new(uint64)) - case protoreflect.FloatKind: - if f, ok := nonFinite[string(in)]; ok { - return protoreflect.ValueOfFloat32(float32(f)), nil - } - return unmarshalValue(trimQuote(in), new(float32)) - case protoreflect.DoubleKind: - if f, ok := nonFinite[string(in)]; ok { - return protoreflect.ValueOfFloat64(float64(f)), nil - } - return unmarshalValue(trimQuote(in), new(float64)) - case protoreflect.StringKind: - return unmarshalValue(in, new(string)) - case protoreflect.BytesKind: - return unmarshalValue(in, new([]byte)) - case protoreflect.EnumKind: - if hasPrefixAndSuffix('"', in, '"') { - vd := fd.Enum().Values().ByName(protoreflect.Name(trimQuote(in))) - if vd == nil { - return v, fmt.Errorf("unknown value %q for enum %s", in, fd.Enum().FullName()) - } - return protoreflect.ValueOfEnum(vd.Number()), nil - } - return unmarshalValue(in, new(protoreflect.EnumNumber)) - case protoreflect.MessageKind, protoreflect.GroupKind: - err := u.unmarshalMessage(v.Message(), in) - return v, err - default: - panic(fmt.Sprintf("invalid kind %v", fd.Kind())) - } -} - -func unmarshalValue(in []byte, v interface{}) (protoreflect.Value, error) { - err := json.Unmarshal(in, v) - return protoreflect.ValueOf(reflect.ValueOf(v).Elem().Interface()), err -} - -func unquoteString(in string) (out string, err error) { - err = json.Unmarshal([]byte(in), &out) - return out, err -} - -func hasPrefixAndSuffix(prefix byte, in []byte, suffix byte) bool { - if len(in) >= 2 && in[0] == prefix && in[len(in)-1] == suffix { - return true - } - return false -} - -// trimQuote is like unquoteString but simply strips surrounding quotes. -// This is incorrect, but is behavior done by the legacy implementation. -func trimQuote(in []byte) []byte { - if len(in) >= 2 && in[0] == '"' && in[len(in)-1] == '"' { - in = in[1 : len(in)-1] - } - return in -} diff --git a/vendor/github.com/golang/protobuf/jsonpb/encode.go b/vendor/github.com/golang/protobuf/jsonpb/encode.go deleted file mode 100644 index 685c80a..0000000 --- a/vendor/github.com/golang/protobuf/jsonpb/encode.go +++ /dev/null @@ -1,559 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jsonpb - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "math" - "reflect" - "sort" - "strconv" - "strings" - "time" - - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/encoding/protojson" - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapJSONMarshalV2 = false - -// Marshaler is a configurable object for marshaling protocol buffer messages -// to the specified JSON representation. -type Marshaler struct { - // OrigName specifies whether to use the original protobuf name for fields. - OrigName bool - - // EnumsAsInts specifies whether to render enum values as integers, - // as opposed to string values. - EnumsAsInts bool - - // EmitDefaults specifies whether to render fields with zero values. - EmitDefaults bool - - // Indent controls whether the output is compact or not. - // If empty, the output is compact JSON. Otherwise, every JSON object - // entry and JSON array value will be on its own line. - // Each line will be preceded by repeated copies of Indent, where the - // number of copies is the current indentation depth. - Indent string - - // AnyResolver is used to resolve the google.protobuf.Any well-known type. - // If unset, the global registry is used by default. - AnyResolver AnyResolver -} - -// JSONPBMarshaler is implemented by protobuf messages that customize the -// way they are marshaled to JSON. Messages that implement this should also -// implement JSONPBUnmarshaler so that the custom format can be parsed. -// -// The JSON marshaling must follow the proto to JSON specification: -// https://developers.google.com/protocol-buffers/docs/proto3#json -// -// Deprecated: Custom types should implement protobuf reflection instead. -type JSONPBMarshaler interface { - MarshalJSONPB(*Marshaler) ([]byte, error) -} - -// Marshal serializes a protobuf message as JSON into w. -func (jm *Marshaler) Marshal(w io.Writer, m proto.Message) error { - b, err := jm.marshal(m) - if len(b) > 0 { - if _, err := w.Write(b); err != nil { - return err - } - } - return err -} - -// MarshalToString serializes a protobuf message as JSON in string form. -func (jm *Marshaler) MarshalToString(m proto.Message) (string, error) { - b, err := jm.marshal(m) - if err != nil { - return "", err - } - return string(b), nil -} - -func (jm *Marshaler) marshal(m proto.Message) ([]byte, error) { - v := reflect.ValueOf(m) - if m == nil || (v.Kind() == reflect.Ptr && v.IsNil()) { - return nil, errors.New("Marshal called with nil") - } - - // Check for custom marshalers first since they may not properly - // implement protobuf reflection that the logic below relies on. - if jsm, ok := m.(JSONPBMarshaler); ok { - return jsm.MarshalJSONPB(jm) - } - - if wrapJSONMarshalV2 { - opts := protojson.MarshalOptions{ - UseProtoNames: jm.OrigName, - UseEnumNumbers: jm.EnumsAsInts, - EmitUnpopulated: jm.EmitDefaults, - Indent: jm.Indent, - } - if jm.AnyResolver != nil { - opts.Resolver = anyResolver{jm.AnyResolver} - } - return opts.Marshal(proto.MessageReflect(m).Interface()) - } else { - // Check for unpopulated required fields first. - m2 := proto.MessageReflect(m) - if err := protoV2.CheckInitialized(m2.Interface()); err != nil { - return nil, err - } - - w := jsonWriter{Marshaler: jm} - err := w.marshalMessage(m2, "", "") - return w.buf, err - } -} - -type jsonWriter struct { - *Marshaler - buf []byte -} - -func (w *jsonWriter) write(s string) { - w.buf = append(w.buf, s...) -} - -func (w *jsonWriter) marshalMessage(m protoreflect.Message, indent, typeURL string) error { - if jsm, ok := proto.MessageV1(m.Interface()).(JSONPBMarshaler); ok { - b, err := jsm.MarshalJSONPB(w.Marshaler) - if err != nil { - return err - } - if typeURL != "" { - // we are marshaling this object to an Any type - var js map[string]*json.RawMessage - if err = json.Unmarshal(b, &js); err != nil { - return fmt.Errorf("type %T produced invalid JSON: %v", m.Interface(), err) - } - turl, err := json.Marshal(typeURL) - if err != nil { - return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) - } - js["@type"] = (*json.RawMessage)(&turl) - if b, err = json.Marshal(js); err != nil { - return err - } - } - w.write(string(b)) - return nil - } - - md := m.Descriptor() - fds := md.Fields() - - // Handle well-known types. - const secondInNanos = int64(time.Second / time.Nanosecond) - switch wellKnownType(md.FullName()) { - case "Any": - return w.marshalAny(m, indent) - case "BoolValue", "BytesValue", "StringValue", - "Int32Value", "UInt32Value", "FloatValue", - "Int64Value", "UInt64Value", "DoubleValue": - fd := fds.ByNumber(1) - return w.marshalValue(fd, m.Get(fd), indent) - case "Duration": - const maxSecondsInDuration = 315576000000 - // "Generated output always contains 0, 3, 6, or 9 fractional digits, - // depending on required precision." - s := m.Get(fds.ByNumber(1)).Int() - ns := m.Get(fds.ByNumber(2)).Int() - if s < -maxSecondsInDuration || s > maxSecondsInDuration { - return fmt.Errorf("seconds out of range %v", s) - } - if ns <= -secondInNanos || ns >= secondInNanos { - return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos) - } - if (s > 0 && ns < 0) || (s < 0 && ns > 0) { - return errors.New("signs of seconds and nanos do not match") - } - var sign string - if s < 0 || ns < 0 { - sign, s, ns = "-", -1*s, -1*ns - } - x := fmt.Sprintf("%s%d.%09d", sign, s, ns) - x = strings.TrimSuffix(x, "000") - x = strings.TrimSuffix(x, "000") - x = strings.TrimSuffix(x, ".000") - w.write(fmt.Sprintf(`"%vs"`, x)) - return nil - case "Timestamp": - // "RFC 3339, where generated output will always be Z-normalized - // and uses 0, 3, 6 or 9 fractional digits." - s := m.Get(fds.ByNumber(1)).Int() - ns := m.Get(fds.ByNumber(2)).Int() - if ns < 0 || ns >= secondInNanos { - return fmt.Errorf("ns out of range [0, %v)", secondInNanos) - } - t := time.Unix(s, ns).UTC() - // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). - x := t.Format("2006-01-02T15:04:05.000000000") - x = strings.TrimSuffix(x, "000") - x = strings.TrimSuffix(x, "000") - x = strings.TrimSuffix(x, ".000") - w.write(fmt.Sprintf(`"%vZ"`, x)) - return nil - case "Value": - // JSON value; which is a null, number, string, bool, object, or array. - od := md.Oneofs().Get(0) - fd := m.WhichOneof(od) - if fd == nil { - return errors.New("nil Value") - } - return w.marshalValue(fd, m.Get(fd), indent) - case "Struct", "ListValue": - // JSON object or array. - fd := fds.ByNumber(1) - return w.marshalValue(fd, m.Get(fd), indent) - } - - w.write("{") - if w.Indent != "" { - w.write("\n") - } - - firstField := true - if typeURL != "" { - if err := w.marshalTypeURL(indent, typeURL); err != nil { - return err - } - firstField = false - } - - for i := 0; i < fds.Len(); { - fd := fds.Get(i) - if od := fd.ContainingOneof(); od != nil { - fd = m.WhichOneof(od) - i += od.Fields().Len() - if fd == nil { - continue - } - } else { - i++ - } - - v := m.Get(fd) - - if !m.Has(fd) { - if !w.EmitDefaults || fd.ContainingOneof() != nil { - continue - } - if fd.Cardinality() != protoreflect.Repeated && (fd.Message() != nil || fd.Syntax() == protoreflect.Proto2) { - v = protoreflect.Value{} // use "null" for singular messages or proto2 scalars - } - } - - if !firstField { - w.writeComma() - } - if err := w.marshalField(fd, v, indent); err != nil { - return err - } - firstField = false - } - - // Handle proto2 extensions. - if md.ExtensionRanges().Len() > 0 { - // Collect a sorted list of all extension descriptor and values. - type ext struct { - desc protoreflect.FieldDescriptor - val protoreflect.Value - } - var exts []ext - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - exts = append(exts, ext{fd, v}) - } - return true - }) - sort.Slice(exts, func(i, j int) bool { - return exts[i].desc.Number() < exts[j].desc.Number() - }) - - for _, ext := range exts { - if !firstField { - w.writeComma() - } - if err := w.marshalField(ext.desc, ext.val, indent); err != nil { - return err - } - firstField = false - } - } - - if w.Indent != "" { - w.write("\n") - w.write(indent) - } - w.write("}") - return nil -} - -func (w *jsonWriter) writeComma() { - if w.Indent != "" { - w.write(",\n") - } else { - w.write(",") - } -} - -func (w *jsonWriter) marshalAny(m protoreflect.Message, indent string) error { - // "If the Any contains a value that has a special JSON mapping, - // it will be converted as follows: {"@type": xxx, "value": yyy}. - // Otherwise, the value will be converted into a JSON object, - // and the "@type" field will be inserted to indicate the actual data type." - md := m.Descriptor() - typeURL := m.Get(md.Fields().ByNumber(1)).String() - rawVal := m.Get(md.Fields().ByNumber(2)).Bytes() - - var m2 protoreflect.Message - if w.AnyResolver != nil { - mi, err := w.AnyResolver.Resolve(typeURL) - if err != nil { - return err - } - m2 = proto.MessageReflect(mi) - } else { - mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL) - if err != nil { - return err - } - m2 = mt.New() - } - - if err := protoV2.Unmarshal(rawVal, m2.Interface()); err != nil { - return err - } - - if wellKnownType(m2.Descriptor().FullName()) == "" { - return w.marshalMessage(m2, indent, typeURL) - } - - w.write("{") - if w.Indent != "" { - w.write("\n") - } - if err := w.marshalTypeURL(indent, typeURL); err != nil { - return err - } - w.writeComma() - if w.Indent != "" { - w.write(indent) - w.write(w.Indent) - w.write(`"value": `) - } else { - w.write(`"value":`) - } - if err := w.marshalMessage(m2, indent+w.Indent, ""); err != nil { - return err - } - if w.Indent != "" { - w.write("\n") - w.write(indent) - } - w.write("}") - return nil -} - -func (w *jsonWriter) marshalTypeURL(indent, typeURL string) error { - if w.Indent != "" { - w.write(indent) - w.write(w.Indent) - } - w.write(`"@type":`) - if w.Indent != "" { - w.write(" ") - } - b, err := json.Marshal(typeURL) - if err != nil { - return err - } - w.write(string(b)) - return nil -} - -// marshalField writes field description and value to the Writer. -func (w *jsonWriter) marshalField(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { - if w.Indent != "" { - w.write(indent) - w.write(w.Indent) - } - w.write(`"`) - switch { - case fd.IsExtension(): - // For message set, use the fname of the message as the extension name. - name := string(fd.FullName()) - if isMessageSet(fd.ContainingMessage()) { - name = strings.TrimSuffix(name, ".message_set_extension") - } - - w.write("[" + name + "]") - case w.OrigName: - name := string(fd.Name()) - if fd.Kind() == protoreflect.GroupKind { - name = string(fd.Message().Name()) - } - w.write(name) - default: - w.write(string(fd.JSONName())) - } - w.write(`":`) - if w.Indent != "" { - w.write(" ") - } - return w.marshalValue(fd, v, indent) -} - -func (w *jsonWriter) marshalValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { - switch { - case fd.IsList(): - w.write("[") - comma := "" - lv := v.List() - for i := 0; i < lv.Len(); i++ { - w.write(comma) - if w.Indent != "" { - w.write("\n") - w.write(indent) - w.write(w.Indent) - w.write(w.Indent) - } - if err := w.marshalSingularValue(fd, lv.Get(i), indent+w.Indent); err != nil { - return err - } - comma = "," - } - if w.Indent != "" { - w.write("\n") - w.write(indent) - w.write(w.Indent) - } - w.write("]") - return nil - case fd.IsMap(): - kfd := fd.MapKey() - vfd := fd.MapValue() - mv := v.Map() - - // Collect a sorted list of all map keys and values. - type entry struct{ key, val protoreflect.Value } - var entries []entry - mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { - entries = append(entries, entry{k.Value(), v}) - return true - }) - sort.Slice(entries, func(i, j int) bool { - switch kfd.Kind() { - case protoreflect.BoolKind: - return !entries[i].key.Bool() && entries[j].key.Bool() - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return entries[i].key.Int() < entries[j].key.Int() - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return entries[i].key.Uint() < entries[j].key.Uint() - case protoreflect.StringKind: - return entries[i].key.String() < entries[j].key.String() - default: - panic("invalid kind") - } - }) - - w.write(`{`) - comma := "" - for _, entry := range entries { - w.write(comma) - if w.Indent != "" { - w.write("\n") - w.write(indent) - w.write(w.Indent) - w.write(w.Indent) - } - - s := fmt.Sprint(entry.key.Interface()) - b, err := json.Marshal(s) - if err != nil { - return err - } - w.write(string(b)) - - w.write(`:`) - if w.Indent != "" { - w.write(` `) - } - - if err := w.marshalSingularValue(vfd, entry.val, indent+w.Indent); err != nil { - return err - } - comma = "," - } - if w.Indent != "" { - w.write("\n") - w.write(indent) - w.write(w.Indent) - } - w.write(`}`) - return nil - default: - return w.marshalSingularValue(fd, v, indent) - } -} - -func (w *jsonWriter) marshalSingularValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { - switch { - case !v.IsValid(): - w.write("null") - return nil - case fd.Message() != nil: - return w.marshalMessage(v.Message(), indent+w.Indent, "") - case fd.Enum() != nil: - if fd.Enum().FullName() == "google.protobuf.NullValue" { - w.write("null") - return nil - } - - vd := fd.Enum().Values().ByNumber(v.Enum()) - if vd == nil || w.EnumsAsInts { - w.write(strconv.Itoa(int(v.Enum()))) - } else { - w.write(`"` + string(vd.Name()) + `"`) - } - return nil - default: - switch v.Interface().(type) { - case float32, float64: - switch { - case math.IsInf(v.Float(), +1): - w.write(`"Infinity"`) - return nil - case math.IsInf(v.Float(), -1): - w.write(`"-Infinity"`) - return nil - case math.IsNaN(v.Float()): - w.write(`"NaN"`) - return nil - } - case int64, uint64: - w.write(fmt.Sprintf(`"%d"`, v.Interface())) - return nil - } - - b, err := json.Marshal(v.Interface()) - if err != nil { - return err - } - w.write(string(b)) - return nil - } -} diff --git a/vendor/github.com/golang/protobuf/jsonpb/json.go b/vendor/github.com/golang/protobuf/jsonpb/json.go deleted file mode 100644 index 480e244..0000000 --- a/vendor/github.com/golang/protobuf/jsonpb/json.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jsonpb provides functionality to marshal and unmarshal between a -// protocol buffer message and JSON. It follows the specification at -// https://developers.google.com/protocol-buffers/docs/proto3#json. -// -// Do not rely on the default behavior of the standard encoding/json package -// when called on generated message types as it does not operate correctly. -// -// Deprecated: Use the "google.golang.org/protobuf/encoding/protojson" -// package instead. -package jsonpb - -import ( - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// AnyResolver takes a type URL, present in an Any message, -// and resolves it into an instance of the associated message. -type AnyResolver interface { - Resolve(typeURL string) (proto.Message, error) -} - -type anyResolver struct{ AnyResolver } - -func (r anyResolver) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) { - return r.FindMessageByURL(string(message)) -} - -func (r anyResolver) FindMessageByURL(url string) (protoreflect.MessageType, error) { - m, err := r.Resolve(url) - if err != nil { - return nil, err - } - return protoimpl.X.MessageTypeOf(m), nil -} - -func (r anyResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { - return protoregistry.GlobalTypes.FindExtensionByName(field) -} - -func (r anyResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { - return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) -} - -func wellKnownType(s protoreflect.FullName) string { - if s.Parent() == "google.protobuf" { - switch s.Name() { - case "Empty", "Any", - "BoolValue", "BytesValue", "StringValue", - "Int32Value", "UInt32Value", "FloatValue", - "Int64Value", "UInt64Value", "DoubleValue", - "Duration", "Timestamp", - "NullValue", "Struct", "Value", "ListValue": - return string(s.Name()) - } - } - return "" -} - -func isMessageSet(md protoreflect.MessageDescriptor) bool { - ms, ok := md.(interface{ IsMessageSet() bool }) - return ok && ms.IsMessageSet() -} diff --git a/vendor/github.com/golang/protobuf/proto/buffer.go b/vendor/github.com/golang/protobuf/proto/buffer.go deleted file mode 100644 index e810e6f..0000000 --- a/vendor/github.com/golang/protobuf/proto/buffer.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "errors" - "fmt" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - WireVarint = 0 - WireFixed32 = 5 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 -) - -// EncodeVarint returns the varint encoded bytes of v. -func EncodeVarint(v uint64) []byte { - return protowire.AppendVarint(nil, v) -} - -// SizeVarint returns the length of the varint encoded bytes of v. -// This is equal to len(EncodeVarint(v)). -func SizeVarint(v uint64) int { - return protowire.SizeVarint(v) -} - -// DecodeVarint parses a varint encoded integer from b, -// returning the integer value and the length of the varint. -// It returns (0, 0) if there is a parse error. -func DecodeVarint(b []byte) (uint64, int) { - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return 0, 0 - } - return v, n -} - -// Buffer is a buffer for encoding and decoding the protobuf wire format. -// It may be reused between invocations to reduce memory usage. -type Buffer struct { - buf []byte - idx int - deterministic bool -} - -// NewBuffer allocates a new Buffer initialized with buf, -// where the contents of buf are considered the unread portion of the buffer. -func NewBuffer(buf []byte) *Buffer { - return &Buffer{buf: buf} -} - -// SetDeterministic specifies whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and -// subject to change. -func (b *Buffer) SetDeterministic(deterministic bool) { - b.deterministic = deterministic -} - -// SetBuf sets buf as the internal buffer, -// where the contents of buf are considered the unread portion of the buffer. -func (b *Buffer) SetBuf(buf []byte) { - b.buf = buf - b.idx = 0 -} - -// Reset clears the internal buffer of all written and unread data. -func (b *Buffer) Reset() { - b.buf = b.buf[:0] - b.idx = 0 -} - -// Bytes returns the internal buffer. -func (b *Buffer) Bytes() []byte { - return b.buf -} - -// Unread returns the unread portion of the buffer. -func (b *Buffer) Unread() []byte { - return b.buf[b.idx:] -} - -// Marshal appends the wire-format encoding of m to the buffer. -func (b *Buffer) Marshal(m Message) error { - var err error - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// Unmarshal parses the wire-format message in the buffer and -// places the decoded results in m. -// It does not reset m before unmarshaling. -func (b *Buffer) Unmarshal(m Message) error { - err := UnmarshalMerge(b.Unread(), m) - b.idx = len(b.buf) - return err -} - -type unknownFields struct{ XXX_unrecognized protoimpl.UnknownFields } - -func (m *unknownFields) String() string { panic("not implemented") } -func (m *unknownFields) Reset() { panic("not implemented") } -func (m *unknownFields) ProtoMessage() { panic("not implemented") } - -// DebugPrint dumps the encoded bytes of b with a header and footer including s -// to stdout. This is only intended for debugging. -func (*Buffer) DebugPrint(s string, b []byte) { - m := MessageReflect(new(unknownFields)) - m.SetUnknown(b) - b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface()) - fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s) -} - -// EncodeVarint appends an unsigned varint encoding to the buffer. -func (b *Buffer) EncodeVarint(v uint64) error { - b.buf = protowire.AppendVarint(b.buf, v) - return nil -} - -// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag32(v uint64) error { - return b.EncodeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) -} - -// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag64(v uint64) error { - return b.EncodeVarint(uint64((uint64(v) << 1) ^ uint64((int64(v) >> 63)))) -} - -// EncodeFixed32 appends a 32-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed32(v uint64) error { - b.buf = protowire.AppendFixed32(b.buf, uint32(v)) - return nil -} - -// EncodeFixed64 appends a 64-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed64(v uint64) error { - b.buf = protowire.AppendFixed64(b.buf, uint64(v)) - return nil -} - -// EncodeRawBytes appends a length-prefixed raw bytes to the buffer. -func (b *Buffer) EncodeRawBytes(v []byte) error { - b.buf = protowire.AppendBytes(b.buf, v) - return nil -} - -// EncodeStringBytes appends a length-prefixed raw bytes to the buffer. -// It does not validate whether v contains valid UTF-8. -func (b *Buffer) EncodeStringBytes(v string) error { - b.buf = protowire.AppendString(b.buf, v) - return nil -} - -// EncodeMessage appends a length-prefixed encoded message to the buffer. -func (b *Buffer) EncodeMessage(m Message) error { - var err error - b.buf = protowire.AppendVarint(b.buf, uint64(Size(m))) - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// DecodeVarint consumes an encoded unsigned varint from the buffer. -func (b *Buffer) DecodeVarint() (uint64, error) { - v, n := protowire.ConsumeVarint(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag32() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)), nil -} - -// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag64() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint64(v) >> 1) ^ uint64((int64(v&1)<<63)>>63)), nil -} - -// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed32() (uint64, error) { - v, n := protowire.ConsumeFixed32(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed64() (uint64, error) { - v, n := protowire.ConsumeFixed64(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer. -// If alloc is specified, it returns a copy the raw bytes -// rather than a sub-slice of the buffer. -func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) { - v, n := protowire.ConsumeBytes(b.buf[b.idx:]) - if n < 0 { - return nil, protowire.ParseError(n) - } - b.idx += n - if alloc { - v = append([]byte(nil), v...) - } - return v, nil -} - -// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer. -// It does not validate whether the raw bytes contain valid UTF-8. -func (b *Buffer) DecodeStringBytes() (string, error) { - v, n := protowire.ConsumeString(b.buf[b.idx:]) - if n < 0 { - return "", protowire.ParseError(n) - } - b.idx += n - return v, nil -} - -// DecodeMessage consumes a length-prefixed message from the buffer. -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeMessage(m Message) error { - v, err := b.DecodeRawBytes(false) - if err != nil { - return err - } - return UnmarshalMerge(v, m) -} - -// DecodeGroup consumes a message group from the buffer. -// It assumes that the start group marker has already been consumed and -// consumes all bytes until (and including the end group marker). -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeGroup(m Message) error { - v, n, err := consumeGroup(b.buf[b.idx:]) - if err != nil { - return err - } - b.idx += n - return UnmarshalMerge(v, m) -} - -// consumeGroup parses b until it finds an end group marker, returning -// the raw bytes of the message (excluding the end group marker) and the -// the total length of the message (including the end group marker). -func consumeGroup(b []byte) ([]byte, int, error) { - b0 := b - depth := 1 // assume this follows a start group marker - for { - _, wtyp, tagLen := protowire.ConsumeTag(b) - if tagLen < 0 { - return nil, 0, protowire.ParseError(tagLen) - } - b = b[tagLen:] - - var valLen int - switch wtyp { - case protowire.VarintType: - _, valLen = protowire.ConsumeVarint(b) - case protowire.Fixed32Type: - _, valLen = protowire.ConsumeFixed32(b) - case protowire.Fixed64Type: - _, valLen = protowire.ConsumeFixed64(b) - case protowire.BytesType: - _, valLen = protowire.ConsumeBytes(b) - case protowire.StartGroupType: - depth++ - case protowire.EndGroupType: - depth-- - default: - return nil, 0, errors.New("proto: cannot parse reserved wire type") - } - if valLen < 0 { - return nil, 0, protowire.ParseError(valLen) - } - b = b[valLen:] - - if depth == 0 { - return b0[:len(b0)-len(b)-tagLen], len(b0) - len(b), nil - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/defaults.go b/vendor/github.com/golang/protobuf/proto/defaults.go deleted file mode 100644 index d399bf0..0000000 --- a/vendor/github.com/golang/protobuf/proto/defaults.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// SetDefaults sets unpopulated scalar fields to their default values. -// Fields within a oneof are not set even if they have a default value. -// SetDefaults is recursively called upon any populated message fields. -func SetDefaults(m Message) { - if m != nil { - setDefaults(MessageReflect(m)) - } -} - -func setDefaults(m protoreflect.Message) { - fds := m.Descriptor().Fields() - for i := 0; i < fds.Len(); i++ { - fd := fds.Get(i) - if !m.Has(fd) { - if fd.HasDefault() && fd.ContainingOneof() == nil { - v := fd.Default() - if fd.Kind() == protoreflect.BytesKind { - v = protoreflect.ValueOf(append([]byte(nil), v.Bytes()...)) // copy the default bytes - } - m.Set(fd, v) - } - continue - } - } - - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - setDefaults(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - setDefaults(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - setDefaults(v.Message()) - return true - }) - } - } - return true - }) -} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go deleted file mode 100644 index e8db57e..0000000 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "encoding/json" - "errors" - "fmt" - "strconv" - - protoV2 "google.golang.org/protobuf/proto" -) - -var ( - // Deprecated: No longer returned. - ErrNil = errors.New("proto: Marshal called with nil") - - // Deprecated: No longer returned. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") - - // Deprecated: No longer returned. - ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") -) - -// Deprecated: Do not use. -type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } - -// Deprecated: Do not use. -func GetStats() Stats { return Stats{} } - -// Deprecated: Do not use. -func MarshalMessageSet(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func UnmarshalMessageSet([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func MarshalMessageSetJSON(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func UnmarshalMessageSetJSON([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func RegisterMessageSetType(Message, int32, string) {} - -// Deprecated: Do not use. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// Deprecated: Do not use. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// Deprecated: Do not use; this type existed for intenal-use only. -type InternalMessageInfo struct{} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) DiscardUnknown(m Message) { - DiscardUnknown(m) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) { - return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Size(m Message) int { - return protoV2.Size(MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error { - return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m)) -} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index 2187e87..0000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -func DiscardUnknown(m Message) { - if m != nil { - discardUnknown(MessageReflect(m)) - } -} - -func discardUnknown(m protoreflect.Message) { - m.Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - discardUnknown(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - discardUnknown(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - discardUnknown(v.Message()) - return true - }) - } - } - return true - }) - - // Discard unknown fields. - if len(m.GetUnknown()) > 0 { - m.SetUnknown(nil) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index 42fc120..0000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "errors" - "fmt" - "reflect" - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -type ( - // ExtensionDesc represents an extension descriptor and - // is used to interact with an extension field in a message. - // - // Variables of this type are generated in code by protoc-gen-go. - ExtensionDesc = protoimpl.ExtensionInfo - - // ExtensionRange represents a range of message extensions. - // Used in code generated by protoc-gen-go. - ExtensionRange = protoiface.ExtensionRangeV1 - - // Deprecated: Do not use; this is an internal type. - Extension = protoimpl.ExtensionFieldV1 - - // Deprecated: Do not use; this is an internal type. - XXX_InternalExtensions = protoimpl.ExtensionFields -) - -// ErrMissingExtension reports whether the extension was not present. -var ErrMissingExtension = errors.New("proto: missing extension") - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -// HasExtension reports whether the extension field is present in m -// either as an explicitly populated field or as an unknown field. -func HasExtension(m Message, xt *ExtensionDesc) (has bool) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return false - } - - // Check whether any populated known field matches the field number. - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - has = mr.Has(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - has = int32(fd.Number()) == xt.Field - return !has - }) - } - - // Check whether any unknown field matches the field number. - for b := mr.GetUnknown(); !has && len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - has = int32(num) == xt.Field - b = b[n:] - } - return has -} - -// ClearExtension removes the extension field from m -// either as an explicitly populated field or as an unknown field. -func ClearExtension(m Message, xt *ExtensionDesc) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - mr.Clear(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if int32(fd.Number()) == xt.Field { - mr.Clear(fd) - return false - } - return true - }) - } - clearUnknown(mr, fieldNum(xt.Field)) -} - -// ClearAllExtensions clears all extensions from m. -// This includes populated fields and unknown fields in the extension range. -func ClearAllExtensions(m Message) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if fd.IsExtension() { - mr.Clear(fd) - } - return true - }) - clearUnknown(mr, mr.Descriptor().ExtensionRanges()) -} - -// GetExtension retrieves a proto2 extended field from m. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is type incomplete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes for the extension field. -func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Retrieve the unknown fields for this extension field. - var bo protoreflect.RawFields - for bi := mr.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if int32(num) == xt.Field { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - - // For type incomplete descriptors, only retrieve the unknown fields. - if xt.ExtensionType == nil { - return []byte(bo), nil - } - - // If the extension field only exists as unknown fields, unmarshal it. - // This is rarely done since proto.Unmarshal eagerly unmarshals extensions. - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - if !mr.Has(xtd) && len(bo) > 0 { - m2 := mr.New() - if err := (proto.UnmarshalOptions{ - Resolver: extensionResolver{xt}, - }.Unmarshal(bo, m2.Interface())); err != nil { - return nil, err - } - if m2.Has(xtd) { - mr.Set(xtd, m2.Get(xtd)) - clearUnknown(mr, fieldNum(xt.Field)) - } - } - - // Check whether the message has the extension field set or a default. - var pv protoreflect.Value - switch { - case mr.Has(xtd): - pv = mr.Get(xtd) - case xtd.HasDefault(): - pv = xtd.Default() - default: - return nil, ErrMissingExtension - } - - v := xt.InterfaceOf(pv) - rv := reflect.ValueOf(v) - if isScalarKind(rv.Kind()) { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - } - return v, nil -} - -// extensionResolver is a custom extension resolver that stores a single -// extension type that takes precedence over the global registry. -type extensionResolver struct{ xt protoreflect.ExtensionType } - -func (r extensionResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.FullName() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByName(field) -} - -func (r extensionResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.ContainingMessage().FullName() == message && xtd.Number() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) -} - -// GetExtensions returns a list of the extensions values present in m, -// corresponding with the provided list of extension descriptors, xts. -// If an extension is missing in m, the corresponding value is nil. -func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return nil, errNotExtendable - } - - vs := make([]interface{}, len(xts)) - for i, xt := range xts { - v, err := GetExtension(m, xt) - if err != nil { - if err == ErrMissingExtension { - continue - } - return vs, err - } - vs[i] = v - } - return vs, nil -} - -// SetExtension sets an extension field in m to the provided value. -func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return errNotExtendable - } - - rv := reflect.ValueOf(v) - if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) { - return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType) - } - if rv.Kind() == reflect.Ptr { - if rv.IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", v) - } - if isScalarKind(rv.Elem().Kind()) { - v = rv.Elem().Interface() - } - } - - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - mr.Set(xtd, xt.ValueOf(v)) - clearUnknown(mr, fieldNum(xt.Field)) - return nil -} - -// SetRawExtension inserts b into the unknown fields of m. -// -// Deprecated: Use Message.ProtoReflect.SetUnknown instead. -func SetRawExtension(m Message, fnum int32, b []byte) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - // Verify that the raw field is valid. - for b0 := b; len(b0) > 0; { - num, _, n := protowire.ConsumeField(b0) - if int32(num) != fnum { - panic(fmt.Sprintf("mismatching field number: got %d, want %d", num, fnum)) - } - b0 = b0[n:] - } - - ClearExtension(m, &ExtensionDesc{Field: fnum}) - mr.SetUnknown(append(mr.GetUnknown(), b...)) -} - -// ExtensionDescs returns a list of extension descriptors found in m, -// containing descriptors for both populated extension fields in m and -// also unknown fields of m that are in the extension range. -// For the later case, an type incomplete descriptor is provided where only -// the ExtensionDesc.Field field is populated. -// The order of the extension descriptors is undefined. -func ExtensionDescs(m Message) ([]*ExtensionDesc, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Collect a set of known extension descriptors. - extDescs := make(map[protoreflect.FieldNumber]*ExtensionDesc) - mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - xt := fd.(protoreflect.ExtensionTypeDescriptor) - if xd, ok := xt.Type().(*ExtensionDesc); ok { - extDescs[fd.Number()] = xd - } - } - return true - }) - - // Collect a set of unknown extension descriptors. - extRanges := mr.Descriptor().ExtensionRanges() - for b := mr.GetUnknown(); len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - if extRanges.Has(num) && extDescs[num] == nil { - extDescs[num] = nil - } - b = b[n:] - } - - // Transpose the set of descriptors into a list. - var xts []*ExtensionDesc - for num, xt := range extDescs { - if xt == nil { - xt = &ExtensionDesc{Field: int32(num)} - } - xts = append(xts, xt) - } - return xts, nil -} - -// isValidExtension reports whether xtd is a valid extension descriptor for md. -func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflect.ExtensionTypeDescriptor) bool { - return xtd.ContainingMessage() == md && md.ExtensionRanges().Has(xtd.Number()) -} - -// isScalarKind reports whether k is a protobuf scalar kind (except bytes). -// This function exists for historical reasons since the representation of -// scalars differs between v1 and v2, where v1 uses *T and v2 uses T. -func isScalarKind(k reflect.Kind) bool { - switch k { - case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: - return true - default: - return false - } -} - -// clearUnknown removes unknown fields from m where remover.Has reports true. -func clearUnknown(m protoreflect.Message, remover interface { - Has(protoreflect.FieldNumber) bool -}) { - var bo protoreflect.RawFields - for bi := m.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if !remover.Has(num) { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - if bi := m.GetUnknown(); len(bi) != len(bo) { - m.SetUnknown(bo) - } -} - -type fieldNum protoreflect.FieldNumber - -func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool { - return protoreflect.FieldNumber(n1) == n2 -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index dcdc220..0000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// StructProperties represents protocol buffer type information for a -// generated protobuf message in the open-struct API. -// -// Deprecated: Do not use. -type StructProperties struct { - // Prop are the properties for each field. - // - // Fields belonging to a oneof are stored in OneofTypes instead, with a - // single Properties representing the parent oneof held here. - // - // The order of Prop matches the order of fields in the Go struct. - // Struct fields that are not related to protobufs have a "XXX_" prefix - // in the Properties.Name and must be ignored by the user. - Prop []*Properties - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the protobuf field name. - OneofTypes map[string]*OneofProperties -} - -// Properties represents the type information for a protobuf message field. -// -// Deprecated: Do not use. -type Properties struct { - // Name is a placeholder name with little meaningful semantic value. - // If the name has an "XXX_" prefix, the entire Properties must be ignored. - Name string - // OrigName is the protobuf field name or oneof name. - OrigName string - // JSONName is the JSON name for the protobuf field. - JSONName string - // Enum is a placeholder name for enums. - // For historical reasons, this is neither the Go name for the enum, - // nor the protobuf name for the enum. - Enum string // Deprecated: Do not use. - // Weak contains the full name of the weakly referenced message. - Weak string - // Wire is a string representation of the wire type. - Wire string - // WireType is the protobuf wire type for the field. - WireType int - // Tag is the protobuf field number. - Tag int - // Required reports whether this is a required field. - Required bool - // Optional reports whether this is a optional field. - Optional bool - // Repeated reports whether this is a repeated field. - Repeated bool - // Packed reports whether this is a packed repeated field of scalars. - Packed bool - // Proto3 reports whether this field operates under the proto3 syntax. - Proto3 bool - // Oneof reports whether this field belongs within a oneof. - Oneof bool - - // Default is the default value in string form. - Default string - // HasDefault reports whether the field has a default value. - HasDefault bool - - // MapKeyProp is the properties for the key field for a map field. - MapKeyProp *Properties - // MapValProp is the properties for the value field for a map field. - MapValProp *Properties -} - -// OneofProperties represents the type information for a protobuf oneof. -// -// Deprecated: Do not use. -type OneofProperties struct { - // Type is a pointer to the generated wrapper type for the field value. - // This is nil for messages that are not in the open-struct API. - Type reflect.Type - // Field is the index into StructProperties.Prop for the containing oneof. - Field int - // Prop is the properties for the field. - Prop *Properties -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s += "," + strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != "" { - s += ",json=" + p.JSONName - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if len(p.Weak) > 0 { - s += ",weak=" + p.Weak - } - if p.Proto3 { - s += ",proto3" - } - if p.Oneof { - s += ",oneof" - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(tag string) { - // For example: "bytes,49,opt,name=foo,def=hello!" - for len(tag) > 0 { - i := strings.IndexByte(tag, ',') - if i < 0 { - i = len(tag) - } - switch s := tag[:i]; { - case strings.HasPrefix(s, "name="): - p.OrigName = s[len("name="):] - case strings.HasPrefix(s, "json="): - p.JSONName = s[len("json="):] - case strings.HasPrefix(s, "enum="): - p.Enum = s[len("enum="):] - case strings.HasPrefix(s, "weak="): - p.Weak = s[len("weak="):] - case strings.Trim(s, "0123456789") == "": - n, _ := strconv.ParseUint(s, 10, 32) - p.Tag = int(n) - case s == "opt": - p.Optional = true - case s == "req": - p.Required = true - case s == "rep": - p.Repeated = true - case s == "varint" || s == "zigzag32" || s == "zigzag64": - p.Wire = s - p.WireType = WireVarint - case s == "fixed32": - p.Wire = s - p.WireType = WireFixed32 - case s == "fixed64": - p.Wire = s - p.WireType = WireFixed64 - case s == "bytes": - p.Wire = s - p.WireType = WireBytes - case s == "group": - p.Wire = s - p.WireType = WireStartGroup - case s == "packed": - p.Packed = true - case s == "proto3": - p.Proto3 = true - case s == "oneof": - p.Oneof = true - case strings.HasPrefix(s, "def="): - // The default tag is special in that everything afterwards is the - // default regardless of the presence of commas. - p.HasDefault = true - p.Default, i = tag[len("def="):], len(tag) - } - tag = strings.TrimPrefix(tag[i:], ",") - } -} - -// Init populates the properties from a protocol buffer struct tag. -// -// Deprecated: Do not use. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - - if typ != nil && typ.Kind() == reflect.Map { - p.MapKeyProp = new(Properties) - p.MapKeyProp.Init(nil, "Key", f.Tag.Get("protobuf_key"), nil) - p.MapValProp = new(Properties) - p.MapValProp.Init(nil, "Value", f.Tag.Get("protobuf_val"), nil) - } -} - -var propertiesCache sync.Map // map[reflect.Type]*StructProperties - -// GetProperties returns the list of properties for the type represented by t, -// which must be a generated protocol buffer message in the open-struct API, -// where protobuf message fields are represented by exported Go struct fields. -// -// Deprecated: Use protobuf reflection instead. -func GetProperties(t reflect.Type) *StructProperties { - if p, ok := propertiesCache.Load(t); ok { - return p.(*StructProperties) - } - p, _ := propertiesCache.LoadOrStore(t, newProperties(t)) - return p.(*StructProperties) -} - -func newProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - - var hasOneof bool - prop := new(StructProperties) - - // Construct a list of properties for each field in the struct. - for i := 0; i < t.NumField(); i++ { - p := new(Properties) - f := t.Field(i) - tagField := f.Tag.Get("protobuf") - p.Init(f.Type, f.Name, tagField, &f) - - tagOneof := f.Tag.Get("protobuf_oneof") - if tagOneof != "" { - hasOneof = true - p.OrigName = tagOneof - } - - // Rename unrelated struct fields with the "XXX_" prefix since so much - // user code simply checks for this to exclude special fields. - if tagField == "" && tagOneof == "" && !strings.HasPrefix(p.Name, "XXX_") { - p.Name = "XXX_" + p.Name - p.OrigName = "XXX_" + p.OrigName - } else if p.Weak != "" { - p.Name = p.OrigName // avoid possible "XXX_" prefix on weak field - } - - prop.Prop = append(prop.Prop, p) - } - - // Construct a mapping of oneof field names to properties. - if hasOneof { - var oneofWrappers []interface{} - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3].Interface().([]interface{}) - } - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0].Interface().([]interface{}) - } - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(protoreflect.ProtoMessage); ok { - if m, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *protoimpl.MessageInfo }); ok { - oneofWrappers = m.ProtoMessageInfo().OneofWrappers - } - } - - prop.OneofTypes = make(map[string]*OneofProperties) - for _, wrapper := range oneofWrappers { - p := &OneofProperties{ - Type: reflect.ValueOf(wrapper).Type(), // *T - Prop: new(Properties), - } - f := p.Type.Elem().Field(0) - p.Prop.Name = f.Name - p.Prop.Parse(f.Tag.Get("protobuf")) - - // Determine the struct field that contains this oneof. - // Each wrapper is assignable to exactly one parent field. - var foundOneof bool - for i := 0; i < t.NumField() && !foundOneof; i++ { - if p.Type.AssignableTo(t.Field(i).Type) { - p.Field = i - foundOneof = true - } - } - if !foundOneof { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - prop.OneofTypes[p.Prop.OrigName] = p - } - } - - return prop -} - -func (sp *StructProperties) Len() int { return len(sp.Prop) } -func (sp *StructProperties) Less(i, j int) bool { return false } -func (sp *StructProperties) Swap(i, j int) { return } diff --git a/vendor/github.com/golang/protobuf/proto/proto.go b/vendor/github.com/golang/protobuf/proto/proto.go deleted file mode 100644 index 5aee89c..0000000 --- a/vendor/github.com/golang/protobuf/proto/proto.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package proto provides functionality for handling protocol buffer messages. -// In particular, it provides marshaling and unmarshaling between a protobuf -// message and the binary wire format. -// -// See https://developers.google.com/protocol-buffers/docs/gotutorial for -// more information. -// -// Deprecated: Use the "google.golang.org/protobuf/proto" package instead. -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - ProtoPackageIsVersion1 = true - ProtoPackageIsVersion2 = true - ProtoPackageIsVersion3 = true - ProtoPackageIsVersion4 = true -) - -// GeneratedEnum is any enum type generated by protoc-gen-go -// which is a named int32 kind. -// This type exists for documentation purposes. -type GeneratedEnum interface{} - -// GeneratedMessage is any message type generated by protoc-gen-go -// which is a pointer to a named struct kind. -// This type exists for documentation purposes. -type GeneratedMessage interface{} - -// Message is a protocol buffer message. -// -// This is the v1 version of the message interface and is marginally better -// than an empty interface as it lacks any method to programatically interact -// with the contents of the message. -// -// A v2 message is declared in "google.golang.org/protobuf/proto".Message and -// exposes protobuf reflection as a first-class feature of the interface. -// -// To convert a v1 message to a v2 message, use the MessageV2 function. -// To convert a v2 message to a v1 message, use the MessageV1 function. -type Message = protoiface.MessageV1 - -// MessageV1 converts either a v1 or v2 message to a v1 message. -// It returns nil if m is nil. -func MessageV1(m GeneratedMessage) protoiface.MessageV1 { - return protoimpl.X.ProtoMessageV1Of(m) -} - -// MessageV2 converts either a v1 or v2 message to a v2 message. -// It returns nil if m is nil. -func MessageV2(m GeneratedMessage) protoV2.Message { - return protoimpl.X.ProtoMessageV2Of(m) -} - -// MessageReflect returns a reflective view for a message. -// It returns nil if m is nil. -func MessageReflect(m Message) protoreflect.Message { - return protoimpl.X.MessageOf(m) -} - -// Marshaler is implemented by messages that can marshal themselves. -// This interface is used by the following functions: Size, Marshal, -// Buffer.Marshal, and Buffer.EncodeMessage. -// -// Deprecated: Do not implement. -type Marshaler interface { - // Marshal formats the encoded bytes of the message. - // It should be deterministic and emit valid protobuf wire data. - // The caller takes ownership of the returned buffer. - Marshal() ([]byte, error) -} - -// Unmarshaler is implemented by messages that can unmarshal themselves. -// This interface is used by the following functions: Unmarshal, UnmarshalMerge, -// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup. -// -// Deprecated: Do not implement. -type Unmarshaler interface { - // Unmarshal parses the encoded bytes of the protobuf wire input. - // The provided buffer is only valid for during method call. - // It should not reset the receiver message. - Unmarshal([]byte) error -} - -// Merger is implemented by messages that can merge themselves. -// This interface is used by the following functions: Clone and Merge. -// -// Deprecated: Do not implement. -type Merger interface { - // Merge merges the contents of src into the receiver message. - // It clones all data structures in src such that it aliases no mutable - // memory referenced by src. - Merge(src Message) -} - -// RequiredNotSetError is an error type returned when -// marshaling or unmarshaling a message with missing required fields. -type RequiredNotSetError struct { - err error -} - -func (e *RequiredNotSetError) Error() string { - if e.err != nil { - return e.err.Error() - } - return "proto: required field not set" -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -func checkRequiredNotSet(m protoV2.Message) error { - if err := protoV2.CheckInitialized(m); err != nil { - return &RequiredNotSetError{err: err} - } - return nil -} - -// Clone returns a deep copy of src. -func Clone(src Message) Message { - return MessageV1(protoV2.Clone(MessageV2(src))) -} - -// Merge merges src into dst, which must be messages of the same type. -// -// Populated scalar fields in src are copied to dst, while populated -// singular messages in src are merged into dst by recursively calling Merge. -// The elements of every list field in src is appended to the corresponded -// list fields in dst. The entries of every map field in src is copied into -// the corresponding map field in dst, possibly replacing existing entries. -// The unknown fields of src are appended to the unknown fields of dst. -func Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Equal reports whether two messages are equal. -// If two messages marshal to the same bytes under deterministic serialization, -// then Equal is guaranteed to report true. -// -// Two messages are equal if they are the same protobuf message type, -// have the same set of populated known and extension field values, -// and the same set of unknown fields values. -// -// Scalar values are compared with the equivalent of the == operator in Go, -// except bytes values which are compared using bytes.Equal and -// floating point values which specially treat NaNs as equal. -// Message values are compared by recursively calling Equal. -// Lists are equal if each element value is also equal. -// Maps are equal if they have the same set of keys, where the pair of values -// for each key is also equal. -func Equal(x, y Message) bool { - return protoV2.Equal(MessageV2(x), MessageV2(y)) -} - -func isMessageSet(md protoreflect.MessageDescriptor) bool { - ms, ok := md.(interface{ IsMessageSet() bool }) - return ok && ms.IsMessageSet() -} diff --git a/vendor/github.com/golang/protobuf/proto/registry.go b/vendor/github.com/golang/protobuf/proto/registry.go deleted file mode 100644 index 066b432..0000000 --- a/vendor/github.com/golang/protobuf/proto/registry.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - "reflect" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protodesc" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// filePath is the path to the proto source file. -type filePath = string // e.g., "google/protobuf/descriptor.proto" - -// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto. -type fileDescGZIP = []byte - -var fileCache sync.Map // map[filePath]fileDescGZIP - -// RegisterFile is called from generated code to register the compressed -// FileDescriptorProto with the file path for a proto source file. -// -// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead. -func RegisterFile(s filePath, d fileDescGZIP) { - // Decompress the descriptor. - zr, err := gzip.NewReader(bytes.NewReader(d)) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - b, err := ioutil.ReadAll(zr) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - - // Construct a protoreflect.FileDescriptor from the raw descriptor. - // Note that DescBuilder.Build automatically registers the constructed - // file descriptor with the v2 registry. - protoimpl.DescBuilder{RawDescriptor: b}.Build() - - // Locally cache the raw descriptor form for the file. - fileCache.Store(s, d) -} - -// FileDescriptor returns the compressed FileDescriptorProto given the file path -// for a proto source file. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead. -func FileDescriptor(s filePath) fileDescGZIP { - if v, ok := fileCache.Load(s); ok { - return v.(fileDescGZIP) - } - - // Find the descriptor in the v2 registry. - var b []byte - if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil { - b, _ = Marshal(protodesc.ToFileDescriptorProto(fd)) - } - - // Locally cache the raw descriptor form for the file. - if len(b) > 0 { - v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b)) - return v.(fileDescGZIP) - } - return nil -} - -// enumName is the name of an enum. For historical reasons, the enum name is -// neither the full Go name nor the full protobuf name of the enum. -// The name is the dot-separated combination of just the proto package that the -// enum is declared within followed by the Go type name of the generated enum. -type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum" - -// enumsByName maps enum values by name to their numeric counterpart. -type enumsByName = map[string]int32 - -// enumsByNumber maps enum values by number to their name counterpart. -type enumsByNumber = map[int32]string - -var enumCache sync.Map // map[enumName]enumsByName -var numFilesCache sync.Map // map[protoreflect.FullName]int - -// RegisterEnum is called from the generated code to register the mapping of -// enum value names to enum numbers for the enum identified by s. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead. -func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) { - if _, ok := enumCache.Load(s); ok { - panic("proto: duplicate enum registered: " + s) - } - enumCache.Store(s, m) - - // This does not forward registration to the v2 registry since this API - // lacks sufficient information to construct a complete v2 enum descriptor. -} - -// EnumValueMap returns the mapping from enum value names to enum numbers for -// the enum of the given name. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead. -func EnumValueMap(s enumName) enumsByName { - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - - // Check whether the cache is stale. If the number of files in the current - // package differs, then it means that some enums may have been recently - // registered upstream that we do not know about. - var protoPkg protoreflect.FullName - if i := strings.LastIndexByte(s, '.'); i >= 0 { - protoPkg = protoreflect.FullName(s[:i]) - } - v, _ := numFilesCache.Load(protoPkg) - numFiles, _ := v.(int) - if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles { - return nil // cache is up-to-date; was not found earlier - } - - // Update the enum cache for all enums declared in the given proto package. - numFiles = 0 - protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool { - walkEnums(fd, func(ed protoreflect.EnumDescriptor) { - name := protoimpl.X.LegacyEnumName(ed) - if _, ok := enumCache.Load(name); !ok { - m := make(enumsByName) - evs := ed.Values() - for i := evs.Len() - 1; i >= 0; i-- { - ev := evs.Get(i) - m[string(ev.Name())] = int32(ev.Number()) - } - enumCache.LoadOrStore(name, m) - } - }) - numFiles++ - return true - }) - numFilesCache.Store(protoPkg, numFiles) - - // Check cache again for enum map. - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - return nil -} - -// walkEnums recursively walks all enums declared in d. -func walkEnums(d interface { - Enums() protoreflect.EnumDescriptors - Messages() protoreflect.MessageDescriptors -}, f func(protoreflect.EnumDescriptor)) { - eds := d.Enums() - for i := eds.Len() - 1; i >= 0; i-- { - f(eds.Get(i)) - } - mds := d.Messages() - for i := mds.Len() - 1; i >= 0; i-- { - walkEnums(mds.Get(i), f) - } -} - -// messageName is the full name of protobuf message. -type messageName = string - -var messageTypeCache sync.Map // map[messageName]reflect.Type - -// RegisterType is called from generated code to register the message Go type -// for a message of the given name. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead. -func RegisterType(m Message, s messageName) { - mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s)) - if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil { - panic(err) - } - messageTypeCache.Store(s, reflect.TypeOf(m)) -} - -// RegisterMapType is called from generated code to register the Go map type -// for a protobuf message representing a map entry. -// -// Deprecated: Do not use. -func RegisterMapType(m interface{}, s messageName) { - t := reflect.TypeOf(m) - if t.Kind() != reflect.Map { - panic(fmt.Sprintf("invalid map kind: %v", t)) - } - if _, ok := messageTypeCache.Load(s); ok { - panic(fmt.Errorf("proto: duplicate proto message registered: %s", s)) - } - messageTypeCache.Store(s, t) -} - -// MessageType returns the message type for a named message. -// It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead. -func MessageType(s messageName) reflect.Type { - if v, ok := messageTypeCache.Load(s); ok { - return v.(reflect.Type) - } - - // Derive the message type from the v2 registry. - var t reflect.Type - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil { - t = messageGoType(mt) - } - - // If we could not get a concrete type, it is possible that it is a - // pseudo-message for a map entry. - if t == nil { - d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s)) - if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() { - kt := goTypeForField(md.Fields().ByNumber(1)) - vt := goTypeForField(md.Fields().ByNumber(2)) - t = reflect.MapOf(kt, vt) - } - } - - // Locally cache the message type for the given name. - if t != nil { - v, _ := messageTypeCache.LoadOrStore(s, t) - return v.(reflect.Type) - } - return nil -} - -func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type { - switch k := fd.Kind(); k { - case protoreflect.EnumKind: - if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil { - return enumGoType(et) - } - return reflect.TypeOf(protoreflect.EnumNumber(0)) - case protoreflect.MessageKind, protoreflect.GroupKind: - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil { - return messageGoType(mt) - } - return reflect.TypeOf((*protoreflect.Message)(nil)).Elem() - default: - return reflect.TypeOf(fd.Default().Interface()) - } -} - -func enumGoType(et protoreflect.EnumType) reflect.Type { - return reflect.TypeOf(et.New(0)) -} - -func messageGoType(mt protoreflect.MessageType) reflect.Type { - return reflect.TypeOf(MessageV1(mt.Zero().Interface())) -} - -// MessageName returns the full protobuf name for the given message type. -// -// Deprecated: Use protoreflect.MessageDescriptor.FullName instead. -func MessageName(m Message) messageName { - if m == nil { - return "" - } - if m, ok := m.(interface{ XXX_MessageName() messageName }); ok { - return m.XXX_MessageName() - } - return messageName(protoimpl.X.MessageDescriptorOf(m).FullName()) -} - -// RegisterExtension is called from the generated code to register -// the extension descriptor. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead. -func RegisterExtension(d *ExtensionDesc) { - if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil { - panic(err) - } -} - -type extensionsByNumber = map[int32]*ExtensionDesc - -var extensionCache sync.Map // map[messageName]extensionsByNumber - -// RegisteredExtensions returns a map of the registered extensions for the -// provided protobuf message, indexed by the extension field number. -// -// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead. -func RegisteredExtensions(m Message) extensionsByNumber { - // Check whether the cache is stale. If the number of extensions for - // the given message differs, then it means that some extensions were - // recently registered upstream that we do not know about. - s := MessageName(m) - v, _ := extensionCache.Load(s) - xs, _ := v.(extensionsByNumber) - if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) { - return xs // cache is up-to-date - } - - // Cache is stale, re-compute the extensions map. - xs = make(extensionsByNumber) - protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool { - if xd, ok := xt.(*ExtensionDesc); ok { - xs[int32(xt.TypeDescriptor().Number())] = xd - } else { - // TODO: This implies that the protoreflect.ExtensionType is a - // custom type not generated by protoc-gen-go. We could try and - // convert the type to an ExtensionDesc. - } - return true - }) - extensionCache.Store(s, xs) - return xs -} diff --git a/vendor/github.com/golang/protobuf/proto/text_decode.go b/vendor/github.com/golang/protobuf/proto/text_decode.go deleted file mode 100644 index 47eb3e4..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_decode.go +++ /dev/null @@ -1,801 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" - - "google.golang.org/protobuf/encoding/prototext" - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextUnmarshalV2 = false - -// ParseError is returned by UnmarshalText. -type ParseError struct { - Message string - - // Deprecated: Do not use. - Line, Offset int -} - -func (e *ParseError) Error() string { - if wrapTextUnmarshalV2 { - return e.Message - } - if e.Line == 1 { - return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message) - } - return fmt.Sprintf("line %d: %v", e.Line, e.Message) -} - -// UnmarshalText parses a proto text formatted string into m. -func UnmarshalText(s string, m Message) error { - if u, ok := m.(encoding.TextUnmarshaler); ok { - return u.UnmarshalText([]byte(s)) - } - - m.Reset() - mi := MessageV2(m) - - if wrapTextUnmarshalV2 { - err := prototext.UnmarshalOptions{ - AllowPartial: true, - }.Unmarshal([]byte(s), mi) - if err != nil { - return &ParseError{Message: err.Error()} - } - return checkRequiredNotSet(mi) - } else { - if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil { - return err - } - return checkRequiredNotSet(mi) - } -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) { - md := m.Descriptor() - fds := md.Fields() - - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - seen := make(map[protoreflect.FieldNumber]bool) - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - if err := p.unmarshalExtensionOrAny(m, seen); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := protoreflect.Name(tok.value) - fd := fds.ByName(name) - switch { - case fd == nil: - gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name)))) - if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name { - fd = gd - } - case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name: - fd = nil - case fd.IsWeak() && fd.Message().IsPlaceholder(): - fd = nil - } - if fd == nil { - typeName := string(md.FullName()) - if m, ok := m.Interface().(Message); ok { - t := reflect.TypeOf(m) - if t.Kind() == reflect.Ptr { - typeName = t.Elem().String() - } - } - return p.errorf("unknown field name %q in %v", name, typeName) - } - if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name()) - } - if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] { - return p.errorf("non-repeated field %q was repeated", fd.Name()) - } - seen[fd.Number()] = true - - // Consume any colon. - if err := p.checkForColon(fd); err != nil { - return err - } - - // Parse into the field. - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - if v, err = p.unmarshalValue(v, fd); err != nil { - return err - } - m.Set(fd, v) - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - } - return nil -} - -func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error { - name, err := p.consumeExtensionOrAnyName() - if err != nil { - return err - } - - // If it contains a slash, it's an Any type URL. - if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 { - tok := p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - - mt, err := protoregistry.GlobalTypes.FindMessageByURL(name) - if err != nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):]) - } - m2 := mt.New() - if err := p.unmarshalMessage(m2, terminator); err != nil { - return err - } - b, err := protoV2.Marshal(m2.Interface()) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err) - } - - urlFD := m.Descriptor().Fields().ByName("type_url") - valFD := m.Descriptor().Fields().ByName("value") - if seen[urlFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name()) - } - if seen[valFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name()) - } - m.Set(urlFD, protoreflect.ValueOfString(name)) - m.Set(valFD, protoreflect.ValueOfBytes(b)) - seen[urlFD.Number()] = true - seen[valFD.Number()] = true - return nil - } - - xname := protoreflect.FullName(name) - xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname) - if xt == nil && isMessageSet(m.Descriptor()) { - xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension")) - } - if xt == nil { - return p.errorf("unrecognized extension %q", name) - } - fd := xt.TypeDescriptor() - if fd.ContainingMessage().FullName() != m.Descriptor().FullName() { - return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName()) - } - - if err := p.checkForColon(fd); err != nil { - return err - } - - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - v, err = p.unmarshalValue(v, fd) - if err != nil { - return err - } - m.Set(fd, v) - return p.consumeOptionalSeparator() -} - -func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch { - case fd.IsList(): - lv := v.List() - var err error - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return v, p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return v, nil - } - - // One value of the repeated field. - p.back() - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - return v, nil - case fd.IsMap(): - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - - keyFD := fd.MapKey() - valFD := fd.MapValue() - - mv := v.Map() - kv := keyFD.Default() - vv := mv.NewValue() - for { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == terminator { - break - } - var err error - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return v, err - } - if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - case "value": - if err := p.checkForColon(valFD); err != nil { - return v, err - } - if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - default: - p.back() - return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - mv.Set(kv.MapKey(), vv) - return v, nil - default: - p.back() - return p.unmarshalSingularValue(v, fd) - } -} - -func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch fd.Kind() { - case protoreflect.BoolKind: - switch tok.value { - case "true", "1", "t", "True": - return protoreflect.ValueOfBool(true), nil - case "false", "0", "f", "False": - return protoreflect.ValueOfBool(false), nil - } - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil - } - } - case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil - } - } - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfUint32(uint32(x)), nil - } - case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfUint64(uint64(x)), nil - } - case protoreflect.FloatKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 32); err == nil { - return protoreflect.ValueOfFloat32(float32(x)), nil - } - case protoreflect.DoubleKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 64); err == nil { - return protoreflect.ValueOfFloat64(float64(x)), nil - } - case protoreflect.StringKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfString(tok.unquoted), nil - } - case protoreflect.BytesKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil - } - case protoreflect.EnumKind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil - } - vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value)) - if vd != nil { - return protoreflect.ValueOfEnum(vd.Number()), nil - } - case protoreflect.MessageKind, protoreflect.GroupKind: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - err := p.unmarshalMessage(v.Message(), terminator) - return v, err - default: - panic(fmt.Sprintf("invalid kind %v", fd.Kind())) - } - return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value) -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - if fd.Message() == nil { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -// consumeExtensionOrAnyName consumes an extension name or an Any type URL and -// the following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtensionOrAnyName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in unmarshalMessage to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -var errBadUTF8 = errors.New("proto: bad UTF-8") - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - ss := string(r) + s[:2] - s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) - if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) - } - return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil - } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) - } - return string(rune(i)), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} diff --git a/vendor/github.com/golang/protobuf/proto/text_encode.go b/vendor/github.com/golang/protobuf/proto/text_encode.go deleted file mode 100644 index a31134e..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_encode.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "bytes" - "encoding" - "fmt" - "io" - "math" - "sort" - "strings" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextMarshalV2 = false - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line) - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes the proto text format of m to w. -func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error { - b, err := tm.marshal(m) - if len(b) > 0 { - if _, err := w.Write(b); err != nil { - return err - } - } - return err -} - -// Text returns a proto text formatted string of m. -func (tm *TextMarshaler) Text(m Message) string { - b, _ := tm.marshal(m) - return string(b) -} - -func (tm *TextMarshaler) marshal(m Message) ([]byte, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return []byte(""), nil - } - - if wrapTextMarshalV2 { - if m, ok := m.(encoding.TextMarshaler); ok { - return m.MarshalText() - } - - opts := prototext.MarshalOptions{ - AllowPartial: true, - EmitUnknown: true, - } - if !tm.Compact { - opts.Indent = " " - } - if !tm.ExpandAny { - opts.Resolver = (*protoregistry.Types)(nil) - } - return opts.Marshal(mr.Interface()) - } else { - w := &textWriter{ - compact: tm.Compact, - expandAny: tm.ExpandAny, - complete: true, - } - - if m, ok := m.(encoding.TextMarshaler); ok { - b, err := m.MarshalText() - if err != nil { - return nil, err - } - w.Write(b) - return w.buf, nil - } - - err := w.writeMessage(mr) - return w.buf, err - } -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// MarshalText writes the proto text format of m to w. -func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) } - -// MarshalTextString returns a proto text formatted string of m. -func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) } - -// CompactText writes the compact proto text format of m to w. -func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) } - -// CompactTextString returns a compact proto text formatted string of m. -func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) } - -var ( - newline = []byte("\n") - endBraceNewline = []byte("}\n") - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - compact bool // same as TextMarshaler.Compact - expandAny bool // same as TextMarshaler.ExpandAny - complete bool // whether the current position is a complete line - indent int // indentation level; never negative - buf []byte -} - -func (w *textWriter) Write(p []byte) (n int, _ error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - w.buf = append(w.buf, p...) - w.complete = false - return len(p), nil - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - w.buf = append(w.buf, ' ') - n++ - } - w.buf = append(w.buf, frag...) - n += len(frag) - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - w.buf = append(w.buf, frag...) - n += len(frag) - if i+1 < len(frags) { - w.buf = append(w.buf, '\n') - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - w.buf = append(w.buf, c) - w.complete = c == '\n' - return nil -} - -func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - - if fd.Kind() != protoreflect.GroupKind { - w.buf = append(w.buf, fd.Name()...) - w.WriteByte(':') - } else { - // Use message type name for group field name. - w.buf = append(w.buf, fd.Message().Name()...) - } - - if !w.compact { - w.WriteByte(' ') - } -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, error) { - md := m.Descriptor() - fdURL := md.Fields().ByName("type_url") - fdVal := md.Fields().ByName("value") - - url := m.Get(fdURL).String() - mt, err := protoregistry.GlobalTypes.FindMessageByURL(url) - if err != nil { - return false, nil - } - - b := m.Get(fdVal).Bytes() - m2 := mt.New() - if err := proto.Unmarshal(b, m2.Interface()); err != nil { - return false, nil - } - w.Write([]byte("[")) - if requiresQuotes(url) { - w.writeQuotedString(url) - } else { - w.Write([]byte(url)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.indent++ - } - if err := w.writeMessage(m2); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.indent-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (w *textWriter) writeMessage(m protoreflect.Message) error { - md := m.Descriptor() - if w.expandAny && md.FullName() == "google.protobuf.Any" { - if canExpand, err := w.writeProto3Any(m); canExpand { - return err - } - } - - fds := md.Fields() - for i := 0; i < fds.Len(); { - fd := fds.Get(i) - if od := fd.ContainingOneof(); od != nil { - fd = m.WhichOneof(od) - i += od.Fields().Len() - } else { - i++ - } - if fd == nil || !m.Has(fd) { - continue - } - - switch { - case fd.IsList(): - lv := m.Get(fd).List() - for j := 0; j < lv.Len(); j++ { - w.writeName(fd) - v := lv.Get(j) - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - } - case fd.IsMap(): - kfd := fd.MapKey() - vfd := fd.MapValue() - mv := m.Get(fd).Map() - - type entry struct{ key, val protoreflect.Value } - var entries []entry - mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { - entries = append(entries, entry{k.Value(), v}) - return true - }) - sort.Slice(entries, func(i, j int) bool { - switch kfd.Kind() { - case protoreflect.BoolKind: - return !entries[i].key.Bool() && entries[j].key.Bool() - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return entries[i].key.Int() < entries[j].key.Int() - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return entries[i].key.Uint() < entries[j].key.Uint() - case protoreflect.StringKind: - return entries[i].key.String() < entries[j].key.String() - default: - panic("invalid kind") - } - }) - for _, entry := range entries { - w.writeName(fd) - w.WriteByte('<') - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - w.writeName(kfd) - if err := w.writeSingularValue(entry.key, kfd); err != nil { - return err - } - w.WriteByte('\n') - w.writeName(vfd) - if err := w.writeSingularValue(entry.val, vfd); err != nil { - return err - } - w.WriteByte('\n') - w.indent-- - w.WriteByte('>') - w.WriteByte('\n') - } - default: - w.writeName(fd) - if err := w.writeSingularValue(m.Get(fd), fd); err != nil { - return err - } - w.WriteByte('\n') - } - } - - if b := m.GetUnknown(); len(b) > 0 { - w.writeUnknownFields(b) - } - return w.writeExtensions(m) -} - -func (w *textWriter) writeSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - switch fd.Kind() { - case protoreflect.FloatKind, protoreflect.DoubleKind: - switch vf := v.Float(); { - case math.IsInf(vf, +1): - w.Write(posInf) - case math.IsInf(vf, -1): - w.Write(negInf) - case math.IsNaN(vf): - w.Write(nan) - default: - fmt.Fprint(w, v.Interface()) - } - case protoreflect.StringKind: - // NOTE: This does not validate UTF-8 for historical reasons. - w.writeQuotedString(string(v.String())) - case protoreflect.BytesKind: - w.writeQuotedString(string(v.Bytes())) - case protoreflect.MessageKind, protoreflect.GroupKind: - var bra, ket byte = '<', '>' - if fd.Kind() == protoreflect.GroupKind { - bra, ket = '{', '}' - } - w.WriteByte(bra) - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - m := v.Message() - if m2, ok := m.Interface().(encoding.TextMarshaler); ok { - b, err := m2.MarshalText() - if err != nil { - return err - } - w.Write(b) - } else { - w.writeMessage(m) - } - w.indent-- - w.WriteByte(ket) - case protoreflect.EnumKind: - if ev := fd.Enum().Values().ByNumber(v.Enum()); ev != nil { - fmt.Fprint(w, ev.Name()) - } else { - fmt.Fprint(w, v.Enum()) - } - default: - fmt.Fprint(w, v.Interface()) - } - return nil -} - -// writeQuotedString writes a quoted string in the protocol buffer text format. -func (w *textWriter) writeQuotedString(s string) { - w.WriteByte('"') - for i := 0; i < len(s); i++ { - switch c := s[i]; c { - case '\n': - w.buf = append(w.buf, `\n`...) - case '\r': - w.buf = append(w.buf, `\r`...) - case '\t': - w.buf = append(w.buf, `\t`...) - case '"': - w.buf = append(w.buf, `\"`...) - case '\\': - w.buf = append(w.buf, `\\`...) - default: - if isPrint := c >= 0x20 && c < 0x7f; isPrint { - w.buf = append(w.buf, c) - } else { - w.buf = append(w.buf, fmt.Sprintf(`\%03o`, c)...) - } - } - } - w.WriteByte('"') -} - -func (w *textWriter) writeUnknownFields(b []byte) { - if !w.compact { - fmt.Fprintf(w, "/* %d unknown bytes */\n", len(b)) - } - - for len(b) > 0 { - num, wtyp, n := protowire.ConsumeTag(b) - if n < 0 { - return - } - b = b[n:] - - if wtyp == protowire.EndGroupType { - w.indent-- - w.Write(endBraceNewline) - continue - } - fmt.Fprint(w, num) - if wtyp != protowire.StartGroupType { - w.WriteByte(':') - } - if !w.compact || wtyp == protowire.StartGroupType { - w.WriteByte(' ') - } - switch wtyp { - case protowire.VarintType: - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed32Type: - v, n := protowire.ConsumeFixed32(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed64Type: - v, n := protowire.ConsumeFixed64(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.BytesType: - v, n := protowire.ConsumeBytes(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprintf(w, "%q", v) - case protowire.StartGroupType: - w.WriteByte('{') - w.indent++ - default: - fmt.Fprintf(w, "/* unknown wire type %d */", wtyp) - } - w.WriteByte('\n') - } -} - -// writeExtensions writes all the extensions in m. -func (w *textWriter) writeExtensions(m protoreflect.Message) error { - md := m.Descriptor() - if md.ExtensionRanges().Len() == 0 { - return nil - } - - type ext struct { - desc protoreflect.FieldDescriptor - val protoreflect.Value - } - var exts []ext - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - exts = append(exts, ext{fd, v}) - } - return true - }) - sort.Slice(exts, func(i, j int) bool { - return exts[i].desc.Number() < exts[j].desc.Number() - }) - - for _, ext := range exts { - // For message set, use the name of the message as the extension name. - name := string(ext.desc.FullName()) - if isMessageSet(ext.desc.ContainingMessage()) { - name = strings.TrimSuffix(name, ".message_set_extension") - } - - if !ext.desc.IsList() { - if err := w.writeSingularExtension(name, ext.val, ext.desc); err != nil { - return err - } - } else { - lv := ext.val.List() - for i := 0; i < lv.Len(); i++ { - if err := w.writeSingularExtension(name, lv.Get(i), ext.desc); err != nil { - return err - } - } - } - } - return nil -} - -func (w *textWriter) writeSingularExtension(name string, v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - fmt.Fprintf(w, "[%s]:", name) - if !w.compact { - w.WriteByte(' ') - } - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - for i := 0; i < w.indent*2; i++ { - w.buf = append(w.buf, ' ') - } - w.complete = false -} diff --git a/vendor/github.com/golang/protobuf/proto/wire.go b/vendor/github.com/golang/protobuf/proto/wire.go deleted file mode 100644 index d7c28da..0000000 --- a/vendor/github.com/golang/protobuf/proto/wire.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/runtime/protoiface" -) - -// Size returns the size in bytes of the wire-format encoding of m. -func Size(m Message) int { - if m == nil { - return 0 - } - mi := MessageV2(m) - return protoV2.Size(mi) -} - -// Marshal returns the wire-format encoding of m. -func Marshal(m Message) ([]byte, error) { - b, err := marshalAppend(nil, m, false) - if b == nil { - b = zeroBytes - } - return b, err -} - -var zeroBytes = make([]byte, 0, 0) - -func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) { - if m == nil { - return nil, ErrNil - } - mi := MessageV2(m) - nbuf, err := protoV2.MarshalOptions{ - Deterministic: deterministic, - AllowPartial: true, - }.MarshalAppend(buf, mi) - if err != nil { - return buf, err - } - if len(buf) == len(nbuf) { - if !mi.ProtoReflect().IsValid() { - return buf, ErrNil - } - } - return nbuf, checkRequiredNotSet(mi) -} - -// Unmarshal parses a wire-format message in b and places the decoded results in m. -// -// Unmarshal resets m before starting to unmarshal, so any existing data in m is always -// removed. Use UnmarshalMerge to preserve and append to existing data. -func Unmarshal(b []byte, m Message) error { - m.Reset() - return UnmarshalMerge(b, m) -} - -// UnmarshalMerge parses a wire-format message in b and places the decoded results in m. -func UnmarshalMerge(b []byte, m Message) error { - mi := MessageV2(m) - out, err := protoV2.UnmarshalOptions{ - AllowPartial: true, - Merge: true, - }.UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: mi.ProtoReflect(), - }) - if err != nil { - return err - } - if out.Flags&protoiface.UnmarshalInitialized > 0 { - return nil - } - return checkRequiredNotSet(mi) -} diff --git a/vendor/github.com/golang/protobuf/proto/wrappers.go b/vendor/github.com/golang/protobuf/proto/wrappers.go deleted file mode 100644 index 398e348..0000000 --- a/vendor/github.com/golang/protobuf/proto/wrappers.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -// Bool stores v in a new bool value and returns a pointer to it. -func Bool(v bool) *bool { return &v } - -// Int stores v in a new int32 value and returns a pointer to it. -// -// Deprecated: Use Int32 instead. -func Int(v int) *int32 { return Int32(int32(v)) } - -// Int32 stores v in a new int32 value and returns a pointer to it. -func Int32(v int32) *int32 { return &v } - -// Int64 stores v in a new int64 value and returns a pointer to it. -func Int64(v int64) *int64 { return &v } - -// Uint32 stores v in a new uint32 value and returns a pointer to it. -func Uint32(v uint32) *uint32 { return &v } - -// Uint64 stores v in a new uint64 value and returns a pointer to it. -func Uint64(v uint64) *uint64 { return &v } - -// Float32 stores v in a new float32 value and returns a pointer to it. -func Float32(v float32) *float32 { return &v } - -// Float64 stores v in a new float64 value and returns a pointer to it. -func Float64(v float64) *float64 { return &v } - -// String stores v in a new string value and returns a pointer to it. -func String(v string) *string { return &v } diff --git a/vendor/github.com/golang/protobuf/ptypes/any.go b/vendor/github.com/golang/protobuf/ptypes/any.go deleted file mode 100644 index 85f9f57..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/any.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ptypes - -import ( - "fmt" - "strings" - - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - - anypb "github.com/golang/protobuf/ptypes/any" -) - -const urlPrefix = "type.googleapis.com/" - -// AnyMessageName returns the message name contained in an anypb.Any message. -// Most type assertions should use the Is function instead. -// -// Deprecated: Call the any.MessageName method instead. -func AnyMessageName(any *anypb.Any) (string, error) { - name, err := anyMessageName(any) - return string(name), err -} -func anyMessageName(any *anypb.Any) (protoreflect.FullName, error) { - if any == nil { - return "", fmt.Errorf("message is nil") - } - name := protoreflect.FullName(any.TypeUrl) - if i := strings.LastIndex(any.TypeUrl, "/"); i >= 0 { - name = name[i+len("/"):] - } - if !name.IsValid() { - return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) - } - return name, nil -} - -// MarshalAny marshals the given message m into an anypb.Any message. -// -// Deprecated: Call the anypb.New function instead. -func MarshalAny(m proto.Message) (*anypb.Any, error) { - switch dm := m.(type) { - case DynamicAny: - m = dm.Message - case *DynamicAny: - if dm == nil { - return nil, proto.ErrNil - } - m = dm.Message - } - b, err := proto.Marshal(m) - if err != nil { - return nil, err - } - return &anypb.Any{TypeUrl: urlPrefix + proto.MessageName(m), Value: b}, nil -} - -// Empty returns a new message of the type specified in an anypb.Any message. -// It returns protoregistry.NotFound if the corresponding message type could not -// be resolved in the global registry. -// -// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead -// to resolve the message name and create a new instance of it. -func Empty(any *anypb.Any) (proto.Message, error) { - name, err := anyMessageName(any) - if err != nil { - return nil, err - } - mt, err := protoregistry.GlobalTypes.FindMessageByName(name) - if err != nil { - return nil, err - } - return proto.MessageV1(mt.New().Interface()), nil -} - -// UnmarshalAny unmarshals the encoded value contained in the anypb.Any message -// into the provided message m. It returns an error if the target message -// does not match the type in the Any message or if an unmarshal error occurs. -// -// The target message m may be a *DynamicAny message. If the underlying message -// type could not be resolved, then this returns protoregistry.NotFound. -// -// Deprecated: Call the any.UnmarshalTo method instead. -func UnmarshalAny(any *anypb.Any, m proto.Message) error { - if dm, ok := m.(*DynamicAny); ok { - if dm.Message == nil { - var err error - dm.Message, err = Empty(any) - if err != nil { - return err - } - } - m = dm.Message - } - - anyName, err := AnyMessageName(any) - if err != nil { - return err - } - msgName := proto.MessageName(m) - if anyName != msgName { - return fmt.Errorf("mismatched message type: got %q want %q", anyName, msgName) - } - return proto.Unmarshal(any.Value, m) -} - -// Is reports whether the Any message contains a message of the specified type. -// -// Deprecated: Call the any.MessageIs method instead. -func Is(any *anypb.Any, m proto.Message) bool { - if any == nil || m == nil { - return false - } - name := proto.MessageName(m) - if !strings.HasSuffix(any.TypeUrl, name) { - return false - } - return len(any.TypeUrl) == len(name) || any.TypeUrl[len(any.TypeUrl)-len(name)-1] == '/' -} - -// DynamicAny is a value that can be passed to UnmarshalAny to automatically -// allocate a proto.Message for the type specified in an anypb.Any message. -// The allocated message is stored in the embedded proto.Message. -// -// Example: -// var x ptypes.DynamicAny -// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } -// fmt.Printf("unmarshaled message: %v", x.Message) -// -// Deprecated: Use the any.UnmarshalNew method instead to unmarshal -// the any message contents into a new instance of the underlying message. -type DynamicAny struct{ proto.Message } - -func (m DynamicAny) String() string { - if m.Message == nil { - return "" - } - return m.Message.String() -} -func (m DynamicAny) Reset() { - if m.Message == nil { - return - } - m.Message.Reset() -} -func (m DynamicAny) ProtoMessage() { - return -} -func (m DynamicAny) ProtoReflect() protoreflect.Message { - if m.Message == nil { - return nil - } - return dynamicAny{proto.MessageReflect(m.Message)} -} - -type dynamicAny struct{ protoreflect.Message } - -func (m dynamicAny) Type() protoreflect.MessageType { - return dynamicAnyType{m.Message.Type()} -} -func (m dynamicAny) New() protoreflect.Message { - return dynamicAnyType{m.Message.Type()}.New() -} -func (m dynamicAny) Interface() protoreflect.ProtoMessage { - return DynamicAny{proto.MessageV1(m.Message.Interface())} -} - -type dynamicAnyType struct{ protoreflect.MessageType } - -func (t dynamicAnyType) New() protoreflect.Message { - return dynamicAny{t.MessageType.New()} -} -func (t dynamicAnyType) Zero() protoreflect.Message { - return dynamicAny{t.MessageType.Zero()} -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go deleted file mode 100644 index 0ef27d3..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go +++ /dev/null @@ -1,62 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/golang/protobuf/ptypes/any/any.proto - -package any - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" - reflect "reflect" -) - -// Symbols defined in public import of google/protobuf/any.proto. - -type Any = anypb.Any - -var File_github_com_golang_protobuf_ptypes_any_any_proto protoreflect.FileDescriptor - -var file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc = []byte{ - 0x0a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, - 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2f, 0x61, 0x6e, 0x79, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x2b, 0x5a, 0x29, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, - 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x61, 0x6e, 0x79, 0x3b, 0x61, 0x6e, 0x79, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, -} - -var file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes = []interface{}{} -var file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_github_com_golang_protobuf_ptypes_any_any_proto_init() } -func file_github_com_golang_protobuf_ptypes_any_any_proto_init() { - if File_github_com_golang_protobuf_ptypes_any_any_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes, - DependencyIndexes: file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs, - }.Build() - File_github_com_golang_protobuf_ptypes_any_any_proto = out.File - file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc = nil - file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes = nil - file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs = nil -} diff --git a/vendor/github.com/golang/protobuf/ptypes/doc.go b/vendor/github.com/golang/protobuf/ptypes/doc.go deleted file mode 100644 index d3c3325..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ptypes provides functionality for interacting with well-known types. -// -// Deprecated: Well-known types have specialized functionality directly -// injected into the generated packages for each message type. -// See the deprecation notice for each function for the suggested alternative. -package ptypes diff --git a/vendor/github.com/golang/protobuf/ptypes/duration.go b/vendor/github.com/golang/protobuf/ptypes/duration.go deleted file mode 100644 index b2b55dd..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ptypes - -import ( - "errors" - "fmt" - "time" - - durationpb "github.com/golang/protobuf/ptypes/duration" -) - -// Range of google.protobuf.Duration as specified in duration.proto. -// This is about 10,000 years in seconds. -const ( - maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) - minSeconds = -maxSeconds -) - -// Duration converts a durationpb.Duration to a time.Duration. -// Duration returns an error if dur is invalid or overflows a time.Duration. -// -// Deprecated: Call the dur.AsDuration and dur.CheckValid methods instead. -func Duration(dur *durationpb.Duration) (time.Duration, error) { - if err := validateDuration(dur); err != nil { - return 0, err - } - d := time.Duration(dur.Seconds) * time.Second - if int64(d/time.Second) != dur.Seconds { - return 0, fmt.Errorf("duration: %v is out of range for time.Duration", dur) - } - if dur.Nanos != 0 { - d += time.Duration(dur.Nanos) * time.Nanosecond - if (d < 0) != (dur.Nanos < 0) { - return 0, fmt.Errorf("duration: %v is out of range for time.Duration", dur) - } - } - return d, nil -} - -// DurationProto converts a time.Duration to a durationpb.Duration. -// -// Deprecated: Call the durationpb.New function instead. -func DurationProto(d time.Duration) *durationpb.Duration { - nanos := d.Nanoseconds() - secs := nanos / 1e9 - nanos -= secs * 1e9 - return &durationpb.Duration{ - Seconds: int64(secs), - Nanos: int32(nanos), - } -} - -// validateDuration determines whether the durationpb.Duration is valid -// according to the definition in google/protobuf/duration.proto. -// A valid durpb.Duration may still be too large to fit into a time.Duration -// Note that the range of durationpb.Duration is about 10,000 years, -// while the range of time.Duration is about 290 years. -func validateDuration(dur *durationpb.Duration) error { - if dur == nil { - return errors.New("duration: nil Duration") - } - if dur.Seconds < minSeconds || dur.Seconds > maxSeconds { - return fmt.Errorf("duration: %v: seconds out of range", dur) - } - if dur.Nanos <= -1e9 || dur.Nanos >= 1e9 { - return fmt.Errorf("duration: %v: nanos out of range", dur) - } - // Seconds and Nanos must have the same sign, unless d.Nanos is zero. - if (dur.Seconds < 0 && dur.Nanos > 0) || (dur.Seconds > 0 && dur.Nanos < 0) { - return fmt.Errorf("duration: %v: seconds and nanos have different signs", dur) - } - return nil -} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go deleted file mode 100644 index d0079ee..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/golang/protobuf/ptypes/duration/duration.proto - -package duration - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" - reflect "reflect" -) - -// Symbols defined in public import of google/protobuf/duration.proto. - -type Duration = durationpb.Duration - -var File_github_com_golang_protobuf_ptypes_duration_duration_proto protoreflect.FileDescriptor - -var file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc = []byte{ - 0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, - 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x35, 0x5a, 0x33, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes = []interface{}{} -var file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_github_com_golang_protobuf_ptypes_duration_duration_proto_init() } -func file_github_com_golang_protobuf_ptypes_duration_duration_proto_init() { - if File_github_com_golang_protobuf_ptypes_duration_duration_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes, - DependencyIndexes: file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs, - }.Build() - File_github_com_golang_protobuf_ptypes_duration_duration_proto = out.File - file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc = nil - file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes = nil - file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs = nil -} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/vendor/github.com/golang/protobuf/ptypes/timestamp.go deleted file mode 100644 index 8368a3f..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ptypes - -import ( - "errors" - "fmt" - "time" - - timestamppb "github.com/golang/protobuf/ptypes/timestamp" -) - -// Range of google.protobuf.Duration as specified in timestamp.proto. -const ( - // Seconds field of the earliest valid Timestamp. - // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - minValidSeconds = -62135596800 - // Seconds field just after the latest valid Timestamp. - // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - maxValidSeconds = 253402300800 -) - -// Timestamp converts a timestamppb.Timestamp to a time.Time. -// It returns an error if the argument is invalid. -// -// Unlike most Go functions, if Timestamp returns an error, the first return -// value is not the zero time.Time. Instead, it is the value obtained from the -// time.Unix function when passed the contents of the Timestamp, in the UTC -// locale. This may or may not be a meaningful time; many invalid Timestamps -// do map to valid time.Times. -// -// A nil Timestamp returns an error. The first return value in that case is -// undefined. -// -// Deprecated: Call the ts.AsTime and ts.CheckValid methods instead. -func Timestamp(ts *timestamppb.Timestamp) (time.Time, error) { - // Don't return the zero value on error, because corresponds to a valid - // timestamp. Instead return whatever time.Unix gives us. - var t time.Time - if ts == nil { - t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp - } else { - t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() - } - return t, validateTimestamp(ts) -} - -// TimestampNow returns a google.protobuf.Timestamp for the current time. -// -// Deprecated: Call the timestamppb.Now function instead. -func TimestampNow() *timestamppb.Timestamp { - ts, err := TimestampProto(time.Now()) - if err != nil { - panic("ptypes: time.Now() out of Timestamp range") - } - return ts -} - -// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. -// It returns an error if the resulting Timestamp is invalid. -// -// Deprecated: Call the timestamppb.New function instead. -func TimestampProto(t time.Time) (*timestamppb.Timestamp, error) { - ts := ×tamppb.Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } - if err := validateTimestamp(ts); err != nil { - return nil, err - } - return ts, nil -} - -// TimestampString returns the RFC 3339 string for valid Timestamps. -// For invalid Timestamps, it returns an error message in parentheses. -// -// Deprecated: Call the ts.AsTime method instead, -// followed by a call to the Format method on the time.Time value. -func TimestampString(ts *timestamppb.Timestamp) string { - t, err := Timestamp(ts) - if err != nil { - return fmt.Sprintf("(%v)", err) - } - return t.Format(time.RFC3339Nano) -} - -// validateTimestamp determines whether a Timestamp is valid. -// A valid timestamp represents a time in the range [0001-01-01, 10000-01-01) -// and has a Nanos field in the range [0, 1e9). -// -// If the Timestamp is valid, validateTimestamp returns nil. -// Otherwise, it returns an error that describes the problem. -// -// Every valid Timestamp can be represented by a time.Time, -// but the converse is not true. -func validateTimestamp(ts *timestamppb.Timestamp) error { - if ts == nil { - return errors.New("timestamp: nil Timestamp") - } - if ts.Seconds < minValidSeconds { - return fmt.Errorf("timestamp: %v before 0001-01-01", ts) - } - if ts.Seconds >= maxValidSeconds { - return fmt.Errorf("timestamp: %v after 10000-01-01", ts) - } - if ts.Nanos < 0 || ts.Nanos >= 1e9 { - return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) - } - return nil -} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go deleted file mode 100644 index a76f807..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go +++ /dev/null @@ -1,64 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/golang/protobuf/ptypes/timestamp/timestamp.proto - -package timestamp - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" -) - -// Symbols defined in public import of google/protobuf/timestamp.proto. - -type Timestamp = timestamppb.Timestamp - -var File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto protoreflect.FileDescriptor - -var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc = []byte{ - 0x0a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, - 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x37, - 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, - 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3b, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -} - -var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes = []interface{}{} -var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init() } -func file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init() { - if File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes, - DependencyIndexes: file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs, - }.Build() - File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto = out.File - file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc = nil - file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes = nil - file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs = nil -} diff --git a/vendor/github.com/golang/snappy/.gitignore b/vendor/github.com/golang/snappy/.gitignore deleted file mode 100644 index 042091d..0000000 --- a/vendor/github.com/golang/snappy/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -cmd/snappytool/snappytool -testdata/bench - -# These explicitly listed benchmark data files are for an obsolete version of -# snappy_test.go. -testdata/alice29.txt -testdata/asyoulik.txt -testdata/fireworks.jpeg -testdata/geo.protodata -testdata/html -testdata/html_x_4 -testdata/kppkn.gtb -testdata/lcet10.txt -testdata/paper-100k.pdf -testdata/plrabn12.txt -testdata/urls.10K diff --git a/vendor/github.com/golang/snappy/AUTHORS b/vendor/github.com/golang/snappy/AUTHORS deleted file mode 100644 index bcfa195..0000000 --- a/vendor/github.com/golang/snappy/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ -# This is the official list of Snappy-Go authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Damian Gryski -Google Inc. -Jan Mercl <0xjnml@gmail.com> -Rodolfo Carvalho -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/CONTRIBUTORS b/vendor/github.com/golang/snappy/CONTRIBUTORS deleted file mode 100644 index 931ae31..0000000 --- a/vendor/github.com/golang/snappy/CONTRIBUTORS +++ /dev/null @@ -1,37 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the Snappy-Go repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# http://code.google.com/legal/individual-cla-v1.0.html -# http://code.google.com/legal/corporate-cla-v1.0.html -# -# The agreement for individuals can be filled out on the web. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name - -# Please keep the list sorted. - -Damian Gryski -Jan Mercl <0xjnml@gmail.com> -Kai Backman -Marc-Antoine Ruel -Nigel Tao -Rob Pike -Rodolfo Carvalho -Russ Cox -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/LICENSE b/vendor/github.com/golang/snappy/LICENSE deleted file mode 100644 index 6050c10..0000000 --- a/vendor/github.com/golang/snappy/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/golang/snappy/README b/vendor/github.com/golang/snappy/README deleted file mode 100644 index cea1287..0000000 --- a/vendor/github.com/golang/snappy/README +++ /dev/null @@ -1,107 +0,0 @@ -The Snappy compression format in the Go programming language. - -To download and install from source: -$ go get github.com/golang/snappy - -Unless otherwise noted, the Snappy-Go source files are distributed -under the BSD-style license found in the LICENSE file. - - - -Benchmarks. - -The golang/snappy benchmarks include compressing (Z) and decompressing (U) ten -or so files, the same set used by the C++ Snappy code (github.com/google/snappy -and note the "google", not "golang"). On an "Intel(R) Core(TM) i7-3770 CPU @ -3.40GHz", Go's GOARCH=amd64 numbers as of 2016-05-29: - -"go test -test.bench=." - -_UFlat0-8 2.19GB/s ± 0% html -_UFlat1-8 1.41GB/s ± 0% urls -_UFlat2-8 23.5GB/s ± 2% jpg -_UFlat3-8 1.91GB/s ± 0% jpg_200 -_UFlat4-8 14.0GB/s ± 1% pdf -_UFlat5-8 1.97GB/s ± 0% html4 -_UFlat6-8 814MB/s ± 0% txt1 -_UFlat7-8 785MB/s ± 0% txt2 -_UFlat8-8 857MB/s ± 0% txt3 -_UFlat9-8 719MB/s ± 1% txt4 -_UFlat10-8 2.84GB/s ± 0% pb -_UFlat11-8 1.05GB/s ± 0% gaviota - -_ZFlat0-8 1.04GB/s ± 0% html -_ZFlat1-8 534MB/s ± 0% urls -_ZFlat2-8 15.7GB/s ± 1% jpg -_ZFlat3-8 740MB/s ± 3% jpg_200 -_ZFlat4-8 9.20GB/s ± 1% pdf -_ZFlat5-8 991MB/s ± 0% html4 -_ZFlat6-8 379MB/s ± 0% txt1 -_ZFlat7-8 352MB/s ± 0% txt2 -_ZFlat8-8 396MB/s ± 1% txt3 -_ZFlat9-8 327MB/s ± 1% txt4 -_ZFlat10-8 1.33GB/s ± 1% pb -_ZFlat11-8 605MB/s ± 1% gaviota - - - -"go test -test.bench=. -tags=noasm" - -_UFlat0-8 621MB/s ± 2% html -_UFlat1-8 494MB/s ± 1% urls -_UFlat2-8 23.2GB/s ± 1% jpg -_UFlat3-8 1.12GB/s ± 1% jpg_200 -_UFlat4-8 4.35GB/s ± 1% pdf -_UFlat5-8 609MB/s ± 0% html4 -_UFlat6-8 296MB/s ± 0% txt1 -_UFlat7-8 288MB/s ± 0% txt2 -_UFlat8-8 309MB/s ± 1% txt3 -_UFlat9-8 280MB/s ± 1% txt4 -_UFlat10-8 753MB/s ± 0% pb -_UFlat11-8 400MB/s ± 0% gaviota - -_ZFlat0-8 409MB/s ± 1% html -_ZFlat1-8 250MB/s ± 1% urls -_ZFlat2-8 12.3GB/s ± 1% jpg -_ZFlat3-8 132MB/s ± 0% jpg_200 -_ZFlat4-8 2.92GB/s ± 0% pdf -_ZFlat5-8 405MB/s ± 1% html4 -_ZFlat6-8 179MB/s ± 1% txt1 -_ZFlat7-8 170MB/s ± 1% txt2 -_ZFlat8-8 189MB/s ± 1% txt3 -_ZFlat9-8 164MB/s ± 1% txt4 -_ZFlat10-8 479MB/s ± 1% pb -_ZFlat11-8 270MB/s ± 1% gaviota - - - -For comparison (Go's encoded output is byte-for-byte identical to C++'s), here -are the numbers from C++ Snappy's - -make CXXFLAGS="-O2 -DNDEBUG -g" clean snappy_unittest.log && cat snappy_unittest.log - -BM_UFlat/0 2.4GB/s html -BM_UFlat/1 1.4GB/s urls -BM_UFlat/2 21.8GB/s jpg -BM_UFlat/3 1.5GB/s jpg_200 -BM_UFlat/4 13.3GB/s pdf -BM_UFlat/5 2.1GB/s html4 -BM_UFlat/6 1.0GB/s txt1 -BM_UFlat/7 959.4MB/s txt2 -BM_UFlat/8 1.0GB/s txt3 -BM_UFlat/9 864.5MB/s txt4 -BM_UFlat/10 2.9GB/s pb -BM_UFlat/11 1.2GB/s gaviota - -BM_ZFlat/0 944.3MB/s html (22.31 %) -BM_ZFlat/1 501.6MB/s urls (47.78 %) -BM_ZFlat/2 14.3GB/s jpg (99.95 %) -BM_ZFlat/3 538.3MB/s jpg_200 (73.00 %) -BM_ZFlat/4 8.3GB/s pdf (83.30 %) -BM_ZFlat/5 903.5MB/s html4 (22.52 %) -BM_ZFlat/6 336.0MB/s txt1 (57.88 %) -BM_ZFlat/7 312.3MB/s txt2 (61.91 %) -BM_ZFlat/8 353.1MB/s txt3 (54.99 %) -BM_ZFlat/9 289.9MB/s txt4 (66.26 %) -BM_ZFlat/10 1.2GB/s pb (19.68 %) -BM_ZFlat/11 527.4MB/s gaviota (37.72 %) diff --git a/vendor/github.com/golang/snappy/decode.go b/vendor/github.com/golang/snappy/decode.go deleted file mode 100644 index 72efb03..0000000 --- a/vendor/github.com/golang/snappy/decode.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -var ( - // ErrCorrupt reports that the input is invalid. - ErrCorrupt = errors.New("snappy: corrupt input") - // ErrTooLarge reports that the uncompressed length is too large. - ErrTooLarge = errors.New("snappy: decoded block is too large") - // ErrUnsupported reports that the input isn't supported. - ErrUnsupported = errors.New("snappy: unsupported input") - - errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") -) - -// DecodedLen returns the length of the decoded block. -func DecodedLen(src []byte) (int, error) { - v, _, err := decodedLen(src) - return v, err -} - -// decodedLen returns the length of the decoded block and the number of bytes -// that the length header occupied. -func decodedLen(src []byte) (blockLen, headerLen int, err error) { - v, n := binary.Uvarint(src) - if n <= 0 || v > 0xffffffff { - return 0, 0, ErrCorrupt - } - - const wordSize = 32 << (^uint(0) >> 32 & 1) - if wordSize == 32 && v > 0x7fffffff { - return 0, 0, ErrTooLarge - } - return int(v), n, nil -} - -const ( - decodeErrCodeCorrupt = 1 - decodeErrCodeUnsupportedLiteralLength = 2 -) - -// Decode returns the decoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire decoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -func Decode(dst, src []byte) ([]byte, error) { - dLen, s, err := decodedLen(src) - if err != nil { - return nil, err - } - if dLen <= len(dst) { - dst = dst[:dLen] - } else { - dst = make([]byte, dLen) - } - switch decode(dst, src[s:]) { - case 0: - return dst, nil - case decodeErrCodeUnsupportedLiteralLength: - return nil, errUnsupportedLiteralLength - } - return nil, ErrCorrupt -} - -// NewReader returns a new Reader that decompresses from r, using the framing -// format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -func NewReader(r io.Reader) *Reader { - return &Reader{ - r: r, - decoded: make([]byte, maxBlockSize), - buf: make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize), - } -} - -// Reader is an io.Reader that can read Snappy-compressed bytes. -type Reader struct { - r io.Reader - err error - decoded []byte - buf []byte - // decoded[i:j] contains decoded bytes that have not yet been passed on. - i, j int - readHeader bool -} - -// Reset discards any buffered data, resets all state, and switches the Snappy -// reader to read from r. This permits reusing a Reader rather than allocating -// a new one. -func (r *Reader) Reset(reader io.Reader) { - r.r = reader - r.err = nil - r.i = 0 - r.j = 0 - r.readHeader = false -} - -func (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) { - if _, r.err = io.ReadFull(r.r, p); r.err != nil { - if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { - r.err = ErrCorrupt - } - return false - } - return true -} - -// Read satisfies the io.Reader interface. -func (r *Reader) Read(p []byte) (int, error) { - if r.err != nil { - return 0, r.err - } - for { - if r.i < r.j { - n := copy(p, r.decoded[r.i:r.j]) - r.i += n - return n, nil - } - if !r.readFull(r.buf[:4], true) { - return 0, r.err - } - chunkType := r.buf[0] - if !r.readHeader { - if chunkType != chunkTypeStreamIdentifier { - r.err = ErrCorrupt - return 0, r.err - } - r.readHeader = true - } - chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 - if chunkLen > len(r.buf) { - r.err = ErrUnsupported - return 0, r.err - } - - // The chunk types are specified at - // https://github.com/google/snappy/blob/master/framing_format.txt - switch chunkType { - case chunkTypeCompressedData: - // Section 4.2. Compressed data (chunk type 0x00). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return 0, r.err - } - buf := r.buf[:chunkLen] - if !r.readFull(buf, false) { - return 0, r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - buf = buf[checksumSize:] - - n, err := DecodedLen(buf) - if err != nil { - r.err = err - return 0, r.err - } - if n > len(r.decoded) { - r.err = ErrCorrupt - return 0, r.err - } - if _, err := Decode(r.decoded, buf); err != nil { - r.err = err - return 0, r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return 0, r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeUncompressedData: - // Section 4.3. Uncompressed data (chunk type 0x01). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return 0, r.err - } - buf := r.buf[:checksumSize] - if !r.readFull(buf, false) { - return 0, r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - // Read directly into r.decoded instead of via r.buf. - n := chunkLen - checksumSize - if n > len(r.decoded) { - r.err = ErrCorrupt - return 0, r.err - } - if !r.readFull(r.decoded[:n], false) { - return 0, r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return 0, r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeStreamIdentifier: - // Section 4.1. Stream identifier (chunk type 0xff). - if chunkLen != len(magicBody) { - r.err = ErrCorrupt - return 0, r.err - } - if !r.readFull(r.buf[:len(magicBody)], false) { - return 0, r.err - } - for i := 0; i < len(magicBody); i++ { - if r.buf[i] != magicBody[i] { - r.err = ErrCorrupt - return 0, r.err - } - } - continue - } - - if chunkType <= 0x7f { - // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). - r.err = ErrUnsupported - return 0, r.err - } - // Section 4.4 Padding (chunk type 0xfe). - // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). - if !r.readFull(r.buf[:chunkLen], false) { - return 0, r.err - } - } -} diff --git a/vendor/github.com/golang/snappy/decode_amd64.go b/vendor/github.com/golang/snappy/decode_amd64.go deleted file mode 100644 index fcd192b..0000000 --- a/vendor/github.com/golang/snappy/decode_amd64.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -package snappy - -// decode has the same semantics as in decode_other.go. -// -//go:noescape -func decode(dst, src []byte) int diff --git a/vendor/github.com/golang/snappy/decode_amd64.s b/vendor/github.com/golang/snappy/decode_amd64.s deleted file mode 100644 index e6179f6..0000000 --- a/vendor/github.com/golang/snappy/decode_amd64.s +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The asm code generally follows the pure Go code in decode_other.go, except -// where marked with a "!!!". - -// func decode(dst, src []byte) int -// -// All local variables fit into registers. The non-zero stack size is only to -// spill registers and push args when issuing a CALL. The register allocation: -// - AX scratch -// - BX scratch -// - CX length or x -// - DX offset -// - SI &src[s] -// - DI &dst[d] -// + R8 dst_base -// + R9 dst_len -// + R10 dst_base + dst_len -// + R11 src_base -// + R12 src_len -// + R13 src_base + src_len -// - R14 used by doCopy -// - R15 used by doCopy -// -// The registers R8-R13 (marked with a "+") are set at the start of the -// function, and after a CALL returns, and are not otherwise modified. -// -// The d variable is implicitly DI - R8, and len(dst)-d is R10 - DI. -// The s variable is implicitly SI - R11, and len(src)-s is R13 - SI. -TEXT ·decode(SB), NOSPLIT, $48-56 - // Initialize SI, DI and R8-R13. - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, DI - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, SI - MOVQ R11, R13 - ADDQ R12, R13 - -loop: - // for s < len(src) - CMPQ SI, R13 - JEQ end - - // CX = uint32(src[s]) - // - // switch src[s] & 0x03 - MOVBLZX (SI), CX - MOVL CX, BX - ANDL $3, BX - CMPL BX, $1 - JAE tagCopy - - // ---------------------------------------- - // The code below handles literal tags. - - // case tagLiteral: - // x := uint32(src[s] >> 2) - // switch - SHRL $2, CX - CMPL CX, $60 - JAE tagLit60Plus - - // case x < 60: - // s++ - INCQ SI - -doLit: - // This is the end of the inner "switch", when we have a literal tag. - // - // We assume that CX == x and x fits in a uint32, where x is the variable - // used in the pure Go decode_other.go code. - - // length = int(x) + 1 - // - // Unlike the pure Go code, we don't need to check if length <= 0 because - // CX can hold 64 bits, so the increment cannot overflow. - INCQ CX - - // Prepare to check if copying length bytes will run past the end of dst or - // src. - // - // AX = len(dst) - d - // BX = len(src) - s - MOVQ R10, AX - SUBQ DI, AX - MOVQ R13, BX - SUBQ SI, BX - - // !!! Try a faster technique for short (16 or fewer bytes) copies. - // - // if length > 16 || len(dst)-d < 16 || len(src)-s < 16 { - // goto callMemmove // Fall back on calling runtime·memmove. - // } - // - // The C++ snappy code calls this TryFastAppend. It also checks len(src)-s - // against 21 instead of 16, because it cannot assume that all of its input - // is contiguous in memory and so it needs to leave enough source bytes to - // read the next tag without refilling buffers, but Go's Decode assumes - // contiguousness (the src argument is a []byte). - CMPQ CX, $16 - JGT callMemmove - CMPQ AX, $16 - JLT callMemmove - CMPQ BX, $16 - JLT callMemmove - - // !!! Implement the copy from src to dst as a 16-byte load and store. - // (Decode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only length bytes, but that's - // OK. If the input is a valid Snappy encoding then subsequent iterations - // will fix up the overrun. Otherwise, Decode returns a nil []byte (and a - // non-nil error), so the overrun will be ignored. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(SI), X0 - MOVOU X0, 0(DI) - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -callMemmove: - // if length > len(dst)-d || length > len(src)-s { etc } - CMPQ CX, AX - JGT errCorrupt - CMPQ CX, BX - JGT errCorrupt - - // copy(dst[d:], src[s:s+length]) - // - // This means calling runtime·memmove(&dst[d], &src[s], length), so we push - // DI, SI and CX as arguments. Coincidentally, we also need to spill those - // three registers to the stack, to save local variables across the CALL. - MOVQ DI, 0(SP) - MOVQ SI, 8(SP) - MOVQ CX, 16(SP) - MOVQ DI, 24(SP) - MOVQ SI, 32(SP) - MOVQ CX, 40(SP) - CALL runtime·memmove(SB) - - // Restore local variables: unspill registers from the stack and - // re-calculate R8-R13. - MOVQ 24(SP), DI - MOVQ 32(SP), SI - MOVQ 40(SP), CX - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, R13 - ADDQ R12, R13 - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -tagLit60Plus: - // !!! This fragment does the - // - // s += x - 58; if uint(s) > uint(len(src)) { etc } - // - // checks. In the asm version, we code it once instead of once per switch case. - ADDQ CX, SI - SUBQ $58, SI - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // case x == 60: - CMPL CX, $61 - JEQ tagLit61 - JA tagLit62Plus - - // x = uint32(src[s-1]) - MOVBLZX -1(SI), CX - JMP doLit - -tagLit61: - // case x == 61: - // x = uint32(src[s-2]) | uint32(src[s-1])<<8 - MOVWLZX -2(SI), CX - JMP doLit - -tagLit62Plus: - CMPL CX, $62 - JA tagLit63 - - // case x == 62: - // x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - MOVWLZX -3(SI), CX - MOVBLZX -1(SI), BX - SHLL $16, BX - ORL BX, CX - JMP doLit - -tagLit63: - // case x == 63: - // x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - MOVL -4(SI), CX - JMP doLit - -// The code above handles literal tags. -// ---------------------------------------- -// The code below handles copy tags. - -tagCopy4: - // case tagCopy4: - // s += 5 - ADDQ $5, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-5])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - MOVLQZX -4(SI), DX - JMP doCopy - -tagCopy2: - // case tagCopy2: - // s += 3 - ADDQ $3, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-3])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - MOVWQZX -2(SI), DX - JMP doCopy - -tagCopy: - // We have a copy tag. We assume that: - // - BX == src[s] & 0x03 - // - CX == src[s] - CMPQ BX, $2 - JEQ tagCopy2 - JA tagCopy4 - - // case tagCopy1: - // s += 2 - ADDQ $2, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - MOVQ CX, DX - ANDQ $0xe0, DX - SHLQ $3, DX - MOVBQZX -1(SI), BX - ORQ BX, DX - - // length = 4 + int(src[s-2])>>2&0x7 - SHRQ $2, CX - ANDQ $7, CX - ADDQ $4, CX - -doCopy: - // This is the end of the outer "switch", when we have a copy tag. - // - // We assume that: - // - CX == length && CX > 0 - // - DX == offset - - // if offset <= 0 { etc } - CMPQ DX, $0 - JLE errCorrupt - - // if d < offset { etc } - MOVQ DI, BX - SUBQ R8, BX - CMPQ BX, DX - JLT errCorrupt - - // if length > len(dst)-d { etc } - MOVQ R10, BX - SUBQ DI, BX - CMPQ CX, BX - JGT errCorrupt - - // forwardCopy(dst[d:d+length], dst[d-offset:]); d += length - // - // Set: - // - R14 = len(dst)-d - // - R15 = &dst[d-offset] - MOVQ R10, R14 - SUBQ DI, R14 - MOVQ DI, R15 - SUBQ DX, R15 - - // !!! Try a faster technique for short (16 or fewer bytes) forward copies. - // - // First, try using two 8-byte load/stores, similar to the doLit technique - // above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is - // still OK if offset >= 8. Note that this has to be two 8-byte load/stores - // and not one 16-byte load/store, and the first store has to be before the - // second load, due to the overlap if offset is in the range [8, 16). - // - // if length > 16 || offset < 8 || len(dst)-d < 16 { - // goto slowForwardCopy - // } - // copy 16 bytes - // d += length - CMPQ CX, $16 - JGT slowForwardCopy - CMPQ DX, $8 - JLT slowForwardCopy - CMPQ R14, $16 - JLT slowForwardCopy - MOVQ 0(R15), AX - MOVQ AX, 0(DI) - MOVQ 8(R15), BX - MOVQ BX, 8(DI) - ADDQ CX, DI - JMP loop - -slowForwardCopy: - // !!! If the forward copy is longer than 16 bytes, or if offset < 8, we - // can still try 8-byte load stores, provided we can overrun up to 10 extra - // bytes. As above, the overrun will be fixed up by subsequent iterations - // of the outermost loop. - // - // The C++ snappy code calls this technique IncrementalCopyFastPath. Its - // commentary says: - // - // ---- - // - // The main part of this loop is a simple copy of eight bytes at a time - // until we've copied (at least) the requested amount of bytes. However, - // if d and d-offset are less than eight bytes apart (indicating a - // repeating pattern of length < 8), we first need to expand the pattern in - // order to get the correct results. For instance, if the buffer looks like - // this, with the eight-byte and patterns marked as - // intervals: - // - // abxxxxxxxxxxxx - // [------] d-offset - // [------] d - // - // a single eight-byte copy from to will repeat the pattern - // once, after which we can move two bytes without moving : - // - // ababxxxxxxxxxx - // [------] d-offset - // [------] d - // - // and repeat the exercise until the two no longer overlap. - // - // This allows us to do very well in the special case of one single byte - // repeated many times, without taking a big hit for more general cases. - // - // The worst case of extra writing past the end of the match occurs when - // offset == 1 and length == 1; the last copy will read from byte positions - // [0..7] and write to [4..11], whereas it was only supposed to write to - // position 1. Thus, ten excess bytes. - // - // ---- - // - // That "10 byte overrun" worst case is confirmed by Go's - // TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy - // and finishSlowForwardCopy algorithm. - // - // if length > len(dst)-d-10 { - // goto verySlowForwardCopy - // } - SUBQ $10, R14 - CMPQ CX, R14 - JGT verySlowForwardCopy - -makeOffsetAtLeast8: - // !!! As above, expand the pattern so that offset >= 8 and we can use - // 8-byte load/stores. - // - // for offset < 8 { - // copy 8 bytes from dst[d-offset:] to dst[d:] - // length -= offset - // d += offset - // offset += offset - // // The two previous lines together means that d-offset, and therefore - // // R15, is unchanged. - // } - CMPQ DX, $8 - JGE fixUpSlowForwardCopy - MOVQ (R15), BX - MOVQ BX, (DI) - SUBQ DX, CX - ADDQ DX, DI - ADDQ DX, DX - JMP makeOffsetAtLeast8 - -fixUpSlowForwardCopy: - // !!! Add length (which might be negative now) to d (implied by DI being - // &dst[d]) so that d ends up at the right place when we jump back to the - // top of the loop. Before we do that, though, we save DI to AX so that, if - // length is positive, copying the remaining length bytes will write to the - // right place. - MOVQ DI, AX - ADDQ CX, DI - -finishSlowForwardCopy: - // !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative - // length means that we overrun, but as above, that will be fixed up by - // subsequent iterations of the outermost loop. - CMPQ CX, $0 - JLE loop - MOVQ (R15), BX - MOVQ BX, (AX) - ADDQ $8, R15 - ADDQ $8, AX - SUBQ $8, CX - JMP finishSlowForwardCopy - -verySlowForwardCopy: - // verySlowForwardCopy is a simple implementation of forward copy. In C - // parlance, this is a do/while loop instead of a while loop, since we know - // that length > 0. In Go syntax: - // - // for { - // dst[d] = dst[d - offset] - // d++ - // length-- - // if length == 0 { - // break - // } - // } - MOVB (R15), BX - MOVB BX, (DI) - INCQ R15 - INCQ DI - DECQ CX - JNZ verySlowForwardCopy - JMP loop - -// The code above handles copy tags. -// ---------------------------------------- - -end: - // This is the end of the "for s < len(src)". - // - // if d != len(dst) { etc } - CMPQ DI, R10 - JNE errCorrupt - - // return 0 - MOVQ $0, ret+48(FP) - RET - -errCorrupt: - // return decodeErrCodeCorrupt - MOVQ $1, ret+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/decode_other.go b/vendor/github.com/golang/snappy/decode_other.go deleted file mode 100644 index 8c9f204..0000000 --- a/vendor/github.com/golang/snappy/decode_other.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 appengine !gc noasm - -package snappy - -// decode writes the decoding of src to dst. It assumes that the varint-encoded -// length of the decompressed bytes has already been read, and that len(dst) -// equals that length. -// -// It returns 0 on success or a decodeErrCodeXxx error code on failure. -func decode(dst, src []byte) int { - var d, s, offset, length int - for s < len(src) { - switch src[s] & 0x03 { - case tagLiteral: - x := uint32(src[s] >> 2) - switch { - case x < 60: - s++ - case x == 60: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-1]) - case x == 61: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-2]) | uint32(src[s-1])<<8 - case x == 62: - s += 4 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - case x == 63: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - length = int(x) + 1 - if length <= 0 { - return decodeErrCodeUnsupportedLiteralLength - } - if length > len(dst)-d || length > len(src)-s { - return decodeErrCodeCorrupt - } - copy(dst[d:], src[s:s+length]) - d += length - s += length - continue - - case tagCopy1: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 4 + int(src[s-2])>>2&0x7 - offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - - case tagCopy2: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-3])>>2 - offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - - case tagCopy4: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-5])>>2 - offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - } - - if offset <= 0 || d < offset || length > len(dst)-d { - return decodeErrCodeCorrupt - } - // Copy from an earlier sub-slice of dst to a later sub-slice. Unlike - // the built-in copy function, this byte-by-byte copy always runs - // forwards, even if the slices overlap. Conceptually, this is: - // - // d += forwardCopy(dst[d:d+length], dst[d-offset:]) - for end := d + length; d != end; d++ { - dst[d] = dst[d-offset] - } - } - if d != len(dst) { - return decodeErrCodeCorrupt - } - return 0 -} diff --git a/vendor/github.com/golang/snappy/encode.go b/vendor/github.com/golang/snappy/encode.go deleted file mode 100644 index 8d393e9..0000000 --- a/vendor/github.com/golang/snappy/encode.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -// Encode returns the encoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire encoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -func Encode(dst, src []byte) []byte { - if n := MaxEncodedLen(len(src)); n < 0 { - panic(ErrTooLarge) - } else if len(dst) < n { - dst = make([]byte, n) - } - - // The block starts with the varint-encoded length of the decompressed bytes. - d := binary.PutUvarint(dst, uint64(len(src))) - - for len(src) > 0 { - p := src - src = nil - if len(p) > maxBlockSize { - p, src = p[:maxBlockSize], p[maxBlockSize:] - } - if len(p) < minNonLiteralBlockSize { - d += emitLiteral(dst[d:], p) - } else { - d += encodeBlock(dst[d:], p) - } - } - return dst[:d] -} - -// inputMargin is the minimum number of extra input bytes to keep, inside -// encodeBlock's inner loop. On some architectures, this margin lets us -// implement a fast path for emitLiteral, where the copy of short (<= 16 byte) -// literals can be implemented as a single load to and store from a 16-byte -// register. That literal's actual length can be as short as 1 byte, so this -// can copy up to 15 bytes too much, but that's OK as subsequent iterations of -// the encoding loop will fix up the copy overrun, and this inputMargin ensures -// that we don't overrun the dst and src buffers. -const inputMargin = 16 - 1 - -// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that -// could be encoded with a copy tag. This is the minimum with respect to the -// algorithm used by encodeBlock, not a minimum enforced by the file format. -// -// The encoded output must start with at least a 1 byte literal, as there are -// no previous bytes to copy. A minimal (1 byte) copy after that, generated -// from an emitCopy call in encodeBlock's main loop, would require at least -// another inputMargin bytes, for the reason above: we want any emitLiteral -// calls inside encodeBlock's main loop to use the fast path if possible, which -// requires being able to overrun by inputMargin bytes. Thus, -// minNonLiteralBlockSize equals 1 + 1 + inputMargin. -// -// The C++ code doesn't use this exact threshold, but it could, as discussed at -// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion -// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an -// optimization. It should not affect the encoded form. This is tested by -// TestSameEncodingAsCppShortCopies. -const minNonLiteralBlockSize = 1 + 1 + inputMargin - -// MaxEncodedLen returns the maximum length of a snappy block, given its -// uncompressed length. -// -// It will return a negative value if srcLen is too large to encode. -func MaxEncodedLen(srcLen int) int { - n := uint64(srcLen) - if n > 0xffffffff { - return -1 - } - // Compressed data can be defined as: - // compressed := item* literal* - // item := literal* copy - // - // The trailing literal sequence has a space blowup of at most 62/60 - // since a literal of length 60 needs one tag byte + one extra byte - // for length information. - // - // Item blowup is trickier to measure. Suppose the "copy" op copies - // 4 bytes of data. Because of a special check in the encoding code, - // we produce a 4-byte copy only if the offset is < 65536. Therefore - // the copy op takes 3 bytes to encode, and this type of item leads - // to at most the 62/60 blowup for representing literals. - // - // Suppose the "copy" op copies 5 bytes of data. If the offset is big - // enough, it will take 5 bytes to encode the copy op. Therefore the - // worst case here is a one-byte literal followed by a five-byte copy. - // That is, 6 bytes of input turn into 7 bytes of "compressed" data. - // - // This last factor dominates the blowup, so the final estimate is: - n = 32 + n + n/6 - if n > 0xffffffff { - return -1 - } - return int(n) -} - -var errClosed = errors.New("snappy: Writer is closed") - -// NewWriter returns a new Writer that compresses to w. -// -// The Writer returned does not buffer writes. There is no need to Flush or -// Close such a Writer. -// -// Deprecated: the Writer returned is not suitable for many small writes, only -// for few large writes. Use NewBufferedWriter instead, which is efficient -// regardless of the frequency and shape of the writes, and remember to Close -// that Writer when done. -func NewWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - obuf: make([]byte, obufLen), - } -} - -// NewBufferedWriter returns a new Writer that compresses to w, using the -// framing format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -// -// The Writer returned buffers writes. Users must call Close to guarantee all -// data has been forwarded to the underlying io.Writer. They may also call -// Flush zero or more times before calling Close. -func NewBufferedWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - ibuf: make([]byte, 0, maxBlockSize), - obuf: make([]byte, obufLen), - } -} - -// Writer is an io.Writer that can write Snappy-compressed bytes. -type Writer struct { - w io.Writer - err error - - // ibuf is a buffer for the incoming (uncompressed) bytes. - // - // Its use is optional. For backwards compatibility, Writers created by the - // NewWriter function have ibuf == nil, do not buffer incoming bytes, and - // therefore do not need to be Flush'ed or Close'd. - ibuf []byte - - // obuf is a buffer for the outgoing (compressed) bytes. - obuf []byte - - // wroteStreamHeader is whether we have written the stream header. - wroteStreamHeader bool -} - -// Reset discards the writer's state and switches the Snappy writer to write to -// w. This permits reusing a Writer rather than allocating a new one. -func (w *Writer) Reset(writer io.Writer) { - w.w = writer - w.err = nil - if w.ibuf != nil { - w.ibuf = w.ibuf[:0] - } - w.wroteStreamHeader = false -} - -// Write satisfies the io.Writer interface. -func (w *Writer) Write(p []byte) (nRet int, errRet error) { - if w.ibuf == nil { - // Do not buffer incoming bytes. This does not perform or compress well - // if the caller of Writer.Write writes many small slices. This - // behavior is therefore deprecated, but still supported for backwards - // compatibility with code that doesn't explicitly Flush or Close. - return w.write(p) - } - - // The remainder of this method is based on bufio.Writer.Write from the - // standard library. - - for len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil { - var n int - if len(w.ibuf) == 0 { - // Large write, empty buffer. - // Write directly from p to avoid copy. - n, _ = w.write(p) - } else { - n = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - w.Flush() - } - nRet += n - p = p[n:] - } - if w.err != nil { - return nRet, w.err - } - n := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - nRet += n - return nRet, nil -} - -func (w *Writer) write(p []byte) (nRet int, errRet error) { - if w.err != nil { - return 0, w.err - } - for len(p) > 0 { - obufStart := len(magicChunk) - if !w.wroteStreamHeader { - w.wroteStreamHeader = true - copy(w.obuf, magicChunk) - obufStart = 0 - } - - var uncompressed []byte - if len(p) > maxBlockSize { - uncompressed, p = p[:maxBlockSize], p[maxBlockSize:] - } else { - uncompressed, p = p, nil - } - checksum := crc(uncompressed) - - // Compress the buffer, discarding the result if the improvement - // isn't at least 12.5%. - compressed := Encode(w.obuf[obufHeaderLen:], uncompressed) - chunkType := uint8(chunkTypeCompressedData) - chunkLen := 4 + len(compressed) - obufEnd := obufHeaderLen + len(compressed) - if len(compressed) >= len(uncompressed)-len(uncompressed)/8 { - chunkType = chunkTypeUncompressedData - chunkLen = 4 + len(uncompressed) - obufEnd = obufHeaderLen - } - - // Fill in the per-chunk header that comes before the body. - w.obuf[len(magicChunk)+0] = chunkType - w.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0) - w.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8) - w.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16) - w.obuf[len(magicChunk)+4] = uint8(checksum >> 0) - w.obuf[len(magicChunk)+5] = uint8(checksum >> 8) - w.obuf[len(magicChunk)+6] = uint8(checksum >> 16) - w.obuf[len(magicChunk)+7] = uint8(checksum >> 24) - - if _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil { - w.err = err - return nRet, err - } - if chunkType == chunkTypeUncompressedData { - if _, err := w.w.Write(uncompressed); err != nil { - w.err = err - return nRet, err - } - } - nRet += len(uncompressed) - } - return nRet, nil -} - -// Flush flushes the Writer to its underlying io.Writer. -func (w *Writer) Flush() error { - if w.err != nil { - return w.err - } - if len(w.ibuf) == 0 { - return nil - } - w.write(w.ibuf) - w.ibuf = w.ibuf[:0] - return w.err -} - -// Close calls Flush and then closes the Writer. -func (w *Writer) Close() error { - w.Flush() - ret := w.err - if w.err == nil { - w.err = errClosed - } - return ret -} diff --git a/vendor/github.com/golang/snappy/encode_amd64.go b/vendor/github.com/golang/snappy/encode_amd64.go deleted file mode 100644 index 150d91b..0000000 --- a/vendor/github.com/golang/snappy/encode_amd64.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -package snappy - -// emitLiteral has the same semantics as in encode_other.go. -// -//go:noescape -func emitLiteral(dst, lit []byte) int - -// emitCopy has the same semantics as in encode_other.go. -// -//go:noescape -func emitCopy(dst []byte, offset, length int) int - -// extendMatch has the same semantics as in encode_other.go. -// -//go:noescape -func extendMatch(src []byte, i, j int) int - -// encodeBlock has the same semantics as in encode_other.go. -// -//go:noescape -func encodeBlock(dst, src []byte) (d int) diff --git a/vendor/github.com/golang/snappy/encode_amd64.s b/vendor/github.com/golang/snappy/encode_amd64.s deleted file mode 100644 index adfd979..0000000 --- a/vendor/github.com/golang/snappy/encode_amd64.s +++ /dev/null @@ -1,730 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The XXX lines assemble on Go 1.4, 1.5 and 1.7, but not 1.6, due to a -// Go toolchain regression. See https://github.com/golang/go/issues/15426 and -// https://github.com/golang/snappy/issues/29 -// -// As a workaround, the package was built with a known good assembler, and -// those instructions were disassembled by "objdump -d" to yield the -// 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 -// style comments, in AT&T asm syntax. Note that rsp here is a physical -// register, not Go/asm's SP pseudo-register (see https://golang.org/doc/asm). -// The instructions were then encoded as "BYTE $0x.." sequences, which assemble -// fine on Go 1.6. - -// The asm code generally follows the pure Go code in encode_other.go, except -// where marked with a "!!!". - -// ---------------------------------------------------------------------------- - -// func emitLiteral(dst, lit []byte) int -// -// All local variables fit into registers. The register allocation: -// - AX len(lit) -// - BX n -// - DX return value -// - DI &dst[i] -// - R10 &lit[0] -// -// The 24 bytes of stack space is to call runtime·memmove. -// -// The unusual register allocation of local variables, such as R10 for the -// source pointer, matches the allocation used at the call site in encodeBlock, -// which makes it easier to manually inline this function. -TEXT ·emitLiteral(SB), NOSPLIT, $24-56 - MOVQ dst_base+0(FP), DI - MOVQ lit_base+24(FP), R10 - MOVQ lit_len+32(FP), AX - MOVQ AX, DX - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT oneByte - CMPL BX, $256 - JLT twoBytes - -threeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - ADDQ $3, DX - JMP memmove - -twoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - ADDQ $2, DX - JMP memmove - -oneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - ADDQ $1, DX - -memmove: - MOVQ DX, ret+48(FP) - - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - CALL runtime·memmove(SB) - RET - -// ---------------------------------------------------------------------------- - -// func emitCopy(dst []byte, offset, length int) int -// -// All local variables fit into registers. The register allocation: -// - AX length -// - SI &dst[0] -// - DI &dst[i] -// - R11 offset -// -// The unusual register allocation of local variables, such as R11 for the -// offset, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·emitCopy(SB), NOSPLIT, $0-48 - MOVQ dst_base+0(FP), DI - MOVQ DI, SI - MOVQ offset+24(FP), R11 - MOVQ length+32(FP), AX - -loop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT step1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP loop0 - -step1: - // if length > 64 { etc } - CMPL AX, $64 - JLE step2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -step2: - // if length >= 12 || offset >= 2048 { goto step3 } - CMPL AX, $12 - JGE step3 - CMPL R11, $2048 - JGE step3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -step3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func extendMatch(src []byte, i, j int) int -// -// All local variables fit into registers. The register allocation: -// - DX &src[0] -// - SI &src[j] -// - R13 &src[len(src) - 8] -// - R14 &src[len(src)] -// - R15 &src[i] -// -// The unusual register allocation of local variables, such as R15 for a source -// pointer, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·extendMatch(SB), NOSPLIT, $0-48 - MOVQ src_base+0(FP), DX - MOVQ src_len+8(FP), R14 - MOVQ i+24(FP), R15 - MOVQ j+32(FP), SI - ADDQ DX, R14 - ADDQ DX, R15 - ADDQ DX, SI - MOVQ R14, R13 - SUBQ $8, R13 - -cmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA cmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE bsf - ADDQ $8, R15 - ADDQ $8, SI - JMP cmp8 - -bsf: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -cmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE extendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE extendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP cmp1 - -extendMatchEnd: - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func encodeBlock(dst, src []byte) (d int) -// -// All local variables fit into registers, other than "var table". The register -// allocation: -// - AX . . -// - BX . . -// - CX 56 shift (note that amd64 shifts by non-immediates must use CX). -// - DX 64 &src[0], tableSize -// - SI 72 &src[s] -// - DI 80 &dst[d] -// - R9 88 sLimit -// - R10 . &src[nextEmit] -// - R11 96 prevHash, currHash, nextHash, offset -// - R12 104 &src[base], skip -// - R13 . &src[nextS], &src[len(src) - 8] -// - R14 . len(src), bytesBetweenHashLookups, &src[len(src)], x -// - R15 112 candidate -// -// The second column (56, 64, etc) is the stack offset to spill the registers -// when calling other functions. We could pack this slightly tighter, but it's -// simpler to have a dedicated spill map independent of the function called. -// -// "var table [maxTableSize]uint16" takes up 32768 bytes of stack space. An -// extra 56 bytes, to call other functions, and an extra 64 bytes, to spill -// local variables (registers) during calls gives 32768 + 56 + 64 = 32888. -TEXT ·encodeBlock(SB), 0, $32888-56 - MOVQ dst_base+0(FP), DI - MOVQ src_base+24(FP), SI - MOVQ src_len+32(FP), R14 - - // shift, tableSize := uint32(32-8), 1<<8 - MOVQ $24, CX - MOVQ $256, DX - -calcShift: - // for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - // shift-- - // } - CMPQ DX, $16384 - JGE varTable - CMPQ DX, R14 - JGE varTable - SUBQ $1, CX - SHLQ $1, DX - JMP calcShift - -varTable: - // var table [maxTableSize]uint16 - // - // In the asm code, unlike the Go code, we can zero-initialize only the - // first tableSize elements. Each uint16 element is 2 bytes and each MOVOU - // writes 16 bytes, so we can do only tableSize/8 writes instead of the - // 2048 writes that would zero-initialize all of table's 32768 bytes. - SHRQ $3, DX - LEAQ table-32768(SP), BX - PXOR X0, X0 - -memclr: - MOVOU X0, 0(BX) - ADDQ $16, BX - SUBQ $1, DX - JNZ memclr - - // !!! DX = &src[0] - MOVQ SI, DX - - // sLimit := len(src) - inputMargin - MOVQ R14, R9 - SUBQ $15, R9 - - // !!! Pre-emptively spill CX, DX and R9 to the stack. Their values don't - // change for the rest of the function. - MOVQ CX, 56(SP) - MOVQ DX, 64(SP) - MOVQ R9, 88(SP) - - // nextEmit := 0 - MOVQ DX, R10 - - // s := 1 - ADDQ $1, SI - - // nextHash := hash(load32(src, s), shift) - MOVL 0(SI), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - -outer: - // for { etc } - - // skip := 32 - MOVQ $32, R12 - - // nextS := s - MOVQ SI, R13 - - // candidate := 0 - MOVQ $0, R15 - -inner0: - // for { etc } - - // s := nextS - MOVQ R13, SI - - // bytesBetweenHashLookups := skip >> 5 - MOVQ R12, R14 - SHRQ $5, R14 - - // nextS = s + bytesBetweenHashLookups - ADDQ R14, R13 - - // skip += bytesBetweenHashLookups - ADDQ R14, R12 - - // if nextS > sLimit { goto emitRemainder } - MOVQ R13, AX - SUBQ DX, AX - CMPQ AX, R9 - JA emitRemainder - - // candidate = int(table[nextHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[nextHash] = uint16(s) - MOVQ SI, AX - SUBQ DX, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // nextHash = hash(load32(src, nextS), shift) - MOVL 0(R13), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // if load32(src, s) != load32(src, candidate) { continue } break - MOVL 0(SI), AX - MOVL (DX)(R15*1), BX - CMPL AX, BX - JNE inner0 - -fourByteMatch: - // As per the encode_other.go code: - // - // A 4-byte match has been found. We'll later see etc. - - // !!! Jump to a fast path for short (<= 16 byte) literals. See the comment - // on inputMargin in encode.go. - MOVQ SI, AX - SUBQ R10, AX - CMPQ AX, $16 - JLE emitLiteralFastPath - - // ---------------------------------------- - // Begin inline of the emitLiteral call. - // - // d += emitLiteral(dst[d:], src[nextEmit:s]) - - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT inlineEmitLiteralOneByte - CMPL BX, $256 - JLT inlineEmitLiteralTwoBytes - -inlineEmitLiteralThreeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralTwoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralOneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - -inlineEmitLiteralMemmove: - // Spill local variables (registers) onto the stack; call; unspill. - // - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - ADDQ AX, DI // Finish the "d +=" part of "d += emitLiteral(etc)". - MOVQ SI, 72(SP) - MOVQ DI, 80(SP) - MOVQ R15, 112(SP) - CALL runtime·memmove(SB) - MOVQ 56(SP), CX - MOVQ 64(SP), DX - MOVQ 72(SP), SI - MOVQ 80(SP), DI - MOVQ 88(SP), R9 - MOVQ 112(SP), R15 - JMP inner1 - -inlineEmitLiteralEnd: - // End inline of the emitLiteral call. - // ---------------------------------------- - -emitLiteralFastPath: - // !!! Emit the 1-byte encoding "uint8(len(lit)-1)<<2". - MOVB AX, BX - SUBB $1, BX - SHLB $2, BX - MOVB BX, (DI) - ADDQ $1, DI - - // !!! Implement the copy from lit to dst as a 16-byte load and store. - // (Encode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only len(lit) bytes, but that's - // OK. Subsequent iterations will fix up the overrun. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(R10), X0 - MOVOU X0, 0(DI) - ADDQ AX, DI - -inner1: - // for { etc } - - // base := s - MOVQ SI, R12 - - // !!! offset := base - candidate - MOVQ R12, R11 - SUBQ R15, R11 - SUBQ DX, R11 - - // ---------------------------------------- - // Begin inline of the extendMatch call. - // - // s = extendMatch(src, candidate+4, s+4) - - // !!! R14 = &src[len(src)] - MOVQ src_len+32(FP), R14 - ADDQ DX, R14 - - // !!! R13 = &src[len(src) - 8] - MOVQ R14, R13 - SUBQ $8, R13 - - // !!! R15 = &src[candidate + 4] - ADDQ $4, R15 - ADDQ DX, R15 - - // !!! s += 4 - ADDQ $4, SI - -inlineExtendMatchCmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA inlineExtendMatchCmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE inlineExtendMatchBSF - ADDQ $8, R15 - ADDQ $8, SI - JMP inlineExtendMatchCmp8 - -inlineExtendMatchBSF: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - JMP inlineExtendMatchEnd - -inlineExtendMatchCmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE inlineExtendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE inlineExtendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP inlineExtendMatchCmp1 - -inlineExtendMatchEnd: - // End inline of the extendMatch call. - // ---------------------------------------- - - // ---------------------------------------- - // Begin inline of the emitCopy call. - // - // d += emitCopy(dst[d:], base-candidate, s-base) - - // !!! length := s - base - MOVQ SI, AX - SUBQ R12, AX - -inlineEmitCopyLoop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT inlineEmitCopyStep1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP inlineEmitCopyLoop0 - -inlineEmitCopyStep1: - // if length > 64 { etc } - CMPL AX, $64 - JLE inlineEmitCopyStep2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -inlineEmitCopyStep2: - // if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 } - CMPL AX, $12 - JGE inlineEmitCopyStep3 - CMPL R11, $2048 - JGE inlineEmitCopyStep3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - JMP inlineEmitCopyEnd - -inlineEmitCopyStep3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - -inlineEmitCopyEnd: - // End inline of the emitCopy call. - // ---------------------------------------- - - // nextEmit = s - MOVQ SI, R10 - - // if s >= sLimit { goto emitRemainder } - MOVQ SI, AX - SUBQ DX, AX - CMPQ AX, R9 - JAE emitRemainder - - // As per the encode_other.go code: - // - // We could immediately etc. - - // x := load64(src, s-1) - MOVQ -1(SI), R14 - - // prevHash := hash(uint32(x>>0), shift) - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // table[prevHash] = uint16(s-1) - MOVQ SI, AX - SUBQ DX, AX - SUBQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // currHash := hash(uint32(x>>8), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // candidate = int(table[currHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[currHash] = uint16(s) - ADDQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // if uint32(x>>8) == load32(src, candidate) { continue } - MOVL (DX)(R15*1), BX - CMPL R14, BX - JEQ inner1 - - // nextHash = hash(uint32(x>>16), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // s++ - ADDQ $1, SI - - // break out of the inner1 for loop, i.e. continue the outer loop. - JMP outer - -emitRemainder: - // if nextEmit < len(src) { etc } - MOVQ src_len+32(FP), AX - ADDQ DX, AX - CMPQ R10, AX - JEQ encodeBlockEnd - - // d += emitLiteral(dst[d:], src[nextEmit:]) - // - // Push args. - MOVQ DI, 0(SP) - MOVQ $0, 8(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ $0, 16(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ R10, 24(SP) - SUBQ R10, AX - MOVQ AX, 32(SP) - MOVQ AX, 40(SP) // Unnecessary, as the callee ignores it, but conservative. - - // Spill local variables (registers) onto the stack; call; unspill. - MOVQ DI, 80(SP) - CALL ·emitLiteral(SB) - MOVQ 80(SP), DI - - // Finish the "d +=" part of "d += emitLiteral(etc)". - ADDQ 48(SP), DI - -encodeBlockEnd: - MOVQ dst_base+0(FP), AX - SUBQ AX, DI - MOVQ DI, d+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/encode_other.go b/vendor/github.com/golang/snappy/encode_other.go deleted file mode 100644 index dbcae90..0000000 --- a/vendor/github.com/golang/snappy/encode_other.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 appengine !gc noasm - -package snappy - -func load32(b []byte, i int) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load64(b []byte, i int) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | - uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 -} - -// emitLiteral writes a literal chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= len(lit) && len(lit) <= 65536 -func emitLiteral(dst, lit []byte) int { - i, n := 0, uint(len(lit)-1) - switch { - case n < 60: - dst[0] = uint8(n)<<2 | tagLiteral - i = 1 - case n < 1<<8: - dst[0] = 60<<2 | tagLiteral - dst[1] = uint8(n) - i = 2 - default: - dst[0] = 61<<2 | tagLiteral - dst[1] = uint8(n) - dst[2] = uint8(n >> 8) - i = 3 - } - return i + copy(dst[i:], lit) -} - -// emitCopy writes a copy chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= offset && offset <= 65535 -// 4 <= length && length <= 65535 -func emitCopy(dst []byte, offset, length int) int { - i := 0 - // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The - // threshold for this loop is a little higher (at 68 = 64 + 4), and the - // length emitted down below is is a little lower (at 60 = 64 - 4), because - // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed - // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as - // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as - // 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a - // tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an - // encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1. - for length >= 68 { - // Emit a length 64 copy, encoded as 3 bytes. - dst[i+0] = 63<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 64 - } - if length > 64 { - // Emit a length 60 copy, encoded as 3 bytes. - dst[i+0] = 59<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 60 - } - if length >= 12 || offset >= 2048 { - // Emit the remaining copy, encoded as 3 bytes. - dst[i+0] = uint8(length-1)<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - return i + 3 - } - // Emit the remaining copy, encoded as 2 bytes. - dst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1 - dst[i+1] = uint8(offset) - return i + 2 -} - -// extendMatch returns the largest k such that k <= len(src) and that -// src[i:i+k-j] and src[j:k] have the same contents. -// -// It assumes that: -// 0 <= i && i < j && j <= len(src) -func extendMatch(src []byte, i, j int) int { - for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { - } - return j -} - -func hash(u, shift uint32) uint32 { - return (u * 0x1e35a7bd) >> shift -} - -// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It -// assumes that the varint-encoded length of the decompressed bytes has already -// been written. -// -// It also assumes that: -// len(dst) >= MaxEncodedLen(len(src)) && -// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize -func encodeBlock(dst, src []byte) (d int) { - // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. - // The table element type is uint16, as s < sLimit and sLimit < len(src) - // and len(src) <= maxBlockSize and maxBlockSize == 65536. - const ( - maxTableSize = 1 << 14 - // tableMask is redundant, but helps the compiler eliminate bounds - // checks. - tableMask = maxTableSize - 1 - ) - shift := uint32(32 - 8) - for tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - shift-- - } - // In Go, all array elements are zero-initialized, so there is no advantage - // to a smaller tableSize per se. However, it matches the C++ algorithm, - // and in the asm versions of this code, we can get away with zeroing only - // the first tableSize elements. - var table [maxTableSize]uint16 - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := len(src) - inputMargin - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := 0 - - // The encoded form must start with a literal, as there are no previous - // bytes to copy, so we start looking for hash matches at s == 1. - s := 1 - nextHash := hash(load32(src, s), shift) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := 32 - - nextS := s - candidate := 0 - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = int(table[nextHash&tableMask]) - table[nextHash&tableMask] = uint16(s) - nextHash = hash(load32(src, nextS), shift) - if load32(src, s) == load32(src, candidate) { - break - } - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - d += emitLiteral(dst[d:], src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - base := s - - // Extend the 4-byte match as long as possible. - // - // This is an inlined version of: - // s = extendMatch(src, candidate+4, s+4) - s += 4 - for i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 { - } - - d += emitCopy(dst[d:], base-candidate, s-base) - nextEmit = s - if s >= sLimit { - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load64(src, s-1) - prevHash := hash(uint32(x>>0), shift) - table[prevHash&tableMask] = uint16(s - 1) - currHash := hash(uint32(x>>8), shift) - candidate = int(table[currHash&tableMask]) - table[currHash&tableMask] = uint16(s) - if uint32(x>>8) != load32(src, candidate) { - nextHash = hash(uint32(x>>16), shift) - s++ - break - } - } - } - -emitRemainder: - if nextEmit < len(src) { - d += emitLiteral(dst[d:], src[nextEmit:]) - } - return d -} diff --git a/vendor/github.com/golang/snappy/snappy.go b/vendor/github.com/golang/snappy/snappy.go deleted file mode 100644 index ece692e..0000000 --- a/vendor/github.com/golang/snappy/snappy.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package snappy implements the Snappy compression format. It aims for very -// high speeds and reasonable compression. -// -// There are actually two Snappy formats: block and stream. They are related, -// but different: trying to decompress block-compressed data as a Snappy stream -// will fail, and vice versa. The block format is the Decode and Encode -// functions and the stream format is the Reader and Writer types. -// -// The block format, the more common case, is used when the complete size (the -// number of bytes) of the original data is known upfront, at the time -// compression starts. The stream format, also known as the framing format, is -// for when that isn't always true. -// -// The canonical, C++ implementation is at https://github.com/google/snappy and -// it only implements the block format. -package snappy // import "github.com/golang/snappy" - -import ( - "hash/crc32" -) - -/* -Each encoded block begins with the varint-encoded length of the decoded data, -followed by a sequence of chunks. Chunks begin and end on byte boundaries. The -first byte of each chunk is broken into its 2 least and 6 most significant bits -called l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag. -Zero means a literal tag. All other values mean a copy tag. - -For literal tags: - - If m < 60, the next 1 + m bytes are literal bytes. - - Otherwise, let n be the little-endian unsigned integer denoted by the next - m - 59 bytes. The next 1 + n bytes after that are literal bytes. - -For copy tags, length bytes are copied from offset bytes ago, in the style of -Lempel-Ziv compression algorithms. In particular: - - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12). - The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10 - of the offset. The next byte is bits 0-7 of the offset. - - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65). - The length is 1 + m. The offset is the little-endian unsigned integer - denoted by the next 2 bytes. - - For l == 3, this tag is a legacy format that is no longer issued by most - encoders. Nonetheless, the offset ranges in [0, 1<<32) and the length in - [1, 65). The length is 1 + m. The offset is the little-endian unsigned - integer denoted by the next 4 bytes. -*/ -const ( - tagLiteral = 0x00 - tagCopy1 = 0x01 - tagCopy2 = 0x02 - tagCopy4 = 0x03 -) - -const ( - checksumSize = 4 - chunkHeaderSize = 4 - magicChunk = "\xff\x06\x00\x00" + magicBody - magicBody = "sNaPpY" - - // maxBlockSize is the maximum size of the input to encodeBlock. It is not - // part of the wire format per se, but some parts of the encoder assume - // that an offset fits into a uint16. - // - // Also, for the framing format (Writer type instead of Encode function), - // https://github.com/google/snappy/blob/master/framing_format.txt says - // that "the uncompressed data in a chunk must be no longer than 65536 - // bytes". - maxBlockSize = 65536 - - // maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is - // hard coded to be a const instead of a variable, so that obufLen can also - // be a const. Their equivalence is confirmed by - // TestMaxEncodedLenOfMaxBlockSize. - maxEncodedLenOfMaxBlockSize = 76490 - - obufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize - obufLen = obufHeaderLen + maxEncodedLenOfMaxBlockSize -) - -const ( - chunkTypeCompressedData = 0x00 - chunkTypeUncompressedData = 0x01 - chunkTypePadding = 0xfe - chunkTypeStreamIdentifier = 0xff -) - -var crcTable = crc32.MakeTable(crc32.Castagnoli) - -// crc implements the checksum specified in section 3 of -// https://github.com/google/snappy/blob/master/framing_format.txt -func crc(b []byte) uint32 { - c := crc32.Update(0, crcTable, b) - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/google/uuid/.travis.yml b/vendor/github.com/google/uuid/.travis.yml deleted file mode 100644 index d8156a6..0000000 --- a/vendor/github.com/google/uuid/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go - -go: - - 1.4.3 - - 1.5.3 - - tip - -script: - - go test -v ./... diff --git a/vendor/github.com/google/uuid/CHANGELOG.md b/vendor/github.com/google/uuid/CHANGELOG.md new file mode 100644 index 0000000..2bd7866 --- /dev/null +++ b/vendor/github.com/google/uuid/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18) + + +### Bug Fixes + +* Use .EqualFold() to parse urn prefixed UUIDs ([#118](https://github.com/google/uuid/issues/118)) ([574e687](https://github.com/google/uuid/commit/574e6874943741fb99d41764c705173ada5293f0)) + +## Changelog diff --git a/vendor/github.com/google/uuid/CONTRIBUTING.md b/vendor/github.com/google/uuid/CONTRIBUTING.md index 04fdf09..5566888 100644 --- a/vendor/github.com/google/uuid/CONTRIBUTING.md +++ b/vendor/github.com/google/uuid/CONTRIBUTING.md @@ -2,6 +2,22 @@ We definitely welcome patches and contribution to this project! +### Tips + +Commits must be formatted according to the [Conventional Commits Specification](https://www.conventionalcommits.org). + +Always try to include a test case! If it is not possible or not necessary, +please explain why in the pull request description. + +### Releasing + +Commits that would precipitate a SemVer change, as desrcibed in the Conventional +Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action) +to create a release candidate pull request. Once submitted, `release-please` +will create a release. + +For tips on how to work with `release-please`, see its documentation. + ### Legal requirements In order to protect both you and ourselves, you will need to sign the diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md index f765a46..3e9a618 100644 --- a/vendor/github.com/google/uuid/README.md +++ b/vendor/github.com/google/uuid/README.md @@ -1,6 +1,6 @@ -# uuid ![build status](https://travis-ci.org/google/uuid.svg?branch=master) +# uuid The uuid package generates and inspects UUIDs based on -[RFC 4122](http://tools.ietf.org/html/rfc4122) +[RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122) and DCE 1.1: Authentication and Security Services. This package is based on the github.com/pborman/uuid package (previously named @@ -9,10 +9,12 @@ a UUID is a 16 byte array rather than a byte slice. One loss due to this change is the ability to represent an invalid UUID (vs a NIL UUID). ###### Install -`go get github.com/google/uuid` +```sh +go get github.com/google/uuid +``` ###### Documentation -[![GoDoc](https://godoc.org/github.com/google/uuid?status.svg)](http://godoc.org/github.com/google/uuid) +[![Go Reference](https://pkg.go.dev/badge/github.com/google/uuid.svg)](https://pkg.go.dev/github.com/google/uuid) Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go index 24b78ed..b2a0bc8 100644 --- a/vendor/github.com/google/uuid/node_js.go +++ b/vendor/github.com/google/uuid/node_js.go @@ -7,6 +7,6 @@ package uuid // getHardwareInterface returns nil values for the JS version of the code. -// This remvoves the "net" dependency, because it is not used in the browser. +// This removes the "net" dependency, because it is not used in the browser. // Using the "net" library inflates the size of the transpiled JS code by 673k bytes. func getHardwareInterface(name string) (string, []byte) { return "", nil } diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index a57207a..a56138c 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -69,7 +69,7 @@ func Parse(s string) (UUID, error) { // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx case 36 + 9: - if strings.ToLower(s[:9]) != "urn:uuid:" { + if !strings.EqualFold(s[:9], "urn:uuid:") { return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) } s = s[9:] @@ -101,7 +101,8 @@ func Parse(s string) (UUID, error) { 9, 11, 14, 16, 19, 21, - 24, 26, 28, 30, 32, 34} { + 24, 26, 28, 30, 32, 34, + } { v, ok := xtob(s[x], s[x+1]) if !ok { return uuid, errors.New("invalid UUID format") @@ -117,7 +118,7 @@ func ParseBytes(b []byte) (UUID, error) { switch len(b) { case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { + if !bytes.EqualFold(b[:9], []byte("urn:uuid:")) { return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) } b = b[9:] @@ -145,7 +146,8 @@ func ParseBytes(b []byte) (UUID, error) { 9, 11, 14, 16, 19, 21, - 24, 26, 28, 30, 32, 34} { + 24, 26, 28, 30, 32, 34, + } { v, ok := xtob(b[x], b[x+1]) if !ok { return uuid, errors.New("invalid UUID format") diff --git a/vendor/github.com/imdario/mergo/.deepsource.toml b/vendor/github.com/imdario/mergo/.deepsource.toml new file mode 100644 index 0000000..8a0681a --- /dev/null +++ b/vendor/github.com/imdario/mergo/.deepsource.toml @@ -0,0 +1,12 @@ +version = 1 + +test_patterns = [ + "*_test.go" +] + +[[analyzers]] +name = "go" +enabled = true + + [analyzers.meta] + import_path = "github.com/imdario/mergo" \ No newline at end of file diff --git a/vendor/github.com/imdario/mergo/.travis.yml b/vendor/github.com/imdario/mergo/.travis.yml index b13a50e..dad2972 100644 --- a/vendor/github.com/imdario/mergo/.travis.yml +++ b/vendor/github.com/imdario/mergo/.travis.yml @@ -4,4 +4,6 @@ install: - go get golang.org/x/tools/cmd/cover - go get github.com/mattn/goveralls script: + - go test -race -v ./... +after_script: - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index d1cefa8..876abb5 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -1,43 +1,54 @@ # Mergo -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. - -## Status - -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). [![GoDoc][3]][4] -[![GoCard][5]][6] +[![GitHub release][5]][6] +[![GoCard][7]][8] [![Build Status][1]][2] -[![Coverage Status][7]][8] -[![Sourcegraph][9]][10] +[![Coverage Status][9]][10] +[![Sourcegraph][11]][12] +[![FOSSA Status][13]][14] + +[![GoCenter Kudos][15]][16] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo [3]: https://godoc.org/github.com/imdario/mergo?status.svg [4]: https://godoc.org/github.com/imdario/mergo -[5]: https://goreportcard.com/badge/imdario/mergo -[6]: https://goreportcard.com/report/github.com/imdario/mergo -[7]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master -[8]: https://coveralls.io/github/imdario/mergo?branch=master -[9]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg -[10]: https://sourcegraph.com/github.com/imdario/mergo?badge +[5]: https://img.shields.io/github/release/imdario/mergo.svg +[6]: https://github.com/imdario/mergo/releases +[7]: https://goreportcard.com/badge/imdario/mergo +[8]: https://goreportcard.com/report/github.com/imdario/mergo +[9]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master +[10]: https://coveralls.io/github/imdario/mergo?branch=master +[11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg +[12]: https://sourcegraph.com/github.com/imdario/mergo?badge +[13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield +[14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield +[15]: https://search.gocenter.io/api/ui/badge/github.com%2Fimdario%2Fmergo +[16]: https://search.gocenter.io/github.com/imdario/mergo + +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. + +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). -### Latest release +Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. + +## Status -[Release v0.3.4](https://github.com/imdario/mergo/releases/tag/v0.3.4). +It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). ### Important note -Please keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2) Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). An optional/variadic argument has been added, so it won't break existing code. +Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds suppot for go modules. + +Keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code. -If you were using Mergo **before** April 6th 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause (I hope it won't!) in existing projects after the change (release 0.2.0). +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). ### Donations -If Mergo is useful to you, consider buying me a coffee, a beer or making a monthly donation so I can keep building great free software. :heart_eyes: +If Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes: Buy Me a Coffee at ko-fi.com [![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) @@ -86,8 +97,9 @@ If Mergo is useful to you, consider buying me a coffee, a beer or making a month - [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) - [jnuthong/item_search](https://github.com/jnuthong/item_search) - [bukalapak/snowboard](https://github.com/bukalapak/snowboard) +- [janoszen/containerssh](https://github.com/janoszen/containerssh) -## Installation +## Install go get github.com/imdario/mergo @@ -98,7 +110,7 @@ If Mergo is useful to you, consider buying me a coffee, a beer or making a month ## Usage -You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are not considered zero values](https://golang.org/ref/spec#The_zero_value) either. Also maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are zero values](https://golang.org/ref/spec#The_zero_value) too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). ```go if err := mergo.Merge(&dst, src); err != nil { @@ -124,9 +136,7 @@ if err := mergo.Map(&dst, srcMap); err != nil { Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. -More information and examples in [godoc documentation](http://godoc.org/github.com/imdario/mergo). - -### Nice example +Here is a nice example: ```go package main @@ -174,10 +184,10 @@ import ( "time" ) -type timeTransfomer struct { +type timeTransformer struct { } -func (t timeTransfomer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { +func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { if typ == reflect.TypeOf(time.Time{}) { return func(dst, src reflect.Value) error { if dst.CanSet() { @@ -201,7 +211,7 @@ type Snapshot struct { func main() { src := Snapshot{time.Now()} dest := Snapshot{} - mergo.Merge(&dest, src, mergo.WithTransformers(timeTransfomer{})) + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) fmt.Println(dest) // Will print // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } @@ -217,6 +227,21 @@ If I can help you, you have an idea or you are using Mergo in your projects, don Written by [Dario Castañé](http://dario.im). +## Top Contributors + +[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) +[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) +[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) +[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) +[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) +[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) +[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) +[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) + + ## License [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). + + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large) diff --git a/vendor/github.com/imdario/mergo/doc.go b/vendor/github.com/imdario/mergo/doc.go index 6e9aa7b..fcd985f 100644 --- a/vendor/github.com/imdario/mergo/doc.go +++ b/vendor/github.com/imdario/mergo/doc.go @@ -4,41 +4,140 @@ // license that can be found in the LICENSE file. /* -Package mergo merges same-type structs and maps by setting default values in zero-value fields. +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. -Mergo won't merge unexported (private) fields but will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Status + +It is ready for production use. It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc. + +Important note + +Please keep in mind that a problematic PR broke 0.3.9. We reverted it in 0.3.10. We consider 0.3.10 as stable but not bug-free. . Also, this version adds suppot for go modules. + +Keep in mind that in 0.3.2, Mergo changed Merge() and Map() signatures to support transformers. We added an optional/variadic argument so that it won't break the existing code. + +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with go get -u github.com/imdario/mergo. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). + +Install + +Do your usual installation procedure: + + go get github.com/imdario/mergo + + // use in your .go code + import ( + "github.com/imdario/mergo" + ) Usage -From my own work-in-progress project: +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as they are zero values too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). + + if err := mergo.Merge(&dst, src); err != nil { + // ... + } + +Also, you can merge overwriting values using the transformer WithOverride. + + if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { + // ... + } + +Additionally, you can map a map[string]interface{} to a struct (and otherwise, from struct to map), following the same restrictions as in Merge(). Keys are capitalized to find each corresponding exported field. + + if err := mergo.Map(&dst, srcMap); err != nil { + // ... + } + +Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as map[string]interface{}. They will be just assigned as values. + +Here is a nice example: + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + ) - type networkConfig struct { - Protocol string - Address string - ServerType string `json: "server_type"` - Port uint16 + type Foo struct { + A string + B int64 } - type FssnConfig struct { - Network networkConfig + func main() { + src := Foo{ + A: "one", + B: 2, + } + dest := Foo{ + A: "two", + } + mergo.Merge(&dest, src) + fmt.Println(dest) + // Will print + // {two 2} } - var fssnDefault = FssnConfig { - networkConfig { - "tcp", - "127.0.0.1", - "http", - 31560, - }, +Transformers + +Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, time.Time is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero time.Time? + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + "reflect" + "time" + ) + + type timeTransformer struct { } - // Inside a function [...] + func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { + if typ == reflect.TypeOf(time.Time{}) { + return func(dst, src reflect.Value) error { + if dst.CanSet() { + isZero := dst.MethodByName("IsZero") + result := isZero.Call([]reflect.Value{}) + if result[0].Bool() { + dst.Set(src) + } + } + return nil + } + } + return nil + } + + type Snapshot struct { + Time time.Time + // ... + } - if err := mergo.Merge(&config, fssnDefault); err != nil { - log.Fatal(err) + func main() { + src := Snapshot{time.Now()} + dest := Snapshot{} + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) + fmt.Println(dest) + // Will print + // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } } - // More code [...] +Contact me + +If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): https://twitter.com/im_dario + +About + +Written by Dario Castañé: https://da.rio.hn + +License + +BSD 3-Clause license, as Go language. */ package mergo diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go index 6ea38e6..a13a7ee 100644 --- a/vendor/github.com/imdario/mergo/map.go +++ b/vendor/github.com/imdario/mergo/map.go @@ -72,6 +72,7 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf case reflect.Struct: srcMap := src.Interface().(map[string]interface{}) for key := range srcMap { + config.overwriteWithEmptyValue = true srcValue := srcMap[key] fieldName := changeInitialCase(key, unicode.ToUpper) dstElement := dst.FieldByName(fieldName) @@ -140,6 +141,9 @@ func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { } func _map(dst, src interface{}, opts ...func(*Config)) error { + if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { + return ErrNonPointerAgument + } var ( vDst, vSrc reflect.Value err error diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 706b220..afa84a1 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -9,25 +9,43 @@ package mergo import ( + "fmt" "reflect" ) -func hasExportedField(dst reflect.Value) (exported bool) { +func hasMergeableFields(dst reflect.Value) (exported bool) { for i, n := 0, dst.NumField(); i < n; i++ { field := dst.Type().Field(i) if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { - exported = exported || hasExportedField(dst.Field(i)) - } else { + exported = exported || hasMergeableFields(dst.Field(i)) + } else if isExportedComponent(&field) { exported = exported || len(field.PkgPath) == 0 } } return } +func isExportedComponent(field *reflect.StructField) bool { + pkgPath := field.PkgPath + if len(pkgPath) > 0 { + return false + } + c := field.Name[0] + if 'a' <= c && c <= 'z' || c == '_' { + return false + } + return true +} + type Config struct { - Overwrite bool - AppendSlice bool - Transformers Transformers + Overwrite bool + AppendSlice bool + TypeCheck bool + Transformers Transformers + overwriteWithEmptyValue bool + overwriteSliceWithEmptyValue bool + sliceDeepCopy bool + debug bool } type Transformers interface { @@ -39,6 +57,10 @@ type Transformers interface { // short circuiting on recursive types. func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { overwrite := config.Overwrite + typeCheck := config.TypeCheck + overwriteWithEmptySrc := config.overwriteWithEmptyValue + overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue + sliceDeepCopy := config.sliceDeepCopy if !src.IsValid() { return @@ -66,14 +88,14 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co switch dst.Kind() { case reflect.Struct: - if hasExportedField(dst) { + if hasMergeableFields(dst) { for i, n := 0, dst.NumField(); i < n; i++ { if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { return } } } else { - if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { + if (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { dst.Set(src) } } @@ -81,6 +103,14 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if dst.IsNil() && !src.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } + + if src.Kind() != reflect.Map { + if overwrite { + dst.Set(src) + } + return + } + for _, key := range src.MapKeys() { srcElement := src.MapIndex(key) if !srcElement.IsValid() { @@ -90,6 +120,9 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co switch srcElement.Kind() { case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: if srcElement.IsNil() { + if overwrite { + dst.SetMapIndex(key, srcElement) + } continue } fallthrough @@ -124,19 +157,43 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dstSlice = reflect.ValueOf(dstElement.Interface()) } - if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if typeCheck && srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } dstSlice = srcSlice } else if config.AppendSlice { + if srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot append two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } dstSlice = reflect.AppendSlice(dstSlice, srcSlice) + } else if sliceDeepCopy { + i := 0 + for ; i < srcSlice.Len() && i < dstSlice.Len(); i++ { + srcElement := srcSlice.Index(i) + dstElement := dstSlice.Index(i) + + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } + } dst.SetMapIndex(key, dstSlice) } } - if dstElement.IsValid() && reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map { + if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { continue } - if srcElement.IsValid() && (overwrite || (!dstElement.IsValid() || isEmptyValue(dstElement))) { + if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement)) { if dst.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } @@ -147,19 +204,41 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if !dst.CanSet() { break } - if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { dst.Set(src) } else if config.AppendSlice { + if src.Type() != dst.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) + } dst.Set(reflect.AppendSlice(dst, src)) + } else if sliceDeepCopy { + for i := 0; i < src.Len() && i < dst.Len(); i++ { + srcElement := src.Index(i) + dstElement := dst.Index(i) + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } } case reflect.Ptr: fallthrough case reflect.Interface: - if src.IsNil() { + if isReflectNil(src) { + if overwriteWithEmptySrc && dst.CanSet() && src.Type().AssignableTo(dst.Type()) { + dst.Set(src) + } break } + if src.Kind() != reflect.Interface { - if dst.IsNil() || overwrite { + if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { if dst.CanSet() && (overwrite || isEmptyValue(dst)) { dst.Set(src) } @@ -176,18 +255,31 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } break } + if dst.IsNil() || overwrite { if dst.CanSet() && (overwrite || isEmptyValue(dst)) { dst.Set(src) } - } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return + break + } + + if dst.Elem().Kind() == src.Elem().Kind() { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + break } default: - if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) + mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) + if mustSet { + if dst.CanSet() { + dst.Set(src) + } else { + dst = src + } } } + return } @@ -199,7 +291,7 @@ func Merge(dst, src interface{}, opts ...func(*Config)) error { return merge(dst, src, opts...) } -// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overriden by +// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overridden by // non-empty src attribute values. // Deprecated: use Merge(…) with WithOverride func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { @@ -218,12 +310,37 @@ func WithOverride(config *Config) { config.Overwrite = true } -// WithAppendSlice will make merge append slices instead of overwriting it +// WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values. +func WithOverwriteWithEmptyValue(config *Config) { + config.Overwrite = true + config.overwriteWithEmptyValue = true +} + +// WithOverrideEmptySlice will make merge override empty dst slice with empty src slice. +func WithOverrideEmptySlice(config *Config) { + config.overwriteSliceWithEmptyValue = true +} + +// WithAppendSlice will make merge append slices instead of overwriting it. func WithAppendSlice(config *Config) { config.AppendSlice = true } +// WithTypeCheck will make merge check types while overwriting it (must be used with WithOverride). +func WithTypeCheck(config *Config) { + config.TypeCheck = true +} + +// WithSliceDeepCopy will merge slice element one by one with Overwrite flag. +func WithSliceDeepCopy(config *Config) { + config.sliceDeepCopy = true + config.Overwrite = true +} + func merge(dst, src interface{}, opts ...func(*Config)) error { + if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { + return ErrNonPointerAgument + } var ( vDst, vSrc reflect.Value err error @@ -243,3 +360,16 @@ func merge(dst, src interface{}, opts ...func(*Config)) error { } return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } + +// IsReflectNil is the reflect value provided nil +func isReflectNil(v reflect.Value) bool { + k := v.Kind() + switch k { + case reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr: + // Both interface and slice are nil if first word is 0. + // Both are always bigger than a word; assume flagIndir. + return v.IsNil() + default: + return false + } +} diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go index a82fea2..3cc926c 100644 --- a/vendor/github.com/imdario/mergo/mergo.go +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -20,6 +20,7 @@ var ( ErrNotSupported = errors.New("only structs and maps are supported") ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") + ErrNonPointerAgument = errors.New("dst must be a pointer") ) // During deepMerge, must keep track of checks that are @@ -75,23 +76,3 @@ func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { } return } - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deeper(dst, src reflect.Value, visited map[uintptr]*visit, depth int) (err error) { - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - return // TODO refactor -} diff --git a/vendor/github.com/juju/errors/LICENSE b/vendor/github.com/juju/errors/LICENSE deleted file mode 100644 index ade9307..0000000 --- a/vendor/github.com/juju/errors/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -All files in this repository are licensed as follows. If you contribute -to this repository, it is assumed that you license your contribution -under the same license unless you state otherwise. - -All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. - -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/github.com/juju/errors/Makefile b/vendor/github.com/juju/errors/Makefile deleted file mode 100644 index ab7c2e6..0000000 --- a/vendor/github.com/juju/errors/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -default: check - -check: - go test && go test -compiler gccgo - -docs: - godoc2md github.com/juju/errors > README.md - sed -i 's|\[godoc-link-here\]|[![GoDoc](https://godoc.org/github.com/juju/errors?status.svg)](https://godoc.org/github.com/juju/errors)|' README.md - - -.PHONY: default check docs diff --git a/vendor/github.com/juju/errors/README.md b/vendor/github.com/juju/errors/README.md deleted file mode 100644 index 782a6f4..0000000 --- a/vendor/github.com/juju/errors/README.md +++ /dev/null @@ -1,543 +0,0 @@ - -# errors - import "github.com/juju/errors" - -[![GoDoc](https://godoc.org/github.com/juju/errors?status.svg)](https://godoc.org/github.com/juju/errors) - -The juju/errors provides an easy way to annotate errors without losing the -orginal error context. - -The exported `New` and `Errorf` functions are designed to replace the -`errors.New` and `fmt.Errorf` functions respectively. The same underlying -error is there, but the package also records the location at which the error -was created. - -A primary use case for this library is to add extra context any time an -error is returned from a function. - - - if err := SomeFunc(); err != nil { - return err - } - -This instead becomes: - - - if err := SomeFunc(); err != nil { - return errors.Trace(err) - } - -which just records the file and line number of the Trace call, or - - - if err := SomeFunc(); err != nil { - return errors.Annotate(err, "more context") - } - -which also adds an annotation to the error. - -When you want to check to see if an error is of a particular type, a helper -function is normally exported by the package that returned the error, like the -`os` package does. The underlying cause of the error is available using the -`Cause` function. - - - os.IsNotExist(errors.Cause(err)) - -The result of the `Error()` call on an annotated error is the annotations joined -with colons, then the result of the `Error()` method for the underlying error -that was the cause. - - - err := errors.Errorf("original") - err = errors.Annotatef(err, "context") - err = errors.Annotatef(err, "more context") - err.Error() -> "more context: context: original" - -Obviously recording the file, line and functions is not very useful if you -cannot get them back out again. - - - errors.ErrorStack(err) - -will return something like: - - - first error - github.com/juju/errors/annotation_test.go:193: - github.com/juju/errors/annotation_test.go:194: annotation - github.com/juju/errors/annotation_test.go:195: - github.com/juju/errors/annotation_test.go:196: more context - github.com/juju/errors/annotation_test.go:197: - -The first error was generated by an external system, so there was no location -associated. The second, fourth, and last lines were generated with Trace calls, -and the other two through Annotate. - -Sometimes when responding to an error you want to return a more specific error -for the situation. - - - if err := FindField(field); err != nil { - return errors.Wrap(err, errors.NotFoundf(field)) - } - -This returns an error where the complete error stack is still available, and -`errors.Cause()` will return the `NotFound` error. - - - - - - -## func AlreadyExistsf -``` go -func AlreadyExistsf(format string, args ...interface{}) error -``` -AlreadyExistsf returns an error which satisfies IsAlreadyExists(). - - -## func Annotate -``` go -func Annotate(other error, message string) error -``` -Annotate is used to add extra context to an existing error. The location of -the Annotate call is recorded with the annotations. The file, line and -function are also recorded. - -For example: - - - if err := SomeFunc(); err != nil { - return errors.Annotate(err, "failed to frombulate") - } - - -## func Annotatef -``` go -func Annotatef(other error, format string, args ...interface{}) error -``` -Annotatef is used to add extra context to an existing error. The location of -the Annotate call is recorded with the annotations. The file, line and -function are also recorded. - -For example: - - - if err := SomeFunc(); err != nil { - return errors.Annotatef(err, "failed to frombulate the %s", arg) - } - - -## func Cause -``` go -func Cause(err error) error -``` -Cause returns the cause of the given error. This will be either the -original error, or the result of a Wrap or Mask call. - -Cause is the usual way to diagnose errors that may have been wrapped by -the other errors functions. - - -## func DeferredAnnotatef -``` go -func DeferredAnnotatef(err *error, format string, args ...interface{}) -``` -DeferredAnnotatef annotates the given error (when it is not nil) with the given -format string and arguments (like fmt.Sprintf). If *err is nil, DeferredAnnotatef -does nothing. This method is used in a defer statement in order to annotate any -resulting error with the same message. - -For example: - - - defer DeferredAnnotatef(&err, "failed to frombulate the %s", arg) - - -## func Details -``` go -func Details(err error) string -``` -Details returns information about the stack of errors wrapped by err, in -the format: - - - [{filename:99: error one} {otherfile:55: cause of error one}] - -This is a terse alternative to ErrorStack as it returns a single line. - - -## func ErrorStack -``` go -func ErrorStack(err error) string -``` -ErrorStack returns a string representation of the annotated error. If the -error passed as the parameter is not an annotated error, the result is -simply the result of the Error() method on that error. - -If the error is an annotated error, a multi-line string is returned where -each line represents one entry in the annotation stack. The full filename -from the call stack is used in the output. - - - first error - github.com/juju/errors/annotation_test.go:193: - github.com/juju/errors/annotation_test.go:194: annotation - github.com/juju/errors/annotation_test.go:195: - github.com/juju/errors/annotation_test.go:196: more context - github.com/juju/errors/annotation_test.go:197: - - -## func Errorf -``` go -func Errorf(format string, args ...interface{}) error -``` -Errorf creates a new annotated error and records the location that the -error is created. This should be a drop in replacement for fmt.Errorf. - -For example: - - - return errors.Errorf("validation failed: %s", message) - - -## func IsAlreadyExists -``` go -func IsAlreadyExists(err error) bool -``` -IsAlreadyExists reports whether the error was created with -AlreadyExistsf() or NewAlreadyExists(). - - -## func IsNotFound -``` go -func IsNotFound(err error) bool -``` -IsNotFound reports whether err was created with NotFoundf() or -NewNotFound(). - - -## func IsNotImplemented -``` go -func IsNotImplemented(err error) bool -``` -IsNotImplemented reports whether err was created with -NotImplementedf() or NewNotImplemented(). - - -## func IsNotSupported -``` go -func IsNotSupported(err error) bool -``` -IsNotSupported reports whether the error was created with -NotSupportedf() or NewNotSupported(). - - -## func IsNotValid -``` go -func IsNotValid(err error) bool -``` -IsNotValid reports whether the error was created with NotValidf() or -NewNotValid(). - - -## func IsUnauthorized -``` go -func IsUnauthorized(err error) bool -``` -IsUnauthorized reports whether err was created with Unauthorizedf() or -NewUnauthorized(). - - -## func Mask -``` go -func Mask(other error) error -``` -Mask hides the underlying error type, and records the location of the masking. - - -## func Maskf -``` go -func Maskf(other error, format string, args ...interface{}) error -``` -Mask masks the given error with the given format string and arguments (like -fmt.Sprintf), returning a new error that maintains the error stack, but -hides the underlying error type. The error string still contains the full -annotations. If you want to hide the annotations, call Wrap. - - -## func New -``` go -func New(message string) error -``` -New is a drop in replacement for the standard libary errors module that records -the location that the error is created. - -For example: - - - return errors.New("validation failed") - - -## func NewAlreadyExists -``` go -func NewAlreadyExists(err error, msg string) error -``` -NewAlreadyExists returns an error which wraps err and satisfies -IsAlreadyExists(). - - -## func NewNotFound -``` go -func NewNotFound(err error, msg string) error -``` -NewNotFound returns an error which wraps err that satisfies -IsNotFound(). - - -## func NewNotImplemented -``` go -func NewNotImplemented(err error, msg string) error -``` -NewNotImplemented returns an error which wraps err and satisfies -IsNotImplemented(). - - -## func NewNotSupported -``` go -func NewNotSupported(err error, msg string) error -``` -NewNotSupported returns an error which wraps err and satisfies -IsNotSupported(). - - -## func NewNotValid -``` go -func NewNotValid(err error, msg string) error -``` -NewNotValid returns an error which wraps err and satisfies IsNotValid(). - - -## func NewUnauthorized -``` go -func NewUnauthorized(err error, msg string) error -``` -NewUnauthorized returns an error which wraps err and satisfies -IsUnauthorized(). - - -## func NotFoundf -``` go -func NotFoundf(format string, args ...interface{}) error -``` -NotFoundf returns an error which satisfies IsNotFound(). - - -## func NotImplementedf -``` go -func NotImplementedf(format string, args ...interface{}) error -``` -NotImplementedf returns an error which satisfies IsNotImplemented(). - - -## func NotSupportedf -``` go -func NotSupportedf(format string, args ...interface{}) error -``` -NotSupportedf returns an error which satisfies IsNotSupported(). - - -## func NotValidf -``` go -func NotValidf(format string, args ...interface{}) error -``` -NotValidf returns an error which satisfies IsNotValid(). - - -## func Trace -``` go -func Trace(other error) error -``` -Trace adds the location of the Trace call to the stack. The Cause of the -resulting error is the same as the error parameter. If the other error is -nil, the result will be nil. - -For example: - - - if err := SomeFunc(); err != nil { - return errors.Trace(err) - } - - -## func Unauthorizedf -``` go -func Unauthorizedf(format string, args ...interface{}) error -``` -Unauthorizedf returns an error which satisfies IsUnauthorized(). - - -## func Forbiddenf -``` go -func Forbiddenf(format string, args ...interface{}) error -``` -Forbiddenf returns an error which satisfies IsForbidden(). - - -## func Wrap -``` go -func Wrap(other, newDescriptive error) error -``` -Wrap changes the Cause of the error. The location of the Wrap call is also -stored in the error stack. - -For example: - - - if err := SomeFunc(); err != nil { - newErr := &packageError{"more context", private_value} - return errors.Wrap(err, newErr) - } - - -## func Wrapf -``` go -func Wrapf(other, newDescriptive error, format string, args ...interface{}) error -``` -Wrapf changes the Cause of the error, and adds an annotation. The location -of the Wrap call is also stored in the error stack. - -For example: - - - if err := SomeFunc(); err != nil { - return errors.Wrapf(err, simpleErrorType, "invalid value %q", value) - } - - - -## type Err -``` go -type Err struct { - // contains filtered or unexported fields -} -``` -Err holds a description of an error along with information about -where the error was created. - -It may be embedded in custom error types to add extra information that -this errors package can understand. - - - - - - - - - -### func NewErr -``` go -func NewErr(format string, args ...interface{}) Err -``` -NewErr is used to return an Err for the purpose of embedding in other -structures. The location is not specified, and needs to be set with a call -to SetLocation. - -For example: - - - type FooError struct { - errors.Err - code int - } - - func NewFooError(code int) error { - err := &FooError{errors.NewErr("foo"), code} - err.SetLocation(1) - return err - } - - - - -### func (\*Err) Cause -``` go -func (e *Err) Cause() error -``` -The Cause of an error is the most recent error in the error stack that -meets one of these criteria: the original error that was raised; the new -error that was passed into the Wrap function; the most recently masked -error; or nil if the error itself is considered the Cause. Normally this -method is not invoked directly, but instead through the Cause stand alone -function. - - - -### func (\*Err) Error -``` go -func (e *Err) Error() string -``` -Error implements error.Error. - - - -### func (\*Err) Location -``` go -func (e *Err) Location() (filename string, line int) -``` -Location is the file and line of where the error was most recently -created or annotated. - - - -### func (\*Err) Message -``` go -func (e *Err) Message() string -``` -Message returns the message stored with the most recent location. This is -the empty string if the most recent call was Trace, or the message stored -with Annotate or Mask. - - - -### func (\*Err) SetLocation -``` go -func (e *Err) SetLocation(callDepth int) -``` -SetLocation records the source location of the error at callDepth stack -frames above the call. - - - -### func (\*Err) StackTrace -``` go -func (e *Err) StackTrace() []string -``` -StackTrace returns one string for each location recorded in the stack of -errors. The first value is the originating error, with a line for each -other annotation or tracing of the error. - - - -### func (\*Err) Underlying -``` go -func (e *Err) Underlying() error -``` -Underlying returns the previous error in the error stack, if any. A client -should not ever really call this method. It is used to build the error -stack and should not be introspected by client calls. Or more -specifically, clients should not depend on anything but the `Cause` of an -error. - - - - - - - - - -- - - -Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md) \ No newline at end of file diff --git a/vendor/github.com/juju/errors/doc.go b/vendor/github.com/juju/errors/doc.go deleted file mode 100644 index 35b119a..0000000 --- a/vendor/github.com/juju/errors/doc.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013, 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -/* -[godoc-link-here] - -The juju/errors provides an easy way to annotate errors without losing the -orginal error context. - -The exported `New` and `Errorf` functions are designed to replace the -`errors.New` and `fmt.Errorf` functions respectively. The same underlying -error is there, but the package also records the location at which the error -was created. - -A primary use case for this library is to add extra context any time an -error is returned from a function. - - if err := SomeFunc(); err != nil { - return err - } - -This instead becomes: - - if err := SomeFunc(); err != nil { - return errors.Trace(err) - } - -which just records the file and line number of the Trace call, or - - if err := SomeFunc(); err != nil { - return errors.Annotate(err, "more context") - } - -which also adds an annotation to the error. - -When you want to check to see if an error is of a particular type, a helper -function is normally exported by the package that returned the error, like the -`os` package does. The underlying cause of the error is available using the -`Cause` function. - - os.IsNotExist(errors.Cause(err)) - -The result of the `Error()` call on an annotated error is the annotations joined -with colons, then the result of the `Error()` method for the underlying error -that was the cause. - - err := errors.Errorf("original") - err = errors.Annotatef(err, "context") - err = errors.Annotatef(err, "more context") - err.Error() -> "more context: context: original" - -Obviously recording the file, line and functions is not very useful if you -cannot get them back out again. - - errors.ErrorStack(err) - -will return something like: - - first error - github.com/juju/errors/annotation_test.go:193: - github.com/juju/errors/annotation_test.go:194: annotation - github.com/juju/errors/annotation_test.go:195: - github.com/juju/errors/annotation_test.go:196: more context - github.com/juju/errors/annotation_test.go:197: - -The first error was generated by an external system, so there was no location -associated. The second, fourth, and last lines were generated with Trace calls, -and the other two through Annotate. - -Sometimes when responding to an error you want to return a more specific error -for the situation. - - if err := FindField(field); err != nil { - return errors.Wrap(err, errors.NotFoundf(field)) - } - -This returns an error where the complete error stack is still available, and -`errors.Cause()` will return the `NotFound` error. - -*/ -package errors diff --git a/vendor/github.com/juju/errors/error.go b/vendor/github.com/juju/errors/error.go deleted file mode 100644 index b7df735..0000000 --- a/vendor/github.com/juju/errors/error.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" - "reflect" - "runtime" -) - -// Err holds a description of an error along with information about -// where the error was created. -// -// It may be embedded in custom error types to add extra information that -// this errors package can understand. -type Err struct { - // message holds an annotation of the error. - message string - - // cause holds the cause of the error as returned - // by the Cause method. - cause error - - // previous holds the previous error in the error stack, if any. - previous error - - // file and line hold the source code location where the error was - // created. - file string - line int -} - -// NewErr is used to return an Err for the purpose of embedding in other -// structures. The location is not specified, and needs to be set with a call -// to SetLocation. -// -// For example: -// type FooError struct { -// errors.Err -// code int -// } -// -// func NewFooError(code int) error { -// err := &FooError{errors.NewErr("foo"), code} -// err.SetLocation(1) -// return err -// } -func NewErr(format string, args ...interface{}) Err { - return Err{ - message: fmt.Sprintf(format, args...), - } -} - -// NewErrWithCause is used to return an Err with case by other error for the purpose of embedding in other -// structures. The location is not specified, and needs to be set with a call -// to SetLocation. -// -// For example: -// type FooError struct { -// errors.Err -// code int -// } -// -// func (e *FooError) Annotate(format string, args ...interface{}) error { -// err := &FooError{errors.NewErrWithCause(e.Err, format, args...), e.code} -// err.SetLocation(1) -// return err -// }) -func NewErrWithCause(other error, format string, args ...interface{}) Err { - return Err{ - message: fmt.Sprintf(format, args...), - cause: Cause(other), - previous: other, - } -} - -// Location is the file and line of where the error was most recently -// created or annotated. -func (e *Err) Location() (filename string, line int) { - return e.file, e.line -} - -// Underlying returns the previous error in the error stack, if any. A client -// should not ever really call this method. It is used to build the error -// stack and should not be introspected by client calls. Or more -// specifically, clients should not depend on anything but the `Cause` of an -// error. -func (e *Err) Underlying() error { - return e.previous -} - -// The Cause of an error is the most recent error in the error stack that -// meets one of these criteria: the original error that was raised; the new -// error that was passed into the Wrap function; the most recently masked -// error; or nil if the error itself is considered the Cause. Normally this -// method is not invoked directly, but instead through the Cause stand alone -// function. -func (e *Err) Cause() error { - return e.cause -} - -// Message returns the message stored with the most recent location. This is -// the empty string if the most recent call was Trace, or the message stored -// with Annotate or Mask. -func (e *Err) Message() string { - return e.message -} - -// Error implements error.Error. -func (e *Err) Error() string { - // We want to walk up the stack of errors showing the annotations - // as long as the cause is the same. - err := e.previous - if !sameError(Cause(err), e.cause) && e.cause != nil { - err = e.cause - } - switch { - case err == nil: - return e.message - case e.message == "": - return err.Error() - } - return fmt.Sprintf("%s: %v", e.message, err) -} - -// Format implements fmt.Formatter -// When printing errors with %+v it also prints the stack trace. -// %#v unsurprisingly will print the real underlying type. -func (e *Err) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case s.Flag('+'): - fmt.Fprintf(s, "%s", ErrorStack(e)) - return - case s.Flag('#'): - // avoid infinite recursion by wrapping e into a type - // that doesn't implement Formatter. - fmt.Fprintf(s, "%#v", (*unformatter)(e)) - return - } - fallthrough - case 's': - fmt.Fprintf(s, "%s", e.Error()) - } -} - -// helper for Format -type unformatter Err - -func (unformatter) Format() { /* break the fmt.Formatter interface */ } - -// SetLocation records the source location of the error at callDepth stack -// frames above the call. -func (e *Err) SetLocation(callDepth int) { - _, file, line, _ := runtime.Caller(callDepth + 1) - e.file = trimGoPath(file) - e.line = line -} - -// StackTrace returns one string for each location recorded in the stack of -// errors. The first value is the originating error, with a line for each -// other annotation or tracing of the error. -func (e *Err) StackTrace() []string { - return errorStack(e) -} - -// Ideally we'd have a way to check identity, but deep equals will do. -func sameError(e1, e2 error) bool { - return reflect.DeepEqual(e1, e2) -} diff --git a/vendor/github.com/juju/errors/errortypes.go b/vendor/github.com/juju/errors/errortypes.go deleted file mode 100644 index 9b731c4..0000000 --- a/vendor/github.com/juju/errors/errortypes.go +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" -) - -// wrap is a helper to construct an *wrapper. -func wrap(err error, format, suffix string, args ...interface{}) Err { - newErr := Err{ - message: fmt.Sprintf(format+suffix, args...), - previous: err, - } - newErr.SetLocation(2) - return newErr -} - -// notFound represents an error when something has not been found. -type notFound struct { - Err -} - -// NotFoundf returns an error which satisfies IsNotFound(). -func NotFoundf(format string, args ...interface{}) error { - return ¬Found{wrap(nil, format, " not found", args...)} -} - -// NewNotFound returns an error which wraps err that satisfies -// IsNotFound(). -func NewNotFound(err error, msg string) error { - return ¬Found{wrap(err, msg, "")} -} - -// IsNotFound reports whether err was created with NotFoundf() or -// NewNotFound(). -func IsNotFound(err error) bool { - err = Cause(err) - _, ok := err.(*notFound) - return ok -} - -// userNotFound represents an error when an inexistent user is looked up. -type userNotFound struct { - Err -} - -// UserNotFoundf returns an error which satisfies IsUserNotFound(). -func UserNotFoundf(format string, args ...interface{}) error { - return &userNotFound{wrap(nil, format, " user not found", args...)} -} - -// NewUserNotFound returns an error which wraps err and satisfies -// IsUserNotFound(). -func NewUserNotFound(err error, msg string) error { - return &userNotFound{wrap(err, msg, "")} -} - -// IsUserNotFound reports whether err was created with UserNotFoundf() or -// NewUserNotFound(). -func IsUserNotFound(err error) bool { - err = Cause(err) - _, ok := err.(*userNotFound) - return ok -} - -// unauthorized represents an error when an operation is unauthorized. -type unauthorized struct { - Err -} - -// Unauthorizedf returns an error which satisfies IsUnauthorized(). -func Unauthorizedf(format string, args ...interface{}) error { - return &unauthorized{wrap(nil, format, "", args...)} -} - -// NewUnauthorized returns an error which wraps err and satisfies -// IsUnauthorized(). -func NewUnauthorized(err error, msg string) error { - return &unauthorized{wrap(err, msg, "")} -} - -// IsUnauthorized reports whether err was created with Unauthorizedf() or -// NewUnauthorized(). -func IsUnauthorized(err error) bool { - err = Cause(err) - _, ok := err.(*unauthorized) - return ok -} - -// notImplemented represents an error when something is not -// implemented. -type notImplemented struct { - Err -} - -// NotImplementedf returns an error which satisfies IsNotImplemented(). -func NotImplementedf(format string, args ...interface{}) error { - return ¬Implemented{wrap(nil, format, " not implemented", args...)} -} - -// NewNotImplemented returns an error which wraps err and satisfies -// IsNotImplemented(). -func NewNotImplemented(err error, msg string) error { - return ¬Implemented{wrap(err, msg, "")} -} - -// IsNotImplemented reports whether err was created with -// NotImplementedf() or NewNotImplemented(). -func IsNotImplemented(err error) bool { - err = Cause(err) - _, ok := err.(*notImplemented) - return ok -} - -// alreadyExists represents and error when something already exists. -type alreadyExists struct { - Err -} - -// AlreadyExistsf returns an error which satisfies IsAlreadyExists(). -func AlreadyExistsf(format string, args ...interface{}) error { - return &alreadyExists{wrap(nil, format, " already exists", args...)} -} - -// NewAlreadyExists returns an error which wraps err and satisfies -// IsAlreadyExists(). -func NewAlreadyExists(err error, msg string) error { - return &alreadyExists{wrap(err, msg, "")} -} - -// IsAlreadyExists reports whether the error was created with -// AlreadyExistsf() or NewAlreadyExists(). -func IsAlreadyExists(err error) bool { - err = Cause(err) - _, ok := err.(*alreadyExists) - return ok -} - -// notSupported represents an error when something is not supported. -type notSupported struct { - Err -} - -// NotSupportedf returns an error which satisfies IsNotSupported(). -func NotSupportedf(format string, args ...interface{}) error { - return ¬Supported{wrap(nil, format, " not supported", args...)} -} - -// NewNotSupported returns an error which wraps err and satisfies -// IsNotSupported(). -func NewNotSupported(err error, msg string) error { - return ¬Supported{wrap(err, msg, "")} -} - -// IsNotSupported reports whether the error was created with -// NotSupportedf() or NewNotSupported(). -func IsNotSupported(err error) bool { - err = Cause(err) - _, ok := err.(*notSupported) - return ok -} - -// notValid represents an error when something is not valid. -type notValid struct { - Err -} - -// NotValidf returns an error which satisfies IsNotValid(). -func NotValidf(format string, args ...interface{}) error { - return ¬Valid{wrap(nil, format, " not valid", args...)} -} - -// NewNotValid returns an error which wraps err and satisfies IsNotValid(). -func NewNotValid(err error, msg string) error { - return ¬Valid{wrap(err, msg, "")} -} - -// IsNotValid reports whether the error was created with NotValidf() or -// NewNotValid(). -func IsNotValid(err error) bool { - err = Cause(err) - _, ok := err.(*notValid) - return ok -} - -// notProvisioned represents an error when something is not yet provisioned. -type notProvisioned struct { - Err -} - -// NotProvisionedf returns an error which satisfies IsNotProvisioned(). -func NotProvisionedf(format string, args ...interface{}) error { - return ¬Provisioned{wrap(nil, format, " not provisioned", args...)} -} - -// NewNotProvisioned returns an error which wraps err that satisfies -// IsNotProvisioned(). -func NewNotProvisioned(err error, msg string) error { - return ¬Provisioned{wrap(err, msg, "")} -} - -// IsNotProvisioned reports whether err was created with NotProvisionedf() or -// NewNotProvisioned(). -func IsNotProvisioned(err error) bool { - err = Cause(err) - _, ok := err.(*notProvisioned) - return ok -} - -// notAssigned represents an error when something is not yet assigned to -// something else. -type notAssigned struct { - Err -} - -// NotAssignedf returns an error which satisfies IsNotAssigned(). -func NotAssignedf(format string, args ...interface{}) error { - return ¬Assigned{wrap(nil, format, " not assigned", args...)} -} - -// NewNotAssigned returns an error which wraps err that satisfies -// IsNotAssigned(). -func NewNotAssigned(err error, msg string) error { - return ¬Assigned{wrap(err, msg, "")} -} - -// IsNotAssigned reports whether err was created with NotAssignedf() or -// NewNotAssigned(). -func IsNotAssigned(err error) bool { - err = Cause(err) - _, ok := err.(*notAssigned) - return ok -} - -// badRequest represents an error when a request has bad parameters. -type badRequest struct { - Err -} - -// BadRequestf returns an error which satisfies IsBadRequest(). -func BadRequestf(format string, args ...interface{}) error { - return &badRequest{wrap(nil, format, "", args...)} -} - -// NewBadRequest returns an error which wraps err that satisfies -// IsBadRequest(). -func NewBadRequest(err error, msg string) error { - return &badRequest{wrap(err, msg, "")} -} - -// IsBadRequest reports whether err was created with BadRequestf() or -// NewBadRequest(). -func IsBadRequest(err error) bool { - err = Cause(err) - _, ok := err.(*badRequest) - return ok -} - -// methodNotAllowed represents an error when an HTTP request -// is made with an inappropriate method. -type methodNotAllowed struct { - Err -} - -// MethodNotAllowedf returns an error which satisfies IsMethodNotAllowed(). -func MethodNotAllowedf(format string, args ...interface{}) error { - return &methodNotAllowed{wrap(nil, format, "", args...)} -} - -// NewMethodNotAllowed returns an error which wraps err that satisfies -// IsMethodNotAllowed(). -func NewMethodNotAllowed(err error, msg string) error { - return &methodNotAllowed{wrap(err, msg, "")} -} - -// IsMethodNotAllowed reports whether err was created with MethodNotAllowedf() or -// NewMethodNotAllowed(). -func IsMethodNotAllowed(err error) bool { - err = Cause(err) - _, ok := err.(*methodNotAllowed) - return ok -} - -// forbidden represents an error when a request cannot be completed because of -// missing privileges -type forbidden struct { - Err -} - -// Forbiddenf returns an error which satistifes IsForbidden() -func Forbiddenf(format string, args ...interface{}) error { - return &forbidden{wrap(nil, format, "", args...)} -} - -// NewForbidden returns an error which wraps err that satisfies -// IsForbidden(). -func NewForbidden(err error, msg string) error { - return &forbidden{wrap(err, msg, "")} -} - -// IsForbidden reports whether err was created with Forbiddenf() or -// NewForbidden(). -func IsForbidden(err error) bool { - err = Cause(err) - _, ok := err.(*forbidden) - return ok -} diff --git a/vendor/github.com/juju/errors/functions.go b/vendor/github.com/juju/errors/functions.go deleted file mode 100644 index f86b09b..0000000 --- a/vendor/github.com/juju/errors/functions.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" - "strings" -) - -// New is a drop in replacement for the standard library errors module that records -// the location that the error is created. -// -// For example: -// return errors.New("validation failed") -// -func New(message string) error { - err := &Err{message: message} - err.SetLocation(1) - return err -} - -// Errorf creates a new annotated error and records the location that the -// error is created. This should be a drop in replacement for fmt.Errorf. -// -// For example: -// return errors.Errorf("validation failed: %s", message) -// -func Errorf(format string, args ...interface{}) error { - err := &Err{message: fmt.Sprintf(format, args...)} - err.SetLocation(1) - return err -} - -// Trace adds the location of the Trace call to the stack. The Cause of the -// resulting error is the same as the error parameter. If the other error is -// nil, the result will be nil. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Trace(err) -// } -// -func Trace(other error) error { - if other == nil { - return nil - } - err := &Err{previous: other, cause: Cause(other)} - err.SetLocation(1) - return err -} - -// Annotate is used to add extra context to an existing error. The location of -// the Annotate call is recorded with the annotations. The file, line and -// function are also recorded. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Annotate(err, "failed to frombulate") -// } -// -func Annotate(other error, message string) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - cause: Cause(other), - message: message, - } - err.SetLocation(1) - return err -} - -// Annotatef is used to add extra context to an existing error. The location of -// the Annotate call is recorded with the annotations. The file, line and -// function are also recorded. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Annotatef(err, "failed to frombulate the %s", arg) -// } -// -func Annotatef(other error, format string, args ...interface{}) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - cause: Cause(other), - message: fmt.Sprintf(format, args...), - } - err.SetLocation(1) - return err -} - -// DeferredAnnotatef annotates the given error (when it is not nil) with the given -// format string and arguments (like fmt.Sprintf). If *err is nil, DeferredAnnotatef -// does nothing. This method is used in a defer statement in order to annotate any -// resulting error with the same message. -// -// For example: -// -// defer DeferredAnnotatef(&err, "failed to frombulate the %s", arg) -// -func DeferredAnnotatef(err *error, format string, args ...interface{}) { - if *err == nil { - return - } - newErr := &Err{ - message: fmt.Sprintf(format, args...), - cause: Cause(*err), - previous: *err, - } - newErr.SetLocation(1) - *err = newErr -} - -// Wrap changes the Cause of the error. The location of the Wrap call is also -// stored in the error stack. -// -// For example: -// if err := SomeFunc(); err != nil { -// newErr := &packageError{"more context", private_value} -// return errors.Wrap(err, newErr) -// } -// -func Wrap(other, newDescriptive error) error { - err := &Err{ - previous: other, - cause: newDescriptive, - } - err.SetLocation(1) - return err -} - -// Wrapf changes the Cause of the error, and adds an annotation. The location -// of the Wrap call is also stored in the error stack. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Wrapf(err, simpleErrorType, "invalid value %q", value) -// } -// -func Wrapf(other, newDescriptive error, format string, args ...interface{}) error { - err := &Err{ - message: fmt.Sprintf(format, args...), - previous: other, - cause: newDescriptive, - } - err.SetLocation(1) - return err -} - -// Mask masks the given error with the given format string and arguments (like -// fmt.Sprintf), returning a new error that maintains the error stack, but -// hides the underlying error type. The error string still contains the full -// annotations. If you want to hide the annotations, call Wrap. -func Maskf(other error, format string, args ...interface{}) error { - if other == nil { - return nil - } - err := &Err{ - message: fmt.Sprintf(format, args...), - previous: other, - } - err.SetLocation(1) - return err -} - -// Mask hides the underlying error type, and records the location of the masking. -func Mask(other error) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - } - err.SetLocation(1) - return err -} - -// Cause returns the cause of the given error. This will be either the -// original error, or the result of a Wrap or Mask call. -// -// Cause is the usual way to diagnose errors that may have been wrapped by -// the other errors functions. -func Cause(err error) error { - var diag error - if err, ok := err.(causer); ok { - diag = err.Cause() - } - if diag != nil { - return diag - } - return err -} - -type causer interface { - Cause() error -} - -type wrapper interface { - // Message returns the top level error message, - // not including the message from the Previous - // error. - Message() string - - // Underlying returns the Previous error, or nil - // if there is none. - Underlying() error -} - -type locationer interface { - Location() (string, int) -} - -var ( - _ wrapper = (*Err)(nil) - _ locationer = (*Err)(nil) - _ causer = (*Err)(nil) -) - -// Details returns information about the stack of errors wrapped by err, in -// the format: -// -// [{filename:99: error one} {otherfile:55: cause of error one}] -// -// This is a terse alternative to ErrorStack as it returns a single line. -func Details(err error) string { - if err == nil { - return "[]" - } - var s []byte - s = append(s, '[') - for { - s = append(s, '{') - if err, ok := err.(locationer); ok { - file, line := err.Location() - if file != "" { - s = append(s, fmt.Sprintf("%s:%d", file, line)...) - s = append(s, ": "...) - } - } - if cerr, ok := err.(wrapper); ok { - s = append(s, cerr.Message()...) - err = cerr.Underlying() - } else { - s = append(s, err.Error()...) - err = nil - } - s = append(s, '}') - if err == nil { - break - } - s = append(s, ' ') - } - s = append(s, ']') - return string(s) -} - -// ErrorStack returns a string representation of the annotated error. If the -// error passed as the parameter is not an annotated error, the result is -// simply the result of the Error() method on that error. -// -// If the error is an annotated error, a multi-line string is returned where -// each line represents one entry in the annotation stack. The full filename -// from the call stack is used in the output. -// -// first error -// github.com/juju/errors/annotation_test.go:193: -// github.com/juju/errors/annotation_test.go:194: annotation -// github.com/juju/errors/annotation_test.go:195: -// github.com/juju/errors/annotation_test.go:196: more context -// github.com/juju/errors/annotation_test.go:197: -func ErrorStack(err error) string { - return strings.Join(errorStack(err), "\n") -} - -func errorStack(err error) []string { - if err == nil { - return nil - } - - // We want the first error first - var lines []string - for { - var buff []byte - if err, ok := err.(locationer); ok { - file, line := err.Location() - // Strip off the leading GOPATH/src path elements. - file = trimGoPath(file) - if file != "" { - buff = append(buff, fmt.Sprintf("%s:%d", file, line)...) - buff = append(buff, ": "...) - } - } - if cerr, ok := err.(wrapper); ok { - message := cerr.Message() - buff = append(buff, message...) - // If there is a cause for this error, and it is different to the cause - // of the underlying error, then output the error string in the stack trace. - var cause error - if err1, ok := err.(causer); ok { - cause = err1.Cause() - } - err = cerr.Underlying() - if cause != nil && !sameError(Cause(err), cause) { - if message != "" { - buff = append(buff, ": "...) - } - buff = append(buff, cause.Error()...) - } - } else { - buff = append(buff, err.Error()...) - err = nil - } - lines = append(lines, string(buff)) - if err == nil { - break - } - } - // reverse the lines to get the original error, which was at the end of - // the list, back to the start. - var result []string - for i := len(lines); i > 0; i-- { - result = append(result, lines[i-1]) - } - return result -} diff --git a/vendor/github.com/juju/errors/path.go b/vendor/github.com/juju/errors/path.go deleted file mode 100644 index a7b726a..0000000 --- a/vendor/github.com/juju/errors/path.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013, 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "runtime" - "strings" -) - -// prefixSize is used internally to trim the user specific path from the -// front of the returned filenames from the runtime call stack. -var prefixSize int - -// goPath is the deduced path based on the location of this file as compiled. -var goPath string - -func init() { - _, file, _, ok := runtime.Caller(0) - if file == "?" { - return - } - if ok { - // We know that the end of the file should be: - // github.com/juju/errors/path.go - size := len(file) - suffix := len("github.com/juju/errors/path.go") - goPath = file[:size-suffix] - prefixSize = len(goPath) - } -} - -func trimGoPath(filename string) string { - if strings.HasPrefix(filename, goPath) { - return filename[prefixSize:] - } - return filename -} diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE b/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE deleted file mode 100644 index 14127cd..0000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -(The MIT License) - -Copyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md deleted file mode 100644 index 09a4a35..0000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Windows Terminal Sequences - -This library allow for enabling Windows terminal color support for Go. - -See [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) for details. - -## Usage - -```go -import ( - "syscall" - - sequences "github.com/konsorten/go-windows-terminal-sequences" -) - -func main() { - sequences.EnableVirtualTerminalProcessing(syscall.Stdout, true) -} - -``` - -## Authors - -The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). - -We thank all the authors who provided code to this library: - -* Felix Kollmann -* Nicolas Perraut -* @dirty49374 - -## License - -(The MIT License) - -Copyright (c) 2018 marvin + konsorten GmbH (open-source@konsorten.de) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go deleted file mode 100644 index 57f530a..0000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build windows - -package sequences - -import ( - "syscall" -) - -var ( - kernel32Dll *syscall.LazyDLL = syscall.NewLazyDLL("Kernel32.dll") - setConsoleMode *syscall.LazyProc = kernel32Dll.NewProc("SetConsoleMode") -) - -func EnableVirtualTerminalProcessing(stream syscall.Handle, enable bool) error { - const ENABLE_VIRTUAL_TERMINAL_PROCESSING uint32 = 0x4 - - var mode uint32 - err := syscall.GetConsoleMode(syscall.Stdout, &mode) - if err != nil { - return err - } - - if enable { - mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING - } else { - mode &^= ENABLE_VIRTUAL_TERMINAL_PROCESSING - } - - ret, _, err := setConsoleMode.Call(uintptr(stream), uintptr(mode)) - if ret == 0 { - return err - } - - return nil -} diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go deleted file mode 100644 index df61a6f..0000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux darwin - -package sequences - -import ( - "fmt" -) - -func EnableVirtualTerminalProcessing(stream uintptr, enable bool) error { - return fmt.Errorf("windows only package") -} diff --git a/vendor/github.com/opentracing/opentracing-go/.gitignore b/vendor/github.com/opentracing/opentracing-go/.gitignore deleted file mode 100644 index 565f0f7..0000000 --- a/vendor/github.com/opentracing/opentracing-go/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# IntelliJ project files -.idea/ -opentracing-go.iml -opentracing-go.ipr -opentracing-go.iws - -# Test results -*.cov -*.html -test.log - -# Build dir -build/ diff --git a/vendor/github.com/opentracing/opentracing-go/.travis.yml b/vendor/github.com/opentracing/opentracing-go/.travis.yml deleted file mode 100644 index 0538f1b..0000000 --- a/vendor/github.com/opentracing/opentracing-go/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: go - -go: - - 1.6 - - 1.7 - - 1.8 - - tip - -install: - - go get -d -t github.com/opentracing/opentracing-go/... - - go get -u github.com/golang/lint/... -script: - - make test lint - - go build ./... diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md deleted file mode 100644 index 1fc9fdf..0000000 --- a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -Changes by Version -================== - -1.1.0 (unreleased) -------------------- - -- Deprecate InitGlobalTracer() in favor of SetGlobalTracer() - - -1.0.0 (2016-09-26) -------------------- - -- This release implements OpenTracing Specification 1.0 (http://opentracing.io/spec) - diff --git a/vendor/github.com/opentracing/opentracing-go/LICENSE b/vendor/github.com/opentracing/opentracing-go/LICENSE deleted file mode 100644 index 148509a..0000000 --- a/vendor/github.com/opentracing/opentracing-go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 The OpenTracing Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile deleted file mode 100644 index 2f491f1..0000000 --- a/vendor/github.com/opentracing/opentracing-go/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -PACKAGES := . ./mocktracer/... ./ext/... - -.DEFAULT_GOAL := test-and-lint - -.PHONE: test-and-lint - -test-and-lint: test lint - -.PHONY: test -test: - go test -v -cover ./... - -cover: - @rm -rf cover-all.out - $(foreach pkg, $(PACKAGES), $(MAKE) cover-pkg PKG=$(pkg) || true;) - @grep mode: cover.out > coverage.out - @cat cover-all.out >> coverage.out - go tool cover -html=coverage.out -o cover.html - @rm -rf cover.out cover-all.out coverage.out - -cover-pkg: - go test -coverprofile cover.out $(PKG) - @grep -v mode: cover.out >> cover-all.out - -.PHONY: lint -lint: - go fmt ./... - golint ./... - @# Run again with magic to exit non-zero if golint outputs anything. - @! (golint ./... | read dummy) - go vet ./... - diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md deleted file mode 100644 index 1fb77d2..0000000 --- a/vendor/github.com/opentracing/opentracing-go/README.md +++ /dev/null @@ -1,147 +0,0 @@ -[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go) - -# OpenTracing API for Go - -This package is a Go platform API for OpenTracing. - -## Required Reading - -In order to understand the Go platform API, one must first be familiar with the -[OpenTracing project](http://opentracing.io) and -[terminology](http://opentracing.io/documentation/pages/spec.html) more specifically. - -## API overview for those adding instrumentation - -Everyday consumers of this `opentracing` package really only need to worry -about a couple of key abstractions: the `StartSpan` function, the `Span` -interface, and binding a `Tracer` at `main()`-time. Here are code snippets -demonstrating some important use cases. - -#### Singleton initialization - -The simplest starting point is `./default_tracer.go`. As early as possible, call - -```go - import "github.com/opentracing/opentracing-go" - import ".../some_tracing_impl" - - func main() { - opentracing.InitGlobalTracer( - // tracing impl specific: - some_tracing_impl.New(...), - ) - ... - } -``` - -##### Non-Singleton initialization - -If you prefer direct control to singletons, manage ownership of the -`opentracing.Tracer` implementation explicitly. - -#### Creating a Span given an existing Go `context.Context` - -If you use `context.Context` in your application, OpenTracing's Go library will -happily rely on it for `Span` propagation. To start a new (blocking child) -`Span`, you can use `StartSpanFromContext`. - -```go - func xyz(ctx context.Context, ...) { - ... - span, ctx := opentracing.StartSpanFromContext(ctx, "operation_name") - defer span.Finish() - span.LogFields( - log.String("event", "soft error"), - log.String("type", "cache timeout"), - log.Int("waited.millis", 1500)) - ... - } -``` - -#### Starting an empty trace by creating a "root span" - -It's always possible to create a "root" `Span` with no parent or other causal -reference. - -```go - func xyz() { - ... - sp := opentracing.StartSpan("operation_name") - defer sp.Finish() - ... - } -``` - -#### Creating a (child) Span given an existing (parent) Span - -```go - func xyz(parentSpan opentracing.Span, ...) { - ... - sp := opentracing.StartSpan( - "operation_name", - opentracing.ChildOf(parentSpan.Context())) - defer sp.Finish() - ... - } -``` - -#### Serializing to the wire - -```go - func makeSomeRequest(ctx context.Context) ... { - if span := opentracing.SpanFromContext(ctx); span != nil { - httpClient := &http.Client{} - httpReq, _ := http.NewRequest("GET", "http://myservice/", nil) - - // Transmit the span's TraceContext as HTTP headers on our - // outbound request. - opentracing.GlobalTracer().Inject( - span.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(httpReq.Header)) - - resp, err := httpClient.Do(httpReq) - ... - } - ... - } -``` - -#### Deserializing from the wire - -```go - http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { - var serverSpan opentracing.Span - appSpecificOperationName := ... - wireContext, err := opentracing.GlobalTracer().Extract( - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(req.Header)) - if err != nil { - // Optionally record something about err here - } - - // Create the span referring to the RPC client if available. - // If wireContext == nil, a root span will be created. - serverSpan = opentracing.StartSpan( - appSpecificOperationName, - ext.RPCServerOption(wireContext)) - - defer serverSpan.Finish() - - ctx := opentracing.ContextWithSpan(context.Background(), serverSpan) - ... - } -``` - -#### Goroutine-safety - -The entire public API is goroutine-safe and does not require external -synchronization. - -## API pointers for those implementing a tracing system - -Tracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`. - -## API compatibility - -For the time being, "mild" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority. diff --git a/vendor/github.com/opentracing/opentracing-go/ext/tags.go b/vendor/github.com/opentracing/opentracing-go/ext/tags.go deleted file mode 100644 index c67ab5e..0000000 --- a/vendor/github.com/opentracing/opentracing-go/ext/tags.go +++ /dev/null @@ -1,198 +0,0 @@ -package ext - -import opentracing "github.com/opentracing/opentracing-go" - -// These constants define common tag names recommended for better portability across -// tracing systems and languages/platforms. -// -// The tag names are defined as typed strings, so that in addition to the usual use -// -// span.setTag(TagName, value) -// -// they also support value type validation via this additional syntax: -// -// TagName.Set(span, value) -// -var ( - ////////////////////////////////////////////////////////////////////// - // SpanKind (client/server or producer/consumer) - ////////////////////////////////////////////////////////////////////// - - // SpanKind hints at relationship between spans, e.g. client/server - SpanKind = spanKindTagName("span.kind") - - // SpanKindRPCClient marks a span representing the client-side of an RPC - // or other remote call - SpanKindRPCClientEnum = SpanKindEnum("client") - SpanKindRPCClient = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCClientEnum} - - // SpanKindRPCServer marks a span representing the server-side of an RPC - // or other remote call - SpanKindRPCServerEnum = SpanKindEnum("server") - SpanKindRPCServer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCServerEnum} - - // SpanKindProducer marks a span representing the producer-side of a - // message bus - SpanKindProducerEnum = SpanKindEnum("producer") - SpanKindProducer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindProducerEnum} - - // SpanKindConsumer marks a span representing the consumer-side of a - // message bus - SpanKindConsumerEnum = SpanKindEnum("consumer") - SpanKindConsumer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindConsumerEnum} - - ////////////////////////////////////////////////////////////////////// - // Component name - ////////////////////////////////////////////////////////////////////// - - // Component is a low-cardinality identifier of the module, library, - // or package that is generating a span. - Component = stringTagName("component") - - ////////////////////////////////////////////////////////////////////// - // Sampling hint - ////////////////////////////////////////////////////////////////////// - - // SamplingPriority determines the priority of sampling this Span. - SamplingPriority = uint16TagName("sampling.priority") - - ////////////////////////////////////////////////////////////////////// - // Peer tags. These tags can be emitted by either client-side of - // server-side to describe the other side/service in a peer-to-peer - // communications, like an RPC call. - ////////////////////////////////////////////////////////////////////// - - // PeerService records the service name of the peer. - PeerService = stringTagName("peer.service") - - // PeerAddress records the address name of the peer. This may be a "ip:port", - // a bare "hostname", a FQDN or even a database DSN substring - // like "mysql://username@127.0.0.1:3306/dbname" - PeerAddress = stringTagName("peer.address") - - // PeerHostname records the host name of the peer - PeerHostname = stringTagName("peer.hostname") - - // PeerHostIPv4 records IP v4 host address of the peer - PeerHostIPv4 = uint32TagName("peer.ipv4") - - // PeerHostIPv6 records IP v6 host address of the peer - PeerHostIPv6 = stringTagName("peer.ipv6") - - // PeerPort records port number of the peer - PeerPort = uint16TagName("peer.port") - - ////////////////////////////////////////////////////////////////////// - // HTTP Tags - ////////////////////////////////////////////////////////////////////// - - // HTTPUrl should be the URL of the request being handled in this segment - // of the trace, in standard URI format. The protocol is optional. - HTTPUrl = stringTagName("http.url") - - // HTTPMethod is the HTTP method of the request, and is case-insensitive. - HTTPMethod = stringTagName("http.method") - - // HTTPStatusCode is the numeric HTTP status code (200, 404, etc) of the - // HTTP response. - HTTPStatusCode = uint16TagName("http.status_code") - - ////////////////////////////////////////////////////////////////////// - // DB Tags - ////////////////////////////////////////////////////////////////////// - - // DBInstance is database instance name. - DBInstance = stringTagName("db.instance") - - // DBStatement is a database statement for the given database type. - // It can be a query or a prepared statement (i.e., before substitution). - DBStatement = stringTagName("db.statement") - - // DBType is a database type. For any SQL database, "sql". - // For others, the lower-case database category, e.g. "redis" - DBType = stringTagName("db.type") - - // DBUser is a username for accessing database. - DBUser = stringTagName("db.user") - - ////////////////////////////////////////////////////////////////////// - // Message Bus Tag - ////////////////////////////////////////////////////////////////////// - - // MessageBusDestination is an address at which messages can be exchanged - MessageBusDestination = stringTagName("message_bus.destination") - - ////////////////////////////////////////////////////////////////////// - // Error Tag - ////////////////////////////////////////////////////////////////////// - - // Error indicates that operation represented by the span resulted in an error. - Error = boolTagName("error") -) - -// --- - -// SpanKindEnum represents common span types -type SpanKindEnum string - -type spanKindTagName string - -// Set adds a string tag to the `span` -func (tag spanKindTagName) Set(span opentracing.Span, value SpanKindEnum) { - span.SetTag(string(tag), value) -} - -type rpcServerOption struct { - clientContext opentracing.SpanContext -} - -func (r rpcServerOption) Apply(o *opentracing.StartSpanOptions) { - if r.clientContext != nil { - opentracing.ChildOf(r.clientContext).Apply(o) - } - SpanKindRPCServer.Apply(o) -} - -// RPCServerOption returns a StartSpanOption appropriate for an RPC server span -// with `client` representing the metadata for the remote peer Span if available. -// In case client == nil, due to the client not being instrumented, this RPC -// server span will be a root span. -func RPCServerOption(client opentracing.SpanContext) opentracing.StartSpanOption { - return rpcServerOption{client} -} - -// --- - -type stringTagName string - -// Set adds a string tag to the `span` -func (tag stringTagName) Set(span opentracing.Span, value string) { - span.SetTag(string(tag), value) -} - -// --- - -type uint32TagName string - -// Set adds a uint32 tag to the `span` -func (tag uint32TagName) Set(span opentracing.Span, value uint32) { - span.SetTag(string(tag), value) -} - -// --- - -type uint16TagName string - -// Set adds a uint16 tag to the `span` -func (tag uint16TagName) Set(span opentracing.Span, value uint16) { - span.SetTag(string(tag), value) -} - -// --- - -type boolTagName string - -// Add adds a bool tag to the `span` -func (tag boolTagName) Set(span opentracing.Span, value bool) { - span.SetTag(string(tag), value) -} diff --git a/vendor/github.com/opentracing/opentracing-go/globaltracer.go b/vendor/github.com/opentracing/opentracing-go/globaltracer.go deleted file mode 100644 index 8c8e793..0000000 --- a/vendor/github.com/opentracing/opentracing-go/globaltracer.go +++ /dev/null @@ -1,32 +0,0 @@ -package opentracing - -var ( - globalTracer Tracer = NoopTracer{} -) - -// SetGlobalTracer sets the [singleton] opentracing.Tracer returned by -// GlobalTracer(). Those who use GlobalTracer (rather than directly manage an -// opentracing.Tracer instance) should call SetGlobalTracer as early as -// possible in main(), prior to calling the `StartSpan` global func below. -// Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan` -// (etc) globals are noops. -func SetGlobalTracer(tracer Tracer) { - globalTracer = tracer -} - -// GlobalTracer returns the global singleton `Tracer` implementation. -// Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop -// implementation that drops all data handed to it. -func GlobalTracer() Tracer { - return globalTracer -} - -// StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`. -func StartSpan(operationName string, opts ...StartSpanOption) Span { - return globalTracer.StartSpan(operationName, opts...) -} - -// InitGlobalTracer is deprecated. Please use SetGlobalTracer. -func InitGlobalTracer(tracer Tracer) { - SetGlobalTracer(tracer) -} diff --git a/vendor/github.com/opentracing/opentracing-go/gocontext.go b/vendor/github.com/opentracing/opentracing-go/gocontext.go deleted file mode 100644 index 222a652..0000000 --- a/vendor/github.com/opentracing/opentracing-go/gocontext.go +++ /dev/null @@ -1,57 +0,0 @@ -package opentracing - -import "golang.org/x/net/context" - -type contextKey struct{} - -var activeSpanKey = contextKey{} - -// ContextWithSpan returns a new `context.Context` that holds a reference to -// `span`'s SpanContext. -func ContextWithSpan(ctx context.Context, span Span) context.Context { - return context.WithValue(ctx, activeSpanKey, span) -} - -// SpanFromContext returns the `Span` previously associated with `ctx`, or -// `nil` if no such `Span` could be found. -// -// NOTE: context.Context != SpanContext: the former is Go's intra-process -// context propagation mechanism, and the latter houses OpenTracing's per-Span -// identity and baggage information. -func SpanFromContext(ctx context.Context) Span { - val := ctx.Value(activeSpanKey) - if sp, ok := val.(Span); ok { - return sp - } - return nil -} - -// StartSpanFromContext starts and returns a Span with `operationName`, using -// any Span found within `ctx` as a ChildOfRef. If no such parent could be -// found, StartSpanFromContext creates a root (parentless) Span. -// -// The second return value is a context.Context object built around the -// returned Span. -// -// Example usage: -// -// SomeFunction(ctx context.Context, ...) { -// sp, ctx := opentracing.StartSpanFromContext(ctx, "SomeFunction") -// defer sp.Finish() -// ... -// } -func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) { - return startSpanFromContextWithTracer(ctx, GlobalTracer(), operationName, opts...) -} - -// startSpanFromContextWithTracer is factored out for testing purposes. -func startSpanFromContextWithTracer(ctx context.Context, tracer Tracer, operationName string, opts ...StartSpanOption) (Span, context.Context) { - var span Span - if parentSpan := SpanFromContext(ctx); parentSpan != nil { - opts = append(opts, ChildOf(parentSpan.Context())) - span = tracer.StartSpan(operationName, opts...) - } else { - span = tracer.StartSpan(operationName, opts...) - } - return span, ContextWithSpan(ctx, span) -} diff --git a/vendor/github.com/opentracing/opentracing-go/log/field.go b/vendor/github.com/opentracing/opentracing-go/log/field.go deleted file mode 100644 index d2cd39a..0000000 --- a/vendor/github.com/opentracing/opentracing-go/log/field.go +++ /dev/null @@ -1,245 +0,0 @@ -package log - -import ( - "fmt" - "math" -) - -type fieldType int - -const ( - stringType fieldType = iota - boolType - intType - int32Type - uint32Type - int64Type - uint64Type - float32Type - float64Type - errorType - objectType - lazyLoggerType -) - -// Field instances are constructed via LogBool, LogString, and so on. -// Tracing implementations may then handle them via the Field.Marshal -// method. -// -// "heavily influenced by" (i.e., partially stolen from) -// https://github.com/uber-go/zap -type Field struct { - key string - fieldType fieldType - numericVal int64 - stringVal string - interfaceVal interface{} -} - -// String adds a string-valued key:value pair to a Span.LogFields() record -func String(key, val string) Field { - return Field{ - key: key, - fieldType: stringType, - stringVal: val, - } -} - -// Bool adds a bool-valued key:value pair to a Span.LogFields() record -func Bool(key string, val bool) Field { - var numericVal int64 - if val { - numericVal = 1 - } - return Field{ - key: key, - fieldType: boolType, - numericVal: numericVal, - } -} - -// Int adds an int-valued key:value pair to a Span.LogFields() record -func Int(key string, val int) Field { - return Field{ - key: key, - fieldType: intType, - numericVal: int64(val), - } -} - -// Int32 adds an int32-valued key:value pair to a Span.LogFields() record -func Int32(key string, val int32) Field { - return Field{ - key: key, - fieldType: int32Type, - numericVal: int64(val), - } -} - -// Int64 adds an int64-valued key:value pair to a Span.LogFields() record -func Int64(key string, val int64) Field { - return Field{ - key: key, - fieldType: int64Type, - numericVal: val, - } -} - -// Uint32 adds a uint32-valued key:value pair to a Span.LogFields() record -func Uint32(key string, val uint32) Field { - return Field{ - key: key, - fieldType: uint32Type, - numericVal: int64(val), - } -} - -// Uint64 adds a uint64-valued key:value pair to a Span.LogFields() record -func Uint64(key string, val uint64) Field { - return Field{ - key: key, - fieldType: uint64Type, - numericVal: int64(val), - } -} - -// Float32 adds a float32-valued key:value pair to a Span.LogFields() record -func Float32(key string, val float32) Field { - return Field{ - key: key, - fieldType: float32Type, - numericVal: int64(math.Float32bits(val)), - } -} - -// Float64 adds a float64-valued key:value pair to a Span.LogFields() record -func Float64(key string, val float64) Field { - return Field{ - key: key, - fieldType: float64Type, - numericVal: int64(math.Float64bits(val)), - } -} - -// Error adds an error with the key "error" to a Span.LogFields() record -func Error(err error) Field { - return Field{ - key: "error", - fieldType: errorType, - interfaceVal: err, - } -} - -// Object adds an object-valued key:value pair to a Span.LogFields() record -func Object(key string, obj interface{}) Field { - return Field{ - key: key, - fieldType: objectType, - interfaceVal: obj, - } -} - -// LazyLogger allows for user-defined, late-bound logging of arbitrary data -type LazyLogger func(fv Encoder) - -// Lazy adds a LazyLogger to a Span.LogFields() record; the tracing -// implementation will call the LazyLogger function at an indefinite time in -// the future (after Lazy() returns). -func Lazy(ll LazyLogger) Field { - return Field{ - fieldType: lazyLoggerType, - interfaceVal: ll, - } -} - -// Encoder allows access to the contents of a Field (via a call to -// Field.Marshal). -// -// Tracer implementations typically provide an implementation of Encoder; -// OpenTracing callers typically do not need to concern themselves with it. -type Encoder interface { - EmitString(key, value string) - EmitBool(key string, value bool) - EmitInt(key string, value int) - EmitInt32(key string, value int32) - EmitInt64(key string, value int64) - EmitUint32(key string, value uint32) - EmitUint64(key string, value uint64) - EmitFloat32(key string, value float32) - EmitFloat64(key string, value float64) - EmitObject(key string, value interface{}) - EmitLazyLogger(value LazyLogger) -} - -// Marshal passes a Field instance through to the appropriate -// field-type-specific method of an Encoder. -func (lf Field) Marshal(visitor Encoder) { - switch lf.fieldType { - case stringType: - visitor.EmitString(lf.key, lf.stringVal) - case boolType: - visitor.EmitBool(lf.key, lf.numericVal != 0) - case intType: - visitor.EmitInt(lf.key, int(lf.numericVal)) - case int32Type: - visitor.EmitInt32(lf.key, int32(lf.numericVal)) - case int64Type: - visitor.EmitInt64(lf.key, int64(lf.numericVal)) - case uint32Type: - visitor.EmitUint32(lf.key, uint32(lf.numericVal)) - case uint64Type: - visitor.EmitUint64(lf.key, uint64(lf.numericVal)) - case float32Type: - visitor.EmitFloat32(lf.key, math.Float32frombits(uint32(lf.numericVal))) - case float64Type: - visitor.EmitFloat64(lf.key, math.Float64frombits(uint64(lf.numericVal))) - case errorType: - if err, ok := lf.interfaceVal.(error); ok { - visitor.EmitString(lf.key, err.Error()) - } else { - visitor.EmitString(lf.key, "") - } - case objectType: - visitor.EmitObject(lf.key, lf.interfaceVal) - case lazyLoggerType: - visitor.EmitLazyLogger(lf.interfaceVal.(LazyLogger)) - } -} - -// Key returns the field's key. -func (lf Field) Key() string { - return lf.key -} - -// Value returns the field's value as interface{}. -func (lf Field) Value() interface{} { - switch lf.fieldType { - case stringType: - return lf.stringVal - case boolType: - return lf.numericVal != 0 - case intType: - return int(lf.numericVal) - case int32Type: - return int32(lf.numericVal) - case int64Type: - return int64(lf.numericVal) - case uint32Type: - return uint32(lf.numericVal) - case uint64Type: - return uint64(lf.numericVal) - case float32Type: - return math.Float32frombits(uint32(lf.numericVal)) - case float64Type: - return math.Float64frombits(uint64(lf.numericVal)) - case errorType, objectType, lazyLoggerType: - return lf.interfaceVal - default: - return nil - } -} - -// String returns a string representation of the key and value. -func (lf Field) String() string { - return fmt.Sprint(lf.key, ":", lf.Value()) -} diff --git a/vendor/github.com/opentracing/opentracing-go/log/util.go b/vendor/github.com/opentracing/opentracing-go/log/util.go deleted file mode 100644 index 3832feb..0000000 --- a/vendor/github.com/opentracing/opentracing-go/log/util.go +++ /dev/null @@ -1,54 +0,0 @@ -package log - -import "fmt" - -// InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice -// a la Span.LogFields(). -func InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) { - if len(keyValues)%2 != 0 { - return nil, fmt.Errorf("non-even keyValues len: %d", len(keyValues)) - } - fields := make([]Field, len(keyValues)/2) - for i := 0; i*2 < len(keyValues); i++ { - key, ok := keyValues[i*2].(string) - if !ok { - return nil, fmt.Errorf( - "non-string key (pair #%d): %T", - i, keyValues[i*2]) - } - switch typedVal := keyValues[i*2+1].(type) { - case bool: - fields[i] = Bool(key, typedVal) - case string: - fields[i] = String(key, typedVal) - case int: - fields[i] = Int(key, typedVal) - case int8: - fields[i] = Int32(key, int32(typedVal)) - case int16: - fields[i] = Int32(key, int32(typedVal)) - case int32: - fields[i] = Int32(key, typedVal) - case int64: - fields[i] = Int64(key, typedVal) - case uint: - fields[i] = Uint64(key, uint64(typedVal)) - case uint64: - fields[i] = Uint64(key, typedVal) - case uint8: - fields[i] = Uint32(key, uint32(typedVal)) - case uint16: - fields[i] = Uint32(key, uint32(typedVal)) - case uint32: - fields[i] = Uint32(key, typedVal) - case float32: - fields[i] = Float32(key, typedVal) - case float64: - fields[i] = Float64(key, typedVal) - default: - // When in doubt, coerce to a string - fields[i] = String(key, fmt.Sprint(typedVal)) - } - } - return fields, nil -} diff --git a/vendor/github.com/opentracing/opentracing-go/noop.go b/vendor/github.com/opentracing/opentracing-go/noop.go deleted file mode 100644 index 0d32f69..0000000 --- a/vendor/github.com/opentracing/opentracing-go/noop.go +++ /dev/null @@ -1,64 +0,0 @@ -package opentracing - -import "github.com/opentracing/opentracing-go/log" - -// A NoopTracer is a trivial, minimum overhead implementation of Tracer -// for which all operations are no-ops. -// -// The primary use of this implementation is in libraries, such as RPC -// frameworks, that make tracing an optional feature controlled by the -// end user. A no-op implementation allows said libraries to use it -// as the default Tracer and to write instrumentation that does -// not need to keep checking if the tracer instance is nil. -// -// For the same reason, the NoopTracer is the default "global" tracer -// (see GlobalTracer and SetGlobalTracer functions). -// -// WARNING: NoopTracer does not support baggage propagation. -type NoopTracer struct{} - -type noopSpan struct{} -type noopSpanContext struct{} - -var ( - defaultNoopSpanContext = noopSpanContext{} - defaultNoopSpan = noopSpan{} - defaultNoopTracer = NoopTracer{} -) - -const ( - emptyString = "" -) - -// noopSpanContext: -func (n noopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {} - -// noopSpan: -func (n noopSpan) Context() SpanContext { return defaultNoopSpanContext } -func (n noopSpan) SetBaggageItem(key, val string) Span { return defaultNoopSpan } -func (n noopSpan) BaggageItem(key string) string { return emptyString } -func (n noopSpan) SetTag(key string, value interface{}) Span { return n } -func (n noopSpan) LogFields(fields ...log.Field) {} -func (n noopSpan) LogKV(keyVals ...interface{}) {} -func (n noopSpan) Finish() {} -func (n noopSpan) FinishWithOptions(opts FinishOptions) {} -func (n noopSpan) SetOperationName(operationName string) Span { return n } -func (n noopSpan) Tracer() Tracer { return defaultNoopTracer } -func (n noopSpan) LogEvent(event string) {} -func (n noopSpan) LogEventWithPayload(event string, payload interface{}) {} -func (n noopSpan) Log(data LogData) {} - -// StartSpan belongs to the Tracer interface. -func (n NoopTracer) StartSpan(operationName string, opts ...StartSpanOption) Span { - return defaultNoopSpan -} - -// Inject belongs to the Tracer interface. -func (n NoopTracer) Inject(sp SpanContext, format interface{}, carrier interface{}) error { - return nil -} - -// Extract belongs to the Tracer interface. -func (n NoopTracer) Extract(format interface{}, carrier interface{}) (SpanContext, error) { - return nil, ErrSpanContextNotFound -} diff --git a/vendor/github.com/opentracing/opentracing-go/propagation.go b/vendor/github.com/opentracing/opentracing-go/propagation.go deleted file mode 100644 index 9583fc5..0000000 --- a/vendor/github.com/opentracing/opentracing-go/propagation.go +++ /dev/null @@ -1,176 +0,0 @@ -package opentracing - -import ( - "errors" - "net/http" -) - -/////////////////////////////////////////////////////////////////////////////// -// CORE PROPAGATION INTERFACES: -/////////////////////////////////////////////////////////////////////////////// - -var ( - // ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or - // Tracer.Extract() is not recognized by the Tracer implementation. - ErrUnsupportedFormat = errors.New("opentracing: Unknown or unsupported Inject/Extract format") - - // ErrSpanContextNotFound occurs when the `carrier` passed to - // Tracer.Extract() is valid and uncorrupted but has insufficient - // information to extract a SpanContext. - ErrSpanContextNotFound = errors.New("opentracing: SpanContext not found in Extract carrier") - - // ErrInvalidSpanContext errors occur when Tracer.Inject() is asked to - // operate on a SpanContext which it is not prepared to handle (for - // example, since it was created by a different tracer implementation). - ErrInvalidSpanContext = errors.New("opentracing: SpanContext type incompatible with tracer") - - // ErrInvalidCarrier errors occur when Tracer.Inject() or Tracer.Extract() - // implementations expect a different type of `carrier` than they are - // given. - ErrInvalidCarrier = errors.New("opentracing: Invalid Inject/Extract carrier") - - // ErrSpanContextCorrupted occurs when the `carrier` passed to - // Tracer.Extract() is of the expected type but is corrupted. - ErrSpanContextCorrupted = errors.New("opentracing: SpanContext data corrupted in Extract carrier") -) - -/////////////////////////////////////////////////////////////////////////////// -// BUILTIN PROPAGATION FORMATS: -/////////////////////////////////////////////////////////////////////////////// - -// BuiltinFormat is used to demarcate the values within package `opentracing` -// that are intended for use with the Tracer.Inject() and Tracer.Extract() -// methods. -type BuiltinFormat byte - -const ( - // Binary represents SpanContexts as opaque binary data. - // - // For Tracer.Inject(): the carrier must be an `io.Writer`. - // - // For Tracer.Extract(): the carrier must be an `io.Reader`. - Binary BuiltinFormat = iota - - // TextMap represents SpanContexts as key:value string pairs. - // - // Unlike HTTPHeaders, the TextMap format does not restrict the key or - // value character sets in any way. - // - // For Tracer.Inject(): the carrier must be a `TextMapWriter`. - // - // For Tracer.Extract(): the carrier must be a `TextMapReader`. - TextMap - - // HTTPHeaders represents SpanContexts as HTTP header string pairs. - // - // Unlike TextMap, the HTTPHeaders format requires that the keys and values - // be valid as HTTP headers as-is (i.e., character casing may be unstable - // and special characters are disallowed in keys, values should be - // URL-escaped, etc). - // - // For Tracer.Inject(): the carrier must be a `TextMapWriter`. - // - // For Tracer.Extract(): the carrier must be a `TextMapReader`. - // - // See HTTPHeaderCarrier for an implementation of both TextMapWriter - // and TextMapReader that defers to an http.Header instance for storage. - // For example, Inject(): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // err := span.Tracer().Inject( - // span, opentracing.HTTPHeaders, carrier) - // - // Or Extract(): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // span, err := tracer.Extract( - // opentracing.HTTPHeaders, carrier) - // - HTTPHeaders -) - -// TextMapWriter is the Inject() carrier for the TextMap builtin format. With -// it, the caller can encode a SpanContext for propagation as entries in a map -// of unicode strings. -type TextMapWriter interface { - // Set a key:value pair to the carrier. Multiple calls to Set() for the - // same key leads to undefined behavior. - // - // NOTE: The backing store for the TextMapWriter may contain data unrelated - // to SpanContext. As such, Inject() and Extract() implementations that - // call the TextMapWriter and TextMapReader interfaces must agree on a - // prefix or other convention to distinguish their own key:value pairs. - Set(key, val string) -} - -// TextMapReader is the Extract() carrier for the TextMap builtin format. With it, -// the caller can decode a propagated SpanContext as entries in a map of -// unicode strings. -type TextMapReader interface { - // ForeachKey returns TextMap contents via repeated calls to the `handler` - // function. If any call to `handler` returns a non-nil error, ForeachKey - // terminates and returns that error. - // - // NOTE: The backing store for the TextMapReader may contain data unrelated - // to SpanContext. As such, Inject() and Extract() implementations that - // call the TextMapWriter and TextMapReader interfaces must agree on a - // prefix or other convention to distinguish their own key:value pairs. - // - // The "foreach" callback pattern reduces unnecessary copying in some cases - // and also allows implementations to hold locks while the map is read. - ForeachKey(handler func(key, val string) error) error -} - -// TextMapCarrier allows the use of regular map[string]string -// as both TextMapWriter and TextMapReader. -type TextMapCarrier map[string]string - -// ForeachKey conforms to the TextMapReader interface. -func (c TextMapCarrier) ForeachKey(handler func(key, val string) error) error { - for k, v := range c { - if err := handler(k, v); err != nil { - return err - } - } - return nil -} - -// Set implements Set() of opentracing.TextMapWriter -func (c TextMapCarrier) Set(key, val string) { - c[key] = val -} - -// HTTPHeadersCarrier satisfies both TextMapWriter and TextMapReader. -// -// Example usage for server side: -// -// carrier := opentracing.HttpHeadersCarrier(httpReq.Header) -// spanContext, err := tracer.Extract(opentracing.HttpHeaders, carrier) -// -// Example usage for client side: -// -// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) -// err := tracer.Inject( -// span.Context(), -// opentracing.HttpHeaders, -// carrier) -// -type HTTPHeadersCarrier http.Header - -// Set conforms to the TextMapWriter interface. -func (c HTTPHeadersCarrier) Set(key, val string) { - h := http.Header(c) - h.Add(key, val) -} - -// ForeachKey conforms to the TextMapReader interface. -func (c HTTPHeadersCarrier) ForeachKey(handler func(key, val string) error) error { - for k, vals := range c { - for _, v := range vals { - if err := handler(k, v); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/opentracing/opentracing-go/span.go b/vendor/github.com/opentracing/opentracing-go/span.go deleted file mode 100644 index f6c3234..0000000 --- a/vendor/github.com/opentracing/opentracing-go/span.go +++ /dev/null @@ -1,185 +0,0 @@ -package opentracing - -import ( - "time" - - "github.com/opentracing/opentracing-go/log" -) - -// SpanContext represents Span state that must propagate to descendant Spans and across process -// boundaries (e.g., a tuple). -type SpanContext interface { - // ForeachBaggageItem grants access to all baggage items stored in the - // SpanContext. - // The handler function will be called for each baggage key/value pair. - // The ordering of items is not guaranteed. - // - // The bool return value indicates if the handler wants to continue iterating - // through the rest of the baggage items; for example if the handler is trying to - // find some baggage item by pattern matching the name, it can return false - // as soon as the item is found to stop further iterations. - ForeachBaggageItem(handler func(k, v string) bool) -} - -// Span represents an active, un-finished span in the OpenTracing system. -// -// Spans are created by the Tracer interface. -type Span interface { - // Sets the end timestamp and finalizes Span state. - // - // With the exception of calls to Context() (which are always allowed), - // Finish() must be the last call made to any span instance, and to do - // otherwise leads to undefined behavior. - Finish() - // FinishWithOptions is like Finish() but with explicit control over - // timestamps and log data. - FinishWithOptions(opts FinishOptions) - - // Context() yields the SpanContext for this Span. Note that the return - // value of Context() is still valid after a call to Span.Finish(), as is - // a call to Span.Context() after a call to Span.Finish(). - Context() SpanContext - - // Sets or changes the operation name. - SetOperationName(operationName string) Span - - // Adds a tag to the span. - // - // If there is a pre-existing tag set for `key`, it is overwritten. - // - // Tag values can be numeric types, strings, or bools. The behavior of - // other tag value types is undefined at the OpenTracing level. If a - // tracing system does not know how to handle a particular value type, it - // may ignore the tag, but shall not panic. - SetTag(key string, value interface{}) Span - - // LogFields is an efficient and type-checked way to record key:value - // logging data about a Span, though the programming interface is a little - // more verbose than LogKV(). Here's an example: - // - // span.LogFields( - // log.String("event", "soft error"), - // log.String("type", "cache timeout"), - // log.Int("waited.millis", 1500)) - // - // Also see Span.FinishWithOptions() and FinishOptions.BulkLogData. - LogFields(fields ...log.Field) - - // LogKV is a concise, readable way to record key:value logging data about - // a Span, though unfortunately this also makes it less efficient and less - // type-safe than LogFields(). Here's an example: - // - // span.LogKV( - // "event", "soft error", - // "type", "cache timeout", - // "waited.millis", 1500) - // - // For LogKV (as opposed to LogFields()), the parameters must appear as - // key-value pairs, like - // - // span.LogKV(key1, val1, key2, val2, key3, val3, ...) - // - // The keys must all be strings. The values may be strings, numeric types, - // bools, Go error instances, or arbitrary structs. - // - // (Note to implementors: consider the log.InterleavedKVToFields() helper) - LogKV(alternatingKeyValues ...interface{}) - - // SetBaggageItem sets a key:value pair on this Span and its SpanContext - // that also propagates to descendants of this Span. - // - // SetBaggageItem() enables powerful functionality given a full-stack - // opentracing integration (e.g., arbitrary application data from a mobile - // app can make it, transparently, all the way into the depths of a storage - // system), and with it some powerful costs: use this feature with care. - // - // IMPORTANT NOTE #1: SetBaggageItem() will only propagate baggage items to - // *future* causal descendants of the associated Span. - // - // IMPORTANT NOTE #2: Use this thoughtfully and with care. Every key and - // value is copied into every local *and remote* child of the associated - // Span, and that can add up to a lot of network and cpu overhead. - // - // Returns a reference to this Span for chaining. - SetBaggageItem(restrictedKey, value string) Span - - // Gets the value for a baggage item given its key. Returns the empty string - // if the value isn't found in this Span. - BaggageItem(restrictedKey string) string - - // Provides access to the Tracer that created this Span. - Tracer() Tracer - - // Deprecated: use LogFields or LogKV - LogEvent(event string) - // Deprecated: use LogFields or LogKV - LogEventWithPayload(event string, payload interface{}) - // Deprecated: use LogFields or LogKV - Log(data LogData) -} - -// LogRecord is data associated with a single Span log. Every LogRecord -// instance must specify at least one Field. -type LogRecord struct { - Timestamp time.Time - Fields []log.Field -} - -// FinishOptions allows Span.FinishWithOptions callers to override the finish -// timestamp and provide log data via a bulk interface. -type FinishOptions struct { - // FinishTime overrides the Span's finish time, or implicitly becomes - // time.Now() if FinishTime.IsZero(). - // - // FinishTime must resolve to a timestamp that's >= the Span's StartTime - // (per StartSpanOptions). - FinishTime time.Time - - // LogRecords allows the caller to specify the contents of many LogFields() - // calls with a single slice. May be nil. - // - // None of the LogRecord.Timestamp values may be .IsZero() (i.e., they must - // be set explicitly). Also, they must be >= the Span's start timestamp and - // <= the FinishTime (or time.Now() if FinishTime.IsZero()). Otherwise the - // behavior of FinishWithOptions() is undefined. - // - // If specified, the caller hands off ownership of LogRecords at - // FinishWithOptions() invocation time. - // - // If specified, the (deprecated) BulkLogData must be nil or empty. - LogRecords []LogRecord - - // BulkLogData is DEPRECATED. - BulkLogData []LogData -} - -// LogData is DEPRECATED -type LogData struct { - Timestamp time.Time - Event string - Payload interface{} -} - -// ToLogRecord converts a deprecated LogData to a non-deprecated LogRecord -func (ld *LogData) ToLogRecord() LogRecord { - var literalTimestamp time.Time - if ld.Timestamp.IsZero() { - literalTimestamp = time.Now() - } else { - literalTimestamp = ld.Timestamp - } - rval := LogRecord{ - Timestamp: literalTimestamp, - } - if ld.Payload == nil { - rval.Fields = []log.Field{ - log.String("event", ld.Event), - } - } else { - rval.Fields = []log.Field{ - log.String("event", ld.Event), - log.Object("payload", ld.Payload), - } - } - return rval -} diff --git a/vendor/github.com/opentracing/opentracing-go/tracer.go b/vendor/github.com/opentracing/opentracing-go/tracer.go deleted file mode 100644 index fd77c1d..0000000 --- a/vendor/github.com/opentracing/opentracing-go/tracer.go +++ /dev/null @@ -1,305 +0,0 @@ -package opentracing - -import "time" - -// Tracer is a simple, thin interface for Span creation and SpanContext -// propagation. -type Tracer interface { - - // Create, start, and return a new Span with the given `operationName` and - // incorporate the given StartSpanOption `opts`. (Note that `opts` borrows - // from the "functional options" pattern, per - // http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis) - // - // A Span with no SpanReference options (e.g., opentracing.ChildOf() or - // opentracing.FollowsFrom()) becomes the root of its own trace. - // - // Examples: - // - // var tracer opentracing.Tracer = ... - // - // // The root-span case: - // sp := tracer.StartSpan("GetFeed") - // - // // The vanilla child span case: - // sp := tracer.StartSpan( - // "GetFeed", - // opentracing.ChildOf(parentSpan.Context())) - // - // // All the bells and whistles: - // sp := tracer.StartSpan( - // "GetFeed", - // opentracing.ChildOf(parentSpan.Context()), - // opentracing.Tag("user_agent", loggedReq.UserAgent), - // opentracing.StartTime(loggedReq.Timestamp), - // ) - // - StartSpan(operationName string, opts ...StartSpanOption) Span - - // Inject() takes the `sm` SpanContext instance and injects it for - // propagation within `carrier`. The actual type of `carrier` depends on - // the value of `format`. - // - // OpenTracing defines a common set of `format` values (see BuiltinFormat), - // and each has an expected carrier type. - // - // Other packages may declare their own `format` values, much like the keys - // used by `context.Context` (see - // https://godoc.org/golang.org/x/net/context#WithValue). - // - // Example usage (sans error handling): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // err := tracer.Inject( - // span.Context(), - // opentracing.HTTPHeaders, - // carrier) - // - // NOTE: All opentracing.Tracer implementations MUST support all - // BuiltinFormats. - // - // Implementations may return opentracing.ErrUnsupportedFormat if `format` - // is not supported by (or not known by) the implementation. - // - // Implementations may return opentracing.ErrInvalidCarrier or any other - // implementation-specific error if the format is supported but injection - // fails anyway. - // - // See Tracer.Extract(). - Inject(sm SpanContext, format interface{}, carrier interface{}) error - - // Extract() returns a SpanContext instance given `format` and `carrier`. - // - // OpenTracing defines a common set of `format` values (see BuiltinFormat), - // and each has an expected carrier type. - // - // Other packages may declare their own `format` values, much like the keys - // used by `context.Context` (see - // https://godoc.org/golang.org/x/net/context#WithValue). - // - // Example usage (with StartSpan): - // - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) - // - // // ... assuming the ultimate goal here is to resume the trace with a - // // server-side Span: - // var serverSpan opentracing.Span - // if err == nil { - // span = tracer.StartSpan( - // rpcMethodName, ext.RPCServerOption(clientContext)) - // } else { - // span = tracer.StartSpan(rpcMethodName) - // } - // - // - // NOTE: All opentracing.Tracer implementations MUST support all - // BuiltinFormats. - // - // Return values: - // - A successful Extract returns a SpanContext instance and a nil error - // - If there was simply no SpanContext to extract in `carrier`, Extract() - // returns (nil, opentracing.ErrSpanContextNotFound) - // - If `format` is unsupported or unrecognized, Extract() returns (nil, - // opentracing.ErrUnsupportedFormat) - // - If there are more fundamental problems with the `carrier` object, - // Extract() may return opentracing.ErrInvalidCarrier, - // opentracing.ErrSpanContextCorrupted, or implementation-specific - // errors. - // - // See Tracer.Inject(). - Extract(format interface{}, carrier interface{}) (SpanContext, error) -} - -// StartSpanOptions allows Tracer.StartSpan() callers and implementors a -// mechanism to override the start timestamp, specify Span References, and make -// a single Tag or multiple Tags available at Span start time. -// -// StartSpan() callers should look at the StartSpanOption interface and -// implementations available in this package. -// -// Tracer implementations can convert a slice of `StartSpanOption` instances -// into a `StartSpanOptions` struct like so: -// -// func StartSpan(opName string, opts ...opentracing.StartSpanOption) { -// sso := opentracing.StartSpanOptions{} -// for _, o := range opts { -// o.Apply(&sso) -// } -// ... -// } -// -type StartSpanOptions struct { - // Zero or more causal references to other Spans (via their SpanContext). - // If empty, start a "root" Span (i.e., start a new trace). - References []SpanReference - - // StartTime overrides the Span's start time, or implicitly becomes - // time.Now() if StartTime.IsZero(). - StartTime time.Time - - // Tags may have zero or more entries; the restrictions on map values are - // identical to those for Span.SetTag(). May be nil. - // - // If specified, the caller hands off ownership of Tags at - // StartSpan() invocation time. - Tags map[string]interface{} -} - -// StartSpanOption instances (zero or more) may be passed to Tracer.StartSpan. -// -// StartSpanOption borrows from the "functional options" pattern, per -// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis -type StartSpanOption interface { - Apply(*StartSpanOptions) -} - -// SpanReferenceType is an enum type describing different categories of -// relationships between two Spans. If Span-2 refers to Span-1, the -// SpanReferenceType describes Span-1 from Span-2's perspective. For example, -// ChildOfRef means that Span-1 created Span-2. -// -// NOTE: Span-1 and Span-2 do *not* necessarily depend on each other for -// completion; e.g., Span-2 may be part of a background job enqueued by Span-1, -// or Span-2 may be sitting in a distributed queue behind Span-1. -type SpanReferenceType int - -const ( - // ChildOfRef refers to a parent Span that caused *and* somehow depends - // upon the new child Span. Often (but not always), the parent Span cannot - // finish until the child Span does. - // - // An timing diagram for a ChildOfRef that's blocked on the new Span: - // - // [-Parent Span---------] - // [-Child Span----] - // - // See http://opentracing.io/spec/ - // - // See opentracing.ChildOf() - ChildOfRef SpanReferenceType = iota - - // FollowsFromRef refers to a parent Span that does not depend in any way - // on the result of the new child Span. For instance, one might use - // FollowsFromRefs to describe pipeline stages separated by queues, - // or a fire-and-forget cache insert at the tail end of a web request. - // - // A FollowsFromRef Span is part of the same logical trace as the new Span: - // i.e., the new Span is somehow caused by the work of its FollowsFromRef. - // - // All of the following could be valid timing diagrams for children that - // "FollowFrom" a parent. - // - // [-Parent Span-] [-Child Span-] - // - // - // [-Parent Span--] - // [-Child Span-] - // - // - // [-Parent Span-] - // [-Child Span-] - // - // See http://opentracing.io/spec/ - // - // See opentracing.FollowsFrom() - FollowsFromRef -) - -// SpanReference is a StartSpanOption that pairs a SpanReferenceType and a -// referenced SpanContext. See the SpanReferenceType documentation for -// supported relationships. If SpanReference is created with -// ReferencedContext==nil, it has no effect. Thus it allows for a more concise -// syntax for starting spans: -// -// sc, _ := tracer.Extract(someFormat, someCarrier) -// span := tracer.StartSpan("operation", opentracing.ChildOf(sc)) -// -// The `ChildOf(sc)` option above will not panic if sc == nil, it will just -// not add the parent span reference to the options. -type SpanReference struct { - Type SpanReferenceType - ReferencedContext SpanContext -} - -// Apply satisfies the StartSpanOption interface. -func (r SpanReference) Apply(o *StartSpanOptions) { - if r.ReferencedContext != nil { - o.References = append(o.References, r) - } -} - -// ChildOf returns a StartSpanOption pointing to a dependent parent span. -// If sc == nil, the option has no effect. -// -// See ChildOfRef, SpanReference -func ChildOf(sc SpanContext) SpanReference { - return SpanReference{ - Type: ChildOfRef, - ReferencedContext: sc, - } -} - -// FollowsFrom returns a StartSpanOption pointing to a parent Span that caused -// the child Span but does not directly depend on its result in any way. -// If sc == nil, the option has no effect. -// -// See FollowsFromRef, SpanReference -func FollowsFrom(sc SpanContext) SpanReference { - return SpanReference{ - Type: FollowsFromRef, - ReferencedContext: sc, - } -} - -// StartTime is a StartSpanOption that sets an explicit start timestamp for the -// new Span. -type StartTime time.Time - -// Apply satisfies the StartSpanOption interface. -func (t StartTime) Apply(o *StartSpanOptions) { - o.StartTime = time.Time(t) -} - -// Tags are a generic map from an arbitrary string key to an opaque value type. -// The underlying tracing system is responsible for interpreting and -// serializing the values. -type Tags map[string]interface{} - -// Apply satisfies the StartSpanOption interface. -func (t Tags) Apply(o *StartSpanOptions) { - if o.Tags == nil { - o.Tags = make(map[string]interface{}) - } - for k, v := range t { - o.Tags[k] = v - } -} - -// Tag may be passed as a StartSpanOption to add a tag to new spans, -// or its Set method may be used to apply the tag to an existing Span, -// for example: -// -// tracer.StartSpan("opName", Tag{"Key", value}) -// -// or -// -// Tag{"key", value}.Set(span) -type Tag struct { - Key string - Value interface{} -} - -// Apply satisfies the StartSpanOption interface. -func (t Tag) Apply(o *StartSpanOptions) { - if o.Tags == nil { - o.Tags = make(map[string]interface{}) - } - o.Tags[t.Key] = t.Value -} - -// Set applies the tag to an existing Span. -func (t Tag) Set(s Span) { - s.SetTag(t.Key, t.Value) -} diff --git a/vendor/github.com/pkg/errors/.gitignore b/vendor/github.com/pingcap/errors/.gitignore similarity index 97% rename from vendor/github.com/pkg/errors/.gitignore rename to vendor/github.com/pingcap/errors/.gitignore index daf913b..0c9e329 100644 --- a/vendor/github.com/pkg/errors/.gitignore +++ b/vendor/github.com/pingcap/errors/.gitignore @@ -6,6 +6,7 @@ # Folders _obj _test +.idea # Architecture specific extensions/prefixes *.[568vq] diff --git a/vendor/github.com/pingcap/errors/.travis.yml b/vendor/github.com/pingcap/errors/.travis.yml new file mode 100644 index 0000000..eaaabc5 --- /dev/null +++ b/vendor/github.com/pingcap/errors/.travis.yml @@ -0,0 +1,11 @@ +arch: + - amd64 + +language: go +go_import_path: github.com/pingcap/errors +go: + - 1.13.x + - stable + +script: + - go test -v ./... diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pingcap/errors/LICENSE similarity index 100% rename from vendor/github.com/pkg/errors/LICENSE rename to vendor/github.com/pingcap/errors/LICENSE diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pingcap/errors/README.md similarity index 78% rename from vendor/github.com/pkg/errors/README.md rename to vendor/github.com/pingcap/errors/README.md index 54dfdcb..b97656a 100644 --- a/vendor/github.com/pkg/errors/README.md +++ b/vendor/github.com/pingcap/errors/README.md @@ -2,7 +2,7 @@ Package errors provides simple error handling primitives. -`go get github.com/pkg/errors` +`go get github.com/pingcap/errors` The traditional error handling idiom in Go is roughly akin to ```go @@ -41,18 +41,11 @@ default: [Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). -## Roadmap - -With the upcoming [Go2 error proposals](https://go.googlesource.com/proposal/+/master/design/go2draft.md) this package is moving into maintenance mode. The roadmap for a 1.0 release is as follows: - -- 0.9. Remove pre Go 1.9 and Go 1.10 support, address outstanding pull requests (if possible) -- 1.0. Final release. - ## Contributing -Because of the Go2 errors changes, this package is not accepting proposals for new functionality. With that said, we welcome pull requests, bug fixes and issue reports. +We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. -Before sending a PR, please discuss your change by raising an issue. +Before proposing a change, please discuss your change by raising an issue. ## License diff --git a/vendor/github.com/pingcap/errors/compatible_shim.go b/vendor/github.com/pingcap/errors/compatible_shim.go new file mode 100644 index 0000000..0835a0c --- /dev/null +++ b/vendor/github.com/pingcap/errors/compatible_shim.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 errors + +import ( + "encoding/json" + "strconv" + "strings" +) + +// class2RFCCode is used for compatible with old version of TiDB. When +// marshal Error to json, old version of TiDB contain a 'class' field +// which is represented for error class. In order to parse and convert +// json to errors.Error, using this map to convert error class to RFC +// error code text. here is reference: +// https://github.com/pingcap/parser/blob/release-3.0/terror/terror.go#L58 +var class2RFCCode = map[int]string{ + 1: "autoid", + 2: "ddl", + 3: "domain", + 4: "evaluator", + 5: "executor", + 6: "expression", + 7: "admin", + 8: "kv", + 9: "meta", + 10: "planner", + 11: "parser", + 12: "perfschema", + 13: "privilege", + 14: "schema", + 15: "server", + 16: "struct", + 17: "variable", + 18: "xeval", + 19: "table", + 20: "types", + 21: "global", + 22: "mocktikv", + 23: "json", + 24: "tikv", + 25: "session", + 26: "plugin", + 27: "util", +} +var rfcCode2class map[string]int + +func init() { + rfcCode2class = make(map[string]int) + for k, v := range class2RFCCode { + rfcCode2class[v] = k + } +} + +// MarshalJSON implements json.Marshaler interface. +// aware that this function cannot save a 'registered' status, +// since we cannot access the registry when unmarshaling, +// and the original global registry would be removed here. +// This function is reserved for compatibility. +func (e *Error) MarshalJSON() ([]byte, error) { + ec := strings.Split(string(e.codeText), ":")[0] + return json.Marshal(&jsonError{ + Class: rfcCode2class[ec], + Code: int(e.code), + Msg: e.GetMsg(), + RFCCode: string(e.codeText), + }) +} + +// UnmarshalJSON implements json.Unmarshaler interface. +// aware that this function cannot create a 'registered' error, +// since we cannot access the registry in this context, +// and the original global registry is removed. +// This function is reserved for compatibility. +func (e *Error) UnmarshalJSON(data []byte) error { + tErr := &jsonError{} + if err := json.Unmarshal(data, &tErr); err != nil { + return Trace(err) + } + e.codeText = ErrCodeText(tErr.RFCCode) + if tErr.RFCCode == "" && tErr.Class > 0 { + e.codeText = ErrCodeText(class2RFCCode[tErr.Class] + ":" + strconv.Itoa(tErr.Code)) + } + e.code = ErrCode(tErr.Code) + e.message = tErr.Msg + return nil +} diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pingcap/errors/errors.go similarity index 58% rename from vendor/github.com/pkg/errors/errors.go rename to vendor/github.com/pingcap/errors/errors.go index 161aea2..c303433 100644 --- a/vendor/github.com/pkg/errors/errors.go +++ b/vendor/github.com/pingcap/errors/errors.go @@ -6,32 +6,31 @@ // return err // } // -// which when applied recursively up the call stack results in error reports +// which applied recursively up the call stack results in error reports // without context or debugging information. The errors package allows // programmers to add context to the failure path in their code in a way // that does not destroy the original value of the error. // // Adding context to an error // -// The errors.Wrap function returns a new error that adds context to the -// original error by recording a stack trace at the point Wrap is called, -// together with the supplied message. For example +// The errors.Annotate function returns a new error that adds context to the +// original error by recording a stack trace at the point Annotate is called, +// and the supplied message. For example // // _, err := ioutil.ReadAll(r) // if err != nil { -// return errors.Wrap(err, "read failed") +// return errors.Annotate(err, "read failed") // } // -// If additional control is required, the errors.WithStack and -// errors.WithMessage functions destructure errors.Wrap into its component -// operations: annotating an error with a stack trace and with a message, -// respectively. +// If additional control is required the errors.AddStack and errors.WithMessage +// functions destructure errors.Annotate into its component operations of annotating +// an error with a stack trace and an a message, respectively. // // Retrieving the cause of an error // -// Using errors.Wrap constructs a stack of errors, adding context to the +// Using errors.Annotate constructs a stack of errors, adding context to the // preceding error. Depending on the nature of the error it may be necessary -// to reverse the operation of errors.Wrap to retrieve the original error +// to reverse the operation of errors.Annotate to retrieve the original error // for inspection. Any error value which implements this interface // // type causer interface { @@ -39,7 +38,7 @@ // } // // can be inspected by errors.Cause. errors.Cause will recursively retrieve -// the topmost error that does not implement causer, which is assumed to be +// the topmost error which does not implement causer, which is assumed to be // the original cause. For example: // // switch err := errors.Cause(err).(type) { @@ -49,30 +48,26 @@ // // unknown error // } // -// Although the causer interface is not exported by this package, it is -// considered a part of its stable public interface. +// causer interface is not exported by this package, but is considered a part +// of stable public API. +// errors.Unwrap is also available: this will retrieve the next error in the chain. // // Formatted printing of errors // // All error values returned from this package implement fmt.Formatter and can -// be formatted by the fmt package. The following verbs are supported: +// be formatted by the fmt package. The following verbs are supported // // %s print the error. If the error has a Cause it will be -// printed recursively. +// printed recursively // %v see %s // %+v extended format. Each Frame of the error's StackTrace will // be printed in detail. // // Retrieving the stack trace of an error or wrapper // -// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are -// invoked. This information can be retrieved with the following interface: -// -// type stackTracer interface { -// StackTrace() errors.StackTrace -// } -// -// The returned errors.StackTrace type is defined as +// New, Errorf, Annotate, and Annotatef record a stack trace at the point they are invoked. +// This information can be retrieved with the StackTracer interface that returns +// a StackTrace. Where errors.StackTrace is defined as // // type StackTrace []Frame // @@ -80,16 +75,15 @@ // the fmt.Formatter interface that can be used for printing information about // the stack trace of this error. For example: // -// if err, ok := err.(stackTracer); ok { -// for _, f := range err.StackTrace() { +// if stacked := errors.GetStackTracer(err); stacked != nil { +// for _, f := range stacked.StackTrace() { // fmt.Printf("%+s:%d\n", f, f) // } // } // -// Although the stackTracer interface is not exported by this package, it is -// considered a part of its stable public interface. -// // See the documentation for Frame.Format for more details. +// +// errors.Find can be used to search for an error in the error chain. package errors import ( @@ -116,6 +110,21 @@ func Errorf(format string, args ...interface{}) error { } } +// StackTraceAware is an optimization to avoid repetitive traversals of an error chain. +// HasStack checks for this marker first. +// Annotate/Wrap and Annotatef/Wrapf will produce this marker. +type StackTraceAware interface { + HasStack() bool +} + +// HasStack tells whether a StackTracer exists in the error chain +func HasStack(err error) bool { + if errWithStack, ok := err.(StackTraceAware); ok { + return errWithStack.HasStack() + } + return GetStackTracer(err) != nil +} + // fundamental is an error that has a message and a stack, but no caller. type fundamental struct { msg string @@ -142,16 +151,29 @@ func (f *fundamental) Format(s fmt.State, verb rune) { // WithStack annotates err with a stack trace at the point WithStack was called. // If err is nil, WithStack returns nil. +// +// For most use cases this is deprecated and AddStack should be used (which will ensure just one stack trace). +// However, one may want to use this in some situations, for example to create a 2nd trace across a goroutine. func WithStack(err error) error { if err == nil { return nil } + return &withStack{ err, callers(), } } +// AddStack is similar to WithStack. +// However, it will first check with HasStack to see if a stack trace already exists in the causer chain before creating another one. +func AddStack(err error) error { + if HasStack(err) { + return err + } + return WithStack(err) +} + type withStack struct { error *stack @@ -181,13 +203,18 @@ func (w *withStack) Format(s fmt.State, verb rune) { // Wrap returns an error annotating err with a stack trace // at the point Wrap is called, and the supplied message. // If err is nil, Wrap returns nil. +// +// For most use cases this is deprecated in favor of Annotate. +// Annotate avoids creating duplicate stack traces. func Wrap(err error, message string) error { if err == nil { return nil } + hasStack := HasStack(err) err = &withMessage{ - cause: err, - msg: message, + cause: err, + msg: message, + causeHasStack: hasStack, } return &withStack{ err, @@ -196,15 +223,20 @@ func Wrap(err error, message string) error { } // Wrapf returns an error annotating err with a stack trace -// at the point Wrapf is called, and the format specifier. +// at the point Wrapf is call, and the format specifier. // If err is nil, Wrapf returns nil. +// +// For most use cases this is deprecated in favor of Annotatef. +// Annotatef avoids creating duplicate stack traces. func Wrapf(err error, format string, args ...interface{}) error { if err == nil { return nil } + hasStack := HasStack(err) err = &withMessage{ - cause: err, - msg: fmt.Sprintf(format, args...), + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, } return &withStack{ err, @@ -219,33 +251,24 @@ func WithMessage(err error, message string) error { return nil } return &withMessage{ - cause: err, - msg: message, - } -} - -// WithMessagef annotates err with the format specifier. -// If err is nil, WithMessagef returns nil. -func WithMessagef(err error, format string, args ...interface{}) error { - if err == nil { - return nil - } - return &withMessage{ - cause: err, - msg: fmt.Sprintf(format, args...), + cause: err, + msg: message, + causeHasStack: HasStack(err), } } type withMessage struct { - cause error - msg string + cause error + msg string + causeHasStack bool } func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } func (w *withMessage) Cause() error { return w.cause } // Unwrap provides compatibility for Go 1.13 error chains. -func (w *withMessage) Unwrap() error { return w.cause } +func (w *withMessage) Unwrap() error { return w.cause } +func (w *withMessage) HasStack() bool { return w.causeHasStack } func (w *withMessage) Format(s fmt.State, verb rune) { switch verb { @@ -256,8 +279,10 @@ func (w *withMessage) Format(s fmt.State, verb rune) { return } fallthrough - case 's', 'q': + case 's': io.WriteString(s, w.Error()) + case 'q': + fmt.Fprintf(s, "%q", w.Error()) } } @@ -273,16 +298,35 @@ func (w *withMessage) Format(s fmt.State, verb rune) { // be returned. If the error is nil, nil will be returned without further // investigation. func Cause(err error) error { + cause := Unwrap(err) + if cause == nil { + return err + } + return Cause(cause) +} + +// Unwrap uses causer to return the next error in the chain or nil. +// This goes one-level deeper, whereas Cause goes as far as possible +func Unwrap(err error) error { type causer interface { Cause() error } + if unErr, ok := err.(causer); ok { + return unErr.Cause() + } + return nil +} - for err != nil { - cause, ok := err.(causer) - if !ok { - break +// Find an error in the chain that matches a test function. +// returns nil if no error is found. +func Find(origErr error, test func(error) bool) error { + var foundErr error + WalkDeep(origErr, func(err error) bool { + if test(err) { + foundErr = err + return true } - err = cause.Cause() - } - return err + return false + }) + return foundErr } diff --git a/vendor/github.com/pingcap/errors/group.go b/vendor/github.com/pingcap/errors/group.go new file mode 100644 index 0000000..e5a969a --- /dev/null +++ b/vendor/github.com/pingcap/errors/group.go @@ -0,0 +1,42 @@ +package errors + +// ErrorGroup is an interface for multiple errors that are not a chain. +// This happens for example when executing multiple operations in parallel. +type ErrorGroup interface { + Errors() []error +} + +// Errors uses the ErrorGroup interface to return a slice of errors. +// If the ErrorGroup interface is not implemented it returns an array containing just the given error. +func Errors(err error) []error { + if eg, ok := err.(ErrorGroup); ok { + return eg.Errors() + } + return []error{err} +} + +// WalkDeep does a depth-first traversal of all errors. +// Any ErrorGroup is traversed (after going deep). +// The visitor function can return true to end the traversal early +// In that case, WalkDeep will return true, otherwise false. +func WalkDeep(err error, visitor func(err error) bool) bool { + // Go deep + unErr := err + for unErr != nil { + if done := visitor(unErr); done { + return true + } + unErr = Unwrap(unErr) + } + + // Go wide + if group, ok := err.(ErrorGroup); ok { + for _, err := range group.Errors() { + if early := WalkDeep(err, visitor); early { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/pingcap/errors/juju_adaptor.go b/vendor/github.com/pingcap/errors/juju_adaptor.go new file mode 100644 index 0000000..5e000aa --- /dev/null +++ b/vendor/github.com/pingcap/errors/juju_adaptor.go @@ -0,0 +1,154 @@ +package errors + +import ( + "fmt" + "strings" +) + +// ==================== juju adaptor start ======================== + +// Trace just calls AddStack. +func Trace(err error) error { + if err == nil { + return nil + } + return AddStack(err) +} + +// Annotate adds a message and ensures there is a stack trace. +func Annotate(err error, message string) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: message, + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +// Annotatef adds a message and ensures there is a stack trace. +func Annotatef(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +var emptyStack stack + +// NewNoStackError creates error without error stack +// later duplicate trace will no longer generate Stack too. +func NewNoStackError(msg string) error { + return &fundamental{ + msg: msg, + stack: &emptyStack, + } +} + +// NewNoStackErrorf creates error with error stack and formats according +// to a format specifier and returns the string as a value that satisfies error. +func NewNoStackErrorf(format string, args ...interface{}) error { + return &fundamental{ + msg: fmt.Sprintf(format, args...), + stack: &emptyStack, + } +} + +// SuspendStack suspends stack generate for error. +func SuspendStack(err error) error { + if err == nil { + return err + } + cleared := clearStack(err) + if cleared { + return err + } + return &withStack{ + err, + &emptyStack, + } +} + +func clearStack(err error) (cleared bool) { + switch typedErr := err.(type) { + case *withMessage: + return clearStack(typedErr.Cause()) + case *fundamental: + typedErr.stack = &emptyStack + return true + case *withStack: + typedErr.stack = &emptyStack + clearStack(typedErr.Cause()) + return true + default: + return false + } +} + +// ErrorStack will format a stack trace if it is available, otherwise it will be Error() +// If the error is nil, the empty string is returned +// Note that this just calls fmt.Sprintf("%+v", err) +func ErrorStack(err error) string { + if err == nil { + return "" + } + return fmt.Sprintf("%+v", err) +} + +// IsNotFound reports whether err was not found error. +func IsNotFound(err error) bool { + return strings.Contains(err.Error(), "not found") +} + +// NotFoundf represents an error with not found message. +func NotFoundf(format string, args ...interface{}) error { + return Errorf(format+" not found", args...) +} + +// BadRequestf represents an error with bad request message. +func BadRequestf(format string, args ...interface{}) error { + return Errorf(format+" bad request", args...) +} + +// NotSupportedf represents an error with not supported message. +func NotSupportedf(format string, args ...interface{}) error { + return Errorf(format+" not supported", args...) +} + +// NotValidf represents an error with not valid message. +func NotValidf(format string, args ...interface{}) error { + return Errorf(format+" not valid", args...) +} + +// IsAlreadyExists reports whether err was already exists error. +func IsAlreadyExists(err error) bool { + return strings.Contains(err.Error(), "already exists") +} + +// AlreadyExistsf represents an error with already exists message. +func AlreadyExistsf(format string, args ...interface{}) error { + return Errorf(format+" already exists", args...) +} + +// ==================== juju adaptor end ======================== diff --git a/vendor/github.com/pingcap/errors/normalize.go b/vendor/github.com/pingcap/errors/normalize.go new file mode 100644 index 0000000..34a4745 --- /dev/null +++ b/vendor/github.com/pingcap/errors/normalize.go @@ -0,0 +1,377 @@ +// 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 errors + +import ( + "fmt" + "runtime" + "strconv" + + "go.uber.org/atomic" +) + +var _ fmt.Formatter = (*redactFormatter)(nil) + +// RedactLogEnabled defines whether the arguments of Error need to be redacted. +var RedactLogEnabled atomic.String + +const ( + RedactLogEnable string = "ON" + RedactLogDisable = "OFF" + RedactLogMarker = "MARKER" +) + +// ErrCode represents a specific error type in a error class. +// Same error code can be used in different error classes. +type ErrCode int + +// ErrCodeText is a textual error code that represents a specific error type in a error class. +type ErrCodeText string + +type ErrorID string +type RFCErrorCode string + +// Error is the 'prototype' of a type of errors. +// Use DefineError to make a *Error: +// var ErrUnavailable = errors.Normalize("Region %d is unavailable", errors.RFCCodeText("Unavailable")) +// +// "throw" it at runtime: +// +// func Somewhat() error { +// ... +// if err != nil { +// // generate a stackful error use the message template at defining, +// // also see FastGen(it's stackless), GenWithStack(it uses custom message template). +// return ErrUnavailable.GenWithStackByArgs(region.ID) +// } +// } +// +// testing whether an error belongs to a prototype: +// +// if ErrUnavailable.Equal(err) { +// // handle this error. +// } +type Error struct { + code ErrCode + // codeText is the textual describe of the error code + codeText ErrCodeText + // message is a template of the description of this error. + // printf-style formatting is enabled. + message string + // redactArgsPos defines the positions of arguments in message that need to be redacted. + // And it is controlled by the global var RedactLogEnabled. + // For example, an original error is `Duplicate entry 'PRIMARY' for key 'key'`, + // when RedactLogEnabled is ON and redactArgsPos is [0, 1], the error is `Duplicate entry '?' for key '?'`. + // when RedactLogEnabled is MARKER and redactArgsPos is [0, 1], the error is `Duplicate entry '‹..›' for key '‹..›'`. + redactArgsPos []int + // Cause is used to warp some third party error. + cause error + args []interface{} + file string + line int +} + +// Code returns the numeric code of this error. +// ID() will return textual error if there it is, +// when you just want to get the purely numeric error +// (e.g., for mysql protocol transmission.), this would be useful. +func (e *Error) Code() ErrCode { + return e.code +} + +// Code returns ErrorCode, by the RFC: +// +// The error code is a 3-tuple of abbreviated component name, error class and error code, +// joined by a colon like {Component}:{ErrorClass}:{InnerErrorCode}. +func (e *Error) RFCCode() RFCErrorCode { + return RFCErrorCode(e.ID()) +} + +// ID returns the ID of this error. +func (e *Error) ID() ErrorID { + if e.codeText != "" { + return ErrorID(e.codeText) + } + return ErrorID(strconv.Itoa(int(e.code))) +} + +// Location returns the location where the error is created, +// implements juju/errors locationer interface. +func (e *Error) Location() (file string, line int) { + return e.file, e.line +} + +// MessageTemplate returns the error message template of this error. +func (e *Error) MessageTemplate() string { + return e.message +} + +// Args returns the message arguments of this error. +func (e *Error) Args() []interface{} { + return e.args +} + +// Error implements error interface. +func (e *Error) Error() string { + if e == nil { + return "" + } + describe := e.codeText + if len(describe) == 0 { + describe = ErrCodeText(strconv.Itoa(int(e.code))) + } + if e.cause != nil { + return fmt.Sprintf("[%s]%s: %s", e.RFCCode(), e.GetMsg(), e.cause.Error()) + } + return fmt.Sprintf("[%s]%s", e.RFCCode(), e.GetMsg()) +} + +func (e *Error) GetMsg() string { + if len(e.args) > 0 { + return fmt.Sprintf(e.message, e.args...) + } + return e.message +} + +func (e *Error) fillLineAndFile(skip int) { + // skip this + _, file, line, ok := runtime.Caller(skip + 1) + if !ok { + e.file = "" + e.line = -1 + return + } + e.file = file + e.line = line +} + +// GenWithStack generates a new *Error with the same class and code, and a new formatted message. +func (e *Error) GenWithStack(format string, args ...interface{}) error { + // TODO: RedactErrorArg + err := *e + err.message = format + err.args = args + err.fillLineAndFile(1) + return AddStack(&err) +} + +// GenWithStackByArgs generates a new *Error with the same class and code, and new arguments. +func (e *Error) GenWithStackByArgs(args ...interface{}) error { + RedactErrorArg(args, e.redactArgsPos) + err := *e + err.args = args + err.fillLineAndFile(1) + return AddStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new formatted message. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGen(format string, args ...interface{}) error { + // TODO: RedactErrorArg + err := *e + err.message = format + err.args = args + return SuspendStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new arguments. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGenByArgs(args ...interface{}) error { + RedactErrorArg(args, e.redactArgsPos) + err := *e + err.args = args + return SuspendStack(&err) +} + +// Equal checks if err is equal to e. +func (e *Error) Equal(err error) bool { + originErr := Cause(err) + if originErr == nil { + return false + } + if error(e) == originErr { + return true + } + inErr, ok := originErr.(*Error) + if !ok { + return false + } + idEquals := e.ID() == inErr.ID() + return idEquals +} + +// NotEqual checks if err is not equal to e. +func (e *Error) NotEqual(err error) bool { + return !e.Equal(err) +} + +// RedactErrorArg redacts the args by position if RedactLogEnabled is enabled. +func RedactErrorArg(args []interface{}, position []int) { + switch RedactLogEnabled.Load() { + case RedactLogEnable: + for _, pos := range position { + if len(args) > pos { + args[pos] = "?" + } + } + case RedactLogMarker: + for _, pos := range position { + if len(args) > pos { + args[pos] = &redactFormatter{args[pos]} + } + } + } +} + +// ErrorEqual returns a boolean indicating whether err1 is equal to err2. +func ErrorEqual(err1, err2 error) bool { + e1 := Cause(err1) + e2 := Cause(err2) + + if e1 == e2 { + return true + } + + if e1 == nil || e2 == nil { + return e1 == e2 + } + + te1, ok1 := e1.(*Error) + te2, ok2 := e2.(*Error) + if ok1 && ok2 { + return te1.Equal(te2) + } + + return e1.Error() == e2.Error() +} + +// ErrorNotEqual returns a boolean indicating whether err1 isn't equal to err2. +func ErrorNotEqual(err1, err2 error) bool { + return !ErrorEqual(err1, err2) +} + +type jsonError struct { + // Deprecated field, please use `RFCCode` instead. + Class int `json:"class"` + Code int `json:"code"` + Msg string `json:"message"` + RFCCode string `json:"rfccode"` +} + +func (e *Error) Wrap(err error) *Error { + if err != nil { + newErr := *e + newErr.cause = err + return &newErr + } + return nil +} + +// Unwrap returns cause of the error. +// It allows Error to work with errors.Is() and errors.As() from the Go +// standard package. +func (e *Error) Unwrap() error { + if e == nil { + return nil + } + return e.cause +} + +// Is checks if e has the same error ID with other. +// It allows Error to work with errors.Is() from the Go standard package. +func (e *Error) Is(other error) bool { + err, ok := other.(*Error) + if !ok { + return false + } + return (e == nil && err == nil) || (e != nil && err != nil && e.ID() == err.ID()) +} + +func (e *Error) Cause() error { + root := Unwrap(e.cause) + if root == nil { + return e.cause + } + return root +} + +func (e *Error) FastGenWithCause(args ...interface{}) error { + err := *e + if e.cause != nil { + err.message = e.cause.Error() + } + err.args = args + return SuspendStack(&err) +} + +func (e *Error) GenWithStackByCause(args ...interface{}) error { + err := *e + if e.cause != nil { + err.message = e.cause.Error() + } + err.args = args + err.fillLineAndFile(1) + return AddStack(&err) +} + +type NormalizeOption func(*Error) + +func RedactArgs(pos []int) NormalizeOption { + return func(e *Error) { + e.redactArgsPos = pos + } +} + +// RFCCodeText returns a NormalizeOption to set RFC error code. +func RFCCodeText(codeText string) NormalizeOption { + return func(e *Error) { + e.codeText = ErrCodeText(codeText) + } +} + +// MySQLErrorCode returns a NormalizeOption to set error code. +func MySQLErrorCode(code int) NormalizeOption { + return func(e *Error) { + e.code = ErrCode(code) + } +} + +// Normalize creates a new Error object. +func Normalize(message string, opts ...NormalizeOption) *Error { + e := &Error{ + message: message, + } + for _, opt := range opts { + opt(e) + } + return e +} + +type redactFormatter struct { + arg interface{} +} + +func (e *redactFormatter) Format(f fmt.State, verb rune) { + origin := fmt.Sprintf(fmt.FormatString(f, verb), e.arg) + fmt.Fprintf(f, "‹") + for _, c := range origin { + if c == '‹' || c == '›' { + fmt.Fprintf(f, "%c", c) + fmt.Fprintf(f, "%c", c) + } else { + fmt.Fprintf(f, "%c", c) + } + } + fmt.Fprintf(f, "›") +} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pingcap/errors/stack.go similarity index 50% rename from vendor/github.com/pkg/errors/stack.go rename to vendor/github.com/pingcap/errors/stack.go index 779a834..bb1e6a8 100644 --- a/vendor/github.com/pkg/errors/stack.go +++ b/vendor/github.com/pingcap/errors/stack.go @@ -1,6 +1,7 @@ package errors import ( + "bytes" "fmt" "io" "path" @@ -9,9 +10,29 @@ import ( "strings" ) +// StackTracer retrieves the StackTrace +// Generally you would want to use the GetStackTracer function to do that. +type StackTracer interface { + StackTrace() StackTrace +} + +// GetStackTracer will return the first StackTracer in the causer chain. +// This function is used by AddStack to avoid creating redundant stack traces. +// +// You can also use the StackTracer interface on the returned error to get the stack trace. +func GetStackTracer(origErr error) StackTracer { + var stacked StackTracer + WalkDeep(origErr, func(err error) bool { + if stackTracer, ok := err.(StackTracer); ok { + stacked = stackTracer + return true + } + return false + }) + return stacked +} + // Frame represents a program counter inside a stack frame. -// For historical reasons if Frame is interpreted as a uintptr -// its value represents the program counter + 1. type Frame uintptr // pc returns the program counter for this frame; @@ -40,15 +61,6 @@ func (f Frame) line() int { return line } -// name returns the name of this function, if known. -func (f Frame) name() string { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return "unknown" - } - return fn.Name() -} - // Format formats the frame according to the fmt.Formatter interface. // // %s source file @@ -62,35 +74,38 @@ func (f Frame) name() string { // GOPATH separated by \n\t (\n\t) // %+v equivalent to %+s:%d func (f Frame) Format(s fmt.State, verb rune) { + f.format(s, s, verb) +} + +// format allows stack trace printing calls to be made with a bytes.Buffer. +func (f Frame) format(w io.Writer, s fmt.State, verb rune) { switch verb { case 's': switch { case s.Flag('+'): - io.WriteString(s, f.name()) - io.WriteString(s, "\n\t") - io.WriteString(s, f.file()) + pc := f.pc() + fn := runtime.FuncForPC(pc) + if fn == nil { + io.WriteString(w, "unknown") + } else { + file, _ := fn.FileLine(pc) + io.WriteString(w, fn.Name()) + io.WriteString(w, "\n\t") + io.WriteString(w, file) + } default: - io.WriteString(s, path.Base(f.file())) + io.WriteString(w, path.Base(f.file())) } case 'd': - io.WriteString(s, strconv.Itoa(f.line())) + io.WriteString(w, strconv.Itoa(f.line())) case 'n': - io.WriteString(s, funcname(f.name())) + name := runtime.FuncForPC(f.pc()).Name() + io.WriteString(w, funcname(name)) case 'v': - f.Format(s, 's') - io.WriteString(s, ":") - f.Format(s, 'd') - } -} - -// MarshalText formats a stacktrace Frame as a text string. The output is the -// same as that of fmt.Sprintf("%+v", f), but without newlines or tabs. -func (f Frame) MarshalText() ([]byte, error) { - name := f.name() - if name == "unknown" { - return []byte(name), nil + f.format(w, s, 's') + io.WriteString(w, ":") + f.format(w, s, 'd') } - return []byte(fmt.Sprintf("%s %s:%d", name, f.file(), f.line())), nil } // StackTrace is stack of Frames from innermost (newest) to outermost (oldest). @@ -105,37 +120,50 @@ type StackTrace []Frame // // %+v Prints filename, function, and line number for each Frame in the stack. func (st StackTrace) Format(s fmt.State, verb rune) { + var b bytes.Buffer switch verb { case 'v': switch { case s.Flag('+'): - for _, f := range st { - io.WriteString(s, "\n") - f.Format(s, verb) + b.Grow(len(st) * stackMinLen) + for _, fr := range st { + b.WriteByte('\n') + fr.format(&b, s, verb) } case s.Flag('#'): - fmt.Fprintf(s, "%#v", []Frame(st)) + fmt.Fprintf(&b, "%#v", []Frame(st)) default: - st.formatSlice(s, verb) + st.formatSlice(&b, s, verb) } case 's': - st.formatSlice(s, verb) + st.formatSlice(&b, s, verb) } + io.Copy(s, &b) } // formatSlice will format this StackTrace into the given buffer as a slice of // Frame, only valid when called with '%s' or '%v'. -func (st StackTrace) formatSlice(s fmt.State, verb rune) { - io.WriteString(s, "[") - for i, f := range st { - if i > 0 { - io.WriteString(s, " ") - } - f.Format(s, verb) +func (st StackTrace) formatSlice(b *bytes.Buffer, s fmt.State, verb rune) { + b.WriteByte('[') + if len(st) == 0 { + b.WriteByte(']') + return + } + + b.Grow(len(st) * (stackMinLen / 4)) + st[0].format(b, s, verb) + for _, fr := range st[1:] { + b.WriteByte(' ') + fr.format(b, s, verb) } - io.WriteString(s, "]") + b.WriteByte(']') } +// stackMinLen is a best-guess at the minimum length of a stack trace. It +// doesn't need to be exact, just give a good enough head start for the buffer +// to avoid the expensive early growth. +const stackMinLen = 96 + // stack represents a stack of program counters. type stack []uintptr @@ -144,10 +172,14 @@ func (s *stack) Format(st fmt.State, verb rune) { case 'v': switch { case st.Flag('+'): + var b bytes.Buffer + b.Grow(len(*s) * stackMinLen) for _, pc := range *s { f := Frame(pc) - fmt.Fprintf(st, "\n%+v", f) + b.WriteByte('\n') + f.format(&b, st, 'v') } + io.Copy(st, &b) } } } @@ -161,9 +193,13 @@ func (s *stack) StackTrace() StackTrace { } func callers() *stack { + return callersSkip(4) +} + +func callersSkip(skip int) *stack { const depth = 32 var pcs [depth]uintptr - n := runtime.Callers(3, pcs[:]) + n := runtime.Callers(skip, pcs[:]) var st stack = pcs[0:n] return &st } @@ -175,3 +211,16 @@ func funcname(name string) string { i = strings.Index(name, ".") return name[i+1:] } + +// NewStack is for library implementers that want to generate a stack trace. +// Normally you should insted use AddStack to get an error with a stack trace. +// +// The result of this function can be turned into a stack trace by calling .StackTrace() +// +// This function takes an argument for the number of stack frames to skip. +// This avoids putting stack generation function calls like this one in the stack trace. +// A value of 0 will give you the line that called NewStack(0) +// A library author wrapping this in their own function will want to use a value of at least 1. +func NewStack(skip int) StackTracer { + return callersSkip(skip + 3) +} diff --git a/vendor/github.com/pingcap/failpoint/.codecov.yml b/vendor/github.com/pingcap/failpoint/.codecov.yml new file mode 100644 index 0000000..4029885 --- /dev/null +++ b/vendor/github.com/pingcap/failpoint/.codecov.yml @@ -0,0 +1,39 @@ +codecov: + notify: + require_ci_to_pass: yes + +coverage: + precision: 4 + round: down + range: "65...90" + + status: + project: + default: + threshold: 20 #Allow the coverage to drop by threshold%, and posting a success status. + patch: + default: + target: 0% # trial operation + changes: no + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: + layout: "header, diff" + behavior: default + require_changes: no + +ignore: + - "LICENSES" + - "*_test.go" + - "marker.go" # This file only contains empty function stub + - "failpoint-ctl" # Ignore the `failpoint-ctl` command line tool + - ".git" + - "*.yml" + - "*.md" diff --git a/vendor/github.com/pingcap/failpoint/.gitignore b/vendor/github.com/pingcap/failpoint/.gitignore new file mode 100644 index 0000000..b1e5133 --- /dev/null +++ b/vendor/github.com/pingcap/failpoint/.gitignore @@ -0,0 +1,27 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +bin +coverage.out +.idea/ +*.iml +*.swp +*.txt +*.log +tags +profile.coverprofile +overalls.coverprofile +explain_test +*.fail.go +vendor +.DS_Store diff --git a/vendor/github.com/pingcap/failpoint/CONTRIBUTING.md b/vendor/github.com/pingcap/failpoint/CONTRIBUTING.md new file mode 100644 index 0000000..cfefb0e --- /dev/null +++ b/vendor/github.com/pingcap/failpoint/CONTRIBUTING.md @@ -0,0 +1,94 @@ +# How to contribute + +This document outlines some of the conventions on development workflow, commit +message formatting, contact points and other resources to make it easier to get +your contribution accepted. + +## Getting started + +- Fork the repository on GitHub. +- Read the README.md for build instructions. +- Play with the project, submit bugs, submit patches! + +## Building Failpoint + +Developing Failpoint requires: + +* [Go 1.13](http://golang.org/doc/code.html) +* An internet connection to download the dependencies + +Simply run `make` to build the program. + +```sh +make +``` + +### Running tests + +This project contains unit tests and integration tests with coverage collection. +See [tests/README.md](./tests/README.md) for how to execute and add tests. + +### Updating dependencies + +Failpoint manages dependencies using [Go module](https://github.com/golang/go/wiki/Modules). +To add or update a dependency, either + +* Use the `go mod edit` command to change the dependency, or +* Edit `go.mod` and then run `make update` to update the checksum. + +## Contribution flow + +This is a rough outline of what a contributor's workflow looks like: + +- Create a topic branch from where you want to base your work. This is usually `master`. +- Make commits of logical units and add test case if the change fixes a bug or adds new functionality. +- Run tests and make sure all the tests are passed. +- Make sure your commit messages are in the proper format (see below). +- Push your changes to a topic branch in your fork of the repository. +- Submit a pull request. +- Your PR must receive LGTMs from two maintainers. + +Thanks for your contributions! + +### Code style + +The coding style suggested by the Golang community is used in `failpoint`. +See the [style doc](https://github.com/golang/go/wiki/CodeReviewComments) for details. + +Please follow this style to makeg `failpoint` easy to review, maintain and develop. + +### Format of the Commit Message + +We follow a rough convention for commit messages that is designed to answer two +questions: what changed and why. The subject line should feature the what and +the body of the commit should describe the why. + +``` +restore: add comment for variable declaration + +Improve documentation. +``` + +The format can be described more formally as follows: + +``` +: + + + +