diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 497615df0..b48028e4a 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -24,4 +24,6 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi ### IMPROVEMENTS: +- [txindex] [\#4466](https://github.com/tendermint/tendermint/pull/4466) Allow to index an event at runtime (@favadi) + ### BUG FIXES: diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go index 42f00231f..abe65cda4 100644 --- a/abci/example/kvstore/kvstore.go +++ b/abci/example/kvstore/kvstore.go @@ -10,7 +10,6 @@ import ( "github.com/tendermint/tendermint/abci/example/code" "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/kv" "github.com/tendermint/tendermint/version" ) @@ -99,9 +98,11 @@ func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeli events := []types.Event{ { Type: "app", - Attributes: []kv.Pair{ + Attributes: []types.EventAttribute{ {Key: []byte("creator"), Value: []byte("Cosmoshi Netowoko")}, {Key: []byte("key"), Value: key}, + {Key: []byte("index_key"), Value: []byte("index is working"), Index: true}, + {Key: []byte("noindex_key"), Value: []byte("index is working"), Index: false}, }, }, } diff --git a/abci/types/messages_test.go b/abci/types/messages_test.go index 3aead256f..16729cb4b 100644 --- a/abci/types/messages_test.go +++ b/abci/types/messages_test.go @@ -8,8 +8,6 @@ import ( "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/assert" - - "github.com/tendermint/tendermint/libs/kv" ) func TestMarshalJSON(t *testing.T) { @@ -24,7 +22,7 @@ func TestMarshalJSON(t *testing.T) { Events: []Event{ { Type: "testEvent", - Attributes: []kv.Pair{ + Attributes: []EventAttribute{ {Key: []byte("pho"), Value: []byte("bo")}, }, }, @@ -91,7 +89,7 @@ func TestWriteReadMessage2(t *testing.T) { Events: []Event{ { Type: "testEvent", - Attributes: []kv.Pair{ + Attributes: []EventAttribute{ {Key: []byte("abc"), Value: []byte("def")}, }, }, diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 51ff4aedd..09bf63cb7 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -14,7 +14,6 @@ import ( _ "github.com/golang/protobuf/ptypes/duration" _ "github.com/golang/protobuf/ptypes/timestamp" merkle "github.com/tendermint/tendermint/crypto/merkle" - kv "github.com/tendermint/tendermint/libs/kv" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -2200,19 +2199,83 @@ func (m *LastCommitInfo) GetVotes() []VoteInfo { return nil } +// EventAttribute represents an event to the indexing service. +type EventAttribute struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EventAttribute) Reset() { *m = EventAttribute{} } +func (m *EventAttribute) String() string { return proto.CompactTextString(m) } +func (*EventAttribute) ProtoMessage() {} +func (*EventAttribute) Descriptor() ([]byte, []int) { + return fileDescriptor_9f1eaa49c51fa1ac, []int{30} +} +func (m *EventAttribute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventAttribute) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventAttribute.Merge(m, src) +} +func (m *EventAttribute) XXX_Size() int { + return m.Size() +} +func (m *EventAttribute) XXX_DiscardUnknown() { + xxx_messageInfo_EventAttribute.DiscardUnknown(m) +} + +var xxx_messageInfo_EventAttribute proto.InternalMessageInfo + +func (m *EventAttribute) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *EventAttribute) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *EventAttribute) GetIndex() bool { + if m != nil { + return m.Index + } + return false +} + type Event struct { - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Attributes []kv.Pair `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Attributes []EventAttribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{30} + return fileDescriptor_9f1eaa49c51fa1ac, []int{31} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2248,7 +2311,7 @@ func (m *Event) GetType() string { return "" } -func (m *Event) GetAttributes() []kv.Pair { +func (m *Event) GetAttributes() []EventAttribute { if m != nil { return m.Attributes } @@ -2284,7 +2347,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{31} + return fileDescriptor_9f1eaa49c51fa1ac, []int{32} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2423,7 +2486,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{32} + return fileDescriptor_9f1eaa49c51fa1ac, []int{33} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2478,7 +2541,7 @@ func (m *BlockID) Reset() { *m = BlockID{} } func (m *BlockID) String() string { return proto.CompactTextString(m) } func (*BlockID) ProtoMessage() {} func (*BlockID) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{33} + return fileDescriptor_9f1eaa49c51fa1ac, []int{34} } func (m *BlockID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2533,7 +2596,7 @@ func (m *PartSetHeader) Reset() { *m = PartSetHeader{} } func (m *PartSetHeader) String() string { return proto.CompactTextString(m) } func (*PartSetHeader) ProtoMessage() {} func (*PartSetHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{34} + return fileDescriptor_9f1eaa49c51fa1ac, []int{35} } func (m *PartSetHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2590,7 +2653,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{35} + return fileDescriptor_9f1eaa49c51fa1ac, []int{36} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2646,7 +2709,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{36} + return fileDescriptor_9f1eaa49c51fa1ac, []int{37} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2702,7 +2765,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{37} + return fileDescriptor_9f1eaa49c51fa1ac, []int{38} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2757,7 +2820,7 @@ func (m *PubKey) Reset() { *m = PubKey{} } func (m *PubKey) String() string { return proto.CompactTextString(m) } func (*PubKey) ProtoMessage() {} func (*PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{38} + return fileDescriptor_9f1eaa49c51fa1ac, []int{39} } func (m *PubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2815,7 +2878,7 @@ func (m *Evidence) Reset() { *m = Evidence{} } func (m *Evidence) String() string { return proto.CompactTextString(m) } func (*Evidence) ProtoMessage() {} func (*Evidence) Descriptor() ([]byte, []int) { - return fileDescriptor_9f1eaa49c51fa1ac, []int{39} + return fileDescriptor_9f1eaa49c51fa1ac, []int{40} } func (m *Evidence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,6 +3005,8 @@ func init() { golang_proto.RegisterType((*ValidatorParams)(nil), "tendermint.abci.types.ValidatorParams") proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.types.LastCommitInfo") golang_proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.types.LastCommitInfo") + proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.types.EventAttribute") + golang_proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.types.EventAttribute") proto.RegisterType((*Event)(nil), "tendermint.abci.types.Event") golang_proto.RegisterType((*Event)(nil), "tendermint.abci.types.Event") proto.RegisterType((*Header)(nil), "tendermint.abci.types.Header") @@ -2968,157 +3033,157 @@ func init() { proto.RegisterFile("abci/types/types.proto", fileDescriptor_9f1eaa func init() { golang_proto.RegisterFile("abci/types/types.proto", fileDescriptor_9f1eaa49c51fa1ac) } var fileDescriptor_9f1eaa49c51fa1ac = []byte{ - // 2386 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0x4d, 0x90, 0x1b, 0x47, - 0x15, 0xde, 0xd1, 0x6a, 0x57, 0xd2, 0xd3, 0xfe, 0xc8, 0x6d, 0x27, 0x91, 0x85, 0xb3, 0xeb, 0x9a, - 0x8d, 0xed, 0x75, 0x12, 0xb4, 0x61, 0xa9, 0x50, 0x31, 0x76, 0x85, 0x5a, 0xad, 0x1d, 0xa4, 0x8a, - 0xed, 0x6c, 0xc6, 0xf6, 0x62, 0xa0, 0x2a, 0x53, 0x2d, 0x4d, 0x5b, 0x9a, 0x5a, 0x69, 0x66, 0x32, - 0xd3, 0x92, 0x25, 0x8a, 0x3b, 0x45, 0x15, 0x07, 0x2e, 0x54, 0x71, 0xe1, 0xce, 0x91, 0x03, 0x87, - 0x1c, 0x39, 0xe6, 0xc0, 0x81, 0x03, 0x67, 0x03, 0x0b, 0x27, 0x2a, 0x47, 0x8a, 0xe2, 0x48, 0xf5, - 0xeb, 0x9e, 0x3f, 0xad, 0xb4, 0x1a, 0x07, 0xdf, 0xb8, 0x48, 0xd3, 0x3d, 0xef, 0xbd, 0xee, 0x7e, - 0xfd, 0xde, 0xfb, 0xde, 0x7b, 0x03, 0xaf, 0xd3, 0x76, 0xc7, 0xde, 0xe3, 0x13, 0x8f, 0x05, 0xf2, - 0xb7, 0xee, 0xf9, 0x2e, 0x77, 0xc9, 0x6b, 0x9c, 0x39, 0x16, 0xf3, 0x07, 0xb6, 0xc3, 0xeb, 0x82, - 0xa4, 0x8e, 0x2f, 0x6b, 0xd7, 0x79, 0xcf, 0xf6, 0x2d, 0xd3, 0xa3, 0x3e, 0x9f, 0xec, 0x21, 0xe5, - 0x5e, 0xd7, 0xed, 0xba, 0xf1, 0x93, 0x64, 0xaf, 0xd5, 0x3a, 0xfe, 0xc4, 0xe3, 0xee, 0xde, 0x80, - 0xf9, 0x27, 0x7d, 0xa6, 0xfe, 0xd4, 0xbb, 0x8b, 0x7d, 0xbb, 0x1d, 0xec, 0x9d, 0x8c, 0x92, 0xeb, - 0xd5, 0xb6, 0xbb, 0xae, 0xdb, 0xed, 0x33, 0x29, 0xb3, 0x3d, 0x7c, 0xb6, 0xc7, 0xed, 0x01, 0x0b, - 0x38, 0x1d, 0x78, 0x8a, 0x60, 0x6b, 0x9a, 0xc0, 0x1a, 0xfa, 0x94, 0xdb, 0xae, 0x23, 0xdf, 0xeb, - 0xff, 0x5e, 0x81, 0x82, 0xc1, 0x3e, 0x1f, 0xb2, 0x80, 0x93, 0x0f, 0x20, 0xcf, 0x3a, 0x3d, 0xb7, - 0x9a, 0xbb, 0xaa, 0xed, 0x96, 0xf7, 0xf5, 0xfa, 0xcc, 0xb3, 0xd4, 0x15, 0xf5, 0xbd, 0x4e, 0xcf, - 0x6d, 0x2e, 0x19, 0xc8, 0x41, 0x6e, 0xc3, 0xca, 0xb3, 0xfe, 0x30, 0xe8, 0x55, 0x97, 0x91, 0x75, - 0xe7, 0x7c, 0xd6, 0x8f, 0x04, 0x69, 0x73, 0xc9, 0x90, 0x3c, 0x62, 0x59, 0xdb, 0x79, 0xe6, 0x56, - 0xf3, 0x59, 0x96, 0x6d, 0x39, 0xcf, 0x70, 0x59, 0xc1, 0x41, 0x9a, 0x00, 0x01, 0xe3, 0xa6, 0xeb, - 0x89, 0x03, 0x55, 0x57, 0x90, 0xff, 0xc6, 0xf9, 0xfc, 0x8f, 0x18, 0xff, 0x04, 0xc9, 0x9b, 0x4b, - 0x46, 0x29, 0x08, 0x07, 0x42, 0x92, 0xed, 0xd8, 0xdc, 0xec, 0xf4, 0xa8, 0xed, 0x54, 0x57, 0xb3, - 0x48, 0x6a, 0x39, 0x36, 0x3f, 0x14, 0xe4, 0x42, 0x92, 0x1d, 0x0e, 0x84, 0x2a, 0x3e, 0x1f, 0x32, - 0x7f, 0x52, 0x2d, 0x64, 0x51, 0xc5, 0xa7, 0x82, 0x54, 0xa8, 0x02, 0x79, 0xc8, 0xc7, 0x50, 0x6e, - 0xb3, 0xae, 0xed, 0x98, 0xed, 0xbe, 0xdb, 0x39, 0xa9, 0x16, 0x51, 0xc4, 0xee, 0xf9, 0x22, 0x1a, - 0x82, 0xa1, 0x21, 0xe8, 0x9b, 0x4b, 0x06, 0xb4, 0xa3, 0x11, 0x69, 0x40, 0xb1, 0xd3, 0x63, 0x9d, - 0x13, 0x93, 0x8f, 0xab, 0x25, 0x94, 0x74, 0xed, 0x7c, 0x49, 0x87, 0x82, 0xfa, 0xf1, 0xb8, 0xb9, - 0x64, 0x14, 0x3a, 0xf2, 0x51, 0xe8, 0xc5, 0x62, 0x7d, 0x7b, 0xc4, 0x7c, 0x21, 0xe5, 0x62, 0x16, - 0xbd, 0xdc, 0x95, 0xf4, 0x28, 0xa7, 0x64, 0x85, 0x03, 0x72, 0x0f, 0x4a, 0xcc, 0xb1, 0xd4, 0xc1, - 0xca, 0x28, 0xe8, 0xfa, 0x02, 0x0b, 0x73, 0xac, 0xf0, 0x58, 0x45, 0xa6, 0x9e, 0xc9, 0x87, 0xb0, - 0xda, 0x71, 0x07, 0x03, 0x9b, 0x57, 0xd7, 0x50, 0xc6, 0x5b, 0x0b, 0x8e, 0x84, 0xb4, 0xcd, 0x25, - 0x43, 0x71, 0x35, 0x0a, 0xb0, 0x32, 0xa2, 0xfd, 0x21, 0xd3, 0x6f, 0x40, 0x39, 0x61, 0xc9, 0xa4, - 0x0a, 0x85, 0x01, 0x0b, 0x02, 0xda, 0x65, 0x55, 0xed, 0xaa, 0xb6, 0x5b, 0x32, 0xc2, 0xa1, 0xbe, - 0x01, 0x6b, 0x49, 0xbb, 0xd5, 0x07, 0x11, 0xa3, 0xb0, 0x45, 0xc1, 0x38, 0x62, 0x7e, 0x20, 0x0c, - 0x50, 0x31, 0xaa, 0x21, 0xd9, 0x81, 0x75, 0x3c, 0xad, 0x19, 0xbe, 0x17, 0x7e, 0x95, 0x37, 0xd6, - 0x70, 0xf2, 0x58, 0x11, 0x6d, 0x43, 0xd9, 0xdb, 0xf7, 0x22, 0x92, 0x65, 0x24, 0x01, 0x6f, 0xdf, - 0x53, 0x04, 0xfa, 0x77, 0xa1, 0x32, 0x6d, 0xba, 0xa4, 0x02, 0xcb, 0x27, 0x6c, 0xa2, 0xd6, 0x13, - 0x8f, 0xe4, 0x92, 0x3a, 0x16, 0xae, 0x51, 0x32, 0xd4, 0x19, 0x7f, 0x97, 0x8b, 0x98, 0x23, 0x6b, - 0x15, 0xee, 0x26, 0x82, 0x04, 0x72, 0x97, 0xf7, 0x6b, 0x75, 0x19, 0x20, 0xea, 0x61, 0x80, 0xa8, - 0x3f, 0x0e, 0x23, 0x48, 0xa3, 0xf8, 0xe5, 0x8b, 0xed, 0xa5, 0x5f, 0xfe, 0x65, 0x5b, 0x33, 0x90, - 0x83, 0x5c, 0x16, 0x06, 0x45, 0x6d, 0xc7, 0xb4, 0x2d, 0xb5, 0x4e, 0x01, 0xc7, 0x2d, 0x8b, 0x7c, - 0x0a, 0x95, 0x8e, 0xeb, 0x04, 0xcc, 0x09, 0x86, 0x81, 0x08, 0x73, 0x74, 0x10, 0xa8, 0x58, 0x30, - 0xef, 0x92, 0x0f, 0x43, 0xf2, 0x23, 0xa4, 0x36, 0x36, 0x3b, 0xe9, 0x09, 0x72, 0x1f, 0x60, 0x44, - 0xfb, 0xb6, 0x45, 0xb9, 0xeb, 0x07, 0xd5, 0xfc, 0xd5, 0xe5, 0x73, 0x84, 0x1d, 0x87, 0x84, 0x4f, - 0x3c, 0x8b, 0x72, 0xd6, 0xc8, 0x8b, 0x9d, 0x1b, 0x09, 0x7e, 0x72, 0x1d, 0x36, 0xa9, 0xe7, 0x99, - 0x01, 0xa7, 0x9c, 0x99, 0xed, 0x09, 0x67, 0x01, 0xc6, 0x8b, 0x35, 0x63, 0x9d, 0x7a, 0xde, 0x23, - 0x31, 0xdb, 0x10, 0x93, 0xba, 0x15, 0xdd, 0x36, 0xba, 0x26, 0x21, 0x90, 0xb7, 0x28, 0xa7, 0xa8, - 0xad, 0x35, 0x03, 0x9f, 0xc5, 0x9c, 0x47, 0x79, 0x4f, 0xe9, 0x00, 0x9f, 0xc9, 0xeb, 0xb0, 0xda, - 0x63, 0x76, 0xb7, 0xc7, 0xf1, 0xd8, 0xcb, 0x86, 0x1a, 0x89, 0x8b, 0xf1, 0x7c, 0x77, 0xc4, 0x30, - 0xba, 0x15, 0x0d, 0x39, 0xd0, 0x7f, 0x95, 0x83, 0x0b, 0x67, 0xdc, 0x57, 0xc8, 0xed, 0xd1, 0xa0, - 0x17, 0xae, 0x25, 0x9e, 0xc9, 0x6d, 0x21, 0x97, 0x5a, 0xcc, 0x57, 0x51, 0xf9, 0xcd, 0x39, 0x1a, - 0x68, 0x22, 0x91, 0x3a, 0xb8, 0x62, 0x21, 0x4f, 0xa0, 0xd2, 0xa7, 0x01, 0x37, 0xa5, 0xed, 0x9b, - 0x18, 0x65, 0x97, 0xcf, 0x8d, 0x04, 0xf7, 0x69, 0xe8, 0x33, 0xc2, 0xb8, 0x95, 0xb8, 0x8d, 0x7e, - 0x6a, 0x96, 0x3c, 0x85, 0x4b, 0xed, 0xc9, 0x4f, 0xa8, 0xc3, 0x6d, 0x87, 0x99, 0x67, 0xee, 0x68, - 0x7b, 0x8e, 0xe8, 0x7b, 0x23, 0xdb, 0x62, 0x4e, 0x27, 0xbc, 0x9c, 0x8b, 0x91, 0x88, 0xe8, 0xf2, - 0x02, 0xfd, 0x29, 0x6c, 0xa4, 0x63, 0x11, 0xd9, 0x80, 0x1c, 0x1f, 0x2b, 0x8d, 0xe4, 0xf8, 0x98, - 0x7c, 0x07, 0xf2, 0x42, 0x1c, 0x6a, 0x63, 0x63, 0x2e, 0x58, 0x28, 0xee, 0xc7, 0x13, 0x8f, 0x19, - 0x48, 0xaf, 0xeb, 0x91, 0x27, 0x44, 0xf1, 0x69, 0x5a, 0xb6, 0x7e, 0x13, 0x36, 0xa7, 0x42, 0x4f, - 0xe2, 0x5a, 0xb5, 0xe4, 0xb5, 0xea, 0x9b, 0xb0, 0x9e, 0x8a, 0x30, 0xfa, 0x1f, 0x57, 0xa1, 0x68, - 0xb0, 0xc0, 0x13, 0x46, 0x4c, 0x9a, 0x50, 0x62, 0xe3, 0x0e, 0x93, 0xb0, 0xa4, 0x2d, 0x08, 0xe2, - 0x92, 0xe7, 0x5e, 0x48, 0x2f, 0xa2, 0x66, 0xc4, 0x4c, 0x6e, 0xa5, 0x20, 0x79, 0x67, 0x91, 0x90, - 0x24, 0x26, 0xdf, 0x49, 0x63, 0xf2, 0x5b, 0x0b, 0x78, 0xa7, 0x40, 0xf9, 0x56, 0x0a, 0x94, 0x17, - 0x2d, 0x9c, 0x42, 0xe5, 0xd6, 0x0c, 0x54, 0x5e, 0x74, 0xfc, 0x39, 0xb0, 0xdc, 0x9a, 0x01, 0xcb, - 0xbb, 0x0b, 0xf7, 0x32, 0x13, 0x97, 0xef, 0xa4, 0x71, 0x79, 0x91, 0x3a, 0xa6, 0x80, 0xf9, 0xfe, - 0x2c, 0x60, 0xbe, 0xb9, 0x40, 0xc6, 0x5c, 0x64, 0x3e, 0x3c, 0x83, 0xcc, 0xd7, 0x17, 0x88, 0x9a, - 0x01, 0xcd, 0xad, 0x14, 0x34, 0x43, 0x26, 0xdd, 0xcc, 0xc1, 0xe6, 0x8f, 0xce, 0x62, 0xf3, 0x8d, - 0x45, 0xa6, 0x36, 0x0b, 0x9c, 0xbf, 0x37, 0x05, 0xce, 0xd7, 0x16, 0x9d, 0x6a, 0x2e, 0x3a, 0xdf, - 0x14, 0xf1, 0x71, 0xca, 0x33, 0x44, 0x2c, 0x65, 0xbe, 0xef, 0xfa, 0x0a, 0xf8, 0xe4, 0x40, 0xdf, - 0x15, 0x11, 0x3b, 0xb6, 0xff, 0x73, 0x90, 0x1c, 0x9d, 0x36, 0x61, 0xed, 0xfa, 0x17, 0x5a, 0xcc, - 0x8b, 0x91, 0x2d, 0x19, 0xed, 0x4b, 0x2a, 0xda, 0x27, 0x00, 0x3e, 0x97, 0x06, 0xf8, 0x6d, 0x28, - 0x0b, 0x4c, 0x99, 0xc2, 0x6e, 0xea, 0x85, 0xd8, 0x4d, 0xde, 0x86, 0x0b, 0x18, 0x7f, 0x65, 0x1a, - 0xa0, 0x02, 0x49, 0x1e, 0x03, 0xc9, 0xa6, 0x78, 0x21, 0x35, 0x28, 0x81, 0xe2, 0x9b, 0x70, 0x31, - 0x41, 0x2b, 0xe4, 0x22, 0x16, 0x48, 0x90, 0xaa, 0x44, 0xd4, 0x07, 0x9e, 0xd7, 0xa4, 0x41, 0x4f, - 0x7f, 0x10, 0x2b, 0x28, 0xce, 0x0b, 0x08, 0xe4, 0x3b, 0xae, 0x25, 0xcf, 0xbd, 0x6e, 0xe0, 0xb3, - 0xc8, 0x15, 0xfa, 0x6e, 0x17, 0x37, 0x57, 0x32, 0xc4, 0xa3, 0xa0, 0x8a, 0x5c, 0xbb, 0x24, 0x7d, - 0x56, 0xff, 0xbd, 0x16, 0xcb, 0x8b, 0x53, 0x85, 0x59, 0xa8, 0xae, 0xbd, 0x4a, 0x54, 0xcf, 0xfd, - 0x6f, 0xa8, 0xae, 0xff, 0x4b, 0x8b, 0xaf, 0x34, 0xc2, 0xeb, 0xaf, 0xa7, 0x02, 0x61, 0x5d, 0xb6, - 0x63, 0xb1, 0x31, 0xaa, 0x7c, 0xd9, 0x90, 0x83, 0x30, 0xd5, 0x5a, 0xc5, 0x6b, 0x48, 0xa7, 0x5a, - 0x05, 0x9c, 0x93, 0x03, 0xf2, 0x3e, 0xe2, 0xbc, 0xfb, 0x4c, 0x85, 0x86, 0x14, 0x08, 0xca, 0xa2, - 0xae, 0xae, 0xaa, 0xb9, 0x23, 0x41, 0x66, 0x48, 0xea, 0x04, 0xbe, 0x94, 0x52, 0x69, 0xc3, 0x15, - 0x28, 0x89, 0xad, 0x07, 0x1e, 0xed, 0x30, 0xf4, 0xed, 0x92, 0x11, 0x4f, 0xe8, 0x16, 0x90, 0xb3, - 0x31, 0x86, 0x3c, 0x84, 0x55, 0x36, 0x62, 0x0e, 0x17, 0x77, 0x24, 0xd4, 0x7a, 0x65, 0x2e, 0x10, - 0x33, 0x87, 0x37, 0xaa, 0x42, 0x99, 0xff, 0x7c, 0xb1, 0x5d, 0x91, 0x3c, 0xef, 0xba, 0x03, 0x9b, - 0xb3, 0x81, 0xc7, 0x27, 0x86, 0x92, 0xa2, 0xff, 0x2c, 0x27, 0xf0, 0x30, 0x15, 0x7f, 0x66, 0xaa, - 0x37, 0x74, 0x9a, 0x5c, 0x22, 0x45, 0xca, 0xa6, 0xf2, 0x37, 0x01, 0xba, 0x34, 0x30, 0x9f, 0x53, - 0x87, 0x33, 0x4b, 0xe9, 0xbd, 0xd4, 0xa5, 0xc1, 0x0f, 0x70, 0x42, 0xe4, 0x9b, 0xe2, 0xf5, 0x30, - 0x60, 0x16, 0x5e, 0xc0, 0xb2, 0x51, 0xe8, 0xd2, 0xe0, 0x49, 0xc0, 0xac, 0xc4, 0x59, 0x0b, 0xaf, - 0xe2, 0xac, 0x69, 0x7d, 0x17, 0xa7, 0xf5, 0xfd, 0xf3, 0x5c, 0xec, 0x1d, 0x71, 0xfa, 0xf0, 0xff, - 0xa9, 0x8b, 0xdf, 0x60, 0x4d, 0x91, 0x06, 0x01, 0xf2, 0x43, 0xb8, 0x10, 0x79, 0xa5, 0x39, 0x44, - 0x6f, 0x0d, 0xad, 0xf0, 0xe5, 0x9c, 0xbb, 0x32, 0x4a, 0x4f, 0x07, 0xe4, 0x33, 0x78, 0x63, 0x2a, - 0x06, 0x45, 0x0b, 0xe4, 0x5e, 0x2a, 0x14, 0xbd, 0x96, 0x0e, 0x45, 0xa1, 0xfc, 0x58, 0x7b, 0xcb, - 0xaf, 0xc4, 0x6b, 0x5a, 0x22, 0x85, 0x4d, 0xc2, 0xdb, 0x4c, 0x9b, 0xd8, 0x81, 0x75, 0x9f, 0x71, - 0x51, 0x4b, 0xa5, 0xaa, 0x86, 0x35, 0x39, 0x29, 0x21, 0x41, 0xff, 0xb3, 0x06, 0x9b, 0x53, 0xa7, - 0x20, 0x1f, 0xc0, 0x8a, 0x84, 0x69, 0xed, 0xdc, 0x6e, 0x09, 0x5e, 0x8b, 0x3a, 0xb8, 0x64, 0x20, - 0x07, 0x50, 0x64, 0x2a, 0x05, 0x57, 0x9a, 0xbb, 0xb6, 0x20, 0x53, 0x57, 0xfc, 0x11, 0x1b, 0xb9, - 0x0b, 0xa5, 0xe8, 0x7e, 0x16, 0x94, 0x77, 0xd1, 0xf5, 0x2a, 0x21, 0x31, 0xa3, 0x7e, 0x08, 0xe5, - 0xc4, 0xf6, 0xc8, 0x37, 0xa0, 0x34, 0xa0, 0x63, 0x55, 0x93, 0xc9, 0x2c, 0xbb, 0x38, 0xa0, 0x63, - 0x2c, 0xc7, 0xc8, 0x1b, 0x50, 0x10, 0x2f, 0xbb, 0x54, 0xde, 0xf6, 0xb2, 0xb1, 0x3a, 0xa0, 0xe3, - 0xef, 0xd3, 0x40, 0xff, 0x85, 0x06, 0x1b, 0xe9, 0x7d, 0x92, 0x77, 0x80, 0x08, 0x5a, 0xda, 0x65, - 0xa6, 0x33, 0x1c, 0x48, 0x20, 0x0d, 0x25, 0x6e, 0x0e, 0xe8, 0xf8, 0xa0, 0xcb, 0x1e, 0x0e, 0x07, - 0xb8, 0x74, 0x40, 0x1e, 0x40, 0x25, 0x24, 0x0e, 0x3b, 0x62, 0x4a, 0x2b, 0x97, 0xcf, 0x54, 0xc4, - 0x77, 0x15, 0x81, 0x2c, 0x88, 0x7f, 0x2d, 0x0a, 0xe2, 0x0d, 0x29, 0x2f, 0x7c, 0xa3, 0xbf, 0x0f, - 0x9b, 0x53, 0x27, 0x26, 0x3a, 0xac, 0x7b, 0xc3, 0xb6, 0x79, 0xc2, 0x26, 0x26, 0xaa, 0x04, 0xfd, - 0xa1, 0x64, 0x94, 0xbd, 0x61, 0xfb, 0x63, 0x36, 0x11, 0xa5, 0x49, 0xa0, 0x77, 0x60, 0x23, 0x5d, - 0x71, 0x09, 0x74, 0xf1, 0xdd, 0xa1, 0x63, 0xe1, 0xbe, 0x57, 0x0c, 0x39, 0x20, 0xb7, 0x61, 0x65, - 0xe4, 0x4a, 0x93, 0x3f, 0xaf, 0xc4, 0x3a, 0x76, 0x39, 0x4b, 0xd4, 0x6d, 0x92, 0x47, 0x0f, 0x60, - 0x05, 0x8d, 0x57, 0x18, 0x22, 0xd6, 0x4e, 0x2a, 0xbb, 0x11, 0xcf, 0xe4, 0x18, 0x80, 0x72, 0xee, - 0xdb, 0xed, 0x61, 0x2c, 0xbe, 0x9a, 0x14, 0xdf, 0xb7, 0xdb, 0x41, 0xfd, 0x64, 0x54, 0x3f, 0xa2, - 0xb6, 0xdf, 0xb8, 0xa2, 0xcc, 0xff, 0x52, 0xcc, 0x93, 0x70, 0x81, 0x84, 0x24, 0xfd, 0xab, 0x3c, - 0xac, 0xca, 0x9a, 0x94, 0x7c, 0x98, 0xee, 0x90, 0x94, 0xf7, 0xb7, 0xe6, 0x6d, 0x5f, 0x52, 0xa9, - 0xdd, 0x47, 0x69, 0xd6, 0xf5, 0xe9, 0xb6, 0x43, 0xa3, 0x7c, 0xfa, 0x62, 0xbb, 0x80, 0x29, 0x4a, - 0xeb, 0x6e, 0xdc, 0x83, 0x98, 0x57, 0x82, 0x87, 0x0d, 0x8f, 0xfc, 0x4b, 0x37, 0x3c, 0x9a, 0xb0, - 0x9e, 0xc8, 0xc9, 0x6c, 0x4b, 0x15, 0x33, 0x5b, 0xe7, 0x39, 0x5d, 0xeb, 0xae, 0xda, 0x7f, 0x39, - 0xca, 0xd9, 0x5a, 0x16, 0xd9, 0x4d, 0x57, 0xe2, 0x98, 0xda, 0xc9, 0x9c, 0x22, 0x51, 0x5c, 0x8b, - 0xc4, 0x4e, 0xb8, 0x83, 0x88, 0x10, 0x92, 0x44, 0xa6, 0x18, 0x45, 0x31, 0x81, 0x2f, 0x6f, 0xc0, - 0x66, 0x9c, 0xfd, 0x48, 0x92, 0xa2, 0x94, 0x12, 0x4f, 0x23, 0xe1, 0x7b, 0x70, 0xc9, 0x61, 0x63, - 0x6e, 0x4e, 0x53, 0x97, 0x90, 0x9a, 0x88, 0x77, 0xc7, 0x69, 0x8e, 0x6b, 0xb0, 0x11, 0xc7, 0x59, - 0xa4, 0x05, 0xd9, 0x1f, 0x89, 0x66, 0x91, 0xec, 0x32, 0x14, 0xa3, 0xdc, 0xb4, 0x8c, 0x04, 0x05, - 0x2a, 0x53, 0xd2, 0x28, 0xdb, 0xf5, 0x59, 0x30, 0xec, 0x73, 0x25, 0x64, 0x0d, 0x69, 0x30, 0xdb, - 0x35, 0xe4, 0x3c, 0xd2, 0xee, 0xc0, 0x7a, 0x18, 0x55, 0x24, 0xdd, 0x3a, 0xd2, 0xad, 0x85, 0x93, - 0x48, 0x74, 0x13, 0x2a, 0x9e, 0xef, 0x7a, 0x6e, 0xc0, 0x7c, 0x93, 0x5a, 0x96, 0xcf, 0x82, 0xa0, - 0xba, 0x21, 0xe5, 0x85, 0xf3, 0x07, 0x72, 0x5a, 0xff, 0x16, 0x14, 0xc2, 0xa4, 0xfb, 0x12, 0xac, - 0x34, 0xa2, 0x08, 0x99, 0x37, 0xe4, 0x40, 0x80, 0xf0, 0x81, 0xe7, 0xa9, 0x16, 0x9c, 0x78, 0xd4, - 0xfb, 0x50, 0x50, 0x17, 0x36, 0xb3, 0xf1, 0xf2, 0x00, 0xd6, 0x3c, 0xea, 0x8b, 0x63, 0x24, 0xdb, - 0x2f, 0xf3, 0xca, 0xc6, 0x23, 0xea, 0xf3, 0x47, 0x8c, 0xa7, 0xba, 0x30, 0x65, 0xe4, 0x97, 0x53, - 0xfa, 0x2d, 0x58, 0x4f, 0xd1, 0x88, 0x6d, 0x72, 0x97, 0xd3, 0x7e, 0xe8, 0xe8, 0x38, 0x88, 0x76, - 0x92, 0x8b, 0x77, 0xa2, 0xdf, 0x86, 0x52, 0x74, 0x57, 0xa2, 0x1a, 0x09, 0x55, 0xa1, 0x29, 0xf5, - 0xcb, 0x21, 0x76, 0x9a, 0xdc, 0xe7, 0xcc, 0x57, 0xd6, 0x2f, 0x07, 0x3a, 0x4b, 0x04, 0x26, 0x09, - 0x79, 0xe4, 0x0e, 0x14, 0x54, 0x60, 0x52, 0xfe, 0x38, 0xaf, 0xa7, 0x74, 0x84, 0x91, 0x2a, 0xec, - 0x29, 0xc9, 0xb8, 0x15, 0x2f, 0x93, 0x4b, 0x2e, 0xf3, 0x53, 0x28, 0x86, 0xc1, 0x27, 0x8d, 0x12, - 0x72, 0x85, 0xab, 0x8b, 0x50, 0x42, 0x2d, 0x12, 0x33, 0x0a, 0x6b, 0x0a, 0xec, 0xae, 0xc3, 0x2c, - 0x33, 0x76, 0x41, 0x5c, 0xb3, 0x68, 0x6c, 0xca, 0x17, 0xf7, 0x43, 0xff, 0xd2, 0xdf, 0x83, 0x55, - 0xb9, 0xd7, 0x99, 0x21, 0x6e, 0x06, 0xfe, 0xea, 0xff, 0xd0, 0xa0, 0x18, 0xc2, 0xc7, 0x4c, 0xa6, - 0xd4, 0x21, 0x72, 0x5f, 0xf7, 0x10, 0xaf, 0x3e, 0x24, 0xbd, 0x0b, 0x04, 0x2d, 0xc5, 0x1c, 0xb9, - 0xdc, 0x76, 0xba, 0xa6, 0xbc, 0x0b, 0x99, 0x2e, 0x56, 0xf0, 0xcd, 0x31, 0xbe, 0x38, 0x12, 0xf3, - 0x6f, 0xef, 0x40, 0x39, 0xd1, 0x0a, 0x23, 0x05, 0x58, 0x7e, 0xc8, 0x9e, 0x57, 0x96, 0x48, 0x19, - 0x0a, 0x06, 0xc3, 0x46, 0x42, 0x45, 0xdb, 0xff, 0xaa, 0x00, 0x9b, 0x07, 0x8d, 0xc3, 0xd6, 0x81, - 0xe7, 0xf5, 0xed, 0x0e, 0xe2, 0x19, 0xf9, 0x04, 0xf2, 0x58, 0x4c, 0x67, 0xf8, 0x08, 0x54, 0xcb, - 0xd2, 0x95, 0x22, 0x06, 0xac, 0x60, 0xcd, 0x4d, 0xb2, 0x7c, 0x1b, 0xaa, 0x65, 0x6a, 0x56, 0x89, - 0x4d, 0xa2, 0xc1, 0x65, 0xf8, 0x64, 0x54, 0xcb, 0xd2, 0xc1, 0x22, 0x9f, 0x41, 0x29, 0x2e, 0xa6, - 0xb3, 0x7e, 0x48, 0xaa, 0x65, 0xee, 0x6d, 0x09, 0xf9, 0x71, 0xf9, 0x90, 0xf5, 0x33, 0x4a, 0x2d, - 0x73, 0x53, 0x87, 0x3c, 0x85, 0x42, 0x58, 0xa8, 0x65, 0xfb, 0xd4, 0x53, 0xcb, 0xd8, 0x77, 0x12, - 0xd7, 0x27, 0xeb, 0xeb, 0x2c, 0xdf, 0xb3, 0x6a, 0x99, 0x9a, 0x6b, 0xe4, 0x09, 0xac, 0xaa, 0x0c, - 0x39, 0xd3, 0x47, 0x9c, 0x5a, 0xb6, 0x6e, 0x92, 0x50, 0x72, 0xdc, 0xc1, 0xc8, 0xfa, 0x0d, 0xaf, - 0x96, 0xb9, 0xab, 0x48, 0x28, 0x40, 0xa2, 0xe8, 0xce, 0xfc, 0x71, 0xae, 0x96, 0xbd, 0x5b, 0x48, - 0x7e, 0x0c, 0xc5, 0xa8, 0xb4, 0xca, 0xf8, 0x91, 0xac, 0x96, 0xb5, 0x61, 0xd7, 0x68, 0xfd, 0xe7, - 0x6f, 0x5b, 0xda, 0x6f, 0x4f, 0xb7, 0xb4, 0x2f, 0x4e, 0xb7, 0xb4, 0x2f, 0x4f, 0xb7, 0xb4, 0x3f, - 0x9d, 0x6e, 0x69, 0x7f, 0x3d, 0xdd, 0xd2, 0xfe, 0xf0, 0xf7, 0x2d, 0xed, 0x47, 0xef, 0x74, 0x6d, - 0xde, 0x1b, 0xb6, 0xeb, 0x1d, 0x77, 0xb0, 0x17, 0x0b, 0x4c, 0x3e, 0xc6, 0x5f, 0xbe, 0xdb, 0xab, - 0x18, 0xb0, 0xbe, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x66, 0x8a, 0xe9, 0x0e, 0x1f, - 0x00, 0x00, + // 2397 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0x3d, 0x8c, 0x1b, 0xc7, + 0xf5, 0xbf, 0x25, 0x79, 0xfc, 0x78, 0xbc, 0x3b, 0xd2, 0x63, 0xd9, 0xa6, 0xf8, 0x97, 0xef, 0x84, + 0x3d, 0x4b, 0x3a, 0xd9, 0xfe, 0xdf, 0x39, 0x17, 0x38, 0xb0, 0x22, 0xc1, 0xc1, 0xf1, 0x24, 0x87, + 0x84, 0x25, 0x59, 0x5e, 0x7d, 0x44, 0x49, 0x00, 0x2f, 0x86, 0xdc, 0x11, 0xb9, 0x10, 0xb9, 0xbb, + 0xde, 0x1d, 0x9e, 0xc8, 0x20, 0x45, 0xba, 0x20, 0x40, 0x8a, 0x34, 0x01, 0xd2, 0xa4, 0x4f, 0x99, + 0x22, 0x85, 0xcb, 0x94, 0x2e, 0x52, 0xa4, 0x48, 0xad, 0x24, 0x97, 0x54, 0x81, 0xcb, 0x20, 0x48, + 0x19, 0xcc, 0x9b, 0xd9, 0x2f, 0x1e, 0x3f, 0x56, 0x8e, 0xba, 0x34, 0xe4, 0xce, 0xcc, 0x7b, 0x6f, + 0x66, 0xde, 0xcc, 0x7b, 0xbf, 0xf7, 0xde, 0xc0, 0xeb, 0xb4, 0xdb, 0xb3, 0x0f, 0xf8, 0xd4, 0x63, + 0x81, 0xfc, 0xdd, 0xf7, 0x7c, 0x97, 0xbb, 0xe4, 0x35, 0xce, 0x1c, 0x8b, 0xf9, 0x23, 0xdb, 0xe1, + 0xfb, 0x82, 0x64, 0x1f, 0x07, 0x9b, 0x97, 0xf9, 0xc0, 0xf6, 0x2d, 0xd3, 0xa3, 0x3e, 0x9f, 0x1e, + 0x20, 0xe5, 0x41, 0xdf, 0xed, 0xbb, 0xf1, 0x97, 0x64, 0x6f, 0x36, 0x7b, 0xfe, 0xd4, 0xe3, 0xee, + 0xc1, 0x88, 0xf9, 0x4f, 0x87, 0x4c, 0xfd, 0xa9, 0xb1, 0x9d, 0xbe, 0xeb, 0xf6, 0x87, 0x4c, 0xb2, + 0x77, 0xc7, 0x4f, 0x0e, 0xb8, 0x3d, 0x62, 0x01, 0xa7, 0x23, 0x4f, 0x11, 0x6c, 0xcf, 0x12, 0x58, + 0x63, 0x9f, 0x72, 0xdb, 0x75, 0xe4, 0xb8, 0xfe, 0xaf, 0x75, 0x28, 0x19, 0xec, 0xf3, 0x31, 0x0b, + 0x38, 0xf9, 0x00, 0x0a, 0xac, 0x37, 0x70, 0x1b, 0xb9, 0x8b, 0xda, 0x5e, 0xf5, 0x50, 0xdf, 0x9f, + 0xbb, 0xec, 0x7d, 0x45, 0x7d, 0xab, 0x37, 0x70, 0xdb, 0x6b, 0x06, 0x72, 0x90, 0xeb, 0xb0, 0xfe, + 0x64, 0x38, 0x0e, 0x06, 0x8d, 0x3c, 0xb2, 0xee, 0x2e, 0x67, 0xfd, 0x48, 0x90, 0xb6, 0xd7, 0x0c, + 0xc9, 0x23, 0xa6, 0xb5, 0x9d, 0x27, 0x6e, 0xa3, 0x90, 0x65, 0xda, 0x8e, 0xf3, 0x04, 0xa7, 0x15, + 0x1c, 0xa4, 0x0d, 0x10, 0x30, 0x6e, 0xba, 0x9e, 0xd8, 0x50, 0x63, 0x1d, 0xf9, 0xaf, 0x2c, 0xe7, + 0xbf, 0xcf, 0xf8, 0x27, 0x48, 0xde, 0x5e, 0x33, 0x2a, 0x41, 0xd8, 0x10, 0x92, 0x6c, 0xc7, 0xe6, + 0x66, 0x6f, 0x40, 0x6d, 0xa7, 0x51, 0xcc, 0x22, 0xa9, 0xe3, 0xd8, 0xfc, 0x58, 0x90, 0x0b, 0x49, + 0x76, 0xd8, 0x10, 0xaa, 0xf8, 0x7c, 0xcc, 0xfc, 0x69, 0xa3, 0x94, 0x45, 0x15, 0x9f, 0x0a, 0x52, + 0xa1, 0x0a, 0xe4, 0x21, 0x1f, 0x43, 0xb5, 0xcb, 0xfa, 0xb6, 0x63, 0x76, 0x87, 0x6e, 0xef, 0x69, + 0xa3, 0x8c, 0x22, 0xf6, 0x96, 0x8b, 0x68, 0x09, 0x86, 0x96, 0xa0, 0x6f, 0xaf, 0x19, 0xd0, 0x8d, + 0x5a, 0xa4, 0x05, 0xe5, 0xde, 0x80, 0xf5, 0x9e, 0x9a, 0x7c, 0xd2, 0xa8, 0xa0, 0xa4, 0x4b, 0xcb, + 0x25, 0x1d, 0x0b, 0xea, 0x07, 0x93, 0xf6, 0x9a, 0x51, 0xea, 0xc9, 0x4f, 0xa1, 0x17, 0x8b, 0x0d, + 0xed, 0x13, 0xe6, 0x0b, 0x29, 0xaf, 0x66, 0xd1, 0xcb, 0x4d, 0x49, 0x8f, 0x72, 0x2a, 0x56, 0xd8, + 0x20, 0xb7, 0xa0, 0xc2, 0x1c, 0x4b, 0x6d, 0xac, 0x8a, 0x82, 0x2e, 0xaf, 0xb8, 0x61, 0x8e, 0x15, + 0x6e, 0xab, 0xcc, 0xd4, 0x37, 0xf9, 0x10, 0x8a, 0x3d, 0x77, 0x34, 0xb2, 0x79, 0x63, 0x03, 0x65, + 0xbc, 0xb5, 0x62, 0x4b, 0x48, 0xdb, 0x5e, 0x33, 0x14, 0x57, 0xab, 0x04, 0xeb, 0x27, 0x74, 0x38, + 0x66, 0xfa, 0x15, 0xa8, 0x26, 0x6e, 0x32, 0x69, 0x40, 0x69, 0xc4, 0x82, 0x80, 0xf6, 0x59, 0x43, + 0xbb, 0xa8, 0xed, 0x55, 0x8c, 0xb0, 0xa9, 0x6f, 0xc1, 0x46, 0xf2, 0xde, 0xea, 0xa3, 0x88, 0x51, + 0xdc, 0x45, 0xc1, 0x78, 0xc2, 0xfc, 0x40, 0x5c, 0x40, 0xc5, 0xa8, 0x9a, 0x64, 0x17, 0x36, 0x71, + 0xb7, 0x66, 0x38, 0x2e, 0xec, 0xaa, 0x60, 0x6c, 0x60, 0xe7, 0x23, 0x45, 0xb4, 0x03, 0x55, 0xef, + 0xd0, 0x8b, 0x48, 0xf2, 0x48, 0x02, 0xde, 0xa1, 0xa7, 0x08, 0xf4, 0x6f, 0x43, 0x7d, 0xf6, 0xea, + 0x92, 0x3a, 0xe4, 0x9f, 0xb2, 0xa9, 0x9a, 0x4f, 0x7c, 0x92, 0x73, 0x6a, 0x5b, 0x38, 0x47, 0xc5, + 0x50, 0x7b, 0xfc, 0x6d, 0x2e, 0x62, 0x8e, 0x6e, 0xab, 0x30, 0x37, 0xe1, 0x24, 0x90, 0xbb, 0x7a, + 0xd8, 0xdc, 0x97, 0x0e, 0x62, 0x3f, 0x74, 0x10, 0xfb, 0x0f, 0x42, 0x0f, 0xd2, 0x2a, 0x7f, 0xf9, + 0x7c, 0x67, 0xed, 0x17, 0x7f, 0xde, 0xd1, 0x0c, 0xe4, 0x20, 0xe7, 0xc5, 0x85, 0xa2, 0xb6, 0x63, + 0xda, 0x96, 0x9a, 0xa7, 0x84, 0xed, 0x8e, 0x45, 0x3e, 0x85, 0x7a, 0xcf, 0x75, 0x02, 0xe6, 0x04, + 0xe3, 0x40, 0x78, 0x34, 0x3a, 0x0a, 0x94, 0x2f, 0x58, 0x74, 0xc8, 0xc7, 0x21, 0xf9, 0x3d, 0xa4, + 0x36, 0x6a, 0xbd, 0x74, 0x07, 0xb9, 0x0d, 0x70, 0x42, 0x87, 0xb6, 0x45, 0xb9, 0xeb, 0x07, 0x8d, + 0xc2, 0xc5, 0xfc, 0x12, 0x61, 0x8f, 0x42, 0xc2, 0x87, 0x9e, 0x45, 0x39, 0x6b, 0x15, 0xc4, 0xca, + 0x8d, 0x04, 0x3f, 0xb9, 0x0c, 0x35, 0xea, 0x79, 0x66, 0xc0, 0x29, 0x67, 0x66, 0x77, 0xca, 0x59, + 0x80, 0xfe, 0x62, 0xc3, 0xd8, 0xa4, 0x9e, 0x77, 0x5f, 0xf4, 0xb6, 0x44, 0xa7, 0x6e, 0x45, 0xa7, + 0x8d, 0xa6, 0x49, 0x08, 0x14, 0x2c, 0xca, 0x29, 0x6a, 0x6b, 0xc3, 0xc0, 0x6f, 0xd1, 0xe7, 0x51, + 0x3e, 0x50, 0x3a, 0xc0, 0x6f, 0xf2, 0x3a, 0x14, 0x07, 0xcc, 0xee, 0x0f, 0x38, 0x6e, 0x3b, 0x6f, + 0xa8, 0x96, 0x38, 0x18, 0xcf, 0x77, 0x4f, 0x18, 0x7a, 0xb7, 0xb2, 0x21, 0x1b, 0xfa, 0x2f, 0x73, + 0xf0, 0xca, 0x19, 0xf3, 0x15, 0x72, 0x07, 0x34, 0x18, 0x84, 0x73, 0x89, 0x6f, 0x72, 0x5d, 0xc8, + 0xa5, 0x16, 0xf3, 0x95, 0x57, 0x7e, 0x73, 0x81, 0x06, 0xda, 0x48, 0xa4, 0x36, 0xae, 0x58, 0xc8, + 0x43, 0xa8, 0x0f, 0x69, 0xc0, 0x4d, 0x79, 0xf7, 0x4d, 0xf4, 0xb2, 0xf9, 0xa5, 0x9e, 0xe0, 0x36, + 0x0d, 0x6d, 0x46, 0x5c, 0x6e, 0x25, 0x6e, 0x6b, 0x98, 0xea, 0x25, 0x8f, 0xe1, 0x5c, 0x77, 0xfa, + 0x23, 0xea, 0x70, 0xdb, 0x61, 0xe6, 0x99, 0x33, 0xda, 0x59, 0x20, 0xfa, 0xd6, 0x89, 0x6d, 0x31, + 0xa7, 0x17, 0x1e, 0xce, 0xab, 0x91, 0x88, 0xe8, 0xf0, 0x02, 0xfd, 0x31, 0x6c, 0xa5, 0x7d, 0x11, + 0xd9, 0x82, 0x1c, 0x9f, 0x28, 0x8d, 0xe4, 0xf8, 0x84, 0x7c, 0x0b, 0x0a, 0x42, 0x1c, 0x6a, 0x63, + 0x6b, 0x21, 0x58, 0x28, 0xee, 0x07, 0x53, 0x8f, 0x19, 0x48, 0xaf, 0xeb, 0x91, 0x25, 0x44, 0xfe, + 0x69, 0x56, 0xb6, 0x7e, 0x15, 0x6a, 0x33, 0xae, 0x27, 0x71, 0xac, 0x5a, 0xf2, 0x58, 0xf5, 0x1a, + 0x6c, 0xa6, 0x3c, 0x8c, 0xfe, 0x87, 0x22, 0x94, 0x0d, 0x16, 0x78, 0xe2, 0x12, 0x93, 0x36, 0x54, + 0xd8, 0xa4, 0xc7, 0x24, 0x2c, 0x69, 0x2b, 0x9c, 0xb8, 0xe4, 0xb9, 0x15, 0xd2, 0x0b, 0xaf, 0x19, + 0x31, 0x93, 0x6b, 0x29, 0x48, 0xde, 0x5d, 0x25, 0x24, 0x89, 0xc9, 0x37, 0xd2, 0x98, 0xfc, 0xd6, + 0x0a, 0xde, 0x19, 0x50, 0xbe, 0x96, 0x02, 0xe5, 0x55, 0x13, 0xa7, 0x50, 0xb9, 0x33, 0x07, 0x95, + 0x57, 0x6d, 0x7f, 0x01, 0x2c, 0x77, 0xe6, 0xc0, 0xf2, 0xde, 0xca, 0xb5, 0xcc, 0xc5, 0xe5, 0x1b, + 0x69, 0x5c, 0x5e, 0xa5, 0x8e, 0x19, 0x60, 0xbe, 0x3d, 0x0f, 0x98, 0xaf, 0xae, 0x90, 0xb1, 0x10, + 0x99, 0x8f, 0xcf, 0x20, 0xf3, 0xe5, 0x15, 0xa2, 0xe6, 0x40, 0x73, 0x27, 0x05, 0xcd, 0x90, 0x49, + 0x37, 0x0b, 0xb0, 0xf9, 0xa3, 0xb3, 0xd8, 0x7c, 0x65, 0xd5, 0x55, 0x9b, 0x07, 0xce, 0xdf, 0x99, + 0x01, 0xe7, 0x4b, 0xab, 0x76, 0xb5, 0x10, 0x9d, 0xaf, 0x0a, 0xff, 0x38, 0x63, 0x19, 0xc2, 0x97, + 0x32, 0xdf, 0x77, 0x7d, 0x05, 0x7c, 0xb2, 0xa1, 0xef, 0x09, 0x8f, 0x1d, 0xdf, 0xff, 0x25, 0x48, + 0x8e, 0x46, 0x9b, 0xb8, 0xed, 0xfa, 0x17, 0x5a, 0xcc, 0x8b, 0x9e, 0x2d, 0xe9, 0xed, 0x2b, 0xca, + 0xdb, 0x27, 0x00, 0x3e, 0x97, 0x06, 0xf8, 0x1d, 0xa8, 0x0a, 0x4c, 0x99, 0xc1, 0x6e, 0xea, 0x85, + 0xd8, 0x4d, 0xde, 0x86, 0x57, 0xd0, 0xff, 0xca, 0x30, 0x40, 0x39, 0x92, 0x02, 0x3a, 0x92, 0x9a, + 0x18, 0x90, 0x1a, 0x94, 0x40, 0xf1, 0xff, 0xf0, 0x6a, 0x82, 0x56, 0xc8, 0x45, 0x2c, 0x90, 0x20, + 0x55, 0x8f, 0xa8, 0x8f, 0x3c, 0xaf, 0x4d, 0x83, 0x81, 0x7e, 0x27, 0x56, 0x50, 0x1c, 0x17, 0x10, + 0x28, 0xf4, 0x5c, 0x4b, 0xee, 0x7b, 0xd3, 0xc0, 0x6f, 0x11, 0x2b, 0x0c, 0xdd, 0x3e, 0x2e, 0xae, + 0x62, 0x88, 0x4f, 0x41, 0x15, 0x99, 0x76, 0x45, 0xda, 0xac, 0xfe, 0x3b, 0x2d, 0x96, 0x17, 0x87, + 0x0a, 0xf3, 0x50, 0x5d, 0x7b, 0x99, 0xa8, 0x9e, 0xfb, 0xef, 0x50, 0x5d, 0xff, 0xa7, 0x16, 0x1f, + 0x69, 0x84, 0xd7, 0x5f, 0x4f, 0x05, 0xe2, 0x76, 0xd9, 0x8e, 0xc5, 0x26, 0xa8, 0xf2, 0xbc, 0x21, + 0x1b, 0x61, 0xa8, 0x55, 0xc4, 0x63, 0x48, 0x87, 0x5a, 0x25, 0xec, 0x93, 0x0d, 0xf2, 0x3e, 0xe2, + 0xbc, 0xfb, 0x44, 0xb9, 0x86, 0x14, 0x08, 0xca, 0xfc, 0x6d, 0x5f, 0x25, 0x6e, 0xf7, 0x04, 0x99, + 0x21, 0xa9, 0x13, 0xf8, 0x52, 0x49, 0x85, 0x0d, 0x17, 0xa0, 0x22, 0x96, 0x1e, 0x78, 0xb4, 0xc7, + 0xd0, 0xb6, 0x2b, 0x46, 0xdc, 0xa1, 0x5b, 0x40, 0xce, 0xfa, 0x18, 0x72, 0x17, 0x8a, 0xec, 0x84, + 0x39, 0x5c, 0x9c, 0x91, 0x50, 0xeb, 0x85, 0x85, 0x40, 0xcc, 0x1c, 0xde, 0x6a, 0x08, 0x65, 0xfe, + 0xe3, 0xf9, 0x4e, 0x5d, 0xf2, 0xbc, 0xeb, 0x8e, 0x6c, 0xce, 0x46, 0x1e, 0x9f, 0x1a, 0x4a, 0x8a, + 0xfe, 0xd3, 0x9c, 0xc0, 0xc3, 0x94, 0xff, 0x99, 0xab, 0xde, 0xd0, 0x68, 0x72, 0x89, 0x10, 0x29, + 0x9b, 0xca, 0xdf, 0x04, 0xe8, 0xd3, 0xc0, 0x7c, 0x46, 0x1d, 0xce, 0x2c, 0xa5, 0xf7, 0x4a, 0x9f, + 0x06, 0xdf, 0xc3, 0x0e, 0x11, 0x6f, 0x8a, 0xe1, 0x71, 0xc0, 0x2c, 0x3c, 0x80, 0xbc, 0x51, 0xea, + 0xd3, 0xe0, 0x61, 0xc0, 0xac, 0xc4, 0x5e, 0x4b, 0x2f, 0x63, 0xaf, 0x69, 0x7d, 0x97, 0x67, 0xf5, + 0xfd, 0xb3, 0x5c, 0x6c, 0x1d, 0x71, 0xf8, 0xf0, 0xbf, 0xa9, 0x8b, 0x5f, 0x63, 0x4e, 0x91, 0x06, + 0x01, 0xf2, 0x7d, 0x78, 0x25, 0xb2, 0x4a, 0x73, 0x8c, 0xd6, 0x1a, 0xde, 0xc2, 0x17, 0x33, 0xee, + 0xfa, 0x49, 0xba, 0x3b, 0x20, 0x9f, 0xc1, 0x1b, 0x33, 0x3e, 0x28, 0x9a, 0x20, 0xf7, 0x42, 0xae, + 0xe8, 0xb5, 0xb4, 0x2b, 0x0a, 0xe5, 0xc7, 0xda, 0xcb, 0xbf, 0x14, 0xab, 0xe9, 0x88, 0x10, 0x36, + 0x09, 0x6f, 0x73, 0xef, 0xc4, 0x2e, 0x6c, 0xfa, 0x8c, 0x8b, 0x5c, 0x2a, 0x95, 0x35, 0x6c, 0xc8, + 0x4e, 0x09, 0x09, 0xfa, 0x9f, 0x34, 0xa8, 0xcd, 0xec, 0x82, 0x7c, 0x00, 0xeb, 0x12, 0xa6, 0xb5, + 0xa5, 0xd5, 0x12, 0x3c, 0x16, 0xb5, 0x71, 0xc9, 0x40, 0x8e, 0xa0, 0xcc, 0x54, 0x08, 0xae, 0x34, + 0x77, 0x69, 0x45, 0xa4, 0xae, 0xf8, 0x23, 0x36, 0x72, 0x13, 0x2a, 0xd1, 0xf9, 0xac, 0x48, 0xef, + 0xa2, 0xe3, 0x55, 0x42, 0x62, 0x46, 0xfd, 0x18, 0xaa, 0x89, 0xe5, 0x91, 0xff, 0x83, 0xca, 0x88, + 0x4e, 0x54, 0x4e, 0x26, 0xa3, 0xec, 0xf2, 0x88, 0x4e, 0x30, 0x1d, 0x23, 0x6f, 0x40, 0x49, 0x0c, + 0xf6, 0xa9, 0x3c, 0xed, 0xbc, 0x51, 0x1c, 0xd1, 0xc9, 0x77, 0x69, 0xa0, 0xff, 0x5c, 0x83, 0xad, + 0xf4, 0x3a, 0xc9, 0x3b, 0x40, 0x04, 0x2d, 0xed, 0x33, 0xd3, 0x19, 0x8f, 0x24, 0x90, 0x86, 0x12, + 0x6b, 0x23, 0x3a, 0x39, 0xea, 0xb3, 0xbb, 0xe3, 0x11, 0x4e, 0x1d, 0x90, 0x3b, 0x50, 0x0f, 0x89, + 0xc3, 0x8a, 0x98, 0xd2, 0xca, 0xf9, 0x33, 0x19, 0xf1, 0x4d, 0x45, 0x20, 0x13, 0xe2, 0x5f, 0x89, + 0x84, 0x78, 0x4b, 0xca, 0x0b, 0x47, 0xf4, 0xf7, 0xa1, 0x36, 0xb3, 0x63, 0xa2, 0xc3, 0xa6, 0x37, + 0xee, 0x9a, 0x4f, 0xd9, 0xd4, 0x44, 0x95, 0xa0, 0x3d, 0x54, 0x8c, 0xaa, 0x37, 0xee, 0x7e, 0xcc, + 0xa6, 0x22, 0x35, 0x09, 0xf4, 0x1e, 0x6c, 0xa5, 0x33, 0x2e, 0x81, 0x2e, 0xbe, 0x3b, 0x76, 0x2c, + 0x5c, 0xf7, 0xba, 0x21, 0x1b, 0xe4, 0x3a, 0xac, 0x9f, 0xb8, 0xf2, 0xca, 0x2f, 0x4b, 0xb1, 0x1e, + 0xb9, 0x9c, 0x25, 0xf2, 0x36, 0xc9, 0xa3, 0xdf, 0x15, 0x9a, 0x62, 0x0e, 0x3f, 0xe2, 0xdc, 0xb7, + 0xbb, 0x63, 0xce, 0x92, 0xf5, 0x83, 0x8d, 0x39, 0xf5, 0x83, 0x08, 0xd4, 0x22, 0x48, 0xcc, 0xcb, + 0xe4, 0x15, 0x1b, 0xfa, 0x4f, 0x34, 0x58, 0x47, 0x81, 0xe2, 0x66, 0x63, 0x32, 0xa6, 0xc2, 0x25, + 0xf1, 0x4d, 0x7a, 0x00, 0x34, 0x9c, 0x28, 0x5c, 0xef, 0xa5, 0x65, 0x36, 0x15, 0x2d, 0xab, 0x75, + 0x41, 0x19, 0xd7, 0xb9, 0x58, 0x40, 0xc2, 0xc0, 0x12, 0x62, 0xf5, 0xaf, 0x0a, 0x50, 0x94, 0x19, + 0x2f, 0xf9, 0x30, 0x5d, 0x7f, 0xa9, 0x1e, 0x6e, 0x2f, 0x52, 0x8e, 0xa4, 0x52, 0xba, 0x89, 0x82, + 0xb8, 0xcb, 0xb3, 0x45, 0x8d, 0x56, 0xf5, 0xf4, 0xf9, 0x4e, 0x09, 0x03, 0xa0, 0xce, 0xcd, 0xb8, + 0xc2, 0xb1, 0x28, 0xc1, 0x0f, 0xcb, 0x29, 0x85, 0x17, 0x2e, 0xa7, 0xb4, 0x61, 0x33, 0x11, 0xf1, + 0xd9, 0x96, 0x4a, 0x95, 0xb6, 0x97, 0x99, 0x74, 0xe7, 0xa6, 0x5a, 0x7f, 0x35, 0x8a, 0x08, 0x3b, + 0x16, 0xd9, 0x4b, 0xe7, 0xf9, 0x18, 0x38, 0xca, 0x88, 0x25, 0x91, 0xba, 0x8b, 0xb0, 0x51, 0x18, + 0x9b, 0xf0, 0x3f, 0x92, 0x44, 0x06, 0x30, 0x65, 0xd1, 0x81, 0x83, 0x57, 0xa0, 0x16, 0xc7, 0x56, + 0x92, 0xa4, 0x2c, 0xa5, 0xc4, 0xdd, 0x48, 0xf8, 0x1e, 0x9c, 0x73, 0xd8, 0x84, 0x9b, 0xb3, 0xd4, + 0x15, 0xa4, 0x26, 0x62, 0xec, 0x51, 0x9a, 0xe3, 0x12, 0x6c, 0xc5, 0x5e, 0x1c, 0x69, 0x41, 0x56, + 0x5f, 0xa2, 0x5e, 0x24, 0x3b, 0x0f, 0xe5, 0x28, 0xf2, 0xad, 0x22, 0x41, 0x89, 0xca, 0x80, 0x37, + 0x8a, 0xa5, 0x7d, 0x16, 0x8c, 0x87, 0x5c, 0x09, 0xd9, 0x40, 0x1a, 0x8c, 0xa5, 0x0d, 0xd9, 0x8f, + 0xb4, 0xbb, 0xb0, 0x19, 0xfa, 0x2c, 0x49, 0xb7, 0x89, 0x74, 0x1b, 0x61, 0x27, 0x12, 0x5d, 0x85, + 0xba, 0xe7, 0xbb, 0x9e, 0x1b, 0x30, 0xdf, 0xa4, 0x96, 0xe5, 0xb3, 0x20, 0x68, 0x6c, 0x49, 0x79, + 0x61, 0xff, 0x91, 0xec, 0xd6, 0xbf, 0x01, 0xa5, 0x30, 0xa4, 0x3f, 0x07, 0xeb, 0xad, 0xc8, 0xff, + 0x16, 0x0c, 0xd9, 0x10, 0x06, 0x75, 0xe4, 0x79, 0xaa, 0xc0, 0x27, 0x3e, 0xf5, 0x21, 0x94, 0xd4, + 0x81, 0xcd, 0x2d, 0xeb, 0xdc, 0x81, 0x0d, 0x8f, 0xfa, 0x62, 0x1b, 0xc9, 0xe2, 0xce, 0xa2, 0xa4, + 0xf4, 0x1e, 0xf5, 0xf9, 0x7d, 0xc6, 0x53, 0x35, 0x9e, 0x2a, 0xf2, 0xcb, 0x2e, 0xfd, 0x1a, 0x6c, + 0xa6, 0x68, 0xc4, 0x32, 0xb9, 0xcb, 0xe9, 0x30, 0x74, 0x23, 0xd8, 0x88, 0x56, 0x92, 0x8b, 0x57, + 0xa2, 0x5f, 0x87, 0x4a, 0x74, 0x56, 0x22, 0xd7, 0x09, 0x55, 0xa1, 0x29, 0xf5, 0xcb, 0x26, 0xd6, + 0xb1, 0xdc, 0x67, 0xcc, 0x57, 0xb7, 0x5f, 0x36, 0x74, 0x96, 0x70, 0x7b, 0x12, 0x50, 0xc9, 0x0d, + 0x28, 0x29, 0xb7, 0xa7, 0xec, 0x71, 0x51, 0xc5, 0xea, 0x1e, 0xfa, 0xc1, 0xb0, 0x62, 0x25, 0xbd, + 0x62, 0x3c, 0x4d, 0x2e, 0x39, 0xcd, 0x8f, 0xa1, 0x1c, 0xba, 0xb6, 0x34, 0x06, 0xc9, 0x19, 0x2e, + 0xae, 0xc2, 0x20, 0x35, 0x49, 0xcc, 0x28, 0x6e, 0x53, 0x60, 0xf7, 0x1d, 0x66, 0x99, 0xb1, 0x09, + 0xe2, 0x9c, 0x65, 0xa3, 0x26, 0x07, 0x6e, 0x87, 0xf6, 0xa5, 0xbf, 0x07, 0x45, 0xb9, 0xd6, 0xb9, + 0xfe, 0x6e, 0x0e, 0xba, 0xeb, 0x7f, 0xd7, 0xa0, 0x1c, 0x82, 0xd3, 0x5c, 0xa6, 0xd4, 0x26, 0x72, + 0x5f, 0x77, 0x13, 0x2f, 0xdf, 0x25, 0xbd, 0x0b, 0x04, 0x6f, 0x8a, 0x79, 0xe2, 0x72, 0xdb, 0xe9, + 0x9b, 0xf2, 0x2c, 0x64, 0x30, 0x5a, 0xc7, 0x91, 0x47, 0x38, 0x70, 0x4f, 0xf4, 0xbf, 0xbd, 0x0b, + 0xd5, 0x44, 0xa1, 0x8d, 0x94, 0x20, 0x7f, 0x97, 0x3d, 0xab, 0xaf, 0x91, 0x2a, 0x94, 0x0c, 0x86, + 0x65, 0x8a, 0xba, 0x76, 0xf8, 0x55, 0x09, 0x6a, 0x47, 0xad, 0xe3, 0xce, 0x91, 0xe7, 0x0d, 0xed, + 0x1e, 0xa2, 0x25, 0xf9, 0x04, 0x0a, 0x98, 0xaa, 0x67, 0x78, 0x62, 0x6a, 0x66, 0xa9, 0x79, 0x11, + 0x03, 0xd6, 0x31, 0xa3, 0x27, 0x59, 0x5e, 0x9e, 0x9a, 0x99, 0x4a, 0x61, 0x62, 0x91, 0x78, 0xe1, + 0x32, 0x3c, 0x48, 0x35, 0xb3, 0xd4, 0xc7, 0xc8, 0x67, 0x50, 0x89, 0x53, 0xf5, 0xac, 0xcf, 0x54, + 0xcd, 0xcc, 0x95, 0x33, 0x21, 0x3f, 0x4e, 0x4e, 0xb2, 0x3e, 0xd2, 0x34, 0x33, 0x97, 0x8c, 0xc8, + 0x63, 0x28, 0x85, 0x69, 0x60, 0xb6, 0x87, 0xa4, 0x66, 0xc6, 0xaa, 0x96, 0x38, 0x3e, 0x99, 0xbd, + 0x67, 0x79, 0x2d, 0x6b, 0x66, 0x2a, 0xdd, 0x91, 0x87, 0x50, 0x54, 0xf1, 0x77, 0xa6, 0x27, 0xa2, + 0x66, 0xb6, 0x5a, 0x95, 0x50, 0x72, 0x5c, 0x1f, 0xc9, 0xfa, 0x42, 0xd8, 0xcc, 0x5c, 0xb3, 0x24, + 0x14, 0x20, 0x91, 0xd2, 0x67, 0x7e, 0xfa, 0x6b, 0x66, 0xaf, 0x45, 0x92, 0x1f, 0x42, 0x39, 0x4a, + 0xdc, 0x32, 0x3e, 0xc1, 0x35, 0xb3, 0x96, 0x03, 0x5b, 0x9d, 0x7f, 0xff, 0x75, 0x5b, 0xfb, 0xcd, + 0xe9, 0xb6, 0xf6, 0xc5, 0xe9, 0xb6, 0xf6, 0xe5, 0xe9, 0xb6, 0xf6, 0xc7, 0xd3, 0x6d, 0xed, 0x2f, + 0xa7, 0xdb, 0xda, 0xef, 0xff, 0xb6, 0xad, 0xfd, 0xe0, 0x9d, 0xbe, 0xcd, 0x07, 0xe3, 0xee, 0x7e, + 0xcf, 0x1d, 0x1d, 0xc4, 0x02, 0x93, 0x9f, 0xf1, 0x13, 0x7a, 0xb7, 0x88, 0x0e, 0xeb, 0x9b, 0xff, + 0x09, 0x00, 0x00, 0xff, 0xff, 0x61, 0xd2, 0x8e, 0xea, 0x57, 0x1f, 0x00, 0x00, } func (this *Request) Equal(that interface{}) bool { @@ -4689,6 +4754,39 @@ func (this *LastCommitInfo) Equal(that interface{}) bool { } return true } +func (this *EventAttribute) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*EventAttribute) + if !ok { + that2, ok := that.(EventAttribute) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !bytes.Equal(this.Key, that1.Key) { + return false + } + if !bytes.Equal(this.Value, that1.Value) { + return false + } + if this.Index != that1.Index { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} func (this *Event) Equal(that interface{}) bool { if that == nil { return this == nil @@ -7392,6 +7490,57 @@ func (m *LastCommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EventAttribute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Index { + i-- + if m.Index { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8586,15 +8735,34 @@ func NewPopulatedLastCommitInfo(r randyTypes, easy bool) *LastCommitInfo { return this } +func NewPopulatedEventAttribute(r randyTypes, easy bool) *EventAttribute { + this := &EventAttribute{} + v35 := r.Intn(100) + this.Key = make([]byte, v35) + for i := 0; i < v35; i++ { + this.Key[i] = byte(r.Intn(256)) + } + v36 := r.Intn(100) + this.Value = make([]byte, v36) + for i := 0; i < v36; i++ { + this.Value[i] = byte(r.Intn(256)) + } + this.Index = bool(bool(r.Intn(2) == 0)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedTypes(r, 4) + } + return this +} + func NewPopulatedEvent(r randyTypes, easy bool) *Event { this := &Event{} this.Type = string(randStringTypes(r)) if r.Intn(5) != 0 { - v35 := r.Intn(5) - this.Attributes = make([]kv.Pair, v35) - for i := 0; i < v35; i++ { - v36 := kv.NewPopulatedPair(r, easy) - this.Attributes[i] = *v36 + v37 := r.Intn(5) + this.Attributes = make([]EventAttribute, v37) + for i := 0; i < v37; i++ { + v38 := NewPopulatedEventAttribute(r, easy) + this.Attributes[i] = *v38 } } if !easy && r.Intn(10) != 0 { @@ -8605,60 +8773,60 @@ func NewPopulatedEvent(r randyTypes, easy bool) *Event { func NewPopulatedHeader(r randyTypes, easy bool) *Header { this := &Header{} - v37 := NewPopulatedVersion(r, easy) - this.Version = *v37 + v39 := NewPopulatedVersion(r, easy) + this.Version = *v39 this.ChainID = string(randStringTypes(r)) this.Height = int64(r.Int63()) if r.Intn(2) == 0 { this.Height *= -1 } - v38 := github_com_gogo_protobuf_types.NewPopulatedStdTime(r, easy) - this.Time = *v38 - v39 := NewPopulatedBlockID(r, easy) - this.LastBlockId = *v39 - v40 := r.Intn(100) - this.LastCommitHash = make([]byte, v40) - for i := 0; i < v40; i++ { - this.LastCommitHash[i] = byte(r.Intn(256)) - } - v41 := r.Intn(100) - this.DataHash = make([]byte, v41) - for i := 0; i < v41; i++ { - this.DataHash[i] = byte(r.Intn(256)) - } + v40 := github_com_gogo_protobuf_types.NewPopulatedStdTime(r, easy) + this.Time = *v40 + v41 := NewPopulatedBlockID(r, easy) + this.LastBlockId = *v41 v42 := r.Intn(100) - this.ValidatorsHash = make([]byte, v42) + this.LastCommitHash = make([]byte, v42) for i := 0; i < v42; i++ { - this.ValidatorsHash[i] = byte(r.Intn(256)) + this.LastCommitHash[i] = byte(r.Intn(256)) } v43 := r.Intn(100) - this.NextValidatorsHash = make([]byte, v43) + this.DataHash = make([]byte, v43) for i := 0; i < v43; i++ { - this.NextValidatorsHash[i] = byte(r.Intn(256)) + this.DataHash[i] = byte(r.Intn(256)) } v44 := r.Intn(100) - this.ConsensusHash = make([]byte, v44) + this.ValidatorsHash = make([]byte, v44) for i := 0; i < v44; i++ { - this.ConsensusHash[i] = byte(r.Intn(256)) + this.ValidatorsHash[i] = byte(r.Intn(256)) } v45 := r.Intn(100) - this.AppHash = make([]byte, v45) + this.NextValidatorsHash = make([]byte, v45) for i := 0; i < v45; i++ { - this.AppHash[i] = byte(r.Intn(256)) + this.NextValidatorsHash[i] = byte(r.Intn(256)) } v46 := r.Intn(100) - this.LastResultsHash = make([]byte, v46) + this.ConsensusHash = make([]byte, v46) for i := 0; i < v46; i++ { - this.LastResultsHash[i] = byte(r.Intn(256)) + this.ConsensusHash[i] = byte(r.Intn(256)) } v47 := r.Intn(100) - this.EvidenceHash = make([]byte, v47) + this.AppHash = make([]byte, v47) for i := 0; i < v47; i++ { - this.EvidenceHash[i] = byte(r.Intn(256)) + this.AppHash[i] = byte(r.Intn(256)) } v48 := r.Intn(100) - this.ProposerAddress = make([]byte, v48) + this.LastResultsHash = make([]byte, v48) for i := 0; i < v48; i++ { + this.LastResultsHash[i] = byte(r.Intn(256)) + } + v49 := r.Intn(100) + this.EvidenceHash = make([]byte, v49) + for i := 0; i < v49; i++ { + this.EvidenceHash[i] = byte(r.Intn(256)) + } + v50 := r.Intn(100) + this.ProposerAddress = make([]byte, v50) + for i := 0; i < v50; i++ { this.ProposerAddress[i] = byte(r.Intn(256)) } if !easy && r.Intn(10) != 0 { @@ -8679,13 +8847,13 @@ func NewPopulatedVersion(r randyTypes, easy bool) *Version { func NewPopulatedBlockID(r randyTypes, easy bool) *BlockID { this := &BlockID{} - v49 := r.Intn(100) - this.Hash = make([]byte, v49) - for i := 0; i < v49; i++ { + v51 := r.Intn(100) + this.Hash = make([]byte, v51) + for i := 0; i < v51; i++ { this.Hash[i] = byte(r.Intn(256)) } - v50 := NewPopulatedPartSetHeader(r, easy) - this.PartsHeader = *v50 + v52 := NewPopulatedPartSetHeader(r, easy) + this.PartsHeader = *v52 if !easy && r.Intn(10) != 0 { this.XXX_unrecognized = randUnrecognizedTypes(r, 3) } @@ -8698,9 +8866,9 @@ func NewPopulatedPartSetHeader(r randyTypes, easy bool) *PartSetHeader { if r.Intn(2) == 0 { this.Total *= -1 } - v51 := r.Intn(100) - this.Hash = make([]byte, v51) - for i := 0; i < v51; i++ { + v53 := r.Intn(100) + this.Hash = make([]byte, v53) + for i := 0; i < v53; i++ { this.Hash[i] = byte(r.Intn(256)) } if !easy && r.Intn(10) != 0 { @@ -8711,9 +8879,9 @@ func NewPopulatedPartSetHeader(r randyTypes, easy bool) *PartSetHeader { func NewPopulatedValidator(r randyTypes, easy bool) *Validator { this := &Validator{} - v52 := r.Intn(100) - this.Address = make([]byte, v52) - for i := 0; i < v52; i++ { + v54 := r.Intn(100) + this.Address = make([]byte, v54) + for i := 0; i < v54; i++ { this.Address[i] = byte(r.Intn(256)) } this.Power = int64(r.Int63()) @@ -8728,8 +8896,8 @@ func NewPopulatedValidator(r randyTypes, easy bool) *Validator { func NewPopulatedValidatorUpdate(r randyTypes, easy bool) *ValidatorUpdate { this := &ValidatorUpdate{} - v53 := NewPopulatedPubKey(r, easy) - this.PubKey = *v53 + v55 := NewPopulatedPubKey(r, easy) + this.PubKey = *v55 this.Power = int64(r.Int63()) if r.Intn(2) == 0 { this.Power *= -1 @@ -8742,8 +8910,8 @@ func NewPopulatedValidatorUpdate(r randyTypes, easy bool) *ValidatorUpdate { func NewPopulatedVoteInfo(r randyTypes, easy bool) *VoteInfo { this := &VoteInfo{} - v54 := NewPopulatedValidator(r, easy) - this.Validator = *v54 + v56 := NewPopulatedValidator(r, easy) + this.Validator = *v56 this.SignedLastBlock = bool(bool(r.Intn(2) == 0)) if !easy && r.Intn(10) != 0 { this.XXX_unrecognized = randUnrecognizedTypes(r, 3) @@ -8754,9 +8922,9 @@ func NewPopulatedVoteInfo(r randyTypes, easy bool) *VoteInfo { func NewPopulatedPubKey(r randyTypes, easy bool) *PubKey { this := &PubKey{} this.Type = string(randStringTypes(r)) - v55 := r.Intn(100) - this.Data = make([]byte, v55) - for i := 0; i < v55; i++ { + v57 := r.Intn(100) + this.Data = make([]byte, v57) + for i := 0; i < v57; i++ { this.Data[i] = byte(r.Intn(256)) } if !easy && r.Intn(10) != 0 { @@ -8768,14 +8936,14 @@ func NewPopulatedPubKey(r randyTypes, easy bool) *PubKey { func NewPopulatedEvidence(r randyTypes, easy bool) *Evidence { this := &Evidence{} this.Type = string(randStringTypes(r)) - v56 := NewPopulatedValidator(r, easy) - this.Validator = *v56 + v58 := NewPopulatedValidator(r, easy) + this.Validator = *v58 this.Height = int64(r.Int63()) if r.Intn(2) == 0 { this.Height *= -1 } - v57 := github_com_gogo_protobuf_types.NewPopulatedStdTime(r, easy) - this.Time = *v57 + v59 := github_com_gogo_protobuf_types.NewPopulatedStdTime(r, easy) + this.Time = *v59 this.TotalVotingPower = int64(r.Int63()) if r.Intn(2) == 0 { this.TotalVotingPower *= -1 @@ -8805,9 +8973,9 @@ func randUTF8RuneTypes(r randyTypes) rune { return rune(ru + 61) } func randStringTypes(r randyTypes) string { - v58 := r.Intn(100) - tmps := make([]rune, v58) - for i := 0; i < v58; i++ { + v60 := r.Intn(100) + tmps := make([]rune, v60) + for i := 0; i < v60; i++ { tmps[i] = randUTF8RuneTypes(r) } return string(tmps) @@ -8829,11 +8997,11 @@ func randFieldTypes(dAtA []byte, r randyTypes, fieldNumber int, wire int) []byte switch wire { case 0: dAtA = encodeVarintPopulateTypes(dAtA, uint64(key)) - v59 := r.Int63() + v61 := r.Int63() if r.Intn(2) == 0 { - v59 *= -1 + v61 *= -1 } - dAtA = encodeVarintPopulateTypes(dAtA, uint64(v59)) + dAtA = encodeVarintPopulateTypes(dAtA, uint64(v61)) case 1: dAtA = encodeVarintPopulateTypes(dAtA, uint64(key)) dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) @@ -9793,6 +9961,29 @@ func (m *LastCommitInfo) Size() (n int) { return n } +func (m *EventAttribute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Index { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Event) Size() (n int) { if m == nil { return 0 @@ -14667,6 +14858,148 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventAttribute) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventAttribute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventAttribute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Index = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Event) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -14757,7 +15090,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Attributes = append(m.Attributes, kv.Pair{}) + m.Attributes = append(m.Attributes, EventAttribute{}) if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/abci/types/types.proto b/abci/types/types.proto index 2d2d3563e..2a9cbc4d6 100644 --- a/abci/types/types.proto +++ b/abci/types/types.proto @@ -6,7 +6,6 @@ option go_package = "github.com/tendermint/tendermint/abci/types"; // https://github.com/gogo/protobuf/blob/master/extensions.md import "third_party/proto/gogoproto/gogo.proto"; import "crypto/merkle/merkle.proto"; -import "libs/kv/types.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/duration.proto"; @@ -247,10 +246,18 @@ message LastCommitInfo { repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; } + +// EventAttribute represents an event to the indexing service. +message EventAttribute { + bytes key = 1; + bytes value = 2; + bool index = 3; +} + message Event { string type = 1; - repeated tendermint.libs.kv.Pair attributes = 2 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes,omitempty"]; + repeated EventAttribute attributes = 2 + [(gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes,omitempty"]; } //---------------------------------------- diff --git a/abci/types/typespb_test.go b/abci/types/typespb_test.go index eaa550054..7a79ad8a9 100644 --- a/abci/types/typespb_test.go +++ b/abci/types/typespb_test.go @@ -13,7 +13,6 @@ import ( _ "github.com/golang/protobuf/ptypes/duration" _ "github.com/golang/protobuf/ptypes/timestamp" _ "github.com/tendermint/tendermint/crypto/merkle" - _ "github.com/tendermint/tendermint/libs/kv" math "math" math_rand "math/rand" testing "testing" @@ -1706,6 +1705,62 @@ func TestLastCommitInfoMarshalTo(t *testing.T) { } } +func TestEventAttributeProto(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, false) + dAtA, err := github_com_gogo_protobuf_proto.Marshal(p) + if err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + msg := &EventAttribute{} + if err := github_com_gogo_protobuf_proto.Unmarshal(dAtA, msg); err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + littlefuzz := make([]byte, len(dAtA)) + copy(littlefuzz, dAtA) + for i := range dAtA { + dAtA[i] = byte(popr.Intn(256)) + } + if !p.Equal(msg) { + t.Fatalf("seed = %d, %#v !Proto %#v", seed, msg, p) + } + if len(littlefuzz) > 0 { + fuzzamount := 100 + for i := 0; i < fuzzamount; i++ { + littlefuzz[popr.Intn(len(littlefuzz))] = byte(popr.Intn(256)) + littlefuzz = append(littlefuzz, byte(popr.Intn(256))) + } + // shouldn't panic + _ = github_com_gogo_protobuf_proto.Unmarshal(littlefuzz, msg) + } +} + +func TestEventAttributeMarshalTo(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, false) + size := p.Size() + dAtA := make([]byte, size) + for i := range dAtA { + dAtA[i] = byte(popr.Intn(256)) + } + _, err := p.MarshalTo(dAtA) + if err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + msg := &EventAttribute{} + if err := github_com_gogo_protobuf_proto.Unmarshal(dAtA, msg); err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + for i := range dAtA { + dAtA[i] = byte(popr.Intn(256)) + } + if !p.Equal(msg) { + t.Fatalf("seed = %d, %#v !Proto %#v", seed, msg, p) + } +} + func TestEventProto(t *testing.T) { seed := time.Now().UnixNano() popr := math_rand.New(math_rand.NewSource(seed)) @@ -2806,6 +2861,24 @@ func TestLastCommitInfoJSON(t *testing.T) { t.Fatalf("seed = %d, %#v !Json Equal %#v", seed, msg, p) } } +func TestEventAttributeJSON(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, true) + marshaler := github_com_gogo_protobuf_jsonpb.Marshaler{} + jsondata, err := marshaler.MarshalToString(p) + if err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + msg := &EventAttribute{} + err = github_com_gogo_protobuf_jsonpb.UnmarshalString(jsondata, msg) + if err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + if !p.Equal(msg) { + t.Fatalf("seed = %d, %#v !Json Equal %#v", seed, msg, p) + } +} func TestEventJSON(t *testing.T) { seed := time.Now().UnixNano() popr := math_rand.New(math_rand.NewSource(seed)) @@ -3826,6 +3899,34 @@ func TestLastCommitInfoProtoCompactText(t *testing.T) { } } +func TestEventAttributeProtoText(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, true) + dAtA := github_com_gogo_protobuf_proto.MarshalTextString(p) + msg := &EventAttribute{} + if err := github_com_gogo_protobuf_proto.UnmarshalText(dAtA, msg); err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + if !p.Equal(msg) { + t.Fatalf("seed = %d, %#v !Proto %#v", seed, msg, p) + } +} + +func TestEventAttributeProtoCompactText(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, true) + dAtA := github_com_gogo_protobuf_proto.CompactTextString(p) + msg := &EventAttribute{} + if err := github_com_gogo_protobuf_proto.UnmarshalText(dAtA, msg); err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + if !p.Equal(msg) { + t.Fatalf("seed = %d, %#v !Proto %#v", seed, msg, p) + } +} + func TestEventProtoText(t *testing.T) { seed := time.Now().UnixNano() popr := math_rand.New(math_rand.NewSource(seed)) @@ -4766,6 +4867,28 @@ func TestLastCommitInfoSize(t *testing.T) { } } +func TestEventAttributeSize(t *testing.T) { + seed := time.Now().UnixNano() + popr := math_rand.New(math_rand.NewSource(seed)) + p := NewPopulatedEventAttribute(popr, true) + size2 := github_com_gogo_protobuf_proto.Size(p) + dAtA, err := github_com_gogo_protobuf_proto.Marshal(p) + if err != nil { + t.Fatalf("seed = %d, err = %v", seed, err) + } + size := p.Size() + if len(dAtA) != size { + t.Errorf("seed = %d, size %v != marshalled size %v", seed, size, len(dAtA)) + } + if size2 != size { + t.Errorf("seed = %d, size %v != before marshal proto.Size %v", seed, size, size2) + } + size3 := github_com_gogo_protobuf_proto.Size(p) + if size3 != size { + t.Errorf("seed = %d, size %v != after marshal proto.Size %v", seed, size, size3) + } +} + func TestEventSize(t *testing.T) { seed := time.Now().UnixNano() popr := math_rand.New(math_rand.NewSource(seed)) diff --git a/docs/app-dev/indexing-transactions.md b/docs/app-dev/indexing-transactions.md index 3e3fcd551..ba2509413 100644 --- a/docs/app-dev/indexing-transactions.md +++ b/docs/app-dev/indexing-transactions.md @@ -76,10 +76,11 @@ func (app *KVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.Resul events := []abci.Event{ { Type: "transfer", - Attributes: kv.Pairs{ - kv.Pair{Key: []byte("sender"), Value: []byte("Bob")}, - kv.Pair{Key: []byte("recipient"), Value: []byte("Alice")}, - kv.Pair{Key: []byte("balance"), Value: []byte("100")}, + Attributes: []abci.EventAttribute{ + {Key: []byte("sender"), Value: []byte("Bob")}, + {Key: []byte("recipient"), Value: []byte("Alice")}, + {Key: []byte("balance"), Value: []byte("100")}, + {Key: []byte("note"), Value: []byte("nothing"), Index: true}, }, }, } @@ -98,6 +99,9 @@ Note, there are a few predefined event types: Tendermint will throw a warning if you try to use any of the above keys. +The index will be added if the `Index` field of attribute is set to true. In above example, querying +using `transfer.note` will work. + ## Querying Transactions You can query the transaction results by calling `/tx_search` RPC endpoint: diff --git a/libs/kv/types.proto b/libs/kv/types.proto index 1b6a7a58d..e227c37c7 100644 --- a/libs/kv/types.proto +++ b/libs/kv/types.proto @@ -17,6 +17,6 @@ option (gogoproto.testgen_all) = true; // Abstract types message Pair { - bytes key = 1; + bytes key = 1; bytes value = 2; } diff --git a/rpc/client/rpc_test.go b/rpc/client/rpc_test.go index 1038551c6..1a86856f2 100644 --- a/rpc/client/rpc_test.go +++ b/rpc/client/rpc_test.go @@ -493,6 +493,20 @@ func TestTxSearch(t *testing.T) { t.Fatal("expected a lot of transactions") } + // query using an index key + result, err = c.TxSearch("app.index_key='index is working'", false, 1, 30, "asc") + require.Nil(t, err) + if len(result.Txs) == 0 { + t.Fatal("expected a lot of transactions") + } + + // query using an noindex key + result, err = c.TxSearch("app.noindex_key='index is working'", false, 1, 30, "asc") + require.Nil(t, err) + if len(result.Txs) != 0 { + t.Fatal("expected no transaction") + } + // query using a compositeKey (see kvstore application) and height result, err = c.TxSearch("app.creator='Cosmoshi Netowoko' AND tx.height<10000", true, 1, 30, "asc") require.Nil(t, err) diff --git a/state/state_test.go b/state/state_test.go index 746f7837c..6ca196bb2 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -17,7 +17,6 @@ import ( abci "github.com/tendermint/tendermint/abci/types" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/libs/kv" "github.com/tendermint/tendermint/libs/rand" tmrand "github.com/tendermint/tendermint/libs/rand" sm "github.com/tendermint/tendermint/state" @@ -136,8 +135,8 @@ func TestABCIResponsesSaveLoad2(t *testing.T) { { Data: []byte("Gotcha!"), Events: []abci.Event{ - {Type: "type1", Attributes: []kv.Pair{{Key: []byte("a"), Value: []byte("1")}}}, - {Type: "type2", Attributes: []kv.Pair{{Key: []byte("build"), Value: []byte("stuff")}}}, + {Type: "type1", Attributes: []abci.EventAttribute{{Key: []byte("a"), Value: []byte("1")}}}, + {Type: "type2", Attributes: []abci.EventAttribute{{Key: []byte("build"), Value: []byte("stuff")}}}, }, }, }, diff --git a/state/txindex/kv/kv.go b/state/txindex/kv/kv.go index c5ba99ca3..bf446c489 100644 --- a/state/txindex/kv/kv.go +++ b/state/txindex/kv/kv.go @@ -153,7 +153,7 @@ func (txi *TxIndex) indexEvents(result *types.TxResult, hash []byte, store dbm.S } compositeTag := fmt.Sprintf("%s.%s", event.Type, string(attr.Key)) - if txi.indexAllEvents || tmstring.StringInSlice(compositeTag, txi.compositeKeysToIndex) { + if txi.indexAllEvents || tmstring.StringInSlice(compositeTag, txi.compositeKeysToIndex) || attr.GetIndex() { store.Set(keyForEvent(compositeTag, attr.Value, result), hash) } } diff --git a/state/txindex/kv/kv_bench_test.go b/state/txindex/kv/kv_bench_test.go index 31267f54c..61c167600 100644 --- a/state/txindex/kv/kv_bench_test.go +++ b/state/txindex/kv/kv_bench_test.go @@ -10,7 +10,6 @@ import ( dbm "github.com/tendermint/tm-db" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/kv" "github.com/tendermint/tendermint/libs/pubsub/query" "github.com/tendermint/tendermint/types" ) @@ -33,7 +32,7 @@ func BenchmarkTxSearch(b *testing.B) { events := []abci.Event{ { Type: "transfer", - Attributes: []kv.Pair{ + Attributes: []abci.EventAttribute{ {Key: []byte("address"), Value: []byte(fmt.Sprintf("address_%d", i%100))}, {Key: []byte("amount"), Value: []byte("50")}, }, diff --git a/state/txindex/kv/kv_test.go b/state/txindex/kv/kv_test.go index fcd2eba13..2cada9ee6 100644 --- a/state/txindex/kv/kv_test.go +++ b/state/txindex/kv/kv_test.go @@ -13,7 +13,6 @@ import ( db "github.com/tendermint/tm-db" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/kv" "github.com/tendermint/tendermint/libs/pubsub/query" tmrand "github.com/tendermint/tendermint/libs/rand" "github.com/tendermint/tendermint/state/txindex" @@ -71,9 +70,9 @@ func TestTxSearch(t *testing.T) { indexer := NewTxIndex(db.NewMemDB(), IndexEvents(allowedKeys)) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}}, - {Type: "account", Attributes: []kv.Pair{{Key: []byte("owner"), Value: []byte("Ivan")}}}, - {Type: "", Attributes: []kv.Pair{{Key: []byte("not_allowed"), Value: []byte("Vlad")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("owner"), Value: []byte("Ivan")}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad")}}}, }) hash := txResult.Tx.Hash() @@ -140,9 +139,9 @@ func TestTxSearchWithCancelation(t *testing.T) { indexer := NewTxIndex(db.NewMemDB(), IndexEvents(allowedKeys)) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}}, - {Type: "account", Attributes: []kv.Pair{{Key: []byte("owner"), Value: []byte("Ivan")}}}, - {Type: "", Attributes: []kv.Pair{{Key: []byte("not_allowed"), Value: []byte("Vlad")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("owner"), Value: []byte("Ivan")}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad")}}}, }) err := indexer.Index(txResult) require.NoError(t, err) @@ -160,7 +159,7 @@ func TestTxSearchDeprecatedIndexing(t *testing.T) { // index tx using events indexing (composite key) txResult1 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1")}}}, }) hash1 := txResult1.Tx.Hash() @@ -231,8 +230,8 @@ func TestTxSearchOneTxWithMultipleSameTagsButDifferentValues(t *testing.T) { indexer := NewTxIndex(db.NewMemDB(), IndexEvents(allowedKeys)) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}}, - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("2")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2")}}}, }) err := indexer.Index(txResult) @@ -253,7 +252,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed first, but bigger height (to test the order of transactions) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1")}}}, }) txResult.Tx = types.Tx("Bob's account") @@ -264,7 +263,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed second, but smaller height (to test the order of transactions) txResult2 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("2")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2")}}}, }) txResult2.Tx = types.Tx("Alice's account") txResult2.Height = 1 @@ -275,7 +274,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed third (to test the order of transactions) txResult3 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number"), Value: []byte("3")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("3")}}}, }) txResult3.Tx = types.Tx("Jack's account") txResult3.Height = 1 @@ -286,7 +285,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed fourth (to test we don't include txs with similar events) // https://github.com/tendermint/tendermint/issues/2908 txResult4 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []kv.Pair{{Key: []byte("number.id"), Value: []byte("1")}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number.id"), Value: []byte("1")}}}, }) txResult4.Tx = types.Tx("Mike's account") txResult4.Height = 2 diff --git a/types/event_bus_test.go b/types/event_bus_test.go index 14b6d96e0..901c30843 100644 --- a/types/event_bus_test.go +++ b/types/event_bus_test.go @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/kv" tmpubsub "github.com/tendermint/tendermint/libs/pubsub" tmquery "github.com/tendermint/tendermint/libs/pubsub/query" tmrand "github.com/tendermint/tendermint/libs/rand" @@ -27,7 +26,7 @@ func TestEventBusPublishEventTx(t *testing.T) { result := abci.ResponseDeliverTx{ Data: []byte("bar"), Events: []abci.Event{ - {Type: "testType", Attributes: []kv.Pair{{Key: []byte("baz"), Value: []byte("1")}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key: []byte("baz"), Value: []byte("1")}}}, }, } @@ -71,12 +70,12 @@ func TestEventBusPublishEventNewBlock(t *testing.T) { block := MakeBlock(0, []Tx{}, nil, []Evidence{}) resultBeginBlock := abci.ResponseBeginBlock{ Events: []abci.Event{ - {Type: "testType", Attributes: []kv.Pair{{Key: []byte("baz"), Value: []byte("1")}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key: []byte("baz"), Value: []byte("1")}}}, }, } resultEndBlock := abci.ResponseEndBlock{ Events: []abci.Event{ - {Type: "testType", Attributes: []kv.Pair{{Key: []byte("foz"), Value: []byte("2")}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key: []byte("foz"), Value: []byte("2")}}}, }, } @@ -121,7 +120,7 @@ func TestEventBusPublishEventTxDuplicateKeys(t *testing.T) { Events: []abci.Event{ { Type: "transfer", - Attributes: []kv.Pair{ + Attributes: []abci.EventAttribute{ {Key: []byte("sender"), Value: []byte("foo")}, {Key: []byte("recipient"), Value: []byte("bar")}, {Key: []byte("amount"), Value: []byte("5")}, @@ -129,7 +128,7 @@ func TestEventBusPublishEventTxDuplicateKeys(t *testing.T) { }, { Type: "transfer", - Attributes: []kv.Pair{ + Attributes: []abci.EventAttribute{ {Key: []byte("sender"), Value: []byte("baz")}, {Key: []byte("recipient"), Value: []byte("cat")}, {Key: []byte("amount"), Value: []byte("13")}, @@ -137,7 +136,7 @@ func TestEventBusPublishEventTxDuplicateKeys(t *testing.T) { }, { Type: "withdraw.rewards", - Attributes: []kv.Pair{ + Attributes: []abci.EventAttribute{ {Key: []byte("address"), Value: []byte("bar")}, {Key: []byte("source"), Value: []byte("iceman")}, {Key: []byte("amount"), Value: []byte("33")}, @@ -218,12 +217,12 @@ func TestEventBusPublishEventNewBlockHeader(t *testing.T) { block := MakeBlock(0, []Tx{}, nil, []Evidence{}) resultBeginBlock := abci.ResponseBeginBlock{ Events: []abci.Event{ - {Type: "testType", Attributes: []kv.Pair{{Key: []byte("baz"), Value: []byte("1")}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key: []byte("baz"), Value: []byte("1")}}}, }, } resultEndBlock := abci.ResponseEndBlock{ Events: []abci.Event{ - {Type: "testType", Attributes: []kv.Pair{{Key: []byte("foz"), Value: []byte("2")}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key: []byte("foz"), Value: []byte("2")}}}, }, }