1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-08 05:47:07 +09:00

Relations rework and migration p1

- store relations within the workspace as subobjects (like options)
- RelationLink: remove Id, add Format
- do the reinterpretation of old relation changes to add relationLink
- add workspace _anytype_marketplace to the bundled relations/objectTypes
This commit is contained in:
Roman Khafizianov 2022-10-04 23:56:07 +02:00
parent c79fc28166
commit 21f2093e52
No known key found for this signature in database
GPG key ID: F07A7D55A2684852
38 changed files with 5128 additions and 5071 deletions

View file

@ -247,7 +247,7 @@ func (s *service) CreateDataviewView(ctx *session.Context, req pb.RpcBlockDatavi
func (s *service) AddDataviewRelation(ctx *session.Context, req pb.RpcBlockDataviewRelationAddRequest) (err error) {
err = s.DoDataview(req.ContextId, func(b dataview.Dataview) error {
return b.AddRelations(ctx, req.BlockId, req.RelationIds, true)
return b.AddRelations(ctx, req.BlockId, req.RelationKeys, true)
})
return
@ -255,7 +255,7 @@ func (s *service) AddDataviewRelation(ctx *session.Context, req pb.RpcBlockDatav
func (s *service) DeleteDataviewRelation(ctx *session.Context, req pb.RpcBlockDataviewRelationDeleteRequest) error {
return s.DoDataview(req.ContextId, func(b dataview.Dataview) error {
return b.DeleteRelations(ctx, req.BlockId, req.RelationIds, true)
return b.DeleteRelations(ctx, req.BlockId, req.RelationKeys, true)
})
}
@ -584,7 +584,7 @@ func (s *service) SetRelationKey(ctx *session.Context, req pb.RpcBlockRelationSe
if err != nil {
return err
}
return b.AddRelationAndSet(ctx, pb.RpcBlockRelationAddRequest{RelationId: rel.Id, BlockId: req.BlockId, ContextId: req.ContextId})
return b.AddRelationAndSet(ctx, pb.RpcBlockRelationAddRequest{RelationKey: rel.Key, BlockId: req.BlockId, ContextId: req.ContextId})
})
}

View file

@ -5,7 +5,7 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/state"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/template"
"github.com/anytypeio/go-anytype-middleware/core/relation"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/database"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
@ -43,7 +43,7 @@ func (p *Archive) Init(ctx *smartblock.InitContext) (err error) {
return smartblock.ObjectApplyTemplate(p, ctx.State, template.WithEmpty, template.WithNoDuplicateLinks(), template.WithNoObjectTypes(), template.WithDetailName("Archive"), template.WithDetailIconEmoji("🗑"))
}
func (p *Archive) Relations(_ *state.State) relation.Relations {
func (p *Archive) Relations(_ *state.State) relationutils.Relations {
return nil
}

View file

@ -313,7 +313,7 @@ func (bs *basic) AddRelationAndSet(ctx *session.Context, req pb.RpcBlockRelation
return smartblock.ErrSimpleBlockNotFound
}
rel, err := bs.RelationService().FetchId(req.RelationId)
rel, err := bs.RelationService().FetchKey(req.RelationKey)
if err != nil {
return
}

View file

@ -5,7 +5,7 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/editor/state"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/template"
"github.com/anytypeio/go-anytype-middleware/core/block/simple"
"github.com/anytypeio/go-anytype-middleware/core/relation"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/logging"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
)
@ -30,7 +30,7 @@ func (p *Breadcrumbs) Init(ctx *smartblock.InitContext) (err error) {
return smartblock.ObjectApplyTemplate(p, ctx.State, template.WithEmpty, template.WithNoObjectTypes())
}
func (p *Breadcrumbs) Relations(_ *state.State) relation.Relations {
func (p *Breadcrumbs) Relations(_ *state.State) relationutils.Relations {
return nil
}

View file

@ -108,14 +108,14 @@ func (d *sdataview) SetSource(ctx *session.Context, blockId string, source []str
return d.Apply(s, smartblock.NoRestrictions)
}
func (d *sdataview) AddRelations(ctx *session.Context, blockId string, relationIds []string, showEvent bool) error {
func (d *sdataview) AddRelations(ctx *session.Context, blockId string, relationKeys []string, showEvent bool) error {
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, blockId)
if err != nil {
return err
}
for _, id := range relationIds {
relation, err2 := d.RelationService().FetchId(id)
for _, key := range relationKeys {
relation, err2 := d.RelationService().FetchKey(key)
if err2 != nil {
return err2
}
@ -420,7 +420,7 @@ func SchemaBySources(sources []string, store objectstore.ObjectStore, optionalRe
hasType = true
}
if sbt == smartblock2.SmartBlockTypeIndexedRelation || sbt == smartblock2.SmartBlockTypeBundledRelation {
if sbt == smartblock2.SmartBlockTypeBundledRelation {
if hasType {
return nil, fmt.Errorf("dataview source contains both type and relation")
}
@ -619,8 +619,8 @@ func DataviewBlockBySource(store objectstore.ObjectStore, source []string) (res
for _, rel := range schema.RequiredRelations() {
relations = append(relations, &model.RelationLink{
Id: rel.Id,
Key: rel.Key,
Format: rel.Format,
Key: rel.Key,
})
viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: true})
}
@ -632,8 +632,8 @@ func DataviewBlockBySource(store objectstore.ObjectStore, source []string) (res
}
relations = append(relations, &model.RelationLink{
Id: rel.Id,
Key: rel.Key,
Format: rel.Format,
Key: rel.Key,
})
viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: false})
}
@ -652,8 +652,8 @@ func DataviewBlockBySource(store objectstore.ObjectStore, source []string) (res
continue
}
relations = append(relations, &model.RelationLink{
Id: rel.Id,
Key: rel.Key,
Format: rel.Format,
Key: rel.Key,
})
viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: false})
}

View file

@ -8,21 +8,31 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/editor/template"
"github.com/anytypeio/go-anytype-middleware/core/block/source"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/addr"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"github.com/globalsign/mgo/bson"
"github.com/gogo/protobuf/types"
"strings"
)
var ErrOptionNotFound = errors.New("option not found")
var ErrSubObjectNotFound = errors.New("sub object not found")
func (w *Workspaces) Open(subId string) (sb smartblock.SmartBlock, err error) {
w.Lock()
defer w.Unlock()
if strings.HasPrefix(subId, addr.RelationKeyToIdPrefix) {
subId = strings.TrimPrefix(subId, addr.RelationKeyToIdPrefix)
if opt, ok := w.relations[subId]; ok {
return opt, nil
}
return nil, ErrSubObjectNotFound
}
if opt, ok := w.options[subId]; ok {
return opt, nil
}
return nil, ErrOptionNotFound
return nil, ErrSubObjectNotFound
}
func (w *Workspaces) CreateRelationOption(opt *types.Struct) (subId string, err error) {
@ -49,13 +59,13 @@ func (w *Workspaces) CreateRelationOption(opt *types.Struct) (subId string, err
func (w *Workspaces) initOption(st *state.State, subId string) (err error) {
opt := NewOption()
subState, err := w.optionSubState(st, subId)
subState, err := w.subState(st, collectionKeyRelationOptions, subId)
if err != nil {
return
}
w.options[subId] = opt
if err = opt.Init(&smartblock.InitContext{
Source: w.sourceService.NewStaticSource(subId, model.SmartBlockType_RelationOption, subState, w.onOptionChange),
Source: w.sourceService.NewStaticSource(subId, model.SmartBlockType_SubObjectRelationOption, subState, w.onOptionChange),
App: w.app,
}); err != nil {
return
@ -74,30 +84,31 @@ func (w *Workspaces) Locked() bool {
return true
}
}
for _, rel := range w.relations {
if rel.Locked() {
return true
}
}
return false
}
func (w *Workspaces) optionSubState(st *state.State, subId string) (*state.State, error) {
optData := pbtypes.GetStruct(st.GetCollection(collectionKeyRelationOptions), subId)
if optData == nil || optData.Fields == nil {
return nil, fmt.Errorf("no data for option: %v", subId)
}
subState := state.NewDoc(subId, nil).(*state.State)
for k, v := range optData.Fields {
if _, err := bundle.GetRelation(bundle.RelationKey(k)); err == nil {
subState.SetDetailAndBundledRelation(bundle.RelationKey(k), v)
}
}
return subState, nil
}
func (w *Workspaces) updateOptions(info smartblock.ApplyInfo) (err error) {
func (w *Workspaces) updateSubObject(info smartblock.ApplyInfo) (err error) {
for _, ch := range info.Changes {
if keySet := ch.GetStoreKeySet(); keySet != nil {
if len(keySet.Path) >= 2 && keySet.Path[0] == collectionKeyRelationOptions {
if opt, ok := w.options[keySet.Path[1]]; ok {
if e := opt.SetStruct(pbtypes.GetStruct(w.NewState().GetCollection(collectionKeyRelationOptions), keySet.Path[1])); e != nil {
log.With("threadId", w.Id()).Errorf("options: can't set struct: %v", e)
if len(keySet.Path) >= 2 {
switch keySet.Path[0] {
case collectionKeyRelationOptions:
if opt, ok := w.options[keySet.Path[1]]; ok {
if e := opt.SetStruct(pbtypes.GetStruct(w.NewState().GetCollection(collectionKeyRelationOptions), keySet.Path[1])); e != nil {
log.With("threadId", w.Id()).Errorf("options: can't set struct: %v", e)
}
}
case collectionKeyRelations:
if opt, ok := w.relations[keySet.Path[1]]; ok {
if e := opt.SetStruct(pbtypes.GetStruct(w.NewState().GetCollection(collectionKeyRelations), keySet.Path[1])); e != nil {
log.With("threadId", w.Id()).Errorf("relations: can't set struct: %v", e)
}
}
}
}

View file

@ -1,55 +0,0 @@
package editor
import (
"github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/template"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
)
type Relation struct {
*Set
}
func NewRelation() *Relation {
return &Relation{
Set: NewSet(),
}
}
func (p *Relation) Init(ctx *smartblock.InitContext) (err error) {
if err = p.SmartBlock.Init(ctx); err != nil {
return
}
dataview := model.BlockContentOfDataview{
Dataview: &model.BlockContentDataview{
Source: []string{p.Id()},
Views: []*model.BlockContentDataviewView{
{
Id: "relationObjects",
Type: model.BlockContentDataviewView_Table,
Name: "All",
Sorts: []*model.BlockContentDataviewSort{
{
RelationKey: "name",
Type: model.BlockContentDataviewSort_Asc,
},
},
Relations: []*model.BlockContentDataviewRelation{},
Filters: nil,
},
},
},
}
return smartblock.ObjectApplyTemplate(p, ctx.State,
template.WithObjectTypesAndLayout([]string{bundle.TypeKeyRelation.URL()}),
template.WithEmpty,
template.WithTitle,
template.WithDefaultFeaturedRelations,
template.WithDescription,
template.WithDataview(dataview, true),
template.WithFeaturedRelations,
)
}

View file

@ -0,0 +1,129 @@
package editor
import (
"fmt"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/state"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/template"
"github.com/anytypeio/go-anytype-middleware/core/block/source"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/addr"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"github.com/globalsign/mgo/bson"
"github.com/gogo/protobuf/types"
"strings"
)
func (w *Workspaces) CreateRelation(details *types.Struct) (id, key string, err error) {
if details == nil || details.Fields == nil {
return "", "", fmt.Errorf("create relation: no data")
}
if v, ok := details.GetFields()[bundle.RelationKeyRelationFormat.String()]; !ok {
return "", "", fmt.Errorf("missing relation format")
} else if i, ok := v.Kind.(*types.Value_NumberValue); !ok {
return "", "", fmt.Errorf("invalid relation format: not a number")
} else if model.RelationFormat(int(i.NumberValue)).String() == "" {
return "", "", fmt.Errorf("invalid relation format: unknown enum")
}
if pbtypes.GetString(details, bundle.RelationKeyName.String()) == "" {
return "", "", fmt.Errorf("missing relation name")
}
if pbtypes.GetString(details, bundle.RelationKeyType.String()) != bundle.TypeKeyRelation.URL() {
return "", "", fmt.Errorf("incorrect object type")
}
key = bson.NewObjectId().Hex()
id = addr.RelationKeyToIdPrefix + key
details.Fields[bundle.RelationKeyId.String()] = pbtypes.String(id)
details.Fields[bundle.RelationKeyRelationKey.String()] = pbtypes.String(key)
st := w.NewState()
st.SetInStore([]string{collectionKeyRelations, key}, pbtypes.Struct(details))
if err = w.initRelation(st, key); err != nil {
return
}
if err = w.Apply(st, smartblock.NoHooks); err != nil {
return
}
return
}
func (w *Workspaces) initRelation(st *state.State, relationKey string) (err error) {
rel := NewRelation()
subState, err := w.subState(st, collectionKeyRelations, addr.RelationKeyToIdPrefix+relationKey)
if err != nil {
return
}
w.relations[relationKey] = rel
if err = rel.Init(&smartblock.InitContext{
Source: w.sourceService.NewStaticSource(addr.RelationKeyToIdPrefix+relationKey, model.SmartBlockType_SubObjectRelation, subState, w.onRelationChange),
App: w.app,
}); err != nil {
return
}
return
}
func (w *Workspaces) subState(st *state.State, collection string, id string) (*state.State, error) {
var subId string
if collection == collectionKeyRelations {
subId = strings.TrimPrefix(id, addr.RelationKeyToIdPrefix)
} else {
subId = id
}
data := pbtypes.GetStruct(st.GetCollection(collection), subId)
if data == nil || data.Fields == nil {
return nil, fmt.Errorf("no data for subId %s: %v", collection, subId)
}
subState := state.NewDoc(id, nil).(*state.State)
for k, v := range data.Fields {
if _, err := bundle.GetRelation(bundle.RelationKey(k)); err == nil {
subState.SetDetailAndBundledRelation(bundle.RelationKey(k), v)
}
}
subState.SetObjectType(pbtypes.GetString(data, bundle.RelationKeyType.String()))
return subState, nil
}
func (w *Workspaces) onRelationChange(params source.PushChangeParams) (changeId string, err error) {
st := w.NewState()
id := params.State.RootId()
subId := strings.TrimPrefix(id, addr.RelationKeyToIdPrefix)
if _, ok := w.relations[subId]; !ok {
return "", fmt.Errorf("onRelationChange: relation not exists")
}
st.SetInStore([]string{collectionKeyRelations, subId}, pbtypes.Struct(params.State.CombinedDetails()))
return "", w.Apply(st, smartblock.NoHooks)
}
func NewRelation() *Relation {
return &Relation{
SmartBlock: smartblock.New(),
}
}
type Relation struct {
smartblock.SmartBlock
}
func (o *Relation) Init(ctx *smartblock.InitContext) (err error) {
if err = o.SmartBlock.Init(ctx); err != nil {
return
}
return smartblock.ObjectApplyTemplate(o, ctx.State,
template.WithObjectTypesAndLayout([]string{bundle.TypeKeyRelation.URL()}),
)
}
func (o *Relation) SetStruct(st *types.Struct) error {
o.Lock()
defer o.Unlock()
s := o.NewState()
s.SetDetails(st)
return o.Apply(s)
}

View file

@ -4,6 +4,8 @@ import (
"context"
"errors"
"fmt"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/addr"
"sort"
"strings"
"sync"
@ -100,7 +102,7 @@ type SmartBlock interface {
Anytype() core.Service
RelationService() relation2.Service
SetDetails(ctx *session.Context, details []*pb.RpcObjectSetDetailsDetail, showEvent bool) (err error)
Relations(s *state.State) relation2.Relations
Relations(s *state.State) relationutils.Relations
HasRelation(s *state.State, relationKey string) bool
AddExtraRelations(ctx *session.Context, relationIds ...string) (err error)
RemoveExtraRelations(ctx *session.Context, relationKeys []string) (err error)
@ -176,7 +178,7 @@ type smartBlock struct {
}
func (sb *smartBlock) FileRelationKeys(s *state.State) (fileKeys []string) {
for _, rel := range sb.Relations(s) {
for _, rel := range s.GetRelationLinks() {
// coverId can contains both hash or predefined cover id
if rel.Format == model.RelationFormat_file || rel.Key == bundle.RelationKeyCoverId.String() {
if slice.FindPos(fileKeys, rel.Key) == -1 {
@ -188,7 +190,7 @@ func (sb *smartBlock) FileRelationKeys(s *state.State) (fileKeys []string) {
}
func (sb *smartBlock) HasRelation(s *state.State, key string) bool {
for _, rel := range sb.Relations(s) {
for _, rel := range s.GetRelationLinks() {
if rel.Key == key {
return true
}
@ -501,10 +503,10 @@ func (sb *smartBlock) dependentSmartIds(includeRelations, includeObjTypes, inclu
details := sb.CombinedDetails()
for _, rel := range sb.Relations(nil) {
for _, rel := range sb.GetRelationLinks() {
// do not index local dates such as lastOpened/lastModified
if includeRelations {
ids = append(ids, rel.Id)
ids = append(ids, addr.RelationKeyToIdPrefix+rel.Key)
}
if rel.Format == model.RelationFormat_date &&
(slice.FindPos(bundle.LocalRelationsKeys, rel.Key) == 0) && (slice.FindPos(bundle.DerivedRelationsKeys, rel.Key) == 0) {
@ -525,9 +527,10 @@ func (sb *smartBlock) dependentSmartIds(includeRelations, includeObjTypes, inclu
continue
}
if rel.Hidden && !includeHidden {
continue
}
// todo refactor: should we have this case preserved? we don't have hidden flag available in the state anymore
//if rel.Hidden && !includeHidden {
// continue
//}
if rel.Key == bundle.RelationKeyId.String() ||
rel.Key == bundle.RelationKeyType.String() || // always skip type because it was proceed above
@ -802,8 +805,8 @@ func (sb *smartBlock) SetDetails(ctx *session.Context, details []*pb.RpcObjectSe
return fmt.Errorf("relation %s is not found", detail.Key)
}
s.AddRelationLinks(&model.RelationLink{
Id: rel.Id,
Key: rel.Key,
Format: rel.Format,
Key: rel.Key,
})
err = sb.RelationService().ValidateFormat(detail.Key, detail.Value)
@ -852,19 +855,19 @@ func (sb *smartBlock) SetDetails(ctx *session.Context, details []*pb.RpcObjectSe
return nil
}
func (sb *smartBlock) AddExtraRelations(ctx *session.Context, relationIds ...string) (err error) {
func (sb *smartBlock) AddExtraRelations(ctx *session.Context, relationKeys ...string) (err error) {
s := sb.NewStateCtx(ctx)
if err = sb.addRelations(s, relationIds...); err != nil {
if err = sb.addRelations(s, relationKeys...); err != nil {
return
}
return sb.Apply(s)
}
func (sb *smartBlock) addRelations(s *state.State, relationIds ...string) (err error) {
if len(relationIds) == 0 {
func (sb *smartBlock) addRelations(s *state.State, relationKeys ...string) (err error) {
if len(relationKeys) == 0 {
return
}
relations, err := sb.relationService.FetchIds(relationIds...)
relations, err := sb.relationService.FetchKeys(relationKeys...)
if err != nil {
return
}
@ -1174,7 +1177,8 @@ func (sb *smartBlock) Close() (err error) {
return
}
func hasDepIds(relations relation2.Relations, act *undo.Action) bool {
// todo refactor: use relationLinks instead
func hasDepIds(relations relationutils.Relations, act *undo.Action) bool {
if act == nil {
return true
}
@ -1313,7 +1317,8 @@ func (sb *smartBlock) baseRelations() []*model.Relation {
return rels
}
func (sb *smartBlock) Relations(s *state.State) relation2.Relations {
// deprecated, use RelationLinks instead
func (sb *smartBlock) Relations(s *state.State) relationutils.Relations {
var links []*model.RelationLink
if s == nil {
links = sb.Doc.GetRelationLinks()

View file

@ -3,6 +3,7 @@ package state
import (
"bytes"
"fmt"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"strings"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/threads"
@ -37,13 +38,17 @@ func NewDocFromSnapshot(rootId string, snapshot *pb.ChangeSnapshot) Doc {
blocks: blocks,
details: pbtypes.StructCutKeys(snapshot.Data.Details, append(bundle.DerivedRelationsKeys, bundle.LocalRelationsKeys...)),
extraRelations: snapshot.Data.ExtraRelations,
relationLinks: snapshot.Data.RelationLinks,
objectTypes: snapshot.Data.ObjectTypes,
fileKeys: fileKeys,
store: snapshot.Data.Collections,
relationLinks: snapshot.Data.RelationLinks,
}
s.InjectDerivedDetails()
if len(snapshot.Data.RelationLinks) == 0 && len(snapshot.Data.ExtraRelations) > 0 {
s.relationLinks = relationutils.MigrateRelationsModels(snapshot.Data.ExtraRelations)
}
s.InjectDerivedDetails()
return s
}
@ -210,7 +215,7 @@ func (s *State) changeBlockDetailsUnset(unset *pb.ChangeDetailsUnset) error {
func (s *State) changeRelationAdd(add *pb.ChangeRelationAdd) error {
rl := s.GetRelationLinks()
for _, r := range add.RelationLinks {
if !rl.Has(r.Id) {
if !rl.Has(r.Key) {
rl = rl.Append(r)
}
}
@ -219,11 +224,17 @@ func (s *State) changeRelationAdd(add *pb.ChangeRelationAdd) error {
}
func (s *State) changeRelationRemove(rem *pb.ChangeRelationRemove) error {
s.RemoveRelation(rem.RelationId...)
s.RemoveRelation(rem.RelationKey...)
return nil
}
func (s *State) changeOldRelationAdd(add *pb.Change_RelationAdd) error {
// MIGRATION: add old relation as new relationLinks
err := s.changeRelationAdd(&pb.ChangeRelationAdd{RelationLinks: []*model.RelationLink{{Key: add.Relation.Key, Format: add.Relation.Format}}})
if err != nil {
return err
}
for _, rel := range s.OldExtraRelations() {
if rel.Key == add.Relation.Key {
// todo: update?
@ -250,6 +261,11 @@ func (s *State) changeOldRelationRemove(remove *pb.Change_RelationRemove) error
}
}
err := s.changeRelationRemove(&pb.ChangeRelationRemove{RelationKey: []string{remove.Key}})
if err != nil {
return err
}
log.Warnf("changeOldRelationRemove: relation to remove not found")
return nil
}
@ -470,7 +486,7 @@ func (s *State) fillChanges(msgs []simple.EventMessage) {
cb.AddChange(&pb.ChangeContent{
Value: &pb.ChangeContentValueOfRelationRemove{
RelationRemove: &pb.ChangeRelationRemove{
RelationId: delRelIds,
RelationKey: delRelIds,
},
},
})

View file

@ -2,6 +2,7 @@ package state
import (
"fmt"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/latex"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/table"
@ -159,8 +160,14 @@ func (s *State) applyEvent(ev *pb.EventMessage) (err error) {
case *pb.EventMessageValueOfBlockDataviewOldRelationSet:
if err = apply(o.BlockDataviewOldRelationSet.Id, func(b simple.Block) error {
if f, ok := b.(dataview.Block); ok && o.BlockDataviewOldRelationSet.Relation != nil {
if er := f.UpdateRelation(o.BlockDataviewOldRelationSet.RelationKey, *o.BlockDataviewOldRelationSet.Relation); er == dataview.ErrRelationNotFound {
f.AddRelationOld(*o.BlockDataviewOldRelationSet.Relation)
if er := f.UpdateRelationOld(o.BlockDataviewOldRelationSet.RelationKey, *o.BlockDataviewOldRelationSet.Relation); er == dataview.ErrRelationNotFound {
rel := o.BlockDataviewOldRelationSet.Relation
f.AddRelationOld(*rel)
// MIGRATION: reinterpretation of old changes as new changes
f.AddRelation(&model.RelationLink{
Key: rel.Key,
Format: rel.Format,
})
} else {
return er
}
@ -173,7 +180,12 @@ func (s *State) applyEvent(ev *pb.EventMessage) (err error) {
case *pb.EventMessageValueOfBlockDataviewOldRelationDelete:
if err = apply(o.BlockDataviewOldRelationDelete.Id, func(b simple.Block) error {
if f, ok := b.(dataview.Block); ok {
return f.DeleteRelationOld(o.BlockDataviewOldRelationDelete.RelationKey)
err = f.DeleteRelationOld(o.BlockDataviewOldRelationDelete.RelationKey)
if err != nil {
return err
}
// MIGRATION: reinterpretation of old changes as new changes
f.DeleteRelation(o.BlockDataviewOldRelationDelete.RelationKey)
}
return fmt.Errorf("not a dataview block")
}); err != nil {
@ -191,7 +203,19 @@ func (s *State) applyEvent(ev *pb.EventMessage) (err error) {
}); err != nil {
return
}
case *pb.EventMessageValueOfBlockDataviewRelationDelete:
if err = apply(o.BlockDataviewRelationDelete.Id, func(b simple.Block) error {
if f, ok := b.(dataview.Block); ok {
for _, rel := range o.BlockDataviewRelationDelete.RelationIds {
// todo: implement DeleteRelations?
f.DeleteRelation(rel)
}
return nil
}
return fmt.Errorf("not a dataview block")
}); err != nil {
return
}
case *pb.EventMessageValueOfBlockSetRelation:
if err = apply(o.BlockSetRelation.Id, func(b simple.Block) error {
if f, ok := b.(relation.Block); ok {

View file

@ -1148,8 +1148,8 @@ func (s *State) Copy() *State {
relationLinks := make([]*model.RelationLink, len(s.relationLinks))
for i, rl := range s.relationLinks {
relationLinks[i] = &model.RelationLink{
Id: rl.Id,
Key: rl.Key,
Format: rl.Format,
Key: rl.Key,
}
}
copy := &State{
@ -1438,7 +1438,7 @@ func (s *State) SetContext(context *session.Context) {
func (s *State) AddRelationLinks(links ...*model.RelationLink) {
relLinks := s.GetRelationLinks()
for _, l := range links {
if !relLinks.Has(l.Id) {
if !relLinks.Has(l.Key) {
relLinks = append(relLinks, l)
}
}
@ -1467,21 +1467,24 @@ func (s *State) GetRelationLinks() pbtypes.RelationLinks {
return nil
}
func (s *State) RemoveRelation(ids ...string) {
func (s *State) RemoveRelation(keys ...string) {
relLinks := s.GetRelationLinks()
keysToRemove := make([]string, 0, len(ids))
for _, id := range ids {
if keyToRemove, ok := relLinks.Key(id); ok {
keysToRemove = append(keysToRemove, keyToRemove)
relLinks = relLinks.Remove(id)
relLinksFiltered := make(pbtypes.RelationLinks, 0, len(relLinks))
for _, link := range relLinks {
if slice.FindPos(keys, link.Key) < 0 {
continue
}
relLinksFiltered = append(relLinksFiltered, &model.RelationLink{
Key: link.Key,
Format: link.Format,
})
}
// remove detail value
s.RemoveDetail(keysToRemove...)
s.RemoveDetail(keys...)
// remove from the list of featured relations
featuredList := pbtypes.GetStringList(s.Details(), bundle.RelationKeyFeaturedRelations.String())
featuredList = slice.Filter(featuredList, func(s string) bool {
return slice.FindPos(keysToRemove, s) == -1
return slice.FindPos(keys, s) == -1
})
s.SetDetail(bundle.RelationKeyFeaturedRelations.String(), pbtypes.StringList(featuredList))
s.relationLinks = relLinks
@ -1559,7 +1562,7 @@ func (s *State) AddBundledRelations(keys ...bundle.RelationKey) {
links := make([]*model.RelationLink, 0, len(keys))
for _, key := range keys {
rel := bundle.MustGetRelation(key)
links = append(links, &model.RelationLink{Id: rel.Id, Key: rel.Key})
links = append(links, &model.RelationLink{Format: rel.Format, Key: rel.Key})
}
s.AddRelationLinks(links...)
}

View file

@ -94,7 +94,7 @@ var WithRelations = func(rels []bundle.RelationKey) StateTransformer {
continue
}
rel := bundle.MustGetRelation(relKey)
links = append(links, &model.RelationLink{Id: rel.Id, Key: rel.Key})
links = append(links, &model.RelationLink{Format: rel.Format, Key: rel.Key})
}
s.AddRelationLinks(links...)
}

View file

@ -36,6 +36,7 @@ const (
collectionKeyId = "id"
collectionKeyKey = "key"
collectionKeyRelationOptions = "relationOptions"
collectionKeyRelations = "relations"
)
var (
@ -47,6 +48,7 @@ func NewWorkspace(dmservice DetailsModifier) *Workspaces {
Set: NewSet(),
DetailsModifier: dmservice,
options: map[string]*Option{},
relations: map[string]*Relation{},
}
}
@ -58,7 +60,8 @@ type Workspaces struct {
changedRelationIds, changedRelationIdsOptions []string
options map[string]*Option
options map[string]*Option
relations map[string]*Relation
sourceService source.Service
app *app.App
@ -105,7 +108,7 @@ func (p *Workspaces) DeleteSubObject(objectId string) error {
st := p.NewState()
err := p.ObjectStore().DeleteObject(objectId)
if err != nil {
log.Errorf("error deleting sub object from store %s %s %v", objectId, p.Id() , err.Error())
log.Errorf("error deleting sub object from store %s %s %v", objectId, p.Id(), err.Error())
}
st.RemoveFromStore([]string{collectionKeyRelationOptions, objectId})
return p.Apply(st, smartblock.NoEvent, smartblock.NoHistory)
@ -314,7 +317,7 @@ func (p *Workspaces) Init(ctx *smartblock.InitContext) (err error) {
}
p.AddHook(p.updateObjects, smartblock.HookAfterApply)
p.AddHook(p.updateOptions, smartblock.HookAfterApply)
p.AddHook(p.updateSubObject, smartblock.HookAfterApply)
data := ctx.State.GetCollection(collectionKeyRelationOptions)
if data != nil && data.Fields != nil {

View file

@ -46,7 +46,14 @@ var (
model.SmartBlockType_Archive: objRestrictAll,
model.SmartBlockType_Set: objRestrictEdit,
model.SmartBlockType_BundledRelation: objRestrictAll,
model.SmartBlockType_IndexedRelation: {
model.SmartBlockType_SubObjectRelation: {
model.Restrictions_Blocks,
model.Restrictions_Relations,
model.Restrictions_LayoutChange,
model.Restrictions_TypeChange,
model.Restrictions_Template,
},
model.SmartBlockType_SubObjectRelationOption: {
model.Restrictions_Blocks,
model.Restrictions_Relations,
model.Restrictions_LayoutChange,
@ -57,7 +64,6 @@ var (
model.SmartBlockType_STObjectType: objRestrictEdit,
model.SmartBlockType_BundledTemplate: objRestrictAll,
model.SmartBlockType_Template: {},
model.SmartBlockType_RelationOption: objRestrictEdit,
}
)

View file

@ -192,6 +192,7 @@ type Service interface {
UpdateDataviewGroupOrder(ctx *session.Context, req pb.RpcBlockDataviewGroupOrderUpdateRequest) error
UpdateDataviewObjectOrder(ctx *session.Context, req pb.RpcBlockDataviewObjectOrderUpdateRequest) error
CreateRelation(opt *types.Struct) (id, key string, err error)
CreateRelationOption(opt *types.Struct) (id string, err error)
RemoveListOption(ctx *session.Context, ids []string, checkInObjects bool) error
@ -1101,6 +1102,19 @@ func (s *service) CreateRelationOption(opt *types.Struct) (id string, err error)
return
}
func (s *service) CreateRelation(rel *types.Struct) (id, key string, err error) {
// todo: rewrite to the current workspace id
err = s.Do(s.anytype.PredefinedBlocks().Account, func(b smartblock.SmartBlock) error {
workspace, ok := b.(*editor.Workspaces)
if !ok {
return fmt.Errorf("incorrect object with workspace id")
}
id, key, err = workspace.CreateRelation(rel)
return err
})
return
}
func (s *service) RemoveListOption(ctx *session.Context, optIds []string, checkInObjects bool) error {
var workspace *editor.Workspaces
if err := s.Do(s.anytype.PredefinedBlocks().Account, func(b smartblock.SmartBlock) error {
@ -1194,9 +1208,12 @@ func (s *service) newSmartBlock(id string, initCtx *smartblock.InitContext) (sb
case model.SmartBlockType_STObjectType,
model.SmartBlockType_BundledObjectType:
sb = editor.NewObjectType()
case model.SmartBlockType_BundledRelation,
model.SmartBlockType_IndexedRelation:
case model.SmartBlockType_BundledRelation:
sb = editor.NewSet()
case model.SmartBlockType_SubObjectRelation:
sb = editor.NewRelation()
case model.SmartBlockType_SubObjectRelationOption:
sb = editor.NewOption()
case model.SmartBlockType_File:
sb = editor.NewFiles()
case model.SmartBlockType_MarketplaceType:

View file

@ -3,6 +3,7 @@ package dataview
import (
"errors"
"fmt"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/addr"
"github.com/globalsign/mgo/bson"
@ -62,7 +63,7 @@ type Block interface {
// AddRelationOld DEPRECATED
AddRelationOld(relation model.Relation)
// UpdateRelation DEPRECATED
UpdateRelation(relationKey string, relation model.Relation) error
UpdateRelationOld(relationKey string, relation model.Relation) error
// DeleteRelationOld DEPRECATED
DeleteRelationOld(relationKey string) error
}
@ -286,7 +287,7 @@ func (l *Dataview) getActiveView() *model.BlockContentDataviewView {
func (l *Dataview) FillSmartIds(ids []string) []string {
for _, rl := range l.content.RelationLinks {
ids = append(ids, rl.Id)
ids = append(ids, addr.RelationKeyToIdPrefix+rl.Key)
}
return ids
}
@ -296,20 +297,15 @@ func (l *Dataview) HasSmartIds() bool {
}
func (d *Dataview) AddRelation(relation *model.RelationLink) error {
if pbtypes.RelationLinks(d.content.RelationLinks).Has(relation.Id) {
if pbtypes.RelationLinks(d.content.RelationLinks).Has(relation.Key) {
return ErrRelationExists
}
d.content.RelationLinks = append(d.content.RelationLinks, relation)
return nil
}
func (d *Dataview) DeleteRelation(relationId string) error {
relationKey, ok := pbtypes.RelationLinks(d.content.RelationLinks).Key(relationId)
if !ok {
return nil
}
d.content.RelationLinks = pbtypes.RelationLinks(d.content.RelationLinks).Remove(relationId)
func (d *Dataview) DeleteRelation(relationKey string) error {
d.content.RelationLinks = pbtypes.RelationLinks(d.content.RelationLinks).Remove(relationKey)
for _, view := range d.content.Views {
var filteredFilters []*model.BlockContentDataviewFilter
@ -454,7 +450,7 @@ func (s *Dataview) GetRelation(relationKey string) (*model.Relation, error) {
return nil, ErrRelationNotFound
}
func (s *Dataview) UpdateRelation(relationKey string, rel model.Relation) error {
func (s *Dataview) UpdateRelationOld(relationKey string, rel model.Relation) error {
var found bool
if relationKey != rel.Key {
return fmt.Errorf("changing key of existing relation is retricted")

View file

@ -72,6 +72,7 @@ func getDetailsForBundledObjectType(id string) (extraRels []*model.Relation, p *
bundle.RelationKeyIsHidden.String(): pbtypes.Bool(ot.Hidden),
bundle.RelationKeyIsArchived.String(): pbtypes.Bool(false),
bundle.RelationKeyIsReadonly.String(): pbtypes.Bool(ot.Readonly),
bundle.RelationKeyWorkspaceId.String(): pbtypes.String("_anytype_marketplace"),
}}
return extraRels, det, nil
@ -85,7 +86,7 @@ func (v *bundledObjectType) ReadDoc(ctx context.Context, receiver ChangeReceiver
return nil, err
}
for _, r := range rels {
s.AddRelationLinks(&model.RelationLink{Id: addr.BundledRelationURLPrefix + r.Key, Key: r.Key})
s.AddRelationLinks(&model.RelationLink{Format: r.Format, Key: r.Key})
}
s.SetDetails(d)
s.SetObjectType(bundle.TypeKeyObjectType.URL())

View file

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"strings"
"github.com/anytypeio/go-anytype-middleware/change"
@ -57,7 +58,9 @@ func (v *bundledRelation) getDetails(id string) (p *types.Struct, err error) {
return nil, err
}
rel.Creator = addr.AnytypeProfileId
return bundle.GetDetailsForRelation(true, rel), nil
details := bundle.GetDetailsForRelation(true, rel)
details.Fields[bundle.RelationKeyWorkspaceId.String()] = pbtypes.String("_anytype_marketplace")
return details, nil
}
func (v *bundledRelation) ReadDoc(_ context.Context, _ ChangeReceiver, empty bool) (doc state.Doc, err error) {

View file

@ -81,7 +81,7 @@ func (s *service) SourceTypeBySbType(blockType smartblock.SmartBlockType) (Sourc
return &files{a: s.anytype}, nil
case smartblock.SmartBlockTypeBundledObjectType:
return &bundledObjectType{a: s.anytype}, nil
case smartblock.SmartBlockTypeBundledRelation, smartblock.SmartBlockTypeIndexedRelation:
case smartblock.SmartBlockTypeBundledRelation:
return &bundledRelation{a: s.anytype}, nil
case smartblock.SmartBlockTypeWorkspaceOld:
return &threadDB{a: s.anytype}, nil

View file

@ -138,11 +138,10 @@ func (mw *Middleware) ObjectCreate(cctx context.Context, req *pb.RpcObjectCreate
InternalFlags: req.InternalFlags,
})
case bundle.TypeKeyRelation:
rl, err2 := mw.relationCreate(&pb.RpcObjectCreateRelationRequest{
id, _, err = mw.objectCreateRelation(&pb.RpcObjectCreateRelationRequest{
Details: req.Details,
})
id = rl.Id
err = err2
case bundle.TypeKeyRelationOption:
id, err = mw.objectCreateRelationOption(&pb.RpcObjectCreateRelationOptionRequest{
Details: req.Details,

View file

@ -500,12 +500,12 @@ func (mw *Middleware) ObjectRelationAdd(cctx context.Context, req *pb.RpcObjectR
}
return m
}
if len(req.RelationIds) == 0 {
if len(req.RelationKeys) == 0 {
return response(pb.RpcObjectRelationAddResponseError_BAD_INPUT, fmt.Errorf("relation is nil"))
}
err := mw.doBlockService(func(bs block.Service) (err error) {
return bs.AddExtraRelations(ctx, req.ContextId, req.RelationIds)
return bs.AddExtraRelations(ctx, req.ContextId, req.RelationKeys)
})
if err != nil {
return response(pb.RpcObjectRelationAddResponseError_BAD_INPUT, err)
@ -526,7 +526,7 @@ func (mw *Middleware) ObjectRelationDelete(cctx context.Context, req *pb.RpcObje
return m
}
err := mw.doBlockService(func(bs block.Service) (err error) {
return bs.RemoveExtraRelations(ctx, req.ContextId, []string{req.RelationId})
return bs.RemoveExtraRelations(ctx, req.ContextId, []string{req.RelationKey})
})
if err != nil {
return response(pb.RpcObjectRelationDeleteResponseError_BAD_INPUT, err)

View file

@ -1,4 +1,4 @@
package relation
package relationutils
import (
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
@ -37,8 +37,8 @@ type Relation struct {
func (r *Relation) RelationLink() *model.RelationLink {
return &model.RelationLink{
Id: r.Id,
Key: r.Key,
Format: r.Format,
Key: r.Key,
}
}
@ -94,3 +94,14 @@ func (rs Relations) GetModelByKey(key string) *model.Relation {
}
return nil
}
func MigrateRelationsModels(rels []*model.Relation) (relLinks []*model.RelationLink) {
relLinks = make([]*model.RelationLink, 0, len(rels))
for _, rel := range rels {
relLinks = append(relLinks, &model.RelationLink{
Key: rel.Key,
Format: rel.Format,
})
}
return
}

View file

@ -1,23 +1,19 @@
package relation
import (
"context"
"errors"
"fmt"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"net/url"
"strings"
"sync"
"github.com/anytypeio/go-anytype-middleware/app"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/state"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
coresb "github.com/anytypeio/go-anytype-middleware/pkg/lib/core/smartblock"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/database"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/addr"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/objectstore"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"github.com/anytypeio/go-anytype-middleware/util/slice"
"github.com/globalsign/mgo/bson"
"github.com/gogo/protobuf/types"
"github.com/ipfs/go-datastore/query"
@ -36,34 +32,26 @@ func New() Service {
return new(service)
}
type objectCreator interface {
CreateSmartBlockFromState(ctx context.Context, sbType coresb.SmartBlockType, details *types.Struct, relationIds []string, createState *state.State) (id string, newDetails *types.Struct, err error)
}
type Service interface {
FetchIds(ids ...string) (relations Relations, err error)
FetchId(id string) (relation *Relation, err error)
FetchKey(key string, opts ...FetchOption) (relation *Relation, err error)
FetchLinks(links pbtypes.RelationLinks) (relations Relations, err error)
FetchKeys(keys ...string) (relations relationutils.Relations, err error)
FetchKey(key string, opts ...FetchOption) (relation *relationutils.Relation, err error)
FetchLinks(links pbtypes.RelationLinks) (relations relationutils.Relations, err error)
Create(details *types.Struct) (rl *model.RelationLink, err error)
//Create(details *types.Struct) (rl *model.RelationLink, err error)
//CreateOption(relationKey string, opt *model.RelationOption) (id string, err error)
MigrateRelations(rels []*model.Relation) (relLinks []*model.RelationLink, err error)
ValidateFormat(key string, v *types.Value) error
app.Component
}
type service struct {
objectStore objectstore.ObjectStore
objectCreator objectCreator
mu sync.RWMutex
objectStore objectstore.ObjectStore
mu sync.RWMutex
migrateCache map[string]*model.RelationLink
}
func (s *service) Init(a *app.App) (err error) {
s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
s.objectCreator = a.MustComponent(blockServiceCName).(objectCreator)
s.migrateCache = make(map[string]*model.RelationLink)
return
}
@ -72,34 +60,25 @@ func (s *service) Name() (name string) {
return CName
}
func (s *service) FetchLinks(links pbtypes.RelationLinks) (relations Relations, err error) {
ids := make([]string, 0, len(links))
func (s *service) FetchLinks(links pbtypes.RelationLinks) (relations relationutils.Relations, err error) {
keys := make([]string, 0, len(links))
for _, l := range links {
ids = append(ids, l.Id)
keys = append(keys, l.Key)
}
return s.fetchIds(ids...)
return s.fetchKeys(keys...)
}
func (s *service) FetchIds(ids ...string) (relations Relations, err error) {
func (s *service) FetchKeys(keys ...string) (relations relationutils.Relations, err error) {
s.mu.RLock()
defer s.mu.RUnlock()
return s.fetchIds(ids...)
return s.fetchKeys(keys...)
}
func (s *service) fetchIds(ids ...string) (relations []*Relation, err error) {
ids = slice.Filter(ids, func(id string) bool {
if !strings.HasPrefix(id, addr.BundledRelationURLPrefix) {
return true
}
r, _ := bundle.GetRelation(bundle.RelationKey(strings.TrimPrefix(id, addr.BundledRelationURLPrefix)))
if r != nil {
r.Id = id
relations = append(relations, &Relation{r})
return false
}
return true
})
func (s *service) fetchKeys(keys ...string) (relations []*relationutils.Relation, err error) {
ids := make([]string, 0, len(keys))
for _, key := range keys {
ids = append(ids, addr.RelationKeyToIdPrefix+key)
}
records, err := s.objectStore.QueryById(ids)
if err != nil {
return
@ -109,22 +88,11 @@ func (s *service) fetchIds(ids ...string) (relations []*Relation, err error) {
if pbtypes.GetString(rec.Details, bundle.RelationKeyType.String()) != bundle.TypeKeyRelation.URL() {
continue
}
relations = append(relations, RelationFromStruct(rec.Details))
relations = append(relations, relationutils.RelationFromStruct(rec.Details))
}
return
}
func (s *service) FetchId(id string) (relation *Relation, err error) {
rels, err := s.FetchIds(id)
if err != nil {
return
}
if len(rels) == 0 {
return nil, ErrNotFound
}
return rels[0], nil
}
type fetchOptions struct {
workspaceId *string
}
@ -137,17 +105,13 @@ func WithWorkspaceId(id string) FetchOption {
}
}
func (s *service) FetchKey(key string, opts ...FetchOption) (relation *Relation, err error) {
func (s *service) FetchKey(key string, opts ...FetchOption) (relation *relationutils.Relation, err error) {
s.mu.RLock()
defer s.mu.RUnlock()
return s.fetchKey(key, opts...)
}
func (s *service) fetchKey(key string, opts ...FetchOption) (relation *Relation, err error) {
if b, _ := bundle.GetRelation(bundle.RelationKey(key)); b != nil {
b.Id = addr.BundledRelationURLPrefix + key
return &Relation{b}, nil
}
func (s *service) fetchKey(key string, opts ...FetchOption) (relation *relationutils.Relation, err error) {
o := &fetchOptions{}
for _, apply := range opts {
apply(o)
@ -181,12 +145,12 @@ func (s *service) fetchKey(key string, opts ...FetchOption) (relation *Relation,
Filters: []query.Filter{f},
})
for _, rec := range records {
return RelationFromStruct(rec.Details), nil
return relationutils.RelationFromStruct(rec.Details), nil
}
return nil, ErrNotFound
}
func (s *service) fetchOptionsByKey(key string) (relation *Relation, err error) {
func (s *service) fetchOptionsByKey(key string) (relation *relationutils.Relation, err error) {
q := database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
@ -209,77 +173,11 @@ func (s *service) fetchOptionsByKey(key string) (relation *Relation, err error)
Filters: []query.Filter{f},
})
for _, rec := range records {
return RelationFromStruct(rec.Details), nil
return relationutils.RelationFromStruct(rec.Details), nil
}
return nil, ErrNotFound
}
func (s *service) Create(details *types.Struct) (rl *model.RelationLink, err error) {
s.mu.Lock()
defer s.mu.Unlock()
rel := &model.Relation{
Key: generateRelationKey(),
}
return s.create(rel, details, true)
}
func (s *service) create(rel *model.Relation, reqDetails *types.Struct, checkForExists bool) (rl *model.RelationLink, err error) {
if checkForExists {
if _, e := s.fetchKey(rel.Key); e != ErrNotFound {
return nil, ErrExists
}
}
st := state.NewDoc("", nil).(*state.State)
st.SetObjectType(bundle.TypeKeyRelation.URL())
r := &Relation{Relation: rel}
details := r.ToStruct()
details = pbtypes.StructMerge(details, reqDetails, false)
for k, v := range details.Fields {
st.SetDetailAndBundledRelation(bundle.RelationKey(k), v)
}
id, _, err := s.objectCreator.CreateSmartBlockFromState(context.TODO(), coresb.SmartBlockTypeIndexedRelation, details, nil, st)
if err != nil {
return
}
return &model.RelationLink{
Id: id,
Key: rel.Key,
}, nil
}
func (s *service) MigrateRelations(rels []*model.Relation) (relLinks []*model.RelationLink, err error) {
s.mu.Lock()
defer s.mu.Unlock()
relLinks = make([]*model.RelationLink, 0, len(rels))
for _, rel := range rels {
link, ok := s.migrateCache[rel.Key]
if !ok {
link, err = s.migrateRelation(rel)
if err != nil {
return
}
s.migrateCache[rel.Key] = link
}
relLinks = append(relLinks, link)
if len(rel.SelectDict) > 0 {
if err = s.migrateOptions(rel); err != nil {
return
}
}
}
return
}
func (s *service) migrateRelation(rel *model.Relation) (rl *model.RelationLink, err error) {
dbRel, e := s.fetchKey(rel.Key)
if e == nil {
return dbRel.RelationLink(), nil
}
return s.create(rel, nil, false)
}
func (s *service) migrateOptions(rel *model.Relation) (err error) {
return
@ -412,7 +310,7 @@ func (s *service) ValidateFormat(key string, v *types.Value) error {
}
}
func (s *service) validateOptions(rel *Relation, v []string) error {
func (s *service) validateOptions(rel *relationutils.Relation, v []string) error {
//TODO:
return nil
}

View file

@ -11,7 +11,6 @@ import (
"github.com/gogo/protobuf/types"
"github.com/anytypeio/go-anytype-middleware/core/block"
"github.com/anytypeio/go-anytype-middleware/core/relation"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/core"
@ -75,7 +74,7 @@ func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObj
}
err = mw.doBlockService(func(bs block.Service) (err error) {
err = bs.AddExtraRelations(nil, objType.Url, req.RelationIds)
err = bs.AddExtraRelations(nil, objType.Url, req.RelationKeys)
if err != nil {
return err
}
@ -300,24 +299,12 @@ func (mw *Middleware) ObjectCreateRelation(cctx context.Context, req *pb.RpcObje
Key: key,
}
}
rl, err := mw.relationCreate(req)
id, key, err := mw.objectCreateRelation(req)
if err != nil {
return response("", "", err)
}
return response(rl.Id, rl.Key, err)
}
func (mw *Middleware) relationCreate(req *pb.RpcObjectCreateRelationRequest) (*model.RelationLink, error) {
var rl *model.RelationLink
err := mw.doRelationService(func(rs relation.Service) error {
var err error
rl, err = rs.Create(req.Details)
if err != nil {
return err
}
return nil
})
return rl, err
return response(id, key, err)
}
func (mw *Middleware) ObjectCreateRelationOption(cctx context.Context, req *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse {
@ -343,15 +330,30 @@ func (mw *Middleware) ObjectCreateRelationOption(cctx context.Context, req *pb.R
}
func (mw *Middleware) objectCreateRelationOption(req *pb.RpcObjectCreateRelationOptionRequest) (string, error) {
req.Details.Fields[bundle.RelationKeyType.String()] = pbtypes.String(bundle.TypeKeyRelationOption.URL())
req.Details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relationOption))
var id string
err := mw.doBlockService(func(rs block.Service) error {
var err error
id, err = rs.CreateRelationOption(req.Details)
id, err = rs.
CreateRelationOption(req.Details)
return err
})
return id, err
}
func (mw *Middleware) objectCreateRelation(req *pb.RpcObjectCreateRelationRequest) (id, key string, err error) {
req.Details.Fields[bundle.RelationKeyType.String()] = pbtypes.String(bundle.TypeKeyRelation.URL())
req.Details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relation))
err = mw.doBlockService(func(rs block.Service) error {
var err error
id, key, err = rs.CreateRelation(req.Details)
return err
})
return
}
func (mw *Middleware) RelationListRemoveOption(cctx context.Context, request *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse {
ctx := mw.newContext(cctx)
response := func(code pb.RpcRelationListRemoveOptionResponseErrorCode, err error) *pb.RpcRelationListRemoveOptionResponse {
@ -366,7 +368,7 @@ func (mw *Middleware) RelationListRemoveOption(cctx context.Context, request *pb
return &pb.RpcRelationListRemoveOptionResponse{
Error: &pb.RpcRelationListRemoveOptionResponseError{
Code: code,
Code: code,
},
}
}

View file

@ -65,12 +65,13 @@ func TestRelations_New_Account(t *testing.T) {
relName := "test_str"
relDesc := "test_str_desc"
relFormat := model.RelationFormat_tag
respRelationCreate := mw.ObjectCreateRelation(context.Background(), &pb.RpcObjectCreateRelationRequest{
Details: &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyRelationFormat.String(): pbtypes.Float64(float64(model.RelationFormat_tag)),
bundle.RelationKeyName.String(): pbtypes.String(relName),
bundle.RelationKeyDescription.String(): pbtypes.String(relDesc),
bundle.RelationKeyRelationFormat.String(): pbtypes.Float64(float64(relFormat)),
bundle.RelationKeyName.String(): pbtypes.String(relName),
bundle.RelationKeyDescription.String(): pbtypes.String(relDesc),
bundle.RelationKeyType.String(): pbtypes.String(bundle.TypeKeyRelation.URL()),
}},
})
require.Equal(t, 0, int(respRelationCreate.Error.Code), respRelationCreate.Error.Description)
@ -78,8 +79,8 @@ func TestRelations_New_Account(t *testing.T) {
require.True(t, respRelationCreate.ObjectId != "")
respObjectRelationAdd := mw.ObjectRelationAdd(context.Background(), &pb.RpcObjectRelationAddRequest{
ContextId: setId,
RelationIds: []string{respRelationCreate.ObjectId},
ContextId: setId,
RelationKeys: []string{respRelationCreate.Key},
})
require.Equal(t, 0, int(respObjectRelationAdd.Error.Code), respObjectRelationAdd.Error.Description)
@ -95,9 +96,9 @@ func TestRelations_New_Account(t *testing.T) {
require.Equal(t, 0, int(respObjectSetDetails.Error.Code), respObjectSetDetails.Error.Description)
respBlockDataviewRelationAdd := mw.BlockDataviewRelationAdd(context.Background(), &pb.RpcBlockDataviewRelationAddRequest{
ContextId: setId,
BlockId: "dataview",
RelationId: respRelationCreate.ObjectId,
ContextId: setId,
BlockId: "dataview",
RelationKeys: []string{respRelationCreate.Key},
})
require.Equal(t, 0, int(respBlockDataviewRelationAdd.Error.Code), respBlockDataviewRelationAdd.Error.Description)
@ -107,7 +108,7 @@ func TestRelations_New_Account(t *testing.T) {
var found bool
for _, rel := range respObjectShow.ObjectView.RelationLinks {
if rel.Id == respRelationCreate.ObjectId && rel.Key == respRelationCreate.Key {
if rel.Key == respRelationCreate.Key && rel.Format == relFormat {
found = true
break
}
@ -135,7 +136,7 @@ func TestRelations_New_Account(t *testing.T) {
found = false
for _, rel := range dataviewBlock.GetDataview().RelationLinks {
if rel.Id == respRelationCreate.ObjectId && rel.Key == respRelationCreate.Key {
if rel.Format == relFormat && rel.Key == respRelationCreate.Key {
found = true
break
}
@ -145,10 +146,10 @@ func TestRelations_New_Account(t *testing.T) {
respRelationCreateOption := mw.ObjectCreateRelationOption(context.Background(), &pb.RpcObjectCreateRelationOptionRequest{
Details: &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyRelationKey.String(): pbtypes.String(respRelationCreate.Key),
bundle.RelationKeyRelationOptionText.String(): pbtypes.String("test_option_text"),
bundle.RelationKeyRelationKey.String(): pbtypes.String(respRelationCreate.Key),
bundle.RelationKeyRelationOptionText.String(): pbtypes.String("test_option_text"),
bundle.RelationKeyRelationOptionColor.String(): pbtypes.String("red"),
},
},
}})
require.Equal(t, 0, int(respRelationCreateOption.Error.Code), respRelationCreateOption.Error.Description)

File diff suppressed because it is too large Load diff

View file

@ -915,7 +915,7 @@ func (m *ChangeRelationAdd) GetRelationLinks() []*model.RelationLink {
}
type ChangeRelationRemove struct {
RelationId []string `protobuf:"bytes,1,rep,name=relationId,proto3" json:"relationId,omitempty"`
RelationKey []string `protobuf:"bytes,1,rep,name=relationKey,proto3" json:"relationKey,omitempty"`
}
func (m *ChangeRelationRemove) Reset() { *m = ChangeRelationRemove{} }
@ -951,9 +951,9 @@ func (m *ChangeRelationRemove) XXX_DiscardUnknown() {
var xxx_messageInfo_ChangeRelationRemove proto.InternalMessageInfo
func (m *ChangeRelationRemove) GetRelationId() []string {
func (m *ChangeRelationRemove) GetRelationKey() []string {
if m != nil {
return m.RelationId
return m.RelationKey
}
return nil
}
@ -1494,83 +1494,83 @@ func init() { proto.RegisterFile("pb/protos/changes.proto", fileDescriptor_2b02b
var fileDescriptor_2b02bba284ea1e46 = []byte{
// 1229 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4f, 0x73, 0xdb, 0x44,
0x14, 0xb7, 0x62, 0xc7, 0xb1, 0x9f, 0x12, 0x37, 0xdd, 0xe9, 0x34, 0x42, 0x0d, 0xae, 0xdb, 0x06,
0xc6, 0x03, 0x1d, 0x19, 0x1c, 0x86, 0x92, 0x52, 0x86, 0xa9, 0xf3, 0x07, 0x67, 0x48, 0x48, 0x66,
0x43, 0x39, 0x70, 0xc9, 0xac, 0xad, 0x8d, 0xad, 0x5a, 0xb6, 0x34, 0xd2, 0x3a, 0x33, 0xfe, 0x14,
0x30, 0x7c, 0x04, 0x3e, 0x0d, 0xc7, 0xde, 0xe0, 0xc8, 0x24, 0x1f, 0x81, 0x2b, 0x07, 0x66, 0x57,
0x2b, 0x69, 0xe5, 0xc8, 0x0d, 0x3d, 0xc0, 0xa5, 0xf5, 0xdb, 0xfd, 0xfd, 0x7e, 0xfb, 0xde, 0xdb,
0xd5, 0x6f, 0x37, 0xb0, 0xe1, 0xf7, 0x5a, 0x7e, 0xe0, 0x31, 0x2f, 0x6c, 0xf5, 0x87, 0x64, 0x32,
0xa0, 0xa1, 0x25, 0x42, 0xb4, 0x42, 0x26, 0x33, 0x36, 0xf3, 0xa9, 0xb9, 0xe5, 0x8f, 0x06, 0x2d,
0xd7, 0xe9, 0xb5, 0xfc, 0x5e, 0x6b, 0xec, 0xd9, 0xd4, 0x8d, 0xf1, 0x22, 0x90, 0x70, 0xf3, 0x7e,
0xaa, 0x43, 0x2f, 0xe9, 0x84, 0xc5, 0xe3, 0x9b, 0x03, 0xcf, 0x1b, 0xb8, 0x34, 0x9a, 0xeb, 0x4d,
0x2f, 0x5a, 0x21, 0x0b, 0xa6, 0x7d, 0x16, 0xcd, 0x3e, 0xfe, 0xd5, 0x84, 0xf2, 0xae, 0x58, 0x16,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xdb, 0x36,
0x14, 0xb7, 0x62, 0xc7, 0xb1, 0x9f, 0x12, 0x37, 0x25, 0x8a, 0x46, 0x53, 0x33, 0xd7, 0x6d, 0xb3,
0xc1, 0xd8, 0x0a, 0x19, 0x73, 0x86, 0x75, 0xe9, 0x3a, 0x0c, 0x75, 0xfe, 0xcc, 0x41, 0x93, 0x25,
0x60, 0xd6, 0x1d, 0x76, 0x09, 0x68, 0x8b, 0xb1, 0x55, 0xcb, 0x96, 0x20, 0xd1, 0x01, 0xfc, 0x29,
0x36, 0xec, 0x33, 0xec, 0xc3, 0xec, 0xd8, 0xdb, 0x76, 0x1c, 0x92, 0x8f, 0xb0, 0xeb, 0x0e, 0x03,
0x29, 0x4a, 0xa2, 0x1c, 0xb9, 0x59, 0x0f, 0xdb, 0x25, 0x31, 0xc9, 0xdf, 0xef, 0xc7, 0xf7, 0x1e,
0x9f, 0x7e, 0x24, 0x6c, 0xf8, 0xbd, 0x96, 0x1f, 0x78, 0xcc, 0x0b, 0x5b, 0xfd, 0x21, 0x99, 0x0c,
0x68, 0x68, 0x89, 0x21, 0x5a, 0x21, 0x93, 0x19, 0x9b, 0xf9, 0xd4, 0xdc, 0xf2, 0x47, 0x83, 0x96,
0xeb, 0xf4, 0x5a, 0x7e, 0xaf, 0x35, 0xf6, 0x6c, 0xea, 0xc6, 0x78, 0x31, 0x90, 0x70, 0xf3, 0x7e,
0xaa, 0x43, 0x2f, 0xe9, 0x84, 0xc5, 0xf3, 0x9b, 0x03, 0xcf, 0x1b, 0xb8, 0x34, 0x5a, 0xeb, 0x4d,
0x2f, 0x5a, 0x21, 0x0b, 0xa6, 0x7d, 0x16, 0xad, 0x3e, 0xfe, 0xd5, 0x84, 0xf2, 0xae, 0xd8, 0x16,
0x3d, 0x82, 0x55, 0x3f, 0xa0, 0x97, 0x8e, 0x37, 0x0d, 0xcf, 0x1d, 0x3b, 0x34, 0xb4, 0x46, 0xb1,
0x59, 0xc5, 0x7a, 0x3c, 0x76, 0x68, 0x87, 0xa8, 0x09, 0xeb, 0x2e, 0x09, 0xd9, 0x79, 0x38, 0x21,
0x7e, 0x38, 0xf4, 0xd8, 0xb9, 0x63, 0x1b, 0x4b, 0x0d, 0xad, 0x59, 0xc5, 0x35, 0x3e, 0x7e, 0x26,
0x87, 0x0f, 0x6d, 0xf4, 0x11, 0xdc, 0x4d, 0xc4, 0xc6, 0x94, 0x11, 0xa1, 0xb8, 0x2c, 0x14, 0xef,
0xc4, 0x13, 0xc7, 0x94, 0x11, 0xae, 0xfa, 0x29, 0xac, 0xf4, 0xbd, 0x09, 0xa3, 0x13, 0x66, 0x14,
0x1b, 0xc5, 0xa6, 0xde, 0xde, 0xb0, 0x64, 0xe9, 0x56, 0x94, 0x9a, 0xb5, 0x1b, 0x4d, 0xe3, 0x18,
0x87, 0x3e, 0x83, 0x4a, 0x9c, 0x83, 0x51, 0x6a, 0x68, 0x4d, 0xbd, 0x6d, 0xcc, 0x73, 0xe2, 0x64,
0x70, 0x82, 0xe4, 0xac, 0x0b, 0xc7, 0xa5, 0xdf, 0xd2, 0x59, 0x68, 0x94, 0xc5, 0x4a, 0x37, 0x58,
0x07, 0x72, 0x1e, 0x27, 0x48, 0xb4, 0x09, 0x55, 0xe6, 0x8c, 0x69, 0xc8, 0xc8, 0xd8, 0x37, 0x56,
0x1a, 0x5a, 0xb3, 0x88, 0xd3, 0x01, 0xf3, 0x6f, 0x0d, 0x2a, 0xf1, 0x52, 0xa8, 0x03, 0x15, 0xd7,
0x1b, 0x74, 0x29, 0x91, 0xed, 0xd3, 0xdb, 0x1f, 0x2e, 0x4a, 0xcb, 0x3a, 0x92, 0xc0, 0xfd, 0x09,
0x0b, 0x66, 0x38, 0xe1, 0xa1, 0x1d, 0x28, 0xd9, 0x84, 0x11, 0xd1, 0x57, 0xbd, 0xfd, 0x41, 0xc2,
0x17, 0x9b, 0x6d, 0x9d, 0x8d, 0x49, 0xc0, 0x3a, 0xae, 0xd7, 0x1f, 0xc5, 0x42, 0x1d, 0x12, 0x52,
0x2c, 0x28, 0x99, 0xfa, 0x8a, 0xff, 0xb6, 0x3e, 0xf3, 0x4b, 0x58, 0xcb, 0xe4, 0x82, 0xd6, 0xa1,
0x38, 0xa2, 0x33, 0x43, 0x13, 0x1b, 0xcb, 0x7f, 0xa2, 0x7b, 0xb0, 0x7c, 0x49, 0xdc, 0x29, 0x95,
0x9b, 0x1d, 0x05, 0xcf, 0x97, 0xbe, 0xd0, 0xcc, 0x9f, 0x34, 0xa8, 0xc4, 0x9a, 0x08, 0x41, 0x69,
0x48, 0xc2, 0xa1, 0x64, 0x8a, 0xdf, 0xe8, 0x73, 0x28, 0x8d, 0x78, 0x3e, 0x4b, 0x22, 0x9f, 0xc7,
0x8b, 0xf2, 0xb1, 0xf8, 0x3f, 0x51, 0x2b, 0x04, 0xde, 0x7c, 0x06, 0xd5, 0x64, 0xe8, 0x9d, 0x32,
0xfa, 0xab, 0x02, 0x2b, 0xf2, 0xbc, 0xa0, 0xaf, 0x41, 0xef, 0xf1, 0x5e, 0xed, 0x06, 0x94, 0x30,
0x2a, 0xf8, 0x7a, 0xfb, 0xc1, 0x7c, 0x0e, 0x9d, 0x14, 0xd2, 0x2d, 0x60, 0x95, 0x91, 0x08, 0xbc,
0xf2, 0x6d, 0x2e, 0xb0, 0xf4, 0x16, 0x81, 0x08, 0x92, 0x08, 0x44, 0x61, 0x22, 0x80, 0xe9, 0xd8,
0xbb, 0xa4, 0x46, 0xf1, 0x2d, 0x02, 0x11, 0x24, 0x11, 0x88, 0x42, 0xb4, 0x03, 0x55, 0x11, 0x1e,
0x73, 0x7a, 0x74, 0xd4, 0xdf, 0xcb, 0xa5, 0x1f, 0x47, 0xe4, 0x14, 0x8d, 0xba, 0x50, 0x13, 0xc1,
0xde, 0xd4, 0x77, 0x9d, 0x3e, 0xcf, 0x7f, 0x59, 0xf0, 0xeb, 0xb9, 0xfc, 0x04, 0xd5, 0x2d, 0xe0,
0x39, 0x1e, 0xaf, 0x22, 0xa0, 0x2e, 0x61, 0x8e, 0x37, 0x79, 0x69, 0xdb, 0x46, 0x3b, 0xbf, 0x0a,
0x9c, 0x42, 0x78, 0x15, 0x0a, 0x83, 0xa7, 0x12, 0x87, 0xb2, 0x13, 0xdb, 0xf9, 0xa9, 0xe0, 0x0c,
0x8a, 0xa7, 0x92, 0xe5, 0xa1, 0x17, 0x00, 0x36, 0x65, 0xc4, 0x71, 0xc3, 0x33, 0xca, 0x0c, 0x5b,
0xa8, 0x98, 0xf3, 0x2a, 0x7b, 0x09, 0xa2, 0x5b, 0xc0, 0x0a, 0x1e, 0x75, 0x60, 0x55, 0x46, 0xaf,
0x26, 0x21, 0x65, 0x06, 0x15, 0xfc, 0xcd, 0x05, 0x7c, 0x81, 0xe9, 0x16, 0x70, 0x86, 0x83, 0xbe,
0x81, 0x3b, 0x9e, 0x6b, 0x9f, 0xab, 0x0d, 0xb9, 0xc8, 0x97, 0x39, 0xcf, 0x76, 0xa4, 0xe6, 0xb9,
0xb6, 0x32, 0x82, 0x4e, 0x01, 0xa9, 0x42, 0xb2, 0x31, 0x03, 0xa1, 0xf5, 0x70, 0xa1, 0x56, 0xd2,
0x99, 0xbb, 0x8a, 0x9c, 0x6c, 0xce, 0x9c, 0xa2, 0x3c, 0xb5, 0xc3, 0x5b, 0x14, 0x93, 0x93, 0xab,
0x2a, 0xca, 0xf3, 0xbb, 0x0f, 0x6b, 0x5e, 0xef, 0x35, 0xed, 0xb3, 0xef, 0x67, 0x3e, 0xe5, 0xa5,
0x3a, 0x42, 0xec, 0xfd, 0x79, 0xb1, 0x13, 0x15, 0xd4, 0x2d, 0xe0, 0x2c, 0x0b, 0x7d, 0x07, 0xeb,
0xe9, 0x80, 0x2c, 0xf4, 0xb5, 0x50, 0x6a, 0x2c, 0x56, 0x4a, 0x2a, 0xbd, 0xc1, 0xe5, 0x07, 0x32,
0x64, 0x5e, 0xc0, 0xad, 0x83, 0x1f, 0x83, 0x51, 0xfe, 0x81, 0x3c, 0x4b, 0x21, 0xfc, 0x40, 0x2a,
0x0c, 0x5e, 0x57, 0x1c, 0x46, 0x27, 0xc1, 0xcd, 0xaf, 0xeb, 0x4c, 0x05, 0xf1, 0xba, 0x32, 0xac,
0xce, 0x8a, 0xb4, 0x21, 0xf3, 0x17, 0x0d, 0x74, 0xc5, 0x47, 0x90, 0x09, 0x15, 0x46, 0x82, 0x01,
0x65, 0x87, 0xb6, 0xb4, 0xad, 0x24, 0x46, 0x3b, 0x50, 0xf1, 0xbd, 0xd0, 0xe1, 0x5d, 0x16, 0x8e,
0x52, 0x53, 0x96, 0x8d, 0x5c, 0x5e, 0x28, 0x59, 0xa7, 0x12, 0x84, 0x13, 0x38, 0x7a, 0x0a, 0x65,
0xf1, 0x69, 0xc6, 0xfe, 0x7e, 0x2f, 0x8f, 0x88, 0x25, 0xc6, 0xfc, 0x4a, 0xe6, 0x24, 0xf7, 0xd2,
0x82, 0x72, 0xf4, 0x32, 0x90, 0x66, 0x7c, 0x3f, 0x21, 0xef, 0xf3, 0x61, 0xeb, 0x98, 0x86, 0x21,
0x19, 0x50, 0x2c, 0x51, 0xe6, 0x43, 0x49, 0x97, 0x3d, 0x5f, 0x87, 0x62, 0xfa, 0x2c, 0xe0, 0x3f,
0x4d, 0x06, 0xd5, 0xc4, 0x7a, 0xfe, 0xab, 0x8a, 0xe5, 0xaa, 0xc5, 0x74, 0xd5, 0x19, 0xd4, 0xb2,
0x86, 0xf5, 0xff, 0x2d, 0x7d, 0x04, 0x90, 0x5a, 0x4b, 0xce, 0xad, 0xf4, 0x54, 0xbd, 0x95, 0x78,
0x83, 0xa3, 0xb7, 0x97, 0x15, 0xbf, 0xbd, 0xac, 0x1f, 0xf8, 0xac, 0xbc, 0xad, 0xcc, 0x06, 0xac,
0xaa, 0x46, 0x73, 0x53, 0xcf, 0x3c, 0x05, 0x5d, 0x35, 0x8c, 0x97, 0xb0, 0x16, 0x7f, 0xda, 0x47,
0xce, 0x64, 0x14, 0xbf, 0x31, 0x1e, 0xcc, 0x15, 0x84, 0x15, 0x0c, 0xce, 0x32, 0xcc, 0x4f, 0xa0,
0x36, 0xe7, 0x19, 0x75, 0x80, 0x18, 0x22, 0xda, 0xc7, 0x8b, 0x55, 0x46, 0xcc, 0x5d, 0x58, 0x55,
0x7d, 0x0c, 0x6d, 0x43, 0x25, 0x9e, 0x95, 0x65, 0x6e, 0x2c, 0x58, 0x1f, 0x27, 0x40, 0xf3, 0xf7,
0x22, 0xdc, 0x99, 0xf3, 0x9b, 0x9c, 0xf6, 0x3d, 0x83, 0xf2, 0x85, 0x17, 0x8c, 0x09, 0x5b, 0xb0,
0x53, 0xb1, 0xc0, 0x81, 0x00, 0x75, 0x0b, 0x58, 0xc2, 0xd1, 0x3d, 0x28, 0x4d, 0xc8, 0x38, 0xba,
0x5e, 0xab, 0xdd, 0x02, 0x16, 0x11, 0x7a, 0xc1, 0xcd, 0xfe, 0x82, 0x4c, 0x5d, 0x26, 0xda, 0x2e,
0x6f, 0xcf, 0x05, 0x9b, 0x12, 0xd9, 0x7c, 0x8a, 0x46, 0x27, 0xa0, 0xa7, 0xb6, 0x13, 0xca, 0xab,
0xf3, 0xe3, 0x5b, 0x4c, 0x54, 0x71, 0xaf, 0x90, 0x5b, 0x8e, 0xa2, 0x80, 0xee, 0xc3, 0xf2, 0x78,
0xea, 0x32, 0xc7, 0x28, 0x37, 0xb4, 0x66, 0xa5, 0x5b, 0xc0, 0x51, 0x88, 0x0e, 0x00, 0x42, 0xea,
0xd2, 0x3e, 0xdb, 0x73, 0xfa, 0x4c, 0x3c, 0x30, 0xf5, 0xf6, 0xd6, 0x6d, 0xeb, 0x70, 0x2c, 0xbf,
0xdb, 0x52, 0xa6, 0xf9, 0x1c, 0x4a, 0xfc, 0x7f, 0xd4, 0x86, 0x92, 0xcd, 0x95, 0xa2, 0x8f, 0xbc,
0xbe, 0xa0, 0x87, 0xd6, 0x89, 0x2f, 0xf6, 0x48, 0x60, 0xcd, 0x16, 0xe8, 0x4a, 0xe6, 0xa8, 0x91,
0xad, 0x5d, 0xfe, 0x25, 0xa0, 0x0c, 0xa5, 0xc6, 0xf7, 0x44, 0xd9, 0xd8, 0xd4, 0x28, 0xe6, 0xce,
0xf1, 0x23, 0x58, 0xcb, 0x5c, 0x10, 0x1c, 0x32, 0x0d, 0xdc, 0x18, 0x32, 0x0d, 0x5c, 0x73, 0x0b,
0xd6, 0xe7, 0x9d, 0x3f, 0x07, 0x75, 0x02, 0xba, 0x62, 0xea, 0xfc, 0xc1, 0xe9, 0x13, 0x36, 0x94,
0x09, 0x8a, 0xdf, 0xef, 0xf8, 0x0d, 0x3e, 0x81, 0xb5, 0x8c, 0xc5, 0xe7, 0x49, 0x76, 0x36, 0x7f,
0xbb, 0xaa, 0x6b, 0x6f, 0xae, 0xea, 0xda, 0x9f, 0x57, 0x75, 0xed, 0xe7, 0xeb, 0x7a, 0xe1, 0xcd,
0x75, 0xbd, 0xf0, 0xc7, 0x75, 0xbd, 0xf0, 0xe3, 0x92, 0xdf, 0xeb, 0x95, 0x85, 0xf2, 0xf6, 0x3f,
0x01, 0x00, 0x00, 0xff, 0xff, 0x24, 0xfa, 0xc4, 0xf2, 0xc9, 0x0d, 0x00, 0x00,
0x59, 0xc5, 0x7a, 0x3c, 0x77, 0x68, 0x87, 0xa8, 0x09, 0xeb, 0x2e, 0x09, 0xd9, 0x79, 0x38, 0x21,
0x7e, 0x38, 0xf4, 0xd8, 0xb9, 0x63, 0x1b, 0x4b, 0x0d, 0xad, 0x59, 0xc5, 0x35, 0x3e, 0x7f, 0x26,
0xa7, 0x0f, 0x6d, 0xf4, 0x09, 0xdc, 0x4d, 0xc4, 0xc6, 0x94, 0x11, 0xa1, 0xb8, 0x2c, 0x14, 0xef,
0xc4, 0x0b, 0xc7, 0x94, 0x11, 0xae, 0xfa, 0x19, 0xac, 0xf4, 0xbd, 0x09, 0xa3, 0x13, 0x66, 0x14,
0x1b, 0xc5, 0xa6, 0xde, 0xde, 0xb0, 0x64, 0xea, 0x56, 0x14, 0x9a, 0xb5, 0x1b, 0x2d, 0xe3, 0x18,
0x87, 0x3e, 0x87, 0x4a, 0x1c, 0x83, 0x51, 0x6a, 0x68, 0x4d, 0xbd, 0x6d, 0xcc, 0x73, 0xe2, 0x60,
0x70, 0x82, 0xe4, 0xac, 0x0b, 0xc7, 0xa5, 0xaf, 0xe8, 0x2c, 0x34, 0xca, 0x62, 0xa7, 0x1b, 0xac,
0x03, 0xb9, 0x8e, 0x13, 0x24, 0xda, 0x84, 0x2a, 0x73, 0xc6, 0x34, 0x64, 0x64, 0xec, 0x1b, 0x2b,
0x0d, 0xad, 0x59, 0xc4, 0xe9, 0x84, 0xf9, 0xb7, 0x06, 0x95, 0x78, 0x2b, 0xd4, 0x81, 0x8a, 0xeb,
0x0d, 0xba, 0x94, 0xc8, 0xf2, 0xe9, 0xed, 0x8f, 0x17, 0x85, 0x65, 0x1d, 0x49, 0xe0, 0xfe, 0x84,
0x05, 0x33, 0x9c, 0xf0, 0xd0, 0x0e, 0x94, 0x6c, 0xc2, 0x88, 0xa8, 0xab, 0xde, 0xfe, 0x28, 0xe1,
0x8b, 0xc3, 0xb6, 0xce, 0xc6, 0x24, 0x60, 0x1d, 0xd7, 0xeb, 0x8f, 0x62, 0xa1, 0x0e, 0x09, 0x29,
0x16, 0x94, 0x4c, 0x7e, 0xc5, 0x7f, 0x9b, 0x9f, 0xf9, 0x15, 0xac, 0x65, 0x62, 0x41, 0xeb, 0x50,
0x1c, 0xd1, 0x99, 0xa1, 0x89, 0x83, 0xe5, 0x3f, 0xd1, 0x3d, 0x58, 0xbe, 0x24, 0xee, 0x94, 0xca,
0xc3, 0x8e, 0x06, 0xcf, 0x97, 0xbe, 0xd4, 0xcc, 0x9f, 0x34, 0xa8, 0xc4, 0x9a, 0x08, 0x41, 0x69,
0x48, 0xc2, 0xa1, 0x64, 0x8a, 0xdf, 0xe8, 0x0b, 0x28, 0x8d, 0x78, 0x3c, 0x4b, 0x22, 0x9e, 0xc7,
0x8b, 0xe2, 0xb1, 0xf8, 0x9f, 0xa8, 0x14, 0x02, 0x6f, 0x3e, 0x83, 0x6a, 0x32, 0xf5, 0x5e, 0x11,
0xfd, 0x55, 0x81, 0x15, 0xd9, 0x2f, 0xe8, 0x1b, 0xd0, 0x7b, 0xbc, 0x56, 0xbb, 0x01, 0x25, 0x8c,
0x0a, 0xbe, 0xde, 0x7e, 0x30, 0x1f, 0x43, 0x27, 0x85, 0x74, 0x0b, 0x58, 0x65, 0x24, 0x02, 0xaf,
0x7d, 0x9b, 0x0b, 0x2c, 0xbd, 0x43, 0x20, 0x82, 0x24, 0x02, 0xd1, 0x30, 0x11, 0xc0, 0x74, 0xec,
0x5d, 0x52, 0xa3, 0xf8, 0x0e, 0x81, 0x08, 0x92, 0x08, 0x44, 0x43, 0xb4, 0x03, 0x55, 0x31, 0x3c,
0xe6, 0xf4, 0xa8, 0xd5, 0x3f, 0xc8, 0xa5, 0x1f, 0x47, 0xe4, 0x14, 0x8d, 0xba, 0x50, 0x13, 0x83,
0xbd, 0xa9, 0xef, 0x3a, 0x7d, 0x1e, 0xff, 0xb2, 0xe0, 0xd7, 0x73, 0xf9, 0x09, 0xaa, 0x5b, 0xc0,
0x73, 0x3c, 0x9e, 0x45, 0x40, 0x5d, 0xc2, 0x1c, 0x6f, 0xf2, 0xd2, 0xb6, 0x8d, 0x76, 0x7e, 0x16,
0x38, 0x85, 0xf0, 0x2c, 0x14, 0x06, 0x0f, 0x25, 0x1e, 0xca, 0x4a, 0x6c, 0xe7, 0x87, 0x82, 0x33,
0x28, 0x1e, 0x4a, 0x96, 0x87, 0x5e, 0x00, 0xd8, 0x94, 0x11, 0xc7, 0x0d, 0xcf, 0x28, 0x33, 0x6c,
0xa1, 0x62, 0xce, 0xab, 0xec, 0x25, 0x88, 0x6e, 0x01, 0x2b, 0x78, 0xd4, 0x81, 0x55, 0x39, 0x7a,
0x3d, 0x09, 0x29, 0x33, 0xa8, 0xe0, 0x6f, 0x2e, 0xe0, 0x0b, 0x4c, 0xb7, 0x80, 0x33, 0x1c, 0xf4,
0x2d, 0xdc, 0xf1, 0x5c, 0xfb, 0x5c, 0x2d, 0xc8, 0x45, 0xbe, 0xcc, 0x79, 0xb6, 0x22, 0x35, 0xcf,
0xb5, 0x95, 0x19, 0x74, 0x0a, 0x48, 0x15, 0x92, 0x85, 0x19, 0x08, 0xad, 0x87, 0x0b, 0xb5, 0x92,
0xca, 0xdc, 0x55, 0xe4, 0x64, 0x71, 0xe6, 0x14, 0x65, 0xd7, 0x0e, 0x6f, 0x51, 0x4c, 0x3a, 0x57,
0x55, 0x94, 0xfd, 0xbb, 0x0f, 0x6b, 0x5e, 0xef, 0x0d, 0xed, 0xb3, 0xef, 0x67, 0x3e, 0xe5, 0xa9,
0x3a, 0x42, 0xec, 0xc3, 0x79, 0xb1, 0x13, 0x15, 0xd4, 0x2d, 0xe0, 0x2c, 0x0b, 0x7d, 0x07, 0xeb,
0xe9, 0x84, 0x4c, 0xf4, 0x8d, 0x50, 0x6a, 0x2c, 0x56, 0x4a, 0x32, 0xbd, 0xc1, 0xe5, 0x0d, 0x19,
0x32, 0x2f, 0xe0, 0xd6, 0xc1, 0xdb, 0x60, 0x94, 0xdf, 0x90, 0x67, 0x29, 0x84, 0x37, 0xa4, 0xc2,
0xe0, 0x79, 0xc5, 0xc3, 0xa8, 0x13, 0xdc, 0xfc, 0xbc, 0xce, 0x54, 0x10, 0xcf, 0x2b, 0xc3, 0xea,
0xac, 0x48, 0x1b, 0x32, 0x7f, 0xd1, 0x40, 0x57, 0x7c, 0x04, 0x99, 0x50, 0x61, 0x24, 0x18, 0x50,
0x76, 0x68, 0x4b, 0xdb, 0x4a, 0xc6, 0x68, 0x07, 0x2a, 0xbe, 0x17, 0x3a, 0xbc, 0xca, 0xc2, 0x51,
0x6a, 0xca, 0xb6, 0x91, 0xcb, 0x0b, 0x25, 0xeb, 0x54, 0x82, 0x70, 0x02, 0x47, 0x4f, 0xa1, 0x2c,
0x3e, 0xcd, 0xd8, 0xdf, 0xef, 0xe5, 0x11, 0xb1, 0xc4, 0x98, 0x5f, 0xcb, 0x98, 0xe4, 0x59, 0x5a,
0x50, 0x8e, 0x5e, 0x06, 0xd2, 0x8c, 0xef, 0x27, 0xe4, 0x7d, 0x3e, 0x6d, 0x1d, 0xd3, 0x30, 0x24,
0x03, 0x8a, 0x25, 0xca, 0x7c, 0x28, 0xe9, 0xb2, 0xe6, 0xeb, 0x50, 0x4c, 0x9f, 0x05, 0xfc, 0xa7,
0xc9, 0xa0, 0x9a, 0x58, 0xcf, 0x7f, 0x95, 0xb1, 0xdc, 0xb5, 0x98, 0xee, 0x3a, 0x83, 0x5a, 0xd6,
0xb0, 0xfe, 0xbf, 0xad, 0x8f, 0x00, 0x52, 0x6b, 0xc9, 0xb9, 0x95, 0x9e, 0xaa, 0xb7, 0x12, 0x2f,
0x70, 0xf4, 0xf6, 0xb2, 0xe2, 0xb7, 0x97, 0xf5, 0x03, 0x5f, 0x95, 0xb7, 0x95, 0xd9, 0x80, 0x55,
0xd5, 0x68, 0x6e, 0xea, 0x99, 0xa7, 0xa0, 0xab, 0x86, 0xf1, 0x12, 0xd6, 0xe2, 0x4f, 0xfb, 0xc8,
0x99, 0x8c, 0xe2, 0x37, 0xc6, 0x83, 0xb9, 0x84, 0xb0, 0x82, 0xc1, 0x59, 0x86, 0xd9, 0x86, 0xda,
0x9c, 0x67, 0x34, 0x52, 0x6f, 0x7f, 0x25, 0x76, 0x17, 0xaf, 0x3e, 0x65, 0xca, 0xdc, 0x85, 0x55,
0xd5, 0xc9, 0xd0, 0x36, 0x54, 0xe2, 0x65, 0x99, 0xe8, 0xc6, 0x82, 0x08, 0x70, 0x02, 0x34, 0x7f,
0x2f, 0xc2, 0x9d, 0x39, 0xc7, 0xc9, 0x29, 0xe0, 0x33, 0x28, 0x5f, 0x78, 0xc1, 0x98, 0xb0, 0x05,
0x67, 0x15, 0x0b, 0x1c, 0x08, 0x50, 0xb7, 0x80, 0x25, 0x1c, 0xdd, 0x83, 0xd2, 0x84, 0x8c, 0xa3,
0x0b, 0xb6, 0xda, 0x2d, 0x60, 0x31, 0x42, 0x2f, 0xb8, 0xdd, 0x5f, 0x90, 0xa9, 0xcb, 0x44, 0xe1,
0xe5, 0xfd, 0xb9, 0xe0, 0x58, 0x22, 0xa3, 0x4f, 0xd1, 0xe8, 0x04, 0xf4, 0xd4, 0x78, 0x42, 0x79,
0x79, 0x7e, 0x7a, 0x8b, 0x8d, 0x2a, 0xfe, 0x15, 0x72, 0xd3, 0x51, 0x14, 0xd0, 0x7d, 0x58, 0x1e,
0x4f, 0x5d, 0xe6, 0x18, 0xe5, 0x86, 0xd6, 0xac, 0x74, 0x0b, 0x38, 0x1a, 0xa2, 0x03, 0x80, 0x90,
0xba, 0xb4, 0xcf, 0xf6, 0x9c, 0x3e, 0x13, 0x4f, 0x4c, 0xbd, 0xbd, 0x75, 0xdb, 0x3e, 0x1c, 0xcb,
0x6f, 0xb7, 0x94, 0x69, 0x3e, 0x87, 0x12, 0xff, 0x8f, 0xda, 0x50, 0xb2, 0xb9, 0x52, 0xf4, 0x99,
0xd7, 0x17, 0xd4, 0xd0, 0x3a, 0xf1, 0xc5, 0x19, 0x09, 0xac, 0xd9, 0x02, 0x5d, 0x89, 0x9c, 0x77,
0x85, 0x9a, 0xbb, 0xec, 0x0a, 0x65, 0x2a, 0xb5, 0xbe, 0x27, 0xca, 0xc1, 0xa6, 0x56, 0x31, 0xd7,
0xc9, 0x8f, 0x60, 0x2d, 0x73, 0x45, 0x70, 0xc8, 0x34, 0x70, 0x63, 0xc8, 0x34, 0x70, 0xcd, 0x2d,
0x58, 0x9f, 0xf7, 0xfe, 0x1c, 0xd4, 0x09, 0xe8, 0x8a, 0xad, 0xf3, 0x27, 0xa7, 0x4f, 0xd8, 0x50,
0x06, 0x28, 0x7e, 0xbf, 0xe7, 0x57, 0xf8, 0x04, 0xd6, 0x32, 0x26, 0x9f, 0x27, 0xd9, 0xd9, 0xfc,
0xed, 0xaa, 0xae, 0xbd, 0xbd, 0xaa, 0x6b, 0x7f, 0x5e, 0xd5, 0xb5, 0x9f, 0xaf, 0xeb, 0x85, 0xb7,
0xd7, 0xf5, 0xc2, 0x1f, 0xd7, 0xf5, 0xc2, 0x8f, 0x4b, 0x7e, 0xaf, 0x57, 0x16, 0xca, 0xdb, 0xff,
0x04, 0x00, 0x00, 0xff, 0xff, 0x46, 0x3d, 0xb8, 0x26, 0xcb, 0x0d, 0x00, 0x00,
}
func (m *Change) Marshal() (dAtA []byte, err error) {
@ -2508,11 +2508,11 @@ func (m *ChangeRelationRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.RelationId) > 0 {
for iNdEx := len(m.RelationId) - 1; iNdEx >= 0; iNdEx-- {
i -= len(m.RelationId[iNdEx])
copy(dAtA[i:], m.RelationId[iNdEx])
i = encodeVarintChanges(dAtA, i, uint64(len(m.RelationId[iNdEx])))
if len(m.RelationKey) > 0 {
for iNdEx := len(m.RelationKey) - 1; iNdEx >= 0; iNdEx-- {
i -= len(m.RelationKey[iNdEx])
copy(dAtA[i:], m.RelationKey[iNdEx])
i = encodeVarintChanges(dAtA, i, uint64(len(m.RelationKey[iNdEx])))
i--
dAtA[i] = 0xa
}
@ -3389,8 +3389,8 @@ func (m *ChangeRelationRemove) Size() (n int) {
}
var l int
_ = l
if len(m.RelationId) > 0 {
for _, s := range m.RelationId {
if len(m.RelationKey) > 0 {
for _, s := range m.RelationKey {
l = len(s)
n += 1 + l + sovChanges(uint64(l))
}
@ -5817,7 +5817,7 @@ func (m *ChangeRelationRemove) Unmarshal(dAtA []byte) error {
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field RelationId", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field RelationKey", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@ -5845,7 +5845,7 @@ func (m *ChangeRelationRemove) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.RelationId = append(m.RelationId, string(dAtA[iNdEx:postIndex]))
m.RelationKey = append(m.RelationKey, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default:
iNdEx = preIndex

File diff suppressed because it is too large Load diff

View file

@ -102,7 +102,7 @@ message Change {
}
message RelationRemove {
repeated string relationId = 1;
repeated string relationKey = 1;
}
message _RelationAdd {

View file

@ -1657,7 +1657,7 @@ message Rpc {
message Add {
message Request {
string contextId = 1;
repeated string relationIds = 2;
repeated string relationKeys = 2;
}
message Response {
@ -1680,7 +1680,7 @@ message Rpc {
message Delete {
message Request {
string contextId = 1;
string relationId = 2;
string relationKey = 2;
}
message Response {
@ -1773,7 +1773,7 @@ message Rpc {
message Add {
message Request {
string objectTypeUrl = 1;
repeated string relationIds = 2;
repeated string relationKeys = 2;
}
message Response {
@ -1798,7 +1798,7 @@ message Rpc {
message Remove {
message Request {
string objectTypeUrl = 1;
string relationId = 2;
string relationKey = 2;
}
message Response {
@ -3900,7 +3900,7 @@ message Rpc {
message Request {
string contextId = 1;
string blockId = 2;
string relationId = 3;
string relationKey = 3;
}
message Response {
@ -4132,7 +4132,7 @@ message Rpc {
message Request {
string contextId = 1;
string blockId = 2; // id of dataview block to add relation
repeated string relationIds = 3;
repeated string relationKeys = 3;
}
message Response {
@ -4156,7 +4156,7 @@ message Rpc {
message Request {
string contextId = 1;
string blockId = 2; // id of dataview block to add relation
repeated string relationIds = 3;
repeated string relationKeys = 3;
}
message Response {

View file

@ -404,7 +404,7 @@ var (
Name: "Relation",
Readonly: true,
Relations: []*model.Relation{relations[RelationKeyId], relations[RelationKeyName], relations[RelationKeyLayout], relations[RelationKeyDescription], relations[RelationKeyCreator], relations[RelationKeyLayoutAlign], relations[RelationKeyIsHidden], relations[RelationKeyIsDraft], relations[RelationKeyWorkspaceId], relations[RelationKeyInternalFlags], relations[RelationKeyMpAddedToLibrary], relations[RelationKeyRelationFormat], relations[RelationKeyRelationMaxCount], relations[RelationKeyRelationDefaultValue], relations[RelationKeyRelationFormatObjectTypes]},
Types: []model.SmartBlockType{model.SmartBlockType_IndexedRelation, model.SmartBlockType_BundledRelation},
Types: []model.SmartBlockType{model.SmartBlockType_SubObjectRelation},
Url: TypePrefix + "relation",
},
TypeKeyRelationOption: {
@ -416,7 +416,7 @@ var (
Name: "Relation option",
Readonly: true,
Relations: []*model.Relation{relations[RelationKeyId], relations[RelationKeyName], relations[RelationKeyDescription], relations[RelationKeyType], relations[RelationKeyCreator], relations[RelationKeyCreatedDate], relations[RelationKeyLayout], relations[RelationKeyLastModifiedBy], relations[RelationKeyIconImage], relations[RelationKeyIconEmoji], relations[RelationKeyCoverId], relations[RelationKeyLastModifiedDate], relations[RelationKeyLastOpenedDate], relations[RelationKeyCoverX], relations[RelationKeyCoverY], relations[RelationKeyCoverScale], relations[RelationKeyFeaturedRelations], relations[RelationKeyCoverType], relations[RelationKeyLayoutAlign], relations[RelationKeyIsHidden], relations[RelationKeyIsArchived], relations[RelationKeyIsFavorite], relations[RelationKeyIsDraft], relations[RelationKeyWorkspaceId], relations[RelationKeyInternalFlags]},
Types: []model.SmartBlockType{model.SmartBlockType_RelationOption},
Types: []model.SmartBlockType{model.SmartBlockType_SubObjectRelationOption},
Url: TypePrefix + "relationOption",
},
TypeKeyResume: {

View file

@ -17,36 +17,42 @@ type SmartBlockType uint64
const (
SmartBlockTypeAccountOld = SmartBlockType(model.SmartBlockType_AccountOld)
SmartBlockTypePage = SmartBlockType(model.SmartBlockType_Page)
SmartBlockTypeProfilePage = SmartBlockType(model.SmartBlockType_ProfilePage)
SmartBlockTypeHome = SmartBlockType(model.SmartBlockType_Home)
SmartBlockTypeArchive = SmartBlockType(model.SmartBlockType_Archive)
SmartBlockTypeDatabase = SmartBlockType(model.SmartBlockType_Database)
SmartBlockTypeSet = SmartBlockType(model.SmartBlockType_Set)
SmartBlockTypeObjectType = SmartBlockType(model.SmartBlockType_STObjectType)
SmartBlockTypeFile = SmartBlockType(model.SmartBlockType_File)
SmartblockTypeMarketplaceType = SmartBlockType(model.SmartBlockType_MarketplaceType)
SmartblockTypeMarketplaceRelation = SmartBlockType(model.SmartBlockType_MarketplaceRelation)
SmartblockTypeMarketplaceTemplate = SmartBlockType(model.SmartBlockType_MarketplaceTemplate)
SmartBlockTypeTemplate = SmartBlockType(model.SmartBlockType_Template)
SmartBlockTypeBundledTemplate = SmartBlockType(model.SmartBlockType_BundledTemplate)
SmartBlockTypeBundledRelation = SmartBlockType(model.SmartBlockType_BundledRelation)
SmartBlockTypeIndexedRelation = SmartBlockType(model.SmartBlockType_IndexedRelation)
SmartBlockTypeBundledObjectType = SmartBlockType(model.SmartBlockType_BundledObjectType)
SmartBlockTypeAnytypeProfile = SmartBlockType(model.SmartBlockType_AnytypeProfile)
SmartBlockTypeDate = SmartBlockType(model.SmartBlockType_Date)
SmartBlockTypeBreadcrumbs = SmartBlockType(model.SmartBlockType_Breadcrumbs)
SmartBlockTypeWorkspaceOld = SmartBlockType(model.SmartBlockType_WorkspaceOld) // deprecated thread-based workspaces
SmartBlockTypeWorkspace = SmartBlockType(model.SmartBlockType_Workspace)
SmartBlockTypePage = SmartBlockType(model.SmartBlockType_Page)
SmartBlockTypeProfilePage = SmartBlockType(model.SmartBlockType_ProfilePage)
SmartBlockTypeHome = SmartBlockType(model.SmartBlockType_Home)
SmartBlockTypeArchive = SmartBlockType(model.SmartBlockType_Archive)
SmartBlockTypeDatabase = SmartBlockType(model.SmartBlockType_Database)
SmartBlockTypeSet = SmartBlockType(model.SmartBlockType_Set)
SmartBlockTypeObjectType = SmartBlockType(model.SmartBlockType_STObjectType)
SmartBlockTypeFile = SmartBlockType(model.SmartBlockType_File)
SmartblockTypeMarketplaceType = SmartBlockType(model.SmartBlockType_MarketplaceType)
SmartblockTypeMarketplaceRelation = SmartBlockType(model.SmartBlockType_MarketplaceRelation)
SmartblockTypeMarketplaceTemplate = SmartBlockType(model.SmartBlockType_MarketplaceTemplate)
SmartBlockTypeTemplate = SmartBlockType(model.SmartBlockType_Template)
SmartBlockTypeBundledTemplate = SmartBlockType(model.SmartBlockType_BundledTemplate)
SmartBlockTypeBundledRelation = SmartBlockType(model.SmartBlockType_BundledRelation)
SmartBlockTypeSubObjectRelation = SmartBlockType(model.SmartBlockType_SubObjectRelation)
SmartBlockTypeSubObjectRelationOption = SmartBlockType(model.SmartBlockType_SubObjectRelationOption)
SmartBlockTypeBundledObjectType = SmartBlockType(model.SmartBlockType_BundledObjectType)
SmartBlockTypeAnytypeProfile = SmartBlockType(model.SmartBlockType_AnytypeProfile)
SmartBlockTypeDate = SmartBlockType(model.SmartBlockType_Date)
SmartBlockTypeBreadcrumbs = SmartBlockType(model.SmartBlockType_Breadcrumbs)
SmartBlockTypeWorkspaceOld = SmartBlockType(model.SmartBlockType_WorkspaceOld) // deprecated thread-based workspaces
SmartBlockTypeWorkspace = SmartBlockType(model.SmartBlockType_Workspace)
)
func SmartBlockTypeFromID(id string) (SmartBlockType, error) {
if strings.HasPrefix(id, addr.BundledRelationURLPrefix) {
return SmartBlockTypeBundledRelation, nil
}
if strings.HasPrefix(id, addr.CustomRelationURLPrefix) {
return SmartBlockTypeIndexedRelation, nil
if strings.HasPrefix(id, addr.RelationKeyToIdPrefix) {
return SmartBlockTypeSubObjectRelation, nil
}
// workaround for options that have no prefix
if bson.IsObjectIdHex(id) {
return SmartBlockTypeSubObjectRelationOption, nil
}
if strings.HasPrefix(id, addr.BundledObjectTypeURLPrefix) {
return SmartBlockTypeBundledObjectType, nil
}
@ -60,9 +66,6 @@ func SmartBlockTypeFromID(id string) (SmartBlockType, error) {
}
return SmartBlockType(sbt), nil
}
if bson.IsObjectIdHex(id) {
return SmartBlockTypePage, nil
}
if strings.HasPrefix(id, addr.DatePrefix) {
return SmartBlockTypeDate, nil
}

View file

@ -7,6 +7,8 @@ import (
)
const (
RelationKeyToIdPrefix = ":rel:"
BundledRelationURLPrefix = "_br"
BundledObjectTypeURLPrefix = "_ot"
CustomRelationURLPrefix = "_ir"

View file

@ -26,29 +26,29 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
type SmartBlockType int32
const (
SmartBlockType_AccountOld SmartBlockType = 0
SmartBlockType_Breadcrumbs SmartBlockType = 1
SmartBlockType_Page SmartBlockType = 16
SmartBlockType_ProfilePage SmartBlockType = 17
SmartBlockType_Home SmartBlockType = 32
SmartBlockType_Archive SmartBlockType = 48
SmartBlockType_Database SmartBlockType = 64
SmartBlockType_Set SmartBlockType = 65
SmartBlockType_STObjectType SmartBlockType = 96
SmartBlockType_File SmartBlockType = 256
SmartBlockType_Template SmartBlockType = 288
SmartBlockType_BundledTemplate SmartBlockType = 289
SmartBlockType_MarketplaceType SmartBlockType = 272
SmartBlockType_MarketplaceRelation SmartBlockType = 273
SmartBlockType_MarketplaceTemplate SmartBlockType = 274
SmartBlockType_BundledRelation SmartBlockType = 512
SmartBlockType_IndexedRelation SmartBlockType = 513
SmartBlockType_BundledObjectType SmartBlockType = 514
SmartBlockType_AnytypeProfile SmartBlockType = 515
SmartBlockType_Date SmartBlockType = 516
SmartBlockType_WorkspaceOld SmartBlockType = 517
SmartBlockType_Workspace SmartBlockType = 518
SmartBlockType_RelationOption SmartBlockType = 519
SmartBlockType_AccountOld SmartBlockType = 0
SmartBlockType_Breadcrumbs SmartBlockType = 1
SmartBlockType_Page SmartBlockType = 16
SmartBlockType_ProfilePage SmartBlockType = 17
SmartBlockType_Home SmartBlockType = 32
SmartBlockType_Archive SmartBlockType = 48
SmartBlockType_Database SmartBlockType = 64
SmartBlockType_Set SmartBlockType = 65
SmartBlockType_STObjectType SmartBlockType = 96
SmartBlockType_File SmartBlockType = 256
SmartBlockType_Template SmartBlockType = 288
SmartBlockType_BundledTemplate SmartBlockType = 289
SmartBlockType_MarketplaceType SmartBlockType = 272
SmartBlockType_MarketplaceRelation SmartBlockType = 273
SmartBlockType_MarketplaceTemplate SmartBlockType = 274
SmartBlockType_BundledRelation SmartBlockType = 512
SmartBlockType_SubObjectRelation SmartBlockType = 513
SmartBlockType_BundledObjectType SmartBlockType = 514
SmartBlockType_AnytypeProfile SmartBlockType = 515
SmartBlockType_Date SmartBlockType = 516
SmartBlockType_WorkspaceOld SmartBlockType = 517
SmartBlockType_Workspace SmartBlockType = 518
SmartBlockType_SubObjectRelationOption SmartBlockType = 519
)
var SmartBlockType_name = map[int32]string{
@ -68,39 +68,39 @@ var SmartBlockType_name = map[int32]string{
273: "MarketplaceRelation",
274: "MarketplaceTemplate",
512: "BundledRelation",
513: "IndexedRelation",
513: "SubObjectRelation",
514: "BundledObjectType",
515: "AnytypeProfile",
516: "Date",
517: "WorkspaceOld",
518: "Workspace",
519: "RelationOption",
519: "SubObjectRelationOption",
}
var SmartBlockType_value = map[string]int32{
"AccountOld": 0,
"Breadcrumbs": 1,
"Page": 16,
"ProfilePage": 17,
"Home": 32,
"Archive": 48,
"Database": 64,
"Set": 65,
"STObjectType": 96,
"File": 256,
"Template": 288,
"BundledTemplate": 289,
"MarketplaceType": 272,
"MarketplaceRelation": 273,
"MarketplaceTemplate": 274,
"BundledRelation": 512,
"IndexedRelation": 513,
"BundledObjectType": 514,
"AnytypeProfile": 515,
"Date": 516,
"WorkspaceOld": 517,
"Workspace": 518,
"RelationOption": 519,
"AccountOld": 0,
"Breadcrumbs": 1,
"Page": 16,
"ProfilePage": 17,
"Home": 32,
"Archive": 48,
"Database": 64,
"Set": 65,
"STObjectType": 96,
"File": 256,
"Template": 288,
"BundledTemplate": 289,
"MarketplaceType": 272,
"MarketplaceRelation": 273,
"MarketplaceTemplate": 274,
"BundledRelation": 512,
"SubObjectRelation": 513,
"BundledObjectType": 514,
"AnytypeProfile": 515,
"Date": 516,
"WorkspaceOld": 517,
"Workspace": 518,
"SubObjectRelationOption": 519,
}
func (x SmartBlockType) String() string {
@ -5002,8 +5002,8 @@ func (m *RelationOption) GetScope() RelationOptionScope {
}
type RelationLink struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Format RelationFormat `protobuf:"varint,2,opt,name=format,proto3,enum=anytype.model.RelationFormat" json:"format,omitempty"`
}
func (m *RelationLink) Reset() { *m = RelationLink{} }
@ -5039,13 +5039,6 @@ func (m *RelationLink) XXX_DiscardUnknown() {
var xxx_messageInfo_RelationLink proto.InternalMessageInfo
func (m *RelationLink) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *RelationLink) GetKey() string {
if m != nil {
return m.Key
@ -5053,6 +5046,13 @@ func (m *RelationLink) GetKey() string {
return ""
}
func (m *RelationLink) GetFormat() RelationFormat {
if m != nil {
return m.Format
}
return RelationFormat_longtext
}
type Relations struct {
Relations []*Relation `protobuf:"bytes,1,rep,name=relations,proto3" json:"relations,omitempty"`
}
@ -5553,322 +5553,322 @@ func init() {
}
var fileDescriptor_98a910b73321e591 = []byte{
// 5031 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x3b, 0x4b, 0x8c, 0x24, 0x57,
0x52, 0xf5, 0xff, 0x44, 0x75, 0xf7, 0xbc, 0x7e, 0xd3, 0x9e, 0x29, 0x72, 0xbc, 0xc3, 0x6c, 0xe2,
0x9d, 0x9d, 0x1d, 0x7b, 0x7b, 0xc6, 0x33, 0x9e, 0xf5, 0x07, 0xec, 0x71, 0x7f, 0x66, 0xdc, 0xad,
0xf9, 0x74, 0x3b, 0xab, 0xa7, 0xcd, 0x5a, 0x80, 0x9c, 0x55, 0xf9, 0xba, 0x2a, 0xdd, 0x59, 0xf9,
0xca, 0x99, 0xaf, 0x7a, 0xba, 0x57, 0x42, 0x5a, 0x3e, 0x0b, 0x17, 0x24, 0xcc, 0x4a, 0x88, 0x13,
0x62, 0xe1, 0xc2, 0x65, 0xaf, 0x88, 0x8f, 0x90, 0x40, 0x9c, 0x90, 0x90, 0x90, 0x11, 0x17, 0x04,
0x07, 0x90, 0x7d, 0xe4, 0xc6, 0x99, 0x03, 0x8a, 0x78, 0x2f, 0xb3, 0xb2, 0x3e, 0xdd, 0x5d, 0x63,
0xf6, 0x54, 0x19, 0x91, 0x11, 0x91, 0xf1, 0xde, 0x8b, 0x88, 0x17, 0x11, 0xef, 0x15, 0xbc, 0x32,
0x38, 0xec, 0xde, 0x0a, 0xfc, 0xf6, 0xad, 0x41, 0xfb, 0x56, 0x5f, 0x7a, 0x22, 0xb8, 0x35, 0x88,
// 5032 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x3b, 0x5b, 0x8c, 0x24, 0x47,
0x52, 0xfd, 0x7e, 0x44, 0xcf, 0xcc, 0xe6, 0xe4, 0x8e, 0x77, 0x9b, 0xda, 0xbd, 0x65, 0xaf, 0xf0,
0xed, 0xed, 0xad, 0x7d, 0xb3, 0xf6, 0xae, 0xf7, 0xfc, 0x00, 0x7b, 0x3d, 0x8f, 0x5d, 0xcf, 0x68,
0x1f, 0x33, 0xae, 0x9e, 0x1d, 0x73, 0x16, 0x20, 0x57, 0x77, 0xe5, 0x74, 0x97, 0xa7, 0xba, 0xb2,
0x5d, 0x95, 0x3d, 0x3b, 0x73, 0x12, 0xd2, 0xf1, 0x38, 0xf8, 0x41, 0xc2, 0x9c, 0x84, 0xf8, 0x42,
0x1c, 0x5f, 0xfc, 0x1c, 0x9f, 0x88, 0x87, 0x90, 0x40, 0x7c, 0x21, 0x21, 0x21, 0x23, 0x7e, 0x10,
0x7c, 0x80, 0xec, 0x4f, 0xfe, 0xf8, 0xe6, 0x03, 0x45, 0x64, 0x56, 0x75, 0xf5, 0x63, 0x66, 0x7a,
0xcd, 0x7d, 0x75, 0x45, 0x64, 0x44, 0x64, 0x64, 0x66, 0x64, 0x64, 0x44, 0x64, 0x36, 0xbc, 0x3c,
0x38, 0xec, 0xde, 0x0e, 0xfc, 0xf6, 0xed, 0x41, 0xfb, 0x76, 0x5f, 0x7a, 0x22, 0xb8, 0x3d, 0x88,
0xa4, 0x92, 0xb1, 0x06, 0xe2, 0x55, 0x82, 0xf8, 0xa2, 0x1b, 0x9e, 0xa8, 0x93, 0x81, 0x58, 0x25,
0xac, 0xf5, 0x72, 0x57, 0xca, 0x6e, 0x20, 0x34, 0x69, 0x7b, 0x78, 0x70, 0x2b, 0x56, 0xd1, 0xb0,
0xa3, 0x34, 0xb1, 0xfd, 0xfb, 0x45, 0xb8, 0xd4, 0xea, 0xbb, 0x91, 0x5a, 0x0f, 0x64, 0xe7, 0xb0,
0x15, 0xba, 0x83, 0xb8, 0x27, 0xd5, 0xba, 0x1b, 0x0b, 0xfe, 0x1a, 0x54, 0xda, 0x88, 0x8c, 0x9b,
0xf9, 0x6b, 0xc5, 0x1b, 0x8d, 0x3b, 0x2b, 0xab, 0x63, 0x82, 0x57, 0x89, 0xc3, 0x31, 0x34, 0xfc,
0x75, 0xa8, 0x7a, 0x42, 0xb9, 0x7e, 0x10, 0x37, 0x0b, 0xd7, 0xf2, 0x37, 0x1a, 0x77, 0x2e, 0xaf,
0xea, 0x0f, 0xaf, 0x26, 0x1f, 0x5e, 0x6d, 0xd1, 0x87, 0x9d, 0x84, 0x8e, 0xdf, 0x85, 0xda, 0x81,
0x1f, 0x88, 0x47, 0xe2, 0x24, 0x6e, 0x16, 0xcf, 0xe6, 0x49, 0x09, 0xf9, 0x7d, 0x58, 0x12, 0xc7,
0x2a, 0x72, 0x1d, 0x11, 0xb8, 0xca, 0x97, 0x61, 0xdc, 0x2c, 0x91, 0x76, 0x97, 0x27, 0xb4, 0x4b,
0xde, 0x3b, 0x13, 0xe4, 0xfc, 0x1a, 0x34, 0x64, 0xfb, 0x53, 0xd1, 0x51, 0x7b, 0x27, 0x03, 0x11,
0x37, 0xcb, 0xd7, 0x8a, 0x37, 0xea, 0x4e, 0x16, 0xc5, 0xdf, 0x86, 0x46, 0x47, 0x06, 0x81, 0xe8,
0x68, 0xf9, 0x95, 0xb3, 0x55, 0xcb, 0xd2, 0xf2, 0x35, 0x58, 0x8c, 0xcc, 0x97, 0x1e, 0xfb, 0xe1,
0x61, 0xdc, 0xac, 0x92, 0x72, 0x57, 0x4e, 0x51, 0x0e, 0x69, 0x9c, 0x71, 0x0e, 0xfb, 0x4f, 0xde,
0x83, 0x32, 0x4d, 0x2d, 0x5f, 0x82, 0x82, 0xef, 0x35, 0xf3, 0xd7, 0xf2, 0x37, 0xea, 0x4e, 0xc1,
0xf7, 0xf8, 0x2d, 0xa8, 0x1c, 0xf8, 0x22, 0xf0, 0xce, 0x9d, 0x61, 0x43, 0xc6, 0x1f, 0xc0, 0x42,
0x24, 0x62, 0x15, 0xf9, 0x66, 0x24, 0x7a, 0x92, 0xbf, 0x39, 0x6b, 0x1d, 0x57, 0x9d, 0x0c, 0xa1,
0x33, 0xc6, 0x86, 0x33, 0xd6, 0xe9, 0xf9, 0x81, 0x17, 0x89, 0x70, 0xdb, 0xd3, 0xf3, 0x5d, 0x77,
0xb2, 0x28, 0x7e, 0x03, 0x2e, 0xb4, 0xdd, 0xce, 0x61, 0x37, 0x92, 0xc3, 0xd0, 0xdb, 0x90, 0x81,
0x8c, 0x9a, 0x65, 0x52, 0x7b, 0x12, 0xcd, 0x6f, 0x43, 0xd9, 0x0d, 0xfc, 0x6e, 0x48, 0xb3, 0xba,
0x74, 0xc7, 0x9a, 0xa9, 0xcb, 0x1a, 0x52, 0x38, 0x9a, 0x90, 0x6f, 0xc1, 0xe2, 0x91, 0x88, 0x94,
0xdf, 0x71, 0x03, 0xc2, 0x37, 0xab, 0xc4, 0x69, 0xcf, 0xe4, 0xdc, 0xcf, 0x52, 0x3a, 0xe3, 0x8c,
0x7c, 0x1b, 0x20, 0x46, 0x53, 0x27, 0x8b, 0x6d, 0x36, 0x68, 0x32, 0xbe, 0x3d, 0x53, 0xcc, 0x86,
0x0c, 0x95, 0x08, 0xd5, 0x6a, 0x2b, 0x25, 0xdf, 0xca, 0x39, 0x19, 0x66, 0xfe, 0x26, 0x94, 0x94,
0x38, 0x56, 0xcd, 0xa5, 0x33, 0x66, 0x34, 0x11, 0xb2, 0x27, 0x8e, 0xd5, 0x56, 0xce, 0x21, 0x06,
0x64, 0x44, 0x53, 0x6e, 0x5e, 0x98, 0x83, 0xf1, 0xa1, 0x1f, 0x08, 0x64, 0x44, 0x06, 0xfe, 0x2e,
0x54, 0x02, 0xf7, 0x44, 0x0e, 0x55, 0x93, 0x11, 0xeb, 0x2f, 0x9c, 0xc9, 0xfa, 0x98, 0x48, 0xb7,
0x72, 0x8e, 0x61, 0xe2, 0x6f, 0x40, 0xd1, 0xf3, 0x8f, 0x9a, 0xcb, 0xc4, 0x7b, 0xed, 0x4c, 0xde,
0x4d, 0xff, 0x68, 0x2b, 0xe7, 0x20, 0x39, 0xdf, 0x80, 0x5a, 0x5b, 0xca, 0xc3, 0xbe, 0x1b, 0x1d,
0x36, 0x39, 0xb1, 0x7e, 0xeb, 0x4c, 0xd6, 0x75, 0x43, 0xbc, 0x95, 0x73, 0x52, 0x46, 0x1c, 0xb2,
0xdf, 0x91, 0x61, 0xf3, 0xe2, 0x1c, 0x43, 0xde, 0xee, 0xc8, 0x10, 0x87, 0x8c, 0x0c, 0xc8, 0x18,
0xf8, 0xe1, 0x61, 0x73, 0x65, 0x0e, 0x46, 0xf4, 0x1d, 0x64, 0x44, 0x06, 0x54, 0xdb, 0x73, 0x95,
0x7b, 0xe4, 0x8b, 0xe7, 0xcd, 0x97, 0xe6, 0x50, 0x7b, 0xd3, 0x10, 0xa3, 0xda, 0x09, 0x23, 0x0a,
0x49, 0x1c, 0xb3, 0x79, 0x69, 0x0e, 0x21, 0x89, 0x4f, 0xa3, 0x90, 0x84, 0x91, 0xff, 0x1a, 0x2c,
0x1f, 0x08, 0x57, 0x0d, 0x23, 0xe1, 0x8d, 0x02, 0xd6, 0x65, 0x92, 0xb6, 0x7a, 0xf6, 0xda, 0x4f,
0x72, 0x6d, 0xe5, 0x9c, 0x69, 0x51, 0xfc, 0x1d, 0x28, 0x07, 0xae, 0x12, 0xc7, 0xcd, 0x26, 0xc9,
0xb4, 0xcf, 0x31, 0x0a, 0x25, 0x8e, 0xb7, 0x72, 0x8e, 0x66, 0xe1, 0xbf, 0x0c, 0x17, 0x94, 0xdb,
0x0e, 0xc4, 0xce, 0x81, 0x21, 0x88, 0x9b, 0x3f, 0x47, 0x52, 0x5e, 0x3b, 0xdb, 0x9c, 0xc7, 0x79,
0xb6, 0x72, 0xce, 0xa4, 0x18, 0xd4, 0x8a, 0x50, 0x4d, 0x6b, 0x0e, 0xad, 0x48, 0x1e, 0x6a, 0x45,
0x2c, 0xfc, 0x31, 0x34, 0xe8, 0x61, 0x43, 0x06, 0xc3, 0x7e, 0xd8, 0xbc, 0x42, 0x12, 0x6e, 0x9c,
0x2f, 0x41, 0xd3, 0x6f, 0xe5, 0x9c, 0x2c, 0x3b, 0x2e, 0x22, 0x81, 0x8e, 0x7c, 0xde, 0x7c, 0x79,
0x8e, 0x45, 0xdc, 0x33, 0xc4, 0xb8, 0x88, 0x09, 0xa3, 0xf5, 0x03, 0x58, 0xc8, 0x46, 0x47, 0xce,
0xa1, 0x14, 0x09, 0x57, 0x47, 0xe6, 0x9a, 0x43, 0xcf, 0x88, 0x13, 0x9e, 0xaf, 0x28, 0x32, 0xd7,
0x1c, 0x7a, 0xe6, 0x97, 0xa0, 0x12, 0x89, 0xbe, 0x3c, 0x12, 0x14, 0x78, 0x6b, 0x8e, 0x81, 0x90,
0xd6, 0x8b, 0xdc, 0x6e, 0xb3, 0xa4, 0x69, 0xf1, 0x19, 0x69, 0xbd, 0x48, 0x0e, 0x76, 0x42, 0x0a,
0x9c, 0x35, 0xc7, 0x40, 0xd6, 0xef, 0xdd, 0x86, 0xaa, 0x51, 0xce, 0xfa, 0xe3, 0x3c, 0x54, 0xb4,
0x63, 0xf3, 0xfb, 0x50, 0x8e, 0xd5, 0x49, 0x20, 0x48, 0x87, 0xa5, 0x3b, 0xdf, 0x99, 0x23, 0x18,
0xac, 0xb6, 0x90, 0xc1, 0xd1, 0x7c, 0xb6, 0x03, 0x65, 0x82, 0x79, 0x15, 0x8a, 0x8e, 0x7c, 0xce,
0x72, 0x1c, 0xa0, 0xa2, 0x27, 0x8d, 0xe5, 0x11, 0xb9, 0xe9, 0x1f, 0xb1, 0x02, 0x22, 0xb7, 0x84,
0xeb, 0x89, 0x88, 0x15, 0xf9, 0x22, 0xd4, 0x93, 0xe9, 0x89, 0x59, 0x89, 0x33, 0x58, 0xc8, 0x4c,
0x7c, 0xcc, 0xca, 0xd6, 0xff, 0x94, 0xa0, 0x84, 0x7e, 0xc8, 0x5f, 0x81, 0x45, 0xe5, 0x46, 0x5d,
0xa1, 0x93, 0x8a, 0xed, 0x64, 0x0f, 0x1b, 0x47, 0xf2, 0x77, 0x93, 0x31, 0x14, 0x68, 0x0c, 0xdf,
0x3e, 0xd7, 0xbf, 0xc7, 0x46, 0x90, 0xd9, 0x0d, 0x8b, 0xf3, 0xed, 0x86, 0x0f, 0xa1, 0x86, 0x61,
0xa5, 0xe5, 0xff, 0x40, 0xd0, 0xd4, 0x2f, 0xdd, 0xb9, 0x79, 0xfe, 0x27, 0xb7, 0x0d, 0x87, 0x93,
0xf2, 0xf2, 0x6d, 0xa8, 0x77, 0xdc, 0xc8, 0x23, 0x65, 0x68, 0xb5, 0x96, 0xee, 0xbc, 0x7a, 0xbe,
0xa0, 0x8d, 0x84, 0xc5, 0x19, 0x71, 0xf3, 0x1d, 0x68, 0x78, 0x22, 0xee, 0x44, 0xfe, 0x80, 0xc2,
0x8c, 0xde, 0x13, 0xbf, 0x7b, 0xbe, 0xb0, 0xcd, 0x11, 0x93, 0x93, 0x95, 0xc0, 0x5f, 0x86, 0x7a,
0x94, 0xc6, 0x99, 0x2a, 0x6d, 0xd4, 0x23, 0x84, 0xfd, 0x26, 0xd4, 0x92, 0xf1, 0xf0, 0x05, 0xa8,
0xe1, 0xef, 0x53, 0x19, 0x0a, 0x96, 0xc3, 0xb5, 0x45, 0xa8, 0xd5, 0x77, 0x83, 0x80, 0xe5, 0xf9,
0x12, 0x00, 0x82, 0x4f, 0x84, 0xe7, 0x0f, 0xfb, 0xac, 0x60, 0xff, 0x62, 0x62, 0x2d, 0x35, 0x28,
0xed, 0xba, 0x5d, 0xe4, 0x58, 0x80, 0x5a, 0x12, 0x36, 0x59, 0x1e, 0xf9, 0x37, 0xdd, 0xb8, 0xd7,
0x96, 0x6e, 0xe4, 0xb1, 0x02, 0x6f, 0x40, 0x75, 0x2d, 0xea, 0xf4, 0xfc, 0x23, 0xc1, 0x8a, 0xf6,
0x2d, 0x68, 0x64, 0xf4, 0x45, 0x11, 0xe6, 0xa3, 0x75, 0x28, 0xaf, 0x79, 0x9e, 0xf0, 0x58, 0x1e,
0x19, 0xcc, 0x00, 0x59, 0xc1, 0x7e, 0x15, 0xea, 0xe9, 0x6c, 0x21, 0x39, 0x6e, 0xa0, 0x2c, 0x87,
0x4f, 0x88, 0x66, 0x79, 0xb4, 0xca, 0xed, 0x30, 0xf0, 0x43, 0xc1, 0x0a, 0xd6, 0x27, 0x64, 0xaa,
0xfc, 0x97, 0xc6, 0x1d, 0xe2, 0xfa, 0x79, 0x3b, 0xdc, 0xb8, 0x37, 0x5c, 0xc9, 0x8c, 0xef, 0xb1,
0x4f, 0xca, 0xd5, 0xa0, 0xb4, 0x29, 0x55, 0xcc, 0xf2, 0xd6, 0x7f, 0x17, 0xa0, 0x96, 0x6c, 0x6c,
0x9c, 0x41, 0x71, 0x18, 0x05, 0xc6, 0xa0, 0xf1, 0x91, 0xaf, 0x40, 0x59, 0xf9, 0xca, 0x98, 0x71,
0xdd, 0xd1, 0x00, 0xe6, 0x4c, 0xd9, 0x95, 0x2d, 0xd2, 0xbb, 0xc9, 0xa5, 0xf2, 0xfb, 0x6e, 0x57,
0x6c, 0xb9, 0x71, 0x8f, 0xec, 0xb1, 0xee, 0x8c, 0x10, 0xc8, 0x7f, 0xe0, 0x1e, 0xa1, 0xcd, 0xd1,
0x7b, 0x9d, 0x4d, 0x65, 0x51, 0xfc, 0x2e, 0x94, 0x70, 0x80, 0xc6, 0x68, 0x7e, 0x7e, 0x62, 0xc0,
0x68, 0x26, 0xbb, 0x91, 0xc0, 0xe5, 0x59, 0xc5, 0xac, 0xd6, 0x21, 0x62, 0x7e, 0x1d, 0x96, 0xb4,
0x13, 0xee, 0x50, 0xbe, 0xbb, 0xed, 0x51, 0x36, 0x55, 0x77, 0x26, 0xb0, 0x7c, 0x0d, 0xa7, 0xd3,
0x55, 0xa2, 0x59, 0x9b, 0xc3, 0xbe, 0x93, 0xc9, 0x59, 0x6d, 0x21, 0x8b, 0xa3, 0x39, 0xed, 0x7b,
0x38, 0xa7, 0xae, 0x12, 0xb8, 0xcc, 0x0f, 0xfa, 0x03, 0x75, 0xa2, 0x8d, 0xe6, 0xa1, 0x50, 0x9d,
0x9e, 0x1f, 0x76, 0x59, 0x5e, 0x4f, 0x31, 0x2e, 0x22, 0x91, 0x44, 0x91, 0x8c, 0x58, 0xd1, 0xb2,
0xa0, 0x84, 0x36, 0x8a, 0x41, 0x32, 0x74, 0xfb, 0xc2, 0xcc, 0x34, 0x3d, 0x5b, 0x17, 0x61, 0x79,
0x6a, 0x5f, 0xb4, 0xfe, 0xba, 0xa2, 0x2d, 0x04, 0x39, 0x28, 0x27, 0x33, 0x1c, 0x94, 0x6e, 0xbd,
0x50, 0x8c, 0x41, 0x29, 0xe3, 0x31, 0xe6, 0x5d, 0x28, 0xe3, 0xc0, 0x92, 0x10, 0x33, 0x07, 0xfb,
0x13, 0x24, 0x77, 0x34, 0x17, 0x6f, 0x42, 0xb5, 0xd3, 0x13, 0x9d, 0x43, 0xe1, 0x99, 0x58, 0x9f,
0x80, 0x68, 0x34, 0x9d, 0x4c, 0x9a, 0xac, 0x01, 0x32, 0x89, 0x8e, 0x0c, 0x1f, 0xf4, 0xe5, 0xa7,
0x3e, 0xad, 0x2b, 0x9a, 0x44, 0x82, 0x48, 0xde, 0x6e, 0xa3, 0x8d, 0x98, 0x65, 0x1b, 0x21, 0xac,
0x07, 0x50, 0xa6, 0x6f, 0xa3, 0x27, 0x68, 0x9d, 0x75, 0xd5, 0x76, 0x7d, 0x3e, 0x9d, 0x8d, 0xca,
0xd6, 0x4f, 0x0b, 0x50, 0x42, 0x98, 0xdf, 0x84, 0x72, 0xe4, 0x86, 0x5d, 0xbd, 0x00, 0xd3, 0xc5,
0x9f, 0x83, 0xef, 0x1c, 0x4d, 0xc2, 0xef, 0x1b, 0x53, 0x2c, 0xcc, 0x61, 0x2c, 0xe9, 0x17, 0xb3,
0x66, 0xb9, 0x02, 0xe5, 0x81, 0x1b, 0xb9, 0x7d, 0xe3, 0x27, 0x1a, 0xb0, 0x7f, 0x92, 0x87, 0x12,
0x12, 0xf1, 0x65, 0x58, 0x6c, 0xa9, 0xc8, 0x3f, 0x14, 0xaa, 0x17, 0xc9, 0x61, 0xb7, 0xa7, 0x2d,
0xe9, 0x91, 0x38, 0xd1, 0xf1, 0x46, 0x07, 0x04, 0xe5, 0x06, 0x7e, 0x87, 0x15, 0xd0, 0xaa, 0xd6,
0x65, 0xe0, 0xb1, 0x22, 0xbf, 0x00, 0x8d, 0x67, 0xa1, 0x27, 0xa2, 0xb8, 0x23, 0x23, 0xe1, 0xb1,
0x92, 0xf1, 0xee, 0x43, 0x56, 0xa6, 0xbd, 0x4c, 0x1c, 0x2b, 0xaa, 0x49, 0x58, 0x85, 0x5f, 0x84,
0x0b, 0xeb, 0xe3, 0x85, 0x0a, 0xab, 0x62, 0x4c, 0x7a, 0x22, 0x42, 0x34, 0x32, 0x56, 0xd3, 0x46,
0x2c, 0x3f, 0xf5, 0x59, 0x1d, 0x3f, 0xa6, 0xfd, 0x84, 0x81, 0xfd, 0xb7, 0xf9, 0x24, 0x72, 0x2c,
0x42, 0x7d, 0xd7, 0x8d, 0xdc, 0x6e, 0xe4, 0x0e, 0x50, 0xbf, 0x06, 0x54, 0xf5, 0xc6, 0xf9, 0xba,
0x8e, 0x6e, 0x1a, 0xb8, 0xa3, 0x63, 0xa3, 0x06, 0xee, 0xb2, 0xe2, 0x08, 0x78, 0x83, 0x95, 0xf0,
0x1b, 0x1f, 0x0e, 0xa5, 0x12, 0xac, 0x4c, 0xb1, 0x4e, 0x7a, 0x82, 0x55, 0x10, 0xb9, 0x87, 0x11,
0x85, 0x55, 0x71, 0xcc, 0x1b, 0x68, 0x3f, 0x6d, 0x79, 0xcc, 0x6a, 0xa8, 0x06, 0x4e, 0xa3, 0xf0,
0x58, 0x1d, 0xdf, 0x3c, 0x1d, 0xf6, 0xdb, 0x02, 0x87, 0x09, 0xf8, 0x66, 0x4f, 0x76, 0xbb, 0x81,
0x60, 0x0d, 0x9c, 0x83, 0x4c, 0xf0, 0x65, 0x0b, 0x14, 0x69, 0xdd, 0x20, 0x90, 0x43, 0xc5, 0x16,
0xad, 0x2f, 0x8a, 0x50, 0xc2, 0x2a, 0x03, 0x7d, 0xa7, 0x87, 0x71, 0xc6, 0xf8, 0x0e, 0x3e, 0xa7,
0x1e, 0x58, 0x18, 0x79, 0x20, 0x7f, 0xc7, 0xac, 0x74, 0x71, 0x8e, 0x28, 0x8b, 0x82, 0xb3, 0x8b,
0xcc, 0xa1, 0xd4, 0xf7, 0xfb, 0xc2, 0xc4, 0x3a, 0x7a, 0x46, 0x5c, 0x8c, 0xfb, 0x31, 0xba, 0x41,
0xd1, 0xa1, 0x67, 0xf4, 0x1a, 0x17, 0xb7, 0x85, 0x35, 0x45, 0x3e, 0x50, 0x74, 0x12, 0x50, 0x7b,
0x33, 0x46, 0xa5, 0xea, 0x1c, 0xde, 0x4c, 0x9f, 0xcf, 0x46, 0xa4, 0x51, 0x30, 0xa8, 0xcd, 0xcf,
0x9e, 0xd9, 0x24, 0x36, 0x8d, 0x35, 0x8e, 0x36, 0xb0, 0x9a, 0x9e, 0x3d, 0x96, 0xc7, 0x55, 0x22,
0x37, 0xd4, 0xb1, 0x6c, 0xdf, 0xf7, 0x84, 0x64, 0x45, 0xda, 0xe0, 0x86, 0x9e, 0x2f, 0x59, 0x09,
0x33, 0xaa, 0xdd, 0xcd, 0x87, 0xac, 0x6c, 0x5f, 0xcf, 0x6c, 0x35, 0x6b, 0x43, 0x25, 0xb5, 0x18,
0x32, 0xcb, 0xbc, 0xb6, 0xb2, 0xb6, 0xf0, 0x58, 0xc1, 0xfe, 0xde, 0x8c, 0xf0, 0xb9, 0x08, 0xf5,
0x67, 0x83, 0x40, 0xba, 0xde, 0x19, 0xf1, 0x73, 0x01, 0x60, 0x54, 0xb5, 0x5a, 0x7f, 0x67, 0x8d,
0xb6, 0x69, 0xcc, 0x31, 0x63, 0x39, 0x8c, 0x3a, 0x82, 0x42, 0x43, 0xdd, 0x31, 0x10, 0x7f, 0x1f,
0xca, 0xf8, 0x3e, 0x6e, 0x16, 0x28, 0x62, 0xdc, 0x9c, 0xab, 0x56, 0x5a, 0xdd, 0xf7, 0xc5, 0x73,
0x47, 0x33, 0xf2, 0x7b, 0xd9, 0xb4, 0xe3, 0x9c, 0x7e, 0xcc, 0x88, 0x92, 0x5f, 0x05, 0x70, 0x3b,
0xca, 0x3f, 0x12, 0x28, 0xcb, 0xf8, 0x7e, 0x06, 0xc3, 0x1d, 0x68, 0xa0, 0x4b, 0x0e, 0x76, 0x22,
0xf4, 0xe2, 0xe6, 0x02, 0x09, 0xbe, 0x3d, 0x9f, 0x7a, 0x1f, 0xa4, 0x8c, 0x4e, 0x56, 0x08, 0x7f,
0x06, 0x0b, 0xba, 0xd7, 0x63, 0x84, 0x2e, 0x92, 0xd0, 0xd7, 0xe7, 0x13, 0xba, 0x33, 0xe2, 0x74,
0xc6, 0xc4, 0x4c, 0x37, 0x7e, 0xca, 0x2f, 0xda, 0xf8, 0xb1, 0xfe, 0xa6, 0x0c, 0x25, 0x1a, 0xf6,
0x64, 0xdf, 0x67, 0x63, 0x2c, 0xbc, 0xde, 0x9a, 0x7f, 0x79, 0x26, 0xbc, 0x8f, 0xbc, 0xb9, 0x98,
0xf1, 0xe6, 0xf7, 0xa1, 0x1c, 0xcb, 0x48, 0x25, 0x4b, 0x36, 0xe7, 0xc2, 0xb7, 0x64, 0xa4, 0x1c,
0xcd, 0xc8, 0x1f, 0x42, 0xf5, 0xc0, 0x0f, 0x14, 0x4e, 0xa4, 0x1e, 0xf0, 0x6b, 0xf3, 0xc9, 0x78,
0x48, 0x4c, 0x4e, 0xc2, 0xcc, 0x1f, 0x67, 0x0d, 0xa8, 0x42, 0x92, 0x56, 0xe7, 0x93, 0x34, 0xcb,
0xae, 0x6e, 0x02, 0xeb, 0xc8, 0x23, 0x11, 0x25, 0xef, 0x1e, 0x89, 0x13, 0xb3, 0x61, 0x4e, 0xe1,
0xb9, 0x05, 0xb5, 0x9e, 0xef, 0x09, 0xcc, 0x39, 0x28, 0x2e, 0xd4, 0x9c, 0x14, 0xe6, 0x8f, 0xa0,
0x46, 0xb9, 0x3a, 0x46, 0xa8, 0xfa, 0x0b, 0x4f, 0xbe, 0x2e, 0x1b, 0x12, 0x01, 0xf8, 0x21, 0xfa,
0xf8, 0x43, 0x5f, 0x35, 0x41, 0x7f, 0x28, 0x81, 0x51, 0x61, 0xb2, 0xd1, 0xac, 0xc2, 0x0d, 0xad,
0xf0, 0x24, 0x9e, 0xbf, 0x01, 0x2f, 0x11, 0x6e, 0x62, 0xc3, 0x42, 0xf7, 0x40, 0xa1, 0xb3, 0x5f,
0xda, 0x6f, 0x98, 0xe0, 0x85, 0xdb, 0x09, 0x56, 0x6d, 0x49, 0xd8, 0x89, 0x95, 0xde, 0x9f, 0x3e,
0x70, 0x83, 0x40, 0x44, 0x27, 0xba, 0xe4, 0x7b, 0xe4, 0x86, 0x6d, 0x37, 0x64, 0x45, 0xfb, 0x06,
0x94, 0x48, 0xf7, 0x3a, 0x94, 0x75, 0x69, 0x40, 0x65, 0xa2, 0x29, 0x0b, 0x28, 0x5c, 0x3d, 0xc6,
0xbc, 0x91, 0x15, 0xac, 0xbf, 0x2a, 0x42, 0x2d, 0xd1, 0x12, 0x93, 0xe4, 0x43, 0x71, 0x92, 0x24,
0xc9, 0x87, 0xe2, 0x84, 0x72, 0x97, 0x78, 0xdf, 0x8f, 0xfd, 0xb6, 0xc9, 0xc5, 0x6a, 0xce, 0x08,
0x81, 0xdb, 0xff, 0x73, 0xdf, 0x53, 0x3d, 0x32, 0xce, 0xb2, 0xa3, 0x01, 0x7e, 0x03, 0x2e, 0x78,
0xae, 0x12, 0xdb, 0x61, 0x27, 0x18, 0x7a, 0x62, 0x0f, 0xb7, 0x0e, 0x5d, 0x1b, 0x4f, 0xa2, 0xf9,
0xf7, 0x01, 0x94, 0xdf, 0x17, 0x0f, 0x65, 0xd4, 0x77, 0x95, 0x49, 0x88, 0xdf, 0x7e, 0x31, 0xf3,
0x59, 0xdd, 0x4b, 0x05, 0x38, 0x19, 0x61, 0x28, 0x1a, 0xbf, 0x66, 0x44, 0x57, 0xbf, 0x96, 0xe8,
0xcd, 0x54, 0x80, 0x93, 0x11, 0x66, 0xff, 0x0a, 0xc0, 0xe8, 0x0d, 0xbf, 0x04, 0xfc, 0x89, 0x0c,
0x55, 0x6f, 0xad, 0xdd, 0x8e, 0xd6, 0xc5, 0x81, 0x8c, 0xc4, 0xa6, 0x8b, 0x31, 0xff, 0x25, 0x58,
0x4e, 0xf1, 0x6b, 0x07, 0x4a, 0x44, 0x88, 0xa6, 0xa9, 0x6f, 0xf5, 0x64, 0xa4, 0x74, 0x42, 0x41,
0x8f, 0xcf, 0x5a, 0xac, 0x88, 0xfb, 0xcc, 0x76, 0x6b, 0x87, 0x95, 0xec, 0x1b, 0x00, 0xa3, 0x21,
0x51, 0xe2, 0x4d, 0x4f, 0xaf, 0xdf, 0x31, 0x69, 0x38, 0x41, 0x77, 0xde, 0x60, 0x79, 0xeb, 0x9f,
0xf3, 0x50, 0x42, 0x9f, 0xc6, 0x9a, 0x23, 0x6b, 0x80, 0x7a, 0xf9, 0xb2, 0xa8, 0xaf, 0x17, 0x89,
0x50, 0x76, 0x36, 0x12, 0xbd, 0x05, 0x8d, 0xce, 0x30, 0x56, 0xb2, 0x4f, 0xa1, 0xb3, 0x59, 0x24,
0x6f, 0xbf, 0x34, 0x55, 0xbd, 0xef, 0xbb, 0xc1, 0x50, 0x38, 0x59, 0x52, 0xfb, 0x5b, 0xc6, 0x88,
0xab, 0x50, 0x5c, 0x8b, 0x3b, 0xa6, 0x48, 0x13, 0x71, 0x47, 0x67, 0x80, 0x1b, 0x44, 0xc9, 0x0a,
0xd6, 0xbf, 0x57, 0xa0, 0xa2, 0x03, 0x0c, 0xff, 0x10, 0x6a, 0x72, 0x20, 0x22, 0x57, 0xc9, 0xc8,
0x54, 0x86, 0xf7, 0x5e, 0x24, 0x40, 0xad, 0xee, 0x18, 0x66, 0x27, 0x15, 0x33, 0x39, 0x4b, 0x85,
0xe9, 0x59, 0xba, 0x09, 0x2c, 0x89, 0x45, 0xbb, 0x11, 0xf2, 0xa9, 0x13, 0x93, 0xe7, 0x4f, 0xe1,
0xf9, 0x1e, 0xd4, 0x3b, 0x32, 0xf4, 0xfc, 0xb4, 0x4a, 0x5c, 0xba, 0xf3, 0xbd, 0x17, 0xd2, 0x70,
0x23, 0xe1, 0x76, 0x46, 0x82, 0xf8, 0x6b, 0x50, 0x3e, 0xc2, 0xe9, 0xa3, 0x5c, 0xeb, 0xf4, 0xc9,
0xd5, 0x44, 0xfc, 0x63, 0x68, 0x7c, 0x36, 0xf4, 0x3b, 0x87, 0x3b, 0xd9, 0x2e, 0xc4, 0x5b, 0x2f,
0xa4, 0xc5, 0x87, 0x23, 0x7e, 0x27, 0x2b, 0xcc, 0xbe, 0x02, 0xb5, 0x64, 0x0e, 0x69, 0xd9, 0x42,
0x8f, 0xe5, 0x78, 0x05, 0x0a, 0x3b, 0x11, 0xcb, 0xdb, 0x5f, 0xe5, 0xa1, 0x9e, 0xea, 0x3f, 0xde,
0x18, 0x78, 0xf0, 0xd9, 0xd0, 0x0d, 0x58, 0x9e, 0x32, 0x5b, 0xa9, 0x34, 0x44, 0xa6, 0xfe, 0x41,
0x24, 0x5c, 0x45, 0xfd, 0x28, 0x8c, 0x5f, 0x22, 0x8e, 0x59, 0x89, 0x73, 0x58, 0x32, 0xe8, 0x9d,
0x48, 0x93, 0x96, 0x31, 0xf1, 0xc5, 0xb7, 0x09, 0xa2, 0xa2, 0xc3, 0xdd, 0xa1, 0xd0, 0x89, 0xfd,
0x53, 0xa9, 0x08, 0xa8, 0xa1, 0x2e, 0xdb, 0x21, 0xab, 0xe3, 0x37, 0x9f, 0x4a, 0xb5, 0x1d, 0x32,
0x18, 0x65, 0x5c, 0x8d, 0xe4, 0xf3, 0x04, 0x2d, 0x50, 0x3e, 0x17, 0x04, 0xdb, 0x21, 0x5b, 0x34,
0x2f, 0x34, 0xb4, 0x84, 0x12, 0x1f, 0x1c, 0xbb, 0x1d, 0x64, 0xbf, 0xc0, 0x97, 0x00, 0x90, 0xc7,
0xc0, 0xcc, 0xfe, 0xa7, 0x3c, 0x34, 0x32, 0xf3, 0x83, 0x59, 0x1c, 0xbd, 0x44, 0xe7, 0xd7, 0x49,
0xdd, 0xf7, 0x45, 0xac, 0x44, 0xe4, 0x25, 0x8e, 0xbd, 0x27, 0xf1, 0xb1, 0x80, 0xdf, 0xd8, 0x93,
0x7d, 0x19, 0x45, 0xf2, 0x39, 0x2b, 0x22, 0xf4, 0xd8, 0x8d, 0xd5, 0x47, 0x42, 0x1c, 0xb2, 0x12,
0x0e, 0x6f, 0x63, 0x18, 0x45, 0x22, 0xd4, 0x88, 0x32, 0x29, 0x24, 0x8e, 0x35, 0x54, 0x41, 0xa1,
0x48, 0x4c, 0x91, 0x83, 0x55, 0x39, 0x83, 0x05, 0x43, 0xad, 0x31, 0x35, 0x24, 0x40, 0x72, 0x0d,
0xd6, 0xb1, 0x00, 0xd2, 0x05, 0xc4, 0xce, 0xc1, 0xa6, 0x7b, 0x12, 0xaf, 0x75, 0x25, 0x83, 0x49,
0xe4, 0x53, 0xf9, 0x9c, 0x35, 0xac, 0x21, 0xc0, 0x28, 0xb5, 0xc2, 0x94, 0x12, 0xcd, 0x20, 0x6d,
0xf1, 0x19, 0x88, 0xef, 0x00, 0xe0, 0x13, 0x51, 0x26, 0x79, 0xe5, 0x0b, 0xec, 0x9d, 0xc4, 0xe7,
0x64, 0x44, 0x58, 0xbf, 0x0e, 0xf5, 0xf4, 0x05, 0x56, 0x08, 0xb4, 0xcb, 0xa5, 0x9f, 0x4d, 0x40,
0xdc, 0x49, 0xfc, 0xd0, 0x13, 0xc7, 0xe4, 0x96, 0x65, 0x47, 0x03, 0xa8, 0x65, 0xcf, 0xf7, 0x3c,
0x11, 0x26, 0x8d, 0x58, 0x0d, 0xcd, 0x3a, 0xb6, 0x2a, 0xcd, 0x3c, 0xb6, 0xb2, 0x7e, 0x15, 0x1a,
0x99, 0xdc, 0xef, 0xd4, 0x61, 0x67, 0x14, 0x2b, 0x8c, 0x2b, 0xf6, 0x32, 0xd4, 0xa5, 0x69, 0xae,
0xc4, 0x14, 0xf2, 0xea, 0xce, 0x08, 0x61, 0xfd, 0x65, 0x01, 0xca, 0x7a, 0x68, 0x93, 0xb9, 0xdf,
0x43, 0xa8, 0x60, 0xf1, 0x32, 0x4c, 0xce, 0xfc, 0xe6, 0xcc, 0xaf, 0x5a, 0xc4, 0xb3, 0x95, 0x73,
0x0c, 0x37, 0x7f, 0x17, 0x8a, 0xca, 0xed, 0x9a, 0x3e, 0xc6, 0x77, 0xe6, 0x13, 0xb2, 0xe7, 0x76,
0xb7, 0x72, 0x0e, 0xf2, 0xf1, 0xc7, 0x50, 0xeb, 0x98, 0xd2, 0xd3, 0xc4, 0x94, 0x39, 0xd3, 0xb3,
0xa4, 0x60, 0xdd, 0xca, 0x39, 0xa9, 0x04, 0xfe, 0x3e, 0x94, 0x70, 0x1f, 0xa4, 0xa0, 0x38, 0x77,
0xda, 0x89, 0xee, 0xb2, 0x95, 0x73, 0x88, 0x73, 0xbd, 0x0a, 0x65, 0x0a, 0x61, 0x56, 0x13, 0x2a,
0x7a, 0xac, 0x93, 0x33, 0x67, 0x5d, 0x86, 0xe2, 0x9e, 0xdb, 0xc5, 0x5c, 0xc4, 0xf7, 0x62, 0x53,
0xf1, 0xe0, 0xa3, 0xf5, 0xca, 0xa8, 0x8c, 0xce, 0x76, 0x68, 0xf2, 0x63, 0x1d, 0x1a, 0xab, 0x02,
0x25, 0xfc, 0xa2, 0xf5, 0xf2, 0x59, 0x79, 0x8d, 0x75, 0x05, 0x33, 0x20, 0x25, 0x8e, 0x67, 0x35,
0x9f, 0xac, 0x65, 0xb8, 0x30, 0x71, 0x58, 0x62, 0x55, 0x4d, 0xfa, 0x65, 0x2d, 0x42, 0x23, 0xd3,
0x3d, 0xb7, 0xae, 0x43, 0x2d, 0xe9, 0xad, 0x63, 0xa2, 0xe8, 0xc7, 0xba, 0x2b, 0x60, 0x94, 0x4a,
0x61, 0xfb, 0x00, 0x6a, 0xbb, 0x32, 0x9e, 0x8c, 0x97, 0x55, 0x28, 0xee, 0xc9, 0x81, 0xde, 0x05,
0xd7, 0xa5, 0xa2, 0x5d, 0x50, 0x87, 0xc7, 0x03, 0xa5, 0xcb, 0x50, 0xc7, 0xef, 0xf6, 0x94, 0x6e,
0x31, 0x6c, 0x87, 0xa1, 0x88, 0x58, 0x19, 0x63, 0x96, 0x23, 0x06, 0x81, 0xdb, 0x11, 0xac, 0x82,
0x31, 0x8b, 0xf0, 0x0f, 0xfd, 0x28, 0x56, 0xac, 0x6a, 0xbf, 0x89, 0x91, 0xce, 0xef, 0x52, 0xb0,
0xa2, 0x07, 0x12, 0x95, 0xc3, 0xb0, 0x43, 0xe0, 0x86, 0x08, 0x31, 0x08, 0x53, 0xa7, 0x58, 0x9f,
0xb5, 0xd2, 0x07, 0x0a, 0xf6, 0x47, 0xb0, 0x38, 0x76, 0x06, 0xcb, 0x57, 0x80, 0x8d, 0x21, 0x50,
0xd1, 0x1c, 0xbf, 0x0c, 0x17, 0xc7, 0xb0, 0x4f, 0x7c, 0xcf, 0xa3, 0x42, 0x7a, 0xf2, 0x45, 0x32,
0x9c, 0xf5, 0x3a, 0x54, 0x3b, 0x7a, 0x16, 0xed, 0x5d, 0x58, 0x24, 0x1b, 0x79, 0x22, 0x94, 0xbb,
0x13, 0x06, 0x27, 0xff, 0xef, 0x83, 0x72, 0xfb, 0x55, 0x28, 0x53, 0x43, 0x0b, 0x97, 0xf1, 0x20,
0x92, 0x7d, 0x92, 0x55, 0x76, 0xe8, 0x19, 0xa5, 0x2b, 0x69, 0x02, 0x4a, 0x41, 0x49, 0xfb, 0x5f,
0xea, 0x50, 0x5d, 0xeb, 0x74, 0xe4, 0x30, 0x54, 0x53, 0x5f, 0x9e, 0xd5, 0x33, 0xb9, 0x07, 0x15,
0xf7, 0xc8, 0x55, 0x6e, 0x64, 0xbc, 0xef, 0x1b, 0x13, 0xf6, 0x6e, 0x64, 0xad, 0xae, 0x11, 0x91,
0x63, 0x88, 0x91, 0xad, 0x23, 0xc3, 0x03, 0xbf, 0x6b, 0x1c, 0xee, 0x34, 0xb6, 0x0d, 0x22, 0x72,
0x0c, 0x31, 0xb2, 0x99, 0x80, 0x51, 0x3e, 0x93, 0x4d, 0x7b, 0x4d, 0x1a, 0x1f, 0x6e, 0x41, 0xc9,
0x0f, 0x0f, 0xa4, 0xb9, 0xec, 0x70, 0xe5, 0x14, 0xa6, 0xed, 0xf0, 0x40, 0x3a, 0x44, 0x68, 0x09,
0xa8, 0x68, 0x85, 0xf9, 0xdb, 0x50, 0xa6, 0xbe, 0xb5, 0xe9, 0x14, 0xce, 0x75, 0xa6, 0xad, 0x39,
0xf8, 0xa5, 0xa4, 0x0d, 0x4a, 0xf3, 0x85, 0x78, 0x02, 0xd7, 0x6b, 0xc9, 0x94, 0x59, 0xff, 0x99,
0x87, 0x8a, 0x1e, 0x21, 0xbf, 0x0e, 0x4b, 0x22, 0x44, 0x27, 0x49, 0x42, 0x82, 0xf1, 0x8e, 0x09,
0x2c, 0x26, 0x68, 0x06, 0x23, 0xda, 0xc3, 0xae, 0xa9, 0x36, 0xb2, 0x28, 0xfe, 0x16, 0x5c, 0xd6,
0xe0, 0x6e, 0x24, 0x22, 0x11, 0x08, 0x37, 0x16, 0x1b, 0x3d, 0x37, 0x0c, 0x45, 0x60, 0x36, 0x88,
0xd3, 0x5e, 0x73, 0x1b, 0x16, 0xf4, 0xab, 0xd6, 0xc0, 0xed, 0x88, 0xd8, 0xb4, 0x75, 0xc7, 0x70,
0xfc, 0xbb, 0x50, 0xa6, 0x2b, 0x27, 0x4d, 0xef, 0x6c, 0xe3, 0xd3, 0x54, 0x96, 0x4c, 0x23, 0xd8,
0x1a, 0x80, 0x5e, 0x0d, 0x4c, 0x72, 0x4d, 0xba, 0xfa, 0xcd, 0x33, 0x97, 0x8f, 0xb2, 0xea, 0x0c,
0x13, 0xea, 0xe7, 0x89, 0x40, 0x60, 0x7c, 0xc0, 0xe8, 0x45, 0x83, 0x2f, 0x3a, 0x63, 0x38, 0xeb,
0xef, 0x8b, 0x50, 0xc2, 0x85, 0x44, 0xe2, 0x9e, 0xec, 0x8b, 0xf4, 0x28, 0x40, 0x1b, 0xed, 0x18,
0x0e, 0xb7, 0x48, 0x57, 0x9f, 0xe4, 0xa4, 0x64, 0xba, 0x83, 0x30, 0x89, 0x46, 0xca, 0x41, 0x24,
0x0f, 0xfc, 0x60, 0x44, 0x69, 0x36, 0xd3, 0x09, 0x34, 0x4e, 0x7f, 0xdf, 0x8d, 0x0e, 0x85, 0xa2,
0xe8, 0x83, 0x7a, 0xa7, 0x1c, 0x3a, 0x4d, 0x3e, 0xed, 0x35, 0x7f, 0x1f, 0xae, 0x64, 0x5e, 0x25,
0x71, 0x39, 0xe5, 0xd6, 0x2d, 0xf3, 0xb3, 0x48, 0x26, 0x24, 0xec, 0x89, 0xfe, 0x20, 0x70, 0x95,
0x98, 0x38, 0x0d, 0x39, 0x8b, 0x04, 0xc3, 0xb3, 0x27, 0x8e, 0xfc, 0x8e, 0xd8, 0xf6, 0xa8, 0x61,
0x50, 0x77, 0x52, 0x98, 0x5f, 0x05, 0xe8, 0xba, 0x4a, 0x3c, 0x77, 0x4f, 0x9e, 0x45, 0x41, 0x53,
0xe8, 0x86, 0xd6, 0x08, 0x83, 0x95, 0x41, 0x20, 0x3b, 0x6e, 0xd0, 0x52, 0x32, 0x72, 0xbb, 0x62,
0xd7, 0x55, 0xbd, 0x66, 0x57, 0x57, 0x06, 0x93, 0x78, 0xfc, 0x0e, 0xd6, 0xa1, 0x1f, 0xcb, 0x50,
0x34, 0x7b, 0xfa, 0x3b, 0x09, 0x6c, 0xef, 0x00, 0x8c, 0x0c, 0x00, 0xa3, 0xfe, 0x1a, 0x35, 0xcd,
0x58, 0x0e, 0x73, 0xb6, 0x5d, 0x11, 0x7a, 0x7e, 0xd8, 0xdd, 0x34, 0x6b, 0xce, 0xf2, 0x88, 0x6c,
0x29, 0x37, 0x52, 0xc2, 0x4b, 0x91, 0x94, 0x4b, 0x13, 0x24, 0x3c, 0x56, 0xb4, 0xff, 0x37, 0x0f,
0x8d, 0xcc, 0x91, 0xd1, 0xcf, 0xf0, 0x98, 0x0b, 0x77, 0x33, 0xf4, 0x75, 0x9c, 0x10, 0x6d, 0x0f,
0x29, 0x8c, 0xd3, 0x65, 0x4e, 0xb4, 0xf0, 0xad, 0x5e, 0xfb, 0x0c, 0xe6, 0x6b, 0x1d, 0x71, 0xd9,
0x77, 0x4c, 0x91, 0xd8, 0x80, 0xea, 0xb3, 0xf0, 0x30, 0x94, 0xcf, 0x43, 0x5d, 0x28, 0xd2, 0xb9,
0xe5, 0x58, 0xa7, 0x36, 0x39, 0x5a, 0x2c, 0xda, 0x3f, 0x2e, 0x4d, 0x1c, 0xf1, 0x3f, 0x80, 0x8a,
0xce, 0xce, 0x28, 0x71, 0x98, 0x3e, 0x93, 0xcd, 0x12, 0x9b, 0xae, 0x60, 0x06, 0xe5, 0x18, 0x66,
0x4c, 0x9b, 0xd2, 0x8b, 0x28, 0x85, 0x99, 0xdd, 0xcb, 0x31, 0x41, 0x49, 0x08, 0x1b, 0xbb, 0x8b,
0x95, 0x4a, 0xb0, 0x7e, 0x94, 0x87, 0x95, 0x59, 0x24, 0x98, 0xc5, 0xb4, 0xc7, 0x4e, 0xda, 0x13,
0x90, 0xb7, 0x26, 0x6e, 0x80, 0x15, 0x68, 0x34, 0xb7, 0x5e, 0x50, 0x89, 0xf1, 0xfb, 0x60, 0xf6,
0xe7, 0x79, 0x58, 0x9e, 0x1a, 0x73, 0x26, 0x1d, 0x01, 0xa8, 0x68, 0xcb, 0xd2, 0x07, 0xc3, 0xe9,
0x51, 0x9d, 0x6e, 0x2e, 0xd1, 0x7e, 0x10, 0xeb, 0xb3, 0x8f, 0x4d, 0x7d, 0x13, 0x90, 0x95, 0x30,
0x8f, 0xc0, 0x55, 0xc3, 0x38, 0xdb, 0x15, 0xac, 0x8c, 0x15, 0x8b, 0xbe, 0xb6, 0x60, 0x30, 0x15,
0xaa, 0x86, 0x8c, 0x2f, 0xb2, 0x2a, 0x1d, 0x38, 0x0f, 0x07, 0x81, 0xdf, 0x41, 0xb0, 0x66, 0x3b,
0x70, 0x71, 0x86, 0xde, 0xa4, 0xc9, 0xbe, 0xd1, 0x6a, 0x09, 0x60, 0x73, 0x3f, 0xd1, 0x85, 0xe5,
0xb1, 0x68, 0xdc, 0xdc, 0xdf, 0xa0, 0xb2, 0xd1, 0x1c, 0xe7, 0x68, 0x9f, 0xd8, 0xc7, 0x3a, 0x23,
0x66, 0x45, 0xfb, 0x3e, 0xbc, 0xb4, 0xd7, 0x8b, 0x84, 0xeb, 0x6d, 0x0a, 0x31, 0x08, 0xd0, 0xd8,
0xdc, 0x93, 0x40, 0xba, 0xde, 0x8c, 0xf6, 0xd6, 0x0a, 0x94, 0x5d, 0xcf, 0x8b, 0xf4, 0xfc, 0xd6,
0x1d, 0x0d, 0xd8, 0x9f, 0xc0, 0x25, 0x2d, 0x40, 0x7f, 0xe5, 0xc3, 0xa1, 0x18, 0x8a, 0x07, 0xa1,
0x8a, 0x4e, 0x74, 0x83, 0x32, 0xb9, 0x35, 0xa8, 0x69, 0x8c, 0xb8, 0x29, 0x3c, 0xc5, 0x01, 0x7a,
0x4a, 0x23, 0x74, 0x0a, 0xdb, 0xff, 0x50, 0x02, 0xd8, 0x49, 0x6f, 0x2e, 0xce, 0xf0, 0xda, 0xd9,
0xf9, 0x48, 0xa6, 0xd7, 0x5a, 0x9c, 0xbb, 0x59, 0xff, 0x56, 0x7a, 0x01, 0x4d, 0x5f, 0x9e, 0x98,
0xbc, 0x44, 0x36, 0xd2, 0xc3, 0x5c, 0x38, 0x49, 0xef, 0x9e, 0x8d, 0x1d, 0x6b, 0x96, 0x27, 0x8f,
0x35, 0xaf, 0x4d, 0xdf, 0x81, 0x98, 0x08, 0x21, 0xa3, 0xf2, 0xad, 0x3a, 0x56, 0xbe, 0x59, 0x50,
0xc3, 0x79, 0x90, 0x61, 0x70, 0x92, 0x74, 0x54, 0x13, 0x98, 0xdf, 0x85, 0xb2, 0xa2, 0xfb, 0x9d,
0x35, 0xb2, 0xf8, 0xc9, 0x2c, 0x68, 0x74, 0xe5, 0x95, 0x22, 0x87, 0xa6, 0xc5, 0x78, 0xe4, 0xc7,
0xe6, 0xe2, 0x82, 0x47, 0x1d, 0xdf, 0x9a, 0x93, 0xc1, 0xd8, 0xff, 0x3a, 0xba, 0x80, 0x53, 0x87,
0x72, 0xdb, 0x8d, 0xfd, 0x8e, 0x3e, 0xea, 0x33, 0x3b, 0x9c, 0x3e, 0x93, 0x51, 0xd2, 0x93, 0xac,
0x80, 0x49, 0x79, 0x2c, 0x30, 0xfd, 0x5e, 0x02, 0x18, 0xdd, 0x2e, 0x65, 0x25, 0x34, 0xe4, 0x64,
0x56, 0xf5, 0x49, 0x1f, 0xb1, 0x52, 0xcd, 0xee, 0xa5, 0x77, 0x28, 0xaa, 0xf8, 0x05, 0x0a, 0x94,
0xac, 0x86, 0x34, 0xa1, 0x54, 0x42, 0x77, 0x29, 0x62, 0xcc, 0x32, 0x18, 0xa0, 0x98, 0xe4, 0x8a,
0x1d, 0x6b, 0x60, 0xde, 0x9c, 0x08, 0xd5, 0x6d, 0x86, 0x98, 0x7a, 0xbb, 0x0b, 0x68, 0xe6, 0xe3,
0x2f, 0x74, 0xf3, 0x02, 0x83, 0x4a, 0xdb, 0x8d, 0x05, 0x5b, 0xb1, 0xff, 0x70, 0x34, 0xaa, 0xdb,
0x69, 0x3a, 0x3b, 0xcf, 0xfa, 0x9e, 0x96, 0xf0, 0x3e, 0x80, 0xe5, 0x48, 0x7c, 0x36, 0xf4, 0xc7,
0x2e, 0xbd, 0x9d, 0x63, 0x68, 0xd3, 0x1c, 0xf6, 0x11, 0x2c, 0x27, 0xc0, 0x47, 0xbe, 0xea, 0x51,
0xbd, 0xc7, 0xef, 0x66, 0x6e, 0xe5, 0xe5, 0x4d, 0x7e, 0x75, 0x8a, 0xc8, 0xd1, 0x2d, 0xbc, 0xb4,
0x1d, 0x56, 0x98, 0xa3, 0x1d, 0x66, 0xff, 0x79, 0x35, 0x53, 0xf2, 0xe9, 0x04, 0xdf, 0x4b, 0x13,
0xfc, 0x69, 0xdf, 0xbf, 0x07, 0x95, 0x03, 0xdd, 0x1d, 0xd6, 0x5d, 0xd1, 0x6f, 0x9c, 0xa2, 0x8f,
0xe9, 0x00, 0x1b, 0xe2, 0x99, 0xe7, 0x31, 0xef, 0x60, 0xf6, 0x76, 0xe0, 0x0e, 0x03, 0xb5, 0x3f,
0x47, 0xf7, 0x6e, 0x8c, 0x96, 0xaf, 0x53, 0xa3, 0xda, 0x6d, 0xe9, 0x03, 0xbe, 0xf2, 0xcc, 0x3b,
0xb2, 0xd9, 0x8e, 0xb4, 0xa1, 0x74, 0x32, 0x5c, 0x19, 0x47, 0xab, 0xcc, 0x72, 0x34, 0xac, 0xb5,
0x8c, 0x0b, 0xa6, 0xb0, 0x6e, 0x76, 0xea, 0xe7, 0x44, 0x3c, 0x5d, 0x6e, 0xad, 0x39, 0x53, 0x78,
0x0c, 0x93, 0xfd, 0x61, 0xa0, 0x7c, 0x73, 0xd0, 0xa2, 0x81, 0xc9, 0x0b, 0xd9, 0xf5, 0xe9, 0x0b,
0xd9, 0xef, 0x01, 0xc4, 0x02, 0xa3, 0xe2, 0xa6, 0xdf, 0x51, 0xe6, 0x18, 0xf0, 0xea, 0x69, 0x63,
0x33, 0x5d, 0xc8, 0x0c, 0x07, 0xea, 0xdf, 0x77, 0x8f, 0x37, 0x30, 0x71, 0x6e, 0x2e, 0x52, 0x1d,
0x97, 0xc2, 0x93, 0xe1, 0x67, 0x69, 0x3a, 0xfc, 0xdc, 0x85, 0x72, 0xdc, 0x91, 0x03, 0x41, 0xf7,
0x50, 0x4f, 0x5f, 0xdf, 0xd5, 0x16, 0x12, 0x39, 0x9a, 0x96, 0x1a, 0x0b, 0x18, 0xf5, 0x65, 0x44,
0x37, 0x50, 0xeb, 0x4e, 0x02, 0x5a, 0x3f, 0xcd, 0x43, 0xc5, 0x74, 0x02, 0x67, 0x54, 0x8f, 0xd4,
0x44, 0x28, 0x64, 0x6e, 0xb0, 0xa4, 0x37, 0x45, 0x8a, 0xd9, 0x9b, 0x22, 0xef, 0x24, 0x3a, 0xe9,
0x58, 0xfc, 0xca, 0xd9, 0x93, 0x31, 0xa6, 0x9a, 0xfd, 0x1a, 0x94, 0x09, 0xc6, 0x60, 0x42, 0x59,
0xa7, 0x3e, 0x11, 0x88, 0x46, 0x5b, 0x23, 0x24, 0x26, 0xcd, 0x0a, 0xf6, 0xc7, 0x09, 0x35, 0x24,
0x29, 0x91, 0x4e, 0xa7, 0xf0, 0x6b, 0x2c, 0x8f, 0xe5, 0x7d, 0x2c, 0xd4, 0xce, 0xc1, 0x5e, 0x4f,
0xb4, 0xdc, 0x3e, 0x65, 0xeb, 0xac, 0xc0, 0x9b, 0xb0, 0xa2, 0x69, 0xe3, 0xf1, 0x37, 0xb4, 0xe9,
0x07, 0x7e, 0x3b, 0x72, 0xa3, 0x13, 0x56, 0xb2, 0xdf, 0xa3, 0x13, 0x90, 0xc4, 0xfa, 0x1a, 0xe9,
0x3f, 0x08, 0x74, 0x50, 0xf5, 0x44, 0x84, 0x51, 0x57, 0x9f, 0x4f, 0xb9, 0xba, 0xee, 0xd1, 0x67,
0xdd, 0x5a, 0xeb, 0xa2, 0x7d, 0x1b, 0xb3, 0xb6, 0xd1, 0x11, 0xea, 0xd4, 0x7c, 0x1a, 0x67, 0x2d,
0xa4, 0xce, 0x6a, 0xaf, 0x67, 0xd2, 0x91, 0xf1, 0x8d, 0x30, 0x3f, 0xef, 0x46, 0x68, 0x3f, 0x82,
0x0b, 0xce, 0x78, 0xa8, 0xe5, 0x6f, 0x41, 0x55, 0x0e, 0xb2, 0x72, 0xce, 0xb3, 0xce, 0x84, 0xdc,
0xfe, 0xa3, 0x3c, 0x2c, 0x6c, 0x87, 0x4a, 0x44, 0xa1, 0x1b, 0x3c, 0x0c, 0xdc, 0x2e, 0x7f, 0x33,
0x89, 0x55, 0xb3, 0xeb, 0xbf, 0x2c, 0xed, 0x78, 0xd8, 0x7a, 0x6a, 0x5a, 0x62, 0xfc, 0x25, 0x58,
0x16, 0x9e, 0xaf, 0x64, 0xa4, 0x93, 0xb0, 0xe4, 0xf2, 0xc0, 0x0a, 0x30, 0x8d, 0x6e, 0x91, 0x63,
0xec, 0xe9, 0xf5, 0x6b, 0xc2, 0xca, 0x18, 0x36, 0xc9, 0xb0, 0x0a, 0xf6, 0x7f, 0x94, 0x93, 0xdc,
0x62, 0xdf, 0x5c, 0x1e, 0x88, 0xa4, 0x54, 0xa3, 0x96, 0xa7, 0x86, 0x32, 0xff, 0x12, 0x29, 0xcc,
0xf1, 0x2f, 0x91, 0xf7, 0x46, 0xff, 0x12, 0xd1, 0x1b, 0xc2, 0x2b, 0x33, 0x77, 0x19, 0x3a, 0x3f,
0x35, 0xc9, 0x61, 0x4b, 0x64, 0xfe, 0x32, 0xf2, 0xba, 0xa9, 0x08, 0x4a, 0x33, 0x5d, 0x71, 0x62,
0x57, 0xd7, 0xc7, 0x4d, 0xf7, 0x26, 0xaf, 0x44, 0xce, 0x97, 0xee, 0x4c, 0x1d, 0xe8, 0xc3, 0x8b,
0x1e, 0xe8, 0xf3, 0xfb, 0x13, 0xc9, 0x77, 0x6d, 0x66, 0x6f, 0xe5, 0x8c, 0x3f, 0x5e, 0xdc, 0x87,
0x6a, 0xcf, 0x8f, 0x95, 0x8c, 0x4e, 0x28, 0x19, 0x99, 0xbe, 0xbc, 0x9c, 0x99, 0xad, 0x2d, 0x4d,
0x48, 0x87, 0xce, 0x09, 0x97, 0xd5, 0x05, 0x18, 0xcd, 0xe2, 0x94, 0x7b, 0x7c, 0x8d, 0xbf, 0xec,
0x5c, 0x82, 0x4a, 0x3c, 0x6c, 0x8f, 0x7a, 0xd8, 0x06, 0xb2, 0x8e, 0xc1, 0x9a, 0xda, 0xab, 0x77,
0x45, 0xa4, 0xf5, 0xc3, 0xf8, 0x9b, 0xf4, 0xba, 0xcd, 0xe7, 0x53, 0x98, 0xbf, 0x97, 0x5d, 0x1e,
0x6d, 0x42, 0xd7, 0x4e, 0x99, 0xe3, 0x54, 0x72, 0x66, 0x9d, 0xac, 0x7b, 0xd0, 0xc8, 0x0c, 0x1d,
0x43, 0xe8, 0x30, 0xf4, 0x64, 0xd2, 0xc0, 0xc3, 0x67, 0x7d, 0x5f, 0xdb, 0x4b, 0x5a, 0x78, 0xf4,
0x7c, 0xf3, 0xcf, 0x8a, 0xb0, 0x34, 0x6e, 0x2e, 0xd4, 0xca, 0xd4, 0x51, 0x66, 0x27, 0xf0, 0x74,
0xaf, 0x73, 0x1d, 0xb7, 0xb0, 0x4e, 0x34, 0xec, 0xb7, 0x63, 0x9d, 0xdb, 0x51, 0x11, 0xc9, 0xf0,
0xd5, 0xae, 0x4e, 0xf9, 0x08, 0xb1, 0x8c, 0xaf, 0xb6, 0x64, 0x5f, 0xb0, 0x6b, 0xd9, 0xab, 0xaf,
0xb7, 0x93, 0x4b, 0xb2, 0x94, 0x68, 0xbd, 0x8f, 0x19, 0x61, 0x4b, 0x28, 0xb6, 0x86, 0xc5, 0x4d,
0x6b, 0x6f, 0x94, 0x4f, 0xb1, 0x4f, 0x78, 0xdd, 0xdc, 0x24, 0xfa, 0x61, 0x81, 0x2f, 0x66, 0xea,
0x9c, 0x9f, 0x14, 0xf8, 0x0a, 0x5c, 0x58, 0x1f, 0x86, 0x5e, 0x20, 0xbc, 0x14, 0xfb, 0xa7, 0x84,
0x7d, 0x32, 0xde, 0x23, 0x61, 0x9f, 0x63, 0xd8, 0xbd, 0xf8, 0x64, 0xba, 0xf7, 0xc1, 0xfe, 0x60,
0xf2, 0x4d, 0x2a, 0xe9, 0xc7, 0x59, 0xf9, 0x29, 0xfd, 0x0f, 0x4b, 0x88, 0xdd, 0x0e, 0x3d, 0x71,
0x9c, 0xc1, 0xfe, 0x46, 0x89, 0x5f, 0x82, 0x65, 0x43, 0x9b, 0x51, 0xfe, 0x37, 0x4b, 0xfc, 0x22,
0x2c, 0xad, 0xe9, 0x15, 0x33, 0xb3, 0xc2, 0x7e, 0xab, 0x84, 0x43, 0xa2, 0x13, 0xae, 0xdf, 0x2e,
0xf1, 0x65, 0x58, 0xf8, 0x48, 0x46, 0x87, 0x94, 0xb9, 0xe2, 0xdc, 0xfe, 0x08, 0xeb, 0xbd, 0x7a,
0x8a, 0x62, 0xbf, 0x43, 0x22, 0xc6, 0x83, 0x2a, 0xfb, 0xdd, 0xd2, 0xcd, 0xbf, 0xc8, 0x8f, 0xb0,
0xa3, 0x83, 0xec, 0x40, 0x86, 0x5d, 0xa5, 0xaf, 0x04, 0x2f, 0x42, 0x3d, 0xee, 0xc9, 0x48, 0x11,
0x48, 0xfb, 0x56, 0x48, 0x07, 0x56, 0xba, 0xd2, 0xd4, 0x7d, 0x31, 0x7d, 0x28, 0xae, 0xdc, 0x2e,
0x6b, 0xe0, 0x32, 0x79, 0xa8, 0x53, 0x29, 0x4d, 0xbb, 0xe9, 0xe0, 0x2c, 0x39, 0x98, 0x60, 0x15,
0x24, 0x1d, 0x46, 0x81, 0x4e, 0xbf, 0x45, 0xdf, 0xf5, 0x03, 0x7d, 0xf7, 0x6f, 0xd0, 0xc3, 0x22,
0xb2, 0xae, 0xb1, 0xf2, 0x53, 0x5f, 0xdf, 0xb2, 0x33, 0xfb, 0xa1, 0x87, 0x7a, 0xa4, 0x16, 0xc9,
0xc4, 0xfa, 0xcd, 0x7f, 0xfc, 0xf2, 0x6a, 0xfe, 0x8b, 0x2f, 0xaf, 0xe6, 0xff, 0xeb, 0xcb, 0xab,
0xf9, 0xcf, 0xbf, 0xba, 0x9a, 0xfb, 0xe2, 0xab, 0xab, 0xb9, 0x7f, 0xfb, 0xea, 0x6a, 0xee, 0x63,
0x36, 0xf9, 0x0f, 0xbe, 0x76, 0x85, 0x7c, 0xed, 0xee, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x32,
0x7d, 0xca, 0x82, 0xdc, 0x37, 0x00, 0x00,
0xac, 0x75, 0xb5, 0x2b, 0x65, 0x37, 0x10, 0x9a, 0xb4, 0x3d, 0x3c, 0xb8, 0x1d, 0xab, 0x68, 0xd8,
0x51, 0x9a, 0xd8, 0xfe, 0xfd, 0x22, 0x5c, 0x6a, 0xf5, 0xdd, 0x48, 0xad, 0x07, 0xb2, 0x73, 0xd8,
0x0a, 0xdd, 0x41, 0xdc, 0x93, 0x6a, 0xdd, 0x8d, 0x05, 0x7f, 0x15, 0x2a, 0x6d, 0x44, 0xc6, 0xcd,
0xfc, 0xf5, 0xe2, 0xcd, 0xc6, 0x9d, 0x95, 0xd5, 0x31, 0xc1, 0xab, 0xc4, 0xe1, 0x18, 0x1a, 0xfe,
0x3a, 0x54, 0x3d, 0xa1, 0x5c, 0x3f, 0x88, 0x9b, 0x85, 0xeb, 0xf9, 0x9b, 0x8d, 0x3b, 0x97, 0x57,
0x75, 0xc7, 0xab, 0x49, 0xc7, 0xab, 0x2d, 0xea, 0xd8, 0x49, 0xe8, 0xf8, 0x5d, 0xa8, 0x1d, 0xf8,
0x81, 0x78, 0x24, 0x4e, 0xe2, 0x66, 0xf1, 0x6c, 0x9e, 0x94, 0x90, 0xdf, 0x87, 0x25, 0x71, 0xac,
0x22, 0xd7, 0x11, 0x81, 0xab, 0x7c, 0x19, 0xc6, 0xcd, 0x12, 0x69, 0x77, 0x79, 0x42, 0xbb, 0xa4,
0xdd, 0x99, 0x20, 0xe7, 0xd7, 0xa1, 0x21, 0xdb, 0x9f, 0x8a, 0x8e, 0xda, 0x3b, 0x19, 0x88, 0xb8,
0x59, 0xbe, 0x5e, 0xbc, 0x59, 0x77, 0xb2, 0x28, 0xfe, 0x36, 0x34, 0x3a, 0x32, 0x08, 0x44, 0x47,
0xcb, 0xaf, 0x9c, 0xad, 0x5a, 0x96, 0x96, 0xaf, 0xc1, 0x62, 0x64, 0x7a, 0x7a, 0xec, 0x87, 0x87,
0x71, 0xb3, 0x4a, 0xca, 0x5d, 0x39, 0x45, 0x39, 0xa4, 0x71, 0xc6, 0x39, 0xec, 0x3f, 0x79, 0x0f,
0xca, 0x34, 0xb5, 0x7c, 0x09, 0x0a, 0xbe, 0xd7, 0xcc, 0x5f, 0xcf, 0xdf, 0xac, 0x3b, 0x05, 0xdf,
0xe3, 0xb7, 0xa1, 0x72, 0xe0, 0x8b, 0xc0, 0x3b, 0x77, 0x86, 0x0d, 0x19, 0x7f, 0x00, 0x0b, 0x91,
0x88, 0x55, 0xe4, 0x9b, 0x91, 0xe8, 0x49, 0xfe, 0xe6, 0xac, 0x75, 0x5c, 0x75, 0x32, 0x84, 0xce,
0x18, 0x1b, 0xce, 0x58, 0xa7, 0xe7, 0x07, 0x5e, 0x24, 0xc2, 0x6d, 0x4f, 0xcf, 0x77, 0xdd, 0xc9,
0xa2, 0xf8, 0x4d, 0xb8, 0xd0, 0x76, 0x3b, 0x87, 0xdd, 0x48, 0x0e, 0x43, 0x6f, 0x43, 0x06, 0x32,
0x6a, 0x96, 0x49, 0xed, 0x49, 0x34, 0x7f, 0x0d, 0xca, 0x6e, 0xe0, 0x77, 0x43, 0x9a, 0xd5, 0xa5,
0x3b, 0xd6, 0x4c, 0x5d, 0xd6, 0x90, 0xc2, 0xd1, 0x84, 0x7c, 0x0b, 0x16, 0x8f, 0x44, 0xa4, 0xfc,
0x8e, 0x1b, 0x10, 0xbe, 0x59, 0x25, 0x4e, 0x7b, 0x26, 0xe7, 0x7e, 0x96, 0xd2, 0x19, 0x67, 0xe4,
0xdb, 0x00, 0x31, 0x9a, 0x3a, 0x59, 0x6c, 0xb3, 0x41, 0x93, 0xf1, 0xed, 0x99, 0x62, 0x36, 0x64,
0xa8, 0x44, 0xa8, 0x56, 0x5b, 0x29, 0xf9, 0x56, 0xce, 0xc9, 0x30, 0xf3, 0x37, 0xa1, 0xa4, 0xc4,
0xb1, 0x6a, 0x2e, 0x9d, 0x31, 0xa3, 0x89, 0x90, 0x3d, 0x71, 0xac, 0xb6, 0x72, 0x0e, 0x31, 0x20,
0x23, 0x9a, 0x72, 0xf3, 0xc2, 0x1c, 0x8c, 0x0f, 0xfd, 0x40, 0x20, 0x23, 0x32, 0xf0, 0x77, 0xa1,
0x12, 0xb8, 0x27, 0x72, 0xa8, 0x9a, 0x8c, 0x58, 0x7f, 0xe1, 0x4c, 0xd6, 0xc7, 0x44, 0xba, 0x95,
0x73, 0x0c, 0x13, 0x7f, 0x03, 0x8a, 0x9e, 0x7f, 0xd4, 0x5c, 0x26, 0xde, 0xeb, 0x67, 0xf2, 0x6e,
0xfa, 0x47, 0x5b, 0x39, 0x07, 0xc9, 0xf9, 0x06, 0xd4, 0xda, 0x52, 0x1e, 0xf6, 0xdd, 0xe8, 0xb0,
0xc9, 0x89, 0xf5, 0x5b, 0x67, 0xb2, 0xae, 0x1b, 0xe2, 0xad, 0x9c, 0x93, 0x32, 0xe2, 0x90, 0xfd,
0x8e, 0x0c, 0x9b, 0x17, 0xe7, 0x18, 0xf2, 0x76, 0x47, 0x86, 0x38, 0x64, 0x64, 0x40, 0xc6, 0xc0,
0x0f, 0x0f, 0x9b, 0x2b, 0x73, 0x30, 0xe2, 0xde, 0x41, 0x46, 0x64, 0x40, 0xb5, 0x3d, 0x57, 0xb9,
0x47, 0xbe, 0x78, 0xde, 0x7c, 0x69, 0x0e, 0xb5, 0x37, 0x0d, 0x31, 0xaa, 0x9d, 0x30, 0xa2, 0x90,
0x64, 0x63, 0x36, 0x2f, 0xcd, 0x21, 0x24, 0xd9, 0xd3, 0x28, 0x24, 0x61, 0xe4, 0xbf, 0x06, 0xcb,
0x07, 0xc2, 0x55, 0xc3, 0x48, 0x78, 0x23, 0x87, 0x75, 0x99, 0xa4, 0xad, 0x9e, 0xbd, 0xf6, 0x93,
0x5c, 0x5b, 0x39, 0x67, 0x5a, 0x14, 0x7f, 0x07, 0xca, 0x81, 0xab, 0xc4, 0x71, 0xb3, 0x49, 0x32,
0xed, 0x73, 0x8c, 0x42, 0x89, 0xe3, 0xad, 0x9c, 0xa3, 0x59, 0xf8, 0x2f, 0xc3, 0x05, 0xe5, 0xb6,
0x03, 0xb1, 0x73, 0x60, 0x08, 0xe2, 0xe6, 0xcf, 0x91, 0x94, 0x57, 0xcf, 0x36, 0xe7, 0x71, 0x9e,
0xad, 0x9c, 0x33, 0x29, 0x06, 0xb5, 0x22, 0x54, 0xd3, 0x9a, 0x43, 0x2b, 0x92, 0x87, 0x5a, 0x11,
0x0b, 0x7f, 0x0c, 0x0d, 0xfa, 0xd8, 0x90, 0xc1, 0xb0, 0x1f, 0x36, 0xaf, 0x90, 0x84, 0x9b, 0xe7,
0x4b, 0xd0, 0xf4, 0x5b, 0x39, 0x27, 0xcb, 0x8e, 0x8b, 0x48, 0xa0, 0x23, 0x9f, 0x37, 0xaf, 0xce,
0xb1, 0x88, 0x7b, 0x86, 0x18, 0x17, 0x31, 0x61, 0xb4, 0x7e, 0x00, 0x0b, 0x59, 0xef, 0xc8, 0x39,
0x94, 0x22, 0xe1, 0x6a, 0xcf, 0x5c, 0x73, 0xe8, 0x1b, 0x71, 0xc2, 0xf3, 0x15, 0x79, 0xe6, 0x9a,
0x43, 0xdf, 0xfc, 0x12, 0x54, 0x22, 0xd1, 0x97, 0x47, 0x82, 0x1c, 0x6f, 0xcd, 0x31, 0x10, 0xd2,
0x7a, 0x91, 0xdb, 0x6d, 0x96, 0x34, 0x2d, 0x7e, 0x23, 0xad, 0x17, 0xc9, 0xc1, 0x4e, 0x48, 0x8e,
0xb3, 0xe6, 0x18, 0xc8, 0xfa, 0xbd, 0xd7, 0xa0, 0x6a, 0x94, 0xb3, 0xfe, 0x38, 0x0f, 0x15, 0xbd,
0xb1, 0xf9, 0x7d, 0x28, 0xc7, 0xea, 0x24, 0x10, 0xa4, 0xc3, 0xd2, 0x9d, 0xef, 0xcc, 0xe1, 0x0c,
0x56, 0x5b, 0xc8, 0xe0, 0x68, 0x3e, 0xdb, 0x81, 0x32, 0xc1, 0xbc, 0x0a, 0x45, 0x47, 0x3e, 0x67,
0x39, 0x0e, 0x50, 0xd1, 0x93, 0xc6, 0xf2, 0x88, 0xdc, 0xf4, 0x8f, 0x58, 0x01, 0x91, 0x5b, 0xc2,
0xf5, 0x44, 0xc4, 0x8a, 0x7c, 0x11, 0xea, 0xc9, 0xf4, 0xc4, 0xac, 0xc4, 0x19, 0x2c, 0x64, 0x26,
0x3e, 0x66, 0x65, 0xeb, 0x7f, 0x4a, 0x50, 0xc2, 0x7d, 0xc8, 0x5f, 0x86, 0x45, 0xe5, 0x46, 0x5d,
0xa1, 0x83, 0x8a, 0xed, 0xe4, 0x0c, 0x1b, 0x47, 0xf2, 0x77, 0x93, 0x31, 0x14, 0x68, 0x0c, 0xdf,
0x3e, 0x77, 0x7f, 0x8f, 0x8d, 0x20, 0x73, 0x1a, 0x16, 0xe7, 0x3b, 0x0d, 0x1f, 0x42, 0x0d, 0xdd,
0x4a, 0xcb, 0xff, 0x81, 0xa0, 0xa9, 0x5f, 0xba, 0x73, 0xeb, 0xfc, 0x2e, 0xb7, 0x0d, 0x87, 0x93,
0xf2, 0xf2, 0x6d, 0xa8, 0x77, 0xdc, 0xc8, 0x23, 0x65, 0x68, 0xb5, 0x96, 0xee, 0xbc, 0x72, 0xbe,
0xa0, 0x8d, 0x84, 0xc5, 0x19, 0x71, 0xf3, 0x1d, 0x68, 0x78, 0x22, 0xee, 0x44, 0xfe, 0x80, 0xdc,
0x8c, 0x3e, 0x13, 0xbf, 0x7b, 0xbe, 0xb0, 0xcd, 0x11, 0x93, 0x93, 0x95, 0xc0, 0xaf, 0x42, 0x3d,
0x4a, 0xfd, 0x4c, 0x95, 0x0e, 0xea, 0x11, 0xc2, 0x7e, 0x13, 0x6a, 0xc9, 0x78, 0xf8, 0x02, 0xd4,
0xf0, 0xf7, 0xa9, 0x0c, 0x05, 0xcb, 0xe1, 0xda, 0x22, 0xd4, 0xea, 0xbb, 0x41, 0xc0, 0xf2, 0x7c,
0x09, 0x00, 0xc1, 0x27, 0xc2, 0xf3, 0x87, 0x7d, 0x56, 0xb0, 0x7f, 0x31, 0xb1, 0x96, 0x1a, 0x94,
0x76, 0xdd, 0x2e, 0x72, 0x2c, 0x40, 0x2d, 0x71, 0x9b, 0x2c, 0x8f, 0xfc, 0x9b, 0x6e, 0xdc, 0x6b,
0x4b, 0x37, 0xf2, 0x58, 0x81, 0x37, 0xa0, 0xba, 0x16, 0x75, 0x7a, 0xfe, 0x91, 0x60, 0x45, 0xfb,
0x36, 0x34, 0x32, 0xfa, 0xa2, 0x08, 0xd3, 0x69, 0x1d, 0xca, 0x6b, 0x9e, 0x27, 0x3c, 0x96, 0x47,
0x06, 0x33, 0x40, 0x56, 0xb0, 0x5f, 0x81, 0x7a, 0x3a, 0x5b, 0x48, 0x8e, 0x07, 0x28, 0xcb, 0xe1,
0x17, 0xa2, 0x59, 0x1e, 0xad, 0x72, 0x3b, 0x0c, 0xfc, 0x50, 0xb0, 0x82, 0xf5, 0x09, 0x99, 0x2a,
0xff, 0xa5, 0xf1, 0x0d, 0x71, 0xe3, 0xbc, 0x13, 0x6e, 0x7c, 0x37, 0x5c, 0xc9, 0x8c, 0xef, 0xb1,
0x4f, 0xca, 0xd5, 0xa0, 0xb4, 0x29, 0x55, 0xcc, 0xf2, 0xd6, 0x7f, 0x17, 0xa0, 0x96, 0x1c, 0x6c,
0x9c, 0x41, 0x71, 0x18, 0x05, 0xc6, 0xa0, 0xf1, 0x93, 0xaf, 0x40, 0x59, 0xf9, 0xca, 0x98, 0x71,
0xdd, 0xd1, 0x00, 0xc6, 0x4c, 0xd9, 0x95, 0x2d, 0x52, 0xdb, 0xe4, 0x52, 0xf9, 0x7d, 0xb7, 0x2b,
0xb6, 0xdc, 0xb8, 0x47, 0xf6, 0x58, 0x77, 0x46, 0x08, 0xe4, 0x3f, 0x70, 0x8f, 0xd0, 0xe6, 0xa8,
0x5d, 0x47, 0x53, 0x59, 0x14, 0xbf, 0x0b, 0x25, 0x1c, 0xa0, 0x31, 0x9a, 0x9f, 0x9f, 0x18, 0x30,
0x9a, 0xc9, 0x6e, 0x24, 0x70, 0x79, 0x56, 0x31, 0xaa, 0x75, 0x88, 0x98, 0xdf, 0x80, 0x25, 0xbd,
0x09, 0x77, 0x28, 0xde, 0xdd, 0xf6, 0x28, 0x9a, 0xaa, 0x3b, 0x13, 0x58, 0xbe, 0x86, 0xd3, 0xe9,
0x2a, 0xd1, 0xac, 0xcd, 0x61, 0xdf, 0xc9, 0xe4, 0xac, 0xb6, 0x90, 0xc5, 0xd1, 0x9c, 0xf6, 0x3d,
0x9c, 0x53, 0x57, 0x09, 0x5c, 0xe6, 0x07, 0xfd, 0x81, 0x3a, 0xd1, 0x46, 0xf3, 0x50, 0xa8, 0x4e,
0xcf, 0x0f, 0xbb, 0x2c, 0xaf, 0xa7, 0x18, 0x17, 0x91, 0x48, 0xa2, 0x48, 0x46, 0xac, 0x68, 0x59,
0x50, 0x42, 0x1b, 0x45, 0x27, 0x19, 0xba, 0x7d, 0x61, 0x66, 0x9a, 0xbe, 0xad, 0x8b, 0xb0, 0x3c,
0x75, 0x2e, 0x5a, 0x7f, 0x5d, 0xd1, 0x16, 0x82, 0x1c, 0x14, 0x93, 0x19, 0x0e, 0x0a, 0xb7, 0x5e,
0xc8, 0xc7, 0xa0, 0x94, 0x71, 0x1f, 0xf3, 0x2e, 0x94, 0x71, 0x60, 0x89, 0x8b, 0x99, 0x83, 0xfd,
0x09, 0x92, 0x3b, 0x9a, 0x8b, 0x37, 0xa1, 0xda, 0xe9, 0x89, 0xce, 0xa1, 0xf0, 0x8c, 0xaf, 0x4f,
0x40, 0x34, 0x9a, 0x4e, 0x26, 0x4c, 0xd6, 0x00, 0x99, 0x44, 0x47, 0x86, 0x0f, 0xfa, 0xf2, 0x53,
0x9f, 0xd6, 0x15, 0x4d, 0x22, 0x41, 0x24, 0xad, 0xdb, 0x68, 0x23, 0x66, 0xd9, 0x46, 0x08, 0xeb,
0x01, 0x94, 0xa9, 0x6f, 0xdc, 0x09, 0x5a, 0x67, 0x9d, 0xb5, 0xdd, 0x98, 0x4f, 0x67, 0xa3, 0xb2,
0xf5, 0xd3, 0x02, 0x94, 0x10, 0xe6, 0xb7, 0xa0, 0x1c, 0xb9, 0x61, 0x57, 0x2f, 0xc0, 0x74, 0xf2,
0xe7, 0x60, 0x9b, 0xa3, 0x49, 0xf8, 0x7d, 0x63, 0x8a, 0x85, 0x39, 0x8c, 0x25, 0xed, 0x31, 0x6b,
0x96, 0x2b, 0x50, 0x1e, 0xb8, 0x91, 0xdb, 0x37, 0xfb, 0x44, 0x03, 0xf6, 0x4f, 0xf2, 0x50, 0x42,
0x22, 0xbe, 0x0c, 0x8b, 0x2d, 0x15, 0xf9, 0x87, 0x42, 0xf5, 0x22, 0x39, 0xec, 0xf6, 0xb4, 0x25,
0x3d, 0x12, 0x27, 0xda, 0xdf, 0x68, 0x87, 0xa0, 0xdc, 0xc0, 0xef, 0xb0, 0x02, 0x5a, 0xd5, 0xba,
0x0c, 0x3c, 0x56, 0xe4, 0x17, 0xa0, 0xf1, 0x2c, 0xf4, 0x44, 0x14, 0x77, 0x64, 0x24, 0x3c, 0x56,
0x32, 0xbb, 0xfb, 0x90, 0x95, 0xe9, 0x2c, 0x13, 0xc7, 0x8a, 0x72, 0x12, 0x56, 0xe1, 0x17, 0xe1,
0xc2, 0xfa, 0x78, 0xa2, 0xc2, 0xaa, 0xe8, 0x93, 0x9e, 0x88, 0x10, 0x8d, 0x8c, 0xd5, 0xb4, 0x11,
0xcb, 0x4f, 0x7d, 0x56, 0xc7, 0xce, 0xf4, 0x3e, 0x61, 0x60, 0xff, 0x6d, 0x3e, 0xf1, 0x1c, 0x8b,
0x50, 0xdf, 0x75, 0x23, 0xb7, 0x1b, 0xb9, 0x03, 0xd4, 0xaf, 0x01, 0x55, 0x7d, 0x70, 0xbe, 0xae,
0xbd, 0x9b, 0x06, 0xee, 0x68, 0xdf, 0xa8, 0x81, 0xbb, 0xac, 0x38, 0x02, 0xde, 0x60, 0x25, 0xec,
0xe3, 0xc3, 0xa1, 0x54, 0x82, 0x95, 0xc9, 0xd7, 0x49, 0x4f, 0xb0, 0x0a, 0x22, 0xf7, 0xd0, 0xa3,
0xb0, 0x2a, 0x8e, 0x79, 0x03, 0xed, 0xa7, 0x2d, 0x8f, 0x59, 0x0d, 0xd5, 0xc0, 0x69, 0x14, 0x1e,
0xab, 0x63, 0xcb, 0xd3, 0x61, 0xbf, 0x2d, 0x70, 0x98, 0x80, 0x2d, 0x7b, 0xb2, 0xdb, 0x0d, 0x04,
0x6b, 0xe0, 0x1c, 0x64, 0x9c, 0x2f, 0x5b, 0x20, 0x4f, 0xeb, 0x06, 0x81, 0x1c, 0x2a, 0xb6, 0x68,
0x7d, 0x51, 0x84, 0x12, 0x66, 0x19, 0xb8, 0x77, 0x7a, 0xe8, 0x67, 0xcc, 0xde, 0xc1, 0xef, 0x74,
0x07, 0x16, 0x46, 0x3b, 0x90, 0xbf, 0x63, 0x56, 0xba, 0x38, 0x87, 0x97, 0x45, 0xc1, 0xd9, 0x45,
0xe6, 0x50, 0xea, 0xfb, 0x7d, 0x61, 0x7c, 0x1d, 0x7d, 0x23, 0x2e, 0xc6, 0xf3, 0x18, 0xb7, 0x41,
0xd1, 0xa1, 0x6f, 0xdc, 0x35, 0x2e, 0x1e, 0x0b, 0x6b, 0x8a, 0xf6, 0x40, 0xd1, 0x49, 0x40, 0xbd,
0x9b, 0xd1, 0x2b, 0x55, 0xe7, 0xd8, 0xcd, 0xd4, 0x7d, 0xd6, 0x23, 0x8d, 0x9c, 0x41, 0x6d, 0x7e,
0xf6, 0xcc, 0x21, 0xb1, 0x69, 0xac, 0x71, 0x74, 0x80, 0xd5, 0xf4, 0xec, 0xb1, 0x3c, 0xae, 0x12,
0x6d, 0x43, 0xed, 0xcb, 0xf6, 0x7d, 0x4f, 0x48, 0x56, 0xa4, 0x03, 0x6e, 0xe8, 0xf9, 0x92, 0x95,
0x30, 0xa2, 0xda, 0xdd, 0x7c, 0xc8, 0xca, 0xf6, 0x8d, 0xcc, 0x51, 0xb3, 0x36, 0x54, 0x52, 0x8b,
0x21, 0xb3, 0xcc, 0x6b, 0x2b, 0x6b, 0x0b, 0x8f, 0x15, 0xec, 0xef, 0xcd, 0x70, 0x9f, 0x8b, 0x50,
0x7f, 0x36, 0x08, 0xa4, 0xeb, 0x9d, 0xe1, 0x3f, 0x17, 0x00, 0x46, 0x59, 0xab, 0xf5, 0x77, 0xd6,
0xe8, 0x98, 0xc6, 0x18, 0x33, 0x96, 0xc3, 0xa8, 0x23, 0xc8, 0x35, 0xd4, 0x1d, 0x03, 0xf1, 0xf7,
0xa1, 0x8c, 0xed, 0x71, 0xb3, 0x40, 0x1e, 0xe3, 0xd6, 0x5c, 0xb9, 0xd2, 0xea, 0xbe, 0x2f, 0x9e,
0x3b, 0x9a, 0x91, 0xdf, 0xcb, 0x86, 0x1d, 0xe7, 0xd4, 0x63, 0x46, 0x94, 0xfc, 0x1a, 0x80, 0xdb,
0x51, 0xfe, 0x91, 0x40, 0x59, 0x66, 0xef, 0x67, 0x30, 0xdc, 0x81, 0x06, 0x6e, 0xc9, 0xc1, 0x4e,
0x84, 0xbb, 0xb8, 0xb9, 0x40, 0x82, 0x5f, 0x9b, 0x4f, 0xbd, 0x0f, 0x52, 0x46, 0x27, 0x2b, 0x84,
0x3f, 0x83, 0x05, 0x5d, 0xeb, 0x31, 0x42, 0x17, 0x49, 0xe8, 0xeb, 0xf3, 0x09, 0xdd, 0x19, 0x71,
0x3a, 0x63, 0x62, 0xa6, 0x0b, 0x3f, 0xe5, 0x17, 0x2d, 0xfc, 0x58, 0x7f, 0x53, 0x86, 0x12, 0x0d,
0x7b, 0xb2, 0xee, 0xb3, 0x31, 0xe6, 0x5e, 0x6f, 0xcf, 0xbf, 0x3c, 0x13, 0xbb, 0x8f, 0x76, 0x73,
0x31, 0xb3, 0x9b, 0xdf, 0x87, 0x72, 0x2c, 0x23, 0x95, 0x2c, 0xd9, 0x9c, 0x0b, 0xdf, 0x92, 0x91,
0x72, 0x34, 0x23, 0x7f, 0x08, 0xd5, 0x03, 0x3f, 0x50, 0x38, 0x91, 0x7a, 0xc0, 0xaf, 0xce, 0x27,
0xe3, 0x21, 0x31, 0x39, 0x09, 0x33, 0x7f, 0x9c, 0x35, 0xa0, 0x0a, 0x49, 0x5a, 0x9d, 0x4f, 0xd2,
0x2c, 0xbb, 0xba, 0x05, 0xac, 0x23, 0x8f, 0x44, 0x94, 0xb4, 0x3d, 0x12, 0x27, 0xe6, 0xc0, 0x9c,
0xc2, 0x73, 0x0b, 0x6a, 0x3d, 0xdf, 0x13, 0x18, 0x73, 0x90, 0x5f, 0xa8, 0x39, 0x29, 0xcc, 0x1f,
0x41, 0x8d, 0x62, 0x75, 0xf4, 0x50, 0xf5, 0x17, 0x9e, 0x7c, 0x9d, 0x36, 0x24, 0x02, 0xb0, 0x23,
0xea, 0xfc, 0xa1, 0xaf, 0x9a, 0xa0, 0x3b, 0x4a, 0x60, 0x54, 0x98, 0x6c, 0x34, 0xab, 0x70, 0x43,
0x2b, 0x3c, 0x89, 0xe7, 0x6f, 0xc0, 0x4b, 0x84, 0x9b, 0x38, 0xb0, 0x70, 0x7b, 0xa0, 0xd0, 0xd9,
0x8d, 0xf6, 0x1b, 0xc6, 0x79, 0xe1, 0x71, 0x82, 0x59, 0x5b, 0xe2, 0x76, 0x62, 0xa5, 0xcf, 0xa7,
0x0f, 0xdc, 0x20, 0x10, 0xd1, 0x89, 0x4e, 0xf9, 0x1e, 0xb9, 0x61, 0xdb, 0x0d, 0x59, 0xd1, 0xbe,
0x09, 0x25, 0xd2, 0xbd, 0x0e, 0x65, 0x9d, 0x1a, 0x50, 0x9a, 0x68, 0xd2, 0x02, 0x72, 0x57, 0x8f,
0x31, 0x6e, 0x64, 0x05, 0xeb, 0xaf, 0x8a, 0x50, 0x4b, 0xb4, 0xc4, 0x20, 0xf9, 0x50, 0x9c, 0x24,
0x41, 0xf2, 0xa1, 0x38, 0xa1, 0xd8, 0x25, 0xde, 0xf7, 0x63, 0xbf, 0x6d, 0x62, 0xb1, 0x9a, 0x33,
0x42, 0xe0, 0xf1, 0xff, 0xdc, 0xf7, 0x54, 0x8f, 0x8c, 0xb3, 0xec, 0x68, 0x80, 0xdf, 0x84, 0x0b,
0x9e, 0xab, 0xc4, 0x76, 0xd8, 0x09, 0x86, 0x9e, 0xd8, 0xc3, 0xa3, 0x43, 0xe7, 0xc6, 0x93, 0x68,
0xfe, 0x7d, 0x00, 0xe5, 0xf7, 0xc5, 0x43, 0x19, 0xf5, 0x5d, 0x65, 0x02, 0xe2, 0xb7, 0x5f, 0xcc,
0x7c, 0x56, 0xf7, 0x52, 0x01, 0x4e, 0x46, 0x18, 0x8a, 0xc6, 0xde, 0x8c, 0xe8, 0xea, 0xd7, 0x12,
0xbd, 0x99, 0x0a, 0x70, 0x32, 0xc2, 0xec, 0x5f, 0x01, 0x18, 0xb5, 0xf0, 0x4b, 0xc0, 0x9f, 0xc8,
0x50, 0xf5, 0xd6, 0xda, 0xed, 0x68, 0x5d, 0x1c, 0xc8, 0x48, 0x6c, 0xba, 0xe8, 0xf3, 0x5f, 0x82,
0xe5, 0x14, 0xbf, 0x76, 0xa0, 0x44, 0x84, 0x68, 0x9a, 0xfa, 0x56, 0x4f, 0x46, 0x4a, 0x07, 0x14,
0xf4, 0xf9, 0xac, 0xc5, 0x8a, 0x78, 0xce, 0x6c, 0xb7, 0x76, 0x58, 0xc9, 0xbe, 0x09, 0x30, 0x1a,
0x12, 0x05, 0xde, 0xf4, 0xf5, 0xfa, 0x1d, 0x13, 0x86, 0x13, 0x74, 0xe7, 0x0d, 0x96, 0xb7, 0xfe,
0x39, 0x0f, 0x25, 0xdc, 0xd3, 0x98, 0x73, 0x64, 0x0d, 0x50, 0x2f, 0x5f, 0x16, 0xf5, 0xf5, 0x3c,
0x11, 0xca, 0xce, 0x7a, 0xa2, 0xb7, 0xa0, 0xd1, 0x19, 0xc6, 0x4a, 0xf6, 0xc9, 0x75, 0x36, 0x8b,
0xb4, 0xdb, 0x2f, 0x4d, 0x65, 0xef, 0xfb, 0x6e, 0x30, 0x14, 0x4e, 0x96, 0xd4, 0xfe, 0x96, 0x31,
0xe2, 0x2a, 0x14, 0xd7, 0xe2, 0x8e, 0x49, 0xd2, 0x44, 0xdc, 0xd1, 0x11, 0xe0, 0x06, 0x51, 0xb2,
0x82, 0xf5, 0xef, 0x15, 0xa8, 0x68, 0x07, 0xc3, 0x3f, 0x84, 0x9a, 0x1c, 0x88, 0xc8, 0x55, 0x32,
0x32, 0x99, 0xe1, 0xbd, 0x17, 0x71, 0x50, 0xab, 0x3b, 0x86, 0xd9, 0x49, 0xc5, 0x4c, 0xce, 0x52,
0x61, 0x7a, 0x96, 0x6e, 0x01, 0x4b, 0x7c, 0xd1, 0x6e, 0x84, 0x7c, 0xea, 0xc4, 0xc4, 0xf9, 0x53,
0x78, 0xbe, 0x07, 0xf5, 0x8e, 0x0c, 0x3d, 0x3f, 0xcd, 0x12, 0x97, 0xee, 0x7c, 0xef, 0x85, 0x34,
0xdc, 0x48, 0xb8, 0x9d, 0x91, 0x20, 0xfe, 0x2a, 0x94, 0x8f, 0x70, 0xfa, 0x28, 0xd6, 0x3a, 0x7d,
0x72, 0x35, 0x11, 0xff, 0x18, 0x1a, 0x9f, 0x0d, 0xfd, 0xce, 0xe1, 0x4e, 0xb6, 0x0a, 0xf1, 0xd6,
0x0b, 0x69, 0xf1, 0xe1, 0x88, 0xdf, 0xc9, 0x0a, 0xb3, 0xaf, 0x40, 0x2d, 0x99, 0x43, 0x5a, 0xb6,
0xd0, 0x63, 0x39, 0x5e, 0x81, 0xc2, 0x4e, 0xc4, 0xf2, 0xf6, 0x57, 0x79, 0xa8, 0xa7, 0xfa, 0x8f,
0x17, 0x06, 0x1e, 0x7c, 0x36, 0x74, 0x03, 0x96, 0xa7, 0xc8, 0x56, 0x2a, 0x0d, 0x91, 0xa9, 0x7f,
0x10, 0x09, 0x57, 0x51, 0x3d, 0x0a, 0xfd, 0x97, 0x88, 0x63, 0x56, 0xe2, 0x1c, 0x96, 0x0c, 0x7a,
0x27, 0xd2, 0xa4, 0x65, 0x0c, 0x7c, 0xb1, 0x35, 0x41, 0x54, 0xb4, 0xbb, 0x3b, 0x14, 0x3a, 0xb0,
0x7f, 0x2a, 0x15, 0x01, 0x35, 0xd4, 0x65, 0x3b, 0x64, 0x75, 0xec, 0xf3, 0xa9, 0x54, 0xdb, 0x21,
0x83, 0x51, 0xc4, 0xd5, 0x48, 0xba, 0x27, 0x68, 0x81, 0xe2, 0xb9, 0x20, 0xd8, 0x0e, 0xd9, 0xa2,
0x69, 0xd0, 0xd0, 0x12, 0x4a, 0x7c, 0x70, 0xec, 0x76, 0x90, 0xfd, 0x02, 0x5f, 0x02, 0x40, 0x1e,
0x03, 0x33, 0xfb, 0x9f, 0xf2, 0xd0, 0xc8, 0xcc, 0x0f, 0x46, 0x71, 0xd4, 0x88, 0x9b, 0x5f, 0x07,
0x75, 0xdf, 0x17, 0xb1, 0x12, 0x91, 0x97, 0x6c, 0xec, 0x3d, 0x89, 0x9f, 0x05, 0xec, 0x63, 0x4f,
0xf6, 0x65, 0x14, 0xc9, 0xe7, 0xac, 0x88, 0xd0, 0x63, 0x37, 0x56, 0x1f, 0x09, 0x71, 0xc8, 0x4a,
0x38, 0xbc, 0x8d, 0x61, 0x14, 0x89, 0x50, 0x23, 0xca, 0xa4, 0x90, 0x38, 0xd6, 0x50, 0x05, 0x85,
0x22, 0x31, 0x79, 0x0e, 0x56, 0xe5, 0x0c, 0x16, 0x0c, 0xb5, 0xc6, 0xd4, 0x90, 0x00, 0xc9, 0x35,
0x58, 0xc7, 0x04, 0x48, 0x27, 0x10, 0x3b, 0x07, 0x9b, 0xee, 0x49, 0xbc, 0xd6, 0x95, 0x0c, 0x26,
0x91, 0x4f, 0xe5, 0x73, 0xd6, 0xb0, 0x86, 0x00, 0xa3, 0xd0, 0x0a, 0x43, 0x4a, 0x34, 0x83, 0xb4,
0xc4, 0x67, 0x20, 0xbe, 0x03, 0x80, 0x5f, 0x44, 0x99, 0xc4, 0x95, 0x2f, 0x70, 0x76, 0x12, 0x9f,
0x93, 0x11, 0x61, 0xfd, 0x3a, 0xd4, 0xd3, 0x06, 0xcc, 0x10, 0xe8, 0x94, 0x4b, 0xbb, 0x4d, 0x40,
0x3c, 0x49, 0xfc, 0xd0, 0x13, 0xc7, 0xb4, 0x2d, 0xcb, 0x8e, 0x06, 0x50, 0xcb, 0x9e, 0xef, 0x79,
0x22, 0x4c, 0x0a, 0xb1, 0x1a, 0x9a, 0x75, 0x6d, 0x55, 0x9a, 0x79, 0x6d, 0x65, 0xfd, 0x2a, 0x34,
0x32, 0xb1, 0xdf, 0xa9, 0xc3, 0xce, 0x28, 0x56, 0x18, 0x57, 0xec, 0x2a, 0xd4, 0xa5, 0x29, 0xae,
0xc4, 0xe4, 0xf2, 0xea, 0xce, 0x08, 0x61, 0xfd, 0x65, 0x01, 0xca, 0x7a, 0x68, 0x93, 0xb1, 0xdf,
0x43, 0xa8, 0x60, 0xf2, 0x32, 0x4c, 0xee, 0xfc, 0xe6, 0x8c, 0xaf, 0x5a, 0xc4, 0xb3, 0x95, 0x73,
0x0c, 0x37, 0x7f, 0x17, 0x8a, 0xca, 0xed, 0x9a, 0x3a, 0xc6, 0x77, 0xe6, 0x13, 0xb2, 0xe7, 0x76,
0xb7, 0x72, 0x0e, 0xf2, 0xf1, 0xc7, 0x50, 0xeb, 0x98, 0xd4, 0xd3, 0xf8, 0x94, 0x39, 0xc3, 0xb3,
0x24, 0x61, 0xdd, 0xca, 0x39, 0xa9, 0x04, 0xfe, 0x3e, 0x94, 0xf0, 0x1c, 0x24, 0xa7, 0x38, 0x77,
0xd8, 0x89, 0xdb, 0x65, 0x2b, 0xe7, 0x10, 0xe7, 0x7a, 0x15, 0xca, 0xe4, 0xc2, 0xac, 0x26, 0x54,
0xf4, 0x58, 0x27, 0x67, 0xce, 0xba, 0x0c, 0xc5, 0x3d, 0xb7, 0x8b, 0xb1, 0x88, 0xef, 0xc5, 0x26,
0xe3, 0xc1, 0x4f, 0xeb, 0xe5, 0x51, 0x1a, 0x9d, 0xad, 0xd0, 0xe4, 0xc7, 0x2a, 0x34, 0x56, 0x05,
0x4a, 0xd8, 0xa3, 0x75, 0xf5, 0xac, 0xb8, 0xc6, 0xba, 0x82, 0x11, 0x90, 0x12, 0xc7, 0xb3, 0x8a,
0x4f, 0xd6, 0x32, 0x5c, 0x98, 0xb8, 0x2c, 0xb1, 0xaa, 0x26, 0xfc, 0xb2, 0x16, 0xa1, 0x91, 0xa9,
0x9e, 0x5b, 0x37, 0xa0, 0x96, 0xd4, 0xd6, 0x31, 0x50, 0xf4, 0x63, 0x5d, 0x15, 0x30, 0x4a, 0xa5,
0xb0, 0x7d, 0x00, 0xb5, 0x5d, 0x19, 0x4f, 0xfa, 0xcb, 0x2a, 0x14, 0xf7, 0xe4, 0x40, 0x9f, 0x82,
0xeb, 0x52, 0xd1, 0x29, 0xa8, 0xdd, 0xe3, 0x81, 0xd2, 0x69, 0xa8, 0xe3, 0x77, 0x7b, 0x4a, 0x97,
0x18, 0xb6, 0xc3, 0x50, 0x44, 0xac, 0x8c, 0x3e, 0xcb, 0x11, 0x83, 0xc0, 0xed, 0x08, 0x56, 0x41,
0x9f, 0x45, 0xf8, 0x87, 0x7e, 0x14, 0x2b, 0x56, 0xb5, 0xdf, 0x44, 0x4f, 0xe7, 0x77, 0xc9, 0x59,
0xd1, 0x07, 0x89, 0xca, 0xa1, 0xdb, 0x21, 0x70, 0x43, 0x84, 0xe8, 0x84, 0xa9, 0x52, 0xac, 0xef,
0x5a, 0xa9, 0x83, 0x82, 0xfd, 0x11, 0x2c, 0x8e, 0xdd, 0xc1, 0xf2, 0x15, 0x60, 0x63, 0x08, 0x54,
0x34, 0xc7, 0x2f, 0xc3, 0xc5, 0x31, 0xec, 0x13, 0xdf, 0xf3, 0x28, 0x91, 0x9e, 0x6c, 0x48, 0x86,
0xb3, 0x5e, 0x87, 0x6a, 0x47, 0xcf, 0xa2, 0xbd, 0x0b, 0x8b, 0x64, 0x23, 0x4f, 0x84, 0x72, 0x77,
0xc2, 0xe0, 0xe4, 0xff, 0x7d, 0x51, 0x6e, 0xbf, 0x02, 0x65, 0x2a, 0x68, 0xe1, 0x32, 0x1e, 0x44,
0xb2, 0x4f, 0xb2, 0xca, 0x0e, 0x7d, 0xa3, 0x74, 0x25, 0x8d, 0x43, 0x29, 0x28, 0x69, 0xff, 0x4b,
0x1d, 0xaa, 0x6b, 0x9d, 0x8e, 0x1c, 0x86, 0x6a, 0xaa, 0xe7, 0x59, 0x35, 0x93, 0x7b, 0x50, 0x71,
0x8f, 0x5c, 0xe5, 0x46, 0x66, 0xf7, 0x7d, 0x63, 0xc2, 0xde, 0x8d, 0xac, 0xd5, 0x35, 0x22, 0x72,
0x0c, 0x31, 0xb2, 0x75, 0x64, 0x78, 0xe0, 0x77, 0xcd, 0x86, 0x3b, 0x8d, 0x6d, 0x83, 0x88, 0x1c,
0x43, 0x8c, 0x6c, 0xc6, 0x61, 0x94, 0xcf, 0x64, 0xd3, 0xbb, 0x26, 0xf5, 0x0f, 0xb7, 0xa1, 0xe4,
0x87, 0x07, 0xd2, 0x3c, 0x76, 0xb8, 0x72, 0x0a, 0xd3, 0x76, 0x78, 0x20, 0x1d, 0x22, 0xb4, 0x04,
0x54, 0xb4, 0xc2, 0xfc, 0x6d, 0x28, 0x53, 0xdd, 0xda, 0x54, 0x0a, 0xe7, 0xba, 0xd3, 0xd6, 0x1c,
0xfc, 0x52, 0x52, 0x06, 0xa5, 0xf9, 0x42, 0x3c, 0x81, 0xeb, 0xb5, 0x64, 0xca, 0xac, 0xff, 0xcc,
0x43, 0x45, 0x8f, 0x90, 0xdf, 0x80, 0x25, 0x11, 0xe2, 0x26, 0x49, 0x5c, 0x82, 0xd9, 0x1d, 0x13,
0x58, 0x0c, 0xd0, 0x0c, 0x46, 0xb4, 0x87, 0x5d, 0x93, 0x6d, 0x64, 0x51, 0xfc, 0x2d, 0xb8, 0xac,
0xc1, 0xdd, 0x48, 0x44, 0x22, 0x10, 0x6e, 0x2c, 0x36, 0x7a, 0x6e, 0x18, 0x8a, 0xc0, 0x1c, 0x10,
0xa7, 0x35, 0x73, 0x1b, 0x16, 0x74, 0x53, 0x6b, 0xe0, 0x76, 0x44, 0x6c, 0xca, 0xba, 0x63, 0x38,
0xfe, 0x5d, 0x28, 0xd3, 0x93, 0x93, 0xa6, 0x77, 0xb6, 0xf1, 0x69, 0x2a, 0x4b, 0xa6, 0x1e, 0x6c,
0x0d, 0x40, 0xaf, 0x06, 0x06, 0xb9, 0x26, 0x5c, 0xfd, 0xe6, 0x99, 0xcb, 0x47, 0x51, 0x75, 0x86,
0x09, 0xf5, 0xf3, 0x44, 0x20, 0xd0, 0x3f, 0xa0, 0xf7, 0xa2, 0xc1, 0x17, 0x9d, 0x31, 0x9c, 0xf5,
0xf7, 0x45, 0x28, 0xe1, 0x42, 0x22, 0x71, 0x4f, 0xf6, 0x45, 0x7a, 0x15, 0xa0, 0x8d, 0x76, 0x0c,
0x87, 0x47, 0xa4, 0xab, 0x6f, 0x72, 0x52, 0x32, 0x5d, 0x41, 0x98, 0x44, 0x23, 0xe5, 0x20, 0x92,
0x07, 0x7e, 0x30, 0xa2, 0x34, 0x87, 0xe9, 0x04, 0x1a, 0xa7, 0xbf, 0xef, 0x46, 0x87, 0x42, 0x91,
0xf7, 0x41, 0xbd, 0x53, 0x0e, 0x1d, 0x26, 0x9f, 0xd6, 0xcc, 0xdf, 0x87, 0x2b, 0x99, 0xa6, 0xc4,
0x2f, 0xa7, 0xdc, 0xba, 0x64, 0x7e, 0x16, 0xc9, 0x84, 0x84, 0x3d, 0xd1, 0x1f, 0x04, 0xae, 0x12,
0x13, 0xb7, 0x21, 0x67, 0x91, 0xa0, 0x7b, 0xf6, 0xc4, 0x91, 0xdf, 0x11, 0xdb, 0x1e, 0x15, 0x0c,
0xea, 0x4e, 0x0a, 0xf3, 0x6b, 0x00, 0x5d, 0x57, 0x89, 0xe7, 0xee, 0xc9, 0xb3, 0x28, 0x68, 0x0a,
0x5d, 0xd0, 0x1a, 0x61, 0x30, 0x33, 0x08, 0x64, 0xc7, 0x0d, 0x5a, 0x4a, 0x46, 0x6e, 0x57, 0xec,
0xba, 0xaa, 0xd7, 0xec, 0xea, 0xcc, 0x60, 0x12, 0x8f, 0xfd, 0x60, 0x1e, 0xfa, 0xb1, 0x0c, 0x45,
0xb3, 0xa7, 0xfb, 0x49, 0x60, 0x7b, 0x07, 0x60, 0x64, 0x00, 0xe8, 0xf5, 0xd7, 0xa8, 0x68, 0xc6,
0x72, 0x18, 0xb3, 0xed, 0x8a, 0xd0, 0xf3, 0xc3, 0xee, 0xa6, 0x59, 0x73, 0x96, 0x47, 0x64, 0x4b,
0xb9, 0x91, 0x12, 0x5e, 0x8a, 0xa4, 0x58, 0x9a, 0x20, 0xe1, 0xb1, 0xa2, 0xfd, 0xbf, 0x79, 0x68,
0x64, 0xae, 0x8c, 0x7e, 0x86, 0xd7, 0x5c, 0x78, 0x9a, 0xe1, 0x5e, 0xc7, 0x09, 0xd1, 0xf6, 0x90,
0xc2, 0x38, 0x5d, 0xe6, 0x46, 0x0b, 0x5b, 0xf5, 0xda, 0x67, 0x30, 0x5f, 0xeb, 0x8a, 0xcb, 0xbe,
0x63, 0x92, 0xc4, 0x06, 0x54, 0x9f, 0x85, 0x87, 0xa1, 0x7c, 0x1e, 0xea, 0x44, 0x91, 0xee, 0x2d,
0xc7, 0x2a, 0xb5, 0xc9, 0xd5, 0x62, 0xd1, 0xfe, 0x71, 0x69, 0xe2, 0x8a, 0xff, 0x01, 0x54, 0x74,
0x74, 0x46, 0x81, 0xc3, 0xf4, 0x9d, 0x6c, 0x96, 0xd8, 0x54, 0x05, 0x33, 0x28, 0xc7, 0x30, 0x63,
0xd8, 0x94, 0x3e, 0x44, 0x29, 0xcc, 0xac, 0x5e, 0x8e, 0x09, 0x4a, 0x5c, 0xd8, 0xd8, 0x5b, 0xac,
0x54, 0x82, 0xf5, 0xa3, 0x3c, 0xac, 0xcc, 0x22, 0xc1, 0x28, 0xa6, 0x3d, 0x76, 0xd3, 0x9e, 0x80,
0xbc, 0x35, 0xf1, 0x02, 0xac, 0x40, 0xa3, 0xb9, 0xfd, 0x82, 0x4a, 0x8c, 0xbf, 0x07, 0xb3, 0x3f,
0xcf, 0xc3, 0xf2, 0xd4, 0x98, 0x33, 0xe1, 0x08, 0x40, 0x45, 0x5b, 0x96, 0xbe, 0x18, 0x4e, 0xaf,
0xea, 0x74, 0x71, 0x89, 0xce, 0x83, 0x58, 0xdf, 0x7d, 0x6c, 0xea, 0x97, 0x80, 0xac, 0x84, 0x71,
0x04, 0xae, 0x1a, 0xfa, 0xd9, 0xae, 0x60, 0x65, 0xcc, 0x58, 0xf4, 0xb3, 0x05, 0x83, 0xa9, 0x50,
0x36, 0x64, 0xf6, 0x22, 0xab, 0xd2, 0x85, 0xf3, 0x70, 0x10, 0xf8, 0x1d, 0x04, 0x6b, 0xb6, 0x03,
0x17, 0x67, 0xe8, 0x4d, 0x9a, 0xec, 0x1b, 0xad, 0x96, 0x00, 0x36, 0xf7, 0x13, 0x5d, 0x58, 0x1e,
0x93, 0xc6, 0xcd, 0xfd, 0x0d, 0x4a, 0x1b, 0xcd, 0x75, 0x8e, 0xde, 0x13, 0xfb, 0x98, 0x67, 0xc4,
0xac, 0x68, 0xdf, 0x87, 0x97, 0xf6, 0x7a, 0x91, 0x70, 0xbd, 0x4d, 0x21, 0x06, 0x01, 0x1a, 0x9b,
0x7b, 0x12, 0x48, 0xd7, 0x9b, 0x51, 0xde, 0x5a, 0x81, 0xb2, 0xeb, 0x79, 0x91, 0x9e, 0xdf, 0xba,
0xa3, 0x01, 0xfb, 0x13, 0xb8, 0xa4, 0x05, 0xe8, 0x5e, 0x3e, 0x1c, 0x8a, 0xa1, 0x78, 0x10, 0xaa,
0xe8, 0x44, 0x17, 0x28, 0x93, 0x57, 0x83, 0x9a, 0xc6, 0x88, 0x9b, 0xc2, 0x93, 0x1f, 0xa0, 0xaf,
0xd4, 0x43, 0xa7, 0xb0, 0xfd, 0x0f, 0x25, 0x80, 0x9d, 0xf4, 0xe5, 0xe2, 0x8c, 0x5d, 0x3b, 0x3b,
0x1e, 0xc9, 0xd4, 0x5a, 0x8b, 0x73, 0x17, 0xeb, 0xdf, 0x4a, 0x1f, 0xa0, 0xe9, 0xc7, 0x13, 0x93,
0x8f, 0xc8, 0x46, 0x7a, 0x98, 0x07, 0x27, 0xe9, 0xdb, 0xb3, 0xb1, 0x6b, 0xcd, 0xf2, 0xe4, 0xb5,
0xe6, 0xf5, 0xe9, 0x37, 0x10, 0x13, 0x2e, 0x64, 0x94, 0xbe, 0x55, 0xc7, 0xd2, 0x37, 0x0b, 0x6a,
0x38, 0x0f, 0x32, 0x0c, 0x4e, 0x92, 0x8a, 0x6a, 0x02, 0xf3, 0xbb, 0x50, 0x56, 0xf4, 0xbe, 0xb3,
0x46, 0x16, 0x3f, 0x19, 0x05, 0x8d, 0x9e, 0xbc, 0x92, 0xe7, 0xd0, 0xb4, 0xe8, 0x8f, 0xfc, 0xd8,
0x3c, 0x5c, 0xf0, 0xa8, 0xe2, 0x5b, 0x73, 0x32, 0x18, 0xfb, 0x5f, 0x47, 0x0f, 0x70, 0xea, 0x50,
0x6e, 0xbb, 0xb1, 0xdf, 0xd1, 0x57, 0x7d, 0xe6, 0x84, 0xd3, 0x77, 0x32, 0x4a, 0x7a, 0x92, 0x15,
0x30, 0x28, 0x8f, 0x05, 0x86, 0xdf, 0x4b, 0x00, 0xa3, 0xd7, 0xa5, 0xac, 0x84, 0x86, 0x9c, 0xcc,
0xaa, 0xbe, 0xe9, 0x23, 0x56, 0xca, 0xd9, 0xbd, 0xf4, 0x0d, 0x45, 0x15, 0x7b, 0x20, 0x47, 0xc9,
0x6a, 0x48, 0x13, 0x4a, 0x25, 0x74, 0x95, 0x22, 0xc6, 0x28, 0x83, 0x01, 0x8a, 0x49, 0x9e, 0xd8,
0xb1, 0x06, 0xc6, 0xcd, 0x89, 0x50, 0x5d, 0x66, 0x88, 0xa9, 0xb6, 0xbb, 0x80, 0x66, 0x3e, 0xde,
0xa0, 0x8b, 0x17, 0xe8, 0x54, 0xda, 0x6e, 0x2c, 0xd8, 0x8a, 0xfd, 0x87, 0xa3, 0x51, 0xbd, 0x96,
0x86, 0xb3, 0xf3, 0xac, 0xef, 0x69, 0x01, 0xef, 0x03, 0x58, 0x8e, 0xc4, 0x67, 0x43, 0x7f, 0xec,
0xd1, 0xdb, 0x39, 0x86, 0x36, 0xcd, 0x61, 0x1f, 0xc1, 0x72, 0x02, 0x7c, 0xe4, 0xab, 0x1e, 0xe5,
0x7b, 0xfc, 0x6e, 0xe6, 0x55, 0x5e, 0xde, 0xc4, 0x57, 0xa7, 0x88, 0x1c, 0xbd, 0xc2, 0x4b, 0xcb,
0x61, 0x85, 0x39, 0xca, 0x61, 0xf6, 0x9f, 0x55, 0x33, 0x29, 0x9f, 0x0e, 0xf0, 0xbd, 0x34, 0xc0,
0x9f, 0xde, 0xfb, 0xf7, 0xa0, 0x72, 0xa0, 0xab, 0xc3, 0xba, 0x2a, 0xfa, 0x8d, 0x53, 0xf4, 0x31,
0x15, 0x60, 0x43, 0x3c, 0xf3, 0x3e, 0xe6, 0x1d, 0x8c, 0xde, 0x0e, 0xdc, 0x61, 0xa0, 0xf6, 0xe7,
0xa8, 0xde, 0x8d, 0xd1, 0xf2, 0x75, 0x2a, 0x54, 0xbb, 0x2d, 0x7d, 0xc1, 0x57, 0x9e, 0xf9, 0x46,
0x36, 0x5b, 0x91, 0x36, 0x94, 0x4e, 0x86, 0x2b, 0xb3, 0xd1, 0x2a, 0xb3, 0x36, 0x1a, 0xe6, 0x5a,
0x66, 0x0b, 0xa6, 0xb0, 0x2e, 0x76, 0xea, 0xef, 0x44, 0x3c, 0x3d, 0x6e, 0xad, 0x39, 0x53, 0x78,
0x74, 0x93, 0xfd, 0x61, 0xa0, 0x7c, 0x73, 0xd1, 0xa2, 0x81, 0xc9, 0x07, 0xd9, 0xf5, 0xe9, 0x07,
0xd9, 0xef, 0x01, 0xc4, 0x02, 0xbd, 0xe2, 0xa6, 0xdf, 0x51, 0xe6, 0x1a, 0xf0, 0xda, 0x69, 0x63,
0x33, 0x55, 0xc8, 0x0c, 0x07, 0xea, 0xdf, 0x77, 0x8f, 0x37, 0x30, 0x70, 0x6e, 0x2e, 0x52, 0x1e,
0x97, 0xc2, 0x93, 0xee, 0x67, 0x69, 0xda, 0xfd, 0xdc, 0x85, 0x72, 0xdc, 0x91, 0x03, 0x41, 0xef,
0x50, 0x4f, 0x5f, 0xdf, 0xd5, 0x16, 0x12, 0x39, 0x9a, 0x96, 0x0a, 0x0b, 0xe8, 0xf5, 0x65, 0x44,
0x2f, 0x50, 0xeb, 0x4e, 0x02, 0x5a, 0x3f, 0xcd, 0x43, 0xc5, 0x54, 0x02, 0x67, 0x64, 0x8f, 0x54,
0x44, 0x28, 0x64, 0x5e, 0xb0, 0xa4, 0x2f, 0x45, 0x8a, 0xd9, 0x97, 0x22, 0xef, 0x24, 0x3a, 0x69,
0x5f, 0xfc, 0xf2, 0xd9, 0x93, 0x31, 0xa6, 0x9a, 0xfd, 0x2a, 0x94, 0x09, 0x46, 0x67, 0x42, 0x51,
0xa7, 0xbe, 0x11, 0x88, 0x46, 0x47, 0x23, 0x24, 0x26, 0xcd, 0x0a, 0xf6, 0xc7, 0x09, 0x35, 0x24,
0x21, 0x91, 0x0e, 0xa7, 0xb0, 0x37, 0x96, 0xc7, 0xf4, 0x3e, 0x16, 0x6a, 0xe7, 0x60, 0xaf, 0x27,
0x5a, 0x6e, 0x9f, 0xa2, 0x75, 0x56, 0xe0, 0x4d, 0x58, 0xd1, 0xb4, 0xf1, 0x78, 0x0b, 0x1d, 0xfa,
0x81, 0xdf, 0x8e, 0xdc, 0xe8, 0x84, 0x95, 0xec, 0xf7, 0xe8, 0x06, 0x24, 0xb1, 0xbe, 0x46, 0xfa,
0x0f, 0x02, 0xed, 0x54, 0x3d, 0x11, 0xa1, 0xd7, 0xd5, 0xf7, 0x53, 0xae, 0xce, 0x7b, 0xf4, 0x5d,
0xb7, 0xd6, 0xba, 0x68, 0x7f, 0x84, 0x51, 0xdb, 0xe8, 0x0a, 0xf5, 0x67, 0xb6, 0x39, 0xed, 0xf5,
0x4c, 0xd4, 0x32, 0x7e, 0x5e, 0xe6, 0xe7, 0x3d, 0x2f, 0xed, 0x47, 0x70, 0xc1, 0x19, 0xf7, 0xc8,
0xfc, 0x2d, 0xa8, 0xca, 0x41, 0x56, 0xce, 0x79, 0x46, 0x9c, 0x90, 0xdb, 0x7f, 0x94, 0x87, 0x85,
0xed, 0x50, 0x89, 0x28, 0x74, 0x83, 0x87, 0x81, 0xdb, 0xe5, 0x6f, 0x26, 0x2e, 0x6d, 0x76, 0x9a,
0x98, 0xa5, 0x1d, 0xf7, 0x6e, 0x4f, 0x4d, 0xe5, 0x8c, 0xbf, 0x04, 0xcb, 0xc2, 0xf3, 0x95, 0x8c,
0x74, 0xac, 0x96, 0xbc, 0x31, 0x58, 0x01, 0xa6, 0xd1, 0x2d, 0xda, 0x3f, 0x7b, 0x7a, 0x99, 0x9b,
0xb0, 0x32, 0x86, 0x4d, 0x02, 0xb1, 0x82, 0xfd, 0x1f, 0xe5, 0x24, 0x04, 0xd9, 0x37, 0x6f, 0x0c,
0x22, 0x29, 0xd5, 0xa8, 0x32, 0xaa, 0xa1, 0xcc, 0x9f, 0x49, 0x0a, 0x73, 0xfc, 0x99, 0xe4, 0xbd,
0xd1, 0x9f, 0x49, 0xf4, 0xb9, 0xf1, 0xf2, 0xcc, 0xc3, 0x88, 0xae, 0x59, 0x4d, 0x0c, 0xd9, 0x12,
0x99, 0x7f, 0x96, 0xbc, 0x6e, 0x12, 0x87, 0xd2, 0xcc, 0x45, 0x9f, 0x38, 0xfc, 0xf5, 0xad, 0xd4,
0xbd, 0xc9, 0x97, 0x93, 0xf3, 0x45, 0x45, 0x53, 0xf7, 0xfe, 0xf0, 0xa2, 0xf7, 0xfe, 0xfc, 0xfe,
0x44, 0x8c, 0x5e, 0x9b, 0x59, 0x82, 0x39, 0xe3, 0xff, 0x19, 0xf7, 0xa1, 0xda, 0xf3, 0x63, 0x25,
0xa3, 0x13, 0x8a, 0x59, 0xa6, 0xdf, 0x38, 0x67, 0x66, 0x6b, 0x4b, 0x13, 0xd2, 0xdd, 0x74, 0xc2,
0x65, 0x75, 0x01, 0x46, 0xb3, 0x38, 0xe5, 0x95, 0xbe, 0xc6, 0x3f, 0x7b, 0x2e, 0x41, 0x25, 0x1e,
0xb6, 0x47, 0xa5, 0x6e, 0x03, 0x59, 0xc7, 0x60, 0x4d, 0x1d, 0xe9, 0xbb, 0x22, 0xd2, 0xfa, 0xa1,
0x9b, 0x4e, 0x4a, 0xe2, 0xa6, 0xfb, 0x14, 0xe6, 0xef, 0x65, 0x97, 0x47, 0x9b, 0xd0, 0xf5, 0x53,
0xe6, 0x38, 0x95, 0x9c, 0x59, 0x27, 0xeb, 0x1e, 0x34, 0x32, 0x43, 0x47, 0x4f, 0x3b, 0x0c, 0x3d,
0x99, 0xd4, 0xf9, 0xf0, 0x5b, 0x3f, 0xeb, 0xf6, 0x92, 0x4a, 0x1f, 0x7d, 0xdf, 0xfa, 0xf3, 0x22,
0x2c, 0x8d, 0x9b, 0x0b, 0x55, 0x3c, 0xb5, 0x33, 0xda, 0x09, 0x3c, 0x5d, 0x12, 0x5d, 0xc7, 0x93,
0xae, 0x13, 0x0d, 0xfb, 0xed, 0x58, 0x87, 0x80, 0x94, 0x6b, 0x32, 0x6c, 0xda, 0xd5, 0x91, 0x21,
0x21, 0x96, 0xb1, 0x69, 0x4b, 0xf6, 0x05, 0xbb, 0x9e, 0x7d, 0x21, 0xfb, 0x5a, 0xf2, 0x96, 0x96,
0xe2, 0xb1, 0xf7, 0x31, 0x70, 0x6c, 0x09, 0xc5, 0xd6, 0x30, 0x07, 0x6a, 0xed, 0x8d, 0xc2, 0x2e,
0xf6, 0x09, 0xaf, 0x9b, 0x07, 0x47, 0x3f, 0x2c, 0xf0, 0xc5, 0x4c, 0x3a, 0xf4, 0x93, 0x02, 0x5f,
0x81, 0x0b, 0xeb, 0xc3, 0xd0, 0x0b, 0x84, 0x97, 0x62, 0xff, 0x94, 0xb0, 0x4f, 0xc6, 0x4b, 0x29,
0xec, 0x73, 0xf4, 0xce, 0x17, 0x9f, 0x4c, 0x97, 0x48, 0xd8, 0x1f, 0x4c, 0xb6, 0xa4, 0x92, 0x7e,
0x9c, 0x95, 0x9f, 0xd2, 0xff, 0xb0, 0xc4, 0x2f, 0xc1, 0x72, 0x6b, 0xd8, 0x4e, 0x72, 0x41, 0x83,
0xff, 0x0d, 0xc2, 0x1b, 0xea, 0x8c, 0xfa, 0xbf, 0x59, 0xe2, 0x17, 0x61, 0x69, 0x4d, 0xaf, 0x99,
0x99, 0x17, 0xf6, 0x5b, 0x25, 0x1c, 0x14, 0x5d, 0x85, 0xfd, 0x76, 0x89, 0x2f, 0xc3, 0xc2, 0x47,
0x32, 0x3a, 0xa4, 0x10, 0x17, 0x67, 0xf7, 0x47, 0x98, 0x18, 0xd6, 0x53, 0x14, 0xfb, 0x9d, 0x12,
0xbf, 0x0a, 0x97, 0xa7, 0xba, 0x34, 0x81, 0xed, 0xef, 0x96, 0x6e, 0xfd, 0x45, 0x1e, 0x96, 0xc6,
0x7d, 0x3a, 0x4e, 0x6e, 0x20, 0xc3, 0xae, 0xd2, 0x8f, 0x88, 0x17, 0xa1, 0x1e, 0xf7, 0x64, 0xa4,
0x08, 0xa4, 0x93, 0x2e, 0xa4, 0x2b, 0x2e, 0x9d, 0x9b, 0xea, 0x4a, 0x9a, 0xbe, 0x46, 0x57, 0x6e,
0x97, 0x35, 0x70, 0xc5, 0x3c, 0x54, 0xae, 0x94, 0x06, 0xea, 0x74, 0xd5, 0x96, 0x5c, 0x65, 0xb0,
0x0a, 0x92, 0x0e, 0xa3, 0x40, 0x07, 0xec, 0xa2, 0xef, 0xfa, 0x81, 0x7e, 0x2d, 0x38, 0xe8, 0x61,
0xda, 0x59, 0xd7, 0x58, 0xf9, 0xa9, 0xaf, 0xdf, 0xe5, 0x99, 0x13, 0xd4, 0x43, 0x3d, 0x52, 0xe3,
0x64, 0x62, 0xfd, 0xd6, 0x3f, 0x7e, 0x79, 0x2d, 0xff, 0xc5, 0x97, 0xd7, 0xf2, 0xff, 0xf5, 0xe5,
0xb5, 0xfc, 0xe7, 0x5f, 0x5d, 0xcb, 0x7d, 0xf1, 0xd5, 0xb5, 0xdc, 0xbf, 0x7d, 0x75, 0x2d, 0xf7,
0x31, 0x9b, 0xfc, 0xcf, 0x5f, 0xbb, 0x42, 0xdb, 0xee, 0xee, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff,
0x18, 0x4b, 0x6f, 0xdd, 0x0e, 0x38, 0x00, 0x00,
}
func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) {
@ -9122,18 +9122,16 @@ func (m *RelationLink) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Format != 0 {
i = encodeVarintModels(dAtA, i, uint64(m.Format))
i--
dAtA[i] = 0x10
}
if len(m.Key) > 0 {
i -= len(m.Key)
copy(dAtA[i:], m.Key)
i = encodeVarintModels(dAtA, i, uint64(len(m.Key)))
i--
dAtA[i] = 0x12
}
if len(m.Id) > 0 {
i -= len(m.Id)
copy(dAtA[i:], m.Id)
i = encodeVarintModels(dAtA, i, uint64(len(m.Id)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
@ -10956,14 +10954,13 @@ func (m *RelationLink) Size() (n int) {
}
var l int
_ = l
l = len(m.Id)
if l > 0 {
n += 1 + l + sovModels(uint64(l))
}
l = len(m.Key)
if l > 0 {
n += 1 + l + sovModels(uint64(l))
}
if m.Format != 0 {
n += 1 + sovModels(uint64(m.Format))
}
return n
}
@ -19703,38 +19700,6 @@ func (m *RelationLink) Unmarshal(dAtA []byte) error {
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModels
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthModels
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthModels
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Id = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
}
@ -19766,6 +19731,25 @@ func (m *RelationLink) Unmarshal(dAtA []byte) error {
}
m.Key = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType)
}
m.Format = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModels
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Format |= RelationFormat(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipModels(dAtA[iNdEx:])

View file

@ -36,14 +36,14 @@ enum SmartBlockType {
MarketplaceRelation = 0x111;
MarketplaceTemplate = 0x112;
BundledRelation = 0x200;
IndexedRelation = 0x201;
BundledRelation = 0x200; // DEPRECATED
SubObjectRelation = 0x201;
BundledObjectType = 0x202;
AnytypeProfile = 0x203;
Date = 0x204;
WorkspaceOld = 0x205; // deprecated thread-based workspace
Workspace = 0x206;
RelationOption = 0x207;
SubObjectRelationOption = 0x207;
}
message Block {
@ -749,8 +749,8 @@ enum RelationFormat {
}
message RelationLink {
string id = 1;
string key = 2;
string key = 1;
RelationFormat format = 2;
}
message Relations {

View file

@ -12,6 +12,7 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/simple/link"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/text"
relation2 "github.com/anytypeio/go-anytype-middleware/core/relation"
"github.com/anytypeio/go-anytype-middleware/core/relation/relationutils"
"github.com/gogo/protobuf/types"
"github.com/textileio/go-threads/core/thread"
"io"
@ -159,10 +160,7 @@ func (b *builtinObjects) createObject(ctx context.Context, rd io.ReadCloser) (er
f["analyticsOriginalId"] = pbtypes.String(oldId)
st.Set(simple.New(m))
rels, err := b.relService.MigrateRelations(st.OldExtraRelations())
if err != nil {
return err
}
rels := relationutils.MigrateRelationsModels(st.OldExtraRelations())
st.AddRelationLinks(rels...)
st.RemoveDetail(bundle.RelationKeyCreator.String(), bundle.RelationKeyLastModifiedBy.String())

View file

@ -4,9 +4,9 @@ import "github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model"
type RelationLinks []*model.RelationLink
func (rl RelationLinks) Has(id string) bool {
func (rl RelationLinks) Has(key string) bool {
for _, l := range rl {
if l.Id == id {
if l.Key == key {
return true
}
}
@ -15,7 +15,7 @@ func (rl RelationLinks) Has(id string) bool {
func (rl RelationLinks) Key(id string) (key string, ok bool) {
for _, l := range rl {
if l.Id == id {
if l.Key == id {
return l.Key, true
}
}
@ -29,7 +29,7 @@ func (rl RelationLinks) Append(l *model.RelationLink) RelationLinks {
func (rl RelationLinks) Remove(id string) RelationLinks {
var n int
for _, x := range rl {
if x.Id != id {
if x.Key != id {
rl[n] = x
n++
}
@ -41,8 +41,8 @@ func (rl RelationLinks) Copy() RelationLinks {
res := make(RelationLinks, 0, len(rl))
for _, l := range rl {
res = append(res, &model.RelationLink{
Id: l.Id,
Key: l.Key,
Format: l.Format,
Key: l.Key,
})
}
return res
@ -51,15 +51,15 @@ func (rl RelationLinks) Copy() RelationLinks {
func (rl RelationLinks) Diff(prev RelationLinks) (added []*model.RelationLink, removed []string) {
var common = make(map[string]struct{})
for _, l := range rl {
if !prev.Has(l.Id) {
if !prev.Has(l.Key) {
added = append(added, l)
} else {
common[l.Id] = struct{}{}
common[l.Key] = struct{}{}
}
}
for _, l := range prev {
if _, ok := common[l.Id]; !ok {
removed = append(removed, l.Id)
if _, ok := common[l.Key]; !ok {
removed = append(removed, l.Key)
}
}
return