From f584396aa868749cbc63fadc6c8e78291f7ab571 Mon Sep 17 00:00:00 2001 From: Andy Williams <> Date: Sun, 19 Feb 2023 17:53:42 +0000 Subject: [PATCH 01/43] Expose (and use) desktop root window --- desk.go | 1 + internal/ui/desk.go | 6 +++++- internal/ui/notifications.go | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/desk.go b/desk.go index 1d30348e..2758eab3 100644 --- a/desk.go +++ b/desk.go @@ -17,6 +17,7 @@ type Desktop interface { AddShortcut(shortcut *Shortcut, handler func()) ShowMenuAt(menu *fyne.Menu, pos fyne.Position) + Root() fyne.Window Desktop() int SetDesktop(int) diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 75898dee..9dfc8bf0 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -80,6 +80,10 @@ func (l *desktop) MinSize(_ []fyne.CanvasObject) fyne.Size { return fyne.NewSize(640, 480) // tiny - window manager will scale up to screen size } +func (l *desktop) Root() fyne.Window { + return l.root +} + func (l *desktop) ShowMenuAt(menu *fyne.Menu, pos fyne.Position) { l.showMenu(menu, pos) } @@ -157,7 +161,7 @@ func (l *desktop) ContentBoundsPixels(screen *fynedesk.Screen) (x, y, w, h uint3 screenW := uint32(screen.Width) screenH := uint32(screen.Height) pad := wmtheme.WidgetPanelWidth - if fynedesk.Instance().Settings().NarrowWidgetPanel() { + if l.Settings().NarrowWidgetPanel() { pad = wmtheme.NarrowBarWidth } if l.screens.Primary() == screen { diff --git a/internal/ui/notifications.go b/internal/ui/notifications.go index a907ca75..27058fd2 100644 --- a/internal/ui/notifications.go +++ b/internal/ui/notifications.go @@ -33,7 +33,7 @@ func (n *notification) show(list *fyne.Container) { n.popup = fyne.CurrentApp().Driver().(deskDriver.Driver).CreateSplashWindow() n.popup.SetContent(n.renderer) - winSize := fynedesk.Instance().(*desktop).root.Canvas().Size() + winSize := fynedesk.Instance().Root().Canvas().Size() pos := fyne.NewPos(winSize.Width-280-wmtheme.NarrowBarWidth, 10) fynedesk.Instance().WindowManager().ShowOverlay(n.popup, fyne.NewSize(270, 120), pos) } else { From 65c9ecd07be2adde218f649d73832e4abac965f5 Mon Sep 17 00:00:00 2001 From: Andy Williams <> Date: Sun, 19 Feb 2023 17:54:41 +0000 Subject: [PATCH 02/43] First pass incorporating Fyles to a desktop files module --- cmd/fynedesk/main.go | 1 + go.mod | 2 + go.sum | 18 ++- modules/fyles/fyles.go | 76 ++++++++++ modules/fyles/init.go | 7 + vendor/github.com/fyshos/fyles/AUTHORS | 1 + vendor/github.com/fyshos/fyles/LICENSE | 28 ++++ .../fyshos/fyles/pkg/fyles/fylespanel.go | 57 ++++++++ .../github.com/fyshos/fyles/pkg/fyles/item.go | 134 ++++++++++++++++++ vendor/modules.txt | 4 + 10 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 modules/fyles/fyles.go create mode 100644 modules/fyles/init.go create mode 100644 vendor/github.com/fyshos/fyles/AUTHORS create mode 100644 vendor/github.com/fyshos/fyles/LICENSE create mode 100644 vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go create mode 100644 vendor/github.com/fyshos/fyles/pkg/fyles/item.go diff --git a/cmd/fynedesk/main.go b/cmd/fynedesk/main.go index 0b5d3b88..2a7a119f 100644 --- a/cmd/fynedesk/main.go +++ b/cmd/fynedesk/main.go @@ -6,6 +6,7 @@ import ( _ "fyshos.com/fynedesk/modules/composit" _ "fyshos.com/fynedesk/modules/desktops" + _ "fyshos.com/fynedesk/modules/fyles" _ "fyshos.com/fynedesk/modules/launcher" _ "fyshos.com/fynedesk/modules/status" _ "fyshos.com/fynedesk/modules/systray" diff --git a/go.mod b/go.mod index b07dfed6..512bb8d3 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,13 @@ require ( github.com/Knetic/govaluate v3.0.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 + github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 github.com/godbus/dbus/v5 v5.1.0 github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/stretchr/testify v1.8.0 + golang.org/x/sys v0.0.0-20220412211240-33da011f77ad howett.net/plist v0.0.0-20181124034731-591f970eefbb ) diff --git a/go.sum b/go.sum index bd83639b..7820fa18 100644 --- a/go.sum +++ b/go.sum @@ -37,10 +37,15 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +fyne.io/fyne/v2 v2.2.4/go.mod h1:MBoGuHzLLSXdQOWFAwWhIhYTEMp33zqtGCReSWhaQTA= +fyne.io/fyne/v2 v2.3.0/go.mod h1:odfJmbFnODiKn1MXdL44JR6CK+0v8lrmgdPlrUF6w0M= fyne.io/fyne/v2 v2.3.1-0.20230101220108-f2141a6796a0 h1:Tfk5ZnTErWDL51BgGxrYyuCZtb5Xyk7o6OVLzvRly/0= fyne.io/fyne/v2 v2.3.1-0.20230101220108-f2141a6796a0/go.mod h1:odfJmbFnODiKn1MXdL44JR6CK+0v8lrmgdPlrUF6w0M= +fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= fyne.io/systray v1.10.1-0.20221115204952-d16a6177e6f1 h1:OiHw+bZAGEaSreHsA8dDkBOVJmSFzsNTOc/htpM+fOc= fyne.io/systray v1.10.1-0.20221115204952-d16a6177e6f1/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= +fyne.io/x/fyne v0.0.0-20230128220048-43a1c4cd1ed8/go.mod h1:tInTkLEiYNhEYq8s4UbnpINBg/W6mqU0ArbuuJszd3s= +github.com/Andrew-M-C/go.jsonvalue v1.1.2-0.20211223013816-e873b56b4a84/go.mod h1:oTJGG91FhtsxvUFVwHSvr6zuaTcAuroj/ToxfT7Ox8U= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= @@ -81,6 +86,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -89,6 +95,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8= github.com/fredbi/uri v0.1.0 h1:8XBBD74STBLcWJ5smjEkKCZivSxSKMhFB0FbQUKeNyM= github.com/fredbi/uri v0.1.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -98,12 +105,13 @@ github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe h1:A/wiwvQ0CAjPkuJyt github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 h1:+31CdF/okdokeFNoy9L/2PccG3JFidQT3ev64/r4pYU= github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E= -github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 h1:hnLq+55b7Zh7/2IRzWCpiTcAvjv/P8ERF+N7+xXbZhk= github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= +github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 h1:tq2MoK8t6CDEm//NkJQdG05eb06rxIcYnBAKjwJLScs= +github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8/go.mod h1:yjgxR9tuDcgZRA9XWnmtSvBO691eVD+8xITuPJ+uw5M= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= @@ -111,7 +119,6 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec h1:3FLiRYO6PlQFDpUU7OEFlWgjGD1jnBIVSJ5SYRWk+9c= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -122,6 +129,7 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c h1:JGCm/+tJ9gC6THUxooTldS+CUDsba0qvkvU3DHklqW8= github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -190,6 +198,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= github.com/goxjs/glfw v0.0.0-20191126052801-d2efb5f20838/go.mod h1:oS8P8gVOT4ywTcjV6wZlOU4GuVFQ8F5328KY3MJ79CY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -290,8 +299,10 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76 h1:Ga2uagHhDeGysCixLAzH0mS2TU+CrbQavmsHUNkEEVA= github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= +github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 h1:oDMiXaTMyBEuZMU53atpxqYsSB3U1CHkeAu2zr6wTeY= github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -303,12 +314,14 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= github.com/urfave/cli/v2 v2.4.0/go.mod h1:NX9W0zmTvedE5oDoOMs2RTC8RvdK98NTYZE5LbaEYPg= +github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -402,6 +415,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go new file mode 100644 index 00000000..43df7bc6 --- /dev/null +++ b/modules/fyles/fyles.go @@ -0,0 +1,76 @@ +package fyles + +import ( + "image/color" + "log" + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/storage" + lib "github.com/fyshos/fyles/pkg/fyles" + "golang.org/x/sys/execabs" + + "fyshos.com/fynedesk" + wmtheme "fyshos.com/fynedesk/theme" +) + +var fylesMeta = fynedesk.ModuleMetadata{ + Name: "Desktop Files", + NewInstance: newFyles, +} + +type fyles struct{} + +func (f *fyles) Destroy() { +} + +func (f *fyles) ScreenAreaWidget() fyne.CanvasObject { + icons := lib.NewFylesPanel(f.tapped, fynedesk.Instance().Root()) + home, _ := os.UserHomeDir() + icons.SetDir(storage.NewFileURI(filepath.Join(home, "Desktop"))) + + desk := fynedesk.Instance() + var barPad fyne.CanvasObject + if desk.Settings().NarrowLeftLauncher() { + barPad := canvas.NewRectangle(color.Transparent) + barPad.SetMinSize(fyne.NewSize(wmtheme.NarrowBarWidth, 1)) + } + + rightIndent := wmtheme.WidgetPanelWidth + if desk.Settings().NarrowWidgetPanel() { + rightIndent = wmtheme.NarrowBarWidth + } + widgetPad := canvas.NewRectangle(color.Transparent) + widgetPad.SetMinSize(fyne.NewSize(rightIndent, 1)) + + return container.NewBorder(nil, nil, barPad, widgetPad, icons) +} + +func (f *fyles) Metadata() fynedesk.ModuleMetadata { + return fylesMeta +} + +func (f *fyles) tapped(u fyne.URI) { + p, err := execabs.LookPath("fyles") + if p != "" && err == nil { + if ok, _ := storage.CanList(u); ok { + err := execabs.Command(p, u.Path()).Start() + if err != nil { + log.Println("Error opening Fyles", err) + } + return + } + } else { + log.Println(">>> dir", u) + return + } + log.Println(">>> open", u) +} + +// newFyles creates a new module that will manage desktop file icons. +func newFyles() fynedesk.Module { + return &fyles{} +} diff --git a/modules/fyles/init.go b/modules/fyles/init.go new file mode 100644 index 00000000..6a5a876a --- /dev/null +++ b/modules/fyles/init.go @@ -0,0 +1,7 @@ +package fyles + +import "fyshos.com/fynedesk" + +func init() { + fynedesk.RegisterModule(fylesMeta) +} diff --git a/vendor/github.com/fyshos/fyles/AUTHORS b/vendor/github.com/fyshos/fyles/AUTHORS new file mode 100644 index 00000000..72ba9602 --- /dev/null +++ b/vendor/github.com/fyshos/fyles/AUTHORS @@ -0,0 +1 @@ +Andy Williams diff --git a/vendor/github.com/fyshos/fyles/LICENSE b/vendor/github.com/fyshos/fyles/LICENSE new file mode 100644 index 00000000..c6c144e7 --- /dev/null +++ b/vendor/github.com/fyshos/fyles/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (C) 2021 Fyne.io developers (see AUTHORS) +All rights reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Fyne.io nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go b/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go new file mode 100644 index 00000000..ab575fbc --- /dev/null +++ b/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go @@ -0,0 +1,57 @@ +package fyles + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type Panel struct { + widget.BaseWidget + + content *fyne.Container + cb func(fyne.URI) + win fyne.Window + current *fileItem +} + +func NewFylesPanel(c func(fyne.URI), w fyne.Window) *Panel { + fileItemMin := fyne.NewSize(fileIconCellWidth, fileIconSize+fileTextSize+theme.InnerPadding()) + + uiItems := container.NewGridWrap(fileItemMin) + p := &Panel{content: uiItems, cb: c, win: w} + p.ExtendBaseWidget(p) + return p +} + +func (p *Panel) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(p.content) +} + +func (p *Panel) SetDir(u fyne.URI) { + var items []fyne.CanvasObject + parent, err := storage.Parent(u) + if err == nil { + up := &fileItem{parent: p, name: "(Parent)", location: parent, dir: true} + up.ExtendBaseWidget(up) + items = append(items, up) + } + list, err := storage.List(u) + if err != nil { + fyne.LogError("Could not read dir", err) + } else { + for _, item := range list { + //if !ui.filter.Matches(item) { + // continue + //} + + dir, _ := storage.CanList(item) + items = append(items, newFileItem(item, dir, p)) + } + } + + p.content.Objects = items + p.content.Refresh() +} diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/item.go b/vendor/github.com/fyshos/fyles/pkg/fyles/item.go new file mode 100644 index 00000000..c68c1112 --- /dev/null +++ b/vendor/github.com/fyshos/fyles/pkg/fyles/item.go @@ -0,0 +1,134 @@ +package fyles + +import ( + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +const ( + fileIconSize = 64 + fileTextSize = 20 + fileIconCellWidth = fileIconSize * 1.25 +) + +var fileItemMin fyne.Size + +type fileItem struct { + widget.BaseWidget + parent *Panel + isCurrent bool + + name string + location fyne.URI + dir bool +} + +func (i *fileItem) Tapped(_ *fyne.PointEvent) { + if i.parent.current != nil { + i.parent.current.isCurrent = false + i.parent.current.Refresh() + } + i.isCurrent = true + i.parent.current = i + i.Refresh() + i.parent.cb(i.location) +} + +func (i *fileItem) TappedSecondary(ev *fyne.PointEvent) { + m := i.buildMenu(i.location) + widget.ShowPopUpMenuAtPosition(m, i.parent.win.Canvas(), ev.AbsolutePosition) +} + +func (i *fileItem) CreateRenderer() fyne.WidgetRenderer { + background := canvas.NewRectangle(theme.SelectionColor()) + background.Hide() + text := widget.NewLabelWithStyle(i.name, fyne.TextAlignCenter, fyne.TextStyle{}) + text.Wrapping = fyne.TextTruncate + icon := widget.NewFileIcon(i.location) + + return &fileItemRenderer{ + item: i, + background: background, + icon: icon, + text: text, + objects: []fyne.CanvasObject{background, icon, text}, + } +} + +func (i *fileItem) buildMenu(u fyne.URI) *fyne.Menu { + return fyne.NewMenu(u.Name(), + fyne.NewMenuItem("Copy path", func() { + i.parent.win.Clipboard().SetContent(u.Path()) + }), + ) +} + +func fileName(path fyne.URI) string { + name := path.Name() + ext := filepath.Ext(name[1:]) + return name[:len(name)-len(ext)] +} + +func newFileItem(location fyne.URI, dir bool, p *Panel) *fileItem { + item := &fileItem{ + parent: p, + location: location, + dir: dir, + } + + if dir { + item.name = location.Name() + } else { + item.name = fileName(location) + } + + item.ExtendBaseWidget(item) + return item +} + +type fileItemRenderer struct { + item *fileItem + + background *canvas.Rectangle + icon *widget.FileIcon + text *widget.Label + objects []fyne.CanvasObject +} + +func (s fileItemRenderer) Layout(size fyne.Size) { + s.background.Resize(size) + + iconAlign := (size.Width - fileIconSize) / 2 + s.icon.Resize(fyne.NewSize(fileIconSize, fileIconSize)) + s.icon.Move(fyne.NewPos(iconAlign, 0)) + + textHeight := s.text.MinSize().Height + s.text.Resize(fyne.NewSize(size.Width, textHeight)) + s.text.Move(fyne.NewPos(0, size.Height-textHeight)) +} + +func (s fileItemRenderer) MinSize() fyne.Size { + return fileItemMin +} + +func (s fileItemRenderer) Refresh() { + if s.item.isCurrent { + s.background.FillColor = theme.SelectionColor() + s.background.Show() + } else { + s.background.Hide() + } + s.background.Refresh() + canvas.Refresh(s.item) +} + +func (s fileItemRenderer) Objects() []fyne.CanvasObject { + return s.objects +} + +func (s fileItemRenderer) Destroy() { +} diff --git a/vendor/modules.txt b/vendor/modules.txt index d6f8f1e6..f60312d9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -111,6 +111,9 @@ github.com/fyne-io/glfw-js ## explicit github.com/fyne-io/image/ico github.com/fyne-io/image/xpm +# github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 +## explicit +github.com/fyshos/fyles/pkg/fyles # github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 github.com/go-gl/gl/v2.1/gl github.com/go-gl/gl/v2.1/gl/KHR @@ -194,6 +197,7 @@ golang.org/x/net/html golang.org/x/net/html/atom golang.org/x/net/html/charset # golang.org/x/sys v0.0.0-20220412211240-33da011f77ad +## explicit golang.org/x/sys/execabs golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix From 6bc4280d8cc27d8fb7e19e745dfb410565e8e207 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 3 Mar 2023 22:16:31 +0000 Subject: [PATCH 03/43] Update latest Fyles to hide and size nicely --- go.mod | 2 +- go.sum | 4 ++-- modules/fyles/fyles.go | 8 +++++--- .../fyshos/fyles/pkg/fyles/fylespanel.go | 17 ++++++++++++----- .../github.com/fyshos/fyles/pkg/fyles/item.go | 2 +- vendor/modules.txt | 2 +- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 512bb8d3..1d4f8a29 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/Knetic/govaluate v3.0.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 - github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 + github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4 github.com/godbus/dbus/v5 v5.1.0 github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd diff --git a/go.sum b/go.sum index 7820fa18..6db9e3cc 100644 --- a/go.sum +++ b/go.sum @@ -110,8 +110,8 @@ github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0 github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= -github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 h1:tq2MoK8t6CDEm//NkJQdG05eb06rxIcYnBAKjwJLScs= -github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8/go.mod h1:yjgxR9tuDcgZRA9XWnmtSvBO691eVD+8xITuPJ+uw5M= +github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4 h1:slj7MdQRpx9iV7OK9JKOfxVfZi4ihsZm4MOJvosyjbQ= +github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4/go.mod h1:yjgxR9tuDcgZRA9XWnmtSvBO691eVD+8xITuPJ+uw5M= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go index 43df7bc6..b27c01d2 100644 --- a/modules/fyles/fyles.go +++ b/modules/fyles/fyles.go @@ -10,6 +10,7 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/storage" + lib "github.com/fyshos/fyles/pkg/fyles" "golang.org/x/sys/execabs" @@ -29,13 +30,14 @@ func (f *fyles) Destroy() { func (f *fyles) ScreenAreaWidget() fyne.CanvasObject { icons := lib.NewFylesPanel(f.tapped, fynedesk.Instance().Root()) + icons.HideParent = true home, _ := os.UserHomeDir() icons.SetDir(storage.NewFileURI(filepath.Join(home, "Desktop"))) desk := fynedesk.Instance() - var barPad fyne.CanvasObject + var barPad *canvas.Rectangle if desk.Settings().NarrowLeftLauncher() { - barPad := canvas.NewRectangle(color.Transparent) + barPad = canvas.NewRectangle(color.Transparent) barPad.SetMinSize(fyne.NewSize(wmtheme.NarrowBarWidth, 1)) } @@ -46,7 +48,7 @@ func (f *fyles) ScreenAreaWidget() fyne.CanvasObject { widgetPad := canvas.NewRectangle(color.Transparent) widgetPad.SetMinSize(fyne.NewSize(rightIndent, 1)) - return container.NewBorder(nil, nil, barPad, widgetPad, icons) + return container.NewBorder(nil, nil, barPad, widgetPad, container.NewPadded(icons)) } func (f *fyles) Metadata() fynedesk.ModuleMetadata { diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go b/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go index ab575fbc..7df5c975 100644 --- a/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go +++ b/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go @@ -10,6 +10,8 @@ import ( type Panel struct { widget.BaseWidget + + HideParent bool content *fyne.Container cb func(fyne.URI) @@ -32,11 +34,13 @@ func (p *Panel) CreateRenderer() fyne.WidgetRenderer { func (p *Panel) SetDir(u fyne.URI) { var items []fyne.CanvasObject - parent, err := storage.Parent(u) - if err == nil { - up := &fileItem{parent: p, name: "(Parent)", location: parent, dir: true} - up.ExtendBaseWidget(up) - items = append(items, up) + if !p.HideParent { + parent, err := storage.Parent(u) + if err == nil { + up := &fileItem{parent: p, name: "(Parent)", location: parent, dir: true} + up.ExtendBaseWidget(up) + items = append(items, up) + } } list, err := storage.List(u) if err != nil { @@ -46,6 +50,9 @@ func (p *Panel) SetDir(u fyne.URI) { //if !ui.filter.Matches(item) { // continue //} + if item.Name()[0] == '.' { + continue + } dir, _ := storage.CanList(item) items = append(items, newFileItem(item, dir, p)) diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/item.go b/vendor/github.com/fyshos/fyles/pkg/fyles/item.go index c68c1112..92e4dbfd 100644 --- a/vendor/github.com/fyshos/fyles/pkg/fyles/item.go +++ b/vendor/github.com/fyshos/fyles/pkg/fyles/item.go @@ -10,7 +10,7 @@ import ( ) const ( - fileIconSize = 64 + fileIconSize = 52 fileTextSize = 20 fileIconCellWidth = fileIconSize * 1.25 ) diff --git a/vendor/modules.txt b/vendor/modules.txt index f60312d9..0d5fd9d2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -111,7 +111,7 @@ github.com/fyne-io/glfw-js ## explicit github.com/fyne-io/image/ico github.com/fyne-io/image/xpm -# github.com/fyshos/fyles v0.0.0-20230219172605-cc78f5f807a8 +# github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4 ## explicit github.com/fyshos/fyles/pkg/fyles # github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 From a79946ef83a76e318ce59e0be545dde4962040c4 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 14 Oct 2023 22:00:30 +0100 Subject: [PATCH 04/43] Update Fyles and fix tapping --- go.mod | 3 ++- go.sum | 55 +++--------------------------------------- internal/ui/desk.go | 10 ++++---- modules/fyles/fyles.go | 7 +++--- 4 files changed, 15 insertions(+), 60 deletions(-) diff --git a/go.mod b/go.mod index 64c4c17f..fc979c1f 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/Knetic/govaluate v3.0.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 - github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4 + github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232 github.com/godbus/dbus/v5 v5.1.0 github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd @@ -50,3 +50,4 @@ require ( ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d +replace github.com/fyshos/fyles => ../fyles \ No newline at end of file diff --git a/go.sum b/go.sum index 94a03644..d1113fde 100644 --- a/go.sum +++ b/go.sum @@ -37,22 +37,15 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.2.4/go.mod h1:MBoGuHzLLSXdQOWFAwWhIhYTEMp33zqtGCReSWhaQTA= -fyne.io/fyne/v2 v2.3.0/go.mod h1:odfJmbFnODiKn1MXdL44JR6CK+0v8lrmgdPlrUF6w0M= fyne.io/fyne/v2 v2.4.0 h1:LlyOyHmvkSo9IBm3aY+NVWSBIw+GMnssmyyIMK8F7zM= fyne.io/fyne/v2 v2.4.0/go.mod h1:AWM1iPM2YfliduZ4u/kQzP9E6ARIWm0gg+57GpYzWro= -fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= -fyne.io/systray v1.10.1-0.20221115204952-d16a6177e6f1/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= fyne.io/systray v1.10.1-0.20230722100817-88df1e0ffa9a h1:6Xf9fP3/mt72NrqlQhJWhQGcNf6GoG9X96NTaXr+K6A= fyne.io/systray v1.10.1-0.20230722100817-88df1e0ffa9a/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= -fyne.io/x/fyne v0.0.0-20230128220048-43a1c4cd1ed8/go.mod h1:tInTkLEiYNhEYq8s4UbnpINBg/W6mqU0ArbuuJszd3s= -github.com/Andrew-M-C/go.jsonvalue v1.1.2-0.20211223013816-e873b56b4a84/go.mod h1:oTJGG91FhtsxvUFVwHSvr6zuaTcAuroj/ToxfT7Ox8U= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd h1:u7K2oMFMd8APDV3fM1j2rO3U/XJf1g1qC3DDTKou8iM= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -60,14 +53,10 @@ github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 h1:Za0NHFsT0CCX github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184/go.mod h1:cOUmJ3HUVmH3W3u9Gj5hM73ZgrDxGNHKMr5T/sBKqLU= github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE= -github.com/benoitkugler/textlayout v0.3.0/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w= -github.com/benoitkugler/textlayout-testdata v0.1.1/go.mod h1:i/qZl09BbUOtd7Bu/W1CAubRwTWrEXWq6JwMkw8wYxo= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -81,13 +70,11 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= -github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -96,25 +83,21 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8= -github.com/fredbi/uri v0.1.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0= github.com/fredbi/uri v1.0.0 h1:s4QwUAZ8fz+mbTsukND+4V5f+mJ/wjaTokwstGUAemg= github.com/fredbi/uri v1.0.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe h1:A/wiwvQ0CAjPkuJytaD+SsXkPU0asQ+guQEIg1BJGX4= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 h1:+31CdF/okdokeFNoy9L/2PccG3JFidQT3ev64/r4pYU= github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E= -github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= -github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4 h1:slj7MdQRpx9iV7OK9JKOfxVfZi4ihsZm4MOJvosyjbQ= -github.com/fyshos/fyles v0.0.0-20230303221306-09cac62fd3e4/go.mod h1:yjgxR9tuDcgZRA9XWnmtSvBO691eVD+8xITuPJ+uw5M= +github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232 h1:AIexOh3g8VubT6NbpnQL6VaQMjQRIs0eOkKBvAFLyl8= +github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232/go.mod h1:XFpSFC7q44gdT4SAhOmqRg3vicPD+boy+xThRArW2js= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= @@ -124,10 +107,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc= -github.com/go-text/typesetting v0.0.0-20221212183139-1eb938670a1f/go.mod h1:/cmOXaoTiO+lbCwkTZBgCvevJpbFsZ5reXIpEJVh5MI= github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a h1:VjN8ttdfklC0dnAdKbZqGNESdERUxtE3l8a/4Grgarc= github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI= @@ -135,8 +116,6 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= -github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -203,7 +182,6 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= github.com/goxjs/glfw v0.0.0-20191126052801-d2efb5f20838/go.mod h1:oS8P8gVOT4ywTcjV6wZlOU4GuVFQ8F5328KY3MJ79CY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -232,9 +210,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 h1:2bRhR5GcMudCdaY4p8ip89hsvSyxYehLSicCNtygyVY= github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2/go.mod h1:Hj3TV9xrdt+g9apvBagVi/VzE41gSliEBypxaQDq5QA= -github.com/jackmordaunt/icns/v2 v2.2.1/go.mod h1:6aYIB9eSzyfHHMKqDf17Xrs1zetQPReAkiUSHzdw4cI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -244,17 +220,16 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b/go.mod h1:PRq09yoB+Q2OJReAmwzKivcYyremnibWGbK7WfftHzc= github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd h1:gn6oLpDCn3wY+1WfbbP0OwxXL+2eHi3mxF/DsNyPHUM= github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd/go.mod h1:dlpd1fnLAhI6g9tM/aCobgN/Yka1/SkHrBTfAgDdb9Q= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -271,8 +246,6 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -286,14 +259,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -304,12 +275,8 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= -github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= -github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= -github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -321,15 +288,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= -github.com/urfave/cli/v2 v2.4.0/go.mod h1:NX9W0zmTvedE5oDoOMs2RTC8RvdK98NTYZE5LbaEYPg= -github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -375,10 +339,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220601225756-64ec528b34cd/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -430,7 +390,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -446,9 +405,7 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= @@ -489,10 +446,8 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -525,7 +480,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -712,9 +666,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 9dfc8bf0..90435c9f 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -5,13 +5,13 @@ import ( "os/exec" "strconv" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - deskDriver "fyne.io/fyne/v2/driver/desktop" - "fyshos.com/fynedesk" wmtheme "fyshos.com/fynedesk/theme" "fyshos.com/fynedesk/wm" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + deskDriver "fyne.io/fyne/v2/driver/desktop" ) const ( @@ -61,7 +61,7 @@ func (l *desktop) Layout(objects []fyne.CanvasObject, size fyne.Size) { bg := objects[0].(*background) bg.Resize(size) if l.Settings().NarrowLeftLauncher() { - l.bar.Resize(size) + l.bar.Resize(fyne.NewSize(wmtheme.NarrowBarWidth, size.Height)) l.bar.Move(fyne.NewPos(0, 0)) } else { barHeight := l.bar.MinSize().Height diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go index b27c01d2..2fd59898 100644 --- a/modules/fyles/fyles.go +++ b/modules/fyles/fyles.go @@ -35,10 +35,11 @@ func (f *fyles) ScreenAreaWidget() fyne.CanvasObject { icons.SetDir(storage.NewFileURI(filepath.Join(home, "Desktop"))) desk := fynedesk.Instance() - var barPad *canvas.Rectangle + var barPad fyne.CanvasObject if desk.Settings().NarrowLeftLauncher() { - barPad = canvas.NewRectangle(color.Transparent) - barPad.SetMinSize(fyne.NewSize(wmtheme.NarrowBarWidth, 1)) + r := canvas.NewRectangle(color.Transparent) + r.SetMinSize(fyne.NewSize(wmtheme.NarrowBarWidth, 1)) + barPad = r } rightIndent := wmtheme.WidgetPanelWidth From 6683bed279295f5f121fab15464a6db3901a196e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 15 Oct 2023 18:10:12 +0100 Subject: [PATCH 05/43] We don't vendor any more --- vendor/github.com/fyshos/fyles/AUTHORS | 1 - vendor/github.com/fyshos/fyles/LICENSE | 28 ---- .../fyshos/fyles/pkg/fyles/fylespanel.go | 64 --------- .../github.com/fyshos/fyles/pkg/fyles/item.go | 134 ------------------ 4 files changed, 227 deletions(-) delete mode 100644 vendor/github.com/fyshos/fyles/AUTHORS delete mode 100644 vendor/github.com/fyshos/fyles/LICENSE delete mode 100644 vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go delete mode 100644 vendor/github.com/fyshos/fyles/pkg/fyles/item.go diff --git a/vendor/github.com/fyshos/fyles/AUTHORS b/vendor/github.com/fyshos/fyles/AUTHORS deleted file mode 100644 index 72ba9602..00000000 --- a/vendor/github.com/fyshos/fyles/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Andy Williams diff --git a/vendor/github.com/fyshos/fyles/LICENSE b/vendor/github.com/fyshos/fyles/LICENSE deleted file mode 100644 index c6c144e7..00000000 --- a/vendor/github.com/fyshos/fyles/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -BSD 3-Clause License - -Copyright (C) 2021 Fyne.io developers (see AUTHORS) -All rights reserved. - - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Fyne.io nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go b/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go deleted file mode 100644 index 7df5c975..00000000 --- a/vendor/github.com/fyshos/fyles/pkg/fyles/fylespanel.go +++ /dev/null @@ -1,64 +0,0 @@ -package fyles - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/storage" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" -) - -type Panel struct { - widget.BaseWidget - - HideParent bool - - content *fyne.Container - cb func(fyne.URI) - win fyne.Window - current *fileItem -} - -func NewFylesPanel(c func(fyne.URI), w fyne.Window) *Panel { - fileItemMin := fyne.NewSize(fileIconCellWidth, fileIconSize+fileTextSize+theme.InnerPadding()) - - uiItems := container.NewGridWrap(fileItemMin) - p := &Panel{content: uiItems, cb: c, win: w} - p.ExtendBaseWidget(p) - return p -} - -func (p *Panel) CreateRenderer() fyne.WidgetRenderer { - return widget.NewSimpleRenderer(p.content) -} - -func (p *Panel) SetDir(u fyne.URI) { - var items []fyne.CanvasObject - if !p.HideParent { - parent, err := storage.Parent(u) - if err == nil { - up := &fileItem{parent: p, name: "(Parent)", location: parent, dir: true} - up.ExtendBaseWidget(up) - items = append(items, up) - } - } - list, err := storage.List(u) - if err != nil { - fyne.LogError("Could not read dir", err) - } else { - for _, item := range list { - //if !ui.filter.Matches(item) { - // continue - //} - if item.Name()[0] == '.' { - continue - } - - dir, _ := storage.CanList(item) - items = append(items, newFileItem(item, dir, p)) - } - } - - p.content.Objects = items - p.content.Refresh() -} diff --git a/vendor/github.com/fyshos/fyles/pkg/fyles/item.go b/vendor/github.com/fyshos/fyles/pkg/fyles/item.go deleted file mode 100644 index 92e4dbfd..00000000 --- a/vendor/github.com/fyshos/fyles/pkg/fyles/item.go +++ /dev/null @@ -1,134 +0,0 @@ -package fyles - -import ( - "path/filepath" - - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" -) - -const ( - fileIconSize = 52 - fileTextSize = 20 - fileIconCellWidth = fileIconSize * 1.25 -) - -var fileItemMin fyne.Size - -type fileItem struct { - widget.BaseWidget - parent *Panel - isCurrent bool - - name string - location fyne.URI - dir bool -} - -func (i *fileItem) Tapped(_ *fyne.PointEvent) { - if i.parent.current != nil { - i.parent.current.isCurrent = false - i.parent.current.Refresh() - } - i.isCurrent = true - i.parent.current = i - i.Refresh() - i.parent.cb(i.location) -} - -func (i *fileItem) TappedSecondary(ev *fyne.PointEvent) { - m := i.buildMenu(i.location) - widget.ShowPopUpMenuAtPosition(m, i.parent.win.Canvas(), ev.AbsolutePosition) -} - -func (i *fileItem) CreateRenderer() fyne.WidgetRenderer { - background := canvas.NewRectangle(theme.SelectionColor()) - background.Hide() - text := widget.NewLabelWithStyle(i.name, fyne.TextAlignCenter, fyne.TextStyle{}) - text.Wrapping = fyne.TextTruncate - icon := widget.NewFileIcon(i.location) - - return &fileItemRenderer{ - item: i, - background: background, - icon: icon, - text: text, - objects: []fyne.CanvasObject{background, icon, text}, - } -} - -func (i *fileItem) buildMenu(u fyne.URI) *fyne.Menu { - return fyne.NewMenu(u.Name(), - fyne.NewMenuItem("Copy path", func() { - i.parent.win.Clipboard().SetContent(u.Path()) - }), - ) -} - -func fileName(path fyne.URI) string { - name := path.Name() - ext := filepath.Ext(name[1:]) - return name[:len(name)-len(ext)] -} - -func newFileItem(location fyne.URI, dir bool, p *Panel) *fileItem { - item := &fileItem{ - parent: p, - location: location, - dir: dir, - } - - if dir { - item.name = location.Name() - } else { - item.name = fileName(location) - } - - item.ExtendBaseWidget(item) - return item -} - -type fileItemRenderer struct { - item *fileItem - - background *canvas.Rectangle - icon *widget.FileIcon - text *widget.Label - objects []fyne.CanvasObject -} - -func (s fileItemRenderer) Layout(size fyne.Size) { - s.background.Resize(size) - - iconAlign := (size.Width - fileIconSize) / 2 - s.icon.Resize(fyne.NewSize(fileIconSize, fileIconSize)) - s.icon.Move(fyne.NewPos(iconAlign, 0)) - - textHeight := s.text.MinSize().Height - s.text.Resize(fyne.NewSize(size.Width, textHeight)) - s.text.Move(fyne.NewPos(0, size.Height-textHeight)) -} - -func (s fileItemRenderer) MinSize() fyne.Size { - return fileItemMin -} - -func (s fileItemRenderer) Refresh() { - if s.item.isCurrent { - s.background.FillColor = theme.SelectionColor() - s.background.Show() - } else { - s.background.Hide() - } - s.background.Refresh() - canvas.Refresh(s.item) -} - -func (s fileItemRenderer) Objects() []fyne.CanvasObject { - return s.objects -} - -func (s fileItemRenderer) Destroy() { -} From eedd0c5ff6154dcaaf418e1ca0728f84699ad18a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 5 Jan 2024 19:19:53 +0000 Subject: [PATCH 06/43] Show Trash on the desktop --- go.mod | 19 +++++++++---------- go.sum | 36 ++++++++++++++++++------------------ modules/fyles/fyles.go | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index fc979c1f..e5d2c087 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module fyshos.com/fynedesk go 1.17 require ( - fyne.io/fyne/v2 v2.4.0 + fyne.io/fyne/v2 v2.4.3 github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd @@ -12,25 +12,25 @@ require ( github.com/Knetic/govaluate v3.0.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 - github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232 + github.com/fyshos/fyles v0.0.0-20240105185750-ba0c41e1f720 github.com/godbus/dbus/v5 v5.1.0 github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/stretchr/testify v1.8.4 - golang.org/x/sys v0.11.0 + golang.org/x/sys v0.13.0 howett.net/plist v0.0.0-20181124034731-591f970eefbb ) require ( - fyne.io/systray v1.10.1-0.20230722100817-88df1e0ffa9a // indirect + fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fredbi/uri v1.0.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect - github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect + github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33 // indirect github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 // indirect github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect @@ -43,11 +43,10 @@ require ( github.com/yuin/goldmark v1.5.5 // indirect golang.org/x/image v0.11.0 // indirect golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d -replace github.com/fyshos/fyles => ../fyles \ No newline at end of file diff --git a/go.sum b/go.sum index d1113fde..a2baf0c4 100644 --- a/go.sum +++ b/go.sum @@ -37,10 +37,10 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.4.0 h1:LlyOyHmvkSo9IBm3aY+NVWSBIw+GMnssmyyIMK8F7zM= -fyne.io/fyne/v2 v2.4.0/go.mod h1:AWM1iPM2YfliduZ4u/kQzP9E6ARIWm0gg+57GpYzWro= -fyne.io/systray v1.10.1-0.20230722100817-88df1e0ffa9a h1:6Xf9fP3/mt72NrqlQhJWhQGcNf6GoG9X96NTaXr+K6A= -fyne.io/systray v1.10.1-0.20230722100817-88df1e0ffa9a/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= +fyne.io/fyne/v2 v2.4.3 h1:v2wncjEAcwXZ8UNmTCWTGL9+sGyPc5RuzBvM96GcC78= +fyne.io/fyne/v2 v2.4.3/go.mod h1:1h3BKxmQYRJlr2g+RGVxedzr6vLVQ/AJmFWcF9CJnoQ= +fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e h1:Hvs+kW2VwCzNToF3FmnIAzmivNgrclwPgoUdVSrjkP8= +fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= @@ -86,18 +86,18 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fredbi/uri v1.0.0 h1:s4QwUAZ8fz+mbTsukND+4V5f+mJ/wjaTokwstGUAemg= github.com/fredbi/uri v1.0.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe h1:A/wiwvQ0CAjPkuJytaD+SsXkPU0asQ+guQEIg1BJGX4= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= -github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 h1:+31CdF/okdokeFNoy9L/2PccG3JFidQT3ev64/r4pYU= -github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E= +github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33 h1:0Ayg0/do/sqX2R7NonoLZvWxGrd9utTVf3A0QvCbC88= +github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= -github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232 h1:AIexOh3g8VubT6NbpnQL6VaQMjQRIs0eOkKBvAFLyl8= -github.com/fyshos/fyles v0.0.0-20231014201010-12f57b248232/go.mod h1:XFpSFC7q44gdT4SAhOmqRg3vicPD+boy+xThRArW2js= +github.com/fyshos/fyles v0.0.0-20240105185750-ba0c41e1f720 h1:vxPbMYBDz3sA9Cv1+06yF24p/HssWP2jJjf2u0tNgik= +github.com/fyshos/fyles v0.0.0-20240105185750-ba0c41e1f720/go.mod h1:1g01pnfrasGx2mvHz69XwmgswxWncg41UMzyrqh7b6M= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= @@ -105,8 +105,8 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 h1:7tf/0aw5DxRQjr7WaNqgtjidub6v21L2cogKIbMcTYw= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc= github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a h1:VjN8ttdfklC0dnAdKbZqGNESdERUxtE3l8a/4Grgarc= @@ -408,8 +408,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -482,10 +482,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -499,8 +498,9 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go index 2fd59898..30d4e54b 100644 --- a/modules/fyles/fyles.go +++ b/modules/fyles/fyles.go @@ -31,8 +31,8 @@ func (f *fyles) Destroy() { func (f *fyles) ScreenAreaWidget() fyne.CanvasObject { icons := lib.NewFylesPanel(f.tapped, fynedesk.Instance().Root()) icons.HideParent = true - home, _ := os.UserHomeDir() - icons.SetDir(storage.NewFileURI(filepath.Join(home, "Desktop"))) + icons.Filter = filterHidden() + f.setDesktopDir(icons) desk := fynedesk.Instance() var barPad fyne.CanvasObject @@ -56,6 +56,20 @@ func (f *fyles) Metadata() fynedesk.ModuleMetadata { return fylesMeta } +func (f *fyles) setDesktopDir(p *lib.Panel) { + home, _ := os.UserHomeDir() + u := storage.NewFileURI(filepath.Join(home, "Desktop")) + trash := newTrashURI(filepath.Join(home, ".local", "share", "Trash", "files")) + + list, err := storage.List(u) + list = append([]fyne.URI{trash}, list...) + if err != nil { + fyne.LogError("Could not read Desktop dir", err) + } else { + p.SetListing(list) + } +} + func (f *fyles) tapped(u fyne.URI) { p, err := execabs.LookPath("fyles") if p != "" && err == nil { @@ -77,3 +91,26 @@ func (f *fyles) tapped(u fyne.URI) { func newFyles() fynedesk.Module { return &fyles{} } + +type filter struct{} + +func (f *filter) Matches(u fyne.URI) bool { + return u.Name()[0] != '.' +} + +func filterHidden() storage.FileFilter { + return &filter{} +} + +type trashURI struct { + fyne.URI +} + +func newTrashURI(s string) fyne.URI { + u := storage.NewFileURI(s) + return &trashURI{URI: u} +} + +func (t *trashURI) Name() string { + return "Trash" +} From 913267ffc61f434666993116b94b4cf8d206641b Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 5 Jan 2024 20:13:20 +0000 Subject: [PATCH 07/43] Set the Trash icon using new URIWithIcon --- go.mod | 3 +++ go.sum | 6 ++++-- modules/fyles/fyles.go | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index e5d2c087..7062ec2f 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect github.com/pkg/errors v0.8.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect github.com/tevino/abool v1.2.0 // indirect @@ -50,3 +51,5 @@ require ( ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d + +replace fyne.io/fyne/v2 => github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db diff --git a/go.sum b/go.sum index a2baf0c4..92881f08 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.4.3 h1:v2wncjEAcwXZ8UNmTCWTGL9+sGyPc5RuzBvM96GcC78= -fyne.io/fyne/v2 v2.4.3/go.mod h1:1h3BKxmQYRJlr2g+RGVxedzr6vLVQ/AJmFWcF9CJnoQ= fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e h1:Hvs+kW2VwCzNToF3FmnIAzmivNgrclwPgoUdVSrjkP8= fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= @@ -53,6 +51,8 @@ github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 h1:Za0NHFsT0CCX github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184/go.mod h1:cOUmJ3HUVmH3W3u9Gj5hM73ZgrDxGNHKMr5T/sBKqLU= github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db h1:gkM3WmKTRVWHFULEfV7Rt+rvSrKxCp3J8ZTYn6pOnFk= +github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db/go.mod h1:4B1xJpiiKc75oAn1LUpRFDkGaQ5U0lYYl71qxDoSH0w= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -260,6 +260,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb h1:ejEomhJX7G4p8dFImv2zcQd2Oa0IpWIeB/FUZRnpQKg= +github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb/go.mod h1:RYYAnv4sssTQ7ceErKl7UD8auER/0yFV7CgmfS/uAD8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go index 30d4e54b..8b174729 100644 --- a/modules/fyles/fyles.go +++ b/modules/fyles/fyles.go @@ -10,6 +10,7 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/theme" lib "github.com/fyshos/fyles/pkg/fyles" "golang.org/x/sys/execabs" @@ -114,3 +115,7 @@ func newTrashURI(s string) fyne.URI { func (t *trashURI) Name() string { return "Trash" } + +func (t *trashURI) Icon() fyne.Resource { + return theme.DeleteIcon() +} From 66404e802a3850e6fef54ffc128b322d6067e497 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 5 Jan 2024 21:01:42 +0000 Subject: [PATCH 08/43] Also add a settings desktop icon This will launch the settings UI --- desk.go | 1 + internal/ui/desk.go | 4 ++++ modules/fyles/fyles.go | 22 +++++++++++++++------- test/desktop.go | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/desk.go b/desk.go index 2758eab3..4fff54c9 100644 --- a/desk.go +++ b/desk.go @@ -21,6 +21,7 @@ type Desktop interface { Desktop() int SetDesktop(int) + ShowSettings() } var instance Desktop diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 90435c9f..6289c31c 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -57,6 +57,10 @@ func (l *desktop) SetDesktop(id int) { } } +func (l *desktop) ShowSettings() { + l.widgets.showSettings() +} + func (l *desktop) Layout(objects []fyne.CanvasObject, size fyne.Size) { bg := objects[0].(*background) bg.Resize(size) diff --git a/modules/fyles/fyles.go b/modules/fyles/fyles.go index 8b174729..1de26acf 100644 --- a/modules/fyles/fyles.go +++ b/modules/fyles/fyles.go @@ -60,10 +60,11 @@ func (f *fyles) Metadata() fynedesk.ModuleMetadata { func (f *fyles) setDesktopDir(p *lib.Panel) { home, _ := os.UserHomeDir() u := storage.NewFileURI(filepath.Join(home, "Desktop")) - trash := newTrashURI(filepath.Join(home, ".local", "share", "Trash", "files")) + settings := newCustomURI("settings://", "Settings", theme.SettingsIcon()) + trash := newCustomURI("file://"+filepath.Join(home, ".local", "share", "Trash", "files"), "Trash", theme.DeleteIcon()) list, err := storage.List(u) - list = append([]fyne.URI{trash}, list...) + list = append([]fyne.URI{settings, trash}, list...) if err != nil { fyne.LogError("Could not read Desktop dir", err) } else { @@ -72,6 +73,10 @@ func (f *fyles) setDesktopDir(p *lib.Panel) { } func (f *fyles) tapped(u fyne.URI) { + if u.Scheme() == "settings" { + fynedesk.Instance().ShowSettings() + return + } p, err := execabs.LookPath("fyles") if p != "" && err == nil { if ok, _ := storage.CanList(u); ok { @@ -105,17 +110,20 @@ func filterHidden() storage.FileFilter { type trashURI struct { fyne.URI + + name string + icon fyne.Resource } -func newTrashURI(s string) fyne.URI { - u := storage.NewFileURI(s) - return &trashURI{URI: u} +func newCustomURI(str, name string, icon fyne.Resource) fyne.URI { + u, _ := storage.ParseURI(str) + return &trashURI{URI: u, name: name, icon: icon} } func (t *trashURI) Name() string { - return "Trash" + return t.name } func (t *trashURI) Icon() fyne.Resource { - return theme.DeleteIcon() + return t.icon } diff --git a/test/desktop.go b/test/desktop.go index 7a10e3d1..c76dd78b 100644 --- a/test/desktop.go +++ b/test/desktop.go @@ -57,6 +57,8 @@ func (*Desktop) Desktop() int { func (*Desktop) SetDesktop(int) { } +func (*Desktop) ShowSettings() {} + // IconProvider returns the icon provider, by default it uses a simple in-memory implementation func (td *Desktop) IconProvider() fynedesk.ApplicationProvider { return td.icons From 94d4b515feeb5c160d71a73288243cf2576f8108 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 5 Jan 2024 21:11:48 +0000 Subject: [PATCH 09/43] Add missing comment --- test/desktop.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/desktop.go b/test/desktop.go index c76dd78b..27529e6c 100644 --- a/test/desktop.go +++ b/test/desktop.go @@ -57,6 +57,7 @@ func (*Desktop) Desktop() int { func (*Desktop) SetDesktop(int) { } +// ShowSettings does nothing for the test package func (*Desktop) ShowSettings() {} // IconProvider returns the icon provider, by default it uses a simple in-memory implementation From 9917ffa6c6f7e62e79b3876d1870e11ba686275f Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 7 Jan 2024 11:56:45 +0000 Subject: [PATCH 10/43] Use the landed feature to avoid replace --- go.mod | 22 ++++++++------------ go.sum | 65 +++++++++++++++++++--------------------------------------- 2 files changed, 30 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index 7062ec2f..188228ca 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module fyshos.com/fynedesk go 1.17 require ( - fyne.io/fyne/v2 v2.4.3 + fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006 github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd @@ -18,17 +18,17 @@ require ( github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/stretchr/testify v1.8.4 - golang.org/x/sys v0.13.0 + golang.org/x/sys v0.15.0 howett.net/plist v0.0.0-20181124034731-591f970eefbb ) require ( - fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e // indirect + fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fredbi/uri v1.0.0 // indirect + github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect - github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33 // indirect + github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 // indirect github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect @@ -40,16 +40,12 @@ require ( github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/tevino/abool v1.2.0 // indirect github.com/yuin/goldmark v1.5.5 // indirect - golang.org/x/image v0.11.0 // indirect - golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/image v0.14.0 // indirect + golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d - -replace fyne.io/fyne/v2 => github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db diff --git a/go.sum b/go.sum index 92881f08..9056f574 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,10 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e h1:Hvs+kW2VwCzNToF3FmnIAzmivNgrclwPgoUdVSrjkP8= -fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= +fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006 h1:7zQ59DzG2vWbcHvE/ElPhrkP5Qy8CO15fJenSm22v74= +fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006/go.mod h1:lcFfOoGu75+eS+ERtXM8OZQy+czyIfHxohlc9wSCslE= +fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 h1:E/gHmMVyk8TuI6JIgNIv/Qu1JABMVFBIkQ8lYRa5gkQ= +fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= @@ -51,8 +53,6 @@ github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 h1:Za0NHFsT0CCX github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184/go.mod h1:cOUmJ3HUVmH3W3u9Gj5hM73ZgrDxGNHKMr5T/sBKqLU= github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db h1:gkM3WmKTRVWHFULEfV7Rt+rvSrKxCp3J8ZTYn6pOnFk= -github.com/andydotxyz/fyne/v2 v2.2.0-rc1.0.20240105194745-1a45243c46db/go.mod h1:4B1xJpiiKc75oAn1LUpRFDkGaQ5U0lYYl71qxDoSH0w= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -83,15 +83,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fredbi/uri v1.0.0 h1:s4QwUAZ8fz+mbTsukND+4V5f+mJ/wjaTokwstGUAemg= -github.com/fredbi/uri v1.0.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8= +github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe h1:A/wiwvQ0CAjPkuJytaD+SsXkPU0asQ+guQEIg1BJGX4= github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= -github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33 h1:0Ayg0/do/sqX2R7NonoLZvWxGrd9utTVf3A0QvCbC88= -github.com/fyne-io/glfw-js v0.0.0-20220517201726-bebc2019cd33/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E= +github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW79bLiBiJwVL4jVeyGQRZMgImoeWs= +github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= @@ -104,7 +105,6 @@ github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVin github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 h1:7tf/0aw5DxRQjr7WaNqgtjidub6v21L2cogKIbMcTYw= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM= @@ -174,6 +174,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -183,7 +184,6 @@ github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNY github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= -github.com/goxjs/glfw v0.0.0-20191126052801-d2efb5f20838/go.mod h1:oS8P8gVOT4ywTcjV6wZlOU4GuVFQ8F5328KY3MJ79CY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -251,6 +251,7 @@ github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -282,7 +283,6 @@ github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -290,19 +290,15 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= -github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.5.5 h1:IJznPe8wOzfIKETmMkd06F8nXkmlhaHqFRM9l1hAGsU= github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -326,7 +322,6 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -341,8 +336,8 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= -golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -358,8 +353,8 @@ golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= -golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda h1:O+EUvnBNPwI4eLthn8W5K+cS8zQZfgTABPLNm6Bna34= -golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda/go.mod h1:aAjjkJNdrh3PMckS4B10TGS2nag27cbKR1y2BpUxsiY= +golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a h1:sYbmY3FwUWCBTodZL1S3JUuOvaW6kM2o+clDzzDNBWg= +golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -369,8 +364,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -408,10 +401,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -435,8 +426,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -482,14 +471,9 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.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/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -498,11 +482,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -559,8 +540,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -681,8 +660,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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/js/dom v0.0.0-20210725211120-f030747120f2 h1:oomkgU6VaQDsV6qZby2uz1Lap0eXmku8+2em3A/l700= -honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2/go.mod h1:sUMDUKNB2ZcVjt92UnLy3cdGs+wDAcrPdV3JP6sVgA4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From e1058c1977a16406f7a06f4478bb5828da51b83d Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 2 Mar 2024 21:33:48 +0000 Subject: [PATCH 11/43] Updated docs and embed video of release --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 7dac992a..42bbfa1d 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ It is built using the [Fyne](https://fyne.io) toolkit and is designed to be easy to use as well as easy to develop. We use the Go language and welcome any contributions or feedback for the project. +<<<<<<< HEAD ## Dependencies ### Compiling @@ -23,6 +24,11 @@ any contributions or feedback for the project. Compiling requires the same dependencies as Fyne. See the [Getting Started](https://developer.fyne.io/started/) documentation for installation steps. ### Running +======= +[![FyneDesk v0.4](https://img.youtube.com/vi/82Wu5k0xZOI/0.jpg)](https://www.youtube.com/watch?v=82Wu5k0xZOI) + +# Dependencies +>>>>>>> c4b4c54 (Updated docs and embed video of release) For a full desktop experience you will also need the following external tools installed: From c54cb41486c3043845d32b5a158fea0129226513 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 4 Feb 2024 10:10:22 +0000 Subject: [PATCH 12/43] Don't try to logout whilst our shutdown dialog is still open --- internal/ui/menu.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/ui/menu.go b/internal/ui/menu.go index 31983d59..4def6584 100644 --- a/internal/ui/menu.go +++ b/internal/ui/menu.go @@ -4,6 +4,7 @@ import ( "image/color" "os" "sort" + "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" @@ -56,6 +57,7 @@ func (w *widgetPanel) askLogout() { win := fyne.CurrentApp().Driver().(deskDriver.Driver).CreateSplashWindow() logout := widget.NewButtonWithIcon("Logout", theme.LogoutIcon(), func() { win.Close() + time.Sleep(time.Second / 10) w.desk.WindowManager().Close() }) logout.Importance = widget.DangerImportance From 0cba7d65c0a57689b1f5bd8ae4f1953ad7ff7ece Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 11 Feb 2024 16:52:14 +0000 Subject: [PATCH 13/43] prepare metadata for release --- .github/PULL_REQUEST_TEMPLATE.md | 1 - CHANGELOG.md | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 29644ffb..0287b205 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -20,4 +20,3 @@ Fixes #(issue) - [ ] Public APIs match existing style. - [ ] Any breaking changes have a deprecation path or have been discussed. -- [ ] Updated the vendor folder (using `go mod vendor`). diff --git a/CHANGELOG.md b/CHANGELOG.md index 726a5642..6aae59b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ This file lists the main changes with each version of the FyneDesk project. More detailed release notes can be found on the [releases page](https://github.com/fyne-io/desktop/releases). +## 0.4 - Ongoing + +### Added + +* Virtual desktops and pager widget +* Add support for permissions requests in apps +* Add app search to app bar +* Add systray module +* Support launching xscreenaver for screen lock + +### Changed + +* New "thin bars" layout of desktop by default +* Show a dialog to confirm before logging out +* Move to abstract light/dark backgrounds from Jost Grant +* Update to Fyne 2.4 theme with rounded corners + +### Fixed + +* Performance improvements in border painting +* + + ## 0.3 - 17 December 2021 ### Added From 5d15cddd1b36905aea25586f67dfe5174c3ea642 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 11 Feb 2024 16:52:48 +0000 Subject: [PATCH 14/43] dim iconified --- CHANGELOG.md | 1 + internal/ui/switcher.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aae59b3..4983281a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ More detailed release notes can be found on the [releases page](https://github.c * Show a dialog to confirm before logging out * Move to abstract light/dark backgrounds from Jost Grant * Update to Fyne 2.4 theme with rounded corners +* Dim iconified windows in switcher ### Fixed diff --git a/internal/ui/switcher.go b/internal/ui/switcher.go index 6bd6dcaf..10e471df 100644 --- a/internal/ui/switcher.go +++ b/internal/ui/switcher.go @@ -46,6 +46,9 @@ func (s *switchIcon) CreateRenderer() fyne.WidgetRenderer { bg := canvas.NewRectangle(color.Transparent) bg.CornerRadius = theme.InputRadiusSize() img := canvas.NewImageFromResource(res) + if s.win.Iconic() { + img.Translucency = 0.8 + } text := widget.NewLabelWithStyle(title, fyne.TextAlignCenter, fyne.TextStyle{}) text.Truncation = fyne.TextTruncateEllipsis return &switchIconRenderer{icon: s, bg: bg, From 03e0905cdd7d6d212123b0b1f69625097b306bbe Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 11 Feb 2024 16:54:07 +0000 Subject: [PATCH 15/43] Fix glitch with date/time layout --- CHANGELOG.md | 2 +- internal/ui/widgetpanel.go | 28 ++++++++++++++++++---------- internal/x11/win/client.go | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4983281a..f70dc5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ More detailed release notes can be found on the [releases page](https://github.c ### Fixed * Performance improvements in border painting -* +* Date widget could move behind clock in some configurations ## 0.3 - 17 December 2021 diff --git a/internal/ui/widgetpanel.go b/internal/ui/widgetpanel.go index 37e9590e..ce411c36 100644 --- a/internal/ui/widgetpanel.go +++ b/internal/ui/widgetpanel.go @@ -79,19 +79,23 @@ func (w *widgetPanel) clockTick() { go func() { for { <-tick.C - w.clock.Text = w.formattedTime() - w.vClock.Text = w.formattedTime() - canvas.Refresh(w.clock) - if w.desk.Settings().NarrowWidgetPanel() { - w.rotate(w.vClock) - } - - w.date.SetText(w.formattedDate()) - canvas.Refresh(w.date) + w.clockRefresh() } }() } +func (w *widgetPanel) clockRefresh() { + w.clock.Text = w.formattedTime() + w.vClock.Text = w.formattedTime() + canvas.Refresh(w.clock) + if w.desk.Settings().NarrowWidgetPanel() { + w.rotate(w.vClock) + } + + w.date.SetText(w.formattedDate()) + canvas.Refresh(w.date) +} + func (w *widgetPanel) formattedTime() string { if w.desk.Settings().ClockFormatting() == "12h" { return time.Now().Format("03:04pm") @@ -165,6 +169,7 @@ func (w *widgetPanel) CreateRenderer() fyne.WidgetRenderer { } else { w.clocks.Objects[1].Hide() } + w.clockRefresh() bg := canvas.NewRectangle(wmtheme.WidgetPanelBackground()) objects := []fyne.CanvasObject{ @@ -235,6 +240,7 @@ func newWidgetPanel(rootDesk fynedesk.Desktop) *widgetPanel { } type vClockPad struct { + minCache fyne.Size } func (u *vClockPad) Layout(objects []fyne.CanvasObject, _ fyne.Size) { @@ -243,5 +249,7 @@ func (u *vClockPad) Layout(objects []fyne.CanvasObject, _ fyne.Size) { } func (u *vClockPad) MinSize(objects []fyne.CanvasObject) fyne.Size { - return objects[0].MinSize().Subtract(fyne.NewSize(0, theme.Padding())) + clockMin := objects[0].MinSize() + u.minCache = u.minCache.Max(clockMin) + return u.minCache.Subtract(fyne.NewSize(0, theme.Padding())) } diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index 7e8fefd2..9db09366 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -445,7 +445,7 @@ func (c *client) positionNewWindow() { primary := fynedesk.Instance().Screens().Primary() x = primary.Width - int(w) y = primary.Height - int(h) - } else if (!requestPosition && !hasPosition) || !c.positionIsValid(x, y) { + } else if !requestPosition && !hasPosition || !c.positionIsValid(x, y) { decorated := !windowBorderless(c.wm.X(), c.win) x, y, w, h = wm.PositionForNewWindow(c, int(attrs.X), int(attrs.Y), uint(attrs.Width), uint(attrs.Height), decorated, fynedesk.Instance().Screens()) From 0fa8d87da42af7afdf3ec7e032f7a6b9affc186e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 13 Feb 2024 12:50:34 +0000 Subject: [PATCH 16/43] latest Fyne release --- go.mod | 10 +++++----- go.sum | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 188228ca..5fe39d07 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,7 @@ module fyshos.com/fynedesk go 1.17 require ( - fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006 - github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect - github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect + fyne.io/fyne/v2 v2.4.4 github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 @@ -24,6 +22,8 @@ require ( require ( fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 // indirect + github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect + github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -32,12 +32,11 @@ require ( github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 // indirect github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect - github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a // indirect + github.com/go-text/typesetting v0.1.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect github.com/pkg/errors v0.8.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect github.com/yuin/goldmark v1.5.5 // indirect @@ -46,6 +45,7 @@ require ( golang.org/x/net v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d diff --git a/go.sum b/go.sum index 9056f574..61bdb42b 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006 h1:7zQ59DzG2vWbcHvE/ElPhrkP5Qy8CO15fJenSm22v74= -fyne.io/fyne/v2 v2.4.4-0.20240107115323-8458aff4b006/go.mod h1:lcFfOoGu75+eS+ERtXM8OZQy+czyIfHxohlc9wSCslE= +fyne.io/fyne/v2 v2.4.4 h1:4efSRpoikcGbqQN83yzC9WmF8UNq9olsaJQ/Ejme6Z8= +fyne.io/fyne/v2 v2.4.4/go.mod h1:VyrxAOZ3NRZRWBvNIJbfqoKOG4DdbewoPk7ozqJKNPY= fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 h1:E/gHmMVyk8TuI6JIgNIv/Qu1JABMVFBIkQ8lYRa5gkQ= fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= @@ -109,9 +109,9 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 h1:7tf/0aw5Dx github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM= github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc= -github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a h1:VjN8ttdfklC0dnAdKbZqGNESdERUxtE3l8a/4Grgarc= -github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= -github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI= +github.com/go-text/typesetting v0.1.0 h1:vioSaLPYcHwPEPLT7gsjCGDCoYSbljxoHJzMnKwVvHw= +github.com/go-text/typesetting v0.1.0/go.mod h1:d22AnmeKq/on0HNv73UFriMKc4Ez6EqZAofLhAzpSzI= +github.com/go-text/typesetting-utils v0.0.0-20231211103740-d9332ae51f04 h1:zBx+p/W2aQYtNuyZNcTfinWvXBQwYtDfme051PR/lAY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -261,8 +261,6 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb h1:ejEomhJX7G4p8dFImv2zcQd2Oa0IpWIeB/FUZRnpQKg= -github.com/rymdport/portal v0.0.0-20231123202536-da45518a87bb/go.mod h1:RYYAnv4sssTQ7ceErKl7UD8auER/0yFV7CgmfS/uAD8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -660,6 +658,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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/js/dom v0.0.0-20210725211120-f030747120f2 h1:oomkgU6VaQDsV6qZby2uz1Lap0eXmku8+2em3A/l700= +honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2/go.mod h1:sUMDUKNB2ZcVjt92UnLy3cdGs+wDAcrPdV3JP6sVgA4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 9bef6694d6eeb076cc0c05adc8a9c0e5e84bc03b Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 11 Feb 2024 16:41:48 +0000 Subject: [PATCH 17/43] Add quake mode terminal module --- cmd/fynedesk/main.go | 1 + go.mod | 5 ++ go.sum | 13 ++- internal/ui/desk.go | 5 ++ internal/x11/win/client.go | 15 ++++ internal/x11/wm/desk.go | 7 +- modules/desktops/pager.go | 2 +- modules/quaketerm/init.go | 7 ++ modules/quaketerm/term.go | 164 +++++++++++++++++++++++++++++++++++++ test/window.go | 5 +- window.go | 1 + 11 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 modules/quaketerm/init.go create mode 100644 modules/quaketerm/term.go diff --git a/cmd/fynedesk/main.go b/cmd/fynedesk/main.go index 4f13a893..31cbf6e5 100644 --- a/cmd/fynedesk/main.go +++ b/cmd/fynedesk/main.go @@ -7,6 +7,7 @@ import ( _ "fyshos.com/fynedesk/modules/desktops" _ "fyshos.com/fynedesk/modules/fyles" _ "fyshos.com/fynedesk/modules/launcher" + _ "fyshos.com/fynedesk/modules/quaketerm" _ "fyshos.com/fynedesk/modules/status" _ "fyshos.com/fynedesk/modules/systray" diff --git a/go.mod b/go.mod index 5fe39d07..b8ce7df2 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,12 @@ require ( howett.net/plist v0.0.0-20181124034731-591f970eefbb ) +require github.com/creack/pty v1.1.11 // indirect + require ( fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 // indirect + github.com/ActiveState/termtest/conpty v0.5.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -29,6 +33,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect + github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 // indirect github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect diff --git a/go.sum b/go.sum index 61bdb42b..6e397aed 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,10 @@ fyne.io/fyne/v2 v2.4.4 h1:4efSRpoikcGbqQN83yzC9WmF8UNq9olsaJQ/Ejme6Z8= fyne.io/fyne/v2 v2.4.4/go.mod h1:VyrxAOZ3NRZRWBvNIJbfqoKOG4DdbewoPk7ozqJKNPY= fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 h1:E/gHmMVyk8TuI6JIgNIv/Qu1JABMVFBIkQ8lYRa5gkQ= fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= +github.com/ActiveState/termtest/conpty v0.5.0 h1:JLUe6YDs4Jw4xNPCU+8VwTpniYOGeKzQg4SM2YHQNA8= +github.com/ActiveState/termtest/conpty v0.5.0/go.mod h1:LO4208FLsxw6DcNZ1UtuGUMW+ga9PFtX4ntv8Ymg9og= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= @@ -70,6 +74,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -95,6 +101,8 @@ github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= +github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f h1:i+TynW/8eeknoct3S234fwOLIwobeD2ujxVo3jgpIjA= +github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f/go.mod h1:H0b/BtaKEdivaCBKKPIiTEVPt9yG7rLJCj2AR49hi8M= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= github.com/fyshos/fyles v0.0.0-20240105185750-ba0c41e1f720 h1:vxPbMYBDz3sA9Cv1+06yF24p/HssWP2jJjf2u0tNgik= @@ -220,7 +228,6 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -246,6 +253,7 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -447,6 +455,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -645,8 +654,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 5b9c1fa9..6d559bde 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -67,6 +67,11 @@ func (l *desktop) SetDesktop(id int) { fyne.NewAnimation(canvas.DurationStandard, func(f float32) { for i, item := range l.wm.Windows() { + // TODO move this to floating once we support them + if item.Properties().SkipTaskbar() { + continue + } + newX := starts[i].X + deltas[i].DX*f newY := starts[i].Y + deltas[i].DY*f diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index 9db09366..922202a6 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -211,6 +211,9 @@ func (c *client) Maximized() bool { } func (c *client) Move(pos fyne.Position) { + if c.frame == nil { + return + } screen := fynedesk.Instance().Screens().ScreenForWindow(c) targetX := int16(pos.X * screen.CanvasScale()) @@ -317,7 +320,19 @@ func (c *client) Position() fyne.Position { float32(c.frame.y)/screen.CanvasScale()) } +func (c *client) Resize(s fyne.Size) { + if c.frame == nil { + return + } + screen := fynedesk.Instance().Screens().ScreenForWindow(c) + + c.frame.updateGeometry(c.frame.x, c.frame.y, uint16(s.Width*screen.Scale), uint16(s.Height*screen.Scale), false) +} + func (c *client) Size() fyne.Size { + if c.frame == nil { + return fyne.Size{} + } screen := fynedesk.Instance().Screens().ScreenForWindow(c) return fyne.NewSize( diff --git a/internal/x11/wm/desk.go b/internal/x11/wm/desk.go index c047b93a..76247c8c 100644 --- a/internal/x11/wm/desk.go +++ b/internal/x11/wm/desk.go @@ -84,6 +84,7 @@ const ( keyCodeEscape = 9 keyCodeTab = 23 keyCodeReturn = 36 + keyCodeBacktick = 49 keyCodeAlt = 64 keyCodeSpace = 65 keyCodePrintScreen = 107 @@ -339,10 +340,12 @@ func (x *x11WM) keyNameToCode(n fyne.KeyName) xproto.Keycode { return keyCodeUp case fyne.KeyDown: return keyCodeDown - case deskDriver.KeyPrintScreen: - return keyCodePrintScreen case fyne.KeyTab: return keyCodeTab + case fyne.KeyBackTick: + return keyCodeBacktick + case deskDriver.KeyPrintScreen: + return keyCodePrintScreen case fynedesk.KeyBrightnessDown: return keyCodeBrightLess case fynedesk.KeyBrightnessUp: diff --git a/modules/desktops/pager.go b/modules/desktops/pager.go index 31dc2a19..e21dd8d1 100644 --- a/modules/desktops/pager.go +++ b/modules/desktops/pager.go @@ -87,7 +87,7 @@ func (p *pager) refreshFrom(oldID int) { for j := len(wins) - 1; j >= 0; j-- { win := wins[j] - if win.Iconic() { + if win.Iconic() || win.Properties().SkipTaskbar() { continue } diff --git a/modules/quaketerm/init.go b/modules/quaketerm/init.go new file mode 100644 index 00000000..b722e342 --- /dev/null +++ b/modules/quaketerm/init.go @@ -0,0 +1,7 @@ +package launcher + +import "fyshos.com/fynedesk" + +func init() { + fynedesk.RegisterModule(termMeta) +} diff --git a/modules/quaketerm/term.go b/modules/quaketerm/term.go new file mode 100644 index 00000000..7e3510d8 --- /dev/null +++ b/modules/quaketerm/term.go @@ -0,0 +1,164 @@ +package launcher + +import ( + "time" + + "fyshos.com/fynedesk" + "fyshos.com/fynedesk/internal/ui" + wmTheme "fyshos.com/fynedesk/theme" + "github.com/fyne-io/terminal" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/theme" +) + +const ( + delay = time.Second / 25 + termTitle = "Quake Terminal " + ui.SkipTaskbarHint + height = 240 + step = 40 +) + +var termMeta = fynedesk.ModuleMetadata{ + Name: "\"Quake\" (hover) terminal", + NewInstance: newTerm, +} + +type term struct { + shown bool + win fynedesk.Window + ui fyne.Window +} + +func (t *term) Destroy() { +} + +func (t *term) Metadata() fynedesk.ModuleMetadata { + return termMeta +} + +func (t *term) Shortcuts() map[*fynedesk.Shortcut]func() { + return map[*fynedesk.Shortcut]func(){ + &fynedesk.Shortcut{Name: "Open Quake Terminal", KeyName: fyne.KeyBackTick, Modifier: fynedesk.UserModifier}: func() { + t.toggle() + }} +} + +func (t *term) createTerm() { + win := fyne.CurrentApp().Driver().(desktop.Driver).CreateSplashWindow() + win.SetTitle(termTitle) + + bg := canvas.NewRectangle(theme.BackgroundColor()) + img := canvas.NewImageFromResource(theme.NewDisabledResource(theme.ComputerIcon())) + img.FillMode = canvas.ImageFillContain + img.SetMinSize(fyne.NewSize(200, 200)) + over := canvas.NewRectangle(wmTheme.WidgetPanelBackground()) + matchTheme(bg, over) + + console := terminal.New() + win.SetContent(container.NewStack(bg, img, over, console)) + win.Canvas().Focus(console) + t.ui = win + + go func() { + err := console.RunLocalShell() + if err != nil { + fyne.LogError("Failed to open terminal", err) + } + t.hide() // terminal exited + + t.createTerm() // reset for next usage + }() +} + +func (t *term) getHandle() fynedesk.Window { + // TODO a better way to capture window frame without showing it and waiting... + //t.ui.Resize(fyne.NewSize(0, 0)) + t.ui.Show() + + i := 0 + for { + time.Sleep(time.Second / 50) + + for _, w := range fynedesk.Instance().WindowManager().Windows() { + if w.Properties().Title() == termTitle { + return w + } + } + + i++ + if i > 50 { + return nil // something went wrong + } + } +} + +func (t *term) hide() { + screen := fynedesk.Instance().Screens().Primary() + left := float32(screen.X) / screen.Scale + y := float32(screen.Y) / screen.Scale + end := float32(screen.Y)/screen.Scale - height + for y > end { + t.win.Move(fyne.NewPos(left, y)) + time.Sleep(delay) + y -= step + } + t.win.Move(fyne.NewPos(left, end)) + + t.ui.Hide() + t.shown = false +} + +func (t *term) show() { + screen := fynedesk.Instance().Screens().Primary() + t.win.Resize(fyne.NewSize(float32(screen.Width)/screen.Scale, height)) + // t.ui.Show() + t.win.RaiseToTop() + + left := float32(screen.X) / screen.Scale + y := float32(screen.Y)/screen.Scale - height + end := float32(screen.Y) / screen.Scale + for y < end { + t.win.Resize(fyne.NewSize(float32(screen.Width)/screen.Scale, height)) // force it ASAP + t.win.Move(fyne.NewPos(left, y)) + time.Sleep(delay) + y += step + } + t.win.Move(fyne.NewPos(left, end)) + t.shown = true +} + +func (t *term) toggle() { + if !t.shown { + t.win = t.getHandle() + + t.show() + } else { + t.hide() + t.win = nil + } +} + +func matchTheme(bg, over *canvas.Rectangle) { + ch := make(chan fyne.Settings) + go func() { + for { + <-ch + + bg.FillColor = theme.BackgroundColor() + bg.Refresh() + over.FillColor = wmTheme.WidgetPanelBackground() + over.Refresh() + } + }() + fyne.CurrentApp().Settings().AddChangeListener(ch) +} + +func newTerm() fynedesk.Module { + t := &term{} + t.createTerm() + return t +} diff --git a/test/window.go b/test/window.go index 29955cac..7ae6f133 100644 --- a/test/window.go +++ b/test/window.go @@ -82,7 +82,7 @@ func (w *Window) Maximized() bool { } // Move the window, does nothing in test windows -func (w *Window) Move(fyne.Position) {} +func (w *Window) Move(_ fyne.Position) {} // Parent returns a window that this should be positioned within, if set. func (w *Window) Parent() fynedesk.Window { @@ -94,6 +94,9 @@ func (w *Window) Position() fyne.Position { return fyne.NewPos(0, 0) } +// Resize the window, does nothing in test windows +func (w *Window) Resize(_ fyne.Size) {} + // Size returns 0x0 for test windows func (w *Window) Size() fyne.Size { return fyne.Size{} } diff --git a/window.go b/window.go index 47699e35..2d2188f4 100644 --- a/window.go +++ b/window.go @@ -32,6 +32,7 @@ type Window interface { Position() fyne.Position Size() fyne.Size Move(position fyne.Position) + Resize(fyne.Size) Desktop() int SetDesktop(int) From 0bb4c5b59bd3db558157dc77e9e9b196e33be3a2 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 20 Feb 2024 09:01:40 +0000 Subject: [PATCH 18/43] Don't load the UI if the terminal is not used --- modules/quaketerm/term.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/quaketerm/term.go b/modules/quaketerm/term.go index 7e3510d8..f24886cb 100644 --- a/modules/quaketerm/term.go +++ b/modules/quaketerm/term.go @@ -132,6 +132,10 @@ func (t *term) show() { } func (t *term) toggle() { + if t.ui == nil { + t.createTerm() // lazy load UI + } + if !t.shown { t.win = t.getHandle() @@ -158,7 +162,6 @@ func matchTheme(bg, over *canvas.Rectangle) { } func newTerm() fynedesk.Module { - t := &term{} - t.createTerm() - return t + // don't load UI until it is first called on + return &term{} } From 10321691284270b28733d910b85b0f027e7be798 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 24 Feb 2024 10:40:58 +0000 Subject: [PATCH 19/43] Prep for release --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70dc5f6..2cda0a93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,9 @@ More detailed release notes can be found on the [releases page](https://github.c * Virtual desktops and pager widget * Add support for permissions requests in apps -* Add app search to app bar * Add systray module * Support launching xscreenaver for screen lock +* Include a "Quake mode" terminal module using +` key ### Changed @@ -19,6 +19,7 @@ More detailed release notes can be found on the [releases page](https://github.c * Show a dialog to confirm before logging out * Move to abstract light/dark backgrounds from Jost Grant * Update to Fyne 2.4 theme with rounded corners +* Add app search to app bar * Dim iconified windows in switcher ### Fixed From f9d69e0c6710c7c7a5625636e1544397e0b1f842 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 24 Feb 2024 16:35:29 +0000 Subject: [PATCH 20/43] Add a shiny new about screen --- internal/ui/about.go | 155 ++++++++++++++++++++++++++++----- internal/ui/about_bundled.go | 12 +++ theme/assets/fish_onwhite.png | Bin 0 -> 20001 bytes theme/assets/fyne_about_bg.png | Bin 61613 -> 0 bytes theme/bundled.go | 10 +-- theme/theme.go | 4 +- 6 files changed, 152 insertions(+), 29 deletions(-) create mode 100644 internal/ui/about_bundled.go create mode 100644 theme/assets/fish_onwhite.png delete mode 100644 theme/assets/fyne_about_bg.png diff --git a/internal/ui/about.go b/internal/ui/about.go index b1539c71..3891d934 100644 --- a/internal/ui/about.go +++ b/internal/ui/about.go @@ -1,31 +1,34 @@ +//go:generate fyne bundle -o about_bundled.go -package ui -name resourceAuthors ../../AUTHORS + package ui import ( + "image/color" "net/url" "runtime/debug" + "strings" + + theme2 "fyshos.com/fynedesk/theme" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" - - wmTheme "fyshos.com/fynedesk/theme" ) -func newURLButton(label, link string) *widget.Button { - return widget.NewButton(label, func() { - u, err := url.Parse(link) - if err != nil { - fyne.LogError("Could not parse URL", err) - } +// Authors contains the list of the toolkit authors, extracted from ../../../AUTHORS. +var Authors = resourceAuthors - err = fyne.CurrentApp().OpenURL(u) - if err != nil { - fyne.LogError("", err) - } - }) +func newURLButton(label, link string) *widget.Hyperlink { + u, _ := url.Parse(link) + return widget.NewHyperlink(label, u) } +// showAbout opens a parallax about screen mimicking (and using code from) +// the [fyne_demo](https://github.com/fyne-io/fyne/tree/develop/cmd/fyne_demo) +// welcome panel. func (w *widgetPanel) showAbout() { if w.about != nil { w.about.CenterOnScreen() @@ -41,25 +44,70 @@ func (w *widgetPanel) showAbout() { } win := fyne.CurrentApp().NewWindow("About FyneDesk") - title := widget.NewRichTextFromMarkdown("**Version:** " + version()) - title.Segments[0].(*widget.TextSegment).Style.Alignment = fyne.TextAlignCenter - authors := widget.NewRichTextFromMarkdown("\n**Authors:**\n\n * Andy Williams\n * Stephen Houston\n * Jacob Alzén\n * Tai Groot\n") - buttons := container.NewGridWithColumns(3, + logo := canvas.NewImageFromResource(theme2.FyshOSLogo) + logo.FillMode = canvas.ImageFillContain + logo.SetMinSize(fyne.NewSize(256, 256)) + + footer := container.NewHBox( + layout.NewSpacer(), newURLButton("Home Page", "https://fyshos.com/fynedesk"), + widget.NewLabel("-"), newURLButton("Report Issue", "https://github.com/FyshOS/fynedesk/issues/new"), + widget.NewLabel("-"), newURLButton("Sponsor", "https://github.com/sponsors/fyne-io"), + layout.NewSpacer(), ) - bg := canvas.NewImageFromResource(wmTheme.FyneAboutBackground) - bg.FillMode = canvas.ImageFillContain - bg.Translucency = 0.67 - win.SetContent(container.NewStack(bg, container.NewBorder(title, buttons, nil, nil, authors))) + authors := widget.NewRichTextFromMarkdown(formatAuthors(string(Authors.Content()))) + content := container.NewVBox( + container.NewCenter( + widget.NewRichTextFromMarkdown("**Version:** "+version())), + logo, + container.NewCenter(authors), + widget.NewLabelWithStyle("\nWith great thanks to our many kind contributors\n", fyne.TextAlignCenter, fyne.TextStyle{Italic: true})) + scroll := container.NewScroll(content) + + bgColor := withAlpha(theme.BackgroundColor(), 0xe0) + shadowColor := withAlpha(theme.BackgroundColor(), 0x33) + + underlay := canvas.NewImageFromResource(theme2.FyshOSLogo) + bg := canvas.NewRectangle(bgColor) + underlayer := underLayout{} + slideBG := container.New(underlayer, underlay) + footerBG := canvas.NewRectangle(shadowColor) + + listen := make(chan fyne.Settings) + fyne.CurrentApp().Settings().AddChangeListener(listen) + go func() { + for range listen { + bgColor = withAlpha(theme.BackgroundColor(), 0xe0) + bg.FillColor = bgColor + bg.Refresh() + + shadowColor = withAlpha(theme.BackgroundColor(), 0x33) + footerBG.FillColor = bgColor + footer.Refresh() + } + }() + + underlay.Resize(fyne.NewSize(512, 512)) + scroll.OnScrolled = func(p fyne.Position) { + underlayer.offset = -p.Y / 3 + underlayer.Layout(slideBG.Objects, slideBG.Size()) + } + + bgClip := container.NewScroll(slideBG) + bgClip.Direction = container.ScrollNone + win.SetContent(container.NewStack(container.New(unpad{top: true}, bgClip, bg), + container.NewBorder(nil, + container.NewStack(footerBG, footer), nil, nil, + container.New(unpad{top: true, bottom: true}, scroll)))) win.SetCloseIntercept(func() { win.Hide() }) w.about = win - win.CenterOnScreen() + win.Resize(fyne.NewSize(340, 280)) win.Show() } @@ -70,3 +118,66 @@ func version() string { return "(devel)" } + +func withAlpha(c color.Color, alpha uint8) color.Color { + r, g, b, _ := c.RGBA() + return color.NRGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: alpha} +} + +type underLayout struct { + offset float32 +} + +func (u underLayout) Layout(objs []fyne.CanvasObject, size fyne.Size) { + under := objs[0] + left := size.Width/2 - under.Size().Width/2 + under.Move(fyne.NewPos(left, u.offset-50)) +} + +func (u underLayout) MinSize(_ []fyne.CanvasObject) fyne.Size { + return fyne.Size{} +} + +type unpad struct { + top, bottom bool +} + +func (u unpad) Layout(objs []fyne.CanvasObject, s fyne.Size) { + pad := theme.Padding() + var pos fyne.Position + if u.top { + pos = fyne.NewPos(0, -pad) + } + size := s + if u.top { + size = size.AddWidthHeight(0, pad) + } + if u.bottom { + size = size.AddWidthHeight(0, pad) + } + for _, o := range objs { + o.Move(pos) + o.Resize(size) + } +} + +func (u unpad) MinSize(_ []fyne.CanvasObject) fyne.Size { + return fyne.NewSize(100, 100) +} + +func formatAuthors(lines string) string { + markdown := &strings.Builder{} + markdown.WriteString("### Authors\n\n") + + for _, line := range strings.Split(lines, "\n") { + if len(line) == 0 { + continue + } + + markdown.WriteString("* ") + markdown.WriteString(line) + markdown.WriteByte('\n') + } + + return markdown.String() +} diff --git a/internal/ui/about_bundled.go b/internal/ui/about_bundled.go new file mode 100644 index 00000000..3f18a4cf --- /dev/null +++ b/internal/ui/about_bundled.go @@ -0,0 +1,12 @@ +// auto-generated +// Code generated by '$ fyne bundle'. DO NOT EDIT. + +package ui + +import "fyne.io/fyne/v2" + +var resourceAuthors = &fyne.StaticResource{ + StaticName: "AUTHORS", + StaticContent: []byte( + "Andy Williams \nStephen Houston \nJacob Alzén \nTai Groot \n"), +} diff --git a/theme/assets/fish_onwhite.png b/theme/assets/fish_onwhite.png new file mode 100644 index 0000000000000000000000000000000000000000..89ede2610019f9dd1880f69f72b2ff5bc416897c GIT binary patch literal 20001 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 PLTnaiE}E7bJ4gKwUR=j) literal 0 HcmV?d00001 diff --git a/theme/assets/fyne_about_bg.png b/theme/assets/fyne_about_bg.png deleted file mode 100644 index 553b9608937e84d2f50a948fba396c76dd8d8ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61613 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 Date: Sat, 24 Feb 2024 16:38:19 +0000 Subject: [PATCH 21/43] Move about window to current destop --- internal/ui/about.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/ui/about.go b/internal/ui/about.go index 3891d934..65500f91 100644 --- a/internal/ui/about.go +++ b/internal/ui/about.go @@ -36,6 +36,7 @@ func (w *widgetPanel) showAbout() { for _, win := range w.desk.WindowManager().Windows() { if win.Properties().Title() == w.about.Title() { + win.SetDesktop(w.desk.Desktop()) w.desk.WindowManager().RaiseToTop(win) break } From 54ddbfb8cfdd0c8576723a4d47c5469ef4137718 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 2 Mar 2024 20:20:35 +0000 Subject: [PATCH 22/43] Update name, doc and release date --- AUTHORS | 2 +- CHANGELOG.md | 4 ++-- internal/ui/about_bundled.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index c232c953..b1958226 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,4 @@ Andy Williams Stephen Houston -Jacob Alzén +Jacob Alzén Tai Groot diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cda0a93..7480e426 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ # Changelog This file lists the main changes with each version of the FyneDesk project. -More detailed release notes can be found on the [releases page](https://github.com/fyne-io/desktop/releases). +More detailed release notes can be found on the [releases page](https://github.com/fyshos/fynedesk/releases). -## 0.4 - Ongoing +## 0.4 - 2 March 2024 ### Added diff --git a/internal/ui/about_bundled.go b/internal/ui/about_bundled.go index 3f18a4cf..0e1add9a 100644 --- a/internal/ui/about_bundled.go +++ b/internal/ui/about_bundled.go @@ -8,5 +8,5 @@ import "fyne.io/fyne/v2" var resourceAuthors = &fyne.StaticResource{ StaticName: "AUTHORS", StaticContent: []byte( - "Andy Williams \nStephen Houston \nJacob Alzén \nTai Groot \n"), + "Andy Williams \nStephen Houston \nJacob Alzén jacalz@tutanota.com>\nTai Groot \n"), } From 0aafac8c046ec480668d4ec4b35b6ec5d1de05c2 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 18 Mar 2024 12:39:36 +0000 Subject: [PATCH 23/43] Better error handling for background load errors --- internal/ui/background.go | 2 +- internal/x11/wm/desk.go | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/ui/background.go b/internal/ui/background.go index 311e9ab9..a4819997 100644 --- a/internal/ui/background.go +++ b/internal/ui/background.go @@ -42,7 +42,7 @@ func (b *background) loadModules() []fyne.CanvasObject { func (b *background) updateBackground(path string) { _, err := os.Stat(path) - if path == "" || os.IsNotExist(err) { + if path == "" || err != nil { set := fyne.CurrentApp().Settings() src := &builtin.Builtin{} b.wallpaper.Objects[0] = src.Load(set.Theme(), set.ThemeVariant()) diff --git a/internal/x11/wm/desk.go b/internal/x11/wm/desk.go index 76247c8c..87e19059 100644 --- a/internal/x11/wm/desk.go +++ b/internal/x11/wm/desk.go @@ -850,14 +850,15 @@ func (x *x11WM) updatedBackgroundImage(w, h int) image.Image { file, err := os.Open(path) if err != nil { fyne.LogError("Failed to open background image", err) + } else { + img, _, err := image.Decode(file) + if err != nil { + fyne.LogError("Failed to read background image", err) + } else { + _ = file.Close() + return resize.Resize(uint(w), uint(h), img, resize.Lanczos3) + } } - img, _, err := image.Decode(file) - if err != nil { - fyne.LogError("Failed to read background image", err) - } - _ = file.Close() - - return resize.Resize(uint(w), uint(h), img, resize.Lanczos3) } set := fyne.CurrentApp().Settings() From da10f03616c70f4174f0f34031e04a92d0b3828b Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 26 May 2024 22:04:24 +0100 Subject: [PATCH 24/43] Ensure we show the item in launcher that is highlighted --- internal/ui/launcher.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/ui/launcher.go b/internal/ui/launcher.go index 1ade20ed..0637584b 100644 --- a/internal/ui/launcher.go +++ b/internal/ui/launcher.go @@ -42,6 +42,7 @@ type picker struct { entry *appEntry appList *fyne.Container + appScroll *container.Scroll activeIndex int } @@ -62,14 +63,22 @@ func (l *picker) setActiveIndex(index int) { return } - l.appList.Objects[l.activeIndex].(*widget.Button).Importance = widget.MediumImportance - l.appList.Objects[index].(*widget.Button).Importance = widget.HighImportance + oldActive := l.appList.Objects[l.activeIndex].(*widget.Button) + oldActive.Importance = widget.MediumImportance + oldActive.Refresh() + active := l.appList.Objects[index].(*widget.Button) + active.Importance = widget.HighImportance + active.Refresh() + l.activeIndex = index - l.appList.Refresh() + l.appScroll.Offset = fyne.NewPos(0, + active.Position().Y+active.Size().Height/2-l.appScroll.Size().Height/2) + l.appScroll.Refresh() } func (l *picker) updateAppListMatching(input string) { l.activeIndex = 0 + l.appScroll.ScrollToTop() l.appList.Objects = l.appButtonListMatching(input) l.appList.Refresh() } @@ -159,7 +168,7 @@ func newAppPicker(title string, callback func(fynedesk.AppData)) *picker { appList := container.NewVBox() appScroller := container.NewScroll(appList) - l := &picker{win: win, desk: fynedesk.Instance(), appList: appList, callback: callback} + l := &picker{win: win, desk: fynedesk.Instance(), appList: appList, appScroll: appScroller, callback: callback} entry := &appEntry{pick: l} entry.ExtendBaseWidget(entry) From 2868348a315b1db1d1d72f620f352a2a9490538e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 26 May 2024 22:10:12 +0100 Subject: [PATCH 25/43] Simplify menu overlay code and support multiple menus appearing --- internal/x11/wm/desk.go | 16 ++++++---------- internal/x11/wm/events.go | 10 +++++----- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/internal/x11/wm/desk.go b/internal/x11/wm/desk.go index 87e19059..676b0992 100644 --- a/internal/x11/wm/desk.go +++ b/internal/x11/wm/desk.go @@ -56,13 +56,12 @@ type x11WM struct { currentBindings []*fynedesk.Shortcut - died bool - rootID, menuID xproto.Window - menuSize fyne.Size - menuPos fyne.Position - menuWin fyne.Window - transientMap map[xproto.Window][]xproto.Window - oldRoot *xgraphics.Image + died bool + rootID xproto.Window + menuSize fyne.Size + menuPos fyne.Position + transientMap map[xproto.Window][]xproto.Window + oldRoot *xgraphics.Image } type moveResizeType uint32 @@ -247,7 +246,6 @@ func (x *x11WM) ShowOverlay(w fyne.Window, s fyne.Size, p fyne.Position) { w.Show() x.menuSize = s x.menuPos = p - x.menuWin = w } func (x *x11WM) ShowMenuOverlay(m *fyne.Menu, s fyne.Size, p fyne.Position) { @@ -289,7 +287,6 @@ func (x *x11WM) ShowModal(w fyne.Window, s fyne.Size) { p := fyne.NewPos((float32(root.Width)/scale-s.Width)/2, (float32(root.Height)/scale-s.Height)/2) x.menuPos = p - x.menuWin = w } func (x *x11WM) X() *xgbutil.XUtil { @@ -743,7 +740,6 @@ func (x *x11WM) showWindow(win xproto.Window, parent xproto.Window) { if name == windowNameMenu { x11.WindowExtendedHintsAdd(x.x, win, "_NET_WM_STATE_SKIP_TASKBAR") x11.WindowExtendedHintsAdd(x.x, win, "_NET_WM_STATE_SKIP_PAGER") - x.menuID = win xproto.ChangeWindowAttributes(x.Conn(), win, xproto.CwEventMask, []uint32{xproto.EventMaskLeaveWindow}) screen := fynedesk.Instance().Screens().Primary() diff --git a/internal/x11/wm/events.go b/internal/x11/wm/events.go index 9ee5c7ad..346f0528 100644 --- a/internal/x11/wm/events.go +++ b/internal/x11/wm/events.go @@ -232,11 +232,11 @@ func (x *x11WM) handleMouseEnter(ev xproto.EnterNotifyEvent) { } func (x *x11WM) handleMouseLeave(ev xproto.LeaveNotifyEvent) { - if ev.Event == x.menuID { // dismiss overlay menus on mouse out - x.menuID = 0 - if x.menuWin != nil { - x.menuWin.Close() - x.menuWin = nil + win := x.clientForWin(ev.Event) + if win == nil { + // dismiss overlay menus on mouse out + if x11.WindowName(x.X(), ev.Event) == windowNameMenu { + xproto.UnmapWindow(x.x.Conn(), ev.Event) } } From 4025eda6b6b5ac44db5e7bb6d0a2bd09301ad506 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 26 May 2024 22:12:35 +0100 Subject: [PATCH 26/43] Open bar menu as an overlay so it is above windows --- internal/ui/baricon.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/internal/ui/baricon.go b/internal/ui/baricon.go index 7e3aa818..e5914554 100644 --- a/internal/ui/baricon.go +++ b/internal/ui/baricon.go @@ -113,7 +113,7 @@ func removeFromBar(icon fynedesk.AppData) { } // TappedSecondary means barIcon has been clicked by a secondary binding -func (bi *barIcon) TappedSecondary(*fyne.PointEvent) { +func (bi *barIcon) TappedSecondary(ev *fyne.PointEvent) { app := bi.appData if app == nil && bi.windowData != nil { app = bi.windowData.findApp() @@ -136,10 +136,8 @@ func (bi *barIcon) TappedSecondary(*fyne.PointEvent) { addRemove.Label = "Pin " + app.Name() } - c := fyne.CurrentApp().Driver().CanvasForObject(bi) - pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(bi) - menu = widget.NewPopUpMenu(fyne.NewMenu("", []*fyne.MenuItem{addRemove}...), c) - menu.ShowAtPosition(pos) + items := []*fyne.MenuItem{addRemove} + fynedesk.Instance().ShowMenuAt(fyne.NewMenu("", items...), ev.AbsolutePosition) } // CreateRenderer is a private method to fyne which links this widget to its renderer From 4c47e7878d70b8f1b89c1fb18f0160eef471e007 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 2 Jun 2024 19:09:42 +0100 Subject: [PATCH 27/43] Don't reshuffle windows on iconify --- internal/x11/win/frame.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/x11/win/frame.go b/internal/x11/win/frame.go index b43ba0f8..bad9e9a1 100644 --- a/internal/x11/win/frame.go +++ b/internal/x11/win/frame.go @@ -462,15 +462,17 @@ func (f *frame) getInnerWindowCoordinates(w uint16, h uint16) (uint32, uint32, u func (f *frame) hide() { stack := f.client.wm.Windows() - for i := len(stack) - 1; i >= 0; i-- { + for i := 0; i < len(stack); i++ { if stack[i] == (interface{})(f.client).(fynedesk.Window) { continue } - if !stack[i].Iconic() { - stack[i].RaiseToTop() - stack[i].Focus() + if stack[i].Iconic() { + continue } + + stack[i].Focus() + break } borderWidth := x11.BorderWidth(x11.XWin(f.client)) From 83a70a9668de68a274f426ab079da7aa0b38c062 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 2 Jun 2024 19:06:19 +0100 Subject: [PATCH 28/43] Add pinned windows which stick to the position when moving desktops --- internal/ui/desk.go | 3 +-- internal/x11/win/client.go | 24 ++++++++++++++++++++++++ modules/desktops/pager.go | 7 ++++++- modules/quaketerm/term.go | 1 + test/window.go | 18 +++++++++++++++++- window.go | 3 +++ wm/border.go | 34 ++++++++++++++++++++++++++++------ 7 files changed, 80 insertions(+), 10 deletions(-) diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 6d559bde..16ed19a4 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -67,8 +67,7 @@ func (l *desktop) SetDesktop(id int) { fyne.NewAnimation(canvas.DurationStandard, func(f float32) { for i, item := range l.wm.Windows() { - // TODO move this to floating once we support them - if item.Properties().SkipTaskbar() { + if item.Pinned() { continue } diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index 922202a6..4fe1a167 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -26,6 +26,7 @@ type client struct { full bool iconic bool maximized bool + pinned bool props *clientProperties restoreX, restoreY int16 @@ -129,6 +130,10 @@ func (c *client) SetDesktop(id int) { diff := id - c.desk c.desk = id + if c.pinned { + return + } + _, height := d.RootSizePixels() offPix := float32(diff * -int(height)) display := d.Screens().ScreenForWindow(c) @@ -312,6 +317,16 @@ func (c *client) Parent() fynedesk.Window { return nil } +func (c *client) Pin() { + c.pinned = true + d := fynedesk.Instance() + c.SetDesktop(d.Desktop()) +} + +func (c *client) Pinned() bool { + return c.pinned +} + func (c *client) Position() fyne.Position { screen := fynedesk.Instance().Screens().ScreenForWindow(c) @@ -409,6 +424,15 @@ func (c *client) Unmaximize() { c.maximizeMessage(x11.WindowStateActionRemove) } +func (c *client) Unpin() { + c.pinned = false + d := fynedesk.Instance() + id := d.Desktop() + c.desk = id + + c.SetDesktop(id) +} + func (c *client) fullscreenMessage(action x11.WindowStateAction) { err := ewmh.WmStateReq(c.wm.X(), c.win, int(action), "_NET_WM_STATE_FULLSCREEN") if err != nil { diff --git a/modules/desktops/pager.go b/modules/desktops/pager.go index e21dd8d1..57ce7a21 100644 --- a/modules/desktops/pager.go +++ b/modules/desktops/pager.go @@ -91,8 +91,13 @@ func (p *pager) refreshFrom(oldID int) { continue } - yPad := theme.Padding() * float32(win.Desktop()-oldID) + deskID := win.Desktop() + yPad := theme.Padding() * float32(deskID-oldID) screen := fynedesk.Instance().Screens().ScreenForWindow(win) + if win.Pinned() { + yPad = theme.Padding() * float32(desk.Desktop()-oldID) + yPad -= float32(oldID-desk.Desktop()) * pivot.Size().Height + } var obj fyne.CanvasObject obj = canvas.NewRectangle(theme.DisabledColor()) diff --git a/modules/quaketerm/term.go b/modules/quaketerm/term.go index f24886cb..12e72e18 100644 --- a/modules/quaketerm/term.go +++ b/modules/quaketerm/term.go @@ -139,6 +139,7 @@ func (t *term) toggle() { if !t.shown { t.win = t.getHandle() + t.win.Pin() t.show() } else { t.hide() diff --git a/test/window.go b/test/window.go index 7ae6f133..acd48242 100644 --- a/test/window.go +++ b/test/window.go @@ -12,7 +12,7 @@ import ( type Window struct { props dummyProperties - iconic, focused, fullscreen, maximized, raised bool + iconic, focused, fullscreen, maximized, raised, pinned bool parent fynedesk.Window x, y, desk int @@ -89,6 +89,16 @@ func (w *Window) Parent() fynedesk.Window { return w.parent } +// Pin requests that the window be visible on all desktops +func (w *Window) Pin() { + w.pinned = true +} + +// Pinned returns true if the window should be visible on all desktops +func (w *Window) Pinned() bool { + return w.pinned +} + // Position returns 0, 0 for test windows func (w *Window) Position() fyne.Position { return fyne.NewPos(0, 0) @@ -165,3 +175,9 @@ func (w *Window) Uniconify() { func (w *Window) Unmaximize() { w.maximized = false } + +// Unpin resets the state of being visible on all windows. +// The window will return to being visible on its specified desktop. +func (w *Window) Unpin() { + w.pinned = false +} diff --git a/window.go b/window.go index 2d2188f4..18c6cca2 100644 --- a/window.go +++ b/window.go @@ -36,6 +36,9 @@ type Window interface { Desktop() int SetDesktop(int) + Pin() + Pinned() bool + Unpin() } // WindowProperties encapsulates the metadata that a window can provide. diff --git a/wm/border.go b/wm/border.go index b9530dad..2e394ca2 100644 --- a/wm/border.go +++ b/wm/border.go @@ -142,6 +142,9 @@ func (c *Border) showMenu(from fyne.CanvasObject) { if c.win.Maximized() { max.Checked = true } + + pos := c.win.Position() + menuPos := pos.Add(from.Position()) menu := fyne.NewMenu("", title, fyne.NewMenuItemSeparator(), @@ -150,26 +153,45 @@ func (c *Border) showMenu(from fyne.CanvasObject) { }), max, fyne.NewMenuItemSeparator(), - c.makeDesktopMenu(), + c.makeDesktopMenu(menuPos), fyne.NewMenuItemSeparator(), fyne.NewMenuItem("Close", func() { c.win.Close() })) - pos := c.win.Position() - fynedesk.Instance().ShowMenuAt(menu, pos.Add(from.Position())) + fynedesk.Instance().ShowMenuAt(menu, menuPos) } -func (c *Border) makeDesktopMenu() *fyne.MenuItem { +func (c *Border) makeDesktopMenu(pos fyne.Position) *fyne.MenuItem { desks := make([]*fyne.MenuItem, 4) for i := 0; i < 4; i++ { deskID := i desks[i] = fyne.NewMenuItem(fmt.Sprintf("Desktop %d", i+1), func() { + if c.win.Pinned() { + c.win.Unpin() + } + c.win.SetDesktop(deskID) }) } - ret := fyne.NewMenuItem("Move to Desktop", nil) - ret.ChildMenu = fyne.NewMenu("", desks...) + pin := fyne.NewMenuItem("All Desktops", func() { + if c.win.Pinned() { + return + } + + c.win.Pin() + }) + if c.win.Pinned() { + pin.Checked = true + } + desks = append(desks, pin) + + ret := fyne.NewMenuItem("Move to Desktop", func() { + fynedesk.Instance().ShowMenuAt(fyne.NewMenu("", desks...), + pos.Add(fyne.NewSize(40, 120))) + + }) + ret.ChildMenu = fyne.NewMenu("") // No-op to add the arrow... return ret } From f383242288fa6ca2f7c224f868963fa798715199 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 11 Jun 2024 18:12:08 +0100 Subject: [PATCH 29/43] Update launcher icons to show transparent if iconified And update switcher to match --- internal/ui/bar.go | 16 +++++++++++++--- internal/ui/baricon.go | 6 ++++++ internal/ui/switcher.go | 2 +- internal/x11/win/client.go | 2 +- internal/x11/wm/events.go | 2 ++ internal/x11/wm/stack.go | 6 ++++++ modules/desktops/pager.go | 3 +++ wm.go | 1 + 8 files changed, 33 insertions(+), 5 deletions(-) diff --git a/internal/ui/bar.go b/internal/ui/bar.go index 3e799583..a0a1365d 100644 --- a/internal/ui/bar.go +++ b/internal/ui/bar.go @@ -160,10 +160,20 @@ func (b *bar) WindowRemoved(win fynedesk.Window) { if icon.windowData == nil || win != icon.windowData.win { continue } - if !win.Iconic() { - b.removeFromTaskbar(icon) - b.icons = append(b.icons[:i], b.icons[i+1:]...) + + b.removeFromTaskbar(icon) + b.icons = append(b.icons[:i], b.icons[i+1:]...) + break + } +} + +func (b *bar) WindowStateChanged(win fynedesk.Window) { + for _, icon := range b.icons { + if icon.windowData == nil || win != icon.windowData.win { + continue } + + icon.Refresh() break } } diff --git a/internal/ui/baricon.go b/internal/ui/baricon.go index e5914554..94f8c852 100644 --- a/internal/ui/baricon.go +++ b/internal/ui/baricon.go @@ -66,6 +66,12 @@ func (bi *barIconRenderer) Refresh() { } bi.Layout(bi.image.Size()) + if bi.image.windowData != nil && bi.image.windowData.win.Iconic() { + if img, ok := bi.objects[0].(*canvas.Image); ok { + img.Translucency = 0.67 + } + } + canvas.Refresh(bi.image) } diff --git a/internal/ui/switcher.go b/internal/ui/switcher.go index 10e471df..dba65e2e 100644 --- a/internal/ui/switcher.go +++ b/internal/ui/switcher.go @@ -47,7 +47,7 @@ func (s *switchIcon) CreateRenderer() fyne.WidgetRenderer { bg.CornerRadius = theme.InputRadiusSize() img := canvas.NewImageFromResource(res) if s.win.Iconic() { - img.Translucency = 0.8 + img.Translucency = 0.67 } text := widget.NewLabelWithStyle(title, fyne.TextAlignCenter, fyne.TextStyle{}) text.Truncation = fyne.TextTruncateEllipsis diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index 4fe1a167..a8242d93 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -246,8 +246,8 @@ func (c *client) NotifyFullscreen() { } func (c *client) NotifyIconify() { - c.frame.hide() c.iconic = true + c.frame.hide() x11.WindowExtendedHintsAdd(c.wm.X(), c.win, "_NET_WM_STATE_HIDDEN") } diff --git a/internal/x11/wm/events.go b/internal/x11/wm/events.go index 346f0528..c600816e 100644 --- a/internal/x11/wm/events.go +++ b/internal/x11/wm/events.go @@ -102,8 +102,10 @@ func (x *x11WM) handleClientMessage(ev xproto.ClientMessageEvent) { switch ev.Data.Bytes()[0] { case icccm.StateIconic: c.NotifyIconify() + x.publishWindowChange(c) case icccm.StateNormal: c.NotifyUnIconify() + x.publishWindowChange(c) } case "_NET_ACTIVE_WINDOW": x.handleActiveWin(ev) diff --git a/internal/x11/wm/stack.go b/internal/x11/wm/stack.go index 87588470..9ba84d1f 100644 --- a/internal/x11/wm/stack.go +++ b/internal/x11/wm/stack.go @@ -121,6 +121,12 @@ func (s *stack) indexForWin(win fynedesk.Window) int { return pos } +func (s *stack) publishWindowChange(win fynedesk.Window) { + for _, l := range s.listeners { + l.WindowStateChanged(win) + } +} + func (s *stack) removeFromStack(win fynedesk.Window) { pos := s.indexForWin(win) diff --git a/modules/desktops/pager.go b/modules/desktops/pager.go index 57ce7a21..65e93367 100644 --- a/modules/desktops/pager.go +++ b/modules/desktops/pager.go @@ -60,6 +60,9 @@ func (p *pager) WindowRemoved(_ fynedesk.Window) { p.refresh() } +func (p *pager) WindowStateChanged(_ fynedesk.Window) { +} + func (p *pager) refresh() { desk := fynedesk.Instance() p.refreshFrom(desk.Desktop()) diff --git a/wm.go b/wm.go index 618fbbd4..47ad37e7 100644 --- a/wm.go +++ b/wm.go @@ -36,6 +36,7 @@ type Stack interface { type StackListener interface { WindowAdded(Window) WindowRemoved(Window) + WindowStateChanged(Window) WindowMoved(Window) WindowOrderChanged() From 64cdab337e355eaabffa98457d75edf8c264907a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 11 Jun 2024 18:13:35 +0100 Subject: [PATCH 30/43] Include pinned windows in the switcher --- internal/ui/switcher.go | 2 +- internal/x11/wm/switcher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/ui/switcher.go b/internal/ui/switcher.go index dba65e2e..09cac29d 100644 --- a/internal/ui/switcher.go +++ b/internal/ui/switcher.go @@ -207,7 +207,7 @@ func (s *Switcher) loadIcons(list []fynedesk.Window) []fyne.CanvasObject { var ret []fyne.CanvasObject for _, item := range list { - if item.Desktop() != fynedesk.Instance().Desktop() { + if item.Desktop() != fynedesk.Instance().Desktop() && !item.Pinned() { continue } ret = append(ret, newSwitchIcon(s, item)) diff --git a/internal/x11/wm/switcher.go b/internal/x11/wm/switcher.go index cb37f0d5..5d01b6f7 100644 --- a/internal/x11/wm/switcher.go +++ b/internal/x11/wm/switcher.go @@ -72,7 +72,7 @@ func (x *x11WM) previousAppSwitcher() { func (x *x11WM) showOrSelectAppSwitcher(reverse bool) { var visible []fynedesk.Window for _, win := range x.clients { - if win.Desktop() == fynedesk.Instance().Desktop() && !win.Iconic() { + if win.Desktop() == fynedesk.Instance().Desktop() || win.Pinned() { visible = append(visible, win) } } From bce32043085febd544e48dde7f3bb233ce2c45f8 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 17 Jun 2024 19:34:43 +0100 Subject: [PATCH 31/43] support checks in the menu --- modules/systray/main.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/systray/main.go b/modules/systray/main.go index 08cf8f65..e190f58e 100644 --- a/modules/systray/main.go +++ b/modules/systray/main.go @@ -233,8 +233,13 @@ func (t *tray) parseMenuItem(id int32, menu *menu.Dbusmenu, in interface{}, pos } } else { ret.Label = fmt.Sprintf("%s", data["label"].Value()) + if checkType, ok := data["toggle-type"]; ok && checkType.Value() == "checkmark" { + if checkState, ok := data["toggle-state"]; ok && checkState.Value().(int32) > 0 { + ret.Checked = true + } + } ret.Action = func() { - err := menu.Event(t.conn.Context(), int32(id), "clicked", dbus.MakeVariant(id), uint32(time.Now().Unix())) + err := menu.Event(t.conn.Context(), id, "clicked", dbus.MakeVariant(id), uint32(time.Now().Unix())) if err != nil { fyne.LogError("Failed to message menu tap", err) } From a4125479607f877ef2636f0d6b762796653fbc19 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Aug 2024 17:46:03 +0100 Subject: [PATCH 32/43] Updating to Fyne release --- go.mod | 34 ++++++++++++++++++-------------- go.sum | 61 ++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index b8ce7df2..229027c7 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module fyshos.com/fynedesk -go 1.17 +go 1.19 require ( - fyne.io/fyne/v2 v2.4.4 + fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64 github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 @@ -15,15 +15,21 @@ require ( github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 github.com/mafik/pulseaudio v0.0.0-20200511091429-8449222912dd github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 - github.com/stretchr/testify v1.8.4 - golang.org/x/sys v0.15.0 + github.com/stretchr/testify v1.9.0 howett.net/plist v0.0.0-20181124034731-591f970eefbb ) -require github.com/creack/pty v1.1.11 // indirect +require github.com/creack/pty v1.1.21 // indirect require ( - fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect + github.com/nicksnyder/go-i18n/v2 v2.4.0 // indirect + github.com/rymdport/portal v0.2.2 // indirect +) + +require ( + fyne.io/systray v1.11.0 // indirect github.com/ActiveState/termtest/conpty v0.5.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect @@ -33,10 +39,10 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect - github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f + github.com/fyne-io/terminal v0.0.0-20240728203942-56c3b98b9208 github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 // indirect - github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect + github.com/go-text/render v0.1.0 // indirect github.com/go-text/typesetting v0.1.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect @@ -44,13 +50,13 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/yuin/goldmark v1.5.5 // indirect - golang.org/x/image v0.14.0 // indirect + github.com/yuin/goldmark v1.7.1 // indirect + golang.org/x/image v0.18.0 // indirect golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 + golang.org/x/text v0.16.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) replace github.com/BurntSushi/xgbutil => github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d diff --git a/go.sum b/go.sum index 6e397aed..5ffed466 100644 --- a/go.sum +++ b/go.sum @@ -37,10 +37,10 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.4.4 h1:4efSRpoikcGbqQN83yzC9WmF8UNq9olsaJQ/Ejme6Z8= -fyne.io/fyne/v2 v2.4.4/go.mod h1:VyrxAOZ3NRZRWBvNIJbfqoKOG4DdbewoPk7ozqJKNPY= -fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9 h1:E/gHmMVyk8TuI6JIgNIv/Qu1JABMVFBIkQ8lYRa5gkQ= -fyne.io/systray v1.10.1-0.20231230205326-d160fd363db9/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= +fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64 h1:AR8iFr+DKB3O7M17Mrmd89N/Dv0R4qzM6nX36kKDHMA= +fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64/go.mod h1:9D4oT3NWeG+MLi/lP7ItZZyujHC/qqMJpoGTAYX5Uqc= +fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= +fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/ActiveState/termtest/conpty v0.5.0 h1:JLUe6YDs4Jw4xNPCU+8VwTpniYOGeKzQg4SM2YHQNA8= github.com/ActiveState/termtest/conpty v0.5.0/go.mod h1:LO4208FLsxw6DcNZ1UtuGUMW+ga9PFtX4ntv8Ymg9og= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= @@ -50,6 +50,8 @@ github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd h1:u7K2oMFMd8APDV3fM1j2rO3U/XJf1g1qC3DDTKou8iM= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -74,8 +76,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -101,8 +103,8 @@ github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345 h1:ONkcbJmsWUOHyjUm0wlnkFc/uaacFFtStVbsG6qJfew= github.com/fyne-io/image v0.0.0-20221020213044-f609c6a24345/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= -github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f h1:i+TynW/8eeknoct3S234fwOLIwobeD2ujxVo3jgpIjA= -github.com/fyne-io/terminal v0.0.0-20240206170039-2e129cdfd85f/go.mod h1:H0b/BtaKEdivaCBKKPIiTEVPt9yG7rLJCj2AR49hi8M= +github.com/fyne-io/terminal v0.0.0-20240728203942-56c3b98b9208 h1:ZMTEq3IAv6EQv6XuMpF6KSBT+c0/ou/O9uxoQvPyA2c= +github.com/fyne-io/terminal v0.0.0-20240728203942-56c3b98b9208/go.mod h1:uTxDe2dNdJWfmUAgWwG+leivgNxSfCY50t+AiNdPmiM= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d h1:8+poQtDqiRfAZmeyYRlInuaIBsQEflmxtpJeZklvNuE= github.com/fyne-io/xgbutil v0.0.0-20191220152344-7d838166824d/go.mod h1:vPqYMuTmTyrLNDQWQXy9lqdnV+WRQn6jhaSon8TppBs= github.com/fyshos/fyles v0.0.0-20240105185750-ba0c41e1f720 h1:vxPbMYBDz3sA9Cv1+06yF24p/HssWP2jJjf2u0tNgik= @@ -113,13 +115,13 @@ github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVin github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 h1:7tf/0aw5DxRQjr7WaNqgtjidub6v21L2cogKIbMcTYw= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM= -github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-text/render v0.1.0 h1:osrmVDZNHuP1RSu3pNG7Z77Sd2xSbcb/xWytAj9kyVs= +github.com/go-text/render v0.1.0/go.mod h1:jqEuNMenrmj6QRnkdpeaP0oKGFLDNhDkVKwGjsWWYU4= github.com/go-text/typesetting v0.1.0 h1:vioSaLPYcHwPEPLT7gsjCGDCoYSbljxoHJzMnKwVvHw= github.com/go-text/typesetting v0.1.0/go.mod h1:d22AnmeKq/on0HNv73UFriMKc4Ez6EqZAofLhAzpSzI= -github.com/go-text/typesetting-utils v0.0.0-20231211103740-d9332ae51f04 h1:zBx+p/W2aQYtNuyZNcTfinWvXBQwYtDfme051PR/lAY= +github.com/go-text/typesetting-utils v0.0.0-20240329101916-eee87fb235a3 h1:levTnuLLUmpavLGbJYLJA7fQnKeS7P1eCdAlM+vReXk= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -218,6 +220,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 h1:2bRhR5GcMudCdaY4p8ip89hsvSyxYehLSicCNtygyVY= github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2/go.mod h1:Hj3TV9xrdt+g9apvBagVi/VzE41gSliEBypxaQDq5QA= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -253,6 +257,8 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM= +github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -269,6 +275,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/rymdport/portal v0.2.2 h1:P2Q/4k673zxdFAsbD8EESZ7psfuO6/4jNu6EDrDICkM= +github.com/rymdport/portal v0.2.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -296,8 +304,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -305,8 +313,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.5.5 h1:IJznPe8wOzfIKETmMkd06F8nXkmlhaHqFRM9l1hAGsU= -github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= @@ -342,8 +350,8 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -407,8 +415,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -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/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -478,8 +486,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -489,8 +497,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -662,13 +670,12 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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/js/dom v0.0.0-20210725211120-f030747120f2 h1:oomkgU6VaQDsV6qZby2uz1Lap0eXmku8+2em3A/l700= -honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2/go.mod h1:sUMDUKNB2ZcVjt92UnLy3cdGs+wDAcrPdV3JP6sVgA4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 63e5c68311daace25c4f977839f8f2dc89180ab7 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 29 Jun 2024 21:19:33 +0100 Subject: [PATCH 33/43] Add basic UI for theme selection Include a basic neon and matrix colour scheme for testing --- internal/ui/settings_ui.go | 88 +++++++++++++++++++++++++ internal/ui/themes/default/preview.png | Bin 0 -> 59256 bytes internal/ui/themes/matrix/preview.png | Bin 0 -> 70648 bytes internal/ui/themes/matrix/theme.json | 11 ++++ internal/ui/themes/neon/preview.png | Bin 0 -> 99359 bytes internal/ui/themes/neon/theme.json | 19 ++++++ 6 files changed, 118 insertions(+) create mode 100644 internal/ui/themes/default/preview.png create mode 100644 internal/ui/themes/matrix/preview.png create mode 100644 internal/ui/themes/matrix/theme.json create mode 100644 internal/ui/themes/neon/preview.png create mode 100644 internal/ui/themes/neon/theme.json diff --git a/internal/ui/settings_ui.go b/internal/ui/settings_ui.go index 5a2acc44..330c242e 100644 --- a/internal/ui/settings_ui.go +++ b/internal/ui/settings_ui.go @@ -1,8 +1,12 @@ package ui import ( + "embed" + "fmt" + "io" "os" "os/exec" + "path/filepath" "runtime" "sort" "strconv" @@ -25,6 +29,9 @@ import ( const randrHelper = "arandr" +//go:embed "themes/*" +var bundledThemes embed.FS + type settingsUI struct { settings *deskSettings win fyne.Window @@ -375,6 +382,86 @@ func (d *settingsUI) loadScreensGroup() fyne.CanvasObject { return screens } +func (d *settingsUI) loadThemeScreen() fyne.CanvasObject { + var themeList []string + + embedList, _ := bundledThemes.ReadDir("themes") + for _, dir := range embedList { + themeList = append(themeList, dir.Name()) + } + + storageRoot := fyne.CurrentApp().Storage().RootURI() + themes, _ := storage.Child(storageRoot, "themes") + list, err := storage.List(themes) + if err != nil { + fyne.LogError("Unable to list themes - missing?", err) + themeList = make([]string, 1) + } else { + for _, l := range list { + if false { + themeList = append(themeList, l.Name()) + } + } + } + + useTheme := func(name string) { + dest := filepath.Join(filepath.Dir(storageRoot.Path()), "theme.json") + out, _ := os.Create(dest) + defer out.Close() + if name == "default" { + _, _ = io.WriteString(out, "{}") + return + } + + var in io.ReadCloser + if builtin, err := bundledThemes.Open(filepath.Join("themes/", name, "theme.json")); err == nil { + in = builtin + } else { + source := filepath.Join(themes.Path(), name, "theme.json") + in, _ = os.Open(source) + } + defer in.Close() + + _, err = io.Copy(out, in) + } + return widget.NewList( + func() int { + return len(themeList) + }, + func() fyne.CanvasObject { + install := widget.NewButtonWithIcon("Install", theme.ComputerIcon(), nil) + preview := &canvas.Image{FillMode: canvas.ImageFillContain} + preview.SetMinSize(fyne.NewSize(160, 90)) + return container.NewBorder(nil, nil, nil, preview, + container.NewBorder(nil, install, nil, nil, + widget.NewRichTextFromMarkdown("## Theme Name\n\nDescription..."))) + }, + func(id widget.ListItemID, o fyne.CanvasObject) { + outer := o.(*fyne.Container) + inner := outer.Objects[0].(*fyne.Container) + b := inner.Objects[1].(*widget.Button) + b.OnTapped = func() { + useTheme(themeList[id]) + } + p := outer.Objects[1].(*canvas.Image) + if builtin, err := bundledThemes.Open(filepath.Join("themes/", themeList[id], "preview.png")); err == nil { + data, _ := io.ReadAll(builtin) + p.Resource = fyne.NewStaticResource(themeList[id]+"/preview.json", data) + p.File = "" + _ = builtin.Close() + } else { + source := filepath.Join(themes.Path(), themeList[id], "preview.png") + p.File = source + p.Resource = nil + } + p.Refresh() + + l := inner.Objects[0].(*widget.RichText) + title := strings.Title(themeList[id]) + l.ParseMarkdown(fmt.Sprintf("## %s\n\nDescription...", title)) + }) +} + func (w *widgetPanel) showSettings() { if w.settings != nil { w.settings.CenterOnScreen() @@ -404,6 +491,7 @@ func (w *widgetPanel) showSettings() { Content: fyneSettings.LoadAppearanceScreen(win)}, &container.TabItem{Text: "Appearance", Icon: fyneSettings.AppearanceIcon(), Content: ui.loadAppearanceScreen()}, + &container.TabItem{Text: "Theme", Icon: theme.ColorPaletteIcon(), Content: ui.loadThemeScreen()}, &container.TabItem{Text: "App Bar", Icon: wmtheme.IconifyIcon, Content: ui.loadBarScreen()}, &container.TabItem{Text: "Keyboard", Icon: wmtheme.KeyboardIcon, Content: ui.loadKeyboardScreen()}, &container.TabItem{Text: "Advanced", Icon: theme.SettingsIcon(), diff --git a/internal/ui/themes/default/preview.png b/internal/ui/themes/default/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..4366bdcf33a7196cc5dfe35804354b03b52eecb8 GIT binary patch literal 59256 zcmZ_0cOaMj{y%<+PXpSyFPbHC5qHD2TSe5}_UuA(GIaF*gMf*=I)x1`k&1hWxAPEp}v!zY6J?cNB2 zFJ>tvr6MmSMd#pTZ*FOGA3<(~$KAuxy4y*Xq8sz{<^v3@H$mfAB-b$B1bvlU#pRbg zNB5irm$cR?H{WjJMIi+$F;|ntHuqpjHJDUr!T{v|2c0cbW zRb$TCzi)Bk&qqKb9*u{bJMGBA8J&o^E`hAE3=_xoxb7dOdOL*ihQUfSg~O&+q4`Z56FHi8aZ(e^ zFwEc~663RCe2T;!A>{eQF4c6Y)Hp>Ptr5GP7)57OyMBz4%dnMRR{U(jvb#xD#Fo$d zT}ob4D z!wsEN9;YrfiKjaoO*i|L7{_j(c>9GNec`%%{;d(C6vLXI`qu*-RnS7zrdwQp( z?zNEm2UiDQqiErl8+S%=WZfRJDLktvW%-?2dcyyRb|s`adg+#ICqqZQ*Ys0NUg%C4q+deZ2!(_78>37j1EP`}UlsB%y(A?n z$Y(0<=Obm8eW6U&M{>w8{xvyH^LlsD_o9LIh+586asB-$>|DJb{31G0hSV=XhFD_B z>@z}7(uDN^Y#?bGj15J+b&3s+1MA+<{QgoHGEUxJemqf|SK%3()51+Og|xhZ8IzNou=C9~Yo8&E_~8;UPe~c6N$Ag+krgA?q&_~|>L7cAJrqhMt91F|Q^Fa- zZ^6Im3!W)6hrEBSlYQALJWBQw^LYZ9>96t+goG}zOGor%F6fj}j79Rl&ibmbKu~(# z_aUJXa`%G^*ZI#hrbcXR=M+AC(!@DePrD ze)~A@tit{D$I|!TeI$&FWpP&@S9zzd@Sc+|;gz!f?Yy*{D;$#G>S2AGtC38Dwk+E=ge7lwevnPmo@FFEInOnTgp>v$DaNoj!c*JZq6O+ zXw4eUhVr-NC2oP+F3Y!N4qCBz*BpP83R&C66+SnvB*GNw;h5Cs}os z`?ddT!&Sj`(bayz?_0*=>4p10^S)a5dB2Wc9Qh@;sN6e|?JwJ4|K|Ix?q{RVG8uNF zYpnw)1}R#}Kl2V+eKqGYdSFIw#(Z7R!eh9w`&N6$0CVqyxE{w01JhSU6-A96aqDNM z=Ur@tVp9|i73?#263Jg;CEmJI{<1XDhrjH4qyYQ%JON)LS#HypnF)EWfy3i~Q1* zA&M`$uoGF!v-2WsLu@mb?+f>R=~ptUXv#MwHGY1;JeB=RwPHzQDPjBccG9Ba!xT)leh?$!!;yYIi;b?|xb zOSAWCZ^NhJK+JTQizlHbf%Ay!sMRm@aJ)oBt3;dWi2H=@MD1i7=?d5l*uo&fRK)DX zw8lJmq!(z8os54KD-^o`x4w6p0U>Col8G?uiYv_&b};GvN4mRBu3YfsnW zrgj+E=z~ZipV7roS6$zbc&^dcm(9@Ax{$r_aUqM_)Wp0kDI&8?DSYh00mm0kJMGar zk3|o8AB8}j=GLHBK|A5c;j`h%({jtgxya)~NpoZKg!vDiDjr?)gwLLZDNPHE?NM%x`UghE3+0+ZdpZGrF zeWESEHykQ_T>svsf29AereU^2{$OcHv25{MXWPNyx2|)GFA5Hd#Y~SPZ#R70XL-eh6j_xcZY+7J;r--$Sxc{gf*vq&m z!a-HvQ90<*xuqtRs4$W?q3({H3vXX(J0nV|o z${t6aaGq|RRnV@Iu>seT+EYajuu;(Z-}< zy?@zO^y;eL6+gaRuTIK30pW3>2HQ(v6dt=A^JDWnnY6#fmJU01Jy!1i$g)Vy^1bY< zeb7H=y;BN7ws(l~#kcn-A z;p68E0YbYcG-Eg?c6Jzr?v$f`624{Oh_ot3m^048U{QK?;OW1b#&?~jYE3G2qYDC;tleyqQ%8G(1IAmH&dzei+7 zddrg*<}kVf2D(Y?A7|4WRG&#Wn)Y0}UqnbJW5%koO?LaIM*jMz_et(tn*yv=UE*IbGyIZJ}x7$K{93V&QTiUap&io^sDFs1l*P8KO-f*N3 z8&-&69JJwwKe&N(;&!{E#rHqa$)A%}4Punvn7+WOS-QB@9!=XV@GvZ_y00OJQoyeD zV_c3FKE2cHQt?Wkz2ZYN4-bzV3PI;Ne8gyNvPm(-5LxKYxfnt~IaeAP%cOh?5fK%2 z+!=EhsEQ5^#d)igJiO%jvdbKKaQ!A`fKpb=+Efb$GT)tQ@7whJ_JcAVq;aUk;__p9 zaT#g&p}wWAPTImr!bcl${@ghPk&uvB=*f`Fpk5ZO*cM;@?Irr#t4^WGv*YRI$l($N zMa4L&(!|8XUj7h5>R+XiZ{9Ep&bTdp@3N#!OG`rn4i67yZFvv9@4mg0a0RCjZF9aTLqZmDdSzuLuX-*k#p|qW28moWjf|BQ%lBOE zN0XCAcM`6jhUtE!lr_y1f!ei0t1^^giBZ2OufrK+Rz82;zffT6$4{rgw^j<)VGUcG9v z^{ap5s2QCm7u&G(u&u=b)9#cyHf$2URKwVq7!_4j3d8e+~sMF78v>_~*}g zYYLi-9I6$wdebT^EA?%$aBvv7xk-Y9gP$^FMcQ&U1JCKB5zqpVrZF>u{|ldSR?a0A8yLXR@zPJ)Wt^>TyGZ_~Fq}+Q6dY z-o|~AjSdE-oib&Y{^uB&*f6%_*REY7#%fBlsH%VR1V76bpMn<`CMme*fi#RuOOW=! zBUq-#`vVO>KE|=$QdXAp@)8m^MqhH^>(AaS!D$|nDw+Tu9v)*}3SIoh?eV_1UK$Ma z^lOU+4fJASG?y-2S{NuW%<%pA=@az}YOBF7L1)erpFjWT*Dot7F(2~YEM@z?5a!3b z%M}wz<&Fo-6{d^d^Rn~u+RAN5);>_$-yrzb6+8&vuDVy7Cqa(zQV@t6_q{t47%)7n z)A#*5Y;w#n)*3Ny`0R4!YO;zQ zu1VGI{)kwZXlSSvWo5-%94N5gJ|5S#ue$)7qT|!2mWl~KJaKVxc*l+rR#w(^cr^Zz zoL|$^kDzdn>Q>mv+`fHQv%nw{wx(%g00!Y@A$E2Gi!Vt{usFEwMsI}j@BjY!C@2Vv zO5BfXXWW|;{t*))lzKmquOHDF%VhfbB{yNLn|w?VgIrXHHA}^|pH+I4B&keaUti+` z-e#*Zcq?@cjkLFKLoi;3g$ZFnk=vOteDwJ7M@@GR;vPk+fMp_VA{w?Gy>iW4w{TND z=Pua{7GkuuwQ1G+2ueyyPQueZeth=%ixV>- zBof<29zJ}COGp?3Gj3o&BdyxH>VM*W_`6rRD`Y(;=A5*Q%;js>&ai6c21G{_`S|*( z>gwXv8E|&rur(yAtUp+7pgnWu3|C^8R=Lfk{jEiuU`dQRgJ@X%n8=q@@#qqZZplow z%e=g#etv#Xf0>z?Z^E8IjCR+iHoTgolf%2rA2k^TbeaXi6TsrK;irW4I<>q^kg3*5 zPeRf|a0T}izwQ3HYuDbvUMgcpDrS!-_Mu`0Ha6b087U|D`ST|;8=JJTaT*o&{O5#6 zPoEO|thZfMvUs%8n?*G4IZtgfUVEvis0e7Il(u#PRWYsqq2q6u_aP)#g?VkD;rK#^ zT(qp28Kat-nh_T{)z$8e?d=b{>(kt39ZzMU=qDDHNfGPx^DI&-rTS4V>j3p;yTp>Yc_ z71ie-#3ZVrMXrmQR5u)+2GgZ$-n}(oBx366DR>qSFHN0=6w^t`uqFW zwzp*;Ja~{X#dqPt1@ztFn|)S%fq{X<`s{5Z_NW?IP zr87@Nvp%NR%+>12AD|WYt3C9+r>z}6I;sat(zrS3%+mT5`gFosSnM8C!56i0>8)a| zomzsFvY?V%-=j1zFd!H4aLAZn-eJRZ-8n3m&gnOqYOETvio@FngaAV=s9PPk9V%HVUd(+XB|u|L!Fro8156TmG0v&D=ULl z1cj&_Mw8qxJS7%Qu)rT{Wb*2uYB7>XCN`XqXQ7Q)9+z797z;db`0LS6HarP$|*KZsjyPnv+-Q7ZFX#sAibpjK5k?H9sFx&aU+wdMeeD}+AioAF1 z(BaqC)@H-)QM^Np`iAf zlSQJ46{rS%R>vJ_QB5XAbex>g!EiGc7M4PnpP#bx`HRV=Tai1`0s;qXccB&sOZF_) z$1uXa4n11#?iV*8m3bZ)*YtoFsJ3@N)zuWUv$IG5{AhOP+i;P;9#{m73dIE)guWfR zi8M4cRG3NEc6LGw3RX3ax}9`K@(m4DNntCVNmjy%l$|b|h-1BHR5CPU`itn1+ib}# z>HK%l_G?z_Lt9(TV4BdC<#)ViF*7^c)ZUKczu%ksihzcjn>#ErGFURLG4=R26U;9i z0|REm;Rar{>tYDnpYP@CHLXv#8}kZn^9BV6Pkj+ym4<@TyM0=svC4Vg0eFV2RP_Ng z=Os$N*k00BS6Am9o`bG?d~{$6Mbg39*}7CzQ1DWga;mI` zMqJCLP%@$Ws3Q(wf!>9e`>U4DtM7p*2di?b zsw7HDHy#ECp7K1HPxW6ZJn4IPm)mBL%g^~-SuCUcV67*Q-`yX4S!;bGk+q%)mZtJ_0k=kAxsquK9g2lbVQA~VC@jqd2KoAWU$`L zM-Z=_74{wVVazy#g7&tEizL+41h9T!uF7;G0e-!_bJfhk!t`K!*<&Fs^edDy*=5~4 z&BMdZZs@*P$nO4r^TY%#)MsW64p~i2vW?Bn^|clv0Z$+2rBBH0{QSVtq(%-2F){K7 zA`r!P2Hnk4x(o;mP>4~+q-BF_Vpj;RbqBFv(MqW z7wkSEO~m|6*n;e@i3V}BC-5ged;WZe7nz@(?G*I}DqwpZOGZx46q?*iUdwZ(I(bw{ zfcPC|I!LtG$l!fwl||O2GY+0b(}+H9ZkEheXStIqMvaL>_`KrhmKR!p;^N`}*f-~D zm*}{PZvv;AT@yBL#(HvzN0v|ulh%3~w`O0$hrLw1g71!?;mW89gVbGEK7>Jkp() zTo@NQ^cvwZ2m>#Z7#Dkl3 zov}-Xo}6b=dj0~^W5nis&&Bd3Omq!9%2MYxmB2Z@9VQ&;!4{(sF&*2f-Fb!VUZ#l1`s(UIK)Mjuj5Al2QU|RrQy9{%ff>K#5j(FM+U80dwh%%o=5r&U z`ryWLOVZ+bEDTFaOC&(z5w_rR9wonxR_xB#Q?5H5!`}KO#l=+RSD2VS8GrKQAlO!JhNlHOE2ohSYM90hBO#5zkX>bq1>& zWq>q0+xcq;N~iYVX?v%9UR8g1h>64R9o4nIwH0SL4J&f6#=XGDud66E8rWI+hvVa8 z1c3<#L=^w!U7hVncS9ME@A;m7i;|&2zauXyVYfgiafA^9qJW!?Qt@-LvvJ`*geB}F zq2f4LSiHg*8VU**_V)K-krt@l;33CHeuZ2tFr3&3V%N;+pIt1jSpLYUu}w1j|a6mnqk!9Rkb;&Z{Ln%eFOqTUXMp=V2JNsx}n=B7-nJRsZX`&!3Zyx{cVX zu*3m+3?a)H(X@Zj?0%NXI|;e}8iTz`>1e*Ac?X5vUm49DBo$H#}udwVJ8xV|FG_F$d8 zZb#Z>+3f!PskV!TCLj{sokWq2@gURd>lBfN1*&$b(kyIjxozGe%dyu4O&i=Rrs^uU z)7tZ@Dh4#R)4HMTv9DOu655ETE?(y1A_j@i9yB0i?{MTLTa>Dl=BwCdpw6JiofE)rGizEpfxKE4ak>kPyz-j(@NTHWwe z_l176F>|k}sflm|STWM47}c*9X2*W8rLL*TPZ`Kg7U6Tey;+nqLFtqCVs(9Eqq%Np zoR#Q&ML~}4i4UW^74M^R)?caqEh)>e1R9uXOG|&hZ*Z6H6Upg+?7Ao>Eh$O=53<^F zLu*BD%F1GY>+QWPe{OVaEK%=MS=!8uSyo*b0K<)=^rM3v_d#=_0U&8tug<+U=zcBn zXvVnOqC3U4+E7m~N#sd|@n8Y1SHbL85dYXyt&hB|TAG_*_gi5g03=?7#?-v8y8m=| zq}+GRL_Wr0?(?Pi=p6B(_)fDQ0yL_uz%05F1*Wr7{mlQO>+HP!omC=bWn~ZhoLxh&67@k{}6W80o611%e9nX_2LdqI#s)?bfZZ zL%c{-JP~&LZ2ZC=KmkCY)(;Ac9r=svRELhMuOXuOIp2hlw6w#EYB;&sPcf z6Ydbpkbo*cF6@@;b7yB|48Q^rDJdx(V9lzkDiF^f0tA4Y%oyqrtD3?@YE`=k!T_Nx z?;a{J&(a73m}h>{f6xEcTDEG&>)xLZ8#D5NU^}{5<8J?6ouCDv8rpm2Eg<@ph7&)= zD_5ofBcmLl=YdOQK_9^Jqx~)GEuGr4!KXl8m3r`i8TvWs?i>@*HueG{B2>_Mt(>mC z&T%Cw1mOspcnDNlScIe(E(qEXojuzOH%{UZxIjYkFh$h+2dKV4vSdJ_fVMijY-eY; z0OCz^b8}KkL&@b)TU$y5_7gWKp0E;rY|H}H$#>II80zZE>%9CMWKmi|8j-NipYMe3 zRM#melDOW7LhA7|vn|OpIZTK>xV6YYS|I8FNASRvkC|x)iR;0@BC7R(_}cODV_P9`t04iOUujb-K4&v;`SiY!0&8q?d|O~wY0R% z^5<&ij9SCrP?lt9IFaKN?c_aD-mrsAPEBF>`=6Lg*}@VL!K{pq?$+>54X>sE6rHJH z_~98t4=O$AEMZ(tCuD-H36$@hdU@rxeTxxJ-`4g0gM*6dta7nDO;+VEE@htH-V)wg9~KJ= z&>o>MN&JAmI<2_4c*Z-ax3?EiAT~k{a14OE79D*$|`-v3oOqV&*+xhwB_qRL&sGx z2@5qS!ps12H_Oo;J^CL>0{CCy|B>`RQV7dmL5dFd)W6PvYAXp{=HMdKbaZt5d*W)b zKlB_!l~fy_K0Psv`SD=ox-+T?{#8q=Jx>(^I)LW)=l}2UKi;IZ8UB6Y?@o5vRLSXI z+u8~?D6oJLusb*ZCAlT1puXwPsJV*8a~jI(=}|%H*2cHu1L~CBZw0jD`Sa(6bkfrL zdZ6{bV4Hf<4G6}kWyppfRhwbC#xSnyJN3Zmt%Htfa&mkWS)Tdk&16ZpSPO7xEoLW* z06q!=XerSEImhwtNcRO_!pE-N_?QEr1w^BTx9KZkOl2Uv`D}IxAOV>Q@g`7zeX@ps ze&TG9HaEX&Vq#M0xoOT!dX_Ah%AY*De{EwUu-{5XMTJ-?RV?z%`KveI&Dk-~w;>XL*I|yit2Mxwwc|rb7Ttf`mb~V`p}tuWzm1 zhdy121qd}bg-tOt+Ao*$?`}A14w&7^T>r<9z@szcrga?q0(vgc80B} z_jW5Zq@D)<6Io+V_&6*oN){?(3qKJN(J1J;FZrxBGq%$+GK!q%m1gGW1%%AMy^;4g zTyF0MB59OphK$nqdW;A#Ws z#|j~$9iJ%@c3Wx$xW#Sy0snBX+y4VJyh0#OveqBr(~GDXuCRK=HGq~F1T-I?8RH%( z7<Bcep)b4;1Q2NJvOCyf?T?+3(*s7c?9{9vsxF-5$2aJ#)s=C4bxC8(2)JdI5Vf z1~ZTO@xpjrO>IG^S@V01oTmv1XOOQTsDb54hl@6MFjzoqnEd&3Xl~fB-sjS4!-*Iy zG=vU-KL!Ry_Pciyetu$TJ+ zIDnbLd+?3>Y%1cDa|KL1M78**%#XDi{6xVZ=>%fn`UcU{(h38=7ZW+2_dk~N^ZWSx z8aiqqJFJ7rB~0L%rIZ}gVh^Q`8pt(gYf`|fnv*RWvu2NVFSurmWE1ZX|4k(2Q?5i<1#ZdwQAhh$Nf)yv-=g} zg^-uBHkcT@F$1n=ws}9$CmQeXY)Imbzcz4>#8$5I9ri4umWvHm@wyXmS z0g$;dATYuP8`LR*W*migkz+E^zFq=~Ub52LxTjA805Ok(L*?B{|=D~%)|HmqX6h(`vrtN$vM7182}iEI`BFEkcKt^rs@wsI*K%` zuo@0lgb~+R(K?uPr`^-PymSwsv!b#Kl{@HAq-12LkQCo-ZS>BBb#?Xi^{4=L3KMg7 z9>sBmf%67~w%*;A=zVq|K zB!Cx^Wjh!u209nGNS}ZDJ;EV!+oSjedtVaNX@#$&Ee58dZ;3`v+ z)#E0kr=gSIQyt!4fenEmV5|ct;;XT*up2}Awu)cG$A6LvTU>wJ`XwbI zpuK~lSyp|oEH^i|XHV!nIXP~o+8I^SSs~sx>MYbNC3aTA=wML>(oMDyiQBmSzC=QT zxkjK4UL|P87}>fwJ3vEi-A)!39(;bq_i0K@%Ud~J?VXFzkh;{CH!bCtjnQx7Y={ni z1Hp)E`HF#pHU3Dvh|?^Uz95su!1Tv;=%GMFppM$s(?DCVc7sepi2t!O17NT|Rm?Sb zX5*3}Xm-it{#Ha*-~pp`5;YkX^C~`$EQw~MGlP>KFX?bJ-uE59tt?df9$8F5!&?Vy z$?_J;-xJo3_nWgrtaqx@{iu@&dh;jh>ojfa{@jb7kXGzTyrIDd0CcW1h)wFC6}So; zpF6)a4?yWbGbk{HLRgal0mvTkZ^u}vNXiWWggSX4bhx0wyY2Zbw*+l@iGDUO5z%$N z3o;Ij_Z56HBzHj#jumFk?m^BOF(TMs$)DkmLQe}Q^5(+(@uVYwM75ro$xh?{CH$+lfTY_VJnJ^Fg2V7-q`VsL3i{dzh)(dsinAp5+6Zjbg5CO z!?X7v>o|c#i)1ejf#jL3(Efy+TXLoA=x0_c7)`H6SHXILMsym9kJqyL2>$-8!34k^ z;jvYSd{}Q<5Be7o)6%Z;nk9Cb!y?8(0N!wh8VV7Ej~a=l&mfO7dAO$q=2SKV4qWod z%a`Pc>nEzJ>%tDuXKU5FQM6#73oed!i8)4gV&)!%N9;kaC(=#won?He~P%{e` znNMY4Vfi@ahh7Cj67)hsI(|x-YEzv4dw2oWQ?e%jG^qThS>(?tB?|?2iyhn{j6lOO z&dDx9$y6%c06uL;$_0}$+Ds&%paYN?m>WQIaO$IXRpc_kisQv4wQaN@J*GQ{4=*PagCK-G*ucnF+TCEi3Eo zwC&$A6}TUKr9*B4(giaK08*L?GcgSfAuTO!s3|BDh2~upsEq?mnHUT0_D;L~KV87u z(8}0EJ+if7>jG4Y0=Y&|P!JVmn~VYg3!{n(nCIRc1q!27pv>j!l$~uj7+Xa-J}d@^ zm%y7#X7m_AOiruNNTQ_VK?NfOXi&JcQnzE^;pHU>@+ai6P>`bbt`&Af5x`=!2Os8N zhFNanFsKc)NKO6(wWBOX(#dr@OX-6V*X!4>5g0glUche;HFIpY$zf1yYem2`fxZud z7Ak|E4Q`$tIE#yW6NESgsp=6ZU^6o_jb_)Iphp6q;3)7NeKmmI8eRwH5AgGl$#S+Y zqkJHU&hUp0cVjxFn_agYA4CXJnOiZ8;s!+~GBpPNC=)yntv4L*`8jD1_g_QNRCDjg z+gx9_>>C+57k9h=twCRTt!Cl`R~ZGUOf_=_Jt^a6=<4MM*%E>d7eWl_)A`kkv7kgr zQ>W75qA-4YIReGWf8z+%`7l^CslMe8p>q9A3jC@@*??Im>ZboqC_rWbVkA7>BIq#v zO*XjdgKLC_T4rW1L9F3V0wViUkrtcBe6l;>Izia^|30;jVLX$_Z`=GmZv?W6f8!15 z`PQHcd2Dv|L+3_SX*4TwftEH}(D@jxP-buZ1jP~FUbTHU`X@N;sDn2=JS;m>S6j;k+8(;0!8x^P z3d`1b91+3ozM=;u=ieJHd;m*icYm<}^o4xuL97NwMxtheoRkefEYmto;RArfjk)gYr9)6P-MTPh(>_PISCEI zbSkXlemb)Wtp33g3(knY>%?UmQaC$KyVQbCj0RpmuYf@i>I;MjRb!w=PDlG6GDOHq z=M@9x&DGtx{BMD{OoQZVygFV@lkoMc3ZP{ysG0XNZ9zE%Vg-r-ZCvIQ>XxG1g_2+2Bssok03``s<2k=S=3pq@jC%%Eq3nSp!^opZk&Z!HRM`INJ-&cLLdeQ zgbYOo0E8fH=^5KDCnq-z3K`%j2z^KalLV^xEH)Msa*)88DS%FR0DYyT20q1aGZ+B* zvKv9>=$_j0g0+SEZFF>vnbzEiT^=AYJd2Av4IsI8|5pyEBYCJ*5O3gh#?x~TN`tE0 z*+!TGlM7*XT;4>5UFNag-i!W2sSsQt6m8fF%~D&0t3vAY6au-=g4>Czs;b}!G=X5w z4cw?Is~ki=h(B_}Iz*Q~NL;c72_RR2x|j-$3OG;;1gSZRw9AKV2J3x=-Bw1!VK7WU zajIO*uc3;XD6xp9@&mORrOyn|mTrz=i9qJ&A#?-qbJvB~$nem7H)vRm&@c+>_gTPw zZXzOh76D2Fn#QCOrRXvNP|I~29dlVw+c&0jwjyrI$Dq>ziH8ryFN+HbILSElm_xe< z2M1-_j~5M30_kv}Z8b%3)-O0T0bq@OM!`V;q3~X#qXvxzx2aE6H)$h&e{_6|brcmLY z(FzC%s#~Kg0jQg;QzAIO``gQS2&kOkdvlQ!U%ZHeRL-Y(Cyg_RSbk$fZbA?P(CN&) zsi`T*W(X23vT-Zt>PYcjW>OeeSeMrz4od_j3zbAC8y_AP5|=fDHC|}a#)|ShoXq^( zTr-&0!hNaNi3i0xd4w&g%Z7d25XsIST82<1f+n6r=kKbi&7>`XcINEmb7U|E7{^n~ zNk``um5E#w)lj)VexDVpy`r8Q43Yw8T@WaYYl>H_g29M9+$wMekv=_&DgfF<^(9X) zuaD6=IXSRW*cG{EZMNqCGVT?XoGGSwKk-Q4z<}^|etZ=>kG8jm$0RB!RM^uZlTpGe z4#TmE(hmE+BKG4Ve+y(b<}|A7U+YipsXTW0vF&g_@ZHuS65cX z-wsshl#m8a&KuaSKjNa#APZf60?{6m}=R$7kE34~< za*RlMKnR4}d)o$Sghf~6d*J4$5|$JOLd0e_rx6GdC}I(+hp>S$q zC7;3SR7xRc6%wLQi05d7oidvc_pmypA7(fSlBtHiTm5`zI+aDYNTG{?T7zOp2&~uk zERtTlXbMlg3ow{EWx%TJrJ(cGfa)vHzUS*N5~p90mjsp9Z+8kOYku4zp0#P$GaOQAsWJlMkXyM z$H2is2t;^obMp~oZ$Q-$k$54>T!F@qd(vef;Ua(*(`fNy@`Ac;is!eF$DiBT1=1Oz zCWF%qF0|RcGwc4>rCoaQfM^lq?6V=MoY>{Gy9FKR`L(;lwWF#E(7sU$ zFzPv;;K!@{qM_CVoKI|yw~v1(A#!|&5o7yW_Q*6Y@@ALF2= zfO_atcf7y2>~#dtqhfCm764!ZPL)GDpxbZeRbScOpK0hvKreh zJ)Z;A1OI~&o`2wYYzY>fs-~u!zQHGxBHmYp;b99pV1Kln9Iu|hBSMlDg-$L!y$^Vy zdh_w|4a{zV!w2El1^V(Z96pG3__~Wc(zmi)^y}!%rwY*SL4jbZ=u8d=E5M z@sDF%l^`y(8xvZZIAQ&V(9o}fWbHm!IF0ZO;LKCw9h0* zS2BcVF2O5<-IxLX37Sv@+Y8McDSo*OL0x!eO!Ln#AN~;;3n0daIxHZOM1khJ5sOlx zGq65Qjt}?#49!|3L_WeGs&_+V0Hl~F6ntkPQq2TsZwMfM0}VvK1o4?_J{`Xu5fL$+ z6$(N0^V}4X=vfrCyS;yS*<=(uBO?}?>9?_AgWXAK3+K{+n5L=ReCHxotQ*7ViCcC% z(`nG0Kaqrzl64hgXEU~2BV~~Gg{qygz4Xfa2udb6r#DGuQ1=Y5a^#nc%ZXjz7pfr< zvazv&CiIt=BLQ9mMqNJ-(pevt1o7HbD6PpvJ@X&(Q0WX-h!W-;5Fv-dUB}&n1JkZo zd`cr|z^Z=#7c0^THc~Wbc@W=4Pv4+PW7xI`0st=T@qU9pqpJ`#h{dA+?3TbLBLqRq zI2C=-S6hexo(;pTeMB~w%5m;RiRG{%*;tmQ86%hKa{lG>^H_9>+5C?<+5X1qTzR99? z8t1`$br$qs941nKyl?&H?b{!Rdz<9YsC)TSJ?9c+r@n(L?L7Cn>G1_t1OemU9KcC> zqJfOeX@JnUbq3vlwpH8l8hd(rlqv`=UB`+R-6jVct$${Ff2XDTJ$rlU2RK3tEdVis zWTetg&DM8aG)xP92M)g6AZRo;HdcCM3p*L*>gZ;OkKY9RCoRAi(H00h5(ffo=#i0Z zQ|w9L?hw~+pArNC4yJ{XiD?=#^sNy0Sp)m5b7#iQ3|c>eaB^~nZbee6!EqI^#L%QW zP=*_01^y?;UG*tP24)d$&C2|c9VrFPGTzWH926zACGz&jzsADSTPAIN%Q2IKZR@&vZfFK_#ZV}GcBkafa_xGE=!xfovyUFyJ%-$; zw2lr1YGa^V4}#msukTodU{pP@fMdiP(-2h5c=M*!*c%deVh2k+Vd;ZQdxP<;LJ-zN z!$I?ugvOxi3m|B+4dSSZ<+H%t5_l|5A<&G1U^##&**PMkiYhPbAp5{kdP1rNhg2T4 z*RP@x*~+!kD6P}`mi9toAC8Xej9RpYk$B7{SWs*^ZU5@WgC`S)M9S0n_|SWXz84_) zy0*54nr(nXfW@y5nnq87^;OZkou!x<0;xaHOKL&EN6*?32bCBU zjutqB5(M2;3WPW4Z}zq8*tKBbgJ=r?EY*4ZM#Y{7ylBcDTo%+@0)vl4X(w6Kn;$Y$4j@L6 zN6JD3uww*03m`}1i3P_qK15Lq)8R_S+TzoSQ9;Il7vcegkDBOq;(WXJ{*whb1-$OY z(nT_|5MT?06TUmt@JgUv+`Xq#R;?O#gr1fM7+?Z6GeqLx+;M&_uqPrgO`Bm43LRE| zfR#oqqoHwujMIQknO+_i?peqr#a9o@gr|q4r_-a_vN}spP!Jk|>$iocd=1BkU}?cv zZxqXJ0hobc3VaJrJ-vo9qPSv#o;HLc1KJVv6*v&RnW7)~C%MP&mj^5nJT*AYQ~;;1 z>+}o6{SH0q&q()Kq7ws>30M|gsDxVfxSG}AIh+HBmh%;wqFWhw2*Vrp#H458phNGh z+uxvDyD|-|VoKYg;^3+Hu(075n_8y;*Z*Qe=jj5g0g4p=3cl6(aC%wHV z-h{J=BF{e(b$b3Hh*=;EqsraCySUE6zZn5KAG*E%sK=@U&_06ElW0Jm(B#*DZVY$` z^#6;H5km3ff9~-;Pj`K5V4@IO<$pdx+vV)1d;jy%JtwE@DZXwT|8rY_2*$vfAf1Q~ zrv6r1ddfgg!BxHPn87+EOjfKo5gt z_a?FSE8M`dVW%aGBuL{4zsX>nkSRnXi}^W!z~D{DlMo{xJ$0;qao~cvQlf>@ zc+!0Bs;7Z%<`OFp&v^*x;0vh|paHbnlVcHVs0}OxsTgpQF#WbWobsq$|Df{c!wcTP z%B{G7rAZLKR$&Iva=VNGl+4f;jD$NOlarGydsK10_@Id@Wu14bs{IzS6OWVCdj=Hn z*K69I!IG-%(L8*7aTop{VQ&JBb=QWEK4?&;%ngzh384})7s`;zm@79mWD1qcWS-Bp^?v7n)>&t*^R2#Ny`LV>@3;59_kCaYbzL{A@nrSq ztM6S)jsd8O`;hcfdY$z{EZ%?mbk!vDFo2zuyoji%)j$ge1_lJ@$maqC*IT@=QQql* zdO#_&vHaXiy&9mHp+F|+GfYcA9YP;Ma5KK-pRluNOf~iwm+ZLxjwh;y=!apj0eYsn z*Kw4wH>0EJC}_+k>sDo3lntNl|%4yh;K{`|CDrSc6;w)vXj4BU)p;5)$9it54_}vzkt->gW}E z&+NHM?{PT*=ZzmodqeCIekF87e_q@Vg!gn_O9Wnl{WdG3AiX(t>DZ$?po+_WcJPtE zc8ais8v6<=*COMMRO|kDs$5T8`~C%ksgXjokw}nw(pvYHOFU)gUaBQ-6if)tf<6S+ z9DLG;8oOEJnWkJ>AM=`b55Ce8jD+MODNN~X8`tjj^vGqV<1-$vM-KgYg%lrOpcYT6 zd6$FX(=R*uq`F2dNB23>W=M@Uy9kKug*|^R25uS_7l`;)S=rWIRDk`!5Ty|5Dmrp` z6X5IKIFu;9FG8rmh!KFn$cRIDoE5eu@Q;_x1G|43i$oC+7B`+R>xTPBut5U`25fLD z^A?2I&^K4+5f{(?nw8Zu2ubW{Q?9$WiiO_zyyX2O+Dt|LyVDvjK;a*`U(HE676Ank z(2FfW{k~|G6<2AlTY+l@jF-IWkbadzhh{aE2VG^*f%~PR1VBAiOAK zKkf6g)dVhdgrD`yo(=c_8k0P6^hRKD5`24ypBW8wSPk2#&e2}GM!k(+7`cptbS&B_ zz;xGG8RLndHHB#L_Pce!*$a$@T)z)qx#r*I%Tou%94qucDFJZmZ~pBD3Znjhq^G8ov9(=rGT z0{@TaguWQP>iVkKm94nv{*k_uu2Nj}Ze9H{jr|k&R(8d?U2gi=vk0r;yk!L9qTMAFRg*M!NY+igUL)@I?QMLeNaPOQHU&h0sv7v@ zDhY1vYaf;$$RTiOf>)kep^;ekoK~Nmj*-z-W1d>mAG#_WK!7$!pE_xr!vAcz5ZG{G zVwUS7)adAwfr;AYxe*%}$q|kd4_|G`lMCh z0vC0!&gm=zB ztl-uk%3*(ITAddHLJAM6N_2m<6ND$%hDdI~JCMCv5t8MIMG%Yx{c>{SCUi%z_rf== z*H6<^_pOX;M|Z9l-#oh3sp`aEp--!g(R%T(ZL9x|+N#~lo_`YqFK?>;PkJh5tsh3L zpA(eMFJPlm{831UpV8pIy;Vx8$$D6na(*@`q1@)z#R9{6zDbt3F56^se)ZEL!_;D` zrH-Q!qdk1CZUvKoFfae7pqTjhVdlM!9=DCdm2PN&)Qt;WeZdD9Gmgd18TR;JuAydV zZr5_3JFspYQXd?{JQMTL0*BGD;Oj4haI}irxR2XZsCT#9J$U=;VsBMo|L$bnRR5s# zp5MRKv%-RdQ%B5gOBW_Ltzy{tVHIL=YDW&2lA^BD$5@%h!KLo%aLeQGRrzlhFdSgG zgJ6P?+HB+6uO=LR#YmRhZ%x7UjjYTmEGS%4z#u}9q7li^C2Q(b@(l;#01RHR0V>TS zZiz;J_o+wh2bNVkL374Iz9HjNZHTJu>|lR)W{(-@m-)U6 z(wo*|B7k=IyQMPp~*51H#-l*((Gy; z{ofo4ekZTqT3uL*5*LWkmZsy#Q&{oT56W_)GPbKl9^tkxbSQcbw8p?p96qwIhUvV-M>LKA=j7#>MKAN|ReO5#IgXJ+0y z@!ms-<(Fu4Zp$DQALPLwhc9M)nO^arsfgp+#la0scdQ+S?Z40#RLOsSV^lI}mUBwT z<&#Z;k;#*$eBaecCp-47iK_VpEbZpIGq?c6*30&zE~6oxckW)FbdEe?P+hZ+p+P{c}nm+P<#Q!RGr+WU%caADtidOM{D#_Tv7 z?-Ki+mCY~W#!o6RH@^LiT;E5Y_=iLG3qP5ab}h`ey>`DA?iJq;6h`}4;_K6jD8s5P z+2Y+ky?_7Lz_c~KX>ad?KWi`fqmat%U#Xt1ud(~%$B!;T^n61~^BFbK);72@pkp!A1vp-+*h;o$(Z1!MwP$S?1Yo zc0tG?;VGe>bnEv$BO=XN^q;IYwn zUmJK(y}hEgC*ATS^i$?pgnwisf%fz!?Lh0IHbyLAWu=w)-M*rR3pt;0XE)nuH`r!X z8^;_?<@KC6yJrKa?Jz?d-~9XcZ_m)sJZ1`njl??(Im&>m45Z8}ky7Cg$;`e;$9}Sv zDp1I|&_GB`ZFXS2-8HPsxkV`bkizV3a`-Q3DA1W+eUZp zxi~oZ^}IQ}?yGcpm*H9M=5Au6_BtciZMa z?3*_a-j%v8mv8=NGY7}-ms5L0L_Q5J0a-*gr(J9BIJbJO*YTWFwprKpkb~pqZDl!< zRo&9@kp^`WE?S7n)r(718jD?v&s?q=)$^eka{@#0A5&+vO+BOjlrcWF}$ z`g`}+w4mn}cIN2d#dc~m_^uLuZbix~G8k}S~7NB#=Ty!I|UK}cC4sc4${tIwz&B5{(>dO0S9w`Nh zUHmCP3daj8KH*MNRyHv%_GG`jis9UUKZ|m}2$>fVw}4G@8TI`U1m$bV=aBG2tHQy^ zCH3~dUyO_KJ~;bOP>eKN#_uJ?JiatOIs;8mW{53G`9%UO`Ai~@k#c~o{Qo}i_j};Z zz@`y6Hvse_!BAOwpAK#re$5A0#(G4>{?7;UKmBqYoXgWKxr6km$s63&uRb)#bq#jv z7{wny&m$`vb6_iP!Uanlyn6~uG~^NQQBLro${+;Ivu8;JfxQ<$|0;A6_uPN>ef1<3 z>K=e8$`7=44xzo{kqd++=OTJw0HQAatJ3uNK;r=&xEdW&q|&nOOgI?k=DY+A&%V$Q z+`)stvlGy<1^AQn1pA=MSc~KpP0Xqcaxz4_l*79dgaS`M``GD zNZDh9E&?*@WYbc4QdWI~n}MpDS^zRg{WKL2!rF4N*1E=|M|4ltW9`3{PkRsWn};tR za->}@f34wb06jh!FnAVoQ{KxSvqJ_}mu@I2Zr{!|)!|oacMd_Se5im4 z+en*R$LIi%BSB=%yKTRV$H+ugV5`(^&Q#x`U+ma@b=(PRuKRhC=)*eq)>m4rcY&yd zG(o5cfDJO)Z>LRQF&{#YZ#5E8b z>_;;&NWJ&H&gSoK@j>9jN}`Ew!y1PJ2Li^OpfU*@N&}muzS6(WYP`S*)_>Sm7=U`Vypz^_lS|*%(P&jm(o^i}>YBIPAuavDl9QQP?>aiiuNI|+-{~nabP1x22T=o#hQc>{9O{IRNwU1-U zYw-auh_wLCD*7|zR!Q}url+7~aaDJnHFhPMjI!YVuSC~iS2qBKh=>4iV=Wp|^|WsZ z1Mo0uhIqOY1O>a666anPwE0a$^qx>X1mCDWD+40R2b>0Xkogj*QPRHsC)v5|BEVto zOJ?{16fN&u`m-)l*U$?l%v<793Hbcxg9pJNOL1~P)LsKR$}$T3*u}(WLa(=n)5M($ zKL(_V$noovwYI_Ji%<)I2oZiD*g5b;{lGFI;>C*nffs0o#x@|IGW6dd=pw#WKuOTD zMP*OFS(**Es^k4BB*Z^Mz_x&k1H2GK$$h9r`PuMG5oshbXaRjH5#b0`2W4##D}u(( znNTE?@a<}in;2}$+J-yfGAsrI@XV#Is{Kc9mrTmq|=n z24XWd;ZTq%@8dy2tQjRZ%+2*^2Od@grHas z)egCD{`VE(LYX9v1 z!05JLk7Vh8p9zhMm_?P>@`LZcz2*{+7`?Kd#<~@NpYaEgptncS6oBd3?|zWGP4lhO zVlHJ2l*aj{4idAuZWCNZyg^HZDrjFYE@bu0@;Ay)4k4gy-=i-M=rwmY-KI z8C4|~^Tcf6S;+k_AKO=jmSzaDx;^Xm-DtKsgnyy+AtAwtHY2_C@`Io{)k(*pu9xucWac>xmWK2G84`o_>ymiFCr;dL4NhBB+s@*f-#mu^xPeF z9Ow;%{7eA>hx-a#8cx4g3t}9s%QRI$GO!ZePwwGOp@#@pJ?M@ENxfyK}Uu+uCvb%aM~H zMU9$|er<}^Q>!cwO+Vf!GGwI6gbsZ4>6qu}-`A_R5T|6Y!jzHiEs4jEfn4z#OG!n+ z-Lxxj1%#hG@H0ja3ZVg;glOxJ9J$dr-F6;z$$uPMj-r7QpE<2kU!QFI4sMjY#7*3r z5Rw!Y#!bV25j__%&;xJ9?TBo57choVbK(PU^XmP{f0VGRrQp-pWx_-d1uE*ogJ@+y zC5E=RA{YUzr#Xr1HMC%X;LhYVYVxzfAO~%7bQgGe-_+$;pFpf$g?D21qe^UWU z6V7YueDaI#`;lp_pyYe(rGXPo8Ca?U3?BLdY~&Ymf5so#B&04y)V;HK{n0RxMt~s zh6?{iH)Ko$8^mVs{f`UK;YSJK*!2cfu%szO=x|g_q)H<4I*@_vNX0>l)*;>h|3d77 z5w+1>y01{hn}asVUHbyZ5f@g9)qVG%MQ9P~RVHG8!}144wW{~+j!ze!tjo1EgtHGE z+=j!h{UVH5yH*3-&_rl~M7^x5GNk!oZMPK$QULc06hD1ZT@yod=&hlA`=tbLN1HDeGBY`x3D zL2>-^d8_Qg_!s)trGeH0osEZp7>|I^n~1+?)&8nrd_Dp;C1|#z__+*5;zMLlZfAyv zanZtPdL3B1YnvCLZ{YD^QVDtqkEZy3lq*bY)`apz3EjMP>k=Z~Tw8d)ZKG`!%;FGG zk&dVyJ^C6clk7L06kV&f!hI+jiD&VmH_MHxR&Aee$SpvdWVu+t74I{-0jW$N$^YjA zg?B(AbGX!ZX$1wY7+c6n6zFxpSm7|D8EGM-3j}F*igIxrB*BQ7Pf(TSJ9e)UG0H!l zuzer6)^2SsoJcre^9%1yzU9uuOZPcr#O-^#yN$8l=(oUTo2lm$U!>F{Av*=&Qg{y= z5Jm8fi#h6Vy*p#on!g(|BRWO?$~5u#w8u3bUdNt(QR`SpH_U^JmabXg-r)+@-GB?! z)Jke|knVHIc`g&!An(tRDGap$!r_*UXVG|P4?P~yZ~?{6I}4)lMoGIHD7ax1XL|1Q zVh@hVG%6tq1$iuC_@BzQ>dZ1iEP5b*{u0s>!ak`q(QQ!1ikkW@?8Ac^47K=zEHnaj zDK9+nD5wzp={P?X?fO#e#S~7L_$hYFYa}FcB`=9Q77ouHK6%aki?IG(EVblVx`YPU zk!T5aCfO1HmOY?mRUzatk}?^s+`M*Ax?-=Twsikn*up5l#C&Fp_>N}4|3b{;FB_7( zZWuhwbgUHd+X3nfEE41nOJT;vo*ktU(VKzHR<+n4d)*zbAY!{oz?*v#{yJ{}+$^+n z^?iOMN75{WqP#}?w!%P2P6#UD8{P@RN;%M>&#ye3!l!(f7Thp?V+EWdwO{;vpv(bj zTo_WjM=$~>4%;=NOPZ&q?pwwkKpjm*K~~QoH8Y_CFkqxJ9&IZe8X>%E@`OMJZiU&l z6^e?v^y%h3z5vc9Sm2q}7F4)E-vCIsiWT?Nlt(xPr%iqpMRv(sG-kh3Rlg%F5#TqH zN%8Of(lK#u>G#JD^85dEEVDt7zmGr!C;moT@#MJvSFeeV)^6 z{7>iT!kt`WS;sD^H|1%$#`IUD<`<8OdcGq-p8<-F3h?}>*xCm-OWMU8Zm4)MAE9>i z=+%$slz?JG1f}t{|Ge0G6dY@jg`xujMrza_CViCNDD9xlepqJ(NqG44=g(RE7!Ry_ zOvifv2*2?eFZ4povWDz|F>Z>4!220Vtk` z?hKH)V8e3<4!Tq+NJX~$zcIVLnvqL*!nMK_geeD`@7c`YN}{O%E+Q-^70F-SxG}iV zbU6Hp=J3I##Z0fZPh+)HAWS-Kjj92-<1jl;*jnP&-{|o-?@3Q=ZUt!`rh+kz6JRG^ zMuqo!*BbHYj|55r!VZk!W<&(@XUlpkaf6%-?5A>V)_^PnzMiJKFVzo#q%)@V_T|Vi zYX)Vsma+57H-Sr4#Z#^~7eC<~ZQDOHIW7U*0Cq9#-}CH6cWs-L<=?)Y2e2jJyUN6H z*8}*TCsc3!>H{`Zi9;&7eY^NU)KfT&;QoBhKCc5*hzQRSmPDppM{y{w9%4Q9*!aVE z{%)Nw-z&Sstv-XZJNP|Tj_;Os4E5z}sbM^{=ui=sL(3rk6aU*T^SVMvX3?V1DYIMD zV?bY2*BpV)rY2@yFj5_4+hvy<*MWP6$DV>LjgvF-UMQ1CK;UhU1j$ywG&Fkkr(I_~ zJA0r>v8PAt0nt9(lua;@X`ESvvW+-~La6I6ACBr6;m&dJ`#$uQP+1$Fnu2O?+`%|(Pc01(x#_aUf+0TakKde!tCa|(#;6ihJgQBS0s(10-I zwe#0Ofp7_PZYUI@)<=}}k`qCVg`AL@LIkNu6YB>T)Nb>4BDxb#7!r&T1G)gC+0_ul zZ~RXkA*X|!#{?5;Gw+3o#$T@7;p=zT5ArTyG2Jnp$46wTjE3nns#J=r8{|h82Df)}WP(OTOZ{ znNnR^`ATtu%8G_R-Msqp{jZD2I!O&r#Zbur*%7dzt-E&<$ACXA zQ}Owp6RC&atY!pFH5z<$u28Ja3m_)rnLSaD*@{-d+1%5K8DwXXkzdf&g21E8`~ z=gAMOEqG>11QN$nBfmrfKqhnmC!Q);ghqL{&#bc%DBGwiNL~xj_cBOiWG8}+j$V06 zEnNW7M}m5&{dW_#Ik-1FJ3oE+pbRJ_xcKHe)>7np-FWP4H*Qowp@n7?@v2sz4dD+w zYnImn8*lj2+K{ShnT4o?nnFb6=&20wU*JU{LZlWTHGxBP{$3%@7@C1l&4i;iD6^3` zFN}8HwGn)irNybzdy@7ghR1a9 z``dlzYDaa^i=6mDBMuG5fG%{2U{(lXgpIZ`_yI%U~+$de~9E^>7-^uzb8-`ob6CjtIVxHIFN1Dw$nK~(Y_WZ3l{?fjwE zf_(Q;UQ|jW@IXn#UCzB`3x)I%aE<($Z4)*wWJB-G{b$7Ck$Mf$N2vVjRcY%`+9c6^ z0Q7S9(~0ZPAj^E^p&RS99`)doj7DZ5X4eW+v(Hp}?$eW%+*`}W z7z83p`Rs%#=nS2tawS>rMGX=41iU;ew4NxZ8&VrgyzIcSgkpQ?G=3}}ULsH%4rwi% zI1=VNHz=7ow;%2|x_A1J68-E_68nV7 zKXpp8o8b+TRQpSQ<_tR_uY(%%YUH433gaOaIQ5VrP{k$Hu33M-R}zAHtwIMYg}}Qq z=W;2ggg)f9-Emrka;Gs=@xVGU=Rc%`FKn{~I97IzdE4Wk1lt%jn8J&=(q>{H@H;)P z{i2u2iATqmVHUvd{Kf+Xd!j$qKQF~;Cl`%2&Kl#GHOe({@!CzJ?w~x9E*Y6)l&)_9 zMOFP?r3}tpU0Z4sh9iTBi7)15khOU<4z%~hw2^djNQ1s*VE^TUaB;4qUcG4>Q{&5)drvfpEWu< z0Q$@s?E~=%C>{Hqd>S9ct9Ts@HsPWX$g>5B-~dF$Wh!`% z->aQin(lVZ%rF?I&G&KAS+^puqx4obaco|iZEPV8FT_l^8Y#(fI|-yn*q-W+Uz&f~ z=m+d+vY;K8>H_~LWMfQld+wE`Uv;_m7sygyt%rt(4|>2;Ii|znT#>=(V3!g!xbQe( zqKq`0Ftr#v_wCqeW?|mKZ3T=nf|`y3_CV5-=x!#U8$tkkQg7zF^xv)CQUog?Dhhzp zHSx8y3K&jCWQ=gnj);pBnRvg58GrQ->Bt8kebu4gAA3~T zW{_M4!n#h;jAgI>oTXPgEL?eS8Yt~&e$(wn-OgMQ3vOSLgSeiN{GZJ$5#rKX67fQNiL zEQ<`X2F+13J-2DrhKgdKC68(N)fnTZ{enRXz-ww{8wIQ|E*HNwVFj&|(zW@(A zx}~@fJvVLY`RXlxs(!+iW=4FA77ulo-{)*8VFkhr%9CkxA^a~~gc0*U!`O0^;yt#!5PR}emXPd4{(*W}BGaIvu& z@%30aj0|$GY_z0V7;R7zq4ge5;8)iuGOm-_`bew5=1Z^hoxk1;B41`w^*JX6qH^mU zk=larN}X^R}_g zsIgbFV(0qcZqEZd7+pd@plP_d6SX)FDi&okj;F><-#d|wGJbAZSep=H?K#*rh)ceb zJ6vj@nRB$+)?SB~9e!pZhzP5^Pn2X=D3iBb@$;R|E0J#L((Fp}j9X*vc6n-?_9zz2 z7ASvj#>GK+1LA>D=!Im#u9>wI<3ibuBf2WQX$`zNj!A{8`hpRt0tq5OmKT})$m`W( z=tVPyr&K8u>tyu2uYsQczn&B7%q1;@!Ig>Wqbgi8cj8TFqiKF+akW$i*P*C?c5-Y# zR?UITXIh-~SC`{VlaXHzla0Yu8BS7nRd`lDd1dnw|aJ zvQh^ulplEl>dMMj?yQ)LR?h@Jg`^{U+`j3#*)NvES)3Ie&e|%XCEo0{J4F%q!CfNh zMeSLmr>6=XyU#_&Om$8D8r~q00R53#j}7qdv;irjmZ&Cj zAJW&K(1L_iZFUA{K<{Ek0mrt!Z-b&Xv~PjR6dFHr#ekWll7bVkk6938*vFpMbN7n- zwqqhuMLGAA)WT4@kx7k|GK_@_htAp4*!Rnm(E8*A^d?uz4tsh)>zjOsGNW;P+qP{H z_Y9;aI^NwLO1x;3+hQA6x{)cMef{}w&+d2Jrv}cQNv^4n4{D*tCniLb^Lx-rxwzxg zLiF9c`kl4cIHF{)8>Q*2R!?i7ra=Fo9=q%~XVsXo83&gXLg0IV@bJ0k_;U!v)Yo*8 zXt>X$>vNByxy#sZ%{&+N_Z_j_|WLs*KLZ8OI(CI;LQ3Y$IyrF*8*35mhrl zPT#|=AbA)BS5}2ax3(jJxa|x7iJ(^*nV8>4G@B1Cpd+>66jD2QkQy!(H24&>ng|^= z()aQMB5&E(bIQdDAef#$*P9$^N1ocZ91V}vSSf*(hty@_6YpJ-yzo^u)qNI6-U8{V zNz`y_!Ao)aSzvIZErv$z6)AfF2F&ZP{|Kh=+H?Et+grO6j{LN@YC`XFfjfkU_D@6q z%3hB`1lAvb*_<{dm}HvBJu?{H&C6RcqskdIy?6B<+uKsKw{7^Z=@$ zWD5kV$4+nnBo<)YbJxSetFdE)u?O9= zso>hT^0*XVef1X6DS-jfn|=lB6T6miw?(+OuLKTW-&&R-DW($d{X#wUZ)<`I-9Xc* z9QX}EXaRe172)LK-Z$!UEsF+zMdqea{LxSf!?rGv+nA`GLadZieBiGWQXP{6lYxj- zRWufA6Qx}s6({aKnl(Lh`F42$Shx~n8*qg1!6E4OfEi`hka`Tp@7GXw*7hhg4v!oy z=QU7vuD;Oxf{%rj)e&MXpwnwW3@OK`1Hs~_q!W(po=g}fp3mfJRhC;tk{2*E$)K0e zO_Gr1WgUqpBm9+{mNHz7^C*mb!+*UA4AEw)dZO9U8L)Z? zecTTiPc-}k&0cik(383EymbPwRe`1-%UjI{e)EZvc%-C8`FRH_V)lr;u;61)zHN&u zF+2chjv9~)zIXPY`zJssg-O%~*n%-pexN=>S+obY=qf;&S>~11#03ZK1UMC9sKeto z;%F_#F;s3=UmlmTbTwSTBn(i)Bj7UN=yCYJ=^3ef{B>W-{e9N1*Kc3y5}AgZr$6>b zXE_rmSOet0%4~=m}d~IbJ@~^Tyo`7{P6W-a#{FnPs0k?Lo3nE(<^zY`4&Bb1l z&0u8Qu}IwW zOo~m)aMB1&OKMK8o0%;bq!RKczXDU5=0aP=l`0h_=U}?t*`A`^8?85 zf2?+U6jhn(np7CXL$cz#1B`64^Yxkp9uOC|wxX%B-yaQ$ZV(CDl`Ds=nx1bZ9KyU7 zM|2nRETfExMjcpF)FEepoL@mpfuay?IvKY`-2@8-^zZ?f(NOY%`;7dKw)ZR!kU+P&HC_f$lHc8_kA0YUsQ5apt~=3-RYbCSD$gzy zho1*_A`r6^j_d5?!c%eC{A4`#bu@{=6{MrA6&gd@K)OYUprqN1FA>t=r*L9m^ttil zK2?5NE^*NHpzc9Bf?B3v9N@xcT$=s~_5F4WJy7 zNpCphHMT7vH~zWIlDabt5CX zv6JqE1xV17U3^aeTKjiB=_^7akqVe&>v8vdzQw0O=BD=M0GPuT2UvDKI-|M-AvI;z zsjhYf1xN4=U>B@IU8r0=c!^so%9f;=uz!^!B-3;Iz zK-J@?PcfNI7V(_a){gz(c9AhPq%-8)K84A3DJkcPV+VQz0m!<$((?{!a9U_S5Dx&z zcc@AeGvRWyTkfF6{t#n9a4`a)3w9nI)I|G_Ak&~KG!06eIkyp{6(h6K8n9jDZr&;Hyi#taWMjhxb4{41{8~GAgzyWnFHzXS?)Iyae%+TF?6y&?EG%G} zfw_MZSv^PsuD@6ic1ak2`*ER&UxQ;(I@%)bq zpa79pVapab7#VvF6+Bh0_H8tFdjvZt47#lyMUF%wS(Q-ct1d!Gr6;~md4oRlS zgYCdWd#QT2-kZknGcp=DqJ#$ON5oYvK)_9%w6Rio6@-E26L;`i$r9CYw zsYAe%bQ!+h;XWPxQQu7I2Rg{Qf_j1D6i!I2|G!vwk)9DzDD4vKXhGG4G8gvMGqLBY z_0Ts0>6>UT5eTuycRb^M+={C~Nsl%eger)($jc63m9TF@Hn$s{g0i$QITVtN(XZPe z)5NAj!w6Tse40NLab)_uLGi3k@4l?3-3m)HOc;5vOTuc!!{@7;?DEQOGGYXuA@r>c zY_-@q$= z5Y?Zx$X&(G*PmH+iMs2QB7kJVrD6b!8Fbx+Pf4fZ&g?mvbWBIt8Lmz;u7&?2?=7)% za#r&k54{V5D83!2@E$%(Ki{ze8RGa9Yw?h;)=WVh3~#=o;*q;UkQD2p)7_+Ja`_)KgMRsCR^H#+zC|GAqgU^~-F$ z|NapeVgGOP;6E77sMI%>{Dyy@wzqlEl{EL!+A$+M;{Vu)7}>n??yk9O0sr?8It_xY z(p`P*^#6miNV@(vx7v#lzVEW;Hgh4|m#psvb(hO`XtPq(#46flHMzDT}P|Logxor6-4%}(z zJ&ly+8VcuWZ&Pp!n@YgQ(m@E79j#!M6@ri?pG3&wsdGeXkMERr6r@u?q58dZnqZNl zT@4P2`=NEr4G#a4xc+;M8QxHM9O(x!h2n4I>m}}n?gdDTxCy|h41nRu_fww328v7CnHB`+GSbyVLk>~KGphK+3 zmqmhDj@FO+Ar=rf|24N%ZRPQlyQvm+E=tFe^jm&u-U)4NTuY6YwG_;A1Ky z0N_)3)7>yu6$Xe0;IeEZp~Qdt5%R|&s=xJ4F>qWZtycCF_O&Y^pa+?~F2h)c3e4u9$b1989bW>>=r8FG z`p|1r2!Y%HQ(U0aLm7Mdgo#I`g(1=&umf)2-N6ep24pCxRt*V7msu~9`v;J!86WJK zS-UmQ!QMONu{}2dcn8eTsZmql+7OJg82s`yyf(ECy(H4}CFluh69SHUaX26igBdlh zd*K&&@MF#Wm$j^l-%j9sCS14&TF+D)4*tlDFEq2YQ^A`Ka>0=vfj_O`)bDP3s6)u4 z8n^q^++Osk24Ih02BH{Q(!8n4&RSe)lJNSfRpw2&2=iEIRcZ4M2IBBltjPcFK3d6% zerJewx?w9AG6$tr6TZ5#Rm3wA zLk#B-QH(Nmx+tTuLQtEAvFZv#Ikp2GkA z_$0=V(om2#yiZck7Rp-BLBa4xdNfv6mbJs{{V#&Z|5SX-4;!DV$NmSPL-@=^W2C^_ zw{O2Q=ZjV!Ed_WHnOZOk;zYh)D2Ja&I$4u=zs3E;uoQ|lbRfGU4s&-lA6C|7B(gtI zlNan>661+%ofdw4#CJRucpe2UC%|{2`{$|9FK-i3Bkz4#4Rldx~ zj5m7g2db<=kdo~1-U}+c0l56O*+^kApf_$M)KBnhYE$`7czE^dD%D$8P!M)Kd-G24;GW#=*azxa&$xpK@3Whr@rHo z!X)YsoM8&!DL zDT=K>Lj@fOjTrNUNpJ!WclfplRYfhfvHexu-mHK!Ka3hD#Oyk-^VyWhTu@krdN_T1pZ^HYP*TWnFeITW=eXJ#H2U^6%S z@3$~Mc(Rq{IuG00t=!?3>Fnw&JHPhBmj(AYcCl$t7(FNiTk(2bIg};&gL#QXF9uku zZa;2peEGE4=K-%XCl84UY+FzNC|BSAOYfzY*pP$--YW;U!a(xOJR{bF*j0tIG6r={ z&26pOv+QJ#^7bmk?XOS2wc^-Wvj=Y|p-upQ`uh7Z``1W>6TN@BG1}))1QR8Y36JJvk{bH zm>&9`w)CC++&Q23iQiV7zx|G0FLGUY^>~NB>h?>0eHSn|fsEva&AUc-t0o7LyteWz4Z0ttEi#-TOx@mr8I7=PnnT{d2myO$t< zw|n`?d15~F?o54D($uK!`G=dd*l?F@Rl8;4gh9zX!MuHaea8(ALx3Q0d}B} z$Z}yIuiRf5_>*lSq`B}W3piG*VqlzwfUs}{YJW#)dtHlsj^tF0c=}vZezQ98q(=0r zR8|$559fr;vy$6|rPb8l-W>(|uDfJzF$~|nU2L5T&8v{@39i;wR{p{@u$ii%Elo}3#gXL*$+>Xngq|LA zNaecFLwmpF83<$T5Q6|A2|ExyN+lAjpw-;&JpCVmJSc>t&U0<~{s<`Rszzf;_+zZh zpZu<1ft_;r>u6D5Y8s$m4ZM?q+&KYSYGf3Xrfw4(GV}J$Ke6BDGjy7Q*l}67#-V78 zan21DFL>`_B867MaUSQG$pkkkt}r_fqc@#2Osg4t#I@lDfI&>!Ao?+F`1lq1Jm_hr z0ku6f21}|1x#2QHQm-%}k0|)Vr27PL7}0_-!?i>kco2T*Xhv5>+h-6x{)~cXf}Q_9 z3`ZY|&ax6;`}E8Gx`C5gY|4ps5)(Z-Y%3#FSKxZNx)4hXDHv`ElGR1fKGU}j@{59w zXe~%D?+QQINDx;nR0QHjWd_A#oa@!vChvKJP~n+=9OpqgODjj4Gumje z$>QDjPdH5&JNb?|9<6_Gh=^&(ut-#p)h2$$s9-+C`G|_-|DYBKrp8f@iHWf*$Yc!K zd~5ro++6-{X*>JrkM#BDD$KPg@4oSxWOCx2qb`ZvIP~OLDf`*8hLgjGUldhBHxr^E zGP4iSSKK1W+oU6Au)|MBm-jTr>!Hr5)jhcK5Fa z2V?rP>B5Dt%udCmF@X+pH5yUt=vO(GGf18Wv$0Krf?OI~LXjuA)YZXsVUk6K1_W$2 z6)MUKYAV!)Fi&u~Kxr?Yt3E`NnQmIjP55o9<$IXx^SHPwAE zr?GHh#`m#N3t-Rf;+kaK@Au@uTf#M@gh1H50OhlV&epwe%DSc*ptKtp{iM@IyNX6YsO7u40gK9Ri)a*V z;0D0tMueJ5;r;vEbK<)+cVg`2!vi#M6cQAi>SgF2! z7usxpSRkfK7-A*%hF#u%UwZM7@}52_gD>K^&_UaW%WP@}>*k%@;oaD>l?a_w6orM} zl#i=^;Qk_@GLGS+_u<3&2f(@1x zNKjtMxx}BCS%7`hpB_0q*Rd2q%4!s&Xin(pf7z>l*P{5dd zN_9Jn!HY9%Fco?j;TeJsX=3AU5w_uORyrC*oy4<$1PU|mzf-vX>;)%5`Pysps8Fqj7R^2FAN3w6sVTm4{wT$;6`oW_W-I}#Q-c=h)%P@h5jv}=* zPxsu#x_f5@d(|qxT|LhoI^QrZq#uoJjBvNj+rA*pvVyTx ziFl*R-AWL+R^7cp^Nx<>rp>z|RR2&Ju&JQMhqNj=)wAjF6^Z*t^3j}I9_FD4W#vn% zrv8Zp4AdEQ=fb8zmW8;OUSft3IZU|6k?0-Q)~^3^Ro0Nf!P8b%<5yy;AmIAw-GO?D z)zZ&AJTAx(N0S>H@~9}}{+Ms{TQC|PzAyN6e5WfT_wlF6$>jP`_zck~$lKmy_pJzl;a+@f2&2bP7gEX=yQ1R5Mjhvz_FSnjAI-LC z_Q<185a=@#-WWQ_!_EwxcHCn z*44dB3pmN$<6r#99E8rxO!`!mb06{<5OU3KSN|dkRP2xA_$ojLy3r-AkBY}lZ;)-Z z_1{Rc%hLlgaC`h@mYw;jGh6;3A>kk-hzC*f(EE->cl^LL@*3!- z1BRcNq3JU_2b$YusR2fy#79N#1V#cJSz<#_3I zrRaF6r0wjn#9xGH;aI&n1nJLfVv;i&Jyq1Pz&O<=xrwaLbonpPe5?1id%fTJ^vBgr zcAvMzX~ubP27H$&y3}0jdljzK>%k$KlNeqaXr2NuAOa~ogmFA1>sl~6cJ;N8Bb=?f zV2@HMH`RKXOl>NEAJ*vVY8k&^O{Orq1O-|1N;}&G9ZDnB$@38RICd~6*gLVynU3}L_} zayZvWJqURKr`~mCuyUSkF8yZx((cvhlN+1PP?iVAfnrHRIVv~tmH+S`juljC`ab^E zTjHY}hjjJy$mE4tX&?~DX!*KVZJ^v0H4R{rS8acbMtE=W+;2s3@xHX3!Lb|s_vWRa z|Gs$K+noWX-jeP2p2fD2@l`M%dd8G*mv1IWW`O*W90m=y5-34>e8}o(XtE(bIqht&;sE}4;ix|Ludsa~j^zQwiWQJee2wDqo9&W}cl z!54ByZ-1k$c~!Uux%(yw?@*!`>GwpR$9{gcafvRkg(0!7=`533vJXiOUtbRYzT{=@ z-!i!D4FsU+Ae)M=zP|bUJN+$e`nh&(S8pGcPSL92N&}fmZ4!59LJEgFdKtE3P1Kx5 z4grf^Gvi(Z&ORP zOY=+^ni2|-Kaq@620$3qzts;}DlUKz1|*!}wqJwMHKx&13j5yH1ag`rHy(KmjDf_i zYljj^_DMSYF;HGf^(7}V&bTk21Qg|BJX};Gt9Scux`YTH+uBE|sTcfAOI~Ycb{R}bU3Iy0#JJXCay>en5e!U5U-kBzw)$jEw3xD09q2BhpzCpkAO87>>GU#LT?YJ9N>*wi}O(`bnh zz!)G1(ga6@$=vhnG9XnVz3k9gro)L^kT|YUd?EVdb*JPnd?sm;U~m!B%uAgdVcdv0 zD$Ox|i!(&r0T4(Y`%;OqjEuF}U>Q?4)D0ubagYD2vF{GYx_`sIMM!3$2q8r!l^NM9 z3Ymqhk}Z^s$Vj0i6-AM(GVVf=m8?{ftgMigm6e8({hnVv&-4D?|K8*1IgSVS{hgn2 zUFUUP=Xs9U#lM26XuZ3;X^PicLLzTZ$g`o;=hFJIdq3nnRk*6T_EMc+`Q6Oxm%lh9 z%;H`It@ouizmSH$L1S8~V;zb?XDikY_g~qlgIt%g_goPSY2%jUgoI^vw_S8=8oq3F z?7LIb>|q_R=3g@u-y|B4vTGkH@4k3u3q7?g=xYZiUJ$YWKL5o(wujaVuEI+c`tEyE znRHr;E)Q^hhBaV=c&5RjKtSL<#)8)Waskv@+aOI`Co?8&=GkuJR%90X%3MuvDmLk| z(=$*nQregabfVV94si)u3A^|L{K<2ckPnLM3V?hv)bUP%uVRvB;!sDR;Vn-T-a$;P z^LziT?kbsBv^o5G6V!-o&dbipjw)%K$y1QC5% zqpx-mC;c6_I!ijmJg_dA?!byn7^t+{t#AV9iW0PJOLrAp zMVpxJ(47rS{-*RojM8B~KX+Q;yFHjJb@#ID39Oy^GSPsD6|U{n=c5u5%SaIPfZ43V zVU6S3ram{^e9C&986S4$=IQ6X({2$-+YP)1OWBqis$CCYV~QxEv@$})ht_A{_DU!W zpniNkNT1wDE3SPRS^>PwU$*iz>)iLz(rXU4I+bgZ~@Ht-o5n6K=+pQJA zI^(?2%TKivw|ZMK)=3X@*~f-pQKv(`FAD=bvDP9aV{UVUHz?isS&pusOJ(=B?DX`F zj&(_waDSBcQt_2nJF* z8TAwNh^&p&SGv)8-;YW57BNpKVIsL%!qISJ1z#9$r57Q2lO^DuN{m>@`~lv4W>?RH z9nYpnN#{`)Z(LkgS#-42_LdhCepBD01pnb;>mSz@3qVX5mf!5aIavlKY9oLbG#A3k{FJ-RNlBX2q?-d+WPWC!ayG1NNDx z$^)18WObIUkVuNhwL{ytWTUh{`4&AL;ohV=Nk<CY{d@^k5lrnYhzv)Yv*dZdL_La>ECS7K1OMidqy*NvWZNXmG)vyDQd zfPvH-E>>snxokaZj3P#|(Cd-&kK?`0g-QnNNczb&w6#H>kyVXq&2r_kU(JX7uY)lw z6r?}3uKt$|bfl%N=Kxtum7({nYrxb0S5(4jKR>Ko^BxPRp*(H(lg1?LoZ?-WS~w7SWJGYRXWdZyS$C4BiSG(p9 zsjgy1VlAHn#p3(WN{i=&x9W|l%Sk}aud%H$k_b5lk+Q{e07WEBvoknbuxBhyM#pl~ zthprV7i!ovj5*ETrrn}nkXkeqxqYv7MUWt)gXO0MX?Au=zuZ#ic2QDbRX-ud;Qf<( z2L=)5v5S|EdKAL{R=&Jk;7>d^A1|fSqN_}e|F)tK>-WgX#Re57V4}dnzj(Bn)8xrY zKg-sZ*uRXZBmxW#sSBlP>H(#_LF;2*WubBJ5^#wZ4l7`EP^f7}^!jyqv`G|ogMlzr zJ_iY@^WM@t4sA0aQvY1&u?ztS4$_cy*URZe3O>S~uKT@9fr?Q}IEA@@=4eA|1NCJ- zYhNG@L|RfWXGV}VESE-)!=p=Kxv;TUcSL&~;pjQw8SBXZr7R#ou9@iWY4@AMDucJ8 zFEtFaYJkd4l8cY1KRS}tciRBBy(jNC&o_C*#^!N%{jZ||^BYmE%E=;l0@yn@kpkmf zUarG(eJI5Pooz%I1J;RWby4GqmbSJ^t6QS;51e8{jD|>+ zUubWCWw94rQx;OS!}YAv`J?kWz+6U{7ItWD&c12&fPRu6o->z0hnMQ~u_nfO&uH-a zgm;+yqR|QGKI}vh%|EUtADJg~X4a6*{O2b3qt!J0`vyQh=-qChN%uvFE;b}FDRk&l z-crDdmmn57`1&A9r2?wll(77wJ>U}!XS6|yJSCoBR0$l^_1r|F1#WoQ~DRty^f)WAeWC&@R3VQlj?JFBqb0!XIRWlVoZeD ziJgoH2cG*c`7D0-DyuQQ{0c}KsF5k!3jyyq?0T_vT?QD3Kp~bZ;{y1_KJK;f5YMfi zfC?NX$UpB3O-lMBI?sO66zoI1N=+irJovpA6GcY?KjFx0gNp1sZKTqamKS71A>hFu1Xv*EWc=0cC4fs2@KjJKbzR*resSEFdd= zv+bsA5HXz4&QS%V3tD9>JbiAPfrI?;mQByfdWSsj`oYOXr?{Dw3Yy_$*Pc>hqGy%) z(-B<+#K&V(`_fY)f?8s^rsuF*R9de1*gYwzaVp*qmLw_)q7%htp*sz-oPPRYdw;kb zc>5}&LMuSc;x*)&!JuRz4!=`sdRN|_a%g*@0k@7*&rgfH&&*xaHDVKqd18=e<`~g5 z@@9LC*&1HyGmS_TQuc1yXBAjl28|^YDw|_6$YCH`euXHObAEQG+9q=<-u6RY=(4;K zyDJ7JIA{bu)4c*{%5S-ckTHZG^kMa=aa6kyLKDVjRJX<#9=vRqGxqb7!_y22Z+ybd zc#r^L(6OSbpdQ5Ai&5~7xCCJS&u`5A-qec*1Vv$XI0sc|3dUa{RvMX7n_hp6mF=fD z{ZDW4ZHuOvlHRgB0voQ`4xf`VLkStI3kKfy=DE6qOjq8Rz-z*w&)A76L^N++MFEgcQj}TYHnQi@YX!1+$hC zWTw?W-aEU6;8%bK6~1}@8sv_`n3*UKxnY0kBR^R_uhB-AeTIKjVm6yoP*z~{Tx{yd zZ(c;cD_tFJreZ56-F0wU&yupNEJloS;QJhY{f0(r!t4hJDB|d;RZ`?ju~ecggbMJP zhilTe6OG-V)|aiQdmVcx)Iif?MWnS5x|9-TU(W;jkzWEVe6Ik^q0nIDkwD^(jxTUX zzcmS&d-nx8&9*c4KCRh<^ZzkSFbs76%T9t7lN;5c>rnOn$933S; z^*g^->2nX=o5WBq?WRPBFnKSpe%-+gfNuieup_Aa!6RKPbGorkZmS9RqnjONb7RF$}12 zgK1!eI};KSQP4qbWMR zvJZFAJk>M-4J)f8I%WUXYx-?T;C~C(;E1$TYcju2BBBL@02Ld)Fn;AEUX=4Ym$sm9 z3^?^0(nVuRw_Q^$ICQiP3L1rGS&~PM9>H$eVlQYU7&k~{rD>d{2-{8I7IwM35pJHv z3^0(#%Ud`U#KgxH0ak`ew9S%~Caao8B!qv~9ecunAsNKWds`zhD=WfJ24=j^`nv>J zJiai62@q9q%smXxd7+0HEXgOfTvSP7UUP|LXatLz;LZv8arb3?YZS`S@gTZBh)BQa zfRbJC-2nMs)b!-2iZNe#=(%eI?u z?AUx`169SdmHA^}cVtgC=fR?qfc8rwaFOt57TBP4fU9+->p}CYGSA|Yt|lS9s@pak z(1~O2_M4Ssr?$E4OwCQfe3IbcfcC%*A@;!9=<(S!@-CEQH(XOyFB@zo86#ZT5p_*F zzL-#|I@$edPM9Dy6DDqsH=6Hgv=7~R{M`v!-Ox5tXD29%(-FS6w|U)F0x!EYmuGtI=Tm4jI|nfA~V6^mu&|XCNf{*6)4w{xw)V z|8Rf016KS##(He}AMOufqYSN6V}dodYW!A$Dmxn?JnAi5_kX_{Pwbh)t2G5Z;93FtiN`nhW|^mdP1aKkb9Ti z1-tO~le5-9r~dClaXX3;PV_p!CEPxi`exN-%ra%>E4DppLUedbLOk{i79dWb)(zWt z{EZ*R6f5-FO}t^rrCo@{QKSOn06JNxux6V$kqKXGb91171m6Sz<3m5y^PjhGSoZ~j zy+ASK{(0)YvB>w>b|34-UUP_-`Mq&8tRlh3XF_eij<#?lX$q}HAvJ>pkKzWvuHf~X zzT$sd+BiU$^Iuu$0mO=Ji0~#Q_EtFH-heo3Z^}*i5BH>+PCf6%%Y5VN|9cB|r+}p~ zOW;JymyolE*YkjxKs3prnDR?lAh~h~m|QsoH0y&_-+b@G9bAn4L}d`iP7JM&jNE{% zAAQ%!rKLQ3OaJhfVxuB7m3Kt#9P?cCR{)`afKkRf@{aTzljW&5HCRC5`zs+yiFZS^ z^PtKE#t^(+w_!zxc*3Pr2Vm&Nue|rK%8=v#(=#$aey9Y_=!SlfK15BbXx9g?b@V(~ zx38i2U-9qNp*!#bLdC7%v}6^2rF-Bv(|+sG!11uEe(&LUuOHxSTcZ|9(DMl7b4S7S z`)xO^&}8uJe=|yQ& z!T}MUMK+d%jZ`s*V;ViX*MJOjAYvd;VIs49culoA1CZomwvp?E_1K9;D9S=#!^^qM69z+KWSg2IH_LFX+;}v9fr&@|L9?&`2uOuU+(3dhl4(&5otlL?n#o{H(Vo;pk{XS z0L!!w66D$lpQAYR8`77`M?=GzPoFxU?P`_*0ZjI*YV(u1CI2rd3#F%ju323bNB2;8 z6T(Tv;sj(sqUa$i6R4k&NMM)`vIr(y9ErC17=LgRQ2f8k^>ixfA_4s~Q=#UKoIt9m zo1ov4cLjdbdvxupPaGjw4kV3rb#+cJSlf%4imIG6DUc8`L*J6myF1EQ?z2l~II#Oz`qt08w`I2*GGaRs8u(sBe+M78VN@84LK#xDIK z&|!%-v&s~0)sjzO3_xJWdvycSb7d@#6zGdS;Zi}=fC;WJ;v|$qLQ7wzr_&<05~-74 zaMm$bRV~psH|Hi?`*elgtUeRRONkD#ttU#gK&C?^f(Z>s0ezX}+qC3@QXN2G2uoH( zFfrL$8a+DPeGJlXqD;z6tT)up!ou3BJ*Ultko8v0!vEEUn_ya`dqrYzS6JM4EPMIh>hAXU+k0T=y`Ek6?@C2%+F;Ml4Q$j( z@ZY`qj#j@r+wt6*2FvgJ|G5$bllyHxu!1kcPH2b|JGI^3dn=qb|Bi`yIUQ4fh?Rw_S9(>f_UmgM( z9W9}tL4h|*H0tQFqP(vdJ!o;<1!-Zw^vu4{fTwh(TOAbduC|ydcN}yrC&i3}LpRU;#!7-11&*Iw&2?1}IHo#JV7;xq~IBH9aQj<8WbpTMD z|C|qoA7XUW%6OjnUPoYZu3@+1TM4Vs&I#i94|F!Izw-B0ztji$7wlwsMsn(F{{pxL;Gc717j%54RsK< z555?hMRd)8)dmPDLUA-oRw`h(PtMPm92158W*9$s#sISsFE`pdd-@XLx*~~0aF*TB z|AQ~$&F#gex%;7Fb23=6Wb&@7$>|Aymsl;;(EF(lKNgn$^6=u9FQ5d8L&zsEq3~BZ zyw1g?mk;@?5FKdE06;JlA;gMXMuOiu`)IaJD`Ca~y)fXj#dxpLdlIb7$G+z881ZP}y-#~>ud#3lKBlGzY6+4CtWme}Bndfl z@X7%=EX)IbgHu~^&P6E-4E!J~QlfG+8-S8y6Hgk2Dy(jiXmwi#7EGnWo<-~B!?7!f zcl5U?Ai<4R;yVsKJl1lWgC}g@OXCI-!*gRUGWq<6{ZgCh_r+;9yg0q5Bw5I$UI{%x zdaRg~Uw{7Ln?7<>XYTHzr7M5q^TDSpH_anw0zyb?4htGRn2^BARUI(1RQ1N2d40fF zrbeC8?ZB6e1gCwQb3#m!NCIyEv*Zu5pdShBsMk-KC_c@eMbre8P(g~$3n&TDkQE9|1ZaJ7HmS69ZuwJe^x{K+hBt;Bb*2kkjz*o(jD+Di zQ?ZMA4Rq_0%4rotiqnDGr>co(r+6H91|z zQ?c9f=SgCDO6YUob*lUnO3X8D(VR0hhqgI7lH-j^C`J zjH(WQ`LaVrWE(pFuvwR+inCu=(lbPIiG>YGIa;rPxpY5G`q=;TTkR-Q^9#p)_XQ4c zc^V7bs`58_CL963>S)5Ld$sIx!gN6-6P?qtZ_t+C6q7cyUBWB7#gTA=|4_4Av^xe= zE9{3;Zt-LZIA89&{}Hmum@j4KJ&&<3dlt)OzS=+%FUgmIVG(97iqbWvx&NfK&8S5& zYBymOX6E{P;EyT9QI}UIPpg z>rRLnMlt5<+ppANuprFt-fEj8Z%G-hz7dTL@6IVP>lz!=uDb1A3JICtF?`e$ zW&*5haTT?+QIV$=l`h!@Y_;2z-1wevS_u|^U`pW);k3kcex`}5jQ}4Bpdeh1r8vDm z_PKrQliIK@g-qU&(w^Jpa=FTYHm#}gyER;kXmi_x6w7ahP-mAWj7YTN>XUStFDX9L zn}A1gOW6}NWyHqDh7YQz=rNV$2&d%ah^C}|J}sJr$5d2wCLu~1I1N)7M#uE@eTgxh zG|IJWdC>I=nDk^%X~`nRHvZ&oQvWi=jL88RWHOkHWb!Db$YYBmOYuH(OIvSNxqqIO zW_u}P-H{UgD0YY7hHD}W2u9$rQ8_lPY-IH2)N}O|gD2!LB8lsCm6G%cAdd$r1+d9?k8KrN+(BtWi=Kg^B54qq)3aUQ(-yjTi3FbBjbg*7x}UR3(mwhS8CKR8E3XRL zoiS(Z4Qn3q@JeWd>oyZRg_T%Wh&FWFg3vdS;}JZmUED{M~{OlT1w-nJzyl} zQ-gk&s|49|3>`N1rlR8~GTBj3y;8|#2(|kNtp_kJ=@4N19Lq^jB&Hd8=Q)%4&Jsti zEjlC;r;etok|DM1iLDJp+zP(it}$POitoM41>9$yP2Dd>`h}}#%imc?wK(skb@zhP zBS%-2B;BaI`U)$>fU8!yCQUpp8v8h-n5Y;11EMIkwyT&gEablHzvfxLhx_{WSYfAP zxpo>^&Ku%$`+(z#7d_qX>FZNAm^yri5xCQHw<4~;FEQHC)bxWs@93!!gYid>zD+9* zBY7$u!TBkV<_~)sZ8cM3emUSP#r7_D?Jp3j=>emtJ2;d*ot$2v#3V#n9TFyfjSUSA z>zcY~YpDu`4p~R2Cc70!1;lBk?x=Kr*(_9D-OzSE{fKLRJl(76`u%Bs{*T(7c5vRP za6DtVKG164XO`p7{4G-PNayER7!REg8rv)!t&-3wQ!;t(NQ&Gceirbmm*lX@A39C4 zWnpH?+Z!&JHmfJLX6|pZ{D5uG*zXIoQYSq|{FH3aezf^Y&!nrQ8&-=aE!4$b)aXUg z6#d4u&GbavQ=wX#j;Z>XN3AVWX*VC3L%{{krN^$=@{J7(Y&cguQzntaVA|4rIpVaK zotV~+ZK{ol3RfM%DtPnf-B}->Y2tgFYUo%ytC4BFZ}XIU^xx1TolQSw!Sk)gM~um) z7a|#cbvs&ErPx9MnnIj3odrnwdhFUe;L_PNN1Y=448En=;70if)Ia`F& zUZ30LOn`Jc-zcLp$gTFHN#hG$FDE^Ol4Sf!@+I`xo4T{}p9MJ5a1}?lp{qNzX7E#4 zT=M&QjXK0G_IE@bvzYD#-}9_<-1DGm!l^D($aHsBoQlFjJh&1OQothj`b+6!l&p#5 zKr$&Ta%S?fW#>u{nNH}}a=`BL_afh_Z;ei-3w=1rlx*IHVtLF)oT8w zMeQ`Sdo1~tw*(w~p2L22-H4lz+e%ZxpDd}l_1c`wsPjTxAMh>{K zP$L@d+?>kx=b}79>n+pM)tBz;OT6AG5@W!W4=j~7IERV4C06nDKJgw}p^|`H;oX_S zH&r_pw9g0~l^7eg>shJuBSpqea%eDqGcquUo4)8es-)~wTOz=5;*ZFwE%jw@mYtFY zsm(L`&$_w$AtEG_C3Y;xv_TEyiihI2bKU@kCUQS$XJ_f7r{=}%kdhz0HQ`gjF#jOe z)_tB=PhHMTLgMOO1cOE!+omRLqvVAQj!@b@4lQj~LGzdA`<{b-;sept!K35S=}k4y zi(nf*m>>XZa2u?wGd^% zWs=G6$C=m~X=9RYqdn>6yRW#bbwr|k#4kKfrcI#w^SGDRTDvDL9jA4p1uFSsnl4R* zPW=`rd0bu*xrZh)?@ev(`hT}lSbmoVh_wGWx$sd}sJ*AfrNC>%t4*8%F(&dHRHcZT z`Sqp-u8;jY!O?%unFU|-W$val%EK*h!jfqV4i@Oy?-9~q{M_6j{}4RV8?R#oICKpS zAJKd?bRTd1HTTNr>K1hw2B4ie)r>57U z+4tJwV$jmC{)>&N9eCZN(g*0oS@P~9oEOkUX#wIR@fO>jkaq#P4_CLoUMqJnDp?4d zi6UAz#W~+X`Y0S8IRzPu4|Hh6wN-#;CBJ8;Vu=(OS+cZ#zWJhj!t%paN*@=>1}l;W01gtkv_9R7~Rs}&Dg_Z|8!^^)u@oMfU2{Pcfvm~* zYz|r7gF-c;YcBD=>JAC-Ff%gJ(|f+!M+Gq$0ZM`D)Uq_B(#W(#Vm2bN2}+dU(5IwO zK&-o9XjMiUCs-zBn!gTXgJlX2ks(M1ct0tcr7vIALIL9ar+@ zi>yYZQcpp%zhK%u(aH&znhV!$DF-WtAEY|C6}zL-IDdH)zC#y`X2bPrdWk}gDY0!+ zq3k(N;SB|JPCA7h<&H#90>GwkqU*S5(bm?6M6qI`4!Trz2coOpcapN(Y8uh|e|0wd zNx|=x5LNR%9I347VQbWG&#s(sSnOC{IcBsrOjvLwQ)shEN2z=vkfC$M-Im9Xhaz4< z-A$6=Vl(G|WnFB}lXvP7@DrStmY2ywUojltOpO%eFSx7iHyMk2s?^3?bGS9O(Rotr zzScroW8`g(_Y|7LRBITPp& z!s+x_0U`8cEQRl3Uw`<>krQUF5cDd96u5UU9`{wB4!_;k1Fy8}G_sqOG>Qp%SWF!h) zK%*g(|8`iL%MYVO`q=?RO(=ovVUqj@s^K2d*S@=LwUrL#MpPA`C?&rptHP>bq4VEz zotV0@&h+d=dTKLwA0dML^=Bu^mH6ZjQl=yZV8A!aIUNAT1$7LL|Q z82zS8m^c+qrrtdNKto{W=+8UjTZO}t2S?5Rutz`U~9s+j75pb<;Xz z@+lN9jPu7m{s-gByEu1F_DA{U{{bAwP-CbVsBZgPy&^8tC;M-oCD%_FhOWNi^i7~J zqTAl#KX`c+28=&#@=gVU*#y1ve_+XysZU1;&x^lMIDrn7w2iiG?QcC{_iR;(;O|L5 z;qHf7tc?fVzU}S(u6KU$zNo9TX?g9r=bxWEi>;` z8d2Z(mN(}|&!v;s#BJL&_jZXdEM!MPQpPTEdycUylosO6cT{xVM0I`>ON6GCwZ(3A@9PJJ~EpGj#=OGR04ZqUG z`R*g1XKFdq!{|xIOYb%k|IIJVGe}bmTY4O<*Gkp_$KjGwHh0xOK=b$I4bN#mlr9Rk zzRIH|^H<(JLBd10W=sWP;j3!Oe`aY`6ot9oI1Dd8ubwbmE@T+%@nG$mO1Gl2} zd^PLD4P&-#_|@MuYoR*P9lv?Hc#Mx$nTC3fbA0*x7UQRkS1wz~y*Q%ou1*q6j@X2L z)hcc;E9eBR)^Yf$dmr}o4<6;uPFGN0nvr3h;z%$1p4oNX%iuXbmRmPlli2IMqyhFj zy=7GbagvVYurTfw2hW3c4+0pddE5`HGh}z&4RseupnkHAhV)}PmQ7aWs?VkEM=ah2 ztv&khtnrPeP~cdX)*0ntQeAG%%NcpMgTnPpROdbu=L4gKD~{*de;5QnH>B-&Qqs!@ zcI)(*@}X{y(rNrEPOmDrm$Yem%clWRCDxNUpGl;1{H+5%YyGHSTiL&y_8RH6o-T8m zo%m{^+^q5s1<-1Ba_ZI7mwToaw-07=ydXcmlxlWCZN8^3@g{KwLo|17aVey*$c|ZE z0#xP1NM0YgifTho_pi84E?-X0`h6gxtbDDiE*%S%?6mlqp<6P~>vX^kTu=heQ&(THbGKSG43@^taHgYO>fR8P$5oY*BK z)Bq6EX7f9nDkS$v&j27DR#Q`>Teq$ero&U<67S^W>mv_6$<98GG&vY&Rzyv*m1+5{ zU7W|Or^c;nF()57x#;%2Gx}8+ANi;_Kx`~>TKz`CXP#uQm41dI)B3!L1!k|_QydYJqBx@w7%JMuPm~|!ops- z^(mJ?+6v^gu~whV%uF97m{YY14^XdKVH)BRzpX9J{A5^ZWplm*uYH>y+^!4j)91xxE<%Xf1H%S`NU7T z$LzmwXW#)lrpqOXO}FG|8Qd;-BQ!C4bnLj;kcDSgVy{*0y<9`hsL7Z;0$Lat*5-FP z9gn{69Qt(cQFZLy5`AmIFHM8;0zJP^EPd@(5W-O}h8&-s>6bD0&8g&Y=vCL((@TN` zT}D;k>?yDie88;6m~0=p2M^Sexgk?dTx#HMy7^aMhl++gYqnf(nd&Ow^g2ZT?l*Na zQs8E1#!yq9=qnyI`XVDem3}r>*5=HK`|>KaX-gQ}GHyCR9YK??O{nTwAT_k!IPeC3Kg*iqv66N$=-Qa=>8-#UbF(wXUr ziu6|}KCVdm{;|17POa*a#W@uG<>QEz0|Z~I&{_2eu8bc)XgP6LfiC?U>`85pK*%{d zq^YIVjE%}B*JIJw{Pbx7ZQ`0JHV3Xuzuk5f<(WJ2@tId?>!#MM-eqC}R*ACu{Q=7t z-&R#wdbWcX?|?s%vchg`AQke+&3v{#eE9I_`3oK%d1hJ1=+>^Dj(%UD)7Sc%$fi%9 zz=vubyq8@jzj}XoFueir%kyvlex{%+745XD6&28D&I4{%G5v6U3JaTQpu#7Z11bJkA}!B$*()TZf!h1=^XI47s@PebqiP0|*WnYq zB+4IUper7ESlhV~Dx{p4cWhM`N-UsG@$jG5m*|R2NeCTm$MdIQ&SnqugD%eElaS?Cpq5p#wGyPEKy#r^H!9i)ye10h6&e(L@igF(wEb*EPAbKtVWd$b-1z2>U z|7xW5ar2EEHwf>iwz0=Q{$9^FUjVqrPM!K{l#P@n6+k2dkL;f?Yp|fF-fVO?JaOVk z#XkpBz)OIQ8^4;mxSMdJEr7|?J0AD+Of?}32#v` z0{2V*qGxfobYbU))w%L9Z;Pm(Uy}a4!EuP!DJ>9gS;^hO$>-gqHHm- z5_>)u7SX#cQCT&K+iVWeY8q#D37{?BR2J~F44#wb1qpj(W%0G^Kh|R$`d4W`BmHRs z$>`4Q+nRhhbi<_c@t4-SNh@QMM-rDFXJlxuXBXCWa@wtpVWC*oPrr{;22jKYX2C|L zrt16uUNiGOt)^zQWZz9#IU0tyL_GZRJfv%xrgsk!hs9H7F2tqYjgMFP?`P~^ckka< z`|oF1UP5V-3_k6D$2h$?1j;Qb=Ed@lH{&oEx3p$xpHG5gCU-D?fqALe3;y}1uWyeC z5n~^ZW=$K~>F?g17XR-9GVVj+sKj`{JNUmN4|o<&Lp<2<`%LDGeHm6VP)8c2$G^#9!LpgN6qW|v$Egc>aKA?*||-e6DHt zKc~qb8nTrGm@MNvBm5S>BktS^L(&vFhKyW7N&h|`t!Ntu5UV;0e^UN;uX$)~DVZNl z`0rG0Fx7kvlqT%IbD=9}x0F=Oe?J$QiGV+&S`}fm8tzevp9q*#)YQBN%{-5G8)$1n zp`Zy}SQ21y!*L-Zf}-TTxHjZ?O&}d=Wg-#1&kGt+(M>2sbweYU&jL~E)m;^RER0RRABSqZ8Q04TJ`>pCn{ z>iGCca)ec5@f!8k?Pi zQGn@l!Y#RV+fvP?l&S|W?-#2naB!B=+Rucq=lKG@MrS1peD2SrdKYt;$H*D4o-0b` zav3Addu1ypr>QI__YZ53He?4RNhozmQ+<1(Q_uDglaJK3cSLknUY^SSVT>l-1Wtu$ zdSakVN(AG#Z(1&#!oO<_Ub?tWO?Es3p-V|;Kh7pKdDnf<6ix=Arn*>PZ0T7P3%1vL z`2D9ckm;0_p{w1ysUJSVeg#5F1YYa9dj3wdxQP6HeeD2gNo zHrGwr&6oAL!#giszdu>UUtJtF_8^)jgUjy*@nwUzhu4QMD}!Y#I$WE4z~p19TD*6r z@CQ55O?Q#RX9%OXdOH)_<&+j4;}QL|40U%rRt|G)di37+MWJjC-L{j;HLnY9-z5f3 zoW*V=_dN@dO?WVoFXMJ=7WAvhs9acJhbcTo`Y?9gzdLw@Ys5}?=%Qx5PCa;q&!yPw zrkut(aD=(g1yF_(#@pdoL%?m#wp@rJfzM z*Tt1%LhT)NJf?+vFY~-Eye`fUGdzQ&;y2xDnmc_5kxu7ri*zmnHC0i#vm+PG!r9!C z%iGZf>2&}gF6He4gWFqr(3)FX+d4_mA2zko)7n}{(CZ7R@u<1TS=!ht`MO!^_^Ru| zeeK~Q7W7h*IO5)-NB~Dm4;Zbtql1&XsJ8_DU$~;k>p#WZ^t6A8c-TwO8>ng0$~n7P z((-fhbMbJ>d)s>Q(o5pdio01@iE2X?{tkh>lc2Zp@Ng03=JxXP;_~9-a(1)khKPuW zaP#nT^YU^cB{H2;b4$0Tc8N0+~hLX!6%jak6|Dd+Oi&EYQ@3plr>gQX)9)E%iG z^sr{*tn{#_AdbN|Hu59xo{{+BRPN=;1^>I{GRr%`371pOa>e}v9#jkw}6;)^7FuvV1gn7oK^yGenCD#VIe^w-hYG8aI-~vCCuU9 zwfX~PfrJv|vl147^T9YpECk@3{8qvcPIDm$52ray5Y8h2hau1Ae?k4}2T>VKWeIv- zE}nmtXga_=teo8(CFoUconCtXt3ub-(Nf0)_J=fx5JZGm5W>$d0O8>i5#;-qke;QR zJJR9)U_yAf_yqr|v4D#zAQ53m$FX&USzB_uI9dNy@uyovk;Wj2h5hkUB=TS7NLxhZ z+$>=p&ThKS&JGgve{`k&1NqNtHRN!zfO){6Fb_*)YdpOCqCA44y!^Vn5K%rMQC|91DcTL;^}h7v99UxPvv z2LGE0?l4bFi@)?lV*RZOZUb|&wnRpczq{){%5DD-u3*j&hY9oZ33Bq9BY*f|BFLWP z72x3%6od$x^9mw8ix>W%=+MS zIC+qb{BMMD|J`8jKQZGU7K?NLZ=8t#CGc-S2Kn6I%8H zU;KY;0SW!zM*c_q{+F)*()B-L;D03iU+?-aUH>Bn{zt<9^{)SCbm9DKIc4dDoCSFy z7fWW2C{oCU7KZs#MJRCp=ab)3nu09Bc2Ron4gk0$f4(R{W;PgEi0PrMCXe|815C<9 z(Uj3o3IMc#GE_#_d#?Mdb+whEFZH?SMc=B}3-yaYq3ym`%IO_IY&8~T_4BN{k|)}_ zWl$YF!TrMhF`B1rBL@+7QF=(@PJDTx#043aibz0K>=k|+*tF6g} zF=#f_`tI)Om4j3D(t8sF72)RJ#}wtGi7lG_cBOZ_ ztQ)`1P$7@)@-bhF;RC47__vW0I;+O|{-eAAf|D61LhRw3%WrS3qyoQQP6eoBm?_l` zKR$c>BBM7Vz=(}9#riGcjM_Y(TVLvE_`WiGIwv<8oE5NT;PleYe0-K%C3b0xJEJPiW|x z;$kmEAbfNCw9@G-o5R^U>=b@&i9YI_l*9K`LH5^^^No|rrX=n?_D_d%YyzrZf!K00 zvVxAF7h95W)x6$fYaBNj%v?B!}Tm8n5ky6@u@jp)SNn;x4~?|lfo&clwmO>mW8 zVQ1ES!#nYIjfKs6%jocsHuz1RkJZ&t@lZuTJ|3N}xTG8r<7W+?sqJIMpetLyrj*}D zdn_8%mt`#5xl+%APPm?~Y;d=JIlhd2wP+>mBJ$ke^5#K6fw`m&F9Ij=J9p64joI#N zjXn9Qm$7=_jluB%S|DGD{;_K&{e2p%HiS+6P3{IS~UDct3zUT zzWu}D!7Y7et2|M=mkJySwTh+8L!9Yi5=z9TNke!2u{v+{2$yHk5vj>ZFEX%H8-C9; z&x3QXF=@t2-0pg{a1}21)*4^jL3gJFH6u{+t}wav)YTi7mOH>IZ^^iB`>lzWX$}e9 z6zyhs%%OWV2WF#(kf zIoE9$_dC1UrF}HuHS?Ha+b`&anTD~R^7CFQ?j%$iq8ElEB&?n0Dl%Y=w$szSQpwEc znQH>rK=9bjS{NiF_KKP(N}+I)eFxpw6{n}=-{5@FI+;Q;OCY`CF@ zeF<4;kcurm`=rMZjH2^uH;1p)dPUgs!BL$(>g~c9?dC$}rlevW-c|U3r#0=vQ>|JW zJkGFR6Q`Z0Wdg;?F_>I^tUH&)a#1c=pqZ`$J#{+O(8|6}DElUH&x7FZ*y1=-5edax zbh=;j>i055ZcaojU}CaMqB90{A|h$xv5{D<&gLyFy3|Um4;mbF3ACZm4Cfci9c<*+ zu6y!Y$s79R*=!2AdQqyIQNLDyE7LHK%pYX~?xNMG-Bev2} zfcCNN;q7Uw)WQUiEV>RsDf98@2z}VDBfn0)cwrPB)O*N2kvM@UM-EJ$F!5>NAs1&8 zLsocQ0G!1mppyZrDP9fYp*IVIC@87+Me#~U(dkNx=r=VZgb9L0FuSgdvI;28lX|FP zFx279@PX$g>3Y+@1gHL?bttwMBMDQ1Kl+^58I32__7_QDdK+o9~tD!-Bjs%6Gvro$MxM2;`g`T)StjK&5 zN6NFp*mAScIQLY8%YSFRxHb`jk&dYIy$p4qv28i4l$0V#c&y5^)!5<5P^-zBlOqQ} z-_|0-HA6~AI|e}S0z$)=8TzqP?6wz{T=Fq+RrbK<<^5#S`m2!qm{2w*CopEnJ9aRw zM9y@-ZMlH%Q(JlvYq4(*gqdoMr!=}BI=8UvnmGtsdl|nj9~P`5@5tNacJqQu+3;DIM+5+!f6bhEn6qnKz8Fi_JU^K z5M5|j>*h-i)8vT^4sCP+INsr793}xTa}_1~79+nC?i>sPh6q{}-eP)GAdCl%m5DDO zYkk64z1*sLP|etMQ&)MYWR3Qtc&jvHGCEOd%mluBxlVcyluWc?x4C;ejV)?rZOr1f z!cTi>MMrygP7e$%o25_kmIg&8iRPeTMA0h0xoyPPx?qP}vBjmoYUo4LQMxXL12V@w+>o6`8aP{3eE zUxn?j^8U?sWRnD7h9#WTkSV7G0ss~I@e4<8i5H{RxC7j|Uh@exhSKN^VINAZE|!hA zbt#U#&rTBUFG;)FqfyN)_Ptt={z!(Ybu>do2;NfT}L z4k{)Bv{hp2+-YO6n`Rqqtc_RQ#HF!rGFgFl-bXj6bW{r7`{i%36mQNAviiRJ-+T$y z0)P8P!l$jJ!=BMse>uyd!75*L^IOaPwqW_O;BqTka9tUzYEc*>I$dwW{}C8K<9Hn= zpY+gou_jv&g@F_zr$kZAtM&xwZA^WBh*E@IWU%$>mZ`->xraJf}z&PfK9U$yx&>yDe%hbVAdLsnLhn?M_{ zK(p76bH)9oyOxHknkPgrGu~_8*2f=IJce+xi!ivNRawqHPBA2kC20^+rJ@13U6)K! zJ#Ma%xnQSv@#uZh!3Yv9BZe9q+Aht-SMW#}ZFtkU7A(%nk57XE z;?LJph#yX|z9II8g$4UJE9#_BHwAfKasuP){1;7MVz8|D&q8Znfe=(3=#T`*z{3Fa zC48CAP-0Tt{?$l2JG@gq@JaOC=vyvSfDsS9(htu5$fq4f*3sdYbsH~Q z&`W73rth?WzrnTUBaHi5>kt$V9!s3C@n}CEMLs)VN9!=d%O^>a%Z>3U7_rhUJM5amQSX4$68dC)X(R|>2 zEjF!al+$|*Xgc3kx0zaFzKh?-nsoSzzZgJ-Z&QZ-bDkW~_%uNO;(q$R` zcJx_BAD>*3nhzRq=y7vCR3BtxLIZuTnzDK!{4iV+AmO{(t7W+j**D5f9n~wH<_bF3 zLCDIpTQZtR-g)I^`mK5k9~aVQ`(DjtG&J6nxsMN1cVIyf8_gveo34Z4A}ytOJFEQ@@~9!q&sj$4*|)zl z`ZK~O{6`JStkPJvU-)wzz3TOhW;XV{Dc(7zLf!gYaTC3>S!JxrJmv}pI%D%h@-q7# zFeG-_Y<+_x@8rBYpQNz3jc+HUl9e)Zaqt05RT?IS=8zN*rq8$V7Xd0GmXDZ6NBGE8 zbZA7(1=K*GQRL)wy3QN}ME{}P`b{yniDr4(Omt|g98{HGnf1|a7Ur8;KE+n==luK# zn-6JXcQuJW%vID%iP?GjGiJ9FYtoNnWV_z`I_-pb=+`+&|2XnsPPsLqgE zg!(p^9(;{z3L`N2)OBtt`Z-RjR3pQ2kn(gxt%(TCxFc3KG=RYD5H(5mlc)L;iSsa zbZ4z{Mg-QKj={GjPqgHEdCZ*3C0qT5m+b2*9mQ`hf--+gmS~~I;X5r;ESV-|eV@<` zp_9fUq3@@1J3FXj~*!&b&K!ug$1MF6Ppr!tJ9W{Y6#jl-Pv%kD-3%^ zcVufe=L*(DnO&rlwecURHDd1dA8`j;dfIao>&k4Q5RbkVN#f4_sH}hkI{qq0K+bE#P2iUWPvSw`T7luR=U-eFLeJL3})2hS)%F2mPbuk%x@c~SXi(Pto{b+ z{`kbjc=$Xb%khyG)>_#OX+apII!n&IfzpG@*%=B=g0-W&(;s?7gzWe-Th#YE*> z{J<$h#cB{D06J_+(ZCGUEL6!)%T}#w{jK!aer8O@w9He8JJeM_S_pbYbq7Vz9 zgWh&89WX(lY0FJs2I3;yg4fqo3$BJ;BZXxOU93|t_$ZXBulE#&tffo8uE&4V}8wX1St!H81@cLC}zj2xNVrwh4sEpZM^Aklm zsYl_X?I5Y$Un{{2&2V*?g91Xr!dVO|r5Z0_QJ`6Z12!NN_WsZhj)mZd4&L%HHx(XP` z`L1*c_@X!nVS|NGeh=j|dlr2Vnv%i&(5hL3oGo#@<0Hkc{i#(WLg^J$Zilvji(fgI z{BaaKrIsaO9*(weATi*Hp$ezFNH0j_L}=wRzA2fivkvtSY2Y^`vfLf)ypJlSBPR*|`g)&ek~cSHPMU%uJT zw+ydjuznWSzMqNQ|KLdJkZGuWsWeuYAC(SrWGj6$h6i9lJw4sa(a$ zv^XaB9bT1QPW$~7Im8w(BP$}CqR7F)Ha6z!kdouzU`VEPD5Su&Tc;b`g_9R2UYv{y zWHR!X=y?qepmr+d^m{q))d*|Z`7qM9WX@l9#Ge`~bJ(;PVJ^+6ac7bBO%gI>L^7mB(LLl0LVE1Bz^@3wEuJJF zGA2^F59xa2qQoK{n!zqwq*%}2^oFJiZG?yKWstt{ff{im?_1EJxdyG_5UmT%?eq~D6J)g&vP z*v5bArkU?(r*^3Cq%ARRuCF~>xz^twqHQvk^gf|3tiDgVHdn`Q^1Madvfp1NzLx%I zn&%5i3Uh5C1YqgtP9rTfxhJI~5iOwR6n0Szi`#78>cx4%qAwpMxE+nI&)w3>{A6UT-J^m z3ei_$k$NpX$?ts5I*g`GcZ?is`C=AlM8QklrY^;B#Bz?2FxQ(>6adD;jV#=F%1}UwJpzV&+gAR`L`v zbx~D*sk@S%_(Wyjrg|wVHXbq)%`5;`{V3wUJ!+=#aids1j&Fh zsaf#e&BVgO@m?8;ii{lArvZ}KJh4Qd&S3iPxNsFJgtTykeXxXK?RRO=`4>Yv;RORnmrMaRi z-UNK9?E2HDfiXXb$wXSx@`M}GGdNv?A#}5sV|$xL6}w_lE`@Y&HHL@%H^2ZYftsm7 z?)8lF5XcHaCkV$Fr;+H}O8I`T4Dw z@f|-be6laYIzcVZB)TUzRp(8pmT@Httqd7+oeCiX6MhKFL^sVu2v5dOA5ch*ChVaT00Rbx{k-VdqIVA&i2d#BND zCvnph%Adk~oYvMa1}ju8Tk^Nr2=O>Pq<8&zyQx1AeV zPMv-<*(eZaR*tWK5+4*{u!1p(J77=K7K~0nDk<=SEibDy9VV?kWDs~>)A+Qf{v%58 z7+-P!&U4eZK!;0tF*#qhYV{N1B#kOnj%NReSa4~K%JaOh{@w2_LqhcWn@{_yBwhD1 zX2%snljLl9?{{i(k&))?mT+N8DX;e=BGZ%|PQZsaR%F)k>3aVLBwPP9R<$$iuL zw(VxKD(H5Xl_4DKQ`6Qt`|jO{b+G8Jk<;>=j|*QlYBy2HHlvz3&`clm;UlRBQyvb6 z)6C;xNuR;T@f5{z5WlM7K5b!_V3c1P+b$=@wy6of60q<(Z_tJ<9Pkj(hoPfm0UL2#k9cKi zd$kXKKy5Cu3$vAw(|H%nyI+A4JdQ1yYBu}kU`f{Et=VV{-My-ht<6f z2izl*PKy(zAT!gZ@7&rzIZu~_wW@UQG$8rIl~|8C?(R0CUJMuv?y>4pb+;|n1s|Tj z?xxs`%hp???GQ&zeL_*;Z$(Xq)d>v9u6-+B=L^|JGoxb)=f}W+JS{9BZ=~jV?anGv zdJ>Te<=+ZXNSYK9iSQqY3`0~NzEpGGKm|&%lesWUwx=)ymsxYOnMnn_JaKzU#@sE- zM;p8_FB!%saGw+{7`#qG5B4_EW!BbK(73@mfwEd$QDV+ZHSQ8Rnhnm`#e2>dmOuuH zGY2Q95;!Eu;vRRSC`{NA!sj*icuJHziC;f}^XfNNo7ZESx@Xgp&X{gIh?5Jiw+(9- z`EkN4M2&x7(ue?4(%@xJDQPk}mbC94o7E~~J=v^FPY$VRKSBwSqCyEB!C4Qnme}k5 zocJu^xY=*ynVm>crt`v#r(uh(06t!~YR4mC=mszQ01Zyu6*lm(s_K4W_%_?}xhoYK z8dZ_Yo~mRk)H@8M~et=ty{`!i|DX4Fj&} z#MkV#PB>WV&;U}gQI{&QFMd(z9Hsd5zr0KX{MMVC6|{nhfATAKjMNbNMt$mayUwbJ zTn^M%vDao&ll=g`WW*ANGRp5SiAH6E%%iejGY&57{x)Ghr&me2+h3d^1OZ85cR5!s zP2`^Y9bIX!iR+C$PktGWxZGBL^WNj{F*LMnM>oOfUgMDlyMD+AvqfT?fjquJaz^zi zBPW)2m;xQ9npS5VZ-_NqJMoD;K+L#g7 z*_&ts&blxHl)h6Yk-v1>Lwp`yK#w-w_@bq%rF4Bk5HLP_e}rT+l0(S`B<`?0U$LC9 z$MdPHYuBi&g#aIpc)jf2RWt4HR~z6rY@3-Q=C^*k)G?_>e^N;2WAb#E0=b(uH@^$& zl<7pi+dS}X@pEtUYT|M+=08uV@$%jeSr(u$d##k+okQ7#NBbFd`II2Y?QH}wT$;@PW?9Kz^@9wU#Tro~QFjMQ2NoSeDw) zzJfeZ$oaA5d{0a5*Ia;(*5r2~t!^92adweKp`=~!kjyBnB18Wf)@1a3 z{Q%|qD3jFAF4|{^2_dq=dwS} z`MDq#mm^)ZwHUH~ifGr|Q;35gW|oW^PV7rd_^1Do3m_0=!D7|knXbb$Eo$+YG`&&} z!lQxkd+cnJc=7c^;ll4l8nY0Rmp;cEkJ703Ud+18$&rok$v*G5X|=>9V%Z!oxTFR9 zM3dlqV!G)?^1!e{lOCU{3g+X1JJY{87(1iEl|k+wHWG3?1g5{#$3hO4L>N=!JVguH zy0uP!i5)T}+9`naK4tD+;ngszUKxE~LImzbZt}%mIk?u1Kl~I^KM8Xs#^1YBk0kMy z#)5S#n2&!#xrG58|tfuwBKf~{4 zU__6dghJNo2LgVtXI<+b(4&J>UR_Xw!iZ!;_8q0ZSjwjbn3*T=Nd0JT(~)S){;f>x zjm7YYDcn4XZ^LG}SMD^;{7t_G-QTVKIn0w8Fa7Tnt8SED7w@T>YIfUDB~aHLP!`s^_4+C)8-nY)TPZ975yBrs)N>EQRq z6k$~t7zif$cB3t?#A?@}$-biv5nHfbtqUbG^51cAs&Lz+xf4T=!jdIMApdCDClQoh ztcm?6?vNr@lL6}TG7*LbLwrAKdYhw^L|c-bv-=aAs@R%c{b3G;&&&5K!Q|l?i67NW z3@=yXTSh!nJ0}K58OEO~(s(-Y(AJXcr5Xx?XSM>T(^+*BhKQl(RSU56hf^hQ?CiGV zUlymPxyRsi?;7rGs;peLOApx)9_)oeT|&3)*}ETvNe}M4ad*!s?w`Lu5z-!STsXGy zEcX4q6;PHRt)|sm7C0S~LmSPCIm$E37WF?4h)ZQzttVRFWsA4tOrle!0PYVIUmjD}K=6?1a!_{Gme3 zbg47GpEVy9lFpZwD9$`k=G^6M1}uBBk*7U6lu*3^h`+tJDm;m;5cA_tAc`ETEnXBl zG?Tad>~&@R;)es(=jCOsr?#AVTvS;R>$VLV^vHQf{%1hPLoY%FAc|4FN#V!ZeO;dEO+?}kXvHBGg+ z&04KuFsmKTiQ?!H*w2TJg;{O&TeXzxxur%Fzv&y>X&ky0tx~GlEq?l(iwO-)q+HEJ z(n{beI7#r0TB!Fqyz~hMU8$K0xuomC4;F4FWsmjcW@51rQ{L{l?k9kB;O8|%K}J%Z z6n9@w+fVN9QUXc%9^nr>jyL>48jmZNF{Kgx=90xdru=i_V5f!6P}1wtwlj^IsOOy< zA`E-ify3A)4FLhA{=SHV%yzSCcbkOo6&3hxFi3vn^yd;TPRx?0-dq7zf>d90hN&B` z+WcA088+wcqVs$`>n1-_e`d8DjOU#+FSkSi5W?8D4t@mY$~_08j{&PdO-zjG`=bUT z1&#uRx!*iOx(_b&_#EF=-6Y=sR14b(i#`9o807vCpng_GhtU-Diy8ndVZ&&_k!=@( zJXY`U1+fB;?U$vov_Fs?8j0PX|2$}G!T>l5f;I0a{epofe0W{UkDAY8?{UE67WjZ* z;O;|dr4rd|zujPJ6V#4_E=itW0D^`}B{dQNR`m0HD4y_**}BXuF8e>^F~=70JDWe8 zOuY5tF4xz^C?Le9y0}1UCiYJhZtkmYfZS zyH3=MCPG1OlIN&oO$ZydI`776RKtLuM+4LfBnjjZ{pP<3yqXN6-IeUy-NNI=DVLN&X-=mfgXnC<)( z$nFu4KL}Yg7Lb_xnecfot=A*C)>IBweyw{VDitQWoB@k3eIJT^uZqN``qc7hc~tG`T-=eps~(6^6yp z$N8u|a;OiHCGM`cXi$8c=+xqyHHuDeXq;|qGJlTArDj8{XgV(&#skESuFlV!D{O1K zSzIPVsYl6K#oZYgT?gY=xPz;T-xQGmAVGzt?_GrVk};;>>t89K+JwWmP6X>Lbldv(>{Hee&n_MW%*0Z z!%WFo;vloPRxCOLo1<5Bv_gj28rP^Ow>5O^Vn{KG^|pf1 zWA0O?XHYEdO^1u6g7-0aA=8xDUmu|tH0UF9i-v~uo;zfmQOn{1L?P~3MI+b?A@RX< zF^G5+qRYNm_QU%nnqgy6TYNQom$2=Ki#ct*m)CHS(g?YxyK{vf7;zApG@;g`&y2BF zwS;kf6tn116d$zGprD|uXojK+!LHy3l?^r5=et3opD_{>%I?OEEBdeTY0=MP1uvdC0!lZU z{kBP)*k5CO5)|kZZ#SO4xEg!P-4X_xo1M+b&h|g+FV~_nr~Zhbt<^*64(`0Gr~Hts zfQ14?*68)Yuv!p~tf;4n87UgdjmD8(jpp%o6<*TU%|7GjA zfUEJmyI)gEWP7)*dIO4;G+!$vwf2^0F%jkimNE{53Au`A02UT9;|~_@+!FMHKUFx+`za2F z=g!eXc+&fL|OSe(pG@2O2GJ{A}*ov!yim5VFWh%-$S(SDez<*RK-vH$Yxu3u5h=kzHXERN_p6|OcxkuQGItRxRd({tuUkQ11#L@I3>X4pG2 z0g#JXQz*xL0Ez4S%dMv3+MZ(B2SZH3v zD{uiR_B)N^J@_JBl*C1K-u?&!4*KvOu=1yFT-2>EYjccAeS2_4_2yG593q4g+s_?C z5wRBvSUhHh%657TsQ0kVZU#Rra}GC-lAt%u;OA04Hi1DoSEKg~qm!|+T-DQ>qW@f#(`s z_ovjyD(ad%)Ztx~sjv{vwZCC)&&);Kx<c6+2v^C=BYJS4`0~+x%31S$ka?Nf1`fChZ{vl#u&0MmraY&9+Evd zz_OKh(A_7qG%SXDy#AAZU}m?)@Jlc z!M=f!k@iyh7yslZI2XODh81LVVGuHOl-TEc5jE>6B1;R0^wNX4G!6@U%S*^j?~QQr zo|-5(oV*VYH$$lvQ0QmuznTs^IXFbi*PnF=7IEx}T9xnDa{{C+*hIZw_{_zXzGBe% zZXEZ`(D9Q@?^LVb+%uj+(=KcAgmO2TKoFSd##rLs6 zmK-s_Td8T^U&PIfMxJ&qb->a2=~LZ?815#}SO z_Y|@EW?sGaWGCom!1-=U=n1^$p(esYPH>)C!K~hwxJvZ4l{X1j0h6-r-pcAFy?_yN zR-z&zKfy?@kX!-{e4Web`pHHhff=>x!bH^6Z{xdP+f^b~1JbP&VjQXr|J8;L@ zufkOv?_(F;DAa3@rGTahMOOIq=6wHgk>0ONxalgZg0aFmL8Q5iyQmev$EjNyN|w(- zRC=07^u^VBFM;8q6I(bxTGYptmBnj>F@)+Xf4--6_31ZUPj_&fKjTr?HGWI7XVxo5 z6)ZZZjqA^6@9Wf9i{o}sr^0#(lNq?`xonn&reTO$BC&j;IjaBl`*=;mB2_ zVVyM{LM-@Y`M^mKkXEsu4{|eM`@tValA(y&bAxnMF9#rMKIoZzN0-yD>g(yTxu(Tm z`A09_g?+hriyrlb^rkVASrATI&^DBLXWn`-y^4sZq@<)#_zVLFemSX$luyu+=Y>Lv zviA=L6%z!U_k{OlZs)F+-eiH{7%LuX4RD!37d<_ktBRo8bz~wR@=f>NlFhEz^cWvg zOY-OQ2$^Y$eS%N14}cZ^K<~B#JSwlCR0)BA(^zt$7ePJlEqljdwet@U*@zK=mN4G9 zz7arzZ?{LFT`8OMAOCpPh3G|cL%jJds?QyP`EVRkwctW|Rrt=C;O@3Ek(*hE?SLi;(DqB`AF3E3`R zCXaSYUI`ba;YJV?J!vyMTX*>~i?4{n7^fs|?NV6z1q~O?ED28JXuPP}j850xXMS?- z>Emel;av*;oSzrBO+tM*>J=T20wK*uvCvmw0D)J~LbDXpgUq>Lvy30IS`__ZIn7+c z_0jZ_JgDw!^kjc`K5RS0CF!wi#30yxzH4v+9y#qrfyS}2_Op8^ua%q9cjupHSJiTfulc5s7 zm)7`F`1-gu?$gqDPW2=MQdg{^<@?*^HouF5NT(IyI381y?$iWGOei{#Tw^36!tVOD zQOlYDpA!=V$d07@|Sh$?pP5pG^pbV+I8SUG5HnB`K z+%Iqz8PwoajDZEHKF?;vzPU#!J7-*b2uK4rx+-?wF0i&NhhzbAvo z)uc|_s6vL7!#zf*$LpwnQ?FG!iw^r=I-dycjR4qie{^m- zccSzpYuT5a=UA1cN~62*mLwDfhA5of)~H*Wg%S_jA1{=uC!ROS%*RD=z3e*=vw+Zopd@w!A?RJGk_*t zu&+;M-E&6A&^<@}1fja#doSWyf1AqQVd2zQ; z-gX`T?l3%4|9Os8lvCg~ThVLQO+`EiBDJuitZ=$^BO7+mus0>0(?8%N@fj7}#^WM) z*;%%;`2dT@D%CCWe3hp81XJwrc2$vS)THu8eSYH^%2RRYs8Gg;qTt&XgDuw8j(yLV zzwo+WwYu4tGHu|5y_O~}*-59%FHnSz48DhzG|8)ClBg+OKo$8w zXz`B>2^g^7ywfhzEk3TwZMZOTPQ0-8OUXD{Pm>PTe3hAG&^DAvLcyYbz&+jX9I!k` zRrrLr!S~9WSMWJ_&$H9iOmI#`+x@2mQ$fG0+Avc?ZrkJYoQzkB;|ve99umn;5C)rZ zmY{Y)VZ#_hMB56I1zV@RxbM>Eo>#hdH>d6R zwVKd)J2nM6N>tyz-)=;!ePPcKR&N|fSII0;pI$v@LQ#G;N1zu>u+Z%-=@L3}`dx(_ z+zXkEAM|F%j5~>9CcrDhmeYK&(hlC`dKRrnpe=Ocg$!pkUc{`$2u7>2_U z+HGvAY+o?@AR)TM4Z7&2!H(Ek_VOIr5j1^{5!M(?0gpb)ezr?5T|6=JWB6`ki2b6I z)&i}`#iM`8-s`{-6NOTekI(bS>|`n}IhrmECpM+!I|in@2kR#jYIy*wFa2wvb-kUC zpL+ea2PQ6!xYY4X$C4>73}oIvPjgF@=flWaTWQqtRpfR8l03nvwGwB)Bb+AxlJV7? ztVKj&Wf*la3>pQ>8~mI$knJw5l*Z)9_I5wM-pO&l)tg;H;^S8R)uJ7#!kO6ozG-=V z^LHYpJ_9RE*@U1WVxgbl~m`=8Nd>EfsKHAz~(q-A}2hAXIvl#I}1h zrk4{=ryzu(WF`4{!S-&Wg*j|yVc%_V3{ypz^_t_9LBF3VI(WaOGI_*L3?Fb3Xi}Mr z!nZU4+ZOX{72mQPV-jm!f2ck6J8xOOxM+<5fZtv>j{wD>Jeo_+Y!qVjVp0uN3(R>n z86x5?iq}{!VMzu}H3{gUAm+l6s?Q>uI)pTO$6uEl*z^VCwC#RO#5HOW`c8F=CCHZy zplG|x3skxep>e-op4)f$j5?4PaIEX(`|)P(wna!!cIewXJ)a#(?FS5bvRI<*n>ocz zLfkD>9uDYc8!6Gzs&23-@S0fzXOC``ZRvL8sWuLZSrREt2Kg97#PRn;M>?%^_Q}ZE z75l>mTkM#3+vbyR@RfeuTs~jMKJ-7|{Atf#Q-(VAKq2EjYu{xuSRcHd3ENw0{eA;- zw;(09Gdy(AEB=y}{Upp(H!vVWaYaD2%65(G6PpA^`vTSgF(ExL!iUY6GT1TNnFRS5 z6aI?ijB?j=U?N$RtU6!0&p1=_^)m|KII<^hl@tTY2+>oi7i4=Qq(7mJM~4z?HYrvJ z6&3aGv#M`^AwV z8X(>N01%dPeRq1a3=D@m-S@5^3SX{9wi4sKQi*Id^@LFYsN>HUTgUD846_^oQoMx@ z^%RIx{k6eEqe->$MSX3^(sAn%GKHMR$mKI7LJ3jkb-rXg8)!=bOj!6=o9;SKMzPVI zI>wjLXuAAF1waoB0FJe6y0Ci%RNU6cH<J0KY&$zk)6i!;mvZf3u-vlHf%g zLuX^RdS#hL6fp1YHtj|)a)ZY0ZEYe|y}IK!dh!F)q3<(*otN&WXNxSP2oM2;RRIAg zSzXrU&fPuk`S(8e^31X0?RypKg}{+-xspWge)1)ZFaT#hz466wZohil_d)=)^y$|j zqE@*RpD47NTdn)Mjq4lPgJbnun}{IrdH;Teb}eh*T>CH2@4R}K14n>bOS`SrO6Y|c z6ReQl+TM!eMO}+TOpU44Yip9Mggsv$HDp8S+};gM7XjS6eY00@AYD>3ajV=#7$d+y zvD-Ckm)DY0c_2tM6g?Yf0@4a`0HA(2dSPL(-Ef-&&NvTvawfn1Tuo9Hr#I+t)_0$~ zEoF3VEG>vquh+W$#?{Q?m|5E+@EiXBQn4cCOqrJ6*<+SMI+4J6}-a zT5P(|-|3olvv;?`7-I-H2P6?B3y7hhZ~I+)^TnHC*e7`9%Ph7mM6$!5JVUN z8jYK@iPY=VFBfog`St0AL0?S%bn`$ z%SaS}b9=ANFh6(k$>YZ#?(Q@qC*%>z&5guIa{$2IVC2GLd?*hbta^+2A^f029(gKu z_!snre~QEek6g~#U*X=V4=nm#E_ewwaznpkx9{(%Ly5T`esJH*#JphQ+|l{>K7=p= z22tPR3=k%P?QehemZ(c05x?HAzqwvKJ~{r-!QMubbIuV`Qi+L&4gu%P2?NJ1o|shg zvBX5~l|T9uqm+;|g$Ge!+L`&0V?XtFEo1BpSoNuNW^p940}fo)#O%pQf8bh`4wi6o zG9R1BbvJ5$-(?Z&S6h3puTaWxLduNi3x_5UM}Qz!NEMEaV}e;2xeYTjGCcjnNn<1( zVTg@n5B$i3k?$kmfoY4nBq$nRS%0Kl0SCMOFc=NB-+3^;RruWIHGjUg;>Ns!~(#EBz=^@iIpMME8# zo>@410%MF2N{nWQ4o@J0ti4`yX;(=bxd$elO4lEFg05nYIc5lR1~ff4Jam2wfJV_^uj@7jz!|eceK?H} zGS?eH*Pedtc>eeVQg9T8N?M92q3tosI0uXc{8}I2m1h7GsFa(} z{mGwlV3Zoe>DrzL$~RY;6ZB1!1Cnz3(8<}{;skJ@0i_|;a*5p0ne6GA!UI!S zmy?-PY$PqmRHPE-)5KT?5J(9_8%n5IL&?YWk(7{Bf6(|sVsZ))!E#ba8~{#vX!FSB zG~m={q0OoPy{(HSQBXxS8%Mer*`7X>P;)v0BxmD_re#t^U<^xS=85B}g(2$t{oOh+ zP|}*HE9t{ydOogYVzH_0(D`|U5CT4S@c@wpz&JBEq^MG2A|JR>{=wO~izg3%;PK4D zNOEB)J5#b6eIf`$r)QOX3~9p3XJ4tZC?jQJ@sT`6 z2<^LZ0QBKZYPOhKC;{SF#8{U?%iC{JVu6gFJvfw|vzr4YX^fnj&n}D%otu-=xcFy1>V#6pNQ@@^o+BBml8dFLoXiRL001BWNklLKG?R zLmsloa^K>TOhxO1mPR9TMA&vpy-*;jAh2MlPe~$n9 zuRLc}F(EVz#F)BTWw~8b$QsGHVr2UOK-*RX9CM5S zAw&=ZBNZnJ84yyk@&0zDyIam5nT$N(7fIOmPbg_A9S(M~32qVkstX4q~2AhqbXZvka${4_b1NUs-?^)CgkR+<yln1u{Q3Zggd=2k2TrXA0F7Ha=1wbW+Ma1!TOFjx-K9!;G}mvm zMOAbLeWZzifKkR7@2%7TIAUByahG}4dYwny+-q?{25WV_70OpxVhE81-u=bAP~9 zV$@%b`kO)RbsqHr&|h}O{>Q>|JVt3?x}g;iS+ME@X8Y}xvYdGuQf6+@-)ot>Z9$Vz1l;!9_bZ$+B8rXWJ-0E)9vY7AN{ z)V^Ovz-d5PNL$N$ECM8;zz_Yl#W|-T?QhiW#z09KK$+F(x7Ta!d%IrCH21pgwQ_%@ zP7GO;#lndx(U3R4dV}af;rL`|`t6m9+vswHlEqAXG$%?@|$S zdz;niP#CUdLI5S@0 z5yO-lHre8xsMtL|0k@JzUQTKx!m;hGyo_W%@|HI$^rPnAA8&4kDb>_ zNhA|d5stj;k%vG0W0^xkz+vR%fw`y85?Nqw*xRU1K6MnClmFw_7au(Xz@2jI(1$NBe&}toDo;K(@3oV*sF!WJb=- z`KApVam1$Hefq%DXM~g@#?;}nbLXFa@3|+RJo!uSD;}E}dHBe|556rvlNUsyml9)V z=10%Yig67AN{nYFA3p-X6+=l)7Y={u;l&S}XFlU0ljCyk;3y&}?Aj6V;=+`y>Hvs^ z9ATU~Fl3BnkRa*_gAo+6NG>MTe6qb%W*!|ry}%>RBVL%8I`M(0T35HQh(|8WPd#~D z$m&?YdM-Bqp3`T4?&;Y_j!j=UK6Y|0HJJ;XkVTBzL1HWuE9HRm$o31l@uN>Zfn`D@ zB1+=1UwG>H|NK~Nu{84F{MhNmcmBjroPPSL_>mzgsn5OpT;b#lU;u)1hepRAIV2{P z_*g1ATO5Dn@X-%HDyLLAuU!23A3yr&#j$gXoU-oiyMw!T`b$e&UwDp%6gXhi?DCh_ z;L;{p+GV$P;PRHR)`OJLm}_0YKQ0)P$}S5{O_V60g~_%3Unt z?82~?HagW^$FuClKrO_hp39=J^5zNv7X*YQds2^zxU-*J%x2M(M*eHs90K;8CWpZb?mF{6}XUI+oDZm|5~n^=>%9dLvIBP|!> zj7teEJ~h=?el;^9eDd#)nfQ=jUWy%paam;)aL? zOfdDMeFjyF=_7Nq4?O*Lj#y&4U{$(mDTQsS#tcE06j4eJ4@-(HCk#;#MO6llA}>M! z$=RYP%7_CX7=PQ5)Xb2SHKdp{X!N>!jlEZwfHB5c;mD*>OvNTLf-KUGJ;Fz3^NRo+ zA|BdaFtCF9AnZG4v){YF+g_@OSZ=M9haa6Mj0qtE0V}$)dv|5FbTD~%ghxE;yH49= zcEDUZ*lGDK2g|6vQE#qn7Y|NFPADis4%2<*r*H$v4rOrkzK9P+Lr+aIS!EOs7VRH8H*IxJ}=HRxi zp>uHn9t7c_+`ux~*<8JS`4!K#Yd2Rr_jW`>+m6 zGwt3^4I6?)a5!)|VB1W-*?!55Y z?zQ_^7M*5);~O`&U%JEGkOKs!3k*a_uHM{I;;LEe_>S9Nt{{pgeq_GYYq#!g?c*nR z>Zsf5jy*ND{goF0KtKpBEG+cg|=!|M9HyHX!}_#hI+*hJp#JLy9s@j^n-By+D_zq?Ui+u9fAMl=+3d9Yf?1Qkxq z3_mcpe&?={NC*Wfe{5oKzp?$|oy1(Jvt0IVr(13%hts{3=Gk8Ufyv#MmYE-^Qw2F0 zTmAA4>id8Zj~ET<&NuHCPEGH=v=sI1<>f1T%c~qfjw@bmPyiWhtfs0469tk^klwKG)f-vw(}bxc(<^cGoIOMn^uYyuR!<%}4&_ zM`|}VgVkE~%39cUfpQMKvsCf=UT?XQKQ)ycFKj)3bFkAW9-574@bVvhcH+X};;~8d zN|#48v;!iGEC>-ooO28SrfIIPue+}MTfg;N-~8q`_mAPlpSdvk{!@Y?FaV73!ACD1 zICEZBWrWc9g~jRjo+7#wAIoUtnX!vU#~wdyS6lX8XXMm@u?vewA2Fszl5LQEQ) zI6Rh}<-omGpW1<%(Yb&^$9EgOGf)3eEL(7UHsv%nl3e)Fb3_mjAdGS0@VKZc0N{5_ z0EP%h2w_n$Cenv~;-RBI^N8K-`U8h@=C-Z)XkJKY7z?Gs=+xpO2c*VhPPvyoGE5{1 z2xqRp@X(njfBK`=ZqME6$H&tL-gU}r_aoaUl9(9I7=={e`OJ-K*Ee@wybFw3wXU_> z9(~*F_&bkt#t}lr(^J#$J_#Wu5>ZR3C(pe5?8PS#0HxF@B$c!wY67QBHdK8ms~6+V zo$Ad$c<$!so^NgMG+H$x34!Y+r;3T;v{h*XKyt2h_^02lSd$pXLE)~zt zRBtbv8x10m)Kp$j#r?!nJT!XnC*PJiGB((1m^2DR zSpq=RF~e57ySfJ$A%M3|Yei8^)BO0yKfbrOS8p|>m@-(YYuN-~01kqtNU9JhLTa&O z?Y3k2w5Z5f62p+PuGd-K4SG)Nenk=`Q53Kwv@UNZr-~iZ^9F8vvjzwRS@hd>;QB12 zul>i*5%UM8e4IC@IS5iyFTZfp}!&M_`Ayy0f12uWMSyS zLhbrS*mq2!<21~D%K~Dka%G*`9%taS?CSMRU_4ez3#vp278OE+K#Zw=*EKiVz0JC) zYludjey!^b_A}`AtM{^VBg_goLWqd<&24~)5hM^fK3zl-9#mT#kd)R4R|>O}fDq%{ z>)3@8vuj_xo}DfFmZwi7+1>SU;K_!{Ixf$U?n;$fE|P_pUwnoj4hXDrlO7riJQg^9 z?b3!oEuUy_)Ucv(E9h-BBHQNxJczIWLR?cE zUl4_eQbr+Gi2J6iCXHl1>jF!VBp{@ujqK5JPFd^TE^zLf&gL`MlQa3=P9x|$SeBN* za49g|pywGQS-0K|9S;);0GjuAvIj>&0K`Cy$xhjBtnXE>E$`i0FPxYfRC}DV$O|yR z2%-Gp(R&;LM+qa7&5Z;-i$@U_MHWP%>9<$Pi1Pk!O-x8Z+hU9%fhbucJv~&rzQKVv zHY%CslvV9{Rf~{TVmKQ`;qLP{x5&~}l4{hr-zb*LL;=7(iX z!J54O>DRD;UDGOGUyqGt^isyD_o5(TjvpUNHaPgEs}|#;6#~YA<7tAzzwc6d1;hV! zRDE(pmcA`Z2?ET-$V`kpIU@h=edj-KhMb0oh~Flv^8fDjApj_G&D?1p{_xS%cz)?~ zueg23D5bDSs2>fso74?>#1IC|(a3{ywJU2**G2$pe8{(aIbmQC2VJYXUWt!qTX*&l zLAAZDo6kJAuQXSZF{d@)95`iWr9%Vm^&Dn;OcWb$tc}0>_+X>SIn%Roh09Y53kVPq zNoH;&qCQY=*9X4qZ9l)%x>FT35fILun<~tYmS10~Tw9I$zLZv4cXt7R7>ZU*>^^q` zI46pT7?))EtDP~;*y?A0SB*ZwQlX$l}_Y%`-4y3`m+ea0x7?7KkRv8 zN);G0%Wbc1a)SMVS8c9ce*J}dWfwRH;9-Kmw*pF;TkiottdRC?Co%&`lLbR|2WI2u+R-0>f>W;M6QWl2O=rIx^K7@Z zR0RM){LSZ|oqYTRm${VGyuMwzyaF;7WtlO?Fy<~Dd*tw)KYE#mREldxK7kQpoLep1 zt6D6gz!+t8_w{9e;D&xA1VQ!s#@(;Knw~7S23;|x(jLvB)(JDC5Ji5+Y~sdkP}=R8lrba`#(B_nfO5CqBdU-nWuvCUfqtLS^~rPk>FnRi3Z^9V z%ZK%}?0(|D3p@fW005^U@V{SA9Am7eV&1^%Zr21&b1Ln=*JJ@j7%LgWsdOo0NWhhw zo4xft;7HO$CgRM&@y=RV)RoZnTN^bNGTBftLI~sD)}C$m5kgW@CAuidGA5WZYVEWy z{qCPiX$^@Yi)d`I)V{V&y%2Het<@P~en`c*9Qr|hY1{9(KtPNucD>`adUm6WWr=g< zmiulx?$-NJ-vK?a0r~xZFNrm)5pip%pnF0c;?vHfu~Q3s$lN5 zI70DUCh`LgoKvP|~&iAE5JD*Xs=evSJnWypedOH!?W)_MRbt^>h3g-|L|kE=`kMd zD_$bcww*?w1CtCrd9Wl%B(z)r5Oq=3BmkgpD5=ue!w2&x#zV`cK``;?!HFl1#Kx16 z>lumU1II7slA|1f-7)pJKKJw)qzC|jFdj6!z2!>#?heAZeRJFHTDLy=4Q@vm<6|ez z=<)de=pxxr^lSnNr2P7F_1X?mh?>)HeC5T;)fGy>?>ZbfLVz(IIx(A@96}s8<;BwE z%-qS;k&*pwfh-C}Do!N?j1yhRA06Fz_67lj6j4y+!1q`fA%ygi9z}vG0leke#|Yxs9EyJOJ>iLe)_>poBYQmR<}ty6 zYz>(?W!(nS`P#Y9aL@AE@6SRZ)^|BUAHx$6qpmn z$5WkqwS5}FZ(H4+TEysq4_tunuM_N{G2EK}3)wt&m7eu)^MC$oB zfBWmB4;@reYHzz)d2?M&8(5PFAxcaieP|H@A|g8cj)!Oj>DggpJe!^#%1uu^@b*Uq zL&73vz_nb$7)=RrjfG))v@rS5VMGW*01PRHjxi>xkQm7_#v?OI&km&y3`r>i02$eY zkxRLr-K3q$-sb)UKD%ZjNdSZa04bu#Q0~~IkT9gUT7GS9^^2DZM!lEZC zr9|e~gztvIz@EBzIRC&5)+Nkwyp)u)F<^Y??5vSb>>H725D6S%0V4#WA;~c{e{3=} zRh)mKP5QgDCC3)w+zOwP9 z8-Niaq`6$)y}Y*Zr7LEm7xZi*31P?feJ?hWW*mEsu4lV|fJD@*nql8(KF0_NA_l|} zg7iXB$;8`R_1b&3=mSBK9omha=lIpvSIqiA(dGEu$f0*V zxcIJf@!>pkLxy;7w}Ax#5FGgMMPs5c*lhI5&9LtVw)@KOe5$;$s^{WZ5`ZIft4&=N zS-#gcyL-*fTKTPWCxpQCH~>*Ztjd)u>w|KOdZC=qw_mum_szRztq&Lw=a*mm>dNJ- z0LX6it#Y$vb)J00@c?r)o=EcDdc}_Uap(BS+?EA36~qN%M#TWu2XB?bg=*4qtla&+p#36bXS_ z@4HRYsx&zvoI!83B5CT%=idy%(5?1a5UqdZT6?9w&mzWBiOzN{=-Eob5Oj6x^3q_h z!`;BHx2=_G{oWQ9FpC&x90?@!d;rA4h%=4>fd8ruPc8%F#VEaMW4hMegeg%9MIlexWUb}J?0Z0j5%xJB> zJxmbuBE6VFfDuCJ$>Q+wDQlzAx>FVlF(e>K*PL44s)+x{?j)audXgUaxtAPYKa5@@QCTjxYz0;gq*F$H-7UEeA5a$w%4_yAR0b&z<2G) z3lL)%BfzL}YYPF2>|p1`yH?v0Re=KpjyrsI4kH{zj0RC;dS2HG9KXL&=`A-xF9`Y` z5(IDHT>Hc4y!K#!_(}G}WO{l?)MbPacNw#Swa;DhZ4UvXL6}VD8A1SDAI;l?ZgOZy z9ZCQ|}))hqOOlc zL6qdk4(vhq)~CJ!z_EZaf_wb;2)_A{pdvgm#Qw+5h~%uLZ3OA<|F zrmtq=N8b1L%AK{^^$ntlI8_Ii001BWNklEZgN%k zt|Ej|Q-${ZJ++h?f8-DcdUN&b9HHY+KQ?-L@pC`_Z;fKQ=TzrEbY3YXmOk~0AW6dy z9ys_D7wWgSYqz(6@R8{QLMUJ7VAgu+Sb+zjkx%CzoX#zdH?M3UiL{n0gGx7ZY-0XB zr{DaoFZmQ)(@IVku!K9yR{*0kzwjP?JpRR>`)#C4;}0LsE{-}~t1vQy8QHmg*X?wS z**qYG1)Q8KVT{+GxfP$zPdswW+-mN+s*V$v0v>ruWw~$N~IH%^&7i{;rS0d zSh=#nfP){ZF)i`}AudLyFBr1jww-EM(quuCX+XC&mXItXj1Z%-QVJ-$7rcZ3hR@Ea zIYY_l{aP#R`V;4m+4VjbsG5pj`<-WthbFA8j;O0qXr&L2rxu2GzkVAD_}DuhnV2{f zPp9OVHuBH`7SP^kIx(A9^LpdmtRPDL&BpMV#qRUpU?GKXx!Y+Fa>_6g5Zc6jc-MM-MEv8Lg;Iue%?T5=-S z-|KWMT>u0K^|u@C1r14fS@oqor$f+pZ!`z$Qy*tP7{me;ig-If=a2td+AEtBZhTa<>8 zu~V}v@@R`W*LUT^hk9jDRjtX8oiabQ>yw0w&CQ4~?cnG{nn0a3yT zfHT;B>2Bx;e#4GUnX1G3Jjx`NO$X8ga}yb*jC4Uw(xXj)4m?l|*#oPcL(XIOXeWch-0B*H*VX z%e(!prrWo|h8eUhw`;Q~8tk?y=IAfZ=C?+zAiw9fH_DwG+l^OOF8$wszIS(J_Zv6t zj#*#d9e&5bxgS1@fnkC%L7Xw)bOE>^OPFARMRk`N0eVADfdemZTw#h!}hZI~M)iruTc>;a^PJHUl2} z7H`S6UI?zfk~sD7fB3f_cHO|x6+~(9%pZO03I+hM+M|EC8~ruzf`tqr!hwBvr*nI4 zmm$!LNq=AyiC~!ow!;BhYdaf%er^40w?Z!hfNry6zjy`7f}n}9e7e0-(~`QV%7}xa z$a}A?S=)8HWzjHNe&NmfYK0>RP1kPpi6+Sjeeb0u2;X}1Z5V}Cqo<@}^*7hFVsfz6 z0Lr}9pnPQw01$`0H&>LDK3J9&p?mk$ zB`q5V&VdUr{HsqRf*}OXS%0m5`>QV->3IF>nqBR|VV)=^$}it#l!-A}5J|7z3wjo1 ztZ{2A@&m>gcZ0plYcr1??d>)FrrBKHp)O5LWSh6Qs24#HTDxt1A`8GdMv^LbS8Ft& zZmUlS8h_-7UPyQU=q0D#JNL8iJ9zfo@++@1&ik9K+Uv`J!Rn-`}xnz1IER&i!(Ct(Gf| zEPw4yP!J;6w_O%74k&VcMwyUT>B2OB*L$A87%$&ny?uKrh=MDdjByY|k#gXi8=0gw z6fd2fX|FdpKW84F@{pH;Y{g)X)GbVkgl``LQ-iDDq0~Cc^-BA(wRBt`rE*j ze0=20fsh4DfBFW;fC=K1|Bs{VOalL(C-o`gFF8q#z?uP%BPti;N<=dCtv?BhU=6G=a-{)pR+vAAOe(+5D=APFw z1yvq7Ki|5sBN&F?ckOBiD>B&L$njBzh02Xp2sz_)^Vu6-&(ews07%ak3&*BU@c#o;3xt>h;uy~GsZJSz{PX3s;)QhY)P_Q zI(LAF;o2+Lh8AZI|M)|zUw%`~>L4IG@TG(TyP#$b<})Q3)8m>cOJ}A|Ze6(7td$AY zfJ5kptvh=(j5y&|t;;;010aA0-t(mEo0*wmxuB`JL}YpH-SWs|hdGAMQhnt7;_(kY zvHgu(QQg!_Nxy4hLfp2=1M0K}z&T?P_h@r<3d&i8HxHA<=U+^AnQ>z7u7zRfYXEfWBk82m&c>WDX2RT?ZIcZ*NSWJ8gA( z)DIDY&<%ruivX#`7z>#wiX^VEh_=@%R<9F4Bx$N|yGlW~w%dXxU<5=I+V}RT7X_w| z5k>;uAGjhaQWS=*H#Xv>WMsO&<0mF^S}{5I6K@kRMxu}&FJdYJ0LB6!NKY1tCYc*8 zwHT*iwEp~cIj(kBo5avJuG|hf0d<4G3G>G$<5PLJX##+dFjAxG$Pc`pJMrX^Vqxt3 z*@xZgz^?QFLFfjd<+?2s7|zTOi@LIZeeQ3Sl~O{@s7~@f6Gx?lf-%Abk6&0Qotg6nj?;6k?T+7dg3ciF zBj$xf5fKIi`_lpd^ML)u$gzAr`;m`)@T~`>kdhMy5(xr`q9`$4?CmurMFPf&EMg)6 zlT{_U0Fe%x$FFL%H9EJ*vY-0hJ zUtR*vIio}odpk9RfQX`R{eSGeX^>>ubsl!^y>HKbtIFD|t83|frf2Ed0n7|AgB=7w zh$2m!G({?crf4Y~icka<3Wp;cvK0=?5<@1#v_y(BMFXNh0usOhFqjR~v-b4fRoz|t znw9(V^6l^5d;BB2XT$Vt011UT=SNk=%X}~My}D<)-}%ltfu7W*6#d<<-{}K@o-`H4 zl&ql+C5P@h5cFLs5EBc|xODDMzJK+5FH4j>jAK9KVVs&Q5kk6)J8sXD zVVqqUw#sR*+yCx={Ih<&qnH{Z#6g@K%@IQMa!Svb(O}2{B`v$P{QVcZ)s7URdSRVV zh=LFUUOl_f+ph1tbp65;KeG4RM4_3PQMH)VQwaogc3W}B=lu`}C6siwnys@NVY3@- zHzyuElq}{`BW1-2wkpFhgly-?z7FC?o)} zx0G-q^ zqU|4DRkI0Tlt^e_-N#TMV%Tw#!}-l0T#Q1V9L;8@N&tlO$ldF9mMa>iu^*IfpHe6j zlFL|xwVqK(0fUj_(@w3U<;>!t$?T!goio>}7uN_SK*@=(K61~meaR?i2R28zQP_3} zVjM>4k$mIg_6?Ws1dD(1{H1UG=(fM}$>hNj(b?pqCuTo(8xWEl&W#?K&d--AApj8f ze7DvHLV$vjG}d0by!p&!Eo0NKUf-7zwTxkvGnLnt-G)8=iQ8xY z_PtxrF248&e@>_rAs1oXx?bt+Gzk!pQXwavN;)a( zB&U(2LNxjT`gJ6RGuCLHM{(5g5vbr?B2olmsJXe}^ub}OsUWa0Gdy(9JW+_(bUN2| zFZ`<~w|=;oJu)IuPCayV_OUyesi2TZXm+kVd~_NCWDv)3$lX9VacZKd=sE!~5*DFE zu?!xF$PU9^08ADa#)cLq6T?~2^^~MRDPx35A)9Nv?Mu7&|N74_Ja~U{B&S&F`1mYS z>4B3+0f4Gx{Ncl+Cual_d!tr7Ix+Wir?j+22mwm&`<1UAdHDY9q49;sP8E(!=}CR$ z&V#C{ceWd$AE-pr(-ugK!r06vwY-r%I2<&c!qn*K;e+j!YPZ@}Q`X_H-NSjzC?vCq z;^FbB@*E;CRm~k7!cbx;bxXq#6Qda;V+q@}ifJvIP?(}JE$XkLL*?Cw}ph znehT;6bO-#B#Z)rR!F(K-QnA3j(z!|;^D~wn$1*IPZ)qebOit?AgrxzUcbJYNF;=i zuf2Aj5C8_rv3zEtNHhjWOv`kmD4i||&V#0-7tH+eNeV=UacZKN7%!#{4hcU-F1?10 z5sx}9k8@-=;%YgrRDY(>mW25B>_`M~s5+VRt z6doSc-_J#!szm?yMr1IeF`_Y|Gh!(utC5mHhYXrg-xq@trA&?IWh|J&n90IcKWf`Z zs6ti3Xl80iAP2zeh0Q@xoLS1I=7x=8QbxRaZHGINh$W%KZ}$<=n$8t&A5R}Fk^x}Y z4>Jdc^kTAmz1m#dLm+|UIn_1>Tro8wF*iR#6ejIJGYrMhB0m;>+}^AfPfR6BDF7O& zacOESRm{nVi-14#2Y+($KRvzt!Qp$9v+?9 zc;ejR*Pm-&*=j8}*Iv3TqS(wQyF0bTZ@%C)ZA5G>@A^F_ZU^>uBfl_y&!b<=%#DVv ze%S114h{u9H#a-tciqPFuJpNJF%WQTT@i2sNOiUP(nj^{O26)MFZA}h&BbjLyt`Vv zcKS5$`#{m%Zl|V(W7k8(@ z7)hDD8LMsM$aG**h~crQH`-ob{HLG!o_Xl|Olkw*nam-}Y5Y zM?)cm%pE&<@ZLL+kjVD^Za+O%w8pYqPhINowDg2Q(keJD4hG{x`-Bg*F*_2o5xV=7igKBl7FkNn4*x5h7*5Ib z^7GDbOsmJUN}uC5Hly=>2>>G+`4@LtlZp3;NF~7ccB6lKHNac=Nrgg^5=$W-$391S z>)2DvSaClby?eI1UR6_;)9Q~tc%-}fY|wG^v?={KS;&M~gGhvd?S-CCD5Zk5E^a&fT|()^{j;e=pU_5p~_Zk$tot8rGq54)BK_dsSr z#2gVMmr>srQb<2Ck7x7qW4Q%ruU5*(r}eFdyVq^>))Qk{l-OOX0tdxZ!n%V18$Y;! z51)uTp5M0{*EcpwYnAI)=f8Nj+j0$I*tKr#1%xsqpE5^sBUy9rh3i1b=)uv@>+M`v zDI6P{cpEuX5z4f{TSvWqmcYZzYcm%Ms(acVis@m%C@UW^e3IqvI%F+`> zq(~S^j}|w-d%kpXDmj#*8bb+Gp#vtDVrj7-C?&n{o4@#*Q&Ur~FOhG5=i7gA`CE;v z6?>~8BnLtWr58`XSUJDkTG>}i$lqriI}R&SX}$F7b7?QT7NW#o>T z!1cP@wO6jZ6bm`vR@bg$Wx=jIenNX63S+MG_Y}A*w(!<5e|KT|q3qlAGte#tU zY8?VZ3fWoPt1s>*hSGcImxmW70TAPu2qbuRzAXCptd_gX0AUUO}~vO@qVrJyh-saejsyKQo0Dpg3M z&wV?H+b%|23h3-MQK4}!v}+vb81wpT4WPQEPAS z_S^JWqk{|+7Ms~c)=IOPt?*(0_y}aMsZb87)GeauU%v53hJLmObi+4Rl z?5)*!ELzJu7>U*G#r>rXDFo9Ml-RyrX|L?1rbVxDS~1dA|aFGIif4*gsqj$sZXAy3Kg77 ziDB0hUZ`j)AQX;FlEoY!@SZy#$`2QS0Ht)~j)OzTrU;^pIeb|CDr;}i zmN}Dr>*J|^c+7fyT>t!}{=eRx{Kv=4^DTb=u=Xo+=A)z9yK7fB!vC}r{>n?v`_Zm9 zYBVY2b!y#W8)=r3dcw3<_T8PPnYOxD_xGQ=Dm;#edOk6I{~(vWu_Hy;EuYL01BexNS0wMZPIy+e!x?>s$Xi2@_=tmtl?gl}lxBlV< z08lMWP3vYRRXw}m^&ES%PJra*huf=r?Zq7gKp?e?o4gkiLKbGn_2yDm5X!rm9uOuc5QP=TX_SoDEk+A;Vv+LhIXXq*f zvhvz0And)ivUTbD+7o9m76VeWV(LUCLC4*H;!<)ffAHgXP)bqCbh$8k&qBJGA&R1x z(uqV`)*}EE5l@X33iD+d#*ys@jeZz&0KY&$zffpnX}h=ImN6$luK)QJ@Z+H42@!X9o7eyRl|(56l=uzDu5>3J zJgg;ksTXZsFkA*uC?{aCY|b`}BN9OKq&z9Hfv$e<6hu&`qlHRLE8~A zKlG*h%J&^S^4J6Uks%TB&smJP$*=r34}R(^Qc7Yfr8^FUen1$>jF*r={=kSi zo=cAv0C2FdHA@G8*bXq33jEm49k~n|oyPLImQy4k0468$Ue$JXdk{&t)eG9T>$xbA zC76{S1U#?DG|L|H(yHAl#YN-qf?le zu#a}z>$Uu$ai?u(#)bz*LAu;1XL_%$0f44zsY0%N+f@DXwuoYPuML1|HaYd_6a7XH zB2hXtzWSZBfQT{9f9~$am2IYJ7zsUN`5gxlfk1z^`J)%V{nEF7pk|C@Iyri9E;li* zjbgU2%PLaUHkJAZNYnKQ$;O*2zH^!Po8@4NfrH+~3| zDml&H@5TKnJ2w_|JjN)aEC%5H5E17exO?aP)$C-ET1swyBs)=D|K3HySlD&9E-kl~ zc8~xdwidVYlMjM#{r~_V07*naR3*34){`cRSj$=7epk<#S|-UlA@u_-sjHeQf=JJp zddp(EDm(#%nAue9g;vHg3hC@nVfWRg!bI8IwFA>@zOq3qm8yg>7Igj9C(aKx)Mab< z+0);4Y8|)Q?W|T3g>-AH+TZH{D2;QQrNh%g3f>M-$o5X1QA#2%L+*Baj@w2lWj|yB zf?D6HbPF@X$?0NaX&VC`x&bo{;YTu(QQsfX9gqM^=To1!?-P$d{`lYfdw=iIM<31S z^A|2$c=htDhMC%b`FhaxV>c9W9QK3##SPw%VmFHYsI#~mxq($oCQ4aFXQ2~nn$p>< z5=we&wa#*-aedFPbwq(S_bOY@Um*(k^?q-+71^HG?lTS`Kg=Spg!tJJ^^sBSR7ox9 z?+jgNlsvZ|?cD?{BtR#IO&`}ij9}2}=Uw!M5zQo;MKps@1rXka*GmX!lmr41U~+OY zlgV7Ua>aMN*pCzWlvA_06FWO?nl_x31~XKr(FuEQ>;)p^f#bKYRbtzd5jQf4dw=7L zM99|aUK~WVs~b+M)m^P+W=e!md!V?ARLfm%Z2 zG0IpnLY!)cQbHKEukQnapyh_Hr&xM_yUBEg5NI~*^~H_I4n!E=_jkTJedNgb@BDD* zrA0u3AOk0GcUz$yh&XOIh5cFKa-fFq6p1afWXn*VCwaUd+s?a#%LEG+aHh9GSrXwOAH0;X7wJ>%E zSYqslkrRMKL{zxsfAq(Hq^j!3=t#(;TD2O6Apvsazk2ZUzkVjzZUQ0?cy3{=a&8>} zl(br$A7zw=j;k1E;JEkw{V#04vJ3f=XPLcjcPo+{sU&|a$W=7-7WBEauo^Z)s&lyU3KmOyBP@1VUVBgVUgri2kIMKp5| ze%v^Qh*5~14Klvfek`pLJ4V~Ko6RNwP+d`z2Fn{sQ>CifU8@#mMrzMo%^ogKf9$sQ zdS&nQa%2bG2?-@ABvaJ<+=!Mot4rH@F=;X;czo!=JGRbV5y(U8=jX@0Mh^^KKA!T!Qj}#z1l@}r=MM5;D zse0yM$?3KvMu~Fv$=~}o+W%sVoH(dWq=SC1aBQ3rT3ub{5D(AKB+HpjyQ&wH)^Lhw zH1Gl*M69eXegE{KQ+KGt38;})t8OF{w4_>7nZDO#ra~+R1pt7dgVXnY?u)8soNoTP zuk+N=v6)YtIQR8u)HL%sCdRVKiPDPuA_34#+4Ok6zP6JXPp3yS?X_yRQ5`yRfGD)H zTlc9qblY@&bwf|4#_wO?Zgh6@Nhku-6{C>uSL!j9g7b+74=WlAV=RrAx6dx-C&%4- zM`!`6V2z}cPN}oI2Y_7RQ-_Z3y|%_OOv~%3xgldT+if?QrH|Y_S3EF+v8-HK0!n8d zyFG3@{tJBsIQWUX)?Pl#G_`nQ(kdntq<-H|jOUZXS+`}6-ghVlzJC5Zp-?(L5j5QX zerM2-oX{C2gkUUb95-IQC)$fLKG{b|)V`+TUschvxO2`7htI{++Yg`Oza^ zyKnvJORc3nziCs(P)bD1FN`K9bH~5%vCIGQIVGjHH}<+_9X^tuk&yT{z#GN2sMLXO zk(kmYdfz|#QgeBK>*Xay)y7WEb*@%?$C-TKh>*Pc>c;qe3!(3>oH;`XJ@Cl!py}?N zUmZlGbWo>280A3}J3;IO07wZH0-bC7B8m|R0QOeuZrwJ@DUbvtaduh-hUhenfH zMsVr3`#cs9@CP6M{MHZ76I0U*No%aMesu{ExWl)exoj`*NBy9FepCKriROQ{9RABi z?;R=c4#(eJ@_zgUOCh(^E<#8ucT4R80Lo}83%Bl5KY;I5Iw-T_7>U;6UVpE}MMMax zU)=_YdRl`B3896AtXILT$mfN@|lH)P9?|knZx66kU~lmum60rln&iK z`>D^)KK9w{#Qb|cD=k%I+S{kGDP~$RQXi?)j|;2aK_B`}`uIO#`j@FcccY9#h{eBn zxpsD41fg(3d%KaIE-{sbeaEZXZmk#DL1(i%XpO;yqF8T$-3nn8q@b#T5<@o(doIe!Hz0TDqLg%oJCjJ-6}0i`)&pZvTn@>)#H| zjeC_Ymm+StszMV(1p)vRsG&BlRRGZ0>sX5Z6F!LFU5lRF=f8bOKUq`@I%Nbrj;pr# z{cHXYn&O?}!&@6IBTbYW%7chO$b&FO1Vd9yQ@z22ri@r=bXxDm+d=>U5pa-@oXqQf z!d|Zdf%%`m_u~Kggj;jGW~aASVY)_u4BvgQv$WmYXc8&hdf!SU978|(<ldpvuNm=b6Dqj!#cK zbf~jelTOStxnt9JY~`*20gy0!VwxISf3q?6@rC~NYFzVv!e?>SlmFd0pAmmpBL;;= z1pQmEdl>}oN*?`9cVV^*If}&+)PkFv3xa^i03`q-QE4KROdp$Zo86%2 zhCz@RPUROy^_-tcV~+06+}dj+o$Hql*H8qe7L|g*_2SAfPGQ zT1@AyB>tXcfIScow@q0(@bT4-S&EJZ?n-^sp^)YQ={IiM79G! zK%uIkQA^YFX7k!EZT{4z?+JuT_#S|yO5v9J#njhPjX377Yu61ve#ng=woL8D+EsN7 zIRG#UL5v-NgSmYi;dRxfsv^1Q?{_Fr84F55NmxWxym~Km!k`z$ZXmhz_w5767nbNV zM#?mb*2=TzA}`u_;o|y>7hnHs&6O*F_~V`NJDZzUt^fe7_0_k%RG2xen5I*$yUiP} zt$ytS(~|Y;OCo$@qD|$(iyuXU?`&?*u0Wn*dx-dpcq1-B0ziQZ!4c8l?d_jkPmbjx z5qp&`mC|c@#f8!3Ctj6YFoimveWQaaO2nJJ>6xyHD3($V+KduHC@AfXI!FYB80608 zrp@j0sadby&rgqZcK4ByeyztPXsQn`^t*0buCx zgf)_l&aA`{A6po2_qV10*EdC08QArARxtMZ3XZry@>b$JfiU7X6bt~~Gdf7@rGK@gkEAk_Lv(|x(YwthlYYmkbOy+c4sQvzohxfMyx*IT`!N70pns%4 z?=AVS!`Yilg97+^$U;KN$epvT>$_1u(6R|7p+$DsTWb&^sj8Z#MD^-+a=M`QD^g$_ z1e7oUV5W{DPzK=yN=X@ux}IWaBI1Csdv;MDO5ex=d12pf2VJ*wZp+>q7@|&V5GT29vACI}-M*V#QqgUSK84)0q7<(c55z|#?yF~!~cHb)IK}f&WcdDJe z7p_G;N5-PIy58OIN;Oqb3Q7 z+D>L{2$EC=F^^(Ol^Z$Un4^$4OtOqQWh^n4r-l~V9wFqwqo?LSe&XwA*21=Hjux{s zqdTuGk&F(6m?<-Vc%rjhO-~iHv@!dIyM`wj^EBANZ-o!Rly-m_Qphen+J&RzFB ze(s5<2muMiUaRGgj%lXWy0ne)e=!p-g?K#-(=~+>@)nv0f}y|RwNSiwWNYM-KFHo$ zBXm5hJN({f3pFI)KIw-u)`zv_piSGYWAV|xa%R87{*E= zDdx-W`EAi~KT?5mRYi-XR<^dY*6rh(Xg4UL-vcdQti0oIdo|iV@?xbi0-@ zh#S6CQCK!@5FmIn`c5ZxUAq~rNeOZEE+4_=z~cc?6-C!1plWK?Xy(Wl?_rw4xg-hA z$|l-dRVAe}OY!<0h~@TE7ct_MORLqzwd&aw4Bw)|!A>*ox-y7CVqCZ1Vj28sFx*ju zu?%7vyye7jzZdOyL1NVG6GA}ZPo>E9Zzi$`gh;_<%m<*NbR#`s*c(;uM8flfmfhWJ z8-+AMAV^Fr6$SwS01_ZK_h5t&?#Ir4M@mU4HIpf=kl6Xr6{;zOfZOcWSGNj>(s39g zV0~%3^71lJQoXnp*iQ5Omfz|Z=0{>Dth~HtrY)~WjTZXv286uZ^9x*(%-%?snVP1uC>DsQsfwz; z@jWs0;nrQHxCBoi00dn(_WZEtl;$UczHhHr>uVKMptrKO^~~j+r>}4~#7LqPm2)eR z<1>W?b})M9LOPRPYV|RCi<5CruixquTVFr(E;rSGb{PN$WEtLeMb-I8QGOCh&7f(!BL+Qwky6py$2mq3EK)j(~BH};*lDe5s#cmMy z{r#6$G6#kRJvscI>$bZa>#JeM1%!>$i@DiyYh}N5biy3XX3CjFDcxM$4Vn&c3{3?& zHm~kLENZ(u&Fv~83NAom>F|V_v(}zH&%6&%ufhl<6=EvyK*3ijF#ys?LV-5FWeq2n zh`07(7`mY9uY>i9!W8B0`j0$D-+njX;U+Ymo+xy88;wib7;}~~rO(^TRq1mn5fKvy zO5N?2YHG0)a4wO{++3LgDNc>{_uB4OOQs}25I@!7X=1PUk%s)FJ25|)f9&oH|IZJF zA0r?T;#N8!G42K2339(MyngypC*HlQz!vyWmB~)o8^0FbyHW8Cdd$+@V$dy081e$^*yRv2mwPO z8YBG}-;v(I5hUIksRux}3jjnn-Z7TMI6|lMF05YwcwM)dq3W4L!240erR@`)sYC*R zYUpMrF?wo#@40Jn7-go*SqAHq1xYED7~1yb|NK1B8Kpo8C4>keXi`hwb)f&s8omi} zWjT|j4dF$EQEF+(g_5>}7fL6jrV4~ao9*|%ZlsimNC?sOk1)n}i4oDtr}VUGl{3y} zlQNnd&D%R&pgrOo2u@%s8+r?;CZYS8G$VMI*@L!uTFBIK0|o7+oQ zoq87mTWfoIDzW|4qF1-)KY90{BJItRdUWB&0xDU`P}00>a!?PF)!uLI7$uO_Nb;Tf zW(WlS?&N)x=(MrlLmt0@D}}NBD;0F(!tFDJlJ-V5XuFXex>bAm8!s};AOm|&aQ($A)r)HgGHiJm zi|YAxs?m$z_@U~*Ww{%-kEM@KGE>KxYeSiEuVc-Wax*10p<~FQ?a+he_)kwm$lufB zrBxEjcZd}u3EF$@`!I4La*?XQC;$N|K=Ai7KUN?_H$Ty<_uP6H5P%S>C~-HaUEV}4 zQKHv$cb>cil!BDY-+b99Wib*osh3Y2nE3dyrEk5Qoht2JS_T6UaWFOKuUcOBV1rmZ z^VkvOQU(!WR0c8c2gXF9e`Z~_{J+^A41|Dzb|6YZXwdF+FS3R*u^U89cj+6ag&|NN zrL@~_bn3M?@+ClkATjbO&D7K7BBd&iL*9%M*{oU4+FMOTBvd^*e0cxp>TB#T1s6m@ zZ>u2@dt3GLodbtJiO%x=(XTyF zd-taX zpzqIAix55_&%_rP3mgtlD$rzcCzwMryhLJ0fono;;VuZl3rOfB5+>Z3W{^R(fFHUhlof8^o_A(^p! zZe~O=FLO5{gc3$6rAF4$(griN((RM|?M96YDYm(48P;jBa?2kH*!Z|>cJDalM|Eo&Y$@g ze@O^I0O1P^1pw$H>CC}WcA>oSmuHy}jIlQx>CX2T-+VtB1*#B7LM(BBWa!&1^8R}h z;((;`)=erxKncKK$y%`^DG?~8gb+2UQ&V+=NV7D_ff+i2BuPc_sG_RrnW3Ot|9_sERj#J zgrbM>_pCXYZ!cBsY8|p4#JHLY`rN!@TzC;ioTW|CajB`92Z#N&8c@Ppt~QYi zSL(7CzRzp&UHc=AdYd#?_p%FRce_JXg{TVpJUvzN_d7h|u^&Ptj9gZ32sLTQw~jSo zBu4>pXyJgG(6_E!4Q&@BGQzA>)^FHGCK>hoey=Msbn%C$gSMk&^aGFI-rcE39Zzx@ zxM6o`zqPb`2|wjisILYW?tMAMonE zsP{&~N0@>DA#ywD3z+D@`EXvqzC}F z@}G!c$8UibJ=+m6kG+T}id9H~0xDzel}ga@-AcE5aVzczh{z1JdUnmN_KZ?0Y&+@c zVsa=8LI6Mnp4Qji&v(=2ilr~!fffrln#O^WnoUq$)km^KR{?clx+4x^x#q@h=D<*XYNSUSZlev7@Ho~II#CD^)Kiu*p1J!gpL^oc z@5Su^xztP(2{20RjmF_GpNd2rJ3)W9HU0V94m^Hh=eb3%+V`3^lVtSNZ1-A42$>o! zn3$=ZUgi+Lja9%cPB|r#0D@E`01zZX6M9?c2B#X8O!g!}Mq`a9JY9)z5>Q4nKnU)2 zZ(K(cu_AO=^$GzMlt@AZ0Rl*o5QLBh1_uNt=^*Kj6ay_zdOEws1%)E*RG`I-N=lI+ zprptojTElM3KH}IW6p?p<94)^spZVLALvOlaw8Fit+hRrNEj{OJ+u16YfM*o5XWIm zg+Kuq@UZ3NK7DfIsq=+}QN$0>s)QP9>*+<7GV}u_-tlA@D;YDYb}<&(a3-qTO4i~X z7bL=a4FmY;X5RjPBR6)!gc!+$HIdTt2>{GZ4^2LH6jf+k+A(vf;d|y!{?en{m#zT- zRatprQX$HAtvj&G3L+99f$NdIR(7%kl*(8tx>1^+@b+2~C;{lL@0-+GTHORdB*6QT zHI!BohCY;zwwpxJ{Qb`EtIKY+*WGB09Geb1E&xD`)k|BQl|2GPPp5M8BWhZ|_Wzz< ze)5d+*7=bvVl<{wkwg*}G5|n^imwnsSj3PbMJfTLf_kK|H?3wIq)=}jppxj3;wwT4 z6{H9fh$KjnMs%>is3Z!fk|7d6A_)>bQYgRW1qqOJ-*6J4E-95n5>Pm$2!o_|EJ+vx z6>l*Xlu-a;6;f1Tlt8r8?{7B;$MuAfEakg)l@LDhz~TH{>ABzeQ?r$fX0EnUW!B)~o@{TCIM5ob8PG-5|#}c^{dKFtsnu@7) zm-nr)-1yA##%hgF!ZanB&U)EC01$D1^X}2tr^aaP00%Rm++|(?tYD z(-qLJJ@oG(s35U{nh z7unv@*PoyNxw|DtUDtU3ErcMYKWLNx4px@=?DfTt5g3%deaH6ZH^&qKcm#^1$nedM z#bSi2#PrnndYEr@5u5;!RNr`8V5vk*A~?|?ethdGn(9Wj@ww;MTsZ~0F;i6 zr>2MKtJkyhqm2t2z0I1Q)tRbjx(bC%7zS$2QZp9r4aQdfHNo^kh&N#RTj}0V0wv0u zJyd8$M=yR`CWNR=Jy?jY)d7H}b@XGJF~mEyUD1yWhfB40bIUnXcK*xC3Ls*-P#}b8 zg;ZFzw_m=NoGc(BRX|B=imFIEy64VE&t$$8BNy@}*8u^gR3sM&2(gT9uerJtdA?%m z3>C%DyoPO+GR_9&UeK-XXh|bZ`rM7|)ta;4RV`gHwBFkO)>Bs+*LMfABz6}!5<3me zGD64GMlx#3(6b3bsFh3D``yiF7pca~$($GS4_pt15JaGr7#k=BJ0Fnxp3u`f#Fm zxl^84D4~YROig%^3}Pi~$&gDo zq=t$@qD24VZt}hvs;j|f!#G-2atWd`(GRq8HmY@rssJKU88uX4``+1Yb7n{_B&8n{ zO^Nn8fMCp&qK2*J699yFT%uAkr%+u%i72G>BBD^Wkg}h=`m>1=sUj&y6}Dek@~b^H zsb?mK-Imk5w3!~x1s%7u)wuNJ)AxV=D@Y-1_jfjy-MUQxs7g`Fn~7!uRxVpUGSk|u z^tS65#;GIu6f5k#w2S~FM`ynLrC+zV+TZ`*{tyVs9Udy;N)T32@wfO9!^|6HPwth}%+ok;dS zOldj-^kRe$)iu=quqS>{Ne-vMR8c}}WpB_>C{fNkn{{0?9{ufKzV_5BE6<)Km5yEM zL_NoAIf!KLb0_s|0#zCJLMiZPW~eFACkocVVgKAN%bV2H2&05j5yVP1K@=tpRYsg@ z3RM-NG2Zhir7UkzU8SZLS9*y%rdU!RBm)6a$ykI@mNKGh4}~-)i|)&tamQ8C7E2gm zr9&7s7s^10IWwdr4c_;i(`$))r-`Ou%$1A<2&9nWZU6-ILqp-UpFzJZiGm>1u5MZ7 zG(nJI9Q57HXg=z>)k|BHP(7oAK^A}XY#any!kn0zt+Czq>Mlw|K!q@hLMWDQ<`SA^ zGF`DsDdwtb+EOUB^68-IsM%zO>c@`U^`r7PBPW=B`1a0jEi+y)QVGB9l#WiMXNPy5 zzCszewcgO}Q`wo}&f*>qCEwLT?u=+JceM0ha}k{rvs)eiTf8wol}CFg`O zvy>5W6m>nqC^J+oZA3j^_#7o7B2kE9XmLLvgczlih-pt-co(~9m+PeDO zOZnkZd%FoJN^>J>O5Z!X?lm1XsjokIF|_@ozj$AN&u+IjK7dkW4cQCKJ0@7t;B6<` z>uO_JmNtXcIuQ6^BzlR?={4v1H6S4BZtpJ_VZf0_a9}Vs4sS%!c=IO!0QB}32Y(MJ z{BI7n)dTr>qkXephyZ~5!up%fjW$|uyov|_?n^grU!BRv8|@pG^=FssCWImprG+U% zfoe=d!f!jh)mj`zyyLKhUb^jYDxaxV_9eMG`rU9S6Ygu zaTZlxzV5gB&Tf++20f?NZ#JT~6hhCK0NB~82>`cc8^z@QYpd>7lNpSeD$yuYnecfW zazH2_ohr{y0)ZH%RZb^LX(Y10*B(A};Pa1v{^0Da>$*V{7~{FbWFeBV=XpUCCZ-Bp z#UKtn&ySFMz88c+7>D{;x_D?Z0uCvS8=#aD)=)<1#P@yA^Zd~Fe9!ZIKk$>I1)4Ox z!SNte@(G~;E1D#$h9Zg-nVcQ+JkNDqb2LxWh988U=ZzjdIC0zIm;zTJW>U?YLFk9T z{UGq8KpRSVf#-Ri=X*-ZFh)|I=fzA4hUxhsKk{kLP)Z4AsD87boh+rNN`p03I5-Lb z7|VMf{W%jXDWnKR9L3C1We_@h&A4GxNx2h>Koa%=JeW3L8v0xJBp*B&?X(FcNerXf&7WCYThI+H z>4cTbOVSq*2xll?yRgz-Yux(wX|7ouI77Dj)(znXx?^xt14cqb03h73yV+X$-bF2! zN}}lc+pqn?XJ2qj+!@J(#*h&*l92!aW@){x77|*;^c}Vg)VVd3Pr`6(eo=UlVOfS_ zhD{f3?f7qeftefu5YZXU^_@l(c}^h>0NLqses)L+6?Y?NC?|nbB4wDg7PoeQxK2+5 zQEIY)0M`C|PxeF*A~F>UXE4un&TU;w8K59LT|#79#$t@6MskcX0Fbc|N^~|Vdd4QH z4BK!wnj%U-LU*+a06b$*B7n%-Zd`oh#hY_yIb%Se*?RNlww^YJAKO=aeCEi1@m%@D zbZ@y)pWk`_ThMvq<;$Y&n|sPh(~VXe-rPoTt0KAq#lkdZ% zv6Rxtr`yYw%7vBwzDZIozj7h$L`p~zMjK0uK@b2SGDiJUDFiSa%g&}+>sw6YdfHB+ zptyHL=}0+GZO_pYpYli04XIR2?Q!i zWNj$Qfo zk2TxKOqFK7d|V=R=ePZ>wl$bFQWhy?Sh_J@eB?_{_STyl@7%(K4u1V<=>?6Y3Qy@; z+8lfOfZyyo1*g~UK*iM@vvh27>&(1qI=}eke<(Iv|Lsff0fV6GDo{~7>?~KA29|9x z#w3XBV7{}wdA~&@SGVth>HFUcXh#pYjMC}cL!|!RkXb3W*8w0vFj7t;BoSzqA^eaL zs6-Nx=tWx2%#D_n3C#)vj>VxNOS4)F8zdFnZdZYz-9wFqU7zV15GkSDMkm~AJA)ZS zC>|KK2h2x?4hShwfxFi1ZZv>#Zg3KEU}n^wEDjtPD?hq7TOP=k2e_`;Ifv(+)>_@K zb_qy!llsC|)bdD4tzauoRo?UMNKfmaDC+dAe1-r4Fm8LI9c4!f3^)RsX$t^IlDpm- zdt|>?>qJq2I>b&?yyju-82FC0Zj3+vsj(@U$bUT@BCnfbJlHv7n){J2IRMf^$Y!rZ;pB$(EJwtN?3$WW02 z0>(M@k557&17T#Xet1Ph9MH_!nLUF>-qBK)OoSkDC+59f!9dijG_9WvjUX1d6D)-RLY=5lARW0C5;{LX8`K%asXD&K}zPt51-@8PdoT zds8C?1O!suwFUu!#=QAvRP~;jdg9Q&qo8r(P`kJ;BcbUW0S(J2ADUc$_hwjcGmB0C z;&G#B143c{kO*QcWtqCxUaoeRtF0Sbz17;(^M_f{pxawc|8KtZr$5*{e>2`}4<4Kx zdSbe9epM-8hL)NrAwx7Y*s(B-8$E7vZ>f$1bFaU?bn{ly@R32#_JT$yZ1jMEBw2W5 zC_6Dgu_Q|mYpqni&~;nLaPYu1(>VtQy@W|>uT^VTR=sv_`^rjdZi4~yE8Y6shKvOo zdM01|&KuuX0zlE$dpD9Wf*>&*W8~DH>0dZfm>rT~vVDCG0QxZf$20C6g0Z4yK0RT5 zZrXTi+N+4Cp6@j8h}}kuqq^I5G0+FWs2RTF>plT}04Cis`&tZS=EaB_slf zL@~}7@3+R1lu3JTT?DZTh2QP^-5vsvly?n`7;uZleuRj6#^EUgktI>25&}fcfK6|? z-q{8P2;eol)e9?0oFFk!YV}7~SKqjXI?0~b*{YoTi|+-sj)sT^ug`Bdg)|bRCkFw+ z8OtLgkO8`UH||3#_unmy$lGbbElN6pI_mYZVseH zkm!zS=hHzaFdX~iTu)Ct@x<4^{`K7%JsOZCa-*l* zkOH|IMN~p@UBAOIP5^tqbV9RCtDG|P7R6H2%_L5k&Xq{I^+won34ohA-l1O>L7W6} zX=W@xIm9?qk&r4OC8ZYw5VK4~NaqSx#@1|o?6KLg$M%7Q*z=L|?phsV7&tnW9Ug$R z;goZ&`R&M$L?-}*%EeVc)NF147f${BfBBpCP!?5HzR&@2;xjC>jaS;i_oGCug|Y<+$M2&VQP ze)hM1lN5!WfM<-ozx4R*R~`$yUf}s_Ke|!7u>pv+>uV|&&piLN1IIrDzzWktGoO3> z)EB{`e`$R0zV8}ov5+X?otfAb`{rg`#`kALkPVJ#sAfleOfS@(M z-P>+y23MhoYF&7cn!wc4dz>ex_;A{ObliDz%6WX!d2CXf$T^Qs-RB)l({!924o1}s zqqo|>Y@Duw-pPo$(q*WqRBF&t`bqxXf)MU3km{jgo6Ll1E5_MdXDyn)> zH?{_|Kv19Gc=LC^dH&T`QWHf5)L5)^H)_Zj5}Jk7)Mt-mXUn~X>eiKIl2M#Qnqw)Y zNa4n-*P6FB0U=e)PVYNL9;bvD!z7B|y!38%YOJt#M6(So<6tPfN*jpA9@{^Xohp|m zkyv)JICNrW;F0md?8wAZ2iM-Ykv4P9E1O~0lcXj;bMW{teD2AA@=IFLdS9`RqNEdu zDCQikfpmUmh;suqZWU5aKBbukw=~l<0l{!Ap0-fP($NVtm{qn**&-6DD1lhHl@`R( zDd$YbHXO}xY(R*sJr#)R{Bm!-4g|3mjn7W!?Yw3g6v)QSE#LKnp2sX536U}3$JLvg zq$sR+mv3I@nGDl70fmjOHIg+8X?wUpQr&v-V(ZqnA|;atsF2b!wzGfO-ani=FsdTK zvo-}0K*HlnUuTUe|2 zw(W9GFWA9$`^kMLQF6<)e6Cl{F1l;=-c}P3G^Jm;@Y>eqB5KfCuJ_jKts5JuavnHj zXG&2k^eb&$(~@3z?T_Ca7#OCqCR@?&QxYOvdHv$dmmXD#a#va;NwZD2)`{yquin%1 zHYFmzr&PVPSMMNWg?)qOP^NQhv%OI#FLqmZfEulYh3HD)<{uM?EnBWZgAa~ z-qdp^Hr~2{Tr)I-BZ{`CkcP^8QeQl}^zE}?A~^TE0>br1xY6W}*?D)KS$e$P;c2t| z)-4JXctC+D*X?lruw&((O=kxILWV}x3fDaVV4NXmz8f!n>$Ir%h@fy_#M|tE3CNjB zWKiq%Da=$NK;35c<(6)yZNJ(IJ6>uq2Z<^lp0LaL>h+bd)?t#;BSofg>%yX*wu{rl zkWgd24jeb$zOnC@p9nVFg?(f7YwKFpYAtPdSDR)or597WZRAo0k@D*9d*6A{&ZgQc z+eSXK@9%%+k%I^R%}al%kT`>=*73JmRxX3EU0qvST)Ik3YWa+4^cpudWg>?TPUU8X zc-q={_a=F<+wRIlf{4-9mtH(4#rqqWktC|hHp=spfhH&`(FXk)sHM@qDO`%b#; zIDRGSgV@~Ci!(!&^UJB3a@sNNw3*#A&|R)6rJ6T42ltOTV_7`Pl}P+-PbvYAkunt3 zZxfHk-4FmXW5u`^h8-UPgD{vpest~KYY0e4`yP9=%9j_ucMdHB7#ag<=z4r~AU8YI zUf8T%S}q-)=&V*|zj#thn^k+MeX}CNWcAHCJ#7*|u-P7ZW;QoE&|a;MJU$~@!ONF_ zR9Rl`RO>2829Hk;Keg}d|NJ5m=(c|N3-~2^oe%-v37g8Mh z;?rwyT=d%kOQQVVv4MS~*~!xUi)Z1sA`=iHW22AFWX1+IE-WTBxAe$Fda~$lG*u`X zOIrxoUaPy?T@plowC9CmTADYnZXsjE!BWT)%`uyE+uU}n0Vg$DKt$cvRYWUS=MX{9 z=t{ugzF9Ld0UXQ3FF-Kpo&HL(A4JJ^9(Q?%!)_=pduC5Ts}L3i2}r9Uwp2V z9h!aY*t!4bCCce;wd2>k;=bY9)wO{~CMJevIBLVE_OAW#^2V8Kt;?&RGfI-y^$q*; zR(HLX9v=u4=tU=}v{BRh3QmZKI)_;58B4^H7*7|nonE9!YMj|)`PNcJ1rjx;r7g5H z01ExExv-VW=UuzWG`6&KT}Y{poren=ojHH;?Q`$0pPlP2 zZfA$fddWzQ`y1cJ08U2cfec+rTtbT95TBIXGuV)>cs> z;{-LPBE?N@}D0~L{?y+424E@uD;h>}Eh=Bostkv_g}-!pqpd~Nz!Z@r~LK}=hJ`#K?j zqPXd`n_ELC_jPM+g;2Y;js*GPa;MoHe*O`jVVUu=GnD5DvKO8E_A6Ike67#43Je)% zgg{6uKfK(Y--@Fc0fSoCNL%iFjq4^enKM>MQdr{Dv=vkmRDcD zq5{Efos_Iz+pM2kiKC>m-t1M|jq~dO0G5V1BWSe8pEv>lj-4(~jotc-)BbilY=u!f zT>IhG#lJXPJ~9os6Sn$|9uT!QYV-3q=GSf+c}Fo2GWOToL9^Fd-j3Rykv7IYe>gW$ zw(@^x%C76{n*ebA`rN^T2ZRuglbVemi~anJ5XM%wPz07#`ssFhbPg?Ikxv`jU4YGnQj}QW_Ucc#gx^NT- zpbM2=x2_J#reAsU-+i-_f4dt;a1de$7w6yOnrRxAI;0kFod4bb=AZf9UQ?~YAq)&p z9;7aBCN6Z|sf262wpM9%YJ8OYVztDk3^M~qps$c3DFFbB2%1{P*Rtp zSo-{l&wc05|CkchS*!L|>nadtDQB1RGrx3d{!h<1rEDBM0D_l!{*idQ15yDZvvrE4 zF`Dnb^x^xazWL2>5z#yEoK{LMEv?+Se(BPc{x|2&T{w5{!l(HhY`N=q=I_#6?wtET z)auE88G}@csIY%z;m4PeNcc(d=ro0qOz7wICw*)$L<_R~0=RX;5*-@bsYSF)InB}u zNb?P*@u1;4h4kV7@L81*0R)|1E?*o!dEmW^FY>fmoE(bd4j4c{gb;`hGQ9B4i~XnB zuDSqV6bI6!L7$Y*V=($pNdy7_>g}cadrR-`Ak6>(3P7kh3VUEc+pD(wZ9jS+G;Xj= zDh|7GXG3?2*RK5tI6z-fl0l_V>R^9$bMvc+m z{;hxZ_~R#k`08ul{q9Szc3uSo+O>_S?wPVUm#amYb35Ir~Rc z?E%Qrn5josx1Gl)^?XW32{NXF52*p0K!k^OzMq3R0Dwb3v*<<)BLD!2p4tF+TYR7{yjdN3zk&L>& zUCaQ-)t4@}Zf=c#_5c7fO>eGlW7=>RYrr+0G43=q6eb@r(hhRAed)d3&sf^K&&Z|$ zz$q8k&-^uDS7GX)naPMCkcnWrrrTER`c@$uw!2m?1Bfz;YqzeBo;coISngGpKH>9& zfQJq}^5~;SlO*YOy03os0LMT$zf}O>%v@bq>UBGDBLKwQ^w7|$J!@}VHVUa=t-X2r zreEn5_KY(A0I8RMV@n&!NH-FlKz0J2w?8yVsCX?A@Q?`cFPTt{nZ*H6Y^l3?V`)gRprLV`{^KQqx?y|)0IfL31r0TGQHf8wwG13DWE6OaF# zW*Q=ltYR)|_qbtbhGC=}C8UvdWRw7@_4nR=AkwA3+wtzZXY=`7sWh+I1+tDTS%E@CVet6|3{MI|F_a-6|^=_kx z$hfI%mLB<`3KKxk96b)g#20`-0PU5n?Tbr96u11w%H3KLuIo!bdL>mFzxNEZ*&aUj zH~_>w?I<<2hH5(^&8tr1V|8y^hBYs zXZYN|ed(X83%YJhe&*1qFSp-YK*kak?ig6)`Fh4Q^A2o~W?QJpt8@S$_FM!&hQ8+^ zDF7g)a(ha!eS0O<*6w`WJzA?bVD*Eax3zNP-uNWy-FBos03ao!?hgBcjNE=A^;0w& zs_~!w_CNi}rR-HZQ^yal;#DF7&X~@nP*K;bU0zxI^KKqt|awfd6@v~%L1OQ5^{)^%%t+a2Veq+N- znZ}3{yMa~8riSw~j~-2~bpQa)1Qy`5JqrLtcPcqJ59&QD>!e4Doz-f}ENG?~RJzV! zA!>RQi^i1=X7&*g+&;geC0b_ffdOScn3B~GmI=m`jyhNE@Y69TJ?P!_*ieXzaiodq zBS%f$L5)G829L}fec`F^T>n=S&m5{;S?(@3{AQ=ST=lBWPs*}N1Q4hoR$*ccnsrrnKO_v@^;v8`3HUWwg|dZnq_p> z>N1EJ!=T%;SRMcpKkUbWvKPf|4~S6L{H+$GKg_e*2S(iL{0II>AI%6@GS~nBAOJ~3 zK~(XK6`WiD6i?OSx$^*!883F0Yi7z!7xE%Zs^^w9%Y6Jl`FksuuDuhfbPq4aGTroXF35R1pqQm`n-SK zx69X&(2iOE+y-3T2BK24w%}3Qu5Ab|NrmICDRzwnVm~Hg&Yw%=^V2- z5qaxPBIH?1FQ-{bBY@J;vE%>fxxd{#L;v6vX6!Gges0EjeDVVT>y(lG#X~In$(3oe zoy_59pB_JWkRcM$!Yk+g^uPW;V&BW|A7)&mL@F;5eoPP2u40W1Ac8TNWwt>=>VsLP zb8BYsL%#O&sNRw49SN^L#5LaMg#f|KICe1u0KiywY+(PFpV;@6lccb`ZpagflbPes?}N^8pE&d1xs2p^^6-EBEE-yB?@;^neDK~Uk?e(}VyN|+4ZV;Cs5tqw zSF5M%%*;5WC-!cizUhMp0Bk&k8Uu^hszj6|$@Y8ma9gQW%Q@jz%P42{LMrvljQ8eUd$2|e+%~n0WlxuX z(!f&B%#>a@w*8H_KOj`Oxs^RNkC^9ksjn6Yd6?%C%OG(?k_*h9t;V| zt9MwxJDDKvMy6w1T59HrNBw#?bn^QjJ?XCXd}siGTJFWmcQf!E(i;E(jd`0bQVJ22 zlERDb_=i4G$IdScq?O9-Ht@`WF?+0Nj}?=8?|osLp-0tD(*6K~a^t{Y>4jtUmoI%F zO}VpgM6^9?V!+s6+I>CVZvXVolaONV){Vq5Q=+7nWcAEYZxlSG-p2lXkltl zXqB`P;F*jsP<)h+9CM7xtnA0HdD2^qse5 z5)VB!Yi1o?(M^5YjM=Mx&n37dYppY4xdW`x=K~$inbbf;A!{ATY*=Gmt7XmNy5pC%^D~(H^Np z8_ioQnbG1?k3Rp}tAEka+mujxe?bIEu-Ih=OXB3VfhCgZ8e^Pm8q=8y<=yi~B#|UT zdj_M98+QWa;FL44t7bsfJ{WobD?~I@-H$&=dSeIUer0aQW&H$d-}=)Jt~71``Q=ae zJV_Cg1*zeDZ@mdbT-TWLhG7szxB1?flu{{a+fI@sj3E(enhx;k0rQDS%UVpCa;sfAvj`Ck3{K#F{>K0L zjjc_YF&00El(cVsuyv2sL)wz_`v;7{_jyM6qTYi5t@G$Po#WUMNK3 zZFY!2g)(ye5BH$a#$O5_i>9yq7(TrN5&cTn-E5MSn!(F^$1?e$TR%M4THJKT3WKu~ ztAn}v<<*!%4el4FPdzgud!d%I<4TujEN1CI;J>#*@rOB>7ed&!0|0&b-A?De0`f*< zM}o|CKedHgNKo7}*jTIp0Ao0CWGs%{H~-|@NB_a+N++ha-(5KWgCA$|1Jv*U0Ga@x zX_w2>0^_@LInX?%Fy==#5X>S3P~6S@Nj&P`$EJdlCm2CfLY2%P4D~?RfZMj9F%ar~IT&h;F=pmdVcQpOi0`M`N5qk54|HyAS1v3QLG}77m_Sca z>T((dKAeNUdicj6uEm;WF196b+>VG zxwTl$j1COU3|C)UGOR2BVA(Q0zbE?6O^D=O1Jf+iNLgCSgqEjeZ3(f2c(;vN>2y*q z04y_&4IkS(f1?fzFhT852|0@8HXBMIXXM2s6&f5JgQX1RMifcZ7%!)j`8pp=i(5_O ziLv-!l0nB%?Lc)SV90V75Xp+mhtguM@zXj(hyb9J6ha!d zVU^P=Nsb%bADVtJbnXH+j_mJSTfgF~X`3cUr1`stk~ zC8f93PW%8l#I>lEG)wW|Xn9o6m{X4(3L4Fdh9jTZ+q|_M)_NbCglr$CPd~XQxv)tm z$p}mU5CuVRDF6V5#-3ulaCd9dr}D|lUzeNh3Xtwzo5+c^9nuc=IOi@WfFy}<9)Tec zX_I-e>(0jPKs^7~ZK(`Fz3*J!IyRbYwq@P_NcTrjLXo8Y!BuX$Y!))ecoc-1!R(=I z?eeW!A`%jOLd3g3B4?G0%R#Nn5UqiX3dNm< z%VepkHe6A3#7YZOhHCf#K+OK3=sQcRdN1THJ#GSxvx&TmlZz(-euuGYs z>9()0Cj{JJu@_J_3;i4{R#dx-pxzD<)0SrFRz4+yB8w=N zHan=Z)JUPZz0+Z-jbtTffS^qlKxgE}6bo%2tGrmOwy6^v`v=L5!Qk3xmW0yw7iGoO zCi8#*Ofp*sZllI16k@Z>GA3FY>RdK`mb1v^m^KhVMS>05+C&}@R4>v-vf+=Gf4U3| z8QKFGEo}z%o&s1sKj*c&GEV$vXX%y8GhaA1|HJdnP~P2a0swK7_{UIJNx(G14+bq| z7*i}{FA%*zE2b$*Q0EjS+%Z)wn58EzPs`Yhh-Yj{B(n@==`u`|7x9#-Vj((yUxGw# z_2k|U<{F_$P$J{aHW6uQOUtKJt=lh?C8_kGtn?!321YrjWo>5YBqSvg5TqYbB8|bU z=mx?K`#v-KnOXPp-$uZU_CQ)G)mf-GqlK|&4p^zQP*LO7Hbd;KHm85#m<;0XkJbneX-tK4)VoIc$a|p;tTVc1y_+901;fGSu_B)FNHt8A z;H4CE45f1l5>{|nkx|~^1F2-S$xA5`KYg(xDHXcDK}vcF0+eUQ4u9p@o8LRl2%O2{ zt?!?A*XxDJ;bt7&e@Aonm?=C33Ydwarzj!4zyZOXiy!dW2mqh~-H|o`kgEWo_k$Y% zkSyO#a03-5z3o<8HJL&q zWov2EZMOg*R?%&kK9;0N#nP{K^puIfw5*=oKA0jRZ=)&YjyO=z=-e@|=(QEJwdjpi zOlf^QgAxS@Xls}@03bfMi8}9}%p_N8XfTSE&>NIUAP{DgA_)X&aZp5(P-m1VAVN!H z!)dwH7A7ZOU`nGzfuz1V$xk2D!MM(KZ>z<0gBd)xXE^Nmam({HEF2h{e)i~%m(BoZ zreVhSUGA&rG?D@V&_Hf70MPTAw-Pj1yAQ@TnG+*$^;*IzSz4W9a=bJp$LY zel>S`C?6`HnI>#^`!k@KMq#SdT*~#9>O`bs+8tF;AOL_o0RSX++#dB3>LmaGf=GzF z0j*E~aK{CaFYf*3cCJNkBIjFoe$>DJ&X0unX+(SNLPjP+NtLu!(Cuxx3j}Bt)3Oup z`}N1_OY4ofwI~kZz6Ffjo1yR&063F+xFz&FcNZc($Kc`kNKFh8g&%_w0DuZJ6D4Ob zS30$K_~>-5SX%tyd#TZq<`}_SwGRMd?f`|r5IMuX7?h5Nc1H>T6@!Gpu&n-;!_0?T zqYped=R9K;4vwiv5J21u-F90m*n`LS=ch(xl5`d-&S=rhK7c-0RFTpp=~C}noV1j` zlt`Dt4f*hGf8+p_x7m(5Q9qf|5D-+ll!1g0^nK4gHg@a)(p~8c{j=luf*d5J3QtIcXT_Cf(M2pfO^joJ*c0F)qgrJvc0I@j~5V6|?|lvS9J zRQ6OUu5|TcDrtK>WvWp0est5>KhnKzVCtC4UM_IX`8W@A0d%17)f3TXiz1=m{u+o$ey>=y0bC>h)lTS(~Ok!&|p49 z4rXTT{DBc7A_ZGlmYdf$NU8MH!1%KV{mu5k{;|wN;X}g=AITQbUq*_{KJFDP*X>8g zjlnEWn=*_M5gDS!RFsHr01Qbfl9aT3=|upLH1F2?VvH)K06D=h|o1l?)@}p%AymEG_59>ZOm=BYN znL2Xpzwn{sGiJ`|ZZ@NCjL3p|Pm%-znZ)eAar)HLdzh&wjULZBNv*3DQWOaS0!ch$ zNiR}<6yL1h=iS%^);ZZi0N4fuywk1sflNfvmF=IrxVvZz&!Km!3l=~FFhl^@-R*wQ z=zjkLF!$ECFMbk3{ch~8H}#^~S*!I+c88Dd-T(7Xo?WefAT@HoqnR|@v|J*)3 zWkpTzf$qsn9T@86EHbqB4lzsTS=$^b@RX@#ES|RX!R&+NW5C`)dEJ~9*q;9N^>?o|mNt0V-V*B-+7wS~tx|h4T-yxSR>Q@e94v7| z;YFx(l8S^Xlm?h-mjnPZnq)z&}1HX_#H2(bVv~*Hg2q^@@Z1w zH#(W2)YudIoI?Kmzk2zBxWR+PDtWPN2G)_`;O4e9I~3m91^}&?R*8_^Km`x!=076q zVr++xNRjA8^LY zM(_PiLiZ7_+(s0_OIrZoZSSN&vf@2_;U9Spy)!w81dt>#=q!JDocUtvvBR^cPQCm; z{$A_`2w)b{AXT3a8{{tVo`^J4PlCuundnQWTx`J>08pR2Eu?-mFcHPcLlyc5Pr$ft zq%F=l5Gko*H!L0;U;FVjzur_=WO?7j+UdF7bMf(W)9bo!7=}^=KtZqrXfehaLm>nJ zn5G#;QU7Z{WYTp#j_;ObnWjlZyRUp|hM7+#ek6m~87d@Ru=j;imFp{GM`purSiQQK zNq;rFw^V7aFx|-Rod&K)iQQXXh})j_{t%NusG!*sQEX_LJMb4{ENHZ)dz*%VF?a}b zJm?O{IVeJtr^>mgCq)^ioG0yq+d-EFd-E;BrlinDH>3J>yIL;1AJTx>crBq6V zVW8`VuIr8?l%iBBr4%7Tk_g+jlO(Y$OG?#$W~G$pxk>V=icZb6qmo1h;5S-UDLpp3 zcW`8S`QrJlx#j16^VdV)1Idyg9+=&STqA(ga531fM9S6P2SEn00uX*YymxOZSLhea z6Of4G&U#ac+nT6#7m5!}=7EEFuiB_i38Ol~Mqt>pBr2f|OFz`0hJ=TEasFCY4kGpr(_qpX5ji{B1QDpAABpjZ)o+M%cx`H(iN^ryIiVWTu`x#8oO&?Oy_#aj@q7*%H67E zhj(!j5|9FBYBGocKn4#(#19k059}W|iy7JRJ;u1g%y0=2;%;akIB$)!(Y=X_KU4yS7-=ZCy(l z0FVHAjqdK%Q9L|;hc;cPhjmgP2IR<|n?f|+=)$T?U0JbkK$#%T&*va{;m$q*$Zd{trjunle zG-Id`fj}m*-w}e60P(JYsYv+M7BYsq!jzewC16O_xSNvrLuA5CIEC+szJRKG`nWr z!W1Au;)cbU(a!4^;qM5h2LM*IwSg1~l`J)lN6PVydmEhiPMT{xMQzV-w{?EEF)8eN>u=8uJTl&&3+cuj9=3!%@X&QlL@@v&z~F%~Ewgvyz4_ei zu$i{zuWzxgf9Uhicw4RBjq1k+)5me_`#WX(`gEc2{NcFTP3k>srp!}j`q-rM<6yZK z-R>*NeeMx^tOx+bXC8^)SpC$RQylKzcL=~+YXKnu^fnret6SUC%MPTkeCNl0#eeKq zpU;gCX@;S3GYKN5Yeq5eS6k9c=zSiHC}_BhbImamKkVMPONyX7*5Kn)t>xyOZSSGA zJb0KvQ5bIBShUMIceU;m(}_%2N_W?5J~K31lU`h3+*mq&334C)xA4J~taq$f9ChA1yX5Q}?jK;OAfZ^QFur4503dH`?#M8SqMsEeU?gH0(~Rt(+OvmpxrtJz z-F)>A|M+YF@V9PVz2-Ps9rWqXAHMR+Yb2B+ec;%k?rK%~9>6Y;BMIW{WVy3i(;P#^ zLhX8cQQJNJKfK5o5Ii)k54-ertJA7y2L`-O2N1ejo!AXzH`1o;;(<|~F`C!c-u#_E zBJ}`o*giF(mom}~RhR&xijvHciEyJCtu?e_nweT~V_P-u*9_uYbpQzdN`dpvcdu~U z(6UbZt(!kn)2A6c4*DI<0dcHcU#eYRcE9}Gz`@Dae*c^Mzx=r9#vm1P%ubKngZVo` zio5!pZ6m*LDDH-SqYdwi%z=oc9|`raeB;9phHPrjfn_llE_!Ha49F0FUq4BSV1@=nkg))Oq)MNdLe53Uzklnx|Iz&8b3cP9VrQvF zfdl}h@yfaRkrOi`kL~-$fAv2ZrR)=5{nDwgKKGsf^zPe=OQfO#F!^M=T!o(UZYDH^!cyE1fO|!UR>*0MLf>5Gl)dc|6*-4F5>mgqM zQM)f900=v7pE4vnS;|hACGxfJot3driJaWKx3a#`T-lUij0D`&8Rs&-hcW;F5u>h8 z1hE^aNWkrKG6Xa-=AN&dEI&T;P)X%)vJtLbn?nQ@#4466@6EYe4dU3Vv^2$ro|w)} zmD78MvU^A1W0a8XtH|DcM1!*dn-A`E`x%dv0l?T_z8&PCzNY{HEN|H-#{s}R_`$8W zV`Jlc_s$Lv4}WT=&&oMQ+5!M?quH9@l75&TF7}&C>Kog=R=c{qr4$hmN!qPsukFUU z%(N33o{SP;$dKJR@6t2>e|ujVV^?yWcTUw^-@9+`o!w2cxs$`$7mehRENe6}obe_( zc3{VLfY=F)z<-io{uu-|0wg~I78OooG?-4#fO106~^&m#~3Q} zoFNYNLn?EpMktk(2;oK6#DMIE)et>RUyy=J zU-@1f#z{9&mehtfL`xejin*NwJ6PEQ0JS-W`e{f%>5Y%peMg#%TqTF?uYVVjz^@h7EJ`QX6t;}iRG@^Nf1)VU%_L`2G8?)2uH zjH5MB0$|k>Bcx>3cYOUT&L=1Inq!VsHZ3ztrkYxxqg8SMVDuHt;j-RWRAGV)&5El-{LoB2ivg%Sd@wg$RyyVf zi>r~ENTy?&g*=h!&CD*mYFV`ssXH9aK$Li4*z)wEZAjZ0sl?6I#nx@pu`968A%2XZ z=|&QSt;q!xwg9CuyXj_JnA1onTquG%uCFkC~s^<+UlBKubW2T|jl2*3} zSlIS~$S&v8l{jjo>-tg3Z9e&6Zw zgP%U*Ep>1H`P*bshRJ_0(ez5G%yQUYpgr&*FmU>d%8dYkbDke6i8x()?^Y%XTxUi; zSFPoi7N#=i*1B|U5ikNEDY?OsF%?N6Hq6sQpMLz*)6Y(S^3r?P{$~G;KcEIG;Sj2VWhIW_=jrj7L)Z zMWmG1=!Wec0CaEFy@gKY^w8KdCo;`%I(ai^CQUbu6PcvjmT*(i8_o>Jj9MNE(riQO z3ZgWlP5O@?c3l^k$hwp7j|W;Pm86lo&;$Yi5>nVs4m1V|(-hUPA&-)>+8xK z!#vcl50(74rn8HsFPx4S+Q>N?oavg1Q=`8aFSdEXR({NEUHUN~>QzUEaWuJf*WN$- z>gyg=*!a^Y8#m|O>1JVkuskt{OtZ(F)wgH!!e}2c#u&R3)^D=G6!`TH0>plxaf3G5 z05k7=_}#z!qxZh@&HZeZ2Od%A*Du}-+b(21kr~QZ61bQJH(E9 zp7-T1e|g^qyB{MAgSI>W{!IYrJ3d?(slNRm|GIg3Cad0)uL9JpEny*J-{^MemQ005RZl%MRl>Z@2{ts}wObpSxf z$`tORouriOaafG8thDI<0_}+rp>cJVQV9TF%d;1jhaW$Z8!9hQshmaW@)z=umcw^=4bGa)G2$ zsUQMmnEkthp@=Jl_=@AQ{e zt}P%CA*OD`^R^5UT{8fHYx@1(U(+Z-F+)q;K+oGzvsXPi5jNV}Y%mozU74ob&=hXcRS2Dr7H_|Cv3tF~ zUozn1jP86>`Vj#srNTyU@~_^>z@0UauN@z&99L(5=2Mg3d4KZ!_wSGcV8_eqRu9ru zEXT(3YWD7NhS+ZbM{36qD>mk+S#N(89th>kAY7yv-gz}bmUf9V%fSA6e3eMRkSu?HFq zdEr2Xpt5{^njuz>^siiB5WNrpL^rku^NZ(hEMB_BZEeRdYsYGIu&nAHnjG^6nwl*4 zeQmL|?EP-j2R<9_r!0Mj+bnG}+jOuOnF`OK5^Z`_#u z_5}i%_|(HOi2gHU{)IN+b}MR2T|~{$G|M6x0n$bj0>q&+hwOabD(+*62Oo-*NTpYA z1Arm|0_jIUzz}7eE}gq6LUHZu?}T1&$Es3jYN{1#C;O=zsTCg!CYG(cOLZlO8V8PO z>8cZe&Os*Jh)NiP)LD8n4>*#;64N9LHyi$p8{fFUxz zgD(Xn#b3P+00I_Pue`T>Pp0`-uK@rXci3oAys@yq3J-3Bc}eEX=uOQPhRS){IriLB z^XDcBAoPOZ!nEv0+|ZO%GER4ah>DV42mqRGK!Ra!6|WNldFmU#{d=Zma-EC)y4eqm z5;;SYQ=BqHMg$0`h!SZy_K}}`I_-rY{{FXBLF$h75Bs}n##1xi9u~&_(%gOR3?$%? z2n6QMueft7^EYp0FK+Uc_Y2jW+h|b<(E9>UEIN1$8&gW&B<-CoB?I!qWp3z^7XVPw z*a!kR^~oPe(Gx{>{qN3+*1mu}$l#h$J2h(8oTYcB3CSKPfr6;%A)<4zFInk^9bXBN z?e;M6IOF%_|4ouuO5uAw?S2?YMJforA6R*UA4=$f2n@KP=PFLyT>=KoWKTZ!i9^+c zlYjjt033e$B+K#T`Ff-}XdY9)^gMQ5Xgz}8`$N*UMAL(wv%;pwH6HsxRzoMFP`>$} z|DZTFSU%Lhig5PFgD_E2)403XCQwM|^q1q69s!Y%?Q4rN5vdOEc z8J;hf{Z4y*M+_aD$XCjZ*%`Oh%szvNRV;qqa=<(1Rx@0 zOi2j9&68w|X{MD#!G`CEAt~azjsQx@Y|2?YN>;`&`y}IBNeKw~ zQYG?SnRS}ZI|mORpPRoGv^xNxTNX(vvWB;aK*TuDo;Fu5Cqc-CE$k{ezWh$f%c^Z8K;0y8yO+MUTY6cwA6(V z^qMVO0*DaM?8{q)d}pz)+eX?BND=}91271ixGqZvK7V}h;HcN?csJYG^B_ZRa%gS? zSCFz85<-KEPR#Q<<1ATDm_j9q6alJLnb8zyoY`91i?GC?vxV#?MpRJP+hi?f<$ZL8 zx<-*ihR7MjYL!h|dt*GWD^DV#V#+p3-cl0)n1){Lq7T{AvJ%RevLc{ac$r?cla3Dx zz=qoBf#$_IL@-L0Gg9r|s9V+i@Z-mtot3cB%+@Aa>ekQS0LGM*q%Xo({}?qBL`-G} zw$|j}mBancfojqVNYFN#64btQeLM}uw7!Q%ho3%*h$Q6XU%llwdO*N+O@v9(4P+#Y zYK|dOLW&?JBEzv!=j%WvY57FEAqeby^kBHsKM6k*ZGUTSFgaQP+ zzrajx*ao+B01#fZzMJ*DZk6+hX!ki;unz&~c?%iCP2|28^iosCZn*wD1Y}jV_vU0d zWAxdR15ZpaWF%E-V({3DPibYFoBB56k`TD9F^v-uH}&ng^8_joxPEo5Z+l_9Z~O~q zv)+a(k*ilR3&;dyjA;xJ8E1o!j*osS%Pzrz(}y1Yl^^drHJaUN{4-}NXUA6W$`~SY zQ_tpJ9IknbEv;+=W1<^|O&0+4oWTml;U`azKl^a@Lt~#lb>d5(EDYC}u0iozGXEFS z{NFPF7o@$rMZiRurcoL;dP*p^)xy>^Z9m}p<5GD_%1Cr)RtSIq`p=FR4px;^N=RfZ z?ndn!^}=vX%NvSFNdf>7#;|S)1BfWywKW7nQ19xtl^?AlLha#EvJ_TyAtVw4U!@AI z{t^&zu2Cq>yj7kU0D_H_O9UCFNjn5W6{H}utCV_Cu-KtB_LzWL)AQ5kFCg0}#Zw zHgYv5+wH^896t2?qngG+s>0F!!hs3^q;X=Ix(2K?G{^t}AZmGyi_<)-a(5^FxaEZ; zB3S7Wk&{wi8xk3`o2=TH!B%HDHW`A{n=LbVq-6)NHSg13zmJL^u#ay*fam? zCu1)_b7MvHf=!&Q?<(A#Rz!dUpE&yPzj@v?4FJdwm7LLP-`NA)))Z3G4UsdZGwH{O zm<9KT&5}bzz)-~T^83?v&0zqg;p*Jm*R#{1-CUl2?*c}vwHxA&x0<|9ghT+q zkZE}n07?_XNy) z88$tyvy1V5w%zXRe;4?@4g*Fk*zI3^BtzI0h zxl=2EFmQ6LTW|Y|ZBhgTmE(i;>r+-W4^kn3uIq`+O50Pn-5ET6aB8OIE-Y{E9kF?T z6SC7k`bl0;`D&S)x(Zh5$GEeDt4-HU*$EJl>00aBQuo%&+|)sWqy!WY0wNGl-{VIp zh-9h&Kx2IG9@VHbyX^F!!E7@(QU(rM-n0t&-b@1kG@a#!N-7ljfl3-C!D5$jW)v)L zo0)y)wpSdluyl1607%i)E0@x>5*kt|M6~+yz2!Cl%)WBPs+5wJM?ywTcjaas0F1H| zHG6ikRH~HL1cyYBfI?)9gxpoYfPr0etWvHuIls-`l5Vu41{2>+0ruNL+{37@0)%z& zqfjMoys8>BO#EQ#<@5c|j14_`C=)Os0F7yRBlTAIo9G04*uf*8INrWE6S)Bph*-!d zZO=475fCuP;-&_If|U*cEqyRe-83{^yOM`ZL2*P>7_2N^ogpMMpN~5sByy({11`Mw z^3a)aZU7~61HmTS4{y}a8L!#%jj$b5CI(lo%^9WQ(HEb&^|$Bap0Asx=IBY=XFBV9 zXf&E@d0me&#tSAi?&7@5st(3}kT2$tp>$)iv%oR5YlUJVH}l<#u^Z}+NkC|6|2toI}EVwW#;!Dx(973oZa0e&*3!f9aLq`J?rhka%$>Cz6wqHCgV!zx%bB?#vdoPEyGz z*+GSIjym6mgC83zuD(LXF z>&>)Ck&NZlKYY1)Ybk2`N-4kH+dJ!!BzW~UAm#_l+^~2dSABSN{726q0s@(ZT-ftT z5hapqIuYgj^Lox6e)cE;5YqgcA8`pu5M}7J_Rx6a=FGZ3008{OZrY79mfu}&0Rb`` zd1}HsQ~`k6qX(;}N9HfwBw!iG!*z6*dm>3ms&=Q%IbUh6FwXqQ-(rK2q@d9YTJ8>K zR-CRT$^Nk7G%!yM>Jzoy{%#!Y<9)e3ZeX4sv>!XL<;uwc^W?z#U$^~S{!zWCJfpMGXtC+OuoY8x!#z~e{vc*3C*2cP}AZjc(Tt$NsQC2m+J-I+ci5CSekBH)yx4xa71Eu0{1qiJE0`67^li=(Z zf8@yLA4}Vwh~jkv!z^!S5mh3)vn$>CrV7(wrU?M;$+_0$IkGgPY;Qhslu-Us*I(=a zfa)f9<*UQRE+R5XSO4k_O=G>O<$>b|i2xCK&O(J*Z}-Fv5D}1n^tE>;|NKn=LISN~ z`pez86J-zZ(cisUzc#&b0wRbg$y`{?4`$of>jXdwS|8Qh@6P~$@Wb9h*Rsva-*^=P zkzw2k8y9aIc_;Ipg<<%s|NK{%mXF5wX;0Y5ndVr4;C^sBxxRr^(z#CVk+CfTHdga5 z%oblbg$!kssvt?H+Z(iUl;edT5hW|mx1$6eTCxG5cZ}2`RaxS z3*&X884*Pg?4capb}tdB@B?B15`ZhNYtoH~lsngu8^t+@BmqF$3Wq(hk?BoUzzjbsffDz!d{p^#WUcjx}6P!w7{U+VHDN zA*tzRIukefvUZuPN`lxJEYwaPn0@KWv0r%R*8e$Qzj!l~kka8A*IE7DkC@G!(OUQB zk~`Zp9Xr=wA^-%ej8wU<3z3l=%p5AYuU%Xvc@P0mcp+m*cM*DLwN zk2^OS6e%f07OZR5a%X?x`72+4{pnx)iPyjKr{BKt?bdI%zVzake&@gaj+?q$G#EEE z!?AS7zH>%sFm7r;yyXJKOa~cbIfDR%7ezD8WVx%tM7Uuz+mg$EIMqOniMF4vxbadq zUhL3T^CS1@m~g|b6j_Qo7o8w&`=YZESq1=TaATk-{WxuTyJ#@wEp*+R%WKGlyEDzj zcW&PJ#(9x!*tEKB@SL$u@#TlgpzQ(?5lPCw|K0!UExSq)0BCs&5tWprK!q}^Y{M8s z1k{irY9`lAeX|-N0+C3&lmkWWON%PrE$9?4ef9N)*Dudqnc9Gn2)d@-sq4(5g&b+k zi)s$ny3@;MDQ{MCcK|=i?#64mdjZ>N)5o0t@Na&uG*T@O4t(nQ7f@%2XqO6EJi0wl zlA!dyJSqYt!?744Ai4FP)mO~)JR+12RttyvGGDn~v`8rt3ndi*FiX=Mv;XusY8*{1 zf1nBgOy}jJ1IJ%{_MtC62f&hcl+P7@`ak?;|Do}$;L5wV-~FxM`>jm6U~6sqR3swp z?Ql#c-SCG!mDzpyIsl|Ioz)p#-IDGRU#{=1p1s#@?07}Y?NI-n650K`%X=bLNL^pc z=TbjGM5AKW-=0LvJo@5ebFW`*U761$O4Ic)_SU^mvFkGlYG?U^TQ9xW_sC&}iZN7@ zkdW3OJ!OF)Cg(XLZHI?{;;|dwcoz_ioE>+=&DEN{`4!|<0un;(7G;k>GcR3^ntqlo zx-scHyPqONZX{E=UV*3m?v!mB(vSQ*ERhZVCQR`jGUrLCt6zQ%7@CfC^tq>=dG^`= zfk;Fj{;!u(KL!AQrrCF9++AKmM8-6c5+M+QHB|8CSE6RN&&i+bL@f^hn8EX-)p!$= zWL9!^e~Cgxscc-HYh7OefXMY?FK*vnn1A~^p#lM~{qCQlhWak)d2I7}lk~zJ-zueQ z^9j8_J}%qAaOBCO!V5A%svbWu_{5=sC&rwSougF0D@FkzWPS@qxmcxESPD{pSz(It&FChKYv5GDF9GR zadQjeIPy=PKJ#spWIGSk0;o_svI>y1tQY z;>|W>n5>iI{$g7uyB>4ZLxU{Ugb>B?{?3g$(^*!IifLSivF;cMXgGFAZL{R4ShX(C z0wPB&9PaPkSSBI>)CO{fk&D6KONAheK6eI84x3pJM21`RD?>K%Q;#>V%~c;gxbopt z(g^_oEe({SNQfk5h&z^_;I;vsyO$dw0FX*Z1pvI5yK&_TAb=vj(cuySpmeyuG&Wcm zuerAyBaa+u&MeWzSp=w^8bziB9WUG1QNt~t99eqrCV)zVEn9l#dzVN4V{GFjh9oNK1-h%}C)yYB;rTsN)QkGEu>5Tw0; z<#p&t01!gpO4w@8f9`jG0ip(7`Q4jsPJidZDznlFHy>?L!v{&bZMXK^Qv2F`QgwG7R{d@$eL^hC6D@z&V0r(}>cKD@O?+ay85&6V=JXhkalfV>0iVy@~0i|xDY zo2^YqbkiV*BWI+f5UM%71OV<_bK%^iJG+9&f|a&%BLpIZ^2ngwU+`PKM#E!>hhI4B zFS|^X3I%g#hV`#?GA_`**VD#1d4JKx?NOQo|6d9H?!>||8yMJx59-F!00 zP%m3D;}Vzxj=TB2B~Ox(&~kDx1I*%PB_|dWZs{bHyrYRQApjC6KxF2DTpA@}Wlg|z zR3K9`;5h^CC2gORIc6ub!L}(B4-aS;rjv{;Rzyk=Xzs1$tc~L8DYiL&0w4+^QgXK) zXIgf?Qc!EuoKbRAnZ(pe((=+a07IoHUhWc6(uvj)AOWy+W1)20W;t!|GfnTa4}Jcz zxtFih9viQ}F}cBzFx-ZE+?&no^XHhN4R2mb?rhV$-6SB|!JI?{NZjzQr!sTQ&A|`; zLTmZ_47YWe%CkT9sq=2&-fk3*4v&1|cyqEIw|#e^lX?*WAR!2{%Z2W(IsgzLDRAq} zO=@uyD3}-?ID51`ISU#xu2+u^Exj|Pg0y*kRtaieo(r2h&~ugwHzW`_%R(jM_C0lHWjfbv69~7` z^eplszV#g$wS43H-15a;)rUXV+RgV%1d$i`t_N!Zh79dO4pxg}L)KVRk;z1z?HY^}?Rr4ogS0V&>sh!b-DBPu63bHO2o>M?D~#p(i@p$PxU;>d7i_1$ z9JhlElgM~ivyhaMv62Wt$PAvVl>E6iGc|~n+)1{x=P4f_vipm_ig1mu zB>z1*@?!7w@JbG{>z{DW*Ughu&u>&H=M(@?qoe_ z`bw$H(Ht!F0CDvvh=TdHTHE&9UR2}O3~>^X1f=d%L#!3i$Ue67X5*-x=m!LTs$VVK z-YQ@pFW(C_Oyl@|M3RyvKZ~yJ-TwRc=ij=L zt2w)DZi>@n5ASRJog0$WS^^_@A<#ji_#O~2$1m| z=5mj^M7NAIh?Xx+%an3MCAoGVZt5VE+$x!g+CjT0QvVl`gHwkFcqYpL0000C?|sfb z-@RkpamKj!-{~H`q^j04tDaf2)|{(XxRQb-D)I+p004k0EhVlD06>ww9oHj5zinH= zrrdA4UJq4GCuOiJnZ1LZsf9I!%*ovzLI!cOFa-eImTZ)C&|t_BpKfu0&@5Vl-?&+EUIXES07AkO|oE9@HY*JT|nA@B0IDxun!_2G<7z<2h z=Bc=Q&u*+tF1LrFF)NZr2G}-Upc`s&3toQYSA0<$L^cR?C}_L}lxCAfc}!bgEl4e8 zZSzRG>g6eU?VG%BVq$MPXYIEowQ>55-xDKPe=cw6#|6<(ybC);>>X692Q5i8f$O2S z_yR4&#FV7P#Qqh|TM+5qu|TO_5K+H@N(04v1P+`ph?*J4xfH}!?<17RXOJuSlcRk^ z;zOwV`#;+=@!r*FI@^Dlo9$M^fE5O%6Q|?o<@dc(2jjAl5Z!LAv=6Qb_*tpHA3c-? zq}ryXs45TbXar9%JYYaYv-MH;v+s(tp|1ULjt1zQ88HsO{?0O1V$wv$zzD;R05A0s z_SK~|cDrRIYy66n@lp`9n1Tx@O=0$Y8fe~TA7ppuNK2vJ4G&hv8`dlTE+6FfP(P)xiUpn1aeF zo~~|k*3Y@e&RMRvuD3U5DK5Uk&r1%g&EA(nZ&~MN@s?eh@^bvfb~eml6FVaavzv|m zTiO8tg2Hb0U}GzY6PXdj%)%B(an{;NL1tkBq|o4!XO*`XgP2=Lc{o5+JQP%oJ*z!DTI*81RYFF`IW^#{S)Ht3`k+_ZtDbgW3qLm{0rhA7~&8|V+RX+Cks1UvcE9FMt06lKnjXCJ=wqfv$2<# z{||Uu$A7Z$#s`ZV*q()rnU%%HhUMR{aCDMzc?0>UL;u?=997>2DT^}1(azby7$V^U zv2~*ScL+&od8PkA_$wqc3mf~tgL)(HzcglI{2zAq&JNap+n5-$K&&A)Z=jBE{;~ZR zdnXIi|0L_b`1Y6P?{NOzk+?No3b)-K)5-XIKgaeOkge(J|-RxV-90ZV@@6;@V`SSI#|4ACD{7k zz4{Bv*vZt+!3IbnXJPB?_MZw>3mb@v6ZkLE-U8-h=Vs$%<6z}^3yWs>}}2dR{Yg1{BOa$5exn+Pv4OLmcPZq zFXjLNJJ~s?+SyqHDgN@6>@UdwP|Lp!Cljy}SRCvGd25Z8os*xHo1dLim7R^BgPWg= zgMpQepY`AD?My68-TzP4e+?co!GCnQl!fD4`|f{>{xPCdAYcA*_K#C*i@%2w8QI^1 zf*)-Bj}RQeE)bKy{d~jvhsxL-Y-;b1v@}Q%-(o>Tuwo3 z-)2FsZ;K`P=;FY)g%-S#tfV;L^{;Psdr|zG1j$}X%Mk#0hyB+N3XqzP|0YCml9rc1 z*oVi*q2h|sPHF@I$N{n$ybyVYJJ z-CLa;qPi_wlS=*Jc=p5dtYPj_@JK5(&F7dl9L4-YRoU~yEco_v;l5yQrX$|<380ir z@Leeo3fhm%f7XcD@f|KDog5Ay-~%xW5mw4P&{8iD3f>O`1`b{c3L2hLBw1txSa4migGxjc2GEP z*ZSqTuLSNYDiPoMjdCr>I zo@a~om#Q8(H=Bs&V2QX#X6uex?; z@H<}Z^aSy~hKx*vX&O7YU!b!jD>Yu}{&Z|T&U#+ay`HlWH zk0lmCgbXYq`m5GHqpf3M^Rs8y>2O$vSzMfP2;C<#4fOQeu2OXQ5ih&m`+ z@dY%8GFRgtz|ucRe>A@7KVL@8mi?YEN`69j5MRA=yqORYc!7c1AbvdtR&+j=JZnTd z+Z4jUiivcMfT-bO4jBMlAi``Xj08YiN;jIC&QB-2?+1n_>jn9n@QF)<=Ajt)tOy3lUQ`$21=jvLk z>UoWIZRo-z_QqJQ;CjnNMrDHWf8je)Z7Ll`SH@TVnyjmxZ;?(9^Dx3iIbPTE&osRD-U)LdgyX`@sMb zzSG)x$7zrghEg}BgnQjxlw2hj0jzR2=&m9d3gq)28yipZ z^b#8Xv#9W_3`rB$nH{6G#6~#)W*t!SOWN51iZi)r+vht}tBj}Mp~#>k)~jV-Npkt- zLk;VtjUSB}>Ng%c{xfj)3HWKB@B$%|;P?I2z3p9tXrc|2>;1C z+!*;6O`8KQ7-0^g4AQ5Ijp0Kp{f3vmYdcNN&W?r0eHJf|o2fI>=haEQEF^9&Ki&Zc zo~g!^?hz@ev%{QEaLh9aWv(kXPd5#cM-(1?gFoOf$5ShMlNb<}6(P3|4%^kz<` z*Zm>-n8mmB^xKtT{>brf>CGsn z>JT+~HbVEhUq@jKa%VXO=fMNdtO$PgNbC}tlQ4{|#bO6(ydC?slUhZTcni?>Qke#{ zTPGCn}fe)kM3JOkWI1WXrz&@fS5yZWmpV5WF>}P!aqR zL*#h`H)utuUgPp~9{!ur!!P6aK&XjY{BC-~5~#k^L<<&0HCfeemn^%2YFD0u?!0>m zgyXis2SQ5Y4ne^(%uWgKhE?T&Ny4C!!e3wrw;w_IaTT%ZAyfJ#D=&;Kkc#MHLBHcE zVBr1YPAi_!#KWVk4@U^E*IC}#{ml0JK^gHw#DWc5y2%;T}3-)d^$3FtUzUEjytOZ0Rz^-W@=`|COU96pPQ&lbVuD|a0` z(Z$(v{cXU~wP!4q zF~#o(O(F;ATC#V|Ugg3k&kh`Mf3_hj=fGx-H_<)dYnTQ2jFvAeO7HIltV&X4LW$a% zwK1Zo14g8^Zm|LO*&KY3pbF^~^gZLC4@98o)C%v9gm%#tw7j?0MCPsCR*e;{kMFFQ zlbg*pJ8;cjH#Fe_)z%ixf{P* zvLA8yy7@u8Y$ZN5c-rOa9LRlI5?!UY_+)~g@hMp2z!e8Cu<9^`as#aO->j-!@m@AO z2RiqkY0XGhyf%Oa&kqu$cZ1_EmTs@U3txn;j@U1i{1bEV#e_b2A`g)d=u5%$Ak)Nk z6*?{7|LLHeCLajxyj7aP{l(B$$(qDY-E`1^H^+>x|J2$FRxECqMJ|W{7)90xO1SIg z#V!I4P%IJQp=yUd^O&HI?W0PXamz0A5-^z_6e^wKhLKT{(>3MXRBjyX@mw!V@3U|qTJ*;fytGc$>HnIBJp#u93@LCe^WfqPz; zVn53maQ)f0x5~QxWpBLg7~-7@x7XPqzlIqLlHx6|1gYLB&-mYDCZMY9#V4hd%(Nx%4S8wHz5-Jhndv{H4qt9ONeZ*4n$lyr_=*B=g$?H3e#7ZPfEXKnSyEt@S zNmT@3Sak=QGLccw1X3eP3IBk$fA&4U8dnEaz_>y8S+29jyz2|(TBxocw-suA-fSOD zxE)^|7=QWMtC-d7mGkpGOU4g}`FY;jv5It`QFFSlAa+D@H|p|nc_e&twGMJvTOi(9 zeM4P(XaC$N6ms*|9m3d=G`fM42+F$~X#sl*^nX-jdl#^z08tH}GY zyz!<)(pPJ;6#iy6xAB=mji@y2#7Uz7?Fic>@_ow8*pduToPc>3^x)Sdrnh&pViA=abQu1mj{N;?wydAae}n z2l)l5?bQ5wbfG7|!V*_Qnb3Cpa=99Mv^>61P{s-c_{3r4nJPHfn62NO;#Tq{VJVRN zQKL(cEQAZO?#fJvWZ*1=blG8Z8wO!s#^oErWIP=^QiSmHsl8gcM^=HxD`l}C%$E=< z#}DC!xsGF+>@mn7hk9Hqp9l)kJ%Xs0~dloCM7w1avq!l_^9iTx3^l*L;?HL*nA~gjbIngntDQvtAxx} zlw@V)VF<=W7GcW<1eEhbgfjVRKD58jhc|xezB%Q{lDX{dI=UqBRREp7CigdMV!3?F z?Pdxuhpt>F^*e*j6vzIP>VP4Xd%*AEN%!Z0^KfjKP);{idNa0H14YI5o!mO%KSRC| zS``c90%u;&WtBf(LMsAyN)_$i)nJEqH7jM{icaFYoGkXxnuu!D2AruOO=A4IXHOjX zPDiO7kkfY&$0{zhk^)h8L5#ZGd3v`pkovGGM;_V#CuMFXe0@N2z;z~Ch|3t_O6Pov zk_Mb|;nK=HZg@TW9y|1I29XU14OgMe5U6?ph#Zbg5kXDp0OW9vP;eqp;Ct3XNp%t3 zY|g7FDeOEVfBFFZ6_)IyW>YmloX zM^Q3*adADu7Q0l08zF`t{feVWX5L;F1^6(7jSn4!OaE1YO6({;KV>F#Ixl);Ksm|C z!chL^FiUtChl7^i)ys0NR<$vIWM7$Er`@<%y>3k0%=~wgnM2b3MnjYsIwN=E*Z2BI z-`+h&nEW1SYBomSfe+jTQRXIQ%Zf*n6c4^)EQ6rc?TTl|Sl)T!o>y+sB&r6 zmoWaryF=w0UpfYU0Z4Gp`|v38vud9D@SZ*RETOD>paJgN(SymDY;bwT7)_my}B8*NFX3HT&N=a0?_nSF_6j$2^D)0JBi6B_Z zm>^rJgp{VZuwf1T2kAKqCjy5OdIaJPjy~pcgm)%;1OUYVa0;c11J4skr<6W1{s2=bV)sa)z$-o_Om>?LK+jNqp2(It?~H~P0d>0 z6%G@Jd^2J>=Ic$@R>a_e*)WG4*1S|K*CFm`a3kxy(9<}5Xw7K#HofcYeAU6zcLTHN zwVg4MzFv0Th3cFljFf9f>nly{=U{3XQZ7leUg5^GyB2$oj@#-dkDw<^4@Wo1u3)<= z9KUY-e7D+yHY^%Btb_ms1^jKOXN6kX;)L;i$?(u?irFMbg-|nL)`+hWVlQKw2E#UB zSPBH>1gA!D_Bn`XW%kgs_~1)rk>lDU8Fe@@Ju_g&t6KG>D1=Ns5Gn%&8KvcFkBvzm z7rOVde0#6w|EQA9`*9t}!jI&qEA^N=Sj99INZOslti3zI+R+|rJ<8Z!pD+;GYb~r6 z6wxk*XrfGq+DVVUObk59XWZl%Jvm|@)UCBzJ!q`y%n%ZWMs}m|&qEfnV3KV=LD zVQ`x;M2-<@S+bEB(EnP!WZXqhaXKVA5iyIrJD?iVjVz%V5DHBd1PueXD;gbit6Ixl zA*+K@9TBKn6^?_#3L~>s5*!MH^Hq+B!#oM)z3)*VxdvtULck0YKbT3RiIq|ldm9-+ zgJw(=&$K8{<2`>x<$3pRgtzxFv4ub(7Cok-$%-m!$3)5^; z7=C^nOdRd&sxVmGP;QgKOr2s>w+44dOigx>(Nold6;C=I=o-E?jEtI1Sf-bwwD(XKFi>45W1TL{`#i;;?~uc>+z(eVmk#QVs$;guULU*dtMn;fkqpL|EvaRBdpW+JM~8sr76aG{;zYHbgJ@Gd`H% zaK0-=L8wbm1|7MCqF#w*ojQ9F6cLsMs0elktLF9`HJL5ZFI7eSGP_z|`_vFg>jQvP zxk1#xiE3f_3AWv_qkQDXAWP2NZ7roAUg*vXC364DJa6oA#o!>Qa+z{Y$w(31C&*OcSM~X@=wQ2sXoE2|0k=}v`d=fT`BWVFoPnONW zu!o*-8OkpV{gc(V`Ep1DjUcDnEwz}@A|eM0ylDcL>_)e&QnPRAu1i^r(PlW1irSKk z{YHR_o+VybM!cTDwK6=2iN@NQ35qbN`@$z#%b=5jIxrzS6z=NlM_Eza?(bY*9QDW& z+wG5YSj3{0NZs~VN0W44uDo5dc&qK+iJ}kK0|Lw9qY_D7#FAQW&N`W&y5C9rcz)}) z+o4@mo3BxLI&gm1#57}fl5cuA#P5cCe)H!>LhH}=)0J6PmcI8`1CP*a56?2W*zVUG zC!xg#E}@mQ;fL1VCj=>Qf1gF8i@eLZp;h%kRa@bgV@-LbJOFY`&v473JXf$!deq99^MGIh>~ zVeu3Cg_awNIGmBMa)wj^p%&DRfu@{c(mna6-Hg$y8klIz4B}KljP<#a;XNo2QeAw{ z?I;@A&4ezV9BR&{i2JlSded&ASnA_MQ|Lry{{vsi5sM<8_Yb6#@fOZY;9&AbMq9-_ zl?PhDhp&}p((I`p*GGcv1Kz7Ir&|;1Uf(@&?TwDH2nlvJ!|CqK3jlb}+Af8zOBB8D zdPy^rlX>}o??Cd>C0A22366e)rD%9%B%JbHS3fLN0yA6^3}+upUpU@>Y3ZZNhN-(h z?dau;?_->%z&*i`qiBPMN60rcO(`PK2H`bg_)kl}-TlJkpd{znVED6PELmZY$qc2N zE!oti!-97Ub{C3Vp*SH@|kRK!nLtNvV^7|Y3Pye+K9M~{)mq|p^#nmTog z#LJG?iy9$UzqBuAE3sP?*w^bQBs`AY8(=-uCLW>&BYXJp`v8%A3P%bq#dxtnzh8-0me9`_a|G0q*(HgdFIx-#g@jL9CdT}6LVf7Rl4VU?&@A@v)Om+|tJ{2`~ zayN1vbK=LSTfB=Ua7OZF(`RT33^1C#A0_b!6hU*yUgZyNy@e*box^Q^@4=R)6VIie zvOvr%@0-QCG5(|Sy0HkhZ_&|f4udN|u4xn$R!n{|B9RKe;!zki#S#UbFK0E2m`!8T zonaSp3Gt3K?OueX7^7j@qh6@?Kf9hLlr%plV#z&rDL72`-se+mvFKC+%9S zO;tiH1^vU*V}t{;pMG-**qga#M>;9FVZHlvCyt2cWxV^fDJuQRwrREIy%fTy!DK>h zLW}w4*c#}s&vUWfr;fA$uX|YzKlNq`C`Sp-$4Fs!kqrSYF$Ao%!>g`pEQTjMA>l2n zmq`z>$_Y<9Tl?kX<*3Luobe9ih{uauL2Z`I`%h|detGTGdm;?_%Et1-#S&dLDmi3X zhW4Lch0GEJ*?MAB<}|EO;KKS^?aA*-j^e1$nn>@Ew<7WDZw|{o?;qi|JnsjHAi<1? zQAmj^MkXT1#eHL)y^w&K>vUto&xikMnExJkS$4tfhardYMKGM_yc8QSL(mq*3HToS zQy$xULaIipq-f?$I`tnb2sEajLXbi7w|5_#Gn$0IY$tlS4bECC2HW{+O~Q?4=cn+2 zMk&biY-hiZNk+oQQH{a2?Rl-t`f~Dd<_qC1%Py0FK9!lBJNHNreP-+v(O}TiBaqsA z%%9_6V-6RBG5&x!SirQBlQ@?YkSnnei~l>ej)xd1^f(aW-M&(P zX-UWpR^SRU)DTsd2sBZ)@~GbH;7!m4s%DePz;weF2L~y$#8XijNl5#@m!6xcjWn6i z8eO|S>96^e5r+%q94@X5#SgQOz-Uf$jU%IHNg638j{#HuNh6tmDcUv^28bE;jl>qC zn4PO8@$O!s+ad0OhL8(;FW1|;Jj3{orwT;=r9TbdX zCZ6&XDCe`G0kcC1{2sO^zmF?*R&i^f&z^@166hm{X!Jfd(}NnRoSZ6HiD9MuJxrxD zFuwD(62FT;#2usd>;A;kI!icZb{g~p1h z*Kfn$h`Cf!QX3&<1Mug$Fs4vR8+~-?{tK>4hcm*3(7(Dhi)aT}Q_hxK< zp#p`tgdOc~p5ASa`2HmQR(bzZqw_3pKI+BOW_hfWPnX2U!DzSA<+-)=66hQ7F;`1I zg%{Y}9=Wkey!J3vlcwH(_QlEL@mEESquG_$*cVCit+5tWbMs15WoFqL_~fEQRzFDa zvIvDld!}3AO6`@z1gH>PtuAG_$!5FQlaBg*rII1FL=?cqQ1+qb#%xXBYm;HpsJ>r$ zvC8TLI1{muda|LJN=Z|(_3ShC2Z1XopyB>@wNfo(Jpvw_60Eo+t))yDZPb+2t%T?NoiH;M9U<_dUmjOwPuf20oc5XK|VrSRGNOwbjL_y z=u0V~DT|R+ubo%0karnD?jlgaI~eDTfL<7wMZ_^cl8hxHlO9E^qYHc&O_E{3=yM)& zKX{|j-m>n$)Vg}TJKyRMYAC6a!!WfKN&TbCsa0)_f2f&-e0}H5ndK?` z1qUrwo~QY!0qei4rZUz>>>eh%C8gfy}SXF3W>m?@-hSdZIfXYzir#3>AJWxJi zTzahwuX?upk8v!9K_dkhIM7LtYrzx%OMy6W30I_wOa16nF@4 zb{+|DQe4=Ppn?+PD2okJ^j5#p`v2VW+3Imb;F~KaEB5FW{F#zM5GNT;qSxv3{1LA9 z16vNX?bquPH}SH53JV4lPd~WqNvnwje8QwE?+(vD!(Kc1gi?$a6I}`jE6`A|`D;vI z(rM|GM~rw3y-7Xs{TnLnJrW=5j^$aPBJRfV_-5%4={7M+>ta(w)bp6fU& z*JZp4*oRp`A)xEQc@evH*>s_WItp|ARL^U>JI)6Y++7QsiswFg@?An>Z*Q2WL3Bzp z&GjS(1cSklurK*b13j2G{dX1m?+k24{~q!656g!;ygfj0IUTd?6YB5RDbiLu^TXf} zVf#zH)A7^S>+sh)^_T0wiZ#tY?Y#!RHvGb$n?H)Pb0DK(PpW3miA9tC^<1w8O^gSKQGIZHE)j^Ep+ zMB_1h=3$itx)2^&Lb<_^?Pez)62`&IG3SpVYuTP6u1@WtMT!C&(*=!#!4{*C6M`cb z!;1(m=`(EUt1>Lgj@Xb;M(umZij~E*rorHfoT;jhOM^eoNb%}0lvNSI)>Nr%srLD@ zw6YRwYk~gw?m&t2yzVIz|u-@$R-%HyJz_4{F6<;j5(uHBaNIYZ4b;AS}UpLP2nfsU|CF*(ljQ9L0 z%BE9ge?KisOo+r)qolp)%9?(Iu|8+FclHqc&}27Owu5e1?X(l@Q=HPVh&&KpYtj>YxOx)XMW|rw~6adg6&*vs%GFw zn@I%tm!-yxfI#Iho^oFMwQ$#Tj)xO#wk&h;x+UD<%nREo#5)-?R=N>GG#TyGg~Eo$ zXWdgEtkS?>9S5FQ`%iz&5u!McfjPk_hhec_l@NlX0`iJIJ-T0(wnN#~pnNLKGI?5J zy>aPklRYlbiE78$38h{ll@azM&W6``Z8q7+BqD?UagGjh+F_Iw|D}A; zVKws3cYT{-g*bmGjIcbMsjr!z5Y#>>)nf#9t2Lq@aLv5ZiUkmqJ1AsSu7#-^cZbB? zjTk-Tbl>sIcdE4zDa2ddU#Qj2;l1*Ur9BJ^0Pf~(&*18+W_oOv8)L1x)3g$qM(wYe z&d)V5ZR{lSP^nT4OEh)$^P>h%TLDin1L4grxqPe zN>29W(`TT%kX3EOyHJoYZBl%TcnDU~;!HW+mJVbkWkMDzu3Xr-*84K)-7(IK1?pw` z)Pv~7lif;aO)S_fKc~p(b?*GQ6I-#FJqeFWhr@nsZv8RwF$9R4G^(&f;xhT{7+tVJ@q~#f+C7T@C zqTSj#T^xP`S}*RVb&TPI;3*8HT{#YLnA|~JYK|X$n+O=#OEFX0NCx}uQ@qe{>D=#! z4jVYw&6HU$&h3>cXb;78qRi&7;c85$)ldlTE?GTaj2FI(&W z8#y=k?(nx=ee?cJ0z^bk|M+%r}cNg#E zg2dqmEDOoKSm^=_ErHrp=|D=bI`dIc&Dw|3-CvBN)6-9VCOe=BPzei;$^Z_lf1hQD zM4Z-`7A>tP9C|Js7b2DatsG8DY~6<=?G^}R9x5hzMn{a2axeYpSo3Cdykol&0fB@e zl33uA@8R2AY)$yad^xfar~rHHia=7UsNZ~k95rg7cYS?X`OqcVaTiyjhdzL@kd0Ih zg_a+jISc&Z@v^_(LhLAUBDfh^x8VG_#u5WtaVfYvmmCo>N4h}6Gi>r#kISmDO~DlT zs1hty&__%05{ssju-|}UvMQ*Ua^iX&$Dg8^)l^KH4N%`Gpue0axc3OKrqdh1q6Ww` z;E`2KuD2A3rRZqtf4*C@Ux?t0Q74-d%(rJ9sx{F1;HSy%Z)OrP!4KM3l7YD#zCZ8FOES34iMrr%pd=V$li|}F>->z|Ek*S9zke!=rs6L`HESCe#&w?Xj5^URzWn$5IrWF&(CEx ziZ8ey)iew-7Bk&n6Kk27Kquhp%p zTOa2o8n{DGD>`m(v!{pC;OEYXyNn8h*9&=`ms7s@+uuvI6kV5Mk_goSE2j=3Wh1KuaWM<$b%`S-NhYkLf|nGwa2 zzCTUc{qyiGA5p6CgS;Ffzh*$@Yw9prZWj+2G&C7#srF0;m&z+eOg4i7!^QIsgi{;? z*Tx2wZqZtM$*jUy3Vjq-pnmU=F_5?%7*=fWLO)O{ppS@;WR{&OSamQqHo#-&zBqCh zU`=x3xmo$;NM0tE-8TOK*B*`5{O!_MlXl&Q{FUx74vIKpH359QdC$MPh=Q5ZExrU9kFQk zm=4YKsgb%MXXuC?KP(6mHmmdpXPg1uVx{+ZuonBMb|2{yA!M;hZ>tfHzMgZ+PaSyu z3vqjLNHoXGi5|NfGS-y}ozSLESI**rxU+MFaN(i1vqNY>bTa1Bsy~}tSp}J{PGM9M z77_1WV$AI<^N{gHOVfCn1f2JUi(1;{?DB)#SIr>D7w!7u)Lj@M1I9u!YgyG z&5tfZP+WTj^c^pjAB#G424`RwIAHz5ce-zWO$sZ%tkX`Jt=8U{jYr`{dH->} zB@(u3_q;g$97RZ@eM;?f{B3L|*_X(pzYVQ?_5dMyq@kL=XFt-yO3X;ALMOKOkTa|- zY3U+6MuLLepjic;g<~>d^ z%vuZodbKFFirP(MSZG-5L$xYU$N5!k(Qn%(-Me3AxvJ7vCvSCY&-R1wxWK$?OU-2t zqTyxXZfZiq+TCa%JT+{&2z1Zpbrlik+h4H@lgCbs^sp~+vNg_^es=>yh1)j*W?A0+ zqDf`#E)T_#n!>^vnJnEtucUG_$NV?w6Q{AeE*z8a@GHG39yrhpz zWH^W)0)x|6;v~*Ukb?-=>-ZM0yTZ|%=On6R1WpHEHZ~%AW*LYZcQpY5tZ-$mam64N z+@$k~kSCSL*ZZL?;pbKKrz(!I`?-Zn-!F8n8ZATwsa9Y6UGTyyW|U}Jr=Q;E^}hZw zG3{TyVn5_v|H;;eP_ndFC?-lrRHMC9KM5OKe8CyNH0iqeCV74cZN|f6nbG~JK z0=N6>`soz$rkg`SV4dZMQ~#k_!w&6Bt*kmmC@SEHEJu&*JA_X_!-JMe=cKv1crRmC zQxk=}1*78g;Y3W6g7iBVnKG*{ ztXx<yQ&C8CTS$yg${m-1_#EZ^BW-=_md^iMJKpWMTn zMzc%gKcY<(zCWq>y2mS5vPSUB{1$S{QYy0Sr!Y}`0t|l;RX7Y)F@0A!(iYxP@&7o$nUpx#m~w+Kok62 z?fP{<93>=Kyi{!Z9R7r(4xnPHsL8}yo#_JX8h(WiQ2)?k8Z5fS{>~R&{u+bYvnf|I z^~H(xz~2{vmr;IBr40@UY*C1=$$Wd@NI+QxWYazy&%~fDHfwe&yVYSr>))6sBiN;Q zP7C!;T=ALDxuqSXA+Ta_@&cU+GZwZtcG8~1>0GPaW-Ms>^xOV;Ozf5q?dF z=bz3_IiT)BfM-*7eQlU{(l)CRpAiz(W5#;gp}q0G)Zvg_d)_w4qCNiwi#Wjz(0tnS z&4jJ?iPz!E6ne17J68mUen7sxz8y z{2SfsOr=Ql{B|zXOLkW1apcFGdFI~hlc|~fu$SwyA?MsA(NEmhp+Dz|2T!I(erg_j zze+!LiNa&Bo-Jhx{b-UxIOfubTJ_m`Qezu_ZejfIcqcfjLlYP8`VXAS%{xQ zl2JP)G?V>>8tH75(!4MEi&*yqg)+sSQjCYv{#q`qlD+i$YG4T9n19fEkw{){!B$e} zw&14fsb^yCsTcY?0E=485|s0yZ1JvCmJnS~FTjtjZ8LX!DiZ$nVOsttGSe>&ePRRe z>-E>C_!16pjBG4DPaCgWJpuyg?~Jb(o&(fFMM7N9yF5ij3JKAxNuPrZe8$(;Uc9LX zkzi?fduhUC#`&9npMO>phg0+PT^s7ut4CGJ*aZORH$kZlfu-8V=-zY7@@>P z|DQoYmkYJK8Acyi!dUM7MM z&272Abp7G9Ok{O$KMw3sZ}T$lu?eD+J75m;61z0emh?BNt|sW z7#Dcv`ufW6LzT`Or#37Jm$_V&>P7+&T1wcVsHwy2NMKhBd!SkL!P9Yfk|86H;r|qi z!Cs5CG&~1@jVMPB&OQ8LTvR!5oGmhupk#?jhfbH^Yrb6dEHEIB`$?p2>tNA!#i@$t z^rt|a@;kWTT8rEeQ~5&m9NIDRI(e(XR&2?;0KpYKnyPmemRK86%NLR)t#&>>E2A&8 zE7z}kHVY3`Fpr&KKe;&BNklDjN1g7%+8>^BCf^}AeZeRaf&IpZm;@wk_D|BW8?W?T znb?-|IWs=dz4Ami6=;&?S^oo!B$B1d#?V!baCPS~w_}I(!(gK>rCw*im1uxa(GTq* z22&ub*1{yTw+mp#e74Km2FU?0pF6xSgng`LMW+QMg|FkS6tl)&wtEjsO1y3*P_v}H z`-=CEMQgxf&qZsV51r3b=gURE{Gnc^qZyxmc}nVxp7XqNSj-%kOfPnrX_u-05Pqyv z6W44KO3C<>)-==cRPa-lnYe93ey8uSd4+kpZ*26tao*%z$iPsT4&ScNQQxHSz3;r= zl@-sNV!CqsTYGLmtsATXXG`6Vk z#(D1raH-{o&tkuE5e*D4ZoO3Cm07qfM?R#Pu|OswLp^{cPfNtCj4uggQ~a3gY~0sF z=ks9#l&tp$g52+38s!sM?Q}JAyvn?<~Zk|{Le@R@M4Bm za)=XOWo}n=b|aKRc&FN|*0Yk)w7_Us0OL3hD!t8I&3ffz4j4_=2yse^04KrN+*2t| z%cPZHBB8w8yg&kHY-FOqwjQ>m+*z;LTTN(jvf;k2nYt6>cpsPUDubl@y6pVRNU%qX z`Plug4=K)ds`tx5zjefoaGbOBbO@i568b5VX^}(LV-Eb;O4eic8ZWEopI}?tM&6p} zxV}+hTOpTmU8e8kT{}_Ok^KuGrw6yAd`wflbaB2|PP51oyxRW6w`b$7{O)wwebmim zeIdBZ`K%58ZaMMjXe~cef+&QR$4JUbE3EtTQB*(Nc6ignNlL9sU1QSA#Kvt6|L&W6 z>gzRXoVL;!*qR*irY67RUF4aOGSFOEby``8=RW=+yMbhR<|}gcYHeAm%cCiCZ&&zH zPBk(A65m(RgTG>W&+LQ;m#&z;|0{sWL$@`FKXB|~$@xZSEk*dMjmWEm*L69&)C@#_ zHj1ux*e>ytZ!a}NLn$sWhag7<0O|CniK$TKf*m{u`U@ABAVG@8S+z^Ceqy1)qM z;G>aRebrgVXdU9K=XJ@>UPXv*6R%9bs42zvG0&LWqgAnUC+=-|LTHjq@tt+PJ#%*( zoJRQn09HV$zf-2pD+g>RY+m#Or-$BONagWR#SZLT8PP!Ce`;Z1^Rxb(? zI7`-tAVj3X2nsEO#y0psL~4A9>d=6!fIybfECj)8;W$#N87RnWk`-kr6$PPG1l7RC zdv6kgfCP}9)TlxLkP?F^FvHQW|M6+IV57{7mCZ>5;j@eN60Jf+1R`Wjl+^z4&r8%T z4H&3?_z$ND!BG%Z-~YnT*+PH!nI@G5`5*`YJ^Dz+MVsf*NJ}-%Za_g0hYA)&zxTUs zOR1qUXz*}K7G&WFS@z$5`{3@2&FH9M(#a{m_ep=&TA2vShGNz-KpbfRt1iROsfPwg zK~xi(XWq$;jisDsr4X&Fzh=<4sr>$;C4orjW=~{$uUfcgVeawyidzh|5DXXdE6wR- z&P!Z2o6SidE`op6@T!wEe`t#C5-lJgXOINsbVf$?;v07VgLAKY^~CkBoB$#szV6!m zsb^*dutcP$_Xew{G(JH9LcsA;m9x`q*;Rh`RvHi}%WR;cjb+$ZP+WD$Osrb;WHM$D zR*^62S%!9E0PJ#-ZV;FONJi=%G$GgsHW?3>lm$8~Wl>3VadGn)?F`>Iu`oBQSsR&Z4tOF9P03wl)}HV8 z{f&`UXuK?1w=#VDd&i~w$n@|p?^t!q$1lFKk&L{%yLzKc&&9Jlxy%Nh-7A+@V|6_~TP+V76qUa!m{%<58Xhl!po+MlX5R(#2fM!x@;!0>xQc_o` zk)C)QeR>ZAj!58u*eDYf9=W%g3q@ADjj;PxwKj$UUzIwXBX`1l`^{sW7C7rbXHDq5S=*{L~0_YTwKh(FV#pNAG^Hw zrT*ATd(ZhL;eR!lihAA%s|h0(y5$=)-}8qGJ(^JVSZi)m65lmFy>jT)KPdL)=#GNd zQq-dSpwhe&(+acVE#=8Cup9}z-d=u#KD94_)M&+h?dYa_&pT!8{>Qd7e>!O{%&s4_ z+ujpB8V^4*Jhc5}s)m?Nh+#V7h(HL2#jsJP;Mp4T1$w@6g=l1rloY3)v{9Cx>5P;~ zt%Y+?(u_F<$7Bm*g7;*X>>+?vafU4;E}4U&BqBH>t7LR(ZlFR^5WH%s&S>;HAyT3j%6Fi@qqfHxf=Zb5OOxt2lCNMm#vho@Jr z%F-btK2uOtOI-paBbeAAQOa83TSrc}aH6Ee9AOIjayxTLIsGVM3M|m$2z8Z}#Fvn? zFtBgrXIiZvxcp&HHC+5Q${NwBJywnwh;QJXXjF=3_IKv~(E#xg930tVAo;hSmXu`md(t5ZNYShbv zUj@8kWAtMU!)gA_Q>4cPGl~(_YKA1w1YF^GCg3!YmF(M#Vf!lStP8qHiwBzB2TBvv ziiMUs1CEs<;(%1CAYE#uczIFvq2F55Y~hoCzo42yef5%i*(;L!?rlL4hz#|AU}Jgv z4glO34m~Z5r3fHA`f#&7nGMv-#l^guBiB-Hwv{QL&g|)_;=Jv4dZuV+l-AtjRA|(^ zp>XJM`{cwwMJ`dT2D;IPaWb#ubKc^_9A9-FH;FtVS2(G zXs?aea@iu)fD=f!($UwLRM5)8Jm$TIKoArWl@w^i&I%k*3pyWQ3Y0C#Nu;Zjw_hTi z`R1*AuobIruq!W+Z+=d~a}fqCMmD1{a#i={Y~T zGXDNut)jKGzGncGlS_~#B&8)bNF9b9q2R#Ub0|WEw4_j|DJ6&?NFP>KA=a0)NIgMP z1x3ttX&_Euhqz`$#CH{<8dFtmqGy@!6X4FE^3a0-qpXyW#*#_I#2ooRlqftX^vWm$ zfY?E@{`;!3S+SnILjn`(@zTX+XhPyBXiUun(rQ7|iaDY{FRzOj6p?)mk6x}DHx?(J zV!KU(ljMSt%hUV?qYuqk@k;%Zqe4VM>FLs+XK5jj1r_L?Tt7SGGQRits-wj*p-d1* zVJ>LME9x7fgc=>0)}F?nh|Y9i=j}+w$J4cIj>mlQMm%BvQ-t?V~eFr3eIrd!H@>IVGHUVH&0ZDV70!iQqt$HJJngcxVX?x}=pm za|0br9nuAaz$w8QEO?aa3$%dJfH#n?B>YF$yk=l#4Wa_cOi%6~JZzJ%3boCXbGK~a zE3QUu@6JmWAG*heXKTn~*c7tH@%LJ$maWMf`g4UneL9+aa)C}Z7Y>Zx@ze2+Sv3O? zQDv&s0q~083A}rE?Z}DZvWtiJKC`&tytLLZ-BY}Mi<2TBS!L=;dhE2ugUS4J3#-P% z#{R|K_{@DK+3)8UoRVqp53P+wwC&X&v(;=ORt?y*tb7RYg(3iYO*Lx z`^B3V)F>>8 zcBi#Na0`BZK_}+a)}7wEA?zUfz!7}-bauS#`je;5`S-Eml?!<=&riSMbFC4Cg{q->E<10_4S4DJa1`#S@v${mZ!b7VTg-{U~ zVS!kI-~GL3U-t6k{vULg^{KY6_9vo*wZi4nGF1uyRvq!6cC3ZaqM!r;5d#69P=m9)>YATZpXvbZAXS2)=%{#uG2(ZPK5 zmkNK{_}dC?>gqSoH8##Z`pFw>&y7aOMwIe^^42M_U0J;C^4F)1K3zeKGg66t3YN%Z-`6()oD4_P-fc3*y5BRxAzIB*! zg7gK*bO?zCl3wSg1P!Fe5bQl2`Pgr~@%;182d=BIz#seg-+t~PS5JTTbg@(Oe`RV0 zt(EAi!Vp)_JccnC1uT$PPOas)3(KDzJ&lEM-<+~6Qotf&vI-^XESXc5yU3ROETMYc zF-nHU)R!bEH9Zx5Nt}W4D1jIz@}X%FLN(=&9Ljoov7#xlHu@VQRwRKGFkiS2VZ@Wu>@~zX)P4BvUdjFe$;+{vR zM1q7;f-(eAq{dL$0aR@e$rWRyHIl*@1q6vJ197v)-Tj@L9)X?^v?0Pk ze=bt_ZbYFSs4W3w%=f?l{X>Tim1Vhg>(-SM<4&H+Ti>DNoyo{w6pJ@&I8^FMCT3L! zQ-TPq3|$R8u2_62Ld=V1ILj{;-gx8C^fd0jHv{_W4R30$>}FxP@o`CBSbbZpMMTb_ ztauo?QKL{L-)mS2AWyd1t0{bt;Fy3KI0gbjd&xhiFSR4rv!2HUs)1t-t-d3Z9FV3y zNUc+S^Wq6IM!Z*~)6=5}Kpy(k;?YaT$8SG*-ot!-<`-`C|NCLi_vz~Gm%s1)BM&D2 z-n*J(OLZ1cD=HpAuEerQKgbBF(pR3sgW+o8pI%i zu?RJYb8M^&CMH-4fH$18#>x?>@@R3jZhq0b%K#BkrmP&J5vdR@WUP4=asYs-B5*7X z&@0DEAA60;;A}%}Ty3pb{jy@^Wzp0l$us|A7N1|jkQqqv3peGf*401!SClJ!2bwL@ z@1M0ot}YmXlnM2idm0qAKgM|TB~zd#866U zLd{lr&)qFLE1XXm>PQ(rz-8(@O2B|A^i9p&LoU0Xqen7uTuqz}Okil)?HL;WfBaD} zah=$zZ&LqG8lYx_akSWSQX`Zg6$?F}lBoe45GhKi@uWwZt?k1b2PrJr#xtF-wt;sv z=%zLAI-U>hdG^*9boHXPntDV*v#_s*8&AgOx*}B1&#etat*OJ&>2C3n<17Ad;@j`~ ziK*!muUybbO|QfzQDjsCp$2C)9-^WmKB)l23zAZo(~vJ((&{m;Es1N4x+~j-F)%LX zyhfUVN<|197=eNXEcu!#2ID;VZZ;5=K1B{TLR6@gI7Z!R zSE$=n6n*CInO(=3qf!|fd(xSzs*Hfp*Y*JH%2iil;u3e{Tjt46prR#Sv#a&vZ&K@` z5533z(ci(he&lbFsLwO74KXniQN$(xHW5d&M-Z&v<^ zjJzk%5MgbdUhQ!h;l3aBIeUhVGfSpwC#co8d1}(nOw0PUgM%Z{K!X}}w|5sG6>tdY

+vcvt@I% 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%0DuAIIyEIy^a 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�f1~r5>A;2EDS>$r56R&tPv!b63#0ubKj>Rrm^^XN(5+$9IQ|oG5}{m zALr0uvKNpI+i8LWNFbxrD1co@wpJo*kWZXaM#v%8bbmjf!i�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

eOflU;u1`UShv)}a90VqBj&^SA? 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 Date: Sat, 29 Jun 2024 21:31:29 +0100 Subject: [PATCH 34/43] Avoid deprecated API --- internal/ui/settings_ui.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/ui/settings_ui.go b/internal/ui/settings_ui.go index 330c242e..452ec7db 100644 --- a/internal/ui/settings_ui.go +++ b/internal/ui/settings_ui.go @@ -12,6 +12,9 @@ import ( "strconv" "strings" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/cmd/fyne_settings/settings" @@ -457,7 +460,7 @@ func (d *settingsUI) loadThemeScreen() fyne.CanvasObject { p.Refresh() l := inner.Objects[0].(*widget.RichText) - title := strings.Title(themeList[id]) + title := cases.Title(language.Make("en")).String(themeList[id]) l.ParseMarkdown(fmt.Sprintf("## %s\n\nDescription...", title)) }) } From ac5eb02fc5c5028657706df4db6acef9725d1035 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 5 Aug 2024 21:31:05 +0100 Subject: [PATCH 35/43] Fix issue of icons overlapping or clipping titlebar when shorter than min --- internal/x11/win/frame.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/internal/x11/win/frame.go b/internal/x11/win/frame.go index bad9e9a1..e10f5fb1 100644 --- a/internal/x11/win/frame.go +++ b/internal/x11/win/frame.go @@ -286,7 +286,14 @@ func (f *frame) copyDecorationPixels(width, height, xoff, yoff uint32, img image func (f *frame) createPixmaps(depth byte) error { heightPix := x11.TitleHeight(x11.XWin(f.client)) rightWidthPix := f.topRightPixelWidth() - f.borderTopWidth = f.width - rightWidthPix + drawPix := f.width + if f.canvas != nil { + minPix := uint16(f.canvas.Content().MinSize().Width * f.canvas.Scale()) + if drawPix < minPix { + drawPix = minPix + } + } + f.borderTopWidth = drawPix - rightWidthPix pid, err := xproto.NewPixmapId(f.client.wm.Conn()) if err != nil { @@ -385,15 +392,17 @@ func (f *frame) drawDecoration(pidTop xproto.Pixmap, drawTop xproto.Gcontext, pi rightWidthPix := f.topRightPixelWidth() minWidth := f.canvas.Content().MinSize().Width winPixWidth := f.borderTopWidth + rightWidthPix - f.canvas.Resize(fyne.NewSize(float32(winPixWidth)/scale, wmTheme.TitleHeight)) - widthPix := uint16(minWidth*f.canvas.Scale()) - rightWidthPix + winPtWidth := float32(winPixWidth) / scale + drawWidth := fyne.Max(minWidth, winPtWidth) + f.canvas.Resize(fyne.NewSize(drawWidth, wmTheme.TitleHeight)) + widthPix := uint16(drawWidth*f.canvas.Scale()) - rightWidthPix img := f.canvas.Capture() - // Draw in pixel rows so we don't overflow count usable by PutImageChecked + // Draw in pixel rows, so we don't overflow count usable by PutImageChecked for i := uint16(0); i < heightPix; i++ { f.copyDecorationPixels(uint32(widthPix), 1, 0, uint32(i), img, pidTop, drawTop, depth) } - f.copyDecorationPixels(uint32(rightWidthPix), uint32(heightPix), uint32(winPixWidth-rightWidthPix), 0, img, pidTopRight, drawTopRight, depth) + f.copyDecorationPixels(uint32(rightWidthPix), uint32(heightPix), uint32(uint16(img.Bounds().Dx())-rightWidthPix), 0, img, pidTopRight, drawTopRight, depth) } func (f *frame) freePixmaps() { @@ -575,6 +584,10 @@ func (f *frame) mouseMotion(x, y int16) { relX := x - f.x relY := y - f.y + if uint16(relX) > f.width-f.topRightPixelWidth() { + relX = int16(f.canvas.Content().Size().Width*f.canvas.Scale()) - (int16(f.width) - relX) + } + refresh := false obj := wm.FindObjectAtPixelPositionMatching(int(relX), int(relY), f.canvas, func(obj fyne.CanvasObject) bool { @@ -669,7 +682,12 @@ func (f *frame) mousePress(x, y int16, b xproto.Button) { relX := x - f.x relY := y - f.y - obj := wm.FindObjectAtPixelPositionMatching(int(relX), int(relY), f.canvas, + + titlebarX := relX + if uint16(titlebarX) > f.width-f.topRightPixelWidth() { + titlebarX = int16(f.canvas.Content().Size().Width*f.canvas.Scale()) - (int16(f.width) - titlebarX) + } + obj := wm.FindObjectAtPixelPositionMatching(int(titlebarX), int(relY), f.canvas, func(obj fyne.CanvasObject) bool { _, ok := obj.(fyne.Tappable) return ok @@ -750,6 +768,10 @@ func (f *frame) mouseReleaseWaitForDoubleClick(relX int, relY int) { ctx, f.cancelFunc = context.WithDeadline(context.TODO(), time.Now().Add(time.Millisecond*300)) defer f.cancelFunc() + if uint16(relX) > f.width-f.topRightPixelWidth() { + relX = int(f.canvas.Content().Size().Width*f.canvas.Scale()) - (int(f.width) - relX) + } + <-ctx.Done() if f.clickCount == 2 { obj := wm.FindObjectAtPixelPositionMatching(relX, relY, f.canvas, From c81627a6ab2c1098169e482c19f4b1385c7da0f9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 5 Aug 2024 21:31:23 +0100 Subject: [PATCH 36/43] That's not a public method --- internal/ui/desk.go | 4 ++-- internal/ui/menu.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/ui/desk.go b/internal/ui/desk.go index 16ed19a4..31cb3b5c 100644 --- a/internal/ui/desk.go +++ b/internal/ui/desk.go @@ -359,7 +359,7 @@ func (l *desktop) registerShortcuts() { l.AddShortcut(fynedesk.NewShortcut("Calculator", fynedesk.KeyCalculator, 0), l.calculator) l.AddShortcut(fynedesk.NewShortcut("Lock screen", fyne.KeyL, fynedesk.UserModifier), - l.LockScreen) + l.lockScreen) } func (l *desktop) startXscreensaver() { @@ -427,7 +427,7 @@ func (l *desktop) calculator() { } } -func (l *desktop) LockScreen() { +func (l *desktop) lockScreen() { _, err := exec.LookPath("xscreensaver-command") if err != nil { fyne.LogError("xscreensaver-command not found", err) diff --git a/internal/ui/menu.go b/internal/ui/menu.go index 4def6584..f9b27bfe 100644 --- a/internal/ui/menu.go +++ b/internal/ui/menu.go @@ -111,7 +111,7 @@ func (w *widgetPanel) showAccountMenu(_ fyne.CanvasObject) { if !isEmbed { items1 = append(items1, &widget.Button{Icon: wmtheme.LockIcon, Importance: widget.LowImportance, OnTapped: func() { w2.Close() - w.desk.(*desktop).LockScreen() + w.desk.(*desktop).lockScreen() }}) if os.Getenv("FYNE_DESK_RUNNER") != "" { items1 = append(items1, &widget.Button{Icon: theme.ViewRefreshIcon(), Importance: widget.LowImportance, OnTapped: func() { From 88bc07bfaf11ed5f6e9be0298a405dabfb5e9935 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 5 Aug 2024 22:14:16 +0100 Subject: [PATCH 37/43] Fix possible nil crash --- internal/x11/win/frame.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/x11/win/frame.go b/internal/x11/win/frame.go index e10f5fb1..34729c65 100644 --- a/internal/x11/win/frame.go +++ b/internal/x11/win/frame.go @@ -584,7 +584,7 @@ func (f *frame) mouseMotion(x, y int16) { relX := x - f.x relY := y - f.y - if uint16(relX) > f.width-f.topRightPixelWidth() { + if uint16(relX) > f.width-f.topRightPixelWidth() && f.canvas != nil { relX = int16(f.canvas.Content().Size().Width*f.canvas.Scale()) - (int16(f.width) - relX) } From 7bb05ae9df0bc06a196f73911973ec9ec70e61a3 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 6 Aug 2024 12:25:01 +0100 Subject: [PATCH 38/43] Remove usage of an old API and fix possible nil crash --- internal/x11/win/frame.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/x11/win/frame.go b/internal/x11/win/frame.go index 34729c65..4643da72 100644 --- a/internal/x11/win/frame.go +++ b/internal/x11/win/frame.go @@ -9,17 +9,17 @@ import ( "math" "time" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/driver/desktop" - "fyne.io/fyne/v2/test" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/tools/playground" - "github.com/BurntSushi/xgb/xproto" "github.com/BurntSushi/xgbutil/ewmh" "github.com/BurntSushi/xgbutil/icccm" "github.com/BurntSushi/xgbutil/xwindow" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/driver/software" + "fyne.io/fyne/v2/test" + "fyne.io/fyne/v2/theme" + "fyshos.com/fynedesk" "fyshos.com/fynedesk/internal/x11" wmTheme "fyshos.com/fynedesk/theme" @@ -374,7 +374,7 @@ func (f *frame) drawDecoration(pidTop xproto.Pixmap, drawTop xproto.Gcontext, pi } if f.canvas == nil { - canvas := playground.NewSoftwareCanvas() + canvas := software.NewCanvas() canvas.SetPadded(false) canvas.SetContent(wm.NewBorder(f.client, f.client.Properties().Icon(), canMaximize)) @@ -684,7 +684,7 @@ func (f *frame) mousePress(x, y int16, b xproto.Button) { relY := y - f.y titlebarX := relX - if uint16(titlebarX) > f.width-f.topRightPixelWidth() { + if uint16(titlebarX) > f.width-f.topRightPixelWidth() && f.canvas != nil { titlebarX = int16(f.canvas.Content().Size().Width*f.canvas.Scale()) - (int16(f.width) - titlebarX) } obj := wm.FindObjectAtPixelPositionMatching(int(titlebarX), int(relY), f.canvas, From a854465694a43489dc35fd8f9b35c8732e2598e3 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 17 Aug 2024 09:53:52 +0100 Subject: [PATCH 39/43] More robust lookup for Linux wireless name --- modules/status/network.go | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/modules/status/network.go b/modules/status/network.go index 9f8e8f90..7019fc06 100644 --- a/modules/status/network.go +++ b/modules/status/network.go @@ -1,6 +1,7 @@ package status import ( + "errors" "log" "os" "os/exec" @@ -32,27 +33,20 @@ func (n *network) Destroy() { func (n *network) wirelessName() (string, error) { net := "" - iw, _ := exec.LookPath("iw") + iw, _ := exec.LookPath("iwconfig") if iw == "" { - iw, _ = exec.LookPath("/usr/sbin/iw") + iw, _ = exec.LookPath("/usr/sbin/iwconfig") } if iw != "" { - out, err := exec.Command("bash", []string{"-c", iw + " dev | grep Interface | cut -d \" \" -f2"}...).Output() + out, err := exec.Command("bash", []string{"-c", iw + " | grep ESSID | cut -d '\"' -f2"}...).Output() if err != nil { - log.Println("Error running iw", err) + log.Println("Error running iwconfig", err) return "", err } - dev := strings.TrimSpace(string(out)) - if dev == "" { - return "", nil + if strings.Contains(string(out), "ESSID") { + return "", errors.New("no network connected") } - - out, err = exec.Command("bash", []string{"-c", iw + " dev " + dev + " info | grep ssid | sed 's\\ssid\\\\g'"}...).Output() - if err != nil { - log.Println("Error running iw", err) - return "", err - } - net = string(out) + net = strings.TrimSpace(string(out)) } else { out, err := exec.Command("bash", []string{"-c", "/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | awk -F' SSID: ' '/ SSID: / {print $2}'"}...).Output() if err != nil { From abf646bad47f1b96a2f04e5487a7aad6d91f42a7 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 17 Aug 2024 10:08:07 +0100 Subject: [PATCH 40/43] Updating to get more bug fixes --- go.mod | 6 +++--- go.sum | 8 ++++---- modules/status/testdata/battery_25.png | Bin 1293 -> 1381 bytes modules/status/testdata/battery_50.png | Bin 1340 -> 1420 bytes modules/status/testdata/battery_full.png | Bin 1341 -> 1386 bytes modules/status/testdata/battery_low.png | Bin 1107 -> 1181 bytes wm/util_test.go | 3 ++- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 229027c7..0904f8ac 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module fyshos.com/fynedesk go 1.19 require ( - fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64 + fyne.io/fyne/v2 v2.5.1-0.20240815191931-e5989189e655 github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e github.com/FyshOS/backgrounds v0.0.0-20230616202904-0a8b6ebaa184 @@ -42,7 +42,7 @@ require ( github.com/fyne-io/terminal v0.0.0-20240728203942-56c3b98b9208 github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect - github.com/go-text/render v0.1.0 // indirect + github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b // indirect github.com/go-text/typesetting v0.1.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect @@ -55,7 +55,7 @@ require ( golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/sys v0.20.0 - golang.org/x/text v0.16.0 // indirect + golang.org/x/text v0.16.0 gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5ffed466..b931fd72 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64 h1:AR8iFr+DKB3O7M17Mrmd89N/Dv0R4qzM6nX36kKDHMA= -fyne.io/fyne/v2 v2.5.1-0.20240723013128-bbfc67312e64/go.mod h1:9D4oT3NWeG+MLi/lP7ItZZyujHC/qqMJpoGTAYX5Uqc= +fyne.io/fyne/v2 v2.5.1-0.20240815191931-e5989189e655 h1:o+g1Yb0fzLJGFqy1lgf5KbRoy+6Ww1pLzYpwsoEHnbw= +fyne.io/fyne/v2 v2.5.1-0.20240815191931-e5989189e655/go.mod h1:FJqxIqtPduJbHOSHnLVQtHoTiuO34+IvRL9EkKdlaxs= fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/ActiveState/termtest/conpty v0.5.0 h1:JLUe6YDs4Jw4xNPCU+8VwTpniYOGeKzQg4SM2YHQNA8= @@ -117,8 +117,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-text/render v0.1.0 h1:osrmVDZNHuP1RSu3pNG7Z77Sd2xSbcb/xWytAj9kyVs= -github.com/go-text/render v0.1.0/go.mod h1:jqEuNMenrmj6QRnkdpeaP0oKGFLDNhDkVKwGjsWWYU4= +github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b h1:daoFn+Aw8EIQZO9kYWwHL01FqwwpCl2nTeVEYbsgRHk= +github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b/go.mod h1:jqEuNMenrmj6QRnkdpeaP0oKGFLDNhDkVKwGjsWWYU4= github.com/go-text/typesetting v0.1.0 h1:vioSaLPYcHwPEPLT7gsjCGDCoYSbljxoHJzMnKwVvHw= github.com/go-text/typesetting v0.1.0/go.mod h1:d22AnmeKq/on0HNv73UFriMKc4Ez6EqZAofLhAzpSzI= github.com/go-text/typesetting-utils v0.0.0-20240329101916-eee87fb235a3 h1:levTnuLLUmpavLGbJYLJA7fQnKeS7P1eCdAlM+vReXk= diff --git a/modules/status/testdata/battery_25.png b/modules/status/testdata/battery_25.png index 4644e5f07a29f5f33ec5b9cd53b7cd67d1b23dad..1d995ba30357b091394d60557bed1fa790dd65b8 100644 GIT binary patch delta 1363 zcmV-Z1+4mw3grrrBYy=fNkl zHc~)EU7R1x3^4|Ijp37D4ADdqNem{E_>Gt_V?db+lSE=84k{1>3E@ zTnqS@+C}=kb{kQyMPPW+6vy%7!Ni}#!El@{uqu{^#zTp|JHZH*RT?1(qQFw7QoBh1 zMdz|ogHkcYvQ#@L;35rXGigWtaXQHtQkVjU3~H1xY47?dntfDS6dk(PZo|-Nlwc^b ziZB*RQ5HC&SbtGf{CGqZt`X(heA3E`RkN=pHw&^$i^8?3@3Nd=$egLgkSv9wa7}W^ zu7M!C27>Gw2;jS1tJPXnRh1bI4-dQD?io@gcEDX*zkYpZXJ=;E)zu}t_B7ht+w1D; zDl01=54NnahkclRVOW@#NWo9ot@lASg;DH>@D+4NKCQYAp5D{NdQ($iqXs zw_F@>pSd)+V_O3RK_`E6z0q6;Y?<`-YZ!`d-@M8^v1F7uR$o(b&lgHhkrZ8G&>D5> z^q)$Z>PN3XW}2^uVc2Xc_V}U@1YH~Q@I1eANq@!j$dH(8lXw^)ON({s=NLt+m8d@) z3zJkP0fu2g5K^t38VNklcb^-0>*eKPlA>q^xUR%H^l=^rV@{WQ&zp_uA;$^dIr?=f zJWA1}M(y^^^~A#Y3rh4}f0XC>k@3*NlA`mj;ffN&wcBG?ZjP}@zSF*PDNznkTB@!^ z<9~^-x-V>6^THBKX*%-JJ1q#JfFPJjvd4dQef{I5L%TK`^_tby=1;zHBxv^iS63hX z>FS3aO`m^z?$9o~+Z#INy#7COjii{v$DPZF1+T2F$pjGuNk8Bi`r5jh3j=PCKVmL3 zzTLV!N>yucwCBQ&`kD#_4C}SHT8UfAihsxbQ7{40d#}Y4%;6KxTC1sJa~90R!Cga5x-KnQd!pd*%=PcwL^E$IgvBWi~-4DJH2?;}|;4Y9J{F zL*ZvSV|6+2W}ZRTS|k!FDk{o36@Lf>06uW0P${wW=5|`NYW#T$fw;DB-#(komUHUX zty|BdMk;`~=9yp?#7G9|?L5SQ>>3ENYaqz3fglRkxctsGNuHa1ExBR1EQO+Q?Y5W9 zCv7~Kn0+m|@n)A6g=5DRbcT7Sylh&ZY z5XIzMSxKH73sC28_#y?rVajmASRmoN>5FFHFa%7~&vC5P-92(oJ+{1X5G|Np@n V*;27{I>Z0~002ovPDHLkV1j!AqXhr} delta 1274 zcmVqp2JsE{i4p|(-eN_~J!8XBp72to?xv8?U2z4kt4wlby; zHm0}}aCX)G2_fywSo8Ofneptbp{J*(35)*-^`Zlq63ZG6mVY%I=ocMek3@*Obv+&n zx&TFXR6&IDJN1Q3p;XoSoJvDPUZ|%s1yO428pL9;K1Vr7BE)_2adOCOqsUHWjp;y= z9v2fIcCGS~te}1dqe#N*q+>zX)9sq9KI_^LGxXN=I71(igrUKk=Y0K2)CS8?W9J6; zml(oYEa>W`S%1)HKlv=(8TPkzZ3t@z*Rrl0IUY|A2DBwKgf-J)S;N7yhJ$4d2mD=b zBoc{6qpi#3<>i%?m19a}bnvZBPEO9w&bBV^-MeR5`!{B0W=2Ox!{PA$!l|jLNF=hj zxHvaAcYN^-3XZj#H*X#+4DE9D>Q&3yq1?ZJ|L)zp9e;&)?%bJ}m^hA9N1*F^wGL^T zv@@WW_L8jG7|`Qhx)+Rc=FvM#E8^o-QP)X`bf24^N(P+v#=BU^6dtcuTFsIX&&9Zx zAc!B9_)=A?tLWVe0UyT_1i_2)kADasz7-_99TxP0$*e(yL`j(*8}f5D4We%!^7EPE zWHLYygnz8*ubg!!BV4m30F6ymrKW8Zl$mS8xqS7}ir8$K%9h6B1K7&Uw_gJkHJ%9g zIa}io4yf=cN1>uLt7HXo4%%Vc`(bx)T183qH~~qLevU0xRe~V?;%f-$p;M0MiD5Ep z9h4=FbL>r*x`G&*tkkrc+~x36*PFlfg-qen%YOqkS<@i?QJu+V=zhwQnq9BHb0N^Y z)OG!rKMO1kWEHv{U_9X;^4h&_rYLE;t_x*lz{RB3Dn8Ekl&?M6lr%_ON%+nT;tV>o zT9Z}y&Ej?<%$@${(CvfEr*~H>QiJH%bn&}~J2$QkyKHpyv~%vKyrSxp$-xIp!t_|+ zi+}m88xtejCFQqV@qc7Z(a@I*TW14~*Q4H6VQY1#0d+Cv&8}BV67;#L%jbQv;$azT zF;|KP9VAKES&9bKpobN4A4HgMT~k!_)xze8-+t-*p$Fm+HI}i~A*PK5H5ukMq-4bV z?4wg}n8wS1Io96Z1@E=bgQB6YQ(GP<^MC3~T(!P8QXDKmy1rSIgFYLeC|QB?nZh8) za89Q6!c?v_8s=Drq5&bRNYM~4$^$OUw{Nl;x*^nsiYippCtI~v;rnk4`Q7Y%x=@xN z4M-KDGXY2IQ-UA}p{(#FdHl7;*rX^b8TEYr^9Dr3cmnhBjmfNqPB~}ab9Sxz=zq$H zq9GL`J3|4gZRPQE?Dg@H)@35(i4VH~MbMz98?uAotZSku9#$m?0$z?|fu$*zjqXs^ z6&nMvm0^yx+qZAW2w-9iiyCnw!X^=gfR`~+j$rP%Nh=rH5@E!I2giO^9JZh zR0vN#OLr8lEukT-8Wg6 z*M|76BrhtdY%xCK@;aG=Pm)v!*LG^(|IT-O&9e_En!d)@A3WmAwYIKF>;DZfFvJWs k9hNm5ENeLY9RL9T|GSRDjtgQc8~^|S07*qoM6N<$f{tB)5dZ)H diff --git a/modules/status/testdata/battery_50.png b/modules/status/testdata/battery_50.png index 9256059688be6d33c6218e3f88f27f5ae3fd16bb..d43425ac766edb5af7e1daaecc5ad55e3809531a 100644 GIT binary patch delta 1401 zcmV-<1%~>(3XBVoB!5#$L_t(|oa~xgY!uZW$A7c4Gkaq%qzk*y(r$P2hyJOATPZZP z6l04G1dKLZtkxJ6gIYu%R1yf0XjP2H2ckXzA)y9+(1+G05{uY^iUFxbq=5#y+d{jG z-R<7GJD1&=G2O+b3zg8bqn%0SlQx-iPUkz{e)pWSb7qdZrhlde6sCx3x(&z@B{dY3 z)KE}Qw}D$M%r`dGxtw+bj$z0m9LIZu^m%tM98ZekD#?R4M0fWGBUF|k?sPguxj-%~ z%r}16xM-GHqsk$&@qwelOnSm)GYkgeOoGqdmb+`D&g zRaKQ3uFx4AiC_TpW|<~d1|l(|jwA^}tgA@nnaBO}#=*`5t-oc8yBk*RX{Z2z8~$kh zzSe$k2mneQd7B%nLcPbaKbg$^5e%(2mlT5wtsn|XWPb=f$-Rsfsy?$t^4_+=lGc` zFFd*m0KWR+_s6PAkt37k{hB{Q70)pjSdHl)Q>sG+qx5&@J-fD+6Kb4P_oU`G2Jrh)_lyIdC)V9UaS5_6`PADy+1~ znl3JO&JuXx#z+LiFhLLiVEh*Zp69>ry140~#o-u5F)XqN`HfJHgI7NJe&!7ANI34w zw;Xz{u57+N7^Tey690S95o%nkA;u`C&}Q)kqCC$JctdlormhR_0;~DLwV`vDhmr}t zv43va15P`F2gKCYq(D12M>;>+LaK2L!{SWh)z40De!K0;k>~Dy)Fc3405gsH6(#fD zI?_Qi$>%q$IQ-48J2zLp|9RK`7wbH}Q0wVS|7mK|h=#c3S+61XJXz6lqPK4-m}k<3 z#+W3>t5Z+b*d)g=3B7K7%G*-2I7*f1Nq=?QPrYUTFHm8a(Lm}nWZ`U!HxNbhAisHS zB8k+?ff-t2QL$BpVHe#a>H3~)e*y+`^Ni`DQKt#VnKOS3uCFM;Zg=+UIQf zR1l!N#QxOUC7H7ZZw9Xp2cE851^_sYudgV1=jh2~f_r9N8JZ0YVV_4wN5?%{Yinz# zEV$>vDgAvoMn|cH)uhvscYf-D2!90tc_!V_u7P_f#3+_fV^dmVwVb}5IY#Mgkx0a3 zGELevIy#CVI91FBt=Ta7Tc|vf?tT;uIx-gnD5>q(vBTwZP1@Ag*O!YMxqy<|aEgDy zjBJqEcc?^AQbR#W4Fx4N6eN)vhrYI%oCME_E68$L4keM=HD63zL2r;2S8~voEhvf9 z4t#r+O^Vh#SdQ!N4~eA)08CQo_GAf4Vy~n>%69jMTsDJQPv9!_U0Dg98yclf_4*?s z?J#9IVQ7>-ec2z)-eHQe4porE2$da5YA7hFq3~A#00960t`*-}PJ#g>00000NkvXX Hu0mjf2#2u* delta 1321 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 delta 1322 zcmV+_1=afM3cU)DB!2`+L_t(|oa~xiOj~6b$KUhSwLNW_V?beR=?8HFer$S!gFq%F z8jS(rV#d)$V}h7~Ul(QNi#0Vh8jWUre0*SFVE4k~C~RD7ZEf8ws@JKkto%Q?w#%yl3}<0^ zS#gI~+@bsE;Z0&F6rpz5BUfr3+Y*dWU-nvlpKuO-T7Q`kZ+pTYcHeNU1_1zCC4Ty3 z>0X%#0I=$fe9-;RqBE)&7f8>(TD}*@005u=Y@S*2djrJBC(9l_AOiqc9KJI>li$7f zR7M+Netdb%E&JQfk9&NP4f?r0OHr=4@1u&|j*1){>l&De>0k9*3Le_i+Y!}s6{4^E zEwNEHdVkZ^)qeQ3XEi_lIv>09n?c*_&uKHQ9q_}oYgSMF(?v#u8cHf9tp$nEoBy7u zRiOxsq40@X)o&BdV1)9A$g5MXSB|MLG^#h(s{gp*@`uO;XXs#_1c4!aAwIVp003N_ zas|Uw&ExwsjfWo@+HkZ805CD@NfzgpgD?zf3V)=rroIrTX<)nMhXBMdKvx*AQfQUY z8)laL>wZW7Fo0nghN9_j2W{^(maKZidoV;M$-oMJxRw%cfWXBFa%cTP5m+il+&%(< zA*mQak+_b)FfK+s0kTXjU$`A4NP2qFuPMMUjjpKk@xQ0tBiB|4l6m{3l8VxOX?D$z z41Y~Y%DOKErPcw%?30TOPv*Cr8~gt9T>a6)3%}Tn236k`M_2pdQ!gLt8L_9|HIK(y z4vzVPBt z<0mftwcK2*f|IJD3}Djln#Zn*MaZ!y@=e3`P=pFaDATb0XnC$of{IZ1nIri-8xwnaySvFXSC;Tyw1R0D|ES zJYGYyh~OF<1lQOgxW)!fxJJ<#>}Ik8LDI=hPPmrXGjbN|t$R-Wal*CEioH#4#^hU-kZhaA+BgHs%DvKcLX~)`G)1-Ovo@`*V4;A1;M1& diff --git a/modules/status/testdata/battery_low.png b/modules/status/testdata/battery_low.png index 9fc895327afe4ca16c4403363c501028ab21870c..7050c85c6f6708648692e7d6455dbb6711e8d7e1 100644 GIT binary patch delta 1161 zcmV;41a|w=2%QO#B!6T{L_t(|oa~xiOdLfV!2h#*dtY$eQH~xh2eb%1!HNh9M4@iOxt*!ky|*o0#P390ImiLV_+IUT3m1`3yHOU$o@I#1=zfgh9vw44M0|J5KxQTNqtSE_3rTVr!PLsQc5 z*;-l*7#1VR{62f-TodPiL{U67G~UqM|!4%;WOX;{J*va z0NpM1t-Gri!-+DdJ;w>>FHdcC76ZU@-OY&%Yd4!t4UM-pRs(>`VX>H*>IzpVlGuE| zI)9$mR&dxXbzXO=!#*-GS6}6}S{NxFOJ+u{%=NVS(5;hB41krm%h9{FyaJ5zrSZVo z@28%8_#S!N7lY$_TYWZ*+3hNdr`RmZ1wzrva_8oI)%P3v>G`qI$zYo0%boTk2U_dB zZmH>7C^EYgJKWpy`}sA!caQJ24=?bX(0||i;O6^91mAg_#__*sJ%CC!`oMFqcF3zA z4F>+<9}0pH&*ZEOZL|FS<~NneF(!(5kM;4;oKz-xL;{cl)}I}s@Son5&@^3IeEW8| z5Jfh{julAewU#$s)J#T1j8B$hBXp2VNJxV>wg$Q zJ72HK$O&t*(uB38o2xg3v9vNrV9K%(U30;t32SHk3sQM{A*E_A>%j8Z|7%Php=)bv z)ywA(t_0(irB<)oI=zq@3*1yYomFxIo{waQCYBRxzc3})hZ<<&4b>fnH4+SKB>WZt b0RR6RUvSGb7H*aR0000kPu?r@*U75J_8?wYouvhAvBoOiK#=ax=yU?XsfDS+O$s6II(?v4hjJ$8L7lh zJZyu1y|It0`k$X3KRL%o6&4m2AmTaU{0shy4u4RG=g?Q5Pv^3!jor%P zT7eM11N{XiuzOfrdURAWaO-#=YVGr-*K7<9Gp$Z-k%*%d)mq? z5Y|4pGUy&pWD>q+>3}41uT3UfM*?9jtxE23UqbRVOJ@d8#ad4TVU0t`J?1&&YnIN4 zd|RqOSPLDIHGdW&Yb-?8SYV&!j({^toAc34#BBlZQL3QBZf%a@>tMR4-%xoAMb=K{ z8nw;?J_~INpB&hu)L91M77F5o%Uf8ieF3$<4-Nwv266@PEr_h0z)v84jpEM?-k`=? zfW1idTu{Swc!XrBtv?thmIO}VU&z;8Al`W}lh<|hANhz02OF~`K?UjR) zVVgF6_hMR8>a~ARH19kpTzhj6ArICbA)a{%+@uE{v(GTjj=la!rj!=SmX;77ZXc&qX)|Bl&KuZ)xtFy}s@tLq zv9+F}HJZkS|aw{mezb$cHLpwxq#hTU4-0i|?fx3aof zet&hMul3r}x_)6y6?jgG3pI;am=uauWBS%5;eJAY{#D=1S8Yss9hIPhT1B zn;KF$1fHz1Sge%+DbTq+9KpZ3SAr0V%YXm$Be*TEdszO^m*~VT%Nr+O`Y*v!YkRn>&Ph#qu>vXZ8-; zHkblo?dIJ*_jrA$;%k-;n3yiD>#ZaF`1rVgdH&?VW@#uD8}5&-?^Kqb6#b6V#5clp z=b-lE%0ao>w)cjj|2JSD5Kn06h^(;?S!3b%00030|Kv4UnlpH^+yDRo07*qoM6N<$ Ef|d#x*8l(j diff --git a/wm/util_test.go b/wm/util_test.go index f9e3be77..7b7efa52 100644 --- a/wm/util_test.go +++ b/wm/util_test.go @@ -7,11 +7,12 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/test" "fyne.io/fyne/v2/widget" + "github.com/stretchr/testify/assert" ) func TestFindObjectAtPixelPositionMatching(t *testing.T) { - l := widget.NewLabel("Test") + l := widget.NewRichTextFromMarkdown("* Test") e := widget.NewEntry() w := test.NewWindow( container.NewGridWithColumns(1, l, e)) From 38074e6ec0df2524f2e3ee13ca7a7265c8bb5d86 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 17 Aug 2024 11:11:57 +0100 Subject: [PATCH 41/43] Fix more deprecations --- internal/ui/about.go | 11 +++++++---- internal/ui/bar.go | 8 ++++---- internal/ui/bar_test.go | 2 +- internal/ui/menu.go | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/internal/ui/about.go b/internal/ui/about.go index 65500f91..e5d5c3b4 100644 --- a/internal/ui/about.go +++ b/internal/ui/about.go @@ -68,8 +68,9 @@ func (w *widgetPanel) showAbout() { widget.NewLabelWithStyle("\nWith great thanks to our many kind contributors\n", fyne.TextAlignCenter, fyne.TextStyle{Italic: true})) scroll := container.NewScroll(content) - bgColor := withAlpha(theme.BackgroundColor(), 0xe0) - shadowColor := withAlpha(theme.BackgroundColor(), 0x33) + themeBG := theme.Color(theme.ColorNameBackground) + bgColor := withAlpha(themeBG, 0xe0) + shadowColor := withAlpha(themeBG, 0x33) underlay := canvas.NewImageFromResource(theme2.FyshOSLogo) bg := canvas.NewRectangle(bgColor) @@ -81,11 +82,13 @@ func (w *widgetPanel) showAbout() { fyne.CurrentApp().Settings().AddChangeListener(listen) go func() { for range listen { - bgColor = withAlpha(theme.BackgroundColor(), 0xe0) + themeBG := theme.Color(theme.ColorNameBackground) + + bgColor = withAlpha(themeBG, 0xe0) bg.FillColor = bgColor bg.Refresh() - shadowColor = withAlpha(theme.BackgroundColor(), 0x33) + shadowColor = withAlpha(themeBG, 0x33) footerBG.FillColor = bgColor footer.Refresh() } diff --git a/internal/ui/bar.go b/internal/ui/bar.go index a0a1365d..f7d0596d 100644 --- a/internal/ui/bar.go +++ b/internal/ui/bar.go @@ -66,7 +66,7 @@ func (b *bar) append(object fyne.CanvasObject) { // appendSeparator adds a separator between the default icons and the taskbar func (b *bar) appendSeparator() { - b.separator = canvas.NewRectangle(theme.ForegroundColor()) + b.separator = canvas.NewRectangle(theme.Color(theme.ColorNameForeground)) b.append(b.separator) } @@ -278,7 +278,7 @@ func (b *bar) CreateRenderer() fyne.WidgetRenderer { if fynedesk.Instance().Settings().NarrowLeftLauncher() { bg = canvas.NewRectangle(wmTheme.WidgetPanelBackground()) } else { - bg = canvas.NewLinearGradient(theme.BackgroundColor(), color.Transparent, 180) + bg = canvas.NewLinearGradient(theme.Color(theme.ColorNameBackground), color.Transparent, 180) } return &barRenderer{objects: b.children, background: bg, layout: newBarLayout(b), appBar: b} } @@ -335,10 +335,10 @@ func (b *barRenderer) Refresh() { if fynedesk.Instance().Settings().NarrowLeftLauncher() { b.background = canvas.NewRectangle(wmTheme.WidgetPanelBackground()) } else { - b.background = canvas.NewLinearGradient(theme.BackgroundColor(), color.Transparent, 180) + b.background = canvas.NewLinearGradient(theme.Color(theme.ColorNameBackground), color.Transparent, 180) } if b.appBar.separator != nil { - b.appBar.separator.FillColor = theme.ForegroundColor() + b.appBar.separator.FillColor = theme.Color(theme.ColorNameForeground) } b.objects = b.appBar.children b.Layout(b.appBar.Size()) diff --git a/internal/ui/bar_test.go b/internal/ui/bar_test.go index 7b7a2d0f..5dfad73b 100644 --- a/internal/ui/bar_test.go +++ b/internal/ui/bar_test.go @@ -89,7 +89,7 @@ func TestAppBarBackground(t *testing.T) { assert.Equal(t, wmTheme.NarrowBarWidth, bg.Size().Width) } else { assert.Equal(t, color.Transparent, bg.(*canvas.LinearGradient).EndColor) - assert.Equal(t, theme.BackgroundColor(), bg.(*canvas.LinearGradient).StartColor) + assert.Equal(t, theme.Color(theme.ColorNameBackground), bg.(*canvas.LinearGradient).StartColor) assert.Equal(t, testBar.iconSize+theme.Padding()*2, bg.Size().Width) } } diff --git a/internal/ui/menu.go b/internal/ui/menu.go index f9b27bfe..1e2d549c 100644 --- a/internal/ui/menu.go +++ b/internal/ui/menu.go @@ -78,7 +78,7 @@ func (w *widgetPanel) askLogout() { nil, nil, widget.NewLabel("Are you sure you want to log out?")) - r, g, b, _ := theme.OverlayBackgroundColor().RGBA() + r, g, b, _ := theme.Color(theme.ColorNameOverlayBackground).RGBA() bgCol := &color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 230} bg := canvas.NewRectangle(bgCol) From a04363ec96734a07c33d4d1f1ada424b2b7e14b9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 17 Aug 2024 12:00:00 +0100 Subject: [PATCH 42/43] Additional colour deprecations removed --- internal/ui/switcher.go | 2 +- internal/ui/widgetpanel.go | 10 ++++++---- internal/x11/win/client.go | 4 ++-- internal/x11/win/frame.go | 4 ++-- modules/desktops/pager.go | 2 +- modules/quaketerm/term.go | 4 ++-- modules/status/battery.go | 6 +++--- wm/auth.go | 2 +- wm/border.go | 10 +++++----- wm/button.go | 2 +- 10 files changed, 24 insertions(+), 22 deletions(-) diff --git a/internal/ui/switcher.go b/internal/ui/switcher.go index 09cac29d..2c450573 100644 --- a/internal/ui/switcher.go +++ b/internal/ui/switcher.go @@ -112,7 +112,7 @@ func (s switchIconRenderer) MinSize() fyne.Size { func (s switchIconRenderer) Refresh() { if s.icon.current { - s.bg.FillColor = theme.PrimaryColor() + s.bg.FillColor = theme.Color(theme.ColorNamePrimary) } else { s.bg.FillColor = color.Transparent } diff --git a/internal/ui/widgetpanel.go b/internal/ui/widgetpanel.go index ce411c36..aedfc67e 100644 --- a/internal/ui/widgetpanel.go +++ b/internal/ui/widgetpanel.go @@ -48,8 +48,9 @@ func (w *widgetRenderer) Refresh() { w.panel.clocks.Objects[0].Show() w.panel.clocks.Objects[1].Hide() } - w.panel.clock.Color = theme.ForegroundColor() - w.panel.vClock.Color = theme.ForegroundColor() + fg := theme.Color(theme.ColorNamePrimary) + w.panel.clock.Color = fg + w.panel.vClock.Color = fg canvas.Refresh(w.panel.clock) } @@ -116,15 +117,16 @@ func (w *widgetPanel) createClock() { var style fyne.TextStyle style.Monospace = true + fg := theme.Color(theme.ColorNamePrimary) w.clock = &canvas.Text{ - Color: theme.ForegroundColor(), + Color: fg, Text: w.formattedTime(), Alignment: fyne.TextAlignCenter, TextStyle: style, TextSize: 3 * theme.TextSize(), } w.vClock = &canvas.Text{ - Color: theme.ForegroundColor(), + Color: fg, Text: w.formattedTime(), Alignment: fyne.TextAlignCenter, TextStyle: style, diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index a8242d93..99cd71f8 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -266,8 +266,8 @@ func (c *client) NotifyMouseMotion(x, y int16) { c.frame.mouseMotion(x, y) } -func (c *client) NotifyMousePress(x, y int16, b xproto.Button) { - c.frame.mousePress(x, y, b) +func (c *client) NotifyMousePress(x, y int16, b xproto.Button, s uint16) { + c.frame.mousePress(x, y, b, s) } func (c *client) NotifyMouseRelease(x, y int16, b xproto.Button) { diff --git a/internal/x11/win/frame.go b/internal/x11/win/frame.go index 4643da72..07d0e6d7 100644 --- a/internal/x11/win/frame.go +++ b/internal/x11/win/frame.go @@ -313,9 +313,9 @@ func (f *frame) createPixmaps(depth byte) error { xproto.Drawable(f.client.wm.X().Screen().Root), rightWidthPix, heightPix) f.borderTopRight = pid - backR, backG, backB, _ := theme.DisabledButtonColor().RGBA() + backR, backG, backB, _ := theme.Color(theme.ColorNameDisabledButton).RGBA() if f.client.Focused() { - backR, backG, backB, _ = theme.BackgroundColor().RGBA() + backR, backG, backB, _ = theme.Color(theme.ColorNameBackground).RGBA() } bgColor := uint32(uint8(backR))<<16 | uint32(uint8(backG))<<8 | uint32(uint8(backB)) diff --git a/modules/desktops/pager.go b/modules/desktops/pager.go index 65e93367..2cc410ef 100644 --- a/modules/desktops/pager.go +++ b/modules/desktops/pager.go @@ -103,7 +103,7 @@ func (p *pager) refreshFrom(oldID int) { } var obj fyne.CanvasObject - obj = canvas.NewRectangle(theme.DisabledColor()) + obj = canvas.NewRectangle(theme.Color(theme.ColorNameDisabled)) if win.Properties().Icon() != nil { obj = container.NewStack(obj, canvas.NewImageFromResource(win.Properties().Icon())) diff --git a/modules/quaketerm/term.go b/modules/quaketerm/term.go index 12e72e18..4f6df03c 100644 --- a/modules/quaketerm/term.go +++ b/modules/quaketerm/term.go @@ -51,7 +51,7 @@ func (t *term) createTerm() { win := fyne.CurrentApp().Driver().(desktop.Driver).CreateSplashWindow() win.SetTitle(termTitle) - bg := canvas.NewRectangle(theme.BackgroundColor()) + bg := canvas.NewRectangle(theme.Color(theme.ColorNameBackground)) img := canvas.NewImageFromResource(theme.NewDisabledResource(theme.ComputerIcon())) img.FillMode = canvas.ImageFillContain img.SetMinSize(fyne.NewSize(200, 200)) @@ -153,7 +153,7 @@ func matchTheme(bg, over *canvas.Rectangle) { for { <-ch - bg.FillColor = theme.BackgroundColor() + bg.FillColor = theme.Color(theme.ColorNameBackground) bg.Refresh() over.FillColor = wmTheme.WidgetPanelBackground() over.Refresh() diff --git a/modules/status/battery.go b/modules/status/battery.go index f6f1e97f..82dda25b 100644 --- a/modules/status/battery.go +++ b/modules/status/battery.go @@ -61,7 +61,7 @@ func (b *battery) StatusAreaWidget() fyne.CanvasObject { b.bar = widget.NewProgressBar() b.icon = widget.NewIcon(wmtheme.BatteryIcon) - b.fill = canvas.NewRectangle(theme.ForegroundColor()) + b.fill = canvas.NewRectangle(theme.Color(theme.ColorNameForeground)) prop := canvas.NewRectangle(color.Transparent) prop.SetMinSize(b.icon.MinSize().Add(fyne.NewSize(theme.Padding()*4, 0))) icon := container.NewStack(container.NewCenter(prop, b.icon), container.NewWithoutLayout(b.fill)) @@ -88,12 +88,12 @@ func (b *battery) setValue(val float64) { b.fill.Hide() } else if val < 0.1 { b.icon.SetResource(theme.NewErrorThemedResource(wmtheme.BatteryIcon)) - b.fill.FillColor = theme.ErrorColor() + b.fill.FillColor = theme.Color(theme.ColorNameError) b.fill.Refresh() b.fill.Show() } else { b.icon.SetResource(wmtheme.BatteryIcon) - b.fill.FillColor = theme.ForegroundColor() + b.fill.FillColor = theme.Color(theme.ColorNameForeground) b.fill.Refresh() b.fill.Show() } diff --git a/wm/auth.go b/wm/auth.go index ff8f01ce..5bd906f9 100644 --- a/wm/auth.go +++ b/wm/auth.go @@ -128,7 +128,7 @@ func (a *auth) BeginAuthentication(actionID, message, iconName string, details m layout.NewSpacer()), bottomPad), nil, nil, f) - r, g, b, _ := theme.OverlayBackgroundColor().RGBA() + r, g, b, _ := theme.Color(theme.ColorNameOverlayBackground).RGBA() bgCol := &color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 230} bg := canvas.NewRectangle(bgCol) diff --git a/wm/border.go b/wm/border.go index 2e394ca2..1f2c9ad4 100644 --- a/wm/border.go +++ b/wm/border.go @@ -54,7 +54,7 @@ func NewBorder(win fynedesk.Window, icon fyne.Resource, canMaximize bool) *Borde win.Iconify() }} - title := canvas.NewText(win.Properties().Title(), theme.ForegroundColor()) + title := canvas.NewText(win.Properties().Title(), theme.Color(theme.ColorNameForeground)) buttonPos := fynedesk.Instance().Settings().BorderButtonPosition() var titleBar *Border @@ -199,7 +199,7 @@ func (c *Border) makeDesktopMenu(pos fyne.Position) *fyne.MenuItem { // // Implements: fyne.Widget func (c *Border) CreateRenderer() fyne.WidgetRenderer { - render := &coloredBoxRenderer{b: c, bg: canvas.NewRectangle(theme.BackgroundColor())} + render := &coloredBoxRenderer{b: c, bg: canvas.NewRectangle(theme.Color(theme.ColorNameBackground))} return render } @@ -259,12 +259,12 @@ func (r *coloredBoxRenderer) Objects() []fyne.CanvasObject { func (r *coloredBoxRenderer) Refresh() { r.bg.Resize(r.b.Size()) // Not sure why this resize is needed, but it is... if r.b.win.Focused() { - r.bg.FillColor = theme.BackgroundColor() + r.bg.FillColor = theme.Color(theme.ColorNameBackground) } else { - r.bg.FillColor = theme.DisabledButtonColor() + r.bg.FillColor = theme.Color(theme.ColorNameDisabledButton) } r.bg.Refresh() - r.b.title.Color = theme.ForegroundColor() + r.b.title.Color = theme.Color(theme.ColorNameForeground) r.b.content.Refresh() } diff --git a/wm/button.go b/wm/button.go index 4a7a777c..dad14dac 100644 --- a/wm/button.go +++ b/wm/button.go @@ -29,7 +29,7 @@ func (c *closeButton) Cursor() desktop.Cursor { } func (c *closeButton) MouseIn(*desktop.MouseEvent) { - c.bg.FillColor = theme.ErrorColor() + c.bg.FillColor = theme.Color(theme.ColorNameError) c.bg.Refresh() } From a6b9e8b782682d2938871765b13579158df47036 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 17 Aug 2024 12:16:36 +0100 Subject: [PATCH 43/43] fix bad merge --- internal/x11/win/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/x11/win/client.go b/internal/x11/win/client.go index 99cd71f8..a8242d93 100644 --- a/internal/x11/win/client.go +++ b/internal/x11/win/client.go @@ -266,8 +266,8 @@ func (c *client) NotifyMouseMotion(x, y int16) { c.frame.mouseMotion(x, y) } -func (c *client) NotifyMousePress(x, y int16, b xproto.Button, s uint16) { - c.frame.mousePress(x, y, b, s) +func (c *client) NotifyMousePress(x, y int16, b xproto.Button) { + c.frame.mousePress(x, y, b) } func (c *client) NotifyMouseRelease(x, y int16, b xproto.Button) {