waku2: static shards (#3944)

- use protected topics for communities
- associate chats to pubsub topics and populate these depending if the chat belongs to a community or not
- mailserver functions should be aware of pubsub topics
- generate private key for pubsub topic protection when creating a community
- add shard cluster and index to communities
- setup shards for existing communities
- distribute pubsubtopic password
- fix: do not send the requests to join and cancel in the protected topic
- fix: undefined shard values for backward compatibility
- refactor: use shard message in protobuffers
This commit is contained in:
richΛrd 2023-10-12 15:21:49 -04:00 committed by GitHub
parent 2a5327d8d2
commit ba5ed725ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 1527 additions and 574 deletions

View File

@ -30,7 +30,7 @@ linters-settings:
gofmt:
simplify: true
goimports:
local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go
local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go,github.com/waku-org/go-waku
maligned:
suggest-new: true
dupl:

View File

@ -1 +1 @@
0.168.1
0.169.0

View File

@ -47,6 +47,8 @@ var (
seedPhrase = flag.String("seed-phrase", "", "Seed phrase")
version = flag.Bool("version", false, "Print version and dump configuration")
communityID = flag.String("community-id", "", "The id of the community")
shardCluster = flag.Int("shard-cluster", common.UndefinedShardValue, "The shard cluster in which the of the community is published")
shardIndex = flag.Int("shard-index", common.UndefinedShardValue, "The shard index in which the community is published")
chatID = flag.String("chat-id", "", "The id of the chat")
dataDir = flag.String("dir", getDefaultDataDir(), "Directory used by node to store data")
@ -145,7 +147,15 @@ func main() {
messenger := wakuextservice.Messenger()
community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, true)
var shard *common.Shard = nil
if shardCluster != nil && shardIndex != nil && *shardCluster != common.UndefinedShardValue && *shardIndex != common.UndefinedShardValue {
shard = &common.Shard{
Cluster: uint16(*shardCluster),
Index: uint16(*shardIndex),
}
}
community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, shard, true)
if err != nil {
logger.Error("community error", "error", err)

View File

@ -69,7 +69,13 @@ func (w *gethWakuWrapper) SubscribeToPubsubTopic(topic string, optPublicKey *ecd
return errors.New("not available in WakuV1")
}
func (w *gethWakuWrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
// not available in WakuV1
return nil, errors.New("not available in WakuV1")
}
func (w *gethWakuWrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
// not available in WakuV1
return errors.New("not available in WakuV1")
}

View File

@ -7,6 +7,7 @@ import (
"time"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/waku-org/go-waku/waku/v2/protocol/store"
storepb "github.com/waku-org/go-waku/waku/v2/protocol/store/pb"
@ -235,6 +236,10 @@ func (w *gethWakuV2Wrapper) SubscribeToPubsubTopic(topic string, optPublicKey *e
return w.waku.SubscribeToPubsubTopic(topic, optPublicKey)
}
func (w *gethWakuV2Wrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
return w.waku.RetrievePubsubTopicKey(topic)
}
func (w *gethWakuV2Wrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
return w.waku.StorePubsubTopicKey(topic, privKey)
}

View File

@ -92,6 +92,8 @@ type Waku interface {
StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error
RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error)
AddStorePeer(address string) (peer.ID, error)
AddRelayPeer(address string) (peer.ID, error)

View File

@ -13,6 +13,8 @@ import (
datasyncproto "github.com/vacp2p/mvds/protobuf"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/datasync"
@ -187,6 +189,39 @@ func (s *MessageSender) SendCommunityMessage(
return s.sendCommunity(ctx, &rawMessage)
}
// SendPubsubTopicKey sends the protected topic key for a community to a list of recipients
func (s *MessageSender) SendPubsubTopicKey(
ctx context.Context,
rawMessage *RawMessage,
) ([]byte, error) {
s.logger.Debug(
"sending the protected topic key for a community",
zap.String("communityId", types.EncodeHex(rawMessage.CommunityID)),
zap.String("site", "SendPubsubTopicKey"),
)
rawMessage.Sender = s.identity
messageID, err := s.getMessageID(rawMessage)
if err != nil {
return nil, err
}
rawMessage.ID = types.EncodeHex(messageID)
// Notify before dispatching, otherwise the dispatch subscription might happen
// earlier than the scheduled
s.notifyOnScheduledMessage(nil, rawMessage)
// Send to each recipients
for _, recipient := range rawMessage.Recipients {
_, err = s.sendPrivate(ctx, recipient, rawMessage)
if err != nil {
return nil, errors.Wrap(err, "failed to send message")
}
}
return messageID, nil
}
// SendGroup takes encoded data, encrypts it and sends through the wire,
// always return the messageID
func (s *MessageSender) SendGroup(
@ -364,6 +399,7 @@ func (s *MessageSender) sendPrivate(
messageID := v1protocol.MessageID(&rawMessage.Sender.PublicKey, wrappedMessage)
rawMessage.ID = types.EncodeHex(messageID)
rawMessage.PubsubTopic = relay.DefaultWakuTopic // TODO: determine which pubsub topic should be used for 1:1 messages
if rawMessage.BeforeDispatch != nil {
if err := rawMessage.BeforeDispatch(rawMessage); err != nil {

47
protocol/common/shard.go Normal file
View File

@ -0,0 +1,47 @@
package common
import (
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/transport"
)
type Shard struct {
Cluster uint16 `json:"cluster"`
Index uint16 `json:"index"`
}
func ShardFromProtobuff(p *protobuf.Shard) *Shard {
if p == nil {
return nil
}
return &Shard{
Cluster: uint16(p.Cluster),
Index: uint16(p.Index),
}
}
func (s *Shard) TransportShard() *transport.Shard {
if s == nil {
return nil
}
return &transport.Shard{
Cluster: s.Cluster,
Index: s.Index,
}
}
func (s *Shard) Protobuffer() *protobuf.Shard {
if s == nil {
return nil
}
return &protobuf.Shard{
Cluster: int32(s.Cluster),
Index: int32(s.Index),
}
}
const MainStatusShard = 16
const UndefinedShardValue = 0

View File

@ -10,9 +10,10 @@ import (
"time"
"github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/images"
@ -43,6 +44,7 @@ type Config struct {
MemberIdentity *ecdsa.PublicKey
SyncedAt uint64
EventsData *EventsData
Shard *common.Shard
}
type EventsData struct {
@ -139,13 +141,18 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) {
TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"`
CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"`
ActiveMembersCount uint64 `json:"activeMembersCount"`
PubsubTopic string `json:"pubsubTopic"`
Shard *common.Shard `json:"shard"`
}{
ID: o.ID(),
Verified: o.config.Verified,
Chats: make(map[string]CommunityChat),
Categories: make(map[string]CommunityCategory),
Tags: o.Tags(),
ID: o.ID(),
Verified: o.config.Verified,
Chats: make(map[string]CommunityChat),
Categories: make(map[string]CommunityCategory),
Tags: o.Tags(),
PubsubTopic: o.PubsubTopic(),
Shard: o.Shard(),
}
if o.config.CommunityDescription != nil {
for id, c := range o.config.CommunityDescription.Categories {
category := CommunityCategory{
@ -178,7 +185,12 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) {
communityItem.TokenPermissions = o.tokenPermissions()
communityItem.MembersCount = len(o.config.CommunityDescription.Members)
communityItem.Link = fmt.Sprintf("https://join.status.im/c/0x%x", o.ID())
if o.Shard() != nil {
communityItem.Link = fmt.Sprintf("%s/%d/%d", communityItem.Link, o.Shard().Cluster, o.Shard().Index)
}
communityItem.IntroMessage = o.config.CommunityDescription.IntroMessage
communityItem.OutroMessage = o.config.CommunityDescription.OutroMessage
communityItem.CommunityTokensMetadata = o.config.CommunityDescription.CommunityTokensMetadata
@ -245,6 +257,8 @@ func (o *Community) MarshalJSON() ([]byte, error) {
TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"`
CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"`
ActiveMembersCount uint64 `json:"activeMembersCount"`
PubsubTopic string `json:"pubsubTopic"`
Shard *common.Shard `json:"shard"`
}{
ID: o.ID(),
MemberRole: o.MemberRole(o.MemberIdentity()),
@ -264,6 +278,8 @@ func (o *Community) MarshalJSON() ([]byte, error) {
MuteTill: o.config.MuteTill,
Tags: o.Tags(),
Encrypted: o.Encrypted(),
PubsubTopic: o.PubsubTopic(),
Shard: o.Shard(),
}
if o.config.CommunityDescription != nil {
for id, c := range o.config.CommunityDescription.Categories {
@ -358,6 +374,14 @@ func (o *Community) DescriptionText() string {
return ""
}
func (o *Community) Shard() *common.Shard {
if o != nil && o.config != nil {
return o.config.Shard
}
return nil
}
func (o *Community) IntroMessage() string {
if o != nil &&
o.config != nil &&
@ -1230,7 +1254,7 @@ func (o *Community) MemberUpdateChannelID() string {
}
func (o *Community) PubsubTopic() string {
return transport.GetPubsubTopic(o.ID())
return transport.GetPubsubTopic(o.Shard().TransportShard())
}
func (o *Community) DefaultFilters() []transport.FiltersToInitialize {
@ -1243,7 +1267,8 @@ func (o *Community) DefaultFilters() []transport.FiltersToInitialize {
communityPubsubTopic := o.PubsubTopic()
return []transport.FiltersToInitialize{
{ChatID: cID, PubsubTopic: relay.DefaultWakuTopic}, // TODO: verify if this goes into default topic
{ChatID: cID, PubsubTopic: communityPubsubTopic},
{ChatID: uncompressedPubKey, PubsubTopic: relay.DefaultWakuTopic}, // TODO: messages that are not protected are sent in default pubsub topic for now
{ChatID: uncompressedPubKey, PubsubTopic: communityPubsubTopic},
{ChatID: updatesChannelID, PubsubTopic: communityPubsubTopic},
{ChatID: mlChannelID, PubsubTopic: communityPubsubTopic},

View File

@ -21,6 +21,8 @@ import (
"github.com/anacrolix/torrent/metainfo"
"github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/google/uuid"
"github.com/pkg/errors"
"go.uber.org/zap"
@ -511,11 +513,17 @@ func (m *Manager) All() ([]*Community, error) {
return communities, nil
}
type CommunityShard struct {
CommunityID string `json:"communityID"`
Shard *common.Shard `json:"shard"`
}
type KnownCommunitiesResponse struct {
ContractCommunities []string `json:"contractCommunities"`
ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"`
ContractCommunities []string `json:"contractCommunities"` // TODO: use CommunityShard
ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"` // TODO: use CommunityShard
Descriptions map[string]*Community `json:"communities"`
UnknownCommunities []string `json:"unknownCommunities"`
UnknownCommunities []string `json:"unknownCommunities"` // TODO: use CommunityShard
}
func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexBytes) (response *KnownCommunitiesResponse, err error) {
@ -531,12 +539,20 @@ func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexByt
return
}
response.ContractCommunities = append(response.ContractCommunities, communityID)
// TODO: use CommunityShard instead of appending the communityID
response.ContractCommunities = append(response.ContractCommunities, communityID) // , CommunityShard{
// CommunityID: communityID,
// Shard: community.Shard(),
// }
if community != nil {
response.Descriptions[community.IDString()] = community
} else {
response.UnknownCommunities = append(response.UnknownCommunities, communityID)
response.UnknownCommunities = append(response.UnknownCommunities, communityID) // CommunityShard{
// CommunityID: communityID,
// Shard: community.Shard(),
// })
}
}
@ -653,6 +669,7 @@ func (m *Manager) CreateCommunity(request *requests.CreateCommunity, publish boo
Joined: true,
MemberIdentity: &m.identity.PublicKey,
CommunityDescription: description,
Shard: nil,
}
community, err := New(config, m.timesource)
if err != nil {
@ -931,6 +948,34 @@ func (m *Manager) DeleteCommunity(id types.HexBytes) error {
return m.persistence.DeleteCommunitySettings(id)
}
func (m *Manager) UpdateShard(community *Community, shard *common.Shard) error {
community.config.Shard = shard
return m.persistence.SaveCommunity(community)
}
// SetShard assigns a shard to a community
func (m *Manager) SetShard(communityID types.HexBytes, shard *common.Shard) (*Community, error) {
community, err := m.GetByID(communityID)
if err != nil {
return nil, err
}
if community == nil {
return nil, ErrOrgNotFound
}
if !community.IsControlNode() {
return nil, errors.New("not admin or owner")
}
err = m.UpdateShard(community, shard)
if err != nil {
return nil, err
}
m.publish(&Subscription{Community: community})
return community, nil
}
// EditCommunity takes a description, updates the community with the description,
// saves it and returns it
func (m *Manager) EditCommunity(request *requests.EditCommunity) (*Community, error) {
@ -1310,7 +1355,7 @@ func (m *Manager) DeleteCategory(request *requests.DeleteCommunityCategory) (*Co
return changes.Community, changes, nil
}
func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte) (*CommunityResponse, error) {
func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte, shard *common.Shard) (*CommunityResponse, error) {
if signer == nil {
return nil, errors.New("signer can't be nil")
}
@ -1332,6 +1377,7 @@ func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, des
CommunityDescriptionProtocolMessage: payload,
MemberIdentity: &m.identity.PublicKey,
ID: signer,
Shard: shard,
}
community, err = New(config, m.timesource)
if err != nil {
@ -2880,7 +2926,7 @@ func (m *Manager) HandleCommunityRequestToLeave(signer *ecdsa.PublicKey, proto *
return nil
}
func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*CommunityResponse, error) {
func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*CommunityResponse, error) {
m.logger.Debug("Handling wrapped community description message")
applicationMetadataMessage := &protobuf.ApplicationMetadataMessage{}
@ -2903,7 +2949,7 @@ func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*Com
return nil, err
}
return m.HandleCommunityDescriptionMessage(signer, description, payload)
return m.HandleCommunityDescriptionMessage(signer, description, payload, shard)
}
func (m *Manager) JoinCommunity(id types.HexBytes, forceJoin bool) (*Community, error) {
@ -3294,6 +3340,20 @@ func (m *Manager) AcceptedPendingRequestsToJoinForCommunity(id types.HexBytes) (
func (m *Manager) DeclinedPendingRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) {
return m.persistence.DeclinedPendingRequestsToJoinForCommunity(id)
}
func (m *Manager) GetPubsubTopic(communityID string) (string, error) {
community, err := m.GetByIDString(communityID)
if err != nil {
return "", err
}
if community == nil {
return relay.DefaultWakuTopic, nil
}
return transport.GetPubsubTopic(community.Shard().TransportShard()), nil
}
func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) {

View File

@ -33,7 +33,7 @@ var ErrOldRequestToLeave = errors.New("old request to leave")
const OR = " OR "
const communitiesBaseQuery = `
SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description
SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description, c.shard_cluster, c.shard_index
FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id`
@ -46,9 +46,17 @@ func (p *Persistence) SaveCommunity(community *Community) error {
return err
}
var shardIndex, shardCluster *uint
if community.Shard() != nil {
index := uint(community.Shard().Index)
shardIndex = &index
cluster := uint(community.Shard().Cluster)
shardCluster = &cluster
}
_, err = p.db.Exec(`
INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill)
INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till, shard_cluster, shard_index) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill, shardCluster, shardIndex)
return err
}
@ -101,9 +109,8 @@ func (p *Persistence) ShouldHandleSyncCommunitySettings(settings *protobuf.SyncC
func (p *Persistence) ShouldHandleSyncCommunity(community *protobuf.SyncInstallationCommunity) (bool, error) {
// TODO see if there is a way to make this more elegant
// Keep the "*".
// When the test for this function fails because the table has changed we should update sync functionality
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock)
qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock)
_, err := p.scanRowToStruct(qr.Scan)
switch err {
@ -140,16 +147,28 @@ func (p *Persistence) queryCommunities(memberIdentity *ecdsa.PublicKey, query st
var publicKeyBytes, privateKeyBytes, descriptionBytes []byte
var joined, spectated, verified, muted bool
var muteTill sql.NullTime
var requestedToJoinAt sql.NullInt64
var cluster, index, requestedToJoinAt sql.NullInt64
// Community events specific fields
var eventsBytes, eventsDescriptionBytes []byte
err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes)
err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index)
if err != nil {
return nil, err
}
org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger)
var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
if err != nil {
return nil, err
}
@ -192,6 +211,7 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
var publicKeyBytes, privateKeyBytes, descriptionBytes []byte
var joined, spectated, verified, muted bool
var muteTill sql.NullTime
var cluster, index sql.NullInt64
// Request to join specific fields
var rtjID, rtjCommunityID []byte
@ -203,12 +223,25 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
err = rows.Scan(
&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill,
&rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes, &eventsDescriptionBytes)
&rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes,
&eventsDescriptionBytes, &cluster, &index)
if err != nil {
return nil, err
}
comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, p.logger)
var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
if err != nil {
return nil, err
}
@ -226,7 +259,8 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
func (p *Persistence) JoinedAndPendingCommunitiesWithRequests(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) {
query := `SELECT
c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till,
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description,
c.shard_cluster, c.shard_index
FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id
@ -243,7 +277,8 @@ WHERE c.Joined OR r.state = ?`
func (p *Persistence) DeletedCommunities(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) {
query := `SELECT
c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till,
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description,
c.shard_cluster, c.shard_index
FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id
@ -269,24 +304,36 @@ func (p *Persistence) GetByID(memberIdentity *ecdsa.PublicKey, id []byte) (*Comm
var verified bool
var muted bool
var muteTill sql.NullTime
var requestedToJoinAt sql.NullInt64
var requestedToJoinAt, cluster, index sql.NullInt64
// Community events specific fields
var eventsBytes, eventsDescriptionBytes []byte
err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes)
err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index)
if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, err
}
return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger)
var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
}
func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, publicKeyBytes, privateKeyBytes, wrappedCommunity []byte, joined,
spectated, verified, muted bool, muteTill time.Time, requestedToJoinAt uint64, eventsBytes []byte,
eventsDescriptionBytes []byte, logger *zap.Logger) (*Community, error) {
eventsDescriptionBytes []byte, cluster *uint, index *uint, logger *zap.Logger) (*Community, error) {
var privateKey *ecdsa.PrivateKey
var err error
@ -313,6 +360,14 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey,
return nil, err
}
var shard *common.Shard = nil
if cluster != nil && index != nil {
shard = &common.Shard{
Cluster: uint16(*cluster),
Index: uint16(*index),
}
}
config := Config{
PrivateKey: privateKey,
CommunityDescription: description,
@ -327,6 +382,7 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey,
Joined: joined,
Spectated: spectated,
EventsData: eventsData,
Shard: shard,
}
community, err := New(config, p.timesource)
if err != nil {

View File

@ -58,7 +58,7 @@ func (p *Persistence) scanRowToStruct(rowScan func(dest ...interface{}) error) (
func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error) {
var rows *sql.Rows
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing.
rows, err = p.db.Query(`SELECT * FROM communities_communities`)
rows, err = p.db.Query(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities`)
if err != nil {
return nil, err
}
@ -85,14 +85,12 @@ func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error
}
func (p *Persistence) getRawCommunityRow(id []byte) (*RawCommunityRow, error) {
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing.
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ?`, id)
qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ?`, id)
return p.scanRowToStruct(qr.Scan)
}
func (p *Persistence) getSyncedRawCommunity(id []byte) (*RawCommunityRow, error) {
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing.
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > 0`, id)
qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > 0`, id)
return p.scanRowToStruct(qr.Scan)
}

View File

@ -19,10 +19,11 @@ import (
"github.com/golang/protobuf/proto"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"golang.org/x/time/rate"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/event"
@ -1687,8 +1688,8 @@ func (m *Messenger) Init() error {
for _, c := range controlledCommunities {
communityFiltersToInitialize = append(communityFiltersToInitialize, transport.CommunityFilterToInitialize{
CommunityID: c.ID(),
PrivKey: c.PrivateKey(),
Shard: c.Shard().TransportShard(),
PrivKey: c.PrivateKey(),
})
}
@ -1720,6 +1721,8 @@ func (m *Messenger) Init() error {
continue
}
communityInfo := make(map[string]*communities.Community)
switch chat.ChatType {
case ChatTypePublic, ChatTypeProfile:
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: relay.DefaultWakuTopic})
@ -1728,7 +1731,17 @@ func (m *Messenger) Init() error {
if err != nil {
return err
}
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(communityID)})
community, ok := communityInfo[chat.CommunityID]
if !ok {
community, err = m.communitiesManager.GetByID(communityID)
if err != nil {
return err
}
communityInfo[chat.CommunityID] = community
}
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(community.Shard().TransportShard())})
case ChatTypeOneToOne:
pk, err := chat.PublicKey()
if err != nil {
@ -2085,13 +2098,11 @@ func (m *Messenger) dispatchMessage(ctx context.Context, rawMessage common.RawMe
return rawMessage, err
}
case ChatTypeCommunityChat:
communityID, err := hexutil.Decode(chat.CommunityID)
rawMessage.PubsubTopic, err = m.communitiesManager.GetPubsubTopic(chat.CommunityID)
if err != nil {
return rawMessage, err
}
rawMessage.PubsubTopic = transport.GetPubsubTopic(communityID)
// TODO: add grant
canPost, err := m.communitiesManager.CanPost(&m.identity.PublicKey, chat.CommunityID, chat.CommunityChatID(), nil)
if err != nil {
@ -2261,7 +2272,9 @@ func (m *Messenger) sendChatMessage(ctx context.Context, message *common.Message
if err != nil {
return nil, err
}
message.Payload = &protobuf.ChatMessage_Community{Community: wrappedCommunity}
message.Shard = community.Shard().Protobuffer()
message.ContentType = protobuf.ChatMessage_COMMUNITY
} else if len(message.AudioPath) != 0 {

View File

@ -17,6 +17,8 @@ import (
"github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
@ -81,12 +83,13 @@ func (m *Messenger) publishOrg(org *communities.Community) error {
// we don't want to wrap in an encryption layer message
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION,
PubsubTopic: org.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
}
_, err = m.sender.SendPublic(context.Background(), org.IDString(), rawMessage)
return err
}
func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessage) error {
func (m *Messenger) publishCommunityEvents(community *communities.Community, msg *communities.CommunityEventsMessage) error {
m.logger.Debug("publishing community events", zap.String("admin-id", common.PubkeyToHex(&m.identity.PublicKey)), zap.Any("event", msg))
payload, err := msg.Marshal()
@ -100,7 +103,7 @@ func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessa
// we don't want to wrap in an encryption layer message
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE,
PubsubTopic: transport.GetPubsubTopic(msg.CommunityID), // TODO: confirm if it should be sent in community pubsub topic
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
}
// TODO: resend in case of failure?
@ -301,7 +304,7 @@ func (m *Messenger) handleCommunitiesSubscription(c chan *communities.Subscripti
}
if sub.CommunityEventsMessage != nil {
err := m.publishCommunityEvents(sub.CommunityEventsMessage)
err := m.publishCommunityEvents(sub.Community, sub.CommunityEventsMessage)
if err != nil {
m.logger.Warn("failed to publish community events", zap.Error(err))
}
@ -576,12 +579,12 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse,
callOpts := &bind.CallOpts{Context: context.Background(), Pending: false}
communities, err := directory.GetCommunities(callOpts)
curatedCommunities, err := directory.GetCommunities(callOpts)
if err != nil {
return nil, err
}
var communityIDs []types.HexBytes
for _, c := range communities {
for _, c := range curatedCommunities {
communityIDs = append(communityIDs, c)
}
@ -594,11 +597,30 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse,
if err != nil {
return nil, err
}
// TODO: The curated communities smart contract should also store the community shard cluster and index
for _, c := range featuredCommunities {
response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, types.HexBytes(c).String())
// TODO: use CommunityShard instead of communityID
/*response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, communities.CommunityShard{
CommunityID: types.HexBytes(c).String(),
// Shard: c.Shard, // TODO: obtain this value
})*/
}
go m.requestCommunitiesFromMailserver(response.UnknownCommunities)
// TODO: this loop is added just to not revert the change from requestCommunitiesFromMailserver
// Once support for shards is added in the contract, just pass the `response.UnknownCommunities` directly to
// the function
var unknownCommunities []communities.CommunityShard
for _, u := range response.UnknownCommunities {
unknownCommunities = append(unknownCommunities, communities.CommunityShard{
CommunityID: u,
})
}
go m.requestCommunitiesFromMailserver(unknownCommunities)
return response, nil
}
@ -625,8 +647,8 @@ func (m *Messenger) initCommunityChats(community *communities.Community) ([]*Cha
if community.IsControlNode() {
// Init the community filter so we can receive messages on the community
communityFilters, err := m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: community.ID(),
PrivKey: community.PrivateKey(),
Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(),
}})
if err != nil {
@ -700,14 +722,25 @@ func (m *Messenger) JoinCommunity(ctx context.Context, communityID types.HexByte
return mr, nil
}
func (m *Messenger) subscribeToCommunityShard(communityID []byte) error {
// TODO: store private key and topic
// TODO: determine pubsub topic and public key for community
// TODO: this should probably be moved completely to transport once pubsub topic logic is implemented
func (m *Messenger) subscribeToCommunityShard(communityID []byte, shard *common.Shard) error {
if m.transport.WakuVersion() != 2 {
return nil
}
pubsubTopic := transport.GetPubsubTopic(communityID)
// var communityPubKey *ecdsa.PublicKey
return m.transport.SubscribeToPubsubTopic(pubsubTopic, nil)
// TODO: this should probably be moved completely to transport once pubsub topic logic is implemented
pubsubTopic := transport.GetPubsubTopic(shard.TransportShard())
privK, err := m.transport.RetrievePubsubTopicKey(pubsubTopic)
if err != nil {
return err
}
var pubK *ecdsa.PublicKey
if privK != nil {
pubK = &privK.PublicKey
}
return m.transport.SubscribeToPubsubTopic(pubsubTopic, pubK)
}
func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexBytes, forceJoin bool) (*MessengerResponse, error) {
@ -733,7 +766,7 @@ func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexByte
return nil, err
}
if err = m.subscribeToCommunityShard(communityID); err != nil {
if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err
}
}
@ -787,7 +820,7 @@ func (m *Messenger) SpectateCommunity(communityID types.HexBytes) (*MessengerRes
response.AddCommunity(community)
if err = m.subscribeToCommunityShard(community.ID()); err != nil {
if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err
}
@ -1064,7 +1097,7 @@ func (m *Messenger) RequestToJoinCommunity(request *requests.RequestToJoinCommun
CommunityID: community.ID(),
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_JOIN,
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic.
}
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1218,7 +1251,7 @@ func (m *Messenger) EditSharedAddressesForCommunity(request *requests.EditShared
CommunityID: community.ID(),
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES,
PubsubTopic: community.PubsubTopic(),
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
}
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1382,7 +1415,7 @@ func (m *Messenger) CancelRequestToJoinCommunity(request *requests.CancelRequest
CommunityID: community.ID(),
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN,
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be send in community pubsub topic
PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic.
}
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1461,12 +1494,22 @@ func (m *Messenger) AcceptRequestToJoinCommunity(request *requests.AcceptRequest
return nil, err
}
var key *ecdsa.PrivateKey
if m.transport.WakuVersion() == 2 {
key, err = m.transport.RetrievePubsubTopicKey(community.PubsubTopic())
if err != nil {
return nil, err
}
}
requestToJoinResponseProto := &protobuf.CommunityRequestToJoinResponse{
Clock: community.Clock(),
Accepted: true,
CommunityId: community.ID(),
Community: community.Description(),
Grant: grant,
Clock: community.Clock(),
Accepted: true,
CommunityId: community.ID(),
Community: community.Description(),
Grant: grant,
ProtectedTopicPrivateKey: crypto.FromECDSA(key),
Shard: community.Shard().Protobuffer(),
}
if m.torrentClientReady() && m.communitiesManager.TorrentFileExists(community.IDString()) {
@ -1654,12 +1697,17 @@ func (m *Messenger) LeaveCommunity(communityID types.HexBytes) (*MessengerRespon
return nil, err
}
community, err := m.communitiesManager.GetByID(communityID)
if err != nil {
return nil, err
}
rawMessage := common.RawMessage{
Payload: payload,
CommunityID: communityID,
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_LEAVE,
PubsubTopic: transport.GetPubsubTopic(communityID), // TODO: confirm if it should be sent in the community pubsub topic
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in the community pubsub topic
}
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
if err != nil {
@ -1912,14 +1960,14 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef
return nil, err
}
if err = m.subscribeToCommunityShard(community.ID()); err != nil {
if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err
}
// Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: community.ID(),
PrivKey: community.PrivateKey(),
Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(),
}})
if err != nil {
return nil, err
@ -1966,6 +2014,95 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef
return response, nil
}
func (m *Messenger) SetCommunityShard(request *requests.SetCommunityShard) (*MessengerResponse, error) {
if err := request.Validate(); err != nil {
return nil, err
}
community, err := m.communitiesManager.SetShard(request.CommunityID, request.Shard)
if err != nil {
return nil, err
}
var topicPrivKey *ecdsa.PrivateKey
if request.PrivateKey != nil {
topicPrivKey, err = crypto.ToECDSA(*request.PrivateKey)
} else {
topicPrivKey, err = crypto.GenerateKey()
}
if err != nil {
return nil, err
}
err = m.UpdateCommunityFilters(community, topicPrivKey)
if err != nil {
return nil, err
}
err = m.SendCommunityShardKey(community, community.GetMemberPubkeys())
if err != nil {
return nil, err
}
response := &MessengerResponse{}
response.AddProtectedTopic(community.PubsubTopic(), topicPrivKey)
return response, nil
}
func (m *Messenger) UpdateCommunityFilters(community *communities.Community, privKey *ecdsa.PrivateKey) error {
if m.transport.WakuVersion() == 2 && privKey != nil {
if err := m.transport.StorePubsubTopicKey(community.PubsubTopic(), privKey); err != nil {
return err
}
}
publicFiltersToInit := make([]transport.FiltersToInitialize, 0, len(community.DefaultFilters())+len(community.Chats()))
for _, df := range community.DefaultFilters() {
_, err := m.transport.RemoveFilterByChatID(df.ChatID)
if err != nil {
return err
}
publicFiltersToInit = append(publicFiltersToInit, df)
}
for chatID := range community.Chats() {
communityChatID := community.IDString() + chatID
_, err := m.transport.RemoveFilterByChatID(communityChatID)
if err != nil {
return err
}
publicFiltersToInit = append(publicFiltersToInit, transport.FiltersToInitialize{ChatID: communityChatID, PubsubTopic: community.PubsubTopic()})
}
_, err := m.transport.InitPublicFilters(publicFiltersToInit)
if err != nil {
return err
}
// Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(),
}})
if err != nil {
return err
}
// Init the default community filters
_, err = m.transport.InitPublicFilters(publicFiltersToInit)
if err != nil {
return err
}
if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return err
}
return nil
}
func (m *Messenger) CreateCommunityTokenPermission(request *requests.CreateCommunityTokenPermission) (*MessengerResponse, error) {
if err := request.Validate(); err != nil {
return nil, err
@ -2147,7 +2284,7 @@ func (m *Messenger) ImportCommunity(ctx context.Context, key *ecdsa.PrivateKey)
return nil, err
}
_, err = m.RequestCommunityInfoFromMailserver(community.IDString(), false)
_, err = m.RequestCommunityInfoFromMailserver(community.IDString(), community.Shard(), false)
if err != nil {
// TODO In the future we should add a mechanism to re-apply next steps (adding owner, joining)
// if there is no connection with mailserver. Otherwise changes will be overwritten.
@ -2289,6 +2426,48 @@ func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string)
return response, nil
}
func (m *Messenger) SendCommunityShardKey(community *communities.Community, pubkeys []*ecdsa.PublicKey) error {
if m.transport.WakuVersion() != 2 {
return nil
}
if !community.IsControlNode() {
return nil
}
key, err := m.transport.RetrievePubsubTopicKey(community.PubsubTopic())
if err != nil {
return err
}
if key == nil {
return nil // No community shard key available
}
communityShardKey := &protobuf.CommunityShardKey{
Clock: m.getTimesource().GetCurrentTime(),
CommunityId: community.ID(),
PrivateKey: crypto.FromECDSA(key),
Shard: community.Shard().Protobuffer(),
}
encodedMessage, err := proto.Marshal(communityShardKey)
if err != nil {
return err
}
rawMessage := common.RawMessage{
Recipients: pubkeys,
ResendAutomatically: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY,
Payload: encodedMessage,
}
_, err = m.sender.SendPubsubTopicKey(context.Background(), &rawMessage)
return err
}
func (m *Messenger) UnbanUserFromCommunity(request *requests.UnbanUserFromCommunity) (*MessengerResponse, error) {
community, err := m.communitiesManager.UnbanUserFromCommunity(request)
if err != nil {
@ -2375,7 +2554,7 @@ func (m *Messenger) GetCommunityIDFromKey(communityKey string) string {
// RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. It waits until it has the community before returning it.
// If useDatabase is true, it searches for community in database and does not request mailserver.
func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, useDatabase bool) (*communities.Community, error) {
func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, shard *common.Shard, useDatabase bool) (*communities.Community, error) {
communityID := m.GetCommunityIDFromKey(privateOrPublicKey)
if useDatabase {
community, err := m.findCommunityInfoFromDB(communityID)
@ -2387,12 +2566,12 @@ func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string
}
}
return m.requestCommunityInfoFromMailserver(communityID, true)
return m.requestCommunityInfoFromMailserver(communityID, shard, true)
}
// RequestCommunityInfoFromMailserverAsync installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler
func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string) error {
func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string, shard *common.Shard) error {
communityID := m.GetCommunityIDFromKey(privateOrPublicKey)
community, err := m.findCommunityInfoFromDB(communityID)
@ -2403,13 +2582,13 @@ func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey s
m.config.messengerSignalsHandler.CommunityInfoFound(community)
return nil
}
_, err = m.requestCommunityInfoFromMailserver(communityID, false)
_, err = m.requestCommunityInfoFromMailserver(communityID, shard, false)
return err
}
// RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler
func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitForResponse bool) (*communities.Community, error) {
func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, shard *common.Shard, waitForResponse bool) (*communities.Community, error) {
m.requestedCommunitiesLock.Lock()
defer m.requestedCommunitiesLock.Unlock()
@ -2417,18 +2596,13 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
return nil, nil
}
id, err := hexutil.Decode(communityID)
if err != nil {
return nil, err
}
//If filter wasn't installed we create it and remember for deinstalling after
//response received
filter := m.transport.FilterByChatID(communityID)
if filter == nil {
filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{
ChatID: communityID,
PubsubTopic: transport.GetPubsubTopic(id),
PubsubTopic: transport.GetPubsubTopic(shard.TransportShard()),
}})
if err != nil {
return nil, fmt.Errorf("Can't install filter for community: %v", err)
@ -2448,7 +2622,7 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
to := uint32(m.transport.GetCurrentTime() / 1000)
from := to - oneMonthInSeconds
_, err = m.performMailserverRequest(func() (*MessengerResponse, error) {
_, err := m.performMailserverRequest(func() (*MessengerResponse, error) {
batch := MailserverBatch{From: from, To: to, Topics: []types.TopicType{filter.ContentTopic}}
m.logger.Info("Requesting historic")
err := m.processMailserverBatch(batch)
@ -2485,28 +2659,23 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
// RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler
func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
func (m *Messenger) requestCommunitiesFromMailserver(communities []communities.CommunityShard) {
m.requestedCommunitiesLock.Lock()
defer m.requestedCommunitiesLock.Unlock()
var topics []types.TopicType
for _, communityID := range communityIDs {
if _, ok := m.requestedCommunities[communityID]; ok {
continue
}
id, err := hexutil.Decode(communityID)
if err != nil {
for _, c := range communities {
if _, ok := m.requestedCommunities[c.CommunityID]; ok {
continue
}
//If filter wasn't installed we create it and remember for deinstalling after
//response received
filter := m.transport.FilterByChatID(communityID)
filter := m.transport.FilterByChatID(c.CommunityID)
if filter == nil {
filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{
ChatID: communityID,
PubsubTopic: transport.GetPubsubTopic(id),
ChatID: c.CommunityID,
PubsubTopic: transport.GetPubsubTopic(c.Shard.TransportShard()),
}})
if err != nil {
m.logger.Error("Can't install filter for community", zap.Error(err))
@ -2517,10 +2686,10 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
continue
}
filter = filters[0]
m.requestedCommunities[communityID] = filter
m.requestedCommunities[c.CommunityID] = filter
} else {
//we don't remember filter id associated with community because it was already installed
m.requestedCommunities[communityID] = nil
m.requestedCommunities[c.CommunityID] = nil
}
topics = append(topics, filter.ContentTopic)
}
@ -2549,8 +2718,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
select {
case <-time.After(200 * time.Millisecond):
allLoaded := true
for _, c := range communityIDs {
community, err := m.communitiesManager.GetByIDString(c)
for _, c := range communities {
community, err := m.communitiesManager.GetByIDString(c.CommunityID)
if err != nil {
m.logger.Error("Error loading community", zap.Error(err))
break
@ -2571,8 +2740,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
}
}
for _, c := range communityIDs {
m.forgetCommunityRequest(c)
for _, c := range communities {
m.forgetCommunityRequest(c.CommunityID)
}
}
@ -2622,7 +2791,7 @@ func (m *Messenger) passStoredCommunityInfoToSignalHandler(communityID string) {
// handleCommunityDescription handles an community description
func (m *Messenger) handleCommunityDescription(state *ReceivedMessageState, signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, rawPayload []byte) error {
communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload)
communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload, nil)
if err != nil {
return err
}
@ -2764,7 +2933,63 @@ func (m *Messenger) HandleCommunityEventsMessageRejected(state *ReceivedMessageS
return nil
}
err = m.publishCommunityEvents(reapplyEventsMessage)
community, err := m.communitiesManager.GetByID(reapplyEventsMessage.CommunityID)
if err != nil {
return err
}
err = m.publishCommunityEvents(community, reapplyEventsMessage)
if err != nil {
return err
}
return nil
}
// HandleCommunityShardKey handles the private keys for the community shards
func (m *Messenger) HandleCommunityShardKey(state *ReceivedMessageState, message *protobuf.CommunityShardKey, statusMessage *v1protocol.StatusMessage) error {
// TODO: @cammellos: This is risky, it does not seem to support out of order messages
// (say that the community changes shards twice, last one wins, but we don't check clock
// etc)
// TODO: @cammellos: getbyid returns nil if the community is not in the db, so we need to handle it
community, err := m.communitiesManager.GetByID(message.CommunityId)
if err != nil {
return err
}
// If we haven't joined the community, nothing to do
if !community.Joined() {
return nil
}
signer := state.CurrentMessageState.PublicKey
if signer == nil {
return errors.New("signer can't be nil")
}
if !community.IsMemberOwner(signer) {
return communities.ErrNotAuthorized
}
return m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(message.Shard), message.PrivateKey)
}
func (m *Messenger) handleCommunityShardAndFiltersFromProto(community *communities.Community, shard *common.Shard, privateKeyBytes []byte) error {
err := m.communitiesManager.UpdateShard(community, shard)
if err != nil {
return err
}
var privKey *ecdsa.PrivateKey = nil
if privateKeyBytes != nil {
privKey, err = crypto.ToECDSA(privateKeyBytes)
if err != nil {
return err
}
}
err = m.UpdateCommunityFilters(community, privKey)
if err != nil {
return err
}
@ -4265,8 +4490,8 @@ func (m *Messenger) RequestImportDiscordCommunity(request *requests.ImportDiscor
// Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: discordCommunity.ID(),
PrivKey: discordCommunity.PrivateKey(),
Shard: discordCommunity.Shard().TransportShard(),
PrivKey: discordCommunity.PrivateKey(),
}})
if err != nil {
m.cleanUpImport(communityID)

View File

@ -8,9 +8,10 @@ import (
"time"
"github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/deprecation"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types"

View File

@ -1570,6 +1570,16 @@ func (m *Messenger) HandleCommunityRequestToJoinResponse(state *ReceivedMessageS
}
if requestToJoinResponseProto.Accepted {
community, err := m.communitiesManager.GetByID(requestToJoinResponseProto.CommunityId)
if err != nil {
return err
}
err = m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(requestToJoinResponseProto.Shard), requestToJoinResponseProto.ProtectedTopicPrivateKey)
if err != nil {
return err
}
response, err := m.JoinCommunity(context.Background(), requestToJoinResponseProto.CommunityId, false)
if err != nil {
return err
@ -1664,8 +1674,8 @@ func (m *Messenger) HandleCommunityRequestToLeave(state *ReceivedMessageState, r
}
// handleWrappedCommunityDescriptionMessage handles a wrapped community description
func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte) (*communities.CommunityResponse, error) {
return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload)
func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*communities.CommunityResponse, error) {
return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload, shard)
}
func (m *Messenger) handleEditMessage(state *ReceivedMessageState, editMessage EditMessage) error {
@ -2265,7 +2275,7 @@ func (m *Messenger) handleChatMessage(state *ReceivedMessageState, forceSeen boo
if receivedMessage.ContentType == protobuf.ChatMessage_COMMUNITY {
m.logger.Debug("Handling community content type")
communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity())
communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity(), common.ShardFromProtobuff(receivedMessage.Shard))
if err != nil {
return err
}

View File

@ -226,6 +226,9 @@ func (m *Messenger) dispatchToHandler(messageState *ReceivedMessageState, protoB
case protobuf.ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE:
return m.handleCommunityPrivilegedUserSyncMessageProtobuf(messageState, protoBytes, msg, filter)
case protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY:
return m.handleCommunityShardKeyProtobuf(messageState, protoBytes, msg, filter)
default:
m.logger.Info("protobuf type not found", zap.String("type", string(msg.Type)))
return errors.New("protobuf type not found")
@ -1608,3 +1611,21 @@ func (m *Messenger) handleCommunityPrivilegedUserSyncMessageProtobuf(messageStat
}
func (m *Messenger) handleCommunityShardKeyProtobuf(messageState *ReceivedMessageState, protoBytes []byte, msg *v1protocol.StatusMessage, filter transport.Filter) error {
m.logger.Info("handling CommunityShardKey")
p := &protobuf.CommunityShardKey{}
err := proto.Unmarshal(protoBytes, p)
if err != nil {
return err
}
m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, messageState.CurrentMessageState.Contact.ID, filter.ContentTopic, filter.ChatID, msg.Type, p)
return m.HandleCommunityShardKey(messageState, p, msg)
}

View File

@ -9,9 +9,10 @@ import (
"time"
"github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/connection"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types"

View File

@ -1,8 +1,11 @@
package protocol
import (
"crypto/ecdsa"
"encoding/json"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/status-im/status-go/eth-node/crypto"
ensservice "github.com/status-im/status-go/services/ens"
"github.com/status-im/status-go/services/browsers"
@ -34,6 +37,11 @@ type ClearedHistory struct {
ClearedAt uint64 `json:"clearedAt"`
}
type ProtectedTopic struct {
PubsubTopic string `json:"pubsubTopic"`
PublicKey string `json:"publicKey"`
}
type MessengerResponse struct {
Contacts []*Contact
Installations []*multidevice.Installation
@ -62,6 +70,7 @@ type MessengerResponse struct {
removedMessages map[string]*RemovedMessage
communities map[string]*communities.Community
communitiesSettings map[string]*communities.CommunitySettings
protectedTopics map[string]*ecdsa.PrivateKey
activityCenterNotifications map[string]*ActivityCenterNotification
activityCenterState *ActivityCenterState
messages map[string]*common.Message
@ -103,6 +112,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) {
Notifications []*localnotifications.Notification `json:"notifications"`
Communities []*communities.Community `json:"communities,omitempty"`
CommunitiesSettings []*communities.CommunitySettings `json:"communitiesSettings,omitempty"`
ProtectedTopics []ProtectedTopic `json:"protectedTopics,omitempty"`
ActivityCenterNotifications []*ActivityCenterNotification `json:"activityCenterNotifications,omitempty"`
ActivityCenterState *ActivityCenterState `json:"activityCenterState,omitempty"`
CurrentStatus *UserStatus `json:"currentStatus,omitempty"`
@ -144,6 +154,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) {
Chats: r.Chats(),
Communities: r.Communities(),
CommunitiesSettings: r.CommunitiesSettings(),
ProtectedTopics: r.ProtectedTopics(),
RemovedChats: r.RemovedChats(),
RemovedMessages: r.RemovedMessages(),
ClearedHistories: r.ClearedHistories(),
@ -211,6 +222,17 @@ func (r *MessengerResponse) CommunitiesSettings() []*communities.CommunitySettin
return settings
}
func (r *MessengerResponse) ProtectedTopics() []ProtectedTopic {
protectedTopics := make([]ProtectedTopic, 0, len(r.protectedTopics))
for pubsubTopic, privKey := range r.protectedTopics {
protectedTopics = append(protectedTopics, ProtectedTopic{
PubsubTopic: pubsubTopic,
PublicKey: hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey)),
})
}
return protectedTopics
}
func (r *MessengerResponse) Notifications() []*localnotifications.Notification {
var notifications []*localnotifications.Notification
for _, n := range r.notifications {
@ -355,6 +377,14 @@ func (r *MessengerResponse) AddRequestsToJoinCommunity(requestsToJoin []*communi
r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestsToJoin...)
}
func (r *MessengerResponse) AddProtectedTopic(pubsubTopic string, privKey *ecdsa.PrivateKey) {
if r.protectedTopics == nil {
r.protectedTopics = make(map[string]*ecdsa.PrivateKey)
}
r.protectedTopics[pubsubTopic] = privKey
}
func (r *MessengerResponse) AddRequestToJoinCommunity(requestToJoin *communities.RequestToJoin) {
r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestToJoin)
}

View File

@ -44,6 +44,7 @@ type URLDataResponse struct {
Community CommunityURLData `json:"community"`
Channel CommunityChannelURLData `json:"channel"`
Contact ContactURLData `json:"contact"`
Shard *common.Shard `json:"shard,omitempty"`
}
const baseShareURL = "https://status.app"
@ -119,6 +120,7 @@ func (m *Messenger) parseCommunityURLWithChatKey(urlData string) (*URLDataRespon
return &URLDataResponse{
Community: m.prepareCommunityData(community),
Shard: community.Shard(),
}, nil
}
@ -138,6 +140,7 @@ func (m *Messenger) prepareEncodedCommunityData(community *communities.Community
urlDataProto := &protobuf.URLData{
Content: communityData,
Shard: community.Shard().Protobuffer(),
}
urlData, err := proto.Marshal(urlDataProto)
@ -208,6 +211,7 @@ func (m *Messenger) parseCommunityURLWithData(data string, chatKey string) (*URL
TagIndices: communityProto.TagIndices,
CommunityID: types.EncodeHex(communityID),
},
Shard: common.ShardFromProtobuff(urlDataProto.Shard),
}, nil
}
@ -274,6 +278,7 @@ func (m *Messenger) parseCommunityChannelURLWithChatKey(channelID string, public
return &URLDataResponse{
Community: m.prepareCommunityData(community),
Channel: m.prepareCommunityChannelData(channel),
Shard: community.Shard(),
}, nil
}
@ -302,6 +307,7 @@ func (m *Messenger) prepareEncodedCommunityChannelData(community *communities.Co
urlDataProto := &protobuf.URLData{
Content: channelData,
Shard: community.Shard().Protobuffer(),
}
urlData, err := proto.Marshal(urlDataProto)
@ -392,6 +398,7 @@ func (m *Messenger) parseCommunityChannelURLWithData(data string, chatKey string
Color: channelProto.Color,
ChannelUUID: channelProto.Uuid,
},
Shard: common.ShardFromProtobuff(urlDataProto.Shard),
}, nil
}

View File

@ -101,6 +101,7 @@
// 1689266326_create_communities_events_table.up.sql (164B)
// 1689931300_add_community_tokens_deployer_and_priv_level.up.sql (156B)
// 1693311881_add_unfurled_links_to_message_edits.up.sql (64B)
// 1693311981_community_shard.up.sql (156B)
// README.md (554B)
// doc.go (850B)
@ -186,7 +187,7 @@ func _000001_initDownDbSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}}
return a, nil
}
@ -206,7 +207,7 @@ func _000001_initUpDbSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}}
return a, nil
}
@ -226,7 +227,7 @@ func _000002_add_last_ens_clock_valueUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}}
return a, nil
}
@ -246,7 +247,7 @@ func _1586358095_add_replaceUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}}
return a, nil
}
@ -266,7 +267,7 @@ func _1588665364_add_image_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}}
return a, nil
}
@ -286,7 +287,7 @@ func _1589365189_add_pow_targetUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}}
return a, nil
}
@ -306,7 +307,7 @@ func _1591277220_add_index_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}}
return a, nil
}
@ -326,7 +327,7 @@ func _1593087212_add_mute_chat_and_raw_message_fieldsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}}
return a, nil
}
@ -346,7 +347,7 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}}
return a, nil
}
@ -366,7 +367,7 @@ func _1595865249_create_emoji_reactions_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}}
return a, nil
}
@ -386,7 +387,7 @@ func _1596805115_create_group_chat_invitations_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}}
return a, nil
}
@ -406,7 +407,7 @@ func _1597322655_add_invitation_admin_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}}
return a, nil
}
@ -426,7 +427,7 @@ func _1597757544_add_nicknameUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}}
return a, nil
}
@ -446,7 +447,7 @@ func _1598955122_add_mentionsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}}
return a, nil
}
@ -466,7 +467,7 @@ func _1599641390_add_emoji_reactions_indexUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}}
return a, nil
}
@ -486,7 +487,7 @@ func _1599720851_add_seen_index_remove_long_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}}
return a, nil
}
@ -506,7 +507,7 @@ func _1603198582_add_profile_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}}
return a, nil
}
@ -526,7 +527,7 @@ func _1603816533_add_linksUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}}
return a, nil
}
@ -546,7 +547,7 @@ func _1603888149_create_chat_identity_last_published_tableUpSql() (*asset, error
return nil, err
}
info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}}
return a, nil
}
@ -566,7 +567,7 @@ func _1605075346_add_communitiesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}}
return a, nil
}
@ -586,7 +587,7 @@ func _1610117927_add_message_cacheUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}}
return a, nil
}
@ -606,7 +607,7 @@ func _1610959908_add_dont_wrap_to_raw_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}}
return a, nil
}
@ -626,7 +627,7 @@ func _1610960912_add_send_on_personal_topicUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}}
return a, nil
}
@ -646,7 +647,7 @@ func _1612870480_add_datasync_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}}
return a, nil
}
@ -666,7 +667,7 @@ func _1614152139_add_communities_request_to_joinUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}}
return a, nil
}
@ -686,7 +687,7 @@ func _1615374373_add_confirmationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}}
return a, nil
}
@ -706,7 +707,7 @@ func _1617694931_add_notification_centerUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}}
return a, nil
}
@ -726,7 +727,7 @@ func _1618923660_create_pin_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}}
return a, nil
}
@ -746,7 +747,7 @@ func _1619094007_add_joined_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}}
return a, nil
}
@ -766,7 +767,7 @@ func _1619099821_add_last_synced_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}}
return a, nil
}
@ -786,7 +787,7 @@ func _1621933219_add_mentionedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}}
return a, nil
}
@ -806,7 +807,7 @@ func _1622010048_add_unviewed_mentions_countUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}}
return a, nil
}
@ -826,7 +827,7 @@ func _1622061278_add_message_activity_center_notification_fieldUpSql() (*asset,
return nil, err
}
info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}}
return a, nil
}
@ -846,7 +847,7 @@ func _1622464518_set_synced_to_fromUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}}
return a, nil
}
@ -866,7 +867,7 @@ func _1622464519_add_chat_descriptionUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}}
return a, nil
}
@ -886,7 +887,7 @@ func _1622622253_add_pinned_by_to_pin_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}}
return a, nil
}
@ -906,7 +907,7 @@ func _1623938329_add_author_activity_center_notification_fieldUpSql() (*asset, e
return nil, err
}
info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}}
return a, nil
}
@ -926,7 +927,7 @@ func _1623938330_add_edit_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}}
return a, nil
}
@ -946,7 +947,7 @@ func _1624978434_add_muted_communityUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}}
return a, nil
}
@ -966,7 +967,7 @@ func _1625018910_add_repply_message_activity_center_notification_fieldUpSql() (*
return nil, err
}
info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}}
return a, nil
}
@ -986,7 +987,7 @@ func _1625762506_add_deleted_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}}
return a, nil
}
@ -1006,7 +1007,7 @@ func _1627388946_add_communities_synced_atUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}}
return a, nil
}
@ -1026,7 +1027,7 @@ func _1628280060_createUsermessagesIndexSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}}
return a, nil
}
@ -1046,7 +1047,7 @@ func _1632303896_modify_contacts_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}}
return a, nil
}
@ -1066,7 +1067,7 @@ func _1633349838_add_emoji_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}}
return a, nil
}
@ -1086,7 +1087,7 @@ func _1634831235_add_highlight_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}}
return a, nil
}
@ -1106,7 +1107,7 @@ func _1634896007_add_last_updated_locally_and_removedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}}
return a, nil
}
@ -1126,7 +1127,7 @@ func _1635840039_add_clock_read_at_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}}
return a, nil
}
@ -1146,7 +1147,7 @@ func _1637852321_add_received_invitation_admin_column_in_chatsUpSql() (*asset, e
return nil, err
}
info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}}
return a, nil
}
@ -1166,7 +1167,7 @@ func _1645034601_display_nameUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}}
return a, nil
}
@ -1186,7 +1187,7 @@ func _1645034602_add_mutual_contact_requestUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}}
return a, nil
}
@ -1206,7 +1207,7 @@ func _1650373957_add_contact_request_stateUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}}
return a, nil
}
@ -1226,7 +1227,7 @@ func _1656958989_contact_verificationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}}
return a, nil
}
@ -1246,7 +1247,7 @@ func _1658236268_add_discord_message_authors_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}}
return a, nil
}
@ -1266,7 +1267,7 @@ func _1659619997_add_discord_messages_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}}
return a, nil
}
@ -1286,7 +1287,7 @@ func _1660226788_create_chat_identity_social_linksUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}}
return a, nil
}
@ -1306,7 +1307,7 @@ func _1660226789_add_walletconnectsessions_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}}
return a, nil
}
@ -1326,7 +1327,7 @@ func _1661242854_add_communities_requests_to_leaveUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}}
return a, nil
}
@ -1346,7 +1347,7 @@ func _1662044232_add_chat_imageUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}}
return a, nil
}
@ -1366,7 +1367,7 @@ func _1662106895_add_chat_first_message_timestampUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}}
return a, nil
}
@ -1386,7 +1387,7 @@ func _1662723928_add_discord_author_image_fieldsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}}
return a, nil
}
@ -1406,7 +1407,7 @@ func _1664195977_add_deleted_for_mesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}}
return a, nil
}
@ -1426,7 +1427,7 @@ func _1664367420_add_discord_attachments_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}}
return a, nil
}
@ -1446,7 +1447,7 @@ func _1665079662_add_spectated_column_in_communitiesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}}
return a, nil
}
@ -1466,7 +1467,7 @@ func _1665479047_add_community_id_in_notificationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}}
return a, nil
}
@ -1486,7 +1487,7 @@ func _1665484435_add_encrypted_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}}
return a, nil
}
@ -1506,7 +1507,7 @@ func _1665560200_add_contact_verification_individualUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}}
return a, nil
}
@ -1526,7 +1527,7 @@ func _1670921937_add_album_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0664), modTime: time.Unix(1671559305, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}}
return a, nil
}
@ -1546,7 +1547,7 @@ func _1673373000_add_repliedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0664), modTime: time.Unix(1673398499, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}}
return a, nil
}
@ -1566,7 +1567,7 @@ func _1673428910_add_image_width_heightUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0664), modTime: time.Unix(1673527384, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}}
return a, nil
}
@ -1586,7 +1587,7 @@ func _1674210659_add_contact_request_local_clockUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}}
return a, nil
}
@ -1606,7 +1607,7 @@ func _1675212323_add_deleted_byUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}}
return a, nil
}
@ -1626,7 +1627,7 @@ func _1675247084_add_activity_center_statesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0664), modTime: time.Unix(1676987564, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}}
return a, nil
}
@ -1646,7 +1647,7 @@ func _1675272329_fix_protocol_migrationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}}
return a, nil
}
@ -1666,7 +1667,7 @@ func _1676998418_fix_activity_center_migrationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0664), modTime: time.Unix(1677251785, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}}
return a, nil
}
@ -1686,7 +1687,7 @@ func _1677278861_add_deleted_column_to_activity_center_notifications_tableUpSql(
return nil, err
}
info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}}
return a, nil
}
@ -1706,7 +1707,7 @@ func _1677486338_add_community_tokens_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}}
return a, nil
}
@ -1726,7 +1727,7 @@ func _1678292329_add_collapsed_categoriesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}}
return a, nil
}
@ -1746,7 +1747,7 @@ func _1678800760_add_index_to_raw_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}}
return a, nil
}
@ -1766,7 +1767,7 @@ func _1678877478_add_communities_requests_to_join_revealed_addresses_tableUpSql(
return nil, err
}
info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}}
return a, nil
}
@ -1786,7 +1787,7 @@ func _1679326850_add_community_token_ownersUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0664), modTime: time.Unix(1680094975, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}}
return a, nil
}
@ -1806,7 +1807,7 @@ func _1680011500_add_album_images_countUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}}
return a, nil
}
@ -1826,7 +1827,7 @@ func _1680114896_add_index_on_album_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}}
return a, nil
}
@ -1846,7 +1847,7 @@ func _1681655289_add_mute_tillUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}}
return a, nil
}
@ -1866,7 +1867,7 @@ func _1681934966_add_index_response_toUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}}
return a, nil
}
@ -1886,7 +1887,7 @@ func _1682528339_add_index_user_messages_unseenUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0664), modTime: time.Unix(1683581871, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}}
return a, nil
}
@ -1906,7 +1907,7 @@ func _1683707289_recreate_deleted_for_mesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}}
return a, nil
}
@ -1926,7 +1927,7 @@ func _1683725607_mark_discord_messages_as_seenUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}}
return a, nil
}
@ -1946,7 +1947,7 @@ func _1684174617_add_url_previews_to_user_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}}
return a, nil
}
@ -1966,7 +1967,7 @@ func _1684175608_add_token_balancesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}}
return a, nil
}
@ -1986,7 +1987,7 @@ func _1684979808_sync_activity_center_notificationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}}
return a, nil
}
@ -2006,7 +2007,7 @@ func _1685383829_add_communities_mute_tillUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbf, 0x58, 0x96, 0xe5, 0x66, 0xcb, 0xde, 0xed, 0x76, 0xb8, 0x5a, 0x86, 0x81, 0x9a, 0x60, 0x51, 0x12, 0x37, 0x54, 0x9a, 0x36, 0x3e, 0xd1, 0x4a, 0xbe, 0x9a, 0xab, 0x20, 0x7f, 0x1d, 0xf4, 0x73}}
return a, nil
}
@ -2026,7 +2027,7 @@ func _1685964183_add_chainids_to_revealed_addressesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xb5, 0xa8, 0xd7, 0xad, 0x9c, 0x54, 0xa5, 0xe9, 0xdb, 0x42, 0x2d, 0xd0, 0xd7, 0x22, 0x1, 0x93, 0xf3, 0x4f, 0x53, 0xf7, 0x1e, 0xbe, 0x4b, 0xac, 0xc7, 0x63, 0x15, 0xdf, 0xe0, 0x6, 0xf8}}
return a, nil
}
@ -2046,7 +2047,7 @@ func _1687370421_add_communities_muted_till_newUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0x73, 0x96, 0x1d, 0xc8, 0x3e, 0xca, 0xf5, 0xdc, 0xe3, 0xac, 0x3f, 0x9c, 0xc3, 0x67, 0x12, 0x9c, 0x19, 0x1, 0x4, 0x2b, 0xea, 0x6b, 0xe1, 0x59, 0x59, 0x89, 0x3d, 0xef, 0x4a, 0x6e, 0xbe}}
return a, nil
}
@ -2066,7 +2067,7 @@ func _1687416607_add_communities_check_channel_permission_responses_tableUpSql()
return nil, err
}
info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6, 0x3, 0x1a, 0xde, 0x9d, 0xbc, 0x50, 0x9d, 0xf1, 0x6d, 0x5a, 0x1c, 0x28, 0x92, 0x19, 0x89, 0x76, 0x4e, 0x8b, 0x60, 0xa9, 0xf, 0xe9, 0x76, 0xf1, 0xee, 0x75, 0x92, 0xbd, 0xda, 0x72}}
return a, nil
}
@ -2086,7 +2087,7 @@ func _1687856939_add_community_tokens_decimalsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x76, 0x42, 0x70, 0xc9, 0x7b, 0x16, 0xf6, 0xfe, 0x7, 0x1c, 0x99, 0xe5, 0x38, 0xfd, 0xa0, 0x3b, 0x93, 0x40, 0xbc, 0x66, 0xc2, 0xd1, 0xdd, 0xe9, 0xc7, 0xbf, 0xae, 0x36, 0xcc, 0x46, 0x57}}
return a, nil
}
@ -2106,7 +2107,7 @@ func _1687959987_modify_community_tokens_supply_as_stringUpSql() (*asset, error)
return nil, err
}
info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x57, 0x89, 0xbf, 0x9b, 0xed, 0x9b, 0x18, 0x3f, 0x84, 0xb5, 0x3c, 0x78, 0x40, 0x60, 0xea, 0x33, 0x26, 0x50, 0x3, 0xda, 0x28, 0x92, 0xd3, 0xb6, 0xff, 0x40, 0xa7, 0x19, 0x2, 0xa7, 0x17, 0xf9}}
return a, nil
}
@ -2126,7 +2127,7 @@ func _1689258900_add_airdrop_address_to_revealed_addressesUpSql() (*asset, error
return nil, err
}
info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7e, 0xaf, 0x5c, 0xd, 0xe5, 0x1e, 0x67, 0x1a, 0x6d, 0xd, 0x28, 0x20, 0x7a, 0x1a, 0x45, 0x6e, 0xba, 0x80, 0x91, 0xb0, 0xd6, 0xfd, 0xc2, 0xb9, 0x42, 0x5c, 0x8d, 0x6e, 0x3e, 0x6e, 0xb2}}
return a, nil
}
@ -2146,7 +2147,7 @@ func _1689266326_create_communities_events_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x4e, 0xe, 0xba, 0x29, 0x16, 0x46, 0x38, 0x19, 0xa4, 0x5, 0x40, 0x46, 0xaf, 0x9a, 0x6, 0x89, 0xe0, 0x9c, 0xcc, 0xec, 0x8a, 0xb, 0x40, 0x85, 0x6f, 0xcc, 0x5, 0x24, 0x2a, 0x33, 0xfa}}
return a, nil
}
@ -2166,7 +2167,7 @@ func _1689931300_add_community_tokens_deployer_and_priv_levelUpSql() (*asset, er
return nil, err
}
info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3f, 0x24, 0xd9, 0x4d, 0xe, 0x4b, 0xe3, 0x4c, 0xd1, 0xc, 0x72, 0xd4, 0x99, 0xe4, 0xb9, 0xb8, 0xe9, 0x38, 0x9e, 0x11, 0x48, 0xea, 0xe3, 0x5d, 0xd9, 0xd0, 0xef, 0x96, 0x38, 0x5a, 0xd4, 0xa5}}
return a, nil
}
@ -2186,11 +2187,31 @@ func _1693311881_add_unfurled_links_to_message_editsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0664), modTime: time.Unix(1694098269, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xc7, 0x7c, 0xe4, 0x80, 0x6f, 0xf8, 0x96, 0xb, 0x37, 0xff, 0xa2, 0xab, 0x1c, 0xbd, 0x25, 0x8d, 0x1e, 0x9a, 0x65, 0xe9, 0x45, 0xaf, 0x7f, 0x77, 0x84, 0x1b, 0x10, 0x1b, 0x1a, 0x5, 0xcc}}
return a, nil
}
var __1693311981_community_shardUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\xf4\x09\x71\x0d\x52\x08\x71\x74\xf2\x71\x55\x48\xce\xcf\xcd\x2d\xcd\xcb\x2c\xc9\x4c\x2d\x8e\x47\x62\x2b\x38\xba\xb8\x28\x38\xfb\xfb\x84\xfa\xfa\x29\x14\x67\x24\x16\xa5\xc4\x27\xe7\x94\x16\x97\xa4\x16\x29\x78\xfa\x85\x28\xb8\xb8\xba\x39\x86\xfa\x84\x28\xf8\x85\xfa\xf8\x58\x73\x91\x65\x5c\x66\x5e\x4a\x6a\x05\x16\xc3\x00\x01\x00\x00\xff\xff\xe7\x6c\xc4\x0e\x9c\x00\x00\x00")
func _1693311981_community_shardUpSqlBytes() ([]byte, error) {
return bindataRead(
__1693311981_community_shardUpSql,
"1693311981_community_shard.up.sql",
)
}
func _1693311981_community_shardUpSql() (*asset, error) {
bytes, err := _1693311981_community_shardUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "1693311981_community_shard.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1694098617, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x12, 0xf9, 0xde, 0x49, 0x9f, 0x95, 0xaa, 0x22, 0x5e, 0x54, 0x5a, 0x1, 0xd, 0xc6, 0x1f, 0x42, 0x93, 0xe8, 0x69, 0x30, 0x11, 0x69, 0x41, 0x7f, 0x87, 0x57, 0x56, 0x2a, 0x32, 0xb9, 0x3e}}
return a, nil
}
var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00")
func readmeMdBytes() ([]byte, error) {
@ -2206,7 +2227,7 @@ func readmeMd() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}}
return a, nil
}
@ -2226,7 +2247,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}}
return a, nil
}
@ -2524,6 +2545,8 @@ var _bindata = map[string]func() (*asset, error){
"1693311881_add_unfurled_links_to_message_edits.up.sql": _1693311881_add_unfurled_links_to_message_editsUpSql,
"1693311981_community_shard.up.sql": _1693311981_community_shardUpSql,
"README.md": readmeMd,
"doc.go": docGo,
@ -2671,8 +2694,9 @@ var _bintree = &bintree{nil, map[string]*bintree{
"1689266326_create_communities_events_table.up.sql": &bintree{_1689266326_create_communities_events_tableUpSql, map[string]*bintree{}},
"1689931300_add_community_tokens_deployer_and_priv_level.up.sql": &bintree{_1689931300_add_community_tokens_deployer_and_priv_levelUpSql, map[string]*bintree{}},
"1693311881_add_unfurled_links_to_message_edits.up.sql": &bintree{_1693311881_add_unfurled_links_to_message_editsUpSql, map[string]*bintree{}},
"README.md": &bintree{readmeMd, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
"1693311981_community_shard.up.sql": &bintree{_1693311981_community_shardUpSql, map[string]*bintree{}},
"README.md": &bintree{readmeMd, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
}}
// RestoreAsset restores an asset under the given directory.

View File

@ -0,0 +1,2 @@
ALTER TABLE communities_communities ADD COLUMN shard_cluster INT DEFAULT NULL;
ALTER TABLE communities_communities ADD COLUMN shard_index INT DEFAULT NULL;

View File

@ -95,6 +95,7 @@ const (
ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS ApplicationMetadataMessage_Type = 70
ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED ApplicationMetadataMessage_Type = 71
ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE ApplicationMetadataMessage_Type = 72
ApplicationMetadataMessage_COMMUNITY_SHARD_KEY ApplicationMetadataMessage_Type = 73
)
var ApplicationMetadataMessage_Type_name = map[int32]string{
@ -170,6 +171,7 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{
70: "SYNC_ACCOUNTS_POSITIONS",
71: "COMMUNITY_EVENTS_MESSAGE_REJECTED",
72: "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE",
73: "COMMUNITY_SHARD_KEY",
}
var ApplicationMetadataMessage_Type_value = map[string]int32{
@ -245,6 +247,7 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{
"SYNC_ACCOUNTS_POSITIONS": 70,
"COMMUNITY_EVENTS_MESSAGE_REJECTED": 71,
"COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE": 72,
"COMMUNITY_SHARD_KEY": 73,
}
func (x ApplicationMetadataMessage_Type) String() string {
@ -323,72 +326,73 @@ func init() {
}
var fileDescriptor_ad09a6406fcf24c7 = []byte{
// 1066 bytes of a gzipped FileDescriptorProto
// 1077 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x5b, 0x53, 0x1b, 0x37,
0x14, 0x2e, 0x84, 0x02, 0x11, 0x97, 0x08, 0x85, 0x8b, 0x01, 0x73, 0x73, 0x08, 0x21, 0x49, 0xeb,
0xb4, 0xa4, 0xed, 0xb4, 0x4d, 0xd3, 0x56, 0x96, 0x0e, 0xb6, 0xf0, 0xae, 0xb4, 0x91, 0xb4, 0xee,
0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0xde, 0xfa, 0x7b, 0xfb,
0x2b, 0x3a, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f,
0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0x9e, 0xfb, 0x2b, 0xfa,
0x6f, 0x3b, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f,
0x8c, 0x6a, 0xbd, 0xc1, 0xe0, 0xfd, 0xe9, 0xdf, 0xbd, 0xe1, 0xe9, 0xd9, 0x47, 0xf7, 0xa1, 0x3f,
0xec, 0xbd, 0xed, 0x0d, 0x7b, 0xee, 0x43, 0xff, 0xfc, 0xbc, 0xf7, 0xae, 0x5f, 0x1f, 0x7c, 0x3a,
0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x25, 0x68, 0x83, 0x96, 0x1b,
0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x23, 0x68, 0x83, 0x96, 0x1b,
0xc2, 0x0c, 0x1f, 0xa6, 0x70, 0x52, 0x45, 0x77, 0xcf, 0x4f, 0xdf, 0x7d, 0xec, 0x0d, 0x3f, 0x7f,
0xea, 0x57, 0x26, 0x76, 0x27, 0x0e, 0xe7, 0x75, 0xb9, 0x40, 0x2a, 0x68, 0x66, 0xd0, 0xbb, 0x78,
0x7f, 0xd6, 0x7b, 0x5b, 0x99, 0x4c, 0x62, 0xf9, 0x27, 0x79, 0x89, 0xa6, 0x86, 0x17, 0x83, 0x7e,
0xe5, 0xce, 0xee, 0xc4, 0xe1, 0xe2, 0xd1, 0xe3, 0x7a, 0x7e, 0x5e, 0xfd, 0xe6, 0xb3, 0xea, 0xf6,
0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0x7f, 0x18, 0x4d, 0xf9, 0x4f, 0x32, 0x87, 0x66, 0x62, 0xd9,
0x96, 0xea, 0x2f, 0x89, 0xbf, 0x22, 0x18, 0xcd, 0xb3, 0x16, 0xb5, 0x2e, 0x04, 0x63, 0x68, 0x13,
0xf0, 0x04, 0x21, 0x68, 0x91, 0x29, 0x69, 0x29, 0xb3, 0x2e, 0x8e, 0x38, 0xb5, 0x80, 0x27, 0xc9,
0x16, 0x5a, 0x0f, 0x21, 0x6c, 0x80, 0x36, 0x2d, 0x11, 0x65, 0xcb, 0xc5, 0x96, 0x3b, 0x64, 0x03,
0xad, 0x9a, 0xae, 0x64, 0x2e, 0xa2, 0x42, 0x3b, 0x21, 0x8d, 0xa5, 0x41, 0x40, 0xad, 0x50, 0x12,
0x4f, 0x91, 0x7d, 0x54, 0xe5, 0x10, 0x69, 0x60, 0xd4, 0x02, 0x77, 0x09, 0xec, 0x12, 0xe2, 0xeb,
0x8d, 0xc9, 0xd9, 0x09, 0xf2, 0x00, 0xed, 0x68, 0x78, 0x15, 0x83, 0xb1, 0x8e, 0x72, 0xae, 0xc1,
0x18, 0x77, 0xac, 0xb4, 0xb3, 0x9a, 0x4a, 0x43, 0x59, 0x02, 0x9c, 0x26, 0x4f, 0xd0, 0x01, 0x65,
0x0c, 0x22, 0xeb, 0x6e, 0xc3, 0xce, 0x90, 0xa7, 0xe8, 0x11, 0x07, 0x16, 0x08, 0x09, 0xb7, 0x82,
0x67, 0xc9, 0x1a, 0xba, 0x9f, 0x83, 0x46, 0x03, 0x77, 0xc9, 0x32, 0xc2, 0x06, 0x24, 0xbf, 0xb4,
0x8a, 0xc8, 0x0e, 0xda, 0xbc, 0x9a, 0x7b, 0x14, 0x30, 0x47, 0x76, 0x51, 0xf5, 0x5a, 0xa1, 0x2e,
0x27, 0xb5, 0x73, 0x84, 0xe7, 0x3d, 0xa1, 0xd7, 0x11, 0x94, 0x31, 0x15, 0x4b, 0x8b, 0x17, 0xc8,
0x1e, 0xda, 0xba, 0x1e, 0x8e, 0xe2, 0x46, 0x20, 0x98, 0xf3, 0xed, 0xc2, 0x8b, 0x64, 0x1b, 0x6d,
0xe4, 0x19, 0x99, 0xe2, 0xe0, 0x28, 0xef, 0x80, 0xb6, 0xc2, 0x40, 0x08, 0xd2, 0xe2, 0x7b, 0xa4,
0x86, 0xb6, 0xa3, 0xd8, 0xb4, 0x9c, 0x54, 0x56, 0x1c, 0x0b, 0x96, 0xa6, 0xd0, 0xd0, 0x14, 0xc6,
0xea, 0x94, 0x79, 0xec, 0x49, 0xfa, 0x32, 0xc6, 0x69, 0x30, 0x91, 0x92, 0x06, 0xf0, 0x12, 0xd9,
0x44, 0x6b, 0xd7, 0xc1, 0xaf, 0x62, 0xd0, 0x5d, 0x4c, 0xc8, 0x3e, 0xda, 0xbd, 0x21, 0x58, 0xa6,
0xb8, 0xef, 0xab, 0x1e, 0x77, 0x5e, 0x42, 0x21, 0x5e, 0xf6, 0x25, 0x8d, 0x0b, 0x67, 0xdb, 0x57,
0xbc, 0x32, 0x21, 0x54, 0x27, 0xc2, 0x69, 0xc8, 0xa8, 0x5e, 0x25, 0xeb, 0x68, 0xa5, 0xa9, 0x55,
0x1c, 0x25, 0xb4, 0x38, 0x21, 0x3b, 0xc2, 0xa6, 0xd5, 0xad, 0x91, 0x25, 0xb4, 0x90, 0x2e, 0x72,
0x90, 0x56, 0xd8, 0x2e, 0xae, 0x78, 0x34, 0x53, 0x61, 0x18, 0x4b, 0x61, 0xbb, 0x8e, 0x83, 0x61,
0x5a, 0x44, 0x09, 0x7a, 0x9d, 0x54, 0xd1, 0x72, 0x19, 0x1a, 0xc9, 0xb3, 0x91, 0xe8, 0x73, 0x0b,
0xad, 0x97, 0xd1, 0xa2, 0xe9, 0xca, 0x9d, 0x28, 0x21, 0xf1, 0x26, 0xb9, 0x87, 0xe6, 0x22, 0x21,
0x8b, 0x89, 0xa8, 0xfa, 0xb1, 0x02, 0x2e, 0xca, 0xb1, 0xda, 0xf2, 0xb7, 0x31, 0x96, 0xda, 0xd8,
0xe4, 0x53, 0xb5, 0xed, 0xeb, 0xe1, 0x10, 0xc0, 0xc8, 0x28, 0xed, 0x78, 0x6d, 0x8d, 0x93, 0x4e,
0x76, 0x34, 0xde, 0xf5, 0xb3, 0x46, 0xa5, 0x92, 0xdd, 0x50, 0xc5, 0xc6, 0x85, 0x60, 0xb5, 0x60,
0xae, 0x41, 0x2d, 0x6b, 0xe1, 0x3d, 0xb2, 0x82, 0x96, 0x92, 0xcd, 0x49, 0xd9, 0x1a, 0x42, 0xd5,
0x01, 0x8e, 0x6b, 0xbe, 0x73, 0xe5, 0x72, 0x76, 0x94, 0xf1, 0x24, 0x72, 0xfc, 0x80, 0x20, 0x34,
0xdd, 0xa0, 0xac, 0x1d, 0x47, 0x78, 0xbf, 0x50, 0xa5, 0x67, 0xb7, 0xe3, 0x2b, 0x65, 0x20, 0x2d,
0xe8, 0x14, 0xfa, 0xb0, 0x50, 0xe5, 0xd5, 0x70, 0x3a, 0x94, 0xc0, 0xf1, 0x81, 0x57, 0xdd, 0x58,
0x08, 0x17, 0x26, 0x14, 0xc6, 0x00, 0xc7, 0x8f, 0x12, 0x26, 0x3c, 0xa6, 0xa1, 0x54, 0x3b, 0xa4,
0xba, 0x8d, 0x0f, 0xc9, 0x2a, 0x22, 0xe9, 0x0d, 0x03, 0xa0, 0xda, 0xb5, 0x84, 0xb1, 0x4a, 0x77,
0xf1, 0x63, 0x4f, 0x63, 0xb2, 0x6e, 0xc0, 0x5a, 0x21, 0x9b, 0xf8, 0x09, 0x39, 0x44, 0xfb, 0x65,
0x23, 0xb2, 0x5a, 0x1c, 0xd5, 0xac, 0x25, 0x3a, 0xe0, 0x42, 0xda, 0x94, 0x60, 0x03, 0x21, 0xdb,
0xf8, 0xa9, 0xef, 0x75, 0x6a, 0x4a, 0x5a, 0x1d, 0x8b, 0x00, 0x5c, 0x24, 0x98, 0x8d, 0x35, 0x18,
0xfc, 0x4d, 0x91, 0x36, 0x1f, 0xb8, 0x6f, 0x13, 0x56, 0x53, 0x6b, 0xc9, 0x87, 0x2a, 0x97, 0x65,
0xdd, 0xd3, 0xa7, 0xc1, 0xea, 0x74, 0xd2, 0x2e, 0x07, 0x9f, 0x91, 0x03, 0x54, 0xbb, 0x51, 0x18,
0xa5, 0x76, 0xbf, 0x2b, 0x7b, 0x50, 0x80, 0xb3, 0x9a, 0x0c, 0xfe, 0xde, 0xfb, 0x45, 0xbe, 0xb5,
0x70, 0x09, 0xd0, 0xc5, 0x0c, 0xe0, 0x23, 0x2f, 0x8b, 0x2b, 0xf7, 0xbb, 0x04, 0x78, 0xee, 0x53,
0xe4, 0x9e, 0x34, 0x16, 0xf1, 0x43, 0x21, 0x0e, 0xab, 0x63, 0xe3, 0xad, 0x38, 0x36, 0xa0, 0xf1,
0x8f, 0x45, 0xcf, 0x47, 0xd1, 0x45, 0x7d, 0x3f, 0x15, 0x3d, 0xbf, 0x52, 0xb9, 0xe3, 0xc0, 0x84,
0xf1, 0x89, 0x7f, 0x4e, 0x9d, 0x68, 0x0c, 0x05, 0x01, 0xd0, 0x0e, 0xe0, 0x5f, 0x7c, 0x3c, 0x49,
0x91, 0x69, 0xdd, 0xdb, 0x6f, 0x58, 0x4a, 0xfe, 0xd7, 0xa2, 0xf9, 0x86, 0x76, 0x80, 0xe7, 0x2e,
0x8d, 0x5f, 0x78, 0x4f, 0x29, 0xf3, 0x32, 0x2a, 0x19, 0x04, 0xd7, 0x46, 0xef, 0x37, 0xcf, 0x4c,
0x16, 0x1b, 0x5b, 0xf7, 0xcb, 0xa2, 0xd9, 0x6d, 0xe8, 0xfa, 0xf7, 0x09, 0xff, 0x5e, 0x30, 0x61,
0x14, 0x13, 0x34, 0x70, 0x5e, 0x2f, 0x06, 0xff, 0x41, 0xaa, 0xa8, 0x92, 0x2c, 0x83, 0x34, 0x09,
0x39, 0x92, 0x86, 0xe0, 0x38, 0x58, 0x2a, 0x02, 0xfc, 0xa7, 0x6f, 0xf4, 0x58, 0x65, 0x8f, 0x9a,
0x95, 0xc1, 0xd4, 0x7b, 0xea, 0xad, 0x38, 0xe7, 0x9d, 0x00, 0x70, 0xc3, 0x1f, 0x59, 0x96, 0x08,
0x1d, 0x90, 0xd6, 0x14, 0xc4, 0x30, 0xff, 0x28, 0x8e, 0x44, 0xbd, 0x9d, 0x98, 0x16, 0xd5, 0x25,
0x47, 0x60, 0x30, 0xf7, 0x2c, 0x8d, 0x6a, 0xd9, 0xb1, 0xd8, 0x58, 0x15, 0x8a, 0xd7, 0xb9, 0x73,
0x04, 0x4a, 0x63, 0x28, 0xe4, 0x97, 0xa1, 0x8c, 0x8b, 0x94, 0x11, 0xe9, 0x95, 0x8f, 0xc9, 0x43,
0xb4, 0x77, 0xd3, 0x2d, 0x9c, 0x86, 0x13, 0x60, 0x7e, 0xb6, 0x9b, 0xfe, 0xf9, 0x2d, 0x61, 0x91,
0x16, 0x1d, 0x11, 0x40, 0x33, 0x13, 0x52, 0xfa, 0xb0, 0xe7, 0x57, 0x6f, 0x35, 0x16, 0x5e, 0xcf,
0xd5, 0x9f, 0xbd, 0xc8, 0x7f, 0xa1, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00,
0xff, 0xff, 0xec, 0x56, 0x69, 0xd7, 0x48, 0x09, 0x00, 0x00,
0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0xbf, 0x4b, 0x68, 0xca, 0x7f, 0x92, 0x39, 0x34, 0x13, 0xcb,
0xb6, 0x54, 0x7f, 0x49, 0xfc, 0x15, 0xc1, 0x68, 0x9e, 0xb5, 0xa8, 0x75, 0x21, 0x18, 0x43, 0x9b,
0x80, 0x27, 0x08, 0x41, 0x8b, 0x4c, 0x49, 0x4b, 0x99, 0x75, 0x71, 0xc4, 0xa9, 0x05, 0x3c, 0x49,
0xb6, 0xd0, 0x7a, 0x08, 0x61, 0x03, 0xb4, 0x69, 0x89, 0x28, 0x5b, 0x2e, 0xb6, 0xdc, 0x21, 0x1b,
0x68, 0xd5, 0x74, 0x25, 0x73, 0x11, 0x15, 0xda, 0x09, 0x69, 0x2c, 0x0d, 0x02, 0x6a, 0x85, 0x92,
0x78, 0x8a, 0xec, 0xa3, 0x2a, 0x87, 0x48, 0x03, 0xa3, 0x16, 0xb8, 0x4b, 0x60, 0x97, 0x10, 0x5f,
0x6f, 0x4c, 0xce, 0x4e, 0x90, 0x07, 0x68, 0x47, 0xc3, 0xab, 0x18, 0x8c, 0x75, 0x94, 0x73, 0x0d,
0xc6, 0xb8, 0x63, 0xa5, 0x9d, 0xd5, 0x54, 0x1a, 0xca, 0x12, 0xe0, 0x34, 0x79, 0x82, 0x0e, 0x28,
0x63, 0x10, 0x59, 0x77, 0x1b, 0x76, 0x86, 0x3c, 0x45, 0x8f, 0x38, 0xb0, 0x40, 0x48, 0xb8, 0x15,
0x3c, 0x4b, 0xd6, 0xd0, 0xfd, 0x1c, 0x34, 0x1a, 0xb8, 0x4b, 0x96, 0x11, 0x36, 0x20, 0xf9, 0xa5,
0x55, 0x44, 0x76, 0xd0, 0xe6, 0xd5, 0xdc, 0xa3, 0x80, 0x39, 0xb2, 0x8b, 0xaa, 0xd7, 0x0a, 0x75,
0x39, 0xa9, 0x9d, 0x23, 0x3c, 0xef, 0x09, 0xbd, 0x8e, 0xa0, 0x8c, 0xa9, 0x58, 0x5a, 0xbc, 0x40,
0xf6, 0xd0, 0xd6, 0xf5, 0x70, 0x14, 0x37, 0x02, 0xc1, 0x9c, 0x6f, 0x17, 0x5e, 0x24, 0xdb, 0x68,
0x23, 0xcf, 0xc8, 0x14, 0x07, 0x47, 0x79, 0x07, 0xb4, 0x15, 0x06, 0x42, 0x90, 0x16, 0xdf, 0x23,
0x35, 0xb4, 0x1d, 0xc5, 0xa6, 0xe5, 0xa4, 0xb2, 0xe2, 0x58, 0xb0, 0x34, 0x85, 0x86, 0xa6, 0x30,
0x56, 0xa7, 0xcc, 0x63, 0x4f, 0xd2, 0x97, 0x31, 0x4e, 0x83, 0x89, 0x94, 0x34, 0x80, 0x97, 0xc8,
0x26, 0x5a, 0xbb, 0x0e, 0x7e, 0x15, 0x83, 0xee, 0x62, 0x42, 0xf6, 0xd1, 0xee, 0x0d, 0xc1, 0x32,
0xc5, 0x7d, 0x5f, 0xf5, 0xb8, 0xf3, 0x12, 0x0a, 0xf1, 0xb2, 0x2f, 0x69, 0x5c, 0x38, 0xdb, 0xbe,
0xe2, 0x95, 0x09, 0xa1, 0x3a, 0x11, 0x4e, 0x43, 0x46, 0xf5, 0x2a, 0x59, 0x47, 0x2b, 0x4d, 0xad,
0xe2, 0x28, 0xa1, 0xc5, 0x09, 0xd9, 0x11, 0x36, 0xad, 0x6e, 0x8d, 0x2c, 0xa1, 0x85, 0x74, 0x91,
0x83, 0xb4, 0xc2, 0x76, 0x71, 0xc5, 0xa3, 0x99, 0x0a, 0xc3, 0x58, 0x0a, 0xdb, 0x75, 0x1c, 0x0c,
0xd3, 0x22, 0x4a, 0xd0, 0xeb, 0xa4, 0x8a, 0x96, 0xcb, 0xd0, 0x48, 0x9e, 0x8d, 0x44, 0x9f, 0x5b,
0x68, 0xbd, 0x8c, 0x16, 0x4d, 0x57, 0xee, 0x44, 0x09, 0x89, 0x37, 0xc9, 0x3d, 0x34, 0x17, 0x09,
0x59, 0x4c, 0x44, 0xd5, 0x8f, 0x15, 0x70, 0x51, 0x8e, 0xd5, 0x96, 0xbf, 0x8d, 0xb1, 0xd4, 0xc6,
0x26, 0x9f, 0xaa, 0x6d, 0x5f, 0x0f, 0x87, 0x00, 0x46, 0x46, 0x69, 0xc7, 0x6b, 0x6b, 0x9c, 0x74,
0xb2, 0xa3, 0xf1, 0xae, 0x9f, 0x35, 0x2a, 0x95, 0xec, 0x86, 0x2a, 0x36, 0x2e, 0x04, 0xab, 0x05,
0x73, 0x0d, 0x6a, 0x59, 0x0b, 0xef, 0x91, 0x15, 0xb4, 0x94, 0x6c, 0x4e, 0xca, 0xd6, 0x10, 0xaa,
0x0e, 0x70, 0x5c, 0xf3, 0x9d, 0x2b, 0x97, 0xb3, 0xa3, 0x8c, 0x27, 0x91, 0xe3, 0x07, 0x04, 0xa1,
0xe9, 0x06, 0x65, 0xed, 0x38, 0xc2, 0xfb, 0x85, 0x2a, 0x3d, 0xbb, 0x1d, 0x5f, 0x29, 0x03, 0x69,
0x41, 0xa7, 0xd0, 0x87, 0x85, 0x2a, 0xaf, 0x86, 0xd3, 0xa1, 0x04, 0x8e, 0x0f, 0xbc, 0xea, 0xc6,
0x42, 0xb8, 0x30, 0xa1, 0x30, 0x06, 0x38, 0x7e, 0x94, 0x30, 0xe1, 0x31, 0x0d, 0xa5, 0xda, 0x21,
0xd5, 0x6d, 0x7c, 0x48, 0x56, 0x11, 0x49, 0x6f, 0x18, 0x00, 0xd5, 0xae, 0x25, 0x8c, 0x55, 0xba,
0x8b, 0x1f, 0x7b, 0x1a, 0x93, 0x75, 0x03, 0xd6, 0x0a, 0xd9, 0xc4, 0x4f, 0xc8, 0x21, 0xda, 0x2f,
0x1b, 0x91, 0xd5, 0xe2, 0xa8, 0x66, 0x2d, 0xd1, 0x01, 0x17, 0xd2, 0xa6, 0x04, 0x1b, 0x08, 0xd9,
0xc6, 0x4f, 0x7d, 0xaf, 0x53, 0x53, 0xd2, 0xea, 0x58, 0x04, 0xe0, 0x22, 0xc1, 0x6c, 0xac, 0xc1,
0xe0, 0x6f, 0x8a, 0xb4, 0xf9, 0xc0, 0x7d, 0x9b, 0xb0, 0x9a, 0x5a, 0x4b, 0x3e, 0x54, 0xb9, 0x2c,
0xeb, 0x9e, 0x3e, 0x0d, 0x56, 0xa7, 0x93, 0x76, 0x39, 0xf8, 0x8c, 0x1c, 0xa0, 0xda, 0x8d, 0xc2,
0x28, 0xb5, 0xfb, 0x5d, 0xd9, 0x83, 0x02, 0x9c, 0xd5, 0x64, 0xf0, 0xf7, 0xde, 0x2f, 0xf2, 0xad,
0x85, 0x4b, 0x80, 0x2e, 0x66, 0x00, 0x1f, 0x79, 0x59, 0x5c, 0xb9, 0xdf, 0x25, 0xc0, 0x73, 0x9f,
0x22, 0xf7, 0xa4, 0xb1, 0x88, 0x1f, 0x0a, 0x71, 0x58, 0x1d, 0x1b, 0x6f, 0xc5, 0xb1, 0x01, 0x8d,
0x7f, 0x2c, 0x7a, 0x3e, 0x8a, 0x2e, 0xea, 0xfb, 0xa9, 0xe8, 0xf9, 0x95, 0xca, 0x1d, 0x07, 0x26,
0x8c, 0x4f, 0xfc, 0x73, 0xea, 0x44, 0x63, 0x28, 0x08, 0x80, 0x76, 0x00, 0xff, 0xe2, 0xe3, 0x49,
0x8a, 0x4c, 0xeb, 0xde, 0x7e, 0xc3, 0x52, 0xf2, 0xbf, 0x16, 0xcd, 0x37, 0xb4, 0x03, 0x3c, 0x77,
0x69, 0xfc, 0xc2, 0x7b, 0x4a, 0x99, 0x97, 0x51, 0xc9, 0x20, 0xb8, 0x36, 0x7a, 0xbf, 0x79, 0x66,
0xb2, 0xd8, 0xd8, 0xba, 0x5f, 0x16, 0xcd, 0x6e, 0x43, 0xd7, 0xbf, 0x4f, 0xf8, 0xf7, 0x82, 0x09,
0xa3, 0x98, 0xa0, 0x81, 0xf3, 0x7a, 0x31, 0xf8, 0x0f, 0x52, 0x45, 0x95, 0x64, 0x19, 0xa4, 0x49,
0xc8, 0x91, 0x34, 0x04, 0xc7, 0xc1, 0x52, 0x11, 0xe0, 0x3f, 0x7d, 0xa3, 0xc7, 0x2a, 0x7b, 0xd4,
0xac, 0x0c, 0xa6, 0xde, 0x53, 0x6f, 0xc5, 0x39, 0xef, 0x04, 0x80, 0x1b, 0xfe, 0xc8, 0xb2, 0x44,
0xe8, 0x80, 0xb4, 0xa6, 0x20, 0x86, 0xf9, 0x47, 0x71, 0x24, 0xea, 0xed, 0xc4, 0xb4, 0xa8, 0x2e,
0x39, 0x02, 0x83, 0xb9, 0x67, 0x69, 0x54, 0xcb, 0x8e, 0xc5, 0xc6, 0xaa, 0x50, 0xbc, 0xce, 0x9d,
0x23, 0x50, 0x1a, 0x43, 0x21, 0xbf, 0x0c, 0x65, 0x5c, 0xa4, 0x8c, 0x48, 0xaf, 0x7c, 0x4c, 0x1e,
0xa2, 0xbd, 0x9b, 0x6e, 0xe1, 0x34, 0x9c, 0x00, 0xf3, 0xb3, 0xdd, 0xf4, 0xcf, 0x6f, 0x09, 0x8b,
0xb4, 0xe8, 0x88, 0x00, 0x9a, 0x99, 0x90, 0xd2, 0x87, 0x3d, 0xbf, 0x7a, 0xcb, 0xbf, 0xa8, 0x23,
0x4a, 0x6f, 0x51, 0xcd, 0x3d, 0xff, 0x58, 0x34, 0x16, 0x5e, 0xcf, 0xd5, 0x9f, 0xbd, 0xc8, 0x7f,
0xba, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xc9, 0x3a,
0x61, 0x61, 0x09, 0x00, 0x00,
}

View File

@ -85,5 +85,6 @@ message ApplicationMetadataMessage {
SYNC_ACCOUNTS_POSITIONS = 70;
COMMUNITY_EVENTS_MESSAGE_REJECTED = 71;
COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE = 72;
COMMUNITY_SHARD_KEY = 73;
}
}

View File

@ -1018,6 +1018,7 @@ type ChatMessage struct {
DisplayName string `protobuf:"bytes,14,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
ContactRequestPropagatedState *ContactRequestPropagatedState `protobuf:"bytes,15,opt,name=contact_request_propagated_state,json=contactRequestPropagatedState,proto3" json:"contact_request_propagated_state,omitempty"`
UnfurledLinks []*UnfurledLink `protobuf:"bytes,16,rep,name=unfurled_links,json=unfurledLinks,proto3" json:"unfurled_links,omitempty"`
Shard *Shard `protobuf:"bytes,17,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1208,6 +1209,13 @@ func (m *ChatMessage) GetUnfurledLinks() []*UnfurledLink {
return nil
}
func (m *ChatMessage) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*ChatMessage) XXX_OneofWrappers() []interface{} {
return []interface{}{
@ -1242,99 +1250,101 @@ func init() {
}
var fileDescriptor_263952f55fd35689 = []byte{
// 1497 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x6e, 0xdb, 0xc6,
0x13, 0xb7, 0xbe, 0xc5, 0xd1, 0x87, 0x99, 0x8d, 0xe3, 0x30, 0x41, 0x1c, 0x2b, 0xfa, 0x07, 0x88,
0xff, 0x68, 0xa1, 0x02, 0x49, 0x5a, 0x04, 0x28, 0x8a, 0x82, 0x96, 0x18, 0x9b, 0x8d, 0xf5, 0x51,
0x8a, 0x72, 0xea, 0x5e, 0x08, 0x9a, 0x5c, 0x5b, 0x84, 0x29, 0x52, 0x25, 0x57, 0x6d, 0xd5, 0x97,
0xea, 0xad, 0xa7, 0x1e, 0x7b, 0xe8, 0xa1, 0xd7, 0x1e, 0xfa, 0x02, 0x7d, 0x82, 0x3e, 0x40, 0xb1,
0xbb, 0xfc, 0x54, 0x6d, 0xa7, 0xcd, 0x45, 0xda, 0x99, 0x9d, 0x59, 0xce, 0xfc, 0x76, 0x76, 0x7e,
0x03, 0xc8, 0x9a, 0x9b, 0xc4, 0x58, 0xe0, 0x30, 0x34, 0x2f, 0x71, 0x6f, 0x19, 0xf8, 0xc4, 0x47,
0x75, 0xf6, 0x77, 0xbe, 0xba, 0x78, 0xd8, 0xc0, 0xde, 0x6a, 0x11, 0x72, 0xf5, 0xc3, 0x96, 0xe5,
0x7b, 0xc4, 0xb4, 0x08, 0x17, 0xbb, 0xaf, 0xa0, 0x3d, 0x25, 0x8e, 0x75, 0x85, 0x83, 0x21, 0xf7,
0x46, 0x08, 0xca, 0x73, 0x33, 0x9c, 0x4b, 0x85, 0x4e, 0xe1, 0x40, 0xd0, 0xd8, 0x9a, 0xea, 0x96,
0xa6, 0x75, 0x25, 0x15, 0x3b, 0x85, 0x83, 0x8a, 0xc6, 0xd6, 0xdd, 0x5f, 0x0b, 0xd0, 0x54, 0x17,
0xe6, 0x25, 0x8e, 0x1d, 0x25, 0xa8, 0x2d, 0xcd, 0xb5, 0xeb, 0x9b, 0x36, 0xf3, 0x6d, 0x6a, 0xb1,
0x88, 0x9e, 0x41, 0x99, 0xac, 0x97, 0x98, 0xb9, 0xb7, 0x9f, 0xdf, 0xed, 0xc5, 0x91, 0xf5, 0x98,
0xbf, 0xbe, 0x5e, 0x62, 0x8d, 0x19, 0xa0, 0x07, 0x50, 0x37, 0xdd, 0xf3, 0xd5, 0xc2, 0x70, 0x6c,
0xa9, 0xc4, 0xbe, 0x5f, 0x63, 0xb2, 0x6a, 0xa3, 0x1d, 0xa8, 0x7c, 0xe7, 0xd8, 0x64, 0x2e, 0x95,
0x3b, 0x85, 0x83, 0x96, 0xc6, 0x05, 0xb4, 0x0b, 0xd5, 0x39, 0x76, 0x2e, 0xe7, 0x44, 0xaa, 0x30,
0x75, 0x24, 0xa1, 0x0f, 0x01, 0x45, 0x07, 0xd1, 0x2f, 0x84, 0x86, 0xe5, 0xaf, 0x3c, 0x22, 0x55,
0x99, 0x8d, 0xc8, 0x8f, 0x64, 0x1b, 0x7d, 0xaa, 0xef, 0xfe, 0x54, 0x80, 0xa6, 0xbc, 0xb2, 0x1d,
0xff, 0xdd, 0xa9, 0xbc, 0xcc, 0xa5, 0xd2, 0x49, 0x53, 0xc9, 0xfa, 0x73, 0x21, 0x93, 0xd7, 0x3e,
0x34, 0xec, 0x55, 0x60, 0x12, 0xc7, 0xf7, 0x8c, 0x45, 0xc8, 0x52, 0x2b, 0x6b, 0x10, 0xab, 0x86,
0x61, 0xf7, 0x63, 0x10, 0x12, 0x1f, 0xb4, 0x0b, 0x68, 0x36, 0x7a, 0x33, 0x1a, 0xbf, 0x1d, 0x19,
0xf2, 0x6c, 0xa0, 0x8e, 0x0d, 0xfd, 0x6c, 0xa2, 0x88, 0x5b, 0xa8, 0x06, 0x25, 0x59, 0xee, 0x8b,
0x05, 0xb6, 0x18, 0x6a, 0x62, 0xb1, 0xfb, 0x4b, 0x11, 0x1a, 0x8a, 0xed, 0x90, 0x38, 0xee, 0x1d,
0xa8, 0x58, 0xae, 0x6f, 0x5d, 0xb1, 0xa8, 0xcb, 0x1a, 0x17, 0xe8, 0xed, 0x11, 0xfc, 0x3d, 0x61,
0x31, 0x0b, 0x1a, 0x5b, 0xa3, 0xfb, 0x50, 0x63, 0x35, 0x93, 0x00, 0x5d, 0xa5, 0xa2, 0x6a, 0xa3,
0x3d, 0x80, 0xa8, 0x8e, 0xe8, 0x5e, 0x99, 0xed, 0x09, 0x91, 0x86, 0x5f, 0xc3, 0x65, 0x60, 0x7a,
0x1c, 0xef, 0xa6, 0xc6, 0x05, 0xf4, 0x0a, 0x9a, 0xb1, 0x13, 0x43, 0xa7, 0xca, 0xd0, 0xb9, 0x97,
0xa2, 0x13, 0x05, 0xc8, 0x20, 0x69, 0x2c, 0x52, 0x01, 0x0d, 0xa0, 0x49, 0x0b, 0x12, 0x7b, 0x84,
0x7b, 0xd6, 0x98, 0xe7, 0x93, 0xd4, 0xb3, 0x3f, 0x37, 0xe3, 0xf4, 0x7a, 0x7d, 0x6e, 0xc9, 0x4f,
0xb1, 0x52, 0x01, 0x7d, 0x06, 0xed, 0x95, 0x77, 0xb1, 0x0a, 0x5c, 0x6c, 0x1b, 0xae, 0xe3, 0x5d,
0x85, 0x52, 0xbd, 0x53, 0x3a, 0x68, 0x3c, 0xdf, 0x4d, 0xcf, 0x99, 0x45, 0xfb, 0x27, 0x8e, 0x77,
0xa5, 0xb5, 0x56, 0x19, 0x29, 0xec, 0xfe, 0x56, 0x80, 0xd6, 0x00, 0xbb, 0x98, 0xe0, 0xdb, 0x81,
0xcc, 0x80, 0x56, 0xbc, 0x05, 0xb4, 0xd2, 0x8d, 0xa0, 0x95, 0x6f, 0x03, 0xad, 0xf2, 0xaf, 0x41,
0xdb, 0x03, 0xb0, 0x59, 0xb8, 0xb6, 0x71, 0xbe, 0x66, 0x60, 0x0b, 0x9a, 0x10, 0x69, 0x0e, 0xd7,
0xdd, 0x21, 0xec, 0x4e, 0xd7, 0x9e, 0xc5, 0x33, 0x7a, 0xed, 0x07, 0xc3, 0x77, 0xa4, 0x95, 0x8f,
0xbe, 0xb8, 0x11, 0x7d, 0xf7, 0xf7, 0x22, 0xb4, 0x07, 0x4e, 0x68, 0xf9, 0x81, 0x1d, 0x9f, 0xd3,
0x86, 0xa2, 0x63, 0x47, 0x1d, 0xa2, 0xe8, 0xd8, 0xac, 0xc2, 0xe2, 0x57, 0x21, 0x44, 0x35, 0xff,
0x08, 0x04, 0xe2, 0x2c, 0x70, 0x48, 0xcc, 0xc5, 0x32, 0x86, 0x24, 0x51, 0xa0, 0x03, 0xd8, 0x4e,
0x04, 0x5a, 0xc1, 0x38, 0xae, 0xb5, 0x4d, 0x35, 0x7d, 0x8b, 0xd1, 0x55, 0x33, 0x84, 0x04, 0x2d,
0x16, 0xd1, 0x27, 0x50, 0x35, 0x57, 0x64, 0xee, 0x07, 0x0c, 0x82, 0xc6, 0xf3, 0xc7, 0x29, 0x74,
0xf9, 0x78, 0x65, 0x66, 0xa5, 0x45, 0xd6, 0xe8, 0x73, 0x10, 0x02, 0x7c, 0x81, 0x03, 0xec, 0x59,
0xbc, 0xe0, 0x1a, 0xd9, 0x82, 0xcb, 0xbb, 0x6a, 0xb1, 0xa1, 0x96, 0xfa, 0xa0, 0x01, 0x34, 0x4c,
0x42, 0x4c, 0x6b, 0xbe, 0xc0, 0x1e, 0x89, 0x6b, 0xad, 0x7b, 0xe3, 0xd7, 0x13, 0x53, 0x2d, 0xeb,
0xd6, 0xfd, 0xb3, 0x00, 0x3b, 0xd7, 0xc5, 0x79, 0x1d, 0xba, 0x9e, 0xb9, 0x48, 0xd0, 0xa5, 0x6b,
0xf4, 0x14, 0x5a, 0xb6, 0x13, 0x5a, 0x81, 0xb3, 0x70, 0x3c, 0x93, 0xf8, 0x41, 0x84, 0x70, 0x5e,
0x89, 0x1e, 0x42, 0xdd, 0x73, 0xac, 0x2b, 0xe6, 0xcd, 0xe1, 0x4d, 0x64, 0x7a, 0x3f, 0xe6, 0xb7,
0x26, 0x31, 0x83, 0x59, 0xe0, 0x46, 0xc8, 0xa6, 0x0a, 0xd4, 0x03, 0xc4, 0x05, 0xd6, 0x27, 0x27,
0x51, 0x33, 0xac, 0xb2, 0xfa, 0xbd, 0x66, 0x87, 0x7e, 0xc9, 0xf5, 0x2d, 0xd3, 0xa5, 0x87, 0xd5,
0xf8, 0x97, 0x62, 0xb9, 0xeb, 0xc3, 0xfd, 0x1b, 0x40, 0xa5, 0x41, 0x24, 0x85, 0x16, 0x65, 0x9c,
0x79, 0x37, 0x8f, 0x40, 0xb0, 0xe6, 0xa6, 0xe7, 0x61, 0x57, 0x4d, 0xea, 0x32, 0x51, 0xd0, 0xc2,
0xb8, 0x5c, 0x39, 0xae, 0xad, 0x26, 0x5c, 0x11, 0x89, 0xdd, 0xbf, 0x0a, 0x20, 0xdd, 0x74, 0x07,
0xff, 0x40, 0x37, 0x17, 0xc2, 0x66, 0xf1, 0x23, 0x11, 0x4a, 0xab, 0xc0, 0x8d, 0x3e, 0x40, 0x97,
0x34, 0xd3, 0x0b, 0xc7, 0xc5, 0xa3, 0x0c, 0xa6, 0xb1, 0x4c, 0x6f, 0x85, 0xae, 0xa7, 0xce, 0x0f,
0xf8, 0x70, 0x4d, 0x70, 0xc8, 0x70, 0x2d, 0x6b, 0x79, 0x25, 0xea, 0x40, 0xb6, 0x79, 0x45, 0xef,
0x37, 0xd7, 0xcf, 0x32, 0xfc, 0x53, 0xcb, 0xf3, 0x4f, 0x16, 0xe7, 0xfa, 0x06, 0xce, 0x3f, 0x16,
0xa1, 0x99, 0x6d, 0x73, 0x71, 0xf0, 0x85, 0x34, 0xf8, 0x1d, 0xa8, 0x10, 0x87, 0xb8, 0x71, 0x2d,
0x71, 0x81, 0x06, 0x64, 0x63, 0x5a, 0x37, 0x4b, 0x4a, 0x47, 0x51, 0xb2, 0x59, 0x15, 0xfa, 0x00,
0xee, 0x90, 0xf9, 0x6a, 0x71, 0xee, 0x99, 0x8e, 0x6b, 0xc4, 0xa1, 0xf1, 0x6e, 0x26, 0x26, 0x1b,
0x93, 0x84, 0xee, 0xb7, 0x53, 0x63, 0x4e, 0xda, 0x9c, 0x9d, 0xdb, 0x89, 0xfa, 0x2d, 0x63, 0xef,
0xff, 0x43, 0xea, 0x6c, 0x44, 0x3c, 0xce, 0x39, 0x3a, 0x3d, 0xe0, 0x98, 0x13, 0xfa, 0x8b, 0xa8,
0xc3, 0x70, 0x7e, 0xd8, 0xbf, 0xbe, 0xaf, 0xf7, 0xe8, 0x4f, 0x4a, 0xbb, 0xdd, 0x7d, 0xa8, 0xc7,
0x1a, 0x54, 0x87, 0xf2, 0x89, 0x3a, 0x7a, 0x23, 0x6e, 0x21, 0x01, 0x2a, 0xea, 0x50, 0x3e, 0x52,
0xc4, 0x42, 0xf7, 0x0f, 0x01, 0x1a, 0x19, 0x82, 0xb9, 0xa1, 0x3f, 0xe6, 0x3a, 0x59, 0x91, 0xed,
0x64, 0x3a, 0x59, 0xcc, 0xae, 0xa5, 0x0c, 0xbb, 0xee, 0x43, 0x23, 0xc0, 0xe1, 0xd2, 0xf7, 0x42,
0x6c, 0x10, 0x3f, 0x2a, 0x13, 0x88, 0x55, 0xba, 0x4f, 0x07, 0x1d, 0xec, 0x85, 0x06, 0x7b, 0x98,
0x51, 0x57, 0xc3, 0x5e, 0xc8, 0x6a, 0x28, 0x43, 0x32, 0xd5, 0x1c, 0xc9, 0x6c, 0xf2, 0x45, 0xed,
0xbd, 0x49, 0xb6, 0xfe, 0x5e, 0x24, 0xfb, 0x12, 0x6a, 0x21, 0x1f, 0x15, 0x25, 0x81, 0x35, 0x4d,
0x29, 0x3d, 0x20, 0x3f, 0x43, 0x1e, 0x6f, 0x69, 0xb1, 0x29, 0xea, 0x41, 0x85, 0xcd, 0x60, 0x12,
0x30, 0x9f, 0xdd, 0x8d, 0xe1, 0x2f, 0xf5, 0xe0, 0x66, 0xd4, 0xde, 0xa4, 0x93, 0x90, 0xd4, 0xd8,
0xb4, 0xcf, 0x4e, 0x58, 0xd4, 0x9e, 0x99, 0xa1, 0xc7, 0x20, 0x58, 0xfe, 0x62, 0xb1, 0xf2, 0x1c,
0xb2, 0x96, 0x9a, 0xb4, 0x22, 0x8f, 0xb7, 0xb4, 0x54, 0x85, 0xfa, 0xb0, 0x6d, 0xf3, 0x56, 0x10,
0xcf, 0xc7, 0x92, 0xb5, 0x19, 0x7d, 0xbe, 0x57, 0x1c, 0x6f, 0x69, 0x6d, 0x3b, 0xcf, 0x77, 0x09,
0x81, 0xb7, 0xb2, 0x04, 0xfe, 0x04, 0x9a, 0xb6, 0x13, 0x2e, 0x5d, 0x73, 0xcd, 0x2f, 0xb2, 0x1d,
0xbd, 0x1b, 0xae, 0x63, 0x97, 0xb9, 0x84, 0x4e, 0x34, 0x6f, 0x1b, 0x01, 0xfe, 0x66, 0x85, 0x43,
0x62, 0x2c, 0x03, 0x7f, 0x69, 0x5e, 0x9a, 0x94, 0xbc, 0x43, 0x62, 0x12, 0x2c, 0x6d, 0xb3, 0x70,
0x9e, 0x65, 0x6e, 0x83, 0x7b, 0x68, 0xdc, 0x61, 0x92, 0xd8, 0x4f, 0xa9, 0xb9, 0xb6, 0x67, 0xdd,
0xb6, 0x7d, 0xcd, 0x28, 0x24, 0xfe, 0x97, 0x51, 0xe8, 0xe7, 0x12, 0x34, 0xfa, 0xb9, 0x4e, 0xb4,
0x13, 0xcf, 0xa2, 0xfd, 0xf1, 0x48, 0x57, 0x46, 0x7a, 0x3c, 0x8d, 0xb6, 0x01, 0x74, 0xe5, 0x2b,
0xdd, 0x98, 0x9c, 0xc8, 0xea, 0x48, 0x2c, 0xa0, 0x06, 0xd4, 0xa6, 0xba, 0xda, 0x7f, 0xa3, 0x68,
0x62, 0x11, 0x01, 0x54, 0xa7, 0xba, 0xac, 0xcf, 0xa6, 0x62, 0x89, 0xbe, 0x37, 0x65, 0x38, 0xfe,
0x42, 0x15, 0xcb, 0xe8, 0x3e, 0xdc, 0xd5, 0x35, 0x79, 0x34, 0x95, 0xfb, 0xba, 0x3a, 0xa6, 0x27,
0x0e, 0x87, 0xf2, 0x68, 0x20, 0x56, 0xd0, 0x01, 0x3c, 0x9d, 0x9e, 0x4d, 0x75, 0x65, 0x68, 0x0c,
0x95, 0xe9, 0x54, 0x3e, 0x52, 0x92, 0xaf, 0x4d, 0x34, 0xf5, 0x54, 0xd6, 0x15, 0xe3, 0x48, 0x1b,
0xcf, 0x26, 0x62, 0x35, 0x7d, 0xbd, 0x35, 0xba, 0x64, 0xf3, 0xb1, 0x58, 0x47, 0x2d, 0x10, 0xe8,
0x61, 0xb3, 0x91, 0xaa, 0x9f, 0x89, 0x02, 0x9d, 0xa0, 0x37, 0x8e, 0x3b, 0x92, 0x27, 0x22, 0xa0,
0xbb, 0xb0, 0x4d, 0xcf, 0x95, 0xfb, 0xba, 0xa1, 0x29, 0x5f, 0xce, 0x94, 0xa9, 0x2e, 0x36, 0xa8,
0x72, 0xa0, 0x4e, 0xfb, 0x63, 0x6d, 0x10, 0x5b, 0x8b, 0x4d, 0xf4, 0x00, 0xee, 0xa9, 0x03, 0x65,
0xa4, 0xab, 0xfa, 0x99, 0x71, 0xaa, 0x68, 0xea, 0x6b, 0xb5, 0x2f, 0xd3, 0x98, 0xc5, 0x16, 0x7a,
0x02, 0x7b, 0x1b, 0x87, 0x4f, 0xd4, 0xd1, 0x48, 0x49, 0xbd, 0xdb, 0xe8, 0x29, 0x74, 0x36, 0x4c,
0x86, 0x33, 0x7d, 0x26, 0x9f, 0x18, 0xca, 0x29, 0xcd, 0x69, 0xaa, 0x8c, 0x74, 0x71, 0xfb, 0x9a,
0xa4, 0x73, 0x56, 0x72, 0xbf, 0xaf, 0x4c, 0x74, 0x65, 0x20, 0x8a, 0xe8, 0x19, 0xfc, 0xef, 0x36,
0x4b, 0x4d, 0x19, 0x8e, 0x4f, 0x95, 0x81, 0x78, 0xe7, 0x50, 0x48, 0x88, 0xe3, 0xb0, 0xf5, 0x75,
0xa3, 0xf7, 0xd1, 0xa7, 0xf1, 0xa5, 0x9f, 0x57, 0xd9, 0xea, 0xc5, 0xdf, 0x01, 0x00, 0x00, 0xff,
0xff, 0xb2, 0x8c, 0x90, 0x17, 0x2b, 0x0e, 0x00, 0x00,
// 1523 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4f, 0x73, 0xe3, 0x4a,
0x11, 0x8f, 0xff, 0x5b, 0x2d, 0xdb, 0xd1, 0xce, 0xe6, 0x65, 0xf5, 0xb6, 0x5e, 0x5e, 0xbc, 0x66,
0xa9, 0x0d, 0x05, 0x65, 0xaa, 0xf6, 0x3d, 0xa8, 0x57, 0x45, 0x51, 0x94, 0x62, 0xeb, 0x25, 0x62,
0xe3, 0x3f, 0x8c, 0xe5, 0x3c, 0xc2, 0x45, 0xa5, 0x48, 0x93, 0x58, 0x15, 0x59, 0x32, 0xd2, 0x18,
0x30, 0x27, 0xbe, 0x11, 0x37, 0x4e, 0x1c, 0x39, 0x70, 0xe0, 0xca, 0x57, 0xe0, 0x13, 0xf0, 0x01,
0xa8, 0x99, 0xd1, 0x5f, 0x93, 0x64, 0x61, 0x2f, 0xc9, 0x74, 0x4f, 0x77, 0xab, 0xe7, 0x37, 0x3d,
0xfd, 0x6b, 0x03, 0x72, 0x56, 0x36, 0xb5, 0xd6, 0x24, 0x8e, 0xed, 0x7b, 0x32, 0xdc, 0x44, 0x21,
0x0d, 0x51, 0x9b, 0xff, 0xbb, 0xdd, 0xde, 0xbd, 0x96, 0x49, 0xb0, 0x5d, 0xc7, 0x42, 0xfd, 0xba,
0xeb, 0x84, 0x01, 0xb5, 0x1d, 0x9a, 0x88, 0x72, 0xbc, 0xb2, 0x23, 0x57, 0x08, 0x83, 0x6f, 0xa0,
0xb7, 0xa0, 0x9e, 0xf3, 0x40, 0xa2, 0x89, 0x08, 0x85, 0x10, 0xd4, 0x57, 0x76, 0xbc, 0x52, 0x2b,
0xfd, 0xca, 0x99, 0x84, 0xf9, 0x9a, 0xe9, 0x36, 0xb6, 0xf3, 0xa0, 0x56, 0xfb, 0x95, 0xb3, 0x06,
0xe6, 0xeb, 0xc1, 0xdf, 0x2b, 0xd0, 0x31, 0xd6, 0xf6, 0x3d, 0x49, 0x1d, 0x55, 0x68, 0x6d, 0xec,
0x9d, 0x1f, 0xda, 0x2e, 0xf7, 0xed, 0xe0, 0x54, 0x44, 0xef, 0xa0, 0x4e, 0x77, 0x1b, 0xc2, 0xdd,
0x7b, 0xef, 0x5f, 0x0e, 0xd3, 0x34, 0x87, 0xdc, 0xdf, 0xdc, 0x6d, 0x08, 0xe6, 0x06, 0xe8, 0x73,
0x68, 0xdb, 0xfe, 0xed, 0x76, 0x6d, 0x79, 0xae, 0x5a, 0xe3, 0xdf, 0x6f, 0x71, 0xd9, 0x70, 0xd1,
0x11, 0x34, 0x7e, 0xef, 0xb9, 0x74, 0xa5, 0xd6, 0xfb, 0x95, 0xb3, 0x2e, 0x16, 0x02, 0x3a, 0x86,
0xe6, 0x8a, 0x78, 0xf7, 0x2b, 0xaa, 0x36, 0xb8, 0x3a, 0x91, 0xd0, 0x8f, 0x00, 0x25, 0x81, 0xd8,
0x17, 0x62, 0xcb, 0x09, 0xb7, 0x01, 0x55, 0x9b, 0xdc, 0x46, 0x11, 0x21, 0xf9, 0xc6, 0x88, 0xe9,
0x07, 0x7f, 0xa9, 0x40, 0x47, 0xdb, 0xba, 0x5e, 0xf8, 0xf1, 0xa3, 0x7c, 0x5d, 0x3a, 0x4a, 0x3f,
0x3f, 0x4a, 0xd1, 0x5f, 0x08, 0x85, 0x73, 0x9d, 0x82, 0xec, 0x6e, 0x23, 0x9b, 0x7a, 0x61, 0x60,
0xad, 0x63, 0x7e, 0xb4, 0x3a, 0x86, 0x54, 0x35, 0x89, 0x07, 0x3f, 0x01, 0x29, 0xf3, 0x41, 0xc7,
0x80, 0x96, 0xd3, 0x0f, 0xd3, 0xd9, 0x77, 0x53, 0x4b, 0x5b, 0x8e, 0x8d, 0x99, 0x65, 0xde, 0xcc,
0x75, 0xe5, 0x00, 0xb5, 0xa0, 0xa6, 0x69, 0x23, 0xa5, 0xc2, 0x17, 0x13, 0xac, 0x54, 0x07, 0x7f,
0xab, 0x82, 0xac, 0xbb, 0x1e, 0x4d, 0xf3, 0x3e, 0x82, 0x86, 0xe3, 0x87, 0xce, 0x03, 0xcf, 0xba,
0x8e, 0x85, 0xc0, 0x6e, 0x8f, 0x92, 0x3f, 0x50, 0x9e, 0xb3, 0x84, 0xf9, 0x1a, 0xbd, 0x82, 0x16,
0x2f, 0xa0, 0x0c, 0xe8, 0x26, 0x13, 0x0d, 0x17, 0x9d, 0x00, 0x24, 0x45, 0xc5, 0xf6, 0xea, 0x7c,
0x4f, 0x4a, 0x34, 0xe2, 0x1a, 0xee, 0x23, 0x3b, 0x10, 0x78, 0x77, 0xb0, 0x10, 0xd0, 0x37, 0xd0,
0x49, 0x9d, 0x38, 0x3a, 0x4d, 0x8e, 0xce, 0x67, 0x39, 0x3a, 0x49, 0x82, 0x1c, 0x12, 0x79, 0x9d,
0x0b, 0x68, 0x0c, 0x1d, 0x56, 0x9d, 0x24, 0xa0, 0xc2, 0xb3, 0xc5, 0x3d, 0xdf, 0xe4, 0x9e, 0xa3,
0x95, 0x9d, 0x1e, 0x6f, 0x38, 0x12, 0x96, 0x22, 0x8a, 0x93, 0x0b, 0xe8, 0xe7, 0xd0, 0xdb, 0x06,
0x77, 0xdb, 0xc8, 0x27, 0xae, 0xe5, 0x7b, 0xc1, 0x43, 0xac, 0xb6, 0xfb, 0xb5, 0x33, 0xf9, 0xfd,
0x71, 0x1e, 0x67, 0x99, 0xec, 0x5f, 0x79, 0xc1, 0x03, 0xee, 0x6e, 0x0b, 0x52, 0x3c, 0xf8, 0x47,
0x05, 0xba, 0x63, 0xe2, 0x13, 0x4a, 0x9e, 0x07, 0xb2, 0x00, 0x5a, 0xf5, 0x19, 0xd0, 0x6a, 0x4f,
0x82, 0x56, 0x7f, 0x0e, 0xb4, 0xc6, 0xff, 0x0c, 0xda, 0x09, 0x80, 0xcb, 0xd3, 0x75, 0xad, 0xdb,
0x1d, 0x07, 0x5b, 0xc2, 0x52, 0xa2, 0x39, 0xdf, 0x0d, 0x26, 0x70, 0xbc, 0xd8, 0x05, 0x8e, 0x38,
0xd1, 0xb7, 0x61, 0x34, 0xf9, 0xc8, 0xb1, 0xca, 0xd9, 0x57, 0xf7, 0xb2, 0x1f, 0xfc, 0xb3, 0x0a,
0xbd, 0xb1, 0x17, 0x3b, 0x61, 0xe4, 0xa6, 0x71, 0x7a, 0x50, 0xf5, 0xdc, 0xa4, 0x43, 0x54, 0x3d,
0x97, 0x57, 0x58, 0xfa, 0x2a, 0xa4, 0xa4, 0xe6, 0xbf, 0x00, 0x89, 0x7a, 0x6b, 0x12, 0x53, 0x7b,
0xbd, 0x49, 0x21, 0xc9, 0x14, 0xe8, 0x0c, 0x0e, 0x33, 0x81, 0x55, 0x30, 0x49, 0x6b, 0x6d, 0x5f,
0xcd, 0xde, 0x62, 0x72, 0xd5, 0x1c, 0x21, 0x09, 0xa7, 0x22, 0xfa, 0x29, 0x34, 0xed, 0x2d, 0x5d,
0x85, 0x11, 0x87, 0x40, 0x7e, 0xff, 0x65, 0x0e, 0x5d, 0x39, 0x5f, 0x8d, 0x5b, 0xe1, 0xc4, 0x1a,
0xfd, 0x02, 0xa4, 0x88, 0xdc, 0x91, 0x88, 0x04, 0x8e, 0x28, 0x38, 0xb9, 0x58, 0x70, 0x65, 0x57,
0x9c, 0x1a, 0xe2, 0xdc, 0x07, 0x8d, 0x41, 0xb6, 0x29, 0xb5, 0x9d, 0xd5, 0x9a, 0x04, 0x34, 0xad,
0xb5, 0xc1, 0x93, 0x5f, 0xcf, 0x4c, 0x71, 0xd1, 0x6d, 0xf0, 0xaf, 0x0a, 0x1c, 0x3d, 0x96, 0xe7,
0x63, 0xe8, 0x06, 0xf6, 0x3a, 0x43, 0x97, 0xad, 0xd1, 0x5b, 0xe8, 0xba, 0x5e, 0xec, 0x44, 0xde,
0xda, 0x0b, 0x6c, 0x1a, 0x46, 0x09, 0xc2, 0x65, 0x25, 0x7a, 0x0d, 0xed, 0xc0, 0x73, 0x1e, 0xb8,
0xb7, 0x80, 0x37, 0x93, 0xd9, 0xfd, 0xd8, 0xbf, 0xb3, 0xa9, 0x1d, 0x2d, 0x23, 0x3f, 0x41, 0x36,
0x57, 0xa0, 0x21, 0x20, 0x21, 0xf0, 0x3e, 0x39, 0x4f, 0x9a, 0x61, 0x93, 0xd7, 0xef, 0x23, 0x3b,
0xec, 0x4b, 0x7e, 0xe8, 0xd8, 0x3e, 0x0b, 0xd6, 0x12, 0x5f, 0x4a, 0xe5, 0x41, 0x08, 0xaf, 0x9e,
0x00, 0x95, 0x25, 0x91, 0x15, 0x5a, 0x72, 0xe2, 0xc2, 0xbb, 0xf9, 0x02, 0x24, 0x67, 0x65, 0x07,
0x01, 0xf1, 0x8d, 0xac, 0x2e, 0x33, 0x05, 0x2b, 0x8c, 0xfb, 0xad, 0xe7, 0xbb, 0x46, 0xc6, 0x15,
0x89, 0x38, 0xf8, 0x77, 0x05, 0xd4, 0xa7, 0xee, 0xe0, 0xbf, 0xd0, 0x2d, 0xa5, 0xb0, 0x5f, 0xfc,
0x48, 0x81, 0xda, 0x36, 0xf2, 0x93, 0x0f, 0xb0, 0x25, 0x3b, 0xe9, 0x9d, 0xe7, 0x93, 0x69, 0x01,
0xd3, 0x54, 0x66, 0xb7, 0xc2, 0xd6, 0x0b, 0xef, 0x8f, 0xe4, 0x7c, 0x47, 0x49, 0xcc, 0x71, 0xad,
0xe3, 0xb2, 0x12, 0xf5, 0xa1, 0xd8, 0xbc, 0x92, 0xf7, 0x5b, 0xea, 0x67, 0x05, 0xfe, 0x69, 0x95,
0xf9, 0xa7, 0x88, 0x73, 0x7b, 0x0f, 0xe7, 0x3f, 0x57, 0xa1, 0x53, 0x6c, 0x73, 0x69, 0xf2, 0x95,
0x3c, 0xf9, 0x23, 0x68, 0x50, 0x8f, 0xfa, 0x69, 0x2d, 0x09, 0x81, 0x25, 0xe4, 0x12, 0x56, 0x37,
0x1b, 0x46, 0x47, 0xc9, 0x61, 0x8b, 0x2a, 0xf4, 0x43, 0x78, 0x41, 0x57, 0xdb, 0xf5, 0x6d, 0x60,
0x7b, 0xbe, 0x95, 0xa6, 0x26, 0xba, 0x99, 0x92, 0x6d, 0xcc, 0x33, 0xba, 0x3f, 0xcc, 0x8d, 0x05,
0x69, 0x0b, 0x76, 0xee, 0x65, 0xea, 0xef, 0x38, 0x7b, 0xff, 0x00, 0x72, 0x67, 0x2b, 0xe1, 0x71,
0xc1, 0xd1, 0x79, 0x80, 0x4b, 0x41, 0xe8, 0x5f, 0x25, 0x1d, 0x46, 0xf0, 0xc3, 0xe9, 0xe3, 0x7d,
0x7d, 0xc8, 0xfe, 0xe4, 0xb4, 0x3b, 0x38, 0x85, 0x76, 0xaa, 0x41, 0x6d, 0xa8, 0x5f, 0x19, 0xd3,
0x0f, 0xca, 0x01, 0x92, 0xa0, 0x61, 0x4c, 0xb4, 0x0b, 0x5d, 0xa9, 0x0c, 0xfe, 0x04, 0x20, 0x17,
0x08, 0xe6, 0x89, 0xfe, 0x58, 0xea, 0x64, 0x55, 0xbe, 0x53, 0xe8, 0x64, 0x29, 0xbb, 0xd6, 0x0a,
0xec, 0x7a, 0x0a, 0x72, 0x44, 0xe2, 0x4d, 0x18, 0xc4, 0xc4, 0xa2, 0x61, 0x52, 0x26, 0x90, 0xaa,
0xcc, 0x90, 0x0d, 0x3a, 0x24, 0x88, 0x2d, 0xfe, 0x30, 0x93, 0xae, 0x46, 0x82, 0x98, 0xd7, 0x50,
0x81, 0x64, 0x9a, 0x25, 0x92, 0xd9, 0xe7, 0x8b, 0xd6, 0x27, 0x93, 0x6c, 0xfb, 0x93, 0x48, 0xf6,
0x6b, 0x68, 0xc5, 0x62, 0x54, 0x54, 0x25, 0xde, 0x34, 0xd5, 0x3c, 0x40, 0x79, 0x86, 0xbc, 0x3c,
0xc0, 0xa9, 0x29, 0x1a, 0x42, 0x83, 0xcf, 0x60, 0x2a, 0x70, 0x9f, 0xe3, 0xbd, 0xe1, 0x2f, 0xf7,
0x10, 0x66, 0xcc, 0xde, 0x66, 0x93, 0x90, 0x2a, 0xef, 0xdb, 0x17, 0x27, 0x2c, 0x66, 0xcf, 0xcd,
0xd0, 0x97, 0x20, 0x39, 0xe1, 0x7a, 0xbd, 0x0d, 0x3c, 0xba, 0x53, 0x3b, 0xac, 0x22, 0x2f, 0x0f,
0x70, 0xae, 0x42, 0x23, 0x38, 0x74, 0x45, 0x2b, 0x48, 0x87, 0x65, 0xd5, 0xd9, 0xcf, 0xbe, 0xdc,
0x2b, 0x2e, 0x0f, 0x70, 0xcf, 0x2d, 0xf3, 0x5d, 0x46, 0xe0, 0xdd, 0x22, 0x81, 0xbf, 0x81, 0x8e,
0xeb, 0xc5, 0x1b, 0xdf, 0xde, 0x89, 0x8b, 0xec, 0x25, 0xef, 0x46, 0xe8, 0xf8, 0x65, 0x6e, 0xa0,
0x9f, 0x0c, 0xdf, 0x56, 0x44, 0x7e, 0xbb, 0x25, 0x31, 0xb5, 0x36, 0x51, 0xb8, 0xb1, 0xef, 0x6d,
0x46, 0xde, 0x31, 0xb5, 0x29, 0x51, 0x0f, 0x79, 0x3a, 0xef, 0x0a, 0xb7, 0x21, 0x3c, 0xb0, 0x70,
0x98, 0x67, 0xf6, 0x0b, 0x66, 0x8e, 0x4f, 0x9c, 0xe7, 0xb6, 0x1f, 0x19, 0x85, 0x94, 0xff, 0x63,
0x14, 0x42, 0xdf, 0x87, 0x06, 0xff, 0x79, 0xa0, 0xbe, 0xe0, 0x59, 0x1d, 0x16, 0xae, 0x98, 0xa9,
0xb1, 0xd8, 0x1d, 0xfc, 0xb5, 0x06, 0xf2, 0xa8, 0xd4, 0xb0, 0x8e, 0xd2, 0x91, 0x75, 0x34, 0x9b,
0x9a, 0xfa, 0xd4, 0x4c, 0x87, 0xd6, 0x1e, 0x80, 0xa9, 0xff, 0xda, 0xb4, 0xe6, 0x57, 0x9a, 0x31,
0x55, 0x2a, 0x48, 0x86, 0xd6, 0xc2, 0x34, 0x46, 0x1f, 0x74, 0xac, 0x54, 0x11, 0x40, 0x73, 0x61,
0x6a, 0xe6, 0x72, 0xa1, 0xd4, 0xd8, 0xb3, 0xd4, 0x27, 0xb3, 0x5f, 0x1a, 0x4a, 0x1d, 0xbd, 0x82,
0x97, 0x26, 0xd6, 0xa6, 0x0b, 0x6d, 0x64, 0x1a, 0x33, 0x16, 0x71, 0x32, 0xd1, 0xa6, 0x63, 0xa5,
0x81, 0xce, 0xe0, 0xed, 0xe2, 0x66, 0x61, 0xea, 0x13, 0x6b, 0xa2, 0x2f, 0x16, 0xda, 0x85, 0x9e,
0x7d, 0x6d, 0x8e, 0x8d, 0x6b, 0xcd, 0xd4, 0xad, 0x0b, 0x3c, 0x5b, 0xce, 0x95, 0x66, 0xfe, 0xc8,
0x5b, 0x6c, 0xc9, 0xc7, 0x68, 0xa5, 0x8d, 0xba, 0x20, 0xb1, 0x60, 0xcb, 0xa9, 0x61, 0xde, 0x28,
0x12, 0x1b, 0xb4, 0xf7, 0xc2, 0x5d, 0x68, 0x73, 0x05, 0xd0, 0x4b, 0x38, 0x64, 0x71, 0xb5, 0x91,
0x69, 0x61, 0xfd, 0x57, 0x4b, 0x7d, 0x61, 0x2a, 0x32, 0x53, 0x8e, 0x8d, 0xc5, 0x68, 0x86, 0xc7,
0xa9, 0xb5, 0xd2, 0x41, 0x9f, 0xc3, 0x67, 0xc6, 0x58, 0x9f, 0x9a, 0x86, 0x79, 0x63, 0x5d, 0xeb,
0xd8, 0xf8, 0xd6, 0x18, 0x69, 0x2c, 0x67, 0xa5, 0x8b, 0xde, 0xc0, 0xc9, 0x5e, 0xf0, 0xb9, 0x31,
0x9d, 0xea, 0xb9, 0x77, 0x0f, 0xbd, 0x85, 0xfe, 0x9e, 0xc9, 0x64, 0x69, 0x2e, 0xb5, 0x2b, 0x4b,
0xbf, 0x66, 0x67, 0x5a, 0xe8, 0x53, 0x53, 0x39, 0x7c, 0xe4, 0xd0, 0x25, 0x2b, 0x6d, 0x34, 0xd2,
0xe7, 0xa6, 0x3e, 0x56, 0x14, 0xf4, 0x0e, 0xbe, 0xf7, 0x9c, 0x25, 0xd6, 0x27, 0xb3, 0x6b, 0x7d,
0xac, 0xbc, 0x38, 0x97, 0x32, 0x7e, 0x39, 0xef, 0xfe, 0x46, 0x1e, 0xfe, 0xf8, 0x67, 0xe9, 0x2d,
0xdf, 0x36, 0xf9, 0xea, 0xab, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x18, 0x95, 0x9c, 0x97, 0x5f,
0x0e, 0x00, 0x00,
}

View File

@ -5,6 +5,7 @@ package protobuf;
import "enums.proto";
import "contact.proto";
import "shard.proto";
message StickerMessage {
string hash = 1;
@ -168,6 +169,8 @@ message ChatMessage {
repeated UnfurledLink unfurled_links = 16;
Shard shard = 17;
enum ContentType {
UNKNOWN_CONTENT_TYPE = 0;
TEXT_PLAIN = 1;

View File

@ -1144,15 +1144,17 @@ func (m *CommunityCancelRequestToJoin) GetDisplayName() string {
}
type CommunityRequestToJoinResponse struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"`
Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"`
Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"`
CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"`
Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"`
Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"`
CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"`
ProtectedTopicPrivateKey []byte `protobuf:"bytes,7,opt,name=protected_topic_private_key,json=protectedTopicPrivateKey,proto3" json:"protected_topic_private_key,omitempty"`
Shard *Shard `protobuf:"bytes,8,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommunityRequestToJoinResponse) Reset() { *m = CommunityRequestToJoinResponse{} }
@ -1222,6 +1224,20 @@ func (m *CommunityRequestToJoinResponse) GetMagnetUri() string {
return ""
}
func (m *CommunityRequestToJoinResponse) GetProtectedTopicPrivateKey() []byte {
if m != nil {
return m.ProtectedTopicPrivateKey
}
return nil
}
func (m *CommunityRequestToJoinResponse) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
type CommunityRequestToLeave struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
CommunityId []byte `protobuf:"bytes,2,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
@ -1672,135 +1688,138 @@ func init() {
}
var fileDescriptor_f937943d74c1cd8b = []byte{
// 2066 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x41, 0x73, 0x1b, 0x49,
0xf5, 0xcf, 0x68, 0x64, 0x5b, 0x7a, 0xb2, 0x6c, 0xb9, 0x93, 0xd8, 0x13, 0x27, 0xd9, 0x28, 0xf3,
0xff, 0x53, 0x78, 0x43, 0xa1, 0xec, 0x1a, 0x28, 0x52, 0xbb, 0xb0, 0xbb, 0x8a, 0x3c, 0x64, 0xb5,
0x89, 0x46, 0xde, 0x96, 0xbc, 0x81, 0x2d, 0x60, 0xaa, 0x3d, 0xd3, 0xb6, 0xbb, 0x22, 0xcd, 0x88,
0xe9, 0x96, 0x0b, 0x71, 0xe0, 0x00, 0x7c, 0x02, 0xf8, 0x00, 0x1c, 0xb8, 0xc3, 0x47, 0xe0, 0x40,
0x15, 0x47, 0xee, 0xdc, 0x38, 0x72, 0xe4, 0xcc, 0x89, 0xea, 0xee, 0x99, 0xd1, 0x8c, 0x24, 0xc7,
0x59, 0x16, 0xaa, 0x38, 0x69, 0xde, 0xeb, 0xd7, 0xaf, 0xdf, 0x7b, 0xfd, 0xeb, 0xd7, 0xbf, 0x16,
0xec, 0xf8, 0xd1, 0x78, 0x3c, 0x0d, 0x99, 0x60, 0x94, 0xb7, 0x26, 0x71, 0x24, 0x22, 0x54, 0x51,
0x3f, 0xa7, 0xd3, 0xb3, 0xfd, 0x9b, 0xfe, 0x05, 0x11, 0x1e, 0x0b, 0x68, 0x28, 0x98, 0x98, 0xe9,
0xe1, 0xfd, 0x1a, 0x0d, 0xa7, 0xe3, 0xc4, 0xd6, 0xbe, 0x84, 0xb5, 0x67, 0x31, 0x09, 0x05, 0x7a,
0x08, 0x9b, 0xa9, 0xa7, 0x99, 0xc7, 0x02, 0xcb, 0x68, 0x1a, 0x07, 0x9b, 0xb8, 0x96, 0xe9, 0xba,
0x01, 0xba, 0x0b, 0xd5, 0x31, 0x1d, 0x9f, 0xd2, 0x58, 0x8e, 0x97, 0xd4, 0x78, 0x45, 0x2b, 0xba,
0x01, 0xda, 0x83, 0x8d, 0x64, 0x31, 0xcb, 0x6c, 0x1a, 0x07, 0x55, 0xbc, 0x2e, 0xc5, 0x6e, 0x80,
0x6e, 0xc1, 0x9a, 0x3f, 0x8a, 0xfc, 0x57, 0x56, 0xb9, 0x69, 0x1c, 0x94, 0xb1, 0x16, 0xec, 0x3f,
0x97, 0x60, 0xbb, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0x5b, 0xb0, 0x16, 0x47, 0x23, 0xca, 0x2d,
0xa3, 0x69, 0x1e, 0x6c, 0x1d, 0x3e, 0x68, 0xa5, 0x79, 0xb4, 0x16, 0x2c, 0x5b, 0x58, 0x9a, 0x61,
0x6d, 0x8d, 0x3e, 0x81, 0x9d, 0x98, 0x5e, 0x52, 0x32, 0xa2, 0x81, 0x47, 0x7c, 0x3f, 0x9a, 0x86,
0x82, 0x5b, 0xa5, 0xa6, 0x79, 0x50, 0x3b, 0xbc, 0x33, 0x77, 0x81, 0x13, 0x93, 0xb6, 0xb6, 0x78,
0x5a, 0xb2, 0x0c, 0xdc, 0x88, 0x8b, 0x4a, 0x8e, 0x1e, 0xc1, 0xce, 0x88, 0x70, 0xe1, 0x4d, 0x27,
0x01, 0x11, 0xd4, 0xd3, 0x81, 0x9b, 0x2a, 0xf0, 0x6d, 0x39, 0x70, 0xa2, 0xf4, 0x1d, 0x95, 0xc2,
0x2f, 0x0d, 0x58, 0x53, 0x81, 0xa0, 0x3a, 0x54, 0x71, 0xff, 0x85, 0xe3, 0xb9, 0x7d, 0xd7, 0x69,
0xdc, 0x40, 0x5b, 0x00, 0x4a, 0xec, 0xbf, 0x74, 0x1d, 0xdc, 0x30, 0x32, 0xb9, 0x7d, 0xd4, 0xeb,
0xba, 0x8d, 0x32, 0xba, 0x0d, 0x3b, 0x4a, 0x1e, 0xf6, 0x9f, 0x3b, 0xae, 0xd7, 0x6b, 0x0f, 0x86,
0x0e, 0x6e, 0xac, 0xd9, 0xe5, 0x4a, 0xa9, 0x51, 0xb2, 0xcb, 0x15, 0xb3, 0x61, 0x3e, 0xd2, 0x06,
0xbd, 0xb6, 0xdb, 0x7e, 0xe6, 0x78, 0x27, 0x03, 0x07, 0x0f, 0x1e, 0xdd, 0xd6, 0xaa, 0xfe, 0x91,
0x83, 0xdb, 0x43, 0xc7, 0xeb, 0xf4, 0xdd, 0xa1, 0xe3, 0x0e, 0xed, 0x5f, 0x98, 0xb0, 0x9b, 0x95,
0x67, 0x18, 0xbd, 0xa2, 0x61, 0x8f, 0x0a, 0x12, 0x10, 0x41, 0xd0, 0x19, 0x20, 0x3f, 0x0a, 0x45,
0x4c, 0x7c, 0xe1, 0x91, 0x20, 0x88, 0x29, 0xe7, 0x49, 0x71, 0x6b, 0x87, 0xdf, 0x5e, 0x51, 0xdc,
0xc2, 0xec, 0x56, 0x27, 0x99, 0xda, 0x4e, 0x67, 0x3a, 0xa1, 0x88, 0x67, 0x78, 0xc7, 0x5f, 0xd4,
0xa3, 0x26, 0xd4, 0x02, 0xca, 0xfd, 0x98, 0x4d, 0x04, 0x8b, 0x42, 0x85, 0x8c, 0x2a, 0xce, 0xab,
0x24, 0x06, 0xd8, 0x98, 0x9c, 0xd3, 0x04, 0x1a, 0x5a, 0x40, 0xef, 0x41, 0x55, 0xc8, 0x25, 0x87,
0xb3, 0x09, 0x55, 0xe8, 0xd8, 0x3a, 0xbc, 0x77, 0x55, 0x58, 0xd2, 0x06, 0xcf, 0xcd, 0xd1, 0x2e,
0xac, 0xf3, 0xd9, 0xf8, 0x34, 0x1a, 0x59, 0x6b, 0x1a, 0x6d, 0x5a, 0x42, 0x08, 0xca, 0x21, 0x19,
0x53, 0x6b, 0x5d, 0x69, 0xd5, 0x37, 0xda, 0x87, 0x4a, 0x40, 0x7d, 0x36, 0x26, 0x23, 0x6e, 0x6d,
0x34, 0x8d, 0x83, 0x3a, 0xce, 0xe4, 0xfd, 0x23, 0x59, 0xbd, 0x55, 0x89, 0xa2, 0x06, 0x98, 0xaf,
0xe8, 0x4c, 0x9d, 0x83, 0x32, 0x96, 0x9f, 0x32, 0x8b, 0x4b, 0x32, 0x9a, 0xd2, 0x24, 0x43, 0x2d,
0xbc, 0x57, 0x7a, 0x62, 0xd8, 0x7f, 0x33, 0xe0, 0x56, 0x16, 0xef, 0x31, 0x8d, 0xc7, 0x8c, 0x73,
0x16, 0x85, 0x1c, 0xdd, 0x81, 0x0a, 0x0d, 0xb9, 0x17, 0x85, 0x23, 0xed, 0xa9, 0x82, 0x37, 0x68,
0xc8, 0xfb, 0xe1, 0x68, 0x86, 0x2c, 0xd8, 0x98, 0xc4, 0xec, 0x92, 0x08, 0xed, 0xaf, 0x82, 0x53,
0x11, 0x7d, 0x17, 0xd6, 0x89, 0xef, 0x53, 0xce, 0x55, 0xb9, 0xb6, 0x0e, 0xbf, 0xb2, 0xa2, 0x28,
0xb9, 0x45, 0x5a, 0x6d, 0x65, 0x8c, 0x93, 0x49, 0xf6, 0x10, 0xd6, 0xb5, 0x06, 0x21, 0xd8, 0x3a,
0x71, 0x9f, 0xbb, 0xfd, 0x97, 0xae, 0xd7, 0xee, 0x74, 0x9c, 0xc1, 0xa0, 0x71, 0x03, 0xed, 0x40,
0xdd, 0xed, 0x7b, 0x3d, 0xa7, 0xf7, 0xd4, 0xc1, 0x83, 0x8f, 0xbb, 0xc7, 0x0d, 0x03, 0xdd, 0x84,
0xed, 0xae, 0xfb, 0x59, 0x77, 0xd8, 0x1e, 0x76, 0xfb, 0xae, 0xd7, 0x77, 0x5f, 0xfc, 0xa0, 0x51,
0x92, 0xa0, 0xed, 0xbb, 0x1e, 0x76, 0x3e, 0x3d, 0x71, 0x06, 0xc3, 0x86, 0x69, 0xff, 0xca, 0x84,
0xba, 0xda, 0x89, 0x4e, 0xcc, 0x04, 0x8d, 0x19, 0x41, 0x3f, 0x7a, 0x0d, 0xbc, 0x5a, 0xf3, 0x90,
0x0b, 0x93, 0xbe, 0x00, 0xaa, 0xde, 0x81, 0xb2, 0x90, 0xc0, 0x28, 0xbd, 0x01, 0x30, 0x94, 0x65,
0x0e, 0x13, 0xe6, 0x4a, 0x4c, 0x94, 0x73, 0x98, 0xd8, 0x85, 0x75, 0x32, 0x96, 0x67, 0x3e, 0xc5,
0x8f, 0x96, 0x64, 0x8f, 0x53, 0x20, 0xf3, 0x58, 0xc0, 0xad, 0xf5, 0xa6, 0x79, 0x50, 0xc6, 0x15,
0xa5, 0xe8, 0x06, 0x1c, 0x3d, 0x80, 0x9a, 0xdc, 0xcd, 0x09, 0x11, 0x82, 0xc6, 0xa1, 0xc2, 0x52,
0x15, 0x03, 0x0d, 0xf9, 0xb1, 0xd6, 0x14, 0x90, 0x56, 0x51, 0xc0, 0xf9, 0x4f, 0x23, 0xed, 0x37,
0x26, 0x58, 0xc5, 0x02, 0xcc, 0x91, 0x80, 0xb6, 0xa0, 0x94, 0x74, 0xee, 0x2a, 0x2e, 0xb1, 0x00,
0xbd, 0x5f, 0x28, 0xe1, 0x57, 0xaf, 0x2a, 0xe1, 0xdc, 0x43, 0x2b, 0x57, 0xcd, 0x0f, 0x60, 0x4b,
0x57, 0xc2, 0x4f, 0xf6, 0xce, 0x32, 0xd5, 0xd6, 0xee, 0x5d, 0xb1, 0xb5, 0xb8, 0x2e, 0x0a, 0xf0,
0xb8, 0x03, 0x95, 0xe4, 0x42, 0xe0, 0x56, 0xb9, 0x69, 0x1e, 0x54, 0xf1, 0x86, 0xbe, 0x11, 0x38,
0xba, 0x0f, 0xc0, 0xb8, 0x97, 0xa2, 0x7f, 0x4d, 0xa1, 0xbf, 0xca, 0xf8, 0xb1, 0x56, 0xd8, 0x7f,
0x30, 0xa0, 0xac, 0x0e, 0xf9, 0x3d, 0xb0, 0x52, 0xfc, 0xea, 0x5e, 0x79, 0xec, 0xe0, 0x5e, 0x77,
0x30, 0xe8, 0xf6, 0xdd, 0xc6, 0x0d, 0xd4, 0x80, 0xcd, 0xa7, 0x4e, 0xa7, 0xdf, 0x4b, 0x1b, 0xab,
0x21, 0xb1, 0x9d, 0x68, 0x34, 0xbe, 0x1b, 0x25, 0x74, 0x0b, 0x1a, 0x9d, 0xb6, 0xeb, 0x7d, 0xd6,
0x75, 0x5e, 0x7a, 0x9d, 0x8f, 0xdb, 0xae, 0xeb, 0xbc, 0x68, 0x98, 0xe8, 0x3e, 0xdc, 0xc9, 0xb4,
0x6d, 0xf7, 0xc8, 0x3b, 0xee, 0x0f, 0x86, 0xd9, 0x70, 0x19, 0xed, 0xc1, 0xcd, 0xc4, 0x4f, 0xb1,
0x45, 0xa3, 0x5d, 0x40, 0x85, 0x01, 0xdd, 0xe1, 0xd7, 0xed, 0x7f, 0x56, 0x73, 0xe7, 0xff, 0xa8,
0xd8, 0xf8, 0xf4, 0x1d, 0x62, 0xe4, 0x2e, 0x3f, 0xe4, 0xc0, 0x86, 0xbe, 0x37, 0xd3, 0x7b, 0xea,
0x6b, 0x2b, 0xb6, 0x26, 0xe7, 0xa6, 0xa5, 0xaf, 0xbd, 0xe4, 0xac, 0xa4, 0x73, 0xd1, 0x47, 0x50,
0x9b, 0xcc, 0xdb, 0x80, 0x02, 0x7d, 0xed, 0xf0, 0xad, 0xd7, 0x37, 0x0b, 0x9c, 0x9f, 0x82, 0x0e,
0xa1, 0x92, 0x92, 0x03, 0xb5, 0x0d, 0xb5, 0xc3, 0xdd, 0xdc, 0x74, 0xb5, 0x5b, 0x7a, 0x14, 0x67,
0x76, 0xe8, 0x43, 0x58, 0x93, 0xfb, 0xa8, 0x4f, 0x47, 0xed, 0xf0, 0xed, 0x6b, 0x42, 0x97, 0x5e,
0x92, 0xc0, 0xf5, 0x3c, 0x09, 0x8c, 0x53, 0x12, 0x7a, 0x23, 0xc6, 0x85, 0xb5, 0xa1, 0x81, 0x71,
0x4a, 0xc2, 0x17, 0x8c, 0x0b, 0xe4, 0x02, 0xf8, 0x44, 0xd0, 0xf3, 0x28, 0x66, 0x54, 0x9e, 0xa0,
0x85, 0x56, 0xb2, 0x7a, 0x81, 0x6c, 0x82, 0x5e, 0x25, 0xe7, 0x01, 0x3d, 0x01, 0x8b, 0xc4, 0xfe,
0x05, 0xbb, 0xa4, 0xde, 0x98, 0x9c, 0x87, 0x54, 0x8c, 0x58, 0xf8, 0x2a, 0xb9, 0xd5, 0xab, 0x6a,
0x47, 0x76, 0x93, 0xf1, 0x5e, 0x36, 0xac, 0x2e, 0x77, 0xf4, 0x0c, 0xb6, 0x48, 0x30, 0x66, 0xa1,
0xc7, 0xa9, 0x10, 0x2c, 0x3c, 0xe7, 0x16, 0xa8, 0xfa, 0x34, 0x57, 0x44, 0xd3, 0x96, 0x86, 0x83,
0xc4, 0x0e, 0xd7, 0x49, 0x5e, 0x44, 0xff, 0x07, 0x75, 0x16, 0x8a, 0x38, 0xf2, 0xc6, 0x94, 0x73,
0x79, 0x05, 0xd6, 0xd4, 0xf1, 0xdc, 0x54, 0xca, 0x9e, 0xd6, 0x49, 0xa3, 0x68, 0x9a, 0x37, 0xda,
0xd4, 0x46, 0x4a, 0x99, 0x1a, 0x35, 0xa1, 0x4a, 0x43, 0x3f, 0x9e, 0x4d, 0x04, 0x0d, 0xac, 0xba,
0x3c, 0x34, 0x8a, 0xc4, 0xcc, 0x95, 0xb2, 0xd1, 0x09, 0x72, 0xce, 0xad, 0x2d, 0x55, 0x55, 0xf5,
0x8d, 0x08, 0xec, 0xe8, 0x63, 0x9c, 0x87, 0xca, 0xb6, 0xaa, 0xec, 0x37, 0xaf, 0xa9, 0xec, 0x42,
0x73, 0x48, 0xea, 0xdb, 0x10, 0x0b, 0x6a, 0xf4, 0x43, 0xb8, 0x33, 0xa7, 0x8e, 0x6a, 0x94, 0x7b,
0xe3, 0x84, 0x46, 0x58, 0x0d, 0xb5, 0x54, 0xf3, 0x3a, 0xba, 0x81, 0xf7, 0xfc, 0x82, 0x9e, 0x67,
0x2c, 0xe6, 0x1d, 0xb8, 0x45, 0x7c, 0xa1, 0xb6, 0x50, 0xe3, 0xde, 0x53, 0x5c, 0xcd, 0xda, 0x51,
0xfb, 0x87, 0xf4, 0x58, 0x72, 0x40, 0x3a, 0x72, 0x64, 0xff, 0x04, 0x36, 0xf3, 0x07, 0x26, 0xdf,
0x5f, 0xab, 0xba, 0xbf, 0x3e, 0xce, 0xf7, 0xd7, 0x02, 0x4d, 0x5c, 0x60, 0x9a, 0xb9, 0xd6, 0xbb,
0xff, 0x29, 0xc0, 0x1c, 0xcc, 0x2b, 0x9c, 0x7e, 0xbd, 0xe8, 0x74, 0x6f, 0x85, 0x53, 0x39, 0x3f,
0xef, 0xf2, 0x73, 0xd8, 0x5e, 0x80, 0xef, 0x0a, 0xbf, 0xef, 0x16, 0xfd, 0xde, 0x5d, 0xe5, 0x57,
0x3b, 0x99, 0xe5, 0x7d, 0x9f, 0xc3, 0xed, 0x95, 0x1b, 0xb8, 0x62, 0x85, 0x27, 0xc5, 0x15, 0xec,
0xeb, 0x2f, 0x8a, 0xfc, 0x95, 0xf4, 0xe3, 0x1c, 0x01, 0x2d, 0x1c, 0x05, 0x74, 0x04, 0x0f, 0x26,
0x2c, 0x4c, 0x41, 0xed, 0x91, 0xd1, 0x28, 0xdb, 0x43, 0x1a, 0x92, 0xd3, 0x11, 0x0d, 0x12, 0x52,
0x74, 0x77, 0xc2, 0xc2, 0x04, 0xe6, 0xed, 0xd1, 0x28, 0xdb, 0x3c, 0x65, 0x62, 0xff, 0xb5, 0x04,
0xf5, 0x42, 0x05, 0xd1, 0x07, 0xf3, 0xfe, 0xa9, 0xe9, 0xc6, 0xff, 0x5f, 0x51, 0xeb, 0x37, 0x6b,
0x9c, 0xa5, 0x2f, 0xd7, 0x38, 0xcd, 0x37, 0x6c, 0x9c, 0x0f, 0xa0, 0x96, 0xb4, 0x26, 0xf5, 0xc0,
0xd2, 0x6c, 0x24, 0xed, 0x56, 0xf2, 0x7d, 0xb5, 0x0f, 0x95, 0x49, 0xc4, 0x99, 0x22, 0xd1, 0xb2,
0x1b, 0xaf, 0xe1, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x67, 0x09, 0x44, 0x8b, 0x81, 0x1a,
0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66, 0x31, 0x78, 0xfb, 0xd7, 0x06,
0x6c, 0x2f, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40, 0x2a, 0xa2, 0x7b, 0x50, 0xe5,
0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48, 0x82, 0xe6, 0x5f, 0x10, 0xa6,
0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x08, 0x1a, 0x8c, 0xb7, 0x59, 0x1c, 0xc4,
0xd1, 0x24, 0x21, 0x59, 0xaa, 0xce, 0x15, 0xbc, 0xa4, 0xb7, 0xff, 0x61, 0xe4, 0x70, 0x8b, 0xe9,
0x4f, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x49, 0xc4, 0xae, 0xba, 0xb5, 0x13, 0x2e, 0x9f, 0xcb, 0x5c,
0x72, 0x79, 0x57, 0x26, 0x7f, 0xe5, 0xe3, 0x77, 0xf1, 0x55, 0x5d, 0x5e, 0x7e, 0x55, 0x3f, 0x84,
0xcd, 0x80, 0xf1, 0xc9, 0x88, 0xcc, 0xb4, 0xeb, 0xb5, 0xe4, 0xf9, 0xa4, 0x75, 0xca, 0xfd, 0xf7,
0x56, 0xbd, 0x70, 0xd7, 0xaf, 0x79, 0xe1, 0x2e, 0xbf, 0x6e, 0xed, 0xdf, 0x1a, 0x70, 0x2f, 0x4b,
0xd9, 0x09, 0x98, 0x18, 0x5c, 0x90, 0x98, 0x06, 0x73, 0xce, 0xbd, 0x3a, 0xf1, 0xc5, 0x24, 0x4a,
0xcb, 0x49, 0xac, 0x8c, 0xd0, 0xfc, 0xe2, 0x11, 0xfe, 0x3e, 0x1f, 0x61, 0x87, 0x84, 0x3e, 0x1d,
0xfd, 0x4f, 0x6f, 0x8d, 0xfd, 0x77, 0x03, 0xde, 0x5a, 0x8d, 0x22, 0x4c, 0xf9, 0x24, 0x0a, 0x39,
0xbd, 0x22, 0xe4, 0xef, 0x40, 0x35, 0x5b, 0xea, 0x35, 0x1d, 0x28, 0x77, 0x1f, 0xe3, 0xf9, 0x04,
0x79, 0xda, 0xe4, 0x6b, 0x4f, 0x51, 0x01, 0x53, 0x01, 0x3c, 0x93, 0xe5, 0x7a, 0xe7, 0x31, 0x09,
0x45, 0x92, 0x91, 0x16, 0x96, 0xd2, 0x5d, 0x5b, 0x4e, 0xf7, 0x3e, 0x80, 0x66, 0x49, 0xde, 0x34,
0x66, 0xc9, 0x0b, 0xba, 0xaa, 0x35, 0x27, 0x31, 0xb3, 0x31, 0xec, 0x2d, 0x67, 0xfa, 0x82, 0x92,
0x4b, 0xfa, 0x6f, 0xe3, 0xc6, 0xfe, 0x3e, 0x3c, 0xcc, 0x75, 0x27, 0x7d, 0x01, 0x2c, 0x12, 0xb2,
0x2b, 0xbc, 0x17, 0xa3, 0x2d, 0x2d, 0x46, 0xfb, 0x47, 0x03, 0x6a, 0x2f, 0xc9, 0xab, 0x69, 0xca,
0x9e, 0x1a, 0x60, 0x72, 0x76, 0x9e, 0xfc, 0xad, 0x25, 0x3f, 0x65, 0x9f, 0x11, 0x6c, 0x4c, 0xb9,
0x20, 0xe3, 0x89, 0x9a, 0x5f, 0xc6, 0x73, 0x85, 0x5c, 0x54, 0x44, 0x13, 0xe6, 0xab, 0xf2, 0x6e,
0x62, 0x2d, 0xa8, 0x47, 0x3b, 0x99, 0x8d, 0x22, 0x92, 0xe2, 0x25, 0x15, 0xf5, 0x48, 0x10, 0xb0,
0xf0, 0x3c, 0x29, 0x6d, 0x2a, 0xca, 0x6e, 0x79, 0x41, 0xf8, 0x85, 0x2a, 0xe8, 0x26, 0x56, 0xdf,
0xc8, 0x86, 0x4d, 0x71, 0xc1, 0xe2, 0xe0, 0x98, 0xc4, 0xb2, 0x0e, 0xc9, 0x53, 0xb2, 0xa0, 0xb3,
0x7f, 0x0e, 0xfb, 0xb9, 0x04, 0xd2, 0xb2, 0xa4, 0xb4, 0xc8, 0x82, 0x8d, 0x4b, 0x1a, 0xcb, 0xdb,
0x48, 0xe5, 0x54, 0xc7, 0xa9, 0x28, 0xd7, 0x3b, 0x8b, 0xa3, 0x71, 0x92, 0x92, 0xfa, 0x96, 0x2f,
0x43, 0x11, 0x25, 0x7f, 0x64, 0x95, 0x44, 0x24, 0xd7, 0x97, 0x2f, 0x6e, 0x1a, 0x8a, 0xa1, 0x4a,
0x52, 0x3e, 0xd0, 0x36, 0x71, 0x41, 0x67, 0xff, 0xce, 0x00, 0xb4, 0x1c, 0xc0, 0x6b, 0x16, 0xfe,
0x08, 0x2a, 0x19, 0xed, 0xd3, 0x88, 0xce, 0xdd, 0xcb, 0x57, 0xa7, 0x82, 0xb3, 0x59, 0xe8, 0x5d,
0xe9, 0x41, 0xd9, 0xa4, 0xdd, 0xe3, 0xf6, 0x4a, 0x0f, 0x38, 0x33, 0xb3, 0xff, 0x64, 0xc0, 0x83,
0x65, 0xdf, 0xdd, 0x30, 0xa0, 0x3f, 0x7d, 0x83, 0x5a, 0x7d, 0xf9, 0x90, 0x77, 0x61, 0x3d, 0x3a,
0x3b, 0xe3, 0x54, 0x24, 0xd5, 0x4d, 0x24, 0xb9, 0x0b, 0x9c, 0xfd, 0x8c, 0x26, 0xff, 0x7a, 0xaa,
0xef, 0x45, 0x8c, 0x94, 0x33, 0x8c, 0xd8, 0x7f, 0x31, 0x60, 0xef, 0x8a, 0x2c, 0xd0, 0x73, 0xa8,
0x24, 0x8f, 0x94, 0x94, 0xee, 0x3c, 0x7e, 0x5d, 0x8c, 0x6a, 0x52, 0x2b, 0x11, 0x12, 0xe6, 0x93,
0x39, 0xd8, 0x3f, 0x83, 0x7a, 0x61, 0x68, 0x05, 0x91, 0xf8, 0xb0, 0x48, 0x24, 0xde, 0xbe, 0x76,
0xb1, 0xac, 0x2a, 0x73, 0x62, 0xf1, 0xb4, 0xfe, 0x79, 0xad, 0xf5, 0xf8, 0xfd, 0x74, 0xe6, 0xe9,
0xba, 0xfa, 0xfa, 0xc6, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xba, 0xde, 0x8a, 0xe5, 0xae, 0x16,
0x00, 0x00,
// 2122 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x73, 0x1b, 0x49,
0xf5, 0xdf, 0xd1, 0x48, 0xb6, 0xf4, 0x64, 0xd9, 0x72, 0x27, 0xb1, 0x27, 0x4e, 0xb2, 0x51, 0xe6,
0xfb, 0xdd, 0xc2, 0x1b, 0x0a, 0x67, 0xd7, 0x40, 0x91, 0xda, 0x65, 0x7f, 0x28, 0xf2, 0x90, 0xd5,
0x26, 0x1a, 0x79, 0x5b, 0xf2, 0x06, 0xb6, 0x80, 0xa9, 0xf6, 0x4c, 0xdb, 0xee, 0x8a, 0x34, 0x23,
0xa6, 0x5b, 0x2e, 0xc4, 0x81, 0x03, 0xf0, 0x17, 0xc0, 0x1f, 0xc0, 0x81, 0x3b, 0xfc, 0x09, 0x1c,
0xa8, 0xe2, 0xb8, 0x77, 0x6e, 0xfc, 0x09, 0x9c, 0x39, 0x51, 0xdd, 0x3d, 0x33, 0x9a, 0x91, 0xe4,
0x38, 0xcb, 0x42, 0x15, 0x27, 0xcd, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, 0x3e, 0xfd, 0xfa, 0xd3,
0x82, 0x6d, 0x3f, 0x1a, 0x8f, 0xa7, 0x21, 0x13, 0x8c, 0xf2, 0x83, 0x49, 0x1c, 0x89, 0x08, 0x55,
0xd5, 0xcf, 0xe9, 0xf4, 0x6c, 0xef, 0x86, 0x7f, 0x41, 0x84, 0xc7, 0x02, 0x1a, 0x0a, 0x26, 0x66,
0x7a, 0x78, 0xaf, 0x4e, 0xc3, 0xe9, 0x98, 0xa7, 0x02, 0xbf, 0x20, 0x71, 0xa0, 0x05, 0xfb, 0x12,
0x2a, 0x4f, 0x63, 0x12, 0x0a, 0xf4, 0x00, 0x36, 0x52, 0xb7, 0x33, 0x8f, 0x05, 0x96, 0xd1, 0x32,
0xf6, 0x37, 0x70, 0x3d, 0xd3, 0x75, 0x03, 0x74, 0x07, 0x6a, 0x63, 0x3a, 0x3e, 0xa5, 0xb1, 0x1c,
0x2f, 0xa9, 0xf1, 0xaa, 0x56, 0x74, 0x03, 0xb4, 0x0b, 0xeb, 0xc9, 0xca, 0x96, 0xd9, 0x32, 0xf6,
0x6b, 0x78, 0x4d, 0x8a, 0xdd, 0x00, 0xdd, 0x84, 0x8a, 0x3f, 0x8a, 0xfc, 0x97, 0x56, 0xb9, 0x65,
0xec, 0x97, 0xb1, 0x16, 0xec, 0xbf, 0x96, 0x60, 0xab, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0xbb,
0x50, 0x89, 0xa3, 0x11, 0xe5, 0x96, 0xd1, 0x32, 0xf7, 0x37, 0x0f, 0xef, 0x1f, 0xa4, 0x9b, 0x3a,
0x58, 0xb0, 0x3c, 0xc0, 0xd2, 0x0c, 0x6b, 0x6b, 0xf4, 0x29, 0x6c, 0xc7, 0xf4, 0x92, 0x92, 0x11,
0x0d, 0x3c, 0xe2, 0xfb, 0xd1, 0x34, 0x14, 0xdc, 0x2a, 0xb5, 0xcc, 0xfd, 0xfa, 0xe1, 0xed, 0xb9,
0x0b, 0x9c, 0x98, 0xb4, 0xb5, 0xc5, 0x93, 0x92, 0x65, 0xe0, 0x66, 0x5c, 0x54, 0x72, 0xf4, 0x10,
0xb6, 0x47, 0x84, 0x0b, 0x6f, 0x3a, 0x09, 0x88, 0xa0, 0x9e, 0x0e, 0xdc, 0x54, 0x81, 0x6f, 0xc9,
0x81, 0x13, 0xa5, 0xef, 0xa8, 0x2d, 0xfc, 0xda, 0x80, 0x8a, 0x0a, 0x04, 0x35, 0xa0, 0x86, 0xfb,
0xcf, 0x1d, 0xcf, 0xed, 0xbb, 0x4e, 0xf3, 0x0d, 0xb4, 0x09, 0xa0, 0xc4, 0xfe, 0x0b, 0xd7, 0xc1,
0x4d, 0x23, 0x93, 0xdb, 0x47, 0xbd, 0xae, 0xdb, 0x2c, 0xa3, 0x5b, 0xb0, 0xad, 0xe4, 0x61, 0xff,
0x99, 0xe3, 0x7a, 0xbd, 0xf6, 0x60, 0xe8, 0xe0, 0x66, 0xc5, 0x2e, 0x57, 0x4b, 0xcd, 0x92, 0x5d,
0xae, 0x9a, 0x4d, 0xf3, 0xa1, 0x36, 0xe8, 0xb5, 0xdd, 0xf6, 0x53, 0xc7, 0x3b, 0x19, 0x38, 0x78,
0xf0, 0xf0, 0x96, 0x56, 0xf5, 0x8f, 0x1c, 0xdc, 0x1e, 0x3a, 0x5e, 0xa7, 0xef, 0x0e, 0x1d, 0x77,
0x68, 0xff, 0xca, 0x84, 0x9d, 0x2c, 0x3d, 0xc3, 0xe8, 0x25, 0x0d, 0x7b, 0x54, 0x90, 0x80, 0x08,
0x82, 0xce, 0x00, 0xf9, 0x51, 0x28, 0x62, 0xe2, 0x0b, 0x8f, 0x04, 0x41, 0x4c, 0x39, 0x4f, 0x92,
0x5b, 0x3f, 0xfc, 0xde, 0x8a, 0xe4, 0x16, 0x66, 0x1f, 0x74, 0x92, 0xa9, 0xed, 0x74, 0xa6, 0x13,
0x8a, 0x78, 0x86, 0xb7, 0xfd, 0x45, 0x3d, 0x6a, 0x41, 0x3d, 0xa0, 0xdc, 0x8f, 0xd9, 0x44, 0xb0,
0x28, 0x54, 0xc8, 0xa8, 0xe1, 0xbc, 0x4a, 0x62, 0x80, 0x8d, 0xc9, 0x39, 0x4d, 0xa0, 0xa1, 0x05,
0xf4, 0x1e, 0xd4, 0x84, 0x5c, 0x72, 0x38, 0x9b, 0x50, 0x85, 0x8e, 0xcd, 0xc3, 0xbb, 0x57, 0x85,
0x25, 0x6d, 0xf0, 0xdc, 0x1c, 0xed, 0xc0, 0x1a, 0x9f, 0x8d, 0x4f, 0xa3, 0x91, 0x55, 0xd1, 0x68,
0xd3, 0x12, 0x42, 0x50, 0x0e, 0xc9, 0x98, 0x5a, 0x6b, 0x4a, 0xab, 0xbe, 0xd1, 0x1e, 0x54, 0x03,
0xea, 0xb3, 0x31, 0x19, 0x71, 0x6b, 0xbd, 0x65, 0xec, 0x37, 0x70, 0x26, 0xef, 0x1d, 0xc9, 0xec,
0xad, 0xda, 0x28, 0x6a, 0x82, 0xf9, 0x92, 0xce, 0xd4, 0x39, 0x28, 0x63, 0xf9, 0x29, 0x77, 0x71,
0x49, 0x46, 0x53, 0x9a, 0xec, 0x50, 0x0b, 0xef, 0x95, 0x1e, 0x1b, 0xf6, 0xdf, 0x0d, 0xb8, 0x99,
0xc5, 0x7b, 0x4c, 0xe3, 0x31, 0xe3, 0x9c, 0x45, 0x21, 0x47, 0xb7, 0xa1, 0x4a, 0x43, 0xee, 0x45,
0xe1, 0x48, 0x7b, 0xaa, 0xe2, 0x75, 0x1a, 0xf2, 0x7e, 0x38, 0x9a, 0x21, 0x0b, 0xd6, 0x27, 0x31,
0xbb, 0x24, 0x42, 0xfb, 0xab, 0xe2, 0x54, 0x44, 0x1f, 0xc0, 0x1a, 0xf1, 0x7d, 0xca, 0xb9, 0x4a,
0xd7, 0xe6, 0xe1, 0x5b, 0x2b, 0x92, 0x92, 0x5b, 0xe4, 0xa0, 0xad, 0x8c, 0x71, 0x32, 0xc9, 0x1e,
0xc2, 0x9a, 0xd6, 0x20, 0x04, 0x9b, 0x27, 0xee, 0x33, 0xb7, 0xff, 0xc2, 0xf5, 0xda, 0x9d, 0x8e,
0x33, 0x18, 0x34, 0xdf, 0x40, 0xdb, 0xd0, 0x70, 0xfb, 0x5e, 0xcf, 0xe9, 0x3d, 0x71, 0xf0, 0xe0,
0x93, 0xee, 0x71, 0xd3, 0x40, 0x37, 0x60, 0xab, 0xeb, 0x7e, 0xde, 0x1d, 0xb6, 0x87, 0xdd, 0xbe,
0xeb, 0xf5, 0xdd, 0xe7, 0x3f, 0x6a, 0x96, 0x24, 0x68, 0xfb, 0xae, 0x87, 0x9d, 0xcf, 0x4e, 0x9c,
0xc1, 0xb0, 0x69, 0xda, 0xbf, 0x31, 0xa1, 0xa1, 0x2a, 0xd1, 0x89, 0x99, 0xa0, 0x31, 0x23, 0xe8,
0x27, 0xaf, 0x80, 0xd7, 0xc1, 0x3c, 0xe4, 0xc2, 0xa4, 0xaf, 0x80, 0xaa, 0x77, 0xa0, 0x2c, 0x24,
0x30, 0x4a, 0xaf, 0x01, 0x0c, 0x65, 0x99, 0xc3, 0x84, 0xb9, 0x12, 0x13, 0xe5, 0x1c, 0x26, 0x76,
0x60, 0x8d, 0x8c, 0xe5, 0x99, 0x4f, 0xf1, 0xa3, 0x25, 0xd9, 0xe3, 0x14, 0xc8, 0x3c, 0x16, 0x70,
0x6b, 0xad, 0x65, 0xee, 0x97, 0x71, 0x55, 0x29, 0xba, 0x01, 0x47, 0xf7, 0xa1, 0x2e, 0xab, 0x39,
0x21, 0x42, 0xd0, 0x38, 0x54, 0x58, 0xaa, 0x61, 0xa0, 0x21, 0x3f, 0xd6, 0x9a, 0x02, 0xd2, 0xaa,
0x0a, 0x38, 0xff, 0x69, 0xa4, 0xfd, 0xce, 0x04, 0xab, 0x98, 0x80, 0x39, 0x12, 0xd0, 0x26, 0x94,
0x92, 0xce, 0x5d, 0xc3, 0x25, 0x16, 0xa0, 0xf7, 0x0b, 0x29, 0xfc, 0xc6, 0x55, 0x29, 0x9c, 0x7b,
0x38, 0xc8, 0x65, 0xf3, 0x43, 0xd8, 0xd4, 0x99, 0xf0, 0x93, 0xda, 0x59, 0xa6, 0x2a, 0xed, 0xee,
0x15, 0xa5, 0xc5, 0x0d, 0x51, 0x80, 0xc7, 0x6d, 0xa8, 0x26, 0x17, 0x02, 0xb7, 0xca, 0x2d, 0x73,
0xbf, 0x86, 0xd7, 0xf5, 0x8d, 0xc0, 0xd1, 0x3d, 0x00, 0xc6, 0xbd, 0x14, 0xfd, 0x15, 0x85, 0xfe,
0x1a, 0xe3, 0xc7, 0x5a, 0x61, 0xff, 0xc9, 0x80, 0xb2, 0x3a, 0xe4, 0x77, 0xc1, 0x4a, 0xf1, 0xab,
0x7b, 0xe5, 0xb1, 0x83, 0x7b, 0xdd, 0xc1, 0xa0, 0xdb, 0x77, 0x9b, 0x6f, 0xa0, 0x26, 0x6c, 0x3c,
0x71, 0x3a, 0xfd, 0x5e, 0xda, 0x58, 0x0d, 0x89, 0xed, 0x44, 0xa3, 0xf1, 0xdd, 0x2c, 0xa1, 0x9b,
0xd0, 0xec, 0xb4, 0x5d, 0xef, 0xf3, 0xae, 0xf3, 0xc2, 0xeb, 0x7c, 0xd2, 0x76, 0x5d, 0xe7, 0x79,
0xd3, 0x44, 0xf7, 0xe0, 0x76, 0xa6, 0x6d, 0xbb, 0x47, 0xde, 0x71, 0x7f, 0x30, 0xcc, 0x86, 0xcb,
0x68, 0x17, 0x6e, 0x24, 0x7e, 0x8a, 0x2d, 0x1a, 0xed, 0x00, 0x2a, 0x0c, 0xe8, 0x0e, 0xbf, 0x66,
0xff, 0xb3, 0x96, 0x3b, 0xff, 0x47, 0xc5, 0xc6, 0xa7, 0xef, 0x10, 0x23, 0x77, 0xf9, 0x21, 0x07,
0xd6, 0xf5, 0xbd, 0x99, 0xde, 0x53, 0xdf, 0x5c, 0x51, 0x9a, 0x9c, 0x9b, 0x03, 0x7d, 0xed, 0x25,
0x67, 0x25, 0x9d, 0x8b, 0x3e, 0x86, 0xfa, 0x64, 0xde, 0x06, 0x14, 0xe8, 0xeb, 0x87, 0x6f, 0xbe,
0xba, 0x59, 0xe0, 0xfc, 0x14, 0x74, 0x08, 0xd5, 0x94, 0x29, 0xa8, 0x32, 0xd4, 0x0f, 0x77, 0x72,
0xd3, 0x55, 0xb5, 0xf4, 0x28, 0xce, 0xec, 0xd0, 0x47, 0x50, 0x91, 0x75, 0xd4, 0xa7, 0xa3, 0x7e,
0xf8, 0xf6, 0x35, 0xa1, 0x4b, 0x2f, 0x49, 0xe0, 0x7a, 0x9e, 0x04, 0xc6, 0x29, 0x09, 0xbd, 0x11,
0xe3, 0xc2, 0x5a, 0xd7, 0xc0, 0x38, 0x25, 0xe1, 0x73, 0xc6, 0x05, 0x72, 0x01, 0x7c, 0x22, 0xe8,
0x79, 0x14, 0x33, 0x2a, 0x4f, 0xd0, 0x42, 0x2b, 0x59, 0xbd, 0x40, 0x36, 0x41, 0xaf, 0x92, 0xf3,
0x80, 0x1e, 0x83, 0x45, 0x62, 0xff, 0x82, 0x5d, 0x52, 0x6f, 0x4c, 0xce, 0x43, 0x2a, 0x46, 0x2c,
0x7c, 0x99, 0xdc, 0xea, 0x35, 0x55, 0x91, 0x9d, 0x64, 0xbc, 0x97, 0x0d, 0xab, 0xcb, 0x1d, 0x3d,
0x85, 0x4d, 0x12, 0x8c, 0x59, 0xe8, 0x71, 0x2a, 0x04, 0x0b, 0xcf, 0xb9, 0x05, 0x2a, 0x3f, 0xad,
0x15, 0xd1, 0xb4, 0xa5, 0xe1, 0x20, 0xb1, 0xc3, 0x0d, 0x92, 0x17, 0xd1, 0xff, 0x41, 0x83, 0x85,
0x22, 0x8e, 0xbc, 0x31, 0xe5, 0x5c, 0x5e, 0x81, 0x75, 0x75, 0x3c, 0x37, 0x94, 0xb2, 0xa7, 0x75,
0xd2, 0x28, 0x9a, 0xe6, 0x8d, 0x36, 0xb4, 0x91, 0x52, 0xa6, 0x46, 0x2d, 0xa8, 0xd1, 0xd0, 0x8f,
0x67, 0x13, 0x41, 0x03, 0xab, 0x21, 0x0f, 0x8d, 0x22, 0x31, 0x73, 0xa5, 0x6c, 0x74, 0x82, 0x9c,
0x73, 0x6b, 0x53, 0x65, 0x55, 0x7d, 0x23, 0x02, 0xdb, 0xfa, 0x18, 0xe7, 0xa1, 0xb2, 0xa5, 0x32,
0xfb, 0x9d, 0x6b, 0x32, 0xbb, 0xd0, 0x1c, 0x92, 0xfc, 0x36, 0xc5, 0x82, 0x1a, 0xfd, 0x18, 0x6e,
0xcf, 0xa9, 0xa3, 0x1a, 0xe5, 0xde, 0x38, 0xa1, 0x11, 0x56, 0x53, 0x2d, 0xd5, 0xba, 0x8e, 0x6e,
0xe0, 0x5d, 0xbf, 0xa0, 0xe7, 0x19, 0x8b, 0x79, 0x07, 0x6e, 0x12, 0x5f, 0xa8, 0x12, 0x6a, 0xdc,
0x7b, 0x8a, 0xab, 0x59, 0xdb, 0xaa, 0x7e, 0x48, 0x8f, 0x25, 0x07, 0xa4, 0x23, 0x47, 0xf6, 0x4e,
0x60, 0x23, 0x7f, 0x60, 0xf2, 0xfd, 0xb5, 0xa6, 0xfb, 0xeb, 0xa3, 0x7c, 0x7f, 0x2d, 0xd0, 0xc4,
0x05, 0xa6, 0x99, 0x6b, 0xbd, 0x7b, 0x9f, 0x01, 0xcc, 0xc1, 0xbc, 0xc2, 0xe9, 0xb7, 0x8a, 0x4e,
0x77, 0x57, 0x38, 0x95, 0xf3, 0xf3, 0x2e, 0xbf, 0x80, 0xad, 0x05, 0xf8, 0xae, 0xf0, 0xfb, 0x6e,
0xd1, 0xef, 0x9d, 0x55, 0x7e, 0xb5, 0x93, 0x59, 0xde, 0xf7, 0x39, 0xdc, 0x5a, 0x59, 0xc0, 0x15,
0x2b, 0x3c, 0x2e, 0xae, 0x60, 0x5f, 0x7f, 0x51, 0xe4, 0xaf, 0xa4, 0x9f, 0xe6, 0x08, 0x68, 0xe1,
0x28, 0xa0, 0x23, 0xb8, 0x3f, 0x61, 0x61, 0x0a, 0x6a, 0x8f, 0x8c, 0x46, 0x59, 0x0d, 0x69, 0x48,
0x4e, 0x47, 0x34, 0x48, 0x48, 0xd1, 0x9d, 0x09, 0x0b, 0x13, 0x98, 0xb7, 0x47, 0xa3, 0xac, 0x78,
0xca, 0xc4, 0xfe, 0x5b, 0x09, 0x1a, 0x85, 0x0c, 0xa2, 0x0f, 0xe7, 0xfd, 0x53, 0xd3, 0x8d, 0xff,
0xbf, 0x22, 0xd7, 0xaf, 0xd7, 0x38, 0x4b, 0x5f, 0xaf, 0x71, 0x9a, 0xaf, 0xd9, 0x38, 0xef, 0x43,
0x3d, 0x69, 0x4d, 0xea, 0x81, 0xa5, 0xd9, 0x48, 0xda, 0xad, 0xe4, 0xfb, 0x6a, 0x0f, 0xaa, 0x93,
0x88, 0x33, 0x45, 0xa2, 0x65, 0x37, 0xae, 0xe0, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x7b,
0x09, 0x44, 0x8b, 0x81, 0x1a, 0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66,
0x31, 0x78, 0xfb, 0xb7, 0x06, 0x6c, 0x2d, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40,
0x2a, 0xa2, 0xbb, 0x50, 0xe3, 0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48,
0x82, 0xe6, 0x5f, 0x10, 0xa6, 0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x10, 0x9a,
0x8c, 0xb7, 0x59, 0x1c, 0xc4, 0xd1, 0x24, 0x21, 0x59, 0x2a, 0xcf, 0x55, 0xbc, 0xa4, 0xb7, 0xff,
0x61, 0xe4, 0x70, 0x8b, 0xe9, 0xcf, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x69, 0xc4, 0xae, 0xba, 0xb5,
0x13, 0x2e, 0x9f, 0xdb, 0xb9, 0xe4, 0xf2, 0xae, 0xdc, 0xfc, 0x95, 0x8f, 0xdf, 0xc5, 0x57, 0x75,
0x79, 0xf9, 0x55, 0xfd, 0x00, 0x36, 0x02, 0xc6, 0x27, 0x23, 0x32, 0xd3, 0xae, 0x2b, 0xc9, 0xf3,
0x49, 0xeb, 0x94, 0xfb, 0x1f, 0xac, 0x7a, 0xe1, 0xae, 0x5d, 0xf3, 0xc2, 0x5d, 0x7e, 0xdd, 0xda,
0xbf, 0x37, 0xe0, 0x6e, 0xb6, 0x65, 0x27, 0x60, 0x62, 0x70, 0x41, 0x62, 0x1a, 0xcc, 0x39, 0xf7,
0xea, 0x8d, 0x2f, 0x6e, 0xa2, 0xb4, 0xbc, 0x89, 0x95, 0x11, 0x9a, 0x5f, 0x3d, 0xc2, 0x3f, 0xe6,
0x23, 0xec, 0x90, 0xd0, 0xa7, 0xa3, 0xff, 0xe9, 0xd2, 0xd8, 0x5f, 0x96, 0xe0, 0xcd, 0xd5, 0x28,
0xc2, 0x94, 0x4f, 0xa2, 0x90, 0xd3, 0x2b, 0x42, 0xfe, 0x3e, 0xd4, 0xb2, 0xa5, 0x5e, 0xd1, 0x81,
0x72, 0xf7, 0x31, 0x9e, 0x4f, 0x90, 0xa7, 0x4d, 0xbe, 0xf6, 0x14, 0x15, 0x30, 0x15, 0xc0, 0x33,
0x59, 0xae, 0x77, 0x1e, 0x93, 0x50, 0x24, 0x3b, 0xd2, 0xc2, 0xd2, 0x76, 0x2b, 0xcb, 0xdb, 0xbd,
0x07, 0xa0, 0x59, 0x92, 0x37, 0x8d, 0x59, 0xf2, 0x82, 0xae, 0x69, 0xcd, 0x49, 0xcc, 0xd0, 0x07,
0x70, 0x47, 0xc6, 0x47, 0x7d, 0x41, 0x03, 0x4f, 0x44, 0x13, 0xe6, 0xa7, 0x14, 0xde, 0x93, 0xad,
0x68, 0x5d, 0x39, 0xb4, 0x32, 0x93, 0xa1, 0xb4, 0x48, 0x28, 0xfd, 0x33, 0x3a, 0x43, 0x6f, 0x41,
0x45, 0xfd, 0xf1, 0xa4, 0x1e, 0x46, 0xf5, 0xc3, 0xad, 0xf9, 0x66, 0x25, 0x0a, 0x03, 0xac, 0x47,
0x6d, 0x0c, 0xbb, 0xcb, 0xf9, 0x7c, 0x4e, 0xc9, 0x25, 0xfd, 0xb7, 0xd1, 0x69, 0xff, 0x10, 0x1e,
0xe4, 0x7a, 0xa0, 0xbe, 0x66, 0x16, 0x69, 0xdf, 0x15, 0xde, 0x8b, 0x39, 0x29, 0x2d, 0xe4, 0xc4,
0xfe, 0xb3, 0x01, 0xf5, 0x17, 0xe4, 0xe5, 0x34, 0xe5, 0x68, 0x4d, 0x30, 0x39, 0x3b, 0x4f, 0xfe,
0x3c, 0x93, 0x9f, 0xb2, 0x9b, 0x09, 0x36, 0xa6, 0x5c, 0x90, 0xf1, 0x44, 0xcd, 0x2f, 0xe3, 0xb9,
0x42, 0x2e, 0xaa, 0x32, 0xa9, 0x8a, 0xb8, 0x81, 0xb5, 0xa0, 0xfe, 0x1a, 0x20, 0xb3, 0x51, 0x44,
0x52, 0x54, 0xa6, 0xa2, 0x1e, 0x09, 0x02, 0x16, 0x9e, 0x27, 0x05, 0x4c, 0x45, 0xd9, 0x93, 0x2f,
0x08, 0xbf, 0x50, 0x65, 0xdb, 0xc0, 0xea, 0x1b, 0xd9, 0xb0, 0x21, 0x2e, 0x58, 0x1c, 0x1c, 0x93,
0x58, 0xe6, 0x21, 0x79, 0xb0, 0x16, 0x74, 0xf6, 0x2f, 0x61, 0x2f, 0xb7, 0x81, 0x34, 0x2d, 0x29,
0xf9, 0xb2, 0x60, 0xfd, 0x92, 0xc6, 0xf2, 0xce, 0x53, 0x7b, 0x6a, 0xe0, 0x54, 0x94, 0xeb, 0x9d,
0xc5, 0xd1, 0x38, 0xd9, 0x92, 0xfa, 0x96, 0xef, 0x4f, 0x11, 0x25, 0x7f, 0x97, 0x95, 0x44, 0x24,
0xd7, 0x97, 0xef, 0x7a, 0x1a, 0x0a, 0x05, 0x06, 0xf5, 0x0c, 0xdc, 0xc0, 0x05, 0x9d, 0xfd, 0x07,
0x03, 0xd0, 0x72, 0x00, 0xaf, 0x58, 0xf8, 0x63, 0xa8, 0x66, 0xe4, 0x52, 0x9f, 0x9b, 0xdc, 0xed,
0x7f, 0xf5, 0x56, 0x70, 0x36, 0x0b, 0xbd, 0x2b, 0x3d, 0x28, 0x9b, 0xb4, 0x47, 0xdd, 0x5a, 0xe9,
0x01, 0x67, 0x66, 0xf6, 0x5f, 0x0c, 0xb8, 0xbf, 0xec, 0xbb, 0x1b, 0x06, 0xf4, 0xe7, 0xaf, 0x91,
0xab, 0xaf, 0x1f, 0xf2, 0x0e, 0xac, 0x45, 0x67, 0x67, 0x9c, 0x8a, 0x24, 0xbb, 0x89, 0x24, 0xab,
0xc0, 0xd9, 0x2f, 0x68, 0xf2, 0xdf, 0xaa, 0xfa, 0x5e, 0xc4, 0x48, 0x39, 0xc3, 0x88, 0xfd, 0xa5,
0x01, 0xbb, 0x57, 0xec, 0x02, 0x3d, 0x83, 0x6a, 0xf2, 0x14, 0x4a, 0x49, 0xd5, 0xa3, 0x57, 0xc5,
0xa8, 0x26, 0x1d, 0x24, 0x42, 0xc2, 0xaf, 0x32, 0x07, 0x7b, 0x67, 0xd0, 0x28, 0x0c, 0xad, 0xa0,
0x2b, 0x1f, 0x15, 0xe9, 0xca, 0xdb, 0xd7, 0x2e, 0x96, 0x65, 0x65, 0x4e, 0x5f, 0x9e, 0x34, 0xbe,
0xa8, 0x1f, 0x3c, 0x7a, 0x3f, 0x9d, 0x79, 0xba, 0xa6, 0xbe, 0xbe, 0xfd, 0xaf, 0x00, 0x00, 0x00,
0xff, 0xff, 0xa6, 0x25, 0xae, 0xc0, 0x21, 0x17, 0x00, 0x00,
}

View File

@ -3,6 +3,7 @@ syntax = "proto3";
option go_package = "./;protobuf";
import "chat_identity.proto";
import "enums.proto";
import "shard.proto";
package protobuf;
@ -155,6 +156,8 @@ message CommunityRequestToJoinResponse {
bytes grant = 4;
bytes community_id = 5;
string magnet_uri = 6;
bytes protected_topic_private_key = 7;
Shard shard = 8;
}
message CommunityRequestToLeave {

View File

@ -0,0 +1,107 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: community_shard_key.proto
package protobuf
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type CommunityShardKey struct {
CommunityId []byte `protobuf:"bytes,1,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
PrivateKey []byte `protobuf:"bytes,2,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"`
Clock uint64 `protobuf:"varint,3,opt,name=clock,proto3" json:"clock,omitempty"`
Shard *Shard `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommunityShardKey) Reset() { *m = CommunityShardKey{} }
func (m *CommunityShardKey) String() string { return proto.CompactTextString(m) }
func (*CommunityShardKey) ProtoMessage() {}
func (*CommunityShardKey) Descriptor() ([]byte, []int) {
return fileDescriptor_03da8310cde9b7b2, []int{0}
}
func (m *CommunityShardKey) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommunityShardKey.Unmarshal(m, b)
}
func (m *CommunityShardKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommunityShardKey.Marshal(b, m, deterministic)
}
func (m *CommunityShardKey) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommunityShardKey.Merge(m, src)
}
func (m *CommunityShardKey) XXX_Size() int {
return xxx_messageInfo_CommunityShardKey.Size(m)
}
func (m *CommunityShardKey) XXX_DiscardUnknown() {
xxx_messageInfo_CommunityShardKey.DiscardUnknown(m)
}
var xxx_messageInfo_CommunityShardKey proto.InternalMessageInfo
func (m *CommunityShardKey) GetCommunityId() []byte {
if m != nil {
return m.CommunityId
}
return nil
}
func (m *CommunityShardKey) GetPrivateKey() []byte {
if m != nil {
return m.PrivateKey
}
return nil
}
func (m *CommunityShardKey) GetClock() uint64 {
if m != nil {
return m.Clock
}
return 0
}
func (m *CommunityShardKey) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
func init() {
proto.RegisterType((*CommunityShardKey)(nil), "protobuf.CommunityShardKey")
}
func init() {
proto.RegisterFile("community_shard_key.proto", fileDescriptor_03da8310cde9b7b2)
}
var fileDescriptor_03da8310cde9b7b2 = []byte{
// 173 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xce, 0xcf, 0xcd,
0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0x8c, 0x2f, 0xce, 0x48, 0x2c, 0x4a, 0x89, 0xcf, 0x4e, 0xad, 0xd4,
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x52, 0xdc, 0x60, 0x29,
0x88, 0xb0, 0xd2, 0x14, 0x46, 0x2e, 0x41, 0x67, 0x98, 0xa6, 0x60, 0x90, 0x84, 0x77, 0x6a, 0xa5,
0x90, 0x22, 0x17, 0x0f, 0xc2, 0xa4, 0xcc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x6e,
0xb8, 0x98, 0x67, 0x8a, 0x90, 0x3c, 0x17, 0x77, 0x41, 0x51, 0x66, 0x59, 0x62, 0x49, 0x2a, 0xc8,
0x12, 0x09, 0x26, 0xb0, 0x0a, 0x2e, 0xa8, 0x10, 0xc8, 0x0c, 0x11, 0x2e, 0xd6, 0xe4, 0x9c, 0xfc,
0xe4, 0x6c, 0x09, 0x66, 0x05, 0x46, 0x0d, 0x96, 0x20, 0x08, 0x47, 0x48, 0x95, 0x8b, 0x15, 0x6c,
0xbd, 0x04, 0x8b, 0x02, 0xa3, 0x06, 0xb7, 0x11, 0xbf, 0x1e, 0xcc, 0x59, 0x7a, 0x60, 0xcb, 0x83,
0x20, 0xb2, 0x4e, 0xbc, 0x51, 0xdc, 0x7a, 0xfa, 0xd6, 0x30, 0xb9, 0x24, 0x36, 0x30, 0xcb, 0x18,
0x10, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xda, 0x17, 0x6d, 0xe0, 0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,14 @@
syntax = "proto3";
option go_package = "./;protobuf";
package protobuf;
import "shard.proto";
message CommunityShardKey {
bytes community_id = 1;
bytes private_key = 2;
uint64 clock = 3;
Shard shard = 4;
}

View File

@ -4,7 +4,7 @@ import (
"github.com/golang/protobuf/proto"
)
//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./url_data.proto ./community_privileged_user_sync_message.proto
//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./shard.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./community_shard_key.proto ./url_data.proto ./community_privileged_user_sync_message.proto
func Unmarshal(payload []byte) (*ApplicationMetadataMessage, error) {
var message ApplicationMetadataMessage

View File

@ -0,0 +1,87 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: shard.proto
package protobuf
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Shard struct {
Cluster int32 `protobuf:"varint,1,opt,name=cluster,proto3" json:"cluster,omitempty"`
Index int32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Shard) Reset() { *m = Shard{} }
func (m *Shard) String() string { return proto.CompactTextString(m) }
func (*Shard) ProtoMessage() {}
func (*Shard) Descriptor() ([]byte, []int) {
return fileDescriptor_319ea41e44cdc364, []int{0}
}
func (m *Shard) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Shard.Unmarshal(m, b)
}
func (m *Shard) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Shard.Marshal(b, m, deterministic)
}
func (m *Shard) XXX_Merge(src proto.Message) {
xxx_messageInfo_Shard.Merge(m, src)
}
func (m *Shard) XXX_Size() int {
return xxx_messageInfo_Shard.Size(m)
}
func (m *Shard) XXX_DiscardUnknown() {
xxx_messageInfo_Shard.DiscardUnknown(m)
}
var xxx_messageInfo_Shard proto.InternalMessageInfo
func (m *Shard) GetCluster() int32 {
if m != nil {
return m.Cluster
}
return 0
}
func (m *Shard) GetIndex() int32 {
if m != nil {
return m.Index
}
return 0
}
func init() {
proto.RegisterType((*Shard)(nil), "protobuf.Shard")
}
func init() {
proto.RegisterFile("shard.proto", fileDescriptor_319ea41e44cdc364)
}
var fileDescriptor_319ea41e44cdc364 = []byte{
// 99 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2e, 0xce, 0x48, 0x2c,
0x4a, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x4a, 0xe6,
0x5c, 0xac, 0xc1, 0x20, 0x09, 0x21, 0x09, 0x2e, 0xf6, 0xe4, 0x9c, 0xd2, 0xe2, 0x92, 0xd4, 0x22,
0x09, 0x46, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x18, 0x57, 0x48, 0x84, 0x8b, 0x35, 0x33, 0x2f, 0x25,
0xb5, 0x42, 0x82, 0x09, 0x2c, 0x0e, 0xe1, 0x38, 0xf1, 0x46, 0x71, 0xeb, 0xe9, 0x5b, 0xc3, 0xcc,
0x49, 0x62, 0x03, 0xb3, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xef, 0xcf, 0x9d, 0x21, 0x67,
0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
option go_package = "./;protobuf";
package protobuf;
message Shard {
int32 cluster = 1;
int32 index = 2;
}

View File

@ -228,6 +228,7 @@ func (m *User) GetColor() string {
type URLData struct {
// Community, Channel, or User
Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
Shard *Shard `protobuf:"bytes,2,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -265,6 +266,13 @@ func (m *URLData) GetContent() []byte {
return nil
}
func (m *URLData) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
func init() {
proto.RegisterType((*Community)(nil), "protobuf.Community")
proto.RegisterType((*Channel)(nil), "protobuf.Channel")
@ -277,24 +285,26 @@ func init() {
}
var fileDescriptor_5f1e15b5f0115710 = []byte{
// 295 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x90, 0xb1, 0x4e, 0xeb, 0x30,
0x14, 0x86, 0xe5, 0xdb, 0xa6, 0xbd, 0x39, 0x69, 0x18, 0x4c, 0x07, 0x6f, 0x84, 0x74, 0xc9, 0x14,
0x04, 0x8c, 0x6c, 0x94, 0x05, 0x09, 0x31, 0x58, 0xea, 0xc2, 0x12, 0x39, 0x8e, 0x29, 0x46, 0xb1,
0x1d, 0x39, 0xf6, 0xd0, 0x77, 0xe2, 0x25, 0x78, 0x33, 0x84, 0x93, 0x50, 0x16, 0xb6, 0x4e, 0x3e,
0xff, 0xa7, 0xa3, 0xe3, 0x4f, 0x3f, 0x9c, 0x79, 0xdb, 0x56, 0x0d, 0x73, 0xac, 0xec, 0xac, 0x71,
0x06, 0xff, 0x0f, 0x4f, 0xed, 0x5f, 0xf3, 0x0f, 0x04, 0xf1, 0xd6, 0x28, 0xe5, 0xb5, 0x74, 0x07,
0x7c, 0x09, 0xab, 0x46, 0xf6, 0x5d, 0xcb, 0x0e, 0x95, 0x66, 0x4a, 0x10, 0x94, 0xa1, 0x22, 0xa6,
0xc9, 0xc8, 0x9e, 0x99, 0x12, 0x38, 0x83, 0xa4, 0x11, 0x3d, 0xb7, 0xb2, 0x73, 0xd2, 0x68, 0xf2,
0x6f, 0xdc, 0x38, 0x22, 0xbc, 0x81, 0x54, 0x09, 0x55, 0x0b, 0xdb, 0x57, 0xdc, 0x78, 0xed, 0xc8,
0x2c, 0x43, 0x45, 0x4a, 0x57, 0x23, 0xdc, 0x7e, 0x33, 0xbc, 0x86, 0x88, 0x9b, 0xd6, 0x58, 0x32,
0x0f, 0x07, 0x86, 0x80, 0x2f, 0x20, 0x71, 0x6c, 0x5f, 0x49, 0xdd, 0x48, 0x2e, 0x7a, 0x12, 0x65,
0xb3, 0x22, 0xa5, 0xe0, 0xd8, 0xfe, 0x71, 0x20, 0xf9, 0x27, 0x82, 0xe5, 0xf6, 0x8d, 0x69, 0x2d,
0xda, 0xd3, 0xc8, 0xae, 0x21, 0x12, 0xca, 0xbc, 0xcb, 0x20, 0x19, 0xd3, 0x21, 0xfc, 0x61, 0x77,
0x0d, 0x31, 0x9f, 0xaa, 0x22, 0x51, 0x86, 0x8a, 0xe4, 0xe6, 0xbc, 0x9c, 0x9a, 0x2c, 0x7f, 0x5a,
0xa4, 0xc7, 0x2d, 0x8c, 0x61, 0xee, 0xbd, 0x6c, 0xc8, 0x22, 0xdc, 0x09, 0x73, 0xce, 0x60, 0xbe,
0xeb, 0x85, 0x3d, 0x99, 0xff, 0x60, 0x3a, 0xfb, 0x65, 0x9a, 0x6f, 0x60, 0xb9, 0xa3, 0x4f, 0x0f,
0xcc, 0x31, 0x4c, 0x60, 0xc9, 0x8d, 0x76, 0x42, 0xbb, 0xf0, 0xc1, 0x8a, 0x4e, 0xf1, 0x3e, 0x7d,
0x49, 0xca, 0xab, 0xbb, 0xc9, 0xbf, 0x5e, 0x84, 0xe9, 0xf6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xd1,
0x08, 0xbf, 0x32, 0x2c, 0x02, 0x00, 0x00,
// 321 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xb1, 0x4e, 0xc3, 0x30,
0x10, 0x40, 0x15, 0xda, 0xb4, 0xe4, 0xdc, 0x80, 0x64, 0x3a, 0x58, 0x2c, 0x84, 0x20, 0xa4, 0x4c,
0x41, 0x94, 0x91, 0x8d, 0xb2, 0x80, 0x10, 0x83, 0x51, 0x17, 0x96, 0xc8, 0x4d, 0x4c, 0x6b, 0x14,
0xdb, 0x95, 0xe3, 0x0c, 0xfd, 0x27, 0x7e, 0x82, 0x3f, 0x43, 0xb5, 0x1b, 0xc2, 0xc2, 0xd6, 0xc9,
0x77, 0xef, 0x4e, 0xe7, 0xe7, 0x93, 0xe1, 0xa4, 0x35, 0x75, 0x51, 0x31, 0xcb, 0xf2, 0x8d, 0xd1,
0x56, 0xe3, 0x63, 0x77, 0x2c, 0xdb, 0x8f, 0x73, 0xd4, 0xac, 0x99, 0xa9, 0x3c, 0x4e, 0xbf, 0x02,
0x88, 0xe6, 0x5a, 0xca, 0x56, 0x09, 0xbb, 0xc5, 0x97, 0x30, 0xa9, 0x44, 0xb3, 0xa9, 0xd9, 0xb6,
0x50, 0x4c, 0x72, 0x12, 0x24, 0x41, 0x16, 0x51, 0xb4, 0x67, 0xaf, 0x4c, 0x72, 0x9c, 0x00, 0xaa,
0x78, 0x53, 0x1a, 0xb1, 0xb1, 0x42, 0x2b, 0x72, 0xb4, 0xef, 0xe8, 0x11, 0xbe, 0x82, 0x58, 0x72,
0xb9, 0xe4, 0xa6, 0x29, 0x4a, 0xdd, 0x2a, 0x4b, 0x06, 0x49, 0x90, 0xc5, 0x74, 0xb2, 0x87, 0xf3,
0x1d, 0xc3, 0x53, 0x08, 0x4b, 0x5d, 0x6b, 0x43, 0x86, 0x6e, 0x80, 0x4f, 0xf0, 0x05, 0x20, 0xcb,
0x56, 0x85, 0x50, 0x95, 0x28, 0x79, 0x43, 0xc2, 0x64, 0x90, 0xc5, 0x14, 0x2c, 0x5b, 0x3d, 0x79,
0x92, 0x7e, 0x07, 0x30, 0x9e, 0xaf, 0x99, 0x52, 0xbc, 0x3e, 0x8c, 0xec, 0x14, 0x42, 0x2e, 0xf5,
0xa7, 0x70, 0x92, 0x11, 0xf5, 0xc9, 0x3f, 0x76, 0xb7, 0x10, 0x95, 0xdd, 0xaa, 0x48, 0x98, 0x04,
0x19, 0x9a, 0x9d, 0xe5, 0xdd, 0x5a, 0xf3, 0xdf, 0x2d, 0xd2, 0xbe, 0x0b, 0x63, 0x18, 0xb6, 0xad,
0xa8, 0xc8, 0xc8, 0xcd, 0x71, 0x71, 0xca, 0x60, 0xb8, 0x68, 0xb8, 0x39, 0x98, 0xbf, 0x37, 0x1d,
0xfc, 0x31, 0x4d, 0x9f, 0x61, 0xbc, 0xa0, 0x2f, 0x8f, 0xcc, 0x32, 0x4c, 0x60, 0x5c, 0x6a, 0x65,
0xb9, 0xb2, 0xee, 0x82, 0x09, 0xed, 0x52, 0x7c, 0x0d, 0xa1, 0xfb, 0x09, 0x6e, 0x2c, 0x9a, 0x9d,
0xf6, 0x4f, 0x79, 0xdb, 0x61, 0xea, 0xab, 0x0f, 0xf1, 0x3b, 0xca, 0x6f, 0xee, 0xbb, 0xda, 0x72,
0xe4, 0xa2, 0xbb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0x2e, 0xf3, 0xde, 0x60, 0x02, 0x00,
0x00,
}

View File

@ -3,6 +3,8 @@ syntax = "proto3";
option go_package = "./;protobuf";
package protobuf;
import "shard.proto";
message Community {
string display_name = 1;
string description = 2;
@ -29,4 +31,5 @@ message User {
message URLData {
// Community, Channel, or User
bytes content = 1;
Shard shard = 2;
}

View File

@ -0,0 +1,30 @@
package requests
import (
"errors"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common"
)
type SetCommunityShard struct {
CommunityID types.HexBytes `json:"communityId"`
Shard *common.Shard `json:"shard,omitempty"`
PrivateKey *types.HexBytes `json:"privateKey,omitempty"`
}
func (s *SetCommunityShard) Validate() error {
if s == nil {
return errors.New("invalid request")
}
if s.Shard != nil {
// TODO: for now only MainStatusShard(16) is accepted
if s.Shard.Cluster != common.MainStatusShard {
return errors.New("invalid shard cluster")
}
if s.Shard.Index > 1023 {
return errors.New("invalid shard index. Only 0-1023 is allowed")
}
}
return nil
}

View File

@ -8,9 +8,10 @@ import (
"sync"
"github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/types"
)
@ -18,6 +19,11 @@ const (
minPow = 0.0
)
type Shard struct {
Cluster uint16
Index uint16
}
type RawFilter struct {
FilterID string
Topic types.TopicType
@ -131,7 +137,7 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia
var filters []*Filter
// Add public, one-to-one and negotiated filters.
for _, pf := range publicFiltersToInit {
f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic) // TODO: pubsubtopic
f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic)
if err != nil {
return nil, err
}
@ -141,8 +147,8 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia
}
type CommunityFilterToInitialize struct {
CommunityID []byte
PrivKey *ecdsa.PrivateKey
Shard *Shard
PrivKey *ecdsa.PrivateKey
}
func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []CommunityFilterToInitialize) ([]*Filter, error) {
@ -151,30 +157,43 @@ func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []Com
defer f.mutex.Unlock()
for _, cf := range communityFiltersToInitialize {
pubsubTopic := GetPubsubTopic(cf.CommunityID)
identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey)
rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true)
if err != nil {
f.logger.Debug("could not register community filter", zap.Error(err))
return nil, err
}
filterID := identityStr + "-admin"
filter := &Filter{
ChatID: filterID,
FilterID: rawFilter.FilterID,
PubsubTopic: pubsubTopic,
ContentTopic: rawFilter.Topic,
Identity: identityStr,
Listen: true,
OneToOne: true,
if cf.PrivKey == nil {
continue
}
f.filters[filterID] = filter
communityPubsubTopic := GetPubsubTopic(cf.Shard)
topics := []string{communityPubsubTopic}
if communityPubsubTopic != relay.DefaultWakuTopic {
topics = append(topics, relay.DefaultWakuTopic)
}
f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String()))
// TODO: requests to join / cancels are currently being sent into the default waku topic.
// They must be sent into an specific non protected shard
for _, pubsubTopic := range topics {
identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey)
rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true)
if err != nil {
f.logger.Debug("could not register community filter", zap.Error(err))
return nil, err
filters = append(filters, filter)
}
filterID := identityStr + "-admin"
filter := &Filter{
ChatID: filterID,
FilterID: rawFilter.FilterID,
PubsubTopic: pubsubTopic,
ContentTopic: rawFilter.Topic,
Identity: identityStr,
Listen: true,
OneToOne: true,
}
f.filters[filterID] = filter
f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String()))
filters = append(filters, filter)
}
}
return filters, nil
}

View File

@ -13,9 +13,11 @@ import (
"github.com/google/uuid"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/ethereum/go-ethereum/common"
"github.com/status-im/status-go/connection"
"github.com/status-im/status-go/eth-node/crypto"
@ -672,6 +674,14 @@ func (t *Transport) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey)
return t.waku.StorePubsubTopicKey(topic, privKey)
}
func GetPubsubTopic(communityID []byte) string {
func (t *Transport) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
return t.waku.RetrievePubsubTopicKey(topic)
}
func GetPubsubTopic(shard *Shard) string {
if shard != nil {
return protocol.NewStaticShardingPubsubTopic(shard.Cluster, shard.Index).String()
}
return relay.DefaultWakuTopic
}

View File

@ -436,6 +436,11 @@ func (api *PublicAPI) RemovePrivateKey(id types.HexBytes) (*protocol.MessengerRe
return api.service.messenger.RemovePrivateKey(id)
}
// Sets the community shard for a community and updates all active filters for the community
func (api *PublicAPI) SetCommunityShard(request *requests.SetCommunityShard) (*protocol.MessengerResponse, error) {
return api.service.messenger.SetCommunityShard(request)
}
// ExportCommunity exports the private key of the community with given ID
func (api *PublicAPI) ExportCommunity(id types.HexBytes) (types.HexBytes, error) {
key, err := api.service.messenger.ExportCommunity(id)
@ -1169,12 +1174,22 @@ func (api *PublicAPI) EnsVerified(pk, ensName string) error {
return api.service.messenger.ENSVerified(pk, ensName)
}
// DEPRECATED
func (api *PublicAPI) RequestCommunityInfoFromMailserver(communityID string) (*communities.Community, error) {
return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, true)
return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, nil, true)
}
func (api *PublicAPI) RequestCommunityInfoFromMailserverWithShard(communityID string, shard *common.Shard) (*communities.Community, error) {
return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true)
}
// DEPRECATED
func (api *PublicAPI) RequestCommunityInfoFromMailserverAsync(communityID string) error {
return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID)
return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, nil)
}
func (api *PublicAPI) RequestCommunityInfoFromMailserverAsyncWithShard(communityID string, shard *common.Shard) error {
return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, shard)
}
func (api *PublicAPI) ActivityCenterNotifications(request protocol.ActivityCenterNotificationsRequest) (*protocol.ActivityCenterPaginationResponse, error) {

View File

@ -561,6 +561,10 @@ func (s *Service) CanProvideCollectibleMetadata(id thirdparty.CollectibleUniqueI
}
func (s *Service) FetchCollectibleMetadata(id thirdparty.CollectibleUniqueID, tokenURI string) (*thirdparty.FullCollectibleData, error) {
if s.messenger == nil {
return nil, fmt.Errorf("messenger not ready")
}
communityID := tokenURIToCommunityID(tokenURI)
if communityID == "" {
@ -670,7 +674,12 @@ func (s *Service) fetchCommunity(communityID string) (*communities.Community, er
}
// Try to fetch metadata from Messenger communities
community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, true)
// TODO: we need the shard information in the collectible to be able to retrieve info for
// communities that have specific shards
var shard *common.Shard = nil // TODO: build this with info from token
community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true)
if err != nil {
return nil, err

View File

@ -5,6 +5,7 @@ import (
"testing"
"github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/appdatabase"

View File

@ -10,6 +10,7 @@ import (
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol"
"github.com/status-im/status-go/protocol/common"
)
// Make sure that Service implements node.Lifecycle interface.
@ -69,12 +70,12 @@ type PublicAPI struct {
service *Service
}
func (p *PublicAPI) CommunityInfo(communityID types.HexBytes) (json.RawMessage, error) {
func (p *PublicAPI) CommunityInfo(communityID types.HexBytes, shard *common.Shard) (json.RawMessage, error) {
if p.service.messenger == nil {
return nil, ErrNotInitialized
}
community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), true)
community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), shard, true)
if err != nil {
return nil, err
}

View File

@ -22,9 +22,10 @@ import (
"testing"
"time"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/wakuv2/common"
)

View File

@ -23,10 +23,11 @@ import (
"fmt"
"sync"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap"
"golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"

View File

@ -13,13 +13,14 @@ import (
"github.com/status-im/status-go/wakuv2/common"
"go.uber.org/zap"
"golang.org/x/exp/maps"
node "github.com/waku-org/go-waku/waku/v2/node"
"github.com/waku-org/go-waku/waku/v2/protocol"
"github.com/waku-org/go-waku/waku/v2/protocol/filter"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/waku-org/go-waku/waku/v2/protocol/subscription"
"go.uber.org/zap"
"golang.org/x/exp/maps"
)
const (

View File

@ -990,16 +990,17 @@ func (w *Waku) broadcast() {
select {
case envelope := <-w.sendQueue:
var err error
logger := w.logger.With(zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.String("contentTopic", envelope.Message().ContentTopic), zap.Int64("timestamp", envelope.Message().Timestamp))
if w.settings.LightClient {
w.logger.Info("publishing message via lightpush", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()))
w.logger.Info("publishing message via lightpush")
_, err = w.node.Lightpush().PublishToTopic(context.Background(), envelope.Message(), lightpush.WithPubSubTopic(envelope.PubsubTopic()))
} else {
w.logger.Info("publishing message via relay", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()))
logger.Info("publishing message via relay")
_, err = w.node.Relay().PublishToTopic(context.Background(), envelope.Message(), envelope.PubsubTopic())
}
if err != nil {
w.logger.Error("could not send message", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.Error(err))
logger.Error("could not send message", zap.Error(err))
w.envelopeFeed.Send(common.EnvelopeEvent{
Hash: gethcommon.BytesToHash(envelope.Hash()),
Event: common.EventEnvelopeExpired,
@ -1437,7 +1438,19 @@ func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) err
return nil
}
func (w *Waku) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
if w.protectedTopicStore == nil {
return nil, nil
}
return w.protectedTopicStore.FetchPrivateKey(topic)
}
func (w *Waku) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
if w.protectedTopicStore == nil {
return nil
}
return w.protectedTopicStore.Insert(topic, privKey, &privKey.PublicKey)
}

View File

@ -11,12 +11,14 @@ import (
"github.com/cenkalti/backoff/v3"
"github.com/stretchr/testify/require"
"golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/dnsdisc"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/waku-org/go-waku/waku/v2/protocol/store"
"github.com/waku-org/go-waku/waku/v2/protocol/subscription"
"golang.org/x/exp/maps"
"github.com/status-im/status-go/protocol/tt"
"github.com/status-im/status-go/wakuv2/common"