From a3e6ef65ed8ac71cf65131eadb2e3e3baf6447aa Mon Sep 17 00:00:00 2001 From: eleksir Date: Sun, 8 Oct 2023 11:41:10 -0700 Subject: [PATCH] [WIP] Initial commit --- .gitignore | 5 + .golangci.yml | 69 + Design.txt | 57 + LICENSE.txt | 20 + Makefile | 96 + README.md | 70 + collection.go | 69 + commands.go | 389 + config.in | 16 + contrib/aleesa-jabber-go.openrc | 20 + data/sample_config.json | 125 + event_parser.go | 638 ++ globals.go | 89 + go.mod | 43 + go.sum | 140 + lib.go | 796 ++ main.go | 223 + redis.go | 141 + settings-db-util.go | 126 + types.go | 139 + vendor/github.com/DataDog/zstd/LICENSE | 27 + vendor/github.com/DataDog/zstd/README.md | 142 + vendor/github.com/DataDog/zstd/ZSTD_LICENSE | 30 + vendor/github.com/DataDog/zstd/allocations.h | 58 + vendor/github.com/DataDog/zstd/bits.h | 203 + vendor/github.com/DataDog/zstd/bitstream.h | 440 + vendor/github.com/DataDog/zstd/clevels.h | 137 + vendor/github.com/DataDog/zstd/compiler.h | 361 + vendor/github.com/DataDog/zstd/cover.c | 1260 +++ vendor/github.com/DataDog/zstd/cover.h | 161 + vendor/github.com/DataDog/zstd/cpu.h | 216 + vendor/github.com/DataDog/zstd/debug.c | 27 + vendor/github.com/DataDog/zstd/debug.h | 110 + vendor/github.com/DataDog/zstd/divsufsort.c | 1916 ++++ vendor/github.com/DataDog/zstd/divsufsort.h | 70 + .../github.com/DataDog/zstd/entropy_common.c | 343 + .../github.com/DataDog/zstd/error_private.c | 66 + .../github.com/DataDog/zstd/error_private.h | 162 + vendor/github.com/DataDog/zstd/errors.go | 34 + .../github.com/DataDog/zstd/external_zstd.go | 14 + vendor/github.com/DataDog/zstd/fastcover.c | 769 ++ vendor/github.com/DataDog/zstd/fse.h | 642 ++ vendor/github.com/DataDog/zstd/fse_compress.c | 627 ++ .../github.com/DataDog/zstd/fse_decompress.c | 314 + vendor/github.com/DataDog/zstd/hist.c | 184 + vendor/github.com/DataDog/zstd/hist.h | 78 + vendor/github.com/DataDog/zstd/huf.h | 276 + vendor/github.com/DataDog/zstd/huf_compress.c | 1438 +++ .../github.com/DataDog/zstd/huf_decompress.c | 1885 ++++ .../DataDog/zstd/huf_decompress_amd64.S | 576 + vendor/github.com/DataDog/zstd/mem.h | 438 + vendor/github.com/DataDog/zstd/pool.c | 374 + vendor/github.com/DataDog/zstd/pool.h | 93 + .../DataDog/zstd/portability_macros.h | 159 + vendor/github.com/DataDog/zstd/threading.c | 179 + vendor/github.com/DataDog/zstd/threading.h | 153 + .../github.com/DataDog/zstd/travis_test_32.sh | 19 + vendor/github.com/DataDog/zstd/update.txt | 56 + vendor/github.com/DataDog/zstd/xxhash.c | 27 + vendor/github.com/DataDog/zstd/xxhash.h | 5689 ++++++++++ vendor/github.com/DataDog/zstd/zbuff.h | 217 + vendor/github.com/DataDog/zstd/zbuff_common.c | 29 + .../github.com/DataDog/zstd/zbuff_compress.c | 170 + .../DataDog/zstd/zbuff_decompress.c | 80 + vendor/github.com/DataDog/zstd/zdict.c | 1130 ++ vendor/github.com/DataDog/zstd/zdict.h | 477 + vendor/github.com/DataDog/zstd/zstd.go | 163 + vendor/github.com/DataDog/zstd/zstd.h | 3025 ++++++ vendor/github.com/DataDog/zstd/zstd_bulk.go | 151 + vendor/github.com/DataDog/zstd/zstd_common.c | 51 + .../github.com/DataDog/zstd/zstd_compress.c | 7035 ++++++++++++ .../DataDog/zstd/zstd_compress_internal.h | 1535 +++ .../DataDog/zstd/zstd_compress_literals.c | 238 + .../DataDog/zstd/zstd_compress_literals.h | 42 + .../DataDog/zstd/zstd_compress_sequences.c | 445 + .../DataDog/zstd/zstd_compress_sequences.h | 57 + .../DataDog/zstd/zstd_compress_superblock.c | 580 + .../DataDog/zstd/zstd_compress_superblock.h | 35 + vendor/github.com/DataDog/zstd/zstd_ctx.go | 131 + vendor/github.com/DataDog/zstd/zstd_cwksp.h | 745 ++ vendor/github.com/DataDog/zstd/zstd_ddict.c | 247 + vendor/github.com/DataDog/zstd/zstd_ddict.h | 47 + .../github.com/DataDog/zstd/zstd_decompress.c | 2358 ++++ .../DataDog/zstd/zstd_decompress_block.c | 2195 ++++ .../DataDog/zstd/zstd_decompress_block.h | 76 + .../DataDog/zstd/zstd_decompress_internal.h | 241 + vendor/github.com/DataDog/zstd/zstd_deps.h | 114 + .../DataDog/zstd/zstd_double_fast.c | 761 ++ .../DataDog/zstd/zstd_double_fast.h | 42 + vendor/github.com/DataDog/zstd/zstd_errors.h | 117 + vendor/github.com/DataDog/zstd/zstd_fast.c | 963 ++ vendor/github.com/DataDog/zstd/zstd_fast.h | 41 + .../github.com/DataDog/zstd/zstd_internal.h | 395 + vendor/github.com/DataDog/zstd/zstd_lazy.c | 2160 ++++ vendor/github.com/DataDog/zstd/zstd_lazy.h | 130 + vendor/github.com/DataDog/zstd/zstd_ldm.c | 727 ++ vendor/github.com/DataDog/zstd/zstd_ldm.h | 120 + .../DataDog/zstd/zstd_ldm_geartab.h | 109 + vendor/github.com/DataDog/zstd/zstd_legacy.h | 425 + vendor/github.com/DataDog/zstd/zstd_opt.c | 1475 +++ vendor/github.com/DataDog/zstd/zstd_opt.h | 59 + vendor/github.com/DataDog/zstd/zstd_stream.go | 555 + vendor/github.com/DataDog/zstd/zstd_trace.h | 166 + vendor/github.com/DataDog/zstd/zstd_v01.c | 2128 ++++ vendor/github.com/DataDog/zstd/zstd_v01.h | 97 + vendor/github.com/DataDog/zstd/zstd_v02.c | 3480 ++++++ vendor/github.com/DataDog/zstd/zstd_v02.h | 96 + vendor/github.com/DataDog/zstd/zstd_v03.c | 3120 ++++++ vendor/github.com/DataDog/zstd/zstd_v03.h | 96 + vendor/github.com/DataDog/zstd/zstd_v04.c | 3608 +++++++ vendor/github.com/DataDog/zstd/zstd_v04.h | 145 + vendor/github.com/DataDog/zstd/zstd_v05.c | 4007 +++++++ vendor/github.com/DataDog/zstd/zstd_v05.h | 165 + vendor/github.com/DataDog/zstd/zstd_v06.c | 4116 +++++++ vendor/github.com/DataDog/zstd/zstd_v06.h | 175 + vendor/github.com/DataDog/zstd/zstd_v07.c | 4501 ++++++++ vendor/github.com/DataDog/zstd/zstd_v07.h | 190 + .../github.com/DataDog/zstd/zstdmt_compress.c | 1870 ++++ .../github.com/DataDog/zstd/zstdmt_compress.h | 116 + vendor/github.com/beorn7/perks/LICENSE | 20 + .../beorn7/perks/quantile/exampledata.txt | 2388 +++++ .../beorn7/perks/quantile/stream.go | 316 + .../github.com/cespare/xxhash/v2/LICENSE.txt | 22 + vendor/github.com/cespare/xxhash/v2/README.md | 72 + .../github.com/cespare/xxhash/v2/testall.sh | 10 + vendor/github.com/cespare/xxhash/v2/xxhash.go | 228 + .../cespare/xxhash/v2/xxhash_amd64.s | 209 + .../cespare/xxhash/v2/xxhash_arm64.s | 183 + .../cespare/xxhash/v2/xxhash_asm.go | 15 + .../cespare/xxhash/v2/xxhash_other.go | 76 + .../cespare/xxhash/v2/xxhash_safe.go | 16 + .../cespare/xxhash/v2/xxhash_unsafe.go | 58 + .../github.com/cockroachdb/errors/.gitignore | 12 + vendor/github.com/cockroachdb/errors/LICENSE | 201 + .../cockroachdb/errors/Makefile.update-protos | 62 + .../github.com/cockroachdb/errors/README.md | 646 ++ .../cockroachdb/errors/assert/assert.go | 95 + .../cockroachdb/errors/assert_api.go | 35 + .../cockroachdb/errors/barriers/barriers.go | 151 + .../cockroachdb/errors/barriers_api.go | 34 + .../errors/contexttags/contexttags.go | 113 + .../errors/contexttags/with_context.go | 115 + .../cockroachdb/errors/contexttags_api.go | 47 + .../cockroachdb/errors/domains/domains.go | 156 + .../cockroachdb/errors/domains/with_domain.go | 84 + .../cockroachdb/errors/domains_api.go | 78 + .../cockroachdb/errors/errbase/adapters.go | 214 + .../errors/errbase/adapters_errno.go | 66 + .../cockroachdb/errors/errbase/decode.go | 206 + .../cockroachdb/errors/errbase/encode.go | 438 + .../errors/errbase/format_error.go | 990 ++ .../cockroachdb/errors/errbase/formatter.go | 99 + .../cockroachdb/errors/errbase/migrations.go | 123 + .../cockroachdb/errors/errbase/opaque.go | 137 + .../errors/errbase/oserror_go116.go | 24 + .../errors/errbase/oserror_pre116.go | 19 + .../errors/errbase/safe_details.go | 93 + .../cockroachdb/errors/errbase/unwrap.go | 71 + .../cockroachdb/errors/errbase_api.go | 253 + .../cockroachdb/errors/errorspb/errors.go | 21 + .../cockroachdb/errors/errorspb/errors.pb.go | 2167 ++++ .../cockroachdb/errors/errorspb/errors.proto | 149 + .../errors/errorspb/hintdetail.pb.go | 302 + .../errors/errorspb/hintdetail.proto | 7 + .../cockroachdb/errors/errorspb/markers.go | 19 + .../cockroachdb/errors/errorspb/markers.pb.go | 365 + .../cockroachdb/errors/errorspb/markers.proto | 14 + .../cockroachdb/errors/errorspb/tags.pb.go | 525 + .../cockroachdb/errors/errorspb/tags.proto | 18 + .../cockroachdb/errors/errorspb/testing.go | 18 + .../cockroachdb/errors/errorspb/testing.pb.go | 258 + .../cockroachdb/errors/errorspb/testing.proto | 6 + .../cockroachdb/errors/errutil/as.go | 74 + .../cockroachdb/errors/errutil/assertions.go | 80 + .../cockroachdb/errors/errutil/doc.go | 19 + .../errors/errutil/format_error_special.go | 88 + .../cockroachdb/errors/errutil/message.go | 45 + .../cockroachdb/errors/errutil/redactable.go | 163 + .../cockroachdb/errors/errutil/utilities.go | 168 + .../cockroachdb/errors/errutil_api.go | 210 + .../errors/hintdetail/hintdetail.go | 165 + .../errors/hintdetail/with_detail.go | 72 + .../errors/hintdetail/with_hint.go | 72 + .../cockroachdb/errors/hintdetail_api.go | 82 + .../cockroachdb/errors/issuelink/issuelink.go | 119 + .../errors/issuelink/unimplemented_error.go | 87 + .../errors/issuelink/with_issuelink.go | 97 + .../cockroachdb/errors/issuelink_api.go | 73 + .../cockroachdb/errors/join/join.go | 105 + .../cockroachdb/errors/markers/markers.go | 311 + .../cockroachdb/errors/markers_api.go | 72 + .../cockroachdb/errors/oserror/oserror.go | 120 + .../cockroachdb/errors/report/report.go | 413 + .../cockroachdb/errors/report/reportables.go | 37 + .../cockroachdb/errors/report_api.go | 103 + .../cockroachdb/errors/safedetails/redact.go | 25 + .../errors/safedetails/safedetails.go | 64 + .../errors/safedetails/with_safedetails.go | 78 + .../cockroachdb/errors/safedetails_api.go | 56 + .../cockroachdb/errors/secondary/secondary.go | 46 + .../errors/secondary/with_secondary.go | 89 + .../cockroachdb/errors/secondary_api.go | 42 + .../cockroachdb/errors/stdstrings/strings.go | 28 + .../errors/telemetrykeys/telemetrykeys.go | 52 + .../errors/telemetrykeys/with_telemetry.go | 60 + .../cockroachdb/errors/telemetrykeys_api.go | 32 + .../errors/withstack/one_line_source.go | 89 + .../errors/withstack/reportable.go | 204 + .../cockroachdb/errors/withstack/stack.go | 59 + .../cockroachdb/errors/withstack/withstack.go | 84 + .../cockroachdb/errors/withstack_api.go | 68 + .../github.com/cockroachdb/logtags/.gitignore | 12 + vendor/github.com/cockroachdb/logtags/LICENSE | 201 + .../github.com/cockroachdb/logtags/README.md | 76 + .../github.com/cockroachdb/logtags/buffer.go | 213 + .../github.com/cockroachdb/logtags/context.go | 65 + vendor/github.com/cockroachdb/logtags/tag.go | 47 + .../cockroachdb/pebble/.editorconfig | 10 + .../github.com/cockroachdb/pebble/.gitignore | 9 + vendor/github.com/cockroachdb/pebble/LICENSE | 27 + vendor/github.com/cockroachdb/pebble/Makefile | 131 + .../github.com/cockroachdb/pebble/README.md | 157 + vendor/github.com/cockroachdb/pebble/batch.go | 2251 ++++ vendor/github.com/cockroachdb/pebble/cache.go | 23 + .../cockroachdb/pebble/checkpoint.go | 428 + .../github.com/cockroachdb/pebble/cleaner.go | 295 + .../github.com/cockroachdb/pebble/commit.go | 517 + .../cockroachdb/pebble/compaction.go | 3932 +++++++ .../cockroachdb/pebble/compaction_iter.go | 1338 +++ .../cockroachdb/pebble/compaction_picker.go | 2068 ++++ .../github.com/cockroachdb/pebble/comparer.go | 31 + vendor/github.com/cockroachdb/pebble/db.go | 2947 +++++ .../cockroachdb/pebble/error_iter.go | 90 + vendor/github.com/cockroachdb/pebble/event.go | 766 ++ .../cockroachdb/pebble/external_iterator.go | 555 + .../cockroachdb/pebble/filenames.go | 54 + .../cockroachdb/pebble/flushable.go | 249 + .../pebble/format_major_version.go | 663 ++ .../github.com/cockroachdb/pebble/get_iter.go | 243 + .../github.com/cockroachdb/pebble/ingest.go | 2375 +++++ .../github.com/cockroachdb/pebble/internal.go | 51 + .../pebble/internal/arenaskl/LICENSE | 201 + .../pebble/internal/arenaskl/README.md | 93 + .../pebble/internal/arenaskl/arena.go | 125 + .../internal/arenaskl/flush_iterator.go | 88 + .../pebble/internal/arenaskl/iterator.go | 271 + .../pebble/internal/arenaskl/node.go | 133 + .../pebble/internal/arenaskl/skl.go | 464 + .../pebble/internal/base/cleaner.go | 60 + .../pebble/internal/base/comparer.go | 260 + .../cockroachdb/pebble/internal/base/error.go | 28 + .../pebble/internal/base/filenames.go | 204 + .../pebble/internal/base/internal.go | 494 + .../pebble/internal/base/iterator.go | 409 + .../pebble/internal/base/lazy_value.go | 287 + .../pebble/internal/base/logger.go | 144 + .../pebble/internal/base/merger.go | 133 + .../pebble/internal/base/metrics.go | 98 + .../pebble/internal/base/options.go | 76 + .../pebble/internal/batchskl/README.md | 56 + .../pebble/internal/batchskl/iterator.go | 223 + .../pebble/internal/batchskl/skl.go | 442 + .../pebble/internal/bytealloc/bytealloc.go | 69 + .../cockroachdb/pebble/internal/cache/LICENSE | 21 + .../pebble/internal/cache/cgo_disabled.go | 10 + .../pebble/internal/cache/cgo_enabled.go | 10 + .../pebble/internal/cache/clockpro.go | 909 ++ .../pebble/internal/cache/clockpro_normal.go | 10 + .../pebble/internal/cache/clockpro_tracing.go | 20 + .../pebble/internal/cache/entry.go | 155 + .../pebble/internal/cache/entry_invariants.go | 38 + .../pebble/internal/cache/entry_normal.go | 103 + .../pebble/internal/cache/refcnt_normal.go | 59 + .../pebble/internal/cache/refcnt_tracing.go | 66 + .../pebble/internal/cache/robin_hood.go | 320 + .../pebble/internal/cache/value.go | 46 + .../pebble/internal/cache/value_invariants.go | 55 + .../pebble/internal/cache/value_normal.go | 57 + .../pebble/internal/constants/constants.go | 17 + .../cockroachdb/pebble/internal/crc/crc.go | 42 + .../pebble/internal/fastrand/fastrand.go | 17 + .../pebble/internal/humanize/humanize.go | 68 + .../pebble/internal/intern/intern.go | 27 + .../pebble/internal/invalidating/iter.go | 162 + .../internal/invariants/finalizer_off.go | 14 + .../internal/invariants/finalizer_on.go | 17 + .../pebble/internal/invariants/off.go | 11 + .../pebble/internal/invariants/on.go | 11 + .../pebble/internal/invariants/race_off.go | 11 + .../pebble/internal/invariants/race_on.go | 11 + .../pebble/internal/keyspan/bounded.go | 268 + .../pebble/internal/keyspan/defragment.go | 505 + .../pebble/internal/keyspan/doc.go | 13 + .../pebble/internal/keyspan/filter.go | 98 + .../pebble/internal/keyspan/fragmenter.go | 483 + .../pebble/internal/keyspan/get.go | 53 + .../internal/keyspan/interleaving_iter.go | 1046 ++ .../internal/keyspan/internal_iter_shim.go | 118 + .../pebble/internal/keyspan/iter.go | 218 + .../pebble/internal/keyspan/level_iter.go | 521 + .../pebble/internal/keyspan/merging_iter.go | 1209 +++ .../pebble/internal/keyspan/seek.go | 48 + .../pebble/internal/keyspan/span.go | 467 + .../pebble/internal/keyspan/transformer.go | 50 + .../pebble/internal/keyspan/truncate.go | 73 + .../pebble/internal/manifest/btree.go | 1318 +++ .../pebble/internal/manifest/l0_sublevels.go | 2040 ++++ .../pebble/internal/manifest/level.go | 46 + .../internal/manifest/level_metadata.go | 748 ++ .../pebble/internal/manifest/version.go | 1525 +++ .../pebble/internal/manifest/version_edit.go | 1119 ++ .../pebble/internal/manual/manual.go | 60 + .../pebble/internal/manual/manual_32bit.go | 13 + .../pebble/internal/manual/manual_64bit.go | 13 + .../pebble/internal/manual/manual_nocgo.go | 20 + .../pebble/internal/private/batch.go | 19 + .../pebble/internal/private/sstable.go | 29 + .../pebble/internal/rangedel/rangedel.go | 43 + .../pebble/internal/rangekey/coalesce.go | 369 + .../pebble/internal/rangekey/rangekey.go | 411 + .../pebble/internal/rawalloc/rawalloc.go | 24 + .../internal/rawalloc/rawalloc_32bit.go | 22 + .../internal/rawalloc/rawalloc_64bit.go | 22 + .../internal/rawalloc/rawalloc_gccgo.go | 23 + .../internal/rawalloc/rawalloc_go1.9.go | 28 + .../pebble/internal/testkeys/strconv.go | 121 + .../pebble/internal/testkeys/testkeys.go | 518 + .../github.com/cockroachdb/pebble/iterator.go | 2819 +++++ .../cockroachdb/pebble/level_checker.go | 769 ++ .../cockroachdb/pebble/level_iter.go | 1242 +++ .../cockroachdb/pebble/log_recycler.go | 108 + .../github.com/cockroachdb/pebble/logger.go | 16 + .../cockroachdb/pebble/mem_table.go | 419 + .../github.com/cockroachdb/pebble/merger.go | 37 + .../cockroachdb/pebble/merging_iter.go | 1393 +++ .../cockroachdb/pebble/merging_iter_heap.go | 92 + .../github.com/cockroachdb/pebble/metrics.go | 625 ++ .../pebble/objstorage/noop_readahead.go | 34 + .../pebble/objstorage/objstorage.go | 324 + .../objiotracing/obj_io_tracing.go | 68 + .../objiotracing/obj_io_tracing_off.go | 59 + .../objiotracing/obj_io_tracing_on.go | 410 + .../objstorage/objstorageprovider/provider.go | 522 + .../objstorageprovider/readahead.go | 201 + .../objstorage/objstorageprovider/remote.go | 376 + .../objstorageprovider/remote_backing.go | 303 + .../objstorageprovider/remote_obj_name.go | 91 + .../objstorageprovider/remote_readable.go | 162 + .../remoteobjcat/catalog.go | 387 + .../remoteobjcat/version_edit.go | 254 + .../objstorageprovider/shared_writable.go | 65 + .../sharedcache/shared_cache.go | 900 ++ .../objstorage/objstorageprovider/vfs.go | 109 + .../objstorageprovider/vfs_readable.go | 216 + .../objstorageprovider/vfs_writable.go | 65 + .../pebble/objstorage/remote/factory.go | 25 + .../pebble/objstorage/remote/localfs.go | 118 + .../pebble/objstorage/remote/logging.go | 139 + .../pebble/objstorage/remote/mem.go | 161 + .../pebble/objstorage/remote/storage.go | 126 + vendor/github.com/cockroachdb/pebble/open.go | 1169 ++ .../github.com/cockroachdb/pebble/options.go | 1733 +++ vendor/github.com/cockroachdb/pebble/pacer.go | 190 + .../cockroachdb/pebble/range_keys.go | 675 ++ .../cockroachdb/pebble/rangekey/rangekey.go | 33 + .../pebble/read_compaction_queue.go | 94 + .../cockroachdb/pebble/read_state.go | 106 + .../cockroachdb/pebble/record/log_writer.go | 769 ++ .../cockroachdb/pebble/record/record.go | 644 ++ .../cockroachdb/pebble/record/rotation.go | 82 + .../cockroachdb/pebble/scan_internal.go | 997 ++ .../github.com/cockroachdb/pebble/snapshot.go | 547 + .../cockroachdb/pebble/sstable/block.go | 1860 ++++ .../pebble/sstable/block_property.go | 814 ++ .../sstable/block_property_test_utils.go | 117 + .../cockroachdb/pebble/sstable/buffer_pool.go | 148 + .../cockroachdb/pebble/sstable/comparer.go | 34 + .../cockroachdb/pebble/sstable/compression.go | 99 + .../pebble/sstable/compression_cgo.go | 34 + .../pebble/sstable/compression_nocgo.go | 30 + .../cockroachdb/pebble/sstable/filter.go | 122 + .../cockroachdb/pebble/sstable/format.go | 257 + .../cockroachdb/pebble/sstable/internal.go | 36 + .../cockroachdb/pebble/sstable/layout.go | 306 + .../cockroachdb/pebble/sstable/options.go | 305 + .../cockroachdb/pebble/sstable/properties.go | 446 + .../cockroachdb/pebble/sstable/raw_block.go | 262 + .../cockroachdb/pebble/sstable/reader.go | 1234 +++ .../cockroachdb/pebble/sstable/reader_iter.go | 291 + .../pebble/sstable/reader_iter_single_lvl.go | 1391 +++ .../pebble/sstable/reader_iter_two_lvl.go | 1079 ++ .../pebble/sstable/reader_virtual.go | 202 + .../pebble/sstable/suffix_rewriter.go | 589 + .../cockroachdb/pebble/sstable/table.go | 455 + .../cockroachdb/pebble/sstable/unsafe.go | 35 + .../cockroachdb/pebble/sstable/value_block.go | 950 ++ .../cockroachdb/pebble/sstable/write_queue.go | 140 + .../cockroachdb/pebble/sstable/writer.go | 2450 +++++ .../cockroachdb/pebble/table_cache.go | 1172 ++ .../cockroachdb/pebble/table_stats.go | 1046 ++ .../cockroachdb/pebble/version_set.go | 997 ++ .../cockroachdb/pebble/vfs/atomicfs/marker.go | 241 + .../cockroachdb/pebble/vfs/clone.go | 137 + .../cockroachdb/pebble/vfs/default_linux.go | 132 + .../cockroachdb/pebble/vfs/default_unix.go | 49 + .../cockroachdb/pebble/vfs/default_windows.go | 61 + .../cockroachdb/pebble/vfs/disk_full.go | 453 + .../cockroachdb/pebble/vfs/disk_health.go | 791 ++ .../pebble/vfs/disk_usage_linux.go | 44 + .../pebble/vfs/disk_usage_netbsd.go | 26 + .../pebble/vfs/disk_usage_openbsd.go | 26 + .../cockroachdb/pebble/vfs/disk_usage_unix.go | 26 + .../pebble/vfs/disk_usage_windows.go | 22 + .../cockroachdb/pebble/vfs/errors_unix.go | 21 + .../cockroachdb/pebble/vfs/errors_windows.go | 22 + .../cockroachdb/pebble/vfs/fadvise_generic.go | 16 + .../cockroachdb/pebble/vfs/fadvise_linux.go | 20 + .../pebble/vfs/file_lock_generic.go | 20 + .../cockroachdb/pebble/vfs/file_lock_unix.go | 70 + .../pebble/vfs/file_lock_windows.go | 42 + .../cockroachdb/pebble/vfs/logging_fs.go | 157 + .../cockroachdb/pebble/vfs/mem_fs.go | 832 ++ .../cockroachdb/pebble/vfs/syncing_file.go | 215 + .../github.com/cockroachdb/pebble/vfs/vfs.go | 419 + .../github.com/cockroachdb/redact/.gitignore | 15 + .../github.com/cockroachdb/redact/.travis.yml | 7 + vendor/github.com/cockroachdb/redact/LICENSE | 201 + .../github.com/cockroachdb/redact/README.md | 9 + vendor/github.com/cockroachdb/redact/api.go | 175 + .../cockroachdb/redact/builder/builder.go | 155 + vendor/github.com/cockroachdb/redact/doc.go | 51 + .../redact/interfaces/interfaces.go | 149 + .../redact/internal/buffer/buffer.go | 351 + .../redact/internal/escape/escape.go | 137 + .../redact/internal/fmtforward/make_format.go | 88 + .../redact/internal/markers/constants.go | 40 + .../redact/internal/markers/markers.go | 99 + .../cockroachdb/redact/internal/redact/doc.go | 19 + .../redact/internal/redact/wrappers.go | 84 + .../redact/internal/rfmt/README.md | 43 + .../redact/internal/rfmt/fmtsort/sort.go | 222 + .../redact/internal/rfmt/format.go | 589 + .../redact/internal/rfmt/format.go.diff | 81 + .../redact/internal/rfmt/helpers.go | 160 + .../cockroachdb/redact/internal/rfmt/print.go | 1292 +++ .../redact/internal/rfmt/print.go.diff | 489 + .../redact/internal/rfmt/printer_adapter.go | 85 + .../redact/internal/rfmt/refresh.sh | 26 + .../redact/internal/rfmt/registry.go | 46 + .../cockroachdb/redact/markers_print.go | 87 + vendor/github.com/cockroachdb/redact/util.go | 62 + .../cockroachdb/tokenbucket/LICENSE | 201 + .../cockroachdb/tokenbucket/README.md | 2 + .../cockroachdb/tokenbucket/token_bucket.go | 202 + vendor/github.com/davecgh/go-spew/LICENSE | 15 + .../github.com/davecgh/go-spew/spew/bypass.go | 145 + .../davecgh/go-spew/spew/bypasssafe.go | 38 + .../github.com/davecgh/go-spew/spew/common.go | 341 + vendor/github.com/davecgh/go-spew/spew/doc.go | 211 + .../github.com/davecgh/go-spew/spew/dump.go | 509 + .../github.com/davecgh/go-spew/spew/format.go | 419 + .../github.com/davecgh/go-spew/spew/spew.go | 148 + .../github.com/dgryski/go-rendezvous/LICENSE | 21 + .../github.com/dgryski/go-rendezvous/rdv.go | 79 + .../github.com/eleksir/go-xmpp/.golangci.yml | 66 + vendor/github.com/eleksir/go-xmpp/LICENSE | 30 + vendor/github.com/eleksir/go-xmpp/README.md | 14 + vendor/github.com/eleksir/go-xmpp/xmpp.go | 1805 ++++ .../github.com/eleksir/go-xmpp/xmpp_avatar.go | 129 + .../github.com/eleksir/go-xmpp/xmpp_disco.go | 103 + .../github.com/eleksir/go-xmpp/xmpp_error.go | 57 + .../eleksir/go-xmpp/xmpp_information_query.go | 125 + vendor/github.com/eleksir/go-xmpp/xmpp_muc.go | 140 + .../github.com/eleksir/go-xmpp/xmpp_ping.go | 49 + .../github.com/eleksir/go-xmpp/xmpp_pubsub.go | 137 + .../eleksir/go-xmpp/xmpp_subscription.go | 33 + .../getsentry/sentry-go/.codecov.yml | 13 + .../github.com/getsentry/sentry-go/.craft.yml | 13 + .../getsentry/sentry-go/.gitattributes | 5 + .../github.com/getsentry/sentry-go/.gitignore | 14 + .../getsentry/sentry-go/.golangci.yml | 50 + .../getsentry/sentry-go/CHANGELOG.md | 754 ++ .../getsentry/sentry-go/CONTRIBUTING.md | 98 + vendor/github.com/getsentry/sentry-go/LICENSE | 21 + .../getsentry/sentry-go/MIGRATION.md | 3 + .../github.com/getsentry/sentry-go/Makefile | 83 + .../github.com/getsentry/sentry-go/README.md | 105 + .../getsentry/sentry-go/check_in.go | 117 + .../github.com/getsentry/sentry-go/client.go | 740 ++ vendor/github.com/getsentry/sentry-go/doc.go | 6 + vendor/github.com/getsentry/sentry-go/dsn.go | 234 + .../sentry-go/dynamic_sampling_context.go | 123 + vendor/github.com/getsentry/sentry-go/hub.go | 395 + .../getsentry/sentry-go/integrations.go | 391 + .../getsentry/sentry-go/interfaces.go | 523 + .../sentry-go/internal/debug/transport.go | 79 + .../sentry-go/internal/otel/baggage/README.md | 12 + .../internal/otel/baggage/baggage.go | 604 ++ .../otel/baggage/internal/baggage/baggage.go | 45 + .../sentry-go/internal/ratelimit/category.go | 46 + .../sentry-go/internal/ratelimit/deadline.go | 22 + .../sentry-go/internal/ratelimit/doc.go | 3 + .../sentry-go/internal/ratelimit/map.go | 64 + .../internal/ratelimit/rate_limits.go | 76 + .../internal/ratelimit/retry_after.go | 40 + .../sentry-go/internal/traceparser/README.md | 15 + .../sentry-go/internal/traceparser/parser.go | 217 + .../getsentry/sentry-go/profile_sample.go | 73 + .../getsentry/sentry-go/profiler.go | 451 + .../getsentry/sentry-go/profiler_other.go | 5 + .../getsentry/sentry-go/profiler_windows.go | 24 + .../github.com/getsentry/sentry-go/scope.go | 443 + .../github.com/getsentry/sentry-go/sentry.go | 133 + .../getsentry/sentry-go/sourcereader.go | 70 + .../getsentry/sentry-go/span_recorder.go | 56 + .../getsentry/sentry-go/stacktrace.go | 383 + .../getsentry/sentry-go/traces_profiler.go | 90 + .../getsentry/sentry-go/traces_sampler.go | 19 + .../github.com/getsentry/sentry-go/tracing.go | 1016 ++ .../getsentry/sentry-go/transport.go | 649 ++ vendor/github.com/getsentry/sentry-go/util.go | 110 + .../github.com/go-redis/redis/v8/.gitignore | 3 + .../go-redis/redis/v8/.golangci.yml | 4 + .../go-redis/redis/v8/.prettierrc.yml | 4 + .../github.com/go-redis/redis/v8/CHANGELOG.md | 177 + vendor/github.com/go-redis/redis/v8/LICENSE | 25 + vendor/github.com/go-redis/redis/v8/Makefile | 35 + vendor/github.com/go-redis/redis/v8/README.md | 175 + .../github.com/go-redis/redis/v8/RELEASING.md | 15 + .../github.com/go-redis/redis/v8/cluster.go | 1750 +++ .../go-redis/redis/v8/cluster_commands.go | 109 + .../github.com/go-redis/redis/v8/command.go | 3478 ++++++ .../github.com/go-redis/redis/v8/commands.go | 3475 ++++++ vendor/github.com/go-redis/redis/v8/doc.go | 4 + vendor/github.com/go-redis/redis/v8/error.go | 144 + .../go-redis/redis/v8/internal/arg.go | 56 + .../redis/v8/internal/hashtag/hashtag.go | 78 + .../go-redis/redis/v8/internal/hscan/hscan.go | 201 + .../redis/v8/internal/hscan/structmap.go | 93 + .../go-redis/redis/v8/internal/internal.go | 29 + .../go-redis/redis/v8/internal/log.go | 26 + .../go-redis/redis/v8/internal/once.go | 60 + .../go-redis/redis/v8/internal/pool/conn.go | 121 + .../go-redis/redis/v8/internal/pool/pool.go | 557 + .../redis/v8/internal/pool/pool_single.go | 58 + .../redis/v8/internal/pool/pool_sticky.go | 201 + .../redis/v8/internal/proto/reader.go | 332 + .../go-redis/redis/v8/internal/proto/scan.go | 180 + .../redis/v8/internal/proto/writer.go | 155 + .../go-redis/redis/v8/internal/rand/rand.go | 50 + .../go-redis/redis/v8/internal/safe.go | 12 + .../go-redis/redis/v8/internal/unsafe.go | 21 + .../go-redis/redis/v8/internal/util.go | 46 + .../go-redis/redis/v8/internal/util/safe.go | 12 + .../redis/v8/internal/util/strconv.go | 19 + .../go-redis/redis/v8/internal/util/unsafe.go | 23 + .../github.com/go-redis/redis/v8/iterator.go | 77 + .../github.com/go-redis/redis/v8/options.go | 429 + .../github.com/go-redis/redis/v8/package.json | 8 + .../github.com/go-redis/redis/v8/pipeline.go | 147 + vendor/github.com/go-redis/redis/v8/pubsub.go | 668 ++ vendor/github.com/go-redis/redis/v8/redis.go | 773 ++ vendor/github.com/go-redis/redis/v8/result.go | 180 + vendor/github.com/go-redis/redis/v8/ring.go | 736 ++ vendor/github.com/go-redis/redis/v8/script.go | 65 + .../github.com/go-redis/redis/v8/sentinel.go | 796 ++ vendor/github.com/go-redis/redis/v8/tx.go | 149 + .../github.com/go-redis/redis/v8/universal.go | 215 + .../github.com/go-redis/redis/v8/version.go | 6 + vendor/github.com/gogo/protobuf/AUTHORS | 15 + vendor/github.com/gogo/protobuf/CONTRIBUTORS | 23 + vendor/github.com/gogo/protobuf/LICENSE | 35 + .../gogo/protobuf/gogoproto/Makefile | 37 + .../github.com/gogo/protobuf/gogoproto/doc.go | 169 + .../gogo/protobuf/gogoproto/gogo.pb.go | 874 ++ .../gogo/protobuf/gogoproto/gogo.pb.golden | 45 + .../gogo/protobuf/gogoproto/gogo.proto | 144 + .../gogo/protobuf/gogoproto/helper.go | 415 + .../github.com/gogo/protobuf/proto/Makefile | 43 + .../github.com/gogo/protobuf/proto/clone.go | 258 + .../gogo/protobuf/proto/custom_gogo.go | 39 + .../github.com/gogo/protobuf/proto/decode.go | 427 + .../gogo/protobuf/proto/deprecated.go | 63 + .../github.com/gogo/protobuf/proto/discard.go | 350 + .../gogo/protobuf/proto/duration.go | 100 + .../gogo/protobuf/proto/duration_gogo.go | 49 + .../github.com/gogo/protobuf/proto/encode.go | 205 + .../gogo/protobuf/proto/encode_gogo.go | 33 + .../github.com/gogo/protobuf/proto/equal.go | 300 + .../gogo/protobuf/proto/extensions.go | 605 ++ .../gogo/protobuf/proto/extensions_gogo.go | 389 + vendor/github.com/gogo/protobuf/proto/lib.go | 973 ++ .../gogo/protobuf/proto/lib_gogo.go | 50 + .../gogo/protobuf/proto/message_set.go | 181 + .../gogo/protobuf/proto/pointer_reflect.go | 357 + .../protobuf/proto/pointer_reflect_gogo.go | 59 + .../gogo/protobuf/proto/pointer_unsafe.go | 308 + .../protobuf/proto/pointer_unsafe_gogo.go | 56 + .../gogo/protobuf/proto/properties.go | 610 ++ .../gogo/protobuf/proto/properties_gogo.go | 36 + .../gogo/protobuf/proto/skip_gogo.go | 119 + .../gogo/protobuf/proto/table_marshal.go | 3009 ++++++ .../gogo/protobuf/proto/table_marshal_gogo.go | 388 + .../gogo/protobuf/proto/table_merge.go | 676 ++ .../gogo/protobuf/proto/table_unmarshal.go | 2249 ++++ .../protobuf/proto/table_unmarshal_gogo.go | 385 + vendor/github.com/gogo/protobuf/proto/text.go | 930 ++ .../gogo/protobuf/proto/text_gogo.go | 57 + .../gogo/protobuf/proto/text_parser.go | 1018 ++ .../gogo/protobuf/proto/timestamp.go | 113 + .../gogo/protobuf/proto/timestamp_gogo.go | 49 + .../gogo/protobuf/proto/wrappers.go | 1888 ++++ .../gogo/protobuf/proto/wrappers_gogo.go | 113 + .../protoc-gen-gogo/descriptor/Makefile | 36 + .../protoc-gen-gogo/descriptor/descriptor.go | 118 + .../descriptor/descriptor.pb.go | 2865 +++++ .../descriptor/descriptor_gostring.gen.go | 752 ++ .../protoc-gen-gogo/descriptor/helper.go | 390 + .../gogo/protobuf/sortkeys/sortkeys.go | 101 + vendor/github.com/gogo/protobuf/types/any.go | 140 + .../github.com/gogo/protobuf/types/any.pb.go | 694 ++ .../github.com/gogo/protobuf/types/api.pb.go | 2134 ++++ vendor/github.com/gogo/protobuf/types/doc.go | 35 + .../gogo/protobuf/types/duration.go | 100 + .../gogo/protobuf/types/duration.pb.go | 517 + .../gogo/protobuf/types/duration_gogo.go | 100 + .../gogo/protobuf/types/empty.pb.go | 462 + .../gogo/protobuf/types/field_mask.pb.go | 738 ++ .../gogo/protobuf/types/protosize.go | 34 + .../gogo/protobuf/types/source_context.pb.go | 524 + .../gogo/protobuf/types/struct.pb.go | 2271 ++++ .../gogo/protobuf/types/timestamp.go | 130 + .../gogo/protobuf/types/timestamp.pb.go | 539 + .../gogo/protobuf/types/timestamp_gogo.go | 94 + .../github.com/gogo/protobuf/types/type.pb.go | 3355 ++++++ .../gogo/protobuf/types/wrappers.pb.go | 2703 +++++ .../gogo/protobuf/types/wrappers_gogo.go | 300 + vendor/github.com/golang/protobuf/AUTHORS | 3 + .../github.com/golang/protobuf/CONTRIBUTORS | 3 + vendor/github.com/golang/protobuf/LICENSE | 28 + .../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 + vendor/github.com/golang/snappy/.gitignore | 16 + vendor/github.com/golang/snappy/AUTHORS | 18 + vendor/github.com/golang/snappy/CONTRIBUTORS | 41 + vendor/github.com/golang/snappy/LICENSE | 27 + vendor/github.com/golang/snappy/README | 107 + vendor/github.com/golang/snappy/decode.go | 264 + .../github.com/golang/snappy/decode_amd64.s | 490 + .../github.com/golang/snappy/decode_arm64.s | 494 + vendor/github.com/golang/snappy/decode_asm.go | 15 + .../github.com/golang/snappy/decode_other.go | 115 + vendor/github.com/golang/snappy/encode.go | 289 + .../github.com/golang/snappy/encode_amd64.s | 730 ++ .../github.com/golang/snappy/encode_arm64.s | 722 ++ vendor/github.com/golang/snappy/encode_asm.go | 30 + .../github.com/golang/snappy/encode_other.go | 238 + vendor/github.com/golang/snappy/snappy.go | 98 + vendor/github.com/hjson/hjson-go/.gitignore | 0 vendor/github.com/hjson/hjson-go/LICENSE | 21 + vendor/github.com/hjson/hjson-go/README.md | 181 + .../hjson/hjson-go/build_release.sh | 58 + vendor/github.com/hjson/hjson-go/decode.go | 480 + vendor/github.com/hjson/hjson-go/encode.go | 492 + .../github.com/hjson/hjson-go/parseNumber.go | 108 + .../klauspost/compress/.gitattributes | 2 + .../github.com/klauspost/compress/.gitignore | 32 + .../klauspost/compress/.goreleaser.yml | 127 + vendor/github.com/klauspost/compress/LICENSE | 304 + .../github.com/klauspost/compress/README.md | 652 ++ .../github.com/klauspost/compress/SECURITY.md | 25 + .../klauspost/compress/compressible.go | 85 + .../klauspost/compress/fse/README.md | 79 + .../klauspost/compress/fse/bitreader.go | 122 + .../klauspost/compress/fse/bitwriter.go | 167 + .../klauspost/compress/fse/bytereader.go | 47 + .../klauspost/compress/fse/compress.go | 683 ++ .../klauspost/compress/fse/decompress.go | 376 + .../github.com/klauspost/compress/fse/fse.go | 144 + vendor/github.com/klauspost/compress/gen.sh | 4 + .../klauspost/compress/huff0/.gitignore | 1 + .../klauspost/compress/huff0/README.md | 89 + .../klauspost/compress/huff0/bitreader.go | 229 + .../klauspost/compress/huff0/bitwriter.go | 102 + .../klauspost/compress/huff0/bytereader.go | 44 + .../klauspost/compress/huff0/compress.go | 741 ++ .../klauspost/compress/huff0/decompress.go | 1167 ++ .../compress/huff0/decompress_amd64.go | 226 + .../compress/huff0/decompress_amd64.s | 830 ++ .../compress/huff0/decompress_generic.go | 299 + .../klauspost/compress/huff0/huff0.go | 337 + .../compress/internal/cpuinfo/cpuinfo.go | 34 + .../internal/cpuinfo/cpuinfo_amd64.go | 11 + .../compress/internal/cpuinfo/cpuinfo_amd64.s | 36 + .../compress/internal/snapref/LICENSE | 27 + .../compress/internal/snapref/decode.go | 264 + .../compress/internal/snapref/decode_other.go | 113 + .../compress/internal/snapref/encode.go | 289 + .../compress/internal/snapref/encode_other.go | 250 + .../compress/internal/snapref/snappy.go | 98 + vendor/github.com/klauspost/compress/s2sx.mod | 4 + vendor/github.com/klauspost/compress/s2sx.sum | 0 .../klauspost/compress/zstd/README.md | 441 + .../klauspost/compress/zstd/bitreader.go | 136 + .../klauspost/compress/zstd/bitwriter.go | 112 + .../klauspost/compress/zstd/blockdec.go | 726 ++ .../klauspost/compress/zstd/blockenc.go | 889 ++ .../compress/zstd/blocktype_string.go | 85 + .../klauspost/compress/zstd/bytebuf.go | 131 + .../klauspost/compress/zstd/bytereader.go | 82 + .../klauspost/compress/zstd/decodeheader.go | 229 + .../klauspost/compress/zstd/decoder.go | 948 ++ .../compress/zstd/decoder_options.go | 169 + .../klauspost/compress/zstd/dict.go | 534 + .../klauspost/compress/zstd/enc_base.go | 173 + .../klauspost/compress/zstd/enc_best.go | 530 + .../klauspost/compress/zstd/enc_better.go | 1242 +++ .../klauspost/compress/zstd/enc_dfast.go | 1123 ++ .../klauspost/compress/zstd/enc_fast.go | 891 ++ .../klauspost/compress/zstd/encoder.go | 619 ++ .../compress/zstd/encoder_options.go | 339 + .../klauspost/compress/zstd/framedec.go | 413 + .../klauspost/compress/zstd/frameenc.go | 137 + .../klauspost/compress/zstd/fse_decoder.go | 307 + .../compress/zstd/fse_decoder_amd64.go | 65 + .../compress/zstd/fse_decoder_amd64.s | 126 + .../compress/zstd/fse_decoder_generic.go | 72 + .../klauspost/compress/zstd/fse_encoder.go | 701 ++ .../klauspost/compress/zstd/fse_predefined.go | 158 + .../klauspost/compress/zstd/hash.go | 35 + .../klauspost/compress/zstd/history.go | 116 + .../compress/zstd/internal/xxhash/LICENSE.txt | 22 + .../compress/zstd/internal/xxhash/README.md | 71 + .../compress/zstd/internal/xxhash/xxhash.go | 230 + .../zstd/internal/xxhash/xxhash_amd64.s | 210 + .../zstd/internal/xxhash/xxhash_arm64.s | 184 + .../zstd/internal/xxhash/xxhash_asm.go | 16 + .../zstd/internal/xxhash/xxhash_other.go | 76 + .../zstd/internal/xxhash/xxhash_safe.go | 11 + .../klauspost/compress/zstd/matchlen_amd64.go | 16 + .../klauspost/compress/zstd/matchlen_amd64.s | 68 + .../compress/zstd/matchlen_generic.go | 33 + .../klauspost/compress/zstd/seqdec.go | 503 + .../klauspost/compress/zstd/seqdec_amd64.go | 394 + .../klauspost/compress/zstd/seqdec_amd64.s | 4175 ++++++++ .../klauspost/compress/zstd/seqdec_generic.go | 237 + .../klauspost/compress/zstd/seqenc.go | 114 + .../klauspost/compress/zstd/snappy.go | 434 + .../github.com/klauspost/compress/zstd/zip.go | 141 + .../klauspost/compress/zstd/zstd.go | 121 + vendor/github.com/kr/pretty/.gitignore | 5 + vendor/github.com/kr/pretty/License | 19 + vendor/github.com/kr/pretty/Readme | 9 + vendor/github.com/kr/pretty/diff.go | 295 + vendor/github.com/kr/pretty/formatter.go | 355 + vendor/github.com/kr/pretty/pretty.go | 108 + vendor/github.com/kr/pretty/zero.go | 41 + vendor/github.com/kr/text/License | 19 + vendor/github.com/kr/text/Readme | 3 + vendor/github.com/kr/text/doc.go | 3 + vendor/github.com/kr/text/indent.go | 74 + vendor/github.com/kr/text/wrap.go | 86 + .../golang_protobuf_extensions/LICENSE | 201 + .../golang_protobuf_extensions/NOTICE | 1 + .../pbutil/.gitignore | 1 + .../pbutil/Makefile | 7 + .../pbutil/decode.go | 75 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + vendor/github.com/pkg/errors/.gitignore | 24 + vendor/github.com/pkg/errors/.travis.yml | 10 + vendor/github.com/pkg/errors/LICENSE | 23 + vendor/github.com/pkg/errors/Makefile | 44 + vendor/github.com/pkg/errors/README.md | 59 + vendor/github.com/pkg/errors/appveyor.yml | 32 + vendor/github.com/pkg/errors/errors.go | 288 + vendor/github.com/pkg/errors/go113.go | 38 + vendor/github.com/pkg/errors/stack.go | 177 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../client_golang/prometheus/.gitignore | 1 + .../client_golang/prometheus/README.md | 1 + .../prometheus/build_info_collector.go | 38 + .../client_golang/prometheus/collector.go | 128 + .../client_golang/prometheus/counter.go | 358 + .../client_golang/prometheus/desc.go | 207 + .../client_golang/prometheus/doc.go | 210 + .../prometheus/expvar_collector.go | 86 + .../client_golang/prometheus/fnv.go | 42 + .../client_golang/prometheus/gauge.go | 311 + .../client_golang/prometheus/get_pid.go | 26 + .../prometheus/get_pid_gopherjs.go | 23 + .../client_golang/prometheus/go_collector.go | 281 + .../prometheus/go_collector_go116.go | 122 + .../prometheus/go_collector_latest.go | 567 + .../client_golang/prometheus/histogram.go | 1531 +++ .../prometheus/internal/almost_equal.go | 60 + .../prometheus/internal/difflib.go | 654 ++ .../internal/go_collector_options.go | 32 + .../prometheus/internal/go_runtime_metrics.go | 142 + .../prometheus/internal/metric.go | 101 + .../client_golang/prometheus/labels.go | 186 + .../client_golang/prometheus/metric.go | 257 + .../client_golang/prometheus/num_threads.go | 25 + .../prometheus/num_threads_gopherjs.go | 22 + .../client_golang/prometheus/observer.go | 64 + .../prometheus/process_collector.go | 164 + .../prometheus/process_collector_js.go | 26 + .../prometheus/process_collector_other.go | 66 + .../prometheus/process_collector_windows.go | 116 + .../client_golang/prometheus/registry.go | 1075 ++ .../client_golang/prometheus/summary.go | 785 ++ .../client_golang/prometheus/timer.go | 81 + .../client_golang/prometheus/untyped.go | 42 + .../client_golang/prometheus/value.go | 274 + .../client_golang/prometheus/vec.go | 709 ++ .../client_golang/prometheus/vnext.go | 23 + .../client_golang/prometheus/wrap.go | 214 + .../prometheus/client_model/LICENSE | 201 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 1376 +++ vendor/github.com/prometheus/common/LICENSE | 201 + vendor/github.com/prometheus/common/NOTICE | 5 + .../prometheus/common/expfmt/decode.go | 428 + .../prometheus/common/expfmt/encode.go | 165 + .../prometheus/common/expfmt/expfmt.go | 43 + .../prometheus/common/expfmt/fuzz.go | 37 + .../common/expfmt/openmetrics_create.go | 527 + .../prometheus/common/expfmt/text_create.go | 464 + .../prometheus/common/expfmt/text_parse.go | 779 ++ .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 160 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 218 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 102 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/time.go | 340 + .../prometheus/common/model/value.go | 366 + .../prometheus/common/model/value_float.go | 100 + .../common/model/value_histogram.go | 178 + .../prometheus/common/model/value_type.go | 83 + .../github.com/prometheus/procfs/.gitignore | 2 + .../prometheus/procfs/.golangci.yml | 15 + .../prometheus/procfs/CODE_OF_CONDUCT.md | 3 + .../prometheus/procfs/CONTRIBUTING.md | 121 + vendor/github.com/prometheus/procfs/LICENSE | 201 + .../prometheus/procfs/MAINTAINERS.md | 2 + vendor/github.com/prometheus/procfs/Makefile | 31 + .../prometheus/procfs/Makefile.common | 269 + vendor/github.com/prometheus/procfs/NOTICE | 7 + vendor/github.com/prometheus/procfs/README.md | 61 + .../github.com/prometheus/procfs/SECURITY.md | 6 + vendor/github.com/prometheus/procfs/arp.go | 116 + .../github.com/prometheus/procfs/buddyinfo.go | 85 + .../github.com/prometheus/procfs/cmdline.go | 30 + .../github.com/prometheus/procfs/cpuinfo.go | 519 + .../prometheus/procfs/cpuinfo_armx.go | 20 + .../prometheus/procfs/cpuinfo_loong64.go | 19 + .../prometheus/procfs/cpuinfo_mipsx.go | 20 + .../prometheus/procfs/cpuinfo_others.go | 19 + .../prometheus/procfs/cpuinfo_ppcx.go | 20 + .../prometheus/procfs/cpuinfo_riscvx.go | 20 + .../prometheus/procfs/cpuinfo_s390x.go | 19 + .../prometheus/procfs/cpuinfo_x86.go | 20 + vendor/github.com/prometheus/procfs/crypto.go | 154 + vendor/github.com/prometheus/procfs/doc.go | 44 + vendor/github.com/prometheus/procfs/fs.go | 50 + .../prometheus/procfs/fs_statfs_notype.go | 23 + .../prometheus/procfs/fs_statfs_type.go | 33 + .../github.com/prometheus/procfs/fscache.go | 422 + .../prometheus/procfs/internal/fs/fs.go | 55 + .../prometheus/procfs/internal/util/parse.go | 112 + .../procfs/internal/util/readfile.go | 37 + .../procfs/internal/util/sysreadfile.go | 50 + .../internal/util/sysreadfile_compat.go | 27 + .../procfs/internal/util/valueparser.go | 91 + vendor/github.com/prometheus/procfs/ipvs.go | 241 + .../prometheus/procfs/kernel_random.go | 63 + .../github.com/prometheus/procfs/loadavg.go | 62 + vendor/github.com/prometheus/procfs/mdstat.go | 266 + .../github.com/prometheus/procfs/meminfo.go | 277 + .../github.com/prometheus/procfs/mountinfo.go | 180 + .../prometheus/procfs/mountstats.go | 712 ++ .../prometheus/procfs/net_conntrackstat.go | 118 + .../github.com/prometheus/procfs/net_dev.go | 205 + .../prometheus/procfs/net_ip_socket.go | 228 + .../prometheus/procfs/net_protocols.go | 180 + .../github.com/prometheus/procfs/net_route.go | 143 + .../prometheus/procfs/net_sockstat.go | 162 + .../prometheus/procfs/net_softnet.go | 155 + .../github.com/prometheus/procfs/net_tcp.go | 64 + .../github.com/prometheus/procfs/net_udp.go | 64 + .../github.com/prometheus/procfs/net_unix.go | 257 + .../prometheus/procfs/net_wireless.go | 182 + .../github.com/prometheus/procfs/net_xfrm.go | 189 + .../github.com/prometheus/procfs/netstat.go | 82 + vendor/github.com/prometheus/procfs/proc.go | 338 + .../prometheus/procfs/proc_cgroup.go | 98 + .../prometheus/procfs/proc_cgroups.go | 98 + .../prometheus/procfs/proc_environ.go | 37 + .../prometheus/procfs/proc_fdinfo.go | 138 + .../prometheus/procfs/proc_interrupts.go | 98 + .../github.com/prometheus/procfs/proc_io.go | 59 + .../prometheus/procfs/proc_limits.go | 160 + .../github.com/prometheus/procfs/proc_maps.go | 211 + .../prometheus/procfs/proc_netstat.go | 443 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../github.com/prometheus/procfs/proc_psi.go | 102 + .../prometheus/procfs/proc_smaps.go | 166 + .../github.com/prometheus/procfs/proc_snmp.go | 353 + .../prometheus/procfs/proc_snmp6.go | 381 + .../github.com/prometheus/procfs/proc_stat.go | 222 + .../prometheus/procfs/proc_status.go | 221 + .../github.com/prometheus/procfs/proc_sys.go | 51 + .../github.com/prometheus/procfs/schedstat.go | 121 + vendor/github.com/prometheus/procfs/slab.go | 151 + .../github.com/prometheus/procfs/softirqs.go | 160 + vendor/github.com/prometheus/procfs/stat.go | 258 + vendor/github.com/prometheus/procfs/swaps.go | 89 + vendor/github.com/prometheus/procfs/thread.go | 80 + vendor/github.com/prometheus/procfs/ttar | 413 + vendor/github.com/prometheus/procfs/vm.go | 212 + .../github.com/prometheus/procfs/zoneinfo.go | 196 + .../github.com/rogpeppe/go-internal/LICENSE | 27 + .../rogpeppe/go-internal/fmtsort/mapelem.go | 20 + .../rogpeppe/go-internal/fmtsort/sort.go | 209 + vendor/github.com/sirupsen/logrus/.gitignore | 4 + .../github.com/sirupsen/logrus/.golangci.yml | 40 + vendor/github.com/sirupsen/logrus/.travis.yml | 15 + .../github.com/sirupsen/logrus/CHANGELOG.md | 259 + vendor/github.com/sirupsen/logrus/LICENSE | 21 + vendor/github.com/sirupsen/logrus/README.md | 515 + vendor/github.com/sirupsen/logrus/alt_exit.go | 76 + .../github.com/sirupsen/logrus/appveyor.yml | 14 + .../github.com/sirupsen/logrus/buffer_pool.go | 43 + vendor/github.com/sirupsen/logrus/doc.go | 26 + vendor/github.com/sirupsen/logrus/entry.go | 442 + vendor/github.com/sirupsen/logrus/exported.go | 270 + .../github.com/sirupsen/logrus/formatter.go | 78 + vendor/github.com/sirupsen/logrus/hooks.go | 34 + .../sirupsen/logrus/json_formatter.go | 128 + vendor/github.com/sirupsen/logrus/logger.go | 417 + 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 | 27 + .../sirupsen/logrus/text_formatter.go | 339 + vendor/github.com/sirupsen/logrus/writer.go | 102 + vendor/golang.org/x/crypto/LICENSE | 27 + vendor/golang.org/x/crypto/PATENTS | 22 + vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go | 77 + vendor/golang.org/x/exp/LICENSE | 27 + vendor/golang.org/x/exp/PATENTS | 22 + .../x/exp/constraints/constraints.go | 50 + vendor/golang.org/x/exp/rand/exp.go | 221 + vendor/golang.org/x/exp/rand/normal.go | 156 + vendor/golang.org/x/exp/rand/rand.go | 372 + vendor/golang.org/x/exp/rand/rng.go | 91 + vendor/golang.org/x/exp/rand/zipf.go | 77 + vendor/golang.org/x/exp/slices/cmp.go | 44 + vendor/golang.org/x/exp/slices/slices.go | 499 + vendor/golang.org/x/exp/slices/sort.go | 195 + .../golang.org/x/exp/slices/zsortanyfunc.go | 479 + .../golang.org/x/exp/slices/zsortordered.go | 481 + vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + vendor/golang.org/x/sys/execabs/execabs.go | 102 + .../golang.org/x/sys/execabs/execabs_go118.go | 18 + .../golang.org/x/sys/execabs/execabs_go119.go | 21 + vendor/golang.org/x/sys/unix/.gitignore | 2 + vendor/golang.org/x/sys/unix/README.md | 184 + .../golang.org/x/sys/unix/affinity_linux.go | 86 + vendor/golang.org/x/sys/unix/aliases.go | 15 + vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 18 + vendor/golang.org/x/sys/unix/asm_bsd_386.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 31 + .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 29 + vendor/golang.org/x/sys/unix/asm_linux_386.s | 66 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 58 + vendor/golang.org/x/sys/unix/asm_linux_arm.s | 57 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 53 + .../golang.org/x/sys/unix/asm_linux_loong64.s | 54 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 57 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 55 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 45 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 49 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 57 + .../x/sys/unix/asm_openbsd_mips64.s | 30 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 18 + vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 426 + .../golang.org/x/sys/unix/bluetooth_linux.go | 36 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 196 + vendor/golang.org/x/sys/unix/constants.go | 14 + vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 + vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_zos.go | 29 + vendor/golang.org/x/sys/unix/dirent.go | 103 + vendor/golang.org/x/sys/unix/endian_big.go | 10 + vendor/golang.org/x/sys/unix/endian_little.go | 10 + vendor/golang.org/x/sys/unix/env_unix.go | 32 + vendor/golang.org/x/sys/unix/epoll_zos.go | 221 + vendor/golang.org/x/sys/unix/fcntl.go | 37 + vendor/golang.org/x/sys/unix/fcntl_darwin.go | 24 + .../x/sys/unix/fcntl_linux_32bit.go | 14 + vendor/golang.org/x/sys/unix/fdset.go | 30 + vendor/golang.org/x/sys/unix/fstatfs_zos.go | 164 + vendor/golang.org/x/sys/unix/gccgo.go | 60 + vendor/golang.org/x/sys/unix/gccgo_c.c | 45 + .../x/sys/unix/gccgo_linux_amd64.go | 21 + vendor/golang.org/x/sys/unix/ifreq_linux.go | 142 + vendor/golang.org/x/sys/unix/ioctl_linux.go | 233 + vendor/golang.org/x/sys/unix/ioctl_signed.go | 70 + .../golang.org/x/sys/unix/ioctl_unsigned.go | 70 + vendor/golang.org/x/sys/unix/ioctl_zos.go | 72 + vendor/golang.org/x/sys/unix/mkall.sh | 249 + vendor/golang.org/x/sys/unix/mkerrors.sh | 784 ++ vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 16 + .../golang.org/x/sys/unix/pledge_openbsd.go | 163 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 12 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 12 + vendor/golang.org/x/sys/unix/race.go | 31 + vendor/golang.org/x/sys/unix/race0.go | 26 + .../x/sys/unix/readdirent_getdents.go | 13 + .../x/sys/unix/readdirent_getdirentries.go | 20 + .../x/sys/unix/sockcmsg_dragonfly.go | 16 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 85 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 107 + .../x/sys/unix/sockcmsg_unix_other.go | 47 + vendor/golang.org/x/sys/unix/syscall.go | 87 + vendor/golang.org/x/sys/unix/syscall_aix.go | 582 + .../golang.org/x/sys/unix/syscall_aix_ppc.go | 53 + .../x/sys/unix/syscall_aix_ppc64.go | 84 + vendor/golang.org/x/sys/unix/syscall_bsd.go | 610 ++ .../golang.org/x/sys/unix/syscall_darwin.go | 646 ++ .../x/sys/unix/syscall_darwin_amd64.go | 51 + .../x/sys/unix/syscall_darwin_arm64.go | 51 + .../x/sys/unix/syscall_darwin_libSystem.go | 27 + .../x/sys/unix/syscall_dragonfly.go | 347 + .../x/sys/unix/syscall_dragonfly_amd64.go | 57 + .../golang.org/x/sys/unix/syscall_freebsd.go | 453 + .../x/sys/unix/syscall_freebsd_386.go | 65 + .../x/sys/unix/syscall_freebsd_amd64.go | 65 + .../x/sys/unix/syscall_freebsd_arm.go | 61 + .../x/sys/unix/syscall_freebsd_arm64.go | 61 + .../x/sys/unix/syscall_freebsd_riscv64.go | 61 + vendor/golang.org/x/sys/unix/syscall_hurd.go | 30 + .../golang.org/x/sys/unix/syscall_hurd_386.go | 29 + .../golang.org/x/sys/unix/syscall_illumos.go | 79 + vendor/golang.org/x/sys/unix/syscall_linux.go | 2484 +++++ .../x/sys/unix/syscall_linux_386.go | 315 + .../x/sys/unix/syscall_linux_alarm.go | 14 + .../x/sys/unix/syscall_linux_amd64.go | 146 + .../x/sys/unix/syscall_linux_amd64_gc.go | 13 + .../x/sys/unix/syscall_linux_arm.go | 217 + .../x/sys/unix/syscall_linux_arm64.go | 185 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 15 + .../x/sys/unix/syscall_linux_gc_386.go | 17 + .../x/sys/unix/syscall_linux_gc_arm.go | 14 + .../x/sys/unix/syscall_linux_gccgo_386.go | 31 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 21 + .../x/sys/unix/syscall_linux_loong64.go | 217 + .../x/sys/unix/syscall_linux_mips64x.go | 190 + .../x/sys/unix/syscall_linux_mipsx.go | 176 + .../x/sys/unix/syscall_linux_ppc.go | 205 + .../x/sys/unix/syscall_linux_ppc64x.go | 117 + .../x/sys/unix/syscall_linux_riscv64.go | 190 + .../x/sys/unix/syscall_linux_s390x.go | 297 + .../x/sys/unix/syscall_linux_sparc64.go | 113 + .../golang.org/x/sys/unix/syscall_netbsd.go | 371 + .../x/sys/unix/syscall_netbsd_386.go | 38 + .../x/sys/unix/syscall_netbsd_amd64.go | 38 + .../x/sys/unix/syscall_netbsd_arm.go | 38 + .../x/sys/unix/syscall_netbsd_arm64.go | 38 + .../golang.org/x/sys/unix/syscall_openbsd.go | 329 + .../x/sys/unix/syscall_openbsd_386.go | 42 + .../x/sys/unix/syscall_openbsd_amd64.go | 42 + .../x/sys/unix/syscall_openbsd_arm.go | 42 + .../x/sys/unix/syscall_openbsd_arm64.go | 42 + .../x/sys/unix/syscall_openbsd_libc.go | 27 + .../x/sys/unix/syscall_openbsd_mips64.go | 39 + .../x/sys/unix/syscall_openbsd_ppc64.go | 42 + .../x/sys/unix/syscall_openbsd_riscv64.go | 42 + .../golang.org/x/sys/unix/syscall_solaris.go | 1103 ++ .../x/sys/unix/syscall_solaris_amd64.go | 28 + vendor/golang.org/x/sys/unix/syscall_unix.go | 607 ++ .../golang.org/x/sys/unix/syscall_unix_gc.go | 16 + .../x/sys/unix/syscall_unix_gc_ppc64x.go | 25 + .../x/sys/unix/syscall_zos_s390x.go | 1979 ++++ vendor/golang.org/x/sys/unix/sysvshm_linux.go | 21 + vendor/golang.org/x/sys/unix/sysvshm_unix.go | 52 + .../x/sys/unix/sysvshm_unix_other.go | 14 + vendor/golang.org/x/sys/unix/timestruct.go | 77 + .../golang.org/x/sys/unix/unveil_openbsd.go | 42 + vendor/golang.org/x/sys/unix/xattr_bsd.go | 281 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1385 +++ .../x/sys/unix/zerrors_aix_ppc64.go | 1386 +++ .../x/sys/unix/zerrors_darwin_amd64.go | 1911 ++++ .../x/sys/unix/zerrors_darwin_arm64.go | 1911 ++++ .../x/sys/unix/zerrors_dragonfly_amd64.go | 1738 +++ .../x/sys/unix/zerrors_freebsd_386.go | 2043 ++++ .../x/sys/unix/zerrors_freebsd_amd64.go | 2040 ++++ .../x/sys/unix/zerrors_freebsd_arm.go | 2034 ++++ .../x/sys/unix/zerrors_freebsd_arm64.go | 2034 ++++ .../x/sys/unix/zerrors_freebsd_riscv64.go | 2148 ++++ vendor/golang.org/x/sys/unix/zerrors_linux.go | 3539 ++++++ .../x/sys/unix/zerrors_linux_386.go | 840 ++ .../x/sys/unix/zerrors_linux_amd64.go | 840 ++ .../x/sys/unix/zerrors_linux_arm.go | 846 ++ .../x/sys/unix/zerrors_linux_arm64.go | 840 ++ .../x/sys/unix/zerrors_linux_loong64.go | 832 ++ .../x/sys/unix/zerrors_linux_mips.go | 847 ++ .../x/sys/unix/zerrors_linux_mips64.go | 847 ++ .../x/sys/unix/zerrors_linux_mips64le.go | 847 ++ .../x/sys/unix/zerrors_linux_mipsle.go | 847 ++ .../x/sys/unix/zerrors_linux_ppc.go | 899 ++ .../x/sys/unix/zerrors_linux_ppc64.go | 903 ++ .../x/sys/unix/zerrors_linux_ppc64le.go | 903 ++ .../x/sys/unix/zerrors_linux_riscv64.go | 827 ++ .../x/sys/unix/zerrors_linux_s390x.go | 902 ++ .../x/sys/unix/zerrors_linux_sparc64.go | 945 ++ .../x/sys/unix/zerrors_netbsd_386.go | 1780 ++++ .../x/sys/unix/zerrors_netbsd_amd64.go | 1770 +++ .../x/sys/unix/zerrors_netbsd_arm.go | 1759 +++ .../x/sys/unix/zerrors_netbsd_arm64.go | 1770 +++ .../x/sys/unix/zerrors_openbsd_386.go | 1906 ++++ .../x/sys/unix/zerrors_openbsd_amd64.go | 1906 ++++ .../x/sys/unix/zerrors_openbsd_arm.go | 1906 ++++ .../x/sys/unix/zerrors_openbsd_arm64.go | 1906 ++++ .../x/sys/unix/zerrors_openbsd_mips64.go | 1906 ++++ .../x/sys/unix/zerrors_openbsd_ppc64.go | 1905 ++++ .../x/sys/unix/zerrors_openbsd_riscv64.go | 1904 ++++ .../x/sys/unix/zerrors_solaris_amd64.go | 1557 +++ .../x/sys/unix/zerrors_zos_s390x.go | 860 ++ .../x/sys/unix/zptrace_armnn_linux.go | 42 + .../x/sys/unix/zptrace_linux_arm64.go | 17 + .../x/sys/unix/zptrace_mipsnn_linux.go | 51 + .../x/sys/unix/zptrace_mipsnnle_linux.go | 51 + .../x/sys/unix/zptrace_x86_linux.go | 81 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1462 +++ .../x/sys/unix/zsyscall_aix_ppc64.go | 1421 +++ .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1189 +++ .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1070 ++ .../x/sys/unix/zsyscall_darwin_amd64.go | 2544 +++++ .../x/sys/unix/zsyscall_darwin_amd64.s | 754 ++ .../x/sys/unix/zsyscall_darwin_arm64.go | 2544 +++++ .../x/sys/unix/zsyscall_darwin_arm64.s | 754 ++ .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1667 +++ .../x/sys/unix/zsyscall_freebsd_386.go | 1887 ++++ .../x/sys/unix/zsyscall_freebsd_amd64.go | 1887 ++++ .../x/sys/unix/zsyscall_freebsd_arm.go | 1887 ++++ .../x/sys/unix/zsyscall_freebsd_arm64.go | 1887 ++++ .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1887 ++++ .../x/sys/unix/zsyscall_illumos_amd64.go | 102 + .../golang.org/x/sys/unix/zsyscall_linux.go | 2197 ++++ .../x/sys/unix/zsyscall_linux_386.go | 487 + .../x/sys/unix/zsyscall_linux_amd64.go | 654 ++ .../x/sys/unix/zsyscall_linux_arm.go | 602 ++ .../x/sys/unix/zsyscall_linux_arm64.go | 553 + .../x/sys/unix/zsyscall_linux_loong64.go | 487 + .../x/sys/unix/zsyscall_linux_mips.go | 654 ++ .../x/sys/unix/zsyscall_linux_mips64.go | 648 ++ .../x/sys/unix/zsyscall_linux_mips64le.go | 637 ++ .../x/sys/unix/zsyscall_linux_mipsle.go | 654 ++ .../x/sys/unix/zsyscall_linux_ppc.go | 659 ++ .../x/sys/unix/zsyscall_linux_ppc64.go | 705 ++ .../x/sys/unix/zsyscall_linux_ppc64le.go | 705 ++ .../x/sys/unix/zsyscall_linux_riscv64.go | 549 + .../x/sys/unix/zsyscall_linux_s390x.go | 496 + .../x/sys/unix/zsyscall_linux_sparc64.go | 649 ++ .../x/sys/unix/zsyscall_netbsd_386.go | 1849 ++++ .../x/sys/unix/zsyscall_netbsd_amd64.go | 1849 ++++ .../x/sys/unix/zsyscall_netbsd_arm.go | 1849 ++++ .../x/sys/unix/zsyscall_netbsd_arm64.go | 1849 ++++ .../x/sys/unix/zsyscall_openbsd_386.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_386.s | 674 ++ .../x/sys/unix/zsyscall_openbsd_amd64.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_amd64.s | 674 ++ .../x/sys/unix/zsyscall_openbsd_arm.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_arm.s | 674 ++ .../x/sys/unix/zsyscall_openbsd_arm64.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_arm64.s | 674 ++ .../x/sys/unix/zsyscall_openbsd_mips64.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_mips64.s | 674 ++ .../x/sys/unix/zsyscall_openbsd_ppc64.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_ppc64.s | 808 ++ .../x/sys/unix/zsyscall_openbsd_riscv64.go | 2231 ++++ .../x/sys/unix/zsyscall_openbsd_riscv64.s | 674 ++ .../x/sys/unix/zsyscall_solaris_amd64.go | 2104 ++++ .../x/sys/unix/zsyscall_zos_s390x.go | 1254 +++ .../x/sys/unix/zsysctl_openbsd_386.go | 281 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 281 + .../x/sys/unix/zsysctl_openbsd_arm.go | 281 + .../x/sys/unix/zsysctl_openbsd_arm64.go | 281 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 281 + .../x/sys/unix/zsysctl_openbsd_ppc64.go | 281 + .../x/sys/unix/zsysctl_openbsd_riscv64.go | 282 + .../x/sys/unix/zsysnum_darwin_amd64.go | 440 + .../x/sys/unix/zsysnum_darwin_arm64.go | 438 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 317 + .../x/sys/unix/zsysnum_freebsd_386.go | 394 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 394 + .../x/sys/unix/zsysnum_freebsd_arm.go | 394 + .../x/sys/unix/zsysnum_freebsd_arm64.go | 394 + .../x/sys/unix/zsysnum_freebsd_riscv64.go | 394 + .../x/sys/unix/zsysnum_linux_386.go | 451 + .../x/sys/unix/zsysnum_linux_amd64.go | 373 + .../x/sys/unix/zsysnum_linux_arm.go | 415 + .../x/sys/unix/zsysnum_linux_arm64.go | 318 + .../x/sys/unix/zsysnum_linux_loong64.go | 312 + .../x/sys/unix/zsysnum_linux_mips.go | 435 + .../x/sys/unix/zsysnum_linux_mips64.go | 365 + .../x/sys/unix/zsysnum_linux_mips64le.go | 365 + .../x/sys/unix/zsysnum_linux_mipsle.go | 435 + .../x/sys/unix/zsysnum_linux_ppc.go | 442 + .../x/sys/unix/zsysnum_linux_ppc64.go | 414 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 414 + .../x/sys/unix/zsysnum_linux_riscv64.go | 319 + .../x/sys/unix/zsysnum_linux_s390x.go | 380 + .../x/sys/unix/zsysnum_linux_sparc64.go | 393 + .../x/sys/unix/zsysnum_netbsd_386.go | 275 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 275 + .../x/sys/unix/zsysnum_netbsd_arm.go | 275 + .../x/sys/unix/zsysnum_netbsd_arm64.go | 275 + .../x/sys/unix/zsysnum_openbsd_386.go | 220 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 220 + .../x/sys/unix/zsysnum_openbsd_arm.go | 220 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 219 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 222 + .../x/sys/unix/zsysnum_openbsd_ppc64.go | 218 + .../x/sys/unix/zsysnum_openbsd_riscv64.go | 219 + .../x/sys/unix/zsysnum_zos_s390x.go | 2670 +++++ .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 354 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 358 + .../x/sys/unix/ztypes_darwin_amd64.go | 806 ++ .../x/sys/unix/ztypes_darwin_arm64.go | 806 ++ .../x/sys/unix/ztypes_dragonfly_amd64.go | 474 + .../x/sys/unix/ztypes_freebsd_386.go | 651 ++ .../x/sys/unix/ztypes_freebsd_amd64.go | 656 ++ .../x/sys/unix/ztypes_freebsd_arm.go | 642 ++ .../x/sys/unix/ztypes_freebsd_arm64.go | 636 ++ .../x/sys/unix/ztypes_freebsd_riscv64.go | 638 ++ vendor/golang.org/x/sys/unix/ztypes_linux.go | 5885 ++++++++++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 698 ++ .../x/sys/unix/ztypes_linux_amd64.go | 713 ++ .../golang.org/x/sys/unix/ztypes_linux_arm.go | 693 ++ .../x/sys/unix/ztypes_linux_arm64.go | 692 ++ .../x/sys/unix/ztypes_linux_loong64.go | 693 ++ .../x/sys/unix/ztypes_linux_mips.go | 698 ++ .../x/sys/unix/ztypes_linux_mips64.go | 695 ++ .../x/sys/unix/ztypes_linux_mips64le.go | 695 ++ .../x/sys/unix/ztypes_linux_mipsle.go | 698 ++ .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 706 ++ .../x/sys/unix/ztypes_linux_ppc64.go | 701 ++ .../x/sys/unix/ztypes_linux_ppc64le.go | 701 ++ .../x/sys/unix/ztypes_linux_riscv64.go | 747 ++ .../x/sys/unix/ztypes_linux_s390x.go | 715 ++ .../x/sys/unix/ztypes_linux_sparc64.go | 696 ++ .../x/sys/unix/ztypes_netbsd_386.go | 586 + .../x/sys/unix/ztypes_netbsd_amd64.go | 594 ++ .../x/sys/unix/ztypes_netbsd_arm.go | 591 + .../x/sys/unix/ztypes_netbsd_arm64.go | 594 ++ .../x/sys/unix/ztypes_openbsd_386.go | 569 + .../x/sys/unix/ztypes_openbsd_amd64.go | 569 + .../x/sys/unix/ztypes_openbsd_arm.go | 576 + .../x/sys/unix/ztypes_openbsd_arm64.go | 569 + .../x/sys/unix/ztypes_openbsd_mips64.go | 569 + .../x/sys/unix/ztypes_openbsd_ppc64.go | 571 + .../x/sys/unix/ztypes_openbsd_riscv64.go | 571 + .../x/sys/unix/ztypes_solaris_amd64.go | 517 + .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 415 + vendor/golang.org/x/sys/windows/aliases.go | 13 + .../golang.org/x/sys/windows/dll_windows.go | 416 + vendor/golang.org/x/sys/windows/empty.s | 9 + .../golang.org/x/sys/windows/env_windows.go | 54 + vendor/golang.org/x/sys/windows/eventlog.go | 21 + .../golang.org/x/sys/windows/exec_windows.go | 248 + .../x/sys/windows/memory_windows.go | 48 + vendor/golang.org/x/sys/windows/mkerrors.bash | 70 + .../x/sys/windows/mkknownfolderids.bash | 27 + vendor/golang.org/x/sys/windows/mksyscall.go | 10 + vendor/golang.org/x/sys/windows/race.go | 31 + vendor/golang.org/x/sys/windows/race0.go | 26 + .../x/sys/windows/security_windows.go | 1435 +++ vendor/golang.org/x/sys/windows/service.go | 258 + .../x/sys/windows/setupapi_windows.go | 1425 +++ vendor/golang.org/x/sys/windows/str.go | 23 + vendor/golang.org/x/sys/windows/syscall.go | 105 + .../x/sys/windows/syscall_windows.go | 1832 ++++ .../golang.org/x/sys/windows/types_windows.go | 3356 ++++++ .../x/sys/windows/types_windows_386.go | 35 + .../x/sys/windows/types_windows_amd64.go | 34 + .../x/sys/windows/types_windows_arm.go | 35 + .../x/sys/windows/types_windows_arm64.go | 34 + .../x/sys/windows/zerrors_windows.go | 9468 +++++++++++++++++ .../x/sys/windows/zknownfolderids_windows.go | 149 + .../x/sys/windows/zsyscall_windows.go | 4381 ++++++++ vendor/golang.org/x/text/LICENSE | 27 + vendor/golang.org/x/text/PATENTS | 22 + vendor/golang.org/x/text/cases/cases.go | 162 + vendor/golang.org/x/text/cases/context.go | 376 + vendor/golang.org/x/text/cases/fold.go | 34 + vendor/golang.org/x/text/cases/icu.go | 62 + vendor/golang.org/x/text/cases/info.go | 82 + vendor/golang.org/x/text/cases/map.go | 816 ++ .../golang.org/x/text/cases/tables10.0.0.go | 2256 ++++ .../golang.org/x/text/cases/tables11.0.0.go | 2317 ++++ .../golang.org/x/text/cases/tables12.0.0.go | 2360 ++++ .../golang.org/x/text/cases/tables13.0.0.go | 2400 +++++ .../golang.org/x/text/cases/tables15.0.0.go | 2528 +++++ vendor/golang.org/x/text/cases/tables9.0.0.go | 2216 ++++ vendor/golang.org/x/text/cases/trieval.go | 217 + .../x/text/encoding/charmap/charmap.go | 249 + .../x/text/encoding/charmap/tables.go | 7410 +++++++++++++ vendor/golang.org/x/text/encoding/encoding.go | 335 + .../internal/identifier/identifier.go | 81 + .../text/encoding/internal/identifier/mib.go | 1627 +++ .../x/text/encoding/internal/internal.go | 75 + vendor/golang.org/x/text/internal/internal.go | 49 + .../x/text/internal/language/common.go | 16 + .../x/text/internal/language/compact.go | 29 + .../text/internal/language/compact/compact.go | 61 + .../internal/language/compact/language.go | 260 + .../text/internal/language/compact/parents.go | 120 + .../text/internal/language/compact/tables.go | 1015 ++ .../x/text/internal/language/compact/tags.go | 91 + .../x/text/internal/language/compose.go | 167 + .../x/text/internal/language/coverage.go | 28 + .../x/text/internal/language/language.go | 627 ++ .../x/text/internal/language/lookup.go | 412 + .../x/text/internal/language/match.go | 226 + .../x/text/internal/language/parse.go | 608 ++ .../x/text/internal/language/tables.go | 3494 ++++++ .../x/text/internal/language/tags.go | 48 + vendor/golang.org/x/text/internal/match.go | 67 + vendor/golang.org/x/text/internal/tag/tag.go | 100 + vendor/golang.org/x/text/language/coverage.go | 187 + vendor/golang.org/x/text/language/doc.go | 98 + vendor/golang.org/x/text/language/language.go | 605 ++ vendor/golang.org/x/text/language/match.go | 735 ++ vendor/golang.org/x/text/language/parse.go | 256 + vendor/golang.org/x/text/language/tables.go | 298 + vendor/golang.org/x/text/language/tags.go | 145 + .../golang.org/x/text/transform/transform.go | 709 ++ .../x/text/unicode/norm/composition.go | 512 + .../x/text/unicode/norm/forminfo.go | 279 + .../golang.org/x/text/unicode/norm/input.go | 109 + vendor/golang.org/x/text/unicode/norm/iter.go | 458 + .../x/text/unicode/norm/normalize.go | 610 ++ .../x/text/unicode/norm/readwriter.go | 125 + .../x/text/unicode/norm/tables10.0.0.go | 7658 +++++++++++++ .../x/text/unicode/norm/tables11.0.0.go | 7694 ++++++++++++++ .../x/text/unicode/norm/tables12.0.0.go | 7711 ++++++++++++++ .../x/text/unicode/norm/tables13.0.0.go | 7761 ++++++++++++++ .../x/text/unicode/norm/tables15.0.0.go | 7908 ++++++++++++++ .../x/text/unicode/norm/tables9.0.0.go | 7638 +++++++++++++ .../x/text/unicode/norm/transform.go | 88 + vendor/golang.org/x/text/unicode/norm/trie.go | 54 + vendor/google.golang.org/protobuf/LICENSE | 27 + vendor/google.golang.org/protobuf/PATENTS | 22 + .../protobuf/encoding/prototext/decode.go | 770 ++ .../protobuf/encoding/prototext/doc.go | 7 + .../protobuf/encoding/prototext/encode.go | 376 + .../protobuf/encoding/protowire/wire.go | 547 + .../protobuf/internal/descfmt/stringer.go | 318 + .../protobuf/internal/descopts/options.go | 29 + .../protobuf/internal/detrand/rand.go | 69 + .../internal/encoding/defval/default.go | 213 + .../encoding/messageset/messageset.go | 242 + .../protobuf/internal/encoding/tag/tag.go | 207 + .../protobuf/internal/encoding/text/decode.go | 686 ++ .../internal/encoding/text/decode_number.go | 211 + .../internal/encoding/text/decode_string.go | 161 + .../internal/encoding/text/decode_token.go | 373 + .../protobuf/internal/encoding/text/doc.go | 29 + .../protobuf/internal/encoding/text/encode.go | 272 + .../protobuf/internal/errors/errors.go | 89 + .../protobuf/internal/errors/is_go112.go | 40 + .../protobuf/internal/errors/is_go113.go | 13 + .../protobuf/internal/filedesc/build.go | 157 + .../protobuf/internal/filedesc/desc.go | 633 ++ .../protobuf/internal/filedesc/desc_init.go | 471 + .../protobuf/internal/filedesc/desc_lazy.go | 704 ++ .../protobuf/internal/filedesc/desc_list.go | 457 + .../internal/filedesc/desc_list_gen.go | 356 + .../protobuf/internal/filedesc/placeholder.go | 109 + .../protobuf/internal/filetype/build.go | 296 + .../protobuf/internal/flags/flags.go | 24 + .../internal/flags/proto_legacy_disable.go | 10 + .../internal/flags/proto_legacy_enable.go | 10 + .../protobuf/internal/genid/any_gen.go | 34 + .../protobuf/internal/genid/api_gen.go | 106 + .../protobuf/internal/genid/descriptor_gen.go | 919 ++ .../protobuf/internal/genid/doc.go | 11 + .../protobuf/internal/genid/duration_gen.go | 34 + .../protobuf/internal/genid/empty_gen.go | 19 + .../protobuf/internal/genid/field_mask_gen.go | 31 + .../protobuf/internal/genid/goname.go | 25 + .../protobuf/internal/genid/map_entry.go | 16 + .../internal/genid/source_context_gen.go | 31 + .../protobuf/internal/genid/struct_gen.go | 116 + .../protobuf/internal/genid/timestamp_gen.go | 34 + .../protobuf/internal/genid/type_gen.go | 190 + .../protobuf/internal/genid/wrappers.go | 13 + .../protobuf/internal/genid/wrappers_gen.go | 175 + .../protobuf/internal/impl/api_export.go | 177 + .../protobuf/internal/impl/checkinit.go | 141 + .../protobuf/internal/impl/codec_extension.go | 223 + .../protobuf/internal/impl/codec_field.go | 830 ++ .../protobuf/internal/impl/codec_gen.go | 5637 ++++++++++ .../protobuf/internal/impl/codec_map.go | 388 + .../protobuf/internal/impl/codec_map_go111.go | 38 + .../protobuf/internal/impl/codec_map_go112.go | 12 + .../protobuf/internal/impl/codec_message.go | 217 + .../internal/impl/codec_messageset.go | 123 + .../protobuf/internal/impl/codec_reflect.go | 210 + .../protobuf/internal/impl/codec_tables.go | 557 + .../protobuf/internal/impl/codec_unsafe.go | 18 + .../protobuf/internal/impl/convert.go | 495 + .../protobuf/internal/impl/convert_list.go | 141 + .../protobuf/internal/impl/convert_map.go | 121 + .../protobuf/internal/impl/decode.go | 285 + .../protobuf/internal/impl/encode.go | 201 + .../protobuf/internal/impl/enum.go | 21 + .../protobuf/internal/impl/extension.go | 156 + .../protobuf/internal/impl/legacy_enum.go | 218 + .../protobuf/internal/impl/legacy_export.go | 92 + .../internal/impl/legacy_extension.go | 176 + .../protobuf/internal/impl/legacy_file.go | 81 + .../protobuf/internal/impl/legacy_message.go | 563 + .../protobuf/internal/impl/merge.go | 176 + .../protobuf/internal/impl/merge_gen.go | 209 + .../protobuf/internal/impl/message.go | 279 + .../protobuf/internal/impl/message_reflect.go | 463 + .../internal/impl/message_reflect_field.go | 543 + .../internal/impl/message_reflect_gen.go | 249 + .../protobuf/internal/impl/pointer_reflect.go | 179 + .../protobuf/internal/impl/pointer_unsafe.go | 175 + .../protobuf/internal/impl/validate.go | 576 + .../protobuf/internal/impl/weak.go | 74 + .../protobuf/internal/order/order.go | 89 + .../protobuf/internal/order/range.go | 115 + .../protobuf/internal/pragma/pragma.go | 29 + .../protobuf/internal/set/ints.go | 58 + .../protobuf/internal/strs/strings.go | 196 + .../protobuf/internal/strs/strings_pure.go | 28 + .../protobuf/internal/strs/strings_unsafe.go | 95 + .../protobuf/internal/version/version.go | 79 + .../protobuf/proto/checkinit.go | 71 + .../protobuf/proto/decode.go | 294 + .../protobuf/proto/decode_gen.go | 603 ++ .../google.golang.org/protobuf/proto/doc.go | 86 + .../protobuf/proto/encode.go | 322 + .../protobuf/proto/encode_gen.go | 97 + .../google.golang.org/protobuf/proto/equal.go | 57 + .../protobuf/proto/extension.go | 92 + .../google.golang.org/protobuf/proto/merge.go | 139 + .../protobuf/proto/messageset.go | 93 + .../google.golang.org/protobuf/proto/proto.go | 43 + .../protobuf/proto/proto_methods.go | 20 + .../protobuf/proto/proto_reflect.go | 20 + .../google.golang.org/protobuf/proto/reset.go | 43 + .../google.golang.org/protobuf/proto/size.go | 101 + .../protobuf/proto/size_gen.go | 55 + .../protobuf/proto/wrappers.go | 29 + .../protobuf/reflect/protodesc/desc.go | 276 + .../protobuf/reflect/protodesc/desc_init.go | 248 + .../reflect/protodesc/desc_resolve.go | 286 + .../reflect/protodesc/desc_validate.go | 374 + .../protobuf/reflect/protodesc/proto.go | 252 + .../protobuf/reflect/protoreflect/methods.go | 78 + .../protobuf/reflect/protoreflect/proto.go | 508 + .../protobuf/reflect/protoreflect/source.go | 129 + .../reflect/protoreflect/source_gen.go | 502 + .../protobuf/reflect/protoreflect/type.go | 666 ++ .../protobuf/reflect/protoreflect/value.go | 285 + .../reflect/protoreflect/value_equal.go | 168 + .../reflect/protoreflect/value_pure.go | 60 + .../reflect/protoreflect/value_union.go | 438 + .../reflect/protoreflect/value_unsafe.go | 99 + .../reflect/protoregistry/registry.go | 882 ++ .../protobuf/runtime/protoiface/legacy.go | 15 + .../protobuf/runtime/protoiface/methods.go | 168 + .../protobuf/runtime/protoimpl/impl.go | 44 + .../protobuf/runtime/protoimpl/version.go | 60 + .../types/descriptorpb/descriptor.pb.go | 4605 ++++++++ .../types/known/timestamppb/timestamp.pb.go | 383 + vendor/gopkg.in/tomb.v1/LICENSE | 29 + vendor/gopkg.in/tomb.v1/README.md | 4 + vendor/gopkg.in/tomb.v1/tomb.go | 176 + vendor/modules.txt | 229 + version.txt | 1 + 1522 files changed, 653924 insertions(+) create mode 100644 .gitignore create mode 100644 .golangci.yml create mode 100644 Design.txt create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 collection.go create mode 100644 commands.go create mode 100644 config.in create mode 100644 contrib/aleesa-jabber-go.openrc create mode 100644 data/sample_config.json create mode 100644 event_parser.go create mode 100644 globals.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 lib.go create mode 100644 main.go create mode 100644 redis.go create mode 100644 settings-db-util.go create mode 100644 types.go create mode 100644 vendor/github.com/DataDog/zstd/LICENSE create mode 100644 vendor/github.com/DataDog/zstd/README.md create mode 100644 vendor/github.com/DataDog/zstd/ZSTD_LICENSE create mode 100644 vendor/github.com/DataDog/zstd/allocations.h create mode 100644 vendor/github.com/DataDog/zstd/bits.h create mode 100644 vendor/github.com/DataDog/zstd/bitstream.h create mode 100644 vendor/github.com/DataDog/zstd/clevels.h create mode 100644 vendor/github.com/DataDog/zstd/compiler.h create mode 100644 vendor/github.com/DataDog/zstd/cover.c create mode 100644 vendor/github.com/DataDog/zstd/cover.h create mode 100644 vendor/github.com/DataDog/zstd/cpu.h create mode 100644 vendor/github.com/DataDog/zstd/debug.c create mode 100644 vendor/github.com/DataDog/zstd/debug.h create mode 100644 vendor/github.com/DataDog/zstd/divsufsort.c create mode 100644 vendor/github.com/DataDog/zstd/divsufsort.h create mode 100644 vendor/github.com/DataDog/zstd/entropy_common.c create mode 100644 vendor/github.com/DataDog/zstd/error_private.c create mode 100644 vendor/github.com/DataDog/zstd/error_private.h create mode 100644 vendor/github.com/DataDog/zstd/errors.go create mode 100644 vendor/github.com/DataDog/zstd/external_zstd.go create mode 100644 vendor/github.com/DataDog/zstd/fastcover.c create mode 100644 vendor/github.com/DataDog/zstd/fse.h create mode 100644 vendor/github.com/DataDog/zstd/fse_compress.c create mode 100644 vendor/github.com/DataDog/zstd/fse_decompress.c create mode 100644 vendor/github.com/DataDog/zstd/hist.c create mode 100644 vendor/github.com/DataDog/zstd/hist.h create mode 100644 vendor/github.com/DataDog/zstd/huf.h create mode 100644 vendor/github.com/DataDog/zstd/huf_compress.c create mode 100644 vendor/github.com/DataDog/zstd/huf_decompress.c create mode 100644 vendor/github.com/DataDog/zstd/huf_decompress_amd64.S create mode 100644 vendor/github.com/DataDog/zstd/mem.h create mode 100644 vendor/github.com/DataDog/zstd/pool.c create mode 100644 vendor/github.com/DataDog/zstd/pool.h create mode 100644 vendor/github.com/DataDog/zstd/portability_macros.h create mode 100644 vendor/github.com/DataDog/zstd/threading.c create mode 100644 vendor/github.com/DataDog/zstd/threading.h create mode 100644 vendor/github.com/DataDog/zstd/travis_test_32.sh create mode 100644 vendor/github.com/DataDog/zstd/update.txt create mode 100644 vendor/github.com/DataDog/zstd/xxhash.c create mode 100644 vendor/github.com/DataDog/zstd/xxhash.h create mode 100644 vendor/github.com/DataDog/zstd/zbuff.h create mode 100644 vendor/github.com/DataDog/zstd/zbuff_common.c create mode 100644 vendor/github.com/DataDog/zstd/zbuff_compress.c create mode 100644 vendor/github.com/DataDog/zstd/zbuff_decompress.c create mode 100644 vendor/github.com/DataDog/zstd/zdict.c create mode 100644 vendor/github.com/DataDog/zstd/zdict.h create mode 100644 vendor/github.com/DataDog/zstd/zstd.go create mode 100644 vendor/github.com/DataDog/zstd/zstd.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_bulk.go create mode 100644 vendor/github.com/DataDog/zstd/zstd_common.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_internal.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_literals.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_literals.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_sequences.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_sequences.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_superblock.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_compress_superblock.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_ctx.go create mode 100644 vendor/github.com/DataDog/zstd/zstd_cwksp.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_ddict.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_ddict.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_decompress.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_decompress_block.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_decompress_block.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_decompress_internal.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_deps.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_double_fast.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_double_fast.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_errors.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_fast.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_fast.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_internal.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_lazy.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_lazy.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_ldm.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_ldm.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_ldm_geartab.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_legacy.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_opt.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_opt.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_stream.go create mode 100644 vendor/github.com/DataDog/zstd/zstd_trace.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v01.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v01.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v02.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v02.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v03.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v03.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v04.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v04.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v05.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v05.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v06.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v06.h create mode 100644 vendor/github.com/DataDog/zstd/zstd_v07.c create mode 100644 vendor/github.com/DataDog/zstd/zstd_v07.h create mode 100644 vendor/github.com/DataDog/zstd/zstdmt_compress.c create mode 100644 vendor/github.com/DataDog/zstd/zstdmt_compress.h create mode 100644 vendor/github.com/beorn7/perks/LICENSE create mode 100644 vendor/github.com/beorn7/perks/quantile/exampledata.txt create mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 vendor/github.com/cespare/xxhash/v2/LICENSE.txt create mode 100644 vendor/github.com/cespare/xxhash/v2/README.md create mode 100644 vendor/github.com/cespare/xxhash/v2/testall.sh create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_asm.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_other.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_safe.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go create mode 100644 vendor/github.com/cockroachdb/errors/.gitignore create mode 100644 vendor/github.com/cockroachdb/errors/LICENSE create mode 100644 vendor/github.com/cockroachdb/errors/Makefile.update-protos create mode 100644 vendor/github.com/cockroachdb/errors/README.md create mode 100644 vendor/github.com/cockroachdb/errors/assert/assert.go create mode 100644 vendor/github.com/cockroachdb/errors/assert_api.go create mode 100644 vendor/github.com/cockroachdb/errors/barriers/barriers.go create mode 100644 vendor/github.com/cockroachdb/errors/barriers_api.go create mode 100644 vendor/github.com/cockroachdb/errors/contexttags/contexttags.go create mode 100644 vendor/github.com/cockroachdb/errors/contexttags/with_context.go create mode 100644 vendor/github.com/cockroachdb/errors/contexttags_api.go create mode 100644 vendor/github.com/cockroachdb/errors/domains/domains.go create mode 100644 vendor/github.com/cockroachdb/errors/domains/with_domain.go create mode 100644 vendor/github.com/cockroachdb/errors/domains_api.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/adapters.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/adapters_errno.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/decode.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/encode.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/format_error.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/formatter.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/migrations.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/opaque.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/oserror_go116.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/oserror_pre116.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/safe_details.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase/unwrap.go create mode 100644 vendor/github.com/cockroachdb/errors/errbase_api.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/errors.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/errors.pb.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/errors.proto create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/hintdetail.pb.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/hintdetail.proto create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/markers.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/markers.pb.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/markers.proto create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/tags.pb.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/tags.proto create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/testing.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/testing.pb.go create mode 100644 vendor/github.com/cockroachdb/errors/errorspb/testing.proto create mode 100644 vendor/github.com/cockroachdb/errors/errutil/as.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/assertions.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/doc.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/format_error_special.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/message.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/redactable.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil/utilities.go create mode 100644 vendor/github.com/cockroachdb/errors/errutil_api.go create mode 100644 vendor/github.com/cockroachdb/errors/hintdetail/hintdetail.go create mode 100644 vendor/github.com/cockroachdb/errors/hintdetail/with_detail.go create mode 100644 vendor/github.com/cockroachdb/errors/hintdetail/with_hint.go create mode 100644 vendor/github.com/cockroachdb/errors/hintdetail_api.go create mode 100644 vendor/github.com/cockroachdb/errors/issuelink/issuelink.go create mode 100644 vendor/github.com/cockroachdb/errors/issuelink/unimplemented_error.go create mode 100644 vendor/github.com/cockroachdb/errors/issuelink/with_issuelink.go create mode 100644 vendor/github.com/cockroachdb/errors/issuelink_api.go create mode 100644 vendor/github.com/cockroachdb/errors/join/join.go create mode 100644 vendor/github.com/cockroachdb/errors/markers/markers.go create mode 100644 vendor/github.com/cockroachdb/errors/markers_api.go create mode 100644 vendor/github.com/cockroachdb/errors/oserror/oserror.go create mode 100644 vendor/github.com/cockroachdb/errors/report/report.go create mode 100644 vendor/github.com/cockroachdb/errors/report/reportables.go create mode 100644 vendor/github.com/cockroachdb/errors/report_api.go create mode 100644 vendor/github.com/cockroachdb/errors/safedetails/redact.go create mode 100644 vendor/github.com/cockroachdb/errors/safedetails/safedetails.go create mode 100644 vendor/github.com/cockroachdb/errors/safedetails/with_safedetails.go create mode 100644 vendor/github.com/cockroachdb/errors/safedetails_api.go create mode 100644 vendor/github.com/cockroachdb/errors/secondary/secondary.go create mode 100644 vendor/github.com/cockroachdb/errors/secondary/with_secondary.go create mode 100644 vendor/github.com/cockroachdb/errors/secondary_api.go create mode 100644 vendor/github.com/cockroachdb/errors/stdstrings/strings.go create mode 100644 vendor/github.com/cockroachdb/errors/telemetrykeys/telemetrykeys.go create mode 100644 vendor/github.com/cockroachdb/errors/telemetrykeys/with_telemetry.go create mode 100644 vendor/github.com/cockroachdb/errors/telemetrykeys_api.go create mode 100644 vendor/github.com/cockroachdb/errors/withstack/one_line_source.go create mode 100644 vendor/github.com/cockroachdb/errors/withstack/reportable.go create mode 100644 vendor/github.com/cockroachdb/errors/withstack/stack.go create mode 100644 vendor/github.com/cockroachdb/errors/withstack/withstack.go create mode 100644 vendor/github.com/cockroachdb/errors/withstack_api.go create mode 100644 vendor/github.com/cockroachdb/logtags/.gitignore create mode 100644 vendor/github.com/cockroachdb/logtags/LICENSE create mode 100644 vendor/github.com/cockroachdb/logtags/README.md create mode 100644 vendor/github.com/cockroachdb/logtags/buffer.go create mode 100644 vendor/github.com/cockroachdb/logtags/context.go create mode 100644 vendor/github.com/cockroachdb/logtags/tag.go create mode 100644 vendor/github.com/cockroachdb/pebble/.editorconfig create mode 100644 vendor/github.com/cockroachdb/pebble/.gitignore create mode 100644 vendor/github.com/cockroachdb/pebble/LICENSE create mode 100644 vendor/github.com/cockroachdb/pebble/Makefile create mode 100644 vendor/github.com/cockroachdb/pebble/README.md create mode 100644 vendor/github.com/cockroachdb/pebble/batch.go create mode 100644 vendor/github.com/cockroachdb/pebble/cache.go create mode 100644 vendor/github.com/cockroachdb/pebble/checkpoint.go create mode 100644 vendor/github.com/cockroachdb/pebble/cleaner.go create mode 100644 vendor/github.com/cockroachdb/pebble/commit.go create mode 100644 vendor/github.com/cockroachdb/pebble/compaction.go create mode 100644 vendor/github.com/cockroachdb/pebble/compaction_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/compaction_picker.go create mode 100644 vendor/github.com/cockroachdb/pebble/comparer.go create mode 100644 vendor/github.com/cockroachdb/pebble/db.go create mode 100644 vendor/github.com/cockroachdb/pebble/error_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/event.go create mode 100644 vendor/github.com/cockroachdb/pebble/external_iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/filenames.go create mode 100644 vendor/github.com/cockroachdb/pebble/flushable.go create mode 100644 vendor/github.com/cockroachdb/pebble/format_major_version.go create mode 100644 vendor/github.com/cockroachdb/pebble/get_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/ingest.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/LICENSE create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/README.md create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/arena.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/flush_iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/node.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/arenaskl/skl.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/cleaner.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/comparer.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/error.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/filenames.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/internal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/lazy_value.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/logger.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/merger.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/metrics.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/base/options.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/batchskl/README.md create mode 100644 vendor/github.com/cockroachdb/pebble/internal/batchskl/iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/batchskl/skl.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/bytealloc/bytealloc.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/LICENSE create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/cgo_disabled.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/cgo_enabled.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/clockpro.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/clockpro_normal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/clockpro_tracing.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/entry.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/entry_invariants.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/entry_normal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/refcnt_normal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/refcnt_tracing.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/robin_hood.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/value.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/value_invariants.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/cache/value_normal.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/constants/constants.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/crc/crc.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/fastrand/fastrand.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/humanize/humanize.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/intern/intern.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invalidating/iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/finalizer_off.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/finalizer_on.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/off.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/on.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/race_off.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/invariants/race_on.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/bounded.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/defragment.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/doc.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/filter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/fragmenter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/get.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/interleaving_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/internal_iter_shim.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/level_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/merging_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/seek.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/span.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/transformer.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/keyspan/truncate.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/btree.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/l0_sublevels.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/level.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/level_metadata.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/version.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manifest/version_edit.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manual/manual.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manual/manual_32bit.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manual/manual_64bit.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/manual/manual_nocgo.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/private/batch.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/private/sstable.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rangedel/rangedel.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rangekey/coalesce.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rangekey/rangekey.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_32bit.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_64bit.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_gccgo.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_go1.9.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/testkeys/strconv.go create mode 100644 vendor/github.com/cockroachdb/pebble/internal/testkeys/testkeys.go create mode 100644 vendor/github.com/cockroachdb/pebble/iterator.go create mode 100644 vendor/github.com/cockroachdb/pebble/level_checker.go create mode 100644 vendor/github.com/cockroachdb/pebble/level_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/log_recycler.go create mode 100644 vendor/github.com/cockroachdb/pebble/logger.go create mode 100644 vendor/github.com/cockroachdb/pebble/mem_table.go create mode 100644 vendor/github.com/cockroachdb/pebble/merger.go create mode 100644 vendor/github.com/cockroachdb/pebble/merging_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/merging_iter_heap.go create mode 100644 vendor/github.com/cockroachdb/pebble/metrics.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/noop_readahead.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorage.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/objiotracing/obj_io_tracing.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/objiotracing/obj_io_tracing_off.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/objiotracing/obj_io_tracing_on.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/provider.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/readahead.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remote.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remote_backing.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remote_obj_name.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remote_readable.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remoteobjcat/catalog.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/remoteobjcat/version_edit.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/shared_writable.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/sharedcache/shared_cache.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/vfs.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/vfs_readable.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/objstorageprovider/vfs_writable.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/remote/factory.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/remote/localfs.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/remote/logging.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/remote/mem.go create mode 100644 vendor/github.com/cockroachdb/pebble/objstorage/remote/storage.go create mode 100644 vendor/github.com/cockroachdb/pebble/open.go create mode 100644 vendor/github.com/cockroachdb/pebble/options.go create mode 100644 vendor/github.com/cockroachdb/pebble/pacer.go create mode 100644 vendor/github.com/cockroachdb/pebble/range_keys.go create mode 100644 vendor/github.com/cockroachdb/pebble/rangekey/rangekey.go create mode 100644 vendor/github.com/cockroachdb/pebble/read_compaction_queue.go create mode 100644 vendor/github.com/cockroachdb/pebble/read_state.go create mode 100644 vendor/github.com/cockroachdb/pebble/record/log_writer.go create mode 100644 vendor/github.com/cockroachdb/pebble/record/record.go create mode 100644 vendor/github.com/cockroachdb/pebble/record/rotation.go create mode 100644 vendor/github.com/cockroachdb/pebble/scan_internal.go create mode 100644 vendor/github.com/cockroachdb/pebble/snapshot.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/block.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/block_property.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/block_property_test_utils.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/buffer_pool.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/comparer.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/compression.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/compression_cgo.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/compression_nocgo.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/filter.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/format.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/internal.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/layout.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/options.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/properties.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/raw_block.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/reader.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/reader_iter.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/reader_iter_single_lvl.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/reader_iter_two_lvl.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/reader_virtual.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/suffix_rewriter.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/table.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/unsafe.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/value_block.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/write_queue.go create mode 100644 vendor/github.com/cockroachdb/pebble/sstable/writer.go create mode 100644 vendor/github.com/cockroachdb/pebble/table_cache.go create mode 100644 vendor/github.com/cockroachdb/pebble/table_stats.go create mode 100644 vendor/github.com/cockroachdb/pebble/version_set.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/atomicfs/marker.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/clone.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/default_linux.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/default_unix.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/default_windows.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_full.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_health.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_usage_linux.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_usage_netbsd.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_usage_openbsd.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_usage_unix.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/disk_usage_windows.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/errors_unix.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/errors_windows.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/fadvise_generic.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/fadvise_linux.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/file_lock_generic.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/file_lock_unix.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/file_lock_windows.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/logging_fs.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/mem_fs.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/syncing_file.go create mode 100644 vendor/github.com/cockroachdb/pebble/vfs/vfs.go create mode 100644 vendor/github.com/cockroachdb/redact/.gitignore create mode 100644 vendor/github.com/cockroachdb/redact/.travis.yml create mode 100644 vendor/github.com/cockroachdb/redact/LICENSE create mode 100644 vendor/github.com/cockroachdb/redact/README.md create mode 100644 vendor/github.com/cockroachdb/redact/api.go create mode 100644 vendor/github.com/cockroachdb/redact/builder/builder.go create mode 100644 vendor/github.com/cockroachdb/redact/doc.go create mode 100644 vendor/github.com/cockroachdb/redact/interfaces/interfaces.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/buffer/buffer.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/escape/escape.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/fmtforward/make_format.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/markers/constants.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/markers/markers.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/redact/doc.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/redact/wrappers.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/README.md create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/fmtsort/sort.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/format.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/format.go.diff create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/helpers.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/print.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/print.go.diff create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/printer_adapter.go create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/refresh.sh create mode 100644 vendor/github.com/cockroachdb/redact/internal/rfmt/registry.go create mode 100644 vendor/github.com/cockroachdb/redact/markers_print.go create mode 100644 vendor/github.com/cockroachdb/redact/util.go create mode 100644 vendor/github.com/cockroachdb/tokenbucket/LICENSE create mode 100644 vendor/github.com/cockroachdb/tokenbucket/README.md create mode 100644 vendor/github.com/cockroachdb/tokenbucket/token_bucket.go create mode 100644 vendor/github.com/davecgh/go-spew/LICENSE create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypass.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypasssafe.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/common.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/doc.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/dump.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/format.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/spew.go create mode 100644 vendor/github.com/dgryski/go-rendezvous/LICENSE create mode 100644 vendor/github.com/dgryski/go-rendezvous/rdv.go create mode 100644 vendor/github.com/eleksir/go-xmpp/.golangci.yml create mode 100644 vendor/github.com/eleksir/go-xmpp/LICENSE create mode 100644 vendor/github.com/eleksir/go-xmpp/README.md create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_avatar.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_disco.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_error.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_information_query.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_muc.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_ping.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_pubsub.go create mode 100644 vendor/github.com/eleksir/go-xmpp/xmpp_subscription.go create mode 100644 vendor/github.com/getsentry/sentry-go/.codecov.yml create mode 100644 vendor/github.com/getsentry/sentry-go/.craft.yml create mode 100644 vendor/github.com/getsentry/sentry-go/.gitattributes create mode 100644 vendor/github.com/getsentry/sentry-go/.gitignore create mode 100644 vendor/github.com/getsentry/sentry-go/.golangci.yml create mode 100644 vendor/github.com/getsentry/sentry-go/CHANGELOG.md create mode 100644 vendor/github.com/getsentry/sentry-go/CONTRIBUTING.md create mode 100644 vendor/github.com/getsentry/sentry-go/LICENSE create mode 100644 vendor/github.com/getsentry/sentry-go/MIGRATION.md create mode 100644 vendor/github.com/getsentry/sentry-go/Makefile create mode 100644 vendor/github.com/getsentry/sentry-go/README.md create mode 100644 vendor/github.com/getsentry/sentry-go/check_in.go create mode 100644 vendor/github.com/getsentry/sentry-go/client.go create mode 100644 vendor/github.com/getsentry/sentry-go/doc.go create mode 100644 vendor/github.com/getsentry/sentry-go/dsn.go create mode 100644 vendor/github.com/getsentry/sentry-go/dynamic_sampling_context.go create mode 100644 vendor/github.com/getsentry/sentry-go/hub.go create mode 100644 vendor/github.com/getsentry/sentry-go/integrations.go create mode 100644 vendor/github.com/getsentry/sentry-go/interfaces.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/debug/transport.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/otel/baggage/README.md create mode 100644 vendor/github.com/getsentry/sentry-go/internal/otel/baggage/baggage.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/otel/baggage/internal/baggage/baggage.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/category.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/deadline.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/doc.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/map.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/rate_limits.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/ratelimit/retry_after.go create mode 100644 vendor/github.com/getsentry/sentry-go/internal/traceparser/README.md create mode 100644 vendor/github.com/getsentry/sentry-go/internal/traceparser/parser.go create mode 100644 vendor/github.com/getsentry/sentry-go/profile_sample.go create mode 100644 vendor/github.com/getsentry/sentry-go/profiler.go create mode 100644 vendor/github.com/getsentry/sentry-go/profiler_other.go create mode 100644 vendor/github.com/getsentry/sentry-go/profiler_windows.go create mode 100644 vendor/github.com/getsentry/sentry-go/scope.go create mode 100644 vendor/github.com/getsentry/sentry-go/sentry.go create mode 100644 vendor/github.com/getsentry/sentry-go/sourcereader.go create mode 100644 vendor/github.com/getsentry/sentry-go/span_recorder.go create mode 100644 vendor/github.com/getsentry/sentry-go/stacktrace.go create mode 100644 vendor/github.com/getsentry/sentry-go/traces_profiler.go create mode 100644 vendor/github.com/getsentry/sentry-go/traces_sampler.go create mode 100644 vendor/github.com/getsentry/sentry-go/tracing.go create mode 100644 vendor/github.com/getsentry/sentry-go/transport.go create mode 100644 vendor/github.com/getsentry/sentry-go/util.go create mode 100644 vendor/github.com/go-redis/redis/v8/.gitignore create mode 100644 vendor/github.com/go-redis/redis/v8/.golangci.yml create mode 100644 vendor/github.com/go-redis/redis/v8/.prettierrc.yml create mode 100644 vendor/github.com/go-redis/redis/v8/CHANGELOG.md create mode 100644 vendor/github.com/go-redis/redis/v8/LICENSE create mode 100644 vendor/github.com/go-redis/redis/v8/Makefile create mode 100644 vendor/github.com/go-redis/redis/v8/README.md create mode 100644 vendor/github.com/go-redis/redis/v8/RELEASING.md create mode 100644 vendor/github.com/go-redis/redis/v8/cluster.go create mode 100644 vendor/github.com/go-redis/redis/v8/cluster_commands.go create mode 100644 vendor/github.com/go-redis/redis/v8/command.go create mode 100644 vendor/github.com/go-redis/redis/v8/commands.go create mode 100644 vendor/github.com/go-redis/redis/v8/doc.go create mode 100644 vendor/github.com/go-redis/redis/v8/error.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/arg.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/hashtag/hashtag.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/hscan/hscan.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/hscan/structmap.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/internal.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/log.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/once.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/pool/conn.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/pool/pool.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/pool/pool_single.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/pool/pool_sticky.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/proto/reader.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/proto/scan.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/proto/writer.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/rand/rand.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/safe.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/unsafe.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/util.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/util/safe.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/util/strconv.go create mode 100644 vendor/github.com/go-redis/redis/v8/internal/util/unsafe.go create mode 100644 vendor/github.com/go-redis/redis/v8/iterator.go create mode 100644 vendor/github.com/go-redis/redis/v8/options.go create mode 100644 vendor/github.com/go-redis/redis/v8/package.json create mode 100644 vendor/github.com/go-redis/redis/v8/pipeline.go create mode 100644 vendor/github.com/go-redis/redis/v8/pubsub.go create mode 100644 vendor/github.com/go-redis/redis/v8/redis.go create mode 100644 vendor/github.com/go-redis/redis/v8/result.go create mode 100644 vendor/github.com/go-redis/redis/v8/ring.go create mode 100644 vendor/github.com/go-redis/redis/v8/script.go create mode 100644 vendor/github.com/go-redis/redis/v8/sentinel.go create mode 100644 vendor/github.com/go-redis/redis/v8/tx.go create mode 100644 vendor/github.com/go-redis/redis/v8/universal.go create mode 100644 vendor/github.com/go-redis/redis/v8/version.go create mode 100644 vendor/github.com/gogo/protobuf/AUTHORS create mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/gogo/protobuf/LICENSE create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/Makefile create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/doc.go create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.proto create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/helper.go create mode 100644 vendor/github.com/gogo/protobuf/proto/Makefile create mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go create mode 100644 vendor/github.com/gogo/protobuf/proto/custom_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/gogo/protobuf/proto/discard.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go create mode 100644 vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go create mode 100644 vendor/github.com/gogo/protobuf/types/any.go create mode 100644 vendor/github.com/gogo/protobuf/types/any.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/api.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/doc.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/types/empty.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/field_mask.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/protosize.go create mode 100644 vendor/github.com/gogo/protobuf/types/source_context.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/struct.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/types/type.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/wrappers.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/wrappers_gogo.go create mode 100644 vendor/github.com/golang/protobuf/AUTHORS create mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/golang/protobuf/LICENSE create mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go create mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go create mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/golang/protobuf/proto/discard.go create mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 vendor/github.com/golang/protobuf/proto/proto.go create mode 100644 vendor/github.com/golang/protobuf/proto/registry.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go create mode 100644 vendor/github.com/golang/protobuf/proto/wire.go create mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/golang/snappy/.gitignore create mode 100644 vendor/github.com/golang/snappy/AUTHORS create mode 100644 vendor/github.com/golang/snappy/CONTRIBUTORS create mode 100644 vendor/github.com/golang/snappy/LICENSE create mode 100644 vendor/github.com/golang/snappy/README create mode 100644 vendor/github.com/golang/snappy/decode.go create mode 100644 vendor/github.com/golang/snappy/decode_amd64.s create mode 100644 vendor/github.com/golang/snappy/decode_arm64.s create mode 100644 vendor/github.com/golang/snappy/decode_asm.go create mode 100644 vendor/github.com/golang/snappy/decode_other.go create mode 100644 vendor/github.com/golang/snappy/encode.go create mode 100644 vendor/github.com/golang/snappy/encode_amd64.s create mode 100644 vendor/github.com/golang/snappy/encode_arm64.s create mode 100644 vendor/github.com/golang/snappy/encode_asm.go create mode 100644 vendor/github.com/golang/snappy/encode_other.go create mode 100644 vendor/github.com/golang/snappy/snappy.go create mode 100644 vendor/github.com/hjson/hjson-go/.gitignore create mode 100644 vendor/github.com/hjson/hjson-go/LICENSE create mode 100644 vendor/github.com/hjson/hjson-go/README.md create mode 100644 vendor/github.com/hjson/hjson-go/build_release.sh create mode 100644 vendor/github.com/hjson/hjson-go/decode.go create mode 100644 vendor/github.com/hjson/hjson-go/encode.go create mode 100644 vendor/github.com/hjson/hjson-go/parseNumber.go create mode 100644 vendor/github.com/klauspost/compress/.gitattributes create mode 100644 vendor/github.com/klauspost/compress/.gitignore create mode 100644 vendor/github.com/klauspost/compress/.goreleaser.yml create mode 100644 vendor/github.com/klauspost/compress/LICENSE create mode 100644 vendor/github.com/klauspost/compress/README.md create mode 100644 vendor/github.com/klauspost/compress/SECURITY.md create mode 100644 vendor/github.com/klauspost/compress/compressible.go create mode 100644 vendor/github.com/klauspost/compress/fse/README.md create mode 100644 vendor/github.com/klauspost/compress/fse/bitreader.go create mode 100644 vendor/github.com/klauspost/compress/fse/bitwriter.go create mode 100644 vendor/github.com/klauspost/compress/fse/bytereader.go create mode 100644 vendor/github.com/klauspost/compress/fse/compress.go create mode 100644 vendor/github.com/klauspost/compress/fse/decompress.go create mode 100644 vendor/github.com/klauspost/compress/fse/fse.go create mode 100644 vendor/github.com/klauspost/compress/gen.sh create mode 100644 vendor/github.com/klauspost/compress/huff0/.gitignore create mode 100644 vendor/github.com/klauspost/compress/huff0/README.md create mode 100644 vendor/github.com/klauspost/compress/huff0/bitreader.go create mode 100644 vendor/github.com/klauspost/compress/huff0/bitwriter.go create mode 100644 vendor/github.com/klauspost/compress/huff0/bytereader.go create mode 100644 vendor/github.com/klauspost/compress/huff0/compress.go create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress.go create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.go create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.s create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_generic.go create mode 100644 vendor/github.com/klauspost/compress/huff0/huff0.go create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/LICENSE create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode.go create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode_other.go create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode.go create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode_other.go create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/snappy.go create mode 100644 vendor/github.com/klauspost/compress/s2sx.mod create mode 100644 vendor/github.com/klauspost/compress/s2sx.sum create mode 100644 vendor/github.com/klauspost/compress/zstd/README.md create mode 100644 vendor/github.com/klauspost/compress/zstd/bitreader.go create mode 100644 vendor/github.com/klauspost/compress/zstd/bitwriter.go create mode 100644 vendor/github.com/klauspost/compress/zstd/blockdec.go create mode 100644 vendor/github.com/klauspost/compress/zstd/blockenc.go create mode 100644 vendor/github.com/klauspost/compress/zstd/blocktype_string.go create mode 100644 vendor/github.com/klauspost/compress/zstd/bytebuf.go create mode 100644 vendor/github.com/klauspost/compress/zstd/bytereader.go create mode 100644 vendor/github.com/klauspost/compress/zstd/decodeheader.go create mode 100644 vendor/github.com/klauspost/compress/zstd/decoder.go create mode 100644 vendor/github.com/klauspost/compress/zstd/decoder_options.go create mode 100644 vendor/github.com/klauspost/compress/zstd/dict.go create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_base.go create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_best.go create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_better.go create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_dfast.go create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_fast.go create mode 100644 vendor/github.com/klauspost/compress/zstd/encoder.go create mode 100644 vendor/github.com/klauspost/compress/zstd/encoder_options.go create mode 100644 vendor/github.com/klauspost/compress/zstd/framedec.go create mode 100644 vendor/github.com/klauspost/compress/zstd/frameenc.go create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder.go create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_encoder.go create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_predefined.go create mode 100644 vendor/github.com/klauspost/compress/zstd/hash.go create mode 100644 vendor/github.com/klauspost/compress/zstd/history.go create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_generic.go create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec.go create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_generic.go create mode 100644 vendor/github.com/klauspost/compress/zstd/seqenc.go create mode 100644 vendor/github.com/klauspost/compress/zstd/snappy.go create mode 100644 vendor/github.com/klauspost/compress/zstd/zip.go create mode 100644 vendor/github.com/klauspost/compress/zstd/zstd.go create mode 100644 vendor/github.com/kr/pretty/.gitignore create mode 100644 vendor/github.com/kr/pretty/License create mode 100644 vendor/github.com/kr/pretty/Readme create mode 100644 vendor/github.com/kr/pretty/diff.go create mode 100644 vendor/github.com/kr/pretty/formatter.go create mode 100644 vendor/github.com/kr/pretty/pretty.go create mode 100644 vendor/github.com/kr/pretty/zero.go create mode 100644 vendor/github.com/kr/text/License create mode 100644 vendor/github.com/kr/text/Readme create mode 100644 vendor/github.com/kr/text/doc.go create mode 100644 vendor/github.com/kr/text/indent.go create mode 100644 vendor/github.com/kr/text/wrap.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 vendor/github.com/pkg/errors/.gitignore create mode 100644 vendor/github.com/pkg/errors/.travis.yml create mode 100644 vendor/github.com/pkg/errors/LICENSE create mode 100644 vendor/github.com/pkg/errors/Makefile create mode 100644 vendor/github.com/pkg/errors/README.md create mode 100644 vendor/github.com/pkg/errors/appveyor.yml create mode 100644 vendor/github.com/pkg/errors/errors.go create mode 100644 vendor/github.com/pkg/errors/go113.go create mode 100644 vendor/github.com/pkg/errors/stack.go create mode 100644 vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/.gitignore create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/README.md create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/build_info_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/get_pid.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/almost_equal.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/num_threads.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vnext.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE create mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 vendor/github.com/prometheus/common/LICENSE create mode 100644 vendor/github.com/prometheus/common/NOTICE create mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 vendor/github.com/prometheus/common/expfmt/openmetrics_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/prometheus/common/model/alert.go create mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 vendor/github.com/prometheus/common/model/fnv.go create mode 100644 vendor/github.com/prometheus/common/model/labels.go create mode 100644 vendor/github.com/prometheus/common/model/labelset.go create mode 100644 vendor/github.com/prometheus/common/model/metric.go create mode 100644 vendor/github.com/prometheus/common/model/model.go create mode 100644 vendor/github.com/prometheus/common/model/signature.go create mode 100644 vendor/github.com/prometheus/common/model/silence.go create mode 100644 vendor/github.com/prometheus/common/model/time.go create mode 100644 vendor/github.com/prometheus/common/model/value.go create mode 100644 vendor/github.com/prometheus/common/model/value_float.go create mode 100644 vendor/github.com/prometheus/common/model/value_histogram.go create mode 100644 vendor/github.com/prometheus/common/model/value_type.go create mode 100644 vendor/github.com/prometheus/procfs/.gitignore create mode 100644 vendor/github.com/prometheus/procfs/.golangci.yml create mode 100644 vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/prometheus/procfs/CONTRIBUTING.md create mode 100644 vendor/github.com/prometheus/procfs/LICENSE create mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 vendor/github.com/prometheus/procfs/Makefile create mode 100644 vendor/github.com/prometheus/procfs/Makefile.common create mode 100644 vendor/github.com/prometheus/procfs/NOTICE create mode 100644 vendor/github.com/prometheus/procfs/README.md create mode 100644 vendor/github.com/prometheus/procfs/SECURITY.md create mode 100644 vendor/github.com/prometheus/procfs/arp.go create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/cmdline.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_armx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_loong64.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_others.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_s390x.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_x86.go create mode 100644 vendor/github.com/prometheus/procfs/crypto.go create mode 100644 vendor/github.com/prometheus/procfs/doc.go create mode 100644 vendor/github.com/prometheus/procfs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/fs_statfs_notype.go create mode 100644 vendor/github.com/prometheus/procfs/fs_statfs_type.go create mode 100644 vendor/github.com/prometheus/procfs/fscache.go create mode 100644 vendor/github.com/prometheus/procfs/internal/fs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/parse.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/readfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/valueparser.go create mode 100644 vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 vendor/github.com/prometheus/procfs/kernel_random.go create mode 100644 vendor/github.com/prometheus/procfs/loadavg.go create mode 100644 vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 vendor/github.com/prometheus/procfs/meminfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountinfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 vendor/github.com/prometheus/procfs/net_conntrackstat.go create mode 100644 vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 vendor/github.com/prometheus/procfs/net_ip_socket.go create mode 100644 vendor/github.com/prometheus/procfs/net_protocols.go create mode 100644 vendor/github.com/prometheus/procfs/net_route.go create mode 100644 vendor/github.com/prometheus/procfs/net_sockstat.go create mode 100644 vendor/github.com/prometheus/procfs/net_softnet.go create mode 100644 vendor/github.com/prometheus/procfs/net_tcp.go create mode 100644 vendor/github.com/prometheus/procfs/net_udp.go create mode 100644 vendor/github.com/prometheus/procfs/net_unix.go create mode 100644 vendor/github.com/prometheus/procfs/net_wireless.go create mode 100644 vendor/github.com/prometheus/procfs/net_xfrm.go create mode 100644 vendor/github.com/prometheus/procfs/netstat.go create mode 100644 vendor/github.com/prometheus/procfs/proc.go create mode 100644 vendor/github.com/prometheus/procfs/proc_cgroup.go create mode 100644 vendor/github.com/prometheus/procfs/proc_cgroups.go create mode 100644 vendor/github.com/prometheus/procfs/proc_environ.go create mode 100644 vendor/github.com/prometheus/procfs/proc_fdinfo.go create mode 100644 vendor/github.com/prometheus/procfs/proc_interrupts.go create mode 100644 vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 vendor/github.com/prometheus/procfs/proc_maps.go create mode 100644 vendor/github.com/prometheus/procfs/proc_netstat.go create mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 vendor/github.com/prometheus/procfs/proc_psi.go create mode 100644 vendor/github.com/prometheus/procfs/proc_smaps.go create mode 100644 vendor/github.com/prometheus/procfs/proc_snmp.go create mode 100644 vendor/github.com/prometheus/procfs/proc_snmp6.go create mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 vendor/github.com/prometheus/procfs/proc_status.go create mode 100644 vendor/github.com/prometheus/procfs/proc_sys.go create mode 100644 vendor/github.com/prometheus/procfs/schedstat.go create mode 100644 vendor/github.com/prometheus/procfs/slab.go create mode 100644 vendor/github.com/prometheus/procfs/softirqs.go create mode 100644 vendor/github.com/prometheus/procfs/stat.go create mode 100644 vendor/github.com/prometheus/procfs/swaps.go create mode 100644 vendor/github.com/prometheus/procfs/thread.go create mode 100644 vendor/github.com/prometheus/procfs/ttar create mode 100644 vendor/github.com/prometheus/procfs/vm.go create mode 100644 vendor/github.com/prometheus/procfs/zoneinfo.go create mode 100644 vendor/github.com/rogpeppe/go-internal/LICENSE create mode 100644 vendor/github.com/rogpeppe/go-internal/fmtsort/mapelem.go create mode 100644 vendor/github.com/rogpeppe/go-internal/fmtsort/sort.go create mode 100644 vendor/github.com/sirupsen/logrus/.gitignore create mode 100644 vendor/github.com/sirupsen/logrus/.golangci.yml create mode 100644 vendor/github.com/sirupsen/logrus/.travis.yml create mode 100644 vendor/github.com/sirupsen/logrus/CHANGELOG.md create mode 100644 vendor/github.com/sirupsen/logrus/LICENSE create mode 100644 vendor/github.com/sirupsen/logrus/README.md create mode 100644 vendor/github.com/sirupsen/logrus/alt_exit.go create mode 100644 vendor/github.com/sirupsen/logrus/appveyor.yml create mode 100644 vendor/github.com/sirupsen/logrus/buffer_pool.go create mode 100644 vendor/github.com/sirupsen/logrus/doc.go create mode 100644 vendor/github.com/sirupsen/logrus/entry.go create mode 100644 vendor/github.com/sirupsen/logrus/exported.go create mode 100644 vendor/github.com/sirupsen/logrus/formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/hooks.go create mode 100644 vendor/github.com/sirupsen/logrus/json_formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/logger.go create mode 100644 vendor/github.com/sirupsen/logrus/logrus.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_appengine.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_bsd.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_js.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_unix.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_windows.go create mode 100644 vendor/github.com/sirupsen/logrus/text_formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/writer.go create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go create mode 100644 vendor/golang.org/x/exp/LICENSE create mode 100644 vendor/golang.org/x/exp/PATENTS create mode 100644 vendor/golang.org/x/exp/constraints/constraints.go create mode 100644 vendor/golang.org/x/exp/rand/exp.go create mode 100644 vendor/golang.org/x/exp/rand/normal.go create mode 100644 vendor/golang.org/x/exp/rand/rand.go create mode 100644 vendor/golang.org/x/exp/rand/rng.go create mode 100644 vendor/golang.org/x/exp/rand/zipf.go create mode 100644 vendor/golang.org/x/exp/slices/cmp.go create mode 100644 vendor/golang.org/x/exp/slices/slices.go create mode 100644 vendor/golang.org/x/exp/slices/sort.go create mode 100644 vendor/golang.org/x/exp/slices/zsortanyfunc.go create mode 100644 vendor/golang.org/x/exp/slices/zsortordered.go create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/execabs/execabs.go create mode 100644 vendor/golang.org/x/sys/execabs/execabs_go118.go create mode 100644 vendor/golang.org/x/sys/execabs/execabs_go119.go create mode 100644 vendor/golang.org/x/sys/unix/.gitignore create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 vendor/golang.org/x/sys/unix/aliases.go create mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_loong64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/constants.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 vendor/golang.org/x/sys/unix/epoll_zos.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 vendor/golang.org/x/sys/unix/fdset.go create mode 100644 vendor/golang.org/x/sys/unix/fstatfs_zos.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_unsigned.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go create mode 100644 vendor/golang.org/x/sys/unix/mkall.sh create mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_ios.go create mode 100644 vendor/golang.org/x/sys/unix/race.go create mode 100644 vendor/golang.org/x/sys/unix/race0.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/syscall.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_alarm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/windows/aliases.go create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 vendor/golang.org/x/sys/windows/empty.s create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 vendor/golang.org/x/sys/windows/mkerrors.bash create mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/race.go create mode 100644 vendor/golang.org/x/sys/windows/race0.go create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 vendor/golang.org/x/sys/windows/service.go create mode 100644 vendor/golang.org/x/sys/windows/setupapi_windows.go create mode 100644 vendor/golang.org/x/sys/windows/str.go create mode 100644 vendor/golang.org/x/sys/windows/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm64.go create mode 100644 vendor/golang.org/x/sys/windows/zerrors_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 vendor/golang.org/x/text/LICENSE create mode 100644 vendor/golang.org/x/text/PATENTS create mode 100644 vendor/golang.org/x/text/cases/cases.go create mode 100644 vendor/golang.org/x/text/cases/context.go create mode 100644 vendor/golang.org/x/text/cases/fold.go create mode 100644 vendor/golang.org/x/text/cases/icu.go create mode 100644 vendor/golang.org/x/text/cases/info.go create mode 100644 vendor/golang.org/x/text/cases/map.go create mode 100644 vendor/golang.org/x/text/cases/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/cases/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/cases/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/cases/tables13.0.0.go create mode 100644 vendor/golang.org/x/text/cases/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/cases/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/cases/trieval.go create mode 100644 vendor/golang.org/x/text/encoding/charmap/charmap.go create mode 100644 vendor/golang.org/x/text/encoding/charmap/tables.go create mode 100644 vendor/golang.org/x/text/encoding/encoding.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/identifier.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/mib.go create mode 100644 vendor/golang.org/x/text/encoding/internal/internal.go create mode 100644 vendor/golang.org/x/text/internal/internal.go create mode 100644 vendor/golang.org/x/text/internal/language/common.go create mode 100644 vendor/golang.org/x/text/internal/language/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/language.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/parents.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tags.go create mode 100644 vendor/golang.org/x/text/internal/language/compose.go create mode 100644 vendor/golang.org/x/text/internal/language/coverage.go create mode 100644 vendor/golang.org/x/text/internal/language/language.go create mode 100644 vendor/golang.org/x/text/internal/language/lookup.go create mode 100644 vendor/golang.org/x/text/internal/language/match.go create mode 100644 vendor/golang.org/x/text/internal/language/parse.go create mode 100644 vendor/golang.org/x/text/internal/language/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/tags.go create mode 100644 vendor/golang.org/x/text/internal/match.go create mode 100644 vendor/golang.org/x/text/internal/tag/tag.go create mode 100644 vendor/golang.org/x/text/language/coverage.go create mode 100644 vendor/golang.org/x/text/language/doc.go create mode 100644 vendor/golang.org/x/text/language/language.go create mode 100644 vendor/golang.org/x/text/language/match.go create mode 100644 vendor/golang.org/x/text/language/parse.go create mode 100644 vendor/golang.org/x/text/language/tables.go create mode 100644 vendor/golang.org/x/text/language/tags.go create mode 100644 vendor/golang.org/x/text/transform/transform.go create mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go create mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go create mode 100644 vendor/golang.org/x/text/unicode/norm/input.go create mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go create mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables13.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go create mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go create mode 100644 vendor/google.golang.org/protobuf/LICENSE create mode 100644 vendor/google.golang.org/protobuf/PATENTS create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/decode.go create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/doc.go create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/encode.go create mode 100644 vendor/google.golang.org/protobuf/encoding/protowire/wire.go create mode 100644 vendor/google.golang.org/protobuf/internal/descfmt/stringer.go create mode 100644 vendor/google.golang.org/protobuf/internal/descopts/options.go create mode 100644 vendor/google.golang.org/protobuf/internal/detrand/rand.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/defval/default.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/doc.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/encode.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/errors.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/build.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go create mode 100644 vendor/google.golang.org/protobuf/internal/filetype/build.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/flags.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/any_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/api_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/doc.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/duration_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/empty_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/goname.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/map_entry.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/struct_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/type_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/checkinit.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_tables.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_list.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_map.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/decode.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/encode.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/enum.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_export.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_file.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/validate.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/weak.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/order.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/range.go create mode 100644 vendor/google.golang.org/protobuf/internal/pragma/pragma.go create mode 100644 vendor/google.golang.org/protobuf/internal/set/ints.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_pure.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/internal/version/version.go create mode 100644 vendor/google.golang.org/protobuf/proto/checkinit.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/doc.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/equal.go create mode 100644 vendor/google.golang.org/protobuf/proto/extension.go create mode 100644 vendor/google.golang.org/protobuf/proto/merge.go create mode 100644 vendor/google.golang.org/protobuf/proto/messageset.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_methods.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_reflect.go create mode 100644 vendor/google.golang.org/protobuf/proto/reset.go create mode 100644 vendor/google.golang.org/protobuf/proto/size.go create mode 100644 vendor/google.golang.org/protobuf/proto/size_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/type.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/methods.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/version.go create mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go create mode 100644 vendor/gopkg.in/tomb.v1/LICENSE create mode 100644 vendor/gopkg.in/tomb.v1/README.md create mode 100644 vendor/gopkg.in/tomb.v1/tomb.go create mode 100644 vendor/modules.txt create mode 100644 version.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..275a6d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +data/config.json +aleesa-jabber-go +aleesa-jabber-go.exe +config.go + diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..44130af --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,69 @@ +run: + tests: false + skip-dirs: + - data + - vendor + modules-download-mode: readonly + allow-parallel-runners: true + go: '1.21' +output: + sort-results: true +linters-settings: + gosec: + excludes: + # Оно не используется для повышения безопасности или каких-то таких секъюрых вещей, оно используется для выборки + # произвольного элемента из массива, так что ИДИ НАХУЙ с этой проверкой и не еби мозги липовой безопасностью. + - G404 # Insecure random number source (rand) +linters: + disable-all: true + enable: + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - unused + - asasalint + - asciicheck + - bodyclose + - containedctx + - contextcheck + - decorder + - durationcheck + - errchkjson + - errorlint + - exhaustive + - exhaustruct + - exportloopref + - ginkgolinter + - gci + - gocheckcompilerdirectives + - gocritic + - godot + - goerr113 + - gofmt + - goimports + - gosec + - gosmopolitan + - grouper + - importas + - ireturn + - makezero + - mirror + - nakedret + - nilerr + - nilnil + - nlreturn + - noctx + - nolintlint + - nonamedreturns + - predeclared + - promlinter + - reassign + - revive + - rowserrcheck + - stylecheck + - unconvert + - wastedassign + - whitespace + - wsl diff --git a/Design.txt b/Design.txt new file mode 100644 index 0000000..e45715d --- /dev/null +++ b/Design.txt @@ -0,0 +1,57 @@ +Особенности реализации клиентской части. + +Общие положения +------------------------------------------------------------------------------------------------------------------------ + +Nick для room-ов един и не может задаваться на per-conference основе. На этом завязаны отсылка ping-ов и определение +pong-ов, как минимум. Хотя формально джойниться можно с любым ником :) но что-то не хочется потом распутывать этот +клубок. + + +XEP-0410 MUC Self-Ping (Schrödinger's Chat) +------------------------------------------------------------------------------------------------------------------------ + +xep-0410 реализован не польностью. Согласно https://xmpp.org/extensions/xep-0410.html, существует минимум 2 варианта +реализации обнаружения, что киент оотвалился от чатика. + +* С двухступенчатым пингом. Когда с jid-а локального пнгуется jid в конференции. Ответ доставляется на один из клиентов. +Который в свою очередь должен ответить на этот ответ (отвечайте на мои ответы!), результат этого ответа передаётся +оригинальному запросившему клиенту. + +* С серверной орптимизацией. (оптимизация анонсируется в ответе на запрос disco#info MUC-а) +В этом случае пинг будет одноступенчатым и нам сразу же должен по идее вернуться result (то бишь pong) + +Двухступенчатая реализация вызывает вопросы. Во-первых, своей двухступенчатастью, а во-вторых, ответ на начальный пинг +доставляется на один из клиентов (не на все!), а если этот клиент испытывает сетевые проблемы, то получается, страдают +все клиенты. В нашем случае предполагается, что если клиентов больше одного, то он не должен своим состоянием аффектить +других клиентов. + +И... тут есть другой момент - двухступенчатый пинг гораздо сложнее в реализации на клиентской стороне, т.к. надо +обрабатывать значительно бОльшее количество кейсов сочетаний ошибок, которые могут возникнуть в ходе пинга. + +Вобщем, поддерживаем только второй вариант пинга, который с серверной оптимизацией. + +N.B. Но на IQ get ping с xmlns="urn:xmpp:ping" из первого шага мы всё-таки будем отвечать обычным result-ом (понгом, то + бишь) + +N.B. Каждый пинг комнаты происходит в отдельной goroutne-ке, так что заходить в огромное количество комнат (>1k) + не рекомендуется + + +xep-0199 XMPP Ping +------------------------------------------------------------------------------------------------------------------------ + +Cуществует несколько видов пинга: +* Server-To-Client Pings +* Client-To-Server Pings +* Server-To-Server Pings +* Client-to-Client Pings +* Component-to-Client Pings + +Явным образом я реализовываю с2s. Плюс частично Component-to-Client в рамках N.B. по xep-0410. + + +Ротация статусов +------------------------------------------------------------------------------------------------------------------------ +Ротирование статуса реализовано через заддержки time.sleep, На каждый чат таким образом порождается по горутине. Если +чатов много, это может вызвать проблемы. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..b7708ae --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2023 Sergei Fedosoff + +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/Makefile b/Makefile new file mode 100644 index 0000000..7cd3af1 --- /dev/null +++ b/Makefile @@ -0,0 +1,96 @@ +#!/usr/bin/env gmake -f + +# Делаем бинарник с минимальным количеством всякой дополнительной метаинформации +BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath + +FILELIST=config.go collection.go types.go globals.go lib.go event_parser.go commands.go redis.go settings-db-util.go \ +main.go + +BINARY=aleesa-jabber-go + +# На windows имя бинарника может зависеть не только от платформы, но и от выранной цели, для linux-а суффикс .exe +# не нужен +ifeq ($(OS),Windows_NT) +ifeq ($(strip $(GOOS)),) +BINARY=aleesa-jabber-go.exe +endif +endif + +# Если мы собраем бинарь под windows не на windows, то надо сделать бинарь с суффиксом .exe +ifeq ($(strip $(GOOS)),windows) +BINARY=aleesa-jabber-go.exe +endif + +# Явно определяем символ новой строки, чтобы избежать неоднозначности на windows +define IFS + +endef + +# Используем классические таргеты, где первый встречаемый является таргетом по-умолчанию +all: clean build + + +build: +# Делаем из config.in файл config.go, путём замены v4 на содержимое файла version.txt +# nlinit=`echo 'IFS="'; echo '"'`; eval "$$nlinit"; + $(file > config.go,$(subst v4,$(file < version.txt),$(file < config.in))) + +# GNU Make видимо может вносить какие-то невидимые глазу коррективы в файл, когда читает его в переменную, а затем пишет +# его из этой переменной и поэтому полученный файл надо прогнать через gofmt, чтобы golagci-lint не выёбывался и не +# падал с неизвестной ошибкой + gofmt -s -w config.go + +# Ну и дальше просто билдим бинарник средствами гошки +ifeq ($(OS),Windows_NT) +# вариант с powershell на windows +ifeq ($(SHELL),sh.exe) + SET CGO_ENABLED=0 + go build ${BUILDOPTS} -o ${BINARY} ${FILELIST} +else +# вариант с jetbrains golang на windows + CGO_ENABLED=0 + go build ${BUILDOPTS} -o ${BINARY} ${FILELIST} +endif +# вариант с bash/git (windows) и bash (linux) +else + CGO_ENABLED=0 go build ${BUILDOPTS} -o ${BINARY} ${FILELIST} +endif + + +# Удаляем автогенерённый config.go и бинарник +clean: +ifeq ($(OS),Windows_NT) +# вариант с jetbrains golang на windows, powershell на windows +ifeq ($(SHELL),sh.exe) + if exist config.go del /F /S /Q config.go >nul +# git/bash на windows +else + $(RM) config.go +endif +# bash на linux +else + $(RM) config.go +endif +# удаляем бинарник средствами go + go clean + + +# Служебный таргет, для целей разработки. Обновляет завендоренные либы, брутальным образом. +upgrade: +ifeq ($(OS),Windows_NT) +# вариант с jetbrains golang на windows или powershell на windows +ifeq ($(SHELL),sh.exe) + if exist vendor del /F /S /Q vendor >nul +# вариант с git/bash на windows +else + $(RM) -r vendor +endif +# вариант с bash на linux +else + $(RM) -r vendor +endif + go get -d -u -t ./... + go mod tidy + go mod vendor + +# vim: set ft=make noet ai ts=4 sw=4 sts=4: diff --git a/README.md b/README.md new file mode 100644 index 0000000..4aaf7a4 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# Aleesa-jabber-go + +## Что это? + +Сервис для aleesa-bot, работающий с протоколом XMPP/Jabber. С основными сервисами aleesa-bot он работает по протоколу +Redis pubsub. + +## Как заставить его работать? + +Технически, бот собирается гошкой 1.21. Приложение тестировалось на alpine linux x86_64 3.16, но должно работать на +любом (более свежем) linux-е. Работоспособность на других платформах не тестировалась. + +Чтобы получить готовые бинарники, достаточно выполнить команду: + +```bash +make +``` + +в итоге получится бинарник **aleesa-jabber-go**. После создания data/config.json из data/config_sample.json, можно +запускать приложение. + +Предполагается, что конфиг написан в формате [human json](https://hjson.github.io), который допускает комментарии и +некоторые другие вольности в форматировании json-а. Конфиг ищется последовательно по следующим путям по принципу "кто +первый того и тапки": + +```text +~/.aleesa-jabber-go.json +~/aleesa-jabber-go.json +/etc/aleesa-jabber-go.json +data/config.json +``` + +В каталоге **contrib** находится скрипт для _alpine linux_, системы инициализации _openrc_. Этот скрипт достаточно +положить в **/etc/init.d/aleesa-jabber-go**. После чего скопировать бинарник в каталог **/var/lib/aleesa-jabber-go**, +положить конфиг в одну из дефолтных локаций (тестировалась /var/lib/aleesa-jabber-go/data/config.json) и после этого +сервис запускается командой: + +```bash +service aleesa-jabber-go start +``` + +В автозагрузку его можно прописать через команду: + +```bash +rc-update add aleesa-jabber-go default +``` + +### Замечание + +Для бота важно, чтобы комната была _неанонимной_, или была _полуанонимной_ (но тогда бот должен быть админом, чтобы +_видеть real jid-ы_ участников). По механике работы, ему крайне желательно знать real jid-ы участников. + +### Другое замечание + +"Православный" способ сборки через команду **make**. Она генерирует из файла config.in файл config.go, в котором +прописывается версия программы из файла version.txt. Эта версия будет позже видна по команде ver/version/версия. + +## Дисклеймер + +Весь дисклеймер в файле LICENSE.txt :) + +## Благодарности + +Во-первых, `сообществу`, без него не было бы чятиков. + +Во-вторых, `batman46(new)` из конференций на `jabber.ru`, за наблюдения и за некоторые идеи, воплощённые в прототипе +бота, с которого был списан этот фронт-энд. + +В-третьих, `U2` из конференции `radio@conference.jabber.ru` за мысли, идеи для прототипа бота, с которого опять же +был списан этот фронт-энд, и за позитивный настрой. diff --git a/collection.go b/collection.go new file mode 100644 index 0000000..9ec783a --- /dev/null +++ b/collection.go @@ -0,0 +1,69 @@ +package main + +import ( + "sync" +) + +// Collection это sync.Map-ка, хранящая в себе произвольные итемы. +type Collection struct { + items sync.Map + close chan struct{} +} + +// Item представляет собой интерфейс для хранения произвольных данных. +type item struct { + data interface{} +} + +// NewCollection создаёт инстанс коллекции. +func NewCollection() *Collection { + c := &Collection{ //nolint:exhaustruct + close: make(chan struct{}), + } + + return c +} + +// Get достаёт данные по заданному ключу из коллекции. +func (collection *Collection) Get(key interface{}) (interface{}, bool) { + obj, exists := collection.items.Load(key) + + if !exists { + return nil, false + } + + item := obj.(item) + + return item.data, true +} + +// Set сохраняет данные с заданным ключом в коллекцию. +func (collection *Collection) Set(key interface{}, value interface{}) { + collection.items.Store(key, item{ + data: value, + }) +} + +// Range применяет функцию f ко всем ключам в коллекции. +func (collection *Collection) Range(f func(key, value interface{}) bool) { + fn := func(key, value interface{}) bool { + item := value.(item) + + return f(key, item.data) + } + + collection.items.Range(fn) +} + +// Delete удаляет ключ и значение из коллекции данных. +func (collection *Collection) Delete(key interface{}) { + collection.items.Delete(key) +} + +// Close очищает и высвобождает ресурсы, занятые коллекцией. +func (collection *Collection) Close() { + collection.close <- struct{}{} + collection.items = sync.Map{} +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/commands.go b/commands.go new file mode 100644 index 0000000..7bcdbd1 --- /dev/null +++ b/commands.go @@ -0,0 +1,389 @@ +package main + +import ( + "encoding/json" + "fmt" + "regexp" + "slices" + "strings" + + "github.com/eleksir/go-xmpp" + log "github.com/sirupsen/logrus" +) + +func cmd(v xmpp.Chat) error { + var ( + err error + message sMsg + data []byte + ) + + message.From = config.Redis.MyChannel + message.Threadid = "" // Тредиков в jabber-е нету, поэтому это поле отправляем пустым + message.Message = v.Text + message.Plugin = config.Redis.MyChannel + + // Список команд, публично доступных, без каких-то специальных настроек + cmds := []string{"ping", "пинг", "пинх", "pong", "понг", "понх", "coin", "монетка", "roll", "dice", "кости", + "ver", "version", "версия", "хэлп", "halp", "kde", "кде", "lat", "лат", "friday", "пятница", "proverb", + "пословица", "пословиться", "fortune", "фортунка", "f", "ф", "anek", "анек", "анекдот", "buni", "cat", + "кис", "drink", "праздник", "fox", "лис", "frog", "лягушка", "horse", "лошадь", "лошадка", "monkeyuser", + "owl", "сова", "сыч", "rabbit", "bunny", "кролик", "snail", "улитка", "xkcd", "dig", "копать", "fish", + "fishing", "рыба", "рыбка", "рыбалка", "karma", "карма"} + + // Список отключаемых команд проверяется в case-е про groupchat, чуть ниже + + // Список "сложных" команд, это те, которые имеют ключевые данные на конце команды. Пока что это только погодка. + cmdsComplex := []string{"w ", "п ", "погода ", "погодка ", "погадка ", "weather "} + + // Список команд бармэна. Основное отличие в том, что после команды ключевые данные могут быть, а могут и не быть. + // То есть рюмашку можно заказать себе или кому-то в чятике. + cmdsBartender := []string{"rum", "ром", "vodka", "водка", "beer", "пиво", "tequila", "текила", "whisky", "виски", + "absinthe", "абсент"} + + // Есть ещё команда на изменение кармы. Это команда-суффикс ++ или --. Она проверяется по-месту, потому что она одна + // и вполне уникальна. + + switch v.Type { + case "groupchat": + message.Mode = "public" + message.Chatid = strings.SplitN(v.Remote, "/", 2)[0] + userNick := strings.SplitN(v.Remote, "/", 2)[1] + + if realJid := getRealJIDfromNick(v.Remote); realJid != "" { + message.Userid = realJid + } else { + message.Userid = v.Remote + } + + message.Misc.Answer = 0 + message.Misc.Fwdcnt = 0 + message.Misc.Csign = config.CSign + message.Misc.Username = userNick + message.Misc.Botnick = config.Jabber.Nick + message.Misc.Msgformat = 0 + + msgLen := len(v.Text) + + // TODO: а вот тут надо впилить парсер команд + if (msgLen > len(config.CSign)) && (v.Text[:len(config.CSign)] == config.CSign) { + var ( + cmd = v.Text[len(config.CSign):] + room = message.Chatid + answer string + ) + + // И таких кейсов у нас минимум на команды !help и семейство команд !admin, а также на те команды, которые не всегда работают + switch { + case cmd == "help" || cmd == "помощь": + answer += fmt.Sprintf("%shelp | %sпомощь - это сообщение\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sanek | %sанек | %sанекдот - рандомный анекдот с anekdot.ru\n", config.CSign, config.CSign, config.CSign) + answer += fmt.Sprintf("%sbuni - комикс-стрип hapi buni\n", config.CSign) + answer += fmt.Sprintf("%sbunny - кролик\n", config.CSign) + answer += fmt.Sprintf("%srabbit | %sкролик - кролик\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%scat | %sкис - кошечка\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sdice | %sroll | %sкости - бросить кости\n", config.CSign, config.CSign, config.CSign) + answer += fmt.Sprintf("%sdig | %sкопать - заняться археологией\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sdrink | %sпраздник - какой сегодня праздник?\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sfish | %sfisher - порыбачить\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sрыба | %sрыбка | %sрыбалка - порыбачить\n", config.CSign, config.CSign, config.CSign) + answer += fmt.Sprintf("%sf | %sф - рандомная фраза из сборника цитат fortune_mod\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sfortune | %sфортунка - рандомная фраза из сборника цитат fortune_mod\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sfox | %sлис - лисичка\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sfriday | %sпятница - а не пятница ли сегодня?\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sfrog | %sлягушка - лягушка\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%shorse | %sлошадь | %sлошадка - лошадка\n", config.CSign, config.CSign, config.CSign) + answer += fmt.Sprintf("%skarma фраза - посмотреть карму фразы\n", config.CSign) + answer += fmt.Sprintf("%sкарма фраза - посмотреть карму фразы\n", config.CSign) + answer += fmt.Sprintln("фраза++ | фраза-- - повысить или понизить карму фразы") + answer += fmt.Sprintf("%slat | %sлат - сгенерировать фразу из крылатого латинского выражения\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%smonkeyuser - комикс-стрип MonkeyUser\n", config.CSign) + answer += fmt.Sprintf("%sowl | %sсова - сова\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sping | %sпинг - попинговать бота\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sproverb | %sпословица - рандомная русская пословица\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%ssnail | %sулитка - улитка\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%ssome_brew - выдать соответствующий напиток, бармен может налить rum, ром, vodka, водку, tequila, текила\n", config.CSign) + answer += fmt.Sprintf("%sver | %sversion - написать что-то про версию ПО\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sверсия - написать что-то про версию ПО\n", config.CSign) + answer += fmt.Sprintf("%sw город | %sп город - погода в городе\n", config.CSign, config.CSign) + answer += fmt.Sprintf("%sxkcd - комикс-стрип с xkcb.ru\n", config.CSign) + + // Для овнера или админа надо показывать команду admin + if isMucAdmin(v.Remote) { + answer += fmt.Sprintf("%sadmin - настройки некоторых плагинов бота для комнаты\n", config.CSign) + } + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + + case cmd == "ver" || cmd == "version" || cmd == "версия": + answer = fmt.Sprintf("Версия %s", softwareVersion[1]) + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + + case cmd == "admin": + if isMucAdmin(v.Remote) { + answer += fmt.Sprintf("%sadmin oboobs # - где 1 - вкл, 0 - выкл плагина oboobs\n", config.CSign) + answer += fmt.Sprintf("%sadmin oboobs показываем ли сисечки по просьбе участников чата (команды %stits, %stities, %sboobs, %sboobies, %sсиси, %sсисечки\n)", config.CSign, config.CSign, config.CSign, config.CSign, config.CSign, config.CSign, config.CSign) + answer += fmt.Sprintf("%sadmin obutts # - где 1 - вкл, 0 - выкл плагина obutts\n", config.CSign) + answer += fmt.Sprintf("%sadmin obutts показываем ли попки по просьбе участников чата (команды %sass, %sbutt, %sbooty, %sпопа, %sпопка)\n", config.CSign, config.CSign, config.CSign, config.CSign, config.CSign, config.CSign) + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + return err + + case cmd == "admin oboobs": + if isMucAdmin(v.Remote) { + switch getSetting(room, "oboobs") { + case "0": + answer = "Плагин oboobs выключен" + case "1": + answer = "Плагин oboobs включен" + case "": + _ = saveSetting(room, "oboobs", "0") + answer = "Плагин oboobs выключен" + default: + answer = "Плагин oboobs выключен" + } + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "admin oboobs 1": + if isMucAdmin(v.Remote) { + err := saveSetting(room, "oboobs", "1") + + if err != nil { + answer = "Плагин oboobs всё ещё выключен" + } else { + answer = "Плагин oboobs включен" + } + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "admin oboobs 0": + if isMucAdmin(v.Remote) { + _ = saveSetting(room, "oboobs", "0") + answer = "Плагин oboobs выключен" + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "admin obutts": + if isMucAdmin(v.Remote) { + switch getSetting(room, "obutts") { + case "0": + answer = "Плагин obutts выключен" + case "1": + answer = "Плагин obutts включен" + case "": + _ = saveSetting(room, "obutts", "0") + answer = "Плагин obutts выключен" + default: + answer = "Плагин obutts выключен" + } + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "admin obutts 1": + if isMucAdmin(v.Remote) { + err := saveSetting(room, "obutts", "1") + + if err != nil { + answer = "Плагин obutts всё ещё выключен" + } else { + answer = "Плагин obutts включен" + } + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "admin obutts 0": + if isMucAdmin(v.Remote) { + _ = saveSetting(room, "obutts", "0") + answer = "Плагин obutts выключен" + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + case cmd == "butt" || cmd == "booty" || cmd == "ass" || cmd == "попа" || cmd == "попка": + if getSetting(room, "obutts") != "1" { + return err + } + + message.Misc.Answer = 1 + + case cmd == "tits" || cmd == "boobs" || cmd == "tities" || cmd == "boobies" || cmd == "сиси" || cmd == "сисечки": + if getSetting(room, "oboobs") != "1" { + return err + } + + message.Misc.Answer = 1 + + // Отлавливаем команды и им проставляем message.Misc.Answer = 1 + default: + done := false + + // Простые команды + for _, command := range cmds { + if cmd == command { + done = true + message.Misc.Answer = 1 + + break + } + } + + // Сложные команды, например, погода + if !done { + for _, command := range cmdsComplex { + cmdLen := len(cmd) + + if cmdLen > len(command) && cmd[0:len(command)] == command { + done = true + message.Misc.Answer = 1 + + break + } + } + } + + // Сам себе заказал выпивку + if !done { + for _, command := range cmdsBartender { + if cmd == command { + done = true + message.Misc.Answer = 1 + + break + } + } + } + + // Заказал выпивку кому-то ещё + if !done { + re := regexp.MustCompile(" +") + pile := re.Split(cmd, 2) + names := getMucNames(room) + + for _, command := range cmdsBartender { + if pile[0] == command { + userNick := strings.TrimSpace(pile[1]) + + if userNick != "" { + if slices.Contains(names, userNick) { + message.Misc.Username = userNick + } else { + answer := fmt.Sprintf("Я тут не вижу участника с ником %s", userNick) + + _, err = talk.Send(xmpp.Chat{Remote: room, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + message.Misc.Answer = 1 + + break + } + } + } + } + } + } + + // Ну, вот мы и добрались досюда, и... нам осталось понять, не обращаются ли к боту? + // Дело в том, что ответа требуют только команды и обращения к боту по нику + // или jid-у, в данном случае, по нику. А всё остальное должно попадать в craniac-а и оставаться там в качестве + // материала для бредогенератора. + + // Попробуем выискать изменение кармы + + // ++ или -- на конце фразы - это наш кандидат + if msgLen > len("++") { + if v.Text[msgLen-len("--"):msgLen] == "--" || v.Text[msgLen-len("++"):msgLen] == "++" { + // Предполагается, что менять карму мы будем для одной фразы, то есть для 1 строки + if len(strings.Split(v.Text, "\n")) == 1 { + // Костыль для кармы + message.Misc.Answer = 1 + } + } + } + + // Предполагается что в канале бот должен отвечать, только если к нему обратились, либо это была команда + if regexp.MustCompile(config.Jabber.Nick).Match([]byte(message.Message)) { + message.Misc.Answer = 1 + } + + message.Message = v.Text + data, err = json.Marshal(message) + + if err != nil { + return fmt.Errorf("unable to to serialize message for redis: %w", err) + } + + case "chat": + message.Mode = "private" + message.Chatid = v.Remote + cmd := v.Text[len(config.CSign):] + + if cmd == "ver" || cmd == "version" || cmd == "версия" { + answer := fmt.Sprintf("Версия %s", softwareVersion[1]) + + _, err = talk.Send(xmpp.Chat{Remote: v.Remote, Type: v.Type, Text: answer}) //nolint:exhaustruct + + return err + } + + // Jid у нас уникален, а вот nick может, во-первых, разниться от конфы к конфе, а во-вторых, его может взять + // себе другой пользователь конфы, пока оригинальный владелец ника отсутствует. Но мы предполагаем, что если + // комната анонимная, то владелец комнаты, приглашая бота, согласен на некоторые компромиссы. + if realJID := getRealJIDfromNick(v.Remote); realJID != "" { + message.Userid = realJID + } else { + message.Userid = v.Remote + } + + message.Misc.Answer = 1 + message.Misc.Fwdcnt = 0 + message.Misc.Csign = config.CSign + message.Misc.Username = message.Userid + message.Misc.Botnick = config.Jabber.Nick + message.Misc.Msgformat = 0 + + data, err = json.Marshal(message) + + if err != nil { + return fmt.Errorf("unable to to serialize message for redis: %w", err) + } + } + + // Заталкиваем наш json в редиску + if err := redisClient.Publish(ctx, config.Redis.Channel, data).Err(); err != nil { + return fmt.Errorf("unable to send data to redis channel %s: %w", config.Redis.Channel, err) + } + + log.Debugf("Sent msg to redis channel %s: %s", config.Redis.Channel, string(data)) + + return err +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/config.in b/config.in new file mode 100644 index 0000000..4be7163 --- /dev/null +++ b/config.in @@ -0,0 +1,16 @@ +package main + +import ( + "runtime" + "strings" +) + +// Согласно xep-0092 software version состоит из 3-х компонентов: name, version, os. Os - опциональный компонент и +// может отсутствовать. +var softwareVersion = []string{ + "aleesa-bot (github.com/aleesa-bot)", + "v4", + (strings.SplitN(runtime.GOOS, "/", 2))[0], +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/contrib/aleesa-jabber-go.openrc b/contrib/aleesa-jabber-go.openrc new file mode 100644 index 0000000..0504dac --- /dev/null +++ b/contrib/aleesa-jabber-go.openrc @@ -0,0 +1,20 @@ +#!/sbin/openrc-run + +name="$SVCNAME" +command="/var/lib/$SVCNAME/$SVCNAME" +supervisor="supervise-daemon" +pidfile="/run/$SVCNAME/$SVCNAME.pid" +command_user=nobody:nogroup + +depend() { + need net redis + use dns + after redis +} + +start_pre() { + mkdir -p /var/log/$SVCNAME + chown -R nobody:nogroup /var/log/$SVCNAME + mkdir -p /run/$SVCNAME + chown -R nobody:nogroup /run/$SVCNAME +} diff --git a/data/sample_config.json b/data/sample_config.json new file mode 100644 index 0000000..3f2188e --- /dev/null +++ b/data/sample_config.json @@ -0,0 +1,125 @@ +{ + # Фронт-энд бота + "redis": { + # Если не задан, будет localhost + "server": "redis.tld", + + # 6379 if not set + "port": 6379, + + # Канал, на котором работает msg router + "channel" : "misc" + + # Канал, в который пишут другие модули бота сообщения для jabber-модуля + "my_channel" : "jabber" + }, + "jabber": { + # Если не задан, будет localhost + "server": "jabber.tld", + + # Если не задано - 5222 для нешифрованного соединения или для starttls и 5223 для голого (старорежимного) ssl + "port": 5223, + + # Включить шифрование + "ssl": true, + + # Это более современный протокол и как раз на нём работет большинство jabber-серверов, порт 5222, + # jabber.ru по этому протоколу как-то странно работает, если его включить, я получаю + # tls: first record does not look like a TLS handshake + "starttls" : false, + + # Не проверяем сертификаты по-умолчанию. + # Вам правда хочется всё это проверять? Там по идее могут быть всякие Lets Encrypt, которые хоть и работают, но + # создают кучу проблем + "ssl_verify": false, + + # Позволять авторизацию логин-паролем по незашифрованному каналу связи + "insecureallowunencryptedauth": false, + + # Таймаут установления соединения с сервером, в секундах. 10 секунд, если не задано. + "connection_timeout": 10, + + # Задержка перед пере-коннекчиванием. 3 секунды, если не задано. + "reconnect_delay": 3, + + # Промежуток между пингами сервера, для определения его живости. По-умолчанию 60 секунд. + # Пинги посылаются, если в течение этого времени не было активности со стороны сервера. + "server_ping_delay": 60, + + # Промежуток между пингами muc-ов. По-умолчанию 900 секунд. (Согласно рекомендации в xep-0410.) + # Пинги посылаются, если в течение этого времени не было активности со стороны muc-а. + "muc_ping_delay": 900, + + # Сколько ждать перед переджоиванием к комнате. По-умолчанию, 3 секунды. + "muc_rejoin_delay": 3, + + # Ping-to-ping splay delay. Варьируемая задержка между пингами, чтобы не набирать высокий message rate. + # По-умолчанию, 3 секунды. Под капотом преобразуются в миллисекунды. Важна для пингов MUC-ов, особенно, + # если их МНОГО. + "ping_splay_delay": 3, + + # Ник бота, с которым он будет заходить в комнаты + "nick": "aleesa", + + # Уникальная часть jid-а, специфичная для клиента + "resource" : "bot", + + # Имя пользователя для авторизации на сервере + "user": "aleesa@jabber.tld", + + # Пароль для авторизации + "password": "secret", + + # Список JID-ов, которым позволено управлять ботом (например, давать отмашку на rehash). + # В списке jid-ы без resource-а. + # Если не задано ни одного мастера, то бот сам себе мастер. + "bot_masters": [ + "luna@earth.tld" + ], + + # Jabber-каналы, к которым бот попробует присоединиться при старте + "channels": [ + "my_channel@conference.jabber.tld", + "another_channel@conference.jabber.tld" + ], + + # Статус, с которым бот запускается. (если всё нормально, этот статус будет видать только в логах сервера и + # на долю секунды он промелькнёт у всех в ростере, у кого бот в знакомых. Может отсуствовать, тогда статус будет + # пустой строкой + "startup_status": [ + "aleesa bot is starting" + ], + + # Статус, который демонстрируется во время работы бота, как xa + # (по задумке - extended away, на практике, к away обычно отношения не имеет) + "runtime_status": { + # Сам текст статуса, может отсустствовать, тогда статус - это пустая строка + "text": [ + "I’ll just warn you now, I don’t know how to use a computer." + ], + + # Период смены статуса, сек. Если параметра нет или он выставлен в 0, ротации не будет + # 3 дня в секундах + "rotation_time": 259200, + + # Рандомная составляющая, добавляемая к периоду смены статуса, сек. + # 4 дня в секундах + "rotation_splay_time": 345600 + }, + + # Каталог, в котором размещается бд с настройками бота, которые можно менять на лету через команду !admin + "data_dir": "data", + + # Будет 5, если не задан. Скорее всего вам не надо это менять. + "forwards_max": 5, + + # command sign символ-суффикс команды, например !rehash или !help. По-умолчанию "!". + "csign" : "!", + + # Многословность логов. Если не задано, то info. Debug - ДЕЙСТВИТЕЛЬНО вербозный уровень логгирования. + # Есть ещё trace :) + "loglevel": "debug", + + # Если не задан, логи идут в STDOUT + "log": "/var/log/aleesa-jabber-go/error.log" +} diff --git a/event_parser.go b/event_parser.go new file mode 100644 index 0000000..05ea65c --- /dev/null +++ b/event_parser.go @@ -0,0 +1,638 @@ +package main + +import ( + "encoding/json" + "encoding/xml" + "fmt" + "sort" + "strings" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/eleksir/go-xmpp" + log "github.com/sirupsen/logrus" + "golang.org/x/exp/slices" +) + +// parseEvent парсит ивенты, прилетающие из модуля xmpp (изменения presence, фразы участников, ошибки). +func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo + lastServerActivity = time.Now().Unix() + + switch v := e.(type) { + // Сообщение в чяти + case xmpp.Chat: + log.Debugf("Looks like message, ChatType: %s, From: %s, Subject: %s Text: %s", + v.Type, v.Remote, v.Subject, v.Text) + + // Топик чятика присылается в виде сообщения с subject, но без text + // В то же время сообщения от людей приходят с пустым subject, но с заполненным text + if v.Text != "" { + // Чятики бывают групповые и не групповые, от этого зависит Remote, куда направлять сообщение + switch v.Type { //nolint:wsl,whitespace + + // Групповой чятик + case "groupchat": + log.Debugf("Message from public chat: %s", v.Text) + // dest := (strings.SplitN(v.Remote, "/", 2))[0] + nick := (strings.SplitN(v.Remote, "/", 2))[1] + + if nick == config.Jabber.Nick { + log.Debug("Skipping message from myself") + + return + } + + if err := cmd(v); err != nil { + gTomb.Kill(err) + + return + } + + lastActivity = lastServerActivity + + if muc, _ := strings.CutSuffix(v.Remote, "/"); muc != "" { + lastMucActivity.Set(muc, lastServerActivity) + } + + // Приватный чятик + case "chat": + // Здесь у нас может быть 2 вида From: + // slackware-current@conference.jabber.ru/eleksir - это если сообщение из публичного чятика + // eleksir@jabber.ru/array.lan - это если мы работаем через ростер + log.Debugf("Private message: %s", v.Text) + + if err := cmd(v); err != nil { + gTomb.Kill(err) + + return + } + + lastActivity = lastServerActivity + + // Внезапно, ошибки. По идее они должны ассоциироваться с отправляемыми сообщениями, но по ходу это + // не реализовано, поэтому мы получаем ошибки в форме отдельного чятика + case "error": + // Это ошибка со стороны сервера, видимо, в ответ на наши действия и поскольку такие вещи происходят + // асинхронно, связать их с конкретными нашими действиями довольно сложно. + log.Warn(spew.Sdump(e)) + } + } + + // IQ-сообщение - пинг, понг, что-то ещё... + case xmpp.IQ: + // По правилам IQ обязательно должна содержать ID, причём не пустой + if v.ID == "" { + log.Info("Got an IQ stanza with empty id, discarding") + + return + } + + switch v.Type { + case xmpp.IQTypeGet: + log.Debug("Looks like IQ get query") + + if muc, _ := strings.CutSuffix(v.To, "/"); muc != "" { + if slices.Contains(roomsConnected, muc) { + lastMucActivity.Set(muc, lastServerActivity) + } + } + + var ( + iqStruct jabberSimpleIqGetQuery + parseError bool + ) + + if err := xml.Unmarshal(v.Query, &iqStruct); err == nil { + switch iqStruct.Xmlns { //nolint:wsl,whitespace + + // Запрос номера версии приложения + case "jabber:iq:version": + log.Infof("Got IQ get request for version from %s", v.From) + + if id, err := talk.IqVersionResponse( + v, + softwareVersion[0], + softwareVersion[1], + softwareVersion[2], + ); err != nil { + err := fmt.Errorf( + "unable to send version info to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + // Нам прислали попингуй + case "urn:xmpp:ping": + log.Infof("Got IQ get request for pong from %s", v.From) + + if id, err := talk.PingResponse(v); err != nil { + err := fmt.Errorf( + "unable to send pong to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + // У нас запросили время последней активности. В нашем случае это либо время запуска клиента, либо время + // последней фразы в чяти. Xep-0012. + case "jabber:iq:last": + log.Infof("Got IQ get last activity time request from %s", v.From) + + if id, err := talk.JabberIqLastResponse(v, lastActivity); err != nil { + err := fmt.Errorf( + "unable to send last activity time to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + // Запрос на список поддерживаемых фич - версия, локальное время, итд + case xmpp.XMPPNS_DISCO_INFO: + log.Infof("Got IQ get disco#info request from %s", v.From) + + answer := "" + answer += "" + answer += "" + answer += "" + answer += "" + answer += "" + answer += "" + + if id, err := talk.RawInformation( + v.To, + v.From, + v.ID, + xmpp.IQTypeResult, + answer, + ); err != nil { + err := fmt.Errorf( + "unable to send disco#info to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + // Спрашивают список команд, чтобы поуправлять этим клиентом (xep-0030) + case xmpp.XMPPNS_DISCO_ITEMS: + log.Infof("Got IQ get disco#items request from %s, answer service unavailable", v.From) + + if _, err := talk.ErrorServiceUnavailable( + v, + "http://jabber.org/protocol/disco#info", + "http://jabber.org/protocol/commands", + ); err != nil { + err := fmt.Errorf( + "unable to send disco#items to jabber server: id=%s, err=%w", + v.ID, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + // Запрашивают что-то, о чём мы не имеем представления + default: + log.Info("Got an unknown IQ get request, discarding") + log.Info(spew.Sdump(e)) + + return + } + } else { + parseError = true + } + + // Попробуем распарсить входящий запрос как urn:xmpp:time + if parseError { + var iqStruct jabberTimeIqGetQuery + + if err := xml.Unmarshal(v.Query, &iqStruct); err == nil { + switch iqStruct.Xmlns { + case "urn:xmpp:time": + log.Infof("Got IQ get time request from %s", v.From) + + if id, err := talk.UrnXMPPTimeResponse(v, "+00:00"); err != nil { + err := fmt.Errorf( + "unable to send urn:xmpp:time to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + default: + log.Info("Got bogus IQ get time request, discarding") + log.Info(spew.Sdump(e)) + + return + } + } else { + parseError = true + } + } + + // Попробуем распарсить входящий запрос как http://jabber.org/protocol/pubsub + if parseError { + var iqStruct jabberPubsubIQGetQuery + + if err := xml.Unmarshal(v.Query, &iqStruct); err == nil { + switch iqStruct.Xmlns { + case xmpp.XMPPNS_PUBSUB: + log.Infof("Got IQ get pubsub request from %s, answer feature unimplemented", v.From) + + if id, err := talk.ErrorNotImplemented( + v, + "http://jabber.org/protocol/pubsub#errors", + "subscribe", + ); err != nil { + err := fmt.Errorf("unable to send pubsub feature unimplemented to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + parseError = false + + default: + log.Info("Got unknown IQ get pubsub something request, discarding") + log.Info(spew.Sdump(e)) + parseError = true //nolint:wsl + } + } else { + parseError = true + } + } + + // Попробуем распарсить входящий запрос как urn:xmpp:ping он приходит при MUC Self-Ping (Schrödinger's Chat) + // Предполагается, что такие респонсы должны приходить только для пинга без серверной оптимизации. + // Хотя идейно мы не поддерживаем работу без серверной оптимизации, но на пинг ответим, нам несложно. + if parseError { + var iqStruct jabberIqPing + + if err := xml.Unmarshal(v.Query, &iqStruct); err == nil { + log.Debugf("Got IQ get request (actually, response) for MUC Self-Ping from %s", v.From) + + if id, err := talk.PingResponse(v); err != nil { + err := fmt.Errorf( + "unable to send pong to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + } + + parseError = false + } + + // Не знаю, как парсить... залоггируем это дело и пойдём дальше + if parseError { + log.Infof("Does not look like parsable via iqStruct") + log.Info(spew.Sdump(e)) + } + + case xmpp.IQTypeResult: + if muc, _ := strings.CutSuffix(v.To, "/"); muc != "" { + if slices.Contains(roomsConnected, muc) { + lastMucActivity.Set(muc, lastServerActivity) + } + } + + switch { + // Похоже на pong от сервера (по стандарту в ответе нету query, но go-xmpp нам подсовывает это) + case v.From == config.Jabber.Server && v.To == talk.JID() && string(v.Query) == "": + log.Debugf("Got S2C pong answer from %s to %s", v.From, v.To) + serverPingTimestampRx = time.Now().Unix() //nolint:wsl + + // Похоже на понг второй стадии xep-0410 MUC-Ping-а, который у нас не реализован + case v.To == talk.JID() && string(v.Query) == "": + mucNameMatch := slices.Contains(roomsConnected, v.From) + + if mucNameMatch { + log.Debugf("Got server-optimized MUC pong answer (xep-0410) from %s to %s", v.From, v.To) + } else { + mucNickMatch := false + + for _, room := range roomsConnected { + mucNick := fmt.Sprintf("%s/%s", room, config.Jabber.Nick) + + if v.From == mucNick { + mucNickMatch = true + + break + } + } + + if mucNickMatch { + log.Debugf("Got 2-nd stage MUC pong answer (xep-0410) from %s to %s", v.From, v.To) + // Поскольку никакой логики у нас на этот счёт не предусмотрено, то просто пропускаем ответ + } else { + log.Infof("Got unknown pong from %s to %s", v.From, v.To) + log.Debug(spew.Sdump(e)) + } + } + default: + log.Info("Got an IQ result. Dunno how deal with it, discarding") + log.Debug(spew.Sdump(e)) + } + + // Этот бот не управляется со стороны сервера, поэтому все попытки порулить игнорируем + case xmpp.IQTypeSet: + if muc, _ := strings.CutSuffix(v.To, "/"); muc != "" { + if slices.Contains(roomsConnected, muc) { + lastMucActivity.Set(muc, lastServerActivity) + } + } + + log.Info("Got an IQ request for set something. Answer not implemented") + + if id, err := talk.ErrorNotImplemented( + v, + "http://jabber.org/protocol/commands", + xmpp.IQTypeSet, + ); err != nil { + err := fmt.Errorf( + "unable to send set feature unimplemented to jabber server: id=%s, err=%w", + id, + err, + ) + + gTomb.Kill(err) + + return + } + + log.Debug(spew.Sdump(e)) + + // Нам прилетело сообщение об ошибке + case xmpp.IQTypeError: + // Если сервер не хочет пинговаться и отвечает ошибкой на пинг, то наверно он не умеет в пинги, + // хотя если мы его пингуем, значит он анонсировал такой capability. Вот, засранец! + var ( + iqPingStruct jabberIqPing + parseError = true + ) + + if err := xml.Unmarshal(v.Query, &iqPingStruct); err == nil { + if iqPingStruct.Xmlns == "urn:xmpp:ping" { + if v.From == config.Jabber.Server { + msg := "Server announced that it can answer c2s ping, but gives us an error to such query, " + msg += "fallback to keepalive whitespace pings" + log.Error(msg) + + serverCapsList.Set("urn:xmpp:ping", false) + } else { + log.Errorf("Got 'ping unsupported' message from: %s to: %s", v.From, v.To) + } + } else { + log.Error("Iq parsed as ping, but does not belong to xmlns urn:xmpp:ping") + log.Error(spew.Sdump(e)) + } + + parseError = false + } + + // Это у нас пинг xep-0410 и мы не в комнате, предполагается, что надо бы заджойниться + if parseError { + var iqErrorCancelNotAcceptable jabberIqErrorCancelNotAcceptable + + if err := xml.Unmarshal(v.Query, &iqErrorCancelNotAcceptable); err == nil { + if v.To == talk.JID() { + nick := (strings.SplitN(v.From, "/", 2))[1] + + if slices.Contains(roomsConnected, iqErrorCancelNotAcceptable.By) && nick == config.Jabber.Nick { + log.Errorf( + "Got Iq error message from: %s to: %s. Looks like i'm not in MUC anymore", + v.From, v.To, + ) + + time.Sleep(time.Duration(config.Jabber.MucRejoinDelay) * time.Second) + + if _, err := talk.JoinMUCNoHistory(iqErrorCancelNotAcceptable.By, nick); err != nil { + err := fmt.Errorf( + "looks like connection to server also lost err=%w", + err, + ) + + gTomb.Kill(err) + + return + } + } else { + log.Error( + "looks like message parsed as jabberIqErrorCancelNotAcceptable but we're not in given room", + ) + + log.Error(spew.Sdump(e)) + } + } else { + log.Error( + "Looks like message parsed as jabberIqErrorCancelNotAcceptable but addressed not to us", + ) + + log.Error(spew.Sdump(e)) + } + + parseError = false + } + } + + if parseError { + log.Error("Unhandled IQ Error message") + log.Error(spew.Sdump(e)) + } + // Нам прилетело что-то неизвестное из семейства IQ stanza + default: + log.Info("Got an unknown IQ request. Dunno how deal with it, discarding") + log.Info(spew.Sdump(e)) + } + + // Смена статуса участника + case xmpp.Presence: + if muc, _ := strings.CutSuffix(v.To, "/"); muc != "" { + if slices.Contains(roomsConnected, muc) { + lastMucActivity.Set(muc, lastServerActivity) + } + } + + if v.Type == xmpp.IQTypeError { + // Это событие происходит, когда из чятика выходит другой инстанс клиента. + // Такое бывает, когда 2 инстанса с одинаковым ресурсом, например, начинают "драться" за возможность + // остаться на сервере. Ситуация, которую допускать нельзя, на самом деле, потому что рано или поздно такого + // клиента забанят из-за спама "вошёл-вышел". + // Однако, это не значит, что такую ситуацию мы не должны корректным образом обрабатывать. + if v.Type == "unavailable" { + // Считаем, что мы больше не в комнате, поэтому не знаем, кто там есть + roomPresences.Delete(v.From) + + log.Error("Presence notification - looks like another instance of client leaves room") + + if slices.Contains(roomsConnected, v.From) { + go joinMuc(v.From) + } + } else { + log.Errorf("Presence notification, Type: %s, From: %s, Show: %s, Status: %s", + v.Type, v.From, v.Show, v.Status) + log.Errorf(spew.Sdump(v)) + } + } else { + log.Infof( + "Presence notification, Type: %s, From: %s, To: %s Show: %s, Status: %s, Affiliation: %s, Role: %s, JID: %s", + v.Type, v.From, v.To, v.Show, v.Status, v.Affiliation, v.Role, v.JID, + ) + + room := (strings.SplitN(v.From, "/", 2))[0] + nick := (strings.SplitN(v.From, "/", 2))[1] + + if nick == "" { + log.Infof("Presence stanza contains incorrect from attribute: %s", v.From) + + return + } + + // Это наш собственный Presence + if v.Show == "" && v.Status == "" { + if nick == config.Jabber.Nick { + roomsConnected = append(roomsConnected, room) + // На всякий случай дедуплицируем список комнат, к которым мы заджойнились. + sort.Strings(roomsConnected) + slices.Compact(roomsConnected) + } + } + + switch v.Role { + // Участник ушёл + case "none": + if presenceJSONInterface, present := roomPresences.Get(room); present { + presenceJSONStrings := interfaceToStringSlice(presenceJSONInterface) + var newPresenceJSONStrings []string + + for _, presenceJSONstring := range presenceJSONStrings { + var p xmpp.Presence + _ = json.Unmarshal([]byte(presenceJSONstring), &p) + + if p.From == v.From { + continue + } + + newPresenceJSONStrings = append(newPresenceJSONStrings, presenceJSONstring) + } + + roomPresences.Set(room, newPresenceJSONStrings) + } + // Участник пришёл + default: + var presenceJSONStrings []string + var newPresenceJSONStrings []string + var presenceJSONBytes []byte + + if presenceJSONInterface, present := roomPresences.Get(room); present { + presenceJSONStrings = interfaceToStringSlice(presenceJSONInterface) + } + + for _, presenceJSONString := range presenceJSONStrings { + var p xmpp.Presence + _ = json.Unmarshal([]byte(presenceJSONString), &p) + + // Если находим, что у нас уже есть клиент с таким же From, то есть полным nick-ом (для grouchat) + // просто замещаем его. + if p.From == v.From { + continue + } + + newPresenceJSONStrings = append(newPresenceJSONStrings, presenceJSONString) + } + + presenceJSONBytes, _ = json.Marshal(v) //nolint:errchkjson + newPresenceJSONStrings = append(newPresenceJSONStrings, string(presenceJSONBytes)) + roomPresences.Set(room, newPresenceJSONStrings) + } + } + + // Ответ на запрос поддерживаемых фич, который "http://jabber.org/protocol/disco#info" + case xmpp.DiscoResult: + if muc, _ := strings.CutSuffix(v.To, "/"); muc != "" { + if slices.Contains(roomsConnected, muc) { + lastMucActivity.Set(muc, lastServerActivity) + } + } + + // Я видел 2 типа disco result и они отличались только []identities. Попробуем вытащить известный identity + // TODO: проверять адресата v.To + for _, ident := range v.Identities { + switch ident.Category { + case "server": + // Конкретно сейчас нас интересует только поддержка c2s ping + for _, feature := range v.Features { + log.Debugf("Server %s announced that it supports feature: %s", v.From, feature) + serverCapsList.Set(feature, true) + } + + serverCapsQueried = true + + case "conference": + mucCaps := make(map[string]bool) + + for _, feature := range v.Features { + log.Debugf("MUC %s announced that it supports feature: %s", v.From, feature) + mucCaps[feature] = true //nolint:wsl + } + + mucCapsList.Set(v.From, mucCaps) + + case "pubsub": + log.Debugf("PubSub component %s reply to disco#info, skipping", v.From) + + default: + log.Debug("Got unknown reply to disco#info") + log.Debug(spew.Sdump(e)) + } + } + + // Это что-то неизвестное, подампим событие в лог + default: + log.Info(spew.Sdump(e)) + } +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/globals.go b/globals.go new file mode 100644 index 0000000..8bc16df --- /dev/null +++ b/globals.go @@ -0,0 +1,89 @@ +package main + +import ( + "context" + "os" + + "github.com/cockroachdb/pebble" + "github.com/eleksir/go-xmpp" + "github.com/go-redis/redis/v8" + "gopkg.in/tomb.v1" +) + +// Config - это у нас глобальная штука :) . +var config myConfig + +// Статичные пути, по которым у нас лежат конфиги. При запуске сюда дописываются и динамические пути тоже. +var configLocations = []string{ + "~/.aleesa-jabber-go.json", + "~/aleesa-jabber-go.json", + "/etc/aleesa-jabber-go.json", +} + +// To break circular message forwarding we must set some sane default, it can be overridden via config. +var forwardMax int64 = 5 + +// Ставится в true, если мы получили сигнал на выключение. +var shutdown = false + +// Чтобы не организовывать драку за установку коннекта. +var connecting = false + +// Глобальное состояние соединения. +var isConnected = false + +// Канал, в который приходят уведомления для хэндлера сигналов от траппера сигналов. +var sigChan = make(chan os.Signal, 1) + +// Основной инстанс xmpp-клиента. +var talk *xmpp.Client + +// Опции подключения к xmpp-серверу. +var options *xmpp.Options + +// Список комнат, в которых находится бот. +var roomsConnected []string + +// Время последней активности, нужно для jabber:iq:last. +var lastActivity int64 + +// Время последней активности, нужно для c2s пингов - посылаем пинги, только если давненько ничего не приходило с +// сервера. +var lastServerActivity int64 + +// Время последней активности MUC-ов, нужно для пингов - посылаем пинги, только если давненько ничего не приходило из +// muc-ов. +var lastMucActivity *Collection + +// Получен ли ответ на запрос disco#info к серверу. +var serverCapsQueried bool + +// sync.Map-ка с капабилити сервера. +var serverCapsList *Collection + +// sync.Map-ка с комнатами и их capability. +var mucCapsList *Collection + +// Время, когда был отправлен c2s ping. +var serverPingTimestampTx int64 + +// Время, когда был принят s2c pong. +var serverPingTimestampRx int64 + +// Объектик для хранения стейта утилизатора горутинок. +var gTomb tomb.Tomb + +// sync.Map-ка со списком участников конференций (в json-формате, согласно структуре xmpp.Presence, "room".[]json). +var roomPresences *Collection + +// Объектики клиента-редиски. +var redisClient *redis.Client +var subscriber *redis.PubSub + +// Мапка с открытыми дескрипторами баз с настройками. +var settingsDB = make(map[string]*pebble.DB) + +// Main context. +var ctx = context.Background() + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..76157b4 --- /dev/null +++ b/go.mod @@ -0,0 +1,43 @@ +module buny-jabber-bot + +go 1.21 + +require ( + github.com/cockroachdb/errors v1.11.1 + github.com/cockroachdb/pebble v0.0.0-20231007004400-803507a71849 + github.com/davecgh/go-spew v1.1.1 + github.com/eleksir/go-xmpp v1.6.0 + github.com/go-redis/redis/v8 v8.11.5 + github.com/hjson/hjson-go v3.3.0+incompatible + github.com/sirupsen/logrus v1.9.3 + golang.org/x/exp v0.0.0-20231006140011-7918f672742d + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 +) + +require ( + github.com/DataDog/zstd v1.5.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/getsentry/sentry-go v0.25.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..77daf44 --- /dev/null +++ b/go.sum @@ -0,0 +1,140 @@ +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20231007004400-803507a71849 h1:KqualT62KrZx3qr5kJpvG/N+ps1GOoT4Z64vzD2papY= +github.com/cockroachdb/pebble v0.0.0-20231007004400-803507a71849/go.mod h1:acMRUGd/BK8AUmQNK3spUCCGzFLZU2bSST3NMXSq2Kc= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/eleksir/go-xmpp v1.6.0 h1:bkGr0YVczJWpkyk/IHhZb2ewv+NeHLvdNfds0TFgqao= +github.com/eleksir/go-xmpp v1.6.0/go.mod h1:Ii6Wemk+yuGQOF+Glt0syjvtcPvdaBLstuNp/+rRJrg= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= +github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +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.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/hjson/hjson-go v3.3.0+incompatible h1:Rqr+Ya+0aCJMjaE4s8E9YKvuJLuLVpEvz4ONum52vnI= +github.com/hjson/hjson-go v3.3.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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.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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/lib.go b/lib.go new file mode 100644 index 0000000..8dd4bdf --- /dev/null +++ b/lib.go @@ -0,0 +1,796 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "math/rand" + "os" + "reflect" + "strings" + "syscall" + "time" + + "github.com/eleksir/go-xmpp" + "github.com/hjson/hjson-go" + log "github.com/sirupsen/logrus" + "golang.org/x/exp/slices" +) + +// sigHandler Хэндлер сигналов закрывает все бд, все сетевые соединения и сваливает из приложения. +func sigHandler() { + log.Warn("Installing signal handler") + + for s := range sigChan { + switch s { + case syscall.SIGINT: + log.Warnln("Got SIGINT, quitting") + case syscall.SIGTERM: + log.Warnln("Got SIGTERM, quitting") + case syscall.SIGQUIT: + log.Warnln("Got SIGQUIT, quitting") + + // Заходим на новую итерацию, если у нас "неинтересный" сигнал. + default: + log.Infof("Got unhandled signal: %s", s) + + continue + } + + var err error + + // Чтобы не срать в логи ошибками, проставим shutdown state приложения в true. + shutdown = true + + // Отпишемся от всех каналов и закроем коннект к редиске + if err = subscriber.Unsubscribe(ctx); err != nil { + log.Errorf("Unable to unsubscribe from redis channels cleanly: %s", err) + } else { + log.Info("Unsubscribe from all redis channels") + } + + if err = subscriber.Close(); err != nil { + log.Errorf("Unable to close redis connection cleanly: %s", err) + } else { + log.Info("Redis connection closed") + } + + if isConnected && !shutdown { + log.Info("Try to set our presence to Unavailable and status to Offline") + + // Вот тут понадобится коллекция известных пользователей, чтобы им разослать presence, что бот свалил в offline + // Пока за неимением лучшего сообщим об этом самим себе. + for _, room := range roomsConnected { + if _, err := talk.SendPresence( + xmpp.Presence{ //nolint:exhaustruct + To: room, + Status: "Offline", + Type: "unavailable", + }, + ); err != nil { + log.Infof("Unable to send presence to jabber server: %s", err) + } + } + + // И закрываем соединение. + log.Infof("Closing connection to jabber server") + + if err := talk.Close(); err != nil { + log.Infof("Unable to close connection to jabber server: %s", err) + } + } + + if len(settingsDB) > 0 { + log.Info("Closing runtime jabber room settings db") + + for _, db := range settingsDB { + _ = db.Close() + } + } + + log.Warnln("aleesa-jabber-bot exited successfully") + os.Exit(0) + } +} + +// readConfig читает и валидирует конфиг, а также выставляет некоторые default-ы, если значений для параметров в конфиге +// нет. +func readConfig() error { //nolint:gocognit,gocyclo + var ( + err error + configLoaded = false + ) + + for _, location := range configLocations { + fileInfo, err := os.Stat(location) + + // Предполагаем, что файла либо нет, либо мы не можем его прочитать, второе надо бы логгировать, но пока забьём. + if err != nil { + continue + } + + // Конфиг-файл длинноват для конфига, попробуем следующего кандидата. + if fileInfo.Size() > 65535 { + log.Warnf("Config file %s is too long for config, skipping", location) + + continue + } + + buf, err := os.ReadFile(location) + + // Не удалось прочитать, попробуем следующего кандидата. + if err != nil { + log.Warnf("Skip reading config file %s: %s", location, err) + + continue + } + + // Исходя из документации, hjson какбы умеет парсить "кривой" json, но парсит его в map-ку. + // Интереснее на выходе получить структурку: то есть мы вначале конфиг преобразуем в map-ку, затем эту map-ку + // сериализуем в json, а потом json превращаем в структурку. Не очень эффективно, но он и нечасто требуется. + var ( + sampleConfig myConfig + tmp map[string]interface{} + ) + + err = hjson.Unmarshal(buf, &tmp) + + // Не удалось распарсить - попробуем следующего кандидата. + if err != nil { + log.Warnf("Skip parsing config file %s: %s", location, err) + + continue + } + + tmpJSON, err := json.Marshal(tmp) + + // Не удалось преобразовать map-ку в json + if err != nil { + log.Warnf("Skip parsing config file %s: %s", location, err) + + continue + } + + if err := json.Unmarshal(tmpJSON, &sampleConfig); err != nil { + log.Warnf("Skip parsing config file %s: %s", location, err) + + continue + } + + // Валидируем значения из конфига + if sampleConfig.Redis.Server == "" { + sampleConfig.Redis.Server = "localhost" + + log.Infof("Redis server is not defined in config, using localhost") + } + + if sampleConfig.Redis.Port == 0 { + sampleConfig.Redis.Port = 6379 + } + + if sampleConfig.Redis.Channel == "" { + return fmt.Errorf("channel field in config file %s must be set", location) //nolint:goerr113 + } + + if sampleConfig.Redis.MyChannel == "" { + return fmt.Errorf("my_channel field in config file %s must be set", location) //nolint:goerr113 + } + + // Значения для Jabber-клиента + if sampleConfig.Jabber.Server == "" { + log.Error("Jabber server is not defined in config, using localhost") + sampleConfig.Jabber.Server = "localhost" //nolint:wsl + } + + if sampleConfig.Jabber.Port == 0 { + sampleConfig.Jabber.Port = 5222 + + if sampleConfig.Jabber.Ssl { + if !sampleConfig.Jabber.StartTLS { + sampleConfig.Jabber.Port = 5223 + + log.Info("Jabber port is not defined in config, using 5223") + } else { + log.Info("Jabber port is not defined in config, using 5222") + } + } + } + + if !sampleConfig.Jabber.Ssl { + sampleConfig.Jabber.StartTLS = false + } + + if !sampleConfig.Jabber.Ssl || !sampleConfig.Jabber.StartTLS { + sampleConfig.Jabber.SslVerify = false + } + + // sampleConfig.Jabber.InsecureAllowUnencryptedAuth = false, если не задан + + if sampleConfig.Jabber.ConnectionTimeout == 0 { + sampleConfig.Jabber.ConnectionTimeout = 10 + + log.Info("Jabber server connection_timeout not defined in config, using 10 seconds") + } + + if sampleConfig.Jabber.ReconnectDelay == 0 { + sampleConfig.Jabber.ReconnectDelay = 3 + + log.Info("Jabber server reconnect_delay not defined in config, using 3 seconds") + } + + if sampleConfig.Jabber.ServerPingDelay == 0 { + sampleConfig.Jabber.ServerPingDelay = 60 + + log.Info("Jabber server_ping_delay not defined in config, using 60 seconds") + } + + if sampleConfig.Jabber.MucPingDelay == 0 { + sampleConfig.Jabber.MucPingDelay = 900 + + log.Info("Jabber muc_ping_delay not defined in config, using 900 seconds") + } + + if sampleConfig.Jabber.MucRejoinDelay == 0 { + sampleConfig.Jabber.MucRejoinDelay = 3 + + log.Info("Jabber muc_rejoin_delay not defined in config, using 3 seconds") + } + + if sampleConfig.Jabber.PingSplayDelay == 0 { + sampleConfig.Jabber.PingSplayDelay = 3 + + log.Info("Jabber ping_splay_delay not defined in config, using 3 seconds") + } + + if sampleConfig.Jabber.Nick == "" { + return errors.New("jabber nick is not defined in config, quitting") //nolint:goerr113 + } + + if sampleConfig.Jabber.Resource == "" { + sampleConfig.Jabber.Resource = "bot" + + log.Info("Jabber resource not defined in config, using buny bot") + } + + if sampleConfig.Jabber.User == "" { + sampleConfig.Jabber.User = fmt.Sprintf("%s@%s", sampleConfig.Jabber.Nick, sampleConfig.Jabber.Server) + + log.Infof("Jabber user not defined in config, guessing, it can be %s", sampleConfig.Jabber.User) + } + + // Если sampleConfig.Jabber.Password не задан, то авторизации не будет + + // Если не задано ни одного мастера, то бот сам себе мастер + if len(sampleConfig.Jabber.BotMasters) == 0 { + sampleConfig.Jabber.BotMasters[0] = sampleConfig.Jabber.User + } + + // Нам бот нужен в каких-то чат-румах, а не "просто так" + if len(sampleConfig.Jabber.Channels) < 1 { + return errors.New("no jabber channels/rooms defined in config, quitting") //nolint:goerr113 + } + + // Если список фраз с которыми стартует бот пустой, вносим в него 1 запись с пустой строкой + if len(sampleConfig.Jabber.StartupStatus) == 0 { + sampleConfig.Jabber.StartupStatus[0] = "" + } + + // Если список статусов, с которыми работает бот пустой, вносим в него 1 запись с пустой строкой + if len(sampleConfig.Jabber.RuntimeStatus.Text) == 0 { + sampleConfig.Jabber.RuntimeStatus.Text[0] = "" + } + + // Если sampleConfig.Jabber.RuntimeStatus.RotationTime не задан, то он равен 0 + // Если sampleConfig.Jabber.RuntimeStatus.RotationSplayTime не задан, то он равен 0 + + if sampleConfig.ForwardsMax == 0 { + sampleConfig.ForwardsMax = forwardMax + } + + if sampleConfig.DataDir == "" { + return fmt.Errorf("data_dir field in config file %s must be set", location) //nolint:goerr113 + } + + if sampleConfig.CSign == "" { + sampleConfig.CSign = "!" + } + + if sampleConfig.Loglevel == "" { + sampleConfig.Loglevel = "info" + + log.Info("loglevel not defined in config, using info") + } + + // sampleConfig.Log = "" if not set + + config = sampleConfig + configLoaded = true + log.Warnf("Using %s as config file", location) //nolint:wsl + + break + } + + if !configLoaded { + return errors.New("config was not loaded") //nolint:goerr113 + } + + return err //nolint:wrapcheck +} + +// establishConnection устанавливает соединение с jabber-сервером. +func establishConnection() { + var err error + + if connecting && !isConnected { + return + } + + // Проставляем глобальные переменные. + connecting = true + isConnected = false + roomsConnected = make([]string, 0) + + talk, err = options.NewClient() + + if err != nil { + gTomb.Kill(err) + + return + } + + // По идее keepalive должен же проходить только, если мы уже на сервере, так? + if _, err := talk.SendKeepAlive(); err != nil { + log.Errorf("Try to send initial KeepAlive, got error: %s", err) + + gTomb.Kill(err) + + return + } + + log.Warnf("Connected to %s:%d", config.Jabber.Server, config.Jabber.Port) + + // Джойнимся к чятикам, но делаем это в фоне, чтобы не блочиться на ошибках, например, если бота забанили + for _, room := range config.Jabber.Channels { + go joinMuc(room) + } + + go RotateStatus("") + + lastActivity = time.Now().Unix() + connecting = false + isConnected = true + + log.Debugf("Sending disco#info to %s", config.Jabber.Server) + + _, err = talk.DiscoverInfo(talk.JID(), config.Jabber.Server) + + if err != nil { + log.Infof("Unable to send disco#info to jabber server: %s", err) + gTomb.Kill(err) + + return + } +} + +// joinMu джойнится к конференциям/каналам/комнатам в джаббере. +func joinMuc(room string) { + log.Debugf("Sending disco#info from %s to %s", talk.JID(), room) + + if _, err := talk.DiscoverInfo(talk.JID(), room); err != nil { + log.Infof("Unable to send disco#info to MUC %s: %s", room, err) + + gTomb.Kill(err) + + return + } + + // Ждём, пока muc нам вернёт список фичей. + for i := 0; i < (20 * int(config.Jabber.ConnectionTimeout)); i++ { + var ( + myRoom interface{} + supported bool + exist bool + ) + + time.Sleep(50 * time.Millisecond) + + if myRoom, exist = mucCapsList.Get(room); !exist { + // Пока не задискаверилась + continue + } + + if supported, exist = myRoom.(map[string]bool)["muc_unsecured"]; exist { + if supported { + break + } + + log.Infof("Unable to join to password-protected room. Don't know how to enter passwords :)") + + return + } + } + + if _, err := talk.JoinMUCNoHistory(room, config.Jabber.Nick); err != nil { + log.Errorf("Unable to join to MUC: %s", room) + + gTomb.Kill(err) + + return + } + + log.Infof("Joining to MUC: %s", room) + + // Ждём, когда прилетит presence из комнаты, тогда мы точно знаем, что мы вошли. + entered := false + + for i := 0; i < (20 * int(config.Jabber.ConnectionTimeout)); i++ { + time.Sleep(50 * time.Millisecond) + + if slices.Contains(roomsConnected, room) { + entered = true + + break + } + } + + if !entered { + log.Errorf( + "Unable to enter to MUC %s, join timeout after %d seconds (server does not return my presence for this room)", + room, + 20*int(config.Jabber.ConnectionTimeout)+1, + ) + + return + } + + // Вот теперь точно можно слать статус. + log.Warnf("Joined to MUC: %s", room) + + go RotateStatus(room) +} + +// probeServerLiveness проверяет живость соединения с сервером. Для многих серверов обязательная штука, без которой +// они выкидывают клиента через некоторое время неактивности. +func probeServerLiveness() { //nolint:gocognit + defer gTomb.Done() + + for { + select { + case <-gTomb.Dying(): + return + + default: + for { + if shutdown { + return + } + + sleepTime := time.Duration(config.Jabber.ServerPingDelay) * 1000 * time.Millisecond + sleepTime += time.Duration(rand.Int63n(1000*config.Jabber.PingSplayDelay)) * time.Millisecond + time.Sleep(sleepTime) + + if !isConnected { + continue + } + + // Пингуем, только если не было никакой активности в течение > config.Jabber.ServerPingDelay, + // в худшем случе это будет ~ (config.Jabber.PingSplayDelay * 2) + config.Jabber.PingSplayDelay + // if (time.Now().Unix() - lastServerActivity) < (config.Jabber.ServerPingDelay + config.Jabber.PingSplayDelay) { + // continue + // } + + if serverCapsQueried { // Сервер ответил на disco#info + var ( + value interface{} + exist bool + ) + + value, exist = serverCapsList.Get("urn:xmpp:ping") + + switch { + // Сервер анонсировал, что умеет в c2s пинги + case exist && value.(bool): + // Таймаут c2s пинга. Возьмём сумму задержки между пингами, добавим таймаут коннекта и добавим + // максимальную корректировку разброса. + txTimeout := config.Jabber.ServerPingDelay + config.Jabber.ConnectionTimeout + txTimeout += config.Jabber.PingSplayDelay + rxTimeout := txTimeout + + rxTimeAgo := time.Now().Unix() - serverPingTimestampRx + + if serverPingTimestampTx > 0 { // Первая пуля от нас ушла... + switch { + // Давненько мы не получали понгов от сервера, вероятно, соединение с сервером утеряно? + case rxTimeAgo > (rxTimeout * 2): + err := fmt.Errorf( //nolint:goerr113 + "stall connection detected. No c2s pong for %d seconds", + rxTimeAgo, + ) + + gTomb.Kill(err) + + return + + // По-умолчанию, мы отправляем c2s пинг + default: + log.Debugf("Sending c2s ping from %s to %s", talk.JID(), config.Jabber.Server) + + if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { + gTomb.Kill(err) + + return + } + + serverPingTimestampTx = time.Now().Unix() + } + } else { // Первая пуля пока не вылетела, отправляем + log.Debugf("Sending first c2s ping from %s to %s", talk.JID(), config.Jabber.Server) + + if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { + gTomb.Kill(err) + + return + } + + serverPingTimestampTx = time.Now().Unix() + } + + // Сервер не анонсировал, что умеет в c2s пинги + default: + log.Debug("Sending keepalive whitespace ping") + + if _, err := talk.SendKeepAlive(); err != nil { + gTomb.Kill(err) + + return + } + } + } else { // Сервер не ответил на disco#info + log.Debug("Sending keepalive whitespace ping") + + if _, err := talk.SendKeepAlive(); err != nil { + gTomb.Kill(err) + + return + } + } + } + } + } +} + +// probeMUCLiveness Пингует MUC-и, нужно для проверки, что клиент ещё находится в MUC-е. +func probeMUCLiveness() { //nolint:gocognit + for { + select { + case <-gTomb.Dying(): + return + + default: + for { + for _, room := range roomsConnected { + var ( + exist bool + lastActivityTS interface{} + ) + + // Если записи про комнату нету, то пинговать её бессмысленно. + if lastActivityTS, exist = lastMucActivity.Get(room); !exist { + continue + } + + // Если время последней активности в чятике не превысило + // config.Jabber.ServerPingDelay + config.Jabber.PingSplayDelay, ничего не пингуем. + if (time.Now().Unix() - lastActivityTS.(int64)) < (config.Jabber.ServerPingDelay + config.Jabber.PingSplayDelay) { + continue + } + + /* Пинг MUC-а по сценарию без серверной оптимизации мы реализовывать не будем. Это как-то не надёжно. + go func(room string) { + // Небольшая рандомная задержка перед пингом комнаты + sleepTime := time.Duration(rand.Int63n(1000*config.Jabber.PingSplayDelay)) * time.Millisecond //nolint:gosec + time.Sleep(sleepTime) + + if err := talk.PingS2S(talk.JID(), room+"/"+config.Jabber.Nick); err != nil { + gTomb.Kill(err) + + return + } + }(room) + */ + + var roomMap interface{} + + roomMap, exist = mucCapsList.Get(room) + + // Пинги комнаты проводим, только если она записана, как прошедшая disco#info и поддерживающая + // Server Optimization. + if exist && roomMap.(map[string]bool)["http://jabber.org/protocol/muc#self-ping-optimization"] { + go func(room string) { + // Небольшая рандомная задержка перед пингом комнаты. + sleepTime := time.Duration(rand.Int63n(1000*config.Jabber.PingSplayDelay)) * time.Millisecond + time.Sleep(sleepTime) + + log.Debugf("Sending MUC ping from %s to %s", talk.JID(), room) + + if err := talk.PingS2S(talk.JID(), room); err != nil { + err := fmt.Errorf("unable to ping MUC %s: %w", room, err) + + gTomb.Kill(err) + + return + } + }(room) + } + } + + time.Sleep(time.Duration(config.Jabber.MucPingDelay) * time.Second) + } + } + } +} + +// RotateStatus периодически изменяет статус бота в MUC-е согласно настройкам из кофига. +func RotateStatus(room string) { + defer gTomb.Done() + + for { + select { + case <-gTomb.Dying(): + return + + default: + // TODO: Переделать на ticker-ы + totalSleepTime := time.Duration(config.Jabber.RuntimeStatus.RotationTime) * time.Second + totalSleepTime += time.Duration(config.Jabber.RuntimeStatus.RotationSplayTime) * time.Second + + for { + status := randomPhrase(config.Jabber.RuntimeStatus.Text) + log.Debugf("Set status for MUC: %s to: %s", room, status) + + var p xmpp.Presence + + if room != "" { + p = xmpp.Presence{ //nolint:exhaustruct + To: room, + Status: status, + } + } else { + p = xmpp.Presence{ //nolint:exhaustruct + Status: status, + } + } + + if _, err := talk.SendPresence(p); err != nil { + log.Infof("Unable to send presence to MUC %s: %s", room, err) + gTomb.Kill(err) + + return + } + + // Если мы не хотим ротировать, то цикл нам тут не нужен, просто выходим. + if config.Jabber.RuntimeStatus.RotationTime == 0 { + gTomb.Done() + + return + } + + time.Sleep(totalSleepTime) + } + } + } +} + +// randomPhrase Выдаёт одну рандомную фразу из даденного списка фраз. +func randomPhrase(list []string) string { + phrase := "" + + if listLen := len(list); listLen > 0 { + phrase = list[rand.Intn(listLen)] + } + + return phrase +} + +// interfaceToStringSlice превращает данный интерфейс в слайс строк. +// Если может, конечно :) . +func interfaceToStringSlice(iface interface{}) []string { + var mySlice []string + + // А теперь мы начинаем дурдом, нам надо превратить ёбанный interface{} в []string + // Поскольку interface{} может быть чем угодно, перестрахуемся + if reflect.TypeOf(iface).Kind() == reflect.Slice { + shit := reflect.ValueOf(iface) + + for i := 0; i < shit.Len(); i++ { + mySlice = append(mySlice, fmt.Sprint(shit.Index(i))) + } + } + + return mySlice +} + +// getRealJIDfromNick достаёт из запомненных presence-ов по даденному nick-у real jid с resource-ом. Nick должен +// содержать имя конфы, откуда участник. +func getRealJIDfromNick(fullNick string) string { + var p xmpp.Presence + + room := (strings.SplitN(fullNick, "/", 2))[0] + + // Достанем presence участника + presenceJSONInterface, present := roomPresences.Get(room) + + // Никого нет дома + if !present { + return "" + } + + presenceJSONStrings := interfaceToStringSlice(presenceJSONInterface) + + for _, presepresenceJSONString := range presenceJSONStrings { + _ = json.Unmarshal([]byte(presepresenceJSONString), &p) + + if p.From == fullNick { + return p.JID + } + } + + return "" +} + +// isMucAdmin возращает true если указанный nick является овнером или админом в чяти. +func isMucAdmin(fullNick string) bool { + var p xmpp.Presence + + room := (strings.SplitN(fullNick, "/", 2))[0] + + // Достанем presence участника + presenceJSONInterface, present := roomPresences.Get(room) + + // Никого нет дома + if !present { + return false + } + + presenceJSONStrings := interfaceToStringSlice(presenceJSONInterface) + + for _, presepresenceJSONString := range presenceJSONStrings { + _ = json.Unmarshal([]byte(presepresenceJSONString), &p) + + if p.From == fullNick { + if p.Affiliation == "owner" || p.Affiliation == "admin" { + return true + } + } + } + + return false +} + +// getMucNames возвращает список участников конференции. +func getMucNames(room string) []string { + var ( + names []string + p xmpp.Presence + ) + + // Достанем presence участников + presenceJSONInterface, present := roomPresences.Get(room) + + if !present { + return names + } + + // Достанем presence участника + presenceJSONStrings := interfaceToStringSlice(presenceJSONInterface) + + for _, presepresenceJSONString := range presenceJSONStrings { + _ = json.Unmarshal([]byte(presepresenceJSONString), &p) + + names = append(names, p.From) + } + + return names +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/main.go b/main.go new file mode 100644 index 0000000..b119681 --- /dev/null +++ b/main.go @@ -0,0 +1,223 @@ +package main + +import ( + "crypto/tls" + "errors" + "fmt" + "io" + "net" + "os" + "os/signal" + "path/filepath" + "time" + + "github.com/eleksir/go-xmpp" + "github.com/go-redis/redis/v8" + log "github.com/sirupsen/logrus" + "gopkg.in/tomb.v1" +) + +func init() { + log.SetFormatter(&log.TextFormatter{ //nolint:exhaustruct + DisableQuote: true, + DisableLevelTruncation: false, + DisableColors: true, + FullTimestamp: true, + TimestampFormat: "2006-01-02 15:04:05", + }) + + // Добавим динамически формируемый путь до конфига в список возможных положений конфига в системе + executablePath, err := os.Executable() + + if err != nil { + log.Errorf("unable to get current executable path: %s", err) + + os.Exit(1) + } + + configJSONPath := fmt.Sprintf("%s/data/config.json", filepath.Dir(executablePath)) + configLocations = append(configLocations, configJSONPath) + + if err := readConfig(); err != nil { + log.Error(err) + + os.Exit(1) + } + + // no panic + switch config.Loglevel { + case "fatal": + log.SetLevel(log.FatalLevel) + case "error": + log.SetLevel(log.ErrorLevel) + case "warn": + log.SetLevel(log.WarnLevel) + case "info": + log.SetLevel(log.InfoLevel) + case "debug": + log.SetLevel(log.DebugLevel) + case "trace": + log.SetLevel(log.TraceLevel) + default: + log.SetLevel(log.InfoLevel) + } +} + +func main() { + // Откроем лог и скормим его логгеру + if config.Log != "" { + logfile, err := os.OpenFile(config.Log, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) + + if err != nil { + log.Fatalf("Unable to open log file %s: %s", config.Log, err) + } + + log.SetOutput(logfile) + } + + myLogLevel := log.GetLevel() + log.Warnf("Loglevel set to %v", myLogLevel) + + verboseClient := false + + if myLogLevel == log.TraceLevel { + verboseClient = true + } + + // github.com/mattn/go-xmpp пишет в stdio, нам этого не надо, ловим выхлоп его в logrus с уровнем trace + xmpp.DebugWriter = log.WithFields(log.Fields{"logger": "stdlib"}).WriterLevel(log.TraceLevel) + + log.Warn("Starting aleesa-jabber-bot") + + // Хэндлер сигналов не надо трогать, он нужен для завершения программы целиком + go sigHandler() + signal.Notify(sigChan, os.Interrupt) + + // Иницализируем redis-клиента + redisClient = redis.NewClient(&redis.Options{ //nolint:exhaustruct + Addr: fmt.Sprintf("%s:%d", config.Redis.Server, config.Redis.Port), + }) + + log.Warnf("Initializing lazy connection to redis %s:%d", config.Redis.Server, config.Redis.Port) + subscriber = redisClient.Subscribe(ctx, config.Redis.MyChannel) + + go redisLoop(subscriber.Channel()) + + for { + options = &xmpp.Options{ //nolint:exhaustruct + Host: fmt.Sprintf("%s:%d", config.Jabber.Server, config.Jabber.Port), + User: config.Jabber.User, + Password: config.Jabber.Password, + Resource: config.Jabber.Resource, + NoTLS: !config.Jabber.Ssl, + StartTLS: config.Jabber.StartTLS, + TLSConfig: &tls.Config{ //nolint:exhaustruct + ServerName: config.Jabber.Server, + InsecureSkipVerify: !config.Jabber.SslVerify, //nolint:gosec + }, + InsecureAllowUnencryptedAuth: config.Jabber.InsecureAllowUnencryptedAuth, + Debug: verboseClient, + Session: false, + Status: "xa", + StatusMessage: randomPhrase(config.Jabber.StartupStatus), + DialTimeout: time.Duration(config.Jabber.ConnectionTimeout) * time.Second, + } + + // Через tomb попробуем сделать выход горутинок управляемым + gTomb = tomb.Tomb{} + + // Устанавливаем соединение и гребём события, посылаемые сервером + myLoop() + + log.Error(gTomb.Wait()) + + // Если у нас wire error, то вызов .Close() повлечёт за собой ошибку, но мы вынуждены звать .Close(), чтоб + // закрыть tls контекст и почистить всё что связанно с прерванным соединением. + _ = talk.Close() + + time.Sleep(time.Duration(config.Jabber.ReconnectDelay) * time.Second) + } +} + +func myLoop() { + for { + select { + case <-gTomb.Dying(): + gTomb.Done() + + return + default: + // Зададим начальное значение глобальным переменным + serverPingTimestampRx = 0 + serverPingTimestampTx = 0 + roomsConnected = make([]string, 1) + lastActivity = 0 + lastServerActivity = 0 + lastMucActivity = NewCollection() + serverCapsQueried = false + serverCapsList = NewCollection() + mucCapsList = NewCollection() + serverPingTimestampTx = 0 + serverPingTimestampRx = 0 + roomPresences = NewCollection() + + // Установим коннект + establishConnection() + + serverPingTimestampRx = time.Now().Unix() // Считаем, что если коннект запустился, то первый пинг успешен + + // Тыкаем сервер палочкой, проверяем, что коннект жив и переустанавливаем его, если он не жив + go probeServerLiveness() + + // Тыкаем muc-и палочкой, проверяем, что они живы и пере-заходим в них, если пинги пропали + go probeMUCLiveness() + + // Гребём сообщения... + for { + // Стриггерилось завершение работы приложения, или соединение не установлено (порвалось, например) + // грести не надо + if shutdown { + break + } + + if !isConnected { + continue + } + + chat, err := talk.Recv() + + if err != nil { + log.Errorf("Unable to get events from server: %s", err) + + switch { + // Стрим не читается, он закрылся с той стороны во время чтения + case errors.Is(err, io.EOF): + err = fmt.Errorf("tcp stream closed while reading, err=%w", err) + + // Пытаемся читать закрытый сокет + case errors.Is(err, net.ErrClosed): + err = fmt.Errorf("unable to read closed socket, err=%w", err) + + // Не смогли записать в сокет + case errors.Is(err, net.ErrWriteToConnected): + err = fmt.Errorf("unable to write to socket, err=%w", err) + + // Не сетевая проблема + default: + // Это уже что-то странное. + // Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем + err = fmt.Errorf("error during parsing received message, err=%w", err) + } + + gTomb.Kill(err) + + return + } + + parseEvent(chat) + } + } + } +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/redis.go b/redis.go new file mode 100644 index 0000000..d81c1e4 --- /dev/null +++ b/redis.go @@ -0,0 +1,141 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/eleksir/go-xmpp" + "github.com/go-redis/redis/v8" + log "github.com/sirupsen/logrus" +) + +func redisLoop(redisMsgChan <-chan *redis.Message) { + // Обработчик событий от редиски + for msg := range redisMsgChan { + if shutdown { + return + } + + if err := redisMsgParser(msg.Payload); err != nil { + log.Warn(err) + } + } +} + +// redisMsgParser парсит json-чики прилетевшие из REDIS-ки. +func redisMsgParser(msg string) error { + var err error + + if shutdown { + // Если мы завершаем работу программы, то нам ничего обрабатывать не надо. + return err + } + + var j rMsg + + log.Debugf("Incoming raw json: %s", msg) + + if err := json.Unmarshal([]byte(msg), &j); err != nil { + log.Warnf("Unable to to parse message from redis channel: %s", err) + + return nil + } + + // Validate our j + if exist := j.From; exist == "" { + log.Warnf("Incorrect msg from redis, no from field: %s", msg) + + return nil + } + + if exist := j.Chatid; exist == "" { + log.Warnf("Incorrect msg from redis, no chatid field: %s", msg) + + return nil + } + + if exist := j.Userid; exist == "" { + log.Warnf("Incorrect msg from redis, no userid field: %s", msg) + + return nil + } + + if exist := j.Message; exist == "" { + log.Warnf("Incorrect msg from redis, no message field: %s", msg) + + return nil + } + + if exist := j.Plugin; exist == "" { + log.Warnf("Incorrect msg from redis, no plugin field: %s", msg) + + return nil + } + + if exist := j.Mode; exist == "" { + log.Warnf("Incorrect msg from redis, no mode field: %s", msg) + + return nil + } + + // j.Misc.Answer может и не быть, тогда ответа на такое сообщение не будет + if j.Misc.Answer == 0 { + log.Debug("Field Misc->Answer = 0, skipping message") + + return nil + } + + // j.Misc.BotNick тоже можно не передавать, тогда будет записана пустая строка + // j.Misc.CSign если нам его не передали, возьмём значение из конфига + if exist := j.Misc.Csign; exist == "" { + j.Misc.Csign = config.CSign + } + + // j.Misc.FwdCnt если нам его не передали, то будет 0 + if exist := j.Misc.Fwdcnt; exist == 0 { + j.Misc.Fwdcnt = 1 + } + + // j.Misc.GoodMorning может быть быть 1 или 0, по-умолчанию 0 + // j.Misc.MsgFormat может быть быть 1 или 0, по-умолчанию 0 + // j.Misc.Username можно не передавать, тогда будет пустая строка + + // Отвалидировались, теперь вернёмся к нашим баранам. + if j.Misc.Answer == 1 { + switch j.Mode { + case "public": + // Отправляем сообщение в чятик, а не тому, кто прислал нам исходное сообщение + if _, err := talk.Send( + xmpp.Chat{ //nolint:exhaustruct + Remote: j.Chatid, + Type: "groupchat", + Text: j.Message, + }, + ); err != nil { + err = fmt.Errorf("unable to send phrase to room %s: %w", j.Chatid, err) + + return err + } + + case "private": + // Отправляем сообщение тому, кто прислал сообщение + if _, err := talk.Send( + xmpp.Chat{ //nolint:exhaustruct + Remote: j.From, + Type: "chat", + Text: j.Message, + }, + ); err != nil { + err = fmt.Errorf("unable to send phrase to jid %s: %w", j.From, err) + + return err + } + default: + log.Infof("Got message from redis that neither public or private: %s", msg) + } + } + + return err +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/settings-db-util.go b/settings-db-util.go new file mode 100644 index 0000000..b43b6e8 --- /dev/null +++ b/settings-db-util.go @@ -0,0 +1,126 @@ +package main + +import ( + "crypto/sha256" + "errors" + "fmt" + "io/fs" + + "github.com/cockroachdb/errors/oserror" + "github.com/cockroachdb/pebble" + log "github.com/sirupsen/logrus" +) + +// StoreKV сохраняет в указанной бд ключ и значение. +func StoreKV(db *pebble.DB, key string, value string) error { + var ( + kArray = []byte(key) //nolint:revive + vArray = []byte(value) + ) + + err := db.Set(kArray, vArray, pebble.Sync) + + return err +} + +// FetchV достаёт значение по ключу. +func FetchV(db *pebble.DB, key string) (string, error) { + var ( + kArray = []byte(key) //nolint:revive + vArray []byte + valueString string + ) + + vArray, closer, err := db.Get(kArray) + + if err != nil { + return valueString, err + } + + valueString = string(vArray) + err = closer.Close() + + return valueString, err +} + +// Достанем настройку из БД с настройками. +func getSetting(chatID string, setting string) string { + var ( + err error + chatHash = sha256.Sum256([]byte(chatID)) + database = fmt.Sprintf("settings_db/%x", chatHash) + ) + + // Если БД не открыта, откроем её + if _, ok := settingsDB[database]; !ok { + var options pebble.Options + // По дефолту ограничение ставится на мегабайты данных, а не на количество файлов, поэтому с дефолтными + // настройками порождается огромное количество файлов. Умолчальное ограничение на количество файлов - 500 штук, + // что нас не устраивает, поэтому немного снизим эту цифру до более приемлемых значений + options.L0CompactionFileThreshold = 8 + settingsDB[database], err = pebble.Open(config.DataDir+"/"+database, &options) + + if err != nil { + log.Errorf("Unable to open settings db, %s: %s\n", database, err) + + return "" + } + } + + value, err := FetchV(settingsDB[database], setting) + + // Если из базы ничего не вынулось, по каким-то причинам, то просто вернём пустую строку + if err != nil { + switch { + case errors.Is(err, pebble.ErrNotFound): + log.Debugf("Unable to get value for %s: no record found in db %s", setting, database) + + case errors.Is(err, fs.ErrNotExist): + log.Debugf("Unable to get value for %s: db dir %s does not exist", setting, database) + + case errors.Is(err, oserror.ErrNotExist): + log.Debugf("Unable to get value for %s: db dir %s does not exist", setting, database) + + default: + log.Errorf("Unable to get value for %s in db dir %s: %s", setting, database, err) + } + + return "" + } + + return value +} + +// Сохраним настройку в БД с настройками. +func saveSetting(chatID string, setting string, value string) error { + var ( + chatHash = sha256.Sum256([]byte(chatID)) + database = fmt.Sprintf("settings_db/%x", chatHash) + err error + ) + + // Если БД не открыта, откроем её + if _, ok := settingsDB[database]; !ok { + var options pebble.Options + // По дефолту ограничение ставится на мегабайты данных, а не на количество файлов, поэтому с дефолтными + // настройками порождается огромное количество файлов. Умолчальное ограничение на количество файлов - 500 штук, + // что нас не устраивает, поэтому немного снизим эту цифру до более приемлемых значений + options.L0CompactionFileThreshold = 8 + + settingsDB[database], err = pebble.Open(config.DataDir+"/"+database, &options) + + if err != nil { + log.Errorf("Unable to open settings db, %s: %s\n", database, err) + + return err + } + } + + if err := StoreKV(settingsDB[database], setting, value); err != nil { + log.Errorf("Unable to save setting %s in database %s: %s", setting, database, err) + } + + return err +} + +/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */ diff --git a/types.go b/types.go new file mode 100644 index 0000000..0186a37 --- /dev/null +++ b/types.go @@ -0,0 +1,139 @@ +package main + +import ( + "encoding/xml" +) + +// myConfig прототип структурки с конфигом. +type myConfig struct { + Redis struct { + Server string `json:"server,omitempty"` + Port int `json:"port,omitempty"` + Channel string `json:"channel,omitempty"` + MyChannel string `json:"my_channel,omitempty"` + } `json:"redis"` + Jabber struct { + Server string `json:"server,omitempty"` + Port int `json:"port,omitempty"` + Ssl bool `json:"ssl,omitempty"` + StartTLS bool `json:"starttls,omitempty"` + SslVerify bool `json:"ssl_verify,omitempty"` + InsecureAllowUnencryptedAuth bool `json:"insecureallowunencryptedauth,omitempty"` + ConnectionTimeout int64 `json:"connection_timeout,omitempty"` + ReconnectDelay int64 `json:"reconnect_delay,omitempty"` + ServerPingDelay int64 `json:"server_ping_delay,omitempty"` + MucPingDelay int64 `json:"muc_ping_delay,omitempty"` + MucRejoinDelay int64 `json:"muc_rejoin_delay,omitempty"` + PingSplayDelay int64 `json:"ping_splay_delay,omitempty"` + Nick string `json:"nick,omitempty"` + Resource string `json:"resource,omitempty"` + User string `json:"user,omitempty"` + Password string `json:"password,omitempty"` + BotMasters []string `json:"bot_masters"` + Channels []string `json:"channels"` + StartupStatus []string `json:"startup_status,omitempty"` + RuntimeStatus struct { + Text []string `json:"text,omitempty"` + RotationTime int64 `json:"rotation_time,omitempty"` + RotationSplayTime int64 `json:"rotation_splay_time,omitempty"` + } `json:"runtime_status,omitempty"` + } `json:"jabber,omitempty"` + + DataDir string `json:"data_dir,omitempty"` + ForwardsMax int64 `json:"forwards_max,omitempty"` + CSign string `json:"csign,omitempty"` + Loglevel string `json:"loglevel,omitempty"` + Log string `json:"log,omitempty"` +} + +// jabberSimpleIqGetQuery прототип структурки для разбора запросов xmpp discovery query, например, +// https://xmpp.org/extensions/xep-0030.html#example-18 . +type jabberSimpleIqGetQuery struct { + XMLName xml.Name `xml:"query"` + Text string `xml:",chardata"` + Xmlns string `xml:"xmlns,attr"` + Node string `xml:"node,attr,omitempty"` // для xmlns="http://jabber.org/protocol/disco#items" +} + +// jabberPubsubIQGetQuery прототип структурки для разбора запросов xmpp pubsub. +type jabberPubsubIQGetQuery struct { + XMLName xml.Name `xml:"pubsub"` + Text string `xml:",chardata"` + Xmlns string `xml:"xmlns,attr"` + Items struct { + Text string `xml:",chardata"` + Node string `xml:"node,attr"` + MaxItems string `xml:"max_items,attr"` + } `xml:"items"` +} + +// jabberTimeIqGetQuery прототип структурки для разбора IQ запросов на локальное время клиента, +// https://xmpp.org/extensions/xep-0202.html +type jabberTimeIqGetQuery struct { + //