1
0
mirror of https://github.com/rclone/rclone.git synced 2025-12-14 07:13:26 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Chun-Hung Tseng
2ea8b3db4f protondrive: add SkipSignatureVerifications to option 2023-08-03 00:15:06 +02:00
20 changed files with 98 additions and 1191 deletions

View File

@@ -32,7 +32,7 @@ jobs:
include:
- job_name: linux
os: ubuntu-latest
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
gotags: cmount
build_flags: '-include "^linux/"'
check: true
@@ -43,14 +43,14 @@ jobs:
- job_name: linux_386
os: ubuntu-latest
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
goarch: 386
gotags: cmount
quicktest: true
- job_name: mac_amd64
os: macos-11
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
gotags: 'cmount'
build_flags: '-include "^darwin/amd64" -cgo'
quicktest: true
@@ -59,14 +59,14 @@ jobs:
- job_name: mac_arm64
os: macos-11
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
gotags: 'cmount'
build_flags: '-include "^darwin/arm64" -cgo -macos-arch arm64 -cgo-cflags=-I/usr/local/include -cgo-ldflags=-L/usr/local/lib'
deploy: true
- job_name: windows
os: windows-latest
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
gotags: cmount
cgo: '0'
build_flags: '-include "^windows/"'
@@ -76,7 +76,7 @@ jobs:
- job_name: other_os
os: ubuntu-latest
go: '1.21.0-rc.4'
go: '1.21.0-rc.3'
build_flags: '-exclude "^(windows/|darwin/|linux/)"'
compile_all: true
deploy: true
@@ -244,7 +244,7 @@ jobs:
- name: Install Go
uses: actions/setup-go@v4
with:
go-version: '1.21.0-rc.4'
go-version: '1.21.0-rc.3'
check-latest: true
- name: Install govulncheck
@@ -269,7 +269,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.21.0-rc.4'
go-version: '1.21.0-rc.3'
- name: Go module cache
uses: actions/cache@v3

View File

@@ -428,19 +428,14 @@ Getting going
* box is a good one to start from if you have a directory-based remote
* b2 is a good one to start from if you have a bucket-based remote
* Add your remote to the imports in `backend/all/all.go`
* HTTP based remotes are easiest to maintain if they use rclone's [lib/rest](https://pkg.go.dev/github.com/rclone/rclone/lib/rest) module, but if there is a really good go SDK then use that instead.
* HTTP based remotes are easiest to maintain if they use rclone's rest module, but if there is a really good go SDK then use that instead.
* Try to implement as many optional methods as possible as it makes the remote more usable.
* Use [lib/encoder](https://pkg.go.dev/github.com/rclone/rclone/lib/encoder) to make sure we can encode any path name and `rclone info` to help determine the encodings needed
* Use lib/encoder to make sure we can encode any path name and `rclone info` to help determine the encodings needed
* `rclone purge -v TestRemote:rclone-info`
* `rclone test info --all --remote-encoding None -vv --write-json remote.json TestRemote:rclone-info`
* `go run cmd/test/info/internal/build_csv/main.go -o remote.csv remote.json`
* open `remote.csv` in a spreadsheet and examine
Important:
* Please use [lib/rest](https://pkg.go.dev/github.com/rclone/rclone/lib/rest) if you are implementing a REST like backend and parsing XML/JSON in the backend. It makes maintenance much easier.
* If your backend is HTTP based then please use rclone's Client or Transport from [fs/fshttp](https://pkg.go.dev/github.com/rclone/rclone/fs/fshttp) - this adds features like `--dump bodies`, `--tpslimit`, `--user-agent` without you having to code anything!
Unit tests
* Create a config entry called `TestRemote` for the unit tests to use

View File

@@ -54,6 +54,5 @@ import (
_ "github.com/rclone/rclone/backend/uptobox"
_ "github.com/rclone/rclone/backend/webdav"
_ "github.com/rclone/rclone/backend/yandex"
_ "github.com/rclone/rclone/backend/zip"
_ "github.com/rclone/rclone/backend/zoho"
)

View File

@@ -134,6 +134,19 @@ cache. Thus, if there are concurrent clients accessing the same mount point,
then we might have a problem with caching the stale data.`,
Advanced: true,
Default: true,
}, {
Name: "skip_signature_verifications",
Help: `Skip signature verifications during decryption operations
During development and beta testing phase, signature verification is a big
source of problem which affects the normal usage.
Before a proper signature-related failure report-only mode is properly
implemented, we currently offer this feature flag to disable verifying
signatures during decryption operations.
`,
Advanced: true,
Default: false,
}},
})
}
@@ -145,11 +158,12 @@ type Options struct {
TwoFA string `config:"2fa"`
// advanced
Enc encoder.MultiEncoder `config:"encoding"`
ReportOriginalSize bool `config:"original_file_size"`
AppVersion string `config:"app_version"`
ReplaceExistingDraft bool `config:"replace_existing_draft"`
EnableCaching bool `config:"enable_caching"`
Enc encoder.MultiEncoder `config:"encoding"`
ReportOriginalSize bool `config:"original_file_size"`
AppVersion string `config:"app_version"`
ReplaceExistingDraft bool `config:"replace_existing_draft"`
EnableCaching bool `config:"enable_caching"`
SkipSignatureVerifications bool `config:"skip_signature_verifications"`
}
// Fs represents a remote proton drive
@@ -270,6 +284,7 @@ func newProtonDrive(ctx context.Context, f *Fs, opt *Options, m configmap.Mapper
config.ReplaceExistingDraft = opt.ReplaceExistingDraft
config.EnableCaching = opt.EnableCaching
config.SkipSignatureVerifications = opt.SkipSignatureVerifications
// let's see if we have the cached access credential
uid, accessToken, refreshToken, saltedKeyPass, hasUseReusableLoginCredentials := getConfigMap(m)

View File

@@ -24,7 +24,6 @@ import (
"storj.io/uplink"
"storj.io/uplink/edge"
"storj.io/uplink/private/testuplink"
)
const (
@@ -277,8 +276,6 @@ func (f *Fs) connect(ctx context.Context) (project *uplink.Project, err error) {
UserAgent: "rclone",
}
ctx = testuplink.WithConcurrentSegmentUploadsDefaultConfig(ctx)
project, err = cfg.OpenProject(ctx, f.access)
if err != nil {
return nil, fmt.Errorf("storj: project: %w", err)

View File

@@ -561,7 +561,7 @@ func (f *Fs) newObjectWithInfo(ctx context.Context, remote string, info *swift.O
// returned as 0 bytes in the listing. Correct this here by
// making sure we read the full metadata for all 0 byte files.
// We don't read the metadata for directory marker objects.
if info != nil && info.Bytes == 0 && info.ContentType != "application/directory" && !o.fs.opt.NoLargeObjects {
if info != nil && info.Bytes == 0 && info.ContentType != "application/directory" {
err := o.readMetaData(ctx) // reads info and headers, returning an error
if err == fs.ErrorObjectNotFound {
// We have a dangling large object here so just return the original metadata

View File

@@ -1,572 +0,0 @@
// Package zip provides wrappers for Fs and Object which read and
// write a zip file.
//
// Use like :zip:remote:path/to/file.zip
package zip
/*
FIXME could maybe make an append to zip file with specially named zip
files having more info in?
So have base zip file file.zip then file.extra000.zip etc.
We read the objects sequentially but can transfer them in parallel.
FIXME what happens when we want to copy a file out of the zip?
So rclone copy remote:file.zip/file/inside.zip?
Maybe rclone copy remote:file.zip#file/inside.zip?
Or just look for first .zip file?
FIXME what happens when writing - need to know the end... Don't have a
backend Shutdown call.
Could have a read only Feature flag so we turn that on when we have a
zip. Then if placed in dest position could error. Might be useful for
http also.
FIXME this will perform poorly for unpacking as the VFS Reader is bad
at multiple streams.
FIXME not writing directories
cf zipinfo
drwxr-xr-x 3.0 unx 0 bx stor 19-Oct-05 12:14 rclone-v1.49.5-linux-amd64/
FIXME can probably check directories better than trailing /
FIXME enormous atexit bodge
FIXME crc32 skip on write bodge
Bodge bodge bodge
*/
import (
"archive/zip"
"context"
"errors"
"fmt"
"io"
"io/ioutil"
"os"
"path"
"strings"
"sync"
"time"
"github.com/rclone/rclone/fs"
"github.com/rclone/rclone/fs/cache"
"github.com/rclone/rclone/fs/config/configmap"
"github.com/rclone/rclone/fs/config/configstruct"
"github.com/rclone/rclone/fs/dirtree"
"github.com/rclone/rclone/fs/fspath"
"github.com/rclone/rclone/fs/hash"
"github.com/rclone/rclone/fs/log"
"github.com/rclone/rclone/lib/atexit"
"github.com/rclone/rclone/lib/readers"
"github.com/rclone/rclone/vfs"
)
// Globals
// Register with Fs
func init() {
fs.Register(&fs.RegInfo{
Name: "zip",
Description: "Read or write a zip file",
NewFs: NewFs,
Options: []fs.Option{},
})
}
// NewFs constructs an Fs from the path, container:path
func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) {
// Parse config into Options struct
opt := new(Options)
err := configstruct.Set(m, opt)
if err != nil {
return nil, err
}
// Parse the root which should be remote:path/to/file.zip
parent, leaf, err := fspath.Split(root)
if err != nil {
return nil, fmt.Errorf("failed to parse root %q: %w", root, err)
}
if leaf == "" {
return nil, fmt.Errorf("failed to parse root %q: not pointing to a file", root)
}
root = strings.TrimRight(parent, "/")
// Create the remote from the cache
wrappedFs, err := cache.Get(ctx, root)
if err != nil {
return nil, fmt.Errorf("failed to make %q to wrap: %w", root, err)
}
// FIXME vfs cache?
// FIXME could factor out ReadFileHandle and just use that rather than the full VFS
VFS := vfs.New(wrappedFs, nil)
if err != nil {
return nil, fmt.Errorf("failed to create VFS for %q: %w", root, err)
}
node, err := VFS.Stat(leaf)
if err != nil && !os.IsNotExist(err) {
return nil, fmt.Errorf("failed to find %q object: %w", leaf, err)
}
if node != nil && node.IsDir() {
return nil, fmt.Errorf("can't unzip a directory %q", leaf)
}
f := &Fs{
f: wrappedFs,
name: name,
root: root,
opt: *opt,
vfs: VFS,
node: node,
leaf: leaf,
}
// FIXME Maybe delay this until first read size if writing we don't need it?
if node != nil {
err = f.readZip()
if err != nil {
return nil, fmt.Errorf("failed to open zip file: %w", err)
}
}
// FIXME
// the features here are ones we could support, and they are
// ANDed with the ones from wrappedFs
//
// FIXME some of these need to be forced on - CanHaveEmptyDirectories
f.features = (&fs.Features{
CaseInsensitive: false,
DuplicateFiles: false,
ReadMimeType: false, // MimeTypes not supported with gzip
WriteMimeType: false,
BucketBased: false,
CanHaveEmptyDirectories: true,
}).Fill(ctx, f).Mask(ctx, wrappedFs).WrapsFs(f, wrappedFs)
return f, nil
}
// Options defines the configuration for this backend
type Options struct {
}
// Fs represents a wrapped fs.Fs
type Fs struct {
f fs.Fs
wrapper fs.Fs
name string
root string
opt Options
features *fs.Features // optional features
vfs *vfs.VFS
node vfs.Node // zip file object - set if reading
leaf string // leaf name of the zip file object
dt dirtree.DirTree // read from zipfile
wrmu sync.Mutex // writing mutex protects the below
wh vfs.Handle // write handle
zw *zip.Writer
}
// Name of the remote (as passed into NewFs)
func (f *Fs) Name() string {
return f.name
}
// Root of the remote (as passed into NewFs)
func (f *Fs) Root() string {
return f.root
}
// Features returns the optional features of this Fs
func (f *Fs) Features() *fs.Features {
return f.features
}
// String returns a description of the FS
func (f *Fs) String() string {
return fmt.Sprintf("Zip '%s:%s'", f.name, f.root)
}
// readZip the zip file into f
func (f *Fs) readZip() (err error) {
if f.node == nil {
return fs.ErrorDirNotFound
}
size := f.node.Size()
if size < 0 {
return errors.New("can't read from zip file with unknown size")
}
r, err := f.node.Open(os.O_RDONLY)
if err != nil {
return fmt.Errorf("failed to open zip file: %w", err)
}
zr, err := zip.NewReader(r, size)
if err != nil {
return fmt.Errorf("failed to read zip file: %w", err)
}
dt := dirtree.New()
for _, file := range zr.File {
remote := strings.Trim(path.Clean(file.Name), "/")
if remote == "." {
remote = ""
}
if strings.HasSuffix(file.Name, "/") {
dir := fs.NewDir(remote, file.Modified)
dt.AddDir(dir)
} else {
o := &Object{
f: f,
remote: remote,
fh: &file.FileHeader,
file: file,
}
dt.Add(o)
}
}
dt.CheckParents("")
dt.Sort()
f.dt = dt
fs.Debugf(nil, "dt = %#v", dt)
return nil
}
// List the objects and directories in dir into entries. The
// entries can be returned in any order but should be for a
// complete directory.
//
// dir should be "" to list the root, and should not have
// trailing slashes.
//
// This should return ErrDirNotFound if the directory isn't
// found.
func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) {
defer log.Trace(f, "dir=%q", dir)("entries=%v, err=%v", &entries, &err)
entries, ok := f.dt[dir]
if !ok {
return nil, fs.ErrorDirNotFound
}
fs.Debugf(f, "dir=%q, entries=%v", dir, entries)
return entries, nil
}
// ListR lists the objects and directories of the Fs starting
// from dir recursively into out.
//
// dir should be "" to start from the root, and should not
// have trailing slashes.
//
// This should return ErrDirNotFound if the directory isn't
// found.
//
// It should call callback for each tranche of entries read.
// These need not be returned in any particular order. If
// callback returns an error then the listing will stop
// immediately.
//
// Don't implement this unless you have a more efficient way
// of listing recursively that doing a directory traversal.
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
for _, entries := range f.dt {
err = callback(entries)
if err != nil {
return err
}
}
return nil
}
// NewObject finds the Object at remote.
func (f *Fs) NewObject(ctx context.Context, remote string) (o fs.Object, err error) {
defer log.Trace(f, "remote=%q", remote)("obj=%v, err=%v", &o, &err)
if f.dt == nil {
return nil, fs.ErrorObjectNotFound
}
_, entry := f.dt.Find(remote)
if entry == nil {
return nil, fs.ErrorObjectNotFound
}
o, ok := entry.(*Object)
if !ok {
return nil, fs.ErrorNotAFile
}
return o, nil
}
// Precision of the ModTimes in this Fs
func (f *Fs) Precision() time.Duration {
return time.Second
}
// Mkdir makes the directory (container, bucket)
//
// Shouldn't return an error if it already exists
func (f *Fs) Mkdir(ctx context.Context, dir string) error {
// FIXME should this create a "directory" entry if not already created?
return nil
}
// Rmdir removes the directory (container, bucket) if empty
//
// Return an error if it doesn't exist or isn't empty
func (f *Fs) Rmdir(ctx context.Context, dir string) error {
return errors.New("can't remove directories from zip file")
}
// Wrapper for src to make it into os.FileInfo
type fileInfo struct {
src fs.ObjectInfo
}
// Name - base name of the file (actually full name for zip)
func (fi fileInfo) Name() string {
return fi.src.Remote()
}
// Size - length in bytes for regular files; system-dependent for others
func (fi fileInfo) Size() int64 {
return fi.src.Size()
}
// Mode - file mode bits
func (fi fileInfo) Mode() os.FileMode {
return 0777
}
// ModTime - modification time
func (fi fileInfo) ModTime() time.Time {
return fi.src.ModTime(context.Background())
}
// IsDir - abbreviation for Mode().IsDir()
func (fi fileInfo) IsDir() bool {
return false
}
// Sys - underlying data source (can return nil)
func (fi fileInfo) Sys() interface{} {
return nil
}
// check type
var _ os.FileInfo = fileInfo{}
// Put in to the remote path with the modTime given of the given size
//
// May create the object even if it returns an error - if so
// will return the object and the error, otherwise will return
// nil and the error
func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (o fs.Object, err error) {
defer log.Trace(f, "src=%v", src)("obj=%v, err=%v", &o, &err)
f.wrmu.Lock()
defer f.wrmu.Unlock()
size := src.Size()
if size < 0 {
return nil, errors.New("can't zip unknown sized objects")
}
if f.zw == nil {
wh, err := f.vfs.OpenFile(f.leaf, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
if err != nil {
return nil, fmt.Errorf("zip put: failed to open output file: %w", err)
}
f.wh = wh
f.zw = zip.NewWriter(f.wh)
if err != nil {
return nil, fmt.Errorf("zip put: failed to create zip writer: %w", err)
}
// FIXME enormous bodge to work around no lifecycle for backends
atexit.Register(func() {
err = f.zw.Close()
if err != nil {
fs.Errorf(f, "Error closing zip writer: %v", err)
}
err = f.wh.Close()
if err != nil {
fs.Errorf(f, "Error closing zip file: %v", err)
}
})
}
// FIXME not putting in directories?
fh, err := zip.FileInfoHeader(fileInfo{src})
if err != nil {
return nil, fmt.Errorf("zip put: failed to create file header: %w", err)
}
w, err := f.zw.CreateHeader(fh)
if err != nil {
return nil, fmt.Errorf("zip put: failed to open file: %w", err)
}
// FIXME just a guess!
// should probably try a better heuristic?
if size < 10 {
fh.Method = zip.Store
} else {
fh.Method = zip.Deflate
}
_, err = io.CopyN(w, in, size)
if err != nil {
return nil, fmt.Errorf("zip put: failed to copy file: %w", err)
}
// err = w.Close()
// if err != nil {
// return nil,fmt.Errorf("zip put: failed to close file: %w", err)
// }
o = &Object{
f: f,
fh: fh,
remote: src.Remote(),
}
return o, nil
}
// Hashes returns the supported hash sets.
func (f *Fs) Hashes() hash.Set {
return hash.Set(hash.CRC32)
}
// UnWrap returns the Fs that this Fs is wrapping
func (f *Fs) UnWrap() fs.Fs {
return f.f
}
// WrapFs returns the Fs that is wrapping this Fs
func (f *Fs) WrapFs() fs.Fs {
return f.wrapper
}
// SetWrapper sets the Fs that is wrapping this Fs
func (f *Fs) SetWrapper(wrapper fs.Fs) {
f.wrapper = wrapper
}
// Object describes an object to be read from the raw zip file
type Object struct {
f *Fs
remote string
fh *zip.FileHeader
file *zip.File
}
// Fs returns read only access to the Fs that this object is part of
func (o *Object) Fs() fs.Info {
return o.f
}
// Return a string version
func (o *Object) String() string {
if o == nil {
return "<nil>"
}
return o.Remote()
}
// Remote returns the remote path
func (o *Object) Remote() string {
return o.remote
}
// Size returns the size of the file
func (o *Object) Size() int64 {
return int64(o.fh.UncompressedSize64)
}
// ModTime returns the modification time of the object
//
// It attempts to read the objects mtime and if that isn't present the
// LastModified returned in the http headers
func (o *Object) ModTime(ctx context.Context) time.Time {
return o.fh.Modified
}
// SetModTime sets the modification time of the local fs object
func (o *Object) SetModTime(ctx context.Context, modTime time.Time) error {
fs.Debugf(o, "Can't set mod time - ignoring")
return nil
}
// Storable raturns a boolean indicating if this object is storable
func (o *Object) Storable() bool {
return true
}
// Hash returns the selected checksum of the file
// If no checksum is available it returns ""
func (o *Object) Hash(ctx context.Context, ht hash.Type) (string, error) {
if ht == hash.CRC32 {
// FIXME return empty CRC if writing
if o.f.dt == nil {
return "", nil
}
return fmt.Sprintf("%08x", o.fh.CRC32), nil
}
return "", hash.ErrUnsupported
}
// Open opens the file for read. Call Close() on the returned io.ReadCloser
func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (rc io.ReadCloser, err error) {
var offset, limit int64 = 0, -1
for _, option := range options {
switch x := option.(type) {
case *fs.SeekOption:
offset = x.Offset
case *fs.RangeOption:
offset, limit = x.Decode(o.Size())
default:
if option.Mandatory() {
fs.Logf(o, "Unsupported mandatory option: %v", option)
}
}
}
rc, err = o.file.Open()
if err != nil {
return nil, err
}
// discard data from start as necessary
if offset > 0 {
_, err = io.CopyN(ioutil.Discard, rc, offset)
if err != nil {
return nil, err
}
}
// If limited then don't return everything
if limit >= 0 {
return readers.NewLimitedReadCloser(rc, limit-offset), nil
}
return rc, nil
}
// Update in to the object with the modTime given of the given size
func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error {
return errors.New("can't Update zip files")
}
// Remove an object
func (o *Object) Remove(ctx context.Context) error {
return errors.New("can't Remove zip file objects")
}
// Check the interfaces are satisfied
var (
_ fs.Fs = (*Fs)(nil)
_ fs.UnWrapper = (*Fs)(nil)
_ fs.ListRer = (*Fs)(nil)
// _ fs.Abouter = (*Fs)(nil) - FIXME can implemnet
_ fs.Wrapper = (*Fs)(nil)
_ fs.Object = (*Object)(nil)
)

View File

@@ -1,94 +0,0 @@
package info
// Create files with all possible base 32768 file names
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"github.com/rclone/rclone/fs"
"github.com/rclone/rclone/fs/fspath"
"github.com/rclone/rclone/fs/operations"
"github.com/rclone/rclone/fs/sync"
)
const safeAlphabet = "ƀɀɠʀҠԀڀڠݠހ߀ကႠᄀᄠᅀᆀᇠሀሠበዠጠᎠᏀᐠᑀᑠᒀᒠᓀᓠᔀᔠᕀᕠᖀᖠᗀᗠᘀᘠᙀᚠᛀកᠠᡀᣀᦀ᧠ᨠᯀᰀᴀ⇠⋀⍀⍠⎀⎠⏀␀─┠╀╠▀■◀◠☀☠♀♠⚀⚠⛀⛠✀✠❀➀➠⠀⠠⡀⡠⢀⢠⣀⣠⤀⤠⥀⥠⦠⨠⩀⪀⪠⫠⬀⬠⭀ⰀⲀⲠⳀⴀⵀ⺠⻀㇀㐀㐠㑀㑠㒀㒠㓀㓠㔀㔠㕀㕠㖀㖠㗀㗠㘀㘠㙀㙠㚀㚠㛀㛠㜀㜠㝀㝠㞀㞠㟀㟠㠀㠠㡀㡠㢀㢠㣀㣠㤀㤠㥀㥠㦀㦠㧀㧠㨀㨠㩀㩠㪀㪠㫀㫠㬀㬠㭀㭠㮀㮠㯀㯠㰀㰠㱀㱠㲀㲠㳀㳠㴀㴠㵀㵠㶀㶠㷀㷠㸀㸠㹀㹠㺀㺠㻀㻠㼀㼠㽀㽠㾀㾠㿀㿠䀀䀠䁀䁠䂀䂠䃀䃠䄀䄠䅀䅠䆀䆠䇀䇠䈀䈠䉀䉠䊀䊠䋀䋠䌀䌠䍀䍠䎀䎠䏀䏠䐀䐠䑀䑠䒀䒠䓀䓠䔀䔠䕀䕠䖀䖠䗀䗠䘀䘠䙀䙠䚀䚠䛀䛠䜀䜠䝀䝠䞀䞠䟀䟠䠀䠠䡀䡠䢀䢠䣀䣠䤀䤠䥀䥠䦀䦠䧀䧠䨀䨠䩀䩠䪀䪠䫀䫠䬀䬠䭀䭠䮀䮠䯀䯠䰀䰠䱀䱠䲀䲠䳀䳠䴀䴠䵀䵠䶀䷀䷠一丠乀习亀亠什仠伀传佀你侀侠俀俠倀倠偀偠傀傠僀僠儀儠兀兠冀冠净几刀删剀剠劀加勀勠匀匠區占厀厠叀叠吀吠呀呠咀咠哀哠唀唠啀啠喀喠嗀嗠嘀嘠噀噠嚀嚠囀因圀圠址坠垀垠埀埠堀堠塀塠墀墠壀壠夀夠奀奠妀妠姀姠娀娠婀婠媀媠嫀嫠嬀嬠孀孠宀宠寀寠尀尠局屠岀岠峀峠崀崠嵀嵠嶀嶠巀巠帀帠幀幠庀庠廀廠开张彀彠往徠忀忠怀怠恀恠悀悠惀惠愀愠慀慠憀憠懀懠戀戠所扠技抠拀拠挀挠捀捠掀掠揀揠搀搠摀摠撀撠擀擠攀攠敀敠斀斠旀无昀映晀晠暀暠曀曠最朠杀杠枀枠柀柠栀栠桀桠梀梠检棠椀椠楀楠榀榠槀槠樀樠橀橠檀檠櫀櫠欀欠歀歠殀殠毀毠氀氠汀池沀沠泀泠洀洠浀浠涀涠淀淠渀渠湀湠満溠滀滠漀漠潀潠澀澠激濠瀀瀠灀灠炀炠烀烠焀焠煀煠熀熠燀燠爀爠牀牠犀犠狀狠猀猠獀獠玀玠珀珠琀琠瑀瑠璀璠瓀瓠甀甠畀畠疀疠痀痠瘀瘠癀癠皀皠盀盠眀眠着睠瞀瞠矀矠砀砠础硠碀碠磀磠礀礠祀祠禀禠秀秠稀稠穀穠窀窠竀章笀笠筀筠简箠節篠簀簠籀籠粀粠糀糠紀素絀絠綀綠緀締縀縠繀繠纀纠绀绠缀缠罀罠羀羠翀翠耀耠聀聠肀肠胀胠脀脠腀腠膀膠臀臠舀舠艀艠芀芠苀苠茀茠荀荠莀莠菀菠萀萠葀葠蒀蒠蓀蓠蔀蔠蕀蕠薀薠藀藠蘀蘠虀虠蚀蚠蛀蛠蜀蜠蝀蝠螀螠蟀蟠蠀蠠血衠袀袠裀裠褀褠襀襠覀覠觀觠言訠詀詠誀誠諀諠謀謠譀譠讀讠诀诠谀谠豀豠貀負賀賠贀贠赀赠趀趠跀跠踀踠蹀蹠躀躠軀軠輀輠轀轠辀辠迀迠退造遀遠邀邠郀郠鄀鄠酀酠醀醠釀釠鈀鈠鉀鉠銀銠鋀鋠錀錠鍀鍠鎀鎠鏀鏠鐀鐠鑀鑠钀钠铀铠销锠镀镠門閠闀闠阀阠陀陠隀隠雀雠需霠靀靠鞀鞠韀韠頀頠顀顠颀颠飀飠餀餠饀饠馀馠駀駠騀騠驀驠骀骠髀髠鬀鬠魀魠鮀鮠鯀鯠鰀鰠鱀鱠鲀鲠鳀鳠鴀鴠鵀鵠鶀鶠鷀鷠鸀鸠鹀鹠麀麠黀黠鼀鼠齀齠龀龠ꀀꀠꁀꁠꂀꂠꃀꃠꄀꄠꅀꅠꆀꆠꇀꇠꈀꈠꉀꉠꊀꊠꋀꋠꌀꌠꍀꍠꎀꎠꏀꏠꐀꐠꑀꑠ꒠ꔀꔠꕀꕠꖀꖠꗀꗠꙀꚠꛀ꜀꜠ꝀꞀꡀ"
func (r *results) checkBase32768() {
r.canBase32768 = false
ctx := context.Background()
n := 0
dir, err := os.MkdirTemp("", "rclone-base32768-files")
if err != nil {
log.Printf("Failed to make temp dir: %v", err)
return
}
defer func() {
_ = os.RemoveAll(dir)
}()
// Create test files
for _, c := range safeAlphabet {
var out strings.Builder
for i := rune(0); i < 32; i++ {
out.WriteRune(c + i)
}
fileName := filepath.Join(dir, fmt.Sprintf("%04d-%s.txt", n, out.String()))
err = os.WriteFile(fileName, []byte(fileName), 0666)
if err != nil {
log.Printf("write %q failed: %v", fileName, err)
return
}
n++
}
// Make a local fs
fLocal, err := fs.NewFs(ctx, dir)
if err != nil {
log.Printf("Failed to make local fs: %v", err)
return
}
testDir := "test-base32768"
// Make a remote fs
s := fs.ConfigStringFull(r.f)
s = fspath.JoinRootPath(s, testDir)
fRemote, err := fs.NewFs(ctx, s)
if err != nil {
log.Printf("Failed to make remote fs: %v", err)
return
}
defer func() {
err := operations.Purge(ctx, r.f, testDir)
if err != nil {
log.Printf("Failed to purge test directory: %v", err)
return
}
}()
// Sync local to remote
err = sync.Sync(ctx, fRemote, fLocal, false)
if err != nil {
log.Printf("Failed to sync remote fs: %v", err)
return
}
// Check local to remote
err = operations.Check(ctx, &operations.CheckOpt{
Fdst: fRemote,
Fsrc: fLocal,
})
if err != nil {
log.Printf("Failed to check remote fs: %v", err)
return
}
r.canBase32768 = true
}

View File

@@ -37,7 +37,6 @@ var (
checkControl bool
checkLength bool
checkStreaming bool
checkBase32768 bool
all bool
uploadWait time.Duration
positionLeftRe = regexp.MustCompile(`(?s)^(.*)-position-left-([[:xdigit:]]+)$`)
@@ -54,7 +53,6 @@ func init() {
flags.DurationVarP(cmdFlags, &uploadWait, "upload-wait", "", 0, "Wait after writing a file", "")
flags.BoolVarP(cmdFlags, &checkLength, "check-length", "", false, "Check max filename length", "")
flags.BoolVarP(cmdFlags, &checkStreaming, "check-streaming", "", false, "Check uploads with indeterminate file size", "")
flags.BoolVarP(cmdFlags, &checkBase32768, "check-base32768", "", false, "Check can store all possible base32768 characters", "")
flags.BoolVarP(cmdFlags, &all, "all", "", false, "Run all tests", "")
}
@@ -73,7 +71,7 @@ a bit of go code for each one.
},
Run: func(command *cobra.Command, args []string) {
cmd.CheckArgs(1, 1e6, command, args)
if !checkNormalization && !checkControl && !checkLength && !checkStreaming && !checkBase32768 && !all {
if !checkNormalization && !checkControl && !checkLength && !checkStreaming && !all {
log.Fatalf("no tests selected - select a test or use --all")
}
if all {
@@ -81,7 +79,6 @@ a bit of go code for each one.
checkControl = true
checkLength = true
checkStreaming = true
checkBase32768 = true
}
for i := range args {
f := cmd.NewFsDir(args[i : i+1])
@@ -103,7 +100,6 @@ type results struct {
canReadUnnormalized bool
canReadRenormalized bool
canStream bool
canBase32768 bool
}
func newResults(ctx context.Context, f fs.Fs) *results {
@@ -145,9 +141,6 @@ func (r *results) Print() {
if checkStreaming {
fmt.Printf("canStream = %v\n", r.canStream)
}
if checkBase32768 {
fmt.Printf("base32768isOK = %v // make sure maxFileLength for 2 byte unicode chars is the same as for 1 byte characters\n", r.canBase32768)
}
}
// WriteJSON writes the results to a JSON file when requested
@@ -490,9 +483,6 @@ func readInfo(ctx context.Context, f fs.Fs) error {
if checkStreaming {
r.checkStreaming()
}
if checkBase32768 {
r.checkBase32768()
}
r.Print()
r.WriteJSON()
return nil

View File

@@ -755,5 +755,3 @@ put them back in again.` >}}
* yuudi <yuudi@users.noreply.github.com>
* Zach <github@prozach.org>
* nielash <31582349+nielash@users.noreply.github.com>
* Julian Lepinski <lepinsk@users.noreply.github.com>
* Raymond Berger <RayBB@users.noreply.github.com>

View File

@@ -473,27 +473,3 @@ remote.
See [List of backends that do not support rclone about](https://rclone.org/overview/#optional-features) and [rclone about](https://rclone.org/commands/rclone_about/)
## Get your own Box App ID
Here is how to create your own Box App ID for rclone:
1. Go to the [Box Developer Console](https://app.box.com/developers/console)
and login, then click `My Apps` on the sidebar. Click `Create New App`
and select `Custom App`.
2. In the first screen on the box that pops up, you can pretty much enter
whatever you want. The `App Name` can be whatever. For `Purpose` choose
automation to avoid having to fill out anything else. Click `Next`.
3. In the second screen of the creation screen, select
`User Authentication (OAuth 2.0)`. Then click `Create App`.
4. You should now be on the `Configuration` tab of your new app. If not,
click on it at the top of the webpage. Copy down `Client ID`
and `Client Secret`, you'll need those for rclone.
5. Under "OAuth 2.0 Redirect URI", add `http://127.0.0.1:53682/`
6. For `Application Scopes`, select `Read all files and folders stored in Box`
and `Write all files and folders stored in box` (assuming you want to do both).
Leave others unchecked. Click `Save Changes` at the top right.

View File

@@ -69,7 +69,7 @@ This is an SHA256 sum of all the 4 MiB block SHA256s.
² SFTP supports checksums if the same login has shell access and
`md5sum` or `sha1sum` as well as `echo` are in the remote's PATH.
³ WebDAV supports hashes when used with Fastmail Files, Owncloud and Nextcloud only.
³ WebDAV supports hashes when used with Fastmail Files. Owncloud and Nextcloud only.
⁴ WebDAV supports modtimes when used with Fastmail Files, Owncloud and Nextcloud only.

View File

@@ -10,26 +10,6 @@
</div>
{{end}}
<div class="card">
<div class="card-header" style="padding: 5px 15px;">
Gold Sponsors
</div>
<div class="card-body">
<a href="https://www.idrive.com/e2/?refer=rclone" target="_blank" rel="noopener" title="Visit rclone's sponsor IDrive e2"><img src="/img/logos/idrive_e2.svg" viewBox="0 0 60 55"></a><br />
</div>
</div>
{{if .IsHome}}
<div class="card">
<div class="card-header" style="padding: 5px 15px;">
Silver Sponsors
</div>
<div class="card-body">
<a href="https://min.io/persona/developers?utm_source=rclone&utm_medium=display&utm_campaign=developers-know-rclone-part-0823" target="_blank" rel="noopener" title="High Performance Object Storage, Any Cloud, Any HW, Any Workload"><img src="/img/logos/minio.svg"></a><br />
</div>
</div>
{{end}}
<div class="card">
<div class="card-header" style="padding: 5px 10px;">
Share and Enjoy
@@ -59,3 +39,14 @@
</p>
</div>
</div>
<div class="card">
<div class="card-header" style="padding: 5px 15px;">
Sponsors
</div>
<div class="card-body">
<p class="menu">
<a href="https://www.idrive.com/e2/?refer=rclone" target="_blank" rel="noopener" aria-label="Visit rclone's sponsor IDrive e2"><img src="/img/logos/idrive_e2.svg" viewBox="0 0 60 55"></a><br />
</p>
</div>
</div>

View File

@@ -1,331 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 400 120"
xml:space="preserve"
sodipodi:docname="minio.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs78"><rect
x="-12.310704"
y="130.17005"
id="rect2854" />
</defs><sodipodi:namedview
id="namedview76"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.9289873"
inkscape:cx="166.66776"
inkscape:cy="91.239585"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="text2852"
height="154px" />
<style
type="text/css"
id="style2">
.st0{fill:none;}
.st1{enable-background:new ;}
.st2{fill:#343434;}
.st3{fill:#D03850;}
.st4{clip-path:url(#SVGID_00000148662086262103992630000015539105521009494150_);}
</style>
<rect
class="st0"
width="300"
height="250"
id="rect4"
x="-8.8682652"
y="-54.99836" />
<g
class="st1"
id="g36"
transform="translate(56.286064,-62.767478)">
<path
class="st2"
d="m 50.7,119.1 v 9.4 h -3.6 v -27.7 h 3.6 v 13.5 l 2.7,-3.4 8.1,-10.2 h 4.3 l -9.7,12.1 10.3,15.6 h -4.3 l -8.4,-12.9 z"
id="path28" />
<path
class="st2"
d="m 69.6,107.9 h 3.2 l 0.2,3 c 0.3,-0.4 0.6,-0.8 1,-1.2 0.4,-0.4 0.7,-0.7 1.2,-0.9 0.6,-0.4 1.3,-0.7 2,-0.9 0.7,-0.2 1.5,-0.3 2.3,-0.4 1.1,0 2.1,0.2 2.9,0.5 0.9,0.3 1.6,0.8 2.3,1.4 0.6,0.6 1.1,1.5 1.4,2.5 0.3,1 0.5,2.2 0.5,3.6 v 13.1 H 83 v -13 c 0,-0.9 -0.1,-1.7 -0.3,-2.3 -0.2,-0.6 -0.5,-1.1 -0.9,-1.5 -0.4,-0.4 -0.9,-0.7 -1.5,-0.9 -0.6,-0.2 -1.2,-0.3 -2,-0.3 -0.6,0 -1.3,0.1 -1.8,0.3 -0.6,0.2 -1.1,0.4 -1.5,0.8 -0.4,0.3 -0.7,0.6 -1.1,1 -0.3,0.4 -0.6,0.8 -0.8,1.2 v 14.8 h -3.5 z"
id="path30" />
<path
class="st2"
d="m 91.7,113.9 c 0.4,-1.3 1.1,-2.4 1.9,-3.3 0.8,-0.9 1.8,-1.7 2.9,-2.2 1.2,-0.5 2.5,-0.8 3.9,-0.8 1.5,0 2.8,0.3 3.9,0.8 1.2,0.5 2.1,1.3 3,2.2 0.8,0.9 1.4,2 1.8,3.3 0.4,1.3 0.6,2.7 0.6,4.1 v 0.4 c 0,1.5 -0.2,2.9 -0.6,4.1 -0.4,1.2 -1,2.4 -1.8,3.3 -0.8,0.9 -1.8,1.7 -3,2.2 -1.2,0.5 -2.5,0.8 -3.9,0.8 -1.5,0 -2.8,-0.3 -3.9,-0.8 -1.2,-0.5 -2.1,-1.3 -2.9,-2.2 -0.8,-0.9 -1.4,-2 -1.9,-3.3 -0.5,-1.3 -0.6,-2.6 -0.6,-4.1 V 118 c -0.1,-1.5 0.2,-2.9 0.6,-4.1 z m 3.2,7.4 c 0.2,0.9 0.6,1.7 1.1,2.4 0.5,0.7 1.1,1.3 1.8,1.7 0.7,0.4 1.6,0.6 2.6,0.6 1,0 1.8,-0.2 2.5,-0.6 0.7,-0.4 1.3,-1 1.8,-1.7 0.5,-0.7 0.8,-1.5 1.1,-2.4 0.2,-0.9 0.4,-1.9 0.4,-2.9 V 118 c 0,-1 -0.1,-2 -0.4,-2.9 -0.2,-0.9 -0.6,-1.7 -1.1,-2.4 -0.5,-0.7 -1.1,-1.3 -1.8,-1.7 -0.7,-0.4 -1.6,-0.6 -2.6,-0.6 -1,0 -1.8,0.2 -2.6,0.6 -0.7,0.4 -1.3,1 -1.8,1.7 -0.5,0.7 -0.9,1.5 -1.1,2.4 -0.2,0.9 -0.4,1.9 -0.4,2.9 v 0.4 c 0.2,1 0.3,2 0.5,2.9 z"
id="path32" />
<path
class="st2"
d="m 112.1,107.9 h 3.1 l 2.4,13.1 0.4,3 0.5,-3 3.3,-13.1 h 2.3 l 3.3,13.1 0.6,3.2 0.5,-3.2 2.3,-13.1 h 3.1 l -4.4,20.6 h -2.8 l -3.2,-12.6 -0.5,-3.2 -0.5,3.2 -3.2,12.6 h -2.8 z"
id="path34" />
</g><g
id="g501"
transform="translate(0,-6)"><g
class="st1"
id="g26"
transform="translate(56.646962,-42.531195)">
<path
class="st2"
d="m 46.8,52.8 h 6.4 c 1.1,0 2.1,0.1 3.1,0.3 1,0.2 1.8,0.5 2.7,0.9 1.1,0.5 2.1,1.2 3,2 0.9,0.8 1.6,1.8 2.1,2.9 0.5,0.9 0.8,2 1.1,3.1 0.2,1.1 0.4,2.3 0.4,3.6 v 2 c 0,1.2 -0.1,2.4 -0.4,3.5 -0.3,1.1 -0.6,2.1 -1,3 -0.5,1 -1,1.8 -1.7,2.6 -0.7,0.8 -1.5,1.4 -2.3,2 -0.9,0.6 -1.9,1 -3.1,1.3 -1.2,0.3 -2.4,0.5 -3.7,0.5 H 47 V 52.8 Z m 3.6,24.8 h 2.8 c 1,0 1.9,-0.1 2.8,-0.4 0.9,-0.3 1.6,-0.6 2.2,-1 0.7,-0.5 1.3,-1 1.8,-1.7 0.5,-0.7 0.9,-1.4 1.2,-2.2 0.3,-0.7 0.4,-1.4 0.6,-2.2 0.1,-0.8 0.2,-1.6 0.2,-2.4 V 65.6 C 62,64.7 61.9,63.9 61.8,63.1 61.7,62.3 61.5,61.6 61.2,60.9 60.9,60 60.4,59.2 59.8,58.5 59.2,57.8 58.5,57.2 57.7,56.8 57.1,56.5 56.4,56.2 55.7,56 55,55.8 54.2,55.7 53.3,55.7 h -2.8 v 21.9 z"
id="path6" />
<path
class="st2"
d="m 74.7,80.1 c -1.2,-0.5 -2.3,-1.2 -3.1,-2.1 -0.8,-0.9 -1.5,-1.9 -2,-3.2 -0.5,-1.3 -0.7,-2.5 -0.7,-4 V 70 c 0,-1.7 0.3,-3.2 0.8,-4.5 0.5,-1.3 1.2,-2.4 2.1,-3.3 0.9,-0.9 1.9,-1.6 3,-2.1 1.1,-0.5 2.3,-0.7 3.5,-0.7 1.5,0 2.8,0.3 3.9,0.8 1.1,0.5 2,1.2 2.8,2.1 0.7,0.9 1.3,2 1.6,3.2 0.4,1.2 0.5,2.6 0.5,4 v 1.6 H 72.4 v 0.1 c 0.1,1 0.3,1.9 0.6,2.6 0.3,0.7 0.7,1.4 1.3,2 0.6,0.6 1.2,1.1 2,1.5 0.8,0.4 1.7,0.5 2.6,0.5 1.3,0 2.4,-0.3 3.4,-0.8 1,-0.5 1.8,-1.2 2.4,-2 l 2.2,1.7 c -0.7,1 -1.7,2 -3.1,2.8 -1.4,0.8 -3,1.2 -5.1,1.2 -1.4,0.2 -2.8,-0.1 -4,-0.6 z m 1.5,-17.3 c -0.6,0.3 -1.2,0.6 -1.7,1.1 -0.5,0.5 -0.9,1.1 -1.3,1.9 -0.3,0.7 -0.6,1.6 -0.7,2.5 h 11.1 v -0.2 c 0,-0.6 -0.1,-1.3 -0.4,-2 -0.2,-0.7 -0.6,-1.4 -1,-1.9 -0.4,-0.5 -1,-1 -1.6,-1.3 -0.7,-0.3 -1.4,-0.5 -2.3,-0.5 -0.8,0 -1.4,0.1 -2.1,0.4 z"
id="path8" />
<path
class="st2"
d="m 90.6,59.9 h 3.6 l 5.9,15.5 0.3,1.3 0.3,-1.3 5.8,-15.5 h 3.6 l -8.4,20.6 H 99 Z"
id="path10" />
<path
class="st2"
d="m 119.6,80.1 c -1.2,-0.5 -2.3,-1.2 -3.1,-2.1 -0.8,-0.9 -1.5,-1.9 -2,-3.2 -0.5,-1.3 -0.7,-2.5 -0.7,-4 V 70 c 0,-1.7 0.3,-3.2 0.8,-4.5 0.5,-1.3 1.2,-2.4 2.1,-3.3 0.9,-0.9 1.9,-1.6 3,-2.1 1.1,-0.5 2.3,-0.7 3.5,-0.7 1.5,0 2.8,0.3 3.9,0.8 1.1,0.5 2,1.2 2.8,2.1 0.7,0.9 1.3,2 1.6,3.2 0.4,1.2 0.5,2.6 0.5,4 v 1.6 h -14.7 v 0.1 c 0.1,1 0.3,1.9 0.6,2.6 0.3,0.7 0.7,1.4 1.3,2 0.6,0.6 1.2,1.1 2,1.5 0.8,0.4 1.7,0.5 2.6,0.5 1.3,0 2.4,-0.3 3.4,-0.8 1,-0.5 1.8,-1.2 2.4,-2 l 2.2,1.7 c -0.7,1 -1.7,2 -3.1,2.8 -1.4,0.8 -3,1.2 -5.1,1.2 -1.5,0.2 -2.8,-0.1 -4,-0.6 z m 1.5,-17.3 c -0.6,0.3 -1.2,0.6 -1.7,1.1 -0.5,0.5 -0.9,1.1 -1.3,1.9 -0.3,0.7 -0.6,1.6 -0.7,2.5 h 11.1 v -0.2 c 0,-0.6 -0.1,-1.3 -0.4,-2 -0.2,-0.7 -0.6,-1.4 -1,-1.9 -0.4,-0.5 -1,-1 -1.6,-1.3 -0.7,-0.3 -1.4,-0.5 -2.3,-0.5 -0.8,0 -1.5,0.1 -2.1,0.4 z"
id="path12" />
<path
class="st2"
d="m 148,51.2 v 26.2 h 6.7 v 3 h -17.3 v -3 h 7 V 54.3 h -7 v -3.1 z"
id="path14" />
<path
class="st2"
d="m 159,65.9 c 0.4,-1.3 1.1,-2.4 1.9,-3.3 0.8,-0.9 1.8,-1.7 2.9,-2.2 1.2,-0.5 2.5,-0.8 3.9,-0.8 1.5,0 2.8,0.3 3.9,0.8 1.2,0.5 2.1,1.3 3,2.2 0.8,0.9 1.4,2 1.8,3.3 0.4,1.3 0.6,2.7 0.6,4.1 v 0.4 c 0,1.5 -0.2,2.9 -0.6,4.1 -0.4,1.2 -1,2.4 -1.8,3.3 -0.8,0.9 -1.8,1.7 -3,2.2 -1.2,0.5 -2.5,0.8 -3.9,0.8 -1.5,0 -2.8,-0.3 -3.9,-0.8 -1.1,-0.5 -2.1,-1.3 -2.9,-2.2 -0.8,-0.9 -1.4,-2 -1.9,-3.3 -0.5,-1.3 -0.6,-2.6 -0.6,-4.1 V 70 c -0.1,-1.5 0.1,-2.9 0.6,-4.1 z m 3.2,7.4 c 0.2,0.9 0.6,1.7 1.1,2.4 0.5,0.7 1.1,1.3 1.8,1.7 0.7,0.4 1.6,0.6 2.6,0.6 1,0 1.8,-0.2 2.5,-0.6 0.7,-0.4 1.3,-1 1.8,-1.7 0.5,-0.7 0.8,-1.5 1.1,-2.4 0.2,-0.9 0.4,-1.9 0.4,-2.9 V 70 c 0,-1 -0.1,-2 -0.4,-2.9 -0.2,-0.9 -0.6,-1.7 -1.1,-2.4 -0.5,-0.7 -1.1,-1.3 -1.8,-1.7 -0.7,-0.4 -1.6,-0.6 -2.6,-0.6 -1,0 -1.8,0.2 -2.6,0.6 -0.7,0.4 -1.3,1 -1.8,1.7 -0.5,0.7 -0.9,1.5 -1.1,2.4 -0.2,0.9 -0.4,1.9 -0.4,2.9 v 0.4 c 0.1,1 0.3,2 0.5,2.9 z"
id="path16" />
<path
class="st2"
d="m 181.7,59.9 h 3.2 l 0.2,2.2 c 0.3,-0.4 0.6,-0.7 0.9,-1 0.3,-0.3 0.7,-0.5 1.1,-0.7 0.5,-0.3 1.1,-0.5 1.8,-0.7 0.7,-0.2 1.4,-0.2 2.1,-0.2 1.3,0 2.5,0.3 3.5,0.8 1,0.5 1.9,1.2 2.6,2.2 0.7,1 1.2,2 1.6,3.3 0.4,1.3 0.5,2.7 0.5,4.2 v 0.4 c 0,1.5 -0.2,2.8 -0.5,4.1 -0.4,1.3 -0.9,2.4 -1.6,3.3 -0.7,0.9 -1.5,1.7 -2.5,2.2 -1,0.5 -2.2,0.8 -3.5,0.8 -0.8,0 -1.5,-0.1 -2.2,-0.2 -0.7,-0.2 -1.3,-0.4 -1.8,-0.7 -0.3,-0.2 -0.6,-0.4 -0.9,-0.6 -0.3,-0.2 -0.6,-0.5 -0.8,-0.8 v 9.9 h -3.5 V 59.9 Z m 13.6,7.3 c -0.2,-0.9 -0.6,-1.7 -1,-2.4 -0.5,-0.7 -1.1,-1.2 -1.8,-1.6 -0.7,-0.4 -1.6,-0.6 -2.6,-0.6 -0.5,0 -1.1,0.1 -1.5,0.2 -0.5,0.1 -0.9,0.3 -1.2,0.6 -0.4,0.2 -0.8,0.5 -1.1,0.9 -0.3,0.4 -0.6,0.7 -0.8,1.2 v 9.9 c 0.2,0.4 0.5,0.7 0.7,1.1 0.2,0.4 0.6,0.6 1,0.8 0.4,0.3 0.9,0.5 1.4,0.6 0.5,0.1 1.1,0.2 1.7,0.2 1,0 1.8,-0.2 2.5,-0.6 0.7,-0.4 1.3,-1 1.8,-1.7 0.5,-0.7 0.8,-1.5 1,-2.4 0.2,-0.9 0.3,-1.9 0.3,-2.9 V 70 c -0.1,-1 -0.2,-1.9 -0.4,-2.8 z"
id="path18" />
<path
class="st2"
d="m 209.3,80.1 c -1.2,-0.5 -2.3,-1.2 -3.1,-2.1 -0.8,-0.9 -1.5,-1.9 -2,-3.2 -0.5,-1.3 -0.7,-2.5 -0.7,-4 V 70 c 0,-1.7 0.3,-3.2 0.8,-4.5 0.5,-1.3 1.2,-2.4 2.1,-3.3 0.9,-0.9 1.9,-1.6 3,-2.1 1.1,-0.5 2.3,-0.7 3.5,-0.7 1.5,0 2.8,0.3 3.9,0.8 1.1,0.5 2,1.2 2.8,2.1 0.7,0.9 1.3,2 1.6,3.2 0.4,1.2 0.5,2.6 0.5,4 v 1.6 H 207 v 0.1 c 0.1,1 0.3,1.9 0.6,2.6 0.3,0.8 0.7,1.4 1.3,2 0.6,0.6 1.2,1.1 2,1.5 0.8,0.4 1.7,0.5 2.6,0.5 1.3,0 2.4,-0.3 3.4,-0.8 1,-0.5 1.8,-1.2 2.4,-2 l 2.2,1.7 c -0.7,1 -1.7,2 -3.1,2.8 -1.4,0.8 -3.1,1.2 -5.1,1.2 -1.5,0.2 -2.8,-0.1 -4,-0.6 z m 1.5,-17.3 c -0.6,0.3 -1.2,0.6 -1.7,1.1 -0.5,0.5 -0.9,1.1 -1.3,1.9 -0.3,0.7 -0.6,1.6 -0.7,2.5 h 11.1 v -0.2 c 0,-0.6 -0.1,-1.3 -0.4,-2 -0.2,-0.7 -0.6,-1.4 -1,-1.9 -0.4,-0.5 -1,-1 -1.6,-1.3 -0.7,-0.3 -1.4,-0.5 -2.3,-0.5 -0.8,0 -1.5,0.1 -2.1,0.4 z"
id="path20" />
<path
class="st2"
d="m 242.1,59.6 c 0.7,0.1 1.2,0.2 1.6,0.4 l -0.5,3.4 c -0.7,-0.2 -1.3,-0.3 -2,-0.3 -0.6,-0.1 -1.3,-0.1 -1.9,-0.1 -0.9,0 -1.6,0.1 -2.3,0.3 -0.7,0.2 -1.3,0.5 -1.8,0.9 -0.5,0.4 -0.9,0.8 -1.2,1.3 -0.3,0.5 -0.6,1.1 -0.9,1.7 v 13.2 h -3.5 V 59.9 h 3.4 l 0.2,2.8 v 0.5 c 0.8,-1.1 1.8,-2 3,-2.7 1.2,-0.7 2.5,-1 4,-1 0.5,0 1.2,0.1 1.9,0.1 z"
id="path22" />
<path
class="st2"
d="m 262.5,73.9 c -0.2,-0.3 -0.4,-0.6 -0.8,-0.9 -0.4,-0.3 -0.9,-0.5 -1.6,-0.8 -0.6,-0.2 -1.5,-0.4 -2.4,-0.6 -1.2,-0.2 -2.3,-0.5 -3.2,-0.9 -1,-0.3 -1.8,-0.8 -2.5,-1.2 -0.7,-0.5 -1.2,-1 -1.6,-1.7 -0.4,-0.6 -0.6,-1.4 -0.6,-2.2 0,-0.8 0.2,-1.6 0.6,-2.4 0.4,-0.7 0.9,-1.4 1.7,-1.9 0.7,-0.5 1.6,-1 2.5,-1.3 1,-0.3 2.1,-0.5 3.2,-0.5 1.3,0 2.4,0.2 3.4,0.5 1,0.3 1.9,0.8 2.6,1.4 0.7,0.6 1.3,1.3 1.6,2 0.4,0.8 0.6,1.6 0.6,2.5 h -3.5 c 0,-0.4 -0.1,-0.9 -0.3,-1.3 -0.2,-0.4 -0.5,-0.8 -1,-1.1 -0.5,-0.3 -0.9,-0.6 -1.5,-0.8 -0.6,-0.2 -1.2,-0.3 -2,-0.3 -0.7,0 -1.4,0.1 -2,0.2 -0.6,0.2 -1,0.4 -1.4,0.7 -0.4,0.3 -0.7,0.6 -0.9,1 -0.2,0.4 -0.3,0.7 -0.3,1.1 0,0.4 0.1,0.8 0.2,1.1 0.1,0.3 0.4,0.6 0.8,0.9 0.4,0.3 0.9,0.5 1.5,0.7 0.6,0.2 1.4,0.4 2.4,0.6 1.3,0.3 2.4,0.6 3.4,0.9 1,0.3 1.8,0.8 2.5,1.2 0.7,0.5 1.2,1.1 1.6,1.7 0.4,0.6 0.5,1.4 0.5,2.2 0,0.9 -0.2,1.7 -0.6,2.5 -0.4,0.8 -1,1.4 -1.7,1.9 -0.7,0.5 -1.6,0.9 -2.6,1.2 -1,0.3 -2.2,0.4 -3.4,0.4 -1.4,0 -2.6,-0.2 -3.7,-0.6 -1.1,-0.4 -2,-0.9 -2.8,-1.5 -0.8,-0.6 -1.3,-1.3 -1.7,-2.1 -0.4,-0.8 -0.6,-1.7 -0.6,-2.5 h 3.5 c 0.1,0.7 0.2,1.3 0.6,1.8 0.3,0.5 0.8,0.9 1.3,1.2 0.5,0.3 1,0.5 1.7,0.6 0.6,0.1 1.2,0.2 1.8,0.2 0.9,0 1.8,-0.1 2.5,-0.3 0.7,-0.2 1.2,-0.5 1.6,-0.9 0.2,-0.2 0.4,-0.5 0.6,-0.8 0.2,-0.3 0.2,-0.6 0.2,-0.9 0,-0.3 -0.1,-0.7 -0.2,-1 z"
id="path24" />
</g><g
class="st1"
id="g40"
transform="translate(56.646962,-42.531195)">
<path
class="st2"
d="m 23.2,69.1 v 0.4 l -5.5,7.2 h -2.6 l 4.8,-7.4 -4.8,-7.4 h 2.6 z"
id="path38" />
</g></g><g
id="g486"
transform="translate(0.36089765,-41.096058)"><g
transform="translate(102.60296,110.71581)"
id="g64">
<rect
x="59.799999"
y="0.69999999"
class="st3"
width="10.3"
height="30.299999"
id="rect42" />
<g
id="g62">
<g
id="g60">
<defs
id="defs45"><rect
id="SVGID_1_"
x="0"
y="0"
width="184.60001"
height="31.6" /></defs>
<clipPath
id="SVGID_00000095313647804014869330000001592249187272067725_">
<use
xlink:href="#SVGID_1_"
style="overflow:visible"
id="use47"
x="0"
y="0"
width="100%"
height="100%" />
</clipPath>
<g
clip-path="url(#SVGID_00000095313647804014869330000001592249187272067725_)"
id="g58">
<path
class="st3"
d="m 47.3,1 -21,12.8 c -0.3,0.2 -0.7,0.2 -1,0 L 4.4,1 C 3.9,0.7 3.4,0.6 2.9,0.6 v 0 C 1.3,0.5 0,1.8 0,3.4 v 27.5 h 10.3 v -13 c 0,-0.6 0.5,-1 1,-1 0.2,0 0.4,0.1 0.5,0.2 l 11.8,7.2 c 1.2,0.7 2.6,0.7 3.8,0 L 39.9,17 c 0.5,-0.3 1.1,-0.1 1.4,0.4 0.1,0.2 0.1,0.3 0.1,0.5 V 31 H 51.7 V 3.4 c 0,-1.6 -1.3,-2.9 -2.9,-2.9 v 0 c -0.5,0 -1,0.2 -1.5,0.5"
id="path50" />
<path
class="st3"
d="m 121.7,0.7 h -10.5 v 13.9 c 0,0.6 -0.5,1 -1,1 -0.2,0 -0.3,0 -0.5,-0.1 L 82.6,1 C 82.2,0.8 81.7,0.7 81.2,0.7 v 0 C 79.6,0.7 78.3,2 78.3,3.6 V 31 H 88.7 V 17.3 c 0,-0.6 0.5,-1 1,-1 0.2,0 0.3,0 0.5,0.1 l 27.3,14.5 c 1.4,0.7 3.1,0.2 3.9,-1.2 0.2,-0.4 0.3,-0.9 0.3,-1.3 z"
id="path52" />
<rect
x="130.10001"
y="0.69999999"
class="st3"
width="4.8000002"
height="30.299999"
id="rect54" />
<path
class="st3"
d="m 162.6,31.6 c -12.8,0 -21.9,-6.1 -21.9,-15.8 0,-9.7 9.1,-15.8 21.9,-15.8 12.8,0 21.9,6.1 21.9,15.8 0,9.7 -8.9,15.8 -21.9,15.8 m 0,-27.6 c -9.5,0 -16.8,4.2 -16.8,11.8 0,7.7 7.3,11.8 16.8,11.8 9.5,0 16.9,-4.1 16.9,-11.8 C 179.5,8.2 172.1,4 162.6,4"
id="path56" />
</g>
</g>
</g>
</g><g
transform="translate(102.60296,110.71581)"
id="g68">
<rect
x="59.799999"
y="0.69999999"
class="st3"
width="10.3"
height="30.299999"
id="rect66" />
</g><path
class="st2"
d="m 334.64696,144.8688 h -30.2 v -5 h 30.2 z"
id="path70" /></g>
<g
aria-label="High Performance Object Storage, Any Cloud, Any HW, Any Workload"
transform="translate(16,-26)"
id="text2852"
style="font-weight:bold;font-size:10.2667px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:'FreeMono, Bold';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2854);stroke-width:1px"><path
d="m -8.2654672,139.66662 q -0.6776021,0 -0.6776021,-0.51334 0,-0.51333 0.6776021,-0.51333 h 0.1540005 v -1.44761 H -10.30854 v 1.44761 h 0.154 q 0.6776023,0 0.6776023,0.51333 0,0.51334 -0.6776023,0.51334 h -1.242271 q -0.677602,0 -0.677602,-0.51334 0,-0.29773 0.174534,-0.4004 0.174534,-0.11293 0.503068,-0.11293 h 0.0616 v -3.93215 q -0.533869,-0.0513 -0.533869,-0.51333 0,-0.29774 0.174534,-0.4004 0.174534,-0.11294 0.503068,-0.11294 h 1.036937 q 0.6776023,0 0.6776023,0.51334 0,0.51333 -0.6776023,0.51333 h -0.154 v 1.45787 h 2.1970733 v -1.45787 h -0.1540005 q -0.6776021,0 -0.6776021,-0.51333 0,-0.29774 0.1745339,-0.4004 0.1745338,-0.11294 0.5030682,-0.11294 h 1.0369367 q 0.6776022,0 0.6776022,0.51334 0,0.462 -0.5338684,0.51333 v 3.93215 h 0.0616 q 0.6776022,0 0.6776022,0.51333 0,0.51334 -0.6776022,0.51334 z"
id="path46819" /><path
d="m -1.3046604,138.63995 q 0.67760215,0 0.67760215,0.51333 0,0.51334 -0.67760215,0.51334 h -3.5317448 q -0.6776021,0 -0.6776021,-0.51334 0,-0.29773 0.1745338,-0.4004 0.1745339,-0.11293 0.5030683,-0.11293 h 1.2525374 v -2.43321 h -0.8008026 q -0.6878689,0 -0.6878689,-0.51333 0,-0.308 0.1745339,-0.41067 0.1848006,-0.10267 0.513335,-0.10267 h 1.8274726 v 3.45988 z m -1.3962712,-5.36948 v 1.078 h -1.2114706 v -1.078 z"
id="path46821" /><path
d="m 1.4570661,141.20662 q 0,-0.29773 0.1745339,-0.41066 0.1745339,-0.10267 0.5030683,-0.10267 h 1.1190702 q 0.4517348,0 0.7084023,-0.2156 0.2566675,-0.2156 0.2566675,-0.60574 v -0.56467 q -0.6776022,0.50307 -1.4476047,0.50307 -1.0369366,0 -1.7350722,-0.6776 -0.6878689,-0.68787 -0.6878689,-1.70427 0,-1.02667 0.6878689,-1.70427 0.6981356,-0.68787 1.7350722,-0.68787 0.8418694,0 1.4476047,0.51333 v -0.3696 h 1.1909372 q 0.6776022,0 0.6776022,0.51334 0,0.51333 -0.6776022,0.51333 H 5.2454783 v 3.66521 q 0,0.81107 -0.5646685,1.32441 -0.5544018,0.5236 -1.3962712,0.5236 H 2.1346683 q -0.6776022,0 -0.6776022,-0.51334 z m 1.3346709,-5.14361 q -0.5852018,0 -1.0061365,0.4004 -0.410668,0.39013 -0.410668,0.9548 0,0.56467 0.410668,0.96507 0.4209347,0.4004 1.0061365,0.4004 0.5852019,0 1.0061366,-0.39013 0.4209347,-0.4004 0.4209347,-0.9548 0,-0.57494 -0.4209347,-0.97534 -0.410668,-0.4004 -1.0061366,-0.4004 z"
id="path46823" /><path
d="m 6.3029331,133.7838 q 0,-0.51333 0.6776022,-0.51333 h 1.1909372 v 2.4024 q 0.616002,-0.62627 1.4065378,-0.62627 0.8213357,0 1.3141377,0.47227 0.503068,0.462 0.503068,1.23201 v 1.88907 h 0.0616 q 0.677603,0 0.677603,0.51333 0,0.51334 -0.677603,0.51334 h -1.14987 q -0.6878689,0 -0.6878689,-0.51334 0,-0.51333 0.6878689,-0.51333 h 0.0616 v -1.75561 q 0,-0.39013 -0.1848,-0.59547 -0.174534,-0.2156 -0.7186693,-0.2156 -0.3593345,0 -0.6057353,0.13347 -0.2464008,0.13347 -0.6878689,0.5544 v 1.87881 h 0.0616 q 0.6878689,0 0.6878689,0.51333 0,0.51334 -0.6878689,0.51334 H 7.0832023 q -0.6776022,0 -0.6776022,-0.51334 0,-0.51333 0.6776022,-0.51333 h 0.0616 v -4.34281 H 6.9805353 q -0.3285344,0 -0.5030683,-0.10267 -0.1745339,-0.11294 -0.1745339,-0.41067 z"
id="path46825" /><path
d="m 23.920558,135.62154 q 0,0.2772 -0.0616,0.53387 -0.0616,0.25667 -0.236134,0.53387 -0.174534,0.26693 -0.441468,0.47226 -0.256667,0.19507 -0.698135,0.32854 -0.431202,0.1232 -0.99587,0.1232 h -1.006137 v 1.02667 h 1.016403 q 0.677603,0 0.677603,0.51333 0,0.51334 -0.677603,0.51334 h -2.197073 q -0.677603,0 -0.677603,-0.51334 0,-0.51333 0.677603,-0.51333 h 0.154 v -3.93215 h -0.154 q -0.677603,0 -0.677603,-0.51333 0,-0.29774 0.174534,-0.4004 0.174534,-0.11294 0.503069,-0.11294 h 2.392141 q 0.975336,0 1.601605,0.54414 0.626269,0.54413 0.626269,1.39627 z m -3.439345,-0.91374 v 1.87881 h 1.211471 q 0.533868,0 0.831602,-0.2464 0.308001,-0.25667 0.308001,-0.68787 0,-0.44147 -0.308001,-0.68787 -0.297734,-0.25667 -0.831602,-0.25667 z"
id="path46827" /><path
d="m 30.296164,138.97875 q 0,0.32853 -0.595469,0.54414 -0.595468,0.20533 -1.11907,0.25666 -0.513335,0.0513 -0.882936,0.0513 -1.190937,0 -1.950673,-0.66734 -0.759736,-0.66733 -0.759736,-1.71454 0,-1.0164 0.759736,-1.70427 0.770002,-0.69814 1.889073,-0.69814 1.14987,0 1.899339,0.69814 0.759736,0.69814 0.759736,1.75561 v 0.4004 H 26.10735 q 0.349068,0.90347 1.683739,0.90347 0.544135,0 1.211471,-0.16427 0.667335,-0.17453 0.800802,-0.17453 0.205334,0 0.349068,0.154 0.143734,0.14373 0.143734,0.35933 z m -4.158014,-1.98147 h 3.01841 q -0.1232,-0.42094 -0.533868,-0.66734 -0.410668,-0.25667 -0.975337,-0.25667 -0.564668,0 -0.985603,0.25667 -0.410668,0.25667 -0.523602,0.66734 z"
id="path46829" /><path
d="m 35.378164,135.05687 q 0.431201,0 0.862403,0.26694 0.431201,0.26693 0.431201,0.60573 0,0.2156 -0.154,0.3696 -0.154001,0.154 -0.359335,0.154 -0.174534,0 -0.400401,-0.1848 -0.225868,-0.1848 -0.400401,-0.1848 -0.246401,0 -0.605736,0.22587 -0.349067,0.2156 -1.08827,0.82133 v 1.50921 h 1.427071 q 0.687869,0 0.687869,0.51333 0,0.51334 -0.687869,0.51334 h -3.049209 q -0.677603,0 -0.677603,-0.51334 0,-0.29773 0.174534,-0.4004 0.174534,-0.11293 0.503069,-0.11293 h 0.595468 v -2.43321 h -0.359334 q -0.677603,0 -0.677603,-0.51333 0,-0.51334 0.677603,-0.51334 h 1.386004 v 0.66734 q 0.616002,-0.462 0.975337,-0.62627 0.359334,-0.16427 0.739202,-0.16427 z"
id="path46831" /><path
d="m 40.994033,133.27047 q 1.837739,0 1.837739,0.6468 0,0.22586 -0.143734,0.37987 -0.133467,0.14373 -0.338801,0.14373 -0.05133,0 -0.564669,-0.0719 -0.503068,-0.0719 -0.882936,-0.0719 -0.862403,0 -0.862403,0.50306 v 0.37987 h 1.550272 q 0.677602,0 0.677602,0.51334 0,0.51333 -0.677602,0.51333 h -1.550272 v 2.43321 h 1.427072 q 0.677602,0 0.677602,0.51333 0,0.51334 -0.677602,0.51334 h -3.04921 q -0.677602,0 -0.677602,-0.51334 0,-0.29773 0.174534,-0.4004 0.174534,-0.11293 0.503068,-0.11293 h 0.595468 v -2.43321 h -0.482534 q -0.677603,0 -0.677603,-0.51333 0,-0.308 0.174534,-0.41067 0.184801,-0.10267 0.513335,-0.10267 h 0.472268 v -0.37987 q 0,-0.7084 0.533869,-1.11907 0.533868,-0.41066 1.447605,-0.41066 z"
id="path46833" /><path
d="m 46.2403,135.0466 q 1.08827,0 1.848006,0.69814 0.770002,0.69814 0.770002,1.69401 0,1.00613 -0.770002,1.70427 -0.770003,0.68787 -1.878806,0.68787 -1.108804,0 -1.878806,-0.68787 -0.770003,-0.69814 -0.770003,-1.70427 0,-1.01641 0.770003,-1.70428 0.770002,-0.68787 1.909606,-0.68787 z m -0.01027,1.02667 q -0.698135,0 -1.170404,0.39014 -0.472268,0.39013 -0.472268,0.97534 0,0.57493 0.462002,0.97533 0.472268,0.39014 1.160137,0.39014 0.687869,0 1.14987,-0.39014 0.472268,-0.4004 0.472268,-0.97533 0,-0.57494 -0.472268,-0.96507 -0.462001,-0.40041 -1.129337,-0.40041 z"
id="path46835" /><path
d="m 53.858175,135.05687 q 0.431201,0 0.862403,0.26694 0.431201,0.26693 0.431201,0.60573 0,0.2156 -0.154,0.3696 -0.154001,0.154 -0.359335,0.154 -0.174534,0 -0.400401,-0.1848 -0.225868,-0.1848 -0.400401,-0.1848 -0.246401,0 -0.605736,0.22587 -0.349068,0.2156 -1.08827,0.82133 v 1.50921 h 1.427071 q 0.687869,0 0.687869,0.51333 0,0.51334 -0.687869,0.51334 h -3.049209 q -0.677603,0 -0.677603,-0.51334 0,-0.29773 0.174534,-0.4004 0.174534,-0.11293 0.503069,-0.11293 h 0.595468 v -2.43321 h -0.359334 q -0.677603,0 -0.677603,-0.51333 0,-0.51334 0.677603,-0.51334 h 1.386004 v 0.66734 q 0.616002,-0.462 0.975337,-0.62627 0.359334,-0.16427 0.739202,-0.16427 z"
id="path46837" /><path
d="m 55.942303,139.66662 q -0.687869,0 -0.687869,-0.51334 0,-0.51333 0.616002,-0.51333 v -2.43321 q -0.616002,-0.0205 -0.616002,-0.51333 0,-0.51334 0.687869,-0.51334 h 0.954803 v 0.2464 q 0.472268,-0.37987 0.872669,-0.37987 0.585202,0 1.047204,0.50307 0.462001,-0.50307 1.067736,-0.50307 0.574936,0 0.954803,0.39014 0.390135,0.37987 0.390135,0.9548 v 2.24841 q 0.616002,0 0.616002,0.51333 0,0.51334 -0.677602,0.51334 h -0.96507 v -3.19294 q 0,-0.22587 -0.08213,-0.30801 -0.07187,-0.0924 -0.2772,-0.0924 -0.205334,0 -0.369602,0.0924 -0.154,0.0924 -0.410668,0.36961 v 2.10467 q 0.287468,0 0.451735,0.14373 0.164267,0.13347 0.164267,0.3696 0,0.51334 -0.677602,0.51334 h -0.96507 v -3.19294 q 0,-0.21561 -0.08213,-0.30801 -0.08213,-0.0924 -0.277201,-0.0924 -0.369601,0 -0.780269,0.46201 v 2.10467 q 0.626268,0 0.626268,0.51333 0,0.51334 -0.677602,0.51334 z"
id="path46839" /><path
d="m 62.040706,138.44488 q 0,-0.69813 0.687869,-1.21147 0.687869,-0.5236 1.796672,-0.5236 0.462002,0 1.067737,0.10267 v -0.23614 q 0,-0.50307 -0.954803,-0.50307 -0.420935,0 -0.954803,0.1232 -0.533868,0.11294 -0.646802,0.11294 -0.215601,0 -0.359335,-0.14374 -0.143733,-0.154 -0.143733,-0.37986 0,-0.32854 0.308001,-0.4312 0.872669,-0.30801 1.765872,-0.30801 0.944536,0 1.478405,0.40041 0.544135,0.4004 0.544135,1.11907 v 2.07387 h 0.164267 q 0.677602,0 0.677602,0.51333 0,0.51334 -0.677602,0.51334 h -1.201204 v -0.23613 q -0.770002,0.4004 -1.704272,0.4004 -0.759736,0 -1.303871,-0.4004 -0.544135,-0.41067 -0.544135,-0.98561 z m 3.562545,-0.16427 v -0.51333 q -0.646802,-0.11293 -1.139604,-0.11293 -0.523601,0 -0.934269,0.22586 -0.400402,0.22587 -0.400402,0.52361 0,0.17453 0.225868,0.28746 0.225867,0.11294 0.554401,0.11294 0.84187,0 1.694006,-0.52361 z"
id="path46841" /><path
d="m 68.683245,139.66662 q -0.677603,0 -0.677603,-0.51334 0,-0.51333 0.677603,-0.51333 h 0.0616 v -2.43321 q -0.626269,-0.0205 -0.626269,-0.51333 0,-0.51334 0.687869,-0.51334 h 0.96507 v 0.4928 q 0.369601,-0.34906 0.677602,-0.48253 0.308001,-0.14374 0.728936,-0.14374 0.800802,0 1.314137,0.45174 0.513335,0.45173 0.513335,1.27307 v 1.86854 q 0.626269,0 0.626269,0.51333 0,0.51334 -0.677602,0.51334 h -0.913737 q -0.687868,0 -0.687868,-0.51334 0,-0.51333 0.626268,-0.51333 v -1.82747 q 0,-0.73921 -0.924003,-0.73921 -0.359334,0 -0.646802,0.154 -0.277201,0.15401 -0.636535,0.54414 v 1.86854 h 0.0616 q 0.677602,0 0.677602,0.51333 0,0.51334 -0.677602,0.51334 z"
id="path46843" /><path
d="m 79.47353,136.51474 q 0,0.6776 -0.513335,0.6776 -0.277201,0 -0.390135,-0.154 -0.102667,-0.154 -0.164267,-0.37986 -0.0616,-0.22587 -0.205334,-0.32854 -0.420935,-0.25667 -1.08827,-0.25667 -0.728936,0 -1.170404,0.41067 -0.431201,0.4004 -0.431201,1.05747 0,1.26281 1.806939,1.26281 0.544135,0 0.90347,-0.0924 0.359334,-0.0924 0.482534,-0.19507 0.133468,-0.10267 0.256668,-0.19507 0.133467,-0.0924 0.256667,-0.0924 0.205334,0 0.359335,0.154 0.154,0.154 0.154,0.3696 0,0.44147 -0.687868,0.75974 -0.677603,0.31827 -1.796673,0.31827 -0.636535,0 -1.139604,-0.14374 -0.492801,-0.14373 -0.790536,-0.3696 -0.297734,-0.23613 -0.492801,-0.54413 -0.195067,-0.308 -0.266934,-0.60574 -0.07187,-0.308 -0.07187,-0.62627 0,-1.09853 0.728935,-1.79667 0.739203,-0.69814 1.89934,-0.69814 0.882936,0 1.478405,0.30801 0.0924,-0.30801 0.390134,-0.30801 0.492802,0 0.492802,0.67761 z"
id="path46845" /><path
d="m 85.736201,138.97875 q 0,0.32853 -0.595469,0.54414 -0.595469,0.20533 -1.11907,0.25666 -0.513335,0.0513 -0.882936,0.0513 -1.190938,0 -1.950673,-0.66734 -0.759736,-0.66733 -0.759736,-1.71454 0,-1.0164 0.759736,-1.70427 0.770002,-0.69814 1.889072,-0.69814 1.149871,0 1.89934,0.69814 0.759736,0.69814 0.759736,1.75561 v 0.4004 h -4.188814 q 0.349068,0.90347 1.683739,0.90347 0.544135,0 1.21147,-0.16427 0.667336,-0.17453 0.800803,-0.17453 0.205334,0 0.349068,0.154 0.143734,0.14373 0.143734,0.35933 z m -4.158014,-1.98147 h 3.01841 q -0.123201,-0.42094 -0.533868,-0.66734 -0.410668,-0.25667 -0.975337,-0.25667 -0.564668,0 -0.985603,0.25667 -0.410668,0.25667 -0.523602,0.66734 z"
id="path46847" /><path
d="m 95.489533,133.5374 q 0.225867,0 0.533868,0.0719 0.308001,0.0616 0.728936,0.2772 0.431201,0.2156 0.770003,0.54413 0.349067,0.32854 0.585201,0.93427 0.246401,0.59547 0.246401,1.35521 0,1.2628 -0.852136,2.17654 -0.841869,0.91373 -2.012273,0.91373 -1.190937,0 -2.032807,-0.91373 -0.831602,-0.92401 -0.831602,-2.22788 0,-1.2936 0.841869,-2.20734 0.841869,-0.924 2.02254,-0.924 z m 0,1.02667 q -0.749469,0 -1.293604,0.62627 -0.544135,0.616 -0.544135,1.4784 0,0.87267 0.533868,1.49894 0.544135,0.616 1.303871,0.616 0.749469,0 1.293604,-0.616 0.544135,-0.616 0.544135,-1.46814 0,-0.88293 -0.544135,-1.5092 -0.533868,-0.62627 -1.293604,-0.62627 z"
id="path46849" /><path
d="m 98.487393,133.7838 q 0,-0.51333 0.677602,-0.51333 h 1.190935 v 2.2792 q 0.6468,-0.51333 1.54001,-0.51333 1.16013,0 1.848,0.68787 0.68787,0.6776 0.68787,1.70427 0,1.02667 -0.69813,1.70427 -0.69814,0.6776 -1.82748,0.6776 -0.82133,0 -1.55027,-0.50307 v 0.35934 h -1.190935 q -0.677602,0 -0.677602,-0.51334 0,-0.29773 0.174534,-0.4004 0.174534,-0.11293 0.503068,-0.11293 h 0.164267 v -4.34281 h -0.164267 q -0.328534,0 -0.503068,-0.10267 -0.174534,-0.11294 -0.174534,-0.41067 z m 3.398277,2.27921 q -0.69813,0 -1.11907,0.39013 -0.41067,0.37987 -0.41067,0.95481 0,0.60573 0.42094,0.99587 0.4312,0.37986 1.1088,0.37986 0.66734,0 1.08827,-0.37986 0.4312,-0.39014 0.4312,-0.98561 0,-0.57493 -0.42093,-0.96507 -0.42094,-0.39013 -1.09854,-0.39013 z"
id="path46851" /><path
d="m 105.62273,141.20662 q 0,-0.29773 0.17454,-0.41066 0.1848,-0.10267 0.50307,-0.10267 h 1.1396 q 0.45173,0 0.7084,-0.2156 0.25667,-0.2156 0.25667,-0.60574 v -3.66521 h -2.07387 q -0.67761,0 -0.67761,-0.51333 0,-0.29774 0.17454,-0.4004 0.17453,-0.11294 0.50307,-0.11294 h 3.10054 v 4.69188 q 0,0.80081 -0.56467,1.32441 -0.5544,0.5236 -1.39627,0.5236 h -1.1704 q -0.67761,0 -0.67761,-0.51334 z m 3.21348,-7.93615 v 1.078 h -1.22174 v -1.078 z"
id="path46853" /><path
d="m 116.53622,138.97875 q 0,0.32853 -0.59547,0.54414 -0.59547,0.20533 -1.11907,0.25666 -0.51333,0.0513 -0.88294,0.0513 -1.19093,0 -1.95067,-0.66734 -0.75973,-0.66733 -0.75973,-1.71454 0,-1.0164 0.75973,-1.70427 0.77,-0.69814 1.88907,-0.69814 1.14987,0 1.89934,0.69814 0.75974,0.69814 0.75974,1.75561 v 0.4004 h -4.18881 q 0.34906,0.90347 1.68373,0.90347 0.54414,0 1.21147,-0.16427 0.66734,-0.17453 0.80081,-0.17453 0.20533,0 0.34907,0.154 0.14373,0.14373 0.14373,0.35933 z m -4.15801,-1.98147 h 3.01841 q -0.12321,-0.42094 -0.53387,-0.66734 -0.41067,-0.25667 -0.97534,-0.25667 -0.56467,0 -0.9856,0.25667 -0.41067,0.25667 -0.5236,0.66734 z"
id="path46855" /><path
d="m 122.59356,136.51474 q 0,0.6776 -0.51333,0.6776 -0.2772,0 -0.39014,-0.154 -0.10266,-0.154 -0.16426,-0.37986 -0.0616,-0.22587 -0.20534,-0.32854 -0.42093,-0.25667 -1.08827,-0.25667 -0.72893,0 -1.1704,0.41067 -0.4312,0.4004 -0.4312,1.05747 0,1.26281 1.80694,1.26281 0.54413,0 0.90347,-0.0924 0.35933,-0.0924 0.48253,-0.19507 0.13347,-0.10267 0.25667,-0.19507 0.13347,-0.0924 0.25667,-0.0924 0.20533,0 0.35933,0.154 0.154,0.154 0.154,0.3696 0,0.44147 -0.68787,0.75974 -0.6776,0.31827 -1.79667,0.31827 -0.63654,0 -1.1396,-0.14374 -0.49281,-0.14373 -0.79054,-0.3696 -0.29773,-0.23613 -0.4928,-0.54413 -0.19507,-0.308 -0.26694,-0.60574 -0.0719,-0.308 -0.0719,-0.62627 0,-1.09853 0.72893,-1.79667 0.73921,-0.69814 1.89934,-0.69814 0.88294,0 1.47841,0.30801 0.0924,-0.30801 0.39013,-0.30801 0.4928,0 0.4928,0.67761 z"
id="path46857" /><path
d="m 125.40662,138.21901 q 0,0.31827 0.17454,0.45174 0.17453,0.13347 0.7084,0.13347 0.4004,0 0.72893,-0.0719 0.33881,-0.0719 0.50307,-0.154 0.17454,-0.0924 0.3388,-0.16427 0.17454,-0.0719 0.28747,-0.0719 0.20534,0 0.34907,0.15401 0.14373,0.154 0.14373,0.3696 0,0.28746 -0.44146,0.5236 -0.43121,0.22587 -0.96507,0.32853 -0.52361,0.11294 -0.95481,0.11294 -0.87267,0 -1.386,-0.37987 -0.51334,-0.37987 -0.51334,-1.03694 v -2.20734 h -0.35933 q -0.6776,0 -0.6776,-0.51333 0,-0.29774 0.17453,-0.4004 0.17453,-0.11294 0.50307,-0.11294 h 0.35933 v -0.90347 q 0,-0.6776 0.51334,-0.6776 0.29773,0 0.4004,0.17453 0.11293,0.17454 0.11293,0.50307 v 0.90347 h 1.85828 q 0.32853,0 0.50306,0.11294 0.17454,0.10266 0.17454,0.4004 0,0.51333 -0.6776,0.51333 h -1.85828 z"
id="path46859" /><path
d="m 140.33437,133.5374 q 0.308,0 0.4004,0.17453 0.10267,0.17454 0.10267,0.50307 v 0.90347 q 0,0.68787 -0.50307,0.68787 -0.0821,0 -0.154,-0.0103 -0.0616,-0.0205 -0.11293,-0.0411 -0.0411,-0.0308 -0.0821,-0.0719 -0.0411,-0.0513 -0.0616,-0.0821 -0.0205,-0.0308 -0.0411,-0.0924 -0.0205,-0.0616 -0.0308,-0.0821 0,-0.0308 -0.0205,-0.0924 -0.0103,-0.0719 -0.0103,-0.0821 -0.0719,-0.308 -0.41067,-0.4928 -0.32854,-0.19507 -0.81107,-0.19507 -0.48254,0 -0.82134,0.22587 -0.3388,0.22586 -0.3388,0.5544 0,0.34907 0.3388,0.54413 0.3388,0.1848 0.79054,0.2464 0.45173,0.0513 1.00614,0.20534 0.5544,0.14373 0.87267,0.4004 0.60573,0.48253 0.60573,1.28334 0,0.8008 -0.6468,1.2936 -0.6468,0.4928 -1.70427,0.4928 -0.85214,0 -1.60161,-0.4004 -0.20533,0.2464 -0.41067,0.2464 -0.5236,0 -0.5236,-0.6776 v -0.6776 q 0,-0.3388 0.11294,-0.50307 0.11293,-0.17453 0.4004,-0.17453 0.0924,0 0.16426,0.0205 0.0821,0.0205 0.13347,0.0616 0.0513,0.0411 0.0821,0.0821 0.0411,0.0308 0.0616,0.0924 0.0308,0.0616 0.0411,0.0924 0.0103,0.0308 0.0205,0.0821 0.0205,0.0513 0.0205,0.0616 0.0719,0.2772 0.4928,0.47227 0.42093,0.19506 0.93427,0.19506 0.57493,0 0.96507,-0.22586 0.39013,-0.22587 0.39013,-0.55441 0,-0.308 -0.308,-0.4928 -0.29773,-0.1848 -0.69813,-0.2464 -0.39014,-0.0616 -0.92401,-0.1848 -0.5236,-0.1232 -0.84186,-0.29773 -0.39014,-0.22587 -0.61601,-0.60574 -0.22586,-0.37987 -0.22586,-0.82133 0,-0.78027 0.63653,-1.29361 0.63654,-0.5236 1.59134,-0.5236 0.79054,0 1.33467,0.3388 0.0821,-0.19507 0.16427,-0.26693 0.0821,-0.0719 0.23613,-0.0719 z"
id="path46861" /><path
d="m 143.88663,138.21901 q 0,0.31827 0.17454,0.45174 0.17453,0.13347 0.7084,0.13347 0.4004,0 0.72894,-0.0719 0.3388,-0.0719 0.50306,-0.154 0.17454,-0.0924 0.3388,-0.16427 0.17454,-0.0719 0.28747,-0.0719 0.20534,0 0.34907,0.15401 0.14373,0.154 0.14373,0.3696 0,0.28746 -0.44146,0.5236 -0.43121,0.22587 -0.96507,0.32853 -0.52361,0.11294 -0.95481,0.11294 -0.87267,0 -1.386,-0.37987 -0.51334,-0.37987 -0.51334,-1.03694 v -2.20734 h -0.35933 q -0.6776,0 -0.6776,-0.51333 0,-0.29774 0.17453,-0.4004 0.17453,-0.11294 0.50307,-0.11294 h 0.35933 v -0.90347 q 0,-0.6776 0.51334,-0.6776 0.29773,0 0.4004,0.17453 0.11293,0.17454 0.11293,0.50307 v 0.90347 h 1.85828 q 0.32853,0 0.50306,0.11294 0.17454,0.10266 0.17454,0.4004 0,0.51333 -0.6776,0.51333 h -1.85828 z"
id="path46863" /><path
d="m 150.96037,135.0466 q 1.08827,0 1.84801,0.69814 0.77,0.69814 0.77,1.69401 0,1.00613 -0.77,1.70427 -0.77,0.68787 -1.87881,0.68787 -1.1088,0 -1.8788,-0.68787 -0.77001,-0.69814 -0.77001,-1.70427 0,-1.01641 0.77001,-1.70428 0.77,-0.68787 1.9096,-0.68787 z m -0.0103,1.02667 q -0.69814,0 -1.17041,0.39014 -0.47227,0.39013 -0.47227,0.97534 0,0.57493 0.46201,0.97533 0.47226,0.39014 1.16013,0.39014 0.68787,0 1.14987,-0.39014 0.47227,-0.4004 0.47227,-0.97533 0,-0.57494 -0.47227,-0.96507 -0.462,-0.40041 -1.12933,-0.40041 z"
id="path46865" /><path
d="m 158.57825,135.05687 q 0.4312,0 0.8624,0.26694 0.4312,0.26693 0.4312,0.60573 0,0.2156 -0.154,0.3696 -0.154,0.154 -0.35933,0.154 -0.17454,0 -0.4004,-0.1848 -0.22587,-0.1848 -0.4004,-0.1848 -0.24641,0 -0.60574,0.22587 -0.34907,0.2156 -1.08827,0.82133 v 1.50921 h 1.42707 q 0.68787,0 0.68787,0.51333 0,0.51334 -0.68787,0.51334 h -3.04921 q -0.6776,0 -0.6776,-0.51334 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 0.59547 v -2.43321 h -0.35933 q -0.67761,0 -0.67761,-0.51333 0,-0.51334 0.67761,-0.51334 h 1.386 v 0.66734 q 0.616,-0.462 0.97534,-0.62627 0.35933,-0.16427 0.7392,-0.16427 z"
id="path46867" /><path
d="m 160.60077,138.44488 q 0,-0.69813 0.68787,-1.21147 0.68787,-0.5236 1.79667,-0.5236 0.46201,0 1.06774,0.10267 v -0.23614 q 0,-0.50307 -0.9548,-0.50307 -0.42094,0 -0.95481,0.1232 -0.53386,0.11294 -0.6468,0.11294 -0.2156,0 -0.35933,-0.14374 -0.14374,-0.154 -0.14374,-0.37986 0,-0.32854 0.308,-0.4312 0.87267,-0.30801 1.76588,-0.30801 0.94453,0 1.4784,0.40041 0.54414,0.4004 0.54414,1.11907 v 2.07387 h 0.16426 q 0.67761,0 0.67761,0.51333 0,0.51334 -0.67761,0.51334 h -1.2012 v -0.23613 q -0.77,0.4004 -1.70427,0.4004 -0.75974,0 -1.30387,-0.4004 -0.54414,-0.41067 -0.54414,-0.98561 z m 3.56255,-0.16427 v -0.51333 q -0.6468,-0.11293 -1.13961,-0.11293 -0.5236,0 -0.93427,0.22586 -0.4004,0.22587 -0.4004,0.52361 0,0.17453 0.22587,0.28746 0.22587,0.11294 0.5544,0.11294 0.84187,0 1.69401,-0.52361 z"
id="path46869" /><path
d="m 167.77718,141.20662 q 0,-0.29773 0.17453,-0.41066 0.17454,-0.10267 0.50307,-0.10267 h 1.11907 q 0.45174,0 0.7084,-0.2156 0.25667,-0.2156 0.25667,-0.60574 v -0.56467 q -0.6776,0.50307 -1.4476,0.50307 -1.03694,0 -1.73508,-0.6776 -0.68786,-0.68787 -0.68786,-1.70427 0,-1.02667 0.68786,-1.70427 0.69814,-0.68787 1.73508,-0.68787 0.84187,0 1.4476,0.51333 v -0.3696 h 1.19094 q 0.6776,0 0.6776,0.51334 0,0.51333 -0.6776,0.51333 h -0.16427 v 3.66521 q 0,0.81107 -0.56467,1.32441 -0.5544,0.5236 -1.39627,0.5236 h -1.14987 q -0.6776,0 -0.6776,-0.51334 z m 1.33467,-5.14361 q -0.5852,0 -1.00614,0.4004 -0.41066,0.39013 -0.41066,0.9548 0,0.56467 0.41066,0.96507 0.42094,0.4004 1.00614,0.4004 0.5852,0 1.00614,-0.39013 0.42093,-0.4004 0.42093,-0.9548 0,-0.57494 -0.42093,-0.97534 -0.41067,-0.4004 -1.00614,-0.4004 z"
id="path46871" /><path
d="m 178.13626,138.97875 q 0,0.32853 -0.59547,0.54414 -0.59546,0.20533 -1.11907,0.25666 -0.51333,0.0513 -0.88293,0.0513 -1.19094,0 -1.95067,-0.66734 -0.75974,-0.66733 -0.75974,-1.71454 0,-1.0164 0.75974,-1.70427 0.77,-0.69814 1.88907,-0.69814 1.14987,0 1.89934,0.69814 0.75973,0.69814 0.75973,1.75561 v 0.4004 h -4.18881 q 0.34907,0.90347 1.68374,0.90347 0.54413,0 1.21147,-0.16427 0.66733,-0.17453 0.8008,-0.17453 0.20534,0 0.34907,0.154 0.14373,0.14373 0.14373,0.35933 z m -4.15801,-1.98147 h 3.01841 q -0.1232,-0.42094 -0.53387,-0.66734 -0.41067,-0.25667 -0.97534,-0.25667 -0.56466,0 -0.9856,0.25667 -0.41067,0.25667 -0.5236,0.66734 z"
id="path46873" /><path
d="m 180.89799,138.29088 h 1.3552 l -1.4476,2.75148 q -0.1232,0.2464 -0.32854,0.2464 -0.13346,0 -0.22586,-0.0924 -0.0924,-0.0821 -0.0924,-0.19507 0,-0.0821 0.0308,-0.19507 z"
id="path46875" /><path
d="m 194.56293,139.15328 q 0,-0.29773 0.17454,-0.4004 0.17453,-0.11293 0.50307,-0.11293 h 0.23613 l -0.23613,-0.59547 h -2.44348 l -0.23613,0.59547 h 0.23613 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -1.36547 q -0.6776,0 -0.6776,-0.51334 0,-0.308 0.1848,-0.41066 0.17453,-0.10267 0.50307,-0.10267 l 1.59134,-3.93215 h -0.64681 q -0.68787,0 -0.68787,-0.51333 0,-0.308 0.17454,-0.41067 0.1848,-0.10267 0.51333,-0.10267 h 2.21761 l 2.04307,4.95882 q 0.69814,0 0.69814,0.51333 0,0.51334 -0.6776,0.51334 h -1.42707 q -0.67761,0 -0.67761,-0.51334 z m 0.25667,-2.13547 -0.8008,-1.97121 -0.81107,1.97121 z"
id="path46877" /><path
d="m 198.04333,139.66662 q -0.6776,0 -0.6776,-0.51334 0,-0.51333 0.6776,-0.51333 h 0.0616 v -2.43321 q -0.62627,-0.0205 -0.62627,-0.51333 0,-0.51334 0.68787,-0.51334 h 0.96507 v 0.4928 q 0.3696,-0.34906 0.6776,-0.48253 0.308,-0.14374 0.72894,-0.14374 0.8008,0 1.31413,0.45174 0.51334,0.45173 0.51334,1.27307 v 1.86854 q 0.62627,0 0.62627,0.51333 0,0.51334 -0.6776,0.51334 h -0.91374 q -0.68787,0 -0.68787,-0.51334 0,-0.51333 0.62627,-0.51333 v -1.82747 q 0,-0.73921 -0.924,-0.73921 -0.35934,0 -0.64681,0.154 -0.2772,0.15401 -0.63653,0.54414 v 1.86854 h 0.0616 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 z"
id="path46879" /><path
d="m 204.08013,141.71996 q -0.308,0 -0.44147,-0.16427 -0.13346,-0.154 -0.13346,-0.34907 0,-0.51333 0.6776,-0.51333 h 1.02667 l 0.56467,-1.05747 -1.76587,-3.42908 q -0.50307,-0.0616 -0.50307,-0.51333 0,-0.51334 0.6776,-0.51334 h 0.924 q 0.32854,0 0.50307,0.11294 0.17453,0.10266 0.17453,0.4004 0,0.4928 -0.60573,0.51333 l 1.1704,2.28948 1.23201,-2.28948 q -0.65707,0 -0.65707,-0.51333 0,-0.51334 0.68787,-0.51334 h 0.94453 q 0.32854,0 0.50307,0.11294 0.17454,0.10266 0.17454,0.4004 0,0.462 -0.53387,0.51333 l -2.36134,4.48655 h 0.0513 q 0.32853,0 0.50307,0.10267 0.17453,0.11293 0.17453,0.41066 0,0.51334 -0.6776,0.51334 h -2.20734 z"
id="path46881" /><path
d="m 218.99761,138.78368 q 0.48254,0 0.82134,-0.11293 0.34907,-0.1232 0.4928,-0.25667 0.14374,-0.14373 0.28747,-0.25667 0.154,-0.1232 0.28747,-0.1232 0.20533,0 0.35933,0.154 0.154,0.154 0.154,0.35934 0,0.44147 -0.7084,0.85213 -0.69814,0.41067 -1.72481,0.41067 -1.30387,0 -2.16627,-0.75973 -0.85214,-0.77001 -0.85214,-1.94041 v -0.6776 q 0,-1.23201 0.80081,-2.06361 0.8008,-0.8316 1.99174,-0.8316 0.71867,0 1.45787,0.34907 l 0.10267,0.0411 q 0.17453,-0.2464 0.4312,-0.2464 0.29773,0 0.4004,0.17454 0.11293,0.17453 0.11293,0.50307 v 0.8624 q 0,0.6776 -0.51333,0.6776 -0.1848,0 -0.308,-0.10267 -0.11294,-0.10266 -0.14374,-0.1848 -0.0205,-0.0924 -0.0513,-0.25666 -0.0616,-0.30801 -0.37987,-0.49281 -0.308,-0.19506 -0.57493,-0.2464 -0.26694,-0.0513 -0.49281,-0.0513 -0.78027,0 -1.2936,0.53387 -0.51334,0.5236 -0.51334,1.33467 v 0.65707 q 0,0.77 0.54414,1.232 0.5544,0.462 1.4784,0.462 z"
id="path46883" /><path
d="m 222.84761,133.7838 q 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.51334,-0.11293 h 1.82747 v 5.36948 h 1.25254 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -3.53174 q -0.67761,0 -0.67761,-0.51334 0,-0.29773 0.17454,-0.4004 0.17453,-0.11293 0.50307,-0.11293 h 1.25253 v -4.34281 h -0.8008 q -0.68787,0 -0.68787,-0.51334 z"
id="path46885" /><path
d="m 231.04042,135.0466 q 1.08827,0 1.84801,0.69814 0.77,0.69814 0.77,1.69401 0,1.00613 -0.77,1.70427 -0.77001,0.68787 -1.87881,0.68787 -1.1088,0 -1.8788,-0.68787 -0.77001,-0.69814 -0.77001,-1.70427 0,-1.01641 0.77001,-1.70428 0.77,-0.68787 1.9096,-0.68787 z m -0.0103,1.02667 q -0.69813,0 -1.1704,0.39014 -0.47227,0.39013 -0.47227,0.97534 0,0.57493 0.462,0.97533 0.47227,0.39014 1.16014,0.39014 0.68787,0 1.14987,-0.39014 0.47227,-0.4004 0.47227,-0.97533 0,-0.57494 -0.47227,-0.96507 -0.462,-0.40041 -1.12934,-0.40041 z"
id="path46887" /><path
d="m 237.83696,136.20674 q -0.308,0 -0.44147,-0.154 -0.13346,-0.16427 -0.13346,-0.35933 0,-0.51334 0.6776,-0.51334 h 1.386 v 3.45988 q 0.62627,0 0.62627,0.51333 0,0.51334 -0.6776,0.51334 h -0.97534 v -0.4928 q -0.37987,0.35933 -0.68787,0.4928 -0.29773,0.13347 -0.71867,0.13347 -0.81107,0 -1.3244,-0.45174 -0.50307,-0.462 -0.50307,-1.28334 v -1.85827 h -0.2772 q -0.25667,0 -0.41067,-0.14373 -0.154,-0.14374 -0.154,-0.3696 0,-0.29774 0.17454,-0.4004 0.17453,-0.11294 0.50306,-0.11294 h 1.19094 v 2.85414 q 0,0.73921 0.90347,0.73921 0.39014,0 0.6468,-0.13347 0.25667,-0.14373 0.65707,-0.56467 v -1.86854 h -0.35933 z"
id="path46889" /><path
d="m 245.8655,138.63995 q 0.67761,0 0.67761,0.51333 0,0.51334 -0.67761,0.51334 h -1.19093 v -0.35934 q -0.73921,0.50307 -1.55028,0.50307 -1.14987,0 -1.848,-0.68787 -0.68787,-0.68786 -0.68787,-1.70427 0,-1.0164 0.68787,-1.694 0.69813,-0.68787 1.85827,-0.68787 0.8932,0 1.54001,0.51333 v -1.2628 h -0.16427 q -0.32854,0 -0.50307,-0.10267 -0.17453,-0.11293 -0.17453,-0.41067 0,-0.28746 0.17453,-0.39013 0.17453,-0.11293 0.50307,-0.11293 h 1.19094 v 5.36948 z m -1.19093,-1.2012 q 0,-0.61601 -0.42094,-0.99587 -0.42093,-0.37987 -1.11907,-0.37987 -0.68787,0 -1.1088,0.4004 -0.41067,0.39013 -0.41067,0.9548 0,0.5852 0.42093,0.97534 0.43121,0.39013 1.10881,0.39013 0.6776,0 1.09853,-0.37986 0.43121,-0.39014 0.43121,-0.96507 z"
id="path46891" /><path
d="m 248.65804,138.29088 h 1.35521 l -1.44761,2.75148 q -0.1232,0.2464 -0.32853,0.2464 -0.13347,0 -0.22587,-0.0924 -0.0924,-0.0821 -0.0924,-0.19507 0,-0.0821 0.0308,-0.19507 z"
id="path46893" /><path
d="m 262.32299,139.15328 q 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 0.23614 l -0.23614,-0.59547 h -2.44347 l -0.23614,0.59547 h 0.23614 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -1.36547 q -0.67761,0 -0.67761,-0.51334 0,-0.308 0.1848,-0.41066 0.17454,-0.10267 0.50307,-0.10267 l 1.59134,-3.93215 h -0.6468 q -0.68787,0 -0.68787,-0.51333 0,-0.308 0.17453,-0.41067 0.1848,-0.10267 0.51334,-0.10267 h 2.21761 l 2.04307,4.95882 q 0.69814,0 0.69814,0.51333 0,0.51334 -0.67761,0.51334 h -1.42707 q -0.6776,0 -0.6776,-0.51334 z m 0.25667,-2.13547 -0.80081,-1.97121 -0.81106,1.97121 z"
id="path46895" /><path
d="m 265.80338,139.66662 q -0.6776,0 -0.6776,-0.51334 0,-0.51333 0.6776,-0.51333 h 0.0616 v -2.43321 q -0.62626,-0.0205 -0.62626,-0.51333 0,-0.51334 0.68787,-0.51334 h 0.96506 v 0.4928 q 0.36961,-0.34906 0.67761,-0.48253 0.308,-0.14374 0.72893,-0.14374 0.80081,0 1.31414,0.45174 0.51334,0.45173 0.51334,1.27307 v 1.86854 q 0.62626,0 0.62626,0.51333 0,0.51334 -0.6776,0.51334 h -0.91373 q -0.68787,0 -0.68787,-0.51334 0,-0.51333 0.62627,-0.51333 v -1.82747 q 0,-0.73921 -0.92401,-0.73921 -0.35933,0 -0.6468,0.154 -0.2772,0.15401 -0.63654,0.54414 v 1.86854 h 0.0616 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 z"
id="path46897" /><path
d="m 271.84019,141.71996 q -0.308,0 -0.44147,-0.16427 -0.13347,-0.154 -0.13347,-0.34907 0,-0.51333 0.6776,-0.51333 h 1.02667 l 0.56467,-1.05747 -1.76587,-3.42908 q -0.50307,-0.0616 -0.50307,-0.51333 0,-0.51334 0.6776,-0.51334 h 0.92401 q 0.32853,0 0.50307,0.11294 0.17453,0.10266 0.17453,0.4004 0,0.4928 -0.60574,0.51333 l 1.17041,2.28948 1.232,-2.28948 q -0.65707,0 -0.65707,-0.51333 0,-0.51334 0.68787,-0.51334 h 0.94454 q 0.32853,0 0.50307,0.11294 0.17453,0.10266 0.17453,0.4004 0,0.462 -0.53387,0.51333 l -2.36134,4.48655 h 0.0513 q 0.32853,0 0.50306,0.10267 0.17454,0.11293 0.17454,0.41066 0,0.51334 -0.6776,0.51334 h -2.20735 z"
id="path46899" /><path
d="m 287.41474,139.66662 q -0.6776,0 -0.6776,-0.51334 0,-0.51333 0.6776,-0.51333 h 0.154 v -1.44761 h -2.19707 v 1.44761 h 0.154 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -1.24227 q -0.67761,0 -0.67761,-0.51334 0,-0.29773 0.17454,-0.4004 0.17453,-0.11293 0.50307,-0.11293 h 0.0616 v -3.93215 q -0.53387,-0.0513 -0.53387,-0.51333 0,-0.29774 0.17453,-0.4004 0.17454,-0.11294 0.50307,-0.11294 h 1.03694 q 0.6776,0 0.6776,0.51334 0,0.51333 -0.6776,0.51333 h -0.154 v 1.45787 h 2.19707 v -1.45787 h -0.154 q -0.6776,0 -0.6776,-0.51333 0,-0.29774 0.17453,-0.4004 0.17453,-0.11294 0.50307,-0.11294 h 1.03694 q 0.6776,0 0.6776,0.51334 0,0.462 -0.53387,0.51333 v 3.93215 h 0.0616 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 z"
id="path46901" /><path
d="m 295.11475,133.68113 q 0.6776,0 0.6776,0.51334 0,0.4312 -0.48253,0.51333 l -0.61601,4.95882 h -1.12933 l -0.95481,-2.84388 -0.93427,2.84388 h -1.1396 l -0.63654,-4.95882 q -0.47226,-0.0616 -0.47226,-0.4928 0,-0.308 0.16426,-0.42093 0.17454,-0.11294 0.51334,-0.11294 h 1.34494 q 0.68786,0 0.68786,0.51334 0,0.51333 -0.68786,0.51333 h -0.49281 l 0.36961,2.79255 0.78026,-2.32028 h 1.06774 l 0.78027,2.32028 0.35934,-2.79255 h -0.54414 q -0.6776,0 -0.6776,-0.51333 0,-0.29774 0.17453,-0.4004 0.17454,-0.11294 0.50307,-0.11294 z"
id="path46903" /><path
d="m 297.93807,138.29088 h 1.35521 l -1.44761,2.75148 q -0.1232,0.2464 -0.32853,0.2464 -0.13347,0 -0.22587,-0.0924 -0.0924,-0.0821 -0.0924,-0.19507 0,-0.0821 0.0308,-0.19507 z"
id="path46905" /><path
d="m 311.60302,139.15328 q 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 0.23614 l -0.23614,-0.59547 h -2.44347 l -0.23614,0.59547 h 0.23614 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -1.36547 q -0.67761,0 -0.67761,-0.51334 0,-0.308 0.1848,-0.41066 0.17454,-0.10267 0.50307,-0.10267 l 1.59134,-3.93215 h -0.6468 q -0.68787,0 -0.68787,-0.51333 0,-0.308 0.17453,-0.41067 0.1848,-0.10267 0.51334,-0.10267 h 2.21761 l 2.04307,4.95882 q 0.69813,0 0.69813,0.51333 0,0.51334 -0.6776,0.51334 h -1.42707 q -0.6776,0 -0.6776,-0.51334 z m 0.25667,-2.13547 -0.80081,-1.97121 -0.81107,1.97121 z"
id="path46907" /><path
d="m 315.08341,139.66662 q -0.6776,0 -0.6776,-0.51334 0,-0.51333 0.6776,-0.51333 h 0.0616 v -2.43321 q -0.62626,-0.0205 -0.62626,-0.51333 0,-0.51334 0.68786,-0.51334 h 0.96507 v 0.4928 q 0.36961,-0.34906 0.67761,-0.48253 0.308,-0.14374 0.72893,-0.14374 0.8008,0 1.31414,0.45174 0.51333,0.45173 0.51333,1.27307 v 1.86854 q 0.62627,0 0.62627,0.51333 0,0.51334 -0.6776,0.51334 h -0.91374 q -0.68786,0 -0.68786,-0.51334 0,-0.51333 0.62626,-0.51333 v -1.82747 q 0,-0.73921 -0.924,-0.73921 -0.35933,0 -0.6468,0.154 -0.2772,0.15401 -0.63654,0.54414 v 1.86854 h 0.0616 q 0.67761,0 0.67761,0.51333 0,0.51334 -0.67761,0.51334 z"
id="path46909" /><path
d="m 321.12022,141.71996 q -0.308,0 -0.44147,-0.16427 -0.13347,-0.154 -0.13347,-0.34907 0,-0.51333 0.6776,-0.51333 h 1.02667 l 0.56467,-1.05747 -1.76587,-3.42908 q -0.50307,-0.0616 -0.50307,-0.51333 0,-0.51334 0.6776,-0.51334 h 0.92401 q 0.32853,0 0.50307,0.11294 0.17453,0.10266 0.17453,0.4004 0,0.4928 -0.60574,0.51333 l 1.17041,2.28948 1.232,-2.28948 q -0.65707,0 -0.65707,-0.51333 0,-0.51334 0.68787,-0.51334 h 0.94454 q 0.32853,0 0.50307,0.11294 0.17453,0.10266 0.17453,0.4004 0,0.462 -0.53387,0.51333 l -2.36134,4.48655 h 0.0513 q 0.32854,0 0.50307,0.10267 0.17454,0.11293 0.17454,0.41066 0,0.51334 -0.67761,0.51334 h -2.20734 z"
id="path46911" /><path
d="m 338.23477,133.68113 q 0.67761,0 0.67761,0.51334 0,0.4312 -0.48254,0.51333 l -0.616,4.95882 h -1.12934 l -0.9548,-2.84388 -0.93427,2.84388 h -1.1396 l -0.63654,-4.95882 q -0.47227,-0.0616 -0.47227,-0.4928 0,-0.308 0.16427,-0.42093 0.17453,-0.11294 0.51333,-0.11294 h 1.34494 q 0.68787,0 0.68787,0.51334 0,0.51333 -0.68787,0.51333 h -0.4928 l 0.3696,2.79255 0.78027,-2.32028 h 1.06774 l 0.78027,2.32028 0.35933,-2.79255 h -0.54413 q -0.67761,0 -0.67761,-0.51333 0,-0.29774 0.17454,-0.4004 0.17453,-0.11294 0.50307,-0.11294 z"
id="path46913" /><path
d="m 341.9205,135.0466 q 1.08827,0 1.84801,0.69814 0.77,0.69814 0.77,1.69401 0,1.00613 -0.77,1.70427 -0.77,0.68787 -1.87881,0.68787 -1.1088,0 -1.8788,-0.68787 -0.77001,-0.69814 -0.77001,-1.70427 0,-1.01641 0.77001,-1.70428 0.77,-0.68787 1.9096,-0.68787 z m -0.0103,1.02667 q -0.69814,0 -1.17041,0.39014 -0.47227,0.39013 -0.47227,0.97534 0,0.57493 0.46201,0.97533 0.47226,0.39014 1.16013,0.39014 0.68787,0 1.14987,-0.39014 0.47227,-0.4004 0.47227,-0.97533 0,-0.57494 -0.47227,-0.96507 -0.462,-0.40041 -1.12933,-0.40041 z"
id="path46915" /><path
d="m 349.53838,135.05687 q 0.4312,0 0.8624,0.26694 0.4312,0.26693 0.4312,0.60573 0,0.2156 -0.154,0.3696 -0.154,0.154 -0.35933,0.154 -0.17454,0 -0.4004,-0.1848 -0.22587,-0.1848 -0.40041,-0.1848 -0.2464,0 -0.60573,0.22587 -0.34907,0.2156 -1.08827,0.82133 v 1.50921 h 1.42707 q 0.68787,0 0.68787,0.51333 0,0.51334 -0.68787,0.51334 h -3.04921 q -0.6776,0 -0.6776,-0.51334 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 0.59547 v -2.43321 h -0.35934 q -0.6776,0 -0.6776,-0.51333 0,-0.51334 0.6776,-0.51334 h 1.38601 v 0.66734 q 0.616,-0.462 0.97534,-0.62627 0.35933,-0.16427 0.7392,-0.16427 z"
id="path46917" /><path
d="m 356.30412,138.63995 q 0.68787,0 0.68787,0.51333 0,0.51334 -0.68787,0.51334 h -1.21147 q -0.67761,0 -0.67761,-0.51334 0,-0.20533 0.16427,-0.37986 l -1.05747,-0.93427 -0.1848,0.14373 v 1.68374 h -1.19094 q -0.6776,0 -0.6776,-0.51334 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 0.16427 v -4.34281 h -0.16427 q -0.32853,0 -0.50307,-0.10267 -0.17453,-0.11294 -0.17453,-0.41067 0,-0.51333 0.6776,-0.51333 h 1.19094 v 3.44961 l 0.81107,-0.64681 q -0.16427,-0.19506 -0.16427,-0.37986 0,-0.51334 0.68787,-0.51334 h 1.14987 q 0.3388,0 0.50307,0.11294 0.17453,0.11293 0.17453,0.4004 0,0.51333 -0.6776,0.51333 h -0.28747 l -1.21147,0.9856 1.64268,1.44761 z"
id="path46919" /><path
d="m 358.36771,133.7838 q 0,-0.29773 0.17453,-0.4004 0.17453,-0.11293 0.51334,-0.11293 h 1.82747 v 5.36948 h 1.25254 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -3.53175 q -0.6776,0 -0.6776,-0.51334 0,-0.29773 0.17453,-0.4004 0.17454,-0.11293 0.50307,-0.11293 h 1.25254 v -4.34281 h -0.8008 q -0.68787,0 -0.68787,-0.51334 z"
id="path46921" /><path
d="m 366.56052,135.0466 q 1.08827,0 1.848,0.69814 0.77001,0.69814 0.77001,1.69401 0,1.00613 -0.77001,1.70427 -0.77,0.68787 -1.8788,0.68787 -1.10881,0 -1.87881,-0.68787 -0.77,-0.69814 -0.77,-1.70427 0,-1.01641 0.77,-1.70428 0.77,-0.68787 1.90961,-0.68787 z m -0.0103,1.02667 q -0.69814,0 -1.1704,0.39014 -0.47227,0.39013 -0.47227,0.97534 0,0.57493 0.462,0.97533 0.47227,0.39014 1.16014,0.39014 0.68787,0 1.14987,-0.39014 0.47227,-0.4004 0.47227,-0.97533 0,-0.57494 -0.47227,-0.96507 -0.462,-0.40041 -1.12934,-0.40041 z"
id="path46923" /><path
d="m 370.04091,138.44488 q 0,-0.69813 0.68787,-1.21147 0.68787,-0.5236 1.79667,-0.5236 0.462,0 1.06774,0.10267 v -0.23614 q 0,-0.50307 -0.9548,-0.50307 -0.42094,0 -0.95481,0.1232 -0.53386,0.11294 -0.6468,0.11294 -0.2156,0 -0.35933,-0.14374 -0.14374,-0.154 -0.14374,-0.37986 0,-0.32854 0.308,-0.4312 0.87267,-0.30801 1.76588,-0.30801 0.94453,0 1.4784,0.40041 0.54414,0.4004 0.54414,1.11907 v 2.07387 h 0.16426 q 0.67761,0 0.67761,0.51333 0,0.51334 -0.67761,0.51334 h -1.2012 v -0.23613 q -0.77,0.4004 -1.70427,0.4004 -0.75974,0 -1.30387,-0.4004 -0.54414,-0.41067 -0.54414,-0.98561 z m 3.56255,-0.16427 v -0.51333 q -0.64681,-0.11293 -1.13961,-0.11293 -0.5236,0 -0.93427,0.22586 -0.4004,0.22587 -0.4004,0.52361 0,0.17453 0.22587,0.28746 0.22587,0.11294 0.5544,0.11294 0.84187,0 1.69401,-0.52361 z"
id="path46925" /><path
d="m 381.3856,138.63995 q 0.6776,0 0.6776,0.51333 0,0.51334 -0.6776,0.51334 h -1.19094 v -0.35934 q -0.7392,0.50307 -1.55027,0.50307 -1.14987,0 -1.84801,-0.68787 -0.68786,-0.68786 -0.68786,-1.70427 0,-1.0164 0.68786,-1.694 0.69814,-0.68787 1.85828,-0.68787 0.8932,0 1.54,0.51333 v -1.2628 h -0.16427 q -0.32853,0 -0.50306,-0.10267 -0.17454,-0.11293 -0.17454,-0.41067 0,-0.28746 0.17454,-0.39013 0.17453,-0.11293 0.50306,-0.11293 h 1.19094 v 5.36948 z m -1.19094,-1.2012 q 0,-0.61601 -0.42093,-0.99587 -0.42094,-0.37987 -1.11907,-0.37987 -0.68787,0 -1.10881,0.4004 -0.41066,0.39013 -0.41066,0.9548 0,0.5852 0.42093,0.97534 0.4312,0.39013 1.1088,0.39013 0.67761,0 1.09854,-0.37986 0.4312,-0.39014 0.4312,-0.96507 z"
id="path46927" /></g></svg>

Before

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -272,10 +272,10 @@ func (acc *Account) checkReadAfter(bytesUntilLimit int64, n int, err error) (out
return n, err
}
// ServerSideTransferStart should be called at the start of a server-side transfer
// ServerSideCopyStart should be called at the start of a server-side copy
//
// This pretends a transfer has started
func (acc *Account) ServerSideTransferStart() {
func (acc *Account) ServerSideCopyStart() {
acc.values.mu.Lock()
// Set start time.
if acc.values.start.IsZero() {
@@ -284,9 +284,8 @@ func (acc *Account) ServerSideTransferStart() {
acc.values.mu.Unlock()
}
// ServerSideTransferEnd accounts for a read of n bytes in a sever
// side transfer to be treated as a normal transfer.
func (acc *Account) ServerSideTransferEnd(n int64) {
// ServerSideCopyEnd accounts for a read of n bytes in a sever side copy
func (acc *Account) ServerSideCopyEnd(n int64) {
// Update Stats
acc.values.mu.Lock()
acc.values.bytes += n
@@ -295,20 +294,10 @@ func (acc *Account) ServerSideTransferEnd(n int64) {
acc.stats.Bytes(n)
}
// ServerSideCopyEnd accounts for a read of n bytes in a sever side copy
func (acc *Account) ServerSideCopyEnd(n int64) {
acc.stats.AddServerSideCopy(n)
}
// ServerSideMoveEnd accounts for a read of n bytes in a sever side move
func (acc *Account) ServerSideMoveEnd(n int64) {
acc.stats.AddServerSideMove(n)
}
// DryRun accounts for statistics without running the operation
func (acc *Account) DryRun(n int64) {
acc.ServerSideTransferStart()
acc.ServerSideTransferEnd(n)
acc.ServerSideCopyStart()
acc.ServerSideCopyEnd(n)
}
// Account for n bytes from the current file bandwidth limit (if any)

View File

@@ -28,40 +28,36 @@ var MaxCompletedTransfers = 100
// N.B.: if this struct is modified, please remember to also update sum() function in stats_groups
// to correctly count the updated fields
type StatsInfo struct {
mu sync.RWMutex
ctx context.Context
ci *fs.ConfigInfo
bytes int64
errors int64
lastError error
fatalError bool
retryError bool
retryAfter time.Time
checks int64
checking *transferMap
checkQueue int
checkQueueSize int64
transfers int64
transferring *transferMap
transferQueue int
transferQueueSize int64
renames int64
renameQueue int
renameQueueSize int64
deletes int64
deletesSize int64
deletedDirs int64
inProgress *inProgress
startedTransfers []*Transfer // currently active transfers
oldTimeRanges timeRanges // a merged list of time ranges for the transfers
oldDuration time.Duration // duration of transfers we have culled
group string
startTime time.Time // the moment these stats were initialized or reset
average averageValues
serverSideCopies int64
serverSideCopyBytes int64
serverSideMoves int64
serverSideMoveBytes int64
mu sync.RWMutex
ctx context.Context
ci *fs.ConfigInfo
bytes int64
errors int64
lastError error
fatalError bool
retryError bool
retryAfter time.Time
checks int64
checking *transferMap
checkQueue int
checkQueueSize int64
transfers int64
transferring *transferMap
transferQueue int
transferQueueSize int64
renames int64
renameQueue int
renameQueueSize int64
deletes int64
deletesSize int64
deletedDirs int64
inProgress *inProgress
startedTransfers []*Transfer // currently active transfers
oldTimeRanges timeRanges // a merged list of time ranges for the transfers
oldDuration time.Duration // duration of transfers we have culled
group string
startTime time.Time // the moment these stats were initialized or reset
average averageValues
}
type averageValues struct {
@@ -114,10 +110,6 @@ func (s *StatsInfo) RemoteStats() (out rc.Params, err error) {
out["deletedDirs"] = s.deletedDirs
out["renames"] = s.renames
out["elapsedTime"] = time.Since(s.startTime).Seconds()
out["serverSideCopies"] = s.serverSideCopies
out["serverSideCopyBytes"] = s.serverSideCopyBytes
out["serverSideMoves"] = s.serverSideMoves
out["serverSideMoveBytes"] = s.serverSideMoveBytes
eta, etaOK := eta(s.bytes, ts.totalBytes, ts.speed)
if etaOK {
out["eta"] = eta.Seconds()
@@ -457,16 +449,6 @@ func (s *StatsInfo) String() string {
_, _ = fmt.Fprintf(buf, "Transferred: %10d / %d, %s\n",
s.transfers, ts.totalTransfers, percent(s.transfers, ts.totalTransfers))
}
if s.serverSideCopies != 0 || s.serverSideCopyBytes != 0 {
_, _ = fmt.Fprintf(buf, "Server Side Copies:%6d @ %s\n",
s.serverSideCopies, fs.SizeSuffix(s.serverSideCopyBytes).ByteUnit(),
)
}
if s.serverSideMoves != 0 || s.serverSideMoveBytes != 0 {
_, _ = fmt.Fprintf(buf, "Server Side Moves:%7d @ %s\n",
s.serverSideMoves, fs.SizeSuffix(s.serverSideMoveBytes).ByteUnit(),
)
}
_, _ = fmt.Fprintf(buf, "Elapsed time: %10ss\n", strings.TrimRight(fs.Duration(elapsedTime.Truncate(time.Minute)).ReadableString(), "0s")+fmt.Sprintf("%.1f", elapsedTimeSecondsOnly.Seconds()))
}
@@ -874,19 +856,3 @@ func (s *StatsInfo) PruneTransfers() {
}
s.mu.Unlock()
}
// AddServerSideMove counts a server side move
func (s *StatsInfo) AddServerSideMove(n int64) {
s.mu.Lock()
s.serverSideMoves += 1
s.serverSideMoveBytes += n
s.mu.Unlock()
}
// AddServerSideCopy counts a server side copy
func (s *StatsInfo) AddServerSideCopy(n int64) {
s.mu.Lock()
s.serverSideCopies += 1
s.serverSideCopyBytes += n
s.mu.Unlock()
}

View File

@@ -97,10 +97,6 @@ Returns the following values:
"lastError": last error string,
"renames" : number of files renamed,
"retryError": boolean showing whether there has been at least one non-NoRetryError,
"serverSideCopies": number of server side copies done,
"serverSideCopyBytes": number bytes server side copied,
"serverSideMoves": number of server side moves done,
"serverSideMoveBytes": number bytes server side moved,
"speed": average speed in bytes per second since start of the group,
"totalBytes": total number of bytes in the group,
"totalChecks": total number of checks in the group,

View File

@@ -392,7 +392,7 @@ func Copy(ctx context.Context, f fs.Fs, dst fs.Object, remote string, src fs.Obj
}
if doCopy := f.Features().Copy; doCopy != nil && (SameConfig(src.Fs(), f) || (SameRemoteType(src.Fs(), f) && (f.Features().ServerSideAcrossConfigs || ci.ServerSideAcrossConfigs))) {
in := tr.Account(ctx, nil) // account the transfer
in.ServerSideTransferStart()
in.ServerSideCopyStart()
newDst, err = doCopy(ctx, src, remote)
if err == nil {
dst = newDst
@@ -639,7 +639,7 @@ func Move(ctx context.Context, fdst fs.Fs, dst fs.Object, remote string, src fs.
}
// Move dst <- src
in := tr.Account(ctx, nil) // account the transfer
in.ServerSideTransferStart()
in.ServerSideCopyStart()
newDst, err = doMove(ctx, src, remote)
switch err {
case nil:
@@ -648,7 +648,7 @@ func Move(ctx context.Context, fdst fs.Fs, dst fs.Object, remote string, src fs.
} else {
fs.Infof(src, "Moved (server-side)")
}
in.ServerSideMoveEnd(newDst.Size()) // account the bytes for the server-side transfer
in.ServerSideCopyEnd(newDst.Size()) // account the bytes for the server-side transfer
_ = in.Close()
return newDst, nil
case fs.ErrorCantMove:

10
go.mod
View File

@@ -28,8 +28,8 @@ require (
github.com/go-chi/chi/v5 v5.0.10
github.com/google/uuid v1.3.0
github.com/hanwen/go-fuse/v2 v2.3.0
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230725204219-611ec433f83c
github.com/henrybear327/go-proton-api v0.0.0-20230725203741-316f1b3227a9
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230802163840-e054c27a8f64
github.com/henrybear327/go-proton-api v0.0.0-20230802163738-2539e3d6e690
github.com/hirochachacha/go-smb2 v1.1.0
github.com/iguanesolutions/go-systemd/v5 v5.1.1
github.com/jcmturner/gokrb5/v8 v8.4.4
@@ -66,7 +66,7 @@ require (
go.etcd.io/bbolt v1.3.7
goftp.io/server v1.0.0-rc1
golang.org/x/crypto v0.11.0
golang.org/x/net v0.12.0
golang.org/x/net v0.13.0
golang.org/x/oauth2 v0.10.0
golang.org/x/sync v0.3.0
golang.org/x/sys v0.10.0
@@ -83,7 +83,7 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect
github.com/ProtonMail/gluon v0.17.0 // indirect
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e // indirect
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
github.com/ProtonMail/go-srp v0.0.7 // indirect
github.com/ProtonMail/gopenpgp/v2 v2.7.2 // indirect
@@ -151,7 +151,7 @@ require (
github.com/zeebo/blake3 v0.2.3 // indirect
github.com/zeebo/errs v1.3.0 // indirect
go.opencensus.io v0.24.0 // indirect
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 // indirect
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771 // indirect
google.golang.org/grpc v1.56.2 // indirect

28
go.sum
View File

@@ -1,7 +1,5 @@
bazil.org/fuse v0.0.0-20221209211307-2abb8038c751 h1:WDXfyDLJ+tg8PYC6yIkOmc/RWFrqMgxk1rLpRrlR8Ng=
bazil.org/fuse v0.0.0-20221209211307-2abb8038c751/go.mod h1:eX+feLR06AMFrTGQBzFnMMDz1vjBv2yHZBFlI9RJeaQ=
bazil.org/fuse v0.0.0-20230120002735-62a210ff1fd5 h1:A0NsYy4lDBZAC6QiYeJ4N+XuHIKBpyhAVRMHRQZKTeQ=
bazil.org/fuse v0.0.0-20230120002735-62a210ff1fd5/go.mod h1:gG3RZAMXCa/OTes6rr9EwusmR1OH1tDDy+cg9c5YliY=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -62,8 +60,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v
github.com/ProtonMail/bcrypt v0.0.0-20210511135022-227b4adcab57/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I=
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs69zUkSzubzjBbL+cmOXgnmt9Fyd9ug=
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo=
github.com/ProtonMail/gluon v0.17.0 h1:QfMRUcXd47MANHmoerj1ZHXsNzfW9gjsLmF+7Dim5ZU=
github.com/ProtonMail/gluon v0.17.0/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo=
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e h1:lCsqUUACrcMC83lg5rTo9Y0PnPItE61JSfvMyIcANwk=
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo=
github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE=
github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs=
github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
@@ -297,10 +295,10 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230725204219-611ec433f83c h1:dtM2iOEwFBbpV7jSAZ+EHL4LUWhm2rsofkZhFzTL2jM=
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230725204219-611ec433f83c/go.mod h1:iY633SZMUnQE1PCV7gBU7u+35TCDVkEqA0IhHHyBdOg=
github.com/henrybear327/go-proton-api v0.0.0-20230725203741-316f1b3227a9 h1:ITuA1x2yBCE4Wgae+ywZmezVuKOKhJ4nuDtColKE32c=
github.com/henrybear327/go-proton-api v0.0.0-20230725203741-316f1b3227a9/go.mod h1:eHoT/G3lmdatxoY04LSQthG/YnPmu4aebNZe8h+yvBc=
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230802163840-e054c27a8f64 h1:4e2+OI11mLq6XCzGvWcUKCoxgZZhWItLZI1qvIwGhD8=
github.com/henrybear327/Proton-API-Bridge v0.0.0-20230802163840-e054c27a8f64/go.mod h1:ZkRlm86TtjTcLoafz4AwFNBE0CrXpw6EkKBQhZMjyIs=
github.com/henrybear327/go-proton-api v0.0.0-20230802163738-2539e3d6e690 h1:AW2p1djlmA2S7ss6hVj+TcEwtKdIOphFL4SpaOVHwfE=
github.com/henrybear327/go-proton-api v0.0.0-20230802163738-2539e3d6e690/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMXYafI8H74D77AxytOBc=
github.com/hirochachacha/go-smb2 v1.1.0 h1:b6hs9qKIql9eVXAiN0M2wSFY5xnhbHAQoCwRKbaRTZI=
github.com/hirochachacha/go-smb2 v1.1.0/go.mod h1:8F1A4d5EZzrGu5R7PU163UcMRDJQl4FtcxjBfsY8TZE=
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
@@ -421,8 +419,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
@@ -430,10 +426,6 @@ github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
github.com/putdotio/go-putio/putio v0.0.0-20200123120452-16d982cac2b8 h1:Y258uzXU/potCYnQd1r6wlAnoMB68BiCkCcCnKx1SH8=
github.com/putdotio/go-putio/putio v0.0.0-20200123120452-16d982cac2b8/go.mod h1:bSJjRokAHHOhA+XFxplld8w2R/dXLH7Z3BZ532vhFwU=
github.com/rclone/ftp v0.0.0-20230327202000-dadc1f64e87d h1:ZyH6ZfA/PzxF4qQS2MgFLXRdw/pWOSNJA7Lq0pkX49Y=
@@ -576,8 +568,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY=
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b h1:r+vk0EmXNmekl0S0BascoeeoHk/L7wmaW2QF90K+kYI=
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -644,8 +636,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=