From b1455451e6ffa6ad58a298132fd66a70ae53573e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 12:39:24 +0200 Subject: [PATCH 01/45] feat: lazysecrets list prints every source, vault and secret, for fzf and editor pickers --- README.md | 5 +- cmd/lazysecrets/list.go | 97 +++++++++ cmd/lazysecrets/main.go | 15 +- docs/config.md | 3 +- docs/links.md | 29 +++ internal/cachefile/cachefile.go | 146 ++++++++++++++ internal/cachefile/cachefile_test.go | 91 +++++++++ internal/listing/listing.go | 285 +++++++++++++++++++++++++++ internal/listing/listing_test.go | 176 +++++++++++++++++ internal/ui/app/persist.go | 105 +++------- internal/ui/app/persist_test.go | 19 +- internal/ui/app/route.go | 3 +- internal/ui/app/sources.go | 3 +- 13 files changed, 886 insertions(+), 91 deletions(-) create mode 100644 cmd/lazysecrets/list.go create mode 100644 internal/cachefile/cachefile.go create mode 100644 internal/cachefile/cachefile_test.go create mode 100644 internal/listing/listing.go create mode 100644 internal/listing/listing_test.go diff --git a/README.md b/README.md index f6fad48..4d4a4e9 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ A terminal UI for finding, reading and sharing secrets. Inspired by the fantasti - **Careful with values**: values stay hidden until you reveal them, and copied values are cleared from the clipboard after 30 seconds. - **Scriptable**: `lazysecrets get ` prints a value for scripts and - pipes. + pipes, and `lazysecrets list` everything it can find, for fzf and editor + pickers. - **Favourites**: star the secrets you use most for easy access. - **Expiry warnings**: secrets, keys and certificates that expire soon are marked, listed together in the status pane. @@ -86,7 +87,7 @@ use most: - [Azure Key Vault](docs/azure.md): accounts, permissions, pinned vaults - [Databricks](docs/databricks.md): profiles and Key Vault-backed scopes - [SOPS and .env files](docs/repos.md): which repos and files, decrypting -- [Links](docs/links.md): sharing, opening, `lazysecrets get` in scripts, +- [Links](docs/links.md): sharing, opening, `lazysecrets get` and `list` in scripts, and opening links from the browser and chat - [Custom commands](docs/custom-commands.md): run your own commands on a secret diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go new file mode 100644 index 0000000..23cb504 --- /dev/null +++ b/cmd/lazysecrets/list.go @@ -0,0 +1,97 @@ +package main + +import ( + "context" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "os" + "os/signal" + "strings" + "syscall" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" + "git.kebcloud.no/keb/lazysecrets/internal/listing" + "git.kebcloud.no/keb/lazysecrets/internal/provider" +) + +// listCmd prints every source, vault and secret lazysecrets can find, one +// per line, for fzf, editor pickers and scripts: +// +// lazysecrets list | fzf --delimiter='\t' --with-nth=3 | cut -f1 +// +// What's cached prints at once; what's missing or older than --max-age +// follows as it loads. Lists that can't be read are reported on stderr. +func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, args []string, out, errOut io.Writer) error { + fs := flag.NewFlagSet("list", flag.ContinueOnError) + cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") + maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") + format := fs.String("format", "text", "text: link, kind and name, tab-separated; json: an object per line") + if err := fs.Parse(args); err != nil { + return err + } + if fs.NArg() > 0 { + return fmt.Errorf("usage: lazysecrets list [--cached] [--max-age 2m] [--format text|json]") + } + var write func(listing.Entry) error + switch *format { + case "text": + write = func(e listing.Entry) error { + name := strings.Join(e.Path, " / ") + if e.Account != "" { + name += " · " + e.Account + } + _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Link, e.Kind, name) + return err + } + case "json": + enc := json.NewEncoder(out) + enc.SetEscapeHTML(false) + write = func(e listing.Entry) error { return enc.Encode(e) } + default: + return fmt.Errorf("--format: %q is not text or json", *format) + } + + // When the reader goes away (a pick in fzf), writing fails instead of + // killing the process, so what loaded is still saved. + signal.Notify(make(chan os.Signal, 1), syscall.SIGPIPE) + var gone error + emit := func(e listing.Entry) error { + if err := write(e); err != nil { + gone = err + return err + } + return nil + } + + f := cachefile.New() + if cachePath != "" { + f = cachefile.Read(cachePath) + } + f, errs := listing.Run(context.Background(), listing.Options{ + Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Timeout: timeout, + }, emit) + if cachePath != "" && !*cached { + byID := map[string]provider.Provider{} + for _, p := range providers { + byID[p.ID()] = p + } + keep := func(id string) bool { p, ok := byID[id]; return ok && p.Kind() != provider.KindRepo } + if err := cachefile.Save(cachePath, f, keep, time.Now()); err != nil { + errs = append(errs, err) + } + } + if gone != nil { + if errors.Is(gone, syscall.EPIPE) { + return nil // the reader has what it wanted + } + return gone + } + for _, err := range errs { + fmt.Fprintln(errOut, "lazysecrets: list:", err) + } + return nil +} diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 256fb45..1ae7411 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -121,6 +121,10 @@ func run() error { {{secrets/scope/key}} lazysecrets [flags] get print the value a lazysecrets:// link points at, for scripts: VAR=$(lazysecrets get ) + lazysecrets [flags] list [--cached] [--max-age 2m] [--format text|json] + print every source, vault and secret it can + find, one per line, for fzf and pickers: + what's cached at once, then what loads lazysecrets [flags] share [--key ] ... print a link to env files of a repo, encrypted with a secret's value (default: sharing.key) @@ -146,7 +150,7 @@ Flags: } var open, getRef *ref.Ref - var shareArgs []string + var shareArgs, listArgs []string printKeys := false switch args := flag.Args(); { case len(args) > 0 && args[0] == "share": @@ -154,6 +158,8 @@ Flags: if len(shareArgs) == 0 { shareArgs = []string{} // still sharing: says how } + case len(args) > 0 && args[0] == "list": + listArgs = append([]string{}, args[1:]...) // not nil: listing case len(args) == 1 && args[0] == "keybindings": printKeys = true case len(args) == 2 && args[0] == "get": @@ -345,6 +351,13 @@ Flags: defer cancel() return get(ctx, providers, st, *getRef) } + if listArgs != nil { + cachePath := "" + if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { + cachePath = filepath.Join(d, "cache.json") + } + return listCmd(providers, cachePath, timeoutFor, listArgs, os.Stdout, os.Stderr) + } if shareArgs != nil { // The files from a repo, the key from whichever provider it's // in: the longest timeout. diff --git a/docs/config.md b/docs/config.md index 40e4e3b..d5d9740 100644 --- a/docs/config.md +++ b/docs/config.md @@ -140,7 +140,8 @@ you: the Sources lists, vaults and scopes, and secrets' names and metadata once, and anything older than two minutes reloads in the background when you go to it, or when Go to searches it. While it does, the pane's bottom border says how old what it shows is (`cached 3h ago`). Revealing -and copying always fetch the value live. +and copying always fetch the value live. [`lazysecrets list`](links.md#listing-for-fzf-and-pickers) +reads it and adds to it too. Lists not loaded for 30 days are dropped, and so is everything from an account you're no longer signed in to. Repos aren't cached: their files diff --git a/docs/links.md b/docs/links.md index 6b1ddf7..5b9639b 100644 --- a/docs/links.md +++ b/docs/links.md @@ -136,6 +136,35 @@ it first), the Databricks profile for the workspace, or sops in your clone of the repo; a version in the link reads that version. The value ends with a newline only on a terminal. +### Listing, for fzf and pickers + +`lazysecrets list` prints every source, vault and secret, one per line: +its link, its kind (`source`, `vault`, `secret`, `key`, `certificate`) +and its name, tab-separated. It's what Go to searches, so fzf, or an +editor's picker, can search it instead: + +```sh +lazysecrets list | fzf --delimiter='\t' --with-nth=3 \ + --bind 'enter:become(lazysecrets open {1})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get {1} | pbcopy)' +``` + +What's [cached](config.md#cache) prints at once. Then, like Go to, it loads +what's missing or older than `--max-age` (2m), and what's new in it follows +as it arrives: fzf shows it while you type. `--cached` loads nothing from +Azure or Databricks, for an answer at once. Repos are always read, from +disk. What it loads is cached for the TUI too. Lists it can't read are +reported on stderr; it stops when the reader goes, after a pick in fzf. + +`--format json` prints an object per line instead, for editor plugins: + +```json +{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"alice"} +``` + +`account` is there when several az accounts are signed in. Values are never +listed. + ## From the browser and chat ```sh diff --git a/internal/cachefile/cachefile.go b/internal/cachefile/cachefile.go new file mode 100644 index 0000000..7d31792 --- /dev/null +++ b/internal/cachefile/cachefile.go @@ -0,0 +1,146 @@ +// Package cachefile is the cache of what lazysecrets has loaded +// (cache.json): the Sources lists, vaults, secrets' metadata and where +// the cursor was in each, never values. The TUI and lazysecrets list +// both read it and save to it; a save merges with what's on disk, so +// neither undoes what the other loaded. +package cachefile + +import ( + "encoding/json" + "maps" + "os" + "path/filepath" + "strings" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/provider" +) + +// Version is the file's format; a file of another version is ignored, +// and replaced on the next save. +const Version = 1 + +// MaxAge drops what hasn't been loaded again for this long. +const MaxAge = 30 * 24 * time.Hour + +// File is the cache. Every key starts with the provider ID: Sources are +// keyed by it, the rest by Row, Objects' keys and the like. +type File struct { + Version int `json:"version"` + Sources map[string]Stamped[[]provider.Source] `json:"sources,omitempty"` // by provider ID + Containers map[string]Stamped[[]provider.Container] `json:"containers,omitempty"` + Objects map[string]Stamped[[]provider.Object] `json:"objects,omitempty"` + Details map[string]Stamped[provider.Object] `json:"details,omitempty"` + Cursor map[string]string `json:"cursor,omitempty"` +} + +// Stamped is a list or detail with when it was loaded. +type Stamped[T any] struct { + At time.Time `json:"at"` + Value T `json:"value"` +} + +// New is an empty cache. +func New() File { + return File{ + Version: Version, + Sources: map[string]Stamped[[]provider.Source]{}, + Containers: map[string]Stamped[[]provider.Container]{}, + Objects: map[string]Stamped[[]provider.Object]{}, + Details: map[string]Stamped[provider.Object]{}, + Cursor: map[string]string{}, + } +} + +// Row keys a source's vaults or scopes. +func Row(providerID, sourceID string) string { return providerID + "|" + sourceID } + +// ContainerKey keys what's cached about a vault or scope. +func ContainerKey(c provider.Container) string { return c.Source.Provider + "|" + c.ID } + +// ObjectsKey keys a vault's secrets, keys or certificates. +func ObjectsKey(c provider.Container, t provider.ObjectType) string { + return ContainerKey(c) + "|" + string(t) +} + +// ProviderOf is the provider ID a key starts with. +func ProviderOf(key string) string { + id, _, _ := strings.Cut(key, "|") + return id +} + +// Read reads path; a missing, unreadable or other version's file is an +// empty cache. +func Read(path string) File { + f := New() + b, err := os.ReadFile(path) + if err != nil { + return f + } + var d File + if json.Unmarshal(b, &d) != nil || d.Version != Version { + return f + } + maps.Copy(f.Sources, d.Sources) + maps.Copy(f.Containers, d.Containers) + maps.Copy(f.Objects, d.Objects) + maps.Copy(f.Details, d.Details) + maps.Copy(f.Cursor, d.Cursor) + return f +} + +// Save writes f to path, merged with the file there: of a list in both, +// the one loaded last wins, and f's cursors win. Entries older than +// MaxAge, and those of providers keep says no to (accounts signed out +// of), are dropped, from the file's side as well. +func Save(path string, f File, keep func(providerID string) bool, now time.Time) error { + out := New() + ok := func(key string, at time.Time) bool { return keep(ProviderOf(key)) && now.Sub(at) < MaxAge } + disk := Read(path) + merge(out.Sources, disk.Sources, f.Sources, ok) + merge(out.Containers, disk.Containers, f.Containers, ok) + merge(out.Objects, disk.Objects, f.Objects, ok) + merge(out.Details, disk.Details, f.Details, ok) + for _, m := range []map[string]string{disk.Cursor, f.Cursor} { + for k, v := range m { + if keep(ProviderOf(k)) { + out.Cursor[k] = v + } + } + } + return write(path, out) +} + +func merge[T any](out, disk, ours map[string]Stamped[T], ok func(string, time.Time) bool) { + for _, m := range []map[string]Stamped[T]{disk, ours} { + for k, e := range m { + if old, seen := out[k]; ok(k, e.At) && (!seen || !e.At.Before(old.At)) { + out[k] = e + } + } + } +} + +// write writes f atomically, readable by the user only. +func write(path string, f File) error { + b, err := json.Marshal(f) + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { + return err + } + tmp, err := os.CreateTemp(filepath.Dir(path), ".cache-*.json") + if err != nil { + return err + } + defer os.Remove(tmp.Name()) // after a successful rename, nothing there + if _, err := tmp.Write(b); err != nil { + tmp.Close() + return err + } + if err := tmp.Close(); err != nil { + return err + } + return os.Rename(tmp.Name(), path) +} diff --git a/internal/cachefile/cachefile_test.go b/internal/cachefile/cachefile_test.go new file mode 100644 index 0000000..32c5b96 --- /dev/null +++ b/internal/cachefile/cachefile_test.go @@ -0,0 +1,91 @@ +package cachefile + +import ( + "path/filepath" + "testing" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/provider" +) + +func list(at time.Time, names ...string) Stamped[[]provider.Container] { + var cs []provider.Container + for _, n := range names { + cs = append(cs, provider.Container{Name: n}) + } + return Stamped[[]provider.Container]{At: at, Value: cs} +} + +func TestSaveMerges(t *testing.T) { + path := filepath.Join(t.TempDir(), "cache.json") + now := time.Now() + all := func(string) bool { return true } + + // The TUI saved two lists. + tui := New() + tui.Containers["az|a"] = list(now.Add(-time.Hour), "kv-a-old") + tui.Containers["az|b"] = list(now.Add(-time.Minute), "kv-b") + tui.Cursor["az|b"] = "kv-b" + if err := Save(path, tui, all, now); err != nil { + t.Fatal(err) + } + // lazysecrets list loads a again, and c. + listed := Read(path) + listed.Containers["az|a"] = list(now, "kv-a-new") + listed.Containers["az|c"] = list(now, "kv-c") + if err := Save(path, listed, all, now); err != nil { + t.Fatal(err) + } + // The TUI saves what it has, older: list's lists stay. + if err := Save(path, tui, all, now); err != nil { + t.Fatal(err) + } + f := Read(path) + for key, want := range map[string]string{"az|a": "kv-a-new", "az|b": "kv-b", "az|c": "kv-c"} { + if got := f.Containers[key].Value; len(got) != 1 || got[0].Name != want { + t.Errorf("%s = %v, want %s", key, got, want) + } + } + if f.Cursor["az|b"] != "kv-b" { + t.Error("cursor lost") + } +} + +func TestSaveDrops(t *testing.T) { + path := filepath.Join(t.TempDir(), "cache.json") + now := time.Now() + f := New() + f.Containers["az|old"] = list(now.Add(-MaxAge-time.Hour), "kv-old") + f.Containers["gone|x"] = list(now, "kv-gone") + f.Containers["az|x"] = list(now, "kv-x") + if err := Save(path, f, func(id string) bool { return true }, now); err != nil { + t.Fatal(err) + } + // Signed out of "gone" since: dropped from the file too. + if err := Save(path, New(), func(id string) bool { return id == "az" }, now); err != nil { + t.Fatal(err) + } + got := Read(path).Containers + if _, ok := got["az|old"]; ok { + t.Error("kept a list older than MaxAge") + } + if _, ok := got["gone|x"]; ok { + t.Error("kept a signed-out account's list") + } + if _, ok := got["az|x"]; !ok { + t.Error("dropped a list on disk the save didn't have") + } +} + +func TestReadOtherVersion(t *testing.T) { + path := filepath.Join(t.TempDir(), "cache.json") + f := New() + f.Version = Version + 1 + f.Containers["az|x"] = list(time.Now(), "kv-x") + if err := write(path, f); err != nil { + t.Fatal(err) + } + if got := Read(path); len(got.Containers) != 0 || got.Version != Version { + t.Errorf("read another version's file: %+v", got) + } +} diff --git a/internal/listing/listing.go b/internal/listing/listing.go new file mode 100644 index 0000000..2516d79 --- /dev/null +++ b/internal/listing/listing.go @@ -0,0 +1,285 @@ +// Package listing lists what lazysecrets can find, for lazysecrets list: +// what Go to searches, without the TUI. What's cached comes first, at +// once; then lists that are missing or older than MaxAge load in the +// background, a few at a time, and what's new in them follows as they +// arrive. Repos are always read, from disk. Values are never listed. +package listing + +import ( + "cmp" + "context" + "fmt" + "slices" + "strings" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" + "git.kebcloud.no/keb/lazysecrets/internal/provider" + "git.kebcloud.no/keb/lazysecrets/internal/ref" +) + +// Workers is how many lists load at once, as in Go to. +const Workers = 4 + +// Entry is a source, vault or item, by its lazysecrets:// link. +type Entry struct { + Link string `json:"link"` + // Kind is source (a subscription, workspace or repo), vault (a Key + // Vault, secret scope or repo file), secret, key or certificate. + Kind string `json:"kind"` + // Provider is azure, databricks or repo, as in links. + Provider string `json:"provider"` + // Path names it: its source's, vault's and own names. + Path []string `json:"path"` + // Account is the az account it's seen through, when there are several. + Account string `json:"account,omitempty"` +} + +type Options struct { + Providers []provider.Provider + // Cache is what was loaded before; Run adds what it loads. + Cache cachefile.File + // MaxAge: cached lists loaded longer ago are loaded again. + MaxAge time.Duration + // Cached lists only what's cached (and repos): nothing is loaded. + Cached bool + Timeout func(provider.Kind) time.Duration + Now func() time.Time +} + +// Run lists everything, calling emit for each entry once, from this +// goroutine. An error from emit (the reader went away) stops it. It +// returns the cache with what was loaded, and the lists that couldn't be. +func Run(ctx context.Context, o Options, emit func(Entry) error) (cachefile.File, []error) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + l := &lister{o: o, emit: emit, seen: map[string]bool{}, pending: map[string]bool{}, results: make(chan result)} + if l.o.Now == nil { + l.o.Now = time.Now + } + for _, p := range o.Providers { + if l.stopped != nil { + break + } + l.provider(p) + } + l.start(ctx) + for l.active > 0 { + r := <-l.results + l.active-- + if l.stopped == nil { + l.handle(r) + l.start(ctx) + } + if l.stopped != nil { + cancel() + } + } + return l.o.Cache, l.errs +} + +type job struct { + p provider.Provider + src *provider.Source // list its vaults + c *provider.Container // list its secrets + key string // where the list is cached +} + +type result struct { + job + sources []provider.Source + containers []provider.Container + objects []provider.Object + err error +} + +type lister struct { + o Options + emit func(Entry) error + seen map[string]bool // provider ID + link of entries emitted + pending map[string]bool // cache keys queued or loading + queue []job + active int + results chan result + errs []error + stopped error // emit's error +} + +func (l *lister) cacheable(p provider.Provider) bool { return p.Kind() != provider.KindRepo } + +// load reports whether to load a list: a repo's always (from disk), else +// unless Cached, when it isn't cached or is older than MaxAge. +func (l *lister) load(p provider.Provider, cached bool, at time.Time) bool { + if !l.cacheable(p) { + return true + } + return !l.o.Cached && (!cached || l.o.Now().Sub(at) >= l.o.MaxAge) +} + +func (l *lister) provider(p provider.Provider) { + e, ok := l.o.Cache.Sources[p.ID()] + if l.cacheable(p) && ok { + for _, src := range sorted(e.Value, func(s provider.Source) string { return s.Name }) { + l.source(p, src) + } + } + if l.load(p, ok, e.At) { + l.enqueue(job{p: p, key: p.ID()}) + } +} + +// source emits src, and what's cached under it, and queues what's not. +func (l *lister) source(p provider.Provider, src provider.Source) { + src.Provider, src.ProviderLabel = p.ID(), p.Label() + if r, err := ref.ForSource(src); err == nil { + l.put(p, Entry{Link: r.String(), Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, Account: accountOf(src)}) + } + row := cachefile.Row(p.ID(), src.ID) + e, ok := l.o.Cache.Containers[row] + if l.cacheable(p) && ok { + l.containers(p, src, e.Value) + } + if l.load(p, ok, e.At) { + l.enqueue(job{p: p, src: &src, key: row}) + } +} + +func (l *lister) containers(p provider.Provider, src provider.Source, cs []provider.Container) { + for _, c := range sorted(cs, func(c provider.Container) string { return c.Name }) { + c.Source = src + if r, err := ref.ForContainer(c, provider.TypeSecret); err == nil { + l.put(p, Entry{Link: r.String(), Kind: "vault", Provider: kindOf(src.Kind), Path: []string{src.Name, c.Name}, Account: accountOf(src)}) + } + key := cachefile.ObjectsKey(c, provider.TypeSecret) + e, ok := l.o.Cache.Objects[key] + if l.cacheable(p) { + // Keys and certificates only as far as they were opened in + // the TUI: Go to doesn't load them either. + for _, t := range []provider.ObjectType{provider.TypeSecret, provider.TypeKey, provider.TypeCertificate} { + l.objects(p, c, l.o.Cache.Objects[cachefile.ObjectsKey(c, t)].Value) + } + } + if l.load(p, ok, e.At) { + l.enqueue(job{p: p, c: &c, key: key}) + } + } +} + +func (l *lister) objects(p provider.Provider, c provider.Container, objs []provider.Object) { + for _, o := range sorted(objs, func(o provider.Object) string { return o.Name }) { + o.Container = c + r, err := ref.ForObject(o, "") + if err != nil { + continue + } + l.put(p, Entry{Link: r.String(), Kind: strings.ToLower(string(o.Type)), Provider: kindOf(c.Source.Kind), + Path: []string{c.Source.Name, c.Name, o.Name}, Account: accountOf(c.Source)}) + } +} + +// put emits e, unless it was already (or emitting has failed). +func (l *lister) put(p provider.Provider, e Entry) { + id := p.ID() + "\x00" + e.Link + if l.stopped != nil || l.seen[id] { + return + } + l.seen[id] = true + l.stopped = l.emit(e) +} + +func (l *lister) enqueue(j job) { + if l.pending[j.key] { + return + } + l.pending[j.key] = true + l.queue = append(l.queue, j) +} + +func (l *lister) start(ctx context.Context) { + for l.stopped == nil && l.active < Workers && len(l.queue) > 0 { + j := l.queue[0] + l.queue = l.queue[1:] + l.active++ + go func() { l.results <- l.fetch(ctx, j) }() + } +} + +func (l *lister) fetch(ctx context.Context, j job) result { + kind := j.p.Kind() + ctx, cancel := context.WithTimeout(ctx, l.o.Timeout(kind)) + defer cancel() + r := result{job: j} + switch { + case j.c != nil: + r.objects, r.err = j.p.Objects(ctx, *j.c, provider.TypeSecret) + case j.src != nil: + r.containers, r.err = j.p.Containers(ctx, *j.src) + default: + r.sources, r.err = j.p.Sources(ctx) + } + return r +} + +func (l *lister) handle(r result) { + delete(l.pending, r.key) + now := l.o.Now() + if r.err != nil { + l.errs = append(l.errs, fmt.Errorf("%s: %w", r.label(), r.err)) + return + } + cache := l.cacheable(r.p) + switch { + case r.c != nil: + if cache { + l.o.Cache.Objects[r.key] = cachefile.Stamped[[]provider.Object]{At: now, Value: r.objects} + } + l.objects(r.p, *r.c, r.objects) + case r.src != nil: + r.containers = slices.Clone(r.containers) // the provider's may be shared + for i := range r.containers { + r.containers[i].Source = *r.src + } + if cache { + l.o.Cache.Containers[r.key] = cachefile.Stamped[[]provider.Container]{At: now, Value: r.containers} + } + l.containers(r.p, *r.src, r.containers) + default: + if cache { + l.o.Cache.Sources[r.key] = cachefile.Stamped[[]provider.Source]{At: now, Value: r.sources} + } + for _, src := range r.sources { + l.source(r.p, src) + } + } +} + +// label names a list that couldn't be loaded. +func (r result) label() string { + switch { + case r.c != nil: + return r.c.Source.Name + " / " + r.c.Name + case r.src != nil: + return r.src.Name + } + return r.p.Label() +} + +func kindOf(k provider.Kind) string { return strings.ToLower(string(k)) } + +// accountOf is the account part of a source's provider label ("alice" in +// "Azure · alice"), or "" when there's a single account. +func accountOf(src provider.Source) string { + account, ok := strings.CutPrefix(src.ProviderLabel, string(src.Kind)+" · ") + if !ok { + return "" + } + return account +} + +func sorted[T any](s []T, name func(T) string) []T { + s = slices.Clone(s) + slices.SortStableFunc(s, func(a, b T) int { + return cmp.Compare(strings.ToLower(name(a)), strings.ToLower(name(b))) + }) + return s +} diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go new file mode 100644 index 0000000..ebac6dc --- /dev/null +++ b/internal/listing/listing_test.go @@ -0,0 +1,176 @@ +package listing + +import ( + "context" + "errors" + "strings" + "sync/atomic" + "testing" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" + "git.kebcloud.no/keb/lazysecrets/internal/provider" + "git.kebcloud.no/keb/lazysecrets/internal/provider/fake" +) + +// counting counts a provider's requests. +type counting struct { + provider.Provider + calls atomic.Int32 +} + +func (c *counting) Sources(ctx context.Context) ([]provider.Source, error) { + c.calls.Add(1) + return c.Provider.Sources(ctx) +} + +func (c *counting) Containers(ctx context.Context, src provider.Source) ([]provider.Container, error) { + c.calls.Add(1) + return c.Provider.Containers(ctx, src) +} + +func (c *counting) Objects(ctx context.Context, ct provider.Container, t provider.ObjectType) ([]provider.Object, error) { + c.calls.Add(1) + return c.Provider.Objects(ctx, ct, t) +} + +func run(t *testing.T, o Options) ([]Entry, cachefile.File, []error) { + t.Helper() + if o.Cache.Version == 0 { + o.Cache = cachefile.New() + } + o.Timeout = func(provider.Kind) time.Duration { return 5 * time.Second } + var got []Entry + f, errs := Run(context.Background(), o, func(e Entry) error { + got = append(got, e) + return nil + }) + return got, f, errs +} + +func has(es []Entry, kind, path string) bool { + for _, e := range es { + if e.Kind == kind && strings.Join(e.Path, "/") == path { + return true + } + } + return false +} + +func TestListLoadsAndCaches(t *testing.T) { + t.Parallel() + az := &counting{Provider: fake.Azure(0)} + got, f, errs := run(t, Options{Providers: []provider.Provider{az, fake.Repos()}, MaxAge: time.Minute}) + for _, want := range [][2]string{ + {"source", "platform-prod"}, {"vault", "platform-prod/kv-app-prod"}, {"secret", "platform-prod/kv-app-prod/db-password"}, + {"source", "lazysecrets-demo"}, {"secret", "lazysecrets-demo/.env/DATABASE_URL"}, + } { + if !has(got, want[0], want[1]) { + t.Errorf("no %s %s", want[0], want[1]) + } + } + if len(errs) != 1 || !strings.Contains(errs[0].Error(), "kv-restricted: 403") { + t.Errorf("errs = %v", errs) + } + seen := map[string]bool{} + for _, e := range got { + if seen[e.Link] { + t.Errorf("%s listed twice", e.Link) + } + seen[e.Link] = true + if e.Provider != "azure" && e.Provider != "repo" { + t.Errorf("provider %q", e.Provider) + } + } + if len(f.Sources) != 1 || len(f.Containers) == 0 || len(f.Objects) == 0 { + t.Errorf("not cached: %d sources, %d containers, %d objects", len(f.Sources), len(f.Containers), len(f.Objects)) + } + for k := range f.Containers { + if cachefile.ProviderOf(k) != az.ID() { + t.Errorf("cached a repo: %s", k) + } + } + + // Again with that cache: the same, without asking Azure. + before := az.calls.Load() + again, _, _ := run(t, Options{Providers: []provider.Provider{az, fake.Repos()}, Cache: f, MaxAge: time.Minute}) + if len(again) != len(got) { + t.Errorf("%d entries from the cache, %d loaded", len(again), len(got)) + } + // The vault that couldn't be read wasn't cached: it's asked again. + if n := az.calls.Load() - before; n != 1 { + t.Errorf("%d requests with a fresh cache, want 1 (kv-restricted)", n) + } + + // Stale: loaded again, but each entry is still listed once. + before = az.calls.Load() + stale, _, _ := run(t, Options{Providers: []provider.Provider{az}, Cache: f, MaxAge: time.Minute, + Now: func() time.Time { return time.Now().Add(time.Hour) }}) + if az.calls.Load()-before < 3 { + t.Error("stale lists weren't loaded again") + } + links := map[string]bool{} + for _, e := range stale { + if links[e.Link] { + t.Errorf("%s listed twice", e.Link) + } + links[e.Link] = true + } +} + +func TestListCachedOnly(t *testing.T) { + t.Parallel() + az := &counting{Provider: fake.Azure(0)} + _, f, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute}) + before := az.calls.Load() + got, _, errs := run(t, Options{Providers: []provider.Provider{az, fake.Repos()}, Cache: f, Cached: true, + Now: func() time.Time { return time.Now().Add(24 * time.Hour) }}) + if az.calls.Load() != before || len(errs) != 0 { + t.Errorf("--cached asked Azure: %d requests, %v", az.calls.Load()-before, errs) + } + if !has(got, "secret", "platform-prod/kv-app-prod/db-password") || !has(got, "secret", "lazysecrets-demo/.env/DATABASE_URL") { + t.Error("cached secrets or repos missing") + } +} + +func TestListCachedFirst(t *testing.T) { + t.Parallel() + az := fake.Azure(0) + _, f, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute}) + // Forget one vault's secrets: they load, after everything cached. + var dropped string + for k := range f.Objects { + if strings.Contains(k, "kv-app-prod") && strings.HasSuffix(k, "|Secret") { + dropped = k + delete(f.Objects, k) + break + } + } + if dropped == "" { + t.Fatalf("no kv-app-prod in %v", f.Objects) + } + got, _, _ := run(t, Options{Providers: []provider.Provider{az}, Cache: f, MaxAge: time.Minute}) + last := got[len(got)-1] + if last.Kind != "secret" || last.Path[1] != "kv-app-prod" { + t.Errorf("last = %+v, want a kv-app-prod secret, loaded after the cache", last) + } +} + +func TestListStopsWhenTheReaderGoes(t *testing.T) { + t.Parallel() + gone := errors.New("broken pipe") + n := 0 + _, errs := Run(context.Background(), Options{ + Providers: []provider.Provider{fake.Azure(0), fake.Repos()}, Cache: cachefile.New(), MaxAge: time.Minute, + Timeout: func(provider.Kind) time.Duration { return time.Second }, + }, func(Entry) error { + n++ + if n == 2 { + return gone + } + return nil + }) + if n != 2 || len(errs) != 0 { + t.Errorf("emitted %d after the reader went, errs %v", n, errs) + } +} diff --git a/internal/ui/app/persist.go b/internal/ui/app/persist.go index 659637d..b2b1117 100644 --- a/internal/ui/app/persist.go +++ b/internal/ui/app/persist.go @@ -1,14 +1,12 @@ package app import ( - "encoding/json" "errors" - "os" - "path/filepath" "time" tea "charm.land/bubbletea/v2" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ref" "git.kebcloud.no/keb/lazysecrets/internal/store" @@ -23,58 +21,35 @@ import ( // And where lazysecrets was left, per folder it ran in, goes in the store, // to go back there on the next start. -// cacheFileVersion is the file's format; a file of another version is -// ignored, and replaced on the next save. -const cacheFileVersion = 1 - -// cacheMaxAge drops what hasn't been loaded again for this long. -const cacheMaxAge = 30 * 24 * time.Hour - // persistEvery is how often a changed cache is saved while running, so // little is lost if lazysecrets is killed rather than quit. const persistEvery = 30 * time.Second -type cacheFile struct { - Version int `json:"version"` - Sources map[string]stamped[[]provider.Source] `json:"sources,omitempty"` // by provider ID - Containers map[string]stamped[[]provider.Container] `json:"containers,omitempty"` - Objects map[string]stamped[[]provider.Object] `json:"objects,omitempty"` - Details map[string]stamped[provider.Object] `json:"details,omitempty"` - Cursor map[string]string `json:"cursor,omitempty"` -} - -type stamped[T any] struct { - At time.Time `json:"at"` - Value T `json:"value"` -} - type persistTickMsg struct{} type persistedMsg struct{ err error } // keepCached reports whether a cache key's account still exists and // isn't a repo: every key starts with the provider ID. -func (m *Model) keepCached(key string) bool { - id, _ := splitSourceRow(key) - p, ok := m.byID[id] - return ok && p.Kind() != provider.KindRepo +func (m *Model) keepCached(key string) bool { return m.keepProvider(cachefile.ProviderOf(key)) } + +func (m *Model) keepProvider(id string) bool { return keepIn(m.byID)(id) } + +func keepIn(byID map[string]provider.Provider) func(id string) bool { + return func(id string) bool { + p, ok := byID[id] + return ok && p.Kind() != provider.KindRepo + } } // loadCacheFile fills the cache from the file, leaving out what's too // old or belongs to accounts that aren't signed in any more. func (m *Model) loadCacheFile() { - b, err := os.ReadFile(m.cachePath) - if err != nil { - return - } - var f cacheFile - if json.Unmarshal(b, &f) != nil || f.Version != cacheFileVersion { - return - } + f := cachefile.Read(m.cachePath) now := m.now() - recent := func(at time.Time) bool { return now.Sub(at) < cacheMaxAge } + recent := func(at time.Time) bool { return now.Sub(at) < cachefile.MaxAge } for id, e := range f.Sources { - if m.keepCached(id+"|") && recent(e.At) { + if m.keepProvider(id) && recent(e.At) { m.sourceResults[id] = sourcesMsg{gen: m.sourcesGen, provider: id, sources: e.Value} m.sourcesAt[id] = e.At } @@ -102,33 +77,26 @@ func (m *Model) loadCacheFile() { } // cacheSnapshot is the cache as the file holds it. -func (m *Model) cacheSnapshot() cacheFile { - f := cacheFile{ - Version: cacheFileVersion, - Sources: map[string]stamped[[]provider.Source]{}, - Containers: map[string]stamped[[]provider.Container]{}, - Objects: map[string]stamped[[]provider.Object]{}, - Details: map[string]stamped[provider.Object]{}, - Cursor: map[string]string{}, - } +func (m *Model) cacheSnapshot() cachefile.File { + f := cachefile.New() for id, r := range m.sourceResults { - if r.err == nil && m.keepCached(id+"|") { - f.Sources[id] = stamped[[]provider.Source]{m.sourcesAt[id], r.sources} + if r.err == nil && m.keepProvider(id) { + f.Sources[id] = cachefile.Stamped[[]provider.Source]{At: m.sourcesAt[id], Value: r.sources} } } for k, e := range m.cache.containers { if m.keepCached(k) { - f.Containers[k] = stamped[[]provider.Container]{e.at, e.value} + f.Containers[k] = cachefile.Stamped[[]provider.Container]{At: e.at, Value: e.value} } } for k, e := range m.cache.objects { if m.keepCached(k) { - f.Objects[k] = stamped[[]provider.Object]{e.at, e.value} + f.Objects[k] = cachefile.Stamped[[]provider.Object]{At: e.at, Value: e.value} } } for k, e := range m.cache.details { if m.keepCached(k) { - f.Details[k] = stamped[provider.Object]{e.at, e.value} + f.Details[k] = cachefile.Stamped[provider.Object]{At: e.at, Value: e.value} } } for k, v := range m.cache.cursor { @@ -139,28 +107,11 @@ func (m *Model) cacheSnapshot() cacheFile { return f } -// writeCacheFile writes f atomically, readable by the user only. -func writeCacheFile(path string, f cacheFile) error { - b, err := json.Marshal(f) - if err != nil { - return err - } - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - return err - } - tmp, err := os.CreateTemp(filepath.Dir(path), ".cache-*.json") - if err != nil { - return err - } - defer os.Remove(tmp.Name()) // after a successful rename, nothing there - if _, err := tmp.Write(b); err != nil { - tmp.Close() - return err - } - if err := tmp.Close(); err != nil { - return err - } - return os.Rename(tmp.Name(), path) +// saveCache saves f, merged with the file (lazysecrets list may have +// loaded more since), from any goroutine. +func (m *Model) saveCache(f cachefile.File) func() error { + path, keep, now := m.cachePath, keepIn(m.byID), m.now() + return func() error { return cachefile.Save(path, f, keep, now) } } // persistTick saves the cache, and where lazysecrets is, in the @@ -169,8 +120,8 @@ func (m *Model) persistTick() tea.Cmd { cmds := []tea.Cmd{tea.Tick(persistEvery, func(time.Time) tea.Msg { return persistTickMsg{} })} if m.cacheDirty && m.cachePath != "" { m.cacheDirty = false - f, path := m.cacheSnapshot(), m.cachePath - cmds = append(cmds, func() tea.Msg { return persistedMsg{writeCacheFile(path, f)} }) + save := m.saveCache(m.cacheSnapshot()) + cmds = append(cmds, func() tea.Msg { return persistedMsg{save()} }) } if p, ok := m.place(); ok && m.placeDir != "" && p.Link != m.savedPlace { m.savedPlace = p.Link @@ -185,7 +136,7 @@ func (m *Model) persistTick() tea.Cmd { func (m Model) Persist() error { var errs []error if m.cachePath != "" { - errs = append(errs, writeCacheFile(m.cachePath, m.cacheSnapshot())) + errs = append(errs, m.saveCache(m.cacheSnapshot())()) } if m.placeDir != "" { if p, ok := m.place(); ok { diff --git a/internal/ui/app/persist_test.go b/internal/ui/app/persist_test.go index e1c1b6c..967152f 100644 --- a/internal/ui/app/persist_test.go +++ b/internal/ui/app/persist_test.go @@ -1,12 +1,14 @@ package app import ( + "encoding/json" "os" "path/filepath" "strings" "testing" "time" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/provider/fake" "git.kebcloud.no/keb/lazysecrets/internal/ref" @@ -80,15 +82,16 @@ func TestCacheFileDropsOldAndSignedOut(t *testing.T) { file := filepath.Join(t.TempDir(), "cache.json") az := fake.Azure(0) now := time.Now() - f := cacheFile{ - Version: cacheFileVersion, - Containers: map[string]stamped[[]provider.Container]{ - az.ID() + "|recent": {now.Add(-time.Hour), []provider.Container{{Name: "kv-recent"}}}, - az.ID() + "|old": {now.Add(-cacheMaxAge - time.Hour), []provider.Container{{Name: "kv-old"}}}, - "Azure:gone@x/t|recent": {now, []provider.Container{{Name: "kv-gone"}}}, + f := cachefile.File{ + Version: cachefile.Version, + Containers: map[string]cachefile.Stamped[[]provider.Container]{ + az.ID() + "|recent": {At: now.Add(-time.Hour), Value: []provider.Container{{Name: "kv-recent"}}}, + az.ID() + "|old": {At: now.Add(-cachefile.MaxAge - time.Hour), Value: []provider.Container{{Name: "kv-old"}}}, + "Azure:gone@x/t|recent": {At: now, Value: []provider.Container{{Name: "kv-gone"}}}, }, } - if err := writeCacheFile(file, f); err != nil { + b, _ := json.Marshal(f) // as an older lazysecrets left it + if err := os.WriteFile(file, b, 0o600); err != nil { t.Fatal(err) } d := newDriverOpts(t, Options{CacheFile: file}, az) @@ -97,7 +100,7 @@ func TestCacheFileDropsOldAndSignedOut(t *testing.T) { t.Error("dropped a recent entry") } if _, ok := c[az.ID()+"|old"]; ok { - t.Error("kept an entry older than cacheMaxAge") + t.Error("kept an entry older than cachefile.MaxAge") } if _, ok := c["Azure:gone@x/t|recent"]; ok { t.Error("kept an entry of an account that isn't signed in") diff --git a/internal/ui/app/route.go b/internal/ui/app/route.go index a57ff89..9c22a08 100644 --- a/internal/ui/app/route.go +++ b/internal/ui/app/route.go @@ -5,13 +5,14 @@ import ( "fmt" "slices" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" ) // containerKey identifies a container in the UI and caches. The same vault // seen through two accounts must not share cached lists, since each // account may see different things. -func containerKey(c provider.Container) string { return c.Source.Provider + "|" + c.ID } +func containerKey(c provider.Container) string { return cachefile.ContainerKey(c) } // providerFor finds the provider instance a source came from. Sources // remembered from an earlier run (favourites) may name an account that diff --git a/internal/ui/app/sources.go b/internal/ui/app/sources.go index 70ac125..45c38f9 100644 --- a/internal/ui/app/sources.go +++ b/internal/ui/app/sources.go @@ -6,6 +6,7 @@ import ( "slices" "strings" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/store" "git.kebcloud.no/keb/lazysecrets/internal/ui/icons" @@ -39,7 +40,7 @@ type sourceRow struct { // sourceRowKey joins a provider ID and a source ID. "|" doesn't occur in // either; provider IDs contain "/" (Azure:user/tenant). -func sourceRowKey(providerID, sourceID string) string { return providerID + "|" + sourceID } +func sourceRowKey(providerID, sourceID string) string { return cachefile.Row(providerID, sourceID) } func splitSourceRow(row string) (providerID, sourceID string) { providerID, sourceID, _ = strings.Cut(row, "|") -- 2.54.0 From e99462bd2145c9c51e95d1a4020861bf111b8687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 12:49:12 +0200 Subject: [PATCH 02/45] feat: lazysecrets list colours names from the theme, with icons --- cmd/lazysecrets/list.go | 55 +++++++++++++++++++++++++++++++----- cmd/lazysecrets/list_test.go | 25 ++++++++++++++++ cmd/lazysecrets/main.go | 3 +- docs/links.md | 10 +++++-- 4 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 cmd/lazysecrets/list_test.go diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 23cb504..7d9dc52 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -13,38 +13,50 @@ import ( "syscall" "time" + "charm.land/lipgloss/v2" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/listing" "git.kebcloud.no/keb/lazysecrets/internal/provider" + "git.kebcloud.no/keb/lazysecrets/internal/ui/icons" + "git.kebcloud.no/keb/lazysecrets/internal/ui/styles" ) // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --delimiter='\t' --with-nth=3 | cut -f1 +// lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=3 | cut -f1 +// +// The name is coloured from the theme, with the provider's icon (as in +// the TUI: --icons, LAZYSECRETS_ICONS, ui.icons); the link never is. // // What's cached prints at once; what's missing or older than --max-age // follows as it loads. Lists that can't be read are reported on stderr. -func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, args []string, out, errOut io.Writer) error { +func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out, errOut io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") format := fs.String("format", "text", "text: link, kind and name, tab-separated; json: an object per line") + color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") + iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") if err := fs.Parse(args); err != nil { return err } if fs.NArg() > 0 { return fmt.Errorf("usage: lazysecrets list [--cached] [--max-age 2m] [--format text|json]") } + if *color != "always" && *color != "never" { + return fmt.Errorf("--color: %q is not always or never", *color) + } + iconSet := icons.None + if *iconsOn { + iconSet = icons.NerdFont + } var write func(listing.Entry) error switch *format { case "text": write = func(e listing.Entry) error { - name := strings.Join(e.Path, " / ") - if e.Account != "" { - name += " · " + e.Account - } - _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Link, e.Kind, name) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Link, e.Kind, nameOf(e, theme, iconSet, *color == "always")) return err } case "json": @@ -95,3 +107,32 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi } return nil } + +// nameOf is an entry's name for the text format: the provider's icon, +// the path with the item's own name standing out, and the account. +func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) string { + render := func(st lipgloss.Style, s string) string { + if !color || s == "" { + return s + } + return st.Render(s) + } + kind := provider.Kind("") + for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { + if strings.EqualFold(string(k), e.Provider) { + kind = k + } + } + icon := iconSet.Prefix(kind) + var name string + if n := len(e.Path); n > 0 { + if n > 1 { + name = render(theme.Muted, strings.Join(e.Path[:n-1], " / ")+" / ") + } + name += e.Path[n-1] + } + if e.Account != "" { + name += render(theme.Muted, " · "+e.Account) + } + return render(theme.Kind(kind), strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name +} diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go new file mode 100644 index 0000000..dd5e6e2 --- /dev/null +++ b/cmd/lazysecrets/list_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "strings" + "testing" + + "git.kebcloud.no/keb/lazysecrets/internal/listing" + "git.kebcloud.no/keb/lazysecrets/internal/ui/icons" + "git.kebcloud.no/keb/lazysecrets/internal/ui/styles" +) + +func TestListNames(t *testing.T) { + e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-app-prod", "db-password"}, Account: "alice"} + if got := nameOf(e, styles.Default(), icons.None, false); got != "platform-prod / kv-app-prod / db-password · alice" { + t.Errorf("plain: %q", got) + } + got := nameOf(e, styles.Default(), icons.NerdFont, true) + if !strings.HasPrefix(got, "\x1b[") || !strings.Contains(got, icons.NerdFont.Azure) { + t.Errorf("no colour or icon: %q", got) + } + // The item's own name isn't muted with its path. + if !strings.Contains(got, "\x1b[mdb-password") { + t.Errorf("name not set apart: %q", got) + } +} diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 1ae7411..1194ad8 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -122,6 +122,7 @@ func run() error { lazysecrets [flags] get print the value a lazysecrets:// link points at, for scripts: VAR=$(lazysecrets get ) lazysecrets [flags] list [--cached] [--max-age 2m] [--format text|json] + [--color always|never] [--icons=false] print every source, vault and secret it can find, one per line, for fzf and pickers: what's cached at once, then what loads @@ -356,7 +357,7 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - return listCmd(providers, cachePath, timeoutFor, listArgs, os.Stdout, os.Stderr) + return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout, os.Stderr) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's diff --git a/docs/links.md b/docs/links.md index 5b9639b..171eb19 100644 --- a/docs/links.md +++ b/docs/links.md @@ -144,7 +144,7 @@ and its name, tab-separated. It's what Go to searches, so fzf, or an editor's picker, can search it instead: ```sh -lazysecrets list | fzf --delimiter='\t' --with-nth=3 \ +lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=3 \ --bind 'enter:become(lazysecrets open {1})' \ --bind 'ctrl-y:execute-silent(lazysecrets get {1} | pbcopy)' ``` @@ -156,7 +156,13 @@ Azure or Databricks, for an answer at once. Repos are always read, from disk. What it loads is cached for the TUI too. Lists it can't read are reported on stderr; it stops when the reader goes, after a pick in fzf. -`--format json` prints an object per line instead, for editor plugins: +The name is coloured from your [theme](config.md#theme), with the +provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf +shows the colours with `--ansi`. `--color never` leaves them out, for +scripts, and `--icons=false` the icons. The link is never coloured. + +`--format json` prints an object per line instead, for editor plugins, +without colours or icons: ```json {"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"alice"} -- 2.54.0 From baee1dfe615440ff05f2f6d4434a054abf28862a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 12:51:53 +0200 Subject: [PATCH 03/45] fix: lazysecrets list puts the name first, and keeps errors out of fzf --- cmd/lazysecrets/list.go | 22 +++++++++++++++------- cmd/lazysecrets/main.go | 10 ++++++++-- docs/links.md | 21 ++++++++++++--------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 7d9dc52..d305b15 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -25,23 +25,31 @@ import ( // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=3 | cut -f1 +// lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=1 | cut -f2 // -// The name is coloured from the theme, with the provider's icon (as in -// the TUI: --icons, LAZYSECRETS_ICONS, ui.icons); the link never is. +// Each line is the name, then the link: the name coloured from the theme, +// with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, +// ui.icons); the link never is. // // What's cached prints at once; what's missing or older than --max-age -// follows as it loads. Lists that can't be read are reported on stderr. -func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out, errOut io.Writer) error { +// follows as it loads. Lists that can't be read are reported to errOut: +// stderr when the output is on the terminal, nothing when it goes into +// fzf, whose screen they'd draw over; --errors reports them to stderr +// either way. +func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out, errOut, stderr io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: link, kind and name, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: name and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") + showErrors := fs.Bool("errors", false, "report lists that can't be read on stderr also when the output goes into a pipe") if err := fs.Parse(args); err != nil { return err } + if *showErrors { + errOut = stderr + } if fs.NArg() > 0 { return fmt.Errorf("usage: lazysecrets list [--cached] [--max-age 2m] [--format text|json]") } @@ -56,7 +64,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi switch *format { case "text": write = func(e listing.Entry) error { - _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Link, e.Kind, nameOf(e, theme, iconSet, *color == "always")) + _, err := fmt.Fprintf(out, "%s\t%s\n", nameOf(e, theme, iconSet, *color == "always"), e.Link) return err } case "json": diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 1194ad8..0ab683c 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -17,6 +17,7 @@ import ( "time" tea "charm.land/bubbletea/v2" + "golang.org/x/term" "git.kebcloud.no/keb/lazysecrets" "git.kebcloud.no/keb/lazysecrets/internal/commands" @@ -122,7 +123,7 @@ func run() error { lazysecrets [flags] get print the value a lazysecrets:// link points at, for scripts: VAR=$(lazysecrets get ) lazysecrets [flags] list [--cached] [--max-age 2m] [--format text|json] - [--color always|never] [--icons=false] + [--color always|never] [--icons=false] [--errors] print every source, vault and secret it can find, one per line, for fzf and pickers: what's cached at once, then what loads @@ -357,7 +358,12 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout, os.Stderr) + // Into a pipe (fzf), stderr would draw over what reads it. + errOut := io.Discard + if term.IsTerminal(int(os.Stdout.Fd())) { + errOut = os.Stderr + } + return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout, errOut, os.Stderr) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's diff --git a/docs/links.md b/docs/links.md index 171eb19..d14f235 100644 --- a/docs/links.md +++ b/docs/links.md @@ -139,22 +139,24 @@ a newline only on a terminal. ### Listing, for fzf and pickers `lazysecrets list` prints every source, vault and secret, one per line: -its link, its kind (`source`, `vault`, `secret`, `key`, `certificate`) -and its name, tab-separated. It's what Go to searches, so fzf, or an -editor's picker, can search it instead: +its name (`platform-prod / kv-app-prod / db-password`), then its link, +tab-separated. It's what Go to searches, so fzf, or an editor's picker, +can search it instead, showing the names and acting on the links: ```sh -lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=3 \ - --bind 'enter:become(lazysecrets open {1})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get {1} | pbcopy)' +lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=1 \ + --bind 'enter:become(lazysecrets open {2})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get {2} | pbcopy)' ``` What's [cached](config.md#cache) prints at once. Then, like Go to, it loads what's missing or older than `--max-age` (2m), and what's new in it follows as it arrives: fzf shows it while you type. `--cached` loads nothing from Azure or Databricks, for an answer at once. Repos are always read, from -disk. What it loads is cached for the TUI too. Lists it can't read are -reported on stderr; it stops when the reader goes, after a pick in fzf. +disk. What it loads is cached for the TUI too. It stops when the reader +goes, after a pick in fzf. Lists it can't read are reported on stderr when +it prints to the terminal; into a pipe they'd draw over fzf, so only with +`--errors`. The name is coloured from your [theme](config.md#theme), with the provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf @@ -162,7 +164,8 @@ shows the colours with `--ansi`. `--color never` leaves them out, for scripts, and `--icons=false` the icons. The link is never coloured. `--format json` prints an object per line instead, for editor plugins, -without colours or icons: +without colours or icons, with each entry's kind (`source`, `vault`, +`secret`, `key` or `certificate`): ```json {"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"alice"} -- 2.54.0 From 7b377fd468edeeef1f4eb605c9f19e6af9244b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:02:19 +0200 Subject: [PATCH 04/45] =?UTF-8?q?feat:=20lazysecrets=20list=20shows=20unre?= =?UTF-8?q?adable=20lists=20as=20red=20=E2=9C=97=20lines,=20and=20filters?= =?UTF-8?q?=20by=20kind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/lazysecrets/list.go | 59 +++++++++------ cmd/lazysecrets/list_test.go | 11 +++ cmd/lazysecrets/main.go | 12 +-- docs/links.md | 19 +++-- internal/listing/listing.go | 122 ++++++++++++++++++++++--------- internal/listing/listing_test.go | 55 +++++++++++--- 6 files changed, 197 insertions(+), 81 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index d305b15..9550fbc 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -9,6 +9,7 @@ import ( "io" "os" "os/signal" + "slices" "strings" "syscall" "time" @@ -32,26 +33,33 @@ import ( // ui.icons); the link never is. // // What's cached prints at once; what's missing or older than --max-age -// follows as it loads. Lists that can't be read are reported to errOut: -// stderr when the output is on the terminal, nothing when it goes into -// fzf, whose screen they'd draw over; --errors reports them to stderr -// either way. -func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out, errOut, stderr io.Writer) error { +// follows as it loads. A list that can't be read is a line too, as it +// fails: ✗, the vault or source, and why, in the theme's error colour. +// They're in the output rather than on stderr, which would draw over fzf. +func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") format := fs.String("format", "text", "text: name and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") - showErrors := fs.Bool("errors", false, "report lists that can't be read on stderr also when the output goes into a pipe") + kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") + showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { return err } - if *showErrors { - errOut = stderr - } if fs.NArg() > 0 { - return fmt.Errorf("usage: lazysecrets list [--cached] [--max-age 2m] [--format text|json]") + return fmt.Errorf("usage: lazysecrets list [--kind secret,…] [--cached] [--max-age 2m] [--format text|json]") + } + var only []string + for k := range strings.SplitSeq(*kinds, ",") { + if k = strings.TrimSpace(k); k == "" { + continue + } + if !slices.Contains(listing.Kinds, k) { + return fmt.Errorf("--kind: %q is not one of %s", k, strings.Join(listing.Kinds, ", ")) + } + only = append(only, k) } if *color != "always" && *color != "never" { return fmt.Errorf("--color: %q is not always or never", *color) @@ -80,6 +88,9 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi signal.Notify(make(chan os.Signal, 1), syscall.SIGPIPE) var gone error emit := func(e listing.Entry) error { + if e.Error != "" && !*showErrors { + return nil + } if err := write(e); err != nil { gone = err return err @@ -91,8 +102,8 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi if cachePath != "" { f = cachefile.Read(cachePath) } - f, errs := listing.Run(context.Background(), listing.Options{ - Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Timeout: timeout, + f = listing.Run(context.Background(), listing.Options{ + Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Kinds: only, Timeout: timeout, }, emit) if cachePath != "" && !*cached { byID := map[string]provider.Provider{} @@ -101,23 +112,18 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi } keep := func(id string) bool { p, ok := byID[id]; return ok && p.Kind() != provider.KindRepo } if err := cachefile.Save(cachePath, f, keep, time.Now()); err != nil { - errs = append(errs, err) + return err } } - if gone != nil { - if errors.Is(gone, syscall.EPIPE) { - return nil // the reader has what it wanted - } + if gone != nil && !errors.Is(gone, syscall.EPIPE) { return gone } - for _, err := range errs { - fmt.Fprintln(errOut, "lazysecrets: list:", err) - } - return nil + return nil // or the reader has what it wanted } // nameOf is an entry's name for the text format: the provider's icon, -// the path with the item's own name standing out, and the account. +// the path with the item's own name standing out, and the account. A +// list that couldn't be read has ✗ for the icon, and why after it. func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) string { render := func(st lipgloss.Style, s string) string { if !color || s == "" { @@ -132,6 +138,10 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) } } icon := iconSet.Prefix(kind) + iconStyle := theme.Kind(kind) + if e.Error != "" { + icon, iconStyle = "✗ ", theme.Error + } var name string if n := len(e.Path); n > 0 { if n > 1 { @@ -142,5 +152,8 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) if e.Account != "" { name += render(theme.Muted, " · "+e.Account) } - return render(theme.Kind(kind), strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name + if e.Error != "" { + name += " " + render(theme.Error, e.Error) + } + return render(iconStyle, strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index dd5e6e2..b823313 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -23,3 +23,14 @@ func TestListNames(t *testing.T) { t.Errorf("name not set apart: %q", got) } } + +func TestListErrorNames(t *testing.T) { + e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} + if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != "✗ platform-prod / kv-restricted 403 Forbidden" { + t.Errorf("plain: %q", got) + } + red := styles.Default().Error.Render("403 Forbidden") + if got := nameOf(e, styles.Default(), icons.NerdFont, true); !strings.HasSuffix(got, red) { + t.Errorf("why isn't in the error colour: %q", got) + } +} diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 0ab683c..edad365 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -17,7 +17,6 @@ import ( "time" tea "charm.land/bubbletea/v2" - "golang.org/x/term" "git.kebcloud.no/keb/lazysecrets" "git.kebcloud.no/keb/lazysecrets/internal/commands" @@ -122,8 +121,8 @@ func run() error { {{secrets/scope/key}} lazysecrets [flags] get print the value a lazysecrets:// link points at, for scripts: VAR=$(lazysecrets get ) - lazysecrets [flags] list [--cached] [--max-age 2m] [--format text|json] - [--color always|never] [--icons=false] [--errors] + lazysecrets [flags] list [--kind secret,…] [--cached] [--max-age 2m] [--format text|json] + [--color always|never] [--icons=false] [--errors=false] print every source, vault and secret it can find, one per line, for fzf and pickers: what's cached at once, then what loads @@ -358,12 +357,7 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - // Into a pipe (fzf), stderr would draw over what reads it. - errOut := io.Discard - if term.IsTerminal(int(os.Stdout.Fd())) { - errOut = os.Stderr - } - return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout, errOut, os.Stderr) + return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's diff --git a/docs/links.md b/docs/links.md index d14f235..7edbcdc 100644 --- a/docs/links.md +++ b/docs/links.md @@ -154,9 +154,18 @@ what's missing or older than `--max-age` (2m), and what's new in it follows as it arrives: fzf shows it while you type. `--cached` loads nothing from Azure or Databricks, for an answer at once. Repos are always read, from disk. What it loads is cached for the TUI too. It stops when the reader -goes, after a pick in fzf. Lists it can't read are reported on stderr when -it prints to the terminal; into a pipe they'd draw over fzf, so only with -`--errors`. +goes, after a pick in fzf. + +`--kind` lists only some kinds, comma-separated: `source`, `vault` (also +Databricks scopes and repo files), `secret`, `key`, `certificate`. Lists +only other kinds need aren't loaded: `--kind source,vault` asks for no +secrets. Keys and certificates load only when asked for this way; else, +like Go to, they're listed as far as you opened them in lazysecrets. + +A vault or source it can't read is a line too, as it fails: `✗`, its +name and why, in red (`errorColor`), with its link, so opening it shows +more. They're in the list, not on stderr, which would draw over fzf. +`--errors=false` leaves them out. The name is coloured from your [theme](config.md#theme), with the provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf @@ -164,8 +173,8 @@ shows the colours with `--ansi`. `--color never` leaves them out, for scripts, and `--icons=false` the icons. The link is never coloured. `--format json` prints an object per line instead, for editor plugins, -without colours or icons, with each entry's kind (`source`, `vault`, -`secret`, `key` or `certificate`): +without colours or icons, with each entry's kind, and `error` on a list +it couldn't read: ```json {"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"alice"} diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 2516d79..7012ce1 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -8,7 +8,6 @@ package listing import ( "cmp" "context" - "fmt" "slices" "strings" "time" @@ -21,6 +20,9 @@ import ( // Workers is how many lists load at once, as in Go to. const Workers = 4 +// Kinds are the kinds of entry, from sources down. +var Kinds = []string{"source", "vault", "secret", "key", "certificate"} + // Entry is a source, vault or item, by its lazysecrets:// link. type Entry struct { Link string `json:"link"` @@ -33,6 +35,10 @@ type Entry struct { Path []string `json:"path"` // Account is the az account it's seen through, when there are several. Account string `json:"account,omitempty"` + // Error says why a source's vaults or a vault's secrets couldn't be + // listed. The entry is then that source or vault, again, or with an + // account's sources unreadable, the account without a link. + Error string `json:"error,omitempty"` } type Options struct { @@ -42,15 +48,20 @@ type Options struct { // MaxAge: cached lists loaded longer ago are loaded again. MaxAge time.Duration // Cached lists only what's cached (and repos): nothing is loaded. - Cached bool + Cached bool + // Kinds are the kinds of entry to list (Kinds' names); none is all. + // Lists only needed for other kinds aren't loaded: sources and vaults + // alone don't load any secrets. Lists that fail are always listed. + Kinds []string Timeout func(provider.Kind) time.Duration Now func() time.Time } // Run lists everything, calling emit for each entry once, from this -// goroutine. An error from emit (the reader went away) stops it. It -// returns the cache with what was loaded, and the lists that couldn't be. -func Run(ctx context.Context, o Options, emit func(Entry) error) (cachefile.File, []error) { +// goroutine, and for each list that can't be loaded, as it fails. An +// error from emit (the reader went away) stops it. It returns the cache +// with what was loaded. +func Run(ctx context.Context, o Options, emit func(Entry) error) cachefile.File { ctx, cancel := context.WithCancel(ctx) defer cancel() l := &lister{o: o, emit: emit, seen: map[string]bool{}, pending: map[string]bool{}, results: make(chan result)} @@ -75,14 +86,15 @@ func Run(ctx context.Context, o Options, emit func(Entry) error) (cachefile.File cancel() } } - return l.o.Cache, l.errs + return l.o.Cache } type job struct { p provider.Provider src *provider.Source // list its vaults - c *provider.Container // list its secrets - key string // where the list is cached + c *provider.Container // list its secrets, keys or certificates (t) + t provider.ObjectType + key string // where the list is cached } type result struct { @@ -101,7 +113,6 @@ type lister struct { queue []job active int results chan result - errs []error stopped error // emit's error } @@ -131,36 +142,38 @@ func (l *lister) provider(p provider.Provider) { // source emits src, and what's cached under it, and queues what's not. func (l *lister) source(p provider.Provider, src provider.Source) { src.Provider, src.ProviderLabel = p.ID(), p.Label() - if r, err := ref.ForSource(src); err == nil { - l.put(p, Entry{Link: r.String(), Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, Account: accountOf(src)}) - } + l.put(p, sourceEntry(src)) row := cachefile.Row(p.ID(), src.ID) e, ok := l.o.Cache.Containers[row] if l.cacheable(p) && ok { l.containers(p, src, e.Value) } if l.load(p, ok, e.At) { - l.enqueue(job{p: p, src: &src, key: row}) + if l.wants("vault", "secret", "key", "certificate") { + l.enqueue(job{p: p, src: &src, key: row}) + } } } func (l *lister) containers(p provider.Provider, src provider.Source, cs []provider.Container) { for _, c := range sorted(cs, func(c provider.Container) string { return c.Name }) { c.Source = src - if r, err := ref.ForContainer(c, provider.TypeSecret); err == nil { - l.put(p, Entry{Link: r.String(), Kind: "vault", Provider: kindOf(src.Kind), Path: []string{src.Name, c.Name}, Account: accountOf(src)}) - } - key := cachefile.ObjectsKey(c, provider.TypeSecret) - e, ok := l.o.Cache.Objects[key] - if l.cacheable(p) { - // Keys and certificates only as far as they were opened in - // the TUI: Go to doesn't load them either. - for _, t := range []provider.ObjectType{provider.TypeSecret, provider.TypeKey, provider.TypeCertificate} { - l.objects(p, c, l.o.Cache.Objects[cachefile.ObjectsKey(c, t)].Value) + l.put(p, containerEntry(c)) + for _, t := range c.ObjectTypes() { + key := cachefile.ObjectsKey(c, t) + e, ok := l.o.Cache.Objects[key] + if l.cacheable(p) { + l.objects(p, c, e.Value) + } + // Keys and certificates load only when asked for; else, + // like Go to, only as far as the TUI opened them. + asked := l.wants(strings.ToLower(string(t))) + if t != provider.TypeSecret { + asked = len(l.o.Kinds) > 0 && asked + } + if asked && l.load(p, ok, e.At) { + l.enqueue(job{p: p, c: &c, t: t, key: key}) } - } - if l.load(p, ok, e.At) { - l.enqueue(job{p: p, c: &c, key: key}) } } } @@ -177,9 +190,29 @@ func (l *lister) objects(p provider.Provider, c provider.Container, objs []provi } } -// put emits e, unless it was already (or emitting has failed). +func sourceEntry(src provider.Source) Entry { + e := Entry{Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, Account: accountOf(src)} + if r, err := ref.ForSource(src); err == nil { + e.Link = r.String() + } + return e +} + +func containerEntry(c provider.Container) Entry { + e := Entry{Kind: "vault", Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name}, Account: accountOf(c.Source)} + if r, err := ref.ForContainer(c, provider.TypeSecret); err == nil { + e.Link = r.String() + } + return e +} + +// put emits e, unless it was already (or emitting has failed). Entries +// without a link (one couldn't be made) are left out, but not errors. func (l *lister) put(p provider.Provider, e Entry) { - id := p.ID() + "\x00" + e.Link + if (e.Link == "" || !l.wants(e.Kind)) && e.Error == "" { + return + } + id := p.ID() + "\x00" + e.Link + "\x00" + e.Error if l.stopped != nil || l.seen[id] { return } @@ -187,6 +220,19 @@ func (l *lister) put(p provider.Provider, e Entry) { l.stopped = l.emit(e) } +// wants reports whether any of kinds is listed. +func (l *lister) wants(kinds ...string) bool { + if len(l.o.Kinds) == 0 { + return true + } + for _, k := range kinds { + if slices.Contains(l.o.Kinds, k) { + return true + } + } + return false +} + func (l *lister) enqueue(j job) { if l.pending[j.key] { return @@ -211,7 +257,7 @@ func (l *lister) fetch(ctx context.Context, j job) result { r := result{job: j} switch { case j.c != nil: - r.objects, r.err = j.p.Objects(ctx, *j.c, provider.TypeSecret) + r.objects, r.err = j.p.Objects(ctx, *j.c, j.t) case j.src != nil: r.containers, r.err = j.p.Containers(ctx, *j.src) default: @@ -224,7 +270,7 @@ func (l *lister) handle(r result) { delete(l.pending, r.key) now := l.o.Now() if r.err != nil { - l.errs = append(l.errs, fmt.Errorf("%s: %w", r.label(), r.err)) + l.put(r.p, r.failed()) return } cache := l.cacheable(r.p) @@ -253,15 +299,21 @@ func (l *lister) handle(r result) { } } -// label names a list that couldn't be loaded. -func (r result) label() string { +// failed is the entry for a list that couldn't be loaded. +func (r result) failed() Entry { + var e Entry switch { case r.c != nil: - return r.c.Source.Name + " / " + r.c.Name + e = containerEntry(*r.c) case r.src != nil: - return r.src.Name + src := *r.src + src.Provider, src.ProviderLabel = r.p.ID(), r.p.Label() + e = sourceEntry(src) + default: + e = Entry{Kind: "source", Provider: kindOf(r.p.Kind()), Path: []string{r.p.Label()}} } - return r.p.Label() + e.Error = r.err.Error() + return e } func kindOf(k provider.Kind) string { return strings.ToLower(string(k)) } diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index ebac6dc..be61c74 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -34,18 +34,23 @@ func (c *counting) Objects(ctx context.Context, ct provider.Container, t provide return c.Provider.Objects(ctx, ct, t) } -func run(t *testing.T, o Options) ([]Entry, cachefile.File, []error) { +// run lists, returning the entries and, apart, the lists that failed. +func run(t *testing.T, o Options) ([]Entry, cachefile.File, []Entry) { t.Helper() if o.Cache.Version == 0 { o.Cache = cachefile.New() } o.Timeout = func(provider.Kind) time.Duration { return 5 * time.Second } - var got []Entry - f, errs := Run(context.Background(), o, func(e Entry) error { - got = append(got, e) + var got, failed []Entry + f := Run(context.Background(), o, func(e Entry) error { + if e.Error != "" { + failed = append(failed, e) + } else { + got = append(got, e) + } return nil }) - return got, f, errs + return got, f, failed } func has(es []Entry, kind, path string) bool { @@ -69,8 +74,8 @@ func TestListLoadsAndCaches(t *testing.T) { t.Errorf("no %s %s", want[0], want[1]) } } - if len(errs) != 1 || !strings.Contains(errs[0].Error(), "kv-restricted: 403") { - t.Errorf("errs = %v", errs) + if len(errs) != 1 || errs[0].Kind != "vault" || errs[0].Path[1] != "kv-restricted" || !strings.Contains(errs[0].Error, "403") || errs[0].Link == "" { + t.Errorf("failed = %+v", errs) } seen := map[string]bool{} for _, e := range got { @@ -160,10 +165,14 @@ func TestListStopsWhenTheReaderGoes(t *testing.T) { t.Parallel() gone := errors.New("broken pipe") n := 0 - _, errs := Run(context.Background(), Options{ + var errs []Entry + Run(context.Background(), Options{ Providers: []provider.Provider{fake.Azure(0), fake.Repos()}, Cache: cachefile.New(), MaxAge: time.Minute, Timeout: func(provider.Kind) time.Duration { return time.Second }, - }, func(Entry) error { + }, func(e Entry) error { + if e.Error != "" { + errs = append(errs, e) + } n++ if n == 2 { return gone @@ -174,3 +183,31 @@ func TestListStopsWhenTheReaderGoes(t *testing.T) { t.Errorf("emitted %d after the reader went, errs %v", n, errs) } } + +func TestListKinds(t *testing.T) { + t.Parallel() + // Sources only: nothing under them is asked for. + az := &counting{Provider: fake.Azure(0)} + got, _, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute, Kinds: []string{"source"}}) + if len(got) == 0 || az.calls.Load() != 1 { + t.Errorf("%d sources, %d requests, want just the sources'", len(got), az.calls.Load()) + } + for _, e := range got { + if e.Kind != "source" { + t.Errorf("listed a %s", e.Kind) + } + } + // Keys, asked for: loaded, though Go to wouldn't; no secrets. + got, _, failed := run(t, Options{Providers: []provider.Provider{fake.Azure(0)}, MaxAge: time.Minute, Kinds: []string{"key"}}) + if !has(got, "key", "platform-prod/kv-app-prod/signing-key") { + t.Errorf("no keys: %+v", got) + } + for _, e := range got { + if e.Kind != "key" { + t.Errorf("listed a %s", e.Kind) + } + } + if len(failed) == 0 { + t.Error("a list that failed wasn't listed") + } +} -- 2.54.0 From 24b38d7321500102278d99b36afadce73bf85f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:13:23 +0200 Subject: [PATCH 05/45] fix: lazysecrets list keeps each entry on one line, errors to their first --- cmd/lazysecrets/list.go | 5 ++++- internal/listing/listing.go | 14 +++++++++++++- internal/listing/listing_test.go | 12 ++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 9550fbc..78bad5e 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -72,7 +72,8 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi switch *format { case "text": write = func(e listing.Entry) error { - _, err := fmt.Fprintf(out, "%s\t%s\n", nameOf(e, theme, iconSet, *color == "always"), e.Link) + // A tab or line break in a name would break the line up. + _, err := fmt.Fprintf(out, "%s\t%s\n", oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Link) return err } case "json": @@ -121,6 +122,8 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi return nil // or the reader has what it wanted } +var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") + // nameOf is an entry's name for the text format: the provider's icon, // the path with the item's own name standing out, and the account. A // list that couldn't be read has ✗ for the icon, and why after it. diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 7012ce1..9a06717 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -312,10 +312,22 @@ func (r result) failed() Entry { default: e = Entry{Kind: "source", Provider: kindOf(r.p.Kind()), Path: []string{r.p.Label()}} } - e.Error = r.err.Error() + e.Error = firstLine(r.err.Error()) return e } +// firstLine is an error's first line, the summary (Azure's go on with +// the caller's IDs and more): an entry is one line. Tabs, which would +// split it into columns, are spaces. +func firstLine(s string) string { + for line := range strings.Lines(s) { + if line = strings.TrimSpace(line); line != "" { + return strings.ReplaceAll(line, "\t", " ") + } + } + return "unreadable" +} + func kindOf(k provider.Kind) string { return strings.ToLower(string(k)) } // accountOf is the account part of a source's provider label ("alice" in diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index be61c74..9908d24 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -211,3 +211,15 @@ func TestListKinds(t *testing.T) { t.Error("a list that failed wasn't listed") } } + +func TestErrorsAreOneLine(t *testing.T) { + for in, want := range map[string]string{ + "403 Forbidden: Caller is not authorized\nCaller: appid=x;oid=y\nVault: kv;location=z": "403 Forbidden: Caller is not authorized", + "\n timeout\tafter 30s\n": "timeout after 30s", + "": "unreadable", + } { + if got := firstLine(in); got != want { + t.Errorf("firstLine(%q) = %q, want %q", in, got, want) + } + } +} -- 2.54.0 From 3734989b1546c7107a425c4a1ddab0ea2029fab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:18:33 +0200 Subject: [PATCH 06/45] fix: lazysecrets list keeps the provider icon on error lines --- cmd/lazysecrets/list.go | 12 ++++-------- cmd/lazysecrets/list_test.go | 4 ++-- docs/links.md | 6 +++--- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 78bad5e..d7b0dc5 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -34,7 +34,7 @@ import ( // // What's cached prints at once; what's missing or older than --max-age // follows as it loads. A list that can't be read is a line too, as it -// fails: ✗, the vault or source, and why, in the theme's error colour. +// fails: the vault or source, then ✗ and why in the theme's error colour. // They're in the output rather than on stderr, which would draw over fzf. func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) @@ -126,7 +126,7 @@ var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") // nameOf is an entry's name for the text format: the provider's icon, // the path with the item's own name standing out, and the account. A -// list that couldn't be read has ✗ for the icon, and why after it. +// list that couldn't be read has ✗ and why after it. func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) string { render := func(st lipgloss.Style, s string) string { if !color || s == "" { @@ -141,10 +141,6 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) } } icon := iconSet.Prefix(kind) - iconStyle := theme.Kind(kind) - if e.Error != "" { - icon, iconStyle = "✗ ", theme.Error - } var name string if n := len(e.Path); n > 0 { if n > 1 { @@ -156,7 +152,7 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) name += render(theme.Muted, " · "+e.Account) } if e.Error != "" { - name += " " + render(theme.Error, e.Error) + name += " " + render(theme.Error, "✗ "+e.Error) } - return render(iconStyle, strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name + return render(theme.Kind(kind), strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index b823313..e6137fd 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -26,10 +26,10 @@ func TestListNames(t *testing.T) { func TestListErrorNames(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} - if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != "✗ platform-prod / kv-restricted 403 Forbidden" { + if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != icons.NerdFont.Azure+" platform-prod / kv-restricted ✗ 403 Forbidden" { t.Errorf("plain: %q", got) } - red := styles.Default().Error.Render("403 Forbidden") + red := styles.Default().Error.Render("✗ 403 Forbidden") if got := nameOf(e, styles.Default(), icons.NerdFont, true); !strings.HasSuffix(got, red) { t.Errorf("why isn't in the error colour: %q", got) } diff --git a/docs/links.md b/docs/links.md index 7edbcdc..1c4e6e6 100644 --- a/docs/links.md +++ b/docs/links.md @@ -162,9 +162,9 @@ only other kinds need aren't loaded: `--kind source,vault` asks for no secrets. Keys and certificates load only when asked for this way; else, like Go to, they're listed as far as you opened them in lazysecrets. -A vault or source it can't read is a line too, as it fails: `✗`, its -name and why, in red (`errorColor`), with its link, so opening it shows -more. They're in the list, not on stderr, which would draw over fzf. +A vault or source it can't read is a line too, as it fails: its name, +then `✗` and why in red (`errorColor`), with its link, so opening it +shows more. They're in the list, not on stderr, which would draw over fzf. `--errors=false` leaves them out. The name is coloured from your [theme](config.md#theme), with the -- 2.54.0 From 572cea8351dd5c8d25d5fbfaacdbb47ca5f10c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:29:59 +0200 Subject: [PATCH 07/45] docs: the fzf example for lazysecrets list hides the link and binds open and copy --- cmd/lazysecrets/list.go | 2 +- docs/links.md | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index d7b0dc5..9e0ae91 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -26,7 +26,7 @@ import ( // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=1 | cut -f2 +// lazysecrets list | fzf --ansi --with-nth='..-2' --accept-nth=-1 // // Each line is the name, then the link: the name coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, diff --git a/docs/links.md b/docs/links.md index 1c4e6e6..b771b7a 100644 --- a/docs/links.md +++ b/docs/links.md @@ -144,11 +144,18 @@ tab-separated. It's what Go to searches, so fzf, or an editor's picker, can search it instead, showing the names and acting on the links: ```sh -lazysecrets list | fzf --ansi --delimiter='\t' --with-nth=1 \ - --bind 'enter:become(lazysecrets open {2})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get {2} | pbcopy)' +lazysecrets list | fzf --ansi --with-nth='..-2' --accept-nth=-1 \ + --bind 'ctrl-o:become(lazysecrets open {-1})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get {-1} | pbcopy)' ``` +`--with-nth='..-2'` shows and searches the names, leaving out the link, +the last field; `{-1}` and `--accept-nth=-1` are the link. `enter` prints +it (`lazysecrets get $(…)`), `ctrl-o` opens it in lazysecrets and `ctrl-y` +copies the value (`pbcopy` on macOS; `wl-copy` or `xclip` on Linux). A +value copied this way isn't cleared from the clipboard after +`values.clipboardClear`, as one copied in lazysecrets is. + What's [cached](config.md#cache) prints at once. Then, like Go to, it loads what's missing or older than `--max-age` (2m), and what's new in it follows as it arrives: fzf shows it while you type. `--cached` loads nothing from -- 2.54.0 From 1f330bc619b3a23aecf7010ea03b5fd739a1cce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:31:48 +0200 Subject: [PATCH 08/45] feat: lazysecrets list's text lines start with the kind --- cmd/lazysecrets/list.go | 10 ++++++---- docs/links.md | 11 +++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 9e0ae91..5097392 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -26,9 +26,11 @@ import ( // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --ansi --with-nth='..-2' --accept-nth=-1 +// lazysecrets list | fzf --ansi --with-nth='2..-2' --accept-nth=-1 // -// Each line is the name, then the link: the name coloured from the theme, +// Each line is the kind, the name and the link, tab-separated (the kind +// a word, the link without spaces, so even fields split on spaces keep +// them first and last): the name coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, // ui.icons); the link never is. // @@ -40,7 +42,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: name and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, name and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") @@ -73,7 +75,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi case "text": write = func(e listing.Entry) error { // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\n", oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Kind, oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Link) return err } case "json": diff --git a/docs/links.md b/docs/links.md index b771b7a..47f71b0 100644 --- a/docs/links.md +++ b/docs/links.md @@ -139,18 +139,21 @@ a newline only on a terminal. ### Listing, for fzf and pickers `lazysecrets list` prints every source, vault and secret, one per line: -its name (`platform-prod / kv-app-prod / db-password`), then its link, +its kind (`source`, `vault`, `secret`, `key` or `certificate`), its name +(`platform-prod / kv-app-prod / db-password`) and its link, tab-separated. It's what Go to searches, so fzf, or an editor's picker, can search it instead, showing the names and acting on the links: ```sh -lazysecrets list | fzf --ansi --with-nth='..-2' --accept-nth=-1 \ +lazysecrets list | fzf --ansi --with-nth='2..-2' --accept-nth=-1 \ --bind 'ctrl-o:become(lazysecrets open {-1})' \ --bind 'ctrl-y:execute-silent(lazysecrets get {-1} | pbcopy)' ``` -`--with-nth='..-2'` shows and searches the names, leaving out the link, -the last field; `{-1}` and `--accept-nth=-1` are the link. `enter` prints +`--with-nth='2..-2'` shows and searches the names, leaving out the kind, +the first field, and the link, the last; `{-1}` and `--accept-nth=-1` are +the link. The kind is one word and the link has no spaces, so this works +without `--delimiter`. To filter by kind yourself: `awk -F'\t' '$1 == "secret"'`. `enter` prints it (`lazysecrets get $(…)`), `ctrl-o` opens it in lazysecrets and `ctrl-y` copies the value (`pbcopy` on macOS; `wl-copy` or `xclip` on Linux). A value copied this way isn't cleared from the clipboard after -- 2.54.0 From b05d19209cbdce7b88a190d2fade99160f3a7ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:47:31 +0200 Subject: [PATCH 09/45] feat: lazysecrets list prints the account, and open and get take it (--account) --- cmd/lazysecrets/get.go | 9 ++++-- cmd/lazysecrets/list.go | 16 +++++------ cmd/lazysecrets/list_test.go | 2 +- cmd/lazysecrets/main.go | 29 +++++++++++++++---- docs/links.md | 54 +++++++++++++++++++++-------------- internal/listing/listing.go | 15 ++++++---- internal/ref/ref.go | 4 +++ internal/ui/app/links.go | 18 ++++++++++++ internal/ui/app/links_test.go | 14 +++++++++ 9 files changed, 118 insertions(+), 43 deletions(-) diff --git a/cmd/lazysecrets/get.go b/cmd/lazysecrets/get.go index 7eff320..b02f192 100644 --- a/cmd/lazysecrets/get.go +++ b/cmd/lazysecrets/get.go @@ -37,10 +37,15 @@ func value(ctx context.Context, providers []provider.Provider, st *store.Store, return v, err } -// readKey is value, also returning the version read. +// readKey is value, also returning the version read. The account asked +// for (--account) goes first, else the one that last read it. func readKey(ctx context.Context, providers []provider.Provider, st *store.Store, r ref.Ref) (provider.SecretValue, string, error) { key := r key.Version = "" node := st.Node(key.String()) - return ref.Read(ctx, providers, r, node.Account, node.Source) + account, source := node.Account, node.Source + if r.Account != "" && r.Account != account { + account, source = r.Account, "" + } + return ref.Read(ctx, providers, r, account, source) } diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 5097392..2b26f46 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -26,11 +26,11 @@ import ( // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --ansi --with-nth='2..-2' --accept-nth=-1 +// lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 // -// Each line is the kind, the name and the link, tab-separated (the kind -// a word, the link without spaces, so even fields split on spaces keep -// them first and last): the name coloured from the theme, +// Each line is the kind, the name, the account and the link, +// tab-separated (all but the name one word each, so even fields split on +// spaces keep them first and last): the name coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, // ui.icons); the link never is. // @@ -42,7 +42,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, name and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, name, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") @@ -75,7 +75,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi case "text": write = func(e listing.Entry) error { // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\t%s\n", e.Kind, oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\n", e.Kind, oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Account, e.Link) return err } case "json": @@ -150,8 +150,8 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) } name += e.Path[n-1] } - if e.Account != "" { - name += render(theme.Muted, " · "+e.Account) + if e.AccountLabel != "" { + name += render(theme.Muted, " · "+e.AccountLabel) } if e.Error != "" { name += " " + render(theme.Error, "✗ "+e.Error) diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index e6137fd..3791044 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -10,7 +10,7 @@ import ( ) func TestListNames(t *testing.T) { - e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-app-prod", "db-password"}, Account: "alice"} + e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-app-prod", "db-password"}, AccountLabel: "alice"} if got := nameOf(e, styles.Default(), icons.None, false); got != "platform-prod / kv-app-prod / db-password · alice" { t.Errorf("plain: %q", got) } diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index edad365..a0f214b 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -89,6 +89,22 @@ func cmpOr(a, b string) string { return b } +// refArg parses get's and open's arguments: a reference, and optionally +// the account to use when several could (lazysecrets list's column). +func refArg(cmd string, args []string) (ref.Ref, error) { + fs := flag.NewFlagSet(cmd, flag.ContinueOnError) + account := fs.String("account", "", "the account to use when several could, as lazysecrets list prints it") + if err := fs.Parse(args); err != nil { + return ref.Ref{}, err + } + if fs.NArg() != 1 { + return ref.Ref{}, fmt.Errorf("usage: lazysecrets %s [--account ] ", cmd) + } + r, err := ref.Parse(fs.Arg(0)) + r.Account = *account + return r, err +} + // defaultConfigPath is $LAZYSECRETS_CONFIG_FILE, else config.yaml in the // config directory. func defaultConfigPath() string { @@ -115,11 +131,12 @@ func run() error { flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), `Usage: lazysecrets [flags] browse secrets - lazysecrets [flags] [open] + lazysecrets [flags] [open [--account ]] open a lazysecrets:// link (also a share link), Key Vault URL, @Microsoft.KeyVault(...) or {{secrets/scope/key}} - lazysecrets [flags] get print the value a lazysecrets:// link points at, + lazysecrets [flags] get [--account ] + print the value a lazysecrets:// link points at, for scripts: VAR=$(lazysecrets get ) lazysecrets [flags] list [--kind secret,…] [--cached] [--max-age 2m] [--format text|json] [--color always|never] [--icons=false] [--errors=false] @@ -163,8 +180,8 @@ Flags: listArgs = append([]string{}, args[1:]...) // not nil: listing case len(args) == 1 && args[0] == "keybindings": printKeys = true - case len(args) == 2 && args[0] == "get": - r, err := ref.Parse(args[1]) + case len(args) > 0 && args[0] == "get": + r, err := refArg("get", args[1:]) if err != nil { return err } @@ -176,8 +193,8 @@ Flags: case len(args) > 0 && args[0] == "update": return updateCmd(*configPath, args[1:]) case len(args) == 0: - case args[0] == "open" && len(args) == 2: - r, err := ref.Parse(args[1]) + case args[0] == "open" && len(args) >= 2: + r, err := refArg("open", args[1:]) if err != nil { return err } diff --git a/docs/links.md b/docs/links.md index 47f71b0..01dd0fc 100644 --- a/docs/links.md +++ b/docs/links.md @@ -138,26 +138,39 @@ a newline only on a terminal. ### Listing, for fzf and pickers -`lazysecrets list` prints every source, vault and secret, one per line: -its kind (`source`, `vault`, `secret`, `key` or `certificate`), its name -(`platform-prod / kv-app-prod / db-password`) and its link, -tab-separated. It's what Go to searches, so fzf, or an editor's picker, -can search it instead, showing the names and acting on the links: +`lazysecrets list` prints every source, vault and secret, one per line, +tab-separated: + +| Field | | +|---|---| +| kind | `source`, `vault`, `secret`, `key` or `certificate` | +| name | `platform-prod / kv-app-prod / db-password` | +| account | what it's listed through: an az account (`Azure:/`), `Databricks` or `Repos` | +| link | its `lazysecrets://` link | + +It's what Go to searches, so fzf, or an editor's picker, can search it +instead, showing the names and acting on the links: ```sh -lazysecrets list | fzf --ansi --with-nth='2..-2' --accept-nth=-1 \ - --bind 'ctrl-o:become(lazysecrets open {-1})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get {-1} | pbcopy)' +lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ + --bind 'ctrl-o:become(lazysecrets open --account {-2} {-1})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)' ``` -`--with-nth='2..-2'` shows and searches the names, leaving out the kind, -the first field, and the link, the last; `{-1}` and `--accept-nth=-1` are -the link. The kind is one word and the link has no spaces, so this works -without `--delimiter`. To filter by kind yourself: `awk -F'\t' '$1 == "secret"'`. `enter` prints -it (`lazysecrets get $(…)`), `ctrl-o` opens it in lazysecrets and `ctrl-y` -copies the value (`pbcopy` on macOS; `wl-copy` or `xclip` on Linux). A -value copied this way isn't cleared from the clipboard after -`values.clipboardClear`, as one copied in lazysecrets is. +`--with-nth='2..-3'` shows and searches only the names; `{-1}` and +`--accept-nth=-1` are the link, `{-2}` the account. All but the name are +one word, so this works without `--delimiter`. To filter by kind +yourself: `awk -F'\t' '$1 == "secret"'`. + +`enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in +lazysecrets and `ctrl-y` copies the value (`pbcopy` on macOS; `wl-copy` or +`xclip` on Linux). A value copied this way isn't cleared from the +clipboard after `values.clipboardClear`, as one copied in lazysecrets is. + +`--account` makes `open` and `get` use the account it was listed through, +when several of yours can see it: without, `open` asks which, and `get` +tries the one that last read it first. The link stays as it is, to copy +and share; the account isn't part of it. What's [cached](config.md#cache) prints at once. Then, like Go to, it loads what's missing or older than `--max-age` (2m), and what's new in it follows @@ -183,15 +196,14 @@ shows the colours with `--ansi`. `--color never` leaves them out, for scripts, and `--icons=false` the icons. The link is never coloured. `--format json` prints an object per line instead, for editor plugins, -without colours or icons, with each entry's kind, and `error` on a list -it couldn't read: +without colours or icons, and with `error` on a list it couldn't read: ```json -{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"alice"} +{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"Azure:alice@example.com/","accountLabel":"alice"} ``` -`account` is there when several az accounts are signed in. Values are never -listed. +`accountLabel`, the account's short name, is there when several az +accounts are signed in. Values are never listed. ## From the browser and chat diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 9a06717..8d9fe7f 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -33,8 +33,12 @@ type Entry struct { Provider string `json:"provider"` // Path names it: its source's, vault's and own names. Path []string `json:"path"` - // Account is the az account it's seen through, when there are several. - Account string `json:"account,omitempty"` + // Account is the provider it's listed through: an az account + // (Azure:/), Databricks or Repos. lazysecrets open and + // get take it (--account) to use that account when several could. + Account string `json:"account"` + // AccountLabel names the az account, when there are several. + AccountLabel string `json:"accountLabel,omitempty"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -186,12 +190,12 @@ func (l *lister) objects(p provider.Provider, c provider.Container, objs []provi continue } l.put(p, Entry{Link: r.String(), Kind: strings.ToLower(string(o.Type)), Provider: kindOf(c.Source.Kind), - Path: []string{c.Source.Name, c.Name, o.Name}, Account: accountOf(c.Source)}) + Path: []string{c.Source.Name, c.Name, o.Name}, AccountLabel: accountOf(c.Source)}) } } func sourceEntry(src provider.Source) Entry { - e := Entry{Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, Account: accountOf(src)} + e := Entry{Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, AccountLabel: accountOf(src)} if r, err := ref.ForSource(src); err == nil { e.Link = r.String() } @@ -199,7 +203,7 @@ func sourceEntry(src provider.Source) Entry { } func containerEntry(c provider.Container) Entry { - e := Entry{Kind: "vault", Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name}, Account: accountOf(c.Source)} + e := Entry{Kind: "vault", Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name}, AccountLabel: accountOf(c.Source)} if r, err := ref.ForContainer(c, provider.TypeSecret); err == nil { e.Link = r.String() } @@ -212,6 +216,7 @@ func (l *lister) put(p provider.Provider, e Entry) { if (e.Link == "" || !l.wants(e.Kind)) && e.Error == "" { return } + e.Account = p.ID() id := p.ID() + "\x00" + e.Link + "\x00" + e.Error if l.stopped != nil || l.seen[id] { return diff --git a/internal/ref/ref.go b/internal/ref/ref.go index df5ff2b..d6fdc82 100644 --- a/internal/ref/ref.go +++ b/internal/ref/ref.go @@ -56,6 +56,10 @@ type Ref struct { // Share is a share link's sealed files, as in the link; the other // fields are empty. Package share reads it. Share string + // Account, when set, is the provider (its ID) to open or read it + // with when several could, from lazysecrets list. It isn't part of + // the link. + Account string } // IsShare reports whether r is a share link. diff --git a/internal/ui/app/links.go b/internal/ui/app/links.go index 3063558..87220fc 100644 --- a/internal/ui/app/links.go +++ b/internal/ui/app/links.go @@ -218,6 +218,9 @@ func (m *Model) openSource(r ref.Ref) { } } } + if row, ok := preferredRow(r, choices); ok { + choices = []choice{{sourceRow: row}} + } switch len(choices) { case 0: m.flash = flash{text: "open: " + describeRef(r) + " isn't in your sources", isErr: true} @@ -410,6 +413,10 @@ func (m *Model) handleResolved(msg resolvedMsg) { for _, row := range append([]string{msg.sourceRow}, msg.others...) { choices = append(choices, choice{label: "Open with " + m.sourceLabel(row), sourceRow: row}) } + if row, ok := preferredRow(msg.ref, choices); ok { + m.startLinkNav(msg.ref, msg.act, row) + return + } m.chooseSource("Several accounts can see "+msg.ref.ContainerName(), msg.ref, msg.act, choices, true) case msg.linked != nil: m.addLinked(*msg.linked) @@ -419,6 +426,17 @@ func (m *Model) handleResolved(msg resolvedMsg) { } } +// preferredRow is the choice under the account the reference asks for +// (ref.Ref.Account), if it's one of them. +func preferredRow(r ref.Ref, choices []choice) (string, bool) { + for _, c := range choices { + if r.Account != "" && providerOf(c.sourceRow) == r.Account { + return c.sourceRow, true + } + } + return "", false +} + // startLinkNav opens a link: like startNav, ending on its object's // details. func (m *Model) startLinkNav(r ref.Ref, act linkAction, sourceRow string) { diff --git a/internal/ui/app/links_test.go b/internal/ui/app/links_test.go index 2ae1846..d57d0d7 100644 --- a/internal/ui/app/links_test.go +++ b/internal/ui/app/links_test.go @@ -305,6 +305,20 @@ func TestOpenAsksWhichAccount(t *testing.T) { t.Errorf("j enter picked %q", c.Source.Provider) } + // lazysecrets open --account: no question, that account. + r, _ := ref.Parse("lazysecrets://azure/" + kv + "/secrets/api-key") + r.Account = "Azure:bob@example.com/t1" + d.send(OpenLink(r)) + if d.m.prompt != nil && d.m.prompt.title == "Open link" { + d.keys("o") + } + if strings.Contains(d.screen(), "Several accounts can see") { + t.Fatalf("asked, with an account given:\n%s", d.screen()) + } + if c, _ := d.m.containers.Selected(); c.Source.Provider != r.Account { + t.Errorf("--account opened via %q", c.Source.Provider) + } + // Opening into a folded account unfolds it. d.keys("1", "g") // alice's header d.keys("enter") // fold it -- 2.54.0 From a4002a785c1aa9bb99165eadad26fe40f4187f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:51:50 +0200 Subject: [PATCH 10/45] feat: lazysecrets open --action goes, copies or shows without asking --- cmd/lazysecrets/main.go | 32 ++++++++++++++++++++++---------- docs/links.md | 9 +++++++-- internal/ui/app/app.go | 30 +++++++++++++++++++++++------- internal/ui/app/links_test.go | 13 +++++++++++++ 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index a0f214b..223cd85 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -90,19 +90,29 @@ func cmpOr(a, b string) string { } // refArg parses get's and open's arguments: a reference, and optionally -// the account to use when several could (lazysecrets list's column). -func refArg(cmd string, args []string) (ref.Ref, error) { +// the account to use when several could (lazysecrets list's column) and, +// for open, what to do with it rather than asking (--action). +func refArg(cmd string, args []string) (r ref.Ref, action string, err error) { fs := flag.NewFlagSet(cmd, flag.ContinueOnError) account := fs.String("account", "", "the account to use when several could, as lazysecrets list prints it") + usage := "usage: lazysecrets get [--account ] " + act := new(string) + if cmd == "open" { + act = fs.String("action", "", "do this rather than ask: go (to it), copy (go, and copy its value) or show (go, and show it)") + usage = "usage: lazysecrets open [--account ] [--action go|copy|show] " + } if err := fs.Parse(args); err != nil { - return ref.Ref{}, err + return r, "", err } if fs.NArg() != 1 { - return ref.Ref{}, fmt.Errorf("usage: lazysecrets %s [--account ] ", cmd) + return r, "", errors.New(usage) } - r, err := ref.Parse(fs.Arg(0)) + if _, ok := app.OpenActions[*act]; *act != "" && !ok { + return r, "", fmt.Errorf("--action: %q is not go, copy or show", *act) + } + r, err = ref.Parse(fs.Arg(0)) r.Account = *account - return r, err + return r, *act, err } // defaultConfigPath is $LAZYSECRETS_CONFIG_FILE, else config.yaml in the @@ -131,7 +141,7 @@ func run() error { flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), `Usage: lazysecrets [flags] browse secrets - lazysecrets [flags] [open [--account ]] + lazysecrets [flags] [open [--account ] [--action go|copy|show]] open a lazysecrets:// link (also a share link), Key Vault URL, @Microsoft.KeyVault(...) or {{secrets/scope/key}} @@ -168,6 +178,7 @@ Flags: } var open, getRef *ref.Ref + var openAction string var shareArgs, listArgs []string printKeys := false switch args := flag.Args(); { @@ -181,7 +192,7 @@ Flags: case len(args) == 1 && args[0] == "keybindings": printKeys = true case len(args) > 0 && args[0] == "get": - r, err := refArg("get", args[1:]) + r, _, err := refArg("get", args[1:]) if err != nil { return err } @@ -194,11 +205,11 @@ Flags: return updateCmd(*configPath, args[1:]) case len(args) == 0: case args[0] == "open" && len(args) >= 2: - r, err := refArg("open", args[1:]) + r, act, err := refArg("open", args[1:]) if err != nil { return err } - open = &r + open, openAction = &r, act case len(args) == 1 && looksLikeRef(args[0]): // lazysecrets , like lazysecrets open r, err := ref.Parse(args[0]) @@ -464,6 +475,7 @@ Flags: ShareKey: cfg.Sharing.Key, ShareRules: shareRules(cfg), Open: open, + OpenAction: openAction, Styles: &theme, DefaultFg: defaultFg, }) diff --git a/docs/links.md b/docs/links.md index 01dd0fc..562ae36 100644 --- a/docs/links.md +++ b/docs/links.md @@ -121,6 +121,9 @@ account) and jumps to it, asking which account to use when several can see it, ending on a secret's details as `enter` on it would. Links say what, not what to do: opening a link to a secret asks whether to just go to it, also copy or show its value, or (`y`) copy its value without going there. +`lazysecrets open --action go|copy|show ` does one without asking, +and `--account ` picks the account (as [`list`](#listing-for-fzf-and-pickers) +prints it) when several can see it. ## In scripts @@ -153,7 +156,7 @@ instead, showing the names and acting on the links: ```sh lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ - --bind 'ctrl-o:become(lazysecrets open --account {-2} {-1})' \ + --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)' ``` @@ -170,7 +173,9 @@ clipboard after `values.clipboardClear`, as one copied in lazysecrets is. `--account` makes `open` and `get` use the account it was listed through, when several of yours can see it: without, `open` asks which, and `get` tries the one that last read it first. The link stays as it is, to copy -and share; the account isn't part of it. +and share; the account isn't part of it. `--action` tells `open` what to +do rather than asking, as it does for a link clicked elsewhere: `go` to +it, `copy` its value too, or `show` it. What's [cached](config.md#cache) prints at once. Then, like Go to, it loads what's missing or older than `--max-age` (2m), and what's new in it follows diff --git a/internal/ui/app/app.go b/internal/ui/app/app.go index 37fc60e..048ba89 100644 --- a/internal/ui/app/app.go +++ b/internal/ui/app/app.go @@ -133,6 +133,9 @@ type Options struct { NoHistory bool // Open is a reference to open at startup (lazysecrets open ). Open *ref.Ref + // OpenAction, if set, is what to do with Open, rather than asking: + // go to it, and maybe copy or show its value (OpenActions). + OpenAction string // Styles, if set, replaces the default theme (styles.FromTheme), and // DefaultFg the terminal's default text colour. Styles *styles.Styles @@ -283,6 +286,7 @@ type Model struct { prompt *modal // popup that has the keyboard linked []provider.Container // vaults opened from links, this session open *ref.Ref // reference to open at startup + openAction string // and what to do with it, or ask shareKey string // the config's sharing.key shareRules share.Rules // and sharing.keyRules @@ -447,7 +451,7 @@ func New(providers []provider.Provider, opts Options) Model { } m.defaultFg = opts.DefaultFg m.help = newHelp(m.st) - m.open = opts.Open + m.open, m.openAction = opts.Open, opts.OpenAction saved := m.store.Layout() m.split, m.heights = saved.Split, saved.Heights @@ -521,18 +525,26 @@ func (m Model) Init() tea.Cmd { cmds = append(cmds, m.fetchLatest(false)) } if m.open != nil { - r := *m.open - cmds = append(cmds, func() tea.Msg { return openRefMsg{r} }) + msg := openRefMsg{ref: *m.open, action: m.openAction} + cmds = append(cmds, func() tea.Msg { return msg }) } return tea.Batch(cmds...) } -// openRefMsg starts opening a reference from outside the key handler. -type openRefMsg struct{ ref ref.Ref } +// openRefMsg starts opening a reference from outside the key handler: +// asking what to do with it, or doing action (OpenActions). +type openRefMsg struct { + ref ref.Ref + action string +} + +// OpenActions are what lazysecrets open --action takes, the Open link +// menu's choices that go there. +var OpenActions = map[string]linkAction{"go": actGo, "copy": actCopy, "show": actShow} // OpenLink is a message offering r in the Open link popup, for links // handed over by the link handler (Program.Send). -func OpenLink(r ref.Ref) tea.Msg { return openRefMsg{r} } +func OpenLink(r ref.Ref) tea.Msg { return openRefMsg{ref: r} } func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmds []tea.Cmd @@ -589,7 +601,11 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case openRefMsg: m.deferHandlerSetup() // the link first - cmds = append(cmds, m.offerRef("Open link", msg.ref, false)) + if act, ok := OpenActions[msg.action]; ok && !msg.ref.IsShare() { + cmds = append(cmds, m.openRef(msg.ref, act)) + } else { + cmds = append(cmds, m.offerRef("Open link", msg.ref, false)) + } case resolvedMsg: m.handleResolved(msg) diff --git a/internal/ui/app/links_test.go b/internal/ui/app/links_test.go index d57d0d7..a5f5071 100644 --- a/internal/ui/app/links_test.go +++ b/internal/ui/app/links_test.go @@ -206,6 +206,19 @@ func TestOpenPromptAndStartupOpen(t *testing.T) { if _, _, s := d2.selected(); s != "api-key" { t.Errorf("open at startup: selected %q", s) } + + // --action: no question, it does that. + d3 := newDriverOpts(t, Options{Open: &r, OpenAction: "go"}) + if d3.m.prompt != nil { + t.Fatalf("--action go asked: %q", d3.m.prompt.title) + } + if _, _, s := d3.selected(); s != "api-key" { + t.Errorf("--action go: selected %q", s) + } + d4 := newDriverOpts(t, Options{Open: &r, OpenAction: "copy"}) + if _, _, s := d4.selected(); s != "api-key" || d4.clip().content == "" { + t.Errorf("--action copy: selected %q, copied %q", s, d4.clip().content) + } } func TestShareLinks(t *testing.T) { -- 2.54.0 From bdf949339bf26a99d37dc0b2f966490346a4451b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 13:55:38 +0200 Subject: [PATCH 11/45] feat: lazysecrets open --action ends in the secrets list, like Go to --- docs/links.md | 6 +++-- internal/ui/app/app.go | 5 ++-- internal/ui/app/links.go | 45 ++++++++++++++++++++++++++++------- internal/ui/app/links_test.go | 8 +++---- 4 files changed, 48 insertions(+), 16 deletions(-) diff --git a/docs/links.md b/docs/links.md index 562ae36..80d3326 100644 --- a/docs/links.md +++ b/docs/links.md @@ -121,7 +121,8 @@ account) and jumps to it, asking which account to use when several can see it, ending on a secret's details as `enter` on it would. Links say what, not what to do: opening a link to a secret asks whether to just go to it, also copy or show its value, or (`y`) copy its value without going there. -`lazysecrets open --action go|copy|show ` does one without asking, +`lazysecrets open --action go|copy|show ` does one without asking +and ends in the list, like Go to, and `--account ` picks the account (as [`list`](#listing-for-fzf-and-pickers) prints it) when several can see it. @@ -175,7 +176,8 @@ when several of yours can see it: without, `open` asks which, and `get` tries the one that last read it first. The link stays as it is, to copy and share; the account isn't part of it. `--action` tells `open` what to do rather than asking, as it does for a link clicked elsewhere: `go` to -it, `copy` its value too, or `show` it. +it, `copy` its value too, or `show` it. It ends in the secrets list, like +Go to, rather than on the details as a clicked link does. What's [cached](config.md#cache) prints at once. Then, like Go to, it loads what's missing or older than `--max-age` (2m), and what's new in it follows diff --git a/internal/ui/app/app.go b/internal/ui/app/app.go index 048ba89..da6abdc 100644 --- a/internal/ui/app/app.go +++ b/internal/ui/app/app.go @@ -134,7 +134,8 @@ type Options struct { // Open is a reference to open at startup (lazysecrets open ). Open *ref.Ref // OpenAction, if set, is what to do with Open, rather than asking: - // go to it, and maybe copy or show its value (OpenActions). + // go to it, and maybe copy or show its value (OpenActions). It ends in + // the list, like Go to, rather than on the details. OpenAction string // Styles, if set, replaces the default theme (styles.FromTheme), and // DefaultFg the terminal's default text colour. @@ -602,7 +603,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case openRefMsg: m.deferHandlerSetup() // the link first if act, ok := OpenActions[msg.action]; ok && !msg.ref.IsShare() { - cmds = append(cmds, m.openRef(msg.ref, act)) + cmds = append(cmds, m.findRef(msg.ref, act)) } else { cmds = append(cmds, m.offerRef("Open link", msg.ref, false)) } diff --git a/internal/ui/app/links.go b/internal/ui/app/links.go index 87220fc..465e936 100644 --- a/internal/ui/app/links.go +++ b/internal/ui/app/links.go @@ -56,9 +56,12 @@ type resolvedMsg struct { act linkAction sourceRow string others []string // other accounts' rows that also found the vault - choices []choice // several candidates: ask - linked *provider.Container - err error + // find ends in the list, like Go to, not on the details: opened by a + // tool that found it (lazysecrets open --action, from fzf). + find bool + choices []choice // several candidates: ask + linked *provider.Container + err error } type choice struct { @@ -407,22 +410,22 @@ func (m *Model) handleResolved(msg resolvedMsg) { for i := range msg.choices { msg.choices[i].label = "Open in " + msg.choices[i].label } - m.chooseSource("Scope "+msg.ref.Scope+" is in several workspaces", msg.ref, msg.act, msg.choices, true) + m.chooseSource("Scope "+msg.ref.Scope+" is in several workspaces", msg.ref, msg.act, msg.choices, !msg.find) case len(msg.others) > 0: var choices []choice for _, row := range append([]string{msg.sourceRow}, msg.others...) { choices = append(choices, choice{label: "Open with " + m.sourceLabel(row), sourceRow: row}) } if row, ok := preferredRow(msg.ref, choices); ok { - m.startLinkNav(msg.ref, msg.act, row) + m.navResolved(msg, row) return } - m.chooseSource("Several accounts can see "+msg.ref.ContainerName(), msg.ref, msg.act, choices, true) + m.chooseSource("Several accounts can see "+msg.ref.ContainerName(), msg.ref, msg.act, choices, !msg.find) case msg.linked != nil: m.addLinked(*msg.linked) - m.startLinkNav(msg.ref, msg.act, linksRowID) + m.navResolved(msg, linksRowID) default: - m.startLinkNav(msg.ref, msg.act, msg.sourceRow) + m.navResolved(msg, msg.sourceRow) } } @@ -437,6 +440,32 @@ func preferredRow(r ref.Ref, choices []choice) (string, bool) { return "", false } +// navResolved goes to what a resolved link points at, under row. +func (m *Model) navResolved(msg resolvedMsg, row string) { + if msg.find { + m.startNav(msg.ref, msg.act, row) + return + } + m.startLinkNav(msg.ref, msg.act, row) +} + +// findRef is openRef ending in the list, like Go to: for a link a tool +// found (lazysecrets open --action). +func (m *Model) findRef(r ref.Ref, act linkAction) tea.Cmd { + cmd := m.openRef(r, act) + if cmd == nil { + return nil + } + return func() tea.Msg { + msg := cmd() + if rm, ok := msg.(resolvedMsg); ok { + rm.find = true + return rm + } + return msg + } +} + // startLinkNav opens a link: like startNav, ending on its object's // details. func (m *Model) startLinkNav(r ref.Ref, act linkAction, sourceRow string) { diff --git a/internal/ui/app/links_test.go b/internal/ui/app/links_test.go index a5f5071..f5c4d99 100644 --- a/internal/ui/app/links_test.go +++ b/internal/ui/app/links_test.go @@ -203,8 +203,8 @@ func TestOpenPromptAndStartupOpen(t *testing.T) { t.Fatal("open at startup didn't ask what to do") } d2.keys("o") - if _, _, s := d2.selected(); s != "api-key" { - t.Errorf("open at startup: selected %q", s) + if _, _, s := d2.selected(); s != "api-key" || d2.m.focus != paneDetail { + t.Errorf("open at startup: selected %q, focus %v, want the details", s, d2.m.focus) } // --action: no question, it does that. @@ -212,8 +212,8 @@ func TestOpenPromptAndStartupOpen(t *testing.T) { if d3.m.prompt != nil { t.Fatalf("--action go asked: %q", d3.m.prompt.title) } - if _, _, s := d3.selected(); s != "api-key" { - t.Errorf("--action go: selected %q", s) + if _, _, s := d3.selected(); s != "api-key" || d3.m.focus != paneSecrets { + t.Errorf("--action go: selected %q, focus %v, want the secrets list, like Go to", s, d3.m.focus) } d4 := newDriverOpts(t, Options{Open: &r, OpenAction: "copy"}) if _, _, s := d4.selected(); s != "api-key" || d4.clip().content == "" { -- 2.54.0 From e8d3a3337a6a0cac1ed9607554afeeba70fb60af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:10:37 +0200 Subject: [PATCH 12/45] docs: the fzf example copies and closes on ctrl-y, copies and stays on alt-y --- docs/links.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/links.md b/docs/links.md index 80d3326..43cd5fc 100644 --- a/docs/links.md +++ b/docs/links.md @@ -157,8 +157,10 @@ instead, showing the names and acting on the links: ```sh lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ + --header 'enter: link · ctrl-o: open · ctrl-y: copy value · alt-y: copy, stay' \ --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)' + --bind 'ctrl-y:become(lazysecrets get --account {-2} {-1} | pbcopy)' \ + --bind 'alt-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' ``` `--with-nth='2..-3'` shows and searches only the names; `{-1}` and @@ -167,7 +169,8 @@ one word, so this works without `--delimiter`. To filter by kind yourself: `awk -F'\t' '$1 == "secret"'`. `enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in -lazysecrets and `ctrl-y` copies the value (`pbcopy` on macOS; `wl-copy` or +lazysecrets, `ctrl-y` copies the value and closes fzf, and `alt-y` copies +it and stays, saying so in the header (`pbcopy` on macOS; `wl-copy` or `xclip` on Linux). A value copied this way isn't cleared from the clipboard after `values.clipboardClear`, as one copied in lazysecrets is. -- 2.54.0 From 470f0c11e4f5c8ea8a9b47ec4611823acc9ae495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:13:25 +0200 Subject: [PATCH 13/45] docs: the fzf example copies on ctrl-y and copies and closes on ctrl-x --- docs/links.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/links.md b/docs/links.md index 43cd5fc..c619d56 100644 --- a/docs/links.md +++ b/docs/links.md @@ -157,10 +157,10 @@ instead, showing the names and acting on the links: ```sh lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ - --header 'enter: link · ctrl-o: open · ctrl-y: copy value · alt-y: copy, stay' \ + --header 'enter: link · ctrl-o: open · ctrl-y: copy value · ctrl-x: copy and close' \ --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ - --bind 'ctrl-y:become(lazysecrets get --account {-2} {-1} | pbcopy)' \ - --bind 'alt-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' + --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' \ + --bind 'ctrl-x:become(lazysecrets get --account {-2} {-1} | pbcopy)' ``` `--with-nth='2..-3'` shows and searches only the names; `{-1}` and @@ -169,9 +169,9 @@ one word, so this works without `--delimiter`. To filter by kind yourself: `awk -F'\t' '$1 == "secret"'`. `enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in -lazysecrets, `ctrl-y` copies the value and closes fzf, and `alt-y` copies -it and stays, saying so in the header (`pbcopy` on macOS; `wl-copy` or -`xclip` on Linux). A value copied this way isn't cleared from the +lazysecrets, `ctrl-y` copies the value, saying so in the header, and +`ctrl-x` copies it and closes fzf (`pbcopy` on macOS; `wl-copy` or `xclip` +on Linux). A value copied this way isn't cleared from the clipboard after `values.clipboardClear`, as one copied in lazysecrets is. `--account` makes `open` and `get` use the account it was listed through, -- 2.54.0 From b0ea217d8746535ce882ed77399690e92e6fd38d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:21:47 +0200 Subject: [PATCH 14/45] docs: get and list move to their own page, integration.md --- README.md | 8 ++-- docs/config.md | 2 +- docs/integration.md | 97 +++++++++++++++++++++++++++++++++++++++++++++ docs/links.md | 91 +----------------------------------------- 4 files changed, 104 insertions(+), 94 deletions(-) create mode 100644 docs/integration.md diff --git a/README.md b/README.md index 4d4a4e9..1f04d24 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ A terminal UI for finding, reading and sharing secrets. Inspired by the fantasti copied values are cleared from the clipboard after 30 seconds. - **Scriptable**: `lazysecrets get ` prints a value for scripts and pipes, and `lazysecrets list` everything it can find, for fzf and editor - pickers. + pickers ([integration](docs/integration.md)). - **Favourites**: star the secrets you use most for easy access. - **Expiry warnings**: secrets, keys and certificates that expire soon are marked, listed together in the status pane. @@ -87,8 +87,10 @@ use most: - [Azure Key Vault](docs/azure.md): accounts, permissions, pinned vaults - [Databricks](docs/databricks.md): profiles and Key Vault-backed scopes - [SOPS and .env files](docs/repos.md): which repos and files, decrypting -- [Links](docs/links.md): sharing, opening, `lazysecrets get` and `list` in scripts, - and opening links from the browser and chat +- [Links](docs/links.md): sharing, opening, and opening links from the + browser and chat +- [Integration](docs/integration.md): `lazysecrets get` in scripts, and + `lazysecrets list` for fzf and editor pickers - [Custom commands](docs/custom-commands.md): run your own commands on a secret - [Config](docs/config.md): every option, themes, layered configs, the diff --git a/docs/config.md b/docs/config.md index d5d9740..70fd2f2 100644 --- a/docs/config.md +++ b/docs/config.md @@ -140,7 +140,7 @@ you: the Sources lists, vaults and scopes, and secrets' names and metadata once, and anything older than two minutes reloads in the background when you go to it, or when Go to searches it. While it does, the pane's bottom border says how old what it shows is (`cached 3h ago`). Revealing -and copying always fetch the value live. [`lazysecrets list`](links.md#listing-for-fzf-and-pickers) +and copying always fetch the value live. [`lazysecrets list`](integration.md#listing-for-fzf-and-pickers) reads it and adds to it too. Lists not loaded for 30 days are dropped, and so is everything from an diff --git a/docs/integration.md b/docs/integration.md new file mode 100644 index 0000000..2a5c207 --- /dev/null +++ b/docs/integration.md @@ -0,0 +1,97 @@ +# Integration + +lazysecrets works outside its own window too: `lazysecrets get` reads a +value for scripts, and `lazysecrets list` lists everything for fzf, editor +pickers and your own tools. Both take the [links](links.md) lazysecrets +copies and shares. For Neovim, there's +[lazysecrets.nvim](https://github.com/karleinarb/lazysecrets.nvim). + +## Reading a value + +`lazysecrets get ` prints the value, for scripts and pipes: + +```sh +export DB_PASSWORD=$(lazysecrets get lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password) +lazysecrets get lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password | kubectl create secret generic db --from-file=password=/dev/stdin +``` + +It reads the value directly, with your az accounts (the one that last read +it first), the Databricks profile for the workspace, or sops in your clone +of the repo; a version in the link reads that version. `--account` tries +that account first, as [`list`](#listing-for-fzf-and-pickers) prints it. +The value ends with a newline only on a terminal. + +## Listing, for fzf and pickers + +`lazysecrets list` prints every source, vault and secret, one per line, +tab-separated: + +| Field | | +|---|---| +| kind | `source`, `vault`, `secret`, `key` or `certificate` | +| name | `platform-prod / kv-app-prod / db-password` | +| account | what it's listed through: an az account (`Azure:/`), `Databricks` or `Repos` | +| link | its `lazysecrets://` link | + +It's what Go to searches, so fzf, or an editor's picker, can search it +instead, showing the names and acting on the links: + +```sh +lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ + --header 'enter: link · ctrl-o: open · ctrl-y: copy value · ctrl-x: copy and close' \ + --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' \ + --bind 'ctrl-x:become(lazysecrets get --account {-2} {-1} | pbcopy)' +``` + +`--with-nth='2..-3'` shows and searches only the names; `{-1}` and +`--accept-nth=-1` are the link, `{-2}` the account. All but the name are +one word, so this works without `--delimiter`. To filter by kind +yourself: `awk -F'\t' '$1 == "secret"'`. + +`enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in +lazysecrets, `ctrl-y` copies the value, saying so in the header, and +`ctrl-x` copies it and closes fzf (`pbcopy` on macOS; `wl-copy` or `xclip` +on Linux). A value copied this way isn't cleared from the +clipboard after `values.clipboardClear`, as one copied in lazysecrets is. + +`--account` makes `open` and `get` use the account it was listed through, +when several of yours can see it: without, `open` asks which, and `get` +tries the one that last read it first. The link stays as it is, to copy +and share; the account isn't part of it. `--action` tells `open` what to +do rather than asking, as it does for a link clicked elsewhere: `go` to +it, `copy` its value too, or `show` it. It ends in the secrets list, like +Go to, rather than on the details as a clicked link does. + +What's [cached](config.md#cache) prints at once. Then, like Go to, it loads +what's missing or older than `--max-age` (2m), and what's new in it follows +as it arrives: fzf shows it while you type. `--cached` loads nothing from +Azure or Databricks, for an answer at once. Repos are always read, from +disk. What it loads is cached for the TUI too. It stops when the reader +goes, after a pick in fzf. + +`--kind` lists only some kinds, comma-separated: `source`, `vault` (also +Databricks scopes and repo files), `secret`, `key`, `certificate`. Lists +only other kinds need aren't loaded: `--kind source,vault` asks for no +secrets. Keys and certificates load only when asked for this way; else, +like Go to, they're listed as far as you opened them in lazysecrets. + +A vault or source it can't read is a line too, as it fails: its name, +then `✗` and why in red (`errorColor`), with its link, so opening it +shows more. They're in the list, not on stderr, which would draw over fzf. +`--errors=false` leaves them out. + +The name is coloured from your [theme](config.md#theme), with the +provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf +shows the colours with `--ansi`. `--color never` leaves them out, for +scripts, and `--icons=false` the icons. The link is never coloured. + +`--format json` prints an object per line instead, for editor plugins, +without colours or icons, and with `error` on a list it couldn't read: + +```json +{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"Azure:alice@example.com/","accountLabel":"alice"} +``` + +`accountLabel`, the account's short name, is there when several az +accounts are signed in. Values are never listed. diff --git a/docs/links.md b/docs/links.md index c619d56..53139f5 100644 --- a/docs/links.md +++ b/docs/links.md @@ -123,98 +123,9 @@ not what to do: opening a link to a secret asks whether to just go to it, also copy or show its value, or (`y`) copy its value without going there. `lazysecrets open --action go|copy|show ` does one without asking and ends in the list, like Go to, -and `--account ` picks the account (as [`list`](#listing-for-fzf-and-pickers) +and `--account ` picks the account (as [`list`](integration.md#listing-for-fzf-and-pickers) prints it) when several can see it. -## In scripts - -`lazysecrets get ` prints the value, for scripts and pipes: - -```sh -export DB_PASSWORD=$(lazysecrets get lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password) -lazysecrets get lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password | kubectl create secret generic db --from-file=password=/dev/stdin -``` - -It reads the value directly, with your az accounts (the one that last read -it first), the Databricks profile for the workspace, or sops in your clone -of the repo; a version in the link reads that version. The value ends with -a newline only on a terminal. - -### Listing, for fzf and pickers - -`lazysecrets list` prints every source, vault and secret, one per line, -tab-separated: - -| Field | | -|---|---| -| kind | `source`, `vault`, `secret`, `key` or `certificate` | -| name | `platform-prod / kv-app-prod / db-password` | -| account | what it's listed through: an az account (`Azure:/`), `Databricks` or `Repos` | -| link | its `lazysecrets://` link | - -It's what Go to searches, so fzf, or an editor's picker, can search it -instead, showing the names and acting on the links: - -```sh -lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ - --header 'enter: link · ctrl-o: open · ctrl-y: copy value · ctrl-x: copy and close' \ - --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' \ - --bind 'ctrl-x:become(lazysecrets get --account {-2} {-1} | pbcopy)' -``` - -`--with-nth='2..-3'` shows and searches only the names; `{-1}` and -`--accept-nth=-1` are the link, `{-2}` the account. All but the name are -one word, so this works without `--delimiter`. To filter by kind -yourself: `awk -F'\t' '$1 == "secret"'`. - -`enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in -lazysecrets, `ctrl-y` copies the value, saying so in the header, and -`ctrl-x` copies it and closes fzf (`pbcopy` on macOS; `wl-copy` or `xclip` -on Linux). A value copied this way isn't cleared from the -clipboard after `values.clipboardClear`, as one copied in lazysecrets is. - -`--account` makes `open` and `get` use the account it was listed through, -when several of yours can see it: without, `open` asks which, and `get` -tries the one that last read it first. The link stays as it is, to copy -and share; the account isn't part of it. `--action` tells `open` what to -do rather than asking, as it does for a link clicked elsewhere: `go` to -it, `copy` its value too, or `show` it. It ends in the secrets list, like -Go to, rather than on the details as a clicked link does. - -What's [cached](config.md#cache) prints at once. Then, like Go to, it loads -what's missing or older than `--max-age` (2m), and what's new in it follows -as it arrives: fzf shows it while you type. `--cached` loads nothing from -Azure or Databricks, for an answer at once. Repos are always read, from -disk. What it loads is cached for the TUI too. It stops when the reader -goes, after a pick in fzf. - -`--kind` lists only some kinds, comma-separated: `source`, `vault` (also -Databricks scopes and repo files), `secret`, `key`, `certificate`. Lists -only other kinds need aren't loaded: `--kind source,vault` asks for no -secrets. Keys and certificates load only when asked for this way; else, -like Go to, they're listed as far as you opened them in lazysecrets. - -A vault or source it can't read is a line too, as it fails: its name, -then `✗` and why in red (`errorColor`), with its link, so opening it -shows more. They're in the list, not on stderr, which would draw over fzf. -`--errors=false` leaves them out. - -The name is coloured from your [theme](config.md#theme), with the -provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf -shows the colours with `--ansi`. `--color never` leaves them out, for -scripts, and `--icons=false` the icons. The link is never coloured. - -`--format json` prints an object per line instead, for editor plugins, -without colours or icons, and with `error` on a list it couldn't read: - -```json -{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"Azure:alice@example.com/","accountLabel":"alice"} -``` - -`accountLabel`, the account's short name, is there when several az -accounts are signed in. Values are never listed. - ## From the browser and chat ```sh -- 2.54.0 From 50156d706e31928770e9fa0cdc20a120af8b68c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:34:49 +0200 Subject: [PATCH 15/45] feat: lazysecrets list puts why a list failed in a column of its own --- cmd/lazysecrets/list.go | 28 ++++++++++++++++++---------- cmd/lazysecrets/list_test.go | 13 +++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 2b26f46..5a787b9 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -28,9 +28,10 @@ import ( // // lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 // -// Each line is the kind, the name, the account and the link, -// tab-separated (all but the name one word each, so even fields split on -// spaces keep them first and last): the name coloured from the theme, +// Each line is the kind, the name, why it couldn't be read (empty unless +// it failed), the account and the link, tab-separated: kind, account and +// link are one word each, so even fields split on spaces keep them first +// and last two. The name is coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, // ui.icons); the link never is. // @@ -42,7 +43,7 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, name, account and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, name, error, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") @@ -75,7 +76,9 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi case "text": write = func(e listing.Entry) error { // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\n", e.Kind, oneLine.Replace(nameOf(e, theme, iconSet, *color == "always")), e.Account, e.Link) + name := nameOf(e, theme, iconSet, *color == "always") + why := errorOf(e, theme, *color == "always") + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\n", e.Kind, oneLine.Replace(name), oneLine.Replace(why), e.Account, e.Link) return err } case "json": @@ -126,9 +129,17 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") +// errorOf is why a list couldn't be read, or "": with colour, a red ✗ +// before it, as the TUI marks lists it can't read. +func errorOf(e listing.Entry, theme styles.Styles, color bool) string { + if e.Error == "" || !color { + return e.Error + } + return theme.Error.Render("✗ " + e.Error) +} + // nameOf is an entry's name for the text format: the provider's icon, -// the path with the item's own name standing out, and the account. A -// list that couldn't be read has ✗ and why after it. +// the path with the item's own name standing out, and the account. func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) string { render := func(st lipgloss.Style, s string) string { if !color || s == "" { @@ -153,8 +164,5 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) if e.AccountLabel != "" { name += render(theme.Muted, " · "+e.AccountLabel) } - if e.Error != "" { - name += " " + render(theme.Error, "✗ "+e.Error) - } return render(theme.Kind(kind), strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 3791044..6694b82 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -26,11 +26,16 @@ func TestListNames(t *testing.T) { func TestListErrorNames(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} - if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != icons.NerdFont.Azure+" platform-prod / kv-restricted ✗ 403 Forbidden" { + if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != icons.NerdFont.Azure+" platform-prod / kv-restricted" { + t.Errorf("the name has more: %q", got) + } + if got := errorOf(e, styles.Default(), false); got != "403 Forbidden" { t.Errorf("plain: %q", got) } - red := styles.Default().Error.Render("✗ 403 Forbidden") - if got := nameOf(e, styles.Default(), icons.NerdFont, true); !strings.HasSuffix(got, red) { - t.Errorf("why isn't in the error colour: %q", got) + if got := errorOf(e, styles.Default(), true); got != styles.Default().Error.Render("✗ 403 Forbidden") { + t.Errorf("why isn't a red ✗: %q", got) + } + if got := errorOf(listing.Entry{}, styles.Default(), true); got != "" { + t.Errorf("no error: %q", got) } } -- 2.54.0 From 77e3fcd551010420db76a149dd7e55de596e7fbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:44:50 +0200 Subject: [PATCH 16/45] feat: lazysecrets list marks starred and recent entries, and --starred-icon shows the stars --- cmd/lazysecrets/list.go | 23 ++++++++++++++++++++++- cmd/lazysecrets/list_test.go | 12 ++++++++++++ cmd/lazysecrets/main.go | 2 +- internal/listing/listing.go | 12 +++++++++++- internal/listing/listing_test.go | 28 ++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 5a787b9..6ed3421 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -19,6 +19,7 @@ import ( "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/listing" "git.kebcloud.no/keb/lazysecrets/internal/provider" + "git.kebcloud.no/keb/lazysecrets/internal/store" "git.kebcloud.no/keb/lazysecrets/internal/ui/icons" "git.kebcloud.no/keb/lazysecrets/internal/ui/styles" ) @@ -39,13 +40,14 @@ import ( // follows as it loads. A list that can't be read is a line too, as it // fails: the vault or source, then ✗ and why in the theme's error colour. // They're in the output rather than on stderr, which would draw over fzf. -func listCmd(providers []provider.Provider, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out io.Writer) error { +func listCmd(providers []provider.Provider, st *store.Store, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") format := fs.String("format", "text", "text: kind, name, error, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") + starIcon := fs.Bool("starred-icon", false, "put ★ before starred names, in the theme's favouriteColor (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -77,6 +79,9 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi write = func(e listing.Entry) error { // A tab or line break in a name would break the line up. name := nameOf(e, theme, iconSet, *color == "always") + if *starIcon { + name = starOf(e, theme, *color == "always") + name + } why := errorOf(e, theme, *color == "always") _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\n", e.Kind, oneLine.Replace(name), oneLine.Replace(why), e.Account, e.Link) return err @@ -110,6 +115,10 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi } f = listing.Run(context.Background(), listing.Options{ Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Kinds: only, Timeout: timeout, + Mark: func(link, account string) (bool, bool) { + n := st.Node(link) + return n.StarredFor(account), !n.LastUsed.IsZero() + }, }, emit) if cachePath != "" && !*cached { byID := map[string]provider.Provider{} @@ -129,6 +138,18 @@ func listCmd(providers []provider.Provider, cachePath string, timeout func(provi var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") +// starOf is ★ for a starred entry, as the TUI marks them, and spaces +// the same width for the rest, so names line up. +func starOf(e listing.Entry, theme styles.Styles, color bool) string { + switch { + case !e.Starred: + return " " + case color: + return theme.Favourite.Render("★") + " " + } + return "★ " +} + // errorOf is why a list couldn't be read, or "": with colour, a red ✗ // before it, as the TUI marks lists it can't read. func errorOf(e listing.Entry, theme styles.Styles, color bool) string { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 6694b82..85aac78 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -39,3 +39,15 @@ func TestListErrorNames(t *testing.T) { t.Errorf("no error: %q", got) } } + +func TestListStars(t *testing.T) { + if got := starOf(listing.Entry{Starred: true}, styles.Default(), false); got != "★ " { + t.Errorf("starred: %q", got) + } + if got := starOf(listing.Entry{}, styles.Default(), true); got != " " { + t.Errorf("not starred: %q, want spaces as wide as ★", got) + } + if got := starOf(listing.Entry{Starred: true}, styles.Default(), true); got != styles.Default().Favourite.Render("★")+" " { + t.Errorf("not in the favourite colour: %q", got) + } +} diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 223cd85..302faed 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -385,7 +385,7 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - return listCmd(providers, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout) + return listCmd(providers, st, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 8d9fe7f..41fed54 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -39,6 +39,10 @@ type Entry struct { Account string `json:"account"` // AccountLabel names the az account, when there are several. AccountLabel string `json:"accountLabel,omitempty"` + // Starred is starred for this account; Recent is used lately (Recent, + // R, in the TUI). + Starred bool `json:"starred"` + Recent bool `json:"recent"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -56,7 +60,10 @@ type Options struct { // Kinds are the kinds of entry to list (Kinds' names); none is all. // Lists only needed for other kinds aren't loaded: sources and vaults // alone don't load any secrets. Lists that fail are always listed. - Kinds []string + Kinds []string + // Mark tells whether the entry with link is starred for account, and + // used lately; nil marks nothing. + Mark func(link, account string) (starred, recent bool) Timeout func(provider.Kind) time.Duration Now func() time.Time } @@ -217,6 +224,9 @@ func (l *lister) put(p provider.Provider, e Entry) { return } e.Account = p.ID() + if l.o.Mark != nil && e.Link != "" { + e.Starred, e.Recent = l.o.Mark(e.Link, e.Account) + } id := p.ID() + "\x00" + e.Link + "\x00" + e.Error if l.stopped != nil || l.seen[id] { return diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index 9908d24..8945d45 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -223,3 +223,31 @@ func TestErrorsAreOneLine(t *testing.T) { } } } + +func TestListMarks(t *testing.T) { + t.Parallel() + az := fake.Azure(0) + var starredLink string + got, _, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute, Kinds: []string{"secret"}, + Mark: func(link, account string) (bool, bool) { + if starredLink == "" && strings.HasSuffix(link, "/db-password") { + starredLink = link + } + return link == starredLink && account == az.ID(), strings.HasSuffix(link, "/api-key") + }}) + var starred, recent int + for _, e := range got { + if e.Starred { + starred++ + if e.Link != starredLink { + t.Errorf("%s starred", e.Link) + } + } + if e.Recent { + recent++ + } + } + if starred != 1 || recent == 0 { + t.Errorf("%d starred, %d recent", starred, recent) + } +} -- 2.54.0 From 4cb40a159869aa4d64e6821f8cf1eca1c8b2ab77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:50:25 +0200 Subject: [PATCH 17/45] feat: lazysecrets list shows stars by default --- cmd/lazysecrets/list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 6ed3421..376d2e3 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -47,7 +47,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t format := fs.String("format", "text", "text: kind, name, error, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") - starIcon := fs.Bool("starred-icon", false, "put ★ before starred names, in the theme's favouriteColor (text)") + starIcon := fs.Bool("starred-icon", true, "put ★ before starred names, in the theme's favouriteColor (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { -- 2.54.0 From 4c822e42f1b2a3859c069a967ee05848f0c6510f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:53:51 +0200 Subject: [PATCH 18/45] feat: lazysecrets list's --starred-icon is --stars --- cmd/lazysecrets/list.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 376d2e3..1354db0 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -47,7 +47,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t format := fs.String("format", "text", "text: kind, name, error, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") - starIcon := fs.Bool("starred-icon", true, "put ★ before starred names, in the theme's favouriteColor (text)") + stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -79,7 +79,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t write = func(e listing.Entry) error { // A tab or line break in a name would break the line up. name := nameOf(e, theme, iconSet, *color == "always") - if *starIcon { + if *stars { name = starOf(e, theme, *color == "always") + name } why := errorOf(e, theme, *color == "always") -- 2.54.0 From 3bc0fc8fd6ac44be09b6a117b1a84fb0ee7df655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 14:57:23 +0200 Subject: [PATCH 19/45] feat: --demo starts with a few starred and recently used secrets --- cmd/lazysecrets/main.go | 6 +++-- internal/provider/fake/seed.go | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 internal/provider/fake/seed.go diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 302faed..5c01981 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -318,9 +318,11 @@ Flags: var providers []provider.Provider if *demo { // Two Azure accounts, like a personal and an admin login in az. + alice, admin := "Azure:alice@example.com/demo", "Azure:admin.alice@example.com/demo" + fake.Seed(st, alice, admin) providers = []provider.Provider{ - fake.Azure(400*time.Millisecond).As("Azure:alice@example.com/demo", "Azure · alice"), - fake.AzureOps(700*time.Millisecond).As("Azure:admin.alice@example.com/demo", "Azure · admin.alice"), + fake.Azure(400*time.Millisecond).As(alice, "Azure · alice"), + fake.AzureOps(700*time.Millisecond).As(admin, "Azure · admin.alice"), fake.Databricks(600 * time.Millisecond), fake.Repos(), } diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go new file mode 100644 index 0000000..638de8e --- /dev/null +++ b/internal/provider/fake/seed.go @@ -0,0 +1,48 @@ +package fake + +import ( + "strings" + "time" + + "git.kebcloud.no/keb/lazysecrets/internal/store" +) + +// Seed stars and uses a few of the demo's secrets, so --demo shows +// Favourites (F), Recent (R) and stars in lazysecrets list. alice and +// admin are the two Azure accounts' provider IDs. +func Seed(st *store.Store, alice, admin string) { + type item struct { + link, account, source string + path []string + star bool + uses int + ago time.Duration + } + const azure, dbx = "lazysecrets://azure/", "lazysecrets://databricks/adb-1111111111111111.11.azuredatabricks.net/" + for _, it := range []item{ + {link: azure + "kv-app-prod.vault.azure.net/secrets/db-password", account: alice, source: "sub-prod", + path: []string{"platform-prod", "kv-app-prod"}, star: true, uses: 12, ago: 20 * time.Minute}, + {link: azure + "kv-app-prod.vault.azure.net/secrets/api-key", account: alice, source: "sub-prod", + path: []string{"platform-prod", "kv-app-prod"}, uses: 4, ago: 2 * time.Hour}, + {link: azure + "kv-breakglass.vault.azure.net/secrets/emergency-admin", account: admin, source: "sub-prod", + path: []string{"platform-prod", "kv-breakglass"}, star: true}, + {link: azure + "kv-shared-prod.vault.azure.net/secrets/smtp-password", account: alice, source: "sub-prod", + path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, + {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", + path: []string{"prod", "app"}, star: true, uses: 3, ago: 5 * time.Hour}, + } { + context := func(n *store.Node) { + n.Name = it.link[strings.LastIndex(it.link, "/")+1:] + n.Path, n.Source, n.Account = it.path, it.source, it.account + } + if it.star { + _ = st.Update(it.link, func(n *store.Node) { + context(n) + n.ToggleStar(it.account) + }) + } + for range it.uses { + _ = st.Use(it.link, time.Now().Add(-it.ago), context) + } + } +} -- 2.54.0 From 46af233bd30e99bd9dff49235e261d7b9e843725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 15:04:33 +0200 Subject: [PATCH 20/45] feat: lazysecrets list puts the star and icon in a field of their own, so ^ searches match names --- cmd/lazysecrets/list.go | 92 ++++++++++++++++++++---------------- cmd/lazysecrets/list_test.go | 45 ++++++++++-------- 2 files changed, 76 insertions(+), 61 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 1354db0..4b1b51a 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -27,12 +27,13 @@ import ( // listCmd prints every source, vault and secret lazysecrets can find, one // per line, for fzf, editor pickers and scripts: // -// lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 +// lazysecrets list | fzf --ansi --delimiter='\t' --with-nth='2..-3' --nth='2..' --accept-nth=-1 // -// Each line is the kind, the name, why it couldn't be read (empty unless -// it failed), the account and the link, tab-separated: kind, account and -// link are one word each, so even fields split on spaces keep them first -// and last two. The name is coloured from the theme, +// Each line is the kind, a mark (★ and the provider's icon), the name, +// why it couldn't be read (empty unless it failed), the account and the +// link, tab-separated. The mark has a field of its own so a search can +// leave it out (fzf --nth), and ^prod finds names starting with prod. The +// name is coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, // ui.icons); the link never is. // @@ -44,7 +45,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, name, error, account and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, mark, name, error, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") @@ -77,13 +78,12 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t switch *format { case "text": write = func(e listing.Entry) error { + colored := *color == "always" + mark := markOf(e, theme, iconSet, *stars, colored) + name := nameOf(e, theme, colored) + why := errorOf(e, theme, colored) // A tab or line break in a name would break the line up. - name := nameOf(e, theme, iconSet, *color == "always") - if *stars { - name = starOf(e, theme, *color == "always") + name - } - why := errorOf(e, theme, *color == "always") - _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\n", e.Kind, oneLine.Replace(name), oneLine.Replace(why), e.Account, e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(why), e.Account, e.Link) return err } case "json": @@ -138,18 +138,6 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") -// starOf is ★ for a starred entry, as the TUI marks them, and spaces -// the same width for the rest, so names line up. -func starOf(e listing.Entry, theme styles.Styles, color bool) string { - switch { - case !e.Starred: - return " " - case color: - return theme.Favourite.Render("★") + " " - } - return "★ " -} - // errorOf is why a list couldn't be read, or "": with colour, a red ✗ // before it, as the TUI marks lists it can't read. func errorOf(e listing.Entry, theme styles.Styles, color bool) string { @@ -159,22 +147,10 @@ func errorOf(e listing.Entry, theme styles.Styles, color bool) string { return theme.Error.Render("✗ " + e.Error) } -// nameOf is an entry's name for the text format: the provider's icon, -// the path with the item's own name standing out, and the account. -func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) string { - render := func(st lipgloss.Style, s string) string { - if !color || s == "" { - return s - } - return st.Render(s) - } - kind := provider.Kind("") - for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { - if strings.EqualFold(string(k), e.Provider) { - kind = k - } - } - icon := iconSet.Prefix(kind) +// nameOf is an entry's name for the text format: the path with the +// item's own name standing out, and the account. +func nameOf(e listing.Entry, theme styles.Styles, color bool) string { + render := renderer(color) var name string if n := len(e.Path); n > 0 { if n > 1 { @@ -185,5 +161,39 @@ func nameOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, color bool) if e.AccountLabel != "" { name += render(theme.Muted, " · "+e.AccountLabel) } - return render(theme.Kind(kind), strings.TrimSuffix(icon, " ")) + strings.Repeat(" ", min(len(icon), 1)) + name + return name +} + +// markOf is what goes before the name, in a field of its own so a search +// leaves it out: ★ for a starred entry (as the TUI marks them; a space +// as wide for the rest, so names line up), and the provider's icon. +func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, color bool) string { + render := renderer(color) + var parts []string + if stars { + star := " " + if e.Starred { + star = render(theme.Favourite, "★") + } + parts = append(parts, star) + } + kind := provider.Kind("") + for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { + if strings.EqualFold(string(k), e.Provider) { + kind = k + } + } + if icon := strings.TrimSpace(iconSet.Prefix(kind)); icon != "" { + parts = append(parts, render(theme.Kind(kind), icon)) + } + return strings.Join(parts, " ") +} + +func renderer(color bool) func(lipgloss.Style, string) string { + return func(st lipgloss.Style, s string) string { + if !color || s == "" { + return s + } + return st.Render(s) + } } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 85aac78..09a8818 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -11,22 +11,39 @@ import ( func TestListNames(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-app-prod", "db-password"}, AccountLabel: "alice"} - if got := nameOf(e, styles.Default(), icons.None, false); got != "platform-prod / kv-app-prod / db-password · alice" { + if got := nameOf(e, styles.Default(), false); got != "platform-prod / kv-app-prod / db-password · alice" { t.Errorf("plain: %q", got) } - got := nameOf(e, styles.Default(), icons.NerdFont, true) - if !strings.HasPrefix(got, "\x1b[") || !strings.Contains(got, icons.NerdFont.Azure) { - t.Errorf("no colour or icon: %q", got) - } // The item's own name isn't muted with its path. - if !strings.Contains(got, "\x1b[mdb-password") { + if got := nameOf(e, styles.Default(), true); !strings.Contains(got, "\x1b[mdb-password") { t.Errorf("name not set apart: %q", got) } } -func TestListErrorNames(t *testing.T) { +func TestListMarks(t *testing.T) { + az := icons.NerdFont.Azure + for _, c := range []struct { + e listing.Entry + stars, color bool + set icons.Set + want string + }{ + {listing.Entry{Provider: "azure", Starred: true}, true, false, icons.NerdFont, "★ " + az}, + {listing.Entry{Provider: "azure"}, true, false, icons.NerdFont, " " + az}, // as wide as ★ + {listing.Entry{Provider: "azure", Starred: true}, false, false, icons.NerdFont, az}, + {listing.Entry{Provider: "azure", Starred: true}, true, false, icons.None, "★"}, + {listing.Entry{Provider: "azure", Starred: true}, false, false, icons.None, ""}, + {listing.Entry{Provider: "azure", Starred: true}, true, true, icons.None, styles.Default().Favourite.Render("★")}, + } { + if got := markOf(c.e, styles.Default(), c.set, c.stars, c.color); got != c.want { + t.Errorf("markOf(starred %v, stars %v, colour %v) = %q, want %q", c.e.Starred, c.stars, c.color, got, c.want) + } + } +} + +func TestListErrors(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} - if got := nameOf(e, styles.Default(), icons.NerdFont, false); got != icons.NerdFont.Azure+" platform-prod / kv-restricted" { + if got := nameOf(e, styles.Default(), false); got != "platform-prod / kv-restricted" { t.Errorf("the name has more: %q", got) } if got := errorOf(e, styles.Default(), false); got != "403 Forbidden" { @@ -39,15 +56,3 @@ func TestListErrorNames(t *testing.T) { t.Errorf("no error: %q", got) } } - -func TestListStars(t *testing.T) { - if got := starOf(listing.Entry{Starred: true}, styles.Default(), false); got != "★ " { - t.Errorf("starred: %q", got) - } - if got := starOf(listing.Entry{}, styles.Default(), true); got != " " { - t.Errorf("not starred: %q, want spaces as wide as ★", got) - } - if got := starOf(listing.Entry{Starred: true}, styles.Default(), true); got != styles.Default().Favourite.Render("★")+" " { - t.Errorf("not in the favourite colour: %q", got) - } -} -- 2.54.0 From 0e4580f245e930e7f0c4cc7beadc4cdfbede8e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 15:13:43 +0200 Subject: [PATCH 21/45] feat: --demo also stars a subscription and a repo file --- internal/provider/fake/seed.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go index 638de8e..5176ee9 100644 --- a/internal/provider/fake/seed.go +++ b/internal/provider/fake/seed.go @@ -1,6 +1,7 @@ package fake import ( + "cmp" "strings" "time" @@ -13,6 +14,7 @@ import ( func Seed(st *store.Store, alice, admin string) { type item struct { link, account, source string + name string // else the link's last part path []string star bool uses int @@ -30,9 +32,15 @@ func Seed(st *store.Store, alice, admin string) { path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", path: []string{"prod", "app"}, star: true, uses: 3, ago: 5 * time.Hour}, + // A subscription, and a repo's file. + {link: azure + "subscriptions/sub-prod", account: admin, source: "sub-prod", + name: "platform-prod", star: true}, + {link: "lazysecrets://repo/github.com%2Facme%2Flazysecrets-demo/deploy%2Fprod%2Fsecrets.yaml", account: "Repos", + source: "/home/dev/git/lazysecrets-demo", name: "deploy/prod/secrets.yaml", + path: []string{"lazysecrets-demo"}, star: true}, } { context := func(n *store.Node) { - n.Name = it.link[strings.LastIndex(it.link, "/")+1:] + n.Name = cmp.Or(it.name, it.link[strings.LastIndex(it.link, "/")+1:]) n.Path, n.Source, n.Account = it.path, it.source, it.account } if it.star { -- 2.54.0 From 33a9b0864d6237ca8acc3397669fb911f9786181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 15:17:01 +0200 Subject: [PATCH 22/45] feat: lazysecrets list's JSON says when an entry was last used, and how often --- cmd/lazysecrets/list.go | 4 ++-- internal/listing/listing.go | 18 +++++++++++------- internal/listing/listing_test.go | 12 ++++++++++-- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 4b1b51a..d85933c 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -115,9 +115,9 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t } f = listing.Run(context.Background(), listing.Options{ Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Kinds: only, Timeout: timeout, - Mark: func(link, account string) (bool, bool) { + Mark: func(link, account string) (bool, time.Time, int) { n := st.Node(link) - return n.StarredFor(account), !n.LastUsed.IsZero() + return n.StarredFor(account), n.LastUsed, n.Uses }, }, emit) if cachePath != "" && !*cached { diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 41fed54..42fac33 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -40,9 +40,11 @@ type Entry struct { // AccountLabel names the az account, when there are several. AccountLabel string `json:"accountLabel,omitempty"` // Starred is starred for this account; Recent is used lately (Recent, - // R, in the TUI). - Starred bool `json:"starred"` - Recent bool `json:"recent"` + // R, in the TUI): LastUsed is when, Uses how often. + Starred bool `json:"starred"` + Recent bool `json:"recent"` + LastUsed time.Time `json:"lastUsed,omitzero"` + Uses int `json:"uses,omitempty"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -61,9 +63,10 @@ type Options struct { // Lists only needed for other kinds aren't loaded: sources and vaults // alone don't load any secrets. Lists that fail are always listed. Kinds []string - // Mark tells whether the entry with link is starred for account, and - // used lately; nil marks nothing. - Mark func(link, account string) (starred, recent bool) + // Mark tells whether the entry with link is starred for account, + // and when it was last used and how often (zero: not lately); nil + // marks nothing. + Mark func(link, account string) (starred bool, lastUsed time.Time, uses int) Timeout func(provider.Kind) time.Duration Now func() time.Time } @@ -225,7 +228,8 @@ func (l *lister) put(p provider.Provider, e Entry) { } e.Account = p.ID() if l.o.Mark != nil && e.Link != "" { - e.Starred, e.Recent = l.o.Mark(e.Link, e.Account) + e.Starred, e.LastUsed, e.Uses = l.o.Mark(e.Link, e.Account) + e.Recent = !e.LastUsed.IsZero() } id := p.ID() + "\x00" + e.Link + "\x00" + e.Error if l.stopped != nil || l.seen[id] { diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index 8945d45..f639480 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -229,11 +229,14 @@ func TestListMarks(t *testing.T) { az := fake.Azure(0) var starredLink string got, _, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute, Kinds: []string{"secret"}, - Mark: func(link, account string) (bool, bool) { + Mark: func(link, account string) (bool, time.Time, int) { if starredLink == "" && strings.HasSuffix(link, "/db-password") { starredLink = link } - return link == starredLink && account == az.ID(), strings.HasSuffix(link, "/api-key") + if strings.HasSuffix(link, "/api-key") { + return false, time.Now(), 3 + } + return link == starredLink && account == az.ID(), time.Time{}, 0 }}) var starred, recent int for _, e := range got { @@ -245,6 +248,11 @@ func TestListMarks(t *testing.T) { } if e.Recent { recent++ + if e.Uses != 3 || e.LastUsed.IsZero() { + t.Errorf("%s: %d uses, last %v", e.Link, e.Uses, e.LastUsed) + } + } else if e.Uses != 0 || !e.LastUsed.IsZero() { + t.Errorf("%s not recent, but %d uses, last %v", e.Link, e.Uses, e.LastUsed) } } if starred != 1 || recent == 0 { -- 2.54.0 From 33fa0641049d0b4bc212a2063c849ed442db10d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 15:22:12 +0200 Subject: [PATCH 23/45] =?UTF-8?q?feat:=20ui.recentIcon=20marks=20items=20u?= =?UTF-8?q?sed=20lately=20with=20=E2=97=B7,=20and=20lazysecrets=20list=20-?= =?UTF-8?q?-recent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/lazysecrets/list.go | 27 +++++++++++++++++---------- cmd/lazysecrets/list_test.go | 18 +++++++++++++++++- cmd/lazysecrets/main.go | 5 ++++- docs/config.md | 1 + internal/config/config.go | 3 +++ internal/ui/app/app.go | 7 ++++++- internal/ui/app/favourites.go | 24 ++++++++++++++++++------ internal/ui/app/favourites_test.go | 18 ++++++++++++++++++ internal/ui/app/sources.go | 6 +++--- 9 files changed, 87 insertions(+), 22 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index d85933c..02f1b7e 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -41,7 +41,7 @@ import ( // follows as it loads. A list that can't be read is a line too, as it // fails: the vault or source, then ✗ and why in the theme's error colour. // They're in the output rather than on stderr, which would draw over fzf. -func listCmd(providers []provider.Provider, st *store.Store, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons bool, args []string, out io.Writer) error { +func listCmd(providers []provider.Provider, st *store.Store, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons, withRecent bool, args []string, out io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") @@ -49,6 +49,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") + recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -79,7 +80,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t case "text": write = func(e listing.Entry) error { colored := *color == "always" - mark := markOf(e, theme, iconSet, *stars, colored) + mark := markOf(e, theme, iconSet, *stars, *recent, colored) name := nameOf(e, theme, colored) why := errorOf(e, theme, colored) // A tab or line break in a name would break the line up. @@ -165,17 +166,23 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { } // markOf is what goes before the name, in a field of its own so a search -// leaves it out: ★ for a starred entry (as the TUI marks them; a space -// as wide for the rest, so names line up), and the provider's icon. -func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, color bool) string { +// leaves it out: ★ for a starred entry and ◷ for one used lately (as the +// TUI marks them; a space as wide for the rest, so names line up), and +// the provider's icon. +func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, recent, color bool) string { render := renderer(color) var parts []string - if stars { - star := " " - if e.Starred { - star = render(theme.Favourite, "★") + mark := func(on bool, st lipgloss.Style, s string) { + if !on { + s = " " } - parts = append(parts, star) + parts = append(parts, render(st, s)) + } + if stars { + mark(e.Starred, theme.Favourite, "★") + } + if recent { + mark(e.Recent, theme.Muted, "◷") } kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 09a8818..bed768a 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -35,12 +35,28 @@ func TestListMarks(t *testing.T) { {listing.Entry{Provider: "azure", Starred: true}, false, false, icons.None, ""}, {listing.Entry{Provider: "azure", Starred: true}, true, true, icons.None, styles.Default().Favourite.Render("★")}, } { - if got := markOf(c.e, styles.Default(), c.set, c.stars, c.color); got != c.want { + if got := markOf(c.e, styles.Default(), c.set, c.stars, false, c.color); got != c.want { t.Errorf("markOf(starred %v, stars %v, colour %v) = %q, want %q", c.e.Starred, c.stars, c.color, got, c.want) } } } +func TestListRecentMark(t *testing.T) { + az := icons.NerdFont.Azure + for _, c := range []struct { + e listing.Entry + want string + }{ + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, + {listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, // as wide as ◷ + } { + if got := markOf(c.e, styles.Default(), icons.NerdFont, true, true, false); got != c.want { + t.Errorf("markOf(starred %v, recent %v) = %q, want %q", c.e.Starred, c.e.Recent, got, c.want) + } + } +} + func TestListErrors(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} if got := nameOf(e, styles.Default(), false); got != "platform-prod / kv-restricted" { diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index 5c01981..a4c086f 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -298,6 +298,8 @@ Flags: } } + recentIcon := cfg.UI.RecentIcon != nil && *cfg.UI.RecentIcon + // Stars, notes and the layout. Demo mode keeps them in memory, so // sample vaults never end up in the real file. stateDir, err := config.StateDir() @@ -387,7 +389,7 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - return listCmd(providers, st, cachePath, timeoutFor, theme, *icons, listArgs, os.Stdout) + return listCmd(providers, st, cachePath, timeoutFor, theme, *icons, recentIcon, listArgs, os.Stdout) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's @@ -478,6 +480,7 @@ Flags: ShareRules: shareRules(cfg), Open: open, OpenAction: openAction, + RecentIcon: recentIcon, Styles: &theme, DefaultFg: defaultFg, }) diff --git a/docs/config.md b/docs/config.md index 70fd2f2..008a8c2 100644 --- a/docs/config.md +++ b/docs/config.md @@ -9,6 +9,7 @@ it isn't there yet); changes apply when lazysecrets starts again. ```yaml ui: icons: true # Nerd Font icons (v3+); also --icons=false or LAZYSECRETS_ICONS=0 + recentIcon: false # mark items used lately (Recent, R) with ◷, here and in lazysecrets list sourcesView: grouped # or flat; ` toggles it collapseGroups: true # start with the Sources pane's groups folded; enter or space unfolds one loadDelay: 150ms # how long the cursor rests on a row before it loads; 0s loads at once diff --git a/internal/config/config.go b/internal/config/config.go index d2844c2..11c7da3 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -44,6 +44,9 @@ type Config struct { type UI struct { Icons *bool `yaml:"icons"` + // RecentIcon marks items used lately (Recent, R) with ◷, in the lists + // and in lazysecrets list. Defaults to false. + RecentIcon *bool `yaml:"recentIcon"` // SourcesView is "grouped" (default) or "flat"; ` + "`" + ` toggles it. SourcesView string `yaml:"sourcesView"` // CollapseGroups starts the Sources pane with its groups folded; diff --git a/internal/ui/app/app.go b/internal/ui/app/app.go index da6abdc..5447318 100644 --- a/internal/ui/app/app.go +++ b/internal/ui/app/app.go @@ -131,6 +131,9 @@ type Options struct { HandlerSetup *HandlerSetup // NoHistory stops counting uses of items for the Recent list. NoHistory bool + // RecentIcon marks items used lately with ◷ in the lists + // (ui.recentIcon). + RecentIcon bool // Open is a reference to open at startup (lazysecrets open ). Open *ref.Ref // OpenAction, if set, is what to do with Open, rather than asking: @@ -287,6 +290,7 @@ type Model struct { prompt *modal // popup that has the keyboard linked []provider.Container // vaults opened from links, this session open *ref.Ref // reference to open at startup + recentIcon bool // mark items used lately (◷) openAction string // and what to do with it, or ask shareKey string // the config's sharing.key @@ -420,7 +424,8 @@ func New(providers []provider.Provider, opts Options) Model { if m.store == nil { m.store, _ = store.Load("") } - m.sources = newSourcesList(iconSet, m.store) + m.recentIcon = opts.RecentIcon + m.sources = newSourcesList(iconSet, m.store, m.recentIcon) m.sources.Empty = "no sources found" m.collapsed = map[string]bool{} m.flatSources = opts.FlatSources diff --git a/internal/ui/app/favourites.go b/internal/ui/app/favourites.go index 9faf2d8..e9f207b 100644 --- a/internal/ui/app/favourites.go +++ b/internal/ui/app/favourites.go @@ -19,6 +19,22 @@ import ( const star = "★ " +// recentMark marks items used lately (Recent), with ui.recentIcon. +const recentMark = "◷ " + +// marks is what goes before a list row's name: ★ when it's starred for +// account and, with recent, ◷ when it was used lately. +func marks(st styles.Styles, n store.Node, account string, recent bool) string { + var s string + if n.StarredFor(account) { + s = st.Favourite.Render(star) + } + if recent && !n.LastUsed.IsZero() { + s += st.Muted.Render(recentMark) + } + return s +} + func sourceKey(s provider.Source) string { if r, err := ref.ForSource(s); err == nil { return r.String() @@ -94,9 +110,7 @@ func (m Model) containerRender(withSource bool) func(styles.Styles, provider.Con } line += sty.Muted.Render(" " + c.Detail) } - if n.StarredFor(c.Source.Provider) { - line = sty.Favourite.Render(star) + line - } + line = marks(sty, n, c.Source.Provider, m.recentIcon) + line if withSource { src := c.Source.Name if account, ok := strings.CutPrefix(c.Source.ProviderLabel, string(c.Source.Kind)+" · "); ok { @@ -116,9 +130,7 @@ func (m Model) objectRender() func(styles.Styles, provider.Object, int) string { if o.Enabled != nil && !*o.Enabled { line = sty.Muted.Render(o.Name + " (disabled)") } - if n.StarredFor(o.Container.Source.Provider) { - line = sty.Favourite.Render(star) + line - } + line = marks(sty, n, o.Container.Source.Provider, m.recentIcon) + line switch state, left := m.expiry(o); state { case expired: line += " " + sty.Error.Render("✗ expired") diff --git a/internal/ui/app/favourites_test.go b/internal/ui/app/favourites_test.go index 9c1dd84..fd16afc 100644 --- a/internal/ui/app/favourites_test.go +++ b/internal/ui/app/favourites_test.go @@ -6,6 +6,7 @@ import ( "slices" "strings" "testing" + "time" tea "charm.land/bubbletea/v2" "charm.land/lipgloss/v2" @@ -434,3 +435,20 @@ func TestStarIsPerAccount(t *testing.T) { t.Errorf("favourites should list alice's star only: %q", labels) } } + +func TestRecentIcon(t *testing.T) { + t.Parallel() + mem, _ := store.Load("") + _ = mem.Use("lazysecrets://azure/"+kv+"/secrets/api-key", time.Now(), func(*store.Node) {}) + d := newDriverOpts(t, Options{Store: mem, RecentIcon: true}) + d.keys("3") + scr := d.screen() + if !strings.Contains(scr, "◷ api-key") || strings.Contains(scr, "◷ db-password") { + t.Errorf("want ◷ on api-key only:\n%s", scr) + } + off := newDriverOpts(t, Options{Store: mem}) + off.keys("3") + if strings.Contains(off.screen(), "◷") { + t.Errorf("◷ without ui.recentIcon:\n%s", off.screen()) + } +} diff --git a/internal/ui/app/sources.go b/internal/ui/app/sources.go index 45c38f9..4e45209 100644 --- a/internal/ui/app/sources.go +++ b/internal/ui/app/sources.go @@ -57,7 +57,7 @@ func sourceRowID(r sourceRow) string { return sourceRowKey(r.provider, r.source.ID) } -func newSourcesList(iconSet icons.Set, mem *store.Store) panes.List[sourceRow] { +func newSourcesList(iconSet icons.Set, mem *store.Store, recent bool) panes.List[sourceRow] { return panes.NewList("[1] Sources", panes.Item[sourceRow]{ ID: sourceRowID, // Headers have no filter text, so filtering shows just sources. @@ -79,8 +79,8 @@ func newSourcesList(iconSet icons.Set, mem *store.Store) panes.List[sourceRow] { node := mem.Node(sourceKey(r.source)) kind := st.Kind(r.group) starred := "" - if r.kind == rowSource && node.StarredFor(r.source.Provider) { - starred = st.Favourite.Render(star) + if r.kind == rowSource { + starred = marks(st, node, r.source.Provider, recent) } switch { case r.kind == rowLinks: -- 2.54.0 From b4e4c1515b0f3d23d18679e29988153327630b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 15:43:37 +0200 Subject: [PATCH 24/45] feat: lazysecrets list marks expiring and expired secrets, and its JSON has expires and enabled --- cmd/lazysecrets/list.go | 54 +++++++++++++++++++++++++----------- cmd/lazysecrets/list_test.go | 52 ++++++++++++++++++++++------------ cmd/lazysecrets/main.go | 2 +- docs/config.md | 2 +- internal/listing/listing.go | 7 ++++- 5 files changed, 80 insertions(+), 37 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 02f1b7e..f684129 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -41,7 +41,7 @@ import ( // follows as it loads. A list that can't be read is a line too, as it // fails: the vault or source, then ✗ and why in the theme's error colour. // They're in the output rather than on stderr, which would draw over fzf. -func listCmd(providers []provider.Provider, st *store.Store, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons, withRecent bool, args []string, out io.Writer) error { +func listCmd(providers []provider.Provider, st *store.Store, cachePath string, timeout func(provider.Kind) time.Duration, theme styles.Styles, withIcons, withRecent bool, expiryWarn time.Duration, args []string, out io.Writer) error { fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") @@ -50,6 +50,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") + expiry := fs.Bool("expiry", true, "put ⚠ before names expiring within ui.expiryWarningDays, ✗ before expired ones (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -71,16 +72,17 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if *color != "always" && *color != "never" { return fmt.Errorf("--color: %q is not always or never", *color) } - iconSet := icons.None + m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, expiry: *expiry, + color: *color == "always", warn: expiryWarn, now: time.Now()} if *iconsOn { - iconSet = icons.NerdFont + m.icons = icons.NerdFont } var write func(listing.Entry) error switch *format { case "text": write = func(e listing.Entry) error { colored := *color == "always" - mark := markOf(e, theme, iconSet, *stars, *recent, colored) + mark := m.of(e) name := nameOf(e, theme, colored) why := errorOf(e, theme, colored) // A tab or line break in a name would break the line up. @@ -165,12 +167,21 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { return name } -// markOf is what goes before the name, in a field of its own so a search -// leaves it out: ★ for a starred entry and ◷ for one used lately (as the -// TUI marks them; a space as wide for the rest, so names line up), and -// the provider's icon. -func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, recent, color bool) string { - render := renderer(color) +// marks says what goes before the name, in a field of its own so a +// search leaves it out: ★ for a starred entry, ◷ for one used lately, +// ⚠ for one expiring within warn and ✗ for an expired one (as the TUI +// marks them; a space as wide where it isn't, so names line up), then the +// provider's icon. +type marks struct { + theme styles.Styles + icons icons.Set + stars, recent, expiry, color bool + warn time.Duration // ui.expiryWarningDays + now time.Time +} + +func (m marks) of(e listing.Entry) string { + render := renderer(m.color) var parts []string mark := func(on bool, st lipgloss.Style, s string) { if !on { @@ -178,11 +189,22 @@ func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, rece } parts = append(parts, render(st, s)) } - if stars { - mark(e.Starred, theme.Favourite, "★") + if m.stars { + mark(e.Starred, m.theme.Favourite, "★") } - if recent { - mark(e.Recent, theme.Muted, "◷") + if m.recent { + mark(e.Recent, m.theme.Muted, "◷") + } + if m.expiry { + left := e.Expires.Sub(m.now) + switch { + case e.Expires.IsZero() || left > m.warn: + mark(false, m.theme.Muted, "") + case left <= 0: + mark(true, m.theme.Error, "✗") + default: + mark(true, m.theme.Warning, "⚠") + } } kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { @@ -190,8 +212,8 @@ func markOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, stars, rece kind = k } } - if icon := strings.TrimSpace(iconSet.Prefix(kind)); icon != "" { - parts = append(parts, render(theme.Kind(kind), icon)) + if icon := strings.TrimSpace(m.icons.Prefix(kind)); icon != "" { + parts = append(parts, render(m.theme.Kind(kind), icon)) } return strings.Join(parts, " ") } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index bed768a..95264fd 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -3,6 +3,7 @@ package main import ( "strings" "testing" + "time" "git.kebcloud.no/keb/lazysecrets/internal/listing" "git.kebcloud.no/keb/lazysecrets/internal/ui/icons" @@ -22,39 +23,54 @@ func TestListNames(t *testing.T) { func TestListMarks(t *testing.T) { az := icons.NerdFont.Azure + plain := marks{theme: styles.Default(), icons: icons.NerdFont, stars: true} + noIcons := plain + noIcons.icons = icons.None + colored := noIcons + colored.color = true for _, c := range []struct { - e listing.Entry - stars, color bool - set icons.Set - want string + m marks + e listing.Entry + want string }{ - {listing.Entry{Provider: "azure", Starred: true}, true, false, icons.NerdFont, "★ " + az}, - {listing.Entry{Provider: "azure"}, true, false, icons.NerdFont, " " + az}, // as wide as ★ - {listing.Entry{Provider: "azure", Starred: true}, false, false, icons.NerdFont, az}, - {listing.Entry{Provider: "azure", Starred: true}, true, false, icons.None, "★"}, - {listing.Entry{Provider: "azure", Starred: true}, false, false, icons.None, ""}, - {listing.Entry{Provider: "azure", Starred: true}, true, true, icons.None, styles.Default().Favourite.Render("★")}, + {plain, listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, + {plain, listing.Entry{Provider: "azure"}, " " + az}, // as wide as ★ + {marks{icons: icons.NerdFont}, listing.Entry{Provider: "azure", Starred: true}, az}, + {noIcons, listing.Entry{Provider: "azure", Starred: true}, "★"}, + {marks{}, listing.Entry{Provider: "azure", Starred: true}, ""}, + {colored, listing.Entry{Provider: "azure", Starred: true}, styles.Default().Favourite.Render("★")}, } { - if got := markOf(c.e, styles.Default(), c.set, c.stars, false, c.color); got != c.want { - t.Errorf("markOf(starred %v, stars %v, colour %v) = %q, want %q", c.e.Starred, c.stars, c.color, got, c.want) + if got := c.m.of(c.e); got != c.want { + t.Errorf("%+v: %q, want %q", c.e, got, c.want) } } } -func TestListRecentMark(t *testing.T) { +func TestListRecentAndExpiryMarks(t *testing.T) { az := icons.NerdFont.Azure + now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) + m := marks{icons: icons.NerdFont, stars: true, recent: true, expiry: true, warn: 30 * 24 * time.Hour, now: now} for _, c := range []struct { e listing.Entry want string }{ - {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, - {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, - {listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, // as wide as ◷ + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, " ✗ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, " ⚠ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, " " + az}, } { - if got := markOf(c.e, styles.Default(), icons.NerdFont, true, true, false); got != c.want { - t.Errorf("markOf(starred %v, recent %v) = %q, want %q", c.e.Starred, c.e.Recent, got, c.want) + if got := m.of(c.e); got != c.want { + t.Errorf("%+v: %q, want %q", c.e, got, c.want) } } + m.color, m.theme = true, styles.Default() + if got := m.of(listing.Entry{Expires: now.Add(-time.Hour)}); !strings.Contains(got, styles.Default().Error.Render("✗")) { + t.Errorf("expired isn't a red ✗: %q", got) + } + if got := m.of(listing.Entry{Expires: now.Add(time.Hour)}); !strings.Contains(got, styles.Default().Warning.Render("⚠")) { + t.Errorf("expiring isn't a ⚠ in the warning colour: %q", got) + } } func TestListErrors(t *testing.T) { diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index a4c086f..d2b5398 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -389,7 +389,7 @@ Flags: if d, err := config.CacheDir(); err == nil && !*demo && config.On(cfg.Storage.Cache) { cachePath = filepath.Join(d, "cache.json") } - return listCmd(providers, st, cachePath, timeoutFor, theme, *icons, recentIcon, listArgs, os.Stdout) + return listCmd(providers, st, cachePath, timeoutFor, theme, *icons, recentIcon, time.Duration(expiryDays)*24*time.Hour, listArgs, os.Stdout) } if shareArgs != nil { // The files from a repo, the key from whichever provider it's diff --git a/docs/config.md b/docs/config.md index 008a8c2..2429c84 100644 --- a/docs/config.md +++ b/docs/config.md @@ -13,7 +13,7 @@ ui: sourcesView: grouped # or flat; ` toggles it collapseGroups: true # start with the Sources pane's groups folded; enter or space unfolds one loadDelay: 150ms # how long the cursor rests on a row before it loads; 0s loads at once - expiryWarningDays: 30 # mark secrets, keys and certificates expiring this soon (⚠ 12d); expired ones get ✗ + expiryWarningDays: 30 # mark secrets, keys and certificates expiring this soon (⚠ 12d; ⚠ in lazysecrets list); expired ones get ✗ values: revealTimeout: 60s # hide a revealed value after this long; 0s keeps it shown hideOnBlur: true # hide a revealed value when the terminal loses focus (tmux: focus-events on) diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 42fac33..8f32e9b 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -45,6 +45,10 @@ type Entry struct { Recent bool `json:"recent"` LastUsed time.Time `json:"lastUsed,omitzero"` Uses int `json:"uses,omitempty"` + // Expires is when a secret, key or certificate expires, if it does; + // Enabled whether it's enabled, where the provider says (Azure). + Expires time.Time `json:"expires,omitzero"` + Enabled *bool `json:"enabled,omitempty"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -200,7 +204,8 @@ func (l *lister) objects(p provider.Provider, c provider.Container, objs []provi continue } l.put(p, Entry{Link: r.String(), Kind: strings.ToLower(string(o.Type)), Provider: kindOf(c.Source.Kind), - Path: []string{c.Source.Name, c.Name, o.Name}, AccountLabel: accountOf(c.Source)}) + Path: []string{c.Source.Name, c.Name, o.Name}, AccountLabel: accountOf(c.Source), + Expires: o.Expires, Enabled: o.Enabled}) } } -- 2.54.0 From c548688715415127c4358f344f71ea541f68b3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:11:16 +0200 Subject: [PATCH 25/45] feat: --demo has expired, disabled and expiring secrets --- internal/provider/fake/fake.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 572e7e2..833148e 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -349,6 +349,19 @@ func Azure(delay time.Duration) *Provider { p.add(kvDev, provider.TypeSecret, provider.Object{ Name: "db-password", Enabled: &yes, Updated: base, Reference: secretRef("kv-app-dev", "db-password"), }, "dev-password") + // Left behind, as dev vaults are: expired, disabled, or both. + p.add(kvDev, provider.TypeSecret, provider.Object{ + Name: "stripe-webhook-secret", Enabled: &yes, Updated: base.AddDate(-1, 0, 0), + Expires: base.AddDate(0, -2, 0), Reference: secretRef("kv-app-dev", "stripe-webhook-secret"), + }, "whsec_demo_expired") + p.add(kvDev, provider.TypeSecret, provider.Object{ + Name: "test-user-password", Enabled: &no, Updated: base.AddDate(0, -5, 0), + Reference: secretRef("kv-app-dev", "test-user-password"), + }, "disabled-demo-password") + p.add(kvDev, provider.TypeSecret, provider.Object{ + Name: "vendor-token", Enabled: &no, Updated: base.AddDate(-2, 0, 0), + Expires: base.AddDate(-1, 0, 0), Reference: secretRef("kv-app-dev", "vendor-token"), + }, "expired-and-disabled") return p } @@ -384,6 +397,12 @@ func AzureOps(delay time.Duration) *Provider { p.add(kv, provider.TypeSecret, provider.Object{ Name: "pagerduty-token", Enabled: &yes, Updated: base.AddDate(0, -1, 0), Reference: secretRef("kv-ops-tools", "pagerduty-token"), }, "pd-demo-token") + // Expiring soon whenever the demo runs: the other dates are fixed, + // and would have passed. Tests use the first account only. + p.add(kv, provider.TypeSecret, provider.Object{ + Name: "grafana-api-key", Enabled: &yes, Updated: base.AddDate(0, -11, 0), + Expires: time.Now().AddDate(0, 0, 12).Truncate(24 * time.Hour), Reference: secretRef("kv-ops-tools", "grafana-api-key"), + }, "glsa_demo_expiring") return p } -- 2.54.0 From 419a5f3047dd5adc0ac8b45d579f90b74b55ea40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:13:23 +0200 Subject: [PATCH 26/45] feat: lazysecrets list's marks take space only when present --- cmd/lazysecrets/list.go | 11 +++++------ cmd/lazysecrets/list_test.go | 12 ++++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index f684129..951a75e 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -169,9 +169,9 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { // marks says what goes before the name, in a field of its own so a // search leaves it out: ★ for a starred entry, ◷ for one used lately, -// ⚠ for one expiring within warn and ✗ for an expired one (as the TUI -// marks them; a space as wide where it isn't, so names line up), then the -// provider's icon. +// ⚠ for one expiring within warn and ✗ for an expired one, as the TUI +// marks them, then the provider's icon. Only the marks an entry has take +// space. type marks struct { theme styles.Styles icons icons.Set @@ -184,10 +184,9 @@ func (m marks) of(e listing.Entry) string { render := renderer(m.color) var parts []string mark := func(on bool, st lipgloss.Style, s string) { - if !on { - s = " " + if on { + parts = append(parts, render(st, s)) } - parts = append(parts, render(st, s)) } if m.stars { mark(e.Starred, m.theme.Favourite, "★") diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 95264fd..1780881 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -34,7 +34,7 @@ func TestListMarks(t *testing.T) { want string }{ {plain, listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, - {plain, listing.Entry{Provider: "azure"}, " " + az}, // as wide as ★ + {plain, listing.Entry{Provider: "azure"}, az}, // no space for a star it hasn't {marks{icons: icons.NerdFont}, listing.Entry{Provider: "azure", Starred: true}, az}, {noIcons, listing.Entry{Provider: "azure", Starred: true}, "★"}, {marks{}, listing.Entry{Provider: "azure", Starred: true}, ""}, @@ -54,11 +54,11 @@ func TestListRecentAndExpiryMarks(t *testing.T) { e listing.Entry want string }{ - {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, - {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, " ✗ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, " ⚠ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, " " + az}, + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, "◷ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, "✗ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, "⚠ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, az}, } { if got := m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) -- 2.54.0 From 94aa74b05dae787ce4c44711fc0203d7cb6b56e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:15:49 +0200 Subject: [PATCH 27/45] feat: lazysecrets list right-aligns the marks by the icon, so names line up --- cmd/lazysecrets/list.go | 12 +++++++++--- cmd/lazysecrets/list_test.go | 13 +++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 951a75e..0872f40 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -170,8 +170,9 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { // marks says what goes before the name, in a field of its own so a // search leaves it out: ★ for a starred entry, ◷ for one used lately, // ⚠ for one expiring within warn and ✗ for an expired one, as the TUI -// marks them, then the provider's icon. Only the marks an entry has take -// space. +// marks them, then the provider's icon. The marks are right-aligned in +// room for every kind turned on, so they sit by the icon and names line +// up. type marks struct { theme styles.Styles icons icons.Set @@ -183,7 +184,9 @@ type marks struct { func (m marks) of(e listing.Entry) string { render := renderer(m.color) var parts []string + room := 0 // marks turned on mark := func(on bool, st lipgloss.Style, s string) { + room++ if on { parts = append(parts, render(st, s)) } @@ -205,6 +208,7 @@ func (m marks) of(e listing.Entry) string { mark(true, m.theme.Warning, "⚠") } } + pad := strings.Repeat(" ", room-len(parts)) // each mark and its space kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { if strings.EqualFold(string(k), e.Provider) { @@ -213,8 +217,10 @@ func (m marks) of(e listing.Entry) string { } if icon := strings.TrimSpace(m.icons.Prefix(kind)); icon != "" { parts = append(parts, render(m.theme.Kind(kind), icon)) + } else if len(parts) > 0 { + pad = strings.TrimSuffix(pad, " ") // nothing after the last mark } - return strings.Join(parts, " ") + return pad + strings.Join(parts, " ") } func renderer(color bool) func(lipgloss.Style, string) string { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 1780881..005ef35 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -34,7 +34,7 @@ func TestListMarks(t *testing.T) { want string }{ {plain, listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, - {plain, listing.Entry{Provider: "azure"}, az}, // no space for a star it hasn't + {plain, listing.Entry{Provider: "azure"}, " " + az}, // room for the star, so names line up {marks{icons: icons.NerdFont}, listing.Entry{Provider: "azure", Starred: true}, az}, {noIcons, listing.Entry{Provider: "azure", Starred: true}, "★"}, {marks{}, listing.Entry{Provider: "azure", Starred: true}, ""}, @@ -54,11 +54,12 @@ func TestListRecentAndExpiryMarks(t *testing.T) { e listing.Entry want string }{ - {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, - {listing.Entry{Provider: "azure", Recent: true}, "◷ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, "✗ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, "⚠ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, az}, + // Right-aligned in room for three: by the icon, names lined up. + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, " ★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, " ✗ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, " ⚠ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, " " + az}, } { if got := m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) -- 2.54.0 From e49a2d8b5333208341f8c053d537d3763c537c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:21:38 +0200 Subject: [PATCH 28/45] test: --demo's legacy-token has expired too --- internal/provider/fake/fake.go | 2 +- internal/ui/app/app_test.go | 17 +++++++++-------- internal/ui/app/favourites_test.go | 2 +- internal/ui/app/links_test.go | 2 +- internal/ui/app/testdata/TestGolden.golden | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 833148e..7118269 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -288,7 +288,7 @@ func Azure(delay time.Duration) *Provider { }, "sk_live_51HxDEMO0000000000000000") p.add(kv, provider.TypeSecret, provider.Object{ Name: "legacy-token", Version: "0c11de", Enabled: &no, Updated: base.AddDate(-1, 0, 0), - Reference: secretRef("kv-app-prod", "legacy-token"), + Expires: base.AddDate(0, -3, 0), Reference: secretRef("kv-app-prod", "legacy-token"), }, "deprecated") p.add(kv, provider.TypeKey, provider.Object{ diff --git a/internal/ui/app/app_test.go b/internal/ui/app/app_test.go index 79be8ed..6e7929a 100644 --- a/internal/ui/app/app_test.go +++ b/internal/ui/app/app_test.go @@ -536,7 +536,7 @@ func TestBackspaceGoesBack(t *testing.T) { } // While typing a filter, backspace deletes a character instead. d.keys("/") - d.typeText("apx") + d.typeText("api-x") d.send(tea.KeyPressMsg{Code: tea.KeyBackspace}) if !d.m.secrets.Filtering() || d.m.secrets.Len() != 1 { t.Errorf("backspace in filter: filtering=%v visible=%d", d.m.secrets.Filtering(), d.m.secrets.Len()) @@ -666,7 +666,7 @@ func TestFilter(t *testing.T) { t.Parallel() d := newDriver(t) d.keys("3", "/") - d.typeText("api") + d.typeText("api-k") if d.m.secrets.Len() != 1 { t.Fatalf("visible = %d, want 1", d.m.secrets.Len()) } @@ -684,7 +684,7 @@ func TestFilter(t *testing.T) { } d.keys("esc") // leave filter mode, clearing the query d.keys("/") - d.typeText("api") + d.typeText("api-k") d.keys("enter", "esc") // apply, then esc clears the applied filter if d.m.secrets.Len() != 3 { t.Errorf("esc should clear the applied filter, visible = %d", d.m.secrets.Len()) @@ -848,7 +848,7 @@ func TestCopyAndRevealWhileFiltering(t *testing.T) { t.Parallel() d := newDriver(t) d.keys("3", "/") - d.typeText("api") + d.typeText("api-k") d.send(tea.KeyPressMsg{Code: 'y', Mod: tea.ModCtrl}) if d.clip().content != "sk_live_51HxDEMO0000000000000000" { t.Errorf("ctrl+y copied %q", d.clip().content) @@ -1187,7 +1187,8 @@ func TestDetailsFollowFocus(t *testing.T) { func TestStatusLineCountsRepos(t *testing.T) { t.Parallel() d := newDriver(t, fake.Azure(0), fake.Repos()) - if line := strings.Split(d.screen(), "\n")[1]; !strings.Contains(line, "1 account · 3 repos") { + // The status line, not the pane, which an expired secret's ⚠ fills. + if line := ansi.Strip(d.m.statusLine()); !strings.Contains(line, "1 account · 3 repos") { t.Errorf("status line: %q", line) } d = newDriver(t, fake.Azure(0)) @@ -1202,8 +1203,8 @@ func TestStatusPane(t *testing.T) { d := newDriverOpts(t, Options{Version: "0.1.0", ConfigFiles: []string{"/cfg/config.yaml"}, StatePath: "/state/state.json", OpenURL: func(u string) error { opened = append(opened, u); return nil }}, fake.Azure(0), signedOut{fake.Azure(0)}) - if !strings.Contains(d.screen(), "2 accounts · 1 need sign-in") { - t.Errorf("status line:\n%s", d.screen()) + if line := ansi.Strip(d.m.statusLine()); !strings.Contains(line, "2 accounts · 1 need sign-in") { + t.Errorf("status line: %q", line) } d.keys("0") if d.m.focus != paneStatus { @@ -1303,7 +1304,7 @@ func TestExpiringInStatus(t *testing.T) { t.Parallel() d := newDriverOpts(t, Options{ExpiryWarning: 30 * 24 * time.Hour}, fake.Azure(0)) d.keys("3", "]", "]") // load kv-app-prod's certificates - if !strings.Contains(d.screen(), "⚠ 1 expiring") { + if !strings.Contains(d.screen(), "⚠ 2 expiring") { // old-tls, legacy-token t.Errorf("status line:\n%s", d.screen()) } d.keys("0") diff --git a/internal/ui/app/favourites_test.go b/internal/ui/app/favourites_test.go index fd16afc..40ecbbb 100644 --- a/internal/ui/app/favourites_test.go +++ b/internal/ui/app/favourites_test.go @@ -395,7 +395,7 @@ func TestStarWhileFiltering(t *testing.T) { t.Parallel() d := newDriver(t) d.keys("3", "/") - for _, r := range "api" { + for _, r := range "api-k" { d.send(tea.KeyPressMsg{Code: r, Text: string(r)}) } d.send(tea.KeyPressMsg{Code: 'f', Mod: tea.ModCtrl}) diff --git a/internal/ui/app/links_test.go b/internal/ui/app/links_test.go index f5c4d99..b5f218c 100644 --- a/internal/ui/app/links_test.go +++ b/internal/ui/app/links_test.go @@ -181,7 +181,7 @@ func TestPasteWhileFilteringFilters(t *testing.T) { t.Parallel() d := newDriver(t) d.keys("3", "/") - d.send(tea.PasteMsg{Content: "api"}) + d.send(tea.PasteMsg{Content: "api-k"}) if d.m.secrets.Len() != 1 || d.m.nav != nil { t.Errorf("paste in filter: visible %d", d.m.secrets.Len()) } diff --git a/internal/ui/app/testdata/TestGolden.golden b/internal/ui/app/testdata/TestGolden.golden index 3943763..dd076a8 100644 --- a/internal/ui/app/testdata/TestGolden.golden +++ b/internal/ui/app/testdata/TestGolden.golden @@ -1,5 +1,5 @@ ╭─ [0] lazysecrets ─────────────╮╭─ platform-prod ─────────────────────────────────────────────────╮ -│ 2 accounts ││ name platform-prod │ +│ ⚠ 1 expiring · 2 accounts ││ name platform-prod │ ╰───────────────────────────────╯│ ID sub-prod │ ╭─ [1] Sources - Favourites ────╮│ web https://portal.azure.com/#resource/subscriptions/sub…│ │ ▾ Azure (2) ││ vaults 3 │ @@ -20,7 +20,7 @@ ╭─ [3] Secrets - Keys - Certs ──╮│ │ │ db-password ││ │ │ api-key ││ │ -│ legacy-token (disabled) ││ │ +│ legacy-token (disabled) ✗ exp…││ │ │ ││ │ │ ││ │ │ ││ │ -- 2.54.0 From 2db3d28d6d51c96376924dfca814f7de99775344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:23:12 +0200 Subject: [PATCH 29/45] feat: lazysecrets list says expired or how soon, as the TUI does, in a field of its own --- cmd/lazysecrets/list.go | 65 ++++++++++++++++++++---------------- cmd/lazysecrets/list_test.go | 40 ++++++++++++++-------- internal/ui/app/app_test.go | 3 +- 3 files changed, 64 insertions(+), 44 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 0872f40..8c0d29e 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -29,9 +29,10 @@ import ( // // lazysecrets list | fzf --ansi --delimiter='\t' --with-nth='2..-3' --nth='2..' --accept-nth=-1 // -// Each line is the kind, a mark (★ and the provider's icon), the name, -// why it couldn't be read (empty unless it failed), the account and the -// link, tab-separated. The mark has a field of its own so a search can +// Each line is the kind, a mark (★, ◷ and the provider's icon), the name, +// why it couldn't be read (empty unless it failed), whether it expires +// soon or has expired (empty unless so), the account and the link, +// tab-separated. The mark has a field of its own so a search can // leave it out (fzf --nth), and ^prod finds names starting with prod. The // name is coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, @@ -45,12 +46,12 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, mark, name, error, account and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, mark, name, error, expiry, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") - expiry := fs.Bool("expiry", true, "put ⚠ before names expiring within ui.expiryWarningDays, ✗ before expired ones (text)") + expiry := fs.Bool("expiry", true, "say which expire within ui.expiryWarningDays (⚠ 12d) or have expired (✗ expired), after the name (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -72,8 +73,8 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if *color != "always" && *color != "never" { return fmt.Errorf("--color: %q is not always or never", *color) } - m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, expiry: *expiry, - color: *color == "always", warn: expiryWarn, now: time.Now()} + m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, color: *color == "always"} + now := time.Now() if *iconsOn { m.icons = icons.NerdFont } @@ -85,8 +86,12 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t mark := m.of(e) name := nameOf(e, theme, colored) why := errorOf(e, theme, colored) + var expires string + if *expiry { + expires = expiryOf(e, theme, expiryWarn, now, colored) + } // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(why), e.Account, e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(why), expires, e.Account, e.Link) return err } case "json": @@ -141,6 +146,22 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") +// expiryOf says, as the TUI does, that a secret, key or certificate has +// expired (✗ expired) or will within warn (⚠ 12d), or is "". +func expiryOf(e listing.Entry, theme styles.Styles, warn time.Duration, now time.Time, color bool) string { + render := renderer(color) + left := e.Expires.Sub(now) + switch { + case e.Expires.IsZero() || left > warn: + return "" + case left <= 0: + return render(theme.Error, "✗ expired") + case left < 24*time.Hour: + return render(theme.Warning, fmt.Sprintf("⚠ %dh", max(1, int(left.Hours())))) + } + return render(theme.Warning, fmt.Sprintf("⚠ %dd", int(left.Hours()/24))) +} + // errorOf is why a list couldn't be read, or "": with colour, a red ✗ // before it, as the TUI marks lists it can't read. func errorOf(e listing.Entry, theme styles.Styles, color bool) string { @@ -168,17 +189,14 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { } // marks says what goes before the name, in a field of its own so a -// search leaves it out: ★ for a starred entry, ◷ for one used lately, -// ⚠ for one expiring within warn and ✗ for an expired one, as the TUI -// marks them, then the provider's icon. The marks are right-aligned in -// room for every kind turned on, so they sit by the icon and names line -// up. +// search leaves it out: ★ for a starred entry and ◷ for one used lately, +// as the TUI marks them, then the provider's icon. The marks are +// right-aligned in room for every kind turned on, so they sit by the icon +// and names line up. type marks struct { - theme styles.Styles - icons icons.Set - stars, recent, expiry, color bool - warn time.Duration // ui.expiryWarningDays - now time.Time + theme styles.Styles + icons icons.Set + stars, recent, color bool } func (m marks) of(e listing.Entry) string { @@ -197,17 +215,6 @@ func (m marks) of(e listing.Entry) string { if m.recent { mark(e.Recent, m.theme.Muted, "◷") } - if m.expiry { - left := e.Expires.Sub(m.now) - switch { - case e.Expires.IsZero() || left > m.warn: - mark(false, m.theme.Muted, "") - case left <= 0: - mark(true, m.theme.Error, "✗") - default: - mark(true, m.theme.Warning, "⚠") - } - } pad := strings.Repeat(" ", room-len(parts)) // each mark and its space kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 005ef35..d8099f6 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -46,31 +46,43 @@ func TestListMarks(t *testing.T) { } } -func TestListRecentAndExpiryMarks(t *testing.T) { +func TestListRecentMarks(t *testing.T) { az := icons.NerdFont.Azure - now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) - m := marks{icons: icons.NerdFont, stars: true, recent: true, expiry: true, warn: 30 * 24 * time.Hour, now: now} + m := marks{icons: icons.NerdFont, stars: true, recent: true} for _, c := range []struct { e listing.Entry want string }{ - // Right-aligned in room for three: by the icon, names lined up. - {listing.Entry{Provider: "azure", Starred: true, Recent: true}, " ★ ◷ " + az}, - {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, " ✗ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(10 * 24 * time.Hour)}, " ⚠ " + az}, - {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour)}, " " + az}, + // Right-aligned in room for two: by the icon, names lined up. + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, + {listing.Entry{Provider: "azure"}, " " + az}, } { if got := m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) } } - m.color, m.theme = true, styles.Default() - if got := m.of(listing.Entry{Expires: now.Add(-time.Hour)}); !strings.Contains(got, styles.Default().Error.Render("✗")) { - t.Errorf("expired isn't a red ✗: %q", got) +} + +func TestListExpiry(t *testing.T) { + now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) + warn := 30 * 24 * time.Hour + for _, c := range []struct { + expires time.Time + want string + }{ + {time.Time{}, ""}, + {now.Add(-time.Hour), "✗ expired"}, + {now.Add(12*24*time.Hour + time.Hour), "⚠ 12d"}, + {now.Add(5 * time.Hour), "⚠ 5h"}, + {now.Add(60 * 24 * time.Hour), ""}, + } { + if got := expiryOf(listing.Entry{Expires: c.expires}, styles.Default(), warn, now, false); got != c.want { + t.Errorf("expires %v: %q, want %q", c.expires, got, c.want) + } } - if got := m.of(listing.Entry{Expires: now.Add(time.Hour)}); !strings.Contains(got, styles.Default().Warning.Render("⚠")) { - t.Errorf("expiring isn't a ⚠ in the warning colour: %q", got) + if got := expiryOf(listing.Entry{Expires: now.Add(-time.Hour)}, styles.Default(), warn, now, true); got != styles.Default().Error.Render("✗ expired") { + t.Errorf("expired isn't red: %q", got) } } diff --git a/internal/ui/app/app_test.go b/internal/ui/app/app_test.go index 6e7929a..34b3e07 100644 --- a/internal/ui/app/app_test.go +++ b/internal/ui/app/app_test.go @@ -1304,7 +1304,8 @@ func TestExpiringInStatus(t *testing.T) { t.Parallel() d := newDriverOpts(t, Options{ExpiryWarning: 30 * 24 * time.Hour}, fake.Azure(0)) d.keys("3", "]", "]") // load kv-app-prod's certificates - if !strings.Contains(d.screen(), "⚠ 2 expiring") { // old-tls, legacy-token + // old-tls and legacy-token. + if !strings.Contains(d.screen(), "⚠ 2 expiring") { t.Errorf("status line:\n%s", d.screen()) } d.keys("0") -- 2.54.0 From 4473e037f8b8b3b695e79de5f38a19b1db4a1941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:25:36 +0200 Subject: [PATCH 30/45] test: --demo's emergency-admin expires soon --- internal/provider/fake/fake.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 7118269..5fdd016 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -379,7 +379,8 @@ func AzureOps(delay time.Duration) *Provider { breakGlass := p.addContainer(prod, "kv-breakglass", "https://kv-breakglass.vault.azure.net", allTypes...) p.add(breakGlass, provider.TypeSecret, provider.Object{ Name: "emergency-admin", Enabled: &yes, Updated: base.AddDate(0, -4, 0), - Tags: map[string]string{"owner": "ops"}, Reference: secretRef("kv-breakglass", "emergency-admin"), + Expires: time.Now().AddDate(0, 0, 5).Truncate(24 * time.Hour), // soon, whenever the demo runs + Tags: map[string]string{"owner": "ops"}, Reference: secretRef("kv-breakglass", "emergency-admin"), }, "break-glass-demo-password") shared := p.addContainer(prod, "kv-shared-prod", "https://kv-shared-prod.vault.azure.net", allTypes...) p.add(shared, provider.TypeSecret, provider.Object{ -- 2.54.0 From 37164158ca0e0e63a14d39cea2341050232e3825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:28:07 +0200 Subject: [PATCH 31/45] =?UTF-8?q?feat:=20lazysecrets=20list=20marks=20what?= =?UTF-8?q?'s=20wrong=20(=E2=9C=97)=20or=20due=20(=E2=9A=A0)=20by=20the=20?= =?UTF-8?q?icon,=20and=20writes=20expired=20or=20expires=20in=204d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/lazysecrets/list.go | 53 +++++++++++++++++------------ cmd/lazysecrets/list_test.go | 65 +++++++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 37 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 8c0d29e..4ca7c04 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -73,8 +73,9 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if *color != "always" && *color != "never" { return fmt.Errorf("--color: %q is not always or never", *color) } - m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, color: *color == "always"} now := time.Now() + m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, expiry: *expiry, + color: *color == "always", warn: expiryWarn, now: now} if *iconsOn { m.icons = icons.NerdFont } @@ -146,8 +147,9 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") -// expiryOf says, as the TUI does, that a secret, key or certificate has -// expired (✗ expired) or will within warn (⚠ 12d), or is "". +// expiryOf says that a secret, key or certificate has expired, in red, +// or when it will if that's within warn (expires in 12d), in yellow, or +// is "". Its mark (✗, ⚠) is before the name. func expiryOf(e listing.Entry, theme styles.Styles, warn time.Duration, now time.Time, color bool) string { render := renderer(color) left := e.Expires.Sub(now) @@ -155,20 +157,17 @@ func expiryOf(e listing.Entry, theme styles.Styles, warn time.Duration, now time case e.Expires.IsZero() || left > warn: return "" case left <= 0: - return render(theme.Error, "✗ expired") + return render(theme.Error, "expired") case left < 24*time.Hour: - return render(theme.Warning, fmt.Sprintf("⚠ %dh", max(1, int(left.Hours())))) + return render(theme.Warning, fmt.Sprintf("expires in %dh", max(1, int(left.Hours())))) } - return render(theme.Warning, fmt.Sprintf("⚠ %dd", int(left.Hours()/24))) + return render(theme.Warning, fmt.Sprintf("expires in %dd", int(left.Hours()/24))) } -// errorOf is why a list couldn't be read, or "": with colour, a red ✗ -// before it, as the TUI marks lists it can't read. +// errorOf is why a list couldn't be read, in red, or "". Its mark (✗) +// is before the name. func errorOf(e listing.Entry, theme styles.Styles, color bool) string { - if e.Error == "" || !color { - return e.Error - } - return theme.Error.Render("✗ " + e.Error) + return renderer(color)(theme.Error, e.Error) } // nameOf is an entry's name for the text format: the path with the @@ -189,14 +188,17 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { } // marks says what goes before the name, in a field of its own so a -// search leaves it out: ★ for a starred entry and ◷ for one used lately, -// as the TUI marks them, then the provider's icon. The marks are -// right-aligned in room for every kind turned on, so they sit by the icon -// and names line up. +// search leaves it out: ✗ in red when something's wrong (it couldn't be +// read, or has expired) or ⚠ when it expires within warn; ★ for a starred +// entry and ◷ for one used lately, as the TUI marks them; then the +// provider's icon. The marks are right-aligned in room for every kind +// turned on, so they sit by the icon and names line up. type marks struct { - theme styles.Styles - icons icons.Set - stars, recent, color bool + theme styles.Styles + icons icons.Set + stars, recent, expiry, color bool + warn time.Duration // ui.expiryWarningDays + now time.Time } func (m marks) of(e listing.Entry) string { @@ -209,6 +211,15 @@ func (m marks) of(e listing.Entry) string { parts = append(parts, render(st, s)) } } + // What's wrong, then what to watch: room for one of them. + switch left := e.Expires.Sub(m.now); { + case e.Error != "" || (m.expiry && !e.Expires.IsZero() && left <= 0): + mark(true, m.theme.Error, "✗") + case m.expiry && !e.Expires.IsZero() && left <= m.warn: + mark(true, m.theme.Warning, "⚠") + default: + mark(false, m.theme.Error, "") + } if m.stars { mark(e.Starred, m.theme.Favourite, "★") } @@ -224,8 +235,8 @@ func (m marks) of(e listing.Entry) string { } if icon := strings.TrimSpace(m.icons.Prefix(kind)); icon != "" { parts = append(parts, render(m.theme.Kind(kind), icon)) - } else if len(parts) > 0 { - pad = strings.TrimSuffix(pad, " ") // nothing after the last mark + } else if len(parts) == 0 { + pad = strings.TrimSuffix(pad, " ") // no mark after the room } return pad + strings.Join(parts, " ") } diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index d8099f6..1dd358c 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -33,12 +33,13 @@ func TestListMarks(t *testing.T) { e listing.Entry want string }{ - {plain, listing.Entry{Provider: "azure", Starred: true}, "★ " + az}, - {plain, listing.Entry{Provider: "azure"}, " " + az}, // room for the star, so names line up - {marks{icons: icons.NerdFont}, listing.Entry{Provider: "azure", Starred: true}, az}, - {noIcons, listing.Entry{Provider: "azure", Starred: true}, "★"}, - {marks{}, listing.Entry{Provider: "azure", Starred: true}, ""}, - {colored, listing.Entry{Provider: "azure", Starred: true}, styles.Default().Favourite.Render("★")}, + // Room for the status mark and the star, so names line up. + {plain, listing.Entry{Provider: "azure", Starred: true}, " ★ " + az}, + {plain, listing.Entry{Provider: "azure"}, " " + az}, + {marks{icons: icons.NerdFont}, listing.Entry{Provider: "azure", Starred: true}, " " + az}, + {noIcons, listing.Entry{Provider: "azure", Starred: true}, " ★"}, + {marks{}, listing.Entry{Provider: "azure", Starred: true}, " "}, + {colored, listing.Entry{Provider: "azure", Starred: true}, " " + styles.Default().Favourite.Render("★")}, } { if got := c.m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) @@ -53,10 +54,10 @@ func TestListRecentMarks(t *testing.T) { e listing.Entry want string }{ - // Right-aligned in room for two: by the icon, names lined up. - {listing.Entry{Provider: "azure", Starred: true, Recent: true}, "★ ◷ " + az}, - {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, - {listing.Entry{Provider: "azure"}, " " + az}, + // Right-aligned in room for three: by the icon, names lined up. + {listing.Entry{Provider: "azure", Starred: true, Recent: true}, " ★ ◷ " + az}, + {listing.Entry{Provider: "azure", Recent: true}, " ◷ " + az}, + {listing.Entry{Provider: "azure"}, " " + az}, } { if got := m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) @@ -72,20 +73,52 @@ func TestListExpiry(t *testing.T) { want string }{ {time.Time{}, ""}, - {now.Add(-time.Hour), "✗ expired"}, - {now.Add(12*24*time.Hour + time.Hour), "⚠ 12d"}, - {now.Add(5 * time.Hour), "⚠ 5h"}, + {now.Add(-time.Hour), "expired"}, + {now.Add(12*24*time.Hour + time.Hour), "expires in 12d"}, + {now.Add(5 * time.Hour), "expires in 5h"}, {now.Add(60 * 24 * time.Hour), ""}, } { if got := expiryOf(listing.Entry{Expires: c.expires}, styles.Default(), warn, now, false); got != c.want { t.Errorf("expires %v: %q, want %q", c.expires, got, c.want) } } - if got := expiryOf(listing.Entry{Expires: now.Add(-time.Hour)}, styles.Default(), warn, now, true); got != styles.Default().Error.Render("✗ expired") { + if got := expiryOf(listing.Entry{Expires: now.Add(-time.Hour)}, styles.Default(), warn, now, true); got != styles.Default().Error.Render("expired") { t.Errorf("expired isn't red: %q", got) } } +func TestListStatusMark(t *testing.T) { + az := icons.NerdFont.Azure + now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) + m := marks{icons: icons.NerdFont, stars: true, expiry: true, warn: 30 * 24 * time.Hour, now: now} + for _, c := range []struct { + e listing.Entry + want string + }{ + // Right-aligned in room for two, as with ★ and ◷. + {listing.Entry{Provider: "azure", Error: "403 Forbidden"}, " ✗ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}, " ✗ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour), Starred: true}, "✗ ★ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(5 * 24 * time.Hour)}, " ⚠ " + az}, + {listing.Entry{Provider: "azure", Expires: now.Add(60 * 24 * time.Hour), Starred: true}, " ★ " + az}, + } { + if got := m.of(c.e); got != c.want { + t.Errorf("%+v: %q, want %q", c.e, got, c.want) + } + } + m.expiry = false // --expiry=false: no ⚠ or ✗ for expiry; errors still + if got := m.of(listing.Entry{Provider: "azure", Expires: now.Add(-time.Hour)}); got != " "+az { + t.Errorf("--expiry=false: %q", got) + } + m.expiry, m.color, m.theme = true, true, styles.Default() + if got := m.of(listing.Entry{Error: "403"}); !strings.Contains(got, styles.Default().Error.Render("✗")) { + t.Errorf("not a red ✗: %q", got) + } + if got := m.of(listing.Entry{Expires: now.Add(time.Hour)}); !strings.Contains(got, styles.Default().Warning.Render("⚠")) { + t.Errorf("not a yellow ⚠: %q", got) + } +} + func TestListErrors(t *testing.T) { e := listing.Entry{Provider: "azure", Path: []string{"platform-prod", "kv-restricted"}, Error: "403 Forbidden"} if got := nameOf(e, styles.Default(), false); got != "platform-prod / kv-restricted" { @@ -94,8 +127,8 @@ func TestListErrors(t *testing.T) { if got := errorOf(e, styles.Default(), false); got != "403 Forbidden" { t.Errorf("plain: %q", got) } - if got := errorOf(e, styles.Default(), true); got != styles.Default().Error.Render("✗ 403 Forbidden") { - t.Errorf("why isn't a red ✗: %q", got) + if got := errorOf(e, styles.Default(), true); got != styles.Default().Error.Render("403 Forbidden") { + t.Errorf("why isn't red: %q", got) } if got := errorOf(listing.Entry{}, styles.Default(), true); got != "" { t.Errorf("no error: %q", got) -- 2.54.0 From 2c9c37f8099d63f3eb423b673ede68cadb89fa64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:31:34 +0200 Subject: [PATCH 32/45] feat: lazysecrets list merges error and expiry into one status field --- cmd/lazysecrets/list.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 4ca7c04..2342e31 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -29,10 +29,9 @@ import ( // // lazysecrets list | fzf --ansi --delimiter='\t' --with-nth='2..-3' --nth='2..' --accept-nth=-1 // -// Each line is the kind, a mark (★, ◷ and the provider's icon), the name, -// why it couldn't be read (empty unless it failed), whether it expires -// soon or has expired (empty unless so), the account and the link, -// tab-separated. The mark has a field of its own so a search can +// Each line is the kind, a mark (✗ or ⚠, ★, ◷ and the provider's icon), +// the name, a status (why it couldn't be read, or that it has expired or +// expires soon; else empty), the account and the link, tab-separated. The mark has a field of its own so a search can // leave it out (fzf --nth), and ^prod finds names starting with prod. The // name is coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, @@ -46,12 +45,12 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, mark, name, error, expiry, account and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, mark, name, status, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") - expiry := fs.Bool("expiry", true, "say which expire within ui.expiryWarningDays (⚠ 12d) or have expired (✗ expired), after the name (text)") + expiry := fs.Bool("expiry", true, "mark and say which have expired (✗ expired) or expire within ui.expiryWarningDays (⚠ expires in 12d) (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") if err := fs.Parse(args); err != nil { @@ -86,13 +85,14 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t colored := *color == "always" mark := m.of(e) name := nameOf(e, theme, colored) - why := errorOf(e, theme, colored) - var expires string - if *expiry { - expires = expiryOf(e, theme, expiryWarn, now, colored) + // Why it couldn't be read (vaults, sources), or when it + // expires (secrets, keys, certificates): never both. + status := errorOf(e, theme, colored) + if status == "" && *expiry { + status = expiryOf(e, theme, expiryWarn, now, colored) } // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(why), expires, e.Account, e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(status), e.Account, e.Link) return err } case "json": -- 2.54.0 From 824f7249c3a9e9ba1797aefa3ba2862d2014d742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:36:00 +0200 Subject: [PATCH 33/45] feat: lazysecrets list prints notes, and --demo has a couple --- cmd/lazysecrets/list.go | 13 ++++++++----- internal/listing/listing.go | 10 ++++++---- internal/listing/listing_test.go | 9 ++++++--- internal/provider/fake/seed.go | 17 +++++++++++------ 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 2342e31..3a3531a 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -31,7 +31,8 @@ import ( // // Each line is the kind, a mark (✗ or ⚠, ★, ◷ and the provider's icon), // the name, a status (why it couldn't be read, or that it has expired or -// expires soon; else empty), the account and the link, tab-separated. The mark has a field of its own so a search can +// expires soon; else empty), its note (muted, or empty), the account and +// the link, tab-separated. The mark has a field of its own so a search can // leave it out (fzf --nth), and ^prod finds names starting with prod. The // name is coloured from the theme, // with the provider's icon (as in the TUI: --icons, LAZYSECRETS_ICONS, @@ -45,7 +46,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t fs := flag.NewFlagSet("list", flag.ContinueOnError) cached := fs.Bool("cached", false, "only what's cached, and repos: load nothing from Azure or Databricks") maxAge := fs.Duration("max-age", 2*time.Minute, "load cached lists older than this again") - format := fs.String("format", "text", "text: kind, mark, name, status, account and link, tab-separated; json: an object per line") + format := fs.String("format", "text", "text: kind, mark, name, status, note, account and link, tab-separated; json: an object per line") color := fs.String("color", "always", "colour the names (text): always or never; fzf needs --ansi") iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") @@ -91,8 +92,10 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if status == "" && *expiry { status = expiryOf(e, theme, expiryWarn, now, colored) } + note := renderer(colored)(theme.Muted, e.Note) // A tab or line break in a name would break the line up. - _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(status), e.Account, e.Link) + _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(status), + oneLine.Replace(note), e.Account, e.Link) return err } case "json": @@ -124,9 +127,9 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t } f = listing.Run(context.Background(), listing.Options{ Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Kinds: only, Timeout: timeout, - Mark: func(link, account string) (bool, time.Time, int) { + Mark: func(link, account string) (bool, time.Time, int, string) { n := st.Node(link) - return n.StarredFor(account), n.LastUsed, n.Uses + return n.StarredFor(account), n.LastUsed, n.Uses, n.Note }, }, emit) if cachePath != "" && !*cached { diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 8f32e9b..ef9b4c2 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -49,6 +49,8 @@ type Entry struct { // Enabled whether it's enabled, where the provider says (Azure). Expires time.Time `json:"expires,omitzero"` Enabled *bool `json:"enabled,omitempty"` + // Note is the user's note on it, if any. + Note string `json:"note,omitempty"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -68,9 +70,9 @@ type Options struct { // alone don't load any secrets. Lists that fail are always listed. Kinds []string // Mark tells whether the entry with link is starred for account, - // and when it was last used and how often (zero: not lately); nil - // marks nothing. - Mark func(link, account string) (starred bool, lastUsed time.Time, uses int) + // when it was last used and how often (zero: not lately), and its + // note; nil marks nothing. + Mark func(link, account string) (starred bool, lastUsed time.Time, uses int, note string) Timeout func(provider.Kind) time.Duration Now func() time.Time } @@ -233,7 +235,7 @@ func (l *lister) put(p provider.Provider, e Entry) { } e.Account = p.ID() if l.o.Mark != nil && e.Link != "" { - e.Starred, e.LastUsed, e.Uses = l.o.Mark(e.Link, e.Account) + e.Starred, e.LastUsed, e.Uses, e.Note = l.o.Mark(e.Link, e.Account) e.Recent = !e.LastUsed.IsZero() } id := p.ID() + "\x00" + e.Link + "\x00" + e.Error diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index f639480..f09b019 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -229,14 +229,14 @@ func TestListMarks(t *testing.T) { az := fake.Azure(0) var starredLink string got, _, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute, Kinds: []string{"secret"}, - Mark: func(link, account string) (bool, time.Time, int) { + Mark: func(link, account string) (bool, time.Time, int, string) { if starredLink == "" && strings.HasSuffix(link, "/db-password") { starredLink = link } if strings.HasSuffix(link, "/api-key") { - return false, time.Now(), 3 + return false, time.Now(), 3, "rotate in May" } - return link == starredLink && account == az.ID(), time.Time{}, 0 + return link == starredLink && account == az.ID(), time.Time{}, 0, "" }}) var starred, recent int for _, e := range got { @@ -246,6 +246,9 @@ func TestListMarks(t *testing.T) { t.Errorf("%s starred", e.Link) } } + if (e.Note != "") != strings.HasSuffix(e.Link, "/api-key") { + t.Errorf("%s: note %q", e.Link, e.Note) + } if e.Recent { recent++ if e.Uses != 3 || e.LastUsed.IsZero() { diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go index 5176ee9..cd9e237 100644 --- a/internal/provider/fake/seed.go +++ b/internal/provider/fake/seed.go @@ -8,13 +8,14 @@ import ( "git.kebcloud.no/keb/lazysecrets/internal/store" ) -// Seed stars and uses a few of the demo's secrets, so --demo shows -// Favourites (F), Recent (R) and stars in lazysecrets list. alice and +// Seed stars, notes and uses a few of the demo's secrets, so --demo +// shows Favourites (F), Recent (R), notes, and stars in lazysecrets list. alice and // admin are the two Azure accounts' provider IDs. func Seed(st *store.Store, alice, admin string) { type item struct { link, account, source string name string // else the link's last part + note string path []string star bool uses int @@ -23,11 +24,12 @@ func Seed(st *store.Store, alice, admin string) { const azure, dbx = "lazysecrets://azure/", "lazysecrets://databricks/adb-1111111111111111.11.azuredatabricks.net/" for _, it := range []item{ {link: azure + "kv-app-prod.vault.azure.net/secrets/db-password", account: alice, source: "sub-prod", - path: []string{"platform-prod", "kv-app-prod"}, star: true, uses: 12, ago: 20 * time.Minute}, + path: []string{"platform-prod", "kv-app-prod"}, star: true, uses: 12, ago: 20 * time.Minute, + note: "rotated by the data team each quarter"}, {link: azure + "kv-app-prod.vault.azure.net/secrets/api-key", account: alice, source: "sub-prod", path: []string{"platform-prod", "kv-app-prod"}, uses: 4, ago: 2 * time.Hour}, {link: azure + "kv-breakglass.vault.azure.net/secrets/emergency-admin", account: admin, source: "sub-prod", - path: []string{"platform-prod", "kv-breakglass"}, star: true}, + path: []string{"platform-prod", "kv-breakglass"}, star: true, note: "incidents only: tell #ops when used"}, {link: azure + "kv-shared-prod.vault.azure.net/secrets/smtp-password", account: alice, source: "sub-prod", path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", @@ -43,10 +45,13 @@ func Seed(st *store.Store, alice, admin string) { n.Name = cmp.Or(it.name, it.link[strings.LastIndex(it.link, "/")+1:]) n.Path, n.Source, n.Account = it.path, it.source, it.account } - if it.star { + if it.star || it.note != "" { _ = st.Update(it.link, func(n *store.Node) { context(n) - n.ToggleStar(it.account) + if it.star { + n.ToggleStar(it.account) + } + n.Note = it.note }) } for range it.uses { -- 2.54.0 From 5946f855bd02d5f0d2e193f63439533cee500275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:37:38 +0200 Subject: [PATCH 34/45] =?UTF-8?q?feat:=20lazysecrets=20list=20marks=20entr?= =?UTF-8?q?ies=20with=20a=20note=20(=E2=9C=8E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/lazysecrets/list.go | 20 ++++++++++++-------- cmd/lazysecrets/list_test.go | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 3a3531a..8cef3d9 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -51,6 +51,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") + notes := fs.Bool("notes", true, "put ✎ before names with a note, in mutedColor (text; the note is printed either way)") expiry := fs.Bool("expiry", true, "mark and say which have expired (✗ expired) or expire within ui.expiryWarningDays (⚠ expires in 12d) (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") @@ -74,7 +75,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t return fmt.Errorf("--color: %q is not always or never", *color) } now := time.Now() - m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, expiry: *expiry, + m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, notes: *notes, expiry: *expiry, color: *color == "always", warn: expiryWarn, now: now} if *iconsOn { m.icons = icons.NerdFont @@ -193,15 +194,15 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { // marks says what goes before the name, in a field of its own so a // search leaves it out: ✗ in red when something's wrong (it couldn't be // read, or has expired) or ⚠ when it expires within warn; ★ for a starred -// entry and ◷ for one used lately, as the TUI marks them; then the -// provider's icon. The marks are right-aligned in room for every kind +// entry and ◷ for one used lately, as the TUI marks them; ✎ for one with a +// note; then the provider's icon. The marks are right-aligned in room for every kind // turned on, so they sit by the icon and names line up. type marks struct { - theme styles.Styles - icons icons.Set - stars, recent, expiry, color bool - warn time.Duration // ui.expiryWarningDays - now time.Time + theme styles.Styles + icons icons.Set + stars, recent, notes, expiry, color bool + warn time.Duration // ui.expiryWarningDays + now time.Time } func (m marks) of(e listing.Entry) string { @@ -229,6 +230,9 @@ func (m marks) of(e listing.Entry) string { if m.recent { mark(e.Recent, m.theme.Muted, "◷") } + if m.notes { + mark(e.Note != "", m.theme.Muted, "✎") + } pad := strings.Repeat(" ", room-len(parts)) // each mark and its space kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 1dd358c..7056460 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -87,6 +87,23 @@ func TestListExpiry(t *testing.T) { } } +func TestListNoteMark(t *testing.T) { + az := icons.NerdFont.Azure + m := marks{icons: icons.NerdFont, stars: true, notes: true} + for _, c := range []struct { + e listing.Entry + want string + }{ + {listing.Entry{Provider: "azure", Note: "rotate in May"}, " ✎ " + az}, + {listing.Entry{Provider: "azure", Note: "x", Starred: true}, " ★ ✎ " + az}, + {listing.Entry{Provider: "azure"}, " " + az}, + } { + if got := m.of(c.e); got != c.want { + t.Errorf("%+v: %q, want %q", c.e, got, c.want) + } + } +} + func TestListStatusMark(t *testing.T) { az := icons.NerdFont.Azure now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) -- 2.54.0 From 1c5a6a508704b20cc9982ee2186b4d8ac9e5ed85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:43:27 +0200 Subject: [PATCH 35/45] =?UTF-8?q?feat:=20lazysecrets=20list's=20note=20mar?= =?UTF-8?q?k=20is=20a=20Nerd=20Font=20note,=20=E2=9C=8E=20without=20icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/lazysecrets/list.go | 10 ++++++---- cmd/lazysecrets/list_test.go | 8 ++++++-- internal/ui/icons/icons.go | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 8cef3d9..9f5f7c6 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -1,6 +1,7 @@ package main import ( + "cmp" "context" "encoding/json" "errors" @@ -51,7 +52,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") - notes := fs.Bool("notes", true, "put ✎ before names with a note, in mutedColor (text; the note is printed either way)") + notes := fs.Bool("notes", true, "put a note icon (✎ without --icons) before names with a note, in mutedColor (text; the note is printed either way)") expiry := fs.Bool("expiry", true, "mark and say which have expired (✗ expired) or expire within ui.expiryWarningDays (⚠ expires in 12d) (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") @@ -194,8 +195,9 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { // marks says what goes before the name, in a field of its own so a // search leaves it out: ✗ in red when something's wrong (it couldn't be // read, or has expired) or ⚠ when it expires within warn; ★ for a starred -// entry and ◷ for one used lately, as the TUI marks them; ✎ for one with a -// note; then the provider's icon. The marks are right-aligned in room for every kind +// entry and ◷ for one used lately, as the TUI marks them; a note icon +// (✎ without Nerd Font icons) for one with a note; then the provider's +// icon. The marks are right-aligned in room for every kind // turned on, so they sit by the icon and names line up. type marks struct { theme styles.Styles @@ -231,7 +233,7 @@ func (m marks) of(e listing.Entry) string { mark(e.Recent, m.theme.Muted, "◷") } if m.notes { - mark(e.Note != "", m.theme.Muted, "✎") + mark(e.Note != "", m.theme.Muted, cmp.Or(m.icons.Note, "✎")) } pad := strings.Repeat(" ", room-len(parts)) // each mark and its space kind := provider.Kind("") diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index 7056460..ba322c2 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -94,14 +94,18 @@ func TestListNoteMark(t *testing.T) { e listing.Entry want string }{ - {listing.Entry{Provider: "azure", Note: "rotate in May"}, " ✎ " + az}, - {listing.Entry{Provider: "azure", Note: "x", Starred: true}, " ★ ✎ " + az}, + {listing.Entry{Provider: "azure", Note: "rotate in May"}, " " + icons.NerdFont.Note + " " + az}, + {listing.Entry{Provider: "azure", Note: "x", Starred: true}, " ★ " + icons.NerdFont.Note + " " + az}, {listing.Entry{Provider: "azure"}, " " + az}, } { if got := m.of(c.e); got != c.want { t.Errorf("%+v: %q, want %q", c.e, got, c.want) } } + m.icons = icons.None // without Nerd Font icons + if got := m.of(listing.Entry{Provider: "azure", Note: "x"}); got != " ✎" { + t.Errorf("no icons: %q", got) + } } func TestListStatusMark(t *testing.T) { diff --git a/internal/ui/icons/icons.go b/internal/ui/icons/icons.go index c726da4..15a3941 100644 --- a/internal/ui/icons/icons.go +++ b/internal/ui/icons/icons.go @@ -11,6 +11,7 @@ type Set struct { Repo string Encrypted string // an encrypted file (SOPS) PlainFile string // a plain text secrets file (.env) + Note string // has a note (lazysecrets list) } // None renders no icons. @@ -24,6 +25,7 @@ var NerdFont = Set{ Repo: "\U000F02A2", // md-git Encrypted: "\U000F033E", // md-lock PlainFile: "\U000F0214", // md-file + Note: "\U000F09ED", } // Prefix returns the icon for kind followed by a space, or "" if the set has -- 2.54.0 From c80a84cada32088804b15a8bcae0a04265bd8fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 16:46:05 +0200 Subject: [PATCH 36/45] feat: lazysecrets list puts the note icon before the note, not in the marks --- cmd/lazysecrets/list.go | 37 ++++++++++++++++++++++-------------- cmd/lazysecrets/list_test.go | 27 +++++++++++--------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 9f5f7c6..1d43850 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -52,7 +52,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t iconsOn := fs.Bool("icons", withIcons, "put the provider's Nerd Font icon before names (text)") stars := fs.Bool("stars", true, "put ★ before starred names, in the theme's favouriteColor (text)") recent := fs.Bool("recent", withRecent, "put ◷ before names used lately, in mutedColor (text; default ui.recentIcon)") - notes := fs.Bool("notes", true, "put a note icon (✎ without --icons) before names with a note, in mutedColor (text; the note is printed either way)") + notes := fs.Bool("notes", true, "start a note with a note icon (✎ without --icons) (text; the note is printed either way)") expiry := fs.Bool("expiry", true, "mark and say which have expired (✗ expired) or expire within ui.expiryWarningDays (⚠ expires in 12d) (text)") kinds := fs.String("kind", "", "only these kinds, comma-separated: "+strings.Join(listing.Kinds, ", ")+" (vault: also scopes and repo files)") showErrors := fs.Bool("errors", true, "list the lists that can't be read, with why (text: ✗ lines; json: \"error\")") @@ -76,7 +76,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t return fmt.Errorf("--color: %q is not always or never", *color) } now := time.Now() - m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, notes: *notes, expiry: *expiry, + m := marks{theme: theme, icons: icons.None, stars: *stars, recent: *recent, expiry: *expiry, color: *color == "always", warn: expiryWarn, now: now} if *iconsOn { m.icons = icons.NerdFont @@ -94,7 +94,7 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if status == "" && *expiry { status = expiryOf(e, theme, expiryWarn, now, colored) } - note := renderer(colored)(theme.Muted, e.Note) + note := noteOf(e, theme, m.icons, *notes, colored) // A tab or line break in a name would break the line up. _, err := fmt.Fprintf(out, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", e.Kind, mark, oneLine.Replace(name), oneLine.Replace(status), oneLine.Replace(note), e.Account, e.Link) @@ -152,6 +152,19 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t var oneLine = strings.NewReplacer("\t", " ", "\r\n", " ", "\n", " ", "\r", " ") +// noteOf is the entry's note, muted, after a note icon (✎ without Nerd +// Font icons) with icon; or "". +func noteOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, icon, color bool) string { + if e.Note == "" { + return "" + } + note := e.Note + if icon { + note = cmp.Or(iconSet.Note, "✎") + " " + note + } + return renderer(color)(theme.Muted, note) +} + // expiryOf says that a secret, key or certificate has expired, in red, // or when it will if that's within warn (expires in 12d), in yellow, or // is "". Its mark (✗, ⚠) is before the name. @@ -195,16 +208,15 @@ func nameOf(e listing.Entry, theme styles.Styles, color bool) string { // marks says what goes before the name, in a field of its own so a // search leaves it out: ✗ in red when something's wrong (it couldn't be // read, or has expired) or ⚠ when it expires within warn; ★ for a starred -// entry and ◷ for one used lately, as the TUI marks them; a note icon -// (✎ without Nerd Font icons) for one with a note; then the provider's -// icon. The marks are right-aligned in room for every kind +// entry and ◷ for one used lately, as the TUI marks them; then the +// provider's icon. The marks are right-aligned in room for every kind // turned on, so they sit by the icon and names line up. type marks struct { - theme styles.Styles - icons icons.Set - stars, recent, notes, expiry, color bool - warn time.Duration // ui.expiryWarningDays - now time.Time + theme styles.Styles + icons icons.Set + stars, recent, expiry, color bool + warn time.Duration // ui.expiryWarningDays + now time.Time } func (m marks) of(e listing.Entry) string { @@ -232,9 +244,6 @@ func (m marks) of(e listing.Entry) string { if m.recent { mark(e.Recent, m.theme.Muted, "◷") } - if m.notes { - mark(e.Note != "", m.theme.Muted, cmp.Or(m.icons.Note, "✎")) - } pad := strings.Repeat(" ", room-len(parts)) // each mark and its space kind := provider.Kind("") for _, k := range []provider.Kind{provider.KindAzure, provider.KindDatabricks, provider.KindRepo} { diff --git a/cmd/lazysecrets/list_test.go b/cmd/lazysecrets/list_test.go index ba322c2..5b2ce20 100644 --- a/cmd/lazysecrets/list_test.go +++ b/cmd/lazysecrets/list_test.go @@ -87,25 +87,20 @@ func TestListExpiry(t *testing.T) { } } -func TestListNoteMark(t *testing.T) { - az := icons.NerdFont.Azure - m := marks{icons: icons.NerdFont, stars: true, notes: true} - for _, c := range []struct { - e listing.Entry - want string - }{ - {listing.Entry{Provider: "azure", Note: "rotate in May"}, " " + icons.NerdFont.Note + " " + az}, - {listing.Entry{Provider: "azure", Note: "x", Starred: true}, " ★ " + icons.NerdFont.Note + " " + az}, - {listing.Entry{Provider: "azure"}, " " + az}, - } { - if got := m.of(c.e); got != c.want { - t.Errorf("%+v: %q, want %q", c.e, got, c.want) - } +func TestListNotes(t *testing.T) { + e := listing.Entry{Note: "rotate in May"} + if got := noteOf(e, styles.Default(), icons.NerdFont, true, false); got != icons.NerdFont.Note+" rotate in May" { + t.Errorf("icons: %q", got) } - m.icons = icons.None // without Nerd Font icons - if got := m.of(listing.Entry{Provider: "azure", Note: "x"}); got != " ✎" { + if got := noteOf(e, styles.Default(), icons.None, true, false); got != "✎ rotate in May" { t.Errorf("no icons: %q", got) } + if got := noteOf(e, styles.Default(), icons.NerdFont, false, false); got != "rotate in May" { + t.Errorf("--notes=false: %q", got) + } + if got := noteOf(listing.Entry{}, styles.Default(), icons.NerdFont, true, true); got != "" { + t.Errorf("no note: %q", got) + } } func TestListStatusMark(t *testing.T) { -- 2.54.0 From 003f149690b3e85236355bf8e66fbcaef1da4d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 19:22:45 +0200 Subject: [PATCH 37/45] feat: lazysecrets list's JSON has each entry's config reference and web page --- internal/listing/listing.go | 11 ++++++++--- internal/listing/listing_test.go | 5 +++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/listing/listing.go b/internal/listing/listing.go index ef9b4c2..73d4d2a 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -51,6 +51,11 @@ type Entry struct { Enabled *bool `json:"enabled,omitempty"` // Note is the user's note on it, if any. Note string `json:"note,omitempty"` + // Reference is how config refers to a secret, where the provider has + // a way (@Microsoft.KeyVault(...), {{secrets/scope/key}}); URL its + // web page (portal, workspace), if any. + Reference string `json:"reference,omitempty"` + URL string `json:"url,omitempty"` // Error says why a source's vaults or a vault's secrets couldn't be // listed. The entry is then that source or vault, again, or with an // account's sources unreadable, the account without a link. @@ -207,12 +212,12 @@ func (l *lister) objects(p provider.Provider, c provider.Container, objs []provi } l.put(p, Entry{Link: r.String(), Kind: strings.ToLower(string(o.Type)), Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name, o.Name}, AccountLabel: accountOf(c.Source), - Expires: o.Expires, Enabled: o.Enabled}) + Expires: o.Expires, Enabled: o.Enabled, Reference: o.Reference, URL: o.URL}) } } func sourceEntry(src provider.Source) Entry { - e := Entry{Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, AccountLabel: accountOf(src)} + e := Entry{Kind: "source", Provider: kindOf(src.Kind), Path: []string{src.Name}, AccountLabel: accountOf(src), URL: src.URL} if r, err := ref.ForSource(src); err == nil { e.Link = r.String() } @@ -220,7 +225,7 @@ func sourceEntry(src provider.Source) Entry { } func containerEntry(c provider.Container) Entry { - e := Entry{Kind: "vault", Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name}, AccountLabel: accountOf(c.Source)} + e := Entry{Kind: "vault", Provider: kindOf(c.Source.Kind), Path: []string{c.Source.Name, c.Name}, AccountLabel: accountOf(c.Source), URL: c.URL} if r, err := ref.ForContainer(c, provider.TypeSecret); err == nil { e.Link = r.String() } diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index f09b019..13167f4 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -87,6 +87,11 @@ func TestListLoadsAndCaches(t *testing.T) { t.Errorf("provider %q", e.Provider) } } + for _, e := range got { + if e.Kind == "secret" && e.Provider == "azure" && (!strings.HasPrefix(e.Reference, "@Microsoft.KeyVault(") || e.URL == "") { + t.Errorf("%s: reference %q, url %q", e.Link, e.Reference, e.URL) + } + } if len(f.Sources) != 1 || len(f.Containers) == 0 || len(f.Objects) == 0 { t.Errorf("not cached: %d sources, %d containers, %d objects", len(f.Sources), len(f.Containers), len(f.Objects)) } -- 2.54.0 From 593d83fc255abba12240c9f9925fa536f029564a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 19:39:24 +0200 Subject: [PATCH 38/45] feat: --demo stars platform-prod for alice too, and api-key expires soon --- cmd/lazysecrets/main.go | 5 ++++- internal/provider/fake/fake.go | 13 +++++++++++++ internal/provider/fake/seed.go | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cmd/lazysecrets/main.go b/cmd/lazysecrets/main.go index d2b5398..736fb1f 100644 --- a/cmd/lazysecrets/main.go +++ b/cmd/lazysecrets/main.go @@ -322,8 +322,11 @@ Flags: // Two Azure accounts, like a personal and an admin login in az. alice, admin := "Azure:alice@example.com/demo", "Azure:admin.alice@example.com/demo" fake.Seed(st, alice, admin) + az := fake.Azure(400*time.Millisecond).As(alice, "Azure · alice") + // Due soon whenever the demo runs (the tests' dates are fixed). + az.Expire("kv-app-prod", "api-key", time.Now().AddDate(0, 0, 9).Truncate(24*time.Hour)) providers = []provider.Provider{ - fake.Azure(400*time.Millisecond).As(alice, "Azure · alice"), + az, fake.AzureOps(700*time.Millisecond).As(admin, "Azure · admin.alice"), fake.Databricks(600 * time.Millisecond), fake.Repos(), diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 5fdd016..8a766d9 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -218,6 +218,19 @@ func (p *Provider) addContainer(src provider.Source, name, detail string, types return c } +// Expire sets when the object name in vault expires, for --demo: a date +// relative to today in the test data would change the tests' screenshots +// from day to day. +func (p *Provider) Expire(vault, name string, at time.Time) { + for _, objs := range p.objects { + for i := range objs { + if objs[i].Container.Name == vault && objs[i].Name == name { + objs[i].Expires = at + } + } + } +} + func (p *Provider) add(c provider.Container, t provider.ObjectType, o provider.Object, value string) provider.Object { o.Container = c o.Type = t diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go index cd9e237..406d377 100644 --- a/internal/provider/fake/seed.go +++ b/internal/provider/fake/seed.go @@ -34,7 +34,9 @@ func Seed(st *store.Store, alice, admin string) { path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", path: []string{"prod", "app"}, star: true, uses: 3, ago: 5 * time.Hour}, - // A subscription, and a repo's file. + // A subscription, for both accounts, and a repo's file. + {link: azure + "subscriptions/sub-prod", account: alice, source: "sub-prod", + name: "platform-prod", star: true}, {link: azure + "subscriptions/sub-prod", account: admin, source: "sub-prod", name: "platform-prod", star: true}, {link: "lazysecrets://repo/github.com%2Facme%2Flazysecrets-demo/deploy%2Fprod%2Fsecrets.yaml", account: "Repos", -- 2.54.0 From 4764208e0446e0a3f19c1f09023a7840da3a57d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 19:49:08 +0200 Subject: [PATCH 39/45] test: --demo's legacy-token is expired, no longer disabled too --- internal/provider/fake/fake.go | 2 +- internal/ui/app/testdata/TestGolden.golden | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 8a766d9..9c9fc0a 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -300,7 +300,7 @@ func Azure(delay time.Duration) *Provider { Reference: secretRef("kv-app-prod", "api-key"), }, "sk_live_51HxDEMO0000000000000000") p.add(kv, provider.TypeSecret, provider.Object{ - Name: "legacy-token", Version: "0c11de", Enabled: &no, Updated: base.AddDate(-1, 0, 0), + Name: "legacy-token", Version: "0c11de", Enabled: &yes, Updated: base.AddDate(-1, 0, 0), Expires: base.AddDate(0, -3, 0), Reference: secretRef("kv-app-prod", "legacy-token"), }, "deprecated") diff --git a/internal/ui/app/testdata/TestGolden.golden b/internal/ui/app/testdata/TestGolden.golden index dd076a8..7a6c537 100644 --- a/internal/ui/app/testdata/TestGolden.golden +++ b/internal/ui/app/testdata/TestGolden.golden @@ -20,7 +20,7 @@ ╭─ [3] Secrets - Keys - Certs ──╮│ │ │ db-password ││ │ │ api-key ││ │ -│ legacy-token (disabled) ✗ exp…││ │ +│ legacy-token ✗ expired ││ │ │ ││ │ │ ││ │ │ ││ │ -- 2.54.0 From 0a3a07d5cf20f51a19acf79cf7cd029dfe978acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 19:53:59 +0200 Subject: [PATCH 40/45] test: --demo's smtp-password is disabled, with a note why --- internal/provider/fake/fake.go | 4 ++-- internal/provider/fake/seed.go | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 9c9fc0a..618835d 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -350,7 +350,7 @@ func Azure(delay time.Duration) *Provider { Name: "env-share", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "env-share"), }, "q8Zt3VwL1mXc7Rk2Pj9Ys4Hn6Bf0Ga5Ud+Te/OiWlE=") p.add(shared, provider.TypeSecret, provider.Object{ - Name: "smtp-password", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), + Name: "smtp-password", Enabled: &no, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), }, "smtp-demo-password") p.fail(shared, ErrForbiddenKeys, provider.TypeKey) @@ -397,7 +397,7 @@ func AzureOps(delay time.Duration) *Provider { }, "break-glass-demo-password") shared := p.addContainer(prod, "kv-shared-prod", "https://kv-shared-prod.vault.azure.net", allTypes...) p.add(shared, provider.TypeSecret, provider.Object{ - Name: "smtp-password", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), + Name: "smtp-password", Enabled: &no, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), }, "smtp-demo-password") // Unlike the first account, ops may read keys here. p.add(shared, provider.TypeKey, provider.Object{ diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go index 406d377..25af2b4 100644 --- a/internal/provider/fake/seed.go +++ b/internal/provider/fake/seed.go @@ -31,7 +31,8 @@ func Seed(st *store.Store, alice, admin string) { {link: azure + "kv-breakglass.vault.azure.net/secrets/emergency-admin", account: admin, source: "sub-prod", path: []string{"platform-prod", "kv-breakglass"}, star: true, note: "incidents only: tell #ops when used"}, {link: azure + "kv-shared-prod.vault.azure.net/secrets/smtp-password", account: alice, source: "sub-prod", - path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, + path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour, + note: "migrated to Microsoft Graph sendMail; disabled, delete after Q4"}, {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", path: []string{"prod", "app"}, star: true, uses: 3, ago: 5 * time.Hour}, // A subscription, for both accounts, and a repo's file. -- 2.54.0 From 1eb2f21588fe94dcfb28088031f27e9ef9c674ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 19:57:52 +0200 Subject: [PATCH 41/45] test: --demo's disabled smtp-password, with its note, is in kv-app-prod --- internal/provider/fake/fake.go | 8 ++++++-- internal/provider/fake/seed.go | 5 +++-- internal/ui/app/app_test.go | 14 +++++++------- internal/ui/app/testdata/TestGolden.golden | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/internal/provider/fake/fake.go b/internal/provider/fake/fake.go index 618835d..6e467ef 100644 --- a/internal/provider/fake/fake.go +++ b/internal/provider/fake/fake.go @@ -303,6 +303,10 @@ func Azure(delay time.Duration) *Provider { Name: "legacy-token", Version: "0c11de", Enabled: &yes, Updated: base.AddDate(-1, 0, 0), Expires: base.AddDate(0, -3, 0), Reference: secretRef("kv-app-prod", "legacy-token"), }, "deprecated") + p.add(kv, provider.TypeSecret, provider.Object{ + Name: "smtp-password", Version: "7d2e90", Enabled: &no, Updated: base.AddDate(0, -2, 0), + Reference: secretRef("kv-app-prod", "smtp-password"), + }, "smtp-demo-password") p.add(kv, provider.TypeKey, provider.Object{ Name: "signing-key", Version: "5e21b7", Enabled: &yes, Updated: base.AddDate(0, -3, 0), @@ -350,7 +354,7 @@ func Azure(delay time.Duration) *Provider { Name: "env-share", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "env-share"), }, "q8Zt3VwL1mXc7Rk2Pj9Ys4Hn6Bf0Ga5Ud+Te/OiWlE=") p.add(shared, provider.TypeSecret, provider.Object{ - Name: "smtp-password", Enabled: &no, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), + Name: "smtp-password", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), }, "smtp-demo-password") p.fail(shared, ErrForbiddenKeys, provider.TypeKey) @@ -397,7 +401,7 @@ func AzureOps(delay time.Duration) *Provider { }, "break-glass-demo-password") shared := p.addContainer(prod, "kv-shared-prod", "https://kv-shared-prod.vault.azure.net", allTypes...) p.add(shared, provider.TypeSecret, provider.Object{ - Name: "smtp-password", Enabled: &no, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), + Name: "smtp-password", Enabled: &yes, Updated: base, Reference: secretRef("kv-shared-prod", "smtp-password"), }, "smtp-demo-password") // Unlike the first account, ops may read keys here. p.add(shared, provider.TypeKey, provider.Object{ diff --git a/internal/provider/fake/seed.go b/internal/provider/fake/seed.go index 25af2b4..aeeca96 100644 --- a/internal/provider/fake/seed.go +++ b/internal/provider/fake/seed.go @@ -31,8 +31,9 @@ func Seed(st *store.Store, alice, admin string) { {link: azure + "kv-breakglass.vault.azure.net/secrets/emergency-admin", account: admin, source: "sub-prod", path: []string{"platform-prod", "kv-breakglass"}, star: true, note: "incidents only: tell #ops when used"}, {link: azure + "kv-shared-prod.vault.azure.net/secrets/smtp-password", account: alice, source: "sub-prod", - path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour, - note: "migrated to Microsoft Graph sendMail; disabled, delete after Q4"}, + path: []string{"platform-prod", "kv-shared-prod"}, uses: 2, ago: 26 * time.Hour}, + {link: azure + "kv-app-prod.vault.azure.net/secrets/smtp-password", account: alice, source: "sub-prod", + path: []string{"platform-prod", "kv-app-prod"}, note: "migrated to Microsoft Graph sendMail; delete after Q4"}, {link: dbx + "app/storage-key", account: "Databricks", source: "dbx-prod", path: []string{"prod", "app"}, star: true, uses: 3, ago: 5 * time.Hour}, // A subscription, for both accounts, and a repo's file. diff --git a/internal/ui/app/app_test.go b/internal/ui/app/app_test.go index 34b3e07..39d19e9 100644 --- a/internal/ui/app/app_test.go +++ b/internal/ui/app/app_test.go @@ -686,7 +686,7 @@ func TestFilter(t *testing.T) { d.keys("/") d.typeText("api-k") d.keys("enter", "esc") // apply, then esc clears the applied filter - if d.m.secrets.Len() != 3 { + if d.m.secrets.Len() != 4 { t.Errorf("esc should clear the applied filter, visible = %d", d.m.secrets.Len()) } if _, _, s := d.selected(); s != "api-key" { @@ -698,13 +698,13 @@ func TestMoveWhileFiltering(t *testing.T) { t.Parallel() d := newDriver(t) d.keys("3", "/") - d.typeText("a") // all three secrets contain an a - if d.m.secrets.Len() != 3 { + d.typeText("a") // all four secrets contain an a + if d.m.secrets.Len() != 4 { t.Fatalf("visible = %d", d.m.secrets.Len()) } _, _, initial := d.selected() // kept from before filtering: the middle row var seen []string - for _, k := range []rune{'j', 'j', 'k'} { + for _, k := range []rune{'j', 'j', 'j', 'k'} { d.send(tea.KeyPressMsg{Code: k, Mod: tea.ModCtrl}) _, _, s := d.selected() seen = append(seen, s) @@ -712,9 +712,9 @@ func TestMoveWhileFiltering(t *testing.T) { if !d.m.secrets.Filtering() { t.Fatal("ctrl+j/k left filter mode") } - // down to the bottom, stay there, back up to where it started - if seen[0] == initial || seen[1] != seen[0] || seen[2] != initial { - t.Errorf("from %q, ctrl+j, ctrl+j, ctrl+k selected %v", initial, seen) + // down to the bottom, stay there, back up one + if seen[0] == initial || seen[2] != seen[1] || seen[3] != seen[0] { + t.Errorf("from %q, ctrl+j ×3, ctrl+k selected %v", initial, seen) } if !strings.Contains(d.screen(), "ctrl+j/n down") { t.Errorf("filter help missing ctrl+j:\n%s", d.screen()) diff --git a/internal/ui/app/testdata/TestGolden.golden b/internal/ui/app/testdata/TestGolden.golden index 7a6c537..e9ac20d 100644 --- a/internal/ui/app/testdata/TestGolden.golden +++ b/internal/ui/app/testdata/TestGolden.golden @@ -21,6 +21,7 @@ │ db-password ││ │ │ api-key ││ │ │ legacy-token ✗ expired ││ │ +│ smtp-password (disabled) ││ │ │ ││ │ │ ││ │ │ ││ │ @@ -28,6 +29,5 @@ │ ││ │ │ ││ │ │ ││ │ -│ ││ │ -╰────────────────────── 1 of 3 ─╯╰──────────────────────────────────────────────────────── 1 of 4 ─╯ +╰────────────────────── 1 of 4 ─╯╰──────────────────────────────────────────────────────── 1 of 4 ─╯ enter open • ctrl+s search • s copy link • S share • f star • F favourites • … • ? help • q quit \ No newline at end of file -- 2.54.0 From 552abc368ee6527f5d0867a142d2c184a0660f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 21:03:18 +0200 Subject: [PATCH 42/45] docs: links.md is sharing.md --- docs/config.md | 4 ++-- docs/keys.md | 2 +- docs/repos.md | 6 +++--- docs/{links.md => sharing.md} | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) rename docs/{links.md => sharing.md} (98%) diff --git a/docs/config.md b/docs/config.md index 2429c84..dcb47c2 100644 --- a/docs/config.md +++ b/docs/config.md @@ -54,8 +54,8 @@ sharing: # sharing env files as encrypted links ``` More, each on its own page: [repos](repos.md) (`providers.repos`), -[sharing env files](links.md#sharing-env-files) (`sharing`), the -[link handler](links.md#from-the-browser-and-chat) (`linkHandler`), +[sharing env files](sharing.md#sharing-env-files) (`sharing`), the +[link handler](sharing.md#from-the-browser-and-chat) (`linkHandler`), [keybindings](keys.md#rebinding-keys) (`keybinding`) and [custom commands](custom-commands.md) (`customCommands`). diff --git a/docs/keys.md b/docs/keys.md index 3bc1536..90e862c 100644 --- a/docs/keys.md +++ b/docs/keys.md @@ -54,7 +54,7 @@ match case exactly. | `v` | versions of the selected item (Azure); `space`/`y`/`Y` then act on that version; `esc`, `⌫` or `v` to go back | | `o` | open the selected item in the browser (over SSH: copy the link) | | `e` | open the selected SOPS or `.env` file, or a secret's file at its line ([how](repos.md#opening-files)) | -| `s` / `S` | copy a [link](links.md) to the selected item / share menu (also env files, [encrypted](links.md#sharing-env-files)) | +| `s` / `S` | copy a [link](sharing.md) to the selected item / share menu (also env files, [encrypted](sharing.md#sharing-env-files)) | | `ctrl+o` | open a link or reference (or just paste one) | | `x` | [custom commands](custom-commands.md) | | `L` | sign in again (shown when a login has expired) | diff --git a/docs/repos.md b/docs/repos.md index 47da3a9..3a994a7 100644 --- a/docs/repos.md +++ b/docs/repos.md @@ -58,7 +58,7 @@ providers: ``` A repo's `.lazysecrets.yaml` can also name the secret its env files are -[shared](links.md#sharing-env-files) with: +[shared](sharing.md#sharing-env-files) with: ```yaml sharing: @@ -100,7 +100,7 @@ sops 3.8 or later. ## Links -`S` → `f` shares env files as an [encrypted link](links.md#sharing-env-files). +`S` → `f` shares env files as an [encrypted link](sharing.md#sharing-env-files). Links name the repo by its git remote, so they open in a colleague's clone wherever it is: @@ -109,4 +109,4 @@ wherever it is: lazysecrets://repo/git.example.com%2Fteam%2Finfra/secrets%2Fapp.yaml/db.password ``` -See [links](links.md). +See [sharing](sharing.md). diff --git a/docs/links.md b/docs/sharing.md similarity index 98% rename from docs/links.md rename to docs/sharing.md index 53139f5..5145e84 100644 --- a/docs/links.md +++ b/docs/sharing.md @@ -1,7 +1,7 @@ -# Links +# Sharing -Subscriptions, workspaces, vaults, scopes, repos, files and secrets can -be shared as a `lazysecrets://` link, in chat or a ticket. Whoever opens +Subscriptions, workspaces, vaults, scopes, repos, files and secrets are +shared as a `lazysecrets://` link, in chat or a ticket. Whoever opens it lands on that item, reading it with their own account and permissions: the link names the item, never its value. Env files can also be [shared encrypted](#sharing-env-files), in the link itself. @@ -15,7 +15,7 @@ lazysecrets://databricks/adb-1111111111111111.11.azuredatabricks.net/app/storage lazysecrets://repo/git.example.com%2Fteam%2Finfra/secrets%2Fapp.yaml/db.password ``` -## Sharing +## Sharing a link `s` copies a link to the selected item (from the versions view, pinned to that version). `S` opens the share menu: @@ -99,7 +99,7 @@ the value breaks every old link. Whoever has read the secret's value before can decrypt links made with it without asking the vault, so rotate it now and then: new links use the newest version. -## Opening +## Opening a link - Paste it into lazysecrets, or press `ctrl+o`, which reads the clipboard and fills in any reference it finds there. Key Vault URLs, -- 2.54.0 From ea58530068b37f1a8b543e60e756ba9bc5a848be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 21:05:11 +0200 Subject: [PATCH 43/45] chore: updated docs --- README.md | 34 +++++++---- docs/assets/fzf-example.png | Bin 0 -> 269051 bytes docs/assets/lazysecrets.png | Bin 237549 -> 264090 bytes docs/integration.md | 111 ++++++++++++++++++------------------ 4 files changed, 77 insertions(+), 68 deletions(-) create mode 100644 docs/assets/fzf-example.png diff --git a/README.md b/README.md index 1f04d24..b2e26ef 100644 --- a/README.md +++ b/README.md @@ -12,16 +12,12 @@ A terminal UI for finding, reading and sharing secrets. Inspired by the fantasti CLI, `sops`, `git`). No config file needed. - **Search everything**: `ctrl+s` searches every source at once, with fzf-style matching. -- **Share links**: Share `lazysecrets://` links with colleagues. A colleague opens it - with their own access, from the terminal or with a click in the browser - or chat. `.env` files can be shared too, as a link encrypted with a - secret your team can read. +- **Share links**: Share `lazysecrets://` links with colleagues. - **Neovim integration**: via [lazysecrets.nvim](https://github.com/karleinarb/lazysecrets.nvim) - **Careful with values**: values stay hidden until you reveal them, and copied values are cleared from the clipboard after 30 seconds. - **Scriptable**: `lazysecrets get ` prints a value for scripts and - pipes, and `lazysecrets list` everything it can find, for fzf and editor - pickers ([integration](docs/integration.md)). + pipes. - **Favourites**: star the secrets you use most for easy access. - **Expiry warnings**: secrets, keys and certificates that expire soon are marked, listed together in the status pane. @@ -81,21 +77,37 @@ use most: | `?` | every key, searchable | | `q` | quit | + +## Integration +Lazysecret let you integrate it into your workflows by `lazysecrets` `list`/`get`/`open` + +Here is an example of implementing a picker in `fzf`: +```sh +lazysecrets list | fzf --ansi --delimiter='\t' --with-nth='2..-3' --nth='2..' --accept-nth=-1 \ + --header 'enter: link · ctrl-o: open · ctrl-y: copy value · ctrl-x: copy and close' \ + --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {3})' \ + --bind 'ctrl-x:become(lazysecrets get --account {-2} {-1} | pbcopy)' +``` + +![fzf-example](docs/assets/fzf-example.png) + +More defails in the [Integration](docs/integration.md) docs + ## Docs - [Keys](docs/keys.md): every key, Go to, the layout, and rebinding keys - [Azure Key Vault](docs/azure.md): accounts, permissions, pinned vaults - [Databricks](docs/databricks.md): profiles and Key Vault-backed scopes - [SOPS and .env files](docs/repos.md): which repos and files, decrypting -- [Links](docs/links.md): sharing, opening, and opening links from the - browser and chat -- [Integration](docs/integration.md): `lazysecrets get` in scripts, and - `lazysecrets list` for fzf and editor pickers +- [Sharing](docs/sharing.md): links to secrets, encrypted env files, and + opening links, also from the browser and chat +- [Integration](docs/integration.md): how lazysecrets can integrate into other systems - [Custom commands](docs/custom-commands.md): run your own commands on a secret - [Config](docs/config.md): every option, themes, layered configs, the state file -- [Development](docs/development.md): building, tests, how changes land and +- [Development](docs/development.md): building, tests, pull requests and releasing ## Privacy diff --git a/docs/assets/fzf-example.png b/docs/assets/fzf-example.png new file mode 100644 index 0000000000000000000000000000000000000000..2f616ffcf0ae2fe6e04c96ca7ffa0dd2235645a8 GIT binary patch literal 269051 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°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ξ9kqDF=`<{aARN)!cjko%Yfb0hIpJba9x; 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 d4ow=HkGHm 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 WDj1OO_vz&U;4(I_&@b0>iTf}3mZtsy literal 0 HcmV?d00001 diff --git a/docs/assets/lazysecrets.png b/docs/assets/lazysecrets.png index 22ee0bddb7897dbb76649169fcd81d63ff944884..03aa90cc3f9db040f243dae7a5e681656a03c357 100644 GIT binary patch literal 264090 zcmb5W1z20#*6$6J7HN?dYjKKu@uI=q-6`%+ylAN4?(XjHR=l{o6$$Ph0^v)$_c`bN z?%Dgkck`?~Nz;`@<{EPj`H$ZuNKsw_4HX|14h{}YN>WrA4i4ED4h~Ts`5Ek;e8nX# z*b}^yvV<^P`6%HY>>r;@HKokt~{yGKr5P&E6_iJ%@8n`FF-$#Ih z3$TPk{PP@n*z>QSNZ8}oXa0D8k_rFk*|7IA5&m^HvTx>-f4xTh{Yk;?XRfeMp?s9o za)N`yrTq1Pmr|xUg@Y4>lM)qD{RDrQhNO$#kJq1(ok==_@D|sG<~lrB&-kQo)i|`O zKYIK8*5OKW9SIxO25dvyu!Iwb0`JTqik z`1p9`_-Kji&6lrV*P)8NnkXRBPkrhKR6=yk-x)J%p9@4c>T`?8jJW7 zE_>@U;XfH09C9uX!bdnMmzEb#p8b=t!NF6)zxSnaCq?=vV}nB|3Kz^*bCT=QbmqJgb}cJ z^ZOYTEb6JQUi!)IS}-A2@?&a}N|DtJX|vmjz>NKLbVH5$_~PoKPjq%V5FTJPxyyfk zd6{{7`f(9_18}~&V@zqT-+^@JquZ3GjzcxrZuTO5rkhkGJRsMMYQ@?TWvI@7PPWK= zWM`|j;Pag^33POHY*(&O*Za2qV$bjFPvK+W|HjyoXRulH_Aq;@U`#Q9sjX~LYo(=C z!N3bjYdV-K>UOa$w-4CGYIe8?7vrtjW~93ApOheR&dCx%(kV@eeX3P$A~kqCu0cmV zUay8lr`w1rCMGr!s`Xq2Z1bYqZD?Eg4VxJ@+hM1VhYZRHz|D>%N+F%E-8E}s(&vXS zMv*~ByZQ~mn>SKIomXY$_O`vjAeo7tGeBfSL`3#LWan2J28K`ph!J8MpSO^bS@OjB zgQ1non3pibpp4m-p|P>C5QnmuiO~m2LHF)8((gfzi+&%ONiw_V^czf|H#ak%uN>PO zN#UwBAJfNwXOgJJjV+FF3+1f#Mf~fj93&^W*Bd$Cmgfk05IB@SG|bSZQ_O_3U1*HQ zXSYc=T0^AQFMdVh@fhJTnfdw2Ct?I-O_@xMv18RjMY1XnZ3nn2*W<#3OGH9e?)hm; z(H^XneI1o1o4t)%i*-J+na0NVgQ?s#g%?*>d4Pm_p|T~H+>nHF+I^{{Y3Kvl2zgV( z?Y-17zc2Kc>mz-@{Be}_wcd6?Fg)D<#Ir7`#)8!4;O(n;e1azQwKYfl$iMcGqz)+G z;d`Xp_0#Q8cOrsfsHR%|hJH|%V9BNMNa+%PPP(&QG_hK!4~bJ(Li_D`NCgmd>W?z# z=jU&W6+d2CskVE$SB)0Wlx&t+E3EgRY<{ZIYjLGtJ%4aGoSUvTeO`6HBLz_2+&;Nz zj*i6b0L)gbiDHllyh`wm+74p;(=X*xBCz?S45k4_(|8qf+QB4lm(Ih7f-B9=ndnDL zN~^8zQ*y4E9t=DyiehA*3Pnd2wA?5Krk8C7%p2!vp zYGX_vSB6`DjrhlPLJ&1Y(PWf3a>e;QofAZ%3&S}0eqB#5q72gcvg2T@%kKh7CH(aj z5e}{LH-sl4SRsgc*We7;7_N!m3m;;j{OO7(-@xx^qAKNo}OsQTRuSqyVBV+YioL>#oXWD)5yd#U=tC^Wo2d6+Vs-#_?)NqHr;{m6#LO_8RCbYbJ{MHfBHEz z8#+qPP<6_8=l%u54RU=<7k&_bDst2uwgfV3TFx^jC{}5~1r5i=5VD%({wSnr_PD|? z({1t})o<)N(0VohWR)q6SNZcjcwk^4h!}ugV7uftey&Eqz`-)bMnL4p_3Yu{VW78H zES12s=Hqs0(+s&waGikwFqM8!Bh*=}yu)Ll>2jl2XX?>D0hID#>PSM`H+At|_ez za_ywW#Gu{!t?%KTx~j|mY5OVo5#Y{}7kh$H2I z&;|f6p-@Fx;y1tN)@OE^Oo#3}FS{1k$8J-O&SYy∨c`JE^f73@g6OCx7E;6{#bo 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%0DC;zp*=RtYILq12Vp4Xa3n>ncX_`ll_>+ROv*K#A zWBu4DXE^|5skr|t1TKHNKQ{t7*Dm~0FWUI{Li{!|H9nw0Y3{%NP}AAOeYb zBc~OZj}M#Yq%1y1effxo!?Net;`2`8F8S0#6*Q18Jv? zy_Y%FDyucaQvk<)@ZO({Tv&|2@iBADQ7Z5N?xDlOCTCFnkV0)I3C#fdKP>k9uY~Z> zgJW-2e)tQ}Aludm4lNMWk#V1Ae@hJZ#V8v*`tYpOIXS38;iah|bayN3!G~nBNT(BI z>g{3ku>5f$^AnP2n;c^2+R6J2{Pk80Oca61)NPO&D6Z9npG>oy>?U^IG_{~?| zT(4ExhF!PvB=|hZ2XQg^Ey_E8CV^W;BAUNE+68lS}O>dby6 z!;?`{lRZ0Mu5W=PgUfR=cl~gtG2+g9x=fjKT?ya&^ls>^t=d&b#>%dFLwZ%qs?pImA@2yvoBv+TD{>C(go`~XMX}PXST_B24|J8!wjdS|$ zp`nDAfLOX~1XH!+kWllvab9t82!)A>Ne`X>)EAQv-}pk0Vtd+k>B0o+4@%96mE7Fk zh>6u?0=joAi^Bbck4@Uz#m<(gAqF;3pjncCAfKRp5EO{u(M~J3-i=;gHAVf)y8it5 zLyr`&=oa(aCi@V@sWx;;zFfUGGJ0?W-Ia>u7L%0-Y137oA3M-5>VWr-;G*_LV`Mg0 zdS(a1U#2Z|cW_E>oudpg$jX|{nR$zGLr_udW4*aF^U$qEKHxWc4iBunlm0Z5MHj=$ z=ouT7)BVnRELy(LVqyaDF*&9LAFBx(Wco3(^7+bXHtp(+VEtF@A(@>_2S(=BjK{rwJ-Mg$ zkI-IoZt9RXUKlTEnmN0tJb!96HHtTM;)y$3i|U!r+cVo4-#hIXm*$fMI#|+LZcPCq z{6^P_dOUuY+uY-TMcN6|+bk=$>wdgoixFX^fS>?1vj+|o2NYrMnYZJ*K^N8r53)a^ z{9VZLBb|B}0)16k%@E`73&Anm9iQgpy#8>udYc%0jSUa*g z2h$$iF5sbitjC2)z#%a|>9aLLEUN2%h(i>Rsw9Vj#+yW39p0u>^iAK$tIbjdFSLk9 zi>>p(`%Z=IOlHi_c$Hf3Z*h1=(9zMwwy-)zcx~ehnsG***zm*c5f+CnzAkIRAeL#^ zyQ!n4t+W&{zjN91-k&T@i5=2NGd?6%A542aof^bgV{p0-4h?w9)nH0~6j`K&)$jAph zADEOTqb{a=1|YTL`go!6hCR#L^FR8onpmm`WtHe163M;di{0*dNu%2i zbS0q4Ns2%DdX?*C47L17sJ>55XunR{^>wH~Y~01coP_sHtSA5WNKVS&^*SU+;;F&8 zhYXR(8-G7PcnDDD!KihML-?6}Ul(+Ms{Wg$`pX?HWJWC6=@Z?Z<()exmSRj?_Dc=7 z(G=1R0Y7 ztWmt)BRNTHgh)VwIFj|IBAwbBi9~Hr;+BICNqU{OKpvM({0BiAf4}8p`S}M%mzcJZ zGMLP?%=bZ_Z%~kJrRYt~<_CL?MW|Y35BS#)^o-N0QXaWqJyP!5f>pbZJb|PqG2yT$ z(sMSMEt%FYp4;gOJ+uB~OJkeLqiaj(NQ*Ymrh4VzHok~b+cPP_I6{`w2>>%?=X;QocsOtemp&U*y5wAFIOgG^X6bA+x3-=aS z>f;sAGeSDMR(i#Qi}8Fy4=ayV1iG=`7~`6`5#+Ady<~eUOm6=Dp8uJ1!|>-Y!a-qg z3u@D{w}%4rs79bpY%PIZf_=KRz9(wg5ZtF|N;+;i!Uz~X$eDBA=({Buz6ntDkZeml z^J;roga?}X>^XjRa!hG6g4h>Vp{Qw|mjd5@bUanu({ENNBuy0m`l0zzH!YAPdhz`{ zsURbBV}SjT(E*OL#qFTMbgjgR&weGh_rbTRy7@jDW?pZt)(;~msstb5BzGqvq!#ON zsRTU3B}w;&i^9DklieOZ)^qu2a;dMQLE!voTB3MHt+f&Ohi zGUJMmtu=55qR1tNfgiI`EOu05zV3gyO+P;>=%Z*%PJLb)aCdFJe-?NA=zckkfY9yQ zyvgopfWfD|XTFD?M0BSzHqD6MxF8=yyg(g@tZq|?V%?w+>l$`Rm5~)u$t^IUMqqxF z!;G>Tq0QM>xFrt9qv$GwKRY`pWcoNK!&lw-woT-Rk*-wMyG}pq10kcWHFc+1c0@5l zb@YlSK7Qf0wI(_(B)aQGQ2*u4bgQ8oya@$S4J_AxCPErH2JHK#ZqXBD8HgJ{5Np0 zJEbHt?h6$Y%9*~_+h%E|Hw2CPFY@R)VO#uXLODxS_0TRLi$m6Wq*hcL_?k!#!8uf5 z4H6$#Vyp-ecP1{Jx)f3UY;3i^SEFjubHj>oN<`j8pxYW!fWB~F4I`eZq0V{@Q^0aS z!1K|7>v4kriBk`Mh0AW!?{jK4bvVQagTX80bgV+)%@gpY8&E66KAMV2XMC8BO?h=E z*_a;YOg`IW5Y~IS%67`(aP)&zT5|lQjybsNjc6nDzE_nAK6w#BiNHPuYizji$(%RbEfg)ZY(}G}*n`pcnN21eIM|cL76JKL zidebp($J$?_Hn;7k}*))%;!>U(}7L3@i4qN4K0r7zy=R4O~^*BE>_1iVyx#R#^ZoU z7yb|Na`%E+BcJ9K@`e&=qx~AsiHA^oyMY3bZ7I|z+t=dIR@GZ#gnoi^sDJ5ANttnBV(VeAUfRpw@9rIq{ohSWh7y_LmPm^}r10CNCnDu@+x-8*1h z7VY25$>E-QFlHJfXAva*>unhxMoHy+mh*ZLs`$|$YRaaoy@4jC76;wtHcNK?k~7Tx z=!;Qj-C{q@QhU1+mc$Zgc)X9N@ERJ*t*#hozA(j8ui7A;}y!vx{m(5-jfOv6n9PcEfy4 zZM!gTLvD5(9oXUC;__QP$?h$XN=B0CoK-b`sLNcDs>t7EaHO|(CEvM-yhX`)d`PRE3c*V38<1Ot-z*ZoZw?qGyPEOWj9Lo(+BaoS;Ey4+ftpte6{nZ*ODm%fB z2aaL(Nt6_NNb)WxZtGAs8D=aJO*)a>Tfi?v_{}e)ihSw%9)gBPkK3KaU@RuOxmZb~ z+aMufY%%Bh@ijf35)E3G`?5&64@I-D{Y;=c1l49CDLP`;gX{;;W(Vy@9pja%@%TRG zd@4M4);l+E8;vYk0u$fje(Bfu;e@#ppt5gxM-i#w{HHI>3G}*+XQ#T$?z)whANnPf z-y3rG1fkD<8Rlfv{3OkFe3XWrSDX-S*5`LGHF5o_!)^(H%%9^#^x{2GVN(;KzuzP% z-({d>WK1);y+ysdN+^S(r}f6E?9J8$bw<$pN^H;ORV_}&5GNI?Gt=|&>45vvYHypj zfoQ5ntjN+>r1hv%0CX>X#&Q>w0c<;y!DRVw0!X8P+Nk8|=3uOVj5L$*!fR)VJX0|>%{gn{Li$Vl z9_S+lWzl8kcJ*cjyjd>C{j^yTJEQ8|`N((FyyQiM#(Sg8sn4#GUqs6jjj+ImIZfV# z#4r}bel)BsbZmA~>u96Sy%miF<>4!6Xe{3OiktToeDB>$%PsstrjLVY?3SI2DM81c z2l2SKT~x`?D<022P$A;-%6xO|a^UrRUjWO}fisUXFS{(PG%WJB6u|>z4EqSY-rOf+ zE9KagV&*zSbC*HIXua};v*11HXyxY{v=!{0|laH0{u{^XX3?O0ICa}j-8hWWj{DwGJkIEFi1{s;~4_4L-4 z2-%m^z4v-8!rc?t{MW6n6hnkf8HtG-`$*nC$+zESx z@$?lX47p~P^;;%Rq#GZB;|AhVS%Syvs<X1(LV1wCjNS-3=G8{4JQO7|r%9rLJ!+2}1a z-+e#Y#9FlcIQmIJ{m_^E#c4A)*t8Brkx{t1$ZK+^*wFe+?J>@Zv|;2QcogogrHC7?woVM(TF#uj7V4{8o3Gr$ZK>>=xa{Cb!}UzR+wQZtP3kb@5TwEN5xdAKx6O;paTgNmH$i42oCDUyG55 z)07$nwaV(j+JuLe6k~}bMB4~Ic%H?Mh28RM#+JQ!F>#|;x>EvYqV?+VwZlp$uDrlG zV!+3b3QkUJrFs<~kiVy@3q#PBF90o%eN*#99BCy!5gmZ&C#!dRjXsbkD%n zmbqv4-h4u76?@~bbzn7btpQLMnr1y=V!jf(rSUocMPI1(&TI`TkdpxS z#^TNKkn+cI|Iw|?K$-WRdKi~$+KnnH=Xt-y;SfD28*w;Cwe7aIA?G?jv!n7Z_(we9 zr^d}vkVQ{ZMEB>Qmm?rC&R)*vamR@@yELbao=;3jm3!rDb^9RFH);dwFQ$S^&a@1y z1c`7O%P3(@J)eW}z}w$+r6asfGS>Q55_UtLmA%Zcm7JUJguu@ zZ~Ck;ay?sPPMS8odj9j&4yv)DpFf!AQDz z%ja8%lG>WPNMk9jyJacyH|3%9adR~dJKek(bo#>B?!>gOfSYf2d51n0m9s9+1qTOr zc5=F&B{;w}J=8jocZK>Qn91MYpVA+5=F;%)8qMi^M^&+m@ePk^_9)B@fMs ztIXwTU!8^XmQ4rI^Hp75$LR2?8_)e6?5tJzr3Yoj+qEl1YA)eGX+*+n*Qv?L$y~Ot zh5gB7?IK%kEIDE^+X8p84+FlF*%tlS*&!>UqRd0a`#k|52#DI+cO>C?9Z?X_h&t^l z>bY&U;)H%oR8cJ@u!m1F&rsj z3%Ya2;*GYbsOOr|J6=mu2LxBaD7U+%P_wZ>Ri*D)B9F$P0s|%Wij3(YF-jwZpVCt|KopMr#2)IXZ+vvu-I z6@-t%CX!<`UL#1Da%z^GP56zc)Wscq{fHzMJQnUVpe>UXBWp&b3busaTZkiFU0p}N zMhpR4qC5s9UO}U`d`ZWB486T-8R={_%n?-hQ}Y4eDf2l*_>K-9M-@7nfR;KiX_NgN{;px_} zzJiDpUNzmud()xxgeQWR@IYFCmh?DP%JTTwp`ai=k!}aZZ%RbVX(RUGvtO0tm3L#b zNefUq^fb)kmz$=*jGX%J&`KI1^8FFb^0SZ3Bm$f=hurnc525h1)Bq!$yK^xOuo_1C ziTdn0dLrHyyH^GXux0Q=RP@=hDGbH$Vl3)eC4qK~^l596Tumt^iu=w_1n032X_^MV zvld)F1ji%Opy9en#?FF(Y!4;N8qhTEBLiyCyQebC>TW*ch0j!9KQJGo^YgiP4xFcK zK3bu7BFVp9datnaOsmd@vN|Mz0lQMk&8WSjm%-@QCj9lHDIi+FwtUf+SM&tkip&p* z(;k@%vv@*)}R{=B?XZf~i9`<;S-7}8Y*-zdTG_N^vT)a1`ZbRd&7SL2@ z>Yd0{)*^G1*aBi&E4g7o zdV2C=2h(=rWiiu*^QlQvqFPKooUqzsgZ=EE)Ojb9NK$Ha6BXsLZKr-F7EwVrnb#W? zA8j+~m4Q|BgqnlOYix67bW{d4wOt&Y^KmkK#S3v5w1hWf*zWa!MH5yrN-T6=`6fmB zk3{q^1`R!JzF(70*3l8#^Vc}_K^We&T*ryh17VVvZ4dU>HZTR7iM>+A1q9?83uoOI zZExV9yZh8Z0mQ15E`n{T+g2qTH%y09)URUw=3KBvjvCAhiaa3W2anvz^6Z01iHMtS zYH7HA7waXSD2~X&qnmRX+`bu^OLY$kU_f=;yr&Ie^O}B@W9eYCN3zo^tWhO+?YPX# zC1VTQwWi$*Rlt1~i^O7$)>JN+n3>cXRi=RWi_!o0);o^|^hF-DOZDjqMz7NI!zrcl zIC??FE2}HXP-SE;%qg6WyKf$$TQ3ugrp`AdN5>RX@%lS>`6%@%cpCHNmE4ZpzY{L0 zl%&+>^$cEvWHIs-fy|GU-@yzNmF_Gx)y)rkuZn81jmuJHB14(onzyphN0K%5Lxx$> zH0R9|sMvAf10(Q=t5UR_c6!9{ug+S{4vQYfy6_A2_T7Kp8xLyd79A^1;WXd3)$iT$ z@NIUwMr60uCql}1h6=@cFzJ1}+~|DnP3+}orNO(=oBJ~0L$s{|Zp{H-=nB-9vPDV{ z^E0&Xz7(mBhSLNe_Kl!Aqyen9C?YXMg~jKUie;dL-8zXY_UJP*P8cLKj&j-KCo%ffI|GJg_tWYE`BuH z7RG4IoXRb0?TN02XYFcu=%xE8oT^WJ{qUOukI(wjL{z`Tk8SFL(b%4d(aF*|v*ipK zGw7m7_9>9R_Sh`tEHsTE5{AwlRs~pr47M|TF%CWVk-{F0Qs;wmIrV(yo}2>LfM`=% z+IAGsEHpdYQjGSvOI|-4?JEcKy19AOk8a-IePUo_Fz>}23fY(^Su6jJD(W+{)Caa- z?PRl`M-VQ+0%dT?ut=~GQE^($%PJSh#uqi6t)Nz0-w-XkM?v{c6Nq~zCRAr0{y&V$ zPAMF6D{5o>P)=%fQARfBIw*Z)b-$x$AqGB4{VDoJSX&YvKbyb>u2`3^NpGo~`)874&ou z5kDeefG>&na`fg~M>|_(W&A9T&XA%t#*UMgoY>xE+}gpq%;JXufW;YpEmbgRqik`se`i6=lVS{o@}A+n$J*FL@ptk5;sWCfTEj?j zXb1>+IK#u;Go#hW&EY}`V~KrN(>?}xGi$w6usfY37uek+w3L%zrM#(2a#nV+>$0+< zPobK~XFxmh%Px(T&SyN(muzZz(#8NIf`+c>q4)W^>0VB22!OnfCM@0NwnmyS`9R4n z2A^!?WM@+#gwIr&DB0Vytgo*}{a=o5YhPz)5&C)cCuGyZ+hl~NhD5jni_PK$FE@c2 z7`7|>FgU3_pt!?(;|V)DdP3(ywE;Gu)i1edn8IdGb{-RzB$ZBdjlPfj68YiZ*6!Cp zK^}R04&zm-tsH?bE+lBujZ&*t&+oj(YPh;<`hEF~AwG(66QU-&*?756TMbF^ z_`1buy!xYg(y1)o-8Rl_c3ugLu$v%~QCpfIk`wsab!4JB7W9cx>0kAT+aR{{eM&(U5;J1@ zwWM6n*a>#75YDisiHKy$r-HKO1>uE8|??eFS#;?t6d+|1$jB0mnc5}8K^7m`FUQG8Pr@8#OJ zI42_>Eu(k8Mv6gWHKAps%k5*x9il9C+YNl7gmd6qa8YV@Rv0yk)tUmsG&aIp%4M&P z@7-DQ+(dhE(v@5f1%#vGRcg6*{-!0r7mPzuf!>uv_KSIsEjX&*Ex+i{kQASyTHN!j zZ$5)5+TG#jQD@|{U4VPm+S@~}S<55C7I?dp2Ua%*UPGc>!<3#!C||6vCBM`<8{m5z zShL&7%MYonNqC0N72{^tNE4*si1?H2#Hc0uob&Au+8Fn;>00X`x>&#?0gW?4$j`SX zbA!I_!wLFsSAWMF!_d89wdmiu#cfKF*3w@U)ZZeH<52! zZq{?@&#Bd9B$hXu{ra~r6`VkhWnuP5c~q-jYR|5%+vpK+xoMN{wedMJ$Vjxv8y+Bh zk*{Pl#$N0T$le-;SHC+KU&)x2WswNSyeIkH0R9gp>1(s-10)jY=t8F!09y4+za5-^ zi1qxXsMwywhgr!U9Hm6m^*Ep{_XYt_dy{wKx|Z!x53Is0dQC-@|sRx zL27+W4M)XVtjbSv=70b5zpoBcy#<#F{);vFJMZp~<4m7t@8KlxAo_`nzs=oWFVi2$ zSbtsG!YDk(cm)E1xc!CyW|;m8$$=IsNY6|dlvrdAO`vCgKreFg@5vK|I1@KC%ji(NW(WVv4JPg@RhesU?E5t ziL0VMi=Qyg3(H}x+2%{-^+M>Godn6AOP`nrJIlXU{7VZ!vr%%5l+6pC=)>~3^*2QG zEb0rJ{M_kgG~W@8-?1Y>e~KSt4AIwom-QOjlW`%{_6JT;<&wCky}sRQ$3D3w88PY7 zyPICcDht@|w*ms>sHmvsdw#oI)efBnuEs>TSidr|zwG)0M11_8{K;w_t$=e4t*HY; zjNxo@cAFKcyzc={8^hsr{fXVPi&04OK4Mn*bUgM>4vHqEO9+T1)>hx?toQZ;p8Qru z3EX#w0B+q?o8MIe2P)0j7I`e;u5S~!Q=CuN*GW8@n!4MWYGF~j^;=QO@6TcpBe)Mc z(NCf8(BMW?y91<7Q4i-6$atVHu4b{?XC-1{EHTZyi}2r9AF#{f`mUMeD|UWA?a$2B z*kNU+&f!S#ulW6T{~zNYWti{bfZDo;iGr%gZkI@(O&VX^ll{{V|GDY_C^_BW#l&u5 z#7JuA;8;-0_h_l_%@>zHzj*Zpz$RKthb*9(R!q9Kdtu=$n!O2Wm;U#|WF{jrW$-h3 z99b@Eb^pKFt^C01jK_HH5zmCb)Y#h`%_fM&s>^8V$fn6Prml3fk~RJ==0r&wHApz4 zyIQ<_di2x=1Y!VH<<+n+Fwo{V&09(HyC*s*#hiy99xR3O-uj6pl{V)@rnv4i8)-^% zIe!d3aab>LIyWXr0NJDqo0^-`_Dphc7N`yw& zve<;Q9?*)WqGSrlNa}?XDU61aSU@sWUbJA*ivMY>BYWIREd!4A0A=Ft6}b1hW=eq& zb}@Jms>Ezv*l{=*y~!#~r#j@CCrt#ozD2AXgy8we5QrSpk> zW@!{9w9XQ%gEKO;qz3m%%WSWuhyBD#14j150P>`Yl7^sZc$b31JluXhnXR#*%rc=z zWP$H1E_Ro=#SB3Ema=)wxIjN2K!B7CV9tuIWTf@h>K2RnsG3#o>zlecRT3AY>#TuG zo^(4y<0nN&F*i0dhOe%I#Gji+C8US}DY227V)eCmI_DU;JRWZVd``(ni2sh?G%6h* ze_|{`K-k5_CD!4Xj8VTvNI5eSz{!PTsKN_=WRg_Y)Z~?v$ZEA3VBTF#NsBRdtmGaW z7V0nYuWheOg-v^2*6dDg@69+?8v!*6&wM-WL}LGFjpwm{8bhRuC|w=1i8jlLt+uoL zDBbIdu+B~;1kQ{H<_O9&vtf9YAAu?lp7`4$L*A?sbycohYqpwqDX!PiA*RYF=(bW^ zR+x^^(IuxML9qIf#`g?^qb5mh0SE};&Ceg_R@6Yh=Uvf2CK2dgq z+ic@Ztn0tiE5ey5Z8e&=uPTYf*Nkg?xACyl6OGcd_SwrxCat2b`;Mut-i<25;~`n$}0Nmi;Ox>P^bWhixrF2C)v;i2Is0w}hQ<3$U?Nf`~bz@i@-e zE1idN?@zgIDxhTu1ovfc*E}2D0FuhjgaJxBp#NyTneOlL0jRsr(DU5K23vImhIya~ zZrmTEI-4!&P4M&bhGysFY+r4rXGuly3neIxsjNFty(Wv@xP_qtEpPhh?AN{dZ-@Qa zeA|Stx5ml?{>;+il9I`Ejrll*x6hBp9Mp8KctfVQDX+*MCz9+|m-lk( zY^1ZqI>)X{^CdX4I?2as&dn+xRz#rwhoD5^GL=~IIrXxqY3qi%Z{~41UnegUkYx4c zeTgQZ*c}sA>JRb+YKM1ql>6m@3bRhuI-AAV**BhUm{2E0CE%>2L&zoQ z7o_3Y&;AzU7|k__#d?PN8#1NPifp$Ua3DfF&H_^?YX^v`JMQ-sCqS28mEAbiPU2vE zQpNoq-Q|4+CWq12&lApPr@qwc(o`xFTi4Lpc7@W!b`tltf88i8L}N8#aV=tMg~QBH z#`C4woN_)w0KiK|c!AqDB4+7cCoDkfNtsH3Ol8Rn8WU-3aC(hRw;HiZ4N{QpH|QN4 zj4yI?cON-14&)2%Prj;p1^Z$Bl!#Z<^I|U#khH3JH1e%^V^MqE`N!kmp8qcoh(v+w zXI%!DUeT-^-yT^0k$iF$mvUZtSig-+uMD0;-cZL72ItEkDgMi8H=m9uHj-rwe2DUN z-^dhbn8o;|K1s8=k@NbHs*@5~929{yN^vvluDEH{{}jM~dYs*T#$JwrP|btH@UCt> zm0ZO*AIt9K+zAd)t^Op~el2o8aiTB`fs4_5ODe`d0qsv08lYWmH&?Wgw1XZ~^TR%{ zqi%bM7ZrAjKoD!qs86H~R!f-kte}tbm16QgM0-)WWMIAS40lJsJKO4u9!zkrdE+|$ zMaIH7Lp5pu5N0sBn^<3}9eP#KuMAL1+6im+*i(~h4k&v6k+OgPfD@)bWy6-yxro3p z5bO)J_?uRkru$rd41`kgxhu6%c$|Goi8Cqbw8GxvA)99MI4{i zY=~Ujr1}sCpR$SPL_A8@L)mY|TWTVTtRrkN7w)U=+6mLFI zjk`*u0WHAgFBE%3nj-VY)d+`Bt4gr^_z^L=%MCt@%G=YEFq*7F1V2v42nOoB<4052 zdPDj3`^jiyuQq~b#;cuSP5=SXwku5k9Vg@1wjV)A_qIoT=ckR{1~)0)Tx8FVFmnsK zq|+-F=evpJ!><}|UajJ$+kBB*b(C-^9!{OFiSLz`QQ#B+I}^qHUB>2n=L@+pba4*Ao*gIL?t`uC@(((KHrhS_YZG{ zjd~M_ht|tm#3Uq?8{W2|^4~ac1FfZ`iddZrx#yp$yO>R>(XHOkK%7$|t- z7b@bMNq)uUe+50j2|WJOV^fK8KYU7*y`JmC4mE7X6(vm_S;g}sKtDPn<4vmkP`EY7 zkUdK9xzy0G>dd?hgwI+|;m|8J<+c;)eCxpi`_c_@XUDE&S%we6_NjUv_$ZH3EW0r} z`^57*_S9$}=b|VnrjY#+@8(UFgxS%hkJyk%Qkn)#_<z2MBmeee{sDa$- z)I52&f_FdK?qKLfB+bU9H_$SRY4e^?_I}CsohpF7F&b&&aw!?Eo%J1_8r3)v@@Qc` zH(R(qFM4fkGPc1;HV5|KNDHB7t*R8Ac@Mk$cX;tXJ1p}6^GnfiD-o6$(BkQc{`cEa+`-M?)H7-$$w_+v_l)z4> z`Gr1JC9>Vuh(r-OAnTjOE;q}Q%9d=)UNCO6YXA9dA_TT`vY8dO7VAtY_Cj@PzF57x zF6oM+Sv8Fu;Wq=XP>yUCL~Q;ax=N?-x7x_bw(PHw#^mQbGGauRKG)Btd?pjq zL7eU5-$&K&1G^~{jm2}k@naO7UZ$M$n^D?tLsI98pt;^&Vb#gPsD}d!Zep5wYHOp> z?^wb|cl{L9M9lCP1CjVo$lMNe;s#o0br=TN=)kFi>}9nf*;1Al#gtgM*j zfvHy(@jFTPYqP{x;bYz8@^k`EJ91l_!a;#qfVdGJN5o8|qaU}{&inX+7#iCvn3L^e zRTD}Td+v@*uCq#mF2m0@Rj_SuAbI?hQS zGava{hRH3Nk*1w9BYFnyX0Zb!An9`Gdqg}k9(Z^2qmu?G{CZic-)-DPAUmzztB1i5hAx=$(q|x6Z2w@Ke-H(ic0`fbJGxtFp*9_=Rz0 zWbB-@4!jHO>xrbs3Yq(29D}#~yF;Sj4u9R`rqYsd@*?d~*ob*=*qh4od?ggrxt>HnHY&3tFTzam25O5$q+&@Tb2Y-5)$-zA~B!TA71cBB!e? zp0PrPKN^lpz z;GxQdurHFtJ>%17g#UGy6*49tHVN(^L(3+>BJ-?WFRc)p@DFp zGJhAs`uhamL4q47(^yE9Ps{io$8bkr>9ta0e7n3sP?8XnQ{1T6%%A5#K0H}b(LyJ@ zxv@{Zma8lgP=e*B?W|-H*1K`WWZ;y^6JXx+IXgKdC<2(lVji0qnUIj`5PX%zmw+Gt zUM0cT=9-cv)pU%6l>Xs5YtgvKFR4qQ3L8KOO^f-kAs$y4oJO2yJx#Hqc(j}SNYdtB z?L5sT*eBnD1Ky0|1a?j%@@mq6j8D!`)l6uaZ;I%cO;4&dGzd`G$?L#Ot=R+*9n?qJ zi!Ak3`GE>PfZ@}D*m4K+&9>`}l}KXgHi}Y@N1?>5wVI)-1X@O6RC0X;DoxL(m6=Df z5^+a#fokD@GD!apv**2khSqC*xZ~f)-i9dZ786@ez1?R$TmGb$4 z&sB}o+ox*JpYaK@4K+oRtp(B~u3mwkBy46WYj%n#B5lqA-WhLHg9jaS39hkXSku`T0v;B28Kt)UA zZHZJ(-=%r$*B9$4#?4*)LI6HO)@g-58Jz68McVns+pOSsy)1zku5IvM(lMpayNbKa z3MZ#AC6<5#bY7}|L5g+`LsY>#^Fhry)5y4dhZ&M}5+IU;G(XQRz&F7#-gx0K${h3h ziR{}`wee4Q$!qII(ei>c4Ib>JXOS16uoi-Kf!uezmSxEHsGzh$b+Oke}kXs#hhNjwg5Tc$8ONlf0P05{KQpHb-CH3ut|gK#kbj{UyH;gR z>GX;}oZly(OAINFAjnK>JaxRN>uvB3hr;V=1<3J0bFwtfDtZdr5%_M7h7OXU!ddBP z3q-EpZM4a+dzu}DW=pL0HiW`TO3c50!zujee*8m^-RiI&gNc@o!n*>z4vU={dsHV? z@U=etzEI$-Vk+)?KgpUrqzHK~o37*?mCc;=$x|C9>$8&qWqvAse^qk&4WEXnt@Cy; zc`jS{vxjK1uewf^@hB$NeU18-MjgAl&PX^exM+#bfdMy zcdck$GveiZd5nNy&X5}(p*D>_bLrn2G&6r}^3LfwO)Roq1d+S@)p))ARh71mjw}HO zfk5@qZ;DtAjg4b_nyfQ7wzRs9K4E*)JWcaB#3YnrQwaI~{s<2rJ{;k(ZKd=s({BZF z+F(T&7yslFf95&e?O*!%FBtzXKidZ5O9{bPA#v5wX?4yJOcJY;_@so{D1MZjI3w5D zbF9$&lL@OR6DO4Y_=pKC)AAvo4c7fGOUC7neQa$R0Hwv|k=G^}b*C!4995Do7*f86 z3bIvHUj?S!uJQ;d)*AMd_wI-rAB-4mjxPNa1Cl9Du8^6n{UHH~w-@UVD;F}qwP!kb zKseW;70ape6X-L(QV9}(zNs=@=cQA2D~!qzDC4Q{6frLFzy8NsBtGC2*7zy8H1K4N zUV7dzhzk?iSz+rxYw1^c?@0Yr*?t)f4_$NR9q6`*e zv$lz%D<;!4}%G@vBAOb*~D_ew}*tOjjWATeFuYNnXNZhC5|=%P@cwmN9erctq3I-tXomh z1ax_{FqK!txpenU2lM2p5QeE{LfslphqMHRw;#ghWxTrZHo06DUuLlS%!7L0&WS!2 zevsFm+Hav>p)N>M6Kp0kh_+C8w(^kMdF54F9~&Qw%6{-x;@46sR-hCjuEJ6}Va6PC z+D}7q^#epmJ_#$US->a;~R?Fw-q8?seY>{#r$a8x);-yS9?( zN#6UU{eHT$i#oR2JZ@@}OTrPZc;1v7=^>T`&F&Dg4HQ!P^*6?q>dyJYAikaiZ`bv7 ztcK;=s5Amm8fooK>+x?P*&b(xLjiJ55ypM<9+y|Im`Mz*8x;^-&`&gIh7oIhDCSUZ zVY}$#d5)&w)uX67MGJ_vxC|hbkhNIR+}$@8189P5efun`)#UVWeLbVDFf^i$Itfrd z8wq|2zn=F!_RHO@Eo3bNLilu%E-0gLl_6+CZ;PaQ?Y(G(>(p zN99sd4t&&eL=C~2x} ziLTjdV#NvscXznCWW67F@oUn53**=&f#cW$gFpXw$Ltp_1?PweJM05z?@VdF>cn_O z^0#C3`@rluki(T@p!wr;JosQK|D%|hKkL&cJ3#L*M!4J#&B4)e8_I=R*8Dp0e|NV3 zDGvksnUPL|=qkMU2fY73ChLa>)o_l4tHo?JSmT|P6bj$*no-oBqpAn+8$T1iFO#&? zeCSxxlRa(}r4$Vq$DZtrKZJL?9}j3mBm^?~fBVEg2k*^#MvZ~2zAR-PC6@2jEARU; zhPQBkTIvUI#mFj+aNPl@I3-GmVGNj`w3~+=5XSx9|Gc@zdw;rr$1jCqi2T>kgc?bL zLipdHg1;9;Apv>3T&7p}Pu1+dt;)Y|`v6WE@Kafg{ht5tEC1~`g~~sP2L(1bvHy~A z`mf&w+))`GlrKgDW`f5okeztxF*hned)`en0GZX9F8qw+Oz6Sm{^(<5v871X&UP;1 zESqg$w@6{~dtXuQ9nK3M@G?w}etRq2S=Ch-^`Fo8fm`ZrJAH;yv&T8bLdf9e*wT`> z67`fp`6%c0b?N%X%KUrrh1a2EWbHjYJ)d8LOowm9WVXDP#Vms&XU}&=k^pII8Jyr? zv$2hRCpz-6B3O8GMg*(Po*5wClRG-9BrVG;B@=&d822>X%;@m?YCem!)NJi23uvP% z1@yx^8=6InO^n?@t|=iBiGZoe`vp=VCcCp|8HgY$+1W*&UG??%XMdN8ADKyokExA+ zYmofO|^e>9|)+lhM! zm4n3SxnGHGcUc;{OG`iIW50SR4dTjUcu|?N0X@FREpGw3H9GImbjAmOGkkx%M8f+%vZ(Gl9T)Ed91U~`W_V)4UXXPUH3tp%y7iY zE10;;!?V`)*_ zJ37pko4C$~bL59F2xk{XGu+PjS2`bS0eyf!#xrY5iUfv@o*}J#x@y=A%?sH?T_tDa z1G08C!Gucrrgv%F-vChoi}HMcq6kPrF>G%f9?Ao{y7UYDHo|e@Z!Va`BVb;G(|Wq* zKZS^#U)NT1G@tJ7+e+0H?Lb_2O)8{{-#@rs-@G3QVQvcXtkm zG)N8|(hbrLN_V$(cQ*|4UGDwvXK$Z(|Bm1L-{LrChQ(smz3%J0KG%7I7tvi}tRgPB zoDaSg`2V%G{O7?ZZa)+}_HpJBK6-bn6Oq-0!zw z=O+b40?_BE+C*EPpTBtU_2Es(_2_Dcc;^X`&q;a|$O6}+C@M0Vi?xzA1iW` zd~?&m@-S^*y_X?tkZedEW8UAklue%QE*ZzEI9l}>{QdnJA)#A;UteZ^2D6*Prg3@8 z?Nb6yMVz|;PsOpdo?p9?9v9o^cXd{jdCOI%9k+&+Z7{97*#(bqTaIoh*sDLef%gTe|^W-3~` ztS>;!8$%<8sLNMU_Q-B!T}7FEIl^3$Uyl_IEcYq)ywBRR3hXCLlrtKLXz8hQ+aK_y zxW0!mDSfqkeSnQ6+bX!4H9S=s9mRdsCfZvWRS!mZ`*x#WV;6TJ6TzMB{Ee{#vbiZX zHWOj?d+u1pNVBHQO*oOu9Z>0qd3oV$F{jOb<3{-?aq=tc{J{-F120D*f&HtELn0Bi z*+2+>D_PMmSxn5uXze+-RB;y%^g}I64hY6rAvWuomE5*NRbQbXT&NK;_1+uOp5siz zCiXYm6LcM)%(I1R*ACSq5k2=yL9_E;RQ_re~<>$v*98^7ARz}bq)<(o0a6}5i-+^b<60b^X|=8 zL3C%iic5!;X*aZ|^V2KpPMdR8dZ*D``d3AiCQu%3Mj z4Mn1&qsj^IBr(b0kAq&8=y485kO7|d#v}N@YHfe7wvy_17a_T_TCRm?mq!HDXUE`+ zhNy;<1EolLxGQa%d`~jj94NwaeAT$h@q_DEJnC-GheFc;uhQqd`$Ww1-^DA<&#`17 zrqC;H@3Ye&#l_B3S0O;V3 z_5K9{LTHvSkn=Q9yZFI25)B(${OQx|+_E%oXQ!L(5yG@lgg-Z7PoBpCTa&CDeLjPTCQr=~%;JYes4+CnSNr=2J?$wI@mrc*{$CJ4qpgDWLXHNVgS2o+wv= zvX^y!+iyW!cgP*r{>vG17BEPG@Mqg^kIJw1;8rrJ{!Lrz&Gqqg8Z}CWy9OU~o;x=pVe(ss>m-YnM>gUL26C5#ZBx|Ap97ajdb*SQsZ;V9X_wiM{;ya7+w9fH?< zfy<@(C)^zjk?7^f#PV|3DZEJmgM zNsjmZRkHO3=H6Jw$o*+PY>c_(sMTY8=9gZBuW7o^XTTambS$1$%NftNUJvSZD)@>X zGql23@E97~^EYM)*zzBc`l2zoM8yK0YT_?#oPL7zPdj-fkkc-z2}o2Ib1U-e%sNqU zhSP>}s`8a`i?x47$ls7<+jAwPbjbz24Na)j)u0>5#g--dbo-LIAzcq5sWH6yxkSn} zv7c@DAZ}r_DFdyWD1lxlX7=rdQK*R*obyU2xkxLO{!UA5z-bR;AmJk__S?6R>-L7s zrX4!lAp7-5#aj22@=<`1=^fx9b$`2>*6gK;em%L`yFoOjYWzbQVS3sp1C+MT+84>;^QS2>k;BsuX#?3^x@E_QD43+I$BztUhSK$ zV)`5}{mj**rI8WPRCjWC?k$8^0WkU^N4Y+MbDbE>XwAI^59b`W-F`l*AG%;R9BQ7f z9&7R;cj* z_d0d*{nL(EYZNL4?0j9=3{06=O^om61MB5!cHkhb&3#H>*vZGQn!mbUZBvlkavUz# z%S;%blt#+w6AL!?#Rg!l63a5hqIXW7rl`FE_et6eoQJhS1?Xzs7F$IKu#DH@KpOWR ziZ^d8yLXr^vflACvqn$DZvA`DhlaG0$WeV9Lh$@fP&y~b*F;-5{qUMGt4_%A=0cht z!j;Fu%lS)m*rU~uUbXsw`d^y_a`8R=8I$_mGz^m|Fen5EI$Nx$VJBnCWo2lFwaL@% z0HmjhjQPbF zbq58^@mB6vMDyAk#(th_>-yNGlKru`3&N6w+)w1&h05zIj}M-%T6b1GC8BQZ8Hz)z zQ$SA1Nc$-ys_OA+CE)DZtKq3$5YuMm6|hQxDKPjiqWaP?_M}IwG8H+b8(L>**UcZn z$RoC2)!TU3%JQCnhJ&L3Qjv-%XlZk6_NSIU{_5@wmYXw0Ar$ETiX)g-=5g-^ji}q1 z0P%e|DinBqOvR-_tjr3wDkn7fvax|VU+wea)~%SInSI#{gZFyDs1f#4oRV`h&g>Xb z@c8ch>^uOsR8z%c9P@=*0A1RA=m%HVj#UhW0^!l(wy%X_D*iu&uR&3dORSb#qNQ5m zipzZPaK%Y&!&&D6@U}e7+(#MkBA9=h5YTo6itq|J_x>>`)jBHQb9SMq2!!_8Kq6Go zTCbDaK5ke?SE+^w+>wWf1;%(@6<|$f&||4Q$COi(C}|F0DfAm@xx6r%JR4z~*!j-y zcFfc7d{4Ti!4GkC5Qr3X16+R^HvS}U&Ef?+R`i7X)>~1wCz9N%4H|{Wo`%hZ)Ynzp z^PRsEa4QlQc}``QfxVpqN|oo77m_|axf~r`k%MtyQ{mR`S*`NhhJ;--?%G}wq>ufb0Dnz46_ zEE!~SNmTt29W7R=*RcibpDSrcMqqmcK8z_`S8XaPJt$(~_Y1cVL2I{NU0sm+G4cLP zDG(;`-H>`}r2M=!iBEPT9}F#xGX9xe5k#Y?5WU*7Tes{XOtoBZA8W+Y9wELV|2E72 zt&qw&yY;+s_}K?n8eqnwT>*R+4c(xvTEGlVR> zO?te+H1f!RR%*4?b20;LoTjT${^+qS4rcXJ(`AEtrX?kbE_=h^pq!vXsQ+~*ROwv! z^`Co}ZzjJrr`Jb8tZb|Gr%zDn+dJ&)wSw!cdYn|9`(!xj=7H(-8cO%u7f89zHTqXu$hwKhA~0WU8k2rdYhTkIpuCPN?0Mx=DJKW)=ldeuT`EW+ z6^Vo7S1Re9NH!CqPD2u0WJbABN$~~d^*?`!P_4!0lj1A8DD~x|M+U2J`D7}@C0Qkg z;W?jhEb`PGvIf^ep(#bS0_vNT71U~UN@8pJDg;b_l*o437_+rbUj?Glzh@xX66T$q zjZpz^fWB@_B&fz*jh?Z9zw*HFwvj^r7~J5K=IqLl5E@Ur4MO2(8o$Vfy!(=HG-vlp ze;R$FM$#0mRjA==zhIX$?|F^JfAc>7+w|d=r@jQQ z8j6Cz9uI?J2LuM9U#Fig{VE^lJ_b`MH&{xQ#SCwh$nltJ$)zS7(o> z)9RIk`yEZ(dcK;tY$S`cxO0%Fv*)|Mu;`L{fjKndvSI98I)OHy4XK<%t8N$7b$@$X zx+4fBGaxKMLF3l=twGB%|J0}6zv|2XIRHv8z@;34qt!egQtygj^F&c6BuHvClkY)2 z5mOoujDpE%SuBmM)qVM@lxMZ$9&-a%dlWZPK~uAxEf+T?wyMe=V#1e%<2xHSOZGLj zo*d<{6B;l{LO7x+w}=pF(v0HX&|Fk(^<=G22(FKkoA)<^#IrT6G2n<`JGoZ03ZEbh zY!G#|YvYpd5ekt7hEsWj)MoE)8=tjjtLS*o-Y}g{kYgx2|9R#=BILehtszmiyl^0F zFdbKcf6tSelbSlm9Kl4eXpA`0J`js~TsZ!ulbs{R1G&wgCt1}4B>y#^)bkdhxZS{_ zrlNL`!%H@3$-lt+Kw!Eho#lDhvyOD?Nv)TJuXWpM8kZyv)4dLS8VwH)$737;1$YS| zV^rHmGGukd|J6CuT&c7tE~7#HgNCk&>R48&w(l}WV3a(Een0wOsWqmSx$(h$IZ8ww%vqqe^#618QRypyZ5?MjNWEbFV@3asM*_ z>7QcgcYj}|>hA=LW1^DZ!f_aSC3i1{=q4OD>72!R&ya2r#MN0IR~%1J8s_7)7m>vn zc}!{>oHSN5JGAkP8vvTAav{}AR6#+37$HyrlSu)S`n^NPOD&A$kMTgkp$}Kj04vch zY1F0RD(|OernC7PLg}@)pdpuYGqjmR)-z5QaYVaR1o|5zK*tq?#f$}KRtSB zva!=-cHHVcj_Bv-cLCI@1!5ggrBwm=zpb}{06KLz8HGMGR2>?@l>5||WEz`$O^#9K zE~LZBY~O+_!CNfO{wGImRZ%4wGm;_V`j7}j^U~_NGILK)HmO0cwb0UN(=#)@y(-vY z6kZK9K{;S_8~R;}c)r$wFqd$FRBg^_Gc&B-(j9w;wp>9T0Imx27iY zb!olhC#v%1$6Y%|A1{u$ZC^ScCEKB<4N;=G8xk{~=1?^5=CytdGIHN)zy>l-c@ph| zS^K7Mm6RqrzneN%qY9kB1Fhd=u8RX^iHkaMyU9ELhmBXs+_uELXD4uzjm{q%D$!(s zz#x|MndRW1khv>OPmpH``%`K&f6N+W!!m8qE}EJCY5R3a%o?|Xj6*6by)fxsVz z1-~B;pAZ1_b@u6yc0wQuN;)o*x&*2v#w!kk3Ul>*b%hKsBcelf3yzQvYA3U!HLMU! zETpLgTvn{gij{T)biGL6p2;bUq~A=FW7NoNdNDJcD+(dcb|ZIn-DlgCA^Y^=fmfrS zEnFu_{0(fBqA&#L7i=-+ok3mqM4DCE7#JF3o{y+-%5JuecvDm$vX&lV`1D?&vV55dLbT!xV&*rhXNw z?l5*TXuwliy3c+DCfPRhbk3#E^Cm;%IawibIuNPswR~9&n-g$Aox54zw|y*T!nL<& z!*A^!X0y%FA9;Y4{E~q1i6>qs-fdlTZEVYzvhGkiZrpM1tLb|7h@^?xlpV}9JHW_E zNvCpjL4G8cGua4t$>cwHXL}3X9ffb`bp!9oWB*>4ej|IC2*xd!EVZ~@@F6Z`WmWFx zowoW$L8JC1tilNMXOr7~4LUC<`ScNOEVs@~3G#{VK~e>JPznOEyu)(4t7hRwMwM;H z;9qp%&0S#5?{x5bo2dqH#mUr16_u$2`535SA2L*lg=)p4B6x1ZvM9;SRWTzDOKw{$eOe(1rO`_smxO+;p~k;eI+Mk| z-EGWh%NG1{PC>|d@0fyMzn_C~Y-}E9dx zrXEIEgVwH-@I35D@N>r`_Z0l2Lrlam|0ur%2tNFXSW267wdHi)<&WXI#{1b$G#wje z)p*7bx=xl7_<6%thoP@S! zALoTCV1#&HuMkRcpgKw(-wj20X2-FcAIP0QCey|@eOmpn7KrH@*`^am8L&={PHA&Y zZ2Si5xyPbeSzo8jwtEy(Z91Z>S>fRy2i_i1qu{6?e^0qSh%^7)J*cRhWD7Q;wmdq* z4}BkTzsRmP2BmQtdh{31^)i#7zPs8l?@R?lSwX#D(JxB$ru82)+Qvc5KAD@v(|w{B zzcnPlvG4sE|Im#_?^jIxOz`s3VqaVCPq?tA6ymrk9oKO5JqJ{*u=o;mck!3M1;gbf zXP&EGI479*^?0N6{%$1y_ISKCydl-&5_HCrUTK-nyYu9M*B}+&9v0ps^1p`bt$^eN zG%YjAd6y&h7_KFj)c%2i9HPrjs#XnGgN)smcn!MlyuEDGTo*VW-q!51`rb&(*;`_T z*x#6}xo-v5y>wJL*f@}>@IB!ku@%<&CJv}-Cx zTxxxMmfes-EkJ@wc~Y4+8~19E;rkh=?9gl<|51fMUNrJ2ydNTOl{K|#TF5!XIaN0M zNN#(5raU9AxxectEfD-E6&9R7m+S6PaGH^Vvv6muJnh+(PMCEJzKm>t`&KP+HQ0SS z$&ko7=Z4q2p8aJTtGo5i&KB;P z_ad%{i;*&7>){q#_8mAu`LU~dWG8l9ajL#~4MJI7e0Lg7vb7BK_)0Zvk^@oj`okl& zcOsX;xmj5s`j`uXf>wE*9&YUK9?3ga5iyJpXhy4i_;SM>;VdS|0`t5dDLu`pD;&4! z?j8ngYp9*$_ogyHuxY$<1$p_XJhJ1K``V&rE@Xj=;qtmR3qKbl_}BOX55|=C>m@*+ zC5gqp6UvN(37E<}_td!fmlwdF(8njZr{_)TY{(ATth`=R=RrT;9?f>r$RoAs^}7;sR5SJxQyB!*9WJtS;8aoxHUr8SMVY>VL!n8;)|TXmeLG}JzzeX$>}@>#El zs*C*LN#rBe2IbRoiWe?B`3!Uu#wSL2#67Qxur9x1rGsx#lG&Hhbn_Il#d2640ap|5 zhz7%$?EJUuyBc7PhH1ixcgZF&#vnqs91Bo-AYrYv$3>kt+eOq%d_J!)NJztd8bj3A z$!D7hFmc;vXtW70pe8ei!N2`O8F}(-##f*Ph!s+$*gic+g#fvXREv&O`{A3Y%cVTD zXIo7f@6>c$Zy7-?qDO=gxz12V=TJ;ogY|&`Wt^CX{ToukS<&01-KkcawowYCuSWtv zk3dyYfjGBPeZtHCI~^(NR^P`gB^twRNiR5-3~MUFUp1L@w1Np`KM6eKrCo5N@X*p^ zL0IX!Ryc7zD>gXjl5~TYXPeTS%0G~0#?=$kikiW*ObGLTJUDz~e3!QQTcD6eb!voa z8<5{YR}0uEm)soJ@?GTHcZ<;hJd6(vLmlZf4|lw4nf!(TOeZ!Q@ewsb+_h{5d9@IK zB*^<1)$&&W?)RuP9-16{G3B}L82tG{^4nUZSRQg+ir!q30|p^Z&&THYzK~tQpF%Mn zY}dvknKt9+;$ydtaS(@8rnv#d@g^T>!|Y+MXA3D^9jHsfnZ(4(+KNKlu1Bf?tQ9tx z-lc9kaVOv99ZU#iC&tGCRLqf*zRja!v>$h01CV&jCduQy;k~^{QOSbVBS!&EXEU?B zPbKnkM&#$dTTF$an7oV(3*g`{Sv&~z-7ojq#{s%TwH)_)#6sB&@y}b(4)PCNFY#I` zoryW7{Hm;3{rFmS3I(Tiw-&q@WBK|6^X^EX1~fb4e%D_dCnPnzn#Lu>zjO##7g{)_tvuKNEE`1<#I{_)BtAV06u#%bqo z7xO<6lmB*H2IpCJzQ3;6=D9{nF0xQjZ*LVnbW36Zd=QWP+R_X<^F1Z*nE11_|y?@ z*^7qYPkG^Qc;MfDTmg_|)b}$z-knr`ebiqEWlGOzJAOrpV}L3e!#50-m7}QtzhmwM zd;zl(#3h7(E;i0FKeAC}vjCrn{-L34`h2yvl&i5i!Uv=DLzK1~3}(xHLORd{h1D6ltBT_m2Tv-wwoj z4)$*fb;#KOE$ZOlkQF|G!vY>d=hAZ<%j5L8+>s%eugQHSDq3xR?!pC$Hdg_Q57|x` zP0jW$T{=R9gf+){SB3iq24aCX?_|{AQ7}@L;?}SdXhuHfWoLG3J{xLI9{o-XN6En< zaravacBp#Y7glC+gkq`$T~zr5GV;Dj^ii8-Y^;q#hI`WLK$>V zL$h-+r%+wn+oIdp!{kZ!P=KoqanH`bqq}0PAG=-j7_i$db&R)eC(BQ-y5x0ZxyL%gQIT*i09Z94N3z?E+-6k=IeUp-j=^6ZaO`4;wL z0>mQ%uo(l$3Er~ZNlcr@T<%OEx;~eBadrnek}Z`ht&*P`6SV5D==JPu3>T zN0}ejB{a0{&@}#m6f}$#W{U00e0SRB8Dme9**)hX-Xx{_6vy z{@&hi3A*kPS42ETMUGAYvQ|k)FfTf0dB8i7#M{JzfqEN8QcLKtHP!{x)DF{tXCpPiLjm|BwX?jKJQ2bv6} z0%_zyNA@@}!o zxoWmWMc@ha>>OqW$bBZic3Z$E2x2e(BuJkistf*T&E8f;_99`mKQ|K+KJpF(ge(ex zl5(Oc+avmTdGa#U!gieZbHKR7LR&`;{)_kWS}#8mElGD_4>MmXG5lz=f2}6RV4?ABg3=7<=Ovc~E9ub0wz;{Gp>pBe%0psHn zloSk6TrOrHM{IR$pYFA9{{g%EQ6b{b*T&;|vSF7Ff7F5zNH~3#-$t~Wt&iRs(vz^9 zv4uEoXMW^!JGQo%DuTqp&dx!sEv6@ z?4lbm=&BZr$)Fh}3?L@+-eezPIs>)g9&B$QcGvIz*fEZaEi&8Hrv+-QI$O|TzO@Pr z+_2ls%Ype=5V<@vCg2vyUCEt^PBv&i3 zyrUHiOgaBzTLk z?_V2*XBK7r*j*0_Zi_k~vCBSlG$2RPsx9Fubo;FrE?~-$(O%%|d-4UfS4X(#uzY)NZ#tI_Z%xbpkcr6Hb846lu|OnnIB^NL1Uq}HF?B(Ck`m_py^3wHAIoWyms z%K|ZkZgZBlJ_6Cv(UWGFJ^fPwMh^7xSq(nb0INGbd0DmV=w)xoTBgVithF{OEf zmguHTa>x|JelQe`uqm|9yJX&!S{4+%pOFFGhrwl|*lU5(c%+6=@D#JjbOFlH%6^m# zNGNpc=~v>z!mI3``~nx}$|X8QLy`B2)n-dJL0X!U*e1J3Zn*kT3FkF&!sQUqsKqWW zds_O7S;zmkKI3F|E>-x|Q}$)(kwn>1L_u>&T;)Wp8BhnQK;v+hS0qAr@TDVKl9k}d zO{pjw1@aS#1)V*0753znn7|`1zKANU=M5FKR#kNtGw=t+ygpzW&@L<%XC|_k@nmpk z>>#$OcA_H>du^>#YGv@j@t7%M*1W^9VQ!;yX*pUZDAYrw@6>Z=_DFUEz%dWi)jz1Q zyY>(9$a2RIv*8HS1s~02gp^cKsmQkvqZFa9%h&}GZuB|PQ`2T<|C*7yb82?yU^PD8 z_qfCxZKz7B2Ctu4+zwJYj}7Q?#`9LTJcMtrWn`Xw<()O14@%Y1-bKIH-ZoCl>)@US zd~x&m!7ZM+3))0HPP1<2$?ml4sKylOPqaiHCT3;-u7LPalSlz zWi%o|plsYPvj@c4{b+5|kOErX8+iD{$s6gC`AR*n(ZOVvi@EF#%%J#$*>g3UEz0>e z{iKg!-AF%GeL~B|t1MDx{U*Z+V(d(0sAnBNNlI2+q{Vtx4@mK5TD`uddJ6o#q^Z`w z>XcwUkaPrqrDSD%vb)Hw$^wREj|2<`m}Yp0Fg-@SI!moHO_Dj`?3-!yaB5|2G&I z=tz^-%fX2&ATw)6O|;g87503$cZl~`=JK01ps>T${St*-vAL&BQS<^BRNB5TcT@|boSVr!PSL>^8L!j$?%-aD9kYEEXbuYKykTmeGG%Qx>2+ zum34po@rR<1HGeizH$BZC^H`7-L}-t!;XumfAjn~bN0TON=9lNhO!f%9@YMjyBg!= z5s3Ldx<5ADWAk{RHyEM>OnX@Lbz8nwz+v-EI5&N#=i>XGHxI*FgG0%Ns_b#_lPG6k zK|NI*mR`yDlaF5rWDu<zRuC(G`X*s?Qri|2<;%S~ ze1ke$n^&||$FhVG$@`%Qd~-@p%nk7FK47r_b@+Nu4N4q z6i}7qcD!Z7mH)?AdCDEwjZv_$C}UdBRjSlI4Zfcm!6vFc5z2h0g>|vS?~eb!$3S$S z?WHkziZ}ecyCn3E?7#7coeW33z7fkztrvd{3$AsT)}O)hgP@je4q^zo+rJ?&&F|j8 z>|}pA)Dj21DXh1Q4qW2acn8*Q@Cv!oW*(C&d}4T&Jc=p@O_R7H`B!i{bwrBjsm7 z`Xd6{1C_}16lQ+ZQgOT^iHSBRmphQ>&Rh_V(?zW`qSYN%QgJG7(Jm;(-KaK+_i7zQlWn+~S@@=+g|w+j5p4xbdH%jI|VIH^!=jJa2DD z7USV|Eo{L-#{I-`6CEF4hI^V)-WqiV%u*7SLLX!zI#kkFnBuo)%*v>M;G?iOdI}D4 z?)7Tkl>)BWL;(8ChYxgA+&q|TD*DKup*%G_@6mFn#f>^Y_ZRZ%lwK!r*n)Kp`sVka ziU4pd@BbVbRLffMg;mM1uFA{N>N@#_(^u$;o>HN)8y*syLsye2lqpnyi9B4%)n(1R z08~yO?3Me%95KKF!A=5&*-m>{67zXwx&KpK_KRL z7fm0FP|w+SeLVOl82hZoh~tJk)>M#@3XF?~pq<$_dnjT{y=gc!b{$dK+|z}3vne4* z^J-4AUzbUYj$UMQau028tbK6Tt^eUv$;N6x%ma)OE}3>L;KZ1|vAo~6uDj>~$@+ZR z>VDM?kId7I07{^TqyTmB8LuT)rIIt_#?tJ>!7kU*u!8woT%kb$^B}=RV4Dx-?H<}| zTOC9D*?QKnPIzZT$McenncwUwBOQ-@-4uY5>(>60JjHu}WqG&VmbXv8t$_Gvil%#Jg0;i`oui?;0@&A>b zCg1V=cPl>kDSM7Q?)X_hcLq$}3+Ak!J}xxxnja?&4?;?!?Ae`Nvc}9ksqAeT0wlCN zT+j7(Jr#GyBz%(-x*$Z9@S{$i$c0i1+;@u#Z$rs8f5@%Tb4GYPu*NoQa%q)4a6|7J z_>02(p+cHUQ6H4UNp9?q!~3iE5?~ZnF@tT{@YGwZ=DyElp8PQF`b3yc&X>&hUO=f64!^s3F)nwcS*T}o`; zx?QJph9Df@YUGf(AQkJ^c^MoZaC}et*?8|J${>!SO+{b)Fo>{auPT&GH41@YhQ@%n z4o}%|{_3r8Bm1Jwxb6k&6ls7zm0&D&Z_zWuG$tcro|(+tybL!8<#w{8Mp(z2bZ|J2 z%CZ>Hs4biq?ZuItmtmSfFJ?(y&A;4GZkOZgm)s2zrYn|H8$Q)i?VAYRH+M;vXM4i< z7#=D%MWMc?7crs9Tg}9y?9l9fy`c#=Jw39#Sxg*M?NnQ9HQD=fV|$;Pl|Ly?hTG-1 zu9lj+MU!s6vEBj?6axQmj-ZUvPc_X3)>?{fA`cK9Zh6mvyB#)xX}d0l@hV1oYf%m`wd{GOYAb7Jc0YJ(W;vT z!yo*pqk8K-t?&@nh}s6@oUapvHus_QMnp_Nyx*sw-<-6772Mo%w?_a+fr|z=3Mk#oD+WQ7|>XnPenjW3;>fV5-&3*`p)R<2M*7JqMze^W%502FD2(&O$&`_SZ zOHnz1FI8`};;d0{>zZq{Zn8lKa4;Yz2u-uz4F>{I3v7oVOx-{Jw`rLRw1Qap_h+BW zYltQCQv&;xq-VkcUO3&|5W6@GLg*j~zy#HFr0*rgRs73p?S)c?6Y%ezE45;0g zdQefZI3jWyLKY|*?^3uVv|3LJYCJVO%BOAEwf+{YF}Qto!Px0EEC(7>Ca2$bg22DG z0-jEr>FU)O*Vu}YZakNJQVS|I_Edv?n4(fM(^;cWKes#(Fw`6oC*Rhh8>T9|p`r(1 zeVM--Oj&9X-Y-Qj zd2VN+PCc`~aswM08k~;(L1r#gl#K6=ni%LKe`~mJNT{w~Ex}euPW@|69kaJSg$h}2 zt2rrzfcVWhyqNA$&zD;o^3gXVcZviDjq3Ho0E{^J5|r_X!V7z-8n?>udLZU~oF$1% zN|NN`<7--YsNl?95kB0X-*4X1snKM@wZm;;rP&o}! zrRY>`HZ=C3-+;-=Yd;J6VFowK#Hm%pUkRs`_|)?N7m>1Bbq zE-`EcF|3=&i>x)XRA!hCMYNVdkDF(-E9*Qfg7fEhgRD>_PKNNt8VWX5p~aHn&5M(A zlrU#=GdEOqPbrn@CN`hPdK(lS6w4UrnydLj;czE|u)1w>qPE8^1k0vS7eYe#x-Fo= zk%j+P1c|^9MuF*tP8^;mi=BfBy^k{!okqmCNf$0SXbO3EcEXBV`5j_75qola z8Za>Qqs3!^&*pRHxC9jy)4N-itCMequty0CdmzzVr58yJuX%QksV$o8!>=aSk|V4iXwRCq=3c^zBEc$rL z#Eb+ghVk+7^5c((StY*i^0Q~x$29R(g_(%9llRjhG+XC0SuLeP#V2NCxz5|_SbLq{ z-9J#3AuZIepG;46cYQbp8dU&AL$ldH>`%J>cB~LSfV#cN*X&ondz^=z8j6Jy=VeAl zn~SV-u<>d4W}MF&1A)Qywe}TGgGA#QigIZu2*1BD9jE*yN?Cef+^^LlvTs3c9y!T< zNzAhqVkz@ix9cg{!^6WsGUj&^0*91>UU^*hD>hE)i8km`$-ViQgz(9Q6_r$M?8JZI zkwD|EKy9SiwW5HoMHXwydq;i#WG0eqQ}abP{9DBokG-mQY7)PGXj<}k4wPv#x?NPc zB0ECEZ#RJ`rx=*GSc}+#=mY1Xb|`@h0szKlo)1zZ#<2Ol5x$>jI&LPVI{pU=%xLSI zn&_rj-2#xn!02S|>KXG$3q^m!%Fl4&63N=(a#pfy!VmdCue&#EtHv}#FnMzti^~E^ zUQXvcfSxD#K0931W((Gz~a3_DHfx+YA!x;Abh|i`PIcO!k{0cK=>w^&tP7Af*Tkl;4Rpr~d?f3TncrY%(wTdvd*(`UPiRWqw^or8+5U`bAvt z@vr*S-+W>-X=V`vIc-N4jq{9(Yck`jmb>g0P%#=;k!5w`%-pYXi2Pj+&N2BLT;PEv z*I+8A08DmM?*F0+kGVdMEAFgmFnF!tMu0S=1+P$^88{@~D)N{F7)g6p6;BQ5S*|#2 z2};P>MBok>)aZ=lkxQ=n-#pJeu$=%pFeT~5KoxH}`;kZhL@1UFa(yU6CReN(f;{v;b=peuo0UL>g|O^YfNLHTygD$X zvnO$1kD_U&1;0Ljg@g@E-$vYBqVT7>;xPrvrE%oUsW~-L-2{j#nJ9jyxO$2Bh6x)f zX}E@zGc?12_u>0<@F`|Tdx}e=d18T0QN3Cg+B0XsLxtIg<()JSbkMPyxhy7=l*f28 zp|GR`untJgH7P7Cyclw2R@NbteMb(MmY)J)mRG~&`2GV6a2eo%c*RoCVRC=1R-?Habl&ofByFjlv&4lqhCt3f7|4~k=w0Yd!!HrPZfr;nb-t&q}z8-t!zx|#5@9v9ld`u*iJS8;NL4n zoTWr>tV)`p{DtZaHBw=!52tMfQKNGz*jM*atV42+=6AHGt;wYF;;!3*38N@rB2c-( z7zlfkB~x>FUT57z{9Jka^AXH@r#63yr7TMw_^5-YW1dCZxk48UvmPL+;(`YsS37TJGEE$=G^ipDa)d3Rb{jPF%Ok<@|j ziug3PN28)o2!pIzK^#} z*sJ+e#d)Cw0{qv-DyV-tWDF>#<_6`?xD$y^h9N4D1{@5o+@AbFBsM#|QMn z^jq5n1~YJ$tJ~b46D(GIy=f`>+Swz^>ESD6Ko!v^#`nNvZDLak$(O&4#BUM%N=}%q z>oP^Vub9FI7VXN7OGyzQN@35IzzSICueU5Ed?F`PN#u-Ms?(&4I|I!Nx){*=KN zTdF~heYLZsf@Qvrr4-4Ph5ql&WCR*VvolJ~?ouRhyLUc#i!aN*%_dU>x&V|s;T2B< z&D>OWMv&jd6~4a@zwm;@I(!!6*S|R}FN`E|-eDil3VOr$I>UCsXhI&n`KxD;l84F0 z2x}U`QhV`W-Y`@Q4cxb@=*~F=JwxFv-rqy?(WQNsv)%LmD0}Ous@C=WTM-FCkVd+@ zQ@Ue;fOLa2ELu93s30LM>F#b>bPEVbcXxMpzterrKF7WH`HtUs|8Y!~4q3CF=Z?>P zU7IC7`FY>oKRa>CKBxoI&f}{X#)Q=5boqsyVyDQCeXfJjDPwIET$YTEP{NV96?;50 zxuwe>$>5p7^TUgS{1MBp<$0BIkegB#pg2ApJVuyxD`4Lw-qHfhv^%b&+Dsm5{=!y`;2CmIq)*r4I@3>a*beg&s{mzyU_j6(mJ;m%=w;{MN z%BM1$3)OCJ>mKb&d29RYG^_Rd_|&HREyjQ*1jPZJ*ss3AOnq1<^u!3k67sL zXhUxr*7x=`4#9Bn{n>QSXtfe4yC4LLPYV>@R@lQ4|IWzi{wj-nRSg2h#f24b4{duW z&MJh`m-gB+KffT3Lw ziEqKL5mXm=NbwaKjFjdVov!|0I=#&OcxJW8ncF<8h^u5|xf;l~R<~B<1tqZ|q(=iU zAm~S=M3+!Xn1E9xR=iCH5IN7(SfPYA`f%0$G8+v7O2KkO47L7lPVbDRz29vQH4>g} zvTVFA4WfhsU2v*myiyHLT^qABax zmTJ&KWAyVX=2S|vtMZPZI{`YCB|oSaK1jqdE=szoyXhBt9$xIRkqDsYZ+LRAH6`5g zo)!K)Ja7wp?RoifXDF|X_9(WtVnN)U#L1^*<2Wu)_Pp1c?U2;##&);9G~Yrc{_zEm z!-9lTm-be7GwHz932Oq|Jq!KAUzl;hPGn`x|2B=x?S*B}#+Hc?QR_qwoE_i({~|A!*l z7~I}ZRH9e!FMCv$JG2w4_BpJU18*!i=>7|L{5$CQjsUmrmTrT;s>9VM6z$v>D$-lr zQ=2ZZW|lQ{B&16pR{I!Gw@}(W6Dc(8#9qSh?IVwsao(j5iHg@bgNEKp5-NE+jmTh> z>Yy6?52pDob*h-1Fo!@?&Habk{hd52T>H@r>b8IWLc#Of4n`xtkeE_p3tLR7D=zjF>ix#akJ=wvM7U<8U^mtx_Veir*fNqs3LQ$9KlL!TC+Jc64v(_)0Zl0}>r0x~;A}DEMn= zcU?l%-Wu(W_qj8SDWNe2W-)Q*1fejiQ7#WvHsbWV5WfB5do$;7C~2kk?r2%c^E!UR z^1yfR;GRdxJg03A>v_70Z}M4vyvCSnk;R?*%Yxo}6EvYi*)z}K(M-tMi$->7A@55h z9PFg>8m)cqwI0?7=)C(4WjTNx_GXCvjs5!0P4=eLexV7c+vE0DBHQLRJhR(a;i}Dz zQ7NS1YM(aY3_$9UEA}{}JTMP4<+Iy=2$d%ZV?g@wfa-LRPJmw$~%8UpqIaD@EYpd8`v1Wx^%GFe>R2-_vZEf zBQf;m940|9T ze63S8LlH0_x#QWGa@KjiE$3tG6;WEsii3kQv~)?y<+e0z9V`h@I`f?%^Lk!pLMzB*-@i> z!~X$dYZTi60ahrXd>-%n<@5IP$)3ipM1S{}UN`vH_mJl4a_q$G)8_nGKy*Rij@zwF z!Dk5n&%RpPI+C8T0UVaAT^`@ll72n4uRVgYEP0MXHtM42BKv$&TSD#QwL=DfqUNI_ zZ-|M3&9?erQsP!U5(K^H&c8TgyZF$~B!~yulC6R8FQ)%(#{B)H_yyk)6 zI4%0jX0 ze}TZGa&T80EN|}pwnKGG^xWli5RU$)hWmg0ucOj%XV#f2gMZb;`uEfKx7Nq+KYsTF z+_#K{7%TpldTj_i3-+oqkjM_L>nXQP81?XV!$~*z&u-Y?`sDxDk8k#V-EZ1uSzb-ge0}RoEU*4%q`js;ld&wCm^Fss_G~iC?*Y>hA6?-hTK8pI&&Kj`5G%^*vN#aWj1`A;jn2Kh|Up!~3XBPFe#Rx$0FYh1e5?)&YeXC{9^+yA)RqmI7>f{qXr(NMBdnuKw^o_e_t zeo0B*ENttveDF68u`SN`=9)~sW^cnRb}lK3!aN=rInA=Rc)?a6#R=Zpm&Rk&&sb12 zv&vsP&bJ?rIvWkjq5>6%r`4heRYo@81|Bj(&J^yPQl2-L% zQ_vFC5irJ+W5FF-DlW7R0c&h2Pn=bQ!^b8!!)ByaBqd)Zi$GHDZ`yjnN%@`uC1`iL zWq0A+g)y?v4#Gk*Z%Djho>3F{l|Vy^AbZRZ`^BPCC;@lDeGuD|e_U_TWLkj0XS6rs z%tbi$oRKxZT(nb1$Ey;%cz1)Z6PF}?!s%4BZBl}9q4Ac5+r=>&Ri#F`+mKdu^I%ud zNr6~HnC?5Yq14V(kMYTi&-73~@Ke8W4D!{rE&45(QQJC$3jvSww|1Uc%AZb=sTlwS z?XNO2pk-6{-3UP-Gi;NiK&A&`bW|m;Eo+!BN`kk&TYh5&In~G z=Ws~GW8(z|%`8s#@L%fNP=DhT_}qUqNcn{?!WKRNwZK`sXKsQdQ0ZIUNqDA=)x>@y zpmR)fh74Ylar;6n(U-^_dHjD-;OI|YgjBo%%&GsnUQ~V-rR3Gzo;WZErDtVP11;D7-R!`!$o2kMLQ((t|Ocl;~F$ z1#EZO=y@+VKllhyOtP=@pr`koZnbU~b|BaC#IN7&FKzbY<2fzNo4j~e=Y=kko`nWd za6a+Q%gz1#)QI?j%7EX@^Hk2m(@-K9+U_;75}Gc$m2;;7IRp zh^;C`dapncq|QbU=_|l5``cyx_2V0?$FJUxispsX%ReW$b`j9lQLYGiqTgtw$B%DY z-dF!F`2*2zSESEXABvlfwlA|pBExexrwk+uL~{QSK6zDD-y0sYn3y5on4EP<<)Cr) zA*K%?x{wbPxP-Vql1!?1*oLbiF21wT;h7^t**qtO)3|HGihcQ|u>yQLIx5=gfXF-} zna}XhscS{%_jOmb_LKySGa0X%H?*1-uyQs$cfD@bEGet$k-#q}&e=KOmmd4y5FJnz zPDY0M1FqS0NqELhr;1)i&($huqR3m0oS`P~{%G9cM>9Dnu8+DJ+n&}_FR42vLwPP0*!g7 zGMF6sLE9M#cp3oF@9@6Rjpb0pLPZ$28Kt3&A#U-HiHX=EErPj-2uwLZ)(xt~e`hUcd_^kxlFL)pFpvGTN_c zo}f=tUTzC)=T|frcV!l!wbu6*5_)zyHKhyzLJJ?B6im6EvCpz+O$H>R(?eo;PKaMi zr$2+jI5RLehUUkDF1<<(oY_Yw9{)(@8)(2G`7wMknU_do=qgd0m@7bR&I?;ND4F*Y z^Eo`ZpC6skUHYQhN@UD4_fthPy{c*)*rZ;--qid3z|sAd*rG2q3+ArwkmTn2^oeeS zzWv)p4|aA#gE&WXUA~hQd`CTxj&w{Wkn~g zURH8_rNBv%Ue)^ye&?^DONx(%hK5cl%DJtM%L&j(+@`S5mIW!LQ8UHbI=VYfp1B=g zuJ5q=pEooJUK{O;gF2&jV!zB|&EITTtBiaw#0A0X*sRATQ%*ev);@SDx!R8Y0jW$rvMd{^Mt;ZuRCnqi_f8nOdyxyRPKM z>iqK!>eBwvIK%SWZ$E(R={BrEPA0v#7!F!te`*1=dNU}ZWN^xvThV9Z;*Hp6xq+>w!U7@OW6R(uc=hQYCc-t?Jq zH$N$Hmkw8CJ?gD&JkBB`A7r&Walk$)ICGYv@2nAbNax-C;?Bki4Gwnqx}9B)&q6>^ zE{#4qx|`Tqf3g5~{`TC#QpvY2L@GnYA!|L?s%6jsO|OaMT~3n$LfY>;_+T0`Jo`qN z-AC@!G)=>b$od@BdV5)cZT90X@PneW!%3D*>cl;D=`|7X&7%9?AEK@9j;Lg}b5Xe6 zZwjxLfhQKCq{O$bHmQ!0!}1)5uMHrfD4y?eA|fN{g@p7y^X=3t^`pvRIN^X!Tg~l7 zRVc>>)XCA&`FNEc7=y)8o15Yu4G_^NM9-YNK^uXsF@ACt5fQmQ=zJI+ymIV!Q<*v8 zGzW3uy{`0)AM%Q(?Gz!Gm6B>dok%>OxkS(&nV8}4vK0l2^=06{-IG0Ah&y@E9k zA60doiZ{aEZJ7>9A`rhYVgVMScD@>{?rHUq_JVN}Ma8f~-=Kqdjcft}sSRjU6ti8s<_|E1;OJQ5;mp}AhR=Rpu@l8u-!O)IgR(x|s#)7rZlUP&h+ax}xLpriqWK;9^=tmW=xN#skhCf=_ zAFxwp9jSv8MZHlMAa1y4lDZ!Em)iMP#pBFVeE9-g6oRtzAuh`ccWk{y0 zr7iEHm-iO^WnK(XPN_l7$!GAA;q`ojr*=)u*&)hTDajxb;goTR=820w;GyNRhn^^S z5Nr0s(0HoBh`SOzCYOhXFDPeIa(=nCK^hK)ww7(3#&dFQZ2|tA58fwc3H)nTFtdq= z1>YjU-* zPI>1Rrl!LwLS9=Ttj(FDg$WllKQ1b4B|p7TSepd((Fp=$ElmRRQi`gZYsEWe z4jDdH$aQT^;IC!>j3h)PT63(MJ7E3F$YEyt{Aru??O{1v?)&w=rzp2Ro;SNv#p9@; zyNvDkt(0{QIEiUvH1??Ak}nLHiETur6;Yw_!L%(E&SN0ee7R996B>7L#4u?pxUE#`>TMMtEPvb2#ysPigB|ls zMl*llY)9wG^cn5<5wF8mO0zrx$l*C_Q-Z`3#8XFpC2ge2>>f#$0`~bTr7Cf`*4W1;@uUd(G;Z&8m&GW*@q9|BEH%+vg@}k zeZ{x7IE~lcJs;M@p4@OEzPR%ss3k)EM^o)Z9wJ;Q$I~yHNXP6>Kaey)wkmiH!XaP@ z;obbWbY}0ZyKkc8l?V?RcUsah<68_`S;3|K?I``EcS(CzJWg_lu(EU+-RmJqQnQ3- z#UDd$iXt%MUQ|}7&GwE=tRmyiNiv;Z*ue*%UB4pWc&KtVjP39w?EXf#~!#}g4N+({zt zH}vb+86=HuB3aA_5pvt@GDMa`b=O>MXSKee?HMg(a4XX2k*C#mGc;Y>t^LhzAcf?N z)eXS|I-_t+L!Z0nppELakgdJy1?=sstEXH(>((lU`Y1|Y2tnuP=dE1U<0YJyb+sp4 z$%HW22|cIk(fco@P^j4X>vV7a^#;?9c z4Ho1v3te|*5mG6gXY*gx-pC4uzShU(1XIK-(U*QTRbEsiS3va1r~1M#X79Z8My ziANjMRUE5!#(c@(w8%9k7gA|UhETT{hYE_=h;Y%Q4{ zOa?je&2{`Y=H}gokb-`)u~0G6-*==HvbTj1IsT=Wtz|x*tPQo1!ybv~a(obJ6C1k@ zmvTSNPRvTKg1gogURWB(t|l!xbCak zXL#%!mu$#VBedq#V6HL-kY%OoY(VRDOnrI{b+Q}EmbCkx<2phMlx2QY)$vb%Qxi1~ zqG!R8iX=*XhDMcAkXNVD`_8viUNJl$9!8soaCL>W!RdzNF~6WYZa9I%C_l&B0#2y+ zsb?eLxWo`EE+`20y|ofkkl?!BQ%eG-3Mz8jhwwik{GL)tgUB|f%^D|cOV0gmJR^>+ ze1>GLKZr)f*LZcVa|g~miX`nFQ78E`1cRlB9v<{0CBP`-OOTBIz@R6)Jd`pf?K^IU zWyH#$n2*)Pf^NQ2>iif#A7 zDh>R6999mz;yk>(wCaec60iNg0BB0djqh#K9AIGEf$QQ;eQm}-ZH?Ue|aMN&WN1Z!cdPk+A2qw9d}&R0+GLO zxY65@-Jj%wAxD`RN9nWkiF0nux$7xu%(>au`p78bj{|Py6;Z+_`Nr?G)t-^uEz25U z9MPe=s0Y+Bq#kz_e&xjP&xj6OGd0J(`S4Jn6&*IuE&25;wl(?a#4XQm7f)H%*w=fh z(ZW&_kXbaBy1k6RbgH3OE?EjVFqdqZdbG=LHjeUhZe`_*785aW9T$|xFBK|cxWt=+ z&6`>?GHk-^lQ-7r-JLwEAGAIBn2M7z#Jiyp#Qij+suFB{a&eN;6`2xMx6Z8fnyG3Ji*;I$!!-#%b^p`7)p)(;9DJyD~f&#-S3rxwKG%lAR*NLTGJK+Hk*2 zyheRo!NRfTSu$%hkz8PCM|!;guJfw)M7)CORyGUgZ|oV>5g@IuGGw~c)Y6xFfbnxG z1-PS%PHC|HP@k9Z(|Ek$SKV58e^<6N?D* zW66-FC>3CBKqo%x463<~tbFbdAMI-i8=w1`Q#wHXW=-Fp^K)$I^S+&F10bGBW^(63 zxHr4eE!M?^`W~rH$ZpThR`s);og78kq;_?Oo3d1>fn3U1CFW@v(2hqRItGcKWNOEG z-jnS53~J2AbAHq+(NGIE{`ks(;SE2%^O_>AbX4$6cVhKIl2R1Y5faHQ5qDM+BR!6= z0KI=V;W$QBrBYwUz$^$9OU>;op}erXwf}k~HJKs*q0af~R`&)Iy*lM&d7xOsY)!m! zC~n<<)(YT&fYPsZmT3w$QG7;->~;n+CfFHEj3a(56LVH5abtSMCE43`-j{oHa-&6I3IFWR1MSVUG7Q-u zXgG7cfQ=+Hj?UWY_%yRcsaae|S|O&Aww><5V2wD1Sw|VD`9&xmbmo9ybXl}x3ky-{ z`Zqx%V4<8mDgLE?R^RkJZs)7}D+B4~%O+_l==%| z8j`00v3^ewz7|)Sg_=~*_ud>?)1UPKWwqh0xD#=%kctW}vAZ%y6RXv4e$xTn)2RB* zuO=4;K2uOq`h$0;$_ePzBpVaLICB8;x>m}NSFh+)KG4w6Se+K~5()UKfP;gFoslB> zJJVaP?l0j7%e;pVdjR3lz; zxWt*E&ZDlZX-yS%sf7;xEch5t(?{|zPrk^RJ{c3Xb;2Ju?@4-sQ2#2T(f{Su^z=7u zvM^KY9B;yj!dFiMU6sr>lRHe^f+_(_)e#>LQ*iAxlai-e0 zJatTbdo4=Mfkb*CD1U;vv`hC*8^Wn;9-NzHwX@4qIp%U2g?auG@GZr$qd}-HnKEks z;OKEioqf^?*phU04@YEBREl&(w@@7FHHXvh$s`VDJIUmGEVP(J{KdO_v4zaxeo*n* z!R+T=rYObB$4h%b&HLX1Jrxq^OCiS`*jpIw$+-rvq{15!!;2d^qRp#YR`Pbf55XKW zd~drxW@yoN1_!@`eS6~@w2(gVW|_4Nd);iru(=nvFw6Eph%{N&O-3;drb{jEi9d$T zJN%s=6ICBV%$zxt5E>*TudEy_OCpckml<5T6>`2SL?u;HVQ(ja zf_Ez!wmVJy^tU(k&nI>}`2Da`T8TMZ_*`5A9DiIiBOgoL&mseJ+^ihccgjJlqeIg} ze(P>_@`mmD6!UHrw1$DtT0<2sE^>q~lBC@4RDAswnOe7Q~%=89| zWr5W3+1aahwhHSC3BxkP6nS6fP8%fLvh!Y6+i8MeJTnEhg(dS*=bIK5G7HY&+-U`r zW!9m4?`)Hg`5PONp{Ey_7`y8I=SJD@PI&IdnN{2zzB2a*b_d(lwQUq!%)Q-lXXFv% znW+X@ol-kZFIj!Oyg9^l(ur^9l6&dJxc+{m0)!>@04|G2?iJ;ZR$5^lDP_V5e;V== z^QTJU>r=b#w=gC{xCInYyt@c!yUJ=YaE20hbXIiIb z&tK1NgqOPgZL@x1=?s7VP#bj(O)V+2Q{O-j?e}_q^Pnd!k=wwqGtR>zAQWosY9Fx` zU-xe7)F?P`ocOG5xLevp&eqGmwS>3mfbZBEHLopTx~Lf~c4YH4M8twb!OOhh+ddlc z^hjCTjj2~0yA$r7h_l}KdEdne9TQWO=lP~sfA18eYuTTPLy8&)8<)+(lM&oc0>%iz zACf4N`Sf%o(Y}F2&4Vi3BBu|#{u8BA+tm^6LpJ*T9cy~i>4c%>WG1x7S&gw$Tf{AD zbE^FFTbg+Ng`-W%j;M=ypU?M4*VfJ<`ngUd#z8?r*=K}Rfn#7O(DMzNzwEUBfabQl z$XeF$aDYxNz;3a!rD9A`iH2sLl!(&L0jQRWtKs6|;Tg$lxboE2)&;j!lB^6Q4^HM;U|H^B9m`7dBW6DN$J4v$M>|+iw#$}NbK3L@66o!^hC5iF+plck5kF{ZZLUZP z(}T6mB~fiaAF6Db`J^4PZ8b|1N3SIGLbk&N?0%ST3^LLhTg^T9Fhx{vREjU}R#=Cp zz}@E}&w1U&!kDRKyxd+w02NGV*W6g94+$O7=&h8*Vqd$3WE)`RtnFhK^pocIIxgFC z=c3r|6he7`0{nCJjTJ?5TF&SLtc8ztSkg9%Dcdg^*F288^T^wDE-{rtC}XUttK;gS zFb5e70avs_e#mWKk_c{oHo8g}Td_0$xnT6X00iOuz*=X8TMH1FOw20t=y3%F{LUgA zzQy<{tB_SJ-<ia3WF>|2{OknzDr``EV9q*U*fgn;I4USAeyrhjiiZX;|r zBba0DOiuypu<-%Vt&B>HH;81&ml4f(eDC+HQoGqtRd8@yu=~e~(rYUHd^x80%;qW% zpr%sc-ldWsBBQaYhzOkT)vjN3U*a0ti)N-c#?Y%yLVFD8VxECU@ti0ikdKk@1Wsqz zf|M~yZ1l{%k!R;&@y?A(b>ZR7&A_C744T{itj7mtMn=YXU=LWKwQOD8$npSV;<6Zk zfXS}pMahhknJA&fbR8N+&j1#K1}bjAqPh$z?%4)(b=8#M;u1c80Q&=@mnGc)TFWHi z6grw>u1J@snQl+#E<~>NDlXm-Er91DDD>4*2#nD1m--dOPoJW_ zf0FFAgh_0auR@@+Wo$2>te^BVAX|annEW-=Yz>6QbXKOJ+GpQMgim6k%%WG!6qGy3 z_cdO^k$Rd~W!uECGTsE=i3Hr9(g5SJmYxmYAadfEj@48nRP}@|S($s*@rUPzMmsdk z7t|?${G}=?6TUWj67s$&!wQk)^chY=mzJ0>GN;AS_v;2?B zzsK|cJ{HA$EU}*|_31ORxm}K7c)T?i{ae$*rh#Zy*6hJo1IFah2!?WA(Yeg-+t7gl zS{0TX<3{qB6@Tge*b#DOigsw55+|)BPUel88So6^i{3!eS zV=hRfn9H@7E}_{$J6UP2TC-yDwuM%w-p(X>;4|{?--!UhZ+KaJIh+ox8thcQE!Zb- zJDzAkdV9vBN=)kAY1-lwG;7j8-X? z@?QKeM!NqRyYRcFdW85@XV?J3nHUiwzZuO_tWD)_{vq1rr8d{b@tBUz54IQXmq<+d z_k>R?PIEb2RqKT10NNCo>!9g2Qu2w8(H!lJiu>ncD5?Yp7;rlu4w5f#S-BUy{Jp*Y z-;s|tr0`ZgQCb}Prn4s$CVUk(lyhivdq`mP=v6J;3K_G8s(z|x;zvVYP&TJ!1 z|D~LpT<^B^@!{6+?~m~RKHont0s-P<$w%zRKF4k+*#oH$Q5|QHq!eQAWb?2jyDTYG zdnS1C4^QBMPW$}xM4p|>-5iBPm3kiXQ`rXtuFG)Y(OOk1ZLPQ+?ifbfYwO&!86eCe z5CG@RucZB6R{76`ad<#>4%wI8Fo7bM0@WTnuopAOvGG{_TH}Z2#^<{vL@; z+W3HEC^UiFmPQ--6gf*f(|lNoa06u9@$8AfX{MMy;ue>xwmK+wm}RKrV%V^d*cdRMhtWnyNg1h8dY24)_l)a$j4+Hu zfMqgxdoZQSZbmA54QHDHaE|}20{#eTmU7VOJKb{FWJA;(L;A^Q*V&zxKOUv+)c1|a z#is&5VpDdH_x>dzx8JoOq$89>T1>1s@7uSpz6Real%3j^|DwFTXhZ>=Tcvk(W3u4S z?%4>9J#87h_!EEd(Zw-dlBn9um+(aH{CistUd~(|Kikd5+=c9_`=yT8{$-w+mc*kG zNkllj;PZWKyrUAbT5+A zyqGRS1njvL+$(q356Nl#ivNAO@9*JL;;*?Bl8?C>kB{ZA(Ld1qg(W1r2 z(4bB4eQF4ABhNjz=f_5O?FuvY;@PSXXsJR}%#)*vWEo3|Q@oZvOU<7q!b}9{Sojoo zF~cH1E5?i|=M%y~Q8#Jvo4hVq+B>K>g}VGN-F09#)Qt~A8?DwYt?f~fiHxDCT#gM? zJDB^kwGvjErO)QV_ola1Bn1BYeg1lv{>#1rpMRH-1Xd1&rm5Mhm9}?+zC8v^OBitm`D!zJiK(ZSlE4dBYlw> z{*=zl(4IgweJ)vSSgME|UP+hgR$iEL^ws5yhc`z1GztlCv_0s}*3E{4E+eCyPl5}; z$v@}nU88nWgxm}w3bCs8Cw29C_2ph?9e!gIqm5hBY>e=1)VUie+pyY=lX;q)hZgR9 zd|C@W8~Q6*i;m*={d_L3HnY5cPa0qfcNn_{(zD_+VLS%x<=?Uv^GH_LXCihJ1XNU= zoR)_!8K$_Efi6^?gDGz`E*|)csx1=WI}b;}ACVo(9KFDhBhTJRw>FFXY=`GP6H_t# z*i3aH-TrsiF{20@>jTN9x$DUC&*<@-clFiws@mH0N8E;dkOU4DENXoubQ-_&y;jTN zAGG<|%_7{CnIeyy&+6egkd|yed7%o3AFA$g2Py#SITZ*1A$XQ$@19$8{ zrh@GZOc_FCfUKT?r$gkN&ZDLtC7eOCNUjD=6_k>JGLoviZ~=P} z3B6;hJUq#4xE0j7pYio4?$5^*HF=!R@bQohZ;;Q8jzH5?X+*u zGjV-N;IWkhfx1rblIrStvz)M`o$+B0+MKz{oK*uRol1jck!7BJ3@P>#BO_LK0nDxV zCjEwIAnTJW4BNQnTMXN=b<5qWHW3-0n^PJ?Lqix0hS`5HI;y7Ac<#neoOx%UF`>9? zU>Ms!{EnD7nd&MUFE!FsS*zW~>PD#b#+tL)67Tn}$gkI61&B)|m3#r__417`hR8Pw zk>#OR?jTvEjI6>S>{UFb(JSb+16)`4K+Jl1og1Yx_zi{uu|SCTtdF`*pdOL_6oIZv zD%umvrJScxDY4``8_`Y4H{p%N9|!k0mSk+bzatHB9)3KI*4d6`0ZIolL*EX}TmiOH?Ciz=}A}W@qf8l3pJE2D# zcF5vm>a&(z%|#^2FU%33n=Lyo?B(Hn~jFpc#E(W2ArWQ$`GkJx>7n?dtTBO zjE?c{1oN;Iu~ep;*HXIV?|25Fz6Rh8-gGLjYO?oC=w3_x1FMqGO{~-@bjsCm;|hP#-XR*a_aop3@v2q6zFL zrKhK7g8R<=3(m(+cf9Z|X5@!Z={3kww^IYd$2Bkd-pf4Et_Sl0xoK9%E8FLc zF}<+>kFp9~UN(N`?2MgJ0F?7dTroPQbaaQOxfz2722duH-WodV>gr;+JzC0^f$mp0 z%wOmvi`GfGMe#xO8a<=!%uSJ$6$AwZH>a!yka!5Tq0{>!$x=s$=jS=VNONNqF7~AO zuz<&Q1y$j*fRyHCEma?1Nw4b^k(^f#p+XRVt$eqp{N8<(z_)2;Y6>}(w25|KveI?T z*wgsKEil=xNOLb7?BASftZa)n1A|4QX9n27XK zcerwvuw!rf{m|om=1u>y;9Pt#0qzh*lBdjB##CW*x?vpFPt_+WRIHk;U3}>*lzx)% zj46Xl)`F0=4;?D0zNQhYw~j(51U>^4E_pGILNa9)Y(u6Utu2bgw_MCqO|L6;B@Awx z4e9UeIA#wCq0Mq6EGgnTF-FOVLorwarY1CK_^e}*rPL$0eJI&=xgQA|?^kzP`*8N* zF{fb9+jEj)uWP^06zxl)ff~c*rd762gEq-Ol}A4>`WTFZQr{zwQU9Jt%CVx_gcsBR zud1%D{wtzlEx)>A(kpFVZcSNuRT~wRG4YD-zm<<)k=@7FWUQRY3GwvJkILUTMdZDu zS5uQm8_{G{P$xLns*9a1N>tNOk(^y>%~h{qYL&H&o##M&u`jsXli{6*M^fB2H1<*d zB2PziLS$~qM#jD%f3|VT($Y^OH zLEUNv4>QNSefP^wk15=a2iG5A4i3laX~|(5xKp8y9j{)}sug;60nV*D#G*f1B59PO zvx_c$&Qz8{Y?PFgJeRKMRXp*O4QI+sI_c^hR}dQ6cGQ81k?s&+Ot&k*oBO6Y;-vHb z4$-os2qJqY$lO`QOxV@hD((QcHPy&TEa)x1z0nF0zKm6S*xs=>+XDY0&AG1fK`Ial zY;gU<$p$MD8d+cB&c)mQO=Zfgy;9v~v52v!68(n41cqDMTpxkrn` zi>R@yqhMHa6%%8x&l10=NVanGQzAqz*%N7;sZri}r@ysO)16Cb-Wt`1V~-MMewFXh z#oC>z&+he9`%Ff%5GlReX`ujM2gA+~c~y)+eratZWonxJG#%YZA~pN4J;p3@<#go; zre_88j%vvw?hkz*n5MnoM&`*iPG3ZrDqAk4H~0~zW(e(dH`Pc~2x#1|CckQ83Cqqt zChV+CUdab_6PgOfmN!X_J#Oz)cRW#8C>#6>RqBTr{k>@cZ|Is-ILcuAMs089xQQEO zRGkhGr7}jd$yG03$gu^AxGTEjgHt}bz=M2NVYE-n;dAE9i7`hSesKk(0xlC1lgTrkI+m0PHB$zQdk=J_zci~ zc(|SDgr)o3FpNm%^Fti6313c~0*!>|)6_&B^@!TVojs7Rudlc+7+lbM^^w>2yxmRh zOnDmd=!4y-x)#-}Lw)y&!fukM%XiSYzt&%Ldev2{|5^JaX zgyR#+5((fDojh5<-WX_YXWVMnoFCr4ZMisUk?DSDlMYk61tuh|f>-WR7O=hEKmW^i zZn+EJOR$0|)j@r<}kZ=iuC7`EbvB4cHGpe&vkTUcEL)s*WF z&f?imQ%MaY8U6uo-J7W%(?Kl_BjWigsEwp$5W#Ago=Izb%A=yKOuwb0r6bGn_dIh2 z=?D7;x`EAJ@=sQ#h+Ux6o5VMFG8)2-qiNqB+niwl7H5jaUJp{|huE;XY;vj<>`#mXMQlMyb z6A}~pD8~!f zhj(li?Rt0j_F@k&US3~Xo?2U9e&mZ#QycewUYZcI+WT^EVq=HbCS6J73d;5zYLKBr zLd+*wux~OXQ4vik6E?nClWD8xQ}MDKlJacxWIz}vW(vwTWHVQ$`4xDDi3x;X9|@GY zHOmAxLmC3}jadwvm_{q_*iLV`&o*TABAYg#Wg8HmB#~T`C=9nbZHDY?mJ6@@>v`7o zzrMORVrk0!?*r4eM=&IlR2NM0AbG2gmMu+K`5=c!e7n-g`SN0p!nS;M(cKI^+^-QY zDgq}w9Cb#G}!1U{Bf>!&&0RCn)Y9KU_>i_x6^`Tz0t z)&WtrTidq@sFV`Yh=4SRbPnC!jdXW|Fe*|~f^;L@-7zBF-6c76*9^?ed%2&z-|xBa zd%xd*^u=6rUgx>iv3~1Vc+nuKJ56;P%6X-NhoRgBAxsQ5v9g1H3`%)uZ^(oKf*qHe zCAqn|b4jp1@1M|P16EKkr>>96ZZXmTQuC=>5vtJ>(fs?~kCpNgBoxhJO4X3RwM`qR zTb$iMNls}Sy^NNJCowHOotE&2n#}&p4;eb;j0AJdwY#7jwEcUg2gvjDXMN-2pMd-z zkHza~N;S4XSSYOhZksOK(W&CbkeJj@Yft+nrVv;W0ee21a}1;2o4v9wJ`X8i{5KhT z+Xa-&p{}+5NDoHRF&7Aw=Y5gNz=&>Th(QI6w9m1ntdBl)dF2*b@YiuYH zj$-h!E!b%Q2g5?p&B|BhV$2Xb{8l&@sYf@3NDHlu% z6i0s}w7wb|wXu(u&O^d+OLh1&783r*5q-adCt9*|6 zH(BZ1b7$x47ilaP9?0K;ESlw5DMfs>B~pjq6g3pLZt5@j{m2c4=wCNeDth~I*F_u@ ztK*PIe*c)0V-~1$li@c)ekTtPeY+)2KAGt!rMJ4|lQJ%uJHk)+Ro9oSs!*y7cX0}! zSkb3$HTIQ8l+?J`l!=?9ZCmN$;+E8$UhH{#daB*V;|HlHO*t#~4GgF`*}nBKyUzTE z%XUEf_N~am_m-9xn(!D4G@JvLI*0js@z_X$y}fhb4Kq7{E4m<0E(BUoD{}tui}D#* zU`3rQo|$$jA2MLHqUm+*U$wqYX%S+v-}mPPydDvc6@gfmt0v4_=E++!=WT!eP{tg$ z;n7>9xV%~`6G@z+z(=}3RGzF^qwkel#}@cXjCn!CL3!?1NqPNrAxZMOURCf z8Yb4^yQByH5Bj@1B*_@beBdN@Om=!rc9EsaQ}O=;YWxco-Npcd!`_~#gy5lMflN8M z_z?~@X{-m}Vku_ra{A2QFBYBuH)9XHwQtizpwd0In8ox=v=s3pF(mw^ z4Rpa)Q9e8s6DYy}*>UmAS3H#9bhBnG3c5K~b5&6l3d{$^MN+HY z=b5z@w@0_tRha=suksFmD^XUopJr4>843A4?M+J~lWQ*ZA&2jRSExzt>;h+os7;ym z&Qe9qG(ctznnxfabBXZky*A8gzA4RA&S~Uu)84IB&k?CLQ;!thwB@9RL(dVaFUAa? zoSbDTvl<{zawy4JnGd_d@TQvFtZd0ko!_i8n0C3IoIFwGgclB=0zL#p2%$7*jTg_M zgYzglm!)bCCd6AS;XI=@);bp|WZG`hAZE<~BE#5U=&u6(&rX@&pIq*(6^S61AfMdx z=-9W1m&sd{iOPqcYyyDq#o|$&7#LY5wovIMq(~+xYsL@c+9hKbyT%EJcafG2aD$|p zIxvQhfKMMUej;OLM3vdD^vQ_}Qj;XapStVtht%i`v0o)0*pO2?IjJdjyk;px>sTEPf1~WHHj&cs zo_%YR5hepzKbEtW$7o4oEft9fvo*P(hmI;t&vg7;$S>kC%f{Fu|T zGd0SY_j^4@;LBzZFjLT&;Oe}~%xtbH$C+qh;Kzr#d9H%WN|n9U0)aZ49GU0eV@&j* zb+-r@`_&!K)g3V)euiO7?W1nKub@siBHae(WnuHz}cE$Z#b|rtRWr+^CRp zpEYnAq4ZQ-Q(_qBs)AM7!c)2|uS4d*M_*q*qOb64_Wn9dBK^$mS$0`zt45BpcIQ@v z##$RBCHun}{m-@_R*&zsbhL&E2Va6~V>eSCDSKI^AP+QT4`=h3WVD6NWQ#~TR*cpZ z+&1!UoRTy+X#Ya3iU6QW7IF%8IXJM-(C)+WOgs2z*10ag8M-!j& z71NnnHhP;DCX*5p_P|1HB!iYwZ<^&aZn^bZ^lA%J_mSz0cj96m0(PfUysev?^yHr2 zLRSZT0l0F|k#s<*vY+J^)2b*xTNoUj94Q0KRj`3jh5Q~lw-L)=lW~^fLKVTRiJ(JJ zwV{BCV#$nSR@?Q&(?|*g{bMw=r-#r{m8AjLy@no8|4gb+M)68;jTolE$d2sivin&8g4x z3K7N!3#oDoP6>ocphu;BfDMyUTz-+3TN`=jsC2Yx4=s#AgO2Z*#J1I@%2{C-RiR}! zYBW)rU1@c4ie0Z!_ZE$|73lEShL6D|qMOO-r2Tw%yNT7#ol0iMx0tl^nzO~ct-o>7 zupYJk^D)j4v7QZxb5?-SwlvrKK7C2&<&-Sf@Ep(F<5F%t*=+NO^c9!>;==gv0^{ts z8=^CNVg*(sF0jk;ZIz8iT%w|tr$g*PsF+c(U>qp zd)0OIrJ4gO>Ic6=D52xIVPDS?$qe6%q_2-Y&zERds5xd_$t0*6`lgx!)3YLWM<*h5 zQQ!6qtXEkh$jI;+RPpe>oBQ`@0WDEQt*r*3?k`AQhzaU_h8r2Da~Y;=D-03KZvO(D z6?PHeHl|vJiL?)I05u(GxwNj`wZ*VmPWj;PpXWG@&!U#|F{@(A>)Ug)1DMkRjGBMdIV0vEV0ykWoWz<= zfv93Uza+b{P-d_Ct&5G@a&eIR>(Im ze9>wzD+K4hGcHMOd!|To7MJULQ|iiE#l9VTmfsg1@jXY5F=a%QoCZoz4%we_bV+h2 zn{~r)fXrNzy+S&NsZmLi$85_Z^P7H?2bYzF3*a`cmWN zjvtcy80*-?Vmq`oy|>>8&n`P0{$ zDVsz_x1Ug4`njTAk_g130c8YuRb631>yZ02<0ksYp8&rq-!fO_0Ca=lGfYdGtlzNL z`gD@O&#wtgzxM;Yn>di4zfUaq^qe}&aiz6;({1-%A2eOiC2i_(dr!s{|! zt4M3VbOGw0N?A>a^>-sJ683)Yl)`uJQ-s`5KBrB7cK7Uz!^-pvx0RKZTJ&7ij0|zn zf4l$=W}9Nq1MS~GEGDV}w@0cMC_ig)admwWg^oi`7Z3?b*u58-DIx`|>E)B0Y;e~}f+rFlAN&EKsA={77D$#(a*dX)241i`saRk$wkZ$K zz+*pCFW(ste&@A9pzEdNsx;>}VYa!IgZNcF_QlHNu^L0mbGwc+%W#-%)7kD9b$42I zjt3agtm|`2VK=RJnyR{@1eyfqW;WC>Z14yVOj+(Gyz&dQRFm$yYXXmp&?g=}!IBqx5@X zw-f*QvNDvLxh&53$Tg4Swth@x+c{hB!vk^660U(;q>fl;etXYFiuI0Gl^t=7-!2;$ ze;wx>w-*g^Leq54SCxYK!RiN4G$1(^Sw&NHrDG&88}&`tYN&~t+;2hF|JWWr%*86m z+ifR|kBh+NMmTYtvc+l+;<&vm*4j4+0BTMf@%yP1jZE~a(Y+>OQKyHrm{ZC>sOz~ADAiHnzvdmL0>f^ zH+byYvq|R%3MNZ+kL&@0xV?Vb4?IiMOX|3}lqKMGEaSgK)itu9w0-CDcKe=-bRwL- zz-&~V!7XFW;ytSUPQ@wDIMZ>$Ahp3h@gL2uDUbdyD_X5Kti-~iYt!#;e(TF3^fiC8 zQC-8xSKbPAOyAck3K@kZl^ZK%2{aH;ogY{4C#Mcw1^Z-b3nX}18qVIS>H4d{%3dtg zI6jXjv{UZRE|2!zc>VU@IH}FJU^NYDLTegE4T5~!<0t7|g30G{Ia3J>i)vL2K2@d_ z@H!GSdHNSnbk80RoXx5Sx)v7?DTc+SVSx}H6zoF2?A%x$BCDS16ZQ1z)7*g5!E0bq z0_KriC~RDGv`4l0l52hBu6sGaJ~NGOE(grLz1;J#=`YdYH>jeanObg|QV|BN8)5O0 z_#qY2E-(#Sy=7BkGh5bSiD_vH8x)zZE~jZuLTREw>@n_nde!FR4%6WbQ0<0D{=Zbu zK7I^%lyY$}e_mc(T;TOlC9(y#Vxd$M2>_@;SJ$8k)VgL#w$xIediF^uzG+cuaqjU< zfHBlYrVD24cQD5o`}sp)Uy9J7R`<*Y4xT_Ix{PcC@^R2g=3NwSQ{d?JRjXJ3$Up*` z`wo-DR->k#STCNEitP+nTf)ZfZ>jM$!~X21hnmafrb<*i)?NnzZ9Ql19OR!DzqjO& zh8LTNZV}|gxl+eR(a>k|jtzc$636cmnl+vy^)#V9lOwU(HIBzi;k{8o7|x2{_nTo5 z1;T9i>DDk_`opomjun6N>ixlGX4Qsb<>NrbN43Xt6z#wySxE)vkT>YAoW*rKmtP-E z|F+G@%9=m2441ux;{vg+e`!@dAIUkiH|e}UT|=MH!Qw3+?_AB40N=%If`dEvk*Q*% z!VDM?j^?G_{}p=NOa4f8Jqj2+f0pF$}`^r0y)NpBxK+GibZpIp`pd z%gp`&PhZ^S(@Q4#Gz(Z`!$j@YVkB;!ZLPhjv>T;buL!A&i%Xbn01ZLd79lY)ih_AE z4uc7YEnyH_bzjd!XcR$C_Ee9SLoZPaYGK4~z$FrPZZ-r1n!5PbD{eK9uJ5kxR+C=- zB~>GN@Gkb@uoqLR^0LG5!tBS0oGt<%iY#WmJxLWshw!cBLpL)c9PAo|6n+^^R z?o5q<>aMbZdhGADH)GlUeoublxCO-iW6S(=4Ha_W#cD{S`~R2gzkl^fzdML4s&7!H zz<(cHri$|v_$eH^PagXLbaYm9jLgirnsz*bX}Fbke<@P@OCSh*0`R);&2gX~8#j5+ z+)sb}(C1q1`@s9eWcKgZ%KFnJg}u&}Ipfg3%=RrWpo-e<*|TEvBI@%Rjz2gQ<8-I& zBSF#MCNz}}i=I!ho@5V|mWH_8PGmsY^jQ1(UAm@8Pwwo2x$_Z*6W)G`MZ2_Aw6qMQFT- zVNHDx9oIo)4DIi)9e81HXmIDfcwvtls8YA1riK)J7>v}Cq*J&39e*XifBHy4ISV*# zr*iywI!+2Q!DjF$@2m74%p?$Ux^}&Pii!Ek&d$zuAvY|G(hK>Z4Cb$1XEqKydH$zs zq0Z5F{;Q@t1B0X;(D@kr2pt3H&yNC-TvATWkUnQu7msX9fXsC?5;jz5lnCn1L!1BT zy75LO6NOSB0|oyQ6EDoF{MHWlblgA-nV$Xnla8{TIzj-*N)S$it98|%L|>`Ad~}Cs z-D$E>e>6$T5WN_7}pW<*KJ+`@(- z@{%skwJ$0f97zSj zkFh_-TfU$VeM2oxj;s17rjM zDqB4m5oYn=2QNYMOyE)?KWAoA;8%NZBmyey>hdgyQvfRKIc;UZZ?A&|w#84)fl{k0 z%QnlDX9b7L2I&?fl_iQ4#tj415K10<#ct?FtRY=&7{O6YaXWfT_1^NP*8jZ zWSEbfCdL_IdAb~V%=M>c=8JEEHl7N3?IkZD3@v|lDtq?|UsIZ~O7XIfS}&9q;oD5l zos?6ou048`Zqt|bsZKAIVI*@#lqC#YG%~o-hHh(sj!M6t0U5pFxN1?-UNfGMs(nKD z`C%xlgjh@Vv2o3tfl>R({AO6VvB+5=Gkx>0@#KhOi{23-G^hT# zQ#9q!`@rLPDVIfsK&V%c_L{%S3jDM4e-!2T%gORT&o+_#Pf%_8&?B%bZ0KlML(5m* zx}sF&LkyF;*yBe;pL%;R3$9|$&O-vL>Z@OS@$l@elrgdBG{#LhS=w$94E&nI>n9g! zRF`oW*yX6w(9x0b(ye_M2dDix*?#hCo=vB=HGq!i)P5~n^x~#*Ja(F(WM<-zb_7Qd zzDpL5Y-vfY#N>I2J}|&A)|`74WAK}G$ouoe@Obvd5mJR?A}Ft?nz zBwavVjay95oi-o*ApiH#Ou`79Q=C&?X!{TTcj4<_A6s8MDs@O5y!z&I`Oc8vUu7ov zDMlfl_im7l+Gg=}^E^wz~au)y8Ey`hOZU##8|KG&j2yPY3-UE9GN9hBw-mZz14s=4{X&&1TP2 zW>~GGd|6KO_sDc10A5lb8Mec(xn>hhh|~P?jny9rS%`EO7oI5pPW+D%>eiy}83XVd(8e6IXY1QXvTQv`V}4wXXS|r2@{HhE?YPK9C7jKC2mGlIo#(V_1HAgeya41r?{d(pvcjq-Z zS;(B0hW>cqsijsl(A7QF;HR6bsueX=r5s#T&iGn%C4}2c;l7_S2I! zld?Qp#TdbH-sDVQ5v=|xs*3TqxI*S;e zon2(*GnY+AlJW#iQ7<5m-z7k*HeeJt$K)?x0?0nYb7TefQ~Qp95YOjGoDCG%#Y*i+ zB2St93I#%flbQ6xb;_&Ubs22xl#{2~iv!;mXJx5ep)#x?`8ib^lDBInqMM#<561Jl z%o&1+QMX;65M?R`24V%K?x^%G^5tfCt%EH&ImX@d7KJqZRWk<^3Mk01d$zXUPUcw^ z!y*xg?pf_r2&&8fRKpr^d+`dWYuQc!nnVjnpy%NVo#$--cpTKpVHASCdrWDzlDlwL z(@>K?k`4^anc)PX^!0=W(u;0V*U!y%RzX~c+L-~T@O{FTVBU^$Dohy4co~V%fxt<+ z_{l^hUhw{<3+P{mn&8_KIwT!&T)1RpUkBteG~y3VNW1e_xgPBmGxH<~hIP<)ozi@gxd$9*dgP;niiHmidJG zqI@2_$SN9DJhNl0?x@0#1d>%$GC!|Ih(BZqxIJ6)vtl(Uhd|GphJ4^Y?Hpc~jc(g% zq8p)xBX;WEk$M_*<Ex4v?4buZ| zxe6B>zqfY9(l1pp~-z|@RQ0hrNqQuhU=cs zL3Terx#0o1h)fdijPqx1wVdO)w`LbR=I=Lv zopQaw){K;TXGsZCM;U!YTc7{piLUxW_C=`u4mK>-6qhAsG{ZX+p( zKsC)~_SAZ?Y;~KNR;||_-0b9red7iX-dw|F7eEbVqrL{WTKe67!xFt|t#O?u@v7vV z?v2=(%{Vf3ErJds^7V8M`ZRULKn9X(w=cWt+x*u*})I>vkA!Msc1YOoW!2 zP-_8F->*;=qyvNKGuKqKhNwEX#6+YXd2KZ^k=X&u{J(_#C(j>n?f1+RfkX3Pu$K@M zwln*?afd!{(hVHdQGE~?yvM#r@zrKYP9Kx_5$5xqRY>##YNyJKyNB{lYHm(d+>VuN_|7)%ZK_ncLiT>|3?XTW?BeB@Dz1dN0qK*UjHp0-3*6K6%^hv319??Fxl+*gG4OaJW{= zQYWhVxMVJVCgUltuID5YSehivW}4zydHt5ixKhPUkAkH<6F3Nx3I z2*FP@H0!T>`z}XUye;EA_7^0{gWCk=IU<-GuyYVTcL1gd-1sZ9OSnGe&aY#KxklaM z@do88ItJaW=X!Ov3~s+}*Y18o>RM-Q)m=Y>Nd#->7o5H=kAPk3y(CP4{m+wdeyG5*h@Yie~c4- ze1wP=XpW!io!*BK4eDRKgrC%3XbabtQT?rn^G~!d@|fm#g&@Yu-QqK9-VpE;%p%k4 z`*@^aYdn;UtK8|UUu)d9v*FreqB<*iJMTU`81|Px-h+uL)svV8_u^*1uiYR(IQrNL zp?)B#%Ie8C^}|IjPgK5^8W|d1j6MU$hXXwO3MSLV{qL}gszHYzhZgZBu*qn+ z;lSI@R3(iI?zRq7U+7TC8#=qUWMs^GI}2Wo(QJq$ena`D|JREzveyv>zkk24dkktt zZJsA{XTJ-^JP-%?aM}pdB3mL#Whk3L7T|y?Yc;wx@YFMTHQWDGoK@BPwlQWe8kMHJ z49T<{NntAvUA6_GhB&9+21kmJbV)8Y=0d9(HH!=VdE-VBSBGK{L1S;K_%yXJ6%S~0 z&QY~HJj<1nsIv!;>2HsI1%+S07b*AlN;&Kevbidgu67Xb(o}5x%X;6XSZ(AKWOz$p zcT%WpmCw_kM?K|y~?w?QhzmlQnuGFmtSwsJl4!TqsrN==6G$6 zSNtyqW4E}?+}h^o$W}t5S2uJCbI{A#M$NBIJ8whrKto<{EX*m?DXRh3w7NfIx*N2O zXs*VpedMbrOx1i{4Ps|N@=Z=&U9S0tfZlN;hW4y>DK#NN!TCSFCSg^b(( zcA2=@*_aKv23Twok*ZFGVon-HN1X92tggHUkQ8;pq{0x&B#BFWWu52G*QRpp(20!{ zFSvXWcpFJghbwt)t>Cp2ukts*6Va~PiOxu2#9yeMIWUs%1-coMiuAw5>96k6DziR~ zjep1XsC~4AkfhjhzHsWm{OYoIdZX7@Na|KU8fv=|@$V;tRG??w$7$_{vHM!eT)5&W zMHE)JfrZ)f3b4B$Y>etjD{l+AAU!mVbM9^e&OlDBR$hACtfm{nN|KV=)`Q&oIQh1D z{a^zalBfyAuIu2zt6h#->R7yZslW`;3wvSzH!A;+JoXd)3H~N@e4TA2m(K~AybZbL zNkOcFCI*f{*?7daTegcA#8ei9b2@>GWf_R)WocZ2mI!F{*Hf7odpsf{39J_a1A@;W zAFlX^5v!=8%pCNK9xB~ro9d{=JNTA)X^P`127HpOd3Z`0|1WLb)`@sI|^f04w z_fpjR!db!|5v*vdiPt@rEq%S-V1+{_xKr3^KJd@OL=Leddj}ka=DAytt7iwvP z+EdSS3^#Bb1)Y#$^96>BT54Ao*;zkLFLW08p?B}u=ho{T^yrGIz8Iw=UkD+(#HSjx zXJ3T8^}UO`h7A@XX@4;k$Z3zPN@=wEPBO(YnQg|uPpkc~#h8AI9^K-IK;!!`xILVE z5cw;iY|*`kvUG!o!%AK=NHmaHL74s( zYM5kGY1Bwnp;vM6@$qlq7@=Y<>~^Z3&8m4N5eo$j3nG`sAwRB9@j>lg>HHS4U7b`z z}J{dNrv&|4D`wZ8x-G`XH@80Q*U!4KkQiT!b=7AhDWfirXQe#?QHP~`XCLTEl3niNps+zq#N%g93;cda z?&9+cZIqcih9PR&&Y>dlmS9v*JOop1vFat3lTwLRMV%@eMC3_!{uhkjZ}nngx+!{V zBO?q@wHuYK{=G_H!^)Y$amZ@D`@RL`VH`NfFFkZv(y^b?lY41cH;%;XiT=@*N~O;m zF=AyrG7;&NZjuvasTf{i=I`s(z^>xpGAR-tX%%V z<9f%R^M$E5lVfAq)?sPudhFq~Y;?i1fIHpm*iQw-{I`hH`ddov3e-wI#1r!Co`n3v ze;P1;RDRJX!Fl3k@ItIp^hX9X zKb<06`AfWExUz!Yzg38S-30E>5v}`eDZ+}r(|yhNY&bA&l|0|JC5H$NQV|NK*Gdue zFOq}0ydC_ z+7Qwi7vqxTc`WO(Gyh2-i5;Sq_?5MQ9_OBVyo#ikGJSnxlf!}aLaMKd2gt$6A(BM* z${6Sd2nFTk`Cgj3qrF$Ib-S<{H&FVsXbrl=4pLyxM&rQS=K`{o2CIc+*v}EUX zJ7mBneN@{El|>hqKu^Kfrvz-DMCCA;xUa^1=}Xj^)K=UM}1CcS?p!#sa5Unsn!49&}2S!wDR<#Ee(P6UPMHf0Q=UYam!2G z2U7o!1x3%?crew>SQQlVrm89gEMl?Mxp)uAgd9n-?#99&J&=0x=<(wsace`tkkt>J zHzy|YI#1b^x7Rkr+#3yRX3lyJ?&EZ&HtnHAyY^K%Bc5S^o)OVuwz%J91)Ph0< zkRvaVM)Zri&+c+o)0&={vx7Fx%svAaAY*Q$!lGdRElJZ+=BrrZ^F`8z*9qi&zH!^E zItsUHI5Ahl$FkQ;YtDR{T(_ep)O3sqOeUrh6Ty9PZGyb?b7izA4_hq;XD5KNhh)Xw zWu}}=R>f}Y8}r`6=i(k4DgW7rJVaV)HV$Bm@>7>ST)eFbGI|w{4J(} zjB~%kXp>vu-*f7L%cp2h@ue6~={uzh{YfaE%@EN*(}bJ=!E?0Dz2C7ZIp~N2QYx-X z2DU7pUhH|7YCJn4YfB_#1Pv=?hP$jeS+tv5K|lluWN+%_wWIpX9}h`c%18bxWMCo?>UTV1szZZWHpPw zj46jF>;?1K1uSO~aJs=Sh>KtiHBg2O4I`CvtT+{Ea)H|Hvi^FUi*mcGOzzDXvOZa0 zEcDt|o`)&Z9}UD-c}?;?ykr@z##9FUUE;4DCt5|eDl(V+hRG;aWazgo8p&?*-pu&yrE{Xjfu8kXp z(ep%N`2NSnq^9+Cj~>^050}?CT$FtF_nwH$SrzaG+&ywwXzrZf79LmfLbRAPt>T8e zUBl_%sdePQW9ZqggiBILSD|Va@J-iDtNM%PND|j3R3|Q#H_mypWm2LP1{g`R`-LpsOem1wjBQKv~Hw_?YJoYN3CJf!TsKC7X4jl z_n^efCafon^JY_6jIb)-#uq(3%bRq=NlWA%bpZvVY1u@y?%}_W^qg+Xo;?lUDSh$l zbLXuN9Y<6qkZ&btL%8s?&mb@HL*&+ln?rK3(V9Fjivv^67><^Tat85cRe!NA*`mGD z_9{gc-YP6@_${UEkMW-RsHzE#ENB83sO#qNtO){Fw7oVRCt2w zhM&M9gg&z9H;rTq4`~qLa%&5UK4+l`Akx=uB6L}(vx{!#x{W5DrL=N)-M(S4Aa9jftS{t&_FJN z&h$mM1qv^8;WyveLPvM=XqC^{92_~0f$tlq1msPp7J+Ttn)IAtnuF6B*8e~vfI6hG z)T`sPtuhZIJ&7`YcYBl)kg{wfyKh@JN2~sH9S9UbZkcw5$qWY$KSU1~!g6MYlf;lM!&1QNqJB)E=1mjB%cY=oo2^^vD25plr9v1(xGt_RQG>Wnl&FJNon$nlLeO9OV13d}6_`c}0`@{*3hP z*o-~GV9QAeGL9Vgu+_yW+P0f1wP|S06|*V_&mf#gIU+K^S1vFYeE#8PN@xfUQ-E9g zR#14tNl%_Ruwb-u)Al9dcj3um8d%RZO!xa*g+z&bPOd{2uMWl)x%KOO+v0}thZ>RA zm+ZcGM28jA-Q-QBP##~D*Ts%YlY;a$$i=0qT2c1%_$`lDlrcvX$hZmR5&|K<>ta9c zdw5;6@{|wqyEk(;cYA?#VQw*Hcy)y=YGA1K&ks?zrLpj+gRP+M_34>4SmW4#VWR$r zMEQ{ZbFJ2}nYR95DP)g}$#bi;tk9@{;*tamiu5_Ka9}sbbx!>mL)|;oKJLMSLr92d zHi)_&`W`(g+Si43<0d{^?YdoIID)HJ$2|C(Q(e zS=#{dR+IMb{Ny=<025%ZA((dOxYhB4dD}}%*-=~Nq{V*3sVm+q1$IbQBxbLG>2W+^ zw5{9MCz$VTzfyU%dqN9#N_`jnRjj;s46dl7~AQ3 zC&4VCH=_(0I;{+dLrPR$VgY1(A|w(n7!NF(vXF74|E*5MO4r;0u{e=PhG0C)*YuSH zcSH@vmo|$pAwm7h?{zIG{{c9_VuV zObDsf)0K`9`CJ@~#{-5*Kez|^{1R$cIsE*WSvWS}Iq8c#r)ISft(RV#)fuZh2;+fr zf7fId{rYd!TJOzHs%4JIAeLm{c6ZdqUckFR%2B?61LxvA?{8~e!F~MQX$1( zzJrI_Q7*1}lPNwm$Su@rrcDw%?mwcCdl*F2m0k$7=3<}yXz6|SJ;&yA7hl0VnNT^Xo!u^HvmehvMRny*Mt%Es1UN5d_N$i?%{+f@dfA6C}x;veqKN z=%w#&Ec#V)17bvT6?8&ehoXC9BUhieLTYU$`BgdVo|yb1kb))#roKAql(4GHgiN;f>bSd0 zW_eLpb#F7qNR;ds+dC~4R4c8Vig9gDet&ANJ9W7kn+ns=#0wDRp1}a>*x#C-G(?XR zcVGhL7A(3jCMN*hpPOq|0CM05yjrU|G9pSZUT}5T8^8S@#hIh!( zjhQkU&Jsvfsj6R;o@V|x;mf793Q5aa&?=jCh1rMYX%f~_LpwiKPG7|2-f_90>CLNo zkMZ?9HBYU#3#;RT0-kvjEB@Wk8S|w)&&fPF zRZMy=r3KmmEhhP2N(|}rYC2!!63Ql0OT0uYuPP^aMr=EQr;8*e`be&d}ohHjvV|rH-%YU$S8fTlPF6;EcJ3<@5~6@H)I=Ps$*L11~yI_IKFCXHP+BxgM6l+4G`DZxc{sEuE% zg^ua`_@t!bR9{60sc{rlh1^a^hebt2&pM9QsHNQzLw%LA_yJ?&6cqVihQo5Tkr!lJ zTTpe2ZUO<&6uwPok75^2Zy6qFE=Q27t!V#S^lV*S4_yJZukcpKmG0@M)B+;TDKpicf6)Jo{zWp=1({piwX{pYRhbzJ< zt7HNE^TmvWcDDK4@KwKh!IW8M^zF+GKRuzVx$iP{W9$3UM|tx2TEi~%35I@?)8dcV6ejT4wPM;N+sz6WEHh}=Ejz2!R(h1Mnx z@djvB=t^(&M5)bwAA1{xZJ`qpdobK@(K;h6JQgc5X0s)1;JH2*YiH7vG;sU=h zaDHbIjMO764?uyFuJI6S`7w%OIZ}J4UWR-Dh&aDj4yGHAq$8xugVwJ<{9u zqwD>B2BaV$soV1f7(cfG?8t40Q8@E!*Q}A>?dZ;>a>Vgb0@l`-#K41t$*znf16irt zMDAIyRkkcp+nmVdj|txF=N^Y?5~MtfIM>}hpBLO%qKB^?GUO}`z@;8;m%xlG$fbAr zcI4ji-Uq2;)b`z5<2I+?K8tj9>Y&84vrR-`37p90c<CluGe z`fTmrHnmsdJkC~YQ?imZk9Sw+mhdLk2c^DXkWqN8g+K^a=|ucD5S1WaJvd`tq$VPAPqT!OF%neHkRf(;P~{(J?D_UpD{LgBxnUL7 zkvMZ>7Qaqx3RD3+t@`+VVr#Q$=L`dY+Q`U_+5B027wCddPHNkWGhblqPHK1Yctj=Q z#X$=k>aRwzo0?p+RqJ6p`)0qAa`gjGqBmt2ewN^!Rn8NWzK$(>+-f07)JC0k#q!aD zgA2ILZ`8;^v#7dm-=6!3o@H1i%1=00V%^53()B*g7D zqQ!T2FOFwdU5EyNy7T|&Kcfdr^I-eXn{CvJ`UL0)CC3SZT zfoM5VBly0}ILU{L_f?(d%-jS*K$#!PLA{|q!;Q$Ws-^iTB3pK)+sg(ERveRB2nSvO zEIw%YBs-8meDZC}@{Ge=F_V=Utuh@)IjA(Jr8in9a~x?(=GCyp2Z_0bEVVv>pX7{& zVUbC`xW+Ny26v49nA_0*cPIz!j~;Z%9i#Jnt?DB#*#lH9M}hQ3(v$O|Q@D{^(l zFl_M+I&))FyIOnbE(d${>EryPH_L7UTmTM%eLGkI8HXz_4rTlp>a`me{ItH`s~T#m z(1CNLK8dXc2tyRJIkwZddsEqEdzwLQpfp~W*!sgtqDOJL_gV&(73@Xpe*DnLA-FR7 zMJ0N52+~mFF-(tvc|2VHMSMjv&YMl8sfo!j#{!e>4mBM;(pYzXH%LbrdAR z+3GCt(3$9I0AA|k;&H38)re8;q?~aVj%F&4U9s86?tU3IlJ^az2C1-hWd zhel9<1m%3vA>NK07f_ca*=g!u_)bD$T~xhu&*T$KW$GPn9TRU_IN0Eg%D?C7D6{+e z_Vym$LFh;A9^m7c2(@_p*qf%NH$MGRN9z-^ZZkA<9)B5OX@Dy2b$`Q#)NTZ(+9Ixp zuhVyb*a2~vW98E{mutA$#SQzyD*f46hH(jG{1#%VNK$+)91wtvOZJ&7@1;2WutEb! z0yeY1nXW+#TzpKaz*=Y`t2;+SZuy`#Lc^K1EO*$-ZARvdYi-93G>` zK4Si33Eac*ru$SP8B_~CXFS%x)`QV}s<0f%wuxR*J|H&P`6fCAbc^XhOsHv@a8?*? z7ZQC#Z`5ZPK#(j6Wpdix@5U-J2Yeke@7_UTeEf^pLNHz4*oU@px$)jJx$DSQ9~ig^ z^x$(jtA$q;B-U6&i9O?8T-9HwqKl_kZYj#P>xm>+yi2gN3G3tl?E4M$DE%&_qA1yo z{@nEdj*FN3&K`ro4+gc%z3NC8{GQ*xqNsO`G;`97(%{;FL#^$lx5UveV>Ab~OJl2R zK93_uM%14#B)cHiJOHQwLrUs4++}Gw0eT1Q%)CnmvQ*F|3pGN-5HIq>7P6Oo#qz|> z%E*Dz>9=vlHAs)}Xkg_B2vcNfIdJFyaP}2YRc&3{lmbd4(j`(#NOwttbV-+VDczxj zfRvPUcQ+hLY3c5g?rsj}{2T9k?zTfx#V>lf9oN?G|@3rQdYsNF5iTDpddB7v6?P|Bmbc&~`7^6CHpv5T!1)T;&#) z228!dl?{}Cji@65bDvD7Rw?!GD&!~9EwQ&hjj;)$^Zp|MBbfXGdPJZRovTO*QndF& zBaw1KbOk!&AObr+0|+ehvYkATAJm z9@e?olb@%`72XSmftACUtmYF%O=$Z81GGMsC1kfbZ)3&7zV%ldLcfM4)zff;&{o%U zj=1Mi!_TpS>?GcOp3{;TF9wHKLA9R%uKZ}YvK z{Y6v+)x!BjRCB?A2U1^ux=#w0t9;E0H$$YiH|eEXG&%GBZ#VqMYLQe+;7KwqT@2a( z0j%^J&Bm`EUnIf2{Q4#I5&YlLhkt;?|M))&(FaKEE9Qg}Z(M~Co^XJQYU33j`>w-TB6_qlXU~bzPpLy3kXIqh$M| zF4I1J>I;6RqNuquRUc*yJ&07Xc=K1Hz7Tn|L@k!27Rq0B(didV>oUWj9U17fASOe= zk$sHIFi2?Qm0KWuAK?=g&F%&EGPKe(&m5-Z+!g4bn&lz@d6EyrDSv(56lxfFjFg4; z*JO88TCMEj9~3j&DZJsg zo~+slgsoBsn&YjyYw_A*ys6JpcIk?v@#dg_?XSF<4Qpf?{fs?QTtp=IG-9k^W;6}v zj~5#Ox*Huo-WsmM1|r1L&0tXCg9pKtV|ROSeKkRzgj{V_NVm8AO9=mznMBILQvFt} z1Tity9C4EPm%0OqqGpIJ(w5t((Ln7(cn7I?7;(-AM0AC3`^^RUMk)M;K$lI3CqqbV zZ0x$C8!OQDyw(BfWNR#GYqYqCVUi9$9N>?Y@NTBprZqxZ!#-$(u;f#oH7mT|&{aU9 z(1KftMaSJN zFc{7u&B0uB7~pBl)v^2(pYrya^J+#w=iC*E=*({fmGUuIJjHWY!Q*^qN?a|dIEqs| zk}4!m-yOcHZ>>*L+A>(`cHkGmf`Z=7OLKW~+*)UwBlb%xW)=P&oH*VvXI}RvCFO@$ z;U-FSb22(Z6#xp<(QJn&D1xsjf_;9S#)c$s+WTZgUWZ*}k@HQezbpF1r#|P#?$$M{ zc_Ztl9n`u*6>@wpcjozCya)%(9Qm~fY{wZlY5nK~>#f?ll8ryP0PGmGk7}g=vm%ov z%h!BktRP_2(C$c<)~(!C$(K zxAP&!`vMu@BHWd3NQnlU@73v^EYr}C^7oR@Hl&q` z|75=a%&B1O{x*f`WBVN;_)0H9MnfZC98bF8{6uu@Qzl}L?B@e64=>@L)Bj1_5$t98VYt^WA&752t{6#z*)Z3*QTNBVqvk-bQ+TC8EBms!63 z46?oqg^d7q5U+TuQm11Spf~1_3kS4kX|`8rxxaX}S-Wkwe1i`{tpkD#K`P^8Aa~`E zx2_vL*T8}BTCG3s)@VoE+8(#b)Qv4J&%?c^L=Cisz;T%$FH%al%@GZ>vhZJhvONxJ z4K|xWiqqu;c@1l~t-Eh412J2W)3y}l=AaA{x9NOg-gGpoAc>nPv#9uXBmP)efp}nG z(FTy+FHe3yJG4-EV{+eX`(9l+l&8`{)KDyJ6!n`wnWbPkfG*Z{k&FXkPPrbHx5gLs z+56LP0V#u*!7kI!lvaKMqzT71{h2jxuHFTGlOvp~CGsp%8z4EEM?NZ(e&KPp>XbfdY+((TdJFJz?dsnG(B_Tb80Xt~1WU%Vo4v%|Z<2ZAFk{#~^J9G=C6?4Gt2%LY znYz4kj3kz@qqD$HtI2(8v&NpUSQ#1H6gn{iL4W-cR~e9_T1hgV>q=gm!%N8oV09A* zdU__bK7|WHBv8I z^;;(8MKUvj(zIR0s19EzPHumVl;eGtZ&khXebLV(XY-SQ?6VGrLUGj?N`!ZomX$KP zZuia?oN`zpG|I))JFu(WV+H0T`6@wt%x2eh1w{o!n6w>7FTWPd*&a2;(K2ae1jn?|XM^N4%cv*aK)Amhxb4yjZ6!W{V5_M2v-#D;wbDBAIOCzFL0EqM# z%b19Fue-(en^y!0zD4h+3@yvC6g{%D?aya+V_LF%c-I`h;P!#ZcnCh)w%Ke7bW&2G z%w~taxR`EUVCR1NdrH+_Lb_2bn~;3`i0q$4G4VF+#m=Gf!P0O5p})UMR#y8 zirZYssZV4u>SXwN_$(hnT@x?71a3Wz0j$@}W`qDP?bf?CDznXj@ZOXBw@Do!l0FbGn3~9|t6?=8;a4vF@L3 zOE%)5V-WQlfhT{Qw1P$1TVH`pc<&+Nx{>NHN67J~NCL<4L=_=(X&9Dj+YyGQnpw1d zYyGXghpXF{S+QBRn)$m z58RhA^Zh(c)lD^1t@&~ZNXCEuV2%*m-9YDTdf5Io}qVuG1cYR>+>m?tSmhfZ8tJAUs}!iEG;&%OVkG%yA0jD z@Zte{ZRjx

a$5<{-c~mx_XPvNxxcv|v-B%c(x_R9lcIBT3p5;C zc<1&`rtpZ$MpObw`YHf+SAM=awcPMn!Ne=Igb?;#*_})H4pL*Kc4snqM}$dD#DLkw z%6A!*Q6&_p4BF+qbXHU4e!{}&Za11Wmd}Evk8CU5&ULozMriymU2!;(XDo_XWR z+yGQ>a}hB`Qxy-qGyo}~w9&Vn*?71Ujibeon&d{;fj-S%pgKd4w}wkY?rm!~_Cf>z zR3@8OdPqf9$f}2qy`YSWa9{>OXLp;aPg9k%M31wh9A7B)h2e2~f1bu6oNhQP;rKW) z5Xc95*UfLG9+tD$oCtx$xr6f_DnqmsLb)Q~KEU~Xq`%{=UC_ZQp$L9KgOYU#u%B;E z`MI9%2wCcf-Zg;9T#ylQT0%u_9*F(2miNp=Urx^5?hz0!X3^8ISx*v^h+ zfZ_V;dI5UaOKX4Rx08d?&#un5DcRJU^(&$p6&4ZgEus$iEqB6zo6DCWqiigQGc5i@ z?M0OSiDd-+3(MG+rp3&RHnPW;hsHhI+wG?=tLzH`IcQgn~$MH=GG@4$)i$yxEi=SW+skvMW6>(zjou;UhKDamM@=6#_4uX;@IYY)-^VKz99`;sBZ zW>C-p2WZ}7qS4sT`@tVD`&aUhj~S(>G-$w$gKN9`+wAjEHq)79$^os^&QHuj9C(@d zI{?nI+}8+L1RV;eACXixqlkHu6d_lq+pH#gaG;xNCUZAW=V?xIp&JwuR_|ikQwy8{ zv>w&s3jC7%HL#V^<{O^_)t0`2l}7_AuomLla2e6n#m>}-fhYUsQ%6SWK9nq{9c$|it**R70&fXUC!8h_9AQ< zHki71H~xu0d~7D*d3t#!_fUssH6O?^Jb!1dUatEmhsoDS1b-9~vH+;dp(1T8RcXZZ z{3!frvkiLtK?denF>okP0nNYVP!|B#3hAa&LSW6I@A5jq#$*HnkDn!Dq~xW2xFN6e z9p$EPa84UCZdVV2PF)CQ!g!T+ib@`iH-AoP`WljWcIC0VrNY&+06oo);-fWP&moLq zJ5D^GbqGj|56O-xd2P6SnqB$U;-|(%Cy`P^6?7gbGg%uiiqEs)ib@tj4x+}uJj-%n zkxc7LGYnA!ft0Y>E zi6h5%l7@&2_PW+vDr zx?!9hi7qHWaj^kDhCeowBs zi$zq!i_#^;Zw>hX;0RBLD5btBo-1IOg-(a>0-P=5cD5TkC3c9Kxf2u~5kZ?kU1dSB zT8_~>s9TT|ag#$FU}SP(aa~&h4I|-W2zXlw1zOY?B@6=&_Kt3AMtb_23Gn-uvPJ+&}f+OXf;%MU?lEiE+=UX9Et7saf;Ga-O`tOv6+ zQjZ&ahy5OQ0ysB#h)zkkT8{LXt}E*Va*tcd4q+%Xm|)6so1{P%%(Bd;Q{oU08KhTMw-?eBDENh-)=B z2L;@?K=NFpp2v#g5BlOYS^`XacE2~eIn>Y^XQY)TB)9gjtW1t3s1MeJ?SgmkMe)Kl z2oXvrP$LX*Z1B$%Ypk_*aCo%WdLhrvN{6pfcwMA+Nz_V`k8U2OCRUh?fv;q~Z^a0I z`-s7rca6T0{cQi5u_8=BM=RJE**3)OY$y7+rV9r~w~_bN#^9>$UBl)d4C1{2)=`5T{8@V@{^iZ^}arfho4{r|B+oiL1KD{W_m2)+p{xF)B zw93nP^-dxNP?VxEJ1#b_%gn0^z4qcdY1u)cy${LrWTah}hVo7(g(F2HW_6l9wGW$0 zW!6%vSj5J{$w2$_Gn+vC*NCSAA>+#8^sNaLe|6xvz8)Ia_#z*rNF%xrcRg9sE}5ua z6?Qd7jRwd-YR>5Fu+w5|w5;(pL6J_4`X8G9&(N;m*H~nPi=(B|-!lN`$d!uokX1QJ zGayUf&1;*UNo74of91ecWjg-}XeN*=_U38hQO-IIqd*GKrtg)IkB@CHDj~=sJWw+tZS2K=U*0RExqKCUmM$`2V)r>1gf zw@1yaVii{fSBVI-e7o>iTr;ogwB!XvMMbwhECb)t4If1p_~y=(_XAP2AT*heAxI=H zrVq3m9YcU#6|ZImI5}Te4}7ORlO=m-{Xl>L9CGX9mX$F*O0QJwly37Ct2b56f`}qeM)m0L68Q`G;xMEL6 zI^{6Lq07m#DWv}Z0+>~{EP+CjGG#(8A%VtA#;v!{F6NfBCD`SC zkD8#&*B6Fi)QM;$<-WMe4-bBG_rAdJdS4v$w-4Vno`~Vpsb%xgx1_du$Tc3{l>2&W ztV}1YQihmmpRe(dem>hZ^L(4Z268s-J`74wTdlXyYA-oFNa)w8dP@TjN2d1x zmYu*2sO{_)HoH!%=4|`mK)_`0O?L&L3IHtDEdryMX5Bf0Q%elMV3;?McgN7{N?Oh? z(s&%tX)W1RN&s2MK&`bmY<^ zJS^458w0L@UI*$%K~THn2OF(n{M77VOi4U}w^QJI0>Mj)H4ky2`PDx>a@d->x_UDK zI(H+80X&l37qdSSh^_8;y54fs0A)VD*q*5`&;mFoq%%=|v#*i_vq<<{ z51=A{VjC>yV7kSAr+l+Uh6|*Rm$!eVy?Ml|=JL?lYfFebS%t{3iH=OUh~Q-scV*TV zCT5#IHT5I-=yGR^TDoz^=Y8Mw{Wu$WZ>luSrT~JfC@$DT?fQRZ=jW1BT8*AkRi|nw zDC7^_b6Z$EAiF-RKcn&h!ouc>gW>tl(1$O5P9#^!uSh6QM1X^Q1XN|3EO>ajOe4Z1 zrr#Q&Oj#%jz#?SNIfe&OZsy_^v?0d3UgLG@k^Wmv$H&Jxy}hmMBrJ*Qu_-B}r#s^j z=A$1o-P;qyj?RclPG?VdBE#h0ym43}<${;sLw%olTKALT8%@CA5DODHBk3f0H+kI&6jL+3 zhx7O=M|Ug3sl7-ap__@9H-##}Yxz1k<;)IOQ%%p(3&if<33LDnU8+*I1=uAymuxWj zJ=Ov%quksJj-U1!whvHOFW~@KkCaAEzJNUdl$5q76@&N#m_xC=K4p631$-1(jp!X* zAa0!dVY3D?NjfL(k{8(9V7w~DjRH`2!Ip70B|42_&nGy~RF@^vu&L#+y=GJ8*-4goUz~O8V0@%7; z)UfZ4Rr62j{yRTdltx&DZHqml8vlE9^FRN%hQ^1O$4SB7p18ZO(LNaKYx$k!hC#5t z&AHc&g~1g5%wONpV}G7a?%rR6#t7Z@a9;m3!2fzf;G$LzhFovfBp~_Dll?jRfBbS0 z2f^A5olJp^g66Ak7#Z})sJqdAih_r_v|M29W1%(6+4miy1m;J-4)s4@dsiTwjHCCT z9Yr`=s4`TkfA{%-Xm(OtZ`IvL<7_+K%6bZ+WfyKd>ee;u2m7(F()=Y1|GNtlq}gEr zl@7C-NIOM{=yr(5<^F>5DQmj7H%vEogs2@ZcqeKid^Wi5EL$Wl5<$_)rfTMB(*z<2 zM8C>3177~KApYanwKzy$VML~S>K%8pk!{uC{=8An+$N2}Bl-xk- zx(*l{K(y5WX%$kBGt|R?kya(@;So6j+I-$>VmV$7QwXj}x;E=k8;rQc;R{qHmGOaUukqufpC5Px=&;TR&|TO2~b zmU$`An_jFv9sHzZ5>k7>kte=A9tgnDQHV#yALnFcNlt0{t_2cHy3f0u^VN*SGrM5P zG}&PBUAD2-bPE37Qun`2*Z~zFxbNQC6lyfaXY*ZFvWk3RJ|*Y&1lJO+_CX=i-Sbc0 z7#mBe08QAR8d>OHl%|!NUIs-g`u~r@`RflB=Wbn#70BgTJwOf8nK6=_vHEx^sWzC?V8b~pogmtH?WLj%;aJGbo$Qr{H>ak|N{WR72p6EL@fY~)jp zqRtljlWl6|gwJuezclb=wUzBSGNhH-1+b6SMHEUnGEllE#hDna+`3o8}BPUANY3l6(JAi~arW z79|0pWD2xy^+#Qm0OAADgwu>(Hk44v=%+0KjIRJ z$hWFfyqJXvyb^hwWKXZ&0q8S>0b0x1r5tDYJWTZ+QPBxZ{QtInev!D_pB=n_#q<6G zQ|sA?XFgt;$E~QZPfo8}H}9*^M{KYMzBdf>rgtL(h^7>2R4G$8IPMbcPDY!vxHz7f zY1G-`+-wWj3<0E5mRqVS559Q56ejUft^b^qSL0D^ z?e0(!g{X*cffYL~iDEYIi@xj|;+l}m)KtL)+y9H!_s+S6a3QqpHy(qCR+F3-V#_&@ zH8P?yGab3do)iQqL_bp*Esu&K260DR0<1J5;CJCVaS*8K+JtUy6@@t3`7?M7#Ao%& ziKEpamdyt3QnVI+`|FUxzLx-2=C?`uj~{)QDfB?F5`Z<53*?L+;k}-U5^dnUVN>cj z93?A(oXX{|KO{+MEp)$XuSt&YKB&Du%Tf$}+?NOFa!}b`f^%#y6tu!YTmQszp-hdv z1P6!GNEg$#KRH@@bD@OvmhUX?Jo5lZCh>CdcHDiidW4{$;=%Z;ZPT%78OLn}q&qgs z9ob#X-1KgV%sy|0;u$mV*IcD+&k&TtIB|Ji*w>>S>uZ&RPp8($*-xGlD~ zCgpj*)~lP_Jy-9bR0B3yD|At;ete7EfS$+3=Gv{xJ|ZHr)TTcMU{8u?I6neh1cr2V zAdw&<9caJRwwaq$kikhs(qje<0}i^-l0xF`U#GD46sc4Q>J9N28vv-+q!CBLW?eB# z4gTY-=jtK6VuH~xAq6j|N^IieR~oDmtfpN^Dy-PeATNs#MasQWnov(UQ$-j709f}2-g)6L#Q<1TP+qEUIl;d+(VnQIZ-KPrDI)G#b#5et|q@ywU}4}c>} zp!vv2SBroA*KEt%U<^HB2mov=Dn84?O-|1Tc$c8ZNnPB?a%44KOx{L!5@>${GXXn6 z`4ya}*w|xzU2B}>FyQ>(=GA|dd<2t4+{+qN)_Y|$-yoXwoR02OzCXf{Hg-o(T{C!# z2iR&%6o`?{&CMFDPV??ptq)5k@w`M-(MKH1B5Y<$X@_yz#)5}dwZ9`#pr~Ed&cuY6 zLLdViW^G@1@o0CL(4;< zRqr_$XDnMal@cSXMB@Iwnu@yTOop&i`j4RFU)GkgJ=`?(v=R!hdg37D^&hvx0UMk@ ziXf0OOFNPn=sI9yVBeNB#S^b+z7~sVK3I~jG^kn*r!7y5MV@im$=c>XB?EpdiAumK z&o*0aRWB?P92E3MJ7N5>AqG$q>omtElu#8>A(s+kl*CgRQH~)NipL<5Q=L%r8inEW z=V`7nan|m7d&!Rg%f@6yAl+LfPN%cP9hW_@%in_hWMq(aY$*IyOML15|Ka)J;GY-p zsupT3TWHyDBNwRpd0s#?)!A(zaQUi51ao})g>!NNnIco;gnq!@%{2$Q0ITNL0L807 zw43hIDvr+8V0!rxp|<#1T;KVEhb#bbF7Hh)b*);(yX;(mX8WgL?m|wMMn-|g2@wwF zJ^D_?T6O8w01^O~@9f}BP6(Id&Mf8n#nK3R;Do$}>tP-B#)O~1U|YRSh1qn08#Mv1 zb2yzqq@B?3@j6_|B$qq#fAkDf3XHh4 z_uO;C%2UYjpFVjdizYf&n75l9xejn;FhVaWZ;d^`M39;<4?Q|MqG4rKwgL)*6@r3; zM^0(!kDHz5GX!|AE2lr9DqT`oAs?qljYFi;kolyX_b}mSRX#?e|yLy-L@R?+La_}WAzvzsw7 zRWAVQBT$^pmxpLJT00z~+E%;Z(d>PJt-|tNER0ANb(v6JLIP>^nT3SxyqExEweNRK zkKbTrcNXW@gZK8@r~C;Fe0V}8#giw>c?vHn!pg!ziwk^FXp=h)Bb}WW0V32u0kL86 z6c58px4JXFNV{+JA0lm42qOPZF7cP<`t9O^*GF?2W@Uh}IsM^}Z*JEcWy>Tpn|A9^ z5p{KHs}5bD$DR!SgTGJtfBWXEI$TX9Y*z!R*SnZV+FfRJQfdgGc- zFA<92|Lv~;6bK(+BS-Ps_5K$V>+dcB3|uzWfiu#V!9jT?oDRJ^2HDSFCzFQ*;Osab zrf0uc6?YFPZ|_dzukar`F%9AV>!SY6Vm+V(9@#mDQS46ttiS#2cj15y!v;cI|3Aa| zzzm?->}_bW7s?}Q9W2Y8gn2a@?JeS=BA{THE)?T<9Lz&UF(KDinkP52DJY-(i+`IC zoanE$IS?@+p>K|30x3zN&7Of!qumyvzth_MF-6|`a5x<>PXQ(nfFm-Kp;lEn>W7~p z491H{LDRAPql-@;kvQy3Ki#`)70de|aWX>|DV0%6bbM6dRDKJJ{Uw0U2w;7^^Gw}P zuKttZ^AGZMD`Gf450+uuq-_3O0rA&81;1`16{;VwU0$oHo<1ldk+gC}IpQWx`=^rm zpWz01=SW8M-`PH`{yPjut28>ok zBrpw#8g&DmYJf!O@T`l#aIyy?5n9iUfuZ3>i{Har1mG>ZBxpHwh9=+mkv7OaP_;-$ z7>F_KmqE}F9m`vCAqMdP?orXeKpJ#wSs$KSR((0&4=4XXqv%o}>S8T3FGlKq;=L=-ivb5!;4K}S z*@Vi3ctRe&wr<|OSb(E-T9Gsz)XjVbFGACCFJrqHs7q;dv5x3}-a!LId$wx!M6~aR zM0UJL_qZiE7iW56R)800`I;`znu=i@U=i)lUNONZP;|rZX)>1j`6;26Az=tD})`mfj zJKTU3IoX~OH}=v7Np%||om#t6{V1C>M088)>gmYYvMyGCOgc5M0Hxrxma1qHUv-~r>ot}-Xr!sb?=q{0{Z&5rT-`;Fuw0!NIxsxD%_ z0ZQ`n7=F(+tpHOm-KOd4Rg-9E^2;x}ZzW!o!6M~YYu69X*fbbVAZ2>gt8&AW%zI7c zR0N(|>}ph*9<4}DZ<76XcmqqpLLDlv{K|vNZRCv4bVjkUrcI;lusqpMn1_AyC@n$( z)R6J&WrD2z<_`XJO2f25q%Ezsp|A6x4>Ek?ARIGoj^td9*nc?bCduW0pbA33ODwF$y)+JH zn^K&iJo`!J6}9Bxx%-R0LL@}&{k&#ZG#Ie~rpJ*^VyxZkJCqmgqJ;m_O-<|8YC*l(O4S&bhMI+|uZ>8MP>DhySIOb9x!Nur$NSSSfjCr}Oh7DgBE;K3EcaXl^Ki%fYeM0CW zGLc6awCcDOwRFIwbuc!;VpONz0>IKYE(K(3EWqFF8m_{;zUTR)js!SG;BfendV$pe zmh<)jeiLMEW@Gy@p-&D15gb4Qa(QpO@bXf;x2$HNfCZwLH0iu%;{`2|ZJcj(``!Rl z(LWqWY!rk#_qBK(^~t|X7f#ZM2+9e2&E~e!r2xQR<77Iksc&S}b%xn|u|-DdZMYPw{ZdR0c%md4(! zd;3rUZMPz(kHzVU%vM*Q2K%&5++h14`=n;4J7K1)h4`%70$!N~qN3$8dU_aa5<4`< z7!3h}?(o6Xgce1B9<|hd6DbZ2>KiZ)NdI}{LIm8-VIQ{-L1Do;Pb3(hkco6d!+eV`-L z8;K!~Z+AU5S?WJFJmuwc(NHshw6trqZ^liv8RH*f#ZVj`ACGY}Fw$&at~Ei*&lpMT zc^f@jQ-ZQQS2|ZV@56fX5)u};d2BaV@1?6lU33d^A3yHiu4n^Fi<}{(`ezv0GXNn< zu2*vt2rUieugAZAlUzNYPcyVDKe8ZNE4W18Vz~}+hmUrT;+BsJzwlEac$M}IwI{)~ zXndB|w#lbQkQyyCyBUzbKnw^rjD-a9RLe;n-Hh2$=S9$MWC)EQfo!kv1VVjJA98X| zCa_8*>Q>#n0$p zk(5ljPN-qAkI|Kr#Do{LCyBy|Id!+wZf5lb<}E3wZlTsJ*f^r!eZ9-E0lbtY&07@L z)z$SB9o-3{5gv+&SdjB6G&C?e2^JEn;t_m@n264YR;|0-%fhxb;1 z8;4$e#*95|hI+p0550namPvKCr*hA!wzgJ&gbFpwAf8pI5!};ouldN9RzVRcY7Cjj z#l?NTb+$7e$Zn${J_i!RM}g>3kLfLRMH>Qb3fE1(n=~%^Wj#GfvI*U0%(6HvZGxO8 zJx^g1)g@NlTU+ZuH!(IotTbNgC$35Xe~FBw7|>~SP0CpfoG~*yq8t8mGyE|@lnjgO^B;Yu7`Jnc~<{K6PXKC|mlXQ%e!~W}v_Da?a2_Vj) zEi(>*_bTxWBeb0O@*(Ac(6ixchi&#Nm%W!#buOCEu+BTtc2!q;;`3-966v#qM>&i* zHE|U$d@0-5Uie~%Iu@ac7hhf{hB|jBe=fCmxMpQh&`h`H_p(LojIz9e$n4GvrrILd zGAn);MY_;SNNW60i*7a}Ix7u*N}2fiv-?8R{@dgjEK#S2AL*YfDZdRM;jNYPNu$pa z9y8F*@ZTHY8e3Y*KM=K?DGRgoTTBcko<1(9)qE`hguBywcX)NO8GVims#BV-gKY1N zdaJFx$$g&T!`Lo~pm;#W(3cz>wnifeIILfhlam81p^vU0>-Sts&Zkcaqo{gE7dJO0 zwKJ4;!BtkoG;P-bw$-oRO?R1M{;h+< zYEG#I{kHMerO~cjMN`(5oQ%pqzruhL7jd~eN`F6S|F&0N$>Y&na!MUg_pxHSrw1u* zAm2|#`crm*h19zT_Z_!iu_Bc3LgFRQ*;7(|Gu+F^PV#P#{XnPD(ruYpT3Nfz1^ix8 z>-P~jMz|vV?X{*Copg-aDr$EFr=3C`46RCHYiH%W`{M z$?*_S3>&IZW7%;G!kTf)eb2i!nny8C41IeaQ`M;{bXC{BN@2X*xUc1c)?(u3`^ZsS z7p7cS#r+Y?A2JRk=t%OO3V9Wua*VdF(u{^u@pwf?HOderV)mN(gX}eWjW@Wc~#D%~Ex*+alR0U^c;^ zv^5rdL=|5B(r25)I+p7~*b|?#+5GzZKIPr*{d0U_I2C3X5lWzU)olw-!RPSjb_jZO{Qdg`&GSxXIX)a*oMV29H{Zw_qoq*4t<+jSdRP14c8rWIB8zdJ`x zwWgpR8N{6*;r567+s?Y35TATn`Biv9yla0MuaWu2>oy)e8yh(R&+EGR`iKOt*w3Gf zgF2^}UkpEL0Fu&UZlQUI)%(+}3C{Xgb}P%P-;Vo39ZZM7q+NY|A+gahddnnSmKY_f z6LZl`k@uRwP4@T#+0XU2Es3tM?R$&8A0b6=T+VHM>UW z6cla4GE*^t(=7fJk`S~k;04Vx2r_CHdUI>8{JG0ue59}?>T(ksh55rP0-Sm(c#~YV zx#cQEK4fDWq>60MhmCvE7bc5e(GJp4kX45=gi*bAR zmrt~7!zI3blj)k8ietBaEgTmY_u)Ir+@D+kZOL>6nl;6fY8n~@F0QTwbNiY$O+t*# ztRMDfX~`Z(ky%m8C8sx6=f~7VbldOB@ad{07||ANKm@Lj+_t9Kf*Kkdx)uh)9Cs(5 z%)|5W@Yue6yC|$%XU?WA3+gylT)Kg}Kb_}@Aw8KCJf!C1OIi@fBRRXHIJ{4h+8zp# zd@FiVbzeC=R=WM(rN(L@neo2y7K_HE%TSbHAhsL3Qcc>x#*Vb^k9L-!N7L+5?_Rq) z|Im>{9xG=8D|jw|C`Y&R@-)_Gc(`f1?-(KfRsy*?aAOAdF*aiwjzF%)_a75sKFW17 zpA~Iph?T`WM@C+MB0jHxM#zQaDCNi=E0nvDp+hcCCl)q?q1O?lvDDV{ z{i%5)I;lH5L^^c$_E%O`2BG{c4JQ}^$jJW|H9+c8TM#C(==| zkf0YmIEdLgCrUM%)r6P!6hZl4cK9z6b$eN=;X?qlEJa_*I6g$hsxVnP@gk=hOX1tL zV!E6!l*@Wj)EJ4K{Ni&4YZy`*#KSGJAoyWcj>+J7vy*(wrS#D=?vZUZMoIwzT_*1g z;dLElfVxEn@BGo_%_P=WYfvggU;eu6sxVmSqGhGp3`Q76D@&8PP}uEJWGZCar3J zbB#KGlda3uEoDbVqjN^W2cQ3Guz#3rA9HHGLzwV}h6eKhReao&cIb_sVoi3kjpBOC z_vpFiyyecz|K+VNeX%9VN|Bp>^z% z4PO73zrE7<6L}*zK}(B?^msNE>=T+C04SaBp~CIFLUY5gbY3rbjh^lVEA84z0Ven zd{KFSYpjp4H zGM^gsdx*PnT+);_T1od|9i4bM#npaa3<7~D=g1P@raCe+pK3JOvL$`wvpCRlEY*xf z8_hR*_>6%zJ7t|7bDL#B=)?Wb0rdfs^FxN68wEC=<1?xSkM&PZCWl4=&Y+#09U4Bq zkZS80+2^XzymO*WK@S@_AW(1i=rO@dwtGBlXS?TinXQj!SZeOW!bZhKOE%MM3OBkr zrj=!+q`RJODOg*h?M^qwKBm)AHHWSp7?z~)H@bZW+-PM*tygL#R3pOzs`4j+BUxv< z>YiC>C^)~XEkWs2s{$kd@F9iUd3n349j!os*JoyCX1}t5EQQ&j zx6{EN;ApxK)8M-=xP`O;J4@dH@E2?60G-1WJcZJ}8Bf+FJ(*GBlanjQ>Kajea^+n3%|h?IM7`pLt)pYQ8|66-Jzo+U zF~8V^4cS3vQ;}vB8MQd|ArNSG4s_h*%dOcgzp6OX z_M0%*(cvc!v<`K1(Yf&nalwZ8Jjk(5?z;sF}}HUb)>rb`XS(+ zn-V9IA7W?n3<(cC$ocqMH};uP*=dLhWt+W*tKyF!YRTv5O7qa?*AQvrU+u~-4DwcR zg7fYk_hsTag&x&;@I*hRy9(JxA-v+OvYb-vwVA5^z|3rS!Q`@(g+DN&l#%=>xVY&! z862)YoJJmE_PxbrDV8A~wc2bhUW||Ha}2}v2V<`*ulN9*OOuY!RHu1JO*-AvOj=YD z-j7sr9y%AyKWdlodN#Pl^GDM~?Fg9Pyh!4F_dYrKAW^x{PGE17X|&2B%K6hh??TNR z9zTCynyvD)tFujE`1@hV)>E6|olRWbL|Fjvd$RZq-h3>dl8^muYI+#E)%2k6;j(F4ZrS}0Z(ki6k}f^& zP02XDLIx0Ku<%zSKJbW}Q|r2_pQMxXUI|=shTrud0aTItO=`>D!S7Hr2C#%>ci9kY* zFdfpTp;t#zfU-|yiLK;$mIML+p4z&)E3u_1wTtg?wKPLKmnF&i8g@5YLZab&1Pit5 z(HYcTc^mOss|b1xiBVddM@rnrJCVn0I+n$6J87r+*)|7LaEa+<30Q5iY_fw_ey|j% z;=r7=Rrs&%s%wuR)u#+32oG0-`sE|bCBS!cl@_Gjd+AP$H1tqzY%Cm;%05J=^KY11 zKk~lBuhS?Yk>kQtg6*&E+`bX2=sfFeN-ZITxOY_HL{+u%ZczIfjte#D+=tA zO6Ihvf(hL@yEW>)O`$p@&T6<+zHP32E@vKFRCAWF&65eToJZk!lihg-4ck z@h`QVu?}WA6@QL0+S9IWu89v>yk|rJQ8GDngqMWG<6x`}8IO<7+>QqM{lTIIO98yQm#QpJW0}v;=D(j{)dt$^{DJPCa0H|QQ-j) zGX{|K${iJ2vrn*h%!FbTVT+@DGO;W#u;Bahl@op9l#f-%}TqG(h3e z2$y3<%Y|{1CnW>~SXTw>4BO}|?+avY8r-gb5|y@JBspJWUv3pST?OKHV``>zp3Ywo zIy=se3)o#lSk@s!8i&MyYqfaq)^cYTe)BKe=N!1aJLFd>E@$*8#Ow+UX@PCH2wuLy zO4#Hdz15U z@#hE1l74+Ao;Gb7wM*?N7i;nXN&>z=pj)Go@bC3R|KRDhHSg0GFgER*vrvCIY^3eN zFWR%iK$szxFv*bJ8H6u?>i2ACy2v0`o~P_|7E#)M9$?(Fny<>zK=#lhU1<@?z*`31 zBtbW~JO+EI_V(ei)oiNZ=JQU8__w;;?-0lG-5?$2PUqUaFI9N&erjsn_Z2rO(N>=f zsuvHltR`=C(Y!uBV|k7(zEPmnBoI5vmgwT*VtiA9-~uM#*QW|xib-*QEp^#9J6CN9 z;<;QgYcOF?TALie@1C5DRzZK}TnMo_dI1{5oZQHMLBRZLPuT*8$9_Zx4-e1ePQnxx zeb*E~9Dzxf;45oEGTaiopZyLAOT3Eva?cSF-7rmONmjtlv?~TaY*w!ocJF%_-JHFg zl2o!n|0PS7G&yj>xfK|r>Z4bYDt8x%M^3{&I;q{0V}n60&(YB*3TL5vT)HV!S6->Si~xM;jlJ+daTzgySK_`I$et4p$n0Nqf*05nRjNz>E{(GMm6bRd9vmEk z_^jc`igpZQA8Ec(hrwmB=3I2ZC&}XwagjBP(!&^b%ejG5z_&QzpO}=`PMd%rXv31} zJ{kQ^t2tiZN#Vp?HMd~T-1<4uj_G_(*kYd{OIJw{-F@0F&xb?*OoANxW_O_K#oa>E zX%FwCT<^uf;Gc|tDSj`XwW!%-@w$*(X`<~l^vel68C8Kfd>npDbqh0T&^8?`k`I!?|^S*(BF+`}&dW!3H z;}L5=TQpV-3&wM_dtGgjCr@&CHOR@xs60U`Q4e7D5iCgEEkJN=cd}3!Aif5(h8*KA z-?>~dCbLIU25N^8Er8{Lf~w@Ws)Xlyc1&@1RUScc!YZzkkfQgw``7)@mk)e5tJE~y z&g@!N61|Dsgwi8SMi~W*5TH}VZY3^QITTkux&hd$RTC|nKQwNwL$lNahuh8;T~Rk_kqGQ(+mRNZ+fHUOREZ19bXWKb6;2%ApI0M9vGt@D?%Q; zfdnI1y?FJIqOgXo62|h!z%&V<3_ps;1@S9ipvdlm4JE-xI7{l*2jt@Z31|$)Cx|nLSY+rv~(|! zH0Qqa`&K>@&T!hOahFp!A4=O~s|L0vb*{HnHQ$1oQ|!Nl8M;PuOcslhPTbV)CC0|8 zRE^C7Fpoqz2+*vf#kkJ2BTAf)?I6SbT4;2bU@v}pSCqz)2O*q=?wB21?oB|EleAya z!iGnX(x+p22UHj0 zJarD(fsh^Nk#qbVCX>m+?uPn=+0~P%H%Xc)oX){QJh_}}4E^nL7;_lQAvdF=Kfd0u z_=1pjo}tJtbOG7l#&EGBOR6P5Q#01^1D0dc-37fknKK*R>=O0Z1kFt_#4T@82{PSW z6_={3ESHqbzNS`LD8j0l6Zi%vmYjX=9dBa0gT|dejSh}uHX+T_OZUu;Dl&hvyb3lC zgwty{YmrOC2iu?AVKNWw=gmPvD?CN2Y5u(V*RKT}nOjx+4`#}hsW)!X7TuLqoRys= z6|~+9d%BiH!+$Bzx}|8mU*yso0OF;GdsgB7=zK5IjPs=8oHrkVR~b~929`(;!Mcg4l9dj|YT9~1WpI8l zBhM`d^DF^JaW*!lXy06;VG#!1W*!7ismrQ1=qlE1rhodSdlyd(e|M@{i4S=p=<4$mf#GECh5 zeIiz7xW)>d;Q(vKV_Moo{R?AXe&v%dtR`th_dr{BhROp3Pb7MiecnfL;Yhz+vnF_p zp+E1+=nEX%%8^@=+%(Ym;udg!0LFmd=7Zto%+4I)dUR_2Ut~S3ZEm$ z6_l@ndpdfOGcGaM(*x@h5*!=rq7QS;pP60#){V@s#vCMUxKiyyn)4Rj2X+OB{(vF4 zdmlxk5f;NNF!0_J*S_V7oE81!?DhF$S1{{p$99F?sS_umjUTXm`&v2>Q@hyW#$!AcOgG->%;5!;%Vj*a zZ)RG&W`5sU=84?ivMO{9GiCdl{V3zSNlq1&l$@CJ-e??Fm$gsj-dyWR9t|IwB{5S9 zW1Sq*ybw?_G|Wmv0h5F7gSq?0vTlyQhW-ug2}JTki!4wbx-Bg&#khYl*Q`zKv|1T= zwhV76o06PGN7xpv9L9bvzga;0=B?i%bczOx2*;H1ir=p30{0ne8N9LF7<0y_Z?jyS z(a?opSrkP%GK!h2b5|iFewqe#mG7jHLr%Im`Zm|)2JthUT1bG@!!hQB%+mf~GC8S} z0FrQXv+h+H?tOPl#cn1hXwKzh5S>v71m(zuJ6-N{j-7Bel!QN@JbKu0XbT1{4c~(5 zeNLR!qYm83n(v1HBvMPLVfTgE3QQeu;LG*asjYaX5mr+$Xy{bm#(d?;72D<7?Mm4k zN$q+X;Hx^^)mNNvxVD9td9(6HQzeV+INXUGB{wNpQ$e0s?E2(DxoAej-2$4R1-^z` zriu<8&ygi1nf`EYfN=Z4XtW(+ZD&X9(CtVRTtDnggcKfDHK1NK?65R65pVYfT46AG z(BN>GJkHh#?NqM-V#kv?$Vos;LPHS%JTx&n7g>9dvWQAV6e`^TmX3w()JSlNR{|5q z?@#6ALOSsC_485;LEV38et%n2z8JtsA(nqh3<60v`tYH#Bl%TVbBLx~nIiP@m8?q> z5bSLaHCM%$y&84ESm{BFOwmpuVhN~z`P^CVO8+Nsp{lUqkW<3ch{U}65np-t)*a+_ z$HrZ|$`f-?oB2k=Ea!@k-OZ=8^CvRlSdQ9v)rUtGFjw)3EVxm)da%NDpPY#hFHa4R zoP!~Rx!k&hU;?G6NAnBi2byXRa`P~1Ea$J2aXl;0BOAcE%!3?CBA|} zm{;}JB@h5$P@CQbToMOey4yGB?LdmVr|T@_l0JjZVpO zqg$>@N;t*%nDeoK%mavx>no26x3^QoFPn<5t(vQzC{Gwa9Y5SW`TUY}z%4%@WuqqS zms)s4i4++*pKdXCIf@2i$hb6e6MNgbxG0w;k zO13k-s~xSZRM-}=abi@Qo2U^b7|R%eJoo7Fj=aV4GDTGqr=8He8B`xY?;Ihf!J^5< zJwHm;GACH*=vw=URP@X9o^YVPi8fR}JARShVEnIoSDe;ad+jwAcI0&7r>1eOsonbQbMZXSQ}ND1GV)#Q4wu z#t2X*@R>TXL+Wg?H5)RLvD1ruZ{9!AEWEyP+@>a%=0U>+n&8Lm!GbBn;7`66Uz;6j zZMT_0#ge;O z2fE!s@slT`t`2t&z{E|>cZ1^CwGtLsRTc|zyku13egDgFhA58nt`u7avRoTRn{Y3Om1|+2R!-x z{r$cFi&TBZAkFimQ&TrumS25{Xf`Ek*V#E7>&xfW4Z4nP^GOTaRfkD@tTI9(i1)Tz&U~<)0?{^S~9#8H%A-lBD(5w}*EQCG=T&%q2>~QVs zTu8#|ISnzIc;BI{%n!bS9~10DO(&K)#HW7BlW_vunw-d=GwRE*@lB0nx>5ItW$6?Dftd1{-U;&v77P`fs@ z%6r;1q6+F-H*z{89Z`1nBg6)fjuZ??Grj%zH#DDQxLR4+3EZh*I;D0Ci&~W-24n?; zT`%DI`PE}fG>RGsFZep!kEKuLFAkLl+dprZbAu+E-LG~M38usthh1nj>wZxXEm1bKvZw(vGJ#RBDdxry-UMZ^fZ=ZWiJO3d405E*~1Lz zs!Boj;&U0t>7pz;f}G?_eMVAXXsu{~4G=#r;(B|wGU2c{`(tb}oH52-R+dToYg{9$ z8FxcVY;43+hKWe%!12ulfrgV1>Oy@s;x|Ox=yLy^`KAxeUZVukf*THp3&j%)i>|$w z$c2c8v^fF5{=Vrx?i7+~eAj9Z%TiCP7Hq_Ql6xC3$cbx0l*i;IhEhlkR_ zs0Y}G-;Qj?HDeo-J-ep+nqWwv+{)++>gH=~oKR&$%@No3oT2flC zKEsQTDUfMvywNI~OCl&Zc3gv1UJ8+pgIaKSS$E1a@qjswC6boogy!ThN= z+9H^L1nMc+JPJVD0cC)A_ze!_&z+qQc0Pxo>397lRgCsr%Zp-jt^B_JaJVXShEn&d z6nYOQxdn*N-wt62YO&~x-ETMn%c@CV)jq4r6`>w}J<&B=p+=?B?xo1-U0%EqOIZoo z=ZvLy?DYfJ?KIf-?-b83haxXQHqGvl>k#eJP9*>}CqO&-yPOLaq#rFN;R?l8t8hfHOmg#| zD;Y*qTwDn$3~=rxI`K0pF2E`frz1ZCJ&V{ODn)CdjTM}I2n*3q1}pW(yMm0npK*f4 zc%ta*eF0d=@OF8R!S=$8&W#h^_g7LH{pTYpj!!bjKMVv^NYslu1|}3S?n?DHKk2y> zuvPG&qe2^9vsHZHh`YT&m_CQF0A`qVdRBYtPR9P!M1NDXm6*eFA&uDmMv(L4XOOV* z=2oe(R##`I(A^zyxAV`5#NOGE2LqxUw|jk*{jdRE9r^s|7q+h`fWJAuk^eiIe4e>C!9wgR00!jFu>$i&1@ci?0v9AtNc+#ES(GX^hMR+djoks2?&cuYRvd1RdwX7ya+fNkcTrH?5q@c? z*iXE~R#zOZTBXtbod2mT0P25aaPj|i_7D_^4)X6i!r=L&q zl%*4yyatl30RFRs>R)N}vAIrQ zuS?>wrT!!j>Xv<$ro-aDi0&yfm>8Vx+4fqH$E^P?=d8T1ePR0{@AMwRRPj>kYUvIr zM}0MxtxI7By1u`ZSgb7>Axs4_Sb2eHIxW+%#&Cb=+}qoe&m3b(*X+LTdQUTSHE<4P zSXj$*xz99f`4b9IVDl(*amT?RBG+0Ri0ljK8;9h0rXezKV2McfVJ4TUnhuipjVl3k zdAl36^IYvMOliuAc|!F*W^&|=VzT^zJ*v9V_3q(Dd|_i5YkL+en?cqKvm=_m^ECSZ zY^*$lWxu!{d}Kk3t&0M-84I__LpW*qA%J@I`7Kiy4sMFbUN$$r^K@DoQ4QtL6>?HU zinh#-1l`xc>aY4y``U}pf$N*fueUNU^>xb6MS!_aQkI8x*V<69ep%cAOyC#p;HCRG zZN=vMJ-k2lQy#*K4}zuBoJ9c*j{m%)zpex}2;W|^MRHW$r+9G(wWpJOxxF`@H_{;c z{fY^B7?v*zL$?9>e{T5xQvZJYQ>UUO2ZO)6Yc65ln=D}l86Ci~`|_>DabLQ&=H#Ha zK$Jhf`qPb)R{#in^7aaUwEX2&`=xn_6;2h6=mf~qA$%Ho`YfM78cQlOUi3HA0x*}& zA7V!ke!o5Rk{aOCXr;cP=6SUMoERnR8}CoqSxUZrt!#gQy8r&Yd~Dc$Jm3HqS6503 zit2bR5_%*+fEU>U2;CHh%IUFjV`QvP*f<^6yff=Q)Z?Hto$m?p97o*>24@cC0+^RJ(hBLn;7ivlGFr`I2w@IOB9_gnqzLw>k^ z1D6lR?^<%?^&dm`55C5O8XLy?VhuwNR1R{<{tz}CXNTBuadL{~>WD_jRWZj2ui}xu zgEgacx1iHZ{Jb+LuO)c|`=5P-ir1GQHsrQgrs>HdK{m6z6-7YK`t2Q@9qk)Ny)FIm z3{m~wo}TZ3dZtu{A(LZwb5lGxI5<<8)dt0^*6rG$_U*fqB{T;Ij%$*P|2>obIthMa zpyx2dz6xn+%wdjsYqH{K3b-%cF7_hBR-q2KL+@V8}I+@kkDV|=Yw>(8@cdk23d5q;uttA0sJFz;sI7vJEhOAcSQn=`Ruzc_VkSAk?5C`!} z`G$0E6{;^jUZ}H8Riaauu@Yqx?aMAX26A3Px#xK(L7DgVu zSzkRoJ{lPbZ*QAa*v;9imEK4v6;!)OQDjHYh@_rPmac2 zA)Vyu)#=wqkC*a0YXP2|!7+x$BU)*3e~?m97Qj$Y@ zF@qOUKFnE|*wNto`0;-OU0=M;X`fpkb^IwO{MlPLdh+0D%8YBCYO zX1$RAekn{Su#w9i4n-HdrBh?gZgRaD{?bZ{wN6`pHU$O_lQRFBgD05zcAcpzh%AK{9mDkwEJZ3iI5u_&DWgz2=?E9`hRlT+DWmd;w{Qzbv7R@br zn?UKe!gCJ$Q?xjzSz7m8miOvL^_@?@)V$>yPP+!lJ37`VanY$)q?YOnnZ1lXy^*YS zr@az9z2WEQ2TqWGU!k-7x^VYB>_2-Oxj7$AyoOoxa#%`bN>9N&R0B#O-d(#0HFZ)A2%f(&B(nqq~|$+N36`8<5wS7WMVcmB=>oNru&J3Xu7qH4f4UA<(-|p ziT&V0{O+Nln3xn^o3Dt6ICAMi@7I=>-)pteQtVFAXWNJII1+;OM(%34uSof0QG5o7 zWHmG->~@`G#ru?+2Y})W}%XnYB9%dyV{8o4_)cAJ!msngj2WvcvV8- zm`v7mWs8FbeT(s&Upgcu>n(H=pT%Uw`*_8gT-%)~K?@RN{WKzHaNp-ArlL#_;EgmM zEoZ^nEbj-FT<@RH)eBGFHQ$Nt3D2?@YD)#-bKsOW-qLhYO)wd1NAJeW2JSHNiH$0! zxC?}!5OkkrlDWm5@&FunE6ZvpDE}Fj-e&XVh1nYE6NPRL8;$1N%flaNi|hP1C;7!D ztt$rH_rI$fz;Aw8qyPH|@%p)jiY|?_ZR-oz0t@H;oURIMEC<@n1P{9?g3DATpDdFVGb& zsC0r79oT-VXaPXM3N*^YzG;dHx@m#O3~He#7bHo_Lt{aJH-o_t2@%nFJXZ99jeeyL zHSDCZ6wQva0H(s}<@t9Q-7K^!vVXDaGwz_pq-g&%^sxDw_Li~^tJZ&N9DMa;AVLV)^&76mOkGqq+jAg^E90R?b?ncwW^X;u21l{#ZeyA3 zF61lwJarO*m>vW*x(%H6Mi6r-RSKYUIRFCYb(6ID%~+>T17d7|~CyaLS#5(*Xjmp(SWQU>^Ksz@6l4HZ0j7*!MP_&$wCq zKjO1(P5n<}@c(FJT1a2ZWX606I~c)Dxew7uBz%xGJn((=^z>L5IQ_eluJ)MH_pF<^ zfSa+SqXXa)8ksf|0RgXq^QTXrgeF)Nasj9g^1%PS1h5j4k_^%TM=MT?g@$CQE`l@; z?G)V{gmPk*hnr@q-yF3khk8a9gf`}04)yf-hx`U@MpMYi%de~c;|>J?k6FHyI0KP| z)OF66^pY>`zd80r(LJXZDmDmXeRqWr ze}24q*38h9-rg>7Eamg{Yc!`<2atsbNROnY4fMV=AL^>Q}2PAd1TEQ!nEl&QjO>TC8un8;g)FmlNx(XO;~unkG; zd+tISt71%}v0*kM{oY^zIh{y$)MJ#6p^%;22{ja2;ka#zDv*J1OriKhRdTkMZO3Q5PWb+!kz8xau^RHQ7v#N}D- zMUC*HYHb;SmSxSjIKH$!QNLeAd5AfjB!P}!nHbPAHB498PpCMpRcF#%#S-Jc1)4!k zM=h4+mAzEejP9888_7oZ{7LhlkV~NB11Pqf9Qt3K)PLOGuWi_oAA-U)47z=@QUNsL zVsD0KkrU9bsd3*6H&!!IT%rQS*Z;w82y}wzV+rgQlg`0x1S%z;F^D^t)bBHb_tj1s zB46B&GtO4H!4;}Q>J{2AEgP94sy?Yn0v%*)U&a%4%uM%tH#sF0a^c3cXAF^KdeX@& zwH-(sGA6Lk8?4F50|E|5Zq9f30t(#=rX?)jG7PcvJ?qBkF!Ci6WerqY#I zK(f9SC~ZX5dAZw`l4CevdYoTSL;vxgt$Hnvu=uO_Y7PV2EK8}R@b=+>fk<|H(;iup zM8c;yrtlw1@~>=G$>ZOx3U#UWUzs}`%F2@TqT=S(II_k;K|(^J zQjQ&I9~lYT+u!fF(ASsV+4m)+96C>Mx?jAzysdDZ6SC3(4mNpx5dq{3+wD%Wy;b@T zYuNvs1~3m5K}{0>Xr*8IO4Ip#B8CdkC2X$yr)rYev!yn;pduRC#a)hdsHS)=u)Ok! z1Et4BMD7S4X(JBOlifh@pLW1M8^2$g9mlgLrUHV3JfYfEA;r|j0R7m|pkn0ofD4{n z8ZL(naeC0IOxGLX?#xq#&o9hx0h!!-jGbR4)hS6?x^#-o<02@&BBu$xN9joQCD6SH z+}c{LusTKc+EncFl14rdHh=mYSC>81oWxJ>a1l~rbia&PJASeVVz24Cxl9{OBJIgi zqT?i=uV>pWbiPhQgcYRt%gcv@%Xog8lDnyX_h{sQ_5akeskBQez{%$Rq>XXbs!S`U z{xM4?k@@wTh84iHBiXES#O@&2=I zcMB(6-UQ$S6a6Op|HGg4`~H~lA8v~QQbR=p2KE&Wg%JE-hT{M6XG__Gb*z9v?Jrc( z|7a)vnBF)KNJ@wQ{~X!>QZY&%FfZEOz{!6$Vh{7~O9z}e?c!t3|8h5}qfd4?P$?*I zITqb}*KHzGq6SYzewm^FzDxn_0VxW(^~?YJ=WJmaPi%1~B zz#iSfj-jNd*ES-=ikD6WREH-Q7ipfJk8U<)Dz5RWbi{!k?xDXq`8)-|E7O@W{tFZQ zuNS+3FEtDM8!Z3dhvs20(VyV4S+i~Z+%Oa#;>8u(=c;*8;OmuzWV<`*Q|Azv1`D~3 zUwonV_lp6muOUn>%tu?;UwB@Hc6 zV_mdM2u_R%Ek^f2V>3!CK96or%AYvhr*EtsmoM2{YBUh~df_)ur0dCZ_ zk^0RVy)(ReT*L3aRWET=y&*Q zHdIn)VG5_CpRm|#n{r}$1WAF548>Vd7YK+Xhb`nl0=f{hCYM9NT|9esmIY^oR|HZN z7Pj2YfEiZ(CIiy|4M^f`U5&hBw$>WSx9TcQLZ{D%L<^1TeAlYmw%2?qs0?KW5;Wg%sl+$) z6#t)|Kjh3T1LKJ)+ML6E(cf)(xta+N`M%@ZEDw-lIrU$;(1+4cAOw_PB^w$>^k1e6 zI-}yN*Jash{vS!UUNev?%1+Xj;j%q58SML{)tG|~gE^h{SnvXW&`UI&v{^J>akOzJHaq1+xmyBYucCt9;HLhY5YEYmqaS zDyueixUtO-m29KpIwyxTo(U&;&=l5P#5f4sU!Y>We$sd}un+;Hbo5Z9Vh}E#!81ft zNYuK4xh9w_jIyEBn+FTwrgr|oNq*nIdZ4tM1q6bm;d}%+i;I99PnAYU#)Kjj?M_mGXMxJp~T;lRZ04ypD`3biarl{4gw{V(j;p_Fty5 zwiEty>>tSH=zM?J%3?NeZZCI9t40K#ZK;+x#-;JN#)bXx4e%`@r=WSnw=-dvX)+{5 z?(D4iD*o;+^(%_clob5UW(&z|oomQl=xZK;Woym*o>tHl!oh~}>2(v%#-O^$J1|_p zYWFXTPsvl*34Pf~M$B)pe_OqE()f1H-v}a+SfpctqmNI}{x z*P=`(^8{r>K$32)7$m}R^kA$51mE9Cn0_DU403c zXeRG9zkXwPgcO~-Y#p22v*#fR9{KJe3oOe=hz26_b#@8NEG*X{cM9OzNJEw=<4@)$ z$uWl9T>#c8@iK;9JIicpy!^nM)j|x|i+l&?sh+UqJhc=CoNpvg@=BPnaB?4+s_68d zZKkZBi-}A8=D@;2oQg4Ln3xZR9QC?f`zx-KmLOiC3QYwzq z;58bwyKgA_H@{iJgWpU-s-P?)!pR=Dqvyj$WlRbM_^4}Q&CK?A)IiUoG-yEXbhLk4 z5AXihXTc78u1`A2&ioDjZ_h$T$fKQQL}5s}(c3G;{3T9qE@#^b+=-+O4jRrK$r9k_ zljiVw$!&@#{>%~n34%C6PD-X9!5LQJwa~pBwj5Wb`8aX&Oc|y5HLkj@A+kv=UM|s` zZ}IfU4uC_W^_Op`yBJr0Na<`YMfDr<)fbv z`s${`yvp$z%AZI3_~WsAKvk=~W46WDHa`ZqJK9+*!ZVcA>F(E!dh9A=Wyd)|0y^^? zvn<`Et+o*~+^;?V>KsyN{$WmzV)F?e zm6+m!)Z$-GC`GUS&sQ4^Z^%c( zmz0n7<^Q52j^ZFXb&bT(@V`HE&kKhlI{d%gCZH{p4>u8>* zG$*v7dIJvkvXMO3z2;@5mDqje7W+B6rx&*CXH0^GnsJ_Y+_Q~4xV=rTUc?tB(~)@H z(E+;fDmp$cb5&RPU?mBzx`|A_pwkSo{x1-bxzJ6hWV{FNDARzeaaXcJdGtxXXJNCO zbR37G6rFdbWxU;9t2ENHPn}~onAOFaSxJ3vIA{*;C#okXroH)fPNtxJ%boMn&iwa! zKlM>6i(Ye8`(5nS2svMVG$t$;Xa%wsP7POAR!wFC&bcl91=?zDumIg7zy_>stO%&S z>opK_vQ-}1DYv|TFOJ-r!JgpbdwdEgNeUQ2&0i*qZX*D&QlsFFM$c|TXCc-G2g>8Dv~GS-^|6AF(;G(5F5K!$@%u>|lslIs^a?(!1Qo1pfh@ z*GqU+dz3?_nfe!>mJK)PufW+WL6yI}fC}T@nPEKri_(ZG129Yp$HiALi`dTb}kX$NB@gDW+_IA5K zzo@P87R{KgV}6uH!2?SwxL1dzuon#}m>_5p5jw0m6}cP3u>PC~r!9e)y97aqY_@(&TM&9GE@oe%O*X=B+yzL4Ab z`A}y&4aqMJd+H;&$dGddovtm!zm-lM1dog>m6M~BbxC-^ip*VHg}w^Mo4gcMBW(J1 zN+a~oIEIs;>+Ml& zPFHd*GohD@HKE4yDz5jOg7&X2U83B>OW7M+IPt-f55-2#!By-c&l$GYDNFZ~|bnLsM`Zdw!3()zTJ{4%w(_2D1yMJHq;gyD2+ic-pb5LLA-hLqr-FDMm0GL zUx9?h0-U*=;RP4RB@DEhbM>p&uHn%>j${)jW#%g@zGpo+uruy{o~MdVJ7ZaD-igcZ zEFfqOP-FfJZ>JyPF3=Xq)R_fm?GF|i$O;V)*K(km-9uCNT-rbrFW1!{%@M}#faU;@ zF)7w#H8Ak<#rLyz6MK?ci&`$UMfCLCgm|M05*!wzp)pCEg~*e)vNxp{EYpT|o>{;<$8GxaV-<)rDmo68vcAIkDAHed^#0ARbNS<4qMzwRf#`#i(GagR8+1QAn0LD0v(~(A)WWB$~76irA&W2M9&%aI~~=ljCWvo)+|oc-~iruhizea_PZ=f z7Bcxa{m8H2`b+E|0Zy6>d0}ix&e|HP6QAo|15GUWzPQ|iU53riG-nkF924cAYu?T% z882Z^yi^Z=L%|WFk(fk9`wb4(Jgw!+je>gYfQLo46qS)HI#S`!lthB_L(g(Xdsp=& z-@ceFu20+6ICrlsOiW(NjjlE3PPub$u%h5iYZC}3C}CjX`#&YhH(u4mMpoV!}s}Z3Whgfcb}LtAhe)8;%ln?H8fJbKiLpMJb%Ph zc)QFWu+S_y(v)BF=G(jKJ==Bj*FkOSW^9MctHqS!O{r={{IbTK5`tRIFMTaafunIJ z`d$Fyy=oOu)Itf?nyz|1JKNFa_afP(>(Glmo|ds_iAX#91e?w0*PriPc26q|J?Sid zu!CDX3<+)4RENJ66>9NJ?1}8DxOrShr!$@3%wY19p&7j~nWyx7gwKlZOKig&yt4AV z-4=-6@17H{6p%QnG}DV?y3fcm8Y>o89_bL@QRUfj%87~5wMg`rKW`lk^1>@4{MARJ zCZWS(H5^l*jT$IEhk`gB+p}k{@O3+J?VD%pe}1m0F%oYT5ua|SNW|^yJ&^|Te2U$a zNw3yN*FWlZQcN)O0_HXZNWNF$m8i%s4OEFWEG?}5I>)mgziR3{P7pGHoeTgga7yz! zJ60c@Jf5R!aCImvRlHwj-#IQl)9HRu=S-okK_t{95HKhtL2G+?LfS0!{UIt5S+8e6 zf&yn)?{Eu{w&dSm4b}BDB&BW9RcJbxE|`U;NwAF7-SX*yMwNh+ru-&1<$m%G!tCgU zn=ruKY8%UWPW+zm7CAG%vf};)9x(*1*r>>xYRa;RNkNIL@zzOxlfEeuJw?M5XZs$f<`SE2Ubj~rkZ|#?I3cjl~XtU!#L6XVY+@_+1Ym4@fwP0eR$js=t6jd%p z6c1*_x{YIXV}(?iW0zXJoDCMde~2be5e$RE-icB)hVtQ&@qK~$?(pc@DBSia?JIzj z$c9d=9&qyFX|_7eOW4+s z_Lad&MmAU(5F2cQ3z)So`H7?hPggoDo zLw`~zejFdX-x`TH6S;iB>j{BJJ-zd37cd>Gi*nTXEZoeARQ&3r2An<)E35ey`Y}aw zD&Mmfs@G^}XnJ!9q9(f+gmOy9-N~mVz!4YJ1#f>eXvK2+2l()X0H@9#-{7&C9^Jfr znN^Lsiv4SVs0`|(=|@=v!y|ual7Fvk)7q~XxFQgdzEyXNh%-YcYg|~T=##T6%bPRQ zpXQr&?}~ua=~OeGQxjQckjFUMeJ{c5xyWpmd0%wF5o(Dv*I#gZPSaZlUf6pZz8W&N z0k@REQ@kMn9?~9|p3rh$x8_}6qNL{kNG zuh@TdQUM`LVp3VE&HYnpND&q}aqb%y5FDj1dTWQ{~UgH%t*g@0`e;rOObHbF1TGj8)_H6`x`ctm-S_~`F>nWTPts{=+k(P zB<@MRYJ!Go%~<0~ePm3M;FR2;Y~7Lm(3(1pcN?jCXtn#R+GndZ4#lx2Hf39*GxD}H zY#qs(r&W!QJac4s>D!_i-P+~@JLrrCiDp}e=2+x0HY|s(qsHy4U$`TpoW7D~SjdB` zeJ6-T93yyqyrEo7l`EOZpbjf7?XWZ51e}6&En9j76_so>jZx&F9q0v^>NBb*dQimTD-{dH3r=HJFK`Ie^jKMxQ3|q|uq#=hHNr zoB?)sA5BTksDNsJV4d{ojifb>J6$ zgO`+@2>)4{e!1&Eh|1rt)=>i*f-FrL#D9Jbbr8T-QV+=cc>EVe=+FGfKZfbIFB}7C zD5iZ+xnFv>Uw*+~uaPl%f(|2Rl1z<^^|$Ty|N53^u{Z$vYJwa2&+p7bj1(X*#ZDD; zQ~!^f`Q-~+Du5x7s0R)``N!8N;K6Q+vB>?GA0y-cAq`L(Kq(xd_h6d?Ix*Mbi$w5*&hEAnZVrZC|@9@O?K6t;+ zTHjj!$2jxLbFOReeeJz_c$fjEd?w25@pN9-yn{EyFlg%}zW-r}J`Z`EJ3}fW-ye4l zMsL%7HOi=1)?J<%^n@6iY|8$4|Ymi8!37T;z#Ykz)_KI zRhF`0e|kg_%ET>p`BWmlHhxFi^5?BT&pbaAT$21g+u*oAue~TG{@Kl7m%O7$G%c=DL7O*_tJx3oO^1ct5qOcTSauDPNAt0%qL7n=0`^?{b=5jcCe&6RBm;O^ z_7_+;u#=f$-mjmHi*};W51;2!B8J4f$YoZ9e+iFf%b4f+r>6^U3vsAu-OH|p3==uz zc%B((RvmmAPG&W}$Xb86WO1pP>CX)dJW9C~EBy`it>R71O)I1P5M(1XRK1WP>FlWa z&}q9p?;GFAPEN{d7Z%Ef=|0lWRt|>1ttiD%%e|^sVN>-ku_?qiZe#)9bOjKU;T#te z7poU<%yIN`EknQgT7|*5!P;PTlCrl%oI5#`UFeVtn9tOT11K{A_#Yr^hFKVelqqQ* z-FO~|8SkVNgj;b@p55O^R+uU=6&z>8AIBb^`swFVLTZ!it5jK&bq#WUoNWjsDMD?TvG@4pc#Zt|U|hnFK7Zi9*g14d~x4YttsFN5L)!MW@f^ zlQWSy^UiW9XYSjLa^ATGZZy z4+chIP_40Zw*3u;*EeU2VfEcdzoqj6IwZ7CO@e!lo#|(@SLRv+_fDv-cSgUL+>+~G z8#ZTTV(NH@Fe4o9Mbyng%-XTBReEXTke){_*T!<)LjJzckI8}6^q^d<>(6CD{syjZ zNFtc@PJDqqwRxgbAM+j8V7_-Sx3o{*%q(7g2`Jx%YwQ=6dyGKE)2c*C$=jpyYZ2^4 zkKs-D(v*~xdxPd%ySA*T89!|5k<;`DyTxOC_=LyEYL!@EYXTan3r&Dq&2}X~KCJNV z-{ngLTCo-mJ-u1Qo)lhr84fdaHY{^i6|fGorUz54>Ds!_?+Xj=lhpuI6DMGGXBgRs zn84(`iEmVM{~RbN1AINxgS8xXOtvsO*g zC~d~CjJAMD*_{{f{=E08QiObJtK<3~|GXSH9t89s7Jl3!Aav2DQArpndOtezGT;`` z+H3;VUz3@y^TdOx3`UShFI_jA0A*H@WMM~H8(X)P`OqCyt;5zYXJ=!Kr_bJaPKv)6 z7-7jKDTT$R@N|~n3on%mO8582-`(5GoT}5dc^nxB!Mxz*u%aHuw&%pC#f(+KAi{&? zIZirNRysjT?A&}7uVHDr#K6{;!59Q+N?34zZk3K1C?(0sGE@1jP^1SOXuoyLVvlkA z%CEbi`S|&F$`}}eNRqLk$IrTQH(`6Zx9aMb^<1NuyO=YKF$YdqbwO+Hc@sCCT4>V2 z=A;}9yI@=6#6LXon;Y0;mI~UhQN4Qp{P%)pb6mi0Ql+(M?TMP>_?wxk7DIZq2O=+Y zcx#lLQXDKe@9y!ueH-Qk`WMGg9ObqAIZ^m<@GJV5m>MZ5tD3a+ohMc-`&@P;B z;LYqWE*dxIMx856qU5Nr{ec$ZT#i<0e2JePrYLI_615oGCzr%J#b?nSnsuG9;S0~E z^Qye-I~LX-YHIj5hGD1JscKX}&EWUWVQOcb*LHRl$`*So^PBfA7Iz?KBZYAT)nG1Z z@W{r{^p|zuN@O3#+-^qkIkW-eTjb^Cr7)b+7Mcm%xB7Au$to-;WnTJT&o*oi8SplV zBBy81_4IjsTsr!f^r(+0jyxDLDt&-W9}C>{6}yd8hTSU#V(aADSOXN%v4(7VX3cn{nMFy@+MR zgUPa2O0poT@XuQ8Df>-D!LXA9=O{JxgZ305b|cx85C(R3_SG<8*5fR~CR61Wq2$LFZ@hv4zS%2CAjzYI5Ck1#1?ZbE-eMn_av-)DonsFrKQPx z(iqxg42JVn$`%ga7h6qvR(BwStnEDnx`!sU91R8d#++1ej=8gUV@_hNnd~->Y<6}# zNZOS`e?MzNEi+A7G)N}!Sf>F!d7PQ1ecZ&c`97x9{()J$wK+mluicXiv#ZZF{9zbI zt5X{zcYN&FF+ClJXW;$Ur8`F9x-R90x@jGumcmPsj+-*9g8-CpVqB)oHH=S7ofSThqxdacA2-_E_eHcd=)JFY*H=F5HgPUHqssHQB{DLh-+s=DG5h z`$RZnK)@K&y+%Ft;fE0hHLKSBeM!72Wwv_-`me8Gf6l|CG8p(NT( zh_X%Z_D@w~dUmkd%{x11Tdpsi^*6sflyTABeu_eNZ~e3S__Vvqq->{lBv8ZZc7#bF z)vkpXW-eIN3+M|uWtNnLfqll@ZU9tXrl$vBtO?e@Q|;3lA03#d-|R~|osMg7HXA@h zt1xqw+pL6uENWp?h&iC|;N%9H;NC-DqRbIuwNoc7RwTU-a+>okDKsPFVXQp#yWMblrT6l2|SeSI%ID|jh<&5gO_$0^e(LB!4R!CHGNp-+z*2654{3doLCyGZ# zWs*kx0rU9NZwtZCa`mZ@ydA1#?CI`4($YGMPv6h$)4nUCV68tCy~vuCxpL*vSPavq zAhTXdc1_jNi3$Di{CB$8CyV`~ddVtW{2%QY?F0XMOhF;>$wA6Z|8Xd3t8=p#QUf@WhPpkrt3n^3u^dX9$u+2+zBZ3=8)^sTme~7e2yspm^lJn=r!KlVw=5dB)^RJV)G+yG@!C+SS4Tk#^kZGe$GoSE z{h{^rE#1oHmZnO3=uT7Wyq&6+M#o0|CD7`j2IvT6TyXmu>XWWCc zb2N2~+WU#QVmA1ys`3^gfyTk<3$xKYhT>u|@y)YJu>Z$_%U`gnRbYPQN)pq97l#6j zPZ}ijFsDHs**B`7&om^Pn}Elw5vliWx)h0x9Im{I(eh0V_48z0Fr3~Q%Py0##AX(e zl9Et@zD_72sozSE{CYRcJesC54)lDt8C2KmY59Z{s@A&4}I(Pru)|=45H}ukDG4EFcxaTw~QEI0crmdZX z`^?BWtLc3fGa6yVXPzV>G}XqWXZkm!Op8NTfA=K_+duGHzQJjeW2N}Uae72oCPQfD zji-pZw5}tt$~sQ_BFC5X7>ptZpgZ5=l4U$ky@&O&Lo$;agHDw?8yPYqa;fjLpB%}H@&qsNt3=?Lt6iqOv=9UV0=qB7v^yIS5S zqXf)t%ktRkq!M_)8f&agE-Q$EG{wA@sddG=#uk|R+dxvB^wzWCIv8`)k<86#Qw67Q z6kA(A(h`L9lH)S`hJ!OIMtLn3nsdg}44;;!M4V3+8D9~-Ue%*-sZ*a%xMARIqEAiv z=)%&BbJ_Ruk@R=@tL=X)YcC1nmqhbj6UJPAk1HJ=TBiG(H>&Qg7N?=OuxxR|ZkZFmRFH-!8V?G%lGdFN-A@i+)yx3>)Jb`tGl-aLn{e|1Pf=4eFV{4(W5L(hB8=? z@e_UBYNk%CgGntY9uW~E3*4s+su2ii>s8ecKvI%%@|f&L@qhuwYzDGh8pUO`T6adp z*2Z3`r5pO2_T*=J%PTigMdx6@eV2nEjJ;_WpOj0zUrr!f&pg#17bKow1_&8SGUntAuimn{ct~A$!?4GB|0ou&mIlf$K|sH%Oml0us`S$tdc)+{X5CNMgu8n3LH9kWSuSKy0|^R>|Mi{OUJ zxt>*JDX-<#-&!9I{1UR8nabtHGN7xTA4hfU^}4{g%|?;a!C;iAWj87+P<(k2G+{ON znK~}Sl*3Fi&trQxR}gv_KeZ%2Q-acG8d4SsGz<(3rJcJF)qX!1dMNjkI|Ax+J0nsh zw~-tnqva6x=m{>&6*3PCNTpVzNMg^Zflj-I`Ldw_SrTby9&(dkAYRXIrPwO7MKK1sHC2~iKFpkz=4w+aJRfcMS;mfzqM*@tqaS^vxrp<) zzi1SJ*|5|!{$Fz=5$;0n9+saKM^=k?^?vDCO;yA#XLW;_4npNh zS=vX%2+sv__aqCdFI(esa#uh(xb6UiNfuA@tEO}@oHf&-docgVQ1)lmfmd=V$Oz!w&k+& z{Y!6p;+?5b&Y+^rGbBBJ*k(Pod5^%{SN1Nb+V#V|@&nl>qjmI)g&pzgSK5inBlStpKir2vAi6pE zMnfmhLSg7r>0S=~GrsfX6nZvFJevkWaXz=3sud50OyeE##|)%nixElRClmSSwalhD z0_e&Q8;NIOU7@k88f_>|qoHm+DzEs%&>`QVP|ctew*#SPAMvp}9~_sP!(+?YVk=~Q ze27<$O4sYg9Yy@S#TBuett-#;Nog!-NFV5E z-J*5ee7)H0w3QJfZfn9ox2h94bDGOvf7*bl|IR-6)b==CkBh%iMpU7=(J*wac4?X(up4!f}ZCQY^sMK$+jut|>lECa8NH1}XX z`)ww^*^r!jDr)QKm<}{KN1fv{f&`!=&0`U8{7utyVk80?IY(VAu4~r8hPuTzk2GfK z(6cVe0NsgfKAPMMC0k@svsR`tw|NTt{g{AgC-dg79Nz*?8D|kGCt}Dw_yeDWgopfs z>#CS7FDv zU)f|XC=qG&hl?<&vcRQ69L3dSj_Y?WF1R>Xne!W0kvn#$4l%92N-bp@PS&VT5TRJp z(&QqBaRSb*m45J?e^dVT(0%gtC6G1nN4&J2vHY@^(tNvPI=E- z|2OL$aj9d+fYpUk^T9M7+Ho^h&W7NO^-+`zeCzCKZrg(7A9G02s*U&Q>6biQ_r9my zn$y>I?SRRyWzBEWA|Qs`@Hoc_K6PgvWgun>b7tut6d!K*6TV9Eh16ogle5u zwA<^{oG762+4Jug`YVLNVtXIGLw=q=*_7gedKy^43Z1eZlg zY54xlU;auXSJf^NIemR{Hn1 zdzi5RD$eY5$Z+m&%h}(+s{j2puu(^w+(!NFSpUoMiKb2f1T1qxWd94_g?;Vf8+j2l zQxQ8a^cLe3nT2 zRAcbY7CH^$^Hnh)83@lPrEj1Ay(A?AVx;0dxI4xNK3ka>4df~9M5)QYFKehLSog(K zQdegrn_I1n3<()}z#L&V`c*7MHpGqv#gh~ioRgkjs~U_{g%q8b zY*vJXq`Nob)Hqgs`Kp7sUq}2zog0rk+A;~Ei!~c67^$rPL6?u@2Ti*r5vdN&sYd;z76 zAy-bCXZtydwi97wH*Xv>;Oy*C1l8O>mnY1(g=C)W?-lDD9~sEC4n!;#EQ-Z1Sth|$ zKA|V)Q7@4Uc@bRXKeyz#z59Cd!=z5miV196X#Vqt%TMD*VFMJWxu3%R_At3id4x@P zaBUuU0Ko`AMs`%uJ_(=MWn4l$&6vGjI^o`LZpab_9sAyHU>}PoWWjzT+PXj0qc!`= z<+D|vyvSV1ciyd^%w!$br$WHo*%%`jg`gxQeQjO8LvZX=U9g(oqM(0x4M zUUB_y`Vm!l=XJW_Bhvwh*6~ukv6oBP(+{r%CVN&KNQ(HfQpqPZ9l7W&F-u5?cBY)9#g9dxvs} zAy-$6^&4=-fGAbM$srn{j}eJUN$=0T{5r33g!YHLOSue3X!10pU4rCZr@r(H9q`GN zo|_s|rGF>^^mvyp&Fy&a7_I>RfG5666$(G-yVe4~6QLSc9UlICo!27UmO`Bz37OpA9EW)WD79g*cs5-F(wCvtM9#xnT~nj@N?7Nqzk2Eb%oqPThvG!- zmiwKv@1Pgk8mRN>TEU=C=T^hQ-f}E5=xAxs9sZt_vq(sph3bKFVNCmpj$}@8L(*eD z(m*BD&C85$jtlmcCSl7VmPZ8ivFv(j)(zOt;8#6n>!M{?FjM!st$p~2i?A6Em}vCA z-b@OeCM1O{tsV%~K<kK1=%@rw>(3>nMS1@XkIyqh)U^@cRKWmh>lBZjWcxY(u zG76)qET`efc=|UZGH>2wyC2lti>wA>KB>-VKNC& z4R`CjkfB;vJ$g$vVm+r=K@-QZT(ai6*vFMdYjqPl=KII`W)>qc8mAcRq13P2 z&SVc9Y|mb?8ZED>(s69WT0+QJEqq!A!{c*=dNX`V@r6fA3 zgh8Vi@?dRLEz0leC^`It=_{ZK&DMbQ@;G~qf)==rUK-y!oB>{mS1X$gJ{L)+8tAI8 ze=8;D7uwXJX$JaupYD#j5{;gj85P-&woW|D`h%Jwn%-I<| zAy59&@_0o5Sn2C_k!y^rkM%s_q?4(2+-`0;hxnU< z^4BK3O7m4!;LQByjg&%n1?w5>KKpD01OH+=AH4UjCbA_bIh7(?NQR`1C?}@Jp0}0k z%IHet42peoeRgDZ%;gLo(lxPe;f7^+te34*dl)c{J5nea3K<#AUH{w{v}^?Fi|a%A zQsSkF5@23S*GgFk7NyrZwweKlm-9W#HJ4hW0NgKs_{A#gce>K4YSR;ZqJ`B($@|~G z4^>DSLN`OEU2=0@JHCvjAc*@FN}P%Vo1ThPQe27Eqv()Rnw^=>GYP!|D*3%98oa19_C%RhqSGFNMw+^TKp>)H!JF5m;M6qUVWxBf!fq?^6`u7LmY)r1k>>N z<3(=2VBxs&-~l7*!1Ba?=0%OOG`6};mD6-qw)(|qO$ZwVTlD2Y{zXWY>@^OHyK*YS zm6skDm5MkXoopYLrf@|(#BWdowhLKgE^(Ze?M%n+XfT^-vMMg_3kEWyOE>TD5)!Dx zmCs8suA@?qp#l?P+A|wLmcSTvX$0J2+Oq5hyyv>Kh0C30z&162J>?gD?(a6sbyYTv zTXNiH-*$vfv+JV7L+&se&y)1}KPP5AN)yOtU=aGAQ?Ea73^2Ka1C~7lUIKcHzFz%FcgYWV5C8{iETa))DjJI`C%0lFP%!9G?oVOXyDUb*o6rVir2#r?mfjPe7xW8~L1+OjfAIK;kfv!TG&KpOiYnK;36 zr$66_3o;^rEX#tr#CUs`(xeC^e%i zF{7vQgP3y2&(nOAJf{hcs)de7+XaFc_Nd258*D`mUOFN!WJ{A&RUOQX+Fww9-CL# zJk_HjajEZ4z*5V&e)3e`J6p)fbFiH5lmz8|#oK|8dHJpFcLjsJhIR?O+0?y}i_%50i1>A)s!8cv7XJD z`cDD8ThtOf>1ulMFZ5uC4kz8=bt1A0=Y2La2`q9717`1>s3)U4h|2I7y9F56F`hf;o{wDt z9vc191?DU^^u|S~1t=Jli($|5gg`a$ zHwif*O?BWxM(MX?QYxnm=|vwiZ{rhoXE6GO~T*qK@9nmfpVxnKFm1n=mGInN$Js|50CaufpjbdZ0J3~l#3TiQqfkDMuK}}Tm0Ys|J}j-8x2T} zAhZ~(^CF@X78kB{%m5X&J|PK3XJ?H}?ZE~ET&BC7uI_Q~Q(ksCWL#&}I~#|OPXWv0 zRkP*EssoQG{@DmGAFp1%x3!Ex;|U>tR?V(@gfM$(_#@6ux7@0r+5 z;;4wb$b3|`QzhSB4W@b))VEPfXMAh2sY!cqqHhAj$zipdW@M5;%+*PvdzhWv41;3G z5Hm4BBPd?(YtqHo&Zkf%+rj)do2RoMXf`J+AHk!;qQ(MVOv1OaFKeWR+x5mv;OPfG zNv372DxF(g3{zNFBTvCDHhMm}IHAjedlSdt@typ?qZd*SKcG~3K$>X1f(pFyb3s9Y zdN15>fMaoa8MWkThC2|P(8dycbbP!k0DreI$?W9f!V(__)0*wlg3YTcbToahMs=JO zlAe{?Aj!r0y)rCLV?he6E+XG(ZTPRW9QvR|Wc=|wjX^P!w4^jd>jdKR9DByk*J)Ko zeO=S$%FNHi_?K+U)>bqzy4a&(yZi(LquI)YJ3Bi#ScS+0UiBCY6_ES zh`y}z0n^EE7~)5PX42tyf3fmAvuLUU>Y2~bJ|O8eIbu8dGvuTn0}sl)9il&ShAra>L-v2fvw-!gu40^Wo(iQOiwV^AzY)7 z;>g7K5FCZSNyK`O@1mIK4aUrUIqVZ1`}BVcVdlc;3EpBnAk%>=RxGz zc23Ij;P;m`eI65)<^w-H+>ZFAt$wJ6F+ZkmHPMXVd@D()oN0+q~i|h|DiS!%f zPU;}qP^``HD(7v{svB?Y0+*Ubcx3}nS^Tfxyjd6q<6nI!#q5HT8{Sbwv?9z#1>G5l z6yo}`Ih3mif=!pXX4msJ5XKH2qM3$vYJ8er~nL#{wXl@nH3 z3>)^Mppxf=vYn_QeaW|ABUpg{9FMSTRc)qL?5$UPnkJ8c-&vc=yTWZgk=v4X@F_Dv zAqgNXU@GTHjGl}d6iTV`WF9;QW)N(bQ_Tv|g-cQr2{x6DtAWNB-wb@w)Dwcb?J49? zh0PUQ(Pg5d)nGNfIU`{HJLlZ|23?aj#4Hei{nn{E9Tr>VAE2z=se1FZY&Bzyv-79H z?RGrIUO88@>lzc#46Qc|C+|*9xg7T74GhB=V0!GIK2E(hqn!4n*qW-01uQN6u3#2x zJ-SVrl$Hu8G~Z0B_N+#mMy|Hzkz_rn)R+2Da`> zvm%^15VccWUkGff?T+w=KiEE8GFtP)Rk}kD>Xbc%DN0o&Q?gG;a>KVaYRvroASX%Y z%L&-en|gWijY35d#}U2D z$2*1+kvX;0K(F)JY$9r+Y5=BNdP0&ig1|Uz@nFt4hGjKk@^+L?kM&|uuk*unXvf zY(Cu@3*7qCgLMOqTDYY@dSPKHqAE5vJvqyZylL(JM!TZH_rE$Ql!EguW~)=0UcAgR zjcjZ2ln2vnl2ap(fr-Ahj&`nZ35R!7ruCk5`^Gbr1JC9p%)Q28peSk=fJ%01V`gow z8pm>X0?FB9^;944R(dZ_Y4G%g+?`NrCtAvJxc}@kGznXq?nwn?uWqkyHa-GmPd~mp6wPNe%vsL+W32s#EwX~&u_DcQr4Dxw3)Up2hx2*M{ zI;_{_EAO`rue4^5Nxdjv#?W)Kh!`)E_wSMwykFQ(o7-71NlCXhIV;RHbb1N~_dZ$l z<1n)_--d){qL?Vy6*pGP2h--lalgk&`z|XgAy;6K9&WYiwU6A;LQXajY!NNjlYj4S z|3t2tqX15mCl6MMi+C0&r=oS--3TWEx?~OM(J5(BBvV-)lNpSI^roG8UY-d#myM|w zYWH;A;55xs`;2R*F4g+tY1_m;^=e<`NwmQAb$0cNM2C&3p1`D}L=ZQk1Cv#f}75-+J#T@;wLA<;YS|Ye^ z(oM6Wl1s-YC;lw=w5ub;8RmPVR+YzixWa>}!ZI>Q9y8>8LATZBJs0COf0L$ve_{34 z{p4P9)m!|LACkd_kO1ri3KhI+=I#jjP?v~_Ij*i%nv*&*dw>DBZrz7TZwvD5Hiu$> zk7BDiNo2%%fw9U(D}6H;A8H{Ts#$3UGzo6L==c@#mm9qEqSq?o&o3hTuxO96 zA}5qnCdRom{t&_D<%SxjU|3wM*?YI?BZ0`)&BO zH;Dldi46(MnlQW1W1(!Hi?Yj1u(!0Hv~qijifs#i7~5lJH`=+H2bj%b7&i)VZ`^1z z=OS>x&-s@=RtuNJqQ=R3F3kLZ~t*z!>_?*QO;nX zR{F31^^YGDO*K1b>C8lmzx;m&#(>iRKXd8c@JdIU@}E2Df4wxh@t1p5Y&HM(BU$dX z2`o1#r&6f6{O>tBI)1eKaFeAaDI{k$7M)jEIB;vd+!QIU%vnOuFDNjuS;#72&zuZk zKkl_lJ<8WSYJPnuB`25iaU@uMVQ|}MnOxad-!N#A_2@-&nv|Hq8k5-9)ug>dd&R+`&ES)i(W)>?Kr+oXtV|lgs>V-Smm@fLE2;9q;sst*$y2Z`|{uVsl7uhbOL_^g|61)5R&+_?|oz4RwlE~RL#CffZDU)I; z#!gO@Cb7A{LKOh6v-t8^+-!w2%jSg3j|F}<0>CA%3$kXC2UBwfoSj7>=&lj1NC3Uz z-sGH--M*$Tc{A6fFPL)-R&AM`J!k&5pW-09nqN`@=l}->%fGL!MhUdbDSQwfRh<|BO3UC6puM=Bo?caR!FgMu~%< zjs_C^tS+_p>+ri30CL+gL5^(3%jG@yx<)>E9oTqMWXq=0huY-ObS?hO~$ z5`}HN1O<8dd-eNmEDQ6CUyrYjOWhjDoYFSB88ES4v^p7Iv%l^OsG!1Xc-b%*e+%vS zNo-1MAr>~O>l{92Qc<0`w4Vcq0j;5JvtpF=bDV$|!9+vdkW7brGA_`v2S@WW^)9aO zFipYe*lb~m=iJfX@7H-=qXc74(`s3>vs52cYv|QKB!Y9AE37M5K>p zi$H}n3vDRf=~Xw*c?PH~;B$7=DraZA_s4c3qmq&yVu(gNDL4PU0{@HC%FVwVf7QLj znq0fiwKAVdU-v(2gj|QqyGC1)5s{|*@%v3ZYc?&aUvq;x=6`XZ#`*b;I9zRc_mThN z?|AiGJjQmnzkdBns=yu;!JZw{@y%khWl-u09Ig>vO#NW$QOw|s8(s^5c(k=$LzmdJ z#bMYZ_60@@LXz9J-&j;$VylXHJLx$!279$OvtUT9@qvQyO*lj4XxHQ*Go)npA@G4X z$JHKf6p7OQo+wUCA6Bn?Zvv2}3P5jVWdDo&6GK8=CA0_p`M;c;$)AE36XE*PMaqe- zbKNXjjS~ig&|zGjFfgcrimk26tVjHpn^poqqFbU}E1=jik)faz9lc>Ften4eHk=H7 z_=uX}_Jwx|xOv@6WyZ;TeWZG8Qo7c$n3l_AW{XT;sXdj?Y4(Rya&$`|ZG{6quXfod5=KReom-$RN_w$jKg)ivfOd?>Oz?{5?Nb?|N8ljIq?L{Q2^KY0=1v z2QoP!o9`Fbf_IVmD6_Ucfnr7kLRfe@&#}*nl$=V6D1<2L$=TQG8cUNrw~4A-$%OZR zN{4%^)P>N5Dv@dkyv1Vs3pGe~cXn>Ye@q2MqCU;&YJd2=-NX5qENRJtzF9D@K2#*l zps&TCS7W)HPm}{Gxa9Shy%4S)y2|g<3Wi{*OS@`bD50i9+&o}7IKbz%vLA1x1X9# z=V#qa{TQ-@g=;gb3W-b<3wxQWzKa6R6Q<{-wgA%WwE->$u{417&^ z=}xI{=DoXgAYjNOjh`6-s79|}>+I=JVP~>ueO9hS)B-JF^l+#^%WtC6@}*=46PL^H z2a)!yWK!RS3VRRkjzCgIwEG&K?rtFG{p(F`DAj`u;KmSPmqVm)kKlDV)I8`v$1H%s0!w?1CElCwsz zB~cU^zf)eS>^(c1Ez+!h5C3#yq9MZ$3)BD2S;BSc-g9m@)3qp*j_G>e0VIh6qTwd# zKzO&?!56C9A^*x0L^B=Ty_qqtx8GxK?t1%}+TtA{j{jW7 zK(RQ44>*E>0(M9rkO_3+S+G#S&D^8nxvbvE1=BIzWu|2(-2bP=Zf0HLBEZW#L82h29P&eD@pzg`QCN zDlP(zQWk4z&Bnef=0*AuW72!T)@I8>r36^_4ZZyFOP@^2E=p;B$}5g!jyd=Q@9e0x zZYadZeEY6x{cF+$0n72w?Jf#74SlQq4n=OGk5lyqHaSq@*lV@Yo^& zr_WEWHEE#b+u_AKmap?!QZgz!i_m|4-``3sFJhvvqbCcPH0dv(R9M_gZuKT%sfAHPPP?QB zL&n&rN8<enPH7V{;K?BKeg)*~*^Ltf2)n7;$Oc}iMD>w);%1WGOr6Y@ z7KovJ>1F?1a$^i+Co_*MC~O{aQ+jub`w}CIbt{ZFKM8y|x@uhtOQ9VS7RU0p$bI?Y zifMJMvs);6K9p_G0<~azXr;8jeK>MVNb&x+XO{S|mY76%;LZ1D%z5ZDH_;j#lDtg- zn<%)7%O&&a;`inEz5Qh{eVp;<$wka-~W>0Lp{)uVOY+72eBy{_Uw(pUgBCw(Gd z2`ia}WcWhFyHpER5=YmLmAC@_pcvoaDi`52iGLE=c>uD=bZEFv{l3d(Bjh4M{2{9W z%^zYUcecwt31T~40Cg!0o5sf&wx*m3)rKpCBX9mPUjEsBO|du`m_D|H{z>zoUFw&0 z-ZYuj%7!)n0q@<@Nm&BSTNtVofew=*&sAs+R%0er{Te>_sFJj=XeG?E&0pgFHq11s&TjIO7gBCw4g#sx)B8(uz@+np)t6a-+3D-5m)k zOkVKi4C5p02zDeQ_V}lFw|8mHu-g~`V+`CsTuek_@L^<;!uCQsP~G zvxe<*K%6mlZwZ@C{MvL9UTL7MN%OiOq-1mPx)((K6eJC2CsbK|)+ycGTgZDL1l!%Y zcQL|!j6U@f?#&T4t!sQL>P^u_SDS86(rHdS)MRahUFfwvIBp$*KF(+`R9JB55Lt{L zmS`Zb;_ha9_IaR2!Q0Po+?LP5bW(1N$Ne8X@W?{2jh3L%b81Zn_%5C&M5=ggE?w_d z>d`Oq+Z$RV7Ohn9{YHcPC0<$opnaRPi-A_)n2AoG2|M@*Zst){6|2q-=<;8_b@pg2 zTeo(i6Vb?KiI6B`rvQPTbgI9w**EXU6scEh+I$tDyG}VIp?&N_S+Ys9z{2wS$$=|6 zIvd6lLi)@0bS|r_#VWIlbt~UN7caG*SnvN1fuoKne@W+?p4@| z7p6O4Bs*eP8@5I4Nj;Uvw#a#s&nNC&;9}ARF#~5~PnBlod1>S{=&CI8h+j*;ep=tu zRc*W6@pN0X%Vud|VRtE>*V>q;-%G8G!?0(0t9RNZSkvUW4J%HDF>n-cj-T;uTS-?W zudtZ$9<8Y8ME;u{uhG9>$+(~Y+fho)33GJy4>uSK^8QCS-uu0n=V53=)Wd1P^Xc`L z7;~{d;*{SOiDrn`P$M>K%tyb*)eEVq=ch~y*}%T_c#j7xy1t-|YPKRe_&pp62=nx| z@Zgo<*lb`!jaKh{$n`sUI(6c)g}c4 zASDH~9e!h~jFOT}cFa${Z*)rS-haP;?1EB-*J&gpoRuhWnh4I^>KQqu=_;C7#=}g< zTFnd|< zu{n5%2kh)AV9pT0K-}1aLVY?-x^nA?@)Y1wpzsQPGN*VfY$!0$D?BnA#>>s)T=F>& z#aNEOanX^=^SznKY=jUmT2)N#cs9}5&|i4VAA+*+N>ij*5t^hMsk z2^>wipUaJ=)-_*q>YH)n`XCC~QI2d2CcSj8CfcSOPbki;SREc80&WDu)y$G;dxIML zTeToD^U=Y>ED{DoCRWxc&&&HpgVo?xn6fVJ{18E9M%i#Gbu!bI+kPZ%*Q5iUzbP?K z^dvJRh)5EQ3)n#m@(8oHHR|{KuVqI<7F&z)hW2-(2S;bz8~&Dk4<2K2U_F;bg^aM+ zN0rt+hTwfEq-0;aC=bfUpD_UCsrUR}CZ$#q2ayVb;Mb7raIK>#{U zSLspsHN#2zL3^0qT`Um#5Pfn(1f82L14doBlB?JSD z$wMiX{Go@nl)`4-zr}eH#vCEtVDQ^5Ed1BIN+)#3WCduwDwlS5OnOl`H`&>z;ja{@ z0kIw(Rk^BAaBTf2_s{Sr_a72k^y;x3nbFzqvuLAaT)o#F;~jfj)(m)E1$2^tIeYiq zDu<+ZAfw*EyD`-Fd~_v3yjfMxU@`@y0V7k)d8zF)_Lqwl@LqVFVfB9h^;}0Y>$D6D z)7+livRl%QP?1rKTJFn#p22b9X@C0&L@zzO{fCdpB2!pW5!Ruks;X){ZRo=&3^`_z zMeqqY@4JU~57Ib4e#ac#2pD+RLNM|Jrt?U7H}4uvBHkIXRN=p!yehd2v^H-FMlFAB zN>V!VsxfKhx63BkY5A3OYQZ-dhq-s9Ms!mcYME&N30-t1u-MPc_VpR)tk$_sUJj&C zE{oh>^JY}_i~}4#M^%Yn$!=NQ+x zVm34F=QW}ELZke>&LP6&Io6Y~nM+eT`-71sDws~f)D~UCXAe4UlyZG#xRuklh&C1sL1mV@66|`Dkd67>wb>s2Aap} z9f^2&D^OBX3u&s8gWIa%cItXDZqyBiHTadr#sFdN_ql0+lv)fCpH_4EZZVpa+MKM9 zPuwa!7d~nNjj0EWR1rY#UfSr0s>uVt6NRM*>gNXE=Jgu7o3 zs{M>ck2){ZEgNQc9=kn@g_n*0^x?yY#+k7ozM@FChS!!vXCKOoEY$DcToO|NbS`K4 zFsz#!W>(GU-*o^vk6e*C`0U>nkDn8%ERjS`=3^cj3@K_%xc>xmPE>R@;ONMs^@=H{ z+mxe(#OLlT!*u$w2UQd#e*Zo~dgEaB45;hs9ge8M7CS zrVXVhICrhW0lA-FTc*SbUY7CCvdzYt!Q}Ed%RfTI;y0{$= zH=Vx}__rq5C*FJn9wO-ge0}dE^Pq`|`I?IGkwftG-EPbKVdQlw%9DDa3nM3DgnWiQ zaDQhHmIvmOZTr#D5zD@d&9~2SyP;lc#njVum3UU5$1k)-mjn$?n*HCg*BMKfmk*j4;pv?IMYb@a z;A8a%EO{{XRf&LhO2Y}2SLASh$8-3Tdl`McYV|~E>zALm{!^(fA!KCv@~#jXQ96D* zz`i(pbtHwC+>@fR_}kIqIQ%oVV3SYpHMmdA+nod}9*G$@qw^GeuCrp7&fvbP-t)DI zz($6Cpe~VqPyDBeCmRySyd4(9@5N(5V{2Itg1ol2WYifxuT5OWJwQ674xJ<{S}gl9 z6Y^3^i>TlY8b4qO%(l6;839C-*45R6x2_IB{0Cd2LK5`8mY_-^@xa9e$>undeB>cT z0q=qN*-p(wjfS1idrl_p%JsBn7wc<9_ZV)YYn#HA4KDOPB{{kBqE_$frt>}kXmI`Y zoZ<4`-*9{5#4;R@m6+Cuao%KWY_lIQc9`8ouQVyqsy2w?2mlZ|YeGhe&DEr5_?bpZOG_++8i|KR zxpkH4yzqVRtFP`^!;GIb<#azpZ$+-wO-!)dE=$`w+bgX;yiyKdEK3*cB&soyk(GVr zjOcA!(*7VQ`VR}^7?8=$4J|9zmlI-KKvlL#P4^ZXlZ?CuGChistp;ld=^kWp3TKEj z;BVpU^vJ6EvP*>NdRt^CN;kqt#}WNeQQg zN9y`dX6xWt&U!fCE|-Yi-s|eqelGbu>jSnq4w%mu%|57%f?p8p?O03(CXQHbM1ag0 z=LvZh7g(g2&r>DQbjlnp(IC|w`2B#^DdD2u&AAr)4B;gK&b+QSoqz8{5Df}8J>}(t zsGN<14Z6=WAnb>Zcw^=iLkarBa%jV+{~4l&OeqGD9jDGxl}^Q^y+ z0Y0%9N*0gF;g1}RP{QEsuLA3dGvsVWdcb8U1tgxhtY*X|9~G&JmaH~E;U<6Q)>{`f zYmgYcHs6<>FPvfH0*EAtg#{e4Ha0=J*+CD0N5x78$2iCfbgn7HpFocrV;Ur@ zr%M+|-gM>QSf|eLurX#!9c$ns&EkL|dC=rT`Zb7ZESs9(!v^ShrIEW5zNWq8e(S8w zdA{*%$k9N_F4bM@EJdu6y=Fkc%!~+#VpMs~rB{hszG*xrl{95ml-;R*+;Tt|iXLOW zJJFk3;1@selAOSJJiZ@L;Gi9Q2cU`mg1)3d`-&(Zmc4($Wj1`5yBU*)_($3ufk12c z189Fbx7J85&hxX54-6VS!tZz3BYgx3RuBqn8hDl|{o8K%A3}k0r5DMAXAUjQQ}I^i zGlK4!-_Vsm%bs9N+ypLE^U`@Y_p>(*l5c;+$XLcX0TBR_gZ|&OhErdk|QG@~sA+ z^4}}H|K(F)V0i&!=nMq(gui&dKdA!$^Vz1@R#jVVDkf&qym*4?=_$C2u}V|pEn1?Z zRIxaA`&$CMdX0cKF8<))TR|bi_~}G&^bdQnB?-gZ8_)CfR(`;Nacm6N6W>uMm8ctM6sy_n zUR7_aL<|+nQyy*~O^7j5eKe#L{(OG8{h`t#m{iMhaKF)*OIEN0izF^Py7_J^DZ+5) zb--ZKq~F1z-wu&ZVTnoFi~V5kZa+Nd9~j*sS=M^O!6L`=p5ar)%URXAZ9cc-=Xj;t z_C)SrPB`SB{ughB!|(-wK7$-cXzxm+ki=(fMAb|`xaGtr)bZ4Yk+f?Mjo+cZ25Zx#!Or&Xs+$(y^ zW(s0qBf`j98GSi8P^6XQkrltnI{C0}w)ALVe^NNnKlhHtds%a6;# zk|$|M9?|{Py$5TD@Qu{j)J|hQl(RNwlVTX? z6A&5%;;k2<>WlcZXzQ;|oViEWEEleaGv`V6#mxY-B?XBT&6g|&X0I79FO3sbc(0Mv z#LjniGmWglAKw5DB3PT7AypJD$mJd%@V)*`TMieEP&0^GQT*teOygx;A#@NZj7uzDf&G z&d3;#kHtI5k562@pNf@N&~)7U$t}{bCnFGLO~K90T~J({-QG^hWknSqB!2Gs!su|} z6AGo&>mHHE(2kH5R88u)QmMT$hOA@$OCV>22n|7MQXUDXMV81aw|=jmOPCuapn727~Xl8TBx zQ!wFb1_9rubBj}tWZR#k2!5powFE7BWL^*>n!C@)saU0f7G1A&`8F=_pc#T#%LiVvM#MZ`XyD^K8`Ef*MIv5t zIev)Ce7MYEPhsu;+@u=WwV+8RVU}*_skl2{Whx6fzu`$hBS^_{v5gb#P?L0dc99c6 z)EK7KzC}N8bk*F!Q%ZZfp?4LorIopds@Z|dwl=BrgXP=(1J?Bk__@lv zjG^1hyqW6ExCz7jZy_jY(@W3O78X9u)irs&B+N6iHln*0Y%b3hXOfOZ5!Xf&x;RmM zYQMnNfi)u^`&iu95y*ur;WYNFOc;hPDxeDem@tHDTt{*0QoovucH!4i#amuS1;s( z!kn+}+V&(U7@G<3WjUWAyE@Zl)9aohaCO#H(%q7j?_D02F5*l4A*AJTR++Jzb((23 zu=8m1oUUfD#NSeUpFCZuufh-$8&w(>R)#6+s9BPt%`8$DLjPb>F5ryXAmkg~(9ocq zYJJP%e%HbDp8g@z)6CKa{cBoDH9gm-YBywC76ax@=q{Jm)i2R{t5Z_fl_-}cvi;#%c)hJu4@e4GM@%O_B$0LN{s9EUTQd@RIl*(8C-{$+e>P#^b6 z0voTgY&RUC=KZ{^&}^Y)cT}SIS-|pusuTwgv8nI|GHXE z3f)2ZW9#%+)p=_LoB=9Kov|>^CwweAxAA43WnWM5`%Q%En9X<1j_m9rxV&u9LBab} zyH?q!1S&hf^jo%Mv(f0@I~VND--G4rxVXov66@u!j`+?uw+%NH0S{oBxUY%_GYPqQ zhVjuGy0}~tSXAijty-^O(8n8`FQ4tUuIFdt0^9UlYOXO(kXc) zK!o$w>z0Ywx=U#u0>PG2PLW)xNic)>Ctuc_vs1soMi6k zHqK%KJqh=)yd%uz7F2Q~$#G{V^<~XQh8t02=|aj-0&XclWQrav*zi zLKr3>w=x7K-1|x56NwpE*DK1?^{kKj*(So_&F*(2=^G09eQS4@&7Oo71@X=dS{k}t z;lXS@ka34*h=5F(%Sk|u!xoik>0K$InL()O2cmziuRA=0mIbDV7GoA`A@Vuz)5CvO zdu0N&+yC|g`0uOY?STDG4dz$thb5MWmzzu^hi>NBobLAaWXYgqeD#%sJ$?^9hI<}5 z#Enb%ro0@A5UH#}I5a082PrdUEr|oe%On|G4l2>|qCl1^KrcKh$-Ia8Fp8H}!_uGC z`>NApBhf7o^Yc=E)SjST%+;B#K6kVEyzZ^%TO6!OqokuRl>thM#rcMx0G@-Dkj>4*0)46;VK-C$|Oz{!4a9!9$?JDhQrUNT!w>5 zQa$6$dCi)2(V@O*SXk8L#@A&eYp9GP5s0X$iU2j%z-%{Whmf~ZMWB&)F)yQl^SXO_ zKI+~r(NL4qc`tg3FbuKMb%E!MqMV^#1heV9ow+k6gVUBGI5a!QliUM05Z`$fl<){0hV@WKQT!%8jyC8usTmo)T@E!K3nE3XSqA zGOG_HVTqMC*({ipI`1+%cX~YQbRE48BnfJL%CXZ6!U8HFZpNFzxTMXt%`X#oUS~-mbX?-wBKF(aA4S;WwqLzl;iHo zXkzY2kD1axl(Sg~MPuAl=r-PavnVLR7zavhzP=SHj@?;ZEva4@X&-E7dQS)AYmPzr z9q`Yd4&Fst7YTN~L@>=X*JGBXQ)>>gNM;o*ag^2}MUlBNZ#tfPS@UZ7vq39UE&J_1MD^a6I6FA|B=_7T z(e?Ic*a#hP5Wx;G=7X@&gRJh;zdB&%=ZrlymHR~NSGK=cb= z-`g7nNHRCAVN2O(FS6brc5iRqE?Vh@zjh-IiGr87zUGi|cFt7zatF_Tv1uP-M5pd69}~Ok_LFV0ia~ieZ?XPP#`MJr{SySWrfWE?-5e zhX%<&)@f1P@f7RVXQ+G92&e>`7jkQTSd;G1)m*LJ&U|LMA0O@(?ga`8N+_gJQG6<33d*3OqWYGVyU@0zsqWFexEL~Z-#nUT zt>U^q9gg9v#!z(zgc&(hc8GC2w8RMl{e=kX=iHnY|f4=bCc+)y*h zD@21Co=yDJs_il$);x$|Gpe&jf2HH5^${l zEufpyN!HBMGbjj5!pLYS-n6sI-i@Y~>+vj)feZ}lv-+rlI#_2)D+aCHQ>Ah zWXO9+=9K}MSd%i^X(rTR1A~!;q}*IQA4x>*awIFWhnhqOru+^6j6=_1?I@s-$>lIMnM2a`#xe^I zIuH(cnfuLH4?0uf9`+ihJ(K{TB9Mj$PQIzfij5g}1TkcGp;%<*9W8csaNoGf8>{%G zYwVg?zPMr(tWh7%It@JE&LQCHDb&;%y31XveSecfG5MXT8=n!BLx0qA?$xO-0A z3!)~Sa2gK5vl=Y;dWnlX^xxsT|Jr?3#M;XO8ik61nP0ouR8+R^$|@(LY6N}mh`whi zEq~AT3vQ5mfcCvX1X_{Z8_#YU;Vy%uvYf&G{)n|TxXy>FCif3d{rvI`lC;}sQ9-!H z@73AV{Hh2f86qOrJlZ?0KE2+_rqYZ5hGZQAE#4ZerQ41siXw_^&rxVD(q4HR3W@4fC9RGmM+icZV>Da;IlR(;n} zQ8uCid~CwERn`V(@gw=F4Ew7&xVWhHUi6l|0Sy_j4wsCvl71y^u*X6L#U`7N6k+de z7ZsSK&!`J=pg*T5!uLV&uEK*L{w4C$T1}}v_MCVOpgykbdk3lXdH&*qT_wz;kKcp7mI&(QiEdz?KIjux~#83n*RJ5X1g zaeb1J%$yuyL=G!bC8ZyRVq*Q`OJ#4U_xAR#-vefRIr6!c*L79ofY)KZEkDd)9G~QU zett35*JpcxN1+B!i`~Fh@qE?>Ywg4C^pEoq_uzc-SZzQYndWS3fmK>A8>iUyfh|hd z*>CH+%vPgkPJ2c9cRXg*1OGvov$f^a&vrMP)61i?w$4FJ3!eX;w~Ty%Ke23n>9TG; z``3?sHgfHhn`866$QMLrQ?tlApS@{|37zhpkecp?qd(7A+xwWS1yRu#7fp_1V=9c# zTV}~vSTqUG%jcTx4o-(6+yB6|--E9=IMH@*y!(udg}wLkwTTHSSIQh1;d*a-oYE3N zE4FXk7oF#>mDm)OYI#h(CQ=TwsVg`2_jZE{TvWlvxIbdq3zY1?-J^n_eWlDCRNuPa zzT9+;`&t`|gSw%;Nk{ya`sUlj$8EmNI1}tJz5E{gnkX8;mn!cA zB4z{|&<%kvPGz5Zn$0!-P_}BTZgfANovw0RhV3Hn1L(a%s;c!FntgF+P%(F0pk{<= zdT1HWOFLL4IsT_?4EsFq9rX94ir6Y6)cwYBf*0XhbTU)X}8nw4l)oY>?kNlF3v zXu~lodZjdx|Di7D=mgaJ7LPuflK z)fBO&M={8`&mefj5x@9iUe3MNf?ff6I2uK~60DPlY z@(FpwjPKufw@2R@4%`gbKR;@zdpnBym(P|Nh4byz3?9n<-e;KTZGt`kjIB_+SLDr_Y|L za>DupNjvKMaJ?eqSh3%($p3u;J_1)>D41ASr!46I*+0LnC(!wrBhAcDS-n^NKdt}2 z-sLgJA}{z)+JOHCFaL0im`MQB88(NGck2K5&q-rg$|w1&f*E`1BAh)-9NlGN+< zP9cq%%}trRnWzu_XCh%aBYM)1WMKWh^5N)tJ##KY)=9LDy+sHcg8|-D=Qxn@I(h|y z7}Ur=vjb<&Z!h-U^$!iD18wM;n~3N_wGjiLbP9}BRZ|m5bw6EXwV#b~^C+RFQkMw8 z{5hrdKmg8J%lMmTF|fc@#DKdvw$<}|K$f&M*wHTFoItL=xbO>zNQ|{d+HD^fMDB6Y+9$0X6}6@*ZuvPmF`?PXELz(x=MziY(`+9_L?*R_pit;s!fTB!x~E&c z%bxD;?jcA0xG!0@pw6zYXXyawd3s(QS+;SOY4PQIiwn_VeC@?)ZEkXL%AKkwWPZ%O zZGSlC2)p~gtkM2;;pVYq-1iI`roAE__gL8*@6L#h8|B1=yul~@b9eXmYZ320!CVbf zu~ia$*@xEfc~mZn+CBAlKx^GEB^a^(^fwpJj^BH$G~KZkrHB0gw0HlpqrFWZ?a!zC zk~{7H*RAu1T|_*h0}mV{-nG!FM9VDMK(gMB4xb8Jo1IE>Em~W{d?P)-+jG@K=M~@o@{PzjrUEOQnMaL3#&PQIM$S9 zG1BH?0oUz4xt zH&PrN92$E1Oki?Vdz(U%JiTyN@`@yyxG@%pl^W{`-fTBL&FgmMbZrR?+Uu6q(9n>~ zl`=eSjMl!QV5nh#)sWuqP`6q!8*};o3KG?gKQWu?|6B^~0h*tmpS_VuZO6c^RWMb@ zz6sqwP#8v*Pf5M>fV_6~;5D{mW4=1mJAklX-p=m#eYoaM;?1mUU#`{@4ntciY}$P^ z2v|9hU3GlVj>~Q0dy=w4-yB+dJSRRmSI#MLMBuMEkOal!Bbxr-m#1w1j%`HCM`p9y7hGn=jpO zgh~%M8VZk#tJ|wnII;__FpgYnEmj+O?=;xhTfS{)`<4%<+BKH9fRy|9hi6X3r^Eg` z3;tiHy0#h|8vzWHvljxyKC51`lh+p&sReQ?zqe4w4AMef6f8qpHfqd-7{sb^f*Oebd!K*PSj=%)@m*a>{g!({gP-6_yJU4|ug%rN@t^j{eM;NH^LeOanT2CEibbD@mKjMCOIewtR?C1Ladu;i~ z2dFiRi2~`MmK7r-`_)+w_Yr>}pTJ35t1s+*kaX(MTkKXe`lrmlYQKH6dXKm>PZZM^ z4A3dV4G^!w;5C2MhKDmulxh*JKKTi!+N@hFyn=YwIyOA4AAqZ?@ZBX*R?}V7hT6vQtP*YU!Qgm z3YP%RI*fXo-Al|=-j)}Xv*0OT;@SRl zbj_X>$#O~#4Tg4SjQkrM92XL-{;1pnfFZA=@~LN>@)cqAc(q^Fd)%Or`NDMXvP+SR zRJZsjCw@D5hs$S%NWftg=WxvZ79>GtJ^*Zcj3>x5%kjZSab(XVKLx-eAOs$_6@D%y z+a;{5r&UVug$XB@W3~oa98jfLqVGv3$xQ-gX+fS>VlOHxZK)k6kAdbt5qvL3@aFE$ zhqVzp!}^-rWB0cFZ)-L)@w6LS#~M}xzBv^=AEP0vMWQ0Gzk#UR`RY87{^%Ub*mRBR zTr+70KxL%Y0v@ds`BA%f(o7axLknb^NX>h)^ z=kft63UOA)C66r#9%1W!@I1GPzT$RK*Vfw3$qG`tq+ z#i2kj&_G5;*0QoJ=0~+?20X{(igUUAHc?ni5;7BzT4^!$+#}*@_2A%R?O=*nn|Ja? zm+oziTFzsV!V3e57R{7ur-VVwRyc<$bIAIwY~zW!t+5_6ZuuL{jd^VnCjs~Ud677X zU`=*Tf+q!~$`u9Wqz@?TrHWT{*t8uV+9+Z2!1_Gjy{DH!6j9 zpF#*2(TBYmw~RKVk7VmP%jJ6~=;0{?ntJ?<)S9#E&Fku9BK^OuO!eW-xL~rxy=X&l zwQnBXWuM7?$=V7i;N;|_SWHex!0j8JPO^Cz>Ozs+Q(E?!MM#XVAV%2z*%iz(%=mCZ zzNuXBZoG}=_CB~2u*i-J=IS+<-J(ret}C3F2q z2kvysgHukt{4U?s_24iP3UbucFL{~LX^>bO)}8Lf2g-w zCAI89C-X;@-59in#xq;UoX--|S=)fW_@C7C(la=cmL_>bRhT;&mHljtXnY}FNv=I- z+hCWk*%2CIc)k-6q(i`!RP^f#%YZ(@(##l^4a3`Q-c!{1d*jeZ73WcEjco-m5=zyY zvd|Vt61D|S4PnD)*m3LsJ~hI{GwV20h~$r3>Pk|ZM2L6`Ze3OCmD%?F-1Laz5^XE} z_ftK_?QvrjR8)jGIh_?06pCc0RlP|{AEs_i^7(jJMAspygWaEHteUes22>48wx#)~ z+&w+Z{HIgh7UWcyPsI=aw|ktwF2?&si2G99R%_S^v14$U%hbSbkZl=iaPDvtZBezR zG;H#{(ajhU=Edz7WtdLEFkV_Vf+!9JWz`KKkJpLr+P~7Eb}J*Yng&Oms~uwJK++3l zgZ{S5e#pa#eA({hY=Boll$_HWHQZGoNxI5r@R=qBIp58_+FZRg{j8QoM>2h2dUJ2= zkdFOWbw9v;cN+a!-iJDz?V=ZE2+Q#PeN(5!#`1UfQzB`3(bz3(i=~Pmfaq9+q|JM5 zw-Zux=-LU9WS5|DblkLMdkF1vOLk_{>*sY`?hQ+3az=-2hg>-|XFt8OS}CVYNpH`P zTPjkrb4*}zh8tE}yID_mJb8MDX0}_Q*lFMr&ITCV>|u<{_sIdZVfz5%5YI4rs^>)$ z+K4P!O!*tK?!KJ7u#iLX#G0eELw2);?s2-)&djS*9<{GqXQis155I;6AHfQ$!%kz5 zqUae%;y^;rYt4$vT8!X{Sl9O#_ef7}!P9Kquqbk}M9gX_kD-7(Ee#EL<*0|Y;DjeC z=;+bR1}rQrBb4IJuVQ7b9qrTajx^p9PRDqbp-OtH)k*Q_Pk%$JSHWKCSn3h@$8&WJ70X3Ae=adgN({PN_V z$%a!Gp~NYs2bUYxr7w3S5W6Gwnv+#OllUJIWd5fx;Q*&rhSC$Xq?!8BS%@4E6ABuR zKe%2Xc=;1hwg-gA01 z%TA&K^XuEHkMkRG(GRc~lzDR%V9=E13LtWL=os!d9!i?sAio=-w%$OStG zDL-a3Q`QEgjMK2De>;)s!~XhwpqfCOm&Boq?_F@vcQm+RuD}n}_pI6G1W%chd2(WD zUi;hExeoJ%q=XTOXOaj$1A~D`?GQ|u_L!td%La$z^)0$@q?|WYT|KluA2$x^BcOT^ z;ibd612-CKYQ=%ISCdV6s4zM&W+f06RA3CEzp$Ff-6D?`kt^{Q^1Fv1vP|fR>65Gr_WvTuT-c(lPHHqM5 zcWRv_VrWl-s)XS8Q8{g|W9lYK(0Bkwkss02i6%DzT03=OT#iLqmmvEf46z|m=5H=u zK8gJROMKBjKtgBrv6(Zbo!YX7= zB#^?qRdDc_V&E#kYdX0y%vY-|0e9HtkhOpHv*g7A-&R%GovJm+eNZ<8-Rky=OuUuw zwgPWZ&(*k7LK^L|6^hH*FRzoi6^Yo&q4Y2;ko!lComnxBQyq`PNq;GF24g`jk0>5h}!@& zgn)ivLXYyoLS#rvN=|s;t{-lS$Cv;8jl;puF-F$IFNx2*)SDN686Jms{~#MEBh~8e zl4kRmG6+LMdkbtMqP}t%G&YnExl(;Ct{ZJ?at~8AEmThtKjEnbNi?6PWfc15EO|OF zcV`Wr-dAn!2WZ&3rY^sB+nW*~Vr(JhnIdj+WU0c*e%I zq*m;6SiPH_>33XfGnw-!2rmjOV1d9d2?!1`?c0%Q&c{Db zM&g2NwnQtlwKnk7NL#~;GvqE-6YY|2agQvNS{7+06K%EfH}AX1$%EuYmrL~hfGV|9 z`vtX(z^IH!cSnby?AaWiB`sLae-OVt#;ES0xxx5uYdMfUAk&=r(&@sL)$E%16F#T9 zHS(oSL}4Yf&_@<&qG6h0{p}OBy=hYS#AtRjbn@)J?ZN435zS&&_tQ0@;>}{L0_HEOfHM(u5F?=ViRF-vig3DlroVb#N)6O-DqF9n{SUj3c)G2l(dU}&h% z?@zsLC@#>;UV|SRT=o>%));EN)juqHI5C)IQ=^1hFN^9QRa^bBzNW^x8^(DVtHKNM z^U*<;I(S>a8NPSE%!>y^WU1qfxd~=`^Cli_Q5slPcifUs<$%NMUEq-Pp;{`YnqdN}=Nqj^> zUbx$si-u05BZf1wMUxe`R?wRhYBO?i1 zN(X;70dVET_|mo|s^bl$=VE^8&e4^JIfg4YI|cMuQBK$c(%Acp+`?qmFs$PRz;N;~{wrTF!Y@iS##e}5{M@KjKZmX?r) zoE#JH=>SSl1%SUqHZ<7eBM3bK;_!BFCTtmlx(3YFuHUnWD$|g^lc^KFUkpA@n_h{j$(q?g5&XUlC-#0O{#7iq5F8Fq0|3?G5#t`3#Yn1H#Ss zXMr6E;|w}th&R}F)t>o9RSLE-i1|YkO+d?)zkO`fGd(pK5gSF>a`3GTO~*OYEyWP& zrm_P}$KRo@=JeBqlWJ;vwsPBOa_&XYkqR+fVtfa>nqY^%jg1^cvHYO+hd`@RzhOb~ zB!usPWgC@`F5!gzQW&3%3$E8i@f&adGYEx+nFX2 z0`>%J6i!5BWg|#Mb%qWSccX?|Hgj7}Z>f2TrN0i=yqe_w$~64tZ0pIh^KIjpUtEb@ zXDya9?c-abWtIq+hXj(~Y{9j41gd(zSo_fJ$p;_z?UKdDQ1Thf$vHj+MHab!e5p?) zmmM|n?2_3%M6SNIJA_!hVz@vO*^DAU|42RjGQ0!<)R=D>J^%abw^LY4IfCA__lp_ zao90_`*y;xb_YN0c2Q#fbn5=Tx@%uL5vlKwLx4Z>vAs>T_%AN>@#?0KoMnQ6qy@0{`!p(NZSdHi!T zXRgi44{x+xu7V<8PSzVPx5iq2XiMHyS%px_MzFJt&)tOOX4BT=vpZn=Imo)drdD)u zsmG{v+GuOYCbdqDRZ9DXO2ih|$jjSVvC=9vksD_721`f}ML%cRj-b5tO-;EMArX!SF3(8}uG@Vof3ds->ml&5Gy zDT3GP8%7t|{em4$+qFS+;p)bh+*cjaEn_p~nOG2yhr`%TII<0KA1d6cNF=0Pfy4)O z!51%Hw1biREUzm!)ix@9s>XiEPMQe^gQiO-Tn@T|ae%o^@N{-=Dq3^(a_V-jRI&s> z`g^q1Wmp|k3bVB8KHsB$)<>sq#l5+;HO9F*qpH*EE0ugN=6)Fwl`C~>D~2Q=8mkpN zp>;7y?!b0m9cTeCkn@!nwzsyZ!2pk2R!WM&uiwDgNd<8wzqlA6GO!D&#oVm+q_Xr$ zP?vR{8TL7G&6RUHZwJ!vcBCj8H#m2*6yU_Xx5kcPmR)u@mW9X9pDyQ7qv>4KxLA-# zW{Q{zt4aoGeFQ-YT+Fw&x8&< zfK;5Z%&-OV5P`B7pLcqJZiOW!uVStX!f{URfa%-RH00*2D@aB98WtP)kOv8ZulZNY z6K9FH_f=Q>Jqz3Hlj9@XJrj49=F^sWsjTWPHSgcPeNKGY0VULJ5&Tps_Qh};*Ci0! z+;c^yqWkWloqOxGoz!K@!D_my?#b;w#ps4u2+z0r?4hE=8`J%1EpfKI-;=cda7>hF zz$PZZegS)Jt%Mbek=t$0=TaALFcovkh@mz{ec0}2kS#@=WO}jHs88pmJ*+v1YM;Fl z1_s;sNGZw7cgz<8mY6|Tp!;vrYNY9WnE|()OLzRvP*lEKg(jpBJZ^vGcL98DM0*H; zxNY>;s}AF}&eKQLz#;l9m}{@6qVauC|DXy{u9SWmL2~cdec8sqY^84UeVAeD1Eoe? zMpFDowG$DbE^vn|G6J4{Qi*pr%+CA-Wj>pQQ?lbfD7t=_qCmC9eepl>D~rjA7J_wn5~vu1A}oKBb5%*f|n0>d4w zABd(CwN(Ul^%I}O&4Yr2ccBPG*?X#+=yV6K<->+w84yHR2Ke#6Fz)Z|1t_6>rr z&&7*rm6`>joH0^~HDk49Wxe)hOb0z>$l zRy|hn4)^8*0;Qopz&O<0kAfIn|<>i5N_SDWkL4);V|l}<++mO|Hs&Shc&e> z?Zb!yB2^KQ8W9DNs`MI^EvPgVr56za>AgduB1J$D>0P9W^xlb5M0&3QV(1V^Xd#5O zZ+Xi1p0j^@@3a5mT30Ssedd|DXXc)ni(tnFh-}!^MZ~R8MTu7=UiZbkRYnIzmKV8^ z2w;+MzxKdalMB(feThC(-Y#U`c|}iItz6!8F^PLxZV@dxwJK0&(s8`$C8qyc$Nxy> zd-0rT?(F=nYic$`{c=~ao{pC56XZOO?yYlH(AN9Gx>v7WDWaSzFMkOTlxuITgh2p6EJys)#MF>*9AhlU@q5sS@ws)8U|2 zPmmfjIzE&?Z7CNU6LWr{UXdPivTXd)MIbbO8pGe%o??>4)T1Yf8fz9(UIAO&7kmeBiEPMkIJusvGHryUdJUrLMWiM82?Arp%NYmy|+ zkxM^1j;$e}O))kr#kc;(H~K{8V`-m2Wgr zt0{iXUpn`TV3YFXCpqxKnZARDJyjS5X?R_@`N#gTrZABozncPo){bz zepGiKo^9hFsD%rELw_^JsgCN}b=&`X#pyDtK+0Sz?&Y=xmBufB`fDUj8=lM|!p9r- z=WRp29{wW!ZO=*K1C&KWDkj5o^1igl6P&w zG%{6b(BjN3spa8p{}zV-ecxeCK%kGW<>-WSL@;_4xLR2J~`ddt+E`p?T*{*Wx)zL9Y;XXSJUohQQs2wj7T~J1{&s zpCUCXwcCQUVC%Zl!42Tj1=H{Fe@XEFe&~uCV12b&7b*!@@<=m z0RVJ4^^Ke{IiBK7Q)z6Te!jW$;MB{zM$>8)-dfJTYN3^{@&=z(C7_g%OjJ9|T zFpbs*GjlDI$Qt)FV^F_Yci(vvJ{B6qu};WN8hhg|V84(7|LnOo2qZgi0bQaBC1Ch_ zYrBuSc=v7NGBX`!SPT}%z3y!3JB(Qn0K!B;+1ay;8@^k!I=^}{Fx#k^xu$_#nY~f7 ziDqVIpKEH~$PydlASCB^lZVx|W_mgN{EwfQ-?0oPL`}**Lbm!Yh%Y1qLrYC+5A}+U z(q^V6WPs5tc?<;WA%8xqMa;G+yW`f(qnlB#5g+-Gs_mWtPyEcOF&Sg7?LP-yzgtwv z-@e*Xs~P?5LQoD{CLN=qqVny>T=MeruB5?sR7;)t0@hEQVPIlUcI1@&2nM3(-jP1^ z^z=1u-?pV450$TrH-7#cZ|C*y6-{Ez+ToTy%h=)_hA#dJ8~ZlmabRf&ez*B*0xPKe zb5soaR!109E*+>Lb`{~yv9ii>eN#v$L(TflNA9{z)nJXa5}_$QPCY&4-IQtc5SUWs zNA;tmQ#V21NRv+2Flx;y3Y?L#Rg)$7wfim5bVqilM!C|>gH^>%%hmtvov?th>0A6Y zL1UbE6mI@+;rgdSP(PKRZ+y|?Id}cL2E}R`C1)F(tGwVW4FV3tiW_}k#M(WY4NIyr z!TI?3C?73#_QZP~xt*Jsn0V_v<8(<2I>{%`?`>dWa^J?rW-<2h zr^QSfUMedquftqhZ|f=VQx?SnURFo3$k4q=8MV{uZadWB3dSzFRrZ+1GUZLct6ofvJUX-EUeMEV`2h>1v!5IeSQx#0HI-IuSn%o`^CEq z*cq|&qP@^^G)mcZ%$D7z&6-RyYV=41W{21M|3t3lYZ)D{rrT9zPPn?lc5edRXQV!@ z1HIxoJeJ-K2qq>z`QLA*FP@TBSf2d zVqoDR7bSO*682u#N>ljKobkqLqaG3?uQ_nTMVzBjn2|s z1;R9kTq3`sCZR4!Nx7;ysFj1ct0ZlS8tSf7BKz;U(gQZ z#*i(~!)$(=*&1$t_*F~N*RiC#EnbEay(*S>s=xc@j_z@t+40VW3!NHeNtdx(kX*yF zEh#af$( zkE!k^f22B|0#h`Aya>Ocp<(9K#^U0q>X;|Xs~ircLj!$mC)H{U(jFWwf+@Fv(O$Gz zx0PP@%oCU1z7=2(20XS$cYx+X+B+ZWX6hGiZxz-$|FgG(Bg~Zo0RqF#JYpIv^u9Wtw{+e;2Awf7_UXi>SOkx* zXMx6B>+*8fJWH~oIts_G&jGeeQF1XNq9;7(mn&;*#savcY`vnsff&CI4n7E5 zJ$%x>cWrbsH}Fk@v_E2a_^BHxjAwr`y*$1?xp~m@==gZEL@IA_Ob@&^0D^Aa%7Pr6 zo!AlpL7Uzrn_k|XYghH!^5Wc9Fus#m%kWy8ZpWi^fE#cOTfqdb zFUk0O)qS?$>GsUd{G^wh{j(6_a?3T#mYzlKNyd{yyvd!+1Yu#=m8*ZwC;FWLTonCy z{CxJOI{c98!ty0&Xo;mBDCmeYv#%#UvNQO&G9DL>2Mq@*PLR99(lwMR1yR7XF4JUP}Cx%%~O`PB2_ zd8xn=f`~`I-}lwB3wlq)2HKO{guguSzb`~s9lG6wS+%&m6UU2<*olkm3eMen=y9I< zNsTk}p@xQ-J&N&9Np}CO<%W@`YM@-sHjGjQI{ZLSHuuMUh9!B0S-}qljye!S@a2bu zqtD0k>4}aW(4@_uKollmgR+n}g*bkxo2@FAB`7EumKD5dRaz*@{#rJ#)N_qW*nS*> zO{-mWcS_}z73l+dz1%hNup5|NRm@eKT>99(+BsaOj$iEOF7Z!gCAznj_!lKgOmYl| z_G%qq?hN$RtdC?a=ro0YPIBv!m{bkX-1pn8Jv4rppLU`kFyb)(06oa)gVP@Nl+x5jUTIxBf<_qNp43)*KsQCZ3b zKzf81tS#J`Y@QqL5rz76M-$E>moXzeqMahz+S1apyL>Gw8Ga@z$juT`%Z4$B{}_1$ z0z65lmp%=sr!VfmXHNZ2Q2%2`t_wV61Be>fFRARu-9@i&Epy2GqMi4gqBaQVMy*^3 z05bP>?Jb%F1akcinBHj^7(Foah_g7xQFh~k50HV%Vpr>&5bB0y;`UPR?WgwKJmbDF zE=Sf0sMv2<+MS;-hd;S1f=k$|k|Ff2o87uf zLJeB9^z*zukXmU;KXGH$?!jAn_p@fT<)3SUG;e?*erA{S02N7iA(32vi|cQCbsx39 z3R0_)iH>X_iU14vH!J>c%9!mHT`ed%EhsqH-`Mf(NUr7xfVX#TGfxI>EKypA_7M=A ziXQy-;uKY`(Nin~!iBsth^Qx*MLBJ&WtH+*W%vf97p1_9bu@d_Ejgagy>0{GMg{Z;g z3E^IrjIx4+=tluAw;07Bq|cuQ6M*S8qZ{8$(@%oKx@bn)uHJeK^o+>h+4^BzchI-e z_wJxqPDn-a_S4@5F2I-6=?4fC4hzICFMx3b z35Gx*S7@NmZEZ(OOxO0BlFt3=QMB8g9jOD9`T$*j>6m%)8hz*HN09+jG^eEL3f6;P za&oC2{8(y97RvIA4!EPar>r&SNm)9;%6&;y1PYrwKXUr-bORMDH7=QlR2Tj2xaEp$ zZDv|*qFQ=OHrCdBIS7GXE+GE(XC;ev-`;<<1+n00%$Wlrob+Z=?YGO=GwSKe6fCznq=2DTn}xfwR)O+9H!y0O$`4KQ#-pl;7is7dc!ot zNk2Q1++#}`EGjO}jgB4z#@Gj3Z+?(7^`prf)e8^aLE0%hqdUPcMV+l~uDX@x`}X*< zOzAJ>9PhYT)!Hluz3?7vE9_6kW>xMan1A9t;s@admlCCsmFB;q229brLYj1eifIou zU@oo}H^XRBpZ;kI=y!_qqQFzB6PHH2DlgF;T5o=*zE38+TA}99=FQHJMYMR!Rf4Q# zT_t?)N5pcl*z|Q}^z}#;aHp$;(RfsVtm`KN`yxnx`(7zpUu~0K-k74v1&z@xP%!B& z@t8JBT;bm<6a9rpKL($2a-n^HXw_~E_QT0+jtE2o!OLG9+*870V)-Db@d=(k@JW96 z&i^tNv%ebeZU>!oS~*Y;V-y5|K&o>9WND(j()8o|d!@I(tmv%X$Bt7kou+q$x(+sh zNKe;xp>v0wMKjtL7!NEmVg3c^NYuSiEdi@X7JnQ5-*M4@;_j&=wQzbW|Fu@VvQnj~ z?}q!ED2nrv)S}n#4EGNMV^+ss@MEoLHPAiDs+JwR-?7xZ=e7Cvj1Ue|8e+o z;a6wn^fOF<_sxLvTJJORCTkTnvDZn{w@TS#!Mo>4jrQS_isx^uos)-n!BWf`9b{T} z$|-ldrq#b*d)0ioY54Q|OS{u|2r(BY!fSb?N4w+s*2naD1~*HbObi}86I1Vy|2xmD zLgRFu>bEJG#-^stFSi@n&-ACct6z^b9tk z#yT3Jx%rO~^lZv+Jpve;QL5JT>jN!n|yC5!;lHE#p8DIQ`gAQ_fgPuN5?liy38;5oCFQ-R4U(@`S ze{H%Cfg2CU;K`G)NF%CSP7x7z&)&+zUAV3F^8DS~m+152EM8GmsvCXneC(=iY~u&| zaXT|}p76%CprQFxD~#*l2D?ECg0(CgR`DU-B&lwmvKq+>y+VEJH0vd`msBVI@Suj~ z)fYyp8Bbg#Qot_g+Lp4{i}mp$eWRKeR!39YzHb~UKAyS3H!GmoZb-W!rd-WfX1G(e zPRb2yjU&8-I0H~zbw-E>>VziJ@daGz&%ip2ROzbjPP-jhg@^I0hrJohR0>ZNF$|lj zwhM<5v94C5WBQR<`cBqP9pS1wWJ#y#is4ez`if^Ok&-sO`^eG0az=&=ZN_fB_Cg>K zEeltI(rP`7qV=tn;Hui$ zsw%`C3dt#cTihho)+PEDUpAkNs8jYFZcTO9$>;DR^L9u5;jD}kcU_OO;{errUvCUo z%*AQB1JvwQuNPC|qNerY%C&Cy8g{XFjDz>2G!Hh_%>X?B`Yak{I)gdZy|U+a}`gkmIf^vZ`@t-~u0OY7Tf z0EK`#cE#=0{V8nf2-Pyps_hc(KoJ-?WIbOstlzUA&sFdirLjM;M#rgtH{e*+c z0}B#o3B=SI-YV}5-yvXN(4&6*T3Bq*Ry=Z|ai8I^P~^tW&vXj@otI2KkCKnJ{B9>( zyG=4hFe7lV&=VeT6`yVH;s4DYq_kAC140~uY2c%Y^S%f%!|!?b;@dR`mF4Emyk@MM z%aC70AiUq-aT~f)_?j_%gGW2z?Gw;8!5~~9xaSZQJRXOvxUznwfK$qX83#V_tCIk; zg`96Y>Ka;;ore%$eHWqO=#77j6p(|$#;&VHa}oRoQ^~Giik6* z1RPwO<`9cfLQn4utFwgbWg6;JUY|^>*sGPWWL0&aOl=fE_*vg-*!u#$pi-QV8v^#` z&1f!}>xQdgSAKp(w@L;ae0FQ6$1vGJk6U(r#Qp`IS@1ZGd9q|vGwIkN;Bbeg?>GnMrR}a)NLlc;{z2XrZeCG7l&4=Sl@*iK^~ds z56~I(q=0aStP;?*T4*d9+5fP^v%AEfP`cBs5DM$)7P7%@O$*mUlb5Ge0&v$qtCx(O z4WSFesP5lRVJq~uzm$2iL{RNB8eKs9l1H@yda*WmXl~;M)pB=W4AaS`@l&OFHs8rJ z)kDn4_IpEx=~Xsb#L;-`o%{30-Hw=WDhPmYbLa?6HYOqb@5h+Ly(I%t2UoP_cX_h)|C+9{8$!)-uQ`G~fV_rZAtSXU1|{0=;aw?fhE+df6+A7N zG(o=4j2Z)+TRpWJp?eHkAz<5qv_ur89syB;lR_v2uyLErOa`q)({*S&MRG?=ghYK|55xnJk} zgrg3ck2Pd2i}M)Vin|*9w>a+@CBZO(ogASIm&!8r! zl$D2^waNHZxwiAP2bk=#)uedK6uwm%LM~S+eSQIg#wG)QB;_bp>&1zONQHCcqE_2CP}}3cns{O5kdM;K!`NwOmq+t( z1$eEeh#V$9Z~8>>tCPIDl#xjnt{y*fW7c&{JScd45J~5~>AulF_2J>|I);(DWq$`hfCseo9<+T!(D2ab-p?-0 zc;QE*8^%>9Wo-xjTYP3S$_267A@?@I@=8QVaj z1GimiIo>S3k)E!5C3)s(=>0N$S3P_(T2az&Fyl4w26r>i`O}}-@iu1e6B9_OY=T3` zD|STNXP;#t30+d;NX7>foIr>3zS(mH6Fom@Ku0@5n>5hQO!v)XhPE9nQQs2}qmaU! z;P|zS)Ri%9#%K4&5M-a=G-s*44i>Ozu@+=Ub50(E4MoBzYtU*^wj!ZK6jsz93*A8& z?`ZPG<>&m2HPR5q>CGz=S0hCjUV|6O^3Hl`F$$aW_H|E^a98wW^MrL_=f;$JhHwSr zw0X<2NxRwd19!Di2>)ga;PMcB$yEF3^T&}XKE+ZhS}xXmdJvMTtV8l}xjJFz)vMr+ zh%6a>Y8}faX)`I@yMrCtWIb^sBUa*B79yTO!loPa{?vKrvV)0x`e%UKdxOmDE)$<0 zZ@s>ruqgM*vzt{@_pSZzY%R?i;ZdaP?%*t+T2+z2a zK0Lg%SrD7G`^{;LNp2xwB|WWidCD+sC}_214(Z+*Wobz!yw=}GK>&66xB|1x7CZ1x z_hCh4Tw=bfIMdX;o0fp4j5996+@X-@w^>vemE}cxS09EU5BYi!0Ml-IkV1TyOxz+M zKMTb6J4fpG1Ra!k?)!2qYqdhpoY69X>=q-&=g*@Xaj$mpL*^-P)u&HUy4`0r2jvCm z@zb(S@e@miLwXERay7cFU*D1fY^G8VzJC(6l-uubzlt1wrysWk&o%W6GTuJTyE|@8f4N81xQ6)?N^k{Iu_7;zK-=HO>yLf-!&=aqKnha0uIWOwYm6pXF za&?pU@hTG=!id#iS%)(AU^oAmci1kxWPL4pJUZ=z^K?pTns)WrgP%I{)}?HJ4$4_C z4a?Ge0oqYeNQVOlV7Fs}I?-NqyRjP$R6%}@lVQnNQqa>5s#-6SXxVv|3lQ_ae4rdp z%C$r81uMGp_~#f|WhzbtnS!B+BXi#Y1J?%Rswg6(KQ~t8!Xd&HCi(owdsa;ue{Yw8 zkewVQX66uD=6-f8fN7>g_TY%)q2YY3W!*EVQngF%`W% z8|vf#4OIDKEvfvvdQVr>#rf(w@F5Bz*O~o&bO((+skW$q6ScVT{mK|;m$24ok>lc_ zrL^_I2TsSyF8$5?J3Z?cZ%{q=%nx5Mn#~oDo!U|yOD_Adhfg&$C^<*f{BpzO7m^?y(W%pSaOl+LXrigd|qRM zo^l$g-$7e%QrmP@zcxV%_y7j2wfrJ`l~WvV3O`VVJsL~H)(U)#Mwv*-=oZ_#R#taf^I=ow$X<-V-)x1@3|ue+5MNBtySOLiMkL@EPCO=9S=QJ0xVI2SFoqV zK72u(v-ML>jZX9BI4LHcpl!=?2FJ+~dOHZwx={c^f%mlw7fvmsvL5|1petaCbw7xq0yZ&P9<`&gnxTw}&h|J5c23Ll6#tuq9 zpM^{BJdkp3|McA9y)j8dm#rAhsq$LH%-JT3P z+z$8#YW4Zdi_A5;g%_~o33#xbAlnr)KVFyaLe_Ng&9J=^bKm2jnT38MK|qd@Yl|ot zM4Tfm06v7zOj|G)8piidoAlwr-g10=`yI-D#|{ZZQtnT=AyDrR{6#uiwp~)mdzy-% z01oS!Gw|0Unm9D4;6X8#upgajwb3+tmS6m$Ld_G0dMESk(>GNVCuv=3mY+3yqt5Bh zHm>@Lfo+kFOPaNL4X-_$>dH&uQN@ntXP9THMe>hJ=N@ohthPQWkbbb)vO!fRHtdvq zDxNrPG8>%d@io_>1D4 z`F%r%z2<6~TE8;`|UPw?i)mdo+=tUFcDFr6r%d7PVmG`ZYY<9uQ zrbCEiXQ$A9(*d4=<(L*Sw~DP-h|K-Mp0@(2PS;B`~_&wD4GI=KIa(Sr#qQA~w&5wyT1) zZgQX%Zz^rC#TSOX>6C-F(?8J?K_nQuyJ_;1y3?FiW@>S6pt4@=Y() zs4&zw7jNp)ETXjfSio$JPx$-T+E!+Gqx_Eu(W6n&;; z`{WXgD|QAde4Ga&7=boa;ATU?H}I3EZw=%aR)PP(?vA!1*zw1-vZ414RK{T*3D@FVs{H@ z9khxb!{CU|Oc7j&X2X$!ce8DFBipj){>pq-U{5;%x7IHlVnj_%X^Xi}1JS6Vj6j3w z$CBR?VXfCuiBJk^wF2=*r3x$U`JGOWzJAWnxdG`4y)S3e$L-o8+=uYk$6DcbWdt5Z zbE+uM9pGTLgh(3~3NCYIl|kaj>Eg}LhbO!kCy!7vhN0W_h=UN+#f&)1a42d2dw}zL zx-zkCGt%;n7UXbgE1>J9p_#E`92&Oy1yML-V5v&#ubz>C_^#wz>7NkUc(pMu<4&3d zQ`&xJSjQ?#XZS8CY~&z0U_g6vxvQSr2p4ADLZBsjxXipc3}L?87f_fOKp7WtlX8*& zVmKt(qPcxu9hzmpMvOB+)|dA)0Fdz_S%FaNr9YF5b7H*tmWJYn*|nlv7I>JU_|f-h z#$u^G7RO_XIRRVBe}x5n|UUnQd@Mb=0vSNvU6!@ zh}(D>J+;cA(+gE!7#B9b6PC?d5N}`IN(;Rb#D+j*2=W)O&4VxP>Cs6m2S1(<-Zv;cV;Q{KMI6)W zOtS{ZmxX41=Y5JH4A*+bd;TgMeO>3{VG+t;x=N(1Ns$Q4 zCW@Ba=c}94+1}&3R!C3{Uf^hd0xRa-_+-5|K)L7@2O{pSrfYSG)sNH0T43^93lBzf*vduS@hG6H>*{1SM8jNZ`Sja|%LsP3oZiZ^lXRGa3 zjIQXw(vKe*wd9Z=-;rx+yVg>XCs>hh=s^i`@6_E8#wPi;D9Y8B&db8jpMrM&OmS5< zBq*6+I&GcSM=GtQVq9i(#IRBM-Ir1=uL$IqXa$WW&_X*erEuHUxlla_(E00-or&Jl z^bi2#XA&3b7{B`}+zmUFtBQz9)j9#2wQJaqPTo$_;I*Czy`wIFm&-Y-CtLMKj_mzweNnKfMLH;3gs zDLd-(-R27LDWMlVUKfbJU494;i>Jdfv?}?Y5&2M*ht{ILn`Jp6>y$?QAQDm8TF+u# zj}Y&qO4;b+;@iy=#=0^7(+PiIPMuGtAbcf`HJG>3IfBcZe%2)Yzxq;*?Nr)6u6mc- zPAC;z@8%Qzg_lAp3*Zhc&Gr#=q7GddI@eP`~`H#i6A8 z?&sqWf@7mjrA6mq@-z=B?O)azFkl7$67*?2EzY90_4Hi?f-0NZ+l zLYQmxRL@w<6Dy2@9(R-kK#!Itj4i_c-*^4pFVl)NUwlrzPx6{t6K}cHnVoD2QP9p* z6e}^Sy}l*?{O+_XEVz2HjS>Q~!`CI?@p^3>8qpW|Xc;fEHhFD)D4zXvCrXwuF6`X% zoB3bmzJ7&2)bdZCrn0}Khpy@q=O>TrfQiW14qjjI17FW{BZMy^`1VkiN_A6-akXHE zFFACk>0hh(7vH1;dj`0q27))Ba|GD|@`Fx$4ym*=xB8qmSM+7pN)~4TaFtiXGDmV~ zV)2x0Zp}d8I@kqoH|@VZTw%MNCW&tpMplVX8vI3mI-IKe_%)9vs^dM{ykoQ$RsU4X zEbVun>vuq?ROk{_9%mhpL*s;yi$&7hHQ)*dP#9&bPM=eTzao{UEXZcTw(V2j+25V` z--`L^{+SwhOR}fTU&izQ`FUS?Fr20muK&FEzrHr`Vd zY)vwJ|8*O!6$tvoBD7Ja-Tkd{CJY( zhdHhpLAZBs%5^&)?DO5;YWzo>RZqHWShiV^eUvzEKC12EK?|6;ktXTXPo|~2!YTmjj>IE>CI;WOX1oiw?%?S1B^-e2kZdesx5clx`n)gFwINozDyhlRYwcXfs zjo&V4CqdGuf4#zMrfO#?o9uvcdSmiOzD0#G&8e3)F9UJrn&D&;A#|eHFq{sQI{o@w z#_f+S)R~IjXW&jjFUMLPr}i!^sM!m(;2P$#Xc#!cQmZW;e||1-cDY9i+^$ex&!`D> zybJJ2gUg`LGW#-TeW&*%mIgLpnxH`CEf}KB3e$SXSWiNgRRnA|dBi)huQ==ATorD? z7YTNrXv8D2*=Gc9hcRGrUz}U6x2_{BTAE$BAZnITT9{f6*{II3i{;yJI9k1f=-Xqm z`GO_8{;>9R!Aw`G9~~QlL9_Mcl!eORp{(?h-lP`jFK2b|=%+mm?m5J!a46+0*@rY> zwX#`@Pp>~FGIN8$(vxzg!Rj*qEfN2c%qseE3d(gRvTW`(v&z9o$&XNq*-4t0k6ply z#vRnT8e2Sz>Tgrft+-cVEH#Br)OeOBEUIqVZgV#@6HB)SjE76>5%COEZ>N-zt=(@> zWQ*DL8|l^PvL{VywJ@lQ&UQKXQ{ST;x=BLtHoVaA){f?eZ^Sth)1Pl}Jc%^WmYZu6 zlEKH(6#)Zjb2gSx>u-V*uzWOvKZN$p{vf_n5GCu;8L_jl6iW|nC4fENd8tf?z`YGq%4K+GHAHHbVoN}Gqu8LW{(wh$ytTk6-M&$vl+~& z7>iK~Q}IERE}UE`ExejPF-|f~%dVD#eNB1J70G($WZkm|ceOqcU{@Vh6ohmM=k$Xx zEyP}MQsJL-tG#~PS zfB-XZz!lFy*XjXTE9~Zk6=Y9sad$cAStWkMms{@o!Dg*`3gwtP$2y!D`SRo;1N@2# zJKS{7KcYQ+X%zMt%3EDLY&NmRp`P)H_J{^hc9QEGissKGzq-*lT;OymU^^2 zhF!e`0{c8)pKmqeZIpCxCupCDk;9o0)H`$I5RzTm};nusciK5vrIAka>N zZOB5QPsVX741h*qK*Zqj&Vv{FOfOt06Jo^*YoHI>i6ekpxHH;U-BIkhHYN6D{Wz;R zc7Vwq_Pi$@IU}r(;$5&LV=6`U#(TxCzp{sLX?>^CP5~z=- zZvVa8gFVG@AOKq-$Qc0L9Jik#J;0@{Sb(NsdV7G|0Jvj%FS1+s#P#^7RS9#;I|tPg z(g8(}2okMd^Xv-V=>!BpR^^v#nWEkL=7Q3Z$H zPhr4#+MIA6RC&(`}s2^|e<2T`iLaRRv1vW4z&e$70`64u7At6vS6 z?w!rz@=yZEFK@xF{2-%26ibe^N!YaPCFp6DgKfvfbD+->3yu`z3tkxFq_$d?rMhZ3 zt33!y;FUIL_3QLFPN{&$J_o;$YEpT6ssd_)70Pu#{}8HWL3w7r=)XcFB1*Li-Nxg> z!-3h!;Xd#>hW*t67E0Svmd*l!DRo-+50s#q%^9aBCoTmC;uzP0Hn#vbb}gXwhSOT6 z=LvQe)q}f7Q@pqfTVV8bZaiJ7iic;0?}k|*I;JP&$f8HiAXc6@ymj>IB<&UGV_sJA zKJE*Fh~UFB0JFo+M;o%b{(O3)$=+qJdwN4+Kzur=e?)Wj^@GLd?CRm@1mzt>?o*0* zhmS5_2@ekhk3!V+g50%QAwh1Qd-sGcj4POPHjTv~%>yy)7Fh}+#6#RvUOGz5bQWrV zOH6?>Z5`8_srqbk%WVZi&bUz9vqI1-#n;(q6kG;V<+)~CAjh(ae(SUOTHo-1JIx%3 zt_)03bT-)=7)LQ2PM9l5`mcj!<)R@!RCXx+3U*gnJn1g*Tu||aI|nr!aU^p%Nlen+ zV7)Sn@Wha4y6aYZ*IUAG=+JZBMLmi+mh)nfy-JmL6*p9{nT2-TBxUnKdkHapSmP$X z3>M=fr;}5SqC*fU1hc{(M`~^_MRUnhlBi;IjBBRB+0|- z4h7KExKm=w2qE$OAAJ&po#Ksoiy*50y9bogL~rf5ztbC56gE{nAE%#->)=hSs7cS7f`tzCY4INw;Q2 z^PCHp(}Rv~yQjMJS(X`9-lV*L9aM6ki+IBq-E!r{Gh3s2NH98uPo<7wEt}Buda18< zbQFa{k0}-RZa(jPtT(9lhc`3io@fhY0kp@;&Q^q>5SF`$=8`sOa{tbe$X&? zA}Ff`Nps*0nftAjr58;0ktdXHbh&PS54;vU|Mu0LwQO9`K}D4W>;S)i8?w_a(i75_ zY>}0^AI*VEjsASl$S@=kFz#CuD>Kg?LXrs6E?yw#Kh2wFYBNpdA#fB0}YAC^2biAH=68Y8W|fI7BN^01CTTZ`JZ_~^Rx zCslm79!b#{aWU@w$c>dNN=aIvRPG#c?bb?|KLAqHmg-AuUyqEh>j1m)es#K;>>61j z94d?f=Uadw7JZcHG?sXn%Bp3svkMvhAcj!?@vChaBX^yrj|Q<{zid3?AL0aS6C)8b zEj74)t9|;deQphNq?B5~lC^L!l)a&l^ha*M;{vrM%NZwu?FIkBTl|^z%FK7j1hBbb zxozN4~4^BU?MGzCFBF@qI($&S5!+%l;-ajk)}rXmqKFYMT6H`;w)t+9tL6> zP3s6f_iFX`G9a68X9S2G7C|@6NXgt)OV28X4Pkz_(BF(0so#2MV(%l>6SjV~^ow_d zg&tkP`9d2M<-&uTM2>a*43VdA;8~!q_%&ymF&f^$@f_s)5SIITu2>r$S=E9g$?~Ei zGc4s>tVEBv|E~=Hx5qQzX>W?PLPr+?8AH(5ve-XMO}2nM`G)x+G^8j%KX@^XK~iz` zhk6GLa~%^Q?miwTKl@Po#`JbC!aTmOkitVktG8SAoW4@&ih%Y8b|74i?3zUCMGYw{ z9LKgEnDFP)c`1ttMtFqc5V%Zi#dMDxXGuv~fE8w%NSW)3q7I=5PCmb*w<9{4uAiw(DfF>kD+V zQ=N)AnXXWdn()8GFe4VaOqwD1F0D;Qj+(M4ND*c zB%*nJbQILx_?uUyKHvvs=H1Z`-GVDet7Yv(opTiNidwvreXnma`I7?`(RN$(`{4gQId9 zY#!`vaNI`F{;^jYXWxSb1rv+h2E66inaB~|L;_R&^C$Bnsb4<2TrZ-0Xg3KU?+;BK zIF}5q$8}UWbmc7n0xq-%s6^+eRCyJ>v?S3|CbwztxoIy?z*U)R@L1W*BgxqjmO>5+ z@{R@uvdP4%0BA|^izHqHwNSvm>LPCV+fg_4Z#!rWJ*1TzwTo2daUVMc9uO*5`e;&14Jl9D6zM z4KOtN;)RbR->I<|QkoB4YcXBvO?N%flt(13V2UvIINjp~ilFFSMlb&kn*oO2n)w0; z^w1j0QcD%OCU;yGh!#6djv(*_ts}SIn|H_b?A`oB9aR3+K#Kau-iklVk}t2J@^Ee( z#H_kN_N%qc!ufLy7bcaDq6@phXS#*yo34!As4-~5wb5;|^M>dx9!R@$g;}&Zv=wFZ zNkg`N3AV0uGjZ;J5`W)h1%gZ#rd)%7^j|k=YYkH8JL*#fv zWv)80z(ZT8W$kkX&O(M|7KRJSej|Nk_w(h6Mp8NKA@`*OuvmY;akVD_Mc&^^C_


p%3U;$R_z8IvwR?bag4^%s)MZ2K?} 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 CTS_GW literal 237549 zcmb5W1zc3?+CEH!gea*XEz%&8(n{yhNGmBV-6bF;C7pwGcS=f!bmsul%`o%;|AqUU zeSF`&_xGL;e)F5fu-2Njp67nYWy#kFC4*14fInP}-$bF z-494I%f;~V4LM1!GuX?Yk{BLz>9NPX@uTGy+0Dq15L0@%OK??NS!dti?Cydiu(Tjh z$59FVwlrY%5A4gu`S|$MKAlU^l?^J#B5pU%$9Ro^^uPxJg%SY~L*)N+^KFpGOB*(J zZ8?~C$gUz4 z`4)$GQZ_aBOFKm`I``D=jDyatEGoqR?&@FEh~$u@3lmgnY)mxbJ$wbO+AD~*4)$mJ z1k3gEyxLUdvYtoLYB6q5;KTdx?u+s#rcnW+TXj79saKI!g@Tsjt<0)Qvw&czw?yE5 zirl=-20qs+{4@ctjMSK%BiW7DszW^R{)bf-5UL47DSr`@2YE^Z@k9e)CMUz}x+_ya%40no`Bi^(g0vPk$>H5AV<2ovI$es6Lva(Z*l6b3 zIyuSB0t&Rxw)Z_PPFC6)&ED*drsFjI4s}>eUR|G?n^Br9((DY%%ryM8iO+}l%UmX@ zmLjLZ*9UK6J(x5m&4zoT^v8ClO1GB2i*ml7mP-98HH=}@v4bmr@ZjU$UUbh7q&}sM zAIx7z&xWqfvfk-qtG#@!+UR0C+iZo!Wj;S@4)%u@Ep^Wcxro@1@EJXipg}+sMZJXW zOJ~c(;#Hc)Ai9ZOg?s$Vgbh)2u-0;Q`D>L1Q(nS|3_)X4rTU-)+b2>)ttaS<_x|3} zAFEMbJRJQz%g=GSw)(#GQ3{yPimx2eM*mjJVRzbA?|4^p%=OW4>%;d4({tz31CI|k zZ2_UagNhV>!1nN=izJ#2A8se|y8gQo}%oxhZVh=M9;Pc5X>)zMiQt?w#rm-4Oq6IZ__qD@*1V6zB^fGxa;%<2%bZ?4NqsaU9QP zHd4Vgo~Nn3Jyt3VlKkzE|GC+tgOsqMH?*UhDdFg4)Rtu?@B^tG%~QtGP1$T`vKT8M zm5ffDW4u|uze}}N!OG6wo~Fjh)5AkRTtZ^>+X*QH42Ig|>FDhEbue{yTaZ<_%yWaa zlX%*4V1&A)1jc;xxP|?7nm#%CaBahMNpc(UvUbg09L37=e(IcJ(>KTbbo*C*&x-hO z-n@~$-kz|ide?5kM@;_xcnhnH^!YcZJ-NI{VP}K>cgw9w4&tNx9puALZiKGwBz|(pjgJs;eHLai_3%5x!SDtf#j&@%;k-()O_xSbNa<0xN0Y78z-y%xtf`&O=s1$Ty5@D*+L0BrJh2DE0zVz-~G@c z<8uS+)&<-bOb3%pJc25{qb%IvNJ4X7dwP9(YIIFPDQ6&NLCnPf6A3-|< zp~$~%>g_es013}h7@Tes0k;qp`@*}qyrpGgFgmeRcw8V7?Kk83ebeGWD?(G6hA&P= z1b9Q1)et-2;y36GK7RjpC4?^RFj3>SjU)acz7@>_Q$c%Gc$kwcB-r;h03VL zEO~u-8kNDYKa<`9zgH=NL#jx&oP$uK+vJvdpZuOW3#8Fj@DkepZl!#o&8Pkpp($Qc zTC3TJYG!V3C+4hJCy~$TJ*ZH<^eYA3ZGpXx%$p_y#PUXHv0UP)YOxj<3G6~-doq(k zTpSWhq3%xxogEn!uk4+h(~cUXCiL{kvxpyLsQKFP;aIX*3(-Kc=Ei-gD|U5j`DI}iwD zK9cd0MXzE!JxT7!V(c5CT2TW0)<3o3Y|JkZq&mc9*(0)?6Lx>4JUNqnp_~y9j|vDC zSu}_jI95(hPA1j!F%V%WzRCIyZas3_->>usWfF*Twx!Sl&H|0-+{MQHC%nnW?$EdU zW4Rz#a$;g)@L~0D4aScKd*0iy-m(Qq-=M{2$`(B%=@A zrkdVk8@7QYDEk=~Xt>s5B8IWaUCRrWP!2m@m0odJ(+n^h=VvXp zFuAoD-de3%pvq97*ep=aFcJ}%rndU-XclK2+-BmJD@!y;d`$Q3*=WcFDS`1!)v@!z zA`Nl;>s5{Hkd*|1wzMav+N$F$soawV%aRvRT3js(VcU;x-h5(us@TrvQ?FAh^fr7V zpIbp)7?nHJ1PGkA2^{w>5~=6%N&}S-^aMMnyt~GOIpN6%gx#7(%Z-UK8ZIBxtSmpY zG$^8Ld#g8xUGFp5F{nzVW%0mAB%2*J2FXY`&#^Eg>b@Vd-_}@Z9rI!(jNQ~@X*{@! z;@+w@Il2tfmhNTPA202G?+7MV@&XgzY?XP(63u7z0T~azi6LHc_;CHs>!*`0A#um1i zvU%?E7~kIOR_bHo#ii(rf1VlU$Rmk3mUOE#YsFYKLJDxJ#ScZc_Ba{_W_R}O6@!!g#FsJ0Y&Ne}Ek?E<}rE|yE2ee&g z(}&!S$_UQw@=RJies;+#zkpoz#gUzFfGN{haf{}vbn9M<)H3(C=e#nV8_OMXK-NT?&M1@ARw15+SSijyJ&W;#d65#L2nW7MYYwxWT*q)AiN3ZV@ z_#HFTG(0v~O}J&~OPKQ#H-0AezZ?ln1gkR~Gs&f^v6h)EnqN(W+5 zP7ID+?TZbK_c&S!cywdc7qK!nX&DI%Ws?jxE7faSxp<*X2}IRJ18L79<;-)Q`7e(XLqIwr=ewUCkUg+5XYmZK}WN_}to*07+Zv)qSo zdN6+vlK-wtUX=S}H{Wu)`YdLuDs9iuteItu?d(LyWVvSWn+~RQpy?-b%ag;dAQAW% zlx8)S&yKUPNTyz2Yz3BQ=9{Z|S5#L|%$WcwMpO4Hx`{%vSZ63PaWqoED+^ChsjTtz zIBcRootB4(#{eWQDGnjTEvNgUi$zS-ewl*~sdGgSyB2coLY};-q>FfvTp+~B`MKs` zy4cwSLEVgts-?l}Q@qCVA~bN|9ts+XdIasPjRL=>ragQ> zuvT)WqA>*U`~u9lI(05e2MA5H@NiUcj=w*OZHS@Sb3H!qPAGZXD7tIsrY|yjw$big zs58PqbZR#N{B#GH(7Pm~f67{`N`GtlGJ3&fqE6iXXg1ruHhjfSkeuB30w-iwqH}93 zXZZTclVIw8-1&9%OsO#QrHQEVKSai1yt45#@UyVzmAP@#@uj0qdzX&0#128$5(`mZ zMo)xj%4Cxp-@;U&AL3w|;QnWn~C*vU`9N*rPU6n&{SBENMwrkSu_8lB0 z>G=)%(es9pk2t55U@AXhI_|6QU?zTr*7A^sw8*aq@+;1)SPU)n~2egJM30Twh-$JtiVR_Yca3fAs%;wmy)A=gy{j z$S68`m42J+dCqXs0gv7O9EDMN z?$+4c30*_^2k1EDg6YSs@KN_sjIg&C`(A?*L^(NJ@Z44w{>xiD8S6pt@+P_WY4`7j zni3!L4fG0>iM}}#Ejzm8(Rk>;2~sgJsf%9%(&9!?wg1-D@oFzkS0MIPNN%N%2c@Dd zC9+tK!bRel!3M;8?4WXeN5FA#QiaQ?5GWv<;dTiLu>%Uj)u!H}A;A`f!Y+qCDJd!b zXF8r=<)8?H$rWi{Wy5KdbSDS_Jz$z!^YWZ2u-$t%2ETGI(niA*cI)C_( zKJxQf@QL(oqt~?-=4eo<L5sZk;s{0@!`ENDs^j51QL_@Xy- zPR6jFcQJI%)<;R~e0;OJbXy#4Cv?fDEyl^=4zOXbk)Hm3m7@ynl{4HDVS=one*h+0 z4UppCHynlK#b0u&hw}W6e;5umi>8Q^q}&>w>VyP)c8pmWA$zm4pSilZVMzInU(U|v z7#j-V?Bon+Zx%-V1fo&u6E0BDPGMj+|7vw6s=etkv*(qk#J%7oT9k7{LEmC;+MzeC zIU}Z^6K@@1pDc!x+u5AN0TGbxkq*B1O;}RxzMP)W&0P)1=LP2-8l0@1T3qo@M#?IF z`yEMnIPbbW5ZCpFkBduX{kTIF8!**4b8`3Mu)AT5AU6}rB{!BSRM$9Pz`JLT&a&ow z(#7(PA{n0LwKrScp;Df#mUVWJ)^s(l5W#up2Oq!oS!nGoA)I-p%bzsHo*xeLy1rOi z#{cHH6UP`p>vg+yDH=-@{C9>2)PrStKJ^f95-yRUob{NR&*!U+<2>AgXQ9Mw+4OgH z9>sCoAupE0&U{?=5LkGqeUilGboa4MlKuCO0!2i5ieCjldM)qpar==4zd6K6o_v}r z(R#gW=2&yhd0~plPg=rLI_vwmWoVsuP+96d{m`~r z4lizHtJga|J+ngPH5!KZ<9d4Dh3YJy87-_$WUKTSKTQ#(;IuyQzNnYK2Y%@uM|^x- z*wzm9iP#ln1)08+z1*9r)F@hNZ<@l5#_j> zl4{!vW!g|tC2h^!3figWHl*@7E}4;XTd%*fz(GN`K+E#<6+)9*w; z3BzG)RGM53XDER$3MgHv$mhPDuxXWRd6wx{A2x_NRd(d7cWouuDu9g8?b`dy#tk85vES#oKywnxVNOGZh)LE=2BrA6lNf zu}U)qfuVUG>lkV8UsKY0;}@t9%uq60QCgjBPey$V@dQG*xDI)F7UaPDJ=*dWY+IVk zV*CM!kdRP(mqEtzZUA0<^KlrU*A-0~)z2?djc0JoQcGO+Q_<_{t``wvR4>Y#PT3d& zGbI@ZLxk&Y6eFpT{w_FEBKWEjMmAT*G`DlYjDW%0_>tI{cHB%kKydgejlOB^%D9hn zan)M4A!w{n_TJByTZwbK>V!vO&Gv!QNg0#P0h06S@ds#CJLCECe(11go_@vdr|)wX z$pO%(zTw;9e);!R9E&*RW{(S(B&~Ft2!-)1X~U!8?Ed(zxdU(2eiOynj80icD2whl z9Xk26=i579tK6?7wr8qS1vIfM88%3HZW40)<5?r|h}lL`>>(w^s>LA@4nYSEj^^_G zNK;Bc^(r8bS(c2Bgj_45G}}a@n0x<}_PRpcd${Paii?me>JO`yMzY+Y_i0l4H7?Z;h-vj`1>Yx~|OeMwwvwjM7#n2Oe_CYRLw#6jR+}nG&;@< zCrpEyI?pokMGTLP-fV+AX*rktjLO=@@dj~dS#>oQ5j`d0)XbC{&m0o}($?~;_(3z1 zr^AB+R+pt!?`KH%jL1zvF@l6>e8Rx2!GmN+1K!xE2yNDz%=KKYcpr@?Z|z;?#38$=#m9L8dU#pH0jE-$Xh z@WOmoj8VG=+tuAYG`#5kB{Cy}=2a%&$M zb397nC3#AQcZQ61KgUnaw)Lr zm?CEzhL)M*c!t4;Q!y_6T`XjKq!l4Hm=ap7Dkxh@8h7 zsTh)>NvB<0RGoEk6_=YMpB(AuC)nB5H4>iMu=(Sn-)ylFDBU7$*7{allQ}Kqc`~d? z$I-aMJPP9m@{EG=NYFyPZdMaTu9PX!vK65(y*H_~nHJ~-;=*0*zc zjvd;y=LysJo2P9>C=mg#R{YR$b7!C!aqnBG6lPtS*GhFu*^k!4c9gg?~1qf!=XBW$K9br4$1!w^TZfeFV9eCp*eY&d#={*``NF4o55EvsK2q zi@vVaPFgExAd|)$#Y!=fe;8L~QOfKCwtiRl;M~u_Hy~T{=$tx@@kj-lQIhR!nRquF z+-dv{d!qMgSzb22&X09;bs-Jv4PPBS^E|%4+X%k)=m{%!XTuq++*-vUOEI-F+3BxL zMETcQioM8C_A>uH|*o0^N&Ln=G1kN1h{nLudr;p4>+wArbR!CTxm-y~F)=F1S7=ZoR zat2B)E-AUQD)ix8Kb7<8CUL^W+z@;zL|6m*FHqobZR|J88;!o>k|0$l2b`W(C5v_9 zyXeVBNR?ixa@hehI668y=WctpwzgGvdqh8(MDP8(eEsbVf8A84yt~}uR#N%rimea` z=*`)p?}o`vGcMeN{*LnaFHS<)bnmT?P*amZVph{!%|ZG~XNc11@l!tUeWU?xxaqU4 zm*4LF7w0ij1;{$naSiU&GmDj>mh5Bl^o#$UC;jd9#2{(LDs}wz*8bsODV#e}@Dt;< z|3C30|Laumf!ou=LQ(oJhT_gBM9eYXT$8{Q!cWJulmvl1=8^GGTI&8{ldN{_URJ`i zWd5=*A64X6l*5Z&MK(IVy9(tGW0E8KH!&9ne&I;MqFw(=X==rlBj4@B902`v&4;sM zR~}J6c&@SJc_3`RBkB6@BmcZ&5jVWDS;R|MZ@J8Gj@x-!;pf}3-yE;FJ#Vjh`N-YW zxp46~!bPqo2l5=YlwqsA_(_#-UAwm4FrK1-!KxkN6MqgGB^l=QFY2uqKkp?U-!?4$ z!#m<5mniBIzV1kX)ka-ByWyzyiuo(sltqVFn7Xo9DicdUwh%(_)mWBT1t`;V5^&MS zT13E$g89y+X|T>=s;w3dvvFh(uTcz=T;Kn5GJGB)sq>3?YrDL@`H{#0yDAdS^J;&# zs`(uR-x|;6*RA^yazN zkZAS6M8UbDnzy&tpvMKLh0%Rd7y~FC$-;k%npSl3*3EH8`PIh982LBO$K_>l*As

?Unb#7rEhkjz6vCrNj7Oz;Hn^_a#}m|FB`G~qK4b~CROp9reKnZLTOz-=Zuf2 zSeOUBbTH5`qE?k<*di2)oa5nD)&KLFj`-E1Urrj+MZ-qqWx$SLO_STvmqCgd(UR=` zs9JrNit2t@>EL@XNPV=!-VfWR)SjrZPcm1NPfgEOV&(>YD>iyw*(^4G-H;B3Z7y2z zdGAulxSfjSHiA-fRxTmIZPn{dx2(}N*Kskjyc&ZlV4l=Y05bex+#uj0P=TMXq{EIZJyM#i9CVKXji(F@~{bNVz2 z2zHziH0-Cov`8CiD%L0@aom|q#C%DdVLFsHvh01kHf1lNVIqPktJ|Wva=>GM>-9Vb z9_j1Z*`lO?flUz_irG-NM&^QFE<`b%sD04Ae* z7#J>02N9JP_t@Q*4eEgU1Ox!7brc+46@%qf3JE83L*sexkdLZVa^-V7`=_+3?g=*3 zWR5_>WXcE2%ARk}T8M%9$kTl|1&TX;w>ztfF8O*2_;4>jBE*edu$>vT`pC!8Et zB_{Rs7{#0ldx_+mC;P7KABm)nLN6FCc}2sU3%f#j(dBe3@^ zO8Sy&e8~+AbVxX$p|Mf^NwnvpgIT0k?gK~!;xa-!<>as(cSa&IG7cC=HH{!8B6dv5 zVoxH^-KSX1C#&)m(yq=9R2sr{PZsCj4Q>RcVjl>T**yh(bE0bN{Eno3KWY1-@v5r$ zX^@I!p4?he2q#g!E&JzitEr}u{!%4UM&0^P3SN8uK^%1S4rdbL6{q!U=m(2+uUR{z zOZ!*1NKHLJZ2AK6bV||`!qD3~LF0$kGOBZn&0g}70X2|D4~f0!qoegAGT!aXdKEF3 zCwnxfA8tMdz~+ijLl*bvzlF=hF*D>?L7M%vs@|9I4pM{sNr82=Bd%dHKl;+d`eXf+ z4a149`P|iw7suJxvviQNFyXNU4pVPEOdoC1_Hv+Hka9v_kfFT9~fk8~SdqQJE#10+>0i*n?kVjqXh_ApW&G2v5!#HwrPm>5IP z*;I*c=KE!{2U~#@50I3TJSa#>>4w_cWrIj#poyqNAgyQd>U8x>$nOA8#;l!k(5-eX$xG93-fF zxkhSVVbt4(zAyIu$ z3+D}PYS1DnWj)yg`6jQ*4v5XVUQ42K+O=+b&1kkPshDO>7XJ`2VkK_QZ2OD*KT%fngqZ53mehPK=^Nb=S zaPaZ^#h7j>P<*5Lz!Hm>^P%(?V>&aDL!(2F?X^LemTpQ)s^$jtdyit}I8);MH_o(kXFy2UYOYG1Ad%a(vCKc9FoEcfk0li1hgywK ziQc6qD|Qb#aul+bAs%ePMfm%RnY9LwKgnCftJK>quCA=S_7mF4=Flyy2NH~12R)=a z5Ai^%7U>>{9D}2x@vFdnR07Y#!&3P(*?d?7o~+usE{V5sd~@F6tB*g4q8qEW|E^l_(d02@Zd($mjHU!PFB@bLlSjNu zOc%fO9@e*bg3}~-`@-5yx!rpnmX9Uhw($<^yaXVRkTs7k5B?N4hl4l+(-~z9Xt6Wc zE2PDCvgnNzu=?<9e8>dt9$j=MTOdE0yf~@_8XnG1OvK(U(0k*Iw-swu zul6Q$o5fKBE+kfi5$lotwe|iL$Vm(3jtlyqUgEJHr7rfc_wflvD)Gwxf;*?p4V+-= z>m-AbSX*0mVeoWB+Fsz1@MxcKe6XZ;jpf&KXb5cu*VOfObnYjRoLts@-7mS(1Xw*c zBRthj^=mtm69Tcc6e*^;;myR7w^z1!@^IUa(_cVWrwS8@mjR(fOlTW3(lg`G_U1>7 zY2blR56H{kU~6wvKx7DA)o$VV9qrK8Z}M?q*H?Ni0?hI@-$z+L1&$RsCb5mJUMSPR zsf2{huitXeahfeEY&;`$vJXAQVI5V`1_dPBRH1KZE(n8?#c@c-=>R&;d{oTE?Rfy= zC5tu^pqeOxZ-{;x`I_FuEM+xUGx9i{=j_Oiu<=)L_=A zZO>J$^G7djr)uHAmG!-HwjR}eH*g->eJU&MLBZ(1IyT*pzT=wX?2FabdYz4rPH<^dq$<3fPKkRNO}=KW$4r#A z&r|GHmp8x1PwJB3gR>)*^Vuq0Aq@@9-StXFdnLXCV|Z8Q4QORe{@mkt+SUQ%Jb}}u z@+NucE+{A52yvlr%GU$I0!T1QA#yCY5g$}sG9_?2yJDP2zAsZyHIIdI8_rT$u zvV8V>99LS#Gmw|iY&5`h)Z8f^xm{atoq@Hq|3+!lBZZXI{eD!lR7VF>DY}aSKN;;t z)beXC+u;}=mWr{3%^f!^t&LO*E&GaS-`AfjXk_uYz={;v8ESOkyhCw_f`xvQkja1U zwbV-GMHJu0Dqxu}VyVMiTJY-nQos_&x5#bMU%tP_GiYeYRMfQtZJmSMEiShXk(f^tZUA zMW&ou=Mxe2MsdU^bluo8r8cI;#(Yp(+k%tE$4&)^H^qQ9WsS>0-bmmo%QjL^#RNfF zD}JZlI;{%x*%bgd9-S#NuC-pk8zUnlBkZ25vXr~Na^Tv|H6&e=r-fpMHF-tHPY`=S z{&4eJUi~!-jlCyEJem<#UQdhPG{;O9YcedtS&YBrw6%C$e~S@|tMgim?M3>e*P?xS zO=p4h@z1L6-`?LBn;}wA5Y|`u8XCP>RJ_{{9=bfs#G{o_tTvx`e>Ld{DEsDAx6qO? zZ+;`O-S3l)~~HGo~*71eiaO zOM*HIvR=|O80;P{z+5(2Z~54l16nd^{?x6*?4Pq&NNofsu0I$DS!CdTzIBrMCV$4V^dRhNu+*kgiD?CkTvJp)QrLW;-cO>_@#XuMQz6kQ>h%$ zbJ*p==z*{%{)4{)6-H9N4reHW?rrH?bYz|1)lWmp@}C6aT#m1>-A~p#1ba5*DWuLa z+#jsOH*rvUA>%6=6bJzeRdIm+FP zf0?yqV9{^(P=2mNf5*ccOko#nwU`+i2vbZqULBwMQWgkeX z?8ztw^R1ccK?YlHb0DSzQ?A>WqxBEcB>5=?FS1gt-_NH&p%qZN!m6QE+QPn6)Y-&Q z+mvGV7OM@ROY`Xs)g~=9M$L++-m@$XhvJUl#ikBNUdf2$nC+$~!e&|p;PwRktkaF| zgqrsop4XRLAd;gKso8RV*J72l_g{VBl}CVax<|^mtt3r16e!p8g?3?~@QSLw=yD#qlWXY~hX4pVlV?05Z?7ZI1%jtG z^rHtRBQKMicX*skfI`#IF##Aw^9#dng`mpza#E}5+2dkiv$iBrDk`egjSWfT{+Ne9 zp$vz(6ccb3^ZXr+qo>c{(dq}n_(`9r|Ke*93kjrZkzr6X+~bWQ8zmj?ux1$QB*28f z|A8yKHGZ&~AW)q?=<9qBN;kDL4$B2-krQJzd7j+Hsv7RXy0^Ya1t*naR|GjV@dJ4U zTFnU!Yg1twf>DXV_kyK4k2WAKEPCX$TXUr?1T6@L!9aGGQ}rl)1E=hZh`E>7k3EBw zGT6r|Lgu{NYo;}J$AhKx3vAi3%8GByM;B4E{%7E)zIP_-`?7`D)2A=c+7^&9)SmMlvNECjdfS z<$P^NfE5*!n3Wk-evzM-_pm~vbUV$DLN40}7+qQT^)s%S`5hjWzS4yUQu>t{xN$%|dfDSFE?|Rat^GID^bf>S|X{3Ns9lY0OS;ILco3{8iOk z=7u;>>!J=(HAY@TUX4q8(fB$53OCx}v0QoQnl2e14$V{Geaab=3%K`>fjBq`DqaUS z$Z$^bG;)C=vdEl~h|n?YAQ{&*VQ*GcwX2r1)WytEi`*ckJLYTX{BuSAuV;Y7kSM`xA`@z!!h)6lQ4VjZDvBUnQ&`?$g2(m zB-26jNt(0c!VIm_h+Uf}6WA3UBoiLS?DA!R+)Drtzp$Rchfa(B?e0l3?Ty#ilmn2$ zU^CpldBZ1inLMfQV$hrs5iy-Iu~Rz=Xqh@c>`a1#I6jv51Yi+&a&Cdg8@*x&qed4; z4_aad0}TISw!WV!-^K!F`(4zt=T0+^tJ`uzfvZhT>G`s4yI?c(aZ&u#LbfcOt12CQ zqaaM6SaU2VMj1TK`Dr%!<=RZV@hCzAfJSWB2jcDzfn2v?4CHZ0X9fmYlxl@v;HVEl z50F^2IpZZ&xZu0_>szd(f+|iVb3W)5$#^T|Ig9b3T{Zo97b>Pbu@0falQ{V*$(H)-=H@7cS92>}Spz z0}lI^&pq3dvSR?HR+=QsA$(016MMc7cW?1w9>?$=(9Xl64MQJDVh`AeMp}=9TuyQ4 zGitTC)z`&+jTz2*XGOw$$iW~}X*%@t9m9vi^mSP<_}O*dqo-uYdmo@MSWHFEz9l1u z63e3U35vN>b+FJBHl1|1o3CfqbamAh|8x}p>E$*lmlJg?i}oiVYwC21W6@<6nz>PR zp%wt83B)jIu$FIbjhU(zKF@{M-Cn z-ASf@D!(;cQn>W`;cR4KAzM;XLO|q^kS6H9U3;qtrjQj; z0KWw3Sa779$Q$Uts2myuv`$+`(cMNChD;u5oRtb?XDe6Sr$Xo3{mX6cl&^|FeM3U- zyGxHdUOY{Qu~D#SF0!;V^p-8K0%o^h!b~nH8{*xS zLhAb0HM=F>$_P$3wb&MPgYk;Xa)&M3ve;|h7&+4Q+l|vD~)FM;bykl zV!Xuf-B?V`-gxM=Jj!SnS`QWhJnls-o^&R${Nr?dOu6N^(Z+mc)WHyWG;FA@3cIbE4(_26# zB& z89`xj6aM7}&^#0>0NRA_WXU%>HU@g9wW09Kt<~P==8){#?LgA>zjo-^wa@hFW`$aUe2{U_bd6WL;ar{bg#(5Q^cb@|ry$B*}ij}!;0Hu4><)k|A! zT+L^zg3I)(o1Ry{eX=)QA3B)QVmZq2hiG8wv`ytAB7m*;KDmJ0tH20So%sAUU7#C| zHI-j+xh)_dH&TBXP&|jZZ5xX~_EjYk?)eB7AAyEn@p*7|EOC2pezxR0R%c08>cyk& zNTyE1@Wj9ol=j{mXEr?iI+u{NaXSnwsFPx)rlgJ>Ek}a5I4Kz!Jex_3`5PWVmvgZb zf-5J~FWOPm9nDK8&?Dmb_m8GqhzTE#k^_A(q}-O&7xC!@v5m5vz|_q^ycz0O9sx7w ziUPPc&RTe2B&%*dAE5)2!i?Q&x@pA9=I9Y}Ow1#2j(qPOQKVL)aQ^};D(tz%*p3Dp zgI+@L`k=SQ<|593e4g1XeG2mcN)k_rB$v5r?(R&5QqYIJLT%EXm=%N z+h-*M$;fJ^i*EXYpU7*+Pm=#tr&zm+HYxX+4xU)ZoRGNvz&j8Y9SZn&N8x{vHeXzp z$kDU-wZ`c9q&qpph+H8>x<(bz!@FJ3Fy4EAw-9+~^ov0CRmGFqLYjzFNzz`7w5P;H zp*&nh{cwG{tdCsv@6!Kw4DTl@fbT0q5Sr8!Y;8QIl#qUbA^*T?{)Ya&T|j!2Ub{bq zUi?>M`=1EmAF;p}o7xBQ5*zwDgY+-K;rHwL^QM6>m?>^>eNT4BV*NyQ+MAV6BPS=Y zzimDW`28v=2Y}m)TVLg+`U~BKfJ7mMfDEI+AkPKbf0aRRXFu2HYrHi7^dBy`tPY_B z!mJR2`B$IzpiCKP*s{rH!%jl|+bjHSH2&CpEDLDqqc z7F~i0v}0w91F^(2;SYTQmF^jO*k2j^1R5ViH+z^O(eLJdbQ`3X63UMlYo@evC~yvQj|rSw>GBT5O8>S_(5-2 z`(I|?_cIG%8K18&Gn{|_-*c_>A{(C!Y_v_nCqaK_QFjAq1PD2jK&*@%8+D&?>J&Q3P z!rKj6RnI}f{bxbUn|L23WEh)XV-}G6Dz>{-oArh`PEO!gq5WqJTMJO8xoGC5xw5Kl zgdCHgCsF!OX-7H@uN;$hH+B3&VhcOQeo_c!1&v9%rl8ubR(&09=IWhk;$5q;Pv33( zw)8hNwUR`LYSG+hfUKgHi1v4cu%+@+l2LDD(Dqix5Jw0%x(8CXx4X>GizLc$(StB| zUTYLg>DY#tMv#wAsPr{6y`VIRMJm?zkn0Q~5(qws{`a#02JR_YLmxvR9sVePFO&lZP~q zjl{?{mjwgwZli+U9tzNdV|JL1xVpAQbt8NNbUAR^PYUc=2K@~QR(&^pf%k8j;9vD3 zWMY{U^GAk%lh^p3VM$GW-X$5Gt+i9zVM==Bc)={_`9VKQy+p#(j%}xX%)nYt4SV>C z%Um>@X=Ktfo9FixC^9(ve3_LdW zuVG7HFXf-Mf5OgEAmb0ZunrGjSz~#)`R~46H6bCwJmY>M0wN*_U3VPC0S=eLjaBt5 zj3z*oz^GOrHIT%uwt9SWlC3A`t_ZN+49`xZRvv{WXzS&^rom@+yxCv)rUb%s_C3zA<#-ttm-UE3l-~D3Y!*Gv2%ss3aBFdK@lF)YXSYg!Ldq*=D@U&6jw2{2 zm@gi>UggrO?5ghnR~MV8MOnz+gv;lVVoD*Xd`qz|fd8Mh00Nzf(>8U)T%*l97zV1@`{Sqb(*+t9KO}~z^^TQ>FaG33K$OLTKVP>H;-w&T z3?<<*69+INI496+ytd4SR*36UiM^X|ZZ=n8RZCFS)4bV0ccp0zNOiNZh*?MfAg>Wg zjUZ*u)_nE2u>v@Gy|=<1+6lueJLnwk&yPbWp$iaO0j-Joui?6B8^ zt7W!yc@Z5FN64ry^U(BRvVc=aRdW0g{R$Mrz3m!EP`^ET@>GD`TPI;s@1mn59=wl( z0EL>7dAZ!OHWB13$9q)`v1Q9%1+tIKYCfn{_66VYNTh71avj{|?RlD{0I#df3b~oB zkC0sRI|MooVgT&>B7k9NrYkM02G)gU=jU&>d8bD8YO^G~dtQJZ_&(8D8X>%+rqW)W zUO%lsZRCg1*HW?tcUaEkUV}>QB68jreHNkNgJ0aLY?`!)zGj@Y^+n7!_i6&|;O)QY zTl29RWKY#%)(NxekBsW~(ic51N4|;%5)7O>_K7ujbOGC)@E;{sxq7NVtH`_jFT@63 z+*105pTHT+p>mJT1VPE%*BZ;7lW}ga3mt(CFjI7k=+figgU4M;55xo`JH*VKI#c!d z(uFL~E5DBX{TbrY=q_)`sS^EM&sTw)CgZ7cgTecMx)I+W42t7T&&#0$kIa}czBXrCDR*|ba@3byGR z)86Wf6G~_rT^ma_eSXE;X)87w*b39XksL^-1)U70NtyaBUeEp+w}ob^U=oCL7c}w6y{2;bq9*b!8kWE zBlDZ?wy+iox{(eFx}Yua>7IOG#HT}n{SwyI{e9LhfO5QhAO!pomfWQ=nkRLm$t-A( z=>^qadp3H+kR))2IY_zX%^Vy!Pj*M-vkde*`dU5@hwMkU=-iT3?W@D>RN_XiSq5`Z|Gnkb2|(9^M#q)$ytGLC9)k%Y(JD@~=gj zVQEz|xzaFLMk z$j-@$XsV#r$W`_XGJh)TImbMomoBLN(Lt`6P5XuGhtzDKbw|r9D3Awje-#-95Iq8^ zs6u8l{@u8kAV{HAcQ_gGRJjKKr(c~`|HB|fOz@wZ`J_>mv*~ny2Fn4>bD6W%Nc2F- znmBO(`nSj0MBZz3Ir?&+>_($8Q6(gxw|TSt)cf3jQa>-_l%WqNF378zC&03E|MlvJ50xB-Bb!dep2 z<*xXc8sKp>1%WmT%`Eqa3&~?>NwgQ0uj7;6?p|cu&0e*(wp2x{{zPo6IvI6RdxQ20 za=P>#+0M>x-!_|egHVhXSl<%=DTKY zr+zrU$B-?}rO{wy)p`Z{Mbr&y+Kvx;xgXn94rg30e@?##;MfaHq8zkTWv|zoeN20m zb0j?J46*IxNL`q6sZb8G%UW_luS@36j8|<-{K<}be*QFvpAt`jj<>Ue?!HWn zKYh)gj{ilq&kQmwQ42Tqw*+BJiV$bR+#P2 z5_5ZGpPWWVJ3Lowlb0t+n<^j$NS5yvX}9@ok1f8lRzH5BE-t7;HWs)VggmYyxit`nz|rHX~lnglk5fN0t3%ei2KrUoo%1w zI7En!{kbPT+2we>*f*PV1{PZ@cFSctLNV&>bxn)S-)6!Q$$jxMi_;8DTX>oJuvEV# zu0pZq$u`H1aeq#IZ?LJvUrW|VX`pBVOY6Hhkp5?$MKmb4x5c5SY#q4&kFmFotE%g| zKmkEg5a||BQcAj81q7tKC8WE%1*E%Ex;qak-QC@thdy`nyifSN-+S-x{zsg>&)#dz zwbqO=#&lFH{z%_Gad~#wKI(Rshim`pXJMR$)o4VO;U>x18=Ci-Jo^0xbDIvR1RZHL z9ye$8YfUN@Ullshd#_41Vm%H`smy62I9NA5k*2e$p<-S^p?xHy?eN zQKnH&hng(Wkl>NeN@Ng|>pPw;yjzNkV`m+hvW$Cf$!@kJr00GumPabN+2xy7;`iv-3o*d|Gqa0Ail->~I~RyR3=*SM}&WQW$?v_8-TRGqkH( z-0m_A)Su_nQ(P1dOHaJW0N2&5hG+38!YdKzk0)wWL;5N zdg3^qRc`G_Sq!5kqCfF4fsAtp1;EsIw%w%)`-xj3o1eUQnkgE?K9*eV1!X{o00 z`1tL;3z%d@^8DmtMduJo?bh>&2#gspl+4?|?(VMOs7!nk(fsSo_J4VWGC&xeaH{Yz z?Kh869!|5xQ3_F-)khj|t7*?fHJZ}{B_e7os54a(^+=U=!|O_yDuT((KXrD1O5z9W zKOy!V>&~>2(Y}PpJG|J%PqW3^e}75B76nxUq~I{_0)I(glUUpzs4zPz)1BOrBnn>h zH9N}=;PaZpFq;>x**~4-YSq52sNMH?0DEG~-Gv6q1EBhs}vyIY9P^fX!_C6u?lQ zl<~ZLnXXPF;*O&8cgEw-z04EX@mrzX3|zWKwf^~^7baY0sm7EG&%JW^UU>jGdR)IT zE?>Zo>mnx%-(5)387-GAXCiGUM(JwLDUwIL#V$$isUYBE?t{7OFH)6u!LX&0&=8Vb za4nWkY@g-rTBx3zkZBtHxZHzAZn_C$!fu}R3?4P8cp!zFolc8I%_5kD-|a(0M8ujE z+n`(QyWag!ASo(mfoFquFq@UY<*^gqwsExAUTE86@)5v#=D6ORomPS2lp9^_&AKZ& zae6*hLPi$i%K!}FeY|Sx!kMuhe$*A|5a_bhtO-CRGEi>On@QqN{q%aqAC<}Ca>YYz z;I+-5HTJ|%W%;vEfgAgH15g^rQuRf+{QoZt>oqeHz&v4Y+1p|M&2P~33U+?J8kNeM znce9)X`PFDG$Q6ew<@adW)hKQgPx*ij5y8UyYoiEC(A;!d5kkwR!BMA$tPb)ibyQq zxuSe9YR!tUiqFeS81$1;Ix@|(RCO}#`Nd&LZG?x}I1f6Vej=w~1ZLGW-+?KI#`nON z`-8MaHZ2ZdHbB-0jfk@>Sc>pPCemjA_=EE0=GzNa1AuC{W80&{)VHeKR4pct~Y-+kro?tcFt4Aavd@ms3orH&`@G0g9O>4BZWJY|r7zGk5@ z4f*OeFu0G|am1Wz0wC;Mk>14gDv<_t!@G zx)S+6(D#p)_H?8l7}QbXDE}30d9mQcvpjO2ChPr@mO8gda&8}sDUcJaU5lpsi0XVr z6-rOUpAPPIskW&@9A9sAkxzf8QaSRF1d-|7%`%=1e+~euo-|Jq+04j_a4e+D%dM*P zw&?-H9AuE`ReOtu*Hi3W4sFgr;?bAVAN&03SX9)v3LcGk#Q#OoPTwUJb>q;|!WkD9 ze!@w{FoQ*jNyhy|jtxAGdL84_E<~@{^oe%bJi<_nX#r5zDv-(I0u%~=2nk8!v*-y1 zVXeLXX9fKE{;fez+1)?T+h|?b$Iff5@cR;9PpHr z*wp%VzPY^w-%u#&nL9;E-JZnEk%@B3;QgN$_`k>hlZ6Xt00+b#{iolY-@m5$e_o(04`ni< z7L5_}2b=FV+YnGiKA5Xc;^F0?+In=0k}?BcREmc70vLW1B=3K@;s3cRy8`O@jvOBD zH1(Z7} z$QxNeb%DBU4I_1YJ$D%MTWru%uJtD6z^)*;1t&MkANGGt#s3)ho*9?~W6#GgBbq5n z=RoDvZLFqHs^RUc7TmEkfN_u|H(6(eVe}At$hG@Nh3nsY%D-psKSSgdLi`5fow z=!&&?ECl7-OUQ_ZHIS1;T>misu_dM#@Y5>{BsF!;($Zh!zjvJoFee^L^M_$AxEag5 zvFT!#O5pktTf7kNZ`hsx+Yl8g{4Qd7Vj^4K1pfp7hE<_N{d?Rgpat1+3v(V<^yaFg z#_Pd(NMUT zxO_7!Gyu0+com%;WhgA<7cvJIS7h;zAER)zvFGVP$y!!dmyC$der)HA>aS53*uo4) ztI=q}l``YL97uk-Q#}h)Q&U4RDU%&Y3lPM*vn%k5!vP_x!^LLF14TgQ;&SKQsbM!W zzZ8^DWV+md7elWRl*;2I1hBE#^YO1VK94M=e9bxo$4QXlMD2-WT+lw{=PgFGJ>vBK zRm;KXiGFtB-*Rz4KOI5d@&=H}6Ao6E=bBIkY ziLVc(0-5n>zBJlPJ_(i$gaRU&li_Ipan-d`{t$j--hL;3`Rnp8~Px$I4pKLhl<_R$62!@eUw5xFK?+ZolPRr{EV$QbmzWWSPou&?x*_^=*IoX)OUUmg! zy6}kzsCw*M+0m)TlW+owNeZb)KZC*hn1vwB)!iw4ZIcuy$7rl196)FT$iB(4T;BA@ zJ&7Tl<~D!~=G;XoL|$u?dI5q@pMRK>O4t>1NwvoS&gHkIo>8j{j8&58tv&->7 zJNOBN`J*$4{JHqPVbXBrM>g9-GJZ(Ct5e0Qx}JQKoigQ#t!?COo$l}N*mMqRlUE#Q z-JDa|8GT^SHf>(Iydofo6Lj`9|M$$qVgtKA@u&+E)0!Lzl5~x{7$~mgqxz&}*?jvS zElWU{N>M^F+wOS5AD=BxTI%L}oL0vYNKjF!HXE1)IV?R1<2C$Ue` z65*b?E(7d8DVJkIC4rR{e{vPSYnlG~4^OM6>w= zP;LGRqz8g*NHa0>Ruuf3ns|D8d%s&FG4sFS^^htrFSjM*2r*y&A!Fc=_a&s^#P7~xTS#D)zd*Fz$*pTJ! zu9)#LKQkI6;O?Ay;VqRa<6$wKm*{%*NoPb|OG_M!mTbU!^#c%5ud#EMJt`Dz2-`ay zh=iF;myAF9d|bZNtUoVQPp$YW^Rt|CM_6jtL1$ksmPRE6ry{C&UWGlK1|WU5Q4W6* z(v8HNoNYwtH=8Khl7>UZ1jb7( z`}wD4HkPAJ2EBe-C!Vt~PG?+^N-tLDa>ENx8u{a{A*(oIViy-Ogbxm@Z@NS@-HthV z3a7|x0or5|H+!?wd15NB`zQ2VpWUJAVCR0tqWRC)5PN_!7xijw7f9&vl-i6&ZqQ6n znxP#pW%QgdQul%B-}3b2IDR7zYjlgsEJ-G>eUH_%o`oOXPtO4OPszkf&62rj2kCJ_ z%FA1;T5$_1B)-*hvtys0sG%!EbQv1(ySwYr@I;O(tKc5B)i~)$%R?+Xy5tgH!Z8P~ z>|Aewq}U(d&ZIHA648ixMBH2WqSYLw?Twa04F*%eOZ(b#i4%F6lA7;!S_MxX9GO>>Irr&`o*F*3M-z&)3cL+~bS)oud~`?R<0B*Z7(QQm*J^ml#?CLddU0VPu$XA* zQ8PFsB-?JEeeWS@IP&2DDCa;RdGZW*9wR}MN!fXVE?4;Oc_5M(#_8w@sx_vhTP+U9 z#D{ZnTo5#aQWqH=`<4KJnlN<$dG;r7HfS1h;DUG+E?{i&vk6k5aGFu@_}KLA=Iq-P zf?>b6k%fsbxZ=tIVUS=tYwY-Em*LHbxNxz>kN(uh zFq(Niy_($Oi1)_p%*D2N0|5{PgI2qW6rv|4J{rqLcP-C67S)<(E6xzdQp!(E^lACp zD?5^}2cLhxQ%==f*o)6r)J=R;C}v*=x!XY(ZX1-uSbT;Y{&6sob){Pi5_zxz8Sfqm z_h}(cs(MMRsJ0X`GGFuUt!;^Vi!0t52K`y~+I8Q^D8S`ao63Y{@PK%_BsMXNEx7$b() zwYBzxMx7Na9@~H{NT~>)5cLK3rQa)4*;I8xntHEBEjvYaxSDs@8k0=KvZXmqLG6Oa zSn|j)?JS|g`}tx8sLpA7t1Cp21gba$jeChuUaLRaW@#PxHI}@h3ULUeS(Pul*?A-g zAB6UwSyRafIic2ENtup$=XO%Ab_#OT>E!2iU@fbne<@uI=Gq=Es9?GlcC5tFKA!Vf z(RF1h73zi|J6TdA*Xb<8-yZ9x}sv1ux%NFaNWf-iX6;$>Q<2tNR3T@Y}I8*Naf2tx`}f^5R&Z(bavJlx8xDOrt$j z(@1$%CUSB*^VgHtJClZdRJc3*k z{g{6PZgb`h>ml1nZ!w!pdoq}zY52a0-)VnvbY*R=okI4jSk#!48sNagJ6xsodBmM^ zqVh9bk@O9|v#y%Bj7mG-rqrhQs5U9XcZoe-sK*$H=L~ib{zxY9G_kK?L_85*LX*8l zpjvMDZYmqZ>@_pP!E_%w5D_|LDF+A6SF3RJvZP;^U_`kj!N^j%1OgNCc&0;2xul`m z2k%)Aq-~y1cqOQfGOS4|R8&;1!!;+1*{Tn#$^3)K1wdf!U3cxMqovX16y~SKUZTjc zEuGBMt9VH41?a>}*q!RH7hna8aL@G>?Rp@(E5qM)iM_Bo@FE6h3R~&Yc8J*`%Ig*m z*DvVPVn@-xm0-R-?dggW6~^UseJLHZzT^h)yVT(KD}wZW8r5~XSFrsXpZ7Tu9RwCl z6v^jx)+Cg$>XDZuofPRS!j3wEV>P{&D z4Qt4$$cBv++EP};T0Cgx<3uvzrzR4vSJ1!!Z@?C?8)r>(GSpVql*dr|9pNcs;M?t% zt|wzZ|D6A2_C-VJwQ{OLdV^d{0oRbzl1{#C132(e=SRAx%a-=E_0T!j{mzcMU*THd z(9JE;Odoe~FJikV_1pNU8mn5bl_M?TRLKTE#Lu_RP3@dv;8TwLD$Qnu(I*`V7UT4U z0aBy^c`~v+ak`aem=Cimbzf{iJSREO&T1g%%YrH`jw8I1s|Y363r4V}YO2!9hWufY zEk1tCPEJh4Bu!1tOj_FuovI2TBPsq-(^G0L2ZC9YMUx`h*lx)1IPmL^ZR@%!jpPSj zRzBO46nVi{{oOEAL*pd>112OChoN<5_Q$KQmD`+{>XM+1G$;Rp?Z$!ReFiUH!|XCc zl*b4(@9o|&W1am|=eT)XV{!^b_DE&HCJ&}7aPY^Ywm_?I?;^imoUZF$FK~KX%rLbU z?|(Vr#8(Q!@l`&%WxBdQQlg#Mi@7oBkm>`1p>Sw@O%-pqKeZ)7e^YC@S6fRZIH(=D$c0?9A7 z5(rLFQ4v(ig(QJ!Ye{o}h?5|--Jb8Wk|{U03$>Rn6f(9xq|?q%*Iiv^A}rtuYRj*K)zJbp;gxHtWwYyL+cJ1&c)!zo zNokqwE>>b7@5Ry93F$s&#bA4qJ3 z8Y^AKTwJ-CF2eFKT%*)+D}Vm~Dnotpp$&{@A7Fmt3EH9>&{fudViF z!{47LEj|xp=#}sYo5d8SX;E>8Lzq;V?IxF~OAn?;;}^z>wS$`mS{9RO6n|jFQt!!l zKkY->^j^lRl9-ZTvo*Y@*yq@ztZoU69<3i(Q*$lnio!uzHoV0^>A3U z|K(R7exFiak=zjT2q!~a_klYL9kpOXZqdPRe`sQT+Y4^6k3K)maoUER*f77B|E00; zbV=VQk>v*qBov|3OEqW$rbuqYmK z^4bmv1thOQbfG~ZxHZfVs{78y)xG1m@pZOUFly#(epCzQkZ!~`0jI>_u;>0U$C)yv zsIiYnWnKW=bGtF+UY?M{C{I_yXES)K%&bGGb#f9*lY~jcR4Xp6W^xaZCV4motGA-z zxEJd-DBPLz%&(m46_*`%haKo2OZ1f$*O%Z=K(ATz0X*@JWbokVsv>Pd7sPf&H_{Gvn|h z=sY5mo`Mkt52=J@#C}MRkBg5%qrtZT^GHkfD+D=?Q>fN#-0o%8?%JlwrT?cm*2~X% zbz~aL-ED1}+k{qRy#QfeA?4htNq19KhBD+(ri6}12u5nevZ{8R-d}N$6*c~_@oF!+ zKZ~XZ_?Y9}710y~lqpqdaI3V7OpZ*2OK-h5>_MG;KJ!jWO1a)33eLGq9it8o8mS~! zX5QqLu+UHb?;(g#mZ}!A0l-cV2CWOWD?1;A4)W6L?Mfr-$^X70`x)Oi<>rfO8p{)`TuCjq-YS8$?7NwRL zhW-@|s-ta#5;9VxsVa*__Im5q^Z_8jvZ@=oB?_yUr!2^<1Eu6qD0Y$WxO4s$Jux64 zAn|+GIcgc*D`H+}qf>jjMQx)?^`n`i@;syF!88slB;YdMr6ws8*wVFV2_bvNt)0=7bz-riJzmhlQb_^8NVg#L`0C zgAd2Bvt4`dK=v3)<4Sy7U!^q!-w!%pV66X_0p ze)g(F=@nVT;sIKYCQ2NUR$1lUaiL5uffiS@@vz3 zS1Q+=L2wh*@OpbabN0jj=t+_V$S13NlJai(?CvU%wh9pPn7AjO_l1z_)6APao?J(azuRo&ok*k7@eEJR)x83o+K& zS_{x#J1VPMANlV_>gbNJF)v86u?^<~FBAVW(>4D)w)Y+1KE}dyDcQU*5txP+C8D&ww-5wqfFVc4 zR7?($jeCv>U^`bzALAsDD>|?y*k69BK~f&FoDH%&naxf6WPsauejUN~4>%?+A3prf#ky^i=S?N0eM9ORw|-$PO5zUBN?#fbJnl(bpjqofDBZ z%lx@W+g+rMG6m-;Q-bHVzxtKpm8?n-^vz7OX^ih6aJMeOTe5PjQhE_LB5iJ?fEEJf z+!%eW?d?uEMyz>-z})%yIr<@+=@*ids5nRG25Q2KZmG_4Guj66NthWh1a6)Tno=T} zJFcguFmRkeg|yT?FB##bmp7#+2HSj;s2Nu81yeziFqYk-F=Wwq?6v{Q^7BMD3@RbyX10A=P>5SC4oldG%Py<*)c^KE){`dzAGB?KhxrL8&Gfa;H{8{V z`AupDW&X0&(jOD1qXvDxxDp}4Ef4Wc%@V!6kv^KKhGNZinjUbMk6km%439uz<;1fv zyrbqyCJKo0D!Mq|c1Ft8iVjJ8;cs*=x)@vNpQAzmP6}nF4KcjH&V2M!ukxKY0 z;`9X4(&^m_=htU367BUiWpAx>hs5PIrMhz^phzrRQtm5pVck72K#5RNK+l||Zasc) zVz=ktt-FIlg@${2UN+QtXS9q8YAKVYU8X9fxmH8X^%}ZvE1>n$%I9f^BnT3y??P^T z8CHT3(044x1-NMW1(nOvZYYb>4GRCa-KE*0XD7S~D6 zqrr>aiF{lHw8BBfkQlgW@leZ6)uZYKb?iuYlk6iDu=T+15L~I1TVzxUIp@x0j2f2~ zF>C9XnOX&Jva(KzcD83uzmnjw=3>rI@k+W^BQjwCP;(CIgZ@ml37To>f|AA2y-z#Y^*vdw<^y)&DFtdw0hD{ev;`bIJDp+Z zl)n*GGlY(2&9C{$r2NQIU=oTq`-GW%h&OPURz72a_1?kC$lS0gTvwA84{Z zpkT!|f{hf1&p$7a&vkW)8v5}wO!I{jvc0rSqK~et;gFy?awgP>&3Jj&`@t^j(nd!<#hcA}Za6HK2UJ5xARI%ZkWDdd@g+^(p!YGv zY(Ms$IChCDpBsJeOo7uJ*7kmB`Vt8D?yhU~>9F!` z3wp@eX1@()c)X+Fj`ilAf~2pg6W=ay-u&Zi4zojV5)hIruk<+`C4=0yQC*pLDanl^ z#AL``)|>F#?vBD=9WBtjpyjAb)O9=yV7l>%YY%)Y9xdMzI7#o3`0a)>o(pv$E3E&H zBxH0J#xriyu9J6bx@Z~ZxS3a6RrH{r5c__UwS}kaABSIsNaKix$Ct;F(Hq+p!-Gd`-J{i>oh~tY4>wc%wt=! z^2;F1sXKU10trq2t+P1DLw_w(q=yG?bENNY1_4-y5eDO|;Bd!Wl#M2V{;9aua2+C` zhb^no=Izp9m9L)v3UIWpo(s)aI!rvzDab8sv$jFrq=h80mr(j$vD6IOUcHZ!*zCI< zPMgQ&TB=WafdRS`jE9B4Y5z#lg!}@ZCHxFX1ejaFH}4e1)3EwH%XT}oyskUG1(` z9H>}_k5Ef;+i#`MZ#p7}(VS8YW!`o3 z=G8wlz6pvs>D>l8QdMSVHA|(I<2gyXzpo(@win&J86Cm>L5*CB_0A04zorp<;PrX7 zz)o)uC;Nww&lY|wqVO+q&1DZkEstNJ%pm(%M@ZyyOR!w?y(Yg?N>=^7#X=ov0|L@X zz|6G`*&r72sCVw}r{D9U07{7$RKrKA zv522D@@lM)Y_V~2a;huvvYE{(vo6af00}8B{ad{i^`fLeOjTm*^CxDAWsxVJO#gnw%9xJIj)zHO;l0F};yq#IGj&)kkC`+{Xtc_uQL)`Px($1>pKTN0}Ejf_o2 z1ONxm78L!0HPyB z!&2)VO#7POjRYkv&0gl*rNk)t6$N^$h09ZA1w*Uc z>0=-9_MR8O!FkOY!#mw|XNK-ViNzGRTYRaFm2!$3O0hkAm%tRpd0O{W7}(=Hu~yF^ z$5B`5>`1QuwwQRRQ{s_R)s#woYd4$ie}OU>Vj?%^sAxt~rZBF~v#?lKz`b zOxkmq`OKx~zE+-tH3>}o+-}ZR;qbs&wSp{dnf7F$QU<=BhA5@^zKuct{1~gIn9lfa zqTkGWuR1((=!lPN$gMsl=c04QNK}p^BVA`3I;bg#K6S+WBx$5-{t8^=^*>IV(VgmCNZYM4HkSIRKTKoJYH!yAh1f_Nj6* zyeX8l*(Mi9~F3gFwD1$reK zU$W`<1r<}Nkz_A6GfZeV7dvc{7G3Q5=xx1E)tMBf&1^8J$HBf~{I1AVL?ef)tX?ln zl)jUG{9um5rKAXH^e-&?x=JWYKs3kl%rvdv0wlR!z;QH_QU9Uk=9bnk>Mkm53AzQX zE>BzM?e?RaaLcy_+4>uu?if5~Lo2KrQ}tpw9AvG%c_ILG zf&#QRz^PHkyK74-`*!#qmnR)(_|-?0`sEfk?ucLTLa$zUt>>~7W;5RB3*T60jwC)j z|3S$2X>MBiEB+Vjqs4&2=@K#QHq+yqSJI|oMB`0_iiPewC+HCmw>@#tcbl?P_)){5ec5N#KxW(sM-2rx|Zn z7N-TxB85^$_D-hqRvDc;zZB0wT@zdm5tIsv#2+C8IvNLEdc}#Ep-iL}eoWNB%Esh^ zb|3CJCPj9GqOjjlu1A9PXZL&5qY$o@AranpC(lqR%^0yCNgAn$8(R&JuvZy%)*V2v zvpH`dLjxBagC8AaUCjB~f-0`b8!^9q2GAyo8-BGrun&C6u*F)=8WCDwzDK#RbqFV9 zy|_C?MU472Je>6qUYp$u^Hw5G7Dc$&e7%H0Z2g$?R&M8V3pSsqsB}7oNmz9=zHeigyUd&2{POc{cVC)t()dmA9r>+%O$b`ROWboRPCq+3SkcMZJ|2yl zfb{#>WTt?oBpF%W7|*zDd)!Kbg2MvB_#VV%QkB-e@q5JI-G@)#U~Qg39_PvY!CM4b zSYY?-cMTV5Dqk{$;B@ptUb#@9A5|K1MFVi1ww(y!jMphS(swtbxD-yau3SgLI`5s% z`dTSFKPd|lDU%VX18@>K?+7YBGC+9kgog3|h%tribJ zUn*06`PFn-{f$NeFP{X6l!3IL(VxH*p)bhJHquVK2HOO+1$ln4FGsc*HBPPcVO zQ2#935APz_#1(5o{i;)l#wyaQPu|DHrX2#&d z2m1}pbbH+J8x0W`X{f7byX~PJ{D57E8=jlPH#IZ!djQ%7L6M|Z>(3Tkp6pVR_yA() zbxejEqdtw?5zrMgA=dy3LvWUo zv@a{uHl=zQ!Xi0W+a$LB%M(pS8BA<*Ww12xmA1f4*`p~a;GEBcW$jCw*d5=adjMRHt2!S{!m$hV!9+pI7eJ+p-CWAOZr;bqH#{Yx0m|l zZrMiuu=Z#Mjc!Il29w0X;=A918~T&_<(6Blv8#@_WxJ&gd8&R)?5$lF_ivUYPSoU9=_9PT)z;M2bF?87&6kUr zRku!0Gv>JNJstX^xQ} zryQLtdwEQ{Cbd&?vTY`L<4&WU=UxwFqMzzE8{4uAwjt4$w*zNZmRo z=P$h{wjzVo%1H{hL`D6W(q|!u?SXpX_Lmkwe!y_sar0fMEhKDsT>WHL?apOgf9|6m z$U{QQga6?S2gSuHk0rURY|isoXyg4^^=O&iu%J`yY(xFA)&Q{px=Aar=%{nQ(nFZ^ z_@CV`3hxeNimp+nh#szkJbs4wnF1l?KT9r^1mGZ?r9}zV$wq; z&3$o=J0WZz+^;vK>sl!yE!&uYG7X?_>TQ=4&0tbTN4!0#1}HFWyQ z4bnoKnVsjT1Wj3Zy!G~dY;nYx2$U1=QyBglX6sd5AK|uBZ!>o-sr9aHPm7&gH;a#7 z+cKjG&BDZ7n5KC=t_|j65~PqvV&`McJ@RxUhG-(~Y^`}~eN>;vuwz0_*f*S^cA)%& z&jWvOK9+!+Qc`|&n;`d^{4i1~!T#6f#GAu+;%ecZKFvfTqC^3lHrpNB7%jd!9a?@~ zKK}R*3B2>yE-~(InwaFvl@4hmm()tB3vw&IO(Xb%w*x3!dK#=wb3nPDhd(bx+Ny6K zJjNIp#!u%TG90?V>4(AYe0jvs7ozZ(TK%#m?bc^wW3oi9LPYHFUDVhuML%Eh_Q$B_ zrMf(i<4k1W+%yk#XC2zQ$;o5THsAW18)$(u?3m>Cg>%;qX#(I7o!xeT$(!#`MhJqI z=TslS-8&fLdPYZgIJ|?{g{DB@{xh|X^FB(pq;(`N;2FK=YP$!-viw(PDQI=p_RT-1 zz|+`z3w)=LOyt3){>jmJ^Ql*kDUor!DY>-a-uF;NnNXC^QMhug-dY2l3EpYdYnJM1 zHoj2z8V6}vT$(t3KEg zriOah3gc3l%Xem9<(7zH_F4STP_Z&F)f7_PXp!mP zcD8N8YHT;zFY6Z-wS}dCe4>z*D_zn7vBnNF?C(2gH{;=nc~)!Rrn6Yk%V51SPwpd@ zfox+kWZX1M)A7a5Ot}x{cO>$+fW!%Urt~lVLDJ2}og~p4sn^OaMJ~pW>(<2LgChwO+X2cD3)FWHFp@$MJO^{y=4YJNa%QgV|PmP)cGCh zx6Y0yTHdl4PrS7B<}yz)H0?x?u*_!r4L2nKn@S8Ve9TZ7uwm|!5NoZ;)Ve(-I83cg z)l$L>f08X4MpDrn7l7uXk~`>aJ8}+hlOjc(rTj8aQ4WKwN*N{ox!9lShSz8?{^noK z^JuV=)RyD*UdNf8D|0S(Gn-QG*53!;FEy8Ifh2iUz!$M1h#!WdHR* z|NRSNia@!|h>Oyd=d^Q(H_$6t%+Q6N6Z%p4ymr@6iZ#^XI_(OiI z3lDrn!P&Es7kXQpu0y9HBD7|UvF10vtrIDDGN#zVAdVpg)W2!IihWl`FZaB`))@Km(S7VD_f2l=nZo{S=Ka{WjTtrn{aSwwcDMyh z*O1_H-Us2;c;%vNyv!L43b)$+ z*+ZG*_>xL)uE7x{`h&_F1eO=yVCk`FI~EU2l^q=AB5dbQ5TT~{iA6U`i-h-V@Z5NhYVUdak0 zWqVAP;?)0d8xZ(&ou)G)ViLeNH)bKLgY2GRf1rn(uh=B*q5Wi8pxQN`DRukmt+kSW zAZk_g`+<6e#ajQ1ghng+Ka$VdMaxQ^$E;^A!Ofv0vUcWM4wDo3G ze0?n9*!jWhQ1MT}Ita}xu)*#H>Qu)fk-=~x^l>wUvZ@%7|Jmu$RIJ-ISwxX{11x*#Sm zjK*5e6uF}}tUNzxx7UJBXL;^~r448|j+dH|x$TdHcOV;QX8@s)0b@}tbrooD} zuCdVz5GrG_P)D;r;LI}~W~P<544*KWwkCSu(K^K4*+;AsB7p-Z$8m2n9cM{{ygfak z5D*ccTUc1MPF}^L+JR2eL{B!^m-QTwW*r!j=4=n30W=#lEiJ93r6uFuJ=Tvee?SZW z^-zEQg8k-8HqpgW46n9rDLZDaTD`Zmbel~aMmpRE*Uo6!>*R|d=rR$-D>Dvk57>6^ zy-%VoM|^V>LAGT{Bol>8P&5jb-tSGZ9*Y}mS7DR1%hs>W{Ze>F>r|gvRyg=Jayn?+ zT%hLdYa#Ciut0IopIL%6Q9CJrwf)Lc+f=yND;7!;40K?Ord2~F=5t2aO~A8cG~iDb z=PIs6#oBn)dQ95G{gP%*!Sj7izrfIgi{;@5F2Yb=1g2iYOWk%lygjAD+*)p8*KfnNu>b-YAXQu+GQhK@(Q5FW6m~$v=uGhHf^_%dD4G59vkcCQg+M=MAsxZ-Z_(P5Tg= zX_G>-=-}5-fk?*Y#sq9A-hhNWxZEH`i+$69C0=pNcX_KYW9=ABE%|9Vg&L$K=}jQ+ z!H~~hQf4y#d~dqdvhnT8r+cPv6&Pn`SWB-=XTfoxc=v&e9!t95G{a2P_D$FaHDNy%(-(?tYyhYYNQ*|fJU(NG?7e(7 zifKCIWLWvVa$B0v%h%}Ag;;n!Sp{#Y9?ex(QZ3g@Jm48F-NT(6vSYk$ba!)MhJT353{CWwx^HpQ zge4&%q3V7NH7^Hc$mQy4&uKBg1`u*7G{!?t^`lE}cj=<%3q8<453mVN5A%5dc4jdB zS=A~G#eBKt1rEKsC!nz1wwfom5c2mq{@l4`V`?$2scqA zvn9oFbcRvgJs= z*S@Vc(KaV{AdlYQPaZ<)W=1wf(_g0Xg1Z!G>V+lQbk<~5U)@)&u`3v8np%r>jQlFl zpG(-eh~wTVynF7G_R;fetTXwG&=l@`4N-A+1e5?pbh9_SY)l`z1&_C7vHTtIhA6P9 zKpsV&({H30ISFlEVjruMR%cv+?lnP8bRX4RaF=fMTTP_Y!u3*C5PbBES}Ag_ov$Sn ztRP?}w`CnEcO_A|8L2=E1lMNmNPx9;gXgiB-VkK=ZsP~ri|H5eE;r6Wd&}u>ulw)V z6qFkMBZ$mL%Ne-XH%v6mwgR;For}|5Rk-UQo`;f`)eYmDV1mA2?jF2~d zBuaJKIXk>R&kfDta`QXOhT;EV>@9=hTDPs?Kp+GN8e9Ve*Wm8%?$8k29fCU~xD#B0 zySo#DHxk?$g1but4PR%Uv)?-R-0ZJz)%w#-v3jjX<}+oCF;$6t%ff>_r0p%87+U_t z;?XgP-o(1h((mk9ttP0r-z1br`eHf%_R)q5%c@m%u^+)_@p~zuZO}}Zj?hTt`_*wF zyr4ya62ajv7iuL0-`RCX%Z1WvAegVlE`J45R^O#&G#UibpvDQ|JkH%C$a;V=PJf`~ zJbgje?ipMUx_g4^qg<_%uHX`XH%>;Fie{m1$@ z3J{igX{J;uo#T>?R-yp8NwB^(H9O2XH1ET&oLyg$nK;zG-%}Qx_l!9<-`y(Vd|u40 zMcRE#zA|k|@>0?5jl!P%a{VLHp=>VM0-9->jiOieT|vMs%vA8iTQq>cW7OeKK{z%t z{d+VOjX|aJ%#lUDD?S_7RTR*(7zIWO;RXltCHLD04gq+ky4jsiTS1BM*G?;+Agg0t z@Xhu0SAL%eKlwaz-#%=4>Y>?a9&w=9jnuovL|a=KYC8zF=oI@{?ixdJ*X29RhOO@u zMtTlEN7^l3=+E+`dqYwfO;AWt@02$(yWJ@?2*RO7$K+Mld(F{L?SqHVf11CnY}Yy4 zL*ye|r1LQ3>fY@Bk@H>}oyU2qE2P*O`!yU;mG7PdW zS;gY{hOaqt0Dc_;u0Rw2)M_hD-3!0O#jTWZG*a23DnGWk4Cic07$H*nT#Z_>}6Ji@?v9LbPY?zOI0UZmW3T}wG_LOmWSMm=``Fj zFFQK0BJ(Ly52Ba$+<>FU6*^dnLFf}b>60aL{=vI|Ku9~t?faml8#LQEO1};lHe#=_ zty8co(lb7QxYT6DSdmhxP48N@esGnPgmu0F{*<))jpQvMJ#*MJgDhSuw4_wPomDh+WKf@>{k=u>eL70ip!6taq-&b4uJmqzt&(0xM~Aqkre;cm?lV;7 zZ8{z|Bs{!-+TZ;AJ@G%SvN&egbS_$OnLSvx3uwqvwtFbaq2FIlz>e(j>RIpV<>Nr+ z)l0qGms~g_Y1K8`iuV95CAKmFwJ2-25Tr}BT{kf|RI3Nf1tA@nSYQchqo!{6LIEK% zWJTF4?b`XF7pl9hKb4)%YBTOCA$^VJ)eX-yR%N#jwrY#8#q~7 z!;S>qR4)6_?O1%RZ{}C@oy2$d*HMED`B$8c=1V&xoZs;IAD$?12KJNiFVcPT4Wb`Z zdB0mehj-4`XpHKdgq-?Tf9g0wB6PB$R}%Bist*v z71Rs0j!!>6hezU?uC^jxask6#tZ*f;w*b^NG1A{Y0`KOD!Dwgwq5kt#}2*XkX4qF+X*Rbdk7#8~#7`YH;VfnS%|_WR`^`q7lyK??LW~w;b0Qi93r(%YkMG5H?tFSgmr`kM==;t` z4>gdr6zPVf+u>+;e{GOtlvoTlr8&7*Bi$&DNV8wudpN9yJS=)hXyRwoiE>F=Etmzw z=G;;z!y!}u93`6H2A6K0f1FQB3d@<*9$9wesb`-&`&pE@qquJ7VIZ6|J69k)lYEoZwjikzUTqsu3Ok>TM8 zTG)eajpdOIjFB<9RQ^g2h(`-ZUP*7MmHME91q&&XvfQrOib3Z*E^oxZDNhN z?@IZ@6{^;VTBQa#IXJM%|3!>>{Y7S&cl%J25mu-PUKlD9mMgNVTl0M8L`*pHci{ft zety6QICh7}s9GjCLVY*u2=$NN)BZE32E#H!{)gnHWh*cd&@L3?-o5$6qY74<3n^yI zScHO3PsvPnC>ojixthXuHBBRKerrQ*sCxNL$lg^(cve{YzLm$BgO6tIT4EeIMzm1^ zVHsTSr!4ZZfSwIm%~pYq_M!0M``mlmWY61BVv0A?*U7 zjg0<*vkZxcz&lDo(28lhRH0{2^BLaQ|NYJ9$<|*QI`yzLf*(>W=wtX4Pc#d*5nZYQ zu3gUI42q(6e*4T9JE8V89bGI5w29AP!@*%@g|Nx=cg81oW(GTQ9I5_YyuPZ#t5fhq zBfGpJXSdLLj8r0JyQZk6(bvyad2^|hcN?ZiOjh%11J{lhk217;*XF#;uZoeEyVafX~4HXr^-Ti+D(MBm4_H-QHcwZ$iv) zVuJl(KAfk9*4(D#kZ@PG_k28QV3SGavNfsG1X#6BV@A8n3OL~?z#+qmVs{Q3GGjwq z=81=^b97V%1Tyk|0w$vgeFB8{B-59&98U-tLse9H z&34S8(nJXN*W+2as@;Ym)-J)X4iwkp2!GR{uCr&L1PZ3Bljph)?Y*L~roo7A$VF$# z^JsN9qCwT8fDPFTzpEi=Q6>m{X)afYcalwXw!qhXx zs!>(7QJRB2sS-|)l@X+eh6{~vy$nZ&?5mLypBD}u7n0!OQ|N6_?a^g21M(OfgG43f zUM-H8WTz#6bGqLYM_2ofIqx9Wa`#Q2;}Fm7z9h!Quu?=W3Q%dFb}_aAg2uyp z+Qp4BIp$>P8cxPf>4)3Uj9FQ~;Ap<}-dnlzb`NGfSEt<*;yja(*LJnFa~1jY2i<@r zlVW!0U`^n_=sPjtdg6Iizc7=&M=nl!?((dGEN^4FScdb{?n9{_5&YHbx)BXs-|y3e zXfiJ?Q`0{YpjH4Xsw0v>enWce`m+Gz#N;&8;v0LFEgkX=?1C+qbJqq(pvlA3^88E5 z7jcmQOJ7e_sX<qY|icXj8c z!aI>n4BiioY|$|08c5 zPzooTp_^B-q-C;k5=)gC7q&ap*QJ+Siz(LWCswbjW}04Vqqi zsH3a`cvyI>5fOb6f_imHCX&4Oj34}5etdBo-vAZr;L>QQ`X0iFZ7$*0OVPQTs|dEd zHx!(JvILNpaSZ`msB-7tLw&q1o@dhgaU0;+jSopi&&erS%n&~(-ruFbbt`n~sOVQx z7USYlAYHe2U|ahwG-@v9fjC9damea++BQ86u{+0t-x&vCllcJU`$QBN`hQb8=?j(uYwlWE@`ybs(KzP zJ*!u~@E3i_oaD@}6rO8i>N=W8K9*{7(s26Txi)`dNPlrg$;tbWF>3|maP3LxI2vde z-4@~83iao3sr?*P^gfJ_%JYnT!@(=F_;OBY4f@LJawqgr5B4ivEQw9#hM5^XQgxk1 zg0=Hy(@9tT3efqHng-iaw~L^mMfgBmm=7-*3$yb^dEap~g6x<6g@ z(ac>aH;q5plTpGr91-k*Uo?deNKp9IFR*p~?Ko2^V_KVWHQ-+w^@@%QR5dp@vy%nz?Q+?#z*$*Yc|9~XH{+U7e{{)d z6_*rD@?&-nY+mybEAu>E6M$yAg@P+PCad6Wm+LUnxg5+Vd19j{AJKzpO5^^V+Z_rP zj@J|EX7r*?`bZzW#Bo&Ov4?j+KpDd`db+g&uXnhjfwuxPLZ9#QG)O5VdS6M%KU%T* z1-UjLr`PV4u)?$MbmT&y-F-iZ(42nBm%$~45!3{CBZObwHw23ajx=h0see+DxV-18 z^VuOq@ZKg<@m7Lob3oH~;7l=#4^a=zVOGa2M$z7+fXZd8Il_`6?bq$q;6ZnEDb=yf z#5balJ4;P0Cjq`)R6J+hO_EEg36kKL>!p`f5$+!`V78`nH7Ts%e?C@5ZZD3dl{ww) z+}_U~#%WxsvmnYvfiNjXnV+404ra`DJ~j)3WFIjpuO`O5mL4O1ou=vlUTaW6UGD{q z9_&M(XV3Dw)9Y3}+kYDg^R)z8L<$yHZ`%tO%Z?&7omqi?^;l#WR!8v|8_UAw+ z|2wl$&7QLjW-%k9fCdh2Yiqi(G(J+6H&0V9`3eNtSXo`~Q$YQDSm|E_fj5XbHYcU` zH{OWTRrr2Xnfx*?4&8qJukOI9LS!Fkb*5ZazKBJzQ~pO<;qOiU*QpXm3M&B=iKXrp z^DpPwKi>wy?p#R@8ombEo2Phu{z(R5xNo4W$6^*rsFRc6m?$c4>!Y?7?&=PQv0gO`&~ zZ5dqX0D&2J{J-3hgLO<1nCj<&0Ts5JeKQ}4SGtLb_wV`$wXQcK<(@A1WNk?G*1{h@ z`!X)JikgC3)k9-Ycxz^_1XT?!h4J*ptNDfG^t(OkIJ{%R!E*s7wh3a!UnqY#l-BNq zcenb2QffWiTth=YzH}RD+NFjdb4ne>3jr@$TG8QK93bG^jx^y8a>t&6x z?MoylvFD(@gmgq@@A=1sQr{-V$7z#}dx{)$)AE`KY|K>yVlUCSrV5HR4m?yf| zc+c|7xgp=y*Z0ack*_st!e#PRxtcF6(LO_3y+<#09ctfty&{yAZ6ybe3=hlfrD%Sf zc;AO$A~bI`*HnSBu(TuS|DNh#EoUg}2CC!~Oze$%&|oYt`R&!lZ$ea`>)vQT%%G{X zBVmAQq4PIW20$&QAo!7x_%b2}{#L*EC;mSbVAKIg6!)>k;qEtqB=0+Kdb9`w_=l_V8LIYTm_GHb|QA zTZK@A%vX-8SvZ1uYr5$R*7&sWAm9=}>lsmowYajnJ~cmuvI_J)Nqow@#NRFtH|*n= z^U*=8Vapdk&Qfo)NFmd+a{1}88O@X15$%!T{H2qO<4RL47>M@}R#?n5X#Gh!7w+SY zy+*?+20FRsj7je?;XKwhzf)pmN2(k=u2u^kY2|I=56zll1Agl2k50r7pn7XThG#ce z@zbReOHl8yPCO@9d|H*$(?>l)vJL1`X{9^mVal3XVLQZA3mZTjA|AuL=&af9zjf{( zH|frJdQd8U5DQ0(?66-4Bdwft*F}osk=zr=Tl+evltv5$eX)xV)&Kpe@ zfjkT){!TOfkDd4Thj$>jh>Bp63F(|fzfXgC(}nG!0vb@g#WA5GB>RE)jOQznz zaon<@%xx)5#m}tz#ts(W^lRTEMXRTWHcr;Qald?dVx-g^Uqmxl0<%)8omQEvp?ADm z`GlMg9H7SyeX5|_Rb^-HDc3BuK4T~4_jxxW(3m;jk!y%DPUoFn?CaACF>-9Ees4x9 z^p=ra%yJoDcGGZY*s2wEo-TQ%ca>+p)(fo5YNX@0J!ddZ_q41_f6wRyIpMC=dsE4) zCsOT>;`}m-)kvoH``z~Da98n$ep6Iq2UHn|>TIlh)&ctgP=x zE5G~usZ^zI!2OW2AkQCR00L}Tbir%x*s;|mo4pFvzwLJ%Z0riM4gbNrRL!E2GifP4c1ykE(u;QaVBxb z1gwCos(;|-_%cKQv-p^=`jmrScI5dBjpL}+?=sKsyRQYAk)MXf5cf{<@GK-lq3MWM z*C7MXW4khVms5kP+P?9|!tqMluPY0k=0?k}POI^|`Ey+VJe>irzslw|lwu<-8#1o= za_n4bETx;xAfL$MBA%t4(h?RhH4RH|O`&uGR|bN&Sa1EDZ# zx?!BbugEaY;*J@4tRyLY|I{Y9o+vL{375ngb5;B&hr@U~QGd;37pruc*M1~0lRWt^ZKEU9-JCbGFRyLb zlaw1wy$1*Nqk^}hRy3UUxzC>`fTdVv57Qh0`m7W!;Pexsy>#B zIB5UoPCLB>jUilvbIU{=&$eKkRvii7@Q@y5@o|o+Ex+npfjV4h;`K6!c`$jZ&8N5C zq&SaUfOD>Zd8gBq&cZlIcg1}$+61|j%OEr9_dy0JxWtw+Y; z?RG!u3~=|aeIReFFSr^O$RK;451&*w60IDP7Tw+j7v1(Iz}r@@2$NE-9{p@bVM+a1 zJ7ph=*>3^Ei5Y!Tvr6c#j5>78fn?Z@H}RLLOSF0kP#o7)Pzg7F-a((Mt0!0D!IFRQ~Q3)0a5xppyBb|ytJHdsU6Dr;L3RxIsYIcT7md%(<|Wwn zY5;BGF5R6_#B7a;C-e0&lkL_>8k@z&y2?0?{4=B(J`5F~A*}=a!}9Y=7s6f2i-nu3 zZofbzY`US0cUgb-|K7oZsg$>fuRfVuD|#KXG1>0&-*j6JIzw>}Znue=QvhHG9g5xd zQ=@Wd=lg48@ZNjE`@Ye$uMm&$O3fxZI}|h1JTRMsm8O+d4z5zO%>u^Kj04*32`F)C z6HLpHd0q9jlb<#QnIcs*K{ySCnA1AO0KD?4{f6G z?GXXcWp$Us(&5@9>clD#2vX#N~Em};i46*Zv)b5VT$33}4kdR?B4acK( zpK15$x+2iP39>U=LU@k1>PQlju1m%ehIy?Te$09zd_g5wW%03KxB zTjJ88AIE7GqqMh%T6kE>eJQI5>ry%5$CKj0q8X}YBYSMK8Px_ByAiFE#(R87-WHCpm@nL9g>)sI5ReDGoR~RxU#2xzf|b+ zPu3JqELS?bB{e6Y%kkFol0Ea%$Clb`*AqIXyYJJeVx>ZXLJuY0grSVQrAyS49bd@5*~ z3!n>Q^OK{*J)pcO@J18Ur=l=No_*blUpJ_`LqN?f>W;-5!eI6BRrP2!AhV*@IA@x+ z-)>7v?mV&CDnhXvP&7%d2OTK}g>`q$S1W2x-vPY14mITs$QDo?AKJKcQ*Q#XAMFn~f08}Sjd#c^FijX4UvZ74BXKp}d`sm@`U^{5{rse1FV}Vs zrxDonnhF55T!g(CTSP|U6D z*au+NB~(u}fKl&S$$tA$DiAQ>6VUx0Awf6Qa?z{#>(O>fn9 zz*umR(t6TK&RgAFhr|}vDN*^*SF4urhItKQ_v)VrwV(+xf>k)=xteK_2HTz*dq4s& zMwS*}W55U3>fB>Qsr$B+Dd|4EmK6;b#G`_loSI96U2exX%DrnCCpEY~5H?Xo^5f}a z%emFVUiDu0t^osiib;h>8b@mwy^3|4lZqvBdG!zhKbxsC@KkW@L7ni_KuNKc?Mq!v z_#B_&UCX9tAN#M@IcY!n_V3NU@eZ(DY``@3mWrA+MXVx0nQ5WlN59mh8VD7AE}gH| zU5+lFMPSxqwn~uU)Eg(x!9tTVd#gWlpiMV{xj8YR%`hM&AO2v#2?ToU;DqnLjlsR(5^8=ODVJ(E1&s}7TY4y1CO{1~3PUjiH zWUUE;qhpQ5(X{dEeKfl7^w}1X+QU2VKX3T;MKYs3h?yIX9XchW#J(PbJE|A|mvr0b zBgt7p*f4xRmrL@2;4e$9Oo?R?K;}f~4|@`rmD}uajlpAdDqxPOVX%6}zmG9tGE5fN zVCylKu}TMdQd6=2iLm?chd>S3ydvLcd_uZZ|aka=!T z2sQk#+r|^1y1!pAC(HGuw7a~5Rj!9V|7(F}3&B?T&E}d_Z~XdR4d{BEu>&EW_N47x zdqS$Huu~teDmDyKaPd=Rq#qmeBUKE-JOYU)@p1h$zGhGF(ER#X%KXo-H;Voaq0@{T z=M%lNg$=YWT;sPh1ACgt`-u}Vsi|&c{!6lpV@N__4k#x|F^gArrOL4V6(Vi|3ajlL z4J^S-H3BN?4X-;?Qo52VkV;EBCHlDDO=?z+%}9zxonxi#AEab6*sAg*;VkiF8bH;piTrL_xSG9ygJqvkHE4zSh528VF_}lb3FXM$SaF+0$U$C+|eexbklzQf>$cYvkF#9q(U!d?_v(;k%93##WC_uuu zO0QX3o9&mk390xJkOs$;#RC)0Ssl`!p_R6%dR}H27J6N+I-o&tl~!*NP4JlA`LGTZ z#_J0jD2J-<(o-35Q~>i4FG3gZ^^>d}9%o!{H~?>YFpkQUhSdJ^frE+(FeMs* zMx_kvPQChNvAaW9#h7baqnUcOb)$qB6f4oQ^h0vVrM@nsc}PnQDq9`kfBec?g4Yw* zB!As{1YW`qibks`*G42+84YX^WqvC z)T%<)U-EKIq_Jmd4(Fu)rrMAf4a(~)FQHcA*18VwIg>Qf%FA!4qlX^5EuVHw1ErYa zVmGYzKaFdgBZoNO#3(~?L0`1yqFuQO-ISSKOKyO*tkk#L&qdy zScDS6c3O)e@q22M^-@~Hf>Fm3{%3nK!N+Q3{~FG(O7BVxkUu8INzn~~F1$Dv8 zAlAM*6>`)gr+2RoyI5cI-a=ffYCBsnYE$SdP1$Dms3z)hG@k03gtauM?t7)O+ zP{Vlo4)XB4H$^ct+=a}gnz-@)p_%PrPNDO<5&2P+FaQcGtZ8Zr<72>7e2njm^J!Xt zCLTr;5_InvbiG7|rT;-rf5|KE0D8eyWwe>%LZB@REE!ryT!r~aT(|mcMBwhjUg{7Gb!V{jyP(0Q;tG6j{;bFn!yO%8% zz)UO9gQ)#U8qZr294cQAB%})~s2&ZwL+{7XWUKQo#BWxUJ%L+?yK+sHx+=rq%cK3nZ5rjpe`X&@|4WR}BAH_jWVJCN&IhKzSC3!@to>;4h=*mgpJ^^6aU^+;A)hzHx)OcRC9L<3CS?cv`bLMK? zaUUtoFNZY_4ZxLDXa#H&z8z9S8yBF}Uw)LloPW<)t zEAW<2AmO1E5+zkt7_)Y^SGdBT$&;0T;1sp6QmaTi*2u;}CFx(h4hV2VbhL2qt8p^z z&x{zE2@~);w;&)9p!FQqAK`CP(qR}jxQ|ud&s_NU{j0rxts7Z>y+zQDT*Vjcik&@!d2>IM{G+O=qk(=4< zd26t_x69+QKkgyON)rwXC;Z|Mmo5^_b;e){>)|UP+kVW0IuPu$gSV|{d;*vH*57!< zLt2Lq940QSU|3Q0vAt@9*6vnwO5%-+Uxw_q8Krvvk%Dj1wKX#!i)|o$O-O-z7pibF;g+QOxEyQ>h1o!3o43d(GBnHY&t;fzYXb@tQsA zg$L6u2~^44#c&ZRHv4-H%Ch9V|JLVeo@!f)4quN86eP8>_lx7B^THPL7(WZS8V@;o zwBsjvxZBGzFY^Ns$r$=nQUjamG&JKIF9^L(H|cgeoRyui=nGNnVtRJj%p=COhS3mp z0H4kRA3_f{mAcUD7%FtSq_;DL;?iYlY1>O`YLr>eO(t0UAML%upDG->FoB+i7K1Ta z4Q6tz#5~R+TNbnq%*?HP`XYatG2vVZOv@&|J+Ry;*{wq5ZINR*D8WInWWK8QRiMf- zEqhgD*?m`|9F5?)d2);eX4tBXe}N7T>~d}$Mkty~&qz$mN(C>qp)t_P7#~l+nazL( zOZ4Uo#nrM!H7z@DJo9@z7W0IH79TKXDop6?-&z2~phg|7g%HdfB{xq*yGLJ6mj;W7 zY}ouI74^Yv@`+GCkF^QWUN7mkpd)!*9=%RA{Wasch%7XqN4VYNvG?$eB)B+&v4(pv zpW?`%d&W|FK0dZXxGKAAYkxk4Tgb0FgPig1N@L3Q`2$*=G{Q9>#TL@b({%aDqoYCw zfPSqx@VNjT;>^>1L+~L+e`O_^PR3sG7W5?)Zl|=NLcYx!GFTr?2oDc0JAPKb7n?N$ zku(Z&CIpAxb zBaHm?P&br;Ne9H0MaDE(af>`{vD5EUNV*-2Eh?-1W~5ke5kOQ{Mnma6ILEN!$9Hb~ zoqpiaf@)^rHlQ`aC={_ z&*9M%KwuuU|Hr|s8brUcV!73Yn%4XN3SU;pS5rrvwBwSX(N3?~(fKx8!1eTHY}p7P zT`-zT;O<3h&1b=9-)Bazd(Z3JZhw&B)`rThezV-L=TqyAVBbUCN{CH0wCOzXbeih1Z?o+C)& zki-}T(kK5cg|wThEJ>Wa#glA8MP+!?$()R{^QG<{4i`sH!yV|d?AGl^aXeOCo!vNs z>ksJ)OibZRy(S(btIaB8Vg_^=t!M7S^Jy`f^3DG$<;aL-buDlFQ3?VIFn2JkFYXUo zu0B>vbkT;)FqV&Twwuh7GPpicBq)gcaJ}?1rw4?Ja(Osl7zZ)K>O4XGqi?L~8hl;a zpMB1flanQPCzZE--?}|}oYm_yDwsvU!wL#A09lEyQu2d|e^0u$cX)b(>$dwoZPJB_0{>LpDq_%=3=hRCnS#=?qNRbiooH z3hHj-9(v5_=V4cw2Pd0K%};i1WkmR5u-(sHaYgc;`gC6}_JXelw1i5cveSxOT9~!Z zGRmSX?7JbHGFrO2=D$bm8NAL$zUdGN>9%#y@XXT{8@^L&Qn zQ2vh1J3b0^#Ss_938HyMS<6%wWzO0?-n+HIkkxDyIa)3Xg{=(Tb>Ok`q}J zmZ(eT^KUK0s5+-#C3@k?0o~o|;P1nU4Q|Ezr_Fw792~eIBj+Pke$Xuf`wn{LrU|p? z-4)A+yW1<9Q}RGcmePm`0L{6RJ!cW3;LP;GyVdc?)?k1T@j{C}w2uXR^0611DYEFG zTK5#1^ilG~K8Dh_~`HSr`Rx|Ti>(yWJAt%Ji z5=nqK=8Iql&L~bQB(mSG#s9v9k*OzbJti+75}ZD9xe>Fhm}-yq9}O6&6){0(fj1-5 z42L2kPI= zw|mYA;L_O<(A#WV?CupD-0$6>ls(EcO|nHD-$}751%#(49j)puZIfVP2}6CKLZl5c zJ6f8Wlh4F{R2_b@M_KRGJwO~Wcg0;ZP|nO!EuY3$#yely&Wnrg0w0IDwI>6;&*39V zGK&gwDOD`5OPT3J|KK!3-RM9Z$)1M!>a+ls#>lQxkBM7ij;Vm2-pWHtVi0`S!7lTg z5i@u+j}b8+8=2#W3*0_8TE11sRBr`|R`nsV4!s0kDwMZ*>l3)9Y8N>|daC1PoFfLH z9Rhb(XHG32g^{~k1w~xueRtMTUK;?|WAA2|IZh}t-w4Pv@vw~=ypwX2<=PGljz>q4 z89#rzJm=fzK_y@f+LJ`Gqd) z+>Vxp&TR#Ktjsg_d!5+w^q#Ra0OG(;B?XL&#GkGz4Nt{2@hJTK{HC>2^9RVdd(Vd6 z1~VQ;LZm*mJu}@xBBQAgky7ub>BtEM>}~Wv`klhLg_xFpdJfkoA*BXa3a#GRIWDE$ zV#P&m5izH;$DFhy0&;pd5OEogm13@6ZMHe_x053|f?T@hU+U~k`HXQ^E1Az@OTTBG zmg;Gy(-r0Jq0Z1+m8b(JF7??gie#2|lzTjUhOHhhz^=~Sg&$zIbmzK(59<<#T-HSr zB%vaT7SpQxJw?gtnI4LoGFsa_4P`;*aVl&5VW?6%%{(j5$VX=N0xm`^ZF3S0mU}+G zO!};jzVb;lDs|r_(9xBPuc`L-_Zxi8=62H^`u96l5yKD?9#*;?bJ#}pink@K5P03TzB~MjSJ>BBk5S-(QO%$AN&+IjnBHoprtcrtW-F;0 zO^^*p(y!h@J6Zk|0{H4xQ`P-8oB#Wobbih5jUdpC?StzJ*f~p4Q#;L8>agorNp2xo zt2G>|>zN4kSU!@=dO%6l_;o;xMaA=@e)XBmG;3pHdkF{RnCxcPC~ znIw)UD|bd$I>>aU%dS>+u76dWo48uPF5VgE9+0dB9)cI5~M;#r3ycU6zK<;)4I%NRKH*5X8& zajFc{khDKRkE#cU@MlUP+JK6exgOR8e*bpsm{u%=%gm|U8o+bCy>(dby%Xn#(s~j4 z*#WX^qCzRilwg?o^adK5$+ms?b{Z0FI2riAX8`)mBqpM^!?M!b>CN^%df=fU0mt?U zSlPX)FxCIFHK)%!IIq%1otMXj#gilJqs2!8xz6x?_i+MxuENM;w?vwearti?-9A=V z6ojo0aKrh%ZVTV3L+mHQ3X?L7@t6R3G$C@hNXK4nI5pzsssEiy=1ck{6!fKrQoRaiCOzM5$Cv2=wEvnAeAr#&+2?Mr zI|Otqz0^{sfTy^|#9Hsv$K4M7DQ0zu_b4-sK2t)~Kxk`O zM*)z0&(E?CpFHnerYz?5s5taT znlOvNA?LfrtYcVVcTeCRWWU@q*h|kTbzyyg57$$dikzxVQpopmbd_Rl z-prBmR4&?af97(S?UX;6YfW@6p)zBR~Dwoy@Y2aA3{XF5M z{EG3-=0$4>CCZ$QykbQ={jg-}X%!#Xbz0($;wl@e=?Bkqu&MX4?R~;TatW;6Vm+Kc zm3Up$3n65`iR{h3J9A;Y%vMoDJvuw}7OvpK-mx!>x^pAJ`PyL~#rO zitrKxb)V_~VQ#o#-RDQ6w(IwP#_nY{D}1gOm* zrEX#CO=JG|zNt?X@+Vzf9DaproR`w8qZ}qp#XnKwZ3!3iiVrH>yI6AV)DcRTz(KZ4 zb$b>j3SVck_?*-`ULUjhFhDpCyUE%8lu{fviH+*2IFMpamc*fnEIEbMn?1P(v*C#( zU(wFQ3WI7Gte=%!23@XSQv4qBINI!R>`aOHgr`>TWli>1Jn*2m{3?5K=zi^Fans}E z|CV`~k=U{8MZv@4)QQv|E1UNKyGeNa%p_xQkB~qzv zIZ_Z_o>ouSoy>FMs5(1Q=2gX}>x|}6>wjkuDx}}JjnY|zY~C&Ma(~uLlvFSsWLTBs zz~0rl^X7B5?2`zV;Ia7bLQE?B+8elq3^NjOG0erCAmDI7e)Jh;j^b<}e>2-JQs=xs z@&E{vTCQJF#Yza1+rgcq&+nQC>|b&->7H*No-I6tmQ-;)D<4sh7lZ>b4kYr#PIG?5 z;46~~yyFcqO6lPO0rT;5{PXM5I1Ujs423R_J?i)3htcE?W=CL&!09_78w(z%}$ z+itVH_h2KN+;&?Yk|eICudLWD*I(Rw0`=1ccDXbb0}9{>1bx0vZtwJqFdGT~(S5UY zf~z8g9(8OPI8WlCUhOs&zJoExoGXl{JKLk~%5G#ix#-sYrds=Eh4+-jtxi|15JUHv zJ0cgV{HRm(1T~#_-j0%r)M}rN7l0Q%iAs(kQ14#^qn3OkYyY<6tZV2H`GKqY9Z4A= zjXT_)D>ea#?ku(aTXCmk>SAPzru$6-zL0ZIYjkQ|gvR!&&C`1&(7OxdXmW&|6(aVO zZiWg@XLwZqRZ-Qv}im6Txq#q<%R zo%fFRldr+Q5*20Km?inHy3+2X6x%hQMeaeqE+BkJUBaVF!%=(e)=q&9)Zt7Fk0m{) zz`NtW6WDTT(KZ;)B#rq96IGkD|J#(WL%0EzGounx5;EzVP?`YcP|#nYjdo(seQ3Sq*{4-<`ZZ2~^v>Qd z`*HiIrh!;;0{#s|jkE?EeaPoxI2RO(t;^<9PO>B#ENUE;d7G|dCYY;11v9b5N6AP@@&NAme`P;Pqn z5qznxq9OxrfV#C+upIw<%>^3KaD@Ng$@0Jaewo~p=y^9*HDf)SqH?2Gl z#?plzWim4l7dN_et0r?un2&d)x%$L9_l87oC8Z4ZK5Q}DWbl@Ws*P24acVt33aMsq zk4*R_XI=Vi{1{oxnVSz0;Q=lF$hvA|_!VHx>f_{KX`=gcDP;5Gq6ewkJ(RBy0&nlrVu0_kV z3VxTz7kWm#v2>#hp#6$uP`W38K!Ee$Vj!|1P{5mlBdVutwhg|;W{%*QX|I_Zd|qrd zcPsR|@nz(jt;0^SBEr@Bb-aI>~_3?E6kyh z?0R!&%$t$oHES_G5pazbOGe$qwu`wu49H9s!!KpBG)Fp180?Zp0fK+NUpCFuF8eCKBJug#)w2dkSy+BoNMbjk+c!;sJg_vxy=Moa>a|fFh|hF(o~Yo zRT=YoKT$fHghYJ+hmJ%jThgBa9ElVO%qW%E+T9fKi0Vitrywukcv$2C=>E=B?@gGs z!M`*o6ej!gA+0Y3g%@=nO$r*O%h=D+&PGK!WND_o`#FtRP-ied&udn9IR-8+EId+^ z`r>aNlGNluf39Sr>eBMecUw>wSM56-9$G`nc8{749zXgaUnt`C>RKrYs*Nz+0l?)b zVT$@!N~-~5UB#;^*+hHvR34&pIS@r#{xqq@nk!@Z|BIsQW(`g;u+U#~ZbB9PF& zm8G{i-Y)5uce_hUQbD@Tlt$YcX4r(kt?gK5~GhRcY`@!sV@E@9Df0q zjsP8oj6vTXn*R>ibEn{Nm~~_~jE`ut59nkC9OKOW9!$P1i%R^d)cD(a7Eu_vA#`Sx z>-~(zVGRC{JQzD4Y@u1SMIl+*Q9lgN*Ia@yIdL?yL_8|# zd%at;uGS70(Lz>Z=>HyqstF;Ke%f>E4~n+7)#fX(p6v3}TDIgG zXHx#RZ$m&}OdZgC%E6zZFkzZiE+g*f{=I7lcA!~Ln_bnncF;KN5ePcJWJKR>}ro%)!VEPlIaW1W?- zlykim#5X9fKY2FgVTd89XyZL(q(L6dEG&NJ4~)`qbuaYHWy0Q05D_Q+x25j6R)P+x zjU$@gBEaB??0j{2d^weAMt$m>n2>(B%L9~fPl`Afnj1c zs~@9r{y)mzIx5PwegEEqw17xSE8VD+xGjn&hO_z^kAB25M^<$t5K?Z*r`=o@AcW_R-bN4auWDf5P0+FSv9T*FpE`-z61@ zqnYrrK$O~Ch`4-;h=8EF;aMHbZheDd=-UItV0F*^X|v7#>B`gNzOoTO{E@IR z&f(lon{MkD({3i z4Y`oM4|)%cTQyT!*aA{Q3|OkQwBu*Rs3a@@{;rcgLe>{vg|#z+FzOMm!zk5P1!O>M=S9tHm6KkUsa%JIm_do>Qh?0^*C*ai++}t(Sy>4f_78BHUHagc{6Sb$i;K9*~n4ORr z%VvlKiT{&-tq|#2PhQ-uXK7&(`ZlOP^g#G7KAE%*5tXbd&A@Hsl1ZCW=@ujUrG@@p zr@XBs-`;(~mqRw_F?k}24H7YfZaOzZZrj`?P`X9IOeui4ahNeCap4EAa@yfi zGV3yqxK9;}K${gjrzgTdW zbgXpV=oN%7>OI#{8RCV<wbEi^+MD*`Ra0TouEmyEC)0ZOddB9yF zmW)h^ogZGH{{DM^?FVGuKv=hwd|P*(d>*hde)cKhJ0A(xkx-G73&{q%xa2*MLd(=8 z(1(Zgs*=|;{mM|5UPs0AFXk34P`V8o%28O ze(6<+9`c`&z)Jr@@$~0SJQjH%>^`sR$e)8@l6O$ah;HQahIW+D;7&-32Pw1Ovp~{f z*AHcDcbZvhV|RCs8U)D{Mg9B0{`2)D(gVLbZu=ykStlwpZ0tf)tgT?r*&iU@R7&1c zYC1xV!h+Jwl)e04gV3QSPxrd>Y+k$i zi+z68Jy9wWDo09fto1sjA&Ie1dbQXQGjQ)sseX%y8JMO&yV)0Ut5zv7O=e>R3th+a zc`+CPNxX)tdjjfsbxgwuGLYT6aaI;qZ)hnHUH~zFnnUz0I6pRt{C*PPxGU9W?IB+* z0HwOOMkbTeXW8z(D6M*yW^J=ap9#iRHx(rcxOipD_vPfv7U##1Jby^7o6XENVQx{g5Ca zsivW(Y!B6vo^OaP?1hqW;Ez_b)qij!-ZT-P6t4Y|=@_$-r_A`u9u1Mf@5sTyK4WG^ zyO5DBYm^Rav^<43pr~D!#xkL`FoPi0bp^KWQbT7q&j{_2m);g7so7P;*`BQp>uH6b zqlm1xtEkXcZdmGMB)vW&caFU-q8vmjxr1@q7MmXoGbo^6S)ysLgDl7P-o=w}+YnSJ zUmoS9ZKXh3X$okATZ4|=MYW2xCSG|hxXRnI($LxEa4)#UjVKrhbT{$am)u#Eu!Z>= z*pUc+Zf_Uy-xk__J`>%fvPwdgot>>XTa%StIN#u0em!Vl)aA$fKSpIJP@vIH)f&l5 z(P>~8jPbqj(=Wp4Z_@0)K%r>`r!#%vP)N%{RPRj+ZBZ~6Uyh|{_A9iY$A|cRx--Y>B zmNPOZ(DV#n{*1*6*&AJh$60c_g4*m_J2#{8 zSA8c#y|5{l@X8HXGp>7W@BAYAueJmCBkyyxZU10t6i;(qv%sxb>h<2V@6lLpgCE}p z9&jo~PpU?jZ**%~7JZ-v8x4}(*3&YVFxgz+p%^k@$d}q|)<_LT`c?)NN2a>_Oo3H; zd;LYsq&GPoImBIdtP0~je5WYIxdK+Kk1Tovkr*38JyE`x8K||z1UuO3s;OwPvIq^; zu3P8P*MS?xpw>Yaj45|^MnSB-@mRp)5*43-h?Ua99D-Rr`RYFX+5G;AQFkcO zp4-wge!DQNK!q-gOFLS-Yw*VNX8zuCOCPNFbNrMg|EDvCgM%Yd?Rr8mfaSKq1TttE zR<6;M0a-LduJ@i}|EpUw)P(k|qZ#Q!()lO$q^RVaTa}cgQR(843tu6xN%#MhR9El* zMS5E`gh-e}s$ewWxFhl$u%3}?Em z&_Q(qnTqBt+%t-sukWD-4US6hTv~)`Z~Ew7`#ecNgpEXVm`1*bPF9>>1{tP7!iFR-7y!PV*7K=!NxoZ6~d*8C)Qbe=9;oc=|#k*sZ5xrUV|g!mPt=~!sUUjbsk@e}5qm+(rJcaZ z*vODcLBv^?8El9lJX>xqG9f?519R_~M~1qZfViv)okz$nq%h#oZmd=*tzPauMQCCY z66l?wWZU!KL{YW~(u_@037mB=mq)|0JuC{K1y3J8POm7ZHY$af^jyrlpT8N9OLfE^ zfS+Sr-^EdE77wua%*t_lnu8os?Erh4?@XGZ8}E0 z`LoBX2XdkTj|fV!WiU!?b<^#*4- zR1bd4No)8KwRPc=e2kN+PlkbR)wW11iQ@sD!_lFk5o)AJ%|@CWA(sWS zBmI4kRL$Cz8pwmPXh8q$dkai3ht-b;hG{BAGXH5)pK>EbP3dn4KW zI!=AVR9Hm7U@_3svV5HI`CtN8>y;1>5epz+-Ok|Cf5V#p+Tab;#u0%>Za&N( zVb%j<_SER0&c8u_n&o~F(kycCx?!`-=c%K|1DCcO@_}scfL^{7u5#EOW0e>JHC#0h0n7F}NMzbY|9%r82h;eknliJg z*irj#^bwl4d1Glbhh-+ZjJYl$&bB~9(f+NQZO34U0mlkv;k#k0InUdziB>s{an9Hu zd~s6K33Qu76P(DM46@)sj022jkLajk&HJ5Nps^QIqg%eHa^||iXcW8UwpK4c0S;*K zN@+~|6fC=uXDrd3cO1^|?PC%f zE-Jf~iR8APqUSj?FoSyX;MKmU5XvuuxVX3s_u__u>xDos&uIy&2{Aq*Bbkaxo+Ac*VZVnnX`iEzHCXRI6`B|EqH}XJcAD{8@ z1(-aohf_uqlye8ES@!y|7AYPmnRw$yT^wQlJnRDkEH{PLXVY`LoIooPaiggoos+X6MW1uLfiQ%I zry=~p!4m~#p0#|@dA>)J%@>N%uhAfeviw@ar61-#O{ zd$GRC9fxJD%ZlIl)!+H~USoJ;EofHYU}|w5x_nb}~>g9*agcFBl;Fe%)3R*MF z(n+^lWJJrQK;RO*f=p>^DftOm>Sy25B)%SeYZvb;(6(! zQNuN&@rbJ#jT(cR<9%BSo?s)v?7y+BlJtxCB%)DSSWPzBX0c&tvE@Z(@@sL_0pK(x zpR>9Eh-o3x@q9>7rr(iE0~)^(D09{%Yu%}z`=fxJ54T2*Nl$-b(uH#^y>{Y1vvCdf zskuK+<-zP1GiLmaRA1kPr%yM3DRYbH-ZL|Os@lrw%Sz#%5^L!$Cqq1VSL_k5$mUBi zK!ay=(<0xlNl(2DhofJ=W3I2ep-+0naP#n!a?2Ok87)%+{Sfvbto-2d_L$j=%9;qv zv5KIQ9t+Apc`vsfxFWvAnf7xhQ)1n_{WF{qJe=yxlm?B#mMICr0ey<-FBX;-Ar7<3y8)3O}nN~4}N=^l% zeAw#UeHEwe$_j6Eo^BJr8x#qBCIA zA8JO8c3Lm(&3~}I8yqt}F+r>nHB?!tw5IC5Rl%(7fxoAz>&rrHzWC?YH7E-0Eojo* z(+oem<=6T9Y-6P-O|4KfnReBRF0DDwC1f}rI`574T>kvZ>Y4i`^2p**nAUFc2IkaO z3cKBqIU?R|va88*sBQ~tCBDv^UQiclqq9c)Jk!n(2hk0-$?s~CZ`auDwBeOf?7A>sWWvEx}0&eQ}N6D1Q`4cXmD7Z4iy`lZa+LGi;&r%#m4~*4hfau zA;?0Oi0@^_U%)+kLPSJlvw$H=jb#O1@ctR%KMPqFAEA>O zH_zth8cmfc}GZo zT{A@rlUDI=lC-rO8{Y`mQggNo(QD|BUio(=U`H4jP)x9LuNv-=YumclVv)QlyGz@* z^FP9+RkrmimwIMlK_{kl55Mc+IZ;V-Q{Sv#>`lIi&Hi+r7LgG&6CG#Ai=bg|Uq1Yj zn)=8bGelt`@jmImLkxr9RvsI4`?#~KE1XK_GBGMj6xjK{e0X|0uR&>qhmT)?JgeJP zMvV7Lo#t>^rYsQkF_pxlEQOX!i7LC2gEaHUfAUO!t06xMRnq-|()>xsxC~WXTm7vE zw_o}C4%qgXeQ2#?kPOzkuE4`oDnGD0=lb#mt*ZX?bi0#0Yp%iaG#@WhQT6Nka#-56 zkj0vTiXKA)aMM6er?zl`)YJU8o%1JG;26zmoZDi^b!GNGM2a62?k^h zn#vM2wZzb#(V?rPy?lTCbGco43eU@y__OQ)^4#y;qv8wkUmeaQBCUEh+8}}}5XQWg zEXrk3+foZUH=}EVW@p@HPm{ML{iJ*2szJQPJP@ecwamTQ$LacNTpqs3ySu2=R71s5 zal?TlD`*Zjk2^eemZ4)i5 zVzi(jxP&~g+;I4Xsl)wuJ#=|oQHbvM-LI=-p;HgEX8>C~P)Rrb{OAgYtE;_#r*?Ge_Ntv!O%41055Rpi zxJq}i%g{T(&#-Nt(rTXXkDL-Om%9Jbn{nYX3FzJHd*r9_4sydA<| zW$74%*q`ELS!`?M7-K@SZ0!PY53g!wL8XHOnOnDDUM>+=M6{m|{9%AP+ze}n!2h9t z5gEquYY)*(V;qg&+Lj?&2hF4C_4P?EpQhHSph z;!#LEdH((W@vL7~!6q6WvzwuKcsON@lY{hO`Aa6LZiB#Px{zg%BYfrDjFM122w+oc z3xbA^{cG4C6&$Qlh#>A?lZ2!m2lndk+^U6C56M~^qu#x`pnG{ksDB%Pr>;l8jpMvO z$H2^GCq+=f983X;V;(7E4sP@snYnNAyve4WpPT!9&_1bvHqRHCm6eqZ?R^z|m~96e zYMQu8+F=u+JIXqWd6xeHnQ zG&(gHy(6m8p0SsGimBJZ4QbBIDUzJK%poz(oH={#R=1YUEQJp+yJ>Nm`yHhW*=BE;B+|{@B+t0}a3NpTX3;b%_ z=@LHtph^L6RFI!XS&*1Vp6i8%)<&pdHaG;_Zd#NPm3+VH9e9Il65wo|{tfl4y)NTI z!N_oVJYz*1Ng(6%-M;##dh9P-)I9BdfAUPk#CPimI*UJC=KH>Y7b$pR2-Zd-%V2Sp z(G5Vi=72L?AZtSW%`%cy7OgTY;zC)j)0F_e5Xz#MuT%Vtk>O#ExM$j?4Tj%8W%Ex*72 zxVU;RuS@8J%}lO!Xz}npaE)rRspn1g*nU4z+HiIN?I>Vd%<*vi@M7TdmVFq2Rxtdm zSpY?S?d2`J&-(hjQLD`4+sx$lkL;STtjtucUZGt z5C2Sidnc3Fg0|03Ro!lvpFD~G3%SRlmv*Bw*}&bJ#!Pgv&Te~aBU>{^$~6tmm-W`W zefQ^mKL2MgDh-e^2^O;CrM?#!rDgPI=x4dv>qNVMlBZa(QDO?HEz9|^{(gg@bmNaL zDvh~X+b`yM^n6jhQ!)w~3Lr}pGX-viWNAXn!fd@QEDb2ASy4@@3(6HUtD+yarzxpq zO-P_Hx5c|_HyYDf1>Vx_{qeeV#A1L{voRjw`@0;%a`{qnU=m?i|FXs`x;=k?yeJ>Iw_w1j zJIw>RS{6UoHNDDW2fgc=bDajjq@3*lz8x_8=x4T7RoW|E7tetDkxzZ@T+BIbxT%T- zIeHg3j4_=FM(#C_4d^Wyd3cF7 zRa19xi^_HUyKgQ#3-`4Qh08{C3ZqR1>!W^0E;4Rjp?7?{@vN?s4c52q7!4`kDxk!7 zcJt+N>cyH;Kn4pHO3jcFbg;6ZsY&;mq({wOY^vO-+kCwi)T^hnS7-wFcpQ3uKGx#N z?|IqgzH8*6Ia_;>egT5Ff5?z1nK(MxH@KRV!6UZh*Y4Q?${b5Sxux{UnbwKxLNqQ) z@X3JhXGlLy%Lmi%v1G`!6Lk>e5RnJ}tlypuS))~1)=*hVAoA6?M{y9teN^j<3d8+P zVHHB2Tv_#oX;ak+by4tR6FpS->6V%pH?xUYSgV=*HEDhP-dl$!(Bb1{j~c2wCMET> zZ!ThX*Lymz@B@J(j;v*1l`ZrUBb1LRaUHD4yP>c@D^ai$7kEsf_I2VSFT= zh9!}OQ(dcSxm^i2x2CyJ>3m(U(~afkJT-z`Gg~BvsMWZ&%2DdR|sXzXM%U9C!~hOj!+F% z)yJSwL6ZYvC0m=Ng01^Zq}DA;?)tjA@DZN0o^}#_L?zr{-6iIA( zcq0$)fQfcjS^WvY+&AE!W)tOH2caEK|CbHa_B8_6-St_K z8nl-!-!^HWP1I@WVT_4gt9q@@vO!sMmTHkPw+6Qw+-=~I>!Q>$U#qM3aVLrKV0(&$ zlLF-i7rE+yzPw3=-bv0CFN&MWz$hPmvd=r-Z~+W9O+9@HvrvlcNb57A9J%q@>KP~J zlkA~Tfv0>f4USusz+p5i`0i69a`CtU*gUV^1M(W9gsnGs_0PTz&F?f z-t1j}k`qJxsL`=8iKL%t2E%BXDiKP~2C8iendAKfu)pkdv{%e3>aR0oK^^ZJ0P3C| zFd_RjS&5)w--k-2@{P>^JN?eZzq z+Q6>AKby6|ih^K5Fxh&VvcF;(fw#g&Kus++smd-8ft(yvs6*j!aZV?BPU^n3j0AM$ zM1C<>rj28~kjjv(AxZ=f?#u7k^D;O~OR8FG;vO5dudExzL(DmrGnTR_seYt}(6FCy z+;JReFf#L&m80952zuuL_ z|69Te%2Z|#qI!a@h17#R-GW&hYpE;`ZvJ}?uAIGj>02-hu7TgskU!G#hia&SEy`pU z?qXwG>*aPp7x!ELM3@I?61{|@6piIXVWB4JazmSzWu-NCr3L32ZiB_4_}{&42&sz2gULOp`xC z+F$%{6XgH;uu?mO*S-rKcYIOKpXWRg@(VM^{E)_;y-ob11(Z9T{_xjtY%7Lf(&@iD zcggXxI?{*qx#<4{jeq}R!pCv4(;O4-PonM{z5cJLbcNH~9v%VyKBnkn} zYi;&}z8yELr~Lmnqa-wnEA;s$*DRR)uZr&f{o-SBi!ZtCKb}IVfcLlj^VRiz24si* z4je`n;C{XT(L4W3z|{D;&ugUdxIO&)v-YN?8?x$o<6wV*bGKV=AR$>(hWr118@Zm_ zRKf-Bnd=Ff6Z*R$)-00&t*zyCDFMk~+O%|3hxb3(C|;*{uG{OB9?|?XAw@?NV!(fH zT<5Z4;P_#7=9;PPZ@3-s1h$_qn%gN**^x*O4=Wj)nMrDyRc_XTVwI&Vv;;WEJ3XH? zC~t(46%;oGbJ@;F0CLATGOfeJHcae9LvDWR>g0h$0LtiRobNrOqrS%{Cl&*VPL8{) zTSZ*X3lXtL2IJlfZ&O@<6Hl7)rzdfM5E(?kmNj>~j68sMQ6^mX_D|#E-^j2@GJu{d zYh$SdzppE7?s8V3bg=^!mX>DUk;HKq+R;sNaU35(!hs&6u&0^&r?D3ZSXd26Sn^OP zX3-<7{~GE;R4>ksT8H&ky24vqTlLX~G1z4DfS8q$Q^I@UfUr~!dJRVMYPyI^G&W0pJ6-G$`lQ8xv?%{X0jbhP4um*_UTm8z@J#vq>zAlogt zUyz}rqAH%E4LQPfM=nDhG#v2%fFAID;G;hMSO?9%-vNP(924NH9ob z^Hv{lF`vBeS#P=E|B>c9TQ-liRYxv`2RQni-jL3j=L-ZZFeIOd*PCr^mWDXK?UUY$ zYA}(@nic;iZ@Bj`7k-D91>709mY@GdyKa$iJ84Q!ok%zB!|H?UZW%V>*BkYQA3nTh z(P|18@fm}f)#I?-&CX2s4rn^EFf&*5lx9e1ufv+b`~z^q*j^q8(C~Zdm!AGC@#Mrh z5UAgHtuTOAZg+bt3FP*g>gQ1}2D~t{!ZDuuA8d(}Rpu19F@eL1V6KM66SSk#;4~!^ z<*a>>_T!V%-$uu;sWr5V`WD5rvXN#0ECjcq>i8B5xi|RlCB;1TA(pkiob5u(yZ6&{ zVW>pyAu>OarPEnE42$swmJw>#{9SH?dk{JnR_rka18-zNwALwT|}lUzJ;ZsMOz(=f?BeCVyV zj>~S&^V;CtyT+PuL_W*D`S}!NYMP->EPSdpWv$295ovq}ggehNK|2AKlOrJPMgxOQ&zzHZHqx)oBd_iOOT;o?w(GJP6d=NMFP8i4lx1ZfRohXp ziBrDl3Y)c%`q|^hM1O=ge=t*>wBWX(cfA`G*3l$ph>NCuGpTK`QzgryJssy3-6j7a ze1h3P%w`rjf}L-nn86EP6-sgTk5w92+Dci0MMUl}bZaI~mtUZuFf$pbY!rTG3Ru?) zuC8uN6BZV3_J8^A_`ZIf{>Z??@m ztb?xh%&hPqLz6T0ith1j4&TE|$x~G$ljJ;_hV`Cke(=h~Eoj`Df`)WlIlfzhlj+pv z`s^~#G#H2GTiLV?^u_U>lZm8yJ+OXMlArwyXgcXnr`z7PXEM~d8#tUCQtI%z187iQ z|4PA#ZZK!Z)$7IvC7MdU2BYSexKbOyhVoM2M%qDsoq^Y7Ib2Ey?^jz|NQUZ}K&x11 zR8$ZKAmLZQT1^}i1@4c`(2NRz2!z$eRq8-!CG3js;sDQ;)lrsM+PPntF|QqL#&FW3 z&#<$;FQ+uW<4g}0*RsdS*^{D$%MwiUcqeP~siq@ z1>|lI+pph0FIP4;`J}>Oxx+o)7p}&`qzBN2ma=T4t!y{5*>WUONy$xWWn;WrEGHD4 z+s-dPha_V!E6N}n*4O!aj$3pgrJh{AtEPlLpai_ zAth%qq76VO5jqA2ej#E(fVoP=^*vb0JR>|ZvYqtQNeQpPY46=x8VDoc0sG(Q?SEc- zn~DHJAue~OC`@=4DLX)QdzLHMCyTF;xfwyUKrakl<#3*d47G_dq+$oc8?tQ?AEj(H z@hG&uMGx5%@!xo5(HWLTbozKefBDnbxcn|ei)n3Rv-hSo zWVxwQg6!0bnHm1Aak`J+eLl#1A-z%IadpVHkZYd8&~`mL=CvZ@WzgH!p@z7QIbq1` z_rY?1#0S#2UnJix$p0-qk9 zWwn}Wfvj80-Fv#ppUfsS>vF@F7J;2zy}z0Zog zB~`2be6BZ*vG-WYW&Kc)k&V+!!mJzqoxZ|oUhB)6c$bYTCe`l_3d_eoTt3r1B9Y|M zAfW42v0afHVVAl{vdvkg0ZYN8_DM)3fC#CIddC5t7+NoE7orbL)e29u85Q*THC6=> zebfduIq^;K@Q9cM*nddarh2WCJP|jv(6bml0QFefV+Mw5R6j>AMODMcKjYn`;&seB zJa1s{JwcHFYL-XM` z@P9w#vTb~8$H{Us3;=ltvj^Ju2N|FGC9UqYcbK|)&kht6#l-v+Z5EouD}5KPdIt&Z zs-jtHMihW;7a)QDZa4UI72vQ#aGK3bx_DZ4wP_3}YChJzX7WdUacnY14sZDqJ}q!p zOLc8*FHy~`g|06*F#}QptKJ$y%bT|y*?DWlb;o)$Y9^h_ROs>PKuU^9r)$m^YQlBX z0_zxL2Z1Z?c(6Q>5++}wXMWhh(EcA;>5HC}SM1j{w)lX#le(Tsx<}2B#P?7cz5-20 z-Pcf$kK3lXJhWEber-E9oxua0HF6oH=er>`%2 zw=Nfq|JLJSez32*FR*M25Cu;@V`3boICguEsoNc`e==xgpORbHI6ulPYyqe8U9w{x z5UgGM_*NG6@{}=e4Cc-)K{z8_-o^u&S^JX{>a~v}cd8Co&iKCOi{=7m9bNfQjZpo_ zlR9mQXRlr~aUBuO#xl->kBBgaVXB5NYutZkml>#d zv8hyRo(?4pv9GbR)y|7O4F@ zHZqLuAiFeDgaoh<<=WzCW2@UyD|5X|k%bBP0F!F>^HWm6SipOoxR(n{xu{&h84-Bjz080-u!B+EGlPahss~7~E5mP!$SGG!oVk z!v?(;zHVMxTN5uYe>uh`Rr|+!z%&RrRwkh1?x&%ny!z{a{JWf|MBQAdtNy&jWgAH( zd7ckUhM0kVDP}$wD!%it4Zeba>AKQ)zI+?|2;sF4Ph1R^TP1#(vZ2t2c?_Y2lo6i6 zlN^87D)#}(?U$?asX6D(D4MJ38#O_#Ua+?=#A%J?S75W2v+dp=*Q3k&ib3h`E$% z_c-r&s#p;mq*4&3r#Y~XX1{1Uw+=`MuuE^F3_IUNMd2Zvsh1+K|7C~uCXh+rc{Wcp zLWWKlVl%(93Y`eCD z_+$Os4`>t1kwN5SZxVo$(U(_DKRmom%u)1Ok&zXj(!5xy#P)|*4(_z5h_pS_;MRy> zVJmxl{D1LYV7a-Mmf7@P_gRDf)^fr-x7;=}BDh_XEQ(txLw%b=`>h8+|H6vCIuu51 zBt*iC@Y5L-S5IkTwlUPt)|%~#K|m6{1Sfjt{oncnu;SQ$KzKi-^F9chw(RBCWvCvx zU`p$o=)pqn7nUMOkO$0kW|LeMQ_Q8uR~sHLJT7X>9jz}2meMyG>sh1#gzeRPXi|~J zcjpg33UZ|{GG78cUM-f=(2^bJD6qKfWDD~vpKGM@7aY&WRMi8)Yu~4)OB{N63mO$F zLJcYvD7d#ZH%xAmHF$C;rs;x^C)q6m{1Bf#qYSOk>OkVL&uavH)X{rGE??VNn`?0P zaw>qGPDy=6xSsg8WIpr`?O~HDW>`EEuYRu+TZ}GI=?Gl{~1Wpa;wcGw_IWGv@yVjtE zGZ%W0R}+9tD85s8M4o@8e*l!PA_Hk{z_TK7MLom)aB~JxR#lBQj*qMeYPs?%70#Im zG+RncBrdpJxmcigL8dc4WGr=`JG0sd_4L>#s3R3{3kGJcO|0==w>Q$m%Td&GGR-=39=GHT!4=$42&y8pD99Pg$py)KV<#n9cYior1&x*E^sV9IN;YHRpy z@*F^L1t8iPn5H@%zxR~OBK@_n17JtaN|Hhy6(4r93Wb;H*AR|-ZRhfF_jL!SvY>b> zB6|4r;SMv7g;YlF3DR_xnN5nQVgWbpA^ONu{-Vc*BXt!Og)Rh6>y%!p zsquE#A_g5t4>eQGJM^LcI1k~5J;4&cOM8$N!Vn#MUY4KvB#&Ro<-Xnls{7p^sp2JU ztIW}%*9|<`w~LA~Eo>KZ1v#I7FNnahaICQ;dZkG7W&~kbAXp@=qpFBW5x6-lN&%Mj*{OurrJwjFuH;?ss_fe?t{J1QFwg@EtUCtd zHE3PiQk2bX>JxeJSfnNvYgfu(a?We}xNpeZV6s4Vg`l{T6o*9s0+~13io{6NXs$GR z3zOGr9a@8kKtYr4MgRW#w)6pf0~Xl{ze7=dUQb3wc50aj<;sSrl$`F(O5)ueCvA1I z5X!Q4;g4fJG$FI-kNS5D)mF;N6*`0^t?LZX-?Jt`?~$&fi5gz9*B+( zuGQQAe!cqmxBm$QyN60(t}VuL;yoFaDkPaSd$z`!kFiJbl$>tsa=O8vCy!*Di}5c@ z>(}NpE?Tca_Se1OO%rv2fUpdwlh)Wu)3UDAj7K-@Eq@GKf5&7lHtAmCP#a0ZhOlZK z54cBv=$i-Xx;f)owC~-@f_xP{s?khQ_&SPhCEt-ptnM!gz+;G{P$mR{_P)6Y?3+J>f4 z0A^p$<4*2OPb<%RG2j2;2Tv3LmO9QkO2AT>>8!M`^?Z_UN*680vNtr%n>FuLw9#Vc z$-Mj{t%K!thM<9cZ7prauGQ6LT4T?)wqahr&a>I(i7Q6&u|Hf|pY`_jzIYlL)EM9` zudd4IJjutKv`#mh)Np)YEN6nmQ{|kSe&`&j1*rZ@vOWA>-&EB$f9YcBojCa>OQkm2 zTcrCxbG|sx)7SY0p=ItpSlgpIP-$ZyYhgO8P6nj9U`*a1yo}aO)Pp06r z#u@Y#RbK-6q{D@2W^Yu`LUu%+AEnSgd!0y%hm-ihFwg6|`3VI`zmI`?w&jM_IWJ6b zjAb?Dbm+U|<%fppqf*`Gh*e_X+LFk<4R&~*!!{pdXio3I0Q&cV6#=7vsS{_p_N7adbk6MT!gNsx>A>^(1&j;6c2J8&NQ zzlJ!#`61O#r!~uR66iOF1e76F@5ox>8A_As^&jvbp_((z2>e%Q7cG;EBMDP&&Hiq= z>NeM=bAc9i+8KCCH;E=h$3BKLRVev6VmE z*eXx3Q72>BMad9*t;t_*LYs4po*-n+sCW#*Gb4PHG%$X}s{u(_jtCpmT08u~4axks zh~}_s6Nib#?bVr2g{LA=aMqMQcLY##d~NM_P6y(anT`cM%?T%TpOcg@1(%{eP}-xv z>A=Z2#|(V@iZC#Ny|JF!>PQ7jcd{wCOp!WsK_m+#Y(MVYU+@z7luk92V?^qCaTX_X zbWxx%47j5y?WFTfpD$ZkvWENmHXBDqL_?uuTVC(zVGF#Bc;HV z7xs1ng#n2$j+dKKp14K-;oN-P;L{B&$aMpOF-!vqTy?va!L4n+4WUdPrwb%wm68fC zeRKNYY0W1e!!j?)FR4<(7x=N#rGQX8jxKHy%7*>by%5?dOy zylUQ^I7~(7=W~!2j=cTm542|ws6Rdo|Ko`e!p|SPyL~^-$!#8K0x=rX67Nm9Vct4@ zLN7c&?3-JZpKAGd=((}<#0G>oQc37kE4zo`^SNHX)XRS;;Y2_?zRjtoRy>#Nr^Qh- z1lG8EvF8jWf3~&<+s}BA2Bo<-C1~a#`hoX!wfVD>uJoJ^vXlwf_14!s@z9bCS$)7n zUzU+1pW!t`6Mo26Y{dQU1?r-uMl^x2Yr*TP+(g^2sK0(!p(wg=PbpF@TK*dDOaB@b z?b@hDwo}r3=3uWQ#GF?;?q-`q?sfDa!%5_xR$4yOPi&h4Uc6<6&CX=6B0RCvKY0@4 zOVUplNVTt0jbpZjIqVJD`K|H>;$^DM)8Sw%c0BaC^IRI_gnaF4Cjd`3}jR%gT)%$x7b*_vX2nm(DQyf4JBe<%H3rSffeFU3@RNjsmArmVt*jmpVt?t#TpiS_&QLqrT2 zrcEx(K>CMPt$C~1q(l#q)<(8OACCyH?+H3~&AvD8V~ju{DMx9q-M-gmDYi3HIK znfAjEFHAdx7DV>8-9sS~s`6n;KltPRsMi=V>?n58O7JZr6gwl%oDfY@&qcl(2CtVp zi>&FZ(X8spnQ5K6KcHy)Y{E#t=Z^K@dO0WdgIw7S=&I@Rwm}!OZE$!zYBu>P={(t{ zX?w*oWqv^cg4=3XP-eg%k z_qLxwL5G8;2}_>G*l@7hBE2h9 z@p_(B(qSqO<-N1p2)&`2oj*$DljJ==wtV1eHpATs5VU5YF;urnnQMzqK6|}7&FwAd zm!rRR>zaK#z3k!cG+BvKgDYCP>-`5OF_W7I*-RZmDbXeWF)naRIK};o{idPyn$Wp; zN6cK)^`U-M@^#J?4+Km#wqw9I@hX9}!RSrbE4b_lahrk!J=_t!bb zF)-gv9Pxp~0xahku@)Gbzn9sV+V+UV{L|}0mEFmi3A9a_7-}*_&)biMTyi`h<_-#G z7MAHJ-NEEYr#aI3wfoU#26*@e(0=b~NU1L!9e>-}D0sK^Swx-R-H1;;crEpt2g;|X zX$L!7KUO~AL(@Rm9Jel>p9OdFPAaL>+71t2T(0kw^~kt&(a9(KUESBdX;2*0_1sVh zxL<6pZ5veJ^_lHH5qvT*^c306vwO0(+1%Ud&FR)C$)-%o&;UD1XtHYIyU!O21uFf2 zuJr%C>?6wvovE}U^Q~Q{O?5`S!v1VZOG~-p(RRi>b#;SKLMJ8=lpg_qaP&bv)-}b5zb~vU?hWh)KXZP^&NICK^M~RrL?vwCG(Gj|d_Nk5{EBu~zmC7b& zmAyM(s=?^khcf84flP1F|Jtk;QHSIrXT5HS15Z|A2C5kuNgS^BcKH2VqQ|b&af9u9 z9#;o*etHnZGfhJ2u$L77*p>G?hnZeA??U@RC$lP>xPLK3Q+4UiH57% zT6IGv>3P|GjJT5~O;`gQ;0OCkh5{&xkJU?cA5z#p^s9#aNKt_HXa+U>Aq`0cl0W z0S9T)9GZXIbbk*`hlhzyI}>}}@6~MeOX^qsgBaSar{gNTXXtC5C7A9H@x-@1X z>n3KzRg4zUyo|4}{R)@PzbyKTN#Iz1KE{&g?J&0bqpKkdxrOVFp%l$CGu^JKk!eM=(8;+nPgK?GUE zrGbJc+;hz2gQ;Diq>l^@GZr^Ddmhl!(|^3XSy{R)0Ba+*T_{+oYU2Dg(tb~tp=YT1 z?q1WM#AdT1T~-3kOP?<5`-%R4jJ;)4T-(yNjT0<51PB%&xCD0%?(UX^;O^QXSa5f@ z;O_1uxVyVMjWp1Foo#2I=j{EC?I!CXEEdab?9dKycnn9D5BmxGG*b&jZ46R0k+#(<)8}@ zx(mPZ&Z;VFqa9B4@MG3_^igD>cUn`s=ZQFDwC(V}O&QU#Z&kRR*uGZH#k#J4&=`4&m|1d@W_y!BAZ}pOR zRATxlFFozB2`}CMb7<_uFlJer7X}%tSCJuD!xFz4wSWC~AeB;FDlFur`7p0g#r6Lj zE8%NsRQt8{Rjf3O{~phulm3^-!7dINfNjVbT{+VKyqACZ3fZsm{m<`7VJ2N1e=HgO&|Mvl%IGZir(OfJua~Ovs+lqp z7*rGQ8!uEpVd71Pu#HYVjyzi_GbG5RCMAh3RSMg=y27ifs?snq1+wj_WED3{RJVWF z-7Rb3fo+qn`OM<7Z8Tr$-tqxgj^aOq{DLVZklE>!eR*hU+ZiE%7@!Tz>9`m~VKLu~ zJ^y0Gc|70b+7=e<_uJF?%Rl++`zc6}DY4}uD2tgL)6+I0K`w)Okzo|-32r1UEv>3x zU2R>ql_VJyPf3<{J)}IJ@$j6x9~-ZTc%4{&Fm_}?v6dTX4pmAfzWR2AgK~4@A_ELW zCqiy&a<6n*F^tmG%26v%vVZKAF0a_XIWanlXj9TwFVljb`t@*q5u~%kI--px2p=BR%SzfWe}ogl`1(TI?TtbZ+Phm2;jGcttB>Gz1CmP5y^iJA z*b3=iX~%|H=e;z-bhdq;p`x0dAl~mlk+;-uc zTj=Ii{C2`Zb*3Ix=F(?%l+%ajh{v{ zc+hrR*;DhCMgDmrQBaCdXxIEm#N`^CE-ZF~Ry2*tuwCy2)*Zgu_uzs8-qVaQReIw~ z2|23KlCnh!i&5F_c)d|eSS5#a5oDjH<=l4{7<~i*vk>Tzr)HS`&+%n89ie;|1PvwRmU&bR@jGaO@nL!_RrMl;dl_$jI>ij{%Oe zAZc+me9aK>w2K`Y9`=t79zb)E|#rQZt3F zlUcA+qNB145}Cg!Gy6a(*cjM(9qABzPPRAarlM;$ai8&WH@iD}lyII*2v-P*mM%cO z(39muzYb90f{COTa&%z$T2O$9$jB(5PwyrfLE>lKvKfE4tJea*#&icS==03TLh+=- zW&0AEv5g~eSjhPh)ikSsxL-n&pA#Jz5A^}zPhVa_W_=4C-1E7;Q)>0f>I*{NYi- zU`)m;6n|n$D=CYmfA4f4$?4)|mntKJe6{{)3^W~|+(+en8KD&8iXz9zK+Zy!Pz(Q4 zN?|+66V6|Bsj=NiIxIDy!KSl{u_Qn&*%Udg3gQ`TB6U_m^h?8-_gm*Zu4 z%jcN%jdHCHz*+gR>(N?jz3^zbZiss0brf_P84XL+)ST`73oZu}fDnNPIK&T~R4{A^ zB76oAd*aeo2QCc!qdM6;qhb6bEfKJUI|d|LYBfUE1ptu2V)yQK=X7~)N!umgjrxjF4) z{iULvqx}~ygLGIC5#Q~-OoF`VGetx1tMtVO3H@iSz<<7RfBw3UMn%i;R$RILouUH7 z^KccsdgX0cQFTGB@uV9`SzTH)LuZwJHR5Hokks~6SAkbD8J`bqU-^ubjwZY(Bh5{=?9)A!Ng_;|C7 zS@qu$AL`f>B=mXyPS=H{bhfBq5o z`K?1^bospqRR@A~h05_={o>``(UGIN9@kppTOTh0kJpl!)ZhKuLh&>E$`wupFlPoGO{yc(9YE%OQpC88mx`AAR&hWDGHRLSw z{jNwxR*cbkOCRepxk?tYtt%M zVWP%#0PIbvPOo({wmMmG;i=zy?de9+>2~^|t#;UG`4pS>vH=91s%(}VS=$f2u13zd z@s&viIi-g!J240z&C*ORo!t5NvH6Z`2RWXozPX={k7Z58pC;amC3Q^Zk;I1CZ}oRq zW{Xj3@>$NxeQMP7Jls2{#*8&qt8oF;4MTE{cgoqZr0 z5zJFi7-n4ol7;{CP3pa#kG=gnua139jUQ20rs;xes}Ex(43-yI_el&_*{q&74Cfa& zyPSEomiX{u2vuoaa))PryZ(?58h;b26zJ1%BR}jCZ z*iO<`d?*&{>$4lSN5-vn({^NVB9QO1?^D+V=ZUP-W@24iFGj(;W3ffCDj*C}BZ@#_iP?vVs zMjA(~C^qPJLH`L`2Z{o#?y_uoF}m-o>MJXdd|BBGRu zTazhg;&_9eLI+s?J}p8qT4`@*TvHI}0AlG__rP=AK}q9(G8$(;08V)-n=O~oFn$%S zM)G4V$Qjv1vq&odhB{PSh*i4;G*oXu2Zspvb;Z9r4K8Shyq49SRc5e2Y;i7aq@g5F zu#yPRi~Or~YJX|J1JEVc^!w`#Nv?^ow2S(m+=e=FLo1T5$U6qs3a5kpp1jY2m-mq3 zm0NbJ5XM#8_(lDxO|_u8VREu&?O}CR)|V1VG|*eh5Ljf$l`NkK6;3I}WjwhRHXWRs zTA)&8Yp1)<>Xj2?ud6lDHG?8C>?WC%uYymw7Z9%#AQ@{W!x*5AFi~XRK9xm1J(?*I znX?w&21~&np}lrB$DRFFkDP)6)@He}%b+_S`O3X5OPKd^Zk0Gyy#M}cV8HHh+MI@t zZnN2mqC<@9sZC>Epx{iv4o9Q((QnGz+k2xUv$a5NFDPKGrj>xrlr5buFr}k#Dkzwm z`e!?HLPA1Uu@INEI_A#A8nD$~5I9N2?ahlxC#^a)3XLfaUTeALhVCI>RpIc42pp5{wlNa9P895qd;1m>WC~oof^e-R7?U z4LX4fZf7NmAUedsalSD_&{s}V&Bi3JJ22o1r>2RWWA)}WTliFwtHa_!PYe(>U3yMc z-2evh*+2yKWTDiPkX3*zheB30f2ojm7$uC*&$SH0GvvoLDcUu3GZK$v^N)FRJG&kS z<%j-^LP{bAo0$C<(igf^XU`jBWAH?hnpn-NL^MJm9~7$Z9SpCzM)+LasP(v;gK%A6 zbK`x@+0@cWuigl9*Ry{fs96Y%8ww6;q(Cy8zc*%E+a1&mtlR58r@H~peMQ&SxP7M> zD}|Iox?6()W5RsFKHS2@l^5Z8|B`bDSoh|t25e|s( z68waTvA>(pRsvADoDCyjf2lLSNFTOXDG1P@EMWh=KQqMt`BoQj)!-A23vHXIivoA^_N5X4jM!(rd%v-_TW&x5N_jBZ6CE7C$Z#2 zA}C!&yD;sJ&A?EW#p4VB&^X1CKef5-pRL_9#LtEBi7yBCh$WL<(tK<3k>Ckh3J{#6QC@4DDSfVSMLeltX^hu9Y762x( z`l*bm)_#BUyzV7KSa9`B@B!>)*nL#GSMc?|=bI8esSO!MLdjHS3adPhicintTDE+u z-TC?X7kpEGv`{=t@MH0jVO3b*+FFMYNqgEe@uwX=6*%8QRL`s7x#>}*ooA-xicgez z{U+kDY-olGJK#1#sxAHz#rd{qH=6)^^cM3*t&c+xJ$?bBp_-`&>@2Ib_(}#6wXtXs zX!68H(g*Wv7I3_aK)GLNY4ocr!`9TWFHriFR*+oaVgm)h@=073I`p^szP{s<&Hv%O z!k{}-OPpKnmFO5JSArg|w-n@GxAbIq5isq&o5{K-aqmwuukd$C-eslQ zxiCB{R5ukvDu|w3Nm2uD%jYX8o5&bhGgBCz7v#q#XEX-kh~V_}q|!{;$1Ou&9+CS> zh-c-l-@WnKEV#9LBiZwMBX+s&wf#LV>Dxsh$=kv2 z2;P01imf1?2e2>~{V%tvTrUbBiR&zk1>^zrRlO_YgC=ZGLk6;IvO{!~XYV!)5b&fY zJzUUiTo?)-R-o)^x|Sfyjv>PfPi`Z%qT_3iq-W2(vRJm|98>M9m!v!}vI%9o*Py$z zWOGHwp6QsMiYPu<0Ey}F4*RXQ(e@d$>A*>PJG+i!K2XxTTr``ky~aZ0tBF>{jmY?+ zCi5w~+hWvfJ$Qj<-OD2t$p5=ESO5v#c6NC5#-1L4R0tj??uR_YR{wbGXANK~k+#(M zG9+?Mt1=rPYVO$O^rw7w+iQPgOU*mF0L#}^?2a<(sco_BBCt(@qO#Mx?Ou=iVJ2YD z%Rsi}=cU+3&v*Jn`Db~_rHje1y5wgTys|{P+30o$?zbtF+|BeQG4UP=2O)!XPCSU{ zU9gsY9)Sv}G-m2P%iSMl>LzIJMY3#--DiwIGnltgZ zr4i$?>0`B4OgEETS7`PE0J8!WE-v^?XiJX06FLrdr9fUV0-PC#!1X(Rj+AK3|DR>7BN z22RRztju%-d*)!;YGs9qhm}aHSJ*N)J2k`HidSR(wy+*n;Y$13w}<}q8#{sPu0kWZ z2o7Q)=nHo=aiK_v{?ZC#&2f~2S17U8g*Yb2zt%@rW#O!EXQT4v)ltLQe0FsZq)2FW z^}N}IfFcUrsYZ86MO)WlsX-IY?x=UH?35Y%Slc-rJzG7i@i9wfO{}*f*m1=pJy7?$ zruu@XVx4n)XUG0&yyoyoSAk03NUS+p>7hT46pyw-NDxd$G}$xdcTo5*`dTwKM$7&F zYP*5%d7uZx!18vRmUPA^S~^R>>#3`~T85oiOtE0$NW2ubL9iFg^xx8*JM0UzfvF^8 zrZefQMilW1nilKOkL=Q$Y;ne*JclPNXUFkE+0>TZv9Q3(%lNi;4Fa7F2D~o|bhx@Q z1wKmedx9n@nGAgFLjC=1WkkoE3yfX#y`crq zPSVKC@{NuVXFFYxtk`~RJ7IBJS(G2-{*HrdG_tDsa&HevQ=woZXmwYzr}%5xW&3~& zsWSv8+Z+-1afo`HMS6Cg>o*nCo7vc6BMtTS%T#qs!{DNXx5zssvo=h2D%z za*8!$#=cFmE5~`F>3QqacyVEI3T_=EC1|K!+Ul8T$LG5yDd2i2)RT+9a{|0i^chdE z(#Y@FE8-`^?|T8wc~kvOKo36n`Op!J)$=joCEO-&U-hD57%Ad)zI0B`n~hH&s#WS% z9wIwQOEh{^W2vKA9xl&-Y^Ea`#g@Zi_@76ORsff4wn^pTF^*dapXw~qj;!N-55M{kQniFcq*SwMQvR$!HkUX!NIc2N zvdpPEE$)SIb38)>xes`Mxb)}!h;#h@PnK8gc2IL^8GIeU;Ek-b>m9YBgT;%oi=-JCUUP*wYiz z!9&FQGnik|V8AUW9j1yOjD3J1+LWU|Bt$ z^LZlOa%P%f3-9h6s=NNg4KTxB9_<(~wb$&cF}d$XMBh$Dl9N|I?&>P=;Aa{r5qzZL zE8UaZFqN9i4zMQb-m3_7vrA4*^$QPY$oW=&gaol#KK=;%FoMSb3P9-?Vy#ts{d(I} z-c)a3q8e923`T0*{*5rehmNobcW$jT`R?`-Hfj~BV7@&2JMP?+(q8b@q@1u@+%S>t zXh0d?t))%g_x{>~e!rR;{%#oH&u5zr#ZR%RZm}ULOxJWCJ3EP550OGoAqOD3?(mx1 zGoqU-zUPwXs)Gr6coaM^j5d!$g|kkQ2YBLHzxQqMFTd+g@%(RFK*ygZJC%mW3fg&cpm-*jFdq)%SGB%IG`T9J@utT*T>Q&jyvFg*8W z4;d6tt8AXt@MbUe7UEZgR|1}}3R~%~+D((OLcafyuSYi4qiQa6oYnVrZOE^)PJb{j zMe|!6;QIJUU(Wxd?ko*sen45S3Q4B2HZ1^fveGL2${?X)s(ZE4K*g&A?L=m5&zgXQ zF=aOWQ8#OpLd6iA(?y9jLK29aK*Oq~0bFS*WzNj1U!Hi)Am%qYE(mbHzh6Juf&bj= zsj7K#1*F_?rmp@h#B6{NAnweD+Q{8f=|fjioE-6+BbxdJ;(7jT@-iq9pH zxd2DMlSxG_v))PdHY;!)lBqjv5u}?i6B&V%JbeA+ipJk)SmLrj*n(yXwxA9PAVk8! z8)#e6*Wc;5V&{x2#K7A`w|zEc(o|7bhxg*Xjvq?s99JF$m`XckYvP5cVZVCy6KH?; z6O#tht?g*$ow=1QGv8FkO>Bm<{Lv}9^(ujY7g?|hIiG@Q&l=H2TO_z-x*;~#%PL>= zpLhjm%Edy`>pyD&K%5m^=qe&biX>i+VcUlj%lR6QXyvdgpI*n+0sYtIQ6A}r{PmhK zqXD^|>w^JPF(&BTvksRpJjGPwcp9yKnlPXI}x+E;|=jS8qsg- ztG`Sfqk9pz=y}-F=!xL}!h%SnE#oaZ($VhHU}ZYj*VWhjtqTlnqtcnOMAOPPy{7S` zbnsl;=qUQ$I<$C>=BBQs1CQSm4)zaF-of^NGq7$M5=}4BDQSPq2bH~*ATnUkoj)(0 zC~x9PEY&66xii+InL4(2}&~r z+y~EOfS2X65KQT=`9Wj5Z9Rk2w9TW2^K*dR_O6&rZ^6uiW*Xw9y6Do=J!&wjtcFLD zw#HlZptId#pDX93dd$)i=OZo_{X)6qJAam7-hbYd02oK%S; z`B)%=;+c#ncau*EQS2+U#7#gpP0JL66v8AnnYQC}a)OeAV@jGJvLyV9S!1J_R-5dy zdqKjLx*L+z>R1R{+}T+;S{jiPlk5~`;tuc6re8Q-bE2$FD_FHCF*W36rbCZBL37$F&KU6Q2i7} zpIgh(rfS}aEy#|X^9u~6`{U>Bp`;`wIjF0-k4=qFkbt|^_ji$8UQQZdDz6|GUAHF^ zX6_<|S3?-i;$jg6khsQNhrFcnEA{4goqWQ(_x3?Rt}2mE#n zR)#mkDB)|-c_(QCc_{=8XTKqf*?e)n(TpYQ8WP2Y&*MoM7}M?8%N1n-WwITZ z@f^Fo>R2*dka(mGQnWro=SUb19^+R+RnKrwJhOclbrn^8c!;jZllwIwAJ>V91OBD0 z&Oq_4rv>Mfvhv$3X21>!G%{SO`Tp*=Kk&?~v-o%ZH=gm2$7c8Am8{oI4eRSd^zSpt zf3d6YBd)T@HC-z}%Ix8R*Y_ojx=0WLV7UjJWi&!0%fL9i5udmXk+zWvIzzl(^1he$ z?B3bk>8VR~&jHfE{qT{uvh=QJQkhW;{+HEfHVqdOc^r72WME`r+%-Ev*D5eR2YczA zyU>F%U0X@R6*QAAGutR8#)xLKT4lV2kmWHez-F;VHjLV^fQw1=n*}EUV^J?|ql|{}qXK-;0giSc31U zygV2i3tZuQ-kCJ?zK4HJ-G9{jb*WTOxoGIoob;^Y0q@8H{Ain8UNV_0>6*lA&QPkw zc=g#862~D0++{dlJs{t^S|$`_<>i@($jhT8#iC)w4IL*>t zuG*e`pnj>6mOY#y8DyK7T>3*W#!S=|7aXAIetbm8x@EBYsNrB5aX&P1%9GP~bBsh> z0s@JvGsJGXUT3O9upWf#7pNYj6Jr={L8s~~RDsm8_0ZB2o$nuP%`!V+5z%{+CMY_; zmQu{G;WL@;j+@Jbq=we)w}R%AA~1+3wBv{5#(sV=p`R-%7nXs6g=xI3bsAZ9u;A+! zg`A#*@Vl?j;XIlBv$wY>_&qgaa$Db5+P(R>?bS%SGd_=c z8FRkoeiH#YAGsA0)6$}GI$Fd{OG`7lug+J}*N3HYm1!KYsqa-9MmfVAD_9DI@A`%C zQWa5yr^ZG%LmTM@KJUgV3i+W6xn;^egO{*g@qcJ7j9^htyjK--fwXCBvSDRqOp8Cq|(keV5}Px zJX1lwh@BF~{NkcRDnUqSXj35qr01+&?BiD$JLhO|$*l*a*6$gLO2Z$_`>NyO)LuRL zb7Q?I3Huk@*hmfLt;C6b~#swybN9#YFF#8-bX%E6;wJM zOjNHYJy@qH(h_xb((n!S$@!L|1o@q>uJ%$7oj5pRR}09mo4*rZN?csVz|1#%u2T3o zoqxGnCnQGb-pG*nIStaV3UQ=h6;j4z)2{Xs6t1~cb4ZPm0dFb6NqgS!-faJIE(G2J zUs8zgfr}wPN2F1%-P>B8gR@Kwig3Erb8m?ry3d#NBc{X-rqjgYr)cbdk#j% z-nlL*zyd>7$e=05qmahKb@&nhi0m-YywRY0?KIc)_rxF#>!s4r;L4*&(rIVwsA@;V zda=ukHYHWXJp(_e&f%Q z;klu%RsZOkU?TEnN-4K;oEz}qf&{4=$f?Av-TJLAJL8reCL*WQpn>4#B-R?oY^533 z>tet&L|vFW9Xsj2ko76p%0Uo*hQOs{s|v^+UJKK>^+;PMj;KhF+NS&Lq^6^GZ= z$+NwLPoKowkzPQE5YN4KqtgLv$?pEX)SDLrVOIp7#5U$Hu(gxPaqz2)F#iP%aby3J zOEu$SPNu&3lS^IYTL%8dr5a02QDKO*`VcSkXQj9q87j*9LO5n%yOsw+v1bWcWp#a^ z&gKAs?>Br@)ZN^^Z7g39@!E`7G>7Z`R})9eLI(Ps?u0!P(?fRnUlc0!-g-(>im;DD zLQFxuLb|}`c(ksLY%&z9IfAsd$Ih?(X60|9Y4#_Oc(%FWt@Fsez#kSRI}4+Gnhqdr zJ?1uUf*G50+mYAxX{vBI_Oz$ZJ?Rnf6rE2PCXxc$yF=)3$$)hC+AMkfrG8icD$;(S z1gPbXkjG)~bH8}_%H#_D4f{6)3~O{h)U4iq26l9@+)&f!3}r^xAiKYS^W$_%7A2bDiQe`j3EF1(A_Kx7k+ zYz?|A(`_0rd1guXT(0?uedp%sh#A!V=3`fL6K?DIG zY66qR?VQYEwT&1D2d8`1ns43ek_xx(9ns&6sJ|{GC@i;WxM_h7D{PW}dFHcz+zIx4 z{Q_}ymWxJgska6lkvi1_?u*yJ#(^^W#4qjF(Zh~N!iF@>*eq~>6-f?-(CfU9!iLV# zf#>(K+_7?^r!LTkCmf%zrS9(MaGkY76s$d5Be%k?Y9|(fsm>Om@eoAJj1Z1)=oAXL zT^<^Tw?iZl=B>Y*Z%ss)PXm14T0c`|fK6HH`HY!W(N9L&{(z9WyGbRRR30gs3+2_a zj_=)EsJaB9tstZL+bsU(whK>DeL(nTZzGgT&ig`tuDM6iDQ8#@|ICPx9-4ieYu5GUUid!*?-9t) zfv!RXd8Eg1|Gb2RVNxIfv8TL0<)CB>k6$FgsdbdFpZ0%`^xx<3+b3CHp>&efzbMB) zi6ja6^YV0Zs~DTh5FXRhsjK5&{pa=k|9U_y5WLQmW}2RSgmDA-jjXb&(g?R82wtQU zsHYX%?UaV54 zz4^aRbtEqIb=KUu%b58Iti6Gag=JlBjqi@V^0~JIVH$0TlCEZIH$hozHubwlS!rn# z+&rB4&Tjg-ypZr1uI>>eeqHvUkQ5y)_mc$Wex>8-jcm->(Mgr6{pkF3M#j$JJfEA| zd8{6G<_Hb6AZVe2X1$=7@dQ7wP>{*Cia~|g0?oa`dIegQ4GpS<7I&4|QK_kjmUB<= z?g3OXJ0S!=6w|grAvS9->rdxV;?-wD)LH&qs=~p-K|T~+dCAAO;NRg|*`k-9f7`Z) zp{DL&f?5In|IORJ6~##O{hx);!r%+4;v{q#1x}{cB-45k z<9?su9#iaJp2k@XLk_q&W%ANUuXsD6##Kk%uhVS&#X}>KGVlr%)xJtH-ZMmufQjya zL#c!hlkLmcHPPj3Nk|Hi`iKvUcpb|=dWE*~J5l>J6H+)L|FYTHl%JmHofFj5UkGeg zgs`0x*9)t)0MELUMMHgc28cTP$1Wnla{IifmUMHi=H@;s`}3dnr5c7Xx(5=A{;{=@ z%lnn?*+}GTzuCMe&BPi?k68iwts7!)T{|MHV9BO}I$VG5Md%e&;TkZxeb8+=2U+m-{j$XWCa?bcA4-V7 z@cb{F@voo|4-aTbb`If$=Cyh>_n5_8Mg#&don$AYZipOE-iLp#y9u=E%}pQdU7t0} z!k>6&u-SRS3Q43`d6ATw>3?(tyI`9)<7q9PG}xxk8ArD)&6d5<13dG`QGT3L!8d~mv<`?Da9np&rCs<>UX z+~WLl-zetidXk*N14vY~QCSP*P}L^9VP8 z1tO=u)q=&9kxa!KAL>EU)2)S~cW|NfCUuaJ*~mO3`#FW0E{T=%*l=2q7j z9rPd6st%;VN37&%ATvFHQN!@zk{Q~t^TC9i6c`#DA*=bS>_@kdMgVe}1yTfi0YGMm z)8VG|DiQb9e#L|^0CWuhip>K~vqOLI%B<{b;w-ZT{kH8J~d!d|E-(F*ZiJOm5YGjaMImF`JLh-Q?+;Z{k>3)`mC} zAFt%m5_LpaUZOmdm89QEVBI|&zC2DL84M{UVnFRwY2J29X=ZPTx zWmau1j*sp=bz}5dq-`rN;@7V*UDMO3lRs}OD%$T~UP?JJi@Q54+u6A~26g9%-hDig z==+f1@@As*yPVfo*-U8ID(JI(}|XZRI= z9%g@?1it<6A(TJz*{p0Z{zjV;;01NRv-hWgKK5_SOfv;2b=K&59Y~6SwY!JC7=AT5 zz8QoG=8fL87v!r?C(C+dsjtk}cwD86WHixDRZdIe6xl%cw2-PPU4!FWwO06e__!H7IYagY7=T8U|mQDX!Xr zR_R0N0v8GQS4KwGN6yL4tIf;jImYezJX?Auh?>qR7M!v}hpl$d1f+E7c4j!v$42<` zccU3odXB997NTEtBgYv+Jl=E&CJ^+2&X*z>@P;uIfeE#%ZTbje%NvW z=O;gZX7_o2h;;(>>v|TB7Ji?&YGjfNdN9hd83zcmG(Ll264U+aYDaXAWRhnNxb0#cAjrP<`X2UkPqwpgEgHfE{qmnVtQ$i285BzU?q02S;mT=>K!H+ z6S1p2_FNLEF4|ggUB#QpUORyBr^sW1Lf8=`ia7D%Bpg_f)_IMs)_k|3m<#-LR28k) zFmi4m_%-96%8y@A6nQugqzZWALHrn40hJ>C7MfSAZk2_p`}<~Y9)~!u9(pO``$ZPl ziw3Z>J#TIFmc&B=LGpknXowA))Ba|lN*cnP`1$tqhg|;BO(qQi2z-2e%07^K$*6?v z7!j{|kf#jY#MR!)$)&Sv1bdp9(fsf}upRPOC(1KO1a`b%<)X8A-mBA@YmF4# zK1>$^WDx8Fn*afRv%ssK+w8HYo?GR)62aR@HC-Q)YadcUuUEfAu%?#_$GkSnTCXHH zE2RcXwFiN!DyqhF?L9e%pfKjc7uf&1q9sHjD;mpodao#%Wnl>|uy%3e71@h;J;I>Dtnqpt+!)dC{Z*2Wjy0*|+slW>Wxw?)9@(K3I7cVyl3$ zagnDYGEKIMRl%}hGp+Vu5@QwV)m*&Kc;mxxSpfmplG!nCt?U%fg<4o2TbMpren2*K z34?On#Oy}V7jw5p(@IUMX}XL02H*TscKe&(D0(D!qkM$0+k+fkT#Vx^?oJ&flZx9= zJVK|@{+8)t-4kl|(}>qKyzb_Vsg*s1b`8v0^$Wyu<-@`*ll;a6V7 z9(A?VcyE<$Md5Bv=TTQz4Xnf=;;-~|Al><`Et-OY!n#Dem^H|g(dpY!-=P#Ogh+*y z4R;&Y5QZpndn58kJ`k)l%agR~oz2W)-LUZU<#960S?`$i?MYqd$Q6VTvc(mM!Zs(S2!Y;gbX05cm`#xR)J)Y%!SKAPrhyprTG&=y!qJOIM4gHpAa| z`Ig@@uZ=2YlC}$3pOK0!KZ904ku0%vcr&nTg@41>v4Qo*Q6>-)= z2?z*;*CY-09|l5MGRNp?Xtvc|W=y?ik^VPX(pTcWFjweD0j99P9UDnex98|+w8UvQ zDI!amlJY$fP&%?(@GBm962VUs>>4TtZI|>UGw9wMJy=w%02th?X=n~!ti|{)QXXC z_;t;GpXOa?=^zzwHfhv`BJl>y1v2J{;bh zV0}rbo`4`7WE^eAUK-B&LbH;;Tj*ODG@~8xOrJ01gLk*x$g-!SFn|z#HI|6N|Gw2A zE>(8H%IMvvUOT5|z(35M zV689|tl&N)T>jY#H=`bJbhHm+v&z^ty5Ps$Z;4HD4gp(}>;?azTFnA%J9rSk3kcxq zM12!o8+k@G@ILZZZu;04kbmu+`wjUirHV&F9in@3#X00d&~54(bd4!#o97@F>|AKyh-KYs}b zfH%!MTctvHNi1))qjrBMcK>hzEx6jb=YmZG0ke2ahSUN z8GSi|OT=lV5-gJVkm&MZe+>OZb?M;;#%)LYts>I`YBd1B@5S@X_j6DgyyWp4{u|M0 zMuZ7{4aO&tJfDie6*g==cQ$Vx>x}lQUn~*aDmi)ed*b4Mo!)41Uv{azBh5Bl@OIa2 zZBa-i8hjNgzLLG~mR)|OnoB;=L20m{7=6A${cQp?6T7!Ak$mS{I^75;Fm>#ACuL(x zBE?0(=C8ZTiaC^BYJIq7al)+zNsxF+yn!xUT&|>JOsxxZRwo{fSD#dVw|(cd-?&6RG;2i) zPBRK8KPU*4dz(kM#eYICeE#J~4{SYf$`#GFUxzlsyx<#=>>7;NLB3ryu%*p)&7f`_ z;PK^rb2H~jpr@gW{&yjO-5TcND6!iRMeq}I-wg6lVf)!wUx+%{^JmU9fm+yEFCgCW zqc?Qg{0((l_?krbg6)^^P(l0|P1FL?iTsYjw71~s&b2YzWJJH{&MJ9>f2Lnjz4$dP7^mRDILYq|xjAA%H2b zdT~jKxVbf!xOg93iS=@$G=vMrHEp{_E)n`XZ1%lG)eNpsMC?ZhM2i&UP#E<-!&aU$ zX!EG99p_eLv)#t)rp_D$An@NFvuh;MK{9XGkLa&Z3--L9oApLh5&)2dP$d;n&QwmL zq9f2PW-be}7{c|YdL=brtXD!(Snd6bpx|5_ zmR^PlX~96W+j&t}+k)6b&^K+0$%In#cnRacXWPrwKp|=b3pD7NT}HmV5Ph_Jn9k~U z`)E?9pYVdjK_W&92Wb9HlcP%KQhP!Z0tFzFQ1(*ChYibdC)jBmF_n~9YU#@o=ipUJ z`~{MZ3x5&9ZVxD{q;zG%&|9o`=wuF_b0Gb>>7~HwQoT2!LSx!EYOW zT9;54?TIlTe?(X=Ymv{C3tnDp3ke*qqc~W>#IJse?WxzlNCR&?I2!Lqb)~K5x&pG! zNO1*meBR#c3diqzJQIShdd6gz9wgTuIs{KMRi!VbJZ!cLzkw1Y1$?|K@PGVA1p3`c z$U49_!$I%>TNk2>J*8YTB;gVML?bxdhU(~j-`UU$)p0(^@sp0xbgz91Syb%cI>BK4 zha@ZyUF*faNENV{UlOH0pB=R=;+&#a3xo^Zx&S8)ZovjuIBtdSa*V4x- ziy?#WX&EAUjs!F-cIYGgKnYcs&`>)55oJCVlq!9=XnH$JoTX}oI+qqW^laUi$?I(L z`R&rMDA7!xtaw3JCF}2J6Mq8SvJQgia#q!N_o{dau*D4|0)5e3@WFbE%p%rVq!o!# z9R*eZ&HQZtE!Q<)(}U<55?hlGqzFuRT^J6xt5J*DYdOgJuuuQ6Ae!+?=;gj_?0a$X zV)k)af_%1`@*1XmPCgR8WH?-0TqA31G*MfN#cv)WON)a!vVA{Djh!~W(sRH?QR739vip2Vwnyqrvv5b#9AtB|r71=^Uk6yKH zfIE_x z+4lXS72e_Tz)~ZV&!Zk$6S%0fiUDv?0wE&l<5JK^%%;J`cS}oMP}R}?t7FqfLN)O& z8DcpK*HT*A#XdiCiGMkl*&{J#D0kAAC`uw@|MO*tle_zSCrDl~}l8aM}cyo?> zUtclTUP7Ymvp(5lMoPT1`aH+f)fGz8>Nt+~9HdcgH{-xs2ZwG-YAXL50@7q-r4Eu( zucZimxjD^uvwM=icJMvXCOG>C%JEVStjEo9_AIyJUh(d`_vwk3g+D5;daKC)uLdub z6#+M`dw)1@?#+=K2*T{O^!7=)77J@0_4CLb6ZD2&eQ6GFt)JFt^A@22;Sl!;mWM4Z zK{?oJ;E_>|mB8jk)j1ZfBkJpKm` zEEMAozMlGkmykxdW9YM`Z$q-u;=ENJ5D;L;qk8W-zen1EGCPub#BO@1T<)gP^8KY8 zTxQh+!sCN)2FGZq9jaht2PZZdy2mu8yh;u?^Y&jn_4bMxCq z1A*(!VU6*_$ZH;Ck)IIWM-O99h9l`u8Fye<;ae^1?RSoHtSkr$RN`FBufa0>cI^ zU~f^!#|B=GF4G1*>ks~aY`t|$@;rL9aU9c0_Y zglYFcP)~Pb+TS)NjyjBfzzss;wNkW0Az)k6O3_{>zWWc~A!4oYsKlA&Y%-tId(YJQ zTZY#Al$U4am6aFeXolNbtiPWxh*SSiqvbnmD-6b^q{-bmV!3{c=JOjlQN`5UgYl~e z0=*tbfsu(7sTRWyo|?YdvmoVgEdGkSC~pt+nN~m87aPa_SQ9ABAwu2O-quxy2hBiq zI0U)9=@2K-f+r%9#Z0DNC(TJYJA0VSvJNp({#Wt8F4;4SQxHo&@A-5Q{2r$b{Oy@~ zcfXPeE%&aT_6TpSH+pEq^J}VdiI7>1!vd+hD&Isl;yR982CXdBzT~?`)sG0pJT}&lGS(e6Ci$yy z1iinKr>V5#$fy-a)CO5%U1`Z8=M7pFSoS<-NcVG~Wn&}0ha4k2EDegU@9nl&=*Y_$Ln|mh@`47v#;hn`lxczik!Cil;0t3fk;Q`sN4P<7*w$43j@ zwFW(q&y;KpM`kE}IxGNJWHh)o%;VeAlE6r>Oa%7(skd0itE|wJv$uS$52|dI^A)Qr zRoBmt#;Z@(7j4uRKa#%F9d*lffu0(esIj&O*rTd2{>4dVySyR-HePduoXt= zaxLm!Z;#@@c99Yj9=ZLi&S%x~8_3JPr%08)3v2{w{2hvONdNtyB}?Y%4pAJ;Lt!?o zO^tKqV4ClM;oolx}M$4>-ZSPTUrBHMCb$;Fd;ze|?Mc z`5Q!n@!*lTiItm0PvkjV+pSUV%iIe>Jx7x6s=1DpFF*A&yTT+no218;k_mmX{3?mlc6`bZpNH4}WP&NThz zBjd@TnmFFOLtr9_hEHT;r4&#a<42!vf#Xa5-W|`pAOo#ZQ*3>c`C*k~HfiFBAExt` z^p>Mg4IM&J$x{WguvXw(nC56K>@$eEPm zR?j8`g-BXF4tm_vFwc^-oKO(>#U`^ z>iPd+cucBbrhH8JUX&JAEwoEA;J>%R$meBn+Wqkxd9Mg|{7Yzv#m?`pJDp9maXw{< zO%MSEf+*&?eVQI|2W|sc=Qe;njKD zCgab}nEr|ouv2T}M@ocbVBfcP>ZU$W7_yf!Iaij&Gu+=M{+T_leZY-=u#muo)bAmc zA@ZqbpXdFW!J=>W*A>9g=5H-DGa2ffy}m0$ak1`UR|_KVBJDU|*gu5n;Xl})BsYubef=|BzprV(9 zeueiW-IZfg8RQvIC&K|AnoW=_YNCgfxI@l^@!G?Jt&UVW(w0i|O5dQ$c<$};xy%Vn zLWfc(&5l3ri&)@YQwbQ%H1M7MdK>kIWpfr8;d^a_zVssmK3-V;QV)Igej-D5^Af>a6`k7h-vLCVIP1<- zAu%EfT7&+B-;$2p(a|+qONdX5hYJqCgdcT-Q1}lcl0}BTqD#n2+&#`%7$BhNR*w^t z-f?dmo?D-xY~F?VPLugc9qC(vs!wSN`L%o6i97OS--U6?M03b}{KV#q{?=Xn525Q7 z8`4eEoDAPd{w5(`ijj4~dq`T6)Wpp=4Q-cAkuOWP66E)LDkLyNAria%+qag62VA<| z63T?O8Oe1&2~(2k@DIlJ=5JmhO5$rq#&oWlz*lx8J70A8w-dF3C@wzmzA^lm?e>iZ z-~Y55<#OUMcitP#8}qks4r_y!Lgi3L-`r<qvkkDT^=)t}v9551bvFq-AowIJ%NNjIkgWGNEN!oOym2xn8eipEIgob?_L z8hibiX_8;i`=N-=gioz$nVb}{WD|e;k&!5AKq`=*pLG(vM#|*d+Ff#VSGxDxSosFIH3KI>}hk2B=Q{)-!03_Pl@oOv<ieN@Js!%W3H4ea?uf}bSLF|3b96-$t9tHPW7~INH)gi@KjjXY0Ucjt z{{-H1C6%P1>{29k@q*!_nX{|qc3L^oYda%Jaa9}KDlUZ~%g5HN3v6kbnGOrxBt8#& zV0KYlfAKruRAo>8)Qu-wC;6|!t^g1^Gg^Eejd-!T%>w>dYS>f|DN}d z+tieDRnpjyL@m|;nQ;FLxmFG{*z0&gI$mSuy2Pj8A>J>os(O);nW^*Ifdr_IY6M=O zx^|=VpYJs3mHw;A2pm3t2 z1s=ArR0IVf4#-jTNnDfN4+)8Th82q(NK6xTi8xNc7u*KjolQ;ldDl6R(d-X%u~gaiew(RJfphk%Fde#K4B_IY$gr zFNvlSbI#==pYNSNW(n$|nss!^bYv7{&nQF{Tpjng zpwT<)(g3*&lYEkl#YhVYSV?}A+O>nN8Tcy}4MNS$v@0^;TtY;a)tq{y8|zb&Z`uAt zWy7BClceH*M#0**LfULk&}rjEQNKMSph1@GA`CQJp6~wdpPpN{pHyH^$1cE5f@iNy z2Z;)uA;MBovu>_fVSRZ%P#3dt+04*1z%*ylG~l?uXk%rva}9c_Wm5y%xkQWS+xix# z$7^!5nX2MO59a$0DSd`u3c=7UC+?&uzvI*@gvfC>y9o30P8^gj!g(1Pj1Cnyu7?9JCA`V7w3ap$^zwgx%B;kE7W`y=*g^m7b||(LuBD6g+`W+ zvsr%F2rNF-_;`nM%d{up4M+=q|&&Nw60@7*2pQYj2nlx zpB5EHAmukPf4=|ARsonVkm&x$a3q1EQB*=cEAgKBVtGzBychY!$k6E+7*oO1Qyyp} z;*0lPxuxQ>r*BsQ*q2E_;Xj8KkrDymY(8AyOUH9I63gYp@`QuqGj`@soP~%>prwb= z(3|$!Ph}bpH@0&@&i08-B3$#J_&XQy(0I4AC1cJ9w2T#kQ=R0@h$W}^%m||9yQ&kP zKy`eiv3;nqStG5UVvO8<`Y5s(3ztC4*SjIMqseA}R&pWRkeOrN>5i~t%BKMtE67f- zC-~VTUsUPd-l);>=&vHjf4`CnO%CKv)xkUT9X~<`&4BXi4LGFSs}hCRCDks?e>taU z5*WdM89i6NheMw|e^<17(dqAKZJ9mr@LnBCJEkipWCSYOI>h!oUHRG*B=}kR6MDnj z3vZ#i@)cBc$O)dabM^X&f;w6C_qZZ9y$+wu?||!J|AhNBcr%bc1QnxJmK{pdqDXe` z(?XJs`dDWI)=<)waFRfQ(xirb`!WEm@nTE~& z1r?U@^v^&Rh-5lSmi-#}OU=0H*2JxOP1DXpj7aJ|0}xxP9eVd}_%EF(9hW zyc1iUiVyIoqL(5Vc$v>06Sdx+K}L?6iVgl=_5U`BC~65clG^05*EkuM$etBoEl5j` zn}l@_%GtM9_pm$fQ1-QkAkbFP7}AFJVlkhSI58pWCK!k8kMSZk>jt(Sx5gKJ;5)98 z8`;9(H^~3`&vdM&`Kv%_0?t49II>I^i?+sOF)d8)`Pssjgfaww-4duuABKb3+}wPA z)dubp#`=3G|8`@4Z%xrY8c}Q?f$`oAibmthj=XadHwH>`U~d7*lt)5gnPg52(V#`r z+evDFozR)Ok!QDgqW@#t96~}TXQ;}tyR0+8Z$QneeuF6^u`KF0(L{#H4g&#aeX!Dl z(jdcsJiz}N07=+0=Ka@vWYlj8_*BBf|DU_AP{SR!)0Nw@UD%K4?2SGx+X@dOo-2C8 zfLPyz=jCTOcXxMH#stk?C0Tg^(P{tXXa0T)%O`}zwXV4&pXmQ>v42lV5h<$D@fzkW zj?L05WD1#p(y%u(&dz~<;!Jndg>lqk27=k;9&M2#@ZvDZ3A8(bD0S9rlr@$5oN~p6 zt0hvv=RD?e_BuhaM@GgX0;1+H(Je9x%b z5Jy5Q0b*YL*TDZXG8F>MgqsIXDL%_Xl)ob8e?M+E7%}Z9f)k3!;>L$5d%2opx@to+ z^33PGCE3Sip*334$Ww~xpNGAVAHow$9X^Gm*=N*6M+bFvJuA{ECDrc)zQ&`L588}V zOCPS(u9a1roG(*Fp`zp_PO8whQs*C*{O9ez;3A*g;{{I^C9SJYklD`7iL`)+Cjv>P zZ7vOG`9?ILZ||Ye!H%n&`6!Qjot-5u7`kFHqhqsZ(zw*91Ox=@r>A(gN`V`argUuj zH6=liv=$9RRN<$6K)B*Wdgrsa2}2bHSId0*GjN;8>*fA{&Q9u?G97gv3}rc`z%~kA z?+*^8NP#tNa0NfFkCKhnNC@GB^C#3b%fGb%`aqqP=xzruqOklfHw4sX0&h{Zn<2_u z=1Xsoccf|9>SzT8cCd<{G)m{YV8H_;gbya@VPQs=m=mGR-Y8*M0KP6HpO6HmBv&imFtY`IV$qv*$+d&hkn%r~wrb z7g#jBb`CW@H#-fP?zFeKe_g0B=vrPLVE}*I=%rz0r9j|R$cy~mOb7i04-o3u!^6pr z*JV1LFT=y-BWovx|CwDCG_2=-j~3?u@?T!&REEIt3xp>)W;{Pm7+7GKQBk#D@|>o< zI&`m|2yHa76WUVl_*n{j;O$UWq{3K=f{uS24=u7#oUd zDH*{8y-25P?Kp4Z*^tbqcMUuk3z>q6&Ea-P0 z1CKA@lVKZqh^dUJbh8&;TPwluH-z=$maqf#jWiaZkTM)V`$f3hTjt{8^Q#r`$tO0u z9cL4~Xou%=;AbbckspYVqOiQGhSL1}e7t66n;<0y2HryOFAgPcZsT<8kq@2q581WR z1ue67;B-y*JbHmOW3XtG2R#|7y}@&;)2vCsvgXeYD^=fr$=$!=wheDd4Ea=VkYgdq zdcf=Xq|XP0<*V_8PsfTz6!otk@v;j>Owz19O3AS)N!R@7wR=# zH>58~U|N{$l|;SH19 zYj{V4Hh8twGlfv(b&t42u0#496SV?6>97BqFEv8U2phY}Ghh3@#cqev-0ffEk^ouR zA7YRn46;t3owvFk^+AV9ssX&|NYTll$;*Ef_2k1892>9W<>xksPQk>u3U9;r|0u4b6 z3l-~UGII#=j_>nTu5R$D7nY0_C3v-TL`1LIUyEsa@aT`K03n>7-)u+HOOrSME;GKE zBfG&_TWck-eOSwyU8rikeeZiH@Y}JC-rb`|XUHc285tQT3u~3UkDfC=MfK=aoh&E? z8_q53kO`+ec6_6lvUpqeNwi}K?L`z?8x6NTIm4{a?y*j~Ex6r^qinTli~(@pr*M0? z{PO(57a+%~E11GDIN0BLd*c!uZnbJ9~xS5-0X?pbYBBh8-D51qF?{-dDd6iId*JOSeN;^>ylOAXY&m zAl=E;-8pbQ2OS;T@47r<-P&)dxK0-Q3U5e8HWoDR*nq zxD;~x6}#JA*Qu_!?>9rB?H4iy)JiFZDngi(PlY}iR(3M{n}JAlBmGez>_ts62XDRQ zT))3VI}0IF3p{akkp`_DZ4MFI*ZVMxJ`579=W*Q((5rK)<>2oVUz6`WXA}ZN0C2(` zdp6WDa{aHO)xJnpIl7}N^R7wrhKIakH|quu;2&0L-11@rdYpN>jUTEF`gQt%P}1u4 zy&as;zDDEesgp_O5?r^a@1Z_aSt{CU&kM)j^xjJhcOXeILPLQLzG4dT)}t|+^H?nPhk@e?o; zE$HM%^WTG%r&P)Z+ZK>qUxb~c8^0pn$EeN}kPTP<*c)^9jBIgu0YRPbE*HNdWpKK* zv$n=uX?E3nzdy?)Np`ofE}@K0AdP>QaX zTRGNt6Fs$snSSwmd3(zOMW&K{EiFmc^Or|U=PlToBcki5SJ^0$DL%d+X_=YI@u072{C3W|G1Q1{q$kBoWbj*7 zHVIiNrIGabwTRqJ;@-{38qCfgmf*GUst|HtKKnE<2TL2-+c-rJzK4GODi)|xtEo6R zI2dx1-oR|gJA0|6M-_uqDF6iCY%uvY{PuOP{ib5+{1c}&%v*w1?_&r^i*KkeDF*@z zgMI+bkx{)f7!H{EIA9RucAV3Cy0f!Gu>$panrpBfxw_YrmJtugK3x<}ZO#}P9sUt_ zeutV(g3w^b!jc&kd9xvzzcAinCd&^(vTshhXmD8lWx$iuKj zSzcQQ^|>%#4I^6nOIx{N@6mAKdi2IK916UnM^Z)urNCN+DN2$O5HlMNqrXzc8X%_{ z{P~Xd$>KQT#R|ed&27m$rk3ceDA+pdUBks zz&S!@UoJD@0kt70<~v7JY&!>Ud2wx#9<)lV_`~MrxCd*3p)y?zvhM ze6oD$adduZS04*b_EqTQ!m*@(RM>y$N|22a|NOa1727uq3n%z=b<=qMRH({v z+9TdA@>|3avR|Lby)x)xacHvWhod_?M?go9UZW$L5yMzi)abIoATr%H0;FJ(duywGxfG6hZ$Tx#-2A>01KFg-Keq>b!wy z9JHsg^v0a3BFrWVEW=8_<$5!_YF~(bcx-b(xRfhMfY0!PUgxmc_5D$DXxq1LkM#i9 z<|8Zf{?w?z*+XuxjPXIZJNnM-v9%EJ*dGo#pMdT9|+z7)BH3}4-cJ~`#Xb+bkI z@qI10=K=O3E8y66qTk0Sje?zjz#nwIx;i%yiPU>&=*!FFoTSdB%Y{@il!sbbv5tT> z>sP#Z@nt820xt=u#+hhuLTp4vzhsyPc+alEy?lcg>LXj9ck|V$#HH;n@OC1E9WQK6 zu96(Y8#Gk(vKqOn0QmdUt%Y?FM0FmuvIc@~#|uqm<}UX`P&+pOF@!+6*l zyo!0`qfFd6GeSU~+}?QAZt&#BgU|5#Ciut$P4Y=I+{PL1xqZ9y#D2C1@HV3Sf!j&> zNlk);%}j}Z0^eP9zB^8PLb0*NxIZm>BXY{tsUm;RqHfK{_b_2kn`6903;Rq279Hp! z%(X|TKPqQ-=gz7mxO&trzh$V&V*6tL!_UMz(2mcqFR*u4f#JCo>2Cyi@A+kUVEBuI z0zM@w<6uix?W&V9yZhuH=h6h{J%d(J5#dimy@i;F3WT5iDky(u0C>K>QK1*w1&EkuFt?SENMwujz2R7NJz|N@B&qP(W}2_ ziB;_K+xl3@g5~ z%d@n@Juz8?G}-oYVV0NV+r5ZI0iueWEz75);RGLT^fBAc>px#|GX^}_zI@v(@uy1T zwL_0*5*+kYY?u(_)2$Lp0l6tMI0>U zy^*G7(%Ufa?ZD(8fGCoc%SYY88~?WT0~`C%%3y(spv$1~j3j zJn5X3#JTXxxoaoIZ=k#m_=8Hn74P^|HQFJ+OnD)bX!z>BQm-n=cvGiuwr zQuc|5ugkBF!$1<`=UEZZuDCyHHsFy`s6Ni(q6ABKbDV4XuOS*m<{96ZrRZm-etsYf~DqICAwH6Ly}V(tCpUdLg3 zxB9k;QRj2-kc6CwcW2#9#NZKk(#hRJcTKb~oV>Br1HASi0+^VB3AjEky290c;hxvG z{GFFT*zS``ZFv>zzVprX4CjQNP(x|6&N&DNZpWQn{*vxhNcWYQQ5CaqX%*>YsRT#y z6Lo4FtQvNV5(|2PdW$Z*(;NpwKuZoK6Ilx7X@^v4)e4)<@k~2ab(HtXsOOG|2ukNp& z+Y$17`$)`m4bna?)EC5=)|w!Gz->oauZ(G9Vop<)1;1-!q%>iI?jUWg95%_Rl6@Et zChT1+_X)sx7(6-dVkcf7$s+AeZeKXp5Nu2ZPax`M9*y+$^nqVoM>RYVn9hTO$%?qD zO#i?cqA!Yu5Gk6CHw~IGv{TKn*rwSK)_I zqV>Mfx~l+KwKI2GK>)VJmtp8B0fsM>DnJ*S-55Wf5k@7{qQk;c;1AjP_`_;tALI7` zkibUF%XBk%eRr2>M|9^T|bzrwqItJqnVUH7iCP|&=5Ag28cY&C9>z|^(gKG)ZW z2D|Il3n0aVP<^gid|sD!(VLpQcO$O|uNMYoge{c|%>&kw=%Lgwg0y*)5uSJ*jYZIT z(_-0lN4n$s_;%*Jk>xve!BplepLH$p$T~3puW&4faq)DmgYNkLm$1-x#U&hcYHGm# z%X!tNm<@}+!myC8qwjBz7ZV)&YXfUJ4G1NE+XYce+T8dVH>Pw<-jlFw#g-o_8FZVv zjkairHWJB$e%D@`PgYBx>}}*P_sM&h+1V|pFjf6d)KRUcQN;iF0bi$UOy_T<^JUyl zGJ&PWJMlPD(ov}F{grcD%6SsC#jmXNK@PUsNwVxBep!!?tP+_7l~iv)g3uXro5uY7 zgyyCXAn=w&-NMopG;jA#CZgljyvf89^+?G z2AhHnyH{s%H`Ck`fI?<1-4a3rU2oKd(LKpl!%A0z?9TUoI55pNgxjl1MGd96i!}$7C8*gpDL#rM#g(!!BEDmNP$F zY$%LvenI-8UuyTv@QxB7QjNp&np?k_2Af|@6#PRsWPmA}Y&Hj^qSuSNh>CRgoL_H5 zUHG59-o=UB$9rYGdR%Ed1p;mEb#B;Dm61F=C%0V)){~V2POTXrGuOJ2Ru0MzEr{aI^QKL`id)}}yFx?+(3;k7anl(d(E2SefDJ!c%+nj2jb#4W>KT*hk|FFWO~ae3o;6fmNT6FiY`7%<6(U&6(kGFd&tZayYXWO3Pxl+E|WnRuZ?MJ zbVsnNb0pFm{I{X)7|~rpeXPWYhl3WWOQotICnaHMq`qsNWE@kQv0Qrd{cwqlU|P;kh#!qg5zY>vZVF?**>Cr$aWwY2QkTE zwqg~e?5ePU8oOly40*7>S^lX}axiyxNC=(6^b z0rl2KhDI83&VQr_8aPJDAaL;kRF|$X4ij@GhrqV+2V7b~q`27i2yRC=Rz`BxE?lT|zTRm9R|Oe6(T(<>^J7Oa$;5%CCrnF4`q z!No#P-gvB#6)9{Wk%Iih`y!lGa__lPyBAgth3A?Cl>9&J+0#Ea?!mSOZwYWYyVovt zsXNa!s zX(Mp&(=!hZ4LwV|TFD0Fi3+*5T>s$s#$Js6d z13dL9cC_B-*P6io#68+nOl^9VvkolZkF8@8M-Lrxs*9rtx9I^reXZT2nI_DC=bWYC z9KrO(?5BIYlGDx0v{(-hOe`CQG(NY%wm1#*8ZkaMZQj5o-8oBDMaiTxwyQIaeXX@x zM+2u$z*i$;)1Hm3q4yqs<4MQ?9!+j$FS{~)T*4ZepLj`j%lmSzNG=SIWhW#X~y zC`oTfn7g9{;^Qc^H*w>l)%HC#kL2|9H)oyB)donQIdN-idK5IFU72}QuhYlFc`Go@ z;fDwyZ-K3oR9se;6|tCHgHlp)q(5b;uqVEaK`ds20};1^_dd5Y-%S0T zip}n$M@MF=WBaeZgq9=HvZAK@`_}AySF+`L6iLYtu6dWJ940RRm|V-TwDW}!nf0)j zwa>@fNw*3GD~)uoJL#gy^eVw59^GQ3nI{O3nm&eWBhI1EKOTG)u1 ztN-R?g$O`t0fhy?{3TQCDH^d5-3UeR3hOj;AN_b&en8T_K zv1JP&ca^!L!;^PcWRb13CtKTMRxJCokw$AK<^9x^l`RhSyU*58473Vo^@DZOyIiaqB%_YEhVSH0D zODAw2FX4&Q{s|JOMdd@%k#hf1a6u7@q+sq+6A+I@iTip9(79KgBw(2*G}V^mjz?Ab8s_#YQ7sI*7uuWmhBnZNHZa)Q^IM-iuwIX6D{~c}9(x}RLtYEqu#PKnS@`Rq;(I;`JikYsryJCY(k`id zr`~cEuzNffx=Hu+5aUes__o&Tz=a@6j{FM*kLu&IHLnxK+W`y!iY|`|wr*YJ7l1`% zYits_d{SlT?|kCeR?QR!S0YP4{aX{Yh$`<9CDpM2*r%&O@~KWEWde=~db%?lU;KTo zxkks=^l?+3TED%*pY1>JvS{UMF+i$(=9u0M^zB--P?EG) z>az5l*vKZ#%;xbNsI!#DTG@A@XPaD@YL{I|0rtj5zLJxj4QBGZct>JbFHg6RrdP1Yk{mD#2Y3TOUAlU$W=MIE!}H+FMOQ z2T4*@XF!ltzI4!|#7CtR1bkNJ?@g8Uu0fi*Mhc(ao^vL^|pM*<|_N55td2R=MK-$nThccCXN!*o%%X5RZ# zzWvMm@AWAuih~R#))co<<(N~=lMc;hEuGC(6H;R6%5L15*b*H7fuFpfaXr=HJZ;&9 z4+@J(@k}k)G1-uNy2SQ8J6zs9PPjK^#=Xjmxsz=8<0}e2wI^|7Kt)GiYs~Ftv#y$L z_4k3I;^TX2S6jx5-5?T66&uFYq45qnpN@6t&N)G?WI(R$R{x9TV%%f-_pf6vt2sOm zXjp1gyPPM=8R~3Su@Q8oH;LP%%#&wz1u*6d)X$(#+dwbSA(w2In}|jf zvfkwl!5H|&8s)lnUX>(Rq^R{f)raj55ER1!pPL!QVPD%z)LYnq5nCO0mG`pJ{$xjH zLLr&@Fo*6hy{eg?QaH?bZ(bUVjPVw4#ls&eWi#3dES%xhJixM>MSXAfXt3^bierVp z-mva)9^_6L2rn@hajM}1G-^ia>bot?OZ2xIu>TmbjkZG~(qTz)mMD?|r!$&Ys_aQ5J zYst;6wXQTjUq)TD^Fsme*Q3TulRHSkdy`4CKOK)E6&W%{C%R$HpmzZrDM3^cwf*cg z3%oD3E%yP$hgM;}oURY!*i|E(;ilW&7`7Uj@z%(yE(#x%%2~=KX|EgEDaW=M|_+q|kAKIuQrB zu(P})`0yW6rsy3}(?FK8-Fq}jd|%Bc^tprwsnBtwsjdf!Xybvvca(qXXML79YH0V2;t_D4=ZiOps;WDl+T&T-X-c>-QC@HN}YZXEq3PhJR+@E zk!^J(^3DEDjZ>8K`ja`$N4upjOJ_Zg=@hK{_4Y=#`IPWdomx^!UV!Oja0csq7eOiJ zpbLVT5qcCr&>PlW{d<}zJ`=FQD-{#vGkf*XdU-7~Bt+tmBz9du08#nHG77J3rjtsi z_?mvZ)x@vQa-^O-nuk@NTHH?G)|{?-stmdy`S1U{bAP_?>AJHdvNIHSyj$X#YZW(0 zcUlcf3W`ZKiyx~VPdhf!LFYaL@7{kuo8TXnt7T#{yI#jYQr`G1^ovR|shaIA}pLwdxov+S) z>DFZ4Qwn(KFWEk2lR~NW?#)MTtG~o7T_zniFplY*l={P3-Q@wPJUM|P=6llYa)Lm6bMI-<$2)ciFYnuPeajmgX++1_)qt z_g3r%BQQO?5#5%hhirN%h&{SfFuSvyv;IxHJ-F`pAeD`y;^#!Gv*K?)yPG!a0IZ^X zaFZ6VnIRS6v1jAwy2xrOqQOAMAFL`Qb75_h?q+E93d?hnt!?QA5oLk4lz$${iQx2* z>v#Q-udtRdGXh#7{lk6X55y$ty!6Z?@4hqZkgd0paM5Hscz?4-;4Fpq7xXyzQ)Bc^ z*6tAds{0|`+;d?U_X|nH1k}$~ikfaUv}8z$9e8>j2gLoKjV&pT-Rsfw8rTSA(T(#%?i zzaDLJXsnwqyp4LLD0h)*>Y5E*U)I5{E2g0Hu?1C4?FMw#zxO-!WO+&1TR0=()Y|&R zI{jU=4E*Ae*U8vOrZgDA)!2AMdujy}#R!?J%@4)P(!CRG`yTt6fCm6(4Zk^Fe0@F; zEEqNL5&%7!XWeM6A%Uy@_@PF6&0*h0mz9i*JDb`y@Z`lKCd&NV!?BW>eN#@J9VD6f z&`c7_hS?`|9|OB-J5ImOLGa6xDgEIMPJC){eg!`TEC0@BjmCS|t~~jVN)Sq17vC_^ za*Gz)N?(K?E5)!dGuO99J^Brh8Z7*YMbOTUzUT?_6$Lsc{^{uK1a^NjMGyU~he&h# z`lEo)5HvQa3$DFa{Y{joFZF=>OY(}40g{MX z5h8>5zPZsehVO^N2t-JHPHl1%Mt>HwbdlH4*2WP%XtCO{wAWcz7qR)CzPC4&jjX3f ze7n`sqJ9Dp9cjegZ=~T3a}MbweY_1wxxXfgtLIoT>M$iSx7;~rh|nv))3YCat2(kr zEptoZK5%Nl{ty#Y+6=dIhR35+?Z6PpN@3C#6y@%sB#{+CymK|$9{-}T~i%5r*O&`^2{D3+`GAK%XgtP@;Am!;d))OiwMT9!fKRH9! z5b7VLgY3?#;*@v(v}K{=Ukcg|?gMiteIJR*uX-LXtr2N$FX}t}Ng;V&+afKt%H~cV z99I96M6!))nf|WeysvW9ZBb(a0xMPhXi#cFT3dT?1-rH`r+tKomTD?4a!YoLKPd4t z{jVG?+g9b6il4t+_a<-<^-G6bPL&EAiFzbi>Y)KbbVWjXm{{BNGrz634NYE>Ogtz! zSH>QrItIDJ>H<13SFZb=Bn&;(enreE{PB?o4=4DXNijc;?9U$tk&(F)F{0Zx4tCv- zVFAxF)mSxn#Cn_Xgdy*Re-A!>npiH^Vsrc*Yx?r_0`9MU;-Ux3~S~ z7#s~j%E|`#F9wmig$5y2&hIiwUOe{e{RM~j`nNT57&PcJD5ic?9h3{w$BG%g+qI8l z{94M-PXiZFXF0OYKzL>EW!nLSOTO&jqf2&wu+4_!y`EN9v0wZkeG%(idZ?^)QEMYA%FgCuVHg!1tdQVK-;ybNBh&AiI;H>3SgS$Gib)&D@jcHS8?% zfqKvC;IDQ47fLQ7&EAkGEjFPwHKG-5ht#F}T2AhsRN>&MZ)V~zE_-To>!+XLHHdZn z%B-h5->X`nW!{=LuWE1bT{V0z4 zD2GT2pCkZc4z2d5i^7pH2cBh9bCLL2{DQPf)(2Ca_+FG%-K~?-x|-<6sGdW=176mR zOfSjQ1?@B4W8hmUf9=Bfl|i{GZ?10nb6B?v|7&H(b;h6vjc}m* z?{MrC8s4ZThk2kk;n3d%zHg#vG)|^arY3ql?qGvMVHY~V%iX>AkUr>ocd|&34EP@T z|6}Z{!=hZbw*?7l0TF2d>5^^+6+{FilF)0C9BO91*K>|r z_ul9C?eh=UJ6yxdQ)@kI-Osx32Mu(D$%7eId`mQ&{S6T^MqsFP;PU!9+D#n+kpgHS znFW_K{_?TpLiWW_0%+pnH%yvT10Jy_kgJOjNb?>0EL>;8D9cDHvH=y7u%X6@<7!>k zed%y{WHbD+2WYsP4AZlf#tq?hj{z$1MUTvYI8d(U`eib`3tn9w)O_KsPd-|0qm>d5 ztE_ZX^z6x1)9GKIC(#cHI|E3a96<<8tzQZYl=E^ijrMunX+sCW8P((vBI9P#mRt-vx}u=E z{`IM@5(gba3cfI27?ssyY5h(gozFqW5v^!QbLDe&4pQADgcLZU4NfK|7gh;{Y0fv3 z*YJ>}Z;$~f;+zzFe__O^kuMC}e*$srC$RnPTjbOAKLGI!a@(EG%LZFS{L=O^@{hv4 z){C~N7I}F$EuJ!)6u5BoheuED+P;G@_5yMEk=qk*s3322; zY8i+}#`v+st_9jSeVlGbi$s(g#NaeRPJ9ma9eBKs9KQ;&Kg<8}X(R1B>{B2f6|bs< zQ{xYdVF2n=G@@fB);<(gBSI_l)-UD7@&*Bj>4C7)1}G7FyQJfLw2xc-xaM!R^Qv-@ zxTjFG%3|iZ`PK0nwpz2hzxLcbp4M|?%PaIOs%=6VH7!zNOfh)PJOOO)c z24MFLNU!2{(}m@}t7pL~n3x`W%+s{8e^j+L8iuYev~kXUW7YU8i_+c0xSQo|`?mheA!=y4X)oF6(tJ z{nprn`n6d@eZ3#nYZZg=1QGsR@pjy+Pm+?EH8nA-IamHJ3qEB0Hcu(eZ^B+OP@eD3 zb$F^L#Pfg0J3#71IRwhVG8fpYF)8Hc(ifCG0~hss#;vq?CiATpQn{jpff7)|byp|C ze8sL$tgA>2;Kd8(o>FKF{@c$OHTO8Tjso?k@j$`ssh4h*-aahthqP5Z&ar-%<3*YT z;KY`%ZDR$|ea_1tLxCHG7maNLl#Zvc8f(Y)$_yDE(umAH)E(Y(K)XJs;GvC=h+_)z zB8UDUQt+JH(s_%@%QLY+bJtB*0SxpZ1ibu!=|e|%97w)uoBV59&*QmHlMdex#>f7 zwB<*l&vgRr;)h{U$q*4^sf(WLf@+cR0BD&$9=5*NtW4$(Qwh~U)5{I{AIDh-oA(*G zj+DQut55kv%kE;B_h?#Jw5AgsLTlRSSWx6L(o;1j&Pz=Z`t1e+aWdXT?Xvw^nHlY{ zjtg<1u2dt2zj$EYs|r?ABU&{84vs1Ol1x@Q7uu_V3&)IQp@-k-*?>n^Yg}&3IpO&L zE-!jhwK&n}#y#{%Op0uQLz0G2r9>UeV+Dr+ThJfUC}&X~JpdY?wtrq94RcwAmz@8o z$^7@GSEFK>K3tgEahn})O$5ED@^f-dRG@uwjn`9?e(%Z%j;jMz7|M0%R@4UXi-g&ZE$uW31zYV26d8a!+}mT~CDDDI=D?&$ah0 zqLN&n&+r+K=*2j2WrclcRC+V%QSU**xG@xu{7Ql`*ryo}Yf6d~8&Kb73#OMOgL!md zxQ$KYJf-*jWn^k7VHUiG+3zuCvu2vjkQSG-eWGR@ioa~OosU{(bd&r*@vhL&6*o5=t1Z+Kzc|rYE zOJStBPKY9?W9$x4U(o;MyZXoWB+j~LWz-p+mk{>*oKJjx^(@Cd=WTj!4dCNdO?|WF z;OnnVr&v+c2XB^Mj_o$?maVv-BzNpNa++9@-itaI|N1HJWYPZl`_A`|_Hy@ymI~v9ieY*6+K~=gLLk%E06H564^@CovON!G&Wd zVQf}{v|%bgS8+Q`H+Y3(V8e#(yTlLf`J(8HcW5DB=>(55=X*)zS1Zg0L9d-~%(f|1 z9Z!J!7w$EypYjUK^a=r`Q&u^-e0PavzZ6Lv=~0EoPGwrChuf|{UY+e!E;Uxe1UeU*52aO*?Jez#btYgB0_N2XIph3g; z2(wp^XCuyw8-y+N_iIZ@8Ut*_Rz!C7_hOvHxpf613EKWeJWp)o+WH!3*^XI!|LfR^ z!}<>BWt8;F=$)VEQBf$PVxWAslJaX@;u4@hA!2W(WrpLfR$Tf%t_Qq6E(M)r5g^A~ihACBQEzWlN&!k$3o9CnbtkLu!#do_F@VCuRKx4>#dfXy zR3d*_z9(xfX%Y<=!o%!Qc8M)JC9(lmXI^xuJ080pHWYlExN{m8S63}^CerKTU-4U{ zAB_9mhk`7u7_&}X0%jXUE|wt+EXHLIa;h8KyIB;|GoVyeD^gZ&RUdj9yxb6DVhBlo ztibHuDRk}OL}3@5q2++arjL(=h2X0l3IP7I+F?{shzio2;fg7tIRw@tm4nu95XTPO z!U-|5{WHBtw&;H&4W8$EzOl^(u;%^s6=(FqoC^tBqE6#_KY7+f+u2rZqOs1Ekz-CV zpMIny=%>7WBS?xF`}St-dR*WQdEdTp{V)ZCSfOxkLhFvg3hDi?QFle_T_R;~hf;83 zW><`f_TvJ4y^mv0v4~4-ogLnQey%5)RQw+d=oj-4xs2&tQX0La77hrzFHrV{TwDIY z%h6?f6ytn%s_hdG}J=dsp5 zs#uNg9WG0+lL9c-k;91-ELP(Qo;`!-e2emOk4=Tt<&xGE$AKKv5v1SfHxSWWKmuxP zIb>0+@QDsAP)47S+T=`DocssXttSm zmIbNRjYWHJ-g|1yf)53Ns?WrT>ElL9shYJZ0PO%d<`{Nmg=WZhrzZkQV7>@K;HxH< zcW5OG$7}oxAg>Ec49KuoKiBQKPEq-ZyHSW9WTv|K%pRREAc61YQ~6HyTIv}^eph&t z&h2twiA>C%*;)=#;R;5du+-UG+7(lT{gFxi;6W2b-nv>%J{)8;BOz?NNxN>%jiAk> zIXS9Wj%)`;QD3$E%SO@rcM-tuM`z2Tl_+uMOe5rqX)7v46c1H^@0tM zR!Ds>{&vesoS3-Ann>tW765YMn_sK{1TEGiefGg?lJk|?N`nbpX%A@hqQ$M}an1)* z%=ol-P`b$V>3F4cd9m`t{@5xX0um-dzNo<}rOKxbdYh^6yZDssOeSU2qxBw|2(-qR8QJBK8oUWG{ zqt0b3$+u(v$%;x%1XyDwi7hNVGMMhDjQ1q}D2BfKpEJbVLKLnFdqD3%GX1()=j`Dl zfjc6iqPNUPeTF~J*sd3*9dJj)q0lJcU;tvdzJU!50``>xoTmMrW%9^>tlD2S)_0NE zFv9(GWa5=`i@#McJnV!}-<$0&c`79t`1H^J8xUeRP1BC{t}LL^7h3LqwK$m8wm2~R zG}S;%6h^Z<53VhzA~;L=FQQy?w5LV*?Un{JEJx~X3&Qj83?2m zm6I`5ZIJ(kVVG~lxLliG%dh>L*qCZhn5$mbAm8*0WBs4x02Bo8g!?tyCo*i){kL}f zagO`f7QV4Z&P**?WeBgA|MRH*{I74kkr7uN3)GjcB9ADiR4?(~hyKp)|M|XNf`?S6 zCPTUM7Y5s=AEQ{|4%FlV9uk~IG*VY?S1p^#8EMiAgaEUVP+QcCn#5a!UuripRaQ@S z*LHJQ=>Foo=*3JgG>Ti0GrB*8a7k(G=ZpW<4x)JRnn~Qp4&U*Vs6dEinOJUc*%Pp- z90F~5*?^jsmhcLX#5nx9u!J}plEq5c1Y#dOfR1wRTJYbi7I)N)#JYj$>)P;KNr$uxMZ^-~i&Fq=f0$ct-) zh)&OseW$C;pY2Tp2X>`fH&KH2=Hb7YTU2yQ?GRpzuuUU2hsd==fZ+SV=TC;a4Yai1 z(n>D=)B+H(seUzNEx*wyBKo67Vt8O;Vj|P5?fnxa4O?5*dJ_p~Vo+$u_SS&s8`xDrl3UrGuTKM3{u=BfIHU1qAF0W{Q$BSIWjQ4N&0K!COX3kT)w-J>oQ3-nrNpEs@?+jkD2#=2v{I-Ia zg?$+qYMjXXp+6f#qU1x80RK7(J0*6_t`S=&Bx(MH+70NHTI~mYSFO`S)T$VK|w3|`@X{w_u6~pt2#J5q~5xf*yyNImKLqwN6p3fG;_?UfMqp8`#okH)^#MFxQaLK zLR58GpOE0x&F2uEN@OdkD@tMwXg^9jr%Xa(2f)|Dd=8D-;j)~t`SojII zNA3NKi-gK5No@~D^(UPz86Kv1Q(XC>vw*j{>0%+5E{ZA^`g$|-wg=4?w{%=WJfNAJ z?a-*|L{L5cq^&Cpiu+}2YQO)(!4jm=LPf&zV&k?e*p6I3SxIor#&u{iNb2H*&u*vl zA}WRo&SV< zd?Zkv><$J75+LAJ>vlq~RcnjnZMwm_^dkLLpq8=kC%YV?xf{v_m)fzLjCPsM@wB#-XW};3TOC}i@{XphY#V5Or%7oKOpow zhd5lF??nt~3>HUpK{3nME?ejT=$9GBERg3Ls6R*g#LM~B%Cz%_;_d@7aXpy$#lW(S zWMZ^mox_JnF;-MTM1!ThpPeXDv+uBAa)UQJIS4$Q$?WFlmM*%1*CY6qswa;GqL%!p zpu@)y<$f;=U#QZ?MxplY2;+y4kO1Q36ih-YFy=6aDQRYyA-q@-Blli17%mvO39vCH zYmH;1JsnT(T&!)RwDk1!Ji@s?9lWqR-0@pjOhLfAAI)ifTUdYxzqmTeiF>L-KriQd zcOEt)j3&*dQR%Y;9Kjc+n38?doW49>pprITb^9Uy7nu@^LP#%$WICYxh2bp?RjK_xhy^Xvly!-lWT(gTOZYO~&_OXx~M@xC!Eo0?Mm0qWd237;Ubu@4?_89m;e zZ$eLwzshf~r%JeBJl&mo*6mNo70nTc#}?1e&*(3Lj{D%2f8fr|w-bphhsDl|l{0NX zxyRGXE6unkTIAz@-FhYOY(`6}M)=!}>)Wo~MD4`caLbOH+_SS%L_X?J11 zFPLccg)_+5i&mQ>riNYz*u&40W(XQstEZC#|HJjWEFRk{Fx0u*?N)g3Tpww+DMy&t znu`Ugk>*XmVe+Sf7}qZf{kjH`Wc#yqwC(7ZyngTJk!ZrAzXIh^jLhtxy+g+V*1`mq zJ$6569IBU6_His<6#O!3x=pw5LfJfF`DYaMuZ_BpaI(=mz}Fsr5kwdsZhN;_yMdm_ zdN37 zj{t<+R{y|70FNCOdnKZFxWn;zw-8ZEr6rgGh((NgD=J2ek{4&|p3aE0XSaR*D&hG< z+l4;)9qbzKg=VtPOL#jZE+seh$I7AXAbOw6IG1TTuj=rl?u~}YH;If=WOhz(=m7HZ zC@}i=;cSvfUP|w5lLvn+FN{p*+xGc{AUD8~*l8v84i;=Y^+5L)FIY~ z?$?~~lX=%(du~JGA}&Z3Y*`kvg?_NoMpNvMSY>sKbocza4CL4Z-#5IY%rwy z)%j~45Imp8o%2}5ZCIVbo5WOlYEo|dc%_~Z}n4mPI&3tSs24y-;2i&HbW8>I4%Dn>q#+tLpWj|y~2?OIz8Tp9wf z^GFU`M9c@MY^0j20wM87EH;t9O5T1%HZyk?^A8pmpDV3D3&d-CC;gsKf5C0V_${jI zT)orM4u_a8r13I2_aZQ59T~vFD?F(soWW1x}dXAy* zoiq{Hy;9VR4M%t#@g~Yo$SbUG-6U39k6{jG`IZT~Rc#Cm9ScOHD$<_oXb(iXj4eBl z=Hk-;&=l-lNQoFi!X5JM8-=j**9wki`s1{z%QFjAzu;i3)X$XH^$zllFZdY%_A?R} z7uR9{v950>_l6|jD!+5DSy>oxCTFTJ1xxCQ;ZC)hsUFr@n731z6J{KHV)rwA`^|0@ zI57q>-O2iUhPb7$znrKU&A-=`>^dKMPya~L4^w}xweN5xK7}aiL~XB|f<(wfH&!ZWz?3W<{LH+#{EZL9CM#z-qC0i=} zi|`-^hRn@EPhi^vQ8l$A>tv@}LdmC$fy~33LZDjJvBWsCoZHQe1<@_$jjBcPdmE+i z94ar=4$rCyh6Nr@#f&U2OD4T_=7APDZMO85pOhN+sIZe-f_3XPj!UfXzSZC8>XLtv zXLh+gLuC@zM>5TL=V=_m8GF-aZc_C+2La_>U0aJ|vq}7MlPe+W`6w}hxjdv6@>NH| zjP>TI!~XV~hzjCHrsSi__fQI2Bla5}4X#U|XG`z7A z-n6vc_P?^lZ;boeEEA|QSgq`UANbT`N+7a5)?&GM<+OXEXv1bgWh=!UEs2tVh zoyoQprFWbYXRYM%6HbajwOx;Fl-#*aw`S!(LW?(yKkt9K<8i6E{Y;V)5`882_P14* z`vK*9$oO@bZVkW}Vz<6>;I_@;X9nSs56fxsYPN*FD-cwb+y}I2r?Nf}qZ%U@S8p`$ zf^{p^q79fs$vGt?tW67YqQ1^IT|WY?zI^-LuEL~`FVs(j?+A%O;N81-FT7jVNWOo1 zfDMPA%U$&K^aVfY(G0GlxnDky*Bg$bG%!Qeq+okGH;M#+mbw->L6l2|4x z0xVfmZJha4`NegQs^7KcoQk1Yb%6tmTo;$lwb$@ipo_^y^$_Pi4H1@4o4m;8UFVX1 zM6K$W?pe|pB;}my4bfINg^mm67uS=$X(GON`T8{=6)bNbc9)Ql_G-2+az0>cRhn?= zqy)~8btFwD6-G(u=JB}VOe9fGdMUl@oK!PH2jcBz@@kj{&+CEj&YvCm8mY=8=D5vc}G zu0922@zvM{KbB2=QC;n5a~Srq@`MQs?~7W7^G{wcw+S7ULP*^|x*W{ocU1#b*INv? zCpEIm*D3m{(evy5yS7#eqG1(I3TfMFbb=pJ%JbTTHWC zdCdMa52v6|a{bzm*4VmpI;MoQgLz2gCK@#H>|nl$m3f1+WOoeRB@6Iec}yvZiI2{x zX=rY|ZCdnbo`zA*WnBQG8$qX4JN%eaHO(dACAtuHBg3V2xh7@a6`m}wx-q0IN6L-D zqrgZE*IGcil=$s`lMYq(0pJ={I|7`j`e|mfjx!InQ&!G16w6nWmdj!A;JlO|5hCeu zmV&iUvRApM#+{E|Pf0ZjpZJ&CRDP^di|eo<5+-sK_-QmB#Cae3h)uh>!a{2F`p{kz zYm3aqX`XUI%=c0brwaz2X<4d%`0zomTW?Nc5>R%MSwCxPYFe7Z6RVmGQPmw{IR?Qu zHtwGoq~Bavj44*LD;Gr18$^#`_8H|WzII`a)#@ztJsQmN0J94@v82>`L5sb)xcIKx zH?CZsC5|5MRg%!FV0{kj(A-U#KG`t4Z1R9Uv$QPaQ5l5ZY(_lG^#0z_@ob|%DGg9* z85RTRS^684u(DKMWXjb~fJ8#~09DwC!A{}P#AC)6jy4nXw|_tB{mnUm08pi5ncV&H z$*xG|n$~(cjwURSBCB`vc2ZzQ4qjVg$cfyS6Yu0T$jkT8A=d=mOkMTmE&X}V)P~?d zJH_b|WEAG>iz4J4AKc$gl1)(TW4Ej+k&$oe)YxY<10)Z-Oc4S48C1TTeA;@wwSoEz z&0gsoz@0t!%RdjM$yFY5H(NlhyPyq9Vs2X2*2R-n^E@v*?R`r+V>+f-R#uTI0gPeI zAkGRHWeLsMMzQCgNH`x{puEfKf%{C%U$saG>Mp42s=P^m_`}hD(XDl@+w6L_^8Bk0 zQauLV&bW zq&(zqIo;AGXA|hSKS`L$#A>8I%Airn2uNaH4h?2X6XK_MDTA2ACCnc=nolT|WtWyd zZoe2WH`J_j%`-^upz?abIj@n~v@uXCrrEv0IRXR3{*;E;E!#b3_^cke0i_kCRx{4h zzzJ}sQ3R3;0ipa$yBmmHLX91Me2p1kvA)+O16@P%W}N*ioz1|;1f_l`4sBZMjjQ-S zbJcLa`S*lV1zuEcoRg*zCa_c%O2e(AQ%Qzq*e6*B_+$?ncH2{l#OXIo7b??4;gOLn zSc=I&Om&j56S8%)_jM=*n%t66(6YgtuubrK-;*wl7F`|B=U)UpS4+dI?p9KQCvzh3 zuqTTI9$DMdKR}08q#3~+50PKIfj@-*WTJ+b}GU?o(fhpqn~0~vo)T4?W?1e>QFGS-~pA3*a+rmCMf4ktF63;OC?5QT%ZdP^SnF=!~WQNed&=l%lqPS z1tBppAfI*g;e}+tK^O@B@O+~Wq1@Sj*Zpk!ZA+Oi1n=gc!A9aWq&JDd=pLW-&Ffvr z&2aGDX~q}3D|MPTGnR)(NBDLC`~D=S`lj_+Jyc3pS2xe2!TBJf+KdaaJyuYNaEBsq z?#v4ms@1)eVAD7ZZjGhjN+p&}x+;8uSU_ZBsbf9aISTY51z8tvPER1NrT?ptxA@pY zg$8r-_a|Wn3bP6i2Av*%`4a7u&` zZ_YFB3T>`eJCW{KZv{GUkvb%04ji}r3euvc z=d31tjrWd^Pcoq~?p$;p8u8x8rAlB(+&QhRn|=A0(Pl5h4|iVRrPU}rmG-$ufXtLR2p1-EIT@|okUkdaGW8PO@7>+q?e$0z zaqDz(ISe&1cVtNNLK2rrt!F)vKQfF$s7xSsFDy*-(XonGT z!QssoOgx72*0i@)YqTIY_eFX}28D7-&8{g379?^r=&z)sQ|v)1Y`M_YE@O~n5%V)*_~=oy*k}zTbgzlk9r1NS0Gm4#|byo2%m{X zYBArS;wnxCsX`H_BbW9wiJE=IFw^;K6Cp2{d)@A^%$a9i`!22tD%;U0;yOcinBDS2 zaB$?icPKE?0&L{lwy({l$9{OLCcbM*%6q?xN1&+a_*xrO}e zM>1^-#VL*e@q$gE+kR5K(g2r0N|MV9`1w{aj#*lE_XJt=2h8CVQI~ORDypM0W{eqQ>XF#_`M10n9?~+qw6|ZQnG>U-$hb+ySh3D>GU2F6jO`GI59VG zTG;$`f~tzjcI!E+t|wbZu*|H-!-Vls$6eL_Mp-5I)9}SbJ*J_3*Z$7QhbdrXVVs6O zc6UC98F#Owm>7;oj`*eAm;OEM5Z8~ND1@KiR0jJ`Saei3tu#{Opk7_~c)2Xl2T2EA z&26T5Ri~=&H}YK_?|nu6e3z^3>4ELSU8?w1GI` zG8|139y(s{_;@{md%?z@PL+GrSn=juW+#I(o~T0kr|pdA*w{5p7F?Sg_okH-B-1s3 za`7pe3d#pw&S$V1CYT4zRBBEX1T97nF;S=elL_5%%@x-MLu7YS@}c#MxlWcbO#5W6 zTrw;@#;wyFWNI^BW6rC)_-DuKbgB(2V7SKh28#Ph?50N>%JkRk8hzTV`#-09Q5`ur zrkLQ&d`nVP7hc7`U@@wn;(p9v0#ns>fVs`+vTHDJuXU%J;Jd=JCbZvv&GH(nm_S^G zsglk;zxuwHt|O-%Zx3e;Tib?5Tk-OG@jyDaWO3xIDmbs}j^Q4=X&$GGjY9KbU=x^G z{r6Mf`d^;lUr)(w;y&{g19(l(fO)8yIzK)5({KN1*{?PNPrlK_i@5F#>%!+&G3-eVFSqgt z79+^69Hr12??70#i>pe@@TO zY2PQj=vhFlHGen5_*<()G<=x$MXyc=1^@Qezct#ong$r0qD1NMzCS(RpS|<%W4Snl zjI#N^zqo~aQ}k38zWLE3Q>x}36BCFU;&F{fIn=XR%2;RqRr&KQow^^gf3Mh{;1{M6 zFIaRO!_p=4?a1q%M49zX3hhScG|vjRxDA(hN}8Yj{=GTBez&;xqhY5g&)-XKiU!{a zIsQQDj2#r7vT);YbaYgNOIVSxn6$@~kcV>FIQgg4`DE)JyU1GgZT7k#k zWF!AJHh&pd-*v)=;tQVDR{3iz9lH8x8z&z_U#RqZ=Lu=&g>fPzo+OYK?CE{Sp`;y( z;B>ds#2B0jjS%_k#Qn7cJdj&RSL^)Ngi@RHyj|oS4pb1mZ0Y}d4*uvgk8Deg{#fqV zJnB>AHb=kX?&0%Strz(J*b90LTl6NJnO^*u&DV9NYkM&iQw>(tLjA8ud30#}zh>3$ zW)@D?O&2Sf*CcasSyeiQe!P#s^;S|*WS_y^4PVn#ogQ;id0e<5PBI6slz8`E#@MN9 zw{L!?aNrr$oN4U0=k0NGM`uNK(X@jgwc-bEdFsUkZXFJEUJE7#T(sOg#y*dnUwx_A z=#PUb>-bk4y+aEy8(CHD@ufvKg2!`w(%v0^jV}KM-jzo{N}gZkpz`t6eVMENs&ZP> zFm3IOmQ6_fd+<6nrP9-=s8vYr8H%7i zWPgllz8*Sx;pU24P4&4C>C$3!v_&DXBlWPCvK{Qv4Kfq`N5h~jh{(x)N@2H$i*$5d z%mOtM97$!(E~)+{f)cjYG6Xvw-YC(q;^vBmfpWCTAA5Z|lSJjDSaBS2!`kSo_7@JB zJ3T}7;wU}gW1bAvj@qCEZS#mPjGi34M1(Z!@VI{Vw{scls5a?g&LFk;Cx>E2jg(zm z@S5E_crR{tO!zy*}p+V5z%%zrKGN$H-UwP8-rfr z(P>UayJGmLvI;+uLnNZ)0DQiy?p1)Pwcs)4b)R=GM#P>~^-I7}x#bii_jp}EU35ZH zHdWn~l!-08cZz#j7CFm)|3-<|$~t8RAP2F(REcSo5BDs8*4 z2&Z~JzmxVX$%QbC8zKnVgG{^V z*@GQGQ6O~{R>8|aM~5h?4DH!gzkl+UY%D-j%Qr6-MiKR4KVlhB#jR+!b5<)!TYrDn zz};I}zavWXra@UpGxXkS=K|->zc_;Z*lYw1*5)vmCNSgHA=%YC5R^aK2 z$i8XX+uIsCVtdLk3VbFMJUiACW zxv>))@)lnhi5GpqVldObj@{dPC2@3d2Dlz*Dgtjy%VwFcekMveH5bTQ}LiWIod|qH9H7PGf zhL>TQs2j>lQY`B-XIthjI8n}j+W!BtW&HS<>We%JTsBh0>`(Uidm`nU9n@^wflJelWT0z@wwI16!gaY$?8Ldcu?4ux%J+BRYM#l zNH5W|{>nl0;D9)_#NpWDb{Er8mCF>~o-mNgHq$Zj4ZZc5w-<8l0d|IaJ4o)z(f8)$ zJ_%o#zDi`G@Dx^4u~Mk7yM3DAY-6bax}rbj+o51#e>_qh)Sdql0~0$RYKIcaj@il9 z&!2FzGg#U|5-U6!X$!ryu|ybVtn^Y+_KNCdvk|%lNZlFK^b7xMJocCHEEN?cc6lDj z-g`;0sd5BwfI>B{bkVlLq$E?v-QB2UI&ZD!V8O&14+E2Pq%STvx0oj(Ea)TO2mp-p zj^M~83WJN&loPaUHX^)mruiS0p6?@$KicP9zey^#tuNx`uN=K};rqVmBknL#7Aa{m z&84WMV-iOf@^_>7a~#0-5b!Cu;T5>1(om{oUV#1vY8-gnr1EN>T6%X_TS%&X`?7iN zbzc)d)uev*fF?=<2)0kFULdzOPaa%y5!FW#1LEqKcx2i~YO%i#Ek{0*sTE^^2~1U-nGWV(4Eo zTfn|PH8*81rFdm4-qZU=&tvxLn9T{Ebe7S0{G~2Wrh^?As3A_)VJ;cc|6*o;nnDe6 zU>)9GU4Bhx55IBqk|}p)@OocNpcc16; zbkaqaNqt_BZx@VWf10V>S>yVKpyPF%@a#|{oIQrlCN)jS7JPeOIK43h-I|yG>TjNsXRTc38yDnHKRG5l#7=q#2XmxH z{tIQz%zhv0w!v*$M#_viBua|=#{7vaQrafb#v8^7Tk9|0sHn#Ep}NH=}T(Zl-oANP5rAK6KGg@c7(vo8`a(v+9r^=W)o)S7*M z{!>3z*LhU1Gusl96T`??C|+tV&2b zf-!xZCl=Kuydze0Wq{XmV1(*=r8ri)zG>;yd1iDo7_@#)N7l?e(ib6+7-PuianRdP zbY);&DqVX5bV1vudf73GoGG_1Sd8)U3+skWlL9Zw=56l+5t4uG2?-J;TJRH;!Wg!X zO(LjQId!Bwqmr<7TdMpKo3T$a$ZNe)-8wE7a*nk{I->0U4SJ90QIf~hp1scX!I%4s zc!yZ`z#wqNRag1dfe*xX)iF+JnI>;|e_dsdL`G*w@dtqMyt=P&LG!BY^wl=4e(Mqe z2`Qa?znc&v z^AU2_HJbN>8U`TBD>$8=g_oj2JDg4HKFPP&21F65x@rUj4`zLu^8PV2>7!npArGkz z;KS1p>A2pltN47<_62Hgx#N8S5o{2d!45Cn~LO#@Fz2 z`QE+0Cvd5h`I#nA>E9?^AM#n|65spn7Tkcm%8A2ls|$k-};$ZgmUqZo+!)Rd5! zyDKp#3@=p{y}n6Ld!1!y#E_ROLPyfT&vTu$g0roL^=6xtgf`=~l(d9vW}>Le^U(Y2 z?sJ7m#mQjRSSct8eG`Fua9CIgd9Uar7Uyvtp5>PfyTSi*mEzA(v|#YfZ8**rt<(Pz z9r$M789jscRKoMzBT=RB)Oh>uK~>26V!9@4lt&Blg6o5?Pfkk`>KjxKVmyvx#f%&I z@c>NkpnGy+e~NLt{U7JJh^6Hov}k8w=%2Q1z;8|m0V$}neL4yKKP9UG4!DDPH`PWP z9QqI2!jF*{d<7&*HIamUkN<~8XsG(!^4hs_aQr8O1uz!pADBf_qS^aD(Aq!mlfUQK zgY^J3pgEC}@fXDGzx_oeA>h^aRwcM)|A$756CGO2wf(uhwdWBF(&BpI&pxbN1{x26 zlU-^yDOs`W8*bgi7?wb1E1r|;pk`VI znRFEpBhQ=u6c9($n(^nzDw*>_#C$cg+kc-Ivv+_oJl9hs`osC8T482}#GCV$CeCSQ zonCMjlvkF$rYjqGSW)=UBSqQA`(w{sik?e2 zZH`)%K1r(l_K&Mt6_;GSL)&h7b*JKU*ViZE1wJbIf6)8zkwAa-W>MioZ-o|dD(%-#9GVS7ypmrL=Zwsw5v<1FLR)|YJ(UhaCV~qT)t+0E$ zK3Homtr_g`epgmEe~uHPk}wW`H`bg-`(1NQl-iIi5mX}AmjX5`$&Et>=G1hoos-+T zvODsK+;_&hZk}1d=G1bu6QApGRSl5qn}83_9o!A3el6*rPn17SohTicH}Cv0TH+QM zMsJ^-MiA>-P>MCaPK;9t5~HQpSi^FtC^}|#kY(xV>9@bQxx%)(-t9nG?i1d-Z=5Yk z&1uw)U0|J9To^77Kl-9Pg%c)5OM#4h%7yR|--_VV!rd)xE^ReO=PIHZq!panvg`On zLO0{Q=Txt4rH3%e5u0D!s64U!J8&0<|4{sZGsiFVml0KFi`%v8Z#_uRbEa;dxaB|! z&78m8Yab<0X_x^FVYL@TfddQYfH4S$E@R}Fc!7@gv83;0cF+0L$M2m^o=Vf?mfjW2 zzky$7z?ZhqT{_SI&R_!Rd<4K}an8%wJ(%-mPx5sByJx8Z?Ae8k4u|^Z@ZE8(Xld2f zEJQwK@_(OzbhT+Mt@3Q9!Y&GEg+T-K^H7WyOIk$IUbP_e<}9x?`CQOJuC+rYWA<&Gg?yQwtAFqP~RO; zv2SH-tFyO3ygEHs`@L+g?EI(d7QiT)%<=tX66q!ZCycQ-aR5BFM}J-FZ-!RH8eUGdY-j^1L9hDm z{7wpATSQC!!8i!KpLlUGjy9``IPek#?-weAEV-kIvZ^IlMI{zbN}7qzUT%`IWM!?{ zmlrlFiW&lTXEEB9&GmY1%Mm0qmpYsgu!)1(cXgf~z}G3x@=I?d z((3xSmMrjRRo0}=O*O3VBYaxWP&dY28B2~2U_i03%gqaz;tpRW?aUTQBnUn%cTlZ( z^+t<$s(hD)+a}=-W^j0SIl+v)Wf{cfy3X-{pTrOF7=!*&O{gm z=eHPPkpelVpkVdQmR&^!=Z|#mCZc3A@sZZBq~(IHy)3&Jjjoe-`F#HG}eh zZ9zT&62^Zki22tL?MW?~jazT=8hvU*I?$*X)pxUl>z5_2ijKv=})tn1(s| z=9j$tF~^dw(iE#)np_U}-;DOyyCLL36}{bY`7g^FXS^p@dyF?Td%ksabO86S_ns>U zXCXdx4L|X4t}FZ0uxvsid_tcmrkpMZK43sR*5E~%9w?GIzv=Dko zAmP58z1`b=zO%=@fA1LifiPTo-?`SB?Rn;$f2)Kl&Cm?37wd_(oVk_XHee0n{D=KC zIc72XOTsRSIWM=0KSpU}XbZagXR)5$#TmQTww>;VNPD-qrMZ5sB)B85E`23^=~aEP zAM@GkgnR+YModtpCVK;woS=Mqlgx zB_N8EsqCNJx324y51S66@Bnh_RbQ_TC`s?UGrLOv`yEdmf9Q!j_WIUui~Rlm|MkWI>`_E14m7@gw{GP4u!aod(!`09};jR z{NBb>!eTsSoVQ5N6J~ARbLZBRIfHlK?h(d9Y~Q_$bV^#g?Gu$a1}lpPcuCM*!N$3# z+yVkg{&IW9o0}0OHL>@O_I#Zw^s6J7LqI^8hlj_eIrV(zz}>)pp5x31Sj7D*brodW zJp#d*lQZ?nZ`K~bb`LcAI<#+~RQ_{rzQms#v{>-v&yey>*k7x&m<+&!0jAMo3j^7w zEA2;adJh4CB6H8C0V^#@G2cWKOPM#Fo4_lWG2!uOD)<0B}WNiYY3Ih zkZBHXE-6QYm~%(_@!bCO!*mI)`X9|p88;Ph447Pwzzu-lB1$X#Wc75N4N*i`JA3}* z9>H1CIr@(X?P)F(`d2T2Kjo@P4+LpG(z_4-JnD?0Pq8$F;$@z;&Ix|T+O@dNO})UV zvWkqkc3wNxr-}`kh-sqpd@UlR+s?hGBR_Y$SK1dyT?Wjf-Niwt+%tU}1I~%QChxO` zxGj{YdR9b!e*7U5vDCsihdT`Fno$1NT*(*dlR;_yUAaHXG{>UAf8MjKDC&m2_Owl8 z8g5CCc>QaD=-kAM+0D(Bt+~%)N^sNT$B*aQ<5M3uT26gDq&{<|4`i4vd!nf>Sxe_) zw%xTy8jg-B0M?SozxOnjNzUs52gmJvn4iC0Rp##8;YLPZd=CxypY)Ai7d&+Mg2N#5 z_Rvs4wS3`zM-}&_`KSQa8s!klU&)7O6$*yK6iYt$G%rZqy?d{cX6R&knzbtZIffgK zjwE&&8T0N;N#55=N|kolK*@BoscnxUaGEy}-)KN-|jt2q478R;X>Bbrwjd#CCldoTOt$sihHe&4=BQ0$^P_+wH|z zQ^r^%xxfa~ZBc1Qx;lzcDm4PVp2m>W? zTROOJY$i9VYZw?G-&KXh(Ny0Ae@~KX?M*;iEl^lIER4Vm;xI7#o<;icqJ=l-)e~>t zr&2R^_z)}ytK98~n}=qw6jhLm!8?}xyu1L%a6F@i@$$8-M$R|O<1iYQxb*J(8S`lY+^S zcj23ak%S&vBe_Gf{R2k3lHXj^b+J%o%0+}#g>Jrugwp=(eN<2Kj@U`!A9=H5$NAYV zTriw`! zZMuB3t}@j-AoYdI=_HZDOTzd%cO+=1)zw<(Ylun&(Rw#Z-bGbi-ABJUr#%uExh&02 zef+ctLczr+cfxywnU0Cc#{UybTbq#GHkV1AQ*}_|vpUr761_!X&y1(#cz+`(?i{nw zXt9=h42zKGx03588XAwr1%a`hC{|R26Zo7$B5U4&+CUpuh82Y)^B>vF##w)4YO) zGU1bm;?mukbJyPU0Lp&n39Gc>-1dxy@5Q>fnx3#j~jr(iULjx%RyJXY*CDg7_6DhomYTVl= zw7sOAw5P%hWu)=k$X%-!NooQUf2OCEiB=k}FqK+Xh@D4lR8BY~FgRP+2Xsi4<$}S^ zh@=cj@3P7KTWoAAr30x~_z=9N!C@|4a-J?Hk@a6t{@tQ4w``Fa>-&|J+YxcmOtL(f z9%wII)!6t$li#j9tLw{)>GFXhMu+E0}~^Xj0z? z2X5MgAI*|;mlOFxyd_~Us((1-Je*?Dbvfe|dRQ+3Joe#MFfHWxa#H;O@%!$ZAG? zPJJ;$zAOS5fUZRH)ZuqZ-Se0GU=`m-E*H4)?4aV*4{hoh=nb&CuJ{-PJUCHCcSzb~ zgdVtukUsDEF5ckON>4z@999mA`P&ax^|w5giJ1J!xUwfuJ%Bq!b@Ey>ORXXL;*h^m zbs;XA56B!J9A6gZp9_OXU%3{tk`aTYk+OMQytnWBiPv9$y}#qICN+-S1Yc0i_A>(M z>*qeaCOnZ&o*2ddXp673Zq*_L_WA3Y>pERdTLDb`eZZKj#fgFIQ{$vCg(Or@Eh?z= zBqin2e&H0+*}aML2)7-76s{qd${rhg(a@I1yX#7_YC*JU%p*yU^{fW+@V=pMzBaR9 z{B5n?f(`_Exnq8oU}fs+&jItoD(eVZ-)$-0JWoPRFXIGfN7u}u)I9IB)8C6@8hMpk zH9GT$2=K>yj{)sewuk%KDKvgv;_>sKI)|bZaXP?zqa%NB=5V^rG~S#z3$2;hAXj7c zKyA=gJ1ztl_S-${1tt}1BVoZpB~5qSqVTsqx%1r4yz(JsLFBsqt(?1%!%{Grag*gE z&0jb2*zruRM z7Dt@b+J1G4)N?5$q{xJx4DeJ-Uu?a5XkmW$FeIX6+kB^IqS4GEhYqPemB?5Wd_Z%(PB{Bp_xf-cw&Z28z$je8O_y;)^x>VagpOpJ`gA zTfQtu9}?J;U~(PoP?KV9+)A#R(Dp_z?j3o94 za*%(8Pb|FafUoHq+f)RHQqeq&?;6KToNM^pAFc%i^!mkcPG){HzttqhvhuOG_wT0) z)uD-4Sr6lG$FCQxSXse=n9!oe(##$tCx;FdZ87-4b7|>f@>|@R5=v6rV-i(d753aa zw7*}-+uGFB>E-c_1sbt%+YY0#gtz1gLOcftQDmdrj__%`EqhAUGBia`Z+=`LryBE_ zv4a?id<@Ys90~L=wesG|?=tHIRM2=0Gg1jaC}&=kRd`9%)@axGnhD{G5QyQta`#@G zlm8wx3x0Q?drr+7D{yQPjaXp7EYC!(rkg_tW}|1#L>F)9q4!6=3b5$e5Kd<-EDvrP zEM;d}mnB_f6Zn+&#CmTX3Be7mh>04Brw*2J9vswd5-@9I@%b%uT2Dy)q{!-TAjxya zlc|@pj9LvsJPblQjf@nv)9+XU#ek?@=F~s4s{q~gF~hde*M%az+iET@k=sisGnRlU zEy6fZO6OY$4&+F~&SRu$>kI8KhP{5HzD_&9l_nja@O1i{lGj*X@}g{==diEWbcLd8 z;Plh*-psU;{5OUXXSJR!;{}GqclM5FN|r--$YBZ*XI+p<+#}}T*TJ2Wje%|MAv?l4 z^t@Pf$fFw99-lyac#f7-pmKe&zd8Jbg={NoESrVHYbbK5Uqd?hIbth>l_))$^uD*t z#cx&_bI%VJr<85q!(!*wxu}zExx*hGj*_{pa3pInH>4qJP7{imEE%>{rGnOv2n>oi z+hR8P5iMF1Pml&-1op>nPIv~1UND+OoPXgon>d&wI%u!$Q=mo1aFwS8^EUP3M{E5A zxj>Z|P6yYk+Is}=`K=xlNxVA^8&HJXLYwsy!9K^Y(JXzqKpT9cDs{`+j(Raa4sO{ zr1JhX9=)%78?!CTsJG!ud;qsBt=1)RZ_kZxpsuEKbfF!&`Sh$2@`)ATo6Az{l+r+{#wpk^-puX zt{WO7PcUaWT>2h}8}h-fo$G~2`%mg`^yP>9*9=y7jmhzwlx3EuH$91en0ZGF@PTgy z2a~-v=gyeac~uuWu7_;RX>YF;rW`XqGV2-?JCOutB&81E0uHP_#c_KgI~iLFo}99> z0%l>ofB%?(OOD|8clJPTZf#8vybbqJBA}!cqk&GSg1M(!kx4$CudLR6*_oW84oU3H z3F`n%BdyIy<_YCt-r-5|euo8FBdN6a#P)Ko=HQD>R`BlYU@~!MrJ!7+qrF7nY#(*? zVcmZO7}fNwow#IA?w_$}lT77o;Zu4^MRVuG_K8!uOJMGSZmau(M2EI+(6=6lGbE%M zl92@It9j$=3IhtD-0Kin45AoUib3}obN?1yW^o*Wl&^$Ze<3IqU%Zf=>mK{|7vSIY zpI$s&48>+m-7umVxV3+kS@7=RC)WUl5N!15F;}8hH83Km)9ca^;YER70=y7eNDY3_ zSj8bGr7O@lcZ;-fi$`7;B**y7?p6ODbWA?y~XL zn5}_BEVp2}Yq>rCS(}v4kEhP4w#rH*b<(YG-N8RbS5JT7G&>W_Q1U@fz$O}q zVp(y?orrI24Y=%!u&t#Tf?dV`FJ2ByWXt_x2TvR<2VXWyv~ zJP5m(zzBGN0j<>rc~?92^#`f!!C>h@kd6BxX_(q$e}&ur=%w(x;ncqO^`(=1h=D>u8HWLA zq1IOVCNk&V+6V85x{h~Oh9PJ(|G~+x!5hu=YBt7&CPrWyGze2l=X6)LsjlzV$K%pT zkZF1FDuvqWaC7z>2l~?|+a}D)lGE%gTn);EG?Isc^AEQxSjVu?<#Vj*w`tKK1u`Bz z=83K~9MaOQF8k4v;>IKaA@NamzSgxU1Y%;|$^dK{4Gi#+S_Us}y&TBbG;{e;0xM%e zGvlmQCf^pS45iDOU3$L;N#(iJ65Y#kLg%pgdJXoObueM`iXVzh-cR(i?J}5(`oj_2 z+RCYb9M)hes(TQwAwPdJpHoH0MQKlL4Nms`f-=^nLMa>_vn_r3msW(Y?*vWPBP%C% zo4?^6kZ#Hd2`Oev`^FVy9uy@cCPyH|4BVz@d)$n6jLJ=*hZ_@KR@$mi`ANRnl>Qzz{mafw+`|>wzX|?BX-?T54~td*U6Ec#e;FjweKsxJzlCmi!24PXD&j-2aGFWX684*JBS!UB0MWpe)+yZhK zb3o-Cti&zfDuCoFnVROjFchrpAtxwrW%+E$*W1h@Jfu-hdr--|Wd?)coSuFHltHZ4 zc~^q>X{=#GL@ZwZ(hh?=Uof+j>Vs#W8MyT4c^)HxiJ3X-u#zEr0<~b13!dxP?Bn3z zXk6~@0@}*SWo^@{BCzpZUU`fITJU=1XRjdt#t{Dfy4zq_(8kaR@wHIWJP&r(y7T;F zc%JKAts4|<(=5g*U*09E>rVcU$H)v})g&F%$|jcvkX`o`S$>0gw67eMk2Vl#+yp96 zfs0Gb(#{3kBI0qsZ1&0PH|`XMu!hIriqUmN#mR|@ZQT|i4vd54iCsVK#NOTu4B)Si z!{5E@$9<9UVmA^J8zFxkl~r-fG>oHzt3xumi4Tt%7#Mi%t?P_6$if0>7N$#!TW=T6 zCu_^EOv~nhPCt9|Je4YV{Yx+%<0a^+>Y=RsBuA5xZMzK#4%BcEaG;8{~&xQA1F=S_o+i7{#Vv<2HV?jg0;tJ~)sWYv3PP^6tc5 zcW6HDPA1uYs;&vqi@|l{%b)bIjQDqD@B^HI!_5);ywACV&evq-G37;&5X~h79B?D! zSGzFiYbSnr+(!bu&h}^oEjU0dSk}D4B>Q-XU2nq7^ZkDy7vRtSr(IBWDuYnbWB_#7 zndC;MlAtT2W0G~*mO!fIxq>z2;MV+52E0sQ+3f(=WHqp8M}xWgHn7fmtb$i#5X#+= zNs`RAoc#O@m}dPQUQJ314DxRZIUliGLo>*t^yDOFXqLT!TcW%>vEbl9bZ4uFndH8V zL2PdAZk4xu`HiZmpmF+6GgyPm``mAdslOqK&ZcP|?^nErWnu&D$gpD=1UTJZ`EQEf zR6PKT!`)P=|FGu2V}J_q%O8BP=a%S3fTmcFp8K6@G*z!|Wen)Zd5xS`^PbI;Jaqe! z%l+54hWfDqR4G)t6VGasdoGNA_Kf#gW8&wz1Bv%G zHY^>VV_?pqKTqeevjy2g->~EPd)*t4IRH@g-OK;rQGY#OFZpB=AI78)iz^X+dUAqo zeP?EV&GD_FsnVCBo{;VkXu259-){q;W=)opA@wnT{r`UhPXWlw=yVlSdeK^1CEO~E z#*j1rKtC~^j~~Y4ZFIXAZIvypG%D&3l<}5D9{&{Jmwzx6y(YF8*Tp zRTQt0xp%xpo%C6j;B~jUt>|%VYT$Aax?N=p@rk$Ke=hNx+5pzh!k(>y9&5}QFn(6j zt5ac;zxDzWKv3$38fkBAZN=xPM7I}EH@Wm$;5j%oI{j2dEN=h>-C@$Q#8GXV=~}e( zg!0Yb5@Y}O@El19FvwUT1%&U4Sl#r3^s)>m?WBL0c?e3Bj-KA$2)EH1!ee5xKVKjp zqUeX6bgxBmJ)4j6f6zGSh0dsL&xw(9adE2IF%Zu0V9f+8yCZJSioBRQf*PxC=A@Nc zt+_~WaTV%xS@;jx5-G0&J#IGpp@)uxP5Qq%?EfN*3680ivNuRmX<9iC#P_L&yWN?x zdNyQE*7ni9?~%7+j0N{*7-6h0sm_Z4HB8Bx5SOb!|EuwbAoXnYmy1suET3&aG}nf) z-k6^g;|o8()5?y{iH%t-!J`I+6sF!&rg`&s|0bV^Dy4ed1k?AkAyr zA@%4^(J`*?f_E#w*8-D7yPtUON>p%(Twh&yB(9?oMU+E1|miI|9}0S zst)^J@mCv%Byyb;wA2!&d|Nv;cZ5OQEt1bF(bArjG_f}vG8rpbJDJVuHTU+S7A-S? z?V$}Hc|0uEg7_KZmQ(1RXVbaPoH>)7NwT!G6bPeXj-!<)J`fVad3=uHNtg3&*j5Eb zWNr!t;J;JSte`+Dnylh36Z-aMH2!5d9@~^JZ3cfLBW`DBOQlw`68bFckg5&kQF&SG zuVSms&|b4cLbd=J5FQmv)70dp3rZq2flW3yS|M#U79i}h-oIbnU$1j(0jC-gdfNI1ITL77D^pXT;4c#7%(deK&PL^#atF2)lCyu=1};_WVGzQ5ghx! zc|HGlzZ!t};i`1~gSJ``xCRtRBvP#nc?|(w%6=wr$M2jd=H7F~twW@2-;Jf<<@bI* zWDL*EWoIiowGV@N=a!T_{Pyh|JAWyn$#wM8lg*8N_x2r_yZB0=;w_*%Ml_48lV6@$ zt(zU-U32mA@d?Elu83QO44vy{l@B&YIFqZy2A-z|C|CqdK~b8ls3N0?z9W<}GShkUr>!ENC|&^aR!0RNY|L7DKpHslhrhUNans ze*26PA%Po-%AOf3XRK9J0qn!lzEte{mkBsa6;yr&$v}7QnuC!R#s9m;Qw2(-*b)QV z$pl60){+&VC3XhgGP;1~4??suE~AfxOX)JClvPz#-&)o<4%k6ml@|b?^pcJsXNP+x zIiq1~*NkW=ifZJfT+HyP(`o+x=A76{2p**??3%K-J|M^k`#s?N$L0UaVuVUjn$z@Z zr`$2Ut#wTh=(6I=QuvWEgs=@eUy9_}$s}Ooi5auYQ%=_jBj`Yc0kQA>OQ3_Z1`)5F z`1!L0blKZI!*zjPz|R#(aq111#~ zfc!(>W|>eHL$y2byoT-lSDe#!Bt-r%VfoLT0aPLW#5NdoyDiq_%i5BMW5@9-#;1G)Lko2*^sb+e#}(F!~IqfR_2HJUyV5lQF+ zq8fv!Q!W5Kjk$?!xq7DJwdMA8gGo@UWo!Lebp4Y=mx(GhIG1%!(8m0&umN(~4fa3W zBZq?H%P+bd>9zW-wkCs({OoOO_0GKcw}L^5s}8!)Em5N7{D(1>^kUdwa$UNagzFZAU`a03s1BM`8pk03Gs$0tdNBc@KNiCE45&TV)3ub@V8y z$J&s4-%4NR-96guP%)1838M!2nkihedb-=5Mbwf&@RI;v8Xq*VyYnw5xmY0wNGWy) z04;ukmlF=i+C6aOsTi~sB@{yL(zBDdM?HgGzMOeyD>L;di_?0Rnj_!aon}tZD@;p#ole2>Am|0mQPh8ncLQn&gwD5(~3^bCh#gQ*n_djP(z-;A*H~ z@ujGVx43z4ZPe~m$Cp2S@c%a2p~|O4fFqq>Bc8PDfjO9>0MAE_Sl)fZM=P`Uwxny+ zX`%7v2GCh31=WB}VziliOTB%-jg472X|^^X@;5b-q#<;Z zC5unOBfF&MCTJ;^!!H3dlDsM>zn^CmlfpXs`c~Juu4f@1Hv)LRT~DTMO0@=t{_+Rg z9KmZg`B6VQ8Il>>s7eP0oKMVre{eg#XLUwbn)r(5IcBLJE>2%V}x? z`mTLR`qZ?+rRhiX8}vS7|&AD=4A z9pfh-fB3Aq)TJ2^<0-A$%7Y2701c~F>xQziCZ5$97z}$obg~r&gK=d$GLVy-f zBDBS@4nT{jPYre$18w-xZ>92c<_YwciPCNmsJkvbcZr#+>@ElgQb;OSuSJTovp=Z! z#|dc5ZBUa8baihPXc;)r-+r)cEyRP^B_g8Of5qdUE;_8B8C>6JT>Xa<_*)i*Mn^=9 zk@4$SWON@-f`);V`d2(LiP633z8`MV+HhsGBInvyLP-f<-7ax#LCiipjD=7!bel~g zWa(ya29Auw%RT% zESv}2IldTR@`ixL41l$lHxN^0@CO}s%)jo{Kisc>TrHrzl4kwOrZTF=C*xW7PS|4K zH3u4vl$h|w$da9*ZslF0JS3{^ZSE4`yd#=}$O54|M=w+k)yI}A&z{*_k# zyJpC8r3NBiQo$jqUa4mRNFymV{s+hV-{$4-lePZ(zZLlZmP4u)5ZP@pdY}A%TkvS< zA6UJKu&~$P|4uFRMxRvgP#^DeVBq-|FSFO@s5YRU8T1>C_g@cL?_-Ku^gZ+xo8CWS zQW?W6=N>X0%UIv4m78IHLMETk)}Jc%?>GMAr>qSiWMFh}Vfk&7sschU4%n$X*w}lg zryU^TI(;>|Wd77vzsveaVh#<@RZcAq7zy^NR81iu9k|22pjnkxmeV5fU)Dc5ZkC6T z@4J%(dq|pc#O(+>DY~xT-mBLmG@6-Y^Ygvx(uCwAU`)!~T$|I_dr$M|E19m(*altv zk9)h-8y*q;nmM(8diNkE)>?X=|F@cSP@{-B-|N4=bp>FYqHc-Z&gamSxO#l&?5o#r zKHz!^3kw5R^eFz`&(MX-pK&U(dG2VW3Y{^_%8UlQBYeh*u$RL(RtKB#y0m0>;ad8z z5inLQH#=L=uw<8ITxL@diQ?|l|9f!1+&`*&`Wc?Z_}h~|i~ADFJb72NmNTW=&WgOg zsudQ7hSw^Rw+kK;y4+6z)-h|3;QRjT%kMTFNkU;e+`stRzkh*)B}F++ua%7J3-;T$ zmld6dOA?t=_II`uh4a-OJ}kLR4-EXE=kwvYcJbnEadXh?Ch+%`u1d#Q} z@4j>clFI5D8n$DbxcNp}dXaIm7Ngq~mC?RClieWYOWUb0B9h(#)`+EV_`?(#6Ckn84)n}PN>Bg3Io%5RS%U?V3dpNJlvUa- z{JVxSF=HxHd&Ksp64K@-Z~3?(+pnadrNAAB{=69|smw^j*EVm}9QMQQ0kidN9te2> z*3j_Tc-PI+b%Fm9SVb%8M`jV-6#mf|Kl_yncm z_$5I#YKpkfe*Zn=Gc?r6%ga36-O{(xlEFo&yB4;?qI4gpnK^t{^_MP>XdXZDa(;D8 znD{|m`*Qf%dU__W1Li6{^KAAVRvQuPTDdA~*kyXA3V;#V>ppl{?a?glnOJX3xB8fx zZK6P(NjJhB&+7g0qysv6$Sa>%v^EkXeYTx^bI1L7{RK=p>*q?qT|_Y`qS!`k1zf1h7Xf$19S zvpWx$C4aA@tT9OANApVFJL2@l#_H&rnB0W><6^HkFC!cZ01^Qfy?BO*iPo{ofc(kd z)(1%BNxSaF939Lde#I1`b_bVQqkHAyuw7@&mc#e%f{kEq0lAw;xSgn|^jIz4>wIKVAE&K?XWO)m~{ohBK`HvZL{M!FN zuTrlTWrLW)VK2%5XS!tVVgYuv!g{lNAM&AK{auQ%O>b7Jynq1NEiWNKqDgwL3GN=h zQVusn<3_Ye!xL!c@RhPA{b2H550jXv$JDVDPl9bFkWi?@sL1;nW12v?B!KEeWc4}a zY^_7#2vn!_-t_9|5^w9OMU`5-_2~DC&-C*Rfm1P>OqI=|C03*WASpfA=So%xrZjoy zahO*rfdjh-vxE`-MUKYZ^3yeAi^A>7e(Er-E@GMbRgQ zsIc`X!k3cxD#B%LqU;tOJZ%r6knq4%l}x1l9614(age-EQgoLdv6*u=tj9qvsz zh0Ugk*)~KnSX{azNL;_v7W;96vwBf@xo!1*kb>s z37xfuEwM9aXlju80uwAk&)%<2!c-O-@kK*53qQ@hn>mDnjJsZ+Q{D%73AQso&TRH1 zTP0uOWIo(C9WuB_8Vn|Fqx7GXLqQAbwQd$scH6%A+y~fOs}!4fdaG(4_x3%(OgT;W zoRP0DH;HD^^7JJ%*|uek3p|Zn(wwb8L@LnTgej9|myr1BN3Sz$gv$T|{f?1{WT4vb z>{_a{S-JDvP`z`q#L@t~_Tj)JHQ@6mr4I_QKlz1;{i)v_(8rr5B@Q5Reh8qANzmS> z&IY?0KZ6h~>l3+N^5|1O{G@2BDzdadE5#*=zhstm%q~xvJyLpqNMJb{pCRq<*b``8 zULIwq|DMz}Vs)pIW@Pyt80cWKW_pD8hz+O0`JXSz$R^!p6a0eXTcOKV!dxAw{p zwj_lmtjb8C5{N8?;wtGogLDiGjzi5^S;qoElZ*fbx63?h)o-o1(fP^hhrZ1NtJ1?l zR}rBghtwg;tIK8kk>?q=t&63+F;XE`46dJk;Rv{kTryt0#W2#FnA&#eLzkd;24j<& z&OrUTg#2q0iqMY^}t zw)6_L2VPU#m0#g_M_<5Vp~=`;?fqG?TY+KjPO&F>bDsAd4Sp>x*m*?yWg2J z;6T5mmH;y9DkCGOOlpc)*xs`h@tf?vq|O9ApbSrOnQMn4SkeZrSJ17R^4e&BJFbP0 zHiMrHkLOI(yhtx-p)1zyo#rxDxzT*5QPkymw?v56!5f)?<;xq!=|QiP!$#ihimyf} zUN}ba&rhg*#B;(mrRyg6eKyMiV9Xm2veLPs8&%4BVZA6|Xq6cBooc(wU*4=#z-m&V zJw=bnmM&ad7cQlwY7qynSf>x&n@FK0nD~nkSG)5%Q-m)uEBuOVXqk|N&wFT@ygR&YAgB#lq|E6md} zEmJ1=VJt?Q2hU!2pE?2>;O-K2HN){M?cso!c!KcRoQzZ!*=IM*5ooralF5E%glX$Y zT;g`x*)kQ&ERBNbeiF#Pd1=f1>C1Z*?Xd$j7gxG9pU7M)D;b(gQF2$%>u|MjZWtUY z<`G*KvfXW0G$HKm4oO)fnluj3Qht-CLVae;>8p+~~@4*2{LXsIS@cw@87l zjGRwu5spfm)1CAm3lh@tcuRYQe}U7e%65Rm^ElFmJ@K`pxdfA^ZdsN~icnS1kW`8h zr99dtfmGy~sGSWLaz)mJ?P+VSV)-SwRNJBno-a&Y@W_v@-j26uW8P+^cwcSXm6My? z?q+<+9ls~{m<>FA5U@B{r%^e1<=dseY(~3pKZ>N1HRae}3Xx%qerhW@9s(#x-@| zK&hh|b@Sz~t^8|GWvowjY9I7}`6f^BI4SBp{GcyEI~TtyJeoh8_IjnxwAzVBd9UGX zT}k8|I516Hp=S@A)a4mxdRIf{(X_nT5-W;!cFudLkK zPj3~hlp{xc3ZZLj$;7{;e1Kwv+3^?{Rs;^jSJsj*3%!@)Q>#km1-hO z2E0B0B3(upr1P;qG4aE?Q)B5$qgll^uA%Ll?1AkVd*Nfx>9bb27pdpb$SN;n46@{w zJ-$ngps})F6!jrgtO?XXW-B>2>txo!+nSDF?>($C7A0}Ms|&PrG;JbB=odSk7~_YW zU^!U^RL(iu9cFJAp+5?~zRYuTe}6%wSvQ$d(Zi2~tmvp_x*Yr&zM+1*}m zw&+=W8wS0M+*Wd${{yW4=(gY_pnGG8w{1JVQdc*N=2#NFmayny$Ya z`TlDb4xZuLwA$K|!Lge|Ki(XJIeVFG=ugQx)w2&5i}r3&g}u`CDwDryp?km4eYaD; z##{?ovs3@JuS}jF>jr=(BA^(L5px$G`xCMS#2u&p>^!KCUIqTH79J;`!g_?zN0mTNB z>zF8{6fBs=Ad4tAi}o!JZBl|M>#My=nB68U;+A$Z;P05|n6k|!%~QpiThR$){dwOV zFqQ-U2)-(|1VPt8v}b&ySa66J3YeAJ3>w&Gx@Dz$!{T$vNa*;DzXblb>S8?E|0*<7 z`*W?mXFd)ewG2f=jEM8g4oa?l^>ZJ=^EN{ zC|AcUd!uDG$Su92L= z+HX4SxFrfTN-~Ki*z-33FfVw1EQDbBX#5JVq5c)ek;z8g;j`1z7w_~shbmD0;UI+i zC`>)v3(g2_@~CU?SAYm>2cyo$VEY(9RTAchhmtRDOmz%DvrMpk)DC$YF@I*urRj|O z>8O}GC)@N9&D=I)w>zg#pUuNa?--eWf)c1Xzb}1xgAkQ9=OhwWaBAADl}%xQ!U^@l z@UnBBzwCC1Wmqh?km4Pmj1q^pE+~p7#Jb#gm0*rAj2XOvxa*RvpJT``UyQ!PI^Ul7 z`YioMp8q8OeMnHyqu~Pj>4Vq2KPvhgUnQRvYjHlmeKV9IK~&?aZBbCFe0AQ86193_ znPs(W)x7b73zN~vE$KSr-uj#o8fIqZ(rb%#k@u+_w6mPYi#9VGqZ@nDEf7SwywzmG z@}Rneq^O?8f!u+8#*(zOv*E!0)T&9mKW%lF<#b}HYg&?ejd5T0_Qv4@<7#31x3hz+ zGMAss$KJ!Xj@(k}L_3QX8?li!xL&{0oWIk{`QXgXjbq3E@p&J7=JO%fOU6;~PIJNB zZ2Tt*@OP^C4Ox|FCjD#&iXyf0OhJu+nK=es!`DE?c5(LikyE#B7mA4%nq?#j%AbWL z{^|u__P}>#u*NwZBd1Jzt=f7l&V5n@lG~qoy>@7_a>6jgs08gLkke2~h(da$46i&d z6*FJMU<9GSD7u@r8q>S3!t$;bH7*O6Zem=1_(cNTN59Z>zaI8I&FKd&R^?_&k1gZ- zI6w++7q?LNhntm6T7zpEAlBAFEe|tiV#-rWBDZ9W^9$D2=D$#Vlby!4^;ONfkEa=f zyAwH9_dVg+>-pEw)eF+4`)DW=XW%(i)T-})7+$~#Vfu6-yI(%NTo%ki9zc%*0z!@M(x&1Jh{6apQRn-SKX%KKTnE8;|7bn`g79r%hsm}mw zvhP_F*?ifPxVs!4BuC+~*06J8_)V1A81qPMyI}L}$DH*ho9;vg6-O%zNs0(rjydY39)tknkhDmPk8grse$<#^Cjizs=BB-C-hGQ8bxmc`jq>|2H2$1{#D zE0zz&ap6jSbuJ(xSWapkeOo8q5_q#-7+lDf(h-Z!YWsUIdZi;^*<{ z+t?1Pyl31ydfxm!-s#b;`HqA~c5{s}8Ujfxri48=#sZQ>fQKL-OBrDJdyscS3K;WWBv}el>G)T$-2Pgd8K3NsQUWV>-vYxei7htIrz!x0MItr915J zZ=c&{@+PmixAIaK>g1$)+%$Tn{&w%h{Zmbf)*&fRKi?5(@VFbdm+LKXakf#*b>QVt z`xTA&W!>N|Q_Q)!n%fK4)>v3>e_zXP)>w?_lQ$LZie*bPFnLN1r0{L&EuEjn!$_B; zA+{j@t`ICzRMNn0139if24h4}i9fZrO$H{f^>655Y%Q-SDn6{B9+D~hON%VM{6e^- zQm8+4qwYi85HN|F!h4Ug?9RJs@&lI(omt_qM%yLUg!i7LHRgeEJINI4S9>3vw|n>o zz}{rKd2W#sK1vL)dP-v#%Zq2JmDP*``OOIUW95Mhv_IOAovD{LUUwLL)H~(3+=B0R zYx19eCoMkEL-eKA%uC@lVo~j?w8tlS1=5Yq2bu@T%wL%9lwgtU6KZF@u9!I^B2sYT zlsT+UnW6Lb;g9ANd1@yvv7Bj`jBk&deln9Slbn{Oj?Rcd-x3tIg65xT7Iz=k@5|AB z-GAAz-zH1mW9t3sQ|}Wu7rO2@pPkR??QKv`8#NwJ6Ja^+9vE^63w?X|VCIu=S87w1 z%dsh$uyUA4ue0p;`A-{+@%y*_ui<_ET>Z=5=?c>{^)i2vGTBo!%mUTReL2zwd{*iU zQLjRVOAOw@-hOyFQPVnbY0q53vvP$+-3cRLA@$IXp5OGAZE0^s26t0NO=psMeggU9 zC!~Ogi2fCY=C!o&L#&KeQJI@f4`5H}a9 zCv4lEV5nq%@7PI&|9tu{hO(JG#78g3ZC>H!&>r+2D`gCfQFVe#cy3yz9lUt4G|@*A zJG|9=X7{IeL6wEMz}7(;eNV1@Yg9Ig(FoX>E=NDgQmE?F+hW9bW%eI+hw+ajUv8}+ z%_ZEtRLXdLp4^rk!6{aw#1asQ0QcSRVKFE%ZFSm`>(j!ZKwXEX$HhkQH~LHH^JclL zTA{M)?6+UDN^_@Sx~xHLci?LnAH8SCJ?v*R&nt5SUTo#wE;9@cGWqb}>(~w&e)xRw zj;qpH`t0KbO|&Q+&-#&V`r_~zEQJC5B!POE@sn#23j?#pfIWX!d_gDr|Do(V zqncW~ZjTi~0hK0AR1~C3?*v7Pl+Z!CptR7WcOoJnAfWUXI)sk&PE?wJ)BvFd0U`7N zp#=iD+wYv?TRh*m_x{P)BaBV5cb>hTwdR_0E|mDWZ=1M=*$=F9mA+YzF63P~^Vhxj z^N#%aYJW|M>Y`8S4ywFs*g6AxJ0gH^%E-Y;iU13AB|#f}>54RS8i&^j_{-FEm~;|G z%Jy?-g>57EAoOOE?)K$ z%YcblAZPIA^4g1c)Y|hu-d9Nu?&#I)^=oN#2eN6%s1RrwnIQMCusL=9<}^aFZlN#r zzy-rmU^M6*G`>3heOmLRds<7EQR6g*#?4=x>MFJJo<#E_hl~EtbTRg4qKz6fRocug z?x^vnj4GF^Sk-(>UJLV=belPcqZ{pLw4ULP)lBp06$$Hx|2U$`flE$8BC)ldPN>f> zs(&2WeE_C6so)k3S)~{;6F3I={cGs;&6eZtN|}v|xOeo@*VAGnXNm&FqaO@fZ}-@b z!UHxSmFv67f?6J-gR*Z(KC0TsSq+>|Db=mi`V!`sKWqH1JEEM6r~Ml#J%}uZ`+92Z1WMKsJyt+$Sw+yj^!n{lOe_ zm$vN0levXZ+5Lx<&G$bhtGyXb!h{}QDECB#LZw?1Z!OirqdOMHzsqXf>$Lb_Bi@c?=^52KMb9Aa- zZ(B8Qm9AZ(^R>Z&bc&SycfQ(-l#D_qA|b6K@tdb(7s@nrYEYbq`zrc4U$*OGYtVpm}Sw z1QvSdOF43kNB<4ifst0KA6`Jacnn`?!;iy8@2%~YBka>C&daFvU3@{|PO~qxFU4nv zH9g5U_T=50ZougP_>E<_zK>h(tTo?N#?~UP2Y0H7LwsfNd27@_D(xdV+=uAs zZgS#KP8ap)xTU`zL2Wohbm1v3q0qT)Qm07gh6B1e-h(U=KdF-|YszU>R>Cc?bMvF) z$wkO`X6vxkA!CruQi-?QX$-nbX>lj7P_J)wcX^1F0py&*M0xffmY?D+HHKxpCBy0F zeZwY5g%~p|s7SB$(M(fyUNV$h$nQd8`C;ls^7ZoKR3Z0TUTn{|xwqPGghNtJy^;d2 ztM6e6y!hBMGX&UAivyr0_vmQOXKC_o4}KjInupcdj@!wt>~Bbh4?W$egA&gewz{;W z)OfqsBKiWEOO!V8iqZ6n?yDnu(>IoSQxnI^4a%A?0>tgyNSK(@=~)SXJ!tm3#NE$| z8TZQ>d;84n^9k}1+Ba6$x)zoGwTZ`mx@P`HRA6wn#XD#d&Ce*qqmKv}((!4HJxz~Q zxA(y>0|oWIt0G#`_mAz2(rTwRGL!hwmn7-qFD5XEV8H_0a+G`94SGxtA1qJWjyPQ7 z>dscN=DA1U5H{_80G$W<+76T{O(JHc)7#hkQq$a<4%Tz>BNdcwg&Ln<@6LUlYh1}!g*{~F2?*jg!t=$GUDj^SUA%Hh<7m3sJwmF(8mUsXZQVQO zK+Q}AXB=QoPBavvt3ah*DnEB{KQ-Fh^_p+?RE@gRCjj2PjvJNr`pIdI6Foh zI{)KI(R~p!*G5;=xG>b}bCRfgwc}pQj;GO^i6*}0%55h_ip0!(D5_Lne#U(xq_iDP zsZ174{>@Gnf!@`)G4C|nTDpsQ?+XbJ7l3W*m+(AF2x7PEsyh8tw}+lP}^x~?;UFQjqM^iWMy$PDdIH0 zdXZ(%FWX2>(sMJr_1rGy!%>O7RePv=TCScKtxKgh^z3=t|rUzlc zz3mr0!Rwr+c4;8@BO$dUg70-jwfa=Swde-(Q!wzG(HKWZBvLs}wW{>c@fkYxFDZL` z7=Uk#{@{_?!{d)u-{F8xG^syn?!#<3Gk>JG2Det)_J zm2b&yOx9%Bpl&9?-^WP%wNGwLVRF#gt7w+JyxItGe>zVSFR{eBCxJsj&D7>`>wGTM z&FxC5;Rz*>#Khi8=(ud9g>Lqad+MQUC&L#oVx6BpBdLj&@{WuB4&^mf!1PZA4F0eu zo~KdGe5gE7uFLlT&R63w75?ba>y_5GlJw3(uTPEFz1{|e>_Ig4R&~QzJ_0SsuG`TU zCh>m*)3QG7SD{GzOBKe&tOwBv{?*>r$97%H;0eJhI-0_#L4K|mKO{cbmGU`!<=D|N zyol^tUZsy+v-Dh9U^kw@aG8cw9%JsP&q*&2<%GJi%Ov!NvfNU9H(oZ#1ytLdY-3nh zTQtyxP~!iPxV#*-S9U|awSAr5q@keIF+Z@q0Oi%JFOEatx%gY+;LR#9 zM?(O%#Gt@$B8ECi^1Xodey-&F-IEnT>y?-7Pkif3R>SEi^0MV4-qswxjXk7XULEDC z#y)$qrIZ%cbZRSPCDPhLzI{2>v%HWqJXGQFnvAzYAzl9~O~Rb-~c zHzNQRw~Hj}-&eOifhB_kBof#NBCOqV1TOHCEtX$c`5%|Wl)ryI@ujZtZ^`L1ncVEG z>1~H{B+oxDYnX{_Dc#Ep*_#^X5$_RoXynbG1LamLe;+HI@=%AccQuY*mURiaFj&TM z4>hp8ShxA|^v!XFHYSYt{@=6Czm7k>l}+(*cB;PhFTnH{e)qo~$U^S^an2v&r<+Oj z+e-dBD*gA#vW=|3IgP$gDsKHl?fKvBy1z1%5v4!)m$es)@3vwhu%n8Oz%1vXqiT&s5~1j8n&>AfRY5rcPl zct4j)ph`@`*iMcj1iDbO@3L$KF-`8RyCPzTd3E~0*r@;cDU{UDpC!0zAn6!10?%H! zubr>zw%9{sSm|~_USURQSHQa@8pQM@o=Z2EN!&%F^IiT)1F_6VQO*>KTJn;=yp)r# z#u$r0u*l2H4^7srEsq!CM5dZ5zw{zwO(CaeX?P4D8xZp%5|;-$dO1W+^SR(p>Yg`* zn?)AU6c{H9xZ%dsj+_=mB%mwda^H-FLD9%o2iKkq5NM{!Ga8&G_5@n`bm2WknN8ft z9&VZgkJm(PzB^sL@ekW2urTXGWq$(k=jiv&SZF-U^wrA{FMXs!Mlpt>^mVvz(&!czf;i#b5Wng; zj+*##`b`!wBqLi5sS0&ahQVz@Lw{_}rfl z;jh;~>N|hX9dMk#iTsZo*C%-5R`| zayWJOXuk;?kJtvOe_YinG``W7B%^Dc2HpA|XrIWgeltbd?qYEKeePakjw|$1gM)zX zSu+-rPkuvHrwfjXuA=U^_7^Po1KO@Rl2Gr@`U6aeH?9 z^bD9$Z{-B;!f;-MMAd2BDdE8t>s`z#VZu;~=$Ufdr3!OSUwfa<3|#M0mZAHOMouR_ z11A4G@4sWm`)}u;WvW|!Ponsbiv8UsV`}yv2iRG4P$aV=Iis*HxMZhr6l~InoNH5j zkvJf8^0a6FO;5aP$a+^ai*_h)%Suy5K;CSAzuxH>Y2sqS%33)hPM&z$1WrcS=cV+x zcgG-J%p5#dP?=!`Iwab z9%WE9Mk zw8m3^<>B05R@+Ffysu%y5(vK<%mR{giY6o-QF^N+G-$oFIw_pPExbGZ#;>mQw!Ojk z;3fpw8hc$&juxQP{=??I~&%58H5B{sR~ta`3b$`iH*m63+8?`!W#kDMDC0 zZIq)r4#(Ey3ZGVF|Csv_1`N0cn?aAy0U`C{6rxW>?J+m9F^)!OE9>~ar8DAj0XlJ+{3^?v%z@>`uZj*jCKNS5BIs~;w`6lzxA^I-ejbeV~y z_UE$~s6~s1hBT{PMj*8_W2^<}K4?6~b?PRxx&U=I%k2ZT7ah`C7A5JrhUv*$ck z$J5DZIPbb`Wu?|Ra;E>mrkZB&MS0v!x36yHG|{L#jT+NlD%33w89maykk&%f?RsLT zZ;c-$8Cw~8SG_#F= zvfcxy)UTXe^&B%YRT^`}@nuAkQSas} zQannZ;?(&jkCsV)6dmfeqr=T(=p{d;*3-X_3G~_!w!09%_u^hO08%aWk+^Ni z3YD6%uwp8xi*$P*KKyL(c>1twcVP8?53DyRMR-8v_Gg*6+s`jHy5MPf%sf87H!0MT z(Wy>~W*TNsg~u7ylEqbW+RrdKh(#Gj|6Y^GemOr}5*W~KBv;^Bp58;o%34mU4-;I3 zOjSF|FZL$t?{Mjr<|VB;SAw~&Fbc>@39V;R!x+6yjTWybFSvp;b{H4GerSU1Z>4OXvUK zRXW+8dIf;yz<>!_rX$}$7B2A}i{p*bKoj1bMt1e&BIe=6ooCn1#jAe+s^G_Afq085 zt4487(!>gB-)7Yf2@hevPbDHAA!ZXFEy7a)J*#@5R$hTElC9bsN4qNcEJ-4MRQMj= zfFtPauUG*m^}5Vjmoo3vS)ARxk3}UOx>Z?PEF69cJo1&1$tsbCrLjljch~vNn?;o) z63SvO9#vZQG6-w-_*Gfw6vlQ^%~n0l-&yR@MDfCy8%b){eUED=G7|uXaxWxthG!4!I=zisoO;t{944(&F$&F$3ZHNLnCygD!38W` zknjwq>SZ;cxD=h`e3*r=TI-~-rYv}Q%?xsD?67zIWuwbtU|G5#IYSDH_;lUOW~ef= zjJ%4&j9*kO+3gL*O(AHaOAchzMYDk{zwdG*_zp5N%bn>+g$_%0u4P-0w)gbw@64zh zR7$bDn;;)(y$~?72pVW=GZ{X|5Q&-F^M$Hui;8ueuo1}y=;>v52~u~ z)HiM@MbM>~aXAoEM!8l*?xlgC=^o+Q&!yPmGUdBtBA%(=D51Iwe(gg!?VC5TXyF#r zq0mV)D8SQevwaKKpAx*(2fH^5`j(230X!7a%JoW9guK5*3zXAnT?Unc0WX@ra+4VF ztCsoZ!DVmpPp^Y}b4$pW;HSfRDm&^tnBv;BMbKD1#l$)2LrAhNLZ>?#^ zPj>;?_gINxkzjw-=L~ER-c(sFkNn*M1XgM{_a)epCfYiA+L>r4u4vdlwa|sm9%)CX zRIgw%R8zz7qQNPzgMxI2=89YJHMgnu*Jp~~P1NbrrSRje4aGbq)R>6OHBKklZLarf zv#QoSM=|UbKE)fbQ8Q-tymI@;P%L!OtrK6Y?}$uBR`ig*)J6E=cQ3luOpl^O(bS9= z(it!;QeNBv`m>3Mg{niZyJ995$IxA81DNyaaIlwzFI$x3%(X7Oe9s3S!4~o9{iXZ5 zw@1ZTnB5b3&6*2oxlj});VV074Gi9)7EaT#(8-IFF1k_CDu={N8#n%S?|xNdC8S9i z?FOj4o)|tE?~KV>+tOu^ogYsi=*Ft}bfCPDGmAb2fKygN!9Z&TM7#Q#Ob>@~i0gdp z*D|m>MDMonCZ={{s!)ISww|^d1og-n@2G38G59cTWUR4mwtCa4C!Q;D-bK3P>BIS? zca!ZQ>+Wk~$YrO12X316e%nl(cZ@R=c(g-`K>ATYDUrG1cwfKFIE>eZMv`SPB;97N32MY1rvjpY`t16cITJC1i<%mZq?7 zn?Gh*wk2AoTT;tfngnOeHuEl%Zeh|^bQ;|_=0jtHj`rdur-lJyOf36jG#iP^MA!XrH=DrC0Bee94#;KUBPC= zXz$5LOL85YJ!2tg4di159z0cN+>hSPa)_8ZxtY(PkGEW5;UpeT*A6bH&sQ(fK*n?9 z%lZYVTu&Og=LeM(RvO6iEGz2jR&tBDy*LSMB9vBi?91ZYOW!ua-cg;RZI$x<__d3{c9RbKv`6#RMrCcQptCoN;~ofFFC zVm^@m=B!}&N0YE8qXCRXQ>ahM=%Q4_v&gyzGGSMnN0g^{lwwIQu9w~HsyJxH2VUuPTvA~_X z-8+IXV=)l&o^<1AQZC4KK0d@E)~WP4WW!a~a(FeReKUb0GoZgFI z5Y%hGDkS~%x#z|tbqagZBYA=+7%=e}rN=b9o8jy1?5s@UwjIju09dK&5--0#5ciy_ zb;z|>SGs}#?WKdgC8OM(Te42d0|AW#R!7AeEkbzlI3K3FL(?7a?eQD z{*93;GC0B`$M@?GEh11Y4{g<alpZdK24(Rf@ZF0L`)Qj-&!xa(-BJs& z)83gThJ@nazy?CWDzfz_fsw+*#|Zd>JfWTpgriF}sdA|8=Y88NT~Ulq<6X=Lh!Cp0 z&tKjgTKYB?zE1R5OPDy>3uS38FY#y#A;zg)D>^7?zoTRmP%2smIF2YS5GoeBR+cqg zzg`fTtV-n2X9w0+_&~Ivor@mSddWlAEGpUb%~`0uWg2GZ!e!o}$h8B5Tmefp67slr zpFzY@M5bWBYb;MHUvGkCPqJ7qpey|iE9wT{>PyRHIcU@Wa_PpUbkmav;Jdd@aQP805pl9^GagW4TzZLz+q5OP=Rf1XSGeYa_DCFbzDs8%*SBBbmH;Nn>WLKeOfbyLta_XO{%p| z?`s{D!CveEl$PA}k}Z4}E6sqq6h){?icnv(rZE3=_Qg|C{ss70ZPZq8%BY)R0_r8P zwfoZH2`YmV-Rc#)V&~Lc%#EFE3k@^PXT=q7BfYoM#LrQeQ}WfWXI_53e_)0y(8zk! zj%JhrDBk{u-8O|0RR_fWve}6Nb>%g_hxwTr#ZmajM`f@ja>TRIWV-lLWPVO$Ub$*xVdVebW)Gn&WVM5MB(hqC;7t^61h7f{*cR(IjWN z?rHqC4sP8d%_Tk80LWMRir`4TF1B7Xg7k8#Ap zdolLTWT;T(m#9yaWz`ptE?iDTk`M)9Vsj+TK!9iS*lV>z-88KAi|>owP|&_X-=Pj` zxS#6d?ft}n>m%20w9JjdwDY|&9sAKQjR0{(MYGqoS%Q2Be$}D{vO1n6y>0fW&=2o2 zEDMxa&J$@YUl{V*?$9z8RZ&{v8UMgz-OJ}>4;44pN|+a1oh>i7xZlSk;_6~^7u?)1I_B?^JZwdG7(pxU zFe| z2w)R^fl!-ASAPe46B28ARXJUM=&5_ziquC5b2JVoPnAtgDNI zCO^>ZDcbsU2b^!{h=ojqMy|3%3cy}21rRceeQF>=FScYCZ)3AsjBMMD#++9+`aUEz z(lMgoP*h1SAR35~UXY4Tz8&qCu`ZYR+-N_c>a5Z*mn>*aK4sQqwXgAP z;?qve#}d&V_PhbLxmGi^No_17d2v)T;PlKA6*WqD`x#FcvXNzUOuScJlJ>=~vWx1> zs7A*1GA#bCZ&d_(a?R$m7>B~sUOuWqd_-RyM5G6?Kc*yKrrlKQ zvZyWA1%}nFn${$A$G7Ur-?=Q-NdPRFmix@l6)NmObn0K4n_m$%Xag8px%HkHuLxEU zLFxl5`*fNpe}QesEEK8!99kn$!{YoBKG~k9?-5;;Ul)Rq>(wvSuA(rhIgyr%WYPP0 ztZUS*Tb@z6J-YLbzVF!RCa6{>FSAxV`2&T{5p69uI|KX+I+*?azDFRzkGO? zUNCIN3p>&JFd1n>m9>Af)1YH~TxK&(kCSrg7OiaF3IaIofv-c6 zHe95T7ZZBLR~z2y!CFxE5gX73*m&r#cQI8AZP;kyvAiCN-zI0RdVOr#tdW zXFkUx;99c&@cfZ7|NiyoU!JR^X)k06{?_Y}U1k4^GMS@}(6bpUG6)K%&U*=vZ8u_46pzG=z&Z9$Lqni z?OUR8NG0R(S~a^w#^nj}BFLvx*SR}BL{=o}jlwrq&l39B)2bKC-sc3bxeG7$!&GRP zTX%v)f!3H_+?VKdt*RY{>(}or#$EUG@4JF;St_EYw~cD}iZwCf=t4dqPuQ~!&d5Xm zT};bD*grZB9A&rqQ{+imI;a@E#fKR-)<%nz z0pw08Cdv9deTO72X-wiw2U@o!0lDd~2=I3$;(C4>_ol7mhS*qMis`lO zOQR!A`sziRHLp{Io6Ag3qP6-R(G441Ek0j8obZ}297dGevvw<^W^M86J>`V=m3f(sA1p;PC*vj$ZQTLS(LXaU+Yf&*E}7Zv z#JEtxg=5$c467NrCl-BO;B~V?4XGG!{Zdm0;g7S{haP|aleTJwiXTcj>;#CU2_eav!aZoz=Bp;U{f6`%`w8%3P1s^H}DN}`&o)f znQ5*wl`w0uV|o_TBRR?p5nzJ|)khgD5ldk`Y@w%NTK7pK)nNh|4CTfX`)rm*av;BF z`}0;K`7fS|=}*qJJl(INwFTMuCPUU-9Jz@=v+D3~QbLk?uu9T(=T|E zc#bRnGAo7prMdUay2ZEWDu4|>*!9>t`mVo74cKbrt9AGz2% zQ5tF4aXEB&8e~<-fJxV=m>c^C9jQstQ?u)-pt(sfoi=Q>ppt3{I|hWgozPG_{2e7g=5|P(*p?wN>;Eu&FWh?!1||?FpeE1H$nKo=^&U z)hzFCaE(LrWdbNa2ACRRzd&KW6IbXmF3gpv0r2O#n>pRqMp6>^(p4hpl33bZm^1#E z05bJq?pwEBb^3`be;9=ZWb6n|xcV2?x{k)ricX^VA0)CwvRI>U2>5qm%Tko1s(zH` zX{C$$O4zbkh&t#bUc9o*zSb3;am(_*%0Px&@6$rOX%vaAE%)cYgOBiC<%QrrPDq6d zkKqFrwUn)MEnAOR4P?A~ggBbCo{D*16m}Yx6@4*lYGO0=sOq7qZwB1q>%pxEI=&C` z#R+`1jU+#ge-;Tt<1DIk#Uq_P(yPs&5pEvi>ZHnuW4%^0p`+)|OGWZRj?GGCx_Kmf zqxYCk_HGn<)RmdMUHDpTJ3>U~pS?hKe?ldZ57`(wHNv^L8jgn^+NLqNemSgYXS5h? z&jy0I)#aq8uK~`|D+3PpouS zOH*G~E1KCLikp0+!PR@vt}R@103BSCA1!7f6O69VHivxxe72jZnJgTt>lp4{xO{2^ zeb|4BCKZ#9@Uyp%JeHTiPZPu;S68z z5cSkcc7mqKnw#G%^e8oKSJ=1JX6JGge7<185us1J7+5UP)!>TJ(KMa)J~$`u#A`E@ z-LON)%*?ZwNFMv-J8HX6)ReA#&cRZ8wfcB}1AZaG1TnGDrmmnZUBQ3r{{6Q*i@l0d zbtT%Sa(sMz^vCh;NkH9Wt~xf-slFKecQYi{>MXHrO7=1xpGw6I+_!x5wu?O((qQ{$ zFvQQ(cfsY|wpQMk|!N`H{K*!G`E=p4Z0Vsdg&byKBAsA&+MV;b*5*w^)yh5y++cRjaJ~G65IXYfV%A zfT&!82AIYAj!o6$t6Ym~MG&IpZc>Bm}L{XxYmd7Nox9N`H z^Gi$r&~v9jWi zyoapKbh1e(Z^pvmE2@uFze#UPf{CUc!Tn_n&xf+P;@F);I1Rr=`&C+LjrC(sQtMd4 z4-!JZ$iX5|^ZnI+6EsC8qU8eeHmB>mL+nQ%UnBD$51yV_v9?OOe;)sBk1-|9?WWpY zjo^Q={6IHX6n#UX)}kSr=$>NV^~lTX4KFrI6>xlX)9zouDZKvv{T2Wfqrwo^7%OK! zNO<}N14gxMq5B61iJcn&ze1~t!sG?4=}qf7Q+OdVzjsd1dS6H6!j|oQ;hFktDhlW; zVy$-NX#e{nB6<#-dze0o4FA($Zcq3pO8J1(iCu>6PBOH8WLai{-KIPvNmfF<`uNR=?kF``IF{M2~*?IEO{P2K8;?ytPBe#1NLfdXR~-)M9x2 zf_PPczJEZjz>}+KLm*OQLtgLl&|I~3BL1$lFBrGI9oOldzWbids!1=59vKCx8Wv-r zaZhA>2g)v1iA>&J01xIzCgwucPxzXiN;>IjAORkx?JT+&0x-4rtsb1h<*2>)YUd7D z^GVv2ssDp8@;?kQvB!V$9gQw7@i#He>Gzq{eLIRo+TjK4Lpv$OlFQ9Qh z+tv)iMX`vNrO<;-lY5TG^OjKUZ|-YI$^_Pm)X@}SI}J8U%1Ms#hK2UV#WXuT-h6<* z!pZLOrAPN3zzekbR4mO=em^2CEDMh#>VWAD09LY$x(4_ft|mxK?fRYOtJ82+#i+q= z;t@>goc9jJOPCn`yv$tRv;An0#1x3zD% zoNtYk#&3}>wS`6vHp}82{oo5kX>d&Oub!z`t_FJHc{J^`jK(j6dh%tssF$?m}n5L_V8 z6O#zRBX&TTy<2R6OeCZIreM%4z0zMAN`37b*Q2cDg_^09Dub$N3)g1R?e1gNFMB6} z=j!Z*)oK>wxvb$99WL)ZMbv#>V);$3b?%r*I$bJUv}ylcDO2w+yP z4>-K1wnn-5tGo9L)&Iu>EtWI&_3HlRq(Z-AJpcX?|9-3#`jgxg%Ey^-{x`(ocWCg> zcitae`XrliWJ+c8|8WilY3}NcUB!JT{r7x^&2P}eZbuw#&|Af1%NC<&BCIt zcn7TUEwY|kJ_aQ8=BQ;@d&qpHa9z% zd2TY)dg_}4QZTYU#zzO6XgC%7fW~^C(Pj##Ze%Kd&QJJD`QgKc?zXm|pIQlD$~VZC zW6JA!)>`-mNWe|F#YD`!Kea67O{v`C4OF}!TAdp*;ucuT0Y72U!yCu8M;GF zN2drQr!;4s$M45dl6Fa6=r=)t3G45I-0gJlKr05p-)D-<#OKpRw@sZxtFIN~&^S*pvKw_-O)aboVKv~MHq#f<*SOX6Y zw}xzSLL4wAM#+_E%!VtYjcGjH-97c}ItVQ`gI7PeNd))KFUHgAsA+V)X(duI{Xzcw z%6B`zt6u7+`}NhUFj=grbbak4ek?nqM7KY5y1zMGJqT zSDG(=Ibm`=r*s+JKrUQhmf=FOq&Mx~8UAz!m{OgK$I%S~eqxjP;l?KoE;^+UU4u=G zb(FKrPs(2z8T2K0Zvi7j&(q!GM7psy7H%^VnDLhNlAsl_(2BWHpbgACrJeOCI8JO| z)M+Lcko69}35zXt^ISYK5Vtl(NX^e3Kby-IDS1J9Z%GQ_2#SJzA50m#^mlr4YvXFc z)7E!7B2srA^%$BX^Ginz+Tj?ToK@Fqn-xxn8W%0xa>es%w+Tq&O}g@871hqJuGI8$ zeeL?|19J2NR+&G0$CFS|Hmgf*we0HY`L8gl2k}{1__vYzwbvO3?R3kP8(bH&RnyZg zkdK&{rM#Y^v5b3Mn$7jxrojBKID-PSrW6;xJldUcC@nBsH?RN^ z0W?bM=C*%_Ew)vT+838F7sq7E3V5LwPBk24Igr4}e21ZO3I{w( zapl&jW2FUt_#Nedj-s0RYH(T!k_;GbaaF-6mTSnBRgL#n&0g92CeO7;KQ)FSN8a;p zhRx5|;<+^+iMlnoSgr&sL>4@W@Mv`D|4H-X)GaCC;`^yuSHPB#Va)s-;K^ezUaqefk5m%4pZugO zc54rp8|f9(k^QX&+PZRe>p(Ok0O8Vch>jA~^9bm<13lH?;^aaRtaTH{&x-KY0P4Ro zM#fbx{UW8cF-g(Z#6&pL!RCylRxS0>{_3M(GTITE(DNi5ysM1D5G4dS&C2H0LS#vr zmtc`d#o7+tV~_)<&c|0G$Esg}(-PNoX1?~GyXuPX|P<->LVxx+D7XrxjBEAdhShC3%WIDpkT%998J-Q$Qnm zr{Tk-US4P^9>acH)35Tm2OtduJg!>X%lrGmm7ny!gd<>>?%&;sHr`uc%6yE-g;{AujxriUkuQCFUihp1a7a2e^1ZP4(q zMh+XbT?B}QnD!Q#wU^q{lCC>6jOu2L5P#?Z++>vco<*V^ve!h-lw@;Sm~pgvv$@6r zS;cfWK(b(Eq!0mTJQ#O+i(z&d`kWs>g;zHlObgG-3OasL$QByt6Ip#5t?K>X}d`@F5xCgaO+qNc20_f@0!xcb8=G zs14A%IM;wXo>kVQ{=KZqZK2vV^V^XDuEWrKW&HhQbB#~bR|4d;#)AB(h$in<O}!qKR)gj zu^(3E0q+X)uj!MN>mmv{hds@pkN8CF*l?tz2(`lxl@V0CXE(2R#s4Qu@7sSY8!udb%E;4Qh-u3bxd`La zmd8w<`f!iZK6XqZk6D&0X1ZF_q)59dp-p?|gePMd!2K96L?E$-lv?&mO`fwawuULj zYb~{}o$dK?HY2in@|eXD^=C#%VR?;xQL@?=jHBa8oY6fPGrkIU#+sGsINwvHP8^^z zPX-LGGj~NL9`-v7+wIVW$nR0}c4dP+l(Ev^W(e0)5Kre`Uq7j_8)`=nySy0S?S1-P zyF)Ft6ImXcKNLBh+9+WySY`^JilRv&*B2}+%p5c z7uAEyJKx32Zx|u&N1jwZxOO&U67i=^qskkspzlRh)Fo=xhT zpa501)H)iONrC0wH&Pk%*D4%P4D6$@HH+45v623#XW2D+*4h3lz(p@%;> z;CA!p8!bzKPMW{bw6=JP>Ggw3CV|3$mPSC7B{z*AG`y^^P!ePaomqBmQ0j8m+1X7R``nc>=2xzAJ~B|9X>xzxYuW&*iPQc3 zb1}?LO&RIR*K<1E0%C%EeW;2>P*uvf4d`1`s8EfGMfsl#A#BuO3O#yc*9GRCNFG2G zE#wwft?-lh(G~il`hUbv#ClZ$=2RW=0{hvu?p-qSwFd)HuqJ?m=qUMoOll$zLW9Jr z8hmF9G&z7CARhzCJbeDDXTr@tfJ$o>3l*LF^zql7`Rm|)*`*iCT*dSN!EIz2kD+n* z#G>V9eD>;!kA4&)3-*!PGC>!2D+FGl%FWbQ20EvBruLURAvi56^Knt>%n{x3?soLs z9PfyP3EPL&FNZATSSu{q(YEFJ2>mi0`QkN@-I%gIQI{(|i`kc=TSRln3Y9(}YM)dR z;#K%2`1|q^Pvbp~sTMo-38$g?ds<+M&l9NfMHQ>^GmJoRE!Y86yH`Z5Zipz{{(FJS z7O{WgO_}%@rtGay3<3|I+9uUKQb0Gp&nqSyb-M`qIXlTSDVS6_{sk zY?SeSo&AwSJdaVzKC=Yd7ar+hVN@gEY?BkB44f+Nwe|7A5lS9QbP5A@l|bc_?9ygNt>a2Q@8(~gNl4}M+SvSo`ASF@zIl6m z?MozMg|eT+C`@!s49MNdu6$FQu9ZiIRNF5ij7#pGHoxfI%mGq%bc4TsGo2dN-LuS0 zw-bE~;#n>)Yh%{81`&(EgaG`>fx$?XqGw(KG~*^U^@|-Tm*ahhqm$@hh;|cdk5M)C zq$W~q)6d>G?YdQ4LL!xeum0C5c^i>lta6SsY%!5(mZ;#9^E>`%dDixeY&pZ^C>^BV z7%-!(`L@#|xqw#`%jnbqSZt~P!(zj*C5Ek`oHQa9_u44Y@DhX4=Z)PLFP_byQ2#26 z0ElQ8rAs4<^aV4b{$`>zi^=B-5Ar>&Pm?*EJyx!RSTvt&5~XVDnXR#-Ehl@#L;J3cC8mwFlrhyoZPu7_W*-B>2?&b<0pZ8FRo z2<%#6FJNBj~u;z_JHf*e)<&6HLvarL<(HQ?5Wr)F318VI3hubHBqrsXi=8?_Ic8=Dy~h4dW*8N{W^!>62rbT9U}MJ0NE*<#T&aw zoUw>QC(CaC7V2rPi)HWXm0gFaYUN$bYf;B_$=!H?^kP)T_yH7xGz*M*M-)58ql$Xw z7)8RadeqpB0zHJX41o<#2f-$n|HIyU#x<30Z=g0rMMXtXK#EF{u2ca7D2VhTO+Y}U zNeK~<4hdL5x^(FvodA&%kQ%WdJ@ghJDkZcKAV7eS*r_mjMfd=PcQj<;N=#(A48$g^9G=Pne6AiZ1-q?;q9QJ zr%SA7IT7u0$=`g-IAQ6^=Z({u>Ut5DW{?2V%8Jo^%r+X3F18*LGAY-^Y2)K|097t~ zbl_u?L^Zcw3+6oiEFh$I7|kgwmjx67B&gCUg6{OFPaQDAgnuDMt1SBc<>u>bT7(Jl zhOPucVvd)JSHVi&*T{7^gXR!bjvx(lqtbr ztge1Q#uh2hbY_0xvmh_yg~JgGLJFQx8efjw{GUXNc(uEUVd9<>emopDy9H;6 zfi-@V?!s~2k-;$1Usjw&L`E7t)HB^cn6^);W6Q7Ctd7!4K#swJ6A)sN7cySSpSOa} zg-Wi?ybWyQ&jGr;=^y+i70;9*1O$nETSttucMH(6vU=}tM468}gay#oqp5-4BF~94S9I$ zm?S`qzbbV5$MH1EcY>YiHUML!G;6&s`t&V*n|%HAH3GlX-J-Hugn8Xe?~92>|J#v? za^0KMJ~Z06N-Z?govkD&<<6IyLKptDk9&1Y92C}l);3KH<4D_ZBSa5NuDGoPpV&jK{K;#%o)qwO(I~-vrr+*2GxG%qTpVcolsid*$HCK}$z2WOe$d!5UXe)l3zM zT0QWkXLYI@t7jh5+cknld33!`ZR}soWmb=t(!7Z>UW6buaegL<3h#2Y^L!T7!`Dj7LL$KD$F8tzir#$5>vQr}fbOkINY~3GIk&LUhTePj zRO0m^Qb$sfJ`^`^I-BOUD~xf-Gtl&8rl`Q`PSY|qm_uA^;OO!_r==>gpT3yPH0J|D4W31SE-%+G~h;;$wX|ebfgb!}k;5w(sJQ<{pow zd`$2H3$Kwdaoad*U|un?UDjxXN-qaBs|JgwhYB*I;z;GeS0U--TYSMfHGOIH?k<5X%US=PS7tAcYJBc zA#4nCK^;YJTB(}AhRApXlDuDQs9uh>>P+53dAAZ;C10}?TWa~yhPdbrf71I7*s~9L zGt=n6Y)K5CPDZR9Y@OCojH=&!nzWI)*_Q#ju}NO4F;j^=mz9x6z3e&TG$O9H6K~Aq z9hO+aY?V}_#>A(tnH_Wiv7s4hmjLZDL5G83XQs{4rCHhUx4OfIWRgf5b;Qnj$UCZ! zn!~A0mcYZ)9lb?Pv}f$7sLI<+=P;WtRuMUP|NesLDu0jP1hO)n86>nqhoDjH&K|D# z<|pFpq0iT4@PIh&vY9o>d3d9 z;mmR~BclZG)>8Aj&dTU>dBSdBC%~f-i*cVZ2QiUbzi?h96DR0%1w~)8Omjb7XQ-m? zr`IsP@hE5fZi($TUr31=Z%PKkf`iEf&d^=qHI<&cg>XnI8KUchI?8D0D6J3?qyAq~ zlV*B1!cb-c^DIjl_ECP~99dVKW>3tGH0alupI7K2VNLmklO1RxkQ__j>liA<&^d6x z@8(-*6O?A`M!L-LLs<*BDu~^O6j4N|e0#Q)(cYWezP4Ady`y1$+j8G=ZD)(d^Yt5F zIFKC;WkTOSyr3QR(zN~tqTj-eAtAwY1;7&7a~${3f}6C zrq?W&(tX2{?6~`52>SUxRK+4^pUaMz@&WN|-w8|0nALrwHt~k~UqtTJUuIzTb1)(e zoMrGk8k@q?RzE}&5~Z$G&v;W$8P373Oy-X^0`O1+znYrbY8@^EDY<}`wusqYcbtwY zE#X}JO^GW2@!pDYT-e?mFFqX1xFks1{>ax6n%I;P1w%}wuw2814*xv zF#H|K{hqYI{XQ1=oQgYY=VUP}4!L2!_^D(DDY1l*%{Y-)}V)U@TkApJ;MOXBqOG$Hrt_=MRN zXjTEO9nvVCvi2V28G7U;Ys&V~aZfaRb7}Dwv?S@c;lC_PU@ltTEz zGjGNXoTb0chN?zi%H!GPlUvSPtQ9hl4&Nb7bOV0S6%wG+$B{4n4rTXQ%>CmI#S?3v zQ1!k2#}3xw3F@;Zf0h@3_22L-&-8a;CGHr|c~QYHnbLuf2ig^>&g}kwFXgBM#tv*z$BT zc<19|V=rl?_)vB2rCuHQP4=(<@ZR&yCE> zEY7p^PgJa6X$oM(HA*zaKewQggM-_`Qi=GhQ8cp zq3X#TCcknL1ti2DV>L*J^&-FQXhusl$sb3i+tCVf~Izt2fc3Shr7G_wssY;{R;})A5BQVC- zGLtGv9v|IZvvQPa@?u8}1VK)n!#0bf69Zc6fl>sk+ff{`i59+s-E;9>jLkZR%%KFD zx^yzbuPTLS8T#k#-|5J&SIRt5*zW18G7+2EE4-3uJY(W{i_XpQvtf;KI;iE2CnR|qo}`eF+ivuFB>LpZ zQ;6|L_Q$&5K2qjp;Fjwvrr*O52`z1g@J=Vk#};&>{o*47+32Fxl##$5blD^Lh zO>I#cIPFm@_lwpv>i)fU;ik!8Uh>+kK#3{xH1bXC=ql1=Q%;QZvUYEonAuPyIHzLp zAaXU@RBirKh|@?+qkgDpT%1|B1F0p8l2gO{Qm|(q(FEx0JF`TYw)k>5ci*?K`3XWg z+RhhFo?J)9=XAA<9y1e=*vLBf@%}bv5gK-daww0|)X&!D_-tznp)LpA`FI-{zmWWL zd$L6oiSjH+@l}aBC#03k4b;N~7Wc`+9O9pjmeWn11*QVLl9l$$R487iYuhFR;bLx- zm7I46)suhUTGsi!Z9fDm-yV)zXDGsd+9TIw!I^ot{NG}oSLo{Zug&cJ57pebOS*$t z(fxF@j_apL(_W9y{o+gfS*-NmCrRMjlU$0NQc5?Je%rVdhm-FR&_HNf+uU$L# ze?OVa>A=O0c{~ya{`1y?2Z6$7)oKn7p{WWP#vdj1*?*O94Pc`?)LrM&KPUd{?}3Ff zyASX*RrdYqnSrcK_e036*?AZL^0j~cGHHernV!ViKF|OAUf{W0ik4RW2G9ROXczF6 zf1b^+wtLfW5N3Mv2|s@OK(IT{J+#t(;Eu@Y#FmNT{V^$)C#t}?558T}MM0mhX)gf1 zY9tZ?VMiI?jbf*X1pc$?B1T2ghLoKbMO1akDpu`M2b!V&DW>l^I%tWIh=}O=`s*WQ zZirMF&qh{LmUk`pM>*da;36x*eRnt-X&eoEGemc84mxX!R$pcMay;?mrJw~IWqS*o z=-U{}HwGdx&yD7WrGh-Qskj%3@cuYlIzSn4hoFe*i(|gsgtFwe;x`B%c7}EBD|qSAUNIT9yzwiBvXu~sbx5Cr^i_a` zjj#YUfUaIGv#o1Wm$2_uW>vYJ=&n9|UPDu}pPZP3l<7B9-jAa#>c_7zAooxI8Z3R| zzE6W&UPFdg{pRNG4$oJyK)sI#Tf$SE*A90H2F-M)wCcdt;w!#>gJ#G{m8mw{y1pcO^uR+$bZ-rTVZx?>K)oFdKl8(3qgd?HQ zpl~j5ru>0ePEDG=sYLu24)6EOsXz~q@{#jrgrM_f!8|pEATLPziKog}@Wumhbn_%5 z_L7b~^`-DN&Zl{L%Et~Bq+AXkO09mt|Q%t5+=$VqreIVa!nhwNSTVxJSTL^E0V%?$5@7pf6-A62}Nv% zFQ#Pm3##6hgTe6P@P2q8c%IHxK})1h1V^ed&=A)=rg|bx6h&2_@vb9n2xe89Cne3K<1}pGHfWvF zkw=3B(W}j;>h-0M->trns7^Rjw02CtSq+F=PBSxyR(Vu@l5jW;h_jTRUr*Y?4Qcp~ zdTgpz?ND_PEr3G2en`LbhVJpSQDjWMFR&d!Uhy0o4n2Hd9?NDp`xaa+5-Y&jZKOybtnIZ5bYevXr-cr&`A{>rr9Z zTsFE^DnB`qK^*Oe0v`4spSgRb>j{|Iq4Ba@yB`({shVjvRBG$ku)k!Ug&=SZ;&dta zSTxM9wq+REK+;~gXm3AW`Q9`}S@IFr=d&U$KtB*0e65zN1UUyk7P?fB`#oY0sdT(f z&?m{;!m!l%M#qC^^lGlIZWNi`&u2q{-d5S=Pd<|X?OCS;ylB?Gyi2!_4l(-gx~qNKdgx7q%-g-_z+`LEGrZg(j zfs2Ioud8$(Z_D5G0AuC@NxR~tZy*U<=cUD#Qq5||HUpp0^SGh+Ucw9z&Wd<(JorkG zS!#k(+dc{-sH>%jrOBo>lo}Iyk+`_%gwoPNk6o%Zm+LhmdmmkA)&!``jXNIR1t|t| zt2_R|g^CT^OQz+O5Ah6Z?02L0_`CKU@ZM}9=jvq#$%6^qjSWXRr407@lQtde^i*w7 zFuU<5X%lvnKI^6P#_-oW)6+xK_naHobyfR-#DASdBCiSQsQ~OM6yf6m(SKqACEjgYH7;Nw@^p$fA_w{gHre44Huy7 z3n3o*j6)k`W~7zRljO}o>0h(RGi_Fk6T+V3@)|+M7xDh;s-$Oll)HPFMq+6krt10g z=dS3&j>An=C^2`#p&B4_VdH&08 z(9^xXVM$LPFY@Cs>=y|%04EfbrBw@wj_2Ptw#Sw}soDt!PH-7F+lBT9a>`zR5ou#F zF^`rvh(={4fF2+QMB9_ z`yfUAvOKJ6UxP;*9J}y@xN<-R3c!U^&2xQI*;^ScgW={X9xW5k@USN2o;-(FD?&bm zW~4fQgT3)ODfc~X8$;L%;wbdTTNa2D)oJoJA1<@NJHJ8- zO4h{4ws^ahSW%}hN|Mm3nagpj&UD4|tSLl0hFgM_4}{|8<=+901li!@&^Vi+`ByesJKyW2~>)C7#AOBs{dX z&S|V%C3D6f%n`M$Li0+C7Abyzw4p{U_5!Q8-;$DCsCJp`0h21!<>c<9kWopgvi({K(v<9vx;sqnR3KS+Blhv1{>61{nh}-zJ)L;sMol zRA@h9^zqmCH)OnK-xet5yK4YGft)ifa3pv{;hjm96KujK6bL6SxwLA@PIE@}Xy;Fm*XAA=r6rlj z^4c~dpVuD#Aa`ZaU;7H#+dCasOIl1~zH-8HKvsZAseAHSAj3iAk+g8(9`C*!?vSvO zF}v~nD~Rw$P+gLYO-W2ldisUQ=Ey-bcw7vqZxf}!)USnSjQlBDRTKuoPD_o0p|(Gb zt@++dmk~Y%Pgeyt9~{V*r%vg+@p>y$%Fn(J1tOoMzI;`Hsm0TFYK@doage(q%7nzH zefd~(LA@b-$du9WvU$>iS@nhx5oI51=e=;mFegodoX|T$3_i}85T0gorlD9nL)vFk zkww<}?ZoYMrzL6Xh9`=0YygL@TMivWl#-zzr3mfo6meWvdl-!zw6pU?CrLUi{M@Le z5n|jaT>*g9PUV6oGR0DS@-`Fjs2(Vp&e-OE-Oggv0mvbnh*i3|fGm zQL1FBXAe54tmJ{yrxPx` zxkY#2$0WL)opdquFj~%?p}~Pz`ZcxKg*@$^y8M0Ju+ai=nT(q@r78jDU2*= zToSW@NGal+A4G-;D_Yi;D^KrROB8|w{d;KeO16UrSD^hZCwuS8Io7D; zPOi7OPP&WG`B6ya=Mc|@QXysW{u!*fd!Sq=LF7zvd2g*}EYPutGAl>$O_wVcW3^}>V)UWdE#cid&LcHfz7vc# zJGT9nM(jG=+B6DA(9H?aWgk_IHXF)^;5;ATwd<-H;-dbuO}kmBm-hWFs%<*d>8qdy zLx$JTicg;W_QX%7sk%)c%xvQivKmTL*Lnp<#p^*$AVTSj??gM{it=?c#Id*u00dyk zj0zL!{dlm=+GutKr!Y|`!TdM@SKw4Vk`h98Vc@zpjey(jFzvO@#n z@Ig$XrS5%4yLXk?!2;H?nm2T)2w|}|>Cu%9xBJ81;*GyV)*j|p@|9@HS-FHXRFzd@ z08j7FmULJ@g{=40)V#E{76$PvVq7O7bm&Y~K=_kKnmxYV8Q}DM826ywjDqzh>~9@w zz+N-R@?2Qgjv7O|g{F^!~1m+PO)i>pX7NN*G%%vlwG+5)<+g&!H%K!F#9 z+TrSy!G-;~C4nfoaS>EJ7`3W20<)n+>73mH)J45sh6+$vuDj32p;zvU-5jCbAJrRh zWMByE&`9Bvjs;K(Ak(I*sd*)4U>mAu2EIA|=)!z1xK)d(l1+(MV@Sk&jdI}`{nmk5 z_$1jF(XpU#^=f+3QodkWo2oxQx##lMRyv!?cQy1!Nu~;PNvVHw&%TD@v*&Pk z7b-XqopTATYO5{#Ny+A~NrM>I&AU}KoR?27;?S3?fk1sIaebmL5l4h+r^Iu#2^&yE z;aahL;bM&W`4H*8EY*HxvQkf%qRn~PC!enO7b?*M?@|fIjMkc2*{_e22J47Cj#&8$ z?RARn_)Q80?(Di!EeV+z>kx6gb=1B0#Y40fW5i_p@md0aQzu}ulzex+!)sBNx5)2* zMYa{S0Avqg?=t^W1n@pe5y<)`)j1A1i-Wm?j@5$CRU zSXN={3z@#8Y^6v+q;@@?>1`w%=teu0vhC2mMW4RH$!-Iic$ZwZGtWji;CF`E`>A2G z_k7Yfcl+Iwn2!_oX|dOr)2~1j?ra+uduWE3A9}os>Y8jPk1+8Ii86zG#}uP-S0WCSii z!M;SX*b7?X3(&fLlg&PjwSn+@;f41Xh;e`dLXth~@cQNp_z=g{T~tjE4l=NXADc8z zqCOV+)uCb9cVO1>W|HiW6X3+<+xNdIfY6d0lCIASa9(Vf%EHN9?+V-PC7|HSny?og zt{-0`{E_KvvaEYK_ovUSiJ?bq6;|JypK>(e7`c9q>%p-YVT%p_fQo%~#?wBM3;<*w zVVk9})x*@wEBSfMIOMg;vFQmpyY?{|Y0T<)V|MfAkF@GFiMT+2-)(=SbJC&`a|cdz zczZWFjM|>ov6)#b+>ZG^*qrOWa2dU`7CgGToGWcJg~PR1u{TP;y^APRmwioTTL*1) zkH-uS$nU?mj<G^Xy5Z@RB0%xUPeNR7*Ag4_L+1EimR_$w(cbTE zXn8k$H_5%vz3MxmZovpc90JoTRf^v-`}Wl`-B0x(i7>7I#%D?eE8o!RM;KYiqEZdp z=NQ@gzZC0?7q5Nw_e=p!v(l@5fv4v67!pMj1+T``?CqI8Cdab4imxc9Tg` z4p~re_f2+oCl?+-1_b+ZWMR&(6?v!Zlh%vUV?oxBzd92Jj2yj)ct$Ya0RWV|MJb{@ zqd(SdSrz1sua_aPBT~B;5B9+Z_MO>r8ZU|;lOa_F92>3hMEKP`F?>JSbpB8krD%yo zS}W0Z)UFjPMNUYnT3oZssK(RR5qoyfYXo7#E+8$tZk+BR9<)L+j9$&~-AD?^_vV!I zS$kc-HflDrrKhL2t)(k&H+FeG*J%7QKmW<~F;c<7T|Le|@v+^HuWDW#Vp} zx4n?3zVd?MjkD>MDu4yo5+s~Hpc3u}BZM_>o91C3H$Z1=`D2wE!to!YcY)U z>YXBT@~TcF?*ta<(3S@F?YwyL!iUD@K(oAB)tB!Up0mXfx+2bS=_lL}2#nt;2C%G& zoU^Wdxf><_D`e1>JJ7i45K?>(IqFm_c@1`hfw|Bwl(SRbo}-%A!kYq?@z{Bnl>1aj z<*^|7(_!zG+@Ve@8y=Or3EwRmd;1c~OUpPIHnwU06v!Lf0JfAPV^YrN?GEBZEo&}f zs)L~+ZrSqED0*Nfn(>Pxs~P;T#bKANaRN|MO+1dm^Gdp~7*sR*~x?pu)Asj7IU1g2I^JL@rn&phJwKoHv8Ispf5E|5b3jr~M18t>k$C(?1+_M8o zMgX)<5b`EdqHN~M&)7n(m7hcP6D6-9_H6)W_A2`7DM=7irJ?@PAJNtBpdk%2CjcGY zQd72!)X^K*&f#w+ynWZ4$K0u5C$PehIJDgFgBzeYe(KN$>C1ftq9oZtYH2sA=S`g1 z7V0YYC-b=M$^p($5i&eJI>;yAd)6G2S2rlg}s;R zt2^@9aQ@W#xroMwIt^E%H6<_eB7PhC^#pWoQ9kZe2 z2?G+>h{6)bFH*fGY|rlERS+>TVXohmtDMxZCRrIud|wcGet$~Yygd@PPHImF^{(mb za8%IDqj;7|p62}I=^om@SCY;1Gb@@n3~cpFUvxr!23`nX64&StE3u_}y0t^scgOuw z>q_jxQ~rzGyDLd4I4aCXrUs~Z;=_RZOPp1TW{;^gOJ?~PqZ5tA(ePRzQZbJB)*J5# z9}Uk$U>XQ-3yck=fVUICPqY33N$k2c?+@=yc;|UDP4=f3`W4apVH)r80Vut@l6LU_ zaBu1fE=9s~S@$1d#Hn)6_>KP%7*{l9Y6ly>vP~0`1%Wfbs&HI z+n=u9y8}Lfx%AYN{~=in%-Oy*?E-ziKX%~XzDmFX5JS~Dx6EDnAMV|COVV`nwSQS4 ze?53Zhk@kn_^ZAL|HHk15yt)9S||l#V?ynP{Et6P`QP2E4a6@0FJ8DSS3Z3Fy%)fb zE%xWDe-<&Y68>4lyN2Q)>kF8$f2{AWh4{z%0tendZo{to_K({DxLf}}avT2aApCG4 z|8W)maTR_8s{e5n{&5w4i`)Kj75;G*{(VOL<0|YT3IDhXz!~w6tMLDIS3y};kN*eu zioBKi;7MG^Yx!HU9*dU&))7DpouAXfrbl1k?4Z?~)@IEwjxwlBNfJ>pm3ySe`jayr1@#~seLUVPny zL~hCBmxjxprF*W=8+uP8AmsCm?#(9Ppq&>n4CQV(k&#Ma{Ub+?tPAuz91wR-76F@9 z_mUuK{$V@wC@Nq7fIi3H;jxO64E+f8EeG54Y`@>~RruBGS(6QaES0kQAxw0xz1%m$ z*lfe<;ls7ObaXpBnwPc}FFlQv#>Sp;luB;$He6YWwVRqAqVWP;u>s7<{sW-~@=!a<%(D3?|YSfU)Y1yFPFlIxhYcOj4 z;%I}JyyYe`6=W%X1FtB|-j7IJTO2WGm39_N6g5xilaVQ(A+NhmZMG^Vs+tZR@4YB9 za-Cx!Gceux9J}zO$}vfz;YB$)GmjCkL1hlFuN)yj ziO*odAdtMKY;W{HxHd7qw72Zy9=ws9e8OgV=jvvBE15Gh01^5c#HnDUT`ytGjM6?~ zCKwSZ((piW`pnt0CX6p^MmN*+D92lWAB_JPM6Nr9JWGkin-dabQU(Z|r}oDSf8*-r z61$V`x2h+8&C>7N(}LWMsPiiw5`;k{e3uV|>I4<1c^a9iOn8~-h^>Z`F5L#%n4;mO zPn?{>cNx_}(29-l?Z*?vC_z(L@KKyppVZ%g@0qo`lV~A11A(9fJ+bb=pB&KEhA=M* z0^6uN4$krW{qHhw?yIoViuD=l>KLohpV<1!M3g=Al{ylY{z_H&CF1ECKnQPZRQl2} zDX=nk))KP;Tjx}WZ2@Rfo+8Fj(uejctAPe_Ctc1$V?_F=&!5%Q)fwg{N>WU6lcS** z!V@EmQJ0FaX9n`1p4LAVgZ!FOxO}GINdVM%@WPhI$|--KPhap5K!#G;EwzRu3MB%$ zuE{?L6W4gVD{eDZI0NiX8|Kre+rDJ@@m6=G=Vpl8cBqb!x^B;GeM@-fvMrIpo7UbL z|9O<~Amzj34L`t4+yc2x+#R%#w4ihq{GYF5VV;-35As-iEgx%vhbw$CrJaMX4*zBW zGdB+Hd>_F%>R9csl;FQQalIUTikjMvv3IqsIL{EYgbsred3gFNfzLl zD>;8NRSso}LtXgJ!HjDzy_&v!s|-iDMWl>aC7ovdFBfl=NNequpfWW_#ZOJm^ddFR zdT)o&Pce!%vKrwHBlvp~#*Nzv#Ez}EY^D_3QFnSzLl1PF{x0>90JT=`UF_A?l3_*JW>qf zHP_1{uJyOi%k%)!RS5P;Wx?N)rsQ^O8LafM*n{}~bx*dn zuS!s{dEE`5FPp8DAW-h=T>l{S31P6a!)&*`!~Z@P{j7oiDmLj%-UbtPdjPEVW%y52 zaV~a!5Jkmu*xSdvIw7hR8#6`QA?t7hj0#qXM_fI6>C@kg5nC3nU8#&!wGK6n#_04n z7B=98LC7nBrPVI`!sdHeQl$4mjw4(je&uHW`&X`A#fH-0yjzuGLIMrir;{e%8q zkqjmOW(j8w9@+VZM#zqCgqfZo4@ghM4-cPX0puLHd3op2c?v#j@0^Cq8}5L~C=?Z( z+r>CD1(ZU^lo9C~Udn@N)!|0MJiNRrSTq`)$UZu`=QwBk@w_9YzxJ8A1bx&X|k77Wha|B<*uY`!d{2zz(fjssD*((wZ|MyE|Is+MJgxRDT zx+Ld2-xHQ`uNe#9}MnaZ}{mM1!h3jdtuP4m+gP}x+`aZ+U>mkN)?Kf{Onv~gEU6YLXnfm+Z^&Y@Lckg5-iDT%) z_uiz*ts0(*;0}M7_)_OH(>GAcwwTKuHZ|u7)d{c3fc00x{)>+SCA35uZgAy2=yYLZ zXBDmP#5*{Kk+h#3T+hV@%&bnov2y)Bb&K$E(UR#LC@;SA>7Is&k9M~yPUliQb%$CA zLvo$WsTn|-?g8Af)GIy!g^E)Zs6O6Tr5fQ*qf$P|Dk=aTi<*7UO~U@Y+W|_g|7`~p zTnJ1KJ2#{oEO4h&lnU0kr48?vX&_6*%KK}#R)OiDXc~pKC`N=){47JlR?<41(@%W( zR8sAJ{DJ-H7mBk7d^`x;6_6x*=FKiLED=PGdQIm3pmZOo?5z5_^Ffr#?>GpNWXm^F zJSXi@T%+^1huFV86u-U32WQ*udJ@D$Yq{;TkXn2c0@E0+1_*PAmVhHv($x)>Ct z+Ou!Xr0P1KXaA!2f{^V%LKM!fHS~<#x-Ac{a@%G|r*(Jt>B3eMigvQDr`Mq;bKRyh z6CUu9*HJUDi%E4GNxQGeRb&4YpccP(>Hr$taPzsjcKXL}0^|_N0Md%hOkVDnW&9sY zI}os2^l!JO(G+w!Z3Cl!YUo{KI6LmJI?tz}j^fQdTI;P#V>}ZH)s8q8@oR|VsqGEi z8GflHDCgwpi)TgdA=3yA;x`y(NVCzGU0n2Bfmp82RSMD-+vq=OJypPbijz~AhbM7* zIqUk?PQ~P%^O>9~<7dFMmgtb)N|QJfgy;7>me#6bahbC=(`~&eoKEzWX}nq&ZC0n4 zduz2)CHgsB9&fFl;TNjsmdOvZnGEVHcl3-V@wj`Sv=&a+kkacqsQ%j{IH3GZ+f70D zV(u+{78$3P5|Ba7i)<3F>g$QS%%GGio9zZ=kXt=aSH~|R(!0L}s#BXF^Y9TY#Nh;w zjEo&O$Sn%1Prts9>rbt-m=b@8b}00EV${J}@tR(U*ZjKXXXCdQ|A-mYqcj9l=0 zN}RbNTn4cH7D{z$%O~xGGxh6?dh@g#@wl0ot)0!i{=GStDEU)o+43nJmamG70i~M} z2V%KYA%AaSHjcLls01bs1MLa`M#kN07x-!BGi-J81n2WG&I4lq#o%&T0~Q>vXkzf> zvxi|1(ry$Z#y%DjTFwYRa+H2lo-85PeL+ur#ST3ubn;}nT__u$=TZ!CFfUWX(ab6)=6h#4V-Ee@}^yk&@7WB_PBPD5BtW6u2JNJ126ZXBy7m^56lVgroYuaat zHptue9`K$X@Qz7=!0MF|7WTcDgtbsJ{e|aSWxe`68p>h^ki0Q#jT(7`BUPebx8 z>hd#^Mz+ea2#pTUfjoeb)CRP~vFVX+@7Sr0nFZprk$A*eQR%*TEd!gKV)tDJH9)5s zs^}+9W_WE{0IinnLAOSc;7bj@q!kNn4$JR!Ch+v3;~TAD()KF1^&i`-M{j;UO!bRSxIq8;fk^{8%R#g#_E z=RSDSaHLv`4hKoW3_u=FT;{%$au_xQ8dpx*#Hd6#Ty%3L%vX#xl4?p!KYQ72jYBXZ z6MWYosdupp9M5$tv6t%v2>N+a4Chj-6NawvE^GQPcq3)f;?9Zgc3v2H@fj-|ACHBI zk@oXIch<5W9_!+i^;6!BGk2c$2KYUd%BBSCc(+NmnbZ$6UE!4Th>OM(<$d~9#R(}8 z(9pT0-}t@mOPy`KM%RahZ%48B8OP}2K7aN$^14zA#}fd0@*@S(Ngru-b@i#6t)B(l z3yUVt7L?O3)pQ>1vh23)!p)>7h9!#3<$r0G5EGSi`Tjf=L|^$_607Qq{rVu4 zFt{SU{Zo1Ef7rD{22laVcPo4Z3OjT2awJ~CeDfghMHWZ=jf_fU&n~}XqBjy!5T4|# ztTG(0gNS=u__BliED}V~3GNGBm`Gnj!Pk0seT@n`eCI&ICi7gsOcV2y47b~7N2)qW z(R->pmaK(u>fp}YizC{F@~Ec_VC!r63TE8iWP~3)cAXR(7k4lE4MQTg2yZVz>p)W_ zZFA*jNcd|1nX^`~=Qp5Pp!?pMDRhK}i1V=y?Xo`Cbi~Bb4(+9u(YBp$a{Yt7)a>VI z%?B|rkbZn(03-sP*Q+?|(7ff@KJ=O#c&fs=Ry!tHqK9!;ve+Vn)QIorXHsb$zM73p z(SBpI(Ft&dbsDck!EJEp=^6EhH=kDZd*2qv%4OMFz_o-Su#I~EGcR|eAl|&S=IGrX zWc8l%tBv=zcj>>QS_1As{Lt#QKgPAVjk#l!t_WcjeB5WHEdWDWlwa6%_A_uT=p>2^__Etz?z!I6qY>&~J{F~1yt{zn5vM&R$$8*<;L6Gn`u;G&GJo?-rWG&ru; zO!~|#YLs1-X~mQ@3NPBzliSpKPIy?}TD4wy7Pe4Q;)H{z{rgbeu=BvKJ~L2ziP#ic zCDxpsj!zVy9xgjov9mO8W&J*&_kL;H(JBg}G1VrayDq*LZmeUU z9LEh{X=MO|Z^eBSIWwkfdwRMc=4u0?AmP|$THaG+zim{15i&x#^~pV+DxjD7cq|?Ed_IO#MjrK zN^&)qLv@Dq+P=hk>HE$NU$wA+fiv)_>7ZCAa(m*Y{72vRJbkez@AzI}^DV{A0vdgj z8^Xi!cEAx=6a(u}u!Y0x)38*}+S8}+m8Dg=*<}?Zmc4jGQ8CH#p{+#KwS7P{I%?#c zO}dpX>u=IXZ6h5#OnffDs}iXh*BpVbptcJZz16MzW?e&>30W;IY+C`i)~)XwLDrLl z?0ZECn2Ho{Cn7UB;sVgpE&4YiZ-pt)S_h~OPYzBjF||853n-UPF=cXId%JdUk9*TR zGNp4NT-hSs&hU9UsLz@*gKy4qfO-1tuu1|g%D?v_d8P#W=5)g|P}_s0W(1~GlBdPx z)l^m(Atmr;&)GJ`%se^~%i3ZJjr!WJ_N%g%v6laT*z$k-)ruu23S0xA-I-oBlOklX zS>&59@lH8M4ra879HXj8hrjyt=~2ajGdU>YlJlLr@083M$C$XJbRJ(Td(^|PhmdhI zZGGP){Ha#CzNa$1A;!A7V;_dIH$@Wi==>m-Psd(x-e$bM-646(MGq&rGHSVPKD}>c zur_?HmFb0illSE7bU@oi3f+jfCqAae&3S;l%O5TWx#_&OOYxlVZ{p^ZcPc0__BKnADy-Vm zAZsbCh0S%d^H1=EJ}qn40(*%h6+78D#lt z^pTYzcEEK7`R?GM{xn$ayoAND~e)_h; z(ln_*uK%tcA|w{m63n?6E$Qe=NjE+##>gSdO+34!PiR{L`Q|t#iui0V$=S9$LK<<^ zVP$3MEMrieg8MT7DR-AQy`2+cHN}}B(u+vFmi1(?VN?&diRl-c=cHH#b^r|?px1z7 zK~#fo0cgU+ort*CWBal+29i*`=ILG1)s8IY=zg0;X-)}!B4jX$Gau@4LLWIi@#SU% zp?`BI;f(c7yq357?MzR?xuk1_$Vx{}gs1v=%Sh4s0}SDudw%uWU$jE|R}f#2tT>`) zs9;l+L{xd)_;xd9=R3A)QwHvA*8p&%F>b8@$F%4S`$WBrjud2qr!T*{``Jg8Y(qu4 zs~7HcONNQIBl^b#+?s)X8s2w-5;h4X(M1U%f0WMwN+eA9$K>ea4&b+z^{T#?)`=L-bjm$yXRyVEi5_=!H(07Ld1bk= zN!Q0QIT|)f>`d3cl%ez`X4tjSwf?3#3H1ZIfR5*qZ@8bAaY$tuyL-lqzwUU|B`N+Ge3VJj26X z{N~5mM}?LOZ|jMJO^ZhX>w&Dd7z9qD~pr*)+tv)=GoubT`yHb6WVuUnN={&zb% z`9y)iX&qrO#K}2T2C~)wc)xFtcj=(YUPwRyB*Jeppl8Yz>!zLf8kZ_-!p$#i)k%p< zh_L>K3(QDdf^0PSSopazpzlmi^5x7|kUDP)1J1J9absDQ&<*3-URROfN`9Sw4RCC} zL@Zk#a;R@!LHN#fZCl$DAw1Z$kcQmGiI; zJ>my1Q3~ED_plns05t;rS3!!1Hdc^N4o9Z(|HIyUMm3plZ^MdR2CxAt&4QxR1O%j` zs0c{008*oLgb?XHQ8|h<5fG3X1Sv|1w1g6fNRt|R3nU1H8i)``2noq^bIyOx%sKzj zd7k&%yOwM5A#2R!zJG1+YhU}?zwKQ9!8U%(V0x<6g4~(NAg7;BQ}*eTh9n=6R&u;b zizGfiicw2wK6oqX;+?IFiJpJBss!aNDvLafu$E*@XUa;gDcw6fNxpmj*xo*y?Q7K& zBG%_N)lD&4EEsiZ$7uM3o8WiD_xvAvBKGqgx$^0q4f(dMj!l$&#}V6Gw^p)Kf?7b7 z?Bn`<*KDJXR~I)6%ljB@-+u7Jg%ifg=U7-_)j(_|ZL|$M{_Xn`#nRWu$H8Yht%mk( z8Kn|Pv+8GC*z6F_+0ubL*|wcy=U$*t>E9nR3^;fZI)j-b_&{2Ff^Mx6s1s+38PJg0 zz`S#BI<{%^_4OA;zdbx|huM@kA?V`9ncEuJqv{?1*bx%6X?TS28uV>F7pjn_JFN>=SYXtuC8YP?LOVSk%01=+cYd##9-l$humS^BFbBl?4j(lU3D?mAk#v&d4v> zGa^CXYlg^A@Ma;FHCQ+joXVv416U$7iAX*@;vmeC=PW*OqevR~+Czt=<#5g6NarZV zXYFE_!E!d;R!@EAb&$3qO33{l<|fp`qQw03b2fQx^q~)-R2w%0Wf&A=Yin#-XkHn| z&Yt_l9^MWu)SPY<=$mg10qW>}Wz0k4eyxrDXdrus`&2GBmV51cJ$F>M?b(Je=@fg^ugg@_AW96%-bMu0Leb5rb3k3pX|BQ+J&osQXT6 zus`h8oLO0+g$iCgB?sFvndF!r#jhRJqQMJXUKD;ZL|nM%1Ns{5$~Ugn6UETr(TXAH z_-E4I+F<JrO!{sZBu`rp#{yXQzUo%sd3#8pdDq&g!D516gI0(O=2qP&D z-rLQ}kxr|#+1}@@@Id!bOWr{%MR17ll)j>VQ4c#GAt>Sq3l4q8Jgc94jX^C3dA++Y zpc6u`qd()kG;!shi%_|w%IK?hAFm7c2sNe_;`*4Mt~MJ;o}zznt0t#^`RwUUY(38& z=C=-esO1};t`=Yy>OJy7tl>=JrkapV2{QQ@Rf*D|^a1(_O4Qmi#6Z&IQils3?eB`u))Vwxy*&)iPC|V$ zEwVgTXo2dq)-e4J?DMZ@+T7UDFg!0|UAK9*J1g)~hibg%N?5aF^EyDa7duZwuDDsO zL;Lr*9`|H<41OT9y2apaLDLW5u4{I?p2Jz+na^@q&^2!v=Xu;N|7pyV`t475?^{>2 z4Ozc;_7C&&`>bka{I=^triA_FiVbe()+w4Cgjf_jyisgB)3{3`xV$#e%yCT^7G#2E zZJ^7M8kDp%%PAlXpPa)ztIWVJ0&Nq6{I$m+hSEXRwfD37fxAY_ma7S9J~@KbodRD1Pv5 z&vk5K;4~MzLSD!QxSGobbFezMS!ZG+W$C4uECe%y6upTytM+luP-`*dpq|#Qi50)I z$SUvVh15k0%OOWRDi4!uRpdXc^#-Rw-RaAtKZ++Ob^n^9BFgJpVp_My5~o zZ$utlz75STQX7=mrHZ`SMdaZp$4Um^E2W91=jp2msnPS4X_rQu?d6NGP^!M|Y^PAB z#bCnl#=gFi?EHyB6kj8!^u1sgFYp0&;J4RKxT*>8!U)wCyg1+mZId)_$f#S)vTaW2 zE;Ea}UrY+QmGQ`5l|72S_1S-s=cFiDj8I5$xi&L9P-tA%db!Aa?V-f|PqO&8-=UEr zpz8i3huRJX`o1zqQfx_40LPkLfZ0b1piVSJez4k1ZmK|fMs>5xt+J{pYJm#Tb;sCJ zR_50t5;`VAcubnVJa3yUH|2L&$|Cj~$ANSnq!ey6JlVdPr9Tbch)*K6ICdl-LqrOT zw0O|VhimFYpp95! z1Y1d$A1}=I=9>C&9}3lp%WbIG2kC$0#Fd6Ix3UvDBFkRbW*jGwt*OP{T+io(zV>Ex z@8WlR1Kq9v`vUxFOKZ;U?^|U{`+f~FP#Si?+^tCVzus5n)!aX;*0vcv@%~%#v#FMp zj%W>q+$)3Z4)Tkl#4}@_Y3(8wQivf|o+0G6M74oGL&PX|!gxPfDbq0?y_VG7#Zr8a zU@VyiwJ?*HnqOE#v=EFYi{8`p57>cIhwo!|&BPJEy9lHj7R3jF)XiQI_+$b`8%T!1 z631m>Yn9fv{W9#RGarQh(hmV1|AZKj|4eOA9)Xm!oL$JX?>KbANZ@JQD~+>~)V^M} ze($0G1P1>(@B!548_T;lT@Yw~tLpM1n`%4vMa+5YY!6Af8&RogW&<_G@jaaU1$nW9 zM~~q@yZv?@>^jRK7Bu}8U|$2hX1h*SUka8@zaGKgtcSQ46am!|$zuH_Ao}xK=-#n9 zR^^k=dejMg@qyaj$RO{aI%B5Qh4IJ0#&~*z|E+wWNfzqEmA`zCH(8o-9)fRVfQ!fe z`?vq&zdXHj7$DKgk9CXu<QOw?F8#3h6>1wyQHg3w0Nmm6C`+ zD}#f%>Gb~9o{-(#FZHD9S^>=Yd_-dg>9?9wY$=I5hTy{~}-VNvEfd`f+Nyxxz! zNwXbYUv{6=M>WUVi(fDmzl<*cFI*3g;k&ogh%esefF>a6~ND$Sj|Bf5b}=M+~odyK|Oh1lZ2$j<2+Im(#dYB8HH)sR~~ zxS=j7@BwzV@59}KjR(ePwaK)Kg{457)rG_PZ#u9?D;7@L>&Boxl6{D|>Pp*R{>iZES@!0BRR zw&X+v=&~I6(Ew=}hP?(lR+zBn)J=+Fa%;wM>*wJ(QaobZ6;PD|99; zv~k8zNr^?rT1-mAYLKmT(MghY+HtWozpLGz)s00-p}Ss%4T41YL25JA*W3DXS&5j{ z=VgUJ$DU>lw^}(hsf6{W!OmAemfXQmKXu*V$`j~%kxHX9lojXHoq7FA|5F^8e~*xt zW~6|kdM&Gv%+FOI#>=g-I(~U$Hmj!!t40eFWG79Qc*Zz59MXF6+p8Ly@WI?vYW$_@ zVlt-e;l7_9Ed}$Zu~ri-Y$6kR;xb%AOM@{NP2m|#UK%KOx$;;Q^W|Zv&>^_STm`e> zhT)*srWUt)-s~D<&FXNOwS}X>vf1Xn%_B9qR+izAEl&UIWoEII{J zdq(bsZ?C7$1SL21&f`=;V7#JJ#l`Hr9j#2A0`7*k_gWg2 zS*jpzJfoB=-Q?&4Y0wzMnJuVU*fIs4-LEj_)qAt{IqQoa@AipRyVGZ^q5gJ3j6jVJ zWP;^_B8CNXZqt_|Boq9HGMPW zgBP6b{6thvky@sCwi_@_Lom!ix|wrT?ONQP14x`3&Q*mDX=bl#6T;Hf239HE&BDQC$Q+jN0ZZ-BfQ9F7jz1`W_QF?#)slV7MpSt(Iv3mma*=6lI z>@l{+{y?cgP89SJk!slcGFr@Z!Y zkqi;Pi(H*z&5EO5+NpjM%iTp_+|##%cfhjyo^>mOlpwqF|Z zJwl76mM~@Re{U3i>+&THy?byq_JJFVIv&C#65Axywk z5VD&LxT#>3xqyg{xDw)XGkT9>Ee1*iu?0nfS8v~X`~Ai=crAA#$6`qrYia;YOq^lO z0gXHq__e9TLP}2DHCaMD$~|d$5ovM#2`n)!v`}7? zJ)IKwap#OUDn(F{x@k%}zVerG`0vPOXnp4e>td;I#bVp3OmKUJ;+8Fh!n!jr*stvP z($Zp5XkmQ5_x`bna7%WLl1qXM)+);zzgF$D_=YQIP~kGXEQTGtHnsi*#8wzK9*$Kc z$DNtQvRe5kTeQhhc9m=!i{J&*^!#suB*D|vk*x7UEh(EFKm+pHVDZ}98r~zTWw(gM zXyxgsRZA%u$E8tA*=lmvyWl$a;*edOd`H@>U95>R{c9|XgxUGouj;<4aTVEx7akiLq!q?t`SxewI|uxwrjC?5$Sl*A zf!w9nKvs1%BA${L_MJ7Vu!G*I0NOU~^5&B^ixmcW%w;EKcqgt_D1^}|oQYjnL~pTe z|29A3nMDc$V~g)u)lmW3>4Z~i8F9?B|AYVog%U;sfl`)&x$qcew#p&%|i4EBpfXjNDdy(;KIO~%Ap8?MjqaQ6Kr$8NX!8(nUIg?af zoys5}pbb?iw)VAT9MiFTqA?~YR~;2KWSi)>F`VcTIvk9O#$oL{3s-LhOJQWFTs7?D zSv(^@U$T0Bz?%gFbPV(WyZw050?@ z1ZboENg;_qvmur!y&1aEwLVZe^Zq(=9%G+eBy~G+W3o9q`dc+Q0sPSyVLkU~d&~Z9 zV^!X5QpK1>1>6zK3j~Lr_d4C#o-?b=gW7^7XEZhZn!kizN)Pzhb*|7d`kE~Pwl@3h z!q4Kny>H%aEj4>%VUjb?P<45I7FTVd0GSxXBcN8i)_5JhhCDXOu>6 zD0PxDSzT@+odNH<`s#$E{bE#dZoa zX{X)4?1Q)2JJJB}YxS5(qGZ_sK&Cs_kbH^FpR`8;VE*_3ElX}wfswns zdF2dTy!B&P`IO5%Lv+Wg&J#s5ZZ&^TWmwy;8GzTk|9x|XDcjhimnfy5_z#3&s$na8 zE>OJQBlN9GN$;r!3sn zAgDS|MJb+jzy-MIKD?;j66CTnMXF@7Q`s6CVJStJkK_7un>soWd^h$Fj>Uq?>*ktj z*~dpua{Ux781ZqOscZ;7#Rw5$%Wgp=-l-{ll4q?qG@h9(%O`0qm?o&vNcpU zUA45em-?z|^mv#E6CW9cvpufIFJRUNBG-X7IO)MS%>8T}xk7HbJ?Sp#UNWt2g4hA#IfHRFi_+iV#_z+Rf8e z3em?P0Judjrf*@+8eD$SL}&f(Ml#Ivc0d3SHMui&9IrQ1!E%EdXO(?skKWBOh_E1| z71i5=G-`6d>|mehcPfiVB<1u*4Y3ltK!fUl@jXu+cJW(X>=iRdIj3=LU;#WV3|pCN zFQJhKynt-XiviHWu1B{sY@4a>?YBd30PJZgC0?Qh21KF#nGW?4m!>xdzvG>r{&P#d z$@yF`T>5eGKA5$6A53fq!nW@rq&X3*#}D-zQ&0cZf&Co7pEt(_Eq&Vj>OS$aW|8EB04IwZuC?6_<-DR$eH}Q`TYW(Nnp#H~^SVAXUf+ z$eNSWW&r3iVgd+{1%i(;(98aIx^0`UsgeIn#u)WFfuLk%hOSNzvsGi_%Cn(WKe)LMQiEKv^gjV4O zfAD7i%xOBk9}BzBzR~x01BgA~WPYe-NK?5x-xLe<7w-s|14jVbJDoUrtfAM!hy5v`I`qk(M$)J zDdDD(SVMKnRZ$Ivzu7J)0Mb8}r%NQT?_DvWmT`@YugL<)Y47L^LGon&$8U{{xc43 zYH#+fb9OnNXNLZKQ(WJbe56AX(DI02j-`9q12ZP$Lt0p7Ql#x@l}l%?P%R);%D(r# z;ONbC&dzA~#gkj!OafG^YN6nt!b(Ufk~Wu4RPtRKeX9turivxfbjUDj7NvKbxjH8| zF<$@bRd(AzU-RuQx5JR`UmBjLiFCzF3c64K4>>>BAjH9(} z<9UtXp(IK6lLmMG~y0pn)Gp-*e z8OjZMPOvv8wB1LGo9z(F&OPrhPrN-GK^;f&TOX(iSZhxgPIJm3OTh~!VmJ$ zX}$*6KeGYK1ranN^Cv_1SBr4((AJxYua&lb(?dk+Q>q*iJ_2!F8`0EQDJ{qsN+k`) zNKn#)@@r*Kw$aL$s=VebbI$_(vNYT(DfmYVmK)6x6B#>r+S3ga<}`?rhS4&lbAX9H1*;-`Tpt=YJ*kW8%~o?yRwDb9jwnH&C{ zX9?$gyG=)0kXDm2Th26ccz& z?}anZnFHi?E+23ovlaLWwBcpV{*fv=9Cbv{RQ+iBax1tQwp1F!EC370+C9GVMEyK_ zl!9&kKIR(@0@`BB{x?8nH^6FnoeRD6*|xC`?>2maoVUvZxlBFdUK*!TR1Y9 zHkR8o9wZx);(7;DX_;!qQbU1Djp3FhbqwQtlm5!6sy=!L+v><7uDpfyb8+5CnYo9qftgt+l|9+{ck6j@Ydzymc)3-xpYEA3OtidB3|yVm#=I53 zg9wg0%Zn8&u-?2~Gjh(v8C5eNaUDdm45qOB+X{<;FlWoCmFinEXl)a3v4uLOZj^c+ zja#L)o-Eo#ZK$we^g`^`3A6#If$k4?bK6%o_Sk)7T>@Gc?uhkj7_Fq7V&B~{e2WcS z82mG1^)!=%_uzbHu0~S(l)zGoTa`0)0!46l++rUK52cd(+)H=+76miH74WIDS#^tr z`MZI{HJb!uOG`03;1eB+gm!C(>P2J(88#zuU0O-;@I5Rz1&{|O77VhMU}JHGi9t6` znDvjp-f`nS{K)#CnoB3p1Tp^S?(tL1K7bg6HVf^^?tR==h{~N~Hhd5hg2V3H1|+8W zoC~Oh5NfYe^dvojednCmxzS_VyPD*fDjY~c-VI3AQ{8ZC6rfa-N<5{itr;4ux$rXl zTrT{0i@c`=tI{%E?QhoZ$X2Ak*%~k2i|0OOd9c7xPA)9YK=~y5Q`72Jg5bhTD3|cj zMH~t{ZJ1gyUATJTx$Z?q2a2yX1LxqBlldVp2>0F6p(nQ&(1#O@?X2Qdy~xAhnHEQo1k- zGN|BIGdDlm^-e1pg=|n~kc4v6m`P>#2c?82u!$x+k%*e5jn&Z?uPf-tz=<%i^mdYYsc8sgjh-D-Dkb7jMMF~P&Mu{CVP0#d-k>^jZV+PK@K=ySg* zC`E7Nr%4{oCz_HwlLs=}1EghF%H5Zn8p4V@1}wAz`fcJ{=n_B%%{UVFlSeB(ks9QV zq{At`A2wD2&PjQWa`l$64Ejb?%9xra% z_=U!Qqm55et_a+_1jJ90`uuvLkSS^Nvde{~HjUwa-(%QE#4kku?5qHL=HtP0Ex?(s zP4{axlX>_>z!|0DLpoYH&U~*EHz5aCIj?4VcMAZ9W0=Gh*O;vUedi3w?_1;LfHt%i?rZYAkSZXTD#0+)fu4xo8`U)X^)4pIL59IKgR}6Ljej&EljrRn-M9JtZjX+(Jf~%1rAjL`|H$wP4 zr`w|#OR$U9LUJcn$`*Y_%lWh-*L&?v8{-F=r#o3aa{zQkY=Mu_fQ7|nKzZO&09=3J z;`%;aERI}_Slp0~6f7N(#jwV*W0-AygN7imLrkL`f~JQ25gIS1e{nrIACeC(!IXJS7F+|?E2rlzzxkO(5$5SDlRY7 zm`@bYkuf(umOKF8?Dy=k{oA)l(H!1A3kdt(4Y}dKw$wm!zy7tkg3myHgx_LyfxpdE zB3dS^xru0MW%%N6_U`c$M#$|O1lDrN?oW9eZ4s<({|d?f81sLx&hgtBI;WA@=l^D^ zPH1Kv2P6oO9@zcOrrh?l>Bu?UnI(b4Iu<)yuaCDmrX2!GXrh3OPa|2nGSl*fz2L&l z@!8Yduf}}F&X~YfZ!@Q6_zSc0of3XHxKGP_0WiWc%%xudV9KkJJV%!fP^tZa~A_8f&CB0fXkYyj&dDEWeQ4l^Hw0qvWs3fp+8HIbll9Jz6IuJdjBk7s0{=JRg)?#(Jk_gx&sGmimBX}4$f z_O!(WBJvnJ>^HZ*Jk!Y*wkofo>fH9HhISnD{@wlg8j;SuxsEP8$I!NF7Po(rxHxg} z+??X9KG5Kni{ELW%z1UTTMgIMph$4_3t4kLX=Z|Xr?)Uj>G>#cG@hM!<2n#JmlST< zO7umKTRSZ70ZkNsu=_u`?{_`2ePd}%x!JnjH=?83D=eoYxiRxP8PHJL+D^Gl4k#}G zq06ffs=z_DK%eM#{tnye0<+~=Tf@e1<9wU%+&H@hjEu9c#Qlm2CkqwsQRUs-qYBF2 z^G7=52CZvtuD7=Y?O@XRZ#3cL9Qh0HO2{3n|8C_QR%E4!h1Lhs!-+DsO}OQTyV%Aa z`!>#xqJ$vwP_Y&eM@pmz&Xqs&jOU?_20P_|I&7Cl{kH^St+@-{qhhxGuzaZV7!rJ; z_I54dq3 zXg4*wL&dj6_!WHJ!NF~2+JKj|;K}}N)M1OObWz?@Xi*-i#XYJR;6>)sR{$T{5=IIK zt%n_Nw(1JoEl8?ld@A$tAPm~;EwOjd#^eIlNXJqxwT!am21nWDVB5iWA+iJyX^Axd zFb!)#W5za!EE@;GfL)Qp4#VUx(iTVwT(qc@s%IzjOOv>e`~aEoL^7Zmzz`yjYW9(FU))@hbW9PtPA(m==w?-b_l2#Trwf`|1p<(C7Qn6!?gP$Z*8v*mV=5WoTS(@WcR6H*Sk~<2ig+$SpK@HzR?b~WLMrLntc9D?_T}Ko4P4MEl zJKvh(@jztr_M)>nku;0Xwhj8mnX3&n<=)?UhEIj-nBZZ&-|3?2W$H7}a<$8T?1KP* z6zCWs9mL-Bo32cZFexN&dXBRg*^ojQp!dB%yNVT7E1`YnHMNQ}Q)iB44!RYzgHcwL z6FNQCU}4=BE7Xu$>dyH%276hI6(?>oSzASTIE8IXBohmG8QLCEci1#r};5VdJ zg7YO&k%*vgeWMTKfj}*#iB`KA1@HnZ(`zYlXB$<>_jY=V?;!)J@RqW|V46@&j<^_A zxY#s#?fYq7@1FL6vkvwq$ADZWbR&*%3ksF8B5e<|GowO+CP|kr!wXbjt9HFEIQ|-k z9CJvyyf}rO;&!QF_nl;91MC9v3E-kv?yuGDF`iePVzodd_}@dxHA=&D!`dBioWX|W z7z3VffeS{tS(RP~>PD?_7m|qWfk#yDy)H0+&0LbOT!$i~HfgwA6R@N?`Z9x&z(~tC z&W`2`p5t_UUq^or^&p7x*rPW)Rbu2^aY%6YS%D2kVnIR-E_TnMSV{Vr-clW}xT!;Q z+#c;(D3!l-&U+dDViXo752H`&ny_vn^=0)=iNaD`e}bXB`Oo11sEo2!@g}|HO;WYj zwe;`M-=(~z_@{QDx8q8#N34$)Yc~}7;!Pj3rJTTt{K;Q)zg3?{E<_@!rUfC+FBljPyOi$X2++jmk(Lzd z_7D~~70Z*8FH*?2+Qiy?U}Q8xyZ6=sjeR|k zev~6xelcw|NIxtq`toI;wxA0qhGVh3mL9`|2tLT{=H1F}J*gV>10^b(-l>#yhJkZP z07LlGRKR?mGllztOp6AOHn*syyXt&GBXN!^Ca)@JwT#JOevp2?uuqqI4EwQmK<3Sf zOoDanG?e<*u(2!c#rtOYGqFlwAnl91x$>Y*UUAesd)+{VJJLZvVox}*mbBaVRIkNY zuCHLMt-h-y2bQYs>k$bU$1itf85+-lv}BJ5u;mAs#OQ}WcyVxZV9K@Bn0%By-N)?h z`N@)&AJ|$_Pe_dv7F}blbQxa3WEAJhUFr5W%e1RpWflhG6q3mOzMT$dAlx&1048zZ1Q&{#Z7+drGs+5^5LkLMwU(|y>R&TK^v2z}EpTYD{ z7^J(!hcuJTM7N-rVF;x~cXvM^l>W$73A+H=016$>?d=qsfkUU0%7!wY;e^f1|6`))LDs=@ zZQC|q3nBHz9`}j!LRdLTB4Rh9g;N~XmWmyYeHXR;Ivzg$eF4GG!)*Yl56w~PVJOE= zgZwj)+ot#zj+N4!}+)l9^wj*>g#4v@TR`k-HI(X(T zy;v(By@Yv?2regu55!%&QXV)p#=e_#1k@DNgo9`k6 zxe)bI1WFs-!X?K;D3vSmG(c??d6J$J6pYjs$zPYEUfHu0r{F%mJrLmQWGmZ8YMs-> z;UtYbB5s)O{ZS9q5_nq4th2TX+_=KqpY~CPO%Y2wAo<8|+q-u(!zh0CPD7+?cZrE9 z7Q-f_RA)G)l?P9}bIMk>JIfn&BBWW2z`79O!ikl++<7d&%R$yjd_q+)scD6MH~OUuOE<{dHJ7?$j2uBtJ}YDqfr*iA2C*pTBJg&@sz+eApM zUn#m7zd7G7Fvm5PgOQW-fF$wY-Hk?}v>n4|eFe+3eBeQMm0=&qqiaz5g2q%V{3~>A zKD>AIn{BmrIm)j5)jM{poWePw|RTXKOi33 z_TQwypNQN0)mx!ka9lZh9dntyNbMLgMz2-+yplh&vOptsXE~KiSq(^ltw?q&T(q-E z+iXhI*k2;taaJ_beVr)RZuI^BOOTe>aAFCAwh%u(C=VpDPL~?TD!z_Gg`*Y;iXM6& zF{>WmP%}VfQq=`E6d&>%pa#pQ%1T=FFGYQyN}=-~MI#CY09}h-ge$&W4=@u`dt4|K0hOBh5T1#rq3}pODMlc3 z{Tb)vgdXb<8FX;WBigFdW4S|iU%19=opN{4F z(pE1gI?Zmzx#ZrXLZ-*CJ5Z8PjTxHvNZGNuhipmI)~T-z4xAAwLamZ2IVVS8qkLP4 zy2fF~AZ4q#<0uA3=b|p&WeSf5Q962U^b(CFeBln$X9i{n2*9WV!q4f4NxqIn{$I~P z{9=EGD2@z0;8=~zxuq9cM&#S<@hWa;XpuX`e*_O?8J!aR1JP2rihaCw7@M^?aw5+x z0W)$|<12bC1s6b@PtxNf(MCP}>fDJTGa%tO2d**an|-TI!TN-|hP6aB|JFCI7F+z1 zBx>kXO1d)GTy$oj8R=@)SkJ4UToCNMDms)TM@rh)#V^2sp7t@UP8R?r-_|W07{H}zs`-%uaSjtljAd56Uyj8(@=>bY_Jl1M<>#n%A>CDHQ* zB`i$V6?~WQIvaNg1Ps%igfVQ?lB{G-y?fH3Zawx5pm02f`>eJ<b|FXuJhHla+%e53sBcyCO3?$>5QZ8r$2sq+m;n+D>e^nJx%}Oh*E7vw;Pp+8 zx3(adnnfniAJweBwNW5|eb0>?r)nUq`&Px*8p&w^DP1$Kj%6EZ;}pOXK(J_HG}C@J zI+{sF@Ta=I57FX2dXTWulxPER1Ru-Z2CY22i4WNwPq2nW0@EGgR=PGI6O>rzY_jtC zD?e6MQVqH>7jAr^r(HK}jZSm1YA3i=FQvYk4a z)leuMO#7t8y>;ToJQjqO=ZE%H*56Ek7~*RU@T>aIA{}A$c0hy3V>{QA-HkRY1yZ6D z3?e|a>n{)w`HnHjvjkZFY+tdhmlHv~cDWoeWnfQ}!$ValK5mV7sB|&M&SU{{XX-Jv zD&J_6q=g_d6VfzsMy~|2hH|NP@MqEZC3Oj(I}j;wgN@f^-POJbSCwHIJA5Z7VP6H( zsryv2PTL==lp*AF~D$Gl2ByzVZKM-K!psb69-n0aMMFYp@9T4!SYWGR|WTbLz~3;{B$ev^gap=ZOrmj`gH z_!>x@C%}^=Z<@WKztLP`Nt)z(;J3Ucv0$}gr4mJeim_HuF1?hN5Fj-)cc@t~_#V~K z*@5@P)ZJYzzJxdeVU!BUSEgd;YKx)lp51a`S+7)2achvefco_7RI<*}=$1Yr+w_7- z^;aT44uQphqGVun+pmR3WtTe?DW%yz!I<;sKGmVGz#|v7>aYXJuoD7#`Kp~ZkX36~ zuh8-}JZ@57aqN=75r9Py+s=r|vi>k?NnPhjWJ)#}=Iz~>*&ih=myNPRyq-ju}n(OKkq&qKL`}xnn>KnmpS)34Hkiqr?MZf&F6K* z_9CK+_MUoWjn%s+20Ykfj+hk67Y?hga_*fFKgs+SD}Kr>TmyB6$9xJ1uPSTE@0vYx z7tk1LRXDj@#2rZQ?Ag8_V~+=HR;Q48D6cit+f|}X^?i)%9^p@Hb41zW<=6@)!c_av zQ7pKUq1aLlNNGKWqe>vOWsl{`CVa53LqRL!-Zg+eD&c7b9wOqux=aeWT&YZFG;M6^ zjoe~Qi(0HyCys_xE*7@LO|Ik@VTFpkG3son{4`Ujf-F2Yv{cD{cS-Umg)&CIzZWo< z7pbAzg081_1%G@c@Ak>j$~y!x2p7-ME{zd84p#uah65_xCh@FhNBqme zV#4IWJKy**t>AG{GA zn3F8)0w!`QHcWIIbHVTPN^Dr$kylGxrYeXj@!VrJc5E&s&*9(wF z6m~qtxgN7{g!;xB>H>8r*$=YA%lpBz^eH)REuT@TDmT15!>F~Sy?#4zA4OF0WCXj` zxYpWslXb?H;E1)#^qes$7A=jfk2nqbFxbi!&oISJ0t5_Dq71h;LEki4xQS24Ouw*j z!Pyf5K=yk7rBy<7rLig0tM0jT%3l}np4;^_nZ+h@<9OPA+^H&YoK;m6lGyi zy#NH*jGUa@zH8dk9;jyT2>GpLxnkd4k6~k~96n8`#n9HZMQdBX+Fql(j219!=EsG47NKo7|oh zy4T#X))Pr7%%Hm&Akb%;z0gPid)*a(1I9 zyUk|4@5Ay?9Jc8rk9yuas#xHosjs((AyHya>2tk~b_w$$Yb`!s`+qz^TX64F3@30G z{o@@HR!G%!zYY4!DaRc+VZZeju7c(&y&r<*tytsf3ZK&*e7&6Vj~D-6DH)^V92~3J zGCTo4F*N@iu{|I^1x+7z_4^4B-TJ3rKlrEE?!UsmUvv1wQ}t`x{Mt5uN)rD%DZft2 zAI9^Sarl2U4x~Gd=D*(s@W(X%3%UIA(SNct{~OHwvOK>m&mTwTm*x3?v^;-I-7jnN zE2{b{OZ&^f{xYzCSczW-_LqVEla=`Yr*UAishvB};Wmqtkbs*fpC7pTN5CZh> z-G9Lk@eCTUxNB_$u{a_{754zY9MXKh|CF(2_<^gCr$$n&&mQ?fk#|3rgL#b5))7d}8A2 zR{|k=KWCe>qpq<1%)Kg64blA^C$|0gZ(Nw8$;^Q^6>9l!uk&c%QAuy`*~FRo&mQJ$fPXgEu`GJ0#({nWnTvB z#JgRO`aRpW_sNg{{1mtEovmTeGra!i<%}lxdd(jJ+66i5?&GR=u^cYnRqKD%*6cDo z>Gmz>=KXo39%GrI=bZK<;|A5h4Rj^RH@t3L9P@>#Bs1!7>l#Rv9OqNK@>Ac5jt2ZC zo_5RV)c^R)yyBf_4Q{>P9&*UVm0rFJGJ-B5tu0k++g0aF_*dF{Wuu?nxyyOZUR&Mj zYt<=-#*w{lwUy`PU5}isg4EPJKaoLL{AhE+>gV2<|KP>`!ADv*&~n_n|M0nGJ2P#s z+9OtbpRcww@3~e^Dskj0z4nh|1F{Kkj_xEDNwHKQBAGOThAxJce1>yI30qdCcPTjF z0`Cz^zK8=yk7`;~9sS2zkyM=A+=7zBtw%jwNtq|4em3Q^x}Uq1^s0TjOik|Hd2;cj zs*RoP2!@?k#H(rZ?;Ro!*S!7BURf&dDX8pXnyg%#n)$nLrzi5XLXU>O+?$ynZ~W#o z$$(HrCN+G9cYjI>H4=hvZ?tbu8EMmV8(qV`V@Fq$(Vp-YjLK>Z_W_2LCDBiZU1jc&Gsr1 z|6a>v?;CzC*Vk zx+~Rev_kvUOjU{mc*UlL4hr7{PW1=-d?%&0!W6j=8C`+CU6i9S&Ec+oq}c*GwOVAh zNQHgl+rx(qI|!&87|AvECC?vI_P@u%eQ;b!H$C63-ZPPUyn5H_`SaKN@|KU??pHHJ zL)YC6m4iRN94PEK(3y=2%E_m_8+HrXZVyrggum=6ar7*e_}373-EXboG|c z?5As2G~o^qJ~vL-CRfL;m5JvZ0{@U1e8J^^mZrK0TrF{QIf)W$9w>!E>SN#j3T;kAcGLwe)$47qelXc{PhiSHrV&clCW(nO4$E zuPz%LlFXR-?Y{opaHQUZL4XhC8cB_YbQJ&X_oJ=JC3zI^+slPEg-S!G7(V5euL;Gr(hYw3^mb#&gjPYQHpTnRgJ;OJ-k z#Xr_({2&K-Xzl2p$TaQ-A-9}D~Q8|rWbnN-_JC0NH4oE=;#$$$0)-+;?k zL%N{RQBEhO?6AZuwn%im8Mb^q&KDarbv_CYXs>??=1nO2na}* zj`SXS4^gVrP(^B_h8`gFv>VU4&pGFN-}^o9z4>div&mk2?OC&Celx!r%a@zQZimN1 z6WnHlRi=0HR6}{y!)|>WB?~n(ef8{bMbn1Z_w473dW8tKzuwuE+h53AjIDJq_7MnM zn%{hkLq6QE4>M?GaIW&aswJa`b@bH#7SI3gPF)Gfkh?;3nQ@q}8X0sHj#Jeoc?&^0}|JjxIL*Y*F$0|$Z|TjBTZ#$QWU^Chtr zLU&@i;^tSc&?k8YB=tp{i-NpzbrWSe3Ir9#y)jt9GZSW#WCh->)Se|H{kuU2%Z@yG zyAYu#Fc_o#FZ04zEMzp>NR)vojh}t0g~9d5XT#ZCpJ10+?I-OgHMLRR2H-Zq_rCAMG8-#K2fbZtKG8kaz}{lj-d+y8^w{y6YewdqR`$hy zuwOWT<}k}?d^%r)%X%Mq3+bS>5v#^xfS!KPv6Ei94N zLuhOpaSqFvO-WP;I7>Ao4Gs7|&iublnk#*4DHm;DtCxsF4fUKJ1MEA5o- zP|s5lh5G5Rj$~(AxYY69%S~`gP#L<@j^(lL=-^(7eoE#z87 z@_LL$$7@dpNl(MAyAuC?fm7^6e>N<9usCeQQ3G(esx>zz?Y8p8nl!^HRw-$2zkOQI*3u__*9@4-d)B zzeN3SjO@R@5(<_L&V@$pF20gwynkQQ{MvRX)4v4yzc14NdM0>=`~byFG20#$EY1Er zFWK=oTUf;Z{kRFwP?H_}%<*A${;t{MNx~TDC~sedB;Mcsm+bt{2XC3LD$62WVuGcg z+$Zv|>Hl6~s<&>A@y%*wfc z4eNFjLjM0Ya;`rkM<86>ZwBQFCj`qvV|EdU638_lC#HjoPiOXHc_GOuDQYjl^d_0* zac!Z&8uyhJq22GLa=x5WR+*wBX9EtdU%mhQ{#ZL!^5p!QXaAbAuAZKP6#A}**v89% z<`_S2^SWg7z;&K91fuHktJl*7#q{kucCRQe^vsG@Fs9;Oz9K0plzxs0#H)PZAVGG+ zyDY!=am^8yM{|}w^uiGt4ZE@y2`|#x7d1{3%6O%=_U149U9 z1YQ%$6|sOo-MBCC8E}bWj&HTG(&;I{KORuQ^MoikSoUq#D!%ylXU%%0CJUtN8lYY?o3VS7L!T zt!;Bs7yV80nV9Xc8B~jiZ8nv!K>C8|`td2sL*Y|S z0qfuZHNv)4R}}Ubf|(Gga|Pl7M+4aussPcdK4eknMI)k4Sz_w@Y1yJS6NHjer*oPu5|^w5!kw>k>TU zaxJi8;m`A;lCAcDx-5fBDMdmL#z-BSkHmrtfvS%mdH-e1{24d;Hn&-usU&}d-a>av zs;o=z^$tf5`E7zq5(>F;3C}o4elzrCsxxM=etTPQuGK;;1t4g5otuwOXEE~H^>XI1 za#cpLADwEBf82KhY2;y2Cuc`{vwG+J*Y{%}v9P-d3vb>|uDEbKd9E}p#Kf8^evfW_ zgZzoa{pT#fxXI+Gioj3p@>PiYbkuU$H{*-3pvne@`#y4csT8vK^-Mm3<^-3Qk`ok= zamMXUu&&v_>J{y0)^7=|zyEC(>@wH5sq!B(esUx}*!SDJ{(ZDjb#t?t$FlG11Fy1| z@UNa~{YyQF)$at|elC6W7%GH%92uclPLkubAzD=QUi;$vRiY;Hw;{n+ya4XP<0+}c zN$Z(SyY3efVq&dih!EV6h3Ci3*F=x)(d!E|&D+oBvug$I7nMcJ2M_4kMRVoE5EI$T zWNwa6uO8>_2W;YSKua4;kW|Y%0ea=7C$`cKgYPKk^P+au?dGCSDXt&$-#3)~cIWCb zz$WiJIF0a(9mY=yZ%U8Ll}}_{$j@Hk4 za5jL6H>2#KT85V4E6N)rh`J+^jUnr_(%)T1;s*$%a4u+~_)ODbBA-6|^{d@}~A^%UZ@R<9WrZU2)vV9IkdldD}R~;sOcW81*d6K2)PEJ>o9C%E{`EPB2u4 zio|xAP!1>yi1T}}CzEBPlXK`cemq4HuU(!4TNVN9ONh!mPW|9haHej zRVY#!RBQTQKE8C@msDBu`u1#}`Q8F^s#}0Nzmw{$tvfuczc5Nf`@{K7Pho*1YHlM7 zUZvQ>RS#;~W+7ZD$NJgAa6lK*8;xULD`4jw1h*W&uiej{AKzN-FB4D6-!PLH6-ddDmg7xwTcVCsRy!ZUZx8)_|9_fIYll^puc3Msls6ziws;WY zsa9{p)XfMqwiFh#>9;{tFX|6t;A3+V28U0rlN{j^Fy}nzJ8ft8+|Kak)Ma>TVD3|P) zplSh&Zq6r}-kY3gz%Z<&LCVCsS%6xqpV5@eHYb+>885KcKaMjPfF~SQ(lmU$8v+jZ!aR$sRJ&~_GZ&BkN0^H4D?Qt zA5IP<_fxPeL#7toE?YhgBFAuTv7q(2>i#FKoapciT7ySrSXFyf#ArlhWWp)EsQWRY z1%V@wS1BH+%K4$nKne~Rot%Wxd1aC(#G96m_tkGZvFB6ZoIC=x#`%|)jM5`om%F`^0Nqa zodRll-Q`~iZo5~Uj0O99pfimkIz!G_HB2LeeL%C$VEGMWm)S*m&G5dHvHc&3*KVh- zqLVl-nsZak^RpjP9(Ou3T@cH=c@&q|B{uQqI(j99wE8w(HabpbZ3JRjrmIY5ERz|5 zS*my-`dShi%8dyju*`Wbp(m#j$6Y8`dYDCgzdwsdSCbY>eUa+6Tu^`2Vij`XyYDjCNp4vXIUDY0KmIn05VmJ%mM+!ihwN*f9%-deQ0 zwWk|O&7?TvqBH}?7H;paXqZz`hdr7SQxP$&8LOVTKfr+#H9i1s!fASq^U z{}#OtLcKM`KtOEz^Ps$}f;93!YLY5%|le^&e_`&+*LZzo& z!S+br53O1iyNl{u*4eqdY!UAzGCI;v_*2YMNx^)|LP&ot5_ z>b)BPw!}0m^Yg$$(;}Cowbbg3xn$3H@Zc%p$C<&bvFcv zpsz0+%Md`CV$P`(K0diTdMa|T(Ow#5iBOMw?rn-%ydzcdPRBTh4zzWGJ$K)T6to+Y zt?k5&@){jTH9Af972--XN+wHdDc)cl-{EC0(tY&kQb9u5(Wp8-;I)3ZvYN3^DzaijSup(BBUh0zs+JzU~bXU(H zvUL(~WOlzDDKUtL_?Q>eb`i0fjJ%82D42%2=-)U?#hK`_v(fDXLEKc01oQJ~wk2hK zT@cS41Vq`RbeceWQdQ`0As+Q5sI9-o^x<+X-sAfh$2`GVI2(xOrJ1NbG& ziou%apwG`4(uPy&w2cqo2G2@HX6B0_MdV{HwQ{oX1~Z>+kqz${6!^w$dc$dCIM6XX8>BS1

_R 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 NSwa0(wfx)A{{?~tj=ul^ diff --git a/docs/integration.md b/docs/integration.md index 2a5c207..8e3098f 100644 --- a/docs/integration.md +++ b/docs/integration.md @@ -2,7 +2,7 @@ lazysecrets works outside its own window too: `lazysecrets get` reads a value for scripts, and `lazysecrets list` lists everything for fzf, editor -pickers and your own tools. Both take the [links](links.md) lazysecrets +pickers and your own tools. Both take the [links](sharing.md) lazysecrets copies and shares. For Neovim, there's [lazysecrets.nvim](https://github.com/karleinarb/lazysecrets.nvim). @@ -19,7 +19,8 @@ It reads the value directly, with your az accounts (the one that last read it first), the Databricks profile for the workspace, or sops in your clone of the repo; a version in the link reads that version. `--account` tries that account first, as [`list`](#listing-for-fzf-and-pickers) prints it. -The value ends with a newline only on a terminal. +The value ends with a newline only on a terminal. When it can't read the +value, it says why on stderr and exits with status 1. ## Listing, for fzf and pickers @@ -29,69 +30,65 @@ tab-separated: | Field | | |---|---| | kind | `source`, `vault`, `secret`, `key` or `certificate` | +| mark | ✗ when something's wrong (expired, or couldn't be read) or ⚠ when it expires soon; ★ when starred; ◷ when used lately (with `--recent`); and the provider's icon | | name | `platform-prod / kv-app-prod / db-password` | +| status | why a vault or source couldn't be read, or that it has `expired` or `expires in 12d` (within `ui.expiryWarningDays`), or empty | +| note | your note on it (`n` in lazysecrets), after a note icon (✎ without icons), or empty | | account | what it's listed through: an az account (`Azure:/`), `Databricks` or `Repos` | | link | its `lazysecrets://` link | -It's what Go to searches, so fzf, or an editor's picker, can search it -instead, showing the names and acting on the links: +What's cached prints at once, then what loads follows as it arrives: read +it as a stream. Values are never listed. It stops quietly when the reader +goes, like fzf after a pick. Kind stays the first field, and account and +link the last two; new fields only ever go between. The mark has a field of +its own so a search can leave it out: in fzf, `--nth` searches the name, +so `^prod` finds names starting with prod. +| Flag | | +|---|---| +| `--format json` | an object per line instead, for editor plugins (below) | +| `--kind secret,vault` | only these kinds: `source`, `vault`, `secret`, `key`, `certificate`; lists only other kinds need aren't loaded | +| `--cached` | only what's cached, at once: nothing is loaded from Azure or Databricks | +| `--max-age 2m` | load cached lists older than this again | +| `--errors=false` | leave out the vaults and sources it couldn't read | +| `--color never` | no colours, for scripts | +| `--icons=false` | no provider icons | +| `--stars=false` | no ★ before starred names (in `favouriteColor`) | +| `--notes=false` | no note icon before a note | +| `--recent` | ◷ before names used lately, in `mutedColor`; default `ui.recentIcon` | +| `--expiry=false` | no expiry: not in the status, and no ✗ or ⚠ for it | + +With `--format json`, each line is an object with these fields; new ones +may be added: + +| Field | | +|---|---| +| `link`, `kind`, `account` | as above | +| `error` | why it couldn't be read, only then | +| `provider` | `azure`, `databricks` or `repo` | +| `path` | the names: `["platform-prod", "kv-app-prod", "db-password"]` | +| `accountLabel` | the account's short name, when several az accounts are signed in | +| `starred` | starred for this account | +| `note` | your note on it, if any | +| `reference` | how config refers to a secret: `@Microsoft.KeyVault(SecretUri=…)` or `{{secrets/scope/key}}` (`Y` in lazysecrets) | +| `url` | its web page, in the Azure portal or the Databricks workspace (`o` in lazysecrets) | +| `recent` | used lately, as Recent (`R`) lists: in the last 90 days, among the 100 used last | +| `lastUsed`, `uses` | when it was last used, and how often; only when `recent`, to sort by | +| `expires` | when a secret, key or certificate expires, if it does (Azure) | +| `enabled` | `false` for a disabled one; only where the provider says (Azure) | + +`lazysecrets open --action go --account ` opens one in +lazysecrets without asking what to do or which account, ending in the +secrets list, like Go to. + + +### Example usage with fzf ```sh -lazysecrets list | fzf --ansi --with-nth='2..-3' --accept-nth=-1 \ +lazysecrets list | fzf --ansi --delimiter='\t' --with-nth='2..-3' --nth='2..' --accept-nth=-1 \ --header 'enter: link · ctrl-o: open · ctrl-y: copy value · ctrl-x: copy and close' \ --bind 'ctrl-o:become(lazysecrets open --action go --account {-2} {-1})' \ - --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {2..-3})' \ + --bind 'ctrl-y:execute-silent(lazysecrets get --account {-2} {-1} | pbcopy)+change-header(Copied the value of {3})' \ --bind 'ctrl-x:become(lazysecrets get --account {-2} {-1} | pbcopy)' ``` +![fzf-example](assets/fzf-example.png) -`--with-nth='2..-3'` shows and searches only the names; `{-1}` and -`--accept-nth=-1` are the link, `{-2}` the account. All but the name are -one word, so this works without `--delimiter`. To filter by kind -yourself: `awk -F'\t' '$1 == "secret"'`. - -`enter` prints the link (`lazysecrets get $(…)`), `ctrl-o` opens it in -lazysecrets, `ctrl-y` copies the value, saying so in the header, and -`ctrl-x` copies it and closes fzf (`pbcopy` on macOS; `wl-copy` or `xclip` -on Linux). A value copied this way isn't cleared from the -clipboard after `values.clipboardClear`, as one copied in lazysecrets is. - -`--account` makes `open` and `get` use the account it was listed through, -when several of yours can see it: without, `open` asks which, and `get` -tries the one that last read it first. The link stays as it is, to copy -and share; the account isn't part of it. `--action` tells `open` what to -do rather than asking, as it does for a link clicked elsewhere: `go` to -it, `copy` its value too, or `show` it. It ends in the secrets list, like -Go to, rather than on the details as a clicked link does. - -What's [cached](config.md#cache) prints at once. Then, like Go to, it loads -what's missing or older than `--max-age` (2m), and what's new in it follows -as it arrives: fzf shows it while you type. `--cached` loads nothing from -Azure or Databricks, for an answer at once. Repos are always read, from -disk. What it loads is cached for the TUI too. It stops when the reader -goes, after a pick in fzf. - -`--kind` lists only some kinds, comma-separated: `source`, `vault` (also -Databricks scopes and repo files), `secret`, `key`, `certificate`. Lists -only other kinds need aren't loaded: `--kind source,vault` asks for no -secrets. Keys and certificates load only when asked for this way; else, -like Go to, they're listed as far as you opened them in lazysecrets. - -A vault or source it can't read is a line too, as it fails: its name, -then `✗` and why in red (`errorColor`), with its link, so opening it -shows more. They're in the list, not on stderr, which would draw over fzf. -`--errors=false` leaves them out. - -The name is coloured from your [theme](config.md#theme), with the -provider's icon when [icons](config.md#theme) are on (`ui.icons`); fzf -shows the colours with `--ansi`. `--color never` leaves them out, for -scripts, and `--icons=false` the icons. The link is never coloured. - -`--format json` prints an object per line instead, for editor plugins, -without colours or icons, and with `error` on a list it couldn't read: - -```json -{"link":"lazysecrets://azure/kv-app-prod.vault.azure.net/secrets/db-password","kind":"secret","provider":"azure","path":["platform-prod","kv-app-prod","db-password"],"account":"Azure:alice@example.com/","accountLabel":"alice"} -``` - -`accountLabel`, the account's short name, is there when several az -accounts are signed in. Values are never listed. -- 2.54.0 From db4d64012dfb1df34639c5ee11f575a1f97b4fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 21:17:52 +0200 Subject: [PATCH 44/45] fix: review findings for lazysecrets list: recent means the last 90 days, cache saves lock and keep deletions and the TUI's cursors, failed lists aren't retried, one expiry rule --- cmd/lazysecrets/list.go | 42 ++++++++++---------- docs/integration.md | 2 +- internal/cachefile/cachefile.go | 58 ++++++++++++++++++++-------- internal/cachefile/cachefile_test.go | 31 +++++++++++++++ internal/cachefile/lock_other.go | 7 ++++ internal/cachefile/lock_unix.go | 25 ++++++++++++ internal/expiry/expiry.go | 41 ++++++++++++++++++++ internal/expiry/expiry_test.go | 27 +++++++++++++ internal/listing/listing.go | 43 +++++++++++++++------ internal/listing/listing_test.go | 36 +++++++++++++++-- internal/store/store.go | 7 ++++ internal/store/store_test.go | 12 ++++++ internal/ui/app/app.go | 13 ++++--- internal/ui/app/cache.go | 15 ++++++- internal/ui/app/expiring.go | 3 +- internal/ui/app/expiry.go | 30 ++++---------- internal/ui/app/favourites.go | 12 +++--- internal/ui/app/fields.go | 3 +- internal/ui/app/jump.go | 2 +- internal/ui/app/persist.go | 12 ++---- internal/ui/app/search.go | 13 ++++--- internal/ui/app/searchview.go | 3 +- internal/ui/app/sources.go | 3 +- 23 files changed, 333 insertions(+), 107 deletions(-) create mode 100644 internal/cachefile/lock_other.go create mode 100644 internal/cachefile/lock_unix.go create mode 100644 internal/expiry/expiry.go create mode 100644 internal/expiry/expiry_test.go diff --git a/cmd/lazysecrets/list.go b/cmd/lazysecrets/list.go index 1d43850..8bc6dc8 100644 --- a/cmd/lazysecrets/list.go +++ b/cmd/lazysecrets/list.go @@ -18,6 +18,7 @@ import ( "charm.land/lipgloss/v2" "git.kebcloud.no/keb/lazysecrets/internal/cachefile" + "git.kebcloud.no/keb/lazysecrets/internal/expiry" "git.kebcloud.no/keb/lazysecrets/internal/listing" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/store" @@ -127,20 +128,18 @@ func listCmd(providers []provider.Provider, st *store.Store, cachePath string, t if cachePath != "" { f = cachefile.Read(cachePath) } - f = listing.Run(context.Background(), listing.Options{ + f, loaded := listing.Run(context.Background(), listing.Options{ Providers: providers, Cache: f, MaxAge: *maxAge, Cached: *cached, Kinds: only, Timeout: timeout, - Mark: func(link, account string) (bool, time.Time, int, string) { + Mark: func(link, account string) listing.Marks { n := st.Node(link) - return n.StarredFor(account), n.LastUsed, n.Uses, n.Note + return listing.Marks{Starred: n.StarredFor(account), Recent: n.UsedLately(now), + LastUsed: n.LastUsed, Uses: n.Uses, Note: n.Note} }, }, emit) - if cachePath != "" && !*cached { - byID := map[string]provider.Provider{} - for _, p := range providers { - byID[p.ID()] = p - } - keep := func(id string) bool { p, ok := byID[id]; return ok && p.Kind() != provider.KindRepo } - if err := cachefile.Save(cachePath, f, keep, time.Now()); err != nil { + // Only what was loaded: list never moves a cursor, so the TUI's stay. + if cachePath != "" && loaded { + f.Cursor = nil + if err := cachefile.Save(cachePath, f, cachefile.Keep(providers), time.Now()); err != nil { return err } } @@ -170,16 +169,13 @@ func noteOf(e listing.Entry, theme styles.Styles, iconSet icons.Set, icon, color // is "". Its mark (✗, ⚠) is before the name. func expiryOf(e listing.Entry, theme styles.Styles, warn time.Duration, now time.Time, color bool) string { render := renderer(color) - left := e.Expires.Sub(now) - switch { - case e.Expires.IsZero() || left > warn: - return "" - case left <= 0: + switch state, left := expiry.Of(e.Expires, now, warn); state { + case expiry.Expired: return render(theme.Error, "expired") - case left < 24*time.Hour: - return render(theme.Warning, fmt.Sprintf("expires in %dh", max(1, int(left.Hours())))) + case expiry.Soon: + return render(theme.Warning, "expires in "+expiry.Left(left)) } - return render(theme.Warning, fmt.Sprintf("expires in %dd", int(left.Hours()/24))) + return "" } // errorOf is why a list couldn't be read, in red, or "". Its mark (✗) @@ -230,10 +226,14 @@ func (m marks) of(e listing.Entry) string { } } // What's wrong, then what to watch: room for one of them. - switch left := e.Expires.Sub(m.now); { - case e.Error != "" || (m.expiry && !e.Expires.IsZero() && left <= 0): + state := expiry.None + if m.expiry { + state, _ = expiry.Of(e.Expires, m.now, m.warn) + } + switch { + case e.Error != "" || state == expiry.Expired: mark(true, m.theme.Error, "✗") - case m.expiry && !e.Expires.IsZero() && left <= m.warn: + case state == expiry.Soon: mark(true, m.theme.Warning, "⚠") default: mark(false, m.theme.Error, "") diff --git a/docs/integration.md b/docs/integration.md index 8e3098f..79e6ee3 100644 --- a/docs/integration.md +++ b/docs/integration.md @@ -72,7 +72,7 @@ may be added: | `note` | your note on it, if any | | `reference` | how config refers to a secret: `@Microsoft.KeyVault(SecretUri=…)` or `{{secrets/scope/key}}` (`Y` in lazysecrets) | | `url` | its web page, in the Azure portal or the Databricks workspace (`o` in lazysecrets) | -| `recent` | used lately, as Recent (`R`) lists: in the last 90 days, among the 100 used last | +| `recent` | used lately, as Recent (`R`) lists: in the last 90 days | | `lastUsed`, `uses` | when it was last used, and how often; only when `recent`, to sort by | | `expires` | when a secret, key or certificate expires, if it does (Azure) | | `enabled` | `false` for a disabled one; only where the provider says (Azure) | diff --git a/internal/cachefile/cachefile.go b/internal/cachefile/cachefile.go index 7d31792..6f56b82 100644 --- a/internal/cachefile/cachefile.go +++ b/internal/cachefile/cachefile.go @@ -32,6 +32,10 @@ type File struct { Objects map[string]Stamped[[]provider.Object] `json:"objects,omitempty"` Details map[string]Stamped[provider.Object] `json:"details,omitempty"` Cursor map[string]string `json:"cursor,omitempty"` + // Dropped are keys deleted since the file was read (a list that + // failed to load): Save deletes them from the file too, rather than + // merging the old entry back. Not saved. + Dropped map[string]bool `json:"-"` } // Stamped is a list or detail with when it was loaded. @@ -69,6 +73,16 @@ func ProviderOf(key string) string { return id } +// Keep is Save's keep for these providers: their lists are kept, but not +// repos', whose files are read from disk anyway, nor other accounts'. +func Keep(providers []provider.Provider) func(providerID string) bool { + keep := map[string]bool{} + for _, p := range providers { + keep[p.ID()] = p.Kind() != provider.KindRepo + } + return func(id string) bool { return keep[id] } +} + // Read reads path; a missing, unreadable or other version's file is an // empty cache. func Read(path string) File { @@ -90,17 +104,27 @@ func Read(path string) File { } // Save writes f to path, merged with the file there: of a list in both, -// the one loaded last wins, and f's cursors win. Entries older than -// MaxAge, and those of providers keep says no to (accounts signed out -// of), are dropped, from the file's side as well. +// the one loaded last wins, and f's cursors win (a nil Cursor keeps the +// file's). Entries older than MaxAge, those of providers keep says no to +// (accounts signed out of), and f.Dropped are dropped, from the file's +// side as well. Saves from several lazysecrets take turns (a lock file), +// so none undoes another's. func Save(path string, f File, keep func(providerID string) bool, now time.Time) error { + if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { + return err + } + unlock, err := lock(path + ".lock") + if err != nil { + return err + } + defer unlock() out := New() ok := func(key string, at time.Time) bool { return keep(ProviderOf(key)) && now.Sub(at) < MaxAge } disk := Read(path) - merge(out.Sources, disk.Sources, f.Sources, ok) - merge(out.Containers, disk.Containers, f.Containers, ok) - merge(out.Objects, disk.Objects, f.Objects, ok) - merge(out.Details, disk.Details, f.Details, ok) + merge(out.Sources, disk.Sources, f.Sources, ok, f.Dropped) + merge(out.Containers, disk.Containers, f.Containers, ok, f.Dropped) + merge(out.Objects, disk.Objects, f.Objects, ok, f.Dropped) + merge(out.Details, disk.Details, f.Details, ok, f.Dropped) for _, m := range []map[string]string{disk.Cursor, f.Cursor} { for k, v := range m { if keep(ProviderOf(k)) { @@ -111,12 +135,17 @@ func Save(path string, f File, keep func(providerID string) bool, now time.Time) return write(path, out) } -func merge[T any](out, disk, ours map[string]Stamped[T], ok func(string, time.Time) bool) { - for _, m := range []map[string]Stamped[T]{disk, ours} { - for k, e := range m { - if old, seen := out[k]; ok(k, e.At) && (!seen || !e.At.Before(old.At)) { - out[k] = e - } +// merge puts disk's entries in out, but not those dropped, then ours +// where they're newer. +func merge[T any](out, disk, ours map[string]Stamped[T], ok func(string, time.Time) bool, dropped map[string]bool) { + for k, e := range disk { + if ok(k, e.At) && !dropped[k] { + out[k] = e + } + } + for k, e := range ours { + if old, seen := out[k]; ok(k, e.At) && (!seen || !e.At.Before(old.At)) { + out[k] = e } } } @@ -127,9 +156,6 @@ func write(path string, f File) error { if err != nil { return err } - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - return err - } tmp, err := os.CreateTemp(filepath.Dir(path), ".cache-*.json") if err != nil { return err diff --git a/internal/cachefile/cachefile_test.go b/internal/cachefile/cachefile_test.go index 32c5b96..f1e9aad 100644 --- a/internal/cachefile/cachefile_test.go +++ b/internal/cachefile/cachefile_test.go @@ -89,3 +89,34 @@ func TestReadOtherVersion(t *testing.T) { t.Errorf("read another version's file: %+v", got) } } + +func TestSaveDroppedAndCursors(t *testing.T) { + path := filepath.Join(t.TempDir(), "cache.json") + now := time.Now() + all := func(string) bool { return true } + f := New() + f.Containers["az|bad"] = list(now, "kv-old") + f.Cursor["az|x"] = "kv-tui" + if err := Save(path, f, all, now); err != nil { + t.Fatal(err) + } + // The TUI fails to load it again and drops it: it stays gone. + f = New() + f.Dropped = map[string]bool{"az|bad": true} + if err := Save(path, f, all, now); err != nil { + t.Fatal(err) + } + if _, ok := Read(path).Containers["az|bad"]; ok { + t.Error("a dropped list came back") + } + // lazysecrets list saves without cursors: the TUI's stay. + listed := New() + listed.Cursor = nil + listed.Containers["az|y"] = list(now, "kv-y") + if err := Save(path, listed, all, now); err != nil { + t.Fatal(err) + } + if Read(path).Cursor["az|x"] != "kv-tui" { + t.Error("the TUI's cursor was lost") + } +} diff --git a/internal/cachefile/lock_other.go b/internal/cachefile/lock_other.go new file mode 100644 index 0000000..bb597f2 --- /dev/null +++ b/internal/cachefile/lock_other.go @@ -0,0 +1,7 @@ +//go:build !unix + +package cachefile + +// lock does nothing here: saves can then race, losing lists that load +// again. +func lock(string) (func(), error) { return func() {}, nil } diff --git a/internal/cachefile/lock_unix.go b/internal/cachefile/lock_unix.go new file mode 100644 index 0000000..f8281d3 --- /dev/null +++ b/internal/cachefile/lock_unix.go @@ -0,0 +1,25 @@ +//go:build unix + +package cachefile + +import ( + "os" + "syscall" +) + +// lock takes path as a lock file, waiting while another lazysecrets has +// it, and returns how to let go. +func lock(path string) (unlock func(), err error) { + f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o600) + if err != nil { + return nil, err + } + if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX); err != nil { + f.Close() + return nil, err + } + return func() { + _ = syscall.Flock(int(f.Fd()), syscall.LOCK_UN) + f.Close() + }, nil +} diff --git a/internal/expiry/expiry.go b/internal/expiry/expiry.go new file mode 100644 index 0000000..720a551 --- /dev/null +++ b/internal/expiry/expiry.go @@ -0,0 +1,41 @@ +// Package expiry says whether a secret, key or certificate has expired +// or will soon, and how long it has left, the same way everywhere: the +// TUI's lists and status pane, and lazysecrets list. +package expiry + +import ( + "fmt" + "time" +) + +type State int + +const ( + None State = iota // no expiry, or not within the warning period + Soon // within the warning period + Expired // already +) + +// Of tells whether something expiring at expires (zero: never) has +// expired by now or will within warn, and how long it has left. +func Of(expires, now time.Time, warn time.Duration) (State, time.Duration) { + if expires.IsZero() { + return None, 0 + } + left := expires.Sub(now) + switch { + case left <= 0: + return Expired, 0 + case left <= warn: + return Soon, left + } + return None, left +} + +// Left is a short "12d", or "5h" on the last day. +func Left(d time.Duration) string { + if d < 24*time.Hour { + return fmt.Sprintf("%dh", max(1, int(d.Hours()))) + } + return fmt.Sprintf("%dd", int(d.Hours()/24)) +} diff --git a/internal/expiry/expiry_test.go b/internal/expiry/expiry_test.go new file mode 100644 index 0000000..92b30a7 --- /dev/null +++ b/internal/expiry/expiry_test.go @@ -0,0 +1,27 @@ +package expiry + +import ( + "testing" + "time" +) + +func TestOf(t *testing.T) { + now := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC) + warn := 30 * 24 * time.Hour + for _, c := range []struct { + expires time.Time + want State + left string + }{ + {time.Time{}, None, ""}, + {now.Add(-time.Hour), Expired, ""}, + {now.Add(12*24*time.Hour + time.Hour), Soon, "12d"}, + {now.Add(5 * time.Hour), Soon, "5h"}, + {now.Add(60 * 24 * time.Hour), None, ""}, + } { + state, left := Of(c.expires, now, warn) + if state != c.want || (c.left != "" && Left(left) != c.left) { + t.Errorf("%v: %v %s, want %v %s", c.expires, state, Left(left), c.want, c.left) + } + } +} diff --git a/internal/listing/listing.go b/internal/listing/listing.go index 73d4d2a..8c6f4ff 100644 --- a/internal/listing/listing.go +++ b/internal/listing/listing.go @@ -74,25 +74,37 @@ type Options struct { // Lists only needed for other kinds aren't loaded: sources and vaults // alone don't load any secrets. Lists that fail are always listed. Kinds []string - // Mark tells whether the entry with link is starred for account, - // when it was last used and how often (zero: not lately), and its - // note; nil marks nothing. - Mark func(link, account string) (starred bool, lastUsed time.Time, uses int, note string) - Timeout func(provider.Kind) time.Duration + // Mark tells what's remembered about the entry with link, seen + // through account; nil marks nothing. + Mark func(link, account string) Marks + Timeout func(provider.Kind) time.Duration // nil: 30s Now func() time.Time } +// Marks are what's remembered about an entry: starred for the account, +// used lately (Recent) and when and how often, and its note. +type Marks struct { + Starred, Recent bool + LastUsed time.Time + Uses int + Note string +} + // Run lists everything, calling emit for each entry once, from this // goroutine, and for each list that can't be loaded, as it fails. An // error from emit (the reader went away) stops it. It returns the cache -// with what was loaded. -func Run(ctx context.Context, o Options, emit func(Entry) error) cachefile.File { +// with what was loaded, and whether anything was. +func Run(ctx context.Context, o Options, emit func(Entry) error) (cachefile.File, bool) { ctx, cancel := context.WithCancel(ctx) defer cancel() - l := &lister{o: o, emit: emit, seen: map[string]bool{}, pending: map[string]bool{}, results: make(chan result)} + l := &lister{o: o, emit: emit, seen: map[string]bool{}, pending: map[string]bool{}, failed: map[string]bool{}, + results: make(chan result)} if l.o.Now == nil { l.o.Now = time.Now } + if l.o.Timeout == nil { + l.o.Timeout = func(provider.Kind) time.Duration { return 30 * time.Second } + } for _, p := range o.Providers { if l.stopped != nil { break @@ -111,7 +123,7 @@ func Run(ctx context.Context, o Options, emit func(Entry) error) cachefile.File cancel() } } - return l.o.Cache + return l.o.Cache, l.loaded } type job struct { @@ -135,6 +147,8 @@ type lister struct { emit func(Entry) error seen map[string]bool // provider ID + link of entries emitted pending map[string]bool // cache keys queued or loading + failed map[string]bool // cache keys that couldn't be loaded: not again + loaded bool // something was cached queue []job active int results chan result @@ -240,8 +254,11 @@ func (l *lister) put(p provider.Provider, e Entry) { } e.Account = p.ID() if l.o.Mark != nil && e.Link != "" { - e.Starred, e.LastUsed, e.Uses, e.Note = l.o.Mark(e.Link, e.Account) - e.Recent = !e.LastUsed.IsZero() + m := l.o.Mark(e.Link, e.Account) + e.Starred, e.Recent, e.Note = m.Starred, m.Recent, m.Note + if m.Recent { + e.LastUsed, e.Uses = m.LastUsed, m.Uses + } } id := p.ID() + "\x00" + e.Link + "\x00" + e.Error if l.stopped != nil || l.seen[id] { @@ -265,7 +282,7 @@ func (l *lister) wants(kinds ...string) bool { } func (l *lister) enqueue(j job) { - if l.pending[j.key] { + if l.pending[j.key] || l.failed[j.key] { return } l.pending[j.key] = true @@ -301,9 +318,11 @@ func (l *lister) handle(r result) { delete(l.pending, r.key) now := l.o.Now() if r.err != nil { + l.failed[r.key] = true l.put(r.p, r.failed()) return } + l.loaded = l.loaded || l.cacheable(r.p) cache := l.cacheable(r.p) switch { case r.c != nil: diff --git a/internal/listing/listing_test.go b/internal/listing/listing_test.go index 13167f4..75bdc03 100644 --- a/internal/listing/listing_test.go +++ b/internal/listing/listing_test.go @@ -42,7 +42,7 @@ func run(t *testing.T, o Options) ([]Entry, cachefile.File, []Entry) { } o.Timeout = func(provider.Kind) time.Duration { return 5 * time.Second } var got, failed []Entry - f := Run(context.Background(), o, func(e Entry) error { + f, _ := Run(context.Background(), o, func(e Entry) error { if e.Error != "" { failed = append(failed, e) } else { @@ -234,14 +234,17 @@ func TestListMarks(t *testing.T) { az := fake.Azure(0) var starredLink string got, _, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute, Kinds: []string{"secret"}, - Mark: func(link, account string) (bool, time.Time, int, string) { + Mark: func(link, account string) Marks { if starredLink == "" && strings.HasSuffix(link, "/db-password") { starredLink = link } if strings.HasSuffix(link, "/api-key") { - return false, time.Now(), 3, "rotate in May" + return Marks{Recent: true, LastUsed: time.Now(), Uses: 3, Note: "rotate in May"} } - return link == starredLink && account == az.ID(), time.Time{}, 0, "" + if strings.HasSuffix(link, "/legacy-token") { // used, but too long ago + return Marks{LastUsed: time.Now().AddDate(-2, 0, 0), Uses: 9} + } + return Marks{Starred: link == starredLink && account == az.ID()} }}) var starred, recent int for _, e := range got { @@ -267,3 +270,28 @@ func TestListMarks(t *testing.T) { t.Errorf("%d starred, %d recent", starred, recent) } } + +func TestFailedListNotRetried(t *testing.T) { + t.Parallel() + az := &counting{Provider: fake.Azure(0)} + _, f, _ := run(t, Options{Providers: []provider.Provider{az}, MaxAge: time.Minute}) + // Everything stale: sources reload, and their vaults are queued again + // as each list arrives. kv-restricted fails once, and isn't asked again. + before := az.calls.Load() + _, _, failed := run(t, Options{Providers: []provider.Provider{az}, Cache: f, MaxAge: time.Minute, + Now: func() time.Time { return time.Now().Add(time.Hour) }}) + if len(failed) != 1 { + t.Errorf("failed: %+v", failed) + } + fresh := &counting{Provider: fake.Azure(0)} + run(t, Options{Providers: []provider.Provider{fresh}, MaxAge: time.Minute}) + if n := az.calls.Load() - before; n > fresh.calls.Load() { + t.Errorf("%d requests with a stale cache, more than %d from scratch: something was asked twice", n, fresh.calls.Load()) + } +} + +func TestRunWithoutTimeout(t *testing.T) { + t.Parallel() + Run(context.Background(), Options{Providers: []provider.Provider{fake.Repos()}, Cache: cachefile.New()}, + func(Entry) error { return nil }) // no Timeout: a default, not a panic +} diff --git a/internal/store/store.go b/internal/store/store.go index 04f708a..77689dc 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -43,6 +43,13 @@ type Node struct { // alone isn't. func (n Node) keep() bool { return len(n.StarredBy) > 0 || n.Note != "" || n.Uses > 0 } +// UsedLately reports whether the item was used within the last 90 days +// (what Recent lists). Starred and noted records are kept longer, so a +// use alone doesn't say. +func (n Node) UsedLately(now time.Time) bool { + return !n.LastUsed.IsZero() && now.Sub(n.LastUsed) <= usageMaxAge +} + // StarredFor reports whether the item is starred for account. func (n Node) StarredFor(account string) bool { return slices.Contains(n.StarredBy, account) } diff --git a/internal/store/store_test.go b/internal/store/store_test.go index 0be187c..065e822 100644 --- a/internal/store/store_test.go +++ b/internal/store/store_test.go @@ -119,3 +119,15 @@ func TestStarsPerAccount(t *testing.T) { t.Errorf("unstar alice: %v", n.StarredBy) } } + +func TestUsedLately(t *testing.T) { + now := time.Now() + for ago, want := range map[time.Duration]bool{time.Hour: true, 89 * 24 * time.Hour: true, 2 * 365 * 24 * time.Hour: false} { + if got := (Node{LastUsed: now.Add(-ago)}).UsedLately(now); got != want { + t.Errorf("used %v ago: %v", ago, got) + } + } + if (Node{}).UsedLately(now) { + t.Error("never used is lately") + } +} diff --git a/internal/ui/app/app.go b/internal/ui/app/app.go index 5447318..29c9f50 100644 --- a/internal/ui/app/app.go +++ b/internal/ui/app/app.go @@ -213,9 +213,12 @@ type Model struct { statusW int // the status pane's width: the left column's, zoomed or not changelog []panes.Field cacheDirty bool - sourcesAt map[string]time.Time - placeDir string - savedPlace string // the link last saved as the place + // cacheDropped are cache keys deleted since the last save, so saving + // deletes them from the file too. + cacheDropped map[string]bool + sourcesAt map[string]time.Time + placeDir string + savedPlace string // the link last saved as the place // A pending clear of a copied value, counted down in the footer. // clipToken identifies the latest copy so older ticks are ignored. @@ -688,7 +691,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if src, ok := m.selectedSource(); ok { m.logErrOf(src.Name, msg.err) } - delete(m.cache.containers, msg.key) + uncache(&m, m.cache.containers, msg.key) m.containers.SetError(msg.err) } else { m.cache.containers[msg.key] = entry[[]provider.Container]{msg.items, m.now()} @@ -709,7 +712,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if c, ok := m.containers.Selected(); ok { m.logErrOf(c.Name, msg.err) } - delete(m.cache.objects, msg.key) + uncache(&m, m.cache.objects, msg.key) m.secrets.SetError(msg.err) } else { if msg.bound != nil { diff --git a/internal/ui/app/cache.go b/internal/ui/app/cache.go index 2de8090..69d6192 100644 --- a/internal/ui/app/cache.go +++ b/internal/ui/app/cache.go @@ -67,10 +67,23 @@ func (m *Model) refreshShown(before []provider.Object) tea.Cmd { return nil } m.detail.Refresh(s) - delete(m.cache.details, detailKey(s)) + uncache(m, m.cache.details, detailKey(s)) return m.describe(s) } +// uncache deletes key from a cache, and, at the next save, from the file. +func uncache[T any](m *Model, c map[string]entry[T], key string) { + if _, ok := c[key]; !ok { + return + } + delete(c, key) + if m.cacheDropped == nil { + m.cacheDropped = map[string]bool{} + } + m.cacheDropped[key] = true + m.cacheDirty = true +} + // sameListing reports whether a and b list the same: what a list // says of an object, not what describing it adds. func sameListing(a, b provider.Object) bool { diff --git a/internal/ui/app/expiring.go b/internal/ui/app/expiring.go index dea864f..acdc123 100644 --- a/internal/ui/app/expiring.go +++ b/internal/ui/app/expiring.go @@ -5,6 +5,7 @@ import ( "fmt" "slices" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ref" "git.kebcloud.no/keb/lazysecrets/internal/ui/panes" @@ -28,7 +29,7 @@ func (m Model) expiringItems() []expiringItem { row := sourceRowKey(p.ID(), src.ID) for _, c := range m.cache.containers[row].value { for _, t := range c.ObjectTypes() { - for _, o := range m.cache.objects[containerKey(c)+"|"+string(t)].value { + for _, o := range m.cache.objects[cachefile.ObjectsKey(c, t)].value { if state, _ := m.expiry(o); state != notExpiring { out = append(out, expiringItem{o, row}) } diff --git a/internal/ui/app/expiry.go b/internal/ui/app/expiry.go index 2d25440..afc6d93 100644 --- a/internal/ui/app/expiry.go +++ b/internal/ui/app/expiry.go @@ -1,9 +1,10 @@ package app import ( - "fmt" "time" + "git.kebcloud.no/keb/lazysecrets/internal/expiry" + "git.kebcloud.no/keb/lazysecrets/internal/provider" ) @@ -11,28 +12,18 @@ import ( // list once they have expired (✗ expired) or will within the configured // warning period (⚠ 12d), and typing "expir" in the filter finds them. -type expiryState int +type expiryState = expiry.State const ( - notExpiring expiryState = iota - expiresSoon - expired + notExpiring = expiry.None + expiresSoon = expiry.Soon + expired = expiry.Expired ) // expiry tells whether o has expired or will within the warning period, // and how long it has left. func (m Model) expiry(o provider.Object) (expiryState, time.Duration) { - if o.Expires.IsZero() { - return notExpiring, 0 - } - left := o.Expires.Sub(m.now()) - switch { - case left <= 0: - return expired, 0 - case left <= m.expiryWarning: - return expiresSoon, left - } - return notExpiring, left + return expiry.Of(o.Expires, m.now(), m.expiryWarning) } // expiryWord is matched by the filter: "expired" or "expiring". @@ -47,9 +38,4 @@ func (m Model) expiryWord(o provider.Object) string { } // daysLeft is a short "12d", or "5h" on the last day. -func daysLeft(d time.Duration) string { - if d < 24*time.Hour { - return fmt.Sprintf("%dh", max(1, int(d.Hours()))) - } - return fmt.Sprintf("%dd", int(d.Hours()/24)) -} +func daysLeft(d time.Duration) string { return expiry.Left(d) } diff --git a/internal/ui/app/favourites.go b/internal/ui/app/favourites.go index e9f207b..4932634 100644 --- a/internal/ui/app/favourites.go +++ b/internal/ui/app/favourites.go @@ -3,9 +3,11 @@ package app import ( "slices" "strings" + "time" tea "charm.land/bubbletea/v2" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ref" "git.kebcloud.no/keb/lazysecrets/internal/store" @@ -24,12 +26,12 @@ const recentMark = "◷ " // marks is what goes before a list row's name: ★ when it's starred for // account and, with recent, ◷ when it was used lately. -func marks(st styles.Styles, n store.Node, account string, recent bool) string { +func marks(st styles.Styles, n store.Node, account string, recent bool, now time.Time) string { var s string if n.StarredFor(account) { s = st.Favourite.Render(star) } - if recent && !n.LastUsed.IsZero() { + if recent && n.UsedLately(now) { s += st.Muted.Render(recentMark) } return s @@ -110,7 +112,7 @@ func (m Model) containerRender(withSource bool) func(styles.Styles, provider.Con } line += sty.Muted.Render(" " + c.Detail) } - line = marks(sty, n, c.Source.Provider, m.recentIcon) + line + line = marks(sty, n, c.Source.Provider, m.recentIcon, m.now()) + line if withSource { src := c.Source.Name if account, ok := strings.CutPrefix(c.Source.ProviderLabel, string(c.Source.Kind)+" · "); ok { @@ -130,7 +132,7 @@ func (m Model) objectRender() func(styles.Styles, provider.Object, int) string { if o.Enabled != nil && !*o.Enabled { line = sty.Muted.Render(o.Name + " (disabled)") } - line = marks(sty, n, o.Container.Source.Provider, m.recentIcon) + line + line = marks(sty, n, o.Container.Source.Provider, m.recentIcon, m.now()) + line switch state, left := m.expiry(o); state { case expired: line += " " + sty.Error.Render("✗ expired") @@ -179,7 +181,7 @@ func (m *Model) rebind(c provider.Container) string { m.linked[i].Source = c.Source } } - key := containerKey(c) + "|" + string(m.objType) + key := cachefile.ObjectsKey(c, m.objType) if m.onLinks() { m.containers.SetItems(m.linked) m.containers.Select(containerKey(c)) diff --git a/internal/ui/app/fields.go b/internal/ui/app/fields.go index 4b6b2c8..71b3610 100644 --- a/internal/ui/app/fields.go +++ b/internal/ui/app/fields.go @@ -8,6 +8,7 @@ import ( tea "charm.land/bubbletea/v2" "github.com/charmbracelet/x/ansi" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ui/panes" ) @@ -160,7 +161,7 @@ func (m Model) containerFields(c provider.Container) []panes.Field { add("source", cmpOr(c.Source.ProviderLabel, string(c.Source.Kind))+" / "+c.Source.Name) add("web", c.URL) for _, t := range c.ObjectTypes() { - if e, ok := m.cache.objects[containerKey(c)+"|"+string(t)]; ok { + if e, ok := m.cache.objects[cachefile.ObjectsKey(c, t)]; ok { add(strings.ToLower(string(t))+"s", fmt.Sprint(len(e.value))) } } diff --git a/internal/ui/app/jump.go b/internal/ui/app/jump.go index 905cbec..066c841 100644 --- a/internal/ui/app/jump.go +++ b/internal/ui/app/jump.go @@ -107,7 +107,7 @@ func (m *Model) storeEntries() (favs, recent []option) { if m.history { var used []string for _, k := range keys { - if !nodes[k].LastUsed.IsZero() { + if nodes[k].UsedLately(m.now()) { used = append(used, k) } } diff --git a/internal/ui/app/persist.go b/internal/ui/app/persist.go index b2b1117..1fab15f 100644 --- a/internal/ui/app/persist.go +++ b/internal/ui/app/persist.go @@ -33,14 +33,7 @@ type persistedMsg struct{ err error } // isn't a repo: every key starts with the provider ID. func (m *Model) keepCached(key string) bool { return m.keepProvider(cachefile.ProviderOf(key)) } -func (m *Model) keepProvider(id string) bool { return keepIn(m.byID)(id) } - -func keepIn(byID map[string]provider.Provider) func(id string) bool { - return func(id string) bool { - p, ok := byID[id] - return ok && p.Kind() != provider.KindRepo - } -} +func (m *Model) keepProvider(id string) bool { return cachefile.Keep(m.providers)(id) } // loadCacheFile fills the cache from the file, leaving out what's too // old or belongs to accounts that aren't signed in any more. @@ -79,6 +72,7 @@ func (m *Model) loadCacheFile() { // cacheSnapshot is the cache as the file holds it. func (m *Model) cacheSnapshot() cachefile.File { f := cachefile.New() + f.Dropped, m.cacheDropped = m.cacheDropped, nil for id, r := range m.sourceResults { if r.err == nil && m.keepProvider(id) { f.Sources[id] = cachefile.Stamped[[]provider.Source]{At: m.sourcesAt[id], Value: r.sources} @@ -110,7 +104,7 @@ func (m *Model) cacheSnapshot() cachefile.File { // saveCache saves f, merged with the file (lazysecrets list may have // loaded more since), from any goroutine. func (m *Model) saveCache(f cachefile.File) func() error { - path, keep, now := m.cachePath, keepIn(m.byID), m.now() + path, keep, now := m.cachePath, cachefile.Keep(m.providers), m.now() return func() error { return cachefile.Save(path, f, keep, now) } } diff --git a/internal/ui/app/search.go b/internal/ui/app/search.go index 3a8ec03..7648853 100644 --- a/internal/ui/app/search.go +++ b/internal/ui/app/search.go @@ -10,6 +10,7 @@ import ( tea "charm.land/bubbletea/v2" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ref" ) @@ -89,7 +90,7 @@ func (m *Model) searchEntries() (sources, items []option) { return nil }, reload) for _, t := range []provider.ObjectType{provider.TypeSecret, provider.TypeKey, provider.TypeCertificate} { - for _, o := range m.cache.objects[containerKey(c)+"|"+string(t)].value { + for _, o := range m.cache.objects[cachefile.ObjectsKey(c, t)].value { r, err := ref.ForObject(o, "") if err != nil { continue @@ -166,7 +167,7 @@ func (m *Model) coverageOf(in providerFilter) coverage { } for _, v := range e.value { c.vaults++ - key := containerKey(v) + "|" + string(provider.TypeSecret) + key := cachefile.ObjectsKey(v, provider.TypeSecret) if objs, ok := m.cache.objects[key]; ok { c.vaultsLoaded++ c.secrets += len(objs.value) @@ -263,7 +264,7 @@ func (m *Model) queueSource(src provider.Source, force bool) { // queueContainer queues loading c's secrets, unless loaded lately and not // force. func (m *Model) queueContainer(c provider.Container, row string, force bool) { - key := containerKey(c) + "|" + string(provider.TypeSecret) + key := cachefile.ObjectsKey(c, provider.TypeSecret) if e, ok := m.cache.objects[key]; ok && e.fresh(m.now()) && !force { return } @@ -327,7 +328,7 @@ func (m *Model) handleCrawl(msg crawlMsg) tea.Cmd { m.crawl.active-- key := msg.job.row if msg.job.container != nil { - key = containerKey(*msg.job.container) + "|" + string(provider.TypeSecret) + key = cachefile.ObjectsKey(*msg.job.container, provider.TypeSecret) } delete(m.crawl.pending, key) switch { @@ -365,7 +366,7 @@ func (m *Model) sourceMark(row string) string { } loaded, loading := 0, false for _, c := range e.value { - key := containerKey(c) + "|" + string(provider.TypeSecret) + key := cachefile.ObjectsKey(c, provider.TypeSecret) loading = loading || m.crawl.pending[key] if _, ok := m.cache.objects[key]; ok || m.crawl.failed[key] { loaded++ @@ -386,7 +387,7 @@ func (m *Model) sourceMark(row string) string { // (✗) or are loading (◌): whether a subscription is loaded says whether // its vaults are searchable. func (m *Model) vaultMark(c provider.Container) string { - key := containerKey(c) + "|" + string(provider.TypeSecret) + key := cachefile.ObjectsKey(c, provider.TypeSecret) switch { case m.crawl.pending[key]: return m.st.Muted.Render("◌") diff --git a/internal/ui/app/searchview.go b/internal/ui/app/searchview.go index 4a467ad..8f7b469 100644 --- a/internal/ui/app/searchview.go +++ b/internal/ui/app/searchview.go @@ -12,6 +12,7 @@ import ( "charm.land/lipgloss/v2" "github.com/charmbracelet/x/ansi" + "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/match" "git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/ref" @@ -617,7 +618,7 @@ func (m Model) loadHint() string { } loaded := 0 for _, c := range e.value { - key := containerKey(c) + "|" + string(provider.TypeSecret) + key := cachefile.ObjectsKey(c, provider.TypeSecret) if _, ok := m.cache.objects[key]; ok || m.crawl.failed[key] { loaded++ } diff --git a/internal/ui/app/sources.go b/internal/ui/app/sources.go index 4e45209..e1b3bd4 100644 --- a/internal/ui/app/sources.go +++ b/internal/ui/app/sources.go @@ -5,6 +5,7 @@ import ( "fmt" "slices" "strings" + "time" "git.kebcloud.no/keb/lazysecrets/internal/cachefile" "git.kebcloud.no/keb/lazysecrets/internal/provider" @@ -80,7 +81,7 @@ func newSourcesList(iconSet icons.Set, mem *store.Store, recent bool) panes.List kind := st.Kind(r.group) starred := "" if r.kind == rowSource { - starred = marks(st, node, r.source.Provider, recent) + starred = marks(st, node, r.source.Provider, recent, time.Now()) } switch { case r.kind == rowLinks: -- 2.54.0 From 2df54aec1f2268035aec0e86de4af4b9ba3a42c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Wed, 14 Oct 2026 21:29:56 +0200 Subject: [PATCH 45/45] docs: the README's Development entry says how changes land, as the page does --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b2e26ef..d2c9e2c 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ More defails in the [Integration](docs/integration.md) docs secret - [Config](docs/config.md): every option, themes, layered configs, the state file -- [Development](docs/development.md): building, tests, pull requests and +- [Development](docs/development.md): building, tests, how changes land and releasing ## Privacy -- 2.54.0