From ba8672b53f4b6840528df6fd534cb16f65278711 Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Fri, 5 Jan 2024 12:13:13 -0500 Subject: [PATCH 001/105] go/analysis/passes/unusedresult: add functions from slices package This change adds to the list various slice-altering functions whose result it is a mistake to ignore. Change-Id: I0ecdd55b19760c44120e91b198a7f74b1c460bdc Reviewed-on: https://go-review.googlesource.com/c/tools/+/554317 Reviewed-by: Robert Findley Auto-Submit: Alan Donovan LUCI-TryBot-Result: Go LUCI --- .../passes/unusedresult/unusedresult.go | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/go/analysis/passes/unusedresult/unusedresult.go b/go/analysis/passes/unusedresult/unusedresult.go index 7f79b4a7543..76f42b052e4 100644 --- a/go/analysis/passes/unusedresult/unusedresult.go +++ b/go/analysis/passes/unusedresult/unusedresult.go @@ -59,7 +59,25 @@ func init() { // List standard library functions here. // The context.With{Cancel,Deadline,Timeout} entries are // effectively redundant wrt the lostcancel analyzer. - funcs.Set("errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse,context.WithValue,context.WithCancel,context.WithDeadline,context.WithTimeout") + funcs = stringSetFlag{ + "context.WithCancel": true, + "context.WithDeadline": true, + "context.WithTimeout": true, + "context.WithValue": true, + "errors.New": true, + "fmt.Errorf": true, + "fmt.Sprint": true, + "fmt.Sprintf": true, + "slices.Clip": true, + "slices.Compact": true, + "slices.CompactFunc": true, + "slices.Delete": true, + "slices.DeleteFunc": true, + "slices.Grow": true, + "slices.Insert": true, + "slices.Replace": true, + "sort.Reverse": true, + } Analyzer.Flags.Var(&funcs, "funcs", "comma-separated list of functions whose results must be used") From c9c95f97fda18f56ab4c8c406e9f48a4cb3b3d7e Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Fri, 5 Jan 2024 14:54:16 -0500 Subject: [PATCH 002/105] internal/refactor/inline: improve a confusing error message Change-Id: I31e587105ffd16dbe32436ce5a090180f5186200 Reviewed-on: https://go-review.googlesource.com/c/tools/+/554061 Auto-Submit: Alan Donovan LUCI-TryBot-Result: Go LUCI Reviewed-by: Robert Findley --- internal/refactor/inline/inline.go | 7 ++++--- internal/refactor/inline/testdata/err-shadow-builtin.txtar | 6 +++--- internal/refactor/inline/testdata/err-shadow-pkg.txtar | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/refactor/inline/inline.go b/internal/refactor/inline/inline.go index 06f64013c79..7eaa6bff3f5 100644 --- a/internal/refactor/inline/inline.go +++ b/internal/refactor/inline/inline.go @@ -485,7 +485,7 @@ func inline(logf func(string, ...any), caller *Caller, callee *gobCallee) (*resu // check not shadowed at caller. found := caller.lookup(obj.Name) // always finds something if found.Pos().IsValid() { - return nil, fmt.Errorf("cannot inline because built-in %q is shadowed in caller by a %s (line %d)", + return nil, fmt.Errorf("cannot inline, because the callee refers to built-in %q, which in the caller is shadowed by a %s (declared at line %d)", obj.Name, objectKind(found), caller.Fset.PositionFor(found.Pos(), false).Line) } @@ -505,8 +505,9 @@ func inline(logf func(string, ...any), caller *Caller, callee *gobCallee) (*resu // around the refactored signature. found := caller.lookup(obj.Name) if found != nil && !isPkgLevel(found) { - return nil, fmt.Errorf("cannot inline because %q is shadowed in caller by a %s (line %d)", - obj.Name, objectKind(found), + return nil, fmt.Errorf("cannot inline, because the callee refers to %s %q, which in the caller is shadowed by a %s (declared at line %d)", + obj.Kind, obj.Name, + objectKind(found), caller.Fset.PositionFor(found.Pos(), false).Line) } } else { diff --git a/internal/refactor/inline/testdata/err-shadow-builtin.txtar b/internal/refactor/inline/testdata/err-shadow-builtin.txtar index 543d38fe540..34ea586ab3e 100644 --- a/internal/refactor/inline/testdata/err-shadow-builtin.txtar +++ b/internal/refactor/inline/testdata/err-shadow-builtin.txtar @@ -10,7 +10,7 @@ package a func _() { const nil = 1 - _ = f() //@ inline(re"f", re"nil.*shadowed.*by.*const .line 4") + _ = f() //@ inline(re"f", re"nil.*shadowed.*by.*const.*line 4") } func f() *int { return nil } @@ -20,7 +20,7 @@ package a func _() { type append int - g(nil) //@ inline(re"g", re"append.*shadowed.*by.*typename .line 4") + g(nil) //@ inline(re"g", re"append.*shadowed.*by.*typename.*line 4") } func g(x []int) { _ = append(x, x...) } @@ -30,7 +30,7 @@ package a func _() { type int uint8 - _ = h(0) //@ inline(re"h", re"int.*shadowed.*by.*typename .line 4") + _ = h(0) //@ inline(re"h", re"int.*shadowed.*by.*typename.*line 4") } func h(x int) int { return x + 1 } diff --git a/internal/refactor/inline/testdata/err-shadow-pkg.txtar b/internal/refactor/inline/testdata/err-shadow-pkg.txtar index 4338b8b31cd..792418dd453 100644 --- a/internal/refactor/inline/testdata/err-shadow-pkg.txtar +++ b/internal/refactor/inline/testdata/err-shadow-pkg.txtar @@ -15,7 +15,7 @@ package a func _() { f() //@ inline(re"f", result) const v = 1 - f() //@ inline(re"f", re"v.*shadowed.*by.*const .line 5") + f() //@ inline(re"f", re"v.*shadowed.*by.*const.*line 5") } func f() int { return v } @@ -28,7 +28,7 @@ package a func _() { _ = v //@ inline(re"f", result) const v = 1 - f() //@ inline(re"f", re"v.*shadowed.*by.*const .line 5") + f() //@ inline(re"f", re"v.*shadowed.*by.*const.*line 5") } func f() int { return v } From 25a0e9d3e36e70c0dd9ab7302baa370bd20373b1 Mon Sep 17 00:00:00 2001 From: Gopher Robot Date: Mon, 8 Jan 2024 18:27:07 +0000 Subject: [PATCH 003/105] go.mod: update golang.org/x dependencies Update golang.org/x dependencies to their latest tagged versions. Change-Id: I118225b7aefe8529d2454f48fbc731ad9fd48cdf Reviewed-on: https://go-review.googlesource.com/c/tools/+/554677 Auto-Submit: Gopher Robot Reviewed-by: Than McIntosh Reviewed-by: Dmitri Shuralyov LUCI-TryBot-Result: Go LUCI --- go.mod | 4 ++-- go.sum | 8 ++++---- gopls/go.mod | 4 ++-- gopls/go.sum | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 0f57d6751c5..8cf0ccc7da7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/yuin/goldmark v1.4.13 golang.org/x/mod v0.14.0 - golang.org/x/net v0.19.0 + golang.org/x/net v0.20.0 ) -require golang.org/x/sync v0.5.0 +require golang.org/x/sync v0.6.0 diff --git a/go.sum b/go.sum index cb917ea2726..cc5534add2c 100644 --- a/go.sum +++ b/go.sum @@ -2,7 +2,7 @@ github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= diff --git a/gopls/go.mod b/gopls/go.mod index f22cef7577a..903a7ada8a9 100644 --- a/gopls/go.mod +++ b/gopls/go.mod @@ -7,7 +7,7 @@ require ( github.com/jba/printsrc v0.2.2 github.com/jba/templatecheck v0.6.0 golang.org/x/mod v0.14.0 - golang.org/x/sync v0.5.0 + golang.org/x/sync v0.6.0 golang.org/x/telemetry v0.0.0-20231114163143-69313e640400 golang.org/x/text v0.14.0 golang.org/x/tools v0.13.1-0.20230920233436-f9b8da7b22be @@ -22,7 +22,7 @@ require ( github.com/BurntSushi/toml v1.2.1 // indirect github.com/google/safehtml v0.1.0 // indirect golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.16.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) diff --git a/gopls/go.sum b/gopls/go.sum index 3fab4a46e44..a4a914744ae 100644 --- a/gopls/go.sum +++ b/gopls/go.sum @@ -19,25 +19,25 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y= golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20231114163143-69313e640400 h1:brbkEFfGwNGAEkykUOcryE/JiHUMMJouzE0fWWmz/QU= golang.org/x/telemetry v0.0.0-20231114163143-69313e640400/go.mod h1:P6hMdmAcoG7FyATwqSr6R/U0n7yeXNP/QXeRlxb1szE= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= From c95fa0ff4c2370b6f4b78947fc45987c8d0d664a Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Mon, 8 Jan 2024 13:58:42 -0500 Subject: [PATCH 004/105] gopls/internal/test: skip marker tests on darwin builders if -short Marker tests involve a lot of Go command invocations, which themselves involve a lot of I/O. This seems to make them remarkably slower on legacy darwin builders. Skip if -short for now, to mitigate flakiness. Per chat with the release team, LUCI darwin builders are significantly faster and more stable. Since we only have to support the legacy builders for a bit longer, a skip seems warranted. Fixes golang/go#64473 Change-Id: I9c6d6379017943faee4c02eef32768a6f2af6551 Reviewed-on: https://go-review.googlesource.com/c/tools/+/554716 TryBot-Result: Gopher Robot Run-TryBot: Robert Findley Reviewed-by: Alan Donovan LUCI-TryBot-Result: Go LUCI --- gopls/internal/test/marker/marker_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index ecdabd455fe..f5b068e3343 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -85,6 +85,9 @@ func TestMain(m *testing.M) { // - The old tests lacked documentation, and often had failures that were hard // to understand. By starting from scratch, we can revisit these aspects. func Test(t *testing.T) { + if testing.Short() && strings.HasPrefix(os.Getenv("GO_BUILDER_NAME"), "darwin-") { + t.Skip("golang/go#64473: skipping with -short: this test is too slow on darwin builders") + } // The marker tests must be able to run go/packages.Load. testenv.NeedsGoPackages(t) From 581c0b357f883185d60780718e053e600005dac4 Mon Sep 17 00:00:00 2001 From: toad <530901331qq@gmail.com> Date: Wed, 13 Dec 2023 10:17:58 +0800 Subject: [PATCH 005/105] gopls/internal/lsp/source: add receiver name to stubbed methods Fixes golang/go#64078 Change-Id: Ib551119b04a36d0be0929a3f949b052b598f57ad Reviewed-on: https://go-review.googlesource.com/c/tools/+/544916 LUCI-TryBot-Result: Go LUCI Reviewed-by: Dmitri Shuralyov Auto-Submit: Robert Findley Reviewed-by: Robert Findley --- gopls/internal/cmd/integration_test.go | 2 +- gopls/internal/lsp/source/stub.go | 31 ++++++++++++++- .../marker/testdata/stubmethods/basic.txt | 2 +- .../testdata/stubmethods/issue61693.txt | 2 +- .../testdata/stubmethods/issue61830.txt | 2 +- .../testdata/stubmethods/issue64078.txt | 36 ++++++++++++++++++ .../testdata/stubmethods/issue64114.txt | 4 +- .../marker/testdata/suggestedfix/stub.txt | 38 +++++++++---------- 8 files changed, 91 insertions(+), 26 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/stubmethods/issue64078.txt diff --git a/gopls/internal/cmd/integration_test.go b/gopls/internal/cmd/integration_test.go index 80b4e34e8bf..4da649f5b4c 100644 --- a/gopls/internal/cmd/integration_test.go +++ b/gopls/internal/cmd/integration_test.go @@ -978,7 +978,7 @@ var _ io.Reader = C{} type C struct{} // Read implements io.Reader. -func (C) Read(p []byte) (n int, err error) { +func (c C) Read(p []byte) (n int, err error) { panic("unimplemented") } `[1:] diff --git a/gopls/internal/lsp/source/stub.go b/gopls/internal/lsp/source/stub.go index ac30aeca818..138b7acb5ea 100644 --- a/gopls/internal/lsp/source/stub.go +++ b/gopls/internal/lsp/source/stub.go @@ -190,17 +190,46 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. star = "*" } + // If there are any that have named receiver, choose the first one. + // Otherwise, use lowercase for the first letter of the object. + rn := strings.ToLower(si.Concrete.Obj().Name()[0:1]) + for i := 0; i < si.Concrete.NumMethods(); i++ { + if recv, ok := si.Concrete.Method(i).Type().(*types.Signature); ok && recv.Recv().Name() != "" { + rn = recv.Recv().Name() + break + } + } + + // Check for receiver name conflicts + checkRecvName := func(tuple *types.Tuple) bool { + for i := 0; i < tuple.Len(); i++ { + if rn == tuple.At(i).Name() { + return true + } + } + return false + } + // Format the new methods. var newMethods bytes.Buffer + for index := range missing { + mrn := rn + " " + if sig, ok := missing[index].fn.Type().(*types.Signature); ok { + if checkRecvName(sig.Params()) || checkRecvName(sig.Results()) { + mrn = "" + } + } + fmt.Fprintf(&newMethods, `// %s implements %s. -%sfunc (%s%s%s) %s%s { +%sfunc (%s%s%s%s) %s%s { panic("unimplemented") } `, missing[index].fn.Name(), iface, missing[index].needSubtle, + mrn, star, si.Concrete.Obj().Name(), FormatTypeParams(si.Concrete.TypeParams()), diff --git a/gopls/internal/test/marker/testdata/stubmethods/basic.txt b/gopls/internal/test/marker/testdata/stubmethods/basic.txt index 5f87d13f5c7..95b515299a6 100644 --- a/gopls/internal/test/marker/testdata/stubmethods/basic.txt +++ b/gopls/internal/test/marker/testdata/stubmethods/basic.txt @@ -13,7 +13,7 @@ var _ error = C(0) //@suggestedfix(re"C.0.", re"missing method Error", stub) -- @stub/a/a.go -- @@ -5 +5,5 @@ +// Error implements error. -+func (C) Error() string { ++func (c C) Error() string { + panic("unimplemented") +} + diff --git a/gopls/internal/test/marker/testdata/stubmethods/issue61693.txt b/gopls/internal/test/marker/testdata/stubmethods/issue61693.txt index 40596da469b..387b494bc72 100644 --- a/gopls/internal/test/marker/testdata/stubmethods/issue61693.txt +++ b/gopls/internal/test/marker/testdata/stubmethods/issue61693.txt @@ -20,7 +20,7 @@ func _() { -- @stub/main.go -- @@ -5 +5,5 @@ +// Error implements error. -+func (C) Error() string { ++func (c C) Error() string { + panic("unimplemented") +} + diff --git a/gopls/internal/test/marker/testdata/stubmethods/issue61830.txt b/gopls/internal/test/marker/testdata/stubmethods/issue61830.txt index 0f23ffb39ee..bf5bcc5ca2e 100644 --- a/gopls/internal/test/marker/testdata/stubmethods/issue61830.txt +++ b/gopls/internal/test/marker/testdata/stubmethods/issue61830.txt @@ -18,7 +18,7 @@ var _ I = &A{} //@suggestedfix(re"&A..", re"missing method M", stub) -- @stub/p.go -- @@ -13 +13,5 @@ +// M implements I. -+func (*A) M(io.Reader, B) { ++func (a *A) M(io.Reader, B) { + panic("unimplemented") +} + diff --git a/gopls/internal/test/marker/testdata/stubmethods/issue64078.txt b/gopls/internal/test/marker/testdata/stubmethods/issue64078.txt new file mode 100644 index 00000000000..50db6f27cfd --- /dev/null +++ b/gopls/internal/test/marker/testdata/stubmethods/issue64078.txt @@ -0,0 +1,36 @@ +This test verifies that the named receiver is generated. + +-- p.go -- +package p + +type A struct{} + +func (aa *A) M1() { + panic("unimplemented") +} + +type I interface { + M1() + M2(aa string) + M3(bb string) + M4() (aa string) +} + +var _ I = &A{} //@suggestedfix(re"&A..", re"missing method M", stub) +-- @stub/p.go -- +@@ -5 +5,15 @@ ++// M2 implements I. ++func (*A) M2(aa string) { ++ panic("unimplemented") ++} ++ ++// M3 implements I. ++func (aa *A) M3(bb string) { ++ panic("unimplemented") ++} ++ ++// M4 implements I. ++func (*A) M4() (aa string) { ++ panic("unimplemented") ++} ++ diff --git a/gopls/internal/test/marker/testdata/stubmethods/issue64114.txt b/gopls/internal/test/marker/testdata/stubmethods/issue64114.txt index bf4d875aded..35f6db728bb 100644 --- a/gopls/internal/test/marker/testdata/stubmethods/issue64114.txt +++ b/gopls/internal/test/marker/testdata/stubmethods/issue64114.txt @@ -27,11 +27,11 @@ type WriteStruct struct { + +// RRRR implements WriteTest. +// Subtle: this method shadows the method (WriterTwoStruct).RRRR of WriteStruct.WriterTwoStruct. -+func (*WriteStruct) RRRR() { ++func (w *WriteStruct) RRRR() { + panic("unimplemented") +} + +// WWWW implements WriteTest. -+func (*WriteStruct) WWWW() { ++func (w *WriteStruct) WWWW() { + panic("unimplemented") +} diff --git a/gopls/internal/test/marker/testdata/suggestedfix/stub.txt b/gopls/internal/test/marker/testdata/suggestedfix/stub.txt index 514a293f602..e31494ae461 100644 --- a/gopls/internal/test/marker/testdata/suggestedfix/stub.txt +++ b/gopls/internal/test/marker/testdata/suggestedfix/stub.txt @@ -53,7 +53,7 @@ type byteWriter struct{} @@ -12 +12,5 @@ + +// WriteByte implements io.ByteWriter. -+func (*byteWriter) WriteByte(c byte) error { ++func (b *byteWriter) WriteByte(c byte) error { + panic("unimplemented") +} -- assign_multivars.go -- @@ -73,7 +73,7 @@ type multiByteWriter struct{} @@ -13 +13,5 @@ + +// WriteByte implements io.ByteWriter. -+func (*multiByteWriter) WriteByte(c byte) error { ++func (m *multiByteWriter) WriteByte(c byte) error { + panic("unimplemented") +} -- call_expr.go -- @@ -94,7 +94,7 @@ type callExpr struct{} @@ -14 +14,5 @@ + +// Error implements error. -+func (*callExpr) Error() string { ++func (c *callExpr) Error() string { + panic("unimplemented") +} -- embedded.go -- @@ -116,22 +116,22 @@ type embeddedInterface interface { -- @embedded/embedded.go -- @@ -12 +12,20 @@ +// Len implements embeddedInterface. -+func (*embeddedConcrete) Len() int { ++func (e *embeddedConcrete) Len() int { + panic("unimplemented") +} + +// Less implements embeddedInterface. -+func (*embeddedConcrete) Less(i int, j int) bool { ++func (e *embeddedConcrete) Less(i int, j int) bool { + panic("unimplemented") +} + +// Read implements embeddedInterface. -+func (*embeddedConcrete) Read(p []byte) (n int, err error) { ++func (e *embeddedConcrete) Read(p []byte) (n int, err error) { + panic("unimplemented") +} + +// Swap implements embeddedInterface. -+func (*embeddedConcrete) Swap(i int, j int) { ++func (e *embeddedConcrete) Swap(i int, j int) { + panic("unimplemented") +} + @@ -148,7 +148,7 @@ type customErr struct{} @@ -9 +9,5 @@ + +// Error implements error. -+func (*customErr) Error() string { ++func (c *customErr) Error() string { + panic("unimplemented") +} -- function_return.go -- @@ -167,7 +167,7 @@ type closer struct{} @@ -12 +12,5 @@ + +// Close implements io.Closer. -+func (closer) Close() error { ++func (c closer) Close() error { + panic("unimplemented") +} -- generic_receiver.go -- @@ -187,7 +187,7 @@ type genReader[T, Y any] struct { @@ -13 +13,5 @@ + +// ReadFrom implements io.ReaderFrom. -+func (*genReader[T, Y]) ReadFrom(r io.Reader) (n int64, err error) { ++func (g *genReader[T, Y]) ReadFrom(r io.Reader) (n int64, err error) { + panic("unimplemented") +} -- ignored_imports.go -- @@ -213,7 +213,7 @@ type ignoredResetter struct{} @@ -19 +19,5 @@ + +// Reset implements zlib.Resetter. -+func (*ignoredResetter) Reset(r Reader, dict []byte) error { ++func (i *ignoredResetter) Reset(r Reader, dict []byte) error { + panic("unimplemented") +} -- issue2606.go -- @@ -227,7 +227,7 @@ var _ I = C(0) //@suggestedfix("C", re"does not implement", issue2606) -- @issue2606/issue2606.go -- @@ -7 +7,5 @@ +// Error implements I. -+func (C) Error() string { ++func (c C) Error() string { + panic("unimplemented") +} + @@ -247,7 +247,7 @@ type multiVar struct{} @@ -12 +12,5 @@ + +// Read implements io.Reader. -+func (*multiVar) Read(p []byte) (n int, err error) { ++func (m *multiVar) Read(p []byte) (n int, err error) { + panic("unimplemented") +} -- pointer.go -- @@ -264,7 +264,7 @@ type pointerImpl struct{} @@ -10 +10,5 @@ + +// ReadFrom implements io.ReaderFrom. -+func (*pointerImpl) ReadFrom(r io.Reader) (n int64, err error) { ++func (p *pointerImpl) ReadFrom(r io.Reader) (n int64, err error) { + panic("unimplemented") +} -- renamed_import.go -- @@ -283,7 +283,7 @@ type myIO struct{} @@ -12 +12,5 @@ + +// Reset implements zlib.Resetter. -+func (*myIO) Reset(r myio.Reader, dict []byte) error { ++func (m *myIO) Reset(r myio.Reader, dict []byte) error { + panic("unimplemented") +} -- renamed_import_iface.go -- @@ -307,7 +307,7 @@ type otherInterfaceImpl struct{} @@ -14 +16,5 @@ + +// Get implements other.Interface. -+func (*otherInterfaceImpl) Get(context.Context) *bytes.Buffer { ++func (o *otherInterfaceImpl) Get(context.Context) *bytes.Buffer { + panic("unimplemented") +} -- stdlib.go -- @@ -324,7 +324,7 @@ type writer struct{} @@ -10 +10,5 @@ + +// Write implements io.Writer. -+func (writer) Write(p []byte) (n int, err error) { ++func (w writer) Write(p []byte) (n int, err error) { + panic("unimplemented") +} -- typedecl_group.go -- @@ -354,12 +354,12 @@ func _() { -- @typedecl_group/typedecl_group.go -- @@ -18 +18,10 @@ +// Close implements io.ReadCloser. -+func (rdcloser) Close() error { ++func (r rdcloser) Close() error { + panic("unimplemented") +} + +// Read implements io.ReadCloser. -+func (rdcloser) Read(p []byte) (n int, err error) { ++func (r rdcloser) Read(p []byte) (n int, err error) { + panic("unimplemented") +} + From 706525de51451bb409297f305f23ac473eb693ff Mon Sep 17 00:00:00 2001 From: rogeryk Date: Wed, 13 Dec 2023 21:40:58 +0800 Subject: [PATCH 006/105] gopls/internal/lsp/source/completion: support postfix completion (iferr, variferr) Go require explicit error handle, you must check and return error after some function call. These postfix completion can help to write the check error code. The postfix completion iferr replace strconv.Atoi("32").iferr to if _, err := strconv.Atoi("32"); err != nil { return zero1, zero2, err } The postfix completion variferr replace strconv.Atoi("32").variferr to value, err := strconv.Atoi("32"); if err != nil { return zero1, zero2, err } The "zero1", "zero2" represent the zero value of enclosed function results. Fixes golang/go#64178 Change-Id: I8313168514bfdfd22ad03b0228d4ca738ba9e9e3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/550455 Reviewed-by: Robert Findley Reviewed-by: Dmitri Shuralyov Auto-Submit: Robert Findley LUCI-TryBot-Result: Go LUCI --- .../lsp/source/completion/postfix_snippets.go | 165 ++++++++++++++++-- .../completion/postfix_snippet_test.go | 2 + .../marker/testdata/completion/postfix.txt | 33 ++++ .../completion/postfix_placeholder.txt | 30 ++++ 4 files changed, 217 insertions(+), 13 deletions(-) diff --git a/gopls/internal/lsp/source/completion/postfix_snippets.go b/gopls/internal/lsp/source/completion/postfix_snippets.go index 1661709e5dc..0490b386161 100644 --- a/gopls/internal/lsp/source/completion/postfix_snippets.go +++ b/gopls/internal/lsp/source/completion/postfix_snippets.go @@ -68,6 +68,10 @@ type postfixTmplArgs struct { // Type is the type of "foo.bar" in "foo.bar.print!". Type types.Type + // FuncResult are results of the enclosed function + FuncResults []*types.Var + + sel *ast.SelectorExpr scope *types.Scope snip snippet.Builder importIfNeeded func(pkgPath string, scope *types.Scope) (name string, edits []protocol.TextEdit, err error) @@ -75,6 +79,7 @@ type postfixTmplArgs struct { qf types.Qualifier varNames map[string]bool placeholders bool + currentTabStop int } var postfixTmpls = []postfixTmpl{{ @@ -250,26 +255,119 @@ if {{.X}} != nil { body: `{{if (eq .Kind "slice" "map" "array" "chan") -}} len({{.X}}) {{- end}}`, +}, { + label: "iferr", + details: "check error and return", + body: `{{if and .StmtOK (eq (.TypeName .Type) "error") -}} +{{- $errName := (or (and .IsIdent .X) "err") -}} +if {{if not .IsIdent}}err := {{.X}}; {{end}}{{$errName}} != nil { + return {{$a := .}}{{range $i, $v := .FuncResults}} + {{- if $i}}, {{end -}} + {{- if eq ($a.TypeName $v.Type) "error" -}} + {{$a.Placeholder $errName}} + {{- else -}} + {{$a.Zero $v.Type}} + {{- end -}} + {{end}} +} +{{end}}`, +}, { + label: "iferr", + details: "check error and return", + body: `{{if and .StmtOK (eq .Kind "tuple") (len .Tuple) (eq (.TypeName .TupleLast.Type) "error") -}} +{{- $a := . -}} +if {{range $i, $v := .Tuple}}{{if $i}}, {{end}}{{if and (eq ($a.TypeName $v.Type) "error") (eq (inc $i) (len $a.Tuple))}}err{{else}}_{{end}}{{end}} := {{.X -}} +; err != nil { + return {{range $i, $v := .FuncResults}} + {{- if $i}}, {{end -}} + {{- if eq ($a.TypeName $v.Type) "error" -}} + {{$a.Placeholder "err"}} + {{- else -}} + {{$a.Zero $v.Type}} + {{- end -}} + {{end}} +} +{{end}}`, +}, { + // variferr snippets use nested placeholders, as described in + // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#snippet_syntax, + // so that users can wrap the returned error without modifying the error + // variable name. + label: "variferr", + details: "assign variables and check error", + body: `{{if and .StmtOK (eq .Kind "tuple") (len .Tuple) (eq (.TypeName .TupleLast.Type) "error") -}} +{{- $a := . -}} +{{- $errName := "err" -}} +{{- range $i, $v := .Tuple -}} + {{- if $i}}, {{end -}} + {{- if and (eq ($a.TypeName $v.Type) "error") (eq (inc $i) (len $a.Tuple)) -}} + {{$errName | $a.SpecifiedPlaceholder (len $a.Tuple)}} + {{- else -}} + {{$a.VarName $v.Type $v.Name | $a.Placeholder}} + {{- end -}} +{{- end}} := {{.X}} +if {{$errName | $a.SpecifiedPlaceholder (len $a.Tuple)}} != nil { + return {{range $i, $v := .FuncResults}} + {{- if $i}}, {{end -}} + {{- if eq ($a.TypeName $v.Type) "error" -}} + {{$errName | $a.SpecifiedPlaceholder (len $a.Tuple) | + $a.SpecifiedPlaceholder (inc (len $a.Tuple))}} + {{- else -}} + {{$a.Zero $v.Type}} + {{- end -}} + {{end}} +} +{{end}}`, +}, { + label: "variferr", + details: "assign variables and check error", + body: `{{if and .StmtOK (eq (.TypeName .Type) "error") -}} +{{- $a := . -}} +{{- $errName := .VarName nil "err" -}} +{{$errName | $a.SpecifiedPlaceholder 1}} := {{.X}} +if {{$errName | $a.SpecifiedPlaceholder 1}} != nil { + return {{range $i, $v := .FuncResults}} + {{- if $i}}, {{end -}} + {{- if eq ($a.TypeName $v.Type) "error" -}} + {{$errName | $a.SpecifiedPlaceholder 1 | $a.SpecifiedPlaceholder 2}} + {{- else -}} + {{$a.Zero $v.Type}} + {{- end -}} + {{end}} +} +{{end}}`, }} // Cursor indicates where the client's cursor should end up after the // snippet is done. func (a *postfixTmplArgs) Cursor() string { - a.snip.WriteFinalTabstop() - return "" + return "$0" } -// Placeholder indicate a tab stops with the placeholder string, the order +// Placeholder indicate a tab stop with the placeholder string, the order // of tab stops is the same as the order of invocation -func (a *postfixTmplArgs) Placeholder(s string) string { - if a.placeholders { - a.snip.WritePlaceholder(func(b *snippet.Builder) { - b.WriteText(s) - }) - } else { - a.snip.WritePlaceholder(nil) +func (a *postfixTmplArgs) Placeholder(placeholder string) string { + if !a.placeholders { + placeholder = "" + } + return fmt.Sprintf("${%d:%s}", a.nextTabStop(), placeholder) +} + +// nextTabStop returns the next tab stop index for a new placeholder. +func (a *postfixTmplArgs) nextTabStop() int { + // Tab stops start from 1, so increment before returning. + a.currentTabStop++ + return a.currentTabStop +} + +// SpecifiedPlaceholder indicate a specified tab stop with the placeholder string. +// Sometimes the same tab stop appears in multiple places and their numbers +// need to be specified. e.g. variferr +func (a *postfixTmplArgs) SpecifiedPlaceholder(tabStop int, placeholder string) string { + if !a.placeholders { + placeholder = "" } - return "" + return fmt.Sprintf("${%d:%s}", tabStop, placeholder) } // Import makes sure the package corresponding to path is imported, @@ -309,7 +407,7 @@ func (a *postfixTmplArgs) KeyType() types.Type { return a.Type.Underlying().(*types.Map).Key() } -// Tuple returns the tuple result vars if X is a call expression. +// Tuple returns the tuple result vars if the type of X is tuple. func (a *postfixTmplArgs) Tuple() []*types.Var { tuple, _ := a.Type.(*types.Tuple) if tuple == nil { @@ -323,6 +421,18 @@ func (a *postfixTmplArgs) Tuple() []*types.Var { return typs } +// TupleLast returns the last tuple result vars if the type of X is tuple. +func (a *postfixTmplArgs) TupleLast() *types.Var { + tuple, _ := a.Type.(*types.Tuple) + if tuple == nil { + return nil + } + if tuple.Len() == 0 { + return nil + } + return tuple.At(tuple.Len() - 1) +} + // TypeName returns the textual representation of type t. func (a *postfixTmplArgs) TypeName(t types.Type) (string, error) { if t == nil || t == types.Typ[types.Invalid] { @@ -331,6 +441,16 @@ func (a *postfixTmplArgs) TypeName(t types.Type) (string, error) { return types.TypeString(t, a.qf), nil } +// Zero return the zero value representation of type t +func (a *postfixTmplArgs) Zero(t types.Type) string { + return formatZeroValue(t, a.qf) +} + +func (a *postfixTmplArgs) IsIdent() bool { + _, ok := a.sel.X.(*ast.Ident) + return ok +} + // VarName returns a suitable variable name for the type t. If t // implements the error interface, "err" is used. If t is not a named // type then nonNamedDefault is used. Otherwise a name is made by @@ -417,6 +537,17 @@ func (c *completer) addPostfixSnippetCandidates(ctx context.Context, sel *ast.Se } } + var funcResults []*types.Var + if c.enclosingFunc != nil { + results := c.enclosingFunc.sig.Results() + if results != nil { + funcResults = make([]*types.Var, results.Len()) + for i := 0; i < results.Len(); i++ { + funcResults[i] = results.At(i) + } + } + } + scope := c.pkg.GetTypes().Scope().Innermost(c.pos) if scope == nil { return @@ -455,6 +586,8 @@ func (c *completer) addPostfixSnippetCandidates(ctx context.Context, sel *ast.Se StmtOK: stmtOK, Obj: exprObj(c.pkg.GetTypesInfo(), sel.X), Type: selType, + FuncResults: funcResults, + sel: sel, qf: c.qf, importIfNeeded: c.importIfNeeded, scope: scope, @@ -497,7 +630,9 @@ func initPostfixRules() { var idx int for _, rule := range postfixTmpls { var err error - rule.tmpl, err = template.New("postfix_snippet").Parse(rule.body) + rule.tmpl, err = template.New("postfix_snippet").Funcs(template.FuncMap{ + "inc": inc, + }).Parse(rule.body) if err != nil { log.Panicf("error parsing postfix snippet template: %v", err) } @@ -508,6 +643,10 @@ func initPostfixRules() { }) } +func inc(i int) int { + return i + 1 +} + // importIfNeeded returns the package identifier and any necessary // edits to import package pkgPath. func (c *completer) importIfNeeded(pkgPath string, scope *types.Scope) (string, []protocol.TextEdit, error) { diff --git a/gopls/internal/test/integration/completion/postfix_snippet_test.go b/gopls/internal/test/integration/completion/postfix_snippet_test.go index 0677280c5ec..31ea2e02b3e 100644 --- a/gopls/internal/test/integration/completion/postfix_snippet_test.go +++ b/gopls/internal/test/integration/completion/postfix_snippet_test.go @@ -306,6 +306,7 @@ func _() { ${1:}, ${2:} := foo() } `, + allowMultipleItem: true, }, { name: "var_single_value", @@ -318,6 +319,7 @@ func _() { foo().var } `, + allowMultipleItem: true, after: ` package foo diff --git a/gopls/internal/test/marker/testdata/completion/postfix.txt b/gopls/internal/test/marker/testdata/completion/postfix.txt index 63661ee9228..cab097465d7 100644 --- a/gopls/internal/test/marker/testdata/completion/postfix.txt +++ b/gopls/internal/test/marker/testdata/completion/postfix.txt @@ -13,6 +13,10 @@ go 1.18 -- postfix.go -- package snippets +import ( + "strconv" +) + func _() { var foo []int foo.append //@rank(" //", postfixAppend) @@ -96,3 +100,32 @@ func _() { foo.fo //@snippet(" //", postfixForChannel, "for ${1:} := range foo {\n\t$0\n}") foo.rang //@snippet(" //", postfixRangeChannel, "for ${1:} := range foo {\n\t$0\n}") } + +type T struct { + Name string +} + +func _() (string, T, map[string]string, error) { + /* iferr! */ //@item(postfixIfErr, "iferr!", "check error and return", "snippet") + /* variferr! */ //@item(postfixVarIfErr, "variferr!", "assign variables and check error", "snippet") + /* var! */ //@item(postfixVars, "var!", "assign to variables", "snippet") + + strconv.Atoi("32"). //@complete(" //", postfixIfErr, postfixPrint, postfixVars, postfixVarIfErr) + + var err error + err.iferr //@snippet(" //", postfixIfErr, "if err != nil {\n\treturn \"\", T{}, nil, ${1:}\n}\n") + + strconv.Atoi("32").iferr //@snippet(" //", postfixIfErr, "if _, err := strconv.Atoi(\"32\"); err != nil {\n\treturn \"\", T{}, nil, ${1:}\n}\n") + + strconv.Atoi("32").variferr //@snippet(" //", postfixVarIfErr, "${1:}, ${2:} := strconv.Atoi(\"32\")\nif ${2:} != nil {\n\treturn \"\", T{}, nil, ${3:}\n}\n") + + // test function return multiple errors + var foo func() (error, error) + foo().iferr //@snippet(" //", postfixIfErr, "if _, err := foo(); err != nil {\n\treturn \"\", T{}, nil, ${1:}\n}\n") + foo().variferr //@snippet(" //", postfixVarIfErr, "${1:}, ${2:} := foo()\nif ${2:} != nil {\n\treturn \"\", T{}, nil, ${3:}\n}\n") + + // test function just return error + var bar func() error + bar().iferr //@snippet(" //", postfixIfErr, "if err := bar(); err != nil {\n\treturn \"\", T{}, nil, ${1:}\n}\n") + bar().variferr //@snippet(" //", postfixVarIfErr, "${1:} := bar()\nif ${1:} != nil {\n\treturn \"\", T{}, nil, ${2:}\n}\n") +} diff --git a/gopls/internal/test/marker/testdata/completion/postfix_placeholder.txt b/gopls/internal/test/marker/testdata/completion/postfix_placeholder.txt index 44dfbc96df1..7569f130466 100644 --- a/gopls/internal/test/marker/testdata/completion/postfix_placeholder.txt +++ b/gopls/internal/test/marker/testdata/completion/postfix_placeholder.txt @@ -16,6 +16,10 @@ go 1.18 -- postfix.go -- package snippets +import ( + "strconv" +) + func _() { /* for! */ //@item(postfixFor, "for!", "range over slice by index", "snippet") /* forr! */ //@item(postfixForr, "forr!", "range over slice by index and value", "snippet") @@ -51,3 +55,29 @@ func _() { foo.fo //@snippet(" //", postfixForChannel, "for ${1:e} := range foo {\n\t$0\n}") foo.rang //@snippet(" //", postfixRangeChannel, "for ${1:e} := range foo {\n\t$0\n}") } + +type T struct { + Name string +} + +func _() (string, T, map[string]string, error) { + /* iferr! */ //@item(postfixIfErr, "iferr!", "check error and return", "snippet") + /* variferr! */ //@item(postfixVarIfErr, "variferr!", "assign variables and check error", "snippet") + /* var! */ //@item(postfixVars, "var!", "assign to variables", "snippet") + + + var err error + err.iferr //@snippet(" //", postfixIfErr, "if err != nil {\n\treturn \"\", T{}, nil, ${1:err}\n}\n") + strconv.Atoi("32").iferr //@snippet(" //", postfixIfErr, "if _, err := strconv.Atoi(\"32\"); err != nil {\n\treturn \"\", T{}, nil, ${1:err}\n}\n") + strconv.Atoi("32").variferr //@snippet(" //", postfixVarIfErr, "${1:i}, ${2:err} := strconv.Atoi(\"32\")\nif ${2:err} != nil {\n\treturn \"\", T{}, nil, ${3:${2:err}}\n}\n") + + // test function return multiple errors + var foo func() (error, error) + foo().iferr //@snippet(" //", postfixIfErr, "if _, err := foo(); err != nil {\n\treturn \"\", T{}, nil, ${1:err}\n}\n") + foo().variferr //@snippet(" //", postfixVarIfErr, "${1:err2}, ${2:err} := foo()\nif ${2:err} != nil {\n\treturn \"\", T{}, nil, ${3:${2:err}}\n}\n") + + // test function just return error + var bar func() error + bar().iferr //@snippet(" //", postfixIfErr, "if err := bar(); err != nil {\n\treturn \"\", T{}, nil, ${1:err}\n}\n") + bar().variferr //@snippet(" //", postfixVarIfErr, "${1:err2} := bar()\nif ${1:err2} != nil {\n\treturn \"\", T{}, nil, ${2:${1:err2}}\n}\n") +} From 0b1f1d4bc227cc2e610854f23e14696becb9e46c Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Tue, 9 Jan 2024 18:45:09 -0500 Subject: [PATCH 007/105] gopls/internal/lsp/cache: (re-)ensure clean shutdown CL 549415 (rightly) changed the logic for View shutdown to not await all work on the Snapshot, as this leads to potential deadlocks: we should never await work while holding a mutex. However, we still need to await all work when shutting down the Session, otherwise we end up with failures like golang/go#64971 ("directory not empty"). Therefore, we need a new synchronization mechanism. Introduce a sync.WaitGroup on the Session to allow awaiting the destruction of all Snapshots created on behalf of the Session. In order to support this, View invalidation becomes a method on the Session, rather than the View, and requires the Session.viewMu. Also make a few unrelated cosmetic improvements. Fixes golang/go#64971 Change-Id: I43fc0b5ff8a7762887fbfd64df7596e524383279 Reviewed-on: https://go-review.googlesource.com/c/tools/+/554996 LUCI-TryBot-Result: Go LUCI Reviewed-by: Alan Donovan --- gopls/internal/lsp/cache/session.go | 12 +++++-- gopls/internal/lsp/cache/snapshot.go | 14 +++++--- gopls/internal/lsp/cache/view.go | 52 ++++++++++++++++------------ gopls/internal/server/command.go | 20 +++++------ 4 files changed, 58 insertions(+), 40 deletions(-) diff --git a/gopls/internal/lsp/cache/session.go b/gopls/internal/lsp/cache/session.go index 7436bcb60f2..bf8cc54c0e4 100644 --- a/gopls/internal/lsp/cache/session.go +++ b/gopls/internal/lsp/cache/session.go @@ -42,6 +42,11 @@ type Session struct { views []*View viewMap map[protocol.DocumentURI]*View // file->best view; nil after shutdown + // snapshots is a counting semaphore that records the number + // of unreleased snapshots associated with this session. + // Shutdown waits for it to fall to zero. + snapshotWG sync.WaitGroup + parseCache *parseCache *overlayFS @@ -68,6 +73,7 @@ func (s *Session) Shutdown(ctx context.Context) { view.shutdown() } s.parseCache.stop() + s.snapshotWG.Wait() // wait for all work on associated snapshots to finish event.Log(ctx, "Shutdown session", KeyShutdownSession.Of(s)) } @@ -183,12 +189,14 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * }, } + s.snapshotWG.Add(1) v.snapshot = &Snapshot{ view: v, backgroundCtx: backgroundCtx, cancel: cancel, store: s.cache.store, refcount: 1, // Snapshots are born referenced. + done: s.snapshotWG.Done, packages: new(persistent.Map[PackageID, *packageHandle]), meta: new(metadata.Graph), files: newFileMap(), @@ -217,7 +225,7 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * // Initialize the view without blocking. initCtx, initCancel := context.WithCancel(xcontext.Detach(ctx)) - v.initCancelFirstAttempt = initCancel + v.cancelInitialWorkspaceLoad = initCancel snapshot := v.snapshot // Pass a second reference to the background goroutine. @@ -822,7 +830,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio // ...but changes may be relevant to other views, for example if they are // changes to a shared package. for _, v := range s.views { - _, release, needsDiagnosis := v.Invalidate(ctx, StateChange{Files: changed}) + _, release, needsDiagnosis := s.invalidateViewLocked(ctx, v, StateChange{Files: changed}) release() if needsDiagnosis || checkViews { diff --git a/gopls/internal/lsp/cache/snapshot.go b/gopls/internal/lsp/cache/snapshot.go index 1b1ed129a79..83e02d27c3d 100644 --- a/gopls/internal/lsp/cache/snapshot.go +++ b/gopls/internal/lsp/cache/snapshot.go @@ -85,12 +85,14 @@ type Snapshot struct { store *memoize.Store // cache of handles shared by all snapshots refMu sync.Mutex + // refcount holds the number of outstanding references to the current - // Snapshot. When refcount is decremented to 0, the Snapshot maps can be - // safely destroyed. + // Snapshot. When refcount is decremented to 0, the Snapshot maps are + // destroyed and the done function is called. // // TODO(rfindley): use atomic.Int32 on Go 1.19+. refcount int + done func() // for implementing Session.Shutdown // mu guards all of the maps in the snapshot, as well as the builtin URI and // initialized. @@ -248,6 +250,7 @@ func (s *Snapshot) decref() { s.unloadableFiles.Destroy() s.moduleUpgrades.Destroy() s.vulns.Destroy() + s.done() } } @@ -1663,10 +1666,10 @@ func inVendor(uri protocol.DocumentURI) bool { // also require more strictness about diagnostic dependencies. For example, // template.Diagnostics currently re-parses every time: there is no Snapshot // data responsible for providing these diagnostics. -func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange) (*Snapshot, bool) { +func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done func()) (*Snapshot, bool) { changedFiles := changed.Files - ctx, done := event.Start(ctx, "cache.snapshot.clone") - defer done() + ctx, stop := event.Start(ctx, "cache.snapshot.clone") + defer stop() s.mu.Lock() defer s.mu.Unlock() @@ -1680,6 +1683,7 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange) (*Snap sequenceID: s.sequenceID + 1, store: s.store, refcount: 1, // Snapshots are born referenced. + done: done, view: s.view, backgroundCtx: bgCtx, cancel: cancel, diff --git a/gopls/internal/lsp/cache/view.go b/gopls/internal/lsp/cache/view.go index 0b1e1dbf505..bf2a8f045eb 100644 --- a/gopls/internal/lsp/cache/view.go +++ b/gopls/internal/lsp/cache/view.go @@ -29,6 +29,7 @@ import ( "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" "golang.org/x/tools/gopls/internal/util/pathutil" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -100,21 +101,12 @@ type View struct { // ignoreFilter is used for fast checking of ignored files. ignoreFilter *ignoreFilter - // initCancelFirstAttempt can be used to terminate the view's first + // cancelInitialWorkspaceLoad can be used to terminate the view's first // attempt at initialization. - initCancelFirstAttempt context.CancelFunc + cancelInitialWorkspaceLoad context.CancelFunc - // Track the latest snapshot via the snapshot field, guarded by snapshotMu. - // - // Invariant: whenever the snapshot field is overwritten, destroy(snapshot) - // is called on the previous (overwritten) snapshot while snapshotMu is held, - // incrementing snapshotWG. During shutdown the final snapshot is - // overwritten with nil and destroyed, guaranteeing that all observed - // snapshots have been destroyed via the destroy method, and snapshotWG may - // be waited upon to let these destroy operations complete. snapshotMu sync.Mutex - snapshot *Snapshot // latest snapshot; nil after shutdown has been called - snapshotWG sync.WaitGroup // refcount for pending destroy operations + snapshot *Snapshot // latest snapshot; nil after shutdown has been called // initialWorkspaceLoad is closed when the first workspace initialization has // completed. If we failed to load, we only retry if the go.mod file changes, @@ -513,11 +505,10 @@ func (v *View) filterFunc() func(protocol.DocumentURI) bool { } } -// shutdown releases resources associated with the view, and waits for ongoing -// work to complete. +// shutdown releases resources associated with the view. func (v *View) shutdown() { // Cancel the initial workspace load if it is still running. - v.initCancelFirstAttempt() + v.cancelInitialWorkspaceLoad() v.snapshotMu.Lock() if v.snapshot != nil { @@ -526,8 +517,6 @@ func (v *View) shutdown() { v.snapshot = nil } v.snapshotMu.Unlock() - - v.snapshotWG.Wait() } // IgnoredFile reports if a file would be ignored by a `go list` of the whole @@ -767,16 +756,33 @@ type StateChange struct { GCDetails map[metadata.PackageID]bool // package -> whether or not we want details } -// Invalidate processes the provided state change, invalidating any derived +// InvalidateView processes the provided state change, invalidating any derived // results that depend on the changed state. // // The resulting snapshot is non-nil, representing the outcome of the state // change. The second result is a function that must be called to release the // snapshot when the snapshot is no longer needed. // -// The resulting bool reports whether the new View needs to be re-diagnosed. -// See Snapshot.clone for more details. -func (v *View) Invalidate(ctx context.Context, changed StateChange) (*Snapshot, func(), bool) { +// An error is returned if the given view is no longer active in the session. +func (s *Session) InvalidateView(ctx context.Context, view *View, changed StateChange) (*Snapshot, func(), error) { + s.viewMu.Lock() + defer s.viewMu.Unlock() + + if !slices.Contains(s.views, view) { + return nil, nil, fmt.Errorf("view is no longer active") + } + snapshot, release, _ := s.invalidateViewLocked(ctx, view, changed) + return snapshot, release, nil +} + +// invalidateViewLocked invalidates the content of the given view. +// (See [Session.InvalidateView]). +// +// The resulting bool reports whether the View needs to be re-diagnosed. +// (See [Snapshot.clone]). +// +// s.viewMu must be held while calling this method. +func (s *Session) invalidateViewLocked(ctx context.Context, v *View, changed StateChange) (*Snapshot, func(), bool) { // Detach the context so that content invalidation cannot be canceled. ctx = xcontext.Detach(ctx) @@ -799,9 +805,9 @@ func (v *View) Invalidate(ctx context.Context, changed StateChange) (*Snapshot, // TODO(rfindley): shouldn't we do this before canceling? prevSnapshot.AwaitInitialized(ctx) - // Save one lease of the cloned snapshot in the view. var needsDiagnosis bool - v.snapshot, needsDiagnosis = prevSnapshot.clone(ctx, v.baseCtx, changed) + s.snapshotWG.Add(1) + v.snapshot, needsDiagnosis = prevSnapshot.clone(ctx, v.baseCtx, changed, s.snapshotWG.Done) // Remove the initial reference created when prevSnapshot was created. prevSnapshot.decref() diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 330f0a8ba3e..60c71840f4f 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -285,10 +285,9 @@ func (c *commandHandler) CheckUpgrades(ctx context.Context, args command.CheckUp if err != nil { return nil, nil, err } - snapshot, release, _ := deps.snapshot.View().Invalidate(ctx, cache.StateChange{ + return c.s.session.InvalidateView(ctx, deps.snapshot.View(), cache.StateChange{ ModuleUpgrades: map[protocol.DocumentURI]map[string]string{args.URI: upgrades}, }) - return snapshot, release, nil }) }) } @@ -306,7 +305,7 @@ func (c *commandHandler) ResetGoModDiagnostics(ctx context.Context, args command forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { return c.modifyState(ctx, FromResetGoModDiagnostics, func() (*cache.Snapshot, func(), error) { - snapshot, release, _ := deps.snapshot.View().Invalidate(ctx, cache.StateChange{ + return c.s.session.InvalidateView(ctx, deps.snapshot.View(), cache.StateChange{ ModuleUpgrades: map[protocol.DocumentURI]map[string]string{ deps.fh.URI(): nil, }, @@ -314,7 +313,6 @@ func (c *commandHandler) ResetGoModDiagnostics(ctx context.Context, args command deps.fh.URI(): nil, }, }) - return snapshot, release, nil }) }) } @@ -443,7 +441,7 @@ func (c *commandHandler) RemoveDependency(ctx context.Context, args command.Remo if err != nil { return err } - edits, err := dropDependency(deps.snapshot, pm, args.ModulePath) + edits, err := dropDependency(pm, args.ModulePath) if err != nil { return err } @@ -476,7 +474,7 @@ func (c *commandHandler) RemoveDependency(ctx context.Context, args command.Remo // dropDependency returns the edits to remove the given require from the go.mod // file. -func dropDependency(snapshot *cache.Snapshot, pm *cache.ParsedModule, modulePath string) ([]protocol.TextEdit, error) { +func dropDependency(pm *cache.ParsedModule, modulePath string) ([]protocol.TextEdit, error) { // We need a private copy of the parsed go.mod file, since we're going to // modify it. copied, err := modfile.Parse("", pm.Mapper.Content, nil) @@ -796,12 +794,11 @@ func (c *commandHandler) ToggleGCDetails(ctx context.Context, args command.URIAr return nil, nil, err } wantDetails := !deps.snapshot.WantGCDetails(meta.ID) // toggle the gc details state - snapshot, release, _ := deps.snapshot.View().Invalidate(ctx, cache.StateChange{ + return c.s.session.InvalidateView(ctx, deps.snapshot.View(), cache.StateChange{ GCDetails: map[metadata.PackageID]bool{ meta.ID: wantDetails, }, }) - return snapshot, release, nil }) }) } @@ -995,9 +992,12 @@ func (c *commandHandler) RunGovulncheck(ctx context.Context, args command.Vulnch return err } - snapshot, release, _ := deps.snapshot.View().Invalidate(ctx, cache.StateChange{ + snapshot, release, err := c.s.session.InvalidateView(ctx, deps.snapshot.View(), cache.StateChange{ Vulns: map[protocol.DocumentURI]*vulncheck.Result{args.URI: result}, }) + if err != nil { + return err + } defer release() c.s.diagnoseSnapshot(snapshot, nil, 0) @@ -1292,7 +1292,7 @@ func (c *commandHandler) ChangeSignature(ctx context.Context, args command.Chang func (c *commandHandler) DiagnoseFiles(ctx context.Context, args command.DiagnoseFilesArgs) error { return c.run(ctx, commandConfig{ progress: "Diagnose files", - }, func(ctx context.Context, deps commandDeps) error { + }, func(ctx context.Context, _ commandDeps) error { // TODO(rfindley): even better would be textDocument/diagnostics (golang/go#60122). // Though note that implementing pull diagnostics may cause some servers to From f572b7efa89ff00ea47d1681430e1e03d8c87312 Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Tue, 9 Jan 2024 12:35:25 -0500 Subject: [PATCH 008/105] gopls/internal/lsp/source/stub: trim version suffix from module path This change removes a "/v2" (etc) suffix from the module path when choosing the local import name for a package during the "stub methods" operation. (CL 469155 caused the regression in behavior.) Also, don't use a path-based heuristic to guess the local PkgName defined by an import; look up the correct answer in the metadata. Also, a test. Also, replace last (degenerate) call to stubmethods.RelativeToFiles with source.Qualifier, renamed to typeutil.FileQualifier. Fixes golang/go#65024 Change-Id: Ie5645b06657fc7bb729fce953b6d2ea8f3efe87d Reviewed-on: https://go-review.googlesource.com/c/tools/+/554717 Reviewed-by: Robert Findley LUCI-TryBot-Result: Go LUCI Auto-Submit: Alan Donovan --- .../analysis/stubmethods/stubmethods.go | 69 +--------------- .../lsp/source/completion/completion.go | 3 +- gopls/internal/lsp/source/hover.go | 3 +- gopls/internal/lsp/source/inlay_hint.go | 3 +- gopls/internal/lsp/source/signature_help.go | 3 +- gopls/internal/lsp/source/stub.go | 72 ++++++++++++----- gopls/internal/lsp/source/util.go | 28 ------- .../testdata/suggestedfix/issue65024.txt | 78 +++++++++++++++++++ gopls/internal/util/typesutil/typesutil.go | 26 +++++++ 9 files changed, 165 insertions(+), 120 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt diff --git a/gopls/internal/analysis/stubmethods/stubmethods.go b/gopls/internal/analysis/stubmethods/stubmethods.go index 02eef5c29c1..85468dfeb7d 100644 --- a/gopls/internal/analysis/stubmethods/stubmethods.go +++ b/gopls/internal/analysis/stubmethods/stubmethods.go @@ -12,11 +12,11 @@ import ( "go/format" "go/token" "go/types" - "strconv" "strings" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/analysisinternal" "golang.org/x/tools/internal/typesinternal" ) @@ -86,7 +86,7 @@ func DiagnosticForError(fset *token.FileSet, file *ast.File, start, end token.Po if si == nil { return analysis.Diagnostic{}, false } - qf := RelativeToFiles(si.Concrete.Obj().Pkg(), file, nil, nil) + qf := typesutil.FileQualifier(file, si.Concrete.Obj().Pkg(), info) return analysis.Diagnostic{ Pos: start, End: end, @@ -328,71 +328,6 @@ func fromAssignStmt(fset *token.FileSet, info *types.Info, assign *ast.AssignStm } } -// RelativeToFiles returns a types.Qualifier that formats package -// names according to the import environments of the files that define -// the concrete type and the interface type. (Only the imports of the -// latter file are provided.) -// -// This is similar to types.RelativeTo except if a file imports the package with a different name, -// then it will use it. And if the file does import the package but it is ignored, -// then it will return the original name. It also prefers package names in importEnv in case -// an import is missing from concFile but is present among importEnv. -// -// Additionally, if missingImport is not nil, the function will be called whenever the concFile -// is presented with a package that is not imported. This is useful so that as types.TypeString is -// formatting a function signature, it is identifying packages that will need to be imported when -// stubbing an interface. -// -// TODO(rfindley): investigate if this can be merged with source.Qualifier. -func RelativeToFiles(concPkg *types.Package, concFile *ast.File, ifaceImports []*ast.ImportSpec, missingImport func(name, path string)) types.Qualifier { - return func(other *types.Package) string { - if other == concPkg { - return "" - } - - // Check if the concrete file already has the given import, - // if so return the default package name or the renamed import statement. - for _, imp := range concFile.Imports { - impPath, _ := strconv.Unquote(imp.Path.Value) - isIgnored := imp.Name != nil && (imp.Name.Name == "." || imp.Name.Name == "_") - // TODO(adonovan): this comparison disregards a vendor prefix in 'other'. - if impPath == other.Path() && !isIgnored { - importName := other.Name() - if imp.Name != nil { - importName = imp.Name.Name - } - return importName - } - } - - // If the concrete file does not have the import, check if the package - // is renamed in the interface file and prefer that. - var importName string - for _, imp := range ifaceImports { - impPath, _ := strconv.Unquote(imp.Path.Value) - isIgnored := imp.Name != nil && (imp.Name.Name == "." || imp.Name.Name == "_") - // TODO(adonovan): this comparison disregards a vendor prefix in 'other'. - if impPath == other.Path() && !isIgnored { - if imp.Name != nil && imp.Name.Name != concPkg.Name() { - importName = imp.Name.Name - } - break - } - } - - if missingImport != nil { - missingImport(importName, other.Path()) - } - - // Up until this point, importName must stay empty when calling missingImport, - // otherwise we'd end up with `import time "time"` which doesn't look idiomatic. - if importName == "" { - importName = other.Name() - } - return importName - } -} - // ifaceType returns the named interface type to which e refers, if any. func ifaceType(e ast.Expr, info *types.Info) *types.TypeName { tv, ok := info.Types[e] diff --git a/gopls/internal/lsp/source/completion/completion.go b/gopls/internal/lsp/source/completion/completion.go index d241cbdf31a..805c6d6615b 100644 --- a/gopls/internal/lsp/source/completion/completion.go +++ b/gopls/internal/lsp/source/completion/completion.go @@ -36,6 +36,7 @@ import ( "golang.org/x/tools/gopls/internal/settings" goplsastutil "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/safetoken" + "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/fuzzy" "golang.org/x/tools/internal/imports" @@ -527,7 +528,7 @@ func Completion(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, p c := &completer{ pkg: pkg, snapshot: snapshot, - qf: source.Qualifier(pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()), + qf: typesutil.FileQualifier(pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()), mq: source.MetadataQualifierForFile(snapshot, pgf.File, pkg.Metadata()), completionContext: completionContext{ triggerCharacter: protoContext.TriggerCharacter, diff --git a/gopls/internal/lsp/source/hover.go b/gopls/internal/lsp/source/hover.go index 1da3ab59cc6..cb051a6e90b 100644 --- a/gopls/internal/lsp/source/hover.go +++ b/gopls/internal/lsp/source/hover.go @@ -33,6 +33,7 @@ import ( "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" + "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/tokeninternal" ) @@ -169,7 +170,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro // By convention, we qualify hover information relative to the package // from which the request originated. - qf := Qualifier(pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()) + qf := typesutil.FileQualifier(pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()) // Handle type switch identifiers as a special case, since they don't have an // object. diff --git a/gopls/internal/lsp/source/inlay_hint.go b/gopls/internal/lsp/source/inlay_hint.go index 41dd6709eb7..99888d4fcf4 100644 --- a/gopls/internal/lsp/source/inlay_hint.go +++ b/gopls/internal/lsp/source/inlay_hint.go @@ -16,6 +16,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" ) @@ -104,7 +105,7 @@ func InlayHint(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pR } info := pkg.GetTypesInfo() - q := Qualifier(pgf.File, pkg.GetTypes(), info) + q := typesutil.FileQualifier(pgf.File, pkg.GetTypes(), info) // Set the range to the full file if the range is not valid. start, end := pgf.File.Pos(), pgf.File.End() diff --git a/gopls/internal/lsp/source/signature_help.go b/gopls/internal/lsp/source/signature_help.go index 4234bc4591a..1d1fd58d82a 100644 --- a/gopls/internal/lsp/source/signature_help.go +++ b/gopls/internal/lsp/source/signature_help.go @@ -18,6 +18,7 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" + "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" ) @@ -78,7 +79,7 @@ FindCall: } // Inv: sig != nil - qf := Qualifier(pgf.File, pkg.GetTypes(), info) + qf := typesutil.FileQualifier(pgf.File, pkg.GetTypes(), info) // Get the object representing the function, if available. // There is no object in certain cases such as calling a function returned by diff --git a/gopls/internal/lsp/source/stub.go b/gopls/internal/lsp/source/stub.go index 138b7acb5ea..3ab7e56e14c 100644 --- a/gopls/internal/lsp/source/stub.go +++ b/gopls/internal/lsp/source/stub.go @@ -13,7 +13,7 @@ import ( "go/token" "go/types" "io" - "path" + pathpkg "path" "strings" "golang.org/x/tools/go/analysis" @@ -56,23 +56,11 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. return nil, nil, fmt.Errorf("file contains parse errors: %s", declPGF.URI) } - // Build import environment for the declaring file. - importEnv := make(map[ImportPath]string) // value is local name - for _, imp := range declPGF.File.Imports { - importPath := metadata.UnquoteImportPath(imp) - var name string - if imp.Name != nil { - name = imp.Name.Name - if name == "_" { - continue - } else if name == "." { - name = "" // see types.Qualifier - } - } else { - // TODO(adonovan): may omit a vendor/ prefix; consult the Metadata. - name = path.Base(string(importPath)) - } - importEnv[importPath] = name // latest alias wins + // Find metadata for the concrete type's declaring package + // as we'll need its import mapping. + declMeta := findFileInDeps(snapshot, pkg.Metadata(), declPGF.URI) + if declMeta == nil { + return nil, nil, bug.Errorf("can't find metadata for file %s among dependencies of %s", declPGF.URI, pkg) } // Record all direct methods of the current object @@ -134,10 +122,36 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. return nil, nil, fmt.Errorf("no missing methods found") } + // Build import environment for the declaring file. + // (typesutil.FileQualifier works only for complete + // import mappings, and requires types.) + importEnv := make(map[ImportPath]string) // value is local name + for _, imp := range declPGF.File.Imports { + importPath := metadata.UnquoteImportPath(imp) + var name string + if imp.Name != nil { + name = imp.Name.Name + if name == "_" { + continue + } else if name == "." { + name = "" // see types.Qualifier + } + } else { + // Use the correct name from the metadata of the imported + // package---not a guess based on the import path. + mp := snapshot.Metadata(declMeta.DepsByImpPath[importPath]) + if mp == nil { + continue // can't happen? + } + name = string(mp.Name) + } + importEnv[importPath] = name // latest alias wins + } + // Create a package name qualifier that uses the // locally appropriate imported package name. // It records any needed new imports. - // TODO(adonovan): factor with source.FormatVarType, stubmethods.RelativeToFiles? + // TODO(adonovan): factor with source.FormatVarType? // // Prior to CL 469155 this logic preserved any renaming // imports from the file that declares the interface @@ -170,7 +184,7 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. new := newImport{importPath: string(importPath)} // For clarity, use a renaming import whenever the // local name does not match the path's last segment. - if name != path.Base(new.importPath) { + if name != pathpkg.Base(trimVersionSuffix(new.importPath)) { new.name = name } newImports = append(newImports, new) @@ -268,7 +282,7 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. // Re-parse the file. fset := token.NewFileSet() - newF, err := parser.ParseFile(fset, declPGF.File.Name.Name, buf.Bytes(), parser.ParseComments) + newF, err := parser.ParseFile(fset, declPGF.URI.Path(), buf.Bytes(), parser.ParseComments) if err != nil { return nil, nil, fmt.Errorf("could not reparse file: %w", err) } @@ -303,3 +317,19 @@ func diffToTextEdits(tok *token.File, diffs []diff.Edit) []analysis.TextEdit { } return edits } + +// trimVersionSuffix removes a trailing "/v2" (etc) suffix from a module path. +// +// This is only a heuristic as to the package's declared name, and +// should only be used for stylistic decisions, such as whether it +// would be clearer to use an explicit local name in the import +// because the declared name differs from the result of this function. +// When the name matters for correctness, look up the imported +// package's Metadata.Name. +func trimVersionSuffix(path string) string { + dir, base := pathpkg.Split(path) + if len(base) > 1 && base[0] == 'v' && strings.Trim(base[1:], "0123456789") == "" { + return dir // sans "/v2" + } + return path +} diff --git a/gopls/internal/lsp/source/util.go b/gopls/internal/lsp/source/util.go index 66a48566a9e..bd479b14621 100644 --- a/gopls/internal/lsp/source/util.go +++ b/gopls/internal/lsp/source/util.go @@ -19,7 +19,6 @@ import ( "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" - "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/tokeninternal" ) @@ -139,8 +138,6 @@ func Deref(typ types.Type) types.Type { // findFileInDeps finds package metadata containing URI in the transitive // dependencies of m. When using the Go command, the answer is unique. -// -// TODO(rfindley): refactor to share logic with findPackageInDeps? func findFileInDeps(s metadata.Source, mp *metadata.Package, uri protocol.DocumentURI) *metadata.Package { seen := make(map[PackageID]bool) var search func(*metadata.Package) *metadata.Package @@ -191,31 +188,6 @@ func CollectScopes(info *types.Info, path []ast.Node, pos token.Pos) []*types.Sc return scopes } -// Qualifier returns a function that appropriately formats a types.PkgName -// appearing in a *ast.File. -func Qualifier(f *ast.File, pkg *types.Package, info *types.Info) types.Qualifier { - // Construct mapping of import paths to their defined or implicit names. - imports := make(map[*types.Package]string) - for _, imp := range f.Imports { - if pkgname, ok := typesutil.ImportedPkgName(info, imp); ok { - imports[pkgname.Imported()] = pkgname.Name() - } - } - // Define qualifier to replace full package paths with names of the imports. - return func(p *types.Package) string { - if p == pkg { - return "" - } - if name, ok := imports[p]; ok { - if name == "." { - return "" - } - return name - } - return p.Name() - } -} - // requalifier returns a function that re-qualifies identifiers and qualified // identifiers contained in targetFile using the given metadata qualifier. func requalifier(s metadata.Source, targetFile *ast.File, targetMeta *metadata.Package, mq MetadataQualifier) func(string) string { diff --git a/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt new file mode 100644 index 00000000000..bba6419686c --- /dev/null +++ b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt @@ -0,0 +1,78 @@ +Regression test for #65024, "incorrect package qualification when +stubbing method in v2 module". + +The second test (a-a) ensures that we don't use path-based heuristics +to guess the PkgName of an import. + +-- a/v2/go.mod -- +module testdata/a/v2 +go 1.18 + +-- a/v2/a.go -- +package a + +type I interface { F() T } + +type T struct {} + +-- a/v2/b/b.go -- +package b + +import "testdata/a/v2" + +type B struct{} + +var _ a.I = &B{} //@ suggestedfix("&B{}", re"does not implement", out) + +// This line makes the diff tidier. + +-- @out/a/v2/b/b.go -- +@@ -7 +7,5 @@ ++// F implements a.I. ++func (*B) F() a.T { ++ panic("unimplemented") ++} ++ +@@ -10 +15 @@ +- +-- a-a/v2/go.mod -- +// This module has a hyphenated name--how posh. +// It won't do to use it as an identifier. +// The correct name is the one in the package decl, +// which in this case is not what the path heuristic would guess. +module testdata/a-a/v2 +go 1.18 + +-- a-a/v2/a.go -- +package a +type I interface { F() T } +type T struct {} + +-- a-a/v2/b/b.go -- +package b + +// Note: no existing import of a. + +type B struct{} + +var _ I = &B{} //@ suggestedfix("&B{}", re"does not implement", out2) + +// This line makes the diff tidier. + +-- a-a/v2/b/import-a-I.go -- +package b +import "testdata/a-a/v2" +type I = a.I + +-- @out2/a-a/v2/b/b.go -- +@@ -3 +3,2 @@ ++import a "testdata/a-a/v2" ++ +@@ -7 +9,5 @@ ++// F implements a.I. ++func (*B) F() a.T { ++ panic("unimplemented") ++} ++ +@@ -10 +17 @@ +- diff --git a/gopls/internal/util/typesutil/typesutil.go b/gopls/internal/util/typesutil/typesutil.go index 137dbf3ba6a..3597b4b4bbc 100644 --- a/gopls/internal/util/typesutil/typesutil.go +++ b/gopls/internal/util/typesutil/typesutil.go @@ -21,3 +21,29 @@ func ImportedPkgName(info *types.Info, imp *ast.ImportSpec) (*types.PkgName, boo pkgname, ok := obj.(*types.PkgName) return pkgname, ok } + +// FileQualifier returns a [types.Qualifier] function that qualifies +// imported symbols appropriately based on the import environment of a +// given file. +func FileQualifier(f *ast.File, pkg *types.Package, info *types.Info) types.Qualifier { + // Construct mapping of import paths to their defined or implicit names. + imports := make(map[*types.Package]string) + for _, imp := range f.Imports { + if pkgname, ok := ImportedPkgName(info, imp); ok { + imports[pkgname.Imported()] = pkgname.Name() + } + } + // Define qualifier to replace full package paths with names of the imports. + return func(p *types.Package) string { + if p == pkg { + return "" + } + if name, ok := imports[p]; ok { + if name == "." { + return "" + } + return name + } + return p.Name() + } +} From 6a0605d4e3d20a2ffb313ef9106199551317973d Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Thu, 11 Jan 2024 21:04:34 -0500 Subject: [PATCH 009/105] gopls/internal/test/marker: regenerate golden data CL 554717 was merged before rebasing to pick up the change to stubbed method receivers added in CL 544916, resulting in test failures. Change-Id: Ia3a82605a8725ce1f88465eb4cd6ae04e8455fa9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555555 Auto-Submit: Robert Findley LUCI-TryBot-Result: Go LUCI Reviewed-by: Russ Cox --- .../internal/test/marker/testdata/suggestedfix/issue65024.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt index bba6419686c..d3cdb4553ef 100644 --- a/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt +++ b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt @@ -29,7 +29,7 @@ var _ a.I = &B{} //@ suggestedfix("&B{}", re"does not implement", out) -- @out/a/v2/b/b.go -- @@ -7 +7,5 @@ +// F implements a.I. -+func (*B) F() a.T { ++func (b *B) F() a.T { + panic("unimplemented") +} + @@ -70,7 +70,7 @@ type I = a.I + @@ -7 +9,5 @@ +// F implements a.I. -+func (*B) F() a.T { ++func (b *B) F() a.T { + panic("unimplemented") +} + From b37fde9dc1ae8ed678c51de94e1aa06ec58998d4 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Fri, 12 Jan 2024 10:02:55 -0500 Subject: [PATCH 010/105] gopls: simplify gopls command configuration Clean up configuration options for the gopls command that are no longer relevant: 1. remove Application.name, since it can always be "gopls" 2. remove Application.wd, since it can always be os.Getwd() 3. remove Application.env, since it can always be os.Environ() 4. remove magic internal@ connection strings For (1) I don't know why the capabilities test modified Application.name, but since this is the only place that customized the name, and it is a test which still passes, it can't be important. Items (2), (3), and (4) only existed for subverting the existing means of configuring gopls via either (1) the operating system or (2) the LSP. For example, if we want to modify gopls's environment, we can do so via a subprocess or via environment passed into the gopls session during initialization. No need to have a third and unofficial means of doing so. For golang/go#63803 Change-Id: Ib5a478b689f315813bdfff263afd9d037f368d3c Reviewed-on: https://go-review.googlesource.com/c/tools/+/555636 Reviewed-by: Alan Donovan LUCI-TryBot-Result: Go LUCI --- gopls/internal/cmd/capabilities_test.go | 4 +- gopls/internal/cmd/cmd.go | 57 +++---------------- gopls/internal/cmd/help_test.go | 4 +- gopls/internal/cmd/integration_test.go | 9 +-- gopls/internal/debug/info.go | 3 +- gopls/internal/debug/serve.go | 4 +- gopls/internal/lsp/lsprpc/lsprpc_test.go | 8 +-- .../test/integration/bench/bench_test.go | 2 +- gopls/internal/test/integration/regtest.go | 2 +- gopls/internal/test/integration/runner.go | 4 +- gopls/internal/test/marker/marker_test.go | 2 +- gopls/main.go | 2 +- 12 files changed, 30 insertions(+), 71 deletions(-) diff --git a/gopls/internal/cmd/capabilities_test.go b/gopls/internal/cmd/capabilities_test.go index 9a66e6dd2d1..46861417dc0 100644 --- a/gopls/internal/cmd/capabilities_test.go +++ b/gopls/internal/cmd/capabilities_test.go @@ -40,10 +40,10 @@ func TestCapabilities(t *testing.T) { } defer os.RemoveAll(tmpDir) - app := New("gopls-test", tmpDir, os.Environ(), nil) + app := New(nil) params := &protocol.ParamInitialize{} - params.RootURI = protocol.URIFromPath(app.wd) + params.RootURI = protocol.URIFromPath(tmpDir) params.Capabilities.Workspace.Configuration = true // Send an initialize request to the server. diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 3c9e8f9d71a..93d53d2e64a 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -35,7 +35,6 @@ import ( "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/jsonrpc2" "golang.org/x/tools/internal/tool" - "golang.org/x/tools/internal/xcontext" ) // Application is the main application as passed to tool.Main @@ -54,15 +53,6 @@ type Application struct { // the options configuring function to invoke when building a server options func(*settings.Options) - // The name of the binary, used in help and telemetry. - name string - - // The working directory to run commands in. - wd string - - // The environment variables to use. - env []string - // Support for remote LSP server. Remote string `flag:"remote" help:"forward all commands to a remote lsp specified by this flag. With no special prefix, this is assumed to be a TCP address. If prefixed by 'unix;', the subsequent address is assumed to be a unix domain socket. If 'auto', or prefixed by 'auto;', the remote address is automatically resolved based on the executing environment."` @@ -105,15 +95,9 @@ func (app *Application) verbose() bool { } // New returns a new Application ready to run. -func New(name, wd string, env []string, options func(*settings.Options)) *Application { - if wd == "" { - wd, _ = os.Getwd() - } +func New(options func(*settings.Options)) *Application { app := &Application{ options: options, - name: name, - wd: wd, - env: env, OCAgent: "off", //TODO: Remove this line to default the exporter to on Serve: Serve{ @@ -125,7 +109,7 @@ func New(name, wd string, env []string, options func(*settings.Options)) *Applic } // Name implements tool.Application returning the binary name. -func (app *Application) Name() string { return app.name } +func (app *Application) Name() string { return "gopls" } // Usage implements tool.Application returning empty extra argument usage. func (app *Application) Usage() string { return "" } @@ -250,7 +234,7 @@ func (app *Application) Run(ctx context.Context, args ...string) error { // executable, and immediately runs a gc. filecache.Start() - ctx = debug.WithInstance(ctx, app.wd, app.OCAgent) + ctx = debug.WithInstance(ctx, app.OCAgent) if len(args) == 0 { s := flag.NewFlagSet(app.Name(), flag.ExitOnError) return tool.Run(ctx, s, &app.Serve, args) @@ -341,22 +325,6 @@ func (app *Application) connect(ctx context.Context, onProgress func(*protocol.P } return conn, nil - case strings.HasPrefix(app.Remote, "internal@"): - internalMu.Lock() - defer internalMu.Unlock() - opts := settings.DefaultOptions(app.options) - key := fmt.Sprintf("%s %v %v %v", app.wd, opts.PreferredContentFormat, opts.HierarchicalDocumentSymbolSupport, opts.SymbolMatcher) - if c := internalConnections[key]; c != nil { - return c, nil - } - remote := app.Remote[len("internal@"):] - ctx := xcontext.Detach(ctx) //TODO:a way of shutting down the internal server - connection, err := app.connectRemote(ctx, remote) - if err != nil { - return nil, err - } - internalConnections[key] = connection - return connection, nil default: return app.connectRemote(ctx, app.Remote) } @@ -380,8 +348,12 @@ func (app *Application) connectRemote(ctx context.Context, remote string) (*conn } func (c *connection) initialize(ctx context.Context, options func(*settings.Options)) error { + wd, err := os.Getwd() + if err != nil { + return fmt.Errorf("finding workdir: %v", err) + } params := &protocol.ParamInitialize{} - params.RootURI = protocol.URIFromPath(c.client.app.wd) + params.RootURI = protocol.URIFromPath(wd) params.Capabilities.Workspace.Configuration = true // Make sure to respect configured options when sending initialize request. @@ -513,16 +485,7 @@ func (c *cmdClient) Configuration(ctx context.Context, p *protocol.ParamConfigur if item.Section != "gopls" { continue } - env := map[string]interface{}{} - for _, value := range c.app.env { - l := strings.SplitN(value, "=", 2) - if len(l) != 2 { - continue - } - env[l[0]] = l[1] - } m := map[string]interface{}{ - "env": env, "analyses": map[string]any{ "fillreturns": true, "nonewvars": true, @@ -776,10 +739,6 @@ func (c *connection) diagnoseFiles(ctx context.Context, files []protocol.Documen } func (c *connection) terminate(ctx context.Context) { - if strings.HasPrefix(c.client.app.Remote, "internal@") { - // internal connections need to be left alive for the next test - return - } //TODO: do we need to handle errors on these calls? c.Shutdown(ctx) //TODO: right now calling exit terminates the process, we should rethink that diff --git a/gopls/internal/cmd/help_test.go b/gopls/internal/cmd/help_test.go index 5c11cd5163d..dd79c2f7e02 100644 --- a/gopls/internal/cmd/help_test.go +++ b/gopls/internal/cmd/help_test.go @@ -32,7 +32,7 @@ const appName = "gopls" func TestHelpFiles(t *testing.T) { testenv.NeedsGoBuild(t) // This is a lie. We actually need the source code. - app := cmd.New(appName, "", nil, nil) + app := cmd.New(nil) ctx := context.Background() for _, page := range append(app.Commands(), app) { t.Run(page.Name(), func(t *testing.T) { @@ -65,7 +65,7 @@ func TestHelpFiles(t *testing.T) { func TestVerboseHelp(t *testing.T) { testenv.NeedsGoBuild(t) // This is a lie. We actually need the source code. - app := cmd.New(appName, "", nil, nil) + app := cmd.New(nil) ctx := context.Background() var buf bytes.Buffer s := flag.NewFlagSet(appName, flag.ContinueOnError) diff --git a/gopls/internal/cmd/integration_test.go b/gopls/internal/cmd/integration_test.go index 4da649f5b4c..7f6a2f9e675 100644 --- a/gopls/internal/cmd/integration_test.go +++ b/gopls/internal/cmd/integration_test.go @@ -894,13 +894,13 @@ package foo if got := len(stats2.BugReports); got > 0 { t.Errorf("Got %d bug reports with -anon, want 0. Reports:%+v", got, stats2.BugReports) } - var stats2AsMap map[string]interface{} + var stats2AsMap map[string]any if err := json.Unmarshal([]byte(res2.stdout), &stats2AsMap); err != nil { t.Fatalf("failed to unmarshal JSON output of stats command: %v", err) } // GOPACKAGESDRIVER is user information, but is ok to print zero value. - if v, ok := stats2AsMap["GOPACKAGESDRIVER"]; !ok || v != "" { - t.Errorf(`Got GOPACKAGESDRIVER=(%q, %v); want ("", true(found))`, v, ok) + if v, ok := stats2AsMap["GOPACKAGESDRIVER"]; ok && v != "" { + t.Errorf(`Got GOPACKAGESDRIVER=(%v, %v); want ("", true(found))`, v, ok) } } @@ -1034,7 +1034,7 @@ func goplsMain() { bug.PanicOnBugs = true } - tool.Main(context.Background(), cmd.New("gopls", "", nil, hooks.Options), os.Args[1:]) + tool.Main(context.Background(), cmd.New(hooks.Options), os.Args[1:]) } // writeTree extracts a txtar archive into a new directory and returns its path. @@ -1077,6 +1077,7 @@ func goplsWithEnv(t *testing.T, dir string, env []string, args ...string) *resul goplsCmd := exec.Command(os.Args[0], args...) goplsCmd.Env = append(os.Environ(), "ENTRYPOINT=goplsMain") + goplsCmd.Env = append(goplsCmd.Env, "GOPACKAGESDRIVER=off") goplsCmd.Env = append(goplsCmd.Env, env...) goplsCmd.Dir = dir goplsCmd.Stdout = new(bytes.Buffer) diff --git a/gopls/internal/debug/info.go b/gopls/internal/debug/info.go index 84027ec43e1..bb58e2ecb03 100644 --- a/gopls/internal/debug/info.go +++ b/gopls/internal/debug/info.go @@ -63,11 +63,12 @@ func VersionInfo() *ServerVersion { // PrintServerInfo writes HTML debug info to w for the Instance. func (i *Instance) PrintServerInfo(ctx context.Context, w io.Writer) { + workDir, _ := os.Getwd() section(w, HTML, "Server Instance", func() { fmt.Fprintf(w, "Start time: %v\n", i.StartTime) fmt.Fprintf(w, "LogFile: %s\n", i.Logfile) fmt.Fprintf(w, "pid: %d\n", os.Getpid()) - fmt.Fprintf(w, "Working directory: %s\n", i.Workdir) + fmt.Fprintf(w, "Working directory: %s\n", workDir) fmt.Fprintf(w, "Address: %s\n", i.ServerAddress) fmt.Fprintf(w, "Debug address: %s\n", i.DebugAddress()) }) diff --git a/gopls/internal/debug/serve.go b/gopls/internal/debug/serve.go index d7ba381d3d5..d0315b16a37 100644 --- a/gopls/internal/debug/serve.go +++ b/gopls/internal/debug/serve.go @@ -51,7 +51,6 @@ type Instance struct { Logfile string StartTime time.Time ServerAddress string - Workdir string OCAgentConfig string LogWriter io.Writer @@ -368,10 +367,9 @@ func GetInstance(ctx context.Context) *Instance { // WithInstance creates debug instance ready for use using the supplied // configuration and stores it in the returned context. -func WithInstance(ctx context.Context, workdir, agent string) context.Context { +func WithInstance(ctx context.Context, agent string) context.Context { i := &Instance{ StartTime: time.Now(), - Workdir: workdir, OCAgentConfig: agent, } i.LogWriter = os.Stderr diff --git a/gopls/internal/lsp/lsprpc/lsprpc_test.go b/gopls/internal/lsp/lsprpc/lsprpc_test.go index 04d1be5c1f4..8ae3303f837 100644 --- a/gopls/internal/lsp/lsprpc/lsprpc_test.go +++ b/gopls/internal/lsp/lsprpc/lsprpc_test.go @@ -58,7 +58,7 @@ func TestClientLogging(t *testing.T) { server := PingServer{} client := FakeClient{Logs: make(chan string, 10)} - ctx = debug.WithInstance(ctx, "", "") + ctx = debug.WithInstance(ctx, "") ss := NewStreamServer(cache.New(nil), false, nil) ss.serverForTest = server ts := servertest.NewPipeServer(ss, nil) @@ -121,7 +121,7 @@ func checkClose(t *testing.T, closer func() error) { func setupForwarding(ctx context.Context, t *testing.T, s protocol.Server) (direct, forwarded servertest.Connector, cleanup func()) { t.Helper() - serveCtx := debug.WithInstance(ctx, "", "") + serveCtx := debug.WithInstance(ctx, "") ss := NewStreamServer(cache.New(nil), false, nil) ss.serverForTest = s tsDirect := servertest.NewTCPServer(serveCtx, ss, nil) @@ -214,8 +214,8 @@ func TestDebugInfoLifecycle(t *testing.T) { baseCtx, cancel := context.WithCancel(context.Background()) defer cancel() - clientCtx := debug.WithInstance(baseCtx, "", "") - serverCtx := debug.WithInstance(baseCtx, "", "") + clientCtx := debug.WithInstance(baseCtx, "") + serverCtx := debug.WithInstance(baseCtx, "") cache := cache.New(nil) ss := NewStreamServer(cache, false, nil) diff --git a/gopls/internal/test/integration/bench/bench_test.go b/gopls/internal/test/integration/bench/bench_test.go index 67ef02533f5..087ec9564ae 100644 --- a/gopls/internal/test/integration/bench/bench_test.go +++ b/gopls/internal/test/integration/bench/bench_test.go @@ -57,7 +57,7 @@ const runAsGopls = "_GOPLS_BENCH_RUN_AS_GOPLS" func TestMain(m *testing.M) { bug.PanicOnBugs = true if os.Getenv(runAsGopls) == "true" { - tool.Main(context.Background(), cmd.New("gopls", "", nil, hooks.Options), os.Args[1:]) + tool.Main(context.Background(), cmd.New(hooks.Options), os.Args[1:]) os.Exit(0) } event.SetExporter(nil) // don't log to stderr diff --git a/gopls/internal/test/integration/regtest.go b/gopls/internal/test/integration/regtest.go index 560f520e1eb..169852e6c69 100644 --- a/gopls/internal/test/integration/regtest.go +++ b/gopls/internal/test/integration/regtest.go @@ -114,7 +114,7 @@ func Main(m *testing.M, hook func(*settings.Options)) { // If this magic environment variable is set, run gopls instead of the test // suite. See the documentation for runTestAsGoplsEnvvar for more details. if os.Getenv(runTestAsGoplsEnvvar) == "true" { - tool.Main(context.Background(), cmd.New("gopls", "", nil, hook), os.Args[1:]) + tool.Main(context.Background(), cmd.New(hook), os.Args[1:]) os.Exit(0) } diff --git a/gopls/internal/test/integration/runner.go b/gopls/internal/test/integration/runner.go index 39ca4793b21..2d130676e46 100644 --- a/gopls/internal/test/integration/runner.go +++ b/gopls/internal/test/integration/runner.go @@ -182,7 +182,7 @@ func (r *Runner) Run(t *testing.T, files string, test TestFunc, opts ...RunOptio } // TODO(rfindley): do we need an instance at all? Can it be removed? - ctx = debug.WithInstance(ctx, "", "off") + ctx = debug.WithInstance(ctx, "off") rootDir := filepath.Join(r.tempDir, filepath.FromSlash(t.Name())) if err := os.MkdirAll(rootDir, 0755); err != nil { @@ -349,7 +349,7 @@ func (r *Runner) experimentalServer(optsHook func(*settings.Options)) jsonrpc2.S func (r *Runner) forwardedServer(optsHook func(*settings.Options)) jsonrpc2.StreamServer { r.tsOnce.Do(func() { ctx := context.Background() - ctx = debug.WithInstance(ctx, "", "off") + ctx = debug.WithInstance(ctx, "off") ss := lsprpc.NewStreamServer(cache.New(nil), false, optsHook) r.ts = servertest.NewTCPServer(ctx, ss, nil) }) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index f5b068e3343..6b1a9ca6108 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -789,7 +789,7 @@ func newEnv(t *testing.T, cache *cache.Cache, files, proxyFiles map[string][]byt // Put a debug instance in the context to prevent logging to stderr. // See associated TODO in runner.go: we should revisit this pattern. ctx := context.Background() - ctx = debug.WithInstance(ctx, "", "off") + ctx = debug.WithInstance(ctx, "off") awaiter := integration.NewAwaiter(sandbox.Workdir) ss := lsprpc.NewStreamServer(cache, false, hooks.Options) diff --git a/gopls/main.go b/gopls/main.go index 8163266972f..cb41f733c14 100644 --- a/gopls/main.go +++ b/gopls/main.go @@ -26,5 +26,5 @@ import ( func main() { counter.Open() // Enable telemetry counter writing. ctx := context.Background() - tool.Main(ctx, cmd.New("gopls", "", nil, hooks.Options), os.Args[1:]) + tool.Main(ctx, cmd.New(hooks.Options), os.Args[1:]) } From 54cf5bc0ae34ea99aa1be17ba30e82f7b028c86d Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Wed, 10 Jan 2024 16:00:35 -0500 Subject: [PATCH 011/105] internal/debug: show new View information in the debug page Add View Type, EnvOverlay, and Root to the view debug page. Also inline the View debug page into the Session debug page, to save a click. For golang/go#57979 Change-Id: Id6fbf86a55329078adcada049e34607ee918da11 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555197 Auto-Submit: Robert Findley LUCI-TryBot-Result: Go LUCI Reviewed-by: Alan Donovan --- gopls/internal/debug/serve.go | 39 ++++++++++++------- gopls/internal/debug/template_test.go | 1 - gopls/internal/lsp/cache/cache.go | 6 ++- gopls/internal/server/command.go | 2 +- .../test/integration/debug/debug_test.go | 2 +- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/gopls/internal/debug/serve.go b/gopls/internal/debug/serve.go index d0315b16a37..29b4117e4ef 100644 --- a/gopls/internal/debug/serve.go +++ b/gopls/internal/debug/serve.go @@ -462,7 +462,6 @@ func (i *Instance) Serve(ctx context.Context, addr string) (string, error) { mux.HandleFunc("/analysis/", render(AnalysisTmpl, i.getAnalysis)) mux.HandleFunc("/cache/", render(CacheTmpl, i.getCache)) mux.HandleFunc("/session/", render(SessionTmpl, i.getSession)) - mux.HandleFunc("/view/", render(ViewTmpl, i.getView)) mux.HandleFunc("/client/", render(ClientTmpl, i.getClient)) mux.HandleFunc("/server/", render(ServerTmpl, i.getServer)) mux.HandleFunc("/file/", render(FileTmpl, i.getFile)) @@ -644,12 +643,17 @@ var BaseTemplate = template.Must(template.New("").Parse(` width:6rem; } td.value { - text-align: right; + text-align: right; } ul.spans { font-family: monospace; font-size: 85%; } +body { + font-family: sans-serif; + font-size: 1rem; + line-height: normal; +} {{block "head" .}}{{end}} @@ -674,7 +678,6 @@ Unknown page {{define "clientlink"}}Client {{.}}{{end}} {{define "serverlink"}}Server {{.}}{{end}} {{define "sessionlink"}}Session {{.}}{{end}} -{{define "viewlink"}}View {{.}}{{end}} `)).Funcs(template.FuncMap{ "fuint64": fuint64, "fuint32": fuint32, @@ -706,7 +709,7 @@ Unknown page }) var MainTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls server information{{end}} +{{define "title"}}Gopls server information{{end}} {{define "body"}}

Caches

    {{range .State.Caches}}
  • {{template "cachelink" .ID}}
  • {{end}}
@@ -722,7 +725,7 @@ var MainTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` `)) var InfoTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}GoPls version information{{end}} +{{define "title"}}Gopls version information{{end}} {{define "body"}} {{.}} {{end}} @@ -771,6 +774,13 @@ var CacheTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` {{define "body"}}

memoize.Store entries

    {{range $k,$v := .MemStats}}
  • {{$k}} - {{$v}}
  • {{end}}
+

File stats

+

+{{- $stats := .FileStats -}} +Total: {{$stats.Total}}
+Largest: {{$stats.Largest}}
+Errors: {{$stats.Errs}}
+

{{end}} `)) @@ -806,7 +816,16 @@ var SessionTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` {{define "body"}} From: {{template "cachelink" .Cache.ID}}

Views

-
    {{range .Views}}
  • {{.Folder.Name}} is {{template "viewlink" .ID}} in {{.Folder.Dir}}
  • {{end}}
+
    {{range .Views}} +{{- $envOverlay := .EnvOverlay -}} +
  • ID: {{.ID}}
    +Type: {{.Type}}
    +Root: {{.Root}}
    +{{- if $envOverlay}} +Env overlay: {{$envOverlay}})
    +{{end -}} +Folder: {{.Folder.Name}}:{{.Folder.Dir}}
  • +{{end}}

Overlays

{{$session := .}}
    {{range .Overlays}} @@ -816,14 +835,6 @@ From: {{template "cachelink" .Cache.ID}}
    {{end}} `)) -var ViewTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` -{{define "title"}}View {{.ID}}{{end}} -{{define "body"}} -Name: {{.Folder.Name}}
    -Folder: {{.Folder.Dir}}
    -{{end}} -`)) - var FileTmpl = template.Must(template.Must(BaseTemplate.Clone()).Parse(` {{define "title"}}Overlay {{.Identity.Hash}}{{end}} {{define "body"}} diff --git a/gopls/internal/debug/template_test.go b/gopls/internal/debug/template_test.go index 53d4cb157b8..f3d4827a9b0 100644 --- a/gopls/internal/debug/template_test.go +++ b/gopls/internal/debug/template_test.go @@ -36,7 +36,6 @@ var templates = map[string]struct { "TraceTmpl": {debug.TraceTmpl, debug.TraceResults{}}, "CacheTmpl": {debug.CacheTmpl, &cache.Cache{}}, "SessionTmpl": {debug.SessionTmpl, &cache.Session{}}, - "ViewTmpl": {debug.ViewTmpl, &cache.View{}}, "ClientTmpl": {debug.ClientTmpl, &debug.Client{}}, "ServerTmpl": {debug.ServerTmpl, &debug.Server{}}, "FileTmpl": {debug.FileTmpl, &cache.Overlay{}}, diff --git a/gopls/internal/lsp/cache/cache.go b/gopls/internal/lsp/cache/cache.go index 72fe36ee302..9127412e430 100644 --- a/gopls/internal/lsp/cache/cache.go +++ b/gopls/internal/lsp/cache/cache.go @@ -11,6 +11,7 @@ import ( "sync/atomic" "time" + "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -76,6 +77,7 @@ func (c *Cache) MemStats() map[reflect.Type]int { return c.store.Stats() } // FileStats returns information about the set of files stored in the cache. // It is intended for debugging only. -func (c *Cache) FileStats() (files, largest, errs int) { - return c.fileStats() +func (c *Cache) FileStats() (stats command.FileStats) { + stats.Total, stats.Largest, stats.Errs = c.fileStats() + return } diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 60c71840f4f..fbaf2017bdd 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -1052,7 +1052,7 @@ func (c *commandHandler) MemStats(ctx context.Context) (command.MemStatsResult, // about the current state of the loaded workspace for the current session. func (c *commandHandler) WorkspaceStats(ctx context.Context) (command.WorkspaceStatsResult, error) { var res command.WorkspaceStatsResult - res.Files.Total, res.Files.Largest, res.Files.Errs = c.s.session.Cache().FileStats() + res.Files = c.s.session.Cache().FileStats() for _, view := range c.s.session.Views() { vs, err := collectViewStats(ctx, view) diff --git a/gopls/internal/test/integration/debug/debug_test.go b/gopls/internal/test/integration/debug/debug_test.go index 9aba51f37e5..04dff9062d0 100644 --- a/gopls/internal/test/integration/debug/debug_test.go +++ b/gopls/internal/test/integration/debug/debug_test.go @@ -65,7 +65,7 @@ func TestStartDebugging(t *testing.T) { if err != nil { t.Fatalf("reading HTTP response body: %v", err) } - const want = "GoPls" + const want = "<title>Gopls" if !strings.Contains(string(data), want) { t.Errorf("GET %s response does not contain %q: <<%s>>", debugURL, want, data) } From dbc9d3e957407acb558132a335cdd40675a61cd2 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 12 Jan 2024 16:23:32 -0500 Subject: [PATCH 012/105] internal/analysisinternal: TypeExpr: don't forget Variadic The syntax generated for type func(...T) was func([]T), causing extract operations to misbehave. Fixes golang/go#63287 Change-Id: I37978a13b2b51f0802ea694b7711a7d6444384fb Reviewed-on: https://go-review.googlesource.com/c/tools/+/555458 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- .../codeaction/extract-variadic-63287.txt | 28 +++++++++++++++++++ internal/analysisinternal/analysis.go | 4 +++ 2 files changed, 32 insertions(+) create mode 100644 gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt diff --git a/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt b/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt new file mode 100644 index 00000000000..756a88a4f78 --- /dev/null +++ b/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt @@ -0,0 +1,28 @@ +This test exercises extract on a variadic function. +It is a regression test for bug #63287 in which +the final paramater's "..." would go missing. + +-- go.mod -- +module testdata +go 1.18 + +-- a/a.go -- +package a + +//@codeactionedit(block, "refactor.extract", out, "Extract function") + +func _() { + var logf func(string, ...any) + { println(logf) } //@loc(block, re`{.*}`) +} + +-- @out/a/a.go -- +@@ -7 +7 @@ +- { println(logf) } //@loc(block, re`{.*}`) ++ { newFunction(logf) } //@loc(block, re`{.*}`) +@@ -10 +10,4 @@ ++func newFunction(logf func( string, ...any)) { ++ println(logf) ++} ++ +-- end -- diff --git a/internal/analysisinternal/analysis.go b/internal/analysisinternal/analysis.go index 2b291680479..b24a0fba9e7 100644 --- a/internal/analysisinternal/analysis.go +++ b/internal/analysisinternal/analysis.go @@ -151,6 +151,10 @@ func TypeExpr(f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { }, }) } + if t.Variadic() { + last := params[len(params)-1] + last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt} + } var returns []*ast.Field for i := 0; i < t.Results().Len(); i++ { r := TypeExpr(f, pkg, t.Results().At(i).Type()) From 9164f2aedb4f743cb4f7e925e7735bd841c3a99d Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 12 Jan 2024 17:29:37 -0500 Subject: [PATCH 013/105] gopls/internal/test/marker: skip on solaris-amd64-oraclerel As with the darwin builders, this builder is too slow for this test. Not investigated. Fixes golang/go#64473 Change-Id: Ice9b3f25ddb70327dd8d259063bf351db167eff5 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555715 Auto-Submit: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> Run-TryBot: Robert Findley <rfindley@google.com> --- gopls/internal/test/marker/marker_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 6b1a9ca6108..05a93e6e5dd 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -85,8 +85,11 @@ func TestMain(m *testing.M) { // - The old tests lacked documentation, and often had failures that were hard // to understand. By starting from scratch, we can revisit these aspects. func Test(t *testing.T) { - if testing.Short() && strings.HasPrefix(os.Getenv("GO_BUILDER_NAME"), "darwin-") { - t.Skip("golang/go#64473: skipping with -short: this test is too slow on darwin builders") + if testing.Short() { + builder := os.Getenv("GO_BUILDER_NAME") + if strings.HasPrefix(builder, "darwin-") || builder == "solaris-amd64-oraclerel" { + t.Skip("golang/go#64473: skipping with -short: this test is too slow on darwin and solaris builders") + } } // The marker tests must be able to run go/packages.Load. testenv.NeedsGoPackages(t) From d5171129944de3cf2df348ae541cba5966fa4461 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 12 Jan 2024 11:50:48 -0500 Subject: [PATCH 014/105] gopls/internal/lsp/protocol: deliver log messages in order This fixes a predicted bug that was noticed while reading the code. Fixes golang/go#61216 Change-Id: I9614454fbd8538cb0b9eb1f56f11934cb88a7aed Reviewed-on: https://go-review.googlesource.com/c/tools/+/555635 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/protocol/context.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/gopls/internal/lsp/protocol/context.go b/gopls/internal/lsp/protocol/context.go index a9ef48d0f0b..5f3151cda97 100644 --- a/gopls/internal/lsp/protocol/context.go +++ b/gopls/internal/lsp/protocol/context.go @@ -7,6 +7,7 @@ package protocol import ( "bytes" "context" + "sync" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/core" @@ -38,8 +39,27 @@ func LogEvent(ctx context.Context, ev core.Event, lm label.Map, mt MessageType) if event.IsError(ev) { msg.Type = Error } - // TODO(adonovan): the goroutine here could cause log - // messages to be delivered out of order! Use a queue. - go client.LogMessage(xcontext.Detach(ctx), msg) + + // The background goroutine lives forever once started, + // and ensures log messages are sent in order (#61216). + startLogSenderOnce.Do(func() { + go func() { + for f := range logQueue { + f() + } + }() + }) + + // Add the log item to a queue, rather than sending a + // window/logMessage request to the client synchronously, + // which would slow down this thread. + ctx2 := xcontext.Detach(ctx) + logQueue <- func() { client.LogMessage(ctx2, msg) } + return ctx } + +var ( + startLogSenderOnce sync.Once + logQueue = make(chan func(), 100) // big enough for a large transient burst +) From 0d1b47829b85cd1fcce1a23edab56ee6abca88d1 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 12 Jan 2024 18:16:30 -0500 Subject: [PATCH 015/105] gopls/internal/test/integration: fix flakiness of TestResolveImportCycle Avoid flaky dependence on go list error messages in TestResolveImportCycle. It would be better if we could guarantee that the error is from go list, but since the error from golang/go#64899 is reasonable, it is best to just avoid the flake for now. Fixes golang/go#64899 Change-Id: If5038acbdf020323d8fa9db0d8e1e8e054cfe464 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556495 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- .../test/integration/diagnostics/diagnostics_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gopls/internal/test/integration/diagnostics/diagnostics_test.go b/gopls/internal/test/integration/diagnostics/diagnostics_test.go index 81720e743d7..ead84300afa 100644 --- a/gopls/internal/test/integration/diagnostics/diagnostics_test.go +++ b/gopls/internal/test/integration/diagnostics/diagnostics_test.go @@ -1672,12 +1672,17 @@ const B = a.B env.OpenFile("b/b.go") env.AfterChange( // The Go command sometimes tells us about only one of the import cycle - // errors below. For robustness of this test, succeed if we get either. + // errors below. Also, sometimes we get an error during type checking + // instead of during list, due to missing metadata. This is likely due to + // a race. + // For robustness of this test, succeed if we get any reasonable error. // // TODO(golang/go#52904): we should get *both* of these errors. + // TODO(golang/go#64899): we should always get an import cycle error + // rather than a missing metadata error. AnyOf( - Diagnostics(env.AtRegexp("a/a.go", `"mod.test/b"`), WithMessage("import cycle")), - Diagnostics(env.AtRegexp("b/b.go", `"mod.test/a"`), WithMessage("import cycle")), + Diagnostics(env.AtRegexp("a/a.go", `"mod.test/b"`)), + Diagnostics(env.AtRegexp("b/b.go", `"mod.test/a"`)), ), ) env.RegexpReplace("b/b.go", `const B = a\.B`, "") From c0db45fb19fde8f1674b650ea36e405408bcbdac Mon Sep 17 00:00:00 2001 From: Robert Findley <rfindley@google.com> Date: Wed, 17 Jan 2024 15:18:37 -0500 Subject: [PATCH 016/105] gopls/internal/server: simplify DiagnoseFiles to avoid a race Simplify the DiagnoseFiles command handler to just diagnose all snapshots for requested files, rather than implement ad-hoc diagnostic logic. This may be somewhat slower, but this is only used for command line commands and is therefore performance is not critical. Also adjust updateDiagnostics to not overwrite final diagnostics with non-final diagnostics. These two changes together avoid the race encountered in golang/go#64765: DiagnoseFiles does not return until diagnostics are finalized, and these final diagnostics are not overwritten. Fixes golang/go#64765 Change-Id: I54ef7309487a9803a8bbd45ab2a8de4dbf30c460 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556475 Reviewed-by: Alan Donovan <adonovan@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> --- gopls/internal/lsp/cache/pkg.go | 17 ---------- gopls/internal/server/command.go | 49 +++++++++------------------- gopls/internal/server/diagnostics.go | 10 +++++- 3 files changed, 25 insertions(+), 51 deletions(-) diff --git a/gopls/internal/lsp/cache/pkg.go b/gopls/internal/lsp/cache/pkg.go index 19b974f90c2..fba6c54b9da 100644 --- a/gopls/internal/lsp/cache/pkg.go +++ b/gopls/internal/lsp/cache/pkg.go @@ -5,7 +5,6 @@ package cache import ( - "context" "fmt" "go/ast" "go/scanner" @@ -172,19 +171,3 @@ func (p *Package) GetParseErrors() []scanner.ErrorList { func (p *Package) GetTypeErrors() []types.Error { return p.pkg.typeErrors } - -func (p *Package) DiagnosticsForFile(ctx context.Context, uri protocol.DocumentURI) ([]*Diagnostic, error) { - var diags []*Diagnostic - for _, diag := range p.loadDiagnostics { - if diag.URI == uri { - diags = append(diags, diag) - } - } - for _, diag := range p.pkg.diagnostics { - if diag.URI == uri { - diags = append(diags, diag) - } - } - - return diags, nil -} diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index fbaf2017bdd..85149ca6fcd 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -34,7 +34,6 @@ import ( "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" - "golang.org/x/tools/gopls/internal/util/maps" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/gopls/internal/vulncheck/scan" "golang.org/x/tools/internal/diff" @@ -1301,47 +1300,31 @@ func (c *commandHandler) DiagnoseFiles(ctx context.Context, args command.Diagnos ctx, done := event.Start(ctx, "lsp.server.DiagnoseFiles") defer done() - // TODO(adonovan): opt: parallelize the loop, - // grouping file URIs by package and making a - // single call to source.Analyze. + snapshots := make(map[*cache.Snapshot]bool) for _, uri := range args.Files { fh, snapshot, release, err := c.s.fileOf(ctx, uri) if err != nil { return err } - defer release() - if snapshot.FileKind(fh) != file.Go { + if snapshots[snapshot] || snapshot.FileKind(fh) != file.Go { + release() continue } - pkg, _, err := source.NarrowestPackageForFile(ctx, snapshot, uri) - if err != nil { - return err - } - pkgDiags, err := pkg.DiagnosticsForFile(ctx, uri) - if err != nil { - return err - } - adiags, err := source.Analyze(ctx, snapshot, map[source.PackageID]unit{pkg.Metadata().ID: {}}, nil /* progress tracker */) - if err != nil { - return err - } + defer release() + snapshots[snapshot] = true + } - // combine load/parse/type + analysis diagnostics - var td, ad []*cache.Diagnostic - combineDiagnostics(pkgDiags, adiags[uri], &td, &ad) - diags := append(td, ad...) - byURI := func(d *cache.Diagnostic) protocol.DocumentURI { return d.URI } - c.s.updateDiagnostics(ctx, c.s.session.Views(), snapshot, maps.Group(diags, byURI), false) - diagnostics := append(td, ad...) - - if err := c.s.client.PublishDiagnostics(ctx, &protocol.PublishDiagnosticsParams{ - URI: fh.URI(), - Version: fh.Version(), - Diagnostics: toProtocolDiagnostics(diagnostics), - }); err != nil { - return err - } + var wg sync.WaitGroup + for snapshot := range snapshots { + snapshot := snapshot + wg.Add(1) + go func() { + defer wg.Done() + c.s.diagnoseSnapshot(snapshot, nil, 0) + }() } + wg.Wait() + return nil }) } diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 460e119c77d..2d6273bbcfa 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -674,7 +674,15 @@ func (s *server) updateDiagnostics(ctx context.Context, allViews []*cache.View, // views. updateAndPublish := func(uri protocol.DocumentURI, f *fileDiagnostics, diags []*cache.Diagnostic) error { current, ok := f.byView[snapshot.View()] - if !ok || current.snapshot <= snapshot.SequenceID() { + // Update the stored diagnostics if: + // 1. we've never seen diagnostics for this view, + // 2. diagnostics are for an older snapshot, or + // 3. we're overwriting with final diagnostics + // + // In other words, we shouldn't overwrite existing diagnostics for a + // snapshot with non-final diagnostics. This avoids the race described at + // https://github.com/golang/go/issues/64765#issuecomment-1890144575. + if !ok || current.snapshot < snapshot.SequenceID() || (current.snapshot == snapshot.SequenceID() && final) { fh, err := snapshot.ReadFile(ctx, uri) if err != nil { return err From d2200d1bd6320f1b53529e8ba4c2f5537cc8fd8a Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 12 Jan 2024 17:40:02 -0500 Subject: [PATCH 017/105] gopls/internal/test/marker: update skip comment for addgowork.txt The orphaned file and critical error logic has been rewritten, and we no longer diagnose broken workspaces in this way, because they are no longer broken due to zero-config gopls. Fixes golang/go#61006 Change-Id: I7e532c1ecf11b5151ff03103bb19806caaeec565 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555755 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- .../test/marker/testdata/diagnostics/addgowork.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gopls/internal/test/marker/testdata/diagnostics/addgowork.txt b/gopls/internal/test/marker/testdata/diagnostics/addgowork.txt index 729547af412..5fbd890e65f 100644 --- a/gopls/internal/test/marker/testdata/diagnostics/addgowork.txt +++ b/gopls/internal/test/marker/testdata/diagnostics/addgowork.txt @@ -5,9 +5,13 @@ Quick-fixes change files on disk, so are tested by integration tests. TODO(rfindley): improve the "cannot find package" import errors. -- skip -- -Skipping due to go.dev/issue/60584#issuecomment-1622238115. -There appears to be a real race in the critical error logic causing this test -to flake with high frequency. +These diagnostics are no longer produced, because in golang/go#57979 +(zero-config gopls) we made gopls function independent of a go.work file. +Preserving this test as we may want to re-enable the code actions go manage +a go.work file. + +Note that in go.dev/issue/60584#issuecomment-1622238115, this test was flaky. +However, critical error logic has since been rewritten. -- a/go.mod -- module mod.com/a From f2d3f78aad4eb0a6eb0ee1dd1dcbca3afb5c3496 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Wed, 17 Jan 2024 15:47:47 -0500 Subject: [PATCH 018/105] gopls/internal/lsp/protocol: fix TestURIFromPath on windows Update TestURIFromPath not to assume the drive name for the default volume. Fixes golang/go#63366 Change-Id: I0196f11e628821b941d418831f3a3da7cf125ddf Reviewed-on: https://go-review.googlesource.com/c/tools/+/556496 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- .../internal/lsp/protocol/uri_windows_test.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gopls/internal/lsp/protocol/uri_windows_test.go b/gopls/internal/lsp/protocol/uri_windows_test.go index e607468a322..03b3af28924 100644 --- a/gopls/internal/lsp/protocol/uri_windows_test.go +++ b/gopls/internal/lsp/protocol/uri_windows_test.go @@ -8,6 +8,7 @@ package protocol_test import ( + "path/filepath" "testing" "golang.org/x/tools/gopls/internal/lsp/protocol" @@ -18,6 +19,15 @@ import ( // tests by using only forward slashes, assuming that the standard library // functions filepath.ToSlash and filepath.FromSlash do not need testing. func TestURIFromPath(t *testing.T) { + rootPath, err := filepath.Abs("/") + if err != nil { + t.Fatal(err) + } + if len(rootPath) < 2 || rootPath[1] != ':' { + t.Fatalf("malformed root path %q", rootPath) + } + driveLetter := string(rootPath[0]) + for _, test := range []struct { path, wantFile string wantURI protocol.DocumentURI @@ -44,13 +54,13 @@ func TestURIFromPath(t *testing.T) { }, { path: `\path\to\dir`, - wantFile: `C:\path\to\dir`, - wantURI: protocol.DocumentURI("file:///C:/path/to/dir"), + wantFile: driveLetter + `:\path\to\dir`, + wantURI: protocol.DocumentURI("file:///" + driveLetter + ":/path/to/dir"), }, { path: `\a\b\c\src\bob.go`, - wantFile: `C:\a\b\c\src\bob.go`, - wantURI: protocol.DocumentURI("file:///C:/a/b/c/src/bob.go"), + wantFile: driveLetter + `:\a\b\c\src\bob.go`, + wantURI: protocol.DocumentURI("file:///" + driveLetter + ":/a/b/c/src/bob.go"), }, { path: `c:\Go\src\bob george\george\george.go`, From 592d9e1e87bc2586e14758a58f5b8f6b05682be6 Mon Sep 17 00:00:00 2001 From: Suzy Mueller <suzmue@golang.org> Date: Thu, 7 Dec 2023 16:51:04 -0800 Subject: [PATCH 019/105] internal/lsp: convert refactor code actions to use codeAction/resolve Allow apply fix and change signature commands to return edits instead of applying the edits. Added a marker test for removing parameters using the new resolve logic. We probably want most refactoring code actions to work both ways. This also updates the fill struct test to make sure that the capabilities of the editor are being correctly respected. For golang/go#64510 Change-Id: If58f7bdff52ec8e1621c007d029c5b9b60bbdd3a Reviewed-on: https://go-review.googlesource.com/c/tools/+/548276 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/doc/commands.md | 82 +++ gopls/internal/lsp/command/command_gen.go | 4 +- gopls/internal/lsp/command/interface.go | 8 +- .../internal/lsp/protocol/generate/tables.go | 1 + gopls/internal/lsp/protocol/tsprotocol.go | 2 +- gopls/internal/server/code_action.go | 146 +++-- gopls/internal/server/command.go | 34 +- gopls/internal/server/general.go | 1 + gopls/internal/server/unimplemented.go | 4 - gopls/internal/settings/api_json.go | 22 +- gopls/internal/settings/settings.go | 6 + .../internal/test/integration/fake/editor.go | 111 ++-- .../test/integration/misc/fix_test.go | 59 +- gopls/internal/test/integration/options.go | 7 + gopls/internal/test/marker/marker_test.go | 17 + .../testdata/codeaction/extract_variable.txt | 1 + .../codeaction/extract_variable_resolve.txt | 81 +++ .../testdata/codeaction/fill_struct.txt | 9 +- .../codeaction/fill_struct_resolve.txt | 586 ++++++++++++++++++ .../testdata/codeaction/removeparam.txt | 1 + .../codeaction/removeparam_resolve.txt | 258 ++++++++ .../marker/testdata/stubmethods/basic.txt | 1 + .../testdata/stubmethods/basic_resolve.txt | 31 + 23 files changed, 1346 insertions(+), 126 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/codeaction/extract_variable_resolve.txt create mode 100644 gopls/internal/test/marker/testdata/codeaction/fill_struct_resolve.txt create mode 100644 gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt create mode 100644 gopls/internal/test/marker/testdata/stubmethods/basic_resolve.txt diff --git a/gopls/doc/commands.md b/gopls/doc/commands.md index a838c73df6b..e1eeff89e74 100644 --- a/gopls/doc/commands.md +++ b/gopls/doc/commands.md @@ -81,6 +81,47 @@ Args: "character": uint32, }, }, + // Whether to resolve and return the edits. + "ResolveEdits": bool, +} +``` + +Result: + +``` +{ + // Holds changes to existing resources. + "changes": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit, + // Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes + // are either an array of `TextDocumentEdit`s to express changes to n different text documents + // where each text document edit addresses a specific version of a text document. Or it can contain + // above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations. + // + // Whether a client supports versioned document edits is expressed via + // `workspace.workspaceEdit.documentChanges` client capability. + // + // If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then + // only plain `TextEdit`s using the `changes` property are supported. + "documentChanges": []{ + "TextDocumentEdit": { + "textDocument": { ... }, + "edits": { ... }, + }, + "RenameFile": { + "kind": string, + "oldUri": string, + "newUri": string, + "options": { ... }, + "ResourceOperation": { ... }, + }, + }, + // A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and + // delete file / folder operations. + // + // Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`. + // + // @since 3.16.0 + "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation, } ``` @@ -101,6 +142,47 @@ Args: "end": { ... }, }, }, + // Whether to resolve and return the edits. + "ResolveEdits": bool, +} +``` + +Result: + +``` +{ + // Holds changes to existing resources. + "changes": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit, + // Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes + // are either an array of `TextDocumentEdit`s to express changes to n different text documents + // where each text document edit addresses a specific version of a text document. Or it can contain + // above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations. + // + // Whether a client supports versioned document edits is expressed via + // `workspace.workspaceEdit.documentChanges` client capability. + // + // If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then + // only plain `TextEdit`s using the `changes` property are supported. + "documentChanges": []{ + "TextDocumentEdit": { + "textDocument": { ... }, + "edits": { ... }, + }, + "RenameFile": { + "kind": string, + "oldUri": string, + "newUri": string, + "options": { ... }, + "ResourceOperation": { ... }, + }, + }, + // A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and + // delete file / folder operations. + // + // Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`. + // + // @since 3.16.0 + "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation, } ``` diff --git a/gopls/internal/lsp/command/command_gen.go b/gopls/internal/lsp/command/command_gen.go index fb518c71860..ae02543691b 100644 --- a/gopls/internal/lsp/command/command_gen.go +++ b/gopls/internal/lsp/command/command_gen.go @@ -118,13 +118,13 @@ func Dispatch(ctx context.Context, params *protocol.ExecuteCommandParams, s Inte if err := UnmarshalArgs(params.Arguments, &a0); err != nil { return nil, err } - return nil, s.ApplyFix(ctx, a0) + return s.ApplyFix(ctx, a0) case "gopls.change_signature": var a0 ChangeSignatureArgs if err := UnmarshalArgs(params.Arguments, &a0); err != nil { return nil, err } - return nil, s.ChangeSignature(ctx, a0) + return s.ChangeSignature(ctx, a0) case "gopls.check_upgrades": var a0 CheckUpgradesArgs if err := UnmarshalArgs(params.Arguments, &a0); err != nil { diff --git a/gopls/internal/lsp/command/interface.go b/gopls/internal/lsp/command/interface.go index 152387c2053..473fca7e53b 100644 --- a/gopls/internal/lsp/command/interface.go +++ b/gopls/internal/lsp/command/interface.go @@ -44,7 +44,7 @@ type Interface interface { // ApplyFix: Apply a fix // // Applies a fix to a region of source code. - ApplyFix(context.Context, ApplyFixArgs) error + ApplyFix(context.Context, ApplyFixArgs) (*protocol.WorkspaceEdit, error) // Test: Run test(s) (legacy) // @@ -216,7 +216,7 @@ type Interface interface { // // This command is experimental, currently only supporting parameter removal. // Its signature will certainly change in the future (pun intended). - ChangeSignature(context.Context, ChangeSignatureArgs) error + ChangeSignature(context.Context, ChangeSignatureArgs) (*protocol.WorkspaceEdit, error) // DiagnoseFiles: Cause server to publish diagnostics for the specified files. // @@ -257,6 +257,8 @@ type ApplyFixArgs struct { URI protocol.DocumentURI // The document range to scan for fixes. Range protocol.Range + // Whether to resolve and return the edits. + ResolveEdits bool } type URIArg struct { @@ -500,6 +502,8 @@ type AddTelemetryCountersArgs struct { // ChangeSignatureArgs specifies a "change signature" refactoring to perform. type ChangeSignatureArgs struct { RemoveParameter protocol.Location + // Whether to resolve and return the edits. + ResolveEdits bool } // DiagnoseFilesArgs specifies a set of files for which diagnostics are wanted. diff --git a/gopls/internal/lsp/protocol/generate/tables.go b/gopls/internal/lsp/protocol/generate/tables.go index 2b744a5a052..5ed634a1abb 100644 --- a/gopls/internal/lsp/protocol/generate/tables.go +++ b/gopls/internal/lsp/protocol/generate/tables.go @@ -63,6 +63,7 @@ var renameProp = map[prop]string{ {"CancelParams", "id"}: "interface{}", {"Command", "arguments"}: "[]json.RawMessage", {"CompletionItem", "textEdit"}: "TextEdit", + {"CodeAction", "data"}: "json.RawMessage", // delay unmarshalling commands {"Diagnostic", "code"}: "interface{}", {"Diagnostic", "data"}: "json.RawMessage", // delay unmarshalling quickfixes diff --git a/gopls/internal/lsp/protocol/tsprotocol.go b/gopls/internal/lsp/protocol/tsprotocol.go index 48adb18afca..39d83726df1 100644 --- a/gopls/internal/lsp/protocol/tsprotocol.go +++ b/gopls/internal/lsp/protocol/tsprotocol.go @@ -489,7 +489,7 @@ type CodeAction struct { // a `textDocument/codeAction` and a `codeAction/resolve` request. // // @since 3.16.0 - Data interface{} `json:"data,omitempty"` + Data *json.RawMessage `json:"data,omitempty"` } // The Client Capabilities of a {@link CodeActionRequest}. diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 4ec105fa34d..15911280c05 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -5,7 +5,9 @@ package server import ( + "bytes" "context" + "encoding/json" "fmt" "go/ast" "sort" @@ -24,6 +26,7 @@ import ( "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/imports" @@ -179,7 +182,7 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara } if want[protocol.RefactorExtract] { - extractions, err := refactorExtract(pgf, params.Range) + extractions, err := refactorExtract(pgf, params.Range, snapshot.Options()) if err != nil { return nil, err } @@ -226,19 +229,15 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara return protocol.CodeAction{}, false, nil } cmd, err := command.NewApplyFixCommand(d.Message, command.ApplyFixArgs{ - URI: pgf.URI, - Fix: string(settings.StubMethods), - Range: pd.Range, + URI: pgf.URI, + Fix: string(settings.StubMethods), + Range: pd.Range, + ResolveEdits: supportsResolveEdits(snapshot.Options()), }) if err != nil { return protocol.CodeAction{}, false, err } - return protocol.CodeAction{ - Title: d.Message, - Kind: protocol.QuickFix, - Command: &cmd, - Diagnostics: []protocol.Diagnostic{pd}, - }, true, nil + return newCodeAction(d.Message, protocol.QuickFix, &cmd, nil, snapshot.Options()), true, nil }() if err != nil { return nil, err @@ -249,7 +248,7 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara } if want[protocol.RefactorRewrite] { - rewrites, err := refactorRewrite(snapshot, pkg, pgf, fh, params.Range) + rewrites, err := refactorRewrite(snapshot, pkg, pgf, fh, params.Range, snapshot.Options()) if err != nil { return nil, err } @@ -281,6 +280,54 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara } } +// ResolveCodeAction resolves missing Edit information (that is, computes the +// details of the necessary patch) in the given code action using the provided +// Data field of the CodeAction, which should contain the raw json of a protocol.Command. +// +// This should be called by the client before applying code actions, when the +// client has code action resolve support. +// +// This feature allows capable clients to preview and selectively apply the diff +// instead of applying the whole thing unconditionally through workspace/applyEdit. +func (s *server) ResolveCodeAction(ctx context.Context, ca *protocol.CodeAction) (*protocol.CodeAction, error) { + ctx, done := event.Start(ctx, "lsp.Server.resolveCodeAction") + defer done() + + // Only resolve the code action if there is Data provided. + // TODO(suzmue): publish protocol.unmarshalParams as protocol.UnmarshalJSON + // and use it consistently where we need to unmarshal to handle all null checks. + if ca.Data != nil && len(*ca.Data) != 0 && !bytes.Equal(*ca.Data, []byte("null")) { + var cmd protocol.Command + if err := json.Unmarshal(*ca.Data, &cmd); err != nil { + return nil, err + } + + params := &protocol.ExecuteCommandParams{ + Command: cmd.Command, + Arguments: cmd.Arguments, + } + + handler := &commandHandler{ + s: s, + params: params, + } + edit, err := command.Dispatch(ctx, params, handler) + if err != nil { + + return nil, err + } + var ok bool + if ca.Edit, ok = edit.(*protocol.WorkspaceEdit); !ok { + return nil, fmt.Errorf("unable to resolve code action %q", ca.Title) + } + } + return ca, nil +} + +func supportsResolveEdits(options *settings.Options) bool { + return options.CodeActionResolveOptions != nil && slices.Contains(options.CodeActionResolveOptions, "edit") +} + func (s *server) findMatchingDiagnostics(uri protocol.DocumentURI, pd protocol.Diagnostic) []*cache.Diagnostic { s.diagnosticsMu.Lock() defer s.diagnosticsMu.Unlock() @@ -367,7 +414,7 @@ func fixedByImportFix(fix *imports.ImportFix, diagnostics []protocol.Diagnostic) return results } -func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { +func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *settings.Options) ([]protocol.CodeAction, error) { if rng.Start == rng.End { return nil, nil } @@ -380,9 +427,10 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.C var commands []protocol.Command if _, ok, methodOk, _ := source.CanExtractFunction(pgf.Tok, start, end, pgf.Src, pgf.File); ok { cmd, err := command.NewApplyFixCommand("Extract function", command.ApplyFixArgs{ - URI: puri, - Fix: string(settings.ExtractFunction), - Range: rng, + URI: puri, + Fix: string(settings.ExtractFunction), + Range: rng, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err @@ -390,9 +438,10 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.C commands = append(commands, cmd) if methodOk { cmd, err := command.NewApplyFixCommand("Extract method", command.ApplyFixArgs{ - URI: puri, - Fix: string(settings.ExtractMethod), - Range: rng, + URI: puri, + Fix: string(settings.ExtractMethod), + Range: rng, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err @@ -402,9 +451,10 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.C } if _, _, ok, _ := source.CanExtractVariable(start, end, pgf.File); ok { cmd, err := command.NewApplyFixCommand("Extract variable", command.ApplyFixArgs{ - URI: puri, - Fix: string(settings.ExtractVariable), - Range: rng, + URI: puri, + Fix: string(settings.ExtractVariable), + Range: rng, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err @@ -413,16 +463,31 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.C } var actions []protocol.CodeAction for i := range commands { - actions = append(actions, protocol.CodeAction{ - Title: commands[i].Title, - Kind: protocol.RefactorExtract, - Command: &commands[i], - }) + actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorExtract, &commands[i], nil, options)) } return actions, nil } -func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.ParsedGoFile, fh file.Handle, rng protocol.Range) (_ []protocol.CodeAction, rerr error) { +func newCodeAction(title string, kind protocol.CodeActionKind, cmd *protocol.Command, diagnostics []protocol.Diagnostic, options *settings.Options) protocol.CodeAction { + action := protocol.CodeAction{ + Title: title, + Kind: kind, + Diagnostics: diagnostics, + } + if !supportsResolveEdits(options) { + action.Command = cmd + } else { + data, err := json.Marshal(cmd) + if err != nil { + panic("unable to marshal") + } + msg := json.RawMessage(data) + action.Data = &msg + } + return action +} + +func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.ParsedGoFile, fh file.Handle, rng protocol.Range, options *settings.Options) (_ []protocol.CodeAction, rerr error) { // golang/go#61693: code actions were refactored to run outside of the // analysis framework, but as a result they lost their panic recovery. // @@ -442,15 +507,12 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P URI: pgf.URI, Range: rng, }, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err } - actions = append(actions, protocol.CodeAction{ - Title: "Refactor: remove unused parameter", - Kind: protocol.RefactorRewrite, - Command: &cmd, - }) + actions = append(actions, newCodeAction("Refactor: remove unused parameter", protocol.RefactorRewrite, &cmd, nil, options)) } if action, ok := source.ConvertStringLiteral(pgf, fh, rng); ok { @@ -465,9 +527,10 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P var commands []protocol.Command if _, ok, _ := source.CanInvertIfCondition(pgf.File, start, end); ok { cmd, err := command.NewApplyFixCommand("Invert if condition", command.ApplyFixArgs{ - URI: pgf.URI, - Fix: string(settings.InvertIfCondition), - Range: rng, + URI: pgf.URI, + Fix: string(settings.InvertIfCondition), + Range: rng, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err @@ -487,9 +550,10 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P return nil, err } cmd, err := command.NewApplyFixCommand(d.Message, command.ApplyFixArgs{ - URI: pgf.URI, - Fix: string(settings.FillStruct), - Range: rng, + URI: pgf.URI, + Fix: string(settings.FillStruct), + Range: rng, + ResolveEdits: supportsResolveEdits(options), }) if err != nil { return nil, err @@ -499,11 +563,7 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P } for i := range commands { - actions = append(actions, protocol.CodeAction{ - Title: commands[i].Title, - Kind: protocol.RefactorRewrite, - Command: &commands[i], - }) + actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorRewrite, &commands[i], nil, options)) } if snapshot.Options().IsAnalyzerEnabled(infertypeargs.Analyzer.Name) { diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 85149ca6fcd..5538ec8282c 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -199,8 +199,9 @@ func (c *commandHandler) run(ctx context.Context, cfg commandConfig, run command return runcmd() } -func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs) error { - return c.run(ctx, commandConfig{ +func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs) (*protocol.WorkspaceEdit, error) { + var result *protocol.WorkspaceEdit + err := c.run(ctx, commandConfig{ // Note: no progress here. Applying fixes should be quick. forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { @@ -215,10 +216,15 @@ func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs TextDocumentEdit: &edit, }) } + edit := protocol.WorkspaceEdit{ + DocumentChanges: changes, + } + if args.ResolveEdits { + result = &edit + return nil + } r, err := c.s.client.ApplyEdit(ctx, &protocol.ApplyWorkspaceEditParams{ - Edit: protocol.WorkspaceEdit{ - DocumentChanges: changes, - }, + Edit: edit, }) if err != nil { return err @@ -228,6 +234,7 @@ func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs } return nil }) + return result, err } func (c *commandHandler) RegenerateCgo(ctx context.Context, args command.URIArg) error { @@ -1266,8 +1273,9 @@ func showDocumentImpl(ctx context.Context, cli protocol.Client, url protocol.URI } } -func (c *commandHandler) ChangeSignature(ctx context.Context, args command.ChangeSignatureArgs) error { - return c.run(ctx, commandConfig{ +func (c *commandHandler) ChangeSignature(ctx context.Context, args command.ChangeSignatureArgs) (*protocol.WorkspaceEdit, error) { + var result *protocol.WorkspaceEdit + err := c.run(ctx, commandConfig{ forURI: args.RemoveParameter.URI, }, func(ctx context.Context, deps commandDeps) error { // For now, gopls only supports removing unused parameters. @@ -1275,10 +1283,15 @@ func (c *commandHandler) ChangeSignature(ctx context.Context, args command.Chang if err != nil { return err } + edit := protocol.WorkspaceEdit{ + DocumentChanges: changes, + } + if args.ResolveEdits { + result = &edit + return nil + } r, err := c.s.client.ApplyEdit(ctx, &protocol.ApplyWorkspaceEditParams{ - Edit: protocol.WorkspaceEdit{ - DocumentChanges: changes, - }, + Edit: edit, }) if !r.Applied { return fmt.Errorf("failed to apply edits: %v", r.FailureReason) @@ -1286,6 +1299,7 @@ func (c *commandHandler) ChangeSignature(ctx context.Context, args command.Chang return nil }) + return result, err } func (c *commandHandler) DiagnoseFiles(ctx context.Context, args command.DiagnoseFilesArgs) error { diff --git a/gopls/internal/server/general.go b/gopls/internal/server/general.go index 141fed947ae..371e2fa591d 100644 --- a/gopls/internal/server/general.go +++ b/gopls/internal/server/general.go @@ -114,6 +114,7 @@ func (s *server) Initialize(ctx context.Context, params *protocol.ParamInitializ // Using CodeActionOptions is only valid if codeActionLiteralSupport is set. codeActionProvider = &protocol.CodeActionOptions{ CodeActionKinds: s.getSupportedCodeActions(), + ResolveProvider: true, } } var renameOpts interface{} = true diff --git a/gopls/internal/server/unimplemented.go b/gopls/internal/server/unimplemented.go index 6f897adf564..d8e16a52d5f 100644 --- a/gopls/internal/server/unimplemented.go +++ b/gopls/internal/server/unimplemented.go @@ -102,10 +102,6 @@ func (s *server) Resolve(context.Context, *protocol.InlayHint) (*protocol.InlayH return nil, notImplemented("Resolve") } -func (s *server) ResolveCodeAction(context.Context, *protocol.CodeAction) (*protocol.CodeAction, error) { - return nil, notImplemented("ResolveCodeAction") -} - func (s *server) ResolveCodeLens(context.Context, *protocol.CodeLens) (*protocol.CodeLens, error) { return nil, notImplemented("ResolveCodeLens") } diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index 7f6760947d4..808df6d6a15 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -739,16 +739,18 @@ var GeneratedAPIJSON = &APIJSON{ ArgDoc: "{\n\t// Names and Values must have the same length.\n\t\"Names\": []string,\n\t\"Values\": []int64,\n}", }, { - Command: "gopls.apply_fix", - Title: "Apply a fix", - Doc: "Applies a fix to a region of source code.", - ArgDoc: "{\n\t// The fix to apply.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n}", - }, - { - Command: "gopls.change_signature", - Title: "Perform a \"change signature\" refactoring", - Doc: "This command is experimental, currently only supporting parameter removal.\nIts signature will certainly change in the future (pun intended).", - ArgDoc: "{\n\t\"RemoveParameter\": {\n\t\t\"uri\": string,\n\t\t\"range\": {\n\t\t\t\"start\": { ... },\n\t\t\t\"end\": { ... },\n\t\t},\n\t},\n}", + Command: "gopls.apply_fix", + Title: "Apply a fix", + Doc: "Applies a fix to a region of source code.", + ArgDoc: "{\n\t// The fix to apply.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", + ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", + }, + { + Command: "gopls.change_signature", + Title: "Perform a \"change signature\" refactoring", + Doc: "This command is experimental, currently only supporting parameter removal.\nIts signature will certainly change in the future (pun intended).", + ArgDoc: "{\n\t\"RemoveParameter\": {\n\t\t\"uri\": string,\n\t\t\"range\": {\n\t\t\t\"start\": { ... },\n\t\t\t\"end\": { ... },\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", + ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", }, { Command: "gopls.check_upgrades", diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index a5afc6fecf1..2bf4e5051bf 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -131,6 +131,7 @@ type ClientOptions struct { CompletionTags bool CompletionDeprecated bool SupportedResourceOperations []protocol.ResourceOperationKind + CodeActionResolveOptions []string } // ServerOptions holds LSP-specific configuration that is provided by the @@ -748,6 +749,11 @@ func (o *Options) ForClientCapabilities(clientName *protocol.ClientInfo, caps pr } else if caps.TextDocument.Completion.CompletionItem.DeprecatedSupport { o.CompletionDeprecated = true } + + // Check if the client supports code actions resolving. + if caps.TextDocument.CodeAction.DataSupport && caps.TextDocument.CodeAction.ResolveSupport != nil { + o.CodeActionResolveOptions = caps.TextDocument.CodeAction.ResolveSupport.Properties + } } func (o *Options) Clone() *Options { diff --git a/gopls/internal/test/integration/fake/editor.go b/gopls/internal/test/integration/fake/editor.go index 6958564cd06..9c376d0219b 100644 --- a/gopls/internal/test/integration/fake/editor.go +++ b/gopls/internal/test/integration/fake/editor.go @@ -21,6 +21,7 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake/glob" "golang.org/x/tools/gopls/internal/util/pathutil" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/jsonrpc2" "golang.org/x/tools/internal/jsonrpc2/servertest" "golang.org/x/tools/internal/xcontext" @@ -263,42 +264,11 @@ func (e *Editor) initialize(ctx context.Context) error { params.InitializationOptions = makeSettings(e.sandbox, config) params.WorkspaceFolders = makeWorkspaceFolders(e.sandbox, config.WorkspaceFolders) - // Set various client capabilities that are sought by gopls. - params.Capabilities.Workspace.Configuration = true // support workspace/configuration - params.Capabilities.Window.WorkDoneProgress = true // support window/workDoneProgress - params.Capabilities.TextDocument.Completion.CompletionItem.TagSupport = &protocol.CompletionItemTagOptions{} - params.Capabilities.TextDocument.Completion.CompletionItem.TagSupport.ValueSet = []protocol.CompletionItemTag{protocol.ComplDeprecated} - params.Capabilities.TextDocument.Completion.CompletionItem.SnippetSupport = true - params.Capabilities.TextDocument.SemanticTokens.Requests.Full = &protocol.Or_ClientSemanticTokensRequestOptions_full{Value: true} - params.Capabilities.TextDocument.SemanticTokens.TokenTypes = []string{ - "namespace", "type", "class", "enum", "interface", - "struct", "typeParameter", "parameter", "variable", "property", "enumMember", - "event", "function", "method", "macro", "keyword", "modifier", "comment", - "string", "number", "regexp", "operator", - } - params.Capabilities.TextDocument.SemanticTokens.TokenModifiers = []string{ - "declaration", "definition", "readonly", "static", - "deprecated", "abstract", "async", "modification", "documentation", "defaultLibrary", - } - // The LSP tests have historically enabled this flag, - // but really we should test both ways for older editors. - params.Capabilities.TextDocument.DocumentSymbol.HierarchicalDocumentSymbolSupport = true - // Glob pattern watching is enabled. - params.Capabilities.Workspace.DidChangeWatchedFiles.DynamicRegistration = true - // "rename" operations are used for package renaming. - // - // TODO(rfindley): add support for other resource operations (create, delete, ...) - params.Capabilities.Workspace.WorkspaceEdit = &protocol.WorkspaceEditClientCapabilities{ - ResourceOperations: []protocol.ResourceOperationKind{ - "rename", - }, - } - // Apply capabilities overlay. - if config.CapabilitiesJSON != nil { - if err := json.Unmarshal(config.CapabilitiesJSON, ¶ms.Capabilities); err != nil { - return fmt.Errorf("unmarshalling EditorConfig.CapabilitiesJSON: %v", err) - } + capabilities, err := clientCapabilities(config) + if err != nil { + return fmt.Errorf("unmarshalling EditorConfig.CapabilitiesJSON: %v", err) } + params.Capabilities = capabilities trace := protocol.TraceValues("messages") params.Trace = &trace @@ -325,6 +295,48 @@ func (e *Editor) initialize(ctx context.Context) error { return nil } +func clientCapabilities(cfg EditorConfig) (protocol.ClientCapabilities, error) { + var capabilities protocol.ClientCapabilities + // Set various client capabilities that are sought by gopls. + capabilities.Workspace.Configuration = true // support workspace/configuration + capabilities.TextDocument.Completion.CompletionItem.TagSupport = &protocol.CompletionItemTagOptions{} + capabilities.TextDocument.Completion.CompletionItem.TagSupport.ValueSet = []protocol.CompletionItemTag{protocol.ComplDeprecated} + capabilities.TextDocument.Completion.CompletionItem.SnippetSupport = true + capabilities.TextDocument.SemanticTokens.Requests.Full = &protocol.Or_ClientSemanticTokensRequestOptions_full{Value: true} + capabilities.Window.WorkDoneProgress = true // support window/workDoneProgress + capabilities.TextDocument.SemanticTokens.TokenTypes = []string{ + "namespace", "type", "class", "enum", "interface", + "struct", "typeParameter", "parameter", "variable", "property", "enumMember", + "event", "function", "method", "macro", "keyword", "modifier", "comment", + "string", "number", "regexp", "operator", + } + capabilities.TextDocument.SemanticTokens.TokenModifiers = []string{ + "declaration", "definition", "readonly", "static", + "deprecated", "abstract", "async", "modification", "documentation", "defaultLibrary", + } + // The LSP tests have historically enabled this flag, + // but really we should test both ways for older editors. + capabilities.TextDocument.DocumentSymbol.HierarchicalDocumentSymbolSupport = true + // Glob pattern watching is enabled. + capabilities.Workspace.DidChangeWatchedFiles.DynamicRegistration = true + // "rename" operations are used for package renaming. + // + // TODO(rfindley): add support for other resource operations (create, delete, ...) + capabilities.Workspace.WorkspaceEdit = &protocol.WorkspaceEditClientCapabilities{ + ResourceOperations: []protocol.ResourceOperationKind{ + "rename", + }, + } + + // Apply capabilities overlay. + if cfg.CapabilitiesJSON != nil { + if err := json.Unmarshal(cfg.CapabilitiesJSON, &capabilities); err != nil { + return protocol.ClientCapabilities{}, fmt.Errorf("unmarshalling EditorConfig.CapabilitiesJSON: %v", err) + } + } + return capabilities, nil +} + // marshalUnmarshal is a helper to json Marshal and then Unmarshal as a // different type. Used to work around cases where our protocol types are not // specific. @@ -902,6 +914,21 @@ func (e *Editor) ApplyQuickFixes(ctx context.Context, loc protocol.Location, dia // ApplyCodeAction applies the given code action. func (e *Editor) ApplyCodeAction(ctx context.Context, action protocol.CodeAction) error { + // Resolve the code actions if necessary and supported. + if action.Edit == nil { + editSupport, err := e.EditResolveSupport() + if err != nil { + return err + } + if editSupport { + ca, err := e.Server.ResolveCodeAction(ctx, &action) + if err != nil { + return err + } + action.Edit = ca.Edit + } + } + if action.Edit != nil { for _, change := range action.Edit.DocumentChanges { if change.TextDocumentEdit != nil { @@ -932,11 +959,11 @@ func (e *Editor) ApplyCodeAction(ctx context.Context, action protocol.CodeAction // GetQuickFixes returns the available quick fix code actions. func (e *Editor) GetQuickFixes(ctx context.Context, loc protocol.Location, diagnostics []protocol.Diagnostic) ([]protocol.CodeAction, error) { - return e.getCodeActions(ctx, loc, diagnostics, protocol.QuickFix, protocol.SourceFixAll) + return e.CodeActions(ctx, loc, diagnostics, protocol.QuickFix, protocol.SourceFixAll) } func (e *Editor) applyCodeActions(ctx context.Context, loc protocol.Location, diagnostics []protocol.Diagnostic, only ...protocol.CodeActionKind) (int, error) { - actions, err := e.getCodeActions(ctx, loc, diagnostics, only...) + actions, err := e.CodeActions(ctx, loc, diagnostics, only...) if err != nil { return 0, err } @@ -963,7 +990,7 @@ func (e *Editor) applyCodeActions(ctx context.Context, loc protocol.Location, di return applied, nil } -func (e *Editor) getCodeActions(ctx context.Context, loc protocol.Location, diagnostics []protocol.Diagnostic, only ...protocol.CodeActionKind) ([]protocol.CodeAction, error) { +func (e *Editor) CodeActions(ctx context.Context, loc protocol.Location, diagnostics []protocol.Diagnostic, only ...protocol.CodeActionKind) ([]protocol.CodeAction, error) { if e.Server == nil { return nil, nil } @@ -1471,6 +1498,14 @@ func (e *Editor) CodeAction(ctx context.Context, loc protocol.Location, diagnost return lens, nil } +func (e *Editor) EditResolveSupport() (bool, error) { + capabilities, err := clientCapabilities(e.Config()) + if err != nil { + return false, err + } + return capabilities.TextDocument.CodeAction.ResolveSupport != nil && slices.Contains(capabilities.TextDocument.CodeAction.ResolveSupport.Properties, "edit"), nil +} + // Hover triggers a hover at the given position in an open buffer. func (e *Editor) Hover(ctx context.Context, loc protocol.Location) (*protocol.MarkupContent, protocol.Location, error) { if err := e.checkBufferLocation(loc); err != nil { diff --git a/gopls/internal/test/integration/misc/fix_test.go b/gopls/internal/test/integration/misc/fix_test.go index 81b855936e1..1217fe4d2ee 100644 --- a/gopls/internal/test/integration/misc/fix_test.go +++ b/gopls/internal/test/integration/misc/fix_test.go @@ -7,14 +7,24 @@ package misc import ( "testing" - . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/lsp/protocol" ) -// A basic test for fillstruct, now that it uses a command. +// A basic test for fillstruct, now that it uses a command and supports resolve edits. func TestFillStruct(t *testing.T) { + tc := []struct { + name string + capabilities string + wantCommand bool + }{ + {"default", "{}", true}, + {"no data", `{ "textDocument": {"codeAction": { "resolveSupport": { "properties": ["edit"] } } } }`, true}, + {"resolve support", `{ "textDocument": {"codeAction": { "dataSupport": true, "resolveSupport": { "properties": ["edit"] } } } }`, false}, + } + const basic = ` -- go.mod -- module mod.com @@ -32,12 +42,35 @@ func Foo() { _ = Info{} } ` - Run(t, basic, func(t *testing.T, env *Env) { - env.OpenFile("main.go") - if err := env.Editor.RefactorRewrite(env.Ctx, env.RegexpSearch("main.go", "Info{}")); err != nil { - t.Fatal(err) - } - want := `package main + + for _, tt := range tc { + t.Run(tt.name, func(t *testing.T) { + runner := WithOptions(CapabilitiesJSON([]byte(tt.capabilities))) + + runner.Run(t, basic, func(t *testing.T, env *Env) { + env.OpenFile("main.go") + fixes, err := env.Editor.CodeActions(env.Ctx, env.RegexpSearch("main.go", "Info{}"), nil, protocol.RefactorRewrite) + if err != nil { + t.Fatal(err) + } + if len(fixes) != 1 { + t.Fatalf("expected 1 code action, got %v", len(fixes)) + } + if tt.wantCommand { + if fixes[0].Command == nil || fixes[0].Data != nil { + t.Errorf("expected code action to have command not data, got %v", fixes[0]) + } + } else { + if fixes[0].Command != nil || fixes[0].Data == nil { + t.Errorf("expected code action to have command not data, got %v", fixes[0]) + } + } + + // Apply the code action (handles resolving the code action), and check that the result is correct. + if err := env.Editor.RefactorRewrite(env.Ctx, env.RegexpSearch("main.go", "Info{}")); err != nil { + t.Fatal(err) + } + want := `package main type Info struct { WordCounts map[string]int @@ -51,10 +84,12 @@ func Foo() { } } ` - if got := env.BufferText("main.go"); got != want { - t.Fatalf("TestFillStruct failed:\n%s", compare.Text(want, got)) - } - }) + if got := env.BufferText("main.go"); got != want { + t.Fatalf("TestFillStruct failed:\n%s", compare.Text(want, got)) + } + }) + }) + } } func TestFillReturns(t *testing.T) { diff --git a/gopls/internal/test/integration/options.go b/gopls/internal/test/integration/options.go index ded09b47c18..c558da2dfd9 100644 --- a/gopls/internal/test/integration/options.go +++ b/gopls/internal/test/integration/options.go @@ -73,6 +73,13 @@ func ClientName(name string) RunOption { }) } +// CapabilitiesJSON sets the capabalities json. +func CapabilitiesJSON(capabilities []byte) RunOption { + return optionSetter(func(opts *runConfig) { + opts.editor.CapabilitiesJSON = capabilities + }) +} + // Settings sets user-provided configuration for the LSP server. // // As a special case, the env setting must not be provided via Settings: use diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 05a93e6e5dd..3440fa098a0 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -1919,6 +1919,23 @@ func codeActionChanges(env *integration.Env, uri protocol.DocumentURI, rng proto // applied in that order. But since applyDocumentChanges(env, // action.Edit.DocumentChanges) doesn't compose, for now we // assert that actions return one or the other. + + // Resolve code action edits first if the client has resolve support + // and the code action has no edits. + if action.Edit == nil { + editSupport, err := env.Editor.EditResolveSupport() + if err != nil { + return nil, err + } + if editSupport { + resolved, err := env.Editor.Server.ResolveCodeAction(env.Ctx, &action) + if err != nil { + return nil, err + } + action.Edit = resolved.Edit + } + } + if action.Edit != nil { if action.Edit.Changes != nil { env.T.Errorf("internal error: discarding unexpected CodeAction{Kind=%s, Title=%q}.Edit.Changes", action.Kind, action.Title) diff --git a/gopls/internal/test/marker/testdata/codeaction/extract_variable.txt b/gopls/internal/test/marker/testdata/codeaction/extract_variable.txt index c10b8185c9b..685b4ff9372 100644 --- a/gopls/internal/test/marker/testdata/codeaction/extract_variable.txt +++ b/gopls/internal/test/marker/testdata/codeaction/extract_variable.txt @@ -1,4 +1,5 @@ This test checks the behavior of the 'extract variable' code action. +See extract_variable_resolve.txt for the same test with resolve support. -- flags -- -ignore_extra_diags diff --git a/gopls/internal/test/marker/testdata/codeaction/extract_variable_resolve.txt b/gopls/internal/test/marker/testdata/codeaction/extract_variable_resolve.txt new file mode 100644 index 00000000000..dc6ad787afb --- /dev/null +++ b/gopls/internal/test/marker/testdata/codeaction/extract_variable_resolve.txt @@ -0,0 +1,81 @@ +This test checks the behavior of the 'extract variable' code action, with resolve support. +See extract_variable.txt for the same test without resolve support. + +-- capabilities.json -- +{ + "textDocument": { + "codeAction": { + "dataSupport": true, + "resolveSupport": { + "properties": ["edit"] + } + } + } +} +-- flags -- +-ignore_extra_diags + +-- basic_lit.go -- +package extract + +func _() { + var _ = 1 + 2 //@codeactionedit("1", "refactor.extract", basic_lit1) + var _ = 3 + 4 //@codeactionedit("3 + 4", "refactor.extract", basic_lit2) +} + +-- @basic_lit1/basic_lit.go -- +@@ -4 +4,2 @@ +- var _ = 1 + 2 //@codeactionedit("1", "refactor.extract", basic_lit1) ++ x := 1 ++ var _ = x + 2 //@codeactionedit("1", "refactor.extract", basic_lit1) +-- @basic_lit2/basic_lit.go -- +@@ -5 +5,2 @@ +- var _ = 3 + 4 //@codeactionedit("3 + 4", "refactor.extract", basic_lit2) ++ x := 3 + 4 ++ var _ = x //@codeactionedit("3 + 4", "refactor.extract", basic_lit2) +-- func_call.go -- +package extract + +import "strconv" + +func _() { + x0 := append([]int{}, 1) //@codeactionedit("append([]int{}, 1)", "refactor.extract", func_call1) + str := "1" + b, err := strconv.Atoi(str) //@codeactionedit("strconv.Atoi(str)", "refactor.extract", func_call2) +} + +-- @func_call1/func_call.go -- +@@ -6 +6,2 @@ +- x0 := append([]int{}, 1) //@codeactionedit("append([]int{}, 1)", "refactor.extract", func_call1) ++ x := append([]int{}, 1) ++ x0 := x //@codeactionedit("append([]int{}, 1)", "refactor.extract", func_call1) +-- @func_call2/func_call.go -- +@@ -8 +8,2 @@ +- b, err := strconv.Atoi(str) //@codeactionedit("strconv.Atoi(str)", "refactor.extract", func_call2) ++ x, x1 := strconv.Atoi(str) ++ b, err := x, x1 //@codeactionedit("strconv.Atoi(str)", "refactor.extract", func_call2) +-- scope.go -- +package extract + +import "go/ast" + +func _() { + x0 := 0 + if true { + y := ast.CompositeLit{} //@codeactionedit("ast.CompositeLit{}", "refactor.extract", scope1) + } + if true { + x1 := !false //@codeactionedit("!false", "refactor.extract", scope2) + } +} + +-- @scope1/scope.go -- +@@ -8 +8,2 @@ +- y := ast.CompositeLit{} //@codeactionedit("ast.CompositeLit{}", "refactor.extract", scope1) ++ x := ast.CompositeLit{} ++ y := x //@codeactionedit("ast.CompositeLit{}", "refactor.extract", scope1) +-- @scope2/scope.go -- +@@ -11 +11,2 @@ +- x1 := !false //@codeactionedit("!false", "refactor.extract", scope2) ++ x := !false ++ x1 := x //@codeactionedit("!false", "refactor.extract", scope2) diff --git a/gopls/internal/test/marker/testdata/codeaction/fill_struct.txt b/gopls/internal/test/marker/testdata/codeaction/fill_struct.txt index 092a4275ffb..deac1d78507 100644 --- a/gopls/internal/test/marker/testdata/codeaction/fill_struct.txt +++ b/gopls/internal/test/marker/testdata/codeaction/fill_struct.txt @@ -1,4 +1,5 @@ This test checks the behavior of the 'fill struct' code action. +See fill_struct_resolve.txt for same test with resolve support. -- flags -- -ignore_extra_diags @@ -89,11 +90,11 @@ type funStruct struct { var _ = funStruct{} //@codeactionedit("}", "refactor.rewrite", a22) -type funStructCompex struct { +type funStructComplex struct { fn func(i int, s string) (string, int) } -var _ = funStructCompex{} //@codeactionedit("}", "refactor.rewrite", a23) +var _ = funStructComplex{} //@codeactionedit("}", "refactor.rewrite", a23) type funStructEmpty struct { fn func() @@ -120,8 +121,8 @@ var _ = funStructEmpty{} //@codeactionedit("}", "refactor.rewrite", a24) +} //@codeactionedit("}", "refactor.rewrite", a22) -- @a23/a2.go -- @@ -23 +23,4 @@ --var _ = funStructCompex{} //@codeactionedit("}", "refactor.rewrite", a23) -+var _ = funStructCompex{ +-var _ = funStructComplex{} //@codeactionedit("}", "refactor.rewrite", a23) ++var _ = funStructComplex{ + fn: func(i int, s string) (string, int) { + }, +} //@codeactionedit("}", "refactor.rewrite", a23) diff --git a/gopls/internal/test/marker/testdata/codeaction/fill_struct_resolve.txt b/gopls/internal/test/marker/testdata/codeaction/fill_struct_resolve.txt new file mode 100644 index 00000000000..e553d1c5993 --- /dev/null +++ b/gopls/internal/test/marker/testdata/codeaction/fill_struct_resolve.txt @@ -0,0 +1,586 @@ +This test checks the behavior of the 'fill struct' code action, with resolve support. +See fill_struct.txt for same test without resolve support. + +-- capabilities.json -- +{ + "textDocument": { + "codeAction": { + "dataSupport": true, + "resolveSupport": { + "properties": ["edit"] + } + } + } +} +-- flags -- +-ignore_extra_diags + +-- go.mod -- +module golang.org/lsptests/fillstruct + +go 1.18 + +-- data/data.go -- +package data + +type B struct { + ExportedInt int + unexportedInt int +} + +-- a.go -- +package fillstruct + +import ( + "golang.org/lsptests/fillstruct/data" +) + +type basicStruct struct { + foo int +} + +var _ = basicStruct{} //@codeactionedit("}", "refactor.rewrite", a1) + +type twoArgStruct struct { + foo int + bar string +} + +var _ = twoArgStruct{} //@codeactionedit("}", "refactor.rewrite", a2) + +type nestedStruct struct { + bar string + basic basicStruct +} + +var _ = nestedStruct{} //@codeactionedit("}", "refactor.rewrite", a3) + +var _ = data.B{} //@codeactionedit("}", "refactor.rewrite", a4) +-- @a1/a.go -- +@@ -11 +11,3 @@ +-var _ = basicStruct{} //@codeactionedit("}", "refactor.rewrite", a1) ++var _ = basicStruct{ ++ foo: 0, ++} //@codeactionedit("}", "refactor.rewrite", a1) +-- @a2/a.go -- +@@ -18 +18,4 @@ +-var _ = twoArgStruct{} //@codeactionedit("}", "refactor.rewrite", a2) ++var _ = twoArgStruct{ ++ foo: 0, ++ bar: "", ++} //@codeactionedit("}", "refactor.rewrite", a2) +-- @a3/a.go -- +@@ -25 +25,4 @@ +-var _ = nestedStruct{} //@codeactionedit("}", "refactor.rewrite", a3) ++var _ = nestedStruct{ ++ bar: "", ++ basic: basicStruct{}, ++} //@codeactionedit("}", "refactor.rewrite", a3) +-- @a4/a.go -- +@@ -27 +27,3 @@ +-var _ = data.B{} //@codeactionedit("}", "refactor.rewrite", a4) ++var _ = data.B{ ++ ExportedInt: 0, ++} //@codeactionedit("}", "refactor.rewrite", a4) +-- a2.go -- +package fillstruct + +type typedStruct struct { + m map[string]int + s []int + c chan int + c1 <-chan int + a [2]string +} + +var _ = typedStruct{} //@codeactionedit("}", "refactor.rewrite", a21) + +type funStruct struct { + fn func(i int) int +} + +var _ = funStruct{} //@codeactionedit("}", "refactor.rewrite", a22) + +type funStructComplex struct { + fn func(i int, s string) (string, int) +} + +var _ = funStructComplex{} //@codeactionedit("}", "refactor.rewrite", a23) + +type funStructEmpty struct { + fn func() +} + +var _ = funStructEmpty{} //@codeactionedit("}", "refactor.rewrite", a24) + +-- @a21/a2.go -- +@@ -11 +11,7 @@ +-var _ = typedStruct{} //@codeactionedit("}", "refactor.rewrite", a21) ++var _ = typedStruct{ ++ m: map[string]int{}, ++ s: []int{}, ++ c: make(chan int), ++ c1: make(<-chan int), ++ a: [2]string{}, ++} //@codeactionedit("}", "refactor.rewrite", a21) +-- @a22/a2.go -- +@@ -17 +17,4 @@ +-var _ = funStruct{} //@codeactionedit("}", "refactor.rewrite", a22) ++var _ = funStruct{ ++ fn: func(i int) int { ++ }, ++} //@codeactionedit("}", "refactor.rewrite", a22) +-- @a23/a2.go -- +@@ -23 +23,4 @@ +-var _ = funStructComplex{} //@codeactionedit("}", "refactor.rewrite", a23) ++var _ = funStructComplex{ ++ fn: func(i int, s string) (string, int) { ++ }, ++} //@codeactionedit("}", "refactor.rewrite", a23) +-- @a24/a2.go -- +@@ -29 +29,4 @@ +-var _ = funStructEmpty{} //@codeactionedit("}", "refactor.rewrite", a24) ++var _ = funStructEmpty{ ++ fn: func() { ++ }, ++} //@codeactionedit("}", "refactor.rewrite", a24) +-- a3.go -- +package fillstruct + +import ( + "go/ast" + "go/token" +) + +type Foo struct { + A int +} + +type Bar struct { + X *Foo + Y *Foo +} + +var _ = Bar{} //@codeactionedit("}", "refactor.rewrite", a31) + +type importedStruct struct { + m map[*ast.CompositeLit]ast.Field + s []ast.BadExpr + a [3]token.Token + c chan ast.EmptyStmt + fn func(ast_decl ast.DeclStmt) ast.Ellipsis + st ast.CompositeLit +} + +var _ = importedStruct{} //@codeactionedit("}", "refactor.rewrite", a32) + +type pointerBuiltinStruct struct { + b *bool + s *string + i *int +} + +var _ = pointerBuiltinStruct{} //@codeactionedit("}", "refactor.rewrite", a33) + +var _ = []ast.BasicLit{ + {}, //@codeactionedit("}", "refactor.rewrite", a34) +} + +var _ = []ast.BasicLit{{}} //@codeactionedit("}", "refactor.rewrite", a35) +-- @a31/a3.go -- +@@ -17 +17,4 @@ +-var _ = Bar{} //@codeactionedit("}", "refactor.rewrite", a31) ++var _ = Bar{ ++ X: &Foo{}, ++ Y: &Foo{}, ++} //@codeactionedit("}", "refactor.rewrite", a31) +-- @a32/a3.go -- +@@ -28 +28,9 @@ +-var _ = importedStruct{} //@codeactionedit("}", "refactor.rewrite", a32) ++var _ = importedStruct{ ++ m: map[*ast.CompositeLit]ast.Field{}, ++ s: []ast.BadExpr{}, ++ a: [3]token.Token{}, ++ c: make(chan ast.EmptyStmt), ++ fn: func(ast_decl ast.DeclStmt) ast.Ellipsis { ++ }, ++ st: ast.CompositeLit{}, ++} //@codeactionedit("}", "refactor.rewrite", a32) +-- @a33/a3.go -- +@@ -36 +36,5 @@ +-var _ = pointerBuiltinStruct{} //@codeactionedit("}", "refactor.rewrite", a33) ++var _ = pointerBuiltinStruct{ ++ b: new(bool), ++ s: new(string), ++ i: new(int), ++} //@codeactionedit("}", "refactor.rewrite", a33) +-- @a34/a3.go -- +@@ -39 +39,5 @@ +- {}, //@codeactionedit("}", "refactor.rewrite", a34) ++ { ++ ValuePos: 0, ++ Kind: 0, ++ Value: "", ++ }, //@codeactionedit("}", "refactor.rewrite", a34) +-- @a35/a3.go -- +@@ -42 +42,5 @@ +-var _ = []ast.BasicLit{{}} //@codeactionedit("}", "refactor.rewrite", a35) ++var _ = []ast.BasicLit{{ ++ ValuePos: 0, ++ Kind: 0, ++ Value: "", ++}} //@codeactionedit("}", "refactor.rewrite", a35) +-- a4.go -- +package fillstruct + +import "go/ast" + +type iStruct struct { + X int +} + +type sStruct struct { + str string +} + +type multiFill struct { + num int + strin string + arr []int +} + +type assignStruct struct { + n ast.Node +} + +func fill() { + var x int + var _ = iStruct{} //@codeactionedit("}", "refactor.rewrite", a41) + + var s string + var _ = sStruct{} //@codeactionedit("}", "refactor.rewrite", a42) + + var n int + _ = []int{} + if true { + arr := []int{1, 2} + } + var _ = multiFill{} //@codeactionedit("}", "refactor.rewrite", a43) + + var node *ast.CompositeLit + var _ = assignStruct{} //@codeactionedit("}", "refactor.rewrite", a45) +} + +-- @a41/a4.go -- +@@ -25 +25,3 @@ +- var _ = iStruct{} //@codeactionedit("}", "refactor.rewrite", a41) ++ var _ = iStruct{ ++ X: x, ++ } //@codeactionedit("}", "refactor.rewrite", a41) +-- @a42/a4.go -- +@@ -28 +28,3 @@ +- var _ = sStruct{} //@codeactionedit("}", "refactor.rewrite", a42) ++ var _ = sStruct{ ++ str: s, ++ } //@codeactionedit("}", "refactor.rewrite", a42) +-- @a43/a4.go -- +@@ -35 +35,5 @@ +- var _ = multiFill{} //@codeactionedit("}", "refactor.rewrite", a43) ++ var _ = multiFill{ ++ num: n, ++ strin: s, ++ arr: []int{}, ++ } //@codeactionedit("}", "refactor.rewrite", a43) +-- @a45/a4.go -- +@@ -38 +38,3 @@ +- var _ = assignStruct{} //@codeactionedit("}", "refactor.rewrite", a45) ++ var _ = assignStruct{ ++ n: node, ++ } //@codeactionedit("}", "refactor.rewrite", a45) +-- fill_struct.go -- +package fillstruct + +type StructA struct { + unexportedIntField int + ExportedIntField int + MapA map[int]string + Array []int + StructB +} + +type StructA2 struct { + B *StructB +} + +type StructA3 struct { + B StructB +} + +func fill() { + a := StructA{} //@codeactionedit("}", "refactor.rewrite", fill_struct1) + b := StructA2{} //@codeactionedit("}", "refactor.rewrite", fill_struct2) + c := StructA3{} //@codeactionedit("}", "refactor.rewrite", fill_struct3) + if true { + _ = StructA3{} //@codeactionedit("}", "refactor.rewrite", fill_struct4) + } +} + +-- @fill_struct1/fill_struct.go -- +@@ -20 +20,7 @@ +- a := StructA{} //@codeactionedit("}", "refactor.rewrite", fill_struct1) ++ a := StructA{ ++ unexportedIntField: 0, ++ ExportedIntField: 0, ++ MapA: map[int]string{}, ++ Array: []int{}, ++ StructB: StructB{}, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct1) +-- @fill_struct2/fill_struct.go -- +@@ -21 +21,3 @@ +- b := StructA2{} //@codeactionedit("}", "refactor.rewrite", fill_struct2) ++ b := StructA2{ ++ B: &StructB{}, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct2) +-- @fill_struct3/fill_struct.go -- +@@ -22 +22,3 @@ +- c := StructA3{} //@codeactionedit("}", "refactor.rewrite", fill_struct3) ++ c := StructA3{ ++ B: StructB{}, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct3) +-- @fill_struct4/fill_struct.go -- +@@ -24 +24,3 @@ +- _ = StructA3{} //@codeactionedit("}", "refactor.rewrite", fill_struct4) ++ _ = StructA3{ ++ B: StructB{}, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct4) +-- fill_struct_anon.go -- +package fillstruct + +type StructAnon struct { + a struct{} + b map[string]interface{} + c map[string]struct { + d int + e bool + } +} + +func fill() { + _ := StructAnon{} //@codeactionedit("}", "refactor.rewrite", fill_struct_anon) +} +-- @fill_struct_anon/fill_struct_anon.go -- +@@ -13 +13,5 @@ +- _ := StructAnon{} //@codeactionedit("}", "refactor.rewrite", fill_struct_anon) ++ _ := StructAnon{ ++ a: struct{}{}, ++ b: map[string]interface{}{}, ++ c: map[string]struct{d int; e bool}{}, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct_anon) +-- fill_struct_nested.go -- +package fillstruct + +type StructB struct { + StructC +} + +type StructC struct { + unexportedInt int +} + +func nested() { + c := StructB{ + StructC: StructC{}, //@codeactionedit("}", "refactor.rewrite", fill_nested) + } +} + +-- @fill_nested/fill_struct_nested.go -- +@@ -13 +13,3 @@ +- StructC: StructC{}, //@codeactionedit("}", "refactor.rewrite", fill_nested) ++ StructC: StructC{ ++ unexportedInt: 0, ++ }, //@codeactionedit("}", "refactor.rewrite", fill_nested) +-- fill_struct_package.go -- +package fillstruct + +import ( + h2 "net/http" + + "golang.org/lsptests/fillstruct/data" +) + +func unexported() { + a := data.B{} //@codeactionedit("}", "refactor.rewrite", fill_struct_package1) + _ = h2.Client{} //@codeactionedit("}", "refactor.rewrite", fill_struct_package2) +} +-- @fill_struct_package1/fill_struct_package.go -- +@@ -10 +10,3 @@ +- a := data.B{} //@codeactionedit("}", "refactor.rewrite", fill_struct_package1) ++ a := data.B{ ++ ExportedInt: 0, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct_package1) +-- @fill_struct_package2/fill_struct_package.go -- +@@ -11 +11,7 @@ +- _ = h2.Client{} //@codeactionedit("}", "refactor.rewrite", fill_struct_package2) ++ _ = h2.Client{ ++ Transport: nil, ++ CheckRedirect: func(req *h2.Request, via []*h2.Request) error { ++ }, ++ Jar: nil, ++ Timeout: 0, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct_package2) +-- fill_struct_partial.go -- +package fillstruct + +type StructPartialA struct { + PrefilledInt int + UnfilledInt int + StructPartialB +} + +type StructPartialB struct { + PrefilledInt int + UnfilledInt int +} + +func fill() { + a := StructPartialA{ + PrefilledInt: 5, + } //@codeactionedit("}", "refactor.rewrite", fill_struct_partial1) + b := StructPartialB{ + /* this comment should disappear */ + PrefilledInt: 7, // This comment should be blown away. + /* As should + this one */ + } //@codeactionedit("}", "refactor.rewrite", fill_struct_partial2) +} + +-- @fill_struct_partial1/fill_struct_partial.go -- +@@ -16 +16,3 @@ +- PrefilledInt: 5, ++ PrefilledInt: 5, ++ UnfilledInt: 0, ++ StructPartialB: StructPartialB{}, +-- @fill_struct_partial2/fill_struct_partial.go -- +@@ -19,4 +19,2 @@ +- /* this comment should disappear */ +- PrefilledInt: 7, // This comment should be blown away. +- /* As should +- this one */ ++ PrefilledInt: 7, ++ UnfilledInt: 0, +-- fill_struct_spaces.go -- +package fillstruct + +type StructD struct { + ExportedIntField int +} + +func spaces() { + d := StructD{} //@codeactionedit("}", "refactor.rewrite", fill_struct_spaces) +} + +-- @fill_struct_spaces/fill_struct_spaces.go -- +@@ -8 +8,3 @@ +- d := StructD{} //@codeactionedit("}", "refactor.rewrite", fill_struct_spaces) ++ d := StructD{ ++ ExportedIntField: 0, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct_spaces) +-- fill_struct_unsafe.go -- +package fillstruct + +import "unsafe" + +type unsafeStruct struct { + x int + p unsafe.Pointer +} + +func fill() { + _ := unsafeStruct{} //@codeactionedit("}", "refactor.rewrite", fill_struct_unsafe) +} + +-- @fill_struct_unsafe/fill_struct_unsafe.go -- +@@ -11 +11,4 @@ +- _ := unsafeStruct{} //@codeactionedit("}", "refactor.rewrite", fill_struct_unsafe) ++ _ := unsafeStruct{ ++ x: 0, ++ p: nil, ++ } //@codeactionedit("}", "refactor.rewrite", fill_struct_unsafe) +-- typeparams.go -- +package fillstruct + +type emptyStructWithTypeParams[A any] struct{} + +var _ = emptyStructWithTypeParams[int]{} // no suggested fix + +type basicStructWithTypeParams[T any] struct { + foo T +} + +var _ = basicStructWithTypeParams[int]{} //@codeactionedit("}", "refactor.rewrite", typeparams1) + +type twoArgStructWithTypeParams[F, B any] struct { + foo F + bar B +} + +var _ = twoArgStructWithTypeParams[string, int]{} //@codeactionedit("}", "refactor.rewrite", typeparams2) + +var _ = twoArgStructWithTypeParams[int, string]{ + bar: "bar", +} //@codeactionedit("}", "refactor.rewrite", typeparams3) + +type nestedStructWithTypeParams struct { + bar string + basic basicStructWithTypeParams[int] +} + +var _ = nestedStructWithTypeParams{} //@codeactionedit("}", "refactor.rewrite", typeparams4) + +func _[T any]() { + type S struct{ t T } + _ = S{} //@codeactionedit("}", "refactor.rewrite", typeparams5) +} +-- @typeparams1/typeparams.go -- +@@ -11 +11,3 @@ +-var _ = basicStructWithTypeParams[int]{} //@codeactionedit("}", "refactor.rewrite", typeparams1) ++var _ = basicStructWithTypeParams[int]{ ++ foo: 0, ++} //@codeactionedit("}", "refactor.rewrite", typeparams1) +-- @typeparams2/typeparams.go -- +@@ -18 +18,4 @@ +-var _ = twoArgStructWithTypeParams[string, int]{} //@codeactionedit("}", "refactor.rewrite", typeparams2) ++var _ = twoArgStructWithTypeParams[string, int]{ ++ foo: "", ++ bar: 0, ++} //@codeactionedit("}", "refactor.rewrite", typeparams2) +-- @typeparams3/typeparams.go -- +@@ -21 +21 @@ ++ foo: 0, +-- @typeparams4/typeparams.go -- +@@ -29 +29,4 @@ +-var _ = nestedStructWithTypeParams{} //@codeactionedit("}", "refactor.rewrite", typeparams4) ++var _ = nestedStructWithTypeParams{ ++ bar: "", ++ basic: basicStructWithTypeParams{}, ++} //@codeactionedit("}", "refactor.rewrite", typeparams4) +-- @typeparams5/typeparams.go -- +@@ -33 +33,3 @@ +- _ = S{} //@codeactionedit("}", "refactor.rewrite", typeparams5) ++ _ = S{ ++ t: *new(T), ++ } //@codeactionedit("}", "refactor.rewrite", typeparams5) +-- issue63921.go -- +package fillstruct + +// Test for golang/go#63921: fillstruct panicked with invalid fields. +type invalidStruct struct { + F int + Undefined +} + +func _() { + // Note: the golden content for issue63921 is empty: fillstruct produces no + // edits, but does not panic. + invalidStruct{} //@codeactionedit("}", "refactor.rewrite", issue63921) +} diff --git a/gopls/internal/test/marker/testdata/codeaction/removeparam.txt b/gopls/internal/test/marker/testdata/codeaction/removeparam.txt index ad2289284d8..a5ce7ca2e43 100644 --- a/gopls/internal/test/marker/testdata/codeaction/removeparam.txt +++ b/gopls/internal/test/marker/testdata/codeaction/removeparam.txt @@ -1,4 +1,5 @@ This test exercises the refactoring to remove unused parameters. +See removeparam_resolve.txt for same test with resolve support. -- go.mod -- module unused.mod diff --git a/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt b/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt new file mode 100644 index 00000000000..7b9296eb569 --- /dev/null +++ b/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt @@ -0,0 +1,258 @@ +This test exercises the refactoring to remove unused parameters, with resolve support. +See removeparam.txt for same test without resolve support. + +-- capabilities.json -- +{ + "textDocument": { + "codeAction": { + "dataSupport": true, + "resolveSupport": { + "properties": ["edit"] + } + } + } +} +-- go.mod -- +module unused.mod + +go 1.18 + +-- a/a.go -- +package a + +func A(x, unused int) int { //@codeaction("unused", "unused", "refactor.rewrite", a) + return x +} + +-- @a/a/a.go -- +package a + +func A(x int) int { //@codeaction("unused", "unused", "refactor.rewrite", a) + return x +} + +-- a/a2.go -- +package a + +func _() { + A(1, 2) +} + +-- a/a_test.go -- +package a + +func _() { + A(1, 2) +} + +-- a/a_x_test.go -- +package a_test + +import "unused.mod/a" + +func _() { + a.A(1, 2) +} + +-- b/b.go -- +package b + +import "unused.mod/a" + +func f() int { + return 1 +} + +func g() int { + return 2 +} + +func _() { + a.A(f(), 1) +} + +-- @a/a/a2.go -- +package a + +func _() { + A(1) +} +-- @a/a/a_test.go -- +package a + +func _() { + A(1) +} +-- @a/a/a_x_test.go -- +package a_test + +import "unused.mod/a" + +func _() { + a.A(1) +} +-- @a/b/b.go -- +package b + +import "unused.mod/a" + +func f() int { + return 1 +} + +func g() int { + return 2 +} + +func _() { + a.A(f()) +} +-- field/field.go -- +package field + +func Field(x int, field int) { //@codeaction("int", "int", "refactor.rewrite", field) +} + +func _() { + Field(1, 2) +} +-- @field/field/field.go -- +package field + +func Field(field int) { //@codeaction("int", "int", "refactor.rewrite", field) +} + +func _() { + Field(2) +} +-- ellipsis/ellipsis.go -- +package ellipsis + +func Ellipsis(...any) { //@codeaction("any", "any", "refactor.rewrite", ellipsis) +} + +func _() { + // TODO(rfindley): investigate the broken formatting resulting from these inlinings. + Ellipsis() + Ellipsis(1) + Ellipsis(1, 2) + Ellipsis(1, f(), g()) + Ellipsis(h()) + Ellipsis(i()...) +} + +func f() int +func g() int +func h() (int, int) +func i() []any + +-- @ellipsis/ellipsis/ellipsis.go -- +package ellipsis + +func Ellipsis() { //@codeaction("any", "any", "refactor.rewrite", ellipsis) +} + +func _() { + // TODO(rfindley): investigate the broken formatting resulting from these inlinings. + Ellipsis() + Ellipsis() + Ellipsis() + var _ []any = []any{1, f(), g()} + Ellipsis() + func(_ ...any) { + Ellipsis() + }(h()) + var _ []any = i() + Ellipsis() +} + +func f() int +func g() int +func h() (int, int) +func i() []any +-- ellipsis2/ellipsis2.go -- +package ellipsis2 + +func Ellipsis2(_, _ int, rest ...int) { //@codeaction("_", "_", "refactor.rewrite", ellipsis2) +} + +func _() { + Ellipsis2(1,2,3) + Ellipsis2(h()) + Ellipsis2(1,2, []int{3, 4}...) +} + +func h() (int, int) + +-- @ellipsis2/ellipsis2/ellipsis2.go -- +package ellipsis2 + +func Ellipsis2(_ int, rest ...int) { //@codeaction("_", "_", "refactor.rewrite", ellipsis2) +} + +func _() { + Ellipsis2(2, []int{3}...) + func(_, blank0 int, rest ...int) { + Ellipsis2(blank0, rest...) + }(h()) + Ellipsis2(2, []int{3, 4}...) +} + +func h() (int, int) +-- overlapping/overlapping.go -- +package overlapping + +func Overlapping(i int) int { //@codeactionerr(re"(i) int", re"(i) int", "refactor.rewrite", re"overlapping") + return 0 +} + +func _() { + x := Overlapping(Overlapping(0)) + _ = x +} + +-- effects/effects.go -- +package effects + +func effects(x, y int) int { //@codeaction("y", "y", "refactor.rewrite", effects) + return x +} + +func f() int +func g() int + +func _() { + effects(f(), g()) + effects(f(), g()) +} +-- @effects/effects/effects.go -- +package effects + +func effects(x int) int { //@codeaction("y", "y", "refactor.rewrite", effects) + return x +} + +func f() int +func g() int + +func _() { + var x, _ int = f(), g() + effects(x) + { + var x, _ int = f(), g() + effects(x) + } +} +-- recursive/recursive.go -- +package recursive + +func Recursive(x int) int { //@codeaction("x", "x", "refactor.rewrite", recursive) + return Recursive(1) +} + +-- @recursive/recursive/recursive.go -- +package recursive + +func Recursive() int { //@codeaction("x", "x", "refactor.rewrite", recursive) + return Recursive() +} diff --git a/gopls/internal/test/marker/testdata/stubmethods/basic.txt b/gopls/internal/test/marker/testdata/stubmethods/basic.txt index 95b515299a6..e4cfb6d05a0 100644 --- a/gopls/internal/test/marker/testdata/stubmethods/basic.txt +++ b/gopls/internal/test/marker/testdata/stubmethods/basic.txt @@ -1,4 +1,5 @@ This test exercises basic 'stub methods' functionality. +See basic_resolve.txt for the same test with resolve support. -- go.mod -- module example.com diff --git a/gopls/internal/test/marker/testdata/stubmethods/basic_resolve.txt b/gopls/internal/test/marker/testdata/stubmethods/basic_resolve.txt new file mode 100644 index 00000000000..183b7d526eb --- /dev/null +++ b/gopls/internal/test/marker/testdata/stubmethods/basic_resolve.txt @@ -0,0 +1,31 @@ +This test exercises basic 'stub methods' functionality, with resolve support. +See basic.txt for the same test without resolve support. + +-- capabilities.json -- +{ + "textDocument": { + "codeAction": { + "dataSupport": true, + "resolveSupport": { + "properties": ["edit"] + } + } + } +} +-- go.mod -- +module example.com +go 1.12 + +-- a/a.go -- +package a + +type C int + +var _ error = C(0) //@suggestedfix(re"C.0.", re"missing method Error", stub) +-- @stub/a/a.go -- +@@ -5 +5,5 @@ ++// Error implements error. ++func (c C) Error() string { ++ panic("unimplemented") ++} ++ From 470afdaa827cbf5fdf10ee2d9356347f2f7aa58c Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 15 Dec 2023 15:08:23 -0500 Subject: [PATCH 020/105] gopls/internal/analysis/unusedparams: eliminate false positives This change is a substantial rewrite of the unusedparams analyzer designed to eliminate essentially all false positives, based on the rule that unless we can see all uses of a function, we can't tell whether it is safe to alter its signature. The new algorithm computes the set of address-taken functions, that is, functions that are referenced other than in the CallExpr.Fun position of a function call. For soundness we must assume that such values may be required to conform to some func type, so we cannot alter their signature. Exported functions and methods must also be treated conservatively, as they may be address-taken in another package. And unexported methods are ignored if they match the name of an interface method declared in the same package, since they may be required to conform to it. Anonymous functions that are immediately assigned to a var are treated like named functions, with the var symbol standing for the function name. Since the false positive rate is now close to zero, this change also enables the analyzer by default in gopls. Number of findings: Repo Before After Comments x/tools 86 26 100% true positives k8s 2457 1987 Only 14% are in non-generated files, and of those, all that I sampled were true positives. Updates golang/go#64753 Change-Id: I35dfc116a97bb5e98a2b098047fce176f2c1a9d6 Reviewed-on: https://go-review.googlesource.com/c/tools/+/550355 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/doc/analyzers.md | 26 +- gopls/doc/settings.md | 2 +- .../analysis/unusedparams/cmd/main.go | 2 +- gopls/internal/analysis/unusedparams/doc.go | 24 +- .../analysis/unusedparams/testdata/src/a/a.go | 44 ++- .../unusedparams/testdata/src/a/a.go.golden | 44 ++- .../testdata/src/typeparams/typeparams.go | 12 +- .../src/typeparams/typeparams.go.golden | 12 +- .../analysis/unusedparams/unusedparams.go | 360 ++++++++++++------ gopls/internal/lsp/cache/errors.go | 5 + gopls/internal/lsp/source/fix.go | 2 +- gopls/internal/server/code_action.go | 3 + gopls/internal/settings/api_json.go | 13 +- gopls/internal/settings/settings.go | 7 +- .../testdata/codeaction/removeparam.txt | 4 +- .../test/marker/testdata/codelens/test.txt | 3 +- .../marker/testdata/rename/issue42134.txt | 4 +- gopls/internal/util/slices/slices.go | 15 + 18 files changed, 418 insertions(+), 164 deletions(-) diff --git a/gopls/doc/analyzers.md b/gopls/doc/analyzers.md index 51eec8a90dc..7c6c58e4bf8 100644 --- a/gopls/doc/analyzers.md +++ b/gopls/doc/analyzers.md @@ -763,15 +763,29 @@ unusedparams: check for unused parameters of functions The unusedparams analyzer checks functions to see if there are any parameters that are not being used. -To reduce false positives it ignores: -- methods -- parameters that do not have a name or have the name '_' (the blank identifier) -- functions in test files -- functions with empty bodies or those with just a return stmt +To ensure soundness, it ignores: + - "address-taken" functions, that is, functions that are used as + a value rather than being called directly; their signatures may + be required to conform to a func type. + - exported functions or methods, since they may be address-taken + in another package. + - unexported methods whose name matches an interface method + declared in the same package, since the method's signature + may be required to conform to the interface type. + - functions with empty bodies, or containing just a call to panic. + - parameters that are unnamed, or named "_", the blank identifier. + +The analyzer suggests a fix of replacing the parameter name by "_", +but in such cases a deeper fix can be obtained by invoking the +"Refactor: remove unused parameter" code action, which will +eliminate the parameter entirely, along with all corresponding +arguments at call sites, while taking care to preserve any side +effects in the argument expressions; see +https://github.com/golang/tools/releases/tag/gopls%2Fv0.14. [Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams) -**Disabled by default. Enable it by setting `"analyses": {"unusedparams": true}`.** +**Enabled by default.** ## **unusedresult** diff --git a/gopls/doc/settings.md b/gopls/doc/settings.md index d6ec1df356b..6ea7b185b61 100644 --- a/gopls/doc/settings.md +++ b/gopls/doc/settings.md @@ -286,7 +286,7 @@ Example Usage: ... "analyses": { "unreachable": false, // Disable the unreachable analyzer. - "unusedparams": true // Enable the unusedparams analyzer. + "unusedvariable": true // Enable the unusedvariable analyzer. } ... ``` diff --git a/gopls/internal/analysis/unusedparams/cmd/main.go b/gopls/internal/analysis/unusedparams/cmd/main.go index 2355e3c4b52..2f35fb06083 100644 --- a/gopls/internal/analysis/unusedparams/cmd/main.go +++ b/gopls/internal/analysis/unusedparams/cmd/main.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// The stringintconv command runs the stringintconv analyzer. +// The unusedparams command runs the unusedparams analyzer. package main import ( diff --git a/gopls/internal/analysis/unusedparams/doc.go b/gopls/internal/analysis/unusedparams/doc.go index 2bf9fa96cf3..07e43c0d084 100644 --- a/gopls/internal/analysis/unusedparams/doc.go +++ b/gopls/internal/analysis/unusedparams/doc.go @@ -12,9 +12,23 @@ // The unusedparams analyzer checks functions to see if there are // any parameters that are not being used. // -// To reduce false positives it ignores: -// - methods -// - parameters that do not have a name or have the name '_' (the blank identifier) -// - functions in test files -// - functions with empty bodies or those with just a return stmt +// To ensure soundness, it ignores: +// - "address-taken" functions, that is, functions that are used as +// a value rather than being called directly; their signatures may +// be required to conform to a func type. +// - exported functions or methods, since they may be address-taken +// in another package. +// - unexported methods whose name matches an interface method +// declared in the same package, since the method's signature +// may be required to conform to the interface type. +// - functions with empty bodies, or containing just a call to panic. +// - parameters that are unnamed, or named "_", the blank identifier. +// +// The analyzer suggests a fix of replacing the parameter name by "_", +// but in such cases a deeper fix can be obtained by invoking the +// "Refactor: remove unused parameter" code action, which will +// eliminate the parameter entirely, along with all corresponding +// arguments at call sites, while taking care to preserve any side +// effects in the argument expressions; see +// https://github.com/golang/tools/releases/tag/gopls%2Fv0.14. package unusedparams diff --git a/gopls/internal/analysis/unusedparams/testdata/src/a/a.go b/gopls/internal/analysis/unusedparams/testdata/src/a/a.go index 23e4122c4cc..3661e1f3cbe 100644 --- a/gopls/internal/analysis/unusedparams/testdata/src/a/a.go +++ b/gopls/internal/analysis/unusedparams/testdata/src/a/a.go @@ -24,28 +24,28 @@ func (y *yuh) n(f bool) { } } -func a(i1 int, i2 int, i3 int) int { // want "potentially unused parameter: 'i2'" +func a(i1 int, i2 int, i3 int) int { // want "unused parameter: i2" i3 += i1 - _ = func(z int) int { // want "potentially unused parameter: 'z'" + _ = func(z int) int { // want "unused parameter: z" _ = 1 return 1 } return i3 } -func b(c bytes.Buffer) { // want "potentially unused parameter: 'c'" +func b(c bytes.Buffer) { // want "unused parameter: c" _ = 1 } -func z(h http.ResponseWriter, _ *http.Request) { // want "potentially unused parameter: 'h'" +func z(h http.ResponseWriter, _ *http.Request) { // no report: func z is address-taken fmt.Println("Before") } -func l(h http.Handler) http.Handler { +func l(h http.Handler) http.Handler { // want "unused parameter: h" return http.HandlerFunc(z) } -func mult(a, b int) int { // want "potentially unused parameter: 'b'" +func mult(a, b int) int { // want "unused parameter: b" a += 1 return a } @@ -53,3 +53,35 @@ func mult(a, b int) int { // want "potentially unused parameter: 'b'" func y(a int) { panic("yo") } + +var _ = func(x int) {} // empty body: no diagnostic + +var _ = func(x int) { println() } // want "unused parameter: x" + +var ( + calledGlobal = func(x int) { println() } // want "unused parameter: x" + addressTakenGlobal = func(x int) { println() } // no report: function is address-taken +) + +func _() { + calledGlobal(1) + println(addressTakenGlobal) +} + +func Exported(unused int) {} // no finding: an exported function may be address-taken + +type T int + +func (T) m(f bool) { println() } // want "unused parameter: f" +func (T) n(f bool) { println() } // no finding: n may match the interface method parent.n + +func _() { + var fib func(x, y int) int + fib = func(x, y int) int { // want "unused parameter: y" + if x < 2 { + return x + } + return fib(x-1, 123) + fib(x-2, 456) + } + fib(10, 42) +} diff --git a/gopls/internal/analysis/unusedparams/testdata/src/a/a.go.golden b/gopls/internal/analysis/unusedparams/testdata/src/a/a.go.golden index e28a6bdeabe..dea8a6d44ae 100644 --- a/gopls/internal/analysis/unusedparams/testdata/src/a/a.go.golden +++ b/gopls/internal/analysis/unusedparams/testdata/src/a/a.go.golden @@ -24,28 +24,28 @@ func (y *yuh) n(f bool) { } } -func a(i1 int, _ int, i3 int) int { // want "potentially unused parameter: 'i2'" +func a(i1 int, _ int, i3 int) int { // want "unused parameter: i2" i3 += i1 - _ = func(_ int) int { // want "potentially unused parameter: 'z'" + _ = func(_ int) int { // want "unused parameter: z" _ = 1 return 1 } return i3 } -func b(_ bytes.Buffer) { // want "potentially unused parameter: 'c'" +func b(_ bytes.Buffer) { // want "unused parameter: c" _ = 1 } -func z(_ http.ResponseWriter, _ *http.Request) { // want "potentially unused parameter: 'h'" +func z(h http.ResponseWriter, _ *http.Request) { // no report: func z is address-taken fmt.Println("Before") } -func l(h http.Handler) http.Handler { +func l(_ http.Handler) http.Handler { // want "unused parameter: h" return http.HandlerFunc(z) } -func mult(a, _ int) int { // want "potentially unused parameter: 'b'" +func mult(a, _ int) int { // want "unused parameter: b" a += 1 return a } @@ -53,3 +53,35 @@ func mult(a, _ int) int { // want "potentially unused parameter: 'b'" func y(a int) { panic("yo") } + +var _ = func(x int) {} // empty body: no diagnostic + +var _ = func(_ int) { println() } // want "unused parameter: x" + +var ( + calledGlobal = func(_ int) { println() } // want "unused parameter: x" + addressTakenGlobal = func(x int) { println() } // no report: function is address-taken +) + +func _() { + calledGlobal(1) + println(addressTakenGlobal) +} + +func Exported(unused int) {} // no finding: an exported function may be address-taken + +type T int + +func (T) m(_ bool) { println() } // want "unused parameter: f" +func (T) n(f bool) { println() } // no finding: n may match the interface method parent.n + +func _() { + var fib func(x, y int) int + fib = func(x, _ int) int { // want "unused parameter: y" + if x < 2 { + return x + } + return fib(x-1, 123) + fib(x-2, 456) + } + fib(10, 42) +} diff --git a/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go b/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go index 93af2681b94..d89926a7db5 100644 --- a/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go +++ b/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go @@ -24,28 +24,28 @@ func (y *yuh[int]) n(f bool) { } } -func a[T comparable](i1 int, i2 T, i3 int) int { // want "potentially unused parameter: 'i2'" +func a[T comparable](i1 int, i2 T, i3 int) int { // want "unused parameter: i2" i3 += i1 - _ = func(z int) int { // want "potentially unused parameter: 'z'" + _ = func(z int) int { // want "unused parameter: z" _ = 1 return 1 } return i3 } -func b[T any](c bytes.Buffer) { // want "potentially unused parameter: 'c'" +func b[T any](c bytes.Buffer) { // want "unused parameter: c" _ = 1 } -func z[T http.ResponseWriter](h T, _ *http.Request) { // want "potentially unused parameter: 'h'" +func z[T http.ResponseWriter](h T, _ *http.Request) { // no report: func z is address-taken fmt.Println("Before") } -func l(h http.Handler) http.Handler { +func l(h http.Handler) http.Handler { // want "unused parameter: h" return http.HandlerFunc(z[http.ResponseWriter]) } -func mult(a, b int) int { // want "potentially unused parameter: 'b'" +func mult(a, b int) int { // want "unused parameter: b" a += 1 return a } diff --git a/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go.golden b/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go.golden index c86bf289a3e..85479bc8b50 100644 --- a/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go.golden +++ b/gopls/internal/analysis/unusedparams/testdata/src/typeparams/typeparams.go.golden @@ -24,28 +24,28 @@ func (y *yuh[int]) n(f bool) { } } -func a[T comparable](i1 int, _ T, i3 int) int { // want "potentially unused parameter: 'i2'" +func a[T comparable](i1 int, _ T, i3 int) int { // want "unused parameter: i2" i3 += i1 - _ = func(_ int) int { // want "potentially unused parameter: 'z'" + _ = func(_ int) int { // want "unused parameter: z" _ = 1 return 1 } return i3 } -func b[T any](_ bytes.Buffer) { // want "potentially unused parameter: 'c'" +func b[T any](_ bytes.Buffer) { // want "unused parameter: c" _ = 1 } -func z[T http.ResponseWriter](_ T, _ *http.Request) { // want "potentially unused parameter: 'h'" +func z[T http.ResponseWriter](h T, _ *http.Request) { // no report: func z is address-taken fmt.Println("Before") } -func l(h http.Handler) http.Handler { +func l(_ http.Handler) http.Handler { // want "unused parameter: h" return http.HandlerFunc(z[http.ResponseWriter]) } -func mult(a, _ int) int { // want "potentially unused parameter: 'b'" +func mult(a, _ int) int { // want "unused parameter: b" a += 1 return a } diff --git a/gopls/internal/analysis/unusedparams/unusedparams.go b/gopls/internal/analysis/unusedparams/unusedparams.go index 076acf79db6..6f212b0ec1a 100644 --- a/gopls/internal/analysis/unusedparams/unusedparams.go +++ b/gopls/internal/analysis/unusedparams/unusedparams.go @@ -9,151 +9,289 @@ import ( "fmt" "go/ast" "go/types" - "strings" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/analysisinternal" ) //go:embed doc.go var doc string -var ( - Analyzer = &analysis.Analyzer{ - Name: "unusedparams", - Doc: analysisinternal.MustExtractDoc(doc, "unusedparams"), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Run: run, - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams", - } - inspectLits bool - inspectWrappers bool -) - -func init() { - Analyzer.Flags.BoolVar(&inspectLits, "lits", true, "inspect function literals") - Analyzer.Flags.BoolVar(&inspectWrappers, "wrappers", false, "inspect functions whose body consists of a single return statement") +var Analyzer = &analysis.Analyzer{ + Name: "unusedparams", + Doc: analysisinternal.MustExtractDoc(doc, "unusedparams"), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Run: run, + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams", } -type paramData struct { - field *ast.Field - ident *ast.Ident - typObj types.Object -} - -func run(pass *analysis.Pass) (interface{}, error) { +func run(pass *analysis.Pass) (any, error) { inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) - nodeFilter := []ast.Node{ - (*ast.FuncDecl)(nil), - } - if inspectLits { - nodeFilter = append(nodeFilter, (*ast.FuncLit)(nil)) - } - inspect.Preorder(nodeFilter, func(n ast.Node) { - var fieldList *ast.FieldList - var body *ast.BlockStmt + // First find all "address-taken" functions. + // We must conservatively assume that their parameters + // are all required to conform to some signature. + // + // A named function is address-taken if it is somewhere + // used not in call position: + // + // f(...) // not address-taken + // use(f) // address-taken + // + // A literal function is address-taken if it is not + // immediately bound to a variable, or if that variable is + // used not in call position: + // + // f := func() { ... }; f() used only in call position + // var f func(); f = func() { ...f()... }; f() ditto + // use(func() { ... }) address-taken + // - // Get the fieldList and body from the function node. - switch f := n.(type) { - case *ast.FuncDecl: - fieldList, body = f.Type.Params, f.Body - // TODO(golang/go#36602): add better handling for methods, if we enable methods - // we will get false positives if a struct is potentially implementing - // an interface. - if f.Recv != nil { - return + // Gather global information: + // - uses of functions not in call position + // - unexported interface methods + // - all referenced variables + + usesOutsideCall := make(map[types.Object][]*ast.Ident) + unexportedIMethodNames := make(map[string]bool) + { + callPosn := make(map[*ast.Ident]bool) // all idents f appearing in f() calls + filter := []ast.Node{ + (*ast.CallExpr)(nil), + (*ast.InterfaceType)(nil), + } + inspect.Preorder(filter, func(n ast.Node) { + switch n := n.(type) { + case *ast.CallExpr: + // Strip off any generic instantiation. + fun := n.Fun + switch fun_ := fun.(type) { + case *ast.IndexExpr: + fun = fun_.X // f[T]() (funcs[i]() is rejected below) + case *ast.IndexListExpr: + fun = fun_.X // f[K, V]() + } + + // Find object: + // record non-exported function, method, or func-typed var. + var id *ast.Ident + switch fun := fun.(type) { + case *ast.Ident: + id = fun + case *ast.SelectorExpr: + id = fun.Sel + } + if id != nil && !id.IsExported() { + switch pass.TypesInfo.Uses[id].(type) { + case *types.Func, *types.Var: + callPosn[id] = true + } + } + + case *ast.InterfaceType: + // Record the set of names of unexported interface methods. + // (It would be more precise to record signatures but + // generics makes it tricky, and this conservative + // heuristic is close enough.) + t := pass.TypesInfo.TypeOf(n).(*types.Interface) + for i := 0; i < t.NumExplicitMethods(); i++ { + m := t.ExplicitMethod(i) + if !m.Exported() && m.Name() != "_" { + unexportedIMethodNames[m.Name()] = true + } + } } + }) - // Ignore functions in _test.go files to reduce false positives. - if file := pass.Fset.File(n.Pos()); file != nil && strings.HasSuffix(file.Name(), "_test.go") { - return + for id, obj := range pass.TypesInfo.Uses { + if !callPosn[id] { + // This includes "f = func() {...}", which we deal with below. + usesOutsideCall[obj] = append(usesOutsideCall[obj], id) } - case *ast.FuncLit: - fieldList, body = f.Type.Params, f.Body } - // If there are no arguments or the function is empty, then return. - if fieldList.NumFields() == 0 || body == nil || len(body.List) == 0 { - return + } + + // Find all vars (notably parameters) that are used. + usedVars := make(map[*types.Var]bool) + for _, obj := range pass.TypesInfo.Uses { + if v, ok := obj.(*types.Var); ok { + if v.IsField() { + continue // no point gathering these + } + usedVars[v] = true + } + } + + // Check each non-address-taken function's parameters are all used. + filter := []ast.Node{ + (*ast.FuncDecl)(nil), + (*ast.FuncLit)(nil), + } + inspect.WithStack(filter, func(n ast.Node, push bool, stack []ast.Node) bool { + // (We always return true so that we visit nested FuncLits.) + + if !push { + return true } - switch expr := body.List[0].(type) { - case *ast.ReturnStmt: - if !inspectWrappers { - // Ignore functions that only contain a return statement to reduce false positives. - return + var ( + fn types.Object // function symbol (*Func, possibly *Var for a FuncLit) + ftype *ast.FuncType + body *ast.BlockStmt + ) + switch n := n.(type) { + case *ast.FuncDecl: + // We can't analyze non-Go functions. + if n.Body == nil { + return true } - case *ast.ExprStmt: - callExpr, ok := expr.X.(*ast.CallExpr) - if !ok || len(body.List) > 1 { - break + + // Ignore exported functions and methods: we + // must assume they may be address-taken in + // another package. + if n.Name.IsExported() { + return true } - // Ignore functions that only contain a panic statement to reduce false positives. - if fun, ok := callExpr.Fun.(*ast.Ident); ok && fun.Name == "panic" { - return + + // Ignore methods that match the name of any + // interface method declared in this package, + // as the method's signature may need to conform + // to the interface. + if n.Recv != nil && unexportedIMethodNames[n.Name.Name] { + return true } - } - // Get the useful data from each field. - params := make(map[string]*paramData) - unused := make(map[*paramData]bool) - for _, f := range fieldList.List { - for _, i := range f.Names { - if i.Name == "_" { - continue + fn = pass.TypesInfo.Defs[n.Name].(*types.Func) + ftype, body = n.Type, n.Body + + case *ast.FuncLit: + // Find the symbol for the variable (if any) + // to which the FuncLit is bound. + // (We don't bother to allow ParenExprs.) + switch parent := stack[len(stack)-2].(type) { + case *ast.AssignStmt: + // f = func() {...} + // f := func() {...} + for i, rhs := range parent.Rhs { + if rhs == n { + if id, ok := parent.Lhs[i].(*ast.Ident); ok { + fn = pass.TypesInfo.ObjectOf(id) + + // Edge case: f = func() {...} + // should not count as a use. + if pass.TypesInfo.Uses[id] != nil { + usesOutsideCall[fn] = slices.Remove(usesOutsideCall[fn], id) + } + + if fn == nil && id.Name == "_" { + // Edge case: _ = func() {...} + // has no var. Fake one. + fn = types.NewVar(id.Pos(), pass.Pkg, id.Name, pass.TypesInfo.TypeOf(n)) + } + } + break + } } - params[i.Name] = ¶mData{ - field: f, - ident: i, - typObj: pass.TypesInfo.ObjectOf(i), + + case *ast.ValueSpec: + // var f = func() { ... } + // (unless f is an exported package-level var) + for i, val := range parent.Values { + if val == n { + v := pass.TypesInfo.Defs[parent.Names[i]] + if !(v.Parent() == pass.Pkg.Scope() && v.Exported()) { + fn = v + } + break + } } - unused[params[i.Name]] = true } + + ftype, body = n.Type, n.Body } - // Traverse through the body of the function and - // check to see which parameters are unused. - ast.Inspect(body, func(node ast.Node) bool { - n, ok := node.(*ast.Ident) - if !ok { - return true - } - param, ok := params[n.Name] - if !ok { - return false - } - if nObj := pass.TypesInfo.ObjectOf(n); nObj != param.typObj { - return false + // Ignore address-taken functions and methods: unused + // parameters may be needed to conform to a func type. + if fn == nil || len(usesOutsideCall[fn]) > 0 { + return true + } + + // If there are no parameters, there are no unused parameters. + if ftype.Params.NumFields() == 0 { + return true + } + + // To reduce false positives, ignore functions with an + // empty or panic body. + // + // We choose not to ignore functions whose body is a + // single return statement (as earlier versions did) + // func f() { return } + // func f() { return g(...) } + // as we suspect that was just heuristic to reduce + // false positives in the earlier unsound algorithm. + switch len(body.List) { + case 0: + // Empty body. Although the parameter is + // unnecessary, it's pretty obvious to the + // reader that that's the case, so we allow it. + return true // func f() {} + case 1: + if stmt, ok := body.List[0].(*ast.ExprStmt); ok { + // We allow a panic body, as it is often a + // placeholder for a future implementation: + // func f() { panic(...) } + if call, ok := stmt.X.(*ast.CallExpr); ok { + if fun, ok := call.Fun.(*ast.Ident); ok && fun.Name == "panic" { + return true + } + } } - delete(unused, param) - return false - }) + } - // Create the reports for the unused parameters. - for u := range unused { - start, end := u.field.Pos(), u.field.End() - if len(u.field.Names) > 1 { - start, end = u.ident.Pos(), u.ident.End() + // Report each unused parameter. + for _, field := range ftype.Params.List { + for _, id := range field.Names { + if id.Name == "_" { + continue + } + param := pass.TypesInfo.Defs[id].(*types.Var) + if !usedVars[param] { + start, end := field.Pos(), field.End() + if len(field.Names) > 1 { + start, end = id.Pos(), id.End() + } + // This diagnostic carries an edit-based fix to + // rename the parameter. Gopls's settings + // associate this analyzer with a command-based fix + // (RemoveUnusedParam, implemented by + // source.RemoveUnusedParameter), so the user + // will see a second Code Action offering to + // "Remove unused parameter x" (although currently + // the fix title is actually that of the diagnostic, + // i.e. "unused parameter: x", which is a poor UX. + // We should fix that bug in cache.toSourceDiagnostic). + pass.Report(analysis.Diagnostic{ + Pos: start, + End: end, + Message: fmt.Sprintf("unused parameter: %s", id.Name), + SuggestedFixes: []analysis.SuggestedFix{{ + Message: `Rename parameter to "_"`, + TextEdits: []analysis.TextEdit{{ + Pos: id.Pos(), + End: id.End(), + NewText: []byte("_"), + }}, + }}, + }) + } } - // TODO(golang/go#36602): Add suggested fixes to automatically - // remove the unused parameter from every use of this - // function. - pass.Report(analysis.Diagnostic{ - Pos: start, - End: end, - Message: fmt.Sprintf("potentially unused parameter: '%s'", u.ident.Name), - SuggestedFixes: []analysis.SuggestedFix{{ - Message: `Replace with "_"`, - TextEdits: []analysis.TextEdit{{ - Pos: u.ident.Pos(), - End: u.ident.End(), - NewText: []byte("_"), - }}, - }}, - }) } + + return true }) return nil, nil } diff --git a/gopls/internal/lsp/cache/errors.go b/gopls/internal/lsp/cache/errors.go index ded226e4a07..f81c32598a7 100644 --- a/gopls/internal/lsp/cache/errors.go +++ b/gopls/internal/lsp/cache/errors.go @@ -312,6 +312,11 @@ func toSourceDiagnostic(srcAnalyzer *settings.Analyzer, gobDiag *gobDiagnostic) // Accumulate command-based fixes computed on demand by // (logic adjacent to) the analyzer. if srcAnalyzer.Fix != "" { + // TODO(adonovan): this causes the fix to have the same title + // as the problem it fixes, which is confusing. For example, + // the fix for a diagnostic "unused parameter: x" should be + // titled "Remove parameter x". (The edit-based fixes above + // have sensible names provided by the originating analyzer.) cmd, err := command.NewApplyFixCommand(gobDiag.Message, command.ApplyFixArgs{ URI: gobDiag.Location.URI, Range: gobDiag.Location.Range, diff --git a/gopls/internal/lsp/source/fix.go b/gopls/internal/lsp/source/fix.go index 74703cf8d0a..e8606afd9ce 100644 --- a/gopls/internal/lsp/source/fix.go +++ b/gopls/internal/lsp/source/fix.go @@ -93,7 +93,7 @@ func ApplyFix(ctx context.Context, fix settings.Fix, snapshot *cache.Snapshot, f return suggestedFixToEdits(ctx, snapshot, fixFset, suggestion) } -// suggestedFixToEdits converts the suggestion's edits from analysis form into protocol form, +// suggestedFixToEdits converts the suggestion's edits from analysis form into protocol form. func suggestedFixToEdits(ctx context.Context, snapshot *cache.Snapshot, fset *token.FileSet, suggestion *analysis.SuggestedFix) ([]protocol.TextDocumentEdit, error) { editsPerFile := map[protocol.DocumentURI]*protocol.TextDocumentEdit{} for _, edit := range suggestion.TextEdits { diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 15911280c05..9c6777f351a 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -602,6 +602,9 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P // This is true if: // - [start, end) is contained within an unused field or parameter name // - ... of a non-method function declaration. +// +// (Note that the unusedparam analyzer also computes this property, but +// much more precisely, allowing it to report its findings as diagnostics.) func canRemoveParameter(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.Range) bool { info, err := source.FindParam(pgf, rng) if err != nil { diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index 808df6d6a15..be02148ca13 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -214,7 +214,7 @@ var GeneratedAPIJSON = &APIJSON{ { Name: "analyses", Type: "map[string]bool", - Doc: "analyses specify analyses that the user would like to enable or disable.\nA map of the names of analysis passes that should be enabled/disabled.\nA full list of analyzers that gopls uses can be found in\n[analyzers.md](https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md).\n\nExample Usage:\n\n```json5\n...\n\"analyses\": {\n \"unreachable\": false, // Disable the unreachable analyzer.\n \"unusedparams\": true // Enable the unusedparams analyzer.\n}\n...\n```\n", + Doc: "analyses specify analyses that the user would like to enable or disable.\nA map of the names of analysis passes that should be enabled/disabled.\nA full list of analyzers that gopls uses can be found in\n[analyzers.md](https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md).\n\nExample Usage:\n\n```json5\n...\n\"analyses\": {\n \"unreachable\": false, // Disable the unreachable analyzer.\n \"unusedvariable\": true // Enable the unusedvariable analyzer.\n}\n...\n```\n", EnumKeys: EnumKeys{ ValueType: "bool", Keys: []EnumKey{ @@ -420,8 +420,8 @@ var GeneratedAPIJSON = &APIJSON{ }, { Name: "\"unusedparams\"", - Doc: "check for unused parameters of functions\n\nThe unusedparams analyzer checks functions to see if there are\nany parameters that are not being used.\n\nTo reduce false positives it ignores:\n- methods\n- parameters that do not have a name or have the name '_' (the blank identifier)\n- functions in test files\n- functions with empty bodies or those with just a return stmt", - Default: "false", + Doc: "check for unused parameters of functions\n\nThe unusedparams analyzer checks functions to see if there are\nany parameters that are not being used.\n\nTo ensure soundness, it ignores:\n - \"address-taken\" functions, that is, functions that are used as\n a value rather than being called directly; their signatures may\n be required to conform to a func type.\n - exported functions or methods, since they may be address-taken\n in another package.\n - unexported methods whose name matches an interface method\n declared in the same package, since the method's signature\n may be required to conform to the interface type.\n - functions with empty bodies, or containing just a call to panic.\n - parameters that are unnamed, or named \"_\", the blank identifier.\n\nThe analyzer suggests a fix of replacing the parameter name by \"_\",\nbut in such cases a deeper fix can be obtained by invoking the\n\"Refactor: remove unused parameter\" code action, which will\neliminate the parameter entirely, along with all corresponding\narguments at call sites, while taking care to preserve any side\neffects in the argument expressions; see\nhttps://github.com/golang/tools/releases/tag/gopls%2Fv0.14.", + Default: "true", }, { Name: "\"unusedresult\"", @@ -1209,9 +1209,10 @@ var GeneratedAPIJSON = &APIJSON{ Default: true, }, { - Name: "unusedparams", - Doc: "check for unused parameters of functions\n\nThe unusedparams analyzer checks functions to see if there are\nany parameters that are not being used.\n\nTo reduce false positives it ignores:\n- methods\n- parameters that do not have a name or have the name '_' (the blank identifier)\n- functions in test files\n- functions with empty bodies or those with just a return stmt", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams", + Name: "unusedparams", + Doc: "check for unused parameters of functions\n\nThe unusedparams analyzer checks functions to see if there are\nany parameters that are not being used.\n\nTo ensure soundness, it ignores:\n - \"address-taken\" functions, that is, functions that are used as\n a value rather than being called directly; their signatures may\n be required to conform to a func type.\n - exported functions or methods, since they may be address-taken\n in another package.\n - unexported methods whose name matches an interface method\n declared in the same package, since the method's signature\n may be required to conform to the interface type.\n - functions with empty bodies, or containing just a call to panic.\n - parameters that are unnamed, or named \"_\", the blank identifier.\n\nThe analyzer suggests a fix of replacing the parameter name by \"_\",\nbut in such cases a deeper fix can be obtained by invoking the\n\"Refactor: remove unused parameter\" code action, which will\neliminate the parameter entirely, along with all corresponding\narguments at call sites, while taking care to preserve any side\neffects in the argument expressions; see\nhttps://github.com/golang/tools/releases/tag/gopls%2Fv0.14.", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams", + Default: true, }, { Name: "unusedresult", diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 2bf4e5051bf..a41a3bfe9f6 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -327,7 +327,7 @@ type DiagnosticOptions struct { // ... // "analyses": { // "unreachable": false, // Disable the unreachable analyzer. - // "unusedparams": true // Enable the unusedparams analyzer. + // "unusedvariable": true // Enable the unusedvariable analyzer. // } // ... // ``` @@ -828,9 +828,6 @@ func (o *Options) enableAllExperimentMaps() { if _, ok := o.Codelenses[string(command.RunGovulncheck)]; !ok { o.Codelenses[string(command.RunGovulncheck)] = true } - if _, ok := o.Analyses[unusedparams.Analyzer.Name]; !ok { - o.Analyses[unusedparams.Analyzer.Name] = true - } if _, ok := o.Analyses[unusedvariable.Analyzer.Name]; !ok { o.Analyses[unusedvariable.Analyzer.Name] = true } @@ -1475,7 +1472,7 @@ func defaultAnalyzers() map[string]*Analyzer { shadow.Analyzer.Name: {Analyzer: shadow.Analyzer, Enabled: false}, sortslice.Analyzer.Name: {Analyzer: sortslice.Analyzer, Enabled: true}, testinggoroutine.Analyzer.Name: {Analyzer: testinggoroutine.Analyzer, Enabled: true}, - unusedparams.Analyzer.Name: {Analyzer: unusedparams.Analyzer, Enabled: false}, + unusedparams.Analyzer.Name: {Analyzer: unusedparams.Analyzer, Enabled: true}, unusedwrite.Analyzer.Name: {Analyzer: unusedwrite.Analyzer, Enabled: false}, useany.Analyzer.Name: {Analyzer: useany.Analyzer, Enabled: false}, timeformat.Analyzer.Name: {Analyzer: timeformat.Analyzer, Enabled: true}, diff --git a/gopls/internal/test/marker/testdata/codeaction/removeparam.txt b/gopls/internal/test/marker/testdata/codeaction/removeparam.txt index a5ce7ca2e43..17a058f2b82 100644 --- a/gopls/internal/test/marker/testdata/codeaction/removeparam.txt +++ b/gopls/internal/test/marker/testdata/codeaction/removeparam.txt @@ -203,7 +203,7 @@ func _() { -- effects/effects.go -- package effects -func effects(x, y int) int { //@codeaction("y", "y", "refactor.rewrite", effects) +func effects(x, y int) int { //@ diag("y", re"unused"), codeaction("y", "y", "refactor.rewrite", effects) return x } @@ -217,7 +217,7 @@ func _() { -- @effects/effects/effects.go -- package effects -func effects(x int) int { //@codeaction("y", "y", "refactor.rewrite", effects) +func effects(x int) int { //@ diag("y", re"unused"), codeaction("y", "y", "refactor.rewrite", effects) return x } diff --git a/gopls/internal/test/marker/testdata/codelens/test.txt b/gopls/internal/test/marker/testdata/codelens/test.txt index 90782bddef9..ba68cf019df 100644 --- a/gopls/internal/test/marker/testdata/codelens/test.txt +++ b/gopls/internal/test/marker/testdata/codelens/test.txt @@ -22,7 +22,8 @@ func TestMain(m *testing.M) {} // no code lens for TestMain func TestFuncWithCodeLens(t *testing.T) { //@codelens(re"()func", "run test") } -func thisShouldNotHaveACodeLens(t *testing.T) { +func thisShouldNotHaveACodeLens(t *testing.T) { //@diag("t ", re"unused parameter") + println() // nonempty body => "unused parameter" } func BenchmarkFuncWithCodeLens(b *testing.B) { //@codelens(re"()func", "run benchmark") diff --git a/gopls/internal/test/marker/testdata/rename/issue42134.txt b/gopls/internal/test/marker/testdata/rename/issue42134.txt index 6a83762d87c..05fee50bed9 100644 --- a/gopls/internal/test/marker/testdata/rename/issue42134.txt +++ b/gopls/internal/test/marker/testdata/rename/issue42134.txt @@ -1,3 +1,5 @@ +Regression test for #42134, +"rename fails to update doc comment for local variable of function type" -- 1.go -- package issue42134 @@ -29,7 +31,7 @@ func _() { fmt.Println(minNumber) //@rename("minNumber", "res", minNumberTores) } -func min(a, b int) int { return a } +func min(a, b int) int { return a + b } -- @minNumberTores/2.go -- @@ -6 +6 @@ - // minNumber is a min number. diff --git a/gopls/internal/util/slices/slices.go b/gopls/internal/util/slices/slices.go index db53e1d3ff6..73d5b51e0dc 100644 --- a/gopls/internal/util/slices/slices.go +++ b/gopls/internal/util/slices/slices.go @@ -65,3 +65,18 @@ func Grow[S ~[]E, E any](s S, n int) S { } return s } + +// Remove removes all values equal to elem from slice. +// +// The closest equivalent in the standard slices package is: +// +// DeleteFunc(func(x T) bool { return x == elem }) +func Remove[T comparable](slice []T, elem T) []T { + out := slice[:0] + for _, v := range slice { + if v != elem { + out = append(out, v) + } + } + return out +} From 72a36a7889ea58c2036f26062f806ab4b5c2f1d8 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Thu, 18 Jan 2024 15:31:17 -0500 Subject: [PATCH 021/105] gopls/internal/test/marker: fix test breakage due to semantic conflict Fix the semantic conflict of CL 550355 and CL 548276. Change-Id: I5bf92a228032bbbf8e64193794d3c42714758fa9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556835 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- .../test/marker/testdata/codeaction/removeparam_resolve.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt b/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt index 7b9296eb569..1c04aa047cf 100644 --- a/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt +++ b/gopls/internal/test/marker/testdata/codeaction/removeparam_resolve.txt @@ -214,7 +214,7 @@ func _() { -- effects/effects.go -- package effects -func effects(x, y int) int { //@codeaction("y", "y", "refactor.rewrite", effects) +func effects(x, y int) int { //@codeaction("y", "y", "refactor.rewrite", effects), diag("y", re"unused") return x } @@ -228,7 +228,7 @@ func _() { -- @effects/effects/effects.go -- package effects -func effects(x int) int { //@codeaction("y", "y", "refactor.rewrite", effects) +func effects(x int) int { //@codeaction("y", "y", "refactor.rewrite", effects), diag("y", re"unused") return x } From 3458e0c56d72ccdbd6fb7fe7351de376642478b0 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Thu, 18 Jan 2024 14:03:57 -0500 Subject: [PATCH 022/105] gopls/internal/lsp/source: fix Fix titles Previously, many diagnostics were produced with messages that were in fact the titles of suggested fixes (e.g. "Fill struct S"); conversely, many suggested fixes appeared in the client UI with a message that was in fact the text of the diagnostic it was supposed to fix (e.g. "undeclared name: x"). This change reorganizes the way suggested fixes are handled so that, for fixes produced by analyzers, the analyzer output (Diagnostic and SuggestedFix) determines the LSP output. An SuggestedFix with no edits is assumed to have fixer support in ApplyFix; the name of the fixer is determined by the Diagnostic's Category. (Ideally we would use SuggestedFix.Category in case a diagnostic has more than one lazy fix, but there's no such field.) Fixers whose commands are constructed directly by the Code Action method are essentially unchanged. There is still a need for some kind of framework for registering (analyzers, category, fixer) triples, but this is a first step. Fixes golang/go#65087 Change-Id: Id72f3fd187d42df9c3711f4d3be140f9ea7af1d7 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556755 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/doc/commands.md | 9 +- .../analysis/embeddirective/embeddirective.go | 39 +++++---- .../analysis/fillstruct/fillstruct.go | 15 +++- .../analysis/fillstruct/testdata/src/a/a.go | 31 ++++--- .../testdata/src/typeparams/typeparams.go | 12 +-- .../analysis/stubmethods/stubmethods.go | 15 +++- .../analysis/undeclaredname/undeclared.go | 16 +++- .../analysis/unusedparams/unusedparams.go | 44 +++++----- gopls/internal/lsp/cache/diagnostics.go | 2 +- gopls/internal/lsp/cache/errors.go | 80 +++++++++-------- gopls/internal/lsp/command/interface.go | 10 ++- gopls/internal/lsp/source/fix.go | 85 +++++++++++++----- gopls/internal/server/code_action.go | 86 +++++++++++-------- gopls/internal/server/command.go | 2 +- gopls/internal/settings/analyzer.go | 26 +----- gopls/internal/settings/api_json.go | 2 +- gopls/internal/settings/settings.go | 38 ++++---- 17 files changed, 300 insertions(+), 212 deletions(-) diff --git a/gopls/doc/commands.md b/gopls/doc/commands.md index e1eeff89e74..2b97ed1cc97 100644 --- a/gopls/doc/commands.md +++ b/gopls/doc/commands.md @@ -66,7 +66,14 @@ Args: ``` { - // The fix to apply. + // The name of the fix to apply. + // + // For fixes suggested by analyzers, this is a string constant + // advertised by the analyzer that matches the Category of + // the analysis.Diagnostic with a SuggestedFix containing no edits. + // + // For fixes suggested by code actions, this is a string agreed + // upon by the code action and source.ApplyFix. "Fix": string, // The file URI for the document to fix. "URI": string, diff --git a/gopls/internal/analysis/embeddirective/embeddirective.go b/gopls/internal/analysis/embeddirective/embeddirective.go index 20d3cbff5e4..2e415634338 100644 --- a/gopls/internal/analysis/embeddirective/embeddirective.go +++ b/gopls/internal/analysis/embeddirective/embeddirective.go @@ -26,9 +26,7 @@ var Analyzer = &analysis.Analyzer{ URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/embeddirective", } -// source.fixedByImportingEmbed relies on this message to filter -// out fixable diagnostics from this Analyzer. -const MissingImportMessage = `must import "embed" when using go:embed directives` +const FixCategory = "addembedimport" // recognized by gopls ApplyFix func run(pass *analysis.Pass) (interface{}, error) { for _, f := range pass.Files { @@ -46,28 +44,39 @@ func run(pass *analysis.Pass) (interface{}, error) { } for _, c := range comments { - report := func(msg string) { - pass.Report(analysis.Diagnostic{ - Pos: c.Pos(), - End: c.Pos() + token.Pos(len("//go:embed")), - Message: msg, - }) - } + pos, end := c.Pos(), c.Pos()+token.Pos(len("//go:embed")) if !hasEmbedImport { - report(MissingImportMessage) + pass.Report(analysis.Diagnostic{ + Pos: pos, + End: end, + Message: `must import "embed" when using go:embed directives`, + Category: FixCategory, + SuggestedFixes: []analysis.SuggestedFix{{ + Message: `Add missing "embed" import`, + // No TextEdits => computed by a gopls command. + }}, + }) } + var msg string spec := nextVarSpec(c, f) switch { case spec == nil: - report(`go:embed directives must precede a "var" declaration`) + msg = `go:embed directives must precede a "var" declaration` case len(spec.Names) != 1: - report("declarations following go:embed directives must define a single variable") + msg = "declarations following go:embed directives must define a single variable" case len(spec.Values) > 0: - report("declarations following go:embed directives must not specify a value") + msg = "declarations following go:embed directives must not specify a value" case !embeddableType(pass.TypesInfo.Defs[spec.Names[0]]): - report("declarations following go:embed directives must be of type string, []byte or embed.FS") + msg = "declarations following go:embed directives must be of type string, []byte or embed.FS" + } + if msg != "" { + pass.Report(analysis.Diagnostic{ + Pos: pos, + End: end, + Message: msg, + }) } } } diff --git a/gopls/internal/analysis/fillstruct/fillstruct.go b/gopls/internal/analysis/fillstruct/fillstruct.go index e2337a111c8..b66a685760e 100644 --- a/gopls/internal/analysis/fillstruct/fillstruct.go +++ b/gopls/internal/analysis/fillstruct/fillstruct.go @@ -130,18 +130,25 @@ func DiagnoseFillableStructs(inspect *inspector.Inspector, start, end token.Pos, if i < totalFields { fillableFields = append(fillableFields, "...") } - name = fmt.Sprintf("anonymous struct { %s }", strings.Join(fillableFields, ", ")) + name = fmt.Sprintf("anonymous struct{ %s }", strings.Join(fillableFields, ", ")) } diags = append(diags, analysis.Diagnostic{ - Message: fmt.Sprintf("Fill %s", name), - Pos: expr.Pos(), - End: expr.End(), + Message: fmt.Sprintf("%s literal has missing fields", name), + Pos: expr.Pos(), + End: expr.End(), + Category: FixCategory, + SuggestedFixes: []analysis.SuggestedFix{{ + Message: fmt.Sprintf("Fill %s", name), + // No TextEdits => computed later by gopls. + }}, }) }) return diags } +const FixCategory = "fillstruct" // recognized by gopls ApplyFix + // SuggestedFix computes the suggested fix for the kinds of // diagnostics produced by the Analyzer above. func SuggestedFix(fset *token.FileSet, start, end token.Pos, content []byte, file *ast.File, pkg *types.Package, info *types.Info) (*token.FileSet, *analysis.SuggestedFix, error) { diff --git a/gopls/internal/analysis/fillstruct/testdata/src/a/a.go b/gopls/internal/analysis/fillstruct/testdata/src/a/a.go index 9ee3860fcae..79c51d209c1 100644 --- a/gopls/internal/analysis/fillstruct/testdata/src/a/a.go +++ b/gopls/internal/analysis/fillstruct/testdata/src/a/a.go @@ -19,16 +19,16 @@ type basicStruct struct { foo int } -var _ = basicStruct{} // want `Fill basicStruct` +var _ = basicStruct{} // want `basicStruct literal has missing fields` type twoArgStruct struct { foo int bar string } -var _ = twoArgStruct{} // want `Fill twoArgStruct` +var _ = twoArgStruct{} // want `twoArgStruct literal has missing fields` -var _ = twoArgStruct{ // want `Fill twoArgStruct` +var _ = twoArgStruct{ // want `twoArgStruct literal has missing fields` bar: "bar", } @@ -37,9 +37,9 @@ type nestedStruct struct { basic basicStruct } -var _ = nestedStruct{} // want `Fill nestedStruct` +var _ = nestedStruct{} // want `nestedStruct literal has missing fields` -var _ = data.B{} // want `Fill b.B` +var _ = data.B{} // want `b.B literal has missing fields` type typedStruct struct { m map[string]int @@ -49,25 +49,25 @@ type typedStruct struct { a [2]string } -var _ = typedStruct{} // want `Fill typedStruct` +var _ = typedStruct{} // want `typedStruct literal has missing fields` type funStruct struct { fn func(i int) int } -var _ = funStruct{} // want `Fill funStruct` +var _ = funStruct{} // want `funStruct literal has missing fields` type funStructComplex struct { fn func(i int, s string) (string, int) } -var _ = funStructComplex{} // want `Fill funStructComplex` +var _ = funStructComplex{} // want `funStructComplex literal has missing fields` type funStructEmpty struct { fn func() } -var _ = funStructEmpty{} // want `Fill funStructEmpty` +var _ = funStructEmpty{} // want `funStructEmpty literal has missing fields` type Foo struct { A int @@ -78,7 +78,7 @@ type Bar struct { Y *Foo } -var _ = Bar{} // want `Fill Bar` +var _ = Bar{} // want `Bar literal has missing fields` type importedStruct struct { m map[*ast.CompositeLit]ast.Field @@ -89,7 +89,7 @@ type importedStruct struct { st ast.CompositeLit } -var _ = importedStruct{} // want `Fill importedStruct` +var _ = importedStruct{} // want `importedStruct literal has missing fields` type pointerBuiltinStruct struct { b *bool @@ -97,17 +97,16 @@ type pointerBuiltinStruct struct { i *int } -var _ = pointerBuiltinStruct{} // want `Fill pointerBuiltinStruct` +var _ = pointerBuiltinStruct{} // want `pointerBuiltinStruct literal has missing fields` var _ = []ast.BasicLit{ - {}, // want `Fill go/ast.BasicLit` + {}, // want `go/ast.BasicLit literal has missing fields` } -var _ = []ast.BasicLit{{}, // want "go/ast.BasicLit" -} +var _ = []ast.BasicLit{{}} // want "go/ast.BasicLit literal has missing fields" type unsafeStruct struct { foo unsafe.Pointer } -var _ = unsafeStruct{} // want `Fill unsafeStruct` +var _ = unsafeStruct{} // want `unsafeStruct literal has missing fields` diff --git a/gopls/internal/analysis/fillstruct/testdata/src/typeparams/typeparams.go b/gopls/internal/analysis/fillstruct/testdata/src/typeparams/typeparams.go index 46bb8ae4027..d9e3da44a6f 100644 --- a/gopls/internal/analysis/fillstruct/testdata/src/typeparams/typeparams.go +++ b/gopls/internal/analysis/fillstruct/testdata/src/typeparams/typeparams.go @@ -12,16 +12,16 @@ type basicStruct[T any] struct { foo T } -var _ = basicStruct[int]{} // want `Fill basicStruct\[int\]` +var _ = basicStruct[int]{} // want `basicStruct\[int\] literal has missing fields` type twoArgStruct[F, B any] struct { foo F bar B } -var _ = twoArgStruct[string, int]{} // want `Fill twoArgStruct\[string, int\]` +var _ = twoArgStruct[string, int]{} // want `twoArgStruct\[string, int\] literal has missing fields` -var _ = twoArgStruct[int, string]{ // want `Fill twoArgStruct\[int, string\]` +var _ = twoArgStruct[int, string]{ // want `twoArgStruct\[int, string\] literal has missing fields` bar: "bar", } @@ -30,11 +30,11 @@ type nestedStruct struct { basic basicStruct[int] } -var _ = nestedStruct{} // want "Fill nestedStruct" +var _ = nestedStruct{} // want "nestedStruct literal has missing fields" func _[T any]() { type S struct{ t T } - x := S{} // want "Fill S" + x := S{} // want "S" _ = x } @@ -42,7 +42,7 @@ func Test() { var tests = []struct { a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p string }{ - {}, // want "Fill anonymous struct { a: string, b: string, c: string, ... }" + {}, // want "anonymous struct{ a: string, b: string, c: string, ... } literal has missing fields" } for _, test := range tests { _ = test diff --git a/gopls/internal/analysis/stubmethods/stubmethods.go b/gopls/internal/analysis/stubmethods/stubmethods.go index 85468dfeb7d..78885a3ed46 100644 --- a/gopls/internal/analysis/stubmethods/stubmethods.go +++ b/gopls/internal/analysis/stubmethods/stubmethods.go @@ -87,13 +87,22 @@ func DiagnosticForError(fset *token.FileSet, file *ast.File, start, end token.Po return analysis.Diagnostic{}, false } qf := typesutil.FileQualifier(file, si.Concrete.Obj().Pkg(), info) + iface := types.TypeString(si.Interface.Type(), qf) return analysis.Diagnostic{ - Pos: start, - End: end, - Message: fmt.Sprintf("Implement %s", types.TypeString(si.Interface.Type(), qf)), + Pos: start, + End: end, + Message: fmt.Sprintf("Type %v lacks methods of interface %s", + types.TypeString(si.Concrete, qf), iface), + Category: FixCategory, + SuggestedFixes: []analysis.SuggestedFix{{ + Message: fmt.Sprintf("Declare missing methods of %s", iface), + // No TextEdits => computed later by gopls. + }}, }, true } +const FixCategory = "stubmethods" // recognized by gopls ApplyFix + // StubInfo represents a concrete type // that wants to stub out an interface type type StubInfo struct { diff --git a/gopls/internal/analysis/undeclaredname/undeclared.go b/gopls/internal/analysis/undeclaredname/undeclared.go index 377c635a5b7..70a7baa014a 100644 --- a/gopls/internal/analysis/undeclaredname/undeclared.go +++ b/gopls/internal/analysis/undeclaredname/undeclared.go @@ -103,12 +103,20 @@ func runForError(pass *analysis.Pass, err types.Error) { offset := safetoken.StartPosition(pass.Fset, err.Pos).Offset end := tok.Pos(offset + len(name)) // TODO(adonovan): dubious! err.Pos + len(name)?? pass.Report(analysis.Diagnostic{ - Pos: err.Pos, - End: end, - Message: err.Msg, + Pos: err.Pos, + End: end, + Message: err.Msg, + Category: FixCategory, + SuggestedFixes: []analysis.SuggestedFix{{ + Message: fmt.Sprintf("Create variable %q", name), + // No TextEdits => computed by a gopls command + }}, }) } +const FixCategory = "undeclaredname" // recognized by gopls ApplyFix + +// SuggestedFix computes the edits for the lazy (no-edits) fix suggested by the analyzer. func SuggestedFix(fset *token.FileSet, start, end token.Pos, content []byte, file *ast.File, pkg *types.Package, info *types.Info) (*token.FileSet, *analysis.SuggestedFix, error) { pos := start // don't use the end path, _ := astutil.PathEnclosingInterval(file, pos, pos) @@ -146,7 +154,7 @@ func SuggestedFix(fset *token.FileSet, start, end token.Pos, content []byte, fil // Create the new local variable statement. newStmt := fmt.Sprintf("%s := %s", ident.Name, indent) return fset, &analysis.SuggestedFix{ - Message: fmt.Sprintf("Create variable \"%s\"", ident.Name), + Message: fmt.Sprintf("Create variable %q", ident.Name), TextEdits: []analysis.TextEdit{{ Pos: insertBeforeStmt.Pos(), End: insertBeforeStmt.Pos(), diff --git a/gopls/internal/analysis/unusedparams/unusedparams.go b/gopls/internal/analysis/unusedparams/unusedparams.go index 6f212b0ec1a..6f6f39d7699 100644 --- a/gopls/internal/analysis/unusedparams/unusedparams.go +++ b/gopls/internal/analysis/unusedparams/unusedparams.go @@ -28,6 +28,8 @@ var Analyzer = &analysis.Analyzer{ URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedparams", } +const FixCategory = "unusedparam" // recognized by gopls ApplyFix + func run(pass *analysis.Pass) (any, error) { inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) @@ -264,28 +266,28 @@ func run(pass *analysis.Pass) (any, error) { if len(field.Names) > 1 { start, end = id.Pos(), id.End() } - // This diagnostic carries an edit-based fix to - // rename the parameter. Gopls's settings - // associate this analyzer with a command-based fix - // (RemoveUnusedParam, implemented by - // source.RemoveUnusedParameter), so the user - // will see a second Code Action offering to - // "Remove unused parameter x" (although currently - // the fix title is actually that of the diagnostic, - // i.e. "unused parameter: x", which is a poor UX. - // We should fix that bug in cache.toSourceDiagnostic). + // This diagnostic carries both an edit-based fix to + // rename the unused parameter, and a command-based fix + // to remove it (see source.RemoveUnusedParameter). pass.Report(analysis.Diagnostic{ - Pos: start, - End: end, - Message: fmt.Sprintf("unused parameter: %s", id.Name), - SuggestedFixes: []analysis.SuggestedFix{{ - Message: `Rename parameter to "_"`, - TextEdits: []analysis.TextEdit{{ - Pos: id.Pos(), - End: id.End(), - NewText: []byte("_"), - }}, - }}, + Pos: start, + End: end, + Message: fmt.Sprintf("unused parameter: %s", id.Name), + Category: FixCategory, + SuggestedFixes: []analysis.SuggestedFix{ + { + Message: `Rename parameter to "_"`, + TextEdits: []analysis.TextEdit{{ + Pos: id.Pos(), + End: id.End(), + NewText: []byte("_"), + }}, + }, + { + Message: fmt.Sprintf("Remove unused parameter %q", id.Name), + // No TextEdits => computed by gopls command + }, + }, }) } } diff --git a/gopls/internal/lsp/cache/diagnostics.go b/gopls/internal/lsp/cache/diagnostics.go index 76c82630cc6..f5cac917ab5 100644 --- a/gopls/internal/lsp/cache/diagnostics.go +++ b/gopls/internal/lsp/cache/diagnostics.go @@ -37,7 +37,7 @@ type Diagnostic struct { URI protocol.DocumentURI // of diagnosed file (not diagnostic documentation) Range protocol.Range Severity protocol.DiagnosticSeverity - Code string + Code string // analysis.Diagnostic.Category (or "default" if empty) or hidden go/types error code CodeHref string // Source is a human-readable description of the source of the error. diff --git a/gopls/internal/lsp/cache/errors.go b/gopls/internal/lsp/cache/errors.go index f81c32598a7..4e7101a3da3 100644 --- a/gopls/internal/lsp/cache/errors.go +++ b/gopls/internal/lsp/cache/errors.go @@ -21,7 +21,6 @@ import ( "strings" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/analysis/embeddirective" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/command" @@ -295,32 +294,47 @@ func toSourceDiagnostic(srcAnalyzer *settings.Analyzer, gobDiag *gobDiagnostic) Related: related, Tags: srcAnalyzer.Tag, } - if canFix(srcAnalyzer, diag) { - // We cross the set of fixes (whether edit- or command-based) - // with the set of kinds, as a single fix may represent more - // than one kind of action (e.g. refactor, quickfix, fixall), - // each corresponding to a distinct client UI element - // or operation. - kinds := srcAnalyzer.ActionKind - if len(kinds) == 0 { - kinds = []protocol.CodeActionKind{protocol.QuickFix} - } - // Accumulate edit-based fixes supplied by the diagnostic itself. - fixes := suggestedAnalysisFixes(gobDiag, kinds) - - // Accumulate command-based fixes computed on demand by - // (logic adjacent to) the analyzer. - if srcAnalyzer.Fix != "" { - // TODO(adonovan): this causes the fix to have the same title - // as the problem it fixes, which is confusing. For example, - // the fix for a diagnostic "unused parameter: x" should be - // titled "Remove parameter x". (The edit-based fixes above - // have sensible names provided by the originating analyzer.) - cmd, err := command.NewApplyFixCommand(gobDiag.Message, command.ApplyFixArgs{ + // We cross the set of fixes (whether edit- or command-based) + // with the set of kinds, as a single fix may represent more + // than one kind of action (e.g. refactor, quickfix, fixall), + // each corresponding to a distinct client UI element + // or operation. + kinds := srcAnalyzer.ActionKinds + if len(kinds) == 0 { + kinds = []protocol.CodeActionKind{protocol.QuickFix} + } + + var fixes []SuggestedFix + for _, fix := range gobDiag.SuggestedFixes { + if len(fix.TextEdits) > 0 { + // Accumulate edit-based fixes supplied by the diagnostic itself. + edits := make(map[protocol.DocumentURI][]protocol.TextEdit) + for _, e := range fix.TextEdits { + uri := e.Location.URI + edits[uri] = append(edits[uri], protocol.TextEdit{ + Range: e.Location.Range, + NewText: string(e.NewText), + }) + } + for _, kind := range kinds { + fixes = append(fixes, SuggestedFix{ + Title: fix.Message, + Edits: edits, + ActionKind: kind, + }) + } + + } else { + // Accumulate command-based fixes, whose edits + // are not provided by the analyzer but are computed on demand + // by logic "adjacent to" the analyzer. + // + // The analysis.Diagnostic.Category is used as the fix name. + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Code, URI: gobDiag.Location.URI, Range: gobDiag.Location.Range, - Fix: string(srcAnalyzer.Fix), }) if err != nil { // JSON marshalling of these argument values cannot fail. @@ -329,9 +343,14 @@ func toSourceDiagnostic(srcAnalyzer *settings.Analyzer, gobDiag *gobDiagnostic) for _, kind := range kinds { fixes = append(fixes, SuggestedFixFromCommand(cmd, kind)) } + + // Ensure that the analyzer specifies a category for all its no-edit fixes. + if diag.Code == "" || diag.Code == "default" { + panic(fmt.Sprintf("missing Diagnostic.Code: %#v", *diag)) + } } - diag.SuggestedFixes = fixes } + diag.SuggestedFixes = fixes // If the fixes only delete code, assume that the diagnostic is reporting dead code. if onlyDeletions(diag.SuggestedFixes) { @@ -340,17 +359,6 @@ func toSourceDiagnostic(srcAnalyzer *settings.Analyzer, gobDiag *gobDiagnostic) return diag } -// canFix reports whether the Analyzer can fix the Diagnostic. -func canFix(a *settings.Analyzer, diag *Diagnostic) bool { - if a.Fix == settings.AddEmbedImport { - return diag.Message == embeddirective.MissingImportMessage - } - - // This doesn't make sense, but preserves pre-existing semantics. - // TODO(rfindley): reconcile the semantics of Fix and suggestedAnalysisFixes. - return true -} - // onlyDeletions returns true if fixes is non-empty and all of the suggested // fixes are deletions. func onlyDeletions(fixes []SuggestedFix) bool { diff --git a/gopls/internal/lsp/command/interface.go b/gopls/internal/lsp/command/interface.go index 473fca7e53b..6bcd0d034b7 100644 --- a/gopls/internal/lsp/command/interface.go +++ b/gopls/internal/lsp/command/interface.go @@ -251,8 +251,16 @@ type GenerateArgs struct { // TODO(rFindley): document the rest of these once the docgen is fleshed out. type ApplyFixArgs struct { - // The fix to apply. + // The name of the fix to apply. + // + // For fixes suggested by analyzers, this is a string constant + // advertised by the analyzer that matches the Category of + // the analysis.Diagnostic with a SuggestedFix containing no edits. + // + // For fixes suggested by code actions, this is a string agreed + // upon by the code action and source.ApplyFix. Fix string + // The file URI for the document to fix. URI protocol.DocumentURI // The document range to scan for fixes. diff --git a/gopls/internal/lsp/source/fix.go b/gopls/internal/lsp/source/fix.go index e8606afd9ce..e3ee56664f1 100644 --- a/gopls/internal/lsp/source/fix.go +++ b/gopls/internal/lsp/source/fix.go @@ -12,18 +12,20 @@ import ( "go/types" "golang.org/x/tools/go/analysis" + "golang.org/x/tools/gopls/internal/analysis/embeddirective" "golang.org/x/tools/gopls/internal/analysis/fillstruct" + "golang.org/x/tools/gopls/internal/analysis/stubmethods" "golang.org/x/tools/gopls/internal/analysis/undeclaredname" + "golang.org/x/tools/gopls/internal/analysis/unusedparams" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/imports" ) -// A Fixer is a function that suggests a fix for a diagnostic produced +// A fixer is a function that suggests a fix for a diagnostic produced // by the analysis framework. This is done outside of the analyzer Run // function so that the construction of expensive fixes can be // deferred until they are requested by the user. @@ -37,21 +39,8 @@ import ( // (SuggestedFix.TextEdits[*].{Pos,End}) must belong to the returned // FileSet. // -// A Fixer may return (nil, nil) if no fix is available. -type Fixer func(ctx context.Context, s *cache.Snapshot, pkg *cache.Package, pgf *parsego.File, start, end token.Pos) (*token.FileSet, *analysis.SuggestedFix, error) - -// fixers maps each Fix id to its Fixer function. -var fixers = map[settings.Fix]Fixer{ - settings.AddEmbedImport: addEmbedImport, - settings.ExtractFunction: singleFile(extractFunction), - settings.ExtractMethod: singleFile(extractMethod), - settings.ExtractVariable: singleFile(extractVariable), - settings.FillStruct: singleFile(fillstruct.SuggestedFix), - settings.InlineCall: inlineCall, - settings.InvertIfCondition: singleFile(invertIfCondition), - settings.StubMethods: stubMethodsFixer, - settings.UndeclaredName: singleFile(undeclaredname.SuggestedFix), -} +// A fixer may return (nil, nil) if no fix is available. +type fixer func(ctx context.Context, s *cache.Snapshot, pkg *cache.Package, pgf *parsego.File, start, end token.Pos) (*token.FileSet, *analysis.SuggestedFix, error) // A singleFileFixer is a Fixer that inspects only a single file, // and does not depend on data types from the cache package. @@ -62,15 +51,71 @@ var fixers = map[settings.Fix]Fixer{ type singleFileFixer func(fset *token.FileSet, start, end token.Pos, src []byte, file *ast.File, pkg *types.Package, info *types.Info) (*token.FileSet, *analysis.SuggestedFix, error) // singleFile adapts a single-file fixer to a Fixer. -func singleFile(fixer singleFileFixer) Fixer { +func singleFile(fixer1 singleFileFixer) fixer { return func(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Package, pgf *parsego.File, start, end token.Pos) (*token.FileSet, *analysis.SuggestedFix, error) { - return fixer(pkg.FileSet(), start, end, pgf.Src, pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()) + return fixer1(pkg.FileSet(), start, end, pgf.Src, pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()) } } +// Names of ApplyFix.Fix created directly by the server's CodeAction handler. +const ( + ExtractVariable = "extract_variable" + ExtractFunction = "extract_function" + ExtractMethod = "extract_method" + InlineCall = "inline_call" + InvertIfCondition = "invert_if_condition" +) + // ApplyFix applies the specified kind of suggested fix to the given // file and range, returning the resulting edits. -func ApplyFix(ctx context.Context, fix settings.Fix, snapshot *cache.Snapshot, fh file.Handle, rng protocol.Range) ([]protocol.TextDocumentEdit, error) { +// +// A fix kind is either the Category of an analysis.Diagnostic that +// had a SuggestedFix with no edits; or the name of a fix agreed upon +// by server.codeAction and this function, such as [ExtractVariable]. +// Fix kinds identify fixes in the command protocol. +// +// TODO(adonovan): come up with a better mechanism for registering the +// connection between analyzers, code actions, and fixers. A flaw of +// the current approach is that the same Category could in theory +// apply to a Diagnostic with several lazy fixes, making them +// impossible to distinguish. It would more precise if there was a +// SuggestedFix.Category field, or some other way to squirrel metadata +// in the fix. +func ApplyFix(ctx context.Context, fix string, snapshot *cache.Snapshot, fh file.Handle, rng protocol.Range) ([]protocol.TextDocumentEdit, error) { + // This can't be expressed as an entry in the fixer table below + // because it operates in the protocol (not go/{token,ast}) domain. + // (Sigh; perhaps it was a mistake to factor out the + // NarrowestPackageForFile/RangePos/suggestedFixToEdits + // steps.) + if fix == unusedparams.FixCategory { + changes, err := RemoveUnusedParameter(ctx, fh, rng, snapshot) + if err != nil { + return nil, err + } + // Unwrap TextDocumentEdits again! + var edits []protocol.TextDocumentEdit + for _, change := range changes { + edits = append(edits, *change.TextDocumentEdit) + } + return edits, nil + } + + fixers := map[string]fixer{ + // Fixes for analyzer-provided diagnostics. + // These match the Diagnostic.Category. + embeddirective.FixCategory: addEmbedImport, + fillstruct.FixCategory: singleFile(fillstruct.SuggestedFix), + stubmethods.FixCategory: stubMethodsFixer, + undeclaredname.FixCategory: singleFile(undeclaredname.SuggestedFix), + + // Ad-hoc fixers: these are used when the command is + // constructed directly by logic in server/code_action. + ExtractFunction: singleFile(extractFunction), + ExtractMethod: singleFile(extractMethod), + ExtractVariable: singleFile(extractVariable), + InlineCall: inlineCall, + InvertIfCondition: singleFile(invertIfCondition), + } fixer, ok := fixers[fix] if !ok { return nil, fmt.Errorf("no suggested fix function for %s", fix) diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 9c6777f351a..28daef58c88 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -10,9 +10,11 @@ import ( "encoding/json" "fmt" "go/ast" + "log" "sort" "strings" + "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/analysis/fillstruct" "golang.org/x/tools/gopls/internal/analysis/infertypeargs" @@ -213,37 +215,43 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara if err != nil { return nil, err } - action, ok, err := func() (_ protocol.CodeAction, _ bool, rerr error) { - // golang/go#61693: code actions were refactored to run outside of the - // analysis framework, but as a result they lost their panic recovery. + + var ( + diag analysis.Diagnostic + ok bool + ) + func() { + // golang/go#61693: code actions were refactored to run + // outside of the analysis framework, but as a result + // they lost their panic recovery. // - // Stubmethods "should never fail"", but put back the panic recovery as a - // defensive measure. + // Stubmethods "should never fail"", but put back the + // panic recovery as a defensive measure. defer func() { if r := recover(); r != nil { - rerr = bug.Errorf("stubmethods panicked: %v", r) + err = bug.Errorf("stubmethods panicked: %v", r) } }() - d, ok := stubmethods.DiagnosticForError(pkg.FileSet(), pgf.File, start, end, pd.Message, pkg.GetTypesInfo()) - if !ok { - return protocol.CodeAction{}, false, nil - } - cmd, err := command.NewApplyFixCommand(d.Message, command.ApplyFixArgs{ + diag, ok = stubmethods.DiagnosticForError(pkg.FileSet(), pgf.File, start, end, pd.Message, pkg.GetTypesInfo()) + }() + if err != nil { + return nil, err // panicked + } + if !ok { + continue + } + + for _, fix := range diag.SuggestedFixes { + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Category, URI: pgf.URI, - Fix: string(settings.StubMethods), Range: pd.Range, ResolveEdits: supportsResolveEdits(snapshot.Options()), }) if err != nil { - return protocol.CodeAction{}, false, err + log.Fatalf("NewApplyFixCommand: %v", err) } - return newCodeAction(d.Message, protocol.QuickFix, &cmd, nil, snapshot.Options()), true, nil - }() - if err != nil { - return nil, err - } - if ok { - actions = append(actions, action) + actions = append(actions, newCodeAction(fix.Message, protocol.QuickFix, &cmd, nil, snapshot.Options())) } } @@ -414,6 +422,7 @@ func fixedByImportFix(fix *imports.ImportFix, diagnostics []protocol.Diagnostic) return results } +// TODO(adonovan): move this into source package and unexport source.ExtractMethod etc. func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *settings.Options) ([]protocol.CodeAction, error) { if rng.Start == rng.End { return nil, nil @@ -427,8 +436,8 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *sett var commands []protocol.Command if _, ok, methodOk, _ := source.CanExtractFunction(pgf.Tok, start, end, pgf.Src, pgf.File); ok { cmd, err := command.NewApplyFixCommand("Extract function", command.ApplyFixArgs{ + Fix: source.ExtractFunction, URI: puri, - Fix: string(settings.ExtractFunction), Range: rng, ResolveEdits: supportsResolveEdits(options), }) @@ -438,8 +447,8 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *sett commands = append(commands, cmd) if methodOk { cmd, err := command.NewApplyFixCommand("Extract method", command.ApplyFixArgs{ + Fix: source.ExtractMethod, URI: puri, - Fix: string(settings.ExtractMethod), Range: rng, ResolveEdits: supportsResolveEdits(options), }) @@ -451,8 +460,8 @@ func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *sett } if _, _, ok, _ := source.CanExtractVariable(start, end, pgf.File); ok { cmd, err := command.NewApplyFixCommand("Extract variable", command.ApplyFixArgs{ + Fix: source.ExtractVariable, URI: puri, - Fix: string(settings.ExtractVariable), Range: rng, ResolveEdits: supportsResolveEdits(options), }) @@ -526,9 +535,9 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P var commands []protocol.Command if _, ok, _ := source.CanInvertIfCondition(pgf.File, start, end); ok { - cmd, err := command.NewApplyFixCommand("Invert if condition", command.ApplyFixArgs{ + cmd, err := command.NewApplyFixCommand("Invert 'if' condition", command.ApplyFixArgs{ + Fix: source.InvertIfCondition, URI: pgf.URI, - Fix: string(settings.InvertIfCondition), Range: rng, ResolveEdits: supportsResolveEdits(options), }) @@ -544,21 +553,23 @@ func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.P // TODO: Consider removing the inspection after convenienceAnalyzers are removed. inspect := inspector.New([]*ast.File{pgf.File}) if snapshot.Options().IsAnalyzerEnabled(fillstruct.Analyzer.Name) { - for _, d := range fillstruct.DiagnoseFillableStructs(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { - rng, err := pgf.Mapper.PosRange(pgf.Tok, d.Pos, d.End) + for _, diag := range fillstruct.DiagnoseFillableStructs(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { + rng, err := pgf.Mapper.PosRange(pgf.Tok, diag.Pos, diag.End) if err != nil { return nil, err } - cmd, err := command.NewApplyFixCommand(d.Message, command.ApplyFixArgs{ - URI: pgf.URI, - Fix: string(settings.FillStruct), - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err + for _, fix := range diag.SuggestedFixes { + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Category, + URI: pgf.URI, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) } - commands = append(commands, cmd) } } @@ -642,6 +653,7 @@ func canRemoveParameter(pkg *cache.Package, pgf *source.ParsedGoFile, rng protoc } // refactorInline returns inline actions available at the specified range. +// TODO(adonovan): move this into source package and unexport source.InlineCall etc. func refactorInline(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { start, end, err := pgf.RangePos(rng) if err != nil { @@ -652,8 +664,8 @@ func refactorInline(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.R var commands []protocol.Command if _, fn, err := source.EnclosingStaticCall(pkg, pgf, start, end); err == nil { cmd, err := command.NewApplyFixCommand(fmt.Sprintf("Inline call to %s", fn.Name()), command.ApplyFixArgs{ + Fix: source.InlineCall, URI: pgf.URI, - Fix: string(settings.InlineCall), Range: rng, }) if err != nil { diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 5538ec8282c..0e0bbbf949e 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -205,7 +205,7 @@ func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs // Note: no progress here. Applying fixes should be quick. forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { - edits, err := source.ApplyFix(ctx, settings.Fix(args.Fix), deps.snapshot, deps.fh, args.Range) + edits, err := source.ApplyFix(ctx, args.Fix, deps.snapshot, deps.fh, args.Range) if err != nil { return err } diff --git a/gopls/internal/settings/analyzer.go b/gopls/internal/settings/analyzer.go index f9376930564..3898f39de76 100644 --- a/gopls/internal/settings/analyzer.go +++ b/gopls/internal/settings/analyzer.go @@ -9,22 +9,6 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" ) -// A Fix identifies kinds of suggested fix, both in Analyzer.Fix and in the -// ApplyFix subcommand (see ExecuteCommand and ApplyFixArgs.Fix). -type Fix string - -const ( - FillStruct Fix = "fill_struct" - StubMethods Fix = "stub_methods" - UndeclaredName Fix = "undeclared_name" - ExtractVariable Fix = "extract_variable" - ExtractFunction Fix = "extract_function" - ExtractMethod Fix = "extract_method" - InlineCall Fix = "inline_call" - InvertIfCondition Fix = "invert_if_condition" - AddEmbedImport Fix = "add_embed_import" -) - // Analyzer augments a go/analysis analyzer with additional LSP configuration. type Analyzer struct { Analyzer *analysis.Analyzer @@ -36,15 +20,9 @@ type Analyzer struct { // Most clients should use the IsEnabled method. Enabled bool - // Fix is the name of the suggested fix name used to invoke the suggested - // fixes for the analyzer. It is non-empty if we expect this analyzer to - // provide its fix separately from its diagnostics. That is, we should apply - // the analyzer's suggested fixes through a Command, not a TextEdit. - Fix Fix - - // ActionKind is the set of kinds of code action this analyzer produces. + // ActionKinds is the set of kinds of code action this analyzer produces. // If empty, the set is just QuickFix. - ActionKind []protocol.CodeActionKind + ActionKinds []protocol.CodeActionKind // Severity is the severity set for diagnostics reported by this // analyzer. If left unset it defaults to Warning. diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index be02148ca13..850632c1592 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -742,7 +742,7 @@ var GeneratedAPIJSON = &APIJSON{ Command: "gopls.apply_fix", Title: "Apply a fix", Doc: "Applies a fix to a region of source code.", - ArgDoc: "{\n\t// The fix to apply.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", + ArgDoc: "{\n\t// The name of the fix to apply.\n\t//\n\t// For fixes suggested by analyzers, this is a string constant\n\t// advertised by the analyzer that matches the Category of\n\t// the analysis.Diagnostic with a SuggestedFix containing no edits.\n\t//\n\t// For fixes suggested by code actions, this is a string agreed\n\t// upon by the code action and source.ApplyFix.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", }, { diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index a41a3bfe9f6..9f5bb808768 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -1385,8 +1385,8 @@ func typeErrorAnalyzers() map[string]*Analyzer { fillreturns.Analyzer.Name: { Analyzer: fillreturns.Analyzer, // TODO(rfindley): is SourceFixAll even necessary here? Is that not implied? - ActionKind: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, - Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, + Enabled: true, }, nonewvars.Analyzer.Name: { Analyzer: nonewvars.Analyzer, @@ -1398,7 +1398,6 @@ func typeErrorAnalyzers() map[string]*Analyzer { }, undeclaredname.Analyzer.Name: { Analyzer: undeclaredname.Analyzer, - Fix: UndeclaredName, Enabled: true, }, unusedvariable.Analyzer.Name: { @@ -1413,20 +1412,18 @@ func typeErrorAnalyzers() map[string]*Analyzer { func convenienceAnalyzers() map[string]*Analyzer { return map[string]*Analyzer{ fillstruct.Analyzer.Name: { - Analyzer: fillstruct.Analyzer, - Fix: FillStruct, - Enabled: true, - ActionKind: []protocol.CodeActionKind{protocol.RefactorRewrite}, + Analyzer: fillstruct.Analyzer, + Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.RefactorRewrite}, }, stubmethods.Analyzer.Name: { Analyzer: stubmethods.Analyzer, - Fix: StubMethods, Enabled: true, }, infertypeargs.Analyzer.Name: { - Analyzer: infertypeargs.Analyzer, - Enabled: true, - ActionKind: []protocol.CodeActionKind{protocol.RefactorRewrite}, + Analyzer: infertypeargs.Analyzer, + Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.RefactorRewrite}, }, } } @@ -1479,24 +1476,23 @@ func defaultAnalyzers() map[string]*Analyzer { embeddirective.Analyzer.Name: { Analyzer: embeddirective.Analyzer, Enabled: true, - Fix: AddEmbedImport, }, // gofmt -s suite: simplifycompositelit.Analyzer.Name: { - Analyzer: simplifycompositelit.Analyzer, - Enabled: true, - ActionKind: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, + Analyzer: simplifycompositelit.Analyzer, + Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, }, simplifyrange.Analyzer.Name: { - Analyzer: simplifyrange.Analyzer, - Enabled: true, - ActionKind: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, + Analyzer: simplifyrange.Analyzer, + Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, }, simplifyslice.Analyzer.Name: { - Analyzer: simplifyslice.Analyzer, - Enabled: true, - ActionKind: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, + Analyzer: simplifyslice.Analyzer, + Enabled: true, + ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, }, } } From 6673e7a464a384da7f1571011c89c475c538b81d Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 12 Dec 2023 12:43:01 -0500 Subject: [PATCH 023/105] gopls/internal/lsp/source/completion: infer parameter types This change causes completion to omit type parameters in the snippet template when the instantiations can be inferred from the arguments to the call. This is only implemented when types are available, not for unimported completions. (In principle it could be implemented using a best-effort syntactic traversal, similar to inlining's "freeishNames", but it seems fiddly.) Fixes golang/go#51783 Change-Id: I4c793628e7f2cbbb28a7f5ca7b5e305ab683491e Reviewed-on: https://go-review.googlesource.com/c/tools/+/554855 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- .../lsp/source/completion/completion.go | 6 ++ .../internal/lsp/source/completion/format.go | 98 ++++++++++++++++++- .../internal/lsp/source/completion/snippet.go | 5 + .../testdata/completion/func_snippets.txt | 2 +- .../marker/testdata/completion/issue51783.txt | 47 +++++++++ .../testdata/completion/type_params.txt | 3 +- 6 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/completion/issue51783.txt diff --git a/gopls/internal/lsp/source/completion/completion.go b/gopls/internal/lsp/source/completion/completion.go index 805c6d6615b..a20e4633164 100644 --- a/gopls/internal/lsp/source/completion/completion.go +++ b/gopls/internal/lsp/source/completion/completion.go @@ -377,6 +377,7 @@ func (c *completer) getSurrounding() *Selection { type candidate struct { // obj is the types.Object to complete to. // TODO(adonovan): eliminate dependence on go/types throughout this struct. + // See comment in (*completer).selector for explanation. obj types.Object // score is used to rank candidates. @@ -1347,6 +1348,11 @@ func (c *completer) selector(ctx context.Context, sel *ast.SelectorExpr) error { return params } + // Ideally we would eliminate the suffix of type + // parameters that are redundant with inference + // from the argument types (#51783), but it's + // quite fiddly to do using syntax alone. + // (See inferableTypeParams in format.go.) tparams := paramList(fn.Type.TypeParams) params := paramList(fn.Type.Params) var sn snippet.Builder diff --git a/gopls/internal/lsp/source/completion/format.go b/gopls/internal/lsp/source/completion/format.go index 0d47161c4d0..4d3fa23f576 100644 --- a/gopls/internal/lsp/source/completion/format.go +++ b/gopls/internal/lsp/source/completion/format.go @@ -135,7 +135,27 @@ Suffixes: if err != nil { return CompletionItem{}, err } - c.functionCallSnippet("", s.TypeParams(), s.Params(), &snip) + + tparams := s.TypeParams() + if len(tparams) > 0 { + // Eliminate the suffix of type parameters that are + // likely redundant because they can probably be + // inferred from the argument types (#51783). + // + // We don't bother doing the reverse inference from + // result types as result-only type parameters are + // quite unusual. + free := inferableTypeParams(sig) + for i := sig.TypeParams().Len() - 1; i >= 0; i-- { + tparam := sig.TypeParams().At(i) + if !free[tparam] { + break + } + tparams = tparams[:i] // eliminate + } + } + + c.functionCallSnippet("", tparams, s.Params(), &snip) if sig.Results().Len() == 1 { funcType = sig.Results().At(0).Type() } @@ -310,6 +330,7 @@ func (c *completer) formatBuiltin(ctx context.Context, cand candidate) (Completi } item.Detail = "func" + sig.Format() item.snippet = &snippet.Builder{} + // The signature inferred for a built-in is instantiated, so TypeParams=∅. c.functionCallSnippet(obj.Name(), sig.TypeParams(), sig.Params(), item.snippet) case *types.TypeName: if types.IsInterface(obj.Type()) { @@ -341,3 +362,78 @@ func (c *completer) wantTypeParams() bool { } return false } + +// inferableTypeParams returns the set of type parameters +// of sig that are constrained by (inferred from) the argument types. +func inferableTypeParams(sig *types.Signature) map[*types.TypeParam]bool { + free := make(map[*types.TypeParam]bool) + + // visit adds to free all the free type parameters of t. + var visit func(t types.Type) + visit = func(t types.Type) { + switch t := t.(type) { + case *types.Array: + visit(t.Elem()) + case *types.Chan: + visit(t.Elem()) + case *types.Map: + visit(t.Key()) + visit(t.Elem()) + case *types.Pointer: + visit(t.Elem()) + case *types.Slice: + visit(t.Elem()) + case *types.Interface: + for i := 0; i < t.NumExplicitMethods(); i++ { + visit(t.ExplicitMethod(i).Type()) + } + for i := 0; i < t.NumEmbeddeds(); i++ { + visit(t.EmbeddedType(i)) + } + case *types.Union: + for i := 0; i < t.Len(); i++ { + visit(t.Term(i).Type()) + } + case *types.Signature: + if tp := t.TypeParams(); tp != nil { + // Generic signatures only appear as the type of generic + // function declarations, so this isn't really reachable. + for i := 0; i < tp.Len(); i++ { + visit(tp.At(i).Constraint()) + } + } + visit(t.Params()) + visit(t.Results()) + case *types.Tuple: + for i := 0; i < t.Len(); i++ { + visit(t.At(i).Type()) + } + case *types.Struct: + for i := 0; i < t.NumFields(); i++ { + visit(t.Field(i).Type()) + } + case *types.TypeParam: + free[t] = true + case *types.Basic, *types.Named: + // nop + default: + panic(t) + } + } + + visit(sig.Params()) + + // Perform induction through constraints. +restart: + for i := 0; i < sig.TypeParams().Len(); i++ { + tp := sig.TypeParams().At(i) + if free[tp] { + n := len(free) + visit(tp.Constraint()) + if len(free) > n { + goto restart // iterate until fixed point + } + } + } + return free +} diff --git a/gopls/internal/lsp/source/completion/snippet.go b/gopls/internal/lsp/source/completion/snippet.go index c37736254aa..a6786cfa874 100644 --- a/gopls/internal/lsp/source/completion/snippet.go +++ b/gopls/internal/lsp/source/completion/snippet.go @@ -50,6 +50,11 @@ func (c *completer) structFieldSnippet(cand candidate, detail string, snip *snip } // functionCallSnippet calculates the snippet for function calls. +// +// Callers should omit the suffix of type parameters that are +// constrained by the argument types, to avoid offering completions +// that contain instantiations that are redundant because of type +// inference, such as f[int](1) for func f[T any](x T). func (c *completer) functionCallSnippet(name string, tparams, params []string, snip *snippet.Builder) { if !c.opts.completeFunctionCalls { snip.WriteText(name) diff --git a/gopls/internal/test/marker/testdata/completion/func_snippets.txt b/gopls/internal/test/marker/testdata/completion/func_snippets.txt index efbc393f30f..01316342b7f 100644 --- a/gopls/internal/test/marker/testdata/completion/func_snippets.txt +++ b/gopls/internal/test/marker/testdata/completion/func_snippets.txt @@ -28,5 +28,5 @@ func Identity[P ~int](p P) P { //@item(Identity, "Identity", "", "") func _() { _ = NewSyncM //@snippet(" //", NewSyncMap, "NewSyncMap[${1:K comparable}, ${2:V any}]()") - _ = Identi //@snippet(" //", Identity, "Identity[${1:P ~int}](${2:p P})") + _ = Identi //@snippet(" //", Identity, "Identity(${1:p P})") } diff --git a/gopls/internal/test/marker/testdata/completion/issue51783.txt b/gopls/internal/test/marker/testdata/completion/issue51783.txt new file mode 100644 index 00000000000..074259ca713 --- /dev/null +++ b/gopls/internal/test/marker/testdata/completion/issue51783.txt @@ -0,0 +1,47 @@ +Regression test for "completion gives unneeded generic type +instantiation snippet", #51783. + +Type parameters that can be inferred from the arguments +are not part of the offered completion snippet. + +-- flags -- +-ignore_extra_diags + +-- a.go -- +package a + +// identity has a single simple type parameter. +// The completion omits the instantiation. +func identity[T any](x T) T + +// clone has a second type parameter that is nonetheless constrained by the parameter. +// The completion omits the instantiation. +func clone[S ~[]E, E any](s S) S + +// unconstrained has a type parameter constrained only by the result. +// The completion suggests instantiation. +func unconstrained[X, Y any](x X) Y + +// partial has three type parameters, +// only the last two of which may be omitted as they +// are constrained by the arguments. +func partial[R any, S ~[]E, E any](s S) R + +//@item(identity, "identity", "details", "kind") +//@item(clone, "clone", "details", "kind") +//@item(unconstrained, "unconstrained", "details", "kind") +//@item(partial, "partial", "details", "kind") + +func _() { + _ = identity //@snippet("identity", identity, "identity(${1:})") + + _ = clone //@snippet("clone", clone, "clone(${1:})") + + _ = unconstrained //@snippet("unconstrained", unconstrained, "unconstrained[${1:}](${2:})") + + _ = partial //@snippet("partial", partial, "partial[${1:}](${2:})") + + // Result-type inference permits us to omit Y in this (rare) case, + // but completion doesn't support that. + var _ int = unconstrained //@snippet("unconstrained", unconstrained, "unconstrained[${1:}](${2:})") +} diff --git a/gopls/internal/test/marker/testdata/completion/type_params.txt b/gopls/internal/test/marker/testdata/completion/type_params.txt index 185d77f9911..8e2f5d7e401 100644 --- a/gopls/internal/test/marker/testdata/completion/type_params.txt +++ b/gopls/internal/test/marker/testdata/completion/type_params.txt @@ -52,8 +52,7 @@ func returnTP[A int | float64](a A) A { //@item(returnTP, "returnTP", "something } func _() { - // disabled - see issue #54822 - var _ int = returnTP // snippet(" //", returnTP, "returnTP[${1:}](${2:})") + var _ int = returnTP //@snippet(" //", returnTP, "returnTP(${1:})") var aa int //@item(tpInt, "aa", "int", "var") var ab float64 //@item(tpFloat, "ab", "float64", "var") From c467be361ab7f9641e4ffefaa23e0eedfb7ea10e Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 12 Jan 2024 14:26:01 -0500 Subject: [PATCH 024/105] gopls: add a main.version variable to override the version at linktime As discussed in golang/go#63803, add a version variable to allow package managers to set the gopls version at linktime, thereby avoiding the need to patch source. Fixes golang/go#63803 Change-Id: Ie6696283e1007577e82d96f01c96e16e89cfcb6f Reviewed-on: https://go-review.googlesource.com/c/tools/+/555457 Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Robert Findley <rfindley@google.com> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/cmd/integration_test.go | 14 ++++++++++++- gopls/internal/cmd/stats.go | 10 ++++----- gopls/internal/debug/info.go | 20 ++++++------------ gopls/internal/debug/info_test.go | 6 ++++-- gopls/internal/version/version.go | 29 ++++++++++++++++++++++++++ gopls/main.go | 5 +++++ 6 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 gopls/internal/version/version.go diff --git a/gopls/internal/cmd/integration_test.go b/gopls/internal/cmd/integration_test.go index 7f6a2f9e675..a563c55169e 100644 --- a/gopls/internal/cmd/integration_test.go +++ b/gopls/internal/cmd/integration_test.go @@ -43,6 +43,7 @@ import ( "golang.org/x/tools/gopls/internal/hooks" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" + "golang.org/x/tools/gopls/internal/version" "golang.org/x/tools/internal/testenv" "golang.org/x/tools/internal/tool" "golang.org/x/tools/txtar" @@ -55,7 +56,7 @@ func TestVersion(t *testing.T) { tree := writeTree(t, "") // There's not much we can robustly assert about the actual version. - want := debug.Version() // e.g. "master" + want := version.Version() // e.g. "master" // basic { @@ -64,6 +65,13 @@ func TestVersion(t *testing.T) { res.checkStdout(want) } + // basic, with version override + { + res := goplsWithEnv(t, tree, []string{"TEST_GOPLS_VERSION=v1.2.3"}, "version") + res.checkExit(true) + res.checkStdout(`v1\.2\.3`) + } + // -json flag { res := gopls(t, tree, "version", "-json") @@ -1034,6 +1042,10 @@ func goplsMain() { bug.PanicOnBugs = true } + if v := os.Getenv("TEST_GOPLS_VERSION"); v != "" { + version.VersionOverride = v + } + tool.Main(context.Background(), cmd.New(hooks.Options), os.Args[1:]) } diff --git a/gopls/internal/cmd/stats.go b/gopls/internal/cmd/stats.go index 9417bfe9ff0..b115f136041 100644 --- a/gopls/internal/cmd/stats.go +++ b/gopls/internal/cmd/stats.go @@ -19,13 +19,13 @@ import ( "sync" "time" - "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" - goplsbug "golang.org/x/tools/gopls/internal/util/bug" + bugpkg "golang.org/x/tools/gopls/internal/util/bug" + versionpkg "golang.org/x/tools/gopls/internal/version" "golang.org/x/tools/internal/event" ) @@ -74,7 +74,7 @@ func (s *stats) Run(ctx context.Context, args ...string) error { GOARCH: runtime.GOARCH, GOPLSCACHE: os.Getenv("GOPLSCACHE"), GoVersion: runtime.Version(), - GoplsVersion: debug.Version(), + GoplsVersion: versionpkg.Version(), GOPACKAGESDRIVER: os.Getenv("GOPACKAGESDRIVER"), } @@ -147,7 +147,7 @@ func (s *stats) Run(ctx context.Context, args ...string) error { do("Gathering bug reports", func() error { stats.CacheDir, stats.BugReports = filecache.BugReports() if stats.BugReports == nil { - stats.BugReports = []goplsbug.Bug{} // non-nil for JSON + stats.BugReports = []bugpkg.Bug{} // non-nil for JSON } return nil }) @@ -232,7 +232,7 @@ type GoplsStats struct { GOPACKAGESDRIVER string InitialWorkspaceLoadDuration string `anon:"ok"` // in time.Duration string form CacheDir string - BugReports []goplsbug.Bug + BugReports []bugpkg.Bug MemStats command.MemStatsResult `anon:"ok"` WorkspaceStats command.WorkspaceStatsResult `anon:"ok"` DirStats dirStats `anon:"ok"` diff --git a/gopls/internal/debug/info.go b/gopls/internal/debug/info.go index bb58e2ecb03..b2824d86f38 100644 --- a/gopls/internal/debug/info.go +++ b/gopls/internal/debug/info.go @@ -14,6 +14,8 @@ import ( "runtime" "runtime/debug" "strings" + + "golang.org/x/tools/gopls/internal/version" ) type PrintMode int @@ -25,16 +27,6 @@ const ( JSON ) -// Version is a manually-updated mechanism for tracking versions. -func Version() string { - if info, ok := debug.ReadBuildInfo(); ok { - if info.Main.Version != "" { - return info.Main.Version - } - } - return "(unknown)" -} - // ServerVersion is the format used by gopls to report its version to the // client. This format is structured so that the client can parse it easily. type ServerVersion struct { @@ -48,12 +40,12 @@ type ServerVersion struct { func VersionInfo() *ServerVersion { if info, ok := debug.ReadBuildInfo(); ok { return &ServerVersion{ - Version: Version(), + Version: version.Version(), BuildInfo: info, } } return &ServerVersion{ - Version: Version(), + Version: version.Version(), BuildInfo: &debug.BuildInfo{ Path: "gopls, built in GOPATH mode", GoVersion: runtime.Version(), @@ -124,11 +116,11 @@ func section(w io.Writer, mode PrintMode, title string, body func()) { } func printBuildInfo(w io.Writer, info *ServerVersion, verbose bool, mode PrintMode) { - fmt.Fprintf(w, "%v %v\n", info.Path, Version()) - printModuleInfo(w, info.Main, mode) + fmt.Fprintf(w, "%v %v\n", info.Path, version.Version()) if !verbose { return } + printModuleInfo(w, info.Main, mode) for _, dep := range info.Deps { printModuleInfo(w, *dep, mode) } diff --git a/gopls/internal/debug/info_test.go b/gopls/internal/debug/info_test.go index 3bc9290c157..7f24b696682 100644 --- a/gopls/internal/debug/info_test.go +++ b/gopls/internal/debug/info_test.go @@ -11,6 +11,8 @@ import ( "encoding/json" "runtime" "testing" + + "golang.org/x/tools/gopls/internal/version" ) func TestPrintVersionInfoJSON(t *testing.T) { @@ -27,7 +29,7 @@ func TestPrintVersionInfoJSON(t *testing.T) { if g, w := got.GoVersion, runtime.Version(); g != w { t.Errorf("go version = %v, want %v", g, w) } - if g, w := got.Version, Version(); g != w { + if g, w := got.Version, version.Version(); g != w { t.Errorf("gopls version = %v, want %v", g, w) } // Other fields of BuildInfo may not be available during test. @@ -41,7 +43,7 @@ func TestPrintVersionInfoPlainText(t *testing.T) { res := buf.Bytes() // Other fields of BuildInfo may not be available during test. - wantGoplsVersion, wantGoVersion := Version(), runtime.Version() + wantGoplsVersion, wantGoVersion := version.Version(), runtime.Version() if !bytes.Contains(res, []byte(wantGoplsVersion)) || !bytes.Contains(res, []byte(wantGoVersion)) { t.Errorf("plaintext output = %q,\nwant (version: %v, go: %v)", res, wantGoplsVersion, wantGoVersion) } diff --git a/gopls/internal/version/version.go b/gopls/internal/version/version.go new file mode 100644 index 00000000000..1806c994e01 --- /dev/null +++ b/gopls/internal/version/version.go @@ -0,0 +1,29 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package version manages the gopls version. +// +// The VersionOverride variable may be used to set the gopls version at link +// time. +package version + +import "runtime/debug" + +var VersionOverride = "" + +// Version returns the gopls version. +// +// By default, this is read from runtime/debug.ReadBuildInfo, but may be +// overridden by the [VersionOverride] variable. +func Version() string { + if VersionOverride != "" { + return VersionOverride + } + if info, ok := debug.ReadBuildInfo(); ok { + if info.Main.Version != "" { + return info.Main.Version + } + } + return "(unknown)" +} diff --git a/gopls/main.go b/gopls/main.go index cb41f733c14..bbbb915ffc5 100644 --- a/gopls/main.go +++ b/gopls/main.go @@ -20,10 +20,15 @@ import ( "golang.org/x/telemetry/counter" "golang.org/x/tools/gopls/internal/cmd" "golang.org/x/tools/gopls/internal/hooks" + versionpkg "golang.org/x/tools/gopls/internal/version" "golang.org/x/tools/internal/tool" ) +var version = "" // if set by the linker, overrides the gopls version + func main() { + versionpkg.VersionOverride = version + counter.Open() // Enable telemetry counter writing. ctx := context.Background() tool.Main(ctx, cmd.New(hooks.Options), os.Args[1:]) From 83c6c25d390373960c599ed8fce427edf19e1445 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Thu, 18 Jan 2024 17:35:47 -0500 Subject: [PATCH 025/105] gopls/internal/server: analyze widest packages for open files This change causes server.diagnose to choose a covering set of packages for the open files preferring the widest package for a given package path. This has two benefits: correctness, for analyzers (such as unusedparams) that make incorrect deductions when additional files may be added to the package; and efficiency, as it requires fewer packages in general. Change-Id: I21576c6ce4c136d6c72ccce76971a782abd4df53 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556816 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- .../analysis/unusedparams/unusedparams.go | 9 +++++ gopls/internal/lsp/cache/analysis.go | 2 +- gopls/internal/lsp/source/diagnostics.go | 3 +- gopls/internal/server/diagnostics.go | 34 +++++++++++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/gopls/internal/analysis/unusedparams/unusedparams.go b/gopls/internal/analysis/unusedparams/unusedparams.go index 6f6f39d7699..f1b793ab3b9 100644 --- a/gopls/internal/analysis/unusedparams/unusedparams.go +++ b/gopls/internal/analysis/unusedparams/unusedparams.go @@ -52,6 +52,15 @@ func run(pass *analysis.Pass) (any, error) { // use(func() { ... }) address-taken // + // Note: this algorithm relies on the assumption that the + // analyzer is called only for the "widest" package for a + // given file: that is, p_test in preference to p, if both + // exist. Analyzing only package p may produce diagnostics + // that would be falsified based on declarations in p_test.go + // files. The gopls analysis driver does this, but most + // drivers to not, so running this command in, say, + // unitchecker or multichecker may produce incorrect results. + // Gather global information: // - uses of functions not in call position // - unexported interface methods diff --git a/gopls/internal/lsp/cache/analysis.go b/gopls/internal/lsp/cache/analysis.go index dfbb9ef6c0e..1b49d58c83c 100644 --- a/gopls/internal/lsp/cache/analysis.go +++ b/gopls/internal/lsp/cache/analysis.go @@ -172,7 +172,7 @@ const AnalysisProgressTitle = "Analyzing Dependencies" // The analyzers list must be duplicate free; order does not matter. // // Notifications of progress may be sent to the optional reporter. -func (s *Snapshot) Analyze(ctx context.Context, pkgs map[PackageID]unit, analyzers []*settings.Analyzer, reporter *progress.Tracker) ([]*Diagnostic, error) { +func (s *Snapshot) Analyze(ctx context.Context, pkgs map[PackageID]*metadata.Package, analyzers []*settings.Analyzer, reporter *progress.Tracker) ([]*Diagnostic, error) { start := time.Now() // for progress reporting var tagStr string // sorted comma-separated list of PackageIDs diff --git a/gopls/internal/lsp/source/diagnostics.go b/gopls/internal/lsp/source/diagnostics.go index d2e9332dad2..6cda179edf0 100644 --- a/gopls/internal/lsp/source/diagnostics.go +++ b/gopls/internal/lsp/source/diagnostics.go @@ -8,6 +8,7 @@ import ( "context" "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/progress" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" @@ -18,7 +19,7 @@ import ( // // If the provided tracker is non-nil, it may be used to provide notifications // of the ongoing analysis pass. -func Analyze(ctx context.Context, snapshot *cache.Snapshot, pkgIDs map[PackageID]unit, tracker *progress.Tracker) (map[protocol.DocumentURI][]*cache.Diagnostic, error) { +func Analyze(ctx context.Context, snapshot *cache.Snapshot, pkgIDs map[PackageID]*metadata.Package, tracker *progress.Tracker) (map[protocol.DocumentURI][]*cache.Diagnostic, error) { // Exit early if the context has been canceled. This also protects us // from a race on Options, see golang/go#36699. if ctx.Err() != nil { diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 2d6273bbcfa..6f09f030d7a 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -415,9 +415,30 @@ func (s *server) diagnose(ctx context.Context, snapshot *cache.Snapshot) (diagMa }() // Run type checking and go/analysis diagnosis of packages in parallel. + // + // For analysis, we use the *widest* package for each open file, + // for two reasons: + // + // - Correctness: some analyzers (e.g. unusedparam) depend + // on it. If applied to a non-test package for which a + // corresponding test package exists, they make assumptions + // that are falsified in the test package, for example that + // all references to unexported symbols are visible to the + // analysis. + // + // - Efficiency: it may yield a smaller covering set of + // PackageIDs for a given set of files. For example, {x.go, + // x_test.go} is covered by the single package x_test using + // "widest". (Using "narrowest", it would be covered only by + // the pair of packages {x, x_test}, Originally we used all + // covering packages, so {x.go} alone would be analyzed + // twice.) var ( toDiagnose = make(map[metadata.PackageID]*metadata.Package) - toAnalyze = make(map[metadata.PackageID]unit) + toAnalyze = make(map[metadata.PackageID]*metadata.Package) + + // secondary index, used to eliminate narrower packages. + toAnalyzeWidest = make(map[source.PackagePath]*metadata.Package) ) for _, mp := range workspacePkgs { var hasNonIgnored, hasOpenFile bool @@ -432,7 +453,16 @@ func (s *server) diagnose(ctx context.Context, snapshot *cache.Snapshot) (diagMa if hasNonIgnored { toDiagnose[mp.ID] = mp if hasOpenFile { - toAnalyze[mp.ID] = unit{} + if prev, ok := toAnalyzeWidest[mp.PkgPath]; ok { + if len(prev.CompiledGoFiles) >= len(mp.CompiledGoFiles) { + // Previous entry is not narrower; keep it. + continue + } + // Evict previous (narrower) entry. + delete(toAnalyze, prev.ID) + } + toAnalyze[mp.ID] = mp + toAnalyzeWidest[mp.PkgPath] = mp } } } From 186fcf30e5da15424a47c0f25d7cbf704ad32473 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 5 Jan 2024 14:53:00 -0500 Subject: [PATCH 026/105] gopls/internal/lsp/source: factor edit conversion utils Change-Id: I85107134c426476f08a06940d53fc912f268ef60 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556575 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/protocol/edits.go | 25 +++++++++++++++++++ gopls/internal/lsp/source/change_quote.go | 12 +-------- gopls/internal/lsp/source/change_signature.go | 10 +------- gopls/internal/server/code_action.go | 14 +---------- gopls/internal/server/command.go | 23 ++--------------- gopls/internal/settings/settings.go | 5 +--- 6 files changed, 31 insertions(+), 58 deletions(-) diff --git a/gopls/internal/lsp/protocol/edits.go b/gopls/internal/lsp/protocol/edits.go index 71d4427c73c..53fd4cf94e3 100644 --- a/gopls/internal/lsp/protocol/edits.go +++ b/gopls/internal/lsp/protocol/edits.go @@ -101,3 +101,28 @@ func AsAnnotatedTextEdits(edits []TextEdit) []Or_TextDocumentEdit_edits_Elem { } return result } + +// TextEditsToDocumentChanges converts a set of edits within the +// specified (versioned) file to a singleton list of DocumentChanges +// (as required for a WorkspaceEdit). +func TextEditsToDocumentChanges(uri DocumentURI, version int32, edits []TextEdit) []DocumentChanges { + return []DocumentChanges{{ + TextDocumentEdit: &TextDocumentEdit{ + TextDocument: OptionalVersionedTextDocumentIdentifier{ + Version: version, + TextDocumentIdentifier: TextDocumentIdentifier{URI: uri}, + }, + Edits: AsAnnotatedTextEdits(edits), + }, + }} +} + +// TextDocumentEditsToDocumentChanges wraps each TextDocumentEdit in a DocumentChange. +func TextDocumentEditsToDocumentChanges(edits []TextDocumentEdit) []DocumentChanges { + changes := []DocumentChanges{} // non-nil + for _, edit := range edits { + edit := edit + changes = append(changes, DocumentChanges{TextDocumentEdit: &edit}) + } + return changes +} diff --git a/gopls/internal/lsp/source/change_quote.go b/gopls/internal/lsp/source/change_quote.go index 57dffdbc399..ad9a127b3b9 100644 --- a/gopls/internal/lsp/source/change_quote.go +++ b/gopls/internal/lsp/source/change_quote.go @@ -78,17 +78,7 @@ func ConvertStringLiteral(pgf *ParsedGoFile, fh file.Handle, rng protocol.Range) Title: title, Kind: protocol.RefactorRewrite, Edit: &protocol.WorkspaceEdit{ - DocumentChanges: []protocol.DocumentChanges{ - { - TextDocumentEdit: &protocol.TextDocumentEdit{ - TextDocument: protocol.OptionalVersionedTextDocumentIdentifier{ - Version: fh.Version(), - TextDocumentIdentifier: protocol.TextDocumentIdentifier{URI: fh.URI()}, - }, - Edits: protocol.AsAnnotatedTextEdits(pedits), - }, - }, - }, + DocumentChanges: protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), pedits), }, }, true } diff --git a/gopls/internal/lsp/source/change_signature.go b/gopls/internal/lsp/source/change_signature.go index 76ea0d248de..b745dd182d0 100644 --- a/gopls/internal/lsp/source/change_signature.go +++ b/gopls/internal/lsp/source/change_signature.go @@ -170,15 +170,7 @@ func RemoveUnusedParameter(ctx context.Context, fh file.Handle, rng protocol.Ran if err != nil { return nil, fmt.Errorf("computing edits for %s: %v", uri, err) } - changes = append(changes, protocol.DocumentChanges{ - TextDocumentEdit: &protocol.TextDocumentEdit{ - TextDocument: protocol.OptionalVersionedTextDocumentIdentifier{ - Version: fh.Version(), - TextDocumentIdentifier: protocol.TextDocumentIdentifier{URI: uri}, - }, - Edits: protocol.AsAnnotatedTextEdits(pedits), - }, - }) + changes = append(changes, protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), pedits)...) } return changes, nil } diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 28daef58c88..291de86c952 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -687,19 +687,7 @@ func refactorInline(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.R } func documentChanges(fh file.Handle, edits []protocol.TextEdit) []protocol.DocumentChanges { - return []protocol.DocumentChanges{ - { - TextDocumentEdit: &protocol.TextDocumentEdit{ - TextDocument: protocol.OptionalVersionedTextDocumentIdentifier{ - Version: fh.Version(), - TextDocumentIdentifier: protocol.TextDocumentIdentifier{ - URI: fh.URI(), - }, - }, - Edits: protocol.AsAnnotatedTextEdits(edits), - }, - }, - } + return protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), edits) } // codeActionsMatchingDiagnostics fetches code actions for the provided diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 0e0bbbf949e..094e50c7730 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -453,19 +453,7 @@ func (c *commandHandler) RemoveDependency(ctx context.Context, args command.Remo } response, err := c.s.client.ApplyEdit(ctx, &protocol.ApplyWorkspaceEditParams{ Edit: protocol.WorkspaceEdit{ - DocumentChanges: []protocol.DocumentChanges{ - { - TextDocumentEdit: &protocol.TextDocumentEdit{ - TextDocument: protocol.OptionalVersionedTextDocumentIdentifier{ - Version: deps.fh.Version(), - TextDocumentIdentifier: protocol.TextDocumentIdentifier{ - URI: deps.fh.URI(), - }, - }, - Edits: protocol.AsAnnotatedTextEdits(edits), - }, - }, - }, + DocumentChanges: documentChanges(deps.fh, edits), }, }) if err != nil { @@ -719,16 +707,9 @@ func applyFileEdits(ctx context.Context, cli protocol.Client, edits []protocol.T if len(edits) == 0 { return nil } - documentChanges := []protocol.DocumentChanges{} // must be a slice - for _, change := range edits { - change := change - documentChanges = append(documentChanges, protocol.DocumentChanges{ - TextDocumentEdit: &change, - }) - } response, err := cli.ApplyEdit(ctx, &protocol.ApplyWorkspaceEditParams{ Edit: protocol.WorkspaceEdit{ - DocumentChanges: documentChanges, + DocumentChanges: protocol.TextDocumentEditsToDocumentChanges(edits), }, }) if err != nil { diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 9f5bb808768..9c784134c9e 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -1473,10 +1473,7 @@ func defaultAnalyzers() map[string]*Analyzer { unusedwrite.Analyzer.Name: {Analyzer: unusedwrite.Analyzer, Enabled: false}, useany.Analyzer.Name: {Analyzer: useany.Analyzer, Enabled: false}, timeformat.Analyzer.Name: {Analyzer: timeformat.Analyzer, Enabled: true}, - embeddirective.Analyzer.Name: { - Analyzer: embeddirective.Analyzer, - Enabled: true, - }, + embeddirective.Analyzer.Name: {Analyzer: embeddirective.Analyzer, Enabled: true}, // gofmt -s suite: simplifycompositelit.Analyzer.Name: { From 39a254580097a5d87be3f9c57fc7a50d534cb13f Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 19 Jan 2024 10:59:24 -0500 Subject: [PATCH 027/105] gopls/internal/version: amend the year in a recent copyright header CL 555457 copied the copyright header from another file without fixing the year. Change-Id: I95e0a732902c6f354105732380fce5f26ee1fbe5 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556819 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/internal/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gopls/internal/version/version.go b/gopls/internal/version/version.go index 1806c994e01..96f18190aff 100644 --- a/gopls/internal/version/version.go +++ b/gopls/internal/version/version.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Go Authors. All rights reserved. +// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. From c7ccb517247187bf7e082ab8413049fef2855aa4 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 16 Jan 2024 13:53:54 -0500 Subject: [PATCH 028/105] gopls/doc/design: rewrite the architecture overview Change-Id: Ice7f00c2109f999bcc3619acb979ae265caadf28 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555977 Auto-Submit: Alan Donovan <adonovan@google.com> Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/doc/design/architecture.svg | 1 + gopls/doc/design/implementation.md | 195 ++++++++++++++++++++++++----- 2 files changed, 162 insertions(+), 34 deletions(-) create mode 100644 gopls/doc/design/architecture.svg diff --git a/gopls/doc/design/architecture.svg b/gopls/doc/design/architecture.svg new file mode 100644 index 00000000000..acd989094da --- /dev/null +++ b/gopls/doc/design/architecture.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 956.7664041994751 541.8188976377953" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l956.7664 0l0 541.8189l-956.7664 0l0 -541.8189z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l956.7664 0l0 541.8189l-956.7664 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path fill="#000000" d="m442.29654 311.78952q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937683 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393158 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406738 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.098999 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m43.66406 297.06683l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385513 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm10.680775 0.53125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937836 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393143 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406586 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.099014 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m495.70633 510.83835l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.2225037 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.729187 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm8.067749 1.125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7960815 -8.359375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.145874 -5.65625q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.221924 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm7.192749 -10.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path fill="#000000" d="m225.00337 501.2064q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.2219086 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.6146393 1.0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135834 0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34373474 -0.21875 0.73435974 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.31248474 0.125 -0.56248474 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm19.088943 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.861908 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.598999 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m66.152145 365.99634l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m40.64583 389.1526l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m56.75477 408.2776q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path fill="#000000" d="m59.306545 359.15073l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.8437462 4.234375l-1.3749962 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173275 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m33.80023 382.30698l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.6406212 -0.34375 1.4687462 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.1718712 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177135 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m49.90917 401.43198q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1874962 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.2812462 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.6093712 -9.84375q-0.703125 0 -1.2343712 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.4687462 0.21875 1.0468712 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m52.460945 352.30515l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m26.954628 375.4614l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m43.06357 394.5864q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m296.97263 403.76367q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026306 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.967926 0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.092926 -8.234375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm2.1896973 10.640625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm11.614655 -8.234375q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm10.097748 -2.8125q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m232.68387 189.9421q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5845337 -1.46875q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm6.8490143 -7.109375l0 5.171875q0 0.921875 0.421875 1.421875q0.421875 0.5 1.28125 0.5q0.625 0 1.171875 -0.28125q0.546875 -0.296875 1.015625 -0.828125l0 -5.984375l1.421875 0l0 8.109375l-0.84375 0q-0.3125 0 -0.390625 -0.296875l-0.109375 -0.875q-0.53125 0.59375 -1.1875 0.953125q-0.65625 0.34375 -1.5 0.34375q-0.65625 0 -1.171875 -0.21875q-0.5 -0.21875 -0.859375 -0.609375q-0.34375 -0.40625 -0.515625 -0.96875q-0.171875 -0.578125 -0.171875 -1.265625l0 -5.171875l1.4375 0zm7.6615143 8.109375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm11.979187 -6.65625q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.1437683 -1.578125q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#000000" d="m239.95792 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm7.2317657 3.25q0.375 0 0.703125 -0.03125q0.328125 -0.046875 0.609375 -0.109375q0.296875 -0.078125 0.546875 -0.171875q0.25 -0.109375 0.5 -0.25l0 -2.109375l-1.484375 0q-0.125 0 -0.203125 -0.0625q-0.0625 -0.078125 -0.0625 -0.1875l0 -0.734375l2.921875 0l0 3.671875q-0.359375 0.25 -0.75 0.453125q-0.390625 0.1875 -0.828125 0.328125q-0.4375 0.125 -0.953125 0.1875q-0.5 0.0625 -1.09375 0.0625q-1.046875 0 -1.921875 -0.359375q-0.859375 -0.359375 -1.484375 -1.0q-0.625 -0.640625 -0.984375 -1.53125q-0.34375 -0.90625 -0.34375 -1.984375q0 -1.09375 0.34375 -1.984375q0.34375 -0.90625 0.984375 -1.546875q0.640625 -0.65625 1.53125 -1.0q0.90625 -0.359375 2.03125 -0.359375q0.5625 0 1.046875 0.09375q0.5 0.078125 0.90625 0.234375q0.421875 0.15625 0.765625 0.375q0.359375 0.21875 0.671875 0.5l-0.375 0.59375q-0.109375 0.171875 -0.296875 0.171875q-0.09375 0 -0.21875 -0.0625q-0.171875 -0.09375 -0.390625 -0.21875q-0.203125 -0.140625 -0.5 -0.265625q-0.296875 -0.125 -0.703125 -0.203125q-0.390625 -0.09375 -0.953125 -0.09375q-0.796875 0 -1.453125 0.265625q-0.65625 0.25 -1.125 0.75q-0.453125 0.484375 -0.703125 1.1875q-0.234375 0.6875 -0.234375 1.5625q0 0.90625 0.25 1.609375q0.265625 0.703125 0.71875 1.203125q0.46875 0.5 1.109375 0.765625q0.640625 0.25 1.421875 0.25zm8.064056 -5.921875q0.734375 0 1.3281097 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59373474 0.234375 -1.3281097 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q0.99998474 0 1.4843597 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.4843597 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm5.4783173 -3.359375q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m372.98822 196.70772l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.417084 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317749 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" d="m363.8027 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.326538 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.263794 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm3.2005615 0.734375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm13.676727 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.426025 0.828125q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.012909 -3.328125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m506.33478 188.59834l1.125 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l1.546875 5.21875q0.0625 0.296875 0.125 0.5625q0.0625 0.265625 0.09375 0.53125q0.0625 -0.265625 0.140625 -0.53125q0.078125 -0.265625 0.171875 -0.5625l1.71875 -5.25q0.03125 -0.109375 0.125 -0.1875q0.109375 -0.09375 0.265625 -0.09375l0.609375 0q0.15625 0 0.265625 0.09375q0.109375 0.078125 0.140625 0.1875l1.671875 5.25q0.09375 0.28125 0.15625 0.5625q0.078125 0.265625 0.140625 0.53125q0.03125 -0.265625 0.09375 -0.546875q0.078125 -0.296875 0.140625 -0.546875l1.578125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.078125 0l-2.625 8.109375l-1.125 0q-0.21875 0 -0.296875 -0.265625l-1.796875 -5.5q-0.0625 -0.1875 -0.109375 -0.375q-0.03125 -0.1875 -0.0625 -0.375q-0.046875 0.1875 -0.09375 0.390625q-0.03125 0.1875 -0.09375 0.359375l-1.8125 5.5q-0.09375 0.265625 -0.328125 0.265625l-1.078125 0l-2.625 -8.109375zm16.59961 -0.125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.614624 1.0l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm7.916687 -11.78125l0 6.9375l0.375 0q0.15625 0 0.265625 -0.046875q0.109375 -0.046875 0.234375 -0.1875l2.5625 -2.734375q0.109375 -0.125 0.234375 -0.203125q0.125 -0.09375 0.3125 -0.09375l1.296875 0l-2.984375 3.1875q-0.109375 0.125 -0.21875 0.234375q-0.109375 0.109375 -0.234375 0.1875q0.140625 0.09375 0.25 0.21875q0.125 0.125 0.21875 0.28125l3.171875 4.0l-1.28125 0q-0.171875 0 -0.296875 -0.0625q-0.125 -0.078125 -0.234375 -0.21875l-2.671875 -3.3125q-0.109375 -0.171875 -0.234375 -0.21875q-0.125 -0.0625 -0.359375 -0.0625l-0.40625 0l0 3.875l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#000000" d="m498.83655 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.3265686 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.2637634 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm1.9122314 -6.015625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm6.7651367 5.625q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m633.3156 196.81828q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135803 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm6.800659 -4.6875l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm8.470947 11.78125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#000000" d="m619.003 208.94579q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.092163 4.296875q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.4589233 2.53125l-2.265625 -3.296875l1.140625 0q0.140625 0 0.203125 0.046875q0.078125 0.046875 0.125 0.125l1.65625 2.546875q0.0625 -0.1875 0.171875 -0.375l1.453125 -2.140625q0.0625 -0.09375 0.125 -0.140625q0.078125 -0.0625 0.171875 -0.0625l1.09375 0l-2.265625 3.21875l2.359375 3.53125l-1.140625 0q-0.140625 0 -0.234375 -0.078125q-0.078125 -0.078125 -0.125 -0.171875l-1.703125 -2.640625q-0.046875 0.1875 -0.140625 0.34375l-1.578125 2.296875q-0.0625 0.09375 -0.140625 0.171875q-0.078125 0.078125 -0.203125 0.078125l-1.0625 0l2.359375 -3.453125zm7.186096 3.5625q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.0338745 0.03125q-0.09375 0.234375 -0.28125 0.34375q-0.1875 0.109375 -0.375 0.109375l-0.5 0l4.0 -9.96875q0.09375 -0.21875 0.25 -0.328125q0.15625 -0.109375 0.375 -0.109375l0.5 0l-3.96875 9.953125zm6.628845 -0.03125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm10.942322 2.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.6696167 -3.90625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm7.0526123 9.8125l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.08313 1.796875q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m277.0359 459.3088l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385529 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path fill="#000000" d="m840.8782 438.76547l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.84906 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm7.4400024 -10.90625l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm4.8928223 14.171875q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm10.45752 -9.15625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm3.8814087 -1.34375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm6.8303223 3.875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m840.14655 451.01797q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm3.045288 6.46875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm8.741699 -4.921875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm2.9249878 1.453125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m620.7594 459.30966l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.33899 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.467957 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.565002 0.875q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm11.959534 1.046875l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.4678955 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m457.1988 462.0588l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm11.175659 7.09375l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm11.088562 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.8682556 -1.046875q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm8.738403 -4.28125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path fill="#000000" d="m439.27795 123.49851q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5624924 -0.203125 1.0468674q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.32811737 -0.1875 -0.5468674q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.1495056 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0zm5.416687 -8.109367l1.171875 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.0625 5.21875q0.109375 0.296875 0.171875 0.5781174q0.0625 0.28125 0.125 0.5625q0.0625 -0.28125 0.125 -0.5625q0.078125 -0.28124237 0.1875 -0.5781174l2.078125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.125 0l-3.3125 8.109367l-1.28125 0l-3.3125 -8.109367zm12.218262 -0.125q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path fill="#000000" d="m437.19943 69.38583l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm7.1584473 5.015625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm2.3032837 9.515625l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.222534 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm6.4479065 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm10.753754 0.4375q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path fill="#000000" d="m447.68848 33.098763q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406433 6.65625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm18.83899 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 269.45407l-59.18109 22.236206" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 269.45407l-53.56447 20.125885" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m134.70233 288.03375l-3.6671753 3.1423645l4.8290863 -0.049987793z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m724.2021 345.2126l66.677185 40.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m724.2021 345.2126l61.54596 37.299713" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m784.89197 383.92487l4.7370605 0.93948364l-3.0249023 -3.764618z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 302.54593l-56.15747 35.590546" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 302.54593l-51.08954 32.378693" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m136.87402 333.52948l-2.9489288 3.8244324l4.7173157 -1.0341492z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 16.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m744.6108 36.760384q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm3.6922607 0.875l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm7.084961 1.09375l-1.28125 0l0 -9.546875l1.28125 0l0 9.546875zm6.9921875 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm7.4104004 -6.03125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041504 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm1.7401123 9.0q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.226013 -0.28125l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.715759 -0.953125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.9429932 -4.265625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457275 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 56.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m741.47015 75.43226q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.2145386 -4.765625q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm11.048279 3.296875q0 1.0625 -0.34375 1.96875q-0.34375 0.890625 -0.96875 1.546875q-0.609375 0.640625 -1.484375 1.0q-0.859375 0.34375 -1.921875 0.34375q-1.046875 0 -1.921875 -0.34375q-0.859375 -0.359375 -1.484375 -1.0q-0.609375 -0.65625 -0.953125 -1.546875q-0.34375 -0.90625 -0.34375 -1.96875q0 -1.078125 0.34375 -1.96875q0.34375 -0.90625 0.953125 -1.546875q0.625 -0.65625 1.484375 -1.015625q0.875 -0.359375 1.921875 -0.359375q1.0625 0 1.921875 0.359375q0.875 0.359375 1.484375 1.015625q0.625 0.640625 0.96875 1.546875q0.34375 0.890625 0.34375 1.96875zm-1.328125 0q0 -0.890625 -0.25 -1.578125q-0.234375 -0.703125 -0.671875 -1.1875q-0.4375 -0.484375 -1.0625 -0.734375q-0.625 -0.265625 -1.40625 -0.265625q-0.765625 0 -1.390625 0.265625q-0.625 0.25 -1.078125 0.734375q-0.4375 0.484375 -0.671875 1.1875q-0.234375 0.6875 -0.234375 1.578125q0 0.875 0.234375 1.578125q0.234375 0.6875 0.671875 1.171875q0.453125 0.484375 1.078125 0.75q0.625 0.25 1.390625 0.25q0.78125 0 1.40625 -0.25q0.625 -0.265625 1.0625 -0.75q0.4375 -0.484375 0.671875 -1.171875q0.25 -0.703125 0.25 -1.578125zm3.7608032 -4.78125q0.171875 0 0.25 0.046875q0.09375 0.03125 0.1875 0.171875l5.53125 7.203125q-0.015625 -0.1875 -0.03125 -0.34375q0 -0.15625 0 -0.3125l0 -6.765625l1.140625 0l0 9.546875l-0.65625 0q-0.15625 0 -0.265625 -0.046875q-0.09375 -0.0625 -0.1875 -0.1875l-5.53125 -7.1875q0.015625 0.171875 0.015625 0.328125q0.015625 0.15625 0.015625 0.296875l0 6.796875l-1.140625 0l0 -9.546875l0.671875 0l0 0zm10.825989 5.5625l0 3.984375l-1.28125 0l0 -9.546875l2.6875 0q0.90625 0 1.5625 0.1875q0.671875 0.171875 1.09375 0.53125q0.4375 0.34375 0.640625 0.828125q0.203125 0.484375 0.203125 1.09375q0 0.515625 -0.15625 0.953125q-0.15625 0.4375 -0.46875 0.796875q-0.296875 0.34375 -0.734375 0.59375q-0.4375 0.234375 -0.984375 0.359375q0.234375 0.140625 0.421875 0.40625l2.78125 3.796875l-1.140625 0q-0.359375 0 -0.515625 -0.265625l-2.484375 -3.421875q-0.109375 -0.15625 -0.25 -0.21875q-0.125 -0.078125 -0.390625 -0.078125l-0.984375 0zm0 -0.9375l1.359375 0q0.5625 0 0.984375 -0.140625q0.4375 -0.140625 0.71875 -0.390625q0.296875 -0.25 0.4375 -0.59375q0.15625 -0.34375 0.15625 -0.765625q0 -0.84375 -0.5625 -1.28125q-0.5625 -0.4375 -1.6875 -0.4375l-1.40625 0l0 3.609375zm8.583313 1.34375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.455933 2.625q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm8.655151 -3.671875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm7.9904175 0l0 -9.8125l1.1875 0l0 4.03125q0.421875 -0.484375 0.96875 -0.78125q0.546875 -0.296875 1.234375 -0.296875q0.59375 0 1.0625 0.21875q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.578125 1.109375q-0.375 0.46875 -0.921875 0.75q-0.53125 0.265625 -1.21875 0.265625q-0.640625 0 -1.109375 -0.25q-0.453125 -0.25 -0.796875 -0.703125l-0.0625 0.609375q-0.046875 0.25 -0.296875 0.25l-0.765625 0zm3.015625 -5.90625q-0.59375 0 -1.03125 0.265625q-0.421875 0.265625 -0.796875 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.859375 0.171875q0.953125 0 1.453125 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.7160034 -0.84375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.160461 0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.3253784 -5.890625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm8.404419 -2.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 104.92913l180.72443 0l0 35.590553l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 125.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm12.981384 -1.046875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 184.92914l180.72443 0l0 35.590546l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 205.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.335022 1.09375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm5.560669 -3.453125l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm11.3479 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm7.1480103 -6.140625q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.201233 -3.5625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm7.1187744 5.984375l0 -5.734375l-0.734375 -0.09375q-0.140625 -0.03125 -0.234375 -0.09375q-0.09375 -0.078125 -0.09375 -0.203125l0 -0.5l1.0625 0l0 -0.640625q0 -0.578125 0.15625 -1.03125q0.171875 -0.453125 0.46875 -0.765625q0.3125 -0.3125 0.734375 -0.46875q0.4375 -0.15625 0.96875 -0.15625q0.453125 0 0.828125 0.125l-0.015625 0.59375q-0.015625 0.140625 -0.125 0.171875q-0.09375 0.015625 -0.296875 0.015625l-0.203125 0q-0.3125 0 -0.5625 0.09375q-0.234375 0.078125 -0.421875 0.265625q-0.1875 0.171875 -0.28125 0.46875q-0.09375 0.28125 -0.09375 0.71875l0 0.609375l1.953125 0l0 0.875l-1.90625 0l0 5.75l-1.203125 0zm6.897766 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm9.249573 5.984375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.9557495 -6.859375l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm6.3791504 6.75l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.71906 256.92914l195.71655 0l0 35.590546l-195.71655 0z" fill-rule="evenodd"/><path fill="#000000" d="m742.7659 270.66663q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm1.9857788 8.0625l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 3.0l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm8.216492 0.265625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 5.640625l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.144775 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229614 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm2.5807495 -0.921875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm4.897827 -5.9375l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm8.99585 0l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.4058228 -0.765625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm10.327209 5.9375q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm9.616577 -4.828125q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155762 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm7.0666504 -0.8125q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125z" fill-rule="nonzero"/><path fill="#000000" d="m736.8128 287.97913l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm9.624512 4.171875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 7.921875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.476074 -4.828125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.286743 -1.3125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.9370117 5.171875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.069763 -5.9375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm6.3533325 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm12.636475 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm6.5682373 8.875q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966003 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9136353 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.2526245 -6.859375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m744.3753 301.18225l0 1.078125l-3.078125 0l0 8.46875l-1.296875 0l0 -8.46875l-3.09375 0l0 -1.078125l7.46875 0zm1.9604492 11.546875q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133667 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm11.462463 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm1.6148682 5.546875l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.082275 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.890137 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.8492432 -4.265625l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm7.0776367 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.691711 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375z" fill-rule="nonzero"/><path fill="#000000" d="m745.7347 326.72913l-1.0 0q-0.171875 0 -0.28125 -0.078125q-0.109375 -0.09375 -0.15625 -0.234375l-0.890625 -2.296875l-4.28125 0l-0.90625 2.296875q-0.046875 0.125 -0.15625 0.21875q-0.109375 0.09375 -0.28125 0.09375l-1.0 0l3.828125 -9.546875l1.3125 0l3.8125 9.546875zm-6.25 -3.546875l3.5625 0l-1.5 -3.890625q-0.15625 -0.359375 -0.296875 -0.890625q-0.0625 0.265625 -0.140625 0.5q-0.0625 0.234375 -0.125 0.40625l-1.5 3.875zm7.2662354 3.546875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm4.0682373 11.8125q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm8.7146 -7.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm9.231689 5.640625q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm4.9972534 0.859375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.699341 -6.75l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm0.9744873 2.125l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 437.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m86.16409 453.50504l0.484375 0q0.25 0 0.40625 -0.0625q0.15625 -0.0625 0.28125 -0.21875l3.1875 -3.609375q0.140625 -0.15625 0.265625 -0.21875q0.140625 -0.078125 0.359375 -0.078125l1.09375 0l-3.625 4.109375q-0.140625 0.15625 -0.265625 0.265625q-0.125 0.09375 -0.265625 0.171875q0.1875 0.0625 0.328125 0.1875q0.140625 0.109375 0.296875 0.28125l3.796875 4.53125l-1.125 0q-0.125 0 -0.21875 -0.015625q-0.078125 -0.03125 -0.140625 -0.0625q-0.0625 -0.03125 -0.125 -0.078125q-0.046875 -0.0625 -0.109375 -0.109375l-3.296875 -3.796875q-0.0625 -0.078125 -0.125 -0.140625q-0.0625 -0.0625 -0.15625 -0.09375q-0.078125 -0.046875 -0.1875 -0.0625q-0.109375 -0.015625 -0.265625 -0.015625l-0.59375 0l0 4.375l-1.28125 0l0 -9.546875l1.28125 0l0 4.1875zm9.8989105 -1.5q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm6.0918274 7.984375q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm12.161911 -2.0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966019 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9135895 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm7.8932495 -0.109375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.485901 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.9088745 1.890625q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133514 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155792 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 485.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m97.31447 505.77066l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444382 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5951233 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.106384 6.875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm4.3414764 5.90625l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.105591 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229156 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.285416 -4.71875q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.3492126 -1.3125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041656 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-66.665665 229.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m14.926851 247.2863l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.005951 -2.265625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.2343769 0.0625 0.4218769 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.2031269 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm9.246218 -5.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.237503 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5624962 0 0.9843712 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0624962 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457287 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm9.371811 -5.75q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760406 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m18.737534 17.942257l124.06299 0l0 35.590553l-124.06299 0z" fill-rule="evenodd"/><path fill="#000000" d="m32.487534 36.44538q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.1051636 3.296875l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.8667145 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.920227 -0.90625l2.0625 0l0 -6.515625q0 -0.28125 0.015625 -0.59375l-1.703125 1.46875q-0.0625 0.046875 -0.140625 0.078125q-0.0625 0.015625 -0.125 0.015625q-0.09375 0 -0.171875 -0.03125q-0.078125 -0.046875 -0.125 -0.109375l-0.375 -0.515625l2.84375 -2.453125l0.96875 0l0 8.65625l1.875 0l0 0.90625l-5.125 0l0 -0.90625zm10.152161 -4.9375q0.578125 0 1.09375 0.1875q0.515625 0.1875 0.890625 0.546875q0.390625 0.359375 0.609375 0.890625q0.234375 0.53125 0.234375 1.21875q0 0.65625 -0.25 1.21875q-0.234375 0.5625 -0.671875 0.984375q-0.421875 0.421875 -1.03125 0.671875q-0.59375 0.234375 -1.328125 0.234375q-0.71875 0 -1.296875 -0.234375q-0.578125 -0.234375 -1.0 -0.65625q-0.40625 -0.421875 -0.640625 -1.015625q-0.21875 -0.609375 -0.21875 -1.359375q0 -0.625 0.28125 -1.328125q0.28125 -0.703125 0.890625 -1.515625l2.421875 -3.265625q0.078125 -0.125 0.25 -0.203125q0.171875 -0.078125 0.375 -0.078125l1.0625 0l-3.3125 4.1875q0.34375 -0.234375 0.75 -0.359375q0.421875 -0.125 0.890625 -0.125zm-2.46875 2.890625q0 0.46875 0.125 0.859375q0.140625 0.375 0.390625 0.65625q0.265625 0.265625 0.640625 0.421875q0.375 0.140625 0.84375 0.140625q0.484375 0 0.859375 -0.15625q0.390625 -0.15625 0.671875 -0.421875q0.28125 -0.28125 0.421875 -0.65625q0.15625 -0.375 0.15625 -0.8125q0 -0.46875 -0.15625 -0.84375q-0.140625 -0.375 -0.40625 -0.640625q-0.265625 -0.265625 -0.640625 -0.390625q-0.375 -0.140625 -0.828125 -0.140625q-0.46875 0 -0.859375 0.15625q-0.390625 0.15625 -0.65625 0.4375q-0.265625 0.28125 -0.421875 0.640625q-0.140625 0.359375 -0.140625 0.75zm12.443222 -6.703125q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm11.058411 4.890625q0 1.25 -0.265625 2.171875q-0.265625 0.90625 -0.734375 1.515625q-0.46875 0.59375 -1.109375 0.890625q-0.640625 0.28125 -1.359375 0.28125q-0.734375 0 -1.375 -0.28125q-0.625 -0.296875 -1.09375 -0.890625q-0.453125 -0.609375 -0.71875 -1.515625q-0.265625 -0.921875 -0.265625 -2.171875q0 -1.265625 0.265625 -2.171875q0.265625 -0.921875 0.71875 -1.515625q0.46875 -0.609375 1.09375 -0.90625q0.640625 -0.296875 1.375 -0.296875q0.71875 0 1.359375 0.296875q0.640625 0.296875 1.109375 0.90625q0.46875 0.59375 0.734375 1.515625q0.265625 0.90625 0.265625 2.171875zm-1.234375 0q0 -1.09375 -0.1875 -1.828125q-0.171875 -0.75 -0.484375 -1.203125q-0.3125 -0.453125 -0.71875 -0.65625q-0.40625 -0.203125 -0.84375 -0.203125q-0.4375 0 -0.84375 0.203125q-0.40625 0.203125 -0.71875 0.65625q-0.296875 0.453125 -0.484375 1.203125q-0.1875 0.734375 -0.1875 1.828125q0 1.09375 0.1875 1.828125q0.1875 0.734375 0.484375 1.1875q0.3125 0.453125 0.71875 0.65625q0.40625 0.1875 0.84375 0.1875q0.4375 0 0.84375 -0.1875q0.40625 -0.203125 0.71875 -0.65625q0.3125 -0.453125 0.484375 -1.1875q0.1875 -0.734375 0.1875 -1.828125zm5.6365356 -4.890625q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm9.745911 6.21875l1.453125 0l0 0.671875q0 0.109375 -0.0625 0.1875q-0.0625 0.0625 -0.203125 0.0625l-1.1875 0l0 2.515625l-1.046875 0l0 -2.515625l-4.234375 0q-0.125 0 -0.234375 -0.078125q-0.09375 -0.078125 -0.109375 -0.1875l-0.125 -0.609375l4.640625 -6.15625l1.109375 0l0 6.109375zm-1.046875 -3.953125q0 -0.171875 0 -0.359375q0.015625 -0.203125 0.0625 -0.421875l-3.484375 4.734375l3.421875 0l0 -3.953125z" fill-rule="nonzero"/></g></svg> \ No newline at end of file diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index f8d734f92ef..cd15b890e69 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -1,46 +1,173 @@ -# gopls implementation documentation -This is not intended as a complete description of the implementation, for the most the part the package godoc, code comments and the code itself hold that. -Instead this is meant to be a guide into finding parts of the implementation, and understanding some core concepts used throughout the implementation. +# Gopls architecture -## View/Session/Cache +Last major update: Jan 16 2024 -Throughout the code there are references to these three concepts, and they build on each other. +This doc presents a high-level overview of the structure of gopls to +help new contributors find their way. It is not intended to be a +complete description of the implementation, nor even of any key +components; for that, the package documentation (linked below) and +other comments within the code are a better guide. -At the base is the *Cache*. This is the level at which we hold information that is global in nature, for instance information about the file system and its contents. +The diagram below shows selected components of the gopls module and +their relationship to each other according to the Go import graph. +Tests and test infrastructure are not shown, nor are utility packages, +nor packages from the [x/tools] module. For brevity, packages are +referred to by their last segment, which is usually unambiguous. -Above that is the *Session*, which holds information for a connection to an editor. This layer hold things like the edited files (referred to as overlays). +The height of each blob corresponds loosely to its technical depth. +Some blocks are wide and shallow, such as [protocol], which declares +Go types for the entire LSP protocol. Others are deep, such as [cache] +and [source], as they contain a lot of dense logic and algorithms. -The top layer is called the *View*. This holds the configuration, and the mapping to configured packages. +<!-- Source: https://docs.google.com/drawings/d/1CK6YSLt7G3svRoZf7skJI-lxRol2VI90YOxHcYS0DP4 --> +![Gopls architecture](architecture.svg) -The purpose of this layering is to allow a single editor session to have multiple views active whilst still sharing as much information as possible for efficiency. -In theory if only the View layer existed, the results would be identical, but slower and using more memory. +Starting from the bottom, we'll describe the various components. -## Code location +The lowest layer defines the request and response types of the +Language Server Protocol: -gopls will be developed in the [x/tools] Go repository; the core packages are in [internal/lsp], and the binary and integration tests are located in [gopls]. +- The [protocol] package defines the standard protocol; it is mostly + generated mechanically from the schema definition provided by + Microsoft. + The most important type is DocumentURI, which represents a `file:` + URL that identifies a client editor document. It also provides + `Mapper`, which maps between the different coordinate systems used + for source positions: UTF-8, UTF-16, and token.Pos. -Below is a list of the core packages of gopls, and their primary purpose: +- The [command] package defines Gopls's non-standard commands, which + are all invoked through the `workspace/executeCommand` extension + mechanism. These commands are typically returned by the server as + continuations of Code Actions or Code Lenses; most clients do not + construct calls to them directly. -Package | Description ---- | --- -[gopls] | the main binary, plugins and integration tests -[internal/lsp] | the core message handling package -[internal/lsp/cache] | the cache layer -[internal/cmd] | the gopls command line layer -[internal/debug] | features to aid in debugging gopls -[internal/lsp/protocol] | the types of LSP request and response messages -[internal/lsp/source] | the core feature implementations -[internal/memoize] | a function invocation cache used to reduce the work done -[internal/jsonrpc2] | an implementation of the JSON RPC2 specification +The next layer defines a number of important and very widely used data structures: -[gopls]: https://github.com/golang/tools/tree/master/gopls -[internal/jsonrpc2]: https://github.com/golang/tools/tree/master/internal/jsonrpc2 -[internal/lsp]: https://github.com/golang/tools/tree/master/gopls/internal/lsp -[internal/lsp/cache]: https://github.com/golang/tools/tree/master/gopls/internal/lsp/cache -[internal/cmd]: https://github.com/golang/tools/tree/master/gopls/internal/cmd -[internal/debug]: https://github.com/golang/tools/tree/master/gopls/internal/lsp/debug -[internal/lsp/source]: https://github.com/golang/tools/tree/master/gopls/internal/lsp/source -[internal/memoize]: https://github.com/golang/tools/tree/master/internal/memoize -[internal/lsp/protocol]: https://github.com/golang/tools/tree/master/gopls/internal/lsp/protocol -[x/tools]: https://github.com/golang/tools +- The [file] package defines the primary abstractions of a client + file: its `Identity` (URI and content hash), and its `Handle` (which + additionally provides the version and content of a particular + snapshot of the file. + +- The [parsego] package defines `File`, the parsed form of a Go source + file, including its content, syntax tree, and coordinary mappings + (Mapper and token.File). The package performs various kinds of tree + repair to work around error-recovery shortcomings of the Go parser. + +- The [metadata] package defines `Package`, an abstraction of the + metadata of a Go package, similar to the output of `go list -json`. + Metadata is produced from [go/packages], which takes + care of invoking `go list`. (Users report that it works to some extent + with a GOPACKAGESDRIVER for Bazel, though we maintain no tests for this + scenario.) + + The package also provides `Graph`, the complete import graph for a + workspace; each graph node is a `Package`. + +The [settings] layer defines the data structure (effectively a large +tree) for gopls configuration options, along with its JSON encoding. + +The [cache] layer is the largest and most complex component of gopls. +It is concerned with state management, dependency analysis, and invalidation: +the `Session` of communication with the client; +the `Folder`s that the client has opened; +the `View` of a particular workspace tree with particular build +options; +the `Snapshot` of the state of all files in the workspace after a +particular edit operation; +the contents of all files, whether saved to disk (`DiskFile`) or +edited and unsaved (`Overlay`); +the `Cache` of in-memory memoized computations, +such as parsing go.mod files or build the symbol index; +and the `Package`, which holds the results of type checking a package +from Go syntax. + +The cache layer depends on various auxiliary packages, including: + +- The [filecache] package, which manages gopls' persistent, transactional, + file-based key/value store. + +- The [xrefs], [methodsets], and [typerefs] packages define algorithms + for constructing indexes of information derived from type-checking, + and for encoding and decoding these serializable indexes in the file + cache. + + Together these packages enable the fast restart, reduced memory + consumption, and synergy across processes that were delivered by the + v0.12 redesign and described in ["Scaling gopls for the growing Go + ecosystem"](https://go.dev/blog/gopls-scalability). + +The cache also defines gopls's [go/analysis] driver, which runs +modular analysis (similar to `go vet`) across the workspace. +Gopls also includes a number of analysis passes that are not part of vet. + +The next layer defines four packages, each for handling files in a +particular language: +[mod] for go.mod files; +[work] for go.work files; +[template] for files in `text/template` syntax; and +[source], for files in Go itself. +This package, by far the largest, provides the main features of gopls: +navigation, analysis, and refactoring of Go code. +As most users imagine it, this package _is_ gopls. + +The [server] package defines the LSP service implementation, with one +handler method per LSP request type. Each handler switches on the type +of the file and dispatches to one of the four language-specific +packages. + +The [lsprpc] package connects the service interface to our [JSON RPC](jsonrpc2) +server. + +Bear in mind that the diagram is a dependency graph, a "static" +viewpoint of the program's structure. A more dynamic viewpoint would +order the packages based on the sequence in which they are encountered +during processing of a particular request; in such a view, the bottom +layer would represent the "wire" (protocol and command), the next +layer up would hold the RPC-related packages (lsprpc and server), and +features (e.g. source, mod, work, template) would be at the top. + +<!-- +A dynamic view would be an interesting topic for another article. +This slide deck [requires Google network] +The Life of a (gopls) Query (Oct 2021) +https://docs.google.com/presentation/d/1c8XJaIldzii-F3YvEOPWHK_MQJ_o8ua5Bct1yDa3ZlU +provides useful (if somewhat out of date) information. +--> + +The [cmd] package defines the command-line interface of the `gopls` +command, around which gopls's main package is just a trivial wrapper. +It is usually run without arguments, causing it to start a server and +listen indefinitely. +It also provides a number of subcommands that start a server, make a +single request to it, and exit, providing traditional batch-command +access to server functionality. These subcommands are primarily +provided as a debugging aid (but see +[#63693](https://github.com/golang/go/issues/63693)). + +[cache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache +[cmd]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cmd +[command]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/command +[debug]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/debug +[file]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/file +[filecache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/filecache +[go/analysis]: https://pkg.go.dev/golang.org/x/tools@master/go/analysis +[go/packages]: https://pkg.go.dev/golang.org/x/tools@master/go/packages +[gopls]: https://pkg.go.dev/golang.org/x/tools/gopls@master +[jsonrpc2]: https://pkg.go.dev/golang.org/x/tools@master/internal/jsonrpc2 +[lsp]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp +[lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/lsprpc +[memoize]: https://github.com/golang/tools/tree/master/internal/memoize +[metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/metadata +[methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/methodsets +[mod]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/mod +[parsego]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/parsego +[protocol]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/protocol +[server]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/server +[settings]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/settings +[source]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/source +[template]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/template +[typerefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/typerefs +[work]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/work +[x/tools]: https://github.com/golang/tools@master +[xrefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/xrefs From 525acd12716c6507d167d72597191c066bd83d1a Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 14:06:50 -0500 Subject: [PATCH 029/105] go/analysis/internal/analysisflags: add RelatedInformation JSON This change adds RelatedInformation to the JSON output of the analysis tools. (None of the analyzers we maintain currently uses this field.) Also, tighten up the doc comments. Fixes golang/go#64548 Change-Id: I7087858083c1eec917e00fe840c2a5aa8eb2e898 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556820 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Matloob <matloob@golang.org> --- go/analysis/diagnostic.go | 17 +++++------ go/analysis/internal/analysisflags/flags.go | 33 ++++++++++++++++----- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/go/analysis/diagnostic.go b/go/analysis/diagnostic.go index f67c97294b5..c638f275819 100644 --- a/go/analysis/diagnostic.go +++ b/go/analysis/diagnostic.go @@ -31,14 +31,14 @@ type Diagnostic struct { // see https://pkg.go.dev/net/url#URL.ResolveReference. URL string - // SuggestedFixes contains suggested fixes for a diagnostic - // which can be used to perform edits to a file that address - // the diagnostic. - // - // Diagnostics should not contain SuggestedFixes that overlap. - SuggestedFixes []SuggestedFix // optional + // SuggestedFixes is an optional list of fixes to address the + // problem described by the diagnostic, each one representing + // an alternative strategy; at most one may be applied. + SuggestedFixes []SuggestedFix - Related []RelatedInformation // optional + // Related contains optional secondary positions and messages + // related to the primary diagnostic. + Related []RelatedInformation } // RelatedInformation contains information related to a diagnostic. @@ -55,8 +55,7 @@ type RelatedInformation struct { // user can choose to apply to their code. Usually the SuggestedFix is // meant to fix the issue flagged by the diagnostic. // -// TextEdits for a SuggestedFix should not overlap, -// nor contain edits for other packages. +// The TextEdits must not overlap, nor contain edits for other packages. type SuggestedFix struct { // A description for this suggested fix to be shown to a user deciding // whether to accept it. diff --git a/go/analysis/internal/analysisflags/flags.go b/go/analysis/internal/analysisflags/flags.go index 9e3fde72bb6..ff14ff58f9c 100644 --- a/go/analysis/internal/analysisflags/flags.go +++ b/go/analysis/internal/analysisflags/flags.go @@ -362,15 +362,24 @@ type JSONSuggestedFix struct { Edits []JSONTextEdit `json:"edits"` } -// A JSONDiagnostic can be used to encode and decode analysis.Diagnostics to and -// from JSON. -// TODO(matloob): Should the JSON diagnostics contain ranges? -// If so, how should they be formatted? +// A JSONDiagnostic describes the JSON schema of an analysis.Diagnostic. +// +// TODO(matloob): include End position if present. type JSONDiagnostic struct { - Category string `json:"category,omitempty"` - Posn string `json:"posn"` - Message string `json:"message"` - SuggestedFixes []JSONSuggestedFix `json:"suggested_fixes,omitempty"` + Category string `json:"category,omitempty"` + Posn string `json:"posn"` // e.g. "file.go:line:column" + Message string `json:"message"` + SuggestedFixes []JSONSuggestedFix `json:"suggested_fixes,omitempty"` + Related []JSONRelatedInformation `json:"related,omitempty"` +} + +// A JSONRelated describes a secondary position and message related to +// a primary diagnostic. +// +// TODO(adonovan): include End position if present. +type JSONRelatedInformation struct { + Posn string `json:"posn"` // e.g. "file.go:line:column" + Message string `json:"message"` } // Add adds the result of analysis 'name' on package 'id'. @@ -401,11 +410,19 @@ func (tree JSONTree) Add(fset *token.FileSet, id, name string, diags []analysis. Edits: edits, }) } + var related []JSONRelatedInformation + for _, r := range f.Related { + related = append(related, JSONRelatedInformation{ + Posn: fset.Position(r.Pos).String(), + Message: r.Message, + }) + } jdiag := JSONDiagnostic{ Category: f.Category, Posn: fset.Position(f.Pos).String(), Message: f.Message, SuggestedFixes: fixes, + Related: related, } diagnostics = append(diagnostics, jdiag) } From afcd676c52066db958f27fdc7153ab765291dfd5 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 12 Jan 2024 13:31:56 -0500 Subject: [PATCH 030/105] gopls/internal/lsp/source: show promoted methods in hover This change updates the logic to display the method set of the selected type so that: - it includes promoted methods; - it includes interface methods, if that would not be redundant with the syntax of the the type; - receiver variables are properly named, and have a pointer type if appropriate. Fixes golang/go#61634 Updates golang/go#56331 Change-Id: Ied9c06c36178424575012adb8fde0b1ddbd688c3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/555456 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/source/hover.go | 47 +++++++++---- .../test/marker/testdata/definition/embed.txt | 6 +- .../test/marker/testdata/definition/misc.txt | 2 + .../test/marker/testdata/hover/godef.txt | 15 +++-- .../test/marker/testdata/hover/linkable.txt | 4 +- .../testdata/hover/linkable_generics.txt | 6 +- .../test/marker/testdata/hover/methods.txt | 67 +++++++++++++++++++ 7 files changed, 120 insertions(+), 27 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/hover/methods.txt diff --git a/gopls/internal/lsp/source/hover.go b/gopls/internal/lsp/source/hover.go index cb051a6e90b..bcd963f7624 100644 --- a/gopls/internal/lsp/source/hover.go +++ b/gopls/internal/lsp/source/hover.go @@ -244,23 +244,42 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro return protocol.Range{}, nil, err } - // Display the declared methods accessible from the identifier. - // - // (The format.Node call above displays any struct fields, public - // or private, in syntactic form. We choose not to recursively - // enumerate any fields and methods promoted from them.) - if !types.IsInterface(obj.Type()) { - sep := "\n\n" - for _, m := range typeutil.IntuitiveMethodSet(obj.Type(), nil) { - // Show direct methods that are either exported, or defined in the - // current package. - if (m.Obj().Exported() || m.Obj().Pkg() == pkg.GetTypes()) && len(m.Index()) == 1 { - b.WriteString(sep) - sep = "\n" - b.WriteString(types.ObjectString(m.Obj(), qf)) + // For an interface type, explicit methods will have + // already been displayed when the node was formatted + // above. Don't list these again. + var skip map[string]bool + if iface, ok := spec.Type.(*ast.InterfaceType); ok { + if iface.Methods.List != nil { + for _, m := range iface.Methods.List { + if len(m.Names) == 1 { + if skip == nil { + skip = make(map[string]bool) + } + skip[m.Names[0].Name] = true + } } } } + + // Display all the type's accessible methods, + // including those that require a pointer receiver, + // and those promoted from embedded struct fields or + // embedded interfaces. + sep := "\n\n" + for _, m := range typeutil.IntuitiveMethodSet(obj.Type(), nil) { + if m.Obj().Pkg() != pkg.GetTypes() && !m.Obj().Exported() { + continue // inaccessible + } + if skip[m.Obj().Name()] { + continue // redundant with format.Node above + } + b.WriteString(sep) + sep = "\n" + + // Use objectString for its prettier rendering of method receivers. + b.WriteString(objectString(m.Obj(), qf, token.NoPos, nil, nil)) + } + signature = b.String() } diff --git a/gopls/internal/test/marker/testdata/definition/embed.txt b/gopls/internal/test/marker/testdata/definition/embed.txt index 3212c147e3e..2ac092cc7a4 100644 --- a/gopls/internal/test/marker/testdata/definition/embed.txt +++ b/gopls/internal/test/marker/testdata/definition/embed.txt @@ -208,6 +208,8 @@ type S2 struct { F2 int //@loc(S2F2, "F2") *a.A //@def("A", AString),def("a",AImport) } + +func (a.A) Hi() ``` [`b.S2` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S2) @@ -242,7 +244,7 @@ field Field int ```go type A string -func (a.A).Hi() +func (a.A) Hi() ``` @loc(AString, "A") @@ -253,7 +255,7 @@ func (a.A).Hi() ```go type aAlias = a.A -func (a.A).Hi() +func (a.A) Hi() ``` @loc(aAlias, "aAlias") diff --git a/gopls/internal/test/marker/testdata/definition/misc.txt b/gopls/internal/test/marker/testdata/definition/misc.txt index 2ab637a3ed4..86f921deb71 100644 --- a/gopls/internal/test/marker/testdata/definition/misc.txt +++ b/gopls/internal/test/marker/testdata/definition/misc.txt @@ -175,6 +175,8 @@ type I interface { B() J } + +func (J) Hello() ``` [`a.I` on pkg.go.dev](https://pkg.go.dev/mod.com#I) diff --git a/gopls/internal/test/marker/testdata/hover/godef.txt b/gopls/internal/test/marker/testdata/hover/godef.txt index 9a3af0046fc..101ddaf1961 100644 --- a/gopls/internal/test/marker/testdata/hover/godef.txt +++ b/gopls/internal/test/marker/testdata/hover/godef.txt @@ -115,10 +115,10 @@ type Thing struct { Member string //@loc(Member, "Member") } -func (Thing).Method(i int) string -func (*Thing).Method2(i int, j int) (error, string) -func (Thing).Method3() -func (*Thing).private() +func (t Thing) Method(i int) string +func (t *Thing) Method2(i int, j int) (error, string) +func (t Thing) Method3() +func (t *Thing) private() ``` [`a.Thing` on pkg.go.dev](https://pkg.go.dev/godef.test/a#Thing) @@ -129,8 +129,11 @@ type NextThing struct { Value int } -func (*NextThing).Method3() int -func (NextThing).another() string +func (t Thing) Method(i int) string +func (t *Thing) Method2(i int, j int) (error, string) +func (n *NextThing) Method3() int +func (n NextThing) another() string +func (t *Thing) private() ``` [`a.NextThing` on pkg.go.dev](https://pkg.go.dev/godef.test/a#NextThing) diff --git a/gopls/internal/test/marker/testdata/hover/linkable.txt b/gopls/internal/test/marker/testdata/hover/linkable.txt index 2664bd50d3b..03dc871de90 100644 --- a/gopls/internal/test/marker/testdata/hover/linkable.txt +++ b/gopls/internal/test/marker/testdata/hover/linkable.txt @@ -104,8 +104,8 @@ type T struct { } } -func (T).M() -func (T).m() +func (T) M() +func (T) m() ``` T is in the package scope, and so should be linkable. diff --git a/gopls/internal/test/marker/testdata/hover/linkable_generics.txt b/gopls/internal/test/marker/testdata/hover/linkable_generics.txt index 0f9f0f06c5d..686760ff822 100644 --- a/gopls/internal/test/marker/testdata/hover/linkable_generics.txt +++ b/gopls/internal/test/marker/testdata/hover/linkable_generics.txt @@ -67,7 +67,7 @@ type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } -func (GT[P]).M(p P) +func (GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. @@ -86,7 +86,7 @@ type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } -func (GT[P]).M(p P) +func (GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. @@ -136,7 +136,7 @@ type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } -func (generic.GT[P]).M(p P) +func (generic.GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. diff --git a/gopls/internal/test/marker/testdata/hover/methods.txt b/gopls/internal/test/marker/testdata/hover/methods.txt new file mode 100644 index 00000000000..7a851ad99ec --- /dev/null +++ b/gopls/internal/test/marker/testdata/hover/methods.txt @@ -0,0 +1,67 @@ +This test checks the formatting of the list of accessible methods. + +Observe that: +- interface methods that appear in the syntax are not repeated + in the method set of the type; +- promoted methods of structs are shown; +- receiver variables are correctly named; +- receiver variables have a pointer type if appropriate; +- only accessible methods are shown. + +-- go.mod -- +module testdata + +-- lib/lib.go -- +package lib + +type I interface { + A() + b() + J +} + +type J interface { C() } + +type S struct { I } +func (s S) A() {} +func (s S) b() {} +func (s *S) PA() {} +func (s *S) pb() {} + +-- a/a.go -- +package a + +import "testdata/lib" + +var _ lib.I //@hover("I", "I", I) +var _ lib.J //@hover("J", "J", J) +var _ lib.S //@hover("S", "S", S) + +-- @I -- +```go +type I interface { + A() + b() + J +} + +func (lib.J) C() +``` + +[`lib.I` on pkg.go.dev](https://pkg.go.dev/testdata/lib#I) +-- @J -- +```go +type J interface{ C() } +``` + +[`lib.J` on pkg.go.dev](https://pkg.go.dev/testdata/lib#J) +-- @S -- +```go +type S struct{ I } + +func (s lib.S) A() +func (lib.J) C() +func (s *lib.S) PA() +``` + +[`lib.S` on pkg.go.dev](https://pkg.go.dev/testdata/lib#S) From 1871a2e93fd1599c36364e495a2bb0ff0347f621 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 10:51:12 -0500 Subject: [PATCH 031/105] gopls/internal/lsp/source: move Go CodeActions logic from server This change moves all the logic in server for Go-specific code actions to source.CodeActions. Some symbols are renamed, documented, and unexported. Unexporting several functions caused the brand-new unusedparams analyzer (on whose behalf this work was done) to report unused parameters, allowing further deletions. Yay. No behavior changes. Change-Id: I72b6ca45137a24bf855f3c7418bbe8b26ed0aefa Reviewed-on: https://go-review.googlesource.com/c/tools/+/556818 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/lsp/cache/errors.go | 25 - gopls/internal/lsp/source/change_quote.go | 2 +- gopls/internal/lsp/source/change_signature.go | 2 +- gopls/internal/lsp/source/codeaction.go | 542 ++++++++++++++++ gopls/internal/lsp/source/fix.go | 24 +- gopls/internal/lsp/source/format.go | 34 +- gopls/internal/server/code_action.go | 596 ++---------------- 7 files changed, 615 insertions(+), 610 deletions(-) create mode 100644 gopls/internal/lsp/source/codeaction.go diff --git a/gopls/internal/lsp/cache/errors.go b/gopls/internal/lsp/cache/errors.go index 4e7101a3da3..62da954e008 100644 --- a/gopls/internal/lsp/cache/errors.go +++ b/gopls/internal/lsp/cache/errors.go @@ -393,31 +393,6 @@ func BuildLink(target, path, anchor string) string { return link + "#" + anchor } -// suggestedAnalysisFixes converts edit-based fixes associated -// with a gobDiagnostic to cache.SuggestedFixes. -// It returns the cross product of fixes and kinds. -func suggestedAnalysisFixes(diag *gobDiagnostic, kinds []protocol.CodeActionKind) []SuggestedFix { - var fixes []SuggestedFix - for _, fix := range diag.SuggestedFixes { - edits := make(map[protocol.DocumentURI][]protocol.TextEdit) - for _, e := range fix.TextEdits { - uri := e.Location.URI - edits[uri] = append(edits[uri], protocol.TextEdit{ - Range: e.Location.Range, - NewText: string(e.NewText), - }) - } - for _, kind := range kinds { - fixes = append(fixes, SuggestedFix{ - Title: fix.Message, - Edits: edits, - ActionKind: kind, - }) - } - } - return fixes -} - func parseGoListError(e packages.Error, dir string) (filename string, line, col8 int) { input := e.Pos if input == "" { diff --git a/gopls/internal/lsp/source/change_quote.go b/gopls/internal/lsp/source/change_quote.go index ad9a127b3b9..7c6fd5b9721 100644 --- a/gopls/internal/lsp/source/change_quote.go +++ b/gopls/internal/lsp/source/change_quote.go @@ -78,7 +78,7 @@ func ConvertStringLiteral(pgf *ParsedGoFile, fh file.Handle, rng protocol.Range) Title: title, Kind: protocol.RefactorRewrite, Edit: &protocol.WorkspaceEdit{ - DocumentChanges: protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), pedits), + DocumentChanges: documentChanges(fh, pedits), }, }, true } diff --git a/gopls/internal/lsp/source/change_signature.go b/gopls/internal/lsp/source/change_signature.go index b745dd182d0..2ff5d9799a0 100644 --- a/gopls/internal/lsp/source/change_signature.go +++ b/gopls/internal/lsp/source/change_signature.go @@ -170,7 +170,7 @@ func RemoveUnusedParameter(ctx context.Context, fh file.Handle, rng protocol.Ran if err != nil { return nil, fmt.Errorf("computing edits for %s: %v", uri, err) } - changes = append(changes, protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), pedits)...) + changes = append(changes, documentChanges(fh, pedits)...) } return changes, nil } diff --git a/gopls/internal/lsp/source/codeaction.go b/gopls/internal/lsp/source/codeaction.go new file mode 100644 index 00000000000..b4b183a5ff6 --- /dev/null +++ b/gopls/internal/lsp/source/codeaction.go @@ -0,0 +1,542 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package source + +import ( + "context" + "encoding/json" + "fmt" + "go/ast" + "log" + "strings" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/gopls/internal/analysis/fillstruct" + "golang.org/x/tools/gopls/internal/analysis/infertypeargs" + "golang.org/x/tools/gopls/internal/analysis/stubmethods" + "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/settings" + "golang.org/x/tools/gopls/internal/util/bug" + "golang.org/x/tools/gopls/internal/util/slices" + "golang.org/x/tools/internal/event" + "golang.org/x/tools/internal/event/tag" + "golang.org/x/tools/internal/imports" +) + +// CodeActions returns all code actions (edits and other commands) +// available for the selected range. +func CodeActions(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, rng protocol.Range, diagnostics []protocol.Diagnostic, want map[protocol.CodeActionKind]bool) (actions []protocol.CodeAction, _ error) { + // Only compute quick fixes if there are any diagnostics to fix. + wantQuickFixes := want[protocol.QuickFix] && len(diagnostics) > 0 + + // Code actions requiring syntax information alone. + if wantQuickFixes || want[protocol.SourceOrganizeImports] || want[protocol.RefactorExtract] { + pgf, err := snapshot.ParseGo(ctx, fh, parsego.ParseFull) + if err != nil { + return nil, err + } + + // Process any missing imports and pair them with the diagnostics they fix. + if wantQuickFixes || want[protocol.SourceOrganizeImports] { + importEdits, importEditsPerFix, err := allImportsFixes(ctx, snapshot, pgf) + if err != nil { + event.Error(ctx, "imports fixes", err, tag.File.Of(fh.URI().Path())) + importEdits = nil + importEditsPerFix = nil + } + + // Separate this into a set of codeActions per diagnostic, where + // each action is the addition, removal, or renaming of one import. + if wantQuickFixes { + for _, importFix := range importEditsPerFix { + fixed := fixedByImportFix(importFix.fix, diagnostics) + if len(fixed) == 0 { + continue + } + actions = append(actions, protocol.CodeAction{ + Title: importFixTitle(importFix.fix), + Kind: protocol.QuickFix, + Edit: &protocol.WorkspaceEdit{ + DocumentChanges: documentChanges(fh, importFix.edits), + }, + Diagnostics: fixed, + }) + } + } + + // Send all of the import edits as one code action if the file is + // being organized. + if want[protocol.SourceOrganizeImports] && len(importEdits) > 0 { + actions = append(actions, protocol.CodeAction{ + Title: "Organize Imports", + Kind: protocol.SourceOrganizeImports, + Edit: &protocol.WorkspaceEdit{ + DocumentChanges: documentChanges(fh, importEdits), + }, + }) + } + } + + if want[protocol.RefactorExtract] { + extractions, err := getExtractCodeActions(pgf, rng, snapshot.Options()) + if err != nil { + return nil, err + } + actions = append(actions, extractions...) + } + } + + var stubMethodsDiagnostics []protocol.Diagnostic + if wantQuickFixes && snapshot.Options().IsAnalyzerEnabled(stubmethods.Analyzer.Name) { + for _, pd := range diagnostics { + if stubmethods.MatchesMessage(pd.Message) { + stubMethodsDiagnostics = append(stubMethodsDiagnostics, pd) + } + } + } + + // Code actions requiring type information. + if len(stubMethodsDiagnostics) > 0 || + want[protocol.RefactorRewrite] || + want[protocol.RefactorInline] || + want[protocol.GoTest] { + pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) + if err != nil { + return nil, err + } + for _, pd := range stubMethodsDiagnostics { + start, end, err := pgf.RangePos(pd.Range) + if err != nil { + return nil, err + } + + var ( + diag analysis.Diagnostic + ok bool + ) + func() { + // golang/go#61693: code actions were refactored to run + // outside of the analysis framework, but as a result + // they lost their panic recovery. + // + // Stubmethods "should never fail"", but put back the + // panic recovery as a defensive measure. + defer func() { + if r := recover(); r != nil { + err = bug.Errorf("stubmethods panicked: %v", r) + } + }() + diag, ok = stubmethods.DiagnosticForError(pkg.FileSet(), pgf.File, start, end, pd.Message, pkg.GetTypesInfo()) + }() + if err != nil { + return nil, err // panicked + } + if !ok { + continue + } + + for _, fix := range diag.SuggestedFixes { + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Category, + URI: pgf.URI, + Range: pd.Range, + ResolveEdits: supportsResolveEdits(snapshot.Options()), + }) + if err != nil { + log.Fatalf("NewApplyFixCommand: %v", err) + } + actions = append(actions, newCodeAction(fix.Message, protocol.QuickFix, &cmd, nil, snapshot.Options())) + } + } + + if want[protocol.RefactorRewrite] { + rewrites, err := getRewriteCodeActions(snapshot, pkg, pgf, fh, rng, snapshot.Options()) + if err != nil { + return nil, err + } + actions = append(actions, rewrites...) + } + + if want[protocol.RefactorInline] { + rewrites, err := getInlineCodeActions(pkg, pgf, rng) + if err != nil { + return nil, err + } + actions = append(actions, rewrites...) + } + + if want[protocol.GoTest] { + fixes, err := getGoTestCodeActions(pkg, pgf, rng) + if err != nil { + return nil, err + } + actions = append(actions, fixes...) + } + } + return actions, nil +} + +func supportsResolveEdits(options *settings.Options) bool { + return options.CodeActionResolveOptions != nil && slices.Contains(options.CodeActionResolveOptions, "edit") +} + +func importFixTitle(fix *imports.ImportFix) string { + var str string + switch fix.FixType { + case imports.AddImport: + str = fmt.Sprintf("Add import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) + case imports.DeleteImport: + str = fmt.Sprintf("Delete import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) + case imports.SetImportName: + str = fmt.Sprintf("Rename import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) + } + return str +} + +// fixedByImportFix filters the provided slice of diagnostics to those that +// would be fixed by the provided imports fix. +func fixedByImportFix(fix *imports.ImportFix, diagnostics []protocol.Diagnostic) []protocol.Diagnostic { + var results []protocol.Diagnostic + for _, diagnostic := range diagnostics { + switch { + // "undeclared name: X" may be an unresolved import. + case strings.HasPrefix(diagnostic.Message, "undeclared name: "): + ident := strings.TrimPrefix(diagnostic.Message, "undeclared name: ") + if ident == fix.IdentName { + results = append(results, diagnostic) + } + // "undefined: X" may be an unresolved import at Go 1.20+. + case strings.HasPrefix(diagnostic.Message, "undefined: "): + ident := strings.TrimPrefix(diagnostic.Message, "undefined: ") + if ident == fix.IdentName { + results = append(results, diagnostic) + } + // "could not import: X" may be an invalid import. + case strings.HasPrefix(diagnostic.Message, "could not import: "): + ident := strings.TrimPrefix(diagnostic.Message, "could not import: ") + if ident == fix.IdentName { + results = append(results, diagnostic) + } + // "X imported but not used" is an unused import. + // "X imported but not used as Y" is an unused import. + case strings.Contains(diagnostic.Message, " imported but not used"): + idx := strings.Index(diagnostic.Message, " imported but not used") + importPath := diagnostic.Message[:idx] + if importPath == fmt.Sprintf("%q", fix.StmtInfo.ImportPath) { + results = append(results, diagnostic) + } + } + } + return results +} + +// getExtractCodeActions returns any refactor.extract code actions for the selection. +func getExtractCodeActions(pgf *ParsedGoFile, rng protocol.Range, options *settings.Options) ([]protocol.CodeAction, error) { + if rng.Start == rng.End { + return nil, nil + } + + start, end, err := pgf.RangePos(rng) + if err != nil { + return nil, err + } + puri := pgf.URI + var commands []protocol.Command + if _, ok, methodOk, _ := CanExtractFunction(pgf.Tok, start, end, pgf.Src, pgf.File); ok { + cmd, err := command.NewApplyFixCommand("Extract function", command.ApplyFixArgs{ + Fix: fixExtractFunction, + URI: puri, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + if methodOk { + cmd, err := command.NewApplyFixCommand("Extract method", command.ApplyFixArgs{ + Fix: fixExtractMethod, + URI: puri, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + } + } + if _, _, ok, _ := CanExtractVariable(start, end, pgf.File); ok { + cmd, err := command.NewApplyFixCommand("Extract variable", command.ApplyFixArgs{ + Fix: fixExtractVariable, + URI: puri, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + } + var actions []protocol.CodeAction + for i := range commands { + actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorExtract, &commands[i], nil, options)) + } + return actions, nil +} + +func newCodeAction(title string, kind protocol.CodeActionKind, cmd *protocol.Command, diagnostics []protocol.Diagnostic, options *settings.Options) protocol.CodeAction { + action := protocol.CodeAction{ + Title: title, + Kind: kind, + Diagnostics: diagnostics, + } + if !supportsResolveEdits(options) { + action.Command = cmd + } else { + data, err := json.Marshal(cmd) + if err != nil { + panic("unable to marshal") + } + msg := json.RawMessage(data) + action.Data = &msg + } + return action +} + +// getRewriteCodeActions returns refactor.rewrite code actions available at the specified range. +func getRewriteCodeActions(snapshot *cache.Snapshot, pkg *cache.Package, pgf *ParsedGoFile, fh file.Handle, rng protocol.Range, options *settings.Options) (_ []protocol.CodeAction, rerr error) { + // golang/go#61693: code actions were refactored to run outside of the + // analysis framework, but as a result they lost their panic recovery. + // + // These code actions should never fail, but put back the panic recovery as a + // defensive measure. + defer func() { + if r := recover(); r != nil { + rerr = bug.Errorf("refactor.rewrite code actions panicked: %v", r) + } + }() + + var actions []protocol.CodeAction + + if canRemoveParameter(pkg, pgf, rng) { + cmd, err := command.NewChangeSignatureCommand("remove unused parameter", command.ChangeSignatureArgs{ + RemoveParameter: protocol.Location{ + URI: pgf.URI, + Range: rng, + }, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + actions = append(actions, newCodeAction("Refactor: remove unused parameter", protocol.RefactorRewrite, &cmd, nil, options)) + } + + if action, ok := ConvertStringLiteral(pgf, fh, rng); ok { + actions = append(actions, action) + } + + start, end, err := pgf.RangePos(rng) + if err != nil { + return nil, err + } + + var commands []protocol.Command + if _, ok, _ := CanInvertIfCondition(pgf.File, start, end); ok { + cmd, err := command.NewApplyFixCommand("Invert 'if' condition", command.ApplyFixArgs{ + Fix: fixInvertIfCondition, + URI: pgf.URI, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + } + + // N.B.: an inspector only pays for itself after ~5 passes, which means we're + // currently not getting a good deal on this inspection. + // + // TODO: Consider removing the inspection after convenienceAnalyzers are removed. + inspect := inspector.New([]*ast.File{pgf.File}) + if snapshot.Options().IsAnalyzerEnabled(fillstruct.Analyzer.Name) { + for _, diag := range fillstruct.DiagnoseFillableStructs(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { + rng, err := pgf.Mapper.PosRange(pgf.Tok, diag.Pos, diag.End) + if err != nil { + return nil, err + } + for _, fix := range diag.SuggestedFixes { + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Category, + URI: pgf.URI, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + } + } + } + + for i := range commands { + actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorRewrite, &commands[i], nil, options)) + } + + if snapshot.Options().IsAnalyzerEnabled(infertypeargs.Analyzer.Name) { + for _, d := range infertypeargs.DiagnoseInferableTypeArgs(pkg.FileSet(), inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { + if len(d.SuggestedFixes) != 1 { + panic(fmt.Sprintf("unexpected number of suggested fixes from infertypeargs: %v", len(d.SuggestedFixes))) + } + fix := d.SuggestedFixes[0] + var edits []protocol.TextEdit + for _, analysisEdit := range fix.TextEdits { + rng, err := pgf.Mapper.PosRange(pgf.Tok, analysisEdit.Pos, analysisEdit.End) + if err != nil { + return nil, err + } + edits = append(edits, protocol.TextEdit{ + Range: rng, + NewText: string(analysisEdit.NewText), + }) + } + actions = append(actions, protocol.CodeAction{ + Title: "Simplify type arguments", + Kind: protocol.RefactorRewrite, + Edit: &protocol.WorkspaceEdit{ + DocumentChanges: documentChanges(fh, edits), + }, + }) + } + } + + return actions, nil +} + +// canRemoveParameter reports whether we can remove the function parameter +// indicated by the given [start, end) range. +// +// This is true if: +// - [start, end) is contained within an unused field or parameter name +// - ... of a non-method function declaration. +// +// (Note that the unusedparam analyzer also computes this property, but +// much more precisely, allowing it to report its findings as diagnostics.) +func canRemoveParameter(pkg *cache.Package, pgf *ParsedGoFile, rng protocol.Range) bool { + info, err := FindParam(pgf, rng) + if err != nil { + return false // e.g. invalid range + } + if info.Field == nil { + return false // range does not span a parameter + } + if info.Decl.Body == nil { + return false // external function + } + if len(info.Field.Names) == 0 { + return true // no names => field is unused + } + if info.Name == nil { + return false // no name is indicated + } + if info.Name.Name == "_" { + return true // trivially unused + } + + obj := pkg.GetTypesInfo().Defs[info.Name] + if obj == nil { + return false // something went wrong + } + + used := false + ast.Inspect(info.Decl.Body, func(node ast.Node) bool { + if n, ok := node.(*ast.Ident); ok && pkg.GetTypesInfo().Uses[n] == obj { + used = true + } + return !used // keep going until we find a use + }) + return !used +} + +// getInlineCodeActions returns refactor.inline actions available at the specified range. +func getInlineCodeActions(pkg *cache.Package, pgf *ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { + start, end, err := pgf.RangePos(rng) + if err != nil { + return nil, err + } + + // If range is within call expression, offer inline action. + var commands []protocol.Command + if _, fn, err := EnclosingStaticCall(pkg, pgf, start, end); err == nil { + cmd, err := command.NewApplyFixCommand(fmt.Sprintf("Inline call to %s", fn.Name()), command.ApplyFixArgs{ + Fix: fixInlineCall, + URI: pgf.URI, + Range: rng, + }) + if err != nil { + return nil, err + } + commands = append(commands, cmd) + } + + // Convert commands to actions. + var actions []protocol.CodeAction + for i := range commands { + actions = append(actions, protocol.CodeAction{ + Title: commands[i].Title, + Kind: protocol.RefactorInline, + Command: &commands[i], + }) + } + return actions, nil +} + +// getGoTestCodeActions returns any "run this test/benchmark" code actions for the selection. +func getGoTestCodeActions(pkg *cache.Package, pgf *ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { + fns, err := TestsAndBenchmarks(pkg, pgf) + if err != nil { + return nil, err + } + + var tests, benchmarks []string + for _, fn := range fns.Tests { + if !protocol.Intersect(fn.Rng, rng) { + continue + } + tests = append(tests, fn.Name) + } + for _, fn := range fns.Benchmarks { + if !protocol.Intersect(fn.Rng, rng) { + continue + } + benchmarks = append(benchmarks, fn.Name) + } + + if len(tests) == 0 && len(benchmarks) == 0 { + return nil, nil + } + + cmd, err := command.NewTestCommand("Run tests and benchmarks", pgf.URI, tests, benchmarks) + if err != nil { + return nil, err + } + return []protocol.CodeAction{{ + Title: cmd.Title, + Kind: protocol.GoTest, + Command: &cmd, + }}, nil +} + +func documentChanges(fh file.Handle, edits []protocol.TextEdit) []protocol.DocumentChanges { + return protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), edits) +} diff --git a/gopls/internal/lsp/source/fix.go b/gopls/internal/lsp/source/fix.go index e3ee56664f1..eaee0dca36d 100644 --- a/gopls/internal/lsp/source/fix.go +++ b/gopls/internal/lsp/source/fix.go @@ -57,13 +57,13 @@ func singleFile(fixer1 singleFileFixer) fixer { } } -// Names of ApplyFix.Fix created directly by the server's CodeAction handler. +// Names of ApplyFix.Fix created directly by the CodeAction handler. const ( - ExtractVariable = "extract_variable" - ExtractFunction = "extract_function" - ExtractMethod = "extract_method" - InlineCall = "inline_call" - InvertIfCondition = "invert_if_condition" + fixExtractVariable = "extract_variable" + fixExtractFunction = "extract_function" + fixExtractMethod = "extract_method" + fixInlineCall = "inline_call" + fixInvertIfCondition = "invert_if_condition" ) // ApplyFix applies the specified kind of suggested fix to the given @@ -71,7 +71,7 @@ const ( // // A fix kind is either the Category of an analysis.Diagnostic that // had a SuggestedFix with no edits; or the name of a fix agreed upon -// by server.codeAction and this function, such as [ExtractVariable]. +// by [CodeActions] and this function. // Fix kinds identify fixes in the command protocol. // // TODO(adonovan): come up with a better mechanism for registering the @@ -110,11 +110,11 @@ func ApplyFix(ctx context.Context, fix string, snapshot *cache.Snapshot, fh file // Ad-hoc fixers: these are used when the command is // constructed directly by logic in server/code_action. - ExtractFunction: singleFile(extractFunction), - ExtractMethod: singleFile(extractMethod), - ExtractVariable: singleFile(extractVariable), - InlineCall: inlineCall, - InvertIfCondition: singleFile(invertIfCondition), + fixExtractFunction: singleFile(extractFunction), + fixExtractMethod: singleFile(extractMethod), + fixExtractVariable: singleFile(extractVariable), + fixInlineCall: inlineCall, + fixInvertIfCondition: singleFile(invertIfCondition), } fixer, ok := fixers[fix] if !ok { diff --git a/gopls/internal/lsp/source/format.go b/gopls/internal/lsp/source/format.go index 8c469904d76..79eaf21d288 100644 --- a/gopls/internal/lsp/source/format.go +++ b/gopls/internal/lsp/source/format.go @@ -48,7 +48,7 @@ func Format(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]pr if err != nil { return nil, err } - return computeTextEdits(ctx, snapshot, pgf, string(formatted)) + return computeTextEdits(ctx, pgf, string(formatted)) } // format.Node changes slightly from one release to another, so the version @@ -87,7 +87,7 @@ func Format(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]pr } formatted = string(b) } - return computeTextEdits(ctx, snapshot, pgf, formatted) + return computeTextEdits(ctx, pgf, formatted) } func formatSource(ctx context.Context, fh file.Handle) ([]byte, error) { @@ -101,21 +101,21 @@ func formatSource(ctx context.Context, fh file.Handle) ([]byte, error) { return format.Source(data) } -type ImportFix struct { - Fix *imports.ImportFix - Edits []protocol.TextEdit +type importFix struct { + fix *imports.ImportFix + edits []protocol.TextEdit } -// AllImportsFixes formats f for each possible fix to the imports. +// allImportsFixes formats f for each possible fix to the imports. // In addition to returning the result of applying all edits, // it returns a list of fixes that could be applied to the file, with the // corresponding TextEdits that would be needed to apply that fix. -func AllImportsFixes(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedGoFile) (allFixEdits []protocol.TextEdit, editsPerFix []*ImportFix, err error) { +func allImportsFixes(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedGoFile) (allFixEdits []protocol.TextEdit, editsPerFix []*importFix, err error) { ctx, done := event.Start(ctx, "source.AllImportsFixes") defer done() if err := snapshot.RunProcessEnvFunc(ctx, func(ctx context.Context, opts *imports.Options) error { - allFixEdits, editsPerFix, err = computeImportEdits(ctx, snapshot, pgf, opts) + allFixEdits, editsPerFix, err = computeImportEdits(ctx, pgf, opts) return err }); err != nil { return nil, nil, fmt.Errorf("AllImportsFixes: %v", err) @@ -125,7 +125,7 @@ func AllImportsFixes(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedG // computeImportEdits computes a set of edits that perform one or all of the // necessary import fixes. -func computeImportEdits(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedGoFile, options *imports.Options) (allFixEdits []protocol.TextEdit, editsPerFix []*ImportFix, err error) { +func computeImportEdits(ctx context.Context, pgf *ParsedGoFile, options *imports.Options) (allFixEdits []protocol.TextEdit, editsPerFix []*importFix, err error) { filename := pgf.URI.Path() // Build up basic information about the original file. @@ -134,7 +134,7 @@ func computeImportEdits(ctx context.Context, snapshot *cache.Snapshot, pgf *Pars return nil, nil, err } - allFixEdits, err = computeFixEdits(snapshot, pgf, options, allFixes) + allFixEdits, err = computeFixEdits(pgf, options, allFixes) if err != nil { return nil, nil, err } @@ -142,13 +142,13 @@ func computeImportEdits(ctx context.Context, snapshot *cache.Snapshot, pgf *Pars // Apply all of the import fixes to the file. // Add the edits for each fix to the result. for _, fix := range allFixes { - edits, err := computeFixEdits(snapshot, pgf, options, []*imports.ImportFix{fix}) + edits, err := computeFixEdits(pgf, options, []*imports.ImportFix{fix}) if err != nil { return nil, nil, err } - editsPerFix = append(editsPerFix, &ImportFix{ - Fix: fix, - Edits: edits, + editsPerFix = append(editsPerFix, &importFix{ + fix: fix, + edits: edits, }) } return allFixEdits, editsPerFix, nil @@ -166,10 +166,10 @@ func ComputeOneImportFixEdits(snapshot *cache.Snapshot, pgf *ParsedGoFile, fix * TabIndent: true, TabWidth: 8, } - return computeFixEdits(snapshot, pgf, options, []*imports.ImportFix{fix}) + return computeFixEdits(pgf, options, []*imports.ImportFix{fix}) } -func computeFixEdits(snapshot *cache.Snapshot, pgf *ParsedGoFile, options *imports.Options, fixes []*imports.ImportFix) ([]protocol.TextEdit, error) { +func computeFixEdits(pgf *ParsedGoFile, options *imports.Options, fixes []*imports.ImportFix) ([]protocol.TextEdit, error) { // trim the original data to match fixedData left, err := importPrefix(pgf.Src) if err != nil { @@ -302,7 +302,7 @@ func scanForCommentEnd(src []byte) int { return 0 } -func computeTextEdits(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedGoFile, formatted string) ([]protocol.TextEdit, error) { +func computeTextEdits(ctx context.Context, pgf *ParsedGoFile, formatted string) ([]protocol.TextEdit, error) { _, done := event.Start(ctx, "source.computeTextEdits") defer done() diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 291de86c952..a433d6aa96d 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -9,29 +9,16 @@ import ( "context" "encoding/json" "fmt" - "go/ast" - "log" "sort" "strings" - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/ast/inspector" - "golang.org/x/tools/gopls/internal/analysis/fillstruct" - "golang.org/x/tools/gopls/internal/analysis/infertypeargs" - "golang.org/x/tools/gopls/internal/analysis/stubmethods" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" - "golang.org/x/tools/gopls/internal/settings" - "golang.org/x/tools/gopls/internal/util/bug" - "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/event" - "golang.org/x/tools/internal/event/tag" - "golang.org/x/tools/internal/imports" ) func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) { @@ -118,167 +105,22 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara return actions, nil case file.Go: - diagnostics := params.Context.Diagnostics - // Don't suggest fixes for generated files, since they are generally // not useful and some editors may apply them automatically on save. if source.IsGenerated(ctx, snapshot, uri) { return nil, nil } - actions, err := s.codeActionsMatchingDiagnostics(ctx, uri, snapshot, diagnostics, want) + actions, err := s.codeActionsMatchingDiagnostics(ctx, uri, snapshot, params.Context.Diagnostics, want) if err != nil { return nil, err } - // Only compute quick fixes if there are any diagnostics to fix. - wantQuickFixes := want[protocol.QuickFix] && len(diagnostics) > 0 - - // Code actions requiring syntax information alone. - if wantQuickFixes || want[protocol.SourceOrganizeImports] || want[protocol.RefactorExtract] { - pgf, err := snapshot.ParseGo(ctx, fh, parsego.ParseFull) - if err != nil { - return nil, err - } - - // Process any missing imports and pair them with the diagnostics they - // fix. - if wantQuickFixes || want[protocol.SourceOrganizeImports] { - importEdits, importEditsPerFix, err := source.AllImportsFixes(ctx, snapshot, pgf) - if err != nil { - event.Error(ctx, "imports fixes", err, tag.File.Of(fh.URI().Path())) - importEdits = nil - importEditsPerFix = nil - } - - // Separate this into a set of codeActions per diagnostic, where - // each action is the addition, removal, or renaming of one import. - if wantQuickFixes { - for _, importFix := range importEditsPerFix { - fixed := fixedByImportFix(importFix.Fix, diagnostics) - if len(fixed) == 0 { - continue - } - actions = append(actions, protocol.CodeAction{ - Title: importFixTitle(importFix.Fix), - Kind: protocol.QuickFix, - Edit: &protocol.WorkspaceEdit{ - DocumentChanges: documentChanges(fh, importFix.Edits), - }, - Diagnostics: fixed, - }) - } - } - - // Send all of the import edits as one code action if the file is - // being organized. - if want[protocol.SourceOrganizeImports] && len(importEdits) > 0 { - actions = append(actions, protocol.CodeAction{ - Title: "Organize Imports", - Kind: protocol.SourceOrganizeImports, - Edit: &protocol.WorkspaceEdit{ - DocumentChanges: documentChanges(fh, importEdits), - }, - }) - } - } - - if want[protocol.RefactorExtract] { - extractions, err := refactorExtract(pgf, params.Range, snapshot.Options()) - if err != nil { - return nil, err - } - actions = append(actions, extractions...) - } - } - - var stubMethodsDiagnostics []protocol.Diagnostic - if wantQuickFixes && snapshot.Options().IsAnalyzerEnabled(stubmethods.Analyzer.Name) { - for _, pd := range diagnostics { - if stubmethods.MatchesMessage(pd.Message) { - stubMethodsDiagnostics = append(stubMethodsDiagnostics, pd) - } - } - } - - // Code actions requiring type information. - if len(stubMethodsDiagnostics) > 0 || - want[protocol.RefactorRewrite] || - want[protocol.RefactorInline] || - want[protocol.GoTest] { - pkg, pgf, err := source.NarrowestPackageForFile(ctx, snapshot, fh.URI()) - if err != nil { - return nil, err - } - for _, pd := range stubMethodsDiagnostics { - start, end, err := pgf.RangePos(pd.Range) - if err != nil { - return nil, err - } - - var ( - diag analysis.Diagnostic - ok bool - ) - func() { - // golang/go#61693: code actions were refactored to run - // outside of the analysis framework, but as a result - // they lost their panic recovery. - // - // Stubmethods "should never fail"", but put back the - // panic recovery as a defensive measure. - defer func() { - if r := recover(); r != nil { - err = bug.Errorf("stubmethods panicked: %v", r) - } - }() - diag, ok = stubmethods.DiagnosticForError(pkg.FileSet(), pgf.File, start, end, pd.Message, pkg.GetTypesInfo()) - }() - if err != nil { - return nil, err // panicked - } - if !ok { - continue - } - - for _, fix := range diag.SuggestedFixes { - cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ - Fix: diag.Category, - URI: pgf.URI, - Range: pd.Range, - ResolveEdits: supportsResolveEdits(snapshot.Options()), - }) - if err != nil { - log.Fatalf("NewApplyFixCommand: %v", err) - } - actions = append(actions, newCodeAction(fix.Message, protocol.QuickFix, &cmd, nil, snapshot.Options())) - } - } - - if want[protocol.RefactorRewrite] { - rewrites, err := refactorRewrite(snapshot, pkg, pgf, fh, params.Range, snapshot.Options()) - if err != nil { - return nil, err - } - actions = append(actions, rewrites...) - } - - if want[protocol.RefactorInline] { - rewrites, err := refactorInline(pkg, pgf, params.Range) - if err != nil { - return nil, err - } - actions = append(actions, rewrites...) - } - - if want[protocol.GoTest] { - fixes, err := goTest(pkg, pgf, params.Range) - if err != nil { - return nil, err - } - actions = append(actions, fixes...) - } + moreActions, err := source.CodeActions(ctx, snapshot, fh, params.Range, params.Context.Diagnostics, want) + if err != nil { + return nil, err } + actions = append(actions, moreActions...) return actions, nil @@ -332,368 +174,10 @@ func (s *server) ResolveCodeAction(ctx context.Context, ca *protocol.CodeAction) return ca, nil } -func supportsResolveEdits(options *settings.Options) bool { - return options.CodeActionResolveOptions != nil && slices.Contains(options.CodeActionResolveOptions, "edit") -} - -func (s *server) findMatchingDiagnostics(uri protocol.DocumentURI, pd protocol.Diagnostic) []*cache.Diagnostic { - s.diagnosticsMu.Lock() - defer s.diagnosticsMu.Unlock() - - var sds []*cache.Diagnostic - for _, viewDiags := range s.diagnostics[uri].byView { - for _, sd := range viewDiags.diagnostics { - sameDiagnostic := (pd.Message == strings.TrimSpace(sd.Message) && // extra space may have been trimmed when converting to protocol.Diagnostic - protocol.CompareRange(pd.Range, sd.Range) == 0 && - pd.Source == string(sd.Source)) - - if sameDiagnostic { - sds = append(sds, sd) - } - } - } - return sds -} - -func (s *server) getSupportedCodeActions() []protocol.CodeActionKind { - allCodeActionKinds := make(map[protocol.CodeActionKind]struct{}) - for _, kinds := range s.Options().SupportedCodeActions { - for kind := range kinds { - allCodeActionKinds[kind] = struct{}{} - } - } - var result []protocol.CodeActionKind - for kind := range allCodeActionKinds { - result = append(result, kind) - } - sort.Slice(result, func(i, j int) bool { - return result[i] < result[j] - }) - return result -} - -func importFixTitle(fix *imports.ImportFix) string { - var str string - switch fix.FixType { - case imports.AddImport: - str = fmt.Sprintf("Add import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case imports.DeleteImport: - str = fmt.Sprintf("Delete import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - case imports.SetImportName: - str = fmt.Sprintf("Rename import: %s %q", fix.StmtInfo.Name, fix.StmtInfo.ImportPath) - } - return str -} - -// fixedByImportFix filters the provided slice of diagnostics to those that -// would be fixed by the provided imports fix. -func fixedByImportFix(fix *imports.ImportFix, diagnostics []protocol.Diagnostic) []protocol.Diagnostic { - var results []protocol.Diagnostic - for _, diagnostic := range diagnostics { - switch { - // "undeclared name: X" may be an unresolved import. - case strings.HasPrefix(diagnostic.Message, "undeclared name: "): - ident := strings.TrimPrefix(diagnostic.Message, "undeclared name: ") - if ident == fix.IdentName { - results = append(results, diagnostic) - } - // "undefined: X" may be an unresolved import at Go 1.20+. - case strings.HasPrefix(diagnostic.Message, "undefined: "): - ident := strings.TrimPrefix(diagnostic.Message, "undefined: ") - if ident == fix.IdentName { - results = append(results, diagnostic) - } - // "could not import: X" may be an invalid import. - case strings.HasPrefix(diagnostic.Message, "could not import: "): - ident := strings.TrimPrefix(diagnostic.Message, "could not import: ") - if ident == fix.IdentName { - results = append(results, diagnostic) - } - // "X imported but not used" is an unused import. - // "X imported but not used as Y" is an unused import. - case strings.Contains(diagnostic.Message, " imported but not used"): - idx := strings.Index(diagnostic.Message, " imported but not used") - importPath := diagnostic.Message[:idx] - if importPath == fmt.Sprintf("%q", fix.StmtInfo.ImportPath) { - results = append(results, diagnostic) - } - } - } - return results -} - -// TODO(adonovan): move this into source package and unexport source.ExtractMethod etc. -func refactorExtract(pgf *source.ParsedGoFile, rng protocol.Range, options *settings.Options) ([]protocol.CodeAction, error) { - if rng.Start == rng.End { - return nil, nil - } - - start, end, err := pgf.RangePos(rng) - if err != nil { - return nil, err - } - puri := pgf.URI - var commands []protocol.Command - if _, ok, methodOk, _ := source.CanExtractFunction(pgf.Tok, start, end, pgf.Src, pgf.File); ok { - cmd, err := command.NewApplyFixCommand("Extract function", command.ApplyFixArgs{ - Fix: source.ExtractFunction, - URI: puri, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - if methodOk { - cmd, err := command.NewApplyFixCommand("Extract method", command.ApplyFixArgs{ - Fix: source.ExtractMethod, - URI: puri, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } - } - if _, _, ok, _ := source.CanExtractVariable(start, end, pgf.File); ok { - cmd, err := command.NewApplyFixCommand("Extract variable", command.ApplyFixArgs{ - Fix: source.ExtractVariable, - URI: puri, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } - var actions []protocol.CodeAction - for i := range commands { - actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorExtract, &commands[i], nil, options)) - } - return actions, nil -} - -func newCodeAction(title string, kind protocol.CodeActionKind, cmd *protocol.Command, diagnostics []protocol.Diagnostic, options *settings.Options) protocol.CodeAction { - action := protocol.CodeAction{ - Title: title, - Kind: kind, - Diagnostics: diagnostics, - } - if !supportsResolveEdits(options) { - action.Command = cmd - } else { - data, err := json.Marshal(cmd) - if err != nil { - panic("unable to marshal") - } - msg := json.RawMessage(data) - action.Data = &msg - } - return action -} - -func refactorRewrite(snapshot *cache.Snapshot, pkg *cache.Package, pgf *source.ParsedGoFile, fh file.Handle, rng protocol.Range, options *settings.Options) (_ []protocol.CodeAction, rerr error) { - // golang/go#61693: code actions were refactored to run outside of the - // analysis framework, but as a result they lost their panic recovery. - // - // These code actions should never fail, but put back the panic recovery as a - // defensive measure. - defer func() { - if r := recover(); r != nil { - rerr = bug.Errorf("refactor.rewrite code actions panicked: %v", r) - } - }() - - var actions []protocol.CodeAction - - if canRemoveParameter(pkg, pgf, rng) { - cmd, err := command.NewChangeSignatureCommand("remove unused parameter", command.ChangeSignatureArgs{ - RemoveParameter: protocol.Location{ - URI: pgf.URI, - Range: rng, - }, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - actions = append(actions, newCodeAction("Refactor: remove unused parameter", protocol.RefactorRewrite, &cmd, nil, options)) - } - - if action, ok := source.ConvertStringLiteral(pgf, fh, rng); ok { - actions = append(actions, action) - } - - start, end, err := pgf.RangePos(rng) - if err != nil { - return nil, err - } - - var commands []protocol.Command - if _, ok, _ := source.CanInvertIfCondition(pgf.File, start, end); ok { - cmd, err := command.NewApplyFixCommand("Invert 'if' condition", command.ApplyFixArgs{ - Fix: source.InvertIfCondition, - URI: pgf.URI, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } - - // N.B.: an inspector only pays for itself after ~5 passes, which means we're - // currently not getting a good deal on this inspection. - // - // TODO: Consider removing the inspection after convenienceAnalyzers are removed. - inspect := inspector.New([]*ast.File{pgf.File}) - if snapshot.Options().IsAnalyzerEnabled(fillstruct.Analyzer.Name) { - for _, diag := range fillstruct.DiagnoseFillableStructs(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { - rng, err := pgf.Mapper.PosRange(pgf.Tok, diag.Pos, diag.End) - if err != nil { - return nil, err - } - for _, fix := range diag.SuggestedFixes { - cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ - Fix: diag.Category, - URI: pgf.URI, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } - } - } - - for i := range commands { - actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorRewrite, &commands[i], nil, options)) - } - - if snapshot.Options().IsAnalyzerEnabled(infertypeargs.Analyzer.Name) { - for _, d := range infertypeargs.DiagnoseInferableTypeArgs(pkg.FileSet(), inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { - if len(d.SuggestedFixes) != 1 { - panic(fmt.Sprintf("unexpected number of suggested fixes from infertypeargs: %v", len(d.SuggestedFixes))) - } - fix := d.SuggestedFixes[0] - var edits []protocol.TextEdit - for _, analysisEdit := range fix.TextEdits { - rng, err := pgf.Mapper.PosRange(pgf.Tok, analysisEdit.Pos, analysisEdit.End) - if err != nil { - return nil, err - } - edits = append(edits, protocol.TextEdit{ - Range: rng, - NewText: string(analysisEdit.NewText), - }) - } - actions = append(actions, protocol.CodeAction{ - Title: "Simplify type arguments", - Kind: protocol.RefactorRewrite, - Edit: &protocol.WorkspaceEdit{ - DocumentChanges: documentChanges(fh, edits), - }, - }) - } - } - - return actions, nil -} - -// canRemoveParameter reports whether we can remove the function parameter -// indicated by the given [start, end) range. -// -// This is true if: -// - [start, end) is contained within an unused field or parameter name -// - ... of a non-method function declaration. -// -// (Note that the unusedparam analyzer also computes this property, but -// much more precisely, allowing it to report its findings as diagnostics.) -func canRemoveParameter(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.Range) bool { - info, err := source.FindParam(pgf, rng) - if err != nil { - return false // e.g. invalid range - } - if info.Field == nil { - return false // range does not span a parameter - } - if info.Decl.Body == nil { - return false // external function - } - if len(info.Field.Names) == 0 { - return true // no names => field is unused - } - if info.Name == nil { - return false // no name is indicated - } - if info.Name.Name == "_" { - return true // trivially unused - } - - obj := pkg.GetTypesInfo().Defs[info.Name] - if obj == nil { - return false // something went wrong - } - - used := false - ast.Inspect(info.Decl.Body, func(node ast.Node) bool { - if n, ok := node.(*ast.Ident); ok && pkg.GetTypesInfo().Uses[n] == obj { - used = true - } - return !used // keep going until we find a use - }) - return !used -} - -// refactorInline returns inline actions available at the specified range. -// TODO(adonovan): move this into source package and unexport source.InlineCall etc. -func refactorInline(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { - start, end, err := pgf.RangePos(rng) - if err != nil { - return nil, err - } - - // If range is within call expression, offer inline action. - var commands []protocol.Command - if _, fn, err := source.EnclosingStaticCall(pkg, pgf, start, end); err == nil { - cmd, err := command.NewApplyFixCommand(fmt.Sprintf("Inline call to %s", fn.Name()), command.ApplyFixArgs{ - Fix: source.InlineCall, - URI: pgf.URI, - Range: rng, - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } - - // Convert commands to actions. - var actions []protocol.CodeAction - for i := range commands { - actions = append(actions, protocol.CodeAction{ - Title: commands[i].Title, - Kind: protocol.RefactorInline, - Command: &commands[i], - }) - } - return actions, nil -} - -func documentChanges(fh file.Handle, edits []protocol.TextEdit) []protocol.DocumentChanges { - return protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), edits) -} - // codeActionsMatchingDiagnostics fetches code actions for the provided // diagnostics, by first attempting to unmarshal code actions directly from the // bundled protocol.Diagnostic.Data field, and failing that by falling back on -// fetching a matching source.Diagnostic from the set of stored diagnostics for +// fetching a matching Diagnostic from the set of stored diagnostics for // this file. func (s *server) codeActionsMatchingDiagnostics(ctx context.Context, uri protocol.DocumentURI, snapshot *cache.Snapshot, pds []protocol.Diagnostic, want map[protocol.CodeActionKind]bool) ([]protocol.CodeAction, error) { var actions []protocol.CodeAction @@ -738,53 +222,57 @@ func codeActionsForDiagnostic(ctx context.Context, snapshot *cache.Snapshot, sd } changes = append(changes, documentChanges(fh, edits)...) } - action := protocol.CodeAction{ + actions = append(actions, protocol.CodeAction{ Title: fix.Title, Kind: fix.ActionKind, Edit: &protocol.WorkspaceEdit{ DocumentChanges: changes, }, - Command: fix.Command, - } - action.Diagnostics = []protocol.Diagnostic{*pd} - actions = append(actions, action) + Command: fix.Command, + Diagnostics: []protocol.Diagnostic{*pd}, + }) } return actions, nil } -func goTest(pkg *cache.Package, pgf *source.ParsedGoFile, rng protocol.Range) ([]protocol.CodeAction, error) { - fns, err := source.TestsAndBenchmarks(pkg, pgf) - if err != nil { - return nil, err - } +func (s *server) findMatchingDiagnostics(uri protocol.DocumentURI, pd protocol.Diagnostic) []*cache.Diagnostic { + s.diagnosticsMu.Lock() + defer s.diagnosticsMu.Unlock() - var tests, benchmarks []string - for _, fn := range fns.Tests { - if !protocol.Intersect(fn.Rng, rng) { - continue - } - tests = append(tests, fn.Name) - } - for _, fn := range fns.Benchmarks { - if !protocol.Intersect(fn.Rng, rng) { - continue + var sds []*cache.Diagnostic + for _, viewDiags := range s.diagnostics[uri].byView { + for _, sd := range viewDiags.diagnostics { + sameDiagnostic := (pd.Message == strings.TrimSpace(sd.Message) && // extra space may have been trimmed when converting to protocol.Diagnostic + protocol.CompareRange(pd.Range, sd.Range) == 0 && + pd.Source == string(sd.Source)) + + if sameDiagnostic { + sds = append(sds, sd) + } } - benchmarks = append(benchmarks, fn.Name) } + return sds +} - if len(tests) == 0 && len(benchmarks) == 0 { - return nil, nil +func (s *server) getSupportedCodeActions() []protocol.CodeActionKind { + allCodeActionKinds := make(map[protocol.CodeActionKind]struct{}) + for _, kinds := range s.Options().SupportedCodeActions { + for kind := range kinds { + allCodeActionKinds[kind] = struct{}{} + } } - - cmd, err := command.NewTestCommand("Run tests and benchmarks", pgf.URI, tests, benchmarks) - if err != nil { - return nil, err + var result []protocol.CodeActionKind + for kind := range allCodeActionKinds { + result = append(result, kind) } - return []protocol.CodeAction{{ - Title: cmd.Title, - Kind: protocol.GoTest, - Command: &cmd, - }}, nil + sort.Slice(result, func(i, j int) bool { + return result[i] < result[j] + }) + return result } type unit = struct{} + +func documentChanges(fh file.Handle, edits []protocol.TextEdit) []protocol.DocumentChanges { + return protocol.TextEditsToDocumentChanges(fh.URI(), fh.Version(), edits) +} From d0930dbc13d3674aae324ce524dbd649d1df52b5 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Thu, 18 Jan 2024 15:22:09 -0500 Subject: [PATCH 032/105] gopls/internal/lsp/cache: fix bug reports from toGobDiagnostics Fix two cases that could lead to the bug reports related to position conversion reported in golang/go#64547: 1. The lostcancel analyzer reports diagnostics for a synthetic range that could overflow the file. 2. The cgocall analyzer, which runs despite errors, could report diagnostics for invalid "fixed" positions. Issue (1) was easy enough to prove with a test, though (2) is admittedly just a hypothesis. Nevertheless, we should close the telemetry-derived issue and see if it recurs. Fixes golang/go#64547 Change-Id: Ie69bdae474abdd25235d856fc0ae0bfaf7e214ed Reviewed-on: https://go-review.googlesource.com/c/tools/+/556815 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- go/analysis/passes/lostcancel/lostcancel.go | 13 ++++++++++- go/cfg/cfg.go | 6 ++++- gopls/internal/lsp/cache/analysis.go | 22 ++++++++++++++++--- .../testdata/diagnostics/issue64547.txt | 14 ++++++++++++ 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/diagnostics/issue64547.txt diff --git a/go/analysis/passes/lostcancel/lostcancel.go b/go/analysis/passes/lostcancel/lostcancel.go index 2bccb675020..bf56a5c06f6 100644 --- a/go/analysis/passes/lostcancel/lostcancel.go +++ b/go/analysis/passes/lostcancel/lostcancel.go @@ -172,7 +172,18 @@ func runFunc(pass *analysis.Pass, node ast.Node) { if ret := lostCancelPath(pass, g, v, stmt, sig); ret != nil { lineno := pass.Fset.Position(stmt.Pos()).Line pass.ReportRangef(stmt, "the %s function is not used on all paths (possible context leak)", v.Name()) - pass.ReportRangef(ret, "this return statement may be reached without using the %s var defined on line %d", v.Name(), lineno) + + pos, end := ret.Pos(), ret.End() + // golang/go#64547: cfg.Block.Return may return a synthetic + // ReturnStmt that overflows the file. + if pass.Fset.File(pos) != pass.Fset.File(end) { + end = pos + } + pass.Report(analysis.Diagnostic{ + Pos: pos, + End: end, + Message: fmt.Sprintf("this return statement may be reached without using the %s var defined on line %d", v.Name(), lineno), + }) } } } diff --git a/go/cfg/cfg.go b/go/cfg/cfg.go index 37d799f4bc3..e9c48d51daa 100644 --- a/go/cfg/cfg.go +++ b/go/cfg/cfg.go @@ -113,7 +113,11 @@ func (b *Block) String() string { return fmt.Sprintf("block %d (%s)", b.Index, b.comment) } -// Return returns the return statement at the end of this block if present, nil otherwise. +// Return returns the return statement at the end of this block if present, nil +// otherwise. +// +// When control falls off the end of the function, the ReturnStmt is synthetic +// and its [ast.Node.End] position may be beyond the end of the file. func (b *Block) Return() (ret *ast.ReturnStmt) { if len(b.Nodes) > 0 { ret, _ = b.Nodes[len(b.Nodes)-1].(*ast.ReturnStmt) diff --git a/gopls/internal/lsp/cache/analysis.go b/gopls/internal/lsp/cache/analysis.go index 1b49d58c83c..020906d408c 100644 --- a/gopls/internal/lsp/cache/analysis.go +++ b/gopls/internal/lsp/cache/analysis.go @@ -1269,10 +1269,21 @@ func (act *action) exec() (interface{}, *actionSummary, error) { factFilter[reflect.TypeOf(f)] = true } + // If the package contains "fixed" files, it's not necessarily an error if we + // can't convert positions. + hasFixedFiles := false + for _, p := range pkg.parsed { + if p.Fixed() { + hasFixedFiles = true + break + } + } + // posToLocation converts from token.Pos to protocol form. // TODO(adonovan): improve error messages. posToLocation := func(start, end token.Pos) (protocol.Location, error) { tokFile := pkg.fset.File(start) + for _, p := range pkg.parsed { if p.Tok == tokFile { if end == token.NoPos { @@ -1281,8 +1292,11 @@ func (act *action) exec() (interface{}, *actionSummary, error) { return p.PosLocation(start, end) } } - return protocol.Location{}, - bug.Errorf("internal error: token.Pos not within package") + errorf := bug.Errorf + if hasFixedFiles { + errorf = fmt.Errorf + } + return protocol.Location{}, errorf("token.Pos not within package") } // Now run the (pkg, analyzer) action. @@ -1299,7 +1313,9 @@ func (act *action) exec() (interface{}, *actionSummary, error) { Report: func(d analysis.Diagnostic) { diagnostic, err := toGobDiagnostic(posToLocation, analyzer, d) if err != nil { - bug.Reportf("internal error converting diagnostic from analyzer %q: %v", analyzer.Name, err) + if !hasFixedFiles { + bug.Reportf("internal error converting diagnostic from analyzer %q: %v", analyzer.Name, err) + } return } diagnostics = append(diagnostics, diagnostic) diff --git a/gopls/internal/test/marker/testdata/diagnostics/issue64547.txt b/gopls/internal/test/marker/testdata/diagnostics/issue64547.txt new file mode 100644 index 00000000000..3f3e13bdf67 --- /dev/null +++ b/gopls/internal/test/marker/testdata/diagnostics/issue64547.txt @@ -0,0 +1,14 @@ +This test checks the fix for golang/go#64547: the lostcancel analyzer reports +diagnostics that overflow the file. + +-- p.go -- +package p + +import "context" + +func _() { + _, cancel := context.WithCancel(context.Background()) //@diag("_, cancel", re"not used on all paths") + if false { + cancel() + } +} //@diag("}", re"may be reached without using the cancel") From cd7b5109bfe3a68c1ae1f7992d6032c8b41dbdec Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 16:53:06 -0500 Subject: [PATCH 033/105] gopls/internal/lsp/cache: allow versions of form "go1.2.3" Plus a unit test. Fixes golang/go#63472 Change-Id: I69466024eb876457d0d3f262cef3467b25879d93 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557215 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/cache/check.go | 4 +-- gopls/internal/lsp/cache/constraints_test.go | 30 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gopls/internal/lsp/cache/check.go b/gopls/internal/lsp/cache/check.go index 502ebb2149c..bc419065537 100644 --- a/gopls/internal/lsp/cache/check.go +++ b/gopls/internal/lsp/cache/check.go @@ -1565,8 +1565,8 @@ func (b *typeCheckBatch) checkPackage(ctx context.Context, ph *packageHandle) (* return &Package{ph.mp, ph.loadDiagnostics, pkg}, nil } -// TODO(golang/go#63472): this looks wrong with the new Go version syntax. -var goVersionRx = regexp.MustCompile(`^go([1-9][0-9]*)\.(0|[1-9][0-9]*)$`) +// e.g. "go1" or "go1.2" or "go1.2.3" +var goVersionRx = regexp.MustCompile(`^go[1-9][0-9]*(?:\.(0|[1-9][0-9]*)){0,2}$`) func (b *typeCheckBatch) typesConfig(ctx context.Context, inputs typeCheckInputs, onError func(e error)) *types.Config { cfg := &types.Config{ diff --git a/gopls/internal/lsp/cache/constraints_test.go b/gopls/internal/lsp/cache/constraints_test.go index 9adf01e6cea..23c9f39cb19 100644 --- a/gopls/internal/lsp/cache/constraints_test.go +++ b/gopls/internal/lsp/cache/constraints_test.go @@ -94,3 +94,33 @@ func TestIsStandaloneFile(t *testing.T) { }) } } + +func TestVersionRegexp(t *testing.T) { + // good + for _, s := range []string{ + "go1", + "go1.2", + "go1.2.3", + "go1.0.33", + } { + if !goVersionRx.MatchString(s) { + t.Errorf("Valid Go version %q does not match the regexp", s) + } + } + + // bad + for _, s := range []string{ + "go", // missing numbers + "go0", // Go starts at 1 + "go01", // leading zero + "go1.π", // non-decimal + "go1.-1", // negative + "go1.02.3", // leading zero + "go1.2.3.4", // too many segments + "go1.2.3-pre", // textual suffix + } { + if goVersionRx.MatchString(s) { + t.Errorf("Invalid Go version %q unexpectedly matches the regexp", s) + } + } +} From e1555a36d0068cd0cbc58915a3e2ea252a04e5ff Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 12:15:15 -0500 Subject: [PATCH 034/105] go/ssa: add Function.DomPostorder Plus a test. Fixes golang/go#46941 Change-Id: I8aa495bb18359fdc6acae86876a89687c1ba1d13 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557055 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Tim King <taking@google.com> --- go/ssa/dom.go | 31 ++++++++++++++----------- go/ssa/dom_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 go/ssa/dom_test.go diff --git a/go/ssa/dom.go b/go/ssa/dom.go index 66a2f5e6ed3..02c1ae83ae3 100644 --- a/go/ssa/dom.go +++ b/go/ssa/dom.go @@ -40,20 +40,25 @@ func (b *BasicBlock) Dominates(c *BasicBlock) bool { return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post } -type byDomPreorder []*BasicBlock - -func (a byDomPreorder) Len() int { return len(a) } -func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre } - -// DomPreorder returns a new slice containing the blocks of f in -// dominator tree preorder. +// DomPreorder returns a new slice containing the blocks of f +// in a preorder traversal of the dominator tree. func (f *Function) DomPreorder() []*BasicBlock { - n := len(f.Blocks) - order := make(byDomPreorder, n) - copy(order, f.Blocks) - sort.Sort(order) - return order + slice := append([]*BasicBlock(nil), f.Blocks...) + sort.Slice(slice, func(i, j int) bool { + return slice[i].dom.pre < slice[j].dom.pre + }) + return slice +} + +// DomPostorder returns a new slice containing the blocks of f +// in a postorder traversal of the dominator tree. +// (This is not the same as a postdominance order.) +func (f *Function) DomPostorder() []*BasicBlock { + slice := append([]*BasicBlock(nil), f.Blocks...) + sort.Slice(slice, func(i, j int) bool { + return slice[i].dom.post < slice[j].dom.post + }) + return slice } // domInfo contains a BasicBlock's dominance information. diff --git a/go/ssa/dom_test.go b/go/ssa/dom_test.go new file mode 100644 index 00000000000..a98468fe101 --- /dev/null +++ b/go/ssa/dom_test.go @@ -0,0 +1,56 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssa_test + +import ( + "fmt" + "path/filepath" + "testing" + + "golang.org/x/tools/go/packages" + "golang.org/x/tools/go/ssa/ssautil" +) + +func TestDominatorOrder(t *testing.T) { + const src = `package p + +func f(cond bool) { + // (Print operands match BasicBlock IDs.) + print(0) + if cond { + print(1) + } else { + print(2) + } + print(3) +} +` + dir := t.TempDir() + cfg := &packages.Config{ + Dir: dir, + Mode: packages.LoadSyntax, + Overlay: map[string][]byte{ + filepath.Join(dir, "p.go"): []byte(src), + }, + } + initial, err := packages.Load(cfg, "./p.go") + if err != nil { + t.Fatal(err) + } + if packages.PrintErrors(initial) > 0 { + t.Fatal("packages contain errors") + } + _, pkgs := ssautil.Packages(initial, 0) + p := pkgs[0] + p.Build() + f := p.Func("f") + + if got, want := fmt.Sprint(f.DomPreorder()), "[0 1 2 3]"; got != want { + t.Errorf("DomPreorder: got %v, want %s", got, want) + } + if got, want := fmt.Sprint(f.DomPostorder()), "[1 2 3 0]"; got != want { + t.Errorf("DomPostorder: got %v, want %s", got, want) + } +} From a987ef7aeab9e20797ce48cced2bceb815601f67 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 12:37:30 -0500 Subject: [PATCH 035/105] go/packages: publish Driver{Request,Response} and update the documentation. Fixes golang/go#64608 Change-Id: Icc65d1fb838d9fcb8e56e5f5bfcc175a83a4b706 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557056 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Matloob <matloob@golang.org> Auto-Submit: Alan Donovan <adonovan@google.com> --- go/packages/doc.go | 40 +++++++++++++-------- go/packages/external.go | 77 +++++++++++++++++++++++++++++++---------- go/packages/golist.go | 18 +++++----- go/packages/packages.go | 41 ++-------------------- 4 files changed, 94 insertions(+), 82 deletions(-) diff --git a/go/packages/doc.go b/go/packages/doc.go index b2a0b7c6a67..a8d7b06ac09 100644 --- a/go/packages/doc.go +++ b/go/packages/doc.go @@ -15,22 +15,10 @@ Load passes most patterns directly to the underlying build tool. The default build tool is the go command. Its supported patterns are described at https://pkg.go.dev/cmd/go#hdr-Package_lists_and_patterns. +Other build systems may be supported by providing a "driver"; +see [The driver protocol]. -Load may be used in Go projects that use alternative build systems, by -installing an appropriate "driver" program for the build system and -specifying its location in the GOPACKAGESDRIVER environment variable. -For example, -https://github.com/bazelbuild/rules_go/wiki/Editor-and-tool-integration -explains how to use the driver for Bazel. -The driver program is responsible for interpreting patterns in its -preferred notation and reporting information about the packages that -they identify. -(See driverRequest and driverResponse types for the JSON -schema used by the protocol. -Though the protocol is supported, these types are currently unexported; -see #64608 for a proposal to publish them.) - -Regardless of driver, all patterns with the prefix "query=", where query is a +All patterns with the prefix "query=", where query is a non-empty string of letters from [a-z], are reserved and may be interpreted as query operators. @@ -86,7 +74,29 @@ for details. Most tools should pass their command-line arguments (after any flags) uninterpreted to [Load], so that it can interpret them according to the conventions of the underlying build system. + See the Example function for typical usage. + +# The driver protocol + +[Load] may be used to load Go packages even in Go projects that use +alternative build systems, by installing an appropriate "driver" +program for the build system and specifying its location in the +GOPACKAGESDRIVER environment variable. +For example, +https://github.com/bazelbuild/rules_go/wiki/Editor-and-tool-integration +explains how to use the driver for Bazel. + +The driver program is responsible for interpreting patterns in its +preferred notation and reporting information about the packages that +those patterns identify. Drivers must also support the special "file=" +and "pattern=" patterns described above. + +The patterns are provided as positional command-line arguments. A +JSON-encoded [DriverRequest] message providing additional information +is written to the driver's standard input. The driver must write a +JSON-encoded [DriverResponse] message to its standard output. (This +message differs from the JSON schema produced by 'go list'.) */ package packages // import "golang.org/x/tools/go/packages" diff --git a/go/packages/external.go b/go/packages/external.go index 7db1d1293ab..4335c1eb14c 100644 --- a/go/packages/external.go +++ b/go/packages/external.go @@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// This file enables an external tool to intercept package requests. -// If the tool is present then its results are used in preference to -// the go list command. - package packages +// This file defines the protocol that enables an external "driver" +// tool to supply package metadata in place of 'go list'. + import ( "bytes" "encoding/json" @@ -17,31 +16,71 @@ import ( "strings" ) -// The Driver Protocol +// DriverRequest defines the schema of a request for package metadata +// from an external driver program. The JSON-encoded DriverRequest +// message is provided to the driver program's standard input. The +// query patterns are provided as command-line arguments. // -// The driver, given the inputs to a call to Load, returns metadata about the packages specified. -// This allows for different build systems to support go/packages by telling go/packages how the -// packages' source is organized. -// The driver is a binary, either specified by the GOPACKAGESDRIVER environment variable or in -// the path as gopackagesdriver. It's given the inputs to load in its argv. See the package -// documentation in doc.go for the full description of the patterns that need to be supported. -// A driver receives as a JSON-serialized driverRequest struct in standard input and will -// produce a JSON-serialized driverResponse (see definition in packages.go) in its standard output. - -// driverRequest is used to provide the portion of Load's Config that is needed by a driver. -type driverRequest struct { +// See the package documentation for an overview. +type DriverRequest struct { Mode LoadMode `json:"mode"` + // Env specifies the environment the underlying build system should be run in. Env []string `json:"env"` + // BuildFlags are flags that should be passed to the underlying build system. BuildFlags []string `json:"build_flags"` + // Tests specifies whether the patterns should also return test packages. Tests bool `json:"tests"` + // Overlay maps file paths (relative to the driver's working directory) to the byte contents // of overlay files. Overlay map[string][]byte `json:"overlay"` } +// DriverResponse defines the schema of a response from an external +// driver program, providing the results of a query for package +// metadata. The driver program must write a JSON-encoded +// DriverResponse message to its standard output. +// +// See the package documentation for an overview. +type DriverResponse struct { + // NotHandled is returned if the request can't be handled by the current + // driver. If an external driver returns a response with NotHandled, the + // rest of the DriverResponse is ignored, and go/packages will fallback + // to the next driver. If go/packages is extended in the future to support + // lists of multiple drivers, go/packages will fall back to the next driver. + NotHandled bool + + // Compiler and Arch are the arguments pass of types.SizesFor + // to get a types.Sizes to use when type checking. + Compiler string + Arch string + + // Roots is the set of package IDs that make up the root packages. + // We have to encode this separately because when we encode a single package + // we cannot know if it is one of the roots as that requires knowledge of the + // graph it is part of. + Roots []string `json:",omitempty"` + + // Packages is the full set of packages in the graph. + // The packages are not connected into a graph. + // The Imports if populated will be stubs that only have their ID set. + // Imports will be connected and then type and syntax information added in a + // later pass (see refine). + Packages []*Package + + // GoVersion is the minor version number used by the driver + // (e.g. the go command on the PATH) when selecting .go files. + // Zero means unknown. + GoVersion int +} + +// driver is the type for functions that query the build system for the +// packages named by the patterns. +type driver func(cfg *Config, patterns ...string) (*DriverResponse, error) + // findExternalDriver returns the file path of a tool that supplies // the build system package structure, or "" if not found." // If GOPACKAGESDRIVER is set in the environment findExternalTool returns its @@ -64,8 +103,8 @@ func findExternalDriver(cfg *Config) driver { return nil } } - return func(cfg *Config, words ...string) (*driverResponse, error) { - req, err := json.Marshal(driverRequest{ + return func(cfg *Config, words ...string) (*DriverResponse, error) { + req, err := json.Marshal(DriverRequest{ Mode: cfg.Mode, Env: cfg.Env, BuildFlags: cfg.BuildFlags, @@ -92,7 +131,7 @@ func findExternalDriver(cfg *Config) driver { fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cmd), stderr) } - var response driverResponse + var response DriverResponse if err := json.Unmarshal(buf.Bytes(), &response); err != nil { return nil, err } diff --git a/go/packages/golist.go b/go/packages/golist.go index cd375fbc3c2..49c2d146727 100644 --- a/go/packages/golist.go +++ b/go/packages/golist.go @@ -35,23 +35,23 @@ type goTooOldError struct { error } -// responseDeduper wraps a driverResponse, deduplicating its contents. +// responseDeduper wraps a DriverResponse, deduplicating its contents. type responseDeduper struct { seenRoots map[string]bool seenPackages map[string]*Package - dr *driverResponse + dr *DriverResponse } func newDeduper() *responseDeduper { return &responseDeduper{ - dr: &driverResponse{}, + dr: &DriverResponse{}, seenRoots: map[string]bool{}, seenPackages: map[string]*Package{}, } } -// addAll fills in r with a driverResponse. -func (r *responseDeduper) addAll(dr *driverResponse) { +// addAll fills in r with a DriverResponse. +func (r *responseDeduper) addAll(dr *DriverResponse) { for _, pkg := range dr.Packages { r.addPackage(pkg) } @@ -128,7 +128,7 @@ func (state *golistState) mustGetEnv() map[string]string { // goListDriver uses the go list command to interpret the patterns and produce // the build system package structure. // See driver for more details. -func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) { +func goListDriver(cfg *Config, patterns ...string) (*DriverResponse, error) { // Make sure that any asynchronous go commands are killed when we return. parentCtx := cfg.Context if parentCtx == nil { @@ -266,7 +266,7 @@ func (state *golistState) runContainsQueries(response *responseDeduper, queries // adhocPackage attempts to load or construct an ad-hoc package for a given // query, if the original call to the driver produced inadequate results. -func (state *golistState) adhocPackage(pattern, query string) (*driverResponse, error) { +func (state *golistState) adhocPackage(pattern, query string) (*DriverResponse, error) { response, err := state.createDriverResponse(query) if err != nil { return nil, err @@ -357,7 +357,7 @@ func otherFiles(p *jsonPackage) [][]string { // createDriverResponse uses the "go list" command to expand the pattern // words and return a response for the specified packages. -func (state *golistState) createDriverResponse(words ...string) (*driverResponse, error) { +func (state *golistState) createDriverResponse(words ...string) (*DriverResponse, error) { // go list uses the following identifiers in ImportPath and Imports: // // "p" -- importable package or main (command) @@ -384,7 +384,7 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse pkgs := make(map[string]*Package) additionalErrors := make(map[string][]Error) // Decode the JSON and convert it to Package form. - response := &driverResponse{ + response := &DriverResponse{ GoVersion: goVersion, } for dec := json.NewDecoder(buf); dec.More(); { diff --git a/go/packages/packages.go b/go/packages/packages.go index 81e9e6a727d..fcdcc370032 100644 --- a/go/packages/packages.go +++ b/go/packages/packages.go @@ -206,43 +206,6 @@ type Config struct { Overlay map[string][]byte } -// driver is the type for functions that query the build system for the -// packages named by the patterns. -type driver func(cfg *Config, patterns ...string) (*driverResponse, error) - -// driverResponse contains the results for a driver query. -type driverResponse struct { - // NotHandled is returned if the request can't be handled by the current - // driver. If an external driver returns a response with NotHandled, the - // rest of the driverResponse is ignored, and go/packages will fallback - // to the next driver. If go/packages is extended in the future to support - // lists of multiple drivers, go/packages will fall back to the next driver. - NotHandled bool - - // Compiler and Arch are the arguments pass of types.SizesFor - // to get a types.Sizes to use when type checking. - Compiler string - Arch string - - // Roots is the set of package IDs that make up the root packages. - // We have to encode this separately because when we encode a single package - // we cannot know if it is one of the roots as that requires knowledge of the - // graph it is part of. - Roots []string `json:",omitempty"` - - // Packages is the full set of packages in the graph. - // The packages are not connected into a graph. - // The Imports if populated will be stubs that only have their ID set. - // Imports will be connected and then type and syntax information added in a - // later pass (see refine). - Packages []*Package - - // GoVersion is the minor version number used by the driver - // (e.g. the go command on the PATH) when selecting .go files. - // Zero means unknown. - GoVersion int -} - // Load loads and returns the Go packages named by the given patterns. // // Config specifies loading options; @@ -291,7 +254,7 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) { // no external driver, or the driver returns a response with NotHandled set, // defaultDriver will fall back to the go list driver. // The boolean result indicates that an external driver handled the request. -func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, bool, error) { +func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, error) { if driver := findExternalDriver(cfg); driver != nil { response, err := driver(cfg, patterns...) if err != nil { @@ -648,7 +611,7 @@ func newLoader(cfg *Config) *loader { // refine connects the supplied packages into a graph and then adds type // and syntax information as requested by the LoadMode. -func (ld *loader) refine(response *driverResponse) ([]*Package, error) { +func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { roots := response.Roots rootMap := make(map[string]int, len(roots)) for i, root := range roots { From 7f6ec23c61f691c6e563f741384e353179468ee6 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 11:17:06 -0500 Subject: [PATCH 036/105] go/ssa: suppress go/packages-based test on android Fixes golang/go#65183 Change-Id: I32ac6a7686e4a91a34fe37034278c4cefe34e328 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557395 Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Tim King <taking@google.com> Commit-Queue: Alan Donovan <adonovan@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- go/ssa/dom_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go/ssa/dom_test.go b/go/ssa/dom_test.go index a98468fe101..f78c7a6909a 100644 --- a/go/ssa/dom_test.go +++ b/go/ssa/dom_test.go @@ -11,9 +11,12 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/internal/testenv" ) func TestDominatorOrder(t *testing.T) { + testenv.NeedsGoBuild(t) // for go/packages + const src = `package p func f(cond bool) { From 060c748a28bbb74fb88256b8f6809c130870843b Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Thu, 11 Jan 2024 15:57:13 -0500 Subject: [PATCH 037/105] gopls: consolidate analyzers, eliminating "convenience" analyzers Make several mechanical clean-ups to analyzer implementations, reducing the complexity of their configuration and normalizing behavior. - Remove the "type error" analyzer category, since it is now an unused distinction. - Make "stubmethods" an ordinary analyzer, since it no longer needs special logic in the code action handler. - Revert infertypeargs to be an ordinary analyzer (golang/go#63821), but make its severity "hint", so that it doesn't show up in the problems tab. - Remove the "convenience" analyzer category, which only existed for the enabled/disabled configuration. The only effect of this is that the "fillstruct" analyzer can no longer be disabled, but since code actions should not be disruptive (golang/go#65167), it should be OK to have them all available. Notably, we don't allow disabling other code actions. Fixes golang/go#63821 Fixes golang/go#61559 Change-Id: I2a1cd01ea331c26fdbb35d6b5c97562c2a1f9240 Reviewed-on: https://go-review.googlesource.com/c/tools/+/556555 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/doc/analyzers.md | 298 +++++++++--------- gopls/doc/generate.go | 13 +- .../analysis/fillstruct/fillstruct.go | 40 +-- .../analysis/fillstruct/fillstruct_test.go | 23 +- .../analysis/infertypeargs/infertypeargs.go | 119 ++++++- .../analysis/infertypeargs/run_go117.go | 22 -- .../analysis/infertypeargs/run_go118.go | 123 -------- gopls/internal/analysis/stubmethods/doc.go | 2 +- .../analysis/stubmethods/stubmethods.go | 10 +- gopls/internal/lsp/source/codeaction.go | 116 +------ gopls/internal/lsp/source/diagnostics.go | 1 - gopls/internal/settings/analyzer.go | 3 + gopls/internal/settings/api_json.go | 163 +++++----- gopls/internal/settings/default.go | 4 +- gopls/internal/settings/settings.go | 106 +++---- .../test/integration/misc/fix_test.go | 12 +- gopls/internal/test/marker/doc.go | 2 +- .../testdata/codeaction/infertypeargs.txt | 18 +- .../test/marker/testdata/hover/generics.txt | 2 +- 19 files changed, 429 insertions(+), 648 deletions(-) delete mode 100644 gopls/internal/analysis/infertypeargs/run_go117.go delete mode 100644 gopls/internal/analysis/infertypeargs/run_go118.go diff --git a/gopls/doc/analyzers.md b/gopls/doc/analyzers.md index 7c6c58e4bf8..26ec5a25b69 100644 --- a/gopls/doc/analyzers.md +++ b/gopls/doc/analyzers.md @@ -263,6 +263,29 @@ known as "false sharing" that slows down both goroutines. **Disabled by default. Enable it by setting `"analyses": {"fieldalignment": true}`.** +## **fillreturns** + +fillreturns: suggest fixes for errors due to an incorrect number of return values + +This checker provides suggested fixes for type errors of the +type "wrong number of return values (want %d, got %d)". For example: + + func m() (int, string, *bool, error) { + return + } + +will turn into + + func m() (int, string, *bool, error) { + return 0, "", nil, nil + } + +This functionality is similar to https://github.com/sqs/goreturns. + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillreturns) + +**Enabled by default.** + ## **httpresponse** httpresponse: check for mistakes using HTTP responses @@ -306,6 +329,24 @@ io.Reader, so this assertion cannot succeed. **Enabled by default.** +## **infertypeargs** + +infertypeargs: check for unnecessary type arguments in call expressions + +Explicit type arguments may be omitted from call expressions if they can be +inferred from function arguments, or from other type arguments: + + func f[T any](T) {} + + func _() { + f[string]("foo") // string could be inferred + } + + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/infertypeargs) + +**Enabled by default.** + ## **loopclosure** loopclosure: check references to loop variables from within nested functions @@ -442,6 +483,43 @@ and: **Enabled by default.** +## **nonewvars** + +nonewvars: suggested fixes for "no new vars on left side of :=" + +This checker provides suggested fixes for type errors of the +type "no new vars on left side of :=". For example: + + z := 1 + z := 2 + +will turn into + + z := 1 + z = 2 + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/nonewvars) + +**Enabled by default.** + +## **noresultvalues** + +noresultvalues: suggested fixes for unexpected return values + +This checker provides suggested fixes for type errors of the +type "no result values expected" or "too many return values". +For example: + + func z() { return nil } + +will turn into + + func z() { return } + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/noresultvars) + +**Enabled by default.** + ## **printf** printf: check consistency of Printf format strings and arguments @@ -673,6 +751,42 @@ Also report certain struct tags (json, xml) used with unexported fields. **Enabled by default.** +## **stubmethods** + +stubmethods: detect missing methods and fix with stub implementations + +This analyzer detects type-checking errors due to missing methods +in assignments from concrete types to interface types, and offers +a suggested fix that will create a set of stub methods so that +the concrete type satisfies the interface. + +For example, this function will not compile because the value +NegativeErr{} does not implement the "error" interface: + + func sqrt(x float64) (float64, error) { + if x < 0 { + return 0, NegativeErr{} // error: missing method + } + ... + } + + type NegativeErr struct{} + +This analyzer will suggest a fix to declare this method: + + // Error implements error.Error. + func (NegativeErr) Error() string { + panic("unimplemented") + } + +(At least, it appears to behave that way, but technically it +doesn't use the SuggestedFix mechanism and the stub is created by +logic in gopls's source.stub function.) + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods) + +**Enabled by default.** + ## **testinggoroutine** testinggoroutine: report calls to (*testing.T).Fatal from goroutines started by a test @@ -719,6 +833,26 @@ standards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended. **Enabled by default.** +## **undeclaredname** + +undeclaredname: suggested fixes for "undeclared name: <>" + +This checker provides suggested fixes for type errors of the +type "undeclared name: <>". It will either insert a new statement, +such as: + + <> := + +or a new function declaration, such as: + + func <>(inferred parameters) { + panic("implement me!") + } + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/undeclaredname) + +**Enabled by default.** + ## **unmarshal** unmarshal: report passing non-pointer or non-interface values to unmarshal @@ -803,6 +937,14 @@ The set of functions may be controlled using flags. **Enabled by default.** +## **unusedvariable** + +unusedvariable: check for unused variables and suggest fixes + +[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedvariable) + +**Disabled by default. Enable it by setting `"analyses": {"unusedvariable": true}`.** + ## **unusedwrite** unusedwrite: checks for unused writes @@ -843,160 +985,4 @@ useany: check for constraints that could be simplified to "any" **Disabled by default. Enable it by setting `"analyses": {"useany": true}`.** -## **fillreturns** - -fillreturns: suggest fixes for errors due to an incorrect number of return values - -This checker provides suggested fixes for type errors of the -type "wrong number of return values (want %d, got %d)". For example: - - func m() (int, string, *bool, error) { - return - } - -will turn into - - func m() (int, string, *bool, error) { - return 0, "", nil, nil - } - -This functionality is similar to https://github.com/sqs/goreturns. - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillreturns) - -**Enabled by default.** - -## **nonewvars** - -nonewvars: suggested fixes for "no new vars on left side of :=" - -This checker provides suggested fixes for type errors of the -type "no new vars on left side of :=". For example: - - z := 1 - z := 2 - -will turn into - - z := 1 - z = 2 - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/nonewvars) - -**Enabled by default.** - -## **noresultvalues** - -noresultvalues: suggested fixes for unexpected return values - -This checker provides suggested fixes for type errors of the -type "no result values expected" or "too many return values". -For example: - - func z() { return nil } - -will turn into - - func z() { return } - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/noresultvars) - -**Enabled by default.** - -## **undeclaredname** - -undeclaredname: suggested fixes for "undeclared name: <>" - -This checker provides suggested fixes for type errors of the -type "undeclared name: <>". It will either insert a new statement, -such as: - - <> := - -or a new function declaration, such as: - - func <>(inferred parameters) { - panic("implement me!") - } - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/undeclaredname) - -**Enabled by default.** - -## **unusedvariable** - -unusedvariable: check for unused variables and suggest fixes - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedvariable) - -**Disabled by default. Enable it by setting `"analyses": {"unusedvariable": true}`.** - -## **fillstruct** - -fillstruct: note incomplete struct initializations - -This analyzer provides diagnostics for any struct literals that do not have -any fields initialized. Because the suggested fix for this analysis is -expensive to compute, callers should compute it separately, using the -SuggestedFix function below. - - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillstruct) - -**Enabled by default.** - -## **infertypeargs** - -infertypeargs: check for unnecessary type arguments in call expressions - -Explicit type arguments may be omitted from call expressions if they can be -inferred from function arguments, or from other type arguments: - - func f[T any](T) {} - - func _() { - f[string]("foo") // string could be inferred - } - - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/infertypeargs) - -**Enabled by default.** - -## **stubmethods** - -stubmethods: detect missing methods and fix with stub implementations - -This analyzer detects type-checking errors due to missing methods -in assignments from concrete types to interface types, and offers -a suggested fix that will create a set of stub methods so that -the concrete type satisfies the interface. - -For example, this function will not compile because the value -NegativeErr{} does not implement the "error" interface: - - func sqrt(x float64) (float64, error) { - if x < 0 { - return 0, NegativeErr{} // error: missing method - } - ... - } - - type NegativeErr struct{} - -This analyzer will suggest a fix to declare this method: - - // Error implements error.Error. - func (NegativeErr) Error() string { - panic("unimplemented") - } - -(At least, it appears to behave that way, but technically it -doesn't use the SuggestedFix mechanism and the stub is created by -logic in gopls's source.stub function.) - -[Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods) - -**Enabled by default.** - <!-- END Analyzers: DO NOT MANUALLY EDIT THIS SECTION --> diff --git a/gopls/doc/generate.go b/gopls/doc/generate.go index ee5c52b0750..c0bcf06ae61 100644 --- a/gopls/doc/generate.go +++ b/gopls/doc/generate.go @@ -108,10 +108,11 @@ func loadAPI() (*settings.APIJSON, error) { } pkg := pkgs[0] + defaults := settings.DefaultOptions() api := &settings.APIJSON{ - Options: map[string][]*settings.OptionJSON{}, + Options: map[string][]*settings.OptionJSON{}, + Analyzers: loadAnalyzers(defaults.DefaultAnalyzers), // no staticcheck analyzers } - defaults := settings.DefaultOptions() api.Commands, err = loadCommands(pkg) if err != nil { @@ -123,14 +124,6 @@ func loadAPI() (*settings.APIJSON, error) { for _, c := range api.Commands { c.Command = command.ID(c.Command) } - for _, m := range []map[string]*settings.Analyzer{ - defaults.DefaultAnalyzers, - defaults.TypeErrorAnalyzers, - defaults.ConvenienceAnalyzers, - // Don't yet add staticcheck analyzers. - } { - api.Analyzers = append(api.Analyzers, loadAnalyzers(m)...) - } api.Hints = loadHints(source.AllInlayHints) for _, category := range []reflect.Value{ reflect.ValueOf(defaults.UserOptions), diff --git a/gopls/internal/analysis/fillstruct/fillstruct.go b/gopls/internal/analysis/fillstruct/fillstruct.go index b66a685760e..1f8183fdcfa 100644 --- a/gopls/internal/analysis/fillstruct/fillstruct.go +++ b/gopls/internal/analysis/fillstruct/fillstruct.go @@ -23,7 +23,6 @@ import ( "unicode" "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/util/safetoken" @@ -31,41 +30,14 @@ import ( "golang.org/x/tools/internal/fuzzy" ) -const Doc = `note incomplete struct initializations - -This analyzer provides diagnostics for any struct literals that do not have -any fields initialized. Because the suggested fix for this analysis is -expensive to compute, callers should compute it separately, using the -SuggestedFix function below. -` - -var Analyzer = &analysis.Analyzer{ - Name: "fillstruct", - Doc: Doc, - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Run: run, - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillstruct", - RunDespiteErrors: true, -} - -// TODO(rfindley): remove this thin wrapper around the fillstruct refactoring, -// and eliminate the fillstruct analyzer. +// Diagnose computes diagnostics for fillable struct literals overlapping with +// the provided start and end position. // -// Previous iterations used the analysis framework for computing refactorings, -// which proved inefficient. -func run(pass *analysis.Pass) (interface{}, error) { - inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) - for _, d := range DiagnoseFillableStructs(inspect, token.NoPos, token.NoPos, pass.Pkg, pass.TypesInfo) { - pass.Report(d) - } - return nil, nil -} - -// DiagnoseFillableStructs computes diagnostics for fillable struct composite -// literals overlapping with the provided start and end position. +// The diagnostic contains a lazy fix; the actual patch is computed +// (via the ApplyFix command) by a call to [SuggestedFix]. // -// If either start or end is invalid, it is considered an unbounded condition. -func DiagnoseFillableStructs(inspect *inspector.Inspector, start, end token.Pos, pkg *types.Package, info *types.Info) []analysis.Diagnostic { +// If either start or end is invalid, the entire package is inspected. +func Diagnose(inspect *inspector.Inspector, start, end token.Pos, pkg *types.Package, info *types.Info) []analysis.Diagnostic { var diags []analysis.Diagnostic nodeFilter := []ast.Node{(*ast.CompositeLit)(nil)} inspect.Preorder(nodeFilter, func(n ast.Node) { diff --git a/gopls/internal/analysis/fillstruct/fillstruct_test.go b/gopls/internal/analysis/fillstruct/fillstruct_test.go index 39fc81fee75..f90998fa459 100644 --- a/gopls/internal/analysis/fillstruct/fillstruct_test.go +++ b/gopls/internal/analysis/fillstruct/fillstruct_test.go @@ -5,13 +5,34 @@ package fillstruct_test import ( + "go/token" "testing" + "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/analysistest" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/analysis/fillstruct" ) +// analyzer allows us to test the fillstruct code action using the analysistest +// harness. (fillstruct used to be a gopls analyzer.) +var analyzer = &analysis.Analyzer{ + Name: "fillstruct", + Doc: "test only", + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Run: func(pass *analysis.Pass) (any, error) { + inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) + for _, d := range fillstruct.Diagnose(inspect, token.NoPos, token.NoPos, pass.Pkg, pass.TypesInfo) { + pass.Report(d) + } + return nil, nil + }, + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillstruct", + RunDespiteErrors: true, +} + func Test(t *testing.T) { testdata := analysistest.TestData() - analysistest.Run(t, testdata, fillstruct.Analyzer, "a", "typeparams") + analysistest.Run(t, testdata, analyzer, "a", "typeparams") } diff --git a/gopls/internal/analysis/infertypeargs/infertypeargs.go b/gopls/internal/analysis/infertypeargs/infertypeargs.go index 2c3fdd31a94..9a514ad620c 100644 --- a/gopls/internal/analysis/infertypeargs/infertypeargs.go +++ b/gopls/internal/analysis/infertypeargs/infertypeargs.go @@ -2,16 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package infertypeargs defines an analyzer that checks for explicit function -// arguments that could be inferred. package infertypeargs import ( + "go/ast" "go/token" + "go/types" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/internal/typeparams" + "golang.org/x/tools/internal/versions" ) const Doc = `check for unnecessary type arguments in call expressions @@ -34,15 +36,114 @@ var Analyzer = &analysis.Analyzer{ URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/infertypeargs", } -// TODO(rfindley): remove this thin wrapper around the infertypeargs refactoring, -// and eliminate the infertypeargs analyzer. -// -// Previous iterations used the analysis framework for computing refactorings, -// which proved inefficient. -func run(pass *analysis.Pass) (interface{}, error) { +func run(pass *analysis.Pass) (any, error) { inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) - for _, diag := range DiagnoseInferableTypeArgs(pass.Fset, inspect, token.NoPos, token.NoPos, pass.Pkg, pass.TypesInfo) { + for _, diag := range diagnose(pass.Fset, inspect, token.NoPos, token.NoPos, pass.Pkg, pass.TypesInfo) { pass.Report(diag) } return nil, nil } + +// Diagnose reports diagnostics describing simplifications to type +// arguments overlapping with the provided start and end position. +// +// If start or end is token.NoPos, the corresponding bound is not checked +// (i.e. if both start and end are NoPos, all call expressions are considered). +func diagnose(fset *token.FileSet, inspect *inspector.Inspector, start, end token.Pos, pkg *types.Package, info *types.Info) []analysis.Diagnostic { + var diags []analysis.Diagnostic + + nodeFilter := []ast.Node{(*ast.CallExpr)(nil)} + inspect.Preorder(nodeFilter, func(node ast.Node) { + call := node.(*ast.CallExpr) + x, lbrack, indices, rbrack := typeparams.UnpackIndexExpr(call.Fun) + ident := calledIdent(x) + if ident == nil || len(indices) == 0 { + return // no explicit args, nothing to do + } + + if (start.IsValid() && call.End() < start) || (end.IsValid() && call.Pos() > end) { + return // non-overlapping + } + + // Confirm that instantiation actually occurred at this ident. + idata, ok := info.Instances[ident] + if !ok { + return // something went wrong, but fail open + } + instance := idata.Type + + // Start removing argument expressions from the right, and check if we can + // still infer the call expression. + required := len(indices) // number of type expressions that are required + for i := len(indices) - 1; i >= 0; i-- { + var fun ast.Expr + if i == 0 { + // No longer an index expression: just use the parameterized operand. + fun = x + } else { + fun = typeparams.PackIndexExpr(x, lbrack, indices[:i], indices[i-1].End()) + } + newCall := &ast.CallExpr{ + Fun: fun, + Lparen: call.Lparen, + Args: call.Args, + Ellipsis: call.Ellipsis, + Rparen: call.Rparen, + } + info := &types.Info{ + Instances: make(map[*ast.Ident]types.Instance), + } + versions.InitFileVersions(info) + if err := types.CheckExpr(fset, pkg, call.Pos(), newCall, info); err != nil { + // Most likely inference failed. + break + } + newIData := info.Instances[ident] + newInstance := newIData.Type + if !types.Identical(instance, newInstance) { + // The inferred result type does not match the original result type, so + // this simplification is not valid. + break + } + required = i + } + if required < len(indices) { + var s, e token.Pos + var edit analysis.TextEdit + if required == 0 { + s, e = lbrack, rbrack+1 // erase the entire index + edit = analysis.TextEdit{Pos: s, End: e} + } else { + s = indices[required].Pos() + e = rbrack + // erase from end of last arg to include last comma & white-spaces + edit = analysis.TextEdit{Pos: indices[required-1].End(), End: e} + } + // Recheck that our (narrower) fixes overlap with the requested range. + if (start.IsValid() && e < start) || (end.IsValid() && s > end) { + return // non-overlapping + } + diags = append(diags, analysis.Diagnostic{ + Pos: s, + End: e, + Message: "unnecessary type arguments", + SuggestedFixes: []analysis.SuggestedFix{{ + Message: "Simplify type arguments", + TextEdits: []analysis.TextEdit{edit}, + }}, + }) + } + }) + + return diags +} + +func calledIdent(x ast.Expr) *ast.Ident { + switch x := x.(type) { + case *ast.Ident: + return x + case *ast.SelectorExpr: + return x.Sel + } + return nil +} diff --git a/gopls/internal/analysis/infertypeargs/run_go117.go b/gopls/internal/analysis/infertypeargs/run_go117.go deleted file mode 100644 index fdf831830dd..00000000000 --- a/gopls/internal/analysis/infertypeargs/run_go117.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.18 -// +build !go1.18 - -package infertypeargs - -import ( - "go/token" - "go/types" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/ast/inspector" -) - -// DiagnoseInferableTypeArgs returns an empty slice, as generics are not supported at -// this go version. -func DiagnoseInferableTypeArgs(fset *token.FileSet, inspect *inspector.Inspector, start, end token.Pos, pkg *types.Package, info *types.Info) []analysis.Diagnostic { - return nil -} diff --git a/gopls/internal/analysis/infertypeargs/run_go118.go b/gopls/internal/analysis/infertypeargs/run_go118.go deleted file mode 100644 index b3fff4e8408..00000000000 --- a/gopls/internal/analysis/infertypeargs/run_go118.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.18 -// +build go1.18 - -package infertypeargs - -import ( - "go/ast" - "go/token" - "go/types" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/ast/inspector" - "golang.org/x/tools/internal/typeparams" - "golang.org/x/tools/internal/versions" -) - -// DiagnoseInferableTypeArgs reports diagnostics describing simplifications to type -// arguments overlapping with the provided start and end position. -// -// If start or end is token.NoPos, the corresponding bound is not checked -// (i.e. if both start and end are NoPos, all call expressions are considered). -func DiagnoseInferableTypeArgs(fset *token.FileSet, inspect *inspector.Inspector, start, end token.Pos, pkg *types.Package, info *types.Info) []analysis.Diagnostic { - var diags []analysis.Diagnostic - - nodeFilter := []ast.Node{(*ast.CallExpr)(nil)} - inspect.Preorder(nodeFilter, func(node ast.Node) { - call := node.(*ast.CallExpr) - x, lbrack, indices, rbrack := typeparams.UnpackIndexExpr(call.Fun) - ident := calledIdent(x) - if ident == nil || len(indices) == 0 { - return // no explicit args, nothing to do - } - - if (start.IsValid() && call.End() < start) || (end.IsValid() && call.Pos() > end) { - return // non-overlapping - } - - // Confirm that instantiation actually occurred at this ident. - idata, ok := info.Instances[ident] - if !ok { - return // something went wrong, but fail open - } - instance := idata.Type - - // Start removing argument expressions from the right, and check if we can - // still infer the call expression. - required := len(indices) // number of type expressions that are required - for i := len(indices) - 1; i >= 0; i-- { - var fun ast.Expr - if i == 0 { - // No longer an index expression: just use the parameterized operand. - fun = x - } else { - fun = typeparams.PackIndexExpr(x, lbrack, indices[:i], indices[i-1].End()) - } - newCall := &ast.CallExpr{ - Fun: fun, - Lparen: call.Lparen, - Args: call.Args, - Ellipsis: call.Ellipsis, - Rparen: call.Rparen, - } - info := &types.Info{ - Instances: make(map[*ast.Ident]types.Instance), - } - versions.InitFileVersions(info) - if err := types.CheckExpr(fset, pkg, call.Pos(), newCall, info); err != nil { - // Most likely inference failed. - break - } - newIData := info.Instances[ident] - newInstance := newIData.Type - if !types.Identical(instance, newInstance) { - // The inferred result type does not match the original result type, so - // this simplification is not valid. - break - } - required = i - } - if required < len(indices) { - var s, e token.Pos - var edit analysis.TextEdit - if required == 0 { - s, e = lbrack, rbrack+1 // erase the entire index - edit = analysis.TextEdit{Pos: s, End: e} - } else { - s = indices[required].Pos() - e = rbrack - // erase from end of last arg to include last comma & white-spaces - edit = analysis.TextEdit{Pos: indices[required-1].End(), End: e} - } - // Recheck that our (narrower) fixes overlap with the requested range. - if (start.IsValid() && e < start) || (end.IsValid() && s > end) { - return // non-overlapping - } - diags = append(diags, analysis.Diagnostic{ - Pos: s, - End: e, - Message: "unnecessary type arguments", - SuggestedFixes: []analysis.SuggestedFix{{ - Message: "simplify type arguments", - TextEdits: []analysis.TextEdit{edit}, - }}, - }) - } - }) - - return diags -} - -func calledIdent(x ast.Expr) *ast.Ident { - switch x := x.(type) { - case *ast.Ident: - return x - case *ast.SelectorExpr: - return x.Sel - } - return nil -} diff --git a/gopls/internal/analysis/stubmethods/doc.go b/gopls/internal/analysis/stubmethods/doc.go index 5b5957d2c69..4a433762399 100644 --- a/gopls/internal/analysis/stubmethods/doc.go +++ b/gopls/internal/analysis/stubmethods/doc.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package stubmethods defines an analyzer for missing interface methods. +// Package stubmethods defines a code action for missing interface methods. // // # Analyzer stubmethods // diff --git a/gopls/internal/analysis/stubmethods/stubmethods.go b/gopls/internal/analysis/stubmethods/stubmethods.go index 78885a3ed46..1215be840d0 100644 --- a/gopls/internal/analysis/stubmethods/stubmethods.go +++ b/gopls/internal/analysis/stubmethods/stubmethods.go @@ -73,9 +73,6 @@ func MatchesMessage(msg string) bool { // interface to fix the type checking error defined by (start, end, msg). // // If no such fix is possible, the second result is false. -// -// TODO(rfindley): simplify this signature once the stubmethods refactoring is -// no longer wedged into the analysis framework. func DiagnosticForError(fset *token.FileSet, file *ast.File, start, end token.Pos, msg string, info *types.Info) (analysis.Diagnostic, bool) { if !MatchesMessage(msg) { return analysis.Diagnostic{}, false @@ -89,10 +86,9 @@ func DiagnosticForError(fset *token.FileSet, file *ast.File, start, end token.Po qf := typesutil.FileQualifier(file, si.Concrete.Obj().Pkg(), info) iface := types.TypeString(si.Interface.Type(), qf) return analysis.Diagnostic{ - Pos: start, - End: end, - Message: fmt.Sprintf("Type %v lacks methods of interface %s", - types.TypeString(si.Concrete, qf), iface), + Pos: start, + End: end, + Message: msg, Category: FixCategory, SuggestedFixes: []analysis.SuggestedFix{{ Message: fmt.Sprintf("Declare missing methods of %s", iface), diff --git a/gopls/internal/lsp/source/codeaction.go b/gopls/internal/lsp/source/codeaction.go index b4b183a5ff6..b06430e06a3 100644 --- a/gopls/internal/lsp/source/codeaction.go +++ b/gopls/internal/lsp/source/codeaction.go @@ -9,14 +9,10 @@ import ( "encoding/json" "fmt" "go/ast" - "log" "strings" - "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/analysis/fillstruct" - "golang.org/x/tools/gopls/internal/analysis/infertypeargs" - "golang.org/x/tools/gopls/internal/analysis/stubmethods" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" @@ -93,69 +89,14 @@ func CodeActions(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, } } - var stubMethodsDiagnostics []protocol.Diagnostic - if wantQuickFixes && snapshot.Options().IsAnalyzerEnabled(stubmethods.Analyzer.Name) { - for _, pd := range diagnostics { - if stubmethods.MatchesMessage(pd.Message) { - stubMethodsDiagnostics = append(stubMethodsDiagnostics, pd) - } - } - } - // Code actions requiring type information. - if len(stubMethodsDiagnostics) > 0 || - want[protocol.RefactorRewrite] || + if want[protocol.RefactorRewrite] || want[protocol.RefactorInline] || want[protocol.GoTest] { pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) if err != nil { return nil, err } - for _, pd := range stubMethodsDiagnostics { - start, end, err := pgf.RangePos(pd.Range) - if err != nil { - return nil, err - } - - var ( - diag analysis.Diagnostic - ok bool - ) - func() { - // golang/go#61693: code actions were refactored to run - // outside of the analysis framework, but as a result - // they lost their panic recovery. - // - // Stubmethods "should never fail"", but put back the - // panic recovery as a defensive measure. - defer func() { - if r := recover(); r != nil { - err = bug.Errorf("stubmethods panicked: %v", r) - } - }() - diag, ok = stubmethods.DiagnosticForError(pkg.FileSet(), pgf.File, start, end, pd.Message, pkg.GetTypesInfo()) - }() - if err != nil { - return nil, err // panicked - } - if !ok { - continue - } - - for _, fix := range diag.SuggestedFixes { - cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ - Fix: diag.Category, - URI: pgf.URI, - Range: pd.Range, - ResolveEdits: supportsResolveEdits(snapshot.Options()), - }) - if err != nil { - log.Fatalf("NewApplyFixCommand: %v", err) - } - actions = append(actions, newCodeAction(fix.Message, protocol.QuickFix, &cmd, nil, snapshot.Options())) - } - } - if want[protocol.RefactorRewrite] { rewrites, err := getRewriteCodeActions(snapshot, pkg, pgf, fh, rng, snapshot.Options()) if err != nil { @@ -368,24 +309,22 @@ func getRewriteCodeActions(snapshot *cache.Snapshot, pkg *cache.Package, pgf *Pa // // TODO: Consider removing the inspection after convenienceAnalyzers are removed. inspect := inspector.New([]*ast.File{pgf.File}) - if snapshot.Options().IsAnalyzerEnabled(fillstruct.Analyzer.Name) { - for _, diag := range fillstruct.DiagnoseFillableStructs(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { - rng, err := pgf.Mapper.PosRange(pgf.Tok, diag.Pos, diag.End) + for _, diag := range fillstruct.Diagnose(inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { + rng, err := pgf.Mapper.PosRange(pgf.Tok, diag.Pos, diag.End) + if err != nil { + return nil, err + } + for _, fix := range diag.SuggestedFixes { + cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ + Fix: diag.Category, + URI: pgf.URI, + Range: rng, + ResolveEdits: supportsResolveEdits(options), + }) if err != nil { return nil, err } - for _, fix := range diag.SuggestedFixes { - cmd, err := command.NewApplyFixCommand(fix.Message, command.ApplyFixArgs{ - Fix: diag.Category, - URI: pgf.URI, - Range: rng, - ResolveEdits: supportsResolveEdits(options), - }) - if err != nil { - return nil, err - } - commands = append(commands, cmd) - } + commands = append(commands, cmd) } } @@ -393,33 +332,6 @@ func getRewriteCodeActions(snapshot *cache.Snapshot, pkg *cache.Package, pgf *Pa actions = append(actions, newCodeAction(commands[i].Title, protocol.RefactorRewrite, &commands[i], nil, options)) } - if snapshot.Options().IsAnalyzerEnabled(infertypeargs.Analyzer.Name) { - for _, d := range infertypeargs.DiagnoseInferableTypeArgs(pkg.FileSet(), inspect, start, end, pkg.GetTypes(), pkg.GetTypesInfo()) { - if len(d.SuggestedFixes) != 1 { - panic(fmt.Sprintf("unexpected number of suggested fixes from infertypeargs: %v", len(d.SuggestedFixes))) - } - fix := d.SuggestedFixes[0] - var edits []protocol.TextEdit - for _, analysisEdit := range fix.TextEdits { - rng, err := pgf.Mapper.PosRange(pgf.Tok, analysisEdit.Pos, analysisEdit.End) - if err != nil { - return nil, err - } - edits = append(edits, protocol.TextEdit{ - Range: rng, - NewText: string(analysisEdit.NewText), - }) - } - actions = append(actions, protocol.CodeAction{ - Title: "Simplify type arguments", - Kind: protocol.RefactorRewrite, - Edit: &protocol.WorkspaceEdit{ - DocumentChanges: documentChanges(fh, edits), - }, - }) - } - } - return actions, nil } diff --git a/gopls/internal/lsp/source/diagnostics.go b/gopls/internal/lsp/source/diagnostics.go index 6cda179edf0..273cc953f2c 100644 --- a/gopls/internal/lsp/source/diagnostics.go +++ b/gopls/internal/lsp/source/diagnostics.go @@ -30,7 +30,6 @@ func Analyze(ctx context.Context, snapshot *cache.Snapshot, pkgIDs map[PackageID categories := []map[string]*settings.Analyzer{ options.DefaultAnalyzers, options.StaticcheckAnalyzers, - options.TypeErrorAnalyzers, } var analyzers []*settings.Analyzer diff --git a/gopls/internal/settings/analyzer.go b/gopls/internal/settings/analyzer.go index 3898f39de76..ccf94e3e32d 100644 --- a/gopls/internal/settings/analyzer.go +++ b/gopls/internal/settings/analyzer.go @@ -26,6 +26,9 @@ type Analyzer struct { // Severity is the severity set for diagnostics reported by this // analyzer. If left unset it defaults to Warning. + // + // Note: diagnostics with severity protocol.SeverityHint do not show up in + // the VS Code "problems" tab. Severity protocol.DiagnosticSeverity // Tag is extra tags (unnecessary, deprecated, etc) for diagnostics diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index 850632c1592..d7841278c43 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -303,6 +303,11 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "find structs that would use less memory if their fields were sorted\n\nThis analyzer find structs that can be rearranged to use less memory, and provides\na suggested edit with the most compact order.\n\nNote that there are two different diagnostics reported. One checks struct size,\nand the other reports \"pointer bytes\" used. Pointer bytes is how many bytes of the\nobject that the garbage collector has to potentially scan for pointers, for example:\n\n\tstruct { uint32; string }\n\nhave 16 pointer bytes because the garbage collector has to scan up through the string's\ninner pointer.\n\n\tstruct { string; *uint32 }\n\nhas 24 pointer bytes because it has to scan further through the *uint32.\n\n\tstruct { string; uint32 }\n\nhas 8 because it can stop immediately after the string pointer.\n\nBe aware that the most compact order is not always the most efficient.\nIn rare cases it may cause two variables each updated by its own goroutine\nto occupy the same CPU cache line, inducing a form of memory contention\nknown as \"false sharing\" that slows down both goroutines.\n", Default: "false", }, + { + Name: "\"fillreturns\"", + Doc: "suggest fixes for errors due to an incorrect number of return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"wrong number of return values (want %d, got %d)\". For example:\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn\n\t}\n\nwill turn into\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn 0, \"\", nil, nil\n\t}\n\nThis functionality is similar to https://github.com/sqs/goreturns.", + Default: "true", + }, { Name: "\"httpresponse\"", Doc: "check for mistakes using HTTP responses\n\nA common mistake when using the net/http package is to defer a function\ncall to close the http.Response Body before checking the error that\ndetermines whether the response is valid:\n\n\tresp, err := http.Head(url)\n\tdefer resp.Body.Close()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// (defer statement belongs here)\n\nThis checker helps uncover latent nil dereference bugs by reporting a\ndiagnostic for such mistakes.", @@ -313,6 +318,11 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "detect impossible interface-to-interface type assertions\n\nThis checker flags type assertions v.(T) and corresponding type-switch cases\nin which the static type V of v is an interface that cannot possibly implement\nthe target interface T. This occurs when V and T contain methods with the same\nname but different signatures. Example:\n\n\tvar v interface {\n\t\tRead()\n\t}\n\t_ = v.(io.Reader)\n\nThe Read method in v has a different signature than the Read method in\nio.Reader, so this assertion cannot succeed.", Default: "true", }, + { + Name: "\"infertypeargs\"", + Doc: "check for unnecessary type arguments in call expressions\n\nExplicit type arguments may be omitted from call expressions if they can be\ninferred from function arguments, or from other type arguments:\n\n\tfunc f[T any](T) {}\n\t\n\tfunc _() {\n\t\tf[string](\"foo\") // string could be inferred\n\t}\n", + Default: "true", + }, { Name: "\"loopclosure\"", Doc: "check references to loop variables from within nested functions\n\nThis analyzer reports places where a function literal references the\niteration variable of an enclosing loop, and the loop calls the function\nin such a way (e.g. with go or defer) that it may outlive the loop\niteration and possibly observe the wrong value of the variable.\n\nNote: An iteration variable can only outlive a loop iteration in Go versions <=1.21.\nIn Go 1.22 and later, the loop variable lifetimes changed to create a new\niteration variable per loop iteration. (See go.dev/issue/60078.)\n\nIn this example, all the deferred functions run after the loop has\ncompleted, so all observe the final value of v [<go1.22].\n\n\tfor _, v := range list {\n\t defer func() {\n\t use(v) // incorrect\n\t }()\n\t}\n\nOne fix is to create a new variable for each iteration of the loop:\n\n\tfor _, v := range list {\n\t v := v // new var per iteration\n\t defer func() {\n\t use(v) // ok\n\t }()\n\t}\n\nAfter Go version 1.22, the previous two for loops are equivalent\nand both are correct.\n\nThe next example uses a go statement and has a similar problem [<go1.22].\nIn addition, it has a data race because the loop updates v\nconcurrent with the goroutines accessing it.\n\n\tfor _, v := range elem {\n\t go func() {\n\t use(v) // incorrect, and a data race\n\t }()\n\t}\n\nA fix is the same as before. The checker also reports problems\nin goroutines started by golang.org/x/sync/errgroup.Group.\nA hard-to-spot variant of this form is common in parallel tests:\n\n\tfunc Test(t *testing.T) {\n\t for _, test := range tests {\n\t t.Run(test.name, func(t *testing.T) {\n\t t.Parallel()\n\t use(test) // incorrect, and a data race\n\t })\n\t }\n\t}\n\nThe t.Parallel() call causes the rest of the function to execute\nconcurrent with the loop [<go1.22].\n\nThe analyzer reports references only in the last statement,\nas it is not deep enough to understand the effects of subsequent\nstatements that might render the reference benign.\n(\"Last statement\" is defined recursively in compound\nstatements such as if, switch, and select.)\n\nSee: https://golang.org/doc/go_faq.html#closures_and_goroutines", @@ -333,6 +343,16 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check for redundant or impossible nil comparisons\n\nThe nilness checker inspects the control-flow graph of each function in\na package and reports nil pointer dereferences, degenerate nil\npointers, and panics with nil values. A degenerate comparison is of the form\nx==nil or x!=nil where x is statically known to be nil or non-nil. These are\noften a mistake, especially in control flow related to errors. Panics with nil\nvalues are checked because they are not detectable by\n\n\tif r := recover(); r != nil {\n\nThis check reports conditions such as:\n\n\tif f == nil { // impossible condition (f is a function)\n\t}\n\nand:\n\n\tp := &v\n\t...\n\tif p != nil { // tautological condition\n\t}\n\nand:\n\n\tif p == nil {\n\t\tprint(*p) // nil dereference\n\t}\n\nand:\n\n\tif p == nil {\n\t\tpanic(p)\n\t}", Default: "true", }, + { + Name: "\"nonewvars\"", + Doc: "suggested fixes for \"no new vars on left side of :=\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"no new vars on left side of :=\". For example:\n\n\tz := 1\n\tz := 2\n\nwill turn into\n\n\tz := 1\n\tz = 2", + Default: "true", + }, + { + Name: "\"noresultvalues\"", + Doc: "suggested fixes for unexpected return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"no result values expected\" or \"too many return values\".\nFor example:\n\n\tfunc z() { return nil }\n\nwill turn into\n\n\tfunc z() { return }", + Default: "true", + }, { Name: "\"printf\"", Doc: "check consistency of Printf format strings and arguments\n\nThe check applies to calls of the formatting functions such as\n[fmt.Printf] and [fmt.Sprintf], as well as any detected wrappers of\nthose functions.\n\nIn this example, the %d format operator requires an integer operand:\n\n\tfmt.Printf(\"%d\", \"hello\") // fmt.Printf format %d has arg \"hello\" of wrong type string\n\nSee the documentation of the fmt package for the complete set of\nformat operators and their operand types.\n\nTo enable printf checking on a function that is not found by this\nanalyzer's heuristics (for example, because control is obscured by\ndynamic method calls), insert a bogus call:\n\n\tfunc MyPrintf(format string, args ...any) {\n\t\tif false {\n\t\t\t_ = fmt.Sprintf(format, args...) // enable printf checker\n\t\t}\n\t\t...\n\t}\n\nThe -funcs flag specifies a comma-separated list of names of additional\nknown formatting functions or methods. If the name contains a period,\nit must denote a specific function using one of the following forms:\n\n\tdir/pkg.Function\n\tdir/pkg.Type.Method\n\t(*dir/pkg.Type).Method\n\nOtherwise the name is interpreted as a case-insensitive unqualified\nidentifier such as \"errorf\". Either way, if a listed name ends in f, the\nfunction is assumed to be Printf-like, taking a format string before the\nargument list. Otherwise it is assumed to be Print-like, taking a list\nof arguments with no format string.", @@ -388,6 +408,11 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check that struct field tags conform to reflect.StructTag.Get\n\nAlso report certain struct tags (json, xml) used with unexported fields.", Default: "true", }, + { + Name: "\"stubmethods\"", + Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", + Default: "true", + }, { Name: "\"testinggoroutine\"", Doc: "report calls to (*testing.T).Fatal from goroutines started by a test\n\nFunctions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and\nSkip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.\nThis checker detects calls to these functions that occur within a goroutine\nstarted by the test. For example:\n\n\tfunc TestFoo(t *testing.T) {\n\t go func() {\n\t t.Fatal(\"oops\") // error: (*T).Fatal called from non-test goroutine\n\t }()\n\t}", @@ -403,6 +428,11 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check for calls of (time.Time).Format or time.Parse with 2006-02-01\n\nThe timeformat checker looks for time formats with the 2006-02-01 (yyyy-dd-mm)\nformat. Internationally, \"yyyy-dd-mm\" does not occur in common calendar date\nstandards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended.", Default: "true", }, + { + Name: "\"undeclaredname\"", + Doc: "suggested fixes for \"undeclared name: <>\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"undeclared name: <>\". It will either insert a new statement,\nsuch as:\n\n\t<> :=\n\nor a new function declaration, such as:\n\n\tfunc <>(inferred parameters) {\n\t\tpanic(\"implement me!\")\n\t}", + Default: "true", + }, { Name: "\"unmarshal\"", Doc: "report passing non-pointer or non-interface values to unmarshal\n\nThe unmarshal analysis reports calls to functions such as json.Unmarshal\nin which the argument type is not a pointer or an interface.", @@ -428,6 +458,11 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check for unused results of calls to some functions\n\nSome functions like fmt.Errorf return a result and have no side\neffects, so it is always a mistake to discard the result. Other\nfunctions may return an error that must not be ignored, or a cleanup\noperation that must be called. This analyzer reports calls to\nfunctions like these when the result of the call is ignored.\n\nThe set of functions may be controlled using flags.", Default: "true", }, + { + Name: "\"unusedvariable\"", + Doc: "check for unused variables and suggest fixes", + Default: "false", + }, { Name: "\"unusedwrite\"", Doc: "checks for unused writes\n\nThe analyzer reports instances of writes to struct fields and\narrays that are never read. Specifically, when a struct object\nor an array is copied, its elements are copied implicitly by\nthe compiler, and any element write to this copy does nothing\nwith the original object.\n\nFor example:\n\n\ttype T struct { x int }\n\n\tfunc f(input []T) {\n\t\tfor i, v := range input { // v is a copy\n\t\t\tv.x = i // unused write to field x\n\t\t}\n\t}\n\nAnother example is about non-pointer receiver:\n\n\ttype T struct { x int }\n\n\tfunc (t T) f() { // t is a copy\n\t\tt.x = i // unused write to field x\n\t}", @@ -438,46 +473,6 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check for constraints that could be simplified to \"any\"", Default: "false", }, - { - Name: "\"fillreturns\"", - Doc: "suggest fixes for errors due to an incorrect number of return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"wrong number of return values (want %d, got %d)\". For example:\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn\n\t}\n\nwill turn into\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn 0, \"\", nil, nil\n\t}\n\nThis functionality is similar to https://github.com/sqs/goreturns.", - Default: "true", - }, - { - Name: "\"nonewvars\"", - Doc: "suggested fixes for \"no new vars on left side of :=\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"no new vars on left side of :=\". For example:\n\n\tz := 1\n\tz := 2\n\nwill turn into\n\n\tz := 1\n\tz = 2", - Default: "true", - }, - { - Name: "\"noresultvalues\"", - Doc: "suggested fixes for unexpected return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"no result values expected\" or \"too many return values\".\nFor example:\n\n\tfunc z() { return nil }\n\nwill turn into\n\n\tfunc z() { return }", - Default: "true", - }, - { - Name: "\"undeclaredname\"", - Doc: "suggested fixes for \"undeclared name: <>\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"undeclared name: <>\". It will either insert a new statement,\nsuch as:\n\n\t<> :=\n\nor a new function declaration, such as:\n\n\tfunc <>(inferred parameters) {\n\t\tpanic(\"implement me!\")\n\t}", - Default: "true", - }, - { - Name: "\"unusedvariable\"", - Doc: "check for unused variables and suggest fixes", - Default: "false", - }, - { - Name: "\"fillstruct\"", - Doc: "note incomplete struct initializations\n\nThis analyzer provides diagnostics for any struct literals that do not have\nany fields initialized. Because the suggested fix for this analysis is\nexpensive to compute, callers should compute it separately, using the\nSuggestedFix function below.\n", - Default: "true", - }, - { - Name: "\"infertypeargs\"", - Doc: "check for unnecessary type arguments in call expressions\n\nExplicit type arguments may be omitted from call expressions if they can be\ninferred from function arguments, or from other type arguments:\n\n\tfunc f[T any](T) {}\n\t\n\tfunc _() {\n\t\tf[string](\"foo\") // string could be inferred\n\t}\n", - Default: "true", - }, - { - Name: "\"stubmethods\"", - Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", - Default: "true", - }, }, }, Default: "{}", @@ -1071,6 +1066,12 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "find structs that would use less memory if their fields were sorted\n\nThis analyzer find structs that can be rearranged to use less memory, and provides\na suggested edit with the most compact order.\n\nNote that there are two different diagnostics reported. One checks struct size,\nand the other reports \"pointer bytes\" used. Pointer bytes is how many bytes of the\nobject that the garbage collector has to potentially scan for pointers, for example:\n\n\tstruct { uint32; string }\n\nhave 16 pointer bytes because the garbage collector has to scan up through the string's\ninner pointer.\n\n\tstruct { string; *uint32 }\n\nhas 24 pointer bytes because it has to scan further through the *uint32.\n\n\tstruct { string; uint32 }\n\nhas 8 because it can stop immediately after the string pointer.\n\nBe aware that the most compact order is not always the most efficient.\nIn rare cases it may cause two variables each updated by its own goroutine\nto occupy the same CPU cache line, inducing a form of memory contention\nknown as \"false sharing\" that slows down both goroutines.\n", URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/fieldalignment", }, + { + Name: "fillreturns", + Doc: "suggest fixes for errors due to an incorrect number of return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"wrong number of return values (want %d, got %d)\". For example:\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn\n\t}\n\nwill turn into\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn 0, \"\", nil, nil\n\t}\n\nThis functionality is similar to https://github.com/sqs/goreturns.", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillreturns", + Default: true, + }, { Name: "httpresponse", Doc: "check for mistakes using HTTP responses\n\nA common mistake when using the net/http package is to defer a function\ncall to close the http.Response Body before checking the error that\ndetermines whether the response is valid:\n\n\tresp, err := http.Head(url)\n\tdefer resp.Body.Close()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// (defer statement belongs here)\n\nThis checker helps uncover latent nil dereference bugs by reporting a\ndiagnostic for such mistakes.", @@ -1083,6 +1084,12 @@ var GeneratedAPIJSON = &APIJSON{ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/ifaceassert", Default: true, }, + { + Name: "infertypeargs", + Doc: "check for unnecessary type arguments in call expressions\n\nExplicit type arguments may be omitted from call expressions if they can be\ninferred from function arguments, or from other type arguments:\n\n\tfunc f[T any](T) {}\n\t\n\tfunc _() {\n\t\tf[string](\"foo\") // string could be inferred\n\t}\n", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/infertypeargs", + Default: true, + }, { Name: "loopclosure", Doc: "check references to loop variables from within nested functions\n\nThis analyzer reports places where a function literal references the\niteration variable of an enclosing loop, and the loop calls the function\nin such a way (e.g. with go or defer) that it may outlive the loop\niteration and possibly observe the wrong value of the variable.\n\nNote: An iteration variable can only outlive a loop iteration in Go versions <=1.21.\nIn Go 1.22 and later, the loop variable lifetimes changed to create a new\niteration variable per loop iteration. (See go.dev/issue/60078.)\n\nIn this example, all the deferred functions run after the loop has\ncompleted, so all observe the final value of v [<go1.22].\n\n\tfor _, v := range list {\n\t defer func() {\n\t use(v) // incorrect\n\t }()\n\t}\n\nOne fix is to create a new variable for each iteration of the loop:\n\n\tfor _, v := range list {\n\t v := v // new var per iteration\n\t defer func() {\n\t use(v) // ok\n\t }()\n\t}\n\nAfter Go version 1.22, the previous two for loops are equivalent\nand both are correct.\n\nThe next example uses a go statement and has a similar problem [<go1.22].\nIn addition, it has a data race because the loop updates v\nconcurrent with the goroutines accessing it.\n\n\tfor _, v := range elem {\n\t go func() {\n\t use(v) // incorrect, and a data race\n\t }()\n\t}\n\nA fix is the same as before. The checker also reports problems\nin goroutines started by golang.org/x/sync/errgroup.Group.\nA hard-to-spot variant of this form is common in parallel tests:\n\n\tfunc Test(t *testing.T) {\n\t for _, test := range tests {\n\t t.Run(test.name, func(t *testing.T) {\n\t t.Parallel()\n\t use(test) // incorrect, and a data race\n\t })\n\t }\n\t}\n\nThe t.Parallel() call causes the rest of the function to execute\nconcurrent with the loop [<go1.22].\n\nThe analyzer reports references only in the last statement,\nas it is not deep enough to understand the effects of subsequent\nstatements that might render the reference benign.\n(\"Last statement\" is defined recursively in compound\nstatements such as if, switch, and select.)\n\nSee: https://golang.org/doc/go_faq.html#closures_and_goroutines", @@ -1107,6 +1114,18 @@ var GeneratedAPIJSON = &APIJSON{ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/nilness", Default: true, }, + { + Name: "nonewvars", + Doc: "suggested fixes for \"no new vars on left side of :=\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"no new vars on left side of :=\". For example:\n\n\tz := 1\n\tz := 2\n\nwill turn into\n\n\tz := 1\n\tz = 2", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/nonewvars", + Default: true, + }, + { + Name: "noresultvalues", + Doc: "suggested fixes for unexpected return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"no result values expected\" or \"too many return values\".\nFor example:\n\n\tfunc z() { return nil }\n\nwill turn into\n\n\tfunc z() { return }", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/noresultvars", + Default: true, + }, { Name: "printf", Doc: "check consistency of Printf format strings and arguments\n\nThe check applies to calls of the formatting functions such as\n[fmt.Printf] and [fmt.Sprintf], as well as any detected wrappers of\nthose functions.\n\nIn this example, the %d format operator requires an integer operand:\n\n\tfmt.Printf(\"%d\", \"hello\") // fmt.Printf format %d has arg \"hello\" of wrong type string\n\nSee the documentation of the fmt package for the complete set of\nformat operators and their operand types.\n\nTo enable printf checking on a function that is not found by this\nanalyzer's heuristics (for example, because control is obscured by\ndynamic method calls), insert a bogus call:\n\n\tfunc MyPrintf(format string, args ...any) {\n\t\tif false {\n\t\t\t_ = fmt.Sprintf(format, args...) // enable printf checker\n\t\t}\n\t\t...\n\t}\n\nThe -funcs flag specifies a comma-separated list of names of additional\nknown formatting functions or methods. If the name contains a period,\nit must denote a specific function using one of the following forms:\n\n\tdir/pkg.Function\n\tdir/pkg.Type.Method\n\t(*dir/pkg.Type).Method\n\nOtherwise the name is interpreted as a case-insensitive unqualified\nidentifier such as \"errorf\". Either way, if a listed name ends in f, the\nfunction is assumed to be Printf-like, taking a format string before the\nargument list. Otherwise it is assumed to be Print-like, taking a list\nof arguments with no format string.", @@ -1172,6 +1191,12 @@ var GeneratedAPIJSON = &APIJSON{ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/structtag", Default: true, }, + { + Name: "stubmethods", + Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods", + Default: true, + }, { Name: "testinggoroutine", Doc: "report calls to (*testing.T).Fatal from goroutines started by a test\n\nFunctions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and\nSkip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.\nThis checker detects calls to these functions that occur within a goroutine\nstarted by the test. For example:\n\n\tfunc TestFoo(t *testing.T) {\n\t go func() {\n\t t.Fatal(\"oops\") // error: (*T).Fatal called from non-test goroutine\n\t }()\n\t}", @@ -1190,6 +1215,12 @@ var GeneratedAPIJSON = &APIJSON{ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/timeformat", Default: true, }, + { + Name: "undeclaredname", + Doc: "suggested fixes for \"undeclared name: <>\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"undeclared name: <>\". It will either insert a new statement,\nsuch as:\n\n\t<> :=\n\nor a new function declaration, such as:\n\n\tfunc <>(inferred parameters) {\n\t\tpanic(\"implement me!\")\n\t}", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/undeclaredname", + Default: true, + }, { Name: "unmarshal", Doc: "report passing non-pointer or non-interface values to unmarshal\n\nThe unmarshal analysis reports calls to functions such as json.Unmarshal\nin which the argument type is not a pointer or an interface.", @@ -1220,6 +1251,11 @@ var GeneratedAPIJSON = &APIJSON{ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/unusedresult", Default: true, }, + { + Name: "unusedvariable", + Doc: "check for unused variables and suggest fixes", + URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedvariable", + }, { Name: "unusedwrite", Doc: "checks for unused writes\n\nThe analyzer reports instances of writes to struct fields and\narrays that are never read. Specifically, when a struct object\nor an array is copied, its elements are copied implicitly by\nthe compiler, and any element write to this copy does nothing\nwith the original object.\n\nFor example:\n\n\ttype T struct { x int }\n\n\tfunc f(input []T) {\n\t\tfor i, v := range input { // v is a copy\n\t\t\tv.x = i // unused write to field x\n\t\t}\n\t}\n\nAnother example is about non-pointer receiver:\n\n\ttype T struct { x int }\n\n\tfunc (t T) f() { // t is a copy\n\t\tt.x = i // unused write to field x\n\t}", @@ -1230,53 +1266,6 @@ var GeneratedAPIJSON = &APIJSON{ Doc: "check for constraints that could be simplified to \"any\"", URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/useany", }, - { - Name: "fillreturns", - Doc: "suggest fixes for errors due to an incorrect number of return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"wrong number of return values (want %d, got %d)\". For example:\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn\n\t}\n\nwill turn into\n\n\tfunc m() (int, string, *bool, error) {\n\t\treturn 0, \"\", nil, nil\n\t}\n\nThis functionality is similar to https://github.com/sqs/goreturns.", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillreturns", - Default: true, - }, - { - Name: "nonewvars", - Doc: "suggested fixes for \"no new vars on left side of :=\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"no new vars on left side of :=\". For example:\n\n\tz := 1\n\tz := 2\n\nwill turn into\n\n\tz := 1\n\tz = 2", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/nonewvars", - Default: true, - }, - { - Name: "noresultvalues", - Doc: "suggested fixes for unexpected return values\n\nThis checker provides suggested fixes for type errors of the\ntype \"no result values expected\" or \"too many return values\".\nFor example:\n\n\tfunc z() { return nil }\n\nwill turn into\n\n\tfunc z() { return }", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/noresultvars", - Default: true, - }, - { - Name: "undeclaredname", - Doc: "suggested fixes for \"undeclared name: <>\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"undeclared name: <>\". It will either insert a new statement,\nsuch as:\n\n\t<> :=\n\nor a new function declaration, such as:\n\n\tfunc <>(inferred parameters) {\n\t\tpanic(\"implement me!\")\n\t}", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/undeclaredname", - Default: true, - }, - { - Name: "unusedvariable", - Doc: "check for unused variables and suggest fixes", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/unusedvariable", - }, - { - Name: "fillstruct", - Doc: "note incomplete struct initializations\n\nThis analyzer provides diagnostics for any struct literals that do not have\nany fields initialized. Because the suggested fix for this analysis is\nexpensive to compute, callers should compute it separately, using the\nSuggestedFix function below.\n", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/fillstruct", - Default: true, - }, - { - Name: "infertypeargs", - Doc: "check for unnecessary type arguments in call expressions\n\nExplicit type arguments may be omitted from call expressions if they can be\ninferred from function arguments, or from other type arguments:\n\n\tfunc f[T any](T) {}\n\t\n\tfunc _() {\n\t\tf[string](\"foo\") // string could be inferred\n\t}\n", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/infertypeargs", - Default: true, - }, - { - Name: "stubmethods", - Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", - URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods", - Default: true, - }, }, Hints: []*HintJSON{ { diff --git a/gopls/internal/settings/default.go b/gopls/internal/settings/default.go index 0f8b4f37791..941d44b3b31 100644 --- a/gopls/internal/settings/default.go +++ b/gopls/internal/settings/default.go @@ -118,9 +118,7 @@ func DefaultOptions(overrides ...func(*Options)) *Options { }, Hooks: Hooks{ URLRegexp: urlRegexp(), - DefaultAnalyzers: defaultAnalyzers(), - TypeErrorAnalyzers: typeErrorAnalyzers(), - ConvenienceAnalyzers: convenienceAnalyzers(), + DefaultAnalyzers: analyzers(), StaticcheckAnalyzers: map[string]*Analyzer{}, }, } diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 9c784134c9e..453ed8b96eb 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -54,7 +54,6 @@ import ( "golang.org/x/tools/gopls/internal/analysis/deprecated" "golang.org/x/tools/gopls/internal/analysis/embeddirective" "golang.org/x/tools/gopls/internal/analysis/fillreturns" - "golang.org/x/tools/gopls/internal/analysis/fillstruct" "golang.org/x/tools/gopls/internal/analysis/infertypeargs" "golang.org/x/tools/gopls/internal/analysis/nonewvars" "golang.org/x/tools/gopls/internal/analysis/noresultvalues" @@ -103,7 +102,7 @@ type Options struct { // TODO(rfindley): refactor to simplify this function. We no longer need the // different categories of analyzer. func (opts *Options) IsAnalyzerEnabled(name string) bool { - for _, amap := range []map[string]*Analyzer{opts.DefaultAnalyzers, opts.TypeErrorAnalyzers, opts.ConvenienceAnalyzers, opts.StaticcheckAnalyzers} { + for _, amap := range []map[string]*Analyzer{opts.DefaultAnalyzers, opts.StaticcheckAnalyzers} { for _, analyzer := range amap { if analyzer.Analyzer.Name == name && analyzer.IsEnabled(opts) { return true @@ -457,8 +456,6 @@ type Hooks struct { GofumptFormat func(ctx context.Context, langVersion, modulePath string, src []byte) ([]byte, error) DefaultAnalyzers map[string]*Analyzer - TypeErrorAnalyzers map[string]*Analyzer - ConvenienceAnalyzers map[string]*Analyzer StaticcheckAnalyzers map[string]*Analyzer } @@ -800,8 +797,6 @@ func (o *Options) Clone() *Options { return dst } result.DefaultAnalyzers = copyAnalyzerMap(o.DefaultAnalyzers) - result.TypeErrorAnalyzers = copyAnalyzerMap(o.TypeErrorAnalyzers) - result.ConvenienceAnalyzers = copyAnalyzerMap(o.ConvenienceAnalyzers) result.StaticcheckAnalyzers = copyAnalyzerMap(o.StaticcheckAnalyzers) return result } @@ -1380,68 +1375,25 @@ func (r *OptionResult) setStringSlice(s *[]string) { } } -func typeErrorAnalyzers() map[string]*Analyzer { +func analyzers() map[string]*Analyzer { return map[string]*Analyzer{ - fillreturns.Analyzer.Name: { - Analyzer: fillreturns.Analyzer, - // TODO(rfindley): is SourceFixAll even necessary here? Is that not implied? - ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, - Enabled: true, - }, - nonewvars.Analyzer.Name: { - Analyzer: nonewvars.Analyzer, - Enabled: true, - }, - noresultvalues.Analyzer.Name: { - Analyzer: noresultvalues.Analyzer, - Enabled: true, - }, - undeclaredname.Analyzer.Name: { - Analyzer: undeclaredname.Analyzer, - Enabled: true, - }, - unusedvariable.Analyzer.Name: { - Analyzer: unusedvariable.Analyzer, - Enabled: false, - }, - } -} - -// TODO(golang/go#61559): remove convenience analyzers now that they are not -// used from the analysis framework. -func convenienceAnalyzers() map[string]*Analyzer { - return map[string]*Analyzer{ - fillstruct.Analyzer.Name: { - Analyzer: fillstruct.Analyzer, - Enabled: true, - ActionKinds: []protocol.CodeActionKind{protocol.RefactorRewrite}, - }, - stubmethods.Analyzer.Name: { - Analyzer: stubmethods.Analyzer, + // The traditional vet suite: + appends.Analyzer.Name: {Analyzer: appends.Analyzer, Enabled: true}, + asmdecl.Analyzer.Name: {Analyzer: asmdecl.Analyzer, Enabled: true}, + assign.Analyzer.Name: {Analyzer: assign.Analyzer, Enabled: true}, + atomic.Analyzer.Name: {Analyzer: atomic.Analyzer, Enabled: true}, + bools.Analyzer.Name: {Analyzer: bools.Analyzer, Enabled: true}, + buildtag.Analyzer.Name: {Analyzer: buildtag.Analyzer, Enabled: true}, + cgocall.Analyzer.Name: {Analyzer: cgocall.Analyzer, Enabled: true}, + composite.Analyzer.Name: {Analyzer: composite.Analyzer, Enabled: true}, + copylock.Analyzer.Name: {Analyzer: copylock.Analyzer, Enabled: true}, + defers.Analyzer.Name: {Analyzer: defers.Analyzer, Enabled: true}, + deprecated.Analyzer.Name: { + Analyzer: deprecated.Analyzer, Enabled: true, + Severity: protocol.SeverityHint, + Tag: []protocol.DiagnosticTag{protocol.Deprecated}, }, - infertypeargs.Analyzer.Name: { - Analyzer: infertypeargs.Analyzer, - Enabled: true, - ActionKinds: []protocol.CodeActionKind{protocol.RefactorRewrite}, - }, - } -} - -func defaultAnalyzers() map[string]*Analyzer { - return map[string]*Analyzer{ - // The traditional vet suite: - appends.Analyzer.Name: {Analyzer: appends.Analyzer, Enabled: true}, - asmdecl.Analyzer.Name: {Analyzer: asmdecl.Analyzer, Enabled: true}, - assign.Analyzer.Name: {Analyzer: assign.Analyzer, Enabled: true}, - atomic.Analyzer.Name: {Analyzer: atomic.Analyzer, Enabled: true}, - bools.Analyzer.Name: {Analyzer: bools.Analyzer, Enabled: true}, - buildtag.Analyzer.Name: {Analyzer: buildtag.Analyzer, Enabled: true}, - cgocall.Analyzer.Name: {Analyzer: cgocall.Analyzer, Enabled: true}, - composite.Analyzer.Name: {Analyzer: composite.Analyzer, Enabled: true}, - copylock.Analyzer.Name: {Analyzer: copylock.Analyzer, Enabled: true}, - defers.Analyzer.Name: {Analyzer: defers.Analyzer, Enabled: true}, - deprecated.Analyzer.Name: {Analyzer: deprecated.Analyzer, Enabled: true, Severity: protocol.SeverityHint, Tag: []protocol.DiagnosticTag{protocol.Deprecated}}, directive.Analyzer.Name: {Analyzer: directive.Analyzer, Enabled: true}, errorsas.Analyzer.Name: {Analyzer: errorsas.Analyzer, Enabled: true}, httpresponse.Analyzer.Name: {Analyzer: httpresponse.Analyzer, Enabled: true}, @@ -1472,8 +1424,13 @@ func defaultAnalyzers() map[string]*Analyzer { unusedparams.Analyzer.Name: {Analyzer: unusedparams.Analyzer, Enabled: true}, unusedwrite.Analyzer.Name: {Analyzer: unusedwrite.Analyzer, Enabled: false}, useany.Analyzer.Name: {Analyzer: useany.Analyzer, Enabled: false}, - timeformat.Analyzer.Name: {Analyzer: timeformat.Analyzer, Enabled: true}, - embeddirective.Analyzer.Name: {Analyzer: embeddirective.Analyzer, Enabled: true}, + infertypeargs.Analyzer.Name: { + Analyzer: infertypeargs.Analyzer, + Enabled: true, + Severity: protocol.SeverityHint, + }, + timeformat.Analyzer.Name: {Analyzer: timeformat.Analyzer, Enabled: true}, + embeddirective.Analyzer.Name: {Analyzer: embeddirective.Analyzer, Enabled: true}, // gofmt -s suite: simplifycompositelit.Analyzer.Name: { @@ -1491,6 +1448,21 @@ func defaultAnalyzers() map[string]*Analyzer { Enabled: true, ActionKinds: []protocol.CodeActionKind{protocol.SourceFixAll, protocol.QuickFix}, }, + + // Type error analyzers. + // These analyzers enrich go/types errors with suggested fixes. + fillreturns.Analyzer.Name: {Analyzer: fillreturns.Analyzer, Enabled: true}, + nonewvars.Analyzer.Name: {Analyzer: nonewvars.Analyzer, Enabled: true}, + noresultvalues.Analyzer.Name: {Analyzer: noresultvalues.Analyzer, Enabled: true}, + stubmethods.Analyzer.Name: {Analyzer: stubmethods.Analyzer, Enabled: true}, + undeclaredname.Analyzer.Name: {Analyzer: undeclaredname.Analyzer, Enabled: true}, + // TODO(rfindley): why isn't the 'unusedvariable' analyzer enabled, if it + // is only enhancing type errors with suggested fixes? + // + // In particular, enabling this analyzer could cause unused variables to be + // greyed out, (due to the 'deletions only' fix). That seems like a nice UI + // feature. + unusedvariable.Analyzer.Name: {Analyzer: unusedvariable.Analyzer, Enabled: false}, } } diff --git a/gopls/internal/test/integration/misc/fix_test.go b/gopls/internal/test/integration/misc/fix_test.go index 1217fe4d2ee..abd48307d4e 100644 --- a/gopls/internal/test/integration/misc/fix_test.go +++ b/gopls/internal/test/integration/misc/fix_test.go @@ -114,24 +114,18 @@ func Foo() error { ReadDiagnostics("main.go", &d), ) codeActions := env.CodeAction("main.go", d.Diagnostics) - if len(codeActions) != 2 { - t.Fatalf("expected 2 code actions, got %v", len(codeActions)) + if len(codeActions) != 1 { + t.Fatalf("expected 1 code actions, got %v\n%v", len(codeActions), codeActions) } - var foundQuickFix, foundFixAll bool + var foundQuickFix bool for _, a := range codeActions { if a.Kind == protocol.QuickFix { foundQuickFix = true } - if a.Kind == protocol.SourceFixAll { - foundFixAll = true - } } if !foundQuickFix { t.Fatalf("expected quickfix code action, got none") } - if !foundFixAll { - t.Fatalf("expected fixall code action, got none") - } env.ApplyQuickFixes("main.go", d.Diagnostics) env.AfterChange(NoDiagnostics(ForFile("main.go"))) }) diff --git a/gopls/internal/test/marker/doc.go b/gopls/internal/test/marker/doc.go index bf8b3634809..212f09c78a7 100644 --- a/gopls/internal/test/marker/doc.go +++ b/gopls/internal/test/marker/doc.go @@ -204,7 +204,7 @@ The following markers are supported within marker tests: signatureHelp at the given location should match the provided string, with the active parameter (an index) highlighted. - - suggestedfix(location, regexp, kind, golden): like diag, the location and + - suggestedfix(location, regexp, golden): like diag, the location and regexp identify an expected diagnostic. This diagnostic must to have exactly one associated code action of the specified kind. This action is executed for its editing effects on the source files. diff --git a/gopls/internal/test/marker/testdata/codeaction/infertypeargs.txt b/gopls/internal/test/marker/testdata/codeaction/infertypeargs.txt index aa42e879467..b622efdc358 100644 --- a/gopls/internal/test/marker/testdata/codeaction/infertypeargs.txt +++ b/gopls/internal/test/marker/testdata/codeaction/infertypeargs.txt @@ -15,21 +15,11 @@ func app[S interface{ ~[]E }, E interface{}](s S, e E) S { func _() { _ = app[[]int] _ = app[[]int, int] - _ = app[[]int]([]int{}, 0) //@codeaction("app", ")", "refactor.rewrite", infer) + _ = app[[]int]([]int{}, 0) //@suggestedfix("[[]int]", re"unnecessary type arguments", infer) _ = app([]int{}, 0) } -- @infer/p.go -- -package infertypeargs - -func app[S interface{ ~[]E }, E interface{}](s S, e E) S { - return append(s, e) -} - -func _() { - _ = app[[]int] - _ = app[[]int, int] - _ = app([]int{}, 0) //@codeaction("app", ")", "refactor.rewrite", infer) - _ = app([]int{}, 0) -} - +@@ -10 +10 @@ +- _ = app[[]int]([]int{}, 0) //@suggestedfix("[[]int]", re"unnecessary type arguments", infer) ++ _ = app([]int{}, 0) //@suggestedfix("[[]int]", re"unnecessary type arguments", infer) diff --git a/gopls/internal/test/marker/testdata/hover/generics.txt b/gopls/internal/test/marker/testdata/hover/generics.txt index da1042544a0..2386a5bda95 100644 --- a/gopls/internal/test/marker/testdata/hover/generics.txt +++ b/gopls/internal/test/marker/testdata/hover/generics.txt @@ -41,7 +41,7 @@ func app[S interface{ ~[]E }, E interface{}](s S, e E) S { func _() { _ = app[[]int] //@hover("app", "app", appint) _ = app[[]int, int] //@hover("app", "app", appint) - _ = app[[]int]([]int{}, 0) //@hover("app", "app", appint) + _ = app[[]int]([]int{}, 0) //@hover("app", "app", appint), diag("[[]int]", re"unnecessary") _ = app([]int{}, 0) //@hover("app", "app", appint) } From 94d99e3406d0b55f6ae4c33194b56165033fc81b Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 22 Jan 2024 15:18:45 -0500 Subject: [PATCH 038/105] gopls/internal/test/marker: re-enable some tests Re-enable (with adjustment) some tests that were disabled while staging standard library changes to parsing and printing. Fixes golang/go#54822 Change-Id: I7d54ce96b10f294dae257e8403983b25541a158f Reviewed-on: https://go-review.googlesource.com/c/tools/+/557397 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- .../testdata/completion/nested_complit.txt | 11 +++++++---- .../test/marker/testdata/hover/generics.txt | 19 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gopls/internal/test/marker/testdata/completion/nested_complit.txt b/gopls/internal/test/marker/testdata/completion/nested_complit.txt index f3a148dedf8..264ae77eab8 100644 --- a/gopls/internal/test/marker/testdata/completion/nested_complit.txt +++ b/gopls/internal/test/marker/testdata/completion/nested_complit.txt @@ -1,9 +1,11 @@ This test checks completion of nested composite literals; -TODO(rfindley): investigate an un-skip the disabled test below. +Parser recovery changed in Go 1.20, so this test requires at least that +version for consistency. -- flags -- -ignore_extra_diags +-min_go=go1.20 -- nested_complit.go -- package nested_complit @@ -15,9 +17,10 @@ type ncBar struct { //@item(structNCBar, "ncBar", "struct{...}", "struct") } func _() { - []ncFoo{} //@item(litNCFoo, "[]ncFoo{}", "", "var") + _ = []ncFoo{} //@item(litNCFoo, "[]ncFoo{}", "", "var") + _ = make([]ncFoo, 0) //@item(makeNCFoo, "make([]ncFoo, 0)", "", "func") + _ := ncBar{ - // disabled - see issue #54822 - baz: [] // complete(" //", structNCFoo, structNCBar) + baz: [] //@complete(" //", litNCFoo, makeNCFoo, structNCBar, structNCFoo) } } diff --git a/gopls/internal/test/marker/testdata/hover/generics.txt b/gopls/internal/test/marker/testdata/hover/generics.txt index 2386a5bda95..76c258f3146 100644 --- a/gopls/internal/test/marker/testdata/hover/generics.txt +++ b/gopls/internal/test/marker/testdata/hover/generics.txt @@ -1,9 +1,10 @@ This file contains tests for hovering over generic Go code. -Requires go1.19+ for the new go/doc/comment package. +Requires go1.20+ for the new go/doc/comment package, and a change in Go 1.20 +that affected the formatting of constraint interfaces. -- flags -- --min_go=go1.19 +-min_go=go1.20 -- go.mod -- // A go.mod is require for correct pkgsite links. @@ -25,10 +26,8 @@ type Value[T any] struct { //@hover("T", "T", ValueT) Q int //@hover("Q", "Q", ValueQ) } -// disabled - see issue #54822 -func F[P interface{ ~int | string }]() { // hover("P","P",Ptparam) - // disabled - see issue #54822 - var _ P // hover("P","P",Pvar) +func F[P interface{ ~int | string }]() { //@hover("P", "P", Ptparam) + var _ P //@hover("P","P",Pvar) } -- inferred.go -- @@ -76,3 +75,11 @@ field Q int ```go type parameter T any ``` +-- @Ptparam -- +```go +type parameter P interface{~int | string} +``` +-- @Pvar -- +```go +type parameter P interface{~int | string} +``` From e2ca5942a406d2336021d08fc09523b1d6c25480 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 22 Jan 2024 12:04:48 -0500 Subject: [PATCH 039/105] gopls/internal/lsp/source: address problems detected by staticcheck While working on performance I disabled staticcheck. Reenabling it today turned up several suggestions, and a few real bugs. Change-Id: I032d0cfb12ec8fda2573a2663faec4126b321afc Reviewed-on: https://go-review.googlesource.com/c/tools/+/557496 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/source/change_signature.go | 6 +++++- gopls/internal/lsp/source/codeaction.go | 4 ++-- gopls/internal/lsp/source/definition.go | 8 ++++++-- gopls/internal/lsp/source/invertifcondition.go | 2 +- gopls/internal/lsp/source/rename.go | 4 ++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gopls/internal/lsp/source/change_signature.go b/gopls/internal/lsp/source/change_signature.go index 2ff5d9799a0..f4056bd0bbd 100644 --- a/gopls/internal/lsp/source/change_signature.go +++ b/gopls/internal/lsp/source/change_signature.go @@ -134,6 +134,7 @@ func RemoveUnusedParameter(ctx context.Context, fh file.Handle, rng protocol.Ran if err != nil { return nil, err } + // Finally, rewrite the original declaration. We do this after inlining all // calls, as there may be calls in the same file as the declaration. But none // of the inlining should have changed the location of the original @@ -149,7 +150,10 @@ func RemoveUnusedParameter(ctx context.Context, fh file.Handle, rng protocol.Ran src = pgf.Src } fset := tokeninternal.FileSetFor(pgf.Tok) - src, err = rewriteSignature(fset, idx, src, newDecl) + src, err := rewriteSignature(fset, idx, src, newDecl) + if err != nil { + return nil, err + } newContent[pgf.URI] = src } diff --git a/gopls/internal/lsp/source/codeaction.go b/gopls/internal/lsp/source/codeaction.go index b06430e06a3..dcec2e5be62 100644 --- a/gopls/internal/lsp/source/codeaction.go +++ b/gopls/internal/lsp/source/codeaction.go @@ -98,7 +98,7 @@ func CodeActions(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, return nil, err } if want[protocol.RefactorRewrite] { - rewrites, err := getRewriteCodeActions(snapshot, pkg, pgf, fh, rng, snapshot.Options()) + rewrites, err := getRewriteCodeActions(pkg, pgf, fh, rng, snapshot.Options()) if err != nil { return nil, err } @@ -253,7 +253,7 @@ func newCodeAction(title string, kind protocol.CodeActionKind, cmd *protocol.Com } // getRewriteCodeActions returns refactor.rewrite code actions available at the specified range. -func getRewriteCodeActions(snapshot *cache.Snapshot, pkg *cache.Package, pgf *ParsedGoFile, fh file.Handle, rng protocol.Range, options *settings.Options) (_ []protocol.CodeAction, rerr error) { +func getRewriteCodeActions(pkg *cache.Package, pgf *ParsedGoFile, fh file.Handle, rng protocol.Range, options *settings.Options) (_ []protocol.CodeAction, rerr error) { // golang/go#61693: code actions were refactored to run outside of the // analysis framework, but as a result they lost their panic recovery. // diff --git a/gopls/internal/lsp/source/definition.go b/gopls/internal/lsp/source/definition.go index d8038748c8e..30177cfb3c2 100644 --- a/gopls/internal/lsp/source/definition.go +++ b/gopls/internal/lsp/source/definition.go @@ -150,8 +150,10 @@ func builtinDecl(ctx context.Context, snapshot *cache.Snapshot, obj types.Object if err != nil { return nil, nil, err } - decl, err = getDecl(pgf.File, obj.Name()) + if err != nil { + return nil, nil, err + } } else { // pseudo-package "builtin": // use parsed $GOROOT/src/builtin/builtin.go @@ -163,7 +165,9 @@ func builtinDecl(ctx context.Context, snapshot *cache.Snapshot, obj types.Object if obj.Parent() == types.Universe { // built-in function or type decl, err = getDecl(pgf.File, obj.Name()) - + if err != nil { + return nil, nil, err + } } else if obj.Name() == "Error" { // error.Error method decl, err = getDecl(pgf.File, "error") diff --git a/gopls/internal/lsp/source/invertifcondition.go b/gopls/internal/lsp/source/invertifcondition.go index 75e375ad5ec..a240ac161f0 100644 --- a/gopls/internal/lsp/source/invertifcondition.go +++ b/gopls/internal/lsp/source/invertifcondition.go @@ -92,7 +92,7 @@ func invertIfCondition(fset *token.FileSet, start, end token.Pos, src []byte, fi func endsWithReturn(elseBranch ast.Stmt) (bool, error) { elseBlock, isBlockStatement := elseBranch.(*ast.BlockStmt) if !isBlockStatement { - return false, fmt.Errorf("Unable to figure out whether this ends with return: %T", elseBranch) + return false, fmt.Errorf("unable to figure out whether this ends with return: %T", elseBranch) } if len(elseBlock.List) == 0 { diff --git a/gopls/internal/lsp/source/rename.go b/gopls/internal/lsp/source/rename.go index 0bf8cc283ef..dacbfb60829 100644 --- a/gopls/internal/lsp/source/rename.go +++ b/gopls/internal/lsp/source/rename.go @@ -402,7 +402,7 @@ func renameOrdinary(ctx context.Context, snapshot *cache.Snapshot, f file.Handle // transitive rdeps. (The exportedness of the field's struct // or method's receiver is irrelevant.) transitive := false - switch obj.(type) { + switch obj := obj.(type) { case *types.TypeName: // Renaming an exported package-level type // requires us to inspect all transitive rdeps @@ -418,7 +418,7 @@ func renameOrdinary(ctx context.Context, snapshot *cache.Snapshot, f file.Handle } case *types.Var: - if obj.(*types.Var).IsField() { + if obj.IsField() { transitive = true // field } From a49867fe1f7d6cbb4a07fb246870c1b5aa12c459 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 19 Jan 2024 17:31:55 -0500 Subject: [PATCH 040/105] internal/imports: don't add imports that shadow predeclared names Also, a test. Fixes golang/go#63592 Change-Id: I36cab69cb224f90cc8459c3fced2408486193a1f Reviewed-on: https://go-review.googlesource.com/c/tools/+/557216 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- .../codeaction/import-shadows-builtin.txt | 55 +++++++++++++++++++ internal/imports/fix.go | 12 ++++ 2 files changed, 67 insertions(+) create mode 100644 gopls/internal/test/marker/testdata/codeaction/import-shadows-builtin.txt diff --git a/gopls/internal/test/marker/testdata/codeaction/import-shadows-builtin.txt b/gopls/internal/test/marker/testdata/codeaction/import-shadows-builtin.txt new file mode 100644 index 00000000000..aeb86a22686 --- /dev/null +++ b/gopls/internal/test/marker/testdata/codeaction/import-shadows-builtin.txt @@ -0,0 +1,55 @@ +This is a regression test for bug #63592 in "organize imports" whereby +the new imports would shadow predeclared names. + +In the original example, the conflict was between predeclared error +type and the unfortunately named package github.com/coreos/etcd/error, +but this example uses a package with the ludicrous name of complex128. + +The new behavior is that we will not attempt to import packages +that shadow predeclared names. (Ideally we would do that only if +the predeclared name is actually referenced in the file, which +complex128 happens to be in this example, but that's a trickier +analysis than the internal/imports package is game for.) + +The name complex127 works as usual. + +-- go.mod -- +module example.com +go 1.18 + +-- complex128/a.go -- +package complex128 + +var V int + +-- complex127/a.go -- +package complex127 + +var V int + +-- main.go -- +package main + +import () //@codeaction("import", "", "source.organizeImports", out) + +func main() { + complex128.V() //@diag("V", re"type complex128 has no field") + complex127.V() //@diag("complex127", re"(undeclared|undefined)") +} + +func _() { + var _ complex128 = 1 + 2i +} +-- @out/main.go -- +package main + +import "example.com/complex127" //@codeaction("import", "", "source.organizeImports", out) + +func main() { + complex128.V() //@diag("V", re"type complex128 has no field") + complex127.V() //@diag("complex127", re"(undeclared|undefined)") +} + +func _() { + var _ complex128 = 1 + 2i +} diff --git a/internal/imports/fix.go b/internal/imports/fix.go index dd369c072e0..28f2ab9e08c 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -13,6 +13,7 @@ import ( "go/build" "go/parser" "go/token" + "go/types" "io/fs" "io/ioutil" "os" @@ -1151,6 +1152,17 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil }() for result := range results { + // Don't offer completions that would shadow predeclared + // names, such as github.com/coreos/etcd/error. + if types.Universe.Lookup(result.pkg.name) != nil { // predeclared + // Ideally we would skip this candidate only + // if the predeclared name is actually + // referenced by the file, but that's a lot + // trickier to compute and would still create + // an import that is likely to surprise the + // user before long. + continue + } pass.addCandidate(result.imp, result.pkg) } return firstErr From 4c532679b15719e0fc682935c013e16554dc9eef Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 22 Jan 2024 16:42:07 -0500 Subject: [PATCH 041/105] gopls/internal/lsp/cache: don't report a bug for standalone test files go/packages will return test command-line-arguments test variants for standalone test files. Handle this case, and refine our bug report. Fixes golang/go#64233 Change-Id: I15fd8a50476ece58eedbf09233827f55bfb79a2e Reviewed-on: https://go-review.googlesource.com/c/tools/+/557635 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/lsp/cache/load.go | 43 +++++++++++++++++-- .../marker/testdata/definition/standalone.txt | 42 ++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/definition/standalone.txt diff --git a/gopls/internal/lsp/cache/load.go b/gopls/internal/lsp/cache/load.go index 9831a4d2512..e05ac4e1494 100644 --- a/gopls/internal/lsp/cache/load.go +++ b/gopls/internal/lsp/cache/load.go @@ -151,6 +151,45 @@ func (s *Snapshot) load(ctx context.Context, allowNetwork bool, scopes ...loadSc event.Log(ctx, eventName, labels...) } + if standalone { + // Handle standalone package result. + // + // In general, this should just be a single "command-line-arguments" + // package containing the requested file. However, if the file is a test + // file, go/packages may return test variants of the command-line-arguments + // package. We don't support this; theoretically we could, but it seems + // unnecessarily complicated. + // + // Prior to golang/go#64233 we just assumed that we'd get exactly one + // package here. The categorization of bug reports below may be a bit + // verbose, but anticipates that perhaps we don't fully understand + // possible failure modes. + errorf := bug.Errorf + if s.view.typ == GoPackagesDriverView { + errorf = fmt.Errorf // all bets are off + } + + var standalonePkg *packages.Package + for _, pkg := range pkgs { + if pkg.ID == "command-line-arguments" { + if standalonePkg != nil { + return errorf("internal error: go/packages returned multiple standalone packages") + } + standalonePkg = pkg + } else if packagesinternal.GetForTest(pkg) == "" && !strings.HasSuffix(pkg.ID, ".test") { + return errorf("internal error: go/packages returned unexpected package %q for standalone file", pkg.ID) + } + } + if standalonePkg == nil { + return errorf("internal error: go/packages failed to return non-test standalone package") + } + if len(standalonePkg.CompiledGoFiles) > 0 { + pkgs = []*packages.Package{standalonePkg} + } else { + pkgs = nil + } + } + if len(pkgs) == 0 { if err == nil { err = errNoPackages @@ -158,10 +197,6 @@ func (s *Snapshot) load(ctx context.Context, allowNetwork bool, scopes ...loadSc return fmt.Errorf("packages.Load error: %w", err) } - if standalone && len(pkgs) > 1 { - return bug.Errorf("internal error: go/packages returned multiple packages for standalone file") - } - moduleErrs := make(map[string][]packages.Error) // module path -> errors filterFunc := s.view.filterFunc() newMetadata := make(map[PackageID]*metadata.Package) diff --git a/gopls/internal/test/marker/testdata/definition/standalone.txt b/gopls/internal/test/marker/testdata/definition/standalone.txt new file mode 100644 index 00000000000..6af1149184d --- /dev/null +++ b/gopls/internal/test/marker/testdata/definition/standalone.txt @@ -0,0 +1,42 @@ +This test checks the behavior of standalone packages, in particular documenting +our failure to support test files as standalone packages (golang/go#64233). + +-- go.mod -- +module golang.org/lsptests/a + +go 1.20 + +-- a.go -- +package a + +func F() {} //@loc(F, "F") + +-- standalone.go -- +//go:build ignore +package main + +import "golang.org/lsptests/a" + +func main() { + a.F() //@def("F", F) +} + +-- standalone_test.go -- +//go:build ignore +package main //@diag("main", re"No packages found") + +import "golang.org/lsptests/a" + +func main() { + a.F() //@hovererr("F", "no package") +} + +-- standalone_x_test.go -- +//go:build ignore +package main_test //@diag("main", re"No packages found") + +import "golang.org/lsptests/a" + +func main() { + a.F() //@hovererr("F", "no package") +} From bd547e59632f350bb9dd1b2f4730e1442604cd86 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 16:57:51 -0500 Subject: [PATCH 042/105] gopls/internal/lsp/cache: clean up public API This change unexports various parts of the API, including DiskFile, Overlay, BundleQuickFixes, XrefIndex, and the methods of fileMap. It also moves some declarations for clarity and updates doc comments. This is is a preparatory step for moving this package out of lsp/. Change-Id: I1ff745b612315f9b9c0cd188c67bdfa695f9708f Reviewed-on: https://go-review.googlesource.com/c/tools/+/557498 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/debug/template_test.go | 26 +++++----- gopls/internal/lsp/cache/cache.go | 24 --------- gopls/internal/lsp/cache/check.go | 4 +- gopls/internal/lsp/cache/diagnostics.go | 4 +- gopls/internal/lsp/cache/filemap.go | 44 ++++++++--------- gopls/internal/lsp/cache/filemap_test.go | 14 +++--- gopls/internal/lsp/cache/fs_memoized.go | 28 +++++------ gopls/internal/lsp/cache/fs_overlay.go | 27 ++++++----- gopls/internal/lsp/cache/keys.go | 2 + gopls/internal/lsp/cache/load.go | 4 +- gopls/internal/lsp/cache/mod_tidy.go | 2 +- gopls/internal/lsp/cache/pkg.go | 18 +++---- gopls/internal/lsp/cache/session.go | 30 ++++++++++-- gopls/internal/lsp/cache/snapshot.go | 62 ++++++++++++------------ gopls/internal/lsp/cache/view.go | 6 ++- 15 files changed, 148 insertions(+), 147 deletions(-) diff --git a/gopls/internal/debug/template_test.go b/gopls/internal/debug/template_test.go index f3d4827a9b0..0438c666e90 100644 --- a/gopls/internal/debug/template_test.go +++ b/gopls/internal/debug/template_test.go @@ -22,6 +22,7 @@ import ( "github.com/jba/templatecheck" "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/debug" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/internal/testenv" ) @@ -30,15 +31,18 @@ var templates = map[string]struct { tmpl *template.Template data interface{} // a value of the needed type }{ - "MainTmpl": {debug.MainTmpl, &debug.Instance{}}, - "DebugTmpl": {debug.DebugTmpl, nil}, - "RPCTmpl": {debug.RPCTmpl, &debug.Rpcs{}}, - "TraceTmpl": {debug.TraceTmpl, debug.TraceResults{}}, - "CacheTmpl": {debug.CacheTmpl, &cache.Cache{}}, - "SessionTmpl": {debug.SessionTmpl, &cache.Session{}}, - "ClientTmpl": {debug.ClientTmpl, &debug.Client{}}, - "ServerTmpl": {debug.ServerTmpl, &debug.Server{}}, - "FileTmpl": {debug.FileTmpl, &cache.Overlay{}}, + "MainTmpl": {debug.MainTmpl, &debug.Instance{}}, + "DebugTmpl": {debug.DebugTmpl, nil}, + "RPCTmpl": {debug.RPCTmpl, &debug.Rpcs{}}, + "TraceTmpl": {debug.TraceTmpl, debug.TraceResults{}}, + "CacheTmpl": {debug.CacheTmpl, &cache.Cache{}}, + "SessionTmpl": {debug.SessionTmpl, &cache.Session{}}, + "ClientTmpl": {debug.ClientTmpl, &debug.Client{}}, + "ServerTmpl": {debug.ServerTmpl, &debug.Server{}}, + "FileTmpl": {debug.FileTmpl, *new(interface { + file.Handle + Kind() file.Kind // (overlay files only) + })}, "InfoTmpl": {debug.InfoTmpl, "something"}, "MemoryTmpl": {debug.MemoryTmpl, runtime.MemStats{}}, "AnalysisTmpl": {debug.AnalysisTmpl, new(debug.State).Analysis()}, @@ -74,7 +78,7 @@ func TestTemplates(t *testing.T) { if tree == nil { t.Fatalf("found no syntax tree for %s", "serve.go") } - renders := callsOf(p, tree, "render") + renders := callsOf(tree, "render") if len(renders) == 0 { t.Fatalf("found no calls to render") } @@ -122,7 +126,7 @@ func TestTemplates(t *testing.T) { } } -func callsOf(p *packages.Package, tree *ast.File, name string) []*ast.CallExpr { +func callsOf(tree *ast.File, name string) []*ast.CallExpr { var ans []*ast.CallExpr f := func(n ast.Node) bool { x, ok := n.(*ast.CallExpr) diff --git a/gopls/internal/lsp/cache/cache.go b/gopls/internal/lsp/cache/cache.go index 9127412e430..c4dff669031 100644 --- a/gopls/internal/lsp/cache/cache.go +++ b/gopls/internal/lsp/cache/cache.go @@ -5,16 +5,11 @@ package cache import ( - "context" "reflect" "strconv" "sync/atomic" - "time" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/internal/event" - "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/memoize" ) @@ -51,25 +46,6 @@ type Cache struct { *memoizedFS // implements source.FileSource } -// NewSession creates a new gopls session with the given cache and options overrides. -// -// The provided optionsOverrides may be nil. -// -// TODO(rfindley): move this to session.go. -func NewSession(ctx context.Context, c *Cache) *Session { - index := atomic.AddInt64(&sessionIndex, 1) - s := &Session{ - id: strconv.FormatInt(index, 10), - cache: c, - gocmdRunner: &gocommand.Runner{}, - overlayFS: newOverlayFS(c), - parseCache: newParseCache(1 * time.Minute), // keep recently parsed files for a minute, to optimize typing CPU - viewMap: make(map[protocol.DocumentURI]*View), - } - event.Log(ctx, "New session", KeyCreateSession.Of(s)) - return s -} - var cacheIndex, sessionIndex, viewIndex int64 func (c *Cache) ID() string { return c.id } diff --git a/gopls/internal/lsp/cache/check.go b/gopls/internal/lsp/cache/check.go index bc419065537..bf5595b93a9 100644 --- a/gopls/internal/lsp/cache/check.go +++ b/gopls/internal/lsp/cache/check.go @@ -1693,7 +1693,7 @@ func depsErrors(ctx context.Context, snapshot *Snapshot, mp *metadata.Package) ( Message: fmt.Sprintf("error while importing %v: %v", item, depErr.Err), SuggestedFixes: goGetQuickFixes(mp.Module != nil, imp.cgf.URI, item), } - if !BundleQuickFixes(diag) { + if !bundleQuickFixes(diag) { bug.Reportf("failed to bundle fixes for diagnostic %q", diag.Message) } errors = append(errors, diag) @@ -1736,7 +1736,7 @@ func depsErrors(ctx context.Context, snapshot *Snapshot, mp *metadata.Package) ( Message: fmt.Sprintf("error while importing %v: %v", item, depErr.Err), SuggestedFixes: goGetQuickFixes(true, pm.URI, item), } - if !BundleQuickFixes(diag) { + if !bundleQuickFixes(diag) { bug.Reportf("failed to bundle fixes for diagnostic %q", diag.Message) } errors = append(errors, diag) diff --git a/gopls/internal/lsp/cache/diagnostics.go b/gopls/internal/lsp/cache/diagnostics.go index f5cac917ab5..07b4e905d61 100644 --- a/gopls/internal/lsp/cache/diagnostics.go +++ b/gopls/internal/lsp/cache/diagnostics.go @@ -119,10 +119,10 @@ type quickFixesJSON struct { Fixes []protocol.CodeAction } -// BundleQuickFixes attempts to bundle sd.SuggestedFixes into the +// bundleQuickFixes attempts to bundle sd.SuggestedFixes into the // sd.BundledFixes field, so that it can be round-tripped through the client. // It returns false if the quick-fixes cannot be bundled. -func BundleQuickFixes(sd *Diagnostic) bool { +func bundleQuickFixes(sd *Diagnostic) bool { if len(sd.SuggestedFixes) == 0 { return true } diff --git a/gopls/internal/lsp/cache/filemap.go b/gopls/internal/lsp/cache/filemap.go index 8ca7ab79721..9e93ab594e6 100644 --- a/gopls/internal/lsp/cache/filemap.go +++ b/gopls/internal/lsp/cache/filemap.go @@ -17,21 +17,21 @@ import ( // file. type fileMap struct { files *persistent.Map[protocol.DocumentURI, file.Handle] - overlays *persistent.Map[protocol.DocumentURI, *Overlay] // the subset of files that are overlays + overlays *persistent.Map[protocol.DocumentURI, *overlay] // the subset of files that are overlays dirs *persistent.Set[string] // all dirs containing files; if nil, dirs have not been initialized } func newFileMap() *fileMap { return &fileMap{ files: new(persistent.Map[protocol.DocumentURI, file.Handle]), - overlays: new(persistent.Map[protocol.DocumentURI, *Overlay]), + overlays: new(persistent.Map[protocol.DocumentURI, *overlay]), dirs: new(persistent.Set[string]), } } -// Clone creates a copy of the fileMap, incorporating the changes specified by +// clone creates a copy of the fileMap, incorporating the changes specified by // the changes map. -func (m *fileMap) Clone(changes map[protocol.DocumentURI]file.Handle) *fileMap { +func (m *fileMap) clone(changes map[protocol.DocumentURI]file.Handle) *fileMap { m2 := &fileMap{ files: m.files.Clone(), overlays: m.overlays.Clone(), @@ -52,18 +52,18 @@ func (m *fileMap) Clone(changes map[protocol.DocumentURI]file.Handle) *fileMap { // first, as a set before a deletion would result in pointless work. for uri, fh := range changes { if !fileExists(fh) { - m2.Delete(uri) + m2.delete(uri) } } for uri, fh := range changes { if fileExists(fh) { - m2.Set(uri, fh) + m2.set(uri, fh) } } return m2 } -func (m *fileMap) Destroy() { +func (m *fileMap) destroy() { m.files.Destroy() m.overlays.Destroy() if m.dirs != nil { @@ -71,24 +71,24 @@ func (m *fileMap) Destroy() { } } -// Get returns the file handle mapped by the given key, or (nil, false) if the +// get returns the file handle mapped by the given key, or (nil, false) if the // key is not present. -func (m *fileMap) Get(key protocol.DocumentURI) (file.Handle, bool) { +func (m *fileMap) get(key protocol.DocumentURI) (file.Handle, bool) { return m.files.Get(key) } -// Range calls f for each (uri, fh) in the map. -func (m *fileMap) Range(f func(uri protocol.DocumentURI, fh file.Handle)) { +// foreach calls f for each (uri, fh) in the map. +func (m *fileMap) foreach(f func(uri protocol.DocumentURI, fh file.Handle)) { m.files.Range(f) } -// Set stores the given file handle for key, updating overlays and directories +// set stores the given file handle for key, updating overlays and directories // accordingly. -func (m *fileMap) Set(key protocol.DocumentURI, fh file.Handle) { +func (m *fileMap) set(key protocol.DocumentURI, fh file.Handle) { m.files.Set(key, fh, nil) // update overlays - if o, ok := fh.(*Overlay); ok { + if o, ok := fh.(*overlay); ok { m.overlays.Set(key, o, nil) } else { // Setting a non-overlay must delete the corresponding overlay, to preserve @@ -111,9 +111,9 @@ func (m *fileMap) addDirs(u protocol.DocumentURI) { } } -// Delete removes a file from the map, and updates overlays and dirs +// delete removes a file from the map, and updates overlays and dirs // accordingly. -func (m *fileMap) Delete(key protocol.DocumentURI) { +func (m *fileMap) delete(key protocol.DocumentURI) { m.files.Delete(key) m.overlays.Delete(key) @@ -127,20 +127,20 @@ func (m *fileMap) Delete(key protocol.DocumentURI) { } } -// Overlays returns a new unordered array of overlay files. -func (m *fileMap) Overlays() []*Overlay { - var overlays []*Overlay - m.overlays.Range(func(_ protocol.DocumentURI, o *Overlay) { +// getOverlays returns a new unordered array of overlay files. +func (m *fileMap) getOverlays() []*overlay { + var overlays []*overlay + m.overlays.Range(func(_ protocol.DocumentURI, o *overlay) { overlays = append(overlays, o) }) return overlays } -// Dirs reports returns the set of dirs observed by the fileMap. +// getDirs reports returns the set of dirs observed by the fileMap. // // This operation mutates the fileMap. // The result must not be mutated by the caller. -func (m *fileMap) Dirs() *persistent.Set[string] { +func (m *fileMap) getDirs() *persistent.Set[string] { if m.dirs == nil { m.dirs = new(persistent.Set[string]) m.files.Range(func(u protocol.DocumentURI, _ file.Handle) { diff --git a/gopls/internal/lsp/cache/filemap_test.go b/gopls/internal/lsp/cache/filemap_test.go index d829d243276..1b661c792d5 100644 --- a/gopls/internal/lsp/cache/filemap_test.go +++ b/gopls/internal/lsp/cache/filemap_test.go @@ -72,18 +72,18 @@ func TestFileMap(t *testing.T) { case set: var fh file.Handle if op.overlay { - fh = &Overlay{uri: uri} + fh = &overlay{uri: uri} } else { - fh = &DiskFile{uri: uri} + fh = &diskFile{uri: uri} } - m.Set(uri, fh) + m.set(uri, fh) case del: - m.Delete(uri) + m.delete(uri) } } var gotFiles []string - m.Range(func(uri protocol.DocumentURI, _ file.Handle) { + m.foreach(func(uri protocol.DocumentURI, _ file.Handle) { gotFiles = append(gotFiles, normalize(uri.Path())) }) sort.Strings(gotFiles) @@ -92,7 +92,7 @@ func TestFileMap(t *testing.T) { } var gotOverlays []string - for _, o := range m.Overlays() { + for _, o := range m.getOverlays() { gotOverlays = append(gotOverlays, normalize(o.URI().Path())) } if diff := cmp.Diff(test.wantOverlays, gotOverlays); diff != "" { @@ -100,7 +100,7 @@ func TestFileMap(t *testing.T) { } var gotDirs []string - m.Dirs().Range(func(dir string) { + m.getDirs().Range(func(dir string) { gotDirs = append(gotDirs, normalize(dir)) }) sort.Strings(gotDirs) diff --git a/gopls/internal/lsp/cache/fs_memoized.go b/gopls/internal/lsp/cache/fs_memoized.go index 11f877dce9c..1b7f46f2b9e 100644 --- a/gopls/internal/lsp/cache/fs_memoized.go +++ b/gopls/internal/lsp/cache/fs_memoized.go @@ -24,16 +24,16 @@ type memoizedFS struct { // filesByID maps existing file inodes to the result of a read. // (The read may have failed, e.g. due to EACCES or a delete between stat+read.) // Each slice is a non-empty list of aliases: different URIs. - filesByID map[robustio.FileID][]*DiskFile + filesByID map[robustio.FileID][]*diskFile } func newMemoizedFS() *memoizedFS { - return &memoizedFS{filesByID: make(map[robustio.FileID][]*DiskFile)} + return &memoizedFS{filesByID: make(map[robustio.FileID][]*diskFile)} } -// A DiskFile is a file on the filesystem, or a failure to read one. +// A diskFile is a file in the filesystem, or a failure to read one. // It implements the source.FileHandle interface. -type DiskFile struct { +type diskFile struct { uri protocol.DocumentURI modTime time.Time content []byte @@ -41,25 +41,25 @@ type DiskFile struct { err error } -func (h *DiskFile) URI() protocol.DocumentURI { return h.uri } +func (h *diskFile) URI() protocol.DocumentURI { return h.uri } -func (h *DiskFile) Identity() file.Identity { +func (h *diskFile) Identity() file.Identity { return file.Identity{ URI: h.uri, Hash: h.hash, } } -func (h *DiskFile) SameContentsOnDisk() bool { return true } -func (h *DiskFile) Version() int32 { return 0 } -func (h *DiskFile) Content() ([]byte, error) { return h.content, h.err } +func (h *diskFile) SameContentsOnDisk() bool { return true } +func (h *diskFile) Version() int32 { return 0 } +func (h *diskFile) Content() ([]byte, error) { return h.content, h.err } // ReadFile stats and (maybe) reads the file, updates the cache, and returns it. func (fs *memoizedFS) ReadFile(ctx context.Context, uri protocol.DocumentURI) (file.Handle, error) { id, mtime, err := robustio.GetFileID(uri.Path()) if err != nil { // file does not exist - return &DiskFile{ + return &diskFile{ err: err, uri: uri, }, nil @@ -79,7 +79,7 @@ func (fs *memoizedFS) ReadFile(ctx context.Context, uri protocol.DocumentURI) (f fs.mu.Lock() fhs, ok := fs.filesByID[id] if ok && fhs[0].modTime.Equal(mtime) { - var fh *DiskFile + var fh *diskFile // We have already seen this file and it has not changed. for _, h := range fhs { if h.uri == uri { @@ -108,7 +108,7 @@ func (fs *memoizedFS) ReadFile(ctx context.Context, uri protocol.DocumentURI) (f fs.mu.Lock() if !recentlyModified { - fs.filesByID[id] = []*DiskFile{fh} + fs.filesByID[id] = []*diskFile{fh} } else { delete(fs.filesByID, id) } @@ -141,7 +141,7 @@ func (fs *memoizedFS) fileStats() (files, largest, errs int) { // ioLimit limits the number of parallel file reads per process. var ioLimit = make(chan struct{}, 128) -func readFile(ctx context.Context, uri protocol.DocumentURI, mtime time.Time) (*DiskFile, error) { +func readFile(ctx context.Context, uri protocol.DocumentURI, mtime time.Time) (*diskFile, error) { select { case ioLimit <- struct{}{}: case <-ctx.Done(): @@ -161,7 +161,7 @@ func readFile(ctx context.Context, uri protocol.DocumentURI, mtime time.Time) (* if err != nil { content = nil // just in case } - return &DiskFile{ + return &diskFile{ modTime: mtime, uri: uri, content: content, diff --git a/gopls/internal/lsp/cache/fs_overlay.go b/gopls/internal/lsp/cache/fs_overlay.go index 8abfbc969ad..fe089cfdd06 100644 --- a/gopls/internal/lsp/cache/fs_overlay.go +++ b/gopls/internal/lsp/cache/fs_overlay.go @@ -18,21 +18,21 @@ type overlayFS struct { delegate file.Source mu sync.Mutex - overlays map[protocol.DocumentURI]*Overlay + overlays map[protocol.DocumentURI]*overlay } func newOverlayFS(delegate file.Source) *overlayFS { return &overlayFS{ delegate: delegate, - overlays: make(map[protocol.DocumentURI]*Overlay), + overlays: make(map[protocol.DocumentURI]*overlay), } } // Overlays returns a new unordered array of overlays. -func (fs *overlayFS) Overlays() []*Overlay { +func (fs *overlayFS) Overlays() []*overlay { fs.mu.Lock() defer fs.mu.Unlock() - overlays := make([]*Overlay, 0, len(fs.overlays)) + overlays := make([]*overlay, 0, len(fs.overlays)) for _, overlay := range fs.overlays { overlays = append(overlays, overlay) } @@ -49,9 +49,10 @@ func (fs *overlayFS) ReadFile(ctx context.Context, uri protocol.DocumentURI) (fi return fs.delegate.ReadFile(ctx, uri) } -// An Overlay is a file open in the editor. It may have unsaved edits. -// It implements the file.Handle interface. -type Overlay struct { +// An overlay is a file open in the editor. It may have unsaved edits. +// It implements the file.Handle interface, and the implicit contract +// of the debug.FileTmpl template. +type overlay struct { uri protocol.DocumentURI content []byte hash file.Hash @@ -63,16 +64,16 @@ type Overlay struct { saved bool } -func (o *Overlay) URI() protocol.DocumentURI { return o.uri } +func (o *overlay) URI() protocol.DocumentURI { return o.uri } -func (o *Overlay) Identity() file.Identity { +func (o *overlay) Identity() file.Identity { return file.Identity{ URI: o.uri, Hash: o.hash, } } -func (o *Overlay) Content() ([]byte, error) { return o.content, nil } -func (o *Overlay) Version() int32 { return o.version } -func (o *Overlay) SameContentsOnDisk() bool { return o.saved } -func (o *Overlay) Kind() file.Kind { return o.kind } +func (o *overlay) Content() ([]byte, error) { return o.content, nil } +func (o *overlay) Version() int32 { return o.version } +func (o *overlay) SameContentsOnDisk() bool { return o.saved } +func (o *overlay) Kind() file.Kind { return o.kind } diff --git a/gopls/internal/lsp/cache/keys.go b/gopls/internal/lsp/cache/keys.go index 449daba3a9e..664e539edbc 100644 --- a/gopls/internal/lsp/cache/keys.go +++ b/gopls/internal/lsp/cache/keys.go @@ -4,6 +4,8 @@ package cache +// session event tracing + import ( "io" diff --git a/gopls/internal/lsp/cache/load.go b/gopls/internal/lsp/cache/load.go index e05ac4e1494..e9bddf91b63 100644 --- a/gopls/internal/lsp/cache/load.go +++ b/gopls/internal/lsp/cache/load.go @@ -636,8 +636,8 @@ func containsOpenFileLocked(s *Snapshot, mp *metadata.Package) bool { } for uri := range uris { - fh, _ := s.files.Get(uri) - if _, open := fh.(*Overlay); open { + fh, _ := s.files.get(uri) + if _, open := fh.(*overlay); open { return true } } diff --git a/gopls/internal/lsp/cache/mod_tidy.go b/gopls/internal/lsp/cache/mod_tidy.go index 67c6d64549a..89054e0fa79 100644 --- a/gopls/internal/lsp/cache/mod_tidy.go +++ b/gopls/internal/lsp/cache/mod_tidy.go @@ -66,7 +66,7 @@ func (s *Snapshot) ModTidy(ctx context.Context, pm *ParsedModule) (*TidiedModule if err != nil { return nil, err } - if _, ok := fh.(*Overlay); ok { + if _, ok := fh.(*overlay); ok { if info, _ := os.Stat(uri.Path()); info == nil { return nil, ErrNoModOnDisk } diff --git a/gopls/internal/lsp/cache/pkg.go b/gopls/internal/lsp/cache/pkg.go index fba6c54b9da..80da3817574 100644 --- a/gopls/internal/lsp/cache/pkg.go +++ b/gopls/internal/lsp/cache/pkg.go @@ -19,22 +19,16 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" ) -// Temporary refactoring, reversing the source import: -// Types +// Convenient aliases for very heavily used types. type ( - // Metadata. - PackageID = metadata.PackageID - PackagePath = metadata.PackagePath - PackageName = metadata.PackageName - ImportPath = metadata.ImportPath - - // Computed objects. + PackageID = metadata.PackageID + PackagePath = metadata.PackagePath + PackageName = metadata.PackageName + ImportPath = metadata.ImportPath ParsedGoFile = parsego.File ) -// Values -var ( - // Parse Modes +const ( ParseHeader = parsego.ParseHeader ParseFull = parsego.ParseFull ) diff --git a/gopls/internal/lsp/cache/session.go b/gopls/internal/lsp/cache/session.go index bf8cc54c0e4..01a4b10932e 100644 --- a/gopls/internal/lsp/cache/session.go +++ b/gopls/internal/lsp/cache/session.go @@ -15,6 +15,7 @@ import ( "strings" "sync" "sync/atomic" + "time" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" @@ -30,6 +31,25 @@ import ( "golang.org/x/tools/internal/xcontext" ) +// NewSession creates a new gopls session with the given cache. +func NewSession(ctx context.Context, c *Cache) *Session { + index := atomic.AddInt64(&sessionIndex, 1) + s := &Session{ + id: strconv.FormatInt(index, 10), + cache: c, + gocmdRunner: &gocommand.Runner{}, + overlayFS: newOverlayFS(c), + parseCache: newParseCache(1 * time.Minute), // keep recently parsed files for a minute, to optimize typing CPU + viewMap: make(map[protocol.DocumentURI]*View), + } + event.Log(ctx, "New session", KeyCreateSession.Of(s)) + return s +} + +// A Session holds the state (views, file contents, parse cache, +// memoized computations) of a gopls server process. +// +// It implements the file.Source interface. type Session struct { // Unique identifier for this session. id string @@ -733,7 +753,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio // branch change. Be careful to only do this if both files are open Go // files. if old, ok := replaced[c.URI]; ok && !checkViews && fileKind(fh) == file.Go { - if new, ok := fh.(*Overlay); ok { + if new, ok := fh.(*overlay); ok { if buildComment(old.content) != buildComment(new.content) { checkViews = true } @@ -894,11 +914,11 @@ func (s *Session) ExpandModificationsToDirectories(ctx context.Context, changes // // Precondition: caller holds s.viewMu lock. // TODO(rfindley): move this to fs_overlay.go. -func (fs *overlayFS) updateOverlays(ctx context.Context, changes []file.Modification) (map[protocol.DocumentURI]*Overlay, error) { +func (fs *overlayFS) updateOverlays(ctx context.Context, changes []file.Modification) (map[protocol.DocumentURI]*overlay, error) { fs.mu.Lock() defer fs.mu.Unlock() - replaced := make(map[protocol.DocumentURI]*Overlay) + replaced := make(map[protocol.DocumentURI]*overlay) for _, c := range changes { o, ok := fs.overlays[c.URI] if ok { @@ -964,7 +984,7 @@ func (fs *overlayFS) updateOverlays(ctx context.Context, changes []file.Modifica _, readErr := fh.Content() sameContentOnDisk = (readErr == nil && fh.Identity().Hash == hash) } - o = &Overlay{ + o = &overlay{ uri: c.URI, version: version, content: text, @@ -1061,7 +1081,7 @@ func (s *Session) OrphanedFileDiagnostics(ctx context.Context) (map[protocol.Doc // funcs. diagnostics := make(map[protocol.DocumentURI][]*Diagnostic) - byView := make(map[*View][]*Overlay) + byView := make(map[*View][]*overlay) for _, o := range s.Overlays() { uri := o.URI() snapshot, release, err := s.SnapshotOf(ctx, uri) diff --git a/gopls/internal/lsp/cache/snapshot.go b/gopls/internal/lsp/cache/snapshot.go index 83e02d27c3d..bb245e20f88 100644 --- a/gopls/internal/lsp/cache/snapshot.go +++ b/gopls/internal/lsp/cache/snapshot.go @@ -240,7 +240,7 @@ func (s *Snapshot) decref() { if s.refcount == 0 { s.packages.Destroy() s.activePackages.Destroy() - s.files.Destroy() + s.files.destroy() s.symbolizeHandles.Destroy() s.parseModHandles.Destroy() s.parseWorkHandles.Destroy() @@ -313,7 +313,7 @@ func fileKind(fh file.Handle) file.Kind { // The kind of an unsaved buffer comes from the // TextDocumentItem.LanguageID field in the didChange event, // not from the file name. They may differ. - if o, ok := fh.(*Overlay); ok { + if o, ok := fh.(*overlay); ok { if o.kind != file.UnknownKind { return o.kind } @@ -350,7 +350,7 @@ func (s *Snapshot) Templates() map[protocol.DocumentURI]file.Handle { defer s.mu.Unlock() tmpls := map[protocol.DocumentURI]file.Handle{} - s.files.Range(func(k protocol.DocumentURI, fh file.Handle) { + s.files.foreach(func(k protocol.DocumentURI, fh file.Handle) { if s.FileKind(fh) == file.Tmpl { tmpls[k] = fh } @@ -640,11 +640,11 @@ func (s *Snapshot) buildOverlay() map[string][]byte { // // Note that this may differ from the set of overlays on the server, if the // snapshot observed a historical state. -func (s *Snapshot) Overlays() []*Overlay { +func (s *Snapshot) Overlays() []*overlay { s.mu.Lock() defer s.mu.Unlock() - return s.files.Overlays() + return s.files.getOverlays() } // Package data kinds, identifying various package data that may be stored in @@ -697,15 +697,15 @@ func (s *Snapshot) PackageDiagnostics(ctx context.Context, ids ...PackageID) (ma // // If these indexes cannot be loaded from cache, the requested packages may // be type-checked. -func (s *Snapshot) References(ctx context.Context, ids ...PackageID) ([]XrefIndex, error) { +func (s *Snapshot) References(ctx context.Context, ids ...PackageID) ([]xrefIndex, error) { ctx, done := event.Start(ctx, "cache.snapshot.References") defer done() - indexes := make([]XrefIndex, len(ids)) + indexes := make([]xrefIndex, len(ids)) pre := func(i int, ph *packageHandle) bool { data, err := filecache.Get(xrefsKind, ph.key) if err == nil { // hit - indexes[i] = XrefIndex{mp: ph.mp, data: data} + indexes[i] = xrefIndex{mp: ph.mp, data: data} return false } else if err != filecache.ErrNotFound { event.Error(ctx, "reading xrefs from filecache", err) @@ -713,18 +713,18 @@ func (s *Snapshot) References(ctx context.Context, ids ...PackageID) ([]XrefInde return true } post := func(i int, pkg *Package) { - indexes[i] = XrefIndex{mp: pkg.metadata, data: pkg.pkg.xrefs()} + indexes[i] = xrefIndex{mp: pkg.metadata, data: pkg.pkg.xrefs()} } return indexes, s.forEachPackage(ctx, ids, pre, post) } -// An XrefIndex is a helper for looking up references in a given package. -type XrefIndex struct { +// An xrefIndex is a helper for looking up references in a given package. +type xrefIndex struct { mp *metadata.Package data []byte } -func (index XrefIndex) Lookup(targets map[PackagePath]map[objectpath.Path]struct{}) []protocol.Location { +func (index xrefIndex) Lookup(targets map[PackagePath]map[objectpath.Path]struct{}) []protocol.Location { return xrefs.Lookup(index.mp, index.data, targets) } @@ -1011,7 +1011,7 @@ func (s *Snapshot) addKnownSubdirs(patterns map[string]unit, wsDirs []string) { s.mu.Lock() defer s.mu.Unlock() - s.files.Dirs().Range(func(dir string) { + s.files.getDirs().Range(func(dir string) { for _, wsDir := range wsDirs { if pathutil.InDir(wsDir, dir) { patterns[filepath.ToSlash(dir)] = unit{} @@ -1055,11 +1055,11 @@ func (s *Snapshot) filesInDir(uri protocol.DocumentURI) []protocol.DocumentURI { defer s.mu.Unlock() dir := uri.Path() - if !s.files.Dirs().Contains(dir) { + if !s.files.getDirs().Contains(dir) { return nil } var files []protocol.DocumentURI - s.files.Range(func(uri protocol.DocumentURI, _ file.Handle) { + s.files.foreach(func(uri protocol.DocumentURI, _ file.Handle) { if pathutil.InDir(dir, uri.Path()) { files = append(files, uri) } @@ -1261,7 +1261,7 @@ func (s *Snapshot) FindFile(uri protocol.DocumentURI) file.Handle { s.mu.Lock() defer s.mu.Unlock() - result, _ := s.files.Get(uri) + result, _ := s.files.get(uri) return result } @@ -1274,14 +1274,14 @@ func (s *Snapshot) ReadFile(ctx context.Context, uri protocol.DocumentURI) (file s.mu.Lock() defer s.mu.Unlock() - fh, ok := s.files.Get(uri) + fh, ok := s.files.get(uri) if !ok { var err error fh, err = s.view.fs.ReadFile(ctx, uri) if err != nil { return nil, err } - s.files.Set(uri, fh) + s.files.set(uri, fh) } return fh, nil } @@ -1316,8 +1316,8 @@ func (s *Snapshot) preloadFiles(ctx context.Context, uris []protocol.DocumentURI continue // error logged above } uri := uris[i] - if _, ok := s.files.Get(uri); !ok { - s.files.Set(uri, fh) + if _, ok := s.files.get(uri); !ok { + s.files.set(uri, fh) } } } @@ -1327,8 +1327,8 @@ func (s *Snapshot) IsOpen(uri protocol.DocumentURI) bool { s.mu.Lock() defer s.mu.Unlock() - fh, _ := s.files.Get(uri) - _, open := fh.(*Overlay) + fh, _ := s.files.get(uri) + _, open := fh.(*overlay) return open } @@ -1407,13 +1407,13 @@ func (s *Snapshot) reloadWorkspace(ctx context.Context) { } } -func (s *Snapshot) orphanedFileDiagnostics(ctx context.Context, overlays []*Overlay) ([]*Diagnostic, error) { +func (s *Snapshot) orphanedFileDiagnostics(ctx context.Context, overlays []*overlay) ([]*Diagnostic, error) { if err := s.awaitLoaded(ctx); err != nil { return nil, err } var diagnostics []*Diagnostic - var orphaned []*Overlay + var orphaned []*overlay searchOverlays: for _, o := range overlays { uri := o.URI() @@ -1603,7 +1603,7 @@ https://github.com/golang/tools/blob/master/gopls/doc/settings.md#buildflags-str Message: msg, SuggestedFixes: suggestedFixes, } - if ok := BundleQuickFixes(d); !ok { + if ok := bundleQuickFixes(d); !ok { bug.Reportf("failed to bundle quick fixes for %v", d) } // Only report diagnostics if we detect an actual exclusion. @@ -1692,7 +1692,7 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done f initialErr: s.initialErr, packages: s.packages.Clone(), activePackages: s.activePackages.Clone(), - files: s.files.Clone(changedFiles), + files: s.files.clone(changedFiles), symbolizeHandles: cloneWithout(s.symbolizeHandles, changedFiles, nil), workspacePackages: s.workspacePackages, shouldLoad: s.shouldLoad.Clone(), // not cloneWithout: shouldLoad is cleared on loads @@ -1750,7 +1750,7 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done f // into the old snapshot, as that will break our change detection below. oldFiles := make(map[protocol.DocumentURI]file.Handle) for uri := range changedFiles { - if fh, ok := s.files.Get(uri); ok { + if fh, ok := s.files.get(uri); ok { oldFiles[uri] = fh } } @@ -1820,8 +1820,8 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done f for uri, newFH := range changedFiles { // The original FileHandle for this URI is cached on the snapshot. oldFH := oldFiles[uri] // may be nil - _, oldOpen := oldFH.(*Overlay) - _, newOpen := newFH.(*Overlay) + _, oldOpen := oldFH.(*overlay) + _, newOpen := newFH.(*overlay) anyFileOpenedOrClosed = anyFileOpenedOrClosed || (oldOpen != newOpen) anyFileAdded = anyFileAdded || (oldFH == nil || !fileExists(oldFH)) && fileExists(newFH) @@ -2130,11 +2130,11 @@ func invalidatedPackageIDs(uri protocol.DocumentURI, known map[protocol.Document // are both overlays, and if the current FileHandle is saved while the original // FileHandle was not saved. func fileWasSaved(originalFH, currentFH file.Handle) bool { - c, ok := currentFH.(*Overlay) + c, ok := currentFH.(*overlay) if !ok || c == nil { return true } - o, ok := originalFH.(*Overlay) + o, ok := originalFH.(*overlay) if !ok || o == nil { return c.saved } diff --git a/gopls/internal/lsp/cache/view.go b/gopls/internal/lsp/cache/view.go index bf2a8f045eb..482f479bfc8 100644 --- a/gopls/internal/lsp/cache/view.go +++ b/gopls/internal/lsp/cache/view.go @@ -2,7 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package cache implements the caching layer for gopls. +// Package cache is the core of gopls: it is concerned with state +// management, dependency analysis, and invalidation; and it holds the +// machinery of type checking and modular static analysis. Its +// principal types are [Session], [Folder], [View], [Snapshot], +// [Cache], and [Package]. package cache import ( From c16e2224683082f4b90cf9f17f27590ead0cfe99 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 10:31:53 -0500 Subject: [PATCH 043/105] gopls/internal/test/integration: add regtest for hover crash This CL adds a test that confirms the bug reported in golang/go#60592 is fixed at master; the test fails at commit 87ad891. Fixes golang/go#60592 Change-Id: Id9436d019a782a385228f77ce92988005711e700 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557715 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Alan Donovan <adonovan@google.com> --- .../test/integration/misc/hover_test.go | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/gopls/internal/test/integration/misc/hover_test.go b/gopls/internal/test/integration/misc/hover_test.go index d246814e9d9..66bce0d768c 100644 --- a/gopls/internal/test/integration/misc/hover_test.go +++ b/gopls/internal/test/integration/misc/hover_test.go @@ -491,3 +491,26 @@ func TestHoverEmbedDirective(t *testing.T) { } }) } + +func TestHoverBrokenImport_Issue60592(t *testing.T) { + const files = ` +-- go.mod -- +module testdata +go 1.18 + +-- p.go -- +package main + +import foo "a" + +func _() { + foo.Print() +} + +` + Run(t, files, func(t *testing.T, env *Env) { + env.OpenFile("p.go") + // This request should not crash gopls. + _, _, _ = env.Editor.Hover(env.Ctx, env.RegexpSearch("p.go", "foo[.]")) + }) +} From 0ffb1d05375e3110101f00c6d72efa54422142ae Mon Sep 17 00:00:00 2001 From: Ariel Chenet <apchenet@gmail.com> Date: Sat, 23 Dec 2023 18:15:19 +0100 Subject: [PATCH 044/105] gopls/doc: add Helix editor documentation for gopls Fixes golang/go#64685 Change-Id: I3c3c833c84474f0ae38ee69233acb976c87cac69 Reviewed-on: https://go-review.googlesource.com/c/tools/+/553775 Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/doc/helix.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 gopls/doc/helix.md diff --git a/gopls/doc/helix.md b/gopls/doc/helix.md new file mode 100644 index 00000000000..83f923de923 --- /dev/null +++ b/gopls/doc/helix.md @@ -0,0 +1,51 @@ +# Helix + +Configuring `gopls` to work with Helix is rather straightforward. Install `gopls`, and then add it to the `PATH` variable. If it is in the `PATH` variable, Helix will be able to detect it automatically. + +The documentation explaining how to install the default language servers for Helix can be found [here](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers) + +## Installing `gopls` + +The first step is to install `gopls` on your machine. +You can follow installation instructions [here](https://github.com/golang/tools/tree/master/gopls#installation). + +## Setting your path to include `gopls` + +Set your `PATH` environment variable to point to `gopls`. +If you used `go install` to download `gopls`, it should be in `$GOPATH/bin`. +If you don't have `GOPATH` set, you can use `go env GOPATH` to find it. + +## Additional information + +You can find more information about how to set up the LSP formatter [here](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers#autoformatting). + +It is possible to use `hx --health go` to see that the language server is properly set up. + +### Configuration + +The settings for `gopls` can be configured in the `languages.toml` file. +The official Helix documentation for this can be found [here](https://docs.helix-editor.com/languages.html) + +Configuration pertaining to `gopls` should be in the table `language-server.gopls`. + +#### How to set flags + +To set flags, add them to the `args` array in the `language-server.gopls` section of the `languages.toml` file. + +#### How to set LSP configuration + +Configuration options can be set in the `language-server.gopls.config` section of the `languages.toml` file, or in the `config` key of the `language-server.gopls` section of the `languages.toml` file. + +#### A minimal config example + +In the `~/.config/helix/languages.toml` file, the following snippet would set up `gopls` with a logfile located at `/tmp/gopls.log` and enable staticcheck. + +```toml +[language-server.gopls] +command = "gopls" +args = ["-logfile=/tmp/gopls.log", "serve"] +[language-server.gopls.config] +"ui.diagnostic.staticcheck" = true +``` + + From 6a58b9848e0f6f3122d36989dc528ade680faec7 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 13:56:12 -0500 Subject: [PATCH 045/105] gopls/internal/lsp/lsprpc: radically reduce API This change eliminates everything from the public API that isn't actually needed today by some part of gopls. The removed parts are moved into test files. Perhaps they are there to enable testing, or perhaps they are features that were anticipated but never needed; I don't know. Reviewers: feel free to tell me which of them we should delete outright. The old API had 41 symbols; the new API has just 6: - ConnectToRemote - ExecuteCommand - NewForwarder - ParseAddr - QueryServerState - NewStreamServer Also, tweak doc comments. Change-Id: I31a5385bbb954bb32372f952b0892f41ba81a42a Reviewed-on: https://go-review.googlesource.com/c/tools/+/557497 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/lsp/lsprpc/binder.go | 143 ------------------ gopls/internal/lsp/lsprpc/binder_test.go | 52 +++++++ .../internal/lsp/lsprpc/commandinterceptor.go | 44 ------ .../lsp/lsprpc/commandinterceptor_test.go | 19 +++ gopls/internal/lsp/lsprpc/dialer.go | 18 +-- gopls/internal/lsp/lsprpc/export_test.go | 142 +++++++++++++++++ gopls/internal/lsp/lsprpc/goenv.go | 62 -------- gopls/internal/lsp/lsprpc/goenv_test.go | 65 ++++++++ gopls/internal/lsp/lsprpc/lsprpc.go | 82 +++++----- gopls/internal/lsp/lsprpc/lsprpc_test.go | 4 +- gopls/internal/lsp/lsprpc/middleware.go | 142 ----------------- gopls/internal/lsp/lsprpc/middleware_test.go | 134 +++++++++++++++- gopls/internal/test/integration/runner.go | 2 +- 13 files changed, 457 insertions(+), 452 deletions(-) delete mode 100644 gopls/internal/lsp/lsprpc/commandinterceptor.go create mode 100644 gopls/internal/lsp/lsprpc/export_test.go delete mode 100644 gopls/internal/lsp/lsprpc/middleware.go diff --git a/gopls/internal/lsp/lsprpc/binder.go b/gopls/internal/lsp/lsprpc/binder.go index 01e59f7bb62..708e0ad6afe 100644 --- a/gopls/internal/lsp/lsprpc/binder.go +++ b/gopls/internal/lsp/lsprpc/binder.go @@ -3,146 +3,3 @@ // license that can be found in the LICENSE file. package lsprpc - -import ( - "context" - "encoding/json" - "fmt" - - "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/internal/event" - jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" - "golang.org/x/tools/internal/xcontext" -) - -// The BinderFunc type adapts a bind function to implement the jsonrpc2.Binder -// interface. -type BinderFunc func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions - -func (f BinderFunc) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { - return f(ctx, conn) -} - -// Middleware defines a transformation of jsonrpc2 Binders, that may be -// composed to build jsonrpc2 servers. -type Middleware func(jsonrpc2_v2.Binder) jsonrpc2_v2.Binder - -// A ServerFunc is used to construct an LSP server for a given client. -type ServerFunc func(context.Context, protocol.ClientCloser) protocol.Server - -// ServerBinder binds incoming connections to a new server. -type ServerBinder struct { - newServer ServerFunc -} - -func NewServerBinder(newServer ServerFunc) *ServerBinder { - return &ServerBinder{newServer: newServer} -} - -func (b *ServerBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { - client := protocol.ClientDispatcherV2(conn) - server := b.newServer(ctx, client) - serverHandler := protocol.ServerHandlerV2(server) - // Wrap the server handler to inject the client into each request context, so - // that log events are reflected back to the client. - wrapped := jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { - ctx = protocol.WithClient(ctx, client) - return serverHandler.Handle(ctx, req) - }) - preempter := &canceler{ - conn: conn, - } - return jsonrpc2_v2.ConnectionOptions{ - Handler: wrapped, - Preempter: preempter, - } -} - -type canceler struct { - conn *jsonrpc2_v2.Connection -} - -func (c *canceler) Preempt(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { - if req.Method != "$/cancelRequest" { - return nil, jsonrpc2_v2.ErrNotHandled - } - var params protocol.CancelParams - if err := json.Unmarshal(req.Params, ¶ms); err != nil { - return nil, fmt.Errorf("%w: %v", jsonrpc2_v2.ErrParse, err) - } - var id jsonrpc2_v2.ID - switch raw := params.ID.(type) { - case float64: - id = jsonrpc2_v2.Int64ID(int64(raw)) - case string: - id = jsonrpc2_v2.StringID(raw) - default: - return nil, fmt.Errorf("%w: invalid ID type %T", jsonrpc2_v2.ErrParse, params.ID) - } - c.conn.Cancel(id) - return nil, nil -} - -type ForwardBinder struct { - dialer jsonrpc2_v2.Dialer - onBind func(*jsonrpc2_v2.Connection) -} - -func NewForwardBinder(dialer jsonrpc2_v2.Dialer) *ForwardBinder { - return &ForwardBinder{ - dialer: dialer, - } -} - -func (b *ForwardBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) (opts jsonrpc2_v2.ConnectionOptions) { - client := protocol.ClientDispatcherV2(conn) - clientBinder := NewClientBinder(func(context.Context, protocol.Server) protocol.Client { return client }) - - serverConn, err := jsonrpc2_v2.Dial(context.Background(), b.dialer, clientBinder) - if err != nil { - return jsonrpc2_v2.ConnectionOptions{ - Handler: jsonrpc2_v2.HandlerFunc(func(context.Context, *jsonrpc2_v2.Request) (interface{}, error) { - return nil, fmt.Errorf("%w: %v", jsonrpc2_v2.ErrInternal, err) - }), - } - } - - if b.onBind != nil { - b.onBind(serverConn) - } - server := protocol.ServerDispatcherV2(serverConn) - preempter := &canceler{ - conn: conn, - } - detached := xcontext.Detach(ctx) - go func() { - conn.Wait() - if err := serverConn.Close(); err != nil { - event.Log(detached, fmt.Sprintf("closing remote connection: %v", err)) - } - }() - return jsonrpc2_v2.ConnectionOptions{ - Handler: protocol.ServerHandlerV2(server), - Preempter: preempter, - } -} - -// A ClientFunc is used to construct an LSP client for a given server. -type ClientFunc func(context.Context, protocol.Server) protocol.Client - -// ClientBinder binds an LSP client to an incoming connection. -type ClientBinder struct { - newClient ClientFunc -} - -func NewClientBinder(newClient ClientFunc) *ClientBinder { - return &ClientBinder{newClient} -} - -func (b *ClientBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { - server := protocol.ServerDispatcherV2(conn) - client := b.newClient(ctx, server) - return jsonrpc2_v2.ConnectionOptions{ - Handler: protocol.ClientHandlerV2(client), - } -} diff --git a/gopls/internal/lsp/lsprpc/binder_test.go b/gopls/internal/lsp/lsprpc/binder_test.go index 3315c3eb775..19698f939b8 100644 --- a/gopls/internal/lsp/lsprpc/binder_test.go +++ b/gopls/internal/lsp/lsprpc/binder_test.go @@ -17,6 +17,58 @@ import ( . "golang.org/x/tools/gopls/internal/lsp/lsprpc" ) +// ServerBinder binds incoming connections to a new server. +type ServerBinder struct { + newServer ServerFunc +} + +func NewServerBinder(newServer ServerFunc) *ServerBinder { + return &ServerBinder{newServer: newServer} +} + +// streamServer used to have this method, but it was never used. +// TODO(adonovan): figure out whether we need any of this machinery +// and, if not, delete it. In the meantime, it's better that it sit +// in the test package with all the other mothballed machinery +// than in the production code where it would couple streamServer +// and ServerBinder. +/* +func (s *streamServer) Binder() *ServerBinder { + newServer := func(ctx context.Context, client protocol.ClientCloser) protocol.Server { + session := cache.NewSession(ctx, s.cache) + svr := s.serverForTest + if svr == nil { + options := settings.DefaultOptions(s.optionsOverrides) + svr = server.New(session, client, options) + if instance := debug.GetInstance(ctx); instance != nil { + instance.AddService(svr, session) + } + } + return svr + } + return NewServerBinder(newServer) +} +*/ + +func (b *ServerBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { + client := protocol.ClientDispatcherV2(conn) + server := b.newServer(ctx, client) + serverHandler := protocol.ServerHandlerV2(server) + // Wrap the server handler to inject the client into each request context, so + // that log events are reflected back to the client. + wrapped := jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { + ctx = protocol.WithClient(ctx, client) + return serverHandler.Handle(ctx, req) + }) + preempter := &Canceler{ + Conn: conn, + } + return jsonrpc2_v2.ConnectionOptions{ + Handler: wrapped, + Preempter: preempter, + } +} + type TestEnv struct { Conns []*jsonrpc2_v2.Connection Servers []*jsonrpc2_v2.Server diff --git a/gopls/internal/lsp/lsprpc/commandinterceptor.go b/gopls/internal/lsp/lsprpc/commandinterceptor.go deleted file mode 100644 index 607ee9c9e9f..00000000000 --- a/gopls/internal/lsp/lsprpc/commandinterceptor.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsprpc - -import ( - "context" - "encoding/json" - - "golang.org/x/tools/gopls/internal/lsp/protocol" - jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" -) - -// HandlerMiddleware is a middleware that only modifies the jsonrpc2 handler. -type HandlerMiddleware func(jsonrpc2_v2.Handler) jsonrpc2_v2.Handler - -// BindHandler transforms a HandlerMiddleware into a Middleware. -func BindHandler(hmw HandlerMiddleware) Middleware { - return Middleware(func(binder jsonrpc2_v2.Binder) jsonrpc2_v2.Binder { - return BinderFunc(func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { - opts := binder.Bind(ctx, conn) - opts.Handler = hmw(opts.Handler) - return opts - }) - }) -} - -func CommandInterceptor(command string, run func(*protocol.ExecuteCommandParams) (interface{}, error)) Middleware { - return BindHandler(func(delegate jsonrpc2_v2.Handler) jsonrpc2_v2.Handler { - return jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { - if req.Method == "workspace/executeCommand" { - var params protocol.ExecuteCommandParams - if err := json.Unmarshal(req.Params, ¶ms); err == nil { - if params.Command == command { - return run(¶ms) - } - } - } - - return delegate.Handle(ctx, req) - }) - }) -} diff --git a/gopls/internal/lsp/lsprpc/commandinterceptor_test.go b/gopls/internal/lsp/lsprpc/commandinterceptor_test.go index 555f15130cc..fb29650b601 100644 --- a/gopls/internal/lsp/lsprpc/commandinterceptor_test.go +++ b/gopls/internal/lsp/lsprpc/commandinterceptor_test.go @@ -6,13 +6,32 @@ package lsprpc_test import ( "context" + "encoding/json" "testing" "golang.org/x/tools/gopls/internal/lsp/protocol" + jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" . "golang.org/x/tools/gopls/internal/lsp/lsprpc" ) +func CommandInterceptor(command string, run func(*protocol.ExecuteCommandParams) (interface{}, error)) Middleware { + return BindHandler(func(delegate jsonrpc2_v2.Handler) jsonrpc2_v2.Handler { + return jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { + if req.Method == "workspace/executeCommand" { + var params protocol.ExecuteCommandParams + if err := json.Unmarshal(req.Params, ¶ms); err == nil { + if params.Command == command { + return run(¶ms) + } + } + } + + return delegate.Handle(ctx, req) + }) + }) +} + func TestCommandInterceptor(t *testing.T) { const command = "foo" caught := false diff --git a/gopls/internal/lsp/lsprpc/dialer.go b/gopls/internal/lsp/lsprpc/dialer.go index e962c60579c..a5f038df9f1 100644 --- a/gopls/internal/lsp/lsprpc/dialer.go +++ b/gopls/internal/lsp/lsprpc/dialer.go @@ -16,12 +16,12 @@ import ( "golang.org/x/tools/internal/event" ) -// AutoNetwork is the pseudo network type used to signal that gopls should use +// autoNetwork is the pseudo network type used to signal that gopls should use // automatic discovery to resolve a remote address. -const AutoNetwork = "auto" +const autoNetwork = "auto" -// An AutoDialer is a jsonrpc2 dialer that understands the 'auto' network. -type AutoDialer struct { +// An autoDialer is a jsonrpc2 dialer that understands the 'auto' network. +type autoDialer struct { network, addr string // the 'real' network and address isAuto bool // whether the server is on the 'auto' network @@ -29,12 +29,12 @@ type AutoDialer struct { argFunc func(network, addr string) []string } -func NewAutoDialer(rawAddr string, argFunc func(network, addr string) []string) (*AutoDialer, error) { - d := AutoDialer{ +func newAutoDialer(rawAddr string, argFunc func(network, addr string) []string) (*autoDialer, error) { + d := autoDialer{ argFunc: argFunc, } d.network, d.addr = ParseAddr(rawAddr) - if d.network == AutoNetwork { + if d.network == autoNetwork { d.isAuto = true bin, err := os.Executable() if err != nil { @@ -47,14 +47,14 @@ func NewAutoDialer(rawAddr string, argFunc func(network, addr string) []string) } // Dial implements the jsonrpc2.Dialer interface. -func (d *AutoDialer) Dial(ctx context.Context) (io.ReadWriteCloser, error) { +func (d *autoDialer) Dial(ctx context.Context) (io.ReadWriteCloser, error) { conn, err := d.dialNet(ctx) return conn, err } // TODO(rFindley): remove this once we no longer need to integrate with v1 of // the jsonrpc2 package. -func (d *AutoDialer) dialNet(ctx context.Context) (net.Conn, error) { +func (d *autoDialer) dialNet(ctx context.Context) (net.Conn, error) { // Attempt to verify that we own the remote. This is imperfect, but if we can // determine that the remote is owned by a different user, we should fail. ok, err := verifyRemoteOwnership(d.network, d.addr) diff --git a/gopls/internal/lsp/lsprpc/export_test.go b/gopls/internal/lsp/lsprpc/export_test.go new file mode 100644 index 00000000000..ee5138b675f --- /dev/null +++ b/gopls/internal/lsp/lsprpc/export_test.go @@ -0,0 +1,142 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package lsprpc + +// This file defines things (and opens backdoors) needed only by tests. + +import ( + "context" + "encoding/json" + "fmt" + + "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/internal/event" + jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" + "golang.org/x/tools/internal/xcontext" +) + +const HandshakeMethod = handshakeMethod + +// A ServerFunc is used to construct an LSP server for a given client. +type ServerFunc func(context.Context, protocol.ClientCloser) protocol.Server + +type Canceler struct { + Conn *jsonrpc2_v2.Connection +} + +func (c *Canceler) Preempt(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { + if req.Method != "$/cancelRequest" { + return nil, jsonrpc2_v2.ErrNotHandled + } + var params protocol.CancelParams + if err := json.Unmarshal(req.Params, ¶ms); err != nil { + return nil, fmt.Errorf("%w: %v", jsonrpc2_v2.ErrParse, err) + } + var id jsonrpc2_v2.ID + switch raw := params.ID.(type) { + case float64: + id = jsonrpc2_v2.Int64ID(int64(raw)) + case string: + id = jsonrpc2_v2.StringID(raw) + default: + return nil, fmt.Errorf("%w: invalid ID type %T", jsonrpc2_v2.ErrParse, params.ID) + } + c.Conn.Cancel(id) + return nil, nil +} + +type ForwardBinder struct { + dialer jsonrpc2_v2.Dialer + onBind func(*jsonrpc2_v2.Connection) +} + +func NewForwardBinder(dialer jsonrpc2_v2.Dialer) *ForwardBinder { + return &ForwardBinder{ + dialer: dialer, + } +} + +func (b *ForwardBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) (opts jsonrpc2_v2.ConnectionOptions) { + client := protocol.ClientDispatcherV2(conn) + clientBinder := NewClientBinder(func(context.Context, protocol.Server) protocol.Client { return client }) + + serverConn, err := jsonrpc2_v2.Dial(context.Background(), b.dialer, clientBinder) + if err != nil { + return jsonrpc2_v2.ConnectionOptions{ + Handler: jsonrpc2_v2.HandlerFunc(func(context.Context, *jsonrpc2_v2.Request) (interface{}, error) { + return nil, fmt.Errorf("%w: %v", jsonrpc2_v2.ErrInternal, err) + }), + } + } + + if b.onBind != nil { + b.onBind(serverConn) + } + server := protocol.ServerDispatcherV2(serverConn) + preempter := &Canceler{ + Conn: conn, + } + detached := xcontext.Detach(ctx) + go func() { + conn.Wait() + if err := serverConn.Close(); err != nil { + event.Log(detached, fmt.Sprintf("closing remote connection: %v", err)) + } + }() + return jsonrpc2_v2.ConnectionOptions{ + Handler: protocol.ServerHandlerV2(server), + Preempter: preempter, + } +} + +func NewClientBinder(newClient ClientFunc) *clientBinder { + return &clientBinder{newClient} +} + +// A ClientFunc is used to construct an LSP client for a given server. +type ClientFunc func(context.Context, protocol.Server) protocol.Client + +// clientBinder binds an LSP client to an incoming connection. +type clientBinder struct { + newClient ClientFunc +} + +func (b *clientBinder) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { + server := protocol.ServerDispatcherV2(conn) + client := b.newClient(ctx, server) + return jsonrpc2_v2.ConnectionOptions{ + Handler: protocol.ClientHandlerV2(client), + } +} + +// HandlerMiddleware is a middleware that only modifies the jsonrpc2 handler. +type HandlerMiddleware func(jsonrpc2_v2.Handler) jsonrpc2_v2.Handler + +// BindHandler transforms a HandlerMiddleware into a Middleware. +func BindHandler(hmw HandlerMiddleware) Middleware { + return Middleware(func(binder jsonrpc2_v2.Binder) jsonrpc2_v2.Binder { + return BinderFunc(func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { + opts := binder.Bind(ctx, conn) + opts.Handler = hmw(opts.Handler) + return opts + }) + }) +} + +// The BinderFunc type adapts a bind function to implement the jsonrpc2.Binder +// interface. +type BinderFunc func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions + +func (f BinderFunc) Bind(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { + return f(ctx, conn) +} + +// Middleware defines a transformation of jsonrpc2 Binders, that may be +// composed to build jsonrpc2 servers. +type Middleware func(jsonrpc2_v2.Binder) jsonrpc2_v2.Binder + +var GetGoEnv = getGoEnv + +type StreamServer = streamServer diff --git a/gopls/internal/lsp/lsprpc/goenv.go b/gopls/internal/lsp/lsprpc/goenv.go index b7717844f17..52ec08ff7eb 100644 --- a/gopls/internal/lsp/lsprpc/goenv.go +++ b/gopls/internal/lsp/lsprpc/goenv.go @@ -8,72 +8,10 @@ import ( "context" "encoding/json" "fmt" - "os" - "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" - jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" ) -func GoEnvMiddleware() (Middleware, error) { - return BindHandler(func(delegate jsonrpc2_v2.Handler) jsonrpc2_v2.Handler { - return jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { - if req.Method == "initialize" { - if err := addGoEnvToInitializeRequestV2(ctx, req); err != nil { - event.Error(ctx, "adding go env to initialize", err) - } - } - return delegate.Handle(ctx, req) - }) - }), nil -} - -func addGoEnvToInitializeRequestV2(ctx context.Context, req *jsonrpc2_v2.Request) error { - var params protocol.ParamInitialize - if err := json.Unmarshal(req.Params, ¶ms); err != nil { - return err - } - var opts map[string]interface{} - switch v := params.InitializationOptions.(type) { - case nil: - opts = make(map[string]interface{}) - case map[string]interface{}: - opts = v - default: - return fmt.Errorf("unexpected type for InitializationOptions: %T", v) - } - envOpt, ok := opts["env"] - if !ok { - envOpt = make(map[string]interface{}) - } - env, ok := envOpt.(map[string]interface{}) - if !ok { - return fmt.Errorf("env option is %T, expected a map", envOpt) - } - goenv, err := getGoEnv(ctx, env) - if err != nil { - return err - } - // We don't want to propagate GOWORK unless explicitly set since that could mess with - // path inference during cmd/go invocations, see golang/go#51825. - _, goworkSet := os.LookupEnv("GOWORK") - for govar, value := range goenv { - if govar == "GOWORK" && !goworkSet { - continue - } - env[govar] = value - } - opts["env"] = env - params.InitializationOptions = opts - raw, err := json.Marshal(params) - if err != nil { - return fmt.Errorf("marshaling updated options: %v", err) - } - req.Params = json.RawMessage(raw) - return nil -} - func getGoEnv(ctx context.Context, env map[string]interface{}) (map[string]string, error) { var runEnv []string for k, v := range env { diff --git a/gopls/internal/lsp/lsprpc/goenv_test.go b/gopls/internal/lsp/lsprpc/goenv_test.go index 3030ef34dfc..535e62f14ae 100644 --- a/gopls/internal/lsp/lsprpc/goenv_test.go +++ b/gopls/internal/lsp/lsprpc/goenv_test.go @@ -6,14 +6,79 @@ package lsprpc_test import ( "context" + "encoding/json" + "fmt" + "os" "testing" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/internal/event" + jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" "golang.org/x/tools/internal/testenv" . "golang.org/x/tools/gopls/internal/lsp/lsprpc" ) +func GoEnvMiddleware() (Middleware, error) { + return BindHandler(func(delegate jsonrpc2_v2.Handler) jsonrpc2_v2.Handler { + return jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { + if req.Method == "initialize" { + if err := addGoEnvToInitializeRequestV2(ctx, req); err != nil { + event.Error(ctx, "adding go env to initialize", err) + } + } + return delegate.Handle(ctx, req) + }) + }), nil +} + +// This function is almost identical to addGoEnvToInitializeRequest in lsprpc.go. +// Make changes in parallel. +func addGoEnvToInitializeRequestV2(ctx context.Context, req *jsonrpc2_v2.Request) error { + var params protocol.ParamInitialize + if err := json.Unmarshal(req.Params, ¶ms); err != nil { + return err + } + var opts map[string]interface{} + switch v := params.InitializationOptions.(type) { + case nil: + opts = make(map[string]interface{}) + case map[string]interface{}: + opts = v + default: + return fmt.Errorf("unexpected type for InitializationOptions: %T", v) + } + envOpt, ok := opts["env"] + if !ok { + envOpt = make(map[string]interface{}) + } + env, ok := envOpt.(map[string]interface{}) + if !ok { + return fmt.Errorf("env option is %T, expected a map", envOpt) + } + goenv, err := GetGoEnv(ctx, env) + if err != nil { + return err + } + // We don't want to propagate GOWORK unless explicitly set since that could mess with + // path inference during cmd/go invocations, see golang/go#51825. + _, goworkSet := os.LookupEnv("GOWORK") + for govar, value := range goenv { + if govar == "GOWORK" && !goworkSet { + continue + } + env[govar] = value + } + opts["env"] = env + params.InitializationOptions = opts + raw, err := json.Marshal(params) + if err != nil { + return fmt.Errorf("marshaling updated options: %v", err) + } + req.Params = json.RawMessage(raw) + return nil +} + type initServer struct { protocol.Server diff --git a/gopls/internal/lsp/lsprpc/lsprpc.go b/gopls/internal/lsp/lsprpc/lsprpc.go index 006c98e9e95..081ebf3276f 100644 --- a/gopls/internal/lsp/lsprpc/lsprpc.go +++ b/gopls/internal/lsp/lsprpc/lsprpc.go @@ -33,9 +33,9 @@ import ( // Unique identifiers for client/server. var serverIndex int64 -// The StreamServer type is a jsonrpc2.StreamServer that handles incoming +// The streamServer type is a jsonrpc2.streamServer that handles incoming // streams as a new LSP session, using a shared cache. -type StreamServer struct { +type streamServer struct { cache *cache.Cache // daemon controls whether or not to log new connections. daemon bool @@ -50,29 +50,13 @@ type StreamServer struct { // NewStreamServer creates a StreamServer using the shared cache. If // withTelemetry is true, each session is instrumented with telemetry that // records RPC statistics. -func NewStreamServer(cache *cache.Cache, daemon bool, optionsFunc func(*settings.Options)) *StreamServer { - return &StreamServer{cache: cache, daemon: daemon, optionsOverrides: optionsFunc} -} - -func (s *StreamServer) Binder() *ServerBinder { - newServer := func(ctx context.Context, client protocol.ClientCloser) protocol.Server { - session := cache.NewSession(ctx, s.cache) - svr := s.serverForTest - if svr == nil { - options := settings.DefaultOptions(s.optionsOverrides) - svr = server.New(session, client, options) - if instance := debug.GetInstance(ctx); instance != nil { - instance.AddService(svr, session) - } - } - return svr - } - return NewServerBinder(newServer) +func NewStreamServer(cache *cache.Cache, daemon bool, optionsFunc func(*settings.Options)) jsonrpc2.StreamServer { + return &streamServer{cache: cache, daemon: daemon, optionsOverrides: optionsFunc} } // ServeStream implements the jsonrpc2.StreamServer interface, by handling // incoming streams using a new lsp server. -func (s *StreamServer) ServeStream(ctx context.Context, conn jsonrpc2.Conn) error { +func (s *streamServer) ServeStream(ctx context.Context, conn jsonrpc2.Conn) error { client := protocol.ClientDispatcher(conn) session := cache.NewSession(ctx, s.cache) svr := s.serverForTest @@ -110,14 +94,14 @@ func (s *StreamServer) ServeStream(ctx context.Context, conn jsonrpc2.Conn) erro return conn.Err() } -// A Forwarder is a jsonrpc2.StreamServer that handles an LSP stream by +// A forwarder is a jsonrpc2.StreamServer that handles an LSP stream by // forwarding it to a remote. This is used when the gopls process started by // the editor is in the `-remote` mode, which means it finds and connects to a // separate gopls daemon. In these cases, we still want the forwarder gopls to // be instrumented with telemetry, and want to be able to in some cases hijack // the jsonrpc2 connection with the daemon. -type Forwarder struct { - dialer *AutoDialer +type forwarder struct { + dialer *autoDialer mu sync.Mutex // Hold on to the server connection so that we can redo the handshake if any @@ -126,28 +110,29 @@ type Forwarder struct { serverID string } -// NewForwarder creates a new Forwarder, ready to forward connections to the +// NewForwarder creates a new forwarder (a [jsonrpc2.StreamServer]), +// ready to forward connections to the // remote server specified by rawAddr. If provided and rawAddr indicates an // 'automatic' address (starting with 'auto;'), argFunc may be used to start a // remote server for the auto-discovered address. -func NewForwarder(rawAddr string, argFunc func(network, address string) []string) (*Forwarder, error) { - dialer, err := NewAutoDialer(rawAddr, argFunc) +func NewForwarder(rawAddr string, argFunc func(network, address string) []string) (jsonrpc2.StreamServer, error) { + dialer, err := newAutoDialer(rawAddr, argFunc) if err != nil { return nil, err } - fwd := &Forwarder{ + fwd := &forwarder{ dialer: dialer, } return fwd, nil } -// QueryServerState queries the server state of the current server. -func QueryServerState(ctx context.Context, addr string) (*ServerState, error) { +// QueryServerState returns a JSON-encodable struct describing the state of the named server. +func QueryServerState(ctx context.Context, addr string) (any, error) { serverConn, err := dialRemote(ctx, addr) if err != nil { return nil, err } - var state ServerState + var state serverState if err := protocol.Call(ctx, serverConn, sessionsMethod, nil, &state); err != nil { return nil, fmt.Errorf("querying server state: %w", err) } @@ -159,7 +144,7 @@ func QueryServerState(ctx context.Context, addr string) (*ServerState, error) { // or auto://...). func dialRemote(ctx context.Context, addr string) (jsonrpc2.Conn, error) { network, address := ParseAddr(addr) - if network == AutoNetwork { + if network == autoNetwork { gp, err := os.Executable() if err != nil { return nil, fmt.Errorf("getting gopls path: %w", err) @@ -175,7 +160,10 @@ func dialRemote(ctx context.Context, addr string) (jsonrpc2.Conn, error) { return serverConn, nil } -func ExecuteCommand(ctx context.Context, addr string, id string, request, result interface{}) error { +// ExecuteCommand connects to the named server, sends it a +// workspace/executeCommand request (with command 'id' and arguments +// JSON encoded in 'request'), and populates the result variable. +func ExecuteCommand(ctx context.Context, addr string, id string, request, result any) error { serverConn, err := dialRemote(ctx, addr) if err != nil { return err @@ -193,7 +181,7 @@ func ExecuteCommand(ctx context.Context, addr string, id string, request, result // ServeStream dials the forwarder remote and binds the remote to serve the LSP // on the incoming stream. -func (f *Forwarder) ServeStream(ctx context.Context, clientConn jsonrpc2.Conn) error { +func (f *forwarder) ServeStream(ctx context.Context, clientConn jsonrpc2.Conn) error { client := protocol.ClientDispatcher(clientConn) netConn, err := f.dialer.dialNet(ctx) @@ -243,7 +231,7 @@ func (f *Forwarder) ServeStream(ctx context.Context, clientConn jsonrpc2.Conn) e } // TODO(rfindley): remove this handshaking in favor of middleware. -func (f *Forwarder) handshake(ctx context.Context) { +func (f *forwarder) handshake(ctx context.Context) { // This call to os.Executable is redundant, and will be eliminated by the // transition to the V2 API. goplsPath, err := os.Executable() @@ -280,7 +268,7 @@ func (f *Forwarder) handshake(ctx context.Context) { } func ConnectToRemote(ctx context.Context, addr string) (net.Conn, error) { - dialer, err := NewAutoDialer(addr, nil) + dialer, err := newAutoDialer(addr, nil) if err != nil { return nil, err } @@ -289,7 +277,7 @@ func ConnectToRemote(ctx context.Context, addr string) (net.Conn, error) { // handler intercepts messages to the daemon to enrich them with local // information. -func (f *Forwarder) handler(handler jsonrpc2.Handler) jsonrpc2.Handler { +func (f *forwarder) handler(handler jsonrpc2.Handler) jsonrpc2.Handler { return func(ctx context.Context, reply jsonrpc2.Replier, r jsonrpc2.Request) error { // Intercept certain messages to add special handling. switch r.Method() { @@ -374,7 +362,7 @@ func addGoEnvToInitializeRequest(ctx context.Context, r jsonrpc2.Request) (jsonr return jsonrpc2.NewCall(call.ID(), "initialize", params) } -func (f *Forwarder) replyWithDebugAddress(outerCtx context.Context, r jsonrpc2.Replier, args command.DebuggingArgs) jsonrpc2.Replier { +func (f *forwarder) replyWithDebugAddress(outerCtx context.Context, r jsonrpc2.Replier, args command.DebuggingArgs) jsonrpc2.Replier { di := debug.GetInstance(outerCtx) if di == nil { event.Log(outerCtx, "no debug instance to start") @@ -440,24 +428,24 @@ type handshakeResponse struct { GoplsPath string `json:"goplsPath"` } -// ClientSession identifies a current client LSP session on the server. Note +// clientSession identifies a current client LSP session on the server. Note // that it looks similar to handshakeResposne, but in fact 'Logfile' and // 'DebugAddr' now refer to the client. -type ClientSession struct { +type clientSession struct { SessionID string `json:"sessionID"` Logfile string `json:"logfile"` DebugAddr string `json:"debugAddr"` } -// ServerState holds information about the gopls daemon process, including its +// serverState holds information about the gopls daemon process, including its // debug information and debug information of all of its current connected // clients. -type ServerState struct { +type serverState struct { Logfile string `json:"logfile"` DebugAddr string `json:"debugAddr"` GoplsPath string `json:"goplsPath"` CurrentClientID string `json:"currentClientID"` - Clients []ClientSession `json:"clients"` + Clients []clientSession `json:"clients"` } const ( @@ -501,7 +489,7 @@ func handshaker(session *cache.Session, goplsPath string, logHandshakes bool, ha return reply(ctx, resp, nil) case sessionsMethod: - resp := ServerState{ + resp := serverState{ GoplsPath: goplsPath, CurrentClientID: session.ID(), } @@ -509,7 +497,7 @@ func handshaker(session *cache.Session, goplsPath string, logHandshakes bool, ha resp.Logfile = di.Logfile resp.DebugAddr = di.ListenedDebugAddress() for _, c := range di.State.Clients() { - resp.Clients = append(resp.Clients, ClientSession{ + resp.Clients = append(resp.Clients, clientSession{ SessionID: c.Session.ID(), Logfile: c.Logfile, DebugAddr: c.DebugAddress, @@ -535,8 +523,8 @@ func sendError(ctx context.Context, reply jsonrpc2.Replier, err error) { func ParseAddr(listen string) (network string, address string) { // Allow passing just -remote=auto, as a shorthand for using automatic remote // resolution. - if listen == AutoNetwork { - return AutoNetwork, "" + if listen == autoNetwork { + return autoNetwork, "" } if parts := strings.SplitN(listen, ";", 2); len(parts) == 2 { return parts[0], parts[1] diff --git a/gopls/internal/lsp/lsprpc/lsprpc_test.go b/gopls/internal/lsp/lsprpc/lsprpc_test.go index 8ae3303f837..fce5f2a6aa6 100644 --- a/gopls/internal/lsp/lsprpc/lsprpc_test.go +++ b/gopls/internal/lsp/lsprpc/lsprpc_test.go @@ -59,7 +59,7 @@ func TestClientLogging(t *testing.T) { client := FakeClient{Logs: make(chan string, 10)} ctx = debug.WithInstance(ctx, "") - ss := NewStreamServer(cache.New(nil), false, nil) + ss := NewStreamServer(cache.New(nil), false, nil).(*StreamServer) ss.serverForTest = server ts := servertest.NewPipeServer(ss, nil) defer checkClose(t, ts.Close) @@ -122,7 +122,7 @@ func checkClose(t *testing.T, closer func() error) { func setupForwarding(ctx context.Context, t *testing.T, s protocol.Server) (direct, forwarded servertest.Connector, cleanup func()) { t.Helper() serveCtx := debug.WithInstance(ctx, "") - ss := NewStreamServer(cache.New(nil), false, nil) + ss := NewStreamServer(cache.New(nil), false, nil).(*StreamServer) ss.serverForTest = s tsDirect := servertest.NewTCPServer(serveCtx, ss, nil) diff --git a/gopls/internal/lsp/lsprpc/middleware.go b/gopls/internal/lsp/lsprpc/middleware.go deleted file mode 100644 index 50089cde7dc..00000000000 --- a/gopls/internal/lsp/lsprpc/middleware.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lsprpc - -import ( - "context" - "encoding/json" - "fmt" - "sync" - - "golang.org/x/tools/internal/event" - jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" -) - -// Metadata holds arbitrary data transferred between jsonrpc2 peers. -type Metadata map[string]interface{} - -// PeerInfo holds information about a peering between jsonrpc2 servers. -type PeerInfo struct { - // RemoteID is the identity of the current server on its peer. - RemoteID int64 - - // LocalID is the identity of the peer on the server. - LocalID int64 - - // IsClient reports whether the peer is a client. If false, the peer is a - // server. - IsClient bool - - // Metadata holds arbitrary information provided by the peer. - Metadata Metadata -} - -// Handshaker handles both server and client handshaking over jsonrpc2. To -// instrument server-side handshaking, use Handshaker.Middleware. To instrument -// client-side handshaking, call Handshaker.ClientHandshake for any new -// client-side connections. -type Handshaker struct { - // Metadata will be shared with peers via handshaking. - Metadata Metadata - - mu sync.Mutex - prevID int64 - peers map[int64]PeerInfo -} - -// Peers returns the peer info this handshaker knows about by way of either the -// server-side handshake middleware, or client-side handshakes. -func (h *Handshaker) Peers() []PeerInfo { - h.mu.Lock() - defer h.mu.Unlock() - - var c []PeerInfo - for _, v := range h.peers { - c = append(c, v) - } - return c -} - -// Middleware is a jsonrpc2 middleware function to augment connection binding -// to handle the handshake method, and record disconnections. -func (h *Handshaker) Middleware(inner jsonrpc2_v2.Binder) jsonrpc2_v2.Binder { - return BinderFunc(func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { - opts := inner.Bind(ctx, conn) - - localID := h.nextID() - info := &PeerInfo{ - RemoteID: localID, - Metadata: h.Metadata, - } - - // Wrap the delegated handler to accept the handshake. - delegate := opts.Handler - opts.Handler = jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { - if req.Method == handshakeMethod { - var peerInfo PeerInfo - if err := json.Unmarshal(req.Params, &peerInfo); err != nil { - return nil, fmt.Errorf("%w: unmarshaling client info: %v", jsonrpc2_v2.ErrInvalidParams, err) - } - peerInfo.LocalID = localID - peerInfo.IsClient = true - h.recordPeer(peerInfo) - return info, nil - } - return delegate.Handle(ctx, req) - }) - - // Record the dropped client. - go h.cleanupAtDisconnect(conn, localID) - - return opts - }) -} - -// ClientHandshake performs a client-side handshake with the server at the -// other end of conn, recording the server's peer info and watching for conn's -// disconnection. -func (h *Handshaker) ClientHandshake(ctx context.Context, conn *jsonrpc2_v2.Connection) { - localID := h.nextID() - info := &PeerInfo{ - RemoteID: localID, - Metadata: h.Metadata, - } - - call := conn.Call(ctx, handshakeMethod, info) - var serverInfo PeerInfo - if err := call.Await(ctx, &serverInfo); err != nil { - event.Error(ctx, "performing handshake", err) - return - } - serverInfo.LocalID = localID - h.recordPeer(serverInfo) - - go h.cleanupAtDisconnect(conn, localID) -} - -func (h *Handshaker) nextID() int64 { - h.mu.Lock() - defer h.mu.Unlock() - - h.prevID++ - return h.prevID -} - -func (h *Handshaker) cleanupAtDisconnect(conn *jsonrpc2_v2.Connection, peerID int64) { - conn.Wait() - - h.mu.Lock() - defer h.mu.Unlock() - delete(h.peers, peerID) -} - -func (h *Handshaker) recordPeer(info PeerInfo) { - h.mu.Lock() - defer h.mu.Unlock() - if h.peers == nil { - h.peers = make(map[int64]PeerInfo) - } - h.peers[info.LocalID] = info -} diff --git a/gopls/internal/lsp/lsprpc/middleware_test.go b/gopls/internal/lsp/lsprpc/middleware_test.go index c528eae5c62..eb109686957 100644 --- a/gopls/internal/lsp/lsprpc/middleware_test.go +++ b/gopls/internal/lsp/lsprpc/middleware_test.go @@ -6,12 +6,15 @@ package lsprpc_test import ( "context" + "encoding/json" "errors" "fmt" + "sync" "testing" "time" . "golang.org/x/tools/gopls/internal/lsp/lsprpc" + "golang.org/x/tools/internal/event" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" ) @@ -21,7 +24,7 @@ var noopBinder = BinderFunc(func(context.Context, *jsonrpc2_v2.Connection) jsonr func TestHandshakeMiddleware(t *testing.T) { sh := &Handshaker{ - Metadata: Metadata{ + metadata: metadata{ "answer": 42, }, } @@ -31,7 +34,7 @@ func TestHandshakeMiddleware(t *testing.T) { l, _ := env.serve(ctx, t, sh.Middleware(noopBinder)) conn := env.dial(ctx, t, l.Dialer(), noopBinder, false) ch := &Handshaker{ - Metadata: Metadata{ + metadata: metadata{ "question": 6 * 9, }, } @@ -91,3 +94,130 @@ func TestHandshakeMiddleware(t *testing.T) { delay *= 4 } } + +// Handshaker handles both server and client handshaking over jsonrpc2 v2. +// To instrument server-side handshaking, use Handshaker.Middleware. +// To instrument client-side handshaking, call +// Handshaker.ClientHandshake for any new client-side connections. +type Handshaker struct { + // metadata will be shared with peers via handshaking. + metadata metadata + + mu sync.Mutex + prevID int64 + peers map[int64]PeerInfo +} + +// metadata holds arbitrary data transferred between jsonrpc2 peers. +type metadata map[string]any + +// PeerInfo holds information about a peering between jsonrpc2 servers. +type PeerInfo struct { + // RemoteID is the identity of the current server on its peer. + RemoteID int64 + + // LocalID is the identity of the peer on the server. + LocalID int64 + + // IsClient reports whether the peer is a client. If false, the peer is a + // server. + IsClient bool + + // Metadata holds arbitrary information provided by the peer. + Metadata metadata +} + +// Peers returns the peer info this handshaker knows about by way of either the +// server-side handshake middleware, or client-side handshakes. +func (h *Handshaker) Peers() []PeerInfo { + h.mu.Lock() + defer h.mu.Unlock() + + var c []PeerInfo + for _, v := range h.peers { + c = append(c, v) + } + return c +} + +// Middleware is a jsonrpc2 middleware function to augment connection binding +// to handle the handshake method, and record disconnections. +func (h *Handshaker) Middleware(inner jsonrpc2_v2.Binder) jsonrpc2_v2.Binder { + return BinderFunc(func(ctx context.Context, conn *jsonrpc2_v2.Connection) jsonrpc2_v2.ConnectionOptions { + opts := inner.Bind(ctx, conn) + + localID := h.nextID() + info := &PeerInfo{ + RemoteID: localID, + Metadata: h.metadata, + } + + // Wrap the delegated handler to accept the handshake. + delegate := opts.Handler + opts.Handler = jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { + if req.Method == HandshakeMethod { + var peerInfo PeerInfo + if err := json.Unmarshal(req.Params, &peerInfo); err != nil { + return nil, fmt.Errorf("%w: unmarshaling client info: %v", jsonrpc2_v2.ErrInvalidParams, err) + } + peerInfo.LocalID = localID + peerInfo.IsClient = true + h.recordPeer(peerInfo) + return info, nil + } + return delegate.Handle(ctx, req) + }) + + // Record the dropped client. + go h.cleanupAtDisconnect(conn, localID) + + return opts + }) +} + +// ClientHandshake performs a client-side handshake with the server at the +// other end of conn, recording the server's peer info and watching for conn's +// disconnection. +func (h *Handshaker) ClientHandshake(ctx context.Context, conn *jsonrpc2_v2.Connection) { + localID := h.nextID() + info := &PeerInfo{ + RemoteID: localID, + Metadata: h.metadata, + } + + call := conn.Call(ctx, HandshakeMethod, info) + var serverInfo PeerInfo + if err := call.Await(ctx, &serverInfo); err != nil { + event.Error(ctx, "performing handshake", err) + return + } + serverInfo.LocalID = localID + h.recordPeer(serverInfo) + + go h.cleanupAtDisconnect(conn, localID) +} + +func (h *Handshaker) nextID() int64 { + h.mu.Lock() + defer h.mu.Unlock() + + h.prevID++ + return h.prevID +} + +func (h *Handshaker) cleanupAtDisconnect(conn *jsonrpc2_v2.Connection, peerID int64) { + conn.Wait() + + h.mu.Lock() + defer h.mu.Unlock() + delete(h.peers, peerID) +} + +func (h *Handshaker) recordPeer(info PeerInfo) { + h.mu.Lock() + defer h.mu.Unlock() + if h.peers == nil { + h.peers = make(map[int64]PeerInfo) + } + h.peers[info.LocalID] = info +} diff --git a/gopls/internal/test/integration/runner.go b/gopls/internal/test/integration/runner.go index 2d130676e46..b468b6bbe15 100644 --- a/gopls/internal/test/integration/runner.go +++ b/gopls/internal/test/integration/runner.go @@ -403,7 +403,7 @@ func (r *Runner) separateProcessServer(optsHook func(*settings.Options)) jsonrpc return newForwarder("unix", r.remoteSocket) } -func newForwarder(network, address string) *lsprpc.Forwarder { +func newForwarder(network, address string) jsonrpc2.StreamServer { server, err := lsprpc.NewForwarder(network+";"+address, nil) if err != nil { // This should never happen, as we are passing an explicit address. From 6fe9326fff9bd06623ef24698a153dd2efaf2f08 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 11:02:10 -0500 Subject: [PATCH 046/105] gopls/internal/telemetry/cmd/stacks: include client name in report Change-Id: Id1070d775d1a3bcfa5b2302b862b4e78f1411678 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557735 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/telemetry/cmd/stacks/stacks.go | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gopls/internal/telemetry/cmd/stacks/stacks.go b/gopls/internal/telemetry/cmd/stacks/stacks.go index 9234afe2166..7123b3d477d 100644 --- a/gopls/internal/telemetry/cmd/stacks/stacks.go +++ b/gopls/internal/telemetry/cmd/stacks/stacks.go @@ -17,6 +17,7 @@ import ( "log" "net/http" "net/url" + "sort" "strings" "time" @@ -72,15 +73,30 @@ func main() { if prog.Program == "golang.org/x/tools/gopls" && len(prog.Stacks) > 0 { total++ + // Include applicable client names (e.g. vscode, eglot). + var clients []string + var clientSuffix string + for key := range prog.Counters { + client := strings.TrimPrefix(key, "gopls/client:") + if client != key { + clients = append(clients, client) + } + } + sort.Strings(clients) + if len(clients) > 0 { + clientSuffix = " " + strings.Join(clients, ",") + } + // Ignore @devel versions as they correspond to // ephemeral (and often numerous) variations of // the program as we work on a fix to a bug. if prog.Version == "devel" { continue } - info := fmt.Sprintf("%s@%s %s %s/%s", + info := fmt.Sprintf("%s@%s %s %s/%s%s", prog.Program, prog.Version, - prog.GoVersion, prog.GOOS, prog.GOARCH) + prog.GoVersion, prog.GOOS, prog.GOARCH, + clientSuffix) for stack, count := range prog.Stacks { counts := stacks[stack] if counts == nil { From d5e76f13cc5fb827a5a7667add6527cdd3307104 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 15:35:49 -0500 Subject: [PATCH 047/105] gopls/internal/progress: move from lsp/ Change-Id: I0a89b7f27f171c1b8b1389ae829db1ed3267ab05 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557398 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/lsp/cache/analysis.go | 2 +- gopls/internal/lsp/source/diagnostics.go | 2 +- gopls/internal/{lsp => }/progress/progress.go | 0 gopls/internal/{lsp => }/progress/progress_test.go | 0 gopls/internal/server/command.go | 2 +- gopls/internal/server/server.go | 2 +- 6 files changed, 4 insertions(+), 4 deletions(-) rename gopls/internal/{lsp => }/progress/progress.go (100%) rename gopls/internal/{lsp => }/progress/progress_test.go (100%) diff --git a/gopls/internal/lsp/cache/analysis.go b/gopls/internal/lsp/cache/analysis.go index 020906d408c..90b0eb88dd3 100644 --- a/gopls/internal/lsp/cache/analysis.go +++ b/gopls/internal/lsp/cache/analysis.go @@ -35,8 +35,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/progress" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/lsp/source/diagnostics.go b/gopls/internal/lsp/source/diagnostics.go index 273cc953f2c..c1122e1eac0 100644 --- a/gopls/internal/lsp/source/diagnostics.go +++ b/gopls/internal/lsp/source/diagnostics.go @@ -9,8 +9,8 @@ import ( "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/progress" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" ) diff --git a/gopls/internal/lsp/progress/progress.go b/gopls/internal/progress/progress.go similarity index 100% rename from gopls/internal/lsp/progress/progress.go rename to gopls/internal/progress/progress.go diff --git a/gopls/internal/lsp/progress/progress_test.go b/gopls/internal/progress/progress_test.go similarity index 100% rename from gopls/internal/lsp/progress/progress_test.go rename to gopls/internal/progress/progress_test.go diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 094e50c7730..a46bb3829cf 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -28,9 +28,9 @@ import ( "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/progress" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsp/source" + "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/server/server.go b/gopls/internal/server/server.go index 3b807697eeb..7b90eb30a3c 100644 --- a/gopls/internal/server/server.go +++ b/gopls/internal/server/server.go @@ -13,8 +13,8 @@ import ( "sync" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/progress" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" ) From 816dcdfba657186b1a72e0d60316ad84d6ec0435 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 13:07:13 -0500 Subject: [PATCH 048/105] go/packages: add test for flake observed on Android See https://go.dev/cl/557395 Change-Id: Ib157be22b4be57b9b92bce826119c3bf53193c93 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557396 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Tim King <taking@google.com> --- go/packages/packages_test.go | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/go/packages/packages_test.go b/go/packages/packages_test.go index 6e461c8acad..e5687babfa7 100644 --- a/go/packages/packages_test.go +++ b/go/packages/packages_test.go @@ -2953,3 +2953,43 @@ func TestExportFile(t *testing.T) { cfg.Mode = packages.NeedTypes packages.Load(cfg, "fmt") } + +// TestLoadEitherSucceedsOrFails is an attempt to reproduce a sporadic +// failure observed on the Android emu builders in which Load would +// return an empty list of packages but no error. We don't expect +// packages.Load to succeed on that platform, and testenv.NeedsGoBuild +// would ordinarily suppress the attempt if called early. But +// regardless of whether the 'go' command is functional, Load should +// never return an empty set of packages but no error. +func TestLoadEitherSucceedsOrFails(t *testing.T) { + const src = `package p` + dir := t.TempDir() + cfg := &packages.Config{ + Dir: dir, + Mode: packages.LoadSyntax, + Overlay: map[string][]byte{ + filepath.Join(dir, "p.go"): []byte(src), + }, + } + initial, err := packages.Load(cfg, "./p.go") + if err != nil { + // If Load failed because it needed 'go' and the + // platform doesn't have it, silently skip the test. + testenv.NeedsGoBuild(t) + + // Otherwise, it's a real failure. + t.Fatal(err) + } + + // If Load returned without error, + // it had better give us error-free packages. + if packages.PrintErrors(initial) > 0 { + t.Errorf("packages contain errors") + } + + // If Load returned without error, + // it had better give us the correct number packages. + if len(initial) != 1 { + t.Errorf("Load returned %d packages (want 1) and no error", len(initial)) + } +} From fa791ac34a740c22e61354170faed16f30a4743f Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Mon, 22 Jan 2024 15:43:04 -0500 Subject: [PATCH 049/105] gopls/internal/progress: simplify API This change hides the two concrete io.Writer types used by this package, and improves a number of doc comments. Change-Id: Ib9653759a4fa882fe720e5bbcee049bc4304a25a Reviewed-on: https://go-review.googlesource.com/c/tools/+/557399 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/progress/progress.go | 65 ++++++++++++++++------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/gopls/internal/progress/progress.go b/gopls/internal/progress/progress.go index 6ccf086df13..d48f8e0378e 100644 --- a/gopls/internal/progress/progress.go +++ b/gopls/internal/progress/progress.go @@ -2,11 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// The progress package defines utilities for reporting the progress +// of long-running operations using features of the LSP client +// interface such as Progress and ShowMessage. package progress import ( "context" "fmt" + "io" "math/rand" "strconv" "strings" @@ -18,6 +22,16 @@ import ( "golang.org/x/tools/internal/xcontext" ) +// NewTracker returns a new Tracker that reports progress to the +// specified client. +func NewTracker(client protocol.Client) *Tracker { + return &Tracker{ + client: client, + inProgress: make(map[protocol.ProgressToken]*WorkDone), + } +} + +// A Tracker reports the progress of a long-running operation to an LSP client. type Tracker struct { client protocol.Client supportsWorkDoneProgress bool @@ -26,27 +40,20 @@ type Tracker struct { inProgress map[protocol.ProgressToken]*WorkDone } -func NewTracker(client protocol.Client) *Tracker { - return &Tracker{ - client: client, - inProgress: make(map[protocol.ProgressToken]*WorkDone), - } -} - -// SetSupportsWorkDoneProgress sets whether the client supports work done +// SetSupportsWorkDoneProgress sets whether the client supports "work done" // progress reporting. It must be set before using the tracker. // // TODO(rfindley): fix this broken initialization pattern. // Also: do we actually need the fall-back progress behavior using ShowMessage? // Surely ShowMessage notifications are too noisy to be worthwhile. -func (tracker *Tracker) SetSupportsWorkDoneProgress(b bool) { - tracker.supportsWorkDoneProgress = b +func (t *Tracker) SetSupportsWorkDoneProgress(b bool) { + t.supportsWorkDoneProgress = b } // SupportsWorkDoneProgress reports whether the tracker supports work done // progress reporting. -func (tracker *Tracker) SupportsWorkDoneProgress() bool { - return tracker.supportsWorkDoneProgress +func (t *Tracker) SupportsWorkDoneProgress() bool { + return t.supportsWorkDoneProgress } // Start notifies the client of work being done on the server. It uses either @@ -247,36 +254,38 @@ func (wd *WorkDone) End(ctx context.Context, message string) { } } -// EventWriter writes every incoming []byte to -// event.Print with the operation=generate tag -// to distinguish its logs from others. -type EventWriter struct { - ctx context.Context - operation string +// NewEventWriter returns an [io.Writer] that calls the context's +// event printer for each data payload, wrapping it with the +// operation=generate tag to distinguish its logs from others. +func NewEventWriter(ctx context.Context, operation string) io.Writer { + return &eventWriter{ctx: ctx, operation: operation} } -func NewEventWriter(ctx context.Context, operation string) *EventWriter { - return &EventWriter{ctx: ctx, operation: operation} +type eventWriter struct { + ctx context.Context + operation string } -func (ew *EventWriter) Write(p []byte) (n int, err error) { +func (ew *eventWriter) Write(p []byte) (n int, err error) { event.Log(ew.ctx, string(p), tag.Operation.Of(ew.operation)) return len(p), nil } -// WorkDoneWriter wraps a workDone handle to provide a Writer interface, +// NewWorkDoneWriter wraps a WorkDone handle to provide a Writer interface, // so that workDone reporting can more easily be hooked into commands. -type WorkDoneWriter struct { +func NewWorkDoneWriter(ctx context.Context, wd *WorkDone) io.Writer { + return &workDoneWriter{ctx: ctx, wd: wd} +} + +// workDoneWriter wraps a workDone handle to provide a Writer interface, +// so that workDone reporting can more easily be hooked into commands. +type workDoneWriter struct { // In order to implement the io.Writer interface, we must close over ctx. ctx context.Context wd *WorkDone } -func NewWorkDoneWriter(ctx context.Context, wd *WorkDone) *WorkDoneWriter { - return &WorkDoneWriter{ctx: ctx, wd: wd} -} - -func (wdw *WorkDoneWriter) Write(p []byte) (n int, err error) { +func (wdw *workDoneWriter) Write(p []byte) (n int, err error) { wdw.wd.Report(wdw.ctx, string(p), 0) // Don't fail just because of a failure to report progress. return len(p), nil From eed199759bd547d9caec1840045e42213dba712a Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 22 Jan 2024 21:18:15 -0500 Subject: [PATCH 050/105] gopls: use relative watched file patterns if supported The relative pattern support added in version 3.17 of the LSP solves several problems related to watched file patterns. Notably, relative patterns do not suffer from windows drive letter casing problems (since they are expressed relative to a URI), and generally work more consistently across clients. Absolute glob patterns do not work well on many clients. Fixes golang/go#64763 Change-Id: I040560f236463c71dc0efaac1ea0951fb8d98fab Reviewed-on: https://go-review.googlesource.com/c/tools/+/557499 Auto-Submit: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/lsp/cache/session.go | 24 +++++--- gopls/internal/lsp/cache/snapshot.go | 39 ++++++------ .../internal/lsp/protocol/generate/tables.go | 8 +-- gopls/internal/lsp/protocol/tsjson.go | 60 +++++++++---------- gopls/internal/lsp/protocol/tsprotocol.go | 14 ++--- gopls/internal/server/general.go | 33 +++++----- gopls/internal/server/server.go | 2 +- gopls/internal/settings/settings.go | 2 + .../internal/test/integration/fake/client.go | 11 +++- 9 files changed, 108 insertions(+), 85 deletions(-) diff --git a/gopls/internal/lsp/cache/session.go b/gopls/internal/lsp/cache/session.go index 01a4b10932e..cce7b37cc71 100644 --- a/gopls/internal/lsp/cache/session.go +++ b/gopls/internal/lsp/cache/session.go @@ -1025,9 +1025,9 @@ func (b brokenFile) SameContentsOnDisk() bool { return false } func (b brokenFile) Version() int32 { return 0 } func (b brokenFile) Content() ([]byte, error) { return nil, b.err } -// FileWatchingGlobPatterns returns a set of glob patterns patterns that the -// client is required to watch for changes, and notify the server of them, in -// order to keep the server's state up to date. +// FileWatchingGlobPatterns returns a set of glob patterns that the client is +// required to watch for changes, and notify the server of them, in order to +// keep the server's state up to date. // // This set includes // 1. all go.mod and go.work files in the workspace; and @@ -1043,17 +1043,27 @@ func (b brokenFile) Content() ([]byte, error) { return nil, b.err } // The watch for workspace directories in (2) should keep each View up to date, // as it should capture any newly added/modified/deleted Go files. // +// Patterns are returned as a set of protocol.RelativePatterns, since they can +// always be later translated to glob patterns (i.e. strings) if the client +// lacks relative pattern support. By convention, any pattern returned with +// empty baseURI should be served as a glob pattern. +// +// In general, we prefer to serve relative patterns, as they work better on +// most clients that support both, and do not have issues with Windows driver +// letter casing: +// https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#relativePattern +// // TODO(golang/go#57979): we need to reset the memoizedFS when a view changes. // Consider the case where we incidentally read a file, then it moved outside // of an active module, and subsequently changed: we would still observe the // original file state. -func (s *Session) FileWatchingGlobPatterns(ctx context.Context) map[string]unit { +func (s *Session) FileWatchingGlobPatterns(ctx context.Context) map[protocol.RelativePattern]unit { s.viewMu.Lock() defer s.viewMu.Unlock() // Always watch files that may change the set of views. - patterns := map[string]unit{ - "**/*.{mod,work}": {}, + patterns := map[protocol.RelativePattern]unit{ + {Pattern: "**/*.{mod,work}"}: {}, } for _, view := range s.views { @@ -1061,7 +1071,7 @@ func (s *Session) FileWatchingGlobPatterns(ctx context.Context) map[string]unit if err != nil { continue // view is shut down; continue with others } - for k, v := range snapshot.fileWatchingGlobPatterns(ctx) { + for k, v := range snapshot.fileWatchingGlobPatterns() { patterns[k] = v } release() diff --git a/gopls/internal/lsp/cache/snapshot.go b/gopls/internal/lsp/cache/snapshot.go index bb245e20f88..14520642fe6 100644 --- a/gopls/internal/lsp/cache/snapshot.go +++ b/gopls/internal/lsp/cache/snapshot.go @@ -16,6 +16,7 @@ import ( "go/types" "io" "os" + "path" "path/filepath" "regexp" "runtime" @@ -938,21 +939,25 @@ func (s *Snapshot) resetActivePackagesLocked() { // See Session.FileWatchingGlobPatterns for a description of gopls' file // watching heuristic. -func (s *Snapshot) fileWatchingGlobPatterns(ctx context.Context) map[string]struct{} { - extensions := "go,mod,sum,work" - for _, ext := range s.Options().TemplateExtensions { - extensions += "," + ext - } - +func (s *Snapshot) fileWatchingGlobPatterns() map[protocol.RelativePattern]unit { // Always watch files that may change the view definition. - patterns := make(map[string]unit) + patterns := make(map[protocol.RelativePattern]unit) // If GOWORK is outside the folder, ensure we are watching it. if s.view.gowork != "" && !s.view.folder.Dir.Encloses(s.view.gowork) { - // TODO(rfindley): use RelativePatterns here as well (see below). - patterns[filepath.ToSlash(s.view.gowork.Path())] = unit{} + workPattern := protocol.RelativePattern{ + BaseURI: s.view.gowork.Dir(), + Pattern: path.Base(string(s.view.gowork)), + } + patterns[workPattern] = unit{} } + extensions := "go,mod,sum,work" + for _, ext := range s.Options().TemplateExtensions { + extensions += "," + ext + } + watchGoFiles := fmt.Sprintf("**/*.{%s}", extensions) + var dirs []string if s.view.moduleMode() { // In module mode, watch directories containing active modules, and collect @@ -964,21 +969,17 @@ func (s *Snapshot) fileWatchingGlobPatterns(ctx context.Context) map[string]stru dir := filepath.Dir(modFile.Path()) dirs = append(dirs, dir) - // TODO(golang/go#64763): Switch to RelativePatterns if RelativePatternSupport - // is available. Relative patterns do not have issues with Windows drive - // letter casing. - // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#relativePattern - // - // TODO(golang/go#64724): thoroughly test, particularly on on Windows. + // TODO(golang/go#64724): thoroughly test these patterns, particularly on + // on Windows. // // Note that glob patterns should use '/' on Windows: // https://code.visualstudio.com/docs/editor/glob-patterns - patterns[fmt.Sprintf("%s/**/*.{%s}", filepath.ToSlash(dir), extensions)] = unit{} + patterns[protocol.RelativePattern{BaseURI: modFile.Dir(), Pattern: watchGoFiles}] = unit{} } } else { // In non-module modes (GOPATH or AdHoc), we just watch the workspace root. dirs = []string{s.view.root.Path()} - patterns[fmt.Sprintf("**/*.{%s}", extensions)] = unit{} + patterns[protocol.RelativePattern{Pattern: watchGoFiles}] = unit{} } if s.watchSubdirs() { @@ -1007,14 +1008,14 @@ func (s *Snapshot) fileWatchingGlobPatterns(ctx context.Context) map[string]stru return patterns } -func (s *Snapshot) addKnownSubdirs(patterns map[string]unit, wsDirs []string) { +func (s *Snapshot) addKnownSubdirs(patterns map[protocol.RelativePattern]unit, wsDirs []string) { s.mu.Lock() defer s.mu.Unlock() s.files.getDirs().Range(func(dir string) { for _, wsDir := range wsDirs { if pathutil.InDir(wsDir, dir) { - patterns[filepath.ToSlash(dir)] = unit{} + patterns[protocol.RelativePattern{Pattern: filepath.ToSlash(dir)}] = unit{} } } }) diff --git a/gopls/internal/lsp/protocol/generate/tables.go b/gopls/internal/lsp/protocol/generate/tables.go index 5ed634a1abb..ac428b58479 100644 --- a/gopls/internal/lsp/protocol/generate/tables.go +++ b/gopls/internal/lsp/protocol/generate/tables.go @@ -133,10 +133,9 @@ var goplsType = map[string]string{ "Or_Declaration": "[]Location", "Or_DidChangeConfigurationRegistrationOptions_section": "OrPSection_workspace_didChangeConfiguration", - "Or_GlobPattern": "string", - "Or_InlayHintLabelPart_tooltip": "OrPTooltipPLabel", - "Or_InlayHint_tooltip": "OrPTooltip_textDocument_inlayHint", - "Or_LSPAny": "interface{}", + "Or_InlayHintLabelPart_tooltip": "OrPTooltipPLabel", + "Or_InlayHint_tooltip": "OrPTooltip_textDocument_inlayHint", + "Or_LSPAny": "interface{}", "Or_ParameterInformation_documentation": "string", "Or_ParameterInformation_label": "string", @@ -151,6 +150,7 @@ var goplsType = map[string]string{ "Or_Result_textDocument_typeDefinition": "[]Location", "Or_Result_workspace_symbol": "[]SymbolInformation", "Or_TextDocumentContentChangeEvent": "TextDocumentContentChangePartial", + "Or_RelativePattern_baseUri": "DocumentURI", "Or_WorkspaceFoldersServerCapabilities_changeNotifications": "string", "Or_WorkspaceSymbol_location": "OrPLocation_workspace_symbol", diff --git a/gopls/internal/lsp/protocol/tsjson.go b/gopls/internal/lsp/protocol/tsjson.go index f069e0e4157..c19c43557d6 100644 --- a/gopls/internal/lsp/protocol/tsjson.go +++ b/gopls/internal/lsp/protocol/tsjson.go @@ -473,6 +473,36 @@ func (t *Or_DocumentFilter) UnmarshalJSON(x []byte) error { return &UnmarshalError{"unmarshal failed to match one of [NotebookCellTextDocumentFilter TextDocumentFilter]"} } +func (t Or_GlobPattern) MarshalJSON() ([]byte, error) { + switch x := t.Value.(type) { + case Pattern: + return json.Marshal(x) + case RelativePattern: + return json.Marshal(x) + case nil: + return []byte("null"), nil + } + return nil, fmt.Errorf("type %T not one of [Pattern RelativePattern]", t) +} + +func (t *Or_GlobPattern) UnmarshalJSON(x []byte) error { + if string(x) == "null" { + t.Value = nil + return nil + } + var h0 Pattern + if err := json.Unmarshal(x, &h0); err == nil { + t.Value = h0 + return nil + } + var h1 RelativePattern + if err := json.Unmarshal(x, &h1); err == nil { + t.Value = h1 + return nil + } + return &UnmarshalError{"unmarshal failed to match one of [Pattern RelativePattern]"} +} + func (t Or_Hover_contents) MarshalJSON() ([]byte, error) { switch x := t.Value.(type) { case MarkedString: @@ -854,36 +884,6 @@ func (t *Or_RelatedUnchangedDocumentDiagnosticReport_relatedDocuments_Value) Unm return &UnmarshalError{"unmarshal failed to match one of [FullDocumentDiagnosticReport UnchangedDocumentDiagnosticReport]"} } -func (t Or_RelativePattern_baseUri) MarshalJSON() ([]byte, error) { - switch x := t.Value.(type) { - case URI: - return json.Marshal(x) - case WorkspaceFolder: - return json.Marshal(x) - case nil: - return []byte("null"), nil - } - return nil, fmt.Errorf("type %T not one of [URI WorkspaceFolder]", t) -} - -func (t *Or_RelativePattern_baseUri) UnmarshalJSON(x []byte) error { - if string(x) == "null" { - t.Value = nil - return nil - } - var h0 URI - if err := json.Unmarshal(x, &h0); err == nil { - t.Value = h0 - return nil - } - var h1 WorkspaceFolder - if err := json.Unmarshal(x, &h1); err == nil { - t.Value = h1 - return nil - } - return &UnmarshalError{"unmarshal failed to match one of [URI WorkspaceFolder]"} -} - func (t Or_Result_textDocument_codeAction_Item0_Elem) MarshalJSON() ([]byte, error) { switch x := t.Value.(type) { case CodeAction: diff --git a/gopls/internal/lsp/protocol/tsprotocol.go b/gopls/internal/lsp/protocol/tsprotocol.go index 39d83726df1..7994e667952 100644 --- a/gopls/internal/lsp/protocol/tsprotocol.go +++ b/gopls/internal/lsp/protocol/tsprotocol.go @@ -2121,7 +2121,7 @@ type GeneralClientCapabilities struct { // The glob pattern. Either a string pattern or a relative pattern. // // @since 3.17.0 -type GlobPattern = string // (alias) +type GlobPattern = Or_GlobPattern // (alias) // The result of a hover request. type Hover struct { // The hover's content @@ -3108,6 +3108,11 @@ type Or_DocumentFilter struct { Value interface{} `json:"value"` } +// created for Or [Pattern RelativePattern] +type Or_GlobPattern struct { + Value interface{} `json:"value"` +} + // created for Or [MarkedString MarkupContent []MarkedString] type Or_Hover_contents struct { Value interface{} `json:"value"` @@ -3168,11 +3173,6 @@ type Or_RelatedUnchangedDocumentDiagnosticReport_relatedDocuments_Value struct { Value interface{} `json:"value"` } -// created for Or [URI WorkspaceFolder] -type Or_RelativePattern_baseUri struct { - Value interface{} `json:"value"` -} - // created for Or [CodeAction Command] type Or_Result_textDocument_codeAction_Item0_Elem struct { Value interface{} `json:"value"` @@ -3656,7 +3656,7 @@ type RelatedUnchangedDocumentDiagnosticReport struct { type RelativePattern struct { // A workspace folder or a base URI to which this pattern will be matched // against relatively. - BaseURI Or_RelativePattern_baseUri `json:"baseUri"` + BaseURI DocumentURI `json:"baseUri"` // The actual glob pattern; Pattern Pattern `json:"pattern"` } diff --git a/gopls/internal/server/general.go b/gopls/internal/server/general.go index 371e2fa591d..90c25c1c6e5 100644 --- a/gopls/internal/server/general.go +++ b/gopls/internal/server/general.go @@ -28,6 +28,7 @@ import ( "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/goversion" + "golang.org/x/tools/gopls/internal/util/maps" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/jsonrpc2" ) @@ -362,7 +363,7 @@ func (s *server) updateWatchedDirectories(ctx context.Context) error { defer s.watchedGlobPatternsMu.Unlock() // Nothing to do if the set of workspace directories is unchanged. - if equalURISet(s.watchedGlobPatterns, patterns) { + if maps.SameKeys(s.watchedGlobPatterns, patterns) { return nil } @@ -390,32 +391,32 @@ func watchedFilesCapabilityID(id int) string { return fmt.Sprintf("workspace/didChangeWatchedFiles-%d", id) } -func equalURISet(m1, m2 map[string]struct{}) bool { - if len(m1) != len(m2) { - return false - } - for k := range m1 { - _, ok := m2[k] - if !ok { - return false - } - } - return true -} - // registerWatchedDirectoriesLocked sends the workspace/didChangeWatchedFiles // registrations to the client and updates s.watchedDirectories. // The caller must not subsequently mutate patterns. -func (s *server) registerWatchedDirectoriesLocked(ctx context.Context, patterns map[string]struct{}) error { +func (s *server) registerWatchedDirectoriesLocked(ctx context.Context, patterns map[protocol.RelativePattern]unit) error { if !s.Options().DynamicWatchedFilesSupported { return nil } + + supportsRelativePatterns := s.Options().RelativePatternsSupported + s.watchedGlobPatterns = patterns watchers := make([]protocol.FileSystemWatcher, 0, len(patterns)) // must be a slice val := protocol.WatchChange | protocol.WatchDelete | protocol.WatchCreate for pattern := range patterns { + var value any + if supportsRelativePatterns && pattern.BaseURI != "" { + value = pattern + } else { + p := pattern.Pattern + if pattern.BaseURI != "" { + p = path.Join(filepath.ToSlash(pattern.BaseURI.Path()), p) + } + value = p + } watchers = append(watchers, protocol.FileSystemWatcher{ - GlobPattern: pattern, + GlobPattern: protocol.GlobPattern{Value: value}, Kind: &val, }) } diff --git a/gopls/internal/server/server.go b/gopls/internal/server/server.go index 7b90eb30a3c..fc3de479428 100644 --- a/gopls/internal/server/server.go +++ b/gopls/internal/server/server.go @@ -89,7 +89,7 @@ type server struct { // that the server should watch changes. // The map field may be reassigned but the map is immutable. watchedGlobPatternsMu sync.Mutex - watchedGlobPatterns map[string]unit + watchedGlobPatterns map[protocol.RelativePattern]unit watchRegistrationCount int diagnosticsMu sync.Mutex diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 453ed8b96eb..9ff0e2409d6 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -121,6 +121,7 @@ type ClientOptions struct { DynamicConfigurationSupported bool DynamicRegistrationSemanticTokensSupported bool DynamicWatchedFilesSupported bool + RelativePatternsSupported bool PreferredContentFormat protocol.MarkupKind LineFoldingOnly bool HierarchicalDocumentSymbolSupport bool @@ -718,6 +719,7 @@ func (o *Options) ForClientCapabilities(clientName *protocol.ClientInfo, caps pr o.DynamicConfigurationSupported = caps.Workspace.DidChangeConfiguration.DynamicRegistration o.DynamicRegistrationSemanticTokensSupported = caps.TextDocument.SemanticTokens.DynamicRegistration o.DynamicWatchedFilesSupported = caps.Workspace.DidChangeWatchedFiles.DynamicRegistration + o.RelativePatternsSupported = caps.Workspace.DidChangeWatchedFiles.RelativePatternSupport // Check which types of content format are supported by this client. if hover := caps.TextDocument.Hover; hover != nil && len(hover.ContentFormat) > 0 { diff --git a/gopls/internal/test/integration/fake/client.go b/gopls/internal/test/integration/fake/client.go index 127a3fa73f3..71f3026a349 100644 --- a/gopls/internal/test/integration/fake/client.go +++ b/gopls/internal/test/integration/fake/client.go @@ -8,6 +8,8 @@ import ( "context" "encoding/json" "fmt" + "path" + "path/filepath" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake/glob" @@ -130,8 +132,15 @@ func (c *Client) RegisterCapability(ctx context.Context, params *protocol.Regist } var globs []*glob.Glob for _, watcher := range opts.Watchers { + var globPattern string + switch pattern := watcher.GlobPattern.Value.(type) { + case protocol.Pattern: + globPattern = pattern + case protocol.RelativePattern: + globPattern = path.Join(filepath.ToSlash(pattern.BaseURI.Path()), pattern.Pattern) + } // TODO(rfindley): honor the watch kind. - g, err := glob.Parse(watcher.GlobPattern) + g, err := glob.Parse(globPattern) if err != nil { return fmt.Errorf("error parsing glob pattern %q: %v", watcher.GlobPattern, err) } From 129144e6c5b3b7ba7bb393275351dc3440cb08f7 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 15:12:41 -0500 Subject: [PATCH 051/105] gopls/internal/lsprpc: move out of lsp/ Change-Id: I9cbb41f5d4ed9c38ed87092be16dbfa7d02ad6db Reviewed-on: https://go-review.googlesource.com/c/tools/+/557717 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/doc/design/implementation.md | 2 +- gopls/internal/cmd/cmd.go | 2 +- gopls/internal/cmd/remote.go | 2 +- gopls/internal/cmd/serve.go | 2 +- gopls/internal/{lsp => }/lsprpc/autostart_default.go | 0 gopls/internal/{lsp => }/lsprpc/autostart_posix.go | 0 gopls/internal/{lsp => }/lsprpc/binder.go | 0 gopls/internal/{lsp => }/lsprpc/binder_test.go | 2 +- gopls/internal/{lsp => }/lsprpc/commandinterceptor_test.go | 2 +- gopls/internal/{lsp => }/lsprpc/dialer.go | 0 gopls/internal/{lsp => }/lsprpc/export_test.go | 0 gopls/internal/{lsp => }/lsprpc/goenv.go | 0 gopls/internal/{lsp => }/lsprpc/goenv_test.go | 2 +- gopls/internal/{lsp => }/lsprpc/lsprpc.go | 0 gopls/internal/{lsp => }/lsprpc/lsprpc_test.go | 0 gopls/internal/{lsp => }/lsprpc/middleware_test.go | 2 +- gopls/internal/test/integration/bench/stress_test.go | 2 +- gopls/internal/test/integration/runner.go | 2 +- gopls/internal/test/marker/marker_test.go | 2 +- 19 files changed, 11 insertions(+), 11 deletions(-) rename gopls/internal/{lsp => }/lsprpc/autostart_default.go (100%) rename gopls/internal/{lsp => }/lsprpc/autostart_posix.go (100%) rename gopls/internal/{lsp => }/lsprpc/binder.go (100%) rename gopls/internal/{lsp => }/lsprpc/binder_test.go (99%) rename gopls/internal/{lsp => }/lsprpc/commandinterceptor_test.go (97%) rename gopls/internal/{lsp => }/lsprpc/dialer.go (100%) rename gopls/internal/{lsp => }/lsprpc/export_test.go (100%) rename gopls/internal/{lsp => }/lsprpc/goenv.go (100%) rename gopls/internal/{lsp => }/lsprpc/goenv_test.go (98%) rename gopls/internal/{lsp => }/lsprpc/lsprpc.go (100%) rename gopls/internal/{lsp => }/lsprpc/lsprpc_test.go (100%) rename gopls/internal/{lsp => }/lsprpc/middleware_test.go (99%) diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index cd15b890e69..0efdf4da3bf 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -156,7 +156,7 @@ provided as a debugging aid (but see [gopls]: https://pkg.go.dev/golang.org/x/tools/gopls@master [jsonrpc2]: https://pkg.go.dev/golang.org/x/tools@master/internal/jsonrpc2 [lsp]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp -[lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/lsprpc +[lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsprpc [memoize]: https://github.com/golang/tools/tree/master/internal/memoize [metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/metadata [methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/methodsets diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 93d53d2e64a..4577e50a27a 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -25,8 +25,8 @@ import ( "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/browser" diff --git a/gopls/internal/cmd/remote.go b/gopls/internal/cmd/remote.go index 684981cfff8..58e7c2ffb85 100644 --- a/gopls/internal/cmd/remote.go +++ b/gopls/internal/cmd/remote.go @@ -14,7 +14,7 @@ import ( "os" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" + "golang.org/x/tools/gopls/internal/lsprpc" ) type remote struct { diff --git a/gopls/internal/cmd/serve.go b/gopls/internal/cmd/serve.go index 03eb4520ff0..8b9bb762c2f 100644 --- a/gopls/internal/cmd/serve.go +++ b/gopls/internal/cmd/serve.go @@ -16,8 +16,8 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/fakenet" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/lsp/lsprpc/autostart_default.go b/gopls/internal/lsprpc/autostart_default.go similarity index 100% rename from gopls/internal/lsp/lsprpc/autostart_default.go rename to gopls/internal/lsprpc/autostart_default.go diff --git a/gopls/internal/lsp/lsprpc/autostart_posix.go b/gopls/internal/lsprpc/autostart_posix.go similarity index 100% rename from gopls/internal/lsp/lsprpc/autostart_posix.go rename to gopls/internal/lsprpc/autostart_posix.go diff --git a/gopls/internal/lsp/lsprpc/binder.go b/gopls/internal/lsprpc/binder.go similarity index 100% rename from gopls/internal/lsp/lsprpc/binder.go rename to gopls/internal/lsprpc/binder.go diff --git a/gopls/internal/lsp/lsprpc/binder_test.go b/gopls/internal/lsprpc/binder_test.go similarity index 99% rename from gopls/internal/lsp/lsprpc/binder_test.go rename to gopls/internal/lsprpc/binder_test.go index 19698f939b8..e702cefbe3b 100644 --- a/gopls/internal/lsp/lsprpc/binder_test.go +++ b/gopls/internal/lsprpc/binder_test.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" - . "golang.org/x/tools/gopls/internal/lsp/lsprpc" + . "golang.org/x/tools/gopls/internal/lsprpc" ) // ServerBinder binds incoming connections to a new server. diff --git a/gopls/internal/lsp/lsprpc/commandinterceptor_test.go b/gopls/internal/lsprpc/commandinterceptor_test.go similarity index 97% rename from gopls/internal/lsp/lsprpc/commandinterceptor_test.go rename to gopls/internal/lsprpc/commandinterceptor_test.go index fb29650b601..75e19c9a35e 100644 --- a/gopls/internal/lsp/lsprpc/commandinterceptor_test.go +++ b/gopls/internal/lsprpc/commandinterceptor_test.go @@ -12,7 +12,7 @@ import ( "golang.org/x/tools/gopls/internal/lsp/protocol" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" - . "golang.org/x/tools/gopls/internal/lsp/lsprpc" + . "golang.org/x/tools/gopls/internal/lsprpc" ) func CommandInterceptor(command string, run func(*protocol.ExecuteCommandParams) (interface{}, error)) Middleware { diff --git a/gopls/internal/lsp/lsprpc/dialer.go b/gopls/internal/lsprpc/dialer.go similarity index 100% rename from gopls/internal/lsp/lsprpc/dialer.go rename to gopls/internal/lsprpc/dialer.go diff --git a/gopls/internal/lsp/lsprpc/export_test.go b/gopls/internal/lsprpc/export_test.go similarity index 100% rename from gopls/internal/lsp/lsprpc/export_test.go rename to gopls/internal/lsprpc/export_test.go diff --git a/gopls/internal/lsp/lsprpc/goenv.go b/gopls/internal/lsprpc/goenv.go similarity index 100% rename from gopls/internal/lsp/lsprpc/goenv.go rename to gopls/internal/lsprpc/goenv.go diff --git a/gopls/internal/lsp/lsprpc/goenv_test.go b/gopls/internal/lsprpc/goenv_test.go similarity index 98% rename from gopls/internal/lsp/lsprpc/goenv_test.go rename to gopls/internal/lsprpc/goenv_test.go index 535e62f14ae..c2ea92a4c62 100644 --- a/gopls/internal/lsp/lsprpc/goenv_test.go +++ b/gopls/internal/lsprpc/goenv_test.go @@ -16,7 +16,7 @@ import ( jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" "golang.org/x/tools/internal/testenv" - . "golang.org/x/tools/gopls/internal/lsp/lsprpc" + . "golang.org/x/tools/gopls/internal/lsprpc" ) func GoEnvMiddleware() (Middleware, error) { diff --git a/gopls/internal/lsp/lsprpc/lsprpc.go b/gopls/internal/lsprpc/lsprpc.go similarity index 100% rename from gopls/internal/lsp/lsprpc/lsprpc.go rename to gopls/internal/lsprpc/lsprpc.go diff --git a/gopls/internal/lsp/lsprpc/lsprpc_test.go b/gopls/internal/lsprpc/lsprpc_test.go similarity index 100% rename from gopls/internal/lsp/lsprpc/lsprpc_test.go rename to gopls/internal/lsprpc/lsprpc_test.go diff --git a/gopls/internal/lsp/lsprpc/middleware_test.go b/gopls/internal/lsprpc/middleware_test.go similarity index 99% rename from gopls/internal/lsp/lsprpc/middleware_test.go rename to gopls/internal/lsprpc/middleware_test.go index eb109686957..526c7343b78 100644 --- a/gopls/internal/lsp/lsprpc/middleware_test.go +++ b/gopls/internal/lsprpc/middleware_test.go @@ -13,7 +13,7 @@ import ( "testing" "time" - . "golang.org/x/tools/gopls/internal/lsp/lsprpc" + . "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/internal/event" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" ) diff --git a/gopls/internal/test/integration/bench/stress_test.go b/gopls/internal/test/integration/bench/stress_test.go index af72739875d..e0bd305907a 100644 --- a/gopls/internal/test/integration/bench/stress_test.go +++ b/gopls/internal/test/integration/bench/stress_test.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/hooks" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" + "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/jsonrpc2" "golang.org/x/tools/internal/jsonrpc2/servertest" diff --git a/gopls/internal/test/integration/runner.go b/gopls/internal/test/integration/runner.go index b468b6bbe15..626b03b4784 100644 --- a/gopls/internal/test/integration/runner.go +++ b/gopls/internal/test/integration/runner.go @@ -22,8 +22,8 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 3440fa098a0..8c540079bf0 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -33,8 +33,8 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/hooks" "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/lsprpc" "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/test/compare" "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" From 6823da4bc3f39c895ac7f0a46d3994d146397193 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 15:29:30 -0500 Subject: [PATCH 052/105] gopls/internal/golang: move from lsp/source Change-Id: If6d3ba6327cdb9ecd4d693a9d6eff39f74bc9e25 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557740 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/doc/analyzers.md | 2 +- gopls/doc/commands.md | 2 +- gopls/doc/design/implementation.md | 2 +- gopls/doc/generate.go | 8 ++--- gopls/internal/analysis/embeddirective/doc.go | 2 +- gopls/internal/analysis/stubmethods/doc.go | 2 +- .../analysis/unusedparams/unusedparams.go | 2 +- gopls/internal/cmd/codelens.go | 2 +- gopls/internal/filecache/filecache.go | 2 +- .../{lsp/source => golang}/add_import.go | 2 +- .../{lsp/source => golang}/call_hierarchy.go | 8 ++--- .../{lsp/source => golang}/change_quote.go | 2 +- .../source => golang}/change_signature.go | 2 +- .../{lsp/source => golang}/code_lens.go | 2 +- .../{lsp/source => golang}/codeaction.go | 2 +- .../{lsp/source => golang}/comment.go | 2 +- .../source => golang}/comment_go118_test.go | 2 +- .../{lsp/source => golang}/comment_go119.go | 2 +- .../source => golang}/completion/builtin.go | 0 .../completion/completion.go | 34 +++++++++---------- .../completion/deep_completion.go | 0 .../completion/deep_completion_test.go | 0 .../completion/definition.go | 6 ++-- .../source => golang}/completion/format.go | 18 +++++----- .../{lsp/source => golang}/completion/fuzz.go | 0 .../source => golang}/completion/keywords.go | 0 .../source => golang}/completion/labels.go | 0 .../source => golang}/completion/literal.go | 14 ++++---- .../source => golang}/completion/package.go | 12 +++---- .../completion/package_test.go | 4 +-- .../completion/postfix_snippets.go | 8 ++--- .../source => golang}/completion/printf.go | 0 .../completion/printf_test.go | 0 .../source => golang}/completion/snippet.go | 2 +- .../completion/snippet/snippet_builder.go | 0 .../snippet/snippet_builder_test.go | 0 .../completion/statements.go | 10 +++--- .../{lsp/source => golang}/completion/util.go | 6 ++-- .../source => golang}/completion/util_test.go | 0 .../{lsp/source => golang}/definition.go | 6 ++-- .../{lsp/source => golang}/diagnostics.go | 2 +- .../{lsp/source => golang}/embeddirective.go | 2 +- .../{lsp/source => golang}/extract.go | 2 +- gopls/internal/{lsp/source => golang}/fix.go | 4 +-- .../{lsp/source => golang}/folding_range.go | 2 +- .../internal/{lsp/source => golang}/format.go | 13 +++---- .../{lsp/source => golang}/format_test.go | 2 +- .../{lsp/source => golang}/gc_annotations.go | 2 +- .../{lsp/source => golang}/highlight.go | 4 +-- .../internal/{lsp/source => golang}/hover.go | 4 +-- .../{lsp/source => golang}/identifier.go | 2 +- .../{lsp/source => golang}/identifier_test.go | 2 +- .../{lsp/source => golang}/implementation.go | 4 +-- .../{lsp/source => golang}/inlay_hint.go | 4 +-- .../internal/{lsp/source => golang}/inline.go | 2 +- .../{lsp/source => golang}/inline_all.go | 2 +- .../source => golang}/invertifcondition.go | 2 +- .../{lsp/source => golang}/known_packages.go | 2 +- .../{lsp/source => golang}/linkname.go | 2 +- .../internal/{lsp/source => golang}/origin.go | 2 +- .../{lsp/source => golang}/origin_119.go | 2 +- .../{lsp/source => golang}/references.go | 4 +-- .../internal/{lsp/source => golang}/rename.go | 6 ++-- .../{lsp/source => golang}/rename_check.go | 2 +- .../{lsp/source => golang}/signature_help.go | 4 +-- .../{lsp/source => golang}/snapshot.go | 13 +------ gopls/internal/{lsp/source => golang}/stub.go | 4 +-- .../{lsp/source => golang}/symbols.go | 4 +-- .../{lsp/source => golang}/type_definition.go | 4 +-- .../{lsp/source => golang}/types_format.go | 2 +- gopls/internal/{lsp/source => golang}/util.go | 2 +- .../source => golang}/workspace_symbol.go | 4 +-- .../workspace_symbol_test.go | 2 +- gopls/internal/hooks/gofumpt_117.go | 4 +-- gopls/internal/lsp/cache/analysis.go | 2 +- gopls/internal/lsp/cache/cache.go | 2 +- gopls/internal/lsp/cache/errors.go | 2 +- gopls/internal/lsp/cache/fs_memoized.go | 2 +- gopls/internal/lsp/command/interface.go | 2 +- gopls/internal/mod/code_lens.go | 6 ++-- gopls/internal/server/call_hierarchy.go | 8 ++--- gopls/internal/server/code_action.go | 6 ++-- gopls/internal/server/code_lens.go | 6 ++-- gopls/internal/server/command.go | 18 +++++----- gopls/internal/server/completion.go | 6 ++-- gopls/internal/server/definition.go | 6 ++-- gopls/internal/server/diagnostics.go | 10 +++--- gopls/internal/server/folding_range.go | 6 ++-- gopls/internal/server/format.go | 4 +-- gopls/internal/server/highlight.go | 4 +-- gopls/internal/server/hover.go | 4 +-- gopls/internal/server/implementation.go | 4 +-- gopls/internal/server/inlay_hint.go | 4 +-- gopls/internal/server/link.go | 6 ++-- gopls/internal/server/references.go | 4 +-- gopls/internal/server/rename.go | 8 ++--- gopls/internal/server/semantic.go | 6 ++-- gopls/internal/server/signature_help.go | 4 +-- gopls/internal/server/symbols.go | 4 +-- gopls/internal/server/text_synchronization.go | 4 +-- gopls/internal/server/workspace_symbol.go | 4 +-- gopls/internal/settings/api_json.go | 6 ++-- .../internal/test/integration/fake/editor.go | 2 +- .../integration/inlayhints/inlayhints_test.go | 6 ++-- 104 files changed, 215 insertions(+), 227 deletions(-) rename gopls/internal/{lsp/source => golang}/add_import.go (98%) rename gopls/internal/{lsp/source => golang}/call_hierarchy.go (97%) rename gopls/internal/{lsp/source => golang}/change_quote.go (99%) rename gopls/internal/{lsp/source => golang}/change_signature.go (99%) rename gopls/internal/{lsp/source => golang}/code_lens.go (99%) rename gopls/internal/{lsp/source => golang}/codeaction.go (99%) rename gopls/internal/{lsp/source => golang}/comment.go (99%) rename gopls/internal/{lsp/source => golang}/comment_go118_test.go (99%) rename gopls/internal/{lsp/source => golang}/comment_go119.go (99%) rename gopls/internal/{lsp/source => golang}/completion/builtin.go (100%) rename gopls/internal/{lsp/source => golang}/completion/completion.go (99%) rename gopls/internal/{lsp/source => golang}/completion/deep_completion.go (100%) rename gopls/internal/{lsp/source => golang}/completion/deep_completion_test.go (100%) rename gopls/internal/{lsp/source => golang}/completion/definition.go (95%) rename gopls/internal/{lsp/source => golang}/completion/format.go (95%) rename gopls/internal/{lsp/source => golang}/completion/fuzz.go (100%) rename gopls/internal/{lsp/source => golang}/completion/keywords.go (100%) rename gopls/internal/{lsp/source => golang}/completion/labels.go (100%) rename gopls/internal/{lsp/source => golang}/completion/literal.go (97%) rename gopls/internal/{lsp/source => golang}/completion/package.go (96%) rename gopls/internal/{lsp/source => golang}/completion/package_test.go (96%) rename gopls/internal/{lsp/source => golang}/completion/postfix_snippets.go (98%) rename gopls/internal/{lsp/source => golang}/completion/printf.go (100%) rename gopls/internal/{lsp/source => golang}/completion/printf_test.go (100%) rename gopls/internal/{lsp/source => golang}/completion/snippet.go (98%) rename gopls/internal/{lsp/source => golang}/completion/snippet/snippet_builder.go (100%) rename gopls/internal/{lsp/source => golang}/completion/snippet/snippet_builder_test.go (100%) rename gopls/internal/{lsp/source => golang}/completion/statements.go (97%) rename gopls/internal/{lsp/source => golang}/completion/util.go (98%) rename gopls/internal/{lsp/source => golang}/completion/util_test.go (100%) rename gopls/internal/{lsp/source => golang}/definition.go (98%) rename gopls/internal/{lsp/source => golang}/diagnostics.go (99%) rename gopls/internal/{lsp/source => golang}/embeddirective.go (99%) rename gopls/internal/{lsp/source => golang}/extract.go (99%) rename gopls/internal/{lsp/source => golang}/fix.go (99%) rename gopls/internal/{lsp/source => golang}/folding_range.go (99%) rename gopls/internal/{lsp/source => golang}/format.go (96%) rename gopls/internal/{lsp/source => golang}/format_test.go (99%) rename gopls/internal/{lsp/source => golang}/gc_annotations.go (99%) rename gopls/internal/{lsp/source => golang}/highlight.go (99%) rename gopls/internal/{lsp/source => golang}/hover.go (99%) rename gopls/internal/{lsp/source => golang}/identifier.go (99%) rename gopls/internal/{lsp/source => golang}/identifier_test.go (99%) rename gopls/internal/{lsp/source => golang}/implementation.go (99%) rename gopls/internal/{lsp/source => golang}/inlay_hint.go (99%) rename gopls/internal/{lsp/source => golang}/inline.go (99%) rename gopls/internal/{lsp/source => golang}/inline_all.go (99%) rename gopls/internal/{lsp/source => golang}/invertifcondition.go (99%) rename gopls/internal/{lsp/source => golang}/known_packages.go (99%) rename gopls/internal/{lsp/source => golang}/linkname.go (99%) rename gopls/internal/{lsp/source => golang}/origin.go (98%) rename gopls/internal/{lsp/source => golang}/origin_119.go (98%) rename gopls/internal/{lsp/source => golang}/references.go (99%) rename gopls/internal/{lsp/source => golang}/rename.go (99%) rename gopls/internal/{lsp/source => golang}/rename_check.go (99%) rename gopls/internal/{lsp/source => golang}/signature_help.go (98%) rename gopls/internal/{lsp/source => golang}/snapshot.go (88%) rename gopls/internal/{lsp/source => golang}/stub.go (99%) rename gopls/internal/{lsp/source => golang}/symbols.go (98%) rename gopls/internal/{lsp/source => golang}/type_definition.go (95%) rename gopls/internal/{lsp/source => golang}/types_format.go (99%) rename gopls/internal/{lsp/source => golang}/util.go (99%) rename gopls/internal/{lsp/source => golang}/workspace_symbol.go (99%) rename gopls/internal/{lsp/source => golang}/workspace_symbol_test.go (99%) diff --git a/gopls/doc/analyzers.md b/gopls/doc/analyzers.md index 26ec5a25b69..0a469a14ccd 100644 --- a/gopls/doc/analyzers.md +++ b/gopls/doc/analyzers.md @@ -781,7 +781,7 @@ This analyzer will suggest a fix to declare this method: (At least, it appears to behave that way, but technically it doesn't use the SuggestedFix mechanism and the stub is created by -logic in gopls's source.stub function.) +logic in gopls's golang.stub function.) [Full documentation](https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods) diff --git a/gopls/doc/commands.md b/gopls/doc/commands.md index 2b97ed1cc97..262b2a366d1 100644 --- a/gopls/doc/commands.md +++ b/gopls/doc/commands.md @@ -73,7 +73,7 @@ Args: // the analysis.Diagnostic with a SuggestedFix containing no edits. // // For fixes suggested by code actions, this is a string agreed - // upon by the code action and source.ApplyFix. + // upon by the code action and golang.ApplyFix. "Fix": string, // The file URI for the document to fix. "URI": string, diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index 0efdf4da3bf..a6f0173df9a 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -158,7 +158,7 @@ provided as a debugging aid (but see [lsp]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp [lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsprpc [memoize]: https://github.com/golang/tools/tree/master/internal/memoize -[metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/metadata +[metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/metadata [methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/methodsets [mod]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/mod [parsego]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/parsego diff --git a/gopls/doc/generate.go b/gopls/doc/generate.go index c0bcf06ae61..99d15b2966e 100644 --- a/gopls/doc/generate.go +++ b/gopls/doc/generate.go @@ -32,9 +32,9 @@ import ( "github.com/jba/printsrc" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/packages" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/command/commandmeta" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/safetoken" @@ -124,7 +124,7 @@ func loadAPI() (*settings.APIJSON, error) { for _, c := range api.Commands { c.Command = command.ID(c.Command) } - api.Hints = loadHints(source.AllInlayHints) + api.Hints = loadHints(golang.AllInlayHints) for _, category := range []reflect.Value{ reflect.ValueOf(defaults.UserOptions), } { @@ -481,7 +481,7 @@ func structDoc(fields []*commandmeta.Field, level int) string { func loadLenses(commands []*settings.CommandJSON) []*settings.LensJSON { all := map[command.Command]struct{}{} - for k := range source.LensFuncs() { + for k := range golang.LensFuncs() { all[k] = struct{}{} } for k := range mod.LensFuncs() { @@ -524,7 +524,7 @@ func loadAnalyzers(m map[string]*settings.Analyzer) []*settings.AnalyzerJSON { return json } -func loadHints(m map[string]*source.Hint) []*settings.HintJSON { +func loadHints(m map[string]*golang.Hint) []*settings.HintJSON { var sorted []string for _, h := range m { sorted = append(sorted, h.Name) diff --git a/gopls/internal/analysis/embeddirective/doc.go b/gopls/internal/analysis/embeddirective/doc.go index f8cc69fda77..bfed47f14f4 100644 --- a/gopls/internal/analysis/embeddirective/doc.go +++ b/gopls/internal/analysis/embeddirective/doc.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package embeddirective defines an Analyzer that validates //go:embed directives. -// The analyzer defers fixes to its parent source.Analyzer. +// The analyzer defers fixes to its parent golang.Analyzer. // // # Analyzer embed // diff --git a/gopls/internal/analysis/stubmethods/doc.go b/gopls/internal/analysis/stubmethods/doc.go index 4a433762399..e1383cfc7e7 100644 --- a/gopls/internal/analysis/stubmethods/doc.go +++ b/gopls/internal/analysis/stubmethods/doc.go @@ -34,5 +34,5 @@ // // (At least, it appears to behave that way, but technically it // doesn't use the SuggestedFix mechanism and the stub is created by -// logic in gopls's source.stub function.) +// logic in gopls's golang.stub function.) package stubmethods diff --git a/gopls/internal/analysis/unusedparams/unusedparams.go b/gopls/internal/analysis/unusedparams/unusedparams.go index f1b793ab3b9..74cd662285c 100644 --- a/gopls/internal/analysis/unusedparams/unusedparams.go +++ b/gopls/internal/analysis/unusedparams/unusedparams.go @@ -277,7 +277,7 @@ func run(pass *analysis.Pass) (any, error) { } // This diagnostic carries both an edit-based fix to // rename the unused parameter, and a command-based fix - // to remove it (see source.RemoveUnusedParameter). + // to remove it (see golang.RemoveUnusedParameter). pass.Report(analysis.Diagnostic{ Pos: start, End: end, diff --git a/gopls/internal/cmd/codelens.go b/gopls/internal/cmd/codelens.go index f861eca1b5e..42e097d779e 100644 --- a/gopls/internal/cmd/codelens.go +++ b/gopls/internal/cmd/codelens.go @@ -71,7 +71,7 @@ func (r *codelens) Run(ctx context.Context, args ...string) error { // Override the default setting for codelenses[Test], which is // off by default because VS Code has a superior client-side // implementation. But this client is not VS Code. - // See source.LensFuncs(). + // See golang.LensFuncs(). origOptions := r.app.options r.app.options = func(opts *settings.Options) { origOptions(opts) diff --git a/gopls/internal/filecache/filecache.go b/gopls/internal/filecache/filecache.go index af917578e4f..036b185625d 100644 --- a/gopls/internal/filecache/filecache.go +++ b/gopls/internal/filecache/filecache.go @@ -266,7 +266,7 @@ func SetBudget(new int64) (old int64) { // The current design instead exploits a trick from the cache // implementation used by the go command: writes of small files are in // practice atomic (all or nothing) on all platforms. -// (See GOROOT/src/cmd/go/internal/cache/cache.go.) +// (See GOROOT/src/cmd/go/internal/lsp/cache/cache.go.) // // Russ Cox notes: "all file systems use an rwlock around every file // system block, including data blocks, so any writes or reads within diff --git a/gopls/internal/lsp/source/add_import.go b/gopls/internal/golang/add_import.go similarity index 98% rename from gopls/internal/lsp/source/add_import.go rename to gopls/internal/golang/add_import.go index 90d136d1904..bab1e62349d 100644 --- a/gopls/internal/lsp/source/add_import.go +++ b/gopls/internal/golang/add_import.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/call_hierarchy.go b/gopls/internal/golang/call_hierarchy.go similarity index 97% rename from gopls/internal/lsp/source/call_hierarchy.go rename to gopls/internal/golang/call_hierarchy.go index e1b8f00f29f..f4ff802ddcf 100644 --- a/gopls/internal/lsp/source/call_hierarchy.go +++ b/gopls/internal/golang/call_hierarchy.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -25,7 +25,7 @@ import ( // PrepareCallHierarchy returns an array of CallHierarchyItem for a file and the position within the file. func PrepareCallHierarchy(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp protocol.Position) ([]protocol.CallHierarchyItem, error) { - ctx, done := event.Start(ctx, "source.PrepareCallHierarchy") + ctx, done := event.Start(ctx, "golang.PrepareCallHierarchy") defer done() pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) @@ -66,7 +66,7 @@ func PrepareCallHierarchy(ctx context.Context, snapshot *cache.Snapshot, fh file // IncomingCalls returns an array of CallHierarchyIncomingCall for a file and the position within the file. func IncomingCalls(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pos protocol.Position) ([]protocol.CallHierarchyIncomingCall, error) { - ctx, done := event.Start(ctx, "source.IncomingCalls") + ctx, done := event.Start(ctx, "golang.IncomingCalls") defer done() refs, err := references(ctx, snapshot, fh, pos, false) @@ -180,7 +180,7 @@ outer: // OutgoingCalls returns an array of CallHierarchyOutgoingCall for a file and the position within the file. func OutgoingCalls(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp protocol.Position) ([]protocol.CallHierarchyOutgoingCall, error) { - ctx, done := event.Start(ctx, "source.OutgoingCalls") + ctx, done := event.Start(ctx, "golang.OutgoingCalls") defer done() pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) diff --git a/gopls/internal/lsp/source/change_quote.go b/gopls/internal/golang/change_quote.go similarity index 99% rename from gopls/internal/lsp/source/change_quote.go rename to gopls/internal/golang/change_quote.go index 7c6fd5b9721..fade568f281 100644 --- a/gopls/internal/lsp/source/change_quote.go +++ b/gopls/internal/golang/change_quote.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "go/ast" diff --git a/gopls/internal/lsp/source/change_signature.go b/gopls/internal/golang/change_signature.go similarity index 99% rename from gopls/internal/lsp/source/change_signature.go rename to gopls/internal/golang/change_signature.go index f4056bd0bbd..a0584445a49 100644 --- a/gopls/internal/lsp/source/change_signature.go +++ b/gopls/internal/golang/change_signature.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/code_lens.go b/gopls/internal/golang/code_lens.go similarity index 99% rename from gopls/internal/lsp/source/code_lens.go rename to gopls/internal/golang/code_lens.go index 364665673d7..70c8600c26b 100644 --- a/gopls/internal/lsp/source/code_lens.go +++ b/gopls/internal/golang/code_lens.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/codeaction.go b/gopls/internal/golang/codeaction.go similarity index 99% rename from gopls/internal/lsp/source/codeaction.go rename to gopls/internal/golang/codeaction.go index dcec2e5be62..2a6955679ce 100644 --- a/gopls/internal/lsp/source/codeaction.go +++ b/gopls/internal/golang/codeaction.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/comment.go b/gopls/internal/golang/comment.go similarity index 99% rename from gopls/internal/lsp/source/comment.go rename to gopls/internal/golang/comment.go index 578399e30c6..ece123801ff 100644 --- a/gopls/internal/lsp/source/comment.go +++ b/gopls/internal/golang/comment.go @@ -5,7 +5,7 @@ //go:build !go1.19 // +build !go1.19 -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/comment_go118_test.go b/gopls/internal/golang/comment_go118_test.go similarity index 99% rename from gopls/internal/lsp/source/comment_go118_test.go rename to gopls/internal/golang/comment_go118_test.go index 60bd14b9fc8..c38898a28e6 100644 --- a/gopls/internal/lsp/source/comment_go118_test.go +++ b/gopls/internal/golang/comment_go118_test.go @@ -5,7 +5,7 @@ //go:build !go1.19 // +build !go1.19 -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/comment_go119.go b/gopls/internal/golang/comment_go119.go similarity index 99% rename from gopls/internal/lsp/source/comment_go119.go rename to gopls/internal/golang/comment_go119.go index d36d110b541..b9b1472f74d 100644 --- a/gopls/internal/lsp/source/comment_go119.go +++ b/gopls/internal/golang/comment_go119.go @@ -5,7 +5,7 @@ //go:build go1.19 // +build go1.19 -package source +package golang // Starting with go1.19, the formatting of comments has changed, and there // is a new package (go/doc/comment) for processing them. diff --git a/gopls/internal/lsp/source/completion/builtin.go b/gopls/internal/golang/completion/builtin.go similarity index 100% rename from gopls/internal/lsp/source/completion/builtin.go rename to gopls/internal/golang/completion/builtin.go diff --git a/gopls/internal/lsp/source/completion/completion.go b/gopls/internal/golang/completion/completion.go similarity index 99% rename from gopls/internal/lsp/source/completion/completion.go rename to gopls/internal/golang/completion/completion.go index a20e4633164..d76fea48925 100644 --- a/gopls/internal/lsp/source/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go @@ -28,11 +28,11 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" "golang.org/x/tools/gopls/internal/settings" goplsastutil "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/safetoken" @@ -173,7 +173,7 @@ type completer struct { snapshot *cache.Snapshot pkg *cache.Package qf types.Qualifier // for qualifying typed expressions - mq source.MetadataQualifier // for syntactic qualifying + mq golang.MetadataQualifier // for syntactic qualifying opts *completionOptions // completionContext contains information about the trigger for this @@ -453,7 +453,7 @@ func Completion(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, p startTime := time.Now() - pkg, pgf, err := source.NarrowestPackageForFile(ctx, snapshot, fh.URI()) + pkg, pgf, err := golang.NarrowestPackageForFile(ctx, snapshot, fh.URI()) if err != nil || pgf.File.Package == token.NoPos { // If we can't parse this file or find position for the package // keyword, it may be missing a package declaration. Try offering @@ -522,7 +522,7 @@ func Completion(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, p } // Collect all surrounding scopes, innermost first. - scopes := source.CollectScopes(pkg.GetTypesInfo(), path, pos) + scopes := golang.CollectScopes(pkg.GetTypesInfo(), path, pos) scopes = append(scopes, pkg.GetTypes().Scope(), types.Universe) opts := snapshot.Options() @@ -530,7 +530,7 @@ func Completion(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, p pkg: pkg, snapshot: snapshot, qf: typesutil.FileQualifier(pgf.File, pkg.GetTypes(), pkg.GetTypesInfo()), - mq: source.MetadataQualifierForFile(snapshot, pgf.File, pkg.Metadata()), + mq: golang.MetadataQualifierForFile(snapshot, pgf.File, pkg.Metadata()), completionContext: completionContext{ triggerCharacter: protoContext.TriggerCharacter, triggerKind: protoContext.TriggerKind, @@ -1158,7 +1158,7 @@ func (c *completer) selector(ctx context.Context, sel *ast.SelectorExpr) error { imp := pkgName.Imported() // Known direct dependency? Expand using type information. - if _, ok := c.pkg.Metadata().DepsByPkgPath[source.PackagePath(imp.Path())]; ok { + if _, ok := c.pkg.Metadata().DepsByPkgPath[golang.PackagePath(imp.Path())]; ok { c.packageMembers(imp, stdScore, nil, c.deepState.enqueue) return nil } @@ -1210,7 +1210,7 @@ func (c *completer) selector(ctx context.Context, sel *ast.SelectorExpr) error { if err != nil { return err } - known := make(map[source.PackagePath]*metadata.Package) + known := make(map[golang.PackagePath]*metadata.Package) for _, mp := range all { if mp.Name == "main" { continue // not importable @@ -1373,7 +1373,7 @@ func (c *completer) selector(ctx context.Context, sel *ast.SelectorExpr) error { // Extract the package-level candidates using a quick parse. var g errgroup.Group for _, path := range paths { - mp := known[source.PackagePath(path)] + mp := known[golang.PackagePath(path)] for _, uri := range mp.CompiledGoFiles { uri := uri g.Go(func() error { @@ -1396,7 +1396,7 @@ func (c *completer) selector(ctx context.Context, sel *ast.SelectorExpr) error { mu.Lock() defer mu.Unlock() // TODO(adonovan): what if the actual package has a vendor/ prefix? - if _, ok := known[source.PackagePath(pkgExport.Fix.StmtInfo.ImportPath)]; ok { + if _, ok := known[golang.PackagePath(pkgExport.Fix.StmtInfo.ImportPath)]; ok { return // We got this one above. } @@ -1585,7 +1585,7 @@ func (c *completer) lexical(ctx context.Context) error { } if c.inference.objType != nil { - if named, _ := source.Deref(c.inference.objType).(*types.Named); named != nil { + if named, _ := golang.Deref(c.inference.objType).(*types.Named); named != nil { // If we expected a named type, check the type's package for // completion items. This is useful when the current file hasn't // imported the type's package yet. @@ -1596,7 +1596,7 @@ func (c *completer) lexical(ctx context.Context) error { // Make sure the package name isn't already in use by another // object, and that this file doesn't import the package yet. // TODO(adonovan): what if pkg.Path has vendor/ prefix? - if _, ok := seen[pkg.Name()]; !ok && pkg != c.pkg.GetTypes() && !alreadyImports(c.file, source.ImportPath(pkg.Path())) { + if _, ok := seen[pkg.Name()]; !ok && pkg != c.pkg.GetTypes() && !alreadyImports(c.file, golang.ImportPath(pkg.Path())) { seen[pkg.Name()] = struct{}{} obj := types.NewPkgName(0, nil, pkg.Name(), pkg) imp := &importInfo{ @@ -1651,7 +1651,7 @@ func (c *completer) injectType(ctx context.Context, t types.Type) { return } - t = source.Deref(t) + t = golang.Deref(t) // If we have an expected type and it is _not_ a named type, handle // it specially. Non-named types like "[]int" will never be @@ -1699,7 +1699,7 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru if err != nil { return err } - pkgNameByPath := make(map[source.PackagePath]string) + pkgNameByPath := make(map[golang.PackagePath]string) var paths []string // actually PackagePaths for _, mp := range all { if mp.ForTest != "" { @@ -1737,7 +1737,7 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru }) for _, path := range paths { - name := pkgNameByPath[source.PackagePath(path)] + name := pkgNameByPath[golang.PackagePath(path)] if _, ok := seen[name]; ok { continue } @@ -1802,7 +1802,7 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru } // alreadyImports reports whether f has an import with the specified path. -func alreadyImports(f *ast.File, path source.ImportPath) bool { +func alreadyImports(f *ast.File, path golang.ImportPath) bool { for _, s := range f.Imports { if metadata.UnquoteImportPath(s) == path { return true @@ -1898,7 +1898,7 @@ func enclosingCompositeLiteral(path []ast.Node, pos token.Pos, info *types.Info) clInfo := compLitInfo{ cl: n, - clType: source.Deref(tv.Type).Underlying(), + clType: golang.Deref(tv.Type).Underlying(), } var ( diff --git a/gopls/internal/lsp/source/completion/deep_completion.go b/gopls/internal/golang/completion/deep_completion.go similarity index 100% rename from gopls/internal/lsp/source/completion/deep_completion.go rename to gopls/internal/golang/completion/deep_completion.go diff --git a/gopls/internal/lsp/source/completion/deep_completion_test.go b/gopls/internal/golang/completion/deep_completion_test.go similarity index 100% rename from gopls/internal/lsp/source/completion/deep_completion_test.go rename to gopls/internal/golang/completion/deep_completion_test.go diff --git a/gopls/internal/lsp/source/completion/definition.go b/gopls/internal/golang/completion/definition.go similarity index 95% rename from gopls/internal/lsp/source/completion/definition.go rename to gopls/internal/golang/completion/definition.go index e4c184186aa..be7517247a0 100644 --- a/gopls/internal/lsp/source/completion/definition.go +++ b/gopls/internal/golang/completion/definition.go @@ -11,9 +11,9 @@ import ( "unicode" "unicode/utf8" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" ) // some function definitions in test files can be completed @@ -21,7 +21,7 @@ import ( // BenchmarkFoo(b *testing.B), FuzzFoo(f *testing.F) // path[0] is known to be *ast.Ident -func definition(path []ast.Node, obj types.Object, pgf *source.ParsedGoFile) ([]CompletionItem, *Selection) { +func definition(path []ast.Node, obj types.Object, pgf *golang.ParsedGoFile) ([]CompletionItem, *Selection) { if _, ok := obj.(*types.Func); !ok { return nil, nil // not a function at all } diff --git a/gopls/internal/lsp/source/completion/format.go b/gopls/internal/golang/completion/format.go similarity index 95% rename from gopls/internal/lsp/source/completion/format.go rename to gopls/internal/golang/completion/format.go index 4d3fa23f576..40ac1f23965 100644 --- a/gopls/internal/lsp/source/completion/format.go +++ b/gopls/internal/golang/completion/format.go @@ -13,9 +13,9 @@ import ( "go/types" "strings" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" @@ -62,7 +62,7 @@ func (c *completer) item(ctx context.Context, cand candidate) (CompletionItem, e x := cand.obj.(*types.TypeName) if named, ok := x.Type().(*types.Named); ok { tp := named.TypeParams() - label += source.FormatTypeParams(tp) + label += golang.FormatTypeParams(tp) insert = label // maintain invariant above (label == insert) } } @@ -71,7 +71,7 @@ func (c *completer) item(ctx context.Context, cand candidate) (CompletionItem, e switch obj := obj.(type) { case *types.TypeName: - detail, kind = source.FormatType(obj.Type(), c.qf) + detail, kind = golang.FormatType(obj.Type(), c.qf) case *types.Const: kind = protocol.ConstantCompletion case *types.Var: @@ -79,7 +79,7 @@ func (c *completer) item(ctx context.Context, cand candidate) (CompletionItem, e detail = "struct{...}" // for anonymous structs } else if obj.IsField() { var err error - detail, err = source.FormatVarType(ctx, c.snapshot, c.pkg, obj, c.qf, c.mq) + detail, err = golang.FormatVarType(ctx, c.snapshot, c.pkg, obj, c.qf, c.mq) if err != nil { return CompletionItem{}, err } @@ -131,7 +131,7 @@ Suffixes: switch mod { case invoke: if sig, ok := funcType.Underlying().(*types.Signature); ok { - s, err := source.NewSignature(ctx, c.snapshot, c.pkg, sig, nil, c.qf, c.mq) + s, err := golang.NewSignature(ctx, c.snapshot, c.pkg, sig, nil, c.qf, c.mq) if err != nil { return CompletionItem{}, err } @@ -267,7 +267,7 @@ Suffixes: return item, nil } - comment, err := source.HoverDocForObject(ctx, c.snapshot, c.pkg.FileSet(), obj) + comment, err := golang.HoverDocForObject(ctx, c.snapshot, c.pkg.FileSet(), obj) if err != nil { event.Error(ctx, fmt.Sprintf("failed to find Hover for %q", obj.Name()), err) return item, nil @@ -302,7 +302,7 @@ func (c *completer) importEdits(imp *importInfo) ([]protocol.TextEdit, error) { return nil, err } - return source.ComputeOneImportFixEdits(c.snapshot, pgf, &imports.ImportFix{ + return golang.ComputeOneImportFixEdits(c.snapshot, pgf, &imports.ImportFix{ StmtInfo: imports.ImportInfo{ ImportPath: imp.importPath, Name: imp.name, @@ -324,7 +324,7 @@ func (c *completer) formatBuiltin(ctx context.Context, cand candidate) (Completi item.Kind = protocol.ConstantCompletion case *types.Builtin: item.Kind = protocol.FunctionCompletion - sig, err := source.NewBuiltinSignature(ctx, c.snapshot, obj.Name()) + sig, err := golang.NewBuiltinSignature(ctx, c.snapshot, obj.Name()) if err != nil { return CompletionItem{}, err } diff --git a/gopls/internal/lsp/source/completion/fuzz.go b/gopls/internal/golang/completion/fuzz.go similarity index 100% rename from gopls/internal/lsp/source/completion/fuzz.go rename to gopls/internal/golang/completion/fuzz.go diff --git a/gopls/internal/lsp/source/completion/keywords.go b/gopls/internal/golang/completion/keywords.go similarity index 100% rename from gopls/internal/lsp/source/completion/keywords.go rename to gopls/internal/golang/completion/keywords.go diff --git a/gopls/internal/lsp/source/completion/labels.go b/gopls/internal/golang/completion/labels.go similarity index 100% rename from gopls/internal/lsp/source/completion/labels.go rename to gopls/internal/golang/completion/labels.go diff --git a/gopls/internal/lsp/source/completion/literal.go b/gopls/internal/golang/completion/literal.go similarity index 97% rename from gopls/internal/lsp/source/completion/literal.go rename to gopls/internal/golang/completion/literal.go index b48407b12e1..9fb40fed0c2 100644 --- a/gopls/internal/lsp/source/completion/literal.go +++ b/gopls/internal/golang/completion/literal.go @@ -11,9 +11,9 @@ import ( "strings" "unicode" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" "golang.org/x/tools/internal/event" ) @@ -50,7 +50,7 @@ func (c *completer) literal(ctx context.Context, literalType types.Type, imp *im // don't offer "mySlice{}" since we have already added a candidate // of "[]int{}". if _, named := literalType.(*types.Named); named && expType != nil { - if _, named := source.Deref(expType).(*types.Named); !named { + if _, named := golang.Deref(expType).(*types.Named); !named { return } } @@ -201,9 +201,9 @@ func (c *completer) functionLiteral(ctx context.Context, sig *types.Signature, m // If the param has no name in the signature, guess a name based // on the type. Use an empty qualifier to ignore the package. // For example, we want to name "http.Request" "r", not "hr". - typeName, err := source.FormatVarType(ctx, c.snapshot, c.pkg, p, + typeName, err := golang.FormatVarType(ctx, c.snapshot, c.pkg, p, func(p *types.Package) string { return "" }, - func(source.PackageName, source.ImportPath, source.PackagePath) string { return "" }) + func(golang.PackageName, golang.ImportPath, golang.PackagePath) string { return "" }) if err != nil { // In general, the only error we should encounter while formatting is // context cancellation. @@ -271,7 +271,7 @@ func (c *completer) functionLiteral(ctx context.Context, sig *types.Signature, m // of "i int, j int". if i == sig.Params().Len()-1 || !types.Identical(p.Type(), sig.Params().At(i+1).Type()) { snip.WriteText(" ") - typeStr, err := source.FormatVarType(ctx, c.snapshot, c.pkg, p, c.qf, c.mq) + typeStr, err := golang.FormatVarType(ctx, c.snapshot, c.pkg, p, c.qf, c.mq) if err != nil { // In general, the only error we should encounter while formatting is // context cancellation. @@ -329,7 +329,7 @@ func (c *completer) functionLiteral(ctx context.Context, sig *types.Signature, m snip.WriteText(name + " ") } - text, err := source.FormatVarType(ctx, c.snapshot, c.pkg, r, c.qf, c.mq) + text, err := golang.FormatVarType(ctx, c.snapshot, c.pkg, r, c.qf, c.mq) if err != nil { // In general, the only error we should encounter while formatting is // context cancellation. diff --git a/gopls/internal/lsp/source/completion/package.go b/gopls/internal/golang/completion/package.go similarity index 96% rename from gopls/internal/lsp/source/completion/package.go rename to gopls/internal/golang/completion/package.go index 084191f90a4..187325a66df 100644 --- a/gopls/internal/lsp/source/completion/package.go +++ b/gopls/internal/golang/completion/package.go @@ -19,9 +19,9 @@ import ( "unicode" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/fuzzy" ) @@ -32,7 +32,7 @@ func packageClauseCompletions(ctx context.Context, snapshot *cache.Snapshot, fh // We know that the AST for this file will be empty due to the missing // package declaration, but parse it anyway to get a mapper. // TODO(adonovan): opt: there's no need to parse just to get a mapper. - pgf, err := snapshot.ParseGo(ctx, fh, source.ParseFull) + pgf, err := snapshot.ParseGo(ctx, fh, golang.ParseFull) if err != nil { return nil, nil, err } @@ -68,7 +68,7 @@ func packageClauseCompletions(ctx context.Context, snapshot *cache.Snapshot, fh // packageCompletionSurrounding returns surrounding for package completion if a // package completions can be suggested at a given cursor offset. A valid location // for package completion is above any declarations or import statements. -func packageCompletionSurrounding(pgf *source.ParsedGoFile, offset int) (*Selection, error) { +func packageCompletionSurrounding(pgf *golang.ParsedGoFile, offset int) (*Selection, error) { m := pgf.Mapper // If the file lacks a package declaration, the parser will return an empty // AST. As a work-around, try to parse an expression from the file contents. @@ -230,7 +230,7 @@ func packageSuggestions(ctx context.Context, snapshot *cache.Snapshot, fileURI p } pkgName := convertDirNameToPkgName(dirName) - seenPkgs := make(map[source.PackageName]struct{}) + seenPkgs := make(map[golang.PackageName]struct{}) // The `go` command by default only allows one package per directory but we // support multiple package suggestions since gopls is build system agnostic. @@ -320,7 +320,7 @@ func isValidDirName(dirName string) bool { // convertDirNameToPkgName converts a valid directory name to a valid package name. // It leaves only letters and digits. All letters are mapped to lower case. -func convertDirNameToPkgName(dirName string) source.PackageName { +func convertDirNameToPkgName(dirName string) golang.PackageName { var buf bytes.Buffer for _, ch := range dirName { switch { @@ -331,7 +331,7 @@ func convertDirNameToPkgName(dirName string) source.PackageName { buf.WriteRune(ch) } } - return source.PackageName(buf.String()) + return golang.PackageName(buf.String()) } // isLetter and isDigit allow only ASCII characters because diff --git a/gopls/internal/lsp/source/completion/package_test.go b/gopls/internal/golang/completion/package_test.go similarity index 96% rename from gopls/internal/lsp/source/completion/package_test.go rename to gopls/internal/golang/completion/package_test.go index 614359fa5dc..dc4058fa651 100644 --- a/gopls/internal/lsp/source/completion/package_test.go +++ b/gopls/internal/golang/completion/package_test.go @@ -7,7 +7,7 @@ package completion import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/source" + "golang.org/x/tools/gopls/internal/golang" ) func TestIsValidDirName(t *testing.T) { @@ -55,7 +55,7 @@ func TestIsValidDirName(t *testing.T) { func TestConvertDirNameToPkgName(t *testing.T) { tests := []struct { dirName string - pkgName source.PackageName + pkgName golang.PackageName }{ {dirName: "a", pkgName: "a"}, {dirName: "abcdef", pkgName: "abcdef"}, diff --git a/gopls/internal/lsp/source/completion/postfix_snippets.go b/gopls/internal/golang/completion/postfix_snippets.go similarity index 98% rename from gopls/internal/lsp/source/completion/postfix_snippets.go rename to gopls/internal/golang/completion/postfix_snippets.go index 0490b386161..c9cfc56a52c 100644 --- a/gopls/internal/lsp/source/completion/postfix_snippets.go +++ b/gopls/internal/golang/completion/postfix_snippets.go @@ -16,10 +16,10 @@ import ( "sync" "text/template" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" @@ -465,7 +465,7 @@ func (a *postfixTmplArgs) VarName(t types.Type, nonNamedDefault string) string { // go/types predicates are undefined on types.Typ[types.Invalid]. if !types.Identical(t, types.Typ[types.Invalid]) && types.Implements(t, errorIntf) { name = "err" - } else if _, isNamed := source.Deref(t).(*types.Named); !isNamed { + } else if _, isNamed := golang.Deref(t).(*types.Named); !isNamed { name = nonNamedDefault } @@ -582,7 +582,7 @@ func (c *completer) addPostfixSnippetCandidates(ctx context.Context, sel *ast.Se } tmplArgs := postfixTmplArgs{ - X: source.FormatNode(c.pkg.FileSet(), sel.X), + X: golang.FormatNode(c.pkg.FileSet(), sel.X), StmtOK: stmtOK, Obj: exprObj(c.pkg.GetTypesInfo(), sel.X), Type: selType, diff --git a/gopls/internal/lsp/source/completion/printf.go b/gopls/internal/golang/completion/printf.go similarity index 100% rename from gopls/internal/lsp/source/completion/printf.go rename to gopls/internal/golang/completion/printf.go diff --git a/gopls/internal/lsp/source/completion/printf_test.go b/gopls/internal/golang/completion/printf_test.go similarity index 100% rename from gopls/internal/lsp/source/completion/printf_test.go rename to gopls/internal/golang/completion/printf_test.go diff --git a/gopls/internal/lsp/source/completion/snippet.go b/gopls/internal/golang/completion/snippet.go similarity index 98% rename from gopls/internal/lsp/source/completion/snippet.go rename to gopls/internal/golang/completion/snippet.go index a6786cfa874..8df81f87672 100644 --- a/gopls/internal/lsp/source/completion/snippet.go +++ b/gopls/internal/golang/completion/snippet.go @@ -7,7 +7,7 @@ package completion import ( "go/ast" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/lsp/source/completion/snippet/snippet_builder.go b/gopls/internal/golang/completion/snippet/snippet_builder.go similarity index 100% rename from gopls/internal/lsp/source/completion/snippet/snippet_builder.go rename to gopls/internal/golang/completion/snippet/snippet_builder.go diff --git a/gopls/internal/lsp/source/completion/snippet/snippet_builder_test.go b/gopls/internal/golang/completion/snippet/snippet_builder_test.go similarity index 100% rename from gopls/internal/lsp/source/completion/snippet/snippet_builder_test.go rename to gopls/internal/golang/completion/snippet/snippet_builder_test.go diff --git a/gopls/internal/lsp/source/completion/statements.go b/gopls/internal/golang/completion/statements.go similarity index 97% rename from gopls/internal/lsp/source/completion/statements.go rename to gopls/internal/golang/completion/statements.go index 029766d2cb8..145a93a5a49 100644 --- a/gopls/internal/lsp/source/completion/statements.go +++ b/gopls/internal/golang/completion/statements.go @@ -11,10 +11,10 @@ import ( "go/types" "strings" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion/snippet" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion/snippet" ) // addStatementCandidates adds full statement completion candidates @@ -81,7 +81,7 @@ func (c *completer) addAssignAppend() { } // The name or our slice is whatever's in the LHS expression. - sliceText = source.FormatNode(fset, n.Lhs[exprIdx]) + sliceText = golang.FormatNode(fset, n.Lhs[exprIdx]) case *ast.SelectorExpr: // Make sure we are a selector at the beginning of a statement. if _, parentIsExprtStmt := c.path[2].(*ast.ExprStmt); !parentIsExprtStmt { @@ -91,7 +91,7 @@ func (c *completer) addAssignAppend() { // So far we only know the first part of our slice name. For // example in "s.a<>" we only know our slice begins with "s." // since the user could still be typing. - sliceText = source.FormatNode(fset, n.X) + "." + sliceText = golang.FormatNode(fset, n.X) + "." needsLHS = true case *ast.ExprStmt: needsLHS = true @@ -212,7 +212,7 @@ func (c *completer) addErrCheck() { var ( // errVar is e.g. "err" in "foo, err := bar()". - errVar = source.FormatNode(c.pkg.FileSet(), lastAssignee) + errVar = golang.FormatNode(c.pkg.FileSet(), lastAssignee) // Whether we need to include the "if" keyword in our candidate. needsIf = true diff --git a/gopls/internal/lsp/source/completion/util.go b/gopls/internal/golang/completion/util.go similarity index 98% rename from gopls/internal/lsp/source/completion/util.go rename to gopls/internal/golang/completion/util.go index 82c56e05775..e20168e4345 100644 --- a/gopls/internal/lsp/source/completion/util.go +++ b/gopls/internal/golang/completion/util.go @@ -10,8 +10,8 @@ import ( "go/types" "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" ) @@ -38,7 +38,7 @@ func eachField(T types.Type, fn func(*types.Var)) { var visit func(T types.Type) visit = func(T types.Type) { - if T, ok := source.Deref(T).Underlying().(*types.Struct); ok { + if T, ok := golang.Deref(T).Underlying().(*types.Struct); ok { if seen.At(T) != nil { return } @@ -120,7 +120,7 @@ func resolveInvalid(fset *token.FileSet, obj types.Object, node ast.Node, info * } }) // Construct a fake type for the object and return a fake object with this type. - typename := source.FormatNode(fset, resultExpr) + typename := golang.FormatNode(fset, resultExpr) typ := types.NewNamed(types.NewTypeName(token.NoPos, obj.Pkg(), typename, nil), types.Typ[types.Invalid], nil) return types.NewVar(obj.Pos(), obj.Pkg(), obj.Name(), typ) } diff --git a/gopls/internal/lsp/source/completion/util_test.go b/gopls/internal/golang/completion/util_test.go similarity index 100% rename from gopls/internal/lsp/source/completion/util_test.go rename to gopls/internal/golang/completion/util_test.go diff --git a/gopls/internal/lsp/source/definition.go b/gopls/internal/golang/definition.go similarity index 98% rename from gopls/internal/lsp/source/definition.go rename to gopls/internal/golang/definition.go index 30177cfb3c2..b4b6972bb22 100644 --- a/gopls/internal/lsp/source/definition.go +++ b/gopls/internal/golang/definition.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -24,7 +24,7 @@ import ( // Definition handles the textDocument/definition request for Go files. func Definition(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, position protocol.Position) ([]protocol.Location, error) { - ctx, done := event.Start(ctx, "source.Definition") + ctx, done := event.Start(ctx, "golang.Definition") defer done() pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) @@ -198,7 +198,7 @@ func builtinDecl(ctx context.Context, snapshot *cache.Snapshot, obj types.Object // than the var (field) object. // // TODO(rfindley): this function exists to preserve the pre-existing behavior -// of source.Identifier. Eliminate this helper in favor of sharing +// of golang.Identifier. Eliminate this helper in favor of sharing // functionality with objectsAt, after choosing suitable primitives. func referencedObject(pkg *cache.Package, pgf *ParsedGoFile, pos token.Pos) (*ast.Ident, types.Object, types.Type) { path := pathEnclosingObjNode(pgf.File, pos) diff --git a/gopls/internal/lsp/source/diagnostics.go b/gopls/internal/golang/diagnostics.go similarity index 99% rename from gopls/internal/lsp/source/diagnostics.go rename to gopls/internal/golang/diagnostics.go index c1122e1eac0..783f9d90042 100644 --- a/gopls/internal/lsp/source/diagnostics.go +++ b/gopls/internal/golang/diagnostics.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/embeddirective.go b/gopls/internal/golang/embeddirective.go similarity index 99% rename from gopls/internal/lsp/source/embeddirective.go rename to gopls/internal/golang/embeddirective.go index e656378198d..ef84a006b70 100644 --- a/gopls/internal/lsp/source/embeddirective.go +++ b/gopls/internal/golang/embeddirective.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "errors" diff --git a/gopls/internal/lsp/source/extract.go b/gopls/internal/golang/extract.go similarity index 99% rename from gopls/internal/lsp/source/extract.go rename to gopls/internal/golang/extract.go index 0cc1950cad3..c07faec1b7a 100644 --- a/gopls/internal/lsp/source/extract.go +++ b/gopls/internal/golang/extract.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/fix.go b/gopls/internal/golang/fix.go similarity index 99% rename from gopls/internal/lsp/source/fix.go rename to gopls/internal/golang/fix.go index eaee0dca36d..8c414f1d2cf 100644 --- a/gopls/internal/lsp/source/fix.go +++ b/gopls/internal/golang/fix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -191,7 +191,7 @@ func suggestedFixToEdits(ctx context.Context, snapshot *cache.Snapshot, fset *to // addEmbedImport adds a missing embed "embed" import with blank name. func addEmbedImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Package, pgf *parsego.File, _, _ token.Pos) (*token.FileSet, *analysis.SuggestedFix, error) { - // Like source.AddImport, but with _ as Name and using our pgf. + // Like goalng.AddImport, but with _ as Name and using our pgf. protoEdits, err := ComputeOneImportFixEdits(snapshot, pgf, &imports.ImportFix{ StmtInfo: imports.ImportInfo{ ImportPath: "embed", diff --git a/gopls/internal/lsp/source/folding_range.go b/gopls/internal/golang/folding_range.go similarity index 99% rename from gopls/internal/lsp/source/folding_range.go rename to gopls/internal/golang/folding_range.go index 130f2fbbb39..7c27cb558c8 100644 --- a/gopls/internal/lsp/source/folding_range.go +++ b/gopls/internal/golang/folding_range.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/format.go b/gopls/internal/golang/format.go similarity index 96% rename from gopls/internal/lsp/source/format.go rename to gopls/internal/golang/format.go index 79eaf21d288..ae0261965f6 100644 --- a/gopls/internal/lsp/source/format.go +++ b/gopls/internal/golang/format.go @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package source provides core features for use by Go editors and tools. -package source +// Package golang defines the LSP features for navigation, analysis, +// and refactoring of Go source code. +package golang import ( "bytes" @@ -28,7 +29,7 @@ import ( // Format formats a file with a given range. func Format(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]protocol.TextEdit, error) { - ctx, done := event.Start(ctx, "source.Format") + ctx, done := event.Start(ctx, "golang.Format") defer done() // Generated files shouldn't be edited. So, don't format them @@ -91,7 +92,7 @@ func Format(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]pr } func formatSource(ctx context.Context, fh file.Handle) ([]byte, error) { - _, done := event.Start(ctx, "source.formatSource") + _, done := event.Start(ctx, "golang.formatSource") defer done() data, err := fh.Content() @@ -111,7 +112,7 @@ type importFix struct { // it returns a list of fixes that could be applied to the file, with the // corresponding TextEdits that would be needed to apply that fix. func allImportsFixes(ctx context.Context, snapshot *cache.Snapshot, pgf *ParsedGoFile) (allFixEdits []protocol.TextEdit, editsPerFix []*importFix, err error) { - ctx, done := event.Start(ctx, "source.AllImportsFixes") + ctx, done := event.Start(ctx, "golang.AllImportsFixes") defer done() if err := snapshot.RunProcessEnvFunc(ctx, func(ctx context.Context, opts *imports.Options) error { @@ -303,7 +304,7 @@ func scanForCommentEnd(src []byte) int { } func computeTextEdits(ctx context.Context, pgf *ParsedGoFile, formatted string) ([]protocol.TextEdit, error) { - _, done := event.Start(ctx, "source.computeTextEdits") + _, done := event.Start(ctx, "golang.computeTextEdits") defer done() edits := diff.Strings(string(pgf.Src), formatted) diff --git a/gopls/internal/lsp/source/format_test.go b/gopls/internal/golang/format_test.go similarity index 99% rename from gopls/internal/lsp/source/format_test.go rename to gopls/internal/golang/format_test.go index daa5b8f5dc7..4dbb4db71c0 100644 --- a/gopls/internal/lsp/source/format_test.go +++ b/gopls/internal/golang/format_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "strings" diff --git a/gopls/internal/lsp/source/gc_annotations.go b/gopls/internal/golang/gc_annotations.go similarity index 99% rename from gopls/internal/lsp/source/gc_annotations.go rename to gopls/internal/golang/gc_annotations.go index b6230ced8cc..fc26b4fed46 100644 --- a/gopls/internal/lsp/source/gc_annotations.go +++ b/gopls/internal/golang/gc_annotations.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/highlight.go b/gopls/internal/golang/highlight.go similarity index 99% rename from gopls/internal/lsp/source/highlight.go rename to gopls/internal/golang/highlight.go index 7e15daecb17..c960a3feddd 100644 --- a/gopls/internal/lsp/source/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -20,7 +20,7 @@ import ( ) func Highlight(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, position protocol.Position) ([]protocol.Range, error) { - ctx, done := event.Start(ctx, "source.Highlight") + ctx, done := event.Start(ctx, "golang.Highlight") defer done() // We always want fully parsed files for highlight, regardless diff --git a/gopls/internal/lsp/source/hover.go b/gopls/internal/golang/hover.go similarity index 99% rename from gopls/internal/lsp/source/hover.go rename to gopls/internal/golang/hover.go index bcd963f7624..99f2f8b893e 100644 --- a/gopls/internal/lsp/source/hover.go +++ b/gopls/internal/golang/hover.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" @@ -68,7 +68,7 @@ type HoverJSON struct { // Hover implements the "textDocument/hover" RPC for Go files. func Hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, position protocol.Position) (*protocol.Hover, error) { - ctx, done := event.Start(ctx, "source.Hover") + ctx, done := event.Start(ctx, "golang.Hover") defer done() rng, h, err := hover(ctx, snapshot, fh, position) diff --git a/gopls/internal/lsp/source/identifier.go b/gopls/internal/golang/identifier.go similarity index 99% rename from gopls/internal/lsp/source/identifier.go rename to gopls/internal/golang/identifier.go index 9e12e3fd222..28f89757057 100644 --- a/gopls/internal/lsp/source/identifier.go +++ b/gopls/internal/golang/identifier.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "errors" diff --git a/gopls/internal/lsp/source/identifier_test.go b/gopls/internal/golang/identifier_test.go similarity index 99% rename from gopls/internal/lsp/source/identifier_test.go rename to gopls/internal/golang/identifier_test.go index 9f5eb7df3db..b1e6d5a75a2 100644 --- a/gopls/internal/lsp/source/identifier_test.go +++ b/gopls/internal/golang/identifier_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/implementation.go b/gopls/internal/golang/implementation.go similarity index 99% rename from gopls/internal/lsp/source/implementation.go rename to gopls/internal/golang/implementation.go index 9d644d15db2..80d9f1551c9 100644 --- a/gopls/internal/lsp/source/implementation.go +++ b/gopls/internal/golang/implementation.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -49,7 +49,7 @@ import ( // If the position denotes a method, the computation is applied to its // receiver type and then its corresponding methods are returned. func Implementation(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position) ([]protocol.Location, error) { - ctx, done := event.Start(ctx, "source.Implementation") + ctx, done := event.Start(ctx, "golang.Implementation") defer done() locs, err := implementations(ctx, snapshot, f, pp) diff --git a/gopls/internal/lsp/source/inlay_hint.go b/gopls/internal/golang/inlay_hint.go similarity index 99% rename from gopls/internal/lsp/source/inlay_hint.go rename to gopls/internal/golang/inlay_hint.go index 99888d4fcf4..cf8fa7ae8cf 100644 --- a/gopls/internal/lsp/source/inlay_hint.go +++ b/gopls/internal/golang/inlay_hint.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -81,7 +81,7 @@ var AllInlayHints = map[string]*Hint{ } func InlayHint(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pRng protocol.Range) ([]protocol.InlayHint, error) { - ctx, done := event.Start(ctx, "source.InlayHint") + ctx, done := event.Start(ctx, "golang.InlayHint") defer done() pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) diff --git a/gopls/internal/lsp/source/inline.go b/gopls/internal/golang/inline.go similarity index 99% rename from gopls/internal/lsp/source/inline.go rename to gopls/internal/golang/inline.go index 1519ef85d80..fd6fe34ae50 100644 --- a/gopls/internal/lsp/source/inline.go +++ b/gopls/internal/golang/inline.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang // This file defines the refactor.inline code action. diff --git a/gopls/internal/lsp/source/inline_all.go b/gopls/internal/golang/inline_all.go similarity index 99% rename from gopls/internal/lsp/source/inline_all.go rename to gopls/internal/golang/inline_all.go index 13f61ea808a..4e072c05e76 100644 --- a/gopls/internal/lsp/source/inline_all.go +++ b/gopls/internal/golang/inline_all.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/invertifcondition.go b/gopls/internal/golang/invertifcondition.go similarity index 99% rename from gopls/internal/lsp/source/invertifcondition.go rename to gopls/internal/golang/invertifcondition.go index a240ac161f0..377e1ce6186 100644 --- a/gopls/internal/lsp/source/invertifcondition.go +++ b/gopls/internal/golang/invertifcondition.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "fmt" diff --git a/gopls/internal/lsp/source/known_packages.go b/gopls/internal/golang/known_packages.go similarity index 99% rename from gopls/internal/lsp/source/known_packages.go rename to gopls/internal/golang/known_packages.go index d6a442e7211..ae54e0bd97a 100644 --- a/gopls/internal/lsp/source/known_packages.go +++ b/gopls/internal/golang/known_packages.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/linkname.go b/gopls/internal/golang/linkname.go similarity index 99% rename from gopls/internal/lsp/source/linkname.go rename to gopls/internal/golang/linkname.go index bcefa1092d6..759b5ae1496 100644 --- a/gopls/internal/lsp/source/linkname.go +++ b/gopls/internal/golang/linkname.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/origin.go b/gopls/internal/golang/origin.go similarity index 98% rename from gopls/internal/lsp/source/origin.go rename to gopls/internal/golang/origin.go index 8ee467e844e..c5e84db0ceb 100644 --- a/gopls/internal/lsp/source/origin.go +++ b/gopls/internal/golang/origin.go @@ -5,7 +5,7 @@ //go:build !go1.19 // +build !go1.19 -package source +package golang import "go/types" diff --git a/gopls/internal/lsp/source/origin_119.go b/gopls/internal/golang/origin_119.go similarity index 98% rename from gopls/internal/lsp/source/origin_119.go rename to gopls/internal/golang/origin_119.go index a249ce4b1c5..16f6ca7c065 100644 --- a/gopls/internal/lsp/source/origin_119.go +++ b/gopls/internal/golang/origin_119.go @@ -5,7 +5,7 @@ //go:build go1.19 // +build go1.19 -package source +package golang import "go/types" diff --git a/gopls/internal/lsp/source/references.go b/gopls/internal/golang/references.go similarity index 99% rename from gopls/internal/lsp/source/references.go rename to gopls/internal/golang/references.go index f93783ecb6b..c9263a9bc34 100644 --- a/gopls/internal/lsp/source/references.go +++ b/gopls/internal/golang/references.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang // This file defines the 'references' query based on a serializable // index constructed during type checking, thus avoiding the need to @@ -62,7 +62,7 @@ type reference struct { // definitions before uses) to the object denoted by the identifier at // the given file/position, searching the entire workspace. func references(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position, includeDeclaration bool) ([]reference, error) { - ctx, done := event.Start(ctx, "source.references") + ctx, done := event.Start(ctx, "golang.references") defer done() // Is the cursor within the package name declaration? diff --git a/gopls/internal/lsp/source/rename.go b/gopls/internal/golang/rename.go similarity index 99% rename from gopls/internal/lsp/source/rename.go rename to gopls/internal/golang/rename.go index dacbfb60829..8e0f6aeed9a 100644 --- a/gopls/internal/lsp/source/rename.go +++ b/gopls/internal/golang/rename.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang // TODO(adonovan): // @@ -98,7 +98,7 @@ type PrepareItem struct { // the prepare fails. Probably we could eliminate the redundancy in returning // two errors, but for now this is done defensively. func PrepareRename(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position) (_ *PrepareItem, usererr, err error) { - ctx, done := event.Start(ctx, "source.PrepareRename") + ctx, done := event.Start(ctx, "golang.PrepareRename") defer done() // Is the cursor within the package name declaration? @@ -216,7 +216,7 @@ func checkRenamable(obj types.Object) error { // given identifier within a package and a boolean value of true for renaming // package and false otherwise. func Rename(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position, newName string) (map[protocol.DocumentURI][]protocol.TextEdit, bool, error) { - ctx, done := event.Start(ctx, "source.Rename") + ctx, done := event.Start(ctx, "golang.Rename") defer done() if !isValidIdentifier(newName) { diff --git a/gopls/internal/lsp/source/rename_check.go b/gopls/internal/golang/rename_check.go similarity index 99% rename from gopls/internal/lsp/source/rename_check.go rename to gopls/internal/golang/rename_check.go index bc6b7cfcf06..67bc2c1d452 100644 --- a/gopls/internal/lsp/source/rename_check.go +++ b/gopls/internal/golang/rename_check.go @@ -4,7 +4,7 @@ // // Taken from golang.org/x/tools/refactor/rename. -package source +package golang // This file defines the conflict-checking portion of the rename operation. // diff --git a/gopls/internal/lsp/source/signature_help.go b/gopls/internal/golang/signature_help.go similarity index 98% rename from gopls/internal/lsp/source/signature_help.go rename to gopls/internal/golang/signature_help.go index 1d1fd58d82a..e53bab9640f 100644 --- a/gopls/internal/lsp/source/signature_help.go +++ b/gopls/internal/golang/signature_help.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -23,7 +23,7 @@ import ( ) func SignatureHelp(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, position protocol.Position) (*protocol.SignatureInformation, int, error) { - ctx, done := event.Start(ctx, "source.SignatureHelp") + ctx, done := event.Start(ctx, "golang.SignatureHelp") defer done() // We need full type-checking here, as we must type-check function bodies in diff --git a/gopls/internal/lsp/source/snapshot.go b/gopls/internal/golang/snapshot.go similarity index 88% rename from gopls/internal/lsp/source/snapshot.go rename to gopls/internal/golang/snapshot.go index 72e7d59d9a9..2b1e4739866 100644 --- a/gopls/internal/lsp/source/snapshot.go +++ b/gopls/internal/golang/snapshot.go @@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" "fmt" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" @@ -89,16 +88,6 @@ func selectPackageForFile(ctx context.Context, snapshot *cache.Snapshot, uri pro return pkg, pgf, err } -// A FileSource maps URIs to FileHandles. -type FileSource interface { - // ReadFile returns the FileHandle for a given URI, either by - // reading the content of the file or by obtaining it from a cache. - // - // Invariant: ReadFile must only return an error in the case of context - // cancellation. If ctx.Err() is nil, the resulting error must also be nil. - ReadFile(ctx context.Context, uri protocol.DocumentURI) (file.Handle, error) -} - type ParsedGoFile = parsego.File const ( diff --git a/gopls/internal/lsp/source/stub.go b/gopls/internal/golang/stub.go similarity index 99% rename from gopls/internal/lsp/source/stub.go rename to gopls/internal/golang/stub.go index 3ab7e56e14c..2565104095c 100644 --- a/gopls/internal/lsp/source/stub.go +++ b/gopls/internal/golang/stub.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" @@ -151,7 +151,7 @@ func stubMethodsFixer(ctx context.Context, snapshot *cache.Snapshot, pkg *cache. // Create a package name qualifier that uses the // locally appropriate imported package name. // It records any needed new imports. - // TODO(adonovan): factor with source.FormatVarType? + // TODO(adonovan): factor with golang.FormatVarType? // // Prior to CL 469155 this logic preserved any renaming // imports from the file that declares the interface diff --git a/gopls/internal/lsp/source/symbols.go b/gopls/internal/golang/symbols.go similarity index 98% rename from gopls/internal/lsp/source/symbols.go rename to gopls/internal/golang/symbols.go index 676811881bc..dab6fad958a 100644 --- a/gopls/internal/lsp/source/symbols.go +++ b/gopls/internal/golang/symbols.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -18,7 +18,7 @@ import ( ) func DocumentSymbols(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]protocol.DocumentSymbol, error) { - ctx, done := event.Start(ctx, "source.DocumentSymbols") + ctx, done := event.Start(ctx, "golang.DocumentSymbols") defer done() pgf, err := snapshot.ParseGo(ctx, fh, ParseFull) diff --git a/gopls/internal/lsp/source/type_definition.go b/gopls/internal/golang/type_definition.go similarity index 95% rename from gopls/internal/lsp/source/type_definition.go rename to gopls/internal/golang/type_definition.go index c530344ca7f..a533ac7766a 100644 --- a/gopls/internal/lsp/source/type_definition.go +++ b/gopls/internal/golang/type_definition.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -18,7 +18,7 @@ import ( // TypeDefinition handles the textDocument/typeDefinition request for Go files. func TypeDefinition(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, position protocol.Position) ([]protocol.Location, error) { - ctx, done := event.Start(ctx, "source.TypeDefinition") + ctx, done := event.Start(ctx, "golang.TypeDefinition") defer done() pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) diff --git a/gopls/internal/lsp/source/types_format.go b/gopls/internal/golang/types_format.go similarity index 99% rename from gopls/internal/lsp/source/types_format.go rename to gopls/internal/golang/types_format.go index b6306b98b8b..171aedaceb1 100644 --- a/gopls/internal/lsp/source/types_format.go +++ b/gopls/internal/golang/types_format.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "bytes" diff --git a/gopls/internal/lsp/source/util.go b/gopls/internal/golang/util.go similarity index 99% rename from gopls/internal/lsp/source/util.go rename to gopls/internal/golang/util.go index bd479b14621..6d1b3f6e1ac 100644 --- a/gopls/internal/lsp/source/util.go +++ b/gopls/internal/golang/util.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" diff --git a/gopls/internal/lsp/source/workspace_symbol.go b/gopls/internal/golang/workspace_symbol.go similarity index 99% rename from gopls/internal/lsp/source/workspace_symbol.go rename to gopls/internal/golang/workspace_symbol.go index ccd65122922..3deb640ddce 100644 --- a/gopls/internal/lsp/source/workspace_symbol.go +++ b/gopls/internal/golang/workspace_symbol.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "context" @@ -43,7 +43,7 @@ const maxSymbols = 100 // Session level configuration will define the SymbolMatcher to be used for the // WorkspaceSymbols method. func WorkspaceSymbols(ctx context.Context, matcher settings.SymbolMatcher, style settings.SymbolStyle, snapshots []*cache.Snapshot, query string) ([]protocol.SymbolInformation, error) { - ctx, done := event.Start(ctx, "source.WorkspaceSymbols") + ctx, done := event.Start(ctx, "golang.WorkspaceSymbols") defer done() if query == "" { return nil, nil diff --git a/gopls/internal/lsp/source/workspace_symbol_test.go b/gopls/internal/golang/workspace_symbol_test.go similarity index 99% rename from gopls/internal/lsp/source/workspace_symbol_test.go rename to gopls/internal/golang/workspace_symbol_test.go index b102a2324ef..2a8bf5c3a60 100644 --- a/gopls/internal/lsp/source/workspace_symbol_test.go +++ b/gopls/internal/golang/workspace_symbol_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package source +package golang import ( "testing" diff --git a/gopls/internal/hooks/gofumpt_117.go b/gopls/internal/hooks/gofumpt_117.go index 71886357704..59c71d05144 100644 --- a/gopls/internal/hooks/gofumpt_117.go +++ b/gopls/internal/hooks/gofumpt_117.go @@ -7,7 +7,5 @@ package hooks -import "golang.org/x/tools/gopls/internal/lsp/source" - -func updateGofumpt(options *source.Options) { +func updateGofumpt(options *golang.Options) { } diff --git a/gopls/internal/lsp/cache/analysis.go b/gopls/internal/lsp/cache/analysis.go index 90b0eb88dd3..49b15dda25a 100644 --- a/gopls/internal/lsp/cache/analysis.go +++ b/gopls/internal/lsp/cache/analysis.go @@ -1437,7 +1437,7 @@ func requiredAnalyzers(analyzers []*analysis.Analyzer) []*analysis.Analyzer { var analyzeSummaryCodec = frob.CodecFor[*analyzeSummary]() -// -- data types for serialization of analysis.Diagnostic and source.Diagnostic -- +// -- data types for serialization of analysis.Diagnostic and golang.Diagnostic -- // (The name says gob but we use frob.) var diagnosticsCodec = frob.CodecFor[[]gobDiagnostic]() diff --git a/gopls/internal/lsp/cache/cache.go b/gopls/internal/lsp/cache/cache.go index c4dff669031..d1d83f99e4f 100644 --- a/gopls/internal/lsp/cache/cache.go +++ b/gopls/internal/lsp/cache/cache.go @@ -43,7 +43,7 @@ type Cache struct { store *memoize.Store - *memoizedFS // implements source.FileSource + *memoizedFS // implements file.Source } var cacheIndex, sessionIndex, viewIndex int64 diff --git a/gopls/internal/lsp/cache/errors.go b/gopls/internal/lsp/cache/errors.go index 62da954e008..65530ec655d 100644 --- a/gopls/internal/lsp/cache/errors.go +++ b/gopls/internal/lsp/cache/errors.go @@ -6,7 +6,7 @@ package cache // This file defines routines to convert diagnostics from go list, go // get, go/packages, parsing, type checking, and analysis into -// source.Diagnostic form, and suggesting quick fixes. +// golang.Diagnostic form, and suggesting quick fixes. import ( "context" diff --git a/gopls/internal/lsp/cache/fs_memoized.go b/gopls/internal/lsp/cache/fs_memoized.go index 1b7f46f2b9e..d26ec68bafe 100644 --- a/gopls/internal/lsp/cache/fs_memoized.go +++ b/gopls/internal/lsp/cache/fs_memoized.go @@ -32,7 +32,7 @@ func newMemoizedFS() *memoizedFS { } // A diskFile is a file in the filesystem, or a failure to read one. -// It implements the source.FileHandle interface. +// It implements the file.Source interface. type diskFile struct { uri protocol.DocumentURI modTime time.Time diff --git a/gopls/internal/lsp/command/interface.go b/gopls/internal/lsp/command/interface.go index 6bcd0d034b7..281d0edfb99 100644 --- a/gopls/internal/lsp/command/interface.go +++ b/gopls/internal/lsp/command/interface.go @@ -258,7 +258,7 @@ type ApplyFixArgs struct { // the analysis.Diagnostic with a SuggestedFix containing no edits. // // For fixes suggested by code actions, this is a string agreed - // upon by the code action and source.ApplyFix. + // upon by the code action and golang.ApplyFix. Fix string // The file URI for the document to fix. diff --git a/gopls/internal/mod/code_lens.go b/gopls/internal/mod/code_lens.go index 6feb93e4f18..23817955d69 100644 --- a/gopls/internal/mod/code_lens.go +++ b/gopls/internal/mod/code_lens.go @@ -12,15 +12,15 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" ) // LensFuncs returns the supported lensFuncs for go.mod files. -func LensFuncs() map[command.Command]source.LensFunc { - return map[command.Command]source.LensFunc{ +func LensFuncs() map[command.Command]golang.LensFunc { + return map[command.Command]golang.LensFunc{ command.UpgradeDependency: upgradeLenses, command.Tidy: tidyLens, command.Vendor: vendorLens, diff --git a/gopls/internal/server/call_hierarchy.go b/gopls/internal/server/call_hierarchy.go index 8dd1f3e3ce7..8cffa4754a2 100644 --- a/gopls/internal/server/call_hierarchy.go +++ b/gopls/internal/server/call_hierarchy.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/internal/event" ) @@ -25,7 +25,7 @@ func (s *server) PrepareCallHierarchy(ctx context.Context, params *protocol.Call if snapshot.FileKind(fh) != file.Go { return nil, nil // empty result } - return source.PrepareCallHierarchy(ctx, snapshot, fh, params.Position) + return golang.PrepareCallHierarchy(ctx, snapshot, fh, params.Position) } func (s *server) IncomingCalls(ctx context.Context, params *protocol.CallHierarchyIncomingCallsParams) ([]protocol.CallHierarchyIncomingCall, error) { @@ -40,7 +40,7 @@ func (s *server) IncomingCalls(ctx context.Context, params *protocol.CallHierarc if snapshot.FileKind(fh) != file.Go { return nil, nil // empty result } - return source.IncomingCalls(ctx, snapshot, fh, params.Item.Range.Start) + return golang.IncomingCalls(ctx, snapshot, fh, params.Item.Range.Start) } func (s *server) OutgoingCalls(ctx context.Context, params *protocol.CallHierarchyOutgoingCallsParams) ([]protocol.CallHierarchyOutgoingCall, error) { @@ -55,5 +55,5 @@ func (s *server) OutgoingCalls(ctx context.Context, params *protocol.CallHierarc if snapshot.FileKind(fh) != file.Go { return nil, nil // empty result } - return source.OutgoingCalls(ctx, snapshot, fh, params.Item.Range.Start) + return golang.OutgoingCalls(ctx, snapshot, fh, params.Item.Range.Start) } diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index a433d6aa96d..f09ad6f47b7 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -13,10 +13,10 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/internal/event" ) @@ -107,7 +107,7 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara case file.Go: // Don't suggest fixes for generated files, since they are generally // not useful and some editors may apply them automatically on save. - if source.IsGenerated(ctx, snapshot, uri) { + if golang.IsGenerated(ctx, snapshot, uri) { return nil, nil } @@ -116,7 +116,7 @@ func (s *server) CodeAction(ctx context.Context, params *protocol.CodeActionPara return nil, err } - moreActions, err := source.CodeActions(ctx, snapshot, fh, params.Range, params.Context.Diagnostics, want) + moreActions, err := golang.CodeActions(ctx, snapshot, fh, params.Range, params.Context.Diagnostics, want) if err != nil { return nil, err } diff --git a/gopls/internal/server/code_lens.go b/gopls/internal/server/code_lens.go index e8d7f2b4150..3e7e27b6298 100644 --- a/gopls/internal/server/code_lens.go +++ b/gopls/internal/server/code_lens.go @@ -10,9 +10,9 @@ import ( "sort" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -28,12 +28,12 @@ func (s *server) CodeLens(ctx context.Context, params *protocol.CodeLensParams) } defer release() - var lenses map[command.Command]source.LensFunc + var lenses map[command.Command]golang.LensFunc switch snapshot.FileKind(fh) { case file.Mod: lenses = mod.LensFuncs() case file.Go: - lenses = source.LensFuncs() + lenses = golang.LensFuncs() default: // Unsupported file kind for a code lens. return nil, nil diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index a46bb3829cf..bc64875a20b 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -24,12 +24,12 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" @@ -205,7 +205,7 @@ func (c *commandHandler) ApplyFix(ctx context.Context, args command.ApplyFixArgs // Note: no progress here. Applying fixes should be quick. forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { - edits, err := source.ApplyFix(ctx, args.Fix, deps.snapshot, deps.fh, args.Range) + edits, err := golang.ApplyFix(ctx, args.Fix, deps.snapshot, deps.fh, args.Range) if err != nil { return err } @@ -509,7 +509,7 @@ func (c *commandHandler) RunTests(ctx context.Context, args command.RunTestsArgs func (c *commandHandler) runTests(ctx context.Context, snapshot *cache.Snapshot, work *progress.WorkDone, uri protocol.DocumentURI, tests, benchmarks []string) error { // TODO: fix the error reporting when this runs async. - meta, err := source.NarrowestMetadataForFile(ctx, snapshot, uri) + meta, err := golang.NarrowestMetadataForFile(ctx, snapshot, uri) if err != nil { return err } @@ -776,7 +776,7 @@ func (c *commandHandler) ToggleGCDetails(ctx context.Context, args command.URIAr forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { return c.modifyState(ctx, FromToggleGCDetails, func() (*cache.Snapshot, func(), error) { - meta, err := source.NarrowestMetadataForFile(ctx, deps.snapshot, deps.fh.URI()) + meta, err := golang.NarrowestMetadataForFile(ctx, deps.snapshot, deps.fh.URI()) if err != nil { return nil, nil, err } @@ -796,7 +796,7 @@ func (c *commandHandler) ListKnownPackages(ctx context.Context, args command.URI progress: "Listing packages", forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { - pkgs, err := source.KnownPackagePaths(ctx, deps.snapshot, deps.fh) + pkgs, err := golang.KnownPackagePaths(ctx, deps.snapshot, deps.fh) for _, pkg := range pkgs { result.Packages = append(result.Packages, string(pkg)) } @@ -834,7 +834,7 @@ func (c *commandHandler) ListImports(ctx context.Context, args command.URIArg) ( }) } } - meta, err := source.NarrowestMetadataForFile(ctx, deps.snapshot, args.URI) + meta, err := golang.NarrowestMetadataForFile(ctx, deps.snapshot, args.URI) if err != nil { return err // e.g. cancelled } @@ -855,7 +855,7 @@ func (c *commandHandler) AddImport(ctx context.Context, args command.AddImportAr progress: "Adding import", forURI: args.URI, }, func(ctx context.Context, deps commandDeps) error { - edits, err := source.AddImport(ctx, deps.snapshot, deps.fh, args.ImportPath) + edits, err := golang.AddImport(ctx, deps.snapshot, deps.fh, args.ImportPath) if err != nil { return fmt.Errorf("could not add import: %v", err) } @@ -1070,7 +1070,7 @@ func collectViewStats(ctx context.Context, view *cache.View) (command.ViewStats, } workspacePackages := collectPackageStats(wsMD) - var ids []source.PackageID + var ids []golang.PackageID for _, mp := range wsMD { ids = append(ids, mp.ID) } @@ -1260,7 +1260,7 @@ func (c *commandHandler) ChangeSignature(ctx context.Context, args command.Chang forURI: args.RemoveParameter.URI, }, func(ctx context.Context, deps commandDeps) error { // For now, gopls only supports removing unused parameters. - changes, err := source.RemoveUnusedParameter(ctx, deps.fh, args.RemoveParameter.Range, deps.snapshot) + changes, err := golang.RemoveUnusedParameter(ctx, deps.fh, args.RemoveParameter.Range, deps.snapshot) if err != nil { return err } diff --git a/gopls/internal/server/completion.go b/gopls/internal/server/completion.go index 6e49d5fb346..d59eb351608 100644 --- a/gopls/internal/server/completion.go +++ b/gopls/internal/server/completion.go @@ -10,9 +10,9 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" + "golang.org/x/tools/gopls/internal/golang/completion" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" - "golang.org/x/tools/gopls/internal/lsp/source/completion" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" @@ -116,7 +116,7 @@ func toProtocolCompletionItems(candidates []completion.CompletionItem, rng proto doc := &protocol.Or_CompletionItem_documentation{ Value: protocol.MarkupContent{ Kind: protocol.Markdown, - Value: source.CommentToMarkdown(candidate.Documentation, options), + Value: golang.CommentToMarkdown(candidate.Documentation, options), }, } if options.PreferredContentFormat != protocol.Markdown { diff --git a/gopls/internal/server/definition.go b/gopls/internal/server/definition.go index 74096203975..8c0cd8a5d77 100644 --- a/gopls/internal/server/definition.go +++ b/gopls/internal/server/definition.go @@ -9,8 +9,8 @@ import ( "fmt" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" @@ -36,7 +36,7 @@ func (s *server) Definition(ctx context.Context, params *protocol.DefinitionPara case file.Tmpl: return template.Definition(snapshot, fh, params.Position) case file.Go: - return source.Definition(ctx, snapshot, fh, params.Position) + return golang.Definition(ctx, snapshot, fh, params.Position) default: return nil, fmt.Errorf("can't find definitions for file type %s", kind) } @@ -54,7 +54,7 @@ func (s *server) TypeDefinition(ctx context.Context, params *protocol.TypeDefini defer release() switch kind := snapshot.FileKind(fh); kind { case file.Go: - return source.TypeDefinition(ctx, snapshot, fh, params.Position) + return golang.TypeDefinition(ctx, snapshot, fh, params.Position) default: return nil, fmt.Errorf("can't find type definitions for file type %s", kind) } diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 6f09f030d7a..262910c70d1 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -17,10 +17,10 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/template" @@ -263,7 +263,7 @@ func (s *server) diagnoseChangedFiles(ctx context.Context, snapshot *cache.Snaps } // Find all packages that include this file and diagnose them in parallel. - meta, err := source.NarrowestMetadataForFile(ctx, snapshot, uri) + meta, err := golang.NarrowestMetadataForFile(ctx, snapshot, uri) if err != nil { if ctx.Err() != nil { return nil, ctx.Err() @@ -438,7 +438,7 @@ func (s *server) diagnose(ctx context.Context, snapshot *cache.Snapshot) (diagMa toAnalyze = make(map[metadata.PackageID]*metadata.Package) // secondary index, used to eliminate narrower packages. - toAnalyzeWidest = make(map[source.PackagePath]*metadata.Package) + toAnalyzeWidest = make(map[golang.PackagePath]*metadata.Package) ) for _, mp := range workspacePkgs { var hasNonIgnored, hasOpenFile bool @@ -496,7 +496,7 @@ func (s *server) diagnose(ctx context.Context, snapshot *cache.Snapshot) (diagMa var err error // TODO(rfindley): here and above, we should avoid using the first result // if err is non-nil (though as of today it's OK). - analysisDiags, err = source.Analyze(ctx, snapshot, toAnalyze, s.progress) + analysisDiags, err = golang.Analyze(ctx, snapshot, toAnalyze, s.progress) if err != nil { event.Error(ctx, "warning: analyzing package", err, append(snapshot.Labels(), tag.Package.Of(keys.Join(maps.Keys(toDiagnose))))...) return @@ -542,7 +542,7 @@ func (s *server) gcDetailsDiagnostics(ctx context.Context, snapshot *cache.Snaps diagnostics := make(diagMap) for _, mp := range toGCDetail { - gcReports, err := source.GCOptimizationDetails(ctx, snapshot, mp) + gcReports, err := golang.GCOptimizationDetails(ctx, snapshot, mp) if err != nil { event.Error(ctx, "warning: gc details", err, append(snapshot.Labels(), tag.Package.Of(string(mp.ID)))...) continue diff --git a/gopls/internal/server/folding_range.go b/gopls/internal/server/folding_range.go index 4f471658478..d1fea80f502 100644 --- a/gopls/internal/server/folding_range.go +++ b/gopls/internal/server/folding_range.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) @@ -26,14 +26,14 @@ func (s *server) FoldingRange(ctx context.Context, params *protocol.FoldingRange if snapshot.FileKind(fh) != file.Go { return nil, nil // empty result } - ranges, err := source.FoldingRange(ctx, snapshot, fh, snapshot.Options().LineFoldingOnly) + ranges, err := golang.FoldingRange(ctx, snapshot, fh, snapshot.Options().LineFoldingOnly) if err != nil { return nil, err } return toProtocolFoldingRanges(ranges) } -func toProtocolFoldingRanges(ranges []*source.FoldingRangeInfo) ([]protocol.FoldingRange, error) { +func toProtocolFoldingRanges(ranges []*golang.FoldingRangeInfo) ([]protocol.FoldingRange, error) { result := make([]protocol.FoldingRange, 0, len(ranges)) for _, info := range ranges { rng := info.MappedRange.Range() diff --git a/gopls/internal/server/format.go b/gopls/internal/server/format.go index 19b6b62f3fc..fc1f2c8cf01 100644 --- a/gopls/internal/server/format.go +++ b/gopls/internal/server/format.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/work" "golang.org/x/tools/internal/event" @@ -30,7 +30,7 @@ func (s *server) Formatting(ctx context.Context, params *protocol.DocumentFormat case file.Mod: return mod.Format(ctx, snapshot, fh) case file.Go: - return source.Format(ctx, snapshot, fh) + return golang.Format(ctx, snapshot, fh) case file.Work: return work.Format(ctx, snapshot, fh) } diff --git a/gopls/internal/server/highlight.go b/gopls/internal/server/highlight.go index 5d025644dea..4cc74596c94 100644 --- a/gopls/internal/server/highlight.go +++ b/gopls/internal/server/highlight.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -29,7 +29,7 @@ func (s *server) DocumentHighlight(ctx context.Context, params *protocol.Documen case file.Tmpl: return template.Highlight(ctx, snapshot, fh, params.Position) case file.Go: - rngs, err := source.Highlight(ctx, snapshot, fh, params.Position) + rngs, err := golang.Highlight(ctx, snapshot, fh, params.Position) if err != nil { event.Error(ctx, "no highlight", err) } diff --git a/gopls/internal/server/hover.go b/gopls/internal/server/hover.go index 1a25c43f729..ca28deafcb5 100644 --- a/gopls/internal/server/hover.go +++ b/gopls/internal/server/hover.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" @@ -37,7 +37,7 @@ func (s *server) Hover(ctx context.Context, params *protocol.HoverParams) (_ *pr case file.Mod: return mod.Hover(ctx, snapshot, fh, params.Position) case file.Go: - return source.Hover(ctx, snapshot, fh, params.Position) + return golang.Hover(ctx, snapshot, fh, params.Position) case file.Tmpl: return template.Hover(ctx, snapshot, fh, params.Position) case file.Work: diff --git a/gopls/internal/server/implementation.go b/gopls/internal/server/implementation.go index 51156f98122..dd7c9a6fc39 100644 --- a/gopls/internal/server/implementation.go +++ b/gopls/internal/server/implementation.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -32,5 +32,5 @@ func (s *server) Implementation(ctx context.Context, params *protocol.Implementa if snapshot.FileKind(fh) != file.Go { return nil, nil // empty result } - return source.Implementation(ctx, snapshot, fh, params.Position) + return golang.Implementation(ctx, snapshot, fh, params.Position) } diff --git a/gopls/internal/server/inlay_hint.go b/gopls/internal/server/inlay_hint.go index e696df68036..3a5129fdb4c 100644 --- a/gopls/internal/server/inlay_hint.go +++ b/gopls/internal/server/inlay_hint.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -29,7 +29,7 @@ func (s *server) InlayHint(ctx context.Context, params *protocol.InlayHintParams case file.Mod: return mod.InlayHint(ctx, snapshot, fh, params.Range) case file.Go: - return source.InlayHint(ctx, snapshot, fh, params.Range) + return golang.InlayHint(ctx, snapshot, fh, params.Range) } return nil, nil // empty result } diff --git a/gopls/internal/server/link.go b/gopls/internal/server/link.go index 511e50b5872..55d4b6e84ad 100644 --- a/gopls/internal/server/link.go +++ b/gopls/internal/server/link.go @@ -17,11 +17,11 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -121,9 +121,9 @@ func goLinks(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle) ([]p // If links are to pkg.go.dev, append module version suffixes. // This requires the import map from the package metadata. Ignore errors. - var depsByImpPath map[source.ImportPath]source.PackageID + var depsByImpPath map[golang.ImportPath]golang.PackageID if strings.ToLower(snapshot.Options().LinkTarget) == "pkg.go.dev" { - if meta, err := source.NarrowestMetadataForFile(ctx, snapshot, fh.URI()); err == nil { + if meta, err := golang.NarrowestMetadataForFile(ctx, snapshot, fh.URI()); err == nil { depsByImpPath = meta.DepsByImpPath } } diff --git a/gopls/internal/server/references.go b/gopls/internal/server/references.go index 1bdd85d685a..865a51d7696 100644 --- a/gopls/internal/server/references.go +++ b/gopls/internal/server/references.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" @@ -34,7 +34,7 @@ func (s *server) References(ctx context.Context, params *protocol.ReferenceParam case file.Tmpl: return template.References(ctx, snapshot, fh, params) case file.Go: - return source.References(ctx, snapshot, fh, params.Position, params.Context.IncludeDeclaration) + return golang.References(ctx, snapshot, fh, params.Position, params.Context.IncludeDeclaration) } return nil, nil // empty result } diff --git a/gopls/internal/server/rename.go b/gopls/internal/server/rename.go index c4b28eb2171..2ecc0861f26 100644 --- a/gopls/internal/server/rename.go +++ b/gopls/internal/server/rename.go @@ -10,8 +10,8 @@ import ( "path/filepath" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) @@ -30,10 +30,10 @@ func (s *server) Rename(ctx context.Context, params *protocol.RenameParams) (*pr return nil, fmt.Errorf("cannot rename in file of type %s", kind) } - // Because we don't handle directory renaming within source.Rename, source.Rename returns + // Because we don't handle directory renaming within golang.Rename, golang.Rename returns // boolean value isPkgRenaming to determine whether an DocumentChanges of type RenameFile should // be added to the return protocol.WorkspaceEdit value. - edits, isPkgRenaming, err := source.Rename(ctx, snapshot, fh, params.Position, params.NewName) + edits, isPkgRenaming, err := golang.Rename(ctx, snapshot, fh, params.Position, params.NewName) if err != nil { return nil, err } @@ -85,7 +85,7 @@ func (s *server) PrepareRename(ctx context.Context, params *protocol.PrepareRena // Do not return errors here, as it adds clutter. // Returning a nil result means there is not a valid rename. - item, usererr, err := source.PrepareRename(ctx, snapshot, fh, params.Position) + item, usererr, err := golang.PrepareRename(ctx, snapshot, fh, params.Position) if err != nil { // Return usererr here rather than err, to avoid cluttering the UI with // internal error details. diff --git a/gopls/internal/server/semantic.go b/gopls/internal/server/semantic.go index 161c111bc3c..8e4b3dc8401 100644 --- a/gopls/internal/server/semantic.go +++ b/gopls/internal/server/semantic.go @@ -19,10 +19,10 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" @@ -85,7 +85,7 @@ func (s *server) semanticTokens(ctx context.Context, td protocol.TextDocumentIde if kind != file.Go { return nil, nil // empty result } - pkg, pgf, err := source.NarrowestPackageForFile(ctx, snapshot, fh.URI()) + pkg, pgf, err := golang.NarrowestPackageForFile(ctx, snapshot, fh.URI()) if err != nil { return nil, err } @@ -228,7 +228,7 @@ type encoded struct { // metadataSource is used to resolve imports metadataSource metadata.Source tokTypes, tokMods []string - pgf *source.ParsedGoFile + pgf *golang.ParsedGoFile start, end token.Pos // range of interest ti *types.Info pkg *cache.Package diff --git a/gopls/internal/server/signature_help.go b/gopls/internal/server/signature_help.go index fb2262afe9c..a553703453c 100644 --- a/gopls/internal/server/signature_help.go +++ b/gopls/internal/server/signature_help.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) @@ -28,7 +28,7 @@ func (s *server) SignatureHelp(ctx context.Context, params *protocol.SignatureHe return nil, nil // empty result } - info, activeParameter, err := source.SignatureHelp(ctx, snapshot, fh, params.Position) + info, activeParameter, err := golang.SignatureHelp(ctx, snapshot, fh, params.Position) if err != nil { event.Error(ctx, "no signature help", err, tag.Position.Of(params.Position)) return nil, nil // sic? There could be many reasons for failure. diff --git a/gopls/internal/server/symbols.go b/gopls/internal/server/symbols.go index 6eb0057f29e..617826f73f5 100644 --- a/gopls/internal/server/symbols.go +++ b/gopls/internal/server/symbols.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" @@ -30,7 +30,7 @@ func (s *server) DocumentSymbol(ctx context.Context, params *protocol.DocumentSy case file.Tmpl: docSymbols, err = template.DocumentSymbols(snapshot, fh) case file.Go: - docSymbols, err = source.DocumentSymbols(ctx, snapshot, fh) + docSymbols, err = golang.DocumentSymbols(ctx, snapshot, fh) default: return nil, nil // empty result } diff --git a/gopls/internal/server/text_synchronization.go b/gopls/internal/server/text_synchronization.go index 30385d0335f..2991ae98266 100644 --- a/gopls/internal/server/text_synchronization.go +++ b/gopls/internal/server/text_synchronization.go @@ -13,9 +13,9 @@ import ( "sync" "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/jsonrpc2" @@ -162,7 +162,7 @@ func (s *server) warnAboutModifyingGeneratedFiles(ctx context.Context, uri proto if err != nil { return err } - isGenerated := source.IsGenerated(ctx, snapshot, uri) + isGenerated := golang.IsGenerated(ctx, snapshot, uri) release() if isGenerated { diff --git a/gopls/internal/server/workspace_symbol.go b/gopls/internal/server/workspace_symbol.go index 3b96a38e742..53cf7691012 100644 --- a/gopls/internal/server/workspace_symbol.go +++ b/gopls/internal/server/workspace_symbol.go @@ -7,9 +7,9 @@ package server import ( "context" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" ) @@ -37,5 +37,5 @@ func (s *server) Symbol(ctx context.Context, params *protocol.WorkspaceSymbolPar defer release() snapshots = append(snapshots, snapshot) } - return source.WorkspaceSymbols(ctx, matcher, style, snapshots, params.Query) + return golang.WorkspaceSymbols(ctx, matcher, style, snapshots, params.Query) } diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index d7841278c43..dbaac2faa23 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -410,7 +410,7 @@ var GeneratedAPIJSON = &APIJSON{ }, { Name: "\"stubmethods\"", - Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", + Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's golang.stub function.)", Default: "true", }, { @@ -737,7 +737,7 @@ var GeneratedAPIJSON = &APIJSON{ Command: "gopls.apply_fix", Title: "Apply a fix", Doc: "Applies a fix to a region of source code.", - ArgDoc: "{\n\t// The name of the fix to apply.\n\t//\n\t// For fixes suggested by analyzers, this is a string constant\n\t// advertised by the analyzer that matches the Category of\n\t// the analysis.Diagnostic with a SuggestedFix containing no edits.\n\t//\n\t// For fixes suggested by code actions, this is a string agreed\n\t// upon by the code action and source.ApplyFix.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", + ArgDoc: "{\n\t// The name of the fix to apply.\n\t//\n\t// For fixes suggested by analyzers, this is a string constant\n\t// advertised by the analyzer that matches the Category of\n\t// the analysis.Diagnostic with a SuggestedFix containing no edits.\n\t//\n\t// For fixes suggested by code actions, this is a string agreed\n\t// upon by the code action and golang.ApplyFix.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", }, { @@ -1193,7 +1193,7 @@ var GeneratedAPIJSON = &APIJSON{ }, { Name: "stubmethods", - Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's source.stub function.)", + Doc: "detect missing methods and fix with stub implementations\n\nThis analyzer detects type-checking errors due to missing methods\nin assignments from concrete types to interface types, and offers\na suggested fix that will create a set of stub methods so that\nthe concrete type satisfies the interface.\n\nFor example, this function will not compile because the value\nNegativeErr{} does not implement the \"error\" interface:\n\n\tfunc sqrt(x float64) (float64, error) {\n\t\tif x < 0 {\n\t\t\treturn 0, NegativeErr{} // error: missing method\n\t\t}\n\t\t...\n\t}\n\n\ttype NegativeErr struct{}\n\nThis analyzer will suggest a fix to declare this method:\n\n\t// Error implements error.Error.\n\tfunc (NegativeErr) Error() string {\n\t\tpanic(\"unimplemented\")\n\t}\n\n(At least, it appears to behave that way, but technically it\ndoesn't use the SuggestedFix mechanism and the stub is created by\nlogic in gopls's golang.stub function.)", URL: "https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/stubmethods", Default: true, }, diff --git a/gopls/internal/test/integration/fake/editor.go b/gopls/internal/test/integration/fake/editor.go index 9c376d0219b..1b5dc2115e7 100644 --- a/gopls/internal/test/integration/fake/editor.go +++ b/gopls/internal/test/integration/fake/editor.go @@ -73,7 +73,7 @@ func (b buffer) text() string { } // EditorConfig configures the editor's LSP session. This is similar to -// source.UserOptions, but we use a separate type here so that we expose only +// golang.UserOptions, but we use a separate type here so that we expose only // that configuration which we support. // // The zero value for EditorConfig is the default configuration. diff --git a/gopls/internal/test/integration/inlayhints/inlayhints_test.go b/gopls/internal/test/integration/inlayhints/inlayhints_test.go index c56fae500e3..eab430f23bb 100644 --- a/gopls/internal/test/integration/inlayhints/inlayhints_test.go +++ b/gopls/internal/test/integration/inlayhints/inlayhints_test.go @@ -6,9 +6,9 @@ package inlayhint import ( "testing" + "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/hooks" . "golang.org/x/tools/gopls/internal/test/integration" - "golang.org/x/tools/gopls/internal/lsp/source" "golang.org/x/tools/gopls/internal/util/bug" ) @@ -42,12 +42,12 @@ const ( }, { label: "enable const", - enabled: map[string]bool{source.ConstantValues: true}, + enabled: map[string]bool{golang.ConstantValues: true}, wantInlayHint: true, }, { label: "enable parameter names", - enabled: map[string]bool{source.ParameterNames: true}, + enabled: map[string]bool{golang.ParameterNames: true}, wantInlayHint: false, }, } From f872b3d6f05822d290bc7bdd29db090fd9d89f5c Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 15:32:26 -0500 Subject: [PATCH 053/105] gopls/internal/cache: move out of lsp/ Change-Id: Id65551f45428860cef3a72d43f0e219e428a8455 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557718 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/doc/design/implementation.md | 12 ++++++------ gopls/internal/{lsp => }/cache/analysis.go | 4 ++-- gopls/internal/{lsp => }/cache/cache.go | 0 gopls/internal/{lsp => }/cache/check.go | 4 ++-- gopls/internal/{lsp => }/cache/constraints.go | 0 gopls/internal/{lsp => }/cache/constraints_test.go | 0 gopls/internal/{lsp => }/cache/debug.go | 0 gopls/internal/{lsp => }/cache/diagnostics.go | 0 gopls/internal/{lsp => }/cache/errors.go | 2 +- gopls/internal/{lsp => }/cache/errors_test.go | 0 gopls/internal/{lsp => }/cache/filemap.go | 0 gopls/internal/{lsp => }/cache/filemap_test.go | 0 gopls/internal/{lsp => }/cache/filterer.go | 0 gopls/internal/{lsp => }/cache/fs_memoized.go | 0 gopls/internal/{lsp => }/cache/fs_overlay.go | 0 gopls/internal/{lsp => }/cache/imports.go | 0 gopls/internal/{lsp => }/cache/keys.go | 0 gopls/internal/{lsp => }/cache/load.go | 2 +- .../internal/{lsp => }/cache/metadata/cycle_test.go | 0 gopls/internal/{lsp => }/cache/metadata/graph.go | 0 gopls/internal/{lsp => }/cache/metadata/metadata.go | 0 .../{lsp => }/cache/methodsets/methodsets.go | 0 gopls/internal/{lsp => }/cache/mod.go | 0 gopls/internal/{lsp => }/cache/mod_tidy.go | 0 gopls/internal/{lsp => }/cache/mod_vuln.go | 2 +- gopls/internal/{lsp => }/cache/os_darwin.go | 0 gopls/internal/{lsp => }/cache/os_windows.go | 0 gopls/internal/{lsp => }/cache/parse.go | 2 +- gopls/internal/{lsp => }/cache/parse_cache.go | 2 +- gopls/internal/{lsp => }/cache/parse_cache_test.go | 0 gopls/internal/{lsp => }/cache/parsego/file.go | 0 gopls/internal/{lsp => }/cache/parsego/parse.go | 0 gopls/internal/{lsp => }/cache/parsego/parse_test.go | 2 +- gopls/internal/{lsp => }/cache/pkg.go | 8 ++++---- gopls/internal/{lsp => }/cache/port.go | 0 gopls/internal/{lsp => }/cache/port_test.go | 0 gopls/internal/{lsp => }/cache/session.go | 4 ++-- gopls/internal/{lsp => }/cache/session_test.go | 0 gopls/internal/{lsp => }/cache/snapshot.go | 8 ++++---- gopls/internal/{lsp => }/cache/symbols.go | 0 gopls/internal/{lsp => }/cache/typerefs/doc.go | 2 +- .../internal/{lsp => }/cache/typerefs/packageset.go | 2 +- .../{lsp => }/cache/typerefs/pkggraph_test.go | 6 +++--- .../{lsp => }/cache/typerefs/pkgrefs_test.go | 10 +++++----- gopls/internal/{lsp => }/cache/typerefs/refs.go | 4 ++-- gopls/internal/{lsp => }/cache/typerefs/refs_test.go | 6 +++--- gopls/internal/{lsp => }/cache/view.go | 2 +- gopls/internal/{lsp => }/cache/view_test.go | 0 gopls/internal/{lsp => }/cache/workspace.go | 0 gopls/internal/{lsp => }/cache/xrefs/xrefs.go | 4 ++-- gopls/internal/cmd/capabilities_test.go | 2 +- gopls/internal/cmd/cmd.go | 2 +- gopls/internal/cmd/serve.go | 2 +- gopls/internal/debug/serve.go | 2 +- gopls/internal/debug/template_test.go | 2 +- gopls/internal/filecache/filecache.go | 2 +- gopls/internal/golang/add_import.go | 2 +- gopls/internal/golang/call_hierarchy.go | 2 +- gopls/internal/golang/change_signature.go | 4 ++-- gopls/internal/golang/code_lens.go | 2 +- gopls/internal/golang/codeaction.go | 4 ++-- gopls/internal/golang/completion/completion.go | 4 ++-- gopls/internal/golang/completion/package.go | 2 +- gopls/internal/golang/completion/postfix_snippets.go | 2 +- gopls/internal/golang/completion/statements.go | 2 +- gopls/internal/golang/definition.go | 6 +++--- gopls/internal/golang/diagnostics.go | 4 ++-- gopls/internal/golang/fix.go | 4 ++-- gopls/internal/golang/folding_range.go | 2 +- gopls/internal/golang/format.go | 2 +- gopls/internal/golang/gc_annotations.go | 4 ++-- gopls/internal/golang/highlight.go | 2 +- gopls/internal/golang/hover.go | 6 +++--- gopls/internal/golang/implementation.go | 6 +++--- gopls/internal/golang/inlay_hint.go | 2 +- gopls/internal/golang/inline.go | 4 ++-- gopls/internal/golang/inline_all.go | 2 +- gopls/internal/golang/known_packages.go | 4 ++-- gopls/internal/golang/linkname.go | 4 ++-- gopls/internal/golang/references.go | 6 +++--- gopls/internal/golang/rename.go | 6 +++--- gopls/internal/golang/rename_check.go | 2 +- gopls/internal/golang/signature_help.go | 2 +- gopls/internal/golang/snapshot.go | 6 +++--- gopls/internal/golang/stub.go | 6 +++--- gopls/internal/golang/symbols.go | 2 +- gopls/internal/golang/type_definition.go | 2 +- gopls/internal/golang/types_format.go | 2 +- gopls/internal/golang/util.go | 4 ++-- gopls/internal/golang/workspace_symbol.go | 4 ++-- gopls/internal/golang/workspace_symbol_test.go | 2 +- gopls/internal/lsprpc/lsprpc.go | 2 +- gopls/internal/lsprpc/lsprpc_test.go | 2 +- gopls/internal/mod/code_lens.go | 2 +- gopls/internal/mod/diagnostics.go | 2 +- gopls/internal/mod/format.go | 2 +- gopls/internal/mod/hover.go | 2 +- gopls/internal/mod/inlayhint.go | 2 +- gopls/internal/server/code_action.go | 2 +- gopls/internal/server/command.go | 6 +++--- gopls/internal/server/diagnostics.go | 4 ++-- gopls/internal/server/general.go | 2 +- gopls/internal/server/link.go | 6 +++--- gopls/internal/server/selection_range.go | 2 +- gopls/internal/server/semantic.go | 4 ++-- gopls/internal/server/server.go | 2 +- gopls/internal/server/text_synchronization.go | 2 +- gopls/internal/server/workspace.go | 2 +- gopls/internal/server/workspace_symbol.go | 2 +- gopls/internal/template/completion.go | 2 +- gopls/internal/template/highlight.go | 2 +- gopls/internal/template/implementations.go | 2 +- gopls/internal/template/symbols.go | 2 +- .../test/integration/bench/completion_test.go | 4 ++-- .../test/integration/bench/definition_test.go | 2 +- .../test/integration/bench/didchange_test.go | 2 +- gopls/internal/test/integration/bench/hover_test.go | 2 +- gopls/internal/test/integration/bench/iwl_test.go | 2 +- gopls/internal/test/integration/bench/rename_test.go | 2 +- gopls/internal/test/integration/bench/stress_test.go | 2 +- .../test/integration/diagnostics/analysis_test.go | 2 +- .../test/integration/diagnostics/golist_test.go | 2 +- gopls/internal/test/integration/misc/vuln_test.go | 2 +- gopls/internal/test/integration/regtest.go | 2 +- gopls/internal/test/integration/runner.go | 2 +- gopls/internal/test/integration/watch/watch_test.go | 2 +- .../test/integration/workspace/zero_config_test.go | 2 +- gopls/internal/test/marker/marker_test.go | 2 +- gopls/internal/vulncheck/scan/command.go | 2 +- gopls/internal/work/completion.go | 2 +- gopls/internal/work/diagnostics.go | 2 +- gopls/internal/work/format.go | 2 +- gopls/internal/work/hover.go | 2 +- 133 files changed, 159 insertions(+), 159 deletions(-) rename gopls/internal/{lsp => }/cache/analysis.go (99%) rename gopls/internal/{lsp => }/cache/cache.go (100%) rename gopls/internal/{lsp => }/cache/check.go (99%) rename gopls/internal/{lsp => }/cache/constraints.go (100%) rename gopls/internal/{lsp => }/cache/constraints_test.go (100%) rename gopls/internal/{lsp => }/cache/debug.go (100%) rename gopls/internal/{lsp => }/cache/diagnostics.go (100%) rename gopls/internal/{lsp => }/cache/errors.go (99%) rename gopls/internal/{lsp => }/cache/errors_test.go (100%) rename gopls/internal/{lsp => }/cache/filemap.go (100%) rename gopls/internal/{lsp => }/cache/filemap_test.go (100%) rename gopls/internal/{lsp => }/cache/filterer.go (100%) rename gopls/internal/{lsp => }/cache/fs_memoized.go (100%) rename gopls/internal/{lsp => }/cache/fs_overlay.go (100%) rename gopls/internal/{lsp => }/cache/imports.go (100%) rename gopls/internal/{lsp => }/cache/keys.go (100%) rename gopls/internal/{lsp => }/cache/load.go (99%) rename gopls/internal/{lsp => }/cache/metadata/cycle_test.go (100%) rename gopls/internal/{lsp => }/cache/metadata/graph.go (100%) rename gopls/internal/{lsp => }/cache/metadata/metadata.go (100%) rename gopls/internal/{lsp => }/cache/methodsets/methodsets.go (100%) rename gopls/internal/{lsp => }/cache/mod.go (100%) rename gopls/internal/{lsp => }/cache/mod_tidy.go (100%) rename gopls/internal/{lsp => }/cache/mod_vuln.go (99%) rename gopls/internal/{lsp => }/cache/os_darwin.go (100%) rename gopls/internal/{lsp => }/cache/os_windows.go (100%) rename gopls/internal/{lsp => }/cache/parse.go (96%) rename gopls/internal/{lsp => }/cache/parse_cache.go (99%) rename gopls/internal/{lsp => }/cache/parse_cache_test.go (100%) rename gopls/internal/{lsp => }/cache/parsego/file.go (100%) rename gopls/internal/{lsp => }/cache/parsego/parse.go (100%) rename gopls/internal/{lsp => }/cache/parsego/parse_test.go (95%) rename gopls/internal/{lsp => }/cache/pkg.go (95%) rename gopls/internal/{lsp => }/cache/port.go (100%) rename gopls/internal/{lsp => }/cache/port_test.go (100%) rename gopls/internal/{lsp => }/cache/session.go (99%) rename gopls/internal/{lsp => }/cache/session_test.go (100%) rename gopls/internal/{lsp => }/cache/snapshot.go (99%) rename gopls/internal/{lsp => }/cache/symbols.go (100%) rename gopls/internal/{lsp => }/cache/typerefs/doc.go (98%) rename gopls/internal/{lsp => }/cache/typerefs/packageset.go (98%) rename gopls/internal/{lsp => }/cache/typerefs/pkggraph_test.go (97%) rename gopls/internal/{lsp => }/cache/typerefs/pkgrefs_test.go (97%) rename gopls/internal/{lsp => }/cache/typerefs/refs.go (99%) rename gopls/internal/{lsp => }/cache/typerefs/refs_test.go (98%) rename gopls/internal/{lsp => }/cache/view.go (99%) rename gopls/internal/{lsp => }/cache/view_test.go (100%) rename gopls/internal/{lsp => }/cache/workspace.go (100%) rename gopls/internal/{lsp => }/cache/xrefs/xrefs.go (98%) diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index a6f0173df9a..418ea4601e1 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -145,7 +145,7 @@ access to server functionality. These subcommands are primarily provided as a debugging aid (but see [#63693](https://github.com/golang/go/issues/63693)). -[cache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache +[cache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache [cmd]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cmd [command]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/command [debug]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/debug @@ -158,16 +158,16 @@ provided as a debugging aid (but see [lsp]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp [lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsprpc [memoize]: https://github.com/golang/tools/tree/master/internal/memoize -[metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/metadata -[methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/methodsets +[metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/metadata +[methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/methodsets [mod]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/mod -[parsego]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/parsego +[parsego]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/parsego [protocol]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/protocol [server]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/server [settings]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/settings [source]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/source [template]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/template -[typerefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/typerefs +[typerefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/typerefs [work]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/work [x/tools]: https://github.com/golang/tools@master -[xrefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/cache/xrefs +[xrefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/xrefs diff --git a/gopls/internal/lsp/cache/analysis.go b/gopls/internal/cache/analysis.go similarity index 99% rename from gopls/internal/lsp/cache/analysis.go rename to gopls/internal/cache/analysis.go index 49b15dda25a..35c68dcbc3a 100644 --- a/gopls/internal/lsp/cache/analysis.go +++ b/gopls/internal/cache/analysis.go @@ -34,7 +34,7 @@ import ( "golang.org/x/tools/go/analysis" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" @@ -150,7 +150,7 @@ import ( // Even if the ultimate consumer decides to ignore errors, // tests and other situations want to be assured of freedom from // errors, not just missing results. This should be recorded. -// - Split this into a subpackage, gopls/internal/lsp/cache/driver, +// - Split this into a subpackage, gopls/internal/cache/driver, // consisting of this file and three helpers from errors.go. // The (*snapshot).Analyze method would stay behind and make calls // to the driver package. diff --git a/gopls/internal/lsp/cache/cache.go b/gopls/internal/cache/cache.go similarity index 100% rename from gopls/internal/lsp/cache/cache.go rename to gopls/internal/cache/cache.go diff --git a/gopls/internal/lsp/cache/check.go b/gopls/internal/cache/check.go similarity index 99% rename from gopls/internal/lsp/cache/check.go rename to gopls/internal/cache/check.go index bf5595b93a9..0fabdcacdcc 100644 --- a/gopls/internal/lsp/cache/check.go +++ b/gopls/internal/cache/check.go @@ -24,8 +24,8 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/lsp/cache/constraints.go b/gopls/internal/cache/constraints.go similarity index 100% rename from gopls/internal/lsp/cache/constraints.go rename to gopls/internal/cache/constraints.go diff --git a/gopls/internal/lsp/cache/constraints_test.go b/gopls/internal/cache/constraints_test.go similarity index 100% rename from gopls/internal/lsp/cache/constraints_test.go rename to gopls/internal/cache/constraints_test.go diff --git a/gopls/internal/lsp/cache/debug.go b/gopls/internal/cache/debug.go similarity index 100% rename from gopls/internal/lsp/cache/debug.go rename to gopls/internal/cache/debug.go diff --git a/gopls/internal/lsp/cache/diagnostics.go b/gopls/internal/cache/diagnostics.go similarity index 100% rename from gopls/internal/lsp/cache/diagnostics.go rename to gopls/internal/cache/diagnostics.go diff --git a/gopls/internal/lsp/cache/errors.go b/gopls/internal/cache/errors.go similarity index 99% rename from gopls/internal/lsp/cache/errors.go rename to gopls/internal/cache/errors.go index 65530ec655d..df49cc111cb 100644 --- a/gopls/internal/lsp/cache/errors.go +++ b/gopls/internal/cache/errors.go @@ -22,7 +22,7 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/lsp/cache/errors_test.go b/gopls/internal/cache/errors_test.go similarity index 100% rename from gopls/internal/lsp/cache/errors_test.go rename to gopls/internal/cache/errors_test.go diff --git a/gopls/internal/lsp/cache/filemap.go b/gopls/internal/cache/filemap.go similarity index 100% rename from gopls/internal/lsp/cache/filemap.go rename to gopls/internal/cache/filemap.go diff --git a/gopls/internal/lsp/cache/filemap_test.go b/gopls/internal/cache/filemap_test.go similarity index 100% rename from gopls/internal/lsp/cache/filemap_test.go rename to gopls/internal/cache/filemap_test.go diff --git a/gopls/internal/lsp/cache/filterer.go b/gopls/internal/cache/filterer.go similarity index 100% rename from gopls/internal/lsp/cache/filterer.go rename to gopls/internal/cache/filterer.go diff --git a/gopls/internal/lsp/cache/fs_memoized.go b/gopls/internal/cache/fs_memoized.go similarity index 100% rename from gopls/internal/lsp/cache/fs_memoized.go rename to gopls/internal/cache/fs_memoized.go diff --git a/gopls/internal/lsp/cache/fs_overlay.go b/gopls/internal/cache/fs_overlay.go similarity index 100% rename from gopls/internal/lsp/cache/fs_overlay.go rename to gopls/internal/cache/fs_overlay.go diff --git a/gopls/internal/lsp/cache/imports.go b/gopls/internal/cache/imports.go similarity index 100% rename from gopls/internal/lsp/cache/imports.go rename to gopls/internal/cache/imports.go diff --git a/gopls/internal/lsp/cache/keys.go b/gopls/internal/cache/keys.go similarity index 100% rename from gopls/internal/lsp/cache/keys.go rename to gopls/internal/cache/keys.go diff --git a/gopls/internal/lsp/cache/load.go b/gopls/internal/cache/load.go similarity index 99% rename from gopls/internal/lsp/cache/load.go rename to gopls/internal/cache/load.go index e9bddf91b63..b95f91f9119 100644 --- a/gopls/internal/lsp/cache/load.go +++ b/gopls/internal/cache/load.go @@ -17,7 +17,7 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/immutable" diff --git a/gopls/internal/lsp/cache/metadata/cycle_test.go b/gopls/internal/cache/metadata/cycle_test.go similarity index 100% rename from gopls/internal/lsp/cache/metadata/cycle_test.go rename to gopls/internal/cache/metadata/cycle_test.go diff --git a/gopls/internal/lsp/cache/metadata/graph.go b/gopls/internal/cache/metadata/graph.go similarity index 100% rename from gopls/internal/lsp/cache/metadata/graph.go rename to gopls/internal/cache/metadata/graph.go diff --git a/gopls/internal/lsp/cache/metadata/metadata.go b/gopls/internal/cache/metadata/metadata.go similarity index 100% rename from gopls/internal/lsp/cache/metadata/metadata.go rename to gopls/internal/cache/metadata/metadata.go diff --git a/gopls/internal/lsp/cache/methodsets/methodsets.go b/gopls/internal/cache/methodsets/methodsets.go similarity index 100% rename from gopls/internal/lsp/cache/methodsets/methodsets.go rename to gopls/internal/cache/methodsets/methodsets.go diff --git a/gopls/internal/lsp/cache/mod.go b/gopls/internal/cache/mod.go similarity index 100% rename from gopls/internal/lsp/cache/mod.go rename to gopls/internal/cache/mod.go diff --git a/gopls/internal/lsp/cache/mod_tidy.go b/gopls/internal/cache/mod_tidy.go similarity index 100% rename from gopls/internal/lsp/cache/mod_tidy.go rename to gopls/internal/cache/mod_tidy.go diff --git a/gopls/internal/lsp/cache/mod_vuln.go b/gopls/internal/cache/mod_vuln.go similarity index 99% rename from gopls/internal/lsp/cache/mod_vuln.go rename to gopls/internal/cache/mod_vuln.go index 5704863d94f..92d37938424 100644 --- a/gopls/internal/lsp/cache/mod_vuln.go +++ b/gopls/internal/cache/mod_vuln.go @@ -16,7 +16,7 @@ import ( "golang.org/x/mod/semver" "golang.org/x/sync/errgroup" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" diff --git a/gopls/internal/lsp/cache/os_darwin.go b/gopls/internal/cache/os_darwin.go similarity index 100% rename from gopls/internal/lsp/cache/os_darwin.go rename to gopls/internal/cache/os_darwin.go diff --git a/gopls/internal/lsp/cache/os_windows.go b/gopls/internal/cache/os_windows.go similarity index 100% rename from gopls/internal/lsp/cache/os_windows.go rename to gopls/internal/cache/os_windows.go diff --git a/gopls/internal/lsp/cache/parse.go b/gopls/internal/cache/parse.go similarity index 96% rename from gopls/internal/lsp/cache/parse.go rename to gopls/internal/cache/parse.go index 0f93a08d4a8..c8da20eed13 100644 --- a/gopls/internal/lsp/cache/parse.go +++ b/gopls/internal/cache/parse.go @@ -12,7 +12,7 @@ import ( "path/filepath" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/parsego" ) // ParseGo parses the file whose contents are provided by fh. diff --git a/gopls/internal/lsp/cache/parse_cache.go b/gopls/internal/cache/parse_cache.go similarity index 99% rename from gopls/internal/lsp/cache/parse_cache.go rename to gopls/internal/cache/parse_cache.go index 0e5160c593f..9e96fcf497e 100644 --- a/gopls/internal/lsp/cache/parse_cache.go +++ b/gopls/internal/cache/parse_cache.go @@ -18,7 +18,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/memoize" "golang.org/x/tools/internal/tokeninternal" diff --git a/gopls/internal/lsp/cache/parse_cache_test.go b/gopls/internal/cache/parse_cache_test.go similarity index 100% rename from gopls/internal/lsp/cache/parse_cache_test.go rename to gopls/internal/cache/parse_cache_test.go diff --git a/gopls/internal/lsp/cache/parsego/file.go b/gopls/internal/cache/parsego/file.go similarity index 100% rename from gopls/internal/lsp/cache/parsego/file.go rename to gopls/internal/cache/parsego/file.go diff --git a/gopls/internal/lsp/cache/parsego/parse.go b/gopls/internal/cache/parsego/parse.go similarity index 100% rename from gopls/internal/lsp/cache/parsego/parse.go rename to gopls/internal/cache/parsego/parse.go diff --git a/gopls/internal/lsp/cache/parsego/parse_test.go b/gopls/internal/cache/parsego/parse_test.go similarity index 95% rename from gopls/internal/lsp/cache/parsego/parse_test.go rename to gopls/internal/cache/parsego/parse_test.go index 0c8f00b0c8c..4018e9ed886 100644 --- a/gopls/internal/lsp/cache/parsego/parse_test.go +++ b/gopls/internal/cache/parsego/parse_test.go @@ -10,7 +10,7 @@ import ( "go/token" "testing" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/tokeninternal" ) diff --git a/gopls/internal/lsp/cache/pkg.go b/gopls/internal/cache/pkg.go similarity index 95% rename from gopls/internal/lsp/cache/pkg.go rename to gopls/internal/cache/pkg.go index 80da3817574..3e382ceddcd 100644 --- a/gopls/internal/lsp/cache/pkg.go +++ b/gopls/internal/cache/pkg.go @@ -12,10 +12,10 @@ import ( "go/types" "sync" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/methodsets" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/cache/xrefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/methodsets" + "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/xrefs" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/lsp/cache/port.go b/gopls/internal/cache/port.go similarity index 100% rename from gopls/internal/lsp/cache/port.go rename to gopls/internal/cache/port.go diff --git a/gopls/internal/lsp/cache/port_test.go b/gopls/internal/cache/port_test.go similarity index 100% rename from gopls/internal/lsp/cache/port_test.go rename to gopls/internal/cache/port_test.go diff --git a/gopls/internal/lsp/cache/session.go b/gopls/internal/cache/session.go similarity index 99% rename from gopls/internal/lsp/cache/session.go rename to gopls/internal/cache/session.go index cce7b37cc71..93b3d6bc7d7 100644 --- a/gopls/internal/lsp/cache/session.go +++ b/gopls/internal/cache/session.go @@ -18,8 +18,8 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/persistent" diff --git a/gopls/internal/lsp/cache/session_test.go b/gopls/internal/cache/session_test.go similarity index 100% rename from gopls/internal/lsp/cache/session_test.go rename to gopls/internal/cache/session_test.go diff --git a/gopls/internal/lsp/cache/snapshot.go b/gopls/internal/cache/snapshot.go similarity index 99% rename from gopls/internal/lsp/cache/snapshot.go rename to gopls/internal/cache/snapshot.go index 14520642fe6..251764e271a 100644 --- a/gopls/internal/lsp/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -30,10 +30,10 @@ import ( "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/methodsets" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/cache/xrefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/methodsets" + "golang.org/x/tools/gopls/internal/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/xrefs" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/lsp/cache/symbols.go b/gopls/internal/cache/symbols.go similarity index 100% rename from gopls/internal/lsp/cache/symbols.go rename to gopls/internal/cache/symbols.go diff --git a/gopls/internal/lsp/cache/typerefs/doc.go b/gopls/internal/cache/typerefs/doc.go similarity index 98% rename from gopls/internal/lsp/cache/typerefs/doc.go rename to gopls/internal/cache/typerefs/doc.go index 700da5dde26..18042c623bc 100644 --- a/gopls/internal/lsp/cache/typerefs/doc.go +++ b/gopls/internal/cache/typerefs/doc.go @@ -111,7 +111,7 @@ // The [BuildPackageGraph] constructor implements a whole-graph analysis similar // to that which will be implemented by gopls, but for various reasons the // logic for this analysis will eventually live in the -// [golang.org/x/tools/gopls/internal/lsp/cache] package. Nevertheless, +// [golang.org/x/tools/gopls/internal/cache] package. Nevertheless, // BuildPackageGraph and its test serve to verify the syntactic analysis, and // may serve as a proving ground for new optimizations of the whole-graph analysis. // diff --git a/gopls/internal/lsp/cache/typerefs/packageset.go b/gopls/internal/cache/typerefs/packageset.go similarity index 98% rename from gopls/internal/lsp/cache/typerefs/packageset.go rename to gopls/internal/cache/typerefs/packageset.go index 9d2026f3603..29c37cd1c4c 100644 --- a/gopls/internal/lsp/cache/typerefs/packageset.go +++ b/gopls/internal/cache/typerefs/packageset.go @@ -11,7 +11,7 @@ import ( "strings" "sync" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" ) // PackageIndex stores common data to enable efficient representation of diff --git a/gopls/internal/lsp/cache/typerefs/pkggraph_test.go b/gopls/internal/cache/typerefs/pkggraph_test.go similarity index 97% rename from gopls/internal/lsp/cache/typerefs/pkggraph_test.go rename to gopls/internal/cache/typerefs/pkggraph_test.go index 7c53f40daf3..181a0de8014 100644 --- a/gopls/internal/lsp/cache/typerefs/pkggraph_test.go +++ b/gopls/internal/cache/typerefs/pkggraph_test.go @@ -17,9 +17,9 @@ import ( "sync" "golang.org/x/sync/errgroup" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/lsp/cache/typerefs/pkgrefs_test.go b/gopls/internal/cache/typerefs/pkgrefs_test.go similarity index 97% rename from gopls/internal/lsp/cache/typerefs/pkgrefs_test.go rename to gopls/internal/cache/typerefs/pkgrefs_test.go index 4cc8a82f85b..434ba83460e 100644 --- a/gopls/internal/lsp/cache/typerefs/pkgrefs_test.go +++ b/gopls/internal/cache/typerefs/pkgrefs_test.go @@ -20,9 +20,9 @@ import ( "golang.org/x/tools/go/gcexportdata" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/internal/packagesinternal" @@ -327,7 +327,7 @@ func (s mapMetadataSource) Metadata(id PackageID) *Metadata { } // This function is a compressed version of snapshot.load from the -// internal/lsp/cache package, for use in testing. +// internal/cache package, for use in testing. // // TODO(rfindley): it may be valuable to extract this logic from the snapshot, // since it is otherwise standalone. @@ -386,7 +386,7 @@ func loadPackages(query string, needExport bool) (map[PackageID]string, Metadata for importPath, imported := range pkg.Imports { importPath := ImportPath(importPath) - // see note in gopls/internal/lsp/cache/load.go for an explanation of this check. + // see note in gopls/internal/cache/load.go for an explanation of this check. if importPath != "unsafe" && len(imported.CompiledGoFiles) == 0 { mp.DepsByImpPath[importPath] = "" // missing continue diff --git a/gopls/internal/lsp/cache/typerefs/refs.go b/gopls/internal/cache/typerefs/refs.go similarity index 99% rename from gopls/internal/lsp/cache/typerefs/refs.go rename to gopls/internal/cache/typerefs/refs.go index 53dcd5e4359..b389667ae7f 100644 --- a/gopls/internal/lsp/cache/typerefs/refs.go +++ b/gopls/internal/cache/typerefs/refs.go @@ -11,8 +11,8 @@ import ( "sort" "strings" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/frob" ) diff --git a/gopls/internal/lsp/cache/typerefs/refs_test.go b/gopls/internal/cache/typerefs/refs_test.go similarity index 98% rename from gopls/internal/lsp/cache/typerefs/refs_test.go rename to gopls/internal/cache/typerefs/refs_test.go index bbd0885f819..e73b7b4ea9f 100644 --- a/gopls/internal/lsp/cache/typerefs/refs_test.go +++ b/gopls/internal/cache/typerefs/refs_test.go @@ -12,9 +12,9 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/cache/typerefs" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/lsp/cache/view.go b/gopls/internal/cache/view.go similarity index 99% rename from gopls/internal/lsp/cache/view.go rename to gopls/internal/cache/view.go index 482f479bfc8..bc8587f4aae 100644 --- a/gopls/internal/lsp/cache/view.go +++ b/gopls/internal/cache/view.go @@ -28,7 +28,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/semver" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" diff --git a/gopls/internal/lsp/cache/view_test.go b/gopls/internal/cache/view_test.go similarity index 100% rename from gopls/internal/lsp/cache/view_test.go rename to gopls/internal/cache/view_test.go diff --git a/gopls/internal/lsp/cache/workspace.go b/gopls/internal/cache/workspace.go similarity index 100% rename from gopls/internal/lsp/cache/workspace.go rename to gopls/internal/cache/workspace.go diff --git a/gopls/internal/lsp/cache/xrefs/xrefs.go b/gopls/internal/cache/xrefs/xrefs.go similarity index 98% rename from gopls/internal/lsp/cache/xrefs/xrefs.go rename to gopls/internal/cache/xrefs/xrefs.go index c6a5f04bc73..edb7a3e33d6 100644 --- a/gopls/internal/lsp/cache/xrefs/xrefs.go +++ b/gopls/internal/cache/xrefs/xrefs.go @@ -14,8 +14,8 @@ import ( "sort" "golang.org/x/tools/go/types/objectpath" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/frob" "golang.org/x/tools/gopls/internal/util/typesutil" diff --git a/gopls/internal/cmd/capabilities_test.go b/gopls/internal/cmd/capabilities_test.go index 46861417dc0..f4b22a4d7ee 100644 --- a/gopls/internal/cmd/capabilities_test.go +++ b/gopls/internal/cmd/capabilities_test.go @@ -11,7 +11,7 @@ import ( "path/filepath" "testing" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 4577e50a27a..91654ebdb8a 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -21,9 +21,9 @@ import ( "text/tabwriter" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" diff --git a/gopls/internal/cmd/serve.go b/gopls/internal/cmd/serve.go index 8b9bb762c2f..b3ac163b1c7 100644 --- a/gopls/internal/cmd/serve.go +++ b/gopls/internal/cmd/serve.go @@ -14,8 +14,8 @@ import ( "os" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/telemetry" diff --git a/gopls/internal/debug/serve.go b/gopls/internal/debug/serve.go index 29b4117e4ef..b6670e4966d 100644 --- a/gopls/internal/debug/serve.go +++ b/gopls/internal/debug/serve.go @@ -24,8 +24,8 @@ import ( "sync" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug/log" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/debug/template_test.go b/gopls/internal/debug/template_test.go index 0438c666e90..db940efc602 100644 --- a/gopls/internal/debug/template_test.go +++ b/gopls/internal/debug/template_test.go @@ -21,9 +21,9 @@ import ( "github.com/jba/templatecheck" "golang.org/x/tools/go/packages" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/filecache/filecache.go b/gopls/internal/filecache/filecache.go index 036b185625d..af917578e4f 100644 --- a/gopls/internal/filecache/filecache.go +++ b/gopls/internal/filecache/filecache.go @@ -266,7 +266,7 @@ func SetBudget(new int64) (old int64) { // The current design instead exploits a trick from the cache // implementation used by the go command: writes of small files are in // practice atomic (all or nothing) on all platforms. -// (See GOROOT/src/cmd/go/internal/lsp/cache/cache.go.) +// (See GOROOT/src/cmd/go/internal/cache/cache.go.) // // Russ Cox notes: "all file systems use an rwlock around every file // system block, including data blocks, so any writes or reads within diff --git a/gopls/internal/golang/add_import.go b/gopls/internal/golang/add_import.go index bab1e62349d..c36fd797109 100644 --- a/gopls/internal/golang/add_import.go +++ b/gopls/internal/golang/add_import.go @@ -7,8 +7,8 @@ package golang import ( "context" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/imports" ) diff --git a/gopls/internal/golang/call_hierarchy.go b/gopls/internal/golang/call_hierarchy.go index f4ff802ddcf..f0698294058 100644 --- a/gopls/internal/golang/call_hierarchy.go +++ b/gopls/internal/golang/call_hierarchy.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/change_signature.go b/gopls/internal/golang/change_signature.go index a0584445a49..3105aae9559 100644 --- a/gopls/internal/golang/change_signature.go +++ b/gopls/internal/golang/change_signature.go @@ -17,8 +17,8 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/code_lens.go b/gopls/internal/golang/code_lens.go index 70c8600c26b..e166a688152 100644 --- a/gopls/internal/golang/code_lens.go +++ b/gopls/internal/golang/code_lens.go @@ -13,7 +13,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/golang/codeaction.go b/gopls/internal/golang/codeaction.go index 2a6955679ce..0543800bd89 100644 --- a/gopls/internal/golang/codeaction.go +++ b/gopls/internal/golang/codeaction.go @@ -14,8 +14,8 @@ import ( "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/analysis/fillstruct" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/golang/completion/completion.go b/gopls/internal/golang/completion/completion.go index d76fea48925..228fbcc4ca2 100644 --- a/gopls/internal/golang/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go @@ -30,8 +30,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" goplsastutil "golang.org/x/tools/gopls/internal/util/astutil" diff --git a/gopls/internal/golang/completion/package.go b/gopls/internal/golang/completion/package.go index 187325a66df..3ee62b5ce61 100644 --- a/gopls/internal/golang/completion/package.go +++ b/gopls/internal/golang/completion/package.go @@ -20,7 +20,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/fuzzy" diff --git a/gopls/internal/golang/completion/postfix_snippets.go b/gopls/internal/golang/completion/postfix_snippets.go index c9cfc56a52c..d738eb8d929 100644 --- a/gopls/internal/golang/completion/postfix_snippets.go +++ b/gopls/internal/golang/completion/postfix_snippets.go @@ -18,7 +18,7 @@ import ( "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/completion/statements.go b/gopls/internal/golang/completion/statements.go index 145a93a5a49..24b2235539a 100644 --- a/gopls/internal/golang/completion/statements.go +++ b/gopls/internal/golang/completion/statements.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/golang/definition.go b/gopls/internal/golang/definition.go index b4b6972bb22..ccc127d9c59 100644 --- a/gopls/internal/golang/definition.go +++ b/gopls/internal/golang/definition.go @@ -14,9 +14,9 @@ import ( "go/types" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/diagnostics.go b/gopls/internal/golang/diagnostics.go index 783f9d90042..2106d5a8538 100644 --- a/gopls/internal/golang/diagnostics.go +++ b/gopls/internal/golang/diagnostics.go @@ -7,8 +7,8 @@ package golang import ( "context" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/golang/fix.go b/gopls/internal/golang/fix.go index 8c414f1d2cf..665e81d75c3 100644 --- a/gopls/internal/golang/fix.go +++ b/gopls/internal/golang/fix.go @@ -18,8 +18,8 @@ import ( "golang.org/x/tools/gopls/internal/analysis/undeclaredname" "golang.org/x/tools/gopls/internal/analysis/unusedparams" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/imports" diff --git a/gopls/internal/golang/folding_range.go b/gopls/internal/golang/folding_range.go index 7c27cb558c8..3f71b489da7 100644 --- a/gopls/internal/golang/folding_range.go +++ b/gopls/internal/golang/folding_range.go @@ -12,7 +12,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/format.go b/gopls/internal/golang/format.go index ae0261965f6..5cfcece60c6 100644 --- a/gopls/internal/golang/format.go +++ b/gopls/internal/golang/format.go @@ -18,7 +18,7 @@ import ( "text/scanner" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/gc_annotations.go b/gopls/internal/golang/gc_annotations.go index fc26b4fed46..5383985d1c4 100644 --- a/gopls/internal/golang/gc_annotations.go +++ b/gopls/internal/golang/gc_annotations.go @@ -13,8 +13,8 @@ import ( "path/filepath" "strings" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/gocommand" diff --git a/gopls/internal/golang/highlight.go b/gopls/internal/golang/highlight.go index c960a3feddd..ebfb4133a5f 100644 --- a/gopls/internal/golang/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index 99f2f8b893e..a050c994336 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -26,9 +26,9 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/typeutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/implementation.go b/gopls/internal/golang/implementation.go index 80d9f1551c9..033a8c5ae28 100644 --- a/gopls/internal/golang/implementation.go +++ b/gopls/internal/golang/implementation.go @@ -18,9 +18,9 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/methodsets" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/methodsets" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/inlay_hint.go b/gopls/internal/golang/inlay_hint.go index cf8fa7ae8cf..79c8ea1946d 100644 --- a/gopls/internal/golang/inlay_hint.go +++ b/gopls/internal/golang/inlay_hint.go @@ -14,7 +14,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/inline.go b/gopls/internal/golang/inline.go index fd6fe34ae50..53d33804bd0 100644 --- a/gopls/internal/golang/inline.go +++ b/gopls/internal/golang/inline.go @@ -16,8 +16,8 @@ import ( "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/inline_all.go b/gopls/internal/golang/inline_all.go index 4e072c05e76..b1c10a695fc 100644 --- a/gopls/internal/golang/inline_all.go +++ b/gopls/internal/golang/inline_all.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/refactor/inline" diff --git a/gopls/internal/golang/known_packages.go b/gopls/internal/golang/known_packages.go index ae54e0bd97a..c9887fc2089 100644 --- a/gopls/internal/golang/known_packages.go +++ b/gopls/internal/golang/known_packages.go @@ -14,8 +14,8 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" ) diff --git a/gopls/internal/golang/linkname.go b/gopls/internal/golang/linkname.go index 759b5ae1496..5fb114c0924 100644 --- a/gopls/internal/golang/linkname.go +++ b/gopls/internal/golang/linkname.go @@ -11,8 +11,8 @@ import ( "go/token" "strings" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/golang/references.go b/gopls/internal/golang/references.go index c9263a9bc34..aad3c924562 100644 --- a/gopls/internal/golang/references.go +++ b/gopls/internal/golang/references.go @@ -26,9 +26,9 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/methodsets" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/methodsets" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/rename.go b/gopls/internal/golang/rename.go index 8e0f6aeed9a..700b7032008 100644 --- a/gopls/internal/golang/rename.go +++ b/gopls/internal/golang/rename.go @@ -60,9 +60,9 @@ import ( "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/go/types/typeutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/rename_check.go b/gopls/internal/golang/rename_check.go index 67bc2c1d452..11b154c4e18 100644 --- a/gopls/internal/golang/rename_check.go +++ b/gopls/internal/golang/rename_check.go @@ -43,7 +43,7 @@ import ( "unicode" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/refactor/satisfy" ) diff --git a/gopls/internal/golang/signature_help.go b/gopls/internal/golang/signature_help.go index e53bab9640f..f5ce6030ab0 100644 --- a/gopls/internal/golang/signature_help.go +++ b/gopls/internal/golang/signature_help.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/snapshot.go b/gopls/internal/golang/snapshot.go index 2b1e4739866..9499bb99630 100644 --- a/gopls/internal/golang/snapshot.go +++ b/gopls/internal/golang/snapshot.go @@ -8,9 +8,9 @@ import ( "context" "fmt" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/golang/stub.go b/gopls/internal/golang/stub.go index 2565104095c..6a68ed294e9 100644 --- a/gopls/internal/golang/stub.go +++ b/gopls/internal/golang/stub.go @@ -19,9 +19,9 @@ import ( "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/analysis/stubmethods" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/symbols.go b/gopls/internal/golang/symbols.go index dab6fad958a..9fda67fe4c5 100644 --- a/gopls/internal/golang/symbols.go +++ b/gopls/internal/golang/symbols.go @@ -12,7 +12,7 @@ import ( "go/types" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/type_definition.go b/gopls/internal/golang/type_definition.go index a533ac7766a..b1dab364c5c 100644 --- a/gopls/internal/golang/type_definition.go +++ b/gopls/internal/golang/type_definition.go @@ -10,7 +10,7 @@ import ( "go/token" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/types_format.go b/gopls/internal/golang/types_format.go index 171aedaceb1..d7e35319327 100644 --- a/gopls/internal/golang/types_format.go +++ b/gopls/internal/golang/types_format.go @@ -15,7 +15,7 @@ import ( "go/types" "strings" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/util.go b/gopls/internal/golang/util.go index 6d1b3f6e1ac..82f109cf9fb 100644 --- a/gopls/internal/golang/util.go +++ b/gopls/internal/golang/util.go @@ -13,8 +13,8 @@ import ( "regexp" "strings" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/workspace_symbol.go b/gopls/internal/golang/workspace_symbol.go index 3deb640ddce..c703199b7e5 100644 --- a/gopls/internal/golang/workspace_symbol.go +++ b/gopls/internal/golang/workspace_symbol.go @@ -13,8 +13,8 @@ import ( "strings" "unicode" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/workspace_symbol_test.go b/gopls/internal/golang/workspace_symbol_test.go index 2a8bf5c3a60..4982b767754 100644 --- a/gopls/internal/golang/workspace_symbol_test.go +++ b/gopls/internal/golang/workspace_symbol_test.go @@ -7,7 +7,7 @@ package golang import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" ) func TestParseQuery(t *testing.T) { diff --git a/gopls/internal/lsprpc/lsprpc.go b/gopls/internal/lsprpc/lsprpc.go index 081ebf3276f..de42d2a5486 100644 --- a/gopls/internal/lsprpc/lsprpc.go +++ b/gopls/internal/lsprpc/lsprpc.go @@ -20,7 +20,7 @@ import ( "time" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/server" diff --git a/gopls/internal/lsprpc/lsprpc_test.go b/gopls/internal/lsprpc/lsprpc_test.go index fce5f2a6aa6..3eeb5abcbc5 100644 --- a/gopls/internal/lsprpc/lsprpc_test.go +++ b/gopls/internal/lsprpc/lsprpc_test.go @@ -14,7 +14,7 @@ import ( "time" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/mod/code_lens.go b/gopls/internal/mod/code_lens.go index 23817955d69..c442a53b3ea 100644 --- a/gopls/internal/mod/code_lens.go +++ b/gopls/internal/mod/code_lens.go @@ -11,9 +11,9 @@ import ( "path/filepath" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/mod/diagnostics.go b/gopls/internal/mod/diagnostics.go index c80a56d8115..135f28bc0a8 100644 --- a/gopls/internal/mod/diagnostics.go +++ b/gopls/internal/mod/diagnostics.go @@ -17,8 +17,8 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/semver" "golang.org/x/sync/errgroup" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/mod/format.go b/gopls/internal/mod/format.go index 8bb40852287..13c47ae6c2b 100644 --- a/gopls/internal/mod/format.go +++ b/gopls/internal/mod/format.go @@ -7,8 +7,8 @@ package mod import ( "context" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/mod/hover.go b/gopls/internal/mod/hover.go index 44f32dcea4a..fa946e88987 100644 --- a/gopls/internal/mod/hover.go +++ b/gopls/internal/mod/hover.go @@ -13,8 +13,8 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/semver" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/vulncheck" diff --git a/gopls/internal/mod/inlayhint.go b/gopls/internal/mod/inlayhint.go index 6c0275e9405..5170ac19158 100644 --- a/gopls/internal/mod/inlayhint.go +++ b/gopls/internal/mod/inlayhint.go @@ -8,8 +8,8 @@ import ( "fmt" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index f09ad6f47b7..b4c8fcce6fa 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -12,9 +12,9 @@ import ( "sort" "strings" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index bc64875a20b..b12b3cb7af4 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -22,12 +22,12 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 262910c70d1..5a48e2e06d3 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -16,10 +16,10 @@ import ( "sync" "time" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/server/general.go b/gopls/internal/server/general.go index 90c25c1c6e5..48a5b99cf4c 100644 --- a/gopls/internal/server/general.go +++ b/gopls/internal/server/general.go @@ -20,9 +20,9 @@ import ( "strings" "sync" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" diff --git a/gopls/internal/server/link.go b/gopls/internal/server/link.go index 55d4b6e84ad..9119ea49605 100644 --- a/gopls/internal/server/link.go +++ b/gopls/internal/server/link.go @@ -16,11 +16,11 @@ import ( "sync" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/server/selection_range.go b/gopls/internal/server/selection_range.go index 6090f4df17e..f265596364b 100644 --- a/gopls/internal/server/selection_range.go +++ b/gopls/internal/server/selection_range.go @@ -9,8 +9,8 @@ import ( "fmt" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/semantic.go b/gopls/internal/server/semantic.go index 8e4b3dc8401..3ed720fe4b5 100644 --- a/gopls/internal/server/semantic.go +++ b/gopls/internal/server/semantic.go @@ -18,10 +18,10 @@ import ( "strings" "time" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" - "golang.org/x/tools/gopls/internal/lsp/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/server/server.go b/gopls/internal/server/server.go index fc3de479428..9228420b8c1 100644 --- a/gopls/internal/server/server.go +++ b/gopls/internal/server/server.go @@ -12,7 +12,7 @@ import ( "os" "sync" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/server/text_synchronization.go b/gopls/internal/server/text_synchronization.go index 2991ae98266..f3e0a8b8615 100644 --- a/gopls/internal/server/text_synchronization.go +++ b/gopls/internal/server/text_synchronization.go @@ -12,9 +12,9 @@ import ( "path/filepath" "sync" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/workspace.go b/gopls/internal/server/workspace.go index aa9eed1d496..4245a6491fc 100644 --- a/gopls/internal/server/workspace.go +++ b/gopls/internal/server/workspace.go @@ -9,7 +9,7 @@ import ( "fmt" "sync" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/workspace_symbol.go b/gopls/internal/server/workspace_symbol.go index 53cf7691012..5dd82347a9e 100644 --- a/gopls/internal/server/workspace_symbol.go +++ b/gopls/internal/server/workspace_symbol.go @@ -7,8 +7,8 @@ package server import ( "context" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/template/completion.go b/gopls/internal/template/completion.go index 06ad2e52ae8..daba50b3577 100644 --- a/gopls/internal/template/completion.go +++ b/gopls/internal/template/completion.go @@ -12,8 +12,8 @@ import ( "go/token" "strings" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/template/highlight.go b/gopls/internal/template/highlight.go index ba61f0c7a56..b3ac349df23 100644 --- a/gopls/internal/template/highlight.go +++ b/gopls/internal/template/highlight.go @@ -9,8 +9,8 @@ import ( "fmt" "regexp" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/template/implementations.go b/gopls/internal/template/implementations.go index d82f027deb5..1f8d0cb7165 100644 --- a/gopls/internal/template/implementations.go +++ b/gopls/internal/template/implementations.go @@ -11,8 +11,8 @@ import ( "strconv" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" ) diff --git a/gopls/internal/template/symbols.go b/gopls/internal/template/symbols.go index e0fcab8a3e6..fd27af56b72 100644 --- a/gopls/internal/template/symbols.go +++ b/gopls/internal/template/symbols.go @@ -11,8 +11,8 @@ import ( "text/template/parse" "unicode/utf8" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/test/integration/bench/completion_test.go b/gopls/internal/test/integration/bench/completion_test.go index 9492a9ce2d0..7f155f1dfb9 100644 --- a/gopls/internal/test/integration/bench/completion_test.go +++ b/gopls/internal/test/integration/bench/completion_test.go @@ -75,7 +75,7 @@ func endRangeInBuffer(env *Env, name string) protocol.Range { // Benchmark struct completion in tools codebase. func BenchmarkStructCompletion(b *testing.B) { - file := "internal/lsp/cache/session.go" + file := "internal/cache/session.go" setup := func(env *Env) { env.OpenFile(file) @@ -104,7 +104,7 @@ func BenchmarkImportCompletion(b *testing.B) { // Benchmark slice completion in tools codebase. func BenchmarkSliceCompletion(b *testing.B) { - file := "internal/lsp/cache/session.go" + file := "internal/cache/session.go" setup := func(env *Env) { env.OpenFile(file) diff --git a/gopls/internal/test/integration/bench/definition_test.go b/gopls/internal/test/integration/bench/definition_test.go index b703378a27b..33276e8f966 100644 --- a/gopls/internal/test/integration/bench/definition_test.go +++ b/gopls/internal/test/integration/bench/definition_test.go @@ -20,7 +20,7 @@ func BenchmarkDefinition(b *testing.B) { {"kuma", "api/generic/insights.go", `proto\.(Message)`}, {"pkgsite", "internal/log/log.go", `derrors\.(Wrap)`}, {"starlark", "starlark/eval.go", "prog.compiled.(Encode)"}, - {"tools", "internal/lsp/cache/check.go", `(snapshot)\) buildKey`}, + {"tools", "internal/cache/check.go", `(snapshot)\) buildKey`}, } for _, test := range tests { diff --git a/gopls/internal/test/integration/bench/didchange_test.go b/gopls/internal/test/integration/bench/didchange_test.go index f006a5a97ba..964acfa4872 100644 --- a/gopls/internal/test/integration/bench/didchange_test.go +++ b/gopls/internal/test/integration/bench/didchange_test.go @@ -33,7 +33,7 @@ var didChangeTests = []changeTest{ {"oracle", "dataintegration/data_type.go", false}, // diagnoseSave fails because this package is generated {"pkgsite", "internal/frontend/server.go", true}, {"starlark", "starlark/eval.go", true}, - {"tools", "internal/lsp/cache/snapshot.go", true}, + {"tools", "internal/cache/snapshot.go", true}, } // BenchmarkDidChange benchmarks modifications of a single file by making diff --git a/gopls/internal/test/integration/bench/hover_test.go b/gopls/internal/test/integration/bench/hover_test.go index c3b0c6bc0cb..0b8e8a81a83 100644 --- a/gopls/internal/test/integration/bench/hover_test.go +++ b/gopls/internal/test/integration/bench/hover_test.go @@ -20,7 +20,7 @@ func BenchmarkHover(b *testing.B) { {"kuma", "api/generic/insights.go", `proto\.(Message)`}, {"pkgsite", "internal/log/log.go", `derrors\.(Wrap)`}, {"starlark", "starlark/eval.go", "prog.compiled.(Encode)"}, - {"tools", "internal/lsp/cache/check.go", `(snapshot)\) buildKey`}, + {"tools", "internal/cache/check.go", `(snapshot)\) buildKey`}, } for _, test := range tests { diff --git a/gopls/internal/test/integration/bench/iwl_test.go b/gopls/internal/test/integration/bench/iwl_test.go index 2fa9724dc0e..83462eb2617 100644 --- a/gopls/internal/test/integration/bench/iwl_test.go +++ b/gopls/internal/test/integration/bench/iwl_test.go @@ -27,7 +27,7 @@ func BenchmarkInitialWorkspaceLoad(b *testing.B) { {"oracle", "dataintegration/data_type.go"}, {"pkgsite", "internal/frontend/server.go"}, {"starlark", "starlark/eval.go"}, - {"tools", "internal/lsp/cache/snapshot.go"}, + {"tools", "internal/cache/snapshot.go"}, {"hashiform", "internal/provider/provider.go"}, } diff --git a/gopls/internal/test/integration/bench/rename_test.go b/gopls/internal/test/integration/bench/rename_test.go index ca5ed5f4397..3b7013c890c 100644 --- a/gopls/internal/test/integration/bench/rename_test.go +++ b/gopls/internal/test/integration/bench/rename_test.go @@ -22,7 +22,7 @@ func BenchmarkRename(b *testing.B) { {"kuma", "pkg/events/interfaces.go", `Delete`, "Delete"}, {"pkgsite", "internal/log/log.go", `func (Infof)`, "Infof"}, {"starlark", "starlark/eval.go", `Program\) (Filename)`, "Filename"}, - {"tools", "internal/lsp/cache/snapshot.go", `meta \*(metadataGraph)`, "metadataGraph"}, + {"tools", "internal/cache/snapshot.go", `meta \*(metadataGraph)`, "metadataGraph"}, } for _, test := range tests { diff --git a/gopls/internal/test/integration/bench/stress_test.go b/gopls/internal/test/integration/bench/stress_test.go index e0bd305907a..4ec272f5002 100644 --- a/gopls/internal/test/integration/bench/stress_test.go +++ b/gopls/internal/test/integration/bench/stress_test.go @@ -11,8 +11,8 @@ import ( "testing" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/test/integration/diagnostics/analysis_test.go b/gopls/internal/test/integration/diagnostics/analysis_test.go index 403dc1657d8..7c20c9d27a9 100644 --- a/gopls/internal/test/integration/diagnostics/analysis_test.go +++ b/gopls/internal/test/integration/diagnostics/analysis_test.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/diagnostics/golist_test.go b/gopls/internal/test/integration/diagnostics/golist_test.go index 91b9848df3f..8c11246d3e1 100644 --- a/gopls/internal/test/integration/diagnostics/golist_test.go +++ b/gopls/internal/test/integration/diagnostics/golist_test.go @@ -7,7 +7,7 @@ package diagnostics import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/test/integration/misc/vuln_test.go b/gopls/internal/test/integration/misc/vuln_test.go index a0d260cf43d..224c9561b0b 100644 --- a/gopls/internal/test/integration/misc/vuln_test.go +++ b/gopls/internal/test/integration/misc/vuln_test.go @@ -17,7 +17,7 @@ import ( "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/test/compare" diff --git a/gopls/internal/test/integration/regtest.go b/gopls/internal/test/integration/regtest.go index 169852e6c69..4e26fd79d5b 100644 --- a/gopls/internal/test/integration/regtest.go +++ b/gopls/internal/test/integration/regtest.go @@ -13,8 +13,8 @@ import ( "testing" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cmd" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/memoize" diff --git a/gopls/internal/test/integration/runner.go b/gopls/internal/test/integration/runner.go index 626b03b4784..0242af52bf8 100644 --- a/gopls/internal/test/integration/runner.go +++ b/gopls/internal/test/integration/runner.go @@ -20,8 +20,8 @@ import ( "testing" "time" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/test/integration/watch/watch_test.go b/gopls/internal/test/integration/watch/watch_test.go index c401d96079f..52017a3d7a6 100644 --- a/gopls/internal/test/integration/watch/watch_test.go +++ b/gopls/internal/test/integration/watch/watch_test.go @@ -258,7 +258,7 @@ func _() { } // Add a new method to an interface and implement it. -// Inspired by the structure of internal/lsp/source and internal/lsp/cache. +// Inspired by the structure of internal/lsp/source and internal/cache. func TestCreateImplementation(t *testing.T) { const pkg = ` -- go.mod -- diff --git a/gopls/internal/test/integration/workspace/zero_config_test.go b/gopls/internal/test/integration/workspace/zero_config_test.go index dd75c591ddb..d0535e0f1e2 100644 --- a/gopls/internal/test/integration/workspace/zero_config_test.go +++ b/gopls/internal/test/integration/workspace/zero_config_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" . "golang.org/x/tools/gopls/internal/test/integration" diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 8c540079bf0..d07ad029ea5 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -30,9 +30,9 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/go/expect" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/test/compare" diff --git a/gopls/internal/vulncheck/scan/command.go b/gopls/internal/vulncheck/scan/command.go index f8d84e3bf38..1f53d8b55f3 100644 --- a/gopls/internal/vulncheck/scan/command.go +++ b/gopls/internal/vulncheck/scan/command.go @@ -18,7 +18,7 @@ import ( "time" "golang.org/x/sync/errgroup" - "golang.org/x/tools/gopls/internal/lsp/cache" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" "golang.org/x/tools/gopls/internal/vulncheck/osv" diff --git a/gopls/internal/work/completion.go b/gopls/internal/work/completion.go index f8aa20d67bd..8d43533f208 100644 --- a/gopls/internal/work/completion.go +++ b/gopls/internal/work/completion.go @@ -14,8 +14,8 @@ import ( "sort" "strings" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/work/diagnostics.go b/gopls/internal/work/diagnostics.go index 70147d6a959..c0b449d9ca2 100644 --- a/gopls/internal/work/diagnostics.go +++ b/gopls/internal/work/diagnostics.go @@ -11,8 +11,8 @@ import ( "path/filepath" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/work/format.go b/gopls/internal/work/format.go index 8ef81f34e2a..1a83e1157fa 100644 --- a/gopls/internal/work/format.go +++ b/gopls/internal/work/format.go @@ -8,8 +8,8 @@ import ( "context" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/work/hover.go b/gopls/internal/work/hover.go index 66c40a81f29..531a3f79bb0 100644 --- a/gopls/internal/work/hover.go +++ b/gopls/internal/work/hover.go @@ -10,8 +10,8 @@ import ( "fmt" "golang.org/x/mod/modfile" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/cache" "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/internal/event" ) From 6d109d1133da8b25c847b69458614b0ab44da0fb Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 15:35:40 -0500 Subject: [PATCH 054/105] gopls/internal/protocol: move out of lsp/ Change-Id: Id7386bc2c2e84ba9db3c6aa147e89e3704012cb4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557719 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> --- gopls/doc/commands.md | 10 +++++----- gopls/doc/design/implementation.md | 2 +- gopls/doc/design/integrating.md | 6 +++--- gopls/internal/cache/analysis.go | 2 +- gopls/internal/cache/check.go | 2 +- gopls/internal/cache/diagnostics.go | 2 +- gopls/internal/cache/errors.go | 2 +- gopls/internal/cache/errors_test.go | 2 +- gopls/internal/cache/filemap.go | 2 +- gopls/internal/cache/filemap_test.go | 2 +- gopls/internal/cache/fs_memoized.go | 2 +- gopls/internal/cache/fs_overlay.go | 2 +- gopls/internal/cache/load.go | 2 +- gopls/internal/cache/metadata/graph.go | 2 +- gopls/internal/cache/metadata/metadata.go | 2 +- gopls/internal/cache/mod.go | 2 +- gopls/internal/cache/mod_tidy.go | 2 +- gopls/internal/cache/mod_vuln.go | 2 +- gopls/internal/cache/parse_cache.go | 2 +- gopls/internal/cache/parse_cache_test.go | 2 +- gopls/internal/cache/parsego/file.go | 2 +- gopls/internal/cache/parsego/parse.go | 2 +- gopls/internal/cache/pkg.go | 2 +- gopls/internal/cache/port_test.go | 2 +- gopls/internal/cache/session.go | 2 +- gopls/internal/cache/session_test.go | 2 +- gopls/internal/cache/snapshot.go | 2 +- gopls/internal/cache/symbols.go | 2 +- gopls/internal/cache/typerefs/pkggraph_test.go | 2 +- gopls/internal/cache/typerefs/pkgrefs_test.go | 2 +- gopls/internal/cache/typerefs/refs_test.go | 2 +- gopls/internal/cache/view.go | 2 +- gopls/internal/cache/view_test.go | 2 +- gopls/internal/cache/workspace.go | 2 +- gopls/internal/cache/xrefs/xrefs.go | 2 +- gopls/internal/cmd/call_hierarchy.go | 2 +- gopls/internal/cmd/capabilities_test.go | 2 +- gopls/internal/cmd/check.go | 2 +- gopls/internal/cmd/cmd.go | 2 +- gopls/internal/cmd/codelens.go | 2 +- gopls/internal/cmd/definition.go | 2 +- gopls/internal/cmd/execute.go | 2 +- gopls/internal/cmd/folding_range.go | 2 +- gopls/internal/cmd/format.go | 2 +- gopls/internal/cmd/highlight.go | 2 +- gopls/internal/cmd/implementation.go | 2 +- gopls/internal/cmd/imports.go | 2 +- gopls/internal/cmd/integration_test.go | 2 +- gopls/internal/cmd/links.go | 2 +- gopls/internal/cmd/parsespan.go | 2 +- gopls/internal/cmd/prepare_rename.go | 2 +- gopls/internal/cmd/references.go | 2 +- gopls/internal/cmd/rename.go | 2 +- gopls/internal/cmd/semantictokens.go | 2 +- gopls/internal/cmd/serve.go | 2 +- gopls/internal/cmd/signature.go | 2 +- gopls/internal/cmd/span.go | 4 ++-- gopls/internal/cmd/stats.go | 2 +- gopls/internal/cmd/suggested_fix.go | 2 +- gopls/internal/cmd/symbols.go | 2 +- gopls/internal/cmd/workspace_symbol.go | 2 +- gopls/internal/debug/serve.go | 2 +- gopls/internal/file/file.go | 2 +- gopls/internal/file/modification.go | 2 +- gopls/internal/golang/add_import.go | 2 +- gopls/internal/golang/call_hierarchy.go | 2 +- gopls/internal/golang/change_quote.go | 2 +- gopls/internal/golang/change_signature.go | 2 +- gopls/internal/golang/code_lens.go | 2 +- gopls/internal/golang/codeaction.go | 2 +- gopls/internal/golang/completion/completion.go | 6 +++--- gopls/internal/golang/completion/definition.go | 2 +- gopls/internal/golang/completion/format.go | 2 +- gopls/internal/golang/completion/fuzz.go | 2 +- gopls/internal/golang/completion/keywords.go | 2 +- gopls/internal/golang/completion/literal.go | 2 +- gopls/internal/golang/completion/package.go | 4 ++-- gopls/internal/golang/completion/postfix_snippets.go | 4 ++-- gopls/internal/golang/completion/statements.go | 4 ++-- gopls/internal/golang/completion/util.go | 2 +- gopls/internal/golang/definition.go | 2 +- gopls/internal/golang/diagnostics.go | 2 +- gopls/internal/golang/embeddirective.go | 2 +- gopls/internal/golang/fix.go | 2 +- gopls/internal/golang/folding_range.go | 2 +- gopls/internal/golang/format.go | 2 +- gopls/internal/golang/gc_annotations.go | 2 +- gopls/internal/golang/highlight.go | 2 +- gopls/internal/golang/hover.go | 2 +- gopls/internal/golang/implementation.go | 2 +- gopls/internal/golang/inlay_hint.go | 2 +- gopls/internal/golang/inline.go | 2 +- gopls/internal/golang/inline_all.go | 2 +- gopls/internal/golang/linkname.go | 2 +- gopls/internal/golang/references.go | 2 +- gopls/internal/golang/rename.go | 2 +- gopls/internal/golang/signature_help.go | 2 +- gopls/internal/golang/snapshot.go | 2 +- gopls/internal/golang/symbols.go | 2 +- gopls/internal/golang/type_definition.go | 2 +- gopls/internal/golang/types_format.go | 2 +- gopls/internal/golang/util.go | 2 +- gopls/internal/golang/workspace_symbol.go | 2 +- gopls/internal/hooks/analysis_119.go | 2 +- gopls/internal/lsp/command/command_gen.go | 2 +- gopls/internal/lsp/command/gen/gen.go | 2 +- gopls/internal/lsp/command/interface.go | 2 +- gopls/internal/lsprpc/binder_test.go | 2 +- gopls/internal/lsprpc/commandinterceptor_test.go | 2 +- gopls/internal/lsprpc/export_test.go | 2 +- gopls/internal/lsprpc/goenv_test.go | 2 +- gopls/internal/lsprpc/lsprpc.go | 2 +- gopls/internal/lsprpc/lsprpc_test.go | 2 +- gopls/internal/mod/code_lens.go | 2 +- gopls/internal/mod/diagnostics.go | 2 +- gopls/internal/mod/format.go | 2 +- gopls/internal/mod/hover.go | 2 +- gopls/internal/mod/inlayhint.go | 2 +- gopls/internal/progress/progress.go | 2 +- gopls/internal/progress/progress_test.go | 2 +- gopls/internal/{lsp => }/protocol/codeactionkind.go | 0 gopls/internal/{lsp => }/protocol/context.go | 0 gopls/internal/{lsp => }/protocol/doc.go | 0 gopls/internal/{lsp => }/protocol/edits.go | 0 gopls/internal/{lsp => }/protocol/enums.go | 0 gopls/internal/{lsp => }/protocol/generate/README.md | 0 gopls/internal/{lsp => }/protocol/generate/generate.go | 0 gopls/internal/{lsp => }/protocol/generate/main.go | 0 .../internal/{lsp => }/protocol/generate/main_test.go | 0 gopls/internal/{lsp => }/protocol/generate/output.go | 0 gopls/internal/{lsp => }/protocol/generate/tables.go | 0 .../internal/{lsp => }/protocol/generate/typenames.go | 0 gopls/internal/{lsp => }/protocol/generate/types.go | 0 gopls/internal/{lsp => }/protocol/json_test.go | 4 ++-- gopls/internal/{lsp => }/protocol/log.go | 0 gopls/internal/{lsp => }/protocol/mapper.go | 0 gopls/internal/{lsp => }/protocol/mapper_test.go | 2 +- gopls/internal/{lsp => }/protocol/protocol.go | 0 gopls/internal/{lsp => }/protocol/semantic.go | 0 gopls/internal/{lsp => }/protocol/span.go | 0 gopls/internal/{lsp => }/protocol/tsclient.go | 0 .../internal/{lsp => }/protocol/tsdocument_changes.go | 0 gopls/internal/{lsp => }/protocol/tsjson.go | 0 gopls/internal/{lsp => }/protocol/tsprotocol.go | 0 gopls/internal/{lsp => }/protocol/tsserver.go | 0 gopls/internal/{lsp => }/protocol/uri.go | 0 gopls/internal/{lsp => }/protocol/uri_test.go | 2 +- gopls/internal/{lsp => }/protocol/uri_windows_test.go | 2 +- gopls/internal/server/call_hierarchy.go | 2 +- gopls/internal/server/code_action.go | 2 +- gopls/internal/server/code_lens.go | 2 +- gopls/internal/server/command.go | 2 +- gopls/internal/server/completion.go | 2 +- gopls/internal/server/definition.go | 2 +- gopls/internal/server/diagnostics.go | 2 +- gopls/internal/server/folding_range.go | 2 +- gopls/internal/server/format.go | 2 +- gopls/internal/server/general.go | 2 +- gopls/internal/server/highlight.go | 2 +- gopls/internal/server/hover.go | 2 +- gopls/internal/server/implementation.go | 2 +- gopls/internal/server/inlay_hint.go | 2 +- gopls/internal/server/link.go | 2 +- gopls/internal/server/prompt.go | 2 +- gopls/internal/server/references.go | 2 +- gopls/internal/server/rename.go | 2 +- gopls/internal/server/selection_range.go | 2 +- gopls/internal/server/semantic.go | 2 +- gopls/internal/server/server.go | 2 +- gopls/internal/server/signature_help.go | 2 +- gopls/internal/server/symbols.go | 2 +- gopls/internal/server/text_synchronization.go | 2 +- gopls/internal/server/unimplemented.go | 2 +- gopls/internal/server/workspace.go | 2 +- gopls/internal/server/workspace_symbol.go | 2 +- gopls/internal/settings/analyzer.go | 2 +- gopls/internal/settings/api_json.go | 6 +++--- gopls/internal/settings/default.go | 2 +- gopls/internal/settings/settings.go | 2 +- gopls/internal/telemetry/telemetry.go | 2 +- gopls/internal/telemetry/telemetry_go118.go | 2 +- gopls/internal/telemetry/telemetry_test.go | 2 +- gopls/internal/template/completion.go | 2 +- gopls/internal/template/completion_test.go | 2 +- gopls/internal/template/highlight.go | 2 +- gopls/internal/template/implementations.go | 2 +- gopls/internal/template/parse.go | 2 +- gopls/internal/template/symbols.go | 2 +- .../internal/test/integration/bench/codeaction_test.go | 2 +- .../internal/test/integration/bench/completion_test.go | 2 +- .../internal/test/integration/bench/didchange_test.go | 2 +- gopls/internal/test/integration/bench/iwl_test.go | 2 +- gopls/internal/test/integration/bench/typing_test.go | 2 +- .../test/integration/codelens/codelens_test.go | 2 +- .../test/integration/codelens/gcdetails_test.go | 2 +- .../test/integration/completion/completion18_test.go | 2 +- .../test/integration/completion/completion_test.go | 2 +- gopls/internal/test/integration/debug/debug_test.go | 2 +- .../test/integration/diagnostics/analysis_test.go | 2 +- .../test/integration/diagnostics/diagnostics_test.go | 2 +- .../test/integration/diagnostics/invalidation_test.go | 2 +- .../test/integration/diagnostics/undeclared_test.go | 2 +- gopls/internal/test/integration/env.go | 2 +- gopls/internal/test/integration/env_test.go | 2 +- gopls/internal/test/integration/expectation.go | 2 +- gopls/internal/test/integration/fake/client.go | 2 +- gopls/internal/test/integration/fake/edit.go | 2 +- gopls/internal/test/integration/fake/edit_test.go | 2 +- gopls/internal/test/integration/fake/editor.go | 2 +- gopls/internal/test/integration/fake/editor_test.go | 2 +- gopls/internal/test/integration/fake/workdir.go | 2 +- gopls/internal/test/integration/fake/workdir_test.go | 2 +- .../test/integration/misc/call_hierarchy_test.go | 2 +- .../internal/test/integration/misc/debugserver_test.go | 2 +- .../internal/test/integration/misc/definition_test.go | 4 ++-- gopls/internal/test/integration/misc/extract_test.go | 4 ++-- gopls/internal/test/integration/misc/fix_test.go | 2 +- gopls/internal/test/integration/misc/highlight_test.go | 2 +- gopls/internal/test/integration/misc/hover_test.go | 2 +- gopls/internal/test/integration/misc/import_test.go | 4 ++-- gopls/internal/test/integration/misc/imports_test.go | 4 ++-- gopls/internal/test/integration/misc/misc_test.go | 2 +- gopls/internal/test/integration/misc/prompt_test.go | 4 ++-- .../internal/test/integration/misc/references_test.go | 2 +- gopls/internal/test/integration/misc/rename_test.go | 4 ++-- .../test/integration/misc/semantictokens_test.go | 2 +- .../test/integration/misc/signature_help_test.go | 2 +- gopls/internal/test/integration/misc/vendor_test.go | 2 +- gopls/internal/test/integration/misc/vuln_test.go | 2 +- .../internal/test/integration/modfile/modfile_test.go | 2 +- gopls/internal/test/integration/options.go | 2 +- gopls/internal/test/integration/runner.go | 2 +- .../test/integration/template/template_test.go | 2 +- gopls/internal/test/integration/watch/watch_test.go | 2 +- .../test/integration/workspace/quickfix_test.go | 2 +- .../test/integration/workspace/standalone_test.go | 2 +- .../test/integration/workspace/workspace_test.go | 2 +- gopls/internal/test/integration/wrappers.go | 2 +- gopls/internal/test/marker/marker_test.go | 2 +- gopls/internal/vulncheck/vulntest/db.go | 2 +- gopls/internal/vulncheck/vulntest/db_test.go | 2 +- gopls/internal/work/completion.go | 2 +- gopls/internal/work/diagnostics.go | 2 +- gopls/internal/work/format.go | 2 +- gopls/internal/work/hover.go | 2 +- internal/diff/lcs/git.sh | 2 +- 246 files changed, 243 insertions(+), 243 deletions(-) rename gopls/internal/{lsp => }/protocol/codeactionkind.go (100%) rename gopls/internal/{lsp => }/protocol/context.go (100%) rename gopls/internal/{lsp => }/protocol/doc.go (100%) rename gopls/internal/{lsp => }/protocol/edits.go (100%) rename gopls/internal/{lsp => }/protocol/enums.go (100%) rename gopls/internal/{lsp => }/protocol/generate/README.md (100%) rename gopls/internal/{lsp => }/protocol/generate/generate.go (100%) rename gopls/internal/{lsp => }/protocol/generate/main.go (100%) rename gopls/internal/{lsp => }/protocol/generate/main_test.go (100%) rename gopls/internal/{lsp => }/protocol/generate/output.go (100%) rename gopls/internal/{lsp => }/protocol/generate/tables.go (100%) rename gopls/internal/{lsp => }/protocol/generate/typenames.go (100%) rename gopls/internal/{lsp => }/protocol/generate/types.go (100%) rename gopls/internal/{lsp => }/protocol/json_test.go (92%) rename gopls/internal/{lsp => }/protocol/log.go (100%) rename gopls/internal/{lsp => }/protocol/mapper.go (100%) rename gopls/internal/{lsp => }/protocol/mapper_test.go (99%) rename gopls/internal/{lsp => }/protocol/protocol.go (100%) rename gopls/internal/{lsp => }/protocol/semantic.go (100%) rename gopls/internal/{lsp => }/protocol/span.go (100%) rename gopls/internal/{lsp => }/protocol/tsclient.go (100%) rename gopls/internal/{lsp => }/protocol/tsdocument_changes.go (100%) rename gopls/internal/{lsp => }/protocol/tsjson.go (100%) rename gopls/internal/{lsp => }/protocol/tsprotocol.go (100%) rename gopls/internal/{lsp => }/protocol/tsserver.go (100%) rename gopls/internal/{lsp => }/protocol/uri.go (100%) rename gopls/internal/{lsp => }/protocol/uri_test.go (98%) rename gopls/internal/{lsp => }/protocol/uri_windows_test.go (98%) diff --git a/gopls/doc/commands.md b/gopls/doc/commands.md index 262b2a366d1..6a651faf467 100644 --- a/gopls/doc/commands.md +++ b/gopls/doc/commands.md @@ -98,7 +98,7 @@ Result: ``` { // Holds changes to existing resources. - "changes": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit, + "changes": map[golang.org/x/tools/gopls/internal/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/protocol.TextEdit, // Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes // are either an array of `TextDocumentEdit`s to express changes to n different text documents // where each text document edit addresses a specific version of a text document. Or it can contain @@ -128,7 +128,7 @@ Result: // Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`. // // @since 3.16.0 - "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation, + "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/protocol.ChangeAnnotation, } ``` @@ -159,7 +159,7 @@ Result: ``` { // Holds changes to existing resources. - "changes": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit, + "changes": map[golang.org/x/tools/gopls/internal/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/protocol.TextEdit, // Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes // are either an array of `TextDocumentEdit`s to express changes to n different text documents // where each text document edit addresses a specific version of a text document. Or it can contain @@ -189,7 +189,7 @@ Result: // Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`. // // @since 3.16.0 - "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation, + "changeAnnotations": map[string]golang.org/x/tools/gopls/internal/protocol.ChangeAnnotation, } ``` @@ -255,7 +255,7 @@ Args: Result: ``` -map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI]*golang.org/x/tools/gopls/internal/vulncheck.Result +map[golang.org/x/tools/gopls/internal/protocol.DocumentURI]*golang.org/x/tools/gopls/internal/vulncheck.Result ``` ### **Toggle gc_details** diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index 418ea4601e1..8bd3c693db0 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -162,7 +162,7 @@ provided as a debugging aid (but see [methodsets]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/methodsets [mod]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/mod [parsego]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/parsego -[protocol]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/protocol +[protocol]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/protocol [server]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/server [settings]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/settings [source]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/source diff --git a/gopls/doc/design/integrating.md b/gopls/doc/design/integrating.md index 3448402e49e..2d8e01a76c0 100644 --- a/gopls/doc/design/integrating.md +++ b/gopls/doc/design/integrating.md @@ -59,9 +59,9 @@ For instance, files that are needed to do correct type checking are modified by Monitoring files inside gopls directly has a lot of awkward problems, but the [LSP specification] has methods that allow gopls to request that the client notify it of file system changes, specifically [`workspace/didChangeWatchedFiles`]. This is currently being added to gopls by a community member, and tracked in [#31553] -[InitializeResult]: https://pkg.go.dev/golang.org/x/tools/gopls/internal/lsp/protocol#InitializeResult -[ServerCapabilities]: https://pkg.go.dev/golang.org/x/tools/gopls/internal/lsp/protocol#ServerCapabilities -[`golang.org/x/tools/gopls/internal/lsp/protocol`]: https://pkg.go.dev/golang.org/x/tools/internal/lsp/protocol#NewPoint +[InitializeResult]: https://pkg.go.dev/golang.org/x/tools/gopls/internal/protocol#InitializeResult +[ServerCapabilities]: https://pkg.go.dev/golang.org/x/tools/gopls/internal/protocol#ServerCapabilities +[`golang.org/x/tools/gopls/internal/protocol`]: https://pkg.go.dev/golang.org/x/tools/internal/protocol#NewPoint [LSP specification]: https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/ [lsp-response]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#response-message diff --git a/gopls/internal/cache/analysis.go b/gopls/internal/cache/analysis.go index 35c68dcbc3a..0b7bc08d378 100644 --- a/gopls/internal/cache/analysis.go +++ b/gopls/internal/cache/analysis.go @@ -35,7 +35,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/astutil" diff --git a/gopls/internal/cache/check.go b/gopls/internal/cache/check.go index 0fabdcacdcc..33ba4a4638e 100644 --- a/gopls/internal/cache/check.go +++ b/gopls/internal/cache/check.go @@ -26,7 +26,7 @@ import ( "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/analysisinternal" diff --git a/gopls/internal/cache/diagnostics.go b/gopls/internal/cache/diagnostics.go index 07b4e905d61..ed4d21ac3ee 100644 --- a/gopls/internal/cache/diagnostics.go +++ b/gopls/internal/cache/diagnostics.go @@ -8,7 +8,7 @@ import ( "encoding/json" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" ) diff --git a/gopls/internal/cache/errors.go b/gopls/internal/cache/errors.go index df49cc111cb..2ec6c63502e 100644 --- a/gopls/internal/cache/errors.go +++ b/gopls/internal/cache/errors.go @@ -24,7 +24,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/typesinternal" diff --git a/gopls/internal/cache/errors_test.go b/gopls/internal/cache/errors_test.go index 38bd652c649..56b29c3c55b 100644 --- a/gopls/internal/cache/errors_test.go +++ b/gopls/internal/cache/errors_test.go @@ -11,7 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestParseErrorMessage(t *testing.T) { diff --git a/gopls/internal/cache/filemap.go b/gopls/internal/cache/filemap.go index 9e93ab594e6..ee64d7c32c3 100644 --- a/gopls/internal/cache/filemap.go +++ b/gopls/internal/cache/filemap.go @@ -8,7 +8,7 @@ import ( "path/filepath" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/persistent" ) diff --git a/gopls/internal/cache/filemap_test.go b/gopls/internal/cache/filemap_test.go index 1b661c792d5..13f2c1a9ccd 100644 --- a/gopls/internal/cache/filemap_test.go +++ b/gopls/internal/cache/filemap_test.go @@ -11,7 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestFileMap(t *testing.T) { diff --git a/gopls/internal/cache/fs_memoized.go b/gopls/internal/cache/fs_memoized.go index d26ec68bafe..dd8293fad75 100644 --- a/gopls/internal/cache/fs_memoized.go +++ b/gopls/internal/cache/fs_memoized.go @@ -11,7 +11,7 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/robustio" diff --git a/gopls/internal/cache/fs_overlay.go b/gopls/internal/cache/fs_overlay.go index fe089cfdd06..265598bb967 100644 --- a/gopls/internal/cache/fs_overlay.go +++ b/gopls/internal/cache/fs_overlay.go @@ -9,7 +9,7 @@ import ( "sync" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // An overlayFS is a file.Source that keeps track of overlays on top of a diff --git a/gopls/internal/cache/load.go b/gopls/internal/cache/load.go index b95f91f9119..aa9d9bd0d8f 100644 --- a/gopls/internal/cache/load.go +++ b/gopls/internal/cache/load.go @@ -18,7 +18,7 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/immutable" "golang.org/x/tools/gopls/internal/util/pathutil" diff --git a/gopls/internal/cache/metadata/graph.go b/gopls/internal/cache/metadata/graph.go index ca8c68343fe..ca550d7ce6a 100644 --- a/gopls/internal/cache/metadata/graph.go +++ b/gopls/internal/cache/metadata/graph.go @@ -8,7 +8,7 @@ import ( "sort" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" ) diff --git a/gopls/internal/cache/metadata/metadata.go b/gopls/internal/cache/metadata/metadata.go index 922605c0eed..b6355166640 100644 --- a/gopls/internal/cache/metadata/metadata.go +++ b/gopls/internal/cache/metadata/metadata.go @@ -20,7 +20,7 @@ import ( "strings" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/packagesinternal" ) diff --git a/gopls/internal/cache/mod.go b/gopls/internal/cache/mod.go index 6d83166cfbe..87d3f0d81fd 100644 --- a/gopls/internal/cache/mod.go +++ b/gopls/internal/cache/mod.go @@ -16,7 +16,7 @@ import ( "golang.org/x/mod/module" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/gocommand" diff --git a/gopls/internal/cache/mod_tidy.go b/gopls/internal/cache/mod_tidy.go index 89054e0fa79..7bf06eb3cd3 100644 --- a/gopls/internal/cache/mod_tidy.go +++ b/gopls/internal/cache/mod_tidy.go @@ -18,7 +18,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/cache/mod_vuln.go b/gopls/internal/cache/mod_vuln.go index 92d37938424..a92f5b5abe1 100644 --- a/gopls/internal/cache/mod_vuln.go +++ b/gopls/internal/cache/mod_vuln.go @@ -17,7 +17,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" "golang.org/x/tools/gopls/internal/vulncheck/osv" diff --git a/gopls/internal/cache/parse_cache.go b/gopls/internal/cache/parse_cache.go index 9e96fcf497e..55eced51403 100644 --- a/gopls/internal/cache/parse_cache.go +++ b/gopls/internal/cache/parse_cache.go @@ -19,7 +19,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/memoize" "golang.org/x/tools/internal/tokeninternal" ) diff --git a/gopls/internal/cache/parse_cache_test.go b/gopls/internal/cache/parse_cache_test.go index 61a204d5d20..eee7ded39af 100644 --- a/gopls/internal/cache/parse_cache_test.go +++ b/gopls/internal/cache/parse_cache_test.go @@ -13,7 +13,7 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func skipIfNoParseCache(t *testing.T) { diff --git a/gopls/internal/cache/parsego/file.go b/gopls/internal/cache/parsego/file.go index 6f47ca35580..3e13d5b2c43 100644 --- a/gopls/internal/cache/parsego/file.go +++ b/gopls/internal/cache/parsego/file.go @@ -10,7 +10,7 @@ import ( "go/scanner" "go/token" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/cache/parsego/parse.go b/gopls/internal/cache/parsego/parse.go index 575699f6e48..89fc15fb279 100644 --- a/gopls/internal/cache/parsego/parse.go +++ b/gopls/internal/cache/parsego/parse.go @@ -14,7 +14,7 @@ import ( "go/token" "reflect" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/cache/pkg.go b/gopls/internal/cache/pkg.go index 3e382ceddcd..821b1cc48e8 100644 --- a/gopls/internal/cache/pkg.go +++ b/gopls/internal/cache/pkg.go @@ -16,7 +16,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/methodsets" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/cache/xrefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // Convenient aliases for very heavily used types. diff --git a/gopls/internal/cache/port_test.go b/gopls/internal/cache/port_test.go index 96ba31846f8..3c38a1184f0 100644 --- a/gopls/internal/cache/port_test.go +++ b/gopls/internal/cache/port_test.go @@ -12,7 +12,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 93b3d6bc7d7..3ca175a6542 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -20,7 +20,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/persistent" "golang.org/x/tools/gopls/internal/vulncheck" diff --git a/gopls/internal/cache/session_test.go b/gopls/internal/cache/session_test.go index 11046a21214..e71340a8591 100644 --- a/gopls/internal/cache/session_test.go +++ b/gopls/internal/cache/session_test.go @@ -12,7 +12,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/cache/snapshot.go b/gopls/internal/cache/snapshot.go index 251764e271a..376345c3be5 100644 --- a/gopls/internal/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -35,7 +35,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/cache/xrefs" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/constraints" diff --git a/gopls/internal/cache/symbols.go b/gopls/internal/cache/symbols.go index d2c9015361e..5dce87df223 100644 --- a/gopls/internal/cache/symbols.go +++ b/gopls/internal/cache/symbols.go @@ -12,7 +12,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/astutil" ) diff --git a/gopls/internal/cache/typerefs/pkggraph_test.go b/gopls/internal/cache/typerefs/pkggraph_test.go index 181a0de8014..01cd1a86f0f 100644 --- a/gopls/internal/cache/typerefs/pkggraph_test.go +++ b/gopls/internal/cache/typerefs/pkggraph_test.go @@ -20,7 +20,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) const ( diff --git a/gopls/internal/cache/typerefs/pkgrefs_test.go b/gopls/internal/cache/typerefs/pkgrefs_test.go index 434ba83460e..da14b90cba3 100644 --- a/gopls/internal/cache/typerefs/pkgrefs_test.go +++ b/gopls/internal/cache/typerefs/pkgrefs_test.go @@ -23,7 +23,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/internal/packagesinternal" "golang.org/x/tools/internal/testenv" diff --git a/gopls/internal/cache/typerefs/refs_test.go b/gopls/internal/cache/typerefs/refs_test.go index e73b7b4ea9f..9bb9ec5bdfa 100644 --- a/gopls/internal/cache/typerefs/refs_test.go +++ b/gopls/internal/cache/typerefs/refs_test.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/cache/typerefs" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // TestRefs checks that the analysis reports, for each exported member diff --git a/gopls/internal/cache/view.go b/gopls/internal/cache/view.go index bc8587f4aae..07092b2988d 100644 --- a/gopls/internal/cache/view.go +++ b/gopls/internal/cache/view.go @@ -29,7 +29,7 @@ import ( "golang.org/x/mod/semver" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" "golang.org/x/tools/gopls/internal/util/pathutil" diff --git a/gopls/internal/cache/view_test.go b/gopls/internal/cache/view_test.go index 44e0840a4e6..22fde43c880 100644 --- a/gopls/internal/cache/view_test.go +++ b/gopls/internal/cache/view_test.go @@ -9,7 +9,7 @@ import ( "path/filepath" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/cache/workspace.go b/gopls/internal/cache/workspace.go index 9e54289d2f7..71c7338406e 100644 --- a/gopls/internal/cache/workspace.go +++ b/gopls/internal/cache/workspace.go @@ -14,7 +14,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // TODO(rfindley): now that experimentalWorkspaceModule is gone, this file can diff --git a/gopls/internal/cache/xrefs/xrefs.go b/gopls/internal/cache/xrefs/xrefs.go index edb7a3e33d6..6ab54329d38 100644 --- a/gopls/internal/cache/xrefs/xrefs.go +++ b/gopls/internal/cache/xrefs/xrefs.go @@ -16,7 +16,7 @@ import ( "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/frob" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/typeparams" diff --git a/gopls/internal/cmd/call_hierarchy.go b/gopls/internal/cmd/call_hierarchy.go index 5566bdcadf9..82c18d0d28f 100644 --- a/gopls/internal/cmd/call_hierarchy.go +++ b/gopls/internal/cmd/call_hierarchy.go @@ -10,7 +10,7 @@ import ( "fmt" "strings" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/capabilities_test.go b/gopls/internal/cmd/capabilities_test.go index f4b22a4d7ee..47670572285 100644 --- a/gopls/internal/cmd/capabilities_test.go +++ b/gopls/internal/cmd/capabilities_test.go @@ -12,7 +12,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/testenv" diff --git a/gopls/internal/cmd/check.go b/gopls/internal/cmd/check.go index 4d0ff046dbb..2d7a7674226 100644 --- a/gopls/internal/cmd/check.go +++ b/gopls/internal/cmd/check.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // check implements the check verb for gopls. diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 91654ebdb8a..c4cb012f87c 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -25,8 +25,8 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/browser" diff --git a/gopls/internal/cmd/codelens.go b/gopls/internal/cmd/codelens.go index 42e097d779e..28986cc6bbb 100644 --- a/gopls/internal/cmd/codelens.go +++ b/gopls/internal/cmd/codelens.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/definition.go b/gopls/internal/cmd/definition.go index c20dcc14ffa..e5e119b8da8 100644 --- a/gopls/internal/cmd/definition.go +++ b/gopls/internal/cmd/definition.go @@ -12,7 +12,7 @@ import ( "os" "strings" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/execute.go b/gopls/internal/cmd/execute.go index 22e7820b36b..62a69290cc0 100644 --- a/gopls/internal/cmd/execute.go +++ b/gopls/internal/cmd/execute.go @@ -14,7 +14,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/tool" diff --git a/gopls/internal/cmd/folding_range.go b/gopls/internal/cmd/folding_range.go index 401224156ba..13f78c197a5 100644 --- a/gopls/internal/cmd/folding_range.go +++ b/gopls/internal/cmd/folding_range.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/format.go b/gopls/internal/cmd/format.go index 9643cd2cf73..75982c9efba 100644 --- a/gopls/internal/cmd/format.go +++ b/gopls/internal/cmd/format.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // format implements the format verb for gopls. diff --git a/gopls/internal/cmd/highlight.go b/gopls/internal/cmd/highlight.go index 3fddf9d6dbe..9c1488b30be 100644 --- a/gopls/internal/cmd/highlight.go +++ b/gopls/internal/cmd/highlight.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/implementation.go b/gopls/internal/cmd/implementation.go index 180d04dff19..fcfb63185b4 100644 --- a/gopls/internal/cmd/implementation.go +++ b/gopls/internal/cmd/implementation.go @@ -10,7 +10,7 @@ import ( "fmt" "sort" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/imports.go b/gopls/internal/cmd/imports.go index d32b0941646..414ce3473b0 100644 --- a/gopls/internal/cmd/imports.go +++ b/gopls/internal/cmd/imports.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/integration_test.go b/gopls/internal/cmd/integration_test.go index a563c55169e..aabb8c223b9 100644 --- a/gopls/internal/cmd/integration_test.go +++ b/gopls/internal/cmd/integration_test.go @@ -41,7 +41,7 @@ import ( "golang.org/x/tools/gopls/internal/cmd" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/version" "golang.org/x/tools/internal/testenv" diff --git a/gopls/internal/cmd/links.go b/gopls/internal/cmd/links.go index f7041ecaa08..0f1d671a503 100644 --- a/gopls/internal/cmd/links.go +++ b/gopls/internal/cmd/links.go @@ -11,7 +11,7 @@ import ( "fmt" "os" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/parsespan.go b/gopls/internal/cmd/parsespan.go index c70b85e3432..556beb9730e 100644 --- a/gopls/internal/cmd/parsespan.go +++ b/gopls/internal/cmd/parsespan.go @@ -9,7 +9,7 @@ import ( "strings" "unicode/utf8" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // parseSpan returns the location represented by the input. diff --git a/gopls/internal/cmd/prepare_rename.go b/gopls/internal/cmd/prepare_rename.go index 69ed6cab262..c7901e6484d 100644 --- a/gopls/internal/cmd/prepare_rename.go +++ b/gopls/internal/cmd/prepare_rename.go @@ -10,7 +10,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/references.go b/gopls/internal/cmd/references.go index 670f5fe01d8..3c294c71b14 100644 --- a/gopls/internal/cmd/references.go +++ b/gopls/internal/cmd/references.go @@ -10,7 +10,7 @@ import ( "fmt" "sort" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/rename.go b/gopls/internal/cmd/rename.go index 589f202c8c5..6d831681c19 100644 --- a/gopls/internal/cmd/rename.go +++ b/gopls/internal/cmd/rename.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/semantictokens.go b/gopls/internal/cmd/semantictokens.go index 538cedc6c62..f181f30c420 100644 --- a/gopls/internal/cmd/semantictokens.go +++ b/gopls/internal/cmd/semantictokens.go @@ -13,7 +13,7 @@ import ( "os" "unicode/utf8" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" ) diff --git a/gopls/internal/cmd/serve.go b/gopls/internal/cmd/serve.go index b3ac163b1c7..a2f9be9f7e2 100644 --- a/gopls/internal/cmd/serve.go +++ b/gopls/internal/cmd/serve.go @@ -16,8 +16,8 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/fakenet" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/cmd/signature.go b/gopls/internal/cmd/signature.go index 240266942f8..cf976a64859 100644 --- a/gopls/internal/cmd/signature.go +++ b/gopls/internal/cmd/signature.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/span.go b/gopls/internal/cmd/span.go index fe8f9477321..4753d534350 100644 --- a/gopls/internal/cmd/span.go +++ b/gopls/internal/cmd/span.go @@ -13,7 +13,7 @@ import ( "sort" "strings" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // A span represents a range of text within a source file. The start @@ -28,7 +28,7 @@ import ( // representations, such as go/token (also UTF-8) or the LSP protocol // (UTF-16). The latter requires access to file contents. // -// See overview comments at ../lsp/protocol/mapper.go. +// See overview comments at ../protocol/mapper.go. type span struct { v _span } diff --git a/gopls/internal/cmd/stats.go b/gopls/internal/cmd/stats.go index b115f136041..8103434eb2f 100644 --- a/gopls/internal/cmd/stats.go +++ b/gopls/internal/cmd/stats.go @@ -21,7 +21,7 @@ import ( "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" bugpkg "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/cmd/suggested_fix.go b/gopls/internal/cmd/suggested_fix.go index 9fe64977e7d..f6a88be91ce 100644 --- a/gopls/internal/cmd/suggested_fix.go +++ b/gopls/internal/cmd/suggested_fix.go @@ -9,7 +9,7 @@ import ( "flag" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/symbols.go b/gopls/internal/cmd/symbols.go index 5000046f66f..249397d320f 100644 --- a/gopls/internal/cmd/symbols.go +++ b/gopls/internal/cmd/symbols.go @@ -11,7 +11,7 @@ import ( "fmt" "sort" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/cmd/workspace_symbol.go b/gopls/internal/cmd/workspace_symbol.go index f41a85f6466..9fa7526a24d 100644 --- a/gopls/internal/cmd/workspace_symbol.go +++ b/gopls/internal/cmd/workspace_symbol.go @@ -10,7 +10,7 @@ import ( "fmt" "strings" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/tool" ) diff --git a/gopls/internal/debug/serve.go b/gopls/internal/debug/serve.go index b6670e4966d..62e416829fe 100644 --- a/gopls/internal/debug/serve.go +++ b/gopls/internal/debug/serve.go @@ -26,7 +26,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug/log" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/core" diff --git a/gopls/internal/file/file.go b/gopls/internal/file/file.go index 5a9d0aca5e2..5f8be06cf60 100644 --- a/gopls/internal/file/file.go +++ b/gopls/internal/file/file.go @@ -9,7 +9,7 @@ import ( "context" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // An Identity identifies the name and contents of a file. diff --git a/gopls/internal/file/modification.go b/gopls/internal/file/modification.go index 97313dda647..5deef718230 100644 --- a/gopls/internal/file/modification.go +++ b/gopls/internal/file/modification.go @@ -4,7 +4,7 @@ package file -import "golang.org/x/tools/gopls/internal/lsp/protocol" +import "golang.org/x/tools/gopls/internal/protocol" // Modification represents a modification to a file. type Modification struct { diff --git a/gopls/internal/golang/add_import.go b/gopls/internal/golang/add_import.go index c36fd797109..201edce5306 100644 --- a/gopls/internal/golang/add_import.go +++ b/gopls/internal/golang/add_import.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/imports" ) diff --git a/gopls/internal/golang/call_hierarchy.go b/gopls/internal/golang/call_hierarchy.go index f0698294058..4072f993804 100644 --- a/gopls/internal/golang/call_hierarchy.go +++ b/gopls/internal/golang/call_hierarchy.go @@ -16,7 +16,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/change_quote.go b/gopls/internal/golang/change_quote.go index fade568f281..98a60e11ae0 100644 --- a/gopls/internal/golang/change_quote.go +++ b/gopls/internal/golang/change_quote.go @@ -12,7 +12,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/change_signature.go b/gopls/internal/golang/change_signature.go index 3105aae9559..527d2df3cf4 100644 --- a/gopls/internal/golang/change_signature.go +++ b/gopls/internal/golang/change_signature.go @@ -19,7 +19,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/imports" diff --git a/gopls/internal/golang/code_lens.go b/gopls/internal/golang/code_lens.go index e166a688152..dcade445715 100644 --- a/gopls/internal/golang/code_lens.go +++ b/gopls/internal/golang/code_lens.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) type LensFunc func(context.Context, *cache.Snapshot, file.Handle) ([]protocol.CodeLens, error) diff --git a/gopls/internal/golang/codeaction.go b/gopls/internal/golang/codeaction.go index 0543800bd89..e94e29c8971 100644 --- a/gopls/internal/golang/codeaction.go +++ b/gopls/internal/golang/codeaction.go @@ -17,7 +17,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/slices" diff --git a/gopls/internal/golang/completion/completion.go b/gopls/internal/golang/completion/completion.go index 228fbcc4ca2..2c4f4c826ba 100644 --- a/gopls/internal/golang/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go @@ -27,12 +27,12 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" goplsastutil "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/completion/definition.go b/gopls/internal/golang/completion/definition.go index be7517247a0..1e3852bffdb 100644 --- a/gopls/internal/golang/completion/definition.go +++ b/gopls/internal/golang/completion/definition.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // some function definitions in test files can be completed diff --git a/gopls/internal/golang/completion/format.go b/gopls/internal/golang/completion/format.go index 40ac1f23965..e533860a6a3 100644 --- a/gopls/internal/golang/completion/format.go +++ b/gopls/internal/golang/completion/format.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" diff --git a/gopls/internal/golang/completion/fuzz.go b/gopls/internal/golang/completion/fuzz.go index 08e7654c7ed..76215419bbc 100644 --- a/gopls/internal/golang/completion/fuzz.go +++ b/gopls/internal/golang/completion/fuzz.go @@ -11,7 +11,7 @@ import ( "go/types" "strings" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // golang/go#51089 diff --git a/gopls/internal/golang/completion/keywords.go b/gopls/internal/golang/completion/keywords.go index 1dcd58411c5..cad04fd7a6d 100644 --- a/gopls/internal/golang/completion/keywords.go +++ b/gopls/internal/golang/completion/keywords.go @@ -7,7 +7,7 @@ package completion import ( "go/ast" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/astutil" ) diff --git a/gopls/internal/golang/completion/literal.go b/gopls/internal/golang/completion/literal.go index 9fb40fed0c2..45f772d789f 100644 --- a/gopls/internal/golang/completion/literal.go +++ b/gopls/internal/golang/completion/literal.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/completion/package.go b/gopls/internal/golang/completion/package.go index 3ee62b5ce61..709d65ce3a7 100644 --- a/gopls/internal/golang/completion/package.go +++ b/gopls/internal/golang/completion/package.go @@ -18,10 +18,10 @@ import ( "strings" "unicode" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/fuzzy" ) diff --git a/gopls/internal/golang/completion/postfix_snippets.go b/gopls/internal/golang/completion/postfix_snippets.go index d738eb8d929..252d2e77a90 100644 --- a/gopls/internal/golang/completion/postfix_snippets.go +++ b/gopls/internal/golang/completion/postfix_snippets.go @@ -16,10 +16,10 @@ import ( "sync" "text/template" + "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" diff --git a/gopls/internal/golang/completion/statements.go b/gopls/internal/golang/completion/statements.go index 24b2235539a..5a945d66c15 100644 --- a/gopls/internal/golang/completion/statements.go +++ b/gopls/internal/golang/completion/statements.go @@ -11,10 +11,10 @@ import ( "go/types" "strings" + "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion/snippet" - "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // addStatementCandidates adds full statement completion candidates diff --git a/gopls/internal/golang/completion/util.go b/gopls/internal/golang/completion/util.go index e20168e4345..65d1b4d96dc 100644 --- a/gopls/internal/golang/completion/util.go +++ b/gopls/internal/golang/completion/util.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/go/types/typeutil" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" ) diff --git a/gopls/internal/golang/definition.go b/gopls/internal/golang/definition.go index ccc127d9c59..515235997fa 100644 --- a/gopls/internal/golang/definition.go +++ b/gopls/internal/golang/definition.go @@ -17,7 +17,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/diagnostics.go b/gopls/internal/golang/diagnostics.go index 2106d5a8538..a9ad9d9d939 100644 --- a/gopls/internal/golang/diagnostics.go +++ b/gopls/internal/golang/diagnostics.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" diff --git a/gopls/internal/golang/embeddirective.go b/gopls/internal/golang/embeddirective.go index ef84a006b70..485da5c7a2d 100644 --- a/gopls/internal/golang/embeddirective.go +++ b/gopls/internal/golang/embeddirective.go @@ -14,7 +14,7 @@ import ( "unicode" "unicode/utf8" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // ErrNoEmbed is returned by EmbedDefinition when no embed diff --git a/gopls/internal/golang/fix.go b/gopls/internal/golang/fix.go index 665e81d75c3..f61de5142dc 100644 --- a/gopls/internal/golang/fix.go +++ b/gopls/internal/golang/fix.go @@ -20,7 +20,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/imports" ) diff --git a/gopls/internal/golang/folding_range.go b/gopls/internal/golang/folding_range.go index 3f71b489da7..26c179c99c3 100644 --- a/gopls/internal/golang/folding_range.go +++ b/gopls/internal/golang/folding_range.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/golang/format.go b/gopls/internal/golang/format.go index 5cfcece60c6..3ba5cabbbe8 100644 --- a/gopls/internal/golang/format.go +++ b/gopls/internal/golang/format.go @@ -19,7 +19,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/gc_annotations.go b/gopls/internal/golang/gc_annotations.go index 5383985d1c4..8bcf402cf1f 100644 --- a/gopls/internal/golang/gc_annotations.go +++ b/gopls/internal/golang/gc_annotations.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/gocommand" ) diff --git a/gopls/internal/golang/highlight.go b/gopls/internal/golang/highlight.go index ebfb4133a5f..5f90cb40ee9 100644 --- a/gopls/internal/golang/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index a050c994336..a6b7e745074 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -29,7 +29,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/implementation.go b/gopls/internal/golang/implementation.go index 033a8c5ae28..bd050ea5a15 100644 --- a/gopls/internal/golang/implementation.go +++ b/gopls/internal/golang/implementation.go @@ -21,7 +21,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/methodsets" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/inlay_hint.go b/gopls/internal/golang/inlay_hint.go index 79c8ea1946d..324609e4fed 100644 --- a/gopls/internal/golang/inlay_hint.go +++ b/gopls/internal/golang/inlay_hint.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/inline.go b/gopls/internal/golang/inline.go index 53d33804bd0..de2a6ef75ae 100644 --- a/gopls/internal/golang/inline.go +++ b/gopls/internal/golang/inline.go @@ -18,7 +18,7 @@ import ( "golang.org/x/tools/go/types/typeutil" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/inline_all.go b/gopls/internal/golang/inline_all.go index b1c10a695fc..f2bab9d6d12 100644 --- a/gopls/internal/golang/inline_all.go +++ b/gopls/internal/golang/inline_all.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/typeutil" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/refactor/inline" ) diff --git a/gopls/internal/golang/linkname.go b/gopls/internal/golang/linkname.go index 5fb114c0924..2578f8d5485 100644 --- a/gopls/internal/golang/linkname.go +++ b/gopls/internal/golang/linkname.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/golang/references.go b/gopls/internal/golang/references.go index aad3c924562..c45fe30ae28 100644 --- a/gopls/internal/golang/references.go +++ b/gopls/internal/golang/references.go @@ -29,7 +29,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/methodsets" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/rename.go b/gopls/internal/golang/rename.go index 700b7032008..57018453103 100644 --- a/gopls/internal/golang/rename.go +++ b/gopls/internal/golang/rename.go @@ -63,7 +63,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/signature_help.go b/gopls/internal/golang/signature_help.go index f5ce6030ab0..5aeb6983a43 100644 --- a/gopls/internal/golang/signature_help.go +++ b/gopls/internal/golang/signature_help.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/typesutil" diff --git a/gopls/internal/golang/snapshot.go b/gopls/internal/golang/snapshot.go index 9499bb99630..adcbfb9a811 100644 --- a/gopls/internal/golang/snapshot.go +++ b/gopls/internal/golang/snapshot.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // NarrowestMetadataForFile returns metadata for the narrowest package diff --git a/gopls/internal/golang/symbols.go b/gopls/internal/golang/symbols.go index 9fda67fe4c5..78ef993b855 100644 --- a/gopls/internal/golang/symbols.go +++ b/gopls/internal/golang/symbols.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/type_definition.go b/gopls/internal/golang/type_definition.go index b1dab364c5c..8e2558a7ca6 100644 --- a/gopls/internal/golang/type_definition.go +++ b/gopls/internal/golang/type_definition.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/types_format.go b/gopls/internal/golang/types_format.go index d7e35319327..428e37f735b 100644 --- a/gopls/internal/golang/types_format.go +++ b/gopls/internal/golang/types_format.go @@ -16,7 +16,7 @@ import ( "strings" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/util.go b/gopls/internal/golang/util.go index 82f109cf9fb..d6e71a964bb 100644 --- a/gopls/internal/golang/util.go +++ b/gopls/internal/golang/util.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/astutil" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/workspace_symbol.go b/gopls/internal/golang/workspace_symbol.go index c703199b7e5..4ab5a21b8a5 100644 --- a/gopls/internal/golang/workspace_symbol.go +++ b/gopls/internal/golang/workspace_symbol.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/fuzzy" diff --git a/gopls/internal/hooks/analysis_119.go b/gopls/internal/hooks/analysis_119.go index 34c6b938f0f..0b88259f98b 100644 --- a/gopls/internal/hooks/analysis_119.go +++ b/gopls/internal/hooks/analysis_119.go @@ -8,7 +8,7 @@ package hooks import ( - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "honnef.co/go/tools/analysis/lint" "honnef.co/go/tools/quickfix" diff --git a/gopls/internal/lsp/command/command_gen.go b/gopls/internal/lsp/command/command_gen.go index ae02543691b..2ee0a5d19be 100644 --- a/gopls/internal/lsp/command/command_gen.go +++ b/gopls/internal/lsp/command/command_gen.go @@ -15,7 +15,7 @@ import ( "context" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // Symbolic names for gopls commands, excluding "gopls." prefix. diff --git a/gopls/internal/lsp/command/gen/gen.go b/gopls/internal/lsp/command/gen/gen.go index 3dde3546f41..31bd65dd8ee 100644 --- a/gopls/internal/lsp/command/gen/gen.go +++ b/gopls/internal/lsp/command/gen/gen.go @@ -112,7 +112,7 @@ func Generate() ([]byte, error) { Imports: map[string]bool{ "context": true, "fmt": true, - "golang.org/x/tools/gopls/internal/lsp/protocol": true, + "golang.org/x/tools/gopls/internal/protocol": true, }, } const thispkg = "golang.org/x/tools/gopls/internal/lsp/command" diff --git a/gopls/internal/lsp/command/interface.go b/gopls/internal/lsp/command/interface.go index 281d0edfb99..b0dd06088bd 100644 --- a/gopls/internal/lsp/command/interface.go +++ b/gopls/internal/lsp/command/interface.go @@ -17,7 +17,7 @@ package command import ( "context" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/vulncheck" ) diff --git a/gopls/internal/lsprpc/binder_test.go b/gopls/internal/lsprpc/binder_test.go index e702cefbe3b..042056e7777 100644 --- a/gopls/internal/lsprpc/binder_test.go +++ b/gopls/internal/lsprpc/binder_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" . "golang.org/x/tools/gopls/internal/lsprpc" diff --git a/gopls/internal/lsprpc/commandinterceptor_test.go b/gopls/internal/lsprpc/commandinterceptor_test.go index 75e19c9a35e..7c83ef993f0 100644 --- a/gopls/internal/lsprpc/commandinterceptor_test.go +++ b/gopls/internal/lsprpc/commandinterceptor_test.go @@ -9,7 +9,7 @@ import ( "encoding/json" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" . "golang.org/x/tools/gopls/internal/lsprpc" diff --git a/gopls/internal/lsprpc/export_test.go b/gopls/internal/lsprpc/export_test.go index ee5138b675f..509129870dc 100644 --- a/gopls/internal/lsprpc/export_test.go +++ b/gopls/internal/lsprpc/export_test.go @@ -11,7 +11,7 @@ import ( "encoding/json" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" "golang.org/x/tools/internal/xcontext" diff --git a/gopls/internal/lsprpc/goenv_test.go b/gopls/internal/lsprpc/goenv_test.go index c2ea92a4c62..6c41540fafb 100644 --- a/gopls/internal/lsprpc/goenv_test.go +++ b/gopls/internal/lsprpc/goenv_test.go @@ -11,7 +11,7 @@ import ( "os" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" "golang.org/x/tools/internal/testenv" diff --git a/gopls/internal/lsprpc/lsprpc.go b/gopls/internal/lsprpc/lsprpc.go index de42d2a5486..0b7136ee4ac 100644 --- a/gopls/internal/lsprpc/lsprpc.go +++ b/gopls/internal/lsprpc/lsprpc.go @@ -22,7 +22,7 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/lsprpc/lsprpc_test.go b/gopls/internal/lsprpc/lsprpc_test.go index 3eeb5abcbc5..346cca491cc 100644 --- a/gopls/internal/lsprpc/lsprpc_test.go +++ b/gopls/internal/lsprpc/lsprpc_test.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/mod/code_lens.go b/gopls/internal/mod/code_lens.go index c442a53b3ea..51cf8663ff1 100644 --- a/gopls/internal/mod/code_lens.go +++ b/gopls/internal/mod/code_lens.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // LensFuncs returns the supported lensFuncs for go.mod files. diff --git a/gopls/internal/mod/diagnostics.go b/gopls/internal/mod/diagnostics.go index 135f28bc0a8..d65d010b69b 100644 --- a/gopls/internal/mod/diagnostics.go +++ b/gopls/internal/mod/diagnostics.go @@ -20,7 +20,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/mod/format.go b/gopls/internal/mod/format.go index 13c47ae6c2b..14408393969 100644 --- a/gopls/internal/mod/format.go +++ b/gopls/internal/mod/format.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/mod/hover.go b/gopls/internal/mod/hover.go index fa946e88987..458c5ce67d5 100644 --- a/gopls/internal/mod/hover.go +++ b/gopls/internal/mod/hover.go @@ -15,7 +15,7 @@ import ( "golang.org/x/mod/semver" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" diff --git a/gopls/internal/mod/inlayhint.go b/gopls/internal/mod/inlayhint.go index 5170ac19158..73286be4be6 100644 --- a/gopls/internal/mod/inlayhint.go +++ b/gopls/internal/mod/inlayhint.go @@ -10,7 +10,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func InlayHint(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, _ protocol.Range) ([]protocol.InlayHint, error) { diff --git a/gopls/internal/progress/progress.go b/gopls/internal/progress/progress.go index d48f8e0378e..0bb17b35669 100644 --- a/gopls/internal/progress/progress.go +++ b/gopls/internal/progress/progress.go @@ -16,7 +16,7 @@ import ( "strings" "sync" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/xcontext" diff --git a/gopls/internal/progress/progress_test.go b/gopls/internal/progress/progress_test.go index ef87eba121a..41b69e85128 100644 --- a/gopls/internal/progress/progress_test.go +++ b/gopls/internal/progress/progress_test.go @@ -10,7 +10,7 @@ import ( "sync" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) type fakeClient struct { diff --git a/gopls/internal/lsp/protocol/codeactionkind.go b/gopls/internal/protocol/codeactionkind.go similarity index 100% rename from gopls/internal/lsp/protocol/codeactionkind.go rename to gopls/internal/protocol/codeactionkind.go diff --git a/gopls/internal/lsp/protocol/context.go b/gopls/internal/protocol/context.go similarity index 100% rename from gopls/internal/lsp/protocol/context.go rename to gopls/internal/protocol/context.go diff --git a/gopls/internal/lsp/protocol/doc.go b/gopls/internal/protocol/doc.go similarity index 100% rename from gopls/internal/lsp/protocol/doc.go rename to gopls/internal/protocol/doc.go diff --git a/gopls/internal/lsp/protocol/edits.go b/gopls/internal/protocol/edits.go similarity index 100% rename from gopls/internal/lsp/protocol/edits.go rename to gopls/internal/protocol/edits.go diff --git a/gopls/internal/lsp/protocol/enums.go b/gopls/internal/protocol/enums.go similarity index 100% rename from gopls/internal/lsp/protocol/enums.go rename to gopls/internal/protocol/enums.go diff --git a/gopls/internal/lsp/protocol/generate/README.md b/gopls/internal/protocol/generate/README.md similarity index 100% rename from gopls/internal/lsp/protocol/generate/README.md rename to gopls/internal/protocol/generate/README.md diff --git a/gopls/internal/lsp/protocol/generate/generate.go b/gopls/internal/protocol/generate/generate.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/generate.go rename to gopls/internal/protocol/generate/generate.go diff --git a/gopls/internal/lsp/protocol/generate/main.go b/gopls/internal/protocol/generate/main.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/main.go rename to gopls/internal/protocol/generate/main.go diff --git a/gopls/internal/lsp/protocol/generate/main_test.go b/gopls/internal/protocol/generate/main_test.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/main_test.go rename to gopls/internal/protocol/generate/main_test.go diff --git a/gopls/internal/lsp/protocol/generate/output.go b/gopls/internal/protocol/generate/output.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/output.go rename to gopls/internal/protocol/generate/output.go diff --git a/gopls/internal/lsp/protocol/generate/tables.go b/gopls/internal/protocol/generate/tables.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/tables.go rename to gopls/internal/protocol/generate/tables.go diff --git a/gopls/internal/lsp/protocol/generate/typenames.go b/gopls/internal/protocol/generate/typenames.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/typenames.go rename to gopls/internal/protocol/generate/typenames.go diff --git a/gopls/internal/lsp/protocol/generate/types.go b/gopls/internal/protocol/generate/types.go similarity index 100% rename from gopls/internal/lsp/protocol/generate/types.go rename to gopls/internal/protocol/generate/types.go diff --git a/gopls/internal/lsp/protocol/json_test.go b/gopls/internal/protocol/json_test.go similarity index 92% rename from gopls/internal/lsp/protocol/json_test.go rename to gopls/internal/protocol/json_test.go index 2753125d454..9aac110fa3b 100644 --- a/gopls/internal/lsp/protocol/json_test.go +++ b/gopls/internal/protocol/json_test.go @@ -12,7 +12,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // verify that type errors in Initialize lsp messages don't cause @@ -30,7 +30,7 @@ import ( // a recent Initialize message taken from a log (at some point // some field incompatibly changed from bool to int32) -const input = `{"processId":46408,"clientInfo":{"name":"Visual Studio Code - Insiders","version":"1.76.0-insider"},"locale":"en-us","rootPath":"/Users/pjw/hakim","rootUri":"file:///Users/pjw/hakim","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":false},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0"},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}}},"initializationOptions":{"usePlaceholders":true,"completionDocumentation":true,"verboseOutput":false,"build.directoryFilters":["-foof","-internal/lsp/protocol/typescript"],"codelenses":{"reference":true,"gc_details":true},"analyses":{"fillstruct":true,"staticcheck":true,"unusedparams":false,"composites":false},"semanticTokens":true,"noSemanticString":true,"noSemanticNumber":true,"templateExtensions":["tmpl","gotmpl"],"ui.completion.matcher":"Fuzzy","ui.inlayhint.hints":{"assignVariableTypes":false,"compositeLiteralFields":false,"compositeLiteralTypes":false,"constantValues":false,"functionTypeParameters":false,"parameterNames":false,"rangeVariableTypes":false},"ui.vulncheck":"Off","allExperiments":true},"trace":"off","workspaceFolders":[{"uri":"file:///Users/pjw/hakim","name":"hakim"}]}` +const input = `{"processId":46408,"clientInfo":{"name":"Visual Studio Code - Insiders","version":"1.76.0-insider"},"locale":"en-us","rootPath":"/Users/pjw/hakim","rootUri":"file:///Users/pjw/hakim","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":false},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0"},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}}},"initializationOptions":{"usePlaceholders":true,"completionDocumentation":true,"verboseOutput":false,"build.directoryFilters":["-foof","-internal/protocol/typescript"],"codelenses":{"reference":true,"gc_details":true},"analyses":{"fillstruct":true,"staticcheck":true,"unusedparams":false,"composites":false},"semanticTokens":true,"noSemanticString":true,"noSemanticNumber":true,"templateExtensions":["tmpl","gotmpl"],"ui.completion.matcher":"Fuzzy","ui.inlayhint.hints":{"assignVariableTypes":false,"compositeLiteralFields":false,"compositeLiteralTypes":false,"constantValues":false,"functionTypeParameters":false,"parameterNames":false,"rangeVariableTypes":false},"ui.vulncheck":"Off","allExperiments":true},"trace":"off","workspaceFolders":[{"uri":"file:///Users/pjw/hakim","name":"hakim"}]}` type DiffReporter struct { path cmp.Path diff --git a/gopls/internal/lsp/protocol/log.go b/gopls/internal/protocol/log.go similarity index 100% rename from gopls/internal/lsp/protocol/log.go rename to gopls/internal/protocol/log.go diff --git a/gopls/internal/lsp/protocol/mapper.go b/gopls/internal/protocol/mapper.go similarity index 100% rename from gopls/internal/lsp/protocol/mapper.go rename to gopls/internal/protocol/mapper.go diff --git a/gopls/internal/lsp/protocol/mapper_test.go b/gopls/internal/protocol/mapper_test.go similarity index 99% rename from gopls/internal/lsp/protocol/mapper_test.go rename to gopls/internal/protocol/mapper_test.go index 77257691725..8ba611a99f9 100644 --- a/gopls/internal/lsp/protocol/mapper_test.go +++ b/gopls/internal/protocol/mapper_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // This file tests Mapper's logic for converting between offsets, diff --git a/gopls/internal/lsp/protocol/protocol.go b/gopls/internal/protocol/protocol.go similarity index 100% rename from gopls/internal/lsp/protocol/protocol.go rename to gopls/internal/protocol/protocol.go diff --git a/gopls/internal/lsp/protocol/semantic.go b/gopls/internal/protocol/semantic.go similarity index 100% rename from gopls/internal/lsp/protocol/semantic.go rename to gopls/internal/protocol/semantic.go diff --git a/gopls/internal/lsp/protocol/span.go b/gopls/internal/protocol/span.go similarity index 100% rename from gopls/internal/lsp/protocol/span.go rename to gopls/internal/protocol/span.go diff --git a/gopls/internal/lsp/protocol/tsclient.go b/gopls/internal/protocol/tsclient.go similarity index 100% rename from gopls/internal/lsp/protocol/tsclient.go rename to gopls/internal/protocol/tsclient.go diff --git a/gopls/internal/lsp/protocol/tsdocument_changes.go b/gopls/internal/protocol/tsdocument_changes.go similarity index 100% rename from gopls/internal/lsp/protocol/tsdocument_changes.go rename to gopls/internal/protocol/tsdocument_changes.go diff --git a/gopls/internal/lsp/protocol/tsjson.go b/gopls/internal/protocol/tsjson.go similarity index 100% rename from gopls/internal/lsp/protocol/tsjson.go rename to gopls/internal/protocol/tsjson.go diff --git a/gopls/internal/lsp/protocol/tsprotocol.go b/gopls/internal/protocol/tsprotocol.go similarity index 100% rename from gopls/internal/lsp/protocol/tsprotocol.go rename to gopls/internal/protocol/tsprotocol.go diff --git a/gopls/internal/lsp/protocol/tsserver.go b/gopls/internal/protocol/tsserver.go similarity index 100% rename from gopls/internal/lsp/protocol/tsserver.go rename to gopls/internal/protocol/tsserver.go diff --git a/gopls/internal/lsp/protocol/uri.go b/gopls/internal/protocol/uri.go similarity index 100% rename from gopls/internal/lsp/protocol/uri.go rename to gopls/internal/protocol/uri.go diff --git a/gopls/internal/lsp/protocol/uri_test.go b/gopls/internal/protocol/uri_test.go similarity index 98% rename from gopls/internal/lsp/protocol/uri_test.go rename to gopls/internal/protocol/uri_test.go index 3c1d7e598f1..cad71ddc13c 100644 --- a/gopls/internal/lsp/protocol/uri_test.go +++ b/gopls/internal/protocol/uri_test.go @@ -10,7 +10,7 @@ package protocol_test import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // TestURIFromPath tests the conversion between URIs and filenames. The test cases diff --git a/gopls/internal/lsp/protocol/uri_windows_test.go b/gopls/internal/protocol/uri_windows_test.go similarity index 98% rename from gopls/internal/lsp/protocol/uri_windows_test.go rename to gopls/internal/protocol/uri_windows_test.go index 03b3af28924..08471167a22 100644 --- a/gopls/internal/lsp/protocol/uri_windows_test.go +++ b/gopls/internal/protocol/uri_windows_test.go @@ -11,7 +11,7 @@ import ( "path/filepath" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // TestURIFromPath tests the conversion between URIs and filenames. The test cases diff --git a/gopls/internal/server/call_hierarchy.go b/gopls/internal/server/call_hierarchy.go index 8cffa4754a2..671d4f8c81c 100644 --- a/gopls/internal/server/call_hierarchy.go +++ b/gopls/internal/server/call_hierarchy.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index b4c8fcce6fa..3f3d3607896 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -16,8 +16,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/code_lens.go b/gopls/internal/server/code_lens.go index 3e7e27b6298..21b4a9ae948 100644 --- a/gopls/internal/server/code_lens.go +++ b/gopls/internal/server/code_lens.go @@ -12,8 +12,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index b12b3cb7af4..95710e818dd 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -29,8 +29,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/server/completion.go b/gopls/internal/server/completion.go index d59eb351608..3e019df1b14 100644 --- a/gopls/internal/server/completion.go +++ b/gopls/internal/server/completion.go @@ -12,7 +12,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/golang/completion" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" diff --git a/gopls/internal/server/definition.go b/gopls/internal/server/definition.go index 8c0cd8a5d77..7a0eb25679b 100644 --- a/gopls/internal/server/definition.go +++ b/gopls/internal/server/definition.go @@ -10,7 +10,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 5a48e2e06d3..347184cee30 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -20,8 +20,8 @@ import ( "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/gopls/internal/util/maps" diff --git a/gopls/internal/server/folding_range.go b/gopls/internal/server/folding_range.go index d1fea80f502..cb9d0cb5d49 100644 --- a/gopls/internal/server/folding_range.go +++ b/gopls/internal/server/folding_range.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/format.go b/gopls/internal/server/format.go index fc1f2c8cf01..0e6cfdce6d7 100644 --- a/gopls/internal/server/format.go +++ b/gopls/internal/server/format.go @@ -9,8 +9,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/work" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/general.go b/gopls/internal/server/general.go index 48a5b99cf4c..250b9f8495c 100644 --- a/gopls/internal/server/general.go +++ b/gopls/internal/server/general.go @@ -23,7 +23,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/server/highlight.go b/gopls/internal/server/highlight.go index 4cc74596c94..45eeba77b56 100644 --- a/gopls/internal/server/highlight.go +++ b/gopls/internal/server/highlight.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/hover.go b/gopls/internal/server/hover.go index ca28deafcb5..1ceede24ed7 100644 --- a/gopls/internal/server/hover.go +++ b/gopls/internal/server/hover.go @@ -9,8 +9,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/gopls/internal/work" diff --git a/gopls/internal/server/implementation.go b/gopls/internal/server/implementation.go index dd7c9a6fc39..b462eacee8a 100644 --- a/gopls/internal/server/implementation.go +++ b/gopls/internal/server/implementation.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/inlay_hint.go b/gopls/internal/server/inlay_hint.go index 3a5129fdb4c..88ec783e391 100644 --- a/gopls/internal/server/inlay_hint.go +++ b/gopls/internal/server/inlay_hint.go @@ -9,8 +9,8 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/link.go b/gopls/internal/server/link.go index 9119ea49605..6ac397627d9 100644 --- a/gopls/internal/server/link.go +++ b/gopls/internal/server/link.go @@ -21,7 +21,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/prompt.go b/gopls/internal/server/prompt.go index e5b54427a48..72c5113dc4e 100644 --- a/gopls/internal/server/prompt.go +++ b/gopls/internal/server/prompt.go @@ -11,7 +11,7 @@ import ( "path/filepath" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/references.go b/gopls/internal/server/references.go index 865a51d7696..cc02d6f16b6 100644 --- a/gopls/internal/server/references.go +++ b/gopls/internal/server/references.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/server/rename.go b/gopls/internal/server/rename.go index 2ecc0861f26..946cf5092ec 100644 --- a/gopls/internal/server/rename.go +++ b/gopls/internal/server/rename.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/selection_range.go b/gopls/internal/server/selection_range.go index f265596364b..89142f42007 100644 --- a/gopls/internal/server/selection_range.go +++ b/gopls/internal/server/selection_range.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/gopls/internal/cache/parsego" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/semantic.go b/gopls/internal/server/semantic.go index 3ed720fe4b5..abf0fe76b7f 100644 --- a/gopls/internal/server/semantic.go +++ b/gopls/internal/server/semantic.go @@ -22,7 +22,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/server/server.go b/gopls/internal/server/server.go index 9228420b8c1..ff0c2682917 100644 --- a/gopls/internal/server/server.go +++ b/gopls/internal/server/server.go @@ -13,8 +13,8 @@ import ( "sync" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/progress" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/signature_help.go b/gopls/internal/server/signature_help.go index a553703453c..712c35b820c 100644 --- a/gopls/internal/server/signature_help.go +++ b/gopls/internal/server/signature_help.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/symbols.go b/gopls/internal/server/symbols.go index 617826f73f5..3442318b352 100644 --- a/gopls/internal/server/symbols.go +++ b/gopls/internal/server/symbols.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/template" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/server/text_synchronization.go b/gopls/internal/server/text_synchronization.go index f3e0a8b8615..ae353940b00 100644 --- a/gopls/internal/server/text_synchronization.go +++ b/gopls/internal/server/text_synchronization.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/server/unimplemented.go b/gopls/internal/server/unimplemented.go index d8e16a52d5f..c293ee167a7 100644 --- a/gopls/internal/server/unimplemented.go +++ b/gopls/internal/server/unimplemented.go @@ -10,7 +10,7 @@ import ( "context" "fmt" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/jsonrpc2" ) diff --git a/gopls/internal/server/workspace.go b/gopls/internal/server/workspace.go index 4245a6491fc..1a3c0864d33 100644 --- a/gopls/internal/server/workspace.go +++ b/gopls/internal/server/workspace.go @@ -10,7 +10,7 @@ import ( "sync" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/workspace_symbol.go b/gopls/internal/server/workspace_symbol.go index 5dd82347a9e..9eafeb015ad 100644 --- a/gopls/internal/server/workspace_symbol.go +++ b/gopls/internal/server/workspace_symbol.go @@ -9,7 +9,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/settings/analyzer.go b/gopls/internal/settings/analyzer.go index ccf94e3e32d..d855aa21a0d 100644 --- a/gopls/internal/settings/analyzer.go +++ b/gopls/internal/settings/analyzer.go @@ -6,7 +6,7 @@ package settings import ( "golang.org/x/tools/go/analysis" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // Analyzer augments a go/analysis analyzer with additional LSP configuration. diff --git a/gopls/internal/settings/api_json.go b/gopls/internal/settings/api_json.go index dbaac2faa23..9324992cc3a 100644 --- a/gopls/internal/settings/api_json.go +++ b/gopls/internal/settings/api_json.go @@ -738,14 +738,14 @@ var GeneratedAPIJSON = &APIJSON{ Title: "Apply a fix", Doc: "Applies a fix to a region of source code.", ArgDoc: "{\n\t// The name of the fix to apply.\n\t//\n\t// For fixes suggested by analyzers, this is a string constant\n\t// advertised by the analyzer that matches the Category of\n\t// the analysis.Diagnostic with a SuggestedFix containing no edits.\n\t//\n\t// For fixes suggested by code actions, this is a string agreed\n\t// upon by the code action and golang.ApplyFix.\n\t\"Fix\": string,\n\t// The file URI for the document to fix.\n\t\"URI\": string,\n\t// The document range to scan for fixes.\n\t\"Range\": {\n\t\t\"start\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t\t\"end\": {\n\t\t\t\"line\": uint32,\n\t\t\t\"character\": uint32,\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", - ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", + ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/protocol.ChangeAnnotation,\n}", }, { Command: "gopls.change_signature", Title: "Perform a \"change signature\" refactoring", Doc: "This command is experimental, currently only supporting parameter removal.\nIts signature will certainly change in the future (pun intended).", ArgDoc: "{\n\t\"RemoveParameter\": {\n\t\t\"uri\": string,\n\t\t\"range\": {\n\t\t\t\"start\": { ... },\n\t\t\t\"end\": { ... },\n\t\t},\n\t},\n\t// Whether to resolve and return the edits.\n\t\"ResolveEdits\": bool,\n}", - ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/lsp/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/lsp/protocol.ChangeAnnotation,\n}", + ResultDoc: "{\n\t// Holds changes to existing resources.\n\t\"changes\": map[golang.org/x/tools/gopls/internal/protocol.DocumentURI][]golang.org/x/tools/gopls/internal/protocol.TextEdit,\n\t// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\n\t// are either an array of `TextDocumentEdit`s to express changes to n different text documents\n\t// where each text document edit addresses a specific version of a text document. Or it can contain\n\t// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\n\t//\n\t// Whether a client supports versioned document edits is expressed via\n\t// `workspace.workspaceEdit.documentChanges` client capability.\n\t//\n\t// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\n\t// only plain `TextEdit`s using the `changes` property are supported.\n\t\"documentChanges\": []{\n\t\t\"TextDocumentEdit\": {\n\t\t\t\"textDocument\": { ... },\n\t\t\t\"edits\": { ... },\n\t\t},\n\t\t\"RenameFile\": {\n\t\t\t\"kind\": string,\n\t\t\t\"oldUri\": string,\n\t\t\t\"newUri\": string,\n\t\t\t\"options\": { ... },\n\t\t\t\"ResourceOperation\": { ... },\n\t\t},\n\t},\n\t// A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and\n\t// delete file / folder operations.\n\t//\n\t// Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.\n\t//\n\t// @since 3.16.0\n\t\"changeAnnotations\": map[string]golang.org/x/tools/gopls/internal/protocol.ChangeAnnotation,\n}", }, { Command: "gopls.check_upgrades", @@ -770,7 +770,7 @@ var GeneratedAPIJSON = &APIJSON{ Title: "Get known vulncheck result", Doc: "Fetch the result of latest vulnerability check (`govulncheck`).", ArgDoc: "{\n\t// The file URI.\n\t\"URI\": string,\n}", - ResultDoc: "map[golang.org/x/tools/gopls/internal/lsp/protocol.DocumentURI]*golang.org/x/tools/gopls/internal/vulncheck.Result", + ResultDoc: "map[golang.org/x/tools/gopls/internal/protocol.DocumentURI]*golang.org/x/tools/gopls/internal/vulncheck.Result", }, { Command: "gopls.gc_details", diff --git a/gopls/internal/settings/default.go b/gopls/internal/settings/default.go index 941d44b3b31..a017f069c1b 100644 --- a/gopls/internal/settings/default.go +++ b/gopls/internal/settings/default.go @@ -10,7 +10,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) var ( diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 9ff0e2409d6..3f610db411b 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -67,7 +67,7 @@ import ( "golang.org/x/tools/gopls/internal/analysis/useany" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) type Annotation string diff --git a/gopls/internal/telemetry/telemetry.go b/gopls/internal/telemetry/telemetry.go index 2ce284c2bfd..8e7d12f4e92 100644 --- a/gopls/internal/telemetry/telemetry.go +++ b/gopls/internal/telemetry/telemetry.go @@ -13,7 +13,7 @@ import ( "golang.org/x/telemetry" "golang.org/x/telemetry/counter" "golang.org/x/telemetry/upload" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // Mode calls x/telemetry.Mode. diff --git a/gopls/internal/telemetry/telemetry_go118.go b/gopls/internal/telemetry/telemetry_go118.go index 7d0f11c7443..14d739562a4 100644 --- a/gopls/internal/telemetry/telemetry_go118.go +++ b/gopls/internal/telemetry/telemetry_go118.go @@ -7,7 +7,7 @@ package telemetry -import "golang.org/x/tools/gopls/internal/lsp/protocol" +import "golang.org/x/tools/gopls/internal/protocol" func Mode() string { return "local" diff --git a/gopls/internal/telemetry/telemetry_test.go b/gopls/internal/telemetry/telemetry_test.go index 9cb56120c4e..4bef8d229f9 100644 --- a/gopls/internal/telemetry/telemetry_test.go +++ b/gopls/internal/telemetry/telemetry_test.go @@ -20,7 +20,7 @@ import ( "golang.org/x/telemetry/counter/countertest" // requires go1.21+ "golang.org/x/tools/gopls/internal/hooks" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/telemetry" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/template/completion.go b/gopls/internal/template/completion.go index daba50b3577..dfacefc938e 100644 --- a/gopls/internal/template/completion.go +++ b/gopls/internal/template/completion.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // information needed for completion diff --git a/gopls/internal/template/completion_test.go b/gopls/internal/template/completion_test.go index 0fc478842ee..8e1bdbf0535 100644 --- a/gopls/internal/template/completion_test.go +++ b/gopls/internal/template/completion_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func init() { diff --git a/gopls/internal/template/highlight.go b/gopls/internal/template/highlight.go index b3ac349df23..39812cfd0ba 100644 --- a/gopls/internal/template/highlight.go +++ b/gopls/internal/template/highlight.go @@ -11,7 +11,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func Highlight(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, loc protocol.Position) ([]protocol.DocumentHighlight, error) { diff --git a/gopls/internal/template/implementations.go b/gopls/internal/template/implementations.go index 1f8d0cb7165..a2659317d65 100644 --- a/gopls/internal/template/implementations.go +++ b/gopls/internal/template/implementations.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // line number (1-based) and message diff --git a/gopls/internal/template/parse.go b/gopls/internal/template/parse.go index f9ef18f965b..448a5ab51e8 100644 --- a/gopls/internal/template/parse.go +++ b/gopls/internal/template/parse.go @@ -22,7 +22,7 @@ import ( "unicode/utf8" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/template/symbols.go b/gopls/internal/template/symbols.go index fd27af56b72..fcbaec43c54 100644 --- a/gopls/internal/template/symbols.go +++ b/gopls/internal/template/symbols.go @@ -13,7 +13,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/test/integration/bench/codeaction_test.go b/gopls/internal/test/integration/bench/codeaction_test.go index 8f1660b3d52..fe89500da82 100644 --- a/gopls/internal/test/integration/bench/codeaction_test.go +++ b/gopls/internal/test/integration/bench/codeaction_test.go @@ -9,7 +9,7 @@ import ( "sync/atomic" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func BenchmarkCodeAction(b *testing.B) { diff --git a/gopls/internal/test/integration/bench/completion_test.go b/gopls/internal/test/integration/bench/completion_test.go index 7f155f1dfb9..12f5aba0c5b 100644 --- a/gopls/internal/test/integration/bench/completion_test.go +++ b/gopls/internal/test/integration/bench/completion_test.go @@ -10,7 +10,7 @@ import ( "sync/atomic" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/bench/didchange_test.go b/gopls/internal/test/integration/bench/didchange_test.go index 964acfa4872..85cbd18b04c 100644 --- a/gopls/internal/test/integration/bench/didchange_test.go +++ b/gopls/internal/test/integration/bench/didchange_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/bench/iwl_test.go b/gopls/internal/test/integration/bench/iwl_test.go index 83462eb2617..340b95e24ed 100644 --- a/gopls/internal/test/integration/bench/iwl_test.go +++ b/gopls/internal/test/integration/bench/iwl_test.go @@ -8,7 +8,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/bench/typing_test.go b/gopls/internal/test/integration/bench/typing_test.go index 2d8aed62720..78bd16cef5b 100644 --- a/gopls/internal/test/integration/bench/typing_test.go +++ b/gopls/internal/test/integration/bench/typing_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // BenchmarkTyping simulates typing steadily in a single file at different diff --git a/gopls/internal/test/integration/codelens/codelens_test.go b/gopls/internal/test/integration/codelens/codelens_test.go index d0eecdca223..cb36e2c9a94 100644 --- a/gopls/internal/test/integration/codelens/codelens_test.go +++ b/gopls/internal/test/integration/codelens/codelens_test.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/test/integration/codelens/gcdetails_test.go b/gopls/internal/test/integration/codelens/gcdetails_test.go index 486f865d654..963fa64edb1 100644 --- a/gopls/internal/test/integration/codelens/gcdetails_test.go +++ b/gopls/internal/test/integration/codelens/gcdetails_test.go @@ -10,7 +10,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" diff --git a/gopls/internal/test/integration/completion/completion18_test.go b/gopls/internal/test/integration/completion/completion18_test.go index 8e10707f7e9..0ca83778664 100644 --- a/gopls/internal/test/integration/completion/completion18_test.go +++ b/gopls/internal/test/integration/completion/completion18_test.go @@ -10,7 +10,7 @@ package completion import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/completion/completion_test.go b/gopls/internal/test/integration/completion/completion_test.go index 3c50a0c6f0a..b8d866b6263 100644 --- a/gopls/internal/test/integration/completion/completion_test.go +++ b/gopls/internal/test/integration/completion/completion_test.go @@ -13,7 +13,7 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/test/integration/debug/debug_test.go b/gopls/internal/test/integration/debug/debug_test.go index 04dff9062d0..6db656f84b3 100644 --- a/gopls/internal/test/integration/debug/debug_test.go +++ b/gopls/internal/test/integration/debug/debug_test.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/gopls/internal/hooks" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" ) diff --git a/gopls/internal/test/integration/diagnostics/analysis_test.go b/gopls/internal/test/integration/diagnostics/analysis_test.go index 7c20c9d27a9..8cb86f8f735 100644 --- a/gopls/internal/test/integration/diagnostics/analysis_test.go +++ b/gopls/internal/test/integration/diagnostics/analysis_test.go @@ -9,7 +9,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/diagnostics/diagnostics_test.go b/gopls/internal/test/integration/diagnostics/diagnostics_test.go index ead84300afa..dba9532dd6d 100644 --- a/gopls/internal/test/integration/diagnostics/diagnostics_test.go +++ b/gopls/internal/test/integration/diagnostics/diagnostics_test.go @@ -11,7 +11,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" diff --git a/gopls/internal/test/integration/diagnostics/invalidation_test.go b/gopls/internal/test/integration/diagnostics/invalidation_test.go index 795ec809be9..395e7619c57 100644 --- a/gopls/internal/test/integration/diagnostics/invalidation_test.go +++ b/gopls/internal/test/integration/diagnostics/invalidation_test.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/diagnostics/undeclared_test.go b/gopls/internal/test/integration/diagnostics/undeclared_test.go index e6e826fbf64..5579c0752d7 100644 --- a/gopls/internal/test/integration/diagnostics/undeclared_test.go +++ b/gopls/internal/test/integration/diagnostics/undeclared_test.go @@ -7,7 +7,7 @@ package diagnostics import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/env.go b/gopls/internal/test/integration/env.go index 7c290ab5c02..8dab7d72873 100644 --- a/gopls/internal/test/integration/env.go +++ b/gopls/internal/test/integration/env.go @@ -11,7 +11,7 @@ import ( "sync" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/jsonrpc2/servertest" ) diff --git a/gopls/internal/test/integration/env_test.go b/gopls/internal/test/integration/env_test.go index 31a7ebfc55a..02bacd0f3db 100644 --- a/gopls/internal/test/integration/env_test.go +++ b/gopls/internal/test/integration/env_test.go @@ -9,7 +9,7 @@ import ( "encoding/json" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestProgressUpdating(t *testing.T) { diff --git a/gopls/internal/test/integration/expectation.go b/gopls/internal/test/integration/expectation.go index eee7473dc22..c4f91c81af6 100644 --- a/gopls/internal/test/integration/expectation.go +++ b/gopls/internal/test/integration/expectation.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" ) diff --git a/gopls/internal/test/integration/fake/client.go b/gopls/internal/test/integration/fake/client.go index 71f3026a349..2859d9b4047 100644 --- a/gopls/internal/test/integration/fake/client.go +++ b/gopls/internal/test/integration/fake/client.go @@ -11,7 +11,7 @@ import ( "path" "path/filepath" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake/glob" ) diff --git a/gopls/internal/test/integration/fake/edit.go b/gopls/internal/test/integration/fake/edit.go index 93fe2369589..b06984b3dbc 100644 --- a/gopls/internal/test/integration/fake/edit.go +++ b/gopls/internal/test/integration/fake/edit.go @@ -5,7 +5,7 @@ package fake import ( - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/diff" ) diff --git a/gopls/internal/test/integration/fake/edit_test.go b/gopls/internal/test/integration/fake/edit_test.go index 97e2c73e42d..0d7ac18c414 100644 --- a/gopls/internal/test/integration/fake/edit_test.go +++ b/gopls/internal/test/integration/fake/edit_test.go @@ -7,7 +7,7 @@ package fake import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestApplyEdits(t *testing.T) { diff --git a/gopls/internal/test/integration/fake/editor.go b/gopls/internal/test/integration/fake/editor.go index 1b5dc2115e7..f81d837fc7c 100644 --- a/gopls/internal/test/integration/fake/editor.go +++ b/gopls/internal/test/integration/fake/editor.go @@ -18,7 +18,7 @@ import ( "sync" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake/glob" "golang.org/x/tools/gopls/internal/util/pathutil" "golang.org/x/tools/gopls/internal/util/slices" diff --git a/gopls/internal/test/integration/fake/editor_test.go b/gopls/internal/test/integration/fake/editor_test.go index cc8a14744d2..68983bda50c 100644 --- a/gopls/internal/test/integration/fake/editor_test.go +++ b/gopls/internal/test/integration/fake/editor_test.go @@ -8,7 +8,7 @@ import ( "context" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) const exampleProgram = ` diff --git a/gopls/internal/test/integration/fake/workdir.go b/gopls/internal/test/integration/fake/workdir.go index 3e18e97a5a6..4d21554d4a8 100644 --- a/gopls/internal/test/integration/fake/workdir.go +++ b/gopls/internal/test/integration/fake/workdir.go @@ -18,7 +18,7 @@ import ( "sync" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/robustio" ) diff --git a/gopls/internal/test/integration/fake/workdir_test.go b/gopls/internal/test/integration/fake/workdir_test.go index b45b5339991..153a3576b4e 100644 --- a/gopls/internal/test/integration/fake/workdir_test.go +++ b/gopls/internal/test/integration/fake/workdir_test.go @@ -11,7 +11,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) const sharedData = ` diff --git a/gopls/internal/test/integration/misc/call_hierarchy_test.go b/gopls/internal/test/integration/misc/call_hierarchy_test.go index 4587e41bc9a..ebe4d555811 100644 --- a/gopls/internal/test/integration/misc/call_hierarchy_test.go +++ b/gopls/internal/test/integration/misc/call_hierarchy_test.go @@ -6,7 +6,7 @@ package misc import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/debugserver_test.go b/gopls/internal/test/integration/misc/debugserver_test.go index b9c684f61ed..47299388383 100644 --- a/gopls/internal/test/integration/misc/debugserver_test.go +++ b/gopls/internal/test/integration/misc/debugserver_test.go @@ -9,7 +9,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/definition_test.go b/gopls/internal/test/integration/misc/definition_test.go index 9a6d1af8d54..b7394b8dd67 100644 --- a/gopls/internal/test/integration/misc/definition_test.go +++ b/gopls/internal/test/integration/misc/definition_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" - . "golang.org/x/tools/gopls/internal/test/integration" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" ) const internalDefinition = ` diff --git a/gopls/internal/test/integration/misc/extract_test.go b/gopls/internal/test/integration/misc/extract_test.go index d2be705ddfa..5d6c2c5f214 100644 --- a/gopls/internal/test/integration/misc/extract_test.go +++ b/gopls/internal/test/integration/misc/extract_test.go @@ -6,10 +6,10 @@ package misc import ( "testing" - . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestExtractFunction(t *testing.T) { diff --git a/gopls/internal/test/integration/misc/fix_test.go b/gopls/internal/test/integration/misc/fix_test.go index abd48307d4e..9daf5addf87 100644 --- a/gopls/internal/test/integration/misc/fix_test.go +++ b/gopls/internal/test/integration/misc/fix_test.go @@ -10,7 +10,7 @@ import ( "golang.org/x/tools/gopls/internal/test/compare" . "golang.org/x/tools/gopls/internal/test/integration" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // A basic test for fillstruct, now that it uses a command and supports resolve edits. diff --git a/gopls/internal/test/integration/misc/highlight_test.go b/gopls/internal/test/integration/misc/highlight_test.go index 9d992fb7368..9e3dd980464 100644 --- a/gopls/internal/test/integration/misc/highlight_test.go +++ b/gopls/internal/test/integration/misc/highlight_test.go @@ -8,7 +8,7 @@ import ( "sort" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/hover_test.go b/gopls/internal/test/integration/misc/hover_test.go index 66bce0d768c..3853938f12f 100644 --- a/gopls/internal/test/integration/misc/hover_test.go +++ b/gopls/internal/test/integration/misc/hover_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/testenv" diff --git a/gopls/internal/test/integration/misc/import_test.go b/gopls/internal/test/integration/misc/import_test.go index 5e467924b29..736aacf2064 100644 --- a/gopls/internal/test/integration/misc/import_test.go +++ b/gopls/internal/test/integration/misc/import_test.go @@ -9,9 +9,9 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" - . "golang.org/x/tools/gopls/internal/test/integration" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" ) func TestAddImport(t *testing.T) { diff --git a/gopls/internal/test/integration/misc/imports_test.go b/gopls/internal/test/integration/misc/imports_test.go index 4fa7d9d07e3..34ccaf7aa67 100644 --- a/gopls/internal/test/integration/misc/imports_test.go +++ b/gopls/internal/test/integration/misc/imports_test.go @@ -10,10 +10,10 @@ import ( "strings" "testing" - . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) // Tests golang/go#38815. diff --git a/gopls/internal/test/integration/misc/misc_test.go b/gopls/internal/test/integration/misc/misc_test.go index bca00bd9831..1567044caef 100644 --- a/gopls/internal/test/integration/misc/misc_test.go +++ b/gopls/internal/test/integration/misc/misc_test.go @@ -9,7 +9,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/test/integration/misc/prompt_test.go b/gopls/internal/test/integration/misc/prompt_test.go index e2c4f1b524b..7eab9b87d4b 100644 --- a/gopls/internal/test/integration/misc/prompt_test.go +++ b/gopls/internal/test/integration/misc/prompt_test.go @@ -12,9 +12,9 @@ import ( "testing" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" - . "golang.org/x/tools/gopls/internal/test/integration" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" + . "golang.org/x/tools/gopls/internal/test/integration" ) // Test that gopls prompts for telemetry only when it is supposed to. diff --git a/gopls/internal/test/integration/misc/references_test.go b/gopls/internal/test/integration/misc/references_test.go index df198045cb0..fcd72d85c68 100644 --- a/gopls/internal/test/integration/misc/references_test.go +++ b/gopls/internal/test/integration/misc/references_test.go @@ -14,7 +14,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/rename_test.go b/gopls/internal/test/integration/misc/rename_test.go index fe23448e7d2..e3116e1dd2a 100644 --- a/gopls/internal/test/integration/misc/rename_test.go +++ b/gopls/internal/test/integration/misc/rename_test.go @@ -9,9 +9,9 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" - . "golang.org/x/tools/gopls/internal/test/integration" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" ) func TestPrepareRenameMainPackage(t *testing.T) { diff --git a/gopls/internal/test/integration/misc/semantictokens_test.go b/gopls/internal/test/integration/misc/semantictokens_test.go index b0b49ec032b..34a820093a3 100644 --- a/gopls/internal/test/integration/misc/semantictokens_test.go +++ b/gopls/internal/test/integration/misc/semantictokens_test.go @@ -10,7 +10,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/misc/signature_help_test.go b/gopls/internal/test/integration/misc/signature_help_test.go index dcfb416f292..8dffedf48e0 100644 --- a/gopls/internal/test/integration/misc/signature_help_test.go +++ b/gopls/internal/test/integration/misc/signature_help_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/vendor_test.go b/gopls/internal/test/integration/misc/vendor_test.go index 18b08f616bb..af174bf00b1 100644 --- a/gopls/internal/test/integration/misc/vendor_test.go +++ b/gopls/internal/test/integration/misc/vendor_test.go @@ -9,7 +9,7 @@ import ( . "golang.org/x/tools/gopls/internal/test/integration" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) const basicProxy = ` diff --git a/gopls/internal/test/integration/misc/vuln_test.go b/gopls/internal/test/integration/misc/vuln_test.go index 224c9561b0b..c836635577a 100644 --- a/gopls/internal/test/integration/misc/vuln_test.go +++ b/gopls/internal/test/integration/misc/vuln_test.go @@ -19,7 +19,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/vulncheck" diff --git a/gopls/internal/test/integration/modfile/modfile_test.go b/gopls/internal/test/integration/modfile/modfile_test.go index 92d91b14ae2..49ec0c0a5c5 100644 --- a/gopls/internal/test/integration/modfile/modfile_test.go +++ b/gopls/internal/test/integration/modfile/modfile_test.go @@ -15,7 +15,7 @@ import ( . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" ) func TestMain(m *testing.M) { diff --git a/gopls/internal/test/integration/options.go b/gopls/internal/test/integration/options.go index c558da2dfd9..274b9e4ac6c 100644 --- a/gopls/internal/test/integration/options.go +++ b/gopls/internal/test/integration/options.go @@ -5,7 +5,7 @@ package integration import ( - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/runner.go b/gopls/internal/test/integration/runner.go index 0242af52bf8..7696b346b8f 100644 --- a/gopls/internal/test/integration/runner.go +++ b/gopls/internal/test/integration/runner.go @@ -22,8 +22,8 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/jsonrpc2" diff --git a/gopls/internal/test/integration/template/template_test.go b/gopls/internal/test/integration/template/template_test.go index ae6a3a6e8eb..28ea9182284 100644 --- a/gopls/internal/test/integration/template/template_test.go +++ b/gopls/internal/test/integration/template/template_test.go @@ -9,7 +9,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" ) diff --git a/gopls/internal/test/integration/watch/watch_test.go b/gopls/internal/test/integration/watch/watch_test.go index 52017a3d7a6..515fb55d094 100644 --- a/gopls/internal/test/integration/watch/watch_test.go +++ b/gopls/internal/test/integration/watch/watch_test.go @@ -11,7 +11,7 @@ import ( . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/workspace/quickfix_test.go b/gopls/internal/test/integration/workspace/quickfix_test.go index 03042333be8..6f7c8e854d0 100644 --- a/gopls/internal/test/integration/workspace/quickfix_test.go +++ b/gopls/internal/test/integration/workspace/quickfix_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" . "golang.org/x/tools/gopls/internal/test/integration" diff --git a/gopls/internal/test/integration/workspace/standalone_test.go b/gopls/internal/test/integration/workspace/standalone_test.go index e50ead350cd..d837899f7fb 100644 --- a/gopls/internal/test/integration/workspace/standalone_test.go +++ b/gopls/internal/test/integration/workspace/standalone_test.go @@ -9,7 +9,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/workspace/workspace_test.go b/gopls/internal/test/integration/workspace/workspace_test.go index baad7bd002a..781e9027f5c 100644 --- a/gopls/internal/test/integration/workspace/workspace_test.go +++ b/gopls/internal/test/integration/workspace/workspace_test.go @@ -11,7 +11,7 @@ import ( "testing" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/goversion" diff --git a/gopls/internal/test/integration/wrappers.go b/gopls/internal/test/integration/wrappers.go index ebe25b69ebe..c57ca1142f0 100644 --- a/gopls/internal/test/integration/wrappers.go +++ b/gopls/internal/test/integration/wrappers.go @@ -9,7 +9,7 @@ import ( "path" "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/xcontext" ) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index d07ad029ea5..5de4408f141 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -33,8 +33,8 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/protocol" "golang.org/x/tools/gopls/internal/lsprpc" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/compare" "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" diff --git a/gopls/internal/vulncheck/vulntest/db.go b/gopls/internal/vulncheck/vulntest/db.go index 7b637ab890b..659d2f1fd10 100644 --- a/gopls/internal/vulncheck/vulntest/db.go +++ b/gopls/internal/vulncheck/vulntest/db.go @@ -19,7 +19,7 @@ import ( "strings" "time" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/vulncheck/osv" "golang.org/x/tools/txtar" ) diff --git a/gopls/internal/vulncheck/vulntest/db_test.go b/gopls/internal/vulncheck/vulntest/db_test.go index bfab8ca4c59..22281249502 100644 --- a/gopls/internal/vulncheck/vulntest/db_test.go +++ b/gopls/internal/vulncheck/vulntest/db_test.go @@ -17,7 +17,7 @@ import ( "time" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/vulncheck/osv" ) diff --git a/gopls/internal/work/completion.go b/gopls/internal/work/completion.go index 8d43533f208..194721ef36d 100644 --- a/gopls/internal/work/completion.go +++ b/gopls/internal/work/completion.go @@ -16,7 +16,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/work/diagnostics.go b/gopls/internal/work/diagnostics.go index c0b449d9ca2..f1acd4d27c7 100644 --- a/gopls/internal/work/diagnostics.go +++ b/gopls/internal/work/diagnostics.go @@ -13,7 +13,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/work/format.go b/gopls/internal/work/format.go index 1a83e1157fa..162bc8c0004 100644 --- a/gopls/internal/work/format.go +++ b/gopls/internal/work/format.go @@ -10,7 +10,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/work/hover.go b/gopls/internal/work/hover.go index 531a3f79bb0..c59c14789be 100644 --- a/gopls/internal/work/hover.go +++ b/gopls/internal/work/hover.go @@ -12,7 +12,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/protocol" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/internal/diff/lcs/git.sh b/internal/diff/lcs/git.sh index 6856f843958..cbf07225d50 100644 --- a/internal/diff/lcs/git.sh +++ b/internal/diff/lcs/git.sh @@ -16,7 +16,7 @@ set -eu # The largest real source file in the x/tools repo. # file=internal/lsp/source/completion/completion.go # file=internal/lsp/source/diagnostics.go -file=internal/lsp/protocol/tsprotocol.go +file=internal/protocol/tsprotocol.go tmp=$(mktemp -d) git log $file | From 95c6ac4a5bb766fe106b1f86cf1d51accc0e7d38 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 15:37:37 -0500 Subject: [PATCH 055/105] gopls/internal/protocol/command: move from ../lsp The lsp directory is no more. Change-Id: I7badd01645c7faab841e6219387cb84d8b893f2b Reviewed-on: https://go-review.googlesource.com/c/tools/+/557741 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> --- cmd/deadcode/doc.go | 2 +- gopls/doc/design/implementation.md | 2 +- gopls/doc/generate.go | 4 ++-- gopls/internal/cache/cache.go | 2 +- gopls/internal/cache/errors.go | 2 +- gopls/internal/cache/mod.go | 2 +- gopls/internal/cache/mod_tidy.go | 2 +- gopls/internal/cache/snapshot.go | 2 +- gopls/internal/cmd/cmd.go | 2 +- gopls/internal/cmd/execute.go | 2 +- gopls/internal/cmd/remote.go | 2 +- gopls/internal/cmd/stats.go | 2 +- gopls/internal/cmd/usage/vulncheck.hlp | 2 +- gopls/internal/cmd/vulncheck.go | 2 +- gopls/internal/golang/code_lens.go | 2 +- gopls/internal/golang/codeaction.go | 2 +- gopls/internal/lsprpc/lsprpc.go | 2 +- gopls/internal/mod/code_lens.go | 2 +- gopls/internal/mod/diagnostics.go | 2 +- gopls/internal/{lsp => protocol}/command/command_gen.go | 0 gopls/internal/{lsp => protocol}/command/commandmeta/meta.go | 4 ++-- gopls/internal/{lsp => protocol}/command/gen/gen.go | 4 ++-- gopls/internal/{lsp => protocol}/command/generate.go | 2 +- gopls/internal/{lsp => protocol}/command/interface.go | 0 gopls/internal/{lsp => protocol}/command/interface_test.go | 2 +- gopls/internal/{lsp => protocol}/command/util.go | 0 gopls/internal/server/code_action.go | 2 +- gopls/internal/server/code_lens.go | 2 +- gopls/internal/server/command.go | 2 +- gopls/internal/settings/default.go | 2 +- gopls/internal/settings/settings.go | 2 +- gopls/internal/telemetry/telemetry_test.go | 2 +- gopls/internal/test/integration/bench/bench_test.go | 2 +- gopls/internal/test/integration/bench/iwl_test.go | 2 +- gopls/internal/test/integration/codelens/codelens_test.go | 2 +- gopls/internal/test/integration/codelens/gcdetails_test.go | 2 +- gopls/internal/test/integration/debug/debug_test.go | 2 +- gopls/internal/test/integration/fake/editor.go | 2 +- gopls/internal/test/integration/misc/debugserver_test.go | 2 +- gopls/internal/test/integration/misc/import_test.go | 2 +- gopls/internal/test/integration/misc/prompt_test.go | 2 +- gopls/internal/test/integration/misc/vuln_test.go | 2 +- gopls/internal/test/integration/workspace/zero_config_test.go | 2 +- gopls/internal/test/integration/wrappers.go | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) rename gopls/internal/{lsp => protocol}/command/command_gen.go (100%) rename gopls/internal/{lsp => protocol}/command/commandmeta/meta.go (98%) rename gopls/internal/{lsp => protocol}/command/gen/gen.go (96%) rename gopls/internal/{lsp => protocol}/command/generate.go (87%) rename gopls/internal/{lsp => protocol}/command/interface.go (100%) rename gopls/internal/{lsp => protocol}/command/interface_test.go (92%) rename gopls/internal/{lsp => protocol}/command/util.go (100%) diff --git a/cmd/deadcode/doc.go b/cmd/deadcode/doc.go index edc8dfd7bd7..66a150dd19d 100644 --- a/cmd/deadcode/doc.go +++ b/cmd/deadcode/doc.go @@ -63,7 +63,7 @@ With no flags, the command prints the name and location of each dead function in the form of a typical compiler diagnostic, for example: $ deadcode -f='{{range .Funcs}}{{println .Position}}{{end}}' -test ./gopls/... - gopls/internal/lsp/command.go:1206:6: unreachable func: openClientEditor + gopls/internal/protocol/command.go:1206:6: unreachable func: openClientEditor gopls/internal/template/parse.go:414:18: unreachable func: Parsed.WriteNode gopls/internal/template/parse.go:419:18: unreachable func: wrNode.writeNode diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index 8bd3c693db0..a7124b23e41 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -147,7 +147,7 @@ provided as a debugging aid (but see [cache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache [cmd]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cmd -[command]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/command +[command]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/protocol/command [debug]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/debug [file]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/file [filecache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/filecache diff --git a/gopls/doc/generate.go b/gopls/doc/generate.go index 99d15b2966e..58f1123fe7e 100644 --- a/gopls/doc/generate.go +++ b/gopls/doc/generate.go @@ -33,9 +33,9 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/command" - "golang.org/x/tools/gopls/internal/lsp/command/commandmeta" "golang.org/x/tools/gopls/internal/mod" + "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/gopls/internal/protocol/command/commandmeta" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/safetoken" ) diff --git a/gopls/internal/cache/cache.go b/gopls/internal/cache/cache.go index d1d83f99e4f..310cf02bbbf 100644 --- a/gopls/internal/cache/cache.go +++ b/gopls/internal/cache/cache.go @@ -9,7 +9,7 @@ import ( "strconv" "sync/atomic" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/internal/memoize" ) diff --git a/gopls/internal/cache/errors.go b/gopls/internal/cache/errors.go index 2ec6c63502e..1ed193b5d61 100644 --- a/gopls/internal/cache/errors.go +++ b/gopls/internal/cache/errors.go @@ -23,7 +23,7 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/cache/mod.go b/gopls/internal/cache/mod.go index 87d3f0d81fd..35946f81084 100644 --- a/gopls/internal/cache/mod.go +++ b/gopls/internal/cache/mod.go @@ -15,7 +15,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/module" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" diff --git a/gopls/internal/cache/mod_tidy.go b/gopls/internal/cache/mod_tidy.go index 7bf06eb3cd3..6dbe9820182 100644 --- a/gopls/internal/cache/mod_tidy.go +++ b/gopls/internal/cache/mod_tidy.go @@ -17,7 +17,7 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/diff" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/cache/snapshot.go b/gopls/internal/cache/snapshot.go index 376345c3be5..a375a580543 100644 --- a/gopls/internal/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -34,7 +34,7 @@ import ( "golang.org/x/tools/gopls/internal/cache/methodsets" "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/cache/xrefs" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index c4cb012f87c..31ca0981c87 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -24,9 +24,9 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsprpc" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/browser" diff --git a/gopls/internal/cmd/execute.go b/gopls/internal/cmd/execute.go index 62a69290cc0..381c2a7aa95 100644 --- a/gopls/internal/cmd/execute.go +++ b/gopls/internal/cmd/execute.go @@ -13,8 +13,8 @@ import ( "os" "strings" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/internal/tool" diff --git a/gopls/internal/cmd/remote.go b/gopls/internal/cmd/remote.go index 58e7c2ffb85..8de4365fc9d 100644 --- a/gopls/internal/cmd/remote.go +++ b/gopls/internal/cmd/remote.go @@ -13,8 +13,8 @@ import ( "log" "os" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/lsprpc" + "golang.org/x/tools/gopls/internal/protocol/command" ) type remote struct { diff --git a/gopls/internal/cmd/stats.go b/gopls/internal/cmd/stats.go index 8103434eb2f..5e8f0c59385 100644 --- a/gopls/internal/cmd/stats.go +++ b/gopls/internal/cmd/stats.go @@ -20,8 +20,8 @@ import ( "time" "golang.org/x/tools/gopls/internal/filecache" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" bugpkg "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/cmd/usage/vulncheck.hlp b/gopls/internal/cmd/usage/vulncheck.hlp index d16cb130871..7f2818dd40c 100644 --- a/gopls/internal/cmd/usage/vulncheck.hlp +++ b/gopls/internal/cmd/usage/vulncheck.hlp @@ -6,7 +6,7 @@ Usage: WARNING: this command is for internal-use only. By default, the command outputs a JSON-encoded - golang.org/x/tools/gopls/internal/lsp/command.VulncheckResult + golang.org/x/tools/gopls/internal/protocol/command.VulncheckResult message. Example: $ gopls vulncheck <packages> diff --git a/gopls/internal/cmd/vulncheck.go b/gopls/internal/cmd/vulncheck.go index 855b9eef830..7babf0d14d7 100644 --- a/gopls/internal/cmd/vulncheck.go +++ b/gopls/internal/cmd/vulncheck.go @@ -30,7 +30,7 @@ func (v *vulncheck) DetailedHelp(f *flag.FlagSet) { WARNING: this command is for internal-use only. By default, the command outputs a JSON-encoded - golang.org/x/tools/gopls/internal/lsp/command.VulncheckResult + golang.org/x/tools/gopls/internal/protocol/command.VulncheckResult message. Example: $ gopls vulncheck <packages> diff --git a/gopls/internal/golang/code_lens.go b/gopls/internal/golang/code_lens.go index dcade445715..b9f3d7134cd 100644 --- a/gopls/internal/golang/code_lens.go +++ b/gopls/internal/golang/code_lens.go @@ -14,7 +14,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" ) diff --git a/gopls/internal/golang/codeaction.go b/gopls/internal/golang/codeaction.go index e94e29c8971..3af0763ff78 100644 --- a/gopls/internal/golang/codeaction.go +++ b/gopls/internal/golang/codeaction.go @@ -16,7 +16,7 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/lsprpc/lsprpc.go b/gopls/internal/lsprpc/lsprpc.go index 0b7136ee4ac..6f5e48ce65e 100644 --- a/gopls/internal/lsprpc/lsprpc.go +++ b/gopls/internal/lsprpc/lsprpc.go @@ -21,7 +21,7 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" diff --git a/gopls/internal/mod/code_lens.go b/gopls/internal/mod/code_lens.go index 51cf8663ff1..85d8182e8fe 100644 --- a/gopls/internal/mod/code_lens.go +++ b/gopls/internal/mod/code_lens.go @@ -14,8 +14,8 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" ) // LensFuncs returns the supported lensFuncs for go.mod files. diff --git a/gopls/internal/mod/diagnostics.go b/gopls/internal/mod/diagnostics.go index d65d010b69b..655beedeb27 100644 --- a/gopls/internal/mod/diagnostics.go +++ b/gopls/internal/mod/diagnostics.go @@ -19,8 +19,8 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/vulncheck/govulncheck" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/lsp/command/command_gen.go b/gopls/internal/protocol/command/command_gen.go similarity index 100% rename from gopls/internal/lsp/command/command_gen.go rename to gopls/internal/protocol/command/command_gen.go diff --git a/gopls/internal/lsp/command/commandmeta/meta.go b/gopls/internal/protocol/command/commandmeta/meta.go similarity index 98% rename from gopls/internal/lsp/command/commandmeta/meta.go rename to gopls/internal/protocol/command/commandmeta/meta.go index bf85c4faa9b..d468534ffe0 100644 --- a/gopls/internal/lsp/command/commandmeta/meta.go +++ b/gopls/internal/protocol/command/commandmeta/meta.go @@ -17,7 +17,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" ) type Command struct { @@ -52,7 +52,7 @@ func Load() (*packages.Package, []*Command, error) { Mode: packages.NeedTypes | packages.NeedTypesInfo | packages.NeedSyntax | packages.NeedImports | packages.NeedDeps, BuildFlags: []string{"-tags=generate"}, }, - "golang.org/x/tools/gopls/internal/lsp/command", + "golang.org/x/tools/gopls/internal/protocol/command", ) if err != nil { return nil, nil, fmt.Errorf("packages.Load: %v", err) diff --git a/gopls/internal/lsp/command/gen/gen.go b/gopls/internal/protocol/command/gen/gen.go similarity index 96% rename from gopls/internal/lsp/command/gen/gen.go rename to gopls/internal/protocol/command/gen/gen.go index 31bd65dd8ee..15ff467f3e3 100644 --- a/gopls/internal/lsp/command/gen/gen.go +++ b/gopls/internal/protocol/command/gen/gen.go @@ -12,7 +12,7 @@ import ( "go/types" "text/template" - "golang.org/x/tools/gopls/internal/lsp/command/commandmeta" + "golang.org/x/tools/gopls/internal/protocol/command/commandmeta" "golang.org/x/tools/internal/imports" ) @@ -115,7 +115,7 @@ func Generate() ([]byte, error) { "golang.org/x/tools/gopls/internal/protocol": true, }, } - const thispkg = "golang.org/x/tools/gopls/internal/lsp/command" + const thispkg = "golang.org/x/tools/gopls/internal/protocol/command" for _, c := range d.Commands { for _, arg := range c.Args { pth := pkgPath(arg.Type) diff --git a/gopls/internal/lsp/command/generate.go b/gopls/internal/protocol/command/generate.go similarity index 87% rename from gopls/internal/lsp/command/generate.go rename to gopls/internal/protocol/command/generate.go index b7907e60f5c..f63b2e6e5ba 100644 --- a/gopls/internal/lsp/command/generate.go +++ b/gopls/internal/protocol/command/generate.go @@ -11,7 +11,7 @@ import ( "log" "os" - "golang.org/x/tools/gopls/internal/lsp/command/gen" + "golang.org/x/tools/gopls/internal/protocol/command/gen" ) func main() { diff --git a/gopls/internal/lsp/command/interface.go b/gopls/internal/protocol/command/interface.go similarity index 100% rename from gopls/internal/lsp/command/interface.go rename to gopls/internal/protocol/command/interface.go diff --git a/gopls/internal/lsp/command/interface_test.go b/gopls/internal/protocol/command/interface_test.go similarity index 92% rename from gopls/internal/lsp/command/interface_test.go rename to gopls/internal/protocol/command/interface_test.go index f81a2aa22fd..4ddc5fa2e67 100644 --- a/gopls/internal/lsp/command/interface_test.go +++ b/gopls/internal/protocol/command/interface_test.go @@ -9,7 +9,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/command/gen" + "golang.org/x/tools/gopls/internal/protocol/command/gen" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/lsp/command/util.go b/gopls/internal/protocol/command/util.go similarity index 100% rename from gopls/internal/lsp/command/util.go rename to gopls/internal/protocol/command/util.go diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 3f3d3607896..3346ce259f6 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -15,9 +15,9 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/server/code_lens.go b/gopls/internal/server/code_lens.go index 21b4a9ae948..7e6506c2b65 100644 --- a/gopls/internal/server/code_lens.go +++ b/gopls/internal/server/code_lens.go @@ -11,9 +11,9 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/mod" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) diff --git a/gopls/internal/server/command.go b/gopls/internal/server/command.go index 95710e818dd..8681db7e0ac 100644 --- a/gopls/internal/server/command.go +++ b/gopls/internal/server/command.go @@ -28,9 +28,9 @@ import ( "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/progress" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/telemetry" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/settings/default.go b/gopls/internal/settings/default.go index a017f069c1b..74b98c82555 100644 --- a/gopls/internal/settings/default.go +++ b/gopls/internal/settings/default.go @@ -9,8 +9,8 @@ import ( "time" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" ) var ( diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 3f610db411b..56be112c504 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -66,8 +66,8 @@ import ( "golang.org/x/tools/gopls/internal/analysis/unusedvariable" "golang.org/x/tools/gopls/internal/analysis/useany" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" ) type Annotation string diff --git a/gopls/internal/telemetry/telemetry_test.go b/gopls/internal/telemetry/telemetry_test.go index 4bef8d229f9..b52ac7093c7 100644 --- a/gopls/internal/telemetry/telemetry_test.go +++ b/gopls/internal/telemetry/telemetry_test.go @@ -19,8 +19,8 @@ import ( "golang.org/x/telemetry/counter" "golang.org/x/telemetry/counter/countertest" // requires go1.21+ "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/telemetry" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/test/integration/bench/bench_test.go b/gopls/internal/test/integration/bench/bench_test.go index 087ec9564ae..5ae46c9ae3d 100644 --- a/gopls/internal/test/integration/bench/bench_test.go +++ b/gopls/internal/test/integration/bench/bench_test.go @@ -22,7 +22,7 @@ import ( "golang.org/x/tools/gopls/internal/cmd" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/test/integration/bench/iwl_test.go b/gopls/internal/test/integration/bench/iwl_test.go index 340b95e24ed..e7f798f1636 100644 --- a/gopls/internal/test/integration/bench/iwl_test.go +++ b/gopls/internal/test/integration/bench/iwl_test.go @@ -7,8 +7,8 @@ package bench import ( "testing" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" ) diff --git a/gopls/internal/test/integration/codelens/codelens_test.go b/gopls/internal/test/integration/codelens/codelens_test.go index cb36e2c9a94..07ad3b9431b 100644 --- a/gopls/internal/test/integration/codelens/codelens_test.go +++ b/gopls/internal/test/integration/codelens/codelens_test.go @@ -14,8 +14,8 @@ import ( . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/internal/testenv" ) diff --git a/gopls/internal/test/integration/codelens/gcdetails_test.go b/gopls/internal/test/integration/codelens/gcdetails_test.go index 963fa64edb1..4d3024defe5 100644 --- a/gopls/internal/test/integration/codelens/gcdetails_test.go +++ b/gopls/internal/test/integration/codelens/gcdetails_test.go @@ -9,8 +9,8 @@ import ( "strings" "testing" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/integration/fake" diff --git a/gopls/internal/test/integration/debug/debug_test.go b/gopls/internal/test/integration/debug/debug_test.go index 6db656f84b3..255a8e1b90d 100644 --- a/gopls/internal/test/integration/debug/debug_test.go +++ b/gopls/internal/test/integration/debug/debug_test.go @@ -13,8 +13,8 @@ import ( "testing" "golang.org/x/tools/gopls/internal/hooks" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/util/bug" ) diff --git a/gopls/internal/test/integration/fake/editor.go b/gopls/internal/test/integration/fake/editor.go index f81d837fc7c..c3659f8d005 100644 --- a/gopls/internal/test/integration/fake/editor.go +++ b/gopls/internal/test/integration/fake/editor.go @@ -17,8 +17,8 @@ import ( "strings" "sync" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/test/integration/fake/glob" "golang.org/x/tools/gopls/internal/util/pathutil" "golang.org/x/tools/gopls/internal/util/slices" diff --git a/gopls/internal/test/integration/misc/debugserver_test.go b/gopls/internal/test/integration/misc/debugserver_test.go index 47299388383..d1ce21bd47a 100644 --- a/gopls/internal/test/integration/misc/debugserver_test.go +++ b/gopls/internal/test/integration/misc/debugserver_test.go @@ -8,8 +8,8 @@ import ( "net/http" "testing" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/import_test.go b/gopls/internal/test/integration/misc/import_test.go index 736aacf2064..0df3f8dadec 100644 --- a/gopls/internal/test/integration/misc/import_test.go +++ b/gopls/internal/test/integration/misc/import_test.go @@ -8,8 +8,8 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/test/compare" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/prompt_test.go b/gopls/internal/test/integration/misc/prompt_test.go index 7eab9b87d4b..26c0e9322ac 100644 --- a/gopls/internal/test/integration/misc/prompt_test.go +++ b/gopls/internal/test/integration/misc/prompt_test.go @@ -11,8 +11,8 @@ import ( "regexp" "testing" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/misc/vuln_test.go b/gopls/internal/test/integration/misc/vuln_test.go index c836635577a..884fc79d31b 100644 --- a/gopls/internal/test/integration/misc/vuln_test.go +++ b/gopls/internal/test/integration/misc/vuln_test.go @@ -18,8 +18,8 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/test/compare" . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/vulncheck" diff --git a/gopls/internal/test/integration/workspace/zero_config_test.go b/gopls/internal/test/integration/workspace/zero_config_test.go index d0535e0f1e2..51fd9a7dbd2 100644 --- a/gopls/internal/test/integration/workspace/zero_config_test.go +++ b/gopls/internal/test/integration/workspace/zero_config_test.go @@ -9,7 +9,7 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/lsp/command" + "golang.org/x/tools/gopls/internal/protocol/command" . "golang.org/x/tools/gopls/internal/test/integration" ) diff --git a/gopls/internal/test/integration/wrappers.go b/gopls/internal/test/integration/wrappers.go index c57ca1142f0..cc4a66d79fd 100644 --- a/gopls/internal/test/integration/wrappers.go +++ b/gopls/internal/test/integration/wrappers.go @@ -8,8 +8,8 @@ import ( "encoding/json" "path" - "golang.org/x/tools/gopls/internal/lsp/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/xcontext" ) From 238800b70a411f2d8d12e45d6264fb4281a80713 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 16:03:37 -0500 Subject: [PATCH 056/105] gopls: manual tweaks after the lsp/ -> . rename Also, update docs on testing. Change-Id: Ie0381a84452162fe8036ae5e0be0f89071bebfd7 Reviewed-on: https://go-review.googlesource.com/c/tools/+/557742 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Alan Donovan <adonovan@google.com> --- copyright/copyright.go | 2 +- gopls/doc/contributing.md | 68 ++++++++++--------- gopls/doc/design/implementation.md | 11 ++- gopls/doc/settings.md | 2 +- gopls/internal/golang/call_hierarchy.go | 2 +- gopls/internal/golang/change_signature.go | 2 +- gopls/internal/golang/code_lens.go | 4 +- gopls/internal/golang/codeaction.go | 4 +- gopls/internal/golang/comment_go119.go | 6 +- gopls/internal/golang/definition.go | 2 +- gopls/internal/golang/diagnostics.go | 2 +- gopls/internal/golang/fix.go | 4 +- gopls/internal/golang/folding_range.go | 2 +- gopls/internal/golang/format.go | 2 +- gopls/internal/golang/highlight.go | 2 +- gopls/internal/golang/hover.go | 2 +- gopls/internal/golang/implementation.go | 2 +- gopls/internal/golang/inlay_hint.go | 2 +- gopls/internal/golang/known_packages.go | 2 +- gopls/internal/golang/references.go | 2 +- gopls/internal/golang/rename.go | 2 +- gopls/internal/golang/signature_help.go | 2 +- gopls/internal/golang/symbols.go | 2 +- gopls/internal/golang/type_definition.go | 2 +- gopls/internal/lsprpc/lsprpc.go | 4 +- gopls/internal/lsprpc/lsprpc_test.go | 2 +- .../test/integration/watch/watch_test.go | 2 +- internal/diff/lcs/git.sh | 4 +- 28 files changed, 71 insertions(+), 74 deletions(-) diff --git a/copyright/copyright.go b/copyright/copyright.go index c084bd0cda8..b13b56e85f1 100644 --- a/copyright/copyright.go +++ b/copyright/copyright.go @@ -94,7 +94,7 @@ func checkFile(toolsDir, filename string) (bool, error) { return shouldAddCopyright, nil } -// Copied from golang.org/x/tools/gopls/internal/lsp/source/util.go. +// Copied from golang.org/x/tools/gopls/internal/golang/util.go. // Matches cgo generated comment as well as the proposed standard: // // https://golang.org/s/generatedcode diff --git a/gopls/doc/contributing.md b/gopls/doc/contributing.md index aee90294e0c..a2f987b63c9 100644 --- a/gopls/doc/contributing.md +++ b/gopls/doc/contributing.md @@ -18,8 +18,8 @@ claiming it. ## Getting started -Most of the `gopls` logic is in the `golang.org/x/tools/gopls/internal/lsp` -directory. +Most of the `gopls` logic is in the `golang.org/x/tools/gopls/internal` +directory. See [design/implementation.md] for an overview of the code organization. ## Build @@ -94,41 +94,43 @@ Users are invited to share it if they are willing. ## Testing -To run tests for just `gopls/`, run, +The normal command you should use to run the tests after a change is: ```bash -cd /path/to/tools/gopls -go test ./... -``` - -But, much of the gopls work involves `internal/lsp` too, so you will want to -run both: - -```bash -cd /path/to/tools -cd gopls && go test ./... -cd .. -go test ./internal/lsp/... +gopls$ go test -short ./... ``` -There is additional information about the `internal/lsp` tests in the -[internal/lsp/tests `README`](https://github.com/golang/tools/blob/master/internal/lsp/tests/README.md). - -### Integration tests - -gopls has a suite of integration tests defined in the `./gopls/internal/test/integration` -directory. Each of these tests writes files to a temporary directory, starts a -separate gopls session, and scripts interactions using an editor-like API. As a -result of this overhead they can be quite slow, particularly on systems where -file operations are costly. - -Due to the asynchronous nature of the LSP, integration tests assert -'expectations' that the editor state must achieve _eventually_. This can -make debugging the integration tests difficult. To aid with debugging, the tests -output their LSP logs on any failure. If your CL gets a test failure while -running the tests, please do take a look at the description of the error and -the LSP logs, but don't hesitate to [reach out](#getting-help) to the gopls -team if you need help. +(The `-short` flag skips some slow-running ones. The trybot builders +run the complete set, on a wide range of platforms.) + +Gopls tests are a mix of two kinds. + +- [Marker tests](../internal/test/marker) express each test scenario + in a standalone text file that contains the target .go, go.mod, and + go.work files, in which special annotations embedded in comments + drive the test. These tests are generally easy to write and fast + to iterate, but have limitations on what they can express. + +- [Integration tests](../internal/test/integration) are regular Go + `func Test(*testing.T)` functions that make a series of calls to an + API for a fake LSP-enabled client editor. The API allows you to open + and edit a file, navigate to a definition, invoke other LSP + operations, and assert properties about the state. + + Due to the asynchronous nature of the LSP, integration tests make + assertions about states that the editor must achieve eventually, + even when the program goes wrong quickly, it may take a while before + the error is reported as a failure to achieve the desired state + within several minutes. We recommend that you set + `GOPLS_INTEGRATION_TEST_TIMEOUT=10s` to reduce the timeout for + integration tests when debugging. + + When they fail, the integration tests print the log of the LSP + session between client and server. Though verbose, they are very + helpful for debugging once you know how to read them. + +Don't hesitate to [reach out](#getting-help) to the gopls team if you +need help. ### CI diff --git a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md index a7124b23e41..12d655c0b5e 100644 --- a/gopls/doc/design/implementation.md +++ b/gopls/doc/design/implementation.md @@ -18,7 +18,7 @@ referred to by their last segment, which is usually unambiguous. The height of each blob corresponds loosely to its technical depth. Some blocks are wide and shallow, such as [protocol], which declares Go types for the entire LSP protocol. Others are deep, such as [cache] -and [source], as they contain a lot of dense logic and algorithms. +and [golang], as they contain a lot of dense logic and algorithms. <!-- Source: https://docs.google.com/drawings/d/1CK6YSLt7G3svRoZf7skJI-lxRol2VI90YOxHcYS0DP4 --> ![Gopls architecture](architecture.svg) @@ -106,7 +106,7 @@ particular language: [mod] for go.mod files; [work] for go.work files; [template] for files in `text/template` syntax; and -[source], for files in Go itself. +[golang], for files in Go itself. This package, by far the largest, provides the main features of gopls: navigation, analysis, and refactoring of Go code. As most users imagine it, this package _is_ gopls. @@ -125,7 +125,7 @@ order the packages based on the sequence in which they are encountered during processing of a particular request; in such a view, the bottom layer would represent the "wire" (protocol and command), the next layer up would hold the RPC-related packages (lsprpc and server), and -features (e.g. source, mod, work, template) would be at the top. +features (e.g. golang, mod, work, template) would be at the top. <!-- A dynamic view would be an interesting topic for another article. @@ -148,14 +148,13 @@ provided as a debugging aid (but see [cache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache [cmd]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cmd [command]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/protocol/command -[debug]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/debug +[debug]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/debug [file]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/file [filecache]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/filecache [go/analysis]: https://pkg.go.dev/golang.org/x/tools@master/go/analysis [go/packages]: https://pkg.go.dev/golang.org/x/tools@master/go/packages [gopls]: https://pkg.go.dev/golang.org/x/tools/gopls@master [jsonrpc2]: https://pkg.go.dev/golang.org/x/tools@master/internal/jsonrpc2 -[lsp]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp [lsprpc]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsprpc [memoize]: https://github.com/golang/tools/tree/master/internal/memoize [metadata]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/metadata @@ -165,7 +164,7 @@ provided as a debugging aid (but see [protocol]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/protocol [server]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/server [settings]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/settings -[source]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/lsp/source +[golang]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/golang [template]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/template [typerefs]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/cache/typerefs [work]: https://pkg.go.dev/golang.org/x/tools/gopls@master/internal/work diff --git a/gopls/doc/settings.md b/gopls/doc/settings.md index 6ea7b185b61..9f692cf6848 100644 --- a/gopls/doc/settings.md +++ b/gopls/doc/settings.md @@ -1,6 +1,6 @@ # Settings -<!--TODO: Generate this file from the documentation in golang.org/x/tools/gopls/internal/lsp/source/options.go.--> +<!--TODO: Generate this file from the documentation in golang.org/x/tools/gopls/internal/golang/options.go.--> This document describes the global settings for `gopls` inside the editor. The settings block will be called `"gopls"` and contains a collection of diff --git a/gopls/internal/golang/call_hierarchy.go b/gopls/internal/golang/call_hierarchy.go index 4072f993804..87a6a54e458 100644 --- a/gopls/internal/golang/call_hierarchy.go +++ b/gopls/internal/golang/call_hierarchy.go @@ -14,8 +14,8 @@ import ( "path/filepath" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/change_signature.go b/gopls/internal/golang/change_signature.go index 527d2df3cf4..e0a829e128e 100644 --- a/gopls/internal/golang/change_signature.go +++ b/gopls/internal/golang/change_signature.go @@ -16,9 +16,9 @@ import ( "regexp" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/code_lens.go b/gopls/internal/golang/code_lens.go index b9f3d7134cd..c4a7e5f82c8 100644 --- a/gopls/internal/golang/code_lens.go +++ b/gopls/internal/golang/code_lens.go @@ -12,10 +12,10 @@ import ( "regexp" "strings" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" ) type LensFunc func(context.Context, *cache.Snapshot, file.Handle) ([]protocol.CodeLens, error) diff --git a/gopls/internal/golang/codeaction.go b/gopls/internal/golang/codeaction.go index 3af0763ff78..a9aae821be8 100644 --- a/gopls/internal/golang/codeaction.go +++ b/gopls/internal/golang/codeaction.go @@ -13,11 +13,11 @@ import ( "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/gopls/internal/analysis/fillstruct" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" - "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/slices" diff --git a/gopls/internal/golang/comment_go119.go b/gopls/internal/golang/comment_go119.go index b9b1472f74d..eec338d54fa 100644 --- a/gopls/internal/golang/comment_go119.go +++ b/gopls/internal/golang/comment_go119.go @@ -11,11 +11,7 @@ package golang // is a new package (go/doc/comment) for processing them. // As long as gopls has to compile under earlier versions, tests // have to pass with both the old and new code, which produce -// slightly different results. (cmd/test/definition.go, source/comment_test.go, -// and source/source_test.go) Each of the test files checks the results -// with a function, tests.CheckSameMarkdown, that accepts both the old and the new -// results. (The old code escapes many characters the new code does not, -// and the new code sometimes adds a blank line.) +// slightly different results. // When gopls no longer needs to compile with go1.18, the old comment.go should // be replaced by this file, the golden test files should be updated. diff --git a/gopls/internal/golang/definition.go b/gopls/internal/golang/definition.go index 515235997fa..d59573db587 100644 --- a/gopls/internal/golang/definition.go +++ b/gopls/internal/golang/definition.go @@ -13,10 +13,10 @@ import ( "go/token" "go/types" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/diagnostics.go b/gopls/internal/golang/diagnostics.go index a9ad9d9d939..b0fa8daf83c 100644 --- a/gopls/internal/golang/diagnostics.go +++ b/gopls/internal/golang/diagnostics.go @@ -9,8 +9,8 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" - "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/progress" + "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" ) diff --git a/gopls/internal/golang/fix.go b/gopls/internal/golang/fix.go index f61de5142dc..6f07cb869c5 100644 --- a/gopls/internal/golang/fix.go +++ b/gopls/internal/golang/fix.go @@ -17,9 +17,9 @@ import ( "golang.org/x/tools/gopls/internal/analysis/stubmethods" "golang.org/x/tools/gopls/internal/analysis/undeclaredname" "golang.org/x/tools/gopls/internal/analysis/unusedparams" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/imports" @@ -191,7 +191,7 @@ func suggestedFixToEdits(ctx context.Context, snapshot *cache.Snapshot, fset *to // addEmbedImport adds a missing embed "embed" import with blank name. func addEmbedImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Package, pgf *parsego.File, _, _ token.Pos) (*token.FileSet, *analysis.SuggestedFix, error) { - // Like goalng.AddImport, but with _ as Name and using our pgf. + // Like golang.AddImport, but with _ as Name and using our pgf. protoEdits, err := ComputeOneImportFixEdits(snapshot, pgf, &imports.ImportFix{ StmtInfo: imports.ImportInfo{ ImportPath: "embed", diff --git a/gopls/internal/golang/folding_range.go b/gopls/internal/golang/folding_range.go index 26c179c99c3..c856f0a1184 100644 --- a/gopls/internal/golang/folding_range.go +++ b/gopls/internal/golang/folding_range.go @@ -11,8 +11,8 @@ import ( "sort" "strings" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/format.go b/gopls/internal/golang/format.go index 3ba5cabbbe8..2eb2b8b01e4 100644 --- a/gopls/internal/golang/format.go +++ b/gopls/internal/golang/format.go @@ -17,8 +17,8 @@ import ( "strings" "text/scanner" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/diff" diff --git a/gopls/internal/golang/highlight.go b/gopls/internal/golang/highlight.go index 5f90cb40ee9..947acba4a84 100644 --- a/gopls/internal/golang/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -12,8 +12,8 @@ import ( "go/types" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index a6b7e745074..c4f051b44ba 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -25,10 +25,10 @@ import ( "golang.org/x/text/unicode/runenames" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/implementation.go b/gopls/internal/golang/implementation.go index bd050ea5a15..cb7dadbb380 100644 --- a/gopls/internal/golang/implementation.go +++ b/gopls/internal/golang/implementation.go @@ -17,10 +17,10 @@ import ( "sync" "golang.org/x/sync/errgroup" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/methodsets" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/inlay_hint.go b/gopls/internal/golang/inlay_hint.go index 324609e4fed..6f35c8e5786 100644 --- a/gopls/internal/golang/inlay_hint.go +++ b/gopls/internal/golang/inlay_hint.go @@ -13,8 +13,8 @@ import ( "go/types" "strings" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/golang/known_packages.go b/gopls/internal/golang/known_packages.go index c9887fc2089..60a89ca0285 100644 --- a/gopls/internal/golang/known_packages.go +++ b/gopls/internal/golang/known_packages.go @@ -13,9 +13,9 @@ import ( "sync" "time" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/imports" ) diff --git a/gopls/internal/golang/references.go b/gopls/internal/golang/references.go index c45fe30ae28..c448830a1d0 100644 --- a/gopls/internal/golang/references.go +++ b/gopls/internal/golang/references.go @@ -25,10 +25,10 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/types/objectpath" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/methodsets" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/rename.go b/gopls/internal/golang/rename.go index 57018453103..29485413865 100644 --- a/gopls/internal/golang/rename.go +++ b/gopls/internal/golang/rename.go @@ -59,10 +59,10 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/go/types/typeutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/parsego" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" diff --git a/gopls/internal/golang/signature_help.go b/gopls/internal/golang/signature_help.go index 5aeb6983a43..0da1651571d 100644 --- a/gopls/internal/golang/signature_help.go +++ b/gopls/internal/golang/signature_help.go @@ -13,8 +13,8 @@ import ( "strings" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" diff --git a/gopls/internal/golang/symbols.go b/gopls/internal/golang/symbols.go index 78ef993b855..390b8275183 100644 --- a/gopls/internal/golang/symbols.go +++ b/gopls/internal/golang/symbols.go @@ -11,8 +11,8 @@ import ( "go/token" "go/types" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/internal/event" ) diff --git a/gopls/internal/golang/type_definition.go b/gopls/internal/golang/type_definition.go index 8e2558a7ca6..306852cdcaf 100644 --- a/gopls/internal/golang/type_definition.go +++ b/gopls/internal/golang/type_definition.go @@ -9,8 +9,8 @@ import ( "fmt" "go/token" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/lsprpc/lsprpc.go b/gopls/internal/lsprpc/lsprpc.go index 6f5e48ce65e..0497612106d 100644 --- a/gopls/internal/lsprpc/lsprpc.go +++ b/gopls/internal/lsprpc/lsprpc.go @@ -19,10 +19,10 @@ import ( "sync/atomic" "time" - "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/server" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/lsprpc/lsprpc_test.go b/gopls/internal/lsprpc/lsprpc_test.go index 346cca491cc..1d643bf2095 100644 --- a/gopls/internal/lsprpc/lsprpc_test.go +++ b/gopls/internal/lsprpc/lsprpc_test.go @@ -13,8 +13,8 @@ import ( "testing" "time" - "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/debug" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/test/integration/fake" "golang.org/x/tools/internal/event" diff --git a/gopls/internal/test/integration/watch/watch_test.go b/gopls/internal/test/integration/watch/watch_test.go index 515fb55d094..fab302ff149 100644 --- a/gopls/internal/test/integration/watch/watch_test.go +++ b/gopls/internal/test/integration/watch/watch_test.go @@ -258,7 +258,7 @@ func _() { } // Add a new method to an interface and implement it. -// Inspired by the structure of internal/lsp/source and internal/cache. +// Inspired by the structure of internal/golang and internal/cache. func TestCreateImplementation(t *testing.T) { const pkg = ` -- go.mod -- diff --git a/internal/diff/lcs/git.sh b/internal/diff/lcs/git.sh index cbf07225d50..b25ba4aac74 100644 --- a/internal/diff/lcs/git.sh +++ b/internal/diff/lcs/git.sh @@ -14,8 +14,8 @@ set -eu # WARNING: This script will install the latest version of $file # The largest real source file in the x/tools repo. -# file=internal/lsp/source/completion/completion.go -# file=internal/lsp/source/diagnostics.go +# file=internal/golang/completion/completion.go +# file=internal/golang/diagnostics.go file=internal/protocol/tsprotocol.go tmp=$(mktemp -d) From df2fa1e998021231188c8258cfdf90bd64307f32 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 23 Jan 2024 16:03:37 -0500 Subject: [PATCH 057/105] gopls/doc: s/source/golang/ in the SVG file Change-Id: I48ce4445b34a453818b6ba17c236b80333e5d82f Reviewed-on: https://go-review.googlesource.com/c/tools/+/558075 Auto-Submit: Alan Donovan <adonovan@google.com> Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/doc/design/architecture.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gopls/doc/design/architecture.svg b/gopls/doc/design/architecture.svg index acd989094da..6c554d5670c 100644 --- a/gopls/doc/design/architecture.svg +++ b/gopls/doc/design/architecture.svg @@ -1 +1 @@ -<svg version="1.1" viewBox="0.0 0.0 956.7664041994751 541.8188976377953" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l956.7664 0l0 541.8189l-956.7664 0l0 -541.8189z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l956.7664 0l0 541.8189l-956.7664 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path fill="#000000" d="m442.29654 311.78952q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937683 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393158 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406738 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.098999 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m43.66406 297.06683l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385513 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm10.680775 0.53125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937836 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393143 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406586 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.099014 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m495.70633 510.83835l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.2225037 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.729187 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm8.067749 1.125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7960815 -8.359375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.145874 -5.65625q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.221924 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm7.192749 -10.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path fill="#000000" d="m225.00337 501.2064q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.2219086 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.6146393 1.0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135834 0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34373474 -0.21875 0.73435974 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.31248474 0.125 -0.56248474 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm19.088943 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.861908 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.598999 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m66.152145 365.99634l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m40.64583 389.1526l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m56.75477 408.2776q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path fill="#000000" d="m59.306545 359.15073l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.8437462 4.234375l-1.3749962 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173275 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m33.80023 382.30698l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.6406212 -0.34375 1.4687462 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.1718712 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177135 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m49.90917 401.43198q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1874962 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.2812462 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.6093712 -9.84375q-0.703125 0 -1.2343712 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.4687462 0.21875 1.0468712 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m52.460945 352.30515l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m26.954628 375.4614l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m43.06357 394.5864q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m296.97263 403.76367q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026306 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.967926 0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.092926 -8.234375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm2.1896973 10.640625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm11.614655 -8.234375q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm10.097748 -2.8125q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m232.68387 189.9421q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5845337 -1.46875q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm6.8490143 -7.109375l0 5.171875q0 0.921875 0.421875 1.421875q0.421875 0.5 1.28125 0.5q0.625 0 1.171875 -0.28125q0.546875 -0.296875 1.015625 -0.828125l0 -5.984375l1.421875 0l0 8.109375l-0.84375 0q-0.3125 0 -0.390625 -0.296875l-0.109375 -0.875q-0.53125 0.59375 -1.1875 0.953125q-0.65625 0.34375 -1.5 0.34375q-0.65625 0 -1.171875 -0.21875q-0.5 -0.21875 -0.859375 -0.609375q-0.34375 -0.40625 -0.515625 -0.96875q-0.171875 -0.578125 -0.171875 -1.265625l0 -5.171875l1.4375 0zm7.6615143 8.109375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm11.979187 -6.65625q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.1437683 -1.578125q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#000000" d="m239.95792 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm7.2317657 3.25q0.375 0 0.703125 -0.03125q0.328125 -0.046875 0.609375 -0.109375q0.296875 -0.078125 0.546875 -0.171875q0.25 -0.109375 0.5 -0.25l0 -2.109375l-1.484375 0q-0.125 0 -0.203125 -0.0625q-0.0625 -0.078125 -0.0625 -0.1875l0 -0.734375l2.921875 0l0 3.671875q-0.359375 0.25 -0.75 0.453125q-0.390625 0.1875 -0.828125 0.328125q-0.4375 0.125 -0.953125 0.1875q-0.5 0.0625 -1.09375 0.0625q-1.046875 0 -1.921875 -0.359375q-0.859375 -0.359375 -1.484375 -1.0q-0.625 -0.640625 -0.984375 -1.53125q-0.34375 -0.90625 -0.34375 -1.984375q0 -1.09375 0.34375 -1.984375q0.34375 -0.90625 0.984375 -1.546875q0.640625 -0.65625 1.53125 -1.0q0.90625 -0.359375 2.03125 -0.359375q0.5625 0 1.046875 0.09375q0.5 0.078125 0.90625 0.234375q0.421875 0.15625 0.765625 0.375q0.359375 0.21875 0.671875 0.5l-0.375 0.59375q-0.109375 0.171875 -0.296875 0.171875q-0.09375 0 -0.21875 -0.0625q-0.171875 -0.09375 -0.390625 -0.21875q-0.203125 -0.140625 -0.5 -0.265625q-0.296875 -0.125 -0.703125 -0.203125q-0.390625 -0.09375 -0.953125 -0.09375q-0.796875 0 -1.453125 0.265625q-0.65625 0.25 -1.125 0.75q-0.453125 0.484375 -0.703125 1.1875q-0.234375 0.6875 -0.234375 1.5625q0 0.90625 0.25 1.609375q0.265625 0.703125 0.71875 1.203125q0.46875 0.5 1.109375 0.765625q0.640625 0.25 1.421875 0.25zm8.064056 -5.921875q0.734375 0 1.3281097 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59373474 0.234375 -1.3281097 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q0.99998474 0 1.4843597 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.4843597 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm5.4783173 -3.359375q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m372.98822 196.70772l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.417084 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317749 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" d="m363.8027 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.326538 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.263794 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm3.2005615 0.734375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm13.676727 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.426025 0.828125q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.012909 -3.328125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m506.33478 188.59834l1.125 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l1.546875 5.21875q0.0625 0.296875 0.125 0.5625q0.0625 0.265625 0.09375 0.53125q0.0625 -0.265625 0.140625 -0.53125q0.078125 -0.265625 0.171875 -0.5625l1.71875 -5.25q0.03125 -0.109375 0.125 -0.1875q0.109375 -0.09375 0.265625 -0.09375l0.609375 0q0.15625 0 0.265625 0.09375q0.109375 0.078125 0.140625 0.1875l1.671875 5.25q0.09375 0.28125 0.15625 0.5625q0.078125 0.265625 0.140625 0.53125q0.03125 -0.265625 0.09375 -0.546875q0.078125 -0.296875 0.140625 -0.546875l1.578125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.078125 0l-2.625 8.109375l-1.125 0q-0.21875 0 -0.296875 -0.265625l-1.796875 -5.5q-0.0625 -0.1875 -0.109375 -0.375q-0.03125 -0.1875 -0.0625 -0.375q-0.046875 0.1875 -0.09375 0.390625q-0.03125 0.1875 -0.09375 0.359375l-1.8125 5.5q-0.09375 0.265625 -0.328125 0.265625l-1.078125 0l-2.625 -8.109375zm16.59961 -0.125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.614624 1.0l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm7.916687 -11.78125l0 6.9375l0.375 0q0.15625 0 0.265625 -0.046875q0.109375 -0.046875 0.234375 -0.1875l2.5625 -2.734375q0.109375 -0.125 0.234375 -0.203125q0.125 -0.09375 0.3125 -0.09375l1.296875 0l-2.984375 3.1875q-0.109375 0.125 -0.21875 0.234375q-0.109375 0.109375 -0.234375 0.1875q0.140625 0.09375 0.25 0.21875q0.125 0.125 0.21875 0.28125l3.171875 4.0l-1.28125 0q-0.171875 0 -0.296875 -0.0625q-0.125 -0.078125 -0.234375 -0.21875l-2.671875 -3.3125q-0.109375 -0.171875 -0.234375 -0.21875q-0.125 -0.0625 -0.359375 -0.0625l-0.40625 0l0 3.875l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#000000" d="m498.83655 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.3265686 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.2637634 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm1.9122314 -6.015625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm6.7651367 5.625q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m633.3156 196.81828q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135803 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm6.800659 -4.6875l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm8.470947 11.78125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#000000" d="m619.003 208.94579q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.092163 4.296875q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.4589233 2.53125l-2.265625 -3.296875l1.140625 0q0.140625 0 0.203125 0.046875q0.078125 0.046875 0.125 0.125l1.65625 2.546875q0.0625 -0.1875 0.171875 -0.375l1.453125 -2.140625q0.0625 -0.09375 0.125 -0.140625q0.078125 -0.0625 0.171875 -0.0625l1.09375 0l-2.265625 3.21875l2.359375 3.53125l-1.140625 0q-0.140625 0 -0.234375 -0.078125q-0.078125 -0.078125 -0.125 -0.171875l-1.703125 -2.640625q-0.046875 0.1875 -0.140625 0.34375l-1.578125 2.296875q-0.0625 0.09375 -0.140625 0.171875q-0.078125 0.078125 -0.203125 0.078125l-1.0625 0l2.359375 -3.453125zm7.186096 3.5625q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.0338745 0.03125q-0.09375 0.234375 -0.28125 0.34375q-0.1875 0.109375 -0.375 0.109375l-0.5 0l4.0 -9.96875q0.09375 -0.21875 0.25 -0.328125q0.15625 -0.109375 0.375 -0.109375l0.5 0l-3.96875 9.953125zm6.628845 -0.03125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm10.942322 2.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.6696167 -3.90625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm7.0526123 9.8125l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.08313 1.796875q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m277.0359 459.3088l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385529 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path fill="#000000" d="m840.8782 438.76547l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.84906 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm7.4400024 -10.90625l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm4.8928223 14.171875q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm10.45752 -9.15625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm3.8814087 -1.34375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm6.8303223 3.875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m840.14655 451.01797q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm3.045288 6.46875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm8.741699 -4.921875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm2.9249878 1.453125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m620.7594 459.30966l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.33899 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.467957 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.565002 0.875q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm11.959534 1.046875l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.4678955 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m457.1988 462.0588l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm11.175659 7.09375l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm11.088562 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.8682556 -1.046875q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm8.738403 -4.28125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path fill="#000000" d="m439.27795 123.49851q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5624924 -0.203125 1.0468674q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.32811737 -0.1875 -0.5468674q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.1495056 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0zm5.416687 -8.109367l1.171875 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.0625 5.21875q0.109375 0.296875 0.171875 0.5781174q0.0625 0.28125 0.125 0.5625q0.0625 -0.28125 0.125 -0.5625q0.078125 -0.28124237 0.1875 -0.5781174l2.078125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.125 0l-3.3125 8.109367l-1.28125 0l-3.3125 -8.109367zm12.218262 -0.125q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path fill="#000000" d="m437.19943 69.38583l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm7.1584473 5.015625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm2.3032837 9.515625l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.222534 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm6.4479065 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm10.753754 0.4375q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path fill="#000000" d="m447.68848 33.098763q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406433 6.65625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm18.83899 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 269.45407l-59.18109 22.236206" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 269.45407l-53.56447 20.125885" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m134.70233 288.03375l-3.6671753 3.1423645l4.8290863 -0.049987793z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m724.2021 345.2126l66.677185 40.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m724.2021 345.2126l61.54596 37.299713" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m784.89197 383.92487l4.7370605 0.93948364l-3.0249023 -3.764618z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 302.54593l-56.15747 35.590546" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 302.54593l-51.08954 32.378693" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m136.87402 333.52948l-2.9489288 3.8244324l4.7173157 -1.0341492z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 16.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m744.6108 36.760384q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm3.6922607 0.875l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm7.084961 1.09375l-1.28125 0l0 -9.546875l1.28125 0l0 9.546875zm6.9921875 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm7.4104004 -6.03125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041504 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm1.7401123 9.0q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.226013 -0.28125l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.715759 -0.953125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.9429932 -4.265625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457275 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 56.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m741.47015 75.43226q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.2145386 -4.765625q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm11.048279 3.296875q0 1.0625 -0.34375 1.96875q-0.34375 0.890625 -0.96875 1.546875q-0.609375 0.640625 -1.484375 1.0q-0.859375 0.34375 -1.921875 0.34375q-1.046875 0 -1.921875 -0.34375q-0.859375 -0.359375 -1.484375 -1.0q-0.609375 -0.65625 -0.953125 -1.546875q-0.34375 -0.90625 -0.34375 -1.96875q0 -1.078125 0.34375 -1.96875q0.34375 -0.90625 0.953125 -1.546875q0.625 -0.65625 1.484375 -1.015625q0.875 -0.359375 1.921875 -0.359375q1.0625 0 1.921875 0.359375q0.875 0.359375 1.484375 1.015625q0.625 0.640625 0.96875 1.546875q0.34375 0.890625 0.34375 1.96875zm-1.328125 0q0 -0.890625 -0.25 -1.578125q-0.234375 -0.703125 -0.671875 -1.1875q-0.4375 -0.484375 -1.0625 -0.734375q-0.625 -0.265625 -1.40625 -0.265625q-0.765625 0 -1.390625 0.265625q-0.625 0.25 -1.078125 0.734375q-0.4375 0.484375 -0.671875 1.1875q-0.234375 0.6875 -0.234375 1.578125q0 0.875 0.234375 1.578125q0.234375 0.6875 0.671875 1.171875q0.453125 0.484375 1.078125 0.75q0.625 0.25 1.390625 0.25q0.78125 0 1.40625 -0.25q0.625 -0.265625 1.0625 -0.75q0.4375 -0.484375 0.671875 -1.171875q0.25 -0.703125 0.25 -1.578125zm3.7608032 -4.78125q0.171875 0 0.25 0.046875q0.09375 0.03125 0.1875 0.171875l5.53125 7.203125q-0.015625 -0.1875 -0.03125 -0.34375q0 -0.15625 0 -0.3125l0 -6.765625l1.140625 0l0 9.546875l-0.65625 0q-0.15625 0 -0.265625 -0.046875q-0.09375 -0.0625 -0.1875 -0.1875l-5.53125 -7.1875q0.015625 0.171875 0.015625 0.328125q0.015625 0.15625 0.015625 0.296875l0 6.796875l-1.140625 0l0 -9.546875l0.671875 0l0 0zm10.825989 5.5625l0 3.984375l-1.28125 0l0 -9.546875l2.6875 0q0.90625 0 1.5625 0.1875q0.671875 0.171875 1.09375 0.53125q0.4375 0.34375 0.640625 0.828125q0.203125 0.484375 0.203125 1.09375q0 0.515625 -0.15625 0.953125q-0.15625 0.4375 -0.46875 0.796875q-0.296875 0.34375 -0.734375 0.59375q-0.4375 0.234375 -0.984375 0.359375q0.234375 0.140625 0.421875 0.40625l2.78125 3.796875l-1.140625 0q-0.359375 0 -0.515625 -0.265625l-2.484375 -3.421875q-0.109375 -0.15625 -0.25 -0.21875q-0.125 -0.078125 -0.390625 -0.078125l-0.984375 0zm0 -0.9375l1.359375 0q0.5625 0 0.984375 -0.140625q0.4375 -0.140625 0.71875 -0.390625q0.296875 -0.25 0.4375 -0.59375q0.15625 -0.34375 0.15625 -0.765625q0 -0.84375 -0.5625 -1.28125q-0.5625 -0.4375 -1.6875 -0.4375l-1.40625 0l0 3.609375zm8.583313 1.34375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.455933 2.625q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm8.655151 -3.671875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm7.9904175 0l0 -9.8125l1.1875 0l0 4.03125q0.421875 -0.484375 0.96875 -0.78125q0.546875 -0.296875 1.234375 -0.296875q0.59375 0 1.0625 0.21875q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.578125 1.109375q-0.375 0.46875 -0.921875 0.75q-0.53125 0.265625 -1.21875 0.265625q-0.640625 0 -1.109375 -0.25q-0.453125 -0.25 -0.796875 -0.703125l-0.0625 0.609375q-0.046875 0.25 -0.296875 0.25l-0.765625 0zm3.015625 -5.90625q-0.59375 0 -1.03125 0.265625q-0.421875 0.265625 -0.796875 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.859375 0.171875q0.953125 0 1.453125 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.7160034 -0.84375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.160461 0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.3253784 -5.890625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm8.404419 -2.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 104.92913l180.72443 0l0 35.590553l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 125.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm12.981384 -1.046875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 184.92914l180.72443 0l0 35.590546l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 205.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.335022 1.09375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm5.560669 -3.453125l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm11.3479 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm7.1480103 -6.140625q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.201233 -3.5625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm7.1187744 5.984375l0 -5.734375l-0.734375 -0.09375q-0.140625 -0.03125 -0.234375 -0.09375q-0.09375 -0.078125 -0.09375 -0.203125l0 -0.5l1.0625 0l0 -0.640625q0 -0.578125 0.15625 -1.03125q0.171875 -0.453125 0.46875 -0.765625q0.3125 -0.3125 0.734375 -0.46875q0.4375 -0.15625 0.96875 -0.15625q0.453125 0 0.828125 0.125l-0.015625 0.59375q-0.015625 0.140625 -0.125 0.171875q-0.09375 0.015625 -0.296875 0.015625l-0.203125 0q-0.3125 0 -0.5625 0.09375q-0.234375 0.078125 -0.421875 0.265625q-0.1875 0.171875 -0.28125 0.46875q-0.09375 0.28125 -0.09375 0.71875l0 0.609375l1.953125 0l0 0.875l-1.90625 0l0 5.75l-1.203125 0zm6.897766 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm9.249573 5.984375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.9557495 -6.859375l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm6.3791504 6.75l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.71906 256.92914l195.71655 0l0 35.590546l-195.71655 0z" fill-rule="evenodd"/><path fill="#000000" d="m742.7659 270.66663q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm1.9857788 8.0625l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 3.0l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm8.216492 0.265625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 5.640625l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.144775 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229614 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm2.5807495 -0.921875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm4.897827 -5.9375l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm8.99585 0l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.4058228 -0.765625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm10.327209 5.9375q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm9.616577 -4.828125q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155762 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm7.0666504 -0.8125q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125z" fill-rule="nonzero"/><path fill="#000000" d="m736.8128 287.97913l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm9.624512 4.171875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 7.921875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.476074 -4.828125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.286743 -1.3125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.9370117 5.171875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.069763 -5.9375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm6.3533325 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm12.636475 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm6.5682373 8.875q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966003 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9136353 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.2526245 -6.859375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m744.3753 301.18225l0 1.078125l-3.078125 0l0 8.46875l-1.296875 0l0 -8.46875l-3.09375 0l0 -1.078125l7.46875 0zm1.9604492 11.546875q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133667 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm11.462463 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm1.6148682 5.546875l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.082275 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.890137 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.8492432 -4.265625l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm7.0776367 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.691711 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375z" fill-rule="nonzero"/><path fill="#000000" d="m745.7347 326.72913l-1.0 0q-0.171875 0 -0.28125 -0.078125q-0.109375 -0.09375 -0.15625 -0.234375l-0.890625 -2.296875l-4.28125 0l-0.90625 2.296875q-0.046875 0.125 -0.15625 0.21875q-0.109375 0.09375 -0.28125 0.09375l-1.0 0l3.828125 -9.546875l1.3125 0l3.8125 9.546875zm-6.25 -3.546875l3.5625 0l-1.5 -3.890625q-0.15625 -0.359375 -0.296875 -0.890625q-0.0625 0.265625 -0.140625 0.5q-0.0625 0.234375 -0.125 0.40625l-1.5 3.875zm7.2662354 3.546875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm4.0682373 11.8125q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm8.7146 -7.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm9.231689 5.640625q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm4.9972534 0.859375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.699341 -6.75l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm0.9744873 2.125l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 437.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m86.16409 453.50504l0.484375 0q0.25 0 0.40625 -0.0625q0.15625 -0.0625 0.28125 -0.21875l3.1875 -3.609375q0.140625 -0.15625 0.265625 -0.21875q0.140625 -0.078125 0.359375 -0.078125l1.09375 0l-3.625 4.109375q-0.140625 0.15625 -0.265625 0.265625q-0.125 0.09375 -0.265625 0.171875q0.1875 0.0625 0.328125 0.1875q0.140625 0.109375 0.296875 0.28125l3.796875 4.53125l-1.125 0q-0.125 0 -0.21875 -0.015625q-0.078125 -0.03125 -0.140625 -0.0625q-0.0625 -0.03125 -0.125 -0.078125q-0.046875 -0.0625 -0.109375 -0.109375l-3.296875 -3.796875q-0.0625 -0.078125 -0.125 -0.140625q-0.0625 -0.0625 -0.15625 -0.09375q-0.078125 -0.046875 -0.1875 -0.0625q-0.109375 -0.015625 -0.265625 -0.015625l-0.59375 0l0 4.375l-1.28125 0l0 -9.546875l1.28125 0l0 4.1875zm9.8989105 -1.5q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm6.0918274 7.984375q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm12.161911 -2.0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966019 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9135895 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm7.8932495 -0.109375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.485901 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.9088745 1.890625q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133514 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155792 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 485.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m97.31447 505.77066l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444382 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5951233 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.106384 6.875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm4.3414764 5.90625l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.105591 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229156 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.285416 -4.71875q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.3492126 -1.3125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041656 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-66.665665 229.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m14.926851 247.2863l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.005951 -2.265625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.2343769 0.0625 0.4218769 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.2031269 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm9.246218 -5.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.237503 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5624962 0 0.9843712 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0624962 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457287 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm9.371811 -5.75q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760406 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m18.737534 17.942257l124.06299 0l0 35.590553l-124.06299 0z" fill-rule="evenodd"/><path fill="#000000" d="m32.487534 36.44538q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.1051636 3.296875l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.8667145 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.920227 -0.90625l2.0625 0l0 -6.515625q0 -0.28125 0.015625 -0.59375l-1.703125 1.46875q-0.0625 0.046875 -0.140625 0.078125q-0.0625 0.015625 -0.125 0.015625q-0.09375 0 -0.171875 -0.03125q-0.078125 -0.046875 -0.125 -0.109375l-0.375 -0.515625l2.84375 -2.453125l0.96875 0l0 8.65625l1.875 0l0 0.90625l-5.125 0l0 -0.90625zm10.152161 -4.9375q0.578125 0 1.09375 0.1875q0.515625 0.1875 0.890625 0.546875q0.390625 0.359375 0.609375 0.890625q0.234375 0.53125 0.234375 1.21875q0 0.65625 -0.25 1.21875q-0.234375 0.5625 -0.671875 0.984375q-0.421875 0.421875 -1.03125 0.671875q-0.59375 0.234375 -1.328125 0.234375q-0.71875 0 -1.296875 -0.234375q-0.578125 -0.234375 -1.0 -0.65625q-0.40625 -0.421875 -0.640625 -1.015625q-0.21875 -0.609375 -0.21875 -1.359375q0 -0.625 0.28125 -1.328125q0.28125 -0.703125 0.890625 -1.515625l2.421875 -3.265625q0.078125 -0.125 0.25 -0.203125q0.171875 -0.078125 0.375 -0.078125l1.0625 0l-3.3125 4.1875q0.34375 -0.234375 0.75 -0.359375q0.421875 -0.125 0.890625 -0.125zm-2.46875 2.890625q0 0.46875 0.125 0.859375q0.140625 0.375 0.390625 0.65625q0.265625 0.265625 0.640625 0.421875q0.375 0.140625 0.84375 0.140625q0.484375 0 0.859375 -0.15625q0.390625 -0.15625 0.671875 -0.421875q0.28125 -0.28125 0.421875 -0.65625q0.15625 -0.375 0.15625 -0.8125q0 -0.46875 -0.15625 -0.84375q-0.140625 -0.375 -0.40625 -0.640625q-0.265625 -0.265625 -0.640625 -0.390625q-0.375 -0.140625 -0.828125 -0.140625q-0.46875 0 -0.859375 0.15625q-0.390625 0.15625 -0.65625 0.4375q-0.265625 0.28125 -0.421875 0.640625q-0.140625 0.359375 -0.140625 0.75zm12.443222 -6.703125q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm11.058411 4.890625q0 1.25 -0.265625 2.171875q-0.265625 0.90625 -0.734375 1.515625q-0.46875 0.59375 -1.109375 0.890625q-0.640625 0.28125 -1.359375 0.28125q-0.734375 0 -1.375 -0.28125q-0.625 -0.296875 -1.09375 -0.890625q-0.453125 -0.609375 -0.71875 -1.515625q-0.265625 -0.921875 -0.265625 -2.171875q0 -1.265625 0.265625 -2.171875q0.265625 -0.921875 0.71875 -1.515625q0.46875 -0.609375 1.09375 -0.90625q0.640625 -0.296875 1.375 -0.296875q0.71875 0 1.359375 0.296875q0.640625 0.296875 1.109375 0.90625q0.46875 0.59375 0.734375 1.515625q0.265625 0.90625 0.265625 2.171875zm-1.234375 0q0 -1.09375 -0.1875 -1.828125q-0.171875 -0.75 -0.484375 -1.203125q-0.3125 -0.453125 -0.71875 -0.65625q-0.40625 -0.203125 -0.84375 -0.203125q-0.4375 0 -0.84375 0.203125q-0.40625 0.203125 -0.71875 0.65625q-0.296875 0.453125 -0.484375 1.203125q-0.1875 0.734375 -0.1875 1.828125q0 1.09375 0.1875 1.828125q0.1875 0.734375 0.484375 1.1875q0.3125 0.453125 0.71875 0.65625q0.40625 0.1875 0.84375 0.1875q0.4375 0 0.84375 -0.1875q0.40625 -0.203125 0.71875 -0.65625q0.3125 -0.453125 0.484375 -1.1875q0.1875 -0.734375 0.1875 -1.828125zm5.6365356 -4.890625q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm9.745911 6.21875l1.453125 0l0 0.671875q0 0.109375 -0.0625 0.1875q-0.0625 0.0625 -0.203125 0.0625l-1.1875 0l0 2.515625l-1.046875 0l0 -2.515625l-4.234375 0q-0.125 0 -0.234375 -0.078125q-0.09375 -0.078125 -0.109375 -0.1875l-0.125 -0.609375l4.640625 -6.15625l1.109375 0l0 6.109375zm-1.046875 -3.953125q0 -0.171875 0 -0.359375q0.015625 -0.203125 0.0625 -0.421875l-3.484375 4.734375l3.421875 0l0 -3.953125z" fill-rule="nonzero"/></g></svg> \ No newline at end of file +<svg version="1.1" viewBox="0.0 0.0 956.7664041994751 541.8188976377953" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l956.7664 0l0 541.8189l-956.7664 0l0 -541.8189z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l956.7664 0l0 541.8189l-956.7664 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 270.61243l0 0c0 -11.590973 9.396332 -20.98729 20.987305 -20.98729l492.82855 0c5.566223 0 10.904419 2.2111511 14.840271 6.1470337c3.935913 3.9358673 6.1470337 9.274094 6.1470337 14.840256l0 83.946655c0 11.590973 -9.396301 20.987305 -20.987305 20.987305l-492.82855 0l0 0c-11.590973 0 -20.987305 -9.396332 -20.987305 -20.987305z" fill-rule="evenodd"/><path fill="#000000" d="m442.29654 311.78952q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937683 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393158 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406738 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.098999 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m18.737848 278.1046l0 0c0 -3.6181946 2.9331226 -6.5513306 6.5513134 -6.5513306l95.71627 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188538c1.2286148 1.2286072 1.9188385 2.8949585 1.9188385 4.632477l0 26.204437c0 3.6181946 -2.9331207 6.5513306 -6.5513153 6.5513306l-95.71627 0c-3.6181908 0 -6.5513134 -2.933136 -6.5513134 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m43.66406 297.06683l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385513 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm10.680775 0.53125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm7.8937836 6.65625l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.393143 -5.78125q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406586 6.65625l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.099014 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.4042 489.12613l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513 -6.5513306l384.66113 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188538c1.2286377 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204437c0 3.618225 -2.9331055 6.5513306 -6.5513306 6.5513306l-384.66113 0l0 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m495.70633 510.83835l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.2225037 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.729187 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm8.067749 1.125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7960815 -8.359375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.145874 -5.65625q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.221924 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm7.192749 -10.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 488.53293l0 0c0 -3.719635 3.0153809 -6.735016 6.7350464 -6.735016l115.002365 0c1.7862244 0 3.4993286 0.7095642 4.76239 1.9726257c1.2630615 1.2630615 1.9726562 2.9761658 1.9726562 4.76239l0 26.939362c0 3.7196655 -3.0153809 6.7350464 -6.7350464 6.7350464l-115.002365 0c-3.7196655 0 -6.7350464 -3.0153809 -6.7350464 -6.7350464z" fill-rule="evenodd"/><path fill="#000000" d="m225.00337 501.2064q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm5.2219086 -1.578125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.6146393 1.0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135834 0l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34373474 -0.21875 0.73435974 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.31248474 0.125 -0.56248474 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm19.088943 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.861908 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.598999 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m19.025703 355.75775l0 0c0 -7.6037903 6.164072 -13.767853 13.767838 -13.767853l99.21574 0c3.6514587 0 7.153351 1.450531 9.735321 4.032501c2.5819702 2.5819702 4.0325165 6.083893 4.0325165 9.735352l0 55.06967c0 7.6037903 -6.1640778 13.767853 -13.767838 13.767853l-99.21574 0c-7.6037655 0 -13.767838 -6.1640625 -13.767838 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m66.152145 365.99634l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m40.64583 389.1526l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m56.75477 408.2776q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m12.180104 348.91214l0 0c0 -7.60376 6.164071 -13.767853 13.767837 -13.767853l99.21573 0c3.651451 0 7.1533585 1.4505615 9.735329 4.0325317c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.1640625 13.767822 -13.76783 13.767822l-99.21573 0c-7.6037655 0 -13.767837 -6.1640625 -13.767837 -13.767822z" fill-rule="evenodd"/><path fill="#000000" d="m59.306545 359.15073l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.8437462 4.234375l-1.3749962 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173275 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m33.80023 382.30698l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.6406212 -0.34375 1.4687462 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.1718712 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177135 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m49.90917 401.43198q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1874962 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.2812462 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.6093712 -9.84375q-0.703125 0 -1.2343712 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.4687462 0.21875 1.0468712 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m5.334504 342.06653l0 0c0 -7.60376 6.164071 -13.767822 13.767837 -13.767822l99.21573 0c3.6514587 0 7.153366 1.450531 9.735336 4.032501c2.5819702 2.5819702 4.032501 6.0838623 4.032501 9.735321l0 55.069702c0 7.60376 -6.16407 13.767853 -13.767838 13.767853l-99.21573 0c-7.6037655 0 -13.767837 -6.164093 -13.767837 -13.767853z" fill-rule="evenodd"/><path fill="#000000" d="m52.460945 352.30515l-2.71875 -3.953125l1.359375 0q0.171875 0 0.25 0.0625q0.09375 0.0625 0.15625 0.15625l1.984375 3.046875q0.0625 -0.234375 0.203125 -0.453125l1.75 -2.5625q0.078125 -0.109375 0.15625 -0.171875q0.078125 -0.078125 0.203125 -0.078125l1.3125 0l-2.734375 3.875l2.84375 4.234375l-1.375 0q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.15625 -0.203125l-2.046875 -3.171875q-0.046875 0.234375 -0.15625 0.40625l-1.890625 2.765625q-0.078125 0.109375 -0.171875 0.203125q-0.09375 0.09375 -0.25 0.09375l-1.28125 0l2.84375 -4.15625zm6.173279 4.15625l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m26.954628 375.4614l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.338959 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm3.514801 -0.125l0 -11.78125l1.421875 0l0 4.765625q0.515625 -0.546875 1.140625 -0.875q0.640625 -0.34375 1.46875 -0.34375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm12.177139 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317764 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm10.647003 -5.71875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.602646 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm8.155426 -6.890625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm1.8814087 5.78125q0 -0.1875 0.0625 -0.34375q0.078125 -0.171875 0.203125 -0.296875q0.125 -0.125 0.296875 -0.1875q0.171875 -0.078125 0.390625 -0.078125q0.234375 0 0.421875 0.09375q0.1875 0.078125 0.3125 0.234375q0.125 0.15625 0.1875 0.375q0.0625 0.203125 0.0625 0.4375q0 0.359375 -0.109375 0.75q-0.09375 0.390625 -0.296875 0.765625q-0.1875 0.375 -0.46875 0.734375q-0.28125 0.359375 -0.640625 0.671875l-0.25 -0.234375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.109375 0.109375 -0.21875q0.078125 -0.09375 0.203125 -0.25q0.125 -0.140625 0.25 -0.328125q0.125 -0.1875 0.234375 -0.421875q0.109375 -0.234375 0.15625 -0.5l-0.09375 0q-0.21875 0 -0.390625 -0.0625q-0.15625 -0.078125 -0.28125 -0.203125q-0.125 -0.140625 -0.203125 -0.3125q-0.0625 -0.1875 -0.0625 -0.40625z" fill-rule="nonzero"/><path fill="#000000" d="m43.06357 394.5864q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.889801 2.265625q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm5.8168945 0.359375l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm8.425644 -1.140625q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149521 7.1875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm9.651047 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.462021 7.1875l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.796875q0 -0.6875 0.1875 -1.21875q0.203125 -0.546875 0.5625 -0.921875q0.375 -0.375 0.875 -0.5625q0.515625 -0.1875 1.15625 -0.1875q0.546875 0 1.015625 0.15625l-0.03125 0.703125q-0.015625 0.171875 -0.140625 0.203125q-0.125 0.03125 -0.359375 0.03125l-0.25 0q-0.359375 0 -0.671875 0.09375q-0.296875 0.09375 -0.515625 0.3125q-0.203125 0.21875 -0.328125 0.578125q-0.109375 0.34375 -0.109375 0.859375l0 0.75l2.34375 0l0 1.03125l-2.296875 0l0 6.90625l-1.4375 0zm9.720062 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 391.56705l0 0c0 -3.618164 2.933136 -6.5513 6.5513153 -6.5513l247.87375 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188538 2.894989 1.9188538 4.632477l0 26.204468c0 3.6181946 -2.933136 6.5513306 -6.5513306 6.5513306l-247.87375 0c-3.6181793 0 -6.5513153 -2.933136 -6.5513153 -6.5513306z" fill-rule="evenodd"/><path fill="#000000" d="m296.97263 403.76367q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026306 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.967926 0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm5.092926 -8.234375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm2.1896973 10.640625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm11.614655 -8.234375q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm10.097748 -2.8125q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769318 -13.769302l96.52437 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52437 0c-7.6045837 0 -13.769318 -6.1647186 -13.769318 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m231.106 188.47334q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm8.738388 -4.28125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm7.1927643 -10.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm8.470947 11.78125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618927 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm11.614655 -8.234375q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125z" fill-rule="nonzero"/><path fill="#000000" d="m239.95792 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm7.2317657 3.25q0.375 0 0.703125 -0.03125q0.328125 -0.046875 0.609375 -0.109375q0.296875 -0.078125 0.546875 -0.171875q0.25 -0.109375 0.5 -0.25l0 -2.109375l-1.484375 0q-0.125 0 -0.203125 -0.0625q-0.0625 -0.078125 -0.0625 -0.1875l0 -0.734375l2.921875 0l0 3.671875q-0.359375 0.25 -0.75 0.453125q-0.390625 0.1875 -0.828125 0.328125q-0.4375 0.125 -0.953125 0.1875q-0.5 0.0625 -1.09375 0.0625q-1.046875 0 -1.921875 -0.359375q-0.859375 -0.359375 -1.484375 -1.0q-0.625 -0.640625 -0.984375 -1.53125q-0.34375 -0.90625 -0.34375 -1.984375q0 -1.09375 0.34375 -1.984375q0.34375 -0.90625 0.984375 -1.546875q0.640625 -0.65625 1.53125 -1.0q0.90625 -0.359375 2.03125 -0.359375q0.5625 0 1.046875 0.09375q0.5 0.078125 0.90625 0.234375q0.421875 0.15625 0.765625 0.375q0.359375 0.21875 0.671875 0.5l-0.375 0.59375q-0.109375 0.171875 -0.296875 0.171875q-0.09375 0 -0.21875 -0.0625q-0.171875 -0.09375 -0.390625 -0.21875q-0.203125 -0.140625 -0.5 -0.265625q-0.296875 -0.125 -0.703125 -0.203125q-0.390625 -0.09375 -0.953125 -0.09375q-0.796875 0 -1.453125 0.265625q-0.65625 0.25 -1.125 0.75q-0.453125 0.484375 -0.703125 1.1875q-0.234375 0.6875 -0.234375 1.5625q0 0.90625 0.25 1.609375q0.265625 0.703125 0.71875 1.203125q0.46875 0.5 1.109375 0.765625q0.640625 0.25 1.421875 0.25zm8.064056 -5.921875q0.734375 0 1.3281097 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59373474 0.234375 -1.3281097 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q0.99998474 0 1.4843597 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.4843597 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm5.4783173 -3.359375q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m325.27264 171.30994l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.1541443 1.4506836 9.736389 4.0329285c2.5822449 2.5822449 4.0329285 6.0845184 4.0329285 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769318 13.769302l-96.52438 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m372.98822 196.70772l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.417084 -8.234375q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm11.317749 1.0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" d="m363.8027 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.326538 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.263794 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm3.2005615 0.734375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm13.676727 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.426025 0.828125q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.012909 -3.328125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m462.1857 171.30994l0 0c0 -7.6045837 6.1647034 -13.769302 13.769287 -13.769302l96.52438 0c3.6518555 0 7.154114 1.4506836 9.736389 4.0329285c2.5822144 2.5822449 4.032898 6.0845184 4.032898 9.736374l0 55.07556c0 7.6045837 -6.164673 13.769302 -13.769287 13.769302l-96.52438 0c-7.6045837 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m506.33478 188.59834l1.125 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l1.546875 5.21875q0.0625 0.296875 0.125 0.5625q0.0625 0.265625 0.09375 0.53125q0.0625 -0.265625 0.140625 -0.53125q0.078125 -0.265625 0.171875 -0.5625l1.71875 -5.25q0.03125 -0.109375 0.125 -0.1875q0.109375 -0.09375 0.265625 -0.09375l0.609375 0q0.15625 0 0.265625 0.09375q0.109375 0.078125 0.140625 0.1875l1.671875 5.25q0.09375 0.28125 0.15625 0.5625q0.078125 0.265625 0.140625 0.53125q0.03125 -0.265625 0.09375 -0.546875q0.078125 -0.296875 0.140625 -0.546875l1.578125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.078125 0l-2.625 8.109375l-1.125 0q-0.21875 0 -0.296875 -0.265625l-1.796875 -5.5q-0.0625 -0.1875 -0.109375 -0.375q-0.03125 -0.1875 -0.0625 -0.375q-0.046875 0.1875 -0.09375 0.390625q-0.03125 0.1875 -0.09375 0.359375l-1.8125 5.5q-0.09375 0.265625 -0.328125 0.265625l-1.078125 0l-2.625 -8.109375zm16.59961 -0.125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125zm5.614624 1.0l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm7.916687 -11.78125l0 6.9375l0.375 0q0.15625 0 0.265625 -0.046875q0.109375 -0.046875 0.234375 -0.1875l2.5625 -2.734375q0.109375 -0.125 0.234375 -0.203125q0.125 -0.09375 0.3125 -0.09375l1.296875 0l-2.984375 3.1875q-0.109375 0.125 -0.21875 0.234375q-0.109375 0.109375 -0.234375 0.1875q0.140625 0.09375 0.25 0.21875q0.125 0.125 0.21875 0.28125l3.171875 4.0l-1.28125 0q-0.171875 0 -0.296875 -0.0625q-0.125 -0.078125 -0.234375 -0.21875l-2.671875 -3.3125q-0.109375 -0.171875 -0.234375 -0.21875q-0.125 -0.0625 -0.359375 -0.0625l-0.40625 0l0 3.875l-1.421875 0l0 -11.78125l1.421875 0z" fill-rule="nonzero"/><path fill="#000000" d="m498.83655 208.96022q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.3265686 -2.671875q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.2637634 -3.5625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.3010254 0.09375q0 -0.171875 0.0625 -0.328125q0.0625 -0.15625 0.171875 -0.265625q0.109375 -0.109375 0.25 -0.171875q0.15625 -0.078125 0.328125 -0.078125q0.1875 0 0.328125 0.078125q0.15625 0.0625 0.265625 0.171875q0.125 0.109375 0.1875 0.265625q0.0625 0.15625 0.0625 0.328125q0 0.1875 -0.0625 0.34375q-0.0625 0.140625 -0.1875 0.25q-0.109375 0.109375 -0.265625 0.171875q-0.140625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.25 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.0625 -0.15625 -0.0625 -0.34375zm1.9122314 -6.015625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm6.7651367 5.625q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m599.09875 171.2955l0 0c0 -7.6045837 6.164734 -13.769302 13.769287 -13.769302l96.524414 0c3.6517944 0 7.154114 1.4506836 9.736328 4.0329285c2.5822754 2.5822449 4.032959 6.0845184 4.032959 9.736374l0 55.07556c0 7.6045837 -6.164734 13.769302 -13.769287 13.769302l-96.524414 0c-7.604553 0 -13.769287 -6.1647186 -13.769287 -13.769302z" fill-rule="evenodd"/><path fill="#000000" d="m633.3156 196.81828q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm13.135803 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm6.800659 -4.6875l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm8.470947 11.78125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm6.7179565 -8.359375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#000000" d="m619.003 208.94579q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm5.092163 4.296875q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.4589233 2.53125l-2.265625 -3.296875l1.140625 0q0.140625 0 0.203125 0.046875q0.078125 0.046875 0.125 0.125l1.65625 2.546875q0.0625 -0.1875 0.171875 -0.375l1.453125 -2.140625q0.0625 -0.09375 0.125 -0.140625q0.078125 -0.0625 0.171875 -0.0625l1.09375 0l-2.265625 3.21875l2.359375 3.53125l-1.140625 0q-0.140625 0 -0.234375 -0.078125q-0.078125 -0.078125 -0.125 -0.171875l-1.703125 -2.640625q-0.046875 0.1875 -0.140625 0.34375l-1.578125 2.296875q-0.0625 0.09375 -0.140625 0.171875q-0.078125 0.078125 -0.203125 0.078125l-1.0625 0l2.359375 -3.453125zm7.186096 3.5625q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.0338745 0.03125q-0.09375 0.234375 -0.28125 0.34375q-0.1875 0.109375 -0.375 0.109375l-0.5 0l4.0 -9.96875q0.09375 -0.21875 0.25 -0.328125q0.15625 -0.109375 0.375 -0.109375l0.5 0l-3.96875 9.953125zm6.628845 -0.03125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.078125 0.6875q0.375 -0.453125 0.84375 -0.75q0.46875 -0.296875 1.078125 -0.296875q0.6875 0 1.109375 0.390625q0.421875 0.375 0.609375 1.015625q0.140625 -0.359375 0.359375 -0.625q0.234375 -0.265625 0.515625 -0.4375q0.296875 -0.1875 0.609375 -0.265625q0.328125 -0.078125 0.671875 -0.078125q0.53125 0 0.9375 0.171875q0.421875 0.171875 0.703125 0.5q0.296875 0.328125 0.453125 0.8125q0.15625 0.46875 0.15625 1.078125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.796875 -0.34375 -1.203125q-0.34375 -0.40625 -1.015625 -0.40625q-0.28125 0 -0.546875 0.109375q-0.265625 0.09375 -0.46875 0.296875q-0.203125 0.203125 -0.328125 0.5q-0.109375 0.296875 -0.109375 0.703125l0 4.296875l-1.1875 0l0 -4.296875q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.40625 -0.9375 -0.40625q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.6875 0.640625l0 5.03125l-1.1875 0zm10.942322 2.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.6696167 -3.90625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm7.0526123 9.8125l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm5.08313 1.796875q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.49312 440.3466l0 0c0 -3.6181946 2.9331207 -6.5513 6.5513153 -6.5513l182.61392 0c1.7375183 0 3.4038696 0.69021606 4.632477 1.9188232c1.2286072 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513 6.5513l-182.61392 0l0 0c-3.6181946 0 -6.5513153 -2.9331055 -6.5513153 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m277.0359 459.3088l0 -6.890625l-0.890625 -0.09375q-0.171875 -0.046875 -0.28125 -0.125q-0.109375 -0.09375 -0.109375 -0.25l0 -0.578125l1.28125 0l0 -0.453125q0 -0.75 0.234375 -1.359375q0.234375 -0.625 0.6875 -1.0625q0.46875 -0.453125 1.15625 -0.703125q0.703125 -0.25 1.625 -0.25q0.296875 0 0.609375 0.046875q0.328125 0.03125 0.5625 0.109375l-0.0625 0.75q-0.015625 0.09375 -0.09375 0.125q-0.078125 0.03125 -0.234375 0.03125q-0.078125 0 -0.171875 0q-0.09375 -0.015625 -0.21875 -0.015625q-1.421875 0 -2.0625 0.59375q-0.640625 0.59375 -0.640625 1.765625l0 0.421875l4.890625 0l0 7.9375l-1.421875 0l0 -6.90625l-3.421875 0l0 6.90625l-1.4375 0zm10.385529 -11.78125l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm5.7209473 3.546875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m789.7638 383.82462l0 0c0 -13.197144 10.698364 -23.895508 23.895447 -23.895508l95.5791 0l0 0c6.3375244 0 12.415405 2.5175476 16.896667 6.9988403c4.4813232 4.481262 6.9988403 10.559174 6.9988403 16.896667l0 114.16177c0 13.197113 -10.698364 23.895447 -23.895508 23.895447l-95.5791 0c-13.1970825 0 -23.895447 -10.698334 -23.895447 -23.895447z" fill-rule="evenodd"/><path fill="#000000" d="m840.8782 438.76547l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.890625q0.53125 -0.59375 1.171875 -0.953125q0.65625 -0.359375 1.515625 -0.359375q0.65625 0 1.15625 0.21875q0.515625 0.21875 0.859375 0.625q0.34375 0.40625 0.515625 0.984375q0.171875 0.5625 0.171875 1.25l0 5.15625l-1.421875 0l0 -5.15625q0 -0.921875 -0.421875 -1.421875q-0.421875 -0.515625 -1.28125 -0.515625q-0.625 0 -1.171875 0.3125q-0.546875 0.296875 -1.015625 0.8125l0 5.96875l-1.421875 0zm14.84906 0l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm7.4400024 -10.90625l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm4.8928223 14.171875q-0.078125 0.15625 -0.1875 0.25q-0.109375 0.109375 -0.328125 0.109375l-1.0625 0l1.484375 -3.21875l-3.34375 -7.640625l1.234375 0q0.1875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.171875 5.109375q0.078125 0.171875 0.125 0.359375q0.046875 0.171875 0.09375 0.359375q0.046875 -0.1875 0.109375 -0.359375q0.0625 -0.1875 0.125 -0.375l2.109375 -5.09375q0.046875 -0.125 0.15625 -0.203125q0.125 -0.09375 0.25 -0.09375l1.140625 0l-4.515625 10.5zm10.45752 -9.15625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm3.8814087 -1.34375l0 8.109375l-1.421875 0l0 -8.109375l1.421875 0zm0.328125 -2.53125q0 0.203125 -0.09375 0.390625q-0.078125 0.171875 -0.21875 0.3125q-0.140625 0.140625 -0.328125 0.21875q-0.1875 0.078125 -0.390625 0.078125q-0.203125 0 -0.390625 -0.078125q-0.171875 -0.078125 -0.3125 -0.21875q-0.140625 -0.140625 -0.21875 -0.3125q-0.078125 -0.1875 -0.078125 -0.390625q0 -0.21875 0.078125 -0.40625q0.078125 -0.1875 0.21875 -0.328125q0.140625 -0.140625 0.3125 -0.21875q0.1875 -0.078125 0.390625 -0.078125q0.203125 0 0.390625 0.078125q0.1875 0.078125 0.328125 0.21875q0.140625 0.140625 0.21875 0.328125q0.09375 0.1875 0.09375 0.40625zm6.8303223 3.875q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m840.14655 451.01797q0 1.421875 0.359375 2.765625q0.375 1.34375 1.078125 2.5625q0.03125 0.078125 0.046875 0.125q0.015625 0.046875 0.015625 0.109375q0 0.09375 -0.046875 0.15625q-0.046875 0.0625 -0.125 0.09375l-0.53125 0.328125q-0.5 -0.765625 -0.84375 -1.515625q-0.34375 -0.75 -0.5625 -1.515625q-0.21875 -0.765625 -0.328125 -1.53125q-0.09375 -0.765625 -0.09375 -1.578125q0 -0.8125 0.09375 -1.578125q0.109375 -0.78125 0.328125 -1.53125q0.21875 -0.765625 0.5625 -1.515625q0.34375 -0.75 0.84375 -1.515625l0.53125 0.3125q0.078125 0.046875 0.125 0.109375q0.046875 0.0625 0.046875 0.15625q0 0.09375 -0.0625 0.234375q-0.703125 1.203125 -1.078125 2.546875q-0.359375 1.34375 -0.359375 2.78125zm3.045288 6.46875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm8.741699 -4.921875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm2.9249878 1.453125q0 -1.4375 -0.359375 -2.78125q-0.359375 -1.34375 -1.0625 -2.546875q-0.0625 -0.140625 -0.0625 -0.234375q0 -0.09375 0.046875 -0.15625q0.046875 -0.0625 0.109375 -0.109375l0.53125 -0.3125q0.5 0.765625 0.84375 1.515625q0.359375 0.75 0.5625 1.515625q0.21875 0.75 0.3125 1.53125q0.109375 0.765625 0.109375 1.578125q0 0.8125 -0.109375 1.578125q-0.09375 0.765625 -0.3125 1.53125q-0.203125 0.765625 -0.5625 1.515625q-0.34375 0.75 -0.84375 1.515625l-0.53125 -0.328125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.0625 0 -0.109375q0.015625 -0.046875 0.0625 -0.125q0.6875 -1.21875 1.046875 -2.5625q0.375 -1.34375 0.375 -2.765625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m582.7346 440.34744l0 0c0 -3.6181946 2.9331055 -6.5513306 6.5513306 -6.5513306l127.33832 0c1.7374878 0 3.4038696 0.6902466 4.6324463 1.9188538c1.2286377 1.2286072 1.9188843 2.8949585 1.9188843 4.632477l0 26.204468c0 3.618164 -2.9331665 6.5513 -6.5513306 6.5513l-127.33832 0c-3.618225 0 -6.5513306 -2.933136 -6.5513306 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m620.7594 459.30966l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm16.33899 -8.234375q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.6026 7.3125q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.467957 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm11.565002 0.875q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625zm11.959534 1.046875l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm8.315002 1.0q-0.96875 0 -1.484375 -0.53125q-0.515625 -0.53125 -0.515625 -1.546875l0 -4.953125l-0.96875 0q-0.125 0 -0.21875 -0.078125q-0.078125 -0.078125 -0.078125 -0.234375l0 -0.578125l1.328125 -0.15625l0.328125 -2.515625q0.015625 -0.109375 0.09375 -0.1875q0.09375 -0.078125 0.234375 -0.078125l0.71875 0l0 2.796875l2.3125 0l0 1.03125l-2.3125 0l0 4.859375q0 0.515625 0.234375 0.765625q0.25 0.234375 0.640625 0.234375q0.234375 0 0.390625 -0.046875q0.171875 -0.0625 0.28125 -0.125q0.125 -0.078125 0.203125 -0.140625q0.09375 -0.0625 0.15625 -0.0625q0.109375 0 0.203125 0.140625l0.40625 0.671875q-0.359375 0.34375 -0.890625 0.546875q-0.515625 0.1875 -1.0625 0.1875zm9.4678955 -0.125l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m395.41864 440.3466l0 0c0 -3.6181946 2.9331055 -6.5513 6.5513 -6.5513l163.90524 0c1.7375488 0 3.4038696 0.69021606 4.6325073 1.9188232c1.2285767 1.2286072 1.9188232 2.8949585 1.9188232 4.632477l0 26.204468c0 3.6181946 -2.9331055 6.5513 -6.5513306 6.5513l-163.90524 0c-3.6181946 0 -6.5513 -2.9331055 -6.5513 -6.5513z" fill-rule="evenodd"/><path fill="#000000" d="m457.1988 462.0588l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm11.175659 7.09375l-0.640625 0q-0.203125 0 -0.328125 -0.0625q-0.125 -0.0625 -0.171875 -0.28125l-0.15625 -0.75q-0.328125 0.296875 -0.640625 0.53125q-0.296875 0.21875 -0.640625 0.375q-0.328125 0.15625 -0.703125 0.234375q-0.375 0.078125 -0.84375 0.078125q-0.46875 0 -0.890625 -0.125q-0.40625 -0.140625 -0.71875 -0.390625q-0.296875 -0.265625 -0.484375 -0.671875q-0.171875 -0.40625 -0.171875 -0.96875q0 -0.46875 0.265625 -0.90625q0.265625 -0.453125 0.84375 -0.796875q0.59375 -0.34375 1.546875 -0.5625q0.953125 -0.21875 2.328125 -0.25l0 -0.640625q0 -0.9375 -0.40625 -1.421875q-0.40625 -0.484375 -1.1875 -0.484375q-0.53125 0 -0.890625 0.140625q-0.34375 0.125 -0.609375 0.296875q-0.25 0.15625 -0.453125 0.296875q-0.1875 0.125 -0.359375 0.125q-0.15625 0 -0.265625 -0.078125q-0.09375 -0.078125 -0.15625 -0.1875l-0.265625 -0.453125q0.671875 -0.65625 1.453125 -0.96875q0.78125 -0.328125 1.71875 -0.328125q0.671875 0 1.203125 0.234375q0.53125 0.21875 0.890625 0.625q0.359375 0.390625 0.546875 0.96875q0.1875 0.5625 0.1875 1.234375l0 5.1875zm-3.703125 -0.875q0.375 0 0.6875 -0.078125q0.3125 -0.078125 0.578125 -0.203125q0.28125 -0.140625 0.53125 -0.34375q0.265625 -0.203125 0.5 -0.453125l0 -1.6875q-0.984375 0.03125 -1.671875 0.15625q-0.6875 0.109375 -1.125 0.3125q-0.421875 0.203125 -0.625 0.484375q-0.1875 0.265625 -0.1875 0.59375q0 0.328125 0.09375 0.5625q0.109375 0.234375 0.28125 0.375q0.171875 0.140625 0.40625 0.21875q0.25 0.0625 0.53125 0.0625zm5.8618774 0.875l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm11.088562 -6.765625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5625 0.53125 0.9375q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.359375q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm7.8682556 -1.046875q0.53125 0 0.984375 0.109375q0.46875 0.109375 0.84375 0.34375l2.203125 0l0 0.53125q0 0.265625 -0.34375 0.328125l-0.921875 0.125q0.28125 0.53125 0.28125 1.171875q0 0.578125 -0.234375 1.0625q-0.21875 0.484375 -0.625 0.828125q-0.40625 0.34375 -0.96875 0.53125q-0.546875 0.1875 -1.21875 0.1875q-0.5625 0 -1.0625 -0.140625q-0.265625 0.171875 -0.40625 0.359375q-0.125 0.171875 -0.125 0.34375q0 0.296875 0.234375 0.453125q0.234375 0.140625 0.609375 0.203125q0.390625 0.0625 0.875 0.078125q0.5 0.015625 1.0 0.0625q0.515625 0.03125 1.0 0.125q0.484375 0.078125 0.859375 0.28125q0.390625 0.1875 0.625 0.546875q0.234375 0.34375 0.234375 0.90625q0 0.53125 -0.265625 1.015625q-0.25 0.484375 -0.75 0.859375q-0.484375 0.390625 -1.1875 0.609375q-0.703125 0.234375 -1.59375 0.234375q-0.875 0 -1.546875 -0.1875q-0.671875 -0.171875 -1.109375 -0.46875q-0.4375 -0.296875 -0.65625 -0.6875q-0.21875 -0.375 -0.21875 -0.796875q0 -0.609375 0.375 -1.015625q0.375 -0.421875 1.046875 -0.671875q-0.34375 -0.171875 -0.546875 -0.4375q-0.203125 -0.265625 -0.203125 -0.71875q0 -0.171875 0.0625 -0.359375q0.0625 -0.1875 0.1875 -0.359375q0.140625 -0.1875 0.328125 -0.359375q0.1875 -0.171875 0.453125 -0.296875q-0.609375 -0.34375 -0.953125 -0.890625q-0.328125 -0.5625 -0.328125 -1.296875q0 -0.59375 0.21875 -1.078125q0.234375 -0.484375 0.640625 -0.828125q0.40625 -0.34375 0.96875 -0.515625q0.5625 -0.1875 1.234375 -0.1875zm2.53125 8.671875q0 -0.296875 -0.171875 -0.484375q-0.15625 -0.1875 -0.453125 -0.28125q-0.28125 -0.109375 -0.65625 -0.15625q-0.375 -0.046875 -0.796875 -0.0625q-0.421875 -0.015625 -0.859375 -0.03125q-0.421875 -0.03125 -0.8125 -0.109375q-0.453125 0.21875 -0.75 0.53125q-0.28125 0.3125 -0.28125 0.75q0 0.265625 0.140625 0.5q0.140625 0.25 0.421875 0.421875q0.296875 0.171875 0.734375 0.265625q0.4375 0.09375 1.03125 0.09375q0.578125 0 1.03125 -0.109375q0.453125 -0.09375 0.765625 -0.296875q0.328125 -0.1875 0.484375 -0.453125q0.171875 -0.25 0.171875 -0.578125zm-2.53125 -4.390625q0.4375 0 0.765625 -0.125q0.328125 -0.125 0.546875 -0.328125q0.234375 -0.21875 0.34375 -0.515625q0.109375 -0.3125 0.109375 -0.671875q0 -0.734375 -0.453125 -1.171875q-0.4375 -0.453125 -1.3125 -0.453125q-0.84375 0 -1.296875 0.453125q-0.453125 0.4375 -0.453125 1.171875q0 0.359375 0.109375 0.671875q0.125 0.296875 0.34375 0.515625q0.21875 0.203125 0.546875 0.328125q0.328125 0.125 0.75 0.125zm8.738403 -4.28125q0.875 0 1.59375 0.296875q0.71875 0.296875 1.21875 0.84375q0.5 0.546875 0.765625 1.3125q0.265625 0.765625 0.265625 1.71875q0 0.96875 -0.265625 1.734375q-0.265625 0.765625 -0.765625 1.3125q-0.5 0.546875 -1.21875 0.84375q-0.71875 0.28125 -1.59375 0.28125q-0.890625 0 -1.609375 -0.28125q-0.71875 -0.296875 -1.21875 -0.84375q-0.5 -0.546875 -0.78125 -1.3125q-0.265625 -0.765625 -0.265625 -1.734375q0 -0.953125 0.265625 -1.71875q0.28125 -0.765625 0.78125 -1.3125q0.5 -0.546875 1.21875 -0.84375q0.71875 -0.296875 1.609375 -0.296875zm0 7.234375q1.1875 0 1.78125 -0.796875q0.59375 -0.8125 0.59375 -2.25q0 -1.453125 -0.59375 -2.25q-0.59375 -0.8125 -1.78125 -0.8125q-0.609375 0 -1.0625 0.203125q-0.453125 0.203125 -0.75 0.609375q-0.296875 0.390625 -0.453125 0.96875q-0.140625 0.5625 -0.140625 1.28125q0 0.71875 0.140625 1.296875q0.15625 0.5625 0.453125 0.953125q0.296875 0.375 0.75 0.59375q0.453125 0.203125 1.0625 0.203125z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 108.64577l0 0c0 -4.3516846 3.5277405 -7.879425 7.879425 -7.879425l519.0443 0c2.0897217 0 4.093872 0.8301468 5.571594 2.3078308c1.4776611 1.4776764 2.3078003 3.4818344 2.3078003 5.571594l0 31.516739c0 4.3516846 -3.52771 7.879425 -7.8793945 7.879425l-519.0443 0c-4.3516846 0 -7.879425 -3.5277405 -7.879425 -7.879425z" fill-rule="evenodd"/><path fill="#000000" d="m439.27795 123.49851q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5624924 -0.203125 1.0468674q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.32811737 -0.1875 -0.5468674q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm5.5064087 -1.46875q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.1495056 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0zm5.416687 -8.109367l1.171875 0q0.171875 0 0.28125 0.09375q0.109375 0.09375 0.15625 0.203125l2.0625 5.21875q0.109375 0.296875 0.171875 0.5781174q0.0625 0.28125 0.125 0.5625q0.0625 -0.28125 0.125 -0.5625q0.078125 -0.28124237 0.1875 -0.5781174l2.078125 -5.21875q0.046875 -0.125 0.15625 -0.203125q0.109375 -0.09375 0.265625 -0.09375l1.125 0l-3.3125 8.109367l-1.28125 0l-3.3125 -8.109367zm12.218262 -0.125q0.734375 0 1.34375 0.25q0.609375 0.234375 1.0625 0.703125q0.453125 0.453125 0.703125 1.140625q0.25 0.671875 0.25 1.53125q0 0.34375 -0.078125 0.453125q-0.0625 0.109375 -0.265625 0.109375l-5.390625 0q0.015625 0.765625 0.203125 1.34375q0.203125 0.5624924 0.53125 0.9374924q0.34375 0.375 0.796875 0.5625q0.46875 0.1875 1.046875 0.1875q0.53125 0 0.921875 -0.109375q0.390625 -0.125 0.671875 -0.265625q0.28125 -0.15625 0.46875 -0.28125q0.1875 -0.125 0.3125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.25 0.328125 -0.625 0.5625q-0.375 0.234375 -0.796875 0.390625q-0.40625 0.140625 -0.859375 0.21875q-0.453125 0.078125 -0.890625 0.078125q-0.84375 0 -1.546875 -0.28125q-0.703125 -0.28125 -1.21875 -0.828125q-0.515625 -0.546875 -0.8125 -1.3593674q-0.28125 -0.8125 -0.28125 -1.859375q0 -0.84375 0.25 -1.578125q0.265625 -0.734375 0.75 -1.265625q0.5 -0.546875 1.203125 -0.859375q0.703125 -0.3125 1.578125 -0.3125zm0.03125 1.046875q-1.03125 0 -1.625 0.609375q-0.59375 0.59375 -0.734375 1.640625l4.40625 0q0 -0.5 -0.140625 -0.90625q-0.125 -0.40625 -0.390625 -0.703125q-0.265625 -0.3125 -0.65625 -0.46875q-0.375 -0.171875 -0.859375 -0.171875zm5.149536 7.1874924l0 -8.109367l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.1562424l-1.421875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 64.67202l0 0c0 -2.9368782 2.3808136 -5.317688 5.3177032 -5.317688l524.1677 0c1.4103394 0 2.7629395 0.56025314 3.7601929 1.5575142c0.9972534 0.99726105 1.5574951 2.3498383 1.5574951 3.7601738l0 21.270134c0 2.9368744 -2.3807983 5.317688 -5.317688 5.317688l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317688z" fill-rule="evenodd"/><path fill="#000000" d="m437.19943 69.38583l0 11.78125l-1.421875 0l0 -11.78125l1.421875 0zm7.1584473 5.015625q-0.09375 0.171875 -0.296875 0.171875q-0.125 0 -0.28125 -0.078125q-0.140625 -0.09375 -0.375 -0.203125q-0.21875 -0.109375 -0.515625 -0.203125q-0.296875 -0.09375 -0.71875 -0.09375q-0.359375 0 -0.65625 0.09375q-0.28125 0.09375 -0.484375 0.265625q-0.203125 0.15625 -0.3125 0.375q-0.109375 0.203125 -0.109375 0.453125q0 0.296875 0.171875 0.515625q0.1875 0.203125 0.484375 0.359375q0.296875 0.15625 0.671875 0.265625q0.375 0.109375 0.765625 0.25q0.40625 0.125 0.78125 0.296875q0.375 0.15625 0.671875 0.40625q0.296875 0.234375 0.46875 0.578125q0.1875 0.34375 0.1875 0.828125q0 0.5625 -0.203125 1.046875q-0.203125 0.46875 -0.59375 0.828125q-0.390625 0.34375 -0.96875 0.546875q-0.5625 0.1875 -1.296875 0.1875q-0.84375 0 -1.546875 -0.265625q-0.6875 -0.28125 -1.15625 -0.71875l0.328125 -0.546875q0.0625 -0.09375 0.15625 -0.140625q0.09375 -0.0625 0.234375 -0.0625q0.140625 0 0.296875 0.109375q0.171875 0.109375 0.390625 0.25q0.234375 0.125 0.546875 0.25q0.328125 0.109375 0.8125 0.109375q0.421875 0 0.734375 -0.109375q0.3125 -0.109375 0.515625 -0.296875q0.21875 -0.1875 0.3125 -0.421875q0.09375 -0.234375 0.09375 -0.515625q0 -0.328125 -0.1875 -0.546875q-0.171875 -0.234375 -0.46875 -0.375q-0.296875 -0.15625 -0.671875 -0.265625q-0.375 -0.125 -0.78125 -0.25q-0.390625 -0.140625 -0.78125 -0.296875q-0.375 -0.171875 -0.671875 -0.40625q-0.28125 -0.25 -0.46875 -0.609375q-0.171875 -0.375 -0.171875 -0.890625q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.546875 -0.75q0.375 -0.328125 0.90625 -0.515625q0.546875 -0.203125 1.234375 -0.203125q0.796875 0 1.421875 0.25q0.640625 0.25 1.109375 0.703125l-0.3125 0.515625zm2.3032837 9.515625l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm5.222534 7.09375l0 -8.109375l0.8125 0q0.234375 0 0.3125 0.09375q0.09375 0.09375 0.125 0.296875l0.09375 1.265625q0.421875 -0.84375 1.03125 -1.3125q0.609375 -0.484375 1.4375 -0.484375q0.328125 0 0.59375 0.078125q0.28125 0.078125 0.515625 0.21875l-0.1875 1.0625q-0.046875 0.1875 -0.25 0.1875q-0.109375 0 -0.34375 -0.0625q-0.21875 -0.078125 -0.640625 -0.078125q-0.75 0 -1.25 0.4375q-0.5 0.421875 -0.828125 1.25l0 5.15625l-1.421875 0zm6.4479065 2.75l0 -10.859375l0.84375 0q0.296875 0 0.390625 0.296875l0.109375 0.96875q0.53125 -0.640625 1.1875 -1.015625q0.671875 -0.390625 1.546875 -0.390625q0.6875 0 1.25 0.265625q0.578125 0.265625 0.96875 0.796875q0.40625 0.53125 0.625 1.3125q0.21875 0.765625 0.21875 1.765625q0 0.90625 -0.25 1.6875q-0.234375 0.765625 -0.6875 1.328125q-0.4375 0.5625 -1.09375 0.890625q-0.65625 0.3125 -1.46875 0.3125q-0.75 0 -1.28125 -0.25q-0.53125 -0.25 -0.9375 -0.703125l0 3.59375l-1.421875 0zm3.609375 -9.84375q-0.703125 0 -1.234375 0.328125q-0.515625 0.3125 -0.953125 0.890625l0 3.921875q0.390625 0.53125 0.859375 0.75q0.46875 0.21875 1.046875 0.21875q1.125 0 1.734375 -0.8125q0.609375 -0.8125 0.609375 -2.3125q0 -0.78125 -0.140625 -1.34375q-0.140625 -0.578125 -0.40625 -0.9375q-0.265625 -0.375 -0.65625 -0.53125q-0.375 -0.171875 -0.859375 -0.171875zm10.753754 0.4375q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.35957 23.259949l0 0c0 -2.93688 2.3808136 -5.317692 5.3177032 -5.317692l524.1677 0c1.4103394 0 2.7629395 0.56025505 3.7601929 1.5575161c0.9972534 0.99726105 1.5574951 2.3498363 1.5574951 3.7601757l0 21.27013c0 2.9368782 -2.3807983 5.317692 -5.317688 5.317692l-524.1677 0c-2.9368896 0 -5.3177032 -2.3808136 -5.3177032 -5.317692z" fill-rule="evenodd"/><path fill="#000000" d="m447.68848 33.098763q-0.078125 0.078125 -0.140625 0.125q-0.0625 0.046875 -0.171875 0.046875q-0.125 0 -0.265625 -0.09375q-0.140625 -0.109375 -0.359375 -0.21875q-0.21875 -0.125 -0.53125 -0.21875q-0.296875 -0.109375 -0.75 -0.109375q-0.59375 0 -1.046875 0.21875q-0.453125 0.203125 -0.765625 0.609375q-0.296875 0.40625 -0.453125 0.96875q-0.15625 0.5625 -0.15625 1.265625q0 0.75 0.15625 1.328125q0.171875 0.5625 0.46875 0.953125q0.3125 0.375 0.75 0.59375q0.4375 0.203125 0.984375 0.203125q0.515625 0 0.84375 -0.125q0.34375 -0.125 0.5625 -0.28125q0.234375 -0.15625 0.375 -0.28125q0.140625 -0.125 0.28125 -0.125q0.1875 0 0.28125 0.140625l0.390625 0.515625q-0.53125 0.65625 -1.328125 0.953125q-0.78125 0.296875 -1.65625 0.296875q-0.765625 0 -1.421875 -0.28125q-0.640625 -0.28125 -1.125 -0.8125q-0.484375 -0.53125 -0.765625 -1.296875q-0.265625 -0.78125 -0.265625 -1.78125q0 -0.890625 0.25 -1.65625q0.25 -0.78125 0.734375 -1.328125q0.484375 -0.5625 1.1875 -0.875q0.71875 -0.3125 1.640625 -0.3125q0.84375 0 1.5 0.28125q0.65625 0.265625 1.171875 0.78125l-0.375 0.515625zm1.9406433 6.65625l0 -8.109375l0.84375 0q0.296875 0 0.390625 0.296875l0.09375 0.84375q0.453125 -0.5625 1.0 -0.90625q0.5625 -0.359375 1.296875 -0.359375q0.828125 0 1.328125 0.46875q0.515625 0.453125 0.734375 1.21875q0.171875 -0.4375 0.4375 -0.75q0.28125 -0.328125 0.625 -0.53125q0.34375 -0.21875 0.734375 -0.3125q0.390625 -0.09375 0.796875 -0.09375q0.640625 0 1.140625 0.203125q0.5 0.203125 0.84375 0.59375q0.34375 0.390625 0.53125 0.96875q0.1875 0.578125 0.1875 1.3125l0 5.15625l-1.421875 0l0 -5.15625q0 -0.953125 -0.421875 -1.4375q-0.421875 -0.5 -1.203125 -0.5q-0.359375 0 -0.671875 0.125q-0.3125 0.125 -0.5625 0.359375q-0.234375 0.234375 -0.375 0.609375q-0.140625 0.359375 -0.140625 0.84375l0 5.15625l-1.421875 0l0 -5.15625q0 -0.984375 -0.390625 -1.453125q-0.390625 -0.484375 -1.140625 -0.484375q-0.53125 0 -0.984375 0.28125q-0.453125 0.28125 -0.828125 0.765625l0 6.046875l-1.421875 0zm18.83899 0q-0.3125 0 -0.390625 -0.296875l-0.125 -0.984375q-0.515625 0.640625 -1.1875 1.015625q-0.671875 0.375 -1.53125 0.375q-0.703125 0 -1.265625 -0.265625q-0.5625 -0.265625 -0.96875 -0.78125q-0.390625 -0.53125 -0.609375 -1.296875q-0.21875 -0.78125 -0.21875 -1.796875q0 -0.890625 0.234375 -1.65625q0.25 -0.78125 0.6875 -1.34375q0.453125 -0.5625 1.09375 -0.890625q0.65625 -0.328125 1.484375 -0.328125q0.75 0 1.265625 0.25q0.53125 0.25 0.953125 0.71875l0 -4.5l1.421875 0l0 11.78125l-0.84375 0zm-2.765625 -1.046875q0.703125 0 1.21875 -0.3125q0.53125 -0.328125 0.96875 -0.90625l0 -3.921875q-0.390625 -0.53125 -0.859375 -0.734375q-0.46875 -0.21875 -1.03125 -0.21875q-1.140625 0 -1.75 0.8125q-0.609375 0.8125 -0.609375 2.296875q0 0.796875 0.125 1.359375q0.140625 0.5625 0.40625 0.9375q0.265625 0.359375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 269.45407l-59.18109 22.236206" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 269.45407l-53.56447 20.125885" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m134.70233 288.03375l-3.6671753 3.1423645l4.8290863 -0.049987793z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m724.2021 345.2126l66.677185 40.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m724.2021 345.2126l61.54596 37.299713" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m784.89197 383.92487l4.7370605 0.93948364l-3.0249023 -3.764618z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m188.84776 302.54593l-56.15747 35.590546" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.84776 302.54593l-51.08954 32.378693" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m136.87402 333.52948l-2.9489288 3.8244324l4.7173157 -1.0341492z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 16.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m744.6108 36.760384q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm3.6922607 0.875l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm7.084961 1.09375l-1.28125 0l0 -9.546875l1.28125 0l0 9.546875zm6.9921875 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm7.4104004 -6.03125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041504 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm1.7401123 9.0q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.226013 -0.28125l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.715759 -0.953125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.9429932 -4.265625l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457275 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 56.929134l180.72443 0l0 35.59055l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m741.47015 75.43226q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.2145386 -4.765625q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm11.048279 3.296875q0 1.0625 -0.34375 1.96875q-0.34375 0.890625 -0.96875 1.546875q-0.609375 0.640625 -1.484375 1.0q-0.859375 0.34375 -1.921875 0.34375q-1.046875 0 -1.921875 -0.34375q-0.859375 -0.359375 -1.484375 -1.0q-0.609375 -0.65625 -0.953125 -1.546875q-0.34375 -0.90625 -0.34375 -1.96875q0 -1.078125 0.34375 -1.96875q0.34375 -0.90625 0.953125 -1.546875q0.625 -0.65625 1.484375 -1.015625q0.875 -0.359375 1.921875 -0.359375q1.0625 0 1.921875 0.359375q0.875 0.359375 1.484375 1.015625q0.625 0.640625 0.96875 1.546875q0.34375 0.890625 0.34375 1.96875zm-1.328125 0q0 -0.890625 -0.25 -1.578125q-0.234375 -0.703125 -0.671875 -1.1875q-0.4375 -0.484375 -1.0625 -0.734375q-0.625 -0.265625 -1.40625 -0.265625q-0.765625 0 -1.390625 0.265625q-0.625 0.25 -1.078125 0.734375q-0.4375 0.484375 -0.671875 1.1875q-0.234375 0.6875 -0.234375 1.578125q0 0.875 0.234375 1.578125q0.234375 0.6875 0.671875 1.171875q0.453125 0.484375 1.078125 0.75q0.625 0.25 1.390625 0.25q0.78125 0 1.40625 -0.25q0.625 -0.265625 1.0625 -0.75q0.4375 -0.484375 0.671875 -1.171875q0.25 -0.703125 0.25 -1.578125zm3.7608032 -4.78125q0.171875 0 0.25 0.046875q0.09375 0.03125 0.1875 0.171875l5.53125 7.203125q-0.015625 -0.1875 -0.03125 -0.34375q0 -0.15625 0 -0.3125l0 -6.765625l1.140625 0l0 9.546875l-0.65625 0q-0.15625 0 -0.265625 -0.046875q-0.09375 -0.0625 -0.1875 -0.1875l-5.53125 -7.1875q0.015625 0.171875 0.015625 0.328125q0.015625 0.15625 0.015625 0.296875l0 6.796875l-1.140625 0l0 -9.546875l0.671875 0l0 0zm10.825989 5.5625l0 3.984375l-1.28125 0l0 -9.546875l2.6875 0q0.90625 0 1.5625 0.1875q0.671875 0.171875 1.09375 0.53125q0.4375 0.34375 0.640625 0.828125q0.203125 0.484375 0.203125 1.09375q0 0.515625 -0.15625 0.953125q-0.15625 0.4375 -0.46875 0.796875q-0.296875 0.34375 -0.734375 0.59375q-0.4375 0.234375 -0.984375 0.359375q0.234375 0.140625 0.421875 0.40625l2.78125 3.796875l-1.140625 0q-0.359375 0 -0.515625 -0.265625l-2.484375 -3.421875q-0.109375 -0.15625 -0.25 -0.21875q-0.125 -0.078125 -0.390625 -0.078125l-0.984375 0zm0 -0.9375l1.359375 0q0.5625 0 0.984375 -0.140625q0.4375 -0.140625 0.71875 -0.390625q0.296875 -0.25 0.4375 -0.59375q0.15625 -0.34375 0.15625 -0.765625q0 -0.84375 -0.5625 -1.28125q-0.5625 -0.4375 -1.6875 -0.4375l-1.40625 0l0 3.609375zm8.583313 1.34375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm13.455933 2.625q0.109375 0 0.1875 0.078125l0.515625 0.5625q-0.59375 0.671875 -1.4375 1.0625q-0.828125 0.375 -2.0 0.375q-1.03125 0 -1.875 -0.359375q-0.84375 -0.359375 -1.4375 -1.0q-0.59375 -0.640625 -0.921875 -1.53125q-0.328125 -0.90625 -0.328125 -1.984375q0 -1.078125 0.34375 -1.984375q0.359375 -0.90625 0.984375 -1.546875q0.640625 -0.640625 1.515625 -1.0q0.890625 -0.359375 1.953125 -0.359375q1.0625 0 1.828125 0.328125q0.765625 0.328125 1.34375 0.890625l-0.40625 0.59375q-0.046875 0.0625 -0.109375 0.109375q-0.0625 0.03125 -0.171875 0.03125q-0.09375 0 -0.1875 -0.0625q-0.09375 -0.0625 -0.234375 -0.15625q-0.125 -0.09375 -0.3125 -0.1875q-0.171875 -0.109375 -0.421875 -0.203125q-0.25 -0.09375 -0.578125 -0.15625q-0.328125 -0.0625 -0.75 -0.0625q-0.765625 0 -1.40625 0.265625q-0.625 0.25 -1.09375 0.75q-0.453125 0.484375 -0.71875 1.1875q-0.25 0.6875 -0.25 1.5625q0 0.890625 0.25 1.59375q0.265625 0.6875 0.703125 1.171875q0.4375 0.484375 1.046875 0.75q0.609375 0.25 1.3125 0.25q0.421875 0 0.765625 -0.046875q0.34375 -0.0625 0.625 -0.15625q0.296875 -0.109375 0.546875 -0.265625q0.25 -0.171875 0.5 -0.40625q0.109375 -0.09375 0.21875 -0.09375zm8.655151 -3.671875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581238 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm7.9904175 0l0 -9.8125l1.1875 0l0 4.03125q0.421875 -0.484375 0.96875 -0.78125q0.546875 -0.296875 1.234375 -0.296875q0.59375 0 1.0625 0.21875q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.578125 1.109375q-0.375 0.46875 -0.921875 0.75q-0.53125 0.265625 -1.21875 0.265625q-0.640625 0 -1.109375 -0.25q-0.453125 -0.25 -0.796875 -0.703125l-0.0625 0.609375q-0.046875 0.25 -0.296875 0.25l-0.765625 0zm3.015625 -5.90625q-0.59375 0 -1.03125 0.265625q-0.421875 0.265625 -0.796875 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.859375 0.171875q0.953125 0 1.453125 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm5.7160034 -0.84375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.160461 0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm6.3253784 -5.890625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm8.404419 -2.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 104.92913l180.72443 0l0 35.590553l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 125.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444397 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5950928 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm12.981384 -1.046875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm4.527466 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2808228 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.72015 184.92914l180.72443 0l0 35.590546l-180.72443 0z" fill-rule="evenodd"/><path fill="#000000" d="m739.1733 205.63538l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.335022 1.09375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.69165 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm5.560669 -3.453125l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm11.3479 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm7.1480103 -6.140625q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375zm7.201233 -3.5625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm7.1187744 5.984375l0 -5.734375l-0.734375 -0.09375q-0.140625 -0.03125 -0.234375 -0.09375q-0.09375 -0.078125 -0.09375 -0.203125l0 -0.5l1.0625 0l0 -0.640625q0 -0.578125 0.15625 -1.03125q0.171875 -0.453125 0.46875 -0.765625q0.3125 -0.3125 0.734375 -0.46875q0.4375 -0.15625 0.96875 -0.15625q0.453125 0 0.828125 0.125l-0.015625 0.59375q-0.015625 0.140625 -0.125 0.171875q-0.09375 0.015625 -0.296875 0.015625l-0.203125 0q-0.3125 0 -0.5625 0.09375q-0.234375 0.078125 -0.421875 0.265625q-0.1875 0.171875 -0.28125 0.46875q-0.09375 0.28125 -0.09375 0.71875l0 0.609375l1.953125 0l0 0.875l-1.90625 0l0 5.75l-1.203125 0zm6.897766 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm9.249573 5.984375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.913574 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm3.9557495 -6.859375l0 4.296875q0 0.78125 0.34375 1.203125q0.359375 0.40625 1.078125 0.40625q0.515625 0 0.96875 -0.234375q0.46875 -0.25 0.859375 -0.6875l0 -4.984375l1.1875 0l0 6.75l-0.71875 0q-0.25 0 -0.3125 -0.25l-0.09375 -0.71875q-0.4375 0.484375 -0.984375 0.78125q-0.546875 0.296875 -1.25 0.296875q-0.5625 0 -0.984375 -0.1875q-0.421875 -0.1875 -0.71875 -0.515625q-0.28125 -0.328125 -0.421875 -0.796875q-0.140625 -0.484375 -0.140625 -1.0625l0 -4.296875l1.1875 0zm6.3791504 6.75l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155823 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m727.71906 256.92914l195.71655 0l0 35.590546l-195.71655 0z" fill-rule="evenodd"/><path fill="#000000" d="m742.7659 270.66663q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm1.9857788 8.0625l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.866699 3.0l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm8.216492 0.265625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 5.640625l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.144775 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229614 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm2.5807495 -0.921875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm4.897827 -5.9375l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm8.99585 0l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.4901123 2.015625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.4058228 -0.765625l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm10.327209 5.9375q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm9.616577 -4.828125q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm4.581299 -1.21875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155762 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm5.784363 0q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm7.0666504 -0.8125q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125z" fill-rule="nonzero"/><path fill="#000000" d="m736.8128 287.97913l0.9375 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.296875 4.34375q0.046875 0.234375 0.09375 0.46875q0.046875 0.21875 0.078125 0.4375q0.0625 -0.21875 0.125 -0.4375q0.0625 -0.234375 0.140625 -0.46875l1.421875 -4.375q0.03125 -0.09375 0.109375 -0.15625q0.09375 -0.078125 0.21875 -0.078125l0.515625 0q0.140625 0 0.21875 0.078125q0.09375 0.0625 0.125 0.15625l1.390625 4.375q0.078125 0.234375 0.125 0.46875q0.0625 0.21875 0.109375 0.4375q0.03125 -0.21875 0.078125 -0.453125q0.0625 -0.25 0.125 -0.453125l1.328125 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.890625 0l-2.1875 6.75l-0.9375 0q-0.171875 0 -0.25 -0.234375l-1.484375 -4.578125q-0.046875 -0.140625 -0.09375 -0.296875q-0.03125 -0.15625 -0.0625 -0.3125q-0.03125 0.15625 -0.0625 0.3125q-0.03125 0.15625 -0.09375 0.3125l-1.515625 4.5625q-0.0625 0.234375 -0.265625 0.234375l-0.890625 0l-2.1875 -6.75zm13.818665 -0.109375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760864 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.605591 -9.8125l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm9.624512 4.171875q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm1.9093628 7.921875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm9.310242 5.90625l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.476074 -4.828125q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.286743 -1.3125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm3.9370117 5.171875q0 -0.15625 0.046875 -0.296875q0.0625 -0.140625 0.171875 -0.234375q0.109375 -0.109375 0.25 -0.171875q0.140625 -0.0625 0.3125 -0.0625q0.203125 0 0.359375 0.078125q0.15625 0.078125 0.25 0.203125q0.109375 0.125 0.15625 0.296875q0.0625 0.171875 0.0625 0.375q0 0.296875 -0.09375 0.625q-0.078125 0.3125 -0.234375 0.625q-0.15625 0.328125 -0.40625 0.625q-0.234375 0.296875 -0.53125 0.5625l-0.203125 -0.203125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.09375 -0.171875q0.0625 -0.078125 0.15625 -0.203125q0.109375 -0.125 0.21875 -0.28125q0.109375 -0.15625 0.203125 -0.359375q0.09375 -0.1875 0.125 -0.40625l-0.078125 0q-0.1875 0 -0.328125 -0.0625q-0.125 -0.0625 -0.234375 -0.171875q-0.109375 -0.109375 -0.171875 -0.25q-0.046875 -0.15625 -0.046875 -0.328125zm7.069763 -5.9375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm6.3533325 -6.75l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm12.636475 6.75l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm3.4119873 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm6.5682373 8.875q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966003 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9136353 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.2526245 -6.859375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm4.5526123 2.015625q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760254 0.828125l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m744.3753 301.18225l0 1.078125l-3.078125 0l0 8.46875l-1.296875 0l0 -8.46875l-3.09375 0l0 -1.078125l7.46875 0zm1.9604492 11.546875q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133667 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm11.462463 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm1.6148682 5.546875l0 -9.8125l1.1875 0l0 3.96875q0.4375 -0.453125 0.953125 -0.734375q0.53125 -0.28125 1.21875 -0.28125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm10.082275 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.890137 0.4375q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm2.8492432 -4.265625l0 5.78125l0.3125 0q0.125 0 0.203125 -0.03125q0.09375 -0.046875 0.203125 -0.15625l2.140625 -2.296875q0.09375 -0.109375 0.1875 -0.171875q0.109375 -0.0625 0.28125 -0.0625l1.078125 0l-2.484375 2.640625q-0.09375 0.125 -0.1875 0.21875q-0.09375 0.078125 -0.203125 0.140625q0.125 0.078125 0.21875 0.1875q0.09375 0.09375 0.171875 0.234375l2.640625 3.328125l-1.0625 0q-0.140625 0 -0.25 -0.046875q-0.109375 -0.0625 -0.1875 -0.1875l-2.234375 -2.765625q-0.09375 -0.140625 -0.203125 -0.171875q-0.09375 -0.046875 -0.296875 -0.046875l-0.328125 0l0 3.21875l-1.1875 0l0 -9.8125l1.1875 0zm7.0776367 3.0625l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm1.8182373 8.875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.691711 -6.859375q0.4375 0 0.8125 0.09375q0.390625 0.09375 0.703125 0.28125l1.828125 0l0 0.4375q0 0.21875 -0.28125 0.28125l-0.765625 0.109375q0.234375 0.4375 0.234375 0.96875q0 0.484375 -0.203125 0.890625q-0.1875 0.40625 -0.53125 0.703125q-0.328125 0.28125 -0.796875 0.4375q-0.453125 0.140625 -1.0 0.140625q-0.484375 0 -0.890625 -0.109375q-0.21875 0.125 -0.328125 0.28125q-0.109375 0.15625 -0.109375 0.296875q0 0.25 0.1875 0.375q0.203125 0.125 0.515625 0.171875q0.328125 0.046875 0.734375 0.0625q0.40625 0.015625 0.828125 0.046875q0.421875 0.03125 0.828125 0.109375q0.40625 0.0625 0.71875 0.234375q0.328125 0.171875 0.515625 0.46875q0.1875 0.28125 0.1875 0.75q0 0.4375 -0.21875 0.84375q-0.203125 0.40625 -0.609375 0.71875q-0.40625 0.3125 -1.0 0.5q-0.578125 0.203125 -1.328125 0.203125q-0.734375 0 -1.296875 -0.15625q-0.546875 -0.140625 -0.921875 -0.390625q-0.359375 -0.25 -0.546875 -0.578125q-0.1875 -0.3125 -0.1875 -0.671875q0 -0.5 0.3125 -0.84375q0.328125 -0.34375 0.875 -0.5625q-0.28125 -0.125 -0.453125 -0.34375q-0.171875 -0.234375 -0.171875 -0.609375q0 -0.140625 0.046875 -0.296875q0.0625 -0.15625 0.171875 -0.3125q0.109375 -0.15625 0.265625 -0.296875q0.171875 -0.140625 0.375 -0.234375q-0.5 -0.28125 -0.78125 -0.75q-0.28125 -0.46875 -0.28125 -1.078125q0 -0.5 0.1875 -0.890625q0.1875 -0.40625 0.53125 -0.6875q0.34375 -0.296875 0.8125 -0.4375q0.46875 -0.15625 1.03125 -0.15625zm2.09375 7.21875q0 -0.25 -0.140625 -0.390625q-0.125 -0.15625 -0.375 -0.234375q-0.234375 -0.09375 -0.546875 -0.125q-0.3125 -0.046875 -0.671875 -0.0625q-0.34375 -0.015625 -0.703125 -0.03125q-0.359375 -0.03125 -0.6875 -0.078125q-0.375 0.171875 -0.609375 0.4375q-0.234375 0.265625 -0.234375 0.625q0 0.21875 0.109375 0.40625q0.125 0.203125 0.359375 0.34375q0.234375 0.15625 0.59375 0.234375q0.375 0.078125 0.875 0.078125q0.46875 0 0.84375 -0.09375q0.390625 -0.078125 0.65625 -0.234375q0.265625 -0.15625 0.390625 -0.375q0.140625 -0.21875 0.140625 -0.5zm-2.09375 -3.65625q0.359375 0 0.625 -0.09375q0.28125 -0.109375 0.46875 -0.28125q0.1875 -0.1875 0.28125 -0.4375q0.09375 -0.25 0.09375 -0.546875q0 -0.625 -0.375 -0.984375q-0.375 -0.375 -1.09375 -0.375q-0.71875 0 -1.09375 0.375q-0.375 0.359375 -0.375 0.984375q0 0.296875 0.09375 0.546875q0.09375 0.25 0.28125 0.4375q0.1875 0.171875 0.453125 0.28125q0.28125 0.09375 0.640625 0.09375z" fill-rule="nonzero"/><path fill="#000000" d="m745.7347 326.72913l-1.0 0q-0.171875 0 -0.28125 -0.078125q-0.109375 -0.09375 -0.15625 -0.234375l-0.890625 -2.296875l-4.28125 0l-0.90625 2.296875q-0.046875 0.125 -0.15625 0.21875q-0.109375 0.09375 -0.28125 0.09375l-1.0 0l3.828125 -9.546875l1.3125 0l3.8125 9.546875zm-6.25 -3.546875l3.5625 0l-1.5 -3.890625q-0.15625 -0.359375 -0.296875 -0.890625q-0.0625 0.265625 -0.140625 0.5q-0.0625 0.234375 -0.125 0.40625l-1.5 3.875zm7.2662354 3.546875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm12.37915 0l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.194824 -9.09375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0zm4.0682373 11.8125q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm8.7146 -7.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.2375488 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm9.231689 5.640625q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm4.9972534 0.859375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm6.699341 -6.75l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm0.9744873 2.125l0.96875 0q0.140625 0 0.234375 0.078125q0.09375 0.0625 0.125 0.171875l1.71875 4.34375q0.09375 0.234375 0.140625 0.484375q0.0625 0.234375 0.109375 0.46875q0.046875 -0.234375 0.109375 -0.46875q0.0625 -0.25 0.15625 -0.484375l1.734375 -4.34375q0.03125 -0.109375 0.125 -0.171875q0.09375 -0.078125 0.21875 -0.078125l0.9375 0l-2.765625 6.75l-1.0625 0l-2.75 -6.75zm10.16626 -0.109375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.2807617 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 437.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m86.16409 453.50504l0.484375 0q0.25 0 0.40625 -0.0625q0.15625 -0.0625 0.28125 -0.21875l3.1875 -3.609375q0.140625 -0.15625 0.265625 -0.21875q0.140625 -0.078125 0.359375 -0.078125l1.09375 0l-3.625 4.109375q-0.140625 0.15625 -0.265625 0.265625q-0.125 0.09375 -0.265625 0.171875q0.1875 0.0625 0.328125 0.1875q0.140625 0.109375 0.296875 0.28125l3.796875 4.53125l-1.125 0q-0.125 0 -0.21875 -0.015625q-0.078125 -0.03125 -0.140625 -0.0625q-0.0625 -0.03125 -0.125 -0.078125q-0.046875 -0.0625 -0.109375 -0.109375l-3.296875 -3.796875q-0.0625 -0.078125 -0.125 -0.140625q-0.0625 -0.0625 -0.15625 -0.09375q-0.078125 -0.046875 -0.1875 -0.0625q-0.109375 -0.015625 -0.265625 -0.015625l-0.59375 0l0 4.375l-1.28125 0l0 -9.546875l1.28125 0l0 4.1875zm9.8989105 -1.5q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm6.0918274 7.984375q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm12.161911 -2.0q-0.25 0 -0.3125 -0.25l-0.109375 -0.8125q-0.4375 0.515625 -1.0 0.84375q-0.546875 0.3125 -1.265625 0.3125q-0.578125 0 -1.0625 -0.21875q-0.46875 -0.234375 -0.796875 -0.65625q-0.328125 -0.4375 -0.515625 -1.078125q-0.171875 -0.65625 -0.171875 -1.5q0 -0.734375 0.1875 -1.375q0.203125 -0.65625 0.578125 -1.125q0.375 -0.46875 0.921875 -0.734375q0.546875 -0.28125 1.234375 -0.28125q0.609375 0 1.046875 0.21875q0.4375 0.203125 0.796875 0.578125l0 -3.734375l1.1875 0l0 9.8125l-0.71875 0zm-2.296875 -0.859375q0.578125 0 1.015625 -0.265625q0.4375 -0.28125 0.8125 -0.765625l0 -3.265625q-0.328125 -0.4375 -0.71875 -0.609375q-0.390625 -0.171875 -0.859375 -0.171875q-0.953125 0 -1.46875 0.671875q-0.5 0.671875 -0.5 1.90625q0 0.671875 0.109375 1.140625q0.125 0.46875 0.34375 0.78125q0.21875 0.296875 0.53125 0.4375q0.328125 0.140625 0.734375 0.140625zm9.966019 0.859375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm6.9135895 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm7.8932495 -0.109375l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm9.485901 0.828125q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm4.9088745 1.890625q-0.0625 0.125 -0.15625 0.203125q-0.078125 0.078125 -0.265625 0.078125l-0.890625 0l1.234375 -2.671875l-2.78125 -6.359375l1.03125 0q0.140625 0 0.234375 0.078125q0.09375 0.078125 0.125 0.171875l1.8125 4.25q0.0625 0.140625 0.09375 0.296875q0.046875 0.140625 0.078125 0.296875q0.046875 -0.15625 0.09375 -0.296875q0.046875 -0.15625 0.109375 -0.3125l1.75 -4.234375q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.078125 0.203125 -0.078125l0.953125 0l-3.765625 8.75zm4.8395996 0.28125l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm7.0133514 -0.953125q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm8.155792 0.34375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-2.6656628 485.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m97.31447 505.77066l4.125 0l0 1.09375l-5.421875 0l0 -9.546875l1.296875 0l0 8.453125zm10.444382 -6.96875q-0.0625 0.109375 -0.125 0.15625q-0.0625 0.046875 -0.171875 0.046875q-0.109375 0 -0.265625 -0.109375q-0.140625 -0.109375 -0.375 -0.25q-0.234375 -0.140625 -0.5625 -0.25q-0.3125 -0.109375 -0.78125 -0.109375q-0.421875 0 -0.765625 0.125q-0.328125 0.109375 -0.5625 0.3125q-0.21875 0.1875 -0.328125 0.46875q-0.109375 0.265625 -0.109375 0.578125q0 0.390625 0.1875 0.65625q0.203125 0.265625 0.515625 0.453125q0.328125 0.1875 0.734375 0.328125q0.421875 0.125 0.84375 0.28125q0.4375 0.140625 0.84375 0.328125q0.40625 0.1875 0.734375 0.46875q0.328125 0.265625 0.515625 0.6875q0.203125 0.40625 0.203125 0.984375q0 0.640625 -0.21875 1.1875q-0.203125 0.546875 -0.625 0.953125q-0.40625 0.40625 -1.0 0.640625q-0.59375 0.234375 -1.359375 0.234375q-0.921875 0 -1.6875 -0.328125q-0.765625 -0.34375 -1.296875 -0.921875l0.375 -0.609375q0.046875 -0.078125 0.125 -0.125q0.078125 -0.046875 0.171875 -0.046875q0.140625 0 0.3125 0.15625q0.1875 0.140625 0.453125 0.328125q0.265625 0.171875 0.640625 0.328125q0.390625 0.140625 0.953125 0.140625q0.453125 0 0.8125 -0.125q0.359375 -0.125 0.609375 -0.34375q0.25 -0.234375 0.375 -0.546875q0.140625 -0.328125 0.140625 -0.734375q0 -0.421875 -0.203125 -0.703125q-0.1875 -0.28125 -0.515625 -0.46875q-0.3125 -0.1875 -0.71875 -0.3125q-0.40625 -0.125 -0.84375 -0.265625q-0.421875 -0.140625 -0.84375 -0.3125q-0.40625 -0.1875 -0.734375 -0.46875q-0.3125 -0.28125 -0.515625 -0.703125q-0.1875 -0.4375 -0.1875 -1.078125q0 -0.5 0.1875 -0.96875q0.203125 -0.484375 0.578125 -0.84375q0.375 -0.375 0.921875 -0.59375q0.546875 -0.21875 1.265625 -0.21875q0.796875 0 1.453125 0.25q0.671875 0.25 1.15625 0.734375l-0.3125 0.609375zm3.5951233 4.484375l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.106384 6.875l0 -9.03125l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.796875q0.4375 -0.53125 0.984375 -0.84375q0.5625 -0.328125 1.296875 -0.328125q0.578125 0 1.046875 0.234375q0.46875 0.21875 0.796875 0.65625q0.34375 0.4375 0.515625 1.078125q0.1875 0.640625 0.1875 1.484375q0 0.75 -0.203125 1.390625q-0.1875 0.640625 -0.5625 1.109375q-0.375 0.46875 -0.921875 0.75q-0.546875 0.265625 -1.21875 0.265625q-0.625 0 -1.078125 -0.203125q-0.4375 -0.203125 -0.78125 -0.59375l0 2.984375l-1.1875 0zm3.015625 -8.1875q-0.578125 0 -1.015625 0.265625q-0.4375 0.265625 -0.8125 0.75l0 3.265625q0.328125 0.4375 0.71875 0.625q0.390625 0.171875 0.875 0.171875q0.9375 0 1.4375 -0.671875q0.515625 -0.671875 0.515625 -1.921875q0 -0.65625 -0.125 -1.125q-0.109375 -0.484375 -0.328125 -0.78125q-0.21875 -0.296875 -0.546875 -0.4375q-0.3125 -0.140625 -0.71875 -0.140625zm4.3414764 5.90625l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.105591 -6.859375q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.7229156 0.9375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm9.285416 -4.71875q-0.046875 0.0625 -0.109375 0.109375q-0.046875 0.046875 -0.15625 0.046875q-0.09375 0 -0.21875 -0.078125q-0.109375 -0.09375 -0.296875 -0.1875q-0.171875 -0.109375 -0.4375 -0.1875q-0.25 -0.09375 -0.625 -0.09375q-0.484375 0 -0.875 0.1875q-0.375 0.171875 -0.640625 0.515625q-0.25 0.328125 -0.375 0.796875q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.140625 1.09375q0.140625 0.46875 0.390625 0.796875q0.25 0.3125 0.609375 0.484375q0.359375 0.171875 0.8125 0.171875q0.4375 0 0.71875 -0.09375q0.28125 -0.109375 0.46875 -0.234375q0.1875 -0.125 0.296875 -0.234375q0.125 -0.109375 0.25 -0.109375q0.15625 0 0.21875 0.125l0.34375 0.421875q-0.4375 0.546875 -1.109375 0.796875q-0.65625 0.25 -1.390625 0.25q-0.625 0 -1.171875 -0.234375q-0.546875 -0.234375 -0.953125 -0.671875q-0.390625 -0.453125 -0.625 -1.09375q-0.21875 -0.640625 -0.21875 -1.46875q0 -0.75 0.203125 -1.390625q0.203125 -0.640625 0.609375 -1.109375q0.40625 -0.46875 1.0 -0.71875q0.59375 -0.265625 1.359375 -0.265625q0.703125 0 1.25 0.234375q0.546875 0.234375 0.96875 0.640625l-0.3125 0.4375zm4.3492126 -1.3125q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm6.0041656 -8.984375l0 9.8125l-1.1875 0l0 -9.8125l1.1875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m-66.665665 229.06442l180.72441 0l0 35.590546l-180.72441 0z" fill-rule="evenodd"/><path fill="#000000" d="m14.926851 247.2863l0 3.578125l-1.28125 0l0 -9.546875l2.8125 0q0.90625 0 1.578125 0.21875q0.671875 0.203125 1.109375 0.59375q0.4375 0.375 0.65625 0.921875q0.21875 0.546875 0.21875 1.21875q0 0.671875 -0.234375 1.234375q-0.234375 0.546875 -0.6875 0.953125q-0.453125 0.390625 -1.125 0.609375q-0.65625 0.21875 -1.515625 0.21875l-1.53125 0zm0 -1.015625l1.53125 0q0.5625 0 0.984375 -0.140625q0.421875 -0.15625 0.703125 -0.421875q0.28125 -0.265625 0.421875 -0.625q0.15625 -0.375 0.15625 -0.8125q0 -0.90625 -0.5625 -1.421875q-0.5625 -0.515625 -1.703125 -0.515625l-1.53125 0l0 3.9375zm9.005951 -2.265625q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.2343769 0.0625 0.4218769 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.2031269 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm9.246218 -5.640625q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.237503 -1.109375l0 6.75l-1.1875 0l0 -6.75l1.1875 0zm0.265625 -2.125q0 0.171875 -0.078125 0.328125q-0.0625 0.15625 -0.1875 0.28125q-0.109375 0.109375 -0.265625 0.171875q-0.15625 0.0625 -0.328125 0.0625q-0.171875 0 -0.328125 -0.0625q-0.140625 -0.0625 -0.265625 -0.171875q-0.109375 -0.125 -0.1875 -0.28125q-0.0625 -0.15625 -0.0625 -0.328125q0 -0.171875 0.0625 -0.328125q0.078125 -0.15625 0.1875 -0.265625q0.125 -0.125 0.265625 -0.1875q0.15625 -0.0625 0.328125 -0.0625q0.171875 0 0.328125 0.0625q0.15625 0.0625 0.265625 0.1875q0.125 0.109375 0.1875 0.265625q0.078125 0.15625 0.078125 0.328125zm5.6932373 3.234375q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.5963745 -6.96875q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625zm4.280792 5.984375l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5624962 0 0.9843712 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0624962 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm9.457287 0.109375q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm9.371811 -5.75q-0.078125 0.15625 -0.25 0.15625q-0.109375 0 -0.234375 -0.078125q-0.125 -0.078125 -0.3125 -0.15625q-0.171875 -0.09375 -0.4375 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.296875 0 -0.546875 0.078125q-0.234375 0.078125 -0.40625 0.21875q-0.15625 0.125 -0.25 0.296875q-0.09375 0.171875 -0.09375 0.390625q0 0.25 0.140625 0.421875q0.15625 0.171875 0.40625 0.3125q0.25 0.125 0.5625 0.21875q0.3125 0.09375 0.640625 0.203125q0.328125 0.109375 0.640625 0.25q0.3125 0.125 0.5625 0.328125q0.25 0.203125 0.390625 0.5q0.15625 0.28125 0.15625 0.6875q0 0.46875 -0.171875 0.859375q-0.15625 0.390625 -0.484375 0.6875q-0.328125 0.28125 -0.8125 0.453125q-0.46875 0.171875 -1.078125 0.171875q-0.71875 0 -1.296875 -0.234375q-0.5625 -0.234375 -0.96875 -0.59375l0.28125 -0.453125q0.0625 -0.078125 0.125 -0.125q0.078125 -0.046875 0.203125 -0.046875q0.125 0 0.25 0.09375q0.140625 0.09375 0.328125 0.203125q0.1875 0.109375 0.453125 0.203125q0.265625 0.09375 0.671875 0.09375q0.359375 0 0.609375 -0.078125q0.265625 -0.09375 0.4375 -0.25q0.171875 -0.15625 0.25 -0.34375q0.09375 -0.203125 0.09375 -0.4375q0 -0.28125 -0.15625 -0.453125q-0.140625 -0.1875 -0.390625 -0.3125q-0.25 -0.140625 -0.578125 -0.234375q-0.3125 -0.09375 -0.640625 -0.203125q-0.328125 -0.109375 -0.640625 -0.234375q-0.3125 -0.140625 -0.5625 -0.34375q-0.25 -0.21875 -0.40625 -0.515625q-0.140625 -0.3125 -0.140625 -0.734375q0 -0.390625 0.15625 -0.75q0.15625 -0.359375 0.46875 -0.625q0.3125 -0.265625 0.75 -0.421875q0.453125 -0.171875 1.015625 -0.171875q0.671875 0 1.203125 0.21875q0.53125 0.203125 0.921875 0.5625l-0.265625 0.4375zm3.956253 5.75q-0.796875 0 -1.234375 -0.4375q-0.421875 -0.453125 -0.421875 -1.296875l0 -4.125l-0.8125 0q-0.109375 0 -0.1875 -0.0625q-0.0625 -0.078125 -0.0625 -0.203125l0 -0.46875l1.109375 -0.140625l0.265625 -2.09375q0.015625 -0.09375 0.078125 -0.15625q0.078125 -0.0625 0.203125 -0.0625l0.59375 0l0 2.3125l1.9375 0l0 0.875l-1.9375 0l0 4.046875q0 0.421875 0.203125 0.640625q0.203125 0.203125 0.53125 0.203125q0.1875 0 0.328125 -0.046875q0.140625 -0.0625 0.234375 -0.125q0.09375 -0.0625 0.15625 -0.109375q0.078125 -0.046875 0.140625 -0.046875q0.09375 0 0.171875 0.109375l0.34375 0.578125q-0.3125 0.28125 -0.75 0.453125q-0.421875 0.15625 -0.890625 0.15625zm5.6588745 -6.96875q0.734375 0 1.328125 0.25q0.609375 0.25 1.015625 0.703125q0.421875 0.453125 0.640625 1.09375q0.234375 0.640625 0.234375 1.4375q0 0.796875 -0.234375 1.4375q-0.21875 0.640625 -0.640625 1.09375q-0.40625 0.453125 -1.015625 0.703125q-0.59375 0.234375 -1.328125 0.234375q-0.734375 0 -1.34375 -0.234375q-0.59375 -0.25 -1.015625 -0.703125q-0.40625 -0.453125 -0.640625 -1.09375q-0.21875 -0.640625 -0.21875 -1.4375q0 -0.796875 0.21875 -1.4375q0.234375 -0.640625 0.640625 -1.09375q0.421875 -0.453125 1.015625 -0.703125q0.609375 -0.25 1.34375 -0.25zm0 6.03125q1.0 0 1.484375 -0.671875q0.5 -0.671875 0.5 -1.875q0 -1.203125 -0.5 -1.875q-0.484375 -0.671875 -1.484375 -0.671875q-0.5 0 -0.875 0.171875q-0.375 0.171875 -0.625 0.5q-0.25 0.328125 -0.375 0.8125q-0.125 0.46875 -0.125 1.0625q0 0.609375 0.125 1.078125q0.125 0.46875 0.375 0.796875q0.25 0.328125 0.625 0.5q0.375 0.171875 0.875 0.171875zm4.6760406 0.828125l0 -6.75l0.6875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.09375 0.25l0.078125 1.046875q0.359375 -0.703125 0.859375 -1.09375q0.515625 -0.40625 1.203125 -0.40625q0.28125 0 0.5 0.0625q0.234375 0.0625 0.421875 0.1875l-0.15625 0.875q-0.046875 0.171875 -0.203125 0.171875q-0.09375 0 -0.296875 -0.0625q-0.1875 -0.0625 -0.53125 -0.0625q-0.625 0 -1.046875 0.359375q-0.40625 0.359375 -0.6875 1.046875l0 4.296875l-1.1875 0zm8.043091 -6.859375q0.609375 0 1.125 0.203125q0.515625 0.203125 0.890625 0.59375q0.375 0.375 0.578125 0.9375q0.203125 0.5625 0.203125 1.28125q0 0.28125 -0.0625 0.375q-0.046875 0.09375 -0.21875 0.09375l-4.484375 0q0 0.640625 0.15625 1.125q0.171875 0.46875 0.453125 0.78125q0.28125 0.3125 0.65625 0.46875q0.390625 0.15625 0.875 0.15625q0.453125 0 0.765625 -0.09375q0.328125 -0.109375 0.5625 -0.21875q0.234375 -0.125 0.390625 -0.234375q0.15625 -0.109375 0.265625 -0.109375q0.140625 0 0.234375 0.125l0.328125 0.421875q-0.21875 0.265625 -0.53125 0.46875q-0.296875 0.203125 -0.65625 0.328125q-0.34375 0.125 -0.71875 0.1875q-0.375 0.0625 -0.734375 0.0625q-0.703125 0 -1.296875 -0.234375q-0.59375 -0.234375 -1.03125 -0.6875q-0.421875 -0.46875 -0.65625 -1.140625q-0.234375 -0.671875 -0.234375 -1.546875q0 -0.703125 0.203125 -1.3125q0.21875 -0.609375 0.625 -1.0625q0.40625 -0.453125 0.984375 -0.703125q0.59375 -0.265625 1.328125 -0.265625zm0.03125 0.875q-0.859375 0 -1.359375 0.5q-0.484375 0.5 -0.609375 1.375l3.671875 0q0 -0.421875 -0.109375 -0.765625q-0.109375 -0.34375 -0.328125 -0.59375q-0.21875 -0.25 -0.546875 -0.375q-0.3125 -0.140625 -0.71875 -0.140625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m18.737534 17.942257l124.06299 0l0 35.590553l-124.06299 0z" fill-rule="evenodd"/><path fill="#000000" d="m32.487534 36.44538q0 0.796875 -0.203125 1.4375q-0.1875 0.625 -0.578125 1.0625q-0.375 0.4375 -0.9375 0.671875q-0.5625 0.234375 -1.28125 0.234375q-0.65625 0 -1.34375 -0.1875q0 -0.1875 0.015625 -0.375q0.03125 -0.203125 0.046875 -0.390625q0.015625 -0.109375 0.078125 -0.171875q0.078125 -0.078125 0.21875 -0.078125q0.125 0 0.3125 0.0625q0.203125 0.0625 0.546875 0.0625q0.4375 0 0.78125 -0.125q0.34375 -0.140625 0.578125 -0.421875q0.234375 -0.28125 0.359375 -0.71875q0.125 -0.4375 0.125 -1.03125l0 -6.28125l1.28125 0l0 6.25zm7.1051636 3.296875l-0.53125 0q-0.171875 0 -0.28125 -0.046875q-0.109375 -0.0625 -0.140625 -0.234375l-0.140625 -0.625q-0.265625 0.234375 -0.515625 0.4375q-0.25 0.1875 -0.53125 0.3125q-0.28125 0.125 -0.59375 0.1875q-0.3125 0.078125 -0.703125 0.078125q-0.390625 0 -0.734375 -0.109375q-0.34375 -0.109375 -0.609375 -0.328125q-0.25 -0.21875 -0.40625 -0.546875q-0.140625 -0.34375 -0.140625 -0.8125q0 -0.390625 0.21875 -0.765625q0.21875 -0.375 0.703125 -0.65625q0.5 -0.296875 1.296875 -0.46875q0.796875 -0.1875 1.9375 -0.21875l0 -0.515625q0 -0.796875 -0.34375 -1.1875q-0.328125 -0.40625 -0.984375 -0.40625q-0.4375 0 -0.734375 0.109375q-0.296875 0.109375 -0.515625 0.25q-0.21875 0.125 -0.375 0.234375q-0.15625 0.109375 -0.3125 0.109375q-0.109375 0 -0.203125 -0.0625q-0.09375 -0.0625 -0.140625 -0.15625l-0.21875 -0.375q0.5625 -0.546875 1.203125 -0.8125q0.65625 -0.265625 1.4375 -0.265625q0.5625 0 1.0 0.1875q0.453125 0.1875 0.75 0.53125q0.296875 0.328125 0.453125 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.3125zm-3.078125 -0.71875q0.3125 0 0.5625 -0.0625q0.265625 -0.078125 0.484375 -0.1875q0.234375 -0.125 0.4375 -0.28125q0.21875 -0.171875 0.421875 -0.375l0 -1.40625q-0.828125 0.015625 -1.40625 0.125q-0.5625 0.09375 -0.921875 0.265625q-0.359375 0.171875 -0.53125 0.40625q-0.15625 0.21875 -0.15625 0.5q0 0.265625 0.078125 0.453125q0.09375 0.1875 0.234375 0.3125q0.15625 0.125 0.359375 0.1875q0.203125 0.0625 0.4375 0.0625zm4.8667145 0.71875l0 -6.75l0.703125 0q0.265625 0 0.328125 0.25l0.09375 0.734375q0.4375 -0.484375 0.984375 -0.78125q0.546875 -0.3125 1.25 -0.3125q0.5625 0 0.984375 0.1875q0.421875 0.1875 0.703125 0.53125q0.28125 0.328125 0.421875 0.796875q0.15625 0.46875 0.15625 1.046875l0 4.296875l-1.1875 0l0 -4.296875q0 -0.765625 -0.359375 -1.1875q-0.34375 -0.421875 -1.0625 -0.421875q-0.53125 0 -0.984375 0.25q-0.453125 0.25 -0.84375 0.6875l0 4.96875l-1.1875 0zm13.013977 -9.65625q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm7.8552856 0q0.609375 0 1.125 0.171875q0.515625 0.171875 0.875 0.5q0.375 0.3125 0.578125 0.765625q0.21875 0.453125 0.21875 1.015625q0 0.453125 -0.125 0.8125q-0.109375 0.34375 -0.328125 0.625q-0.21875 0.265625 -0.53125 0.453125q-0.296875 0.1875 -0.671875 0.296875q0.921875 0.25 1.390625 0.828125q0.46875 0.578125 0.46875 1.453125q0 0.65625 -0.25 1.1875q-0.25 0.515625 -0.6875 0.890625q-0.421875 0.375 -1.0 0.578125q-0.578125 0.1875 -1.234375 0.1875q-0.765625 0 -1.3125 -0.1875q-0.53125 -0.1875 -0.90625 -0.515625q-0.375 -0.34375 -0.609375 -0.796875q-0.234375 -0.46875 -0.40625 -1.0l0.5 -0.203125q0.140625 -0.0625 0.28125 -0.0625q0.140625 0 0.234375 0.0625q0.109375 0.046875 0.171875 0.171875q0 0.015625 0.015625 0.046875q0.015625 0.03125 0.03125 0.0625q0.09375 0.203125 0.21875 0.453125q0.140625 0.234375 0.359375 0.453125q0.234375 0.203125 0.5625 0.359375q0.34375 0.140625 0.84375 0.140625q0.5 0 0.875 -0.15625q0.375 -0.171875 0.625 -0.421875q0.25 -0.265625 0.375 -0.578125q0.125 -0.328125 0.125 -0.640625q0 -0.390625 -0.109375 -0.703125q-0.09375 -0.328125 -0.359375 -0.5625q-0.265625 -0.234375 -0.75 -0.359375q-0.46875 -0.140625 -1.21875 -0.140625l0 -0.859375q0.609375 0 1.03125 -0.125q0.4375 -0.125 0.703125 -0.34375q0.28125 -0.234375 0.390625 -0.53125q0.125 -0.3125 0.125 -0.6875q0 -0.40625 -0.125 -0.703125q-0.125 -0.3125 -0.359375 -0.515625q-0.21875 -0.203125 -0.53125 -0.296875q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.265625 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm10.177597 0q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm11.058411 4.890625q0 1.25 -0.265625 2.171875q-0.265625 0.90625 -0.734375 1.515625q-0.46875 0.59375 -1.109375 0.890625q-0.640625 0.28125 -1.359375 0.28125q-0.734375 0 -1.375 -0.28125q-0.625 -0.296875 -1.09375 -0.890625q-0.453125 -0.609375 -0.71875 -1.515625q-0.265625 -0.921875 -0.265625 -2.171875q0 -1.265625 0.265625 -2.171875q0.265625 -0.921875 0.71875 -1.515625q0.46875 -0.609375 1.09375 -0.90625q0.640625 -0.296875 1.375 -0.296875q0.71875 0 1.359375 0.296875q0.640625 0.296875 1.109375 0.90625q0.46875 0.59375 0.734375 1.515625q0.265625 0.90625 0.265625 2.171875zm-1.234375 0q0 -1.09375 -0.1875 -1.828125q-0.171875 -0.75 -0.484375 -1.203125q-0.3125 -0.453125 -0.71875 -0.65625q-0.40625 -0.203125 -0.84375 -0.203125q-0.4375 0 -0.84375 0.203125q-0.40625 0.203125 -0.71875 0.65625q-0.296875 0.453125 -0.484375 1.203125q-0.1875 0.734375 -0.1875 1.828125q0 1.09375 0.1875 1.828125q0.1875 0.734375 0.484375 1.1875q0.3125 0.453125 0.71875 0.65625q0.40625 0.1875 0.84375 0.1875q0.4375 0 0.84375 -0.1875q0.40625 -0.203125 0.71875 -0.65625q0.3125 -0.453125 0.484375 -1.1875q0.1875 -0.734375 0.1875 -1.828125zm5.6365356 -4.890625q0.609375 0 1.140625 0.1875q0.53125 0.171875 0.90625 0.515625q0.390625 0.34375 0.609375 0.84375q0.21875 0.484375 0.21875 1.109375q0 0.53125 -0.171875 0.984375q-0.15625 0.453125 -0.4375 0.875q-0.265625 0.421875 -0.625 0.8125q-0.34375 0.390625 -0.75 0.796875l-2.515625 2.5625q0.265625 -0.078125 0.53125 -0.109375q0.28125 -0.046875 0.53125 -0.046875l3.203125 0q0.203125 0 0.3125 0.109375q0.109375 0.109375 0.109375 0.296875l0 0.71875l-6.375 0l0 -0.40625q0 -0.125 0.046875 -0.25q0.0625 -0.140625 0.171875 -0.25l3.0625 -3.078125q0.375 -0.390625 0.6875 -0.734375q0.3125 -0.359375 0.53125 -0.71875q0.234375 -0.359375 0.34375 -0.734375q0.125 -0.375 0.125 -0.796875q0 -0.421875 -0.140625 -0.734375q-0.125 -0.3125 -0.359375 -0.515625q-0.234375 -0.21875 -0.546875 -0.3125q-0.3125 -0.109375 -0.671875 -0.109375q-0.359375 0 -0.671875 0.109375q-0.296875 0.109375 -0.53125 0.296875q-0.234375 0.1875 -0.40625 0.453125q-0.15625 0.25 -0.234375 0.578125q-0.046875 0.1875 -0.15625 0.28125q-0.109375 0.078125 -0.28125 0.078125q-0.03125 0 -0.078125 0q-0.03125 0 -0.078125 -0.015625l-0.609375 -0.109375q0.09375 -0.640625 0.359375 -1.140625q0.265625 -0.515625 0.671875 -0.84375q0.40625 -0.34375 0.9375 -0.515625q0.53125 -0.1875 1.140625 -0.1875zm9.745911 6.21875l1.453125 0l0 0.671875q0 0.109375 -0.0625 0.1875q-0.0625 0.0625 -0.203125 0.0625l-1.1875 0l0 2.515625l-1.046875 0l0 -2.515625l-4.234375 0q-0.125 0 -0.234375 -0.078125q-0.09375 -0.078125 -0.109375 -0.1875l-0.125 -0.609375l4.640625 -6.15625l1.109375 0l0 6.109375zm-1.046875 -3.953125q0 -0.171875 0 -0.359375q0.015625 -0.203125 0.0625 -0.421875l-3.484375 4.734375l3.421875 0l0 -3.953125z" fill-rule="nonzero"/></g></svg> \ No newline at end of file From 8174727b3afca494d7c0ececdcb090521ae3d33c Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 23 Jan 2024 20:33:49 -0500 Subject: [PATCH 058/105] gopls/internal/test: await quiescence in TestInconsistentVendoring TestInconsistentVendoring was awaiting only the initial workspace load before capturing diagnostics and running their code action. But opening a/a1.go also triggers diagnostics. This can cause the file lock failures observed in golang/go#64229. To fix this, wait for the change (the didOpen) to be fully processed. Fixes golang/go#64229 Change-Id: I747ea22db02b8def4bf7764714db7f901891792d Reviewed-on: https://go-review.googlesource.com/c/tools/+/558076 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/internal/test/integration/misc/vendor_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gopls/internal/test/integration/misc/vendor_test.go b/gopls/internal/test/integration/misc/vendor_test.go index af174bf00b1..f3bed9082b7 100644 --- a/gopls/internal/test/integration/misc/vendor_test.go +++ b/gopls/internal/test/integration/misc/vendor_test.go @@ -51,8 +51,7 @@ func _() { ).Run(t, pkgThatUsesVendoring, func(t *testing.T, env *Env) { env.OpenFile("a/a1.go") d := &protocol.PublishDiagnosticsParams{} - env.OnceMet( - InitialWorkspaceLoad, + env.AfterChange( Diagnostics(env.AtRegexp("go.mod", "module mod.com"), WithMessage("Inconsistent vendoring")), ReadDiagnostics("go.mod", d), ) From 35d8b1b59772582d828616abb0e634ddcec2d119 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 24 Jan 2024 12:59:01 -0500 Subject: [PATCH 059/105] gopls/internal/golang: don't bug.Report repaired ASTs in hover Updates golang/go#64241 Change-Id: If799f3454f628421f03f055eb003442bb90fe656 Reviewed-on: https://go-review.googlesource.com/c/tools/+/558255 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/golang/hover.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index c4f051b44ba..45421704599 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -200,7 +200,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro if err != nil { return protocol.Range{}, nil, fmt.Errorf("re-parsing declaration of %s: %v", obj.Name(), err) } - decl, spec, field := findDeclInfo([]*ast.File{declPGF.File}, declPos) + decl, spec, field := findDeclInfo([]*ast.File{declPGF.File}, declPos) // may be nil^3 comment := chooseDocComment(decl, spec, field) docText := comment.Text() @@ -219,19 +219,22 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro // objectString is insufficient: // (1) large structs are formatted poorly, with no newlines // (2) we lose inline comments - // // Furthermore, we include a summary of their method set. - // - // TODO(rfindley): this should use FormatVarType to get proper qualification - // of identifiers, and we should revisit the formatting of method set. - // - // TODO(adonovan): this logic belongs in objectString. _, isTypeName := obj.(*types.TypeName) _, isTypeParam := obj.Type().(*types.TypeParam) if isTypeName && !isTypeParam { spec, ok := spec.(*ast.TypeSpec) if !ok { - return protocol.Range{}, nil, bug.Errorf("type name %q without type spec", obj.Name()) + // We cannot find a TypeSpec for this type or alias declaration + // (that is not a type parameter or a built-in). + // This should be impossible even for ill-formed trees; + // we suspect that AST repair may be creating inconsistent + // positions. Don't report a bug in that case. (#64241) + errorf := fmt.Errorf + if !declPGF.Fixed() { + errorf = bug.Errorf + } + return protocol.Range{}, nil, errorf("type name %q without type spec", obj.Name()) } spec2 := *spec // Don't duplicate comments when formatting type specs. From 3d49bd525a5d2ca9549ad8c3e138b982a6d7821e Mon Sep 17 00:00:00 2001 From: Suzy Mueller <suzmue@golang.org> Date: Thu, 18 Jan 2024 09:46:27 -0700 Subject: [PATCH 060/105] internal/lsp: publish protocol.UnmarshalJSON Missing or null arguments can be expressed in a variety of ways, so provide a helper function to consolidate the necessary checks. Change-Id: I595f71a6485d84883667f3c6adf5a87c41fbd6aa Reviewed-on: https://go-review.googlesource.com/c/tools/+/556695 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/diagnostics.go | 15 +-- gopls/internal/protocol/generate/output.go | 2 +- gopls/internal/protocol/protocol.go | 16 +-- gopls/internal/protocol/tsclient.go | 26 ++-- gopls/internal/protocol/tsserver.go | 142 ++++++++++----------- gopls/internal/server/code_action.go | 13 +- 6 files changed, 103 insertions(+), 111 deletions(-) diff --git a/gopls/internal/cache/diagnostics.go b/gopls/internal/cache/diagnostics.go index ed4d21ac3ee..5489b5645b6 100644 --- a/gopls/internal/cache/diagnostics.go +++ b/gopls/internal/cache/diagnostics.go @@ -164,16 +164,13 @@ func bundleQuickFixes(sd *Diagnostic) bool { // BundledQuickFixes extracts any bundled codeActions from the // diag.Data field. func BundledQuickFixes(diag protocol.Diagnostic) []protocol.CodeAction { - // Clients may express "no fixes" in a variety of ways (#64503). - if diag.Data == nil || - len(*diag.Data) == 0 || - len(*diag.Data) == 4 && string(*diag.Data) == "null" { - return nil - } var fix quickFixesJSON - if err := json.Unmarshal(*diag.Data, &fix); err != nil { - bug.Reportf("unmarshalling quick fix: %v", err) - return nil + if diag.Data != nil { + err := protocol.UnmarshalJSON(*diag.Data, &fix) + if err != nil { + bug.Reportf("unmarshalling quick fix: %v", err) + return nil + } } var actions []protocol.CodeAction diff --git a/gopls/internal/protocol/generate/output.go b/gopls/internal/protocol/generate/output.go index 18fc85c01d9..fc64677ff8e 100644 --- a/gopls/internal/protocol/generate/output.go +++ b/gopls/internal/protocol/generate/output.go @@ -101,7 +101,7 @@ func genCase(method string, param, result *Type, dir string) { nm = "ParamConfiguration" // gopls compatibility } fmt.Fprintf(out, "\t\tvar params %s\n", nm) - fmt.Fprintf(out, "\t\tif err := unmarshalParams(r.Params(), ¶ms); err != nil {\n") + fmt.Fprintf(out, "\t\tif err := UnmarshalJSON(r.Params(), ¶ms); err != nil {\n") fmt.Fprintf(out, "\t\t\treturn true, sendParseError(ctx, reply, err)\n\t\t}\n") p = ", ¶ms" } diff --git a/gopls/internal/protocol/protocol.go b/gopls/internal/protocol/protocol.go index 3ece42b7a11..76a932bf850 100644 --- a/gopls/internal/protocol/protocol.go +++ b/gopls/internal/protocol/protocol.go @@ -241,7 +241,7 @@ func CancelHandler(handler jsonrpc2.Handler) jsonrpc2.Handler { return handler(ctx, replyWithDetachedContext, req) } var params CancelParams - if err := unmarshalParams(req.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(req.Params(), ¶ms); err != nil { return sendParseError(ctx, reply, err) } if n, ok := params.ID.(float64); ok { @@ -271,16 +271,14 @@ func cancelCall(ctx context.Context, sender connSender, id jsonrpc2.ID) { sender.Notify(ctx, "$/cancelRequest", &CancelParams{ID: &id}) } -// unmarshalParams unmarshals msg into the variable pointed to by -// params. In JSONRPC, request.params is optional, so msg may may be +// UnmarshalJSON unmarshals msg into the variable pointed to by +// params. In JSONRPC, optional messages may be // "null", in which case it is a no-op. -func unmarshalParams(msg json.RawMessage, params any) error { - if len(msg) > 0 && !bytes.Equal(msg, []byte("null")) { - if err := json.Unmarshal(msg, params); err != nil { - return err - } +func UnmarshalJSON(msg json.RawMessage, v any) error { + if len(msg) == 0 || bytes.Equal(msg, []byte("null")) { + return nil } - return nil + return json.Unmarshal(msg, v) } func sendParseError(ctx context.Context, reply jsonrpc2.Replier, err error) error { diff --git a/gopls/internal/protocol/tsclient.go b/gopls/internal/protocol/tsclient.go index 6ea20f036ee..b581a2cfe16 100644 --- a/gopls/internal/protocol/tsclient.go +++ b/gopls/internal/protocol/tsclient.go @@ -50,7 +50,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, switch r.Method() { case "$/logTrace": var params LogTraceParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.LogTrace(ctx, ¶ms) @@ -58,7 +58,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "$/progress": var params ProgressParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.Progress(ctx, ¶ms) @@ -66,7 +66,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "client/registerCapability": var params RegistrationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.RegisterCapability(ctx, ¶ms) @@ -74,7 +74,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "client/unregisterCapability": var params UnregistrationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.UnregisterCapability(ctx, ¶ms) @@ -82,7 +82,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "telemetry/event": var params interface{} - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.Event(ctx, ¶ms) @@ -90,7 +90,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "textDocument/publishDiagnostics": var params PublishDiagnosticsParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.PublishDiagnostics(ctx, ¶ms) @@ -98,7 +98,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "window/logMessage": var params LogMessageParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.LogMessage(ctx, ¶ms) @@ -106,7 +106,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "window/showDocument": var params ShowDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := client.ShowDocument(ctx, ¶ms) @@ -117,7 +117,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "window/showMessage": var params ShowMessageParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.ShowMessage(ctx, ¶ms) @@ -125,7 +125,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "window/showMessageRequest": var params ShowMessageRequestParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := client.ShowMessageRequest(ctx, ¶ms) @@ -136,7 +136,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "window/workDoneProgress/create": var params WorkDoneProgressCreateParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := client.WorkDoneProgressCreate(ctx, ¶ms) @@ -144,7 +144,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "workspace/applyEdit": var params ApplyWorkspaceEditParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := client.ApplyEdit(ctx, ¶ms) @@ -159,7 +159,7 @@ func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, case "workspace/configuration": var params ParamConfiguration - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := client.Configuration(ctx, ¶ms) diff --git a/gopls/internal/protocol/tsserver.go b/gopls/internal/protocol/tsserver.go index a9282768e66..01511552c14 100644 --- a/gopls/internal/protocol/tsserver.go +++ b/gopls/internal/protocol/tsserver.go @@ -104,7 +104,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, switch r.Method() { case "$/progress": var params ProgressParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.Progress(ctx, ¶ms) @@ -112,7 +112,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "$/setTrace": var params SetTraceParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.SetTrace(ctx, ¶ms) @@ -120,7 +120,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "callHierarchy/incomingCalls": var params CallHierarchyIncomingCallsParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.IncomingCalls(ctx, ¶ms) @@ -131,7 +131,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "callHierarchy/outgoingCalls": var params CallHierarchyOutgoingCallsParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.OutgoingCalls(ctx, ¶ms) @@ -142,7 +142,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "codeAction/resolve": var params CodeAction - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ResolveCodeAction(ctx, ¶ms) @@ -153,7 +153,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "codeLens/resolve": var params CodeLens - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ResolveCodeLens(ctx, ¶ms) @@ -164,7 +164,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "completionItem/resolve": var params CompletionItem - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ResolveCompletionItem(ctx, ¶ms) @@ -175,7 +175,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "documentLink/resolve": var params DocumentLink - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ResolveDocumentLink(ctx, ¶ms) @@ -190,7 +190,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "initialize": var params ParamInitialize - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Initialize(ctx, ¶ms) @@ -201,7 +201,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "initialized": var params InitializedParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.Initialized(ctx, ¶ms) @@ -209,7 +209,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "inlayHint/resolve": var params InlayHint - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Resolve(ctx, ¶ms) @@ -220,7 +220,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "notebookDocument/didChange": var params DidChangeNotebookDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidChangeNotebookDocument(ctx, ¶ms) @@ -228,7 +228,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "notebookDocument/didClose": var params DidCloseNotebookDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidCloseNotebookDocument(ctx, ¶ms) @@ -236,7 +236,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "notebookDocument/didOpen": var params DidOpenNotebookDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidOpenNotebookDocument(ctx, ¶ms) @@ -244,7 +244,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "notebookDocument/didSave": var params DidSaveNotebookDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidSaveNotebookDocument(ctx, ¶ms) @@ -256,7 +256,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/codeAction": var params CodeActionParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.CodeAction(ctx, ¶ms) @@ -267,7 +267,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/codeLens": var params CodeLensParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.CodeLens(ctx, ¶ms) @@ -278,7 +278,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/colorPresentation": var params ColorPresentationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ColorPresentation(ctx, ¶ms) @@ -289,7 +289,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/completion": var params CompletionParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Completion(ctx, ¶ms) @@ -300,7 +300,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/declaration": var params DeclarationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Declaration(ctx, ¶ms) @@ -311,7 +311,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/definition": var params DefinitionParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Definition(ctx, ¶ms) @@ -322,7 +322,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/diagnostic": var params string - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Diagnostic(ctx, ¶ms) @@ -333,7 +333,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/didChange": var params DidChangeTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidChange(ctx, ¶ms) @@ -341,7 +341,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/didClose": var params DidCloseTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidClose(ctx, ¶ms) @@ -349,7 +349,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/didOpen": var params DidOpenTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidOpen(ctx, ¶ms) @@ -357,7 +357,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/didSave": var params DidSaveTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidSave(ctx, ¶ms) @@ -365,7 +365,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/documentColor": var params DocumentColorParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.DocumentColor(ctx, ¶ms) @@ -376,7 +376,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/documentHighlight": var params DocumentHighlightParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.DocumentHighlight(ctx, ¶ms) @@ -387,7 +387,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/documentLink": var params DocumentLinkParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.DocumentLink(ctx, ¶ms) @@ -398,7 +398,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/documentSymbol": var params DocumentSymbolParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.DocumentSymbol(ctx, ¶ms) @@ -409,7 +409,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/foldingRange": var params FoldingRangeParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.FoldingRange(ctx, ¶ms) @@ -420,7 +420,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/formatting": var params DocumentFormattingParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Formatting(ctx, ¶ms) @@ -431,7 +431,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/hover": var params HoverParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Hover(ctx, ¶ms) @@ -442,7 +442,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/implementation": var params ImplementationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Implementation(ctx, ¶ms) @@ -453,7 +453,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/inlayHint": var params InlayHintParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.InlayHint(ctx, ¶ms) @@ -464,7 +464,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/inlineCompletion": var params InlineCompletionParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.InlineCompletion(ctx, ¶ms) @@ -475,7 +475,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/inlineValue": var params InlineValueParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.InlineValue(ctx, ¶ms) @@ -486,7 +486,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/linkedEditingRange": var params LinkedEditingRangeParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.LinkedEditingRange(ctx, ¶ms) @@ -497,7 +497,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/moniker": var params MonikerParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Moniker(ctx, ¶ms) @@ -508,7 +508,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/onTypeFormatting": var params DocumentOnTypeFormattingParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.OnTypeFormatting(ctx, ¶ms) @@ -519,7 +519,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/prepareCallHierarchy": var params CallHierarchyPrepareParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.PrepareCallHierarchy(ctx, ¶ms) @@ -530,7 +530,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/prepareRename": var params PrepareRenameParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.PrepareRename(ctx, ¶ms) @@ -541,7 +541,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/prepareTypeHierarchy": var params TypeHierarchyPrepareParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.PrepareTypeHierarchy(ctx, ¶ms) @@ -552,7 +552,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/rangeFormatting": var params DocumentRangeFormattingParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.RangeFormatting(ctx, ¶ms) @@ -563,7 +563,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/rangesFormatting": var params DocumentRangesFormattingParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.RangesFormatting(ctx, ¶ms) @@ -574,7 +574,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/references": var params ReferenceParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.References(ctx, ¶ms) @@ -585,7 +585,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/rename": var params RenameParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Rename(ctx, ¶ms) @@ -596,7 +596,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/selectionRange": var params SelectionRangeParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.SelectionRange(ctx, ¶ms) @@ -607,7 +607,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/semanticTokens/full": var params SemanticTokensParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.SemanticTokensFull(ctx, ¶ms) @@ -618,7 +618,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/semanticTokens/full/delta": var params SemanticTokensDeltaParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.SemanticTokensFullDelta(ctx, ¶ms) @@ -629,7 +629,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/semanticTokens/range": var params SemanticTokensRangeParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.SemanticTokensRange(ctx, ¶ms) @@ -640,7 +640,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/signatureHelp": var params SignatureHelpParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.SignatureHelp(ctx, ¶ms) @@ -651,7 +651,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/typeDefinition": var params TypeDefinitionParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.TypeDefinition(ctx, ¶ms) @@ -662,7 +662,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/willSave": var params WillSaveTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.WillSave(ctx, ¶ms) @@ -670,7 +670,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "textDocument/willSaveWaitUntil": var params WillSaveTextDocumentParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.WillSaveWaitUntil(ctx, ¶ms) @@ -681,7 +681,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "typeHierarchy/subtypes": var params TypeHierarchySubtypesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Subtypes(ctx, ¶ms) @@ -692,7 +692,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "typeHierarchy/supertypes": var params TypeHierarchySupertypesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Supertypes(ctx, ¶ms) @@ -703,7 +703,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "window/workDoneProgress/cancel": var params WorkDoneProgressCancelParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.WorkDoneProgressCancel(ctx, ¶ms) @@ -711,7 +711,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/diagnostic": var params WorkspaceDiagnosticParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.DiagnosticWorkspace(ctx, ¶ms) @@ -722,7 +722,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didChangeConfiguration": var params DidChangeConfigurationParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidChangeConfiguration(ctx, ¶ms) @@ -730,7 +730,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didChangeWatchedFiles": var params DidChangeWatchedFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidChangeWatchedFiles(ctx, ¶ms) @@ -738,7 +738,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didChangeWorkspaceFolders": var params DidChangeWorkspaceFoldersParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidChangeWorkspaceFolders(ctx, ¶ms) @@ -746,7 +746,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didCreateFiles": var params CreateFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidCreateFiles(ctx, ¶ms) @@ -754,7 +754,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didDeleteFiles": var params DeleteFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidDeleteFiles(ctx, ¶ms) @@ -762,7 +762,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/didRenameFiles": var params RenameFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } err := server.DidRenameFiles(ctx, ¶ms) @@ -770,7 +770,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/executeCommand": var params ExecuteCommandParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ExecuteCommand(ctx, ¶ms) @@ -781,7 +781,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/symbol": var params WorkspaceSymbolParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.Symbol(ctx, ¶ms) @@ -792,7 +792,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/willCreateFiles": var params CreateFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.WillCreateFiles(ctx, ¶ms) @@ -803,7 +803,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/willDeleteFiles": var params DeleteFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.WillDeleteFiles(ctx, ¶ms) @@ -814,7 +814,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspace/willRenameFiles": var params RenameFilesParams - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.WillRenameFiles(ctx, ¶ms) @@ -825,7 +825,7 @@ func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, case "workspaceSymbol/resolve": var params WorkspaceSymbol - if err := unmarshalParams(r.Params(), ¶ms); err != nil { + if err := UnmarshalJSON(r.Params(), ¶ms); err != nil { return true, sendParseError(ctx, reply, err) } resp, err := server.ResolveWorkspaceSymbol(ctx, ¶ms) diff --git a/gopls/internal/server/code_action.go b/gopls/internal/server/code_action.go index 3346ce259f6..b26f9780c60 100644 --- a/gopls/internal/server/code_action.go +++ b/gopls/internal/server/code_action.go @@ -5,9 +5,7 @@ package server import ( - "bytes" "context" - "encoding/json" "fmt" "sort" "strings" @@ -144,14 +142,13 @@ func (s *server) ResolveCodeAction(ctx context.Context, ca *protocol.CodeAction) defer done() // Only resolve the code action if there is Data provided. - // TODO(suzmue): publish protocol.unmarshalParams as protocol.UnmarshalJSON - // and use it consistently where we need to unmarshal to handle all null checks. - if ca.Data != nil && len(*ca.Data) != 0 && !bytes.Equal(*ca.Data, []byte("null")) { - var cmd protocol.Command - if err := json.Unmarshal(*ca.Data, &cmd); err != nil { + var cmd protocol.Command + if ca.Data != nil { + if err := protocol.UnmarshalJSON(*ca.Data, &cmd); err != nil { return nil, err } - + } + if cmd.Command != "" { params := &protocol.ExecuteCommandParams{ Command: cmd.Command, Arguments: cmd.Arguments, From dd0f88f021cdeb061d3c7e9832bd535099ca34cc Mon Sep 17 00:00:00 2001 From: Michael Stapelberg <stapelberg@golang.org> Date: Wed, 3 Jan 2024 12:33:06 +0100 Subject: [PATCH 061/105] gopls/doc/emacs.md: explain how to organize imports automatically This is now possible as the linked issues have been fixed. Change-Id: Icf1b6c2f00efac65db79a4cdcb2062e30d5960b3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/553575 Reviewed-by: Bryan Mills <bcmills@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Michael Stapelberg <stapelberg@google.com> --- gopls/doc/emacs.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gopls/doc/emacs.md b/gopls/doc/emacs.md index 486f49325cb..8a54cf19d0a 100644 --- a/gopls/doc/emacs.md +++ b/gopls/doc/emacs.md @@ -144,12 +144,14 @@ code action, which you can invoke as needed by running `M-x eglot-code-actions` (or a key of your choice bound to the `eglot-code-actions` function) and selecting `Organize Imports` at the prompt. -Eglot does not currently support a standalone function to execute a specific -code action (see -[joaotavora/eglot#411](https://github.com/joaotavora/eglot/issues/411)), nor an -option to organize imports as a `before-save-hook` (see -[joaotavora/eglot#574](https://github.com/joaotavora/eglot/issues/574)). In the -meantime, see those issues for discussion and possible workarounds. +To automatically organize imports before saving, add a hook: + +```elisp +(add-hook 'before-save-hook + (lambda () + (call-interactively 'eglot-code-action-organize-imports)) + nil t) +``` ## Troubleshooting From 5e16437258ae14813b49da188b0460efd8055cf3 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 11:11:11 -0500 Subject: [PATCH 062/105] gopls/internal/cache: skip TestZeroConfigAlgorithm on wasm Add testenv.NeedsExec to this test, since it must be able to run the Go command. Also fix the test error message. Fixes golang/go#65271 Change-Id: I525c5fd59cab7e057ab765eb41f2a84a7dd03635 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559155 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Bryan Mills <bcmills@google.com> --- gopls/internal/cache/session_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gopls/internal/cache/session_test.go b/gopls/internal/cache/session_test.go index e71340a8591..cc6f664060a 100644 --- a/gopls/internal/cache/session_test.go +++ b/gopls/internal/cache/session_test.go @@ -15,9 +15,12 @@ import ( "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/test/integration/fake" + "golang.org/x/tools/internal/testenv" ) func TestZeroConfigAlgorithm(t *testing.T) { + testenv.NeedsExec(t) // executes the Go command + type viewSummary struct { // fields exported for cmp.Diff Type ViewType @@ -250,7 +253,7 @@ func TestZeroConfigAlgorithm(t *testing.T) { } env, err := FetchGoEnv(ctx, toURI(f.dir), opts) if err != nil { - t.Fatalf("fetching env: %v", env) + t.Fatalf("FetchGoEnv failed: %v", err) } folders = append(folders, &Folder{ Dir: toURI(f.dir), From 14d7f7b659766e4ea48dfa832603e9904930c8fd Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 12:18:26 -0500 Subject: [PATCH 063/105] gopls/internal/cache: memoize the view filter func Now that options are immutable on the view, we can safely memoize the view's directory filter function. Do this, which fixes the regression in BenchmarkReload observed in golang/go#64724. For golang/go#64724 Change-Id: Iaf8c2d5e69e68e0077f07a72026ef46c0e19bcc0 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559157 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/snapshot.go | 8 +++--- gopls/internal/cache/view.go | 47 ++++++++++++++++---------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/gopls/internal/cache/snapshot.go b/gopls/internal/cache/snapshot.go index a375a580543..3eb87415ad5 100644 --- a/gopls/internal/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -28,14 +28,14 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/tools/go/packages" "golang.org/x/tools/go/types/objectpath" - "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/methodsets" "golang.org/x/tools/gopls/internal/cache/typerefs" "golang.org/x/tools/gopls/internal/cache/xrefs" - "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/constraints" @@ -577,7 +577,7 @@ func (s *Snapshot) goCommandInvocation(ctx context.Context, flags InvocationFlag // TODO(rfindley): in the case of go.work mode, modURI is empty and we fall // back on the default behavior of vendorEnabled with an empty modURI. Figure // out what is correct here and implement it explicitly. - vendorEnabled, err := s.vendorEnabled(ctx, modURI, modContent) + vendorEnabled, err := s.vendorEnabled(modURI, modContent) if err != nil { return "", nil, cleanup, err } diff --git a/gopls/internal/cache/view.go b/gopls/internal/cache/view.go index 07092b2988d..1c425ac97ea 100644 --- a/gopls/internal/cache/view.go +++ b/gopls/internal/cache/view.go @@ -27,8 +27,8 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/semver" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/maps" @@ -125,6 +125,10 @@ type View struct { // initialization of snapshots. Do not change it without adjusting snapshot // accordingly. initializationSema chan struct{} + + // Document filters are constructed once, in View.filterFunc. + filterFuncOnce sync.Once + _filterFunc func(protocol.DocumentURI) bool // only accessed by View.filterFunc } // definition implements the viewDefiner interface. @@ -494,19 +498,26 @@ func (s *Snapshot) locateTemplateFiles(ctx context.Context) { // filterFunc returns a func that reports whether uri is filtered by the currently configured // directoryFilters. -// -// TODO(rfindley): memoize this func or filterer, as it is invariant on the -// view. func (v *View) filterFunc() func(protocol.DocumentURI) bool { - folderDir := v.folder.Dir.Path() - filterer := buildFilterer(folderDir, v.folder.Env.GOMODCACHE, v.folder.Options.DirectoryFilters) - return func(uri protocol.DocumentURI) bool { - // Only filter relative to the configured root directory. - if pathutil.InDir(folderDir, uri.Path()) { - return relPathExcludedByFilter(strings.TrimPrefix(uri.Path(), folderDir), filterer) + v.filterFuncOnce.Do(func() { + folderDir := v.folder.Dir.Path() + gomodcache := v.folder.Env.GOMODCACHE + var filters []string + filters = append(filters, v.folder.Options.DirectoryFilters...) + if pref := strings.TrimPrefix(gomodcache, folderDir); pref != gomodcache { + modcacheFilter := "-" + strings.TrimPrefix(filepath.ToSlash(pref), "/") + filters = append(filters, modcacheFilter) } - return false - } + filterer := NewFilterer(filters) + v._filterFunc = func(uri protocol.DocumentURI) bool { + // Only filter relative to the configured root directory. + if pathutil.InDir(folderDir, uri.Path()) { + return relPathExcludedByFilter(strings.TrimPrefix(uri.Path(), folderDir), filterer) + } + return false + } + }) + return v._filterFunc } // shutdown releases resources associated with the view. @@ -1296,7 +1307,7 @@ var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`) // cannot delete it. // // TODO(rfindley): move this to snapshot.go. -func (s *Snapshot) vendorEnabled(ctx context.Context, modURI protocol.DocumentURI, modContent []byte) (bool, error) { +func (s *Snapshot) vendorEnabled(modURI protocol.DocumentURI, modContent []byte) (bool, error) { // Legacy GOPATH workspace? if len(s.view.workspaceModFiles) == 0 { return false, nil @@ -1347,13 +1358,3 @@ func relPathExcludedByFilter(path string, filterer *Filterer) bool { path = strings.TrimPrefix(filepath.ToSlash(path), "/") return filterer.Disallow(path) } - -func buildFilterer(folder, gomodcache string, directoryFilters []string) *Filterer { - var filters []string - filters = append(filters, directoryFilters...) - if pref := strings.TrimPrefix(gomodcache, folder); pref != gomodcache { - modcacheFilter := "-" + strings.TrimPrefix(filepath.ToSlash(pref), "/") - filters = append(filters, modcacheFilter) - } - return NewFilterer(filters) -} From b048cf12662a20601b0bb382ada42376f2487361 Mon Sep 17 00:00:00 2001 From: Quim Muntal <quimmuntal@gmail.com> Date: Mon, 29 Jan 2024 15:49:27 +0000 Subject: [PATCH 064/105] cmd/callgraph: unskip TestCallgraph on windows/arm64 This reverts commit 7d125fe075589e424e53f8a3ad9bd6e1010db27e. Windows/arm64 builders have been migrated to Azure using Windows ARM64 hosts instead of qemu + Mac. Let's see if the issue still reproduces. Change-Id: I2c55812c9eb9710ac2849e65987f55baf7766b13 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559115 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> --- cmd/callgraph/main_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmd/callgraph/main_test.go b/cmd/callgraph/main_test.go index afcb7a967df..ce634139e68 100644 --- a/cmd/callgraph/main_test.go +++ b/cmd/callgraph/main_test.go @@ -15,7 +15,6 @@ import ( "log" "os" "path/filepath" - "runtime" "strings" "testing" @@ -35,10 +34,6 @@ func init() { } func TestCallgraph(t *testing.T) { - if runtime.GOOS == "windows" && runtime.GOARCH == "arm64" { - t.Skipf("skipping due to suspected file corruption bug on windows/arm64 (https://go.dev/issue/50706)") - } - testenv.NeedsTool(t, "go") gopath, err := filepath.Abs("testdata") From 341c0434d3c3778e48614f82c2995a1352a2b297 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 15:55:17 -0500 Subject: [PATCH 065/105] gopls/internal/test/integration/bench: fix broken benchmarks Fix benchmarks that were inadvertently broken by find-and-replace refactoring associated with the file move of CL 557718. Benchmarks run at a fixed commit, so their test data need not change when the tools repository is refactored. Change-Id: I24b9bcc0e36e8da072113093d21a80e634ef9fc9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559160 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/test/integration/bench/completion_test.go | 4 ++-- gopls/internal/test/integration/bench/definition_test.go | 2 +- gopls/internal/test/integration/bench/didchange_test.go | 2 +- gopls/internal/test/integration/bench/hover_test.go | 2 +- gopls/internal/test/integration/bench/iwl_test.go | 2 +- gopls/internal/test/integration/bench/rename_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gopls/internal/test/integration/bench/completion_test.go b/gopls/internal/test/integration/bench/completion_test.go index 12f5aba0c5b..b7a138d98c4 100644 --- a/gopls/internal/test/integration/bench/completion_test.go +++ b/gopls/internal/test/integration/bench/completion_test.go @@ -75,7 +75,7 @@ func endRangeInBuffer(env *Env, name string) protocol.Range { // Benchmark struct completion in tools codebase. func BenchmarkStructCompletion(b *testing.B) { - file := "internal/cache/session.go" + file := "internal/lsp/cache/session.go" setup := func(env *Env) { env.OpenFile(file) @@ -104,7 +104,7 @@ func BenchmarkImportCompletion(b *testing.B) { // Benchmark slice completion in tools codebase. func BenchmarkSliceCompletion(b *testing.B) { - file := "internal/cache/session.go" + file := "internal/lsp/cache/session.go" setup := func(env *Env) { env.OpenFile(file) diff --git a/gopls/internal/test/integration/bench/definition_test.go b/gopls/internal/test/integration/bench/definition_test.go index 33276e8f966..b703378a27b 100644 --- a/gopls/internal/test/integration/bench/definition_test.go +++ b/gopls/internal/test/integration/bench/definition_test.go @@ -20,7 +20,7 @@ func BenchmarkDefinition(b *testing.B) { {"kuma", "api/generic/insights.go", `proto\.(Message)`}, {"pkgsite", "internal/log/log.go", `derrors\.(Wrap)`}, {"starlark", "starlark/eval.go", "prog.compiled.(Encode)"}, - {"tools", "internal/cache/check.go", `(snapshot)\) buildKey`}, + {"tools", "internal/lsp/cache/check.go", `(snapshot)\) buildKey`}, } for _, test := range tests { diff --git a/gopls/internal/test/integration/bench/didchange_test.go b/gopls/internal/test/integration/bench/didchange_test.go index 85cbd18b04c..22e7ca2a11b 100644 --- a/gopls/internal/test/integration/bench/didchange_test.go +++ b/gopls/internal/test/integration/bench/didchange_test.go @@ -33,7 +33,7 @@ var didChangeTests = []changeTest{ {"oracle", "dataintegration/data_type.go", false}, // diagnoseSave fails because this package is generated {"pkgsite", "internal/frontend/server.go", true}, {"starlark", "starlark/eval.go", true}, - {"tools", "internal/cache/snapshot.go", true}, + {"tools", "internal/lsp/cache/snapshot.go", true}, } // BenchmarkDidChange benchmarks modifications of a single file by making diff --git a/gopls/internal/test/integration/bench/hover_test.go b/gopls/internal/test/integration/bench/hover_test.go index 0b8e8a81a83..c3b0c6bc0cb 100644 --- a/gopls/internal/test/integration/bench/hover_test.go +++ b/gopls/internal/test/integration/bench/hover_test.go @@ -20,7 +20,7 @@ func BenchmarkHover(b *testing.B) { {"kuma", "api/generic/insights.go", `proto\.(Message)`}, {"pkgsite", "internal/log/log.go", `derrors\.(Wrap)`}, {"starlark", "starlark/eval.go", "prog.compiled.(Encode)"}, - {"tools", "internal/cache/check.go", `(snapshot)\) buildKey`}, + {"tools", "internal/lsp/cache/check.go", `(snapshot)\) buildKey`}, } for _, test := range tests { diff --git a/gopls/internal/test/integration/bench/iwl_test.go b/gopls/internal/test/integration/bench/iwl_test.go index e7f798f1636..48ddbeaecc0 100644 --- a/gopls/internal/test/integration/bench/iwl_test.go +++ b/gopls/internal/test/integration/bench/iwl_test.go @@ -27,7 +27,7 @@ func BenchmarkInitialWorkspaceLoad(b *testing.B) { {"oracle", "dataintegration/data_type.go"}, {"pkgsite", "internal/frontend/server.go"}, {"starlark", "starlark/eval.go"}, - {"tools", "internal/cache/snapshot.go"}, + {"tools", "internal/lsp/cache/snapshot.go"}, {"hashiform", "internal/provider/provider.go"}, } diff --git a/gopls/internal/test/integration/bench/rename_test.go b/gopls/internal/test/integration/bench/rename_test.go index 3b7013c890c..ca5ed5f4397 100644 --- a/gopls/internal/test/integration/bench/rename_test.go +++ b/gopls/internal/test/integration/bench/rename_test.go @@ -22,7 +22,7 @@ func BenchmarkRename(b *testing.B) { {"kuma", "pkg/events/interfaces.go", `Delete`, "Delete"}, {"pkgsite", "internal/log/log.go", `func (Infof)`, "Infof"}, {"starlark", "starlark/eval.go", `Program\) (Filename)`, "Filename"}, - {"tools", "internal/cache/snapshot.go", `meta \*(metadataGraph)`, "metadataGraph"}, + {"tools", "internal/lsp/cache/snapshot.go", `meta \*(metadataGraph)`, "metadataGraph"}, } for _, test := range tests { From 0e1f5be92cc3099cfe27d7da9ce1f41f47d7630c Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 14:23:33 -0500 Subject: [PATCH 066/105] gopls: update x/telemetry dependency Change-Id: I541c41b2d4c3618a47c05b367b9a9830121a19fe Reviewed-on: https://go-review.googlesource.com/c/tools/+/559219 Auto-Submit: Robert Findley <rfindley@google.com> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/go.mod | 2 +- gopls/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gopls/go.mod b/gopls/go.mod index 903a7ada8a9..a5bad1862fb 100644 --- a/gopls/go.mod +++ b/gopls/go.mod @@ -8,7 +8,7 @@ require ( github.com/jba/templatecheck v0.6.0 golang.org/x/mod v0.14.0 golang.org/x/sync v0.6.0 - golang.org/x/telemetry v0.0.0-20231114163143-69313e640400 + golang.org/x/telemetry v0.0.0-20240129174054-04287971b166 golang.org/x/text v0.14.0 golang.org/x/tools v0.13.1-0.20230920233436-f9b8da7b22be golang.org/x/vuln v1.0.1 diff --git a/gopls/go.sum b/gopls/go.sum index a4a914744ae..54fb1614caa 100644 --- a/gopls/go.sum +++ b/gopls/go.sum @@ -34,8 +34,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20231114163143-69313e640400 h1:brbkEFfGwNGAEkykUOcryE/JiHUMMJouzE0fWWmz/QU= -golang.org/x/telemetry v0.0.0-20231114163143-69313e640400/go.mod h1:P6hMdmAcoG7FyATwqSr6R/U0n7yeXNP/QXeRlxb1szE= +golang.org/x/telemetry v0.0.0-20240129174054-04287971b166 h1:REpn7wXSoZ5E/m9WEOJ1gV+LunqO74p5l21rQ0HgWwo= +golang.org/x/telemetry v0.0.0-20240129174054-04287971b166/go.mod h1:ZthVHHkOi8rlMEsfFr3Ie42Ym1NonbFNNRKW3ci0UrU= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 7ec8ac08d1a345281fb406382aff6c6ffef62f54 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 30 Jan 2024 10:11:52 -0500 Subject: [PATCH 067/105] gopls/internal/golang: hover: show type's methods after doc comment This change displays the methods of a type after its doc comments when hovering over a type. Also: - unexport HoverJSON. - remove leading/trailing newlines in markdown blocks. - clarify formatHover. Fixes golang/go#56331 Change-Id: Icf7ce775e1c01cc252f9cd218b6a0220d82c4087 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559495 Auto-Submit: Alan Donovan <adonovan@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Alan Donovan <adonovan@google.com> --- gopls/internal/golang/hover.go | 172 +++++++++++------- .../test/marker/testdata/definition/embed.txt | 15 +- .../test/marker/testdata/definition/misc.txt | 2 + .../test/marker/testdata/hover/godef.txt | 4 + .../test/marker/testdata/hover/linkable.txt | 8 +- .../testdata/hover/linkable_generics.txt | 18 +- .../test/marker/testdata/hover/methods.txt | 4 + 7 files changed, 145 insertions(+), 78 deletions(-) diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index 45421704599..ee298442513 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -33,14 +33,19 @@ import ( "golang.org/x/tools/gopls/internal/settings" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/gopls/internal/util/typesutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/tokeninternal" ) -// HoverJSON contains information used by hover. It is also the JSON returned -// for the "structured" hover format -type HoverJSON struct { +// hoverJSON contains the structured result of a hover query. It is +// formatted in one of several formats as determined by the HoverKind +// setting, one of which is JSON. +// +// We believe this is used only by govim. +// TODO(adonovan): see if we can wean all clients of this interface. +type hoverJSON struct { // Synopsis is a single sentence synopsis of the symbol's documentation. Synopsis string `json:"synopsis"` @@ -64,6 +69,20 @@ type HoverJSON struct { // LinkAnchor is the pkg.go.dev link anchor for the given symbol. // For example, the "Node" part of "pkg.go.dev/go/ast#Node". LinkAnchor string `json:"linkAnchor"` + + // New fields go below, and are unexported. The existing + // exported fields are underspecified and have already + // constrained our movements too much. A detailed JSON + // interface might be nice, but it needs a design and a + // precise specification. + + // typeDecl is the declaration syntax, or "" for a non-type. + typeDecl string + + // methods is the list of descriptions of methods of a type, + // omitting any that are obvious from TypeDecl. + // It is "" for a non-type. + methods string } // Hover implements the "textDocument/hover" RPC for Go files. @@ -94,7 +113,7 @@ func Hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, positi // hover computes hover information at the given position. If we do not support // hovering at the position, it returns _, nil, nil: an error is only returned // if the position is valid but we fail to compute hover information. -func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp protocol.Position) (protocol.Range, *HoverJSON, error) { +func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp protocol.Position) (protocol.Range, *hoverJSON, error) { pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) if err != nil { return protocol.Range{}, nil, err @@ -179,7 +198,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro if selectedType != nil { fakeObj := types.NewVar(obj.Pos(), obj.Pkg(), obj.Name(), selectedType) signature := types.ObjectString(fakeObj, qf) - return rng, &HoverJSON{ + return rng, &hoverJSON{ Signature: signature, SingleLine: signature, SymbolName: fakeObj.Name(), @@ -215,6 +234,8 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro } } + var typeDecl, methods string + // For "objects defined by a type spec", the signature produced by // objectString is insufficient: // (1) large structs are formatted poorly, with no newlines @@ -236,17 +257,31 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro } return protocol.Range{}, nil, errorf("type name %q without type spec", obj.Name()) } - spec2 := *spec - // Don't duplicate comments when formatting type specs. - spec2.Doc = nil - spec2.Comment = nil - var b strings.Builder - b.WriteString("type ") - fset := tokeninternal.FileSetFor(declPGF.Tok) - if err := format.Node(&b, fset, &spec2); err != nil { - return protocol.Range{}, nil, err + + // Format the type's declaration syntax. + { + // Don't duplicate comments. + spec2 := *spec + spec2.Doc = nil + spec2.Comment = nil + + var b strings.Builder + b.WriteString("type ") + fset := tokeninternal.FileSetFor(declPGF.Tok) + // TODO(adonovan): use a smarter formatter that omits + // inaccessible fields (non-exported ones from other packages). + if err := format.Node(&b, fset, &spec2); err != nil { + return protocol.Range{}, nil, err + } + typeDecl = b.String() } + // -- methods -- + + // TODO(adonovan): compute a similar list of + // accessible fields, reflecting embedding + // (e.g. "T.Embed.Y int"). + // For an interface type, explicit methods will have // already been displayed when the node was formatted // above. Don't list these again. @@ -268,7 +303,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro // including those that require a pointer receiver, // and those promoted from embedded struct fields or // embedded interfaces. - sep := "\n\n" + var b strings.Builder for _, m := range typeutil.IntuitiveMethodSet(obj.Type(), nil) { if m.Obj().Pkg() != pkg.GetTypes() && !m.Obj().Exported() { continue // inaccessible @@ -276,14 +311,16 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro if skip[m.Obj().Name()] { continue // redundant with format.Node above } - b.WriteString(sep) - sep = "\n" + if b.Len() > 0 { + b.WriteByte('\n') + } // Use objectString for its prettier rendering of method receivers. b.WriteString(objectString(m.Obj(), qf, token.NoPos, nil, nil)) } + methods = b.String() - signature = b.String() + signature = typeDecl + "\n" + methods } // Compute link data (on pkg.go.dev or other documentation host). @@ -386,7 +423,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro linkPath = strings.Replace(linkPath, mod.Path, mod.Path+"@"+mod.Version, 1) } - return rng, &HoverJSON{ + return rng, &hoverJSON{ Synopsis: doc.Synopsis(docText), FullDocumentation: docText, SingleLine: singleLineSignature, @@ -394,18 +431,20 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro Signature: signature, LinkPath: linkPath, LinkAnchor: anchor, + typeDecl: typeDecl, + methods: methods, }, nil } // hoverBuiltin computes hover information when hovering over a builtin // identifier. -func hoverBuiltin(ctx context.Context, snapshot *cache.Snapshot, obj types.Object) (*HoverJSON, error) { +func hoverBuiltin(ctx context.Context, snapshot *cache.Snapshot, obj types.Object) (*hoverJSON, error) { // Special handling for error.Error, which is the only builtin method. // // TODO(rfindley): can this be unified with the handling below? if obj.Name() == "Error" { signature := obj.String() - return &HoverJSON{ + return &hoverJSON{ Signature: signature, SingleLine: signature, // TODO(rfindley): these are better than the current behavior. @@ -446,7 +485,7 @@ func hoverBuiltin(ctx context.Context, snapshot *cache.Snapshot, obj types.Objec signature = replacer.Replace(signature) docText := comment.Text() - return &HoverJSON{ + return &hoverJSON{ Synopsis: doc.Synopsis(docText), FullDocumentation: docText, Signature: signature, @@ -461,7 +500,7 @@ func hoverBuiltin(ctx context.Context, snapshot *cache.Snapshot, obj types.Objec // imp in the file pgf of pkg. // // If we do not have metadata for the hovered import, it returns _ -func hoverImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Package, pgf *ParsedGoFile, imp *ast.ImportSpec) (protocol.Range, *HoverJSON, error) { +func hoverImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Package, pgf *ParsedGoFile, imp *ast.ImportSpec) (protocol.Range, *hoverJSON, error) { rng, err := pgf.NodeRange(imp.Path) if err != nil { return protocol.Range{}, nil, err @@ -504,7 +543,7 @@ func hoverImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Packa } docText := comment.Text() - return rng, &HoverJSON{ + return rng, &hoverJSON{ Synopsis: doc.Synopsis(docText), FullDocumentation: docText, }, nil @@ -512,7 +551,7 @@ func hoverImport(ctx context.Context, snapshot *cache.Snapshot, pkg *cache.Packa // hoverPackageName computes hover information for the package name of the file // pgf in pkg. -func hoverPackageName(pkg *cache.Package, pgf *ParsedGoFile) (protocol.Range, *HoverJSON, error) { +func hoverPackageName(pkg *cache.Package, pgf *ParsedGoFile) (protocol.Range, *hoverJSON, error) { var comment *ast.CommentGroup for _, pgf := range pkg.CompiledGoFiles() { if pgf.File.Doc != nil { @@ -525,7 +564,7 @@ func hoverPackageName(pkg *cache.Package, pgf *ParsedGoFile) (protocol.Range, *H return protocol.Range{}, nil, err } docText := comment.Text() - return rng, &HoverJSON{ + return rng, &hoverJSON{ Synopsis: doc.Synopsis(docText), FullDocumentation: docText, // Note: including a signature is redundant, since the cursor is already on the @@ -540,7 +579,7 @@ func hoverPackageName(pkg *cache.Package, pgf *ParsedGoFile) (protocol.Range, *H // For example, hovering over "\u2211" in "foo \u2211 bar" yields: // // '∑', U+2211, N-ARY SUMMATION -func hoverLit(pgf *ParsedGoFile, lit *ast.BasicLit, pos token.Pos) (protocol.Range, *HoverJSON, error) { +func hoverLit(pgf *ParsedGoFile, lit *ast.BasicLit, pos token.Pos) (protocol.Range, *hoverJSON, error) { var ( value string // if non-empty, a constant value to format in hover r rune // if non-zero, format a description of this rune in hover @@ -653,7 +692,7 @@ func hoverLit(pgf *ParsedGoFile, lit *ast.BasicLit, pos token.Pos) (protocol.Ran fmt.Fprintf(&b, "U+%04X, %s", r, runeName) } hover := b.String() - return rng, &HoverJSON{ + return rng, &hoverJSON{ Synopsis: hover, FullDocumentation: hover, }, nil @@ -661,7 +700,7 @@ func hoverLit(pgf *ParsedGoFile, lit *ast.BasicLit, pos token.Pos) (protocol.Ran // hoverEmbed computes hover information for a filepath.Match pattern. // Assumes that the pattern is relative to the location of fh. -func hoverEmbed(fh file.Handle, rng protocol.Range, pattern string) (protocol.Range, *HoverJSON, error) { +func hoverEmbed(fh file.Handle, rng protocol.Range, pattern string) (protocol.Range, *hoverJSON, error) { s := &strings.Builder{} dir := filepath.Dir(fh.URI().Path()) @@ -693,7 +732,7 @@ func hoverEmbed(fh file.Handle, rng protocol.Range, pattern string) (protocol.Ra fmt.Fprintf(s, "%s\n\n", m) } - json := &HoverJSON{ + json := &hoverJSON{ Signature: fmt.Sprintf("Embedding %q", pattern), Synopsis: s.String(), FullDocumentation: s.String(), @@ -917,54 +956,66 @@ func parseFull(ctx context.Context, snapshot *cache.Snapshot, fset *token.FileSe return pgf, fullPos, nil } -func formatHover(h *HoverJSON, options *settings.Options) (string, error) { - signature := formatSignature(h, options) +func formatHover(h *hoverJSON, options *settings.Options) (string, error) { + maybeMarkdown := func(s string) string { + if s != "" && options.PreferredContentFormat == protocol.Markdown { + s = fmt.Sprintf("```go\n%s\n```", strings.Trim(s, "\n")) + } + return s + } switch options.HoverKind { case settings.SingleLine: return h.SingleLine, nil + case settings.NoDocumentation: - return signature, nil + return maybeMarkdown(h.Signature), nil + case settings.Structured: b, err := json.Marshal(h) if err != nil { return "", err } return string(b), nil - } - link := formatLink(h, options) - doc := formatDoc(h, options) + case settings.SynopsisDocumentation, + settings.FullDocumentation: + // For types, we display TypeDecl and Methods, + // but not Signature, which is redundant (= TypeDecl + "\n" + Methods). + // For all other symbols, we display Signature; + // TypeDecl and Methods are empty. + // (This awkwardness is to preserve JSON compatibility.) + parts := []string{ + maybeMarkdown(h.Signature), + maybeMarkdown(h.typeDecl), + formatDoc(h, options), + maybeMarkdown(h.methods), + formatLink(h, options), + } + if h.typeDecl != "" { + parts[0] = "" // type: suppress redundant Signature + } + parts = slices.Remove(parts, "") - var b strings.Builder - parts := []string{signature, doc, link} - for i, el := range parts { - if el != "" { - b.WriteString(el) - - // If any elements of the remainder of the list are non-empty, - // write an extra newline. - if anyNonEmpty(parts[i+1:]) { + var b strings.Builder + for i, part := range parts { + if i > 0 { if options.PreferredContentFormat == protocol.Markdown { b.WriteString("\n\n") } else { - b.WriteRune('\n') + b.WriteByte('\n') } } + b.WriteString(part) } - } - return b.String(), nil -} + return b.String(), nil -func formatSignature(h *HoverJSON, options *settings.Options) string { - signature := h.Signature - if signature != "" && options.PreferredContentFormat == protocol.Markdown { - signature = fmt.Sprintf("```go\n%s\n```", signature) + default: + return "", fmt.Errorf("invalid HoverKind: %v", options.HoverKind) } - return signature } -func formatLink(h *HoverJSON, options *settings.Options) string { +func formatLink(h *hoverJSON, options *settings.Options) string { if !options.LinksInHover || options.LinkTarget == "" || h.LinkPath == "" { return "" } @@ -979,7 +1030,7 @@ func formatLink(h *HoverJSON, options *settings.Options) string { } } -func formatDoc(h *HoverJSON, options *settings.Options) string { +func formatDoc(h *hoverJSON, options *settings.Options) string { var doc string switch options.HoverKind { case settings.SynopsisDocumentation: @@ -993,15 +1044,6 @@ func formatDoc(h *HoverJSON, options *settings.Options) string { return doc } -func anyNonEmpty(x []string) bool { - for _, el := range x { - if el != "" { - return true - } - } - return false -} - // findDeclInfo returns the syntax nodes involved in the declaration of the // types.Object with position pos, searching the given list of file syntax // trees. diff --git a/gopls/internal/test/marker/testdata/definition/embed.txt b/gopls/internal/test/marker/testdata/definition/embed.txt index 2ac092cc7a4..e5c0f18ff47 100644 --- a/gopls/internal/test/marker/testdata/definition/embed.txt +++ b/gopls/internal/test/marker/testdata/definition/embed.txt @@ -208,7 +208,9 @@ type S2 struct { F2 int //@loc(S2F2, "F2") *a.A //@def("A", AString),def("a",AImport) } +``` +```go func (a.A) Hi() ``` @@ -243,19 +245,24 @@ field Field int -- @aA -- ```go type A string - -func (a.A) Hi() ``` @loc(AString, "A") +```go +func (a.A) Hi() +``` + [`a.A` on pkg.go.dev](https://pkg.go.dev/mod.com/a#A) -- @aAlias -- ```go type aAlias = a.A - -func (a.A) Hi() ``` @loc(aAlias, "aAlias") + + +```go +func (a.A) Hi() +``` diff --git a/gopls/internal/test/marker/testdata/definition/misc.txt b/gopls/internal/test/marker/testdata/definition/misc.txt index 86f921deb71..c7147a625be 100644 --- a/gopls/internal/test/marker/testdata/definition/misc.txt +++ b/gopls/internal/test/marker/testdata/definition/misc.txt @@ -175,7 +175,9 @@ type I interface { B() J } +``` +```go func (J) Hello() ``` diff --git a/gopls/internal/test/marker/testdata/hover/godef.txt b/gopls/internal/test/marker/testdata/hover/godef.txt index 101ddaf1961..9e11e7f05d5 100644 --- a/gopls/internal/test/marker/testdata/hover/godef.txt +++ b/gopls/internal/test/marker/testdata/hover/godef.txt @@ -114,7 +114,9 @@ var Other Thing type Thing struct { Member string //@loc(Member, "Member") } +``` +```go func (t Thing) Method(i int) string func (t *Thing) Method2(i int, j int) (error, string) func (t Thing) Method3() @@ -128,7 +130,9 @@ type NextThing struct { Thing Value int } +``` +```go func (t Thing) Method(i int) string func (t *Thing) Method2(i int, j int) (error, string) func (n *NextThing) Method3() int diff --git a/gopls/internal/test/marker/testdata/hover/linkable.txt b/gopls/internal/test/marker/testdata/hover/linkable.txt index 03dc871de90..9147863c3c2 100644 --- a/gopls/internal/test/marker/testdata/hover/linkable.txt +++ b/gopls/internal/test/marker/testdata/hover/linkable.txt @@ -103,14 +103,16 @@ type T struct { Nested int //@hover("Nested", "Nested", Nested) } } - -func (T) M() -func (T) m() ``` T is in the package scope, and so should be linkable. +```go +func (T) M() +func (T) m() +``` + [`p.T` on pkg.go.dev](https://pkg.go.dev/mod.com#T) -- @X -- ```go diff --git a/gopls/internal/test/marker/testdata/hover/linkable_generics.txt b/gopls/internal/test/marker/testdata/hover/linkable_generics.txt index 686760ff822..1ea009e0318 100644 --- a/gopls/internal/test/marker/testdata/hover/linkable_generics.txt +++ b/gopls/internal/test/marker/testdata/hover/linkable_generics.txt @@ -66,8 +66,6 @@ func GF[P any](p P) type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } - -func (GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. @@ -75,6 +73,10 @@ Hovering over type parameters should link to documentation. TODO(rfindley): should it? We should probably link to the type. +```go +func (GT[P]) M(p P) +``` + [`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT) -- @GTP -- ```go @@ -85,8 +87,6 @@ type parameter P any type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } - -func (GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. @@ -94,6 +94,10 @@ Hovering over type parameters should link to documentation. TODO(rfindley): should it? We should probably link to the type. +```go +func (GT[P]) M(p P) +``` + [`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT) -- @M -- ```go @@ -135,8 +139,6 @@ field F int type GT[P any] struct { F P //@hover("F", "F", F),hover("P", "P", FP) } - -func (generic.GT[P]) M(p P) ``` Hovering over type parameters should link to documentation. @@ -144,4 +146,8 @@ Hovering over type parameters should link to documentation. TODO(rfindley): should it? We should probably link to the type. +```go +func (generic.GT[P]) M(p P) +``` + [`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT) diff --git a/gopls/internal/test/marker/testdata/hover/methods.txt b/gopls/internal/test/marker/testdata/hover/methods.txt index 7a851ad99ec..101a719795d 100644 --- a/gopls/internal/test/marker/testdata/hover/methods.txt +++ b/gopls/internal/test/marker/testdata/hover/methods.txt @@ -44,7 +44,9 @@ type I interface { b() J } +``` +```go func (lib.J) C() ``` @@ -58,7 +60,9 @@ type J interface{ C() } -- @S -- ```go type S struct{ I } +``` +```go func (s lib.S) A() func (lib.J) C() func (s *lib.S) PA() From da7ed64947fdc767d222726be0446ad9d352ac2b Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 17:37:01 -0500 Subject: [PATCH 068/105] gopls/internal/cache/imports: simplify importsState invalidation Now that views are immutable, we can simplify the invalidation of imports state. The imports.ProcessEnv can also be immutable, and we need only invalidate module state (i.e. dependencies) if a go.mod file changes. While at it, add documentation and perform some superficial cleanup in the internal/imports package. This is a first step toward larger state optimizations needed for the issues below. TODOs are added for remaining work. For golang/go#44863 For golang/go#59216 Change-Id: I23c1ea96f241334efdbfb4c09f6265637b38f497 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559496 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/imports.go | 65 ++---------- gopls/internal/cache/session.go | 34 ++++-- .../internal/golang/completion/completion.go | 6 +- gopls/internal/util/slices/slices.go | 10 +- internal/imports/fix.go | 28 ++++- internal/imports/imports.go | 2 +- internal/imports/mod.go | 100 ++++++++++++++---- internal/imports/mod_cache.go | 3 +- internal/imports/mod_test.go | 2 +- 9 files changed, 154 insertions(+), 96 deletions(-) diff --git a/gopls/internal/cache/imports.go b/gopls/internal/cache/imports.go index 43df10e0237..1e98fa454ad 100644 --- a/gopls/internal/cache/imports.go +++ b/gopls/internal/cache/imports.go @@ -7,9 +7,6 @@ package cache import ( "context" "fmt" - "os" - "reflect" - "strings" "sync" "time" @@ -22,13 +19,11 @@ import ( type importsState struct { ctx context.Context - mu sync.Mutex - processEnv *imports.ProcessEnv - cacheRefreshDuration time.Duration - cacheRefreshTimer *time.Timer - cachedModFileHash file.Hash - cachedBuildFlags []string - cachedDirectoryFilters []string + mu sync.Mutex + processEnv *imports.ProcessEnv + cacheRefreshDuration time.Duration + cacheRefreshTimer *time.Timer + cachedModFileHash file.Hash } func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot, fn func(context.Context, *imports.Options) error) error { @@ -52,24 +47,10 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot modFileHash.XORWith(fh.Identity().Hash) } - // view.goEnv is immutable -- changes make a new view. Options can change. - // We can't compare build flags directly because we may add -modfile. - localPrefix := snapshot.Options().Local - currentBuildFlags := snapshot.Options().BuildFlags - currentDirectoryFilters := snapshot.Options().DirectoryFilters - changed := !reflect.DeepEqual(currentBuildFlags, s.cachedBuildFlags) || - snapshot.Options().VerboseOutput != (s.processEnv.Logf != nil) || - modFileHash != s.cachedModFileHash || - !reflect.DeepEqual(snapshot.Options().DirectoryFilters, s.cachedDirectoryFilters) - // If anything relevant to imports has changed, clear caches and // update the processEnv. Clearing caches blocks on any background // scans. - if changed { - if err := populateProcessEnvFromSnapshot(ctx, s.processEnv, snapshot); err != nil { - return err - } - + if modFileHash != s.cachedModFileHash { if resolver, err := s.processEnv.GetResolver(); err == nil { if modResolver, ok := resolver.(*imports.ModuleResolver); ok { modResolver.ClearForNewMod() @@ -77,8 +58,6 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot } s.cachedModFileHash = modFileHash - s.cachedBuildFlags = currentBuildFlags - s.cachedDirectoryFilters = currentDirectoryFilters } // Run the user function. @@ -91,7 +70,7 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot TabIndent: true, TabWidth: 8, Env: s.processEnv, - LocalPrefix: localPrefix, + LocalPrefix: snapshot.Options().Local, } if err := fn(ctx, opts); err != nil { @@ -111,36 +90,6 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot return nil } -// populateProcessEnvFromSnapshot sets the dynamically configurable fields for -// the view's process environment. Assumes that the caller is holding the -// importsState mutex. -func populateProcessEnvFromSnapshot(ctx context.Context, pe *imports.ProcessEnv, snapshot *Snapshot) error { - ctx, done := event.Start(ctx, "cache.populateProcessEnvFromSnapshot") - defer done() - - if snapshot.Options().VerboseOutput { - pe.Logf = func(format string, args ...interface{}) { - event.Log(ctx, fmt.Sprintf(format, args...)) - } - } else { - pe.Logf = nil - } - - pe.WorkingDir = snapshot.view.root.Path() - pe.ModFlag = "readonly" // processEnv operations should not mutate the modfile - pe.Env = map[string]string{} - pe.BuildFlags = append([]string{}, snapshot.Options().BuildFlags...) - env := append(append(os.Environ(), snapshot.Options().EnvSlice()...), "GO111MODULE="+snapshot.view.adjustedGO111MODULE()) - for _, kv := range env { - split := strings.SplitN(kv, "=", 2) - if len(split) != 2 { - continue - } - pe.Env[split[0]] = split[1] - } - return nil -} - func (s *importsState) refreshProcessEnv() { ctx, done := event.Start(s.ctx, "cache.importsState.refreshProcessEnv") defer done() diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 3ca175a6542..17c7514664d 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -17,12 +17,13 @@ import ( "sync/atomic" "time" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/typerefs" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/persistent" + "golang.org/x/tools/gopls/internal/util/slices" "golang.org/x/tools/gopls/internal/vulncheck" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -190,6 +191,30 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * ignoreFilter = newIgnoreFilter(dirs) } + var pe *imports.ProcessEnv + { + env := make(map[string]string) + envSlice := slices.Concat(os.Environ(), def.folder.Options.EnvSlice(), []string{"GO111MODULE=" + def.adjustedGO111MODULE()}) + for _, kv := range envSlice { + if k, v, ok := strings.Cut(kv, "="); ok { + env[k] = v + } + } + pe = &imports.ProcessEnv{ + GocmdRunner: s.gocmdRunner, + BuildFlags: slices.Clone(def.folder.Options.BuildFlags), + ModFlag: "readonly", // processEnv operations should not mutate the modfile + SkipPathInScan: skipPath, + Env: env, + WorkingDir: def.root.Path(), + } + if def.folder.Options.VerboseOutput { + pe.Logf = func(format string, args ...interface{}) { + event.Log(ctx, fmt.Sprintf(format, args...)) + } + } + } + v := &View{ id: strconv.FormatInt(index, 10), gocmdRunner: s.gocmdRunner, @@ -201,11 +226,8 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * fs: s.overlayFS, viewDefinition: def, importsState: &importsState{ - ctx: backgroundCtx, - processEnv: &imports.ProcessEnv{ - GocmdRunner: s.gocmdRunner, - SkipPathInScan: skipPath, - }, + ctx: backgroundCtx, + processEnv: pe, }, } diff --git a/gopls/internal/golang/completion/completion.go b/gopls/internal/golang/completion/completion.go index 2c4f4c826ba..586d74337dc 100644 --- a/gopls/internal/golang/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go @@ -1759,8 +1759,6 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru count++ } - ctx, cancel := context.WithCancel(ctx) - var mu sync.Mutex add := func(pkg imports.ImportFix) { if ignoreUnimportedCompletion(&pkg) { @@ -1776,7 +1774,6 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru } if count >= maxUnimportedPackageNames { - cancel() return } @@ -1794,10 +1791,11 @@ func (c *completer) unimportedPackages(ctx context.Context, seen map[string]stru }) count++ } + c.completionCallbacks = append(c.completionCallbacks, func(ctx context.Context, opts *imports.Options) error { - defer cancel() return imports.GetAllCandidates(ctx, add, prefix, c.filename, c.pkg.GetTypes().Name(), opts.Env) }) + return nil } diff --git a/gopls/internal/util/slices/slices.go b/gopls/internal/util/slices/slices.go index 73d5b51e0dc..4c4fa4d0a79 100644 --- a/gopls/internal/util/slices/slices.go +++ b/gopls/internal/util/slices/slices.go @@ -4,6 +4,14 @@ package slices +// Clone returns a copy of the slice. +// The elements are copied using assignment, so this is a shallow clone. +// TODO(rfindley): use go1.19 slices.Clone. +func Clone[S ~[]E, E any](s S) S { + // The s[:0:0] preserves nil in case it matters. + return append(s[:0:0], s...) +} + // Contains reports whether x is present in slice. // TODO(adonovan): use go1.19 slices.Contains. func Contains[S ~[]E, E comparable](slice S, x E) bool { @@ -35,7 +43,7 @@ func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool { } // Concat returns a new slice concatenating the passed in slices. -// TODO(rfindley): use go1.22 slices.Contains. +// TODO(rfindley): use go1.22 slices.Concat. func Concat[S ~[]E, E any](slices ...S) S { size := 0 for _, s := range slices { diff --git a/internal/imports/fix.go b/internal/imports/fix.go index 28f2ab9e08c..c12d42368dd 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -828,7 +828,22 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP return getCandidatePkgs(ctx, callback, filename, filePkg, env) } -var requiredGoEnvVars = []string{"GO111MODULE", "GOFLAGS", "GOINSECURE", "GOMOD", "GOMODCACHE", "GONOPROXY", "GONOSUMDB", "GOPATH", "GOPROXY", "GOROOT", "GOSUMDB", "GOWORK"} +// TODO(rfindley): we should depend on GOOS and GOARCH, to provide accurate +// imports when doing cross-platform development. +var requiredGoEnvVars = []string{ + "GO111MODULE", + "GOFLAGS", + "GOINSECURE", + "GOMOD", + "GOMODCACHE", + "GONOPROXY", + "GONOSUMDB", + "GOPATH", + "GOPROXY", + "GOROOT", + "GOSUMDB", + "GOWORK", +} // ProcessEnv contains environment variables and settings that affect the use of // the go command, the go/build package, etc. @@ -847,7 +862,7 @@ type ProcessEnv struct { // Env overrides the OS environment, and can be used to specify // GOPROXY, GO111MODULE, etc. PATH cannot be set here, because // exec.Command will not honor it. - // Specifying all of RequiredGoEnvVars avoids a call to `go env`. + // Specifying all of requiredGoEnvVars avoids a call to `go env`. Env map[string]string WorkingDir string @@ -855,6 +870,8 @@ type ProcessEnv struct { // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) + // TODO(rfindley): for simplicity, use a constructor rather than + // initialization pattern for ProcessEnv. initialized bool resolver Resolver @@ -1030,11 +1047,14 @@ func addStdlibCandidates(pass *pass, refs references) error { type Resolver interface { // loadPackageNames loads the package names in importPaths. loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) + // scan works with callback to search for packages. See scanCallback for details. scan(ctx context.Context, callback *scanCallback) error + // loadExports returns the set of exported symbols in the package at dir. // loadExports may be called concurrently. loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) + // scoreImportPath returns the relevance for an import path. scoreImportPath(ctx context.Context, path string) float64 @@ -1121,7 +1141,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil go func(pkgName string, symbols map[string]bool) { defer wg.Done() - found, err := findImport(ctx, pass, found[pkgName], pkgName, symbols, filename) + found, err := findImport(ctx, pass, found[pkgName], pkgName, symbols) if err != nil { firstErrOnce.Do(func() { @@ -1550,7 +1570,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl // findImport searches for a package with the given symbols. // If no package is found, findImport returns ("", false, nil) -func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgName string, symbols map[string]bool, filename string) (*pkg, error) { +func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgName string, symbols map[string]bool) (*pkg, error) { // Sort the candidates by their import package length, // assuming that shorter package names are better than long // ones. Note that this sorts by the de-vendored name, so diff --git a/internal/imports/imports.go b/internal/imports/imports.go index 58e637b90f2..660407548e5 100644 --- a/internal/imports/imports.go +++ b/internal/imports/imports.go @@ -236,7 +236,7 @@ func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast src = src[:len(src)-len("}\n")] // Gofmt has also indented the function body one level. // Remove that indent. - src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1) + src = bytes.ReplaceAll(src, []byte("\n\t"), []byte("\n")) return matchSpace(orig, src) } return file, adjust, nil diff --git a/internal/imports/mod.go b/internal/imports/mod.go index 5f4d435d3cc..013616609f9 100644 --- a/internal/imports/mod.go +++ b/internal/imports/mod.go @@ -23,23 +23,66 @@ import ( "golang.org/x/tools/internal/gopathwalk" ) -// ModuleResolver implements resolver for modules using the go command as little -// as feasible. +// Notes(rfindley): ModuleResolver appears to be heavily optimized for scanning +// as fast as possible, which is desirable for a call to goimports from the +// command line, but it doesn't work as well for gopls, where it suffers from +// slow startup (golang/go#44863) and intermittent hanging (golang/go#59216), +// both caused by populating the cache, albeit in slightly different ways. +// +// A high level list of TODOs: +// - Write an additional benchmark for refreshing the directory state. +// - Split scanning the module cache from other ModuleResolver functionality, +// as it is the source of performance woes (and inconsistency). +// - Allow sharing module cache state across multiple ModuleResolvers. +// - Optimize the scan itself, as there is a lot of redundancy statting and +// reading go.mod files. +// - Make it possible to reuse the current state while running a refresh in +// the background. +// - Fix context cancellation (again): if the context is cancelled while a +// root is being walked, nothing stops that ongoing walk. +// +// Smaller TODOs are annotated in the code below. + +// ModuleResolver implements the Resolver interface for a workspace using +// modules. +// +// A goal of the ModuleResolver is to invoke the Go command as little as +// possible. To this end, it runs the Go command only for listing module +// information (i.e. `go list -m -e -json ...`). Package scanning, the process +// of loading package information for the modules, is implemented internally +// via the scan method. +// +// It has two types of state: the state derived from the go command, which +// is populated by init, and the state derived from scans, which is populated +// via scan. A root is considered scanned if it has been walked to discover +// directories. However, if the scan did not require additional information +// from the directory (such as package name or exports), the directory +// information itself may be partially populated. It will be lazily filled in +// as needed by scans, using the scanCallback. type ModuleResolver struct { - env *ProcessEnv - moduleCacheDir string - dummyVendorMod *gocommand.ModuleJSON // If vendoring is enabled, the pseudo-module that represents the /vendor directory. - roots []gopathwalk.Root - scanSema chan struct{} // scanSema prevents concurrent scans and guards scannedRoots. - scannedRoots map[gopathwalk.Root]bool - - initialized bool - mains []*gocommand.ModuleJSON - mainByDir map[string]*gocommand.ModuleJSON - modsByModPath []*gocommand.ModuleJSON // All modules, ordered by # of path components in module Path... - modsByDir []*gocommand.ModuleJSON // ...or number of path components in their Dir. - - // moduleCacheCache stores information about the module cache. + env *ProcessEnv + + // Module state, populated by init + initialized bool + dummyVendorMod *gocommand.ModuleJSON // if vendoring is enabled, a pseudo-module to represent the /vendor directory + moduleCacheDir string // GOMODCACHE, inferred from GOPATH if unset + roots []gopathwalk.Root // roots to scan, in approximate order of importance + mains []*gocommand.ModuleJSON // main modules + mainByDir map[string]*gocommand.ModuleJSON // module information by dir, to join with roots + modsByModPath []*gocommand.ModuleJSON // all modules, ordered by # of path components in their module path + modsByDir []*gocommand.ModuleJSON // ...or by the number of path components in their Dir. + + // Scanning state, populated by scan + scanSema chan struct{} // prevents concurrent scans and guards scannedRoots + scannedRoots map[gopathwalk.Root]bool // if true, root has been walked + + // Caches of directory info, populated by scans and scan callbacks + // + // moduleCacheCache stores cached information about roots in the module + // cache, which are immutable and therefore do not need to be invalidated. + // + // otherCache stores information about all other roots (even GOROOT), which + // may change. moduleCacheCache *dirInfoCache otherCache *dirInfoCache } @@ -62,6 +105,7 @@ func (r *ModuleResolver) init() error { if err != nil { return err } + // TODO(rfindley): can we refactor to share logic with r.env.invokeGo? inv := gocommand.Invocation{ BuildFlags: r.env.BuildFlags, ModFlag: r.env.ModFlag, @@ -77,6 +121,9 @@ func (r *ModuleResolver) init() error { // Module vendor directories are ignored in workspace mode: // https://go.googlesource.com/proposal/+/master/design/45713-workspace.md if len(r.env.Env["GOWORK"]) == 0 { + // TODO(rfindley): VendorEnabled runs the go command to get GOFLAGS, but + // they should be available from the ProcessEnv. Can we avoid the redundant + // invocation? vendorEnabled, mainModVendor, err = gocommand.VendorEnabled(context.TODO(), inv, r.env.GocmdRunner) if err != nil { return err @@ -141,7 +188,11 @@ func (r *ModuleResolver) init() error { } else { addDep := func(mod *gocommand.ModuleJSON) { if mod.Replace == nil { - // This is redundant with the cache, but we'll skip it cheaply enough. + // This is redundant with the cache, but we'll skip it cheaply enough + // when we encounter it in the module cache scan. + // + // Including it at a lower index in r.roots than the module cache dir + // helps prioritize matches from within existing dependencies. r.roots = append(r.roots, gopathwalk.Root{Path: mod.Dir, Type: gopathwalk.RootModuleCache}) } else { r.roots = append(r.roots, gopathwalk.Root{Path: mod.Dir, Type: gopathwalk.RootOther}) @@ -206,6 +257,11 @@ func (r *ModuleResolver) initAllMods() error { return nil } +// ClearForNewScan invalidates the last scan. +// +// It preserves the set of roots, but forgets about the set of directories. +// Though it forgets the set of module cache directories, it remembers their +// contents, since they are assumed to be immutable. func (r *ModuleResolver) ClearForNewScan() { <-r.scanSema r.scannedRoots = map[gopathwalk.Root]bool{} @@ -216,6 +272,11 @@ func (r *ModuleResolver) ClearForNewScan() { r.scanSema <- struct{}{} } +// ClearForNewMod invalidates resolver state that depends on the go.mod file +// (essentially, the output of go list -m -json ...). +// +// Notably, it does not forget directory contents, which are reset +// asynchronously via ClearForNewScan. func (r *ModuleResolver) ClearForNewMod() { <-r.scanSema *r = ModuleResolver{ @@ -444,18 +505,18 @@ func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error if err != nil { return } - if !callback.dirFound(pkg) { return } + pkg.packageName, err = r.cachePackageName(info) if err != nil { return } - if !callback.packageNameLoaded(pkg) { return } + _, exports, err := r.loadExports(ctx, pkg, false) if err != nil { return @@ -494,7 +555,6 @@ func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error return packageScanned } - // Add anything new to the cache, and process it if we're still listening. add := func(root gopathwalk.Root, dir string) { r.cacheStore(r.scanDirForPackage(root, dir)) } diff --git a/internal/imports/mod_cache.go b/internal/imports/mod_cache.go index 45690abbb4f..03b1926d2e5 100644 --- a/internal/imports/mod_cache.go +++ b/internal/imports/mod_cache.go @@ -39,6 +39,8 @@ const ( exportsLoaded ) +// directoryPackageInfo holds (possibly incomplete) information about packages +// contained in a given directory. type directoryPackageInfo struct { // status indicates the extent to which this struct has been filled in. status directoryPackageStatus @@ -63,7 +65,6 @@ type directoryPackageInfo struct { packageName string // the package name, as declared in the source. // Set when status >= exportsLoaded. - exports []string } diff --git a/internal/imports/mod_test.go b/internal/imports/mod_test.go index 26dac639062..3a4cd048aa8 100644 --- a/internal/imports/mod_test.go +++ b/internal/imports/mod_test.go @@ -1098,7 +1098,7 @@ func writeProxyModule(base, arPath string) error { arName := filepath.Base(arPath) i := strings.LastIndex(arName, "_v") ver := strings.TrimSuffix(arName[i+1:], ".txt") - modDir := strings.Replace(arName[:i], "_", "/", -1) + modDir := strings.ReplaceAll(arName[:i], "_", "/") modPath, err := module.UnescapePath(modDir) if err != nil { return err From c046c5b69835efa71f683c88c3e817eabc1ac5ce Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 12:09:19 -0500 Subject: [PATCH 069/105] gopls/internal/test/marker/testdata: move test to correct location Change-Id: I5d91d875fafc5a41c149eb86d7e137d9fbcce042 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559456 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- .../{regtest => test}/marker/testdata/rename/issue60752.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename gopls/internal/{regtest => test}/marker/testdata/rename/issue60752.txt (100%) diff --git a/gopls/internal/regtest/marker/testdata/rename/issue60752.txt b/gopls/internal/test/marker/testdata/rename/issue60752.txt similarity index 100% rename from gopls/internal/regtest/marker/testdata/rename/issue60752.txt rename to gopls/internal/test/marker/testdata/rename/issue60752.txt From 0c80ba376b31d193c153ed6951197c4c67406443 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 30 Jan 2024 16:52:21 -0500 Subject: [PATCH 070/105] internal/imports: remove the unused ProcessEnv.ModFile field Remove the ProcessEnv.ModFile field, which was never set. Also add additional comments and superficial cleanup. Change-Id: I45d63e5039043d01d4280d2d916df6794e437d8a Reviewed-on: https://go-review.googlesource.com/c/tools/+/559506 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/internal/cache/session.go | 8 +++++--- internal/imports/fix.go | 11 ++++++++++- internal/imports/mod.go | 3 +-- internal/imports/mod_test.go | 6 +++++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 17c7514664d..82474789f7c 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -201,9 +201,11 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * } } pe = &imports.ProcessEnv{ - GocmdRunner: s.gocmdRunner, - BuildFlags: slices.Clone(def.folder.Options.BuildFlags), - ModFlag: "readonly", // processEnv operations should not mutate the modfile + GocmdRunner: s.gocmdRunner, + BuildFlags: slices.Clone(def.folder.Options.BuildFlags), + // TODO(rfindley): an old comment said "processEnv operations should not mutate the modfile" + // But shouldn't we honor the default behavior of mod vendoring? + ModFlag: "readonly", SkipPathInScan: skipPath, Env: env, WorkingDir: def.root.Path(), diff --git a/internal/imports/fix.go b/internal/imports/fix.go index c12d42368dd..5cf1aff3cb3 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -852,7 +852,6 @@ type ProcessEnv struct { BuildFlags []string ModFlag string - ModFile string // SkipPathInScan returns true if the path should be skipped from scans of // the RootCurrentModule root type. The function argument is a clean, @@ -960,6 +959,12 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) { if err := e.init(); err != nil { return nil, err } + // TODO(rfindley): we should only use a gopathResolver here if the working + // directory is actually *in* GOPATH. (I seem to recall an open gopls issue + // for this behavior, but I can't find it). + // + // For gopls, we can optionally explicitly choose a resolver type, since we + // already know the view type. if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { e.resolver = newGopathResolver(e) return e.resolver, nil @@ -968,6 +973,10 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) { return e.resolver, nil } +// buildContext returns the build.Context to use for matching files. +// +// TODO(rfindley): support dynamic GOOS, GOARCH here, when doing cross-platform +// development. func (e *ProcessEnv) buildContext() (*build.Context, error) { ctx := build.Default goenv, err := e.goEnv() diff --git a/internal/imports/mod.go b/internal/imports/mod.go index 013616609f9..2287d4a8f5e 100644 --- a/internal/imports/mod.go +++ b/internal/imports/mod.go @@ -34,7 +34,7 @@ import ( // - Split scanning the module cache from other ModuleResolver functionality, // as it is the source of performance woes (and inconsistency). // - Allow sharing module cache state across multiple ModuleResolvers. -// - Optimize the scan itself, as there is a lot of redundancy statting and +// - Optimize the scan itself, as there is some redundancy statting and // reading go.mod files. // - Make it possible to reuse the current state while running a refresh in // the background. @@ -109,7 +109,6 @@ func (r *ModuleResolver) init() error { inv := gocommand.Invocation{ BuildFlags: r.env.BuildFlags, ModFlag: r.env.ModFlag, - ModFile: r.env.ModFile, Env: r.env.env(), Logf: r.env.Logf, WorkingDir: r.env.WorkingDir, diff --git a/internal/imports/mod_test.go b/internal/imports/mod_test.go index 3a4cd048aa8..98aa678f1bb 100644 --- a/internal/imports/mod_test.go +++ b/internal/imports/mod_test.go @@ -17,6 +17,7 @@ import ( "strings" "sync" "testing" + "time" "golang.org/x/mod/module" "golang.org/x/tools/internal/gocommand" @@ -1291,14 +1292,17 @@ import ( func BenchmarkScanModCache(b *testing.B) { env := &ProcessEnv{ GocmdRunner: &gocommand.Runner{}, - Logf: b.Logf, + // Uncomment for verbose logging (too verbose to enable by default). + // Logf: b.Logf, } exclude := []gopathwalk.RootType{gopathwalk.RootGOROOT} resolver, err := env.GetResolver() if err != nil { b.Fatal(err) } + start := time.Now() scanToSlice(resolver, exclude) + b.Logf("warming the mod cache took %v", time.Since(start)) b.ResetTimer() for i := 0; i < b.N; i++ { scanToSlice(resolver, exclude) From 5f9069195d793b7284459955e7e1b0283abab71c Mon Sep 17 00:00:00 2001 From: Jason Smith <jason.smith.omnide@gmail.com> Date: Tue, 23 Jan 2024 23:49:32 -0500 Subject: [PATCH 071/105] go/buildutil: permit comma delimiters in build tags The buildutil.TagsFlag must maintain parity with the go build command, but the duplicated implementations have drifted apart over time. Starting in go 1.13 the go build command began honoring comma xor space delimiters while buildutil.TagsFlag only recognized spaces as of go 1.22. Test coverage has been updated to use a table with more cases to affirm expected behaviors, and to detect regressions that occur should the go build command change its implementation again. Fixes golang/go#44787 Change-Id: I210074a8fc5aaaed504e81633fc93aeacb142d9e Reviewed-on: https://go-review.googlesource.com/c/tools/+/558115 Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Bryan Mills <bcmills@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Bryan Mills <bcmills@google.com> --- go/buildutil/tags.go | 42 +++++++++---- go/buildutil/tags_test.go | 120 ++++++++++++++++++++++++++++++++++---- 2 files changed, 139 insertions(+), 23 deletions(-) diff --git a/go/buildutil/tags.go b/go/buildutil/tags.go index 7cf523bca48..32c8d1424d2 100644 --- a/go/buildutil/tags.go +++ b/go/buildutil/tags.go @@ -4,17 +4,22 @@ package buildutil -// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go. +// This duplicated logic must be kept in sync with that from go build: +// $GOROOT/src/cmd/go/internal/work/build.go (tagsFlag.Set) +// $GOROOT/src/cmd/go/internal/base/flag.go (StringsFlag.Set) +// $GOROOT/src/cmd/internal/quoted/quoted.go (isSpaceByte, Split) -import "fmt" +import ( + "fmt" + "strings" +) const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " + "For more information about build tags, see the description of " + "build constraints in the documentation for the go/build package" // TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses -// a flag value in the same manner as go build's -tags flag and -// populates a []string slice. +// a flag value the same as go build's -tags flag and populates a []string slice. // // See $GOROOT/src/go/build/doc.go for description of build tags. // See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag. @@ -25,19 +30,32 @@ const TagsFlagDoc = "a list of `build tags` to consider satisfied during the bui type TagsFlag []string func (v *TagsFlag) Set(s string) error { - var err error - *v, err = splitQuotedFields(s) - if *v == nil { - *v = []string{} + // See $GOROOT/src/cmd/go/internal/work/build.go (tagsFlag.Set) + // For compatibility with Go 1.12 and earlier, allow "-tags='a b c'" or even just "-tags='a'". + if strings.Contains(s, " ") || strings.Contains(s, "'") { + var err error + *v, err = splitQuotedFields(s) + if *v == nil { + *v = []string{} + } + return err + } + + // Starting in Go 1.13, the -tags flag is a comma-separated list of build tags. + *v = []string{} + for _, s := range strings.Split(s, ",") { + if s != "" { + *v = append(*v, s) + } } - return err + return nil } func (v *TagsFlag) Get() interface{} { return *v } func splitQuotedFields(s string) ([]string, error) { - // Split fields allowing '' or "" around elements. - // Quotes further inside the string do not count. + // See $GOROOT/src/cmd/internal/quoted/quoted.go (Split) + // This must remain in sync with that logic. var f []string for len(s) > 0 { for len(s) > 0 && isSpaceByte(s[0]) { @@ -76,5 +94,7 @@ func (v *TagsFlag) String() string { } func isSpaceByte(c byte) bool { + // See $GOROOT/src/cmd/internal/quoted/quoted.go (isSpaceByte, Split) + // This list must remain in sync with that. return c == ' ' || c == '\t' || c == '\n' || c == '\r' } diff --git a/go/buildutil/tags_test.go b/go/buildutil/tags_test.go index f8234314fb3..fb3afbccab7 100644 --- a/go/buildutil/tags_test.go +++ b/go/buildutil/tags_test.go @@ -5,28 +5,124 @@ package buildutil_test import ( + "bytes" "flag" "go/build" + "os/exec" "reflect" + "strings" "testing" "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/internal/testenv" ) func TestTags(t *testing.T) { - f := flag.NewFlagSet("TestTags", flag.PanicOnError) - var ctxt build.Context - f.Var((*buildutil.TagsFlag)(&ctxt.BuildTags), "tags", buildutil.TagsFlagDoc) - f.Parse([]string{"-tags", ` 'one'"two" 'three "four"'`, "rest"}) - - // BuildTags - want := []string{"one", "two", "three \"four\""} - if !reflect.DeepEqual(ctxt.BuildTags, want) { - t.Errorf("BuildTags = %q, want %q", ctxt.BuildTags, want) + + type tagTestCase struct { + tags string + want []string + wantErr bool } - // Args() - if want := []string{"rest"}; !reflect.DeepEqual(f.Args(), want) { - t.Errorf("f.Args() = %q, want %q", f.Args(), want) + for name, tc := range map[string]tagTestCase{ + // Normal valid cases + "empty": { + tags: "", + want: []string{}, + }, + "commas": { + tags: "tag1,tag_2,🐹,tag/3,tag-4", + want: []string{"tag1", "tag_2", "🐹", "tag/3", "tag-4"}, + }, + "delimiters are spaces": { + tags: "a b\tc\rd\ne", + want: []string{"a", "b", "c", "d", "e"}, + }, + "old quote and space form": { + tags: "'a' 'b' 'c'", + want: []string{"a", "b", "c"}, + }, + + // Normal error cases + "unterminated": { + tags: `"missing closing quote`, + want: []string{}, + wantErr: true, + }, + "unterminated single": { + tags: `'missing closing quote`, + want: []string{}, + wantErr: true, + }, + + // Maybe surprising difference for unterminated quotes, no spaces + "unterminated no spaces": { + tags: `"missing_closing_quote`, + want: []string{"\"missing_closing_quote"}, + }, + "unterminated no spaces single": { + tags: `'missing_closing_quote`, + want: []string{}, + wantErr: true, + }, + + // Permitted but not recommended + "delimiters contiguous spaces": { + tags: "a \t\r\n, b \t\r\nc,d\te\tf", + want: []string{"a", ",", "b", "c,d", "e", "f"}, + }, + "quotes and spaces": { + tags: ` 'one'"two" 'three "four"'`, + want: []string{"one", "two", "three \"four\""}, + }, + "quotes single no spaces": { + tags: `'t1','t2',"t3"`, + want: []string{"t1", ",'t2',\"t3\""}, + }, + "quotes double no spaces": { + tags: `"t1","t2","t3"`, + want: []string{`"t1"`, `"t2"`, `"t3"`}, + }, + } { + t.Run(name, func(t *testing.T) { + f := flag.NewFlagSet("TestTags", flag.ContinueOnError) + var ctxt build.Context + f.Var((*buildutil.TagsFlag)(&ctxt.BuildTags), "tags", buildutil.TagsFlagDoc) + + // Normal case valid parsed tags + f.Parse([]string{"-tags", tc.tags, "rest"}) + + // BuildTags + if !reflect.DeepEqual(ctxt.BuildTags, tc.want) { + t.Errorf("Case = %s, BuildTags = %q, want %q", name, ctxt.BuildTags, tc.want) + } + + // Args() + if want := []string{"rest"}; !reflect.DeepEqual(f.Args(), want) { + t.Errorf("Case = %s, f.Args() = %q, want %q", name, f.Args(), want) + } + + // Regression check against base go tooling + cmd := testenv.Command(t, "go", "list", "-f", "{{context.BuildTags}}", "-tags", tc.tags, ".") + var out bytes.Buffer + cmd.Stdout = &out + if err := cmd.Run(); err != nil { + if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { + t.Logf("stderr:\n%s", ee.Stderr) + } + if !tc.wantErr { + t.Errorf("%v: %v", cmd, err) + } + } else if tc.wantErr { + t.Errorf("Expected failure for %v", cmd) + } else { + wantDescription := strings.Join(tc.want, " ") + output := strings.Trim(strings.TrimSuffix(out.String(), "\n"), "[]") + if output != wantDescription { + t.Errorf("Output = %s, want %s", output, wantDescription) + } + } + }) } } From 1efbdde3661da0346aa536671d183d3bb2ecbee4 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov <dmitshur@golang.org> Date: Wed, 31 Jan 2024 21:36:55 -0500 Subject: [PATCH 072/105] cmd/stringer, go/loader: use testenv.NeedsTool(t, "cgo") Using go env CGO_ENABLED has an advantage over build.Default.CgoEnabled in that it pays attention to whether a C compiler is available in $PATH, so it correctly skips the test when cgo is not enabled in more contexts. I haven't found better docs for this than https://go.dev/doc/go1.20#cgo. Also add this in TestCgoCwdIssue46877, since it requires cgo. Change-Id: Ib14a983cc179b725a98f154846662887a91edc19 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560175 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Matloob <matloob@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> --- cmd/stringer/endtoend_test.go | 9 ++++++--- go/loader/loader_test.go | 1 + go/loader/stdlib_test.go | 6 ++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cmd/stringer/endtoend_test.go b/cmd/stringer/endtoend_test.go index e68b61288f6..2b9afa370c5 100644 --- a/cmd/stringer/endtoend_test.go +++ b/cmd/stringer/endtoend_test.go @@ -13,7 +13,6 @@ import ( "bytes" "flag" "fmt" - "go/build" "io" "os" "path" @@ -50,6 +49,8 @@ func TestMain(m *testing.M) { } func TestEndToEnd(t *testing.T) { + testenv.NeedsTool(t, "go") + stringer := stringerPath(t) // Read the testdata directory. fd, err := os.Open("testdata") @@ -76,8 +77,8 @@ func TestEndToEnd(t *testing.T) { continue } t.Run(name, func(t *testing.T) { - if name == "cgo.go" && !build.Default.CgoEnabled { - t.Skipf("cgo is not enabled for %s", name) + if name == "cgo.go" { + testenv.NeedsTool(t, "cgo") } stringerCompileAndRun(t, t.TempDir(), stringer, typeName(name), name) }) @@ -155,6 +156,8 @@ func TestTags(t *testing.T) { // TestConstValueChange verifies that if a constant value changes and // the stringer code is not regenerated, we'll get a compiler error. func TestConstValueChange(t *testing.T) { + testenv.NeedsTool(t, "go") + stringer := stringerPath(t) dir := t.TempDir() source := filepath.Join(dir, "day.go") diff --git a/go/loader/loader_test.go b/go/loader/loader_test.go index cab2217c3e2..1e0b16e7fc3 100644 --- a/go/loader/loader_test.go +++ b/go/loader/loader_test.go @@ -837,6 +837,7 @@ func loadIO(t *testing.T) { func TestCgoCwdIssue46877(t *testing.T) { testenv.NeedsTool(t, "go") + testenv.NeedsTool(t, "cgo") var conf loader.Config conf.Import("golang.org/x/tools/go/loader/testdata/issue46877") if _, err := conf.Load(); err != nil { diff --git a/go/loader/stdlib_test.go b/go/loader/stdlib_test.go index 83d70dabdca..ef51325e9c8 100644 --- a/go/loader/stdlib_test.go +++ b/go/loader/stdlib_test.go @@ -130,13 +130,11 @@ func TestCgoOption(t *testing.T) { case "darwin": t.Skipf("golang/go#58493: file locations in this test are stale on darwin") } + testenv.NeedsTool(t, "go") // In nocgo builds (e.g. linux-amd64-nocgo), // there is no "runtime/cgo" package, // so cgo-generated Go files will have a failing import. - if !build.Default.CgoEnabled { - return - } - testenv.NeedsTool(t, "go") + testenv.NeedsTool(t, "cgo") // Test that we can load cgo-using packages with // CGO_ENABLED=[01], which causes go/build to select pure From 42507833551bf27d3635e0cc7a475d15b10e41f4 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov <dmitshur@golang.org> Date: Wed, 31 Jan 2024 21:53:00 -0500 Subject: [PATCH 073/105] refactor/eg: don't use cgo in Test From a brief look, it appears to be fine for the purpose of testing eg to use a loader with cgo disabled, which makes this test more portable. Change-Id: I36c26007b5da9dc86214d8894939c3257412afbc Reviewed-on: https://go-review.googlesource.com/c/tools/+/560176 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> --- refactor/eg/eg_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/refactor/eg/eg_test.go b/refactor/eg/eg_test.go index 4154e9a8f4e..36fd3add8a7 100644 --- a/refactor/eg/eg_test.go +++ b/refactor/eg/eg_test.go @@ -12,6 +12,7 @@ package eg_test import ( "bytes" "flag" + "go/build" "go/constant" "go/parser" "go/token" @@ -47,9 +48,12 @@ func Test(t *testing.T) { t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS) } + ctx := build.Default // copy + ctx.CgoEnabled = false // don't use cgo conf := loader.Config{ Fset: token.NewFileSet(), ParserMode: parser.ParseComments, + Build: &ctx, } // Each entry is a single-file package. From afe526599a05761410afebbda97cb7b134e8117f Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Thu, 1 Feb 2024 16:04:51 -0500 Subject: [PATCH 074/105] go/packages: wait for sizes goroutine on all control paths This change ensures that the sizes goroutine created by goListDriver always terminates before the latter function returns. We suspect that the failure to wait in some of the early-return error cases causes the child process to retain a references to the file system that (on Windows) prevented garbage collection of the test's temporary directory. Fixes golang/go#65180 Change-Id: I755ed8956df338e0a53bf08a7451e4e62d08bafc Reviewed-on: https://go-review.googlesource.com/c/tools/+/560478 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Michael Matloob <matloob@golang.org> --- go/packages/golist.go | 19 +++++++++---------- go/packages/packages.go | 5 ++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/go/packages/golist.go b/go/packages/golist.go index 49c2d146727..22305d9c90a 100644 --- a/go/packages/golist.go +++ b/go/packages/golist.go @@ -128,7 +128,7 @@ func (state *golistState) mustGetEnv() map[string]string { // goListDriver uses the go list command to interpret the patterns and produce // the build system package structure. // See driver for more details. -func goListDriver(cfg *Config, patterns ...string) (*DriverResponse, error) { +func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error) { // Make sure that any asynchronous go commands are killed when we return. parentCtx := cfg.Context if parentCtx == nil { @@ -146,16 +146,18 @@ func goListDriver(cfg *Config, patterns ...string) (*DriverResponse, error) { } // Fill in response.Sizes asynchronously if necessary. - var sizeserr error - var sizeswg sync.WaitGroup if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { - sizeswg.Add(1) + errCh := make(chan error) go func() { compiler, arch, err := packagesdriver.GetSizesForArgsGolist(ctx, state.cfgInvocation(), cfg.gocmdRunner) - sizeserr = err response.dr.Compiler = compiler response.dr.Arch = arch - sizeswg.Done() + errCh <- err + }() + defer func() { + if sizesErr := <-errCh; sizesErr != nil { + err = sizesErr + } }() } @@ -208,10 +210,7 @@ extractQueries: } } - sizeswg.Wait() - if sizeserr != nil { - return nil, sizeserr - } + // (We may yet return an error due to defer.) return response.dr, nil } diff --git a/go/packages/packages.go b/go/packages/packages.go index fcdcc370032..f33b0afc22c 100644 --- a/go/packages/packages.go +++ b/go/packages/packages.go @@ -266,7 +266,10 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro } response, err := goListDriver(cfg, patterns...) - return response, false, err + if err != nil { + return nil, false, err + } + return response, false, nil } // A Package describes a loaded Go package. From 44aed241f12130ec75f19e5c7aa32ba9b84e7931 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Thu, 1 Feb 2024 12:42:29 -0500 Subject: [PATCH 075/105] gopls/internal/analysis/undeclaredname: improve fix name This CL changes the name of the fix from "Create variable" to "Create function" when appropriate. Oddly the names of fixes appear to be systematically not covered by our tests. Also tidy up the code. Updates golang/go#47558 Change-Id: Ibbefeb90874d7ce481893cfa401c59a421aad5e4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560475 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- .../analysis/undeclaredname/undeclared.go | 54 ++++++++++++------- .../testdata/suggestedfix/undeclaredfunc.txt | 19 +++++++ 2 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/suggestedfix/undeclaredfunc.txt diff --git a/gopls/internal/analysis/undeclaredname/undeclared.go b/gopls/internal/analysis/undeclaredname/undeclared.go index 70a7baa014a..10393d4a86e 100644 --- a/gopls/internal/analysis/undeclaredname/undeclared.go +++ b/gopls/internal/analysis/undeclaredname/undeclared.go @@ -44,6 +44,7 @@ func run(pass *analysis.Pass) (interface{}, error) { } func runForError(pass *analysis.Pass, err types.Error) { + // Extract symbol name from error. var name string for _, prefix := range undeclaredNamePrefixes { if !strings.HasPrefix(err.Msg, prefix) { @@ -54,6 +55,8 @@ func runForError(pass *analysis.Pass, err types.Error) { if name == "" { return } + + // Find file enclosing error. var file *ast.File for _, f := range pass.Files { if f.Pos() <= err.Pos && err.Pos < f.End() { @@ -65,7 +68,7 @@ func runForError(pass *analysis.Pass, err types.Error) { return } - // Get the path for the relevant range. + // Find path to identifier in the error. path, _ := astutil.PathEnclosingInterval(file, err.Pos, err.Pos) if len(path) < 2 { return @@ -75,6 +78,12 @@ func runForError(pass *analysis.Pass, err types.Error) { return } + // Skip selector expressions because it might be too complex + // to try and provide a suggested fix for fields and methods. + if _, ok := path[1].(*ast.SelectorExpr); ok { + return + } + // Undeclared quick fixes only work in function bodies. inFunc := false for i := range path { @@ -91,24 +100,19 @@ func runForError(pass *analysis.Pass, err types.Error) { if !inFunc { return } - // Skip selector expressions because it might be too complex - // to try and provide a suggested fix for fields and methods. - if _, ok := path[1].(*ast.SelectorExpr); ok { - return - } - tok := pass.Fset.File(file.Pos()) - if tok == nil { - return + + // Offer a fix. + noun := "variable" + if isCallPosition(path) { + noun = "function" } - offset := safetoken.StartPosition(pass.Fset, err.Pos).Offset - end := tok.Pos(offset + len(name)) // TODO(adonovan): dubious! err.Pos + len(name)?? pass.Report(analysis.Diagnostic{ Pos: err.Pos, - End: end, + End: err.Pos + token.Pos(len(name)), Message: err.Msg, Category: FixCategory, SuggestedFixes: []analysis.SuggestedFix{{ - Message: fmt.Sprintf("Create variable %q", name), + Message: fmt.Sprintf("Create %s %q", noun, name), // No TextEdits => computed by a gopls command }}, }) @@ -130,10 +134,8 @@ func SuggestedFix(fset *token.FileSet, start, end token.Pos, content []byte, fil // Check for a possible call expression, in which case we should add a // new function declaration. - if len(path) > 1 { - if _, ok := path[1].(*ast.CallExpr); ok { - return newFunctionDeclaration(path, file, pkg, info, fset) - } + if isCallPosition(path) { + return newFunctionDeclaration(path, file, pkg, info, fset) } // Get the place to insert the new statement. @@ -279,7 +281,8 @@ func newFunctionDeclaration(path []ast.Node, file *ast.File, pkg *types.Package, Name: ast.NewIdent(ident.Name), Type: &ast.FuncType{ Params: params, - // TODO(rstambler): Also handle result parameters here. + // TODO(golang/go#47558): Also handle result + // parameters here based on context of CallExpr. }, Body: &ast.BlockStmt{ List: []ast.Stmt{ @@ -302,7 +305,7 @@ func newFunctionDeclaration(path []ast.Node, file *ast.File, pkg *types.Package, return nil, nil, err } return fset, &analysis.SuggestedFix{ - Message: fmt.Sprintf("Create function \"%s\"", ident.Name), + Message: fmt.Sprintf("Create function %q", ident.Name), TextEdits: []analysis.TextEdit{{ Pos: pos, End: pos, @@ -310,6 +313,7 @@ func newFunctionDeclaration(path []ast.Node, file *ast.File, pkg *types.Package, }}, }, nil } + func typeToArgName(ty types.Type) string { s := types.Default(ty).String() @@ -341,3 +345,15 @@ func typeToArgName(ty types.Type) string { a[0] = unicode.ToLower(a[0]) return string(a) } + +// isCallPosition reports whether the path denotes the subtree in call position, f(). +func isCallPosition(path []ast.Node) bool { + return len(path) > 1 && + is[*ast.CallExpr](path[1]) && + path[1].(*ast.CallExpr).Fun == path[0] +} + +func is[T any](x any) bool { + _, ok := x.(T) + return ok +} diff --git a/gopls/internal/test/marker/testdata/suggestedfix/undeclaredfunc.txt b/gopls/internal/test/marker/testdata/suggestedfix/undeclaredfunc.txt new file mode 100644 index 00000000000..d54dcae073f --- /dev/null +++ b/gopls/internal/test/marker/testdata/suggestedfix/undeclaredfunc.txt @@ -0,0 +1,19 @@ +This test checks the quick fix for "undeclared: f" that declares the +missing function. See #47558. + +TODO(adonovan): infer the result variables from the context (int, in this case). + +-- a.go -- +package a + +func _() int { return f(1, "") } //@suggestedfix(re"f.1", re"unde(fined|clared name): f", x) + +-- @x/a.go -- +@@ -3 +3 @@ +-func _() int { return f(1, "") } //@suggestedfix(re"f.1", re"unde(fined|clared name): f", x) ++func _() int { return f(1, "") } +@@ -5 +5,4 @@ ++func f(i int, s string) { ++ panic("unimplemented") ++} //@suggestedfix(re"f.1", re"unde(fined|clared name): f", x) ++ From c07f927657b63cf0184563d8be7cd3fc34023645 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 14:16:56 -0500 Subject: [PATCH 076/105] cmd/deadcode: enable crash reporting Change-Id: I07fe6e5d3058867c2a8c6df7688cc5395700d918 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559459 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> --- cmd/deadcode/deadcode.go | 5 +++++ go.mod | 5 +++++ go.sum | 4 ++++ gopls/go.mod | 2 +- gopls/go.sum | 4 ++-- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd/deadcode/deadcode.go b/cmd/deadcode/deadcode.go index da1c2049538..49f34ca4d62 100644 --- a/cmd/deadcode/deadcode.go +++ b/cmd/deadcode/deadcode.go @@ -26,6 +26,8 @@ import ( "strings" "text/template" + "golang.org/x/telemetry/counter" + "golang.org/x/telemetry/crashmonitor" "golang.org/x/tools/go/callgraph" "golang.org/x/tools/go/callgraph/rta" "golang.org/x/tools/go/packages" @@ -62,6 +64,9 @@ Flags: } func main() { + counter.Open() // Enable telemetry counter writing. + crashmonitor.Start() // Enable crash reporting watchdog. + log.SetPrefix("deadcode: ") log.SetFlags(0) // no time prefix diff --git a/go.mod b/go.mod index 8cf0ccc7da7..fb7bcfcd998 100644 --- a/go.mod +++ b/go.mod @@ -9,3 +9,8 @@ require ( ) require golang.org/x/sync v0.6.0 + +require ( + golang.org/x/sys v0.16.0 // indirect + golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509 +) diff --git a/go.sum b/go.sum index cc5534add2c..f30cef77493 100644 --- a/go.sum +++ b/go.sum @@ -6,3 +6,7 @@ golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509 h1:Nr7eTQpQZ/ytesxDJpQgaf0t4sdLnnDtAbmtViTrSUo= +golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509/go.mod h1:ZthVHHkOi8rlMEsfFr3Ie42Ym1NonbFNNRKW3ci0UrU= diff --git a/gopls/go.mod b/gopls/go.mod index a5bad1862fb..6a52b208f18 100644 --- a/gopls/go.mod +++ b/gopls/go.mod @@ -8,7 +8,7 @@ require ( github.com/jba/templatecheck v0.6.0 golang.org/x/mod v0.14.0 golang.org/x/sync v0.6.0 - golang.org/x/telemetry v0.0.0-20240129174054-04287971b166 + golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509 golang.org/x/text v0.14.0 golang.org/x/tools v0.13.1-0.20230920233436-f9b8da7b22be golang.org/x/vuln v1.0.1 diff --git a/gopls/go.sum b/gopls/go.sum index 54fb1614caa..277fd1b590b 100644 --- a/gopls/go.sum +++ b/gopls/go.sum @@ -34,8 +34,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240129174054-04287971b166 h1:REpn7wXSoZ5E/m9WEOJ1gV+LunqO74p5l21rQ0HgWwo= -golang.org/x/telemetry v0.0.0-20240129174054-04287971b166/go.mod h1:ZthVHHkOi8rlMEsfFr3Ie42Ym1NonbFNNRKW3ci0UrU= +golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509 h1:Nr7eTQpQZ/ytesxDJpQgaf0t4sdLnnDtAbmtViTrSUo= +golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509/go.mod h1:ZthVHHkOi8rlMEsfFr3Ie42Ym1NonbFNNRKW3ci0UrU= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 2e15dc7cd66acafcfca99b361dcddfb9e25286a9 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 12:15:38 -0500 Subject: [PATCH 077/105] gopls/internal/test/marker: reject "module testdata" Updates golang/go#65406 Change-Id: I1ce4e4d94f118c4b51dc52d624d90e2f7e05f048 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559457 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/test/marker/marker_test.go | 9 +++++++++ .../testdata/codeaction/extract-variadic-63287.txt | 2 +- .../test/marker/testdata/codeaction/inline.txt | 2 +- .../test/marker/testdata/codeaction/issue64558.txt | 2 +- .../internal/test/marker/testdata/hover/methods.txt | 10 +++++----- .../internal/test/marker/testdata/rename/doclink.txt | 8 ++++---- .../test/marker/testdata/signature/issue63804.txt | 2 +- .../test/marker/testdata/suggestedfix/issue65024.txt | 12 ++++++------ 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 5de4408f141..18c97000762 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -698,6 +698,15 @@ func loadMarkerTest(name string, content []byte) (*markerTest, error) { return nil, fmt.Errorf("%s:%d: unwanted space before marker (// @)", file.Name, line) } + // The 'go list' command doesn't work correct with modules named + // testdata", so don't allow it as a module name (golang/go#65406). + // (Otherwise files within it will end up in an ad hoc + // package, "command-line-arguments/$TMPDIR/...".) + if filepath.Base(file.Name) == "go.mod" && + bytes.Contains(file.Data, []byte("module testdata")) { + return nil, fmt.Errorf("'testdata' is not a valid module name") + } + test.notes = append(test.notes, notes...) test.files[file.Name] = file.Data } diff --git a/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt b/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt index 756a88a4f78..d5dbe931226 100644 --- a/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt +++ b/gopls/internal/test/marker/testdata/codeaction/extract-variadic-63287.txt @@ -3,7 +3,7 @@ It is a regression test for bug #63287 in which the final paramater's "..." would go missing. -- go.mod -- -module testdata +module example.com go 1.18 -- a/a.go -- diff --git a/gopls/internal/test/marker/testdata/codeaction/inline.txt b/gopls/internal/test/marker/testdata/codeaction/inline.txt index 813a69ce09c..339a05b0c41 100644 --- a/gopls/internal/test/marker/testdata/codeaction/inline.txt +++ b/gopls/internal/test/marker/testdata/codeaction/inline.txt @@ -1,7 +1,7 @@ This is a minimal test of the refactor.inline code action. -- go.mod -- -module testdata/codeaction +module example.com/codeaction go 1.18 -- a/a.go -- diff --git a/gopls/internal/test/marker/testdata/codeaction/issue64558.txt b/gopls/internal/test/marker/testdata/codeaction/issue64558.txt index 71d966159f8..59aaffba371 100644 --- a/gopls/internal/test/marker/testdata/codeaction/issue64558.txt +++ b/gopls/internal/test/marker/testdata/codeaction/issue64558.txt @@ -1,7 +1,7 @@ Test of an inlining failure due to an ill-typed input program (#64558). -- go.mod -- -module testdata +module example.com go 1.18 -- a/a.go -- diff --git a/gopls/internal/test/marker/testdata/hover/methods.txt b/gopls/internal/test/marker/testdata/hover/methods.txt index 101a719795d..8af22494f75 100644 --- a/gopls/internal/test/marker/testdata/hover/methods.txt +++ b/gopls/internal/test/marker/testdata/hover/methods.txt @@ -9,7 +9,7 @@ Observe that: - only accessible methods are shown. -- go.mod -- -module testdata +module example.com -- lib/lib.go -- package lib @@ -31,7 +31,7 @@ func (s *S) pb() {} -- a/a.go -- package a -import "testdata/lib" +import "example.com/lib" var _ lib.I //@hover("I", "I", I) var _ lib.J //@hover("J", "J", J) @@ -50,13 +50,13 @@ type I interface { func (lib.J) C() ``` -[`lib.I` on pkg.go.dev](https://pkg.go.dev/testdata/lib#I) +[`lib.I` on pkg.go.dev](https://pkg.go.dev/example.com/lib#I) -- @J -- ```go type J interface{ C() } ``` -[`lib.J` on pkg.go.dev](https://pkg.go.dev/testdata/lib#J) +[`lib.J` on pkg.go.dev](https://pkg.go.dev/example.com/lib#J) -- @S -- ```go type S struct{ I } @@ -68,4 +68,4 @@ func (lib.J) C() func (s *lib.S) PA() ``` -[`lib.S` on pkg.go.dev](https://pkg.go.dev/testdata/lib#S) +[`lib.S` on pkg.go.dev](https://pkg.go.dev/example.com/lib#S) diff --git a/gopls/internal/test/marker/testdata/rename/doclink.txt b/gopls/internal/test/marker/testdata/rename/doclink.txt index 1461f6f13b3..d4e9f96891e 100644 --- a/gopls/internal/test/marker/testdata/rename/doclink.txt +++ b/gopls/internal/test/marker/testdata/rename/doclink.txt @@ -1,7 +1,7 @@ This test checks that doc links are also handled correctly (golang/go#64495). -- go.mod -- -module testdata +module example.com go 1.21 @@ -35,7 +35,7 @@ func (E[T]) Foo() {} //@rename("Foo", "Bar", EFooToEBar) -- b/b.go -- package b -import aa "testdata/a" //@rename("aa", "a", pkgRename) +import aa "example.com/a" //@rename("aa", "a", pkgRename) // FooBar just for test [aa.Foo] [aa.A] [aa.B] [aa.C] [aa.C.F] [aa.C.PF] // reference pointer type [*aa.D] @@ -124,8 +124,8 @@ func FooBar() { +// FooBar just for test [aa.Foo] [aa.A] [aa.B] [aa.C] [aa.C.F] [aa.C.PFF] -- @pkgRename/b/b.go -- @@ -3 +3 @@ --import aa "testdata/a" //@rename("aa", "a", pkgRename) -+import "testdata/a" //@rename("aa", "a", pkgRename) +-import aa "example.com/a" //@rename("aa", "a", pkgRename) ++import "example.com/a" //@rename("aa", "a", pkgRename) @@ -5,3 +5,3 @@ -// FooBar just for test [aa.Foo] [aa.A] [aa.B] [aa.C] [aa.C.F] [aa.C.PF] -// reference pointer type [*aa.D] diff --git a/gopls/internal/test/marker/testdata/signature/issue63804.txt b/gopls/internal/test/marker/testdata/signature/issue63804.txt index 4ed952956f9..b65183391ef 100644 --- a/gopls/internal/test/marker/testdata/signature/issue63804.txt +++ b/gopls/internal/test/marker/testdata/signature/issue63804.txt @@ -4,7 +4,7 @@ the server's Signature method never returns an actual error, so the best we can assert is that there is no result. -- go.mod -- -module testdata +module example.com go 1.18 -- a/a.go -- diff --git a/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt index d3cdb4553ef..afdfce9f1cc 100644 --- a/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt +++ b/gopls/internal/test/marker/testdata/suggestedfix/issue65024.txt @@ -1,11 +1,11 @@ -Regression test for #65024, "incorrect package qualification when +Regression example.com for #65024, "incorrect package qualification when stubbing method in v2 module". The second test (a-a) ensures that we don't use path-based heuristics to guess the PkgName of an import. -- a/v2/go.mod -- -module testdata/a/v2 +module example.com/a/v2 go 1.18 -- a/v2/a.go -- @@ -18,7 +18,7 @@ type T struct {} -- a/v2/b/b.go -- package b -import "testdata/a/v2" +import "example.com/a/v2" type B struct{} @@ -40,7 +40,7 @@ var _ a.I = &B{} //@ suggestedfix("&B{}", re"does not implement", out) // It won't do to use it as an identifier. // The correct name is the one in the package decl, // which in this case is not what the path heuristic would guess. -module testdata/a-a/v2 +module example.com/a-a/v2 go 1.18 -- a-a/v2/a.go -- @@ -61,12 +61,12 @@ var _ I = &B{} //@ suggestedfix("&B{}", re"does not implement", out2) -- a-a/v2/b/import-a-I.go -- package b -import "testdata/a-a/v2" +import "example.com/a-a/v2" type I = a.I -- @out2/a-a/v2/b/b.go -- @@ -3 +3,2 @@ -+import a "testdata/a-a/v2" ++import a "example.com/a-a/v2" + @@ -7 +9,5 @@ +// F implements a.I. From d07788857701efc39afa25a5a58330caa0d200dd Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 29 Jan 2024 14:32:52 -0500 Subject: [PATCH 078/105] gopls: update third party dependencies Update gofumpt, xurls, and staticcheck. Also update hooks and tests according to their version support. Change-Id: I62c1424b1640563cf56fe8956e099cb026ea8f92 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559220 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/go.mod | 10 +-- gopls/go.sum | 30 ++++----- gopls/internal/hooks/analysis_119.go | 58 ++--------------- gopls/internal/hooks/analysis_120.go | 62 +++++++++++++++++++ gopls/internal/hooks/gofumpt_117.go | 11 ---- .../hooks/{analysis_116.go => gofumpt_119.go} | 7 +-- .../hooks/{gofumpt_118.go => gofumpt_120.go} | 4 +- ...ofumpt_118_test.go => gofumpt_120_test.go} | 4 +- .../integration/misc/configuration_test.go | 6 +- .../test/integration/misc/formatting_test.go | 3 +- .../test/integration/misc/staticcheck_test.go | 4 +- .../marker/testdata/format/issue59554.txt | 5 +- 12 files changed, 101 insertions(+), 103 deletions(-) create mode 100644 gopls/internal/hooks/analysis_120.go delete mode 100644 gopls/internal/hooks/gofumpt_117.go rename gopls/internal/hooks/{analysis_116.go => gofumpt_119.go} (64%) rename gopls/internal/hooks/{gofumpt_118.go => gofumpt_120.go} (98%) rename gopls/internal/hooks/{gofumpt_118_test.go => gofumpt_120_test.go} (97%) diff --git a/gopls/go.mod b/gopls/go.mod index 6a52b208f18..bafca530086 100644 --- a/gopls/go.mod +++ b/gopls/go.mod @@ -3,19 +3,19 @@ module golang.org/x/tools/gopls go 1.18 require ( - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/jba/printsrc v0.2.2 github.com/jba/templatecheck v0.6.0 golang.org/x/mod v0.14.0 golang.org/x/sync v0.6.0 golang.org/x/telemetry v0.0.0-20240201224847-0a1d30dda509 golang.org/x/text v0.14.0 - golang.org/x/tools v0.13.1-0.20230920233436-f9b8da7b22be + golang.org/x/tools v0.17.0 golang.org/x/vuln v1.0.1 gopkg.in/yaml.v3 v3.0.1 - honnef.co/go/tools v0.4.5 - mvdan.cc/gofumpt v0.4.0 - mvdan.cc/xurls/v2 v2.4.0 + honnef.co/go/tools v0.4.6 + mvdan.cc/gofumpt v0.6.0 + mvdan.cc/xurls/v2 v2.5.0 ) require ( diff --git a/gopls/go.sum b/gopls/go.sum index 277fd1b590b..df5d3a49162 100644 --- a/gopls/go.sum +++ b/gopls/go.sum @@ -1,8 +1,8 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8= github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= @@ -10,14 +10,9 @@ github.com/jba/printsrc v0.2.2 h1:9OHK51UT+/iMAEBlQIIXW04qvKyF3/vvLuwW/hL8tDU= github.com/jba/printsrc v0.2.2/go.mod h1:1xULjw59sL0dPdWpDoVU06TIEO/Wnfv6AHRpiElTwYM= github.com/jba/templatecheck v0.6.0 h1:SwM8C4hlK/YNLsdcXStfnHWE2HKkuTVwy5FKQHt5ro8= github.com/jba/templatecheck v0.6.0/go.mod h1:/1k7EajoSErFI9GLHAsiIJEaNLt3ALKNw2TV7z2SYv4= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y= @@ -27,7 +22,6 @@ golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -45,15 +39,13 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/vuln v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= golang.org/x/vuln v1.0.1/go.mod h1:bb2hMwln/tqxg32BNY4CcxHWtHXuYa3SbIBmtsyjxtM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.4.5 h1:YGD4H+SuIOOqsyoLOpZDWcieM28W47/zRO7f+9V3nvo= -honnef.co/go/tools v0.4.5/go.mod h1:GUV+uIBCLpdf0/v6UhHHG/yzI/z6qPskBeQCjcNB96k= -mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= -mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= -mvdan.cc/xurls/v2 v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc= -mvdan.cc/xurls/v2 v2.4.0/go.mod h1:+GEjq9uNjqs8LQfM9nVnM8rff0OQ5Iash5rzX+N1CSg= +honnef.co/go/tools v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= +honnef.co/go/tools v0.4.6/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= +mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= +mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= diff --git a/gopls/internal/hooks/analysis_119.go b/gopls/internal/hooks/analysis_119.go index 0b88259f98b..8fc7b461a73 100644 --- a/gopls/internal/hooks/analysis_119.go +++ b/gopls/internal/hooks/analysis_119.go @@ -1,62 +1,14 @@ -// Copyright 2019 The Go Authors. All rights reserved. +// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.19 -// +build go1.19 +//go:build !go1.20 +// +build !go1.20 package hooks -import ( - "golang.org/x/tools/gopls/internal/protocol" - "golang.org/x/tools/gopls/internal/settings" - "honnef.co/go/tools/analysis/lint" - "honnef.co/go/tools/quickfix" - "honnef.co/go/tools/simple" - "honnef.co/go/tools/staticcheck" - "honnef.co/go/tools/stylecheck" -) +import "golang.org/x/tools/gopls/internal/settings" func updateAnalyzers(options *settings.Options) { - options.StaticcheckSupported = true - - mapSeverity := func(severity lint.Severity) protocol.DiagnosticSeverity { - switch severity { - case lint.SeverityError: - return protocol.SeverityError - case lint.SeverityDeprecated: - // TODO(dh): in LSP, deprecated is a tag, not a severity. - // We'll want to support this once we enable SA5011. - return protocol.SeverityWarning - case lint.SeverityWarning: - return protocol.SeverityWarning - case lint.SeverityInfo: - return protocol.SeverityInformation - case lint.SeverityHint: - return protocol.SeverityHint - default: - return protocol.SeverityWarning - } - } - add := func(analyzers []*lint.Analyzer, skip map[string]struct{}) { - for _, a := range analyzers { - if _, ok := skip[a.Analyzer.Name]; ok { - continue - } - - enabled := !a.Doc.NonDefault - options.AddStaticcheckAnalyzer(a.Analyzer, enabled, mapSeverity(a.Doc.Severity)) - } - } - - add(simple.Analyzers, nil) - add(staticcheck.Analyzers, map[string]struct{}{ - // This check conflicts with the vet printf check (golang/go#34494). - "SA5009": {}, - // This check relies on facts from dependencies, which - // we don't currently compute. - "SA5011": {}, - }) - add(stylecheck.Analyzers, nil) - add(quickfix.Analyzers, nil) + options.StaticcheckSupported = false } diff --git a/gopls/internal/hooks/analysis_120.go b/gopls/internal/hooks/analysis_120.go new file mode 100644 index 00000000000..cded05eb4a6 --- /dev/null +++ b/gopls/internal/hooks/analysis_120.go @@ -0,0 +1,62 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 +// +build go1.20 + +package hooks + +import ( + "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/settings" + "honnef.co/go/tools/analysis/lint" + "honnef.co/go/tools/quickfix" + "honnef.co/go/tools/simple" + "honnef.co/go/tools/staticcheck" + "honnef.co/go/tools/stylecheck" +) + +func updateAnalyzers(options *settings.Options) { + options.StaticcheckSupported = true + + mapSeverity := func(severity lint.Severity) protocol.DiagnosticSeverity { + switch severity { + case lint.SeverityError: + return protocol.SeverityError + case lint.SeverityDeprecated: + // TODO(dh): in LSP, deprecated is a tag, not a severity. + // We'll want to support this once we enable SA5011. + return protocol.SeverityWarning + case lint.SeverityWarning: + return protocol.SeverityWarning + case lint.SeverityInfo: + return protocol.SeverityInformation + case lint.SeverityHint: + return protocol.SeverityHint + default: + return protocol.SeverityWarning + } + } + add := func(analyzers []*lint.Analyzer, skip map[string]struct{}) { + for _, a := range analyzers { + if _, ok := skip[a.Analyzer.Name]; ok { + continue + } + + enabled := !a.Doc.NonDefault + options.AddStaticcheckAnalyzer(a.Analyzer, enabled, mapSeverity(a.Doc.Severity)) + } + } + + add(simple.Analyzers, nil) + add(staticcheck.Analyzers, map[string]struct{}{ + // This check conflicts with the vet printf check (golang/go#34494). + "SA5009": {}, + // This check relies on facts from dependencies, which + // we don't currently compute. + "SA5011": {}, + }) + add(stylecheck.Analyzers, nil) + add(quickfix.Analyzers, nil) +} diff --git a/gopls/internal/hooks/gofumpt_117.go b/gopls/internal/hooks/gofumpt_117.go deleted file mode 100644 index 59c71d05144..00000000000 --- a/gopls/internal/hooks/gofumpt_117.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.18 -// +build !go1.18 - -package hooks - -func updateGofumpt(options *golang.Options) { -} diff --git a/gopls/internal/hooks/analysis_116.go b/gopls/internal/hooks/gofumpt_119.go similarity index 64% rename from gopls/internal/hooks/analysis_116.go rename to gopls/internal/hooks/gofumpt_119.go index 4ac32f35c66..d5bc98794f6 100644 --- a/gopls/internal/hooks/analysis_116.go +++ b/gopls/internal/hooks/gofumpt_119.go @@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !go1.19 -// +build !go1.19 +//go:build !go1.20 +// +build !go1.20 package hooks import "golang.org/x/tools/gopls/internal/settings" -func updateAnalyzers(options *settings.Options) { - options.StaticcheckSupported = false +func updateGofumpt(options *settings.Options) { } diff --git a/gopls/internal/hooks/gofumpt_118.go b/gopls/internal/hooks/gofumpt_120.go similarity index 98% rename from gopls/internal/hooks/gofumpt_118.go rename to gopls/internal/hooks/gofumpt_120.go index a81444e1ef3..9ac2465efda 100644 --- a/gopls/internal/hooks/gofumpt_118.go +++ b/gopls/internal/hooks/gofumpt_120.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.18 -// +build go1.18 +//go:build go1.20 +// +build go1.20 package hooks diff --git a/gopls/internal/hooks/gofumpt_118_test.go b/gopls/internal/hooks/gofumpt_120_test.go similarity index 97% rename from gopls/internal/hooks/gofumpt_118_test.go rename to gopls/internal/hooks/gofumpt_120_test.go index 838ce73176c..bb674980e1b 100644 --- a/gopls/internal/hooks/gofumpt_118_test.go +++ b/gopls/internal/hooks/gofumpt_120_test.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.18 -// +build go1.18 +//go:build go1.20 +// +build go1.20 package hooks diff --git a/gopls/internal/test/integration/misc/configuration_test.go b/gopls/internal/test/integration/misc/configuration_test.go index c8cdc5334c5..b924f9de330 100644 --- a/gopls/internal/test/integration/misc/configuration_test.go +++ b/gopls/internal/test/integration/misc/configuration_test.go @@ -18,7 +18,7 @@ func TestChangeConfiguration(t *testing.T) { // Staticcheck only supports Go versions >= 1.19. // Note: keep this in sync with TestStaticcheckWarning. Below this version we // should get an error when setting staticcheck configuration. - testenv.NeedsGo1Point(t, 19) + testenv.NeedsGo1Point(t, 20) const files = ` -- go.mod -- @@ -55,7 +55,7 @@ var FooErr = errors.New("foo") // // Gopls should not get confused about buffer content when recreating the view. func TestMajorOptionsChange(t *testing.T) { - testenv.NeedsGo1Point(t, 19) // needs staticcheck + testenv.NeedsGo1Point(t, 20) // needs staticcheck const files = ` -- go.mod -- @@ -96,7 +96,7 @@ var ErrFoo = errors.New("foo") func TestStaticcheckWarning(t *testing.T) { // Note: keep this in sync with TestChangeConfiguration. - testenv.SkipAfterGo1Point(t, 16) + testenv.SkipAfterGo1Point(t, 19) const files = ` -- go.mod -- diff --git a/gopls/internal/test/integration/misc/formatting_test.go b/gopls/internal/test/integration/misc/formatting_test.go index 8fb3ac6f90c..1808dbc8791 100644 --- a/gopls/internal/test/integration/misc/formatting_test.go +++ b/gopls/internal/test/integration/misc/formatting_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/gopls/internal/test/compare" + . "golang.org/x/tools/gopls/internal/test/integration" "golang.org/x/tools/internal/testenv" ) @@ -303,6 +303,7 @@ func main() { } func TestGofumptFormatting(t *testing.T) { + testenv.NeedsGo1Point(t, 20) // gofumpt requires go 1.20+ // Exercise some gofumpt formatting rules: // - No empty lines following an assignment operator // - Octal integer literals should use the 0o prefix on modules using Go diff --git a/gopls/internal/test/integration/misc/staticcheck_test.go b/gopls/internal/test/integration/misc/staticcheck_test.go index 535458e925f..6c7a156f189 100644 --- a/gopls/internal/test/integration/misc/staticcheck_test.go +++ b/gopls/internal/test/integration/misc/staticcheck_test.go @@ -13,7 +13,7 @@ import ( ) func TestStaticcheckGenerics(t *testing.T) { - testenv.NeedsGo1Point(t, 19) // generics were introduced in Go 1.18, staticcheck requires go1.19+ + testenv.NeedsGo1Point(t, 20) // staticcheck requires go1.20+ const files = ` -- go.mod -- @@ -78,7 +78,7 @@ var FooErr error = errors.New("foo") // Test for golang/go#56270: an analysis with related info should not panic if // analysis.RelatedInformation.End is not set. func TestStaticcheckRelatedInfo(t *testing.T) { - testenv.NeedsGo1Point(t, 19) // staticcheck is only supported at Go 1.19+ + testenv.NeedsGo1Point(t, 20) // staticcheck is only supported at Go 1.20+ const files = ` -- go.mod -- module mod.test diff --git a/gopls/internal/test/marker/testdata/format/issue59554.txt b/gopls/internal/test/marker/testdata/format/issue59554.txt index aa6c2aa02a4..816c9d1e06f 100644 --- a/gopls/internal/test/marker/testdata/format/issue59554.txt +++ b/gopls/internal/test/marker/testdata/format/issue59554.txt @@ -4,7 +4,10 @@ directives. Note that gofumpt is needed for this test case, as it reformats var decls into short var decls. -Note that gofumpt requires Go 1.18. +Note that gofumpt requires Go 1.20. + +-- flags -- +-min_go=go1.20 -- settings.json -- { From e211e0f099a6323aed48db04ac3bf96bc406b4f5 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 24 Jan 2024 18:00:21 -0500 Subject: [PATCH 079/105] gopls: enable crashmonitor for unexpected crashes This change enables the crash monitor in gopls, so that it increments a telemetry counter for the stack any time the Go runtime crashes. x/telemetry cannot be built with go1.18, which gopls still supports (though not for long). So we must ensure that there are no direct references to x/telemetry from gopls; all references must go through the build-tagged non-functional shims, which avoids the dependency. Also, internal/telemetry can no longer depend on protocol, to avoid a cycle via protocol -> bug -> telemetry. Updates golang/go#42888 Change-Id: I7a57b9a93ab76a58ec6dd73f895d4b42ed29ea86 Reviewed-on: https://go-review.googlesource.com/c/tools/+/558256 Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/protocol/generate/main.go | 16 +--- gopls/internal/protocol/protocol.go | 16 ++++ gopls/internal/protocol/tsclient.go | 8 +- gopls/internal/protocol/tsserver.go | 8 +- gopls/internal/server/general.go | 6 +- gopls/internal/telemetry/telemetry.go | 89 +++++++++++++-------- gopls/internal/telemetry/telemetry_go118.go | 20 ++++- gopls/internal/util/bug/bug.go | 4 +- gopls/main.go | 5 +- 9 files changed, 102 insertions(+), 70 deletions(-) diff --git a/gopls/internal/protocol/generate/main.go b/gopls/internal/protocol/generate/main.go index cf89a528edf..f70c5810d6c 100644 --- a/gopls/internal/protocol/generate/main.go +++ b/gopls/internal/protocol/generate/main.go @@ -100,7 +100,6 @@ func writeclient() { `import ( "context" - "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/jsonrpc2" ) `) @@ -110,12 +109,7 @@ func writeclient() { } out.WriteString("}\n\n") out.WriteString(`func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, r jsonrpc2.Request) (bool, error) { - defer func() { - if x := recover(); x != nil { - bug.Reportf("client panic in %s request", r.Method()) - panic(x) - } - }() + defer recoverHandlerPanic(r.Method()) switch r.Method() { `) for _, k := range ccases.keys() { @@ -144,7 +138,6 @@ func writeserver() { `import ( "context" - "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/jsonrpc2" ) `) @@ -156,12 +149,7 @@ func writeserver() { } func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, r jsonrpc2.Request) (bool, error) { - defer func() { - if x := recover(); x != nil { - bug.Reportf("server panic in %s request", r.Method()) - panic(x) - } - }() + defer recoverHandlerPanic(r.Method()) switch r.Method() { `) for _, k := range scases.keys() { diff --git a/gopls/internal/protocol/protocol.go b/gopls/internal/protocol/protocol.go index 76a932bf850..09bfaca2e86 100644 --- a/gopls/internal/protocol/protocol.go +++ b/gopls/internal/protocol/protocol.go @@ -11,6 +11,8 @@ import ( "fmt" "io" + "golang.org/x/tools/gopls/internal/telemetry" + "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/jsonrpc2" jsonrpc2_v2 "golang.org/x/tools/internal/jsonrpc2_v2" @@ -295,3 +297,17 @@ func NonNilSlice[T comparable](x []T) []T { } return x } + +func recoverHandlerPanic(method string) { + // Report panics in the handler goroutine, + // unless we have enabled the monitor, + // which reports all crashes. + if !telemetry.CrashMonitorSupported() { + defer func() { + if x := recover(); x != nil { + bug.Reportf("panic in %s request", method) + panic(x) + } + }() + } +} diff --git a/gopls/internal/protocol/tsclient.go b/gopls/internal/protocol/tsclient.go index b581a2cfe16..651c6796fb0 100644 --- a/gopls/internal/protocol/tsclient.go +++ b/gopls/internal/protocol/tsclient.go @@ -13,7 +13,6 @@ package protocol import ( "context" - "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/jsonrpc2" ) @@ -41,12 +40,7 @@ type Client interface { } func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, r jsonrpc2.Request) (bool, error) { - defer func() { - if x := recover(); x != nil { - bug.Reportf("client panic in %s request", r.Method()) - panic(x) - } - }() + defer recoverHandlerPanic(r.Method()) switch r.Method() { case "$/logTrace": var params LogTraceParams diff --git a/gopls/internal/protocol/tsserver.go b/gopls/internal/protocol/tsserver.go index 01511552c14..f667da4e490 100644 --- a/gopls/internal/protocol/tsserver.go +++ b/gopls/internal/protocol/tsserver.go @@ -13,7 +13,6 @@ package protocol import ( "context" - "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/internal/jsonrpc2" ) @@ -95,12 +94,7 @@ type Server interface { } func serverDispatch(ctx context.Context, server Server, reply jsonrpc2.Replier, r jsonrpc2.Request) (bool, error) { - defer func() { - if x := recover(); x != nil { - bug.Reportf("server panic in %s request", r.Method()) - panic(x) - } - }() + defer recoverHandlerPanic(r.Method()) switch r.Method() { case "$/progress": var params ProgressParams diff --git a/gopls/internal/server/general.go b/gopls/internal/server/general.go index 250b9f8495c..9f5e2b098b8 100644 --- a/gopls/internal/server/general.go +++ b/gopls/internal/server/general.go @@ -37,7 +37,11 @@ func (s *server) Initialize(ctx context.Context, params *protocol.ParamInitializ ctx, done := event.Start(ctx, "lsp.Server.initialize") defer done() - telemetry.RecordClientInfo(params) + var clientName string + if params != nil && params.ClientInfo != nil { + clientName = params.ClientInfo.Name + } + telemetry.RecordClientInfo(clientName) s.stateMu.Lock() if s.state >= serverInitializing { diff --git a/gopls/internal/telemetry/telemetry.go b/gopls/internal/telemetry/telemetry.go index 8e7d12f4e92..deab5d22eb1 100644 --- a/gopls/internal/telemetry/telemetry.go +++ b/gopls/internal/telemetry/telemetry.go @@ -12,10 +12,30 @@ import ( "golang.org/x/telemetry" "golang.org/x/telemetry/counter" + "golang.org/x/telemetry/crashmonitor" "golang.org/x/telemetry/upload" - "golang.org/x/tools/gopls/internal/protocol" ) +// CounterOpen calls [counter.Open]. +func CounterOpen() { + counter.Open() +} + +// StartCrashMonitor calls [crashmonitor.Start]. +func StartCrashMonitor() { + crashmonitor.Start() +} + +// CrashMonitorSupported calls [crashmonitor.Supported]. +func CrashMonitorSupported() bool { + return crashmonitor.Supported() +} + +// NewStackCounter calls [counter.NewStack]. +func NewStackCounter(name string, depth int) *counter.StackCounter { + return counter.NewStack(name, depth) +} + // Mode calls x/telemetry.Mode. func Mode() string { return telemetry.Mode() @@ -32,41 +52,42 @@ func Upload() { } // RecordClientInfo records gopls client info. -func RecordClientInfo(params *protocol.ParamInitialize) { - client := "gopls/client:other" - if params != nil && params.ClientInfo != nil { - switch params.ClientInfo.Name { - case "Visual Studio Code": - client = "gopls/client:vscode" - case "Visual Studio Code - Insiders": - client = "gopls/client:vscode-insiders" - case "VSCodium": - client = "gopls/client:vscodium" - case "code-server": - // https://github.com/coder/code-server/blob/3cb92edc76ecc2cfa5809205897d93d4379b16a6/ci/build/build-vscode.sh#L19 - client = "gopls/client:code-server" - case "Eglot": - // https://lists.gnu.org/archive/html/bug-gnu-emacs/2023-03/msg00954.html - client = "gopls/client:eglot" - case "govim": - // https://github.com/govim/govim/pull/1189 - client = "gopls/client:govim" - case "Neovim": - // https://github.com/neovim/neovim/blob/42333ea98dfcd2994ee128a3467dfe68205154cd/runtime/lua/vim/lsp.lua#L1361 - client = "gopls/client:neovim" - case "coc.nvim": - // https://github.com/neoclide/coc.nvim/blob/3dc6153a85ed0f185abec1deb972a66af3fbbfb4/src/language-client/client.ts#L994 - client = "gopls/client:coc.nvim" - case "Sublime Text LSP": - // https://github.com/sublimelsp/LSP/blob/e608f878e7e9dd34aabe4ff0462540fadcd88fcc/plugin/core/sessions.py#L493 - client = "gopls/client:sublimetext" - default: - // at least accumulate the client name locally - counter.New(fmt.Sprintf("gopls/client-other:%s", params.ClientInfo.Name)).Inc() - // but also record client:other +func RecordClientInfo(clientName string) { + key := "gopls/client:other" + switch clientName { + case "Visual Studio Code": + key = "gopls/client:vscode" + case "Visual Studio Code - Insiders": + key = "gopls/client:vscode-insiders" + case "VSCodium": + key = "gopls/client:vscodium" + case "code-server": + // https://github.com/coder/code-server/blob/3cb92edc76ecc2cfa5809205897d93d4379b16a6/ci/build/build-vscode.sh#L19 + key = "gopls/client:code-server" + case "Eglot": + // https://lists.gnu.org/archive/html/bug-gnu-emacs/2023-03/msg00954.html + key = "gopls/client:eglot" + case "govim": + // https://github.com/govim/govim/pull/1189 + key = "gopls/client:govim" + case "Neovim": + // https://github.com/neovim/neovim/blob/42333ea98dfcd2994ee128a3467dfe68205154cd/runtime/lua/vim/lsp.lua#L1361 + key = "gopls/client:neovim" + case "coc.nvim": + // https://github.com/neoclide/coc.nvim/blob/3dc6153a85ed0f185abec1deb972a66af3fbbfb4/src/language-client/client.ts#L994 + key = "gopls/client:coc.nvim" + case "Sublime Text LSP": + // https://github.com/sublimelsp/LSP/blob/e608f878e7e9dd34aabe4ff0462540fadcd88fcc/plugin/core/sessions.py#L493 + key = "gopls/client:sublimetext" + default: + // Accumulate at least a local counter for an unknown + // client name, but also fall through to count it as + // ":other" for collection. + if clientName != "" { + counter.New(fmt.Sprintf("gopls/client-other:%s", clientName)).Inc() } } - counter.Inc(client) + counter.Inc(key) } // RecordViewGoVersion records the Go minor version number (1.x) used for a view. diff --git a/gopls/internal/telemetry/telemetry_go118.go b/gopls/internal/telemetry/telemetry_go118.go index 14d739562a4..12b7803f1a7 100644 --- a/gopls/internal/telemetry/telemetry_go118.go +++ b/gopls/internal/telemetry/telemetry_go118.go @@ -7,7 +7,22 @@ package telemetry -import "golang.org/x/tools/gopls/internal/protocol" +// This file defines dummy implementations of telemetry operations to +// permit building with go1.18. Until we drop support for go1.18, +// gopls may not refer to the telemetry module directly, but must go +// through this file. + +func CounterOpen() {} + +func StartCrashMonitor() {} + +func CrashMonitorSupported() bool { return false } + +func NewStackCounter(string, int) dummyCounter { return dummyCounter{} } + +type dummyCounter struct{} + +func (dummyCounter) Inc() {} func Mode() string { return "local" @@ -20,8 +35,7 @@ func SetMode(mode string) error { func Upload() { } -func RecordClientInfo(params *protocol.ParamInitialize) { -} +func RecordClientInfo(string) {} func RecordViewGoVersion(x int) { } diff --git a/gopls/internal/util/bug/bug.go b/gopls/internal/util/bug/bug.go index 7c290b0cd27..6e9828f1e56 100644 --- a/gopls/internal/util/bug/bug.go +++ b/gopls/internal/util/bug/bug.go @@ -19,7 +19,7 @@ import ( "sync" "time" - "golang.org/x/telemetry/counter" + "golang.org/x/tools/gopls/internal/telemetry" ) // PanicOnBugs controls whether to panic when bugs are reported. @@ -66,7 +66,7 @@ func Report(description string) { } // BugReportCount is a telemetry counter that tracks # of bug reports. -var BugReportCount = counter.NewStack("gopls/bug", 16) +var BugReportCount = telemetry.NewStackCounter("gopls/bug", 16) func report(description string) { _, file, line, ok := runtime.Caller(2) // all exported reporting functions call report directly diff --git a/gopls/main.go b/gopls/main.go index bbbb915ffc5..e3fb3861f68 100644 --- a/gopls/main.go +++ b/gopls/main.go @@ -17,9 +17,9 @@ import ( "context" "os" - "golang.org/x/telemetry/counter" "golang.org/x/tools/gopls/internal/cmd" "golang.org/x/tools/gopls/internal/hooks" + "golang.org/x/tools/gopls/internal/telemetry" versionpkg "golang.org/x/tools/gopls/internal/version" "golang.org/x/tools/internal/tool" ) @@ -29,7 +29,8 @@ var version = "" // if set by the linker, overrides the gopls version func main() { versionpkg.VersionOverride = version - counter.Open() // Enable telemetry counter writing. + telemetry.CounterOpen() + telemetry.StartCrashMonitor() ctx := context.Background() tool.Main(ctx, cmd.New(hooks.Options), os.Args[1:]) } From 85146f5b48ef9cb082397e54dab98b7861424bdc Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Thu, 15 Jun 2023 15:28:11 -0400 Subject: [PATCH 080/105] gopls/internal/lsp/source: highlight returns correctly Rewrite the control flow highlighting logic to be more understandable, and to fix a bug where multi-name result parameters were not properly counted. Fixes golang/go#60589 Change-Id: Id12ada78852be0a8376fbd482326322fc1b87fcf Reviewed-on: https://go-review.googlesource.com/c/tools/+/503439 Auto-Submit: Robert Findley <rfindley@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/golang/highlight.go | 228 +++++++++++------- .../marker/testdata/highlight/issue60589.txt | 30 +++ 2 files changed, 171 insertions(+), 87 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/highlight/issue60589.txt diff --git a/gopls/internal/golang/highlight.go b/gopls/internal/golang/highlight.go index 947acba4a84..28e2c27f3d5 100644 --- a/gopls/internal/golang/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -65,6 +65,8 @@ func Highlight(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, po return ranges, nil } +// highlightPath returns ranges to highlight for the given enclosing path, +// which should be the result of astutil.PathEnclosingInterval. func highlightPath(path []ast.Node, file *ast.File, info *types.Info) (map[posRange]struct{}, error) { result := make(map[posRange]struct{}) switch node := path[0].(type) { @@ -133,115 +135,167 @@ type posRange struct { start, end token.Pos } -func highlightFuncControlFlow(path []ast.Node, result map[posRange]struct{}) { - var enclosingFunc ast.Node - var returnStmt *ast.ReturnStmt - var resultsList *ast.FieldList - inReturnList := false - -Outer: - // Reverse walk the path till we get to the func block. +// highlightFuncControlFlow adds highlight ranges to the result map to +// associate results and result parameters. +// +// Specifically, if the cursor is in a result or result parameter, all +// results and result parameters with the same index are highlighted. If the +// cursor is in a 'func' or 'return' keyword, the func keyword as well as all +// returns from that func are highlighted. +// +// As a special case, if the cursor is within a complicated expression, control +// flow highlighting is disabled, as it would highlight too much. +func highlightFuncControlFlow(path []ast.Node, result map[posRange]unit) { + + var ( + funcType *ast.FuncType // type of enclosing func, or nil + funcBody *ast.BlockStmt // body of enclosing func, or nil + returnStmt *ast.ReturnStmt // enclosing ReturnStmt within the func, or nil + ) + +findEnclosingFunc: for i, n := range path { - switch node := n.(type) { + switch n := n.(type) { + // TODO(rfindley, low priority): these pre-existing cases for KeyValueExpr + // and CallExpr appear to avoid highlighting when the cursor is in a + // complicated expression. However, the basis for this heuristic is + // unclear. Can we formalize a rationale? case *ast.KeyValueExpr: - // If cursor is in a key: value expr, we don't want control flow highlighting + // If cursor is in a key: value expr, we don't want control flow highlighting. return + case *ast.CallExpr: // If cursor is an arg in a callExpr, we don't want control flow highlighting. if i > 0 { - for _, arg := range node.Args { + for _, arg := range n.Args { if arg == path[i-1] { return } } } - case *ast.Field: - inReturnList = true + case *ast.FuncLit: - enclosingFunc = n - resultsList = node.Type.Results - break Outer + funcType = n.Type + funcBody = n.Body + break findEnclosingFunc + case *ast.FuncDecl: - enclosingFunc = n - resultsList = node.Type.Results - break Outer + funcType = n.Type + funcBody = n.Body + break findEnclosingFunc + case *ast.ReturnStmt: - returnStmt = node - // If the cursor is not directly in a *ast.ReturnStmt, then - // we need to know if it is within one of the values that is being returned. - inReturnList = inReturnList || path[0] != returnStmt - } - } - // Cursor is not in a function. - if enclosingFunc == nil { - return - } - // If the cursor is on a "return" or "func" keyword, we should highlight all of the exit - // points of the function, including the "return" and "func" keywords. - highlightAllReturnsAndFunc := path[0] == returnStmt || path[0] == enclosingFunc - switch path[0].(type) { - case *ast.Ident, *ast.BasicLit: - // Cursor is in an identifier and not in a return statement or in the results list. - if returnStmt == nil && !inReturnList { - return + returnStmt = n } - case *ast.FuncType: - highlightAllReturnsAndFunc = true } - // The user's cursor may be within the return statement of a function, - // or within the result section of a function's signature. - // index := -1 - var nodes []ast.Node - if returnStmt != nil { - for _, n := range returnStmt.Results { - nodes = append(nodes, n) - } - } else if resultsList != nil { - for _, n := range resultsList.List { - nodes = append(nodes, n) - } - } - _, index := nodeAtPos(nodes, path[0].Pos()) - // Highlight the correct argument in the function declaration return types. - if resultsList != nil && -1 < index && index < len(resultsList.List) { - rng := posRange{ - start: resultsList.List[index].Pos(), - end: resultsList.List[index].End(), - } - result[rng] = struct{}{} + if funcType == nil { + return // cursor is not in a function } - // Add the "func" part of the func declaration. - if highlightAllReturnsAndFunc { - r := posRange{ - start: enclosingFunc.Pos(), - end: enclosingFunc.Pos() + token.Pos(len("func")), + + // Helper functions for inspecting the current location. + var ( + pos = path[0].Pos() + inSpan = func(start, end token.Pos) bool { return start <= pos && pos < end } + inNode = func(n ast.Node) bool { return inSpan(n.Pos(), n.End()) } + ) + + inResults := funcType.Results != nil && inNode(funcType.Results) + + // If the cursor is on a "return" or "func" keyword, but not highlighting any + // specific field or expression, we should highlight all of the exit points + // of the function, including the "return" and "func" keywords. + funcEnd := funcType.Func + token.Pos(len("func")) + highlightAll := path[0] == returnStmt || inSpan(funcType.Func, funcEnd) + var highlightIndexes map[int]bool + + if highlightAll { + // Add the "func" part of the func declaration. + result[posRange{ + start: funcType.Func, + end: funcEnd, + }] = unit{} + } else if returnStmt == nil && !inResults { + return // nothing to highlight + } else { + // If we're not highighting the entire return statement, we need to collect + // specific result indexes to highlight. This may be more than one index if + // the cursor is on a multi-name result field, but not in any specific name. + if !highlightAll { + highlightIndexes = make(map[int]bool) + if returnStmt != nil { + for i, n := range returnStmt.Results { + if inNode(n) { + highlightIndexes[i] = true + break + } + } + } + + // Scan fields, either adding highlights according to the highlightIndexes + // computed above, or accounting for the cursor position within the result + // list. + // (We do both at once to avoid repeating the cumbersome field traversal.) + i := 0 + findField: + for _, field := range funcType.Results.List { + for j, name := range field.Names { + if inNode(name) || highlightIndexes[i+j] { + result[posRange{name.Pos(), name.End()}] = unit{} + highlightIndexes[i+j] = true + break findField // found/highlighted the specific name + } + } + // If the cursor is in a field but not in a name (e.g. in the space, or + // the type), highlight the whole field. + // + // Note that this may not be ideal if we're at e.g. + // + // (x,‸y int, z int8) + // + // ...where it would make more sense to highlight only y. But we don't + // reach this function if not in a func, return, ident, or basiclit. + if inNode(field) || highlightIndexes[i] { + result[posRange{field.Pos(), field.End()}] = unit{} + highlightIndexes[i] = true + if inNode(field) { + for j := range field.Names { + highlightIndexes[i+j] = true + } + } + break findField // found/highlighted the field + } + + n := len(field.Names) + if n == 0 { + n = 1 + } + i += n + } } - result[r] = struct{}{} } - ast.Inspect(enclosingFunc, func(n ast.Node) bool { - // Don't traverse any other functions. - switch n.(type) { + + ast.Inspect(funcBody, func(n ast.Node) bool { + switch n := n.(type) { case *ast.FuncDecl, *ast.FuncLit: - return enclosingFunc == n - } - ret, ok := n.(*ast.ReturnStmt) - if !ok { - return true - } - var toAdd ast.Node - // Add the entire return statement, applies when highlight the word "return" or "func". - if highlightAllReturnsAndFunc { - toAdd = n - } - // Add the relevant field within the entire return statement. - if -1 < index && index < len(ret.Results) { - toAdd = ret.Results[index] - } - if toAdd != nil { - result[posRange{start: toAdd.Pos(), end: toAdd.End()}] = struct{}{} + // Don't traverse into any functions other than enclosingFunc. + return false + case *ast.ReturnStmt: + if highlightAll { + // Add the entire return statement. + result[posRange{n.Pos(), n.End()}] = unit{} + } else { + // Add the highlighted indexes. + for i, expr := range n.Results { + if highlightIndexes[i] { + result[posRange{expr.Pos(), expr.End()}] = unit{} + } + } + } + return false + } - return false + return true }) } diff --git a/gopls/internal/test/marker/testdata/highlight/issue60589.txt b/gopls/internal/test/marker/testdata/highlight/issue60589.txt new file mode 100644 index 00000000000..afa4335a9c6 --- /dev/null +++ b/gopls/internal/test/marker/testdata/highlight/issue60589.txt @@ -0,0 +1,30 @@ +This test verifies that control flow lighlighting correctly accounts for +multi-name result parameters. In golang/go#60589, it did not. + +-- go.mod -- +module mod.com + +go 1.18 + +-- p.go -- +package p + +func _() (foo int, bar, baz string) { //@ loc(func, "func"), loc(foo, "foo"), loc(fooint, "foo int"), loc(int, "int"), loc(bar, "bar"), loc(beforebaz, " baz"), loc(baz, "baz"), loc(barbazstring, "bar, baz string"), loc(beforestring, re`() string`), loc(string, "string") + return 0, "1", "2" //@ loc(return, `return 0, "1", "2"`), loc(l0, "0"), loc(l1, `"1"`), loc(l2, `"2"`) +} + +// Assertions, expressed here to avoid clutter above. +// Note that when the cursor is over the field type, there is some +// (likely harmless) redundancy. + +//@ highlight(func, func, return) +//@ highlight(foo, foo, l0) +//@ highlight(int, fooint, int, l0) +//@ highlight(bar, bar, l1) +//@ highlight(beforebaz) +//@ highlight(baz, baz, l2) +//@ highlight(beforestring, baz, l2) +//@ highlight(string, barbazstring, string, l1, l2) +//@ highlight(l0, foo, l0) +//@ highlight(l1, bar, l1) +//@ highlight(l2, baz, l2) From c3f60b7871c6c0f1f49094d63dcf73622a1d1ea0 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Tue, 30 Jan 2024 11:22:13 -0500 Subject: [PATCH 081/105] gopls/internal/golang: hover: show embedded fields This change causes the hover information for a type to display the set of fields that are accessible due to promotion through one or more embedded fields. Change-Id: I7795daaeef6d5e910ae7917aa44d3012f4c016b7 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559499 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Alan Donovan <adonovan@google.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/golang/hover.go | 118 ++++++++++++++++-- .../test/marker/testdata/definition/embed.txt | 5 + .../test/marker/testdata/hover/embed.txt | 57 +++++++++ .../test/marker/testdata/hover/godef.txt | 5 + .../test/marker/testdata/hover/linkable.txt | 11 ++ 5 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/hover/embed.txt diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index ee298442513..ef486018786 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go @@ -19,6 +19,7 @@ import ( "path/filepath" "strconv" "strings" + "text/tabwriter" "time" "unicode/utf8" @@ -76,13 +77,19 @@ type hoverJSON struct { // interface might be nice, but it needs a design and a // precise specification. - // typeDecl is the declaration syntax, or "" for a non-type. + // typeDecl is the declaration syntax for a type, + // or "" for a non-type. typeDecl string // methods is the list of descriptions of methods of a type, - // omitting any that are obvious from TypeDecl. + // omitting any that are obvious from typeDecl. // It is "" for a non-type. methods string + + // promotedFields is the list of descriptions of accessible + // fields of a (struct) type that were promoted through an + // embedded field. + promotedFields string } // Hover implements the "textDocument/hover" RPC for Go files. @@ -234,7 +241,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro } } - var typeDecl, methods string + var typeDecl, methods, fields string // For "objects defined by a type spec", the signature produced by // objectString is insufficient: @@ -276,11 +283,33 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro typeDecl = b.String() } - // -- methods -- + // Promoted fields + // + // Show a table of accessible fields of the (struct) + // type that may not be visible in the syntax (above) + // due to promotion through embedded fields. + // + // Example: + // + // // Embedded fields: + // foo int // through x.y + // z string // through x.y + if prom := promotedFields(obj.Type(), pkg.GetTypes()); len(prom) > 0 { + var b strings.Builder + b.WriteString("// Embedded fields:\n") + w := tabwriter.NewWriter(&b, 0, 8, 1, ' ', 0) + for _, f := range prom { + fmt.Fprintf(w, "%s\t%s\t// through %s\t\n", + f.field.Name(), + types.TypeString(f.field.Type(), qf), + f.path) + } + w.Flush() + b.WriteByte('\n') + fields = b.String() + } - // TODO(adonovan): compute a similar list of - // accessible fields, reflecting embedding - // (e.g. "T.Embed.Y int"). + // -- methods -- // For an interface type, explicit methods will have // already been displayed when the node was formatted @@ -305,7 +334,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro // embedded interfaces. var b strings.Builder for _, m := range typeutil.IntuitiveMethodSet(obj.Type(), nil) { - if m.Obj().Pkg() != pkg.GetTypes() && !m.Obj().Exported() { + if !accessibleTo(m.Obj(), pkg.GetTypes()) { continue // inaccessible } if skip[m.Obj().Name()] { @@ -433,6 +462,7 @@ func hover(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, pp pro LinkAnchor: anchor, typeDecl: typeDecl, methods: methods, + promotedFields: fields, }, nil } @@ -989,6 +1019,7 @@ func formatHover(h *hoverJSON, options *settings.Options) (string, error) { maybeMarkdown(h.Signature), maybeMarkdown(h.typeDecl), formatDoc(h, options), + maybeMarkdown(h.promotedFields), maybeMarkdown(h.methods), formatLink(h, options), } @@ -1170,3 +1201,74 @@ func findDeclInfo(files []*ast.File, pos token.Pos) (decl ast.Decl, spec ast.Spe return nil, nil, nil } + +type promotedField struct { + path string // path (e.g. "x.y" through embedded fields) + field *types.Var +} + +// promotedFields returns the list of accessible promoted fields of a struct type t. +// (Logic plundered from x/tools/cmd/guru/describe.go.) +func promotedFields(t types.Type, from *types.Package) []promotedField { + wantField := func(f *types.Var) bool { + if !accessibleTo(f, from) { + return false + } + // Check that the field is not shadowed. + obj, _, _ := types.LookupFieldOrMethod(t, true, f.Pkg(), f.Name()) + return obj == f + } + + var fields []promotedField + var visit func(t types.Type, stack []*types.Named) + visit = func(t types.Type, stack []*types.Named) { + tStruct, ok := Deref(t).Underlying().(*types.Struct) + if !ok { + return + } + fieldloop: + for i := 0; i < tStruct.NumFields(); i++ { + f := tStruct.Field(i) + + // Handle recursion through anonymous fields. + if f.Anonymous() { + tf := f.Type() + if ptr, ok := tf.(*types.Pointer); ok { + tf = ptr.Elem() + } + if named, ok := tf.(*types.Named); ok { // (be defensive) + // If we've already visited this named type + // on this path, break the cycle. + for _, x := range stack { + if x.Origin() == named.Origin() { + continue fieldloop + } + } + visit(f.Type(), append(stack, named)) + } + } + + // Save accessible promoted fields. + if len(stack) > 0 && wantField(f) { + var path strings.Builder + for i, t := range stack { + if i > 0 { + path.WriteByte('.') + } + path.WriteString(t.Obj().Name()) + } + fields = append(fields, promotedField{ + path: path.String(), + field: f, + }) + } + } + } + visit(t, nil) + + return fields +} + +func accessibleTo(obj types.Object, pkg *types.Package) bool { + return obj.Exported() || obj.Pkg() == pkg +} diff --git a/gopls/internal/test/marker/testdata/definition/embed.txt b/gopls/internal/test/marker/testdata/definition/embed.txt index e5c0f18ff47..9842c37d047 100644 --- a/gopls/internal/test/marker/testdata/definition/embed.txt +++ b/gopls/internal/test/marker/testdata/definition/embed.txt @@ -182,6 +182,11 @@ type S1 struct { } ``` +```go +// Embedded fields: +F2 int // through S2 +``` + [`b.S1` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S1) -- @S1F1 -- ```go diff --git a/gopls/internal/test/marker/testdata/hover/embed.txt b/gopls/internal/test/marker/testdata/hover/embed.txt new file mode 100644 index 00000000000..1dc3fcbfa12 --- /dev/null +++ b/gopls/internal/test/marker/testdata/hover/embed.txt @@ -0,0 +1,57 @@ +This test checks that hover reports accessible embedded fields +(after the doc comment and before the accessible methods). + +-- go.mod -- +module example.com + +go 1.18 + +-- q/q.go -- +package q + +type Q struct { + One int + two string + q2[chan int] +} + +type q2[T any] struct { + Three *T + four string +} + +-- p.go -- +package p + +import "example.com/q" + +// doc +type P struct { + q.Q +} + +func (P) m() {} + +var p P //@hover("P", "P", P) + +-- @P -- +```go +type P struct { + q.Q +} +``` + +doc + + +```go +// Embedded fields: +One int // through Q +Three *chan int // through Q.q2 +``` + +```go +func (P) m() +``` + +[`p.P` on pkg.go.dev](https://pkg.go.dev/example.com#P) diff --git a/gopls/internal/test/marker/testdata/hover/godef.txt b/gopls/internal/test/marker/testdata/hover/godef.txt index 9e11e7f05d5..2d82ab0debe 100644 --- a/gopls/internal/test/marker/testdata/hover/godef.txt +++ b/gopls/internal/test/marker/testdata/hover/godef.txt @@ -132,6 +132,11 @@ type NextThing struct { } ``` +```go +// Embedded fields: +Member string // through Thing +``` + ```go func (t Thing) Method(i int) string func (t *Thing) Method2(i int, j int) (error, string) diff --git a/gopls/internal/test/marker/testdata/hover/linkable.txt b/gopls/internal/test/marker/testdata/hover/linkable.txt index 9147863c3c2..b77b9e8a4d9 100644 --- a/gopls/internal/test/marker/testdata/hover/linkable.txt +++ b/gopls/internal/test/marker/testdata/hover/linkable.txt @@ -83,6 +83,12 @@ type Local struct { ``` Local types should not be linkable, even if they are capitalized. + + +```go +// Embedded fields: +Embed int // through E +``` -- @Nested -- ```go field Nested int @@ -108,6 +114,11 @@ type T struct { T is in the package scope, and so should be linkable. +```go +// Embedded fields: +Embed int // through E +``` + ```go func (T) M() func (T) m() From efce0f5963afa087a1ac9af44255fce99c00ea33 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 14:14:25 -0500 Subject: [PATCH 082/105] gopls/internal/cache/metadata: assert graph is acyclic This change causes the metadata graph to assert that it is acyclic before applying the updates. This should be an invariant, but the attached issues make us skeptical. Updates golang/go#64227 Updates golang/vscode-go#3126 Change-Id: I40b4fd06fcf2c64594b34b8c300f20ca0676d0fa Reviewed-on: https://go-review.googlesource.com/c/tools/+/560463 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/cache/metadata/cycle_test.go | 51 ++++---------------- gopls/internal/cache/metadata/graph.go | 53 +++++++++++++++++++++ gopls/internal/util/bug/bug.go | 3 ++ 3 files changed, 65 insertions(+), 42 deletions(-) diff --git a/gopls/internal/cache/metadata/cycle_test.go b/gopls/internal/cache/metadata/cycle_test.go index 3597be73b84..09628d881e9 100644 --- a/gopls/internal/cache/metadata/cycle_test.go +++ b/gopls/internal/cache/metadata/cycle_test.go @@ -8,58 +8,25 @@ import ( "sort" "strings" "testing" + + "golang.org/x/tools/gopls/internal/util/bug" ) +func init() { + bug.PanicOnBugs = true +} + // This is an internal test of the breakImportCycles logic. func TestBreakImportCycles(t *testing.T) { - type Graph = map[PackageID]*Package - - // cyclic returns a description of a cycle, - // if the graph is cyclic, otherwise "". - cyclic := func(graph Graph) string { - const ( - unvisited = 0 - visited = 1 - onstack = 2 - ) - color := make(map[PackageID]int) - var visit func(id PackageID) string - visit = func(id PackageID) string { - switch color[id] { - case unvisited: - color[id] = onstack - case onstack: - return string(id) // cycle! - case visited: - return "" - } - if mp := graph[id]; mp != nil { - for _, depID := range mp.DepsByPkgPath { - if cycle := visit(depID); cycle != "" { - return string(id) + "->" + cycle - } - } - } - color[id] = visited - return "" - } - for id := range graph { - if cycle := visit(id); cycle != "" { - return cycle - } - } - return "" - } - // parse parses an import dependency graph. // The input is a semicolon-separated list of node descriptions. // Each node description is a package ID, optionally followed by // "->" and a comma-separated list of successor IDs. // Thus "a->b;b->c,d;e" represents the set of nodes {a,b,e} // and the set of edges {a->b, b->c, b->d}. - parse := func(s string) Graph { - m := make(Graph) + parse := func(s string) map[PackageID]*Package { + m := make(map[PackageID]*Package) makeNode := func(name string) *Package { id := PackageID(name) n, ok := m[id] @@ -98,7 +65,7 @@ func TestBreakImportCycles(t *testing.T) { // format formats an import graph, in lexicographic order, // in the notation of parse, but with a "!" after the name // of each node that has errors. - format := func(graph Graph) string { + format := func(graph map[PackageID]*Package) string { var items []string for _, mp := range graph { item := string(mp.ID) diff --git a/gopls/internal/cache/metadata/graph.go b/gopls/internal/cache/metadata/graph.go index ca550d7ce6a..f09822d3575 100644 --- a/gopls/internal/cache/metadata/graph.go +++ b/gopls/internal/cache/metadata/graph.go @@ -38,6 +38,22 @@ func (g *Graph) Update(updates map[PackageID]*Package) *Graph { return g } + // Debugging golang/go#64227, golang/vscode-go#3126: + // Assert that the existing metadata graph is acyclic. + if cycle := cyclic(g.Packages); cycle != "" { + bug.Reportf("metadata is cyclic even before updates: %s", cycle) + } + // Assert that the updates contain no self-cycles. + for id, mp := range updates { + if mp != nil { + for _, depID := range mp.DepsByPkgPath { + if depID == id { + bug.Reportf("self-cycle in metadata update: %s", id) + } + } + } + } + // Copy pkgs map then apply updates. pkgs := make(map[PackageID]*Package, len(g.Packages)) for id, mp := range g.Packages { @@ -223,6 +239,43 @@ func breakImportCycles(metadata, updates map[PackageID]*Package) { } } +// cyclic returns a description of a cycle, +// if the graph is cyclic, otherwise "". +func cyclic(graph map[PackageID]*Package) string { + const ( + unvisited = 0 + visited = 1 + onstack = 2 + ) + color := make(map[PackageID]int) + var visit func(id PackageID) string + visit = func(id PackageID) string { + switch color[id] { + case unvisited: + color[id] = onstack + case onstack: + return string(id) // cycle! + case visited: + return "" + } + if mp := graph[id]; mp != nil { + for _, depID := range mp.DepsByPkgPath { + if cycle := visit(depID); cycle != "" { + return string(id) + "->" + cycle + } + } + } + color[id] = visited + return "" + } + for id := range graph { + if cycle := visit(id); cycle != "" { + return cycle + } + } + return "" +} + // detectImportCycles reports cycles in the metadata graph. It returns a new // unordered array of all cycles (nontrivial strong components) in the // metadata graph reachable from a non-nil 'updates' value. diff --git a/gopls/internal/util/bug/bug.go b/gopls/internal/util/bug/bug.go index 6e9828f1e56..e04b753e315 100644 --- a/gopls/internal/util/bug/bug.go +++ b/gopls/internal/util/bug/bug.go @@ -25,6 +25,9 @@ import ( // PanicOnBugs controls whether to panic when bugs are reported. // // It may be set to true during testing. +// +// TODO(adonovan): should we make the default true, and +// suppress it only in the product (gopls/main.go)? var PanicOnBugs = false var ( From 9c4380303312ac3b550a4499aafccce037c6266e Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 15:29:50 -0500 Subject: [PATCH 083/105] gopls/internal/cache: allow command-line-package >1 CompileGoFiles The previous assertion required exactly one, but this condition is violated by a file=emptyfile.go query, which produces no CompiledGoFiles and IgnoredFiles=[emptyfile.go]. So we relax the assertion, and use the first ignored file as the suffix. Fixes golang/go#64557 Change-Id: I097badd1b102bdc73af2ffa8a4871da1e359b173 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560465 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/cache/load.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/gopls/internal/cache/load.go b/gopls/internal/cache/load.go index aa9d9bd0d8f..4bbeb2d160a 100644 --- a/gopls/internal/cache/load.go +++ b/gopls/internal/cache/load.go @@ -16,8 +16,8 @@ import ( "time" "golang.org/x/tools/go/packages" - "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/immutable" @@ -341,13 +341,26 @@ func buildMetadata(updates map[PackageID]*metadata.Package, pkg *packages.Packag id := PackageID(pkg.ID) if metadata.IsCommandLineArguments(id) { - if len(pkg.CompiledGoFiles) != 1 { - bug.Reportf("unexpected files in command-line-arguments package: %v", pkg.CompiledGoFiles) + var f string // file to use as disambiguating suffix + if len(pkg.CompiledGoFiles) > 0 { + f = pkg.CompiledGoFiles[0] + + // If there are multiple files, + // we can't use only the first. + // (Can this happen? #64557) + if len(pkg.CompiledGoFiles) > 1 { + bug.Reportf("unexpected files in command-line-arguments package: %v", pkg.CompiledGoFiles) + return + } + } else if len(pkg.IgnoredFiles) > 0 { + // A file=empty.go query results in IgnoredFiles=[empty.go]. + f = pkg.IgnoredFiles[0] + } else { + bug.Reportf("command-line-arguments package has neither CompiledGoFiles nor IgnoredFiles: %#v", "") //*pkg.Metadata) return } - suffix := pkg.CompiledGoFiles[0] - id = PackageID(pkg.ID + suffix) - pkgPath = PackagePath(pkg.PkgPath + suffix) + id = PackageID(pkg.ID + f) + pkgPath = PackagePath(pkg.PkgPath + f) } // Duplicate? From e80085c40e1706e7293e831741608324e81db3fd Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 16:01:41 -0500 Subject: [PATCH 084/105] gopls/internal/golang: downgrade bug.Reportf for missing builtin I am able to reproduce the bug by commenting out declarations in builtin.go or unsafe.go, which is very unlikely to happen in practice but reason enough not to call bug.Reportf. Fixes golang/go#64604 Change-Id: Idc7e0b2bda0b6070f3d09ba9cb825b7f28b8f796 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560897 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/golang/definition.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gopls/internal/golang/definition.go b/gopls/internal/golang/definition.go index d59573db587..4cc522978e6 100644 --- a/gopls/internal/golang/definition.go +++ b/gopls/internal/golang/definition.go @@ -118,7 +118,9 @@ func builtinDecl(ctx context.Context, snapshot *cache.Snapshot, obj types.Object astObj := file.Scope.Lookup(name) if astObj == nil { // Every built-in should have documentation syntax. - return nil, bug.Errorf("internal error: no object for %s", name) + // However, it is possible to reach this statement by + // commenting out declarations in {builtin,unsafe}.go. + return nil, fmt.Errorf("internal error: no object for %s", name) } decl, ok := astObj.Decl.(ast.Node) if !ok { From aecdb2d3f498fd6222ab68ba4a1dff0e50b6a97f Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 2 Feb 2024 15:54:15 -0500 Subject: [PATCH 085/105] gopls/internal/cache: support workspace vendoring Support workspace vendoring by simply removing logic in gopls for deriving the `-mod` flag. If we don't need to set `-mod=mod`, let the go command decide what to do. We don't need to worry about explicitly setting `-mod=readonly`, since this has been the default since Go 1.16. For golang/go#63375 Change-Id: I1adbe20cef5b9e3edcb7ac2445c4d5ae63f3a3a9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560466 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/mod.go | 6 +- gopls/internal/cache/snapshot.go | 72 +++++++++---------- gopls/internal/cache/view.go | 43 ----------- .../test/integration/modfile/modfile_test.go | 4 +- .../integration/workspace/workspace_test.go | 27 +++++++ 5 files changed, 64 insertions(+), 88 deletions(-) diff --git a/gopls/internal/cache/mod.go b/gopls/internal/cache/mod.go index 35946f81084..a120037e221 100644 --- a/gopls/internal/cache/mod.go +++ b/gopls/internal/cache/mod.go @@ -15,8 +15,8 @@ import ( "golang.org/x/mod/modfile" "golang.org/x/mod/module" "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/command" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/gocommand" @@ -350,7 +350,7 @@ func (s *Snapshot) extractGoCommandErrors(ctx context.Context, goCmdError error) // file/position information, so don't even try to find it. continue } - loc, found, err := s.matchErrorToModule(ctx, pm, msg) + loc, found, err := s.matchErrorToModule(pm, msg) if err != nil { event.Error(ctx, "matching error to module", err) continue @@ -395,7 +395,7 @@ var moduleVersionInErrorRe = regexp.MustCompile(`[:\s]([+-._~0-9A-Za-z]+)@([+-._ // // It returns the location of a reference to the one of the modules and true // if one exists. If none is found it returns a fallback location and false. -func (s *Snapshot) matchErrorToModule(ctx context.Context, pm *ParsedModule, goCmdError string) (protocol.Location, bool, error) { +func (s *Snapshot) matchErrorToModule(pm *ParsedModule, goCmdError string) (protocol.Location, bool, error) { var reference *modfile.Line matches := moduleVersionInErrorRe.FindAllStringSubmatch(goCmdError, -1) diff --git a/gopls/internal/cache/snapshot.go b/gopls/internal/cache/snapshot.go index 3eb87415ad5..a8b137fffb8 100644 --- a/gopls/internal/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -547,51 +547,17 @@ func (s *Snapshot) goCommandInvocation(ctx context.Context, flags InvocationFlag // // TODO(rfindley): should we set -overlays here? - var modURI protocol.DocumentURI - // Select the module context to use. - // If we're type checking, we need to use the workspace context, meaning - // the main (workspace) module. Otherwise, we should use the module for - // the passed-in working dir. - if mode == LoadWorkspace { - // TODO(rfindley): this seems unnecessary and overly complicated. Remove - // this along with 'allowModFileModifications'. - if s.view.typ == GoModView { - modURI = s.view.gomod - } - } else { - modURI = s.GoModForFile(protocol.URIFromPath(inv.WorkingDir)) - } - - var modContent []byte - if modURI != "" { - modFH, err := s.ReadFile(ctx, modURI) - if err != nil { - return "", nil, cleanup, err - } - modContent, err = modFH.Content() - if err != nil { - return "", nil, cleanup, err - } - } - - // TODO(rfindley): in the case of go.work mode, modURI is empty and we fall - // back on the default behavior of vendorEnabled with an empty modURI. Figure - // out what is correct here and implement it explicitly. - vendorEnabled, err := s.vendorEnabled(modURI, modContent) - if err != nil { - return "", nil, cleanup, err - } - const mutableModFlag = "mod" + // If the mod flag isn't set, populate it based on the mode and workspace. + // + // (As noted in various TODOs throughout this function, this is very + // confusing and not obviously correct, but tests pass and we will eventually + // rewrite this entire function.) if inv.ModFlag == "" { switch mode { case LoadWorkspace, Normal: - if vendorEnabled { - inv.ModFlag = "vendor" - } else if !allowModfileModificationOption { - inv.ModFlag = "readonly" - } else { + if allowModfileModificationOption { inv.ModFlag = mutableModFlag } case WriteTemporaryModFile: @@ -608,6 +574,32 @@ func (s *Snapshot) goCommandInvocation(ctx context.Context, flags InvocationFlag // If the invocation needs to mutate the modfile, we must use a temp mod. if inv.ModFlag == mutableModFlag { + var modURI protocol.DocumentURI + // Select the module context to use. + // If we're type checking, we need to use the workspace context, meaning + // the main (workspace) module. Otherwise, we should use the module for + // the passed-in working dir. + if mode == LoadWorkspace { + // TODO(rfindley): this seems unnecessary and overly complicated. Remove + // this along with 'allowModFileModifications'. + if s.view.typ == GoModView { + modURI = s.view.gomod + } + } else { + modURI = s.GoModForFile(protocol.URIFromPath(inv.WorkingDir)) + } + + var modContent []byte + if modURI != "" { + modFH, err := s.ReadFile(ctx, modURI) + if err != nil { + return "", nil, cleanup, err + } + modContent, err = modFH.Content() + if err != nil { + return "", nil, cleanup, err + } + } if modURI == "" { return "", nil, cleanup, fmt.Errorf("no go.mod file found in %s", inv.WorkingDir) } diff --git a/gopls/internal/cache/view.go b/gopls/internal/cache/view.go index 1c425ac97ea..83b41825cea 100644 --- a/gopls/internal/cache/view.go +++ b/gopls/internal/cache/view.go @@ -25,8 +25,6 @@ import ( "sync" "time" - "golang.org/x/mod/modfile" - "golang.org/x/mod/semver" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" @@ -1301,47 +1299,6 @@ func globsMatchPath(globs, target string) bool { var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`) -// TODO(rstambler): Consolidate modURI and modContent back into a FileHandle -// after we have a version of the workspace go.mod file on disk. Getting a -// FileHandle from the cache for temporary files is problematic, since we -// cannot delete it. -// -// TODO(rfindley): move this to snapshot.go. -func (s *Snapshot) vendorEnabled(modURI protocol.DocumentURI, modContent []byte) (bool, error) { - // Legacy GOPATH workspace? - if len(s.view.workspaceModFiles) == 0 { - return false, nil - } - - // Explicit -mod flag? - matches := modFlagRegexp.FindStringSubmatch(s.view.folder.Env.GOFLAGS) - if len(matches) != 0 { - modFlag := matches[1] - if modFlag != "" { - // Don't override an explicit '-mod=vendor' argument. - // We do want to override '-mod=readonly': it would break various module code lenses, - // and on 1.16 we know -modfile is available, so we won't mess with go.mod anyway. - return modFlag == "vendor", nil - } - } - - modFile, err := modfile.Parse(modURI.Path(), modContent, nil) - if err != nil { - return false, err - } - - // No vendor directory? - // TODO(golang/go#57514): this is wrong if the working dir is not the module - // root. - if fi, err := os.Stat(filepath.Join(s.view.root.Path(), "vendor")); err != nil || !fi.IsDir() { - return false, nil - } - - // Vendoring enabled by default by go declaration in go.mod? - vendorEnabled := modFile.Go != nil && modFile.Go.Version != "" && semver.Compare("v"+modFile.Go.Version, "v1.14") >= 0 - return vendorEnabled, nil -} - // TODO(rfindley): clean up the redundancy of allFilesExcluded, // pathExcludedByFilterFunc, pathExcludedByFilter, view.filterFunc... func allFilesExcluded(files []string, filterFunc func(protocol.DocumentURI) bool) bool { diff --git a/gopls/internal/test/integration/modfile/modfile_test.go b/gopls/internal/test/integration/modfile/modfile_test.go index 49ec0c0a5c5..a71caaebe97 100644 --- a/gopls/internal/test/integration/modfile/modfile_test.go +++ b/gopls/internal/test/integration/modfile/modfile_test.go @@ -492,8 +492,8 @@ var _ = blah.Name env.AfterChange( // We would like for the error to appear in the v2 module, but // as of writing non-workspace packages are not diagnosed. - Diagnostics(env.AtRegexp("a/main.go", `"example.com/blah/v2"`), WithMessage("cannot find module providing")), - Diagnostics(env.AtRegexp("a/go.mod", `require example.com/blah/v2`), WithMessage("cannot find module providing")), + Diagnostics(env.AtRegexp("a/main.go", `"example.com/blah/v2"`), WithMessage("no required module provides")), + Diagnostics(env.AtRegexp("a/go.mod", `require example.com/blah/v2`), WithMessage("no required module provides")), ReadDiagnostics("a/go.mod", &modDiags), ) diff --git a/gopls/internal/test/integration/workspace/workspace_test.go b/gopls/internal/test/integration/workspace/workspace_test.go index 781e9027f5c..46184ae4ff8 100644 --- a/gopls/internal/test/integration/workspace/workspace_test.go +++ b/gopls/internal/test/integration/workspace/workspace_test.go @@ -16,6 +16,7 @@ import ( "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/goversion" "golang.org/x/tools/internal/gocommand" + "golang.org/x/tools/internal/testenv" . "golang.org/x/tools/gopls/internal/test/integration" ) @@ -248,6 +249,32 @@ func TestAutomaticWorkspaceModule_Interdependent(t *testing.T) { }) } +func TestWorkspaceVendoring(t *testing.T) { + testenv.NeedsGo1Point(t, 22) + WithOptions( + ProxyFiles(workspaceModuleProxy), + ).Run(t, multiModule, func(t *testing.T, env *Env) { + env.RunGoCommand("work", "init") + env.RunGoCommand("work", "use", "moda/a") + env.AfterChange() + env.OpenFile("moda/a/a.go") + env.RunGoCommand("work", "vendor") + + // Make an on-disk go.mod change to force a workspace reinitialization. + // This will be fixed in a follow-up CL. + env.OpenFile("moda/a/go.mod") + env.EditBuffer("moda/a/go.mod", protocol.TextEdit{NewText: "// arbitrary\n"}) + env.SaveBuffer("moda/a/go.mod") + + env.AfterChange() + loc := env.GoToDefinition(env.RegexpSearch("moda/a/a.go", "b.(Hello)")) + const want = "vendor/b.com/b/b.go" + if got := env.Sandbox.Workdir.URIToPath(loc.URI); got != want { + t.Errorf("Definition: got location %q, want %q", got, want) + } + }) +} + func TestModuleWithExclude(t *testing.T) { const proxy = ` -- c.com@v1.2.3/go.mod -- From 3403ce1044a8fe664ed4f5daa8b8b9028349a494 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <iant@golang.org> Date: Mon, 23 Oct 2023 14:35:00 -0700 Subject: [PATCH 086/105] go/internal/gccgoimporter: recognize "any" as a builtin type In CL 536715 we're changing the gofrontend export data to report "any" as a builtin type. This permits us to distinguish the builtin type from some other package-level type "any". That requires an update to this code. Change-Id: Id971c6274409d0f03b4ac34e573d78a0a831fb94 Reviewed-on: https://go-review.googlesource.com/c/tools/+/537215 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: David Chase <drchase@google.com> --- go/internal/gccgoimporter/parser.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go/internal/gccgoimporter/parser.go b/go/internal/gccgoimporter/parser.go index 9fdb6f8b059..72bbe793c1e 100644 --- a/go/internal/gccgoimporter/parser.go +++ b/go/internal/gccgoimporter/parser.go @@ -950,6 +950,7 @@ const ( gccgoBuiltinERROR = 19 gccgoBuiltinBYTE = 20 gccgoBuiltinRUNE = 21 + gccgoBuiltinANY = 22 ) func lookupBuiltinType(typ int) types.Type { @@ -974,6 +975,7 @@ func lookupBuiltinType(typ int) types.Type { gccgoBuiltinERROR: types.Universe.Lookup("error").Type(), gccgoBuiltinBYTE: types.Universe.Lookup("byte").Type(), gccgoBuiltinRUNE: types.Universe.Lookup("rune").Type(), + gccgoBuiltinANY: types.Universe.Lookup("any").Type(), }[typ] } From d6bd2d74f62df7834a26be88d119ef0f39eecb93 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 12:40:55 -0500 Subject: [PATCH 087/105] gopls/internal/cache: add assertions for export data inconsistency This change pushes the assertions more deeply into the type checking logic so that we might have a chance of understanding the recurring inconsistency problems reported by telemetry. Updates golang/go#63822 Change-Id: I1371f7aa7104df0c55e055a11e9e6bb15219d79a Reviewed-on: https://go-review.googlesource.com/c/tools/+/560795 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/internal/cache/check.go | 38 +++++++++++++++++++++++++++------- internal/gcimporter/iimport.go | 7 +++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/gopls/internal/cache/check.go b/gopls/internal/cache/check.go index 33ba4a4638e..0af59655ab1 100644 --- a/gopls/internal/cache/check.go +++ b/gopls/internal/cache/check.go @@ -22,10 +22,10 @@ import ( "golang.org/x/mod/module" "golang.org/x/sync/errgroup" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/gopls/internal/file" - "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/cache/typerefs" + "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/filecache" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/util/bug" "golang.org/x/tools/gopls/internal/util/safetoken" @@ -610,6 +610,16 @@ func (b *typeCheckBatch) importPackage(ctx context.Context, mp *metadata.Package if item.Path == string(mp.PkgPath) { id = mp.ID pkg = thisPackage + + // debugging issues #60904, #64235 + if pkg.Name() != item.Name { + // This would mean that mp.Name != item.Name, so the + // manifest in the export data of mp.PkgPath is + // inconsistent with mp.Name. Or perhaps there + // are duplicate PkgPath items in the manifest? + return bug.Errorf("internal error: package name is %q, want %q (id=%q, path=%q) (see issue #60904)", + pkg.Name(), item.Name, id, item.Path) + } } else { id = impMap[item.Path] var err error @@ -617,14 +627,22 @@ func (b *typeCheckBatch) importPackage(ctx context.Context, mp *metadata.Package if err != nil { return err } + + // We intentionally duplicate the bug.Errorf calls because + // telemetry tells us only the program counter, not the message. + + // debugging issues #60904, #64235 + if pkg.Name() != item.Name { + // This means that, while reading the manifest of the + // export data of mp.PkgPath, one of its indirect + // dependencies had a name that differs from the + // Metadata.Name + return bug.Errorf("internal error: package name is %q, want %q (id=%q, path=%q) (see issue #60904)", + pkg.Name(), item.Name, id, item.Path) + } } items[i].Pkg = pkg - // debugging issue #60904 - if pkg.Name() != item.Name { - return bug.Errorf("internal error: package name is %q, want %q (id=%q, path=%q) (see issue #60904)", - pkg.Name(), item.Name, id, item.Path) - } } return nil } @@ -724,7 +742,11 @@ func (b *typeCheckBatch) importMap(id PackageID) map[string]PackageID { populateDeps = func(parent *metadata.Package) { for _, id := range parent.DepsByPkgPath { mp := b.handles[id].mp - if _, ok := impMap[string(mp.PkgPath)]; ok { + if prevID, ok := impMap[string(mp.PkgPath)]; ok { + // debugging #63822 + if prevID != mp.ID { + bug.Reportf("inconsistent view of dependencies") + } continue } impMap[string(mp.PkgPath)] = mp.ID diff --git a/internal/gcimporter/iimport.go b/internal/gcimporter/iimport.go index 9bde15e3bc6..9fffa9ad05c 100644 --- a/internal/gcimporter/iimport.go +++ b/internal/gcimporter/iimport.go @@ -224,6 +224,7 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte // Gather the relevant packages from the manifest. items := make([]GetPackagesItem, r.uint64()) + uniquePkgPaths := make(map[string]bool) for i := range items { pkgPathOff := r.uint64() pkgPath := p.stringAt(pkgPathOff) @@ -248,6 +249,12 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte } items[i].nameIndex = nameIndex + + uniquePkgPaths[pkgPath] = true + } + // Debugging #63822; hypothesis: there are duplicate PkgPaths. + if len(uniquePkgPaths) != len(items) { + reportf("found duplicate PkgPaths while reading export data manifest: %v", items) } // Request packages all at once from the client, From 51e3724fe0cfaa1b0224fb2fbbb5619def39b881 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 16:54:39 -0500 Subject: [PATCH 088/105] gopls: remove unused parameters Interestingly, this turned up one false positive of the form var hook = func(err error) {} where other build-tagged files not visible to the analysis assigned other values to hook that actually used the parameter. Change-Id: I7d230160fd7e5ad67ade7b6e57db150bf68fa1c3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560716 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> --- gopls/api-diff/api_diff.go | 8 ++--- gopls/doc/generate.go | 4 +-- .../analysis/unusedvariable/unusedvariable.go | 4 +-- gopls/internal/cache/session.go | 4 +-- gopls/internal/cmd/stats.go | 4 +-- gopls/internal/debug/rpc.go | 12 +++---- gopls/internal/debug/trace.go | 6 ++-- .../internal/golang/completion/completion.go | 22 ++++++------ gopls/internal/golang/completion/fuzz.go | 3 +- gopls/internal/progress/progress_test.go | 6 ++-- gopls/internal/protocol/enums.go | 24 ++++++------- gopls/internal/server/diagnostics.go | 4 +-- gopls/internal/server/semantic.go | 6 ++-- .../test/integration/bench/iwl_test.go | 34 ++++++++----------- .../internal/test/integration/fake/editor.go | 4 +-- .../test/integration/misc/vuln_test.go | 10 +++--- 16 files changed, 74 insertions(+), 81 deletions(-) diff --git a/gopls/api-diff/api_diff.go b/gopls/api-diff/api_diff.go index ffe9254ab95..dfa1cb69e55 100644 --- a/gopls/api-diff/api_diff.go +++ b/gopls/api-diff/api_diff.go @@ -9,7 +9,6 @@ package main import ( "bytes" - "context" "encoding/json" "flag" "fmt" @@ -50,8 +49,7 @@ func main() { } func diffAPI(oldVer, newVer string) (string, error) { - ctx := context.Background() - previousAPI, err := loadAPI(ctx, oldVer) + previousAPI, err := loadAPI(oldVer) if err != nil { return "", fmt.Errorf("loading %s: %v", oldVer, err) } @@ -60,7 +58,7 @@ func diffAPI(oldVer, newVer string) (string, error) { currentAPI = settings.GeneratedAPIJSON } else { var err error - currentAPI, err = loadAPI(ctx, newVer) + currentAPI, err = loadAPI(newVer) if err != nil { return "", fmt.Errorf("loading %s: %v", newVer, err) } @@ -69,7 +67,7 @@ func diffAPI(oldVer, newVer string) (string, error) { return cmp.Diff(previousAPI, currentAPI), nil } -func loadAPI(ctx context.Context, version string) (*settings.APIJSON, error) { +func loadAPI(version string) (*settings.APIJSON, error) { ver := fmt.Sprintf("golang.org/x/tools/gopls@%s", version) cmd := exec.Command("go", "run", ver, "api-json") diff --git a/gopls/doc/generate.go b/gopls/doc/generate.go index 58f1123fe7e..c7d12269838 100644 --- a/gopls/doc/generate.go +++ b/gopls/doc/generate.go @@ -114,7 +114,7 @@ func loadAPI() (*settings.APIJSON, error) { Analyzers: loadAnalyzers(defaults.DefaultAnalyzers), // no staticcheck analyzers } - api.Commands, err = loadCommands(pkg) + api.Commands, err = loadCommands() if err != nil { return nil, err } @@ -403,7 +403,7 @@ func valueDoc(name, value, doc string) string { return fmt.Sprintf("`%s`: %s", value, doc) } -func loadCommands(pkg *packages.Package) ([]*settings.CommandJSON, error) { +func loadCommands() ([]*settings.CommandJSON, error) { var commands []*settings.CommandJSON _, cmds, err := commandmeta.Load() diff --git a/gopls/internal/analysis/unusedvariable/unusedvariable.go b/gopls/internal/analysis/unusedvariable/unusedvariable.go index e85b9dc84ee..67866d0e111 100644 --- a/gopls/internal/analysis/unusedvariable/unusedvariable.go +++ b/gopls/internal/analysis/unusedvariable/unusedvariable.go @@ -104,7 +104,7 @@ func runForError(pass *analysis.Pass, err types.Error, name string) error { continue } - fixes := removeVariableFromAssignment(pass, path, stmt, ident) + fixes := removeVariableFromAssignment(path, stmt, ident) // fixes may be nil if len(fixes) > 0 { diag.SuggestedFixes = fixes @@ -185,7 +185,7 @@ func removeVariableFromSpec(pass *analysis.Pass, path []ast.Node, stmt *ast.Valu } } -func removeVariableFromAssignment(pass *analysis.Pass, path []ast.Node, stmt *ast.AssignStmt, ident *ast.Ident) []analysis.SuggestedFix { +func removeVariableFromAssignment(path []ast.Node, stmt *ast.AssignStmt, ident *ast.Ident) []analysis.SuggestedFix { // The only variable in the assignment is unused if len(stmt.Lhs) == 1 { // If LHS has only one expression to be valid it has to have 1 expression diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 82474789f7c..18096b85e08 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -655,7 +655,7 @@ func bestView[V viewDefiner](ctx context.Context, fs file.Source, fh file.Handle // // If the resulting error is non-nil, the view may or may not have already been // dropped from the session. -func (s *Session) updateViewLocked(ctx context.Context, view *View, def *viewDefinition, folder *Folder) (*View, error) { +func (s *Session) updateViewLocked(ctx context.Context, view *View, def *viewDefinition) (*View, error) { i := s.dropView(view) if i == -1 { return nil, fmt.Errorf("view %q not found", view.id) @@ -707,7 +707,7 @@ func (s *Session) ResetView(ctx context.Context, uri protocol.DocumentURI) (*Vie if err != nil { return nil, err } - return s.updateViewLocked(ctx, v, v.viewDefinition, v.folder) + return s.updateViewLocked(ctx, v, v.viewDefinition) } // DidModifyFiles reports a file modification to the session. It returns diff --git a/gopls/internal/cmd/stats.go b/gopls/internal/cmd/stats.go index 5e8f0c59385..8da1a1a6ae8 100644 --- a/gopls/internal/cmd/stats.go +++ b/gopls/internal/cmd/stats.go @@ -180,7 +180,7 @@ func (s *stats) Run(ctx context.Context, args ...string) error { if _, err := do("Collecting directory info", func() error { var err error - stats.DirStats, err = findDirStats(ctx) + stats.DirStats, err = findDirStats() if err != nil { return err } @@ -248,7 +248,7 @@ type dirStats struct { // findDirStats collects information about the current directory and its // subdirectories. -func findDirStats(ctx context.Context) (dirStats, error) { +func findDirStats() (dirStats, error) { var ds dirStats filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error { if err != nil { diff --git a/gopls/internal/debug/rpc.go b/gopls/internal/debug/rpc.go index 5610021479c..0fee0f4a435 100644 --- a/gopls/internal/debug/rpc.go +++ b/gopls/internal/debug/rpc.go @@ -84,19 +84,19 @@ func (r *Rpcs) ProcessEvent(ctx context.Context, ev core.Event, lm label.Map) co defer r.mu.Unlock() switch { case event.IsStart(ev): - if _, stats := r.getRPCSpan(ctx, ev); stats != nil { + if _, stats := r.getRPCSpan(ctx); stats != nil { stats.Started++ } case event.IsEnd(ev): - span, stats := r.getRPCSpan(ctx, ev) + span, stats := r.getRPCSpan(ctx) if stats != nil { - endRPC(ctx, ev, span, stats) + endRPC(span, stats) } case event.IsMetric(ev): sent := byteUnits(tag.SentBytes.Get(lm)) rec := byteUnits(tag.ReceivedBytes.Get(lm)) if sent != 0 || rec != 0 { - if _, stats := r.getRPCSpan(ctx, ev); stats != nil { + if _, stats := r.getRPCSpan(ctx); stats != nil { stats.Sent += sent stats.Received += rec } @@ -105,7 +105,7 @@ func (r *Rpcs) ProcessEvent(ctx context.Context, ev core.Event, lm label.Map) co return ctx } -func endRPC(ctx context.Context, ev core.Event, span *export.Span, stats *rpcStats) { +func endRPC(span *export.Span, stats *rpcStats) { // update the basic counts stats.Completed++ @@ -152,7 +152,7 @@ func endRPC(ctx context.Context, ev core.Event, span *export.Span, stats *rpcSta } } -func (r *Rpcs) getRPCSpan(ctx context.Context, ev core.Event) (*export.Span, *rpcStats) { +func (r *Rpcs) getRPCSpan(ctx context.Context) (*export.Span, *rpcStats) { // get the span span := export.GetSpan(ctx) if span == nil { diff --git a/gopls/internal/debug/trace.go b/gopls/internal/debug/trace.go index 31c5a5376ac..9314a04d241 100644 --- a/gopls/internal/debug/trace.go +++ b/gopls/internal/debug/trace.go @@ -150,14 +150,14 @@ func StdTrace(exporter event.Exporter) event.Exporter { ctx = context.WithValue(ctx, traceKey, task) } // Log the start event as it may contain useful labels. - msg := formatEvent(ctx, ev, lm) + msg := formatEvent(ev, lm) trace.Log(ctx, "start", msg) case event.IsLog(ev): category := "" if event.IsError(ev) { category = "error" } - msg := formatEvent(ctx, ev, lm) + msg := formatEvent(ev, lm) trace.Log(ctx, category, msg) case event.IsEnd(ev): if v := ctx.Value(traceKey); v != nil { @@ -168,7 +168,7 @@ func StdTrace(exporter event.Exporter) event.Exporter { } } -func formatEvent(ctx context.Context, ev core.Event, lm label.Map) string { +func formatEvent(ev core.Event, lm label.Map) string { buf := &bytes.Buffer{} p := export.Printer{} p.WriteEvent(buf, ev, lm) diff --git a/gopls/internal/golang/completion/completion.go b/gopls/internal/golang/completion/completion.go index 586d74337dc..b796de4932d 100644 --- a/gopls/internal/golang/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go @@ -647,7 +647,7 @@ func (c *completer) collectCompletions(ctx context.Context) error { // Inside comments, offer completions for the name of the relevant symbol. for _, comment := range c.file.Comments { if comment.Pos() < c.pos && c.pos <= comment.End() { - c.populateCommentCompletions(ctx, comment) + c.populateCommentCompletions(comment) return nil } } @@ -922,7 +922,7 @@ func (c *completer) populateImportCompletions(searchImport *ast.ImportSpec) erro } // populateCommentCompletions yields completions for comments preceding or in declarations. -func (c *completer) populateCommentCompletions(ctx context.Context, comment *ast.CommentGroup) { +func (c *completer) populateCommentCompletions(comment *ast.CommentGroup) { // If the completion was triggered by a period, ignore it. These types of // completions will not be useful in comments. if c.completionContext.triggerCharacter == "." { @@ -974,12 +974,12 @@ func (c *completer) populateCommentCompletions(ctx context.Context, comment *ast // add TypeSpec fields to completion switch typeNode := spec.Type.(type) { case *ast.StructType: - c.addFieldItems(ctx, typeNode.Fields) + c.addFieldItems(typeNode.Fields) case *ast.FuncType: - c.addFieldItems(ctx, typeNode.Params) - c.addFieldItems(ctx, typeNode.Results) + c.addFieldItems(typeNode.Params) + c.addFieldItems(typeNode.Results) case *ast.InterfaceType: - c.addFieldItems(ctx, typeNode.Methods) + c.addFieldItems(typeNode.Methods) } if spec.Name.String() == "_" { @@ -1000,9 +1000,9 @@ func (c *completer) populateCommentCompletions(ctx context.Context, comment *ast } // handle functions case *ast.FuncDecl: - c.addFieldItems(ctx, node.Recv) - c.addFieldItems(ctx, node.Type.Params) - c.addFieldItems(ctx, node.Type.Results) + c.addFieldItems(node.Recv) + c.addFieldItems(node.Type.Params) + c.addFieldItems(node.Type.Results) // collect receiver struct fields if node.Recv != nil { @@ -1086,7 +1086,7 @@ func isValidIdentifierChar(char byte) bool { } // adds struct fields, interface methods, function declaration fields to completion -func (c *completer) addFieldItems(ctx context.Context, fields *ast.FieldList) { +func (c *completer) addFieldItems(fields *ast.FieldList) { if fields == nil { return } @@ -1466,7 +1466,7 @@ func (c *completer) methodsAndFields(typ types.Type, addressable bool, imp *impo if isStarTestingDotF(typ) && addressable { // is that a sufficient test? (or is more care needed?) - if c.fuzz(typ, mset, imp, cb, c.pkg.FileSet()) { + if c.fuzz(mset, imp, cb) { return } } diff --git a/gopls/internal/golang/completion/fuzz.go b/gopls/internal/golang/completion/fuzz.go index 76215419bbc..382676afc02 100644 --- a/gopls/internal/golang/completion/fuzz.go +++ b/gopls/internal/golang/completion/fuzz.go @@ -7,7 +7,6 @@ package completion import ( "fmt" "go/ast" - "go/token" "go/types" "strings" @@ -21,7 +20,7 @@ import ( // PJW: are there other packages where we can deduce usage constraints? // if we find fuzz completions, then return true, as those are the only completions to offer -func (c *completer) fuzz(typ types.Type, mset *types.MethodSet, imp *importInfo, cb func(candidate), fset *token.FileSet) bool { +func (c *completer) fuzz(mset *types.MethodSet, imp *importInfo, cb func(candidate)) bool { // 1. inside f.Fuzz? (only f.Failed and f.Name) // 2. possible completing f.Fuzz? // [Ident,SelectorExpr,Callexpr,ExprStmt,BlockiStmt,FuncDecl(Fuzz...)] diff --git a/gopls/internal/progress/progress_test.go b/gopls/internal/progress/progress_test.go index 41b69e85128..642103ae025 100644 --- a/gopls/internal/progress/progress_test.go +++ b/gopls/internal/progress/progress_test.go @@ -63,7 +63,7 @@ func (c *fakeClient) ShowMessage(context.Context, *protocol.ShowMessageParams) e return nil } -func setup(token protocol.ProgressToken) (context.Context, *Tracker, *fakeClient) { +func setup() (context.Context, *Tracker, *fakeClient) { c := &fakeClient{} tracker := NewTracker(c) tracker.SetSupportsWorkDoneProgress(true) @@ -109,7 +109,7 @@ func TestProgressTracker_Reporting(t *testing.T) { } { test := test t.Run(test.name, func(t *testing.T) { - ctx, tracker, client := setup(test.token) + ctx, tracker, client := setup() ctx, cancel := context.WithCancel(ctx) defer cancel() tracker.supportsWorkDoneProgress = test.supported @@ -147,7 +147,7 @@ func TestProgressTracker_Reporting(t *testing.T) { func TestProgressTracker_Cancellation(t *testing.T) { for _, token := range []protocol.ProgressToken{nil, 1, "a"} { - ctx, tracker, _ := setup(token) + ctx, tracker, _ := setup() var canceled bool cancel := func() { canceled = true } work := tracker.Start(ctx, "work", "message", token, cancel) diff --git a/gopls/internal/protocol/enums.go b/gopls/internal/protocol/enums.go index 87c14d8d553..e3f8b515542 100644 --- a/gopls/internal/protocol/enums.go +++ b/gopls/internal/protocol/enums.go @@ -117,7 +117,7 @@ func init() { namesTextDocumentSaveReason[int(FocusOut)] = "FocusOut" } -func formatEnum(f fmt.State, c rune, i int, names []string, unknown string) { +func formatEnum(f fmt.State, i int, names []string, unknown string) { s := "" if i >= 0 && i < len(names) { s = names[i] @@ -130,45 +130,45 @@ func formatEnum(f fmt.State, c rune, i int, names []string, unknown string) { } func (e TextDocumentSyncKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesTextDocumentSyncKind[:], "TextDocumentSyncKind") + formatEnum(f, int(e), namesTextDocumentSyncKind[:], "TextDocumentSyncKind") } func (e MessageType) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesMessageType[:], "MessageType") + formatEnum(f, int(e), namesMessageType[:], "MessageType") } func (e FileChangeType) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesFileChangeType[:], "FileChangeType") + formatEnum(f, int(e), namesFileChangeType[:], "FileChangeType") } func (e CompletionTriggerKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesCompletionTriggerKind[:], "CompletionTriggerKind") + formatEnum(f, int(e), namesCompletionTriggerKind[:], "CompletionTriggerKind") } func (e DiagnosticSeverity) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDiagnosticSeverity[:], "DiagnosticSeverity") + formatEnum(f, int(e), namesDiagnosticSeverity[:], "DiagnosticSeverity") } func (e DiagnosticTag) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDiagnosticTag[:], "DiagnosticTag") + formatEnum(f, int(e), namesDiagnosticTag[:], "DiagnosticTag") } func (e CompletionItemKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesCompletionItemKind[:], "CompletionItemKind") + formatEnum(f, int(e), namesCompletionItemKind[:], "CompletionItemKind") } func (e InsertTextFormat) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesInsertTextFormat[:], "InsertTextFormat") + formatEnum(f, int(e), namesInsertTextFormat[:], "InsertTextFormat") } func (e DocumentHighlightKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesDocumentHighlightKind[:], "DocumentHighlightKind") + formatEnum(f, int(e), namesDocumentHighlightKind[:], "DocumentHighlightKind") } func (e SymbolKind) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesSymbolKind[:], "SymbolKind") + formatEnum(f, int(e), namesSymbolKind[:], "SymbolKind") } func (e TextDocumentSaveReason) Format(f fmt.State, c rune) { - formatEnum(f, c, int(e), namesTextDocumentSaveReason[:], "TextDocumentSaveReason") + formatEnum(f, int(e), namesTextDocumentSaveReason[:], "TextDocumentSaveReason") } diff --git a/gopls/internal/server/diagnostics.go b/gopls/internal/server/diagnostics.go index 347184cee30..6aa01aba127 100644 --- a/gopls/internal/server/diagnostics.go +++ b/gopls/internal/server/diagnostics.go @@ -364,7 +364,7 @@ func (s *server) diagnose(ctx context.Context, snapshot *cache.Snapshot) (diagMa store("diagnosing vulnerabilities", vulnReports, vulnErr) workspacePkgs, err := snapshot.WorkspaceMetadata(ctx) - if s.shouldIgnoreError(ctx, snapshot, err) { + if s.shouldIgnoreError(snapshot, err) { return diagnostics, ctx.Err() } @@ -893,7 +893,7 @@ func toProtocolDiagnostics(diagnostics []*cache.Diagnostic) []protocol.Diagnosti return reports } -func (s *server) shouldIgnoreError(ctx context.Context, snapshot *cache.Snapshot, err error) bool { +func (s *server) shouldIgnoreError(snapshot *cache.Snapshot, err error) bool { if err == nil { // if there is no error at all return false } diff --git a/gopls/internal/server/semantic.go b/gopls/internal/server/semantic.go index abf0fe76b7f..7e279bdebc7 100644 --- a/gopls/internal/server/semantic.go +++ b/gopls/internal/server/semantic.go @@ -156,7 +156,7 @@ func (e *encoded) semantics() { e.token(c.Pos(), len(c.Text), tokComment, nil) continue } - e.multiline(c.Pos(), c.End(), c.Text, tokComment) + e.multiline(c.Pos(), c.End(), tokComment) } } } @@ -290,7 +290,7 @@ func (e *encoded) inspector(n ast.Node) bool { case *ast.BasicLit: if strings.Contains(x.Value, "\n") { // has to be a string. - e.multiline(x.Pos(), x.End(), x.Value, tokString) + e.multiline(x.Pos(), x.End(), tokString) break } ln := len(x.Value) @@ -802,7 +802,7 @@ func isTypeParam(x *ast.Ident, y *ast.FuncType) bool { return false } -func (e *encoded) multiline(start, end token.Pos, val string, tok tokenType) { +func (e *encoded) multiline(start, end token.Pos, tok tokenType) { f := e.fset.File(start) // the hard part is finding the lengths of lines. include the \n leng := func(line int) int { diff --git a/gopls/internal/test/integration/bench/iwl_test.go b/gopls/internal/test/integration/bench/iwl_test.go index 48ddbeaecc0..07a5d9070d0 100644 --- a/gopls/internal/test/integration/bench/iwl_test.go +++ b/gopls/internal/test/integration/bench/iwl_test.go @@ -16,24 +16,20 @@ import ( // BenchmarkInitialWorkspaceLoad benchmarks the initial workspace load time for // a new editing session. func BenchmarkInitialWorkspaceLoad(b *testing.B) { - tests := []struct { - repo string - file string - }{ - {"google-cloud-go", "httpreplay/httpreplay.go"}, - {"istio", "pkg/fuzz/util.go"}, - {"kubernetes", "pkg/controller/lookup_cache.go"}, - {"kuma", "api/generic/insights.go"}, - {"oracle", "dataintegration/data_type.go"}, - {"pkgsite", "internal/frontend/server.go"}, - {"starlark", "starlark/eval.go"}, - {"tools", "internal/lsp/cache/snapshot.go"}, - {"hashiform", "internal/provider/provider.go"}, + repoNames := []string{ + "google-cloud-go", + "istio", + "kubernetes", + "kuma", + "oracle", + "pkgsite", + "starlark", + "tools", + "hashiform", } - - for _, test := range tests { - b.Run(test.repo, func(b *testing.B) { - repo := getRepo(b, test.repo) + for _, repoName := range repoNames { + b.Run(repoName, func(b *testing.B) { + repo := getRepo(b, repoName) // get the (initialized) shared env to ensure the cache is warm. // Reuse its GOPATH so that we get cache hits for things in the module // cache. @@ -41,13 +37,13 @@ func BenchmarkInitialWorkspaceLoad(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - doIWL(b, sharedEnv.Sandbox.GOPATH(), repo, test.file) + doIWL(b, sharedEnv.Sandbox.GOPATH(), repo) } }) } } -func doIWL(b *testing.B, gopath string, repo *repo, file string) { +func doIWL(b *testing.B, gopath string, repo *repo) { // Exclude the time to set up the env from the benchmark time, as this may // involve installing gopls and/or checking out the repo dir. b.StopTimer() diff --git a/gopls/internal/test/integration/fake/editor.go b/gopls/internal/test/integration/fake/editor.go index c3659f8d005..e2eec07f51d 100644 --- a/gopls/internal/test/integration/fake/editor.go +++ b/gopls/internal/test/integration/fake/editor.go @@ -1291,7 +1291,7 @@ func (e *Editor) SignatureHelp(ctx context.Context, loc protocol.Location) (*pro } func (e *Editor) RenameFile(ctx context.Context, oldPath, newPath string) error { - closed, opened, err := e.renameBuffers(ctx, oldPath, newPath) + closed, opened, err := e.renameBuffers(oldPath, newPath) if err != nil { return err } @@ -1317,7 +1317,7 @@ func (e *Editor) RenameFile(ctx context.Context, oldPath, newPath string) error // renameBuffers renames in-memory buffers affected by the renaming of // oldPath->newPath, returning the resulting text documents that must be closed // and opened over the LSP. -func (e *Editor) renameBuffers(ctx context.Context, oldPath, newPath string) (closed []protocol.TextDocumentIdentifier, opened []protocol.TextDocumentItem, _ error) { +func (e *Editor) renameBuffers(oldPath, newPath string) (closed []protocol.TextDocumentIdentifier, opened []protocol.TextDocumentItem, _ error) { e.mu.Lock() defer e.mu.Unlock() diff --git a/gopls/internal/test/integration/misc/vuln_test.go b/gopls/internal/test/integration/misc/vuln_test.go index 884fc79d31b..f74c1c38d77 100644 --- a/gopls/internal/test/integration/misc/vuln_test.go +++ b/gopls/internal/test/integration/misc/vuln_test.go @@ -434,7 +434,7 @@ func (v VulnData) Vuln1() {} func (v VulnData) Vuln2() {} ` -func vulnTestEnv(vulnsDB, proxyData string) (*vulntest.DB, []RunOption, error) { +func vulnTestEnv(proxyData string) (*vulntest.DB, []RunOption, error) { db, err := vulntest.NewDatabase(context.Background(), []byte(vulnsData)) if err != nil { return nil, nil, nil @@ -458,7 +458,7 @@ func vulnTestEnv(vulnsDB, proxyData string) (*vulntest.DB, []RunOption, error) { } func TestRunVulncheckPackageDiagnostics(t *testing.T) { - db, opts0, err := vulnTestEnv(vulnsData, proxy1) + db, opts0, err := vulnTestEnv(proxy1) if err != nil { t.Fatal(err) } @@ -606,7 +606,7 @@ func TestRunGovulncheck_Expiry(t *testing.T) { }(cache.MaxGovulncheckResultAge) cache.MaxGovulncheckResultAge = 99 * time.Millisecond - db, opts0, err := vulnTestEnv(vulnsData, proxy1) + db, opts0, err := vulnTestEnv(proxy1) if err != nil { t.Fatal(err) } @@ -638,7 +638,7 @@ func stringify(a interface{}) string { } func TestRunVulncheckWarning(t *testing.T) { - db, opts, err := vulnTestEnv(vulnsData, proxy1) + db, opts, err := vulnTestEnv(proxy1) if err != nil { t.Fatal(err) } @@ -793,7 +793,7 @@ func OK() {} // ok. ` func TestGovulncheckInfo(t *testing.T) { - db, opts, err := vulnTestEnv(vulnsData, proxy2) + db, opts, err := vulnTestEnv(proxy2) if err != nil { t.Fatal(err) } From a1fbc781c2e5ebb63742eb7d6927a638ab448514 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Fri, 2 Feb 2024 18:19:06 -0500 Subject: [PATCH 089/105] gopls/internal/golang: move Go semantic tokens out of server This change--a pure refactoring--moves the common logic for LSP semantic token encoding into protocol/semtok, and pushes the Go- and template-specific logic into their respective packages. Change-Id: I308c37c9c8017c5fc38e3ce213a1d4ddb6b50e21 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560718 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/golang/semtok.go | 853 ++++++++++++++++++ gopls/internal/protocol/semtok/semtok.go | 101 +++ gopls/internal/server/semantic.go | 954 +-------------------- gopls/internal/template/implementations.go | 24 +- 4 files changed, 982 insertions(+), 950 deletions(-) create mode 100644 gopls/internal/golang/semtok.go create mode 100644 gopls/internal/protocol/semtok/semtok.go diff --git a/gopls/internal/golang/semtok.go b/gopls/internal/golang/semtok.go new file mode 100644 index 00000000000..360b3acd498 --- /dev/null +++ b/gopls/internal/golang/semtok.go @@ -0,0 +1,853 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package golang + +// This file defines the Semantic Tokens operation for Go source. + +import ( + "bytes" + "context" + "errors" + "fmt" + "go/ast" + "go/token" + "go/types" + "log" + "path/filepath" + "strings" + "time" + + "golang.org/x/tools/gopls/internal/cache" + "golang.org/x/tools/gopls/internal/cache/metadata" + "golang.org/x/tools/gopls/internal/file" + "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/semtok" + "golang.org/x/tools/gopls/internal/util/safetoken" + "golang.org/x/tools/internal/event" +) + +// to control comprehensive logging of decisions (gopls semtok foo.go > /dev/null shows log output) +// semDebug should NEVER be true in checked-in code +const semDebug = false + +// The LSP says that errors for the semantic token requests should only be returned +// for exceptions (a word not otherwise defined). This code treats a too-large file +// as an exception. On parse errors, the code does what it can. + +// reject full semantic token requests for large files +const maxFullFileSize int = 100000 + +func SemanticTokens(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, rng *protocol.Range) (*protocol.SemanticTokens, error) { + pkg, pgf, err := NarrowestPackageForFile(ctx, snapshot, fh.URI()) + if err != nil { + return nil, err + } + + // Select range. + var start, end token.Pos + if rng != nil { + var err error + start, end, err = pgf.RangePos(*rng) + if err != nil { + return nil, err // e.g. invalid range + } + } else { + tok := pgf.Tok + start, end = tok.Pos(0), tok.Pos(tok.Size()) // entire file + } + if int(end-start) > maxFullFileSize { + err := fmt.Errorf("semantic tokens: range %s too large (%d > %d)", + fh.URI().Path(), end-start, maxFullFileSize) + return nil, err + } + + tv := &tokenVisitor{ + ctx: ctx, + metadataSource: snapshot, + pgf: pgf, + start: start, + end: end, + ti: pkg.GetTypesInfo(), + pkg: pkg, + fset: pkg.FileSet(), + } + tv.visit() + return &protocol.SemanticTokens{ + Data: semtok.Encode( + tv.items, + snapshot.Options().NoSemanticString, + snapshot.Options().NoSemanticNumber, + snapshot.Options().SemanticTypes, + snapshot.Options().SemanticMods), + // For delta requests, but we've never seen any. + ResultID: time.Now().String(), + }, nil +} + +type tokenVisitor struct { + items []semtok.Token + ctx context.Context // for event logging + // metadataSource is used to resolve imports + metadataSource metadata.Source + pgf *ParsedGoFile + start, end token.Pos // range of interest + ti *types.Info + pkg *cache.Package + fset *token.FileSet + // path from the root of the parse tree, used for debugging + stack []ast.Node +} + +func (tv *tokenVisitor) visit() { + f := tv.pgf.File + // may not be in range, but harmless + tv.token(f.Package, len("package"), semtok.TokKeyword, nil) + tv.token(f.Name.NamePos, len(f.Name.Name), semtok.TokNamespace, nil) + inspect := func(n ast.Node) bool { + return tv.inspector(n) + } + for _, d := range f.Decls { + // only look at the decls that overlap the range + start, end := d.Pos(), d.End() + if end <= tv.start || start >= tv.end { + continue + } + ast.Inspect(d, inspect) + } + for _, cg := range f.Comments { + for _, c := range cg.List { + if strings.HasPrefix(c.Text, "//go:") { + tv.godirective(c) + continue + } + if !strings.Contains(c.Text, "\n") { + tv.token(c.Pos(), len(c.Text), semtok.TokComment, nil) + continue + } + tv.multiline(c.Pos(), c.End(), c.Text, semtok.TokComment) + } + } +} + +func (tv *tokenVisitor) token(start token.Pos, leng int, typ semtok.TokenType, mods []string) { + if !start.IsValid() { + // This is not worth reporting. TODO(pjw): does it still happen? + return + } + if start >= tv.end || start+token.Pos(leng) <= tv.start { + return + } + // want a line and column from start (in LSP coordinates). Ignore line directives. + lspRange, err := tv.pgf.PosRange(start, start+token.Pos(leng)) + if err != nil { + event.Error(tv.ctx, "failed to convert to range", err) + return + } + if lspRange.End.Line != lspRange.Start.Line { + // this happens if users are typing at the end of the file, but report nothing + return + } + tv.items = append(tv.items, semtok.Token{ + Line: lspRange.Start.Line, + Start: lspRange.Start.Character, + Len: lspRange.End.Character - lspRange.Start.Character, // all on one line + Type: typ, + Modifiers: mods, + }) +} + +// convert the stack to a string, for debugging +func (tv *tokenVisitor) strStack() string { + msg := []string{"["} + for i := len(tv.stack) - 1; i >= 0; i-- { + s := tv.stack[i] + msg = append(msg, fmt.Sprintf("%T", s)[5:]) + } + if len(tv.stack) > 0 { + loc := tv.stack[len(tv.stack)-1].Pos() + if _, err := safetoken.Offset(tv.pgf.Tok, loc); err != nil { + msg = append(msg, fmt.Sprintf("invalid position %v for %s", loc, tv.pgf.URI)) + } else { + add := safetoken.Position(tv.pgf.Tok, loc) + nm := filepath.Base(add.Filename) + msg = append(msg, fmt.Sprintf("(%s:%d,col:%d)", nm, add.Line, add.Column)) + } + } + msg = append(msg, "]") + return strings.Join(msg, " ") +} + +// find the line in the source +func (tv *tokenVisitor) srcLine(x ast.Node) string { + file := tv.pgf.Tok + line := safetoken.Line(file, x.Pos()) + start, err := safetoken.Offset(file, file.LineStart(line)) + if err != nil { + return "" + } + end := start + for ; end < len(tv.pgf.Src) && tv.pgf.Src[end] != '\n'; end++ { + + } + ans := tv.pgf.Src[start:end] + return string(ans) +} + +func (tv *tokenVisitor) inspector(n ast.Node) bool { + pop := func() { + tv.stack = tv.stack[:len(tv.stack)-1] + } + if n == nil { + pop() + return true + } + tv.stack = append(tv.stack, n) + switch x := n.(type) { + case *ast.ArrayType: + case *ast.AssignStmt: + tv.token(x.TokPos, len(x.Tok.String()), semtok.TokOperator, nil) + case *ast.BasicLit: + if strings.Contains(x.Value, "\n") { + // has to be a string. + tv.multiline(x.Pos(), x.End(), x.Value, semtok.TokString) + break + } + ln := len(x.Value) + what := semtok.TokNumber + if x.Kind == token.STRING { + what = semtok.TokString + } + tv.token(x.Pos(), ln, what, nil) + case *ast.BinaryExpr: + tv.token(x.OpPos, len(x.Op.String()), semtok.TokOperator, nil) + case *ast.BlockStmt: + case *ast.BranchStmt: + tv.token(x.TokPos, len(x.Tok.String()), semtok.TokKeyword, nil) + // There's no semantic encoding for labels + case *ast.CallExpr: + if x.Ellipsis != token.NoPos { + tv.token(x.Ellipsis, len("..."), semtok.TokOperator, nil) + } + case *ast.CaseClause: + iam := "case" + if x.List == nil { + iam = "default" + } + tv.token(x.Case, len(iam), semtok.TokKeyword, nil) + case *ast.ChanType: + // chan | chan <- | <- chan + switch { + case x.Arrow == token.NoPos: + tv.token(x.Begin, len("chan"), semtok.TokKeyword, nil) + case x.Arrow == x.Begin: + tv.token(x.Arrow, 2, semtok.TokOperator, nil) + pos := tv.findKeyword("chan", x.Begin+2, x.Value.Pos()) + tv.token(pos, len("chan"), semtok.TokKeyword, nil) + case x.Arrow != x.Begin: + tv.token(x.Begin, len("chan"), semtok.TokKeyword, nil) + tv.token(x.Arrow, 2, semtok.TokOperator, nil) + } + case *ast.CommClause: + iam := len("case") + if x.Comm == nil { + iam = len("default") + } + tv.token(x.Case, iam, semtok.TokKeyword, nil) + case *ast.CompositeLit: + case *ast.DeclStmt: + case *ast.DeferStmt: + tv.token(x.Defer, len("defer"), semtok.TokKeyword, nil) + case *ast.Ellipsis: + tv.token(x.Ellipsis, len("..."), semtok.TokOperator, nil) + case *ast.EmptyStmt: + case *ast.ExprStmt: + case *ast.Field: + case *ast.FieldList: + case *ast.ForStmt: + tv.token(x.For, len("for"), semtok.TokKeyword, nil) + case *ast.FuncDecl: + case *ast.FuncLit: + case *ast.FuncType: + if x.Func != token.NoPos { + tv.token(x.Func, len("func"), semtok.TokKeyword, nil) + } + case *ast.GenDecl: + tv.token(x.TokPos, len(x.Tok.String()), semtok.TokKeyword, nil) + case *ast.GoStmt: + tv.token(x.Go, len("go"), semtok.TokKeyword, nil) + case *ast.Ident: + tv.ident(x) + case *ast.IfStmt: + tv.token(x.If, len("if"), semtok.TokKeyword, nil) + if x.Else != nil { + // x.Body.End() or x.Body.End()+1, not that it matters + pos := tv.findKeyword("else", x.Body.End(), x.Else.Pos()) + tv.token(pos, len("else"), semtok.TokKeyword, nil) + } + case *ast.ImportSpec: + tv.importSpec(x) + pop() + return false + case *ast.IncDecStmt: + tv.token(x.TokPos, len(x.Tok.String()), semtok.TokOperator, nil) + case *ast.IndexExpr: + case *ast.IndexListExpr: + case *ast.InterfaceType: + tv.token(x.Interface, len("interface"), semtok.TokKeyword, nil) + case *ast.KeyValueExpr: + case *ast.LabeledStmt: + case *ast.MapType: + tv.token(x.Map, len("map"), semtok.TokKeyword, nil) + case *ast.ParenExpr: + case *ast.RangeStmt: + tv.token(x.For, len("for"), semtok.TokKeyword, nil) + // x.TokPos == token.NoPos is legal (for range foo {}) + offset := x.TokPos + if offset == token.NoPos { + offset = x.For + } + pos := tv.findKeyword("range", offset, x.X.Pos()) + tv.token(pos, len("range"), semtok.TokKeyword, nil) + case *ast.ReturnStmt: + tv.token(x.Return, len("return"), semtok.TokKeyword, nil) + case *ast.SelectStmt: + tv.token(x.Select, len("select"), semtok.TokKeyword, nil) + case *ast.SelectorExpr: + case *ast.SendStmt: + tv.token(x.Arrow, len("<-"), semtok.TokOperator, nil) + case *ast.SliceExpr: + case *ast.StarExpr: + tv.token(x.Star, len("*"), semtok.TokOperator, nil) + case *ast.StructType: + tv.token(x.Struct, len("struct"), semtok.TokKeyword, nil) + case *ast.SwitchStmt: + tv.token(x.Switch, len("switch"), semtok.TokKeyword, nil) + case *ast.TypeAssertExpr: + if x.Type == nil { + pos := tv.findKeyword("type", x.Lparen, x.Rparen) + tv.token(pos, len("type"), semtok.TokKeyword, nil) + } + case *ast.TypeSpec: + case *ast.TypeSwitchStmt: + tv.token(x.Switch, len("switch"), semtok.TokKeyword, nil) + case *ast.UnaryExpr: + tv.token(x.OpPos, len(x.Op.String()), semtok.TokOperator, nil) + case *ast.ValueSpec: + // things only seen with parsing or type errors, so ignore them + case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt: + return true + // not going to see these + case *ast.File, *ast.Package: + tv.unexpected(fmt.Sprintf("implement %T %s", x, safetoken.Position(tv.pgf.Tok, x.Pos()))) + // other things we knowingly ignore + case *ast.Comment, *ast.CommentGroup: + pop() + return false + default: + tv.unexpected(fmt.Sprintf("failed to implement %T", x)) + } + return true +} + +func (tv *tokenVisitor) ident(x *ast.Ident) { + if tv.ti == nil { + what, mods := tv.unkIdent(x) + if what != "" { + tv.token(x.Pos(), len(x.String()), what, mods) + } + if semDebug { + log.Printf(" nil %s/nil/nil %q %v %s", x.String(), what, mods, tv.strStack()) + } + return + } + def := tv.ti.Defs[x] + if def != nil { + what, mods := tv.definitionFor(x, def) + if what != "" { + tv.token(x.Pos(), len(x.String()), what, mods) + } + if semDebug { + log.Printf(" for %s/%T/%T got %s %v (%s)", x.String(), def, def.Type(), what, mods, tv.strStack()) + } + return + } + use := tv.ti.Uses[x] + tok := func(pos token.Pos, lng int, tok semtok.TokenType, mods []string) { + tv.token(pos, lng, tok, mods) + q := "nil" + if use != nil { + q = fmt.Sprintf("%T", use.Type()) + } + if semDebug { + log.Printf(" use %s/%T/%s got %s %v (%s)", x.String(), use, q, tok, mods, tv.strStack()) + } + } + + switch y := use.(type) { + case nil: + what, mods := tv.unkIdent(x) + if what != "" { + tok(x.Pos(), len(x.String()), what, mods) + } else if semDebug { + // tok() wasn't called, so didn't log + log.Printf(" nil %s/%T/nil %q %v (%s)", x.String(), use, what, mods, tv.strStack()) + } + return + case *types.Builtin: + tok(x.NamePos, len(x.Name), semtok.TokFunction, []string{"defaultLibrary"}) + case *types.Const: + mods := []string{"readonly"} + tt := y.Type() + if _, ok := tt.(*types.Basic); ok { + tok(x.Pos(), len(x.String()), semtok.TokVariable, mods) + break + } + if ttx, ok := tt.(*types.Named); ok { + if x.String() == "iota" { + tv.unexpected(fmt.Sprintf("iota:%T", ttx)) + } + if _, ok := ttx.Underlying().(*types.Basic); ok { + tok(x.Pos(), len(x.String()), semtok.TokVariable, mods) + break + } + tv.unexpected(fmt.Sprintf("%q/%T", x.String(), tt)) + } + // can this happen? Don't think so + tv.unexpected(fmt.Sprintf("%s %T %#v", x.String(), tt, tt)) + case *types.Func: + tok(x.Pos(), len(x.Name), semtok.TokFunction, nil) + case *types.Label: + // nothing to map it to + case *types.Nil: + // nil is a predeclared identifier + tok(x.Pos(), len("nil"), semtok.TokVariable, []string{"readonly", "defaultLibrary"}) + case *types.PkgName: + tok(x.Pos(), len(x.Name), semtok.TokNamespace, nil) + case *types.TypeName: // could be a TokTypeParam + var mods []string + if _, ok := y.Type().(*types.Basic); ok { + mods = []string{"defaultLibrary"} + } else if _, ok := y.Type().(*types.TypeParam); ok { + tok(x.Pos(), len(x.String()), semtok.TokTypeParam, mods) + break + } + tok(x.Pos(), len(x.String()), semtok.TokType, mods) + case *types.Var: + if isSignature(y) { + tok(x.Pos(), len(x.Name), semtok.TokFunction, nil) + } else if tv.isParam(use.Pos()) { + // variable, unless use.pos is the pos of a Field in an ancestor FuncDecl + // or FuncLit and then it's a parameter + tok(x.Pos(), len(x.Name), semtok.TokParameter, nil) + } else { + tok(x.Pos(), len(x.Name), semtok.TokVariable, nil) + } + + default: + // can't happen + if use == nil { + msg := fmt.Sprintf("%#v %#v %#v", x, tv.ti.Defs[x], tv.ti.Uses[x]) + tv.unexpected(msg) + } + if use.Type() != nil { + tv.unexpected(fmt.Sprintf("%s %T/%T,%#v", x.String(), use, use.Type(), use)) + } else { + tv.unexpected(fmt.Sprintf("%s %T", x.String(), use)) + } + } +} + +func (tv *tokenVisitor) isParam(pos token.Pos) bool { + for i := len(tv.stack) - 1; i >= 0; i-- { + switch n := tv.stack[i].(type) { + case *ast.FuncDecl: + for _, f := range n.Type.Params.List { + for _, id := range f.Names { + if id.Pos() == pos { + return true + } + } + } + case *ast.FuncLit: + for _, f := range n.Type.Params.List { + for _, id := range f.Names { + if id.Pos() == pos { + return true + } + } + } + } + } + return false +} + +func isSignature(use types.Object) bool { + if _, ok := use.(*types.Var); !ok { + return false + } + v := use.Type() + if v == nil { + return false + } + if _, ok := v.(*types.Signature); ok { + return true + } + return false +} + +// both tv.ti.Defs and tv.ti.Uses are nil. use the parse stack. +// a lot of these only happen when the package doesn't compile +// but in that case it is all best-effort from the parse tree +func (tv *tokenVisitor) unkIdent(x *ast.Ident) (semtok.TokenType, []string) { + def := []string{"definition"} + n := len(tv.stack) - 2 // parent of Ident + if n < 0 { + tv.unexpected("no stack?") + return "", nil + } + switch nd := tv.stack[n].(type) { + case *ast.BinaryExpr, *ast.UnaryExpr, *ast.ParenExpr, *ast.StarExpr, + *ast.IncDecStmt, *ast.SliceExpr, *ast.ExprStmt, *ast.IndexExpr, + *ast.ReturnStmt, *ast.ChanType, *ast.SendStmt, + *ast.ForStmt, // possibly incomplete + *ast.IfStmt, /* condition */ + *ast.KeyValueExpr, // either key or value + *ast.IndexListExpr: + return semtok.TokVariable, nil + case *ast.Ellipsis: + return semtok.TokType, nil + case *ast.CaseClause: + if n-2 >= 0 { + if _, ok := tv.stack[n-2].(*ast.TypeSwitchStmt); ok { + return semtok.TokType, nil + } + } + return semtok.TokVariable, nil + case *ast.ArrayType: + if x == nd.Len { + // or maybe a Type Param, but we can't just from the parse tree + return semtok.TokVariable, nil + } else { + return semtok.TokType, nil + } + case *ast.MapType: + return semtok.TokType, nil + case *ast.CallExpr: + if x == nd.Fun { + return semtok.TokFunction, nil + } + return semtok.TokVariable, nil + case *ast.SwitchStmt: + return semtok.TokVariable, nil + case *ast.TypeAssertExpr: + if x == nd.X { + return semtok.TokVariable, nil + } else if x == nd.Type { + return semtok.TokType, nil + } + case *ast.ValueSpec: + for _, p := range nd.Names { + if p == x { + return semtok.TokVariable, def + } + } + for _, p := range nd.Values { + if p == x { + return semtok.TokVariable, nil + } + } + return semtok.TokType, nil + case *ast.SelectorExpr: // e.ti.Selections[nd] is nil, so no help + if n-1 >= 0 { + if ce, ok := tv.stack[n-1].(*ast.CallExpr); ok { + // ... CallExpr SelectorExpr Ident (_.x()) + if ce.Fun == nd && nd.Sel == x { + return semtok.TokFunction, nil + } + } + } + return semtok.TokVariable, nil + case *ast.AssignStmt: + for _, p := range nd.Lhs { + // x := ..., or x = ... + if p == x { + if nd.Tok != token.DEFINE { + def = nil + } + return semtok.TokVariable, def // '_' in _ = ... + } + } + // RHS, = x + return semtok.TokVariable, nil + case *ast.TypeSpec: // it's a type if it is either the Name or the Type + if x == nd.Type { + def = nil + } + return semtok.TokType, def + case *ast.Field: + // ident could be type in a field, or a method in an interface type, or a variable + if x == nd.Type { + return semtok.TokType, nil + } + if n-2 >= 0 { + _, okit := tv.stack[n-2].(*ast.InterfaceType) + _, okfl := tv.stack[n-1].(*ast.FieldList) + if okit && okfl { + return semtok.TokMethod, def + } + } + return semtok.TokVariable, nil + case *ast.LabeledStmt, *ast.BranchStmt: + // nothing to report + case *ast.CompositeLit: + if nd.Type == x { + return semtok.TokType, nil + } + return semtok.TokVariable, nil + case *ast.RangeStmt: + if nd.Tok != token.DEFINE { + def = nil + } + return semtok.TokVariable, def + case *ast.FuncDecl: + return semtok.TokFunction, def + default: + msg := fmt.Sprintf("%T undexpected: %s %s%q", nd, x.Name, tv.strStack(), tv.srcLine(x)) + tv.unexpected(msg) + } + return "", nil +} + +func isDeprecated(n *ast.CommentGroup) bool { + if n == nil { + return false + } + for _, c := range n.List { + if strings.HasPrefix(c.Text, "// Deprecated") { + return true + } + } + return false +} + +func (tv *tokenVisitor) definitionFor(x *ast.Ident, def types.Object) (semtok.TokenType, []string) { + // PJW: def == types.Label? probably a nothing + // PJW: look into replacing these syntactic tests with types more generally + mods := []string{"definition"} + for i := len(tv.stack) - 1; i >= 0; i-- { + s := tv.stack[i] + switch y := s.(type) { + case *ast.AssignStmt, *ast.RangeStmt: + if x.Name == "_" { + return "", nil // not really a variable + } + return semtok.TokVariable, mods + case *ast.GenDecl: + if isDeprecated(y.Doc) { + mods = append(mods, "deprecated") + } + if y.Tok == token.CONST { + mods = append(mods, "readonly") + } + return semtok.TokVariable, mods + case *ast.FuncDecl: + // If x is immediately under a FuncDecl, it is a function or method + if i == len(tv.stack)-2 { + if isDeprecated(y.Doc) { + mods = append(mods, "deprecated") + } + if y.Recv != nil { + return semtok.TokMethod, mods + } + return semtok.TokFunction, mods + } + // if x < ... < FieldList < FuncDecl, this is the receiver, a variable + // PJW: maybe not. it might be a typeparameter in the type of the receiver + if _, ok := tv.stack[i+1].(*ast.FieldList); ok { + if _, ok := def.(*types.TypeName); ok { + return semtok.TokTypeParam, mods + } + return semtok.TokVariable, nil + } + // if x < ... < FieldList < FuncType < FuncDecl, this is a param + return semtok.TokParameter, mods + case *ast.FuncType: // is it in the TypeParams? + if isTypeParam(x, y) { + return semtok.TokTypeParam, mods + } + return semtok.TokParameter, mods + case *ast.InterfaceType: + return semtok.TokMethod, mods + case *ast.TypeSpec: + // GenDecl/Typespec/FuncType/FieldList/Field/Ident + // (type A func(b uint64)) (err error) + // b and err should not be semtok.TokType, but semtok.TokVariable + // and in GenDecl/TpeSpec/StructType/FieldList/Field/Ident + // (type A struct{b uint64} + // but on type B struct{C}), C is a type, but is not being defined. + // GenDecl/TypeSpec/FieldList/Field/Ident is a typeParam + if _, ok := tv.stack[i+1].(*ast.FieldList); ok { + return semtok.TokTypeParam, mods + } + fldm := tv.stack[len(tv.stack)-2] + if fld, ok := fldm.(*ast.Field); ok { + // if len(fld.names) == 0 this is a semtok.TokType, being used + if len(fld.Names) == 0 { + return semtok.TokType, nil + } + return semtok.TokVariable, mods + } + return semtok.TokType, mods + } + } + // can't happen + msg := fmt.Sprintf("failed to find the decl for %s", safetoken.Position(tv.pgf.Tok, x.Pos())) + tv.unexpected(msg) + return "", []string{""} +} + +func isTypeParam(x *ast.Ident, y *ast.FuncType) bool { + tp := y.TypeParams + if tp == nil { + return false + } + for _, p := range tp.List { + for _, n := range p.Names { + if x == n { + return true + } + } + } + return false +} + +func (tv *tokenVisitor) multiline(start, end token.Pos, val string, tok semtok.TokenType) { + f := tv.fset.File(start) + // the hard part is finding the lengths of lines. include the \n + leng := func(line int) int { + n := f.LineStart(line) + if line >= f.LineCount() { + return f.Size() - int(n) + } + return int(f.LineStart(line+1) - n) + } + spos := safetoken.StartPosition(tv.fset, start) + epos := safetoken.EndPosition(tv.fset, end) + sline := spos.Line + eline := epos.Line + // first line is from spos.Column to end + tv.token(start, leng(sline)-spos.Column, tok, nil) // leng(sline)-1 - (spos.Column-1) + for i := sline + 1; i < eline; i++ { + // intermediate lines are from 1 to end + tv.token(f.LineStart(i), leng(i)-1, tok, nil) // avoid the newline + } + // last line is from 1 to epos.Column + tv.token(f.LineStart(eline), epos.Column-1, tok, nil) // columns are 1-based +} + +// findKeyword finds a keyword rather than guessing its location +func (tv *tokenVisitor) findKeyword(keyword string, start, end token.Pos) token.Pos { + offset := int(start) - tv.pgf.Tok.Base() + last := int(end) - tv.pgf.Tok.Base() + buf := tv.pgf.Src + idx := bytes.Index(buf[offset:last], []byte(keyword)) + if idx != -1 { + return start + token.Pos(idx) + } + //(in unparsable programs: type _ <-<-chan int) + tv.unexpected(fmt.Sprintf("not found:%s %v", keyword, safetoken.StartPosition(tv.fset, start))) + return token.NoPos +} + +func (tv *tokenVisitor) importSpec(d *ast.ImportSpec) { + // a local package name or the last component of the Path + if d.Name != nil { + nm := d.Name.String() + if nm != "_" && nm != "." { + tv.token(d.Name.Pos(), len(nm), semtok.TokNamespace, nil) + } + return // don't mark anything for . or _ + } + importPath := metadata.UnquoteImportPath(d) + if importPath == "" { + return + } + // Import strings are implementation defined. Try to match with parse information. + depID := tv.pkg.Metadata().DepsByImpPath[importPath] + if depID == "" { + return + } + depMD := tv.metadataSource.Metadata(depID) + if depMD == nil { + // unexpected, but impact is that maybe some import is not colored + return + } + // Check whether the original literal contains the package's declared name. + j := strings.LastIndex(d.Path.Value, string(depMD.Name)) + if j == -1 { + // Package name does not match import path, so there is nothing to report. + return + } + // Report virtual declaration at the position of the substring. + start := d.Path.Pos() + token.Pos(j) + tv.token(start, len(depMD.Name), semtok.TokNamespace, nil) +} + +// log unexpected state +func (tv *tokenVisitor) unexpected(msg string) { + if semDebug { + panic(msg) + } + event.Error(tv.ctx, tv.strStack(), errors.New(msg)) +} + +var godirectives = map[string]struct{}{ + // https://pkg.go.dev/cmd/compile + "noescape": {}, + "uintptrescapes": {}, + "noinline": {}, + "norace": {}, + "nosplit": {}, + "linkname": {}, + + // https://pkg.go.dev/go/build + "build": {}, + "binary-only-package": {}, + "embed": {}, +} + +// Tokenize godirective at the start of the comment c, if any, and the surrounding comment. +// If there is any failure, emits the entire comment as a TokComment token. +// Directives are highlighted as-is, even if used incorrectly. Typically there are +// dedicated analyzers that will warn about misuse. +func (tv *tokenVisitor) godirective(c *ast.Comment) { + // First check if '//go:directive args...' is a valid directive. + directive, args, _ := strings.Cut(c.Text, " ") + kind, _ := stringsCutPrefix(directive, "//go:") + if _, ok := godirectives[kind]; !ok { + // Unknown go: directive. + tv.token(c.Pos(), len(c.Text), semtok.TokComment, nil) + return + } + + // Make the 'go:directive' part stand out, the rest is comments. + tv.token(c.Pos(), len("//"), semtok.TokComment, nil) + + directiveStart := c.Pos() + token.Pos(len("//")) + tv.token(directiveStart, len(directive[len("//"):]), semtok.TokNamespace, nil) + + if len(args) > 0 { + tailStart := c.Pos() + token.Pos(len(directive)+len(" ")) + tv.token(tailStart, len(args), semtok.TokComment, nil) + } +} + +// Go 1.20 strings.CutPrefix. +func stringsCutPrefix(s, prefix string) (after string, found bool) { + if !strings.HasPrefix(s, prefix) { + return s, false + } + return s[len(prefix):], true +} diff --git a/gopls/internal/protocol/semtok/semtok.go b/gopls/internal/protocol/semtok/semtok.go new file mode 100644 index 00000000000..e69ec825f17 --- /dev/null +++ b/gopls/internal/protocol/semtok/semtok.go @@ -0,0 +1,101 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The semtok package provides an encoder for LSP's semantic tokens. +package semtok + +import "sort" + +// A Token provides the extent and semantics of a token. +type Token struct { + Line, Start uint32 + Len uint32 + Type TokenType + Modifiers []string +} + +type TokenType string + +const ( + TokNamespace TokenType = "namespace" + TokType TokenType = "type" + TokInterface TokenType = "interface" + TokTypeParam TokenType = "typeParameter" + TokParameter TokenType = "parameter" + TokVariable TokenType = "variable" + TokMethod TokenType = "method" + TokFunction TokenType = "function" + TokKeyword TokenType = "keyword" + TokComment TokenType = "comment" + TokString TokenType = "string" + TokNumber TokenType = "number" + TokOperator TokenType = "operator" + TokMacro TokenType = "macro" // for templates +) + +// Encode returns the LSP encoding of a sequence of tokens. +// The noStrings, noNumbers options cause strings, numbers to be skipped. +// The lists of types and modifiers determines the bitfield encoding. +func Encode( + tokens []Token, + noStrings, noNumbers bool, + types, modifiers []string) []uint32 { + + // binary operators, at least, will be out of order + sort.Slice(tokens, func(i, j int) bool { + if tokens[i].Line != tokens[j].Line { + return tokens[i].Line < tokens[j].Line + } + return tokens[i].Start < tokens[j].Start + }) + + typeMap := make(map[TokenType]int) + for i, t := range types { + typeMap[TokenType(t)] = i + } + + modMap := make(map[string]int) + for i, m := range modifiers { + modMap[m] = 1 << uint(i) // go 1.12 compatibility + } + + // each semantic token needs five values + // (see Integer Encoding for Tokens in the LSP spec) + x := make([]uint32, 5*len(tokens)) + var j int + var last Token + for i := 0; i < len(tokens); i++ { + item := tokens[i] + typ, ok := typeMap[item.Type] + if !ok { + continue // client doesn't want typeStr + } + if item.Type == TokString && noStrings { + continue + } + if item.Type == TokNumber && noNumbers { + continue + } + if j == 0 { + x[0] = tokens[0].Line + } else { + x[j] = item.Line - last.Line + } + x[j+1] = item.Start + if j > 0 && x[j] == 0 { + x[j+1] = item.Start - last.Start + } + x[j+2] = item.Len + x[j+3] = uint32(typ) + mask := 0 + for _, s := range item.Modifiers { + // modMap[s] is 0 if the client doesn't want this modifier + mask |= modMap[s] + } + x[j+4] = uint32(mask) + j += 5 + last = item + } + return x[:j] +} diff --git a/gopls/internal/server/semantic.go b/gopls/internal/server/semantic.go index 7e279bdebc7..646f9b3d729 100644 --- a/gopls/internal/server/semantic.go +++ b/gopls/internal/server/semantic.go @@ -5,41 +5,17 @@ package server import ( - "bytes" "context" - "errors" "fmt" - "go/ast" - "go/token" - "go/types" - "log" - "path/filepath" - "sort" - "strings" - "time" - "golang.org/x/tools/gopls/internal/cache" - "golang.org/x/tools/gopls/internal/cache/metadata" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/golang" "golang.org/x/tools/gopls/internal/protocol" "golang.org/x/tools/gopls/internal/template" - "golang.org/x/tools/gopls/internal/util/safetoken" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/tag" ) -// The LSP says that errors for the semantic token requests should only be returned -// for exceptions (a word not otherwise defined). This code treats a too-large file -// as an exception. On parse errors, the code does what it can. - -// reject full semantic token requests for large files -const maxFullFileSize int = 100000 - -// to control comprehensive logging of decisions (gopls semtok foo.go > /dev/null shows log output) -// semDebug should NEVER be true in checked-in code -const semDebug = false - func (s *server) SemanticTokensFull(ctx context.Context, params *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) { return s.semanticTokens(ctx, params.TextDocument, nil) } @@ -63,931 +39,15 @@ func (s *server) semanticTokens(ctx context.Context, td protocol.TextDocumentIde return nil, fmt.Errorf("semantictokens are disabled") } - kind := snapshot.FileKind(fh) - if kind == file.Tmpl { - // this is a little cumbersome to avoid both exporting 'encoded' and its methods - // and to avoid import cycles - e := &encoded{ - ctx: ctx, - metadataSource: snapshot, - tokTypes: snapshot.Options().SemanticTypes, - tokMods: snapshot.Options().SemanticMods, - } - add := func(line, start uint32, len uint32) { - // TODO(adonovan): don't ignore the rng restriction, if any. - e.add(line, start, len, tokMacro, nil) - } - data := func() []uint32 { - return e.Data() - } - return template.SemanticTokens(ctx, snapshot, fh.URI(), add, data) - } - if kind != file.Go { - return nil, nil // empty result - } - pkg, pgf, err := golang.NarrowestPackageForFile(ctx, snapshot, fh.URI()) - if err != nil { - return nil, err - } - - // Select range. - var start, end token.Pos - if rng != nil { - var err error - start, end, err = pgf.RangePos(*rng) - if err != nil { - return nil, err // e.g. invalid range - } - } else { - tok := pgf.Tok - start, end = tok.Pos(0), tok.Pos(tok.Size()) // entire file - } - if int(end-start) > maxFullFileSize { - err := fmt.Errorf("semantic tokens: range %s too large (%d > %d)", - fh.URI().Path(), end-start, maxFullFileSize) - return nil, err - } - - e := &encoded{ - ctx: ctx, - metadataSource: snapshot, - pgf: pgf, - start: start, - end: end, - ti: pkg.GetTypesInfo(), - pkg: pkg, - fset: pkg.FileSet(), - tokTypes: snapshot.Options().SemanticTypes, - tokMods: snapshot.Options().SemanticMods, - noStrings: snapshot.Options().NoSemanticString, - noNumbers: snapshot.Options().NoSemanticNumber, - } - e.semantics() - return &protocol.SemanticTokens{ - Data: e.Data(), - // For delta requests, but we've never seen any. - ResultID: fmt.Sprintf("%v", time.Now()), - }, nil -} - -func (e *encoded) semantics() { - f := e.pgf.File - // may not be in range, but harmless - e.token(f.Package, len("package"), tokKeyword, nil) - e.token(f.Name.NamePos, len(f.Name.Name), tokNamespace, nil) - inspect := func(n ast.Node) bool { - return e.inspector(n) - } - for _, d := range f.Decls { - // only look at the decls that overlap the range - start, end := d.Pos(), d.End() - if end <= e.start || start >= e.end { - continue - } - ast.Inspect(d, inspect) - } - for _, cg := range f.Comments { - for _, c := range cg.List { - if strings.HasPrefix(c.Text, "//go:") { - e.godirective(c) - continue - } - if !strings.Contains(c.Text, "\n") { - e.token(c.Pos(), len(c.Text), tokComment, nil) - continue - } - e.multiline(c.Pos(), c.End(), tokComment) - } - } -} - -type tokenType string - -const ( - tokNamespace tokenType = "namespace" - tokType tokenType = "type" - tokInterface tokenType = "interface" - tokTypeParam tokenType = "typeParameter" - tokParameter tokenType = "parameter" - tokVariable tokenType = "variable" - tokMethod tokenType = "method" - tokFunction tokenType = "function" - tokKeyword tokenType = "keyword" - tokComment tokenType = "comment" - tokString tokenType = "string" - tokNumber tokenType = "number" - tokOperator tokenType = "operator" - - tokMacro tokenType = "macro" // for templates -) - -func (e *encoded) token(start token.Pos, leng int, typ tokenType, mods []string) { - if !start.IsValid() { - // This is not worth reporting. TODO(pjw): does it still happen? - return - } - if start >= e.end || start+token.Pos(leng) <= e.start { - return - } - // want a line and column from start (in LSP coordinates). Ignore line directives. - lspRange, err := e.pgf.PosRange(start, start+token.Pos(leng)) - if err != nil { - event.Error(e.ctx, "failed to convert to range", err) - return - } - if lspRange.End.Line != lspRange.Start.Line { - // this happens if users are typing at the end of the file, but report nothing - return - } - // token is all on one line - length := lspRange.End.Character - lspRange.Start.Character - e.add(lspRange.Start.Line, lspRange.Start.Character, length, typ, mods) -} - -func (e *encoded) add(line, start uint32, len uint32, tok tokenType, mod []string) { - x := semItem{line, start, len, tok, mod} - e.items = append(e.items, x) -} - -// semItem represents a token found walking the parse tree -type semItem struct { - line, start uint32 - len uint32 - typeStr tokenType - mods []string -} - -type encoded struct { - // the generated data - items []semItem - - noStrings bool - noNumbers bool - - ctx context.Context - // metadataSource is used to resolve imports - metadataSource metadata.Source - tokTypes, tokMods []string - pgf *golang.ParsedGoFile - start, end token.Pos // range of interest - ti *types.Info - pkg *cache.Package - fset *token.FileSet - // path from the root of the parse tree, used for debugging - stack []ast.Node -} - -// convert the stack to a string, for debugging -func (e *encoded) strStack() string { - msg := []string{"["} - for i := len(e.stack) - 1; i >= 0; i-- { - s := e.stack[i] - msg = append(msg, fmt.Sprintf("%T", s)[5:]) - } - if len(e.stack) > 0 { - loc := e.stack[len(e.stack)-1].Pos() - if _, err := safetoken.Offset(e.pgf.Tok, loc); err != nil { - msg = append(msg, fmt.Sprintf("invalid position %v for %s", loc, e.pgf.URI)) - } else { - add := safetoken.Position(e.pgf.Tok, loc) - nm := filepath.Base(add.Filename) - msg = append(msg, fmt.Sprintf("(%s:%d,col:%d)", nm, add.Line, add.Column)) - } - } - msg = append(msg, "]") - return strings.Join(msg, " ") -} - -// find the line in the source -func (e *encoded) srcLine(x ast.Node) string { - file := e.pgf.Tok - line := safetoken.Line(file, x.Pos()) - start, err := safetoken.Offset(file, file.LineStart(line)) - if err != nil { - return "" - } - end := start - for ; end < len(e.pgf.Src) && e.pgf.Src[end] != '\n'; end++ { - - } - ans := e.pgf.Src[start:end] - return string(ans) -} - -func (e *encoded) inspector(n ast.Node) bool { - pop := func() { - e.stack = e.stack[:len(e.stack)-1] - } - if n == nil { - pop() - return true - } - e.stack = append(e.stack, n) - switch x := n.(type) { - case *ast.ArrayType: - case *ast.AssignStmt: - e.token(x.TokPos, len(x.Tok.String()), tokOperator, nil) - case *ast.BasicLit: - if strings.Contains(x.Value, "\n") { - // has to be a string. - e.multiline(x.Pos(), x.End(), tokString) - break - } - ln := len(x.Value) - what := tokNumber - if x.Kind == token.STRING { - what = tokString - } - e.token(x.Pos(), ln, what, nil) - case *ast.BinaryExpr: - e.token(x.OpPos, len(x.Op.String()), tokOperator, nil) - case *ast.BlockStmt: - case *ast.BranchStmt: - e.token(x.TokPos, len(x.Tok.String()), tokKeyword, nil) - // There's no semantic encoding for labels - case *ast.CallExpr: - if x.Ellipsis != token.NoPos { - e.token(x.Ellipsis, len("..."), tokOperator, nil) - } - case *ast.CaseClause: - iam := "case" - if x.List == nil { - iam = "default" - } - e.token(x.Case, len(iam), tokKeyword, nil) - case *ast.ChanType: - // chan | chan <- | <- chan - switch { - case x.Arrow == token.NoPos: - e.token(x.Begin, len("chan"), tokKeyword, nil) - case x.Arrow == x.Begin: - e.token(x.Arrow, 2, tokOperator, nil) - pos := e.findKeyword("chan", x.Begin+2, x.Value.Pos()) - e.token(pos, len("chan"), tokKeyword, nil) - case x.Arrow != x.Begin: - e.token(x.Begin, len("chan"), tokKeyword, nil) - e.token(x.Arrow, 2, tokOperator, nil) - } - case *ast.CommClause: - iam := len("case") - if x.Comm == nil { - iam = len("default") - } - e.token(x.Case, iam, tokKeyword, nil) - case *ast.CompositeLit: - case *ast.DeclStmt: - case *ast.DeferStmt: - e.token(x.Defer, len("defer"), tokKeyword, nil) - case *ast.Ellipsis: - e.token(x.Ellipsis, len("..."), tokOperator, nil) - case *ast.EmptyStmt: - case *ast.ExprStmt: - case *ast.Field: - case *ast.FieldList: - case *ast.ForStmt: - e.token(x.For, len("for"), tokKeyword, nil) - case *ast.FuncDecl: - case *ast.FuncLit: - case *ast.FuncType: - if x.Func != token.NoPos { - e.token(x.Func, len("func"), tokKeyword, nil) - } - case *ast.GenDecl: - e.token(x.TokPos, len(x.Tok.String()), tokKeyword, nil) - case *ast.GoStmt: - e.token(x.Go, len("go"), tokKeyword, nil) - case *ast.Ident: - e.ident(x) - case *ast.IfStmt: - e.token(x.If, len("if"), tokKeyword, nil) - if x.Else != nil { - // x.Body.End() or x.Body.End()+1, not that it matters - pos := e.findKeyword("else", x.Body.End(), x.Else.Pos()) - e.token(pos, len("else"), tokKeyword, nil) - } - case *ast.ImportSpec: - e.importSpec(x) - pop() - return false - case *ast.IncDecStmt: - e.token(x.TokPos, len(x.Tok.String()), tokOperator, nil) - case *ast.IndexExpr: - case *ast.IndexListExpr: - case *ast.InterfaceType: - e.token(x.Interface, len("interface"), tokKeyword, nil) - case *ast.KeyValueExpr: - case *ast.LabeledStmt: - case *ast.MapType: - e.token(x.Map, len("map"), tokKeyword, nil) - case *ast.ParenExpr: - case *ast.RangeStmt: - e.token(x.For, len("for"), tokKeyword, nil) - // x.TokPos == token.NoPos is legal (for range foo {}) - offset := x.TokPos - if offset == token.NoPos { - offset = x.For - } - pos := e.findKeyword("range", offset, x.X.Pos()) - e.token(pos, len("range"), tokKeyword, nil) - case *ast.ReturnStmt: - e.token(x.Return, len("return"), tokKeyword, nil) - case *ast.SelectStmt: - e.token(x.Select, len("select"), tokKeyword, nil) - case *ast.SelectorExpr: - case *ast.SendStmt: - e.token(x.Arrow, len("<-"), tokOperator, nil) - case *ast.SliceExpr: - case *ast.StarExpr: - e.token(x.Star, len("*"), tokOperator, nil) - case *ast.StructType: - e.token(x.Struct, len("struct"), tokKeyword, nil) - case *ast.SwitchStmt: - e.token(x.Switch, len("switch"), tokKeyword, nil) - case *ast.TypeAssertExpr: - if x.Type == nil { - pos := e.findKeyword("type", x.Lparen, x.Rparen) - e.token(pos, len("type"), tokKeyword, nil) - } - case *ast.TypeSpec: - case *ast.TypeSwitchStmt: - e.token(x.Switch, len("switch"), tokKeyword, nil) - case *ast.UnaryExpr: - e.token(x.OpPos, len(x.Op.String()), tokOperator, nil) - case *ast.ValueSpec: - // things only seen with parsing or type errors, so ignore them - case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt: - return true - // not going to see these - case *ast.File, *ast.Package: - e.unexpected(fmt.Sprintf("implement %T %s", x, safetoken.Position(e.pgf.Tok, x.Pos()))) - // other things we knowingly ignore - case *ast.Comment, *ast.CommentGroup: - pop() - return false - default: - e.unexpected(fmt.Sprintf("failed to implement %T", x)) - } - return true -} - -func (e *encoded) ident(x *ast.Ident) { - if e.ti == nil { - what, mods := e.unkIdent(x) - if what != "" { - e.token(x.Pos(), len(x.String()), what, mods) - } - if semDebug { - log.Printf(" nil %s/nil/nil %q %v %s", x.String(), what, mods, e.strStack()) - } - return - } - def := e.ti.Defs[x] - if def != nil { - what, mods := e.definitionFor(x, def) - if what != "" { - e.token(x.Pos(), len(x.String()), what, mods) - } - if semDebug { - log.Printf(" for %s/%T/%T got %s %v (%s)", x.String(), def, def.Type(), what, mods, e.strStack()) - } - return - } - use := e.ti.Uses[x] - tok := func(pos token.Pos, lng int, tok tokenType, mods []string) { - e.token(pos, lng, tok, mods) - q := "nil" - if use != nil { - q = fmt.Sprintf("%T", use.Type()) - } - if semDebug { - log.Printf(" use %s/%T/%s got %s %v (%s)", x.String(), use, q, tok, mods, e.strStack()) - } - } - - switch y := use.(type) { - case nil: - what, mods := e.unkIdent(x) - if what != "" { - tok(x.Pos(), len(x.String()), what, mods) - } else if semDebug { - // tok() wasn't called, so didn't log - log.Printf(" nil %s/%T/nil %q %v (%s)", x.String(), use, what, mods, e.strStack()) - } - return - case *types.Builtin: - tok(x.NamePos, len(x.Name), tokFunction, []string{"defaultLibrary"}) - case *types.Const: - mods := []string{"readonly"} - tt := y.Type() - if _, ok := tt.(*types.Basic); ok { - tok(x.Pos(), len(x.String()), tokVariable, mods) - break - } - if ttx, ok := tt.(*types.Named); ok { - if x.String() == "iota" { - e.unexpected(fmt.Sprintf("iota:%T", ttx)) - } - if _, ok := ttx.Underlying().(*types.Basic); ok { - tok(x.Pos(), len(x.String()), tokVariable, mods) - break - } - e.unexpected(fmt.Sprintf("%q/%T", x.String(), tt)) - } - // can this happen? Don't think so - e.unexpected(fmt.Sprintf("%s %T %#v", x.String(), tt, tt)) - case *types.Func: - tok(x.Pos(), len(x.Name), tokFunction, nil) - case *types.Label: - // nothing to map it to - case *types.Nil: - // nil is a predeclared identifier - tok(x.Pos(), len("nil"), tokVariable, []string{"readonly", "defaultLibrary"}) - case *types.PkgName: - tok(x.Pos(), len(x.Name), tokNamespace, nil) - case *types.TypeName: // could be a tokTpeParam - var mods []string - if _, ok := y.Type().(*types.Basic); ok { - mods = []string{"defaultLibrary"} - } else if _, ok := y.Type().(*types.TypeParam); ok { - tok(x.Pos(), len(x.String()), tokTypeParam, mods) - break - } - tok(x.Pos(), len(x.String()), tokType, mods) - case *types.Var: - if isSignature(y) { - tok(x.Pos(), len(x.Name), tokFunction, nil) - } else if e.isParam(use.Pos()) { - // variable, unless use.pos is the pos of a Field in an ancestor FuncDecl - // or FuncLit and then it's a parameter - tok(x.Pos(), len(x.Name), tokParameter, nil) - } else { - tok(x.Pos(), len(x.Name), tokVariable, nil) - } + switch snapshot.FileKind(fh) { + case file.Tmpl: + return template.SemanticTokens(ctx, snapshot, fh.URI()) - default: - // can't happen - if use == nil { - msg := fmt.Sprintf("%#v %#v %#v", x, e.ti.Defs[x], e.ti.Uses[x]) - e.unexpected(msg) - } - if use.Type() != nil { - e.unexpected(fmt.Sprintf("%s %T/%T,%#v", x.String(), use, use.Type(), use)) - } else { - e.unexpected(fmt.Sprintf("%s %T", x.String(), use)) - } - } -} - -func (e *encoded) isParam(pos token.Pos) bool { - for i := len(e.stack) - 1; i >= 0; i-- { - switch n := e.stack[i].(type) { - case *ast.FuncDecl: - for _, f := range n.Type.Params.List { - for _, id := range f.Names { - if id.Pos() == pos { - return true - } - } - } - case *ast.FuncLit: - for _, f := range n.Type.Params.List { - for _, id := range f.Names { - if id.Pos() == pos { - return true - } - } - } - } - } - return false -} - -func isSignature(use types.Object) bool { - if _, ok := use.(*types.Var); !ok { - return false - } - v := use.Type() - if v == nil { - return false - } - if _, ok := v.(*types.Signature); ok { - return true - } - return false -} + case file.Go: + return golang.SemanticTokens(ctx, snapshot, fh, rng) -// both e.ti.Defs and e.ti.Uses are nil. use the parse stack. -// a lot of these only happen when the package doesn't compile -// but in that case it is all best-effort from the parse tree -func (e *encoded) unkIdent(x *ast.Ident) (tokenType, []string) { - def := []string{"definition"} - n := len(e.stack) - 2 // parent of Ident - if n < 0 { - e.unexpected("no stack?") - return "", nil - } - switch nd := e.stack[n].(type) { - case *ast.BinaryExpr, *ast.UnaryExpr, *ast.ParenExpr, *ast.StarExpr, - *ast.IncDecStmt, *ast.SliceExpr, *ast.ExprStmt, *ast.IndexExpr, - *ast.ReturnStmt, *ast.ChanType, *ast.SendStmt, - *ast.ForStmt, // possibly incomplete - *ast.IfStmt, /* condition */ - *ast.KeyValueExpr, // either key or value - *ast.IndexListExpr: - return tokVariable, nil - case *ast.Ellipsis: - return tokType, nil - case *ast.CaseClause: - if n-2 >= 0 { - if _, ok := e.stack[n-2].(*ast.TypeSwitchStmt); ok { - return tokType, nil - } - } - return tokVariable, nil - case *ast.ArrayType: - if x == nd.Len { - // or maybe a Type Param, but we can't just from the parse tree - return tokVariable, nil - } else { - return tokType, nil - } - case *ast.MapType: - return tokType, nil - case *ast.CallExpr: - if x == nd.Fun { - return tokFunction, nil - } - return tokVariable, nil - case *ast.SwitchStmt: - return tokVariable, nil - case *ast.TypeAssertExpr: - if x == nd.X { - return tokVariable, nil - } else if x == nd.Type { - return tokType, nil - } - case *ast.ValueSpec: - for _, p := range nd.Names { - if p == x { - return tokVariable, def - } - } - for _, p := range nd.Values { - if p == x { - return tokVariable, nil - } - } - return tokType, nil - case *ast.SelectorExpr: // e.ti.Selections[nd] is nil, so no help - if n-1 >= 0 { - if ce, ok := e.stack[n-1].(*ast.CallExpr); ok { - // ... CallExpr SelectorExpr Ident (_.x()) - if ce.Fun == nd && nd.Sel == x { - return tokFunction, nil - } - } - } - return tokVariable, nil - case *ast.AssignStmt: - for _, p := range nd.Lhs { - // x := ..., or x = ... - if p == x { - if nd.Tok != token.DEFINE { - def = nil - } - return tokVariable, def // '_' in _ = ... - } - } - // RHS, = x - return tokVariable, nil - case *ast.TypeSpec: // it's a type if it is either the Name or the Type - if x == nd.Type { - def = nil - } - return tokType, def - case *ast.Field: - // ident could be type in a field, or a method in an interface type, or a variable - if x == nd.Type { - return tokType, nil - } - if n-2 >= 0 { - _, okit := e.stack[n-2].(*ast.InterfaceType) - _, okfl := e.stack[n-1].(*ast.FieldList) - if okit && okfl { - return tokMethod, def - } - } - return tokVariable, nil - case *ast.LabeledStmt, *ast.BranchStmt: - // nothing to report - case *ast.CompositeLit: - if nd.Type == x { - return tokType, nil - } - return tokVariable, nil - case *ast.RangeStmt: - if nd.Tok != token.DEFINE { - def = nil - } - return tokVariable, def - case *ast.FuncDecl: - return tokFunction, def default: - msg := fmt.Sprintf("%T undexpected: %s %s%q", nd, x.Name, e.strStack(), e.srcLine(x)) - e.unexpected(msg) - } - return "", nil -} - -func isDeprecated(n *ast.CommentGroup) bool { - if n == nil { - return false - } - for _, c := range n.List { - if strings.HasPrefix(c.Text, "// Deprecated") { - return true - } - } - return false -} - -func (e *encoded) definitionFor(x *ast.Ident, def types.Object) (tokenType, []string) { - // PJW: def == types.Label? probably a nothing - // PJW: look into replacing these syntactic tests with types more generally - mods := []string{"definition"} - for i := len(e.stack) - 1; i >= 0; i-- { - s := e.stack[i] - switch y := s.(type) { - case *ast.AssignStmt, *ast.RangeStmt: - if x.Name == "_" { - return "", nil // not really a variable - } - return tokVariable, mods - case *ast.GenDecl: - if isDeprecated(y.Doc) { - mods = append(mods, "deprecated") - } - if y.Tok == token.CONST { - mods = append(mods, "readonly") - } - return tokVariable, mods - case *ast.FuncDecl: - // If x is immediately under a FuncDecl, it is a function or method - if i == len(e.stack)-2 { - if isDeprecated(y.Doc) { - mods = append(mods, "deprecated") - } - if y.Recv != nil { - return tokMethod, mods - } - return tokFunction, mods - } - // if x < ... < FieldList < FuncDecl, this is the receiver, a variable - // PJW: maybe not. it might be a typeparameter in the type of the receiver - if _, ok := e.stack[i+1].(*ast.FieldList); ok { - if _, ok := def.(*types.TypeName); ok { - return tokTypeParam, mods - } - return tokVariable, nil - } - // if x < ... < FieldList < FuncType < FuncDecl, this is a param - return tokParameter, mods - case *ast.FuncType: // is it in the TypeParams? - if isTypeParam(x, y) { - return tokTypeParam, mods - } - return tokParameter, mods - case *ast.InterfaceType: - return tokMethod, mods - case *ast.TypeSpec: - // GenDecl/Typespec/FuncType/FieldList/Field/Ident - // (type A func(b uint64)) (err error) - // b and err should not be tokType, but tokVaraible - // and in GenDecl/TpeSpec/StructType/FieldList/Field/Ident - // (type A struct{b uint64} - // but on type B struct{C}), C is a type, but is not being defined. - // GenDecl/TypeSpec/FieldList/Field/Ident is a typeParam - if _, ok := e.stack[i+1].(*ast.FieldList); ok { - return tokTypeParam, mods - } - fldm := e.stack[len(e.stack)-2] - if fld, ok := fldm.(*ast.Field); ok { - // if len(fld.names) == 0 this is a tokType, being used - if len(fld.Names) == 0 { - return tokType, nil - } - return tokVariable, mods - } - return tokType, mods - } - } - // can't happen - msg := fmt.Sprintf("failed to find the decl for %s", safetoken.Position(e.pgf.Tok, x.Pos())) - e.unexpected(msg) - return "", []string{""} -} - -func isTypeParam(x *ast.Ident, y *ast.FuncType) bool { - tp := y.TypeParams - if tp == nil { - return false - } - for _, p := range tp.List { - for _, n := range p.Names { - if x == n { - return true - } - } - } - return false -} - -func (e *encoded) multiline(start, end token.Pos, tok tokenType) { - f := e.fset.File(start) - // the hard part is finding the lengths of lines. include the \n - leng := func(line int) int { - n := f.LineStart(line) - if line >= f.LineCount() { - return f.Size() - int(n) - } - return int(f.LineStart(line+1) - n) - } - spos := safetoken.StartPosition(e.fset, start) - epos := safetoken.EndPosition(e.fset, end) - sline := spos.Line - eline := epos.Line - // first line is from spos.Column to end - e.token(start, leng(sline)-spos.Column, tok, nil) // leng(sline)-1 - (spos.Column-1) - for i := sline + 1; i < eline; i++ { - // intermediate lines are from 1 to end - e.token(f.LineStart(i), leng(i)-1, tok, nil) // avoid the newline - } - // last line is from 1 to epos.Column - e.token(f.LineStart(eline), epos.Column-1, tok, nil) // columns are 1-based -} - -// findKeyword finds a keyword rather than guessing its location -func (e *encoded) findKeyword(keyword string, start, end token.Pos) token.Pos { - offset := int(start) - e.pgf.Tok.Base() - last := int(end) - e.pgf.Tok.Base() - buf := e.pgf.Src - idx := bytes.Index(buf[offset:last], []byte(keyword)) - if idx != -1 { - return start + token.Pos(idx) - } - //(in unparsable programs: type _ <-<-chan int) - e.unexpected(fmt.Sprintf("not found:%s %v", keyword, safetoken.StartPosition(e.fset, start))) - return token.NoPos -} - -func (e *encoded) Data() []uint32 { - // binary operators, at least, will be out of order - sort.Slice(e.items, func(i, j int) bool { - if e.items[i].line != e.items[j].line { - return e.items[i].line < e.items[j].line - } - return e.items[i].start < e.items[j].start - }) - typeMap, modMap := e.maps() - // each semantic token needs five values - // (see Integer Encoding for Tokens in the LSP spec) - x := make([]uint32, 5*len(e.items)) - var j int - var last semItem - for i := 0; i < len(e.items); i++ { - item := e.items[i] - typ, ok := typeMap[item.typeStr] - if !ok { - continue // client doesn't want typeStr - } - if item.typeStr == tokString && e.noStrings { - continue - } - if item.typeStr == tokNumber && e.noNumbers { - continue - } - if j == 0 { - x[0] = e.items[0].line - } else { - x[j] = item.line - last.line - } - x[j+1] = item.start - if j > 0 && x[j] == 0 { - x[j+1] = item.start - last.start - } - x[j+2] = item.len - x[j+3] = uint32(typ) - mask := 0 - for _, s := range item.mods { - // modMap[s] is 0 if the client doesn't want this modifier - mask |= modMap[s] - } - x[j+4] = uint32(mask) - j += 5 - last = item - } - return x[:j] -} - -func (e *encoded) importSpec(d *ast.ImportSpec) { - // a local package name or the last component of the Path - if d.Name != nil { - nm := d.Name.String() - if nm != "_" && nm != "." { - e.token(d.Name.Pos(), len(nm), tokNamespace, nil) - } - return // don't mark anything for . or _ - } - importPath := metadata.UnquoteImportPath(d) - if importPath == "" { - return - } - // Import strings are implementation defined. Try to match with parse information. - depID := e.pkg.Metadata().DepsByImpPath[importPath] - if depID == "" { - return - } - depMD := e.metadataSource.Metadata(depID) - if depMD == nil { - // unexpected, but impact is that maybe some import is not colored - return - } - // Check whether the original literal contains the package's declared name. - j := strings.LastIndex(d.Path.Value, string(depMD.Name)) - if j == -1 { - // Package name does not match import path, so there is nothing to report. - return - } - // Report virtual declaration at the position of the substring. - start := d.Path.Pos() + token.Pos(j) - e.token(start, len(depMD.Name), tokNamespace, nil) -} - -// log unexpected state -func (e *encoded) unexpected(msg string) { - if semDebug { - panic(msg) - } - event.Error(e.ctx, e.strStack(), errors.New(msg)) -} - -func (e *encoded) maps() (map[tokenType]int, map[string]int) { - tmap := make(map[tokenType]int) - mmap := make(map[string]int) - for i, t := range e.tokTypes { - tmap[tokenType(t)] = i - } - for i, m := range e.tokMods { - mmap[m] = 1 << uint(i) // go 1.12 compatibility - } - return tmap, mmap -} - -var godirectives = map[string]struct{}{ - // https://pkg.go.dev/cmd/compile - "noescape": {}, - "uintptrescapes": {}, - "noinline": {}, - "norace": {}, - "nosplit": {}, - "linkname": {}, - - // https://pkg.go.dev/go/build - "build": {}, - "binary-only-package": {}, - "embed": {}, -} - -// Tokenize godirective at the start of the comment c, if any, and the surrounding comment. -// If there is any failure, emits the entire comment as a tokComment token. -// Directives are highlighted as-is, even if used incorrectly. Typically there are -// dedicated analyzers that will warn about misuse. -func (e *encoded) godirective(c *ast.Comment) { - // First check if '//go:directive args...' is a valid directive. - directive, args, _ := strings.Cut(c.Text, " ") - kind, _ := stringsCutPrefix(directive, "//go:") - if _, ok := godirectives[kind]; !ok { - // Unknown go: directive. - e.token(c.Pos(), len(c.Text), tokComment, nil) - return - } - - // Make the 'go:directive' part stand out, the rest is comments. - e.token(c.Pos(), len("//"), tokComment, nil) - - directiveStart := c.Pos() + token.Pos(len("//")) - e.token(directiveStart, len(directive[len("//"):]), tokNamespace, nil) - - if len(args) > 0 { - tailStart := c.Pos() + token.Pos(len(directive)+len(" ")) - e.token(tailStart, len(args), tokComment, nil) - } -} - -// Go 1.20 strings.CutPrefix. -func stringsCutPrefix(s, prefix string) (after string, found bool) { - if !strings.HasPrefix(s, prefix) { - return s, false + // TODO(adonovan): should return an error! + return nil, nil // empty result } - return s[len(prefix):], true } diff --git a/gopls/internal/template/implementations.go b/gopls/internal/template/implementations.go index a2659317d65..430a337f3ea 100644 --- a/gopls/internal/template/implementations.go +++ b/gopls/internal/template/implementations.go @@ -14,6 +14,7 @@ import ( "golang.org/x/tools/gopls/internal/cache" "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/gopls/internal/protocol" + "golang.org/x/tools/gopls/internal/protocol/semtok" ) // line number (1-based) and message @@ -155,7 +156,7 @@ func References(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, p return ans, nil } -func SemanticTokens(ctx context.Context, snapshot *cache.Snapshot, spn protocol.DocumentURI, add func(line, start, len uint32), d func() []uint32) (*protocol.SemanticTokens, error) { +func SemanticTokens(ctx context.Context, snapshot *cache.Snapshot, spn protocol.DocumentURI) (*protocol.SemanticTokens, error) { fh, err := snapshot.ReadFile(ctx, spn) if err != nil { return nil, err @@ -166,6 +167,17 @@ func SemanticTokens(ctx context.Context, snapshot *cache.Snapshot, spn protocol. } p := parseBuffer(buf) + var items []semtok.Token + add := func(line, start, len uint32) { + // TODO(adonovan): don't ignore the rng restriction, if any. + items = append(items, semtok.Token{ + Line: line, + Start: start, + Len: len, + Type: semtok.TokMacro, + }) + } + for _, t := range p.Tokens() { if t.Multiline { la, ca := p.LineCol(t.Start) @@ -184,9 +196,15 @@ func SemanticTokens(ctx context.Context, snapshot *cache.Snapshot, spn protocol. line, col := p.LineCol(t.Start) add(line, col, uint32(sz)) } - data := d() + const noStrings = false + const noNumbers = false ans := &protocol.SemanticTokens{ - Data: data, + Data: semtok.Encode( + items, + noStrings, + noNumbers, + snapshot.Options().SemanticTypes, + snapshot.Options().SemanticMods), // for small cache, some day. for now, the LSP client ignores this // (that is, when the LSP client starts returning these, we can cache) ResultID: fmt.Sprintf("%v", time.Now()), From df03d7d478fd7420c036c1b5afa6a1ed0a049931 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Mon, 5 Feb 2024 17:17:51 +0000 Subject: [PATCH 090/105] gopls/internal/golang: add missing check for nil funcBody Add a check for nil funcBody that was missing from CL 503439. Fixes golang/go#65516 Change-Id: Iba8a8c3410ddb2c130d6cd2ecb229929a9f4f681 Reviewed-on: https://go-review.googlesource.com/c/tools/+/561435 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> --- gopls/internal/golang/highlight.go | 40 ++++++++++--------- .../marker/testdata/highlight/issue65516.txt | 7 ++++ 2 files changed, 28 insertions(+), 19 deletions(-) create mode 100644 gopls/internal/test/marker/testdata/highlight/issue65516.txt diff --git a/gopls/internal/golang/highlight.go b/gopls/internal/golang/highlight.go index 28e2c27f3d5..f11426319cf 100644 --- a/gopls/internal/golang/highlight.go +++ b/gopls/internal/golang/highlight.go @@ -275,28 +275,30 @@ findEnclosingFunc: } } - ast.Inspect(funcBody, func(n ast.Node) bool { - switch n := n.(type) { - case *ast.FuncDecl, *ast.FuncLit: - // Don't traverse into any functions other than enclosingFunc. - return false - case *ast.ReturnStmt: - if highlightAll { - // Add the entire return statement. - result[posRange{n.Pos(), n.End()}] = unit{} - } else { - // Add the highlighted indexes. - for i, expr := range n.Results { - if highlightIndexes[i] { - result[posRange{expr.Pos(), expr.End()}] = unit{} + if funcBody != nil { + ast.Inspect(funcBody, func(n ast.Node) bool { + switch n := n.(type) { + case *ast.FuncDecl, *ast.FuncLit: + // Don't traverse into any functions other than enclosingFunc. + return false + case *ast.ReturnStmt: + if highlightAll { + // Add the entire return statement. + result[posRange{n.Pos(), n.End()}] = unit{} + } else { + // Add the highlighted indexes. + for i, expr := range n.Results { + if highlightIndexes[i] { + result[posRange{expr.Pos(), expr.End()}] = unit{} + } } } - } - return false + return false - } - return true - }) + } + return true + }) + } } // highlightUnlabeledBreakFlow highlights the innermost enclosing for/range/switch or swlect diff --git a/gopls/internal/test/marker/testdata/highlight/issue65516.txt b/gopls/internal/test/marker/testdata/highlight/issue65516.txt new file mode 100644 index 00000000000..3fc3be27416 --- /dev/null +++ b/gopls/internal/test/marker/testdata/highlight/issue65516.txt @@ -0,0 +1,7 @@ +This test checks that gopls doesn't crash while highlighting functions with no +body (golang/go#65516). + +-- p.go -- +package p + +func Foo() (int, string) //@highlight("int", "int"), highlight("func", "func") From 8efa10c95f1835e8acc120c15815d8293d52e8a6 Mon Sep 17 00:00:00 2001 From: Robert Findley <rfindley@google.com> Date: Mon, 5 Feb 2024 13:02:48 -0500 Subject: [PATCH 091/105] internal/imports: add a benchmark for the initial mod cache scan In CL 508506, we missed a performance regression because there were no benchmarks for goimports' initial scan: the only scan benchmark related to re-scanning, which doesn't recursively descend into all module cache directories. Add a benchmark for the initial scan. For golang/go#44863 Change-Id: I94ec8b2b0df468fd06a1316f24c00d5f47c2f5c9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/561436 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- internal/imports/mod_test.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/imports/mod_test.go b/internal/imports/mod_test.go index 98aa678f1bb..55ac6132ade 100644 --- a/internal/imports/mod_test.go +++ b/internal/imports/mod_test.go @@ -1289,7 +1289,7 @@ import ( } } -func BenchmarkScanModCache(b *testing.B) { +func BenchmarkModuleResolver_RescanModCache(b *testing.B) { env := &ProcessEnv{ GocmdRunner: &gocommand.Runner{}, // Uncomment for verbose logging (too verbose to enable by default). @@ -1309,3 +1309,17 @@ func BenchmarkScanModCache(b *testing.B) { resolver.(*ModuleResolver).ClearForNewScan() } } + +func BenchmarkModuleResolver_InitialScan(b *testing.B) { + for i := 0; i < b.N; i++ { + env := &ProcessEnv{ + GocmdRunner: &gocommand.Runner{}, + } + exclude := []gopathwalk.RootType{gopathwalk.RootGOROOT} + resolver, err := env.GetResolver() + if err != nil { + b.Fatal(err) + } + scanToSlice(resolver, exclude) + } +} From 0be034b1e193e98221abc05e710b8ecbf8cc9d45 Mon Sep 17 00:00:00 2001 From: Tim King <taking@google.com> Date: Wed, 31 Jan 2024 14:34:13 -0800 Subject: [PATCH 092/105] internal/aliases: Adds an internal alias package. Adds a transitional package for handling types.Alias until GoVersion>=1.26 for x/tools. Updates golang/go#65294 Change-Id: I7a58cb9ceb9945529baf14d33543dbebc23af542 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559995 Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Run-TryBot: Tim King <taking@google.com> --- internal/aliases/aliases.go | 28 ++++++++++++ internal/aliases/aliases_go121.go | 30 +++++++++++++ internal/aliases/aliases_go122.go | 72 +++++++++++++++++++++++++++++ internal/aliases/aliases_test.go | 75 +++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 internal/aliases/aliases.go create mode 100644 internal/aliases/aliases_go121.go create mode 100644 internal/aliases/aliases_go122.go create mode 100644 internal/aliases/aliases_test.go diff --git a/internal/aliases/aliases.go b/internal/aliases/aliases.go new file mode 100644 index 00000000000..f89112c8ee5 --- /dev/null +++ b/internal/aliases/aliases.go @@ -0,0 +1,28 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package aliases + +import ( + "go/token" + "go/types" +) + +// Package aliases defines backward compatible shims +// for the types.Alias type representation added in 1.22. +// This defines placeholders for x/tools until 1.26. + +// NewAlias creates a new TypeName in Package pkg that +// is an alias for the type rhs. +// +// When GoVersion>=1.22 and GODEBUG=gotypesalias=1, +// the Type() of the return value is a *types.Alias. +func NewAlias(pos token.Pos, pkg *types.Package, name string, rhs types.Type) *types.TypeName { + if enabled() { + tname := types.NewTypeName(pos, pkg, name, nil) + newAlias(tname, rhs) + return tname + } + return types.NewTypeName(pos, pkg, name, rhs) +} diff --git a/internal/aliases/aliases_go121.go b/internal/aliases/aliases_go121.go new file mode 100644 index 00000000000..1872b56ff8f --- /dev/null +++ b/internal/aliases/aliases_go121.go @@ -0,0 +1,30 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.22 +// +build !go1.22 + +package aliases + +import ( + "go/types" +) + +// Alias is a placeholder for a go/types.Alias for <=1.21. +// It will never be created by go/types. +type Alias struct{} + +func (*Alias) String() string { panic("unreachable") } + +func (*Alias) Underlying() types.Type { panic("unreachable") } + +func (*Alias) Obj() *types.TypeName { panic("unreachable") } + +// Unalias returns the type t for go <=1.21. +func Unalias(t types.Type) types.Type { return t } + +// Always false for go <=1.21. Ignores GODEBUG. +func enabled() bool { return false } + +func newAlias(name *types.TypeName, rhs types.Type) *Alias { panic("unreachable") } diff --git a/internal/aliases/aliases_go122.go b/internal/aliases/aliases_go122.go new file mode 100644 index 00000000000..8b92116284d --- /dev/null +++ b/internal/aliases/aliases_go122.go @@ -0,0 +1,72 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.22 +// +build go1.22 + +package aliases + +import ( + "go/ast" + "go/parser" + "go/token" + "go/types" + "os" + "strings" + "sync" +) + +// Alias is an alias of types.Alias. +type Alias = types.Alias + +// Unalias is a wrapper of types.Unalias. +func Unalias(t types.Type) types.Type { return types.Unalias(t) } + +// newAlias is an internal alias around types.NewAlias. +// Direct usage is discouraged as the moment. +// Try to use NewAlias instead. +func newAlias(tname *types.TypeName, rhs types.Type) *Alias { + a := types.NewAlias(tname, rhs) + // TODO(go.dev/issue/65455): Remove kludgy workaround to set a.actual as a side-effect. + Unalias(a) + return a +} + +// enabled returns true when types.Aliases are enabled. +func enabled() bool { + // Use the gotypesalias value in GODEBUG if set. + godebug := os.Getenv("GODEBUG") + value := -1 // last set value. + for _, f := range strings.Split(godebug, ",") { + switch f { + case "gotypesalias=1": + value = 1 + case "gotypesalias=0": + value = 0 + } + } + switch value { + case 0: + return false + case 1: + return true + default: + return aliasesDefault() + } +} + +// aliasesDefault reports if aliases are enabled by default. +func aliasesDefault() bool { + // Dynamically check if Aliases will be produced from go/types. + aliasesDefaultOnce.Do(func() { + fset := token.NewFileSet() + f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0) + pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil) + _, gotypesaliasDefault = pkg.Scope().Lookup("A").Type().(*types.Alias) + }) + return gotypesaliasDefault +} + +var gotypesaliasDefault bool +var aliasesDefaultOnce sync.Once diff --git a/internal/aliases/aliases_test.go b/internal/aliases/aliases_test.go new file mode 100644 index 00000000000..fc4efb2cb27 --- /dev/null +++ b/internal/aliases/aliases_test.go @@ -0,0 +1,75 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package aliases_test + +import ( + "go/ast" + "go/parser" + "go/token" + "go/types" + "os" + "testing" + + "golang.org/x/tools/internal/aliases" + "golang.org/x/tools/internal/testenv" +) + +// Assert that Obj exists on Alias. +var _ func(*aliases.Alias) *types.TypeName = (*aliases.Alias).Obj + +// TestNewAlias tests that alias.NewAlias creates an alias of a type +// whose underlying and Unaliased type is *Named. +// When gotypesalias=1 and GoVersion >= 1.22, the type will +// be an *aliases.Alias. +func TestNewAlias(t *testing.T) { + const source = ` + package P + + type Named int + ` + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", source, 0) + if err != nil { + t.Fatal(err) + } + + var conf types.Config + pkg, err := conf.Check("P", fset, []*ast.File{f}, nil) + if err != nil { + t.Fatal(err) + } + + expr := `*Named` + tv, err := types.Eval(fset, pkg, 0, expr) + if err != nil { + t.Fatalf("Eval(%s) failed: %v", expr, err) + } + + for _, godebug := range []string{"", "gotypesalias=1"} { + t.Run(godebug, func(t *testing.T) { + saved := os.Getenv("GODEBUG") + defer os.Setenv("GODEBUG", saved) + os.Setenv("GODEBUG", godebug) // non parallel. + + A := aliases.NewAlias(token.NoPos, pkg, "A", tv.Type) + if got, want := A.Name(), "A"; got != want { + t.Errorf("Expected A.Name()==%q. got %q", want, got) + } + + if got, want := A.Type().Underlying(), tv.Type; got != want { + t.Errorf("Expected A.Type().Underlying()==%q. got %q", want, got) + } + if got, want := aliases.Unalias(A.Type()), tv.Type; got != want { + t.Errorf("Expected Unalias(A)==%q. got %q", want, got) + } + + if testenv.Go1Point() >= 22 && godebug == "gotypesalias=1" { + if _, ok := A.Type().(*aliases.Alias); !ok { + t.Errorf("Expected A.Type() to be a types.Alias(). got %q", A.Type()) + } + } + }) + } +} From 365517a553cc896d581ef2c864efb5ef9022ad9f Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 2 Feb 2024 17:06:31 -0500 Subject: [PATCH 093/105] gopls/internal/cache: detect and reinit on workspace vendor changes No matter where the go.work file is, the addition or deletion of workspace-vendored modules mandates reinitialization. Add the necessary watch pattern, and detect that reinitialization is required in snapshot.clone. The latter required threading through the file modification, so that we can detect creations and deletions explicitly. This is a great example of where having a realistic fake file watcher paid off. Fixes golang/go#63375 Change-Id: Id3658e85bd2d915639d24fed31aba2d54ebc75e7 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560717 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/session.go | 10 ++++----- gopls/internal/cache/snapshot.go | 21 ++++++++++++++++--- gopls/internal/cache/view.go | 1 + .../integration/workspace/workspace_test.go | 7 ------- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 18096b85e08..27380f114dd 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -719,7 +719,7 @@ func (s *Session) ResetView(ctx context.Context, uri protocol.DocumentURI) (*Vie // TODO(rfindley): what happens if this function fails? It must leave us in a // broken state, which we should surface to the user, probably as a request to // restart gopls. -func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modification) (map[*View][]protocol.DocumentURI, error) { +func (s *Session) DidModifyFiles(ctx context.Context, modifications []file.Modification) (map[*View][]protocol.DocumentURI, error) { s.viewMu.Lock() defer s.viewMu.Unlock() @@ -728,7 +728,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio // This is done while holding viewMu because the set of open files affects // the set of views, and to prevent views from seeing updated file content // before they have processed invalidations. - replaced, err := s.updateOverlays(ctx, changes) + replaced, err := s.updateOverlays(ctx, modifications) if err != nil { return nil, err } @@ -739,7 +739,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio checkViews := false changed := make(map[protocol.DocumentURI]file.Handle) - for _, c := range changes { + for _, c := range modifications { fh := mustReadFile(ctx, s, c.URI) changed[c.URI] = fh @@ -857,7 +857,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio // We only want to run fast-path diagnostics (i.e. diagnoseChangedFiles) once // for each changed file, in its best view. viewsToDiagnose := map[*View][]protocol.DocumentURI{} - for _, mod := range changes { + for _, mod := range modifications { v, err := s.viewOfLocked(ctx, mod.URI) if err != nil { // bestViewForURI only returns an error in the event of context @@ -874,7 +874,7 @@ func (s *Session) DidModifyFiles(ctx context.Context, changes []file.Modificatio // ...but changes may be relevant to other views, for example if they are // changes to a shared package. for _, v := range s.views { - _, release, needsDiagnosis := s.invalidateViewLocked(ctx, v, StateChange{Files: changed}) + _, release, needsDiagnosis := s.invalidateViewLocked(ctx, v, StateChange{Modifications: modifications, Files: changed}) release() if needsDiagnosis || checkViews { diff --git a/gopls/internal/cache/snapshot.go b/gopls/internal/cache/snapshot.go index a8b137fffb8..3d97ed47ccb 100644 --- a/gopls/internal/cache/snapshot.go +++ b/gopls/internal/cache/snapshot.go @@ -952,6 +952,12 @@ func (s *Snapshot) fileWatchingGlobPatterns() map[protocol.RelativePattern]unit var dirs []string if s.view.moduleMode() { + if s.view.typ == GoWorkView { + workVendorDir := filepath.Join(s.view.gowork.Dir().Path(), "vendor") + workVendorURI := protocol.URIFromPath(workVendorDir) + patterns[protocol.RelativePattern{BaseURI: workVendorURI, Pattern: watchGoFiles}] = unit{} + } + // In module mode, watch directories containing active modules, and collect // these dirs for later filtering the set of known directories. // @@ -1728,10 +1734,14 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done f // one or more modules may have moved into or out of the // vendor tree after 'go mod vendor' or 'rm -fr vendor/'. // + // In this case, we consider the actual modification to see if was a creation + // or deletion. + // // TODO(rfindley): revisit the location of this check. - for uri := range changedFiles { - if inVendor(uri) && s.initialErr != nil || - strings.HasSuffix(string(uri), "/vendor/modules.txt") { + for _, mod := range changed.Modifications { + if inVendor(mod.URI) && (mod.Action == file.Create || mod.Action == file.Delete) || + strings.HasSuffix(string(mod.URI), "/vendor/modules.txt") { + reinit = true break } @@ -1741,6 +1751,11 @@ func (s *Snapshot) clone(ctx, bgCtx context.Context, changed StateChange, done f // they exist. Importantly, we don't call ReadFile here: consider the case // where a file is added on disk; we don't want to read the newly added file // into the old snapshot, as that will break our change detection below. + // + // TODO(rfindley): it may be more accurate to rely on the modification type + // here, similarly to what we do for vendored files above. If we happened not + // to have read a file in the previous snapshot, that's not the same as it + // actually being created. oldFiles := make(map[protocol.DocumentURI]file.Handle) for uri := range changedFiles { if fh, ok := s.files.get(uri); ok { diff --git a/gopls/internal/cache/view.go b/gopls/internal/cache/view.go index 83b41825cea..223de45b363 100644 --- a/gopls/internal/cache/view.go +++ b/gopls/internal/cache/view.go @@ -763,6 +763,7 @@ func (s *Snapshot) initialize(ctx context.Context, firstAttempt bool) { // By far the most common of these is a change to file state, but a query of // module upgrade information or vulnerabilities also affects gopls' behavior. type StateChange struct { + Modifications []file.Modification // if set, the raw modifications originating this change Files map[protocol.DocumentURI]file.Handle ModuleUpgrades map[protocol.DocumentURI]map[string]string Vulns map[protocol.DocumentURI]*vulncheck.Result diff --git a/gopls/internal/test/integration/workspace/workspace_test.go b/gopls/internal/test/integration/workspace/workspace_test.go index 46184ae4ff8..2042b9926cd 100644 --- a/gopls/internal/test/integration/workspace/workspace_test.go +++ b/gopls/internal/test/integration/workspace/workspace_test.go @@ -259,13 +259,6 @@ func TestWorkspaceVendoring(t *testing.T) { env.AfterChange() env.OpenFile("moda/a/a.go") env.RunGoCommand("work", "vendor") - - // Make an on-disk go.mod change to force a workspace reinitialization. - // This will be fixed in a follow-up CL. - env.OpenFile("moda/a/go.mod") - env.EditBuffer("moda/a/go.mod", protocol.TextEdit{NewText: "// arbitrary\n"}) - env.SaveBuffer("moda/a/go.mod") - env.AfterChange() loc := env.GoToDefinition(env.RegexpSearch("moda/a/a.go", "b.(Hello)")) const want = "vendor/b.com/b/b.go" From ddb71b0128567e88912a85dee00e76dd394d05fb Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Fri, 2 Feb 2024 16:00:57 -0500 Subject: [PATCH 094/105] gopls/internal/cache: remove findWorkspaceModFile With zero-config gopls (golang/go#57979), this function is no longer used. Change-Id: Ie59a7d39c62eab340fb6e44ddd9b7a0b1cabd92e Reviewed-on: https://go-review.googlesource.com/c/tools/+/560467 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/view.go | 37 ------------------- gopls/internal/cache/view_test.go | 59 ------------------------------- gopls/internal/cache/workspace.go | 49 ------------------------- 3 files changed, 145 deletions(-) diff --git a/gopls/internal/cache/view.go b/gopls/internal/cache/view.go index 223de45b363..78e85a18b0c 100644 --- a/gopls/internal/cache/view.go +++ b/gopls/internal/cache/view.go @@ -1101,43 +1101,6 @@ func loadGoEnv(ctx context.Context, dir string, configEnv []string, runner *goco return nil } -// findWorkspaceModFile searches for a single go.mod file relative to the given -// folder URI, using the following algorithm: -// 1. if there is a go.mod file in a parent directory, return it -// 2. else, if there is exactly one nested module, return it -// 3. else, return "" -func findWorkspaceModFile(ctx context.Context, folderURI protocol.DocumentURI, fs file.Source, excludePath func(string) bool) (protocol.DocumentURI, error) { - match, err := findRootPattern(ctx, folderURI, "go.mod", fs) - if err != nil { - if ctxErr := ctx.Err(); ctxErr != nil { - return "", ctxErr - } - return "", err - } - if match != "" { - return match, nil - } - - // ...else we should check if there's exactly one nested module. - all, err := findModules(folderURI, excludePath, 2) - if err == errExhausted { - // Fall-back behavior: if we don't find any modules after searching 10000 - // files, assume there are none. - event.Log(ctx, fmt.Sprintf("stopped searching for modules after %d files", fileLimit)) - return "", nil - } - if err != nil { - return "", err - } - if len(all) == 1 { - // range to access first element. - for uri := range all { - return uri, nil - } - } - return "", nil -} - // findRootPattern looks for files with the given basename in dir or any parent // directory of dir, using the provided FileSource. It returns the first match, // starting from dir and search parents. diff --git a/gopls/internal/cache/view_test.go b/gopls/internal/cache/view_test.go index 22fde43c880..992a3d61828 100644 --- a/gopls/internal/cache/view_test.go +++ b/gopls/internal/cache/view_test.go @@ -4,13 +4,11 @@ package cache import ( - "context" "os" "path/filepath" "testing" "golang.org/x/tools/gopls/internal/protocol" - "golang.org/x/tools/gopls/internal/test/integration/fake" ) func TestCaseInsensitiveFilesystem(t *testing.T) { @@ -44,63 +42,6 @@ func TestCaseInsensitiveFilesystem(t *testing.T) { } } -func TestFindWorkspaceModFile(t *testing.T) { - workspace := ` --- a/go.mod -- -module a --- a/x/x.go -package x --- a/x/y/y.go -package x --- b/go.mod -- -module b --- b/c/go.mod -- -module bc --- d/gopls.mod -- -module d-goplsworkspace --- d/e/go.mod -- -module de --- f/g/go.mod -- -module fg -` - dir, err := fake.Tempdir(fake.UnpackTxt(workspace)) - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - tests := []struct { - folder, want string - }{ - {"", ""}, // no module at root, and more than one nested module - {"a", "a/go.mod"}, - {"a/x", "a/go.mod"}, - {"a/x/y", "a/go.mod"}, - {"b/c", "b/c/go.mod"}, - {"d", "d/e/go.mod"}, - {"d/e", "d/e/go.mod"}, - {"f", "f/g/go.mod"}, - } - - for _, test := range tests { - ctx := context.Background() - rel := fake.RelativeTo(dir) - folderURI := protocol.URIFromPath(rel.AbsPath(test.folder)) - excludeNothing := func(string) bool { return false } - got, err := findWorkspaceModFile(ctx, folderURI, New(nil), excludeNothing) - if err != nil { - t.Fatal(err) - } - want := protocol.DocumentURI("") - if test.want != "" { - want = protocol.URIFromPath(rel.AbsPath(test.want)) - } - if got != want { - t.Errorf("findWorkspaceModFile(%q) = %q, want %q", test.folder, got, want) - } - } -} - func TestInVendor(t *testing.T) { for _, tt := range []struct { path string diff --git a/gopls/internal/cache/workspace.go b/gopls/internal/cache/workspace.go index 71c7338406e..4f01ebf0364 100644 --- a/gopls/internal/cache/workspace.go +++ b/gopls/internal/cache/workspace.go @@ -8,9 +8,7 @@ import ( "context" "errors" "fmt" - "io/fs" "path/filepath" - "strings" "golang.org/x/mod/modfile" "golang.org/x/tools/gopls/internal/file" @@ -74,50 +72,3 @@ var errExhausted = errors.New("exhausted") // Note: per golang/go#56496, the previous limit of 1M files was too slow, at // which point this limit was decreased to 100K. const fileLimit = 100_000 - -// findModules recursively walks the root directory looking for go.mod files, -// returning the set of modules it discovers. If modLimit is non-zero, -// searching stops once modLimit modules have been found. -// -// TODO(rfindley): consider overlays. -func findModules(root protocol.DocumentURI, excludePath func(string) bool, modLimit int) (map[protocol.DocumentURI]struct{}, error) { - // Walk the view's folder to find all modules in the view. - modFiles := make(map[protocol.DocumentURI]struct{}) - searched := 0 - errDone := errors.New("done") - err := filepath.WalkDir(root.Path(), func(path string, info fs.DirEntry, err error) error { - if err != nil { - // Probably a permission error. Keep looking. - return filepath.SkipDir - } - // For any path that is not the workspace folder, check if the path - // would be ignored by the go command. Vendor directories also do not - // contain workspace modules. - if info.IsDir() && path != root.Path() { - suffix := strings.TrimPrefix(path, root.Path()) - switch { - case checkIgnored(suffix), - strings.Contains(filepath.ToSlash(suffix), "/vendor/"), - excludePath(suffix): - return filepath.SkipDir - } - } - // We're only interested in go.mod files. - uri := protocol.URIFromPath(path) - if isGoMod(uri) { - modFiles[uri] = struct{}{} - } - if modLimit > 0 && len(modFiles) >= modLimit { - return errDone - } - searched++ - if fileLimit > 0 && searched >= fileLimit { - return errExhausted - } - return nil - }) - if err == errDone { - return modFiles, nil - } - return modFiles, err -} From aee2e7643a4b99a2e8f7c607bf9a165044b17aba Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 6 Feb 2024 15:12:36 +0000 Subject: [PATCH 095/105] gopls/internal/settings: deprecate "allowModfileModifications" Deprecate the "allowModfileModifications" setting, per the rationale in golang/go#56570. This setting cannot be working well, and is a relic of earlier versions of Go modules where modfile mutation was expected. Fixes golang/go#56570 Change-Id: I240e09776367ff3a274212c8eb69bbc57fde7d9f Reviewed-on: https://go-review.googlesource.com/c/tools/+/561975 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/settings/settings.go | 1 + gopls/internal/test/integration/misc/configuration_test.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/gopls/internal/settings/settings.go b/gopls/internal/settings/settings.go index 56be112c504..0f1f1779982 100644 --- a/gopls/internal/settings/settings.go +++ b/gopls/internal/settings/settings.go @@ -1113,6 +1113,7 @@ func (o *Options) set(name string, value interface{}, seen map[string]struct{}) result.deprecated("") case "allowModfileModifications": + result.softErrorf("gopls setting \"allowModfileModifications\" is deprecated.\nPlease comment on https://go.dev/issue/65546 if this impacts your workflow.") result.setBool(&o.AllowModfileModifications) case "allowImplicitNetworkAccess": diff --git a/gopls/internal/test/integration/misc/configuration_test.go b/gopls/internal/test/integration/misc/configuration_test.go index b924f9de330..2d39dc9fad1 100644 --- a/gopls/internal/test/integration/misc/configuration_test.go +++ b/gopls/internal/test/integration/misc/configuration_test.go @@ -142,6 +142,7 @@ func TestDeprecatedSettings(t *testing.T) { "experimentalWatchedFileDelay": "1s", "experimentalWorkspaceModule": true, "tempModfile": true, + "allowModfileModifications": true, }, ).Run(t, "", func(t *testing.T, env *Env) { env.OnceMet( @@ -150,6 +151,7 @@ func TestDeprecatedSettings(t *testing.T) { ShownMessage("experimentalUseInvalidMetadata"), ShownMessage("experimentalWatchedFileDelay"), ShownMessage("tempModfile"), + ShownMessage("allowModfileModifications"), ) }) } From 08bd7281eb1f4321a295a44ee5b60c81f7354ea3 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 6 Feb 2024 15:37:25 +0000 Subject: [PATCH 096/105] gopls/internal/test/integration: add a test for an inner go.work file Add a test to verify that gopls now does the right thing in the scenario described by golang/go#63917, where the users has a go.work file inside a Go module. Gopls now behaves consistently with the go command. Fixes golang/go#63917 Change-Id: I0c9d251477e7403b4f2b75f0333e991a98c82ba4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/562015 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- .../integration/workspace/workspace_test.go | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/gopls/internal/test/integration/workspace/workspace_test.go b/gopls/internal/test/integration/workspace/workspace_test.go index 2042b9926cd..28b3978a8cd 100644 --- a/gopls/internal/test/integration/workspace/workspace_test.go +++ b/gopls/internal/test/integration/workspace/workspace_test.go @@ -818,6 +818,51 @@ use ( }) } +func TestInnerGoWork(t *testing.T) { + // This test checks that gopls honors a go.work file defined + // inside a go module (golang/go#63917). + const workspace = ` +-- go.mod -- +module a.com + +require b.com v1.2.3 +-- a/go.work -- +go 1.18 + +use ( + .. + ../b +) +-- a/a.go -- +package a + +import "b.com/b" + +var _ = b.B +-- b/go.mod -- +module b.com/b + +-- b/b.go -- +package b + +const B = 0 +` + WithOptions( + // This doesn't work if we open the outer module. I'm not sure it should, + // since the go.work file does not apply to the entire module, just a + // subdirectory. + WorkspaceFolders("a"), + ).Run(t, workspace, func(t *testing.T, env *Env) { + env.OpenFile("a/a.go") + loc := env.GoToDefinition(env.RegexpSearch("a/a.go", "b.(B)")) + got := env.Sandbox.Workdir.URIToPath(loc.URI) + want := "b/b.go" + if got != want { + t.Errorf("Definition(b.B): got %q, want %q", got, want) + } + }) +} + func TestNonWorkspaceFileCreation(t *testing.T) { const files = ` -- work/go.mod -- From 8fcb5f0238af43ff2b9e809c0069a55a9a1d5216 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 6 Feb 2024 15:50:29 +0000 Subject: [PATCH 097/105] gopls/internal/test/marker: skip on LUCI solaris builders Fixes golang/go#64473 Change-Id: I373b8fa2bb42aad711686b6b907ac56d0e8d452b Reviewed-on: https://go-review.googlesource.com/c/tools/+/562035 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Findley <rfindley@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> --- gopls/internal/test/marker/marker_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index 18c97000762..1652eec7282 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go @@ -87,7 +87,11 @@ func TestMain(m *testing.M) { func Test(t *testing.T) { if testing.Short() { builder := os.Getenv("GO_BUILDER_NAME") - if strings.HasPrefix(builder, "darwin-") || builder == "solaris-amd64-oraclerel" { + // Note that HasPrefix(builder, "darwin-" only matches legacy builders. + // LUCI builder names start with x_tools-goN.NN. + // We want to exclude solaris on both legacy and LUCI builders, as + // it is timing out. + if strings.HasPrefix(builder, "darwin-") || strings.Contains(builder, "solaris") { t.Skip("golang/go#64473: skipping with -short: this test is too slow on darwin and solaris builders") } } From 4f6024ea39080042dc78c2a3851b7f5327b0967f Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" <bcmills@google.com> Date: Mon, 5 Feb 2024 17:35:36 -0500 Subject: [PATCH 098/105] internal/gopathwalk: walk directories concurrently MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This restores the concurrent walking that was removed in CL 508506, since that concurrency turns out to actually matter in practice (see golang/go#44863), but uses a different (and in my opinion simpler) concurrency pattern based on the one shown in my 2018 GopherCon talk (https://drive.google.com/file/d/1nPdvhB0PutEJzdCq5ms6UI58dp50fcAN/view, slide 114), and removes the arbitrary 4-goroutine minimum. On my machine this speeds up the benchmark from CL 561436 by a factor of around 3½. goos: linux goarch: amd64 pkg: golang.org/x/tools/internal/imports cpu: Intel(R) Xeon(R) CPU @ 2.20GHz │ before.txt │ after.txt │ │ sec/op │ sec/op vs base │ ModuleResolver_InitialScan-24 1728.0m ± 5% 505.2m ± 7% -70.76% (p=0.000 n=10) Fixes golang/go#65531. Updates golang/go#44863. Change-Id: I082bb3375f7775d55d130bf75ae71f53312aace1 Reviewed-on: https://go-review.googlesource.com/c/tools/+/561675 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Bryan Mills <bcmills@google.com> --- internal/gopathwalk/walk.go | 308 ++++++++++++++++--------------- internal/gopathwalk/walk_test.go | 6 +- 2 files changed, 161 insertions(+), 153 deletions(-) diff --git a/internal/gopathwalk/walk.go b/internal/gopathwalk/walk.go index 52f74e643be..8361515519f 100644 --- a/internal/gopathwalk/walk.go +++ b/internal/gopathwalk/walk.go @@ -9,11 +9,13 @@ package gopathwalk import ( "bufio" "bytes" + "io" "io/fs" - "log" "os" "path/filepath" + "runtime" "strings" + "sync" "time" ) @@ -21,8 +23,13 @@ import ( type Options struct { // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) + // Search module caches. Also disables legacy goimports ignore rules. ModulesEnabled bool + + // Maximum number of concurrent calls to user-provided callbacks, + // or 0 for GOMAXPROCS. + Concurrency int } // RootType indicates the type of a Root. @@ -43,19 +50,28 @@ type Root struct { Type RootType } -// Walk walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. +// Walk concurrently walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. +// // For each package found, add will be called with the absolute // paths of the containing source directory and the package directory. +// +// Unlike filepath.WalkDir, Walk follows symbolic links +// (while guarding against cycles). func Walk(roots []Root, add func(root Root, dir string), opts Options) { WalkSkip(roots, add, func(Root, string) bool { return false }, opts) } -// WalkSkip walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. +// WalkSkip concurrently walks Go source directories ($GOROOT, $GOPATH, etc) to +// find packages. +// // For each package found, add will be called with the absolute // paths of the containing source directory and the package directory. // For each directory that will be scanned, skip will be called // with the absolute paths of the containing source directory and the directory. // If skip returns false on a directory it will be processed. +// +// Unlike filepath.WalkDir, WalkSkip follows symbolic links +// (while guarding against cycles). func WalkSkip(roots []Root, add func(root Root, dir string), skip func(root Root, dir string) bool, opts Options) { for _, root := range roots { walkDir(root, add, skip, opts) @@ -64,45 +80,51 @@ func WalkSkip(roots []Root, add func(root Root, dir string), skip func(root Root // walkDir creates a walker and starts fastwalk with this walker. func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) bool, opts Options) { + if opts.Logf == nil { + opts.Logf = func(format string, args ...interface{}) {} + } if _, err := os.Stat(root.Path); os.IsNotExist(err) { - if opts.Logf != nil { - opts.Logf("skipping nonexistent directory: %v", root.Path) - } + opts.Logf("skipping nonexistent directory: %v", root.Path) return } start := time.Now() - if opts.Logf != nil { - opts.Logf("scanning %s", root.Path) + opts.Logf("scanning %s", root.Path) + + concurrency := opts.Concurrency + if concurrency == 0 { + // The walk be either CPU-bound or I/O-bound, depending on what the + // caller-supplied add function does and the details of the user's platform + // and machine. Rather than trying to fine-tune the concurrency level for a + // specific environment, we default to GOMAXPROCS: it is likely to be a good + // choice for a CPU-bound add function, and if it is instead I/O-bound, then + // dealing with I/O saturation is arguably the job of the kernel and/or + // runtime. (Oversaturating I/O seems unlikely to harm performance as badly + // as failing to saturate would.) + concurrency = runtime.GOMAXPROCS(0) } - w := &walker{ - root: root, - add: add, - skip: skip, - opts: opts, - added: make(map[string]bool), + root: root, + add: add, + skip: skip, + opts: opts, + sem: make(chan struct{}, concurrency), } w.init() - // Add a trailing path separator to cause filepath.WalkDir to traverse symlinks. + w.sem <- struct{}{} path := root.Path - if len(path) == 0 { - path = "." + string(filepath.Separator) - } else if !os.IsPathSeparator(path[len(path)-1]) { - path = path + string(filepath.Separator) + if path == "" { + path = "." } - - if err := filepath.WalkDir(path, w.walk); err != nil { - logf := opts.Logf - if logf == nil { - logf = log.Printf - } - logf("scanning directory %v: %v", root.Path, err) + if fi, err := os.Lstat(path); err == nil { + w.walk(path, nil, fs.FileInfoToDirEntry(fi)) + } else { + w.opts.Logf("scanning directory %v: %v", root.Path, err) } + <-w.sem + w.walking.Wait() - if opts.Logf != nil { - opts.Logf("scanned %s in %v", root.Path, time.Since(start)) - } + opts.Logf("scanned %s in %v", root.Path, time.Since(start)) } // walker is the callback for fastwalk.Walk. @@ -112,10 +134,18 @@ type walker struct { skip func(Root, string) bool // The callback that will be invoked for every dir. dir is skipped if it returns true. opts Options // Options passed to Walk by the user. - pathSymlinks []os.FileInfo - ignoredDirs []string + walking sync.WaitGroup + sem chan struct{} // Channel of semaphore tokens; send to acquire, receive to release. + ignoredDirs []string - added map[string]bool + added sync.Map // map[string]bool +} + +// A symlinkList is a linked list of os.FileInfos for parent directories +// reached via symlinks. +type symlinkList struct { + info os.FileInfo + prev *symlinkList } // init initializes the walker based on its Options @@ -132,9 +162,7 @@ func (w *walker) init() { for _, p := range ignoredPaths { full := filepath.Join(w.root.Path, p) w.ignoredDirs = append(w.ignoredDirs, full) - if w.opts.Logf != nil { - w.opts.Logf("Directory added to ignore list: %s", full) - } + w.opts.Logf("Directory added to ignore list: %s", full) } } @@ -144,12 +172,10 @@ func (w *walker) init() { func (w *walker) getIgnoredDirs(path string) []string { file := filepath.Join(path, ".goimportsignore") slurp, err := os.ReadFile(file) - if w.opts.Logf != nil { - if err != nil { - w.opts.Logf("%v", err) - } else { - w.opts.Logf("Read %s", file) - } + if err != nil { + w.opts.Logf("%v", err) + } else { + w.opts.Logf("Read %s", file) } if err != nil { return nil @@ -183,149 +209,129 @@ func (w *walker) shouldSkipDir(dir string) bool { // walk walks through the given path. // -// Errors are logged if w.opts.Logf is non-nil, but otherwise ignored: -// walk returns only nil or fs.SkipDir. -func (w *walker) walk(path string, d fs.DirEntry, err error) error { - if err != nil { - // We have no way to report errors back through Walk or WalkSkip, - // so just log and ignore them. - if w.opts.Logf != nil { +// Errors are logged if w.opts.Logf is non-nil, but otherwise ignored. +func (w *walker) walk(path string, pathSymlinks *symlinkList, d fs.DirEntry) { + if d.Type()&os.ModeSymlink != 0 { + // Walk the symlink's target rather than the symlink itself. + // + // (Note that os.Stat, unlike the lower-lever os.Readlink, + // follows arbitrarily many layers of symlinks, so it will eventually + // reach either a non-symlink or a nonexistent target.) + // + // TODO(bcmills): 'go list all' itself ignores symlinks within GOROOT/src + // and GOPATH/src. Do we really need to traverse them here? If so, why? + + fi, err := os.Stat(path) + if err != nil { w.opts.Logf("%v", err) + return + } + + // Avoid walking symlink cycles: if we have already followed a symlink to + // this directory as a parent of itself, don't follow it again. + // + // This doesn't catch the first time through a cycle, but it also minimizes + // the number of extra stat calls we make if we *don't* encounter a cycle. + // Since we don't actually expect to encounter symlink cycles in practice, + // this seems like the right tradeoff. + for parent := pathSymlinks; parent != nil; parent = parent.prev { + if os.SameFile(fi, parent.info) { + return + } } - if d == nil { - // Nothing more to do: the error prevents us from knowing - // what path even represents. - return nil + + pathSymlinks = &symlinkList{ + info: fi, + prev: pathSymlinks, } + d = fs.FileInfoToDirEntry(fi) } if d.Type().IsRegular() { if !strings.HasSuffix(path, ".go") { - return nil + return } dir := filepath.Dir(path) if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) { // Doesn't make sense to have regular files // directly in your $GOPATH/src or $GOROOT/src. - return nil + // + // TODO(bcmills): there are many levels of directory within + // RootModuleCache where this also wouldn't make sense, + // Can we generalize this to any directory without a corresponding + // import path? + return } - if !w.added[dir] { + if _, dup := w.added.LoadOrStore(dir, true); !dup { w.add(w.root, dir) - w.added[dir] = true } - return nil } - if d.IsDir() { - base := filepath.Base(path) - if base == "" || base[0] == '.' || base[0] == '_' || - base == "testdata" || - (w.root.Type == RootGOROOT && w.opts.ModulesEnabled && base == "vendor") || - (!w.opts.ModulesEnabled && base == "node_modules") { - return fs.SkipDir - } - if w.shouldSkipDir(path) { - return fs.SkipDir - } - return nil + if !d.IsDir() { + return } - if d.Type()&os.ModeSymlink != 0 { - // TODO(bcmills): 'go list all' itself ignores symlinks within GOROOT/src - // and GOPATH/src. Do we really need to traverse them here? If so, why? - - fi, err := os.Stat(path) - if err != nil || !fi.IsDir() { - // Not a directory. Just walk the file (or broken link) and be done. - return w.walk(path, fs.FileInfoToDirEntry(fi), err) - } - - // Avoid walking symlink cycles: if we have already followed a symlink to - // this directory as a parent of itself, don't follow it again. - // - // This doesn't catch the first time through a cycle, but it also minimizes - // the number of extra stat calls we make if we *don't* encounter a cycle. - // Since we don't actually expect to encounter symlink cycles in practice, - // this seems like the right tradeoff. - for _, parent := range w.pathSymlinks { - if os.SameFile(fi, parent) { - return nil - } - } + base := filepath.Base(path) + if base == "" || base[0] == '.' || base[0] == '_' || + base == "testdata" || + (w.root.Type == RootGOROOT && w.opts.ModulesEnabled && base == "vendor") || + (!w.opts.ModulesEnabled && base == "node_modules") || + w.shouldSkipDir(path) { + return + } - w.pathSymlinks = append(w.pathSymlinks, fi) - defer func() { - w.pathSymlinks = w.pathSymlinks[:len(w.pathSymlinks)-1] - }() + // Read the directory and walk its entries. - // On some platforms the OS (or the Go os package) sometimes fails to - // resolve directory symlinks before a trailing slash - // (even though POSIX requires it to do so). - // - // On macOS that failure may be caused by a known libc/kernel bug; - // see https://go.dev/issue/59586. - // - // On Windows before Go 1.21, it may be caused by a bug in - // os.Lstat (fixed in https://go.dev/cl/463177). - // - // Since we need to handle this explicitly on broken platforms anyway, - // it is simplest to just always do that and not rely on POSIX pathname - // resolution to walk the directory (such as by calling WalkDir with - // a trailing slash appended to the path). + f, err := os.Open(path) + if err != nil { + w.opts.Logf("%v", err) + return + } + defer f.Close() + + for { + // We impose an arbitrary limit on the number of ReadDir results per + // directory to limit the amount of memory consumed for stale or upcoming + // directory entries. The limit trades off CPU (number of syscalls to read + // the whole directory) against RAM (reachable directory entries other than + // the one currently being processed). // - // Instead, we make a sequence of walk calls — directly and through - // recursive calls to filepath.WalkDir — simulating what WalkDir would do - // if the symlink were a regular directory. - - // First we call walk on the path as a directory - // (instead of a symlink). - err = w.walk(path, fs.FileInfoToDirEntry(fi), nil) - if err == fs.SkipDir { - return nil - } else if err != nil { - // This should be impossible, but handle it anyway in case - // walk is changed to return other errors. - return err - } - - // Now read the directory and walk its entries. - ents, err := os.ReadDir(path) + // Since we process the directories recursively, we will end up maintaining + // a slice of entries for each level of the directory tree. + // (Compare https://go.dev/issue/36197.) + ents, err := f.ReadDir(1024) if err != nil { - // Report the ReadDir error, as filepath.WalkDir would do. - err = w.walk(path, fs.FileInfoToDirEntry(fi), err) - if err == fs.SkipDir { - return nil - } else if err != nil { - return err // Again, should be impossible. + if err != io.EOF { + w.opts.Logf("%v", err) } - // Fall through and iterate over whatever entries we did manage to get. + break } for _, d := range ents { nextPath := filepath.Join(path, d.Name()) if d.IsDir() { - // We want to walk the whole directory tree rooted at nextPath, - // not just the single entry for the directory. - err := filepath.WalkDir(nextPath, w.walk) - if err != nil && w.opts.Logf != nil { - w.opts.Logf("%v", err) - } - } else { - err := w.walk(nextPath, d, nil) - if err == fs.SkipDir { - // Skip the rest of the entries in the parent directory of nextPath - // (that is, path itself). - break - } else if err != nil { - return err // Again, should be impossible. + select { + case w.sem <- struct{}{}: + // Got a new semaphore token, so we can traverse the directory concurrently. + d := d + w.walking.Add(1) + go func() { + defer func() { + <-w.sem + w.walking.Done() + }() + w.walk(nextPath, pathSymlinks, d) + }() + continue + + default: + // No tokens available, so traverse serially. } } + + w.walk(nextPath, pathSymlinks, d) } - return nil } - - // Not a file, regular directory, or symlink; skip. - return nil } diff --git a/internal/gopathwalk/walk_test.go b/internal/gopathwalk/walk_test.go index 51719dbbcd9..8028f818588 100644 --- a/internal/gopathwalk/walk_test.go +++ b/internal/gopathwalk/walk_test.go @@ -37,17 +37,19 @@ func TestSymlinkTraversal(t *testing.T) { t.Fatal(err) } - pkgs := []string{} + pkgc := make(chan []string, 1) + pkgc <- nil add := func(root Root, dir string) { rel, err := filepath.Rel(filepath.Join(root.Path, "src"), dir) if err != nil { t.Error(err) } - pkgs = append(pkgs, filepath.ToSlash(rel)) + pkgc <- append(<-pkgc, filepath.ToSlash(rel)) } Walk([]Root{{Path: gopath, Type: RootGOPATH}}, add, Options{Logf: t.Logf}) + pkgs := <-pkgc sort.Strings(pkgs) t.Logf("Found packages:\n\t%s", strings.Join(pkgs, "\n\t")) From f6dc1e9b7e671391aea5013b1ae14cc8bae3f6a9 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 30 Jan 2024 20:14:35 -0500 Subject: [PATCH 099/105] internal/imports: merge init and newModuleResolver Switch the ModuleResolver from a lazy initialization model to a constructor, so that the resolver returned by ProcessEnv.GetResolver is ready to use. A constructor is easier to maintain as it involves less state, avoids redundant calls to init, and avoids bugs where the call to init is missing (such as was the case for the scoreImportPath method). It also lets the caller differentiate between a failure to construct the resolver and a resolver that only returns errors. Pragmatically, I'd like to move toward a model where the caller re-scans imports by asynchronously cloning, priming, and replacing the resolver, rather than blocking. This is a step in that direction. This change is not without risk, but it looks like all calls to ModuleResolver methods are preceded by a call to GetResolver, and errors from GetResolver are handled similarly errors from methods. There is some messiness resulting from this change, particularly in tests. These are noted inline, and can eventually be fixed by similarly avoiding lazy initialization of ProcessEnv. For golang/go#59216 Change-Id: I3b7206417f61a5697ed83e811c177f646afce3b2 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559635 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/cache/imports.go | 7 +-- internal/imports/fix.go | 56 +++++++++++------ internal/imports/mod.go | 108 +++++++++++++++----------------- internal/imports/mod_test.go | 44 +++++++------ 4 files changed, 114 insertions(+), 101 deletions(-) diff --git a/gopls/internal/cache/imports.go b/gopls/internal/cache/imports.go index 1e98fa454ad..9d6154dabed 100644 --- a/gopls/internal/cache/imports.go +++ b/gopls/internal/cache/imports.go @@ -51,12 +51,7 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot // update the processEnv. Clearing caches blocks on any background // scans. if modFileHash != s.cachedModFileHash { - if resolver, err := s.processEnv.GetResolver(); err == nil { - if modResolver, ok := resolver.(*imports.ModuleResolver); ok { - modResolver.ClearForNewMod() - } - } - + s.processEnv.ClearModuleInfo() s.cachedModFileHash = modFileHash } diff --git a/internal/imports/fix.go b/internal/imports/fix.go index 5cf1aff3cb3..21bdc06c294 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -847,6 +847,21 @@ var requiredGoEnvVars = []string{ // ProcessEnv contains environment variables and settings that affect the use of // the go command, the go/build package, etc. +// +// ...a ProcessEnv *also* overwrites its Env along with derived state in the +// form of the resolver. And because it is lazily initialized, an env may just +// be broken and unusable, but there is no way for the caller to detect that: +// all queries will just fail. +// +// TODO(rfindley): refactor this package so that this type (perhaps renamed to +// just Env or Config) is an immutable configuration struct, to be exchanged +// for an initialized object via a constructor that returns an error. Perhaps +// the signature should be `func NewResolver(*Env) (*Resolver, error)`, where +// resolver is a concrete type used for resolving imports. Via this +// refactoring, we can avoid the need to call ProcessEnv.init and +// ProcessEnv.GoEnv everywhere, and implicitly fix all the places where this +// these are misused. Also, we'd delegate the caller the decision of how to +// handle a broken environment. type ProcessEnv struct { GocmdRunner *gocommand.Runner @@ -869,11 +884,13 @@ type ProcessEnv struct { // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) - // TODO(rfindley): for simplicity, use a constructor rather than - // initialization pattern for ProcessEnv. - initialized bool + initialized bool // see TODO above - resolver Resolver + // resolver and resolverErr are lazily evaluated (see GetResolver). + // This is unclean, but see the big TODO in the docstring for ProcessEnv + // above: for now, we can't be sure that the ProcessEnv is fully initialized. + resolver Resolver + resolverErr error } func (e *ProcessEnv) goEnv() (map[string]string, error) { @@ -953,24 +970,25 @@ func (e *ProcessEnv) env() []string { } func (e *ProcessEnv) GetResolver() (Resolver, error) { - if e.resolver != nil { - return e.resolver, nil - } if err := e.init(); err != nil { return nil, err } - // TODO(rfindley): we should only use a gopathResolver here if the working - // directory is actually *in* GOPATH. (I seem to recall an open gopls issue - // for this behavior, but I can't find it). - // - // For gopls, we can optionally explicitly choose a resolver type, since we - // already know the view type. - if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { - e.resolver = newGopathResolver(e) - return e.resolver, nil - } - e.resolver = newModuleResolver(e) - return e.resolver, nil + + if e.resolver == nil && e.resolverErr == nil { + // TODO(rfindley): we should only use a gopathResolver here if the working + // directory is actually *in* GOPATH. (I seem to recall an open gopls issue + // for this behavior, but I can't find it). + // + // For gopls, we can optionally explicitly choose a resolver type, since we + // already know the view type. + if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { + e.resolver = newGopathResolver(e) + } else { + e.resolver, e.resolverErr = newModuleResolver(e) + } + } + + return e.resolver, e.resolverErr } // buildContext returns the build.Context to use for matching files. diff --git a/internal/imports/mod.go b/internal/imports/mod.go index 2287d4a8f5e..c8a040c08c0 100644 --- a/internal/imports/mod.go +++ b/internal/imports/mod.go @@ -62,8 +62,7 @@ import ( type ModuleResolver struct { env *ProcessEnv - // Module state, populated by init - initialized bool + // Module state, populated during construction dummyVendorMod *gocommand.ModuleJSON // if vendoring is enabled, a pseudo-module to represent the /vendor directory moduleCacheDir string // GOMODCACHE, inferred from GOPATH if unset roots []gopathwalk.Root // roots to scan, in approximate order of importance @@ -87,24 +86,18 @@ type ModuleResolver struct { otherCache *dirInfoCache } -func newModuleResolver(e *ProcessEnv) *ModuleResolver { +func newModuleResolver(e *ProcessEnv) (*ModuleResolver, error) { r := &ModuleResolver{ env: e, scanSema: make(chan struct{}, 1), } r.scanSema <- struct{}{} - return r -} - -func (r *ModuleResolver) init() error { - if r.initialized { - return nil - } goenv, err := r.env.goEnv() if err != nil { - return err + return nil, err } + // TODO(rfindley): can we refactor to share logic with r.env.invokeGo? inv := gocommand.Invocation{ BuildFlags: r.env.BuildFlags, @@ -125,7 +118,7 @@ func (r *ModuleResolver) init() error { // invocation? vendorEnabled, mainModVendor, err = gocommand.VendorEnabled(context.TODO(), inv, r.env.GocmdRunner) if err != nil { - return err + return nil, err } } @@ -146,19 +139,14 @@ func (r *ModuleResolver) init() error { // GO111MODULE=on. Other errors are fatal. if err != nil { if errMsg := err.Error(); !strings.Contains(errMsg, "working directory is not part of a module") && !strings.Contains(errMsg, "go.mod file not found") { - return err + return nil, err } } } - if gmc := r.env.Env["GOMODCACHE"]; gmc != "" { - r.moduleCacheDir = gmc - } else { - gopaths := filepath.SplitList(goenv["GOPATH"]) - if len(gopaths) == 0 { - return fmt.Errorf("empty GOPATH") - } - r.moduleCacheDir = filepath.Join(gopaths[0], "/pkg/mod") + r.moduleCacheDir = gomodcacheForEnv(goenv) + if r.moduleCacheDir == "" { + return nil, fmt.Errorf("cannot resolve GOMODCACHE") } sort.Slice(r.modsByModPath, func(i, j int) bool { @@ -212,20 +200,32 @@ func (r *ModuleResolver) init() error { } r.scannedRoots = map[gopathwalk.Root]bool{} - if r.moduleCacheCache == nil { - r.moduleCacheCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, - } + r.moduleCacheCache = &dirInfoCache{ + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, } - if r.otherCache == nil { - r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, - } + r.otherCache = &dirInfoCache{ + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, } - r.initialized = true - return nil + return r, nil +} + +// gomodcacheForEnv returns the GOMODCACHE value to use based on the given env +// map, which must have GOMODCACHE and GOPATH populated. +// +// TODO(rfindley): this is defensive refactoring. +// 1. Is this even relevant anymore? Can't we just read GOMODCACHE. +// 2. Use this to separate module cache scanning from other scanning. +func gomodcacheForEnv(goenv map[string]string) string { + if gmc := goenv["GOMODCACHE"]; gmc != "" { + return gmc + } + gopaths := filepath.SplitList(goenv["GOPATH"]) + if len(gopaths) == 0 { + return "" + } + return filepath.Join(gopaths[0], "/pkg/mod") } func (r *ModuleResolver) initAllMods() error { @@ -271,21 +271,27 @@ func (r *ModuleResolver) ClearForNewScan() { r.scanSema <- struct{}{} } -// ClearForNewMod invalidates resolver state that depends on the go.mod file -// (essentially, the output of go list -m -json ...). +// ClearModuleInfo invalidates resolver state that depends on go.mod file +// contents (essentially, the output of go list -m -json ...). // // Notably, it does not forget directory contents, which are reset // asynchronously via ClearForNewScan. -func (r *ModuleResolver) ClearForNewMod() { - <-r.scanSema - *r = ModuleResolver{ - env: r.env, - moduleCacheCache: r.moduleCacheCache, - otherCache: r.otherCache, - scanSema: r.scanSema, +// +// If the ProcessEnv is a GOPATH environment, ClearModuleInfo is a no op. +// +// TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods. +func (e *ProcessEnv) ClearModuleInfo() { + if r, ok := e.resolver.(*ModuleResolver); ok { + resolver, resolverErr := newModuleResolver(e) + if resolverErr == nil { + <-r.scanSema // guards caches + resolver.moduleCacheCache = r.moduleCacheCache + resolver.otherCache = r.otherCache + r.scanSema <- struct{}{} + } + e.resolver = resolver + e.resolverErr = resolverErr } - r.init() - r.scanSema <- struct{}{} } // findPackage returns the module and directory that contains the package at @@ -355,10 +361,6 @@ func (r *ModuleResolver) cacheStore(info directoryPackageInfo) { } } -func (r *ModuleResolver) cacheKeys() []string { - return append(r.moduleCacheCache.Keys(), r.otherCache.Keys()...) -} - // cachePackageName caches the package name for a dir already in the cache. func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (string, error) { if info.rootType == gopathwalk.RootModuleCache { @@ -469,9 +471,6 @@ func (r *ModuleResolver) dirInModuleCache(dir string) bool { } func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - if err := r.init(); err != nil { - return nil, err - } names := map[string]string{} for _, path := range importPaths { _, packageDir := r.findPackage(path) @@ -491,10 +490,6 @@ func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error ctx, done := event.Start(ctx, "imports.ModuleResolver.scan") defer done() - if err := r.init(); err != nil { - return err - } - processDir := func(info directoryPackageInfo) { // Skip this directory if we were not able to get the package information successfully. if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { @@ -672,9 +667,6 @@ func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { } func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) { - if err := r.init(); err != nil { - return "", nil, err - } if info, ok := r.cacheLoad(pkg.dir); ok && !includeTest { return r.cacheExports(ctx, r.env, info) } diff --git a/internal/imports/mod_test.go b/internal/imports/mod_test.go index 55ac6132ade..e58b51e181f 100644 --- a/internal/imports/mod_test.go +++ b/internal/imports/mod_test.go @@ -94,7 +94,7 @@ package z mt.assertFound("y", "y") - scan, err := scanToSlice(mt.resolver, nil) + scan, err := scanToSlice(mt.env.resolver, nil) if err != nil { t.Fatal(err) } @@ -213,7 +213,7 @@ import _ "rsc.io/quote" } // Uninitialize the go.mod dependent cached information and make sure it still finds the package. - mt.resolver.ClearForNewMod() + mt.env.ClearModuleInfo() mt.assertScanFinds("rsc.io/quote", "quote") } @@ -242,8 +242,9 @@ import _ "rsc.io/sampler" } // Clear out the resolver's cache, since we've changed the environment. - mt.resolver = newModuleResolver(mt.env) mt.env.Env["GOFLAGS"] = "-mod=vendor" + mt.env.ClearModuleInfo() + mt.env.resolver.ClearForNewScan() mt.assertModuleFoundInDir("rsc.io/sampler", "sampler", `/vendor/`) } @@ -270,6 +271,10 @@ import _ "rsc.io/sampler" if testenv.Go1Point() >= 14 { wantDir = `/vendor/` } + + // Clear out the resolver's module info, since we've changed the environment. + // (the presence of a /vendor directory affects `go list -m`). + mt.env.ClearModuleInfo() mt.assertModuleFoundInDir("rsc.io/sampler", "sampler", wantDir) } @@ -901,7 +906,7 @@ package x func (t *modTest) assertFound(importPath, pkgName string) (string, *pkg) { t.Helper() - names, err := t.resolver.loadPackageNames([]string{importPath}, t.env.WorkingDir) + names, err := t.env.resolver.loadPackageNames([]string{importPath}, t.env.WorkingDir) if err != nil { t.Errorf("loading package name for %v: %v", importPath, err) } @@ -910,13 +915,13 @@ func (t *modTest) assertFound(importPath, pkgName string) (string, *pkg) { } pkg := t.assertScanFinds(importPath, pkgName) - _, foundDir := t.resolver.findPackage(importPath) + _, foundDir := t.env.resolver.(*ModuleResolver).findPackage(importPath) return foundDir, pkg } func (t *modTest) assertScanFinds(importPath, pkgName string) *pkg { t.Helper() - scan, err := scanToSlice(t.resolver, nil) + scan, err := scanToSlice(t.env.resolver, nil) if err != nil { t.Errorf("scan failed: %v", err) } @@ -984,10 +989,9 @@ var proxyDir string type modTest struct { *testing.T - env *ProcessEnv - gopath string - resolver *ModuleResolver - cleanup func() + env *ProcessEnv + gopath string + cleanup func() } // setup builds a test environment from a txtar and supporting modules @@ -1047,16 +1051,20 @@ func setup(t *testing.T, extraEnv map[string]string, main, wd string) *modTest { } } - resolver, err := env.GetResolver() - if err != nil { + // Ensure the resolver is set for tests that (unsafely) access env.resolver + // directly. + // + // TODO(rfindley): fix this after addressing the TODO in the ProcessEnv + // docstring. + if _, err := env.GetResolver(); err != nil { t.Fatal(err) } + return &modTest{ - T: t, - gopath: env.Env["GOPATH"], - env: env, - resolver: resolver.(*ModuleResolver), - cleanup: func() { removeDir(dir) }, + T: t, + gopath: env.Env["GOPATH"], + env: env, + cleanup: func() { removeDir(dir) }, } } @@ -1184,7 +1192,7 @@ import _ "rsc.io/quote" want := filepath.Join(mt.gopath, "pkg/mod", "rsc.io/quote@v1.5.2") found := mt.assertScanFinds("rsc.io/quote", "quote") - modDir, _ := mt.resolver.modInfo(found.dir) + modDir, _ := mt.env.resolver.(*ModuleResolver).modInfo(found.dir) if modDir != want { t.Errorf("expected: %s, got: %s", want, modDir) } From 2bb7f1c0ce471f13e1fc4d8e1bbed46badd80788 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Thu, 1 Feb 2024 13:46:54 -0500 Subject: [PATCH 100/105] gopls/internal/test/integration/bench: improve completion benchmarks Make the following improvements to the completion benchmarks: - Run the "CompletionFollowingEdit" benchmarks with and without edits. Accordingly, rename it to just "BenchmarkCompletion", and shorten subtest names. - BenchmarkCompletion is a cleaner way to specify completion tests. Deprecate other styles. - Support running completion tests with a massive GOPATH, by passing -completion_gopath. - Add a tools_unimportedselector test that seems to do a good job of exercising slow unimported completion. Other unimportedcompletion tests were short-circuited in one way or another (for example, because kubernetes uses vendoring, gopls doesn't scan GOPATH). This will invalidate our benchmark dashboard, so we should merge this change before subsequent CLs that optimize unimported completion. For golang/go#63459 Change-Id: I9d7a06e3c1a7239b531ed8ff534f3174f4ac4ae8 Reviewed-on: https://go-review.googlesource.com/c/tools/+/560457 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- .../test/integration/bench/completion_test.go | 72 ++++++++++++++----- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/gopls/internal/test/integration/bench/completion_test.go b/gopls/internal/test/integration/bench/completion_test.go index b7a138d98c4..bbbba0e3fd1 100644 --- a/gopls/internal/test/integration/bench/completion_test.go +++ b/gopls/internal/test/integration/bench/completion_test.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/gopls/internal/test/integration/fake" ) -// TODO(rfindley): update these completion tests to run on multiple repos. +var completionGOPATH = flag.String("completion_gopath", "", "if set, use this GOPATH for BenchmarkCompletion") type completionBenchOptions struct { file, locationRegexp string @@ -25,6 +25,7 @@ type completionBenchOptions struct { beforeCompletion func(*Env) // run before each completion } +// Deprecated: new tests should be expressed in BenchmarkCompletion. func benchmarkCompletion(options completionBenchOptions, b *testing.B) { repo := getRepo(b, "tools") _ = repo.sharedEnv(b) // ensure cache is warm @@ -146,7 +147,7 @@ func (c *completer) _() { }, b) } -type completionFollowingEditTest struct { +type completionTest struct { repo string name string file string // repo-relative file to create @@ -154,7 +155,7 @@ type completionFollowingEditTest struct { locationRegexp string // regexp for completion } -var completionFollowingEditTests = []completionFollowingEditTest{ +var completionTests = []completionTest{ { "tools", "selector", @@ -168,6 +169,32 @@ func (c *completer) _() { `, `func \(c \*completer\) _\(\) {\n\tc\.inference\.kindMatches\((c)`, }, + { + "tools", + "unimportedident", + "internal/lsp/source/completion/completion2.go", + ` +package completion + +func (c *completer) _() { + lo +} +`, + `lo()`, + }, + { + "tools", + "unimportedselector", + "internal/lsp/source/completion/completion2.go", + ` +package completion + +func (c *completer) _() { + log. +} +`, + `log\.()`, + }, { "kubernetes", "selector", @@ -213,14 +240,18 @@ func (p *Pivot) _() { // // Edits force type-checked packages to be invalidated, so we want to measure // how long it takes before completion results are available. -func BenchmarkCompletionFollowingEdit(b *testing.B) { - for _, test := range completionFollowingEditTests { +func BenchmarkCompletion(b *testing.B) { + for _, test := range completionTests { b.Run(fmt.Sprintf("%s_%s", test.repo, test.name), func(b *testing.B) { - for _, completeUnimported := range []bool{true, false} { - b.Run(fmt.Sprintf("completeUnimported=%v", completeUnimported), func(b *testing.B) { - for _, budget := range []string{"0s", "100ms"} { - b.Run(fmt.Sprintf("budget=%s", budget), func(b *testing.B) { - runCompletionFollowingEdit(b, test, completeUnimported, budget) + for _, followingEdit := range []bool{true, false} { + b.Run(fmt.Sprintf("edit=%v", followingEdit), func(b *testing.B) { + for _, completeUnimported := range []bool{true, false} { + b.Run(fmt.Sprintf("unimported=%v", completeUnimported), func(b *testing.B) { + for _, budget := range []string{"0s", "100ms"} { + b.Run(fmt.Sprintf("budget=%s", budget), func(b *testing.B) { + runCompletion(b, test, followingEdit, completeUnimported, budget) + }) + } }) } }) @@ -229,13 +260,20 @@ func BenchmarkCompletionFollowingEdit(b *testing.B) { } } +// For optimizing unimported completion, it can be useful to benchmark with a +// huge GOMODCACHE. var gomodcache = flag.String("gomodcache", "", "optional GOMODCACHE for unimported completion benchmarks") -func runCompletionFollowingEdit(b *testing.B, test completionFollowingEditTest, completeUnimported bool, budget string) { +func runCompletion(b *testing.B, test completionTest, followingEdit, completeUnimported bool, budget string) { repo := getRepo(b, test.repo) - sharedEnv := repo.sharedEnv(b) // ensure cache is warm + gopath := *completionGOPATH + if gopath == "" { + // use a warm GOPATH + sharedEnv := repo.sharedEnv(b) + gopath = sharedEnv.Sandbox.GOPATH() + } envvars := map[string]string{ - "GOPATH": sharedEnv.Sandbox.GOPATH(), // use the warm cache + "GOPATH": gopath, } if *gomodcache != "" { @@ -248,7 +286,7 @@ func runCompletionFollowingEdit(b *testing.B, test completionFollowingEditTest, "completeUnimported": completeUnimported, "completionBudget": budget, }, - }, "completionFollowingEdit", false) + }, "completion", false) defer env.Close() env.CreateBuffer(test.file, "// __TEST_PLACEHOLDER_0__\n"+test.content) @@ -278,12 +316,14 @@ func runCompletionFollowingEdit(b *testing.B, test completionFollowingEditTest, b.ResetTimer() - if stopAndRecord := startProfileIfSupported(b, env, qualifiedName(test.repo, "completionFollowingEdit")); stopAndRecord != nil { + if stopAndRecord := startProfileIfSupported(b, env, qualifiedName(test.repo, "completion")); stopAndRecord != nil { defer stopAndRecord() } for i := 0; i < b.N; i++ { - editPlaceholder() + if followingEdit { + editPlaceholder() + } loc := env.RegexpSearch(test.file, test.locationRegexp) env.Completion(loc) } From 8b6359d83311a4e039ed6f154db93e15c8018710 Mon Sep 17 00:00:00 2001 From: Rob Findley <rfindley@google.com> Date: Tue, 30 Jan 2024 21:47:30 -0500 Subject: [PATCH 101/105] gopls/internal/cache: share goimports state for GOMODCACHE When using the gopls daemon, or with the multi-View workspaces that will be increasingly common following golang/go#57979, there is a lot of redundant work performed scanning the module cache. This CL eliminates that redundancy, by moving module cache information into the cache.Cache shared by all Sessions and Views. There should be effectively no change in behavior for gopls resulting from this CL. In ModuleResolver.scan, we still require that module cache roots are scanned. However, we no longer invalidate this scan in ModuleResolver.ClearForNewScan: re-scanning the module cache is the responsibility of a new ScanModuleCache function, which is independently scheduled. To enable this separation of refresh logic, a new refreshTimer type is extracted to encapsulate the refresh logic. For golang/go#44863 Change-Id: I333d55fca009be7984a514ed4abdc9a9fcafc08a Reviewed-on: https://go-review.googlesource.com/c/tools/+/559636 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- gopls/internal/cache/cache.go | 27 ++++- gopls/internal/cache/imports.go | 154 +++++++++++++++++++++++++---- gopls/internal/cache/session.go | 6 +- internal/imports/fix.go | 20 ++-- internal/imports/mod.go | 63 +++++++----- internal/imports/mod_cache.go | 113 +++++++++++++++++++-- internal/imports/mod_cache_test.go | 24 ++++- 7 files changed, 332 insertions(+), 75 deletions(-) diff --git a/gopls/internal/cache/cache.go b/gopls/internal/cache/cache.go index 310cf02bbbf..a6a166aab58 100644 --- a/gopls/internal/cache/cache.go +++ b/gopls/internal/cache/cache.go @@ -10,6 +10,7 @@ import ( "sync/atomic" "golang.org/x/tools/gopls/internal/protocol/command" + "golang.org/x/tools/internal/imports" "golang.org/x/tools/internal/memoize" ) @@ -30,20 +31,36 @@ func New(store *memoize.Store) *Cache { id: strconv.FormatInt(index, 10), store: store, memoizedFS: newMemoizedFS(), + modCache: &sharedModCache{ + caches: make(map[string]*imports.DirInfoCache), + timers: make(map[string]*refreshTimer), + }, } return c } -// A Cache holds caching stores that are bundled together for consistency. -// -// TODO(rfindley): once fset and store need not be bundled together, the Cache -// type can be eliminated. +// A Cache holds content that is shared across multiple gopls sessions. type Cache struct { id string + // store holds cached calculations. + // + // TODO(rfindley): at this point, these are not important, as we've moved our + // content-addressable cache to the file system (the filecache package). It + // is unlikely that this shared cache provides any shared value. We should + // consider removing it, replacing current uses with a simpler futures cache, + // as we've done for e.g. type-checked packages. store *memoize.Store - *memoizedFS // implements file.Source + // memoizedFS holds a shared file.Source that caches reads. + // + // Reads are invalidated when *any* session gets a didChangeWatchedFile + // notification. This is fine: it is the responsibility of memoizedFS to hold + // our best knowledge of the current file system state. + *memoizedFS + + // modCache holds the + modCache *sharedModCache } var cacheIndex, sessionIndex, viewIndex int64 diff --git a/gopls/internal/cache/imports.go b/gopls/internal/cache/imports.go index 9d6154dabed..cfba5626dee 100644 --- a/gopls/internal/cache/imports.go +++ b/gopls/internal/cache/imports.go @@ -13,19 +13,129 @@ import ( "golang.org/x/tools/gopls/internal/file" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/keys" + "golang.org/x/tools/internal/event/tag" "golang.org/x/tools/internal/imports" ) +// refreshTimer implements delayed asynchronous refreshing of state. +// +// See the [refreshTimer.schedule] documentation for more details. +type refreshTimer struct { + mu sync.Mutex + duration time.Duration + timer *time.Timer + refreshFn func() +} + +// newRefreshTimer constructs a new refresh timer which schedules refreshes +// using the given function. +func newRefreshTimer(refresh func()) *refreshTimer { + return &refreshTimer{ + refreshFn: refresh, + } +} + +// schedule schedules the refresh function to run at some point in the future, +// if no existing refresh is already scheduled. +// +// At a minimum, scheduled refreshes are delayed by 30s, but they may be +// delayed longer to keep their expected execution time under 2% of wall clock +// time. +func (t *refreshTimer) schedule() { + t.mu.Lock() + defer t.mu.Unlock() + + if t.timer == nil { + // Don't refresh more than twice per minute. + delay := 30 * time.Second + // Don't spend more than ~2% of the time refreshing. + if adaptive := 50 * t.duration; adaptive > delay { + delay = adaptive + } + t.timer = time.AfterFunc(delay, func() { + start := time.Now() + t.refreshFn() + t.mu.Lock() + t.duration = time.Since(start) + t.timer = nil + t.mu.Unlock() + }) + } +} + +// A sharedModCache tracks goimports state for GOMODCACHE directories +// (each session may have its own GOMODCACHE). +// +// This state is refreshed independently of view-specific imports state. +type sharedModCache struct { + mu sync.Mutex + caches map[string]*imports.DirInfoCache // GOMODCACHE -> cache content; never invalidated + timers map[string]*refreshTimer // GOMODCACHE -> timer +} + +func (c *sharedModCache) dirCache(dir string) *imports.DirInfoCache { + c.mu.Lock() + defer c.mu.Unlock() + + cache, ok := c.caches[dir] + if !ok { + cache = imports.NewDirInfoCache() + c.caches[dir] = cache + } + return cache +} + +// refreshDir schedules a refresh of the given directory, which must be a +// module cache. +func (c *sharedModCache) refreshDir(ctx context.Context, dir string, logf func(string, ...any)) { + cache := c.dirCache(dir) + + c.mu.Lock() + defer c.mu.Unlock() + timer, ok := c.timers[dir] + if !ok { + timer = newRefreshTimer(func() { + _, done := event.Start(ctx, "cache.sharedModCache.refreshDir", tag.Directory.Of(dir)) + defer done() + imports.ScanModuleCache(dir, cache, logf) + }) + c.timers[dir] = timer + } + + timer.schedule() +} + +// importsState tracks view-specific imports state. type importsState struct { - ctx context.Context + ctx context.Context + modCache *sharedModCache + refreshTimer *refreshTimer + + mu sync.Mutex + processEnv *imports.ProcessEnv + cachedModFileHash file.Hash +} - mu sync.Mutex - processEnv *imports.ProcessEnv - cacheRefreshDuration time.Duration - cacheRefreshTimer *time.Timer - cachedModFileHash file.Hash +// newImportsState constructs a new imports state for running goimports +// functions via [runProcessEnvFunc]. +// +// The returned state will automatically refresh itself following a call to +// runProcessEnvFunc. +func newImportsState(backgroundCtx context.Context, modCache *sharedModCache, env *imports.ProcessEnv) *importsState { + s := &importsState{ + ctx: backgroundCtx, + modCache: modCache, + processEnv: env, + } + s.refreshTimer = newRefreshTimer(s.refreshProcessEnv) + return s } +// runProcessEnvFunc runs goimports. +// +// Any call to runProcessEnvFunc will schedule a refresh of the imports state +// at some point in the future, if such a refresh is not already scheduled. See +// [refreshTimer] for more details. func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot, fn func(context.Context, *imports.Options) error) error { ctx, done := event.Start(ctx, "cache.importsState.runProcessEnvFunc") defer done() @@ -72,15 +182,20 @@ func (s *importsState) runProcessEnvFunc(ctx context.Context, snapshot *Snapshot return err } - if s.cacheRefreshTimer == nil { - // Don't refresh more than twice per minute. - delay := 30 * time.Second - // Don't spend more than a couple percent of the time refreshing. - if adaptive := 50 * s.cacheRefreshDuration; adaptive > delay { - delay = adaptive - } - s.cacheRefreshTimer = time.AfterFunc(delay, s.refreshProcessEnv) - } + // Refresh the imports resolver after usage. This may seem counterintuitive, + // since it means the first ProcessEnvFunc after a long period of inactivity + // may be stale, but in practice we run ProcessEnvFuncs frequently during + // active development (e.g. during completion), and so this mechanism will be + // active while gopls is in use, and inactive when gopls is idle. + s.refreshTimer.schedule() + + // TODO(rfindley): the GOMODCACHE value used here isn't directly tied to the + // ProcessEnv.Env["GOMODCACHE"], though they should theoretically always + // agree. It would be better if we guaranteed this, possibly by setting all + // required environment variables in ProcessEnv.Env, to avoid the redundant + // Go command invocation. + gomodcache := snapshot.view.folder.Env.GOMODCACHE + s.modCache.refreshDir(s.ctx, gomodcache, s.processEnv.Logf) return nil } @@ -96,16 +211,17 @@ func (s *importsState) refreshProcessEnv() { if resolver, err := s.processEnv.GetResolver(); err == nil { resolver.ClearForNewScan() } + // TODO(rfindley): it's not clear why we're unlocking here. Shouldn't we + // guard the use of env below? In any case, we can prime a separate resolver. s.mu.Unlock() event.Log(s.ctx, "background imports cache refresh starting") + + // TODO(rfindley, golang/go#59216): do this priming with a separate resolver, + // and then replace, so that we never have to wait on an unprimed cache. if err := imports.PrimeCache(context.Background(), env); err == nil { event.Log(ctx, fmt.Sprintf("background refresh finished after %v", time.Since(start))) } else { event.Log(ctx, fmt.Sprintf("background refresh finished after %v", time.Since(start)), keys.Err.Of(err)) } - s.mu.Lock() - s.cacheRefreshDuration = time.Since(start) - s.cacheRefreshTimer = nil - s.mu.Unlock() } diff --git a/gopls/internal/cache/session.go b/gopls/internal/cache/session.go index 27380f114dd..102a2261d25 100644 --- a/gopls/internal/cache/session.go +++ b/gopls/internal/cache/session.go @@ -209,6 +209,7 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * SkipPathInScan: skipPath, Env: env, WorkingDir: def.root.Path(), + ModCache: s.cache.modCache.dirCache(def.folder.Env.GOMODCACHE), } if def.folder.Options.VerboseOutput { pe.Logf = func(format string, args ...interface{}) { @@ -227,10 +228,7 @@ func (s *Session) createView(ctx context.Context, def *viewDefinition) (*View, * ignoreFilter: ignoreFilter, fs: s.overlayFS, viewDefinition: def, - importsState: &importsState{ - ctx: backgroundCtx, - processEnv: pe, - }, + importsState: newImportsState(backgroundCtx, s.cache.modCache, pe), } s.snapshotWG.Add(1) diff --git a/internal/imports/fix.go b/internal/imports/fix.go index 21bdc06c294..606d6a54287 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -884,6 +884,10 @@ type ProcessEnv struct { // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) + // If set, ModCache holds a shared cache of directory info to use across + // multiple ProcessEnvs. + ModCache *DirInfoCache + initialized bool // see TODO above // resolver and resolverErr are lazily evaluated (see GetResolver). @@ -984,7 +988,7 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) { if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { e.resolver = newGopathResolver(e) } else { - e.resolver, e.resolverErr = newModuleResolver(e) + e.resolver, e.resolverErr = newModuleResolver(e, e.ModCache) } } @@ -1252,17 +1256,14 @@ func ImportPathToAssumedName(importPath string) string { type gopathResolver struct { env *ProcessEnv walked bool - cache *dirInfoCache + cache *DirInfoCache scanSema chan struct{} // scanSema prevents concurrent scans. } func newGopathResolver(env *ProcessEnv) *gopathResolver { r := &gopathResolver{ - env: env, - cache: &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, - }, + env: env, + cache: NewDirInfoCache(), scanSema: make(chan struct{}, 1), } r.scanSema <- struct{}{} @@ -1271,10 +1272,7 @@ func newGopathResolver(env *ProcessEnv) *gopathResolver { func (r *gopathResolver) ClearForNewScan() { <-r.scanSema - r.cache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, - } + r.cache = NewDirInfoCache() r.walked = false r.scanSema <- struct{}{} } diff --git a/internal/imports/mod.go b/internal/imports/mod.go index c8a040c08c0..ab25b6aabad 100644 --- a/internal/imports/mod.go +++ b/internal/imports/mod.go @@ -82,11 +82,11 @@ type ModuleResolver struct { // // otherCache stores information about all other roots (even GOROOT), which // may change. - moduleCacheCache *dirInfoCache - otherCache *dirInfoCache + moduleCacheCache *DirInfoCache + otherCache *DirInfoCache } -func newModuleResolver(e *ProcessEnv) (*ModuleResolver, error) { +func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleResolver, error) { r := &ModuleResolver{ env: e, scanSema: make(chan struct{}, 1), @@ -196,18 +196,22 @@ func newModuleResolver(e *ProcessEnv) (*ModuleResolver, error) { addDep(mod) } } + // If provided, share the moduleCacheCache. + // + // TODO(rfindley): The module cache is immutable. However, the loaded + // exports do depend on GOOS and GOARCH. Fortunately, the + // ProcessEnv.buildContext does not adjust these from build.DefaultContext + // (even though it should). So for now, this is OK to share, but we need to + // add logic for handling GOOS/GOARCH. + r.moduleCacheCache = moduleCacheCache r.roots = append(r.roots, gopathwalk.Root{Path: r.moduleCacheDir, Type: gopathwalk.RootModuleCache}) } r.scannedRoots = map[gopathwalk.Root]bool{} - r.moduleCacheCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, - } - r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, + if r.moduleCacheCache == nil { + r.moduleCacheCache = NewDirInfoCache() } + r.otherCache = NewDirInfoCache() return r, nil } @@ -263,11 +267,22 @@ func (r *ModuleResolver) initAllMods() error { // contents, since they are assumed to be immutable. func (r *ModuleResolver) ClearForNewScan() { <-r.scanSema + prevRoots := r.scannedRoots r.scannedRoots = map[gopathwalk.Root]bool{} - r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - listeners: map[*int]cacheListener{}, + // Invalidate root scans. We don't need to invalidate module cache roots, + // because they are immutable. + // (We don't support a use case where GOMODCACHE is cleaned in the middle of + // e.g. a gopls session: the user must restart gopls to get accurate + // imports.) + // + // Scanning for new directories in GOMODCACHE should be handled elsewhere, + // via a call to ScanModuleCache. + for _, root := range r.roots { + if root.Type == gopathwalk.RootModuleCache && prevRoots[root] { + r.scannedRoots[root] = true + } } + r.otherCache = NewDirInfoCache() r.scanSema <- struct{}{} } @@ -282,7 +297,7 @@ func (r *ModuleResolver) ClearForNewScan() { // TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods. func (e *ProcessEnv) ClearModuleInfo() { if r, ok := e.resolver.(*ModuleResolver); ok { - resolver, resolverErr := newModuleResolver(e) + resolver, resolverErr := newModuleResolver(e, e.ModCache) if resolverErr == nil { <-r.scanSema // guards caches resolver.moduleCacheCache = r.moduleCacheCache @@ -294,8 +309,9 @@ func (e *ProcessEnv) ClearModuleInfo() { } } -// findPackage returns the module and directory that contains the package at -// the given import path, or returns nil, "" if no module is in scope. +// findPackage returns the module and directory from within the main modules +// and their dependencies that contains the package at the given import path, +// or returns nil, "" if no module is in scope. func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, string) { // This can't find packages in the stdlib, but that's harmless for all // the existing code paths. @@ -429,15 +445,15 @@ func (r *ModuleResolver) dirIsNestedModule(dir string, mod *gocommand.ModuleJSON return modDir != mod.Dir } -func (r *ModuleResolver) modInfo(dir string) (modDir string, modName string) { - readModName := func(modFile string) string { - modBytes, err := os.ReadFile(modFile) - if err != nil { - return "" - } - return modulePath(modBytes) +func readModName(modFile string) string { + modBytes, err := os.ReadFile(modFile) + if err != nil { + return "" } + return modulePath(modBytes) +} +func (r *ModuleResolver) modInfo(dir string) (modDir, modName string) { if r.dirInModuleCache(dir) { if matches := modCacheRegexp.FindStringSubmatch(dir); len(matches) == 3 { index := strings.Index(dir, matches[1]+"@"+matches[2]) @@ -473,6 +489,7 @@ func (r *ModuleResolver) dirInModuleCache(dir string) bool { func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { names := map[string]string{} for _, path := range importPaths { + // TODO(rfindley): shouldn't this use the dirInfoCache? _, packageDir := r.findPackage(path) if packageDir == "" { continue diff --git a/internal/imports/mod_cache.go b/internal/imports/mod_cache.go index 03b1926d2e5..cfc54657656 100644 --- a/internal/imports/mod_cache.go +++ b/internal/imports/mod_cache.go @@ -7,8 +7,12 @@ package imports import ( "context" "fmt" + "path" + "path/filepath" + "strings" "sync" + "golang.org/x/mod/module" "golang.org/x/tools/internal/gopathwalk" ) @@ -65,6 +69,10 @@ type directoryPackageInfo struct { packageName string // the package name, as declared in the source. // Set when status >= exportsLoaded. + // TODO(rfindley): it's hard to see this, but exports depend implicitly on + // the default build context GOOS and GOARCH. + // + // We can make this explicit, and key exports by GOOS, GOARCH. exports []string } @@ -80,7 +88,7 @@ func (info *directoryPackageInfo) reachedStatus(target directoryPackageStatus) ( return true, nil } -// dirInfoCache is a concurrency safe map for storing information about +// DirInfoCache is a concurrency-safe map for storing information about // directories that may contain packages. // // The information in this cache is built incrementally. Entries are initialized in scan. @@ -93,21 +101,26 @@ func (info *directoryPackageInfo) reachedStatus(target directoryPackageStatus) ( // The information in the cache is not expected to change for the cache's // lifetime, so there is no protection against competing writes. Users should // take care not to hold the cache across changes to the underlying files. -// -// TODO(suzmue): consider other concurrency strategies and data structures (RWLocks, sync.Map, etc) -type dirInfoCache struct { +type DirInfoCache struct { mu sync.Mutex // dirs stores information about packages in directories, keyed by absolute path. dirs map[string]*directoryPackageInfo listeners map[*int]cacheListener } +func NewDirInfoCache() *DirInfoCache { + return &DirInfoCache{ + dirs: make(map[string]*directoryPackageInfo), + listeners: make(map[*int]cacheListener), + } +} + type cacheListener func(directoryPackageInfo) // ScanAndListen calls listener on all the items in the cache, and on anything // newly added. The returned stop function waits for all in-flight callbacks to // finish and blocks new ones. -func (d *dirInfoCache) ScanAndListen(ctx context.Context, listener cacheListener) func() { +func (d *DirInfoCache) ScanAndListen(ctx context.Context, listener cacheListener) func() { ctx, cancel := context.WithCancel(ctx) // Flushing out all the callbacks is tricky without knowing how many there @@ -163,8 +176,10 @@ func (d *dirInfoCache) ScanAndListen(ctx context.Context, listener cacheListener } // Store stores the package info for dir. -func (d *dirInfoCache) Store(dir string, info directoryPackageInfo) { +func (d *DirInfoCache) Store(dir string, info directoryPackageInfo) { d.mu.Lock() + // TODO(rfindley, golang/go#59216): should we overwrite an existing entry? + // That seems incorrect as the cache should be idempotent. _, old := d.dirs[dir] d.dirs[dir] = &info var listeners []cacheListener @@ -181,7 +196,7 @@ func (d *dirInfoCache) Store(dir string, info directoryPackageInfo) { } // Load returns a copy of the directoryPackageInfo for absolute directory dir. -func (d *dirInfoCache) Load(dir string) (directoryPackageInfo, bool) { +func (d *DirInfoCache) Load(dir string) (directoryPackageInfo, bool) { d.mu.Lock() defer d.mu.Unlock() info, ok := d.dirs[dir] @@ -192,7 +207,7 @@ func (d *dirInfoCache) Load(dir string) (directoryPackageInfo, bool) { } // Keys returns the keys currently present in d. -func (d *dirInfoCache) Keys() (keys []string) { +func (d *DirInfoCache) Keys() (keys []string) { d.mu.Lock() defer d.mu.Unlock() for key := range d.dirs { @@ -201,7 +216,7 @@ func (d *dirInfoCache) Keys() (keys []string) { return keys } -func (d *dirInfoCache) CachePackageName(info directoryPackageInfo) (string, error) { +func (d *DirInfoCache) CachePackageName(info directoryPackageInfo) (string, error) { if loaded, err := info.reachedStatus(nameLoaded); loaded { return info.packageName, err } @@ -214,7 +229,7 @@ func (d *dirInfoCache) CachePackageName(info directoryPackageInfo) (string, erro return info.packageName, info.err } -func (d *dirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { +func (d *DirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { if reached, _ := info.reachedStatus(exportsLoaded); reached { return info.packageName, info.exports, info.err } @@ -235,3 +250,81 @@ func (d *dirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info d d.Store(info.dir, info) return info.packageName, info.exports, info.err } + +// ScanModuleCache walks the given directory, which must be a GOMODCACHE value, +// for directory package information, storing the results in cache. +func ScanModuleCache(dir string, cache *DirInfoCache, logf func(string, ...any)) { + // Note(rfindley): it's hard to see, but this function attempts to implement + // just the side effects on cache of calling PrimeCache with a ProcessEnv + // that has the given dir as its GOMODCACHE. + // + // Teasing out the control flow, we see that we can avoid any handling of + // vendor/ and can infer module info entirely from the path, simplifying the + // logic here. + + root := gopathwalk.Root{ + Path: filepath.Clean(dir), + Type: gopathwalk.RootModuleCache, + } + + directoryInfo := func(root gopathwalk.Root, dir string) directoryPackageInfo { + // This is a copy of ModuleResolver.scanDirForPackage, trimmed down to + // logic that applies to a module cache directory. + + subdir := "" + if dir != root.Path { + subdir = dir[len(root.Path)+len("/"):] + } + + matches := modCacheRegexp.FindStringSubmatch(subdir) + if len(matches) == 0 { + return directoryPackageInfo{ + status: directoryScanned, + err: fmt.Errorf("invalid module cache path: %v", subdir), + } + } + modPath, err := module.UnescapePath(filepath.ToSlash(matches[1])) + if err != nil { + if logf != nil { + logf("decoding module cache path %q: %v", subdir, err) + } + return directoryPackageInfo{ + status: directoryScanned, + err: fmt.Errorf("decoding module cache path %q: %v", subdir, err), + } + } + importPath := path.Join(modPath, filepath.ToSlash(matches[3])) + index := strings.Index(dir, matches[1]+"@"+matches[2]) + modDir := filepath.Join(dir[:index], matches[1]+"@"+matches[2]) + modName := readModName(filepath.Join(modDir, "go.mod")) + return directoryPackageInfo{ + status: directoryScanned, + dir: dir, + rootType: root.Type, + nonCanonicalImportPath: importPath, + moduleDir: modDir, + moduleName: modName, + } + } + + add := func(root gopathwalk.Root, dir string) { + info := directoryInfo(root, dir) + cache.Store(info.dir, info) + } + + skip := func(_ gopathwalk.Root, dir string) bool { + // Skip directories that have already been scanned. + // + // Note that gopathwalk only adds "package" directories, which must contain + // a .go file, and all such package directories in the module cache are + // immutable. So if we can load a dir, it can be skipped. + info, ok := cache.Load(dir) + if !ok { + return false + } + packageScanned, _ := info.reachedStatus(directoryScanned) + return packageScanned + } + + gopathwalk.WalkSkip([]gopathwalk.Root{root}, add, skip, gopathwalk.Options{Logf: logf, ModulesEnabled: true}) +} diff --git a/internal/imports/mod_cache_test.go b/internal/imports/mod_cache_test.go index 39c691e5330..3af85fb7f56 100644 --- a/internal/imports/mod_cache_test.go +++ b/internal/imports/mod_cache_test.go @@ -6,9 +6,12 @@ package imports import ( "fmt" + "os/exec" "reflect" "sort" + "strings" "testing" + "time" ) func TestDirectoryPackageInfoReachedStatus(t *testing.T) { @@ -58,9 +61,7 @@ func TestDirectoryPackageInfoReachedStatus(t *testing.T) { } func TestModCacheInfo(t *testing.T) { - m := &dirInfoCache{ - dirs: make(map[string]*directoryPackageInfo), - } + m := NewDirInfoCache() dirInfo := []struct { dir string @@ -124,3 +125,20 @@ func TestModCacheInfo(t *testing.T) { } } } + +func BenchmarkScanModuleCache(b *testing.B) { + output, err := exec.Command("go", "env", "GOMODCACHE").Output() + if err != nil { + b.Fatal(err) + } + gomodcache := strings.TrimSpace(string(output)) + cache := NewDirInfoCache() + start := time.Now() + ScanModuleCache(gomodcache, cache, nil) + b.Logf("initial scan took %v", time.Since(start)) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + ScanModuleCache(gomodcache, cache, nil) + } +} From 6d4ccf2ad683b5263e582762e1c41de6d0572e4f Mon Sep 17 00:00:00 2001 From: Robert Findley <rfindley@google.com> Date: Sun, 4 Feb 2024 20:06:06 -0500 Subject: [PATCH 102/105] gopls/internal/cache: prime goimports cache asynchronously Gopls' refresh of the goimports resolver already introduces non-determinism into imports operations: gopls does not observe changes until the asynchronous refresh occurs. This change allows operations to continue to run on the stale resolver until a new resolver is ready. Due to inherent raciness, it's hard to benchmark the impact of this change: one would have to catch gopls during a refresh, which occurs at an automatically adjusted pacing. Also update TODOs. Fixes golang/go#59216 Change-Id: I303df998d804c9a1cd1c0e307872d1d271eed601 Reviewed-on: https://go-review.googlesource.com/c/tools/+/561235 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> --- gopls/internal/cache/imports.go | 20 +++++----- internal/imports/fix.go | 29 ++++++++------ internal/imports/mod.go | 71 +++++++++++++++++++++++---------- internal/imports/mod_test.go | 4 +- 4 files changed, 78 insertions(+), 46 deletions(-) diff --git a/gopls/internal/cache/imports.go b/gopls/internal/cache/imports.go index cfba5626dee..7964427e528 100644 --- a/gopls/internal/cache/imports.go +++ b/gopls/internal/cache/imports.go @@ -207,21 +207,23 @@ func (s *importsState) refreshProcessEnv() { start := time.Now() s.mu.Lock() - env := s.processEnv - if resolver, err := s.processEnv.GetResolver(); err == nil { - resolver.ClearForNewScan() - } - // TODO(rfindley): it's not clear why we're unlocking here. Shouldn't we - // guard the use of env below? In any case, we can prime a separate resolver. + resolver, err := s.processEnv.GetResolver() s.mu.Unlock() + if err != nil { + return + } event.Log(s.ctx, "background imports cache refresh starting") - // TODO(rfindley, golang/go#59216): do this priming with a separate resolver, - // and then replace, so that we never have to wait on an unprimed cache. - if err := imports.PrimeCache(context.Background(), env); err == nil { + // Prime the new resolver before updating the processEnv, so that gopls + // doesn't wait on an unprimed cache. + if err := imports.PrimeCache(context.Background(), resolver); err == nil { event.Log(ctx, fmt.Sprintf("background refresh finished after %v", time.Since(start))) } else { event.Log(ctx, fmt.Sprintf("background refresh finished after %v", time.Since(start)), keys.Err.Of(err)) } + + s.mu.Lock() + s.processEnv.UpdateResolver(resolver) + s.mu.Unlock() } diff --git a/internal/imports/fix.go b/internal/imports/fix.go index 606d6a54287..6a18f63a44d 100644 --- a/internal/imports/fix.go +++ b/internal/imports/fix.go @@ -701,20 +701,21 @@ func ScoreImportPaths(ctx context.Context, env *ProcessEnv, paths []string) (map return result, nil } -func PrimeCache(ctx context.Context, env *ProcessEnv) error { +func PrimeCache(ctx context.Context, resolver Resolver) error { // Fully scan the disk for directories, but don't actually read any Go files. callback := &scanCallback{ - rootFound: func(gopathwalk.Root) bool { - return true + rootFound: func(root gopathwalk.Root) bool { + // See getCandidatePkgs: walking GOROOT is apparently expensive and + // unnecessary. + return root.Type != gopathwalk.RootGOROOT }, dirFound: func(pkg *pkg) bool { return false }, - packageNameLoaded: func(pkg *pkg) bool { - return false - }, + // packageNameLoaded and exportsLoaded must never be called. } - return getCandidatePkgs(ctx, callback, "", "", env) + + return resolver.scan(ctx, callback) } func candidateImportName(pkg *pkg) string { @@ -1089,7 +1090,12 @@ type Resolver interface { // scoreImportPath returns the relevance for an import path. scoreImportPath(ctx context.Context, path string) float64 - ClearForNewScan() + // ClearForNewScan returns a new Resolver based on the receiver that has + // cleared its internal caches of directory contents. + // + // The new resolver should be primed and then set via + // [ProcessEnv.UpdateResolver]. + ClearForNewScan() Resolver } // A scanCallback controls a call to scan and receives its results. @@ -1270,11 +1276,8 @@ func newGopathResolver(env *ProcessEnv) *gopathResolver { return r } -func (r *gopathResolver) ClearForNewScan() { - <-r.scanSema - r.cache = NewDirInfoCache() - r.walked = false - r.scanSema <- struct{}{} +func (r *gopathResolver) ClearForNewScan() Resolver { + return newGopathResolver(r.env) } func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { diff --git a/internal/imports/mod.go b/internal/imports/mod.go index ab25b6aabad..3d0f38f6c23 100644 --- a/internal/imports/mod.go +++ b/internal/imports/mod.go @@ -30,16 +30,11 @@ import ( // both caused by populating the cache, albeit in slightly different ways. // // A high level list of TODOs: -// - Write an additional benchmark for refreshing the directory state. -// - Split scanning the module cache from other ModuleResolver functionality, -// as it is the source of performance woes (and inconsistency). -// - Allow sharing module cache state across multiple ModuleResolvers. // - Optimize the scan itself, as there is some redundancy statting and // reading go.mod files. -// - Make it possible to reuse the current state while running a refresh in -// the background. -// - Fix context cancellation (again): if the context is cancelled while a -// root is being walked, nothing stops that ongoing walk. +// - Invert the relationship between ProcessEnv and Resolver (see the +// docstring of ProcessEnv). +// - Make it easier to use an external resolver implementation. // // Smaller TODOs are annotated in the code below. @@ -72,7 +67,11 @@ type ModuleResolver struct { modsByDir []*gocommand.ModuleJSON // ...or by the number of path components in their Dir. // Scanning state, populated by scan - scanSema chan struct{} // prevents concurrent scans and guards scannedRoots + + // scanSema prevents concurrent scans, and guards scannedRoots and the cache + // fields below (though the caches themselves are concurrency safe). + // Receive to acquire, send to release. + scanSema chan struct{} scannedRoots map[gopathwalk.Root]bool // if true, root has been walked // Caches of directory info, populated by scans and scan callbacks @@ -86,12 +85,16 @@ type ModuleResolver struct { otherCache *DirInfoCache } +// newModuleResolver returns a new module-aware goimports resolver. +// +// Note: use caution when modifying this constructor: changes must also be +// reflected in ModuleResolver.ClearForNewScan. func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleResolver, error) { r := &ModuleResolver{ env: e, scanSema: make(chan struct{}, 1), } - r.scanSema <- struct{}{} + r.scanSema <- struct{}{} // release goenv, err := r.env.goEnv() if err != nil { @@ -265,10 +268,23 @@ func (r *ModuleResolver) initAllMods() error { // It preserves the set of roots, but forgets about the set of directories. // Though it forgets the set of module cache directories, it remembers their // contents, since they are assumed to be immutable. -func (r *ModuleResolver) ClearForNewScan() { - <-r.scanSema - prevRoots := r.scannedRoots - r.scannedRoots = map[gopathwalk.Root]bool{} +func (r *ModuleResolver) ClearForNewScan() Resolver { + <-r.scanSema // acquire r, to guard scannedRoots + r2 := &ModuleResolver{ + env: r.env, + dummyVendorMod: r.dummyVendorMod, + moduleCacheDir: r.moduleCacheDir, + roots: r.roots, + mains: r.mains, + mainByDir: r.mainByDir, + modsByModPath: r.modsByModPath, + + scanSema: make(chan struct{}, 1), + scannedRoots: make(map[gopathwalk.Root]bool), + otherCache: NewDirInfoCache(), + moduleCacheCache: r.moduleCacheCache, + } + r2.scanSema <- struct{}{} // r2 must start released // Invalidate root scans. We don't need to invalidate module cache roots, // because they are immutable. // (We don't support a use case where GOMODCACHE is cleaned in the middle of @@ -278,12 +294,12 @@ func (r *ModuleResolver) ClearForNewScan() { // Scanning for new directories in GOMODCACHE should be handled elsewhere, // via a call to ScanModuleCache. for _, root := range r.roots { - if root.Type == gopathwalk.RootModuleCache && prevRoots[root] { - r.scannedRoots[root] = true + if root.Type == gopathwalk.RootModuleCache && r.scannedRoots[root] { + r2.scannedRoots[root] = true } } - r.otherCache = NewDirInfoCache() - r.scanSema <- struct{}{} + r.scanSema <- struct{}{} // release r + return r2 } // ClearModuleInfo invalidates resolver state that depends on go.mod file @@ -299,16 +315,27 @@ func (e *ProcessEnv) ClearModuleInfo() { if r, ok := e.resolver.(*ModuleResolver); ok { resolver, resolverErr := newModuleResolver(e, e.ModCache) if resolverErr == nil { - <-r.scanSema // guards caches + <-r.scanSema // acquire (guards caches) resolver.moduleCacheCache = r.moduleCacheCache resolver.otherCache = r.otherCache - r.scanSema <- struct{}{} + r.scanSema <- struct{}{} // release } e.resolver = resolver e.resolverErr = resolverErr } } +// UpdateResolver sets the resolver for the ProcessEnv to use in imports +// operations. Only for use with the result of [Resolver.ClearForNewScan]. +// +// TODO(rfindley): this awkward API is a result of the (arguably) inverted +// relationship between configuration and state described in the doc comment +// for [ProcessEnv]. +func (e *ProcessEnv) UpdateResolver(r Resolver) { + e.resolver = r + e.resolverErr = nil +} + // findPackage returns the module and directory from within the main modules // and their dependencies that contains the package at the given import path, // or returns nil, "" if no module is in scope. @@ -580,9 +607,9 @@ func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error select { case <-ctx.Done(): return - case <-r.scanSema: + case <-r.scanSema: // acquire } - defer func() { r.scanSema <- struct{}{} }() + defer func() { r.scanSema <- struct{}{} }() // release // We have the lock on r.scannedRoots, and no other scans can run. for _, root := range roots { if ctx.Err() != nil { diff --git a/internal/imports/mod_test.go b/internal/imports/mod_test.go index e58b51e181f..c624463895d 100644 --- a/internal/imports/mod_test.go +++ b/internal/imports/mod_test.go @@ -244,7 +244,7 @@ import _ "rsc.io/sampler" // Clear out the resolver's cache, since we've changed the environment. mt.env.Env["GOFLAGS"] = "-mod=vendor" mt.env.ClearModuleInfo() - mt.env.resolver.ClearForNewScan() + mt.env.UpdateResolver(mt.env.resolver.ClearForNewScan()) mt.assertModuleFoundInDir("rsc.io/sampler", "sampler", `/vendor/`) } @@ -1314,7 +1314,7 @@ func BenchmarkModuleResolver_RescanModCache(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { scanToSlice(resolver, exclude) - resolver.(*ModuleResolver).ClearForNewScan() + resolver = resolver.ClearForNewScan() } } From 37586e4e301210feefec1b2369023ed0526afb60 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 16:47:20 -0500 Subject: [PATCH 103/105] internal/apidiff: audit for types.Alias safety Updates golang/go#65294 Change-Id: I0767c09e277a2225657dcf87e7b41d664c9da1bb Reviewed-on: https://go-review.googlesource.com/c/tools/+/559935 Reviewed-by: Jonathan Amsterdam <jba@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- internal/apidiff/apidiff.go | 4 +++- internal/apidiff/compatibility.go | 14 +++++++++----- internal/apidiff/correspondence.go | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/internal/apidiff/apidiff.go b/internal/apidiff/apidiff.go index 873ee85fbc4..087e112e599 100644 --- a/internal/apidiff/apidiff.go +++ b/internal/apidiff/apidiff.go @@ -19,6 +19,8 @@ import ( "go/constant" "go/token" "go/types" + + "golang.org/x/tools/internal/aliases" ) // Changes reports on the differences between the APIs of the old and new packages. @@ -206,7 +208,7 @@ func (d *differ) typeChanged(obj types.Object, part string, old, new types.Type) // Since these can change without affecting compatibility, we don't want users to // be distracted by them, so we remove them. func removeNamesFromSignature(t types.Type) types.Type { - sig, ok := t.(*types.Signature) + sig, ok := aliases.Unalias(t).(*types.Signature) if !ok { return t } diff --git a/internal/apidiff/compatibility.go b/internal/apidiff/compatibility.go index 2e327485b52..0d2d2b34575 100644 --- a/internal/apidiff/compatibility.go +++ b/internal/apidiff/compatibility.go @@ -8,9 +8,13 @@ import ( "fmt" "go/types" "reflect" + + "golang.org/x/tools/internal/aliases" ) func (d *differ) checkCompatible(otn *types.TypeName, old, new types.Type) { + old = aliases.Unalias(old) + new = aliases.Unalias(new) switch old := old.(type) { case *types.Interface: if new, ok := new.(*types.Interface); ok { @@ -268,7 +272,7 @@ func (d *differ) checkCompatibleDefined(otn *types.TypeName, old *types.Named, n return } // Interface method sets are checked in checkCompatibleInterface. - if _, ok := old.Underlying().(*types.Interface); ok { + if types.IsInterface(old) { return } @@ -287,7 +291,7 @@ func (d *differ) checkMethodSet(otn *types.TypeName, oldt, newt types.Type, addc oldMethodSet := exportedMethods(oldt) newMethodSet := exportedMethods(newt) msname := otn.Name() - if _, ok := oldt.(*types.Pointer); ok { + if _, ok := aliases.Unalias(oldt).(*types.Pointer); ok { msname = "*" + msname } for name, oldMethod := range oldMethodSet { @@ -349,9 +353,9 @@ func receiverType(method types.Object) types.Type { } func receiverNamedType(method types.Object) *types.Named { - switch t := receiverType(method).(type) { + switch t := aliases.Unalias(receiverType(method)).(type) { case *types.Pointer: - return t.Elem().(*types.Named) + return aliases.Unalias(t.Elem()).(*types.Named) case *types.Named: return t default: @@ -360,6 +364,6 @@ func receiverNamedType(method types.Object) *types.Named { } func hasPointerReceiver(method types.Object) bool { - _, ok := receiverType(method).(*types.Pointer) + _, ok := aliases.Unalias(receiverType(method)).(*types.Pointer) return ok } diff --git a/internal/apidiff/correspondence.go b/internal/apidiff/correspondence.go index 0d7b4c5a5f1..dd2f5178173 100644 --- a/internal/apidiff/correspondence.go +++ b/internal/apidiff/correspondence.go @@ -7,6 +7,8 @@ package apidiff import ( "go/types" "sort" + + "golang.org/x/tools/internal/aliases" ) // Two types are correspond if they are identical except for defined types, @@ -31,6 +33,8 @@ func (d *differ) correspond(old, new types.Type) bool { // Compare this to the implementation of go/types.Identical. func (d *differ) corr(old, new types.Type, p *ifacePair) bool { // Structure copied from types.Identical. + old = aliases.Unalias(old) + new = aliases.Unalias(new) switch old := old.(type) { case *types.Basic: return types.Identical(old, new) From 08393e0666920d3d69dacb476ec52ecd41cb1989 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 16:52:06 -0500 Subject: [PATCH 104/105] cmd/deadcode: audit for types.Alias safety Updates golang/go#65294 Change-Id: Ica0197fd5d931244079fdf5b8c29f1bfeed5083b Reviewed-on: https://go-review.googlesource.com/c/tools/+/559936 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- cmd/deadcode/deadcode.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/deadcode/deadcode.go b/cmd/deadcode/deadcode.go index 49f34ca4d62..8ee439b06d0 100644 --- a/cmd/deadcode/deadcode.go +++ b/cmd/deadcode/deadcode.go @@ -33,6 +33,7 @@ import ( "golang.org/x/tools/go/packages" "golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/internal/aliases" ) //go:embed doc.go @@ -385,10 +386,10 @@ func prettyName(fn *ssa.Function, qualified bool) string { // method receiver? if recv := fn.Signature.Recv(); recv != nil { t := recv.Type() - if ptr, ok := t.(*types.Pointer); ok { + if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok { t = ptr.Elem() } - buf.WriteString(t.(*types.Named).Obj().Name()) + buf.WriteString(aliases.Unalias(t).(*types.Named).Obj().Name()) buf.WriteByte('.') } From a297bfd9847df3a44ed5943003c8e4acf197b066 Mon Sep 17 00:00:00 2001 From: Alan Donovan <adonovan@google.com> Date: Wed, 31 Jan 2024 17:04:03 -0500 Subject: [PATCH 105/105] go/callgraph/rta: audit for types.Alias safety Updates golang/go#65294 Change-Id: I90fe0cc3ab5a6171e112e2eb0e452efb172d9980 Reviewed-on: https://go-review.googlesource.com/c/tools/+/559937 Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> --- go/callgraph/rta/rta.go | 9 ++++++++- go/callgraph/rta/rta_test.go | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/go/callgraph/rta/rta.go b/go/callgraph/rta/rta.go index d0ae0fccf57..72b383dabe7 100644 --- a/go/callgraph/rta/rta.go +++ b/go/callgraph/rta/rta.go @@ -45,6 +45,7 @@ import ( "golang.org/x/tools/go/callgraph" "golang.org/x/tools/go/ssa" "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/internal/aliases" "golang.org/x/tools/internal/compat" ) @@ -416,6 +417,9 @@ func (r *rta) implementations(I *types.Interface) []types.Type { // dynamic type of some interface or reflect.Value. // Adapted from needMethods in go/ssa/builder.go func (r *rta) addRuntimeType(T types.Type, skip bool) { + // Never record aliases. + T = aliases.Unalias(T) + if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok { if skip && !prev { r.result.RuntimeTypes.Set(T, skip) @@ -457,7 +461,7 @@ func (r *rta) addRuntimeType(T types.Type, skip bool) { case *types.Named: n = T case *types.Pointer: - n, _ = T.Elem().(*types.Named) + n, _ = aliases.Unalias(T.Elem()).(*types.Named) } if n != nil { owner := n.Obj().Pkg() @@ -476,6 +480,9 @@ func (r *rta) addRuntimeType(T types.Type, skip bool) { } switch t := T.(type) { + case *aliases.Alias: + panic("unreachable") + case *types.Basic: // nop diff --git a/go/callgraph/rta/rta_test.go b/go/callgraph/rta/rta_test.go index a855dd6d369..8552dc7b13c 100644 --- a/go/callgraph/rta/rta_test.go +++ b/go/callgraph/rta/rta_test.go @@ -23,6 +23,7 @@ import ( "golang.org/x/tools/go/loader" "golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/internal/aliases" ) // TestRTA runs RTA on each testdata/*.go file and compares the @@ -200,7 +201,7 @@ func check(t *testing.T, f *ast.File, pkg *ssa.Package, res *rta.Result) { got := make(stringset) res.RuntimeTypes.Iterate(func(key types.Type, value interface{}) { if !value.(bool) { // accessible to reflection - typ := types.TypeString(key, types.RelativeTo(pkg.Pkg)) + typ := types.TypeString(aliases.Unalias(key), types.RelativeTo(pkg.Pkg)) got[typ] = true } })