1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00
This commit is contained in:
Sergey Cherepanov 2020-08-26 16:58:53 +03:00
commit 317f6adc39
No known key found for this signature in database
GPG key ID: 085319C64294F576
45 changed files with 5581 additions and 1271 deletions

View file

@ -7,7 +7,7 @@ checkout-linux: &checkout-linux
jobs:
persist-checkout:
docker:
- image: circleci/golang:1.13.12
- image: circleci/golang:1.14.7
steps:
- checkout
- run:
@ -25,7 +25,7 @@ jobs:
unit-test:
docker:
- image: circleci/golang:1.13.12
- image: circleci/golang:1.14.7
steps:
- *checkout-linux
- add_ssh_keys:
@ -65,7 +65,7 @@ jobs:
build-lib-linux:
docker:
- image: circleci/golang:1.13.12
- image: circleci/golang:1.14.7
steps:
- *checkout-linux
- add_ssh_keys:
@ -158,8 +158,8 @@ jobs:
- run:
name: install golang
command: |
curl -L -O https://dl.google.com/go/go1.13.12.darwin-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.13.12.darwin-amd64.tar.gz
curl -L -O https://dl.google.com/go/go1.14.7.darwin-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.7.darwin-amd64.tar.gz
- restore_cache:
keys:
- go-pkg-v3-mac-{{ arch }}-{{ checksum "go.sum" }}
@ -299,8 +299,8 @@ jobs:
name: install golang
command: |
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
curl -L -O https://dl.google.com/go/go1.13.12.darwin-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.13.12.darwin-amd64.tar.gz
curl -L -O https://dl.google.com/go/go1.14.7.darwin-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.7.darwin-amd64.tar.gz
# see the https://github.com/golang/go/issues/31628
# uncomment if go not fixes this issue and we will need to publish to the appstore
# cd ~ && mkdir gosrc && cd gosrc
@ -403,8 +403,8 @@ jobs:
- run:
name: install golang
command: |
wget https://dl.google.com/go/go1.13.12.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.13.12.linux-amd64.tar.gz
wget https://dl.google.com/go/go1.14.7.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.7.linux-amd64.tar.gz
mkdir -p $GOPATH/bin
- run:
name: install protobuf

View file

@ -8,6 +8,7 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/editor/state"
"github.com/anytypeio/go-anytype-middleware/core/block/source"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/gogo/protobuf/types"
)
func (mw *Middleware) BlockCreate(req *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse {
@ -1131,3 +1132,66 @@ func (mw *Middleware) BlockSetDataviewActiveView(req *pb.RpcBlockSetDataviewActi
}
return response(pb.RpcBlockSetDataviewActiveViewResponseError_NULL, nil)
}
func (mw *Middleware) BlockCreateDataviewRecord(req *pb.RpcBlockCreateDataviewRecordRequest) *pb.RpcBlockCreateDataviewRecordResponse {
ctx := state.NewContext(nil)
response := func(details *types.Struct, code pb.RpcBlockCreateDataviewRecordResponseErrorCode, err error) *pb.RpcBlockCreateDataviewRecordResponse {
m := &pb.RpcBlockCreateDataviewRecordResponse{Record: details, Error: &pb.RpcBlockCreateDataviewRecordResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
}
// no events generated
return m
}
var details *types.Struct
if err := mw.doBlockService(func(bs block.Service) (err error) {
details, err = bs.CreateDataviewRecord(ctx, *req)
return err
}); err != nil {
return response(nil, pb.RpcBlockCreateDataviewRecordResponseError_UNKNOWN_ERROR, err)
}
return response(details, pb.RpcBlockCreateDataviewRecordResponseError_NULL, nil)
}
func (mw *Middleware) BlockUpdateDataviewRecord(req *pb.RpcBlockUpdateDataviewRecordRequest) *pb.RpcBlockUpdateDataviewRecordResponse {
ctx := state.NewContext(nil)
response := func(code pb.RpcBlockUpdateDataviewRecordResponseErrorCode, err error) *pb.RpcBlockUpdateDataviewRecordResponse {
m := &pb.RpcBlockUpdateDataviewRecordResponse{Error: &pb.RpcBlockUpdateDataviewRecordResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
}
// no events generated
return m
}
if err := mw.doBlockService(func(bs block.Service) (err error) {
return bs.UpdateDataviewRecord(ctx, *req)
}); err != nil {
return response(pb.RpcBlockUpdateDataviewRecordResponseError_UNKNOWN_ERROR, err)
}
return response(pb.RpcBlockUpdateDataviewRecordResponseError_NULL, nil)
}
func (mw *Middleware) BlockDeleteDataviewRecord(req *pb.RpcBlockDeleteDataviewRecordRequest) *pb.RpcBlockDeleteDataviewRecordResponse {
ctx := state.NewContext(nil)
response := func(code pb.RpcBlockDeleteDataviewRecordResponseErrorCode, err error) *pb.RpcBlockDeleteDataviewRecordResponse {
m := &pb.RpcBlockDeleteDataviewRecordResponse{Error: &pb.RpcBlockDeleteDataviewRecordResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
} else {
m.Event = ctx.GetResponseEvent()
}
return m
}
if err := mw.doBlockService(func(bs block.Service) (err error) {
return bs.DeleteDataviewRecord(ctx, *req)
}); err != nil {
return response(pb.RpcBlockDeleteDataviewRecordResponseError_UNKNOWN_ERROR, err)
}
return response(pb.RpcBlockDeleteDataviewRecordResponseError_NULL, nil)
}

View file

@ -0,0 +1,34 @@
package database
import (
"fmt"
"github.com/anytypeio/go-anytype-library/database"
"github.com/anytypeio/go-anytype-middleware/core/anytype"
"github.com/anytypeio/go-anytype-middleware/core/block/database/pages"
"github.com/anytypeio/go-anytype-middleware/pb"
)
type Ctrl interface {
Anytype() anytype.Service
SetDetails(req pb.RpcBlockSetDetailsRequest) error
CreateSmartBlock(req pb.RpcBlockCreatePageRequest) (pageId string, err error)
}
type Router interface {
Get(id string) (database.Database, error)
}
func New(s Ctrl) Router {
return &router{s: s}
}
type router struct{ s Ctrl }
func (r router) Get(id string) (database.Database, error) {
switch id {
case "pages":
return pages.New(r.s.Anytype().PageStore(), r.s.SetDetails, r.s.CreateSmartBlock), nil
}
return nil, fmt.Errorf("db not found")
}

View file

@ -0,0 +1,70 @@
package pages
import (
"errors"
"github.com/anytypeio/go-anytype-library/database"
"github.com/anytypeio/go-anytype-library/localstore"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/gogo/protobuf/types"
)
func New(
pageStore localstore.PageStore,
setDetails func(req pb.RpcBlockSetDetailsRequest) error,
createSmartBlock func(req pb.RpcBlockCreatePageRequest) (pageId string, err error),
) database.Database {
return &setPages{
PageStore: pageStore,
setDetails: setDetails,
createSmartBlock: createSmartBlock,
}
}
type setPages struct {
localstore.PageStore
setDetails func(req pb.RpcBlockSetDetailsRequest) error
createSmartBlock func(req pb.RpcBlockCreatePageRequest) (pageId string, err error)
}
func (sp setPages) Create(rec database.Record) (database.Record, error) {
id, err := sp.createSmartBlock(pb.RpcBlockCreatePageRequest{Details: rec.Details})
if err != nil {
return rec, err
}
if rec.Details == nil || rec.Details.Fields == nil {
rec.Details = &types.Struct{Fields: make(map[string]*types.Value)}
}
// inject created block ID into the record
rec.Details.Fields[database.RecordIDField] = &types.Value{Kind: &types.Value_StringValue{StringValue: id}}
return rec, nil
}
func (sp *setPages) Update(id string, rec database.Record) error {
var details []*pb.RpcBlockSetDetailsDetail
for k, v := range rec.Details.Fields {
details = append(details, &pb.RpcBlockSetDetailsDetail{Key: k, Value: v})
}
if len(details) == 0 {
return nil
}
return sp.setDetails(pb.RpcBlockSetDetailsRequest{
ContextId: id, // not sure?
Details: details,
})
}
func (sp setPages) Delete(id string) error {
// TODO implement!
return errors.New("not implemented")
}
func (sp setPages) Schema() string {
return sp.Schema()
}

View file

@ -2,6 +2,7 @@ package bookmark
import (
"fmt"
"sync"
"github.com/anytypeio/go-anytype-middleware/util/uri"
@ -19,7 +20,7 @@ func NewBookmark(sb smartblock.SmartBlock, lp linkpreview.LinkPreview, ctrl DoBo
}
type Bookmark interface {
Fetch(ctx *state.Context, id string, url string) (err error)
Fetch(ctx *state.Context, id string, url string, isSync bool) (err error)
CreateAndFetch(ctx *state.Context, req pb.RpcBlockBookmarkCreateAndFetchRequest) (newId string, err error)
UpdateBookmark(id string, apply func(b bookmark.Block) error) (err error)
}
@ -34,15 +35,15 @@ type sbookmark struct {
ctrl DoBookmark
}
func (b *sbookmark) Fetch(ctx *state.Context, id string, url string) (err error) {
func (b *sbookmark) Fetch(ctx *state.Context, id string, url string, isSync bool) (err error) {
s := b.NewStateCtx(ctx)
if err = b.fetch(s, id, url); err != nil {
if err = b.fetch(s, id, url, isSync); err != nil {
return
}
return b.Apply(s)
}
func (b *sbookmark) fetch(s *state.State, id, url string) (err error) {
func (b *sbookmark) fetch(s *state.State, id, url string, isSync bool) (err error) {
bb := s.Get(id)
if b == nil {
return smartblock.ErrSimpleBlockNotFound
@ -52,17 +53,23 @@ func (b *sbookmark) fetch(s *state.State, id, url string) (err error) {
if err != nil {
// Do nothing
}
var updMu sync.Mutex
if bm, ok := bb.(bookmark.Block); ok {
return bm.Fetch(bookmark.FetchParams{
Url: url,
Anytype: b.Anytype(),
Updater: func(id string, apply func(b bookmark.Block) error) (err error) {
if isSync {
updMu.Lock()
defer updMu.Unlock()
return apply(bm)
}
return b.ctrl.DoBookmark(b.Id(), func(b Bookmark) error {
return b.UpdateBookmark(id, apply)
})
},
LinkPreview: b.lp,
Sync: isSync,
})
}
return fmt.Errorf("unexpected simple bock type: %T (want Bookmark)", bb)
@ -82,7 +89,7 @@ func (b *sbookmark) CreateAndFetch(ctx *state.Context, req pb.RpcBlockBookmarkCr
if err = s.InsertTo(req.TargetId, req.Position, newId); err != nil {
return
}
if err = b.fetch(s, newId, req.Url); err != nil {
if err = b.fetch(s, newId, req.Url, false); err != nil {
return
}
if err = b.Apply(s); err != nil {

View file

@ -12,6 +12,7 @@ import (
"github.com/anytypeio/go-anytype-library/logging"
"github.com/anytypeio/go-anytype-middleware/anymark"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/file"
"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/simple"
@ -40,20 +41,22 @@ type Clipboard interface {
Export(req pb.RpcBlockExportRequest) (path string, err error)
}
func NewClipboard(sb smartblock.SmartBlock) Clipboard {
return &clipboard{sb}
func NewClipboard(sb smartblock.SmartBlock, file file.File) Clipboard {
return &clipboard{SmartBlock: sb, file: file}
}
type clipboard struct {
smartblock.SmartBlock
file file.File
}
func (cb *clipboard) Paste(ctx *state.Context, req pb.RpcBlockPasteRequest) (blockIds []string, uploadArr []pb.RpcBlockUploadRequest, caretPosition int32, isSameBlockCaret bool, err error) {
caretPosition = -1
if len(req.AnySlot) > 0 {
if len(req.FileSlot) > 0 {
blockIds, err = cb.pasteFiles(ctx, req)
return
} else if len(req.AnySlot) > 0 {
blockIds, uploadArr, caretPosition, isSameBlockCaret, err = cb.pasteAny(ctx, req)
} else if len(req.HtmlSlot) > 0 {
blockIds, uploadArr, caretPosition, isSameBlockCaret, err = cb.pasteHtml(ctx, req)
@ -585,3 +588,28 @@ func (cb *clipboard) blocksToState(blocks []*model.Block) (cbs *state.State) {
cbs.Pick(cbs.RootId()).Model().ChildrenIds = rootIds
return
}
func (cb *clipboard) pasteFiles(ctx *state.Context, req pb.RpcBlockPasteRequest) (blockIds []string, err error) {
s := cb.NewStateCtx(ctx)
for _, fs := range req.FileSlot {
b := simple.New(&model.Block{
Content: &model.BlockContentOfFile{
File: &model.BlockContentFile{
Name: fs.Name,
},
},
})
s.Add(b)
if err = cb.file.UploadState(s, b.Model().Id, file.FileSource{
Bytes: fs.Data,
Name: fs.Name,
}, true); err != nil {
return
}
blockIds = append(blockIds, b.Model().Id)
}
if err = s.InsertTo(req.FocusedBlockId, model.Block_Bottom, blockIds...); err != nil {
return
}
return blockIds, cb.Apply(s)
}

View file

@ -3,6 +3,7 @@ package clipboard
import (
"fmt"
"strconv"
"testing"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock/smarttest"
@ -10,8 +11,6 @@ import (
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/stretchr/testify/require"
"testing"
_ "github.com/anytypeio/go-anytype-middleware/core/block/simple/base"
)
@ -42,7 +41,7 @@ func page(blocks ...*model.Block) (sb *smarttest.SmartTest) {
}
func rangePaste(sb *smarttest.SmartTest, t *testing.T, focusId string, focusRange *model.Range, copyRange *model.Range, blocks ...*model.Block) {
cb := NewClipboard(sb)
cb := NewClipboard(sb, nil)
req := pb.RpcBlockPasteRequest{
ContextId: sb.Id(),
FocusedBlockId: focusId,
@ -234,7 +233,7 @@ func checkBlockMarksDebug(t *testing.T, sb *smarttest.SmartTest, marksArr [][]*m
}
func pasteAny(t *testing.T, sb *smarttest.SmartTest, id string, textRange model.Range, selectedBlockIds []string, blocks []*model.Block) {
cb := NewClipboard(sb)
cb := NewClipboard(sb, nil)
req := pb.RpcBlockPasteRequest{}
if id != "" {
req.FocusedBlockId = id
@ -250,7 +249,7 @@ func pasteAny(t *testing.T, sb *smarttest.SmartTest, id string, textRange model.
}
func pasteText(t *testing.T, sb *smarttest.SmartTest, id string, textRange model.Range, selectedBlockIds []string, textSlot string) {
cb := NewClipboard(sb)
cb := NewClipboard(sb, nil)
req := pb.RpcBlockPasteRequest{}
if id != "" {
req.FocusedBlockId = id
@ -266,7 +265,7 @@ func pasteText(t *testing.T, sb *smarttest.SmartTest, id string, textRange model
}
func pasteHtml(t *testing.T, sb *smarttest.SmartTest, id string, textRange model.Range, selectedBlockIds []string, htmlSlot string) {
cb := NewClipboard(sb)
cb := NewClipboard(sb, nil)
req := pb.RpcBlockPasteRequest{}
if id != "" {
req.FocusedBlockId = id

View file

@ -8,6 +8,7 @@ import (
"github.com/anytypeio/go-anytype-library/logging"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-library/schema"
blockDB "github.com/anytypeio/go-anytype-middleware/core/block/database"
"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/simple"
@ -27,11 +28,15 @@ type Dataview interface {
SetActiveView(ctx *state.Context, blockId string, activeViewId string, limit int, offset int) error
CreateView(ctx *state.Context, blockId string, view model.BlockContentDataviewView) (*model.BlockContentDataviewView, error)
CreateRecord(ctx *state.Context, blockId string, rec model.PageDetails) (*model.PageDetails, error)
UpdateRecord(ctx *state.Context, blockId string, recID string, rec model.PageDetails) error
DeleteRecord(ctx *state.Context, blockId string, recID string) error
smartblock.SmartblockOpenListner
}
func NewDataview(sb smartblock.SmartBlock, sendEvent func(e *pb.Event)) Dataview {
return &dataviewCollectionImpl{SmartBlock: sb, sendEvent: sendEvent}
func NewDataview(sb smartblock.SmartBlock) Dataview {
return &dataviewCollectionImpl{SmartBlock: sb}
}
type dataviewImpl struct {
@ -39,18 +44,16 @@ type dataviewImpl struct {
activeViewId string
offset int
limit int
entries []database.Entry
records []database.Record
mu sync.Mutex
database.Database
}
type dataviewCollectionImpl struct {
smartblock.SmartBlock
dataviews []*dataviewImpl
mu sync.Mutex
sendEvent func(e *pb.Event)
}
// This method is not thread-safe
func (d *dataviewCollectionImpl) getDataviewImpl(block dataview.Block) *dataviewImpl {
for _, dv := range d.dataviews {
if dv.blockId == block.Model().Id {
@ -69,8 +72,6 @@ func (d *dataviewCollectionImpl) getDataviewImpl(block dataview.Block) *dataview
}
func (d *dataviewCollectionImpl) DeleteView(ctx *state.Context, blockId string, viewId string, showEvent bool) error {
d.mu.Lock()
defer d.mu.Unlock()
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, blockId)
if err != nil {
@ -104,8 +105,6 @@ func (d *dataviewCollectionImpl) DeleteView(ctx *state.Context, blockId string,
}
func (d *dataviewCollectionImpl) UpdateView(ctx *state.Context, blockId string, viewId string, view model.BlockContentDataviewView, showEvent bool) error {
d.mu.Lock()
defer d.mu.Unlock()
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, blockId)
if err != nil {
@ -134,8 +133,6 @@ func (d *dataviewCollectionImpl) UpdateView(ctx *state.Context, blockId string,
}
func (d *dataviewCollectionImpl) SetActiveView(ctx *state.Context, id string, activeViewId string, limit int, offset int) error {
d.mu.Lock()
defer d.mu.Unlock()
var dvBlock dataview.Block
var ok bool
if dvBlock, ok = d.Pick(id).(dataview.Block); !ok {
@ -149,8 +146,8 @@ func (d *dataviewCollectionImpl) SetActiveView(ctx *state.Context, id string, ac
}
if dv.activeViewId != activeViewId {
dv.entries = []database.Entry{}
dv.activeViewId = activeViewId
dv.records = nil
}
dv.limit = limit
@ -164,9 +161,6 @@ func (d *dataviewCollectionImpl) SetActiveView(ctx *state.Context, id string, ac
}
func (d *dataviewCollectionImpl) CreateView(ctx *state.Context, id string, view model.BlockContentDataviewView) (*model.BlockContentDataviewView, error) {
d.mu.Lock()
defer d.mu.Unlock()
view.Id = uuid.New().String()
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, id)
@ -212,12 +206,74 @@ func (d *dataviewCollectionImpl) fetchAllDataviewsRecordsAndSendEvents(ctx *stat
}
}
}
}
func (d *dataviewCollectionImpl) CreateRecord(_ *state.Context, blockId string, rec model.PageDetails) (*model.PageDetails, error) {
var databaseId string
if dvBlock, ok := d.Pick(blockId).(dataview.Block); !ok {
return nil, fmt.Errorf("not a dataview block")
} else {
databaseId = dvBlock.Model().GetDataview().DatabaseId
}
var db database.Writer
if dbRouter, ok := d.SmartBlock.(blockDB.Router); !ok {
return nil, fmt.Errorf("unexpected smart block type: %T", d.SmartBlock)
} else if target, err := dbRouter.Get(databaseId); err != nil {
return nil, err
} else {
db = target
}
created, err := db.Create(database.Record{Details: rec.Details})
if err != nil {
return nil, err
}
return &model.PageDetails{Details: created.Details}, nil
}
func (d *dataviewCollectionImpl) UpdateRecord(_ *state.Context, blockId string, recID string, rec model.PageDetails) error {
var databaseId string
if dvBlock, ok := d.Pick(blockId).(dataview.Block); !ok {
return fmt.Errorf("not a dataview block")
} else {
databaseId = dvBlock.Model().GetDataview().DatabaseId
}
var db database.Writer
if dbRouter, ok := d.SmartBlock.(blockDB.Router); !ok {
return fmt.Errorf("unexpected smart block type: %T", d.SmartBlock)
} else if target, err := dbRouter.Get(databaseId); err != nil {
return err
} else {
db = target
}
return db.Update(recID, database.Record{Details: rec.Details})
}
func (d *dataviewCollectionImpl) DeleteRecord(_ *state.Context, blockId string, recID string) error {
var databaseId string
if dvBlock, ok := d.Pick(blockId).(dataview.Block); !ok {
return fmt.Errorf("not a dataview block")
} else {
databaseId = dvBlock.Model().GetDataview().DatabaseId
}
var db database.Writer
if dbRouter, ok := d.SmartBlock.(blockDB.Router); !ok {
return fmt.Errorf("unexpected smart block type: %T", d.SmartBlock)
} else if target, err := dbRouter.Get(databaseId); err != nil {
return err
} else {
db = target
}
return db.Delete(recID)
}
func (d *dataviewCollectionImpl) SmartblockOpened(ctx *state.Context) {
d.mu.Lock()
defer d.mu.Unlock()
d.Iterate(func(b simple.Block) (isContinue bool) {
if dvBlock, ok := b.(dataview.Block); !ok {
return true
@ -225,7 +281,7 @@ func (d *dataviewCollectionImpl) SmartblockOpened(ctx *state.Context) {
// reset state after block was reopened
// getDataviewImpl will also set activeView to the fist one in case the smartblock wasn't opened in this session before
dv := d.getDataviewImpl(dvBlock)
dv.entries = []database.Entry{}
dv.records = nil
}
return true
})
@ -237,13 +293,15 @@ func (d *dataviewCollectionImpl) fetchAndGetEventsMessages(dv *dataviewImpl, dvB
databaseId := dvBlock.Model().GetDataview().DatabaseId
activeView := dvBlock.GetView(dv.activeViewId)
db, err := d.Anytype().DatabaseByID(databaseId)
if err != nil {
var db database.Reader
if dbRouter, ok := d.SmartBlock.(blockDB.Router); !ok {
return nil, fmt.Errorf("unexpected smart block type: %T", d.SmartBlock)
} else if target, err := dbRouter.Get(databaseId); err != nil {
return nil, err
} else {
db = target
}
var msgs []*pb.EventMessage
entries, total, err := db.Query(database.Query{
Relations: activeView.Relations,
Filters: activeView.Filters,
@ -251,9 +309,12 @@ func (d *dataviewCollectionImpl) fetchAndGetEventsMessages(dv *dataviewImpl, dvB
Limit: dv.limit,
Offset: dv.offset,
})
if err != nil {
return nil, err
}
var currentEntriesIds []string
for _, entry := range dv.entries {
for _, entry := range dv.records {
currentEntriesIds = append(currentEntriesIds, getEntryID(entry))
}
@ -262,20 +323,22 @@ func (d *dataviewCollectionImpl) fetchAndGetEventsMessages(dv *dataviewImpl, dvB
records = append(records, entry.Details)
}
msgs = append(msgs, &pb.EventMessage{&pb.EventMessageValueOfBlockSetDataviewRecords{
&pb.EventBlockSetDataviewRecords{
Id: dv.blockId,
ViewId: activeView.Id,
Updated: nil,
Removed: currentEntriesIds,
Inserted: records,
InsertPosition: 0,
Total: uint32(total),
},
}})
var msgs = []*pb.EventMessage{
{Value: &pb.EventMessageValueOfBlockSetDataviewRecords{
BlockSetDataviewRecords: &pb.EventBlockSetDataviewRecords{
Id: dv.blockId,
ViewId: activeView.Id,
Updated: nil,
Removed: currentEntriesIds,
Inserted: records,
InsertPosition: 0,
Total: uint32(total),
},
}},
}
log.Debugf("db query for %s {filters: %+v, sorts: %+v, limit: %d, offset: %d} got %d entries, total: %d, msgs: %d", databaseId, activeView.Filters, activeView.Sorts, dv.limit, dv.offset, len(entries), total, len(msgs))
dv.entries = entries
log.Debugf("db query for %s {filters: %+v, sorts: %+v, limit: %d, offset: %d} got %d records, total: %d, msgs: %d", databaseId, activeView.Filters, activeView.Sorts, dv.limit, dv.offset, len(entries), total, len(msgs))
dv.records = entries
return msgs, nil
}
@ -308,7 +371,7 @@ func getDataviewBlock(s *state.State, id string) (dataview.Block, error) {
return nil, fmt.Errorf("not a dataview block")
}
func getEntryID(entry database.Entry) string {
func getEntryID(entry database.Record) string {
if entry.Details == nil {
return ""
}
@ -326,7 +389,7 @@ type recordsInsertedAtPosition struct {
entries []*types.Struct
}
func calculateEntriesDiff(a []database.Entry, b []database.Entry) (updated []*types.Struct, removed []string, insertedGroupedByPosition []recordsInsertedAtPosition) {
func calculateEntriesDiff(a, b []database.Record) (updated []*types.Struct, removed []string, insertedGroupedByPosition []recordsInsertedAtPosition) {
var inserted []recordInsertedAtPosition
var existing = make(map[string]*types.Struct, len(a))

View file

@ -30,7 +30,7 @@ func Test_getDefaultRelations(t *testing.T) {
}
func Test_calculateEntriesDiff(t *testing.T) {
a := []database.Entry{
a := []database.Record{
{Details: &types.Struct{
Fields: map[string]*types.Value{
"id": pbtypes.String("id1"),
@ -51,7 +51,7 @@ func Test_calculateEntriesDiff(t *testing.T) {
}},
}
b := []database.Entry{
b := []database.Record{
{Details: &types.Struct{
Fields: map[string]*types.Value{
"id": pbtypes.String("id1"),
@ -82,5 +82,4 @@ func Test_calculateEntriesDiff(t *testing.T) {
require.Equal(t, "id3", removed[0])
require.Equal(t, 2, inserted[0].position)
require.Equal(t, []*types.Struct{b[2].Details}, inserted[0].entries)
}

View file

@ -19,7 +19,6 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/simple/file"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"github.com/anytypeio/go-anytype-middleware/util/uri"
"github.com/gogo/protobuf/types"
"github.com/google/uuid"
)
@ -30,11 +29,11 @@ const (
var log = logging.Logger("anytype-mw-smartfile")
func NewFile(sb smartblock.SmartBlock, source FileSource) File {
func NewFile(sb smartblock.SmartBlock, source BlockService) File {
return &sfile{SmartBlock: sb, fileSource: source}
}
type FileSource interface {
type BlockService interface {
DoFile(id string, apply func(f File) error) error
CreatePage(ctx *state.Context, req pb.RpcBlockCreatePageRequest) (linkId string, pageId string, err error)
ProcessAdd(p process.Process) (err error)
@ -43,26 +42,38 @@ type FileSource interface {
type File interface {
DropFiles(req pb.RpcExternalDropFilesRequest) (err error)
Upload(ctx *state.Context, id, localPath, url string) (err error)
Upload(ctx *state.Context, id string, source FileSource, isSync bool) (err error)
UploadState(s *state.State, id string, source FileSource, isSync bool) (err error)
UpdateFile(id string, apply func(b file.Block) error) (err error)
CreateAndUpload(ctx *state.Context, req pb.RpcBlockFileCreateAndUploadRequest) (string, error)
dropFilesHandler
}
type sfile struct {
smartblock.SmartBlock
fileSource FileSource
type FileSource struct {
Path string
Url string
Bytes []byte
Name string
}
func (sf *sfile) Upload(ctx *state.Context, id, localPath, url string) (err error) {
type sfile struct {
smartblock.SmartBlock
fileSource BlockService
}
func (sf *sfile) Upload(ctx *state.Context, id string, source FileSource, isSync bool) (err error) {
s := sf.NewStateCtx(ctx)
if err = sf.upload(s, id, localPath, url); err != nil {
if err = sf.upload(s, id, source, isSync); err != nil {
return
}
return sf.Apply(s)
}
func (sf *sfile) UploadState(s *state.State, id string, source FileSource, isSync bool) (err error) {
return sf.upload(s, id, source, isSync)
}
func (sf *sfile) CreateAndUpload(ctx *state.Context, req pb.RpcBlockFileCreateAndUploadRequest) (newId string, err error) {
s := sf.NewStateCtx(ctx)
nb := simple.New(&model.Block{
@ -77,7 +88,10 @@ func (sf *sfile) CreateAndUpload(ctx *state.Context, req pb.RpcBlockFileCreateAn
if err = s.InsertTo(req.TargetId, req.Position, newId); err != nil {
return
}
if err = sf.upload(s, newId, req.LocalPath, req.Url); err != nil {
if err = sf.upload(s, newId, FileSource{
Path: req.LocalPath,
Url: req.Url,
}, false); err != nil {
return
}
if err = sf.Apply(s); err != nil {
@ -86,22 +100,35 @@ func (sf *sfile) CreateAndUpload(ctx *state.Context, req pb.RpcBlockFileCreateAn
return
}
func (sf *sfile) upload(s *state.State, id, localPath, url string) (err error) {
url, _ = uri.ProcessURI(url)
func (sf *sfile) upload(s *state.State, id string, source FileSource, isSync bool) (err error) {
b := s.Get(id)
f, ok := b.(file.Block)
if !ok {
return fmt.Errorf("not a file block")
}
if err = f.Upload(sf.Anytype(), &updater{
smartId: sf.Id(),
source: sf.fileSource,
}, localPath, url); err != nil {
return
upl := sf.newUploader().SetBlock(f)
if source.Path != "" {
upl.SetFile(source.Path)
} else if source.Url != "" {
upl.SetUrl(source.Url)
} else if len(source.Bytes) > 0 {
upl.SetBytes(source.Bytes).SetName(source.Name)
}
if isSync {
return upl.Upload(context.TODO()).Err
} else {
upl.AsyncUpdates(sf.Id()).UploadAsync(context.TODO())
}
return
}
func (sf *sfile) newUploader() Uploader {
return &uploader{
service: sf.fileSource,
anytype: sf.Anytype(),
}
}
func (sf *sfile) UpdateFile(id string, apply func(b file.Block) error) (err error) {
s := sf.NewState()
b := s.Get(id)
@ -115,20 +142,6 @@ func (sf *sfile) UpdateFile(id string, apply func(b file.Block) error) (err erro
return sf.Apply(s, smartblock.NoHistory)
}
type updater struct {
smartId string
source FileSource
}
func (u *updater) UpdateFileBlock(id string, apply func(f file.Block)) error {
return u.source.DoFile(u.smartId, func(f File) error {
return f.UpdateFile(id, func(b file.Block) error {
apply(b)
return nil
})
})
}
func (sf *sfile) DropFiles(req pb.RpcExternalDropFilesRequest) (err error) {
process := &dropFilesProcess{s: sf.fileSource}
if err = process.Init(req.LocalFilePaths); err != nil {
@ -203,13 +216,7 @@ func (sf *sfile) dropFilesSetInfo(info dropFileInfo) (err error) {
f.SetState(model.BlockContentFile_Error)
return nil
}
fc := f.Model().GetFile()
fc.Type = info.file.Type
fc.Mime = info.file.Mime
fc.Hash = info.file.Hash
fc.Name = info.file.Name
fc.State = info.file.State
fc.Size_ = info.file.Size_
f.SetModel(info.file)
return nil
})
}
@ -232,11 +239,12 @@ type dropFileInfo struct {
type dropFilesHandler interface {
dropFilesCreateStructure(targetId string, pos model.BlockPosition, entries []*dropFileEntry) (blockIds []string, err error)
dropFilesSetInfo(info dropFileInfo) (err error)
newUploader() Uploader
}
type dropFilesProcess struct {
id string
s FileSource
s BlockService
root *dropFileEntry
total, done int64
cancel chan struct{}
@ -450,17 +458,16 @@ func (dp *dropFilesProcess) addFilesWorker(wg *sync.WaitGroup, in chan *dropFile
}
func (dp *dropFilesProcess) addFile(f *dropFileInfo) (err error) {
var tempFile = file.NewFile(&model.Block{Content: &model.BlockContentOfFile{File: &model.BlockContentFile{}}}).(file.Block)
u := file.NewUploader(dp.s.Anytype(), func(f func(file file.Block)) {
f(tempFile)
})
u.DoAuto(f.path)
fc := tempFile.Model().GetFile()
if fc.State != model.BlockContentFile_Done {
upl := &uploader{
service: dp.s,
anytype: dp.s.Anytype(),
}
res := upl.SetName(f.name).AutoType(true).SetFile(f.path).Upload(context.TODO())
if res.Err != nil {
f.err = fmt.Errorf("upload error")
return
}
f.file = fc
f.file = res.ToBlock().Model().GetFile()
return
}

View file

@ -0,0 +1 @@
package file_test

View file

@ -0,0 +1 @@
12345

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View file

@ -0,0 +1,305 @@
package file
import (
"bufio"
"bytes"
"context"
"fmt"
"image"
"io"
"net/http"
"os"
"path/filepath"
"strings"
"time"
"github.com/anytypeio/go-anytype-library/files"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/anytype"
"github.com/anytypeio/go-anytype-middleware/core/block/simple"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/file"
"github.com/anytypeio/go-anytype-middleware/util/uri"
"github.com/h2non/filetype"
)
var (
// limiting overall file upload goroutines
uploadFilesLimiter = make(chan struct{}, 8)
bufSize = 8192
)
func init() {
for i := 0; i < cap(uploadFilesLimiter); i++ {
uploadFilesLimiter <- struct{}{}
}
}
func NewUploader(s BlockService) Uploader {
return &uploader{
service: s,
anytype: s.Anytype(),
}
}
type Uploader interface {
SetBlock(block file.Block) Uploader
SetName(name string) Uploader
SetType(tp model.BlockContentFileType) Uploader
SetBytes(b []byte) Uploader
SetUrl(url string) Uploader
SetFile(path string) Uploader
AddOptions(options ...files.AddOption) Uploader
AutoType(enable bool) Uploader
AsyncUpdates(smartBlockId string) Uploader
Upload(ctx context.Context) (result UploadResult)
UploadAsync(todo context.Context) (ch chan UploadResult)
}
type UploadResult struct {
Name string
Type model.BlockContentFileType
Hash string
MIME string
Size int64
Err error
}
func (ur UploadResult) ToBlock() file.Block {
state := model.BlockContentFile_Done
if ur.Err != nil {
state = model.BlockContentFile_Error
ur.Name = ur.Err.Error()
}
return simple.New(&model.Block{
Content: &model.BlockContentOfFile{
File: &model.BlockContentFile{
Hash: ur.Hash,
Name: ur.Name,
Type: ur.Type,
Mime: ur.MIME,
Size_: ur.Size,
AddedAt: time.Now().Unix(),
State: state,
},
},
}).(file.Block)
}
type uploader struct {
service BlockService
anytype anytype.Service
block file.Block
getReader func(ctx context.Context) (*bufioClose, error)
name string
typeDetect bool
forceType bool
smartBlockId string
fileType model.BlockContentFileType
opts []files.AddOption
}
type bufioClose struct {
*bufio.Reader
close func() error
}
func (bc *bufioClose) Close() error {
if bc.close != nil {
return bc.close()
}
return nil
}
func (u *uploader) SetBlock(block file.Block) Uploader {
u.block = block
return u
}
func (u *uploader) SetName(name string) Uploader {
u.name = name
return u
}
func (u *uploader) SetType(tp model.BlockContentFileType) Uploader {
u.fileType = tp
u.forceType = true
return u
}
func (u *uploader) SetBytes(b []byte) Uploader {
u.getReader = func(_ context.Context) (*bufioClose, error) {
return &bufioClose{
Reader: bufio.NewReaderSize(bytes.NewReader(b), bufSize),
}, nil
}
return u
}
func (u *uploader) AddOptions(options ...files.AddOption) Uploader {
return u
}
func (u *uploader) SetUrl(url string) Uploader {
url, _ = uri.ProcessURI(url)
u.name = filepath.Base(url)
u.getReader = func(ctx context.Context) (*bufioClose, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
return &bufioClose{
Reader: bufio.NewReaderSize(resp.Body, bufSize),
close: resp.Body.Close,
}, nil
}
return u
}
func (u *uploader) SetFile(path string) Uploader {
u.name = filepath.Base(path)
u.getReader = func(ctx context.Context) (*bufioClose, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
return &bufioClose{
Reader: bufio.NewReaderSize(f, bufSize),
close: f.Close,
}, nil
}
return u
}
func (u *uploader) AutoType(enable bool) Uploader {
u.typeDetect = enable
return u
}
func (u *uploader) AsyncUpdates(smartBlockId string) Uploader {
u.smartBlockId = smartBlockId
return u
}
func (u *uploader) UploadAsync(ctx context.Context) (result chan UploadResult) {
result = make(chan UploadResult, 1)
if u.block != nil {
u.block.SetState(model.BlockContentFile_Uploading)
u.block = u.block.Copy().(file.Block)
}
go func() {
result <- u.Upload(ctx)
close(result)
}()
return
}
func (u *uploader) Upload(ctx context.Context) (result UploadResult) {
var err error
defer func() {
if err != nil {
result.Err = err
if u.block != nil {
u.block.SetState(model.BlockContentFile_Error).SetName(err.Error())
u.updateBlock()
}
}
}()
if u.getReader == nil {
err = fmt.Errorf("uploader: empty source for upload")
return
}
buf, err := u.getReader(ctx)
if err != nil {
return
}
defer buf.Close()
if !u.forceType {
if u.block != nil {
u.fileType = u.block.Model().GetFile().GetType()
}
if u.typeDetect || u.fileType == model.BlockContentFile_None {
u.fileType = u.detectType(buf)
}
}
var opts = []files.AddOption{
files.WithName(u.name),
files.WithReader(buf),
}
if len(u.opts) > 0 {
opts = append(opts, u.opts...)
}
if u.fileType == model.BlockContentFile_Image {
im, e := u.anytype.ImageAdd(ctx, opts...)
if e == image.ErrFormat {
log.Infof("can't add file '%s' as image: add as file", u.name)
e = nil
return u.SetType(model.BlockContentFile_File).Upload(ctx)
}
if e != nil {
err = e
return
}
result.Hash = im.Hash()
} else {
fl, e := u.anytype.FileAdd(ctx, opts...)
if e != nil {
err = e
return
}
result.Hash = fl.Hash()
if meta := fl.Meta(); meta != nil {
result.MIME = meta.Media
result.Size = meta.Size
}
}
result.Type = u.fileType
result.Name = u.name
if u.block != nil {
u.block.SetName(u.name).
SetState(model.BlockContentFile_Done).
SetType(u.fileType).SetHash(result.Hash).
SetSize(result.Size).
SetMIME(result.MIME)
u.updateBlock()
}
return
}
func (u *uploader) detectType(buf *bufioClose) model.BlockContentFileType {
b, err := buf.Peek(8192)
if err != nil && err != io.EOF {
return model.BlockContentFile_File
}
tp, _ := filetype.Match(b)
return u.detectTypeByMIME(tp.MIME.Value)
}
func (u *uploader) detectTypeByMIME(mime string) model.BlockContentFileType {
if strings.HasPrefix(mime, "image") {
return model.BlockContentFile_Image
}
if strings.HasPrefix(mime, "video") {
return model.BlockContentFile_Video
}
return model.BlockContentFile_File
}
func (u *uploader) updateBlock() {
if u.smartBlockId != "" && u.block != nil {
err := u.service.DoFile(u.smartBlockId, func(f File) error {
return f.UpdateFile(u.block.Model().Id, func(b file.Block) error {
b.SetModel(u.block.Copy().Model().GetFile())
return nil
})
})
if err != nil {
log.Warnf("upload file: can't update info: %v", err)
}
}
}

View file

@ -0,0 +1,133 @@
package file_test
import (
"context"
"image"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/anytypeio/go-anytype-library/core"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/file"
"github.com/anytypeio/go-anytype-middleware/core/block/simple"
file2 "github.com/anytypeio/go-anytype-middleware/core/block/simple/file"
"github.com/anytypeio/go-anytype-middleware/util/testMock"
"github.com/anytypeio/go-anytype-middleware/util/testMock/mockFile"
"github.com/golang/mock/gomock"
"github.com/magiconair/properties/assert"
"github.com/stretchr/testify/require"
)
func TestUploader_Upload(t *testing.T) {
ctx := context.Background()
newBlock := func(tp model.BlockContentFileType) file2.Block {
return simple.New(&model.Block{Content: &model.BlockContentOfFile{File: &model.BlockContentFile{Type: tp}}}).(file2.Block)
}
t.Run("empty source", func(t *testing.T) {
fx := newFixture(t)
defer fx.tearDown()
res := fx.Upload(ctx)
require.Error(t, res.Err)
})
t.Run("image by block type", func(t *testing.T) {
fx := newFixture(t)
defer fx.tearDown()
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(fx.newImage("123"), nil)
b := newBlock(model.BlockContentFile_Image)
res := fx.Uploader.SetBlock(b).SetFile("./testdata/unnamed.jpg").Upload(ctx)
require.NoError(t, res.Err)
assert.Equal(t, res.Hash, "123")
assert.Equal(t, res.Name, "unnamed.jpg")
assert.Equal(t, b.Model().GetFile().Name, "unnamed.jpg")
})
t.Run("image type detect", func(t *testing.T) {
fx := newFixture(t)
defer fx.tearDown()
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(fx.newImage("123"), nil)
res := fx.Uploader.AutoType(true).SetFile("./testdata/unnamed.jpg").Upload(ctx)
require.NoError(t, res.Err)
})
t.Run("image to file failover", func(t *testing.T) {
fx := newFixture(t)
defer fx.tearDown()
meta := &core.FileMeta{
Media: "text/text",
Name: "test.txt",
Size: 3,
Added: time.Now(),
}
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(nil, image.ErrFormat)
fx.anytype.EXPECT().FileAdd(gomock.Any(), gomock.Any()).Return(fx.newFile("123", meta), nil)
b := newBlock(model.BlockContentFile_Image)
res := fx.Uploader.SetBlock(b).SetFile("./testdata/test.txt").Upload(ctx)
require.NoError(t, res.Err)
assert.Equal(t, res.Hash, "123")
assert.Equal(t, res.Name, "test.txt")
assert.Equal(t, b.Model().GetFile().Name, "test.txt")
assert.Equal(t, b.Model().GetFile().Type, model.BlockContentFile_File)
})
t.Run("file from url", func(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./testdata/unnamed.jpg")
})
serv := httptest.NewServer(mux)
defer serv.Close()
fx := newFixture(t)
defer fx.tearDown()
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(fx.newImage("123"), nil)
res := fx.Uploader.AutoType(true).SetUrl(serv.URL + "/unnamed.jpg").Upload(ctx)
require.NoError(t, res.Err)
assert.Equal(t, res.Hash, "123")
assert.Equal(t, res.Name, "unnamed.jpg")
b := res.ToBlock()
assert.Equal(t, b.Model().GetFile().Name, "unnamed.jpg")
})
t.Run("bytes", func(t *testing.T) {
fx := newFixture(t)
defer fx.tearDown()
fx.anytype.EXPECT().FileAdd(gomock.Any(), gomock.Any()).Return(fx.newFile("123", &core.FileMeta{}), nil)
res := fx.Uploader.SetBytes([]byte("my bytes")).SetName("filename").Upload(ctx)
require.NoError(t, res.Err)
assert.Equal(t, res.Hash, "123")
assert.Equal(t, res.Name, "filename")
})
}
func newFixture(t *testing.T) *uplFixture {
fx := &uplFixture{
ctrl: gomock.NewController(t),
}
fx.anytype = testMock.NewMockService(fx.ctrl)
fx.fileService = mockFile.NewMockBlockService(fx.ctrl)
fx.fileService.EXPECT().Anytype().Return(fx.anytype).AnyTimes()
fx.Uploader = file.NewUploader(fx.fileService)
return fx
}
type uplFixture struct {
file.Uploader
fileService *mockFile.MockBlockService
anytype *testMock.MockService
ctrl *gomock.Controller
}
func (fx *uplFixture) newImage(hash string) *testMock.MockImage {
im := testMock.NewMockImage(fx.ctrl)
im.EXPECT().Hash().Return(hash).AnyTimes()
return im
}
func (fx *uplFixture) newFile(hash string, meta *core.FileMeta) *testMock.MockFile {
f := testMock.NewMockFile(fx.ctrl)
f.EXPECT().Hash().Return(hash).AnyTimes()
f.EXPECT().Meta().Return(meta).AnyTimes()
return f
}
func (fx *uplFixture) tearDown() {
fx.ctrl.Finish()
}

View file

@ -17,6 +17,7 @@ import (
"github.com/anytypeio/go-anytype-middleware/anymark"
"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/process"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/anytypeio/go-anytype-middleware/util/pbtypes"
"github.com/anytypeio/go-anytype-middleware/util/slice"
@ -62,11 +63,16 @@ type Services interface {
CreateSmartBlock(req pb.RpcBlockCreatePageRequest) (pageId string, err error)
SetDetails(req pb.RpcBlockSetDetailsRequest) (err error)
SimplePaste(contextId string, anySlot []*model.Block) (err error)
UploadBlockFile(ctx *state.Context, req pb.RpcBlockUploadRequest) error
BookmarkFetch(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) error
UploadBlockFileSync(ctx *state.Context, req pb.RpcBlockUploadRequest) error
BookmarkFetchSync(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) error
ProcessAdd(p process.Process) (err error)
}
func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportMarkdownRequest) (rootLinks []*model.Block, err error) {
progress := process.NewProgress(pb.ModelProcess_Import)
defer progress.Finish()
imp.ctrl.ProcessAdd(progress)
progress.SetProgressMessage("read dir")
s := imp.NewStateCtx(ctx)
defer log.Debug("5. ImportMarkdown: all smartBlocks done")
@ -80,9 +86,17 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
filesCount := len(files)
log.Debug("FILES COUNT:", filesCount)
progress.SetTotal(int64(filesCount) * 8) // 8 loops
var pagesCreated int
progress.SetProgressMessage("process links (1)")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
// index links in the root csv file
if !file.isRootFile || !strings.EqualFold(filepath.Ext(name), ".csv") {
continue
@ -99,7 +113,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
}
}
progress.SetProgressMessage("creating documents")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
if !strings.EqualFold(filepath.Ext(name), ".md") {
continue
}
@ -120,7 +141,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
log.Debug("pages created:", pagesCreated)
progress.SetProgressMessage("set documents names")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
var title string
var emoji string
@ -183,8 +211,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
}
log.Debug("1. ImportMarkdown: all smartBlocks created")
log.Debug("1. ImportMarkdown: all smartBlocks created")
progress.SetProgressMessage("process links (2)")
for _, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
if file.pageID == "" {
// file is not a page
continue
@ -219,7 +253,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
}
}
progress.SetProgressMessage("process csv")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
// wrap root-level csv files with page
if file.isRootFile && strings.EqualFold(filepath.Ext(name), ".csv") {
pageID, err := imp.ctrl.CreateSmartBlock(pb.RpcBlockCreatePageRequest{})
@ -276,7 +317,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
}
log.Debug("2. ImportMarkdown: start to paste blocks")
progress.SetProgressMessage("create content")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
if file.pageID == "" {
// file is not a page
continue
@ -293,7 +341,14 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
}
log.Debug("3. ImportMarkdown: all blocks pasted. Start to upload files & fetch bookmarks")
progress.SetProgressMessage("upload files")
for name, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
log.Debug(" >>> current page:", name, " | linked: ", file.hasInboundLinks)
if file.pageID == "" {
continue
@ -301,7 +356,7 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
for _, b := range file.parsedBlocks {
if bm := b.GetBookmark(); bm != nil {
err = imp.ctrl.BookmarkFetch(ctx, pb.RpcBlockBookmarkFetchRequest{
err = imp.ctrl.BookmarkFetchSync(ctx, pb.RpcBlockBookmarkFetchRequest{
ContextId: file.pageID,
BlockId: b.Id,
Url: bm.Url,
@ -314,7 +369,7 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
log.Debug(" page:", name, " | start to upload file :", f.Name)
if strings.HasPrefix(f.Name, "http://") || strings.HasPrefix(f.Name, "https://") {
err = imp.ctrl.UploadBlockFile(ctx, pb.RpcBlockUploadRequest{
err = imp.ctrl.UploadBlockFileSync(ctx, pb.RpcBlockUploadRequest{
ContextId: file.pageID,
BlockId: b.Id,
Url: f.Name,
@ -351,23 +406,27 @@ func (imp *importImpl) ImportMarkdown(ctx *state.Context, req pb.RpcBlockImportM
targetFile.Close()
tmpFile.Close()
err = imp.ctrl.UploadBlockFile(ctx, pb.RpcBlockUploadRequest{
err = imp.ctrl.UploadBlockFileSync(ctx, pb.RpcBlockUploadRequest{
ContextId: file.pageID,
BlockId: b.Id,
FilePath: tmpFile.Name(),
Url: "",
})
os.Remove(tmpFile.Name())
if err != nil {
return rootLinks, fmt.Errorf("can not import this file: %s. error: %s", f.Name, err)
}
os.Remove(tmpFile.Name())
}
}
}
progress.SetProgressMessage("process links (3)")
for _, file := range files {
select {
case <-progress.Canceled():
return nil, fmt.Errorf("canceled")
default:
}
progress.AddDone(1)
if file.pageID == "" {
// not a page
continue

View file

@ -12,15 +12,22 @@ import (
"github.com/anytypeio/go-anytype-middleware/util/linkpreview"
)
func NewPage(m meta.Service, fileSource file.FileSource, bCtrl bookmark.DoBookmark, importServices _import.Services, lp linkpreview.LinkPreview) *Page {
func NewPage(
m meta.Service,
fileSource file.BlockService,
bCtrl bookmark.DoBookmark,
importServices _import.Services,
lp linkpreview.LinkPreview,
) *Page {
sb := smartblock.New(m)
f := file.NewFile(sb, fileSource)
return &Page{
SmartBlock: sb,
Basic: basic.NewBasic(sb),
IHistory: basic.NewHistory(sb),
Text: stext.NewText(sb),
File: file.NewFile(sb, fileSource),
Clipboard: clipboard.NewClipboard(sb),
File: f,
Clipboard: clipboard.NewClipboard(sb, f),
Bookmark: bookmark.NewBookmark(sb, lp, bCtrl),
Import: _import.NewImport(sb, importServices),
}

View file

@ -13,15 +13,16 @@ import (
"github.com/anytypeio/go-anytype-middleware/util/linkpreview"
)
func NewProfile(m meta.Service, fileSource file.FileSource, bCtrl bookmark.DoBookmark, lp linkpreview.LinkPreview, sendEvent func(e *pb.Event)) *Profile {
func NewProfile(m meta.Service, fileSource file.BlockService, bCtrl bookmark.DoBookmark, lp linkpreview.LinkPreview, sendEvent func(e *pb.Event)) *Profile {
sb := smartblock.New(m)
f := file.NewFile(sb, fileSource)
return &Profile{
SmartBlock: sb,
Basic: basic.NewBasic(sb),
IHistory: basic.NewHistory(sb),
Text: stext.NewText(sb),
File: file.NewFile(sb, fileSource),
Clipboard: clipboard.NewClipboard(sb),
File: f,
Clipboard: clipboard.NewClipboard(sb, f),
Bookmark: bookmark.NewBookmark(sb, lp, bCtrl),
sendEvent: sendEvent,
}

View file

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/block/database"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/basic"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/dataview"
"github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock"
@ -15,15 +16,17 @@ import (
"github.com/google/uuid"
)
func NewSet(ms meta.Service, sendEvent func(e *pb.Event)) *Set {
sb := smartblock.New(ms)
return &Set{
SmartBlock: sb,
Basic: basic.NewBasic(sb),
IHistory: basic.NewHistory(sb),
Dataview: dataview.NewDataview(sb, sendEvent),
sendEvent: sendEvent,
func NewSet(ms meta.Service, dbCtrl database.Ctrl) *Set {
sb := &Set{
SmartBlock: smartblock.New(ms),
}
sb.Basic = basic.NewBasic(sb)
sb.IHistory = basic.NewHistory(sb)
sb.Dataview = dataview.NewDataview(sb)
sb.Router = database.New(dbCtrl)
return sb
}
type Set struct {
@ -31,8 +34,7 @@ type Set struct {
basic.Basic
basic.IHistory
dataview.Dataview
sendEvent func(e *pb.Event)
database.Router
}
func (p *Set) Init(s source.Source, _ bool) (err error) {

View file

@ -287,14 +287,17 @@ func (sb *smartBlock) updatePageStore(beforeSnippet string, act *undo.Action) (e
if sb.Type() == pb.SmartBlockType_Archive {
return
}
var storeInfo struct {
details *types.Struct
snippet *string
snippet string
links []string
}
if act == nil || act.Details != nil {
storeInfo.details = pbtypes.CopyStruct(sb.Details())
}
if hasDepIds(act) {
if sb.checkSubscriptions() {
storeInfo.links = make([]string, len(sb.depIds))
@ -303,15 +306,16 @@ func (sb *smartBlock) updatePageStore(beforeSnippet string, act *undo.Action) (e
}
}
afterSnippet := sb.Doc.Snippet()
if beforeSnippet != afterSnippet {
storeInfo.snippet = &afterSnippet
if afterSnippet := sb.Doc.Snippet(); beforeSnippet != afterSnippet {
storeInfo.snippet = afterSnippet
}
if at := sb.Anytype(); at != nil && sb.Type() != pb.SmartBlockType_Breadcrumbs {
if storeInfo.links != nil || storeInfo.details != nil || storeInfo.snippet != nil {
return at.PageStore().Update(sb.Id(), storeInfo.details, storeInfo.links, storeInfo.snippet)
if storeInfo.links != nil || storeInfo.details != nil || len(storeInfo.snippet) > 0 {
return at.PageStore().UpdatePage(sb.Id(), storeInfo.details, storeInfo.links, storeInfo.snippet)
}
}
return nil
}

View file

@ -17,10 +17,15 @@ func NewDocFromSnapshot(rootId string, snapshot *pb.ChangeSnapshot) Doc {
for _, b := range snapshot.Data.Blocks {
blocks[b.Id] = simple.New(b)
}
fileKeys := make([]pb.ChangeFileKeys, 0, len(snapshot.FileKeys))
for _, fk := range snapshot.FileKeys {
fileKeys = append(fileKeys, *fk)
}
return &State{
rootId: rootId,
blocks: blocks,
details: snapshot.Data.Details,
rootId: rootId,
blocks: blocks,
details: snapshot.Data.Details,
fileKeys: fileKeys,
}
}

View file

@ -0,0 +1,93 @@
package process
import (
"sync"
"sync/atomic"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/globalsign/mgo/bson"
)
func NewProgress(pType pb.ModelProcessType) *Progress {
return &Progress{
id: bson.NewObjectId().Hex(),
done: make(chan struct{}),
cancel: make(chan struct{}),
pType: pType,
}
}
type Progress struct {
id string
done, cancel chan struct{}
totalCount, doneCount int64
pType pb.ModelProcessType
pMessage string
m sync.Mutex
}
func (p *Progress) SetTotal(total int64) {
atomic.StoreInt64(&p.totalCount, total)
}
func (p *Progress) SetDone(done int64) {
atomic.StoreInt64(&p.doneCount, done)
}
func (p *Progress) AddDone(delta int64) {
atomic.AddInt64(&p.doneCount, delta)
}
func (p *Progress) SetProgressMessage(msg string) {
p.m.Lock()
defer p.m.Unlock()
p.pMessage = msg
}
func (p *Progress) Canceled() chan struct{} {
return p.cancel
}
func (p *Progress) Finish() {
close(p.done)
}
func (p *Progress) Id() string {
return p.id
}
func (p *Progress) Cancel() (err error) {
close(p.cancel)
return
}
func (p *Progress) Info() pb.ModelProcess {
state := pb.ModelProcess_Running
select {
case <-p.done:
state = pb.ModelProcess_Done
default:
}
select {
case <-p.cancel:
state = pb.ModelProcess_Canceled
default:
}
p.m.Lock()
defer p.m.Unlock()
return pb.ModelProcess{
Id: p.id,
Type: p.pType,
State: state,
Progress: &pb.ModelProcessProgress{
Total: atomic.LoadInt64(&p.totalCount),
Done: atomic.LoadInt64(&p.doneCount),
Message: p.pMessage,
},
}
}
func (p *Progress) Done() chan struct{} {
return p.done
}

View file

@ -1,6 +1,7 @@
package block
import (
"context"
"errors"
"fmt"
"sync"
@ -30,7 +31,6 @@ import (
"github.com/anytypeio/go-anytype-middleware/core/block/simple"
_ "github.com/anytypeio/go-anytype-middleware/core/block/simple/bookmark"
_ "github.com/anytypeio/go-anytype-middleware/core/block/simple/file"
simpleFile "github.com/anytypeio/go-anytype-middleware/core/block/simple/file"
_ "github.com/anytypeio/go-anytype-middleware/core/block/simple/link"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/text"
@ -105,6 +105,7 @@ type Service interface {
UploadFile(req pb.RpcUploadFileRequest) (hash string, err error)
UploadBlockFile(ctx *state.Context, req pb.RpcBlockUploadRequest) error
UploadBlockFileSync(ctx *state.Context, req pb.RpcBlockUploadRequest) (err error)
CreateAndUploadFile(ctx *state.Context, req pb.RpcBlockFileCreateAndUploadRequest) (id string, err error)
DropFiles(req pb.RpcExternalDropFilesRequest) (err error)
@ -120,7 +121,12 @@ type Service interface {
SetDataviewActiveView(ctx *state.Context, req pb.RpcBlockSetDataviewActiveViewRequest) error
CreateDataviewView(ctx *state.Context, req pb.RpcBlockCreateDataviewViewRequest) (id string, err error)
CreateDataviewRecord(ctx *state.Context, req pb.RpcBlockCreateDataviewRecordRequest) (*types.Struct, error)
UpdateDataviewRecord(ctx *state.Context, req pb.RpcBlockUpdateDataviewRecordRequest) error
DeleteDataviewRecord(ctx *state.Context, req pb.RpcBlockDeleteDataviewRecordRequest) error
BookmarkFetch(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) error
BookmarkFetchSync(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) (err error)
BookmarkCreateAndFetch(ctx *state.Context, req pb.RpcBlockBookmarkCreateAndFetchRequest) (id string, err error)
ProcessAdd(p process.Process) (err error)
@ -352,7 +358,6 @@ func (s *service) SetBreadcrumbs(ctx *state.Context, req pb.RpcBlockSetBreadcrum
} else {
return ErrUnexpectedBlockType
}
return nil
})
}
@ -625,6 +630,35 @@ func (s *service) CreateDataviewView(ctx *state.Context, req pb.RpcBlockCreateDa
return
}
func (s *service) CreateDataviewRecord(ctx *state.Context, req pb.RpcBlockCreateDataviewRecordRequest) (rec *types.Struct, err error) {
err = s.DoDataview(req.ContextId, func(b dataview.Dataview) error {
cr, err := b.CreateRecord(ctx, req.BlockId, model.PageDetails{Details: req.Record})
if err != nil {
return err
}
rec = cr.Details
return nil
})
return
}
func (s *service) UpdateDataviewRecord(ctx *state.Context, req pb.RpcBlockUpdateDataviewRecordRequest) (err error) {
err = s.DoDataview(req.ContextId, func(b dataview.Dataview) error {
return b.UpdateRecord(ctx, req.BlockId, req.RecordId, model.PageDetails{Details: req.Record})
})
return
}
func (s *service) DeleteDataviewRecord(ctx *state.Context, req pb.RpcBlockDeleteDataviewRecordRequest) (err error) {
err = s.DoDataview(req.ContextId, func(b dataview.Dataview) error {
return b.DeleteRecord(ctx, req.BlockId, req.RecordId)
})
return
}
func (s *service) Copy(req pb.RpcBlockCopyRequest) (textSlot string, htmlSlot string, anySlot []*model.Block, err error) {
err = s.DoClipboard(req.ContextId, func(cb clipboard.Clipboard) error {
textSlot, htmlSlot, anySlot, err = cb.Copy(req)
@ -758,10 +792,21 @@ func (s *service) SetAlign(ctx *state.Context, contextId string, align model.Blo
}
func (s *service) UploadBlockFile(ctx *state.Context, req pb.RpcBlockUploadRequest) (err error) {
<-uploadFilesLimiter
defer func() { uploadFilesLimiter <- struct{}{} }()
return s.DoFile(req.ContextId, func(b file.File) error {
err = b.Upload(ctx, req.BlockId, req.FilePath, req.Url)
err = b.Upload(ctx, req.BlockId, file.FileSource{
Path: req.FilePath,
Url: req.Url,
}, false)
return err
})
}
func (s *service) UploadBlockFileSync(ctx *state.Context, req pb.RpcBlockUploadRequest) (err error) {
return s.DoFile(req.ContextId, func(b file.File) error {
err = b.Upload(ctx, req.BlockId, file.FileSource{
Path: req.FilePath,
Url: req.Url,
}, true)
return err
})
}
@ -775,22 +820,20 @@ func (s *service) CreateAndUploadFile(ctx *state.Context, req pb.RpcBlockFileCre
}
func (s *service) UploadFile(req pb.RpcUploadFileRequest) (hash string, err error) {
var tempFile = simpleFile.NewFile(&model.Block{Content: &model.BlockContentOfFile{File: &model.BlockContentFile{}}}).(simpleFile.Block)
var opts []files.AddOption
upl := file.NewUploader(s)
if req.DisableEncryption {
opts = append(opts, files.WithPlaintext(true))
upl.AddOptions(files.WithPlaintext(true))
}
u := simpleFile.NewUploader(s.Anytype(), func(f func(file simpleFile.Block)) {
f(tempFile)
}, opts...)
if err = u.DoType(req.LocalPath, req.Url, req.Type); err != nil {
return
if req.Type != model.BlockContentFile_None {
upl.SetType(req.Type)
} else {
upl.AutoType(true)
}
result := tempFile.Model().GetFile()
if result.State != model.BlockContentFile_Done {
return "", fmt.Errorf("unexpected upload error")
res := upl.SetFile(req.LocalPath).Upload(context.TODO())
if res.Err != nil {
return "", res.Err
}
return result.Hash, nil
return res.Hash, nil
}
func (s *service) DropFiles(req pb.RpcExternalDropFilesRequest) (err error) {
@ -813,7 +856,13 @@ func (s *service) Redo(ctx *state.Context, req pb.RpcBlockRedoRequest) (err erro
func (s *service) BookmarkFetch(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) (err error) {
return s.DoBookmark(req.ContextId, func(b bookmark.Bookmark) error {
return b.Fetch(ctx, req.BlockId, req.Url)
return b.Fetch(ctx, req.BlockId, req.Url, false)
})
}
func (s *service) BookmarkFetchSync(ctx *state.Context, req pb.RpcBlockBookmarkFetchRequest) (err error) {
return s.DoBookmark(req.ContextId, func(b bookmark.Bookmark) error {
return b.Fetch(ctx, req.BlockId, req.Url, true)
})
}
@ -900,16 +949,14 @@ func (s *service) createSmartBlock(id string, initEmpty bool) (sb smartblock.Sma
case pb.SmartBlockType_Archive:
sb = editor.NewArchive(s.meta, s)
case pb.SmartBlockType_Set:
sb = editor.NewSet(s.meta, s.sendEvent)
sb = editor.NewSet(s.meta, s)
case pb.SmartBlockType_ProfilePage:
sb = editor.NewProfile(s.meta, s, s, s.linkPreview, s.sendEvent)
default:
return nil, fmt.Errorf("unexpected smartblock type: %v", sc.Type())
}
if err = sb.Init(sc, initEmpty); err != nil {
return
}
err = sb.Init(sc, initEmpty)
return
}

View file

@ -5,6 +5,7 @@ import (
"fmt"
"net/http"
"path/filepath"
"sync"
"time"
"github.com/anytypeio/go-anytype-library/files"
@ -46,6 +47,7 @@ type FetchParams struct {
Anytype anytype.Service
Updater Updater
LinkPreview linkpreview.LinkPreview
Sync bool
}
type Updater func(id string, apply func(b Block) error) (err error)
@ -72,7 +74,11 @@ func (f *Bookmark) SetFaviconHash(hash string) {
func (f *Bookmark) Fetch(params FetchParams) (err error) {
f.content.Url = params.Url
go fetcher(f.Id, params)
if !params.Sync {
go fetcher(f.Id, params)
} else {
fetcher(f.Id, params)
}
return
}
@ -151,7 +157,7 @@ func (b *Bookmark) ApplyEvent(e *pb.EventBlockSetBookmark) (err error) {
}
func fetcher(id string, params FetchParams) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
data, err := params.LinkPreview.Fetch(ctx, params.Url)
cancel()
if err != nil {
@ -167,9 +173,11 @@ func fetcher(id string, params FetchParams) {
fmt.Println("can't set linkpreview data:", id, err)
return
}
var wg sync.WaitGroup
if data.ImageUrl != "" {
wg.Add(1)
go func() {
defer wg.Done()
hash, err := loadImage(params.Anytype, data.ImageUrl)
if err != nil {
fmt.Println("can't load image url:", data.ImageUrl, err)
@ -186,7 +194,9 @@ func fetcher(id string, params FetchParams) {
}()
}
if data.FaviconUrl != "" {
wg.Add(1)
go func() {
defer wg.Done()
hash, err := loadImage(params.Anytype, data.FaviconUrl)
if err != nil {
fmt.Println("can't load favicon url:", data.FaviconUrl, err)
@ -202,6 +212,7 @@ func fetcher(id string, params FetchParams) {
}
}()
}
wg.Wait()
}
func (f *Bookmark) FillFileHashes(hashes []string) []string {

View file

@ -2,11 +2,9 @@ package file
import (
"fmt"
"strings"
"time"
"github.com/anytypeio/go-anytype-library/core"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/anytype"
"github.com/anytypeio/go-anytype-middleware/core/block/simple"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/base"
"github.com/anytypeio/go-anytype-middleware/pb"
@ -30,10 +28,14 @@ func NewFile(m *model.Block) simple.Block {
type Block interface {
simple.Block
simple.FileHashes
Upload(stor anytype.Service, updater Updater, localPath, url string) (err error)
SetFileData(hash string, meta core.FileMeta)
SetImage(hash, name string)
SetState(state model.BlockContentFileState)
SetHash(hash string) Block
SetName(name string) Block
SetState(state model.BlockContentFileState) Block
SetType(tp model.BlockContentFileType) Block
SetSize(size int64) Block
SetMIME(mime string) Block
SetTime(tm time.Time) Block
SetModel(m *model.BlockContentFile) Block
ApplyEvent(e *pb.EventBlockSetFile) error
}
@ -46,26 +48,50 @@ type File struct {
content *model.BlockContentFile
}
func (f *File) Upload(stor anytype.Service, updater Updater, localPath, url string) (err error) {
if f.content.State != model.BlockContentFile_Empty && f.content.State != model.BlockContentFile_Error {
return fmt.Errorf("block is not empty")
}
f.content.State = model.BlockContentFile_Uploading
id := f.Id
up := &uploader{
updateFile: func(apply func(file Block)) {
if e := updater.UpdateFileBlock(id, apply); e != nil {
log.Warnf("can't update file block: %v", e)
}
},
storage: stor,
}
if f.content.Type == model.BlockContentFile_Image {
go up.DoImage(localPath, url)
} else {
go up.Do(localPath, url)
}
return
func (f *File) SetHash(hash string) Block {
f.content.Hash = hash
return f
}
func (f *File) SetName(name string) Block {
f.content.Name = name
return f
}
func (f *File) SetState(state model.BlockContentFileState) Block {
f.content.State = state
return f
}
func (f *File) SetType(tp model.BlockContentFileType) Block {
f.content.Type = tp
return f
}
func (f *File) SetSize(size int64) Block {
f.content.Size_ = size
return f
}
func (f *File) SetMIME(mime string) Block {
f.content.Mime = mime
return f
}
func (f *File) SetTime(tm time.Time) Block {
f.content.AddedAt = tm.Unix()
return f
}
func (f *File) SetModel(m *model.BlockContentFile) Block {
f.content.Hash = m.Hash
f.content.Type = m.Type
f.content.Name = m.Name
f.content.AddedAt = m.AddedAt
f.content.Mime = m.Mime
f.content.Size_ = m.Size_
f.content.State = m.State
return f
}
func (f *File) Copy() simple.Block {
@ -76,31 +102,6 @@ func (f *File) Copy() simple.Block {
}
}
func (f *File) SetState(state model.BlockContentFileState) {
f.content.State = state
}
func (f *File) SetFileData(hash string, meta core.FileMeta) {
f.content.Size_ = meta.Size
isVideoCT := strings.HasPrefix(meta.Media, "video/")
if f.content.Type == model.BlockContentFile_Video && !isVideoCT {
f.content.Type = model.BlockContentFile_File
} else if f.content.Type == model.BlockContentFile_None || f.content.Type == model.BlockContentFile_Image {
f.content.Type = model.BlockContentFile_File
}
f.content.State = model.BlockContentFile_Done
f.content.Name = meta.Name
f.content.Hash = hash
f.content.Mime = meta.Media
}
func (f *File) SetImage(hash, name string) {
f.content.Type = model.BlockContentFile_Image
f.content.State = model.BlockContentFile_Done
f.content.Name = name
f.content.Hash = hash
}
func (f *File) Diff(b simple.Block) (msgs []*pb.EventMessage, err error) {
file, ok := b.(*File)
if !ok {

View file

@ -4,7 +4,6 @@ import (
"testing"
"time"
"github.com/anytypeio/go-anytype-library/core"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/block/simple/base"
"github.com/anytypeio/go-anytype-middleware/pb"
@ -29,18 +28,8 @@ func TestFile_Diff(t *testing.T) {
b1 := testBlock()
b2 := testBlock()
tm := time.Now()
b1.SetFileData("1", core.FileMeta{
Media: "2",
Name: "3",
Size: 4,
Added: tm,
})
b2.SetFileData("1", core.FileMeta{
Media: "2",
Name: "3",
Size: 4,
Added: tm,
})
b1.SetHash("1").SetMIME("2").SetName("3").SetSize(4).SetTime(tm)
b2.SetHash("1").SetMIME("2").SetName("3").SetSize(4).SetTime(tm)
d, err := b1.Diff(b2)
require.NoError(t, err)
assert.Len(t, d, 0)
@ -58,12 +47,7 @@ func TestFile_Diff(t *testing.T) {
b2 := testBlock()
b2.SetState(model.BlockContentFile_Done)
b2.SetFileData("hash", core.FileMeta{
Media: "video/mpeg",
Name: "image.mpg",
Size: 3,
Added: time.Now(),
})
b2.SetHash("hash").SetMIME("video/mpeg").SetName("image.mpg").SetSize(3).SetTime(time.Now()).SetType(model.BlockContentFile_Video)
diff, err := b1.Diff(b2)
require.NoError(t, err)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1 +0,0 @@
test

View file

@ -1,137 +0,0 @@
package file
import (
"context"
"image"
"io"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/anytypeio/go-anytype-middleware/util/uri"
"github.com/anytypeio/go-anytype-library/files"
"github.com/anytypeio/go-anytype-library/logging"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/core/anytype"
"github.com/h2non/filetype"
)
var log = logging.Logger("anytype-mw-file")
func NewUploader(a anytype.Service, fn func(f func(file Block)), opts ...files.AddOption) Uploader {
return &uploader{
updateFile: fn,
storage: a,
options: opts,
}
}
type Uploader interface {
DoAuto(localPath string)
DoType(localPath, url string, fType model.BlockContentFileType) (err error)
}
type uploader struct {
updateFile func(f func(file Block))
storage anytype.Service
isImage bool
options []files.AddOption
}
func (u *uploader) DoAuto(localPath string) {
tp, _ := filetype.MatchFile(localPath)
if strings.HasPrefix(tp.MIME.Value, "image") {
u.DoImage(localPath, "")
} else {
u.Do(localPath, "")
}
}
func (u *uploader) DoType(localPath, url string, fType model.BlockContentFileType) (err error) {
u.isImage = fType == model.BlockContentFile_Image
url, _ = uri.ProcessURI(url)
return u.do(localPath, url)
}
func (u *uploader) DoImage(localPath, url string) {
u.isImage = true
err := u.do(localPath, url)
if err == image.ErrFormat {
log.Infof("can't decode image upload as file: %v", err)
u.isImage = false
err = u.do(localPath, url)
}
if err != nil {
log.Warningf("upload file error: %v", err)
u.updateFile(func(file Block) {
file.SetState(model.BlockContentFile_Error)
})
}
}
func (u *uploader) Do(localPath, url string) {
if err := u.do(localPath, url); err != nil {
log.Warnf("upload file error: %v", err)
u.updateFile(func(file Block) {
file.SetState(model.BlockContentFile_Error)
})
}
}
func (u *uploader) do(localPath, url string) (err error) {
if url != "" {
return u.doUrl(url)
} else {
return u.doLocal(localPath)
}
}
func (u *uploader) doLocal(localPath string) (err error) {
name := filepath.Base(localPath)
f, err := os.Open(localPath)
if err != nil {
return
}
return u.upload(f, name)
}
func (u *uploader) doUrl(url string) (err error) {
name := filepath.Base(url)
resp, err := http.Get(url)
if err != nil {
return
}
return u.upload(resp.Body, name)
}
func (u *uploader) upload(rd io.ReadCloser, name string) (err error) {
defer rd.Close()
if u.isImage {
return u.uploadImage(rd, name)
}
return u.uploadFile(rd, name)
}
func (u *uploader) uploadImage(rd io.Reader, name string) (err error) {
image, err := u.storage.ImageAdd(context.TODO(), append(u.options, files.WithReader(rd), files.WithName(name))...)
if err != nil {
return
}
u.updateFile(func(file Block) {
file.SetImage(image.Hash(), name)
})
return
}
func (u *uploader) uploadFile(rd io.Reader, name string) (err error) {
cf, err := u.storage.FileAdd(context.TODO(), append(u.options, files.WithReader(rd), files.WithName(name))...)
if err != nil {
return
}
u.updateFile(func(file Block) {
file.SetFileData(cf.Hash(), *cf.Meta())
})
return
}

View file

@ -1,175 +0,0 @@
package file
import (
"image"
"net/http"
"net/http/httptest"
"path/filepath"
"sync"
"testing"
"time"
"github.com/anytypeio/go-anytype-library/core"
"github.com/anytypeio/go-anytype-library/pb/model"
"github.com/anytypeio/go-anytype-middleware/util/testMock"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestUploader_Do(t *testing.T) {
var (
fileHash = "12345"
fileMeta = &core.FileMeta{
Media: "text/plain; charset=utf-8",
Name: "test.txt",
Size: 10,
Added: time.Now(),
}
)
testFilepath, _ := filepath.Abs("./testdata/test.txt")
t.Run("success local file", func(t *testing.T) {
f := NewFile(&model.Block{
Id: "test",
Content: &model.BlockContentOfFile{File: &model.BlockContentFile{}},
}).(*File)
fx := newFixture(t, f)
defer fx.ctrl.Finish()
file := testMock.NewMockFile(fx.ctrl)
file.EXPECT().Hash().Return(fileHash).AnyTimes()
file.EXPECT().Meta().Return(fileMeta).AnyTimes()
fx.anytype.EXPECT().FileAdd(gomock.Any(), gomock.Any()).Return(file, nil)
fx.mu.Lock()
err := f.Upload(fx.anytype, fx, testFilepath, "")
fx.mu.Unlock()
require.NoError(t, err)
select {
case <-time.After(time.Second * 2):
t.Error("upload timeout")
return
case <-fx.done:
}
})
t.Run("success url", func(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("12345"))
}))
defer ts.Close()
f := NewFile(&model.Block{
Id: "test",
Content: &model.BlockContentOfFile{File: &model.BlockContentFile{}},
}).(*File)
fx := newFixture(t, f)
defer fx.ctrl.Finish()
file := testMock.NewMockFile(fx.ctrl)
file.EXPECT().Hash().Return(fileHash).AnyTimes()
file.EXPECT().Meta().Return(fileMeta).AnyTimes()
fx.anytype.EXPECT().FileAdd(gomock.Any(), gomock.Any()).Return(file, nil)
fx.mu.Lock()
err := f.Upload(fx.anytype, fx, "", ts.URL+"/http.txt")
fx.mu.Unlock()
require.NoError(t, err)
select {
case <-time.After(time.Second * 2):
t.Error("upload timeout")
return
case <-fx.done:
}
})
t.Run("image file fallback", func(t *testing.T) {
f := NewFile(&model.Block{
Id: "test",
Content: &model.BlockContentOfFile{File: &model.BlockContentFile{Type: model.BlockContentFile_Image}},
}).(*File)
fx := newFixture(t, f)
defer fx.ctrl.Finish()
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(nil, image.ErrFormat)
file := testMock.NewMockFile(fx.ctrl)
file.EXPECT().Hash().Return(fileHash).AnyTimes()
file.EXPECT().Meta().Return(fileMeta).AnyTimes()
fx.anytype.EXPECT().FileAdd(gomock.Any(), gomock.Any()).Return(file, nil)
fx.mu.Lock()
err := f.Upload(fx.anytype, fx, testFilepath, "")
fx.mu.Unlock()
require.NoError(t, err)
select {
case <-time.After(time.Second * 2):
t.Error("upload timeout")
return
case <-fx.done:
}
})
t.Run("image success", func(t *testing.T) {
f := NewFile(&model.Block{
Id: "test",
Content: &model.BlockContentOfFile{File: &model.BlockContentFile{Type: model.BlockContentFile_Image}},
}).(*File)
fx := newFixture(t, f)
defer fx.ctrl.Finish()
file := testMock.NewMockImage(fx.ctrl)
file.EXPECT().Hash().Return(fileHash).AnyTimes()
fx.anytype.EXPECT().ImageAdd(gomock.Any(), gomock.Any()).Return(file, nil)
fx.mu.Lock()
err := f.Upload(fx.anytype, fx, testFilepath, "")
fx.mu.Unlock()
require.NoError(t, err)
select {
case <-time.After(time.Second * 2):
t.Error("upload timeout")
return
case <-fx.done:
}
})
}
func newFixture(t *testing.T, file *File) *fixture {
ctrl := gomock.NewController(t)
return &fixture{
ctrl: ctrl,
anytype: testMock.NewMockService(ctrl),
file: file,
t: t,
done: make(chan struct{}),
}
}
type fixture struct {
ctrl *gomock.Controller
anytype *testMock.MockService
file *File
t *testing.T
done chan struct{}
mu sync.Mutex
}
func (f *fixture) UpdateFileBlock(id string, apply func(f Block)) error {
f.mu.Lock()
defer f.mu.Unlock()
assert.Equal(f.t, f.file.Id, id)
apply(f.file)
if f.file.content.State == model.BlockContentFile_Done || f.file.content.State == model.BlockContentFile_Error {
close(f.done)
}
return nil
}

View file

@ -40,6 +40,10 @@ type Middleware struct {
m sync.RWMutex
}
func init() {
logging.SetVersion(GitSummary)
}
func New() *Middleware {
return &Middleware{accountSearchCancelAndWait: func() {}}
}

View file

@ -10,7 +10,7 @@ import (
)
func (mw *Middleware) LinkPreview(req *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
url, err := uri.ProcessURI(req.Url)
if err != nil {
@ -22,16 +22,6 @@ func (mw *Middleware) LinkPreview(req *pb.RpcLinkPreviewRequest) *pb.RpcLinkPrev
}
}
if !strings.HasPrefix(req.Url, "http") {
// only http/https supported
// todo: fixed linkpreview for email/tel?
return &pb.RpcLinkPreviewResponse{
Error: &pb.RpcLinkPreviewResponseError{
Code: pb.RpcLinkPreviewResponseError_NULL,
},
}
}
data, err := mw.linkPreview.Fetch(ctx, url)
if err != nil {
// trim the actual url from the error

View file

@ -24,7 +24,7 @@ func (mw *Middleware) LogSend(req *pb.RpcLogSendRequest) *pb.RpcLogSendResponse
case pb.RpcLogSendRequest_INFO:
log.Info(req.Message)
case pb.RpcLogSendRequest_WARNING:
log.Warning(req.Message)
log.Warn(req.Message)
case pb.RpcLogSendRequest_ERROR:
log.Error(req.Message)
}

View file

@ -69,6 +69,10 @@
- [Rpc.Block.Copy.Response.Error](#anytype.Rpc.Block.Copy.Response.Error)
- [Rpc.Block.Create](#anytype.Rpc.Block.Create)
- [Rpc.Block.Create.Dataview](#anytype.Rpc.Block.Create.Dataview)
- [Rpc.Block.Create.Dataview.Record](#anytype.Rpc.Block.Create.Dataview.Record)
- [Rpc.Block.Create.Dataview.Record.Request](#anytype.Rpc.Block.Create.Dataview.Record.Request)
- [Rpc.Block.Create.Dataview.Record.Response](#anytype.Rpc.Block.Create.Dataview.Record.Response)
- [Rpc.Block.Create.Dataview.Record.Response.Error](#anytype.Rpc.Block.Create.Dataview.Record.Response.Error)
- [Rpc.Block.Create.Dataview.View](#anytype.Rpc.Block.Create.Dataview.View)
- [Rpc.Block.Create.Dataview.View.Request](#anytype.Rpc.Block.Create.Dataview.View.Request)
- [Rpc.Block.Create.Dataview.View.Response](#anytype.Rpc.Block.Create.Dataview.View.Response)
@ -86,6 +90,10 @@
- [Rpc.Block.Cut.Response.Error](#anytype.Rpc.Block.Cut.Response.Error)
- [Rpc.Block.Delete](#anytype.Rpc.Block.Delete)
- [Rpc.Block.Delete.Dataview](#anytype.Rpc.Block.Delete.Dataview)
- [Rpc.Block.Delete.Dataview.Record](#anytype.Rpc.Block.Delete.Dataview.Record)
- [Rpc.Block.Delete.Dataview.Record.Request](#anytype.Rpc.Block.Delete.Dataview.Record.Request)
- [Rpc.Block.Delete.Dataview.Record.Response](#anytype.Rpc.Block.Delete.Dataview.Record.Response)
- [Rpc.Block.Delete.Dataview.Record.Response.Error](#anytype.Rpc.Block.Delete.Dataview.Record.Response.Error)
- [Rpc.Block.Delete.Dataview.View](#anytype.Rpc.Block.Delete.Dataview.View)
- [Rpc.Block.Delete.Dataview.View.Request](#anytype.Rpc.Block.Delete.Dataview.View.Request)
- [Rpc.Block.Delete.Dataview.View.Response](#anytype.Rpc.Block.Delete.Dataview.View.Response)
@ -130,6 +138,7 @@
- [Rpc.Block.OpenBreadcrumbs.Response.Error](#anytype.Rpc.Block.OpenBreadcrumbs.Response.Error)
- [Rpc.Block.Paste](#anytype.Rpc.Block.Paste)
- [Rpc.Block.Paste.Request](#anytype.Rpc.Block.Paste.Request)
- [Rpc.Block.Paste.Request.File](#anytype.Rpc.Block.Paste.Request.File)
- [Rpc.Block.Paste.Response](#anytype.Rpc.Block.Paste.Response)
- [Rpc.Block.Paste.Response.Error](#anytype.Rpc.Block.Paste.Response.Error)
- [Rpc.Block.Redo](#anytype.Rpc.Block.Redo)
@ -229,6 +238,12 @@
- [Rpc.Block.Unlink.Request](#anytype.Rpc.Block.Unlink.Request)
- [Rpc.Block.Unlink.Response](#anytype.Rpc.Block.Unlink.Response)
- [Rpc.Block.Unlink.Response.Error](#anytype.Rpc.Block.Unlink.Response.Error)
- [Rpc.Block.Update](#anytype.Rpc.Block.Update)
- [Rpc.Block.Update.Dataview](#anytype.Rpc.Block.Update.Dataview)
- [Rpc.Block.Update.Dataview.Record](#anytype.Rpc.Block.Update.Dataview.Record)
- [Rpc.Block.Update.Dataview.Record.Request](#anytype.Rpc.Block.Update.Dataview.Record.Request)
- [Rpc.Block.Update.Dataview.Record.Response](#anytype.Rpc.Block.Update.Dataview.Record.Response)
- [Rpc.Block.Update.Dataview.Record.Response.Error](#anytype.Rpc.Block.Update.Dataview.Record.Response.Error)
- [Rpc.Block.Upload](#anytype.Rpc.Block.Upload)
- [Rpc.Block.Upload.Request](#anytype.Rpc.Block.Upload.Request)
- [Rpc.Block.Upload.Response](#anytype.Rpc.Block.Upload.Response)
@ -394,10 +409,12 @@
- [Rpc.Block.Bookmark.Fetch.Response.Error.Code](#anytype.Rpc.Block.Bookmark.Fetch.Response.Error.Code)
- [Rpc.Block.Close.Response.Error.Code](#anytype.Rpc.Block.Close.Response.Error.Code)
- [Rpc.Block.Copy.Response.Error.Code](#anytype.Rpc.Block.Copy.Response.Error.Code)
- [Rpc.Block.Create.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Create.Dataview.Record.Response.Error.Code)
- [Rpc.Block.Create.Dataview.View.Response.Error.Code](#anytype.Rpc.Block.Create.Dataview.View.Response.Error.Code)
- [Rpc.Block.Create.Response.Error.Code](#anytype.Rpc.Block.Create.Response.Error.Code)
- [Rpc.Block.CreatePage.Response.Error.Code](#anytype.Rpc.Block.CreatePage.Response.Error.Code)
- [Rpc.Block.Cut.Response.Error.Code](#anytype.Rpc.Block.Cut.Response.Error.Code)
- [Rpc.Block.Delete.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Delete.Dataview.Record.Response.Error.Code)
- [Rpc.Block.Delete.Dataview.View.Response.Error.Code](#anytype.Rpc.Block.Delete.Dataview.View.Response.Error.Code)
- [Rpc.Block.Download.Response.Error.Code](#anytype.Rpc.Block.Download.Response.Error.Code)
- [Rpc.Block.Export.Response.Error.Code](#anytype.Rpc.Block.Export.Response.Error.Code)
@ -431,6 +448,7 @@
- [Rpc.Block.Split.Response.Error.Code](#anytype.Rpc.Block.Split.Response.Error.Code)
- [Rpc.Block.Undo.Response.Error.Code](#anytype.Rpc.Block.Undo.Response.Error.Code)
- [Rpc.Block.Unlink.Response.Error.Code](#anytype.Rpc.Block.Unlink.Response.Error.Code)
- [Rpc.Block.Update.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Update.Dataview.Record.Response.Error.Code)
- [Rpc.Block.Upload.Response.Error.Code](#anytype.Rpc.Block.Upload.Response.Error.Code)
- [Rpc.BlockList.ConvertChildrenToPages.Response.Error.Code](#anytype.Rpc.BlockList.ConvertChildrenToPages.Response.Error.Code)
- [Rpc.BlockList.Delete.Page.Response.Error.Code](#anytype.Rpc.BlockList.Delete.Page.Response.Error.Code)
@ -733,6 +751,9 @@
| BlockSetDataviewActiveView | [Rpc.Block.Set.Dataview.ActiveView.Request](#anytype.Rpc.Block.Set.Dataview.ActiveView.Request) | [Rpc.Block.Set.Dataview.ActiveView.Response](#anytype.Rpc.Block.Set.Dataview.ActiveView.Response) | |
| BlockCreateDataviewView | [Rpc.Block.Create.Dataview.View.Request](#anytype.Rpc.Block.Create.Dataview.View.Request) | [Rpc.Block.Create.Dataview.View.Response](#anytype.Rpc.Block.Create.Dataview.View.Response) | |
| BlockDeleteDataviewView | [Rpc.Block.Delete.Dataview.View.Request](#anytype.Rpc.Block.Delete.Dataview.View.Request) | [Rpc.Block.Delete.Dataview.View.Response](#anytype.Rpc.Block.Delete.Dataview.View.Response) | |
| BlockCreateDataviewRecord | [Rpc.Block.Create.Dataview.Record.Request](#anytype.Rpc.Block.Create.Dataview.Record.Request) | [Rpc.Block.Create.Dataview.Record.Response](#anytype.Rpc.Block.Create.Dataview.Record.Response) | |
| BlockUpdateDataviewRecord | [Rpc.Block.Update.Dataview.Record.Request](#anytype.Rpc.Block.Update.Dataview.Record.Request) | [Rpc.Block.Update.Dataview.Record.Response](#anytype.Rpc.Block.Update.Dataview.Record.Response) | |
| BlockDeleteDataviewRecord | [Rpc.Block.Delete.Dataview.Record.Request](#anytype.Rpc.Block.Delete.Dataview.Record.Request) | [Rpc.Block.Delete.Dataview.Record.Response](#anytype.Rpc.Block.Delete.Dataview.Record.Response) | |
| BlockBookmarkFetch | [Rpc.Block.Bookmark.Fetch.Request](#anytype.Rpc.Block.Bookmark.Fetch.Request) | [Rpc.Block.Bookmark.Fetch.Response](#anytype.Rpc.Block.Bookmark.Fetch.Response) | |
| BlockBookmarkCreateAndFetch | [Rpc.Block.Bookmark.CreateAndFetch.Request](#anytype.Rpc.Block.Bookmark.CreateAndFetch.Request) | [Rpc.Block.Bookmark.CreateAndFetch.Response](#anytype.Rpc.Block.Bookmark.CreateAndFetch.Response) | |
| BlockFileCreateAndUpload | [Rpc.Block.File.CreateAndUpload.Request](#anytype.Rpc.Block.File.CreateAndUpload.Request) | [Rpc.Block.File.CreateAndUpload.Response](#anytype.Rpc.Block.File.CreateAndUpload.Response) | |
@ -1542,6 +1563,65 @@ Create a Smart/Internal block. Request can contain a block with a content, or it
<a name="anytype.Rpc.Block.Create.Dataview.Record"></a>
### Rpc.Block.Create.Dataview.Record
<a name="anytype.Rpc.Block.Create.Dataview.Record.Request"></a>
### Rpc.Block.Create.Dataview.Record.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| contextId | [string](#string) | | |
| blockId | [string](#string) | | |
| record | [google.protobuf.Struct](#google.protobuf.Struct) | | |
<a name="anytype.Rpc.Block.Create.Dataview.Record.Response"></a>
### Rpc.Block.Create.Dataview.Record.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Block.Create.Dataview.Record.Response.Error](#anytype.Rpc.Block.Create.Dataview.Record.Response.Error) | | |
| record | [google.protobuf.Struct](#google.protobuf.Struct) | | |
<a name="anytype.Rpc.Block.Create.Dataview.Record.Response.Error"></a>
### Rpc.Block.Create.Dataview.Record.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Block.Create.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Create.Dataview.Record.Response.Error.Code) | | |
| description | [string](#string) | | |
<a name="anytype.Rpc.Block.Create.Dataview.View"></a>
### Rpc.Block.Create.Dataview.View
@ -1797,6 +1877,65 @@ common simple block command
<a name="anytype.Rpc.Block.Delete.Dataview.Record"></a>
### Rpc.Block.Delete.Dataview.Record
<a name="anytype.Rpc.Block.Delete.Dataview.Record.Request"></a>
### Rpc.Block.Delete.Dataview.Record.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| contextId | [string](#string) | | |
| blockId | [string](#string) | | |
| recordId | [string](#string) | | |
<a name="anytype.Rpc.Block.Delete.Dataview.Record.Response"></a>
### Rpc.Block.Delete.Dataview.Record.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Block.Delete.Dataview.Record.Response.Error](#anytype.Rpc.Block.Delete.Dataview.Record.Response.Error) | | |
| event | [ResponseEvent](#anytype.ResponseEvent) | | |
<a name="anytype.Rpc.Block.Delete.Dataview.Record.Response.Error"></a>
### Rpc.Block.Delete.Dataview.Record.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Block.Delete.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Delete.Dataview.Record.Response.Error.Code) | | |
| description | [string](#string) | | |
<a name="anytype.Rpc.Block.Delete.Dataview.View"></a>
### Rpc.Block.Delete.Dataview.View
@ -2446,6 +2585,23 @@ Image/Video/File blocks then:
| textSlot | [string](#string) | | |
| htmlSlot | [string](#string) | | |
| anySlot | [model.Block](#anytype.model.Block) | repeated | |
| fileSlot | [Rpc.Block.Paste.Request.File](#anytype.Rpc.Block.Paste.Request.File) | repeated | |
<a name="anytype.Rpc.Block.Paste.Request.File"></a>
### Rpc.Block.Paste.Request.File
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| name | [string](#string) | | |
| data | [bytes](#bytes) | | |
@ -3874,6 +4030,85 @@ Remove blocks from the childrenIds of its parents
<a name="anytype.Rpc.Block.Update"></a>
### Rpc.Block.Update
<a name="anytype.Rpc.Block.Update.Dataview"></a>
### Rpc.Block.Update.Dataview
<a name="anytype.Rpc.Block.Update.Dataview.Record"></a>
### Rpc.Block.Update.Dataview.Record
<a name="anytype.Rpc.Block.Update.Dataview.Record.Request"></a>
### Rpc.Block.Update.Dataview.Record.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| contextId | [string](#string) | | |
| blockId | [string](#string) | | |
| recordId | [string](#string) | | |
| record | [google.protobuf.Struct](#google.protobuf.Struct) | | |
<a name="anytype.Rpc.Block.Update.Dataview.Record.Response"></a>
### Rpc.Block.Update.Dataview.Record.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Block.Update.Dataview.Record.Response.Error](#anytype.Rpc.Block.Update.Dataview.Record.Response.Error) | | |
<a name="anytype.Rpc.Block.Update.Dataview.Record.Response.Error"></a>
### Rpc.Block.Update.Dataview.Record.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Block.Update.Dataview.Record.Response.Error.Code](#anytype.Rpc.Block.Update.Dataview.Record.Response.Error.Code) | | |
| description | [string](#string) | | |
<a name="anytype.Rpc.Block.Upload"></a>
### Rpc.Block.Upload
@ -6187,6 +6422,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype.Rpc.Block.Create.Dataview.Record.Response.Error.Code"></a>
### Rpc.Block.Create.Dataview.Record.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | ... |
<a name="anytype.Rpc.Block.Create.Dataview.View.Response.Error.Code"></a>
### Rpc.Block.Create.Dataview.View.Response.Error.Code
@ -6239,6 +6487,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype.Rpc.Block.Delete.Dataview.Record.Response.Error.Code"></a>
### Rpc.Block.Delete.Dataview.Record.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | ... |
<a name="anytype.Rpc.Block.Delete.Dataview.View.Response.Error.Code"></a>
### Rpc.Block.Delete.Dataview.View.Response.Error.Code
@ -6671,6 +6932,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype.Rpc.Block.Update.Dataview.Record.Response.Error.Code"></a>
### Rpc.Block.Update.Dataview.Record.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | ... |
<a name="anytype.Rpc.Block.Upload.Response.Error.Code"></a>
### Rpc.Block.Upload.Response.Error.Code
@ -8724,6 +8998,7 @@ Precondition: user A and user B opened the same block
| ----- | ---- | ----- | ----------- |
| total | [int64](#int64) | | |
| done | [int64](#int64) | | |
| message | [string](#string) | | |
@ -8771,6 +9046,7 @@ Precondition: user A and user B opened the same block
| Name | Number | Description |
| ---- | ------ | ----------- |
| DropFiles | 0 | |
| Import | 1 | |

17
go.mod
View file

@ -5,7 +5,7 @@ go 1.13
require (
github.com/JohannesKaufmann/html-to-markdown v0.0.0-00010101000000-000000000000
github.com/PuerkitoBio/goquery v1.5.1
github.com/anytypeio/go-anytype-library v0.11.0
github.com/anytypeio/go-anytype-library v0.11.9
github.com/cheggaaa/mb v1.0.2
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8
github.com/gogo/protobuf v1.3.1
@ -14,20 +14,23 @@ require (
github.com/google/uuid v1.1.1
github.com/h2non/filetype v1.1.0
github.com/hashicorp/golang-lru v0.5.4
github.com/improbable-eng/grpc-web v0.12.0
github.com/improbable-eng/grpc-web v0.13.0
github.com/magiconair/properties v1.8.0
github.com/mauidude/go-readability v0.0.0-20141216012317-2f30b1a346f1
github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d
github.com/microcosm-cc/bluemonday v1.0.3
github.com/microcosm-cc/bluemonday v1.0.4
github.com/otiai10/opengraph v1.1.2
github.com/santhosh-tekuri/jsonschema/v2 v2.2.0
github.com/stretchr/testify v1.6.1
github.com/yosssi/gohtml v0.0.0-20190915184251-7ff6f235ecaf
github.com/yuin/goldmark v1.1.30
golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect
golang.org/x/text v0.3.3
google.golang.org/grpc v1.31.0-dev.0.20200627230533-68098483a7af
google.golang.org/grpc v1.31.0
)
replace github.com/JohannesKaufmann/html-to-markdown => github.com/anytypeio/html-to-markdown v0.0.0-20200617145221-2afd2a14bae1
replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v0.1.18-0.20200805204901-9c9a659b6cd9
replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v0.1.23-forked
replace github.com/ipfs/go-log/v2 => github.com/anytypeio/go-log/v2 v2.1.2-0.20200810212702-264b187bb04f
replace gopkg.in/Graylog2/go-gelf.v2 => github.com/anytypeio/go-gelf v0.0.0-20200813115635-198b2af80f88

160
go.sum
View file

@ -3,6 +3,7 @@ cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
@ -13,6 +14,7 @@ github.com/AndreasBriese/bbloom v0.0.0-20190823232136-616930265c33 h1:2/E2IVdZoH
github.com/AndreasBriese/bbloom v0.0.0-20190823232136-616930265c33/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@ -24,8 +26,6 @@ github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75 h1:3ILjVyslFbc4jl1w5TWuvvslFD/nDfR2H8tVaMVLrEY=
github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75/go.mod h1:uAXEEpARkRhCZfEvy/y0Jcc888f9tHCc1W7/UeEtreE=
github.com/alecthomas/jsonschema v0.0.0-20191017121752-4bb6e3fae4f2 h1:swGeCLPiUQ647AIRnFxnAHdzlg6IPpmU6QdkOPZINt8=
github.com/alecthomas/jsonschema v0.0.0-20191017121752-4bb6e3fae4f2/go.mod h1:Juc2PrI3wtNfUwptSvAIeNx+HrETwHQs6nf+TkOJlOA=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@ -35,14 +35,18 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/anytypeio/go-anytype-library v0.11.0 h1:Xcp5ae+x+dR2ax8N24Kjcg4eUXZQNEICgL5Mb9z07Ag=
github.com/anytypeio/go-anytype-library v0.11.0/go.mod h1:GsY3/4kDrjKnsV7a6UiIfzI5T8LdUtituZcmXqb+d7Y=
github.com/anytypeio/go-anytype-library v0.11.9 h1:Lc9pYOTw+cm19AAWLS85xXpqz+IdQtkU3k3T0V7WREE=
github.com/anytypeio/go-anytype-library v0.11.9/go.mod h1:rINW+9c5nWDDDW6/6ITecFLyUGciJNNAP+ofASyr5yI=
github.com/anytypeio/go-gelf v0.0.0-20200813115635-198b2af80f88 h1:akVlk/OGOw228alDyvlEEBoVoBCTziBcu4I+x7xH/HE=
github.com/anytypeio/go-gelf v0.0.0-20200813115635-198b2af80f88/go.mod h1:EuPAem8b51iulSY3wBQJc0Shz+A2DmyREddzDt0fywM=
github.com/anytypeio/go-log/v2 v2.1.2-0.20200810212702-264b187bb04f h1:aeyycLTPbhwjW2x/EkmuAgRzdX0bdwy+RStmevhQbhM=
github.com/anytypeio/go-log/v2 v2.1.2-0.20200810212702-264b187bb04f/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
github.com/anytypeio/go-slip10 v0.0.0-20200330112030-a352ca8495e4 h1:jB5Ke7NVoW52i65PtLFBr5Q5k6RskIY8L70pgnBcnWo=
github.com/anytypeio/go-slip10 v0.0.0-20200330112030-a352ca8495e4/go.mod h1:/8GIEJBE5wmdgcE49JPdupnHNUf7bEn6C+aArfWqvw8=
github.com/anytypeio/go-slip21 v0.0.0-20200218204727-e2e51e20ab51 h1:3Y+18zBC8LZgcL3l2dgoTEIzIUzCZa/kN0UV3ZWpbuA=
github.com/anytypeio/go-slip21 v0.0.0-20200218204727-e2e51e20ab51/go.mod h1:SoKy+W8Mf6v7XBV30xFWkIFMs7UnXwsNGrGV12yVkEs=
github.com/anytypeio/go-threads v0.1.18-0.20200805204901-9c9a659b6cd9 h1:v/1w1i4VsL+D6QaR74/GRoomBHpNCaPjLylpV/Xgy5k=
github.com/anytypeio/go-threads v0.1.18-0.20200805204901-9c9a659b6cd9/go.mod h1:83K+AWy/d2riTTXbBtWTbWUPKg/qwgZmAy3Te2LPdtk=
github.com/anytypeio/go-threads v0.1.23-forked h1:JoBVhjXfkDKg2UjiuTXg8lSVG5h0Q6K3sVwfRvT/Eq8=
github.com/anytypeio/go-threads v0.1.23-forked/go.mod h1:SrSV9qV+vua22PyxIKaIWYNIIv3k1axTZ9ofpi3gTgw=
github.com/anytypeio/html-to-markdown v0.0.0-20200617145221-2afd2a14bae1 h1:g/LEIEQ0ACBOKX9MhORhlmluUKvuxvrIDbGMI0cqF5A=
github.com/anytypeio/html-to-markdown v0.0.0-20200617145221-2afd2a14bae1/go.mod h1:Qnhxlb4mi8T2624UtHX8EgDyYZXWbjQfLGuciFHZ+Go=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@ -125,11 +129,18 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgtony/collections v0.1.3 h1:jID0yM7JTu03sL8qgkgQ1Y2Oe+7N4/pm65jsW1exl5Q=
github.com/dgtony/collections v0.1.3/go.mod h1:SK/v+w9XVqk0KTLoppgU8dIU9gptYdkU1r/apAdIRJA=
github.com/disintegration/imaging v1.6.0 h1:nVPXRUUQ36Z7MNf0O77UzgnOb1mkMMor7lmJMJXc/mA=
github.com/disintegration/imaging v1.6.0/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ=
github.com/dlclark/regexp2 v1.2.1 h1:Ff/S0snjr1oZHUNOkvA/gP6KUaMg5vDDl3Qnhjnwgm8=
github.com/dlclark/regexp2 v1.2.1/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dop251/goja v0.0.0-20200818110326-5574b5dbd2b9 h1:IvLZvXQ6/ImP768AXulFJP3inzWW8/dCSkpG70bnADo=
github.com/dop251/goja v0.0.0-20200818110326-5574b5dbd2b9/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
@ -150,10 +161,13 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0
github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
@ -176,8 +190,6 @@ github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200j
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@ -209,6 +221,8 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY=
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/gopacket v1.1.18 h1:lum7VRA9kdlvBi7/v2p7/zcbkduHaCH/SVVyurs7OpY=
github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@ -228,8 +242,8 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 h1:V59tBiPuMkySHwJkuq/OYkK0WnOLwCwD3UkTbEMr12U=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
@ -251,16 +265,16 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hsanjuan/ipfs-lite v1.1.11 h1:t849+2QSESgLsXr1J+ThqhqVY48b46IfKvu0FBXfUsQ=
github.com/hsanjuan/ipfs-lite v1.1.11/go.mod h1:pBcGBaLNk6/1TXbCAHmkRRbDieqUrjWJEkHdIUvwthc=
github.com/hsanjuan/ipfs-lite v1.1.14 h1:fmPec8uJ1ZFmt52LNOr5dVedo5KS1FdyM0O+oNlhr1g=
github.com/hsanjuan/ipfs-lite v1.1.14/go.mod h1:hv3SYATYfs7kh+l3fk8QcMkhY88983Q7kqnzpkY/qkg=
github.com/hsanjuan/ipfs-lite v1.1.15 h1:OTNuR77Bhk2syGtP8BAlhW0ufNFA/J5kbx0YMur8kf8=
github.com/hsanjuan/ipfs-lite v1.1.15/go.mod h1:LZffwuToye++XukPW/GUAw5XewT+t2lgZl8h/8RqFfs=
github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo=
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
github.com/improbable-eng/grpc-web v0.12.0 h1:GlCS+lMZzIkfouf7CNqY+qqpowdKuJLSLLcKVfM1oLc=
github.com/improbable-eng/grpc-web v0.12.0/go.mod h1:6hRR09jOEG81ADP5wCQju1z71g6OL4eEvELdran/3cs=
github.com/improbable-eng/grpc-web v0.13.0 h1:7XqtaBWaOCH0cVGKHyvhtcuo6fgW32Y10yRKrDHFHOc=
github.com/improbable-eng/grpc-web v0.13.0/go.mod h1:6hRR09jOEG81ADP5wCQju1z71g6OL4eEvELdran/3cs=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
@ -272,7 +286,6 @@ github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiL
github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps=
github.com/ipfs/go-bitswap v0.1.8 h1:38X1mKXkiU6Nzw4TOSWD8eTVY5eX3slQunv3QEWfXKg=
github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM=
github.com/ipfs/go-bitswap v0.2.13 h1:R8mUGpY0vwHljlnBeDE9PdR3DKKiPKevAMkq9qB8cyA=
github.com/ipfs/go-bitswap v0.2.13/go.mod h1:SDXpLeKZagyVVc8/z7sGtmM/lz8lyAmSzrUx3Ge3GXw=
github.com/ipfs/go-bitswap v0.2.19 h1:EhgRz8gqWQIBADY9gpqJOrfs5E1MtVfQFy1Vq8Z+Fq8=
github.com/ipfs/go-bitswap v0.2.19/go.mod h1:C7TwBgHnu89Q8sHsTJP7IhUqF9XYLe71P4tT5adgmYo=
@ -295,6 +308,8 @@ github.com/ipfs/go-cid v0.0.5 h1:o0Ix8e/ql7Zb5UVUJEUfjsWCIY8t48++9lR8qi6oiJU=
github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
github.com/ipfs/go-cid v0.0.6 h1:go0y+GcDOGeJIV01FeBsta4FHngoA4Wz7KMeLkXAhMs=
github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo=
github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s=
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
@ -306,6 +321,7 @@ github.com/ipfs/go-datastore v0.3.1 h1:SS1t869a6cctoSYmZXUk8eL6AzVXgASmKIWFNQkQ1
github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.4.4 h1:rjvQ9+muFaJ+QZ7dN5B1MSDNQ0JVZKkkES/rMZmA8X8=
github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
@ -329,18 +345,18 @@ github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma
github.com/ipfs/go-ipfs-blockstore v0.1.0 h1:V1GZorHFUIB6YgTJQdq7mcaIpUfCM3fCyVi+MTo9O88=
github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
github.com/ipfs/go-ipfs-blockstore v1.0.0 h1:pmFp5sFYsYVvMOp9X01AK3s85usVcLvkBTRsN6SnfUA=
github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU=
github.com/ipfs/go-ipfs-blockstore v1.0.1 h1:fnuVj4XdZp4yExhd0CnUwAiMNJHiPnfInhiuwz4lW1w=
github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE=
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
github.com/ipfs/go-ipfs-chunker v0.0.1 h1:cHUUxKFQ99pozdahi+uSC/3Y6HeRpi9oTeUHbE27SEw=
github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw=
github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8=
github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8=
github.com/ipfs/go-ipfs-config v0.5.2 h1:SPWiMNo7IOW0k+meO3PIprggp/PbZGUiO57L7HQ/sOY=
github.com/ipfs/go-ipfs-config v0.5.2/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM=
github.com/ipfs/go-ipfs-config v0.7.2 h1:bqr5pxx5qOrnfhlCQZGwa75L5xotQr79Ly+C0qp0PgE=
github.com/ipfs/go-ipfs-config v0.7.2/go.mod h1:GQUxqb0NfkZmEU92PxqqqLVVFTLpoGGUlBaTyDaAqrE=
github.com/ipfs/go-ipfs-config v0.9.0 h1:qTXJ9CyOyQv1LFJUMysxz8fi6RxxnP9QqcmiobuANvw=
github.com/ipfs/go-ipfs-config v0.9.0/go.mod h1:GQUxqb0NfkZmEU92PxqqqLVVFTLpoGGUlBaTyDaAqrE=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
@ -366,7 +382,6 @@ github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU
github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY=
github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
github.com/ipfs/go-ipfs-provider v0.4.2 h1:FIsBFXKVo8ZXP8XNVnjhZWPjMRLFJeV07BSNVDpJXVY=
github.com/ipfs/go-ipfs-provider v0.4.2/go.mod h1:rcQBVqfblDQRk5LaCtf2uxuKxMJxvKmF5pLS0pO4au4=
github.com/ipfs/go-ipfs-provider v0.4.3 h1:k54OHXZcFBkhL6l3GnPS9PfpaLeLqZjVASG1bgfBdfQ=
github.com/ipfs/go-ipfs-provider v0.4.3/go.mod h1:rcQBVqfblDQRk5LaCtf2uxuKxMJxvKmF5pLS0pO4au4=
@ -397,13 +412,6 @@ github.com/ipfs/go-log v1.0.3 h1:Gg7SUYSZ7BrqaKMwM+hRgcAkKv4QLfzP4XPQt5Sx/OI=
github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY=
github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs=
github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.0.3 h1:Q2gXcBoCALyLN/pUQlz1qgu0x3uFV6FzP9oXhpfyJpc=
github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU=
github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw=
github.com/ipfs/go-log/v2 v2.1.1 h1:G4TtqN+V9y9HY9TA6BwbCVyyBZ2B9MbCjR2MtGx8FR0=
github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA=
github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto=
github.com/ipfs/go-merkledag v0.2.3 h1:aMdkK9G1hEeNvn3VXfiEMLY0iJnbiQQUHnM0HFJREsE=
@ -517,10 +525,10 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV
github.com/libp2p/go-libp2p v0.8.2/go.mod h1:NQDA/F/qArMHGe0J7sDScaKjW8Jh4y/ozQqBbYJ+BnA=
github.com/libp2p/go-libp2p v0.8.3 h1:IFWeNzxkBaNO1N8stN9ayFGdC6RmVuSsKd5bou7qpK0=
github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM=
github.com/libp2p/go-libp2p v0.9.5 h1:BNF5p9iwCukccf1WBWrGGVHicMrFVe1+wkBo1c8/Jew=
github.com/libp2p/go-libp2p v0.9.5/go.mod h1:FiFGiems39cIOLqfoThr/5IEw+QAjBdCVAqv7rtTQGs=
github.com/libp2p/go-libp2p v0.10.0 h1:7ooOvK1wi8eLpyTppy8TeH43UHy5uI75GAHGJxenUi0=
github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8=
github.com/libp2p/go-libp2p v0.10.3 h1:Bc8/VjmC+pICtK6xG8YgVutZvCdK0MsroWCHP+6AdFQ=
github.com/libp2p/go-libp2p v0.10.3/go.mod h1:0ER6iPSaPeQjryNgOnm9bLNpMJCYmuw54xJXsVR17eE=
github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4=
github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE=
github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU=
@ -534,12 +542,16 @@ github.com/libp2p/go-libp2p-autonat v0.2.2 h1:4dlgcEEugTFWSvdG2UIFxhnOMpX76QaZSR
github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A=
github.com/libp2p/go-libp2p-autonat v0.2.3 h1:w46bKK3KTOUWDe5mDYMRjJu1uryqBp8HCNDp/TWMqKw=
github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM=
github.com/libp2p/go-libp2p-autonat v0.3.2 h1:OhDSwVVaq7liTaRIsFFYvsaPp0pn2yi0WazejZ4DUmo=
github.com/libp2p/go-libp2p-autonat v0.3.2/go.mod h1:0OzOi1/cVc7UcxfOddemYD5vzEqi4fwRbnZcJGLi68U=
github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc=
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
github.com/libp2p/go-libp2p-blankhost v0.1.6 h1:CkPp1/zaCrCnBo0AdsQA0O1VkUYoUOtyHOnoa8gKIcE=
github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ=
github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk=
github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ=
github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE=
github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU=
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
@ -553,7 +565,8 @@ github.com/libp2p/go-libp2p-circuit v0.2.2 h1:87RLabJ9lrhoiSDDZyCJ80ZlI5TLJMwfyo
github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4=
github.com/libp2p/go-libp2p-circuit v0.2.3 h1:3Uw1fPHWrp1tgIhBz0vSOxRUmnKL8L/NGUyEd5WfSGM=
github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4=
github.com/libp2p/go-libp2p-connmgr v0.2.1 h1:1ed0HFhCb39sIMK7QYgRBW0vibBBqFQMs4xt9a9AalY=
github.com/libp2p/go-libp2p-circuit v0.3.1 h1:69ENDoGnNN45BNDnBd+8SXSetDuw0eJFcGmOvvtOgBw=
github.com/libp2p/go-libp2p-circuit v0.3.1/go.mod h1:8RMIlivu1+RxhebipJwFDA45DasLx+kkrp4IlJj53F4=
github.com/libp2p/go-libp2p-connmgr v0.2.1/go.mod h1:JReKEFcgzSHKT9lL3rhYcUtXBs9uMIiMKJGM1tl3xJE=
github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4=
github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w=
@ -585,6 +598,8 @@ github.com/libp2p/go-libp2p-core v0.5.7 h1:QK3xRwFxqd0Xd9bSZL+8yZ8ncZZbl6Zngd/+Y
github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
github.com/libp2p/go-libp2p-core v0.6.0 h1:u03qofNYTBN+yVg08PuAKylZogVf0xcTEeM8skGf+ak=
github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
github.com/libp2p/go-libp2p-core v0.6.1 h1:XS+Goh+QegCDojUZp00CaPMfiEADCrLjNZskWE7pvqs=
github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ=
@ -599,6 +614,8 @@ github.com/libp2p/go-libp2p-discovery v0.3.0 h1:+JnYBRLzZQtRq0mK3xhyjBwHytLmJXMT
github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
github.com/libp2p/go-libp2p-discovery v0.4.0 h1:dK78UhopBk48mlHtRCzbdLm3q/81g77FahEBTjcqQT8=
github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4=
github.com/libp2p/go-libp2p-discovery v0.5.0 h1:Qfl+e5+lfDgwdrXdu4YNCWyEo3fWuP+WgN9mN0iWviQ=
github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
github.com/libp2p/go-libp2p-gostream v0.2.0 h1:YGLebbo8KfylSkuralCCyas/hVrgWjc+cfnLMCZWvEs=
github.com/libp2p/go-libp2p-gostream v0.2.0/go.mod h1:nN/Aw00orrADXaXgNCeYjCtQrk6eT20PX/G8F12NW/s=
github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go=
@ -607,11 +624,9 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM
github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
github.com/libp2p/go-libp2p-kad-dht v0.7.10 h1:Usixca9o8e3t+pSdHkzyWdU+WSbeTaMvpIcXxQrbImE=
github.com/libp2p/go-libp2p-kad-dht v0.7.10/go.mod h1:COi43/398wedaaNzvnbnWQ8qeG629Nu7Aj0WixHmD3A=
github.com/libp2p/go-libp2p-kad-dht v0.8.2 h1:s7y38B+hdj1AkNR3PCTpvNqBsZHxOf7hoUy7+fNlSZQ=
github.com/libp2p/go-libp2p-kad-dht v0.8.2/go.mod h1:u3rbYbp3CSraAHD5s81CJ3hHozKTud/UOXfAgh93Gek=
github.com/libp2p/go-libp2p-kbucket v0.4.1 h1:6FyzbQuGLPzbMv3HiD232zqscIz5iB8ppJwb380+OGI=
github.com/libp2p/go-libp2p-kad-dht v0.8.3 h1:ceK5ML6s/I8UAcw6veoNsuEHdHvfo88leU/5uWOIFWs=
github.com/libp2p/go-libp2p-kad-dht v0.8.3/go.mod h1:HnYYy8taJWESkqiESd1ngb9XX/XGGsMA5G0Vj2HoSh4=
github.com/libp2p/go-libp2p-kbucket v0.4.1/go.mod h1:7sCeZx2GkNK1S6lQnGUW5JYZCFPnXzAZCCBBS70lytY=
github.com/libp2p/go-libp2p-kbucket v0.4.2 h1:wg+VPpCtY61bCasGRexCuXOmEmdKjN+k1w+JtTwu9gA=
github.com/libp2p/go-libp2p-kbucket v0.4.2/go.mod h1:7sCeZx2GkNK1S6lQnGUW5JYZCFPnXzAZCCBBS70lytY=
@ -627,6 +642,8 @@ github.com/libp2p/go-libp2p-mplex v0.2.2 h1:+Ld7YDAfVERQ0E+qqjE7o6fHwKuM0SqTzYiw
github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo=
github.com/libp2p/go-libp2p-mplex v0.2.3 h1:2zijwaJvpdesST2MXpI5w9wWFRgYtMcpRX7rrw0jmOo=
github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek=
github.com/libp2p/go-libp2p-mplex v0.2.4 h1:XFFXaN4jhqnIuJVjYOR3k6bnRj0mFfJOlIuDVww+4Zo=
github.com/libp2p/go-libp2p-mplex v0.2.4/go.mod h1:mI7iOezdWFOisvUwaYd3IDrJ4oVmgoXK8H331ui39CE=
github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ=
github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw=
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
@ -668,8 +685,6 @@ github.com/libp2p/go-libp2p-pubsub v0.2.4 h1:O4BcaKpPQ9p82yTBtzIzgDFoOXkqhrQpfcV
github.com/libp2p/go-libp2p-pubsub v0.2.4/go.mod h1:1tJwAfySvZQ49R9uTVlkwtSTMVLeQQdrnLTJrr91gVc=
github.com/libp2p/go-libp2p-pubsub v0.3.1 h1:7Hyv2d8BK/x1HGRJTZ8X++VQEP+WqDTSwpUSZGTVLYA=
github.com/libp2p/go-libp2p-pubsub v0.3.1/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato=
github.com/libp2p/go-libp2p-quic-transport v0.3.7 h1:F9hxonkJvMipNim8swrvRk2uL9s8pqzHz0M6eMf8L58=
github.com/libp2p/go-libp2p-quic-transport v0.3.7/go.mod h1:Kr4aDtnfHHNeENn5J+sZIVc+t8HpQn9W6BOxhVGHbgI=
github.com/libp2p/go-libp2p-quic-transport v0.5.0 h1:BUN1lgYNUrtv4WLLQ5rQmC9MCJ6uEXusezGvYRNoJXE=
github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M=
github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q=
@ -679,7 +694,6 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd
github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0=
github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4=
github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys=
github.com/libp2p/go-libp2p-routing-helpers v0.2.1 h1:tV5fxxkl1cEEFXIv9yl5OGbLjEwngtq1qf5G/beLRvQ=
github.com/libp2p/go-libp2p-routing-helpers v0.2.1/go.mod h1:rTLUHlGDZbXHANJAWP2xW7ruPNJLj41/GnCBiR+qgjU=
github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY=
github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw=
@ -700,10 +714,10 @@ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaT
github.com/libp2p/go-libp2p-swarm v0.2.3 h1:uVkCb8Blfg7HQ/f30TyHn1g/uCwXsAET7pU0U59gx/A=
github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM=
github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y=
github.com/libp2p/go-libp2p-swarm v0.2.6 h1:UhMXIa+yCOALQyceENEIStMlbTCzOM6aWo6vw8QW17Q=
github.com/libp2p/go-libp2p-swarm v0.2.6/go.mod h1:F9hrkZjO7dDbcEiYii/fAB1QdpLuU6h1pa4P5VNsEgc=
github.com/libp2p/go-libp2p-swarm v0.2.7 h1:4lV/sf7f0NuVqunOpt1I11+Z54+xp+m0eeAvxj/LyRc=
github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA=
github.com/libp2p/go-libp2p-swarm v0.2.8 h1:cIUUvytBzNQmGSjnXFlI6UpoBGsaud82mJPIJVfkDlg=
github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM=
github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
@ -712,6 +726,8 @@ github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/
github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
github.com/libp2p/go-libp2p-testing v0.1.1 h1:U03z3HnGI7Ni8Xx6ONVZvUFOAzWYmolWf5W5jAOPNmU=
github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8 h1:v4dvk7YEW8buwCdIVWnhpv0Hp/AAJKRWIxBhmLRZrsk=
github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc=
github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM=
github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk=
@ -754,6 +770,8 @@ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+
github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA=
github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA=
github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA=
github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI=
github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
github.com/libp2p/go-nat v0.0.4 h1:KbizNnq8YIf7+Hn7+VFL/xE0eDrkPru2zIO9NMwL8UQ=
@ -762,12 +780,16 @@ github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q=
github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU=
github.com/libp2p/go-netroute v0.1.2 h1:UHhB35chwgvcRI392znJA3RCBtZ3MpE3ahNCN5MR4Xg=
github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
github.com/libp2p/go-netroute v0.1.3 h1:1ngWRx61us/EpaKkdqkMjKk/ufr/JlIFYQAxV2XX8Ig=
github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0=
github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.4 h1:d27YZvLoTyMhIN4njrkr8zMDOM4lfpHIp6A+TK9fovg=
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.5 h1:pQkejVhF0xp08D4CQUcw8t+BFJeXowja6RVcb5p++EA=
github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw=
github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw=
github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
@ -814,12 +836,8 @@ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ
github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.3.5 h1:ibuz4naPAully0pN6J/kmUARiqLpnDQIzI/8GCOrljg=
github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.3.6 h1:O5qcBXRcfqecvQ/My9NqDNHB3/5t58yuJYqthcKhhgE=
github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.3.7 h1:v40A1eSPJDIZwz2AvrV3cxpTZEGDP11QJbukmEhYyQI=
github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
github.com/lucas-clemente/quic-go v0.15.7 h1:Pu7To5/G9JoP1mwlrcIvfV8ByPBlCzif3MCl8+1W83I=
github.com/lucas-clemente/quic-go v0.15.7/go.mod h1:Myi1OyS0FOjL3not4BxT7KN29bRkcMUV5JVVFLKtDp8=
github.com/lucas-clemente/quic-go v0.16.0 h1:jJw36wfzGJhmOhAOaOC2lS36WgeqXQszH47A7spo1LI=
github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@ -852,13 +870,15 @@ github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d h1:eAS2t2Vy+6psf9LZ4T5WXW
github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d/go.mod h1:3YMHqrw2Qu3Liy82v4QdAG17e9k91HZ7w3hqlpWqhDo=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/microcosm-cc/bluemonday v1.0.3 h1:EjVH7OqbU219kdm8acbveoclh2zZFqPJTJw6VUlTLAQ=
github.com/microcosm-cc/bluemonday v1.0.3/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg=
github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.12 h1:WMhc1ik4LNkTg8U9l3hI1LvxKmIL+f1+WV/SZtCbDDA=
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.28 h1:gQhy5bsJa8zTlVI8lywCTZp1lguor+xevFoYlzeCTQY=
github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo=
github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
@ -879,6 +899,8 @@ github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc=
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
@ -929,17 +951,23 @@ github.com/multiformats/go-multihash v0.0.10 h1:lMoNbh2Ssd9PUF74Nz008KGzGPlfeV6w
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.13 h1:06x+mk/zj1FoMsgNejLpy6QTvJqlSt/BhLEy87zidlc=
github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-multihash v0.0.14 h1:QoBceQYQQtNUuf6s7wHxnE2c8bhbMqhfGzNI032se/I=
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ=
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.1.1 h1:JlAdpIFhBhGRLxe9W6Om0w++Gd6KMWoFPZL/dEnm9nI=
github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38=
github.com/multiformats/go-multistream v0.1.2 h1:knyamLYMPFPngQjGQ0lhnlys3jtVR/3xV6TREUJr+fE=
github.com/multiformats/go-multistream v0.1.2/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
github.com/multiformats/go-varint v0.0.1 h1:TR/0rdQtnNxuN2IhiB639xC3tWM4IUi7DkTBVTdGW/M=
github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg=
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@ -969,6 +997,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95 h1:+OLn68pqasWca0z5ryit9KGfp3sUsW4Lqg32iRMJyzs=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
@ -976,8 +1006,6 @@ github.com/otiai10/marmoset v0.4.0 h1:Hg59lQI7qQowBEdsAJ/+VDTEospTBzXX/A1Gsw4mlv
github.com/otiai10/marmoset v0.4.0/go.mod h1:t2q6dXWZ9YcFdRREDApX4bCmfQnL3isJ2dgl8ychlXg=
github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc=
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/opengraph v1.1.1 h1:zaHbzhegXGqxVpiI7xlQQ0vKBWvHJbagnUjDC40sFtQ=
github.com/otiai10/opengraph v1.1.1/go.mod h1:ZMbPcfiSRSsg3+yrWZCXrgYL6kEK4KpH4GG1iyIvEXs=
github.com/otiai10/opengraph v1.1.2 h1:ajv2DTAh62p6wv1bXxnje+9K/AATJROtjnmk6Ml7Ro8=
github.com/otiai10/opengraph v1.1.2/go.mod h1:ZMbPcfiSRSsg3+yrWZCXrgYL6kEK4KpH4GG1iyIvEXs=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
@ -1092,6 +1120,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/textileio/go-datastore v0.4.5-0.20200819232101-baa577bf9422 h1:DNpznzcn7pd1Cn2fdKHfPPw62r8Ii4DGVnQRu9Jbvok=
github.com/textileio/go-datastore v0.4.5-0.20200819232101-baa577bf9422/go.mod h1:/38mp5DMgxCZrb5wpgPlWGXuZ99/ur8wgHDSXU5zCjU=
github.com/textileio/go-ds-badger v0.2.5-0.20200819232634-de89720b5d6a h1:AdjNdwIWrZAUrXfC9IHG8eKhRlJarXZoN9CmGlfTeLA=
github.com/textileio/go-ds-badger v0.2.5-0.20200819232634-de89720b5d6a/go.mod h1:0kLVpG7eeM95s4rS78lQe4eG5DCk+cnU8xas2nPSdZY=
github.com/tidwall/gjson v1.3.5 h1:2oW9FBNu8qt9jy5URgrzsVx/T/KSn3qn/smJQ0crlDQ=
github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
@ -1145,8 +1177,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yosssi/gohtml v0.0.0-20190915184251-7ff6f235ecaf h1:VA200mPTYh9FWY8zKX5ctXCtNk78HUez8ecTdsQGhoo=
github.com/yosssi/gohtml v0.0.0-20190915184251-7ff6f235ecaf/go.mod h1:+ccdNT0xMY1dtc5XBxumbYfOUhmduiGudqaDgD2rVRE=
github.com/yuin/goldmark v1.1.30 h1:j4d4Lw3zqZelDhBksEo3BnWg9xhXRQGJPPSL6OApZjI=
github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
@ -1156,6 +1186,8 @@ go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
@ -1200,8 +1232,11 @@ golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81 h1:00VmoueYNlNz/aHIilyyQz/MHSqGoWJzpFv/HW8xpzI=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -1210,8 +1245,11 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b h1:GgiSbuUyC0BlbUmHQBgFqu32eiRR/CEYdjOjOd4zE6Y=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -1235,11 +1273,11 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190926025831-c00fd9afed17/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476 h1:E7ct1C6/33eOdrGZKMoyntcEvs2dwZnDe30crG5vpYU=
golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@ -1255,6 +1293,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEha
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -1266,6 +1306,7 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1279,6 +1320,7 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1287,9 +1329,8 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -1319,6 +1360,8 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa h1:5E4dL8+NgFOgjwbTKz+OOEGGhP+ectTmF842l6KjupQ=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
@ -1342,8 +1385,9 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20191206224255-0243a4be9c8f h1:naitw5DILWPQvG0oG04mR9jF8fmKpRdW3E3zzKA4D0Y=
google.golang.org/genproto v0.0.0-20191206224255-0243a4be9c8f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200428115010-c45acf45369a h1:ykRcNp3dotYGpAEIYeWCGaefklVjVy/rnSvM3zNh6j8=
google.golang.org/genproto v0.0.0-20200428115010-c45acf45369a/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
@ -1352,10 +1396,10 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.31.0-dev.0.20200627230533-68098483a7af h1:EOya8wgpd1imzaei+Mg6FNARQy0DaQUMrZZjBec++eY=
google.golang.org/grpc v1.31.0-dev.0.20200627230533-68098483a7af/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

View file

@ -81,7 +81,7 @@ func main() {
}
webaddr = webLis.Addr().String()
server := grpc.NewServer()
server := grpc.NewServer(grpc.MaxRecvMsgSize(20 * 1024 * 1024))
lib.RegisterClientCommandsServer(server, mw)
webrpc := grpcweb.WrapServer(

View file

@ -24,118 +24,121 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 1764 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x99, 0xcf, 0x6f, 0xdc, 0x40,
0x15, 0xc7, 0xbb, 0x02, 0xd1, 0x32, 0x0d, 0x81, 0x1a, 0x28, 0x6d, 0x50, 0x37, 0xfd, 0x49, 0x9b,
0xb4, 0x71, 0x4a, 0x4a, 0xb9, 0x81, 0x94, 0x6c, 0x7e, 0x34, 0x22, 0x4d, 0x43, 0x36, 0x4d, 0xa4,
0x0a, 0x04, 0x5e, 0xef, 0xcb, 0xee, 0xb0, 0xde, 0x19, 0xd7, 0x9e, 0xdd, 0x34, 0x12, 0x5c, 0x90,
0xe0, 0x86, 0xd4, 0x03, 0x7f, 0x14, 0xc7, 0x1e, 0x39, 0xa2, 0xf6, 0x1f, 0x41, 0x33, 0x7e, 0xfe,
0x35, 0x3b, 0x33, 0xeb, 0x1c, 0xda, 0xaa, 0x7e, 0x9f, 0xf7, 0xfd, 0xbe, 0xb1, 0xe7, 0x8d, 0xc7,
0xb3, 0x64, 0x39, 0xee, 0xad, 0xc7, 0x09, 0x17, 0x3c, 0x5d, 0x4f, 0x21, 0x99, 0xd2, 0x10, 0xf2,
0x7f, 0x7d, 0x75, 0xd9, 0xbb, 0x1e, 0xb0, 0x4b, 0x71, 0x19, 0xc3, 0xd2, 0x9d, 0x92, 0x0c, 0xf9,
0x78, 0x1c, 0xb0, 0x7e, 0x9a, 0x21, 0x4b, 0xb7, 0xcb, 0x08, 0x4c, 0x81, 0x09, 0xbc, 0xbe, 0xf1,
0xef, 0xdf, 0x92, 0xc5, 0x4e, 0x44, 0x81, 0x89, 0x0e, 0x26, 0x78, 0x67, 0x64, 0xe1, 0x2c, 0x88,
0x22, 0x10, 0x9d, 0x04, 0x02, 0x01, 0xde, 0x43, 0x1f, 0xe5, 0xfd, 0xe3, 0x38, 0xf4, 0xb3, 0x90,
0x9f, 0xc5, 0xfc, 0x63, 0xf8, 0x38, 0x81, 0x54, 0x2c, 0x3d, 0x72, 0x32, 0x69, 0xcc, 0x59, 0x0a,
0xde, 0x07, 0xf2, 0x83, 0x2c, 0x72, 0x0c, 0x21, 0x9f, 0x42, 0xe2, 0x19, 0xb3, 0x30, 0x58, 0x48,
0x3f, 0x76, 0x43, 0xa8, 0xfd, 0x47, 0xb2, 0xb8, 0x19, 0x86, 0x7c, 0xc2, 0x0a, 0xf1, 0x7a, 0x1e,
0x06, 0x67, 0xd4, 0x9f, 0xcc, 0xa1, 0xca, 0xd2, 0x31, 0x86, 0x37, 0xe5, 0x91, 0x31, 0x4f, 0xbb,
0x2b, 0x8f, 0xdd, 0xd0, 0x8c, 0x76, 0x17, 0x22, 0x08, 0x85, 0x45, 0x3b, 0x0b, 0xce, 0xd1, 0x2e,
0x20, 0xd4, 0x3e, 0x21, 0x37, 0x73, 0x6d, 0xc1, 0x63, 0xef, 0x81, 0x39, 0x49, 0xf0, 0xb8, 0xd0,
0x7d, 0xe8, 0x42, 0x50, 0x35, 0x24, 0x0b, 0xfb, 0xe3, 0x60, 0x00, 0x7b, 0x20, 0xb6, 0x22, 0xde,
0xf3, 0x9e, 0xd5, 0x72, 0xf6, 0xe3, 0xf3, 0xd4, 0x57, 0x71, 0x7f, 0x0f, 0x84, 0x2f, 0x89, 0x42,
0x7d, 0xa5, 0x01, 0x89, 0x26, 0xbf, 0x27, 0xe4, 0x14, 0x92, 0x94, 0x72, 0xb6, 0x07, 0xc2, 0xbb,
0x5f, 0x4b, 0xc4, 0x80, 0xca, 0xca, 0xa5, 0x1f, 0x38, 0x08, 0x94, 0x7c, 0x43, 0xae, 0x1f, 0xf0,
0x41, 0x17, 0x58, 0xdf, 0xbb, 0x57, 0xa3, 0x0f, 0xf8, 0xc0, 0x97, 0x97, 0x0b, 0xb1, 0xb6, 0x2d,
0x8c, 0x4a, 0x87, 0xe4, 0xfb, 0x1d, 0xce, 0xce, 0xe9, 0x40, 0xd6, 0xb6, 0x5c, 0x83, 0xb3, 0xeb,
0xb5, 0xd2, 0xee, 0xdb, 0x01, 0xd4, 0xdb, 0x27, 0x37, 0xba, 0xc3, 0x89, 0xe8, 0xf3, 0x0b, 0xa6,
0x95, 0x96, 0x5f, 0xb6, 0x94, 0x56, 0x09, 0xa3, 0xd4, 0x39, 0xb9, 0xb5, 0xf3, 0x49, 0x40, 0xc2,
0x82, 0x68, 0x3b, 0xe1, 0xf1, 0x2e, 0x8d, 0x20, 0xf5, 0x9e, 0xd6, 0x92, 0xaa, 0x71, 0x5f, 0x01,
0x85, 0xfa, 0xb3, 0xf9, 0x20, 0xfa, 0x44, 0xe4, 0xc7, 0xd5, 0x70, 0x87, 0x33, 0x01, 0x4c, 0x78,
0x2b, 0x76, 0x01, 0x44, 0x0a, 0xaf, 0xd5, 0x26, 0x28, 0xba, 0x1d, 0x93, 0x9b, 0x07, 0x94, 0x8d,
0x8e, 0x12, 0x98, 0x52, 0xb8, 0xd0, 0xa6, 0x43, 0x25, 0x62, 0x99, 0x0e, 0x75, 0x02, 0x35, 0xdf,
0x11, 0xf2, 0x3e, 0x8e, 0x78, 0xd0, 0x97, 0x23, 0xd3, 0x9e, 0x62, 0x19, 0xb0, 0x3c, 0xc5, 0x1a,
0x50, 0x76, 0xdb, 0x56, 0xc4, 0xc3, 0x51, 0x16, 0xd3, 0xba, 0x4d, 0x45, 0x30, 0xcd, 0xd2, 0x6d,
0x1a, 0x82, 0xaa, 0x67, 0x64, 0x41, 0x05, 0x8e, 0x21, 0x8e, 0x82, 0x50, 0x5f, 0x8f, 0xb3, 0x1c,
0x8c, 0x59, 0xd6, 0x63, 0x9d, 0x29, 0x27, 0xb1, 0x8a, 0xbc, 0x8b, 0x81, 0x69, 0xc3, 0xcf, 0x32,
0x64, 0xc0, 0x32, 0xfc, 0x1a, 0x80, 0x7a, 0x9c, 0xfc, 0x44, 0x5d, 0xde, 0x03, 0x71, 0x34, 0xe9,
0x45, 0x34, 0x3c, 0x83, 0xde, 0xfb, 0xe3, 0x03, 0x6f, 0xd5, 0x90, 0xa9, 0x31, 0x85, 0xcb, 0xf3,
0x46, 0xac, 0x66, 0x28, 0xcb, 0xd8, 0x4a, 0x20, 0xe8, 0x87, 0xc9, 0x64, 0xdc, 0x4b, 0x8d, 0x86,
0x1a, 0xe3, 0x34, 0x9c, 0x65, 0xcb, 0x39, 0xaf, 0x88, 0x2e, 0x88, 0xaa, 0xdf, 0x8a, 0x41, 0xa3,
0x8e, 0x58, 0xe6, 0xbc, 0x05, 0xd5, 0xa6, 0x13, 0xbe, 0x72, 0x4c, 0xd3, 0x49, 0x7b, 0xe1, 0x3c,
0x74, 0x21, 0xa8, 0xfa, 0x67, 0xf2, 0xc3, 0x8a, 0xea, 0x51, 0x30, 0x00, 0xef, 0x89, 0x35, 0x4d,
0x86, 0x0b, 0xf5, 0x5f, 0xcc, 0xc3, 0xf4, 0x36, 0x60, 0x11, 0x65, 0x23, 0x73, 0x1b, 0xa8, 0x90,
0xbb, 0x0d, 0x72, 0xa4, 0x7c, 0x1f, 0x64, 0x75, 0x47, 0x3c, 0x05, 0xcf, 0x34, 0x1b, 0x55, 0xc4,
0xb2, 0x00, 0xd4, 0x89, 0xf2, 0xcd, 0xab, 0xae, 0x6f, 0xf3, 0x0b, 0xa6, 0x3a, 0xd6, 0xd4, 0x36,
0x79, 0xd0, 0xf2, 0xe6, 0x9d, 0x81, 0x50, 0xfb, 0x0f, 0xa8, 0xbd, 0x07, 0xe2, 0x6d, 0x90, 0x8c,
0x52, 0xef, 0xb1, 0x79, 0x66, 0xfb, 0x2a, 0x6a, 0xd9, 0x8f, 0xcc, 0x52, 0x5a, 0xeb, 0xbe, 0x67,
0x7d, 0x6e, 0x6c, 0x5d, 0x19, 0x70, 0xb6, 0x2e, 0x02, 0x9a, 0xde, 0x31, 0x58, 0xf4, 0x64, 0xc0,
0xa9, 0x87, 0x00, 0xea, 0xfd, 0x89, 0x2c, 0xe6, 0x8d, 0xb2, 0x4b, 0x21, 0xea, 0xa7, 0xc6, 0x39,
0xd6, 0x05, 0xe1, 0x67, 0x61, 0xe7, 0x1c, 0xab, 0x61, 0x68, 0xf0, 0x11, 0x5b, 0xbf, 0x2b, 0x77,
0x93, 0xa9, 0x48, 0x68, 0x28, 0x28, 0x67, 0xa9, 0xf7, 0xdc, 0x92, 0x5f, 0x85, 0x0a, 0xb3, 0x17,
0xcd, 0x60, 0xb4, 0xec, 0x61, 0xe3, 0x74, 0x41, 0x6c, 0x83, 0x08, 0x68, 0x94, 0x7a, 0xb6, 0x6a,
0x31, 0x5e, 0x18, 0x3d, 0x9d, 0xcb, 0xa1, 0xc7, 0x25, 0xb9, 0x9d, 0x7b, 0xc8, 0x9e, 0xda, 0x4f,
0x37, 0x93, 0x70, 0x48, 0xa7, 0xd0, 0xf7, 0x7c, 0x8b, 0x84, 0x6a, 0xbd, 0x92, 0x2b, 0x2c, 0xd7,
0x1b, 0xf3, 0x5a, 0x33, 0x1c, 0xd0, 0x54, 0xbc, 0xe5, 0x53, 0x30, 0x35, 0x83, 0x8c, 0xf9, 0x32,
0xe8, 0x6a, 0x86, 0x2a, 0x84, 0xda, 0x13, 0x1c, 0x56, 0xae, 0x7d, 0xc2, 0x0f, 0xe1, 0x42, 0x2d,
0x3d, 0x2f, 0x1c, 0xf9, 0x05, 0x55, 0xb8, 0xad, 0x35, 0xa4, 0xd1, 0xf6, 0x73, 0x8b, 0x2c, 0x17,
0x50, 0x87, 0xb3, 0x29, 0x24, 0xa2, 0x33, 0xa4, 0x51, 0x3f, 0x01, 0x76, 0xc2, 0x25, 0x9b, 0x7a,
0xaf, 0x2d, 0x92, 0x66, 0xbc, 0xa8, 0xe4, 0xd7, 0x57, 0x4d, 0xc3, 0x92, 0x46, 0xc4, 0x2b, 0xe0,
0xb2, 0x39, 0x56, 0x2c, 0x6a, 0x86, 0x06, 0x59, 0x6d, 0x82, 0xa2, 0xd9, 0x94, 0xfc, 0xb4, 0x6a,
0x76, 0x02, 0x9f, 0x44, 0x57, 0x5c, 0x46, 0xe0, 0xad, 0x39, 0x44, 0x24, 0xe5, 0x2b, 0xac, 0xf0,
0xf4, 0x9b, 0xe2, 0xe8, 0x4b, 0x2b, 0x83, 0xdc, 0x9e, 0xc4, 0x11, 0x0d, 0xe5, 0xfb, 0xeb, 0x99,
0x45, 0xa5, 0x20, 0x2c, 0x5f, 0x09, 0x66, 0x12, 0xad, 0xfe, 0xd9, 0x22, 0x3f, 0xaf, 0x8e, 0x71,
0x2b, 0x08, 0x47, 0x83, 0x84, 0x4f, 0x58, 0xbf, 0xc3, 0x23, 0x9e, 0x78, 0x1b, 0x8e, 0xd2, 0x35,
0xb6, 0xb0, 0x7f, 0x75, 0xa5, 0x1c, 0x2c, 0x64, 0x48, 0x6e, 0x55, 0xeb, 0xd8, 0x8c, 0xe8, 0x80,
0x59, 0x87, 0x2c, 0x95, 0x14, 0x31, 0x77, 0xc8, 0x55, 0x12, 0x9d, 0x52, 0x5c, 0xfa, 0xd0, 0x69,
0x9b, 0x4e, 0xb3, 0x87, 0xfa, 0xc2, 0x21, 0xb1, 0x4d, 0xa7, 0xda, 0x33, 0x5d, 0x6b, 0x48, 0xa3,
0xe9, 0x3f, 0x5a, 0x64, 0xa9, 0xea, 0xaa, 0xad, 0x4e, 0xae, 0xdb, 0x6c, 0x5b, 0xa1, 0x5e, 0x5d,
0x29, 0x07, 0xeb, 0x60, 0xb8, 0x03, 0x53, 0x53, 0x0b, 0x22, 0xc0, 0x1d, 0x8c, 0xad, 0x2b, 0x32,
0xc4, 0xaf, 0x2d, 0x22, 0xcf, 0x1b, 0xb1, 0xe8, 0x37, 0x20, 0x3f, 0xca, 0x17, 0x64, 0x39, 0xd3,
0xe5, 0x1f, 0xd3, 0x53, 0x2d, 0x5b, 0x41, 0xfd, 0xe5, 0x78, 0xaa, 0x33, 0x24, 0x1a, 0xfd, 0x05,
0xe7, 0x0f, 0x1a, 0x65, 0xb3, 0xd7, 0x99, 0x5f, 0x9f, 0xb4, 0xab, 0x4d, 0x50, 0xfb, 0xba, 0x90,
0xf9, 0xcd, 0x5d, 0x17, 0xea, 0x9e, 0x7e, 0x53, 0xdc, 0x3c, 0x73, 0x25, 0x22, 0xf7, 0x35, 0xce,
0x99, 0xab, 0x74, 0x24, 0xd5, 0x68, 0xe6, 0x56, 0x69, 0xf3, 0x8d, 0xcd, 0x7a, 0xc5, 0x79, 0x63,
0xeb, 0x8d, 0xb2, 0xda, 0x04, 0x45, 0xaf, 0xb8, 0xfc, 0x3e, 0x50, 0x37, 0x75, 0x08, 0xe1, 0x08,
0xfa, 0xd6, 0x4d, 0x49, 0x76, 0x8f, 0x32, 0x68, 0xee, 0xa6, 0x44, 0x83, 0xb5, 0x5d, 0x71, 0x37,
0x8e, 0xa8, 0x30, 0xee, 0x8a, 0x55, 0xc4, 0xb9, 0x2b, 0xce, 0x09, 0x4d, 0xf2, 0x2d, 0x24, 0x03,
0xf3, 0x46, 0x5b, 0x45, 0x9c, 0x92, 0x39, 0xa1, 0x6d, 0x2f, 0x3b, 0x3c, 0xbe, 0x34, 0x6e, 0x2f,
0x65, 0xc0, 0xb9, 0xbd, 0x44, 0x40, 0x2b, 0xf1, 0x28, 0x48, 0x85, 0xb9, 0x44, 0x15, 0x71, 0x96,
0x98, 0x13, 0x28, 0xf9, 0x3b, 0x72, 0x23, 0x2b, 0x71, 0x22, 0xbc, 0xb6, 0xa9, 0x80, 0x49, 0x79,
0x13, 0x97, 0xad, 0x71, 0xed, 0x0b, 0x68, 0xe7, 0x53, 0xcc, 0x13, 0x61, 0xfc, 0x02, 0xca, 0x42,
0xce, 0x2f, 0xa0, 0x02, 0xd1, 0xbe, 0x3e, 0xf7, 0xc7, 0xf2, 0xba, 0x9c, 0xe5, 0xea, 0xbc, 0xc8,
0x34, 0x97, 0xeb, 0x88, 0x73, 0x2e, 0xcf, 0xa0, 0xb3, 0x2b, 0xdf, 0x2e, 0x8d, 0xe0, 0x30, 0x18,
0x83, 0x75, 0xe5, 0x53, 0xc7, 0x20, 0x92, 0x98, 0xbb, 0xf2, 0x55, 0xc9, 0xd9, 0x06, 0x55, 0x67,
0x81, 0xca, 0xc9, 0x96, 0x9f, 0x9d, 0x16, 0xd6, 0xac, 0x56, 0x9b, 0xa0, 0xe8, 0x35, 0xc6, 0x9d,
0x49, 0xee, 0x75, 0x46, 0xfb, 0x62, 0xe8, 0xb9, 0x15, 0x14, 0xe3, 0x3c, 0x2f, 0x98, 0x65, 0x67,
0x87, 0x76, 0x4a, 0xfb, 0xc0, 0x9d, 0x43, 0x53, 0x44, 0xb3, 0xa1, 0xd5, 0xd0, 0xd9, 0xa1, 0xa9,
0xb0, 0x7b, 0x68, 0x99, 0x42, 0xb3, 0xa1, 0xd5, 0x59, 0xb4, 0xfb, 0x7b, 0x8b, 0xdc, 0xcd, 0xfd,
0x0e, 0x28, 0x1b, 0x9d, 0x04, 0xc9, 0x40, 0x1d, 0x07, 0x87, 0xa3, 0xfd, 0xbe, 0xf7, 0x4b, 0x8b,
0x94, 0x24, 0xfd, 0x1a, 0x5a, 0xb8, 0x6f, 0x5c, 0x25, 0x45, 0x7b, 0xa1, 0xc8, 0x6d, 0x50, 0x20,
0x82, 0x29, 0x85, 0x8b, 0x53, 0x0a, 0x17, 0x9e, 0x6d, 0x0d, 0xcd, 0x21, 0xff, 0xb4, 0x7a, 0x54,
0xb8, 0xd6, 0x90, 0xd6, 0xb7, 0x42, 0x15, 0xd7, 0xcd, 0x50, 0xd0, 0x29, 0x28, 0xef, 0x8d, 0x79,
0x6a, 0x25, 0xeb, 0xda, 0x0a, 0x39, 0x72, 0xb0, 0x8e, 0xbf, 0x92, 0x9f, 0x55, 0x0e, 0x72, 0x6a,
0xe3, 0x5f, 0xb7, 0x9f, 0x03, 0x99, 0x6f, 0xc1, 0xcb, 0xe6, 0x09, 0x9a, 0x7b, 0xb6, 0x6b, 0x9a,
0xeb, 0x8e, 0x9b, 0xab, 0xe6, 0xee, 0x96, 0x04, 0xed, 0x33, 0x6a, 0x8b, 0xf3, 0xd1, 0x38, 0x48,
0x46, 0xbb, 0x20, 0xc2, 0xa1, 0xb1, 0xb3, 0x72, 0xc2, 0x57, 0x88, 0xb3, 0xb3, 0x66, 0x50, 0xfd,
0x1b, 0x23, 0x07, 0xb2, 0x3b, 0xb3, 0xc9, 0xfa, 0x99, 0xed, 0x86, 0x4b, 0xab, 0xce, 0x3a, 0x9f,
0xb8, 0x3d, 0x07, 0x0b, 0xf9, 0x1b, 0xb9, 0xa3, 0x48, 0xb9, 0x88, 0x16, 0x0c, 0x1e, 0x36, 0x9b,
0x6e, 0xba, 0x5a, 0x6c, 0x35, 0xd0, 0x79, 0xd3, 0x2d, 0x09, 0xe5, 0xfb, 0xe7, 0x30, 0x98, 0xd2,
0x41, 0x20, 0x28, 0x67, 0x72, 0xcb, 0x95, 0x7d, 0x41, 0xd7, 0xef, 0x7a, 0x49, 0xf8, 0x05, 0x62,
0xb9, 0xeb, 0x16, 0x14, 0xdd, 0xfe, 0xd5, 0x22, 0xed, 0x92, 0xd8, 0xc3, 0x4f, 0x0e, 0x76, 0xce,
0xcf, 0xa8, 0x18, 0xca, 0x45, 0x21, 0xf5, 0x7e, 0x65, 0x93, 0x33, 0xd1, 0x45, 0x11, 0xaf, 0xaf,
0x98, 0x85, 0xf5, 0xfc, 0x86, 0x7c, 0xf7, 0x88, 0xb2, 0x81, 0x77, 0xb7, 0x96, 0x2e, 0x2f, 0x15,
0xca, 0x4b, 0xa6, 0x50, 0x79, 0xbc, 0x72, 0x94, 0xf0, 0x10, 0xd2, 0xb4, 0x13, 0xb0, 0x10, 0x22,
0xed, 0x78, 0x05, 0x63, 0x7e, 0x16, 0xb4, 0x1c, 0xaf, 0xcc, 0x40, 0xe5, 0x76, 0xe3, 0x0d, 0x4d,
0x05, 0x4f, 0x2e, 0xbb, 0x43, 0x7e, 0xa1, 0x6d, 0x37, 0x30, 0xe2, 0xcb, 0x90, 0x65, 0xbb, 0xa1,
0x21, 0xe5, 0x41, 0x31, 0x06, 0xf0, 0xc7, 0x34, 0xfd, 0x10, 0x2f, 0x4f, 0xcb, 0xc3, 0x96, 0x43,
0x3c, 0x03, 0x56, 0xfe, 0x54, 0x95, 0xd7, 0x0d, 0x02, 0xc3, 0xda, 0x4f, 0x55, 0x45, 0x69, 0x05,
0x60, 0xf9, 0xa9, 0xca, 0x08, 0xa2, 0xcf, 0x4b, 0xb2, 0x20, 0x27, 0x18, 0xb0, 0x1d, 0xf5, 0xd3,
0xb7, 0xb7, 0x58, 0x64, 0xee, 0x8c, 0x63, 0x71, 0xb9, 0x54, 0xf9, 0xbf, 0x04, 0x5e, 0xb6, 0xb6,
0xee, 0xfd, 0xe7, 0x6b, 0xbb, 0xf5, 0xe5, 0x6b, 0xbb, 0xf5, 0xbf, 0xaf, 0xed, 0xd6, 0xe7, 0x6f,
0xed, 0x6b, 0x5f, 0xbe, 0xb5, 0xaf, 0xfd, 0xf7, 0x5b, 0xfb, 0xda, 0x87, 0xef, 0x44, 0xb4, 0xd7,
0xfb, 0x9e, 0xfa, 0xf1, 0xfc, 0xd5, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xda, 0xf5, 0xab, 0x74,
0x9a, 0x1f, 0x00, 0x00,
// 1816 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x9a, 0xdf, 0x73, 0x1c, 0x47,
0x11, 0xc7, 0x7d, 0x05, 0x45, 0xc2, 0x44, 0x08, 0xb2, 0x40, 0x48, 0x44, 0xe5, 0x94, 0x38, 0x0e,
0xb1, 0x64, 0x6b, 0x65, 0x64, 0xc2, 0x1b, 0x0f, 0xd2, 0xe9, 0x87, 0x55, 0xc8, 0xb2, 0xb8, 0xd3,
0x8f, 0x2a, 0x17, 0x14, 0xec, 0xed, 0xb6, 0xee, 0x86, 0xdb, 0x9b, 0x59, 0xef, 0xce, 0x9d, 0xac,
0x2a, 0x78, 0xa1, 0x0a, 0xde, 0xa8, 0xf2, 0xff, 0xc0, 0x3f, 0xc3, 0xa3, 0x1f, 0x79, 0xa4, 0xec,
0x7f, 0x24, 0x35, 0xb3, 0xbd, 0xbf, 0xe6, 0x66, 0xe6, 0x56, 0x0f, 0x49, 0x2a, 0xdb, 0x9f, 0xfe,
0x76, 0xcf, 0x6e, 0xf7, 0x6c, 0xef, 0x9c, 0xc8, 0x7a, 0x32, 0xdc, 0x4e, 0x52, 0x2e, 0x78, 0xb6,
0x9d, 0x41, 0x3a, 0xa7, 0x21, 0x14, 0xff, 0xf5, 0xd5, 0x65, 0xef, 0x83, 0x80, 0xdd, 0x8a, 0xdb,
0x04, 0xd6, 0x3e, 0xad, 0xc8, 0x90, 0x4f, 0xa7, 0x01, 0x8b, 0xb2, 0x1c, 0x59, 0xfb, 0xa4, 0xb2,
0xc0, 0x1c, 0x98, 0xc0, 0xeb, 0x3b, 0xff, 0xd9, 0x25, 0xab, 0xbd, 0x98, 0x02, 0x13, 0x3d, 0x74,
0xf0, 0xae, 0xc8, 0xca, 0x55, 0x10, 0xc7, 0x20, 0x7a, 0x29, 0x04, 0x02, 0xbc, 0xfb, 0x3e, 0xca,
0xfb, 0xfd, 0x24, 0xf4, 0x73, 0x93, 0x9f, 0xdb, 0xfc, 0x3e, 0xbc, 0x9a, 0x41, 0x26, 0xd6, 0xbe,
0x72, 0x32, 0x59, 0xc2, 0x59, 0x06, 0xde, 0x4b, 0xf2, 0xa3, 0xdc, 0xd2, 0x87, 0x90, 0xcf, 0x21,
0xf5, 0x8c, 0x5e, 0x68, 0x2c, 0xa5, 0x1f, 0xb8, 0x21, 0xd4, 0xfe, 0x13, 0x59, 0xdd, 0x0d, 0x43,
0x3e, 0x63, 0xa5, 0x78, 0xd3, 0x0f, 0x8d, 0x0b, 0xea, 0x5f, 0x2f, 0xa1, 0xaa, 0xd4, 0xd1, 0x86,
0x37, 0xe5, 0x2b, 0xa3, 0x9f, 0x76, 0x57, 0x1e, 0xb8, 0xa1, 0x05, 0xed, 0x01, 0xc4, 0x10, 0x0a,
0x8b, 0x76, 0x6e, 0x5c, 0xa2, 0x5d, 0x42, 0xa8, 0x7d, 0x4e, 0x3e, 0x2a, 0xb4, 0x05, 0x4f, 0xbc,
0x2f, 0xcd, 0x4e, 0x82, 0x27, 0xa5, 0xee, 0x7d, 0x17, 0x82, 0xaa, 0x21, 0x59, 0x39, 0x9e, 0x06,
0x23, 0x38, 0x02, 0xb1, 0x17, 0xf3, 0xa1, 0xf7, 0xb0, 0xe1, 0x73, 0x9c, 0x5c, 0x67, 0xbe, 0xb2,
0xfb, 0x47, 0x20, 0x7c, 0x49, 0x94, 0xea, 0x1b, 0x2d, 0x48, 0x0c, 0xf2, 0x07, 0x42, 0x2e, 0x21,
0xcd, 0x28, 0x67, 0x47, 0x20, 0xbc, 0x2f, 0x1a, 0x8e, 0x68, 0x50, 0x5e, 0x85, 0xf4, 0x97, 0x0e,
0x02, 0x25, 0x9f, 0x91, 0x0f, 0x4e, 0xf8, 0x68, 0x00, 0x2c, 0xf2, 0x3e, 0x6f, 0xd0, 0x27, 0x7c,
0xe4, 0xcb, 0xcb, 0xa5, 0x58, 0xd7, 0x66, 0x46, 0xa5, 0x53, 0xf2, 0xc3, 0x1e, 0x67, 0xd7, 0x74,
0x24, 0x73, 0x5b, 0x6f, 0xc0, 0xf9, 0xf5, 0x46, 0x6a, 0x5f, 0xd8, 0x01, 0xd4, 0x3b, 0x26, 0x1f,
0x0e, 0xc6, 0x33, 0x11, 0xf1, 0x1b, 0xa6, 0xa5, 0x56, 0x5c, 0xb6, 0xa4, 0x56, 0x33, 0xa3, 0xd4,
0x35, 0xf9, 0xf8, 0xe0, 0xb5, 0x80, 0x94, 0x05, 0xf1, 0x7e, 0xca, 0x93, 0x43, 0x1a, 0x43, 0xe6,
0x7d, 0xd3, 0x70, 0xaa, 0xdb, 0x7d, 0x05, 0x94, 0xea, 0x0f, 0x97, 0x83, 0x18, 0x27, 0x26, 0x3f,
0xad, 0x9b, 0x7b, 0x9c, 0x09, 0x60, 0xc2, 0xdb, 0xb0, 0x0b, 0x20, 0x52, 0xc6, 0xda, 0x6c, 0x83,
0x62, 0xb4, 0x3e, 0xf9, 0xe8, 0x84, 0xb2, 0xc9, 0x59, 0x0a, 0x73, 0x0a, 0x37, 0x5a, 0x39, 0xd4,
0x2c, 0x96, 0x72, 0x68, 0x12, 0xa8, 0xf9, 0x82, 0x90, 0x8b, 0x24, 0xe6, 0x41, 0x24, 0x57, 0xa6,
0x3d, 0xc5, 0xca, 0x60, 0x79, 0x8a, 0x0d, 0xa0, 0xea, 0xb6, 0xbd, 0x98, 0x87, 0x93, 0xdc, 0xa6,
0x75, 0x9b, 0xb2, 0xa0, 0x9b, 0xa5, 0xdb, 0x34, 0x04, 0x55, 0xaf, 0xc8, 0x8a, 0x32, 0xf4, 0x21,
0x89, 0x83, 0x50, 0xdf, 0x8f, 0x73, 0x1f, 0xb4, 0x59, 0xf6, 0x63, 0x9d, 0xa9, 0x8a, 0x58, 0x59,
0x5e, 0x24, 0xc0, 0xb4, 0xe5, 0xe7, 0x1e, 0xd2, 0x60, 0x59, 0x7e, 0x03, 0x40, 0x3d, 0x4e, 0x7e,
0xa6, 0x2e, 0x1f, 0x81, 0x38, 0x9b, 0x0d, 0x63, 0x1a, 0x5e, 0xc1, 0xf0, 0xa2, 0x7f, 0xe2, 0x6d,
0x1a, 0x3c, 0x35, 0xa6, 0x8c, 0xf2, 0xa8, 0x15, 0xab, 0x05, 0x94, 0x69, 0xec, 0xa5, 0x10, 0x44,
0x61, 0x3a, 0x9b, 0x0e, 0x33, 0x63, 0x40, 0x8d, 0x71, 0x06, 0x5c, 0x64, 0xab, 0x9a, 0x57, 0xc4,
0x00, 0x44, 0x3d, 0xde, 0x86, 0x41, 0xa3, 0x89, 0x58, 0x6a, 0xde, 0x82, 0x6a, 0xe5, 0x84, 0xaf,
0x1c, 0x53, 0x39, 0x69, 0x2f, 0x9c, 0xfb, 0x2e, 0x04, 0x55, 0xff, 0x42, 0x7e, 0x5c, 0x53, 0x3d,
0x0b, 0x46, 0xe0, 0x7d, 0x6d, 0x75, 0x93, 0xe6, 0x52, 0xfd, 0x57, 0xcb, 0x30, 0xbd, 0x0d, 0x58,
0x4c, 0xd9, 0xc4, 0xdc, 0x06, 0xca, 0xe4, 0x6e, 0x83, 0x02, 0xa9, 0xde, 0x07, 0x79, 0xde, 0x31,
0xcf, 0xc0, 0x33, 0x55, 0xa3, 0xb2, 0x58, 0x36, 0x80, 0x26, 0x51, 0xbd, 0x79, 0xd5, 0xf5, 0x7d,
0x7e, 0xc3, 0x54, 0xc7, 0x9a, 0xda, 0xa6, 0x30, 0x5a, 0xde, 0xbc, 0x0b, 0x10, 0x6a, 0xff, 0x11,
0xb5, 0x8f, 0x40, 0x3c, 0x0f, 0xd2, 0x49, 0xe6, 0x3d, 0x30, 0x57, 0xb6, 0xaf, 0xac, 0x96, 0x79,
0x64, 0x91, 0xd2, 0x5a, 0xf7, 0x82, 0x45, 0xdc, 0xd8, 0xba, 0xd2, 0xe0, 0x6c, 0x5d, 0x04, 0x34,
0xbd, 0x3e, 0x58, 0xf4, 0xa4, 0xc1, 0xa9, 0x87, 0x00, 0xea, 0xfd, 0x99, 0xac, 0x16, 0x8d, 0x72,
0x48, 0x21, 0x8e, 0x32, 0x63, 0x8d, 0x0d, 0x40, 0xf8, 0xb9, 0xd9, 0x59, 0x63, 0x0d, 0x0c, 0x03,
0xbc, 0xc2, 0xd6, 0x1f, 0xc8, 0x69, 0x32, 0x13, 0x29, 0x0d, 0x05, 0xe5, 0x2c, 0xf3, 0x1e, 0x59,
0xfc, 0xeb, 0x50, 0x19, 0xec, 0x71, 0x3b, 0x18, 0x43, 0x0e, 0xb1, 0x71, 0x06, 0x20, 0xf6, 0x41,
0x04, 0x34, 0xce, 0x3c, 0x5b, 0xb6, 0x68, 0x2f, 0x03, 0x7d, 0xb3, 0x94, 0xc3, 0x18, 0xb7, 0xe4,
0x93, 0x22, 0x86, 0xec, 0xa9, 0xe3, 0x6c, 0x37, 0x0d, 0xc7, 0x74, 0x0e, 0x91, 0xe7, 0x5b, 0x24,
0x54, 0xeb, 0x55, 0x5c, 0x19, 0x72, 0xbb, 0x35, 0xaf, 0x35, 0xc3, 0x09, 0xcd, 0xc4, 0x73, 0x3e,
0x07, 0x53, 0x33, 0x48, 0x9b, 0x2f, 0x8d, 0xae, 0x66, 0xa8, 0x43, 0xa8, 0x3d, 0xc3, 0x65, 0x15,
0xda, 0xe7, 0xfc, 0x14, 0x6e, 0xd4, 0xd6, 0xf3, 0xd8, 0xe1, 0x5f, 0x52, 0x65, 0xb4, 0xad, 0x96,
0x34, 0x86, 0x7d, 0xd3, 0x21, 0xeb, 0x25, 0xd4, 0xe3, 0x6c, 0x0e, 0xa9, 0xe8, 0x8d, 0x69, 0x1c,
0xa5, 0xc0, 0xce, 0xb9, 0x64, 0x33, 0xef, 0x5b, 0x8b, 0xa4, 0x19, 0x2f, 0x33, 0xf9, 0xed, 0x5d,
0xdd, 0x30, 0xa5, 0x09, 0xf1, 0x4a, 0xb8, 0x6a, 0x8e, 0x0d, 0x8b, 0x9a, 0xa1, 0x41, 0x36, 0xdb,
0xa0, 0x18, 0x6c, 0x4e, 0x7e, 0x5e, 0x0f, 0x76, 0x0e, 0xaf, 0xc5, 0x40, 0xdc, 0xc6, 0xe0, 0x6d,
0x39, 0x44, 0x24, 0xe5, 0x2b, 0xac, 0x8c, 0xe9, 0xb7, 0xc5, 0x31, 0x2e, 0xad, 0x2d, 0x72, 0x7f,
0x96, 0xc4, 0x34, 0x94, 0xef, 0xaf, 0x87, 0x16, 0x95, 0x92, 0xb0, 0x7c, 0x25, 0x98, 0x49, 0x0c,
0xf5, 0xaf, 0x0e, 0xf9, 0x65, 0x7d, 0x8d, 0x7b, 0x41, 0x38, 0x19, 0xa5, 0x7c, 0xc6, 0xa2, 0x1e,
0x8f, 0x79, 0xea, 0xed, 0x38, 0x52, 0xd7, 0xd8, 0x32, 0xfc, 0xd3, 0x3b, 0xf9, 0x60, 0x22, 0x63,
0xf2, 0x71, 0x3d, 0x8f, 0xdd, 0x98, 0x8e, 0x98, 0x75, 0xc9, 0x52, 0x49, 0x11, 0x4b, 0x97, 0x5c,
0x27, 0x31, 0x52, 0x86, 0x5b, 0x1f, 0x46, 0xda, 0xa7, 0xf3, 0xfc, 0xa1, 0x3e, 0x76, 0x48, 0xec,
0xd3, 0xb9, 0xf6, 0x4c, 0xb7, 0x5a, 0xd2, 0x18, 0xf4, 0x9f, 0x1d, 0xb2, 0x56, 0x8f, 0xaa, 0xed,
0x4e, 0xae, 0xdb, 0x6c, 0xdb, 0xa1, 0x9e, 0xde, 0xc9, 0x07, 0xf3, 0x60, 0x38, 0x81, 0xa9, 0xd2,
0x82, 0x18, 0x70, 0x82, 0xb1, 0x75, 0x45, 0x8e, 0xf8, 0x8d, 0x4d, 0xe4, 0x51, 0x2b, 0x16, 0xe3,
0x8d, 0xc8, 0x4f, 0x8a, 0x0d, 0x59, 0x56, 0xba, 0xfc, 0xc7, 0xf4, 0x54, 0xab, 0x56, 0x50, 0xff,
0x72, 0x3c, 0xd5, 0x05, 0x12, 0x03, 0xfd, 0x15, 0xeb, 0x07, 0x03, 0xe5, 0xd5, 0xeb, 0xf4, 0x6f,
0x16, 0xed, 0x66, 0x1b, 0xd4, 0xbe, 0x2f, 0xe4, 0xf1, 0x96, 0xee, 0x0b, 0xcd, 0x98, 0x7e, 0x5b,
0xdc, 0x5c, 0xb9, 0x12, 0x91, 0x73, 0x8d, 0xb3, 0x72, 0x95, 0x8e, 0xa4, 0x5a, 0x55, 0x6e, 0x9d,
0x36, 0xdf, 0xd8, 0xbc, 0x57, 0x9c, 0x37, 0xb6, 0xd9, 0x28, 0x9b, 0x6d, 0x50, 0x8c, 0x95, 0x54,
0xdf, 0x07, 0xea, 0xa6, 0x8e, 0x21, 0x9c, 0x40, 0x64, 0x1d, 0x4a, 0xf2, 0x7b, 0x94, 0x43, 0x4b,
0x87, 0x12, 0x0d, 0xd6, 0xa6, 0xe2, 0x41, 0x12, 0x53, 0x61, 0x9c, 0x8a, 0x95, 0xc5, 0x39, 0x15,
0x17, 0x84, 0x26, 0xf9, 0x1c, 0xd2, 0x91, 0x79, 0xd0, 0x56, 0x16, 0xa7, 0x64, 0x41, 0x68, 0xe3,
0x65, 0x8f, 0x27, 0xb7, 0xc6, 0xf1, 0x52, 0x1a, 0x9c, 0xe3, 0x25, 0x02, 0x5a, 0x8a, 0x67, 0x41,
0x26, 0xcc, 0x29, 0x2a, 0x8b, 0x33, 0xc5, 0x82, 0x40, 0xc9, 0xdf, 0x93, 0x0f, 0xf3, 0x14, 0x67,
0xc2, 0xeb, 0x9a, 0x12, 0x98, 0x55, 0x37, 0x71, 0xdd, 0x6a, 0xd7, 0xbe, 0x80, 0x0e, 0x5e, 0x27,
0x3c, 0x15, 0xc6, 0x2f, 0xa0, 0xdc, 0xe4, 0xfc, 0x02, 0x2a, 0x11, 0xed, 0xeb, 0xf3, 0x78, 0x2a,
0xaf, 0xcb, 0x2a, 0x57, 0xe7, 0x45, 0xa6, 0x5a, 0x6e, 0x22, 0xce, 0x5a, 0x5e, 0x40, 0x17, 0x77,
0xbe, 0x43, 0x1a, 0xc3, 0x69, 0x30, 0x05, 0xeb, 0xce, 0xa7, 0x8e, 0x41, 0x24, 0xb1, 0x74, 0xe7,
0xab, 0x93, 0x8b, 0x0d, 0xaa, 0xce, 0x02, 0x55, 0x24, 0x9b, 0x7f, 0x7e, 0x5a, 0xd8, 0x08, 0xb5,
0xd9, 0x06, 0xc5, 0x58, 0x53, 0x9c, 0x4c, 0x8a, 0x58, 0x57, 0x34, 0x12, 0x63, 0xcf, 0xad, 0xa0,
0x18, 0xe7, 0x79, 0xc1, 0x22, 0xbb, 0xb8, 0xb4, 0x4b, 0x1a, 0x01, 0x77, 0x2e, 0x4d, 0x11, 0xed,
0x96, 0xd6, 0x40, 0x17, 0x97, 0xa6, 0xcc, 0xee, 0xa5, 0xe5, 0x0a, 0xed, 0x96, 0xd6, 0x64, 0x31,
0xdc, 0x3f, 0x3a, 0xe4, 0xb3, 0x22, 0xde, 0x09, 0x65, 0x93, 0xf3, 0x20, 0x1d, 0xa9, 0xe3, 0xe0,
0x70, 0x72, 0x1c, 0x79, 0xbf, 0xb6, 0x48, 0x49, 0xd2, 0x6f, 0xa0, 0x65, 0xf4, 0x9d, 0xbb, 0xb8,
0x68, 0x2f, 0x14, 0x39, 0x06, 0x05, 0x22, 0x98, 0x53, 0xb8, 0xb9, 0xa4, 0x70, 0xe3, 0xd9, 0xf6,
0xd0, 0x02, 0xf2, 0x2f, 0xeb, 0x47, 0x85, 0x5b, 0x2d, 0x69, 0x7d, 0x14, 0xaa, 0x45, 0xdd, 0x0d,
0x05, 0x9d, 0x83, 0x8a, 0xbd, 0xb3, 0x4c, 0xad, 0x62, 0x5d, 0xa3, 0x90, 0xc3, 0x07, 0xf3, 0xf8,
0x1b, 0xf9, 0x45, 0xed, 0x20, 0xa7, 0xb1, 0xfe, 0x6d, 0xfb, 0x39, 0x90, 0xf9, 0x16, 0x3c, 0x69,
0xef, 0xa0, 0x45, 0xcf, 0xa7, 0xa6, 0xa5, 0xd1, 0x71, 0xb8, 0x6a, 0x1f, 0xdd, 0xe2, 0xa0, 0x57,
0x5f, 0x73, 0xf1, 0x7d, 0x08, 0x79, 0x6a, 0xae, 0x3e, 0x7d, 0x35, 0x39, 0xea, 0xac, 0x3e, 0xab,
0x8b, 0x9e, 0xc4, 0x45, 0x12, 0xb5, 0x4b, 0x22, 0x07, 0xef, 0x94, 0x84, 0xd5, 0x45, 0x4f, 0xa2,
0xf9, 0x20, 0x1c, 0x49, 0xe8, 0x77, 0xb6, 0x45, 0x12, 0x56, 0x17, 0xed, 0xab, 0x76, 0x8f, 0xf3,
0xc9, 0x34, 0x48, 0x27, 0x87, 0x20, 0xc2, 0xb1, 0x71, 0xa3, 0x2b, 0x08, 0x5f, 0x21, 0xce, 0x8d,
0x6e, 0x01, 0xd5, 0x3f, 0xf9, 0x0a, 0x20, 0x7f, 0x4e, 0xbb, 0x2c, 0xca, 0xc3, 0xee, 0xb8, 0xb4,
0x9a, 0xac, 0xb3, 0x01, 0xed, 0x3e, 0x98, 0xc8, 0xdf, 0xc9, 0xa7, 0x8a, 0x94, 0xef, 0xb4, 0x92,
0xc1, 0xb3, 0x7f, 0x53, 0x0f, 0xa8, 0x77, 0x9f, 0x06, 0x3a, 0x7b, 0xc0, 0xe2, 0x50, 0x8d, 0x03,
0xa7, 0xc1, 0x9c, 0x8e, 0x02, 0x41, 0x39, 0x93, 0x13, 0x70, 0x7e, 0xa0, 0xd1, 0xbc, 0xeb, 0x15,
0xe1, 0x97, 0x88, 0xe5, 0xae, 0x5b, 0x50, 0x8c, 0xf6, 0xef, 0x0e, 0xe9, 0x56, 0xc4, 0x11, 0x7e,
0x01, 0xb2, 0x6b, 0x7e, 0x45, 0xc5, 0x58, 0xee, 0xd1, 0x99, 0xf7, 0x1b, 0x9b, 0x9c, 0x89, 0x2e,
0x93, 0xf8, 0xf6, 0x8e, 0x5e, 0x98, 0xcf, 0xef, 0xc8, 0xf7, 0xcf, 0x28, 0x1b, 0x79, 0x9f, 0x35,
0xdc, 0xe5, 0xa5, 0x52, 0x79, 0xcd, 0x64, 0xaa, 0x4e, 0xbb, 0xce, 0x52, 0x1e, 0x42, 0x96, 0xf5,
0x02, 0x16, 0x42, 0xac, 0x9d, 0x76, 0xa1, 0xcd, 0xcf, 0x8d, 0x96, 0xd3, 0xae, 0x05, 0xa8, 0x9a,
0xfe, 0x9e, 0xd1, 0x4c, 0xf0, 0xf4, 0x76, 0x30, 0xe6, 0x37, 0xda, 0xf4, 0x87, 0x16, 0x5f, 0x9a,
0x2c, 0xd3, 0x9f, 0x86, 0x54, 0xe7, 0xf6, 0x68, 0xc0, 0xdf, 0x36, 0xf5, 0x33, 0xd5, 0xc2, 0xad,
0x30, 0x5b, 0xce, 0x54, 0x0d, 0x58, 0xf5, 0xcb, 0x61, 0x91, 0x37, 0x08, 0x34, 0x6b, 0xbf, 0x1c,
0x96, 0xa9, 0x95, 0x80, 0xe5, 0x97, 0x43, 0x23, 0x88, 0x71, 0x9e, 0x90, 0x15, 0x59, 0x60, 0xc0,
0x0e, 0xd4, 0x5f, 0x22, 0x78, 0xab, 0xa5, 0xe7, 0xc1, 0x34, 0x11, 0xb7, 0x6b, 0xb5, 0xff, 0x97,
0xc0, 0x93, 0xce, 0xde, 0xe7, 0xff, 0x7d, 0xd7, 0xed, 0xbc, 0x7d, 0xd7, 0xed, 0xfc, 0xff, 0x5d,
0xb7, 0xf3, 0xe6, 0x7d, 0xf7, 0xde, 0xdb, 0xf7, 0xdd, 0x7b, 0xff, 0x7b, 0xdf, 0xbd, 0xf7, 0xf2,
0x7b, 0x31, 0x1d, 0x0e, 0x7f, 0xa0, 0xfe, 0x96, 0xe1, 0xe9, 0x77, 0x01, 0x00, 0x00, 0xff, 0xff,
0x5d, 0x44, 0x0b, 0x40, 0x29, 0x21, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -212,6 +215,9 @@ type ClientCommandsHandler interface {
BlockSetDataviewActiveView(*pb.RpcBlockSetDataviewActiveViewRequest) *pb.RpcBlockSetDataviewActiveViewResponse
BlockCreateDataviewView(*pb.RpcBlockCreateDataviewViewRequest) *pb.RpcBlockCreateDataviewViewResponse
BlockDeleteDataviewView(*pb.RpcBlockDeleteDataviewViewRequest) *pb.RpcBlockDeleteDataviewViewResponse
BlockCreateDataviewRecord(*pb.RpcBlockCreateDataviewRecordRequest) *pb.RpcBlockCreateDataviewRecordResponse
BlockUpdateDataviewRecord(*pb.RpcBlockUpdateDataviewRecordRequest) *pb.RpcBlockUpdateDataviewRecordResponse
BlockDeleteDataviewRecord(*pb.RpcBlockDeleteDataviewRecordRequest) *pb.RpcBlockDeleteDataviewRecordResponse
BlockBookmarkFetch(*pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse
BlockBookmarkCreateAndFetch(*pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse
BlockFileCreateAndUpload(*pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse
@ -900,6 +906,36 @@ func BlockDeleteDataviewView(b []byte) []byte {
return resp
}
func BlockCreateDataviewRecord(b []byte) []byte {
in := new(pb.RpcBlockCreateDataviewRecordRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ := (&pb.RpcBlockCreateDataviewRecordResponse{Error: &pb.RpcBlockCreateDataviewRecordResponseError{Code: pb.RpcBlockCreateDataviewRecordResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ := clientCommandsHandler.BlockCreateDataviewRecord(in).Marshal()
return resp
}
func BlockUpdateDataviewRecord(b []byte) []byte {
in := new(pb.RpcBlockUpdateDataviewRecordRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ := (&pb.RpcBlockUpdateDataviewRecordResponse{Error: &pb.RpcBlockUpdateDataviewRecordResponseError{Code: pb.RpcBlockUpdateDataviewRecordResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ := clientCommandsHandler.BlockUpdateDataviewRecord(in).Marshal()
return resp
}
func BlockDeleteDataviewRecord(b []byte) []byte {
in := new(pb.RpcBlockDeleteDataviewRecordRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ := (&pb.RpcBlockDeleteDataviewRecordResponse{Error: &pb.RpcBlockDeleteDataviewRecordResponseError{Code: pb.RpcBlockDeleteDataviewRecordResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ := clientCommandsHandler.BlockDeleteDataviewRecord(in).Marshal()
return resp
}
func BlockBookmarkFetch(b []byte) []byte {
in := new(pb.RpcBlockBookmarkFetchRequest)
if err := in.Unmarshal(b); err != nil {
@ -1138,6 +1174,12 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = BlockCreateDataviewView(data)
case "BlockDeleteDataviewView":
cd = BlockDeleteDataviewView(data)
case "BlockCreateDataviewRecord":
cd = BlockCreateDataviewRecord(data)
case "BlockUpdateDataviewRecord":
cd = BlockUpdateDataviewRecord(data)
case "BlockDeleteDataviewRecord":
cd = BlockDeleteDataviewRecord(data)
case "BlockBookmarkFetch":
cd = BlockBookmarkFetch(data)
case "BlockBookmarkCreateAndFetch":

File diff suppressed because it is too large Load diff

View file

@ -65,14 +65,17 @@ type ModelProcessType int32
const (
ModelProcess_DropFiles ModelProcessType = 0
ModelProcess_Import ModelProcessType = 1
)
var ModelProcessType_name = map[int32]string{
0: "DropFiles",
1: "Import",
}
var ModelProcessType_value = map[string]int32{
"DropFiles": 0,
"Import": 1,
}
func (x ModelProcessType) String() string {
@ -5482,8 +5485,9 @@ func (m *ModelProcess) GetProgress() *ModelProcessProgress {
}
type ModelProcessProgress struct {
Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
Done int64 `protobuf:"varint,2,opt,name=done,proto3" json:"done,omitempty"`
Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
Done int64 `protobuf:"varint,2,opt,name=done,proto3" json:"done,omitempty"`
Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
}
func (m *ModelProcessProgress) Reset() { *m = ModelProcessProgress{} }
@ -5533,6 +5537,13 @@ func (m *ModelProcessProgress) GetDone() int64 {
return 0
}
func (m *ModelProcessProgress) GetMessage() string {
if m != nil {
return m.Message
}
return ""
}
func init() {
proto.RegisterEnum("anytype.SmartBlockType", SmartBlockType_name, SmartBlockType_value)
proto.RegisterEnum("anytype.ModelProcessType", ModelProcessType_name, ModelProcessType_value)
@ -5642,172 +5653,173 @@ func init() {
func init() { proto.RegisterFile("pb/protos/events.proto", fileDescriptor_a966342d378ae5f5) }
var fileDescriptor_a966342d378ae5f5 = []byte{
// 2628 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x6f, 0xdc, 0xc6,
0x1d, 0xde, 0x07, 0x57, 0xbb, 0xfb, 0x5b, 0x4b, 0xda, 0x4c, 0xdc, 0x98, 0x65, 0x64, 0x59, 0x96,
0x9f, 0xf1, 0x63, 0x95, 0xc8, 0x49, 0x64, 0x2b, 0x7e, 0x44, 0x96, 0x6c, 0xac, 0x12, 0x5b, 0x56,
0x47, 0x56, 0x5b, 0xa4, 0x3e, 0x94, 0x5a, 0x8e, 0x56, 0x84, 0xb8, 0xe4, 0x82, 0xa4, 0x64, 0x2b,
0xd7, 0xde, 0x8a, 0xb6, 0xe8, 0xa1, 0x48, 0x51, 0xa0, 0x3d, 0xf5, 0xd4, 0x4b, 0x2f, 0x45, 0x81,
0xfe, 0x09, 0x2d, 0x7a, 0xc9, 0xa5, 0x40, 0x8e, 0x85, 0x7d, 0xe9, 0x35, 0xff, 0x41, 0x31, 0x0f,
0x92, 0x33, 0x14, 0xb9, 0x94, 0x82, 0x04, 0x68, 0x91, 0xdc, 0x76, 0x66, 0xbe, 0xef, 0x9b, 0x99,
0xdf, 0xfc, 0x38, 0xf3, 0x91, 0xb3, 0xf0, 0xc6, 0x70, 0x6b, 0x6e, 0xe8, 0x7b, 0xa1, 0x17, 0xcc,
0x91, 0x7d, 0xe2, 0x86, 0x41, 0x87, 0x95, 0x50, 0xdd, 0x74, 0x0f, 0xc2, 0x83, 0x21, 0x31, 0x3e,
0xde, 0x27, 0xae, 0xe5, 0xf9, 0x73, 0x7d, 0x3b, 0xdc, 0xd9, 0xdb, 0xea, 0xf4, 0xbc, 0xc1, 0x9c,
0x68, 0xb2, 0xbd, 0xb9, 0xbe, 0x77, 0x5d, 0x14, 0xae, 0x3b, 0xf6, 0x96, 0x6f, 0xfa, 0x07, 0x73,
0xc3, 0xad, 0xb9, 0x81, 0x67, 0x11, 0x27, 0x52, 0x65, 0x05, 0xa1, 0x6a, 0x4c, 0xf5, 0x3d, 0xaf,
0xef, 0x10, 0xde, 0xb6, 0xb5, 0xb7, 0x3d, 0x17, 0x84, 0xfe, 0x5e, 0x2f, 0xe4, 0xad, 0xb3, 0x9f,
0xad, 0x41, 0xed, 0x01, 0x1d, 0x04, 0x9a, 0x87, 0xc6, 0x80, 0x04, 0x81, 0xd9, 0x27, 0x81, 0x5e,
0x9e, 0xa9, 0x5e, 0x6e, 0xcd, 0xbf, 0xd1, 0x11, 0x1d, 0x75, 0x18, 0xa2, 0xf3, 0x98, 0x37, 0xe3,
0x18, 0x87, 0xa6, 0xa0, 0xd9, 0xf3, 0xdc, 0x90, 0xbc, 0x08, 0x57, 0x2d, 0xbd, 0x32, 0x53, 0xbe,
0xdc, 0xc4, 0x49, 0x05, 0x7a, 0x17, 0x9a, 0xb6, 0x6b, 0x87, 0xb6, 0x19, 0x7a, 0xbe, 0x5e, 0x9d,
0x29, 0x2b, 0x92, 0x6c, 0x8c, 0x9d, 0xa5, 0x5e, 0xcf, 0xdb, 0x73, 0x43, 0x9c, 0x00, 0x8d, 0xdf,
0xbd, 0x06, 0x75, 0xd1, 0x13, 0xba, 0x07, 0x2d, 0x93, 0x23, 0x36, 0x76, 0xbc, 0xe7, 0x7a, 0x99,
0x69, 0xbc, 0x99, 0x1a, 0x96, 0xd0, 0xe8, 0x50, 0x48, 0xb7, 0x84, 0x65, 0x06, 0x5a, 0x85, 0x09,
0x51, 0x5c, 0x21, 0xa1, 0x69, 0x3b, 0x81, 0xfe, 0x0f, 0x2e, 0x32, 0x9d, 0x23, 0x22, 0x60, 0xdd,
0x12, 0x4e, 0x11, 0xd1, 0xfb, 0xd0, 0xd8, 0x72, 0xbc, 0xde, 0xee, 0x92, 0xc5, 0xa7, 0xda, 0x9a,
0xd7, 0x53, 0x1a, 0xf7, 0x69, 0x73, 0x67, 0xc9, 0xb2, 0xba, 0x25, 0x1c, 0x63, 0xe9, 0x1c, 0xd8,
0xef, 0x15, 0xe2, 0x90, 0x90, 0x88, 0x38, 0xbc, 0x99, 0x49, 0xe5, 0x10, 0x3a, 0x07, 0x89, 0x81,
0x56, 0xa0, 0xb5, 0x6d, 0x3b, 0x24, 0xd8, 0x1c, 0x3a, 0x9e, 0x69, 0xe9, 0x1a, 0x13, 0x98, 0xc9,
0x14, 0x78, 0x98, 0xe0, 0xa8, 0x8a, 0x44, 0x43, 0x77, 0xa1, 0x39, 0x30, 0xfd, 0xdd, 0x60, 0xd5,
0xdd, 0xf6, 0xf4, 0x5a, 0x66, 0x0c, 0xb8, 0xc6, 0xe3, 0x08, 0xd5, 0x2d, 0xe1, 0x84, 0x42, 0x23,
0xc9, 0x06, 0xb5, 0x41, 0xc2, 0x87, 0x36, 0x71, 0xac, 0x40, 0x1f, 0x63, 0x22, 0x67, 0x32, 0x45,
0x36, 0x48, 0xd8, 0xe1, 0x30, 0x1a, 0x49, 0x95, 0x88, 0x7e, 0x0c, 0xaf, 0x47, 0x35, 0xcb, 0x3b,
0xb6, 0x63, 0xf9, 0xc4, 0x5d, 0xb5, 0x02, 0xbd, 0xce, 0xf4, 0xce, 0xe7, 0xea, 0x49, 0xd8, 0x6e,
0x09, 0x67, 0x49, 0xa0, 0x9f, 0xc0, 0xc9, 0xa8, 0x1a, 0x93, 0x20, 0xf4, 0xed, 0x5e, 0x68, 0x7b,
0x6e, 0xa0, 0x37, 0x98, 0xf4, 0x85, 0x5c, 0x69, 0x19, 0xdc, 0x2d, 0xe1, 0x4c, 0x11, 0x64, 0xc1,
0xa9, 0xa8, 0xfe, 0xbe, 0xd9, 0xdb, 0xed, 0xfb, 0xde, 0x9e, 0x6b, 0x2d, 0x7b, 0x8e, 0xe7, 0xeb,
0x4d, 0xa6, 0x7f, 0x39, 0x57, 0x3f, 0x85, 0xef, 0x96, 0x70, 0x9e, 0x14, 0x5a, 0x86, 0x13, 0x51,
0xd3, 0x53, 0xf2, 0x22, 0xd4, 0x81, 0x49, 0x9f, 0xce, 0x95, 0xa6, 0xa0, 0x6e, 0x09, 0x2b, 0x24,
0x59, 0x84, 0xa6, 0x84, 0xde, 0x2a, 0x10, 0xa1, 0x20, 0x59, 0x84, 0x96, 0x65, 0x91, 0x47, 0xb6,
0xbb, 0xab, 0x8f, 0x17, 0x88, 0x50, 0x90, 0x2c, 0x42, 0xcb, 0xe8, 0x09, 0xb4, 0xe3, 0x99, 0x7a,
0xde, 0x2e, 0xcd, 0x27, 0x7d, 0x82, 0x09, 0x9d, 0xcd, 0x8f, 0x96, 0x00, 0x76, 0x4b, 0xf8, 0x10,
0x19, 0x3d, 0x84, 0xf1, 0xa8, 0x6e, 0xc9, 0xb1, 0xfb, 0xae, 0x3e, 0x39, 0x22, 0x97, 0xa9, 0x1a,
0x43, 0x75, 0x4b, 0x58, 0xa5, 0xa1, 0x47, 0x30, 0x19, 0x55, 0x44, 0x5b, 0x43, 0x7b, 0xc4, 0x93,
0x45, 0x95, 0x92, 0xbd, 0x21, 0x4d, 0x45, 0x1f, 0x8a, 0x87, 0x9c, 0x56, 0xd9, 0xfb, 0xfa, 0x6b,
0x4c, 0x69, 0x2a, 0x5f, 0xc9, 0xde, 0x8f, 0x9f, 0x72, 0x4e, 0x41, 0x24, 0xc9, 0xae, 0x15, 0x33,
0x34, 0xf7, 0x6d, 0xf2, 0x1c, 0x93, 0x9e, 0xe7, 0x5b, 0x81, 0x8e, 0x98, 0xda, 0x5b, 0xf9, 0x6a,
0x02, 0xdf, 0x11, 0x04, 0x39, 0xbd, 0x52, 0x5a, 0xe8, 0x59, 0xf2, 0x84, 0x44, 0x4d, 0x3f, 0xb4,
0xc9, 0x73, 0xfd, 0x75, 0xd6, 0xc7, 0xc5, 0xe2, 0x3e, 0x28, 0x5a, 0x7e, 0x44, 0x64, 0x95, 0x78,
0x12, 0x7c, 0xe7, 0x52, 0x3a, 0x38, 0x39, 0x62, 0x12, 0x1c, 0x7e, 0xa8, 0x8f, 0x3c, 0x2d, 0x74,
0x0b, 0x9a, 0xbc, 0x7b, 0x7a, 0x28, 0x4c, 0x33, 0xe1, 0xef, 0x67, 0x8f, 0x9c, 0x1f, 0x09, 0x09,
0x9a, 0xa6, 0xcf, 0x5e, 0x40, 0x7c, 0xd6, 0xfc, 0x91, 0x67, 0xbb, 0xfa, 0x99, 0xcc, 0xf4, 0xd9,
0x0c, 0x88, 0x2f, 0x34, 0x28, 0x8a, 0xa6, 0x8f, 0x42, 0x53, 0x74, 0x1e, 0x91, 0xed, 0x50, 0x9f,
0x29, 0xd2, 0xa1, 0x28, 0x45, 0x87, 0x56, 0xd0, 0x1d, 0x2b, 0xae, 0xd8, 0x20, 0x0e, 0xe9, 0x85,
0xd8, 0x74, 0xfb, 0x44, 0x3f, 0x9b, 0xb9, 0x63, 0x49, 0x72, 0x12, 0x98, 0x2e, 0x47, 0x96, 0x08,
0xda, 0x04, 0x14, 0xd7, 0xd3, 0x7d, 0x81, 0x4b, 0xcf, 0x32, 0xe9, 0x73, 0xf9, 0xd2, 0x31, 0xb4,
0x5b, 0xc2, 0x19, 0x02, 0xe8, 0x2d, 0xd0, 0x86, 0xb6, 0xdb, 0xd7, 0x2d, 0x26, 0xf4, 0x7a, 0x4a,
0x68, 0xdd, 0x76, 0xfb, 0xdd, 0x12, 0x66, 0x10, 0x74, 0x1b, 0x60, 0xe8, 0x7b, 0x3d, 0x12, 0x04,
0x6b, 0xe4, 0xb9, 0x4e, 0x18, 0xc1, 0x48, 0x13, 0x38, 0xa0, 0xb3, 0xc6, 0x16, 0x5d, 0xc2, 0xa3,
0x07, 0x30, 0x2e, 0x4a, 0x9b, 0x43, 0xcb, 0x0c, 0x89, 0xbe, 0x9d, 0xb9, 0x05, 0x45, 0x02, 0x1c,
0x44, 0x63, 0xac, 0xb0, 0xe8, 0x09, 0x2c, 0x2a, 0x56, 0x3c, 0x97, 0xe8, 0xfd, 0xcc, 0x13, 0x38,
0x12, 0xa1, 0x10, 0xfa, 0x6c, 0x4a, 0x8c, 0xfb, 0x75, 0xa8, 0xed, 0x9b, 0xce, 0x1e, 0x31, 0xfe,
0x5a, 0x86, 0xba, 0x70, 0x0a, 0xc6, 0x1a, 0x68, 0x2c, 0xa3, 0x4e, 0x42, 0xcd, 0x76, 0x2d, 0xf2,
0x82, 0xb9, 0x93, 0x1a, 0xe6, 0x05, 0xf4, 0x36, 0xd4, 0x85, 0x7f, 0x10, 0x66, 0x21, 0xcf, 0xf9,
0x44, 0x30, 0xe3, 0x13, 0xa8, 0x47, 0xbb, 0xc9, 0x14, 0x34, 0x87, 0xbe, 0x47, 0x4f, 0xef, 0x55,
0x8b, 0xc9, 0x36, 0x71, 0x52, 0x81, 0xde, 0x81, 0xba, 0x25, 0x76, 0x2c, 0x2e, 0x7d, 0xaa, 0xc3,
0x2d, 0x5e, 0x27, 0xb2, 0x78, 0x9d, 0x0d, 0x66, 0xf1, 0x70, 0x84, 0x33, 0x5e, 0xbd, 0x07, 0x35,
0xb6, 0x88, 0xc6, 0x0d, 0xa8, 0x52, 0x53, 0x72, 0x0d, 0xc6, 0xd8, 0x33, 0x11, 0x59, 0xbd, 0x93,
0xa9, 0xd1, 0x31, 0x30, 0x16, 0x18, 0x3a, 0x6d, 0x3e, 0xd7, 0x37, 0x60, 0xcc, 0xf7, 0xbc, 0x30,
0x1e, 0x95, 0x28, 0x49, 0x72, 0x95, 0x62, 0x39, 0xb4, 0x98, 0x4c, 0xa0, 0xca, 0xe0, 0x85, 0x5b,
0x6e, 0x3c, 0x13, 0x74, 0x15, 0x34, 0x0a, 0x64, 0x2e, 0x68, 0x62, 0xfe, 0x54, 0x4c, 0xdc, 0x18,
0x98, 0x7e, 0xc8, 0xf3, 0xf4, 0x60, 0x48, 0x30, 0x03, 0x19, 0xcb, 0xd0, 0x92, 0x1c, 0x11, 0xd2,
0xa1, 0xce, 0x46, 0x10, 0x0f, 0x3f, 0x2a, 0x22, 0x03, 0x1a, 0x34, 0xb8, 0xeb, 0x66, 0xb8, 0xc3,
0x66, 0xd0, 0xc4, 0x71, 0xd9, 0xf8, 0x29, 0x8c, 0x09, 0x23, 0x66, 0x08, 0x07, 0x48, 0xcd, 0x4a,
0x99, 0xa3, 0xa2, 0xb2, 0xb1, 0x08, 0x8d, 0x68, 0x8b, 0x32, 0x3a, 0xa0, 0xb1, 0x6d, 0x6a, 0x02,
0x2a, 0x76, 0xd4, 0x55, 0xc5, 0xb6, 0x68, 0xf4, 0x68, 0x7b, 0x6c, 0x95, 0x45, 0xc9, 0x78, 0x06,
0xcd, 0xd8, 0x74, 0xa1, 0x27, 0x70, 0x42, 0x98, 0x2e, 0xfe, 0xb4, 0xd2, 0x8e, 0x26, 0xe6, 0xaf,
0x66, 0x05, 0xb4, 0xb3, 0x4c, 0xad, 0xb6, 0xcb, 0x3d, 0x00, 0xf3, 0x6d, 0x1d, 0x36, 0x79, 0x45,
0xc0, 0xf8, 0x85, 0x01, 0xd5, 0x0d, 0x12, 0x1a, 0x8f, 0x92, 0xfc, 0x4a, 0x0f, 0xec, 0x2b, 0x64,
0xd4, 0x1f, 0xaa, 0xd2, 0x84, 0xbf, 0x2c, 0x43, 0x3d, 0x3a, 0x60, 0x8e, 0x38, 0x69, 0xda, 0xe7,
0x1e, 0x7b, 0x3c, 0x2d, 0x91, 0x04, 0xf9, 0x7d, 0x0a, 0x1c, 0xba, 0x01, 0x0d, 0xdb, 0x0d, 0x88,
0x4f, 0x39, 0xda, 0x68, 0x4e, 0x0c, 0x44, 0x17, 0x61, 0x82, 0xff, 0x5e, 0xf7, 0x02, 0x9b, 0x1a,
0x39, 0x66, 0x7e, 0xc7, 0x71, 0xaa, 0x96, 0x26, 0x87, 0x4f, 0x06, 0xde, 0x3e, 0xb1, 0xf4, 0x31,
0xb6, 0xb6, 0x51, 0x91, 0x3e, 0xe0, 0xa1, 0x17, 0x9a, 0x0e, 0x33, 0xa8, 0xe3, 0x98, 0x17, 0x8c,
0xdf, 0x97, 0x8f, 0xb7, 0xca, 0xe8, 0x2e, 0x68, 0xf4, 0x97, 0x78, 0x01, 0xb8, 0x32, 0x72, 0x41,
0x95, 0x93, 0x10, 0x33, 0x1e, 0xd5, 0xf5, 0xb6, 0xb7, 0x03, 0x12, 0xb2, 0xdc, 0x1f, 0xc7, 0xa2,
0x44, 0x87, 0xe7, 0xd8, 0x03, 0x3b, 0x14, 0xf3, 0xe2, 0x05, 0x63, 0x15, 0xc6, 0x84, 0xdb, 0x4e,
0x8f, 0x6f, 0x0e, 0xc6, 0xb6, 0xb9, 0x81, 0x2f, 0x58, 0x6b, 0x01, 0x33, 0xee, 0x41, 0x4b, 0xf6,
0xd8, 0x69, 0xbd, 0x19, 0x68, 0xf5, 0x24, 0x17, 0xcf, 0x1f, 0x1f, 0xb9, 0xca, 0x20, 0x70, 0x42,
0x31, 0xd2, 0x69, 0x85, 0x07, 0x70, 0xc2, 0x97, 0xdd, 0x7a, 0x25, 0xe5, 0x0f, 0xe5, 0x08, 0xc9,
0x42, 0x58, 0xa1, 0x19, 0x1f, 0xc3, 0x64, 0xda, 0x4c, 0xa7, 0x7b, 0xba, 0x0c, 0x93, 0x5b, 0x29,
0xeb, 0xce, 0x17, 0x29, 0x5d, 0x6d, 0xac, 0x42, 0x8d, 0xfb, 0xc4, 0xb4, 0xc4, 0xdb, 0x50, 0x33,
0x99, 0xef, 0xac, 0xb0, 0x1d, 0xc8, 0xc8, 0x1c, 0x25, 0xa3, 0x62, 0x0e, 0x34, 0xfe, 0xac, 0x81,
0xc6, 0x5c, 0x79, 0x5a, 0xea, 0x7d, 0xd0, 0xe8, 0x9b, 0xb2, 0x98, 0xef, 0xec, 0x48, 0x8b, 0xcf,
0x0f, 0x65, 0x86, 0x47, 0xb7, 0xa0, 0x16, 0x84, 0x07, 0x4e, 0xf4, 0x2e, 0x79, 0x6e, 0x34, 0x71,
0x83, 0x42, 0x31, 0x67, 0x50, 0x2a, 0xdb, 0x1c, 0xc4, 0x5b, 0x64, 0x01, 0x95, 0xed, 0x4a, 0x98,
0x33, 0xd0, 0x3d, 0xa8, 0xf7, 0x76, 0x48, 0x6f, 0x97, 0x58, 0xe2, 0xf5, 0xf1, 0xc2, 0x68, 0xf2,
0x32, 0x07, 0xe3, 0x88, 0x45, 0xfb, 0xee, 0xb1, 0x90, 0x8f, 0x1d, 0xa5, 0x6f, 0xb6, 0x0c, 0x98,
0x33, 0x8c, 0x29, 0x11, 0xc1, 0x93, 0xe2, 0x20, 0x16, 0x41, 0x14, 0xa7, 0xf2, 0x43, 0xa8, 0xb1,
0x49, 0xa2, 0x3b, 0x72, 0xf3, 0xc4, 0xfc, 0xa5, 0xe2, 0x4d, 0x53, 0x04, 0x27, 0xd6, 0x61, 0x33,
0x56, 0x75, 0x5a, 0x47, 0xd1, 0x11, 0x91, 0xe2, 0x3a, 0x67, 0xa0, 0x2e, 0x26, 0xaf, 0x0e, 0xb8,
0x11, 0x01, 0x4e, 0x43, 0x8d, 0xe7, 0x67, 0xf6, 0x7c, 0x3e, 0x2b, 0x43, 0x95, 0xbe, 0x12, 0xa4,
0xf3, 0xe5, 0x66, 0xb4, 0xee, 0x45, 0x09, 0xb3, 0x62, 0xef, 0x2b, 0xcb, 0x6e, 0x3c, 0x88, 0x22,
0x74, 0x5b, 0x8d, 0xd0, 0xc5, 0xd1, 0xbb, 0x50, 0x22, 0xc3, 0x07, 0xf6, 0xab, 0x1a, 0x68, 0xec,
0xd5, 0x30, 0x2b, 0x93, 0xe9, 0xa9, 0x5c, 0x34, 0x30, 0x4a, 0xee, 0x24, 0x07, 0x34, 0xcf, 0x64,
0x33, 0x2c, 0xce, 0x64, 0x46, 0xdc, 0xa0, 0x50, 0xcc, 0x19, 0xb4, 0xcb, 0x81, 0x3d, 0x20, 0x22,
0x91, 0x0b, 0xba, 0x7c, 0x6c, 0x0f, 0x08, 0x66, 0x78, 0xca, 0xdb, 0x31, 0x83, 0x1d, 0x91, 0xc3,
0x05, 0xbc, 0xae, 0x19, 0xec, 0x60, 0x86, 0xa7, 0x3c, 0xd7, 0x1c, 0x10, 0x91, 0xbc, 0x05, 0xbc,
0x35, 0x93, 0xf6, 0x47, 0xf1, 0x94, 0x17, 0xd8, 0x9f, 0x12, 0xf1, 0x75, 0xa3, 0x80, 0xb7, 0x61,
0x7f, 0x4a, 0x30, 0xc3, 0xd3, 0x94, 0xa7, 0x2a, 0x39, 0x29, 0x72, 0x1a, 0x6a, 0x3f, 0xb2, 0xad,
0x70, 0x47, 0x6d, 0xae, 0x29, 0x4f, 0x04, 0x8d, 0xd2, 0xb1, 0x9e, 0x08, 0x39, 0xc8, 0x5c, 0x67,
0x05, 0x34, 0xba, 0x5a, 0xc7, 0x4b, 0x9b, 0x64, 0x91, 0x85, 0xca, 0x14, 0x68, 0x34, 0x90, 0x39,
0x53, 0x99, 0x02, 0x8d, 0x2e, 0x4f, 0x7e, 0x2b, 0x0d, 0x8a, 0xda, 0x5a, 0x8d, 0x5a, 0x7f, 0x5e,
0x05, 0x8d, 0x7d, 0x66, 0x48, 0x27, 0xe4, 0x0f, 0x60, 0x3c, 0x34, 0xfd, 0x3e, 0xe1, 0x96, 0x70,
0x35, 0xfa, 0x62, 0x77, 0x75, 0xe4, 0xc7, 0x8b, 0xce, 0x53, 0x99, 0x82, 0x55, 0x85, 0xa3, 0xef,
0xba, 0x4c, 0x4a, 0xd9, 0x75, 0x6f, 0xc7, 0x47, 0xae, 0x56, 0xf0, 0x8d, 0x8b, 0x71, 0xf9, 0xc1,
0x1d, 0x9f, 0xbf, 0x17, 0x60, 0x5c, 0x19, 0xd8, 0xd7, 0xba, 0x0b, 0xca, 0x83, 0xe5, 0x3a, 0x0b,
0xb1, 0x73, 0xb8, 0xae, 0x6e, 0x83, 0xb9, 0x46, 0x41, 0x10, 0xff, 0x58, 0x83, 0x46, 0xfc, 0x99,
0x26, 0xbd, 0x20, 0x0b, 0x50, 0xdd, 0xf3, 0x1d, 0xb1, 0x0c, 0x17, 0x0a, 0x3f, 0xfd, 0x74, 0x36,
0x7d, 0x07, 0x53, 0x06, 0x9d, 0x4d, 0x68, 0x87, 0x71, 0xd8, 0x2f, 0x15, 0x53, 0x9f, 0x52, 0x38,
0xe6, 0x2c, 0xf4, 0x04, 0x5a, 0x16, 0x09, 0x7a, 0xbe, 0x3d, 0x64, 0xde, 0x8f, 0xc7, 0xff, 0x7a,
0xb1, 0xc8, 0x4a, 0x42, 0xc2, 0xb2, 0x02, 0x5a, 0x85, 0xa6, 0x3d, 0x30, 0xfb, 0xa4, 0x9b, 0x6c,
0x22, 0x57, 0x8b, 0xe5, 0x56, 0x23, 0x0a, 0x4e, 0xd8, 0x74, 0x6c, 0xdb, 0xe6, 0xbe, 0xdd, 0xf3,
0x5c, 0x26, 0x36, 0x76, 0xd4, 0xb1, 0x3d, 0x4c, 0x48, 0x58, 0x56, 0x40, 0x8b, 0x62, 0x1b, 0xae,
0x17, 0x7c, 0xcc, 0x49, 0x42, 0x95, 0xbc, 0x2b, 0xbd, 0x09, 0xd5, 0x4d, 0xdf, 0xc9, 0xdf, 0x6e,
0x58, 0x54, 0x73, 0x9a, 0xcf, 0x41, 0x4b, 0x8a, 0x57, 0x0e, 0xe8, 0x2c, 0x34, 0xe3, 0x28, 0xe4,
0xeb, 0x48, 0x73, 0xcb, 0x01, 0xdd, 0x11, 0x7b, 0xd2, 0x7b, 0x6a, 0x9a, 0x9f, 0x49, 0xa5, 0x39,
0x4d, 0xec, 0x75, 0x9f, 0x30, 0x17, 0x2d, 0x6f, 0x46, 0x5f, 0x9c, 0x62, 0x67, 0x98, 0xf3, 0x35,
0xbf, 0x0f, 0x3d, 0x85, 0x49, 0x6a, 0xda, 0xb7, 0xcc, 0x80, 0xe4, 0xbd, 0x09, 0xbd, 0x43, 0xdf,
0x30, 0xf8, 0x17, 0xbd, 0x4a, 0xc1, 0x1b, 0x8f, 0xc0, 0x7d, 0xe7, 0xe2, 0xff, 0x77, 0x5c, 0xfc,
0x5f, 0xf2, 0x5c, 0xfc, 0x82, 0xe2, 0xe2, 0xcf, 0xe5, 0xdd, 0xcb, 0x38, 0x87, 0x6c, 0xfc, 0xa2,
0x7a, 0xa0, 0x9c, 0x2f, 0x60, 0x2a, 0x27, 0xca, 0xa2, 0xea, 0xe3, 0x8b, 0xb8, 0x8a, 0x91, 0xff,
0x30, 0x6d, 0xe4, 0x2f, 0x16, 0xb0, 0x0f, 0x39, 0xf9, 0x45, 0xd5, 0xc9, 0x17, 0xf5, 0xfe, 0x2d,
0xb6, 0xf2, 0xbf, 0xcd, 0xb1, 0xf2, 0xb7, 0x54, 0x2b, 0x3f, 0x22, 0x6b, 0xbe, 0x29, 0x2f, 0xff,
0x9b, 0x3c, 0x2f, 0xbf, 0xa0, 0x78, 0xf9, 0x11, 0x23, 0x4b, 0x9b, 0xf9, 0x45, 0xd5, 0xcc, 0x9f,
0x2f, 0x60, 0x2a, 0x6e, 0x7e, 0x41, 0x71, 0xf3, 0x45, 0x9d, 0x4a, 0x76, 0x7e, 0x41, 0xb1, 0xf3,
0x45, 0x44, 0xc9, 0xcf, 0x2f, 0x28, 0x7e, 0xbe, 0x88, 0x28, 0x19, 0xfa, 0x05, 0xc5, 0xd0, 0x17,
0x11, 0xbf, 0x73, 0xf4, 0xc7, 0x73, 0xf4, 0xbf, 0xcc, 0x73, 0xf4, 0x38, 0xdb, 0xd1, 0x5f, 0xcb,
0x8f, 0x7f, 0xb1, 0xa5, 0x3f, 0xfa, 0x0e, 0x7c, 0xd8, 0xd3, 0xdf, 0x49, 0x79, 0xfa, 0x0b, 0x05,
0xe4, 0xff, 0x53, 0x53, 0xff, 0xa7, 0x51, 0xa6, 0xfe, 0xa6, 0x6c, 0xea, 0x47, 0x9c, 0x22, 0x87,
0x5d, 0xfd, 0x5d, 0xd5, 0xd5, 0x5f, 0x3e, 0x02, 0x57, 0xb1, 0xf5, 0xeb, 0x59, 0xb6, 0xbe, 0x73,
0x04, 0x95, 0x5c, 0x5f, 0xff, 0xd1, 0x61, 0x5f, 0x7f, 0xed, 0x08, 0x7a, 0x99, 0xc6, 0x7e, 0x3d,
0xcb, 0xd8, 0x1f, 0x65, 0x74, 0xb9, 0xce, 0xfe, 0x03, 0xc5, 0xd9, 0x5f, 0x3a, 0x4a, 0xb8, 0xbe,
0x7d, 0xd6, 0xfe, 0xcb, 0x0a, 0x68, 0x9b, 0x01, 0xf1, 0x8d, 0xff, 0x54, 0xa2, 0xeb, 0xae, 0x9b,
0xa0, 0xb1, 0xeb, 0x5a, 0xe9, 0x3a, 0xae, 0x9c, 0xba, 0x8e, 0x53, 0xfe, 0xff, 0x93, 0x5c, 0xc7,
0xdd, 0x04, 0x8d, 0x5d, 0xd0, 0x1e, 0x9f, 0xf9, 0xb3, 0x32, 0x34, 0x93, 0xcb, 0xd2, 0x63, 0xf3,
0xe5, 0x6b, 0xaa, 0x8a, 0x7a, 0x4d, 0x75, 0x05, 0x6a, 0x3e, 0xbb, 0x14, 0xe2, 0x4f, 0x4d, 0xfa,
0x96, 0x8d, 0x75, 0x88, 0x39, 0xc4, 0x20, 0xd0, 0x92, 0xaf, 0x82, 0x8f, 0x3f, 0x8c, 0xf3, 0xe2,
0x8f, 0x16, 0xab, 0x56, 0xb0, 0xe4, 0xfb, 0xe6, 0x81, 0x78, 0x27, 0x50, 0x2b, 0xe9, 0x6e, 0xbe,
0x6e, 0xbb, 0xfd, 0xec, 0x5b, 0x50, 0xe3, 0x6f, 0x65, 0xa8, 0x8b, 0x8b, 0x55, 0x63, 0x01, 0xaa,
0x6b, 0xe4, 0x39, 0x1d, 0x88, 0xb8, 0x5a, 0x3d, 0x34, 0x90, 0xc7, 0x6c, 0x16, 0x02, 0x8f, 0x23,
0x98, 0xb1, 0x08, 0x63, 0xe2, 0x22, 0xf7, 0xf8, 0xdc, 0x9b, 0xa0, 0xad, 0x78, 0xee, 0x57, 0x60,
0xce, 0x9a, 0x30, 0x8e, 0x49, 0x30, 0xf4, 0xdc, 0x80, 0x7c, 0x43, 0xff, 0x8f, 0x9b, 0xfd, 0x57,
0x05, 0x6a, 0xac, 0x77, 0xe3, 0x9f, 0x95, 0x38, 0x4e, 0x19, 0x6f, 0x7a, 0x89, 0x1f, 0x9b, 0x90,
0xae, 0xad, 0x95, 0x71, 0xcb, 0x3e, 0x6c, 0x5e, 0xf6, 0x61, 0x13, 0xd2, 0xbf, 0x50, 0x54, 0x86,
0xe2, 0xbf, 0x3e, 0x80, 0xc6, 0xd0, 0xf7, 0xfa, 0x3e, 0x0d, 0x90, 0x96, 0xfa, 0x5f, 0x97, 0x4a,
0x5b, 0x17, 0x30, 0x1c, 0x13, 0x8c, 0x77, 0xa1, 0x11, 0xd5, 0x26, 0x97, 0x65, 0xe2, 0x54, 0x67,
0x05, 0x84, 0x40, 0xb3, 0x3c, 0x97, 0xcf, 0xa1, 0x8a, 0xd9, 0xef, 0xd9, 0xef, 0x89, 0x87, 0x7d,
0x1c, 0x9a, 0x2b, 0xbe, 0x37, 0x64, 0x17, 0xb5, 0xed, 0xd2, 0xec, 0x52, 0x64, 0x74, 0x1a, 0xa0,
0xad, 0x79, 0x2e, 0x69, 0x97, 0x50, 0x0b, 0xea, 0x78, 0xcf, 0x75, 0x6d, 0xb7, 0xdf, 0x2e, 0xd3,
0x6a, 0xba, 0xa2, 0xed, 0x0a, 0x3a, 0x01, 0x8d, 0x65, 0xd3, 0xed, 0x11, 0x87, 0x58, 0xed, 0x2a,
0x6a, 0x42, 0xed, 0x81, 0xef, 0x7b, 0x7e, 0x5b, 0xbb, 0xf2, 0x0c, 0x26, 0xd4, 0xeb, 0x60, 0x4a,
0x5a, 0x37, 0xfb, 0x54, 0xab, 0x01, 0x5a, 0xd7, 0x1b, 0x90, 0x76, 0x19, 0x4d, 0x42, 0x6b, 0x9d,
0xdf, 0xa9, 0xb3, 0xa6, 0x0a, 0xed, 0x66, 0xc9, 0xef, 0xed, 0xd8, 0xfb, 0xa4, 0x5d, 0xa5, 0xad,
0xf7, 0x7d, 0x62, 0x5a, 0x3d, 0x7f, 0x6f, 0xb0, 0x15, 0xb4, 0x35, 0x54, 0x67, 0xb7, 0xa8, 0xed,
0xda, 0xfd, 0xa9, 0xbf, 0xbf, 0x9c, 0x2e, 0x7f, 0xfe, 0x72, 0xba, 0xfc, 0xef, 0x97, 0xd3, 0xe5,
0x5f, 0xbf, 0x9a, 0x2e, 0x7d, 0xfe, 0x6a, 0xba, 0xf4, 0xc5, 0xab, 0xe9, 0xd2, 0x27, 0x95, 0xe1,
0xd6, 0xd6, 0x18, 0x3b, 0x47, 0x6f, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x95, 0x8f, 0x1a, 0x02,
0xe4, 0x29, 0x00, 0x00,
// 2644 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0xdc, 0xc6,
0xf9, 0xde, 0x0f, 0xee, 0xd7, 0xbb, 0x96, 0xb4, 0x99, 0x18, 0x36, 0x7f, 0xb4, 0x2c, 0xcb, 0xf2,
0x67, 0xfc, 0xb1, 0x4a, 0xe4, 0x5f, 0x22, 0x5b, 0xf1, 0x47, 0x64, 0xc9, 0xc6, 0x6e, 0x62, 0xcb,
0xea, 0xc8, 0x6a, 0x8b, 0xd4, 0x87, 0x52, 0xcb, 0xd1, 0x8a, 0xd0, 0x2e, 0xb9, 0x20, 0x29, 0xd9,
0xca, 0xb5, 0xb7, 0xa2, 0x2d, 0x7a, 0x28, 0x52, 0x14, 0x68, 0x4f, 0x3d, 0xf5, 0xd2, 0x4b, 0x51,
0xa0, 0x7f, 0x42, 0x7b, 0xcb, 0x31, 0xc7, 0xc2, 0xbe, 0xf4, 0x9a, 0x73, 0x2f, 0xc5, 0x7c, 0x90,
0x9c, 0xa1, 0xc8, 0xa5, 0x14, 0x24, 0x40, 0x8b, 0xe4, 0xb6, 0x33, 0xf3, 0x3c, 0xcf, 0xcc, 0xbc,
0xf3, 0x72, 0xe6, 0x21, 0x67, 0xe1, 0xd4, 0x68, 0x6b, 0x7e, 0xe4, 0xb9, 0x81, 0xeb, 0xcf, 0x93,
0x7d, 0xe2, 0x04, 0x7e, 0x9b, 0x95, 0x50, 0xcd, 0x74, 0x0e, 0x82, 0x83, 0x11, 0x31, 0x3e, 0xd9,
0x27, 0x8e, 0xe5, 0x7a, 0xf3, 0x7d, 0x3b, 0xd8, 0xd9, 0xdb, 0x6a, 0xf7, 0xdc, 0xe1, 0xbc, 0x68,
0xb2, 0xdd, 0xf9, 0xbe, 0x7b, 0x53, 0x14, 0x6e, 0x0e, 0xec, 0x2d, 0xcf, 0xf4, 0x0e, 0xe6, 0x47,
0x5b, 0xf3, 0x43, 0xd7, 0x22, 0x83, 0x50, 0x95, 0x15, 0x84, 0xaa, 0x31, 0xdd, 0x77, 0xdd, 0xfe,
0x80, 0xf0, 0xb6, 0xad, 0xbd, 0xed, 0x79, 0x3f, 0xf0, 0xf6, 0x7a, 0x01, 0x6f, 0x9d, 0xfb, 0x7c,
0x0d, 0x2a, 0x8f, 0xe8, 0x20, 0xd0, 0x02, 0xd4, 0x87, 0xc4, 0xf7, 0xcd, 0x3e, 0xf1, 0xf5, 0xe2,
0x6c, 0xf9, 0x6a, 0x73, 0xe1, 0x54, 0x5b, 0x74, 0xd4, 0x66, 0x88, 0xf6, 0x53, 0xde, 0x8c, 0x23,
0x1c, 0x9a, 0x86, 0x46, 0xcf, 0x75, 0x02, 0xf2, 0x2a, 0xe8, 0x5a, 0x7a, 0x69, 0xb6, 0x78, 0xb5,
0x81, 0xe3, 0x0a, 0xf4, 0xff, 0xd0, 0xb0, 0x1d, 0x3b, 0xb0, 0xcd, 0xc0, 0xf5, 0xf4, 0xf2, 0x6c,
0x51, 0x91, 0x64, 0x63, 0x6c, 0x2f, 0xf7, 0x7a, 0xee, 0x9e, 0x13, 0xe0, 0x18, 0x68, 0xfc, 0xee,
0x2d, 0xa8, 0x89, 0x9e, 0xd0, 0x03, 0x68, 0x9a, 0x1c, 0xb1, 0xb1, 0xe3, 0xbe, 0xd4, 0x8b, 0x4c,
0xe3, 0x4c, 0x62, 0x58, 0x42, 0xa3, 0x4d, 0x21, 0x9d, 0x02, 0x96, 0x19, 0xa8, 0x0b, 0x93, 0xa2,
0xb8, 0x4a, 0x02, 0xd3, 0x1e, 0xf8, 0xfa, 0x3f, 0xb8, 0xc8, 0x4c, 0x86, 0x88, 0x80, 0x75, 0x0a,
0x38, 0x41, 0x44, 0x1f, 0x40, 0x7d, 0x6b, 0xe0, 0xf6, 0x76, 0x97, 0x2d, 0x3e, 0xd5, 0xe6, 0x82,
0x9e, 0xd0, 0x78, 0x48, 0x9b, 0xdb, 0xcb, 0x96, 0xd5, 0x29, 0xe0, 0x08, 0x4b, 0xe7, 0xc0, 0x7e,
0xaf, 0x92, 0x01, 0x09, 0x88, 0x88, 0xc3, 0x99, 0x54, 0x2a, 0x87, 0xd0, 0x39, 0x48, 0x0c, 0xb4,
0x0a, 0xcd, 0x6d, 0x7b, 0x40, 0xfc, 0xcd, 0xd1, 0xc0, 0x35, 0x2d, 0x5d, 0x63, 0x02, 0xb3, 0xa9,
0x02, 0x8f, 0x63, 0x1c, 0x55, 0x91, 0x68, 0xe8, 0x3e, 0x34, 0x86, 0xa6, 0xb7, 0xeb, 0x77, 0x9d,
0x6d, 0x57, 0xaf, 0xa4, 0xc6, 0x80, 0x6b, 0x3c, 0x0d, 0x51, 0x9d, 0x02, 0x8e, 0x29, 0x34, 0x92,
0x6c, 0x50, 0x1b, 0x24, 0x78, 0x6c, 0x93, 0x81, 0xe5, 0xeb, 0x55, 0x26, 0x72, 0x2e, 0x55, 0x64,
0x83, 0x04, 0x6d, 0x0e, 0xa3, 0x91, 0x54, 0x89, 0xe8, 0xc7, 0xf0, 0x76, 0x58, 0xb3, 0xb2, 0x63,
0x0f, 0x2c, 0x8f, 0x38, 0x5d, 0xcb, 0xd7, 0x6b, 0x4c, 0xef, 0x62, 0xa6, 0x9e, 0x84, 0xed, 0x14,
0x70, 0x9a, 0x04, 0xfa, 0x09, 0x9c, 0x0c, 0xab, 0x31, 0xf1, 0x03, 0xcf, 0xee, 0x05, 0xb6, 0xeb,
0xf8, 0x7a, 0x9d, 0x49, 0x5f, 0xca, 0x94, 0x96, 0xc1, 0x9d, 0x02, 0x4e, 0x15, 0x41, 0x16, 0x9c,
0x0e, 0xeb, 0x1f, 0x9a, 0xbd, 0xdd, 0xbe, 0xe7, 0xee, 0x39, 0xd6, 0x8a, 0x3b, 0x70, 0x3d, 0xbd,
0xc1, 0xf4, 0xaf, 0x66, 0xea, 0x27, 0xf0, 0x9d, 0x02, 0xce, 0x92, 0x42, 0x2b, 0x70, 0x22, 0x6c,
0x7a, 0x4e, 0x5e, 0x05, 0x3a, 0x30, 0xe9, 0xb3, 0x99, 0xd2, 0x14, 0xd4, 0x29, 0x60, 0x85, 0x24,
0x8b, 0xd0, 0x94, 0xd0, 0x9b, 0x39, 0x22, 0x14, 0x24, 0x8b, 0xd0, 0xb2, 0x2c, 0xf2, 0xc4, 0x76,
0x76, 0xf5, 0x89, 0x1c, 0x11, 0x0a, 0x92, 0x45, 0x68, 0x19, 0x3d, 0x83, 0x56, 0x34, 0x53, 0xd7,
0xdd, 0xa5, 0xf9, 0xa4, 0x4f, 0x32, 0xa1, 0xf3, 0xd9, 0xd1, 0x12, 0xc0, 0x4e, 0x01, 0x1f, 0x22,
0xa3, 0xc7, 0x30, 0x11, 0xd6, 0x2d, 0x0f, 0xec, 0xbe, 0xa3, 0x4f, 0x8d, 0xc9, 0x65, 0xaa, 0xc6,
0x50, 0x9d, 0x02, 0x56, 0x69, 0xe8, 0x09, 0x4c, 0x85, 0x15, 0xe1, 0xd6, 0xd0, 0x1a, 0xf3, 0x64,
0x51, 0xa5, 0x78, 0x6f, 0x48, 0x52, 0xd1, 0x47, 0xe2, 0x21, 0xa7, 0x55, 0xf6, 0xbe, 0xfe, 0x16,
0x53, 0x9a, 0xce, 0x56, 0xb2, 0xf7, 0xa3, 0xa7, 0x9c, 0x53, 0x10, 0x89, 0xb3, 0x6b, 0xd5, 0x0c,
0xcc, 0x7d, 0x9b, 0xbc, 0xc4, 0xa4, 0xe7, 0x7a, 0x96, 0xaf, 0x23, 0xa6, 0xf6, 0x4e, 0xb6, 0x9a,
0xc0, 0xb7, 0x05, 0x41, 0x4e, 0xaf, 0x84, 0x16, 0x7a, 0x11, 0x3f, 0x21, 0x61, 0xd3, 0x0f, 0x6d,
0xf2, 0x52, 0x7f, 0x9b, 0xf5, 0x71, 0x39, 0xbf, 0x0f, 0x8a, 0x96, 0x1f, 0x11, 0x59, 0x25, 0x9a,
0x04, 0xdf, 0xb9, 0x94, 0x0e, 0x4e, 0x8e, 0x99, 0x04, 0x87, 0x1f, 0xea, 0x23, 0x4b, 0x0b, 0xdd,
0x81, 0x06, 0xef, 0x9e, 0x1e, 0x0a, 0x33, 0x4c, 0xf8, 0xff, 0xd2, 0x47, 0xce, 0x8f, 0x84, 0x18,
0x4d, 0xd3, 0x67, 0xcf, 0x27, 0x1e, 0x6b, 0xfe, 0xd8, 0xb5, 0x1d, 0xfd, 0x5c, 0x6a, 0xfa, 0x6c,
0xfa, 0xc4, 0x13, 0x1a, 0x14, 0x45, 0xd3, 0x47, 0xa1, 0x29, 0x3a, 0x4f, 0xc8, 0x76, 0xa0, 0xcf,
0xe6, 0xe9, 0x50, 0x94, 0xa2, 0x43, 0x2b, 0xe8, 0x8e, 0x15, 0x55, 0x6c, 0x90, 0x01, 0xe9, 0x05,
0xd8, 0x74, 0xfa, 0x44, 0x3f, 0x9f, 0xba, 0x63, 0x49, 0x72, 0x12, 0x98, 0x2e, 0x47, 0x9a, 0x08,
0xda, 0x04, 0x14, 0xd5, 0xd3, 0x7d, 0x81, 0x4b, 0xcf, 0x31, 0xe9, 0x0b, 0xd9, 0xd2, 0x11, 0xb4,
0x53, 0xc0, 0x29, 0x02, 0xe8, 0x1d, 0xd0, 0x46, 0xb6, 0xd3, 0xd7, 0x2d, 0x26, 0xf4, 0x76, 0x42,
0x68, 0xdd, 0x76, 0xfa, 0x9d, 0x02, 0x66, 0x10, 0x74, 0x17, 0x60, 0xe4, 0xb9, 0x3d, 0xe2, 0xfb,
0x6b, 0xe4, 0xa5, 0x4e, 0x18, 0xc1, 0x48, 0x12, 0x38, 0xa0, 0xbd, 0xc6, 0x16, 0x5d, 0xc2, 0xa3,
0x47, 0x30, 0x21, 0x4a, 0x9b, 0x23, 0xcb, 0x0c, 0x88, 0xbe, 0x9d, 0xba, 0x05, 0x85, 0x02, 0x1c,
0x44, 0x63, 0xac, 0xb0, 0xe8, 0x09, 0x2c, 0x2a, 0x56, 0x5d, 0x87, 0xe8, 0xfd, 0xd4, 0x13, 0x38,
0x14, 0xa1, 0x10, 0xfa, 0x6c, 0x4a, 0x8c, 0x87, 0x35, 0xa8, 0xec, 0x9b, 0x83, 0x3d, 0x62, 0xfc,
0xb5, 0x08, 0x35, 0xe1, 0x14, 0x8c, 0x35, 0xd0, 0x58, 0x46, 0x9d, 0x84, 0x8a, 0xed, 0x58, 0xe4,
0x15, 0x73, 0x27, 0x15, 0xcc, 0x0b, 0xe8, 0x5d, 0xa8, 0x09, 0xff, 0x20, 0xcc, 0x42, 0x96, 0xf3,
0x09, 0x61, 0xc6, 0xa7, 0x50, 0x0b, 0x77, 0x93, 0x69, 0x68, 0x8c, 0x3c, 0x97, 0x9e, 0xde, 0x5d,
0x8b, 0xc9, 0x36, 0x70, 0x5c, 0x81, 0xde, 0x83, 0x9a, 0x25, 0x76, 0x2c, 0x2e, 0x7d, 0xba, 0xcd,
0x2d, 0x5e, 0x3b, 0xb4, 0x78, 0xed, 0x0d, 0x66, 0xf1, 0x70, 0x88, 0x33, 0xde, 0xbc, 0x0f, 0x15,
0xb6, 0x88, 0xc6, 0x2d, 0x28, 0x53, 0x53, 0x72, 0x03, 0xaa, 0xec, 0x99, 0x08, 0xad, 0xde, 0xc9,
0xc4, 0xe8, 0x18, 0x18, 0x0b, 0x0c, 0x9d, 0x36, 0x9f, 0xeb, 0x29, 0xa8, 0x7a, 0xae, 0x1b, 0x44,
0xa3, 0x12, 0x25, 0x49, 0xae, 0x94, 0x2f, 0x87, 0x96, 0xe2, 0x09, 0x94, 0x19, 0x3c, 0x77, 0xcb,
0x8d, 0x66, 0x82, 0xae, 0x83, 0x46, 0x81, 0xcc, 0x05, 0x4d, 0x2e, 0x9c, 0x8e, 0x88, 0x1b, 0x43,
0xd3, 0x0b, 0x78, 0x9e, 0x1e, 0x8c, 0x08, 0x66, 0x20, 0x63, 0x05, 0x9a, 0x92, 0x23, 0x42, 0x3a,
0xd4, 0xd8, 0x08, 0xa2, 0xe1, 0x87, 0x45, 0x64, 0x40, 0x9d, 0x06, 0x77, 0xdd, 0x0c, 0x76, 0xd8,
0x0c, 0x1a, 0x38, 0x2a, 0x1b, 0x3f, 0x85, 0xaa, 0x30, 0x62, 0x86, 0x70, 0x80, 0xd4, 0xac, 0x14,
0x39, 0x2a, 0x2c, 0x1b, 0x4b, 0x50, 0x0f, 0xb7, 0x28, 0xa3, 0x0d, 0x1a, 0xdb, 0xa6, 0x26, 0xa1,
0x64, 0x87, 0x5d, 0x95, 0x6c, 0x8b, 0x46, 0x8f, 0xb6, 0x47, 0x56, 0x59, 0x94, 0x8c, 0x17, 0xd0,
0x88, 0x4c, 0x17, 0x7a, 0x06, 0x27, 0x84, 0xe9, 0xe2, 0x4f, 0x2b, 0xed, 0x68, 0x72, 0xe1, 0x7a,
0x5a, 0x40, 0xdb, 0x2b, 0xd4, 0x6a, 0x3b, 0xdc, 0x03, 0x30, 0xdf, 0xd6, 0x66, 0x93, 0x57, 0x04,
0x8c, 0x5f, 0x18, 0x50, 0xde, 0x20, 0x81, 0xf1, 0x24, 0xce, 0xaf, 0xe4, 0xc0, 0xbe, 0x46, 0x46,
0xfd, 0xa1, 0x2c, 0x4d, 0xf8, 0xab, 0x22, 0xd4, 0xc2, 0x03, 0xe6, 0x88, 0x93, 0xa6, 0x7d, 0xee,
0xb1, 0xc7, 0xd3, 0x12, 0x49, 0x90, 0xdd, 0xa7, 0xc0, 0xa1, 0x5b, 0x50, 0xb7, 0x1d, 0x9f, 0x78,
0x94, 0xa3, 0x8d, 0xe7, 0x44, 0x40, 0x74, 0x19, 0x26, 0xf9, 0xef, 0x75, 0xd7, 0xb7, 0xa9, 0x91,
0x63, 0xe6, 0x77, 0x02, 0x27, 0x6a, 0x69, 0x72, 0x78, 0x64, 0xe8, 0xee, 0x13, 0x4b, 0xaf, 0xb2,
0xb5, 0x0d, 0x8b, 0xf4, 0x01, 0x0f, 0xdc, 0xc0, 0x1c, 0x30, 0x83, 0x3a, 0x81, 0x79, 0xc1, 0xf8,
0x7d, 0xf1, 0x78, 0xab, 0x8c, 0xee, 0x83, 0x46, 0x7f, 0x89, 0x17, 0x80, 0x6b, 0x63, 0x17, 0x54,
0x39, 0x09, 0x31, 0xe3, 0x51, 0x5d, 0x77, 0x7b, 0xdb, 0x27, 0x01, 0xcb, 0xfd, 0x09, 0x2c, 0x4a,
0x74, 0x78, 0x03, 0x7b, 0x68, 0x07, 0x62, 0x5e, 0xbc, 0x60, 0x74, 0xa1, 0x2a, 0xdc, 0x76, 0x72,
0x7c, 0xf3, 0x50, 0xdd, 0xe6, 0x06, 0x3e, 0x67, 0xad, 0x05, 0xcc, 0x78, 0x00, 0x4d, 0xd9, 0x63,
0x27, 0xf5, 0x66, 0xa1, 0xd9, 0x93, 0x5c, 0x3c, 0x7f, 0x7c, 0xe4, 0x2a, 0x83, 0xc0, 0x09, 0xc5,
0x48, 0x27, 0x15, 0x1e, 0xc1, 0x09, 0x4f, 0x76, 0xeb, 0xa5, 0x84, 0x3f, 0x94, 0x23, 0x24, 0x0b,
0x61, 0x85, 0x66, 0x7c, 0x02, 0x53, 0x49, 0x33, 0x9d, 0xec, 0xe9, 0x2a, 0x4c, 0x6d, 0x25, 0xac,
0x3b, 0x5f, 0xa4, 0x64, 0xb5, 0xd1, 0x85, 0x0a, 0xf7, 0x89, 0x49, 0x89, 0x77, 0xa1, 0x62, 0x32,
0xdf, 0x59, 0x62, 0x3b, 0x90, 0x91, 0x3a, 0x4a, 0x46, 0xc5, 0x1c, 0x68, 0xfc, 0x59, 0x03, 0x8d,
0xb9, 0xf2, 0xa4, 0xd4, 0x07, 0xa0, 0xd1, 0x37, 0x65, 0x31, 0xdf, 0xb9, 0xb1, 0x16, 0x9f, 0x1f,
0xca, 0x0c, 0x8f, 0xee, 0x40, 0xc5, 0x0f, 0x0e, 0x06, 0xe1, 0xbb, 0xe4, 0x85, 0xf1, 0xc4, 0x0d,
0x0a, 0xc5, 0x9c, 0x41, 0xa9, 0x6c, 0x73, 0x10, 0x6f, 0x91, 0x39, 0x54, 0xb6, 0x2b, 0x61, 0xce,
0x40, 0x0f, 0xa0, 0xd6, 0xdb, 0x21, 0xbd, 0x5d, 0x62, 0x89, 0xd7, 0xc7, 0x4b, 0xe3, 0xc9, 0x2b,
0x1c, 0x8c, 0x43, 0x16, 0xed, 0xbb, 0xc7, 0x42, 0x5e, 0x3d, 0x4a, 0xdf, 0x6c, 0x19, 0x30, 0x67,
0x18, 0xd3, 0x22, 0x82, 0x27, 0xc5, 0x41, 0x2c, 0x82, 0x28, 0x4e, 0xe5, 0xc7, 0x50, 0x61, 0x93,
0x44, 0xf7, 0xe4, 0xe6, 0xc9, 0x85, 0x2b, 0xf9, 0x9b, 0xa6, 0x08, 0x4e, 0xa4, 0xc3, 0x66, 0xac,
0xea, 0x34, 0x8f, 0xa2, 0x23, 0x22, 0xc5, 0x75, 0xce, 0x41, 0x4d, 0x4c, 0x5e, 0x1d, 0x70, 0x3d,
0x04, 0x9c, 0x85, 0x0a, 0xcf, 0xcf, 0xf4, 0xf9, 0x7c, 0x5e, 0x84, 0x32, 0x7d, 0x25, 0x48, 0xe6,
0xcb, 0xed, 0x70, 0xdd, 0xf3, 0x12, 0x66, 0xd5, 0xde, 0x57, 0x96, 0xdd, 0x78, 0x14, 0x46, 0xe8,
0xae, 0x1a, 0xa1, 0xcb, 0xe3, 0x77, 0xa1, 0x58, 0x86, 0x0f, 0xec, 0x57, 0x15, 0xd0, 0xd8, 0xab,
0x61, 0x5a, 0x26, 0xd3, 0x53, 0x39, 0x6f, 0x60, 0x94, 0xdc, 0x8e, 0x0f, 0x68, 0x9e, 0xc9, 0x66,
0x90, 0x9f, 0xc9, 0x8c, 0xb8, 0x41, 0xa1, 0x98, 0x33, 0x68, 0x97, 0x43, 0x7b, 0x48, 0x44, 0x22,
0xe7, 0x74, 0xf9, 0xd4, 0x1e, 0x12, 0xcc, 0xf0, 0x94, 0xb7, 0x63, 0xfa, 0x3b, 0x22, 0x87, 0x73,
0x78, 0x1d, 0xd3, 0xdf, 0xc1, 0x0c, 0x4f, 0x79, 0x8e, 0x39, 0x24, 0x22, 0x79, 0x73, 0x78, 0x6b,
0x26, 0xed, 0x8f, 0xe2, 0x29, 0xcf, 0xb7, 0x3f, 0x23, 0xe2, 0xeb, 0x46, 0x0e, 0x6f, 0xc3, 0xfe,
0x8c, 0x60, 0x86, 0xa7, 0x29, 0x4f, 0x55, 0x32, 0x52, 0xe4, 0x2c, 0x54, 0x7e, 0x64, 0x5b, 0xc1,
0x8e, 0xda, 0x5c, 0x51, 0x9e, 0x08, 0x1a, 0xa5, 0x63, 0x3d, 0x11, 0x72, 0x90, 0xb9, 0xce, 0x2a,
0x68, 0x74, 0xb5, 0x8e, 0x97, 0x36, 0xf1, 0x22, 0x0b, 0x95, 0x69, 0xd0, 0x68, 0x20, 0x33, 0xa6,
0x32, 0x0d, 0x1a, 0x5d, 0x9e, 0xec, 0x56, 0x1a, 0x14, 0xb5, 0xb5, 0x1c, 0xb6, 0xfe, 0xbc, 0x0c,
0x1a, 0xfb, 0xcc, 0x90, 0x4c, 0xc8, 0x1f, 0xc0, 0x44, 0x60, 0x7a, 0x7d, 0xc2, 0x2d, 0x61, 0x37,
0xfc, 0x62, 0x77, 0x7d, 0xec, 0xc7, 0x8b, 0xf6, 0x73, 0x99, 0x82, 0x55, 0x85, 0xa3, 0xef, 0xba,
0x4c, 0x4a, 0xd9, 0x75, 0xef, 0x46, 0x47, 0xae, 0x96, 0xf3, 0x8d, 0x8b, 0x71, 0xf9, 0xc1, 0x1d,
0x9d, 0xbf, 0x97, 0x60, 0x42, 0x19, 0xd8, 0x37, 0xba, 0x0b, 0xca, 0x83, 0xe5, 0x3a, 0x8b, 0x91,
0x73, 0xb8, 0xa9, 0x6e, 0x83, 0x99, 0x46, 0x41, 0x10, 0xff, 0x58, 0x81, 0x7a, 0xf4, 0x99, 0x26,
0xb9, 0x20, 0x8b, 0x50, 0xde, 0xf3, 0x06, 0x62, 0x19, 0x2e, 0xe5, 0x7e, 0xfa, 0x69, 0x6f, 0x7a,
0x03, 0x4c, 0x19, 0x74, 0x36, 0x81, 0x1d, 0x44, 0x61, 0xbf, 0x92, 0x4f, 0x7d, 0x4e, 0xe1, 0x98,
0xb3, 0xd0, 0x33, 0x68, 0x5a, 0xc4, 0xef, 0x79, 0xf6, 0x88, 0x79, 0x3f, 0x1e, 0xff, 0x9b, 0xf9,
0x22, 0xab, 0x31, 0x09, 0xcb, 0x0a, 0xa8, 0x0b, 0x0d, 0x7b, 0x68, 0xf6, 0x49, 0x27, 0xde, 0x44,
0xae, 0xe7, 0xcb, 0x75, 0x43, 0x0a, 0x8e, 0xd9, 0x74, 0x6c, 0xdb, 0xe6, 0xbe, 0xdd, 0x73, 0x1d,
0x26, 0x56, 0x3d, 0xea, 0xd8, 0x1e, 0xc7, 0x24, 0x2c, 0x2b, 0xa0, 0x25, 0xb1, 0x0d, 0xd7, 0x72,
0x3e, 0xe6, 0xc4, 0xa1, 0x8a, 0xdf, 0x95, 0xce, 0x40, 0x79, 0xd3, 0x1b, 0x64, 0x6f, 0x37, 0x2c,
0xaa, 0x19, 0xcd, 0x17, 0xa0, 0x29, 0xc5, 0x2b, 0x03, 0x74, 0x1e, 0x1a, 0x51, 0x14, 0xb2, 0x75,
0xa4, 0xb9, 0x65, 0x80, 0xee, 0x89, 0x3d, 0xe9, 0x7d, 0x35, 0xcd, 0xcf, 0x25, 0xd2, 0x9c, 0x26,
0xf6, 0xba, 0x47, 0x98, 0x8b, 0x96, 0x37, 0xa3, 0x2f, 0x4f, 0xb3, 0x33, 0x6c, 0xf0, 0x0d, 0xbf,
0x0f, 0x3d, 0x87, 0x29, 0x6a, 0xda, 0xb7, 0x4c, 0x9f, 0x64, 0xbd, 0x09, 0xbd, 0x47, 0xdf, 0x30,
0xf8, 0x17, 0xbd, 0x52, 0xce, 0x1b, 0x8f, 0xc0, 0x7d, 0xef, 0xe2, 0xff, 0x7b, 0x5c, 0xfc, 0x5f,
0xb2, 0x5c, 0xfc, 0xa2, 0xe2, 0xe2, 0x2f, 0x64, 0xdd, 0xcb, 0x0c, 0x0e, 0xd9, 0xf8, 0x25, 0xf5,
0x40, 0xb9, 0x98, 0xc3, 0x54, 0x4e, 0x94, 0x25, 0xd5, 0xc7, 0xe7, 0x71, 0x15, 0x23, 0xff, 0x51,
0xd2, 0xc8, 0x5f, 0xce, 0x61, 0x1f, 0x72, 0xf2, 0x4b, 0xaa, 0x93, 0xcf, 0xeb, 0xfd, 0x3b, 0x6c,
0xe5, 0x7f, 0x9b, 0x61, 0xe5, 0xef, 0xa8, 0x56, 0x7e, 0x4c, 0xd6, 0x7c, 0x5b, 0x5e, 0xfe, 0x37,
0x59, 0x5e, 0x7e, 0x51, 0xf1, 0xf2, 0x63, 0x46, 0x96, 0x34, 0xf3, 0x4b, 0xaa, 0x99, 0xbf, 0x98,
0xc3, 0x54, 0xdc, 0xfc, 0xa2, 0xe2, 0xe6, 0xf3, 0x3a, 0x95, 0xec, 0xfc, 0xa2, 0x62, 0xe7, 0xf3,
0x88, 0x92, 0x9f, 0x5f, 0x54, 0xfc, 0x7c, 0x1e, 0x51, 0x32, 0xf4, 0x8b, 0x8a, 0xa1, 0xcf, 0x23,
0x7e, 0xef, 0xe8, 0x8f, 0xe7, 0xe8, 0x7f, 0x99, 0xe5, 0xe8, 0x71, 0xba, 0xa3, 0xbf, 0x91, 0x1d,
0xff, 0x7c, 0x4b, 0x7f, 0xf4, 0x1d, 0xf8, 0xb0, 0xa7, 0xbf, 0x97, 0xf0, 0xf4, 0x97, 0x72, 0xc8,
0xff, 0xa3, 0xa6, 0xfe, 0x4f, 0xe3, 0x4c, 0xfd, 0x6d, 0xd9, 0xd4, 0x8f, 0x39, 0x45, 0x0e, 0xbb,
0xfa, 0xfb, 0xaa, 0xab, 0xbf, 0x7a, 0x04, 0xae, 0x62, 0xeb, 0xd7, 0xd3, 0x6c, 0x7d, 0xfb, 0x08,
0x2a, 0x99, 0xbe, 0xfe, 0xe3, 0xc3, 0xbe, 0xfe, 0xc6, 0x11, 0xf4, 0x52, 0x8d, 0xfd, 0x7a, 0x9a,
0xb1, 0x3f, 0xca, 0xe8, 0x32, 0x9d, 0xfd, 0x87, 0x8a, 0xb3, 0xbf, 0x72, 0x94, 0x70, 0x7d, 0xf7,
0xac, 0xfd, 0x57, 0x25, 0xd0, 0x36, 0x7d, 0xe2, 0x19, 0xff, 0x2a, 0x85, 0xd7, 0x5d, 0xb7, 0x41,
0x63, 0xd7, 0xb5, 0xd2, 0x75, 0x5c, 0x31, 0x71, 0x1d, 0xa7, 0xfc, 0xff, 0x27, 0xbe, 0x8e, 0xbb,
0x0d, 0x1a, 0xbb, 0xa0, 0x3d, 0x3e, 0xf3, 0x67, 0x45, 0x68, 0xc4, 0x97, 0xa5, 0xc7, 0xe6, 0xcb,
0xd7, 0x54, 0x25, 0xf5, 0x9a, 0xea, 0x1a, 0x54, 0x3c, 0x76, 0x29, 0xc4, 0x9f, 0x9a, 0xe4, 0x2d,
0x1b, 0xeb, 0x10, 0x73, 0x88, 0x41, 0xa0, 0x29, 0x5f, 0x05, 0x1f, 0x7f, 0x18, 0x17, 0xc5, 0x1f,
0x2d, 0xba, 0x96, 0xbf, 0xec, 0x79, 0xe6, 0x81, 0x78, 0x27, 0x50, 0x2b, 0xe9, 0x6e, 0xbe, 0x6e,
0x3b, 0xfd, 0xf4, 0x5b, 0x50, 0xe3, 0x6f, 0x45, 0xa8, 0x89, 0x8b, 0x55, 0x63, 0x11, 0xca, 0x6b,
0xe4, 0x25, 0x1d, 0x88, 0xb8, 0x5a, 0x3d, 0x34, 0x90, 0xa7, 0x6c, 0x16, 0x02, 0x8f, 0x43, 0x98,
0xb1, 0x04, 0x55, 0x71, 0x91, 0x7b, 0x7c, 0xee, 0x6d, 0xd0, 0x56, 0x5d, 0xe7, 0x6b, 0x30, 0xe7,
0x4c, 0x98, 0xc0, 0xc4, 0x1f, 0xb9, 0x8e, 0x4f, 0xbe, 0xa5, 0xff, 0xc7, 0xcd, 0xfd, 0xbb, 0x04,
0x15, 0xd6, 0x3b, 0xcd, 0xdc, 0x30, 0x4e, 0x29, 0x6f, 0x7a, 0xb1, 0x1f, 0x9b, 0x94, 0xae, 0xad,
0x95, 0x71, 0xcb, 0x3e, 0x6c, 0x41, 0xf6, 0x61, 0x93, 0xd2, 0xbf, 0x50, 0x54, 0x86, 0xe2, 0xbf,
0x3e, 0x84, 0xfa, 0xc8, 0x73, 0xfb, 0x1e, 0x0d, 0x90, 0x96, 0xf8, 0x5f, 0x97, 0x4a, 0x5b, 0x17,
0x30, 0x1c, 0x11, 0x8c, 0x35, 0xa8, 0x87, 0xb5, 0xf1, 0x65, 0x99, 0x38, 0xd5, 0x59, 0x01, 0x21,
0xd0, 0x2c, 0xd7, 0xe1, 0x73, 0x28, 0x63, 0xf6, 0x9b, 0xa6, 0xb9, 0x88, 0x13, 0x1b, 0x68, 0x03,
0x87, 0xc5, 0xb9, 0xf3, 0x62, 0x1b, 0x98, 0x80, 0xc6, 0xaa, 0xe7, 0x8e, 0xd8, 0x15, 0x6e, 0xab,
0x80, 0x00, 0xaa, 0xdd, 0xe1, 0xc8, 0xf5, 0x82, 0x56, 0x71, 0x6e, 0x39, 0xb4, 0x43, 0x75, 0xd0,
0xd6, 0x5c, 0x87, 0xb4, 0x0a, 0xa8, 0x09, 0x35, 0xbc, 0xe7, 0x38, 0xb6, 0xd3, 0x6f, 0x15, 0x69,
0x35, 0x5d, 0xf7, 0x56, 0x09, 0x9d, 0x80, 0xfa, 0x8a, 0xe9, 0xf4, 0xc8, 0x80, 0x58, 0xad, 0x32,
0x6a, 0x40, 0xe5, 0x91, 0xe7, 0xb9, 0x5e, 0x4b, 0xbb, 0xf6, 0x02, 0x26, 0xd5, 0x4b, 0x63, 0x4a,
0x5a, 0x37, 0xfb, 0x54, 0xab, 0x0e, 0x5a, 0xc7, 0x1d, 0x92, 0x56, 0x11, 0x4d, 0x41, 0x73, 0x9d,
0xdf, 0xbc, 0xb3, 0xa6, 0x12, 0xed, 0x66, 0xd9, 0xeb, 0xed, 0xd8, 0xfb, 0xa4, 0x55, 0xa6, 0xad,
0x0f, 0x3d, 0x62, 0x5a, 0x3d, 0x6f, 0x6f, 0xb8, 0xe5, 0xb7, 0x34, 0x54, 0x63, 0x77, 0xad, 0xad,
0xca, 0xc3, 0xe9, 0xbf, 0xbf, 0x9e, 0x29, 0x7e, 0xf1, 0x7a, 0xa6, 0xf8, 0xcf, 0xd7, 0x33, 0xc5,
0x5f, 0xbf, 0x99, 0x29, 0x7c, 0xf1, 0x66, 0xa6, 0xf0, 0xe5, 0x9b, 0x99, 0xc2, 0xa7, 0xa5, 0xd1,
0xd6, 0x56, 0x95, 0x9d, 0xb6, 0xb7, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x63, 0x4b, 0x0b, 0x65,
0x0a, 0x2a, 0x00, 0x00,
}
func (m *Event) Marshal() (dAtA []byte, err error) {
@ -10294,6 +10306,13 @@ func (m *ModelProcessProgress) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Message) > 0 {
i -= len(m.Message)
copy(dAtA[i:], m.Message)
i = encodeVarintEvents(dAtA, i, uint64(len(m.Message)))
i--
dAtA[i] = 0x1a
}
if m.Done != 0 {
i = encodeVarintEvents(dAtA, i, uint64(m.Done))
i--
@ -12250,6 +12269,10 @@ func (m *ModelProcessProgress) Size() (n int) {
if m.Done != 0 {
n += 1 + sovEvents(uint64(m.Done))
}
l = len(m.Message)
if l > 0 {
n += 1 + l + sovEvents(uint64(l))
}
return n
}
@ -23934,6 +23957,38 @@ func (m *ModelProcessProgress) Unmarshal(dAtA []byte) error {
break
}
}
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowEvents
}
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 ErrInvalidLengthEvents
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthEvents
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Message = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipEvents(dAtA[iNdEx:])

View file

@ -532,6 +532,12 @@ message Rpc {
string textSlot = 6;
string htmlSlot = 7;
repeated anytype.model.Block anySlot = 8;
repeated File fileSlot = 9;
message File {
string name = 1;
bytes data = 2;
}
}
message Response {
@ -1415,6 +1421,31 @@ message Rpc {
}
}
}
message Record {
message Request {
string contextId = 1;
string blockId = 2;
google.protobuf.Struct record = 3;
}
message Response {
Error error = 1;
google.protobuf.Struct record = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
}
}
}
}
}
// common simple block command
@ -1500,6 +1531,35 @@ message Rpc {
}
}
message Update {
message Dataview{
message Record {
message Request {
string contextId = 1;
string blockId = 2;
string recordId = 3;
google.protobuf.Struct record = 4;
}
message Response {
Error error = 1;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
}
}
}
}
}
}
message Delete {
message Dataview {
message View {
@ -1526,6 +1586,31 @@ message Rpc {
}
}
}
message Record {
message Request {
string contextId = 1;
string blockId = 2;
string recordId = 3;
}
message Response {
Error error = 1;
ResponseEvent event = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
}
}
}
}
}
}

View file

@ -581,6 +581,7 @@ message Model {
enum Type {
DropFiles = 0;
Import = 1;
}
enum State {
@ -594,6 +595,7 @@ message Model {
message Progress {
int64 total = 1;
int64 done = 2;
string message = 3;
}
}
}

View file

@ -90,6 +90,10 @@ service ClientCommands {
rpc BlockCreateDataviewView (anytype.Rpc.Block.Create.Dataview.View.Request) returns (anytype.Rpc.Block.Create.Dataview.View.Response);
rpc BlockDeleteDataviewView (anytype.Rpc.Block.Delete.Dataview.View.Request) returns (anytype.Rpc.Block.Delete.Dataview.View.Response);
rpc BlockCreateDataviewRecord (anytype.Rpc.Block.Create.Dataview.Record.Request) returns (anytype.Rpc.Block.Create.Dataview.Record.Response);
rpc BlockUpdateDataviewRecord (anytype.Rpc.Block.Update.Dataview.Record.Request) returns (anytype.Rpc.Block.Update.Dataview.Record.Response);
rpc BlockDeleteDataviewRecord (anytype.Rpc.Block.Delete.Dataview.Record.Request) returns (anytype.Rpc.Block.Delete.Dataview.Record.Response);
rpc BlockBookmarkFetch (anytype.Rpc.Block.Bookmark.Fetch.Request) returns (anytype.Rpc.Block.Bookmark.Fetch.Response);
rpc BlockBookmarkCreateAndFetch (anytype.Rpc.Block.Bookmark.CreateAndFetch.Request) returns (anytype.Rpc.Block.Bookmark.CreateAndFetch.Response);
rpc BlockFileCreateAndUpload (anytype.Rpc.Block.File.CreateAndUpload.Request) returns (anytype.Rpc.Block.File.CreateAndUpload.Response);

View file

@ -49,6 +49,12 @@ func (l *linkPreview) Fetch(ctx context.Context, fetchUrl string) (model.LinkPre
if len(res.Description) == 0 {
res.Description = l.findContent(rt.lastBody)
}
if !utf8.ValidString(res.Title) {
res.Title = ""
}
if !utf8.ValidString(res.Description) {
res.Description = ""
}
return res, nil
}

View file

@ -0,0 +1,2 @@
//go:generate mockgen -package mockFile -destination file_mock.go github.com/anytypeio/go-anytype-middleware/core/block/editor/file BlockService
package mockFile