pax_global_header00006660000000000000000000000064146564740220014524gustar00rootroot0000000000000052 comment=d6a19f0eb5a983610bd65a1647f5955abe3ee69e bubbletea-0.27.0/000077500000000000000000000000001465647402200135375ustar00rootroot00000000000000bubbletea-0.27.0/.gitattributes000066400000000000000000000000171465647402200164300ustar00rootroot00000000000000*.golden -text bubbletea-0.27.0/.github/000077500000000000000000000000001465647402200150775ustar00rootroot00000000000000bubbletea-0.27.0/.github/CODEOWNERS000066400000000000000000000000361465647402200164710ustar00rootroot00000000000000* @meowgorithm @aymanbagabas bubbletea-0.27.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001465647402200172625ustar00rootroot00000000000000bubbletea-0.27.0/.github/ISSUE_TEMPLATE/bug.yml000066400000000000000000000032511465647402200205630ustar00rootroot00000000000000name: Bug Report description: File a bug report labels: [bug] body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! Please fill the form below. - type: textarea id: what-happened attributes: label: What happened? description: Also tell us, what did you expect to happen? validations: required: true - type: textarea id: reproducible attributes: label: How can we reproduce this? description: | Please share a code snippet, gist, or public repository that reproduces the issue. Make sure to make the reproducible as concise as possible, with only the minimum required code to reproduce the issue. validations: required: true - type: textarea id: version attributes: label: Which version of bubbletea are you using? description: '' render: bash validations: required: true - type: textarea id: terminaal attributes: label: Which terminals did you reproduce this with? description: | Other helpful information: was it over SSH? On tmux? Which version of said terminal? validations: required: true - type: checkboxes id: search attributes: label: Search options: - label: | I searched for other open and closed issues and pull requests before opening this, and didn't find anything that seems related. required: true - type: textarea id: ctx attributes: label: Additional context description: Anything else you would like to add validations: required: false bubbletea-0.27.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000014741465647402200217620ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **Setup** Please complete the following information along with version numbers, if applicable. - OS [e.g. Ubuntu, macOS] - Shell [e.g. zsh, fish] - Terminal Emulator [e.g. kitty, iterm] - Terminal Multiplexer [e.g. tmux] **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Source Code** Please include source code if needed to reproduce the behavior. **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** Add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. bubbletea-0.27.0/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000001701465647402200212500ustar00rootroot00000000000000blank_issues_enabled: true contact_links: - name: Discord url: https://charm.sh/discord about: Chat on our Discord. bubbletea-0.27.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011341465647402200230060ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. bubbletea-0.27.0/.github/dependabot.yml000066400000000000000000000014361465647402200177330ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "gomod" directory: "/examples" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "gomod" directory: "/tutorials" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" bubbletea-0.27.0/.github/workflows/000077500000000000000000000000001465647402200171345ustar00rootroot00000000000000bubbletea-0.27.0/.github/workflows/build.yml000066400000000000000000000017361465647402200207650ustar00rootroot00000000000000name: build on: [push, pull_request] jobs: build: strategy: matrix: go-version: [~1.18, ^1] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v4 - name: Download Go modules run: go mod download - name: Build run: | go mod tidy go build -v ./... - name: Test run: go test ./... - name: Build examples run: | go mod tidy go build -v ./... working-directory: ./examples - name: Test examples run: go test -v ./... working-directory: ./examples - name: Build tutorials run: | go mod tidy go build -v ./... working-directory: ./tutorials bubbletea-0.27.0/.github/workflows/coverage.yml000066400000000000000000000012671465647402200214600ustar00rootroot00000000000000name: coverage on: [push, pull_request] jobs: coverage: strategy: matrix: go-version: [^1] os: [ubuntu-latest] runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v4 - name: Coverage env: COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | go test -race -covermode atomic -coverprofile=profile.cov ./... go install github.com/mattn/goveralls@latest goveralls -coverprofile=profile.cov -service=github bubbletea-0.27.0/.github/workflows/examples.yml000066400000000000000000000015611465647402200215000ustar00rootroot00000000000000name: examples on: push: branches: - 'master' paths: - '.github/workflows/examples.yml' - './examples/go.mod' - './examples/go.sum' - './tutorials/go.mod' - './tutorials/go.sum' - './go.mod' - './go.sum' workflow_dispatch: {} jobs: tidy: permissions: contents: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: '^1' cache: true - shell: bash run: | (cd ./examples && go mod tidy) (cd ./tutorials && go mod tidy) - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore: go mod tidy tutorials and examples" branch: master commit_user_name: actions-user commit_user_email: actions@github.com bubbletea-0.27.0/.github/workflows/lint-soft.yml000066400000000000000000000013361465647402200216010ustar00rootroot00000000000000name: lint-soft on: push: pull_request: permissions: contents: read # Optional: allow read access to pull request. Use with `only-new-issues` option. pull-requests: read jobs: golangci: name: lint-soft runs-on: ubuntu-latest steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ^1 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: # Optional: golangci-lint command line arguments. args: --config .golangci-soft.yml --issues-exit-code=0 # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true bubbletea-0.27.0/.github/workflows/lint.yml000066400000000000000000000012441465647402200206260ustar00rootroot00000000000000name: lint on: push: pull_request: permissions: contents: read # Optional: allow read access to pull request. Use with `only-new-issues` option. pull-requests: read jobs: golangci: name: lint runs-on: ubuntu-latest steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ^1 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: # Optional: golangci-lint command line arguments. #args: # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true bubbletea-0.27.0/.github/workflows/release.yml000066400000000000000000000021221465647402200212740ustar00rootroot00000000000000name: goreleaser on: push: tags: - v*.*.* concurrency: group: goreleaser cancel-in-progress: true jobs: goreleaser: uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main secrets: docker_username: ${{ secrets.DOCKERHUB_USERNAME }} docker_token: ${{ secrets.DOCKERHUB_TOKEN }} gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }} goreleaser_key: ${{ secrets.GORELEASER_KEY }} twitter_consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }} twitter_consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }} twitter_access_token: ${{ secrets.TWITTER_ACCESS_TOKEN }} twitter_access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} mastodon_client_id: ${{ secrets.MASTODON_CLIENT_ID }} mastodon_client_secret: ${{ secrets.MASTODON_CLIENT_SECRET }} mastodon_access_token: ${{ secrets.MASTODON_ACCESS_TOKEN }} discord_webhook_id: ${{ secrets.DISCORD_WEBHOOK_ID }} discord_webhook_token: ${{ secrets.DISCORD_WEBHOOK_TOKEN }} # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json bubbletea-0.27.0/.gitignore000066400000000000000000000010071465647402200155250ustar00rootroot00000000000000.DS_Store .envrc examples/fullscreen/fullscreen examples/help/help examples/http/http examples/list-default/list-default examples/list-fancy/list-fancy examples/list-simple/list-simple examples/mouse/mouse examples/pager/pager examples/progress-download/color_vortex.blend examples/progress-download/progress-download examples/simple/simple examples/spinner/spinner examples/textinput/textinput examples/textinputs/textinputs examples/views/views tutorials/basics/basics tutorials/commands/commands .idea coverage.txt bubbletea-0.27.0/.golangci-soft.yml000066400000000000000000000012521465647402200170740ustar00rootroot00000000000000run: tests: false issues: include: - EXC0001 - EXC0005 - EXC0011 - EXC0012 - EXC0013 max-issues-per-linter: 0 max-same-issues: 0 linters: enable: # - dupl - exhaustive # - exhaustivestruct - goconst - godot - godox - gomnd - gomoddirectives - goprintffuncname # - lll - misspell - nakedret - nestif - noctx - nolintlint - prealloc - wrapcheck # disable default linters, they are already enabled in .golangci.yml disable: - deadcode - errcheck - gosimple - govet - ineffassign - staticcheck - structcheck - typecheck - unused - varcheck bubbletea-0.27.0/.golangci.yml000066400000000000000000000006231465647402200161240ustar00rootroot00000000000000run: tests: false issues: include: - EXC0001 - EXC0005 - EXC0011 - EXC0012 - EXC0013 max-issues-per-linter: 0 max-same-issues: 0 linters: enable: - bodyclose - exportloopref - gofumpt - goimports - gosec - nilerr - predeclared - revive - rowserrcheck - sqlclosecheck - tparallel - unconvert - unparam - whitespace bubbletea-0.27.0/.goreleaser.yml000066400000000000000000000002371465647402200164720ustar00rootroot00000000000000includes: - from_url: url: charmbracelet/meta/main/goreleaser-lib.yaml # yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json bubbletea-0.27.0/CONTRIBUTING.md000066400000000000000000000007141465647402200157720ustar00rootroot00000000000000# Contributing Pull requests are welcome for any changes. Consider opening an issue for larger changes to get feedback on the idea from the team. If your change touches parts of the Bubble Tea renderer or internals, make sure that all the examples in the `examples/` folder continue to run correctly. For commit messages, please use conventional commits[^1] to make it easier to generate release notes. [^1]: https://www.conventionalcommits.org/en/v1.0.0 bubbletea-0.27.0/LICENSE000066400000000000000000000020701465647402200145430ustar00rootroot00000000000000MIT License Copyright (c) 2020-2023 Charmbracelet, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. bubbletea-0.27.0/README.md000066400000000000000000000511331465647402200150210ustar00rootroot00000000000000# Bubble Tea

Bubble Tea Title Treatment
Latest Release GoDoc Build Status phorm.ai

The fun, functional and stateful way to build terminal apps. A Go framework based on [The Elm Architecture][elm]. Bubble Tea is well-suited for simple and complex terminal applications, either inline, full-window, or a mix of both.

Bubble Tea Example

Bubble Tea is in use in production and includes a number of features and performance optimizations we’ve added along the way. Among those is a standard framerate-based renderer, a renderer for high-performance scrollable regions which works alongside the main renderer, and mouse support. To get started, see the tutorial below, the [examples][examples], the [docs][docs], the [video tutorials][youtube] and some common [resources](#libraries-we-use-with-bubble-tea). [youtube]: https://charm.sh/yt ## By the way Be sure to check out [Bubbles][bubbles], a library of common UI components for Bubble Tea.

Bubbles Badge   Text Input Example from Bubbles

*** ## Tutorial Bubble Tea is based on the functional design paradigms of [The Elm Architecture][elm], which happens to work nicely with Go. It's a delightful way to build applications. This tutorial assumes you have a working knowledge of Go. By the way, the non-annotated source code for this program is available [on GitHub][tut-source]. [elm]: https://guide.elm-lang.org/architecture/ [tut-source]:https://github.com/charmbracelet/bubbletea/tree/master/tutorials/basics ### Enough! Let's get to it. For this tutorial, we're making a shopping list. To start we'll define our package and import some libraries. Our only external import will be the Bubble Tea library, which we'll call `tea` for short. ```go package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) ``` Bubble Tea programs are comprised of a **model** that describes the application state and three simple methods on that model: * **Init**, a function that returns an initial command for the application to run. * **Update**, a function that handles incoming events and updates the model accordingly. * **View**, a function that renders the UI based on the data in the model. ### The Model So let's start by defining our model which will store our application's state. It can be any type, but a `struct` usually makes the most sense. ```go type model struct { choices []string // items on the to-do list cursor int // which to-do list item our cursor is pointing at selected map[int]struct{} // which to-do items are selected } ``` ### Initialization Next, we’ll define our application’s initial state. In this case, we’re defining a function to return our initial model, however, we could just as easily define the initial model as a variable elsewhere, too. ```go func initialModel() model { return model{ // Our to-do list is a grocery list choices: []string{"Buy carrots", "Buy celery", "Buy kohlrabi"}, // A map which indicates which choices are selected. We're using // the map like a mathematical set. The keys refer to the indexes // of the `choices` slice, above. selected: make(map[int]struct{}), } } ``` Next, we define the `Init` method. `Init` can return a `Cmd` that could perform some initial I/O. For now, we don't need to do any I/O, so for the command, we'll just return `nil`, which translates to "no command." ```go func (m model) Init() tea.Cmd { // Just return `nil`, which means "no I/O right now, please." return nil } ``` ### The Update Method Next up is the update method. The update function is called when ”things happen.” Its job is to look at what has happened and return an updated model in response. It can also return a `Cmd` to make more things happen, but for now don't worry about that part. In our case, when a user presses the down arrow, `Update`’s job is to notice that the down arrow was pressed and move the cursor accordingly (or not). The “something happened” comes in the form of a `Msg`, which can be any type. Messages are the result of some I/O that took place, such as a keypress, timer tick, or a response from a server. We usually figure out which type of `Msg` we received with a type switch, but you could also use a type assertion. For now, we'll just deal with `tea.KeyMsg` messages, which are automatically sent to the update function when keys are pressed. ```go func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { // Is it a key press? case tea.KeyMsg: // Cool, what was the actual key pressed? switch msg.String() { // These keys should exit the program. case "ctrl+c", "q": return m, tea.Quit // The "up" and "k" keys move the cursor up case "up", "k": if m.cursor > 0 { m.cursor-- } // The "down" and "j" keys move the cursor down case "down", "j": if m.cursor < len(m.choices)-1 { m.cursor++ } // The "enter" key and the spacebar (a literal space) toggle // the selected state for the item that the cursor is pointing at. case "enter", " ": _, ok := m.selected[m.cursor] if ok { delete(m.selected, m.cursor) } else { m.selected[m.cursor] = struct{}{} } } } // Return the updated model to the Bubble Tea runtime for processing. // Note that we're not returning a command. return m, nil } ``` You may have noticed that ctrl+c and q above return a `tea.Quit` command with the model. That’s a special command which instructs the Bubble Tea runtime to quit, exiting the program. ### The View Method At last, it’s time to render our UI. Of all the methods, the view is the simplest. We look at the model in its current state and use it to return a `string`. That string is our UI! Because the view describes the entire UI of your application, you don’t have to worry about redrawing logic and stuff like that. Bubble Tea takes care of it for you. ```go func (m model) View() string { // The header s := "What should we buy at the market?\n\n" // Iterate over our choices for i, choice := range m.choices { // Is the cursor pointing at this choice? cursor := " " // no cursor if m.cursor == i { cursor = ">" // cursor! } // Is this choice selected? checked := " " // not selected if _, ok := m.selected[i]; ok { checked = "x" // selected! } // Render the row s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) } // The footer s += "\nPress q to quit.\n" // Send the UI for rendering return s } ``` ### All Together Now The last step is to simply run our program. We pass our initial model to `tea.NewProgram` and let it rip: ```go func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { fmt.Printf("Alas, there's been an error: %v", err) os.Exit(1) } } ``` ## What’s Next? This tutorial covers the basics of building an interactive terminal UI, but in the real world you'll also need to perform I/O. To learn about that have a look at the [Command Tutorial][cmd]. It's pretty simple. There are also several [Bubble Tea examples][examples] available and, of course, there are [Go Docs][docs]. [cmd]: http://github.com/charmbracelet/bubbletea/tree/master/tutorials/commands/ [examples]: http://github.com/charmbracelet/bubbletea/tree/master/examples [docs]: https://pkg.go.dev/github.com/charmbracelet/bubbletea?tab=doc ## Debugging ### Debugging with Delve Since Bubble Tea apps assume control of stdin and stdout, you’ll need to run delve in headless mode and then connect to it: ```bash # Start the debugger $ dlv debug --headless --api-version=2 --listen=127.0.0.1:43000 . API server listening at: 127.0.0.1:43000 # Connect to it from another terminal $ dlv connect 127.0.0.1:43000 ``` If you do not explicitly supply the `--listen` flag, the port used will vary per run, so passing this in makes the debugger easier to use from a script or your IDE of choice. Additionally, we pass in `--api-version=2` because delve defaults to version 1 for backwards compatibility reasons. However, delve recommends using version 2 for all new development and some clients may no longer work with version 1. For more information, see the [Delve documentation](https://github.com/go-delve/delve/tree/master/Documentation/api). ### Logging Stuff You can’t really log to stdout with Bubble Tea because your TUI is busy occupying that! You can, however, log to a file by including something like the following prior to starting your Bubble Tea program: ```go if len(os.Getenv("DEBUG")) > 0 { f, err := tea.LogToFile("debug.log", "debug") if err != nil { fmt.Println("fatal:", err) os.Exit(1) } defer f.Close() } ``` To see what’s being logged in real time, run `tail -f debug.log` while you run your program in another window. ## Libraries we use with Bubble Tea * [Bubbles][bubbles]: Common Bubble Tea components such as text inputs, viewports, spinners and so on * [Lip Gloss][lipgloss]: Style, format and layout tools for terminal applications * [Harmonica][harmonica]: A spring animation library for smooth, natural motion * [BubbleZone][bubblezone]: Easy mouse event tracking for Bubble Tea components * [ntcharts][ntcharts]: A terminal charting library built for Bubble Tea and [Lip Gloss][lipgloss] * [Termenv][termenv]: Advanced ANSI styling for terminal applications * [Reflow][reflow]: Advanced ANSI-aware methods for working with text [bubbles]: https://github.com/charmbracelet/bubbles [lipgloss]: https://github.com/charmbracelet/lipgloss [harmonica]: https://github.com/charmbracelet/harmonica [bubblezone]: https://github.com/lrstanley/bubblezone [ntcharts]: https://github.com/NimbleMarkets/ntcharts [termenv]: https://github.com/muesli/termenv [reflow]: https://github.com/muesli/reflow ## Bubble Tea in the Wild For some Bubble Tea programs in production, see: * [ASCII Movie](https://github.com/gabe565/ascii-movie): a Star Wars ASCII art movie player * [AT CLI](https://github.com/daskycodes/at_cli): execute AT Commands via serial port connections * [Aztify](https://github.com/Azure/aztfy): bring Microsoft Azure resources under Terraform * [brows](https://github.com/rubysolo/brows): a GitHub release browser * [Canard](https://github.com/mrusme/canard): an RSS client * [charm](https://github.com/charmbracelet/charm): the official Charm user account manager * [chatgpt-cli](https://github.com/j178/chatgpt): a CLI for ChatGPT * [chatgpt-tui](https://github.com/tearingItUp786/chatgpt-tui): a TUI for ChatGPT with SQLite sessions * [ChatGPTUI](https://github.com/dwisiswant0/chatgptui): a TUI for ChatGPT * [chezmoi](https://github.com/twpayne/chezmoi): securely manage your dotfiles across multiple machines * [chip-8](https://github.com/braheezy/chip-8): a CHIP-8 interpreter * [chtop](https://github.com/chhetripradeep/chtop): monitor your ClickHouse node without leaving the terminal * [circumflex](https://github.com/bensadeh/circumflex): read Hacker News in the terminal * [clidle](https://github.com/ajeetdsouza/clidle): a Wordle clone * [cLive](https://github.com/koki-develop/clive): automate terminal operations and view them live in a browser * [container-canary](https://github.com/NVIDIA/container-canary): a container validator * [countdown](https://github.com/aldernero/countdown): a multi-event countdown timer * [CRT](https://github.com/BigJk/crt): a simple terminal emulator for running Bubble Tea in a dedicated window, with optional shaders * [cueitup](https://github.com/dhth/cueitup): inspect messages in an AWS SQS queue in a simple and deliberate manner * [Daytona](https://github.com/daytonaio/daytona): an development environment manager * [dns53](https://github.com/purpleclay/dns53): dynamic DNS with Amazon Route53; expose your EC2 quickly, securely and privately * [eks-node-viewer](https://github.com/awslabs/eks-node-viewer): a tool for visualizing dynamic node usage within an EKS cluster * [End Of Eden](https://github.com/BigJk/end_of_eden): a "Slay the Spire"-like, roguelike deck-builder game * [enola](https://github.com/sherlock-project/enola): find social media accounts by username across social networks * [flapioca](https://github.com/kbrgl/flapioca): Flappy Bird on the CLI! * [fm](https://github.com/knipferrc/fm): a terminal-based file manager * [fork-cleaner](https://github.com/caarlos0/fork-cleaner): clean up old and inactive forks in your GitHub account * [fractals-cli](https://github.com/MicheleFiladelfia/fractals-cli): a multiplatform terminal fractal explorer * [fztea](https://github.com/jon4hz/fztea): a Flipper Zero TUI * [gama](https://github.com/termkit/gama): manage GitHub Actions from the terminal * [gambit](https://github.com/maaslalani/gambit): chess in the terminal * [gembro](https://git.sr.ht/~rafael/gembro): a mouse-driven Gemini browser * [gh-b](https://github.com/joaom00/gh-b): a GitHub CLI extension for managing branches * [gh-dash](https://www.github.com/dlvhdr/gh-dash): a GitHub CLI extension for PRs and issues * [gitflow-toolkit](https://github.com/mritd/gitflow-toolkit): a GitFlow submission tool * [Glow](https://github.com/charmbracelet/glow): a markdown reader, browser, and online markdown stash * [go-sweep](https://github.com/maxpaulus43/go-sweep): Minesweeper in the terminal * [gocovsh](https://github.com/orlangure/gocovsh): explore Go coverage reports from the CLI * [got](https://github.com/fedeztk/got): a simple translator and text-to-speech app built on simplytranslate's APIs * [gum](https://github.com/charmbracelet/gum): interactivity and styling for shells and shell scripts * [hiSHtory](https://github.com/ddworken/hishtory): your shell history in context: synced, and queryable * [httpit](https://github.com/gonetx/httpit): a rapid http(s) benchmark tool * [Huh?](https://github.com/charmbracelet/huh): an interactive prompt and form toolkit * [IDNT](https://github.com/r-darwish/idnt): a batch software uninstaller * [json-log-viewer](https://github.com/hedhyw/json-log-viewer): an interactive JSON log viewer * [kboard](https://github.com/CamiloGarciaLaRotta/kboard): a typing game * [kplay](https://github.com/dhth/kplay): inspect messages in a Kafka topic * [laboon](https://github.com/arisnacg/laboon): a Docker-desktop-style container manager * [mc](https://github.com/minio/mc): the official [MinIO](https://min.io) client * [mergestat](https://github.com/mergestat/mergestat): run SQL queries on git repositories * [meteor](https://github.com/stefanlogue/meteor): a highly customizable conventional commit message tool * [mods](https://github.com/charmbracelet/mods): AI on the CLI, built for pipelines * [nachrichten](https://github.com/zMoooooritz/nachrichten): access up-to-date news in German provided by the [Tagesschau](https://www.tagesschau.de/) * [Neon Modem Overdrive](https://github.com/mrusme/neonmodem): a BBS-style TUI client for Discourse, Lemmy, Lobste.rs and Hacker News * [nom](https://github.com/guyfedwards/nom): an RSS reader and manager * [Noted](https://github.com/torbratsberg/noted): a note viewer and manager * [outtasync](https://github.com/dhth/outtasync): identify CloudFormation stacks that are out of sync with their template files * [pathos](https://github.com/chip/pathos): a PATH environment variable editor * [Plandex](https://github.com/plandex-ai/plandex): a terminal-based AI coding engine for complex tasks * [portal](https://github.com/ZinoKader/portal): secure transfers between computers * [prs](https://github.com/dhth/prs): stay up to date with your PRs * [puffin](https://github.com/siddhantac/puffin): a TUI for hledger to manage your finances * [pug](https://github.com/leg100/pug): terraform task manager * [punchout](https://github.com/dhth/punchout): takes the suck out of logging time on JIRA * [redis-viewer](https://github.com/SaltFishPr/redis-viewer): a Redis database browser * [redis_tui](https://github.com/mat2cc/redis_tui): a Redis database browser * [schemas](https://github.com/dhth/schemas): lets you inspect postgres schemas in the terminal * [scrabbler](https://github.com/wI2L/scrabbler): an automatic draw tool for your duplicate Scrabble games * [sku](https://github.com/fedeztk/sku): Sudoku on the CLI * [Slides](https://github.com/maaslalani/slides): a markdown-based presentation tool * [SlurmCommander](https://github.com/CLIP-HPC/SlurmCommander): a Slurm workload manager * [Soft Serve](https://github.com/charmbracelet/soft-serve): a command-line-first Git server that runs a TUI over SSH * [solitaire-tui](https://github.com/brianstrauch/solitaire-tui): Klondike Solitaire for the terminal * [StormForge Optimize Controller](https://github.com/thestormforge/optimize-controller): a tool for experimenting with application configurations in Kubernetes * [Storydb](https://github.com/grrlopes/storydb): an improved bash/zsh-style ctrl+r command history finder * [STTG](https://github.com/wille1101/sttg): a teletext client for SVT, Sweden’s national public television station * [sttr](https://github.com/abhimanyu003/sttr): a general-purpose text transformer * [superfile](https://github.com/MHNightCat/superfile) a fancy, modern terminal-based file manager * [tasktimer](https://github.com/caarlos0/tasktimer): a dead-simple task timer * [termdbms](https://github.com/mathaou/termdbms): a keyboard and mouse driven database browser * [tgpt](https://github.com/aandrew-me/tgpt): conversational AI for the CLI; no API keys necessary * [ticker](https://github.com/achannarasappa/ticker): a terminal stock viewer and stock position tracker * [trainer](https://github.com/rusinikita/trainer): a Go concurrency coding interview simulator with learning materials * [tran](https://github.com/abdfnx/tran): securely transfer stuff between computers (based on [portal](https://github.com/ZinoKader/portal)) * [Trufflehog](https://github.com/trufflesecurity/trufflehog): find leaked credentials * [Typer](https://github.com/maaslalani/typer): a typing test * [typioca](https://github.com/bloznelis/typioca): a typing test * [tz](https://github.com/oz/tz): a scheduling aid for people in multiple time zones * [ugm](https://github.com/ariasmn/ugm): a unix user and group browser * [walk](https://github.com/antonmedv/walk): a terminal navigator * [wander](https://github.com/robinovitch61/wander): a HashiCorp Nomad terminal client * [WG Commander](https://github.com/AndrianBdn/wg-cmd): a TUI for a simple WireGuard VPN setup * [wishlist](https://github.com/charmbracelet/wishlist): an SSH directory ## Feedback We'd love to hear your thoughts on this project. Feel free to drop us a note! * [Twitter](https://twitter.com/charmcli) * [The Fediverse](https://mastodon.social/@charmcli) * [Discord](https://charm.sh/chat) ## Acknowledgments Bubble Tea is based on the paradigms of [The Elm Architecture][elm] by Evan Czaplicki et alia and the excellent [go-tea][gotea] by TJ Holowaychuk. It’s inspired by the many great [_Zeichenorientierte Benutzerschnittstellen_][zb] of days past. [elm]: https://guide.elm-lang.org/architecture/ [gotea]: https://github.com/tj/go-tea [zb]: https://de.wikipedia.org/wiki/Zeichenorientierte_Benutzerschnittstelle ## License [MIT](https://github.com/charmbracelet/bubbletea/raw/master/LICENSE) *** Part of [Charm](https://charm.sh). The Charm logo Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة bubbletea-0.27.0/commands.go000066400000000000000000000127021465647402200156710ustar00rootroot00000000000000package tea import ( "time" ) // Batch performs a bunch of commands concurrently with no ordering guarantees // about the results. Use a Batch to return several commands. // // Example: // // func (m model) Init() Cmd { // return tea.Batch(someCommand, someOtherCommand) // } func Batch(cmds ...Cmd) Cmd { var validCmds []Cmd //nolint:prealloc for _, c := range cmds { if c == nil { continue } validCmds = append(validCmds, c) } switch len(validCmds) { case 0: return nil case 1: return validCmds[0] default: return func() Msg { return BatchMsg(validCmds) } } } // BatchMsg is a message used to perform a bunch of commands concurrently with // no ordering guarantees. You can send a BatchMsg with Batch. type BatchMsg []Cmd // Sequence runs the given commands one at a time, in order. Contrast this with // Batch, which runs commands concurrently. func Sequence(cmds ...Cmd) Cmd { return func() Msg { return sequenceMsg(cmds) } } // sequenceMsg is used internally to run the given commands in order. type sequenceMsg []Cmd // Every is a command that ticks in sync with the system clock. So, if you // wanted to tick with the system clock every second, minute or hour you // could use this. It's also handy for having different things tick in sync. // // Because we're ticking with the system clock the tick will likely not run for // the entire specified duration. For example, if we're ticking for one minute // and the clock is at 12:34:20 then the next tick will happen at 12:35:00, 40 // seconds later. // // To produce the command, pass a duration and a function which returns // a message containing the time at which the tick occurred. // // type TickMsg time.Time // // cmd := Every(time.Second, func(t time.Time) Msg { // return TickMsg(t) // }) // // Beginners' note: Every sends a single message and won't automatically // dispatch messages at an interval. To do that, you'll want to return another // Every command after receiving your tick message. For example: // // type TickMsg time.Time // // // Send a message every second. // func tickEvery() Cmd { // return Every(time.Second, func(t time.Time) Msg { // return TickMsg(t) // }) // } // // func (m model) Init() Cmd { // // Start ticking. // return tickEvery() // } // // func (m model) Update(msg Msg) (Model, Cmd) { // switch msg.(type) { // case TickMsg: // // Return your Every command again to loop. // return m, tickEvery() // } // return m, nil // } // // Every is analogous to Tick in the Elm Architecture. func Every(duration time.Duration, fn func(time.Time) Msg) Cmd { n := time.Now() d := n.Truncate(duration).Add(duration).Sub(n) t := time.NewTimer(d) return func() Msg { ts := <-t.C t.Stop() for len(t.C) > 0 { <-t.C } return fn(ts) } } // Tick produces a command at an interval independent of the system clock at // the given duration. That is, the timer begins precisely when invoked, // and runs for its entire duration. // // To produce the command, pass a duration and a function which returns // a message containing the time at which the tick occurred. // // type TickMsg time.Time // // cmd := Tick(time.Second, func(t time.Time) Msg { // return TickMsg(t) // }) // // Beginners' note: Tick sends a single message and won't automatically // dispatch messages at an interval. To do that, you'll want to return another // Tick command after receiving your tick message. For example: // // type TickMsg time.Time // // func doTick() Cmd { // return Tick(time.Second, func(t time.Time) Msg { // return TickMsg(t) // }) // } // // func (m model) Init() Cmd { // // Start ticking. // return doTick() // } // // func (m model) Update(msg Msg) (Model, Cmd) { // switch msg.(type) { // case TickMsg: // // Return your Tick command again to loop. // return m, doTick() // } // return m, nil // } func Tick(d time.Duration, fn func(time.Time) Msg) Cmd { t := time.NewTimer(d) return func() Msg { ts := <-t.C t.Stop() for len(t.C) > 0 { <-t.C } return fn(ts) } } // Sequentially produces a command that sequentially executes the given // commands. // The Msg returned is the first non-nil message returned by a Cmd. // // func saveStateCmd() Msg { // if err := save(); err != nil { // return errMsg{err} // } // return nil // } // // cmd := Sequentially(saveStateCmd, Quit) // // Deprecated: use Sequence instead. func Sequentially(cmds ...Cmd) Cmd { return func() Msg { for _, cmd := range cmds { if cmd == nil { continue } if msg := cmd(); msg != nil { return msg } } return nil } } // setWindowTitleMsg is an internal message used to set the window title. type setWindowTitleMsg string // SetWindowTitle produces a command that sets the terminal title. // // For example: // // func (m model) Init() Cmd { // // Set title. // return tea.SetWindowTitle("My App") // } func SetWindowTitle(title string) Cmd { return func() Msg { return setWindowTitleMsg(title) } } type windowSizeMsg struct{} // WindowSize is a command that queries the terminal for its current size. It // delivers the results to Update via a [WindowSizeMsg]. Keep in mind that // WindowSizeMsgs will automatically be delivered to Update when the [Program] // starts and when the window dimensions change so in many cases you will not // need to explicitly invoke this command. func WindowSize() Cmd { return func() Msg { return windowSizeMsg{} } } bubbletea-0.27.0/commands_test.go000066400000000000000000000040311465647402200167240ustar00rootroot00000000000000package tea import ( "fmt" "testing" "time" ) func TestEvery(t *testing.T) { expected := "every ms" msg := Every(time.Millisecond, func(t time.Time) Msg { return expected })() if expected != msg { t.Fatalf("expected a msg %v but got %v", expected, msg) } } func TestTick(t *testing.T) { expected := "tick" msg := Tick(time.Millisecond, func(t time.Time) Msg { return expected })() if expected != msg { t.Fatalf("expected a msg %v but got %v", expected, msg) } } func TestSequentially(t *testing.T) { expectedErrMsg := fmt.Errorf("some err") expectedStrMsg := "some msg" nilReturnCmd := func() Msg { return nil } tests := []struct { name string cmds []Cmd expected Msg }{ { name: "all nil", cmds: []Cmd{nilReturnCmd, nilReturnCmd}, expected: nil, }, { name: "null cmds", cmds: []Cmd{nil, nil}, expected: nil, }, { name: "one error", cmds: []Cmd{ nilReturnCmd, func() Msg { return expectedErrMsg }, nilReturnCmd, }, expected: expectedErrMsg, }, { name: "some msg", cmds: []Cmd{ nilReturnCmd, func() Msg { return expectedStrMsg }, nilReturnCmd, }, expected: expectedStrMsg, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if msg := Sequentially(test.cmds...)(); msg != test.expected { t.Fatalf("expected a msg %v but got %v", test.expected, msg) } }) } } func TestBatch(t *testing.T) { t.Run("nil cmd", func(t *testing.T) { if b := Batch(nil); b != nil { t.Fatalf("expected nil, got %+v", b) } }) t.Run("empty cmd", func(t *testing.T) { if b := Batch(); b != nil { t.Fatalf("expected nil, got %+v", b) } }) t.Run("single cmd", func(t *testing.T) { b := Batch(Quit)() if _, ok := b.(QuitMsg); !ok { t.Fatalf("expected a QuitMsg, got %T", b) } }) t.Run("mixed nil cmds", func(t *testing.T) { b := Batch(nil, Quit, nil, Quit, nil, nil)() if l := len(b.(BatchMsg)); l != 2 { t.Fatalf("expected a []Cmd with len 2, got %d", l) } }) } bubbletea-0.27.0/examples/000077500000000000000000000000001465647402200153555ustar00rootroot00000000000000bubbletea-0.27.0/examples/README.md000066400000000000000000000170661465647402200166460ustar00rootroot00000000000000# Examples ### Alt Screen Toggle The `altscreen-toggle` example shows how to transition between the alternative screen buffer and the normal screen buffer using Bubble Tea. ### Chat The `chat` examples shows a basic chat application with a multi-line `textarea` input. ### Composable Views The `composable-views` example shows how to compose two bubble models (spinner and timer) together in a single application and switch between them. ### Credit Card Form The `credit-card-form` example demonstrates how to build a multi-step form with `textinput`s bubbles and validation on the inputs. ### Debounce The `debounce` example shows how to throttle key presses to avoid overloading your Bubble Tea application. ### Exec The `exec` example shows how to execute a running command during the execution of a Bubble Tea application such as launching an `EDITOR`. ### Full Screen The `fullscreen` example shows how to make a Bubble Tea application fullscreen. ### Glamour The `glamour` example shows how to use [Glamour](https://github.com/charmbracelet/glamour) inside a viewport bubble. ### Help The `help` example shows how to use the `help` bubble to display help to the user of your application. ### Http The `http` example shows how to make an `http` call within your Bubble Tea application. ### Default List The `list-default` example shows how to use the list bubble. ### Fancy List The `list-fancy` example shows how to use the list bubble with extra customizations. ### Simple List The `list-simple` example shows how to use the list and customize it to have a simpler, more compact, appearance. ### Mouse The `mouse` example shows how to receive mouse events in a Bubble Tea application. Code ### Package Manager The `package-manager` example shows how to build an interface for a package manager using the `tea.Println` feature. ### Pager The `pager` example shows how to build a simple pager application similar to `less`. ### Paginator The `paginator` example shows how to build a simple paginated list. ### Pipe The `pipe` example demonstrates using shell pipes to communicate with Bubble Tea applications. ### Animated Progress The `progress-animated` example shows how to build a progress bar with an animated progression. ### Download Progress The `progress-download` example demonstrates how to download a file while indicating download progress through Bubble Tea. Code ### Static Progress The `progress-static` example shows a progress bar with static incrementation of progress. ### Real Time The `realtime` example demonstrates the use of go channels to perform realtime communication with a Bubble Tea application. ### Result The `result` example shows a choice menu with the ability to select an option. ### Send Msg The `send-msg` example demonstrates the usage of custom `tea.Msg`s. ### Sequence The `sequence` example demonstrates the `tea.Sequence` command. ### Simple The `simple` example shows a very simple Bubble Tea application. ### Spinner The `spinner` example demonstrates a spinner bubble being used to indicate loading. ### Spinners The `spinner` example shows various spinner types that are available. ### Split Editors The `split-editors` example shows multiple `textarea`s being used in a single application and being able to switch focus between them. ### Stop Watch The `stopwatch` example shows a sample stop watch built with Bubble Tea. ### Table The `table` example demonstrates the table bubble being used to display tabular data. ### Tabs The `tabs` example demonstrates tabbed navigation styled with [Lip Gloss](https://github.com/charmbracelet/lipgloss). ### Text Area The `textarea` example demonstrates a simple Bubble Tea application using a `textarea` bubble. ### Text Input The `textinput` example demonstrates a simple Bubble Tea application using a `textinput` bubble. ### Multiple Text Inputs The `textinputs` example shows multiple `textinputs` and being able to switch focus between them as well as changing the cursor mode. ### Timer The `timer` example shows a simple timer built with Bubble Tea. ### TUI Daemon The `tui-daemon-combo` demonstrates building a text-user interface along with a daemon mode using Bubble Tea. ### Views The `views` example demonstrates how to build a Bubble Tea application with multiple views and switch between them. bubbletea-0.27.0/examples/altscreen-toggle/000077500000000000000000000000001465647402200206145ustar00rootroot00000000000000bubbletea-0.27.0/examples/altscreen-toggle/README.md000066400000000000000000000001061465647402200220700ustar00rootroot00000000000000# Alt Screen Toggle bubbletea-0.27.0/examples/altscreen-toggle/altscreen-toggle.gif000066400000000000000000001435621465647402200245550ustar00rootroot00000000000000GIF89aX!/ ! 6!!!!!7"""###$#@$$$%%%&&&'&&'''((()&')))*'(***+'(+)U+++,+Y,,,---.().../(*///0001(*11122231n3334),4445556*-6667*.7778889*.97999:8:::;+/;9;;;<+/<<<=:===>>>?,1???@@@A-2AAABBBCCCD-3DDDEEEFCFFFG.5GGGH/5HHHI.5IIIJ/6JJJK/6KHKKKLHLLLM07MMMN07NNNOOOPPPQQQR09RRRSOSSSTPTTTUQUUUVVVW2P?Q@R@SAUBWCXCYE[F]F^G_H`IaIcJeKfMhNjMjOlPmOmPnQoQoRqSsTuUvVwUxWzX|X|Y~[[]]_! NETSCAPE2.0!,X!/ ! 6!!!!!7"""###$#@$$$%%%&&&'&&'''((()&')))*'(***+'(+)U+++,+Y,,,---.().../(*///0001(*11122231n3334),4445556*-6667*.7778889*.97999:8:::;+/;9;;;<+/<<<=:===>>>?,1???@@@A-2AAABBBCCCD-3DDDEEEFCFFFG.5GGGH/5HHHI.5IIIJ/6JJJK/6KHKKKLHLLLM07MMMN07NNNOOOPPPQQQR09RRRSOSSSTPTTTUQUUUVVVW2P?Q@R@SAUBWCXCYE[F]F^G_H`IaIcJeKfMhNjMjOlPmOmPnQoQoRqSsTuUvVwUxWzX|X|Y~[[]]_H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~'4oj'vpHkput0$TK'o1HGsC Q?<&*wD4v5<GQ 4HӖ0j40IAG'mk1APdvoq5=وspoGУnW)pP|n'7~G.Wgw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN8!,W!,zP H࿃&,p‡6Q"C-ĨPA= a=DFgQ=R*IJBOކ %WʆS&CP}4ZMKsC/.kO%[╩T]:p=Ik NA\ћ5 52Eoĕ,pGOᯏ譳X 7z(ef+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř{G:>I ,“^J9);%ZnP2=W 20A f 'iϳ-gO1^or'+(LO\*g*+))`Zw; 2fHёAG`%\ iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$ɃKZrƓћ9SK,)͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fT3Gw:]ߙ ~ըVק&z,lq!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+R&I3k^)0M6s'CI J^QNZ T&=r?9⼚V;oZd?5lUpu(]+9ԩD>UkC 84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$Hdž30Fg;Wl'u= %)x%RB%Sq#g *ilMЍ30IO5IJ-4`96$sgQԂ W) FQzRJ\Q.cKَa 2Zcm2gli&!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,B38=y8Ow|JR/z` g!M%E3 PYb#>oJħƘ|0;&%Q`1z_q(uSÚOp0 KB,pf5c̔I6]ɀ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.ah"͒-W23' "ɣWP$(:zSE*GBc])c m"YUqU[ޫSUݴyu{G]Ό t=L9[%_ɀ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,hř2{G^Zμ %)P+\w(EYU9{n ؈ɶ;F`p) 3Ř{DpE8y+ (3 AKQč) qTkMR/sa#NM쿷% !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,hř2{G^Zμ %)P+\w(EYU9{n ؈ɶ;F`p) 3Ř{DpE8y+ (3 AKQč) qTkMR/sa#NM쿷% !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adƕ-⩃ =z8\Y^

UTU'fuc׏$eI2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+R&I3k^)0M6s'CI J^QNZ T&=r?9⼚V;oZd?5lUpu(]+9ԩD>UkC 84俔,c֜I-!,W!,W!,W!,"P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,řvHGW"g;1PIR 9zSBqW9 hDO]<(lq\K-=kkmRقtҭH'Q:+*zqGz9 3'=y$mJ!7Y1fJ۳eצe@!,W!,0P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$xęDG'R|$)POzxl(HUxJ `4M[<:(`bJW_6VXsWgD]u!i֘OxN+!4c1 v4)=q Osde&KLQ"z d"^%$Rz(ǷP H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$xęDG'R|$)POzxl(HUxJ `4M[<:(`bJW_6VXsWgD]u!i֘OxN+!4c1 v4)=q Osde&KLQ"z d"^%$Rz(ǷVLdl,!2$)| EcOM2&ِ^:.J$n&.=DDcV ==-A^[tc=t3_6AHB2$H{?<&1xQooHEӌ1DcDFL&S:=^}cD po )?L/$EljPdHuы [I 86F̥4QG1y!ȊdaHM6Ќ3vIc W |2|3 Mj& QA(!AСH@hSƇ<@c21iBGv"$d/LfSYǍfIf ׬$3Y *~X+,:ND H-44f ,Mrτ0YA!Kr !(" L Q ռ(%-90L&0b:(~" TzSt!-5:b: a1mHOReEA SO_t L ̃N$*dFjYL."`Veؤҡ@~5؁O0mRPZ~Byc8ǚƬI@Cэ3 !App&zcIa6F%u"$$ט|'c£e?;/~+ߴZND+v|l`Z8V7>G=zI#=Y<-.B &\ p`I%Gx6dʱ1 yDWǀPNʥp)wVЎT%'R)ZShas7p {I\ `b ) ֌|@ A舣!M>{fKRgԨNuNLĨաnZgָfw-\Z,6Z~MbNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOP/lw@<(("tP#$ J=, 񊗷 ZI _K~ߛA>~~|]zB0d Bϐp%}Rj V{@a@bq!B7.R_ xA Sp ufEsPw1|G@  D%s3m(%H0zu.xq1zxPwkP&xuW;5B}tPwxpW hH \0+0(D1P(T(8g@'$h-1(4 >؃0uW0xP" 8 wPwtPWǂuLj!!u! PwqB@X3 'hyЉ18XS0k5x dz>ɈXwg(&n}&(h)AX\ Pw%(u1h~`x7xu7}+NS8KxG(Pw(tXuc&1{P)`uWf zH)+ْ茑 0;Xw+`hpsP.Pw)$ eH195I<铀0}m"u)4 6)xw ЃthJ׌qP&@Xx.oL5h(Ie  !0(.{QI KYIYxPQl0i I)əxz9i!uv ђN )1Xw0ni@ןIV$?Pw &mzqHFЩMi | yd ~ٌi**1SQx+ڢmuaEJH0,ZʢuǚףAWPbWwg": b>zʧh -@(0z2ALə퇨 Aɕ~JzJT:9izXAbz (qbb+aah iɄgBi ^)Y  \0N* ugB-Ys  !FzHڔK:XwZwJhBb aH*! kuJ1 q% ǖ%dXϷ#+{X &[w)[` x#iJu|i:گ*K0'_;7 =&ApV1 Axh)AY|Yd 0uW}9d:@:ʖ#pykwﲋHђȪ+Q+JVPwV)'X{۷yk {|׈!+}K+H!{dA`](Xjx *Q8Ё pu&Q\ u5Wyr [w S20Ȭ)xxL< &DpN'^@V<)!4 &DSyJk~PajHnK~8x)vXת&\l)b\ws`L 7tкloL!Xp~h!& ӻs\v]L8'Ȣu!>tek\ȇlȑ< Wv)cmpbY7Gx;tuǜ'z$* έR˪TO꫑P(GH ,@Є@pa >KݬIXw Px dp\_ʉPp۴=}Ӎ ?  E pz A/lAAT]BmH3vWVfhl K=1Zj!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWHPÇ#JHŋ3jȱǏ Cd("ɓ"S\RI-cʜI$J/"Y'G> ,ѣ-NP)ҧ;u>e UFobtPի\zJ1ў%rlWM ;2,ݮFTClpʗ=l wб.Xi䂗S]Zqfʛ5#hèWNiɒ?W,3oW׾E~KZw!Tܰ5Ҡlr7Ԋ޻فv^yؚO&sQ;N-{E'y(%w v]'sV\}bpIHsaG(Z}V" gއaS]80†_)W{,򈛐4NHw()I"ei3X@6ɤC$~Ue[&#ޗx頞1yl u9sD5cgg+rᄢhZ헣vJ]6G餓J'tj>[Zp:딥B ܒzDjdp دr8$W.!BFmmĺ?tB[UHEn Kmᆱ,z'pMZGJlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx筷߀.n'7Wng#砇.w~騧ꫛn.쑻N箻߾8,3* .3Lw#'8`P)dRTs,ѧBc_~_'FÀuЃi<H^ϰ2hpSqzjby;ɸ%PGpah$ +(衾O EP:X ^F RZ"hR4РJ!,. ?:Adpf7ڏP<{ t&<{؃ٷ~kW }?ьnޏx\ʎ#~ӂ3Mpo\1< 6Cl$49聎#$@`J L0@Je{@׎+[DFZԂVD=VXUqxf ܣ8? ׉F dlc~ C[Qb!uhN+-gPpb׏Dd(AX D * I$ ـ#?S8+R,~JS@xAq6iM YOkAAJΘ.=Kޒ ʠG2>LB} 08q?! oirf~%\Z7o.tXo18#d)a~h?7CGih:)q 4M[."uG_ 2L$8Dfhsz< ~ȶN`?4.:wg#xO[( J- p^q3 ۦV:v7a"OHu$QE ߻^O\Xms߀kы#=QPîy;lo+e$eyo|(ذ߰:· Cyq̾ /6}?~^uc=o3_{ 7{p~v0tDD@0D3!tWʗe8a`?`xxctO7W77d c 0i~egwCDbFuaG8Z7p)XiB~bn}3HX.h8 vCq t Kݠ\ S}Q )qUr}7}!x'8!`?fOxG8_' 8oD>~S^A}S^@}Udxt7]gb Lx wrȊ{ x=0hHKmѳ & F8J \P`=/Uv9C ~s 05Nc0 a^h^dp\PĔMZ7$i?&Ia)yzNHR}@aPQP4AZ+9j'/ R)S PsSP mR(gcKa(=S2roGf>aa7t.6L ei vI`Y},ӘoWif5yi'MnM` +v #w/ȓ p8@P`q8!`~Ds)_ 58)Z_<,98 lf8 ;C9A虞eٞ98 9yi::Zz ڠH!zJ4 ¡?!&z(Z$/)ڢ.#4Z!.6< 8*+ңB:*2A @DڤN0+KʤJX#+.ʒ`$(QR^'}1Vj0aڦ0:"#2"nڧ.Z2ղ$BlJ{Z#nQ0⧌B"-dI:$r"j22(z""(kz"s*,Gz%/BR/dj'Ӫr-prj./Zt".(jҺ,z*I1:ʠjpQ &:j'욠'\29zڭ횯ɂ&:z1!ѲK&[2R͒۱+ ,!#Kj)ʲ "/K8:<۳>@B;D[F{HJL۴NPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{xuU'|dOP;P-4kdC @ GC`52{*-빨{4ۺ;6k5 Ǜ,QK;.  7A Wqa!-"!^P@{p{P`@Sp iEsP G@  "(sQ m85L0z>|q1xPkPx +dBtPxp[!l'L \0V+0,T1€Pd8<g@74l=A,D NĀ0[@ܹ$  < ɀ ɀwPtP[%uɅ!!;E PqRP\3 ,ʢlA<ʲ<ţ@k}8x dNٌ˷\ ˚, nϝ,lA˶\L P(,Ņ1l~q+Pɡ |,C 0{Ax%P\Y \$&Q7-`P%]| ѻ{>* @ҀcJąpί <5l@\dO!DmO +ױE IaQԀp͇ML ,Ge@`ϕKL ,g}+PNڱ=MÀ<5KՀ A 5@62@ݦӭ~00·!ݲM!Ӑ] >ύ… A)Q,N}A pʀ| a[`%^'ޞ{`2ޫ̌ؠKݬ߽SMMpHE8:>>& ^0@mi=n`]"Np,(+>.p=!=篜荞EcpQ] A~[h e>=z·˛>>~<|-n]{N>އ.*l*m^:m \pNE@ 8LL>>]~廞^Ü.z~.mls.|A-q6 6pi߻4?i :_=o` x#z-٭~m NAsPAL<_P,or }\O?x+ 6/8P]u0[}u>@K#pщʩ_?MzpzT u]N>K>Q\!ʼ~[p~r~ɫ/ےOok0{2O/O?X5dA ܳ`=`@gf = r$F< &(KƂRLdHA A^&#͆iV`ƎCB| @eh^ @k "@iQ @1#)3ρ @ .m>̈́ӟf$,OlכXa3A/K NN"D {+";7LGA-V1]_ ~ca}C^oEw: b8B#1z4͈]2d@f]#- &`De!IГBd ,My 1J.g9B2!QADr񗭌$1_9fFCT$pi;j'Gn֐ :׿BNp̣jt)Xʒy{r[02b1T?ЁL*35NsT P]0$)jx:-KΐDAvgNQ@ZS{0HՕ˴a'cfU9U*L@VճOdZQɝ0bJ;ՉS4Kzm)N)}Q)9 <(ɷXzmNγ Y,VmiUˡ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWH챇‡#JHŋ3jȱǏ C<()fTb˗0c*LrVK8s =y,G(0cҥM-JhԫX FE?ʫpZB4V-Xdʝ[ cl [jÈȁ *(z> pٳ  MY OGl`+.<"툖N{;vt`ަD#7s7' 2V+A$\Y3[N]-ӷ`x@ T6tu; 4 QpBJ<d!rt}] ;AO<T}SJB$ <<Ԃ;Ds!=U@EXLET-]:KZSDI0#4?OmDEu퐧 TRг A~*HTԣ@dc&=h(H" =$uJ1ؗAfMyP)3 Q7 ˌy$DbЧ{T1\!"D-Bh},= O(DQ C:G Q TQpl j.KT- >z4 p71@ @#ZB7@H6JT,!I A24ɻ$=wPHcL]6!4%@On! ZPX.X |GE -A<v~8|H.F!Ӡ|lGld BRѣV)"=Z(PiE{#<`B T(14F5oObG 0ȧ n)Q P}#ATȅ(g h )JYA!GPDDaxE!Q2Z`F @ $zRie?Q&= HX{8̃86VD(.Ha=dKd\}o k=p{>EIT M1S D@At b|'2sx E^A $A(<́T8-NɡE%Eype@p@t@iF7ӎnXt8.xO\WUPVZAUPpW8G#'tt5=JQ;)ZԱv ]A,rC━ I^9:4c) 3 VX*gT^[1aFZ٢|v yOx!1G% &w6[HEͮGzjn4" KP %>iB4r2A6 }yr\CJP\$#!@,AڍKX WIYO&&Ѱ<8 NW  )иWϱYID1wP3T Se>N (B e)3Xβ.{`L2hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָε3"^MbNf;AMj[ζ-mlMnN׽nsmw ηm{8;Ox k+w ~^äsH"{7n\$OM%WgNjW-/:r1I'R /yρ.w}L߹[vEuZ:֣i)v]"^;nu]eBlKD?׿x~橫;go<1tG>!ϼ闇-TPǼWu{|}~yZg;wpG^Ͻkۗ^/p'=??g|ȗAOC‡?{w'ɏqt_kW|٧xQvW|Wxrwǀms8oH(8p,ւ0l&4l3X8v<8@B8DXFxHJL؄NP&QXVxXZ@8<`b8d8^ejlXgmr8Y9Axzhv{8v0 Q FІȈPh2 / V hH(ehbf0Q R#\@]`H؋8ذ_ cB.+@ ^! VXpx8ɨ_+a9bybmaNDq !a?djh!YIH9A)p6pHi Yb&KqZK 2!FPhYLq"怔2 IH ^M@6IY]C8eyDP x  CCЗB|~ N8f DXv'z'^J8EIUr%%T%%arIY`jcmBoBNX@> $YmI)C؜HxO Aҙ ˨p )p橉لc&c! 1-".O_Ԛ"++2,BTТ1-P-NQ|ɝB؜љ`y)ʜ. 2*V !  )О@8 Ah!i꣜0P:f-TH32@CV>bVM)/tQ31s DA36cQxݩ @ʨ*Bh Fڈu@h ` @h(ʞAْ@hzbKDq 9cF2@e%173c8bP8AȢ> kY ֊ZBH0F IUZ@0AH0П)P皮If#6Ӛ3A*OC 6*Z`A% `*;f>+; A f5dC͚%(*8&kCXF+5 jϰ -3˱J^hlnbV~1FQFA*MM rU{ʵzAxۭDH9'럚W.1 R:oA *:+d&A$t@z1%ѸcJJ+˴넞@l ckvB菆 6f 2 aAh`A8*kCs P EC ²CQR+W# ; A IY+AXВ@p ;;"$)`·ʄeVV9H[CΠ!UTeU݀UeWaeXWHXSrNMx Pƚhe Kdlpi@+u AОѩ(}PP噎Q:ǚ9JȀfP \C\E HK9BUu]Zҥ8t[[˄`e u vìn~| {3 u i )` Vz O8gvW@d9`)ia,k AQ؇2ARh0]ЗM=ђxѻ==z&}(*,.02=4]6}8:<>@B=D]F}HJLNPR=T]V}XZ\^`b=d]f}ִV9֗j{֕frzwgv&~{ y)x~]ׇ-ؽA؃6~:'w'rxv{(]t>(}Í:x:h{ ܼܱm|u;~'ܺ]~ޭ-'˭ݴ{}ݬݤ7=ۋGq uM=o>~}~}zp}M٤=Uw>y }~WčG|]d >v7:5!NrB>x'75ڒێ xQL捁}F8~։.}enN]p}嗮z^3N>L={GN*|-x N؁㕞|$;-M"^s.+>M볮n>u~޲NGm~>o:!~>w>֍ }O#o.;nOjnw⺞)?^'qM.hpbMZaU`b?d_fhjlf P^p?q/jJ@b#aE@ZEIvy/jD~oS{"8g_&-`_~OaO&1 _A +1/_AS a_HǯO/?xx z`WxA@( LGC ņsR$ ^f=@=ٓ3M0bH=Iȑx@UzG-$s 1-bI<)mЃw8PV=w[n93 q'PC*@OT4d ?ABh#F@ & 35IH8ېNR4鄧e $HHS)h}u q uݛ=\]V|`PkN.Hǡ(L B9ksH qC$XPSH 8 T$EQjC5QŎ'R 6&sĀ@'5^GaD!=E2g, BBʆ<.sbg۲ 8# 7dk HȎ=J[ȄUk+− ӘB@A$Et@x^!@ЦBHʇ|X2 $6y\eȚ@s&jb6 Iְ7\jO$INEHm4$  BHg vDA7ޡ \B[ #w~M6lF6%d eQԥ._*,iX@DZUSՆ\զ8Pp' CA)DW#aw$!Ū'YUƎi~( yAߤ5!'DF搛;4YK4!iSU@EUC&d@́nyL.Q|k@J8Ed )ZCXQ.q\a2yѸ}yPeDi&[]@\ wz'Ԃ$1 )*|2b@)bOE$d@cr~8!!HRYssD Dׁ<,ފ`u)UBC8?(lI?8戇d'aZ"cCA3AFJ8;2d@09yrS@(mE*pX4GpHъnHeKc:JGH #t:=Ogwi5|Xrb`Fv]/٧=mjWn}Fw= ]@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWHPÇ#JHŋ3jȱǏ Cd("ɓ"S\RI-cʜI$J/"Y'G> ,ѣ-NP)ҧ;u>e UFobtPի\zJ1ў%rlWM ;2,ݮFTClpʗ=l wб.Xi䂗S]Zqfʛ5#hèWNiɒ?W,3oW׾E~KZw!Tܰ5Ҡlr7Ԋ޻فv^yؚO&sQ;N-{E'y(%w v]'sV\}bpIHsaG(Z}V" gއaS]80†_)W{,򈛐4NHw()I"ei3X@6ɤC$~Ue[&#ޗx頞1yl u9sD5cgg+rᄢhZ헣vJ]6G餓J'tj>[Zp:딥B ܒzDjdp دr8$W.!BFmmĺ?tB[UHEn Kmᆱ,z'pMZGJlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx筷߀.n'7Wng#砇.w~騧ꫛn.쑻N箻߾8,3* .3Lw#'8`P)dRTs,ѧBc_~_'FÀuЃi<H^ϰ2hpSqzjby;ɸ%PGpah$ +(衾O EP:X ^F RZ"hR4РJ!,. ?:Adpf7ڏP<{ t&<{؃ٷ~kW }?ьnޏx\ʎ#~ӂ3Mpo\1< 6Cl$49聎#$@`J L0@Je{@׎+[DFZԂVD=VXUqxf ܣ8? ׉F dlc~ C[Qb!uhN+-gPpb׏Dd(AX D * I$ ـ#?S8+R,~JS@xAq6iM YOkAAJΘ.=Kޒ ʠG2>LB} 08q?! oirf~%\Z7o.tXo18#d)a~h?7CGih:)q 4M[."uG_ 2L$8Dfhsz< ~ȶN`?4.:wg#xO[( J- p^q3 ۦV:v7a"OHu$QE ߻^O\Xms߀kы#=QPîy;lo+e$eyo|(ذ߰:· Cyq̾ /6}?~^uc=o3_{ 7{p~v0tDD@0D3!tWʗe8a`?`xxctO7W77d c 0i~egwCDbFuaG8Z7p)XiB~bn}3HX.h8 vCq t Kݠ\ S}Q )qUr}7}!x'8!`?fOxG8_' 8oD>~S^A}S^@}Udxt7]gb Lx wrȊ{ x=0hHKmѳ & F8J \P`=/Uv9C ~s 05Nc0 a^h^dp\PĔMZ7$i?&Ia)yzNHR}@aPQP4AZ+9j'/ R)S PsSP mR(gcKa(=S2roGf>aa7t.6L ei vI`Y},ӘoWif5yi'MnM` +v #w/ȓ p8@P`q8!`~Ds)_ 58)Z_<,98 lf8 ;C9A虞eٞ98 9yi::Zz ڠH!zJ4 ¡?!&z(Z$/)ڢ.#4Z!.6< 8*+ңB:*2A @DڤN0+KʤJX#+.ʒ`$(QR^'}1Vj0aڦ0:"#2"nڧ.Z2ղ$BlJ{Z#nQ0⧌B"-dI:$r"j22(z""(kz"s*,Gz%/BR/dj'Ӫr-prj./Zt".(jҺ,z*I1:ʠjpQ &:j'욠'\29zڭ횯ɂ&:z1!ѲK&[2R͒۱+ ,!#Kj)ʲ "/K8:<۳>@B;D[F{HJL۴NPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{xuU'|dOP;P-4kdC @ GC`52{*-빨{4ۺ;6k5 Ǜ,QK;.  7A Wqa!-"!^P@{p{P`@Sp iEsP G@  "(sQ m85L0z>|q1xPkPx +dBtPxp[!l'L \0V+0,T1€Pd8<g@74l=A,D NĀ0[@ܹ$  < ɀ ɀwPtP[%uɅ!!;E PqRP\3 ,ʢlA<ʲ<ţ@k}8x dNٌ˷\ ˚, nϝ,lA˶\L P(,Ņ1l~q+Pɡ |,C 0{Ax%P\Y \$&Q7-`P%]| ѻ{>* @ҀcJąpί <5l@\dO!DmO +ױE IaQԀp͇ML ,Ge@`ϕKL ,g}+PNڱ=MÀ<5KՀ A 5@62@ݦӭ~00·!ݲM!Ӑ] >ύ… A)Q,N}A pʀ| a[`%^'ޞ{`2ޫ̌ؠKݬ߽SMMpHE8:>>& ^0@mi=n`]"Np,(+>.p=!=篜荞EcpQ] A~[h e>=z·˛>>~<|-n]{N>އ.*l*m^:m \pNE@ 8LL>>]~廞^Ü.z~.mls.|A-q6 6pi߻4?i :_=o` x#z-٭~m NAsPAL<_P,or }\O?x+ 6/8P]u0[}u>@K#pщʩ_?MzpzT u]N>K>Q\!ʼ~[p~r~ɫ/ےOok0{2O/O?X5dA ܳ`=`@gf = r$F< &(KƂRLdHA A^&#͆iV`ƎCB| @eh^ @k "@iQ @1#)3ρ @ .m>̈́ӟf$,OlכXa3A/K NN"D {+";7LGA-V1]_ ~ca}C^oEw: b8B#1z4͈]2d@f]#- &`De!IГBd ,My 1J.g9B2!QADr񗭌$1_9fFCT$pi;j'Gn֐ :׿BNp̣jt)Xʒy{r[02b1T?ЁL*35NsT P]0$)jx:-KΐDAvgNQ@ZS{0HՕ˴a'cfU9U*L@VճOdZQɝ0bJ;ՉS4Kzm)N)}Q)9 <(ɷXzmNγ Y,VmiUˡ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWH챇‡#JHŋ3jȱǏ C<()fTb˗0c*LrVK8s =y,G(0cҥM-JhԫX FE?ʫpZB4V-Xdʝ[ cl [jÈȁ *(z> pٳ  MY OGl`+.<"툖N{;vt`ަD#7s7' 2V+A$\Y3[N]-ӷ`x@ T6tu; 4 QpBJ<d!rt}] ;AO<T}SJB$ <<Ԃ;Ds!=U@EXLET-]:KZSDI0#4?OmDEu퐧 TRг A~*HTԣ@dc&=h(H" =$uJ1ؗAfMyP)3 Q7 ˌy$DbЧ{T1\!"D-Bh},= O(DQ C:G Q TQpl j.KT- >z4 p71@ @#ZB7@H6JT,!I A24ɻ$=wPHcL]6!4%@On! ZPX.X |GE -A<v~8|H.F!Ӡ|lGld BRѣV)"=Z(PiE{#<`B T(14F5oObG 0ȧ n)Q P}#ATȅ(g h )JYA!GPDDaxE!Q2Z`F @ $zRie?Q&= HX{8̃86VD(.Ha=dKd\}o k=p{>EIT M1S D@At b|'2sx E^A $A(<́T8-NɡE%Eype@p@t@iF7ӎnXt8.xO\WUPVZAUPpW8G#'tt5=JQ;)ZԱv ]A,rC━ I^9:4c) 3 VX*gT^[1aFZ٢|v yOx!1G% &w6[HEͮGzjn4" KP %>iB4r2A6 }yr\CJP\$#!@,AڍKX WIYO&&Ѱ<8 NW  )иWϱYID1wP3T Se>N (B e)3Xβ.{`L2hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָε3"^MbNf;AMj[ζ-mlMnN׽nsmw ηm{8;Ox k+w ~^äsH"{7n\$OM%WgNjW-/:r1I'R /yρ.w}L߹[vEuZ:֣i)v]"^;nu]eBlKD?׿x~橫;go<1tG>!ϼ闇-TPǼWu{|}~yZg;wpG^Ͻkۗ^/p'=??g|ȗAOC‡?{w'ɏqt_kW|٧xQvW|Wxrwǀms8oH(8p,ւ0l&4l3X8v<8@B8DXFxHJL؄NP&QXVxXZ@8<`b8d8^ejlXgmr8Y9Axzhv{8v0 Q FІȈPh2 / V hH(ehbf0Q R#\@]`H؋8ذ_ cB.+@ ^! VXpx8ɨ_+a9bybmaNDq !a?djh!YIH9A)p6pHi Yb&KqZK 2!FPhYLq"怔2 IH ^M@6IY]C8eyDP x  CCЗB|~ N8f DXv'z'^J8EIUr%%T%%arIY`jcmBoBNX@> $YmI)C؜HxO Aҙ ˨p )p橉لc&c! 1-".O_Ԛ"++2,BTТ1-P-NQ|ɝB؜љ`y)ʜ. 2*V !  )О@8 Ah!i꣜0P:f-TH32@CV>bVM)/tQ31s DA36cQxݩ @ʨ*Bh Fڈu@h ` @h(ʞAْ@hzbKDq 9cF2@e%173c8bP8AȢ> kY ֊ZBH0F IUZ@0AH0П)P皮If#6Ӛ3A*OC 6*Z`A% `*;f>+; A f5dC͚%(*8&kCXF+5 jϰ -3˱J^hlnbV~1FQFA*MM rU{ʵzAxۭDH9'럚W.1 R:oA *:+d&A$t@z1%ѸcJJ+˴넞@l ckvB菆 6f 2 aAh`A8*kCs P EC ²CQR+W# ; A IY+AXВ@p ;;"$)`·ʄeVV9H[CΠ!UTeU݀UeWaeXWHXSrNMx Pƚhe Kdlpi@+u AОѩ(}PP噎Q:ǚ9JȀfP \C\E HK9BUu]Zҥ8t[[˄`e u vìn~| {3 u i )` Vz O8gvW@d9`)ia,k AQ؇2ARh0]ЗM=ђxѻ==z&}(*,.02=4]6}8:<>@B=D]F}HJLNPR=T]V}XZ\^`b=d]f}ִV9֗j{֕frzwgv&~{ y)x~]ׇ-ؽA؃6~:'w'rxv{(]t>(}Í:x:h{ ܼܱm|u;~'ܺ]~ޭ-'˭ݴ{}ݬݤ7=ۋGq uM=o>~}~}zp}M٤=Uw>y }~WčG|]d >v7:5!NrB>x'75ڒێ xQL捁}F8~։.}enN]p}嗮z^3N>L={GN*|-x N؁㕞|$;-M"^s.+>M볮n>u~޲NGm~>o:!~>w>֍ }O#o.;nOjnw⺞)?^'qM.hpbMZaU`b?d_fhjlf P^p?q/jJ@b#aE@ZEIvy/jD~oS{"8g_&-`_~OaO&1 _A +1/_AS a_HǯO/?xx z`WxA@( LGC ņsR$ ^f=@=ٓ3M0bH=Iȑx@UzG-$s 1-bI<)mЃw8PV=w[n93 q'PC*@OT4d ?ABh#F@ & 35IH8ېNR4鄧e $HHS)h}u q uݛ=\]V|`PkN.Hǡ(L B9ksH qC$XPSH 8 T$EQjC5QŎ'R 6&sĀ@'5^GaD!=E2g, BBʆ<.sbg۲ 8# 7dk HȎ=J[ȄUk+− ӘB@A$Et@x^!@ЦBHʇ|X2 $6y\eȚ@s&jb6 Iְ7\jO$INEHm4$  BHg vDA7ޡ \B[ #w~M6lF6%d eQԥ._*,iX@DZUSՆ\զ8Pp' CA)DW#aw$!Ū'YUƎi~( yAߤ5!'DF搛;4YK4!iSU@EUC&d@́nyL.Q|k@J8Ed )ZCXQ.q\a2yѸ}yPeDi&[]@\ wz'Ԃ$1 )*|2b@)bOE$d@cr~8!!HRYssD Dׁ<,ފ`u)UBC8?(lI?8戇d'aZ"cCA3AFJ8;2d@09yrS@(mE*pX4GpHъnHeKc:JGH #t:=Ogwi5|Xrb`Fv]/٧=mjWn}Fw= ]@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,QyQ80C*\ȰÇ ŋ3jȱǏ CIɓw[r%(zZ͛8sɳN(s*G97ɴӧPJ BF4%zKٳ$.EBY1</[ٮL?WZU)wVX֭T\CLӨQiԵXBtJBD+9|$:ȓ'nr] SdlQZȋ3SN)W3w.* |r6+7,lDϜB'VBDT ]̵4^CгNvaY&A<(@uH0J(48ć:9̲+P2 mR]0|Sٯ_Q7=A6!8b!p!I70<+Z{3HrV`LN!˪ "7Nt1 GC搇(&.,(vPxECņ(NHhŋL(D7HG ">iQOD@:q!SXȇ O. #3L"";0(7Iђ <;.b,WJBZ%Gʏxr4,iZ#2JPbt&0IM3!#Hn.S&iVȻ&6M-摙D`&xTsg/=q,?w9P{RŢ$9ƁrEZiPz& (y -R)%5IR-MKSδ'5EMwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWyZl]yϏֵMDsHϷ-p=Hb1Wq}sy$ S-gtC$A%C'=^fw.zȓ>%#3 PC҉m/; Nס-=Qַ!`3XgxOx/m_wj0Pؿ%qU '~ 7 BSqCGc 8rtq$sP%kj\6 N2Ɍ1{\9Kg2,^*Nښ9|.Icnrxw|lFo#2+29]o\Jw4Ks`/IP5sʢ3y'-JWtO4yi= rLL{~n6ם>g;y}ߊW}8'W;~,;ͶD[g侷_ԕ9 kt8>]UN§|zҙ`7]:gTfz~eS[1pЫcn:68cnxۂύ_IM|]<0W̓}a!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/altscreen-toggle/main.go000066400000000000000000000027571465647402200221020ustar00rootroot00000000000000package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( keywordStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("204")).Background(lipgloss.Color("235")) helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")) ) type model struct { altscreen bool quitting bool suspending bool } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.ResumeMsg: m.suspending = false return m, nil case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c", "esc": m.quitting = true return m, tea.Quit case "ctrl+z": m.suspending = true return m, tea.Suspend case " ": var cmd tea.Cmd if m.altscreen { cmd = tea.ExitAltScreen } else { cmd = tea.EnterAltScreen } m.altscreen = !m.altscreen return m, cmd } } return m, nil } func (m model) View() string { if m.suspending { return "" } if m.quitting { return "Bye!\n" } const ( altscreenMode = " altscreen mode " inlineMode = " inline mode " ) var mode string if m.altscreen { mode = altscreenMode } else { mode = inlineMode } return fmt.Sprintf("\n\n You're in %s\n\n\n", keywordStyle.Render(mode)) + helpStyle.Render(" space: switch modes • ctrl-z: suspend • q: exit\n") } func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/autocomplete/000077500000000000000000000000001465647402200200565ustar00rootroot00000000000000bubbletea-0.27.0/examples/autocomplete/main.go000066400000000000000000000054221465647402200213340ustar00rootroot00000000000000package main import ( "encoding/json" "fmt" "io" "log" "net/http" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { log.Fatal(err) } } type gotReposSuccessMsg []repo type gotReposErrMsg error type repo struct { Name string `json:"name"` } const reposURL = "https://api.github.com/orgs/charmbracelet/repos" func getRepos() tea.Msg { req, err := http.NewRequest(http.MethodGet, reposURL, nil) if err != nil { return gotReposErrMsg(err) } req.Header.Add("Accept", "application/vnd.github+json") req.Header.Add("X-GitHub-Api-Version", "2022-11-28") resp, err := http.DefaultClient.Do(req) if err != nil { return gotReposErrMsg(err) } defer resp.Body.Close() // nolint: errcheck data, err := io.ReadAll(resp.Body) if err != nil { return gotReposErrMsg(err) } var repos []repo err = json.Unmarshal(data, &repos) if err != nil { return gotReposErrMsg(err) } return gotReposSuccessMsg(repos) } type model struct { textInput textinput.Model help help.Model keymap keymap } type keymap struct{} func (k keymap) ShortHelp() []key.Binding { return []key.Binding{ key.NewBinding(key.WithKeys("tab"), key.WithHelp("tab", "complete")), key.NewBinding(key.WithKeys("ctrl+n"), key.WithHelp("ctrl+n", "next")), key.NewBinding(key.WithKeys("ctrl+p"), key.WithHelp("ctrl+p", "prev")), key.NewBinding(key.WithKeys("esc"), key.WithHelp("esc", "quit")), } } func (k keymap) FullHelp() [][]key.Binding { return [][]key.Binding{k.ShortHelp()} } func initialModel() model { ti := textinput.New() ti.Placeholder = "repository" ti.Prompt = "charmbracelet/" ti.PromptStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("63")) ti.Cursor.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63")) ti.Focus() ti.CharLimit = 50 ti.Width = 20 ti.ShowSuggestions = true h := help.New() km := keymap{} return model{textInput: ti, help: h, keymap: km} } func (m model) Init() tea.Cmd { return tea.Batch(getRepos, textinput.Blink) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter, tea.KeyCtrlC, tea.KeyEsc: return m, tea.Quit } case gotReposSuccessMsg: var suggestions []string for _, r := range msg { suggestions = append(suggestions, r.Name) } m.textInput.SetSuggestions(suggestions) } var cmd tea.Cmd m.textInput, cmd = m.textInput.Update(msg) return m, cmd } func (m model) View() string { return fmt.Sprintf( "Pick a Charm™ repo:\n\n %s\n\n%s\n\n", m.textInput.View(), m.help.View(m.keymap), ) } bubbletea-0.27.0/examples/cellbuffer/000077500000000000000000000000001465647402200174665ustar00rootroot00000000000000bubbletea-0.27.0/examples/cellbuffer/main.go000066400000000000000000000072341465647402200207470ustar00rootroot00000000000000package main // A simple example demonstrating how to draw and animate on a cellular grid. // Note that the cellbuffer implementation in this example does not support // double-width runes. import ( "fmt" "os" "strings" "time" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/harmonica" ) const ( fps = 60 frequency = 7.5 damping = 0.15 asterisk = "*" ) func drawEllipse(cb *cellbuffer, xc, yc, rx, ry float64) { var ( dx, dy, d1, d2 float64 x float64 y = ry ) d1 = ry*ry - rx*rx*ry + 0.25*rx*rx dx = 2 * ry * ry * x dy = 2 * rx * rx * y for dx < dy { cb.set(int(x+xc), int(y+yc)) cb.set(int(-x+xc), int(y+yc)) cb.set(int(x+xc), int(-y+yc)) cb.set(int(-x+xc), int(-y+yc)) if d1 < 0 { x++ dx = dx + (2 * ry * ry) d1 = d1 + dx + (ry * ry) } else { x++ y-- dx = dx + (2 * ry * ry) dy = dy - (2 * rx * rx) d1 = d1 + dx - dy + (ry * ry) } } d2 = ((ry * ry) * ((x + 0.5) * (x + 0.5))) + ((rx * rx) * ((y - 1) * (y - 1))) - (rx * rx * ry * ry) for y >= 0 { cb.set(int(x+xc), int(y+yc)) cb.set(int(-x+xc), int(y+yc)) cb.set(int(x+xc), int(-y+yc)) cb.set(int(-x+xc), int(-y+yc)) if d2 > 0 { y-- dy = dy - (2 * rx * rx) d2 = d2 + (rx * rx) - dy } else { y-- x++ dx = dx + (2 * ry * ry) dy = dy - (2 * rx * rx) d2 = d2 + dx - dy + (rx * rx) } } } type cellbuffer struct { cells []string stride int } func (c *cellbuffer) init(w, h int) { if w == 0 { return } c.stride = w c.cells = make([]string, w*h) c.wipe() } func (c cellbuffer) set(x, y int) { i := y*c.stride + x if i > len(c.cells)-1 || x < 0 || y < 0 || x >= c.width() || y >= c.height() { return } c.cells[i] = asterisk } func (c *cellbuffer) wipe() { for i := range c.cells { c.cells[i] = " " } } func (c cellbuffer) width() int { return c.stride } func (c cellbuffer) height() int { h := len(c.cells) / c.stride if len(c.cells)%c.stride != 0 { h++ } return h } func (c cellbuffer) ready() bool { return len(c.cells) > 0 } func (c cellbuffer) String() string { var b strings.Builder for i := 0; i < len(c.cells); i++ { if i > 0 && i%c.stride == 0 && i < len(c.cells)-1 { b.WriteRune('\n') } b.WriteString(c.cells[i]) } return b.String() } type frameMsg struct{} func animate() tea.Cmd { return tea.Tick(time.Second/fps, func(_ time.Time) tea.Msg { return frameMsg{} }) } type model struct { cells cellbuffer spring harmonica.Spring targetX, targetY float64 x, y float64 xVelocity, yVelocity float64 } func (m model) Init() tea.Cmd { return animate() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: return m, tea.Quit case tea.WindowSizeMsg: if !m.cells.ready() { m.targetX, m.targetY = float64(msg.Width)/2, float64(msg.Height)/2 } m.cells.init(msg.Width, msg.Height) return m, nil case tea.MouseMsg: if !m.cells.ready() { return m, nil } m.targetX, m.targetY = float64(msg.X), float64(msg.Y) return m, nil case frameMsg: if !m.cells.ready() { return m, nil } m.cells.wipe() m.x, m.xVelocity = m.spring.Update(m.x, m.xVelocity, m.targetX) m.y, m.yVelocity = m.spring.Update(m.y, m.yVelocity, m.targetY) drawEllipse(&m.cells, m.x, m.y, 16, 8) return m, animate() default: return m, nil } } func (m model) View() string { return m.cells.String() } func main() { m := model{ spring: harmonica.NewSpring(harmonica.FPS(fps), frequency, damping), } p := tea.NewProgram(m, tea.WithAltScreen(), tea.WithMouseCellMotion()) if _, err := p.Run(); err != nil { fmt.Println("Uh oh:", err) os.Exit(1) } } bubbletea-0.27.0/examples/chat/000077500000000000000000000000001465647402200162745ustar00rootroot00000000000000bubbletea-0.27.0/examples/chat/README.md000066400000000000000000000000551465647402200175530ustar00rootroot00000000000000# Chat bubbletea-0.27.0/examples/chat/chat.gif000066400000000000000000000720341465647402200177100ustar00rootroot00000000000000GIF89aX !/ ! 6!!!"""#####$#@$$$%$%%%&&&'&'''('((()))*)***+)U+++,+Y,,,-,---...///0/0/0001011122231m33342o44453545556667778889797999:::;9;;;<:<<<=;=;===>>>?=???@@@AAABABBBCCCDDDECEEEFCFFFGGGHFHHHIIIJJJKIKHKKKLHLILLLMKMMMNNNOOOPPPQOQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXY VYYYZVZZZ\\\] Z^^^___`!^```aaacccdddeeeggghhhi"fjjjkkklllmmmnnnooop#lqqqssstttu$rvvvxxxz%vzzz{%x{{{|||}%y}}}&}&~'''(())***+++,,--.//013! NETSCAPE2.0!,X !/ ! 6!!!"""#####$#@$$$%$%%%&&&'&'''('((()))*)***+)U+++,+Y,,,-,---...///0/0/0001011122231m33342o44453545556667778889797999:::;9;;;<:<<<=;=;===>>>?=???@@@AAABABBBCCCDDDECEEEFCFFFGGGHFHHHIIIJJJKIKHKKKLHLILLLMKMMMNNNOOOPPPQOQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXY VYYYZVZZZ\\\] Z^^^___`!^```aaacccdddeeeggghhhi"fjjjkkklllmmmnnnooop#lqqqssstttu$rvvvxxxz%vzzz{%x{{{|||}%y}}}&}&~'''(())***+++,,--.//013H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~7G4oj7wQHkpu|)TKwwaHGsH$QC<&\E. 7||@7q_4Ҵml43HAJ3k<0FQ# IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;q !,W!,zP H࿃&,p‡6Q"C-ĨPA= =IFgѝS*IJ_ %:'ʆ+S&CQ}4Zp?NKs_bWlO*╩V]:Gk A\5-<2Oĕ,OᯍݳX`:(Kf+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,3ϟ~8"||JR2 M=EpnXA ŘL|ޔӉO1CqvfOOk@iǧ鏞QB 80H9>`* 5[(j2ǘ)Q&}4ܓ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ>z?AkyL$mδR6֌ɏ³{pn%jbӨ8T՜1"X mAp?th9-_{W@ϰt⥨w j=}$-9E6Ωg皟9=ZG!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,HřT<>I TR9_>'fPWoP6QgW B`g njiϳ-gܴcor',(MO\zg+1))@\O}; rmH陙`/h iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+F&I3k^)0M<ϟCO)_QNZ T?x?9⼚V;oZd?5lUpu 0]+s晧`dRRYiOF3L )$%d?M&'~PՄ9 &kIQtʏ)TC/OF*BVb鏖\B(r@LByO=Ɩcu i£i$:ڒC? TdNE&JB ymn"4Z70R֏ {l9 d arJB)QO="e [mmKn݊b ?@? KZtd4tBʀ<2 =Ldӥ143%O.O O0CRSm5dD L&KBf6%M?0zwBϨ3Ps,Cvw9|Y w\-]SnznaP#ɌA?S̰1tc4 =)$P~? Z# B'm՛}) U6 =9PwbT@&d#By;- j^?'$BMSy6qLEQ?<CtXv9W!t/!D4b,@ Mf Y?bq?!b$#Ct L(,&#BA%2jSA(?3(f E|p!Ls(d^Ą!R'ؐR<颢pyczEBQrB6юuM/F"Z얩5JUҕNLH qFxE*? p8<@3!H Pt)L͂.4aYO"GKQ].!v@@ĥ5e\cث0bn222=Mj{2HMdss@zh3 6/­o`.pO^.`Z- Ɛp` [CF#xD >児*g7q|<J.d-W!2t$];*KԧNuDXϺYr{`HNc?pNxϻOO'^PbCn!wXG"F.l.H05;%U,DhC4=\ݛK~Kj1~D6K PG:ԑ ~CgC8܇# Dސ Ā?ҿ'""1 A~\ 1{Q7"G '8!( U.l a"]@2(>7")r%[%_2bB( `L@aHx1) A Ƃp ?&cNP3P1C@ 7,肓 )*,#@CXGJ($xa8e0a)u)YHu)*R)l&"'1bR2BxHfj($m Qq1 ^40F.!59b,1!E7F*f2_B 18 Aa 3p'1O R'Fߨ>8&112R84.\7011‹.s#c-F/aIwՐIF08}(}rn0yC ?e4BC4909U:^`#6dsku]a9Ni9|Y O#@VXiÖ P003PH7@ BIts?:Gy6ZI8Pq\ f9h9ȐxIrYy[9AU#7Mt:`I I8~Nɘ(q݂T8 FtsAcDX@==>ԝ @ $!F F`Up1X[ʡe^Fp ʩ" .J`}6G 2WS@Hs(]Cʠ`  -_hLsKWLv:k4 RLI' 2@*KQ ! 3yZ\ͪ* 6AQx# 0q 1S:$ :jKYz  LW} {=HwQ U(R$LiZfzP<@-s #UR*A ճS+L)[Q7 sR{Q[J˴N;Pk';ZFѱ7yX?Z[O=e˯gƚB>`jRjmuTVpupUaK;KVY'e9Ӡ@e5bʫnXRЯh۹]  +&*QW{][ǫ \  1춡[q\\5iZ%|h' < ` ؟Qϲ !\ȕʽz5뿶YL, A q?³&5[:l<|e%Z'B@%!'ܾ0,9I,`Lppm$0_^ f)va+Ja C%bA,vRT0 &+k`!}l`|80 o0P8`ȏ ȼګH/` qPLqcDyjŷ CHӺ$ʊv,7\f!i@iVuL`fvh º}ϗ\S&ʸk-}ϓVimoA.!511Ϟjvme 64 T[Lrϴ+-&-=iBmgcVfKx7M,\2ҍQH 6:QpIe6Fh(FopcJԖAn~_ J=uoF&@ XSz l ! Kp5`֔֗L &؉;<Kْp6> טG}n 7 g-mmbu=i 5 @ÓG3P5(ws< c (I]ߑss H4s  (HM}Ct 0 Qt1-. .AWQ @ewBQ N|MGM}kej8nqԥ-.!v>`d OQ)Iwxp `\~hjlnpr>t^v~xz|~>^~芾>^~阞难>^~ꨞꪾ>^~븞뺾>^~Ȟʾ>^~؞ھ>^~>^~?_ ?_ "?$_&(*,.02?4_68:<>@B?D_FHJLNPR?T_ XIVoX~Z/Dkaiijj!AvxOzoaYtF.Ap܅/aP R$tzR@..11 жo/1AAo! Y FЩqA}qQo &)5q` }rJt@iPf@$ :a0@ihc%DPp҆ =NLśBtHdC*$͌;V1e odGM>UTU^ŚUVM}OE4ʹ-7QfD9 W*$ ڠ0/9H-\-( ˀ5S$Lp1Ddd:o V[lڵmƝoaBXgNC &wūL^SUBg NLtX#!r8OM*nϏ. o3c bJ4kN7 7C?|kgh8KCa"'0  ‹:HcH:(JJ,ҒK"8 !R-J:\LFC3O=sBkYИhl;&21f<H,( Gh 4! Bȅ'JEjфk,UV84!Ȼ8SQG$XcEv?*Ο{"Ǯ]cFfu4ʅ-rSCTR0Jkk" +|\tsR䛨 ݥl8b'mYEKv9+B\ƅ-*蒢 (*v S 'RŢ()zg..(RW{b:k,ʟid8}FjS]գE!t[~*f@ڜm08>"Qo:/GUph)̝\k?)'(.8F$HOp8` rҀ 1۩G;ބ\,> !ҶFy逾w:~'`'t_@^.+ /:#Cg}Gʟvy"F2v%^F7 $B.L^8, != Xtx`y"HT Tf=)gD)h]LVpL9+n فaS)ʀj`Z@t()K$H3]r"AK}Le2bH3q1'BșNNӝ$Sӎe4H E *3r og?B T saC?BP~:,Pӣ ]ԮֵZka;[KmnAt[ַo;\En\6qntN׺íun׻wū׼-yի׽m{׾}׿s]-/=m%lO5\ oE@]U\jeuL  .GL$/((OPrd-w9D1f-W6󙧜f5?m^|d9yu!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l0 H*\ȰÆ$ :e(Njd Lх4i2E yy3EرQAJhEEO|C([>р(HL" bp0 6(W. P: hƋJUB#FHǐ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,m0 Hp&,ȰÇ#JHŋ3jĨ# CII=\ɲ˗'SvI͛.e*ɳϟu.JQB?]ʴiŤJjTPzׯ 9wFȺ*طouWV@3Bm_r閽//[\*n/†2t0q⍔pzP@;L*H➡yo2bi hzҙg,9}J:FJtW_Nh]rNNBTj*9l)UM]y旆z'dŊłymcX;iT.*+W 0~l¥p/!,W!,W!,W!,z0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,Ȃř>4>_pg %)O-L|"<[U9{ @$ɶm>G.8gp) ŘhD0!9y+ ӊ@|KQܽ }kR9a#NM쿷% !,W!,0 H&,p‡6Q"C-ĨPA= R$ɃQZ2Ɠ9K$͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fGwf=]ߙ~ըVק&z,lq!,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$ɃQZ2Ɠ9K$͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fGwf=]ߙ~ըVק&z,lq!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř@[ү'>APIR <3SBwW9 P^<( s}\K-rym2RقvҭhgQ@=1*qGz{ '~.mJp#7Y1fJ۳eצe@!,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=IRfO?y90q.:A$ ԢQer#A_MYQ+f Υ]!,W!,0 hH&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ xr`b͌ÖԓS桑8LD%~]pҟ52#l#sӖc$@a\0MtܺaЅw-6r ;M$@R;X<' eoW@ g>I7U 'Q8MWgW[7ɀ!,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ>z?AkyL$mδR6֌ɏ³{pn%jbӨ8T՜1"X mApth9- @{W@ϰt⥨w j=}$- 9E6Ωg皟9=ZG!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,HřT<>I TR9 @>'fPPoP6QgW B`g njiϳ-gܴcor',(MO\zg+1))@\O}; rmH陙`/h iSR6l۵5}2 !,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"G$H+F&I3k^)0M<CO)_QNZ T&x?9⼚V;oZd?5lUpu 0]+<D^UkC 84񤿔,c֜I-!,W!,0 hH&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"GK5HR8sVAe͛M '8 mWNSʔ yYu`v\ZN bpT`CQΜBh߸8JV`-튁`k޴ud^T V/i 3ߔa]vRuq6y2 !,W!,"0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř@[ү'>APIR <3SBwW9 P^<( s}\K-rym2RقvҭhgQ@=1*qGz{ '~.mJp#7Y1fJ۳eצe@!,W!,W!,W!,00 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř@[ү'>APIR <3SBwW9 P^<( s}\K-rym2RقvҭhgQ@=1*qGz{ '~.mJp#7Y1fJ۳eצe@!,W!,W!,W!,>0 H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a@!w?@JIQZTJB3>K*RIЏZy@% ܔv-ǤƝ[7f@W_x/ᾌ.l#^Ɋ+S,w3(bʘgTja!,W!,W!,W!,W!,W!,W!,W!,W!,W!,PxH(\(Ç#JDūb)ZQǏ l^@4(r˗0cʜI͛8s.مA=\5ȰeN*xݻ*:ATY=R!B͛ڏAI^*yG:gʗhܾ QA4{ vXg^E\Sgs?9{hH#R=40Z j*L )={?bcqRL?/>PV*K]fyD˦R'~()d=,qgȗAb,nM'Yf0yPwIB1&쩕P @D'Q2UG  P* BdWVi` p b/FP8eSe07( p8'19vadiPIub AKx24,Y;"?|dXSbTOs%%uyP'0c c b@ f"U۲{8Ev.yl^Mdȣ &jQ Ac [ʩ*C LeGB^ O5sT)v%C!'sQ;l@B 00b/@gW6+)Bf dìo|k$:-*|  AĽSOWC7 qL@C m2U(E>@@CA3^;15xƬдBkO -p Ab.TsnʊAK%"_RUivWslWZBP5$&T TAYx:}\@ILE\;?pGѨP7AP60 awG5E]+f8{;=}6*@ITNH( <E%yp@88d5 xp.ƣ5fYcuDkX+֌'rȫ53AןCi=IĢ`.D;ZF%#@SRK(qoVY9 Jhe<ר8ςoI;L9tC+Z kj$ )DV$lV6oҟMCVɁc*4OZ L G9Zr6X`(H?m$2ۥ/ýĥ%$D9hLdE @cإ>GV] r9$n!l8ORF'!!  DL 'i~xڑ@bA`jA FT McP=FpX TlNK##4'VE T { {"RZ͕fgAzD!IYMnѩ@0 lV#tu^ru~ RAE3Le^lbZDUUy]f:g!4ia\d@ S`Lb {PZڬK^-D (lD>SDHb[ bt%rl 1`T;DV` ,X[$5툁B a?,[\|m_UN qpkQ`ˮ =1] (UK(z5bM#@J=  @ȐQdo/в|fV)i?,r DS;dV!G Kɉhr Y8,?فٞy m*0;iPĐB- h: Hz024ji>@.~`V@nT5K&@$v(ꨒIE+ RmPf 2kczC*/`ϢHmb\9J?M)xB2b҉^?~.2C Dp|4p^_cR{R$DYB>02x19gB%0]Ry8ϹwЇN˜hʌ;PԧN[XϺַ{`NhOpNxϻA Ą#~ļ x/^W{sy9N>yazޑש={O^}!b~nV;_~S1n]`{ևNa|wgNL558q /V o|,Ewߟ?7I7~y%~~w~}jȀ7qz(} }} H9fwR[V|1_h]Aٕ86+)ȃ (HW8h[r3 HWU}?x)XANa@zUu]UDY96Ic`MLPrCa(楆m(i4nrS(tsTl=zSB|eNX|ӉkC|;uh'M8ׇ`x'8/F/}'Y(f8O}~~ Ō^x|sXhҨR}xm H؄j4C(eHyH~rhWe8Ȋ، ɐiḑ,Džȉ %y}Y{x8  X 阒䘈|Ȕ܈zhr ٔxTIQ($yC8xØ3e?coٍsH0H7޷VP)5Ih֌-{y =阉Ȏ((#8hi.8yǙI☙OL*x mdI9蚶ٜ&HYɛ W9xؑm6؁K94/Ukyzvۈzwy!s';'v'c狘7uh u v8ڡ ":$Z&z(*,ڢ.02:4Z6z8:<ڣ>@B:DZFzHJLڤNPR:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:tZvzxz|ڧ~:Zzڨ:Zzک:Zzڪ:Zzګ:ZzȚʺڬ:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ;[{ ۰kFkNzx,y{֤ #&{L:.0۱0J:z0k,kY,P%u$m}6BM0 p # p)|y >@3m5^ ;p*݉E}Ԫ߷% tԂ."^4KNT:aF!#n5w=F cLѻ .CM@N!X-@+"1g>PNM4ȜK4l'<ppc }, n֔* ! dk-j&\d@QpͽmV ŝ8[qY\.nǖL$,> tҪQKFkY-~.,( %kSa Cepn j Eq{#›l7,TmpM .{ǛM>Ƴ+p #Q4Bam;9/Qq-"oǿƼ,,M߲ߏ!,W!,W!,W!,l0 H*\ȰÆ$ :e(Njd Lх4i2E yy3EرQAJhEEO|C([>р(HL" bp0 6(W. P: hƋJUB#FHǐ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l0  H*\ȰÆ%4'P$+NjR!I.xZ]h 0@jwFVrZb`kQKBq6 8BY &ZA}#JV$tm o%JʬЪ qR~#KLy`@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l0 H&Ç#JHŋ3jȱcƂ *Уɓ(S\rcȐ$II͛'_9ϟ@YBH*]JԠђKJȧjʵUXvKVWaX[k3Zo}@(Np^8{UpN#, ~څY"A$PC|QV+iLI t`_ ߫ FԝwqDžGq$l?au:9ZN{̩_ntw}^Ԯp3)Ϗ5aN%O>%|h]T!hסwEwBD?փVKZ(~3rh|Rxc=5c:(x՘_Lhy "T"H9WvxPW%jQJcqkƨ@Ag`&$i&⸣PVI♇ ۢe&ޘ& :N$v:"%}X'ė)f_Gki2kV^S *gsgڦbun%:(kDO?8wfiKދYRm~( DweJjRg(î:VÛAlӚwnY;t$r[!,W!,W!,W!,W!,W!,z0 H&,p‡6Q"C-ĨPA= R$Ƀ"G,]+ &ɂhY0~;93(Ƃ3J`#L+L _Ԍ w#@u]HOر%r(C-ʂ ctGSޛug$pnƋ!?Qɓ!,W!,W!,W!,0 H&,p‡6Q"C-ĨPA= R$Ƀ"G,]+ &ɂhY0~;93(Ƃ3J`#L+L _Ԍ w#@u]HOر%r(C-ʂ ctGSޛug$pnƋ!?Qɓ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,PUzv:ȰÇ#J]/R8Ǐ CIh@5^0ao̚oɳϟس!&{]ڐ͉NqFʴիUmٳu33D@̒vĶXʝ RP,UPDqCRz08o όSЗ;)(mt3k3Ke(=k2pІu-lcg{ޛ aF9e gia Eij}G ?yl+ȰP !ElЪ$g"`g1P8m a8݇UDn(Q(C3 igAxuq=HD6S E=4b3N-M~ Cۄ)Pz2dz 1A CP%EOQ 桚3ASCC | ȩA+& OND:?"\:Z0j0ԇm6ʦ`[$C' 2im@@C⪇PA:4gŤZ8H4n?FtnͶY22Q=%qAG򻯻,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'̯NGWoG_=o}_Г_~O뛏?OI?C841 ((Hc At GlxR`GA!ah4!`G+!/,E( MDC*l&B=; !$@Op!RH pF DQ`A,@:Tq@%aA32 4bCB'dIҐ!B!А dTyI!,!mN~2# ! |!c,T)؞ABL$:Ao# `]1G(S#;]ҁ5i8t0O e;u OtCIk `#MGB@D@B 0_ Mh<@Fzpt8A2@TiUAiOT30BM:H|I3vzZhGwNtJi>'!*hJ!! *p"O?M1F8H_XDtCB`q=k] R f R5\ x[ 2ڃ,@`)(g:-"fzA,IvҁA(P.XM-_vEAnʄtu{C>j^{s (gg@,xL^ l0H -*lBb .`8$;CLb]LeHz͔MdadP8RȲiRఇYb#ݦf3~q]X-o!*<FW$?z'fWާ`TGX0HpH0T:x ".RT AMA`ĊADa^>eesT|/`1y"(ksj:ή1pmh[ XP$$AMuRş-9\zG~NL8PjI#0䁓z /[,Դ-4#Mp723$ 6Z頂'Ko:s($ȸZ6|T9eK2Df7KxP eW+OzAޔd7]=SRo* aN3nw8 P]6f~lx3!I(==B޽wt9̾=`z8 `{f?uyF] m{ e5sH- *Co|$*evr .}` >pwgzUxG ̀P?}_d=P=#q`( Pw[q*TD#Xx@?-S]pp[3M,0E<1@2MBw0E2&0Q@3,:ȅр(HL" bp0 6(W. P: hƋJUB#FHǐ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l0  H*\ȰÆ%4'P$+NjR!I.xZ]h 0@jwFVrZb`kQKBq6 8BY &ZA}#JV$tm o%JʬЪ qR~#KLy`@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/chat/main.go000066400000000000000000000040621465647402200175510ustar00rootroot00000000000000package main // A simple program demonstrating the text area component from the Bubbles // component library. import ( "fmt" "log" "strings" "github.com/charmbracelet/bubbles/textarea" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { log.Fatal(err) } } type ( errMsg error ) type model struct { viewport viewport.Model messages []string textarea textarea.Model senderStyle lipgloss.Style err error } func initialModel() model { ta := textarea.New() ta.Placeholder = "Send a message..." ta.Focus() ta.Prompt = "┃ " ta.CharLimit = 280 ta.SetWidth(30) ta.SetHeight(3) // Remove cursor line styling ta.FocusedStyle.CursorLine = lipgloss.NewStyle() ta.ShowLineNumbers = false vp := viewport.New(30, 5) vp.SetContent(`Welcome to the chat room! Type a message and press Enter to send.`) ta.KeyMap.InsertNewline.SetEnabled(false) return model{ textarea: ta, messages: []string{}, viewport: vp, senderStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("5")), err: nil, } } func (m model) Init() tea.Cmd { return textarea.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var ( tiCmd tea.Cmd vpCmd tea.Cmd ) m.textarea, tiCmd = m.textarea.Update(msg) m.viewport, vpCmd = m.viewport.Update(msg) switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyCtrlC, tea.KeyEsc: fmt.Println(m.textarea.Value()) return m, tea.Quit case tea.KeyEnter: m.messages = append(m.messages, m.senderStyle.Render("You: ")+m.textarea.Value()) m.viewport.SetContent(strings.Join(m.messages, "\n")) m.textarea.Reset() m.viewport.GotoBottom() } // We handle errors just like any other message case errMsg: m.err = msg return m, nil } return m, tea.Batch(tiCmd, vpCmd) } func (m model) View() string { return fmt.Sprintf( "%s\n\n%s", m.viewport.View(), m.textarea.View(), ) + "\n\n" } bubbletea-0.27.0/examples/composable-views/000077500000000000000000000000001465647402200206345ustar00rootroot00000000000000bubbletea-0.27.0/examples/composable-views/README.md000066400000000000000000000001051465647402200221070ustar00rootroot00000000000000# Composable Views bubbletea-0.27.0/examples/composable-views/composable-views.gif000066400000000000000000001416431465647402200246130ustar00rootroot00000000000000GIF89aX !$( +!-/#0 %5! 6!!!!'9"""####*>$#@$$$$,C%%%&&&&/I'''((((2Q))))4U***+)U++++7Y,*W,+Y,,,,9^----:`...////i0001111An22231m3333Ct42o4445555G{6667778888K97999:8::::O;9;;;<:<<<>>????U?V@@@AAAAXAYBBBBZCCCC\DDDD^EEEE`FCFFFGDGGGGbHHHIIIIeJJJKHKKKKhLHLILLLLjMMMMlNNNOOOOnPPPQQQQrRRRSOSSSTPTTTTwUQUUUVVVWSWWWW{XTXXXYYYZVZZZ[[[[\\\]]]]^^^^____```aaabbbccceeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxzzz|||}}}~~~! NETSCAPE2.0!,X !$( +!-/#0 %5! 6!!!!'9"""####*>$#@$$$$,C%%%&&&&/I'''((((2Q))))4U***+)U++++7Y,*W,+Y,,,,9^----:`...////i0001111An22231m3333Ct42o4445555G{6667778888K97999:8::::O;9;;;<:<<<>>????U?V@@@AAAAXAYBBBBZCCCC\DDDD^EEEE`FCFFFGDGGGGbHHHIIIIeJJJKHKKKKhLHLILLLLjMMMMlNNNOOOOnPPPQQQQrRRRSOSSSTPTTTTwUQUUUVVVWSWWWW{XTXXXYYYZVZZZ[[[[\\\]]]]^^^^____```aaabbbccceeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y!~H4oj#$Hkpu!p!1TK ñHGsU,QN<&P. A| @7q_Ҵ@6cJAJ3k:`hӶjci [U=]݀7AYnqxp/8o?.mOnl_yko砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;Pr!,W!,zP H࿃&,p‡6Q"C-ĨPA= !JVFg[*IJl߉ %^ʆ"S&Y}4Z?XKsL_~mO2╩@^]:SkvA\C6E25ĕ, ᯥ᳈X ;(VLf+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aL?u㷣;!h̟<$=2AiH(GP%s8s:>EE6U oB۩9Ǥhnz#xrer9ǘ4#kmREҟMKt!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= rol$ 4$Y^3A KՄEd)t˖[4 P S fA\jEaz%lFn;sXyOFjI0k=-Xhce罢 %)6C}Po\U9{ H߼Xɶ>,Gnkp)8ѳŘ+EPǧDy+@Kq/k.RE#b#NM쿷% !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aL?`;70.e+'?68e;j$Z4+6iZIx`͟ <+_)uSq̟~T|@k/`#_ (w@|G;(G=1JG1L=Ƥ\rjG2 !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a$hȉ3)g>aܡ<|= %)?~2C%#i mPЍ3'_SJ5Ǐ-9`96í^ Rb) \ohzJ\q@y3c/a N3fZcm2gli&!,W!,PP@H*\ȰÇHH"ċ3jljCI2G%S\$J0ctYQ͛iZɳB } *DH{ͥN**IV4kF^ö*BfD6-۶e +wn׺v[u/ߨ~6 ,)C#x1ƎoB,s2eKi̙媝Co,UhQMFTugM]{ThDmkƝ[7|y"O~s9sΟÌ.}%)c'}9(q Op? !,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,Q-h*\ȰÇ#JHŋ#ȱǏ CIɓ(S\ɲ˗0c$͛8sdIsϟ@ JthϢH*](ӧPJ*)իXvׯ`r KlαfӪ][-۷pAKݝs%w߿? Lˆ=1PƎ#K ye/kތg?24L^Z5kϮ_ˆ=vS۸qx7߁}/,|ŏMyZΑG:֯ks~v{T*$kҭN뉿R+x ',|˖lAˢ={\tvkRΑ+nnVnomW-BƫkV;. 16lo1qk3pȢ}uLTbE-,;O?Bum|B~?L0-?`5h띤t?8-LA0Bԉ[ HN!= @'Q= 3 `Gmu#uO3p*s0 @o0GCOGat> {@{vL,5(=!0 p>L˃N]"`` ӫ?Dv;ԕ K{ ?:\F@MGJLv4 X> `G21mi:2`Hl  %:G@ic(A;?G{H `?i%!~XDP H"T8&2yt"/+_4*M#V  4I9Qܯx,|f (vʹ?,Nb\b"A `8ry@@ h`>cxXu?GjjDgFGB5ṽi"3u{!941 @Z?cjH&'p(z)$B08G/:eGID4J#=),ӵet4/IUzQҴ)Bӕ洧)J*҆`J)RcԒ.LJ}jp*տ4U}UZ)XӱզfV +\ֹŭ+]TU~N]~,biڧŊaٻBSlo0(r+gS>eSղ)kVSUlO[ݪUk{ =.l\0ϥTt0J.vr힪ލv{ޒV=ҫ^LW%{_(/+hOUʿ.,2X~{+8΢0u Cl?=4a3HŶb]W ɱw=ވL"HN&;PL*[Xβ.{`L2hJPhm^J`|= ].lbe͒4,= ϐq hQ$VA]Ml# 6(zJ67(V$pF]jѺ$BAM] ֢&?9^P)l4$GNCDt = y$_ Q&@ gK%#vM-v+5{$T]y?i&1L 7BG2J9*ȩ!o" #\p8. !Q@P?gD%:J#!qdh?BY!q@.*,WR&A =HtҗM<]$WҙtsD:GP'H@Q*߄.C$ q3W華D<H$e?{[F\\߼GFӧ;G^d]Cy3<B&gȀ= ԫ+rA,mLD^LGNݑ!lbwv5Dѕi kglx8|}'q̷ mG 8g}| !PvL g(Qvvv7G}i{Ȁ g08pWvy(H؁+qgg,тЄ 8 8?6|6jcx3jpgs4 4pim&sq`x=gB_kc6gJHaFfm&qj`Xgu2g8Gh tXln&' g6wɸ!hwg{xX'p\`{ :Gx:՘{׸ ug l8(ixt7ь*aQȂh ly,!'ff} }0۶ (8ؑ~Zx{ }*g)Q ~7`; *nf}J+ْ+Nɓ' #$8= 07 M9X{.¸%G,hIOQ9(wɑVY"a }Ng[ٌǤ/@88 (Q>9%`tи `qq,h ?p9)vg))py{Jti!D 28{8 V Չ~Y9g=x=);!8g@9=ע7zsY)qYȡ,:ish80hzǘ&1 爒798oB DzM dzw< kI!1hPhp9ꚍm )/igjJ*LgqЩ9٧*8!K1t&t;Z z7`bJj : h?01Ȫ1h/FgqyjbiКן&a%P‰! ƕ:#i'Zj4j;mpy 0J\:_*azJ{ #&W"4 ưy%u$g֌J!Z6-gw'h2 [hqR{}.8qyD Q ikxKn;qp9jjyK'XyZP+N%1 sG)ǹA%`xx v6WGq-u ~7MPgd9`lʶA 0*z[p}w٨i`m0:{p4 {˾!tHgj({*kȄ;Vv+оHgAi\ˍ7}K;gW'AgsUIyҩtk q  f;:>KJxd[hl Lpksg=y`ȎܑLLls\}`q Dx"iLL~tȏ ȶ\ZTs&,J:g + (1yog(*XJ*Y i|0*󪢾ܣv {gC~OK}I^ iOrOq.-68Qpn{wpr&̂$ m:+ :IE!AK#?AQiZճb*s!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,W!,W!,WCH*\ȰÇ#JH!3bǏ CIɓ(S\ɲ˗(hI͛8ss怞@ JѣH̉)ӧPJ:)իXu.ʵׯR޴ ٳhgMvضp%ڹxxw޺~ 6 XÈM̶0ǐ\e:9f;zϦS F {]FzƓo뎽;lqYNZ+*|ǟӬ-zֳ#5bO~'w˃=ӻ~}Xzr  h q.)`o NXIhmni!l^n*Z"r"8Z2bq1:v#=fb'.#j?w䒌) hM䔇I%gUR}[])^Z&^iIvFmnV~ l}f`hx z'IF^z٣%kvjzvjj *iY^G ,V8l`;UP> 9+u^;j;WmnD)fˮWZfӹK/t먽RoeGo3GpN Y˰M?qO^SqU%W}Lrk$ ˈ|ӜQᬱ΃L=/tOF#J?uwBK4MU5W'5R'u_6mSmWj+v| 7Oc \v^[[ww9da T v'w6/r]Bt-brޮ9踑좮k~~^޸s"^T2sU^%sO+7@44o#b #UAhXDF$= K 8}YyQBvC = xJP=! 6/I,=$#G?,vs)`?(?'H"qĸ'j`)Xը0qi?ʏ1ċL~d"xƒ~ cI!Ї8aA~Xa)G.BC[exprE8g gR 8#)3@Eh@@S^ :AzK #NdIhgyKŏ?E$xE)H芀 t,)?qw,%,.L|"w}xb> Cg O̅QgHQ $c &Eb]D`lx@ a28NXPe,O" =AM`3*3#jo65YEKJ\b#b@9*P1>RNK.G DnXUt?) D1:WkU\gڌWZo_{)oku\ }nsjzw04Pmw\YWU xn-{^n/{_UUUl+}aշmpr aJtqkw±#ayXS ])O,nvK&UU)uwOV6ֵ;"oKr["oȶaJʉr7.ˢ ]$Xeln,yu2CḾ3;h? z3}8Vw.sh)>TtHҗt'hQ7P^ަW8{k7tOkUe~۬k [MvޯgLɶݳmMKVݵmmKܷn̍JfܹĭIslH6V;HGVp\G ½=FwV]\Fq}E!Vr\E)7g8Ϲws#0 ЇNEv;PԧN[XϺַ{`NhOpNxϻ])HP&JE|ӄ D@^RTX!T<|co"4 @jmX/znj^#Ln@6{{3t[txZo' hš_ωP6G?I9PlOV PI hXECTVP c 7s y XKX  WX Vq=y:BpK5p{UK~'.@cP ǁ30 yQF~53p [1 S }І %0@Sx|rH`  y7W!tsp P+G dXt?ҤP8l ',yl؆׀1ffhah؇w} e 4RpXFb`EpLPCw[y`2yHcl9y`7S80H5X!RA9a p-Yב%405 PJђAE?J0WA`5؎@}1@xgPԘ3yWiIkٖame耑'yQ|GWCz`e4p[Ho0A1 BQ>?Ȋ3. oel)Q dzIɜyɹ1qpHX@t 9yXM /#"@~6 3ȘϧЀ})gG<}~3Fy;p8qDw~Ew{#"7j'20KQ`9?P_J{(?0.UTG:H9h(`P:H (a(}$%^:)9y:`Y%`헟,9Txh~"ZF}C:`m0OjuRj!N׫Ua.d9_ZzIzᐙB p:)I/J{`eإQ}`ty טԪ?ZFװ aTWQykp!* {j"DYs!YaP :HTYOHP 9յ[QQhϙ31j09sa7(? ZPƪ @0Q[׶ڹ8qGA8!'K5{;vf}#!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,W!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,W!,W!,H*\ȰÇ#JH0d CIɓ(`[߾fRɳϔ+w~ɴӧ=W^M%<Ne؁K`.`Ê{q~AhБKOȢci1KŶP0˘3;N; _3+j#JyV)5*bF'#v؝1e4∆O9#Z`Ӊ#>mckJq0H)XaHjƎ?S NBieoU^jYn%b]~)f]Y!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,W!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,W!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,WC`H*\ȰÇ#JHC;2jܨqǏ CIɓ(S\ɲ˗0WrI͛8ss&@ JѣH9 ӧPJ:)իXu.ʵׯR޴ ٳhgMvضp%ڹxxw޺~ 6 XÈM̶0ǐ\e:9掝C@yϦSEMZkƥ_'e-6Zֱm>{Pھ_-8oH#_n8T{C|ίk/*}{.} ]go.x)m NIhknyd"n"s8Z*wr)2b5fHbh\6d)L"d9T 6eY m fe^9&;Za\bhʩZvFgmnX~V`gz)uhs)!=J)\YYiZ:砦Bi`ڦBj]jVj{ٺ" ltڮh&ζlhFۓ&5 mfm[)qaK.Qzvn[TU.MkF;޷O/{o4Y.0_Ng䰪_LpGm$TaȌAW'~Xv?ouĂy7[#cxt̤|`dS~#ģAx ;62?d#5C(48}D#p`h8a ]Պ(VJTxB2 @b;w0<>`y@RD=5K44.q: AmDg  hB9 1C? a|Q-GMb?H/>ƨSy> ѓT OI,p(t2<ċ1q[^C-_RBc"#@?P"<27I SN,uY)i3/(F'YWZ4r\%TW N,DT]ExцjaGcҢsX#eUIrсev+uH'ʳ>4͙M6ӗn@9)R*^D5Q5SnCjNmUHթz΅j'BURG՛5WcTY}wծok[Wjfq@gUZ9W~^g{2}mc1UľU}c,&F l4 BlŬH(yU-X(z-hh[(.AJ2 3n'yrnk'ގr.&Ǝj{&񖎼c2?1.'m &f-%3%?0L%ESp%Xp($ ^Ӱ8$/wHL$OńSX$oƊ1h#ǐ1x#ȖrΈ\##ɢS͘,#'ʨ2ɨ"+˺2ȸ"//s\"3OSs,"7oޓ! "MBaJLF;ѐt[JJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbBꀁ83OfvȞpa(_kg{ܮvm V¶9{toB5!CmW7D t"̻S=|[ѥ!c5 xf ZCo vAsq ڇoFyIL"͍CT Hpw@͆ c&+Ay<lo  _#}6lb }6OgToy= ߃^W 0SzQ1\@u@4H'm*P(w7uf{1870 tuj/4y 'Fm 0zv4|0ǃwoLtdqz 3 @|douJ(yDaX|l=a7 Q}7:cP,mt7_ _ *pwȄN'goEXB>H(Wxqط4h}IjK@a|[P{qn }z0vMT}#p2CC7ArzS` o7zzB[ hE Lm =׈h}X}Ԍy(Xq0(HhuX!1x/)3w؃Ml1Y 8!8wp=nWp31Geؖqn'61FiڈM!w6巍EIkLwAr=/$yuVRGqy$m%tpl u9 ؈X| nqITٍzG9`m0:@A1VuVvh Aܸv8RDfr)lp񙄪 r蓤QAS} uj<7:sx ^Ǡ៪' )@`^8y3J *ɤ|mH;:uhؖ9ͶTyz|PzwAG<7 O|L:4ؤQ؆r^GyףUjwZ X7$sZjȥU0G& nѧڢwuj -g!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,W!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,W!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,H*\ȰÇ#JH0dŢǏ CI$Bw %@/4I͛8Il hg`fΣH*?m\nǯ˥Xjݪ~,_]'Y_4iw"z`$ %F*^̘DT3 T^}d4Yov +O]<̺R R6 |#纷DE6JQT+_Q);AY4̳ko߾;wպ6ӫ'hWQ1sTYkR|Ե ) ?rƌ@#;\FÂn<UO9;dhbgdXA,"I 'Ƹ;8L1y㏝䐌 I{j!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,W!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,WCH*\ȰÇ#JH!3bǏ CIɓ(S\ɲ˗(hI͛8ss怞@ JѣH̉)ӧPJ:)իXu.ʵׯR޴ ٳhgMvضp%ڹxxw޺~ 6 XÈM̶0ǐ\e:9f;zϦS F {]FzƓo뎽;lqYNZ+*|ǟӬ-zֳ#5bO~'w˃=ӻ~}Xzr  h q.)`o NXIhmni!l^n*Z"r"8Z2bq1:v#=fb'.#j?w䒌) hM䔇I%gUR}[])^Z&^iIvFmnV~ l}f`hx z'IF^z٣%kvjzvjj *iY^G ,V8l`;UP> 9+u^;j;WmnD)fˮWZfӹK/t먽RoeGo3GpN Y˰M?qO^SqU%W}Lrk$ ˈ|ӜQᬱ΃L=/tOF#J?uwBK4MU5W'5R'u_6mSmWj+v| 7Oc \v^[[ww9da T v'w6/r]Bt-brޮ9踑좮k~~^޸s"^T2sUu?|uģ<F{-?/+ 8@tS~#tY4 l\z. D?я瀣R>q'r?jqC >`)Xqi?QD /2E>p?daq"qrƤD0É̈`1.>H ..Ї?<1OF=0@Fr{$r$,1q^8"p`6DN($#=LZy@~G-miI3S ~d'b;  棄O"\StSh\:QN<ԊÈD[%PeTZGrcmTU#GALm+NH`T-^MRaT;-JOSQ.7-j *USLVRgΩTEU2]=R[VLJfnYY?7՜nA[aҵ7kטvw5_!*8B`WؚtWmTcչn> 6яF6Q՞b7X mF[+J,l_KٌOhVVSnq*~tmUp\򖶾uzjrjn J0w^7dy5ܰ&U/ث&z6*m{2fg,&#_22 [R % ÎS0 % K@$cD21P$'=rqD<3 :qai3 5iy3 2z\4#K -R|5'? *5+/ &L6/# #l73 R77 8; \9?  :C R}:#UҘδ7NwZ'GMRԨ6LnVհgMZָεw^MbNf;ЎMj[ζn{JyM*:P, &\&Шw%nBy;q VB~xMaZo\g"8^ yC ^Aޛu*8:7Fty'B:4ΈX-&v>#'@ 2J!#e|%80Lbool !o5le&2MT"$p_/R B Q wr=73 D0u ?6Y+iؕ(9.x1qz8sVDI7(99 1R)o{}Q8aY3! J,FXxlv)t9vtUW:|aHIqOC8tNr$"`2Kq~Q`I9?|t'i8w& .egT9q=|i9AWq 6@I8 o:`CP}Guj钩 0ruVGM Pf8"Vc iVHx z/do0  3Zavʖ5gw }wtFj*o7y`r v &.:z*P8F|ωu} }I7 7PvXYzz-Ipw zNPJr*oujp@a*Pbp|ri"$*T)B )31j@[yxa9F(L `J @p bN᚟1 Gʯ1At@Q' K5"$[vgs<_w!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,W!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,  8@lȁY /3gPǁ*B>".OERF)AZ86@,&(D'Hh,噺AmuB|܉{2;o*tXOp1-3HT !,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,WC`H*\ȰÇ#JHC;2jܨqǏ CIɓ(S\ɲ˗0WrI͛8ss&@ JѣH9 ӧPJ:)իXu.ʵׯR޴ ٳhgMvضp%ڹxxw޺~ 6 XÈM̶0ǐ\e:9掝C@yϦSEMZkƥ_'e-6Zֱm>{Pھ_-8oH#_n8T{C|ίk/*}{.} ]go.x)m NIhknyd"n"s8Z*wr)2b5fHbh\6d)L"d9T 6eY m fe^9&;Za\bhʩZvFgmnX~V`gz)uhs)!=J)\YYiZ:砦Bi`ڦBj]jVj{ٺ" ltڮh&ζlhFۓ&5 mfm[)qaK.Qzvn[TU.MkF;޷O/{o4Y.0_Ng䰪_LpGm$TaȌAWu9='Xy?@paFFplQlCP0FGxCH&>rR+ #$myI29~?(kOZ<П>!3c4L+Y裀x.s(Rlف(.Ai, 5H`E.yX'wME\so| ib絲 XSsT'i:zgԊ?ٻ.AqN^ՓU ICsTEw.8ĊgBiRTe<:ZP&J+~ʥS~e4)hlʩj"ꥌTA*J)j(U*BjNcPgVV5eYUSyQ`թX۽Qq*P*ݵPy?sءfaI5Pcٕ.de;YM6OgՍVN-iߔ̭VMmk۾vLm[KmoXWndq[\.wfUs]NhՕu]nkw^ߎpy^ Juz!޳7J|-W_ݗI~E߰7I6QWH vu`=8HW]G}8G!6WbF)vbXF1WݸE9cXEVE&;P1”XXβe.g`L2hN6pL:xγ>πMBЈNF;ѐR6!kc*}iz&6Q|O&=jȉFSQDkXu9sMB'B؁3mU${3)\`;2YW}mb[:)%Ț@@ 2`X{'։Pk@H6Mmww{0?$2 1D%Jp@ߐD37qal0JlZJ&#`BЃEu"Jd|&5Fp 9GNpl؈‘s$'p%7b `e/ICbt&6Bp:i7"Y2F Ȩu!oa o&0D/Fo#l$͂Q`#m8M:X;ivы]O(6.mx<ž; 0wƸFɢDҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, 8`跮A.hLw6X cP]g7Zd倛+c%U9z Ο"7  X֛ՕUd^'p+[qkp>Q!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,W!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, k8`AhrUNhI篟A 'iDŽQkIA'1pgΛY 1ǛAJ vGB!o^@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,(HO<@@xHb.TBmBX$ j }!iɁT\H@'iLd 9+u^;j;WmnD)fˮWZfӹK/t먽RoeGo3GpN Y˰M?qO^SqU%W}Lrk$ ˈ|ӜQᬱ΃L=/tOF#J?uwBK4MU5W'5R'u_6mSmWj+v| 7Oc \v^[[ww9da T v'w6/r]Bt-brޮ9踑좮k~~^޸s"WK{j׼k=^?˿hSze}!PY cQ0# ?e08`I?mh/ _*aY\8Cΰ"L uxЁ*\!N*(p?8 c#0^DDXS^E,9\}3z/ADbH>83ՆUqgoB 2i\"9+=RxZ"DzzS؈+L^Jbs"JMb=IRK$%1JH(U-uˢRVLT/KTR !2l̄V1vL9:󑶋9Jj(l2Mlޜ%rfiyqt"3{̓;?zӚ||,MB4'7c{nԘݧC5^%O8UP;U4v#K4e)uJKR9մ&;UO},ONJҐJOT1TBT &즊vjjͤ3q`=Xիz5?V1իZU:U}]+JP^6] (C ]ʛR*8@nFt('B:3Ft-6kWc;#' 2J!#v%80LbnTl e5leP&2MT"$Vx"~J,"094Pn7d Eр&Gw7!wu'w#&xduDҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!,W!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!,W!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!, @JV 8<2l ӦpHp?y=+Dep_d'/pN=iWBcT@N[aGvzU.Ò\!,W!, G8pA†B\pA /6QF9ɑD4yrA+~Ԙ$B31fa@!,W!,(HK@`qśHq⛂;ÇIr$L6#HjD@b}5t=\ ,:Д~JZ.ohїwR ;Z5&XAj-L8ƣځ4O?{|@oL%+Yĥϊ#gw=e9}VnJ@X+E e{#eMycV xҫRjZZre)9D37U/+~Ϟ*qx'%C H^0sH`p:lK ~X)66]5@9S"C, 'd!,W!, txTi*aB[9DX8b-; Z$[G?HF.ရ7'Nv|tX>DҘs$wd9HvI|Ni- @@!,W!, [P)O„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0À!,W!,H  *p… ;#=L(l&$pxta LF@ , Ą 6tMԉ̋&<d&k^H1 L< L'Q9 6R 7v)0x$֐)@7`s/,EB$JZ  370MDRTQHhfXpÀ!,W!, #d@` &L@@#"#D0@@!,W!,#`@D !SC{t`B C@@!,W!,W!,W!, !X?{r @@I!,W!, `ftYÇ(  "!,W!,` At G{0Xp`B^0aBF7)^(aR1 ,H ̛8oxс&6!$τ`^4$&3F_^d )4f9zW4Y[Lq!_L#d5-B1#!TsJ0]\8K徖Z!,W!,`5!,W!,AؑDr@!,W!,`@"֐!,W!,*\ȰÇ#JHŋ%Z }2dIɓ(SD_Bv"WʜI͙n ߩ ;p uѣHq ߣKJիaqY J٤uPjcʝKSk#q Lx*7&pǐJrُ=ш̹31U+qK<<^mt?xcۆ)k&0{hN"6ST{ν@+w_^CGbTC0(+!,W!, &d@$]L ^RAA7Da!!,W!, B,Č  )0 .k,j=~: 3j5&@H+!,W!,W!,W!, ';# &LHj`4"Ft0/d͋!,W!,W!,W!, !X?{r @@I!,W!,!Aؑ=\A &L9a& 4!,W!, ")Ȱ!&b" Y! !,W!,W!,W!, e1HpA*\ #2|HQĊ-^XQƒ0G(h2!F- MXBdLy93P ZG{\9!,W!,W!,W!, L`HpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;c!,W!,[1 0@ AXȰ!CJtH!‹Vč1hdC QHȕUB)RFSĹH2?ti$̠:yt t΀!,W!, 8`@)\. GǠOGA" R<N0_'K~ @li=>4&njIY6e,8Ad[?L;{!,W!, J`(@L*\x0C>4H1"ĉ-FĈQĆ =.RdɎ&IV4bB*[Rd̗)OtsgL!,W!,W!,W;bubbletea-0.27.0/examples/composable-views/main.go000066400000000000000000000073741465647402200221220ustar00rootroot00000000000000package main import ( "fmt" "log" "time" "github.com/charmbracelet/bubbles/spinner" "github.com/charmbracelet/bubbles/timer" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) /* This example assumes an existing understanding of commands and messages. If you haven't already read our tutorials on the basics of Bubble Tea and working with commands, we recommend reading those first. Find them at: https://github.com/charmbracelet/bubbletea/tree/master/tutorials/commands https://github.com/charmbracelet/bubbletea/tree/master/tutorials/basics */ // sessionState is used to track which model is focused type sessionState uint const ( defaultTime = time.Minute timerView sessionState = iota spinnerView ) var ( // Available spinners spinners = []spinner.Spinner{ spinner.Line, spinner.Dot, spinner.MiniDot, spinner.Jump, spinner.Pulse, spinner.Points, spinner.Globe, spinner.Moon, spinner.Monkey, } modelStyle = lipgloss.NewStyle(). Width(15). Height(5). Align(lipgloss.Center, lipgloss.Center). BorderStyle(lipgloss.HiddenBorder()) focusedModelStyle = lipgloss.NewStyle(). Width(15). Height(5). Align(lipgloss.Center, lipgloss.Center). BorderStyle(lipgloss.NormalBorder()). BorderForeground(lipgloss.Color("69")) spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("69")) helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")) ) type mainModel struct { state sessionState timer timer.Model spinner spinner.Model index int } func newModel(timeout time.Duration) mainModel { m := mainModel{state: timerView} m.timer = timer.New(timeout) m.spinner = spinner.New() return m } func (m mainModel) Init() tea.Cmd { // start the timer and spinner on program start return tea.Batch(m.timer.Init(), m.spinner.Tick) } func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd var cmds []tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": return m, tea.Quit case "tab": if m.state == timerView { m.state = spinnerView } else { m.state = timerView } case "n": if m.state == timerView { m.timer = timer.New(defaultTime) cmds = append(cmds, m.timer.Init()) } else { m.Next() m.resetSpinner() cmds = append(cmds, m.spinner.Tick) } } switch m.state { // update whichever model is focused case spinnerView: m.spinner, cmd = m.spinner.Update(msg) cmds = append(cmds, cmd) default: m.timer, cmd = m.timer.Update(msg) cmds = append(cmds, cmd) } case spinner.TickMsg: m.spinner, cmd = m.spinner.Update(msg) cmds = append(cmds, cmd) case timer.TickMsg: m.timer, cmd = m.timer.Update(msg) cmds = append(cmds, cmd) } return m, tea.Batch(cmds...) } func (m mainModel) View() string { var s string model := m.currentFocusedModel() if m.state == timerView { s += lipgloss.JoinHorizontal(lipgloss.Top, focusedModelStyle.Render(fmt.Sprintf("%4s", m.timer.View())), modelStyle.Render(m.spinner.View())) } else { s += lipgloss.JoinHorizontal(lipgloss.Top, modelStyle.Render(fmt.Sprintf("%4s", m.timer.View())), focusedModelStyle.Render(m.spinner.View())) } s += helpStyle.Render(fmt.Sprintf("\ntab: focus next • n: new %s • q: exit\n", model)) return s } func (m mainModel) currentFocusedModel() string { if m.state == timerView { return "timer" } return "spinner" } func (m *mainModel) Next() { if m.index == len(spinners)-1 { m.index = 0 } else { m.index++ } } func (m *mainModel) resetSpinner() { m.spinner = spinner.New() m.spinner.Style = spinnerStyle m.spinner.Spinner = spinners[m.index] } func main() { p := tea.NewProgram(newModel(defaultTime)) if _, err := p.Run(); err != nil { log.Fatal(err) } } bubbletea-0.27.0/examples/credit-card-form/000077500000000000000000000000001465647402200204775ustar00rootroot00000000000000bubbletea-0.27.0/examples/credit-card-form/README.md000066400000000000000000000001051465647402200217520ustar00rootroot00000000000000# Credit Card Form bubbletea-0.27.0/examples/credit-card-form/credit-card-form.gif000066400000000000000000000642531465647402200243220ustar00rootroot00000000000000GIF89aX!/0  !! 6!!!"""###$#@$$$% %%%&&&'"'''(#((()))*$***+%+)U+++,*X-&---.../(0001112223*31m33342o4445,5556667778889.999:8:::;;;<1<:=1=;===>2>>>?2???@@@AAABBBCCCDDDE7EEEF7FCFFFGGGH9HHHIIIJJJK;KHKKKLHLILLLMMMNNNOOOP>PPPQQQR@RRRSOSSSTPTTTUUUVRVVVWCWWWXTXXXYYYZEZVZZZ\G\\\]]]^^^_H___aJaaacKccceeefffgNhOhhhiiijPkkklllnnnoToooqqqrUrrrtttuuuvYvvvxxxyZyyy|\|]|||~^~~~_aa c eg j k m n p q t v x x z | ~  ! NETSCAPE2.0!,X!/0  !! 6!!!"""###$#@$$$% %%%&&&'"'''(#((()))*$***+%+)U+++,*X-&---.../(0001112223*31m33342o4445,5556667778889.999:8:::;;;<1<:=1=;===>2>>>?2???@@@AAABBBCCCDDDE7EEEF7FCFFFGGGH9HHHIIIJJJK;KHKKKLHLILLLMMMNNNOOOP>PPPQQQR@RRRSOSSSTPTTTUUUVRVVVWCWWWXTXXXYYYZEZVZZZ\G\\\]]]^^^_H___aJaaacKccceeefffgNhOhhhiiijPkkklllnnnoToooqqqrUrrrtttuuuvYvvvxxxyZyyy|\|]|||~^~~~_aa c eg j k m n p q t v x x z | ~  H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~pā [A>Q)䓏T:{p4BG4-݂6k,,4@S8m*T4Urx#nmlpEP( LW{AFx r>4FBT.r,` 4S:7O"@MO%/1="r>4ܧx5; dϖAaCA?ngL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6jpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָ!,W!,m\ N0`*$aC xbŠ1>cńsI. p* &NŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= |8by|JR| xg M=EYkXA3ŘI|ޔsO1CqvfNkɓgǧϝ|B 87>`* 4X&j2ǘ)Q&}4ܓ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a -W6)( Օ#˧KСEAd]>j{vT.HuFR6qڦ%\j.Z'g{ʘEclҭFʑ-[|d@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,"ř>,/]绢 %)p+Dy$$ZU9{ (ߺɶ<Fep)ŘcD7y+xs@aKqХo wtkR9a#NM쿷% !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ4EV$2L5e8 s`w;5&G0KN0+cfIߋY-Z+ֺ YAQrimv7/N\VtS8Fn]LQ௤i*@YҫeS81ѥȫMc׷i !,W!,P H࿃&,p‡6Q"C-ĨPA= rjۊl$|$YPLW3Al ҃Ed)t˖[ Pɛ S fA\jEaz%lFn;sXN:FjIpk=-Xhcu?9⼚V;oZ瀙d?5lU"pu 2];@;޽D@fUk 84俔,c֜I-!,W!,P sH࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IA@OBԙSRM->UTU'fuc׏$eI2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,F3f/_>|8by|JR| xg M=EYkXA3ŘI|ޔsO1CqvfNkɓgǧϝ|B 87>`* 4X&j2ǘ)Q&}4ܓ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,8ř@/_=I <3T9,߼%`@n6AgW >`Q n2iϳ-giO4bor,8LO\+/)9[Oz; rjHݍi`1\ iSR6l۵5}2 !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a -W6)( Օ#˧KСEAd]>j{vT.HuFR6qڦ%\j.Z'g{ʘEclҭFʑ-[|d@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ4EV$2L5e8 s`w;5&G0KN0+cfIߋY-Z+ֺ YAQrimv7/N\VtS8Fn]LQ௤i*@YҫeS81ѥȫMc׷i !,W!,PP@H*\ȰÇ#JHqŋ1RȱǏ CrHȓ(S\dI0cʜ%I8sYfF@ SУH.,jRӧHZJNjݺ+ׯ`=z KñfӪ%v۲mw]uMwߠ} xᘅ+NxcKye/k^*ugʝ?ziLONy֮-Î-۸sM[oܼcpWם\M?}խ_.?O,~-O/y={+/0`r H[V `d=!XNUjaUm!T~T@!,W!,W!,W!,PpH *\ȰÇ#JHŋ3jǁCIɓ(7~˗0c̸̛8sYfA@ zҧAH*](HPJTTr\JT†}!;sC0 +ɪKGT dxQ^܂ y>,A^>|49S.$ŢAwr.Q'()ڍ}6,%Ip>{q- *p6ܓHzuY[O5IS";;s@SKh._;'0 {%a"Ǐ8.(9ABIWtUB3OD/pPkA4APqw{atc&(4wPkL@F^ZanaCgBL" m1$I9 ֍$m=jzs7" .`@Cơݢ2M @ %rBk6=B1r-R j|<h`W0]WCtGS BB gqC_^3Kal\9s n5䃟6j?4ԄB9z6XO<Ӊa5ZB(g,Y ` cB'Ԛ ,p0FrlⷛeBSGDcR79XR"h7%d HC.FHX 9Z>LO!SHሌ`_>cy B`X;8 ZhAH ^>\1 `/ Zv„!ML;2򃿨b4m!ո]anu_<>pEƿ1vPlиRnщ(Hu=sn㔹9:b-pI@[ ʱB0QP+K;Ñ$F^I^p|Cml `f /H!|6̓["u,$d#Nf*!0`|V{| | TLfA !P%w\CP0uO$Mw$k@MJԢħFMR2ԥ:UM}TJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚ79tLa*D&YBG?r4ǰ#5rήnn0"Bdh.g[Ez?X";hzWr놄 !|`@AM@@b7H}1ZP xAt@>p . EBV}VUP Ac~ӈ.'2vp0EB=7 ' [K0 /F[ҼG+bmlk[ 0EEV/BL^竾+F >F|c!D+i6tB0@yCG#$A(9 dB"|Fsz!+"Kay1l/}ӹ :^wy_iBݤF,X'Dסnt~M F'<.+=!?Hы xj O/* 7C.xp9=J,wM} _{Z ֺs\C|?zka Csy !uuPd7tv hI [w(~G~TaQwnYWu[[dm mŰZwz] Ghf {P7{^ l[yWOvc.)^ .vІ:(_hxw x[ xhqG8~JX~/n+x'e0n k؆y%h`]5x~ A { u{W'i QpE؇pGxp?| 0e[ q ]@ie{EO p'hv p؍Q(fCZ蘎긎؎xTTS;xSSY=ӐQ) A%@^ ]?0qW@ ! #yY!p^ L'i-0kq01/R bCLP B@ Q@9 q@ ,AE` =ILaLP*TڤQ 0Q[z^ !\aiZYj]o:qjQ#9aY8 Qh6ڛ`LA ;qGa =P> e/q `qpZ ڪʪZJ**ګ z#-^ `K@B` PM0f9?=/2&О@ɮYXhh0;K kKa !۰+'nyXR:qp>ʏ!18M?+"CG@'AW m ѵ@[{beKgKalk pr˲ꙡ a0eٖ[ >:˳j!Е4"qB+Ak@i[^[d chۺ q{3whN9H9 A @ @ 1@ B,}:m!{f$ k #K۾;[K+q-m Q'=++.1;f q$ ̫K+-,¦*1\3<2 46lڻC /Op`ɖ@ɛ!#hpXl6@;{kRE _!LI`m*PtCcslp,dJwuuLjlK @ 9@N1pɃjWUQ8 IB!P} dĉ<0R:˾, v X9@_ qܔW0A  n c{5  !;U'8X蹅 -WM.qv(@Յ BDWX.?gs<T(]0 X_u `b?d_fhjl=^pQXUdx{^t[ Sb:^"W?YF 1 Q?Ez/ P+I[[X 'Mg@Y/)N`COo.eyo1Qqu+,P ^ =!@ 8X' >QbC 'd1jxb2nRJ-])pM5m |M2iĩgD0q^<̠Є)q8Lg)Oc^% 3c<,krUZmY,p` C `ݞ9мPI1B( anF}1xK #Ǚ\٨dʎ=6_(LҦQnmm8Cìk;Nh|oC@&qlİ ]:u6d1 C>$_s(!=|g_L_|VЮ #O C.dB?hC:+ЧK.rjChDS "Qw,GPDPIt05T"ADI 8Č̇DSM/dNI8n:B,K8*ȤjF{(QC4RǔDRK1Uе2P@\$*áR:5ՆVUIgeKI2=!@rT$P#2X5Y۔YhZr5;l;BXIPQC2 T$s]=(]EWy^ۃ$4@H(W#r\9b%4mFQs#ؐ%T`Z% P$GD CxGIQ~@>SJBS<"$ѼLʁ=Ih5IS ( Y&IiJ!b EXFre ^:nR\.h"tH(MRT Wd7M}ق8I!Q=)ts)C9Mw4Q99JȥF=Vсa. m(YylfHZMPN챁#=_Jsa4ʅO WDzS]o5u%E&g<2 'DQl`pʡQ ]H`%L]!嘰KDt6kXH %a"ʕ(4BƂ.k 8jӯ/@W@h1AI9DOeWF-h8@U}Dۿ&tj$zv30Eu N*lHк=-CX@B!/[SșH- !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,^ }H*\ȰÇ _H8/ڈcFa5M"hb &cgGA* ̬YL;m| HQ$qJq@+X4sEIqt,+V!Ӫ]va@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,_ Hp`&,ȰÇ#JHŋ3jȱ;Iɓ(SzQ˗0cʜYeK8sӦB@ BH*j4ҧPlzPիX-Rp@֯`z8cr$դJp۷]uJҍ;"܂!!T@"NlqG =8/cė0U,yeOT5ɑqlxCV}xwu.l4ɮkӾz9jDbՌ6}|&  iGHo[צើ}~NyryEWc=wrGQ'af kچIve.*1u3Xڌ4ިш'蟃깕bY+6Z!A9څL>i%[Y(בV7q'^gߙM)%_nc}h^@Ite[wqfɩ[9/ g~^}m^wX&Z娠%Gҕ)IeJm_أ=;lJhmnpʢꩩF!>a)/q v+k4$s8,:3E<,ПLGY!,W!,W!,W!,l H`&,p‡6Q"C-ĨPA= R$Ƀ CL<905z%., t^҄&`Ԧ| B@*HQ"!Pblf26 ܯ0/GM `ecPtֹxXC+n҉I|ܬ3Zpds!,W!,W!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"Gd(*]+ b@LY&HռS`=}r8aR0g"hl]ti9`U<|j+N È^N啓,`n]f?Pk3ƔC,Q0j)ad@!,W!, hH`&,p‡6Q"C-ĨPA= R$Ƀ"GL9d>.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"G*˗.$)8oޙ R8'G,x2@zB0]90aA& t7J+8]v^lR0N(PSjO%7'$^ UYfEsږ{w42T F&{Tx{?!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"Gd&]=I1A^+2Šb@l"RlڅqT5DWà. 2fBy)gہz8@m2d&zJL=%L KIVCu[%E+Q`|:D;:eoHy[8ɀ!,W!,W!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"G )˗0 8o*8s3s 5@aEO@iC@8c4)QbW2DN 1@I][J;6j+ f `]:";fkF)R9ef/ !,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ Mdxr`jÖ8N@G`jd 2SLȄAptWA lAp(n\c-Ɓzur;;{' 8ٙ%C\taȼ7P3VfU fȴXI2OB"&3n1q`;yƓW@ j*29[b={8M(4 !,W!,W!,W!, hH`&,p‡6Q"C-ĨPA= R$Ƀ"GL9d>.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ ?xr j+#IjSÖxW[;alHf[zSkc1d$+`g-;hWNhoj l8lg8YEu@8?,d3ޝp@s uIRrdU҂]VSU%VWežYi7l.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,0 H`&,p‡6Q"C-ĨPA= R$Ƀ C0xrnxw#Iudꔙa; 4uF" Awn)e RbzqXÈ=0#:ɱyswЖDD`(|7-$, ^ %2eУx3 &s^8u:դ(pԼd^H=/6+ċ=>ds!,W!,> H`&,p‡6Q"C-ĨPA= R$Ƀ"Gd(*]+ b@LY&HռS`=}r8aR0g"hl]ti9`U<|j+N È^N啓,`n]f?Pk3ƔC,Q0j)ad@!,W!,W!,W!,L H`&,p‡6Q"C-ĨPA= R$Ƀ"G*˗.$)8oޙ R8'G,x2@zB0]90aA& t7J+8]v^lR0N(PSjO%7'$^ UYfEsږ{w42T F&{Tx{?!,W!,Z H`&,p‡6Q"C-ĨPA= R$Ƀ"Gd&]=I1A^+2Šb@l"RlڅqT5DWà. 2fBy)gہz8@m2d&zJL=%L KIVCu[%E+Q`|:D;:eoHy[8ɀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,h %H*\ȰÇ#JHŋ3jȱcÀ!,W!,^0  H*\ȰÇ(UpA_h2>!G8w!EAY`\9@Ҁ] s#{DV~ pj)WO t 7@| ZbVFj!LP0ynȸ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,^0E H`&Ç#J|X@NȑE3vINJ!1\d Yʄ L3syA9y S@ oQ )NKF)pSxPK&튖mí[LD)>f2]k߸q ,t0ޝpxߦɗYr=;@R_ V^ǎפ07w6ȓA3\>7]5}K~v8ϊ_[WsCoqthogwފgM{wQ3|ykY/p5Rraρ48Tyɡg!E9t: =]MU| %-hN "ȝt#!,W!,l0 H`&,p‡6Q"C-ĨPA= R$Ƀ CL<905z%., t^҄&`Ԧ| B@*HQ"!Pblf26 ܯ0/GM `ecPtֹxXC+n҉I|ܬ3Zpds!,W!,W!,W!,0 H`&,p‡6Q"C-ĨPA= R$Ƀ"Gd(*]+ b@LY&HռS`=}r8aR0g"hl]ti9`U<|j+N È^N啓,`n]f?Pk3ƔC,Q0j)ad@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,0 %H*\ȰÇ#JHŋ3jȱcÀ!,W!,0  H*\ȰÇ̠+ApP CTnu `='k7b+BJ4 fDFHQ oPU0$gTOH Ojw&%c1`q& d4I= z)@\̸!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,0) H`&Æ#THË %JXE9RdA I:4iEY t̙4)3ΝK'dNxPՀ> X0=8&W+(t0ޝpZ0 \>Uj~m+I:mԂ-lZ ;Ȅ'[Ĝ#Ucn 'ʪfFz^Zߖ=?k(|Zаds!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,0 %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,0 % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,0 %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R6 H [ȰaÄ#BtHċTc=,ȓKZD)RJ].Q?1ehs΋6H 4Lt X6G)(iյT.NӨ pȻw钧ukגQqKf壶gG+oA$0S" Nwˠ͂ Vo: F</abʿ@gK.JT% el4*|136r# 16+3 { return fmt.Errorf("CCN is too long") } if len(s) == 0 || len(s)%5 != 0 && (s[len(s)-1] < '0' || s[len(s)-1] > '9') { return fmt.Errorf("CCN is invalid") } // The last digit should be a number unless it is a multiple of 4 in which // case it should be a space if len(s)%5 == 0 && s[len(s)-1] != ' ' { return fmt.Errorf("CCN must separate groups with spaces") } // The remaining digits should be integers c := strings.ReplaceAll(s, " ", "") _, err := strconv.ParseInt(c, 10, 64) return err } func expValidator(s string) error { // The 3 character should be a slash (/) // The rest should be numbers e := strings.ReplaceAll(s, "/", "") _, err := strconv.ParseInt(e, 10, 64) if err != nil { return fmt.Errorf("EXP is invalid") } // There should be only one slash and it should be in the 2nd index (3rd character) if len(s) >= 3 && (strings.Index(s, "/") != 2 || strings.LastIndex(s, "/") != 2) { return fmt.Errorf("EXP is invalid") } return nil } func cvvValidator(s string) error { // The CVV should be a number of 3 digits // Since the input will already ensure that the CVV is a string of length 3, // All we need to do is check that it is a number _, err := strconv.ParseInt(s, 10, 64) return err } func initialModel() model { var inputs []textinput.Model = make([]textinput.Model, 3) inputs[ccn] = textinput.New() inputs[ccn].Placeholder = "4505 **** **** 1234" inputs[ccn].Focus() inputs[ccn].CharLimit = 20 inputs[ccn].Width = 30 inputs[ccn].Prompt = "" inputs[ccn].Validate = ccnValidator inputs[exp] = textinput.New() inputs[exp].Placeholder = "MM/YY " inputs[exp].CharLimit = 5 inputs[exp].Width = 5 inputs[exp].Prompt = "" inputs[exp].Validate = expValidator inputs[cvv] = textinput.New() inputs[cvv].Placeholder = "XXX" inputs[cvv].CharLimit = 3 inputs[cvv].Width = 5 inputs[cvv].Prompt = "" inputs[cvv].Validate = cvvValidator return model{ inputs: inputs, focused: 0, err: nil, } } func (m model) Init() tea.Cmd { return textinput.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmds []tea.Cmd = make([]tea.Cmd, len(m.inputs)) switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter: if m.focused == len(m.inputs)-1 { return m, tea.Quit } m.nextInput() case tea.KeyCtrlC, tea.KeyEsc: return m, tea.Quit case tea.KeyShiftTab, tea.KeyCtrlP: m.prevInput() case tea.KeyTab, tea.KeyCtrlN: m.nextInput() } for i := range m.inputs { m.inputs[i].Blur() } m.inputs[m.focused].Focus() // We handle errors just like any other message case errMsg: m.err = msg return m, nil } for i := range m.inputs { m.inputs[i], cmds[i] = m.inputs[i].Update(msg) } return m, tea.Batch(cmds...) } func (m model) View() string { return fmt.Sprintf( ` Total: $21.50: %s %s %s %s %s %s %s `, inputStyle.Width(30).Render("Card Number"), m.inputs[ccn].View(), inputStyle.Width(6).Render("EXP"), inputStyle.Width(6).Render("CVV"), m.inputs[exp].View(), m.inputs[cvv].View(), continueStyle.Render("Continue ->"), ) + "\n" } // nextInput focuses the next input field func (m *model) nextInput() { m.focused = (m.focused + 1) % len(m.inputs) } // prevInput focuses the previous input field func (m *model) prevInput() { m.focused-- // Wrap around if m.focused < 0 { m.focused = len(m.inputs) - 1 } } bubbletea-0.27.0/examples/debounce/000077500000000000000000000000001465647402200171415ustar00rootroot00000000000000bubbletea-0.27.0/examples/debounce/README.md000066400000000000000000000000651465647402200204210ustar00rootroot00000000000000# Debounce bubbletea-0.27.0/examples/debounce/debounce.gif000066400000000000000000000526371465647402200214310ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:0檫Z1,ȶh,6ⲻ:+m: V+,r-݆Èkn䞫n.y~ pTA[E1)#L/t% Q Mt`$ µ3JRlu$10Lԃ©`( IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6rpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^w !,W!,m\ N *$aC xbŠ1> ń3. @W* bKŁL̸3bF{!,W!,zP Hః&,p‡6Q"C-ĨPA= ! +2Ff0=*IJ!,؅ %jʆ 3S&C;l}4Z08Ks" ؃FiO ᕩ?b]:3kr+A\U [4 '2M$lĕ,%eX ,a(ȃf+ ZdiC !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ,R3E?Z$2L5e89`s]„3&G0JjN" 5"@NID#,XtY-jHֺ$S:rit7/DV.NY oDRV]LQ vi*@B:dS@1ѥȫMc׷i !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,ař,d%LXFά箢Z %)pOi_$TU9{^ 8Fحɶ/LEn*Mp)ӂŘ +C0(y+s J1 h,QjR+ !Ra#NM쿷% !,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ&,RTaFɘ3kJ|M=uPLaHjC3a l&# &F`Hez=[ǂ쩂 M`*`%?j2ǘ)Q&}4ܓ!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,ař,d%LXFά箢Z %)pOi_$TU9{^ 8Fحɶ/LEn*Mp)ӂŘ +C0(y+s J1 h,QjR+ !Ra#NM쿷% !,W!,PP@H*\ȰÇ#> @E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+aSV]zש[ [_گmŽZ^ެ}[]⨍G|.a>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,W!,W!,Pp>H *\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cV,Hs̛8sɳϟ@ Jѣ0kDʴӧPJJիXM*ׯ`ÊKٳ3D˶۷pʝKWڵu˷߿޵È+^x@Ɛ#KL坎\y!ϠCT`ZU& Uf,D%,,0sͻFTk#ƼyУK^00G=(9ӫ_:v*NaK &~Pb#  HC aFB# e:^("kYH )L+ 0(T0XP 3ΘG47!B&" ݐJs2BNB)BI2$Ojy%C0HF?0BBKl..̢Z.z #B cBBE#0'Km L Ͱ.2Ks0P{'B"œ-}~Pܧ* ̙풑"T%klZ" /t$)p̉"2  ,IŒr VH Xzp̅ nVo zxt+:pwuE c WFBsJЂP ̉Э0$Gm2HC&rBKBXqBAPG3B)DlR#F 4 h=u^-xܒ ̝pP\0,$0(t/cwBtۍPyĔ A.+0rxBc\#(j렱]$-qPl\i ݎ{s#޶rB7 )0T}ӗt3D Yus|*矊& !L-Y07/!D򘣿O!hP阃 &%$-ͩ IМF 8s W¸|(lrEAA%J9TFQ940:Μ1U`k"Т B0IdoaTs TBDB;z 'B XbOS,QLE9ڪ$[FD'\FhLgJS Le("zE ȫ7sn!QdSSO:T`!B) rULia@mPU|!م6"[`5\z̬ DCF&Mc"0^9R! .!kc؇x#"C*KzE89ZjWZňv"^.8\^+lA0A[ o#r6ЍtZucz xKMz|Kͯ~BgX `8:peh S" ,dq0Y1 exn뜰591  eq1IbQ{8Nb `u *pYv#,(꺛$Lvȓdadpɲ[.SD#0qa Gn,5d^D_s沒f8;EmP? B`2Jթ!fv Lz!HIR,xiKéw~,Sk W#$,u \ZsHD~! *C5\6$(A~^g:nȳT#ȮIb;d?Ȱ%Rws#цȸX[!HL7n|#龈%p#d ɷ /ɹnۋ( l!*H}qd$K)ZQB0/$DAn`!r/tSF8`y iH!PBp&u)E_ףo(N]<`UU+ˈFA6 ^ I'ҒRhk!Iҙt_<׎r&T "`)9 Ds#1p.q=kWы<*MDpt5E_FHg^|Pu A>TK֦OL0}lBO|;ЗB^}pԯRx;֑7yQy6|| m xg7#;B?TV'$D|$Շv6d'{Ez yyx'@z jv-}-"wHgy F ZB6/A(0An *' , [t l?v0\3\P37"|B)w̡)r*2+B+ 11(Ar'(i(r(7rz 'a+H(8qtX P֣h `% pBCpY,1jȆq2\vH=@sRZȅՇbY%਋H*) qx"H눉h33*bH1PpqYk؆ ъsh8х( # *y(‡2")*Ȉy79(Ȏ=.Ҍ ؎z'Yx( B9xGC= V@jpup"/b/ap)2"U".3..ς0U/ 0 S0)0c0q8"K+! Ӄx`Iθ-Hd Wt00yHib -'! טvY) I>+P€@{=ٙ&9lp.byo) q IDuyct0,D p q yɹy" P? qI@#Yᡃ-2.Hy3q.˚ 5 4U4jM{j*2T0&W Z23i B d( sJ)A4Cz<*ʮ&+ Kz=p)k:ʩJ[a>{7 3[G{ A7j99 ,(ʰ+QխܳrZ8u:39 :r 2 "LSyxC, YG87Zf7 Hsٷ;E!  qy+ {9 A q98A a~)m[toVpɹb$]3;{;~˴`[ZsJ8ǃ9nPseʷ J7k{77D*()\Q ;8=Ӧ/;;t@jKK A¹Sأ7|=p0 Y ;* <1dI٣f J; kII& JØ=[Ą k9e S$V@;C,ܰ ,Ȗ32y,8{̞ ^<9P=40<:beL[ܹQg, i1c[ǐŧlđ,ȓ  QȌgЃ=<+SpI qG;?Ĭ+¬Tltx\,{\|R{WA @ XE! C7ǣ@@+*A!}` 21# @ԝĶ(J| @$kʮw,(;3b+w, qiD%i% Њ, !=M>Q)Ҙ+/|ɑ*bjUҎ! !@  AAt"ΌĘ,4-}m)?bͥr EQ̋Qܰ !EK) M׮< D8DEdCIDVDݚaD9 ЈMȨC-C Lp !;tlXLZi=( _ n𷸭 ٟ-Lǜ޼m0 QEI aD AW[}ߍk=֩߬FEc3CD MPړ Dޡ<խ~ "Mg=*lpejI!I B<`q7e=́GGj͏ɁD$4dA6`33rDGmYsJpX*  pQ Y_F'. _CvjmAW^;D. uG.t]>PyaHNN# anHZzQ .) n M֠^aG GG^^늾NTHT .^(N *nߎ~q. .9ݲ> A`0_`!*\4ڄ@pӗ (D3K M41/M@M*@K2t)пw) mDBKEbQp0/%v'\;߱ Vz_'o,ST2?Mߴ{ Ue#u# p P`0~kOZr cKLz}_4?S ̡ ]Qvhc<ѡ=@ogXRP Q ~p 'o ~ @'{ @ !L.av)V`XAѪ0X`Dºp'S6dyPfU   0&O(4hG v 4SiA,x|pIҠQIgPgXpAt(p UǐFlKP(Q)2pk sgOn=VVfRנfnY0\&V1VaA4^aAծLE2V=˗B^?k[`l k{_a 1䆒)3A :@eSn,2,-,H#r븁~ &8Z ZCk>f8,1x6 )c0 De23RThEZZ4ȋ.(EP`"a^) &Ć K8HQC<op[x(5?8K/<\,E@P-("] L(;H|r +S!<"@eTNg:C!:5M8t%+USIK{Sa(3 bQH4X߄(N-+P* KO-,yRr2L-%ut Z"W$o'M؂9C`"cw1Y5-HjisR`;0Cigm:[hTzDueH@nY#(KVG#Wu3t)vZoKt.h0X "*8[ ,x/eN{ #!t0\-gR|F@eV+op?rΗ"*rVW%~hx^}O?]tXoIvwnauw<2a$sA1ᖾSGg}P[_`8@EA+``Qweh@(VЧJ9E8/ J` ƒ, #a e8CІa`u…P;F(!0 F0EAť "8F2ьT6BM q\c `s8HBҐD&@6h#G$ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x q Ȫ: Sp_FaxUyűA4 9@AF4 &˒&ixe΂3 *t'N9oI(GlF0Ua r [m !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x xaA#H5  0a G.A(`HI2%A^.@BL?\+:s*?ZH%A<"g\8"E  !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x `KA*FI^nQ`@*tbPD~Ld*Z 0\V‚ %]-eb~ +eU0‚B'EBH+}Q#T @J}5v|Aa0!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x  ԩS`B?z)H _tpOF#pK؝*q (1Sp0E\" z 3QscR'a$׮yEl^B% 0Dõ:h!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,y E? %0(%'(%F C%"6 LB~lCa(/S@CI( .UPԓXe4j(tFخX P!'E cpPC`v= d`77]H @%D!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,y @ W$8X I(#L &RHP uADL::sUjl_P@c(0  SuzA`7A @`^}8Ql-k 22|b!d@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,y z84[CaGB0H! 1Y.i#IF)eG1‚p1J7DDNv QG71?였GFI։!*1j0UX]j !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x a@(L_$ #A$%י"'TN @"\t% 3Ws!b: *õˡpDd!aZr0$D8J$u I+APπ.rRj(&*b&e00 !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x ha"DL֜;(2"a#,` $ K bވ# W?P?@?)p0QJ)lj՟!L?*%l.% O.C 0RhL !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x /$@H0@Yd .ad9B} "\Jɓie2"1FU&1@*^(0E1 HQ SN4#lL0T`ضfxIaJ@#aи Il%:IX+P`GPGKa"0ao9h` Sb>>ck&*0Di fa!IVtXE2뢰JyWح"lu=Cb,8!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Q HA*\Ç#JHŋ3jȱǏ CIɓ(S\ɲ˗0cTɰ™8sɳϟ@ JѣHaڴӧPJJիX\ZSׯ`ÊKٳh+re۷pʝKԵ ˷߿k{SÈ+^81'Hиɔ-kyΞA }<,d@OU=VJ̒Q emҵEڲ)ڶgHtls@s>(|rӁ?odwr?>1< ug'j?uo'x&`yC}~#-݄aؖH!L ~! t`>]4fb(<"y9H"٣K* tY٨#%#gC7eG[YerE"f #]fE1)~E'&A2y:8(l١5(y8衇7i裈fmDZ&꧕(uzgZ(>|vZnzyck]Mhl;Jrjl&,zJQ ĜMtn:c, .:jnJҶl~j&Ȫn3:o0~˰`fi;mj-l2 oʲ,s As!pϔwgzK2Z *Zzr! 39Ƕ3R'(2pS- +wx'ݷ!v7~Gv]5z{lޓ~׾>z#Z5 $ On"4Dku[3Nc:պl<8"OFx}/>syu^>_u_= x{@?ﭭlG:@ \=}CBYicG@gdK[JԼA0Y`68aQzH?e/Y!sV@~@g jqag%Oܳ=h.wb:_\zطQ%;04-kAz56=1rÝ~02=_FˆתX EYχc%a"!JE]9[~!0ch3Ybr͗(}sC !-|h*EZ&[gȿ ѨLDW{N+;'RG#917h$o!T򻡒&ԮfSg:N~{=b[6 6]ڠ,[#~Jlagζqm[7%վ-mIvm'sIzηb~N!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/debounce/main.go000066400000000000000000000032041465647402200204130ustar00rootroot00000000000000package main // This example illustrates how to debounce commands. // // When the user presses a key we increment the "tag" value on the model and, // after a short delay, we include that tag value in the message produced // by the Tick command. // // In a subsequent Update, if the tag in the Msg matches current tag on the // model's state we know that the debouncing is complete and we can proceed as // normal. If not, we simply ignore the inbound message. import ( "fmt" "os" "time" tea "github.com/charmbracelet/bubbletea" ) const debounceDuration = time.Second type exitMsg int type model struct { tag int } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: // Increment the tag on the model... m.tag++ return m, tea.Tick(debounceDuration, func(_ time.Time) tea.Msg { // ...and include a copy of that tag value in the message. return exitMsg(m.tag) }) case exitMsg: // If the tag in the message doesn't match the tag on the model then we // know that this message was not the last one sent and another is on // the way. If that's the case we know, we can ignore this message. // Otherwise, the debounce timeout has passed and this message is a // valid debounced one. if int(msg) == m.tag { return m, tea.Quit } } return m, nil } func (m model) View() string { return fmt.Sprintf("Key presses: %d", m.tag) + "\nTo exit press any key, then wait for one second without pressing anything." } func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Println("uh oh:", err) os.Exit(1) } } bubbletea-0.27.0/examples/exec/000077500000000000000000000000001465647402200163015ustar00rootroot00000000000000bubbletea-0.27.0/examples/exec/README.md000066400000000000000000000000551465647402200175600ustar00rootroot00000000000000# Exec bubbletea-0.27.0/examples/exec/exec.gif000066400000000000000000002761161465647402200177310ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLILLLMMMNNNOOOPPPQQQSOSSSTPTTTUQUUUVVVWSWWWXTYYYZVZZZ[[[\\\^^^___```aaacccdddeeeggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLILLLMMMNNNOOOPPPQQQSOSSSTPTTTUQUUUVVVWSWWWXTYYYZVZZZ[[[\\\^^^___```aaacccdddeeeggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:*6檫Z1,ȶh,6ⲻ:+m: V+,r-݆؈kn "[.koǼGF&=4$sGV`EKo cG?сE#4q,W!E)r8G' R`{w\mHKw@ >]5PG-&mstD5t`'@ =[NGa0[4_lnqlm8n[vG>;0Cwۿ |Й˩ƹNَo'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6pL:N!,W!,zP H &,p‡6Q"C-ĨPA= R$Ƀ"G KdHdDr6Õ8uҧjTyfל pkM ^ɹ*P ]u)؂* jVc-CJאhkRK0صP+2-"gTgfYEJܩSuVmSVMy앷mmwo!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"G˗Ȏ PIR`k8s,@J(V-(+ &bҁKn|*0ӚJ^UGPN[UWa"%XeXYYs5NbxHNS1qJ&[r!,W!,W!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"G @ ˗08-8s^K5se.@']($ &JKn|:0ӤP^TTU~+WYEVCež%Z]ݪ+ZxSLjDlRE!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ +$xr [Ю]S&iÖTڰ #[:vm:HdE2et'vU ֮2ƮE"Tb  S]Ekx uL' a]scp1i9L0٬V@+kL3am5)POh;JMQ<3UH,ngsAq !,W!,W!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"G 0KVH2k8st@e͛ה= . m^VNbSʔYYu`U\Z baD֮BQΜ.hי߸8JVࢥ :5Oi޴u^T Vj!i3ߔa]vRuq6y2 !,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.aL(ɳL˓ J$bŴS;HA$9Tj eТE@ɒٳhDXMoukrf]w^!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.ad(ƕ"9{*ڵkɎ8\yZ\׬4A%E HNABykrzAG~HkRlKmܖD+bԽwchB/@iwLL=Vrg !,W!,W!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.a,`řdĚv-I Z94Dl` W .  1f iϳ-gYM׫Ror pg$@I \#!)WiȬU; [H%avM`# p@iSR6l۵5}2 !,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.ad(ƕ"9{*ڵkɎ8\yZ\׬4A%E HNABykrzAG~HkRlKmܖD+bԽwchB/@iwLL=Vrg !,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.a,řTv4Kbg4ׄ-PIR`kh3SdA5dW9@sY,ת е`Q\K_OmNقUҭ 13!)q_zZCڲ ̂5k"mJ7Y1fJ۳eצe@!,W!,P hH &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.aLL7=IRfO?yd(ŜX]fcNע2s4ׂQJ05gUrd`"R;uVc[k͒ !,W!,W!,W!,"P H &,p‡6Q"C-ĨPA= ! -2FfصC*IJqڅ %ʆ]CS&CAג}4Zٵ=KsrڃҺFjO]ᕩ@G׈]:57k͂6-A\y]4 '2tĕ,v kAXk(Ƀf+ ZdiC !,W!,0P H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.a,ař,vZNά~ %)pP H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.aLJjdfL%II ˵kS|AڵV&D^vIumY?6a>pvtƫ0;:mU;*RL:u% ުJ9 u vG,}]s̻c҄E&]Kt!,W!,W!,W!,LP H &,p‡6Q"C-ĨPA= R$Ƀ"GL$6.a,ař,vZNά~ %)p+E@Wפŧyk. 8P/>o`*`&@j2ǘ)Q&}4ܓ!,W!,PP&@H*\ȰÇ#JHŋhȑ#Ə CIISn<ɲ˗0cTR͛8sHΟ@ ٳУH*}XҧPmRիXOR՘ׯKYbϪ]k5-۷pK͹v-w߿Lxˆ8_Ǝ#ۅ,[ʖ3ŬWΞC*4YЦSEO֮c߄-KڶsĭwH޾[.xDؒ+_ܸ̣+N}tճ]ܙp1|s=/㟯` Hw] V`=qN(\amȡm~(["Fbi*(Z.zcHe6(Y::!,W!,W!,W!,Pp]H *\ȰÇ#JHŋ3jȱǏ CX(S\ɲ˗0ch̛8sɳϔ5KJѣH> ZPӧPJAXjuՓ]ÊKvWeӪ]mʝ۲B!ۋX+5WfALX@qM|##SM`XhY2c9QB]LRh3$[&ոqRVk<5cʝDWO+zk^ϝ jч]@xdGo_IWs;\8Ƒ'oV5tEXZm}  e$ 9 5Ӹ y=KzA\ } 0 x I$GA#DInD!TQyCKF$0Q[HBB0fQљ"4#V ЫUcCB#j'tp[5X5&$D5m}}B\ lwj!W4fלP2PP!jv,$i$ PU!e8 в Z(pלtxpq :` J} :;C7!zE/5p 0 Ғ j,A!Anj$5 ~M_=rmB;襻W/"tX\a!+"Xc箁| )5pP\c 0p&ak!*dBt!2Q $bKlV340Br9 !,8`5"@MD&on 2jSѹÀL'srR/!@`VLdP"e%UH@kbռ ")Q |2!TJ B&r\z,8j>pW^|ckt"3X 9*^?:rr# ZDžMmb`CyB^Iydr(a5]# yu D|XB k$T%AGBˆAj,rQkDpjR$ 6"G8*oԟG Pp p|<*VHMXr@WD@y0Rω8D0M".҅XǺrִb yXZVT!}fC:*d[HIOֹꢮ{)F3Z# kBV҃ԛ_R( -*d$ B'*( %rX"I85"֐B %mcrWH!UإD˄$8"4r=>w ,.k k'[\mN79[U!/XMD+Hu"DR}CH0Eӆd9QC$h/C/@ SH̐FFpr08!J&$ vJ'#d,pNމ,BP|;x5(Wʈ,g=}雐U#jnZlBO5ڐ!Pn+Z,T}==Hq%zfM9GwJs Gdp!3ȠZ$ғ4u8SHQCDUL0Ma:b5ONp:e `kXj,eҦ"P1*|ū0|m8qP b`*=Q*O05|nwJȽs *=$ C Gzj A7WhqnS[QF[C_k3W vf91Nt38;!jF^dҢj<!BM_i 1o[ pc ,DJPPu\%"K`` \]2}1F#L hCuL^׉q Z6!*!e\A>`5XH"al#P!Oc^&@!#B% 1>YB C$Qʵ mFI5S-O"7# 8 3uAW 7؁"8$X&x(*,؂.0284X6x8:<؃>@B FhCEQG Iz~ eqA o{X\]`ce۱e3!$/a=!Cglװvd\y| hdA,A>z8(JL&WYF$Cbh@U !%cW6Q%@bDh.# `#;Ҍ A` 1( (")a8-2-GBU*8t(*̰a1+.Eq..a++.Ƣ@2P ɑӨ"-g@2 &)%y+y+-Yr* +ְ뷎Ҏ'9&7r-ٲ-chq11s 5%5.3,۲*i> A 3?#NUzow]xs>47)Cq.$ه a[3y4{y'hg731rt`I772m)32yD_Uc 265g]T a3ds\9 bp:C:l䘩:1<;֙; 9p5"p@E"4taHPנ =y#㞶y=nj)ɓI ZqٙÜ* c)7> EAzrtZ aZD5C!C4.Da9Ą z^7DNjERQTڦCzCGz"\>omEra4F@II'* U)Ʉd0zJ 2)KY؄tX q TJ1gJy zM$JW$ zLz :^ 1$يLjL*K^tt2ױO 9y(PP AzP+3J5K 6%L|U;SRk a zcJXal1z{QJ * uP kA#Ů0.`z]ݴWU[אYB[XteVhoEnՠ B5K%ZSdRkG # u% reXgK Eyk\` 1X*gT9P RKV]ŕ˱ q][[>l"̅\7K^\q@!^k ,۷6t Z:yUKmq Ig`bFa aa!1 e#Ab`pDր0k.vKMo.!6e86:KxJJ [{  ƾ Q ѠfzL0e{jsĹN1jhgFggB@E+h jkfỌ!T: ;) *ƾ[åWvčܼ LOP@\ĄouZM: tjLjA˽7 rr6qc F ɟ  ` ¼(o1r o|Sܸ1ܾC8W`^p ]}؝ڽ=]}(@ }]`R1{QjцT'PD Ao[aLQ@k] .q((Ⓢd\YXҍ>"lE"HB:CH ዎ)ᔌ8/Nb*DAr0pvP # +[ WY./ R 8 93^ `7d雗W/03V qEU`嬙6M) a  @xǹ9?@s;;ΝQ8 r t钮 i?5B[樣MpJTHZKC^LDTza?zunDFQda qL} NՎzIA Jq,Q R! Z 1t>*bS`eųl-0  3>>x6!?$װZuXlŸjV1B7i+` "Dc[[%('zb\ۺ奫a oEhoZbj8ܯ{0ʙa[F<J!CֿJdd !Nfv F h/h| Aֺ %b6o iǑiVƏLVkQ amh^qaϘۼΤg ʀ)[ΰoQ@ u5eӮ)#נUZ}Tc,ٞB*r<SL5męSN=}T&Ɗ?D᫨#0+jKSI4I"b)bC fAV>*U"A BK+AE+*8(ك9Vbƍ?`%F*\`$̚9K. NjrA`dL BHڴA?:Pf@96AYB!Tp$ %ِ'&DGThbDul B3EPHn^25֨@qD^!l5>4@}P͢1mLW4]JCrz DiIYR;@feDQ'HSzT* WPT \B5X` `ЫfJ8+ѐ7f7& @PI@NS2: ^Bה9zaoy0׼R]'9W S\@38L}|'U{/ ^˰8F^7 \ O^ČO9Ƹ@X'RKHPB hu z=zg}@0%@'|&ݮeP!| >Qr 3e--Pݣ$5e2*Ų׈%sMk:eAF"%WJO5EAw -[@4?5g[5$5!p=hAEIRj ,1CXhɔ@24s`zy.@zu@h08ԇ.r-nTָ  !]og? t;!\ -Lt !qXkL vHVc#$wB (1 p /bE\J6V".GoH60(:"2.HȠC)5 @\m @Tŕ(22 XE)&`0J iA r+ҩ=H&S"ė)^GTb׈@&pD0v'BQ"mҵFa/A1^^F+B~GsE/KS#qkBs'錂d<|@ Ћ< nD̀T'}@PJCTժ&\Dp ]rÁ1$F5I kvP/Ncfbh^MGnZ*@R0j5^G"f![VYEgθH uJWׁ8U#1D k`R C@'{&w aUPz#q.BV xkKnqV9uo}\"Kx [OsZԕu5һ  _nsle[!#F NH یd %H0AE!N s4eW<@Fτ& 5@Ɗ5K2pQ<-rU<~v @DSPT! )F8U*= e zA:d~eLK* w!6pK@/}z:H]n .v GBRi4˂8!Q@B e f@Q4h @Z@Ka#8~ u1+YC{>e@@WzO I\c & 3e:a354v =լ9p X4" g>rak0I\hX XS1e("A ~@/ ;xT8Ssf%Ź#&Pzd"g#gYyB8R -w#aӇ]5M:aaR@(b}s ְ ȼt.c I>@>PM0 " bX*;{BPhk ,zx)^W_`U2##; _crygK3ik*2.ʟ TFa#@qhN;mb㉙ $R;LRڃG/Η\ UÉb;_,yRP@\@8a *p,H=Pf] b<""0  TL!~_%UH x H.aztQde"SP[~Ew&!m "~@ SM7bP* a5#7#BkzaaL;&FP F_p(*NoÆn@1}B^&6 hzq%"{ck؆5A y8?.i'pUnx4fGv 8Xx((bl sx8YRAW~، xؘڸ؍8Xx蘎긎؎8Xx؏9Y مal1䁉 VQ9z(!a+v6irX$Egpv)4y"iag'W=`$@)򸓂yN,)EJi>٥]67ƔEb% Q`liP=N8R!p2\dylGq6#| `I7^%R" !h(0̰h+&,BP y)ɚ!-je#6" 2`CbRX +N@+y)IW b &//Bȩ--.<8~7,ԌQ3H165<9*esBqR7I#70Q6kc5!Y7Ж-2ZGAi$~T5;c38=P3i3&Q2's )w1S>*7Q7Ր xrՠ7D6"3'Ez?!B4pG gtOee3<#>$k;cb(@M( @moc;M OY zdP3KjjS+]UZu.aGg{;X%`&C* $ʕmU[ ? :!E;jz^*pE$]U]KE أ\q\6S`f^ӥRG&2X8pQ*@? G\V!1+jdB"s3hq;K8c;+y-v +O"iamv% J0*Jڭ[jҐmk!8* \F +Lѷ ,Žkkqû[J@* {{,}+;lFAAQ Яֵ3,ċhji `{,۽r#WrGt_ ͓!| ~<*k5sq]tLr=|='p!Z&rRkM|10rDq'wAqqZ0*K\* p|?W֛0*Ӏ ְ(wB&z1zxS'D4zQ3 ތ4ޜ Hy{-{O<*||byx‚/j \ lY AxxΠx,P3#!}C}{Gxvϻ7[l8͐vx+װ>ҁу8Zw@dP*Ӏ , ba+'Ұ}0_xF'S'M~^)J.q'(* q (%UIP.(z1Zڴ?0U~h>p p-ؗ5A%Q6LA{,1kby <g'܊1-R=a R%m7z]-$ j U݇qݾ=W`^!mӱ=]}>^~Ώ(@ ػ M? xq'F@3An[' t0ڎ*mGm>Yh-n+9vy|e?W=޵JtAފr8Q%h6Ò_(.vP Lakev (8p9I)5NT]1yL8V& X/Y艮TĠkא8WY >*@p1)腾1`Y\~%yNn!' "@~^0,.t6+ɹQr~A WIq[a PPuNr6톾c[I#yy9|G>iX " VﶈSf,tr^D~ ?Z $愴( k*(e Hc ne< ?qM@OabOl[EQD-J5КiהuQHA]qeB*t4jp] З28,lOÂB3x`T%R-HTխXʐkXdzeٳXӲ\uGT4I@Xa^|@hڸl)Jh1K2ZSm\n-4۩j5زVV}[]@F|x*b+D٤`!tC)lm%:o#_ps+oVX0@?3"l[н0B 'kl8 1$ɵt0DG$D%17OdE_1FgFo1GwG2H!$H#D2I%dI'2J)J+2K-K/D=0$SKD5xS6-z3QK{<'39y;<>#:De2?KB\sKـuX^O5&a=d|EዛT95td}]6╫SdJbwf%չ`)g#8ރϳӬwMg.vhmzEl~YX[?WhƱ͌QY?<5㌡9n1V9a&of fL1vr0-8\mߖYsK5v?enwQw}=xϐx !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWvH*\ȰÇ#JH -2*jȱǏ CIa%Sxڡ0cd ̔5s椸 ϟ>U l4? ؀Ę2MD-h׮)t VIscٛ \vۈ:(g$o߷ ΅+a&:lxZg-0P2TT XAQ [P6]m ! Bלuҧc~PDѵjԑR|]ht 4tikԕAUU~X(_v[RCv~։-XN/4\Wq4 HAd%NYsdA$ddP$a  5(GR$C d~9%FJ} VX ΅`1q]~=&M&$5ysnV\d$B5@q\\ &9AX11Db5q%U 0 % 7cp].kVMwp^`W t1AB<,,e= fX 4"a-#EVS܅sV;g3A($[\T˥ZYYnM,f}yּnr -(vP5PcFwYYS(d%@hC" Ax!M.P͈Y" I55ʮ?aP^+L@)'M  @ƖYs=jg[N E1 p'w)f&`Y^V*s @ ! @H/ƹ ,=?(Ȋ rd " 25@ B"8(-Z]JûAE6iD7pnl:9@ -@}ྲPBu;QBG [ܥwd! kQ rvfq(4$ Yb1餏ĨrG0)̓JWEz֓,.¶ n:iM=}@V Y"4q6e$| !y,ȒQ=Cef:#NS ;A]5T[NxeiA, %a:F\H&4ŪQLQe `|Vpb 9 5BQ|/o) 2k`I PpdEVW="w$ g٨[ I?+uI1 Ǭg Yk 'W+vuof @k". A\=h`#HrK̕i@79P$MҐSHU G #$KքBh6IEJY5,3vFu.vO+ ٬DHS8]3Ѣ@S 2@6 l3t9UۮtR9k&J,R i !C„iS (f֠x7%A*VȗWznU4Ya跊c^N!c 9pϡY""mG$V1Ƹ/Wu5aQIʻf4x 0# J `3+ŃX51G-Jj.]cu4HݔPa eϭf (<D" fX'+@4 5>(yY2,=XWqA@d˘f%v)Ъ@Y@F;BcUvfU0\ ((5q"ht٪Y;[~C]&YPk,Y8a~ }D Jc_Z BvMTC@$ıu [I`_ );=%3Ψp h800'( q\U칗*׸ Xe:Lw ,W-;d*g`M> 兼XTG0J0B6R$L,y"O| #DM~_;Џ>-KϾ%|wO~OOϿ8Xx ؀8XXV'q ]c}"#ԧ=! >aH*P?AtY@@ x8A!a/'aeP1mRx1qG!! H0BXIqVAQבQC Z1!1%wgGcd="$X A$]7eb^XX!2YvCa"װ""<50 R#pt(FR]x+,tN2 P `)@i+,*B)LBwWP >4,7*Ҡ*(wP i&8Pbb:gxTc! R`'pbx']1b'r #rwdx%8MvWM6+fBhn8I!cSx>VF'?2_5FbG@D@Bܹat mJHPTby ,PII [1Kgp[is##d8bFdmrFٙ?0& #@YGi)W,bx~ EnFOG!4#%!PFWT5awv0HZKJ5Q9VGht iF*UraMؤ3t Do#Oe~%.Wh~XU֤Q7QpWUu~F5$i S9Ge:O" Y l!nR+esza&SrQS7S/rk|\}[ K"m\-$UdnV(pF Zz@!gz o]fҪAt2u EmI2*5u E2s1uyZWPb6&~;a2פcx {Yz֓r H-aP9zI^^-Ky@_>p%8am 66 iih!Pv  wa6b wUj,#Mµ񵆶+@ oBL[®Ye]v%ceF2ݖSf{7[S; pGo`ooL+w1 pqoXz2 vHm8@  PTv;29l%Ñ,-v=mRma5oE( @9w|Yv0v׀G(]U;ZQ6vмYp>蝇!s;'6s΂D%@ 3tat(ttt vj YXk{}vA*HQ{5IV ߴ ?0xAcK#yD]fdĆ}N&[נoykk[bVpz\ aDl܁!?)kȒ<q2 Ŕɜɞɠʢ<ʤ\ʦ|ʨʪʬʮʰ˲<˴\˶|w˺L!˿Loa̻0yڽ-ۤ*2T3Ls9:c—%5$Cb>P@1} p:q-J5<!"`I΍cCspB< Q9pޚ> ަՠ|j#1J&1QOsNB a팑!@8<AYFjg-LT.~^5\*ឫ9 nSe1]!MRwVJMT]nм10mu Q9z %3?S/4o rC}61!7B j_m\6NZYQZqFI 7װ(~tZ?guנ_l' qI@BFqFT. PUw3F+?zx{i* lnfX.cc珏buTeg&?a/}90v9Y rI` kh@0@j$Z4+0 Ft4]qbE3v0H!tڵ0?^ Q5e (GZ Jꚥ)ZĨ1U.8QkbEVZk{!Z9śWaJ:s֐9pmY ^  `}Fs QL+x YAkB} X0BLx:k*wN=.(Z鍰X0e-y.@E u4bF}M5kצӯ؄dş_?lh& fPb?\HYz#% iRLB2L9(|aQR0kD꣬P11*0!Y,Ej| DŽ1[ToAa# cE2!2aGN@7+s*D( x-"@HkDPPю%>KRLoS0"Ϊ Lc5O[oEp!\wMkϻMp9a"X^6ZiZ|WlJjreo-hle]wߵv[xݔw-a.s×E}8`&y'/L a68b'b/8c7c?9dG&dOF9eWfe_9fgfo9gwg:h&z`hТfQ jiR iE #@`U1֤Gb {쩇fT s !Ƙ9[پF%h㕂{/p%\|萂X8&n;F@kCt)҂ aVP_ʁn*h,P%h:!"*(JhǬ;Ù ĎjP{Fb!k_C6RA줱wA56;TQ}vA$ט S,N\1HH^MO5QBXlD)\aAZ=m1LEx_oh G@DFvܰ 9!B(!ƈF 0C$)x %$F">ZlZ(# D:8Da. oǂR/=I Т '"d$ڡBP@%d#8*">0A aBI1A!H wR\nt S1M#rRA"tf~XP[)MPsS);ʘl<'BQ"*G,P D 't#A jJ\C (΍1B ЇB$DXvRYz#A5* DPXnLkz[H!$'B$1SBD U:Iz Uv(YAFG T@n^CgE.V8^|)KɧQ! "M )[BFJjՓbUgތTґ NkI, dvy*5ER%!aLTTmgc":edc5@$bHcB`r"dEr i%E 5@ IBAd -(P$@d2HmU9]i|hoSܰN*+K2%)!r])MfTH[Z7$(1 Ib-.E'l s m!XXcߓf@96AYB!Tp$ %ِ'&DGThbDul B3EPHn^25֨@qD^!l5>4@}P͢1mLW4]JCrz DiIYR;@feDQ'HSzT* WPT \B5X` `ЫfJ8+ѐ7f7& @PI@NS2: ^Bה9zaoy0׼R]'9W S\@38L}|'U{/ ^˰8F^7 \ O^ČO9Ƹ@X'RKHPB hu z=zg}@0%@'|&ݮeP!| >Qr 3e--Pݣ$5e2*Ų׈%sMk:eAF"%WJO5EAw -[@4?5g[5$5!p=hAEIRj ,1CXhɔ@24s`zy.@zu@h08ԇ.r-nTָ  !]og? t;!\ -Lt !qXkL vHVc#$wB (1 p /bE\J6V".GoH60(:"2.HȠC)5 @\m @Tŕ(22 XE)&`0J iA r+ҩ=H&S"ė)^GTb׈@&pD0v'BQ"mҵFa/A1^^F+B~GsE/KS#qkBs'錂d<|@ Ћ< nD̀T'}@PJCTժ&\Dp ]rÁ1$F5I kvP/Ncfbh^MGnZ*@R0j5^G"f![VYEgθH uJWׁ8U#1D k`R C@'{&w aUPz#q.BV xkKnqV9uo}\"Kx [OsZԕu5һ  _nsle[!#F NH یd %H0AE!N s4eW<@Fτ& 5@Ɗ5K2pQ<-rU<~v @DSPT! )F8U*= e zA:d~eLK* w!6pK@/}z:H]n .v GBRi4˂8!Q@B e f@Q4h @Z@Ka#8~ u1+YC{>e@@WzO I\c & 3e:a354v =լ9p X4" g>rak0I\hX XS1e("A ~@/ ;xT8Ssf%Ź#&Pzd"g#gYyB8R -w#aӇ]5M:aaR@(b}s ְ ȼt.c I>@>PM0 " bX*;{BPhk ,zx)^W_`U2##; _crygK3ik*2.ʟ TFa#@qhN;mb㉙ $R;LRڃG/Η\ UÉb;_,yRP@\@8a *p,H=Pf] b<""0  TL!~_%UH x H.aztQde"SP[~Ew&!m "~@ SM7bP* a5#7#BkzaaL;&FP F_p(*NoÆn@1}B^&6 hzq%"{ck؆5A y8?.i'pUnx4fGv 8Xx((bl sx8YRAW~، xؘڸ؍8Xx蘎긎؎8Xx؏9Y مal1䁉 VQ9z(!a+v6irX$Egpv)4y"iag'W=`$@)򸓂yN,)EJi>٥]67ƔEb% Q`liP=N8R!p2\dylGq6#| `I7^%R" !h(0̰h+&,BP y)ɚ!-je#6" 2`CbRX +N@+y)IW b &//Bȩ--.<8~7,ԌQ3H165<9*esBqR7I#70Q6kc5!Y7Ж-2ZGAi$~T5;c38=P3i3&Q2's )w1S>*7Q7Ր xrՠ7D6"3'Ez?!B4pG gtOee3<#>$k;cb(@M( @moc;M OY zdP3KjjS+]UZu.aGg{;X%`&C* $ʕmU[ ? :!E;jz^*pE$]U]KE أ\q\6S`f^ӥRG&2X8pQ*@? G\V!1+jdB"s3hq;K8c;+y-v +O"iamv% J0*Jڭ[jҐmk!8* \F +Lѷ ,Žkkqû[J@* {{,}+;lFAAQ Яֵ3,ċhji `{,۽r#WrGt_ ͓!| ~<*k5sq]tLr=|='p!Z&rRkM|10rDq'wAqqZ0*K\* p|?W֛0*Ӏ ְ(wB&z1zxS'D4zQ3 ތ4ޜ Hy{-{O<*||byx‚/j \ lY AxxΠx,P3#!}C}{Gxvϻ7[l8͐vx+װ>ҁу8Zw@dP*Ӏ , ba+'Ұ}0_xF'S'M~^)J.q'(* q (%UIP.(z1Zڴ?0U~h>p p-ؗ5A%Q6LA{,1kby <g'܊1-R=a R%m7z]-$ j U݇qݾ=W`^!mӱ=]}>^~Ώ(@ ػ M? xq'F@3An[' t0ڎ*mGm>Yh-n+9vy|e?W=޵JtAފr8Q%h6Ò_(.vP Lakev (8p9I)5NT]1yL8V& X/Y艮TĠkא8WY >*@p1)腾1`Y\~%yNn!' "@~^0,.t6+ɹQr~A WIq[a PPuNr6톾c[I#yy9|G>iX " VﶈSf,tr^D~ ?Z $愴( k*(e Hc ne< ?qM@OabOl[EQD-J5КiהuQHA]qeB*t4jp] З28,lOÂB3x`T%R-HTխXʐkXdzeٳXӲ\uGT4I@Xa^|@hڸl)Jh1K2ZSm\n-4۩j5زVV}[]@F|x*b+D٤`!tC)lm%:o#_ps+oVX0@?3"l[н0B 'kl8 1$ɵt0DG$D%17OdE_1FgFo1GwG2H!$H#D2I%dI'2J)J+2K-K/D=0$SKD5xS6-z3QK{<'39y;<>#:De2?KB\sKـuX^O5&a=d|EዛT95td}]6╫SdJbwf%չ`)g#8ރϳӬwMg.vhmzEl~YX[?WhƱ͌QY?<5㌡9n1V9a&of fL1vr0-8\mߖYsK5v?enwQw}=xϐx !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWvH*\ȰÇ#JH -2*jȱǏ CIa%Sxڡ0cd ̔5s椸 ϟ>U l4? ؀Ę2MD-h׮)t VIscٛ \vۈ:(g$o߷ ΅+a&:lxZg-0P2TT XAQ [P6]m ! Bלuҧc~PDѵjԑR|]ht 4tikԕAUU~X(_v[RCv~։-XN/4\Wq4 HAd%NYsdA$ddP$a  5(GR$C d~9%FJ} VX ΅`1q]~=&M&$5ysnV\d$B5@q\\ &9AX11Db5q%U 0 % 7cp].kVMwp^`W t1AB<,,e= fX 4"a-#EVS܅sV;g3A($[\T˥ZYYnM,f}yּnr -(vP5PcFwYYS(d%@hC" Ax!M.P͈Y" I55ʮ?aP^+L@)'M  @ƖYs=jg[N E1 p'w)f&`Y^V*s @ ! @H/ƹ ,=?(Ȋ rd " 25@ B"8(-Z]JûAE6iD7pnl:9@ -@}ྲPBu;QBG [ܥwd! kQ rvfq(4$ Yb1餏ĨrG0)̓JWEz֓,.¶ n:iM=}@V Y"4q6e$| !y,ȒQ=Cef:#NS ;A]5T[NxeiA, %a:F\H&4ŪQLQe `|Vpb 9 5BQ|/o) 2k`I PpdEVW="w$ g٨[ I?+uI1 Ǭg Yk 'W+vuof @k". A\=h`#HrK̕i@79P$MҐSHU G #$KքBh6IEJY5,3vFu.vO+ ٬DHS8]3Ѣ@S 2@6 l3t9UۮtR9k&J,R i !C„iS (f֠x7%A*VȗWznU4Ya跊c^N!c 9pϡY""mG$V1Ƹ/Wu5aQIʻf4x 0# J `3+ŃX51G-Jj.]cu4HݔPa eϭf (<D" fX'+@4 5>(yY2,=XWqA@d˘f%v)Ъ@Y@F;BcUvfU0\ ((5q"ht٪Y;[~C]&YPk,Y8a~ }D Jc_Z BvMTC@$ıu [I`_ );=%3Ψp h800'( q\U칗*׸ Xe:Lw ,W-;d*g`M> 兼XTG0J0B6R$L,y"O| #DM~_;Џ>-KϾ%|wO~OOϿ8Xx ؀8XXV'q ]c}"#ԧ=! >aH*P?AtY@@ x8A!a/'aeP1mRx1qG!! H0BXIqVAQבQC Z1!1%wgGcd="$X A$]7eb^XX!2YvCa"װ""<50 R#pt(FR]x+,tN2 P `)@i+,*B)LBwWP >4,7*Ҡ*(wP i&8Pbb:gxTc! R`'pbx']1b'r #rwdx%8MvWM6+fBhn8I!cSx>VF'?2_5FbG@D@Bܹat mJHPTby ,PII [1Kgp[is##d8bFdmrFٙ?0& #@YGi)W,bx~ EnFOG!4#%!PFWT5awv0HZKJ5Q9VGht iF*UraMؤ3t Do#Oe~%.Wh~XU֤Q7QpWUu~F5$i S9Ge:O" Y l!nR+esza&SrQS7S/rk|\}[ K"m\-$UdnV(pF Zz@!gz o]fҪAt2u EmI2*5u E2s1uyZWPb6&~;a2פcx {Yz֓r H-aP9zI^^-Ky@_>p%8am 66 iih!Pv  wa6b wUj,#Mµ񵆶+@ oBL[®Ye]v%ceF2ݖSf{7[S; pGo`ooL+w1 pqoXz2 vHm8@  PTv;29l%Ñ,-v=mRma5oE( @9w|Yv0v׀G(]U;ZQ6vмYp>蝇!s;'6s΂D%@ 3tat(ttt vj YXk{}vA*HQ{5IV ߴ ?0xAcK#yD]fdĆ}N&[נoykk[bVpz\ aDl܁!?)kȒ<q2 Ŕɜɞɠʢ<ʤ\ʦ|ʨʪʬʮʰ˲<˴\˶|w˺L!˿Loa̻0yڽ-ۤ*2T3Ls9:c—%5$Cb>P@1} p:q-J5<!"`I΍cCspB< Q9pޚ> ަՠ|j#1J&1QOsNB a팑!@8<AYFjg-LT.~^5\*ឫ9 nSe1]!MRwVJMT]nм10mu Q9z %3?S/4o rC}61!7B j_m\6NZYQZqFI 7װ(~tZ?guנ_l' qI@BFqFT. PUw3F+?zx{i* lnfX.cc珏buTeg&?a/}90v9Y rI` kh@0@j$Z4+0 Ft4]qbE3v0H!tڵ0?^ Q5e (GZ Jꚥ)ZĨ1U.8QkbEVZk{!Z9śWaJ:s֐9pmY ^  `}Fs QL+x YAkB} X0BLx:k*wN=.(Z鍰X0e-y.@E u4bF}M5kצӯ؄dş_?lh& fPb?\HYz#% iRLB2L9(|aQR0kD꣬P11*0!Y,Ej| DŽ1[ToAa# cE2!2aGN@7+s*D( x-"@HkDPPю%>KRLoS0"Ϊ Lc5O[oEp!\wMkϻMp9a"X^6ZiZ|WlJjreo-hle]wߵv[xݔw-a.s×E}8`&y'/L a68b'b/8c7c?9dG&dOF9eWfe_9fgfo9gwg:h&z`hТfQ jiR iE #@`U1֤Gb {쩇fT s !Ƙ9[پF%h㕂{/p%\|萂X8&n;F@kCt)҂ aVP_ʁn*h,P%h:!"*(JhǬ;Ù ĎjP{Fb!k_C6RA줱wA56;TQ}vA$ט S,N\1HH^MO5QBXlD)\aAZ=m1LEx_oh G@DFvܰ 9!B(!ƈF 0C$)x %$F">ZlZ(# D:8Da. oǂR/=I Т '"d$ڡBP@%d#8*">0A aBI1A!H wR\nt S1M#rRA"tf~XP[)MPsS);ʘl<'BQ"*G,P D 't#A jJ\C (΍1B ЇB$DXvRYz#A5* DPXnLkz[H!$'B$1SBD U:Iz Uv(YAFG T@n^CgE.V8^|)KɧQ! "M )[BFJjՓbUgތTґ NkI, dvy*5ER%!aLTTmgc":edc5@$bHcB`r"dEr i%E 5@ IBAd -(P$@d2HmU9]i|hoSܰN*+K2%)!r])MfTH[Z7$(1 Ib-.E'l s m!XXcߓHG.d(f>z`;9ƖbaPPot5"01uYٙP1إH3ʤWsS/x?(`B<P$D0p r ܆1 Apa5 Sq7*Daq!H4 rR--"F (D~,GJA" KaENd!AQF0eW饀Vb\S`*-cipR (iAȹHyKA]0hA@#4I~2رA$d9&r 4 v3b3,wHFn~)+BE0%JM/$rPTr(t,yay5e@@(K -550>f "pK-yprTdDtd} L,2(C|QV\봹*y2njԫ4Y3,9܇ q2r4{mAEL{HoIv$Z# 5m^nM_cH3Dv4i   A@ =.0Q1%sm=b]UEhƻ ,g^ 9 T<1Ay@` 1A`@ Bz״rN?5` <D~| V7s@j,W5uF#=xX( FeD G^BX!?ߛ0 ({(!A8H(Ti,sqoc7G7g`938!0I iՌ(!p.@v".H@h 1JĖ S$5`Jk#&vxx T@ ̂@ D8Іtq S''CR#UC % 7†\$1X8{ U>8JWLu}l5FEH c қ@~ DeB4"KZHЊbb\ S!2 AXk(kLu h 3[)%`p48\D, 0_-@;;"p j$5d(ESb(-8k|k,e y du>:00/Ăbqז̓L I@pj,XViXG.DJAbAD 4bH q}ɟAEPa*s D@0E<84kH S(`GPM`GU‰X/1S`@d5r<iF cBT6?Ȧ2Ye)5' : %XyjH8iDb:' թ !H3RQ ^Oo"/(C# #hx6pZgtHJאXkcFU :DCg!;)n3L@@M!2$6K[qGTd@5*RUFy%J ~AъKaB4(ay2AN VT^H`PRJ@B9-jR 5AD7ڪxMW͓-A*Šרu/q5# @Ql[iV¡ؒI7B8 "xiG5C8?KD8 xBx ̊[qsApڻ! )'n6 1]' |-G`2h#p{g-ܖSS3!ڡs .0asӳ0q&%y(y3*?kQH;"S $ʄ.뢖'+ ;BNdt=e] ln\%R6l ۷9)  Wv@yu8 -\0,8H*g@|u)or&F&>`-؏҅ B *DM |{p¸1Ag(O?K+o`p,8M$!$.!2(#b7e@Lr3eB+>qrsp8ctu7'ZX|A$~2|00fFGDPe[l","`}cw24N8&Txo,x"!J`s~WPgȗ.zIJ$8"; 9" R rUEʄ_# !lpoW3- @!}de"A)u#x?Xw0Xfb17tvT= ,m7܇0W`ϰx#%Xa e? @ x J(L@ 70 03 ƸP c1*Fux8Xx؏9Yy ِ#b9Yyّ "9$Y&y(*,ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yyy蕘٘l?T!Ii钑ņٙIٔ9ɑ&ٚaə5O9i鑽9y霢yؙ#9#9ə f2 )ᙞ -ɞ29i)ٟz I:"): )(¡ 9ɉ* Zڙi)j3Z z85jJ}NكM?@K(ܣAGFR.ٝ- iݞJL8~ր|eJ]r~\o>znuNKZ{~ .Nnz>^^阞难>^~ꨞꪾp^^}~.ǹĞllvyRW8iОl]K8ȷ`ۼUSB>*,#=劯ؼNM⭍oTA=̧ѱb)k0}ܥ<"?s<) ~|m4__ O녍?/knV_x o]oP]׹}fB=moCM|vx (m}܊sOswO_{nۘ3n0nnܰ/C࡟ ݮ#dK񑜞J4u 2I+k0?_?_@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwG2H!$H#D2I%dI'2J)J+2K-K/3L1$L3D3M5dM7߄3N9礳N;3O=O?4PA%PCE4QEeQG4RI'RK/4SM7SO?5TQG%TSOE5UUWeUW_5VYgV[o5W]wW_6Xa%XcE6YeeYg6ZiZk6[m[o7\q%\sE7]ue]w߅7^y祷^{7_}_8`&`F8afa8b'b/8c7c?9dG&dOF9eWfe_9fgfo9gwg:h&hF:ifi:jj:kk;l&lF;mfm߆;n离n;ooRd}D;jEIxA 53"s*5Y%VgtނE_Ŗs$h5X׎t6"s lWս.GV5!AUK,\xרƅ@,u.DX&LB$C.|X׀Q6\`8q6?62赼be4 ,K hlx!0lD\;9s06*>P+a BB>d"F ɀ +_v3AB W B B V:@N5KZ4=9%@ @bDim`;ȽM d`$b} Xx aB;'d.Ep i0j掝B (@0qjDHůq̺֚"  Ѩ\9< 5 #bUL#sDriH/4GҒ׽~ ! bίa ]霛9g5T!<,4ȜqP W:0(et80͞ rz "WnmQ;Tc/[h_z斍]3(A,Ό dN! [!7=wϽ1ѓ6 kȦ >j΃;&(?8j@›?u?kpQȽj==#ظCc#Xj/d=DC$;:x,<=@ $ЅڒK( ;J6h,()h+Ҝ/:V\Bȅk=p5rB+k8DkpsDKĄ`? .N̜j(t? $`-4.$kc7`pg $N ᄁ0hNDP$8T̜LL0H/ADXO 8?@ATjYXD>H̉S̜KƂ/P#[b̹"ot[hkĂLEC[GqBj`}lA=8d\fg$HH0(ȄkHc@hɁXk0GYh<%KV@J8L8rܸ k0(Q(ӃՁU(qMӯN\*ITf|F諼kH$rs0Ѓ3υRl`؎WUH@XZeΉTp5CRno%W4דGSЁQA6%iCp;JNz]Y"-9h=JS$ӟ8cYU؁0k?[\=}U0iZÌׁϛլ:ZC5Y Ɓ)k8D͡D8k̩=TM/:4eh[jOI%EݻY΁Rȝ\ͩ|VxV8[kdؽ?Ӄ@WLq}=EWu5vJOK[]ʵ\B ) d׽=]V:'J[ 7iقY݁_)_=_IxgxH#83nޜb5aYr&[K(KRҒ--J kЄGZK-u֜bp"Sg_?[_ #XZJ^_=SBAEkRhD?~0]^'UR#ܞijڕ.Vk@PV0sH%q./ԉP&36$NBc3ٗ͜e+{<B9*1PԁH^i@&RuREvkxcU. EQ5'*@}rl8TWuR5;Ȝ g,Qk胩uqk:iXw{d6h^ 'e!٦xy#qCWv x\HJ[x/.'irր>eBww w bEp9'PDf7n5(yه@P^oo'uxH^#N -0 ̤eOա@b@ELLr;+'wBH0GF[nuaU{njᬆ(9os+Ha I#(% HYrvva! c U.| sC$ph;!oC5e"(B1S"x.,rQ#s-1:/d<#̈F&H'HNk骈=ώ|"aP< Ejď$ +>ϑd%/I!*r'Pq`/<M Kr]-\/Y` s,&w+s2l3ahp459lj3f2Nl~s,9u)t,:ߙCwʓ6vse?MGπ&2@*Pl+ JtE-8Čz&F?BC I9Ҍ$KӘ4ͣMojϙ9y TtEQT.ME h R1TchbP#bUeȝъk5i]+R|p=a ;'XbMDoO:0f[BF0xcBvhC$Q#K'(BZG! b&ժVm̘n2 0<,gB  XZDplJ'?Npk4JSOv`(NF lL.`!]ԢH`NPQPeȈFtϸbj 5 s'P w+!D!:k܂)Ro!\&t͈GϏN3N=d'zHuJ@ zRZWI`tqcIq#kc;12AlHdD!]N-w)V2NZg\< n8Ksd1;Pøv•P*kM9sy u'cpӋ1 CHhTFrOFNRs3/N PtԘ3x-.z J> gxY gCҮ#^6# P -Eʶm5sn,אeԢ޵`A (JBC?^ 0߽흌Iv$1A#F m^*<<jVt3GO݅ІW4%e=pz'~uDbZcFgi.GR=  Q#rCZo˽^Du`"QGԫQ?CPp06Dp_p "-M抔;çČ|3xbR5CCv54J -A \aYɒ "]>2'+lse6'3O3Yԅ"K$IZGC`bABwFb7Ut,j/ 1! \$L{l~tUʲV2Gw/K.KuF2A Me5 ʱD=JT\@i$( F G ysD3D. 6a*xe``63oNtFQ &Rjp>Yl?*c6F0uC8F=#9RD5 ln#n]dA DE(LJayC"]EX:JP5\Ԁw7R3` KW7]l%DLRnC ADolxDz0702IWQ Y lsNXa* ތW50sBD{[8DLqAL)˧Dz_J.D<@py‰h&ŝ(E tބ_/WKI+K4D/d&(Ĩ:RD9TTU`|Kw{C?L '2:)@ kTB׮zA.X- A'ӮZZ4+0!j׎\2L7BԹ5nPۙk8 Qנ= he,k ,gѦUKpikxPKP:ޗ-,0e[-4 ;լqU敡n*xymZn2M9AT[욵S!QB@׆-D1d,E d4b/0 7pXFֆvDe$)i~bHPJk~a EtO\ji~0LD ! S,$P൏ue'ajRh30RNY%ϞR%ӝDQ Lԛjr Z\!6 0Yw\q@R<ǹ|r @ !t KZWXP 1qnW;;"'"A 2kxD𚧐1y̓ H<":&atEy $c ָ r%uw o(Np UbX!C 0 PrAH o0AC ~l&N 1!A^H?EA~ᬤI єΓ)yđDaq"TR {@hN&J^ lc+I!r D&JQT!ɂ@;ad9c)TȬKfv_<:@g1ex_RʃHmy<yćMN]SYAp@ 4Ms!7g5qb4LJWk.hh`7@Ӛz Ԝj$eSKSz{f=AF.QMk kNaNyU` bW(`fѯtMT7t7-ѯ& Q!^LS)UȧH.D4&2LTSYBi%¸d1f&d/xσ85V{"6PL`@m1,bcRmmB:VRv p#za"\%ALDO8JөP!(Lت8ֈ xrDq50CAqʬrk̵":˿Lev Ѓ3 y b Es%*Fu4w_^Lvs(b ]1 /; 5k\ enһ^w 0t/lIQx(ɔ!IU*F0&$+A %A*9qS&>YfLgdh\И<3uv׫@BwY#oЂ#P%PSpԤ<5 deM3b =8o`t,*9 5T 5"P[=m``MPa|yQo{,u5!f5 Z@)Sğoc#;!ﲵ mz!- A3ȶD|X&[bJk961ra_Z#M0 e)_Ȃ'I6_@Ê " $J lLjdi9p@fy^1H2ƄABÇt"dku[.)9j.ci 26~;B{-C+]L(yB^iE,l+^Jg5h*,plXM5eOp ?\ֈ=>lw;q 2v!}l?$ $8Dꪟ/)xؼ cm@0*`0C [ Vw {V}ח2:g{QqTcta q?L +D 1](Z?\7v s 3`+/Gr %(AX Ba PwyxA0?Cx TVeLaх!AtY@ m47. 1H3 <E#v1}s _ 0ml8("@ s @LvPN 1x2.F`~~f<Јy'w׀zx 5 qKV`8nxEXlxܘsU!1pEǂA [d 6삃fDH0"foKx %9qK7{wE "I&P5)7 ёii^(^(I@{C Yx yt RT{ Zw I?dl Pz5 "diӏyS72osYpXap'QB(6jG "`Xmg sC8hy㕼$aI)cxjɚA6Y!Bµ  Wo9V EM1;w-I qSyFy >y џȞjkhqQ9+<9y1y NtfTY C Iטҝ)>$ t8P@*3P3Ԛn"* DJ6d#zE9hd+ڢ2@ 39n pd?7;6 8:oD?S7ãKZ0E3zId D6}0NyFss ]A & I^')F6T׀8F* ʪ . :{ڠs1jM37i1n Es2t ) Q،cma W4 Hv Sz *g`g[*N v 0ڭ' z~aE_?(凙Y”פ՚70z#Qa*"{Oj-tj9q 0 1 dcd\0fI[")z @/3)a4:+jʚeNoa&vȅtjwT9G {Iz *WPKR[rb Hc@6;:{EAQ *8e9g >{ kIsY`  Q;[9l]*ds*c*%  8[p+BO;ikp T+ȴAQ鸚*зJtQA6&wiʒQbJ7Y+Xn+;i I<pgq ^@f[a5tkQ۔V0a <@AL"Ejw V|c]A=X| lQDQtuQt~?]VUK{| \-ߵ=ux  $^ J1m㭳nWYZ }pQq!K Z&x+b n(S ME m+ty0w>#Ji~1T kmn{# P 2)|4l{бAcl]H:{E4Y $f]n_~v,HQTM a"3^e`.6MwyǞF-&n1|g.WNQa wCG%,t-.Ӿ՞B~{]\>.VgaZƀ [apo u͠ 5n.`:A6p=Ѡ 7?Ӡ >_@ q F)-/ 8;ςS%Q  4qYO*Cg Ue}z! ~p||[&??_?_ϴ?_5_ȟ??Oԟڿo?O@@ Dx0B >PD-^ĘQcA=6RH%M~DJ-]jLL5-N;sTʟ)E(ʤM\TqVz4Ǭ]{nUlM*ǞeY!ZB:l'Pu1iW/E MW&`,`ō'^updɌ)|nf͔9wv tϣϖ6-uꮫYcye t};_u׎oclѧyn\.o )o/]!bA{WɣoUE pM5T@ J`l0sB k(ː *$ꐴ 59p)aTqkL@<ѻkkҤiP C& Æ[ k0C{B)I1* qr @xYHfc1f >>N@^7"FҔ7t#R[9wN]㍰%Kۘcktw=;=pI.YBiΘbE]9PyyQmew>iTʬ)E'R" $:U ~&-Pefqeh( XVpDUckNV< C^Yv7ĸѦ hZI[diϔJUvro]g~֦ͥN[gcW.ESsM fdA΁dƙ@*2YWiK`axG_/ΙlS(~yV49t={ݚgYa{ EMNkA s"`&;j+a/ x TWhйPc׿IAܠ.J1 k:F4~2 I5၅A?!SDU(ЦÎUr-8׬+Ws Sue'k9e5,ͅsF%#9،,rEQ{w\tdoV6};B_w}sY.JT?VFL|q 3GF`,4oAMS (~ XC}.0g–/>r)z#9cܿ?[)2ߖnww?Sʧ-u;;b +A'yZdPBթ١Ñ"&(V ",zX0..p{ P-S>OVђ.rSN *JOD nNA6Nݡ#[E8kk ^hT-2D[uțm% YrkLNR hqנNp򣙖oB剿(< %õ{>?D/ĽA$63D 6DLCG4CHCITJ3DJBMBNBOPCPBStBT\BUVARCV,BYBZA[t\DE_C\Aa+`A<LYWSgtli4Fi?Ksl $+0_**[HaU%# K(3P_"hӉ=@X0]@j:kG)Dð&vQtGRC%[*^9 GBD0I{Iz?kX S`xl42i:3 ?X9)BIMx s;ki9ha~ 70e63r?C5ļ\-I3 ʟ kQaXME>@/| @Q \A Nc'ҳcˬ˽$!{I:l Z O`k`0pȃpp@τ`M %IM ּ(yk ˂ T?44+^+Ct5I[KB8=;FQ|"ԵrK 8hs!АA>0d,@HqXk`-gxVXȸ(XZp)Rq̓ϫ DJ ܹi PP]8Mi3 =A:c'Jsa=C˃[KPS;2X5CаZo T?H-E}N˸R̍ .bHRRX΂8LH"=MP81ʅRj4ҏdxI/2=S>̄cLpӁ-"ab;/t6ᬸv+iPCz. iӽH]f׷WT 50:+ZX. DSCJ>E)bȍ7OV`JrBЏH S,`k"-WUV?95Sp"KdfϒӸOk(ׄ룕lZ03[ڸ AIX4? xuRT->u2$Q؋ٳ ČG٣A(ٍJ(0`ЏȓY8Tk<@f"d"eXڦhkXOnnV4)Jv5|{2鱳+IԋS \q5` 05{^i[ õXU\ߴڽ_ۂ8u87P#_[[ՈXsYcG_ Џ ЏmRmHkVpЏlZ1@^Rγ'3+߾4tN&ۑW=5[hA_EͰ!;el(u '?`ȤbM=0ke"kkMY8n,R޵VбePd@16-5[-SCTPKn'XCw3z%BMH3.,Mbr5QV+c>cb.24W,#]xe>@dDZFF?epVd3aqS-%, F.Z\xm%56{neTb$!cfMA=J5b>[^6G2c^V}ԃ8i cpQ R=` H@diՔݤhځQg_eZ3b]\Fƺ"\PCuPgkfcN__! *NSkr<J:U|k]cek'Fl/nf`ok6P-e^G@fPpXYpl6*6nd~xO;@MFc -Ysovcc<`*1*; nlS5X{-x/z-c߾;P(k8K;f#^މkp')C=^֘djk?vr&8f`Vha9Z#_PKKOpk&q /td`eRۻ!F`^Vۓ ۢ*)XW0ukK e?t.obG2gQ([>+&;^,"hX; d4yԏfHnS(!_$)KF.REV v $/8#ȂsRghW/CI[F; eS v=Y$U=eADlCXT3sc79*no gpR,8>W׈ ` p{= L!xnˌc?G Sf0D?5xts2B1Fh"I#^DFŊ,15tEX#}P͎H\S ] \3@l 5;*q*R6T" U`c%!!iCsgx^aZħHwJDE d]'ս(@/43T(z8"&ƍDl!ؙhB"8aDPP@`(BBQ `yܗ&+-_F+- VXj-a@ʻ\`]S*A̖{ B5)=R_.xFCQ$#gÞdg[ Į q 'R2HE/4^Y0R!*#eyhI $e$bJ4t  y+^LjDc&mTܦ;:t#Tϧ|&A as~e\5H e n  CVa* ҫ`D|:Q v F0skzV!ΐ"8[@2Ȣ*H'&-"r*KXϛTcxTV1 p!(QgqPTiq4 @8e Q .Hz׻tZ2V |_PgEi, 2.`] 0&A3qu+SW&Xk[j0aMV%FjWeodB k@W~ fӇRmT@'@>'> ̯@{D"R+' '%HT:c*!rX!d;;+T5Mdo՜> 1mmpG0ZA(@n5eq5tg0IR(/+M?%v^ٯf9TV ~0 lsAXa6 BMH5waB]qf( &- +؋l-9ނ3mhK%ִAe \^!05,c6U5 Y="ld + 5,Al!c6F_eg1U 39@H{Wr0[@ @)1-HFw`Ng2p[^E์;۹{VN /vC'!OB٧4(">=*}MK0A| 4awfc d˘V 昹 s|١1>|c cLާ/P%v.~wѶ1ھiz%_k(:< pZcr2y!-f$ @'W*ϡaef!`Q͐̀%$%Y a j ck| €1/;=h*_q (~ 2wbRS\ i^UtH\q~ܣFmW!5v䃅tqgP0w&8 /VQJ`r( QL⅌؈b! Xx؉8Xx؊Ux؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Yy ِ9Yyّ "9$Y&y(*,ْh.29y|Q #G(<90 @x !챔̱G!aϑ:Ib9d n`$ĸBh7e!7y9XGqq% s٘8rN0snٖl)q˘"H"F#3R##Z 2q` Q6cdρ.p)W؟! a/Dr 蠌ڨ ́{ 3W* X33^*"ɠxejڹѩ04O-OG:$ګC)#0Š/9Z &9ËxPg9 V!W׀򱩻8U6Y~|qsPs U[ :aA>G [Z1 $Zp5gQ ]±Fh8aC$qu (ˋh EBBװh: Ū/p0*B{,J{A^֋#Hw PB=BM+Ak?;s uzQ?Hj o pQ @mp̱TKa ~t PZQKg1˙@K@kK躰+4}@;s1kյ=*p v 60!){]`8!kxGr|jϑ H$I*9 P H{A` 0iRf0,Jь3[!&ZɪXߑRoˉv!]ڋ30Pa+|o[b˿XOɽ*ʟ+Uf́HPP,a ۰pQvK{D-̨8Y1,ŋnqL{xj1x )v *su ~<8lXZ!jsQ?NjWQ|ʨ1 P!ka yW̡˼ ll˸l t z laȼHȷ+TVo,4;L eV]\ɔ1 믊eAP!]v ;IP?Y /ʘ -ɜ0kfAJv|  ]ͻնͪڿȈr8R0dL|sMfSV!)T]HbНz*[`+qc|<\_͌kpA,v Xw-y-ҳ#yV,V;|-! Zhj $<}J/d$-w07aka d m`ն}ղ $ uW̃<0+ ƍ]Ǭ#x%psƠ t܋Mȹk$QPWg-X:j@s1ρ@  ٛ}LAFqqpkڙl G;r-)mۊϡ Q@ &P|q|{Ѳ0 "4*,/.pq<1{b{{hw{J^ͰW)ޤ, yL*<V:-$nĀ⹈})7ζJ{4kpyfyz+ 茾!t у#ͨ~(ФV=//+؂׀5Xia+ju H - 0fm0>I{yxz.$Y (XA`쁾4XP `90rN` P!wXX+HPH gY bl8 Ҩfנ"*UM( 4_6O O3ύG}}@B_ ?HJLNPR?T_VXZ\^`b?d_fhjlnpr?t_sυWfh ~ܝ o`.?y#$ W"Q_!ݘe?Յ1{A@0ziGqhg /i oՙD9vү8Eno=џamό1 TqA >bkG $(QF=~RH%MDRJ-]SL\qPAF؄8^8Fß6 jU2cӃ^گ5 4HbD&1>L`|GQŁjaƠCW4=ZhҥMF=&΃PSG5 0vMTM Z q-8n$W2bl Xזm{4iւ /mg*tQ&҃o~_>xz × Fh8T"@|h1|n>ϼ[`k1! $N$." #OC: 9c(Xf6t7NBC‚DƙXFdJ-K-K/3̏V˩hأq5NμN @DgD!RDXd)>E)QsHk4KI O,TSk85SC]QskhVݐ5ŠS;u#TTU N; iQ}W, :VdڳO hm9CtdfeL݇BVeN6` #fib2.s[7"Qu_=vFʇ"%  J@fS8k@@yw>6y!0С*Ϲpᦋ !A7,ȁ*?/l Q2xqKܮaYA (Ѝ =y+'x< P , ¯khא8D"шGS>Z x:c *UA5q3Nx/bg(> 8R9_~`H>l~ "GpC\qC&  C*^*!h$"8q$+$$Q#ƴ| JI-Ғuc8^HDf2Lfzi5D!"~4,MpAhԃ1V{ez`0jaOG<[\  zЃ$4d6I+9?Q(щr$\*G6 'ChD$bxG'D4!Cfԧ?jPEQ<R5ݚ.:UȏM.T8QZu(nR ]x"g*::k&>!+rZ Ph ؇$QTI 3yfb Y)gm$]IRX^īDkAlQ45MbJ6B{O:[ֶH$hЇ\@7pOpk@.np i;ӺV ;]S~3Hv yW0$y/ķ.JJzO:/I\Dۚ#'%W7,-o߈0"-Nz[ Wvt;N"k0U0l J# Z1"C"cͶ,o^\FXt%=>M&oh'`5`jahQ?npQ*0wU! ZyϬD G"HƑ .] l8B q@mdD2`#^uS؂L恼B=jξhG&)?Rw&יe/nx7Ԯ.H3hEJc/Z]N[ aHyEN _ 4C 3%9%P,Ps ȯGҋL֠ p3]hXFؔ&| @ զ)XA୬fIq ]7b{$} QAPs[C":Ž价^HHf^wz= A< : ӌZAA9prb^us3Zyu{ۮƃBOY.0 PAxok@׾laf$JG`ع# Xb~2w2H`GtȄ ? B* hJ>?"?(ܓ$ # 5믎"4ԍLP#_[(' ((y;&!$B S6%00&|(쵓03 <!x/<0|YQp6,8CH%L3$P `t 4*:v17xi!@k A,$Пk bBpMgeWIXTlO80hPoUHpӍ1+6̩@Q) 38ZΆxO A0QUl(xZ  Nqgyj *:2( q+h˫ҒxQljP-R/Q8S%j" ˑFdJrS2YXAJAl1@#DX{O 9OU&LRvc(8)gI)XUkhՖDbFe G ӻԈYu$PLQM-k0PUe(J0-Aʪ-쪯DU<BՕU[^p5qVykӃxS eyWiP- j~m̫(RpTTX XFS@]Wc͈z؍{Vk%EC3س;1=YHjp=)ؔ(3hkx2䈖}t@`;TYr6إeڗXׇ@7C>SK8UZ5AIqU CR6ckZ]۱*!PE%VW0["q-=Ks= =;9{\o\s qeY&R m JIПE LC };eTkDhF=RJEAH;gGBDߪlȁ^(ĆPC_WfDn4_# &" `W$k" FVfv !&"6#F$V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖芶&6FVfv闆阖陦隶&6FVfv꧆ꨖꩦꪶ&6FVfv뷆븖빦뺶&6FVfvdžȖɦʶ&6FVfv׆ؖ٦ڶ&6Fufv&6FVfv'7GWgw '7GWgw _n"rv#W%G$g 7rwjn8*rr-(r00's>^s^6/sOs+Wsn(7$s0AsX!.Yt^nGnB7F'>_CGt?tEt$,)tFEguSRs3'?D_[#s]/4?*uX7bw:r\GucwIh'Ffu>ULeWv"qv7tpuUGwKvtF/Y7swq_O\'u5v|?u|׊gv`?lv$`uIcumi_rxwqv8g]/xT?w;wxy/r'v1]ysyyswZo7vwbOzx'7ygyxy/xws{TzUgWw~zysz{4?v23ϧ@{nzwegv"Ovći?./y@'{˧X7{oza/}'{wGwuϯ{׷vwur'?2pOƟ}{/}|ߗa_{ϧov_~tvW}7K-W~o_' „ *l'Rh"ƌ7rȰG!&YPH*M dɲ×CJ s&Β(_ِO7EHѤ*K`ʙMJaԓZ^:tOWTгJ eӉB߮6-Rn4[/`ݢKQ0Hb3nErkhV,RӰ[=YgXE^[r̟YzoL$48hQֶyX%hs7"nn̓m3<n%{ŷVO_gtޤ`6`a7a%Rk)jqh18ca~TBhph>XUHd@rs.݄=陇J%9YeZ-b Nd`}Qt7r%y깧'"$֙w](KFlUTV\(Qn*)x*uI9駍i}ڜyC+*+wV *oFh**~vڢJK\2%j`49lնuw^ n /b,7봇ˬujJ[']꧓Ik2 |&b1tz9i) *k [30 ?/!5gT?:K4[ fX'VʪR䔡 k]{jm^wtKط/ Bޙvw=44 7 + ؤͅ=[%vo,N>oOۼ}W گ|kkn~S6ٚ3Y:}7|>7>=[=S={=,>>髿>>?????(< 2| #( R 3 r1'&!(!F<"pN|"()RV"-r;l(1f<#Ө5`l#(9ұv#7걏~# )AR!E2|$$HR$&3ANr$(C)QR,%*SU<%YҲ%.{x+n;%0)a3/M 9b2|&4'd&tsmr&ӛjM8өuJ'9 7'>iyefv'S8)ЁHOj3(D#*щe*)P *ҋ;*/ԥ25CuiR5V*3BmhX*XJP4XӪֵ^9-*U*׹Րn+^Qu~+``2֌m,d#+)>vl$b}rϒ -.Gkղj[+َQms[96-p2=.r[6}nըRQxE4.t]Rg=-nu7*Dέ=/z6O}o6齯vqLwV4kޱ>>6T <`j^7lOj/Rs G)[p?yXv5u,5o/c\ZlN V-m`Z?? j9E4´ ˶6Z!_v]e4,9qv5ӭ$v>v텢?7}36ImN=gn8Ưp}6774qkiKܕ)_9́V<6|!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/exec/main.go000066400000000000000000000024361465647402200175610ustar00rootroot00000000000000package main import ( "fmt" "os" "os/exec" tea "github.com/charmbracelet/bubbletea" ) type editorFinishedMsg struct{ err error } func openEditor() tea.Cmd { editor := os.Getenv("EDITOR") if editor == "" { editor = "vim" } c := exec.Command(editor) //nolint:gosec return tea.ExecProcess(c, func(err error) tea.Msg { return editorFinishedMsg{err} }) } type model struct { altscreenActive bool err error } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "a": m.altscreenActive = !m.altscreenActive cmd := tea.EnterAltScreen if !m.altscreenActive { cmd = tea.ExitAltScreen } return m, cmd case "e": return m, openEditor() case "ctrl+c", "q": return m, tea.Quit } case editorFinishedMsg: if msg.err != nil { m.err = msg.err return m, tea.Quit } } return m, nil } func (m model) View() string { if m.err != nil { return "Error: " + m.err.Error() + "\n" } return "Press 'e' to open your EDITOR.\nPress 'a' to toggle the altscreen\nPress 'q' to quit.\n" } func main() { m := model{} if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/file-picker/000077500000000000000000000000001465647402200175475ustar00rootroot00000000000000bubbletea-0.27.0/examples/file-picker/main.go000066400000000000000000000041061465647402200210230ustar00rootroot00000000000000package main import ( "errors" "fmt" "os" "strings" "time" "github.com/charmbracelet/bubbles/filepicker" tea "github.com/charmbracelet/bubbletea" ) type model struct { filepicker filepicker.Model selectedFile string quitting bool err error } type clearErrorMsg struct{} func clearErrorAfter(t time.Duration) tea.Cmd { return tea.Tick(t, func(_ time.Time) tea.Msg { return clearErrorMsg{} }) } func (m model) Init() tea.Cmd { return m.filepicker.Init() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": m.quitting = true return m, tea.Quit } case clearErrorMsg: m.err = nil } var cmd tea.Cmd m.filepicker, cmd = m.filepicker.Update(msg) // Did the user select a file? if didSelect, path := m.filepicker.DidSelectFile(msg); didSelect { // Get the path of the selected file. m.selectedFile = path } // Did the user select a disabled file? // This is only necessary to display an error to the user. if didSelect, path := m.filepicker.DidSelectDisabledFile(msg); didSelect { // Let's clear the selectedFile and display an error. m.err = errors.New(path + " is not valid.") m.selectedFile = "" return m, tea.Batch(cmd, clearErrorAfter(2*time.Second)) } return m, cmd } func (m model) View() string { if m.quitting { return "" } var s strings.Builder s.WriteString("\n ") if m.err != nil { s.WriteString(m.filepicker.Styles.DisabledFile.Render(m.err.Error())) } else if m.selectedFile == "" { s.WriteString("Pick a file:") } else { s.WriteString("Selected file: " + m.filepicker.Styles.Selected.Render(m.selectedFile)) } s.WriteString("\n\n" + m.filepicker.View() + "\n") return s.String() } func main() { fp := filepicker.New() fp.AllowedTypes = []string{".mod", ".sum", ".go", ".txt", ".md"} fp.CurrentDirectory, _ = os.UserHomeDir() m := model{ filepicker: fp, } tm, _ := tea.NewProgram(&m).Run() mm := tm.(model) fmt.Println("\n You selected: " + m.filepicker.Styles.Selected.Render(mm.selectedFile) + "\n") } bubbletea-0.27.0/examples/fullscreen/000077500000000000000000000000001465647402200175175ustar00rootroot00000000000000bubbletea-0.27.0/examples/fullscreen/README.md000066400000000000000000000000721465647402200207750ustar00rootroot00000000000000# Full Screen bubbletea-0.27.0/examples/fullscreen/fullscreen.gif000066400000000000000000000451671465647402200223650ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnqqqssstttvvvyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnqqqssstttvvvyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:/檫Z1,ȶh,6ⲻ:+m: V+,r-݆᷿kn䞫n.y~ 4ojS`HkpupTKA!HGs1 Q-<&.. %|< @SF"8`A7MC]K/eĴ\+ ],w6mQFA*hݰ%"E-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP H௃&,p‡6Q"C-ĨPA= ! +2Fe/<*IJׅ %Zʆz2S&C:d}4Z7Ks׃~iO|ᕩ>Z]:/3kr+A\MB4 '25ĕ,d|ᲈX +_~(Tȃf+ ZdiC !,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ {qL'd1˗M>`,W/R~$6\9KХkMXkG6ű#A 6#D:/ t ѶiךV/Ƴyޝ.[}@/El>p\QdٿcZ8\=}2 !,W!,W!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.aLS] d|KUO?-zcRm(ԁRb|tjL]R|ꀠ!T}:j ,1ժGz'/\|;S#JlŁ |8deq-yYcf'!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ Z2Ɠs9K˗͏8 y$á?JQIG.%(ǣMUցU^j#֨N:["[fEw-]ߙ ~ըVק&z,lq!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ Z2Ɠs9K˗͏8 y$á?JQIG.%(ǣMUցU^j#֨N:["[fEw-]ߙ ~ըVק&z,lq!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.a$8Ņ3(g.A,\=7 %)0/^B%|"E  驉IЍ3W*3J5ŋ-`96E`*`%?j2ǘ)Q&}4ܓ!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.aA -Wœם| Edn(P$x-_C*GB ]).cJj"UU[SUݴyK+Wt=L9[%_ɀ!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.a,ař,TW.Eά筢R %)Oi]kTU9{^ 8׬ɶ.,En)Kp)ӂŘx"C0(y+s |J1 `+QjR+ !Ra#NM쿷% !,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.a,ař,TW.Eά筢R %)Oi]kTU9{^ 8׬ɶ.,En)Kp)ӂŘx"C0(y+s |J1 `+QjR+ !Ra#NM쿷% !,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.ad(ƕ"xzp)/_8\y/Rz4A%E ?NAB'_r>RH _RlKmܖD+bԽwchB/9iwLL=Vrg !,W!,PP@H*\ȰÇ#Jh0ŋ1RȱǏ C"Hȓ(S\ٰdI0cʜ %I8sdi3Ο@JQѣH5SK->J5eUjxuׯ-K`ײhM˶ڶpKWܺxuW޾U L8ˆMƐ.Lyʘ.9Ε?,ztҦN]x5WɞMѵsϾ Znޝ}Yxm♍F^Yn攝ˆ]:]}{H_x/uÏ+~_v?UnE`Y U .T6aHMHQ^T!,W!,W!,W!,PWWH PÇ#JHŋ3jȱǏ CIɓ HR%Ŗ.\͛8sɳϟ@O<8ĢDg]ʴӧPJ4LGDJׯ`ÊkΡWj-ٷpʝKק۲Fv5oRm*Du+^̘1̜n>@1KNKdjӨS-g̯k 5I̤g-!_N:蘄O'νɑEy`-_W^/z~on)|ﱤ~)hzE`JfX`yiauah5_ Y"rfxVZn# )Y$j$ Iꮼzk+k&6F+VkfQnjr+ Ǣ.n> ?(p' 7i ?,qELweqw\,܎lɐ,q0<2l3D/߬9=,AmtEI/tM?-5QOmuU_5Yo]-amevip-tmx|߀# Xn3xM #O D[n"AK^: "EK,tH囓J,o| /K:=ATn}Uo//%}BL@GߗtA"iOWNI˓ X{$p \r_#, (W*}E2?_O'UȂ <dxа{_ _A @ >LO~ |(O62\#"D>h !C*pыq W 2Ǎ|`5aND5H㨐;>&XB>*$!X#XAR$L@fNv5Yb D\ IOA) A(r" .,]T; \yz JAC&*} 90=YcV.'|Z\ hx "xp-^IWS!ua -bJ3(A/a?] KA` 1 ҉/4:2$[EW "]u*犱j nq &B{K@\4s@瘘J_|b {/=ꕜb{D(BT@zUjo hlJ LӤ@68nrP Z_k:=n*2\#X Nr`Zo\\ brDʢ ea]^H%zT~w 5A| ے|bR3"ypf\R D>H{Ah  \ @p dfH|c [K[ ޑ{`{$.\U d C4[ʵr, }3Bf(:},2% 1_8@u7<*R &v#O J|9މlw@F@Nߢ }'/f?Sߪ("l$هbR%hkdp*v_rS/Hf_ P0x @Vxq\g:pjGDǔzf#zAtt~K {"u!A\A@ W(?G#|1wW8x?[B(k#dUvaG~h6g` E %b6(gw 6nbu 3x9yQ%tvaytdAtX ` P 0"NJyHSDgm8XQqh^q83hh=nȅH#wv1vMmqO >|1bExq{'RdPbh%xmXmp wXX'QB< ahx9HL`D hA^xQBGEx#)^ђEGU%2yv eڨLq~xW3J#&5V֕q#s4`n+Vd9HP95wH(   P4D^\(VE@LQe8(jbnYH٘ɚ1t`: Y}I\y, QK^Wy֓O8a E;P9gd cK  c nsm!My){ ytmW    nK QDC{v Q:D4;)P9ZW!@I:DݳoaYQ(-j }6pڔ p1M)0 dj^d* 'A`=:S @+ bJbgqr P^Y9W֓WQ K R[c -H q  f 9 JP9T @z1ej|zJf:i (@Na9 6z J@ WoPj+0 -x +y姿Z9:V*(L^R Z9٢l@5[ʧ~lkZ9m _ աA|!FNdq tPHq?h=`o1b7 3 *=u}Ya4 iq3+ v /@n :Bwwp!?_Ts 뫨=RLXk=]+ |Pg[9ZĤq A1{ *$='k(r# (`UPcu!ݘ^L@: Tӷa! @8X F FA8 {>pRH@k`+*JpnQ+Ы?k ΋K#3b;b0V7@#9{[ V5K ]; p\K(PW3 ۿ(@jԗ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,; `L9 +ePǁy**с._u".K1( @;8@ (D'|Hh_&&>0uB\y\{2N*lPOp1"_HT !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,; x!=NT2|&Ta$I|'Mz4fv2S3@ WbAɈ[}I֭^Pr@1:CU ^ u@$|ꃡ /\#1ԵJVT_L%׫s%!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,; `v赊hH`Wj@2aP>e&Zde^af|QZ \ʗ7  X%E֛N5d%p+[qkp.Q!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,; k`AdqL.d 嫗UeDŽbIqA'1pgΛVY 1ǛAJ nE kV@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,RWWHdaE‡#JHŋ3jȱǏ CIɓ(?'a1nԐP17CΔ@ JѣH*]j҇^jUsYZ֭]KٳhӪUjW&çX+l{LÈ_# TU㑗`*̹ϠF(_^儙@!$~PbC# (Aȓ+Geʔ ]vUν@v\+ؘ_Qj.A fdoNWV!BhK.`"@%_ɢrfHQ sMt @A=bU*@'TUiA$.UɂKUtjp-|%UU TBe*MYUa9PUdhG$/$dAU/3R#7#AyxgT@X QU]R/\= ȁXFUbi.K0hQkj뭸 $ O8'yP v⩧hㅂ #BP^cKM(VUB~ @BЁ mD'OB(=-Pz(BAJҒR 5JW PԡEIFԦ:$)FԪZu#NFzծz5".կiӛTf~E]W$bWթ/kDk_ []ijUro\[xCY)k*g=KZ0SmiWQ֥S +ڔJqނ .F+2Mn@:ЍtKZͮvzUĐ=rԛ#= y'_W 睯A;ޱܗ$]~y8`- `x]A$,pH4& FKD0bXAKLhO*G^.762~opo3 1H%q_>7/K|k.9PoCZO9t$[vx=k?.yԛp53,g<zՍ.mjۛqPO8فwG6ƶ|f9x9| mE=o [wOxշ~'7}^g|mrk~:9#|ېEO{ת/7[.{׻シ>c{G|ݶĽo~7/;??=?|s_9_0{}t}G~kw|jWsk}X}7}xsvdW's~Cz sfv~c}Lpp rǀZh{qs bubbletea-0.27.0/examples/glamour/glamour.gif000066400000000000000000010254431465647402200211710ustar00rootroot00000000000000GIF89ax{rt i n f _ a Wz [ Qp TuLhOnF`Je>RAX8J>>?????@@@AAABABBBCCCEEEFFFFFGDHHHJJJKKKKKLKLLMMMNNNOOOPPPPPQQQRQRRRSSSSSTRUQVVVVVXXXYUYYYZZZZZ[[[\\\]]]^^^_______```aabbbdddggghhhhhjjjkkknnnoooppppprrruuuvvwwwxxxzzz{{{}}}}}㄄݌ْӘϟ͡ȧɮեڡ! NETSCAPE2.0!,x{rt i n f _ a Wz [ Qp TuLhOnF`Je>RAX8J>>?????@@@AAABABBBCCCEEEFFFFFGDHHHJJJKKKKKLKLLMMMNNNOOOPPPPPQQQRQRRRSSSSSTRUQVVVVVXXXYUYYYZZZZZ[[[\\\]]]^^^_______```aabbbdddggghhhhhjjjkkknnnoooppppprrruuuvvwwwxxxzzz{{{}}}}}㄄݌ْӘϟ͡ȧɮեڡaH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무z?檫*l:0+̶,FJk1pD6ѶݖD0<<@|F.=P=b6 ]1<0!P4 /  9t9-!  VH p1%22^ #@PqC@8]l`C#͐+39+ spoGݐ)ó7wv;TH 3l=xߌW= IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{MrNvMzη~N !,!,dX :Hp C &4Dt[bp`{PŞ,h"‡ !,!,nPaH *῅8PDYbhBnnpɽc;z(ޘcW1B<$90=;%LrYD0\;sT@x(6さd{NMuؘ=@JqSlv !,!,xPaH *῅8PD ->Ĩq#Ŏ3Z!cּ{C%R" VQgaD`48¸Gn"e360 RC td{@"=zռ 6qY(Ќ ڽ\}Rɳ% I`Y3D8ƀ!,!,PqaH *῅8P@2ڊhF(x( ->xC(\)eʎ,c2T eÞ7KphЗf2e:wOisݛJTgRsV] !,!,!,!,PaH *῅8PD ->Ĩq#Ŏ3Z8Ĩq#Ŏe1\ɁgOUFvy^J Ĩq#Ŏ3Z؇={ݖi=mc"R"i t/TM0 a#G^: xÞ8;#ѽcX #30{ƄgKyVj(#˓#9՛^!,!,PaH *῅8PD ->Ĩq#Ŏ3Zq@bt@1g6 S&H=u&fO,9AںG୤aO5{PG˜vĨq#ŎhF3yZwb3'o^8wK@ wڍ³g$bɝҠ;=- F)HH&9J6:1 T&)eXfZv\~)Ih:hfl 8)"tix|矀UyS&袌6JOjSVjBF駠覤)iL&ꪫ0Y :*?j+,&r+()7*cZ믔>ӏ?4jϷ4+((zO>Xϼl lɝ9?ȹ+g ٩Q}b-)Y>)s^?뾊ƫ|1?* ?+g>Y  âOϹ?&>*rt1rZ>{6luF<1`t?^b-:ONN|9.?wߊu?2[im⊠qWGa|Js*"j6O>m |>緰ȌDB/zO=4(3|["x?Kni9DJ40L"Czt%X b{z#3ϿHa kOyȔǸUz|P9-3?ыo\ZE>z-} w5ꕮÍN()@Tu[7ZON(nN4ĈgԃoH WKLaѲOR`~:hD)"⦏HQt4Q )kalOި<`πo'=btctKqy*4MUh-JR:`r)JWJԥNkT@iOZw*5*RJM2ut*Tz=RV*V -r*XJ(i2+Z*&Yr+\ %^)<+`[#,2,b5<2SR,d'{!R,f7 rt,hG+#ϒ1_RPԺ0 嵸eh @Lz@k'ũ KfwO@T%NT0 +֍Z`H/L{'+_Xi l:8J 0@&\ g'h $@)^qaR 8@L =ƀ@(`rld 7l@<`$`@Y(i+4@ /`B L3@# 7 01' A 8z[s`!m&m1?]/@'KcT~Lg@8mL[zXSQ$ z+@+HcX[p@lc$6(Z -PeOWvA,x' -P 6.4auafD$@ph M`\sP-̶<u|3 &@*~~o &E7NǤfVS^w vmC>61X@.%; .߄11z%0]?Hz#`*@ \lf^ h /WsЖ۬W̍sӅ`^ *1\ 1 <jr"oB5m{Ҵ5?0j& 4z΀H;~5 ~pvp[6s#wҗ[F5j'v(>Aa _j, ]恴0 ~ &sgf wf_&(`k00iv Z%a)1q7'p)-{HR()wC耔Lxa؅dx]_@~gieiQp8!txax||ᇀ8q!xlagYሐ8T!xOaJEበ8@!x;aB}?r8q(xE⊸hxXxϸ ҌaX&(!HݘA(!ԸQG_L1`05@1Q3yS09 h0`yՠ0)0YP@qя,9  -Y090(K)P1 ))C _ T0ې d `@! @ АQ 0 qt0 g  cYgQ9S) }0bPe`)eip )9 ؔRI0! :Y  ٓ|!08 됕` 6 ﰙp I9IiY maٝ1 ! )zP0p ݠY 9吒_}`0q1ai1! ip 1 ݸɝ8q 0 H B00 p)\Р2:i)*71 1m#Z% =A:x1 ڞ07 a= q 5Z P:h:t:Րg0 /0 9* @ 1 ﰪw  ѣI090:Jਣiభ0j % @ Apɭi*J0q Z6ʭ*3` :jqڠ :I  }P Oz{jБq 穮 ` B1Ѱ:? 1! 4{Q 0 ::`Ky;P:qT*7P t M@ 1 P`P1 P S i:i{ު^[6!.;!)yn;6˸A\kZ퐴 @$i?@0a 0ڹ:/  @+K˪Akp 4K+0 ܰ; jQtIɹ1ṱ@$Y :)CE{ 0 H)P`§ ɉ/Z0*E35pmL|2İ]ůpA`Lbfk|ƭl!n|"V ty\Ǭh|~lǰ Ep^.А !>Ǜ_@`  P P:;+^=P ]~ OP{0y@C̠ ɩ @)  { r^kmp@ zj~]VX>NR ПP @v*N[6- qc.N.x p60캐k n]造PD > ]卽 l@`7 g_ )ۛqa*Y I0۝{~{q>0z=a}}^Ppα?Ā9Qm1pv*B06] I.:s,f0 ڋ`ⰽ=P bOi pCPYB.^G3=b0-f>?N//@Vo5bH U0AUT؈ cޮx .)[?] [ l?0 z*0q̵co۟;p 5,z:Q/%㜺! pNh+PD-^ĘQF=~RH%MhJ!uպwY 2s'w3'ݺ+C+3q.dwPFOZzmY?Wj66ڍC.͜;:Id:vzQĀ{"dɔ-\oB.}4ҦW$5U/eꐜ6}\pS4^8wsk~kwRdPǩBNJj+Ulp죺FuF6{%9˨w:GÚ{n lylf’O38p/3M Bi@sF o;(CGvg>z駧ޣ>{x)m"'|Gz>ׇ?~?p/ǿ@w$`@f <` 8A VЂ yqPaϗAFɃ#QBЅȡ g1I1o~4ld kB&6w$ ڦ/@I)ֵQܰ#HB(I=J;r.M#CEpqIi:@EI Fq8tb"=E!t;%1'i|q LfPaqA:aOf$19IH?ulTHQdZJ9"i2J7 G9aZjeF2$ n/18m8ӔSj^3.9Ύ&aeIV#&".3o@ w hІc LE865stME1kӋnX1]]8ugȑAıx1Zc9hBKAjX9|A\2B %qBC+K GDRyHMoj8A|E㯮 j& Ġ1 <t:aؒ"?ecXVQ)KZfthHIՔⵥxN];Ӄj=n`͡_`1(ZG%#3H" h 9 _.*U@jqov62CGWY+&N񲃼5%ppC`;v"xG еDa;,Wm^-ڍ4#M}[H)m?7vAhT!&0? U!;jTӏt?aU9)Ċn[ ('nd Eԧg#W05Wo{"1#`,w7O2?)?HI=F {6X{n!9tHC(6D[Ti}d#Q6FgD66b]l.x> vh[ug؅fdxP< >K?(@/H#T>> xۯXAj>{ ;Ip#A3?"| SH3 芯B3BΘ Œ(02<#!# ӈp YcYÃpjA0 a , isTp@%fĈ4t6C\1A$DCT'D$ڐXDEˊBxrCBBSLDN_\GT Ĩ *$ +H " wjď0vux qCtۈ cSc3?F h'#$Vh(vh,3qOtPrhG ɑ1 wHhiH+>al,:Z<WXY<`pHQw BCa1)a);̈EFyHsCA<_1NYHv gIJAGX jwhKi<|dK_X;ADLnSKsAuam1o[|?4KܾF$K?qKUʪ&>ʘXhAQ~ OOXd؁ϓ9隯a7y L뼀<s9Pvа[8[qH9iFϽҼ4 mOqM?5 UOqϷQ u?όPg)񌘉I"QhR4%л }!4ՙ 86P0Ӊ!Ab!55 8Ӊ@SFkFTa7 DE%JHKmS)Ԋ1uՉ0 !#9RuW 2mV[\]U `X%aS`5dU1-e\huiVUewjnfVvp5sk"v=V)rWt'WY@(w07W!wڡ?@P@L Xbz%3MvpD(U츈5X#12:)0پف.qJ5 D  ĐX RW`8vȅ_J@M %sR:%P%G5q$HGbqx;A(Hۡ&ihyeȉ߀ږxmorq"HÈSmREێX[E%M  }V=u[)Zx<;9ۚlj.Zz,֭-B-?q'B-Օ+z\*f40\Y5ݲ:}A.BY͈a03Q†޴z++(]*^uU-*+B㺒u ."_ܺ2^ş .b0v339 c<b5bB`(6?6psXՕC۷~+4N#M4?}%8e"]S^a+@tb(9]nZQ&h9ٌˈ\>9p\Y6m27.(7G6%X9~e@S]Ixӷ ^@SƈW{gPeig{LM7PT5+3+۽w=m@u *pn>7|V;3k'}b;N>{mf(J KV~¼n{ 6Y|+ 8d\< .탈P`+ΈE0<\^=>,DMi[T:o@ `Fg0m_e4IDKD&Bo=nˆC'e ĘgcE3ŶNop0qn8iv0aXd>sІr8߃I!GX|}GwGev)r9RJ0sV57Hw4dJ;87BOrtߋsr:oJ਌s8T=4y)&/kWPM |{UVKEaGeiMF[g7'M-Ό(ض Of΂L>gN\#寺4NѬNfgP*j;wLBԺq2ı;'Cvq< ]{{ӡ3nҥ;'p]w*լG;i)sAh]%Ǣ!nIpH(#8 @.Ի/o#8ڷs1p KT'V;PA:6" ( M'u4L4@ ﴂ @܄PǬÎ2E$6:r-*4 Ueg#P"T/J`+B LS;ږn2 SGttwwdum=2!;̌i#dI5e+9>s=CbFL#D;Z.ľ B)>Cl79ÆB6Qfmc-f(ep^ 19X9;@!x@0!CwNxG.:A!GB{>+ưvX!sxf0# ui R<`~8*DDgM`!Bd8:!`c$-"9$59*sJh)̸5Ө"NLBaG+ [pc= A"D# 1#o& rv%!>#BlDH*kV072 l!BX/YB;1!OBʱ.Vo#(iijDaB7rh!lBRs|L`\QnaHtc"ܡ\YEBw@O ;^*QಓD@#6Gh:d h0dF'˄iF/Ǒ(nI:u7p!5p2pz!MH)թ&Ś{Ukʲ*ِs6(G6NcM3Y @HW4Y'&\ǑG{$-ʐ"!jV *9&vѝf;UQvhEKڛT0=bV*(Bq4vV RK27'VKVi@qU i^pሔ B\A#x4hI@F(T<#x2i" P!ZDb3GxG: N@^HW'\ar0I:{MG%0A hE2Hva(bb8:MN"JPWDLBrM!&^G,t&Ϙm2BD ry] &C0i ms$L`x{k 3 t_,,!2St u&- IB1v uJ͑Q#$4Clt/VG@>-  # sBJ7$!5GPMw־B- <"R$=@6 P@^\A 9|g!@C(hO 0wCd@;83qmSSׄ0ƛiz)9̏iFs{eUk~s)4sDQӣ.uHfB9аns0GAX=f?;+'g;.w=}XqnFߏw !fD'Jṃ<Т^HH޶Y |D~;xD9ʑ$c/{~YaI2w}sk^;;׽Gx? gJ>_:@C ;/~D_o;mL}1u/YϊVǯ7?ء-O/; = I_{C;PQP!E ILUu*DR$5B@-M : : ›G`B`D:ܪTB-T6a`]]C @Y[`!a~ BIbՐ;Q]7+ @Á%a!ay:G-p @ DD90F`XCț$nQabhp(Аb]")yݱ,΢bU"-b"/"0ڢ01]"2.#326#4F#+>4V5!5^6n# f#7~#8J7#9썣9:&:;#ܵ#<#=n<#>#>?=@d;$A$BA&$C6,CFD>DNE^$[T$Fn$Gcu$HhHIGJ$#K$LK$Md)MN~Iv] N4 % P@G@R %UnL\ |BdVv%G4` M4eS@TZ\| 04@C@S@ T%`v]Rsa bN[ @%L@[r DfSJ ( L@_N_ _j.d@$klF`&T P@]Fl(&czp*i&J.n.dg"(  ,(%@@^@S4f`  . r /hZlr ln"ʢnʒj NpP`lr@oB\pw)k)N@bF)[viSj s0[:-s@h,0B$ "D"l ' +g1N(Dqs iS6J1 g+{B: mVBt@SvmϱD:0!#D10@G{6k&Q. |B {(7D 8^@  c2k)rIJ&-/27v2021s3 32/833?30*34OI35_Y36oi373y38s܉39P:3:33;Թ33?s3@43A44B/4(4C?484DOtH4E_4X4Fo 4Gti4HztHbS4IHJ#KtE4HƴQشL+JK #NEOtwt0tāA޵} ? uv:8C!DD E2!MhW[0^N$C$u$D;8G,XRY'4QUcuBl˜#\u$ŸAK5h4 dGE;B ;܃lC2v2E01 MC @50 CCl: 0$SDTT6i$e#%HW.@Xv7iv#Ј/B+AKc4:B,wBHC0vtEOg}pCa7jX VE3,D:j8`f<|ry9;UBBxC ;TxֱCa‚'1tK Dt Xh˷7B!+DxGyJ_;u!D7yC\<E[;7l#XډD|[8}{DjsǸ@;+mT OD_y$wBhBJ2BcTyth9@v]Dl+Ã8TW6۷#c"C<ȧߞ49DM`!D츃X:B886u8N]ö;$nХ{1tz|8;8T72Ck{a[7,B;]Rwq/H;$);π)${W;@3:x{vzΧhCtStTx]}:C5KC*ϻQC;vrN'(,CVB|CDALâOE;C7-D6hCcnMwD7۸/6)6u߻=2 M5U{[Bp%D4?8"B9$\<'߹ɸkьx /Vɏ=_h;{=; FD6K.l~\# [~B$4,,,Y57A+B;tQu!D~ E)B+uG?S8( 1 ]A;XǿFDtсB4XuY:@ 8ں2ҹ1 ;e %=|l`G}9dI'O5pH;rSs.tzVS…'VqcU!?<ÕK^Ƽsgϟ=]ͣOVukɢ]ǖ4ڳqֽ;)l޿g,xqUF3ΙG>rC{wߛZ?޴kѧG/^}{%w?q/x~K33M1P¼@ 9̪1A,ģ>G<1w@t!L(odMI/q) 6   F5wuDa9/tG$tXĸh|_G?_8D,y<2|GU#NH+|C_q~טwck; hP x:hXO w|GGKkIJ }m#@ Ycpp#bwut$$(CXG5đdXvdr;Q-A Z7<@gHѩ dF;0 \f*JTX+dNS`6w|2$GT:tfgY[hU]h#;*QT1`wl͐SS9wPa(G=:o I108]4iGⷌ8iJWҢn2`hfU M(ICґ D wBêVUv#ڶP_(A wjW6CԧH:Ԩ`HR(30DWGIvX-`ctx@0! .M;V;vc li&F? jd?bZԪSQ o;bDHU Y s8dm9QD%;0̸QV#>oz0׹%hլC(tv i!`[v(ֈe$Y;: :*im_&K$;d@Ác@d](?7pKVRwbYM\Dfe}Y B|)hP"`";l' 7"}G]cӝ,;ѼՖhjӞF6TӘ׮jG‘ZfrIJTH!SlqaVu_laH‰""&q]xMs%,~z '?W`*:-ߥ3nx+G})W:XMLie(F8 ~tb}ca?&`EЏS/OrozL'b(bdnoA}BZ>A bG&an$aPA&tv"p"1p \vJWh[5 La mk^,BP#aRb%%  G$F" qPytj P  P#O.$z`: |O b$@Q$b wG=ÂB(z!$*pQEB" #q[1)#Q l{GҨ1B12B#Xı{%ͱ00ұݑ61Q+bBfidr  R$) w [YTd!B"RV)f"#g^N\Ѕq: "Q(.nh(&I`D*be@%1Pv'e(SB ))2C&b:ifj}ҡ!kqO *A'҂-=V#ҡ*=.r2gs:'im:̲(m)\$-#.;b.?z{@B& AbȇH !2*K3SjCnXH 7< >B4/N2@{#IM"M V$ b!H8SSAMHĀ!mm 3JgZGMS[QG(-6 F\r @MB@, XX?"\Ǖ155ZsZLS%,n[a}vL :#.xucߡcU#U~ A_h(v $.~Lv.&euh%<(v>(F5>Jo \!4vTT&O BAU$#Tለh/LPlVS+ i#jo#@!a4g. OUAArEs?7 mBpr!_0w(Ow;pX!$Q0Q" C0sU7Pr'CcsQ$ԓe;{Oq] (.g +qb|KM=z#jBJa TCSR" !*S(R " +WR؄!#+. 37 ;؃wQ M8?8CSW# [%j$f9r"[[c8@2]>$M,Z N+Xq#G"yX*Vb#uh(R6A&1#xFOl$_Q"pE-;Bq2Ps$bp)"4ƸRj+R,w$)*2g.0c+r Ho$v'v'*`#9|(0Gs8s/V0(>(.:D"% /_'".alj~#sA7ȧ,h#f@87e46w!s7^3dj6ssM"3꙼@ӶRu$ނ#<#Y7$v !('|gD 533*ɶ$ra! LFipdBA5B l S$i܂("hU;I홲M\(i?G?wwS3B`ܡ.B>S ԓ=M"I#:AsZy+ =AaJNJH KJAΚYobἚ`?Fᦏ+t*j;7x!җ64l(>J[t\fKkc%4HVF};2T4{*>O4E?b*K". arܫKy˷.Kkf<Lf(SL;"h aOfuPߡP $>uR!lkZTNOZ :B';nƘ̞c/hP>cCvdKEiIbv?E3,Qk9\TY*qOpOʁ#q5OZ!zo)Bڨqʹ/mبnߡpOց~k( 0G~arpR}4 eT&~! O r_p (!CA 7ԅtWs_йgW Bnw&|(;"yOus;0 ] .o gZÍEqceTK! 5 л1I蝖$MdW"QbD3(LTZ5֭\z 6؍6-5Rqv@!P.@< s>|ȴ q8 *N+ w7;en-Yf8U5kוk۾;˞ 껲]8LE*~w_ހ`.`6N@YanX_Yppb"Hb&(V A.c2Hn619(Xc>dBbD C.dN> aH!MeZne4VUXffjEGkIgv) 6x h,d%.hΘFD^iN UJnJj*M!HHJkފkk lKll.l> mNKm&nm~ nKn枋nn oKoދoo pLpp /p? q7vV F"$;[$IZmɧԦ]ēV9Wn $}$bC8{7C.`] D1 pD#KL@V(X f87Dp:T1Š!VMU(AꁺyVpY`EM<. Hz؁ yX=v`, t@ϯ`  ip Q`0XFaZBh*@y] Pv, p܌H #gIPL@q: E@c"$q 4qLpjUp0pV`l&v/|u'9g ⹐ 0AA ptg0,` ( $Z" +A*`x*Z:z@XI -$*@`f `l p @ (Ȑ@fh tcepV )kYp֚,MzV4  B۝ fIKtnkP! U:&D8|4& 34" YY)Ā@K д`5 l$SmJ@.| Yp Rj*Gwhw B'#淶01lgYي@t@@ ?0]A\$9wgg Ř9ܰwop`{f; 雜@y挮S YG D9gp1$lhFӎ;<#@4x '@n0 KC@7 a< p P_30Laތ Iq"@i` /(s 5 gi s0 -\MZP:$MkH HDh;H ĂP @tVlb.E` #BH2nEhD6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZq|Gvt^҆/aVǘ@܂L43t"X(-& cA" RrzD"a:j@g"ExG;f@<@91H h0 `EqPs"Y8(@9>#`?%DfTFNle#&R GP w@A(ӎ#xGN'rTdD=:|T$ޱdX5 Gb c@Da mD`Vwc `BDZիft PPԉP/lڇ`U U^i;[\tg>'"eT :v@TRD(=߱ ]iNLӒ"\DhuKeE @!C$-UZºDm,*v+wa"bxG3 i3qĜqwB qn: r\4-ikN#ڝHp)rv"@nEkv"xGrk wmcT$qzk&)T7!}D+qӠBBGJ8=alx"pLJ'rv;Q&A,m`dB."ň*e#=NlY81~\Z-݄+1.&\H9q">0: g0TOUv~, wP"x'cDب6PmE IYPԁCY8b9(ue~c9yꟖy@1ZJ@D~ a#[Fm6h)r i"S巿>v KrLwyaJ mO<`}sKqyGdu ;RpCa W$bw^ؖv"xN_$ x4hA wt0EyQ;p+ eGD5x "~jOب'QDٿH?*Ca;F:"(CEpհH )09w`0Gv::5?Zk D&}ڐDdpQ>{aTCP]tgmv}l@_va~xd0Q@ EGWY0 $8 yws~~'bpX'v  K Pc5%x&G7Zp pQg{S%$HPk0 Uy,|)0CTr}@K8 DqXO2a8~|SWPy~ QEQ (PǠ1uP3k7eN 6EWPz`rw[ ݵJtxC&yF6iZ0F35pmqy"M䊮#͈ϨUX\1_ָ*](xpt(XXNxJ!iYИ쨐zpRYyّ "9$Y&y(*,ْ G 1)4 KBE9t,HJLٍM)ARIJVyYyɕ`b9dYfyd0 VSP xf3`$HI?Ph8I-R0U0S(pLR7S < j6@y+* b( &!pG 4 IeU5Y8yvȘx(}`0s 0t+f5 ?) H0|;5pIIG2`>et3AQ0 0J`  a WpfQ.1La|8ǚz&_B04t  0 V`c`SpA Plpx ~ Ay] 9l @ A乢#Z `S0mp P'LvzʧHO>J`*s4j8:p*t_jT ک@0pA z ~zh JQaw{e0 0J@Wѐ&P@Y cPӺY*9 0_8GOg욗9a׊J@Q *s! uhjx d!; q0 PAEĜC* fpQk  ;n`․{? , zI-`9і t0Je 0  0pt0T# 5\Ic9ZУʮ`A+2@= :qp ,^ !1 R`0Ġf_5;L}`+ 7;Y0!:Y L`Zd[s0ecJe0 '8wP\׊ KR!`6C^+Z:{۠=kZ п[h@, ,{6۹LK{w EPIYuzK5`ZyPPɻ}D ,<3h]@|Fa Ӱh f7t3)+L;p P {c\{  e\``,a?puAGpk vJQW MP;;p6;;x5EljE,pV:_$ f%C <ȏ^nhKXX Ll<+ZL ɞ y칥Ǣ[ɞFij|3WK;S&Q =a „ IQ W@T !TkaȠ ?0Qufc={q $AjY >>.nNaa!I.Zq꥾>^Ĥ"ߴr370 _{}` %놾Q5uSeO!1 @NW^t<0V7'YY0roO5Ot aLA#aY8q3[91I #^Xv|;fr1[F {O> 1^:_k@(?x!!>1Pj<@:Xw{qP:e/c ;BEj2T:W Um?1 xU>JA Ovj*^פAPo~Y &6^`1:꩟JOI}s|g=A?V"J4_JE\ʬyհ&@6yYwwɜHqWx5qwyE>r'GyUr6C 7w,Y C2%%BRWEr'|( s7]DO?q{N /{㭪<" ;$ң%]+Ռo_O/҇('.tcoGl>y#xCb(9v*ޢ9ܑU4@To#oy~FXcB6FdLJH# Dz[A^<`AQ$ES슯0؎XzPgeM:( l4 W`@␞Pň6ŸCbܨvkm h݀pF8 (ps8BT6A*X\1# vA6XI7XkF!JtdɰLȗ#!8 SA{B@r7P룽"ѢH%iKs`5C PʰS$Eq IJJJ[E"3=0SxjX(XY[H'x6;|I[K6 Sv`ͤ#x[Qq:l\MllQK!N`{Sʘ8"|٤M6q9L>@ĎD0#4*Mϝ Gl7Y8 Y)Mh˜CVN Q0{b(4*Iw%hNO&ѷ[ q#{O!,h˰;11Q.B =$2r+M$]R  <Q雗0/"Q5m/là$ITUYTZNp "A+BeuHK7s"(:!Tv ;3J#5X%/%KT/R)}*Տh%4Z6z8#/B0ժ1eFRBLTwVYZL U̿YVSTs(TPM!kW8(!P;Gxe`mACיIJeA0m(l'V:{7ub'wp7CUUY>pXP{ ;R*(H*MmlXa(;(Ϯ5zZNSV1f͗C2m .٣RYU< *kX:W1Nىي;s8T8 GN|BWUۮQKjwx tʒͣ˂4!Du-Jck"XlJ!j-/s w-ٰk6΍Kzz3d0u 2髿:SUY͝/z!b/Z_ZÅ/\Kq=^P"(Z!5 u,˽w#U/w聮3a&e22ee8Xiߡ 5MSx;OKn03 ?Y3Ut42U۹5 }c3ð0 4`PJK4LFS0% nX18?6o$X'T;ZK=+7v6\v Tc6 \DDce\{su+ ?tk3 @&cӁR0XHc>IdpK[JP8R6SFTVUfVvWXYZ[\]66Pde8@c4*;f*Bif'%I0A:S8k8U,2c_g8tp_X<8דTvff&=:ϒB%范3`'2o8{MV[|=mw~;.]gvYPn" ԫ(i8`<8wi!ЁxlC*; ;>C D5tn@'K%l'\m0mt1\6EIn6i';| nc6jT Ш5]n=նS!(&6830H!G@Hk̝"j>^ tǬ_ ՀF 9oϢ '=:"B.@]_1wHVBxysWvxBjP*2iHJ|}9TL{_FH „ 2TXȋ@hh"ƌ atn "wښUL6Ȏ;nҥI"މ!Ȍ]Dtmty&N< v\LN/ \j݀,L=ӝ WfEN1#z+v@3.B( br-. ay*;%QX]i%wߦbmPA4kڢw\XǀWY 9msAsa5]J>} թ!;qȵ'ػv0YQ7%:NN8LѬKEPm?Ŗs @5v}šJu߃6+vg 6SEv8A|؍ &a]wB1.!""ቾIQVYweXeJ+s Ae p*S#UQoB N&өjyܠBkM(i )d6@9HR%UҠ * Fo4É3h`ViEjRp:0΄;,FTI9@;괒 X˴ %*kE: E$%o-(h^&l,|;ݮpq2Z/~+k|1?; CN.Y)^{ hj7dQ>1ɐ;[AGW;4;_u:{sJ6AߌJմgN+P .e_gJX2-%]vAg7P7w;L8~2 gõsͷ%P4YP%(-&A-PUۈQ{ 2Ow3++vZ̡qB@\1%Ԙ2ᘑUuZ¸g7h<@ENz"&tDbS ~w3( Q ,A3D>(DT`t| Q<:(9ޱ n) C(Zd~T"!/ .`pf !s`ab8C џ%28D()RV"-r^"(1f<#Ө5n|E<;91gfD)FqcC@AZdBvM q#X#v2GKP]ihTS1P%N 0,V'GN*OJX &9Ajz7&4-yaN3:D-E-frE+9k͏"I=H0$BB73dM&{)'e>:TPrgԊE^͐?b]`X)OhmӞBB_ U, 'SFm*`zZRTlio2ͫezVat^= [β6AεbN m0*[RU%mmK}k~6}e0U]*qT^5=w+QʛnRvyVkЮwVp^'8 _jR%uzM]GXnJ'?x/jr\_.KA/ y^ n"]}NVR}Oaثk\ +=#'ϱȌe"dH`nOJ WŋޱζDp}{LQ5Yu+ջ^0 =5j:KftYӺs]5-a>61/e3Q-acӾ6u]mQf-⚃&e-o-,]rT,sK>=V_|{an>6Fxp+Xװ#:;|#1 VލY8d R!ѻu+qep몸v7 ~tǼ ta)O-~,VGײ^w6E{t*z?~XS^čCt\g;Jⷻmzx71^+s{O=e{kUyb}R/w(k*վ^q{y|;?5< Ȥ{,}n߽rzsuloLvښ"$$V%%^&n f"'~"('")bФ@ ()b " @Ό@E% G_ 2+"\ |B1&cF4` LQ-@F\XB`-NA-@ h  #'9RУ= >^6 @bM@6f -J L@@;B;c)@@HH$F $T Ŵ@h#F,($?F FjvTqǩG"(@$X4SFeLReCؤVrA@( D<x@T@Bx@Y%Ad@AZ%$N^N $-@UA\\-z@H`XYe\ff UVFR 0$6J@lʦHEL( 0dxl@;--tpAbdIgqV Bqf# \#6B`&'@ 8b$=bodpr>ey2!ea% k |c~-@gE-@f,@ cFAT@8 @b@ZH@ (=& =6.Jt6fvhgNr-n@v@ #BFx=.A@RX鈖&! 2~6 'nĘmfD TCV.#h@`g x@#d@ bvޢ@t "DOdBhF bDm*FV@;R()i;j^f)-&tb#"b Cd@* 8e@P)6*@5*q r@Z4+CB+Ab ܢ2D""*f9b#NV#z^=ع&RffZD tTdBR@ Ll @;i |)kvkZ`Ɗ&E,f;^-Z)Btǖ# +AD,VlE,6꾶,@R {ڝ:LD5gC*B8B;C0v0yX͇,ƻg[D;LyryźF/w Ax@ ;tHn/|cSøŷ;{%+|;4AxB5tg+NGK܊OAz6BT;ޗY+yٟ@LA{9A;4W~'_ϟf\իT޺0s12Ơqֽ'_xڍh7Ou?`;f gFLq|4mIB8" Ywz\B0̂׃u4hvxb2܄!x8N ą%P[ Ц3x{8aY 1v@ 6 ( 0O!&B2 s`ot2N #!A!J^pf*pplk#:H"Fp*NpFpb|/{+(P p"p+Rf6nC!f@<#Na! f!ʸy@!Pp!B5!n"aP5.,&4 8p!lA3p"p&d"Ma!]I3%("#!s" h!>8R!sB$%B"%&C[ yyBlJ%" 'b3B%+B63,iM7^7 8ӪmYH5 Da!" d2!|!Cb.Bh."2i7'=7–pITb!2a6*ĊdA!3v @R@ ԚIEʡ$b05bS0 ~*ɟB@s")n Bӧʤ3G*$ʼn j2zx q qJHɩHRkH5d2!4RDQG!F,"˷"*JsJrbr)R)䋾>j(ځ ń~!(d`!(!bPPP)OA5TEuTITMTQTuL!z(6mUivB "2taW'(J)D`QQAkS5jZZ'? .e. HͮA @-B\ZZB/<#MA4ޔUʕ"-]Lبe[`m @A aJr bAC!&f,be.6cT!KZF:䀦ĒU3@uD;&D?N!8ckSᤎd'b`bˎ0ߕ,AB(!AinjͲjeE`hF A$g66|"bj'*.jOVZ ]%l PBƏ psMm0[GI߁BAJH]C4<bAHM6o)B  )biD@cAE"By@ze1qO-\@o}Bz_m,'u"Dw{W\OM'N!j€Q'1R# j3p7\2w&%RJaN)i+}2 dUu6aximq8uxy}'rC$CD4*#!j8"&u#gd+De잃Ɇ|8?R"xD`,lgc:f'R7x+gAÊh@Nj(b-B4om7%Ida)nP'l/ؑ-bCz3S 2D/2FxY=."" U GAa ((%b|6+JB~xjdwHYoBXB)#{>aRӯXS@3lfy9@ۇ|*8z'Gvt2d#j%V(n;63(.6ɇya޶S!ƳW7*^<jc'aZ.g5=; U/Z)YL9YZ!sMzbi*(+{H/oK! D墲COBOf̡k54m>/8}K!r DX" O qďckl&y!'fůz+ԊJBH˶ٔ( OlǡL uz.i̬ð. vk[¡jc9**UGV))0d#uRaR9pR!|RAŽ&Au̶tV&2 >@HZ Sy!'J3\r1SOr6b *Q](C. +^o;WVG%܂~2QaBx\r1t^yG y-*u|w3S!%i5 BE9~! gԂtPRT8*IA ?WW(uD:ɀT~'VZeb0hiJM"MhLRfI:V!9@Ỳ+Klnz(Z.l>{‰^m:|Knb3YRΦKoދoj pLpp [k / qOLU|qoqf\0Lr"r.-C)36Bgsʽ8aZ i,)\?[ 5pNGͭL+xuKt՛vud*tj Qnw˶6b4?j"v.7lS*xJz)`IS ߒ~;O_}KC_>qjH֑C(쥛r:.n>yз7}bƼs=pO>s TtXSwZ(ic׭CYC}d* 2*u[=މNI& H-AYoo2~T-*#^g[ԭlx99{;%J7KΑB{)R÷p GPnCv VĂ&rKb*&ۖ|2K {GlwVs7lطčn0a;Ģ;$y桗qQA' D;Kp} ycgy5:$hP[m Dcr !܊;LW@`lr+ߕhI8*gj@|hLAtS4t8;KV8ANx;Y;p%AIP2!4&Y(s95Ps;U@8sL70:PNhY*稪њI99`I9YeAC4$$S&%)>;NA׼@`R,vhB*;|ӎ0\ H\Nh*sv :㎭Ў9z;D: 䶬{nA{A@2zB= )͒n9Hpe ;mJ;;N5HW1?tz05<xG',E;p ;;g N6vqW5E. %A]Uhs:HsL%QsOE:ӧ7$z^!q ^ .cKz/Xxuo8)t\x.@3du./Ìm-3/NJh3ȀIb}TrV_xꭸN:P&;HE8Q @0FY$*ND@D2!Uܫ wtg0Q }; ܇/GlU[UֻcJɚ@@M AD͘4g SB&ĂXr [ъv;X r0Lќf5Ѷ˘lq(qS"4 ':BALo)~dIo f8@b69-yߨ2gE"Tg@p"7 "Ҟ~IAJUV~W]d֑!j[)ʼnӞT'3XY#X$ncp cC Ґ>p8 ]vtشRAMhA(3`TU<s!~3[4퐆@6$AЪV}mlAbd䍨"w m۪Bmk:,⋫ @}BY6Ӎ3ꈅ;sÆC! ;3z:0a 0~  Q0> ctpƃ a"4I,&Z0q`HDR`Eǧ'Nx&qp (w ]w~y~ﰆ0a9sHA fgq8$H8xy 7Vx̷"0!'N[V Lɚl#燛?(vz)v(f`!z'uy*'Ø -$σ$e٦ ́$07;ٱFA Aa(!F~?rݰf02iRIqs2))i+DvE9W!Ć"J(**f02 `0Ǣ*Y2vFU3 3 斍%K_` R 0pf aȷP5]@6P #txFDNX#< aOJ:CZp P@ $ Oړl0 1燩sSZbZ@b@ I*&s P@!T ^PN-KUSݐ/5۸ebSOGqJp@ m17+감8y020 PV xgVh!\~⨎ :ǚɪd0ʪB~.w Ѱazt 23zP~.0`Q* 9[I@pA2@gH[= py]5,s eG`gV_Iw0=薱A[۵Unے<d%\abj{{k~d#[{۸;[?VUk5Fdyu$e0e 1 `WfY6|!e~8tmP9dei1 P; K !{[ V'8*".a6 CA$K;K"/2pIbK le5E(!OlmQA$" UV[pn L{b z!o! .Ÿ)k&qvqGq7!MtQWtG'l'Gr Q-7BsŌogbu*7-rq+④Ou1 RPw{ܰl6nwvTl鼈0@#Z-ZQsT"V"Ǥb'Xww'x0wugwaZq!%t'7qwqʭ\U1L~vwo4qFzG"Uzt"W2eg|{ 2P̶z|G){1L,sb/1~70 q?{@FC0 xG\}p6B9{ !|6{ϐ,6 X }g< ,z@zM{ߌl̇xx5qF<(&?X%@gAXhi[E}7\; چ$A, @;KA34CqYB+@ PUAi¢gsl==F׈b@S$>mN}8ڢB=r]^=`-Åe?Txu(]X W:(=!l100%=Glpᝊw7l G }]%Gap^G9ՠ90BM P9G40q ޲j ݐV2GA"PÑ-lG2-93؏2ӀXGI>K=]B9^cNߟ(DN6le8,ԌcPgԑ֛U4aX‚A%ZtoL&1%)z >Ϥayǯ  P] ɇz^ns &(&NaX1 5K蕝I!jg(ZIٚ FlF 9IƐ)]Iws8 ^n ! ` C~?mo.qYL;У1ofNڮAJ1)YgYYAIDOQ aK ,(JYfp f(`H?k,$ǫ tPkVn߼N A;u4KO >/:DoZo?/6hj?O5-*>)9A`|ߨJ"o qPP E _~$1Z8e @p9f >QDã;*^kٻwbrzn3wp!.KU'$ CwB(,ܩM?4cݮޅK5;b?Y!eEbƄ;~I/ԕsI9q)ܰs&~+T忏(wxw~e^EBa{Q1!;'S;6 _W0eӔe*\g,ucE`jCp-sA+Zʘ7KHXwu"@q\lְ;Lsk])TBH[6JP$uܬq]\'ugx{D C/!rr%*k w qBa_ <氇R5~z MiN3" Y8]s41c &:)3&˦!pW3WhNrNXUx+6k8 4pشP*M%rK@cbbK( Ax3D*y`PgNϯ; g@Ƌ**DϔˤADLiŌ.eE&Cj!nK?>g غE&ɪm`1IҖ;+!*CY8ҁ6$~r+9; !x+"=7pmI.,0F\E]Z ;@n58N|dvp6k@0$P p\vұT >IW:ӝy?D -~<+o9ܝ0;2ecV{;4Et#4\CEshHhpץiO(g>a_t2o&Dq9oy}*) ZUS.Τӱ+rSD`@bU6嶯,G b:1?>?XIP<А?<۾# K+?#;SHpˊhykP ɸ;8RW j 7$ /bn)>HR ߠK (2 ?iڠ/]h2?qs{;8U!2kָ m+ ސAhx}[; wB(T85w) 21˒\@/aw6 w聴ᑅAQdIaѶpABfP!>n밴^P`,E;y=!>! 4ʺ2“M1I3老5a1ے%>kF>,$:3y蘎owERDLG5e8!sBLcqGnڦy贓DIr"6m* T6SdLh)J(_8J,(sx5ʬܖر*Jp($RJ,˴T˶t˷˸˹˺˻˼˽˾˿$L/K)R8(,}4@aI۩̏Cs̊I09z̆Q>X8HOA˧yLIcԫMSρyPnLLfP?Xh⌈XhΝ48 X| bKV IzYKmtOjANO.Ǽ͈Ni9jLЮ4~8wϸJ!l Q4{'.P&)HzنoP&Q5幝NЄ(P qmFMM  URLrap3_x#Ñ!:@13Ex oKPpQ|E-M#730 K2ZZZrGHu)[λTPE-$zT0,-50]J*9UABBphKO I%j'RԄx Sr#8UcZOu ESL=V9uS*&hŸJYmHuq0tUWvuW"&iEmN1ԲScT! q40 !GhJ״)a衄H*~Z%_eɌؐXX] qmSx'zr7rPĒ 1׌u)\fh\X&` -WX{]r%X*ׄS:QY֣VT&H \Z wXZy۸+OZ&)0m;ҟ :?86>S DXN 85'\Ώ?s.!<쐖e">N9iº6VMC9L[n[:訦jqv`VxC=DȋbZ W3۾-F&PP}{S0 IX3ۄp`@t6ldU<7>ZI\ P h^MB@ uhd,wC2Wo囙&B+GwDXD@^&]bHؓ&iLX&E7ʈE~ٜe ȅN|/3lVA1iU}-/(  K 5b=>!'3o H }1ߎKseGpY]/Wő/5Nc Q(4WmMqneq-OQ"IP}edfuj4@ .hUW+^TOI^VbG^IaxKٕtdNTc)I1Xv)cҁ~J\®NLф!Lwi ˱tفu#zJ'7GWgwocDLxw]1S͎<_ruip!rw!uvqr(JfX_e6zeLzMǼS{}ozM;>z ʬWyx15'{S¬ʰ'z!u]c:ۙ'"ubs>Qm]{pI{yyPgz"dB/!t:^to߿_.66pOΏzx'~Y|D%%y|t^_/هzoNRKG̷~ OPK .>?Z'9.z&NWwmbfz0 p ,xaÄ#JÅ'jcGG,iH1RD%̘'3 2IܹQK*U@-+24dQ@a.M1$OLA.yիϰb>,ǫ"3ZLЯFb:6WXK3͜v}ƥZT\Eqӕ][/{ly.ݩ}G-ƵM'wgr3~hںcM)hQ cśSF\TEL;Qmsx7x~ox[W]oW˷-y9zajkހ :rn rg~wʩ]O:FpɝpA %ڼc㌔׊*fXUY}eyk#a-hI>dzXY>y_YY[,塀7Iٗ8tHf'REbG} Q9OG5 (iiXb鉺M;}ʩ|U 6s vr*+lz++ƪ ;,{,*&,:,J;-Z{-z--{.{%.Vڮh/KUJ澪 ,쿚0^ ,{ji\Җ0q 0jmj1*Xb璛|"rcluMʲY1[W~hi`\Q=7!ѫ\-;}Ƃ~ vX Sv-kڔfNǤ 3_R/'G^gCM6@B{`bkW_MWzU[[Ή`!Fn.ܓ3-笁f* Ț?M:>bMz^~9Ouart{z^]Z܇;jMh ;EFA(do/vq^h&o {װ=.~%Wݍ|#磬jQzжN)Ův" qȧ ·3QR(94Vot+ݣf9)pH(1rO ϊLFGхiUF@p'di6Ilp+!}Vv2L-B5xX3HcrXL%EXj"-/)`2+%|)L 1e.|&4IdJ֔+xmr3)(ApnQ ҉f@X``bi}B@A . .Ѐ`j;>``< w 2g wϕ„XAG)RKF < `<}^0L+0)\F2RK"t@ x0**0i*ĨPzӝ@#SX+TZ=X(lEX:E\/s%`$ @@ @F0 %-APAALZղvrKZR$+P`ĵ-A.A>UetQ#*WpI jG [4;7:ygxVb%j]IZ`uppSlt._ fCMhW{4<N8/; Ѐt8@ P p LS T @ TxH DAP+gyˬ=nQ5<s]A H:/YdT tq2,*asiEOO9H 5TK 8P@ <R x2Pyi`L Iw 5T5 ޙľ= Pb=Z~4Dܕ(߉n RSt`<$Q84޹l| mQ!N_{|Yߺǎ\(פxW.xfߴVjl|XгS@;UR'S }\s`' 3"x'3  iT`z/ßH}=aRk 4wv[QzB襱{G_{__&ͅA ?' k?pDMX_DA^@WX4 AߙU\߹_} eI,>5 |@H `LS<AMZg@AA ܁UHt@<N_9n`|ea*! `DE@ga! Ρn RD tVID @  ⭭! ѡ%S%%n"'fH&"L'(j8)"1"*"++",Ƣ,"-֢-".."//"00#11#2&2.#363>#4F4N#5V5^#6f6n#7v7~#88#99#::#;;h;=Z>T#?##DAx| 6M٬ர:A89DC;@A;TB;LHšI0' DD0̤9AATOAAdL k:1AdQN$x$SH&#D!xAL%T@)( ;(D4HlBJ  $6$a&%ؤHH;0; AT; 0|4Af: 0;C,;A fafbFZD]%;/ea;&a&bD#:-$$p0q$XI\m4heY;l@`gWω0fA8& C4T:%3D:tI@;8;X'dئ]9CD6'`H$;C3d$Qh\9+pg1t::$ CRffްn gA;H}~;HH;$z (16cbh5C&`5 JfH) /|C; t,#;AN NR (# NVMꆑ")ACM @5<@;C2d]li &H;D^hAdI:[[M >,jj&;|&B; 8TV؛r,+ KC|zꓞ08j/`븖lV˳,Ԫ]BŒ*ę*+hC(tH͹vZݩ€e&C:΁1xq8,8Tϭ+2dBe%7D,𩧺;DgA*I l :mbӈQI1+FBwsj6h%$`A%÷:k:C:TOV;B*;Dh14 m~e',x-~nID/4ĩOzF@͓, ;tCŮhB.҈$Nh*I|*AD;`HxB5*lA.3CU:@!H|;h靆E/I9- 0/g"! Fʺ8d $e|/A,;e @À.ޯ9 C;hHڶ+.;Dg3"p01ʄB+:+%;B+KP-ALq;)BR~nzqk*7<&2&GA;$A$$(Dn¤S$T,2a1@:ÂeQ$hSD ($AZf&p/7D+$AȀy 2,(Vq4}iA1cj\n9%s{3?#B3@>@4; AB/B?H4H4D#EEW48fpFwGJH64I_#JJ45KGLoJMϴ344N/#OOW#X5QQ5R'R/5S7S?5TGTO5UWU_5VgVo5W7uO?u>uXYgHZu0}5["\?d\\s]]s^tX5C5`^Fa6b'b/6c7)A 8@6-V< Ѿ$KA-+ K C5*Ìd,-Sg#;Yem$®6.2D98F6u,k&C9CNR%7CdBO +_PeA\eL0.MAwUCrsG|_2-gs>gnpq@2 s[~$ 9t9ll:Ă1; Κ+ЁmĀo 7ʼn1q~ka$AxIK8J~6LԸI 9A$Nxx8(-4C41C<5Q(D 892M EHƏWDoӚ)A)Ah999$hZvD:2AЁ:Ă;C;(f9<; #1#D(CW@;zAC t0J@Sc:I04`)A6,B 'h6 L %D0TCA**|}ti79:L2P77H0{Fqz :{¿:D:𺯛5 k2+I//<A\22$p^|C3f4,:A;<%2ZK,inC4IȂ,pJx<ȋ@8;/|ɟ|;ol:8@I|̻/)3_}Ώ;8PCq3Xx7=fp/ i(]ꟲ3gK=էI@;+B'>lR;D/}u<ԛ*tH P]OwX)_ rZUS*Hj8\o|ìЋP )D( ^ޙawh>T,2tl:DQ @cGm5&JG j"%A1)C";P s!mQ ѥB`eUށLyS ׾ ,mqfƤ ~Ї3JdtO,tюw|n[V2jCH@BqWKCNB.q$@>8pD9&(0@1o&D`xO+Sg=ep3!c,e@B;@P`T ZXccƁ{;nes+E;}$gLc%eI n-\qz8Nr P4Iݢ)Cxw@p)kV),B˂X!+($nXs|4%E6R h0a9MzDԨJ@CDE}®ghF҃z #% @B\f@RE(A 0ETx> mBA:Q-QJ=Dtohyn:=O B5QT.MuSUNUUUn]WVe5YњVmu[WΕf5C W@: |j Q hȨa! ^;|;̒(jdOZtxHQRK E$JS؂bHm&c ͬ6K[J9K i0. 1m2b˩Htg:l j`ffƊOj:2xKw'TS׼ApuC o ATFBc&t\ <#+;lGL'D1I˩ A|#"qOE9<(08fn &{ ؿ%HrZt8H:10r\GouE3١emj`,d1)Qed/⅐! ͎MuAniAvm`{Gt _v2$;vtp3%MiK_ϰ/Ap9dWa†4F!P2ֳN1ˆ\z k5 ;cv,(.u]]d&1~l(6JIeŦ;l+v?$+w F]F;#fDdnLQ<)\ֿAr%7}B[G &am(57Wx4b"}u(a"}4O!Gd#$xluoF}@FZ(&R*zqr=5z²kw]_ʗZX}04 @seyP(63j|} }ʄwcۂ;f"uqD'Zmԏ/Nfy"CȆ(Bے+|"PBxI8ȃ!T,o Ta$h-Ho$gq}h)$\ h# iή~ H <=v~iKr!Jxp(A:ςQ') tb 0 )Q-R ,  AD* Ѐڴ tNSrb-v A1tjn񨈪Qv)!h11q1qѼʫe*+b L ‘_-&Oʘn`SqpFB*" 9bS _& ԁ2M~ !ZRAc/ڂ$"B.q#;ҧ.abʶpKnHb#T!H5&&j(  &b'M$Td.@+#EBr)R# 8R,%B#,09 l#/r+ق2ע++-/gr Q h-Gނ4ja"%j' -Ԇ`k!֡!i~dAKy@rBj|Զ"tKto^f^=N+BRJi>$!GjtM4` ,HWm; ֔KN;J!Ca>B!HG)uH xlBZ#'%&bޘ,N'"x'.("X -LmL٥"b[#(#^bY '3yY(NQڰJP)*+"0DjBNtդhZLz]5O "bgSLKc!GB衘cMomЍ^pFl4BYbD06)#^>C?ȁ"Xn\ 06?szk^_ݓciiu`f.2#"(&":c%\/&*c%vϺR_kV_; Laorz().9N*BYC hZ!Bag r(& /#V O)e bU+ on $PL^)VmQl&mrP"#)_a')X Nmeb"zñxPqAGJ5"$yԦr?F~ˎ!Fs[Ai5yYedZ!+ a~e{bXd`"/8U '7zyyzwPo_eb~o`v{,ExRoB1c7}g8au @2d""(W<g!4" o"VG)f"F5_r2O 9Gjnf&B}h&r&"sP8y%q:ymX}"B~{&2|xC$*' Ѥ,k9" yW)ttL &%\we"z"bʡDSz臊jԡ*f{C ]|n(N))J5Yvsk>{Xg'Q>[鉢YxTOBf8L}rńX է ܬ}Za"[7rsI+ 2'Oa#)n9m!I#ixMj` Ob $$Y@N4m9vd"#o i.P#z_ "fJՈOz;+NKo[ΪKihۑ/ VeKD}]@l1'yl¡`2g{ # \==3jLʡfrI}@n-{o[7Ŷrqj+ļ{Sv`+bTB۽Q{ѹ {N R;(_Z#p/y/ӉV;?[ 7ŋ \ے\"3\v1#Ǜ{O/׼m3<ѫܷM̽lѥ|VW\< ·ϖ UϓA}ѻQӟLqҥXÅW]X-|ټTp @ѓ|UCэ}ْcYc{m8U^ɍrrϿ}0=}/9؝Q==s|uy=j=굞߰ɷCAJ컊u>>ދ>PޭN0i<{.R> =a`,.>PA P`_); Ź}'e(0j)@Vhqk?O@?%v@:@٪uSճG½J _?W^+~_`)"Fjr[ Kּ0~@ ,x… :|`ć'Rh1Fv\qH5cʕ((,|sf͊ D  0X Np 3@) B]:cҥM0pfz0i1(**ª1L8.ǻ'Y;Ş)y `2ގ}A>|yȃ\سaΚ(:j.v-kآ} #H n4@q{\s=[@č6rәW?O2#͕ST:u#xe#K|XzH/|P#p',P@? + @ Em7Ђ (AA*"x@'*ArP@A /@Bq+buAW&eVDwI-PTNYeYY|efߘibUv) ɧ~xІT h01 `P dP U*VŨ iA= PAm BzBPbቫzYZ~oZFa"{+H&fيT@i-y֡ @}0Lu;)dEoA6Ҫ2.K(gm}Ygֲo:|Ѵ1¥9Kqw*ܐZ% ʳ\vxP$Ġg%|sA.| LAE9jCdIyڭ\>Y1^o,'ٛ<^nTƟ5+6X|z @ ũ~.G׆q0Lj` [ 𹷓W~y=^>BE9kN|jf!G{oc r4OKJT0Y Jp(m JRB#-gI\ s,f+0Tl39eԬ5ljs7 ps,9ωtsl; xs=|s? Ѐ t-AЄ*t mC шJtE/ьjtG? Ґt$-IOҔt,mK_ Әt4MoS#;ͩOkDPyԢ*IfS {>5aQ3v~A к~lc,Gtk &\o,2zsBoC03 ,V )+a;Ј.Y&jG+dtAns|y!8xG2„6Qom ;pi0+DQpۂz׽&'l΢(1f]6݄+\jcx5`1&9.ޱTgfǭ&y.=r3E!J,yA\{q8Pȵjܭ .Mס c:Ncd<18w ]r0/wQsþ"6rwx]@BNQ|3m{ 2S<ݰF'jFI"[8/ kC7]񀉾Ӟ1b@2cbT"r w#cV᳉xXX,ɿ/1 \|Kʂqu @-߁z@V[b+W| tذP osP~@ ZpP 0u7nfuv[7SW(f@:@fwg{qV= !!7ڀ}!cχM38QBPQM}I}a߶fduW4Xpw@\0 8 rS q0`|   jN&h:wNX8vbp @YHXr0 ܐ]mXuz_$g0Cmy}p8 tEw1`zW%w^#j 2`bY WǐUXVxMmU0[  ь1WPe;cVhSGИBZ0(N3`5pmwRIK)MJ)TPxH4tR~B!^h e @2 T: 6us@t;qN; 7I@l8yBЈ%xha %Sr^D6*886eΔ41밣L:.Z\ 8Nl4a T :|S'|"R1tEP:rit̰; `#@C3ʼmN3M3ոM뮽I4 ;ҌBϊWS)P:jNtrsBQh 4;e,{@ˤM <@@垛!,SPd:fiJM:T#֊ɭt;L&*d"P%2@sQ12!&lmm$A-T[=CI`V:pfz2l@51s`=\/w$e @ =FBX%,XЂ 27B0 :QȐKմA]saf Ѝw(P^m"PA JNm`49?$Dpn~P"ü#Qo}CoQ;@i]!%s;AOx!;ʴuA\Smɭvc\A&G{G< ?H9an !(bi<;7t ;"BЁ1͇ "EdKF0.0A hC#saGɃWp, rGt҈ȣ⊰J u#;r}2CpM@h&9dy b $҉w 87\f?NS%/)sDŽJZ2u!6NA@11!Wqw(c tpBP5\^zfwB!+'تlB>޳{g/Kx<{H ӗ8:L( @h%E]Ȁ [ C*0$ Bz KDȝ3Y-hAs3GMF;' 7]'F "jNI5STV:aMZָεw^MbS)Nvg19)[G`@`K% ZI"va0j+&o;bj[ bn~JEw(*0ȋKP wp7\$yxG&<-8Id&=DŽSwZݐo?E(P<S2 fE;qew75 ɚ5Xa tC@C<-#BZdyD/!>#7jNaB3O]MNN<kZMq ړxG(g. fOC1߽9K?}pty[9wFO:~(_RK~ q'$(~"B"w"!!6I(x"CW(tBL" /F ++CR+"7r(010++,5H,e҆+5T/ia0"2-Y_0\zwv~KBKNSw/QW+!2 502QyM81Sz0KK/HB,b6Phz/ &2*13N",Ҙn, 1.l؎+qh+Ҍvȍ c.{(2 32)R 5SSH3J4w8Ԧ8yp056pNi ` 6DՈ8Ces6i3t@ su' T547# &8:S:2+ʓ6Ԧ?kpYGmL'AEy$Tq#s=Iy@ʛ@ >s D:Cd6$F1[SC- .K)T.Jq<ԛ޲FF#nEtDA+KywT5D44E$*FpG  JFM ' Qѥ6-6EW}:P=-wteZRt;AʁCTB:["gzBT4BpE3B$#PdLNEtI=jPA"Ѫ$Tu9DK*([ W: TxNLt vM 0 Z٤u* A MLT3zz#:ULԦNUjSM FƊ 1LJjW{걠䪩TIDH)Q2DQEW<:ur넫0RPVQZ673Q eQOITFE%%p \E"R: q}c;KSScOXUJ0_Q@3e=H qI<QT7bxfhK;0 &USUkS-N[QTPTOڹ"J7;r{Ur ORj85Xc[1{{GZEmW_ G DĀ!!XKVfV{Ŭ[$ӐX? r7ze{ak@,8]qU] ia\ȥ\5SZů{ (ZU`-\gզ![˄]]*e] LQKX !<#5 l[\ЛWӫo5U_V$u1F`__bib.wFn&+^'Ȱ ;?7cd"`paIo w^gq` H\56` p !_O?'MqJ&,*aWY,w/VJpr|xc9bbLf4Ľy`AML0_:bėdCր!b #2s)9. Dǐ.3H؋=.H҈1n^a. ( q?Ψ[N-P?l3V))8)VXYo<~i:=c|/h3SMpeN)M攘y7 ͺn9.e@\` izD*삳͎a IެEV%oՖ;oiBmۣ9@m"0f9& Wo0u-p` /:;Oms&/(;*n4@m;c'0YoGJQ 扞 0)I0rn?-?/ ?oR/OsP;oo! 6Bi74BTD0²J+߶.BKH$QB**?d}TE$^Gjʦn/ӈx !%ÏnSSgIy {@ q7[Hn+PB 2V:ܭPH%린ӻWNz';sb ,]=wPպwYHl2REiMB ܯޕMڀE$<2"̝ W&Ln!T?uZ2p pWװc˞EL4m$WIΝ=;Q܉kw bLl ;6Xٴ+A i+-w8j[ZY5k ~nD݊;;u`G>!J̝N9_DPǩB㨊0!ɽ#)/oVy' :i@~kL8+h9/7y%ӏ? Ibb+  1;Pw諮DQ='$sNI(GRHubѥwmܺ210HJ\(Tmf$(9N(i GwafŴ$O,%t*iKy.LYsThROM!/Ajӱ7 32o#wQe1Uw9eu5UUWc%Zl]5M18cϚSrKQIL,w4rGϙ|,B4 ʃ Ѷʥ5Ryg w F~盄FuF#sZy *E&d~okTv^Kw&tQea2 & )FnIi6iZ G0֘<gMa BFu q'fEa˦ꂰhk7\b+& ;x_yj>x.tfXc 8 &HO5αÄV*4 䑃08G Q=e4H1tb]ס7pHr# `m~x!J B}ށʂ`!BA1L>2$ 4# 7&$AT bLPQBY^Ig9י3#g."y9E8(uq1 hE i))Ry2!!]'DQFzQ(n&-/n m8hQb\ZRJe(TܱjWǂAZFӾ HqIBZЫct4k;ЪV "RgBBu$2!0as(g$MG o\ zvXX&V`R!ڐ̵,DP:uTClik[ 2,P1+Y8m @!|;!v(ϸ4S5W噆eJ2wtC.Ppj^j 2/ZEW;cWW DbjkeҸcu"|I}3ho!2*v@.ۼ Xv칹> pؽ&b:x(+8Ĉk , # 0d9;5!82JCl)D=#$+(t, yE{đ`>9ʃw`Vh* h$/prG-E`>B'+32;AD&nU3 (,lJ&B`@tx6@EZY(^ܼ1Z NuD{G}@g<qI$v;uhd/p]$zq7j@DQOHF8/uQgDŽ Hg{{k"7,oL,dF5{B}/ ȅpWBV!'Ɉi?嚛Jw#윂 hrZKRZ+HDu*.o,(eNԓ9QN{E2ɬxJMhLBQğ:M( !i|J؁up(z5EUeu 5eZ <=]"D4QPgM-!h*Q4 ؄r(J$]uQrb @' Q'Q(R-Qgh#wxх"%&*SWҠ+}-]Q/ES,75@RQ\M5댧t@;Ŕ8BEuS~iDS/eS= L.ebmS*|=%7,p?B(97P00qQպlT=qT'}x 4U*V^=,.Y5K^\Q->;12S_<`QfF6J*wVVV_mWZVgt{|WV1&SY!M5OeZ>?n\je;f6b]^S>!enڰfTDž Vi^"fH 8dBvBp_SdϺfJfonf rfdd;}db*zNgϵ}geHgGҁQaehFE\.de[2bi%%!;XNe\ۓT-bЖ6gmFVz/>b`aah״86i;A]yb-cVg˭af-kUk]cM3IU~M6[U N?~d3F]Yk]gx\\n]u[R'&j&l~hVl^kevټȞXu^l쐮gFKf&ګfmmW>|^ۭi6c].NklBYӔ>ֽNZh _`0^cvcRm~l@^oHXh7_kĮcEn6lj_qjhDX^b%.i!pOk64jMa h6g''bUv2մp$ wr\bN,o$8p0e mi~l!.ᄂFM;5hh=f5t5DGtNpt^CMt1P7uP>UT'XVuKvyZYt[MhRu~>@cGXp&Xd/4fnpyN f H wq'c-x @jfo( X h =f`r9LbgL!Xz0z/ fH Xo(x8x>`vt MbgdOuP(/]y @>{' Xxh7x{[l}I?9&t  Pz0|W|o%Pye`82  @ྂ:?PP?}"{ ?xHf_W0/|'(/(|/.o׷kel7^hN0nlVwm _*ٱ{q%hР 0F  pp1F)b !0@&vCv`RȆ*hA4) a64R 0A (ذbHô-5;E +]gUwnܶMװOo{mx l0B'4s ZZ hpBSaTHZpC HڀBl[7o߰uYg@^C Dl|A{Jbhd A)e׵@*餒V. ! 0qH;Y p0M0HA %@IAvܗi~ XFCl2`r'fdp@(3&S.,Pr[&L .s ppk{*h~H\E(a'hۇ15/L )_.*.`W"@0 -d "f`U0qf,X0-]p@B OcP>gp`9܊x؋vsXy>H7Z?r?=q- OqQW BQs Pfm 5rL (P7mw/&S9AI&dVfPQ@aen!&g~gVMyfj橼rVKf* mN>kfTimoSrC (9g{,H>!drv2u.U*gy牠g bIݘzfhz|}z6aPo_اj(*q*|'G hp*(oRBgzEx(DSwӇ*(X(((ƨ(֨(樎(ygB)'b"iuqgx1tvuYbh aʐf(:*'&FT>SRim͕~iUׄ~ |2be*kN), ')>h&-y6.j6F)<-aꠒ'DmFj>)癎s&j_ ꠒx7Z* u(UREijj**NO+.#&+6+NF+ӱjXf+B]kp6hy++>+ \V $XAL-+h1T Mk5$A+.2XT9dODlXxCmB9C;`bF%IlCdBVMZetYXe>],Yh,v,׳E۴2D2@QŚl$mX@mEfe9t9;К C,;R靅l^۶Wmܰy)mXe؈Ӓ΢H6D-YA߂6բHJY8;(-4C401C;>ZEs(2Ch"@Je$AսC:dO6Ho)IN4YȠ@!H"J@P[;$B7O<4XH4P;DFo4n` IM]C  @7t"cYuZ3;CB884DcI^7dC;4/G\u5Z36V8cJ_.C8;+c&Î v2u eZgPc+OtZ3:vU6Q#-Qc^7c/:Y P"e[]u2D` .'36q_urG4QW]7FYt7]u17U90mJ \ic-LunCJxxnc"H`xCqzz{Gm|7W۷k(c;xu'+Fr;x~aḎ{5;|C3CGøUb8WcE6Wv1xID8CCԀ;38S.Y 7;x[ά3N"t 93 xX1#7Sy9lmuS@8 6YC)1 ywy0:0A/;pCt7P|:XO:Wc:Yw#y 9C:yC?Zͩmp7|R3"CX(z:2WF @'Tzz7D {c{kd8$J(8&8%.XBUB7'T緗aO|3'@,.ܚ$p%P1|L"5;Y?>C,Az:|ci'8v+846YTv}ӟ(,e7x?@40`A֡rΝ+E Y"Vx1#C";EЖĈ TeK/aƔ)ƙ6@XG 1J TfAeFҁ:WB5XiU2ePaR廤=i•lRe fݚs(CTuS)o_xqǑ'Wysϡ6(zuױS(v?"Ʊj:R@3) 㹾^>|˅L[@  <A&*IgwT)PwJG !/G\P0*{ PBK#F %#ad? lQk%I0sy'VqǝFtp&w2 K%eAtaƒ|A&sDS&əڑf hb [(Ai |f'I|om4=UeeF!46Ye@B9 <SR ^}V؁5vP鶜ZY5D> WYI@<I{RU%dPE_YDwֱ%mYȜ!96Yw5Dfn0_a!5s#ӵ( @ 0wk1"r wCYb߁Bfy 9OV=醡LnEɪ lmb ?Mx;'6ygh-u]GLD}w7+߁hO r;jki:҃ e+9>0`UR{)\ɛL+6Q mÂ˗J`5C% dq`)LXW9́v0A#QeBa<7c!)!$򡁘CZ)6 %Yc#Fȱ *\4Tg)HxTMM0vDq2@"LG:{3R $%U7F%'}" 1^b`:~  ,q |E0 bw1d&HYMk,5;)~lejafjM e)OTDifa dM'@.KsxDMuI;0E16ʁx( CRχʗ칵3c@7֭lEh՝O]Uyh9iJҖ\U}tpB )ʞjt\eU XHxG@Bx ⊈ xk c׿([e$FfD,0jqɸ7B r 9+UP2 UQ?8&0E,v2cj6k`Aag0G+W8@0ur(r޶B-  WKTP5B"x6M C$Ӕ~EwG"Fdgg'^/@ V4%6.%Qdh@CM  K)slǨK[,4\u0yQxG8PBf5ͫrg9ϙug=}hAGf:6l =Dc<&Zf-C/)]`% W&V1M]J8 z ee BudD9t4](K:br _kUn,a;v x&5nx,q@ZmcӎuBG r6ݤ4%(2@w@n3oR¶W6$3K0dXH4,hC{I p/so , oo> !"n8 hG!W!#bhfpFl7g Z]?8eôvDa[) [!'pPGlՇ}04&kaBBR'rAA HAHܡBQAlXa ȁ>Dmc(tAAhn=q!$l=d~ Of@Arh 1OB>܃=GqdqCda=da١q `a!R" 1D >ZQ ^qb2ء!la  mL" VN&!ڡLI jhɍ")#b)  xvW)%-, VɎh1m*!k H h&pt|%`qh'82/ b"/vAϛ|2*2%ʡ(*0AiZ܁NI 4OG֩:*nʲ i V)6).g36i%wai i,e4%; b;cfi'{ g "(17s"*6GS&@9̣ҭh*Jh@ ԗ!ʹ1rSB7*aJX|n EkT dJ:UB?@ ;aTԪztns0s~GGP 1ݓ7Lf*(~;| ESTAZBơ0˒ԡl N ޒMNmCDNER%m8n ’afA!++&ĠJJ b%M%%a0bJr ղBKt7C $1=l@##Bb$n$%FBa!ڡ}–2X .[#DBc&Cc l6+%+"J rUе ^"Y'b#B &u[j*12,pH%v!(V')0nOԔ/(BVRbfJl" ~C.R(rYne[g#vz pV&Cvj 2l̜hjl2v`flQ6x("nٶn6ovooc&wpvpMpsp 7q qiqqcvqerCrLc0ws|# r50rw&Gocˇ@s\0s5t qWwu-qqe1zvwyW2\7>t'x#ɰƳr7%0ש)`+{7= Wx{WV\y|tyɥUy#׀*7YuGvWƜdG8 O^{\47J"vwtiz XwBy/q7חG=KA؜ TyW'؀ak[}]'z_BwS.Çʺ8|waXytcmx8miT||s؊XWIWr18wy&d؃uʿOWo |Cxz8ySx7)، WV~x+y؎Fpy僷yCy}7AzU9W^)-~19DA9g9̿JI88aٕXǘtI[97ؚ*vOIYJޘx˩x teәy Y;9O z+Z%ڞ~cHɉxX|ٖ?:[H7]z‡}uzQM7ɤC]({؄HXzlWZ8wzکڨx*Yv~92wwyWaz7٭!7c=zEC9[ױ% 3*{1>.;36;=::ۡ?{,K8LuCyYɴ ۏ#۵g.R> t}W.,L|W@ P%WI,{>>@V{e kN@ػ%x0:7L{:tL \ ܾw@؛{ Z%*N\ [S ߗ#cヰc@ ,`Xa\d|b@W` J L`<` DɋMdȋ @T L@@1 ɝřĥ7Y8\\$`%@a ;<D` [{"=&}N` ڛ6#ٻL-ͷy΅Iί>?`>xׁ]Oy|V7` S~@Z@@<` ]۹"`ګ : (^H+@Qܳ}ۻixkw7ֱ} w<`;@4 {2X`AL^P^ A^I~]*`k{ެ_l[YyYXMΰ~Ꝋ !ϩ~ۻ;cx-Lm9W{:'<@_I؛b߽,_c>@^& 4-k~ oe.;~YXI|2`UU [>\8&`(2@μ"1=^ T Bbٜ)ZeݘZb paWhmA T`g@'2s/5hh E;wYp24\m.wzԫ[a'\4N"woE_߭GG8`+wG`E߁ .܀1NHa2nbIa"Hb% (".c25Έc:_7cBId1IJ.d""Y"NNT^)R>]!u})#a5!Y_:yf~9&\MdEgzYYg 莍ovhnhrWru=8{Eeq ]m)nj\~e(-s͵*sI:f֞[eo> j B^k砧Yck2 ޒ 5rWYQz߫,+/x.z^᮫0|04^:{e[} w˪D"qnԢ7r-L~kq ,F ssZ{ Ͽkpb1 `Ϝqr[3uktO:gԂ6t֋ĴqG3dW|tL3qKfn/J~Րsmwyxn&s߁}am>xa̟<ΨCE&?wls7nθ}zx|Z;3Ċ,:-wɉzMZ'?wx[ηi+5[ސ@p ^֩կ5"ת0ml^.~ Y4EQNetko"1K]ۛ"%pH<"Ur =PzFjra,,ql$;6qtO{t:q| Kw> rds/\f9ļXs mts«&hهJ"-CױtTuG*Rw 6;zD=Z5k*NDB+DFx ݸ-k0;tpo gO$i6jL/ v Al>H!pofc@˫с;^M_ x=mt 2`&Zj)@D{mv hGU4f 5h3fY,s;Z٭hE;ъϞh9׷}Kva08E*)m=r/H,rQp_oRn$VI4<'1˜dNO;jc&s&-usQNzb$/`%2[3ik$`jp6 Z/o__Ch2Ȁ  X!h8!H Xz "%a$h (h?*/bE֡5/EE 1vdAX6 >$)%GBXB17>AUH8@=?\脃Q@ >W>:a8A9M /?Q:hu?@($^|4N(HhȈ舏(Hh)!cHAh^Ar~(q8BRk8>d q8GPT?8=B/i~䆺H-Ahwx ֨lČӂf?VӘ>h^A)7Jt4(EQ󈏀Tȏt(+Q ɐhtb )ia}x Q!`5p P`7 "Y"70 F" aQptP Q I.𓴤  %wW$RP"p_qIy𔥧B5 ̴e!1[d`/Et7Uq)"[ٕ_9auhX2@nBВH/[J`   %)Xy2 bA&?I_x r UĠp sǰ CsiݐZ Iᄜ ǩW nՙSf7@a YA `2 T9jRQ ۰=Ɖɜi^WW2zeyY`d? 1za PNL@Tħ m%5u uUaa [6ߙ0Q a \TYILKQEmZ? 9@R@t>EK թZ@RԡaZ̀ՕfIVAe $ @KqP rz ͪd GGjQIh`Wqk^e iqp 6Y4j5OIzI@蚨l@A  h瀧~J:zW q:띾@:ﰩ JQ:bʰU۰%;UN@nj#(qPiZZ A;CJHZWy=cb@t}p:f_J͙J TJZKzQqY0l[ n P c@MNsxwPqVlX۪YNʵi }KѸh ``٩Zp䠣@},e Ѽl[K5{a Ӑa [Qki̴TA2xEѾ! 1Q Et;K \rqiHR;uQ`f 6yy[7lkb * pDKIR 9. 2\`\1J<k ̴lJK`ce,`Qw̿W4<B Н+Y$mlQ[a a 7@d[XoA \%tz"qp {Ag̣\;<0apمK <՜`qȩ{ʰʳPyknlϸKЧ;KA\Hv:z퀠7T P} V `} lb@ t-zNPn`aYQ` Am 4-086 Qe ڠImK8H=Tb}Lݪ,Q$Y&z O[ȣ,RF 1-Np lRMVHMKyR|L-KAq`]ٴdͶgWщhwL~ JӴ~ƜDŽw}ř=mH1 ࣺ}M}z qݙٞʰN MRy$ۣ& ]r2@G@Ntx= uND7]K3h~Nn~ t1T@r3=qd+k@%&:8ӱ*l9fNĵ#J-MFԺ$S~`=Ic>^pdikmoh>qNH~M { =y *ɒ=4> {N }n~?1tq4Ħ2A+T"PP1a”yGkH^ꂇTlעIIT=t`ũ̙ a:3<֑U@6nIߌJHC3j;d#T& -ڝ%O!ϝ`ׅͻJ3:?8*> 0YPJ6sEZf >"ϵCj}cJ Vg=ij-CqʬκOiP 03dU^ZEM0 >:?JO7@9q^0ڳ:Dm;O 1:s0>_fcFzDolJKd\R0#=5AUe;T K 1]+tr$Bb.È.a IsM5ԙOA%ZQI.e:;g̽k`<cٻNBU+W`]%k٭]y9Ԁw̱1]2؁gʟ5=6K[<%tΌfpݸM9Gpn1 k1BSdڭA\.sѥO_̰wL̛fxK;'o~vwݹf^]|p9|3 !ŨI&[YHdJf짞 <#Ҵi/O@dցS\1򰸚*&搣B {G j9bNyʼnDm3(%|Cڛr%ae>k쬐2pƝ#)'<["Y$3-m!y' 夒I';h WP"!L5QNG!͉ SAsD5HV[uU4 Ӕ\wUKpX%վanX?61 `aGu3nT 6AUmpB 4@tpbykIE_qMv8T };2xʄQS_~a@0lCV;NA%BNΫfR^5WPVQ-(TFbJYP 1(dW`i)9eM ei d 2qNE?쩾w{.wx!hwA%wژw6(w+w0q\.jwG]ǏSW}.Wt0H"j0X-2i}m]nRex!dvUsgy%o{fw*PYk畼a=/v av.U{6}S޹ ''! uF|]/{(pwQlAz$ J~;M:P 9\v&,Qjp6!ˠH&O>2! ^haAcP7Ÿ\$+TaB&'SKؼs/.;HDOl8 WPa Ή&4}{= K@qz/y݅T;N>"9yϖ9 1|}8m IO ջ~rCmnxGB/KUpмMW93jL r-j)M .q;r! 񤇞{ #upC hzD cb8 qxڵe Kv;ɏVYjxq|cp͞+f!N8 @ +LaIcBD" gpֵ9p#-!8a.'P%h< xDK0p eDS5ejx|/8w daz~Aexu9ц͇0p7 0X_hU(0 }=@^؈%\!!h$A#hRӂF0"#0p3BC".a |wX .X"}(QWHx!ͱz8u({ao|xF4tݸ|b$()A 'r 2C "-"n_G=u"  7 }U5=+9fDWb#gq(!Wg1E00Xp^kH:@)X|%Zt09}9a$=)K:$<)er&i&"4!2"(Q0$NhvCrU8sL(V.%UڐP @"Y$t.0V◍k)?n<1hueT(;2! 03PSQ Ð%A0S7Q4Gc-' t % k[11 Q0kR'U //55 =a/%s2ǐ2ey6i-4VNsQٗؠY`SW.A Bʡ+/S&zٳ plh `gBB&:Bb#BS.gS9S:7wA*{ P vU5Z+ J7S4 Z`:;d{!` )"0@e TzjH Ą  QQ$R܁TGd!;<+'kh8¨U% JeTP̈́NQ۞ڴ3Cc۱$v=!T+U` ZF[R XZz&W ,250'[VWd騐j-]ń0 0 MZ2uWyW5z ;Y\@%Re]0@ [Q^{xI3u˸aV/]I1 Z{뱪ɰfR5`6d{k)_l"ˢ '"0 Pg @ 6Ve#vw'*BfF`mOVfhG-F6'j q`bAb,dR50P/X&Õg_=jĿ]vR0p_6;3$(6V||"n%~^m^,^|͊$7~8^2GU̻w1eimc=Ηq}@߭n }Y,w%MbmM.y ]a3 l\W8h.]]-|=.JU=rn~Cn)Gc{SN֔= >馮>jn ek.9~>:to|/԰ů).ٶ_傹n: ^ʾNH>׻OZ|]dJ/E@^R^=D;s?k>NeͰ _ //+/ JoE#!'Z;L+)3ꢡZ' X[vj}ҎW~e7oV>|h:Yyx_e4sr=]- Rsn~=oblh~۸&LoMw}_Ϗ_K֟߀? Nvq?GO1 ,PB .DPD-^dx0@=6`Ą#I~D9QcJMlSL.MII0 TJD(G). )ʗI^ bU\: կG8[fБj7MVeȸ`5ئh'Ӯ'ɖlݢe&;1ֺg~;|cšn}LӜkZ3luPnI(੍爜sS[vxuqn5w_o.mo-d|m4}D-2?ɶ8Hκ #; 1P? ;CB0K0 --l̰ |L߆s8|<S17CQ aJ{܈JJlb.I=J4L(I$K+ѷ6G/DMD7[4-:Rn!C9)]oFW4ItO2SBM2N+H =tDWdhW6Q-uS_-մU %@a!c/sVJБNq`'HJRxH h, @'(/t7q\Qgرu{eQ=N~̓텒 d!1Wy*P 3#)|h>pn~3㔈G@z R6F HT`awZ(@H 5 r@dـ{sdɷq0 R0T5hb4o<){-A[d?@Q WS jQ/IT|\ @ <ЁQ p2PșqSKL &MVA\Jp+ T2_ X* XJU+YȞ>b jf 6g;@L_Xp{^La֍Tw5l Q]u&pׄqUtʻĪvu[S̲ʗfX22($t0T % Au.V @շo[`4>DŻ\&]tZ}߇VT>;ㅼPT>[/qw- HuAڸmoedDy˥<60A|e4/qb0w3b)*Iq+? a+h>w p(]SJ#p\'6vgG{վvo{>ww{w|?xG|x7|%?yW|5OwpW>чG)}R˘lY28&0a e,\jcC583ȑ"3(HQS$1~c<ϽEAw#dgbAcԀ ? ?؄v?vp(#?/? (w?w9hXawrHM?AȾw؆dd{: w aw@wak8%tua(3xwXPw$$Jxvȅ_>1Aw`\AhwX_FB4s$\5,i` Ծwx%gB Axh@uhAfPtw8w0|OQG܁4D8whwІWńA^Ldx< 1xfHAƅY v8w`Hw8nP\rؿ|ƥ{ihK _R,s`ULs`ńE`pHix$D+GVXw8KHgEw聂L i#lgoi voh!I?|Vx3 [?!wX?*{9 Hw Hv0fLxdH&hȏH}IPC< wlƂxFPtTm/LCIꈏΠI훅Lc 2 |Whwjj`LCw0w`-̋,MXM.]$vj˻4K3TB*x]HfxDκE7B(wNΗSh6$uQQFs8w?GN@[qѦ LeM%qx&5%?SD^TUxw@Aye(p\dSUs`uhlG쌗twf]?ڄwl=GfEp]QK s]t6U-mVhuhLv`V E5YͨPaw8SHRPY=YLQ!dX#N!hZ$`C@JMJU%U?<׃HwF?&c@ W@#T,̄OM$?dF0,A1[u-ƕ0MX㓉86 < 5^Q<׭I^eM^?ռ^ 良OE߂0_L]~l_}_јUT^mY^u < $6FVfv v`}. a#,a=aMava& aa !b#b8"V%f&v';3(v)jYPVx?4<3~gcT0F/6w < @4,HPc\ep81j8߳ AWd͊M(rhGMxAfLul: ,H Ad#I [c@ ƅ5B>D~9dXEfJ.cd/0n0$]X0wp!OӔ8ÂI@f I Xxgi9_~`&B> w0dX7sVf`n}f!pgPpfgpP[hhi cx6xy`H8玐YGii0hh`ɒ$$m0 4mnʂhcXvP" :PXpr`sh@^~j.,Ga~jurP6jn?Vj~.bcn?vujjkVVjsHꉠednmʶ;E D^k}ekuHǡ.m&lul^WdKh_(G_@de>oW; YlFTTfhjeon,\p~emY> &A.tGq(novXwhoO.k|gu`n'ɣYlԔiW֭߬q@q mhuxYr(wgxffsp7gWϛT.T 88FoFTi nt(thB 85p@pT@x[ bHdΈgE9utBC/]FGHU_@Z jL$ZuuРH|t-#Q MIZMgQ0U_PVv1N'P Hu@AuuYߜQs(Q@'B9@ō,DpM1T4^xu'x5$6Hk~'8uQ/u8uOrpwx_Sx^wpwȅsu̓b4i7d OIxu`1P'wD9DwuwH\y?!8nOg@UpfcxTUvPȃ؆i Rӓw^oÇxg?y0.r؆a_՛ iK".AiٔO@ݖf'G1|we0}C '^U`zi,PNxW˥-w8|_S_ooP\0 T; &kcE Lvp7$AA &mw\x,R$c8K7j(.J*sf1;O On%UDLǒ@dgP˞\jݻ,n} *t"ذ TW@5r1#͏!G,I2̚746 W( q@ipN,]”9@5aDj\d rJf UhuW~M$]-_Ɯ ;:9Z)0&EMyqPvۙ+yXC]9Wu@SN[Roveq@@ NsNt)6v0&yyWx #KN8;T;^PN;X; N38 nVPJIp:0;ʍe;R$ A %ǁH*$~.QNY@^8b#6V蘈pgQ҇@t.|F!I@WM8ʼ@ ԉсh*a:IJTI9:J*`!q9i`2Yi(.ZN:/eɠڃ A3Ȃ΃2́\ 2 TC!YO\g37: D; + ; ثj60D;8 L";Q@&,+JD6PB62W[~9A5K`GTKIЇ(Af3P1f+%{_:f2Pqc6B*V( îV?k={= qD>髿>>?????(< 2| #( Rq r"¥Ahjpj$8@P(C" lY )8fJ#_ *tč~O7.#oBEwCXBwX^~x9aqy[1 wy *^1c畎n`3d %%Dxᛞgd@hzd"y4ȓ`251BAGiN ․@$[BƌP(uL*'D1Id~x$G|"ā&OE`9 Xn D*͉Nu&sG$H Ir =̃;!K= [#(4C (;7` d!qS;f (eyTXZ8} 6D }hD2vjGQt>PjRs q8:@lp98dS;6!B >;WjMLI$Pi A<эw#6b!XMTd]@VUcA; $b%+MHc^Ѷ$m{D RF;c)3"upC!Ǯt[n¥-ulr.x+|:pMT(xK^$PQI]wJPjr݊ǽ)w1Ba1$ފ@/3aZفN\嫉0.Pm PQM1+K-1J^$Xb(ťQ4$4Ŭ}\v (&ȊɲE!׈;o+P#b`:E  ŏ00_33a+swNiT`d|!%gMI5/dM(C9˱},&=2" (62ع;DI j):@DŽwÚ>jG>dh8 = ]_˪ҔM-FͮsZƺA\ ^ 6^PQnqiʭܦ֦*W*);Ρe5uX$jYKZLԡm-[ wYE$la iY-TSvn|{$wa C r`iBu>P;9') lE$a5V.2fb@`676stNBTX#~ h@lP_z]kLHWKFpJaw<#(r<3OkH_›G-ZMFI͝';,#EC3 g \DEXV&(D%l2hKk!U D0HH}ExDT"^D!Q*cf2Eu@Tv֦\`(; AB~ ]k\ ?ޕm `j1@ g+('sB%bZ_&J:1DÀYUIfgIj(2p- NhZL 9;DD;uN +L A9 IpVM ĄY C^ . HX:W\:FS^n!;EDr5 HD3C<jᔒSJ` ٗ`7p@jW)XXAũN DBr6((^ĒEʠĹ؃lv* t4H "64>s23?4@t24(4Bc.CceCoCr(qDDvyGcr4]THK'mTVN4VٴM+P3K;QGFW^='H[u.t m|O'!0VuZT1YG^v21lJu:l-EtuJZWuVbab4Hv,T5Z5gCbcj7jz^S5e4^_vi'aO\۵L6ڸu!vcvvhF5-u_˭ZߝaNvTߞ^5f'hcvBuWO*o_;\/0Ҷs#[!6vMl2V/vwQaW{v7/+7g,13g @Kwf6oǷZY_eok~Ci`wSBxmwwS8vM6k7 6GCx68D۞T8I7I-GD4K5Ϟ'_uGy~O9uwy mR{yy9K86-Dxٹ1깎5嵟k\ |Az/: X\| @@~99k0`5D:ss:GmK wtOЃuxgt.Ï @ @Tg#D(@SW` ,E h) ;J,Kyǵ| {rkw!u2P@4# 3 #C;Ā $@@B@( 48|$Hʓ<7ȓ+  @@c@ʷ9Sw;M;7w~}~ϴKe_K || ~~Kzo, x| 8x@L_ C@tP@ W@{Scqf7/P6@ 8`A&C!B >(qÊ-1Ɔf qF Mv$I%ÖWJYEq< EL'Ƌ@ `! %X *+XRZŪu@ > ` c˲HQ399paka! /c77̑p)lt%LH `뤱gT)SI? 5(WB r̅-Э%rƼ`'&XDJqA -ˠdh](t+o?48" ;%+ɘs1(o" @Txa3\S6<*)H+\C8`2r@B1(Q>PAmFd{uTETK dT֜K}>y()V8a"7%K*腚k!_`5l@mY!߃~:#/[m/j ۡ6r՗+ЀԚN8aRH)f nZhLLn`;\ʏ]<]OtS5/tVu+wuiWqw&ë^U:%9[֩@0ƕNj f0v >8CxH!pXlc6WEv;.+c%ޑ 0 :mUJ\jux&Ap(l1AT^'買޶/ @Jap ۖ}G+7vHG5@\ 6(t}O@wxvI Bc;fA_HA;x,!@@j#ui|M. ƙCY8r90E9c:qoBf,lj3 SZ s1с-4<: dr" øryrMLa^5Ն6P;C%kSjj&^:QEHE8@@0FjEѪ&h+;AY m^c-0/1y_2э"(`0s&v/僙q@l,Y A@-P 310)D wXY؂V}ySJqȷZa:[׈~ D`² n D)3m17@!DQ6-s]G;%^kuawSI#0k]͘g.Y qfPG+XLv`T x~\W*w$I^x'^ Xq*F niѳptdIܑ21h(Kv3~0,8A/t# J@D,qpH*l9L,N@"#TE0{BvJpQyNvV0]pxZubivfj0huKP{ y0t 5qp 0x0 P p Ð\ 0 p ٰ 0p0p Ȱ 1Me Q`"p])1q3c=1EqFQqua1eqim nr1g! +xrv~xfόZ!Q!!U=h|2$f'y*!T/Bai#5Q0MBq˺J1!  H"j.i u&/Q Ga!/rJ'U%Vpj2!# 02!rԡTAA!nցaN20S39!Б !B1ar8B6g7tL%-1A10s1 4 s ` pBZʡs8s!8dT4"C%MuVc] `T=a ^A.$#n5WbW{~5RQA .BvF Z^Bkips zV݁3 bL n!!Vh4ځ ^BZ5y _`xl `OU\\IЕ nV rvgvv Hj+S qXa >X^NVg#a% ГO66m!r!'g idL 8w >We Z nsf]$CS aT vV#M  "wwjKW{$!r_7Hv !v`v{w).I!dJڴ{va70Aa'|Ib|4.!l zwX .Ie a}UB.Q jĪ :^aTwaEC"W a@4A a@XV{ dXs$ws2`W Dx J84Mn{ .IZ1vo` xa ™WuD"q}u`P VKg[" b bXfqkC"Pnj7?0i+|"@ Ťiaa5BIs ]>>G??nkVy(@ @y AT`ߪ6bVx*a0̀lΠgY>#t: 9owV_}aUE"PP5eE#,ܯJR STETO%Zg+P!:❾LuL˔nTSSty<d;WBYi7'V ,; "ʦd~t{T@ [I,x$(̶"Nݗc/cfX_ bo ύBY%Bs!*ra`rA&_ _+%w)ݿ: tO bb@0dG01w  !d$Z8FL XdžIʕ,flIpZ0%ZѰbjã^N0Z5֭z 6رd˚]W/:رwb<2cU;]ẛK.^z;YQxqY;}](bX;5M;iak9q]/`W̛;=iV{wd@w xݼ{=n=xsBe~s7cwC+wZa!gӅ؂ZZ5 ^t`]6(f)NdyW*x](6ވc:>WG=Ė46VGB97@,Y$cQܰdGh<`f2z;8 ֍ysӎϙcG:YRWT6^^8 vvEGJơz~ j2;oyr'$ڌ FajX(ܼCLd#,IPb}4lLU!s&-Z8cՄb28;Zb;ZE;J:A-HѮGG`R;_x8 70Q|G~ rȟ:W:׵;`^.)lN/',W.%s!Cd;t5(`|O{5,S2+W;۲\'YGMb"MQ; 4(Ӎ-WLK]woo?wي/G(Cg&9pF@xZ=dt=3qh93ъ8 MWQqb#fQ2ә|G@Ϳ@m8:ء"@lf8=ц+@/"%9fT|8x„6l2I:! ]JTMJ@sO@wag{6ahGWnF<{E.Z[%ٕ|b/o5 ^uyg8e`fDgsg5zHVN+YE&r3h=$X50vW#4sQ5A(^JȄT5WS LVr8DnqmXpﰄ3,3NRH4_Z4wJ]UxdՉsPFT0AAKy` R>3hPP׳1kc nG0;VwMA;xC0dƨqd#(=ɐ)iy#Q٣ L4UUёl<'Y!$i!蓃c}8]5޳dB9N8RE)*=ԓC95GP9K66•BywdY]ٕT?ȿi#Rۣ# =Q[Tmco޼&Ϭ|jl}ޮWv= rͪN{ +?ϷeG=={7i5p&`ǟp'x=vuXY1 vvވ7b"2(|䱷_kƥ( }wcZh"9:]7NdV_\㌉ZVQJɡO5(㊥9[iIGeo,g<H`~'*Z騝qޠr|觘-)t5bXmXf}? $lE㓉' g)j)>*웕)맴znoiܜJV*iR Sz"{  -mN 뗯ei .)-jأJD*쭩&.˯Rk Vq9ٖlxșFk/6o{{2`R >3.+ȁ~16*4C/bL1E^;bi-NX0\[?=dK!Nb=lY[8 &Ug{6k (3kwX 73r~ 5і5i^nҚ7]Sv)oɏnܙHjF42@ۤ_ vGQ 6xd@Xv =P1@ &@A .P<|@Pp<(JB4d,! J81X*(2c'0/F `[(!x@Jg0x( @x Ѕ649f2L0 !\;yr %(E3B@H#P=9hEIͪnbb"vT=.ojұ SiCWݸΊLY* ث4DG@ZS0!:`W$,WG򕖋TD,%_)+jLԀ@:Ȼ į`5UWyH{mleNo[5Zmc4oyrT1Y|>p"W̅O,CH RF@ HT`Ab`Z(z@H :6@EJ9  V/$m{pt\@ 0{ _BT[.:P ڹdLPYgs  * ȷH * ЀkK )  p( B l8& Z&dIM!@֚.9cdHyP2eY`k1. JܭV*'J_ 05t>LQA$H>s&;x Hb fƆP3(lG;eiM 9vM 5-nf&'tԤUqƚJZ۶iUul,+gin[gd5GȀhuxĒp5l)Par+,ogai@$6W!L<@-{aUfxOf{M_qpUK]kq/N:J짮4c>tmH,9md\7;-0bOՊ@iW&.V@A+g(@0{d''_`{}~ V pLejuPBvgM[[%/'0o} S'.qRB Sa4$r]W@Y0B~6!4r~tD5~W(FȄI{&{0L?H@0Wg9+\%/vx"4s#A8RnAؘmgԣ6čX$,d긎NFx@HLoRvT yf Iv"Jp8fӐ))u9YᐺRUF,&9( 8-Y}6ٓ*U'Fi@=:GԘjsuIp" XR>t"oZ7Yظ(h?diٖaeripsy=Yބ|ٗV~9)a蘚!YH,qp Z3cR?50@Q30y@S0=Y`y0`(ǰ1U99 9pp @@9I0 ` 0  0 G q   *YɟA   K * P!  NQ8 @P  `p 4lZn\= Y mڠ|J z ! Zz?p _:8 @pPթ:>:p:vJp@IHQK@Ċz=0 j? BШ1 pQ)\`ڦq**7` mjzzx zq ㊚Pq Z2ﰞ :Ր:t: g0 i 8*Psp 6 sг Qp ZJ+L O{KF*Y:[ [1m>o벼0q@ڠ ɱ}P ܓՐ  ` E1M ! kQ 0 >o;@ٻ;p czE+p@P  [@  KP k>; p;P\CZ,L@ +2PqJD1<M:Qzb+? -,, N9<=̠0 x< ` B,\ 0 @zyT;k p PKvz, 0 `g>< ɓPt@@ |1V( 0iR< ٢P,L Z0l35pm D@A}?c< :A}Ub8э=m%-%B }(ݎxx4VU!Eq4/}@2Ou<5:3H2=$'Ԩ0Os"Q}tJYVq"TMo%C$B#\US-'y3x#[fאִC*!pŕu^*]U~׃]9ٞ͞٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۲=۴ڬՈ}oes1S֜cm*ەosعֽ۲TJ6-[ɭǍ-GMX]6E9""mݻhGncAMռ 6[9$A}[bM6]1rU}D%Nc2.#&%ޙ'\, A2~a(?Ta(%ǩA T y <@/`/*Ұ ۰E w*[; p ,vy\ AQxMlS_][D?ei" $[ ?C̠ [ৗ: - 5/ǟa - @LТ   S?o͞u$ D(蝺fE[v){nqj-1̝n*;5UYM7T(BC 9I|{K+?ڭ{% "IDtmD1GqZŪxnXbƍ Z-@F?Ydʕ-_HmfpL.&w Vz`cs &{Q ҦV=;/y%t-*H.h2C.}:5Br:ܻ{k~#GdnS6$Dp)(O(){o;:x E O>anCH:몋B>@o1GwqS6{^c cA<1PȌfEb#\ v9 Ftun:\./|Ƀq2-3LCHu"<wr2Li!':+y*wp CU"218:ՠDASM6StS՚$s<9%XcE(UpF$i߉ƠXYRH& Kxv|f_r͸gڱB=w>#wءw^IS)ķ?if盃8SRTl٤A[駹ƱmkV/p9wZf&vlcb[vjƝjȓR&PdYp%, [j-= JU/wߏ5 a"y'M^yt8yGn}f~0yt[xYwcB^y磧Tp5oa9Æ2=J+|9ln "1%~F*`a 4G}a'tCV&G*Fa1b )6qP!#*Qw4-'R4'L2 'kq1vQI@#!$*tL /c#Gȏ'bE?ͣD`X 9fF80 ,@eFlnx&J^29bȓI(& 2Z li\;T)71FqM&.d9ivӛߔ󤅌 dHY# ru`BIԊwDx7wha; wd︅PT8%34EEQv  |A$:- TG#R8>JB'EҎW /Tz4Jr A^*rD (.n`ԥ0BP-S*փt4 7պ mOz09P9BA 4̵&]wȀ Qcdh)ޔc (Q( G6JAVֵֶmlcYjlu[ַnn]+\׸Enr{Ⲷ˅nt;]knu]v׻ox;^׼Eozջ^׽׾ůfc'? : Рؠ}W8(G*qcq'8m2!6AH\bA%7wbĪK::=VqS#':c|La X-a^)[1C2vh9i%f,yN_0h3G#J +d~bdؘGj0S'?Q3<阤E3S}(q=hĠ-#u})AKp2dy i*u?~5 iXSzҖIe .:Cz8&fnNv67m;BVfb;:`@Dx8$a,5j-_0/qAц9 j,.վ6/h8Ð͎f$xllKc.yp8.Pk3! Ĝ3*Qnʅ.#w9I#<ٳ>3DŽdXJVҒ$(~ _x>DF4bb#}_ak~ڬ" )d?掇|LbY6۟h0D7 {ZeX>]> A$!~0hr|&=)JSzv5fPJ q݇?P6q/vI K M؆c@>Nbw`G{XYY :2'?{v> 1i1ax0Xl۸;7s0?1 S=);x@B D)w; 2]ӸD#1svXJXP!F6q 9#<"?/ƙ7ȑ(u 6 8ZP \4ĹB@:[3@,gI"DCJA L3s9!R!цrEEwO+D BE/ju+KOycP4 [ [tc1uܛEJA",B8b$c2W ߠ~\cG#'>YiQ¼wPPAܣH>pĘsPe$s),0j&J[="/r+Z %;ZoGJ'y2z:"*&r3x'̉ʩYk^[)i)\`Awx/4Hq"[q  2Z2ry(J|<ʫMҬǒ [F̽Ld,ˊ@40Jɑ$T2*5 6ޔ (JY"DN t$4B /dOw0l;[Y.OzXc(H2jup/C 10D03 u+ڴ0uL؆m 3< m/I8w:@8(Б+vէPDH=xs7|۷עSj[;S:;Xu6mCn sC78I5PUR]HrVݤUuash{pK6i+EUGmux8A5Qxypµs ; 0Hl;Яj!KBP uay JC 8(wXp((t1٤<: ͕ 1:Y]( Ah8/ֳ؛=J囐հ8t3H |8ܼD=\><# E ЍX C;"7ЋP[\l腁ۢeXnr1p1ZQK\@C1dD0Ó"^upcr0+ # ]@1{EHC]hfv`޿F#@d`F43 fp10_>v0s?#1he(fp_v_A3,E.?0 EdVHPnbFM>D40P@9rƍIk2486 mmy]P/$|mC &$V5A1:tàA%ǐ]qu);F}!Ond\!Yi'Dpm؉3eSgA! #uO$UlC\ҹ[cdb^GDDJAR ha^CC7=\f6JDDɗD"s9{D9 -Bu0  \c:j 5)a"r$b Czf̉b j8l|YEFO"thz4sa˭dJLV(1ܩ$ ]T*bjJ(ǬJwʠ Vw1@&Ч'Zv(nJvsL# ݰSx͚͘p*2\M++2L-8X /q4p 4NN|'/ځu(7 f-^xr+0S1'273GbZ4w4os݊7s1غ:sMs5>:IjM|,tٺbsit9oDtJK'CSHGE'FK?ϿLNTcYttZ\ SXuT2uYWv;[4cv]K2gav`o2e^?=abȘvhvd`;,E7?P_LKԃv|ucwlv`B$w+ɒQ[zK}Ww('uxXx@ W#uxwnG􂿌|wK֬xbve?Qzz_fBgL_CW9vaox7E{sog?ayzg!ƼL]c{u/Dw8Wf{yyv ;Qxsy4{yhB__o"{p{_Gy[{T7OG|uZxozȗE/yڷq_|v{!4zw |}}}/|/~oxgL}]Ow{}L|{?/W=/TOi݄o7a 0*lPaˆ |PbE&8QcŎ -,i$ʔ*Wl%̘2)Hsb͚s2<'ϝAOYcN:ob\j'AC<:R(ˍDR9SӌM2EٕMg 9Prҭk.^V~*E˶,~1ZIw̺r-O/K,rXOmť5n5쬟>LK٠lS 6׻Cxlt{k]{8qmCOn:ڷst/o<׳o{ӯo>q? 8 g` * :ҁE Zx!MX߆z!!XXx")Vuߋ-8},.Y4Ri#Aj(p i$ \`&xt BBșha7awڙ^yȠPo)U }JBs!i升Jڒ 0*T饙\A{ IA$PҪ Ђ CN[Ka]]ve:E( @ 0  BA%0@  .y `(z`y@(o#Uv֙`5i9'Hq|J@1! @BP*5̱\@}rs'|֜1GV+3GoQ;ʴ/|#p'x d@2 )H -w^؍B m $ZA( η߀ 5D%u* c=5V[UzN ~ǫ+T2 /m2t@%P@/=Es*T,la麢kW^?|&P>/ ULf>%T1h. @Ap3PHH8wCYba1ڟ@! 1JD#@08|%2σ|ÓVg>*>1XD!gT)j{!bB%F~@8P* H> Vl. 09e@+PJb@ m9HN{_L `p _::ɍU% ]wKcՔ), f1A/ q+5kSE [FKfs\_Bִjqr5{q5 fu (A BDB@MDxf ((B$ڧ$d 0f]4H)=?2.(r+`F*؎o\dX+K.om%βad噶3_.&;9.42cf4]^@7{V #yA mej*31;3dVIl5GdU\nJkĺVQ-F:ihFw qh[WxLl7nY>4"}gC[޶lc؅7}oa۹<+/[#eG ? ƹi ]f&Ŝ KZ<28{d*PB=1c ?m+8TQVxJ;HTC30_D*/eQ%<$7B;PBC;xeAJWW:8$6$fSC$aA(:NQ1e84&8R"1`! qTeA\.h9cG&^`_* YBBZC\ c:&d \JZ%deN_j6I`BA%F1:C:T;B*;p"g1f)Diobe_'4,f9CD/4d ;t'\ r @s$}GtE@eAx>[D;`CCxB5JNbBA'.43 >gCB47]b$9("d.(ǃ"CHhA;0w6gAᇺy`);D;<|e;@CC;hohA;(eeB 6, ,,BdR6i3(xB+:6+9|#$ *W~(9B*_yhjD,4e*7.֨A;k.bA$4ߡ1iC8i;qAB%1EDȮB`&X(78Dzҡ!%*&GօŽR E Alfll",*.kFl=JŊ6neyx,džlYlyȞlw,ʶ,װ,wȬv,2^˱uR^Ά,iՑϾF^-lj]ėVw4:f\hQN&,F~*mܶ-nG6lD½ܩm]*2-.6>.FN.V^.fn.v~.膮ry&m-IޝJknrڭO"^oؔ؛l.ZoeGjFJ/fQ9Ŭ/=AHuE/GE/GD/0F0ccg0\Fj߅tN0^, I@D C5djG e$II; 1AIT9^ D%qC=J+ |,BZCqC@C:X4:T ~#C78^i:Cqg Gq?D2ĩ 0а&2~3B3@;HC9!{I k"+D&#;r#D$+: 1BA4XcA:1B7$@:2(񓚲BtC/J35[36;|q!0sA2F1J` Y*8 J*;11#sA?78ן9,C;7AJ@+_94:r@17@gB#F/l"@:xBJ(33;34w7_B#lj9MZ2sAh995$(DB/tCK/7-C;8f:8XC0$bJK,W;t8)Ȃ,(DK/C,hY߬*[TS^aWU5\:,P,;D)`2&b[*6c%2I,vb3s7v:DVkVWCWiuJ.nC4$_pqw@5^7D+B,u{dWeCflS+_&2(bA(*Ħ.=+DCmbSw{{;69BC.WJ$8C:db;l95a![Dx/"yx@/w;v!9U$hOxǡS8 ܧkch*&Jwz}{#;BA-9;[.;pow9ֳB;yC87D"L\:SvB_;C4Cyk,K`BWHD/3=/9Dy5 +ih}"ozwaI,4C.g9;`8zCDCLyCLz[;C7649uA1k*BX;+ >J467 r[_7ý5;"I@㻽D+c2tDïz2^):G/6h[D|w=}?yIB<ۧ}BL`ě=3C|?D;:9S=w'r:CA"`<B(VkC9`zAP#BVtH?|ʿJas70_;3};i>kzI";Il;,vOCPc4?_?+˺>뾑s@ 4qHР@9⨊";LA9dI'QTeK/E[7wn],]}őrY]3N޽#UL:*;_$P %Jޙmw)gNٻd!1k-l+N> Ϡ];vq0{\;v{pĥos3ѸL2N;22I(R>:uBwv{'ɗ5VBڔ̛?|yE}<뢪kЖ \w9¹$ҏ?^*bv 漶:Ij“24/ qSwhpQzJP E4s*E%Z&K޹$#c6pŤoCP eAE4w\qL1+S )СdyGpjS=dK*X$w iB̳ēz@F!]Q LYbc7IH"N74$ ` U<@fbjjJ VaHRygb$!`$geXEwZo Wqˋ0-%tMZ]؏w{%o|1-E.N8_weX!X)1X9AYI.QNO3Qd]Yc}Mʃ_ D4jt֙g=^ ~9+*w¨zaka(%%6)vsU򄡒tzoZk :q+&]ajnĥpsZɍq (t}u|IR:i'OƜqD 9Fc6*|s_RD<݅e]ŝ^zG_ffJp6 Yƒrݤtf%liv!R޷I@ K wD;I[)Ѐ[`AasH1 RFm,uDXB D4'CvvE$LgfL!PqmG0eʃu@%2 !tC)17DÍ3L~B$C q#A;Y+w<׾ d 1/"v:rk ׼#e)qJwr%)%nxKS!yAÃ,d1ݵ/|!E&p1fT3hc>HKxh"Àۧ$BEڱW"§>}3[;N8Ql 2Q{G(Nx9$gX 3R#GTm!OuiNGT o6oױE1EOIFTґ MHU;a2$+1XYw$x(rTU"q0dR! PZIV^D` օЍ{$X|HV;6d8VR,cK(hXs30#M4OYAR׋uDGDinc8Z}nAVz+:!u$XC~J$'OX1e leq+XkzGSUn;_Էp+ `*cxQ!8t%"[vkW$OTuhP\my$}E"Ow8AċF3X݉wY^I$]KD#([wE>rr8N 9 ;nx Yl$v@3nbeoo I#anD 5 #b᩸ZaP!!ECxgҡa4]0 װ-(l c ;NADBN"$p. IM!Pb"H1\TgE1$,VL$q/2"r"~$6Q%؁!$BS 4t$v!!Ρ$hQ aJ|Df(mQ[G &߁ "EqVË(C2L N‘A!%ZhÑ 18R">"ցqp.$ ڠhaAe"`at!$q6l)2,[FbТ%+rR(r)ə)b//Ѫ"dAɝ.r&r@Q*PS"vR`Da !:* HBʬ+@xBe$q'QR"Z "<67C"T5%5GQ*>$!5B;c;K6Q6 7`7[S"!JdHeHܡ jzl`zA`` T hj#j^ lJa`qRtEEab f6 bG}4`CATD@lAw:I GցFm kHtAt4j"T &t*B3tClJJ GNN<i$A `+0 h}'!!s8CS.:6V r"uR/OABP9; @ LPU5*ŸBQ_QViV%+OaY'`uZPuQ$R"\c_93U]q⌭@4f:OU5[;w$%&$HR3_OZu[No*UQ5\ `$2A5^bZA)ht A WUbU\A""59o6\]lOS' !ABde6- e'0ABYK*ܬa dO6e`e!eeVj mc1)<ZA5 7")&pjN&eubU$lTAu4[B'aq$CATYg1f%Bn}nn:Zn;@7;D!$nA4nn[]btSW 3 Om3 rDs K].A!A?K"V":' >FW"Fa|:C$o 1>(Dyy11NB'/%$~7K$byyWwzz{c! Sx1I O .bR `{)ƃIB…Pe%o%X$@$dX$ x1-Xꅈx\]ʼn[xҫ`Xm_θx'8_xf̯Z^Xx84[#eQNZ厏 !ّӋmy/DX@9SªOO 3BbxĒ]8W% gy'5:h[gHEY|{G&YY |ٙWǾsٚy?"ٛYF+ !3~xl:9ϙE(eZ9iy5BZ" oK:s%Z9sMZw˨} ϊY GڝD!ک_z#ڮwlʯê}Z ͚$ڟy (Gz&Y?o0&TگءAM[= CUz5%[:-HK۔ {uۦqZYza: [yk[ڢz[ٰ׹¤Z:ᛳ.{۱kI{3ڑy۳hû}YY{7,\}yGaتſ?ĩ{/m{ċ]<ÅyE܏U">T$_9!j!n$f> &8Ǿ#R?6ZMB$IR Fa$]mR >ES)."kL$lQV$_<ѻGޝ01w €1`C&ZL(;gޭ[2BI:mUŇ -s,w%kÆ?ڭ{%˨ ܹ]Cؽc]!Mniñc ڻn Sl2fիY:IQ;unF[Ǯٴkk̹瀹XrK1ϠC2sTd>:u@ƍ?I };^ O? B(;<; ;q,]luk V3bjqUarz܁ eδf} pP,S궀$֛S4ʖ!&HT@)/H _J42@5@M.@}:PCyA:6h,qW? xA1ҁҀzbG؀ Xq3T0d"%R 퐃 󂜁,R0Ah,x1d#QrXJȅ]腤_#3a(Cg`k2y#wy{ȇ}8@f؇i`8Q|#B (Hhj(bHH(HHhȊ芯8hx(ȋ(HhȌxf,ŨXHЈx?h2E70 5681 m$sSh8 ~ąx( hzh܈pG7ޘncHm ewn֎d57XtGF@u(v#H)0 39B>19@.By>FyJYDI'IKJ(b 5HNy49PF8 ѓ`ZydiY@BdQcfiHHمa-HtWz8 9hda= K!vIda0y~閚٘ D-sE>tIJ9)!ɗ љ ќ ۙ ۰"B 8 W%0Y4_ ; !&)  @tPf `PS@ y A]Y 1 @Up Zt-Z CБjiWD'z@0Оmg@)-:ub۱:Z= :#Z17E  ) 2J6: !Fy1(:N٥ fǦҞfZB JIjp 1~ת* !Q 4v6:MQבA!!!c!`!^,p(!&-1!'2z~% kPкaA"ԊQ z2įwr!!00A:"a^L(a.0Bt !BJg& 5071xpʬѴ$kҡձ3k:j˴*](&01#a2@%1ADC,=r3%ur'01:r)2 #c1JC$ .B1(2)(H%2;/#0˴t'-D/P))l&иA.E.hXD4af&j*˲Qb1'w/.")܂)Q`;*20 #) |7x*{{њ 0+,IJ{1㻿<.ҹ; ƃ</;@H3>q83Jt1OC6C;2=>\DPJ93S7E?#30%64Cs4@3:{?+LV5Zs:Kb";U=<_ C1\.42 ݐ R1|{(?msŴ#ɨs²|(L>!t-lN #dC$=8MVcaHT-)C/wdA4IFPQTIU$ͿCTBigb17#SQw~I>텺hŮ>2o.6qv>pwpGC-xwt`q# tt0Gz_=wu@v,ewi|x}'-]5tayRsWwww~-tDXGgvd_{Mx ?xΗ{\m<#BɆԧuMvc47^~o`wwG'#DaE#>ttq~97FgĉkPVy0bO}_n!K֗o}GJ30*%XM>V #>48;? X.DH au xQ rSΏrNö/ ;olOd Xe#xО$XA .dC0 !qE-6T.QQXr@E&UfDYqK1eΤY͘J㩮NAMnZC<41eӗ-NZUgqիM_NjX Ѧe[q㮕]y}!,!,n|H*\ȰÇ#JH"w3jTqǏ CIɓ(S\ɲƎ.OŒI͛8sɳ3R *ѣH*]ʴ%ѦBJիXf2J# j-E`˶ۍ"]5M F[0w ܟY^+Ϻ.CLPwv9Xa/5Pʝaw N wF+GpaA| 0mK= Qذ nذo <ݺay.X,u"Pvuic D;o} Fwiםw5:$२Uǭr $ l&b]C D:1SP:;p; NT/29d!Phde%Aɼ@bӌty; 1ݨ: PgשigBZ@s$A IAҼ5z;MPyA׼@`譸/ߴ#H+!P_ Ei$jΤЎ9g;D::T ,;Q\@ N@+, tex;mJ;9;N5WF>:l:@51Li; OVpC A@8i^mGnN 3s@L1 wh8\3"s z7@,Ȼ Y^C$ꝿ(4s18)6[Pv[w@34d7%]0/M16o_x`bX4kN:H;;b=; AÅ߮nP3 'P N71R&@ й:q,@`C'[o7~;?JPw 4'-B:tdD'zZ(FbQ$&H)э ARTQD iDґ!%hN[R!9u(Adt7MjK:Q0U<5jELj48-TB՟Ԕ&_UX_ՠvuMISXu[UTf%ZT"uY{Vհjk\ּOu,_XT'auIfkSJ N-kWѲtEldҚ6mfY2[R6ͭnw pKMr:=.>טVUmd궶ZծNY[ִB5ImU^2Գ5lJ^nl YΗ5/F+{Yսnhy[>t>:a 'WLb5W,`V,>l_b2Kn))|b[ 8i/J*w9α^>>+u*[hވK4iH :y tI4#yh5ЈFyюXk%h(B 0hJhW3"58F5Ua0QMM7Y@  YƵRs FHrN*{ :&iF.viȴi4Y7뢈D&zvDC cnc8 cөŧ  2zMoo!,%A^n/)@t> Ah>ODod3ޡ[4퐆@6(Cqɐ@ɏƏQ9Fc<,gKF2;pD@MAp0 )ȏ ɒ.IBy)0 gg(0)a p/R77@Hpx;$4 )1"79P.H`?ǚ9 @D@&P;P;P/td;mBY w77ِIY5J NIBjٍ05 9Ip}̗kS7=!$j)k :<*%ڛɠsZ :J7C<#2#:p )2B#cA^ ki\zyJj b:1IB}:l .I!]hS}ݐmjv@F$*/D /2ʨ:9Psz|FIUDH? S? * y* #2 d ! pB 0BH:!*0ࠎ]j!ꮔ%Cq_`<.8"oȩ!G7"0Qz 1P .++:y麮*3 1KZݺ+2KL3' ɯpbD0B@A,7w R`[۵퀂ʰ H1XkZ; /f;h+}k+}K;y [B^IAJbР !Kƹ ;LJPkwWWma 1MՔ=?:Q|aT!3@DՋ[ݫ 2@hȠ 2NR W1[|л1BBo\b| VG"<$\&|(*(i,œ5 2T6khX˃lo98$lk(>,~duŋю8a0{ V]_H 0ٱPKB*JacXPfhV;=3/A&( y)X$/4ϼ]'gn%͍ΜlG]4%Qn ) bJdAɚ Z9Е_qma*%ǽV ?iKQ@q˝Q?=d wVPy  aP##nʐ.^DbΒyB6b(:8:B aܔUPfV~#zxs~:˲.+`H:Ѯ' +Q25W D3 ۱ `m\aIms~*GlS`+@xDExԻQ?կ /ා^?$[B`K WHQ?,K|1W\ 0uX~q|*a%fk1hB.* UnBkFO.0kh_u?.\ry9l4Pɳi'> jF5hX) 'Pj, (mF_\nHLJ6Wo\갹KaOll?lpq̎IQpQد1@@ Dh0Y%QĈ|QĘQF=~q7L\ !Έ(DJ!'ʨ9:9m;%h'M w\zW)TuU.:D>!ZhvZmN`rjk5 :u ڶHܻuj39Ɛ~Ѧۙ ;&,kԽG* z`c)+Bs:! G[@5:%D nxV ΝM+Hڷs t`j-X1cs -[4iA*<6r 6P'wavF?$ QS/0F$ĉFyg06wYdǝѮAV|9"_|p!yeig QemYqKvyE-kdhigawt( w ҒK/שD?'RY~i&!y?5 16s–ȒwY&ŶM8(wwdHFm$ $ /%Zfo$}'TMAQKM\u3_B+wB Uk1{\[o4ygyppLA 7&m{ުY'qPvuwdX ' yUg])ɀ;j7y 04`pBTM?-1 rn d0PI CLArx"XfaC%TtC1A@D&6#x.X-[L#P! 8 693rlc.OxdQhDy)2rC{I$ !lmgVDph H!$$FRxmj]({wa IT1(x؉wTxK`a,pJO5Ptds p@8)c @)f:sДB 5Ӆwhl 9aQҒtJ PC XA+O)JҜ=14 l6h$yQ`tpB*@w`B ^ʩU(?t`O nQ8YIV`j@N\|/~ uJe*A̡r`C#d)SJu=+;wfR 6TEăǍHUjfMdw1@(A DVgA pbpa Ie^pDFG%0/dhE26%2 _ Nя pQܩ^Ӫ,[p,)Oy7B :b2qwŎZ $"Z”u[k_ m0fDύ$ֈ2IEej⬶cخ@D]x dH)5"(;c(pHwxB9Z0 y3K։wYw3xt+cAHu|r pn!,oF\Hl-̘y|$WPbL)/D* N[%fhuE ` Ƴe| TMсamY2Iy#tG-uz mT 3@:kP35Bݓ?uFMPYIA0lrNv}U`;BۢRki"p}~:vp7!QxG8M^1$wx5qw-jxE>r'GyU.gye>s yus<(9O6}>tpEeOwܨB8!R_:h} Tmxg BEbuipũ;ANw(Iv|G{^:}_#xB+7n"|˙z?]`WS'm_Ka|O>$7>^xݗTwz5}󛷾_Gcۇ%G;F.^?vK??;?3kd @@k[@r? |=侮s >@@>̓ ţA˻Alߓ<>ܺ#B$B),B4BCԸT;!AB@c|BA*?7l ;A9AA454C?7B/8:2>DD6,KDABGDBнC4.?;ETCLDD1l>Fd8ELC8!4C$\E,E0=ODA3TD= >)SE`$?Y<{D[D[+t;;BILF(TGm?mw:;$FBEy$FsCR'tFBu\AH#B{Ɓv@ Gq48ZL,CdLD<ESHtCBJdǪsBş`*@HHGɑH,9?D~IWt6D.$JØşJDiܽgDR$adž=K÷>3K4K=K˾K1˿$4L{TdLlȔLL̾̾L<4FLTMdK#ͿY ̗K4<הM @ HY 0X >@ޜ$HLNM7"X  ȉ<9P L%IP OnQ(x]OCOPHp 5]A ht~DEMVJʥ4-C 0TDO R(R  D IQN OK=LSETUUS`TS-fJgvd`%fKԣ<{3b#dgT亅&-Zˆ扦`MgΩ|Jfd24iA}\hFFis.^fFǖԥ\jM|xTƱʭHb=dX龀>⯦h&DS nыU%D.Ǩj~Q|FFjnLFrF`ӫո`þE#fXyVM삼BnC4HªHyT?X^eֿ=}kkMenE|LL%k@Ϯh̜CvFHU< kkEƹ5؞UlQJ[~Gk^Bf^Цk>^>HTd7;ţHnnuDGnhXow켌lvvK`ػ칌e~p-` HX^D|% ϰVoak(M.mpھh~ؠNOL?LLWdIn(i _GkƥqpoBm OGN/pm=FY{Uϴn7g:Osr4>/%\:MDt|LB_o>t@OtIttN߹w7PQfQ7S'TfTO6VWWbW5YZ?VZ(| \?/p0udu5g(&<,)Ix 2<^?,wȉ>@$6*lmLjngd_fMH2vpIwt(6[c/L$9h0yyi/(yڌmHOzaxbyDjpay;;wua3`ӈxxS`xw`\17xJyF _$K$Yi(xwR y! $)tb:Zwh{x{}z?w6x:'byow/'LvV{w8n($xw{8#tbw8 7?X6"{'k蓝8wHvohjG2i!wxg~zlv#x&hyv2 ZxލpwQH׍Iat]2'G,i$ʔ*Wl%̘2gҬisC:aOc&mE%FV:$;L6,:$:\IJfW ZcQ#ΧA9 봓* ;^9; eEռCEQ3X;"9VZҥ#i:%m:$D+N+<;B;8Dز-=;>9RmTf;@,`2 7/[ 9hEN;\Z8;R0VI֨鸳ˮ Ach{KoܱC;d F*ܲ H{5afZ1Md ksM5qk}7y6|7 >xM~j8+8x#K>9Gy[9{N>:饛ס:7:>;î;r  OǛ76mK?=g0,#><ҿS?>oJݏK;=??=>`=13@P={')p%)7jP`;<@(e0} C@{+[Pbh>!(!F<"%2N|"()RTm?υ a gx@=1zЈ5Z/$ U0`710l#4 ޑ0#"i1LdIJu#Hr2$􌒒 'CIT~3 -y=~<%.sIF=摅ld~KQR`1$ZA>E;|aj MI%6Ut$x{P7$}(. wd'!I1 fG`G2Qu8A6TfncEdt́+hrj*R3T<O__uG0 h4 yyjw(A;aPkJtu=eIc[RW#mZKضѪ'wH# !:q@t1@v(㣛CQvS Z" V uCıV%`%hAZ>$X+/,R"VPaRdu(ԑG#(C|EpjH jUZ:vx0paZ:Dx9B СM/gه^ gc jiұjôbG0%"! 8Co1XAYH ޡ.*E,Eb01݌AʰA; Y9#);ܑ rwcBB (1; CI ~|KR);hKvȵ]T8$̶9`s{$ňp{39"݇x; LgèA#,Sj9L@?tYC4y$KwHӟ> b')ub uah}4Ž8 q? #i2P t62i!2CN;*x*ޒ+ac)6aO @#%)5b$=?Jl1o4?C;8է"JDv~;_;(pI_3g @ʘ20ClD::ПeE̮C:F;PNYff\&qktC%D(؀Zq'E;`&E<;ãBJX'v2 zJp&j>jC(:Ӹ+<{gͧC̦C̀,_s*c0'd P٩pWd%-bĂDN 6JAā&JD gmhGtHAS^FJG F(D Fh^ĭ`[KM;hNiJDXp(g^'qR)ٍ=YF ?)JΙNƩ)֩)橞iӔ)CۨDHXFEGAMRjb00 ԌC@);&u&C9IUG e@JQp]-j+Uv(Lj^^j/mPّ *qjx. ^#푷V:-ʥaNUU V $/5J+(mU;Mktp+,uQޫR<\S*jO2(JJL"elb_U`9IBeH~ KC`Jl/dOFlf}Dփ؀؁C')&]5C`A8@BoTXGh$>r@s=C,=f*^_v:pp|-EԕyE= mߞ6k, l%[6=D fHnӐq,Ke=7xfQVٕݭڮZ^T}x#0C5 -mbF#h-J~T0Wz9Yoob]jVn+ڍ}CƗ}%ʩ1;B O-PcFv`?D߅hRXlKjZ}~PIDrI:D= 7i5ב",ܶj"!,r5` @@ €šqiϝLa: ؆^=zWER3ɑlI}ؾs=?D%^F*4E"9o2_:SL);LF<,3[NZ@)*bR M9reCYC;[''R UJ, J4 A:TQ^d5\S@ 1XME rftM*$CH%+C4v6% Hv5E8;@.Q'wL|LȤJ ~788j>(,@8V9v ̨vĐ ETdDZF^hGxAR\*(vėϬMSeJ9K/@`ǹ9׹9繞99h(i"(&ȣEy_{LpCvrب&GJǮۗg˄ĭM;åZ0Ă~{l1 SJE0_TQU+C+ vy;?0oͮz{ٲdhKtՕ;D EJUR^u,`ᖐfĻSDDjV0 ;x]+i%jV8dQomс:Ă;T9 [pˀ:0~C!^|#r5ᗱx;2Ի;/@?M7|.y9П8CVJ8;iV3֛SzE˿<< =E=ECg|tMG ԧZi^2CMv5uz;Dl{3Bî&~>phF}s~A?EY-I/jBѾiپ~j:X>[`;cD ~zp H:Āeǜa: KIHWx]}l?0@d1 AO޹TaC!F8Qػ ǐܻe7zp@w&kQCAFN`,G $i8LnȀ;7 ;*NsYo6;lYgѦUmZoƕ+ɀ]ssWD.4Xx  `30Ihq @vη1@WR=rkׯulnn6&;x͝o᪼,]uޞ ؀)pP7_ FcȒ)[ ׿m P , !1F"rcșw 0v8Ɲ2lEႢwY'j(dxGJy'bl'iwJ<1E,A ߙ!^QBwL+"bС%1t #%=QKF9;l( "GΆ*bCww^qbQ2ܰC񢆘qgpFi5OBfhƝ!G5KԡBM4!4 %*R$4w ETQFwФ4D؆2$o Wq(Pe zJBF̝ύhևMjw_,Pm$ u9CwRGV`q4Y܅wy-(wuh2GrkXL](lmx|%M_Y~ 3.裑&0wauqx\,JrNwR~ކxUiSEm`gygj16&U:2iuHjZk9ezrBlڝ`PI6Z z뮿ڴ=ɡ)߁^x c~C :D9j 4w wiieׁĝ\WX!lͅLw^f<8zc dI T`Z{71 |GWeo{Ǖn B;͐5?Pe 9%$ ʆ2! h(_C#R!="ޡ\A eC~HMXZ||E5mt#[p7K0;@:1sHANQgp t#!I?%1IMn'AGr4)Q7ҏT+aKY˕-qKRhl/uJ`n|KDraB$I[朎</CYLm?5Yg6d.'42Mi;3w$eyNeĩӛU< ̀3&? }rV@-J'Z Ѕ2e('r5, =]җԥ3!zkftTCWҚfP9~5KUzԨ5IMSBRCU^4M: UJjΙH}\JήNut_oUTjuTaء I gZVn5\kXN.V",c=25dE֒5`OIxrvDUlm+SBN#+X+kU l`J˥B{Ӷ-nWVIKn;RT yuM^ֺ_}/vKWݮs jMw;`6 6/oŠu([mq8ӕ뇭k\b6 IZ*-vӷ&u9Wkc;AF; Xt\(ؓky+X,ּlQYVMur[59Ɏp9tr(lf,Uf]|/ɢ $ܡ5'R'"aB(ނ("ޡF|>%(B*1$"s"P'`!Z|-0`$'DlAB Bl ^ "/P!8t'>"$FBHY4-h;qtExA",p wFFE *4a'6aKFS@Y@TJ&O?s&P,Y$-ɴJ  ma:BsaJi/<-4\J/Ң,uI] >)yց@2 b a|%Df{0#Re/WH%l* uUU USYYD2K ށ}]UHWyu:8z$T4HuQ[bHQfA ,*BZf|YD\ \-ZQ'sLMU,3"n ܵW#V_u-f*2v5TV{e,jfW6,zvc%9=aD@RPIS$16auT$f̈ \u ӡҧ7iW L$ }&BfnnDZn˄ !\oDEv(r)QPqUjj&l7H!a*سJp&$%ƈpIIJwh4-8 &25L!xCtx-@&Ay]px8 @oh*-fMG`_fuً! ;9`deb(lyytڠa#ybz_9N9,LzeG" !'yĀ(\;2bbAVb8m^UqO~dfa+S] `ơ03B]r (#y"Ćljwu*^O$mfvYzrv«;a|KEixuZnzz%!rJbtax w@u !kfu!*&4۩m>{n"BtHtP'Unߵ;"B:O'4r IdZN"n`[@* RsXĀӍ/ȴm*Hbg}gBB o q FAn:zO:BI{B8/z0J{G|\\d &\k,y,`q+&[sBt +S5/ I䫌M>UޑD>VZ~a>Kd3 ߒ!Lm>2n @*!NkPN~h\~JN@Z "e!O\~no"oj<U[ޗNkD^о@!8aھ+ \|,O_N&F.ޔm"֐j~!X/,|"Gb+_Ht@,,I{h)AP )T{ʘO`k īuZݯ/ ~蔽۩즽"p?"}bx… e0|f:d8C F(P1.r@(u,mw< jݻrԅR(u;!ceKL~]3aʤ m梚 I :ڹF+ӵk9"<ۻwL>:uց̵{+6v)oIKXʱ9nTɕ/W wS*wN>ž;ic^#:фHJ=̚5N`9IPls )EDᰪ5>9'6X%Ku. 5v5Sjhek@8T t;_VJCu@Eǘ6q@2rX7bQ{g`Wf7n~)@%Ҹ2;1SY7HRN2DՊx d ˄UB0I$uZ ;(N;C;JFr;ɆA,{^T][D;@#@6S8ґi&j*$&p1w"Т>tbL54-1 5e4qt;&;7K: T DvӔ:@l٥@qjt*H6%'v]im^Jiʩ:EÞ})лn$H;:h&JGy3V@sy/y$-:.SPN(& ZF:\Β*! -/"tJI3"&L9{;^Y7x!/xmN&U5=&MGơ6SD 1s;E@;@z7.d1E;}0;jꜣ;Tz. et KTڢ PT9P kI) > 70@2}ΐqZ\ ?o| p rW؉ 0⹽m (VNvp;wpa@öF(6jy76t# 8aD!~:@3Bm a8֒'Emi]!0WoJ`IDPY+ x@0!?q#)ҽt R%ufj;0nHc4H29N oW%ld!HXRPfl R7ƱSlʢ@GdR+dΥvE; ]őÜ$II\q }cA`1lBa (KiKC"R;юvF ܄$fƁ8H3wTH&TxM\XM|$1ARN@*y%AQzrU8sJ `9Hv(cjݚ⌽Z^XGoj ;8FT˒ A*Q#V9!c,;I)C kEJNxdMUի%#t uuEQ񪑹悦?]5%@ joћJb'Խ@U> M* PdW+tđjY8c2aWA$mFk) UI-MRCmc!/]][yρ!q8;є/ML>o劰s}oZ: ' ҉w⎢+5wX]X'?rh(m G:Rw5oFLb)tE?S+W'< 8%~ W6*Sk%hlT[w<ᴂ3-Ȃ\뾶/lq\La 4ر-(tR! F41 Tl.R]5S|AJҙ0>35(H{1G };ؼbmacS^JDeT SEVĆߖ7vߘ8[ Nn׼r36nE; (Hw Jvu DlT4(;'ȖIӛ_;FJs/5n iC;a*JPbj? <*5'Y bP;)P!M6jT+8&(Iw(;쮿j.8d< }| =BBѯi ȯc|qU/Kc8=/_+ޫevs쓧ː<-?^;J}w?+y&u$[+gJ|}g|[rCۗzx` Q}y$ġ{417v6b~t]GGyg~at71}H6 g)X< Fb|6Fs Hф^_qD0Q(U3 5 RA6B* #ClbH``Up jNe;5 )ш{QyԇqS VUfy}[8]{!ZߗLшщqeiņ::e7c?gCg{ H`{ъz^enE8Q{1 1YbቜTeRPXQA11 qrX}8 IY) HZ;y0@bsw6@T|A=PjG10.H'Tp*YCOWqW2%85?,m4U{E8UAW>HF7ӡ@1Ӂ oy%s9f6jzٓq nih x0x阏 @`y%ieaəxY)Iiwȏ隯E)9)Te%Xؕ雿 )6` ÉdDɹ>dTiɜɜi׉٩I )Ii牞驞ɞ )Iiɟ *Jj ʠ  *Jjʡ !*#J%j')+ʢ-/ 1*3J5j79;ʣ=? A*CJEjGIKʤMO Q*SJUjWY[ʥ]_ a*cɢfJij9<ӛh9 ٕYY৳&` 2)!z kꛊʧ~J }ɨ Y F%!&\F&eڝ Pfᘋ2LAWBt*AIez*iV`zx4 :֪diUY]je6 Z_Ū8EHٮl)Ŋe5iԺY9x 2<)d$9x)SګjZxٮU4ÊJEɲ#QlS4R7.-1 0f*$RkQ-7;J۱L;olYK]\[($k H`p" lSUmpk!GA9B3Ǹ +\&R0)y>"# H0  Tt#j/0#s#!q[ʁw6!fչK"u kaU##QMq"P q@s{hq.뺵 ՙ[?`KFPq2B.003/cY),,L0 H岋 ~AZ߀Vl5*,&(+,&ዲ002!.݀0q,,WC2=A,RM<RC/k-E.G3T2w'34X-Os1d$~L^L4=L&RsY we 1 KoK;Zȓ ɬ:|~|Իh %;Bt;;R4BjLs8>I;s>ӯ ̙SD=+| B|.2 L8NP܀1'8lWlM.s˙3` @'JLqPJW*U 8$OnfJ-S| dP>OP}P|l Ӭ>:BS>}Ket1׆$LGfGaH\ԂOMJKsmMttL>=N1RHE0 uKvQM-(2U]-*YZԄy&AkrfVMQWO\)-qHUmMW" eۀ;0\kfk׌@0M4%ݠ5d ~mUB0L` @UX]^CX}$(XδtZ']Y Nd.W=ݙ6">=Jp*LېLۙ M ^;/-=^}Ye0qjM$'aqm&Ԧ$h@h7c0`crCON`[eNbh՜m]3STd חǍWWAȌ慍.zehw.0HS0joiPN%.(pdʹn&> Mx@Aj.=ẜ, ?ժ{1=ZPE@Bk8k(=jl6OѾ_A7n>77VW<\^s@'B:36Tbhsk-bql[L1l}l>20`^Mas-C'Suk0u`7u OӁ؞o0ot6NmVFnqv%m$Ү<[ս;7^ M0 B A h{/E=I{{'|'! Tw*x}H{!x0u/wGx,m 0u18[x3@CC]>Hl?#>~s 8}i {aч6þ6t ٹ./䵍{`)&TȰ$_/bQ0Py x` K\ %Naŋܩr7ݫ%,wjwINj(FM0fZf,Z+jk5Lŝ=U91PF MD&/uL!2eɋ  ڣIz4N>%}WR"3emЉﴖUwQ[J t1I&[2;1ބn,shT<`;@K;uɮŸ[s7V6)ċyro8MThHʼnoIPrtzdqc=lhq004|0 ރC9PVT>BĉĊ0xGDDBCœ:R$tI(rJ*rK.7/TKJ15TsM6tM8䥜,N<$;= r( > 5PDUtQFuHG1RJ+RL3tSN;SPCuTRK5TTSUuUV[uUXcuVZkVPDTW\{5N^6R>LZ6`/mvIeGrL=}[`9N[vZk Rŭ\ EG"U\v|{7zEv\]-~{v_{QL߇2b$#N`kr,ZtӢ8ޑ/e`R qLXdv^?K&dofc#%拋eN׵NݤsNݢ>ڲhljZHe;6{kqӦZk6ri~LՖdb۾I٦;nGn;z%gM{t ɛVל(/E_[qٕt=qkriS݃kig͗bz:&[w{o>w_O7!os}|ƿ>/f_Ǿ^zuq HOW7-5uuiiB`h}`Dz8:4GO G3Ѐ4WDKԛaϛ&I?UܥYIχ&+ JI2 ?9E-RRL8Cs ۶e*{N"̢6')F]ѝ@.8A}~{lfyO_D8{:ḯz[d8;KJlHMюQ#ɼjy1]L8K=D#ISubt{$ NӟB Ŧ԰&4?Ŧ"ql~tm׮rPq\Vc7Vp3z UR͠K%*J)Ҳ+m1wΛsx5VǺX8:uf,&IQgȀeXE;͂AR ec&Ql+!Imo}K+nq,VTns\FWӥnu{]fWnw]W%/|~ I (o{+6xZ >!h fQ0 %hxo 6q ȣbNR;&r}?P?f">tZ"{}Oƿ BxJ8>sK8>@,Dw@wx@*yMH;{A˿?>*5\ >A gLlJ Y06"w0NBN%lB#A6[8؁;: ttpHB>`2=l>$tqH:kCP\'=*E(qP'aE Ѝq0Pܛ%E%E][Fb.;)Fd!,!,nH*\ȰÄf=Hŋ3jȱG?Iɓ(33FFJ7fbޡy2xZq3LЧ(kpjΉMBʵWt7 $U_ p;NvHܦgf lVi n*WaTJ'ZXG_fs^^FݔxU3۸ssmn[M"m%8uqNodݒfnKe̝!o$weF+i̩߮^ҵCnhGɼ@b q%4E. TaA&BXz=7[ eG5tXuH3(aK3=#@Ƽӆ@ HAm$א}ʨPsT-3kD~whxdx;= &icX @_h#V7g1밣LѡN,97@w9(S#š;#)Χ|p iΜ11t J**/^7ߘ'M"IجÍ B@T3;deн9źs@Bt,c7`DȂTnei$o*gK::j;i]N2NԊ/"2 3ʼzD;@@N3M%Y2eBM49!2~z}pYȾ<2gM:T#N|s;s?<53@̘Mh,']PLeT E'Yv24,#Iֶ*HL$ax݁;WtLy;jJTwͫ :Q4!ITSa'"QYW&P1iajΊ cRw_MK+LAph3OئHJHwtIHka=>d N\ֺ6(*\qB^JϺ-9`d # w\k:8L wMBYwX}wpb*k>eYL@ k_ؼ0J a7X`H^t )I1Q20PqP \ 7%r$ǵٰC⠊(lYT(i1X}OS`Mw#*1Rw2\XℕH}tţ$g@ [v` JPBDR;Ƴwz^pr*DĆe] O=xtюw|6Hr8j#eLjgGQ&đ d ԰}쁤: 8*r[]Xҙ;P)3jѰu9hm5;|y2?@V})Ib B[Zzo"ޡpH(݂!X*W<_.qL{yb FY!'@ʫrw1Xh@` c\Dg;^8^xk.a<'W(='a_Qssb [gכr輶:̙{~58C Th@/))$B*2*!GHQz~"2Bżdh#sA&n?!QAO y>ko"OOϿ8Xx ؀!8~%\'50() -| " 1 ,#Aa0,, .4. +3S*B20#3n8.0ȷ:}:fh 33Ch4Q35̘8Cjhdl#8& ;]9{N`#6@2/CӨ;#:8q=h7[`GHD@T3t-7=]ey&B*T`+> 81B3B$=C E=( >STymutG {Q Li M! MqpY9 [ٕ_QaUyxz|ٗ~wxK)Y 7@uW`. Y#M1cey`D4oD@ٚ! 1EPGn=5RE? b 1P:.)S=e2iD&x?eU RRYPQGW~5"vS]\fԞ}W@iߥu[Q3Zer"2ƝʶB顜U^_5&H)%SR.6 [8ޕ;RIc ) c՝ dQHefb_?da*ڐ B"l6ox90hi:o&jΙvl#M B8T ҝoFn qpgFgndzr9a$WxE'7g3g#Wr誰u!uRvjv :Z&|AWU: At7x tXr"jqyg!A}BJ Zw|HhТm9Ǯ{}z:P aװ+QfO{{۱ ";$[&{(*,{x^ֲeD2%ag6; 1 r<#XU<8Sc9M q 2ER QKTf@Y>+sVˋ'; `B0$358Տs5 Y7ģ f6j,1?P::HP`2gٝ(QȦ:P!e\U8<ȸK,/12KA34EH\I0(ǹdD|ȗ<4-CSyS0683<3I rNxȧAǃ#Jz6 80P$IaDwFEDDX Rb,c' Pi GTK"ESYL2d$>5Kt0 ?^c)'y43#Yu%ƁLС ϡ,3?Ժ8@t>4>?樑 !D'{ xqۉ02"IJF"CؤMsHdWtdGxiM  ԼӘB \}[aWɺ`o9h0L\-^Cwa%Qpˎ AG'eXId@Y`y\ յtKZ  àwzQ@ cрϡr֐[U9Qey9}U Ž~ӣؗu) cT[qԹpج<Ej E{L0K-!/Q h&d)]v6=0 0 BB%3W7@%%] ƍMO],P]\ރم-CO{1=8&,eAD2CV2$#p㸶PIc700Y7\.=b@ &|1fQ`Mq`.MQ#R_sS*,/* PFŭGߋ& Bp[&m㬛`H>9_NNL6,Bps>HIDҾ2}(Koo Ǎ Z pkVk>&wnVn a)*&cnVī^тr1^#?]Wf4gJh0t'w~|q|L&0 tm?C #&*3qmyʦol@i%[g8 xTn.[JygyM᭧MKX ҄ 32#d)00 Қj:x9!\y91yWr_xooioNlKQ7u+rn9U6lR,H+}G0fk3y[zTk }g!n1=q}+e <ON DPB >QD-^ĸ0ʻp2~ȫȂ"IDRJ-]SL5UʰSN=}TPEETRMkpjTU^ŚUk̩[ vVXe6Ymݾ c-ܞsڥWޕreU(0ߝx FاaY1/+'D`;וڙq6KkFT䅧UN6y.h%쿸c&pās-b֦g_;ԉƏ_򩓷WvwʱW=y_?ܞG(^Oȣ Lœ+-;) pCѴ j?CԎK9d{PCTѡHYE!Q-jxɷՂĻ8S3ڰFV@ p"pAr ^xP`nȅڨۻm6pORAxZ=ՕkrX)7jZp;Ohx"\N/y·e#N>2])P@  |P?Vt!|J`8An<$`] r1` `(H x@5nHZxV\׋L$;ͪ[S-.\513TΈ@H9  B@ G 2EmNlE0^шY| PqG)7FʁNc}w/0BǤZVB $0f k7L^}`8N0J^2'p"am` d P8@ @ Tx ,kIT@,Hh P/  6Wd͕%-m$VU3̱?К'690Ej]#WZ [)J 'wQr 1( QЩE) ,is`A":QGTz A/F% dUkUZY*UX)^Irx&Q* *4#6uFT3ZFlF똘F [\WyZnӂ@BYc ,_ʔ4p) qN(/@9@,Af+K|@RNlf5Qa HCZО6I[ؖEjj1u|5"TS@ zNVVf03sS \jV1:'AR("d5q8/7-[-/ XIحӳi'm7(+ ÍmcN7ngy7vԝFJo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>D,F'zҏ0]O׌"uW}/T ֭uh&QP|A '_ X]Eء0Hю$暴A) @@|a$9Pj@(H a?F w,>"wE?d@<;AB^M?REEDH"xG ;@/ ; '0Aa  H51a| u C9;X ۾{ S`>w`\sv%>>#Fxu[I>0h @u؁k>۽{M W t +w[cHn8hx #xqw=BxT;whw'BȾ-t.",s`%4sXBxƒ`p0ix$K<@@d%xc0lQdC-Lkx(L;D'C`W{$a_v DGhw8.(wDJLv# LDwDv054xd0&hXE.<@ft0wQ\ÂhÄPxtab\5 3>4eY惁c2?l|Whwj@j`}G w(H3sǂ`wȾLɕ4@Ǡw~w@wJE4ɔTIpp@oxuXtK?wHTw(C!xc`L7,ɌN0Yx.\΄^xi@;pȸ-2(K@w4MmĊxɘQxs8T\FH%XTn`UUc Iss(@tHL35 < ͎:5`'2 n`dӤS5e!v.pP[hhi sV`c5)cĀaybb0PKha)uiPE uPcn@<,68u`e(_in<3Jd(EPPduAu-DXu-\0B6dew(C.eZ$:XvpnVrhu_b΍m6dU+GxV0fcmX+]OD^F~dOdK.~T-g~~JTVURs=s@hH(fvfhι?.[xܣwp[  VthDqPE6e`‚C' 4xYX $XCQuqx~Y8ǰY;,@DEij)J^>hh΃VvXW^(Kr@kꌞCڰ[p=\8hf n^^Ui.|ֿmċXNwXli"&V@ʬ^9&P@)$@e傈cM88|w8X9 ew0)bp$wHLw8f.bAPj8m*TEcw0B%psxHAVop?kC>TMxt~m~nlT ~  ?N=>\9Z.x&dmw<@.]nshv`vBn^ X\kn RLuqgq#d u`18= =d/81vHa`rke8Q% 'x\qr$uG/Ip.74_s?.pw0d(m0r ؁cWPO%CSVu nk%t [hq;r`rr9-8uhw剟w@&QxxW/7ÄG/H޼b*ETS- y0m(# TI&ge_ upKXcP}W_d:8%z HgD|ocw`wWF؆w3''II@EHAs~w}o©{g?'XgϾǃt9uXnځ0λut{ŠG9rWqr0`i9z9;_cJ#РB-jhYU ]27 c6%VX܊)X?ޅeV*2t6† ƜYJʹ=;]ܽkq4`,f #q2cR]H#NxʎCXݱ]I2lsI'Bڔ^s2o9ҧS ncYZCAe`Jd:@@ CZs= + * G,lOł(Cj-zmdI-x../f;ٻ// <0|0 +0 ;0K<1[|1k1kF S %|2Q1Qy+CmƲ5S s33s;o)6 XSN; U9*VGYH4[@N4R#JAvtͼ /|ą$-M1jL;J]7%՘1#ȁý96F4rXC;xE8)aK3=#Asþ4sfs2G 9@Q(ePL"v P_Aw`]Na".@W9lEgh7[3d!՝( ^ϑtϛYz,3N7/SV:ֳs^:.f?;Ӯjfo 8[pPЄPzۅ4bwu4Acj[ˎ9te|v\~v]~= FktjP r<`bԖ0;#",xG0^G^xG:Z1 'R]'?,|/'[ga<ğY -NT`I ;DCXr qHƙ PPQPTPX`P̀E;Q  `) ;VC tG |`0C,CC;D9/g 94:Д r'KL; i8AtC5W aa;PF7X&6A"VbPm@"4*!"+ j F0A @U:C5 l0S bܸC4*bD, LI&@S5^c6K OйDA6b/b cBAcѣ-؍,bN'C!:;@RQ 1&#8HL?:)6*:U❢S b0]HW;, |_ HZ 9@(WH `M#c;4XPSz';d»DQJK¤LUdYrHN 9dDSKdLN:}eXR-RNdO$`NZZ:[GP^W,&[j c.tdKC$2C!  t4"ޠ"2‰)%6P@e&TllC#lGffnWtgfTp P:pAQBgVifrg& is&j uZZaP| $Y2&+},R&;f9WDyP iC&{INE:C5h^R€ HSF%F&@ p’K^hBfehL;c&^pAV"T(QcD:z@{)9hC$WJc*F'*K;|AxB5PJiN쀚>(jfE%I xS&`Ņc)~)jENJ^e$ee>隶]בW.) T]&fviDkR;\S&FPM)gid>ehBm(O Jr NE@@Y$+홃6W YK~+j ApYz:(ʩkk}«~rjM&.+K2iPELE|.X4=P鿢*Fa9 E+) ypC(KhieiplB}% hZq4H-aDIW`^IZ,Ȃ%jd)IDL`d:Hkm.KŸ!`) ؔ7&"Z$x"A;`[,P䶋 ҸAGTU;l\EQ7$F;T[. . @4R6#>In+2/hHcQ`c2WA bJbzH F&J%lP/Q 2G/f>dn˱j #NpK8n kܭB Ή0 ԅp0 pnʰ 0 םdX7:0p S :Gמ$p4q_G*`kEs@o Kl۞K`+H1cpq^/31pб1+g{q$_C!Rߕ]^?$G/#~2$$2%/)q¢o/,J22/*^*3GN&3_*'1$"#"/(C->7c24'3+Go;sb$X3;*rƳ2cs[:2ӳ9w#//8A-6<??t0n22G<#0rA?JIbބP&4Ht?o5'KL?.s;:GEut9/t34>s8S3"o)t`tM/5NqBooRT73pP '3,#u:u/32Z(sqC30 {4[I5^wW]t8_4kA B"YcaDQ~;~B>RzmWmlC4|DDE^$?*ͿY~LwT~/Lx>MK[@ N׀TӖn]5qI FhHwՆs7`3wy|v){׎M;W7qF.;!\x2@̻wΪ[v^z*`+_&ĢG.52̚]#~Ef",x0†yldwns'Fq6ـ>14A{x1k.< λV R™M2]&ޥ2س96gdZY"L xw;7 P >oޙ`wqlMtn3ȷy0y?1L(zOV[y`Fr ߊ x4rU9ѸhC"1ȈJy' )ک]ig\3ˆiTM0$3%'˲'#N22hqLoYG1Pfw4/vQ+PSmbey'–xg,d9;V_<1u\w0*ΌfE"a= R#bCF<ѕWI?S0'ڏם3hfYa`*5PVquRfU Dzu)p[^4*Z[c-TYv֭wsym ɹ[HhhZm]>Ǭy樦rYs 8S]ũ;@klȰyPwiZSH(RstI#2٦8̩ͬe7Yg  gh"ܨu*kޙB˹s}oϼ+Zktw;ݘ6 dvwb] WeՍbu^ph U''6G@I vuY L0h~=2?MZo~v8>q;I3̀ 3 -ӐIz#ֿA/ ȹO|994^?'0pBBf 0PJa  PZp9=A0EpIpM0'APRq0upyQyP0 p 1p 0 p 0 p ɰ 0 p ٰ ! wpU nf~p!D!PpL!QH$g@upnU H !pl%aEfQKQJAS0+C-9 PPxhP A1hokq\@P7jFt&/'Q/&BQ%L6+H !P"%o "͑rD!k s$E"ѱ+@2=f,m r#_#q&/PHRj'42'q%o'q"(q|aAHA%NB!! $PB%X !p3iF'HSb%Z"@BG*&b*bp2"!!"!.$4I,d&MH(B,Cb0B-¢-PtH-|wLtMMQ!bIIsDNJqTKQ N*B+#@B$vJGU/,cFk4*#pV"PPRՔMUuSYur|aa$DJUT/R+>0V;?%o8D6F:b}bD/4m" P<ăyNم5ol)E1ڨUqB駪piBReY"iɊ)iN.""`89y"nyeIɫ9y({29yy=6'iTksB I 嘁Ā!:xyɤyI!aPaAnbtkY%bx+E+^ j\ʇ'ʗ&n*rjҘj'뎗7#Z9/ZPZ"Z Zʩ8Z㊧%ħ XޢX-۟٥䪵:"::*M `KKk7A8m*-l#+I,-ˈLV.4L/lBC΀Z"zaZ  _'p[)եd{%H-{sYwLy";Ȟ6'[[[xeJG%;/僼 bn(f ܏=/~"<$B%btdqA^DU~Y&@eafqg ~陾>~ꩾ>^RXdkO AǐpL~ᅧپ^~p >P>/i O G>;pEpp8_s:9YDToǶ~;Њpo~$ mj_? ym~'8 pM__B~@j^ba<`B*DP ĈJÍ3dxqaŏCZ4y%Ŋ%[jr"A*IX3bI0W2C IɑG&}q)˞OrJU&Н[vgTa~}3-RR:M5%Ӹm }gN3jX_C-kUh*1پ^lle}z jNCgnLsOћ[LqfEV:wmبu|tvVշ}Cnpw}|'#nhkitqeuFν(J 'xʕ=h o/X_P`UнG^z1vu@^x)WaQaǗwjqz\Stk޸Y^:oK+v(n12<饪1O\WMjrwF|}d%,Mi37/4+юY){$;L⻝B=0|n׊5`!H+kcWuڮϞ ,LVҝ3e-6;ml5i}x/x?yI-u_yoyz-Хzꪯz뮿n%N{ߎ{{|O||/|?}OO=_~}o6 `!C3 ($ } ׂMbJg. 8N =%wp;Qlnx`;*n(G;ܑ@Bi:D4BȘ H gg%& »8JwJ#ޱ_b `mD qC%%IaBEaQF|wH# :br L  0EuؐHv(_ 4CCal\$ӣz2=ϧ8F(tA ma 0;0T#;R!(2 '1wtt?=HOz/yi^-"jRԨε)=Kw);]&ԧNA)ݢB h@\=$Cc"nr{V7wB C=jn7V偬Ȅ@*1f3ļK"ۉn#~rc7 I yen.`hܺZ FM~uQN-Ֆhު9d`LA,u,̸ .\; 19_Y5\zD b` }Yߺ}Lmq, i_@n D0ѐţ]]m6t E.wWG@Ho~:as^<^ݡ$?O\ q;r'$9K̞?o?r09 uKXMN{Q 0 a% ^WacWv@ef";EXwUxwewlEx` XX QU|/H4z @'@Xw=n2CXH8W`' NT@wp7(]@>8^7xka.0@h*',GHDŽDzhy1JPwY`ttR1D)24RQ tHQ@Y׀y{GE7pj$ 0Z@~Xvhd2WІޱ 2AH8xp:HHy@F N0$s{莢`_`gOr8X&H 'IBnHq(r9r0Ir 78Pz)gH6a2hY#3$?`7 Ѐ  @ PlnG8`JSKٔOIk0PɌ&h0ؖW9Y%mr!XU|m p{Ue0Иp25P 9p$XLW` Q@ l(1y0'{)ᚖ)Vņ:bP@m te(<5L4,Ҕ+)o1,0 E D \Py{GŅ q6f^U hRwt)VQp ь >&jt_ɟW\#D'*@ di0zb ƙQ(ԠxBJYPOؙ9JR")jVI;ڣ+jc%VJNZjʑb*d (~ 5zVI }+@vXxV1Y^ yq2hJU2&1x; yD 00 eY=EoCW !hZ0p0:RGx #*Jj{0ˠ܊,R ߺ%T1ЪpTS{R*W?(e6k|:::A3eQ:Kii@ Ա(kRzʰ0,u)۫0{jM?T@/u5(Y6٩O$ig[{Pg@2@|>AhM%r UJAf@pLD0Y0M4r;y$}[1ymH?bm Ȉ"auI񸑤id5ѹAB!g`7 QJu#0 7*}7eHhȃ3<:P k`{&<m#֣λ;Q{K7fbFc2l檕ل؝3Ϭ0R55MN 0g=> ` 7hkظIn%Wq 1Pn9bU[ .(ߨxދM(E71 e +1^s6Iz ^Vf0kHHΗmx҉[ Ⱦ01 p>yt9vMݖQ'K͚֝tXkv]G 0y^ՖM((~ 0 QfJd= H4 c=f`02j}d8ڨoC=5'60u:]Kq D?|V2<{B1;~>RWQU+@ַPfU@ݫR%nRT9664E&833y4XAdDf*FbrCb6քGlԭ_$;E3M#oj3Ks=[|;:oիO;ѿô/o׏ٯ/V [@]_sP)d8cdBwNw*_o ˆwx䨁\r&wRH)ygyEO@%thqI/q@dP盁 , bg"0wSxGUJ-/8ȉwrl*dOAvXb*y(ygR\ynjv8A >&xGB-e r#!1fLvԅU[n%5^e^%1>x` &01Ih3y:ЉDwFYh+$Oԋ O|wW0^ww XzhCx~HZMg qxn\~^Y#$`k9ߝ}b`.n[X#/RgY~0~N T$ 1(j f1xVZ!$bVw=fbyE}w{(VZی"f0Hg1w'Lw,$(L*9I iǤc(&Nu~yꭏ=\ _ze}ڨn/J22% NO`f*1.`GAe|q;BPRBޡFP;a308χC$bxD$&QKdbD(FQSbxE,f%fM`?Qc$?40P5DX> 8M 2r0ήXU&qt 6юcR2aKΔ J%蚠kuQ! 0acI%EB"5)' 'ɛ$e1 vL$$,F!h09;P9qeF`p3Hf0S$|9i̛ƤgYGgR&Ac)wHq1 @G:HNA!юv$ 1A8юQ I tck||w^Beܰ7=iJ%ynR A S(V@`$$Tmcp8gFбR?#ʐP9*ݨ' ;?<%Hwb 6!8 dx3R7eDx,ڱ5d+{Y|-F5*{<;Њ X #Mլ*]&ca%F~t˸1ai";&7/F+w_0~0P9Y%$)mW7@ a ڽɊSKB(@Nk(T"ae7#&%1I Ⴘ5%rx8]QcaТ"0RXc蛑NŽx|WE1lʔzor_5 ! ,fH.9oF!3 q!0:T$Y+`1׹`<9ЇNtoH埱yVgv\ȫNci.eaFj͎؆H~ ;bob3tQ My/J) mcyDD9 H N~]-t*6Am `u/Q M0d>YH8ұ  wdjfNPp:læwaC߁@^W%O5NiiSnЉn􌐌 '3)!t.{nfi^S|!Ŕf$Oޡ޹GPw|> NAv D 2w̫qepYpH.^Jh #As$X&)/;pX|ݺp pAHc֒vKXJh Jrx۾@֓:k3@Tq۰kALo0wLp<(?MɡTw0B?r;0)Q1n3D1ٚseXThwp8*)qQ8Z@A+|GC(9lw /)2pAKb6pX1PCO0c,+Bti'*p'!((S| \ W&YtгK\"ЁR5iƇ`IdFnR(xp@ qFtLuuRGw!,!,n|H*\ȰÇ#JH"A3jTqǏ CIɓ(S\ɲƎ.OŒI͛8sɳ3R *ѣH* RN"*ucӪXjؔ*ԫ N+Y^v%ziYbն}K׵2+7,_\das 6X!mTv3kx&sܘg;wTm3ŧIKz&Z@1*:a0;C֕,掭b׸_૶7aKk_BG̾pّ^k|q zѧ gaQRhꩶZbha|*V.E gdw r"~7=Vx$`M9'H1zÏe6/Xs}vp§Kl濑^s-dKym\nUG!Zجsi-ۧs*W'Lxȵƿ=PG;z)7ݎ@4 9>Wz}ajzXxTWR )ְ3ޫ`8ydocXI\ez=F@Wlo׷Do:%ח/Um( /Mknڪ*b'1MWc@g'"3i"x+x~rz*ymg{Xrv}#I GnuWvW9rN $ |uGsu-ķ6"}l|<{XxFcr82?w$c=.2OxJxp/y'gruA(*@g?wwׅ.s8 |6z|f,wgpU("{lw6"ha(yu1_}x7}~b/~Bzs|ԡsGuH7-x19!sٖ SE~oGpIsgYASp=x,TtQ&Ƹ:hEǸXШ8ؘqvHxQGh5_1`0uP @E0P Q0  B Q i0Yp^}y ؐ"i! Q+^"ْP 0 nH)P )C _T0ې ` 0! @ àQ 0 qp0 0g  ѕ_cM9O) P}0ba\a)p &9 IinK;P9pBi  Z:/9f! mU P9GPЛњ阱y ٜѕIx bͰp ݠU9`[IqpaIY! Y zp  Xyq  @ 9g iB,ʢY 1q`I8@L:Сa8LIQ@9jN@ 9 ;*e0B< ]P Z l@@P zW:L]ڨ06; @  @p ifI90:Jpi00f ǠЖ" @ѩI b q ѕJ*3` ꫅  pmjx `z jP ٖ  :B`멏ɓ@\`+  y 婰x9:ۤa(k*  Цq AF;T@29][Qe@ $Si0:`v[U!%;`!&)e+-+젣P8;SkS !?] ::&   @%jȫ[") p &u{ʻ g@CH); I Aټ aK{"^py ) 1v<P~ \ #ܹ НZ0!&<$35pm:ĐP,pN Q\6TkZnX]`L<_cf;ei|l:kor\:qlu=&-D}D";L}'JM@,VMfkW}F!5p ;Ma70 ݚ Q A`MyP^ Q Ўm  pdM@LIAָ a؈M:9 &[IƘ 0p d]MGٜ {)=; !l= XJ`  + 9]25A! m ޻o*~x *Ġp ǰ ]=0 >Q;y  :70ޔm>q9N>A `2 &Y.T>  a: ۰~ >[s"n%.`Ei AF䟬a Pƚ*ʺ Y o:0 P1 Y T<5N)钮.? ]@Eiט.E q.̀/ ^ yo ~ q /;N OӾƈ>ݭ9 1>qp ڞW9ٔ.p)+l0A (  4~ ?Qp9o JާRh?rгfOk R) 1%/2/*O  ?_<]^/,"N=bйpOq = a_].I_L./?d0. ;K*l q_?N?Pᄒ 1@dn1>QD-^ĘQF=BTwfvܶ=q; NwƜYA$ҋ6ښ4-xӥN/&J'S\9у\wayJXe L;pU; 03v̢C55;L DprEZj֭]yۻ¥XY=lD.T,/~91 y5W\`kk3w5TuS^,۹w /P7wԭcwh Wʢwx#/p>`?f/ (ḏw 7#8)b u^`Udq -" |/Gwǃbwwhwxi7yn/m (ʡeG! 4|(>'9scIc@S-{H$PLrIP% ämB`B%PC ^NCI-R:9hwZ׃fяd 9HBҐDd"HF6ґd$[c@Hd&5iH6ǣE(_ ˪1`C(i1y%j\M;Ƒr .apLd8;FLlhǙRs!PE`P #ZL)e*dg;ɚ"O&6nz3L&@Oy./*F \cxĝQ[eFjh%d*;zXHMHEрԝ}%M:ЅA;DOZDel&O/΃jEtHJOA7CIQs;V06rOlrMm ^)沭E:ԴհLD@Y x2R$_lc]'NvB<PβC21Io$JV6<ĮEzVmv0iXu@<@%2}=}'auw1nHiO;:,#X$;34j}.OW%;9(3wtCghm` ~p T g2(w|q+x Y9 ׶5Vri8h X:si;8Vڪ0AVV@~ЎuB\䖻u|r-$ew`/D._:*߀rcA x>&XMTЊ\ h7uNM !\E#,=IMґ PJH:ޡ 13rk2#(5TXBB vY+ەĖna+өvU!1 |lNxЭnvݮuɜOfcK?z; tf{5p:T]O!\mzkY! qHBL!{;;/G @VSF(sАNƌBN|e^l *.NGe*>MVq>56eD#h%(Dȝ[\־YC@~;hC|t`\NROc ;N#Ğl;Oy kxt[Zȴ)R0I䶙7Q F7Clw߹n? ]8byH]<;~X%9ѹ.H_I9 ;`3 vb:.0p,4XB+'?/QFyIAcAjsL&n28:2AװS@dx $[:IS XB3pHQ bȕvYx}~:|C2[ƚ)SS轟*S,Αq`@i1ìQ1B k!JTDњ DCčD4<4װHW`颿 xۛW|!XɌ0I\AȃFZ!ɝɞ^x=ʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʢ8'0DQ˲w8:Ki(/ԜdrsdT pv03X`Y5w aLDHx`āPM֬I菓wP)1V c ?}@),CTEeT\}]=uH885*&C wXqBsS6T)u،Px%m¡bÁWA5Uc5up!xVop]w AڋNs-`KbmփPXqeXBsMXvݽwwFk%0Qم#w(vB(9:eb2iE.Yad8)Wb]?e*Ȃڭٯ[o [88eڄjhm`u۱ ErZZeٛUٞ=e*vuW:p k][YY7%ZEZe-\8\y2}%] !xp)ԻN$9ZO9wUuHjye:|žW RǸ"]=ح؉kݠ^]0P^ 8WA]_jOAV]MG=+z^l%(/VQO{%_uX}X樈&%;YEw8OfLX$*9_GQ8BCA`. ~w87RW+v6Q8h!l}`Pa"#FHXc0+d&yR)#N `݁xc,2P֤d]~K~Mf f)FC%H)*:u,S^@x@K@p}{SV~jY\ wFg gsF<HOi ֲ~\ǁXhhh8tXdgwgyfy!2fM҂9hMt#p쳹@9&DlealoeQnVsmp|ˎmծn"?f nv*ݞl.E mvnǖֶm^AÂP >n%>nFm6oԖo>9Fm8*šãv+#cIR\kpopwp&q5oWo | ߹ p6!k.$Wrq$O&q5nq  \q*WoqIr4r l+(@"or2,66,߈N.q4/0sD3:s*U϶gbZpWsWs ?q4t\7G'G(Vs6/uN7PsvmNo# vdGv#rq%'wMr9Gwo7hOuRIUŝ3p!צwgo=7}4qgW OxGkm\o%0on >?tE[tn1Rzyw٩7zz@7mW7Ųm{͞Ol{¤l>%Qrğ%YHc['SsZyǏ|"%|G&HpHḲ%v|&QO'nujomǥb'}vcT :4$L@d+-L o!©j;(QYnqG10,h`3u \!Ĉhw_z7"Ȑ"G,H@Y0ϻwC~I%dp.Tɒ'Р[XE ȁBtY!I_p(vlTS u[hц`هPA 7t #EYfܨYɵx!R2HW.`)@aDM^< F1[X7 \.nSxs'-IA_P 1u ۸F{WU+) :ڹ`BDޭTmu;s_={PǬÎ2Et]W~ހt;qN;T ĝw5@AIgAl8gQ| PAUt\rE)w_p9hX8M55;`*tYv(br3#O>G:s0(~ܬ8@6dØS:昃K0SsnYG6짨9\d)ZDj fciY#<;a0Upq3зA̰;*hΣ ,WX;˄]x"8IC;"Kc5S\7ᄈC3ʼL.tvP 4Vcmo:%;4m4T wSж~^/=[A+8+/þS.W٫2 DS9Ah#QF;m =1N74Ӌ<tJ_; qDEU0.84n 7/4;BpMm6A.Ar;†E;27;S߼A1Aմ);;;T;; T/K1sL }wl c:1PLj/aoڻ -{1@6> 7dDi7.".F+, lAyBծ\i"oP0~"Vo84Md'@i"A Q>paF& y7vLd<^-X8 !͘H>Ï }ƂdQ6A1F  u8eKsxrI%;FI6LQ {KK1ecIޱ аsƎ9 s$="1i3ɖqb 膔.&ArY^T bB0s;r1EO3d.S8O𥼾R"s=9Ăjǜ CNHLA)S7 bOq͟@]vJ4sczM\8 BL@PjN WZEc`NBl }CpJ31;QdXA< ! XΙu KػUCYeYct ]% yDXXRԭ-AbrܭL ې`9,S\$#̐;߂ֵomAڲU0@- v 2XMUH4Z Y5ML=#AaFؒ1+;!cp y%/o#; %3 9,yFAjrPY+$eIo,¼6fZH' '@䤒A0Yz+nu;PަypKe}YcΧA[XhYld!F.klh2ky "P¦U{^Q>C #5]g"4A&J ,EU*(8^u9}V P еA,ᜄ$6%Mloyc[ɂЁ;T+eQ,WpԃU<$+#4tRT] 3nF,j(!@Ҍ<$0ƛkxgt%ԛ^&%y9Do!Eg]xE#wwAi(O*Pn_ud@i rn"$J'H_#G:G7U ҆vc?j}NxEn`<;.n;@ӽrd!1VK@ J|e=a{.vܞC멨QG8ͼ '3 D0qTћY* ;*Asj پ4o~An3J ;AD:LYa\. %IC:_Q A9E.ȍ$+UMl;CK y4 A ܭ[QЉXz^C0BٵA5X-C(\-au_9_8&$CXHaҍkdDOV|<"_ET:4zώ@;~&U$N~ö#֣A\BQ_C4 n)@+D7T;lJ'-n-[;|7H "<bL;dM(b)-Ƅ-A$"hA ].bg$D%^b(ibNID2:)0c$*:BE+ DH50D117zG>ڊգԐHLbLTL=:"FdD Bw+k5Dd8ȶ:TD%CQ GfL#HQ BeQbP¤$S~emHIPÅASAMFdW ::!e[`<[F(^D]WA%DeVWzeAb` Pg 8P]2&\^D8CdJa:bH4H J|CeD􀳩FWZjeXbm&na}DZop9 PȀq(s>'tFtNgtt&uEvn'C8\%wF$!y'zz'N`'{{J'j'}֧}'~g{D''(.(6>S0hB(V^(焲f~( zhvzh( UDu M_e"( 3ږEō(N{y^f, s6ixf@5e]ĘEXA@^)$.iD V*u^DC^'nDiLÁ)HtNIjIsR*|*obmrk,eX*iAX)YDKɩsb'@nnҨC*P@tJ*IHp+&b岦橎Pjo.gh_enn(m`:ljSHuh5REROm*de *.@|ŀtDj ņ\+I`BDg6EKv[CkD,ICtXjCHňʜC#C(t(|GxȖC\JЈ8E|Vzb\t (HLkAJƤ: `pHĉ"Bzʖ!\- ĝ уw8d8l}p řl0,\L&ʢyXGʇFfȆt,JxBMG%.DlDCq3l, @ޮɍH. M.HLnnD&-B ǖ@hC2RlhxR4\o 瀎萎L jMt È0N0B`h xD0zMDv~pM74 r٤MEC KgEj N`/jAŒAhNpD$ƸC(؍;0єM E-C  @aXDfAs~ 0nqqKՔq JpP VhE5D d,r mEk i6&!a4I@P9I7i$2E9 $@h,Wp@|@px EQyrCpO P6/d(3lLݑDrMPUQ'A9i q)%{`R9¾a:ӌ"E ّ2CC<);b@B HH$r?S@ɑ$D.5\2UV̔SAT30QW!CTʽP-Fr-IJ\*5EY;EXUTK;`CSx\NCK9O-N=QuSiLTMKDW+fP;1!2 Pkr [WUBCRC5͉u;aKuS\=Z5C;xbtH.LYK+tC:`*^NGW6^gEDvSgC/WSv4D4W,K4VuCxxo!e6owTCVS:"ZxCp=]7<΂3B32}w4"Cpvpw֊:ro;V|KOᣑnMaS* h>A} Ą%M}D7T3B I!%~!@Py%l* P8;p6eY8ֻwIJ7-.PD/a89ȱ# Y,wj!HFTc*i adu)EsށQX#@}yw'V\Qy)THawcp6;-0]⵸w"2 SJS'tN%K\~ ;֢BOgwC͚Dzƚ*',w}:%o ]G,Z]H|q~ &lxW`Ry4/Eֱ:Pu+L]aLީFq($hoRvYoR¨(.dBL\ÉhG*D|@U~c?cӇ_~? W;X#ޱ_8hڇH#? c؏UHD$jL U.$L7P" ' ꈅ;sx 66Ӎ3PN0vas`c)m8F|Q\e+IwCGE8x#ut8 TN䕱BQ| 7w0?0І9Ks@BB@D8艉T;7#Oz'VɎ`.Ә7n@d Y% 9ˁ U/q `niЖb1ԡcFaY3W",B^Yjs4Ӎj0H|WP=jQSKk;jTHUxG2"]Y 52шBw0TX _p/Z2(F"Xu]vHt׷.20;X2v ݫjv䶹5_U'V/>uvB6v(=;TԵ.v]*B%v}lY:z]^6cn$xOnui^M궾U֡tpwsWUM*$y! "Y+ZVXPeʈj\LWV9OF(>dD`au47*ޑ $08cY +f2y@b/8}Gl)e BP15 r,w4XAjk89ρ1 )w"+xGWjI'{0=b4~ǫ29dfT(VS-THx2n0'dn&QK|\dBfli`EV*r8mwM9Asw:J^8][f`.{F1w'@W\ڄ.lehΆU3C^s}@tҒ0xcoBEy"1{aH{񍬘C>aO1's*|+(A!N e=JBa:垏2=/~!tyƛAFVDF['nKrPx0.|7܇0{is|8'i߁n\ҟHtCUOXyn4O~h d!/+/3Bm|8o3JC8 &H* DA+#Fp#JP!"4X$7AcALʡ[d"Pfor"%A uPNL~  NX (ҡHj DԏV.`pn`mkHDa0b0d +x#a sBH_n W.'NiQHFǖ<AQBca@jHaMN?ލ٤}ѭRBA#(%p@SyO*N OpzꇐюưX!A~ a #ށBN".~Q!p'OW~nc<`#QJƪ Ǣ#ArD$+R!0(  N\^N!p* QR%ǁ!(Cr$n"(˲+),m((Ў"rzs&dr@r(}b1R''%WҝXO!r^p1ߒ$y#Rbʁ\ ځ.2-~r,`Ӆ{' ˰$ghE'!Ra(|(t;a`. "B1br<8a9r@!*h&T('o@f!/6'Hh x)*sJ>B (Z2@!"]7ʮt@!B:0yc3;+#'9(`:0tCGB#B!@4:µ5s;ʮDC| A!\t S:G @#)@3T;'EG BD.@tI,",|lDLivɴ =6ɤU^#7v@nc' CJ$C+'4R=<c0T!n#@."C)*T%AwZC!R?CRbS;x^(b%:"QxC?+u#'VT+<8%rux+UG90(#QGc)vDP$Cd2F)d)'[MhT:J:U4uZC43D#\UFaEVT_ǔp 6vXj `>\"RD3]P(?"K^L\eS$ E%)%6zdA@%*v.6yZP,6bh-0o=dGd}!6H@=Չ\V]7..6v}!aI*LʹRJ ݦ]SBkj"P5r*aݛg#߶WQ4]ov˾>"lK7="L!,x!6@8^cm~"l" dAA*%%X(_~@Ҍڬ|~؄b)^!4 ]6 ~҄l%]>up @՛]y`.Z +[^a! i뽐>+f1p!R iPx9A!D_!AjM p"p"^}H("0۾gZQ@_Q!:~ ?Aly?"jc\ڱ]cr1AB$n`bW( q@i$KQ:IH ,{I w. Τʕ,[| 3̙4kڼ3Ν<{ 4С?ۼrMĬN"wRy%l* dN Vj%Td\ͺ@Nb]sޙSp Nجu$ C9͜;{ :hFYʼnCӳ>*PF:w;R]S}Kܻ_]{pݼ%һ[[p%.s*Wcamۻ?F;Y?}T*AMzRY0_>aN( J\ 2Y݇"Hb&bR.c2Hc6ވc:c>dBIdFdJ.dN> eRNIeVdF Wne^vZtv_CiCnht,EG\4)쩹&f}jg' 咥vL:L\w1ET2UsΝ,K}015Ԍ:{Ӡ*-:!j4٪ Q:S;L:JDOT;Ă[, -ߎk<ޤ9{ԫ t/ s5*DӾ;}y;lMY0g.qP1K~2 26+"//R- T(Sq1밣L~3 Hj(L][9Ϛ %1@S'жa4җ 6<ڱX9J׾krgzrJ8̄m~[-K>ߗ/^9c8睻: >5g߼JMyD;$܍ļEa2NY2;˄^;D:;4W;4U}2䨗.'ae?ʀkcV@#8@юq2K5aKX1V8>35e; 1搦dc; %KXk`;xN l$c<3 fryl\elpYB鑍#7q$$M=~.p 5FBuDv8+\&DFotƎ J>6d3;vѵU2R_TBQ#8fNS : 6ҏD88zN|g*K 8GY2-fb8W 1Rb )OC&wWD)%^d4T S rrd K j:Gϣ>2Dj:jY9ɅZP ":W8 QFiؑuQl5jDl&J:>`yi[Q 6O9Hɨ^6_L<*m}Ei{3f=MmkK. ֗ũTAU L :v $\uB'M91PCrMPs@z)L aLjJљB-5c] iGn4L gDٱєtJ(y<͚ٝ/}ƅ̬u#l. r9t5lr>crbN,3aoh9pN2L<ql]fgI>{U^,ISbF68ti RXkx =<LܨA3Grv|,o_|4o|<Jz'*LSLt3Mxf`͈k9$ݳ84*&]2CS"Q6юܰ#b&0"L' >_10Ow(4SaG.~\f0='?hG& .o!|/'p``m9JHf/d% hѾ6|NB+3IgrKzjhE1c.>i%KxǏMi?:brDv4I#5 ]xw_d g t ܐh=~ ~az(X[*6Xq&!`ngC|4|2}=< ڐP @6bPpF.C#(7Xx!>#?LNXQ60L Gs>;(:$h#!  ѐq C ] …^Pg&Ň~!=QӆE0mqXVDzg=x}Ah c'Ƞ0UPb$at/Vd21u2У iP X$:E38ctd` Kw7$.% W3T )&sDW*%9X,(D6~h3q 7MPE1Q'3P5gJ! q(HCs03x~-& c`$Jɒ19XDi0K&2d8<p 92 AwuB.Qq@^Uah]'x)XR90]*/Jzr5`b 1&v)9钍IQ{,DW*1 i51і+1 dgQ@,qp*9c! )@<gVJ# !}Y};`;@0Uy:TZWWVj5%*A  é]z*rɜqzɚI|G#k0-, U9\u @M=ink@"q ڡD=jOIq  a]q\BlPGjwʦ+K*ё -6!y^pr qt.Vp tuA*GAVJ[:bDl p Їfi: J':Yg!/Av?{A$֙x505զ@gxg1!R:y;Aq2 +!q7эL P0&&W#ʰ pQ11 q:ʍ` ρA&.&s,=!T`]31k05{3Q@&m&13@w2Q`baqr2A ,msG8 , dz&!O`:P k$j˶nL `k5$yw A7G2k˸븏 +[#6"G[.TVZarK4ù9{G '[ ! AAX˻WҺn2"o2n-}%N>չK[fvFN˽+U%3S|&f+vfkֽ{`e_MfEO G+!FJl뫿;f$b lqkKlJ_ksZkM+#,DZϫH˿ 4`@! $L% + ٕLd5LĹ"+%JYu k3\U2e69QvY&clgLY|k=qoTŲV=hL@UF%"\{|sz ȁ,ȃLȅlȇȉȋ}2sLqibtN'Vɣb(M08f|01 XjC`m)Cj@u=1L Gŗ, L;`1 p˹ь&! =ɼ̬̇c*+,l(8 ~k7s~qĂI& (Ϻ'ya pj`)5Tc Фl~l=`OXB^>Z ]9@f;L}*q{*L,h( 8e= &(/G%&8Q] `aN&&y"YHTcM꭮,#.$sl빮.{n옜2U-Pn<#Ǿ#N">Ԏ#D:sd#.#.Nl|sn"^+G{[m9L{= fbOŬ{V_[&ONfaRSj\ p"N_Uڴ`?♣%^Cf KkߛHkYmN!^`1>n//,eN/OQd7J Z?P>T~9r|{;o\H|>| /HIܨf%O{a"8?NÄoJ[?$/Gy߭D/\oN@xf-oO;S#O[ֿ_o[.qGB/aX~`N.ގY?qg QpA .dC%NXE5n#Â!aDiIMf,K"YM9uOe%phQI.eSGF-:UYn!,!,npE ,x0‡ WXp3jȱG!PxIɓ(S\ɲ˗0cʜI͛8s$ `d(P'(]*NtxJիXjʵׯ2U(0Tbɚ1 (`G,[xmF` LÈǤ@@rX1d*CE+` =@`Dխ.}Z  (PA (=Bեc+^μУ'v ԭ+Y!@z;*#xػ/_ TXʁ'th&H | :!Y ,a (|@@ *8b/ $$P@%@ QU0H(Ȣ0*PF)+ qX^7[߽TĀh(@%PPk ģhG DrR袌6(b)*@J `iwߙTBrYi)$K*Pm:A4h뮼p%  )(EB VY³ X) M[Rr*4+DZۭTP*DSkSGg1bL TW<5$|+6E $lbfq2In@ T'N  ,Ԭ'"`-x@ G?Xg8}v@`eu8!B/H^ uTokD&0dp _\'⌃ ' Q );yA.I-x,7.褗n騧ꬷ.n/o'7{?D}]}aGj?BÐ}=췯`?囔F4@T 7@oⳞx=bo$H r>AB 9a A%0/$a8!L^J+ (9ЁӡH!0#t8E"QF|"E,0^$ {C>, F.:qia:ґx#DxG0(A*Аg 9A@:2lA$Nz%|bBL*WV򕰌,gIZ{t^P/#(=}DpNld#R ]EP w $x&)ws>0IcHj2,O<߁T7!X03: JeEES;ؑ_R.GUR҈wx$d;c7ͩBҕ+ؑ. y*"wDê)3 n@qU jeYUpG҆wh}Qd;AYر`Efw:9rvzuL;WX8<9oF9kp$y*21BXu R] :IT_9dr L["Fu-BS3qp6*g*c$+fO]:QZHE8ޱe@0ƳjC݆kI;Y ߦ03^c^] wtCpE{ wGnX#~"M x'Q, H_>*Ca;6:!(CSt+>5ks(DH_!tLpq࡫uzJ,}gw69ggwwT&;~0wݨ͘g`|PG+ěfvpoc?7W+@5+wx(Ž^ s*F uB;m x'zS?C>Y P Oy)P+E$~ .uVPtǀ7Z u~2s1A2kM1Qg&äG8H:6s9؃>8"aDJL؄NPR8Tx2:WT?SF#E[VeH5^F6F$H\.kEtGZ4?gc5sArH_zBPH$J G؆8hGFYGHRT@X@w4:8+QĆEX x?x3xWB8H@dGhGČ~h}h/aR88e与츎8(؎ e؏hRyD@hIpB8JÐ(ܨ(ژbI䌐TV(#Y鋧(!Iu$?tĒqHF28!ِ*Iȓ5 Hԋwhؔ.U4ZC"y[RxQ>I%IԈ5ZY4W`IYJy:yw9z|ٗ~9Yy*Y2*Y 7О.*`*1&t $!Pd-eڧ 1 kU9: w $2J6\Eڣ |iʩ֤1  R搪mqz~%(] 5j^P`[Wf]]6h ZpeXy0yx cNe `T٥aX:z Q g RX]a g Rʮ a a#ѫGXzepV Qp)Kʭ ^pf Ɔ %Z |˰ @nTZ654N `ҩ lAuRW`H`۴0 J0ZfKF Zw[;[R`ru ;m#L+Y+Q 1`; c! kK_$>%z=0ԓap=[x)sx0=ڃXS LP>ccӳ ۾B #C0`ヽ{=0_4@= ; \ <=0SgAePC{ɻӳ ԳP'+|=+>)>[ ``C^@P$ arJ]HO] %0 [`4? X2^ {jp|,~exWWES PV ,v@qɰK!u|v:<y Qk ]V}V 7A˶<%\+\ p@ONzV qʯ,,<|,k pO z<<ͬ < !T, ||UlG [ Ρ 1eb7`hD,˛s aPIW6Fx<:ȝ$0kT 9 I,f -!zE "0M U6a 04I}0`7:Z[$-(]`'gs=kPd տTrZ~ yX :Z ;OKLǩuu,@ W pr da۶l؎ ugP 0O ;]ǭg- 5 [m;ЍMٖ %q}Vǰ 4͙LڪMi% ݡǛ ~sp<5BPPub-VOĜzE~ "O (_} {Np,K}0pP % o:9HN { $Qj0O# .fgGQ,^n0F.COE΄2@7jG岬4 nxȠ (})3l;u׆!yy1T`vn=uZ|P5B3۱.{6M;NDM~^~؞ھNLJផ_yWN -RvPA]1鈙= N/ 6)Z?Na [7XY# Zo1=;=CT!+a@8Y>}] 3QZ71=%h(!Do9)a0~>#nJ" i铣;X糖D(a0OhϤNjĦ Au^aܐbF #OjDoqIوjIfr)Sx0ݐ>rQcCyeɀQ QJ4k8ư n0Pb'1@ (n@a 9(1wFq.w`n+Y"eIA?4z4)҂<9TTU^ŚUV]~7qI؜d.M&Ye6 MZ 8B͈읪IQ*1wC)YtiYt։zy̟G5j1׶}w3λV})9g@~3Ac#^t:GGW=h͟G޼Xg̽k7x  `\%wkjL!s8H(p"l(,L=lyσamZg;)*ډ>yG~xgV H!ǠndqFjdj5iRJ+̎ʒ$L3ϼ v,|ddxGO=O(xyg;`s0l͝.CSxHNEmygڸ)pΈYǬu aUW!Nd uT/?rj]2KeYg#Rsj8bNyʼnDq?>sOTB@wS)Q fY |V[&`šR&eIRcla%?p,x.FkɣN˂OJX-UV~gf=Nfx:S>Fa燁nX3BjCyG[fig8d>(FT 4ً)S}CO;-d m,39i0q7:dZmWhg΢Oȥj.X 'QyfV%9H J((1pNلc4MygSla5<)wx)w~J&*p'TWMG]u#J0);`~W}rr,fe & D8BY H+tp!oix5.u5\Sdp cr*wpY$*QAh;*,")чp/<"qoLQqh7>³2<(83Q!t|YN8UqeUS‘+ Ibd玐D4(K І$2=bӃ4h%#9H~ $+)( 9&JW,k$ jDf29L]gZf4#iVӚO~ӟh@:PԠEhB1tC%*(ġZfDfPx8hG?* ^ =щ0rR֌kr2G>HOoFYFf7EcN33H_UEQDsԫ"<1f0|EN xָjEyĻZ1 w D+1jf2;Ur#8"DY9,֟ J!6q1.H}YX9,˩\VReJU^hlrkƎpd3 #:q@t,Qn*tPG,Q6́JD8sjQd `:a/;89;$J[t{݃h ؉61~(ij$R!rûJ.u@CNpuCE_x[;91O!Y6Y8x[$„6*J:! {8XتYu"ۈdD&|cđ3LRLB8B6. H+|qwΤ+mgL'k,z&9H|97F8hvj%_ɿGH˸LdLnS%`zп uhqU@Oα"Ǘ=A @ln><ۿyȄ2 :{?x98 Aklc3(B0Y[@j骩b20A8J8$ A)`C0m(lyL.)B4$T¼9y\9L(G bVh/pu(Gp'8 *\#`B?FsPeP73PP ?LDNlhQ$Eᘄ{pp7JP|txaLNPתBC ƈ)xv!HǭH+#c)`KR?C$(qd\*0紫[N4A7 eL*N(?N%)D RON|DÿD |쉶a& Dbe Uϣq OR˵OD,P.)YP(Ѧ|E K r ڦQd 'Т@P9 4m4P]Q"sҦ(RQ'YK ѥ2%]YSq<$iP? r"DQfT])(0%5$ͨPIM1 +RMS;XQFXmY{EYSm^mE |U_aU$ eRZ٦ن( 'uګ}Z&گ= 'd[۳&E۵e۶u۷۸۹ۺ53[ۮZ\#: YPB0 4IE~: y H \)Zd*M(rp@]Յ\j8f~Ѡ] g2qޮDSۉrh^x  '-!--J _88Z^ ɍ 3&i`׵=~ @UM NRኈ >  6  %Ew `ia`"̰_)k   ӊ pc=Śuqib1 Qrxw].M :EwA]D 1xm;4Ɗ,0c/"/B/<1 .&/cPc{mXX75nMމ'+)`3v;HxG06#$ w8Dc>8Kd7 Q)6e AeX{1OVVƱگE Ѳ(V_f&TA11'u/p0Pgghcj>FxGW.``PwpY%H= AU2V K e! x z (u$5qnP8/SWC ^興hFk[ [#"\iZvvg8@2!^ qho`hii1 pmyQeA5V,Fkej:?iR; 骖j~4γ۳!kK4J nh3˾3@v/pV>9^>hwÆhqcʪw(^Byd  XL8n߀P *8zC{lj%|KE#>^ mr8.wX8Z{9ТkcoܰCo^︨7~h6n k;o6т=;vvPa}ӊ#wBpr?lPq&މޞ qИQ:`-6o=Yw؅;8;qD3W˻n46<7ۣ7,ZtO9?:1s" J;K @u;ě -2 wߝh@ABtS&n:b& bC jr8"70gtU7>?AD fO>( xOug_p9aWNm s@1sUh6ch "ԉm4*u3ͫWaϺ?C=Wd g1זfx;?ބy}yXW -bI UbyGOz/s$|񒧊\&BnO}<-z_(y&ϊrHyv{'s}w9'[ p7hpw@1@/C4?9x薊q gkopzzyԟ?Szmqtv/hsL}7n /uɏʿ<L~ c=li}aOOp~ʷ~zK/R'ze 8j$l80;<;ܭP Z5DÔ9 r`*nQ 3w2^y !9m35wnws)сޕ/ШcWBbNQE`w6c.8UH`۷J@mĀmug :W 8xزg+vڄ uhݻyL׮\ґM]5!4Ҩ}#Ј(f<0w%d=uog:]*tЬKEx GL%5F;$Dx GWemYp ;NgYmWYn5vY'P50P}TQPtN,C@es*ٛS#xH'CΒ;hh#? $8`R6PN;X;Ng9Vp; U^&ri'eavg}wY;] fsIa@@m Ii*ɤi&!D1$h&bMgk3 J(Vĩ@jk bZ䑶AkhTo *صl&)ؐ-`DI8: T;L3FKڹҲHt@ $; _%#%s2Qy: L@N.嫲Ci;s *N7lN圂ҁ61cN+=O]Cp"h1@ׁ-@?)4Qlry3l9ˁS|S_lc'J j{@t#PPvkjxDpE3P`/p1`AK0\# Urg,E&b/B*57 Nr7\[C#դ:brEgǬ"iNqYw—YA#m;\$>ȥ# #@HNCUBV3 E d>ޙbbT*b? :B$;HPVF6!SeeH lJ>05 @5C;0Pv%,2Q@A0uU+tC:`*DAF"Bx@%P&AFZQz l~At.I`eA(F.NA2G@kB`Vxf D%& j@ʚ-J#kal` xL.lH8( i;6HIJF r\J-(Ȫ;* ÐXڭDJ?Q *C@dL @ _ 2:5 DoXI?!`qV\N! X!^JEtoIJTF;oJ..R0J.Lx`JT $wJpXB  COoKJ@L(MoRr $\d1H.SrظΤM2$ I}rL̨s0TD N!2t22I)2@rXM?u0;*BL*+>Yr0J]^)par6Jnڌ tM].Ai- 8RM1tV@CN2DhT`1$ 4h@3J\6S8OBlT hZ0T nwDPweMk(mBHk' 5QtK!L W0^ 5Ad2Zf1uVC "Tk zXlCuI[Y\t[VdX7],ACJca#:(6(q_"}uc_)ׄfwvJhvɸ'V!Yg65jcj&uk6m׶m6nn6oo6pp7qq7r'7`I1r?7X97tw6iJ7'Q6j6"D]Bvxcww:7F6{7^yo}wQiDYQ|{8088yuwuw9 PՂG]Piluyj2-7zSy8F7SWUM38U}Oquz8k]7Q+'1(F{{*v38_Yy2{r+Ԓ+0DoIzyqRvvڜpTy.GT-ùGzzr"7Wz3@_b)ewy3lwzT9[czuú4zú:n:/qz{_:.a{@/16{YmaR3#ww(w[{!zk{u 9Ӧ;/ {w{(|JnO;κ+t:_{>yˍ~=[v}w~=ʓ{|.~>8K~濾̓{++C'}o=>{WS|g<[S󓻎'< S˻c>W?_T#~ǻܻ?#~9@ @ @xP… Bh /.aǎal谢G=Nɐeȑ'Ir2$̏*ggM63T 4(ƄuPMI&%fӘHn 5#ͧ0sY*כm7%ZOq-9޽KrT+RnT|4JYVn>kqA}<6s˩^,O61CFyʄ<Ƒzr`.mɧmo ,LPlP  1P 9P@< QD QLQYlaQiqQy R!,#LR%l'Rgc (PD$ z\wLOo+9>_mF3o~FC\CҰo6ġ'?O xG†w)d!Q p?Hc>"fQ!3r.#qdb֡tȘ7XX%LxA{74CB!9xF(ȅwA x&K @@(AH%ޑ X+ 1pw{,)S9Mrrh4 $x %l%I+;l!Vr07O f6 m2G dUĥ.xw&nCR xx)`&Pv"MNtJ?@T1m9ޱt$գ-+!-}@Z I2H30E%/GDq!=_(0n,n8 19`|G-M< bTJU`M}*2 8,s?+PBQ@4խO mSA'F˯a3d`Uw.B[;vլؽ*+fc-Yo;+Y@v]--gQ{,6E;9'# FV pGB[پ4lC%]Ԑ2X7rIQ;7s!F(ːT} !;~ϊNuk]oG+AĩF9,#0Ipijaz$կv;futR,v` fx(R(BӉs,cϦ2QD9Eb ;-[`y,3IoC*Fp!5pG,_;V*ZzS|(:gyuu6d 8m<#hؙnGw|ρVWWܑnk,kֹ;FHzπVתh^3A`(kʺdO @9زm#;"C 5`3W xB\U^Wk};(!4ށ%VU-} w ZbD1|/"^}pDo2r0xG"U \ƭ`sS[g<n8Ɂ"| GzG\tu7WZwԡ0C@zGĞ2(<҆vcޑÑQU,t2l)pa l{87W-PqT~–'YK)ou ^mi,JP'W^,)6X7nF4cC0@yͳO${̷>\' >AB (oBO#\O#x"xDa" LA x|jA0F#,<A=R-QD5R!420S00c*C1)s/!b)+71#%c/3ӣ/+m45#-:6@c'L.ܣ3|5R;RS.uC4h,d56qs7\s5w3-6"5+S.Xc:C7s4-g$70sS",f;4s,20S5Y6b=<;s9>::S.ز9-:4P4\B"3s*A5"-tB4Bt;*t6TCC2/B3B)4D73I4DcDU+S:SDCF5E@#/A33:B*"ECSBO1,qCeS1O7Bؓ7xJSt.I͓JGEKKaG/4GI48LBtJM8'#NsMgN{J9S;ӓ?ESATL sL}CQK4BtSNA;RMEu" 0N) .YQ3/B ?64RHMy8#@D5CWXuT2IKFuUuRaCit7T5jKC[YIYS:UX;s;N[X7A۳>KtPO#?Yi\gD`۴_U8Mك\ouaF5`a6S^5Y3_]T_9[,Js>9b3:-6\>0V:_66WVe[554wg/.5hS?39-u:.]ij]?sU91T@C46T!P;i8T -'Vv!momVnEpf6o6"voo7pwp p p7qwqBj q)7#jp+^OB4 fAî *7u} ށ \(tuilcaw/Gwîp@@uXwl&aOȐ<8A#z0wyͷ'W, y;zŢJ ߊ`&{w`~{˷8|җ(}vWrs@tdw~g#FޡxVazs&jN;reXJ &zzI$!nAh0H.؇Xx,!O!D@XN#xHH JdarXIjXc@䶡uM}xΠAJ8lU&z@ K;!iHʡ˚#!8uzp`PWøajlˏkPl (NYjK aByY!lY!.Y9IX! g`bzS!↿L yݡ9L !B:☓yd6qXzܺɼڒ a NjyqĞ~(Y7t1PzKN츮^{Lb?N BΒ5}zF! gހ!ާJ a/IOCgtH:`- K! f`8_'ΉF p %JB??RrU_F[i# sڏC@ Asĺɣ;Sbwvud(]95mʙ5hGNܹtڽ7Q;A¨)518.6y(ðߘV7I4+sO(gؔ٥=d;:z[~ ; (WԊ.ǗcdR7wuwb{'׶EޭۆtrW͹v9"IcM5T16[usKt,;܀r9'P{7_}%`-;DI;o~)?  Ox=w$YY ۄ#ު;bP!|yS ܶOA|D^RNEvP'0h\XVal ^WP1p@ذw\t~Fδxу`cTB-p䰔jaͳu#M 7^|m_J̏q8*bJ,bd/!BGM0&w@ ̡r`C%4af\) 1UDA Zwҁ)o%D6we|f4QĒ-A[ʟ "JPr8@$ ]` ÍqTp#HYQ {#<1ߧfpBIIcBRہ K\)8*ræV=5SM '3 2%C C17<]W`y7);İCs&ZcY#nHb~+-]-րPcK " 7DDlB;ъwP CtGub+pCQ"%zij{GP; )p[UHk [2e@Ŗwx Ɉ |HBK1f }%"_#Сa( L*t%Qxa u3Ӑ;cOW*DRkPAb<; 嵱 d;¡XAnbLd62,ky\ 0yd.ό4yln7ytQd[r矼8)q3gI0՛g$$C78zx ]CkڠNIg 9z4P&;S՛n5%UX;&f i"߰Ԟ52֞&1"DCD'At ?3@"a qѓ_f?9Uv4xt"H]T?B@`pyrFmF3 z)`)d=K|K0uLo-M-MM14a ї!Q4eur 9]%R_J!VD( `@;8ɛﰃc%U\ tQ%. /ȩt$Sp;euB? !YPDI>uZ5[+ i'y%\ 1Yȕ$C) :fU_@aJ$h=0a"G*Bة!y$*':@`(/ 1*3J5j79;ʣ=nց>*l8Gji}hRVhAQ{#NJOjRrvK4[M[J~V~w҇nh~ڦ|hPZs i|~k (t*>{.'{sWrFp`s Su'z֨ꨑf:xqm'ppmiyʪ#xz`tjza'~NwڪkG{zgZ{8ǫj<'nl W{xɧתlvJn ՊJh]Ǩ6ixǤ hiFH!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,;bubbletea-0.27.0/examples/glamour/main.go000066400000000000000000000054471465647402200203100ustar00rootroot00000000000000package main import ( "fmt" "os" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" "github.com/charmbracelet/lipgloss" ) const content = ` # Today’s Menu ## Appetizers | Name | Price | Notes | | --- | --- | --- | | Tsukemono | $2 | Just an appetizer | | Tomato Soup | $4 | Made with San Marzano tomatoes | | Okonomiyaki | $4 | Takes a few minutes to make | | Curry | $3 | We can add squash if you’d like | ## Seasonal Dishes | Name | Price | Notes | | --- | --- | --- | | Steamed bitter melon | $2 | Not so bitter | | Takoyaki | $3 | Fun to eat | | Winter squash | $3 | Today it's pumpkin | ## Desserts | Name | Price | Notes | | --- | --- | --- | | Dorayaki | $4 | Looks good on rabbits | | Banana Split | $5 | A classic | | Cream Puff | $3 | Pretty creamy! | All our dishes are made in-house by Karen, our chef. Most of our ingredients are from our garden or the fish market down the street. Some famous people that have eaten here lately: * [x] René Redzepi * [x] David Chang * [ ] Jiro Ono (maybe some day) Bon appétit! ` var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render type example struct { viewport viewport.Model } func newExample() (*example, error) { const width = 78 vp := viewport.New(width, 20) vp.Style = lipgloss.NewStyle(). BorderStyle(lipgloss.RoundedBorder()). BorderForeground(lipgloss.Color("62")). PaddingRight(2) renderer, err := glamour.NewTermRenderer( glamour.WithAutoStyle(), glamour.WithWordWrap(width), ) if err != nil { return nil, err } str, err := renderer.Render(content) if err != nil { return nil, err } vp.SetContent(str) return &example{ viewport: vp, }, nil } func (e example) Init() tea.Cmd { return nil } func (e example) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c", "esc": return e, tea.Quit default: var cmd tea.Cmd e.viewport, cmd = e.viewport.Update(msg) return e, cmd } default: return e, nil } } func (e example) View() string { return e.viewport.View() + e.helpView() } func (e example) helpView() string { return helpStyle("\n ↑/↓: Navigate • q: Quit\n") } func main() { model, err := newExample() if err != nil { fmt.Println("Could not initialize Bubble Tea model:", err) os.Exit(1) } if _, err := tea.NewProgram(model).Run(); err != nil { fmt.Println("Bummer, there's been an error:", err) os.Exit(1) } } bubbletea-0.27.0/examples/go.mod000066400000000000000000000042121465647402200164620ustar00rootroot00000000000000module examples go 1.18 require ( github.com/charmbracelet/bubbles v0.18.0 github.com/charmbracelet/bubbletea v0.26.2 github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/harmonica v0.2.0 github.com/charmbracelet/lipgloss v0.12.1 github.com/charmbracelet/x/exp/teatest v0.0.0-20240521184646-23081fb03b28 github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/mattn/go-isatty v0.0.20 ) require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymanbagabas/go-udiff v0.2.0 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/charmbracelet/x/ansi v0.1.4 // indirect github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4 // indirect github.com/charmbracelet/x/input v0.1.0 // indirect github.com/charmbracelet/x/term v0.1.1 // indirect github.com/charmbracelet/x/windows v0.1.0 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/gorilla/css v1.0.1 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yuin/goldmark v1.7.4 // indirect github.com/yuin/goldmark-emoji v1.0.3 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.23.0 // indirect golang.org/x/term v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect ) replace github.com/charmbracelet/bubbletea => ../ bubbletea-0.27.0/examples/go.sum000066400000000000000000000200711465647402200165100ustar00rootroot00000000000000github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v0.12.1 h1:/gmzszl+pedQpjCOH+wFkZr/N90Snz40J/NR7A0zQcs= github.com/charmbracelet/lipgloss v0.12.1/go.mod h1:V2CiwIuhx9S1S1ZlADfOj9HmxeMAORuz5izHb0zGbB8= github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4 h1:6KzMkQeAF56rggw2NZu1L+TH7j9+DM1/2Kmh7KUxg1I= github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/exp/teatest v0.0.0-20240521184646-23081fb03b28 h1:sOWKNRjt8uOEVgPiJVIJCse1+mUDM2F/vYY6W0Go640= github.com/charmbracelet/x/exp/teatest v0.0.0-20240521184646-23081fb03b28/go.mod h1:l1w+LTJZCCozeGzMEWGxRw6Mo2DfcZUvupz8HGubdes= github.com/charmbracelet/x/input v0.1.0 h1:TEsGSfZYQyOtp+STIjyBq6tpRaorH0qpwZUj8DavAhQ= github.com/charmbracelet/x/input v0.1.0/go.mod h1:ZZwaBxPF7IG8gWWzPUVqHEtWhc1+HXJPNuerJGRGZ28= github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= github.com/charmbracelet/x/windows v0.1.0 h1:gTaxdvzDM5oMa/I2ZNF7wN78X/atWemG9Wph7Ika2k4= github.com/charmbracelet/x/windows v0.1.0/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776 h1:VRIbnDWRmAh5yBdz+J6yFMF5vso1It6vn+WmM/5l7MA= github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776/go.mod h1:9wvnDu3YOfxzWM9Cst40msBF1C2UdQgDv962oTxSuMs= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f h1:MvTmaQdww/z0Q4wrYjDSCcZ78NoftLQyHBSLW/Cx79Y= github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= bubbletea-0.27.0/examples/help/000077500000000000000000000000001465647402200163055ustar00rootroot00000000000000bubbletea-0.27.0/examples/help/README.md000066400000000000000000000000551465647402200175640ustar00rootroot00000000000000# Help bubbletea-0.27.0/examples/help/help.gif000066400000000000000000000745011465647402200177330ustar00rootroot00000000000000GIF89aX / !! 6!!!!!7"""###$#@$$$%%%&!&&&'"'''((()))*$***+)U+++,*W,+Y,,,---...///0001!)11122231m3334#+42o44455566677788897999:%/:::;9;;;<:<<<=:=;===>'2>>>?'2?'3???@@@A'4AAABBBCCCD)6DDDEEEF*7FCFFFGDGGGHHHI+9IIIJJJKHKKKLHLILLLM,'2>>>?'2?'3???@@@A'4AAABBBCCCD)6DDDEEEF*7FCFFFGDGGGHHHI+9IIIJJJKHKKKLHLILLLM, IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6npL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw;!,W!,m\ N @*$aC xbŠ1>"ńc䰉.n* nŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= !*PfNABI(Y9nǃ )ZYO jFe6֨6FUaWlL-q6puڵi)acpnP?#p!FMDKUDIXəI!,W!,PP~@H*\ȰÃ"J8ŋ3jHcč Cȓ(S,Q˗$YVI&C3m)D@mˡ*EtӐMJuՆUjEuׁ]z +V+ٲVϢvӶn[t.]v̫WоS)xѿN1㺎˗%ٲ栝;h1ޙ:j=lڵoӬO7L޾_r8qƏL<$C(}bp;޿' / ϣ~=ᣗ_xs!,W!,W!,W!,Pp2>H *\ȰÇ#JHŋ3jȱb;Iɓ(Sdʗ0cʜISeˏ5sɳ'ʛ} JO*]ʴF!JJ)TUjݚ`ÊuٳhM˶صnʝ wݻCw޾+a+^01ǏClX2}-clW3m=mV4\M^MU5L]ÞMT6=r 4DTFXP8X B!P=А-Db!C#ND h83M)P)(T'=4t=cX' jCՌ=A` Ԏ=s,~%9 <"}p 0D)0q ln%ZAxBC #y:$h YO<裟$0 #0gN qyd|pEFɛl7Qb4 QBpvC=ADLUq6 RCJU%=$qH$G9(DHyڑXs,@!bQ V]kcDOWR)2ЅcZ:B jcPl?6(p.kQ#W&$ *d RkȢU%[COv G+7NZFyG"V舄6G; y : ^Ewlσ-(2.(MA]Q% 9P*?@6@OK@T|]r`1d4!OM!4C~ 3ap:K-sY(8yͨ_d:3O.PIrγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻw/< eP^+) ) d$4CԐj$0(OpIg~Zԏ'>qF@7 2&뙳xnU" B _!?!  737|g1PÇx3 ݧ+pFQ#S@`*ȂA Q5OpWg8AS!)Prp{m@,U #SpSzSfk8qfHy)p{VUX`ɓOEMX:ӈ} qbM>HzUZHyHyx7SgQ:/@qW|RE @y 1XcPOPgz#H,~ XN@y<' x'( a#adH[Ljxx80|H ){]Up{8"{lR7i ҘHX5y@yO1Iƨ 1zX$y !Mٍ1*z`#YXHc ،ؕ We{ rQX0M4;'Gp9TKfhXBGHydfg /PV|Q qn+Y>ؒw0I 1|v q؜92Y=z!ψq؉ ia`IhQyˉ19J9Wyɛ̉  :שZ: xj0Y @}YYgy u钾 1 }h|{L,z+i&G0Ax7!dX9cjɌ6zן!)p @y6E-xFڤqb&RzИ (e/xZhS@䈦88w |z{) b÷w<@yiX?yKSّm)z꭛JyS=}.t (Up{[yɪaj0zEWy: {Эԗ@yUyJ{xHyx>((ˣjH8*ٲUM'Y2qj:hj}(;L G!"w!( q/;1! 趏Y 71 ezɷ緔6Bv8A"hhU(҈dKz(Sq%  P%#ʌKP#TI'e˺FU|`ثXT|1S"S.5Tؾc(+K MUQzЛQUq ,!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,P7wHA@H8ȰÇ#JHŋ3jȱǏ A20  A˗0cʜI 8q*Y 7sةQ)$!b|ԜJUh&N2|l1`⑬Y,h3çJRM@)UؿOC0?`A"x Mȓ1VcCzhӨ/Ҡ$D6t`T85)_ew\ڊh I@ 娠yM{f,f/( G;g8Ch, i~ u8@O|P1nX@t0=0 T@ >]-0bA LA@ LE8` v @h4T4PH!PPei!A%(LQ$Vb%Ctb+Z_ n%@c"8#QPAz-g ST$5BJ>EPV0@4QVbaE UXHcYC`QS(i)еE#j֬iYP7tl2 fn:jJʊXZV*S0]_TKhLKdP,@H`!5AL`!@;9бOĵAYAR** Udژ tu'^m%p@Y<8U 3=;tR{1 1O_BY?-4OG$,DX4€-AWI:P֝ŀE)C[j|eM,P ,1Oim >7DҨ{k8AW4@TA-1A{VP'C}Auwm A۹){ړsvYi^S{i:@4 _HZ#>v"Tx`+'ay l#p6 cU"8ѽYF&A8 &\ % iD4h0C@X)>` r-!P颇1V2ŷ)o ($L3 Dt:ȣuύ4@C%~;ܪXI`# $xxc(-Ȥ&9y >z0M@ÄT2& 9CF Q>kԥC HwY ¿'K*B"Y͜D+p*yAH+B jHUuƳeAxWT 3W:V Q@*Vu-kmAJ;!p+৹6eLR-AH\p ˒SQFB͌X"FҷR0HZ& UkZY]u xi.&UmC։W&[wRNa"nA ҧ10$Wb0ҥ4Z'U\ A:|oz,zt̢&R |`CGpHY ) $H1/ROW7]dMA.miP4 յ[t,5CZ=T]׈>@>Bjf;ЎMj[ζn{MrNvIHr 2p^ x|7$4]@߂y3O)LRdm̑ bMR$f{)ԡ R:y]<ĂUIK\_Ho3]rMr[> r2Kጟj)|ꗥ/cYed6 3@lư $b/V141"C'2.0У)M C$xS>Sr%5hjtaK&H ;wdHQm6|0o 1s7y{7C;sR48BHeU1":#8;8 UTi*DZ&8S-.DI^3xmA0s<:hWP#P3M=c" zC8{32qPM%S!sp#O㈅| 9e({Jp,l8~(S`3qXm#wA|@ZXB0*HxGW%q,*↍$C@=me/$5}с(E/Mضt/i$FidEÈdB#t9!J{DJq, FXs=.) )5=Ȏ1 y-芖rtAoe KDy!LdLT2>O0HV;ԑSYCyw!A91|WoCXvO|`r! $4R U Pf>5 S,BP%P8~t&ё0S9 C.؎RhԒCHxKlFl#*y%VwZ!YX1a,䂚zŚaXS*G"YifDCGDpPeuVe3vmBiZz8|HmZ%[e^g(UӅuRX0Q,8%iW'9B [bH[L`_4\ \ܖ+mo`ُ` c2cQa C+y6+c$:x#CW#g<:-!rfw VJX[-fm `l0ebVg fV@Sif&hnz7@1p,gsv| A~^C@8VzQUpک:Zzڪ:Zzp2JmAE!ХnK:3pfVB¬ lP))Fv W:)ݪlJzm900!ksJ>*J#uL!j[U'IV `JwQbwbv)v&"nvQj&)$c$P`+$>ۚj(LQz(f074)W*u1S-),&~w~,OZ9RBCFE6@T7083<ÛZSP315/p[i}ehPp6!B.v'=V4:B({S';8u;$%<AExx)y}8{)U8'AH@Li8ȋK|pk)⧎w PIE>)K^ ktTZ|Q%PsD8uTGɽ`$&[T| L(IۤXdѽ%|{›ơ+:K;<+P~Iqt5<wy3[ŕRFkyyT N,!!WULXǓE U9z&D M;O\ZI]YyB_e *^I@^_$L\f\ ʦN,3 5L2f&Z[). K6\d|MZ9lTY\Zj&|؜ڼ<\|ϛ&ob?CULeAmL>an] 1Q1  ׋k}-,K+rz)PӡрAr aq¾,m6Vv88WY8m[qXa-kSUtjqZH=M![-a/arf RMT ]> @JR*,"$#~eIڵU&^G!hyk$9qِ-=ِ}@ܗm fK[ ]F}v L Xp{c)4oMP%^L.< g;i$z6"+nK=]Q-=#*R?-T}-Ҟ-7Ҍq3 .X,0r8=XM3!V 8M }C> gm׊nf|бIG} < xcມJS;l*{;N4ӭs3wD_-]mوn+7@kn[>;8`f7W,03o?'Nv^^m onn聺NQ-XU#d%X"qBKItG㔮6@Mք놾bό7 [ǎ>+̎R0юJvlw'c*{^Sumw4A=yw OS ;S4>ȎΩKJ̼%o0=,Uh#M[V;X;6pRБ04S0OvIoy&So~%X`UКx,IXPT/ /4}Iuq}~ ԄtO䇯^ ؍`OrtoX߭JM~d(` ,-*PpJEP1@,X@`B#yƊ) Μwl3aD TRM>i>:J=gơD`0P+TNTP@ ,WJڲI5uۺ:3X<$Y& q*:Ǒv~ hҥMΊjԣ`EK9V&+^ܽ}/bč+4sխf,u*|Мx!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,PH( JHŋ!bȱǏ5ICR ?BTR$[ʜO9r< *-"Ƙ YJ @y4-\}8$TЪ zZa٩gEҶOvlېW>tdœ`wfڍk><5ܹ+yBq-We,4d|P d`jhp|@DXcwG,?T.Yᘾngjl㱒@08 lbѦ姉di-$P".Rjlc.mAe˩ A@Y5`H_ƨQ`AS0Δ"G0,r u^7&УHl tA{}XEj\:8 3ҳ#;Hn=U!D"cBsw7-1 >PA\3Oo_o<5XiF9WmץDj;WA3-A_C8}A7]5@KZY.ϹDk22mE$& 6 $cH# c \F !Tej}틠=& ^p z0Vw` ! mH 9<PyD\&:|eCQ;,x+F <+tb& C_REڱ2SG,@Gk{j fCMDM:9" HIY2-2ʼnLL[żA 6jG_!"@4D= :䎫$Q)ڃU۾ԉP$̟@ xӧEC -ƥD4իX].ezUM:C=f]˶mYRSSK7@x)N\h'UZ`!Լ;oifo5Iճޑnnl8)Ϡ73&KvG VHښuʫ}Ek7fiuv j/>%|ɚŢ?\C_aUܧg;S8{D6__|%j{ (sF]77q֜v݊"bZu7ۆNf"-#1`݇؏"~EalX~28#yшbMNy ȟu;%^*8^-aIf_ 77&e&GX[VlZxAh u$wi vfpI Ve۟>R$&Jɤlb覧Κ)"郩~f֘k(ІH׋g{u ,>Zk&6 칝okj{'z.wZ0x]jo03[eē*ۓ\ݥ&/5%b]$3mUlt*Q \pMi; rWHNG 6-5Wgͭ\3ۛ@K uM|k6tmx|߀.n'7G.Wngbfkynj/:r\nzGͽꁹ'MG8j߽ˎoY>z|#od&ă}> 1Gv齤ذ# Զ. ی~V8 h2D$%(Xڟ5AB*{6f4mFC *x%g[Z^Zmh4V)zUT譥9gDҠ/ЪTVBuQ?㳖-غ 9 Z{PfaԢt4:F14dv1ES!͢Bb0i (?n]- B05vz7qhOFPdrxEIiJ09b[ sb$o73Kb– bf39@7fӤf)}1LK5qJrqfN{k'G2--cA?І:D'JъZͨF7юz HGJҒ(MiҩҖ #\j:Nr3MPBw:PpK>&lb#vꐩ|ތz\nѼ6wa5=5͚LmӪmڶ^rL-OL^xb]Je+`uT c+R{ӧ[#eJǖ]'egY1OxxigoH/`w| aP+(N׀[慖fP71|TXY(Ϸ䱉*xwH8⑇d5zkfoJ!1d'5(y@IPP5ydoos8{h]{_QM{(( χk'gF$Qp+}ȉa:pW˸ϨC 0@qHۘdQ8Vq<8~QlvX'*s8v8X0XH4 y\dT8A yFig (.7g8PZRdM]Y薁 QeEq/?A)HP(ҐTg0]F6/x87-(|[{!|ceImٌNh X93Kt0}˧< ofɓ qK<)9 pf͹^ !`rxK) X}Е^)`V d"uOgRG/dLiOVIwKЌ@aVv&oo7>&*M`gIsouW&o)gdLx=os`)aK)Jv[ zO|ci3*j f*yl^iacj8X-(smjI蚡x(qz[9 fƔ@f 링v8JR8ef`s7PA(P`-Xi oqQ%qr O_Z(.QfK5YW `h&ڭߊJM” cQvS.0KPJZTzA )" C@:PwkWhRzQUt;P  Ndp!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Py25(G 7\(\ȰÇ*'.ŋ3jȱǏ CQ(Ob@򢦓-cʜI͛4Mò(q'TX УH*]Tg I1ʵׯ 2eOBX5D2o; o˷ߒ'. gO:'i0TeOC NlOG̹^4PC^; #b(âCe̻o:Ssg!,{.9za<{'!{~k}t=na0{8HvU8D[V SBI¥C ߃Bcn mbO9,GOD͈$RCz8,5B C c4IhP(J=XPiC  Qw3ǀ1SDCȆ]# i4%\iG:e!J8<\ȕs=[<$=ᐠ;ӈQ0'&(yDѣQ3seEChꬴF4IԪ2 Қ=8z= QZ6+Vk^϶vmn܆k{;.箷ֻݼګ/oᅴ-%?4 p*pCotp3@Fϴ[S1QT@P# :k|QaA9FFQ\5U;tYLt_#Q\, @_=G?sݵawd @Kkaފ/1͎2͐-4ؗ 0Xʇ[4yŕ|zܫ:qS wޚۍ@ۍ)˞yۼN8?4i]wLC9A{뺟ώTCw@~.Ѳ翖Я~ @ukW}rc_'"!JcG񏃐 "AYͅޒW8Ha>da7De.#4_~hDȝPĠ=!0d ў+4]1f"ӈ5{n|c(:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺cf,_eطy5+ /^=<WN5zF`Ke FoLb &VaW^•X鍰cO~ a&0@NLeXL_(SCF\!yA2k9.g{9v쀓lXl [(|g x4dIWb_E״}iY¦4vb+nī}u bubbletea-0.27.0/examples/http/http.gif000066400000000000000000000253251465647402200200110ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:/檫Z1,ȶh,6ⲻ:+m: V+,r-݆᷿kn䞫n.y~ pTA[E1)K.s$ Q Mt`# ±IRlu$10Lԃ¥`( IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6rpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^w !,W!,m\ N *$aC xbŠ1> ń|*. U* RpKŁL̸3bF{!,W!,zP H௃&,p‡6Q"C-ĨPA= ! +2Fe/<*IJׅ %Zʆz2S&:d}4Z/8Ks׃~iO|ᕩ>Z]:/3kr+A\M:4 '2-ĕ,d|ᲈX +_~(Dȃf+ ZdiC !,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ,*|jyL$mδR 6֌%\|"pQz%aӨgd՜1}!ק mAUh9-H{7@ϰt⥨w j=Q$-(Ǘ*E6Ωg皟9=ZG!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"G$8`‚+ &I3k^)0M˗CYWQNY T/Y?9⼚V;oZgd?5lUdpu`}&]`-n݂C@vSk 84䯔,c֜I-!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"G$8`‚+ &I3k^)0M˗CYWQNY T/Y?9⼚V;oZgd?5lUdpu`}&]`-n݂C@vSk 84䯔,c֜I-!,W!,W!,W!,P H௃&,p‡6Q"C-ĨPA= R$Ƀ"GL/.adAƕ xj/_v8\9+_zUC%E0ONABه Y9nł Z9jFe6֨'FaWl9q,/'4pT[n)aco<+P?aMоDKUDIXəI!,W!,PP~@H*\ȰÃ"J8ŋ3jHcč Cȓ(S,Q˗$YVI&C3m)D@mˡ*EtӐMJuՆUjEuׁ]z +V+ٲVϢvӶn[t.]v̫WоS)xѿN1㺎˗%ٲ栝;h1ޙ:j=lڵoӬK7L޾_r8qƏL<$C(}bp;޿' / ϣ~=ᣗ_xs!,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,Qw9H*\'S/JHŋ+"cƎCIǒ(SLA \|4"L=BF)tҋHRtBWKVȚZ:{:BP/^R bk!@&4V +_""ݾHXp#@nvr͝3K,@ vU`P2 |Ym_,Dt}\3^-DDKd+.nLO]`^:y.Tp:є?^E-ѳr AJ},s kKWoe]B-\ U I aO .d!ؽK-8AN7:A,"2Z.b9@"7:NgĄNnX!(#0 J"8Pa"V%*ԠDX(8vgX!QȲz&eMyBJ@ x0rZgi8B|&N7$/|!aB@jE{@o@F@E-\R/aLK.`P\ @ ˸vZ%$Kql.s$R. 'o:KR 8{Nb(ADB`/"O[mXN$'rEA79Ӫ/(p1(Yl[Ɔҵ2&rL,A@?@B Z&]}d/$!bH9 `B@{˱9жA"N?tY] |80t绷~TG/K޷ 4N&0/5$AN6uBPBr '}s *A3r xk"g=Q}a 6 tR؂6e/^HO(|1 tI5XV%l IidNK]If ǘRԝ hJ /A{tӅcR:d[Sd6HժS:Д" ĺ(\ K  jXjNjD卲|^7*9eخ=bZf).([.6DG/mS M/}Väl9gNU:̑w iM"RZԤ6uE~iVLm@f_ ^Vpd!AB Dڦvz=IP@ xz@OP1ڨuz.0x*%pS@7 *S𧕺*0e@Zd:+@i:zM:^jFJ$ZvJ֚aڭRʭK ZAJ暮9ڮ.ʮ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/http/main.go000066400000000000000000000025251465647402200176130ustar00rootroot00000000000000package main // A simple program that makes a GET request and prints the response status. import ( "fmt" "log" "net/http" "time" tea "github.com/charmbracelet/bubbletea" ) const url = "https://charm.sh/" type model struct { status int err error } type statusMsg int type errMsg struct{ error } func (e errMsg) Error() string { return e.error.Error() } func main() { p := tea.NewProgram(model{}) if _, err := p.Run(); err != nil { log.Fatal(err) } } func (m model) Init() tea.Cmd { return checkServer } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c", "esc": return m, tea.Quit default: return m, nil } case statusMsg: m.status = int(msg) return m, tea.Quit case errMsg: m.err = msg return m, nil default: return m, nil } } func (m model) View() string { s := fmt.Sprintf("Checking %s...", url) if m.err != nil { s += fmt.Sprintf("something went wrong: %s", m.err) } else if m.status != 0 { s += fmt.Sprintf("%d %s", m.status, http.StatusText(m.status)) } return s + "\n" } func checkServer() tea.Msg { c := &http.Client{ Timeout: 10 * time.Second, } res, err := c.Get(url) if err != nil { return errMsg{err} } defer res.Body.Close() // nolint:errcheck return statusMsg(res.StatusCode) } bubbletea-0.27.0/examples/list-default/000077500000000000000000000000001465647402200177525ustar00rootroot00000000000000bubbletea-0.27.0/examples/list-default/README.md000066400000000000000000000000751465647402200212330ustar00rootroot00000000000000# Default List bubbletea-0.27.0/examples/list-default/list-default.gif000066400000000000000000003653231465647402200230520ustar00rootroot00000000000000GIF89aX !!!!"!!!"#"""#%###$$$%&%%%&&&'&H'''((((((*****+++---. /.-`.0///0001113"43334445#755564v6667778$986|888999;&=;9;;;;>#<&><'=<<<='?===>'@>>>?#<&><'=<<<='?===>'@>>>?kB_ 1ND. 鮐Dkp} KG,+++`E0B @PL [q1DR #7J9PR@6ltvdpo 070 TkoEC IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKڴͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL_' !,W!,nPH *῅8PDnahBfp\;zH V12$9H<|@+bO807*Ag)R[5sF؎&HnRT!,W!,xPqH *῅8PD12hQ"o̙( ->xC(\)eʎ,c2T eÞ7KphЗENiUJ5TgRsV] !,W!,P|H *῅$MDN@@ F #H&1qy(QU )kɳO,OEP@A{!DH:eTű+lZl2lϕd:2 !,W!,W!,W!,PH *῅8PD ->Ĩq#Ŏ hQ`de"sN9t"c Ƒ*BR@8R#A'i )-[dt !NU?SPӒOl(Sp?k1 !,W!,PH *῅8PD ->B3Q%- p0dTy*W8trJ)$Ɉ*Sϊ&,* DlۧE6xJh@8t im0 1M1mۤA!,W!,PTH *῅8PD ->Ĩq#Ŏ3Z F[r咎Erɜ)Dɏ'M)N?!hO!,W!,W!,W!,PH *῅8PD ^ah ^ H$Qp ҢC%ffl%9o36PT3!PՆ,*YO.'Wm CaJqK/D!,W!,PH *῅8PD ->Ĩq#Ŏ D(P4s-r9tɒ3!#O 4Sеɒ% :b6% `Sf?5 ʡ : ! >P t^!ل܄kKe#ޏ!k1 !,W!,PH *῅8PāXԇŇxCΜ7AkBŏ?1epЅ) DreCG,WS> SG͟>uӗ)ZڰUJrM܌)*۵ja!,W!,W!,W!,PH *῅8PD ->Ĩq#Ŏ3ZH8r6\e[QbYC^CWDD [(HKT`QS PU1[k ^х;enՆ?XH5ŀ!,W!,P}H *῅8PD ->Ĩq#Ŏ3ZH( ht1g6 S&H=u&Lf9ABEA(ԑC7n9QZ$ǰB4b@!,W!,PqH *῅8PD12hQ"o̙( ->xC(\)eʎ,c2T eÞ7KphЗENiUJ5TgRsV] !,W!,PH *῅8PD ->B3Q%- p0dTy*W8trJ)$Ɉ*Sϊ&,* DlۧE6xJh@8t im0 1M1mۤA!,W!,PP,H*\ȰÇ#@E3jȱcC xII!/\ɲe˔]ʜIS"L5s)H@)эD*]0)ӧP{ތJӪX^5֮`]~ Kزh;MڶpK7ܺx ͛w/ߺ> LჄ;x?Yŕ _Ɯ?+ztҦNv5봮_-;,]oΪ{w޾t8ƏMh@!,W!,PS)H& @Ç#JH"D `dxpŏ%nǓ9j4i0HY* 3́*qt`Ν+OD8ThM?W&чKL'ӨTZsS4~gX4qZlYm{[)Uy^k N DRhU,Q!]Z)Ϣhp^Ɂf>8"Ī ,ǾeV׾c~|re9:jO?Oׅ{/ZOv+mɪ'L~\ _?edWP}Ŕx_yAgRfv ($h"T0Y45:h">"B!F&y!J6UNF9RV{Vf Zvی^ٟabVd]fji&njfNIvid@!,W!,ifH*\ȰÇ#JHE3jȱǏ CIɓ(S\˗0cʜ)͛8sɳO4 JϣH*]ʴiƢP¼J*DXjʕկQe5{XǟL`1v]˶۷7/a>`*2߽ WI}X!ǐ#K)l}75 ?Ќ8װ:Ak}Vbl_ͼU^q/oڹT?|*o]~.?pȂ?4#>  ;sOa=gT8I?楎?~I?DC7;!tujdO5a;ӏy͗^6#xj,:#uV6)VdifH VL5r*,6P^X5rN(h\c #A EB"j. 䐎tLCA3nc꫰VJB#oy\>3m$G3=CcL* tRɡlFZNajTcʜC$%7B{/ic:Æ-nKT:D'7\"]R84:3٫`:L;XO/{DT$!;H*F$Y*?R%rYHO`zp#zG>(WNЋ8~0&3 †H0&.̡gK@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:4IBJ& H2؀%G}ApJD#) d $P8@N"TIf" @X@ @d% @YәDA :@T|D{ȧ <M@*S!P;l@>@ DF2hfiG@$̡)'T8 . ",+Bч" h.'Ђ =HҌ B@Tw@/ ",@JZ*5'B 23̴  U5rUd%tj"nL Ooufj͌`(lHjUf bu .V*UY\Ԟ)AF҇=@z0li`FPZkI' @9ܶ"*# 1J \i27fk p`z,`AHLɁtBAҀ:hfy+T/q3V ZY~oAZ u;D װJ7xh$  &;PL*[Xβ.{`L2hN6pL:xγ>π30AȆ>{ E0AѮb4[ =$ Әǣy yDF8a=ưt#ÐG)JA L_ԦL)쑊RtS 8ZF: #أ;l){"$6 hkD81"퀅ZC@@@A/;H { (P< M $(+ L{8=j G=pC wx9أn;1x@1# LAH.k{dhǵ} h22> j\i_{9V9%Vnq`>%&xP(ӡ.t$YyAaAH@vTE/7&nA X=a5P 'Haa {#,QT k=zѓ\jgt~ 8\:XAMg? ABSoL'o| pl|~}'&k(@N j'S_p@Zruvn 46`w6w#1%x7{0t`qz`!88$3z^xv' P | (۠asz0 <ɷWYJAy%ww1w VyEkPtUEgs*~t 8``x5 ц ʰQq!~|~{ pmtu!y`kplGvP $Hk' bnj"` k`(3Z0؍XX{k+`ff0j!hPm}7VgWj0qPiZ i IPP G|V{Q|1!! XYX}@PzߧpǗ (6 \a. ˆG9@B=D]F}HJLNPR=T]V}XZp$էY_ aUCd {@ # `!tmfM5@Nla zMPq{0 Aaً=2hp 0- `m[!ҠٰىA0 0B P @  0R ɐ uۗa ̀"`ǝA a~ݸmĐa  ` -AmY@  s V n=]1 ] @ 2&~ nmD6>MNnۖ`KP> U1N䧀 PYQ  mᙍрn% Z` @*nm 6 2 E@^nNa =`D{`^01>0exڧ`deb3!j؞ھA5:)IeKp0XHa<TK}@W}`]1X[><nW YAOPx PAQQ EZvp{[pLb3_>>c/>R:m`sK2ONC`@Ў5[MO O*R.n1TEuT}p=vpJ&n$eKD`x//S\pR@z}L^Ln`)R-RQwn^1ETFTco8YVkVRW&W@~Uo/<5ce_1ҔdU[Ӧ[U&>}0@S\^SnE]/@s4 A@`=~RH%MDRJ-]IrSȢ =!Qx0ӦQIF*ATKh)VY 9q N}x2S\uśWǙ5;`$1t= 1e) +L%Zb`Lm 2+zlڵmƝ(T0i$ :0PbNe`@Х @#EV_;=ց]MM|t L@ሊD[~="C@J@d!ft;$!ĉ4" @‰@(G,J‹DI3GBPAKDPh{p'Lql?'2J"@ 4B"'D\(ɇq˒t8 -8!5ub!2 D(MD<3)KLs6):C'Esf%fС%n$c^mEboUб=λx)oA2b!W' t^Ғq  tH4Ug4Fl ҉I#M)pTZ?rѹݣ5"u\cq,gtLU\A'H}~6 dQ{ nT$iXqc ?)E`3q` Сm٘2< #.$'б7w+  ,Ȑ!+Btp {E %4CsdA#,d hA Yq$D u3#E rc> pb1q #ކ toDرn$3&F J#yF6 L$ξ7 -wd,#.sBtpl id.$;y2t$Cb+%XlPHi=tJ#(FG,X4NM.nl;IWdr16_InmD2ط @CC6X Rыft 2+x(`cSH!RDB@ 2Ђz(<ʩbL+@ T C7>ϥ"$h@Q^ L*AJl O]ʡr~@&ňXE`j"Ht= ȋc>و$v* ŪYW+ .*\a\oErAAg'RkFD;'\p9%xz? fϔ;!q500D! @t9b [E! YjИ"IЇࡿuTuBR#C#@cjZ(.(!Ja}qy:$”8b6 pRD8Hp?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t7CqC$=+?Ԉ=?@8̍>8E<DPHDHGDLMDHODDHFdPKDYEVtEVԁXEiEZD\Dc*żT\DYt1b 2cadb\cldD^ $ShvFFVFpFqnƽXR@OD*xxGWHG{GɹGHG~s܋E GR`HHhȅHHLHH0PIU9IKI(IԱɘəɚɛɜɝɞɟʠʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪ p?Y@;lkqh6`IK j&@0-~1|0^\+p6`7g8 'p7/h̐̿<D!$0ؤ ̂ hK(d*x$NfQ4 h̏`d~L)6x*hb683h&p |˘X < h *tP6(h68% ^А0Lh:*1ЏHv "( M!(̏D  1PHk˓"h!&0$H(3! &0$U 5 ($h) /MNO9)$RUDSH+5 31xm " -184S!h*u"($`!(@"8-9&6m7E #@P"h0 Рʀ4;-RGKϐK< U,̐؀&HfCCQa5M1<)k & R@&@L#œ`" HhH(d2%P(.}h$04F-;=M hK'&UՒWXMND 需.k-nVYXXMI&X؆mW(2u%8́ H0+8Ca«WdXZ,i {(Yh&&pʽTU ː]% Baٙe(EN\TeH6L(&~d^9Z$]1813 VF[CU%)Y=Q$@ȑp{ 060Qe~&g/!Uȇc'hbh3+~^νR6Ȁ?s6[hp_V&xi, zF4>L6k!܆M0&ۑhISfLWu=8.塛^u4^6i< V   4pl:uZ EȦ u e vj .n.k.Vdžf>Dxk8#pjt_6li.jjX핰54сpN(3SR HM Ʃ@S$ .qmL\Ƌ^ ƦhG~R) o!0 EcËHTm nظ5'6>Gˬ h+nx;"D?cGP6X0=CWAPg(G$ 08΍#|rT pppo y 6r58+o 0 6!h qO9Qq2?,DU!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,i&nH*\ȰÇ#JHŋ% ȱǏ CIƒ(S\ɲȓ.cDF͛"a4NСsQ:F*E):obF !3t}ݙT` 32؂ m-p躾۲lh6A b240Â/U00 :f*0"|28T#lC,QeB=uI!H3.…#F-:/o.:h'Ek8`8r-S t6'6Ek $AD0"d1ZOK C@mJ }"NՕ eIgeo+:tf7CADXAVb%EFБ-eU6s0Y@ACJ0!@C(88FYXFI3rP0*CqCL]Q :*J @K}B 7QXΧ1PxX2.bZYZAUPě5xdlDknQeE%樢%)j*:[/N(r 7 gg*@J, :O0_>' T  ċ"Ƌ0v42(rB,- Ƙ14zs: te@H]Bti/rR2c+$m@@12x @wnkAEBHҪ.toT@84@I)'gFQB9X:7x] A|Zn_PDm6͑|".pB Jd 3 <f'k|lx!'x$ & z0&@'$&L _%(| g8$ sC!*(\ %\D4 g@`E"T`(AF1O@B aDL&V0A89${CXŎXBRB^Jt4#HYRb 怈> BJ P4nD6 @>$C |T{ԣA$ÝKȒ ĥ.b=! !pbd&0uӊ{e)OIkfNO`@} atCNNa~"`p-AiD,: . "l Q&E)J=x\eC.эF3!d(2rQ("B:Ғԕ)BҰ>aw4MmS1Y@2$4$hE2TD ^C׸ԩ(} !HeJv N@ D@ .xC^PUlh :@؁0vdTl3c~Ejg 8+a E"¶\j.u %x~N$׺;T@6^a-8@S U$/su醬p{+_ V/A_Dv(DJBS@2,P9 +|m7=@)p '7 |i Z"Q/e)g=.0R^2gKN2'O!&xiayz'8T!qE fҕ&4șA>+  ARD` H)c @j!.5be.3Ҙ\f!sFP4ӠuKmjBΈrK .H:[}l#(:`#mL[Iæ27u1"XZDZe/ݕYw#y%{ 4 ƆHbA5)SE@D-A aQ]E`qs32+;4Nxႋ<Az'ꅄ 9-ꐢ)D<9z҉'8;@ޖ&=̰"0vsp P]DɃU<7~-h?[Dbe[! RB@8=g7K Y" }{)a-e KE'fDtB"0#(JЀ;)%@B8DXFxHJL؄NPHB8TVx>Zȃ\xGP P `a8e؅ @ ]pq `y}E†  - x( 0ȈpHA `'@ :Tv`]@( 4 XX=  X X C ;0` HH8  xxP phmXx`kf`Ȏ Pxh ȍQaPA 8 pSP (  ")$YXhJ3 pK;)Y  Q "0%y%ilOt`9yXٓQ@f9`vY`f0 P`1 H 0ʐzYI[ p ,I @"pef`iL0ɛ!@Ii9)0 AJYJ @K pXYpà  /I"A@`mi Z x:D<ԡ"Dq* A ~G@6Ѣ+ z q04j2A+;* q&$TjHeѥQj A0$VZ+@ p !f P A W@0 Jx5Jw = }ezi kZ(0 s:jzj7$RZfp w(PHm f  P g( P :LzJ*80 qwЫ   Zʫ2:11:( w 8+ ۱ yc0P G!˰@ ڰHSZAª @9p 74zp(T V P x p+`F[bdK ;$ HkJ;k;Ap[~JP Q 0 p 1: : ;p*(kD{(`@  [P+ 7 K1 @( a1{km 1WPq [C۷;LП <;t J  kp1w K <?@( KYi8 PyLP $K 10 t tp 9C\G콮*Að@Fܪ/z"T|fSpKå`8ܪ0, Ϫx*FW0pǮ1Ȅkp JȊՋPu|}L hj) v  ` A0@SI! P ʽLk \*. ̉0 l$!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,inH*\ȰÇ#JH3jȱG?II!O\ɲ%Ô.yE5c BrdR>.͜9K>Iue҄} 0hƦJ$& ٪hM^Eu\޾6 @³qA 7 p"q%-; qmKڡ_re3ap\!FGk\-eɒ9]Psq*̥f.[(!U±g&H't*wqƭ2:<]05h@`=NYd:Ĥty sNUHA~ s"35@!RXa|daeSl55 ـř%rL"2 !x : ΒmI@ |Fyq :D O>#3` :7jp\:| ɀ9 !A!o>ZFFJȤ\" 'isֹ978{@2NFnx~BЖ,6',f#Po>v9C|Zڜ Y0Ce `j$Пb q뭶~+.OknK垫Z붛VƻKD 64g,0WPlB{/K UE)@AEoeB}iqK'S,n 2B!'{|3D, )ApH!nT@_E'A QH!b9P_]{\} OauCC}4Iq`Ep@M?Ey@\POoHE 9H!YQ,Fu/0P눼@/E!;^|FcdHb "9.z3y搯}'q%\@jx ʇCD@Dp FuHT@" >+WĆjuSip9(`x8CAp&qu  Ąܑ tt F-gv# h,M`[5PeA jh"0p{ HT*Gr>$ RH =ɥ a@)$(/I1 Q@! o28M@8) pjysJ^%zhNs 80% @5lBSlP@쁡0 ^`FҰ: NG>TR!-}JIHv"D(KOҕ!3^@1Qt @h0 g@]T{\u{Yւ]چh>=HVʵgSx5`nk30. !@@Bxـ{9[$Њ$)g6nuQ%${(DDcZyDX-q:ЍtKZͮvz xKMz|Kڷ!_o/G`Dy=Av#b6pa!8>qF7! C›5 qRVX!1a=\HArB$!!I {B=*!;02!{]Ș|fpy (PFˬ`3쁅G7vw"qs ReG/.@P8c 3NN'$a@+a؆PXjXz h=j {Cq;aP =qaI5} lF+Xp/atA3l3f\d4 J7 "{f B {By QPp@}o{ֆ7{āx1sū FQn(!NŔj7D03zA)أƣv9!rad{C@ g3s''Hʵr>d(H7C>n YuC H|Nse<{sg<֯MrFݛw7 x=x6c?G I PmĽ?;kl{@7:A4|O?d\H3A7C lj"tϟ~ךX-Zbɧ'}77Z Wcfw0}qVd0 lg0s@ 7!h|`  l7p w)h+Hv8GpQ u x!gN(R}VxϑZH\؅{`b8TQfh1/q&-9b|A0; @xz q`よ؆ XJS"1h 0AP" !p Pxh+@ pu ! P@ 8qLq  xƨ L 0p Xfp w0(@: hnI f qw" 0h vL P *q 3  Bx D c Z08 _@b$s|W9Z|p Ƈw AT9;m][9.  v1_ (j= "P$ P ؏ؔ1lǧ<0 d!LJf 0ЍљL6 1 @(9 f c Ah Ky P@։apyz zqr)= q P1ɞp9uɜɔA({yPנAi(`qWJq}(   pc Ix%  L&t@1w0KʋNj:79Ӊ M*a Z  Pmg L SpH+p 0~*)jbgS) _P_ e}tψm:xIbG yuLP  ! Jb' c@{jXGꪧ ({xJyȇ}X 70ЬhJqȺ, Z ԪA qxiP Iʧ#Z`sQ!+qW {0 Kn]_ch/\ulX!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,iH*\ȰÇ#JHŋ3j1 CIɓ(S˗0cʜI K0 @@ Z&Se) }6%JՓF+G@jmgJ{$J]{P*BWʝ0vx6r*Jju8V&ěA^| rA fL_mX2gĨST8{UlA"\P˵n$$~BU~T&sIG+& Xl Z< 7Ah P>(&$< E"0␃q(9BP*;HOH `b6Lt88|`ܢT1АC"$Agኊ1"(YCAB I%X? dcG@12E7q;#8ȎDA%W71%cAʇHr"hE[C1/䑧9e[cRF0[$;H1INĘ&@ti2IeeR>bem8Q \R\LfRf$ J40XA X;0',!8PA)̂kE)P[h @=!85ȩt=+x.84@$\pBfW!89$OwS#|R8 k) uEBЁ4C%DQWa fhFPoj Mt-%HTw74"A Oxb0tqR4!6 H1rOD - w`pAn1 bz`0=U23",k];ڻ (A?|h3`a 4 \.BRV D'{ u&WWfh^F-0c/]A0p;@'4 '4 䦼Ec(Tp.DqAWJoYA4ºL30<&|RL.0REԨhAOX!aκXO<)`9h]UӹQn' o PA&2eF 08gV9͐b#!(p`̬-nb"W6r f3xL Kb2y i|&ȴŋnS| ;#z> 8ap-N] Lۇ:3yCȺS Z8iCɈY @(o2]i^A }ȷ]cEjv8XQBQaZ88m P0 ;'twqhfp]# CP$ۦn1P0 _Mz G0 k{Sq|Bt!|40yŇ2XiQ2tQX6L"xlCPM |c7 Z6b5>!h7nP ~~ne> Gfm*bfwx~\8@gw1ycml@Fu?~(cEuvfN#74(q{7X8f s8|8H,F(u)7|]qpYX\ pՇfRD& _ uwwp$S|'i`\t^tC`Cx;x tn77L`OI# k@S; z`3k &:V4&GGpxx[L& cHxM=t?D&19e:hEya(,Cgqe8=qu dh(PZ=ё @2fn _U=Uw^kAx%}'}wY JԗE &YZJE0pSw y/ E L{BDUWx`☗VizvNA כL5èxYDYٙ7v `?δ#p2H2X q}L%! yAebDZ~\iy9Qq Bw([$B @0 & LDC:a!D(Z.02:4Z6z8:<ڣ>@B:DZFzHJLڤNPR:TZVzXZ\ڥ^`b:dZfzhjlڦnht* L92ap` !P.x   ´'ހ  ` 0`d(`{0A )xd*z*QЊB0ښƪ 劬˺'0p 0` s 0!{0 ^  @Q@ A J i xjЪ0[ k* a(1!Pٰ> a ܰ RZ^ pѭ` ( 0 0 K۞ Pa E [ @0:; ;0 1Pw; "K g{ ;۪pA ɀ``LK  O@-`pQ%Ġᵟ`1!Ù ͋` |Qɠa m !˽Kݪ[۾[;ڼ`k1<\˱p @Y; M xk ʫѻ0 :`yK`w:PP ;zmY0LPK{NM?ѷ@l1Kl h$  [{èzp0x: s\wl耿ǁ<+t :Y@V >q,ln|q0ʰkH46< 1a˸ , ȊL P L֌ͱr\xF pʲ p'h|>q `1* l4kV@ XϔЖЛM -Ұ  1rK $Me@ =pm `4 P F`p6 xx\ : RM\a=e=E`8m; 2 ӆ0y} Β #ʲKmKq /\+,<`KR,@P Qx 0 =!Вe}JƍސܹL k[ (e `֋+2@a='Q=21q:p- ^ЮW!@kX |aC@^~пn*`QK1 qpL!n@ z)A Qx6CE >~nj9Y'@H^3^ z S>]=eN QL^&14^s}P`}\{vpNfxPxtnϬ [~\=5pP  O&Pw~ 랎˵Y>^ Q fP\0]O H}PH`\bPvrg@~ZٻE >!`9ԈnnN6"p02 -VPpPOgS^1?B<%!C̪p3ؼ PT I`? /'Ov^pp1}`qOY `Du_xkq#`qŘнV?5RNy_0'Oy`}}nxpa(b-^kNKSa` <Wn@sbMQF7,\;R`oH$~+⥑HDW# B ZP@0&6PBr" D24&<P")pC!`1Ѐ(=6dxeFM>UTU^ŚUV]5LEx! g K!H%MX!3"P葬, *b.^ATp8 @ٙkQ(B 0@N^b2޻J[n޽}Z;fuYH:zI "lw\>iw}6u9qQ&ͺLF"{i6sJ8D0AdpP`:`6 (:K g*8Y[e?D]:*YhA'B?=tNh RTHhE&>;zmC͵UĀrNf,^HE`"Y@7  !CFz]AA΄=TY@,v s,#P O0@(eNe!4R70A&( JsJFԔlG) >g\ѸF਑o܍8G'ю4(=7yc $,@!20&ZU""E t3;!h '= ʷ5I$5Jޅ ]o8YKLVIIܽ2 /Z)s#, eC>O yh!dV ŅpdĀ;7!tG x%o%AVřч" a|fj)4S_ԉ/"e> ҕϜH4") gbmKE}Q9a6sdUͅ*{שvVXA ;c sM`x5l)a31, M&3˴\Y0z\%q"YhBW` {`43(5d',ցb;$&(0#uT pZL?-%`4zد}AHozR?WX_ܻqi}!`ƾ(&oCPƴ@  $ئ@,v43t0:=WN؁``_T'{W/zav lqp?yQuV]Owm}Wk|vgЗ1&!lU&/W`p z<G vva6~6s+ Ld;؃?Htp g<hvPt>(Wa@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnprIrYvAmap` nu)@ p&   sĘ! TI $9VȈid0 雙dy9@` 0 !@ i iI9 ў! K09y)@py `蠟0! j!J9BVuٜ E 0% @ {@ 0 ׉v#&A p!p Й @2J6 @ `M ;Z'@Đ p zHJʤGJl Y&ȡq a 耘b)!/j* vb j  a*ʨl` b!Z%©w) *iH^'@  `** 0n r )mYy搭X)11 *ު/*`ٯp[Vv"x90ސ aJsv+ zx `H0.  R;$k*Jf Ѳ/ A$|8ejZry!*3* zO;R % Z 𨌪vK յ񵳺 hjxi]zPaFpsY X۶r6+q )A  j4KP6 ` {K[(p˩Hç F xހx ȫK@~ 0 כ T ݻI[T2 + 萾䫩;|̴q`9Q0{`j/* bP˾ &[(pp ³ 0*e‘ ) &)ZZxZQ2`UfW{xL.<>.2&.(M-|%[^NM Hs%Pe% T ̚I"^sa/ ^@ xPUΏ> !/j،xNN%XʈP p 8:Q-N'HcYϢܸ,ʈڳao *0Qg@vpaJ ?.eg^|pk7/6F`_l01F".$sQ:W@/D_Kv0aNP\7HB=vNX `DP@D!hPNHDS ̈QǏ!E1L8- 16-DĠD)V|9PSs&ΰJ!\@:1X41(X?Y2[$}lYʈb@"rĉ:-ˈĦAD/|= vܦM;I!NZtBj{Fk؈dO.\ 79  Å⏹'B /ɀ('0("HiZP8h:4ħT02 ybu0urvv2J)J+2K-܉ D= 9K3D3M5d (c;ܤN;3O;+RO?4PA%PCE4QEeQG4RI'RK/4SM7SO?5TQG%TSOE5UUWeUW_5VYgV[o5W]wW_6Xa%XcE6YeeYg6ZiZk6[m[o7\qq\s!9&2>y h<7_7u@'Agx &y _}Vӛqv#G!G'1I&a^ܘa| K4xpٌ7\8(O TJ9" fMa,q$otJ% 9hQbЉ tTz^yem@gEiOHF-mgby@;ָܿ9qFrhۄih!hntШga,ϑ̹6 ǜ^'λxG>ygy矇>z駧~ B?6fUa k>QH{D}\ ~ *H$!c3 `@M d@.t QPJI?q6@.-FY@0+HN5 1A N> !D?ehR <@s!Ppx!*FibDM&; @ Uk(Kp\%l-K"n0Mc]** W ddOXNȌC! ! : '4c^\@R  s(؇4d< O~DgDqOhG?B+^ ^әjц(Fy2Ғ!2pG+-3sL0 ^0̍*S脩&}c*zѣ&}(ުFթ7^*rQȯ?m,bד6CЧ"5s5X TdHJ`spRDl9 K̚aKtV@D"fuDkwR$8XZPeN22(g=V# 5 ?$w;cG lL Q񒗸ƅ(p #81u{o\+"E5uy˘%"VDr p`84 2J@D=&yBpENR$k+t>x@ؕ4"a/B!D]j*fqڄ\zR1ct*۶51"r+6qd8wZyf8!*A,G"vLA2վlȈg;Y0v|aJNF;1; ,CQ]cSi@- o6 @ e3و@xww.Cp ·按~Lb$0#Sz8zDмNxsHi"J jw>|RhEq R YJ >Pt<?W~ CܫMߖ& x&@(X (5??s;H8pj 뿸8h?艟>`x@ @`?3  ̸88."䎬 070k# 0!,B#l ؎Ља Ұ!5#302ȏ`  =C:9C;C`9`#)6t45E\ @DA骏iBx@(9yFčCC5,R #y!#aE8r:.x ` c\*ŧF 9 i!k yF_ `8b4EA H1 ()*rϑ8A8c @Xވ bԁ4Od` v $"BO٪.!Mk`ؚs5 HYS9!g v9#}]*ZT0SՁX((@]͕`*c bn* "g,Cd5'H#qsc0dyWZ87R`J "'9|Oo{$ f{f;tLlH!M?"&`ũЮhXp_Su\ ;:]q&]\I ro}Y >"7gw+\R~/A耈0W j6u _ (WA?u z"utGp@LpL3Sa+0ZL^ڗ:q @~Qt]]UZl(tdowwl8>7(AtktX d$xp7Pg)A z ?Šo3)6 GwwX :# V fUѵa$uPi.g00PPR(tWOj )Vœa_x8;0U\w%$'ߘ)t;zNpX (`t &q 3b8phfDTygw0@pW7XYjɖ/{xUv<1!aOTbc`kZ Po&ɘNTwwpzG.)]A9 w#I Vڴ>qٚ9Yyٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞LH 1NVbN =e0Zҟ 0cR{4uU#aUABU 40ސ܀` 2 @M Y9|[Be;xk$)07{k+\Pik3Ъ0~{ O0{#n [s}QE|I,imlSi'`W?lJ\nPLjxi$ g&2 oKK{AF1 i}@sp^ ExOl Y=,H^ 4 ^ {TPn{Ʉ˽O,lɅs\m !˴l˸ρE$1Ø @L{FɦJJD^,$-%5!@Mkx :@;,&,, ]Ԕ!K@'*̹PO8),&ͦ "<-%z[KқV`"V@ nx҄gk`@C-> `fܩx5qکڅS^%،l\`hM4M*oB xrzypڱ{ک$}{P&<v`a;lIO ,cٞMB}b[ qh$߁Kx =&Pl|1܆$k1=( }7݉*4{0|v0‡l4n7JnM\Lm M޷1wM2>{ޢ=5*`QMa "m .0mQӭ ޼3P}`}Rlۺx~p[~'0/ ./;B0];>醌<^Q {`tޢN.lN0M Ns/Q֊B jɌ<#v-xz $p]1 8=%`mHP)s[YMl&P.\Qû]_m`B>`ZobN#̜>YsjKHs3/4Ƥ-`ۆow\ ~ U0(__ A;4̒kL<UѸOIǟʿ?_؟ڿ?_ߚi bPq @ DPB >QD-6 FsHpQJ±$ț7s`ęSN= `V.n}$IR.wTTU6d*t 9p_'Eh aٵh!MSnWBW^+*"%YlCZ.7):RA!̡˶bƎ/6!Ԧ"94As2[=J-+*b#fAgTA *.9 /Đ)++Zh#(*:t>jttȐ*Wǁ~lHHUs,Q|RF01BƯ,q $LZ2s $@# OJt"4!::,hqHQF "@ бe n!(<u QA$O3Wet$8 cكi5Ϡ6"rݵW\umPنm_i# N G&ݶmPUsULiO8EWXځnm҂ ѹ^,ӖZzb.&i9^3NAͭ RTsd +BZ6H|9sfdN!@W1b9%0_&>$pYIYl4t1oABh38e@ǜWېqƻ!]jGZ>tQכo lgkQelZ3+b7&}uc?)(x䉯QlgH 멵Ӂ`69 "# 2i?,AI!Bf)@6Ё`%8A VЂ`5AvaE8BЄ'Da uRd,q!NXxCJIxY`!\5d yE$:apq'xBP< !>tƂь ayPqttWBE;楏I R*U?ZljdJ1MR!"1)M^%% Y%GWAN Je,hK̒2eD8'Q`OH\D!PIP`I ``ߴA|DdN8!$ }HP>{HX I[rїy,X).ꑠ@@*(F1 OJ4@ka E@B `Ңb& 1 H@ D s(D+jT1$? j! ^H\P,!Cx.tbhF?*F(M+ZVƑ HI˽D VrEވW+(Dk 7 yB++KMd#TYD@~F", v+YsIPնzDں*tl*Kelpo[\z kJ{ Q@bPVw$,HB;UDDwlDRMNh[[n4D!z ]+cQXʍs N7&=Q9%r,DzE*\$HP_\v0.c56mд\<F"QR4eN+Ų#s &kH`@A R$lN;Zd0H@@$eÑ}pr7K"7^& cgm.P) D"8#v 1)BaL"0Y1m5K9Xi*#JOf럕IõE.B9%4q,GF[1l(DAg@DDal򲭶AB4dLV[>K);8@S jt@R>%Du@u<s=vfw;xɗ#+:}ިO¼ϝ9]3'! `:vWIR q 0 Kv>Ǽ+BiD"-v۰ \@@=KXwDew~7@*=&w~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243X{v2<`54,!Ё: (>8=<uR;CH>CACCCHDZFAH<8J AdXR0OHN `:d7OO7T PXPŲ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,wH*T(@‡#JHŋ3jxC?rIɓ('#"v94̚=2lgʟ@ Y @RXN¦u:իX&p^/NBHAT]vc){[kP8yЮ<{?Pv0r8cax:0->19涠CK|6 gUv 6tkvʕFV<4aRe;sϢk'Ha{ԞCp,tk,`=X|v=c$Sg^'vV+$e9şyAU*iP3 ^~ }fwe[3L XRK_M7 =` h#'nvtع(U-Y$ tmL1$D&y~MڸdAٔtU;\f)#P0#a)2( ئmZgT 55!BM ZӍZ(7]#G@YLJ뚙\vJ%ꪆҳ ٷ7< ()':P1+{{Pc1 G>AĮoUV& (yngw ,$l($ V.d q6W0P@tbApG,:sC q DADP-}qE4u&P зRu=vvJ'@tDc߽rEWt0z4Exd<А+ }A]bʧG9E_N滨32JPzx.x"G<+14 x{+@@',owf+ 'zSJDC0"1B 1#< d!B!RhƐB'g(Q^3 >]  @옐!&` Ӊ*5`hA 8HN f(hȲ/8$n$L kIH肨V@DbGZě.DOnOg=TҀ$eU?Ec! )GrQ B8@ KM,v9$`˫t@1δ)h8£TjXU )@$J|'IyM-^w򤰞ɩ1X5wi Hm#> x)S_K]lu+TC^AYi  GiT ]>ZlkBܡ6.Qm _/E]n16Qa%Ru.[c҃4 R`pO;ExvU*ƍ0]bFu>W0]'t=XX!pGϗ칧T+e @[6h'+' j!vįa܂L-SLQ| @_/ ] ~Ʉ#G`Y)5 /0hIxяCV?&0anzj?&Y!ԅz~NaH>!i4PQ f!XϺloVH0UMdn_d9C5؜ =& V~2.hZ ֐ &:+-1MwXq{dc@d&Ce_.0P>mߦhiF,̗mН X=b7P9n X p 9B}#0hӣ^$DDĨZp.L(p;t6ULZ؎T"v2#^[ Bx'Y/{GOқOWֻgOϽwOO;ЏO[3;Qo!A}㷯z|@9>Yfco0\b@^ Ḛq7 ## (7܀` %T@ @ɰ R( { 蠂"` @6:SB ` '`̀p @ Rh ѐ~V a8%@xi-r` FR  aĐ$h` m ƀb 04x" q T Q` ^0EV0*@ 0 Ȩ('  GĐ~gF`! 04 ސ 2xHF 7&<` Eh h ހC ّЀ@  0氍 x)(`ዹB DYڡ  @ Q!@ i8: LJ ~BPg谖J)88 Wx 0P]9<Ј@ g `W8qK@08юu8 &C {Yy|'p@?Khɹ9.Щu$a1i6-{b`Y`P.#e33`v9O`52y%ў&yS>Yya$ B3ʝ#Q!,`":QH]Q19Rq2<&_#j-cq)/* Pb<xPbH%0::njRm`hE`':kǡRѦo %ي{0Qin6'nꨐ`}\p!t j.iu:A{>an!ʹQ@/j)e ERʜ`n`jd H0 Z՚FPY``zٺZs@ \úqpTʯF+ j*&i}@sP IY0!R !1pɳF+jn{U!PB.Ekypi*_c %ȑI Kۄ>A;E+s[@:1'\@@/:}=s\ NpH 0QS:q"pl/Q`>PGZw!P5l+f PT ૦@|KмۙTwW/gvz뺮 y>|e;H]Ż `+b悤kK ٠ke 5;)p#e01JL`aj+NjV,xIJ)RWU|a`ЋA̿"6d faiYN&P >à{B,m0!,Mİ)\F,  m,`+kW;ʥ b,X5y+): |!Ax /\H[ӡs 3k,i@,ƦI& LLHǁ/B@0L-8 hp²QE}ʧ'OPVE&Hnb{`cĉ)L,Z{aY.P!_mygx\+Q;Mkn@/ 󤗱:I :;kC`rL} 800)ˍ+y  {PL؛$S4 IӴ}2S=]}ȝʽ=]}؝ڽ==% Z HϽb ݘ2@-|V8@i ހ{ U .{E` n@ƐA -9k{<Tx60=`%~{'!8ю18RF-~B - K04ɂWx ^)0 Ph0_vRS8ꗄbx`@(r  ~0茇ޅH؎K؅Θ PRp L9ċlw>އHxXӔ!)aP^X{(Ψdc(m ,RJl^6Z|H؈1ǸYy62^V^H'!6>A@(Mo$g>@ ! 2/e84ޅO#(IpPR)n p  0)>B?$/"$Np Ku(85م&N @ |j5~JK FLe _ Y` ( ! ) 0{%/CE@_e9+)|{) ޕ>a/ȍOX_%|Yg'42P_8`@ 'DP6pbCÅ >QF=~RH%MDRJ-]SL5męSN=}TPEETRM>U(FTf!T[BEaZ"D?mEz"[! p0Őb_${62x| ;v f3T@@>TD(#DOcZS47 xP x$0P@ !V)$УO "?N"p̍ K9* `b,BpD@ApnhB7P=N? "QD6L>t("p=p< 7訂4s#"t0B Jƃ8@8` stp(>^㹃dF ۱z" AZHDJx@(EуHQFC:/ap?#= c˸Ѝ2`!:4@@9 ItFVYȋBXBc>5 $8:D@`B<_v $ *5@[+@5Y-dYv>-ZzaJx¶R-b!5w]C.&KL.6e?FH^ 6 C8f( j 8r| D jTV^FvBo 9^F MXr&[Q @Bd=l9^.[ 964J:^<&(C9 ijcۻ֌2@ĂxOm2eLƺ9_>G:;K jS'Ȟ0\IGPm,്-,@yA`,;O| D? {H10Ti*Dߕ, 4L"%8, yH[; KWi,#Îd Q8AFD!U@,P}b`>]. z0!,`!vF(!`2_B8;q>4RB!RT[%H,ʐj"/.!xHNבQ@ 60ف" 4f(:J @w[\P@aK0HƆRB\U#> U')$uchQX,G"9(H!%O Qt#&[2ɑh /@"\ 9ðA Z3p ^ȧIQPsGm:R-2U@ADg!bPiXnpRW!ȂRP5/lyA !cLCHb^k:gכTeQ@O 1`lCψ1sT؂rUv6, zW ᓫiD@d ur&!\vx\W 3xD? I‰@nFKghW:^x7xBtW@ _l!A v!9U{'QزmtsةaX<9H*0_@1uc?rt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbF6#N0Rp@w n"։m6ݦ1kbq_{hY87,: }i{&Y`'ܟk\' 7)'PK6Z!!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,ifH*\ȰÇ#GE3jXǏ CIɓ(S\ɲ˗/7ʜIsśjܙϟ@ JQ<*UҧJJիX;bWM)~0ٳhӪ*=zUEٚaݻ߿0=q #`IֽeTLVϠC@xb5>X@.7F6Bڜj=V$M/Vli>&rn^k]-q M$[7s"ފxho#]ShD}PoĂxՖP,H̅U\A<`C=@eC6됀.oD4hIĉ㠃DXm)A#AcI 8_g=|$Ty Psk@dYu[r9#|YAϐi ؘιr3ŨN~F*o22m9̉XCgX&5骬VBgJBA7!=\)oy%TAb9L&Y"D$ė$] lR+zHBDcу$I|D=WNYִll&Nk/krj|ΓD ֋lg f"X7JpDwj4i(]Ƣ4PŌ3D6K tC>I BF7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯'/@OOz]g_TP#L \(hADH#e<"D`i HP*PŨG(҇B$8E%reb_TDsGp`BPP \H࡭"aÃ.#)kjUDt ,@ԁ g> 'f h` i@QNv O_Y'5%IЇ=a=IiO0 "F[ Eu+" W^ӯ0/6j8Mnb4x$:@ϐ05%s6/Ұ] 9Ӕ❁@ba# 3*η`4 oI8`HxE.& R E` 9V u.xA(@H! UY+8m".HNs\ .X"9r~C!x3D0!MBxd!> >DFb @;TD 2 Z4:#Ytg(@j:`Vb>4'$%ԲkZ,7 Jb Qn'%Y@R'm>mL-=s;p~-ћU~[_wl>q͒ &(Νii[wك( xcDb%)7 ~$00K|-?ARt|]U MpskFB;Y>ww<`>l=8R#{K$TTMҚFSyA>˺@Tw (B6Kp ! !C@'DA6MZ@"8 X9sNG~nz~i `C`L5?c^A %ȠBx`=z^@AB*:_PAFuJɔO}QVȑ؏,t1@ٖtAhW\s2ZMqKPH6VQ|ӓ׈'hwTxq!pJ7^_gUOuw9D/(ٙىxbc@>H)܈JךVT8u)Yُ)5GWIpuYuq9? `9DyGA:pQUʉGZ$%Pdcøy9B!_lcpQ7U)H ՜UHF 9?( zZP\Uݴt78F&`N&& *7?:_i?)MR9WڧR٤OqѷLlJrhGj?'7D!D^8? k !U:9myxyFPgewWI7DU$qqUq&IIJ>qH)*Hp!瑺ŨJwꋢYجOI5{HzSX(jPzȘH"􀋗V:!pBzҶF^1yt}bqvT矡 E1 7{`ap'ᱦ'G)H s+9Fh)+*Y,995K68xu{JL۴NPR;T[V{XZ\۵^`b;d[f{hjl۶nOrGK vkvQw |{bJ3gN'1Gav|%tsY*!ck#Y${uy+vUE4Adv;?1{0xHx)UHtATv?rDGvĺALp0N^[cPODO DU[y#LdLA˼SALKK kdS2%4[[A%k$dP fZWWwWӿIK_V VAL+X+jaT_)0|AZ]  ^|[Pp¥^2Alc]څ9 ZVF@Ma-Gi%b^5bJlѫ` VdUlQN!ACG' Fs 30le\e`6?sVgxVv[CvoLKO)P_ f]ijZ% AVhtɞt[QlGBk/s6\|Ȝ,ͬ2>3'@4'ƿxlE͖Eoܬ=`b!1w4ٻAAι(!&|=s@'t~|,}>F>iSa\#A}KPw0<Ѣ Hy q|~`j\|"h;ͥ1g?, x$.-P1@=|yw5-V97ӣ4d,tt1s3MCac8u(yZ\%4Hدמ7k؋Ǫ`n t6׎g?weo]m֢7ik}{}b ͵z L/Uꨀh/-(ƉP44xuxyH h]%e;';Z"Y5y=Q,Iw y(e߳twȖ yߥI4Ēq߬IM`S޼=]ᝬS}p Dw.@f,ޅ4!-EyhH"$+MK@݇`U7Q)."Kѽ.^g很Г]B M<CZɏCP׌E{^s%*0 hzΎF']snn>V촍>Df ]7~7+=qU'Xwz 0ꮨU4Xמ߮4ʧyq,޳zwEYd7ձ.X& N:&7AU43rxPN3b4خ~XO#E_?d_fhjlnpr?t_vxz|~>o @ KwTsxB.派^^Hd]`a[ ENτƵOTI?{A/fIWItI`D{@Hx.HI*x Pb O&Y} ż!@D ɜBP DO,n8(' DL1O=}Q̙J Q!1})Ƀ34tx"Db ࠗBPEdV]~VXe͞EVZmݾ+Dn0(҇2d A A$ DBAĥ@פ[o@,!c!E /͘ D*Ɲ[n޽}1q*ueMo-̕` nZjIʆm" &UPuD/;_"c+p0@| Bp<+ tP =.@C+/4{3TQG%u@">SLi!fVDlJr4q NÎNS/Q5`- \Y*$=2c;|>hـ&D(>~1bLp',!k!f' NFQ Á(8aE8_D6 Q@(:FQH S 959:)MJ·1)MiE'&Q0CUGtc"T:dblAGyGQ *8ʃ e`(|f@T~J#~=  %lSfRxA0%JSQ/@UrU,6P X !`5&KͩuDYxUL`.pB >˰ JB5k||eJ|,`8"T燖$|;X-` PFfӬC]Mcr.,~ӷ-+%xIGn ! Np\ "]``BhA&%``+sfY3(!8[xs<10N%Ap>'1v4 }IO fI~[r:{cn"ˢA$ 9<\@,R[f\S?h1Ms2Zԓ抸%)|u ";l[^YPS-'ݚn=@F Mo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5ywr!DPهSb \Zަ)ps&~粐ַU7kw|! }n|k[)rbߦ2= ^}ĥu'?L w$4DTdt $4ٷIA?ٜb0 &jA"1Rb @$8sBA6ٷw[!/!\T-B\IxB56^sA#D.|q+c3 9 :&C,(.*ܐ1>˛|[EQ ɒ4h*Ȁ$84!3+D+ļYH&=)H $xI h#hEREؽr4 P&%$);l6 h h&CRܚF"BKlDg|ɺ\÷Kr5ތ'$5*+ȲK&h26o'8̩,&PD[#M1Bo&.DE25\5aMqN,d5N&$Wɱa#< qd%Q 2h?iӜ&@M- FL̲PC LFZC' C\YY1ۥWոZۧ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f  H*\ȰÇ#JHQa@!,W!,xf{H*\P#ڛHbË3jȱǏ CIISV\i˗0cʜI͋)Uxϟ@ 0ĝ*]ʴӧ( @իXjm(!Ֆ[ÊKgשT˪]˶-ǔ"uK]re 8K^LpS̙˖]s KLy&bt.BʠCx9hyf9X ꕰs, am+_>-2Nsɫklv.X$GFϾF˟>kϿ(h& 6F(Vhfv ($h(,0(4h@=tDlT@)0! BL Ap B :I38 )TB A )0A `S($ZH!H_@NIP:3̠&CrgF PhbF,Z [::POnA*B4mBQ+gr daW pE&` @V*Щ * / yгB@Ц P ,`j6p.*pti5l4t*T@ . e'9a?+Ph2 %B' RS}j:BѮXrRBȊt)i2DA\<[HD0AdDv;9l"=P bHEpwB{A hPB>>P∫ AE @vs";6n|#7ԺAL E#Ѫ{!/wǟ+="ܵ"6+@_bAF lH>N ۝G<djlreHAV- `'>Zg; f p:#$!Ae@ظ@A!õ@bH0mEB *A9@=.I|lbX jʡ 6d p,H8E2ge2 26QC)+"T-B }Rn.: s T)AS!.6B\NR$;"nX6ɀl~ @JЂMBІ:D'JъZt@(Y U"Q#3q="#7SɉA 򣌖t!L8ňT05:ʼnOca(jCZ͂nM-SՁLU#<-Y֝U'EK\p6ᘫ4at{pl,aOk 9uEYkl[Q)9b dyJl"@G.f+l H9^2e 1Zf#Z;r6*km+tI*\VU['б3ynZ(+# 1:8Gݨط(jt߷Rt9@>jjAۆ,d! FT_V3^C0QvulhQRFm}C r5Eě~bXFg5##k.l f`&Q82bv;%̡ _Yrs=L dS\P t z&@6LʇNk4С/IBTCeK-1-VkO,"B9^GB ģc]Xv-:4ݚd5٢q9%/{0GKiUCƯ.bO D?>@l$)1wgRlF"1`;e[??DI#l{Qe quix7{ ?%,a&ytCrE Q0GDAR` Iŗ\4xHhnHTP[d6<&k}AoA{A$Tlu^I{ uo3Wp_M <sà "u~ (RJ}@N\a(hЋ>؃O~>`9 O3A ϯ!@pߏ+{m-r+Olϙ3x {yg4}(-W (Dp [ QbbtI/\0+w{K _U~wD1FQ r~BllW}Q5}_}}tuNVAVOe6&$YqF_„?\᥄71J67vUX<`4IӃ?uҵsĆY<Ղcbt6t8؇eum_h%0bA6sP6_ĉ& pusG]eje PTE1usHrwHqx}$oF1Av`w{*& xpa6&8(!v#vcXhhYpx0wGԘ(}@J(7icin}}IX(Fy#_68hQU'),%75 7 6F#<őyc_%6f{ ɐ  : C$CB&l(dNAc&(kٖo $F p0;ѕH)Dac]O)UT9ǨCPE{vs _/`s-iP}N3hVSٛ)xu0©B8ؘ9 e)/hr1'sYf:{. S{p[(?5d;i;tg(xB) 'Ѕs}GS %'5"Y80HgGG7#a;Jz뢓"qV_F \H<8BY"$x"7tZvzxz|ڧ~:Zzڨ:Zh`12f Gdh vJ'1+U#.n]UTp-ZU}orJaUFMeYppdq5WZe W[H l3Xzdt[Ps 'mJ:ZZ% 0S&2#`az:d  U;Xۮf%~кd) %{cFWe1c5m0T 0-Vcf7+c𓋚lMdU)ee[4Tiy y>rZP0T6ghg0TN0-hVh<)V@ (c6 `;-;h;k+wliOV6kPkf F!jnjހ^ȿ W^h+@ɀ'ɿ`^Xlvq&pm`lmtmYWEH"m i Y26j1q'ID.e%FM?P\!7cQ\V|XZ`? br(* 2 q+VN\fLq vLVהbz bDW`P7Z!1MǽZsYe <|3`vy!ĉ%a~,m|ШɈLrHt}tˋuL, \üV0!!tEjʮ&̟BW|W[YiSVw'L>L|ڌ׌ʌ$`nW{lz犡%'v2s dpl|'\{l3|w|ϧ{px>0pHKBD|1\'y)t<{npxnsY{`qӓV2R@v{0v@x|'{@8;>O05YM^||A Dӑ)BĀj0۩R`*0&X܀|=hȁ '?F{W|1^؁xxV ~}p-g@1o 0C"x ( HX-`@ٲm8 WW( ڝWnMrڈ$}-Vة؅_B)An_!)]X`҈}D]/ {0ޢ+iÅBn(@82e4_`ɷ#5F▜7h~~gݾ|M. ?qr3nAJiP~_Ҋnf_%RK} vx0Õb.ш02jN᧴]Y%nni/GX?F]A3xkDP-Ppэ.PBP}>hW(Un~A0}i tuHp\t}~/L`=.@sCi?s(.큹iSqtiswX I OO9Ǽ\놌s傑h}`si i`{:>.Ҁ\U]JH̕d.s9E GI_ÖM]ΆM S9 ?_z_}MՑmb x`m0QLnnȀrNƌtaosdBAޗG+)\p;/BQp/@AQޗmY@@"@'04B b!Ѐ9 Y " @) J3IL)} Q!+N!RSE( e Ds̈ O 2C "DRU)h܂PP +h(h5ز_YP.^A>H,0p(B 0D)RcfAPlVXHEh>p曞Akƀ.i46䪗sv࿉L0b/gOH]D):;@ ~>ة#`4z,K)V+Pµ(ND$ !jJ8 ;jC1o| 7 LH ,)Dh@BE- 0OI$( HJI!_bs 7tO3Į H=dKxpDDR2`Ө$S@T\QNE.O?e0X TH4UiRQmW`T[w(Xb%CYWYk5< k7\q%\sE7]u]*]7^y祷^{wͷ_8`&`F8afa8b'b/8c7c?9dG&dOF9eWfe_9fgfo9gwg:h&hF:ifi:jj:kk;l&l_$8r}Ot@&'Rbƛa hֺiMゥ&O R%|/n[|+̽ҥ g@\_D'=j] F4ʋl1'?et#K6υ Gy:3LX%iM5@v9 -` [Oz>_O+ 7Dos" C3X&)BȢ(nBP H9r0);ݩCQo N:t 3B .[^Uӭ4PW*)E P$(ԁd3SS%$BD\JzRwMj&Iϫ+%Jlq=OXbBrB+<&?Ge E !.2`GD7^1W$֯X1K͊5+Hdz@e{ZV0`OpSW!^YScaKX>C(y`AEe f@2pY)D85 u OOYd`A 0K#7 @*,ULw$HJ# :DR // YJlQv(Y.:Ax2e2gFsռf69dбf!U K.,Ȃ.`方LlNV6`if`;"*~UhC,ԣ0#,7YHMI`a:]@DH!Wm4-0hXF#Wj!z6tͨͦcjVv6V x} J ;qC&k_ҭ؁Й4A*x{ B+|:pC=TzBL`> *(Bp=໒PBWBų7%$ 9Mp*@(nqdF28x`[VQ|39"= fz;_ ->YX0$ Tr7֟PT J ( 07>}(O*  s(tqJۅȂvrEe؈ iC0Q}>l;9U/pvfg OS^ִJŇ-ވH  > "  Ddnw?x!+;9@{*$<ؖ^҃ 6K Er ,+aY3F6@D (s:@HQ@|T!8?p4:;E p@0AZ<8Pl4Ɓ{2cDHQDZM$mFPl5p(ST9q)psBxPB (Z\كz@@Hh0dD 0 AgP@JkBLBFر4ПkHttuH@HkǁxIIPL |$F}ɠ+A1 @29 88Z B0X? H8è0ɟ6` @iU¼cG˨T)JGS I|  2 4騎8 ۊ aL#*<)HY8P\ d|x X̏Ȉ@p3L#6HD{R pNM԰dOͨ<|Ѐ 6 ,09:($Y8#.( @+3i4=ӑٶDP ѵƓ˔?h3Q<{*Ql=5(Y.6fI%Qh(]ҟH7 ߉lH?,3i_yVi 2%^:}CSQ!1-h)j9- @=('-HTJT:'xApQ{1CQ=(TkdW]YZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪZZZ5g XEh&0%1[87)![$A!p!@$ [ۘA h(2Fa-8'yܔ1AD҉Νh2u\%#͵p3eׅܒ*,h2p 4h1^ )]*P"^#*h6x9iE0 ^uS&"8ߺ"H󅋰U_H-ƕhm% H3H+B/ߵX]E &0 n Tm $H4nS!6[! 86H$h3>()^'ȂSB,,>&H[!&`H(! ]hu^)$hb$h5&ЁFցd!&b#Fb8281 I"p`E?9"H$Wn1R6$h>@.;hmиlE . b<̨h2 k0혀&][]e8g-ա gMuFV]@fe6Ahx6unw jY~h&XEUhfd_P6b#h (h 4X1 H6$|iTIPrݎFgVg|n h:傰zndXFinr]5Dh\igS9&Fpn.s6i܂h56BB#*[iv\h7FgPF N%޽j((F2h^1%'@\`.ǎh .[ki`Q&i44fv0hA)ATY.&jh6jmxk!gf#"1#S.yn.lfڨookBn畐h*f h*Xih2Ko!!P~nsNf&H: qTQhdxpᔁ_Id[*1g!Yo/CqЁ'n㾋&r[ ro> /,p8b()p1 Dџ0mwk5YMpt[Y&7Fmq̀ MAttk _k$80! 88p݂3s>' h,(6Bw$gb툀N$H[Wxx`{LvJ?mvvK x!^q>mSw=a!N3浂3W[@2}"X1c&4[^ayh@9Zqܰhz`IΗ=Y`' $T`ڸzYz os.vjgk!%[?؀!,W!,xf{ZH*\Ȑ#ڛHbË3jȱǏ CIIS ɗ0cʜI͛UJlIϟ@ JtN<{]ʴӧP}tbԫXjݚsjU\ÊKԕU˪]˶-dz_ʝK\ G mҺ ~* 9h95 ~X ▐3kQ2bq9MgʖC^qasHsB*q >Vt|ΘQCnskC](D 3RNLͫ_?}pot\ cϿ(h& 6F(Vhfv ($h(,0(4h8eBw@ #TAt"l`PD`@@9P:p@ d fFOhd$$"0gT IfT ÔU00PB2PP )Vf) Cx~6tĥk daŪVhFYBeTd) b TԀP|0A Ȁl%zD&R ,:A ik* :,аsnx9-)ˬ;;D![:!G!ࡱRUnHbxpH!nTJE2 k)Kg ,B U)h ¡NJp _=Dv9a eJC Òm#R ^Q HQHAE<"O4N r% "FHu@ }:Xs3-@l|G_ʁ :|f'a,P2 %B'Kcl:zb0)1"i\ݠZqA*"C0`xpExH #Y LR7gA^W|4XA>f::`|ڂ @C/'x(ik V @D`x1ْJW$OC}`RT@Ć.@<8MW?,$=#2#VM[d]1e(E2T%* 98욙_AMDH4VFE0,H0B*eHk-V,H;.A "%h"F3 |4 rR'Au`Pe:@0irA9Oh Q@`D!)RӁCl@ r `AX3'6h Ȁs]ʎnxܝT>wQ맭Bإ\*!lӹYL@xk)aԖ% $**XlnDoM6Ql qm >8bgqH0gL8αw@L"HN&;PL*[Xβ.{`L2hN6pL:xγg6SπMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^ +N`M&}B&@'`Dا6oID#]ȢhaP$Ů_b~F)H! s# )Ɓo!0^— B9p:%pxcg\wE@b U¡ sxC 0'e nAsdc}.u(01tB Ve ,G7S*T s\Ўn @\0#FJrnf|FѡEL8En37#EF~t82`:1h? .:}?x0`ojG9ce 0{0n! }{7yF ̀}#zV' 0}AF~ 8 V{gPmqf, #2Lfh/$Wzqlb Id Ё(w"~·vcqMg~ _ Fg$GzL.N0}iUYvD=+p~vQ#XMPG qgYP@ 1@l@ ЀрL'A oT vH-W@e8( wt̰g` 8t z 0z&`@|7I؀`ցpNJ(mHp&ha$0w shp~~<|0yA| aV2`_Qb`yFr3|/m+Lʁ>$'`7f{g!i!0wA1 Di0'@h@BYk>"E3o$*  Tn $MZia$xnEǂ9֢-a1v`/CwSfGbї"!`XC1a^p{'}MJce"߲4 fR暌QEg$)  MR. .3R abatJrBcbęb{F#9g2pT8Un2"rYs@]FO0*`X'?ڄV:\-21331m`]EJvp{ЅEpPSA'1Y#LB$Ojj *1{`Вυ!:lB)9Sl 9c$np@2&2*cA 3@{8O'_iqey?7v?Y S!1:pT2 ^1>\'nPp/T#9c9E:C:280IR0S)YY`cb |/'}{d0yکzZ&JvHc82:pj2OY8 'Zb 5#oè,ﳭ3S^_ڥQ­4D?:pe0@92} 5MP?4Ac~zAEA3`82UE$/CKE6Ѱ-Z]ZQOCz?L;bPc@@5AޥTʅTݹ2;T+1vC9s 6+ ζqIB9Z UtEEb PXCcTO CWKs ](%96ũpS&O,tkPC#-YE_#:3#4  9Y"XU#$vAM Pk ު3 @ !M`P `I.mlIaY1LR(JJ°+KIkxpcm6J- yb\֋pb᛹ҲlBIn2{ՅeN>JDMWII+YZ'%AQ_u8v5\M$4eD5$]b&+.Q{_sЂAR ,v"AoU7[P$eB99sS"}rۢĩUJU:;\,`l݉U'`?hpQQR'E*%;h\CS4| ۶X e{Dp#ENƥ& 2g\V|!e [&Ȋf"l#C+M <,S4&ǹ XqL\dKjF3.C_SQ -觌 Ɂ IV,VSSLwyWU3c,4E1mV'?@"X}N ^2Y'a }Vn%t5;O҅R'p ">$^&~(*,.02>4^6~8:.l4SFd.f^z%wxx)Y>~fi~lݷwSi{0l~,iIf(H@F7}ڮyM|Iz  ܲ>E=i }HU}X<*ozL<˃Vl ѓVtX>^`_!T_c?Ie_Oy%]]B=Rp?{xIߞ#''9pᘊ17 [n 2gT`X"EM9sm+, NY "s5tܴٝIo]Ȩ_ޭnyifŋ{PK*RQs11a11x1sxMZ2ag@>x2G{M!D!Pb>: .b<A =9zX! Dn2| B' ( f6?~ #K"BGB,@"4Ad 8uR,[ݾW\u޵+@sLH1O=}Qp/\X DO,o8('h]&"!@ Bb,f dDN":C@+ -Bڶ4W77[;SCs@KoO$d3@ 2 d YV+@$@@/>@d~B2 &4BCi 6γ>x!Vq!Q8!pC0t< m:Ѻ'C`kF+'0(Oaa0[`#Ҁi 3:2@=@>̈P"M;CÍPĭP@7DB6QD:X7UG:LY#EE?lέ>_0@414H5̾ RD)\q\s >أ ʴC9^10 DGMOCOCUSk9XLЪ[WȮ^zũ4.2 <x+C>TRځB͆H%XZBhLiC0 j\%2_H? gXgΨ`OAB*Tr ֳ scoMPC ^jEd Z ĭd"mPV$8i͓Lɏ&tLn!]( =bq# ;Аj &;.qp>[bqUw#3izaп!¬_?8X)R@[d{:SDP>2_/kkrd~ @JЂMBІ:VCъJͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRE:̖q\3}^>䜛UqUtUZ*G؄3l5=ʈX VMJ5QJz\ճNk:$#H*t+]K1/)YرyrD^'+^հYzB!R\!'jr}T-ʆem"#ZL-J~[}-gX߲խl;U޺ͷllE;.6A=nA>Q-3O+nt lqX yfc*: 2mx{:(R̹}&` pRpQ+'`j&M6;bY+_)Zv GU K^ zݳ3 ͋c+Ȍ3c|Krd){V҉ÛVQgdeT s_ شl.[WsN{YfӀ|X2}{[z{n[`ш,]깷֮BtbhJvtWIz˫US8K_p+J6[uaOٛu/[o ֎5e}:6s\-{[ -B] :&7_=.7k[pzzeЂ}E8\N^~O3)6ǹu>՘}ϡp| pUn;4%a6dm]lfv1%壄]5h٭NⶻpNxϻϵ4/O6Ǭg.j74G6|b:V5F%#[j3T.O3X}?k} 8{x;^O6y|;Џ>hk^Uu[df2UB^n_f|uoU~r +a6p7jXrUfzVrT&f9bĆe1§nVs@{j7$W#a5mt s}\g6\{l8Hr7pƃ,z06wgkY:\ꈭkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<؏(DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰>*무j뭸뮼+WId D $ B mδ` %Lj+A.!,W!,fdmH*\P#ڛHbË3j, mICCZ4ɲB)UNtIC1r(S͟&,͜92*јIJÞ>jMXʭ`v5ٓz yث=ۚ}1\t Q-Y{ (B4tԍXU"Kζl02 4se;gZ4LҥmzFװc˞M۸sͻ Nȓ+_μУKNسkνË1Oӫ_Ͼ˟OϿ((dFF]@!,W!,W!,W!,ifH*\ȰÇ#JHE3jȱǏ CIɓ(S\ɲ˗0c,y͛8s8ϟ@ JѣH;\ʴӝIJJիXr|ʵKBJٳhӪ*mWY/[k˷ߢG0?E7]݄3>yϠCn"8qF ?؛-϶8,Akƕ}VblνK#&%ħb 3Ǐ׷W^?\Rtaw24B# >$XӜ,,P(=mމ(bYO"bsMD1} B砧F&TsPÎ?' ;q(hO?чh2Pc?Qmhcvxhx9SiSM??8?%>>4jMA5'X\j|c3s.bl<ȣdȒPRd$QIjʠݫ7Zj ԃPdm4TbiC*ar Qd%+;t:DAл(|o*U(Kȝ<AH.ܯç1݈&zaꪌ 5u\*1+I5%PlYʤCO=+Q Ճuܣyǩzͬu&o9RhNӞ褗رPjTCW*c%q8B/:ȕ]qKU\s7`"ajiR޻3O9msd*^T2[􋈈Rp$v0™CqH`R IDL w90.MdQ0Y7Yw#'O[9H0hpPt"A0XSEe` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.C"&!xI/}s0U%8 M(S#@"6@e.S $7}ْ1':;M`@  Ȁ>3` n$ 9*BddB!@AINp xP@G!pdm'J3ND`|ҘT#H ))(MS@# @QM1ᅨX"t D $K&"* NӬ#B S^t -t p`3*Z׻l8W| :5& ͌ (*F:a "uMm;ַs M)`YAbۙ ei;+`ϒV#Hl9RX,W#L} D'`9 :@{=$޼jN)m'%_; 4 x("@`ni2 ȶDQʜ|ro8@,P J q?XJSܓ7LPuG1 t:Vf2 "^(D!fD PfwCUPѲxI $ a@hDpB0U|o@>|`9Ay6LC^a@/# ʳۡmzT:A~NB==Rzg jmqw!|A| w46r /{q7}eT}%tEKF}%aygtZ'…~QZ'!'4&uqc7%jQA8q#{|H5'P[ROĶNxEhKk6\"Mpci7'~B efwQb׆,qa0B0  hNh.`uuPbNڇ+E\uODVOagVvB PtȊ{wd\~ ) q(1:0_DacX)P7H@zsp TnbQ{Mv n8i|haHgq|i){m[GuN7eTr@{ S2@m8ot! j/ey6%W=,9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~HY9٘ iGP P Py_9@ ]p q P^  P `PQy"9iƙZ`pY @ pU `]0( 4pII=   ܩ Y W p;  9)  zP Р NY`k@f`0R%* -ʔ/Z `*ҹiPA )EJ# pSP O )  XZ\Z DP pJ1  $9xft`oʨ:P*`J`f  PPZ Ъ: 0ap bJ @":f`jL  *a@* j**pK AʮZ 0 z  e:"*A@N);۳+۳0ZFkHkK;@{?R[T[yXZ}ٵAq^K+j;RA  Y@HѶBeD+ [p hAv{+=]  _˻LpƷc @k@ ؎ $ q[+ ُ !axחٰ؝f0S*٥ׁ !yn"!j #Ekj Z;< q  =@Ν= q]aћ5uMŝ`i+߹=:` A0@IS Nu9M Nमm:mb0мT^%.]'n^&N6~8:<>@B>D^F~HJLNPR>T^V~XZ\^`b>d^f~hjlnpr>t^v~xz|~>^~芾>^~阞难>^~ꨞꪾ>^~븞뺾>^~Ȟʾ>^~؞ھ>^~>^~?_ ?_ "?$_&(*,.02?4_68:<>@B?D_FHJLNPR?T_VXZ\^`b?d_fhjlnp^+VHxo:{> Wx{1~_mdfgx_| k<M`OV1S?~o_,Rq``og@m DHN!^_MxE"QBHaCvpHo///د/Oa23aM,DPB >x@Q*h#$aF=~ C? @ٱ&'d3̐%AfhLI@BShDCyTA:y\tTU@6O)UlVڜ9ӦI34(DТc!tɺ YLs IVȶa1BFHbU;+t3~k KۅMSjl 8ؤM[{|w'mXPAM)P+7O97\xH!M,= 8(X~!L!F.իf x@PR 0+ʮ^ @"^^,B;H"pE R@y@ ^dah>1k@4ڠb2H4 -=Z}(2! r6XH$^hA$d2φVlEn !yG8lH,"%(J (1^"""PBCsܱ"HS,5!SKH!@HI8#3"#n$(S dN I*Z&}ɽEV l 83Kq&xASI5b'kh}{aMN&XH!N D*!!rZ|T$J #t,b vE H+ $j2f 1$㺍(ϕZA$8XNaHjv{!b曍 zS0iw.i|=*a 'Hˇnb!Zl6,ﮜh==8M\ \aXSb,֜*jnRZʨ48_EBpU*Xe {K_~1c"3sA"4:Z? UBg? u'3P")F{(K%Wo 0p@yATP6 "B CUXw<@Lb&wI}Aa؄)~$8_D̲!Au!AR>gp}0B5| @7&DX, JULg.]P;|tA L%TC4:Nh!Dd,`}@0 7d!A8$T%sR`/"&I˛V$ hXa\E7L@c ( 0R"R;9y" ĈzĜ yS&33d}+Z 9C;FdiWG7QvK4 "C? ӢJIjRfz%7UL_GxS0/[@,QSD,vMxMH_~,1!ȱM_"KHrg2&I fp @fX*WEڗϲ CJt},@Gϐ58%6V^f"}|!qJ0+5 ,A>@\lfë2+Y!nɍ3Ч}KbU3y?7Q/{J<@hKa5N.AБT->DYJ  '̇&9P?`TptqUf_ ZL ON ` v[zʡm [Z@IA`WSIODŽѵif! *$exrrn8<.?2z{ m@[5H^^ލ;t䵦wy3$KclJhMx8@N_ \HHǝ$A2BT"!&0BU5@!9)ǼVz˿02gQշ>u;_LC?}7Vɺ#{!@ +p:04C8s,b#$$y=bk&L@«@ "i IQ%,(J,BT�[ `8@+$;6'$<@|{$CZ96d!(I5ԈCߺPD| 4ddD7DJdK3s#ڦڻ MCE5 h+ ę4tR CTEG P60ˈ h9) ÎB?F(20pFxhwL8Gx9X) |Ԋ3@H|@rE*~H9ȍ`ǃTǥH,4 4 !Џ+1:IșɛɜIșȝʠ.}|;x@Eʨʩʪ< 8(ʮʯ ˱$˲4˳DK !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xTH*\ȰÇ#JHŊ &\ȱǏ f IɓPM:>I͈-_ `  4i`HK\ʴBDJJu0VV"tr`!UÊK+B"K9$A :݋-܁x @6m T+[#[dd&)6da $C,tVڜ9ӦI34pl큱gDDI'|#_^IThSĠ* yHB2/}"HCE*NPG$@ |,LP bEbE4DE x} (ц PaWm7mXE3)@'P>0n0ƣ&qMB JA %љA TB C`z’H^FW @eD% C@J&БIz )$ @6 -q}UA`ДN^joTfA@ "^nB!BXB6:P&mCtv^=ZLUdzۊ~%@.4QA L%Ab.Cgp 5P*ꩬIнWmA.Qv!Ӫ3@< Q1UoJ#$P471Lp/7j9F!Fg!I/$A6Aj~G;tM, sE{քm+BlڵCg`'P=+`-BieІІ6Єn -`7n;MMdl눹BNkl*4E^oN'K8HAvIQMgY# F4b'?GaA: l*+ pM q Y`t3_wBO ֪-/> W\[\f4x 1@p= F@%K,I/8q5k³`Xyj̗C!1\ 4f6LZ!bhp(;bT @T] h1$\r& 1@Q 8J(cE6UI(1 c!Y䌑A `<̤&7Nz (GIRL*WV򕰌,WW, .w) P˪%)UOK(|8h.{H5Ou RBgbRE.tMТ ]R p1Y fEΙȀ'7I”ӜUW03Nyq`@6# ?+QO7A/bRAԩ҇!. J+@=ĦEIz-hBCD18U s  *@HBf2|T $ #R|H`(`V0ʧ@> RYj \T=v yO|#q-O6Ab  W2XC X X*W$-CYAy3g]۫򜇪eG#d7B$@LZd$#M@`ɤjIqzF& HPV[ b {Sv 겶^ ojotg%,iKR>+IR9p$gRQ@'..wA8_$LH(qD ' DZb7W.[ L.VS% 6*_D&VEYR8EfJ}Bp!W/h 07U6_ , XscndcE$[ ?7!*DτY zF2ƚl R2#FѻE}jj@;WM!v zWBUU@0@ƫ!l <(J%i}+8 ;to"#rMs!,@@"ԫ|_v*+ sWE 婢! UHGGn{P^۪['TS.giUhd,28A]A@>PĈ!/fHŰL 8 /Ō^67#M2tlÛ'4zBd`VPQJI!;E:ћXY`Exlւ&?yX`=WO|g{]gSXU}bCP{A٢/HwY> zpKmÏ,2R9)ӊDĪQ!"&LdM !Z@j.l Tr!B|Ǚ4;0zl:G|#qTaW9* @B[m("Xju˧I*Oa=gr7@/G@ T'/Cgm% m%%`^RHBF >IS 4>F>s;2F+S?sa@C>ړb@@d>gyC?B`?g<4^!`(> a;؃BrnÇg(q%fa؈<#=4i\+34xK>b- 2Eft+EIP!mvv-TMV`M A?LC4D3S=t<dE8D5#D$STC5uE~CCCDR1m`2Č1$CYYgQ|!+HUӍ*IPB䅌FiTe Sa)o7zFQyG5|$ Y/!7Fe4J${NeDP>HdHdHJٔNPR9TYVyXZ\ٕ^`b9ZKHjty)AsuɖxyJ%p)CII1}Y?U"u1Tek3Y3P!^)`r×bQI}Yi!6^P`pjm%|%TWEVU""9[ u[0Y-{%ZY1i\`Dj\T—IK`DZQ#bmbM_ugu]%2]aC1cޕH6c:V;ha``urbyB yS!"# eYga.!2S"$<bEEqf@kn]eZv A18i:ziv.pL:m ;fkpm`<T1mvm +]rp!Qn*^p pVntM:mq-jGrbr*b5"d*9s ~ ]v-c'*tB3LH)%E}R:}^q)icLGy]"'ŬQx{71EzGڭZ,VW}!**ӱ1-j~!~ Z1-]}yÀUo$=LדDįڰ/ggiu2XqS61:gLȐV%:xc@, !8iy[̡F$}fhZ*!>1Qi^˦1vѺ2\n* l܇kὖsl-ۙ/ƈ#\Ӭ6 7milƜ-؜,ו݌-Ǘ׶<ݞ--!(p':^b rU" &'Q=Ǜ{l)mM۪om64? ݏ=ӍӌL& wL0>ӄM91Nߺ-My-*.YފE>;q8a:]qg`K7ijޫ4K1КҺ6k>X3}-Խ:B:  ü*AtM^㑞| ؏>]P.l ;W q3J^:=Ak});>%([RهԻ߆.y|؁=FÚ흍@.޶TޮJۮN>--!3 }X{N/ԯq#bDen'>)+:pܡ?ޮlCc( (uSD'na;9D x;h(>tH'H)Oz\-?8AOxO^lqMӀ?~~ws!_0O Z>zR{w X9đN-ƄQ݋~<yl[6sIdzK3`O{H9?!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xTH*\ȰÇ#JHŊ\ȱǏ f IɓG&̨QJ0cʜ%J/$%͟@)ѣ.̙ӧP3i՞KBuV_[k֫aɪ]KQiɝeKܺxRn޿yݒP_ ^0~m0̗DB^dw)kT ktѧc{IhQ [Z)GմqӾ7"jtᤁ'>4)nt:҃ oeۊG䝾;ݷ'{O{n!ddןB!{ՁVGyETჯf%(~g,YFvs(~!j7מ5c@Bx߃1ތI$F"4Y$*%}K睔6IS]s¹kiu'}ԦX X6>ܡ3wh*} Ryej6)j*뭹+k&6F+Vk-^v{`_ek׸\;[{؀.)șnb7o馭 ;_pŵ*bT]6\f*1Z;#0ׯs ojרPB+{h-G3Ꙛ-Gq^,$WFGOZsx-w|ps+dʒ=*P9Ӊ[,6?TW 4(,?x}NzXr1G7ӼJH=έ8~x6h"i[念r›X3.0pUVN(}DȋN>xdq[+r~g\t7F @Ijʃ_ƭ}9si_AqH ^D"FAuptz{`x:Qj^ˑvAl;\D(yyh<6q'żH7lX.VO̢]ś1 o]C*9niE֟@G]˄*cxƛ+{ G%mKZ{&Iɘlq&70Nz (GIRL*WV򕰌,gIˋḁjBLF fRK`.L&$yY/uu%HI0kjt\UGIlWa7S5UQ634z s'>7̧GBBy3{ ZnP?WφDHT]k6sϫ]iH Z-Z_jhk4*ҚSPzOo44<RЦHU&É֦*ьwZ2T^Ri@UZ<+Ѭz7y &s&Ѫ&u7ȡ^ctZ":1EKYONvU~f?L'r hGKҚMjW֞&˶Rƥ L,hC b61A[!> MXA"`X.R;nwMVWF1@" 5U`I> Hxp)x +?B.K $ 9a@X1,w!ӊ X rb,7 o;*5 G`$9 @RbyAiuHAL+2ehІ2lVhІ&!J^Bb)arY>X;u fF2ߢ`4AmMC YtÌD .sꒀ 6Hڐ$ Y 6>hCߌp@ Eh R =2a!w{W9bJR r A  4a:`<Ȉd!`<`:$ۖH" Eʛ.GܼP:΃k ,[ | i*v H`D dVnΐ>@8-\ 89^!+oB [|x1tsEӛP\,o1!  Bn D o m[A7< `pIxțv5b"+)vҐ{ D~`+ S+`d:&xX+&h `6/7]#DķDp >h RF%}t%C0e_p/MbFqE0@u' atH ge06pb`hQP;p6kLMЀXi)0l7Hxh Ȁ1W %`\Nt Q}M0{iVRhׅvg?q2`}3pM}އaXX8XF&['#`pu{Hmo\ !rw:Kpf.d8j o.@6[إ]yx !jXjewFya{H|H.|hm0-&m-fpt(( 怫ƍN(ոЏAxqhBd7j)lH I[vc1M[E0a.hsm#7H !_:m sg#C2a,]Fw׵!E wv  J[Ivhc6Q ,@LJqSF|U79 s, eLGQP*iI Llja wq\ 6 IY' iPy 8FA~)MP@sSQD1Mɜ0 6=Og_x4Dו/VBQ& '@.)Jy0X暴 &ص|zf\6ibb3%J*g(peF&Yi )Eʢ7ÙǹSwk9ǥQ\Bŝ .jU]8}& pnvQ-~}~qq&wz`,#^>*IР3<:ėNJPZYrYki:| m`Ȋa3fLrL׫aMP3gY&g@ vr !ºZk r* Zcuѧ^mЉUMh%M p,@9z`pw,mpө vfH "* #R*ёjj;!,gU. I'w  xZ c@8:ЭSh:yL˶MQ uBkXKNg@j[z+1W P4 _Bm;oAFXбCZH&`8OF>9VeH=.(W'`F[e)MrIFk1)s[7GrK6jt'sK `gд ѽr% m^*%`^hi .`w֗V˾ps[k2*:jOr{t+l-t+  q<4 Q~p}A @˷ kp&=<7`adfg` RII^C%N\PeEH0}owUƇgo۪\* kMlF%n9,`B4k:Y`wmtVszvl{ص{ɯ+<̼g<ʥ]l|)@sg Frlt oAʦ$1m`>ţWϬȌ;caguX*8PbpjD]N@H[YaM -4aUU\0&Ҕ>\OkBPn4Ӯ6;J'_a<ըdfi'R\-j"!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x[H3@ȰÇ ŋ32Ǐ CIɓ(SD\<цsQ%ϕ'uj'Ł?& 'ӧPJJU2 ( S Ti[oUzQF|;.[s L9 ꃄJB[q!Mhfypޞ?{.yꕣ˞MmTqXbU ` "{r<4@@$HS ݎ:v]7|wxӫ_39A "P*W=!Txhǁ) TAZ@D!vlG > p_]W%IYj&:Qըb{<$4n! p@hcO Ux ĕ7p x"DVBX R}"QmNF#q%ޘ"xƧ݁ڝXh@&袌*f0HYq&u %" |{!XZu^u'IG~Yx֜(6x@7\ْj*#gIeH p0"b`pZ.V#܊uޥt޹;0'l 70TP[0)hrHR$rcˮV*\Tk\0u̳9DmG^WP ձR %dm@M+O0/)b8Mz'uo||]a4GBO_, 0B5' C`fg3ܶC;ӥ3>lmڇ2M B}&e ,9 9B@ hwy~.`Gzޗ_:vmsj'oȲ衿 ;F&8,0 JAʼG@ vEBlA jSQgao{Ug~!wþe`\3x\cD3Y@dnu/H*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbLU`e:_h F4x66k^Lș yLS)7#dAza1l`w\fx9\y,<:+(C /E,\CAD.D$:kTYGEBP 2PD A" #}o]?[euIϛoU<`jf߾nHr(8p٨<9?Yt}'05 P1(4/zɗ~I "=&93n k0ICp8 !$ZAqQ} 9 , [ v}(w (!8 hIf 9wr)M)8P}gx?#Y Bs 빝-3P {c xɵx?HG =5agڵ5 E2ۍF+f+:A Z@3t o;6{Gq20#p{Kv'w8"QКGHJv4?D L{ʻۼ;[{؛ڻ۽;[{蛾껾۾;[{ۿ+PPllzK ` `PG A *\, ! ')D;/|= HP55 Q@t<ٰ.A0 YE & @I  pR  ɐ <!*`f d]f  mq<9\ 0+р" ` pͼ~ 6 2 ц E@:]8  ` ,{` 0|T# ޜb P| J fp1 <2 0m|~׀؂=؄]؆}؈ضQK`9J0@5q]j{ANPNT}@yLˁ}p8U@۠=E{A!!!qo ۷ME]b ۬M!P+c'! ! {؍]=O&0܈p x `is4}1%Ur%OʺMl&p]@`&Y`ZPbP#%~fP+8;ln%X"4n6.хQ%m&qT;a=+Up]-pM) 2܈`h.I<3­g W舐̲Mc娍AnB/h0csa]" :IC+ a Pak"/~C>&0A} V2 pg@vP nQv& !.`Q.2U䏞cS6C-s0P.oK^nO ^@Y./9F <> Do38H9mK$8.O :/# (on s=!>c>)N />#"vx2yIN{ R1=i!y]2!l_>6o=_7-&A5aB!B$D2* $5`M> !$ޯ?1 @]ooƒ!; Dyy/@_;l/ @+f AG_ {Pj?Q='DPB >QD-^ĘQF=~RH%MDI‚-]SL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\pI#Ac\Сs"U+꧘_9:s,=ț7s氿_ \ܞh=CC/ҘPt,)@! ʀ%sPs MJxh4͆Pt" Uƾ9ӄ\W>Ag A T 5MDGx`ADzMP;jAWL>Q5' *=H[M,`"H h❷uf"TtB8ȥ/3ƃse]v.aW#&9df8UYilJL '.`~]NnXGMFYeEGi&p:hx9m.E \1hF@BZ6"HOjzja{D"B"Bp!9ڮ@D qBdлL"AvaE8BЄ'Da UBЅ/a e,kJ`P#HA3`6B8hP ,"'VhbS)"{pC0.$D?G3 I !ɀ $p(D!52\.0 ?2 đ xa@ѓAeI`9 :c "<xB29g D 郄kRB!jAه" !}B e5)!/!p%D^Bpa{6M,a~OlL/$ EۂIa*d" BzC9S iB$ %x#Q  @ICzɞC܀L2&)JJ t&@у* +Nd  ! +B `Vl,(>x% gPn i-Y {x Q:Md̪E/RD ?]ΐ;EHi΃V%D(=-iM Xb!BB)Z* bx847[N eptBV j#61]ndD.v@^A xP0(8tvRdS>DP}A(la C ! vHB6Zd ؆2/bϩrD ^``೾P@a 0VAT NpfQ܇/ ` Ҁ4C ] ^`Nd#NȘ\g`C$b>$Q3 _m UmQCT^X@p 邌 x[gZr!$HRnLA!QȈh'kVDt`Ս)YG$2%eH" &E \7Z{!rEVT{FwS c.3B@bx[/wo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG`<{ #yS~!-W>WMN1SlAu`~W=>?oo׃4) =%קB/' w}KBGJ ,_?3)? XeϷŗ?YRO& r=8\ Q@C@l@yԋ@ ?B` d$$0A`Ad \AAh@0PtAAA! o+BT%d&t'()*+,-./01$243D4T5d6t789:;\8/>|Ch&>4D0CD`Ą`D?GF<C I< 6rHTC,ETՓMXwt<4"8hr&>&iylLtET<̛,?+q4Dd  (M9>,L4̟DLΜ,ʝ\ ОlHNE3>,̃@ '@υEsUlhEQ@PPj"`@zNˬ+]̉ Q}2O8h2xJDD$x9Q%E7DLMBTmP!@L)/e = LQ4TI2N3QphUh )|Ur{;t̶J5QHTt$]R5 >d UNN5PVP%MVMN?o_%m8@ZrϚLN|h!ZDMȀ Ё&RV|v#HB^яymHO D5iEX6#cW6ldؿгc;kYvu]U=mizZڕU-`[>vPW Ֆ[{X wmr\򕹡sZ[WՕk[vCfv-osV5mE]򶶾@la_碖=wSĽ="'L [ΰ7{ GL(NW0gL8αw@YF>2Td2nk(?FRF++'eEܖ-#^2 f2ɂ6cf׻0B͓f{=ϊ沂Z3s0ӎ6 Kzl;xޫuPW΍nGZ3VzftR`+Gt h@{3,f,{&ʨ;jƗӇ#YS6PF}_Gnw꙳oǬn9ZA;.m~_58]f7 O8\nakrޢ!˖+;r4g<潚9gǴ>)Ѓҡ}F?H~a%y^rYǥ.M&uR]9ް/삭~Nt\eg ٬[oku{{XqM.ٽ7.luwg.uľ4Ż;#ɣ\xvt>=>ެF=a#i6ƾݫ}wvVO fvB9xpno蔬אwqqKtzkƎqHHJ،8 '~"Hk'jY{ki ٗtvzw azI|k.7 ix~铝 zw}8vɖtZy`Y옛_YȏR)U蕇FF(Gg'㆙MM9w#/ Aaty虞깞ٞ9Yyٟ:Zs@y&†W Din)rK8p*J")\pLٕϩi+ jߨjǣ9ۙ7|U])wi?lYaFSڐϸ:ZIzE&ɡDl\jYJ%PiB*5 IxjySy昀g^zb f ZzzY*VfڋgJxEI3te[ivvxxXj '07::PʄL施髋ڍķ*Xg9X̙_W|ӊn}v yJ|ڮꡰz,~ IxhF{(Zͩz׬ש)ioY }L4 ed殳*d'iq8Z4,ky:J8שiQH-NPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{xz|۷~;[{۸;[{$hWjf8xGkY;[%}˧U9M2j*۹؛ڻ۽;[{蛾껾۾;UK2ɛA7b~rwnyE'\eF6nXXzJcA1pWɍ z.ʿ=im$ \,CQyH#"Yթve {诂xk(,EOyTI8OפX٢)^SLC0k&KzP e,{ŋn{riz kRj2 CryCp)WJI⇮4#j,L]ˢ fZc~W9;+ĉ}ڀX/Lv:{Xˆ wڰKj:LǸ\ٌgkKJ ,)˛ZɭzU ˻<㌭iϹo e?Z]Rm̭<܁ Ɛ\Ʌ|][q\n #z͠ hx<mҪ gҚrB{v|\˒Mɭ*v"L)R||hOݤWλ,3]J a-a+1r3܋pǴqGI)%S{}}]tzL!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Pf(,H`A*4ȰC8H1B ZL=z)QdF&OL%ˉ._6)Sʚ ixs'A>hM2TʒρJԫB*U@]جPG23,0;@0aFH,\8biCgbm[(0=I 7.7k&c%SlA J´9V4֠ `|vMZئEr[dcp1" bubbletea-0.27.0/examples/list-fancy/delegate.go000066400000000000000000000034271465647402200215350ustar00rootroot00000000000000package main import ( "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" ) func newItemDelegate(keys *delegateKeyMap) list.DefaultDelegate { d := list.NewDefaultDelegate() d.UpdateFunc = func(msg tea.Msg, m *list.Model) tea.Cmd { var title string if i, ok := m.SelectedItem().(item); ok { title = i.Title() } else { return nil } switch msg := msg.(type) { case tea.KeyMsg: switch { case key.Matches(msg, keys.choose): return m.NewStatusMessage(statusMessageStyle("You chose " + title)) case key.Matches(msg, keys.remove): index := m.Index() m.RemoveItem(index) if len(m.Items()) == 0 { keys.remove.SetEnabled(false) } return m.NewStatusMessage(statusMessageStyle("Deleted " + title)) } } return nil } help := []key.Binding{keys.choose, keys.remove} d.ShortHelpFunc = func() []key.Binding { return help } d.FullHelpFunc = func() [][]key.Binding { return [][]key.Binding{help} } return d } type delegateKeyMap struct { choose key.Binding remove key.Binding } // Additional short help entries. This satisfies the help.KeyMap interface and // is entirely optional. func (d delegateKeyMap) ShortHelp() []key.Binding { return []key.Binding{ d.choose, d.remove, } } // Additional full help entries. This satisfies the help.KeyMap interface and // is entirely optional. func (d delegateKeyMap) FullHelp() [][]key.Binding { return [][]key.Binding{ { d.choose, d.remove, }, } } func newDelegateKeyMap() *delegateKeyMap { return &delegateKeyMap{ choose: key.NewBinding( key.WithKeys("enter"), key.WithHelp("enter", "choose"), ), remove: key.NewBinding( key.WithKeys("x", "backspace"), key.WithHelp("x", "delete"), ), } } bubbletea-0.27.0/examples/list-fancy/list-fancy.gif000066400000000000000000002053201465647402200221700ustar00rootroot00000000000000GIF89aXrmpuicf\_WZ ~S wP qL `B eE kH [?V<O8G3;,A/1&5(,#"' (  !!!!!"""#$###$$$$e%%%%f&'&&&((((h)*)))***+++,,,,j-.---.-_...///0!20001/h1112223334#54444p5556667778$:888999:8:::;;;<&><<<===>'?>>>?'A????w@@@AAABBBC)ECCCDBDDDE)GEEEFFFF|G+IGGGHHHH}I+KIIIKKKL-NLIMMMMP.SPPPRRRS0VTTTVVVW1ZXTXXXZZZZ[3^\\\]]]^^^_5b_aaabc5gc7fcccd6he8he9heeef8jffffg7kh9khhhiiij9njjjl:olm:qmmmo;soooppprrrs<<<===>'?>>>?'A????w@@@AAABBBC)ECCCDBDDDE)GEEEFFFF|G+IGGGHHHH}I+KIIIKKKL-NLIMMMMP.SPPPRRRS0VTTTVVVW1ZXTXXXZZZZ[3^\\\]]]^^^_5b_aaabc5gc7fcccd6he8he9heeef8jffffg7kh9khhhiiij9njjjl:olm:qmmmo;soooppprrrs IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ<!,W!,bX .HpC8paB AwYh-^EX82€!,W!,kPqC8 *DP!AhP@ ng( #A~]49<"+)CL 4Q@kP839k M7'Ljl2mhŒ>%~ !,W!,tPjC8 *DP!AhP@C#,D!pm&G䅺2(y8U0BEx_·` .`aMHa}^_a}"y!,W!,fdH*\ȰÇ#JlXŋ3jȱǏ CIɓ(S\ɲ˗05NI͛1sɳϟ@ JͣH,ʴӧPJJҫXڨʵׯ`ÊQYBH8۷pʝK`D(°E1u Laǘ޽5)C˘3kp?hwp-䃦O#̺װQ:ov<qhOˈk>R!xVtA'aӫ쐒?N 9-g/7p{L?8B0q, O?B$}g%,% ! Ԋ?ڤbOg(Cs\*# BOycOyaugA1,?fCP c$Y@a\v:"wA5^? :CΝ菚M>Pw w<#E`6裐Ԑ x4g*9fBM7 oҩ6j*$3j6h*:~Ïw(Q#[)dx9@ 8iORΊf^*bύ"@1!8($14A! 1XKS@F0Ď8 PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺t^:+`)1,YH 6K,B5I>1``$"PRlֲNlE\|PA % %Dj t|H'ҁt Gq+t(sЉnԣH7A-T/]`CȨ8*A.7-AX{|>anñ> lcD&JT>rtc qŀ ^ >@qܣ>f ׿/!;ֶAp%̭=la DA@% > a%GE>MIc8Dpd$8Q$"e4$D3AL⁌*f79s @oWx=m rgCE|ڂ= NԒ$- zHA.S| ᐆ@X6t0%{(vk|A @0 t ,6{V\0!Pa]DZn{)s:Q|xӱЁÇ遏{Ln->LQjȼҮ5/7wJH u u؁gSu{N؁@~3xZZ`}7 ] n iZH)n wxK8 = 3| Z({ |w(&8 pЌ(^ X]}Ph|t"` | .Y7| 3)u0Gj0[ e,1AfItv=ˤ~9Yy٘9Yyٙ9Yy_H;;4pO&Ja ;K P`K` (P v \ $9<; np۩  !  !v `@ A P4 ia  `K ۰ *  ` ПI " A  M:  DQ I )y  y̙ D[ 4:EDH kӣ 0 ۹PR*P R\5f:h 性r@ J 0Szpѥ_)*z n` )\`*&U G5z::֠ @: wj$j^A pU   U`jz:: ɡ5:#0 ~*0М` ʡD{Sv@Ot ;[{۱)+9S8[!J?5k``&@@(?BTk0R@(BJ$AdA+A3A[@p c`[}p }p f  c7C:ZEWEѷ=CA4DEtDITd7SMaO>0_$F@vQKGH[͇KmFGc?UPU0ĩ&O[p!A+J@Ja!ǺDIĩ 8f)ѻ+ऺƄL:ż>KK+8kfP EQ  JNT$GMMŋ 4; )dp b )O$Qu?'O5PtIPL u -˿ ? pQԽQ DQ"%S4eS"À $eR(R ÒZd S!A<ŘhӭQ {b3E&>q "MMF<KQM ՠ?S]Y 1 AAg} bmqbɵtA  >;hMa+ik=cIDJD-ݸ`[`Ç DB$4[ DاcBntM}ُM0nGLuۯ܄ITI+@u = ۮ lDTIokݵ;vk@By Zm}I= oPGܾyK fݼ F"M*ܺKr& N] N[<" "Cˢp=N?4j0ATP7B/BzDO3H IPߧM[L\1L8|oԉ@O\R+5MRY|Y &{ŧpR|;p=2 } ninDk`>gv=E#A-0lט@d>^~阞难>^~ꨞꪾ>SɴA "ɷ D )*|ʆ o'Q˷˻L` b\N|a, `[ @ @ 0l䞟)ߐQ .LZ4%zJw* PެN  *6Т Q&Zq3J @ 1/켡!\CS ^` j0l1Zg/iD_Ϲ*@ zy$R 7_``o ?ߐ&[ y& R_0l: @d__ZP)ϫ 匭 w` }? P*-ܹPzv@PB >QD-^ĘQF=~RH%ML(O;qy~SRW<3& B"&'(sP0cD[<S6 S ZmݾW\u޽ȤlYG^(5 c x?Ydʕ-_~͝2cZhҥMFc`߾2ZlڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ#>YxݿHc)v) I@B9N. AdnSH( >DĘO#Qa#ѓS4IBgQ6)NY!1N! RSS8QSB ZQ'N$FJF/-NQS$b88e=(!F 82!Bd0!L@'E5UU7ZZC0#P$7ԄI0TO uI@֍%VeYg&dZ52IAhax'xG>ygy矇>z駧z>{'mPPѣ΄FW/|7!}_'s*?o 85~ԁ?`[38 P| ^)x?/ T 'BPBa .$N;$f+,h$a)JEHq T#Vo B<)!c,BhFQddc8G:юwcG>яd 9HBҐDd"HF6ґd$%9IJVҒd&5INvғe(E9JRҔDe*U9F,0iA>([!sH/'1#r#41%EJp+rBL$s1bh#*dAŌ0Cs"> BCA P((F۸Гp!BD$B A!<)v L="$qgrx"r"\rJ1D"E(ڜdL0EJ!M(Dq&&Œl' db`&+A dI>ڻDLSZ0 #X71@)B9XpAt*! 6,B;3Kӑ6ˆ‰@C3B7t>9C;0= ,â85D?Tӣ%؁);J\A,8 9ԿЃ ;RB)DX#l#B[cBftƄ0$x531$$F\Dh ȁTCǀ |(ȇ(bCDHȁ|ƍd8G(!t l1ZCm2Na EL#4ɊLExC(uZcK7 盲58࢈Jc2CȦ>Xz@0P87иFl; >Grܻ4 Ll(<`WxԧDDD:9( \( Pl'+01H,d=]CDLB0Ҍ"Ӕ%5(D$뻦%S>2ͿRc+k'>0(e1)*0%ޛDP(,CR9pʵm̡Kx G4B-Dքjt53(i2YfUz--;V2@ vud%cX9BX>X(ؾ3@%9Uf][ŽY=֤90dUׄXc׆؍ G 8Dڇ@7ZBFd0[z۲uux[ۙ[[Zɨ[0UaANۊ\Ѹ2Uz ¥l ZЁ{ܸ#*!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,fpdCH*\ȰÇBHŋ%bȱEC9$ɓU2ɖ0ɓ3 ho;HD3 xƆ=X7S \8n&~ l3ҁtB5q]H+ f PcX _G2{t |0ݸGRQ/2EnwkT2 KdT#>*;؆Aэ ս.=EX!-Z݊ zA H2ت̭l`d8W=Tϖ$ TȪDLa0Y[pc|H܁Ѓu |kYzO|A|Q UCfP_L NFQz0\w_ /}F|A2gtbCH(ꄻ+$j:oyۛ1 n=yaommkCpw' wiqw~t9_y_60 qn؁t iP Hpm(yn PpnP|1C 0 <`jpnps9(7 &&{ P w01IeI$]AqF_GT†'mqm6!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,fhdCH*\ȰÆJHE/jQbƎ C(@L\HY!yjD%k "oZo&w`y\M0sďtxqu併Fݯd#<\y'O/-<{E_qe9NkЋ`;AW1$3 A5VRcX=[lHG@A塍XsND\<[T||ҍAH3aD@zB%2b֌<*V!$"GoQ PՐ'!0˂#Q"9y(iϙc/MTl>de^tj*Fj@:k+Y"1Q=*l%ʚD=PHY-vѳ n D) )oa(#l3a)y`E =q Y4R ={J)XAvb)>T 1@4A7 GAx2 pTax 4*} !x6Akv \m9m&a)sTFD&@ @$9 zALn,:dF)vCy4҈9/0 ΂9!Gyh OExGq@4BC)َ ZǶ` "SH !X dx@ -iZݻ@~"Zs@ZpRh ]ؠ"ZCD("pQaIZ4DTcFdh.W AhcH:x̣> IBL"F:򑐌$'ɪiPR#E2IpFH4R>2Q?=+aF:2!e=Z(( |A4o| {>$( <y|t @|Ar,H6ox | D6Ms b{c? O,9 =OV %HCcquN g; 5G/ |!!XX0iOqT*F"\RiS >Xd(( խ^X:֭gdZ5K!i`!1X 8H\ZWtuM/?"ӠGDЉ:@aX>dB\1 .҄@V!By1 ` 5lk{[2 &Ÿr [0*4v -nm;xN <mh 27mF,؈{'@Ra0A_L~z`׼e[; pI$? my% axR;:L-* B&r&Z N+|a蚂 !<#1N^0̌zU ]3Y͐nAiF<VblόW (yd4v=aUBD0 ĵ훼>K>(ByhϓC/S JuՃf,gn 5vp;7lّg %KzDǧ.قt}w`(yXnWX][1THl͌4ʈ/|#gw暴Øe׾x{}8#7Bpz"`~h_z`-Ƞf6PK4a9tʇDDCbR)@f]RA%b}҄C4ȑ<8cEA`"ɈiRR9QjAr(xrA\4"J#7t YYS.q@OHAv蠅)la)/ 1 D)sl&nD>(*tJWp$ J%!dB!Bdp&Z%0B)r!@溫)IP&.}{.@-{y* ][!;UF)a2GpcG0[1)N1\Kp| J!塉D2j63yx"Ps!Q`$iɗ(}\P yL? ;qʳ/xJ:T s}ؙM>!$QPG=PK6q,BI(A9~! %msɇL C()2%zz4Bn/oR n =XV}/o觯/oBF(9 ' $`Hї?l>2!S |H-WPa7q  EHC!A1tB5qt҃)cXD x#[6Tzx0ÉP"Ȋ%*b 9Gf$*1BHJ%@U >PIdD%H,r 3 Tz@)rp%=8|,B#Aor<LqfA E#ć*92B&)dq8T=I|S&AJ2 MXT11$H$\h#:C Rt@h:AJYON2\,H81gnspTc=0-"UbF ҍn W T8!<+x3Np'၇C1ظ-:j0x п\lfQ", IV.1~ J#]qE/LkrXV# ,<\aOw'Ep2=w#=?%͖o{R$HQ[A,D'v"0Baw 1 ``ͤ`-b8ބUbiyQ= a HFŠa.0E2|%+7>@="pz\= cH]i} [!B0Gt!(@0L0H 4LCxȅ3ZW/!L /-S  1l 2邸"rPy( d!=H3XN;q90*MN;#am" #= a8 Z`nMV@x 2VHMh9d/=Q=pY g F p@B=k4btŘƴsB &t&!0p_s AXc8N@4Cq =$cH8'~B +{.!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,hH*\ȰÇ#J‡'NǏ 7Tpc> \Tx ̙ `$ΎHc ~p5 gš7*$*dxQ+e!l (X0C8*HP>d0y(P ~L( X(` (;!AdnX`r/ 8.@o,}:꿁@ 5-@R(R86dƣE|u $AmU@DRRzը@*@h'f٧~i@4e IOm ҡ*6ZI㰖:馚A+q Tm骩8%P.XV@\@pF`  @iR1 /k2hg#iuiXgq 5n`ҕ ɰ &`،1@C&A,&OEY|-Hv̒q,@'Ep@ Հ p}/ v}SAMԃ ]z]*hAYtG^@mk;@Zxjs_āWqap$PAv ZD@rT@@5'ȡBa,KQYen !FR 'w"L W@  =!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,hH*\ȰÇ#Jċ-bȱcŠ/d2LdH"Qb\IJ0̩ΓkJ3jO#)ׯQ8Lg2Ekٶb~TknYSE{SRr\Sh*^6Px fU_gd6z-|KVm˖eЕ&u浨sVmpڥ{Xg1ߎXOgΛM<eıfl},x}6_?a_|r}|\f߁͗`m ؘj s9hr-UkCN$02b!,W!,th 'H*\ȰÇ#JHE,|ȱǏ+@ȃ,< .X@`B˛8s̅ &xp'?s:@@3 HJ(W`2$ÅV*@T*(eYnn+@O+j4p`U/e[t+  0@/ `$,mjS :c@q 0ܰ (a ""x  {lYf &g҈ӷT,P(` @Ɵ_> p ~'0ft%md{VX@0P @0@M= ` -& Alp ,@O}qteP{$'zP4a||@m@@T7ЕYn9aY@FДT @ Y&ŷ'X%0p@ i'AI$A&U\E)GRe0`jyW:ʠ}2 5 D6h%pM,@_ D$`B+V*Z ^4aeH#]0zqJ~gJ*FJWS*+P $@TmAt Kt@+i`@잜A. 2 +k\X{hpxgAnim \h:,v]>ur!h(/jP@tsoiRsPpM/A{!]\0M\@QC%n{(AoMx=@cNp+m|};t[&'kSz"ŚS*MO{GPNe@r;`tPOj¸ M6D-)os A-ˠCD3۠GH“t@`V0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:~7 BBPOs8iG.!!)H;BR(E *IGHUd'Cp-4Ge!!PM +R,8P`4.IyfMpHe:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWִֺ$ >ʎhH&⠐V  pADjOHmBD - p.CRtG ɂמ>x݅~_Dk $r'[{x zX ( dH8"W7T.|CЅtB !D:`]^ o>n #9 G:1vI-f^3AzpvDK`Q#om" ;!X 0b$*6wA(q~නC5`m .s)Fq} .@BoC@pw- 0ŠGn  ۶:V ;u@!nGMAD`e;BTO(zwȗs2'e .LM1SJwgg0yxGHo`ngVwŘb{y0`uO>U`W0b 7>R^"xE2= #IywPf 9  ~ 7C $ewhF5 uЀ x)0 pWz A{0 t(58 0h *ipx 0[4W[a`Q(0PN PtZy'$V(Y؆X T0 4qS(A q0 ,y E8䄽7 %` !JRy0 6= P]&tIh)0  y{X A_0wH`Š `As& (X8 0 p  gXv"Ph@ȎX駇qgH(| _r ( ؐ[8 9nk%ΰ y&Ȑ9 9Id58 {TItӰ0 N LPzc'0 qGx/ U(MOk)q xX{ NySU<y~0 UI(`u0 K"ɎZyƍ}~b O 90 07 {] X KXyFiAH!יIi3@AAOg P O 1P!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,hH*\ȰÇ# AQ"CCXqǏ3~0cŒ&x2I cNqL7SlC_SʡJْːLu hU8;NyrP]zJ&XZZmZZn&Xm vnJy hڲ7Qhv[Jv`cPxgUj3̇sZ:PY^,{ηF'Yع Kf<ӯgٵЦ gVgɳ]ܸf̳3T/iݸŪ {'?vgˏ?>_sYpݶu&[Yą&!{K9x_ ( S@!,W!,W!,W!,f;H* 8ȰC!">Hŋ3jȱǏ CIɓ(S\IҘݪ;TϝE,8ȓ+_<%❡aټE^߻-_Z .f򒛫_Ͼ{#GwGsm瑇^h&by]G~G'f (∓6!~Uifaz$<5|TȃU)&J2$K6yax egZ`)&RL9%NRyMm#jæV!Tq ]/AþyHY5G f\u!b.U{_ G/޽Qnd+$o?&{X`N$fk}?P!P (@41{'cC}6seHb/QWK Ab)A1cxNQH] ;&Xyy&'`!0(Pzh x(.>x÷hH DGP@5yL#B. CzS"!$Bf[̥.ł]%0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ 08G,x!IdD% / (CXL`8 St3*Q 7_uB=!4?0ݸF9ݑxLc#8j=@>rQ 9# -d&?v2gH!s"8x^zXƟH7񦣆#86bGE<^` =Ge$hHl;`#Ex9ƛ`pV pEY"!r5EL Õu`~Br0*Bp 8 G ؂ȄT"4+Mp$yH "0x8E^xj0y`@.򒯅&OYP+.yQ`nvGFzpyEᄬ\/4`@ taSˌ$cF?||&Mӣ^Y7d_7#1 _ ~wH#^LZ2V8#~ƴw]t@\ݓQbtA{C V$Hdan& ripcB2\!4? giȘF{ _ U1 SXw0O?N@{<ە{w1 `_'(05 N PR~3)>#A!tg8 &T0 kЀt "J'0Ӏ{LӀU eK(4N&O @a %=P<1`!0)0  8 -WŠ @~xGLW{  Y697 _a!}шDamhz08 2xq7h Azȇ~P ЋxȔ m( wx~7 9gt!y O}ƈӠ8h !rSӀ挵x}0 w=L_q@qx| ɐx0 \ = iF   $ q .v N#Yg(J HTL_7 F9 w`ΰ붔ДR`G(,P}x%5pMLJY`P ]`xpbg7P"VX 0ˤsX9|RBq(F>'mW81h$u$`I,av{ ŀ ,FFAPl0Yyٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞1* !Q^Iu3!' (Eu#iRA0u#{(zOp P Q *tOڨjOYY#jP^' ,02:4Z6z8:<ڣ>(B 4?'73ҟFJ(:JJZ3Ni9?@2; 7U[HT1h:jʥѦ]ʦk:pZpejys3URA z Rᧀh3U[0ZoJtکʩʧq 27ZJzaJ*Ŋ5 d21#APY *J盾K;п}C"P!+yۛ<16a*!kL|ZvMPIR%l!@^W[3YCK`kj(O vą$P>0E|I@40p<h fPSbp{e,p,rLA ⫻1d{)<\Pkh`%OlqdlȺ~L*& T,z2sX=<6 rPhIs@/LDzaQ/PǑ&1 j`1rF+&Doz`BREK@LךBRv\0r?rEc\` dL E] Ptr$>nL7k>£C@҇rDO$]!A Y *n[?VS$Ir]'J>.-J5ХD@K-CCPY|#[r#:aImy'>2(PI+ aI\Y G:ɧ f`0%Pٜ} !4 4X`+4=(Pڧ-`Ǎ) An`%4pp}ز-r`ۼTbD[ͺڠionH=S0YÄ=`C!1 ='l<kr`pPqn`?UcSPr=a ]]^C2=Z'nPMx U-!@}QP&"l-#+%=LX`0lI,8^Vr/^i>k>&mB3`xhBN1ayی)%`Q0n"`I̘n@ņ`:Y ]ަ k]Y剀9؍Qpf:g`y'sa.d0ۤO0ڜ>:.n<n..* -\!먋ܰ f0b |IA^C/Q@GrلM>G[n2DpGb`*; 2վz޾?DC/?2M #L7='p5 -E&\O`@7BR߮20)o`X@zQnp7PHAH[]Oc_o_ N,,P$P HCc.ɂGuDa w2IR"]$A*2"4)Z65F@C1 v@cL3t #Xc k51Î^#✳N 9Ƞ*P2#5@TJU,)ЇRcV3=2 7$c` XFX? B Sb +PPP'2QE=4Q[IuU/ 7aJ <ͨAyS vZtj)f jͶŐd!=ޠ#"|G QBB)5!#"1 1BxBPcÙ 9{QGLD@Vb+}e*~ |k ".|cz9cR0#ԐppbV?: Xc1i{A 9\h[ B%x >^H9a 9pb6oi#+ kns-˒z|,3͊#rOʍ*A0 JA 5P#?HDLv&aF B" $}‚'WY`P/` WD Ҿ e `5OEaE6jc0%LEA׿(8@Z<(D5) d ??=X Q֎!g 0">L+rpi3A$@0. V"GBNfH@rSc@d)&ȑ ej92ܥWZPC (L!_HIX҂QH*i"seEP7XsQƀN0$cC5Js̅3-%'Bm!>UH|@( BL$`/V!Ĺ d0@ %GI&!YXJ0$IX oYԣ&SԮ` 2K^PL4}>REGL|bN+QVL[BbЅӫ ]k[Vj$w)cɁ` ,B"P9b83 ѝbEKHS[5/PC3aJYB1솦lN H= C"Ö '$%&6EzR\`qܰKTsioY] ~ &@AN5 k`(ׁ@t& [J6nlNE_ؗM0vyw WX"  < TC pdܐLn}A ~rLXd^4AU`ϴ,W8R>stƛs0sK\+=nut5<0o$!Cq 0 LcDfi(FRH޽?$(!XD} >hybp+@C%*Gb.|A9BxQw#) kXР>[Wz8Xt@,@*g"׆ ~}w?~Gտ~?WfGqvCgѿe¿ 0/Ծ;")#fH,?!| +z̻!)$ |CAvr0r2-ע .B yj*)7B()@;BZp1Wق-@]5pl5 9bI2Ax<(1C+Ł<ڍ3, D`'7H59>0<@XA+w%xB/O!,!4'i%`ʱ2Z2jHL^̣hځ.)PKèIM9PXD:> |4ji H9#`$"ͯD,Dx̅8()L#y*6L ӴxR#$.>BCNM(.zD$P "pI*,1KJ& O9}mRvr "Q,Bp1X% ҂){D;'@X $M,(3Qky*,3==嬴Kۍ-@-C50Ѭ@$<6u[؍Uٕeٖuٜٟٗ٘ٙٚٛٝٞAڲ@x:ږu_ ]ڒ*O\ ےMԏL,-,ȲUϮ}9=˜*ڗ[ݾ,>] fq •5\W=K¶T!%dB'JB*H;-KY&|x9uQhD,0È!:C`=g&H]~7d1U+}=Gl]HTIޮ5>7 \̃)(ELTTE`EW,PRu_xʉF-ppC '7GWgwq(ڣ}q֫) qZU 7 o,[$[ !_''ql˻%& + ,ظс Dҭ5ۢ\C*<ȭB =hB&ġC_ЃBMtN a]uT^uY@Wqi=^C]dyA^"tatiqKHGςj7}Evrq E^)ŔXD^T</&CofF v v9nar4ǁ0Q2a5D؂~o)fk}_eIwwt_`wഩه$)HBh@ȃ@8C#9 cT c2Jj@/3B#,+I%6TM=HNb1h2jZy,8u!Id#ujٲl<?s \^%nl@pYP39gbgQcin3}K̾e/(D)5Nɻ&Lez&OI{[((P¨gEȃw1I224dOIrĒlfz_Rf~sVzo^gDeϽ/~N*`~Y5к>8H}ѝT긳}tٟ8j (GA0Y D(ސCb!Gr&B$ʔ*Wl%̘2g,A(@;ZCn!P"BN Q8-R"Eւ^iD V/l-ܸrBc@p c&D}A#.%B0bG"A!%׹Y,a$r"EK0dnzu+١eӶ ` ;Ѐ`B*].ڷoSI ,Ķn\5kװ.}i{ӨѻLZѪo W]q!s xDbqVdwj!4X!X—%O$b@e`6$ؕkFS.r@&oG&AF-/qj Zdmdi&\*b"sҙO@?9dSz I@@6$bhPRMb%h%&F6zel:*4-AU%!yT.v>0g 4B~pS.Ėz,ɲdB V+A*jJ"Ҷ, [)u,iG!^p!Κ;Sk,jP.o\[qk/|pUaG$!Yd[|1ƣn,1<2%|2)2-21<35|393=3A =4E}4I+4M; F4%kA-C\S@uQQ=[7q6vk} viƸ`b[ MJoLwJ}]U&v1d1`[$9;G!Sg\zckrvb=zvOA2<^HAI$0y%vXF!|(tn:&`AuG0')h~KqbFHP٫{y1P|SrmObD) ^Xg6xj8a7ă \w>#A&81+` MMr``\r>/B=я1%*U9Fam+cy7FW DMxH9(RA$" 1-fYi ȁm*us%XX%ɖ1X&Pp )d4xd'̩H"E&O}~r !MY^Ut>A,Oq"ö Ρ? Ђf3Y! AC ܠJMxSNDPa GT>a 6Ǡ"IR6Ť^h;Z~ Ix.kڄ,ojS.5KnAW9 w%/q39Z:MZu?V8"$y@97XiAk^0װ+$3!*$n"A 5bR yB}x%StK5H0A2$3E5 1kWh& veXƢa<Gp1C"D೩uf:xB1s(>Mzt0=YOJ*Pf2L}ܨg|N}hg_9DU遖C1-mkF˯]+Ga29I*q#5E"Ḟ\4@\u;~@':a*MZJ (Ey֓@h# /' OG75B*QΣ@KcQ*97>(Bxno|ofMO+o=Wb|-;͏/|Λbm;{\?1,ӯ '_. "kIeTY`Aͅl^VݞQI9`Q K\_`xƟm j D r ڠ J_ F_ I7aQA1PW p^i_bi V`*!br_Ѡ & Ξ %6% b_%j%f "f$>b rF /#$U|"&9zQ'i!.B( !&Vb`$v2(bmb '3"&8a&Rc z 7#(4# :<ޡ>r`#?_xW %Rׂ]]soFsFIJEaW7gbw&$kf>dzfBvd&UbF&3d&%#?Af|l$Pf9fgSVfBR@@$Z@F^%`4)*zAFUGF'`DT T]Vٕm'w"(|A6=>Qn% Zxb'=K~f!8~|Σj(gVc:of"i(c M#y&9*d7){ZDM=gI'HZV &(6ij"fx&yvbivPhfja(`.s N|zb&NꢎjDh~畒j`T`I)Kkz` bAEE4*Ldi2."Ԩ J訑"* hKd^b渖g*ENe@(['=Aj*֟+޿nzZ^Ҝ] ڽK,)R+흲Tl¾M@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,tiH*\ȰÇ %XaP"E!jȱǏ 76 `!aOBT #p10ɳDiC?0 P"|~ PիXXx*H`5X& PŲb@:DMm $PS@`nJс2 c;HW: ڄХ4ӨUk O/ HM (P@P00[ZZQ7 p0P;x9pA7܀f@U A]y҂40`aP1!KQhf\A @G8LHa V׃TH@`$|У G#G"YA,BpXH`ZU@ E&@i@of8gwpui"%ON-jgRp@ Tz)QtDedB`i 9IP|JQ2-NP@A @tk,MUlP.,8K&L49 AA6^1A0gм!{yPl' 7G,Wlgw ,$l(,0,4l8<@-DmHcBI t'/=(&,M!@-[| ?1u"CFz6cMo{lB)!$BR'7K138!3Ngw砇.褗n騧ꬷ.nn9V*b;A @/@tc #,/ cc7O5"{.\`L$D@/@v\ 8G wcSc7vP1B vpF/hNfxC ylc∇ B\03<2%Dx 5.rCj@$d!UDXZ yCKK<*(<ȣq [ƨy<Quti#(^M} A$YlQI%1&1;9῁K-Y7m+ ,LXz)- |G0xLB&\5:I%Җ A5=I;1Y= L hٙ;L|aG^D3n^s 桽 hA0c3n|c/mȁ%s4aU5m_Z,~z]޳~OgPl4g}A_כ?/54`<ӆv|, CF ZG|w}xH ]5@ 1vH'aypw:]xEw|Ds(*,؂.Si3ZY_00185v#X4Ӑ   @6" 0 JȄ>h!X3CP0 =M#0 ЗSex?h3ӰS P!@9ƇtS 0 _05P CX `ϳ0S ΀ 4H fx|}qie1u85~0 Qvxp4GVo6V  L7 t x@Ȅ0 fKȊ؊ ЇP(85430 P, |{؃@` 1y{\1h Š 8 !Z "Y(_ ؑ05@ $iK!9Y5) w 𔌐HL N R9l0? 6yw` =?yO) VvXv,  9`ӗ[Y9 P" Zp@"0 xp@ P{0Y L#ɠ T <)co9|93 N4 HPvP9e0 tX z@TX N1t7wP`)C~F7  0p 9 Ӑ 9 95p(xwwXysy('{%s'X$a$.!"W$Z&i4Hr;j:!,W!,W!,W!,W!,W!,W!,W!,thH*\ȰÇ#J(3jȱǏ7da@\ɲK!4 @!f@!Μ/ Jt`&`p@F?JJU#@TP '? @p DA @ jL(`Bɪ@`ֹ<83T@ $p L@@` h  &0I9C<Cej 7 h퀠7uo̎1@z0YN 8txAޅd6@}G`y!hBpSUh!I`@ $SWxX]NXpYXPVA&A`"=@ `5`A}m@4EP fi $L0]@0|`PHZ@(Ap@)uh0饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vdm ֲ!4KCǣxR )!(1ċ[)bk*m8]Ȣ(d4y 𧅔BĤH+p(,0,4l8<@-DmH'L7m` CCnFPz5# 1cO|Û e||c2#8Yc O(G{z&: A t@ ;x8j%:;D ;ϑ7d9x㛯 o)$@"6ǣ@+#@5R@Ќ,!M9<#y8# O8Ƴ o Ϙ#9FD"' j O (ŢBKHQm `ZTAy.e#Bj $t0Ba x@0Shb)pe&AA1 j{ZŜc%J d-W ]Ren40k` ݶ[!6 nH& :^, Ex!O;'N[ϸ7{ G.oq `$qϖF .@H, >#2O: ЂҪQS (GN( #-QpT @{:0nЃZ=! p@|qw`8/ =anc>anC(pĂ}oꁍ}aG"n@!DNA H5>±'@ {ӣ$_v/udЃO @>}|> _~ 'So8{='i AP} }Z(L0MzA3* v8% 0]H!}H0e'"$&h8 ` q y{N@wRC@{@CЀq>t7v!!P@7~|B% A]@ kHrxh$05s Ӏn&0 0N HhzoSpc @C09hh#0 Nj.c 8@ 7Ű  ( 8 OюH!P Ӑ P ]0{0 Onb{~ Ӡ 0 pmyQ] ɀ_ )$9t t7x zb B T 0@ Zp ёgJ "9!ZUym0 81`yьbtA0 )0 t"'8ёfN@= {zAk)'P `  ѓ>, y6!0 0]y98 )ɐ'B 0 < ә 0 C0 7P ` 67 W98aj`Y "pӕ txٛ@0~ٙHz)0 qtpg N`~0 cH)( !~ 0 x y3 A) p  0А<*>z"]z"X l/5*f`AZi^!To$`3Z{pr:tZvzxz|ڧ~:ZzLڨ:Zzj#D/8U:Z'r@H]qI7P2$,!,W!,W!,W!,W!,W!,tiH*\ȰÇ#Jb5PǏ CIR`>X  8ɳO Сb)!Ґ~@ի%(!P@ 68P 8AA@)@h``@ @T B` @ #URnP0*0f X<h+j@ R@ 0KTrA\8nA xCsiSD݀QT`T DHSZ ZlbA0&Pnm J(E@@#)@ {dP\!Z&V(VH\.BDԀbiA )py$E'V S$wi墌)^ 9I0mk<x*b@TetH)xeA%ꗩLgP yZgA & Z4`Iߚ5@(&+JC|ePsol' 7G,Wlgw ,$l(,0,4l8<@-DmH'rE*J҂QK-)@d- \B4x2G)m6ˢD &"@4rʡ!yF})@9;pw砇.褗n騧ꬷ.n/[D?P/uL<\`J abyLd#1ru7T|4YhD)U @Z([0)-"X@Sa ЄTO1LA8[W5 ݜX+zB +8NZR-NC@P8) I<"v%\-,N ZѮ0lp }a)҂@W & )ζAX])!$5|] &>/SIm ołrSRߍ⪆9¼f-^6闿of!(@)C`bx ,w_ ㊈qjT,X sޘ |UЁ E) %BzIh >P' $T=, Ke)LD.ATQ䂣5i`@|Sz2y/!Кz,%[DSAlM s f;ЎMj[ζn{MrIS!AcL3q`ZP#Xl.>P`!> mn8tҁ 8\RH>ҁI?= A> I"HG0 |`#@0O =1nc:ֻi ^t4h:=.la @;>"GZEGeܣT< d#AF\'>0/Cq#PPEc1{<\Adt\ p]}/( VbՇB@gg  ph z9@q M)= {@V"$ ȷnDgə @uyNIӰ LyJ09, ~ 0 *!1gys3)ɐF9  a H):}NpPIY3Z)J I9 ] y@ iH@(Ri97 0 q0 :3뇘"9 )yq]> Iٓ Y00p 0 `pHqA%)l0 !$ zԊzO;ZnH{!,W!,W!,W!,W!,W!,W!,W!,thH*\ȰÇ#J(0E3jȱǏ Z ap$ Rr˗0c6 с@ \hrȞ$(@@ː@e*]4cM>)UϤ}Ŧ`ÊEXT|  "" >'$Y^jO w˸˚\@ px@-@H _'F,۱kZppCNt=v"H09DDz+?E";!$4 "C.81amxȐx |`Q u@#-e(P_fbAfg, MT8XS 0MUb#fdlI-6 ދA(\g @\\@A[iƜlvlƝuN؋!| E@L d6$e0Aҕ4ڡTƤov',^Y[ 8'CjNjꪬ26^*무j뭸뮼+k&6F+Vkfv+k覫k)ʠ 4׎)1\H"Ԏ2ܬE#(\ˎ$cl%̆`|1%_ 4l8<@-DmH'L7PG-TWmXgq` \e/$N#䞧"?+Mhg!C#ι`a`y  휓;!Mhb'L8`Q@ =EHGZ$R@ 'R̩FQOCpү蠟)酩G(AEz#N!BqG=ERӦyB MU$&P/z=:}]R*B +^F0t!Hlug F[ 7$X,`XL]_4 BWz^4guELBO` C" U*؁qܞJ!``9B$ń^lo @L@MHh}c!k:҂P "h(e GL(NW0gL8αw{<rT. @E^&^h"B э GF|%dCC:эzt >E8:$|QJ lPf'-AīC:\:]Ē^T(? / Ɯ $ĭ]׾Fb |w!4X$dojcb?-mn[!I4! "duFJX̶_]oo}><-X ~‘?|aGmT=q3{8u:Fa$:{/w`_,2 z0*@ ;PR(`ș/H:W֛6']Ti9#";;_NkoΈ!(CCzv+dHCIFe~Lv _Te0kPi FPbp~̍v SHCU,k*|~Og 1_ӈ≜ gI <4!h4&{'@ 1 O~ۡ{S?oΌo30 wGyH ! 7p=Z`ڷu @_1WTW|gt0 jz`{{H0!P{N W{# )!y_q2 L^6#y0\^W5]bwk pu` L脔7_s:, 00Pa0f!0 !" Z*5 x@( !w`" @M}X"&10 qp ] Hq9e0 t'xhO8 T0 `~ NpkztPzG8 P؋x3e` N`)`f 1 "0 0hz] 0 '0 p (eX()Th3$`~D`&ea 'fėc)(u.0294Y6y8l:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ4#D `O7UdOdZt@dNGnHtIt7J!,W!,W!,W!,W!,W!,W!,W!,tiH*\ȰÇ CHPE &: FQɓ(S> :Tm Aȟ ͢ʷ߃&p4p TX  0@+b$M U`@,ċ NH  (Z2e˘ 20G  U@@uk (P`sC0 j `i )\x@υdvqG܁6dOqص1%d)^hB HtziEXaG0miuF\@&(䐀 &l0$~IYBqN@RHh%Gl)P (qYIA`E]be(ӆx^9(&DCSP]@B@!d'`g{z` @G Z8B§QI d(yiץz@28Y_R`QvƓVa` !P@!f@Ppɪ! LfRۑ@kBKԖGL0@Ԓy>un!Rg(AH-r&wD@St`brK~u.AxB-7@ɵ[<>a56A`cmCv|߀.n'7G.Wngw砇.褗n騧ꬷ.n/K(M񏀬! @:a qx`!eF%u| >yd$B|jIN!G2dDi='I|!p 0Ň*h t k H2U52bTd Q?\\5,WPУG8\XWuoA=AWqA.= 4$N ,X [Wsp·=HDa@ G:i{88S*su-" -'LAF%Bx "D=je؃@遏{ĢA'aTc@ $+zu-)X@zV̰7{x~$ Gz#<&=p31 S,RCwU kZ 1iBZ$ )H$(4|6xR`E|Ѕb d  2v@bqBe+X$cq$4gŘQ.f>s0ba Q^LZF1 F4hiT4 N4A0Nƶ-|1\ נ0OvBb/qj_Z"H.ع+h baA, 'LjvtMg v3A^gXhC$҃i4;'ðD`0 J'-x$bR9v7J r:t@LA-#e4N)^|\ %?9z gb&xNH\ d҈N(mNVja- <8J9 UzNr[#c2@XY A& [w@-EM1k;#-/!$>ݷOP ! $~L@^ mZ Sa 0 - 9)% 4FULi0 _x>Nn >HL#=48Ʈ@AQ3$1Cx@]x-Lk z 4&Ӱ` ΰ9!nӰ7FcH]+Veu`$dB,pjAED,HG{U@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxh89GÆmFqegqbnHd!,W!,W!,W!,W!,W!,thH*\ȰÇ#JH>XȱǏ C)0 $S\ɲA?8`&NtIѣ ; C'~ PMQjե6"ȊP.,pv@1!A@L46З  uBqJU)q*R@ fZ q$@` * b  IsJ-88Asv@Paf7 d `@x| P`B0UsA4L '@40ht Ț\bDх tP )FPi&\ފPFIP6B Xw0 D6@Bf$HT'xlW&d\x\!P@tpQp3m`t䅉E~!$[dx cBL0Z\ub[RH0.o@FP$MSD+k覫+k,l' 7G,Wlgw ,$l(),\Ca 4Ā7!"{@ y@ D;,3M3@R5à!…Z1+4"P)` 7)x|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o~$AUֺ=I! łO&B#A耏 B\jH>r!&'#NȨG8*AN ݠ=P{C # A B ;d6TqZ5"H7AV8=a canc}(pĂ@@Pl > -vc"XaBLX…7=Rp< =Q {$8街!c$N!R !@='`@d c(*>z㊦DeT ܤhYHR MLKB/!+PWH%@#A4S9q'&)fn}MrXH()sI Bg.MMbqޤ\S!FH сB kD888 "L9*T$ P \` (\9G C M A!T,k9t!RLB 9Pn `Kx$C{!y4$Hj,1idbqц`:vCR4Ҁ:K-҃bA .P3^@t 4wPlt HF1хka1phR"η|>@ `@ *i nRtBM]E2 a?:PԊLTpuιl0Nhno",1ZHA{ rzUU%A&!0!`tPArL3Xl> b̈́F:O&$AJK*-L.b/%]!,W!,W!,W!,W!,W!,W!,W!,thH*\ȰÇ#JH> ѢǏ CI2a @ `$F 0acǒ8saA*r Q3 `iϫXjb &phR5 t 5խpʝR-L2p &M0@hd "C"4PR0W?ߤK4 , @(:Pb@kp` $ ªk f }[س_mą P"o pa jMHat#'\vY ݁] V5%j\ tQhZ0V5q90a\pԞh)>0݈VYw]XfF B䥣@Rl`jSeeZ]XI[`*mPAt$Gp8E%{NIځB@ ARA %AGNm BI2Aj$L'k6I4RWӴfv+k覫+k,l' 7G,Wlgw ,VP؎0Gsb*#jp-63l2!A=3B]4&҈bL+,mp dI)xr`e˜rlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogʓ :łO&=>nOG!34p4TC5d) ,@)H8!_ZNi}ದuсp Gd0O }!h*05 92|# Ȣ *Ј{R!<%`"!VɊYLb( $G頱ZcN0e8H*G\(:| !Db=%A9S1}bd쇿nt*հ,X~\r@.:JG?p{L2f:" DH4aF34<|A-59i$xBXL ,:ª; r2b%҃wzd0`C𹶂Sr@xa: \4 1a|a i2Q.LgH-JYBSH8CP:ը":?L#2Tr qI4Ta;:aJidb@|1 [}O"U65q]T{apdp\/WV@ƒX mR  a)u*aLE1TaS.#j[ Q!dO=M): ZPjY "y3J F\JlR]b׶xmAv{Fpy)VEwJ,HF,2 `lG;wKA&`xU|%}u6@ Q$u@( $aDBA$),v1`zװ"ռ6r 4bJz5ⱓ+9{5V}\1b[t|S8S!o>i}p8OH; 8+ww|% B4@ Ep P\!RzIp PD%G %8P4Ahbk8DCL6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6 78j' r(jH:g#`i\H1j@H)-FXZprlJ C; Xa&k/Lb)y\˦ z+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7tII"DB$Ԍ{łO&I! o >m|whAXe`ECPvK#D>~U}we-ԍ@ZTs=>Bs4.8 SO8 $+C@xE: I:ot>_p(`N,$I&RI%C PA4 6d8tcJ7 *03 D=[=UW > n@A~X]0|8"srMo_G7J0tP]ChA.>02x>`  >Lap x>Dx #G.H/Z_V"D #G doH8p⏮!@0!lk@(pTp0x W|&Hvx0 E .HLd00N$ wmnw஌g^# NЯmpKki&inj4'Kx}%rhA$@X /f zCܟ&GpErkr't" Ef d\atng-t@B B<Afcr /ZB@؅FĢ05!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/list-fancy/main.go000066400000000000000000000105601465647402200207030ustar00rootroot00000000000000package main import ( "fmt" "math/rand" "os" "time" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( appStyle = lipgloss.NewStyle().Padding(1, 2) titleStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#FFFDF5")). Background(lipgloss.Color("#25A065")). Padding(0, 1) statusMessageStyle = lipgloss.NewStyle(). Foreground(lipgloss.AdaptiveColor{Light: "#04B575", Dark: "#04B575"}). Render ) type item struct { title string description string } func (i item) Title() string { return i.title } func (i item) Description() string { return i.description } func (i item) FilterValue() string { return i.title } type listKeyMap struct { toggleSpinner key.Binding toggleTitleBar key.Binding toggleStatusBar key.Binding togglePagination key.Binding toggleHelpMenu key.Binding insertItem key.Binding } func newListKeyMap() *listKeyMap { return &listKeyMap{ insertItem: key.NewBinding( key.WithKeys("a"), key.WithHelp("a", "add item"), ), toggleSpinner: key.NewBinding( key.WithKeys("s"), key.WithHelp("s", "toggle spinner"), ), toggleTitleBar: key.NewBinding( key.WithKeys("T"), key.WithHelp("T", "toggle title"), ), toggleStatusBar: key.NewBinding( key.WithKeys("S"), key.WithHelp("S", "toggle status"), ), togglePagination: key.NewBinding( key.WithKeys("P"), key.WithHelp("P", "toggle pagination"), ), toggleHelpMenu: key.NewBinding( key.WithKeys("H"), key.WithHelp("H", "toggle help"), ), } } type model struct { list list.Model itemGenerator *randomItemGenerator keys *listKeyMap delegateKeys *delegateKeyMap } func newModel() model { var ( itemGenerator randomItemGenerator delegateKeys = newDelegateKeyMap() listKeys = newListKeyMap() ) // Make initial list of items const numItems = 24 items := make([]list.Item, numItems) for i := 0; i < numItems; i++ { items[i] = itemGenerator.next() } // Setup list delegate := newItemDelegate(delegateKeys) groceryList := list.New(items, delegate, 0, 0) groceryList.Title = "Groceries" groceryList.Styles.Title = titleStyle groceryList.AdditionalFullHelpKeys = func() []key.Binding { return []key.Binding{ listKeys.toggleSpinner, listKeys.insertItem, listKeys.toggleTitleBar, listKeys.toggleStatusBar, listKeys.togglePagination, listKeys.toggleHelpMenu, } } return model{ list: groceryList, keys: listKeys, delegateKeys: delegateKeys, itemGenerator: &itemGenerator, } } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmds []tea.Cmd switch msg := msg.(type) { case tea.WindowSizeMsg: h, v := appStyle.GetFrameSize() m.list.SetSize(msg.Width-h, msg.Height-v) case tea.KeyMsg: // Don't match any of the keys below if we're actively filtering. if m.list.FilterState() == list.Filtering { break } switch { case key.Matches(msg, m.keys.toggleSpinner): cmd := m.list.ToggleSpinner() return m, cmd case key.Matches(msg, m.keys.toggleTitleBar): v := !m.list.ShowTitle() m.list.SetShowTitle(v) m.list.SetShowFilter(v) m.list.SetFilteringEnabled(v) return m, nil case key.Matches(msg, m.keys.toggleStatusBar): m.list.SetShowStatusBar(!m.list.ShowStatusBar()) return m, nil case key.Matches(msg, m.keys.togglePagination): m.list.SetShowPagination(!m.list.ShowPagination()) return m, nil case key.Matches(msg, m.keys.toggleHelpMenu): m.list.SetShowHelp(!m.list.ShowHelp()) return m, nil case key.Matches(msg, m.keys.insertItem): m.delegateKeys.remove.SetEnabled(true) newItem := m.itemGenerator.next() insCmd := m.list.InsertItem(0, newItem) statusCmd := m.list.NewStatusMessage(statusMessageStyle("Added " + newItem.Title())) return m, tea.Batch(insCmd, statusCmd) } } // This will also call our delegate's update function. newListModel, cmd := m.list.Update(msg) m.list = newListModel cmds = append(cmds, cmd) return m, tea.Batch(cmds...) } func (m model) View() string { return appStyle.Render(m.list.View()) } func main() { rand.Seed(time.Now().UTC().UnixNano()) if _, err := tea.NewProgram(newModel(), tea.WithAltScreen()).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/list-fancy/randomitems.go000066400000000000000000000046011465647402200223000ustar00rootroot00000000000000package main import ( "math/rand" "sync" ) type randomItemGenerator struct { titles []string descs []string titleIndex int descIndex int mtx *sync.Mutex shuffle *sync.Once } func (r *randomItemGenerator) reset() { r.mtx = &sync.Mutex{} r.shuffle = &sync.Once{} r.titles = []string{ "Artichoke", "Baking Flour", "Bananas", "Barley", "Bean Sprouts", "Bitter Melon", "Black Cod", "Blood Orange", "Brown Sugar", "Cashew Apple", "Cashews", "Cat Food", "Coconut Milk", "Cucumber", "Curry Paste", "Currywurst", "Dill", "Dragonfruit", "Dried Shrimp", "Eggs", "Fish Cake", "Furikake", "Garlic", "Gherkin", "Ginger", "Granulated Sugar", "Grapefruit", "Green Onion", "Hazelnuts", "Heavy whipping cream", "Honey Dew", "Horseradish", "Jicama", "Kohlrabi", "Leeks", "Lentils", "Licorice Root", "Meyer Lemons", "Milk", "Molasses", "Muesli", "Nectarine", "Niagamo Root", "Nopal", "Nutella", "Oat Milk", "Oatmeal", "Olives", "Papaya", "Party Gherkin", "Peppers", "Persian Lemons", "Pickle", "Pineapple", "Plantains", "Pocky", "Powdered Sugar", "Quince", "Radish", "Ramps", "Star Anise", "Sweet Potato", "Tamarind", "Unsalted Butter", "Watermelon", "Weißwurst", "Yams", "Yeast", "Yuzu", "Snow Peas", } r.descs = []string{ "A little weird", "Bold flavor", "Can’t get enough", "Delectable", "Expensive", "Expired", "Exquisite", "Fresh", "Gimme", "In season", "Kind of spicy", "Looks fresh", "Looks good to me", "Maybe not", "My favorite", "Oh my", "On sale", "Organic", "Questionable", "Really fresh", "Refreshing", "Salty", "Scrumptious", "Delectable", "Slightly sweet", "Smells great", "Tasty", "Too ripe", "At last", "What?", "Wow", "Yum", "Maybe", "Sure, why not?", } r.shuffle.Do(func() { shuf := func(x []string) { rand.Shuffle(len(x), func(i, j int) { x[i], x[j] = x[j], x[i] }) } shuf(r.titles) shuf(r.descs) }) } func (r *randomItemGenerator) next() item { if r.mtx == nil { r.reset() } r.mtx.Lock() defer r.mtx.Unlock() i := item{ title: r.titles[r.titleIndex], description: r.descs[r.descIndex], } r.titleIndex++ if r.titleIndex >= len(r.titles) { r.titleIndex = 0 } r.descIndex++ if r.descIndex >= len(r.descs) { r.descIndex = 0 } return i } bubbletea-0.27.0/examples/list-simple/000077500000000000000000000000001465647402200176175ustar00rootroot00000000000000bubbletea-0.27.0/examples/list-simple/README.md000066400000000000000000000000731465647402200210760ustar00rootroot00000000000000# Simple List bubbletea-0.27.0/examples/list-simple/list-simple.gif000066400000000000000000000773531465647402200225670ustar00rootroot00000000000000GIF89aX &1 5!!!!!8"""""###$$$%%%%%&&&'''((((()))***+++)V+++,,,-,[---.....///0001 11112 22224!444455564v6667"775w7778889#997999:::;;;<:<<<=$==;===>>>?>>?D-5v؀DԎ?K %O-t F 0Upˎ-7t)iя?0s?p;Y`EKO?$xGb 4G-O4.Pp]7_ 'L@CnsA1 IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6(pL:xγ>πMBЈN!,W!,iZ 7HAL Æ${(ßG2bMp!!,W!,tPHP࿃,P‡P"A -Ĉ!20 rЖ?E"92$OkHݰ.$ =.woPrT:,ğ6#I (ءkV&u\ZQEwjlS !,W!,PHP࿃,P‡P"A -ĈPAL9D[oI|1̋(tΛs IMA}Q=kDTRQU˖{\CU5Jȟٳ_BթD=e;WPp!,W!,PHP࿃,P‡P"A -Ĉc&r8~.$H85\)sd5rc)ڂד"ACBϟ-KśP7vX50Mg! X_R&goŁb˒%>v*Ȁ!,W!,W!,W!,PHP࿃,P‡P"A -ĈPA= )E*8 GXJ+[({#M]7( cT ˥a:TORT@u}H?y~Au gkAljQHjd@!,W!,PjHP࿃,P‡P"A -ĈPA= qG O%G }DIɓ#PJ(atiR6-ْRS-J1 !,W!,PHP࿃,P‡P"A -ĈPA= qG `hRb&bcJC;@z2>ϟ-KśP7vX50Mg! X_R&goŁb˒%>v*Ȁ!,W!,W!,W!,PHP࿃,P‡P"A -Ĉc&r8~.$H85\)sd5rc)ڂד"ACBfB, :oldƗ!,W!,W!,W!,PP4H*\ȰÇ#JL(ŋ'jȱǏ 1ɓ(SRyQ˗0c*dR͛8?Ҵϟ3wJhNC*])ӧP=:JéVj%uת]evYeϪ=*t[iUwݒuw߈} fxჅ+xƎC˘3_̹:ZΥ3jʭ7v;ŵo㎭[qކ,|"Onw9sΟ.]-fc}޵ouDެ\?`Th@녪-瑃mh{|O_/mZXy ^%=Y6+Mٞyׯ[/# :gAc@;ܓCq ";ǝwxWO G?ك^CV8p=4ґ:`zgkHȡ a|X$O6,4c7( <250qi8%A8 AӎC.=|yO6)4(R*, 8S:64yg{D;?& : e(Oz駑N:! Xs C?J͸cЮ, ֺ4Y4`s-fdD*=q:^%l@,Sm meD 58?pb:A@+{9jjCz `@ОTd@ĭl-d,?\C!w3rEgnA:P=?U f鏄^SM'-Ɓ?@?m\{?:2 %|,Q91S?*@AsП.4O>>PPC?y}pYu3=O2kNQ?Y:\=AĹ琧]/=a57AKYS#"#2p!!1+(G=au,sTxFJA@?QcG0@L0v=KCQCSwpF?wP;D6UyxN" H$aOΐx* vz#u!G-wqc8un .@hz8k@ ~f Op?D%~"$:(pp#ĆXC[=^oI%F ĆK!x?- @HD\mT&:kv2U;bƁ7a `01 Rm꬛tf2Ăhŏ6& b΁xG"8l2S$-eIÉ3 RHsKX,6Ef\f3bT@PФ>b2! Ӥħ5NO2KER}4(AhjP=%_B9%4",;Y~*h8n0U!h~@ocpXO &2ih(/pqbeC 'V -gy"Z*LSC2@d)$hnl*Ke/YCE]˭;V#NIs; J _ S; GM0&wf,؅?xW(,!.s(MQ.>2;"h (Ҿ كȟ|X E XQ @ l($Fx(OyB<$0\1 vYPyT#o9^Ga /tp3 ,1@@z ` /E|] +"AFT!CA ϢC8xp9g:`|c @. ]?;|ax^8{ n~ z|\77@<U(ሺ@i6LJm4xEs|`2sC`=Db(%dP+𱇳!fC>8>0ʘ/<$P|(rtg Q7G  w~6usGG` y(Cvct 4x p ^0/ (Ֆ~# p{a7!py@ P'y)-1(s[<@8m wr~{Pux(  SUȂ. z=cl 0"h- pw 4 '$_6*4jf+x'|'"(ς"-q B9(GVD@)ksI[3]s7iyS{"`41CGC(5V :y33Yeh ̙$@L$<d:wC8&AA^;4a7\L#K9EA8rE!QACwKq pBD@Iut:ApH(C;ZL]y0EApX'aHp. $TuQ:DR;RUwCCTaI?`fA_QPqPĢV$$M2ե *|N@ y#8bM~$Nƣ8K.L Ari`uTC-*IRWť\U<Ū?nqE0ᱪTq2ӑSjj's-i -e0.B8`A:\uઁ%EC՛Õ&2@75N ]Ƭ'*2٨ Y31a=&K`Ud`cb6`Ac aQca =T BA!AhgeQiv6;0pX@ѳOgL7@b2kqH۴P{q2 6XZ\۵^`b;d Pt@J|elwb''RQIy{˷# > O fdWQk!1|闀 b "#Bb#8aڐfE%A%VһYŰ(` " 9+2wњp qDJCb-/0ްO!/@///b ڋ@ 'zI9c14݊i >`#6&Cwsy&ޥ~ \2'I)k :j e}=)s;>d>PVlAA*̫Kl2BWTqoC(S E E@EV7ebPgeBaFZ GsZDŽhIT:AdKhKK !砘 fFax ,OZ C-PQ'/)8A  ]VUa ?i@t  EKE\APqesUWCVzc;M0#UtμXZL`ð23C[^]c( zA^^%1 ?Xt Иa$[y+b KϏ*;ee@Pgle&eAVM w4|gA"ji!b h&%2p⶚-o0a! o` ۲=۴]۶}۸ۺۼ]qm$EGč0`Ȱ@!06ep0 `(F}1&m.' `Aӽ6]Q1ߝA+"Q/]_N!֑;%;RA֋ON$ Wr%1{ #^+nb޵b A@n'r"R/2<R,EN`[}%|9 8z1\~å@E@1:!9#V^@s>0>s˩ūŴ^=`WU~#ejlȈDQ4E&\nzl<ʅnپ\@Tp~:N@UXh䤷KԎKLA˶f{lQi*ʃJ\`q[+I uzAL}Σ Ld08 =</4Y P`HyZAipvAWv !df/J(U%m}c *_M۝R92;mǑ_^EBMFԕ?e(ҟ-/\1jZ@6'pӗ^>^Eߵ `O}@ ^TeaeWFv/%?^ baZ&j}l`scޏ/rFΣQ qA 4(D  !+4^ =~RH%MDRJ-]h.(KL=}TPE1ҥ>UTUƄ1VO~VXe͞EVZmݾW\uśW^}X`… FXbƍ?SC6"_ƌxSa`Ǵ2QYa K\k߲Z[|~!(KYcpv {S?C=9wU0=t2[ B u*ĞPzGs>>я IkD0{{Vt;=,)&_ʧx"dǙ@RTt\+!ƟmphRH4('8odtG|TMKۘ:8=Js" %i.;"gJ 2u Ɵ;ßO8gR=A3HG,SM-%}zd87cv-cG퐗5ԟzhTZj R'8ǟUA٬vڋl#_>^A 4mYh(RşQ()Ù~,XX9RgJ.^RG - ~ 4jƈ( FGYWfdflHjP *d"y"&LR,{;@HQ_x&z J&-4\<8 h8Ӌ{ь(3KɃAlx"$UfbK kxC0fJZ="#-y Od ^u4БZx(I5h#AE:vG>P~c GTBDd"HF6ґd$%9IJVҒd&5INvrk;0FJQz, fأOX W#4y+ԃ)A:x1GyL\bKsK0d63;G?]8PAyuzxDO <#H7qf^ AG/0 EA^FG?j{CYʃJ'A. q:I}3;_ C`cKtFww{w|?xWEG '8u%IM9 kT1Kbjtcw0K#yoVxIjNIoJH*Q}A(1';>D)Z=J ߛ&ܯlu+\R;iO}*!(5oY4Q aֲ~5p.bm?׺R?DIpA=X*x,@Er۸513!! 1#@q1*+˲^a)2t$ Їq˙3+껈Ek4,Ǚ"D@B+TB:Ĉ@B5$%P+*1560 3gh4<~77 ڷD7=ÏP<[ [()("+QR4Ltp#E`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃ G@ aCHW ؟:JW;ɏ0IP1rI衁Ȗɏ<J <.Lʧ 80YxApʃ "T˵d˶t˷˸˹˺˻˼˽˾˿$4DTdtDŽȔɤʴ  Mp$?IZH:='l؜M=Ѓ$Y 0Ѓ|l22=hND 2PΔ+р)ȋPʧ@': MЃ9ΏO,@4+Ѓ:9Ѓ 欃mΎ< NPt ]+PPPԃrOO`7=p2P=Ph8Q &hhm!h '$pȒHȐP!-/R,0 )8P&)5- h89U*R X+`*H0:  2&P(#MRkJm42&x6eNm͐+XG=(0p&P$؀&:]Ɋ- P\{5~׀-E^m)hO(e VU4p<؋P: א({;l N% \ɖ uň:W+DaMSـ+Ӫ=ťUu@ I$ЃS7Ѓ$6%YmU[LWňE eIЀ mV<+2U \E\%6U'`\"uUR=AlU]]=ڑɠQxIޏے+o=Y0Q+ l5  J!(߃v%]߬kޟ>?&SVfh=T.dDE_NH!xg7dE$hQN ;lJH[+ڏʕ萘QW&|vыl4%N6O]+<Ɇ .gf:.c㖭c6 H Qq>Dֽ+d[d6=ϑ $Ui˱lg $ =Ю.wI,i@屓k,bN9O`>ƈ!r6jۂnj8&O U> 7^`͍l{MH_.v_CM>pmpkU m{T6@)#{%c  M,2Xľ00.>Y`&h-] j=Dls`@@УEY[7h=4 6E8k o)VMSdxEW\'O P=hj%gs/`+{`g>q?[/U(螸R H3f=%p9 08p0؀ BwJ;WDV @@E/= <' Qs-h%I?FS-uG7 Z7FL4o u> !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,i+HwCIOݔ3jȱǏ  'aHm~NʜIA8OҒH+ISH?p@ Hʴ@PAfk@ЯDwOW?ׯ{D)meb6=잿z1 5G(KbUg?lR^^.߽hLC(߻~\1v†?^mxAuY+}8U 4>œgϔ0R#,-Hw=I8s"HA <,2ApCN@.:u 2쟇>:A{c9%@x*La>A(T >ҳ4[>\7;`C< / x9, }>/v7`p@^R 䣇0z 0Ѓc G9Tx@!o>,ׁ_AP@F4|b6D}0! Bx@ A:@ #g!O Q*F@ xDhTcSGxra񈦊 ď@@H50oi3 2j# !C-@!X#`ap{-$ rˁn5y(8 P1Z27x _S ۸AN҅AydhA "m2~Dq2Zbpwxf1i`r#9*Q)G4 kvé@tDoE@BrcBBe AbPb +zKX9 @G V ćxj9;8|b]I!+ DQ,-+>5Rp@qNhl٬c=jU v ܪ i/+|@$(VZ⢤@D3i$$= JT-f xܝw72M݂mfQ3PfX`9LA d H÷yAQhf(> Sb|-!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,i,HA;8ȰÇ#JHQ`"3j|El<ɓFjD Jr͉ CGK?~ nѭ;v"TĚߺ\)#C6?F]<'+SnS60qn ~ݫV>99˕vm[ׂ?ׯ{D J{lfo1?{mV1b<\ujƏz=9ݻ-_vw>$߽l ~{=7q򁫊M@]G@ֱk.?y?0um7,'83,3Nv\rmD?@aMbeUww P?O9$.O?$1N&r|'.#' 0@C@w!_!nfP2 ?ӠH m3 C#EA;DlDf4 h@R>5ӎ^\RD:t@3?`ל]I9W!htє*P: :@CND7@ZdSPU=Ϭ:zжy; k, a!,jD71D'M$fA4 J?  iPBRlDPSA!h)寻`m:8X?0l0Aw@Ewb<.@9, |kPK Duj 0L%(8nGh6flRt@)N,&}2Τ@W/a 8-QV$⍋>VN>n,j.|*sI'?8,]Gh1V@?ԍS3ZQ9OQL|AT43su?ermC ! ЀynwB@!!("p  (I S!2 ^H8̡w@ H"HLD 0bT&0 14(9Dc V< ^ BG"0(H6b#i>:1act@G46EHɃL"f"%6tb!)<<± d@D5ш*#ـ sQ ¡  L'(@x zcXij 8΢Yf3Ei@H> Ld4#G2n&u,%A|sp+|ldGIE5,Y AA`Ain;ԩ PI|4#-@\RPQa@#(d;):6O)s#`CRP_ %)3>$aQjCUȀ/[U|<@"WxծjCQ PN/Ň*-qejTc}m\f2Ň*0K^Z ;0U Uh\i{I /DE[ЦP8Tw n-6;` nM-fx\[tq Qoii.} u͍,(wj Rtb.k^֌7+%,>pv N@) UҕWdh(D6*#) ,${AFa]X x{,9Kr'AhT\h^C ܶ /فv 0e\ʴi+6?LB44M8ئ R[e]ytQݓ`{>Qa>r_;=ݓ3pǽ\SL':kAׯsPb?uB>儵>E?PJtbw? 1`&y ^{4pӌ@$4@S@Mr!F򃤒3EaAj$H?9!ph3HA?І??@H8fzW,9<'P1L @&?,O5&ș L`Vd>r^I9䣓խp@"⨔@sh i@wT:P-ͽc-,ЌmS hّ 3WQ%]=3ʫ Ld?"z'AC D84ܰE3pCrP?tG[J2} A$xFɡX@kN5ݚ\JFA)-1P/,CF Q9@]|jPHQ[˪1KwЊ? 4N%}TAHjY`#=QN/%&O Q2H%m@\ '?8ϭ0*s8c0و@204pt4rAZT3Ų R NЊdS2Kt\>7(oKf76N!~8#)IA@;`p@' KJ?,KMlGX@ Mȟ?4pՄwXB2B,i+aFD; H5h@ (`#.!tc":P\ 'fEXE ZOТH2hL6pH:x̣G7J@ J@A AoR |r)!>&IP ` Ј|a5>f)R@ ;I><31$f0RpJL&0GِhdKf$%(MQ/ |TJD8P4,I3,:|p'Pqfu`|tb U+ $)АX*g@ e^!nv'xA40"_ije[I|C@1z c$q9$E#^Nr$ 7G e K\A&D /"Fx <zI3R9SHtMzhE/ Jp:|[dюf4pcpjŰv+ 0A*Kf|`Zњ.5>NݐHOd"Xbdғ 6>F, !:@$9hA6nq\J}NnV !AZ9%.'+K nsld7R3 sp>o6T鋁.=H`:GqrDe7W}8 Mj ݟ냝v䆶il=ֈ W8X;w= = CG&H@aO?qϋ `4ڈZ=`#+Y#U1x*tA1g(J+(Љ` ]=$@O7u2ZfXW =Xߘei'9JzIWN֌=cϧIfh6=O-~ܣ( !ŗO?K#4< Ѩ#5=K@( :cwϲpOY 13M;wl?).x{lצnRld>#p Dd3O( $. +#>0 Ӎ>ɬJpɫZ1w?,2̗dn>TM@15O?8;_jlƐT w,MP?@3`7r ` u  1 垛e(lMs K$@5A@'>hΝ|;2L ӲZQnS x8Aw66.0620tC$ȗ@ Dmwtd/=Ӫ)l!O SBRc@Ǎp7Cuj K)d6-5A@#d h  hGU s؞.ct$ Dl#Ds.+8Z\'dti z4v28c@ܒ~X -&NJV%`@ Dt B *?`\hHqoG#QJؒf0&`Cj|F;@XJXCqQ|G, c9eff W \& @胗yو-QpN8D7CpVHVFqr821 t.K;ӛȕ4SiCI/ 4ĝ?V40(ii͍e!G6`k!G4vS $8n rtacn1ELQ 1Q mP)0^  V djd #y-[ `N|-"6p-pYk +W0i pg!ɎoiGZғ4BOaaAҖqXO & nXx)rq,c k( DĥE@˾'aA M ~p cq&`'Db(,]++IH8m062(FT'hQ ,چcA8ӚX%2\#z0bU rhXQ R Y0,Pk?vPaIx6Wa{DuL<X4RDW`2|m1dع:ta  G,@v]7rHv=l"|3n9l|_gm<0 HmZC{Ͷ@`2-PY?zqSz҇%$t]BM`T^] Z@Z<2yh Dk?P%C0p]  KS ~wh ; F+At)y /@ qw h#Xq$ B:8~&Jlw= .@`!0VRHW؅^K}#vhdygnp&` qQw|8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx긎쨎؎X8hȎ؏yx bHLф433eVm6O#!y3$y)ՒV.9Gi7yo.Y>J3Dي8,@IP#VVSU !J4+ٕ2pa ce gnkyPmYy>ug_IlTiї~Hji^)9o 1i|Wɘ9)EXsyg}YQYɓɋٛIYǙٜ9Yyٖɉۙ%yMѝ}!s )fHyYqIɝ)2)M8zoH I>Y@ : `(]ɚisLI`?=iڡMafI-/ ;:uqaY&ʖ٣@ʢ q1$񡉵x٤NzJRɠ,ʥښiJzJA:^¡P )ۇ%{˧JwXڱc41J4J#[Z!j*V!{J3{[ 'v۰`%;ٲk;vɱyڳY+˵i*2K X˯گڶl{*Yi p |r8:t9kڸ{:{۹[[˸㩭kIuBk3k Dy۲$Z|A>(~tz -J/huJ۷ۙk뽵{[ԫ&;)ڵ맍ɔ {3 렒)K\k;ڦkM+|Ԫ+{5g맭:˷/Xy{,]!\pq\^;zʲ» ,̮7 <}`{百{®R*)$|wJš)QÊˠ|;+dkd< $yDŽ[y ;HņȊȌȎȐɒ<ɔ\ɇ()ƃxɜɈÊɛ{+z͊1D]F}HJL8QEÒ\ :Ջlʬ%\^E/]- L׏;?cm#M[z- ļlf=)lѓm}Κ ۭu `=p o[:~;] ٸ GgҊ֏mG6ڵ-m d ̿{zͲ;ޕ걙3Qzk-T**> >m>nfI!N@ ョ'>i n 1n&>>[|3#LNa:x]HZ^B§s[L >4qln'{]|~>^~芾>^~阞难>^~ꨞꪾt[hNNv]] 늭=,nkΒ~>^~؞ھ>^~>^'VXʈﹸ`Kͮ?<;;i8=/*vo~ ѷhj.ݮ)on>{˯)g|j.ٔ)A9)j]o Ƶl]:_=ɞNG/LIl; /+TOً{c>Czy<*%>=l@lĢy3tO-mݦTsji ~@ " + strings.Join(s, " ")) } } fmt.Fprint(w, fn(str)) } type model struct { list list.Model choice string quitting bool } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.WindowSizeMsg: m.list.SetWidth(msg.Width) return m, nil case tea.KeyMsg: switch keypress := msg.String(); keypress { case "q", "ctrl+c": m.quitting = true return m, tea.Quit case "enter": i, ok := m.list.SelectedItem().(item) if ok { m.choice = string(i) } return m, tea.Quit } } var cmd tea.Cmd m.list, cmd = m.list.Update(msg) return m, cmd } func (m model) View() string { if m.choice != "" { return quitTextStyle.Render(fmt.Sprintf("%s? Sounds good to me.", m.choice)) } if m.quitting { return quitTextStyle.Render("Not hungry? That’s cool.") } return "\n" + m.list.View() } func main() { items := []list.Item{ item("Ramen"), item("Tomato Soup"), item("Hamburgers"), item("Cheeseburgers"), item("Currywurst"), item("Okonomiyaki"), item("Pasta"), item("Fillet Mignon"), item("Caviar"), item("Just Wine"), } const defaultWidth = 20 l := list.New(items, itemDelegate{}, defaultWidth, listHeight) l.Title = "What do you want for dinner?" l.SetShowStatusBar(false) l.SetFilteringEnabled(false) l.Styles.Title = titleStyle l.Styles.PaginationStyle = paginationStyle l.Styles.HelpStyle = helpStyle m := model{list: l} if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/mouse/000077500000000000000000000000001465647402200165055ustar00rootroot00000000000000bubbletea-0.27.0/examples/mouse/main.go000066400000000000000000000014761465647402200177700ustar00rootroot00000000000000package main // A simple program that opens the alternate screen buffer and displays mouse // coordinates and events. import ( "log" tea "github.com/charmbracelet/bubbletea" ) func main() { p := tea.NewProgram(model{}, tea.WithMouseAllMotion()) if _, err := p.Run(); err != nil { log.Fatal(err) } } type model struct { mouseEvent tea.MouseEvent } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: if s := msg.String(); s == "ctrl+c" || s == "q" || s == "esc" { return m, tea.Quit } case tea.MouseMsg: return m, tea.Printf("(X: %d, Y: %d) %s", msg.X, msg.Y, tea.MouseEvent(msg)) } return m, nil } func (m model) View() string { s := "Do mouse stuff. When you're done press q to quit.\n" return s } bubbletea-0.27.0/examples/package-manager/000077500000000000000000000000001465647402200203605ustar00rootroot00000000000000bubbletea-0.27.0/examples/package-manager/README.md000066400000000000000000000001031465647402200216310ustar00rootroot00000000000000# Package Manager bubbletea-0.27.0/examples/package-manager/main.go000066400000000000000000000066261465647402200216450ustar00rootroot00000000000000package main import ( "fmt" "math/rand" "os" "strings" "time" "github.com/charmbracelet/bubbles/progress" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type model struct { packages []string index int width int height int spinner spinner.Model progress progress.Model done bool } var ( currentPkgNameStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("211")) doneStyle = lipgloss.NewStyle().Margin(1, 2) checkMark = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).SetString("✓") ) func newModel() model { p := progress.New( progress.WithDefaultGradient(), progress.WithWidth(40), progress.WithoutPercentage(), ) s := spinner.New() s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63")) return model{ packages: getPackages(), spinner: s, progress: p, } } func (m model) Init() tea.Cmd { return tea.Batch(downloadAndInstall(m.packages[m.index]), m.spinner.Tick) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.WindowSizeMsg: m.width, m.height = msg.Width, msg.Height case tea.KeyMsg: switch msg.String() { case "ctrl+c", "esc", "q": return m, tea.Quit } case installedPkgMsg: pkg := m.packages[m.index] if m.index >= len(m.packages)-1 { // Everything's been installed. We're done! m.done = true return m, tea.Sequence( tea.Printf("%s %s", checkMark, pkg), // print the last success message tea.Quit, // exit the program ) } // Update progress bar m.index++ progressCmd := m.progress.SetPercent(float64(m.index) / float64(len(m.packages))) return m, tea.Batch( progressCmd, tea.Printf("%s %s", checkMark, pkg), // print success message above our program downloadAndInstall(m.packages[m.index]), // download the next package ) case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd case progress.FrameMsg: newModel, cmd := m.progress.Update(msg) if newModel, ok := newModel.(progress.Model); ok { m.progress = newModel } return m, cmd } return m, nil } func (m model) View() string { n := len(m.packages) w := lipgloss.Width(fmt.Sprintf("%d", n)) if m.done { return doneStyle.Render(fmt.Sprintf("Done! Installed %d packages.\n", n)) } pkgCount := fmt.Sprintf(" %*d/%*d", w, m.index, w, n) spin := m.spinner.View() + " " prog := m.progress.View() cellsAvail := max(0, m.width-lipgloss.Width(spin+prog+pkgCount)) pkgName := currentPkgNameStyle.Render(m.packages[m.index]) info := lipgloss.NewStyle().MaxWidth(cellsAvail).Render("Installing " + pkgName) cellsRemaining := max(0, m.width-lipgloss.Width(spin+info+prog+pkgCount)) gap := strings.Repeat(" ", cellsRemaining) return spin + info + gap + prog + pkgCount } type installedPkgMsg string func downloadAndInstall(pkg string) tea.Cmd { // This is where you'd do i/o stuff to download and install packages. In // our case we're just pausing for a moment to simulate the process. d := time.Millisecond * time.Duration(rand.Intn(500)) //nolint:gosec return tea.Tick(d, func(t time.Time) tea.Msg { return installedPkgMsg(pkg) }) } func max(a, b int) int { if a > b { return a } return b } func main() { if _, err := tea.NewProgram(newModel()).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/package-manager/package-manager.gif000066400000000000000000015457261465647402200240760ustar00rootroot00000000000000GIF89aXӄׇjlia[^ V W }R U uM lH oJS9C0!*2 !!!!""""">$#@$$$% &&&'''((()")(R***,*X,,,-!%-----a...0#'00011122231n4445%*66687~8889'-999:::;:<<<===>)0>>>AAABBBCCCD,5DBDDDEEEH/7HHHI/7IGIIIJJJKKKKKLHMMMNNNO2;OOOQQQQQSOSSSTPTTTVVVW6AWSXXYVYYY\\\\\]9E^^^__`V```aaacccdddeWeeefMjjjkkklllmmmnnnoXpAQqqqrBRssstYvvvyYyyy{FX|||}Y}}}I[YもL_K_[㇇[㊊Od\㏏\呑Si]斖^晙Vn^瞞_Yq_褤[s`觧a魭aꮮ_za겲c뵵cc츸ed콽ehefjgmghoirtwz|! NETSCAPE2.0!,Xӄׇjlia[^ V W }R U uM lH oJS9C0!*2 !!!!""""">$#@$$$% &&&'''((()")(R***,*X,,,-!%-----a...0#'00011122231n4445%*66687~8889'-999:::;:<<<===>)0>>>AAABBBCCCD,5DBDDDEEEH/7HHHI/7IGIIIJJJKKKKKLHMMMNNNO2;OOOQQQQQSOSSSTPTTTVVVW6AWSXXYVYYY\\\\\]9E^^^__`V```aaacccdddeWeeefMjjjkkklllmmmnnnoXpAQqqqrBRssstYvvvyYyyy{FX|||}Y}}}I[YもL_K_[㇇[㊊Od\㏏\呑Si]斖^晙Vn^瞞_Yq_褤[s`觧a魭aꮮ_za겲c뵵cc츸ed콽ehefjgmghoirtwz|)H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y(~WF"4ojWg`Hkpu(`p1TKOqHGsDdQ\DLDlơ2 Ϳuq#M\4WC ҳ%p S=4X-QXsdvoYu=وmpoGnWmp|^'7nGWgw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HNd8!,W!,zP )H࿃&,p‡6Q"C-ĨPA= 6FFgQ\=M*IJR %7ʆ)S&CJ}4Z0]=FKsSoވ*kO2S╩@Q]:]=AkҩoC\Ճ5->2mUĕ,)`Wᯀ깳X z(-Jf+ ZdiC !,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.ad(ƕ6[,^z՞8\zD%I EPReNAB) (Y9n7 4ZY"jFe6֨>FaWlTHq1puرY)acd|P?CP%MDKUDI?XəI!,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,řW^:6I D³޼:9)$rnP t=W ~a 2 Giϳ-g9OZ\org)HKO\Z(8)IZx; gHuIW`KPY!iSR6l۵5}2 !,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,hG3)86^=z68Ox|JRzP ȧM)DW=gXAR0ӇŘH|ޔ3O1YqvfOGQKaigYozX 8P6>a*` 0UBj2ǘ)Q&}4ܓ!,W!,W!,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀd?okyL$mΔR'N> b1#k&I4*0^7sNuʫZVlLTzbXW.Ǡp:*\ND-tz*01^/MkRjg~;ͤC !,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,řW^:6I D³޼:9)$rnP t=W ~a 2 Giϳ-g9OZ\org)HKO\Z(8)IZx; gHuIW`KPY!iSR6l۵5}2 !,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a$ę.W$Mz$)zxl(H QxJkAE4M[t:HaXaf鬞j%ږUAVrcW`+Qu8"ڕOxRA4c1 u4i=qRP*sZe~JPF ݊Lz \B!7$mz:Hȷ<q 4\c̔.!,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,HCřVW޻YL' %)O*䣒)xUYU9{ ا޹)ɶ-<F4`p)R`sŘD1y+REKčI TkMRStɒb#NM쿷% !,W!,W!,W!,P s)H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.aLL7=IC@+OBԙSRM->UTU'fuc׏$eI2 !,W!,W!,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.aA@,|Ѽz:HWJITQyZT+0VJ*RF(GTvy@$ dv-ǤƝ[7&ʥ@W_x/ᾌ.l#^Ɋ+SLHq˥bʘgTja!,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,řW^:6I D³޼:9)$rnP t=W ~a 2 Giϳ-g9OZ\org)HKO\Z(8)IZx; gHuIW`KPY!iSR6l۵5}2 !,W!,P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.ad#ƕ9!]z8\޼h4 C%I E RNABzɲrZAQH zRlKmܖD+bԽwcC/IiwLL=Vrg !,W!,W!,W!,"P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,řW^:6I D³޼:9)$rnP t=W ~a 2 Giϳ-g9OZ\org)HKO\Z(8)IZx; gHuIW`KPY!iSR6l۵5}2 !,W!,0P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a$ę.W$Mz$)zxl(H QxJkAE4M[t:HaXaf鬞j%ږUAVrcW`+Qu8"ڕOxRA4c1 u4i=qRP*sZe~JPF ݊Lz \B!7$mz:Hȷ<q 4\c̔.!,W!,>P )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.a,HCřVW޻YL' %)O*䣒)xUYU9{ ا޹)ɶ-<F4`p)R`sŘD1y+REKčI TkMRStɒb#NM쿷% !,W!,LP )H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GLI?.aH-W.s' $$ѫP$(zaE*GBY])*cm"Y UkU[SUݴyuW],Μ1 t=L9[%_ɀ!,W!,PP@H*\ȰÇ#JHņ2jܸǏ CIE(5\ɲ˗0+L͛8sFRϟ@QѣH$QӧPc2Uի'RʵWZ~Kjزh"=[lʝ2.ݻxN˷N~  xv+ƛx㷍KFye/k6[xg?>z韥Oz뗭_6{퐵o붘{{ ȑ_1̣W|\ԝ_0{rziW<ͫGo\zͳI` Hp[ `=lNZamh~Y"nFbd*X..cH`!,W!,W!,W!,Pp %)H*\ȰÇ#JHŋ3jȱcÀ!,W!,QpH*\ȰÇ#JHŋ3jf`Gt IңH MLrɖ(_tYʘ5qd)sNh ZpCԣ B,4 ІH$8:8eU \NjqЭ֣kBt)ʀ$p@X-l VkrN=|CTp*A:0(reT}L0HEc oF~d `?h!Ec`&ЂHȏH$`> ~c t2{H *XFA l|cDGXo >n+|G0H!IJÒ}˥.w˅TK9H4ꁎ=QcCi`=r@ /P,Q桻Mb=QMz\͝@CqmC~v 'pEN 3#r6űyLV,~ɢlD삐|e$e"Q9BʁŒY+k@2YGDue;Q1s) !ЇTƂ-;GO!ⱐmeB Ά3 ckYz֯5h]k\ ׷u \׺| L``]B5-d[ H1AlB9y ЂKtb9h#ij"=BIH)Dr@*iMo:] lJEפցMx0xkZVbXS? q BAQ\4]zA[j8BG

d q@L aP ؅_W18',ł"HWP$~@bF[ K <$9v B~"G).b0E( p tEpHG-FZ6 ~  py#Aq<葏~>"9p6 <,̇;v<2 c+Z@ d"Uқyq0Ibh# ADt7F,yu|-#IfҐ|,!1zDfb[(vSx\=j%`l` d7)/F1\h:j8d=:ĕ:Ta$4hBAC ,xK5i$67$HF5("<ԅcŖQREPld'@ ҁsT8|"Kd&>x&{ W#%Ѯz`DD:P[$qCT#YZժ'e#JԧpEpRaHuʨ.V[r ;ċ}`lt 'lNDR R!vΰ-JƊlc(C>Aa^lI%LBq%8 6qL pAQ`K@CSҋ`DBXB\ұe@BÅ)qA!VЭ77Dݠ;A# ~GꁎN@;XQd jǩ967BCj1 .na -z$7@̲!@@j%*1#B\єRcDf98h =AxTÈNm['0J$BAd5@.Kk*Qz$hzT-9K1sXyo@!Sqm@JPMw2ƀI>E&V`$+.ҨMrۖ-Bt0TaٯCmI (Jr+ rARЅ,;%%*! .! =57pGN7Wq8.gN׭8Ϲw@ЇNHOҗ;PԧN[XϺַ{`N12!jg;Nw$U/RΑ7$IP`8)|wHw"U=*س/N)_'E9!O$1!dIPgO@>$!2EaHwBm6j6D(R^/,лvC_$NhE^&7I=2#W{E!Dt8A%"W[&*B*UR#$HjW%8@BqW~#>€7+~i0^,CP*A{'"p!)r'y2&'BD&K/(1bz90p0S*.Rkk!)2*FH/|%€S  (CaSƂpLq.v*I/3)"*h@2ppQmq.*Cd<6>7A G0!1yto!PZh00pq _8!.S\@h( $#3 \c_45Or$4K4C%424B8rQ7%Ux vR"}p vQxv ŋ`>U( O=C=>1X%#$83>w嘅g=>Bj`qb ӗ9+)6"$]0AYԐ &$4EI(I/%Ҩ6)5+3@囹/iypT )IO!RS7a\SwEUXS5}(u%nWzU|WY #kE !\@(ⰟX<5XX X DZ kIag8ZG\\q]]E(@CUsAOKjPbQ@Y4J5y ve2"%%U2'>ii{`;sTS`xbvchb(vd+dafBbmc@BFd/&'TD`peZ:eF1?FepcdS&qfd~Frpq&$9rgH`Z`7HFFilhA%jii+ԁ`HC>3)(YĔjYl:2ijvGw]}+FT,NtiD' %RAS S,0PP_% Cg^E#J{QTGZq%H^]Cז'Sk5< J":k+\k!sUpTA55aTl@ @ m!nYU?Z Y9O*OCA1Y"c80eJ^2UW`*bZ\%ɥE`cϼ]d]^ZmSޞFO0eNEje:.*Apa ,*#rI*-@Ov2 ɻ(&H&*Z1F&c}RDv! =2 CevfDfR cFd0dkjҭ4jmVzbP uB ?}׮~j$O' T6vjq #kFj:@jd0kpGĆBƦ_F2lQ/  ; *0AtNiAop<[J+%nwp{gpˏQby`?_!@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^ŚUV]~$eԊ@%kVZmݾ.'XuP^aMŰ xX/ߨ>YdDŬE! Bc S<̹Ҥ%[l$ O7DF}pōrz4'0ЇϡGhѧ_NfD4\bIGX|ǟ_y)G4ӈ@+нpAe/3,w:0!l0z&-F$DOL?-,=EN0tQ 1"Ҡp; !z&@zD1L1$-Tdy[s x'axVp:@,y$Hyh5'E EG4K5M)yNs+wzM Ht!8,L(<:ҁ>0D6YeeLX i"<l4ȇ lBv2bwW2i1sFq]RHgqQFY?r9VȌ%sˏE9eWiV 0+[zȒz`z & 3bt-Hz@6`#sf\K*e( Xf/G 7Ťxf>gzr0V;gqIr?w1o;!} -\5zX5dY *RlMRd Ჹ[w=u!9>[`I/kz n ֟8lzh) \'F;y8(ꁍ /10!UM1)4 gaτ'Da" {RArxa#1 < xH3zB8@Z,( \F`D+BB6э#Z!Ƨ4vr(tMG-Zx0px% C +(JbD.1h<@K҃jԕkPFVҕ\0k HCZG8͉1 IMtp   wc 9A X:eU7M5@|e<9ORb4Ic=D63`/\ 89c2M\&;Do 3@=dуl7T҆Cg?E ʑVhgNuSa=< 1XL7ց[E m{ vJo?C 9'2 !P ̤c*<zk$Ԣ[y:Xv'8GbŽĚcAbp/vu@ D ,y!LA61-C&4;<,%0^ADPD5\{EVd@8$BYd1!ja@JHd\y `JB0)A8D9z)yŒF9yHzx8~jyFƽٙ`ǁq qlGZʕr|sdwٙx!~IH D6 /2 [?It& 8Hg/h$ȅȄzBf$HǾG6l $lBƗ q ȘD9QȨIʎl,Js8JHlɑŅp?Xi䣁JjG~sAP*ňKcD:ӋwЃ #؅l!8);pʨ$2z()YƤǬȜ˱)IuF*"O0MDً$ Fg$lĽ<,M$pLȃN4,ЙI\(KpO|N$^ L N!ND#:TLO7Nh i^\OLZh\-]4 l8)v =gz%KZ޷"_z0 _=^bQJޕ**xZh:0M fw[pԉ\i`8$nIO u_eaWI, À_pBB 6`ð]%zb"~_aNơ;!b^e_T*>vbbaZL1^\0_Z8ƌhUc+fc x5a,#~ >KދL`HRwXaM^܁(zڈ\% yOIX@ NZ:26ebXP#5SkQBcB[HPefej.z0;e^僘҂xe=@`簫_(QŁNn߆z谅K`3f*h!@i;Xjp@wVƎzΖz(i8NMZ&.X <@e_h.d@ $i`(*jxjbɡi]V0z@PKB+KjFӢ66؃x&(L<~ួ=傘kxk(ǎjEkkc-V~cInR =H5Dx턧9:߁`mvpmhL0w ͦ xx6\Ё,p<ؙOt3^UbT-3nn^xQPn*@o^^&6Rn'ntpGnPnW~ѾMOo pp?%wpoo|ovbp/p_h`@2؋aP88zPrh'@re q83z)-: Qri1 23$Z(9z_D^-b45W2;23GO>שtwa4OZt61/sB_:KtvM!qtH=*Qs=&㭥ҺK M'-,wq|Q'S?0MzOgmZæĶ0&Eg,F>cV'artGѨf3wbs]pt5DOot{tw@='P.:o,v?q_,uͫj m 5iTR"ڤK0,3zȅed Y2yR y)ɥa5e.Pחj lr zȿ"HzdJ5/0z8nK/y6{Vaw{czx gg1~yc#?ˁz|GP||/ߋ'.ֿg'ʇ% {hDG'H.H0_K"(bO+X <1'gT~槑1TP8,',h0*! 2l!Ĉ M EH]hҤH'W|1;`FH| 1̖:w'РB-j(ҤJ2m)ԨRRj*֬Zr+ذbǒ-k,ڴjײm-ܸrҭk.޼z/.l0Ċ3n1Ȓ'Sl2̚7s3ТG.m4ԪWn5زgӮm6ܺw7‡/n8ʗ3o!eԊyO+1ʨv·(Ӂ $ O͇yIO&SO7)F(yy yؓ/ԥ39&-وc:#T{S9zt1S1̣Dyt@E5`Њ-ӣeJ:iBDg) qf>TR2 I4DSZ Owb;S,@O=䢣QnJ)*R<@[O^hn:l < ̜EC3&"VӁ41c9#K OrP Y 00A>;@KłSB<4F#@:,r5L+S;oP,ACC6#OpjG-\r^)@ZBzH-.!s"+3,ҡ` tgœt;T,"ClpQe%h!st^5zrU JmM f{! cCZy1xBA .!dmxAQdF@A* `*@Tc8|(I耏ՌW\<ZH:m!)IݠԴpx;̢p#Z/jJIRR5y!) iZh`yeS>  lHQ!$S#?n^NlB@% J W1rʭ(|g> V;]#u3gabAp$R_R%)PH=!yHUJ Vۡ^I[G>6ZRAK"rhٷ$Y͠΋Ɩ.gBüܘ]5b0(0Q%4J@dl$#ͳNe wA '%ۡg?Il@)`DP(CPJT4-/Kl4gXNC~48Ɛ45hw@εi|K IEA@ąJ)S*=]ȓҐ S(~ֱg%H+ fkEqѺ.‚oTggZHXK8O,5^݆D=7H.ukThI+{ȁA] HSvMEiAl[[C9 "Q ՖHgA(l=+5΃_F {aBW>е -Xg +)E8G: .5D RA;8ࣁ B <W5Iطf-1j {)#ʅp0Xx)=f !pd*^}($[pK )ĴAa^hiy29K~z$M]:.Ȫ!Vhd#^T JPbi+ u[o 8+nsfp `D[it#t[幦}ڀk+q%!h=xZ["+ۓ'm޷ם8UU_G]TF[ANqxƛ3(hN1KޮAsh`n%AĎ=9 4f2i9e!&XM{l# %p6;H$%%Q s6%A0lK$|HÐ:;Z#{?=Sճ=c/Ӿ=s=/?>3>/Sֿ>s?1ItÕw?g 1 j({>?~OI,ȗ|8pN3 =h"DH;y\Kė_m _MLO0$GD N|\IT ,YR!nݫh-xm{)| ׂ-QPPnH=|G@ݶFaԃnF-ӺnX@n{`:neւz(6nFQEĬ@ DXnDX (}L/HCazanD~ J.Z!.hgfސo/0 -*oVf.JD)Cq̓}%P;@&~LȌ ă|(<ȔKQ@& 'NĠh-AÜh4|yЊ7(z'b,r,b\6n-Ν B0z*BZU!CAq'ƊcRw//CdyLvY0VK+D;8ΝvǴ @'xR3ΉDYnLVM8q\] G5^c w"#wN[kgG1%rk#ޅ2*r&s /r).R,!D4MP-Ч m-_r'%pByݍw="h-DP\W~hk=Mw %' >3f+^ =M.ײtAG=q:QՃ֝āMlGI1DAy 5g-j3pkC^Q}gOPPNs'JSW^t?㯢0OR'4m{NoNr[tyԭ w`7 @1JV54xzдA`bnRCHVW* cـOc5nn-%S:lUOi>נSkS+V{"DO)CF5jom/m[j[Y϶iu/eEWkw2P­Q&`WsTMAӕL$b=5S>A8vpbS -vh3hPSePm{WqKT2?T-OARl&6X 51#+Wgvϔg*.w9p4I\q+Dw``C`{# {w=0NUXPwGUv~h|rínf'ZoU77B=Oxk8um(I9 7k/( AnKIdoGtQEDAPa78Lv~|y8]-s;l_HtU{)ʄ)<\B D796.r'2?-rGy7r>2>q_~p,wbȜ!2xD1Jشrܧʭ0S>6 aA(ɨA8KyATݠYصweߠ*w*@P( E!!6,aC%fLx1Ed8cHE~Lّʕ_t(sȚ'cls'L%5)&С%mƠH|zqjԞLfպkW_;lYgѦUջKN;Pbm!gyJU0YsIs8mb 6|?s,-ϖC74N7=4׷qֽwo߿yGI%ysϡG>zuױg׾{ ͋6k\z:tW}{Ǘ?~}%f P ,LPAL@8xXP ) 1P 9A QI,QLQYlaQiqQy R!,#LR%l'R)+R-/DrP"LS5٤OX49kXDيXV<1 Ak @ζ6mߨǝE"<-M" +X̫ɔoɈ(BƉUYp+Nf :}_0IgyzeRѰQ`C(Ky45/^un6f5/ w%pg+nmw,iva V`_6i'X&2xK扤%d*$Raܼ)+:Sg!a ]xXH[҇G a[lO | Bv坄% ȑ5@}'yG}\s[̩'sc3O!*JtX@<2b JBQ+ 0BpH[A!ĉWyC( @`C ?x$98Fgz!|@3R)ayz<&aN=@Ǯ <:N]b(ـwGz!F0 q|PH1V($~`C`BFG @0O N@a&C?zCdIg`<0EUES$J`]CÚmH^ RImhoP Cj 40Pi "fɐ`@SV1f h0JT6ùJI1ʥ T@HVTXOXED&QlPd/#"AnsȌ_4FF9ެG4 "-MJ1GMx?|+$2\N:,HB{E8)SD 0 PlPcC$JQcN!EFM2H0Hi֣ѦU>360԰РO9͈Ө5ZXA&XjS0 vՈOǜI2 )EMiy!c8G=@T<ـ;1 [E!.&Ag%a)Q guF=4 iDNoΗ*6+6t]0 f2IJk#ҾnAI!$2+ #` "`}H't\JVR? + YQR0@ L@;ZT>i4Ht|)$2@“ss$Nw̔Z06VC"9lv4wtеKy1zO # 'GϷ SDq@Phb8-X@@mQ'/t̵Ġ.T#`z\b"i葋? iU69-d!. 9h "zCuOhR5Fm-o 1~#Z -H[ @,PeU .}^BF&-wasϜ5qs=ρtE7ёt/MwӡuOUձuo]Ze7z׈f:Λn) >1Y>k+\ oO^o?Kwݬ3[jNy=L T<dL>?zF~_`_J^s~m/~Ͽ%ydžljoJOo[%)pzo,N#CԴ/**PQp#LmBL1mo( ˓p IsPvoЯ P0t5\3jc 0p0p1q  1q!1%q)-F5.#N&F"@1OF, .+=ބ6aV! ᝤƁ)j1WAtK͢L [2ES #?q("bA,tqC!#PEUXe=e%`:ʡP#q\2|cLBYŘ2}Hq " C̣b[e˶cɱ ! 5 l> , /yQ,&@J@ %``;!Iqe:),y1+Lj$q+n _yLgJPb+`~. hBx&#R+l r+)R,B( #fmmRF@8 P "63@3, i6e rRS2#V f!)4A-B A 8sV GrpG($%!lb73#. 4a&!8S"@P/|0#8ApBxx#y0! YL QmCÑJC ET{{47A !R??!"<6a-fg~+e?^&MG 6!<= wxjTK!*ͣ< ~Tτ!rH?)AnAt#n(NjEʃ6ZI4.eȶ"5OTQMk,IL3BƆz!t4G[R"rRxܐtJP` 2iL+*PAk ↤ ^i`LF(ȧ*GYAZ@X CYWU_5V A檯S( ǍA):AR,U+0U"0`kBaaSBd& T3G`?!v4EBZB}<l2B5KB w\W>]t$xyVy"Iح` :׼(|b|k|m8,4V#jʬpTUWR7C8 ~MBǢЕvE#䊮*,E" Ϫ k#5cS[K q`*7؉Uى!LxR+!mB2{`ER I=I3u%BdS9UkQr p+^0K+lvsމO Px+"!YP)!!<,+["+ 9 /)->׽{z(`eڅՓłRၐ ½B\EM MĖ (!˿z !!6y P00ɴL:!C  F<[(sa:!` 0X" p_+ C Fey{E⁚4^`9,T8!hDA nA"~ Bwar,4 ^K\7(:+4̶Vqxq T:uJ[Qv8D, ̃TYZR@BeDN6! ѡc{7t C;ÕY'&J BF1`$&"8*|'[ 'ěxmq< ֡P,8]4!8< #) j׊F umZ1(;H G ^ᚃ'n{H? ">ʾT4 x.7"q\)^x,PrҦ;' 'R"xx͛OmAh B,e X<ҭ!튞H? ~-[< Uɡ~ >~!>%B+5(> -}eP[cU QrAE~H}pUco7( Q =^VPLa|~K>,X1hp`  s>% ^t~9ǐ ӎ~> q='0|03ypbŰ~>8_]OwHK0 Z$^5 ~Q??~m~gө_UnОp_ 5O; i G#/_:B <0 daÈ )$pbč;z2ȑ$K<2ʕ,[| 3̙4kڼ3gA%1bhq'D?JD8"O(ҥ#NMz5(Er 6رd˚=6ڵlۺTcRD>.]zڭWn`&lV}:~ 9ɔ+[yԼ;{q㮟ߪX~M̸̴k۾;ݼ{l]v(jS4t̛;=ԫ[=ܻ{>˛?>ۻ?ۿ?`H`? . >jNHa^ana~b"Hb&NHT; "+jc1b1"8x^>.aHdFdJ.dNJ(d?e:=eZne^~Y"9#R6)&g.fȕ7Vivމgz'jt:g Sh.jcYfih::^J~ jdki Dj k^9x NR&k.V c)ܱ*Q׺-i)q[g枋n"V.ZۓG֔oF1Ij~e Z/ {i okP"n_|q{ߪƭUG\Iz/Fpg5Gr &cs:+ʫ=cJtH4 [kG+ 4o*ԑlL5JtL7LvfɞO-&e4!BEQzSvVoerZ 53 Nʹ~;ْONyya/6g*-a[}?XFӲ!mLؾls̪get?nxg[)iEa lg}\{]9/W/;u̼I} p(ʜ,5P^چ0ߵ&_HN5MtQ68.v dv+{l70x_ܐ[< ՇCg B A1͌% 8M224Nx '1K#.7B[Ol3ͥ@.pҬ&,ڰmԦAV.QfNcϐOb#IiTg%cB]N$ܡ Ѐ&=/ogy +ɉ[јlEiN`J47J.$FZmKEIqs1)f`pl~SW<(\PF;?QGeEoyZj5k|W'!RIù `"$As$vxWwrP~Rݧ08 UAH*v]53 mcSi zPnonuK#[w;~+pAy%l5>r1Ǽ-NSQ-/jz#Rj,xOv>Vv39ĐYq]YX,Z4!t,e#2xU$C/|!Fް' zͳph)L xŦD1J%bիXjʵw9jQ+(QE%Ǣ&B`CIJ؃E:I0|@GգM˘3k̙>Ua!DӆZtjja$T/\֨ ~=``'`b,ɱ$ ۪سk.`_\smw@A{!>'2\tNPPTpg&G޽7xC @6PA{>Ѡy B@hxTT@Te_D= Ya呓;ihG0AʂH&䒚 bCKBH3]=2BTKH)%&O[E)ewC10 ,A9O`@h(&3 b,!MXRq2_VKȟGbNA j'9WykNUѽ3; _92P PA,#Т)S#6繧9FI= D =4E|;ON[1 \I#-g.R@%*Fd !#AS2lFcAt"g1.FUnR@ɕ3%,#P`e}}tp3pDvx=y\#; T.cP־i @pBP.7@PK /s*j]ϵ MA-pg-dDA^[b .'Y߽}!s`iH5P4j@^ +TUc˕WNŀnTSWmקNqy{H1)}((Ԕw+T,%P70;|I+0@h_QlgQY=>B^k2/j]4筬ouf n,I!Lz7$h\ǚWfĄ* W=IB7 @ 4A"u $tAul,!%DOqdĠN`b@yE0ј V=1Bv +HT!Qt9g5RP۞@Z!EDL\ԅXg:r(sE1,YB] L:A?uou,HǞĢ6tW 8 xG2)@vP7$b>G3V:x>AɆ=(g򍒚t`@ipґB;H)rukfW)yͪ`V*ė <†qA;ytXiyX"'bQQ πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMj[M+FRKjC LS"2X%N`Eī) hf4D`V;[%6!APoJE0.vU Q8baa,?]2#8cKopo7|͹!R$xdboX.V 7dž$x=m[+W]%r?9U􁊱 X+rB <u FQգ&G&H8T;6  ˭:AD4fR9tYdT<{=9 jHҸDbn4vCVMSTZ$ 1# _<`>'J6Cד =aR Հ)s juϦHS D9}xz^ -ob~KTCڼU0 9ޟ<U@o:H-#{.e0,9qe=Ls*"Mu1|?td<B"  ׂݒZH21~ : J~a#=A`6Q$)#.oZFdSPr8T6F:kF#QS`5xp0n*29qfF7zW\p`.؂S}5(F0km rA;}HȄ%/Vo ^Xh6Fq(9S'5n69vxwxH64P1{*-(=C%cp/faSc}Q: ${?ts2?h;MCWr@0@$騎Q '|9!#=!=7&WBH+0., `}#pq@>HwE!P O5nAY0x&{=B4F6HuGD2PT;?>iENCMDVCC)_uQa6Cac#n=t1 )s'Y"}w] ĔW9yxd s6Pi'_4 M8c49`AoHG`cHa HI|Ֆ~3v#Q\x5 7&WKKVXՁ.QfEՔ:I ,yMG9Q>R1̤V*W5tPGR7OpC@qOa2P;\ݩQ!5ʡOq9硢Ѣ6"ra@Y @ cCjPqڛ*1SPUw1ET9& P&W1?AŌ@yR ڕkUWئCuCH,6F*oFwLr*@j9r!U=QU 3 7Q5UUuUu) W㢘Alq| 4bhjrrs5s!a,wIEӥX%:úY5#Z]xXr~[9![9gBZU:%e\E]\~x%&^C^Q: se[[& հ% &G'5l -3s&F)"kTPb@&);!@E2: f TDb:cM7Vs)ﰑ~Rhpp !mn&gd@p"e`fo Px6O"{۷01s1Qby`J;[{۹;[{ۺ;[SlNEIa&0GnrÖ+˛MKhВmadkaW0;21 :۾`s.rqQk "V]Q4qA"v AgVs+{%8 "G2(!\5+q2QL # S S$|=M'uD{6H˴4pD<P@4.N@a1335s3UѲ28CB[B5+/)Q$+wtFg0 ui66|`LǗpSH֬,r$GW:P5@[!"?+Cƌ:82MW}>5$ѽ+%  2Y&HQxS!E&(94Dp``+CP8 U=\BNAI4r[F;!@_G6 W. 8E9%k@BGuR:AQTDٜҍ6Zc?.BD K-H@`*PYW$`w3۽ō4-d11;FQ1e] JnG=Qվ81tiEK04_,t $u-߃߲\](]F ]MHOFT7=R6n? .`J^ _^a\*ׁC8fp!CQ IQ-U\@PF5Tf-#00ژbB06$ &uRR/cgݾcDu^,,z3+y='A \EewZ]T%SUW.J c>`X90R)CVߍ"*.,8S]^X%YlUG9[3QZ Z; ' \ }tU-9\)#K¦]U5% Aqqn)W6QD`]E4R! %M,IAJ Yd @BCeN2LRJL|ȡC9QQ4֨6qrU0kıQˢ|PicfӦ$q}R_ hr%̕&Z;s:|Pꅓ92͋ zMzUUDZv\E? 17'N.ϞDML2{6MINm:(Q\; -3r֮,^էǕpI JX*J⦞IЀ0Bt0B g.!t@h " !!( %N4ÇRqoHOjo Q\2/"%:ǂ*BѠ|hJ MMr"3K% 2PJZ$ tę'QMt!WƮzޙ!a4%>T cO6(ȫqqhi R AvF-s!!xT= L3TGXyn͕][xYo5)YFDhI+56dSn W\r RZX.y|%(kq@ Eq oނ͔QGZZ]eՒdiz0 򔿻F-SSgUkM s5=hzǕފ6djU.ṗ-SNLu`U"1aǠcQ$l0i()(١!y'oЎGx2[!u.聁 · 5Ea֊qYȐ`z坁 !n&yQrwZp [}ZTlLEh ! b=I-Hs@HA`}TAXF>r z|d tȐ2&wIAiLNzL˄!؜6og e4e(P!%݇Gw3'v`HBB4Q-BI(:2ȡ#n.+E="IWkz! (F.&5&z$ F`#QZ3,"!8dS[Rn i$Oz/ը$e)%#D|Iϒ^լ*e=:Qln*\S.~DD:y)A, UԢ(oZ`zĴz)CpJ kQ)yFĞ q,d "YeXY @mA!%Z l" kـ!Xq0 BRU[5 4gA Mw1=ByQ< !p6Uw ,aG6!_-zWYUt6HXNt1֜q @` 2 ^ט&Z/C G{ C ++ 3E=!炳FFrka{x{R9p2⃰(AI[ vI!H\>4el0bo :y ᎉ ( {id] &b.,XC&KJ}-ƥ3' _8!A/}aH `WF \lk+Fslt H`HlS?vAӖ6!^\|lrG͠I nLndsA> 3$-v`\95Kf4Tric%iViYr;q;ַuz\=߶VL7x':w:]bX߹֥BoDNoxƆɛ\h"uC kI ;BiSw&.j~%h埮v]$XI;Vpr!K߬y7Ӯ4 z>o=ߕ,m*ꥷK< a[la{s_yš)r/Tȭx#҇I>E0zhO+<Λ>ط7ؿ@@?H8H8탾+@z@2K`@;)  Ϡ'0C;j> G(Tx)ܻN[z.`ZX@V{C*Y*,$\(?@Ya d /&>Cx<3jEECFd΋(hv2D$A_tFv Fc< *BIIs* A`62\k ംwAHlDp2êJGjGm\B\̷ Qஇ5tFHtsa`ÈЂHHTGqǸHGmÂHnx(HȟH?FIvHă'‘'`آF Gz3< EI|Ɂsɠ<D|C3ʌɒ BD%Pt8`a8`KpK˹@*[aI qVj8|4RA u5w@B 8G0ALB79qz@2D ixn*DŽL[LЬѼ +( @)F<<M$ؔM#T,ߤN Fa NbwyIL$;\OҼ؜9nhy@(q65۳E۴U۵e۶u۷ [ۻۼ۽۾[ƿe5EUeܱ ƅȕɥʵ%5EUeuׅؕ٥ڵ%5EUe ۯe-muXX0HX" [P_E_m\¥ ݳ+ނ\8_(a=04 o^^EC_v`߰_MHv _ `{(F㳎*C0Ty_[&a'_Xa ~a .׈X HsЃb 8 6E*ɢ9-v[([?Yddx.f`- .AX " 26 `H0,a0HR%T@a,7~1 Vƒi脓a*Rb`+^i_c+fj*@>=^%0IQnQ1ct9\ ].CXwOwpDj%Wٙy@DyWY᎐!w!>*?b#ƅmtd zȅbیhc Alaflf䗓麥hE[vvT+ijN鑆-CvfnFҖTcYz7ISJ=N~QM?WI$x/ `aDZji_6j`HFvICC/Zi.jXMaef^jmϾbNj6 m./| |ҧ4&ﲧ$PKFˁ)Uz@HLƲ>-,0Չ#*K$Wh6Ss3>1xg'B`nP Ȇ@)6 GpNd 5ؠl& nm'gWq%~q ?q ΞmqH-Hb-,z犥FP5( L#z Xz0 GzdT̖=A~E " 2z`a=Xzd~msҡ0'm?g&[YmG_CpC:IOqDjfsEmvj /3Y # 12YEȆ)Q x{ $.5/?$pk, ;3 3SHkCʂY_`Al A7J?(g`@0GiiyNe_Guw6NaO?a}x.zxqpx88KyFሴzuMB&>3_PkzuaW:c_XOЎOxIC+b;9iOj>hJxj 2c(Ni3C-уi—cEg pRzVu{*V׆zznzu_d Bx<%NybH)u6G-> XS˺ 㺭qEzBj`e(6VHrwΦb|gb kz'ztStzStgfwfwӸU#NVX:HfA?'g>W scMHPU@z(䁐 +l4]@AO!l(A !FhC!"ԈA;$Yqbȏ S,K+OZY&˖47ԩgNe\̘45ٳEAIF JiS6{rtWOFa0@ G)֐z-!=z3Q]BīW&0mKzR3ƢS.pJ@5T ͓&_ *qݪɔ4D]2g)eNW~l8r<,}PI~\;'_x܍O]>Jmu@d !i1(&TN[oŕ`B< T^_6Xa!Y=Sԓ8dIN=р&ZOɔBlDK TE%d ј2-1Pe.R=T$@HзHөWutQtf}A&A}ؽi'w'}7Nj~ gi!7 $ UΦ찃C3=d&FDp&]>TXCOa~&#bbUsC9C"ˑ#Xn5Dc3@X44N7ܛk86l*CV5KhJO8O(m;P6.訸"yYnzF 0C'@Qf{_t,q+W2=~ rWz8|L<4N:w9I=tJfWjZ%b'AQ5fDiD\ey'D !(!F<"%2N|"()RV"-r^"(1f<#Ө5n|#(9ұv#=@P5ء!!(~֣5QD Q)Pz2g7 ‚l-,|vs4^hw&RUf %x5릏δ3BcVl)RpRփyGꡅv!/}1.ԟ-sG3yO3r9Qȃԅ5KĦ6󟂬A9Ef_XE, ՃG;eKuk@ @~xЀ

aC8"̃u #\ t5RU\IG H*D T TIU=BDC= .Cd@EBtD ; 6#B` w @% QٜHD4%F`B`9OI@Q\VC@. DO12l>jP.ACDA\H^tC85D6"D)E]XTJL,*Kpm@GB9nЃݏ0S=tB Wq)22]D@+!4D|bDBu9Ȼ:JD;6"@` |}!$R@փ $ C5D@w@TD~tDMI;ʢJ#M@CXܐ}%=d|X%"P%DP* Xpj%t%MdXYuY0*bh-I[6DHq%N6 ^߳dЃ2&BHn4CCP+ +ldC,f=n&:IBHOdUG5TM<0ЃCU ,4D H"5D\fIb1qUL eI:XFXNEpU=xEyĦ]ZDJD]Cz'(C=LC 8Dg|B’]$Bt}bf(EyF8p8X`QtuZV$AxX,E@ =GZ~D@)*ۆrA,M@ čBPm4 'čC _7Dty GPf D`L|@4J[}Ą6^ļe)D", ĵd˶4z紸SrTD.DfP@ħ40BE8\9$˯FeK|nB^EPRaReBD6Ŀ ʅ &N> ܐܜD!\'R8DVD$GqdI E6cE)FKHL9ħK4EceDL,`̓kRlOu @2`D,`?\SOeDDl-&Eco!-Ҫ6MD HEow( @`DVdCQJcE0#[C8o_C/E<4 < <CU!YVT&< D>;C9,E5 -V<4>PZCNĠ0Q3,Y\A\(BA&=бXi2S^ =YbC@,@8Nu7EC _LhWG|IJA (BL.^ $KA8=D: $ Z^jib 2NW"DhCP@pU1"I5 b("Htn=l$cCChl hn,pi=2ClI=KW=LC83&8.rH0CX E#AQVp=P2D E9GЀ7):6 =A;HFo=AI06#h%c !1h,Y~Ѐ4,oQBG˥Si6B.SuOāXDPAM4>TyCKsRHv@ES7sb#UG9ZʹM @eޭ)DOkmB @5aSE=֑L.TaW}wgQSA nN9V>[꿾=cLr 0g]c=^?~yo?}_}?ә =@P(`ALxp!ÁB8q"‡)PtQ#C68dI'QTeK/aƔ9fM4-´B{^)`hHUJTdRG[D)ԩzkW_;lYSu&4kЇ?:*'\k q'E|zpaÇ'V[R d\%cޫY(gWju߿VukׯcBxzDSL5glVҁxGE&A3ި'e7ӌG&AӥEEgKSzޜOCsNyl"1Xe4 =4[[8p$UII[.:YX.tӘXShiΔ©''(4(va V`MR^w [TX0!!ra$tIkV/ 򁐡sFT5$iZAXpAv*04)/,ȷ,q` T4(Mge $[2zL ˓ ЂK;%ՃĪ6x`# yȀ Ǐ )shD[a.W98pҸ6TX DMb=Qz$%!*PB! ]* a[A J%Ʋ Q@4Z D#A$UQ~AłBS1`\c]Dz$ #897>l9 Nv.LR#t`'4l"l# NxvydDO ,BKV+$DS "'zĠ)C#Zt ę YV7H]hJ5LD 2NY@)"m$H4{h]ADqih9&wQ~^5HX54C 7(KObh$P9kA L(aQQȅhz Dz &@FR+uC# m_ a@$$l=z؂ȵtkT?4URlg%/B8Y) ND6 9 `F 0NaD8&lt+[cTcMY!Rfh*AΛ N-+3jΨ* fBWw7DQ[9_FW5416X%gkk H`4GdRF1ƹֽkc̷iJ*P*hdl` @P"~䪞&!)TN8MqVoA, WƲi4!%>qAAU3A d ,@ L. %>v]tre ,OףYZ#LKY $94ۑ)ᕔIF[K9س$u rk\)ƆwVW)-@dĢf *vDV䖘2pm y#<N| ]ol @)0,z vGJGdf!aGh ªIS$H ilԮj 29A .qOuV$hATg wx2G4&2xܜ% nh爙wBD '5DJpRg 5Nw <@S5%ZDDI耦!ՉQ83 8ֻ8q`̾/HA >yFΡ#A(A)MT2(%lZV e0+be.vF %% ~!M. B/O0{dȺA4M " /Or:rM!6j%P4M.M O&d RO"Q&1P"N!VAP: "nޡR  F@""v@ 1Ml * dm'd) C@^" #  g$L` J x2&đ5%'b  % "dޒA&" ֱ)"#A%9j @eBr%Y1F96`g.%q2'#NhQ'())2*r***2+r+++2,r,ɲ,,2-r-ٲ-2:8%:Jb/\.rC8c1#t+0"0eb0705s/-71wc8b/S0s2B3;/3S24SB<#;B4=S09S%C45.R5\s4)N4Cb$V6^b.Ws+S7}9xS7c86#"\7{8B8S93:m;,6dC3.$;6J<:g>;22726/ ?>};52#4A3<3B@6Jc:Bs</DC=s)"8`D˓.=TFE#Cc4&?94ECT;aD4p3H@YIJU5J?bKUT6sFQ4KJ7I-BITML4IEtI*LMtJ+3Jߴ?.qT:?t;s?ATה?%R8TR7S1T6IGQNNU4B3uRRD/BtBQ?T @i=PCc84QN5:7UA+UUm.YIwUVQWG51=5\22Zk82cM_Pu4W$=1uNSP=B/8[VS]\:;`HmtaTbK0N4Q+6[Av\ E5Mu=6d3H;3T])b?6eHgf_70xUZuXUcTݴAT[K GkuL4v6HJij]0vihUgv^5j6A/j%5lVScVfCBAc=e58?V1:cn;)BY62L8 5HMcTѵ5rcnb-ws sW97ts?7jEtkQwuYu]ua7vewvivmvq7wuwwyw}w7xwxxx7ywy y @z ~{ { |# {̷}cv{π2}=2~Wq8sy$tq#% Xx8xXx{Xɘ_@ b&ո #z8C hTbMdVEE ِ;A !! ’/Y *;9 &GY BS9/E/xeٕi9ᗇs}M>ˉgyKX9y~9wt!,W;bubbletea-0.27.0/examples/package-manager/packages.go000066400000000000000000000015041465647402200224650ustar00rootroot00000000000000package main import ( "fmt" "math/rand" ) var packages = []string{ "vegeutils", "libgardening", "currykit", "spicerack", "fullenglish", "eggy", "bad-kitty", "chai", "hojicha", "libtacos", "babys-monads", "libpurring", "currywurst-devel", "xmodmeow", "licorice-utils", "cashew-apple", "rock-lobster", "standmixer", "coffee-CUPS", "libesszet", "zeichenorientierte-benutzerschnittstellen", "schnurrkit", "old-socks-devel", "jalapeño", "molasses-utils", "xkohlrabi", "party-gherkin", "snow-peas", "libyuzu", } func getPackages() []string { pkgs := packages copy(pkgs, packages) rand.Shuffle(len(pkgs), func(i, j int) { pkgs[i], pkgs[j] = pkgs[j], pkgs[i] }) for k := range pkgs { pkgs[k] += fmt.Sprintf("-%d.%d.%d", rand.Intn(10), rand.Intn(10), rand.Intn(10)) //nolint:gosec } return pkgs } bubbletea-0.27.0/examples/pager/000077500000000000000000000000001465647402200164535ustar00rootroot00000000000000bubbletea-0.27.0/examples/pager/README.md000066400000000000000000000000571465647402200177340ustar00rootroot00000000000000# Pager bubbletea-0.27.0/examples/pager/artichoke.md000066400000000000000000000031011465647402200207410ustar00rootroot00000000000000Glow ==== A casual introduction. 你好世界! ## Let’s talk about artichokes The _artichoke_ is mentioned as a garden plant in the 8th century BC by Homer **and** Hesiod. The naturally occurring variant of the artichoke, the cardoon, which is native to the Mediterranean area, also has records of use as a food among the ancient Greeks and Romans. Pliny the Elder mentioned growing of _carduus_ in Carthage and Cordoba. > He holds him with a skinny hand, > ‘There was a ship,’ quoth he. > ‘Hold off! unhand me, grey-beard loon!’ > An artichoke, dropt he. --Samuel Taylor Coleridge, [The Rime of the Ancient Mariner][rime] [rime]: https://poetryfoundation.org/poems/43997/ ## Other foods worth mentioning 1. Carrots 1. Celery 1. Tacos * Soft * Hard 1. Cucumber ## Things to eat today * [x] Carrots * [x] Ramen * [ ] Currywurst ### Power levels of the aforementioned foods | Name | Power | Comment | | --- | --- | --- | | Carrots | 9001 | It’s over 9000?! | | Ramen | 9002 | Also over 9000?! | | Currywurst | 10000 | What?! | ## Currying Artichokes Here’s a bit of code in [Haskell](https://haskell.org), because we are fancy. Remember that to compile Haskell you’ll need `ghc`. ```haskell module Main where import Data.Function ( (&) ) import Data.List ( intercalculate ) hello :: String -> String hello s = "Hello, " ++ s ++ "." main :: IO () main = map hello [ "artichoke", "alcachofa" ] & intercalculate "\n" & putStrLn ``` *** _Alcachofa_, if you were wondering, is artichoke in Spanish. bubbletea-0.27.0/examples/pager/main.go000066400000000000000000000076221465647402200177350ustar00rootroot00000000000000package main // An example program demonstrating the pager component from the Bubbles // component library. import ( "fmt" "os" "strings" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) // You generally won't need this unless you're processing stuff with // complicated ANSI escape sequences. Turn it on if you notice flickering. // // Also keep in mind that high performance rendering only works for programs // that use the full size of the terminal. We're enabling that below with // tea.EnterAltScreen(). const useHighPerformanceRenderer = false var ( titleStyle = func() lipgloss.Style { b := lipgloss.RoundedBorder() b.Right = "├" return lipgloss.NewStyle().BorderStyle(b).Padding(0, 1) }() infoStyle = func() lipgloss.Style { b := lipgloss.RoundedBorder() b.Left = "┤" return titleStyle.BorderStyle(b) }() ) type model struct { content string ready bool viewport viewport.Model } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var ( cmd tea.Cmd cmds []tea.Cmd ) switch msg := msg.(type) { case tea.KeyMsg: if k := msg.String(); k == "ctrl+c" || k == "q" || k == "esc" { return m, tea.Quit } case tea.WindowSizeMsg: headerHeight := lipgloss.Height(m.headerView()) footerHeight := lipgloss.Height(m.footerView()) verticalMarginHeight := headerHeight + footerHeight if !m.ready { // Since this program is using the full size of the viewport we // need to wait until we've received the window dimensions before // we can initialize the viewport. The initial dimensions come in // quickly, though asynchronously, which is why we wait for them // here. m.viewport = viewport.New(msg.Width, msg.Height-verticalMarginHeight) m.viewport.YPosition = headerHeight m.viewport.HighPerformanceRendering = useHighPerformanceRenderer m.viewport.SetContent(m.content) m.ready = true // This is only necessary for high performance rendering, which in // most cases you won't need. // // Render the viewport one line below the header. m.viewport.YPosition = headerHeight + 1 } else { m.viewport.Width = msg.Width m.viewport.Height = msg.Height - verticalMarginHeight } if useHighPerformanceRenderer { // Render (or re-render) the whole viewport. Necessary both to // initialize the viewport and when the window is resized. // // This is needed for high-performance rendering only. cmds = append(cmds, viewport.Sync(m.viewport)) } } // Handle keyboard and mouse events in the viewport m.viewport, cmd = m.viewport.Update(msg) cmds = append(cmds, cmd) return m, tea.Batch(cmds...) } func (m model) View() string { if !m.ready { return "\n Initializing..." } return fmt.Sprintf("%s\n%s\n%s", m.headerView(), m.viewport.View(), m.footerView()) } func (m model) headerView() string { title := titleStyle.Render("Mr. Pager") line := strings.Repeat("─", max(0, m.viewport.Width-lipgloss.Width(title))) return lipgloss.JoinHorizontal(lipgloss.Center, title, line) } func (m model) footerView() string { info := infoStyle.Render(fmt.Sprintf("%3.f%%", m.viewport.ScrollPercent()*100)) line := strings.Repeat("─", max(0, m.viewport.Width-lipgloss.Width(info))) return lipgloss.JoinHorizontal(lipgloss.Center, line, info) } func max(a, b int) int { if a > b { return a } return b } func main() { // Load some text for our viewport content, err := os.ReadFile("artichoke.md") if err != nil { fmt.Println("could not load file:", err) os.Exit(1) } p := tea.NewProgram( model{content: string(content)}, tea.WithAltScreen(), // use the full size of the terminal in its "alternate screen buffer" tea.WithMouseCellMotion(), // turn on mouse support so we can track the mouse wheel ) if _, err := p.Run(); err != nil { fmt.Println("could not run program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/pager/pager.gif000066400000000000000000014241471465647402200202550ustar00rootroot00000000000000GIF89aX!)+/ !!!"!9"""$$$%%%&&&'&H'&I'''((()))***,,,-,[---.../.b///00011120j22233344464u64w66675w75z777888999:8:8:::;9<<<===>>>?>>? IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6k' !,W!,dX :Hp C &4@DN-`p`%gx2h"‡ !,W!,nPH *᳅8PDcahBYp0N;zU1@/$9;%SD 9 rTcř6W5fN,ؘ@@JqSlv !,W!,xPH *᳅8PD ->Ĩq#Ŏ3Z bΊ13gn|"RqVÛR, φ7uhB"+tK<8U Pf$)s֦V5s֬K7 `@Eh!Du!Hp[ !,W!,W!,W!,PH *᳅8PD ->Ĩq#Ŏ3ZTe62OZQSRrAā̇O"jiѣ q?OAr@59{VS /jzLP A`#9ԛ^!,W!,W!,W!,PH *᳅8PD ->Ĩq#Ŏ3ZP`Q2g #RAΚ"sB)8 pk` 84RCo t$/g~겐etռ Rpeˁw 3HW!kD FvF`Yz8ƀ!,W!,PH *᳅8PD ->Ĩq#Ŏ D(f|R2gV9c!#B̐MP9#E g~:˙ӧ6نX#,8!u"r&Ac9-FF0Jn_~!,W!,W!,W!,P|H *᳅8PD ->Ĩq#Ŏ/@hQ)dN} k)Ӆ,-a@ $Ղk!bɝ@lҠ;u=- bhДR˯sB8ReU1 !,W!,PPd,H*\Ȑ#6HE3 ȱG!~IcH%S\xʗ0fʙ6sĩE>6*(BFlғN"*t*UV̪&׮1})vʲfK|ƶ۴=}WܷummW^}c0#^xqƎIBq2厖/_̬"?f(zҦNmp5k_ -; !,W!,PTH(DȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0*͛8sɳϟ@ J(#g]ʴӧPJJթJCf5«`ÊKٳhӂWl;0VuU˷߿ L8/[{"k\!L˘3k(9ܬ^,tÛS^ͺ;gF嬶۸sܾ=ȓ5УKnuA(4ʝK4ݻQm+2c_Ͼg2Y4qo^/ mX( |hW$=H$~c6!(Fv FԷv*2}!yK4h8rT}/v"oIbI4L6EQ-ƤP)dgU٥Ge)tN6K %P:ݠJ*TqO(dA&6裐 tt饘fEq9 km*ꨤb駫ZꪬZ橉jk٬媦k챭 BP1ΰ 'O",C[Ԧ@<H8C(:SOv+R-B:@{dn,[Gӽ .3璂 2|Km$`4@,3P$* T"8SI.8y $KH'J'\3P"L2,0B3x L33#i3 3pu[wuDG/mkǖ n3np<1δF'@3)R3}L !ayE'G8B)+1s *+A\Q( 3 98#RlJDOr/o HL:P~M+H0tv1ёt)CȸS6+361N .A.x8"H F/ 4@\AG J҅t#9"^: ÁL^(78CHڈMQ/Q@ vpFB\rmȇqθA4 h@ Rla;H#<0[F&xfErȅ3 J^24Z#wKd=̢A-t6s( :jb+pQc(Jzv c@FmA6lX/N[r#HO4n}3P#`l@:w ΀f8s$%D'J& 2΀R ͑Er$ JWڡV&,L 4Tj8)TT`}: P <RJD9GhSJ$ qծbF oxղU0Csqh)`Jx Ua3 a}&.M,Q^b'KY̬jѣz hGKҚMjWֺlgKͭnw pKMrM(AF86VO(3ʖ&s$jV/qep/|6#^\h,G"Ș$KnDEF:J8CxROVŞap@*Tp_ipF H+;561qAHox dͨ 8h@@(8ǘk dHx'P 29Έ@J   2fLq8 `dϘ+0WrdN$<tff=r2 c`X >Cv!8xA S$2 g@ ^pFPeCk#@P3g Vv- h۫ # .3 sI P lp t ǰ!4!32n` F NŠ(38 Xaю &Gȍިn  XMxP"6R ypI Ԅ %`%yq t@1 m 8g kpMPl0 7g6k A̠  ̐ *Ì(+6j6W @6 d  nى~5Z5^ h#:B6@H2s0E)kٖo)_9v"lzI`== a $WWPNpiÒ퇂* 0ɀ 25y 98APq!^0:sE#:@ Vi:)eA 9 #x}Q;Jc̰Q :<@ J$P ̴ ,p7=U`1 pP7rDLDP16pa&1 DGoV: EhhbZ岀dO#49fhS9G4ڑZ) XΠ%a^寵CmsHG hQ`amIc  QF&v$xODj Ԝo !KrRld p/ im;۸: oG0Pz4`j'v:qN bKDJU{xKJĪ s-y `9JtJPkkGK IFl&zp ؽ[lXɼ KkkջŶkNT`ʩ & ̀ 7PL+ ɻq_0`[/HiA @K1MtM B,;lk wJimQ aŷm:{qmB|N1VFP<>\A\`,UmqV ^ L\$,6 z90= @ Keuh7 2Д#|:KČq:fʙhDn]HPL .nq  >nP`9ȁŢ3^ʹл،ʄwtt\Ws  p 0 >j=]} =]} "=$]&}(*,.02M7|et7}T;mBCJ L}}z2z1рV x& ;Է y,עSB1 |1! 6p]+°>S ,vlx2+1؎ؤ؇طl4mڏ=(v  @p-ۿ^ї3(Π A  2H & =1j9` 9Ȍ xEe ʶUI8a@3΍ٽݹ]'17p{#xa7x7|la9;N RiGJٕj)X pc QIo POk!4CPΕq 8t5A_)A }c•ihx)L~c07{7YN'Afv{q펮Q>>ΐFN0طjKMe=>]jbC-`j ,>?lGZtR { "O`21BHnq p:׺nA9 E?g:_ k>nPsZt}9A˚ي/]qEj0bO&4 2)^4HdkH t+v[Gk~ } [zPM/Қc l{Xo}0?&G8@`A RpJp쒜\0 !<4:l9Ŝ8y2Ȓ9{3g>g^ :DЕ51̹'VΚҴY)A% Ύ!j%6H$M:S'OtAV  gT8F`l2gMZ٦ξKR3n@ʕ-3EZj֭][lڵmƝ[n޽}\ڕ CȕSzc;+FHxFH3_Ss\<)rփ $Dpe w>`EBH J'eh.5Jsf@ 2<$Ӥ yrPد?);<$H#D2I%dI'2`) h b< ӡ`8` b@@L\-\[MרIK)%PCE4QEeQG4RI'RK/4SM7SO?5TQG%TSOE5UUWeUW_5VYgV[o5W]wW_6Xa%XcE6YeeYg6ZiZk6[m[o7\q%\sE7]ue]w߅7^y祷^{7_}_8`&`F8afa8b'b/8c7c?9dG&dOF9eWfe_9fgfo9gwg:h&hL~i>:%Xj$!z& ձ&r JV0ɰ{Zq=Vc) Dt ]n9fo m3w<okg.a"Ήģbi_<7?V/%i/r)f HϙSDq[f!|P%f^ ?PU$gu{'=|s$M96\m™dDg`OR"_qF&8! F' HxY-"b88ECZgiH@L_LJpp5taAVؐ BڴQ < /} {n)3 'Q)HWD@Q1IcDټ"}p ggNaQCƨaP(C0bA0Bm`d,c()S|D$A9ʆR,6inRӗ?bL1`,$1{:)"S 3 C'> "IJZ D<9Қ6ۉM .yCؐԨ77ipf$J٩o4\ ΋a Դ7UN[R&"1NnH=i0 Rd( %&aH EjX'8CYV 2 g)S1Ä!hMM:Lsβl39MXT dX N03$@ hȖdy@┡ d$":q t|"aGb(H'Z36,|X2LR pֳehc[PF#"dp `p2 Y4ҺlhrYW moK!uFs;_Wov ""SH Ӓ x˛ WpUTA  >mATZ n!`슶ox : iAPlaomF1\_@g[ԴL4wJe3\lmh`7S-n]0 +nk gTΈZ'a p*B&.Ui/dІFt`J UЫ^srj@tF!bg p ] pC8 ] A <ؒ 0F-6m[N)2JgvRl>tAs=*# !e8ڻbd sԅB: $Hb{$Kp\ی5pV(Ew7DHOP˝KRQMP”΂5lQ-MaQ8+?Aitm9MgQҢ̓ OLRJbІhRxRH%$rCO2RSPM\J7mQ8fPicBJE uUD=HӂC#LS0](T4 hлr͓ fI(X8ظ| Xlk yY Hط`VGtԈ]=g VsT@ ` xYxXAء}8kEYm {g BPYDP:؊ v5;PaIjXiulPPؐ\sPT=ZEG ҵ08<;\B ]Y֭8A ^a i\!^x`0\ތ) 9i1]M= 1']hZ%̵]XS (K#e`Uuaw< S_݂@ 6 C@G`6ᡀ(Ixa^O摑yXah\ @ :1>aא;!c(&XUfU>eOQVfWVpH@@fPCy A$`fTFPefeQQffg>:EMT:opFr~Z6gڨ%iuxyz{|}~gk Ehm)fYi 捻ahJOaD'92?؀A%9iBqh6!ҍY橍y vÞ&&QiF9jiJtiI& ^Biր: &D\iL׀類>ԍ؄M v +j:k#l"E~΅=FjkɎlV20zghPU:!=zkXdxm Hmrږ0ʍX:y"H&mnྍVnmͲj֮]'nƊ*&'q%n.,t o(mQ*WbwJ ZNC*rB(F'k֖?Ԩl|GtZ𮂬6qnߨ:(qpz6y)(ʨ2$&%*Q$Uu jb%*7()Ǫo%*)JrfW\%z,rZ2J 1g rop/#hE8YȄf(CGtEgtG?J";a3HOEoG?OtuVOX//"/;i:kMwYo+[3[uxLt t% X@k10E o48DC Tӏ7lwvYc1A5ZK-b:;òk+ g8tYvZXg|;;3*K kG5ƒNS-EHbO3,^0K'rwxJwrn3R3xZwD.^W0)y,So3m3xZ1z:ylWY_y_`KǎbPa#4C;#s_Gzzx<ɛc9g7\ ʻ>r-dd>@3b*A ݏ~#`w%0Kz3@B y"Rp5gAZ3@28 4'0c|[ӄ<@Pֿ '14R t/^jCcXEq C#P#0Rbw '>^8T3^ct4 \dz I d1Cd'ʧEY% VD6m W7;RWAMw ItG M9 0p3.!\8C3!9< ) $2 $lgJ* 3=~,g0"gxAc ͑Ѐb <9]D0@B@Ԇ"vX@щ'D!&YjLgZӛ$;"S2$ 5B8cŌR!@M)Ԋֶ*G!$T)zH^.>R}ӟA]VB]hQzf`U\l%!+QZCWEYx,ica͎ԳXYmkFg3ZiQvΨ(C:۪V &x+y;r\PpFXaF̐3,X1hPC1Qg¸qsȰ [ />_܀ȸȅ= 0EJye}o|rHLIEfxE&C\ BSH1cN2A|L0{eo0cW! !a2ClЙ᳌o0&OvF;"g`>gQ&L 1;y(Qٸ6ݞ.n@˰ b8 ueJZ5WvF so~(` a1mMiS@T";r]0hfG}m""a1Ͳ6J B㑀`;8C7; >F*~w_hro/ 3!yG<u5Pk>9Ѓ.tB`pFN0V8W2mS.@3fauc][:.C)pF0P &B.okw~; (A 3<#/S<3s E0 rHb} y P3LjjР n  8'P5 a! -ΝdaFrGQ.: vj;FəM\ .!aaG }`a!("^%%rTUtM0$B'ҖTb)N/BH CL!.Œ -ڢ2j.GPM5C/at/D(C`DB2,*Ԇ.Ú1V$B:b^1X078ra-"F@;;F<Δ8cc1c>Q2hK1L #FV2bG8#A8;.E)H$Ad6v#CH#55C$Krcmd5ΤjܤKJ$ y$D2O%@3.3bB3d E@16$F43B#V$2P6Qd/AFT߈%Y$HUxS[R%C1L2E`2?5c^vdA.R2^%V<&a%` &C[BTeM]"Q3(Tk:CDB$ ôlD(, f3&VfmN 024B$0C2bf;f 42xB,0C,B']'t'q&8 3ߏ,O 3Vh'wz)kƦ+{|:Cwvw }~}'>~5C+Cu'm'FgD*. C2؂08ň艦hjRubgVft('ALgu^R(t(ah(,!(:ŇRvq&r6'BQ,2j&pfFVr2)(蒆(3&of3lLxii:ńV^)"Jr)A'3Bw*BIO()ib:)b**v"*iDZA3 )SA؁3a!8 J᪹8*.<3,vV~\AH]=WkZ:rĸ3QiA#0ὖk3Ao tkv8C+<ρH< M+ATk>lf3llzjƾbȦvNvHjkGH:+Xkl,F+VC2į+I[aN,F&(,a\- ḍlhD-ål.mGh@,֢",(jS"2!~Ǥ̴xRޜ}LLDM,hph|l BkCu|annA.1B^^B0QjGK҆fdn9U6/u8 .U.tLЄNDzLV䮇D~} X.N|oP t.P֊Ajv_>HyV2H,l+p* vGJ Xʕ `5(aDF G˓īW :mE41 i,,uZ` 9Ȭʟ0awD1qA  XGqW`pG bq1Vg +42C[j1aH27Jp͂,/mMl@$.pG8 OLp%1$- 3VD@3$^3K`O2,{6;[XOv/3@:1%LN91;sp;ϱQ2emG3A693D9wsG*B@(cEl[p. e13EAc(g@4P4ɴ**O^"h P|,c) -+`3q S`F-S{T%Q-U 54 U4C1xQ1X 3!DWk02)'%1u2uQ0u y^!J.r&LmMSt%)66R/1`uA'y4 ]egLRg}Q;6 Xceeec0EvhuM_,E`VOUjuk}k4V07S@ A"hVcauR g٘jrk>wلzcpwq=`ZntaiwU閍VZA`Dwó跍-_ł8C8g-wQ,xR-x_@TU]vG-8g7(w}/YrWU:Q?Dm$%4VMٔdYjx@x{n[wck7-0ɩ[-X50 { }A'FY3hb7i욬9VWO.G8 `DD}i؝F z[C[AzycŰxڤ)mpz9A(E՘F%wGx:y9gX/3Ģ5Zplؚy:ߺ9al{;e{Tzk9Œۻiۇ{%}j < =<ۄG?C(?x9?6` ~Чa2^$Lkw-4(:Y](8) bsH**#6@8`A&TBUF81fԸq#g(p9dI'QTe.14+de"<2&I&\Ζd጗ t. ZY'ZD[nj28uTh55hTnaXaר }pzQm|0, E9̟A=tML%[jA* 5+@jlxLY9+fٟ5sv6# ]}Z57(^ A6B.qХjFR; _qs&0?"H dL)ViKm/= Ը諰 :&t7^mn#O=I4őzc. +HZ Ŗ碛n; 0" i /$AdPB6 3?.@3o>d;(zKE654bj*cι|0 G=w!X*FtK 嚓HJ 6g.ӐMVe-f$ "gE5|[ Wv\g$ fT!F:F"Zc&+@eZf4h r1_6`\F)T#d+ 7/fat ^{mh @D]Ia| &Hg/*,(`FF"a&8XZj-~`t! Zc\eč k6jhVꆯFZi( JI3 @gJ g"wzS`߆%_w97㘠ٺk1figf[*/g!c=[g wYs@΅mgf~m(qF -o]gmNzq{i_0E QŢ3`T8 30.g xp}uQ)3 F3\%HAp <ƒw'L!VH Z Cp GMT D 0F g,C  p‰)l0( ,x`X@K (C"Dd%[BxxWqA*x"@"f1k[\` Y")SAG+ "A8EҀL/eIEҐ(d@ư4D&Ar9&^ HłDӏL3g @A298NfЛc9h`? \ x"L#H,<#J L"H#^G!p& gA RK$2Ђ:BhF7 +R*H< R0M5j#.$"@, J[Ҕb0- T!8BFdjPY0 „m"\QuF/*@eIBNT6ekR+Rֳ-0E1"$K"k(b ^Lɒ3JzҭU 1Z` t+\ "W5E5ڐ2mjٶљ^ W"}k\zn܉VrH/1C4#'5es:ݏt!UnAPΗ)Ճ% Eo{ \MPgd"DA:^z0`aͥ!oj +Ey k"~ɂZ܆" Chጩ3RY]9rCQ5AȠ% ]CREaR#': r)3p!BAEΪn Xr @f"+ b fD9-"*I/, .NL2Ba.1,-R"@b"D1 S. 2 ~paT/x1r:, "B AA++*5R5cd4Kn!$| ҮL9 $_&B1#d-2r3# 4#B:#$0Ys`^; 0'3B*!vR3 : B;UfJb^6!hQiBgj6ksu2(2(YGL#L4ke%vl l˖ 6m#kjwVko6=6HCOJOPeS:E:+%IJDHVZ Q`!q~pjOTL@C;; Bt#9xeT$C4TpWl; @ ~HTw=x Bg f `ozwY"fb*.Fj b&zT7kldOnif$‡w4jlg!T H {7uvetgr|rG&gvBF~-|~wFxugu,Fǃ[[xA" Ba8S†ptȐ\p0. i7зʈHE¼h!H~!ZHn+bnXt"f~ iIp鍴+8Q*+!sd9bz b+ }-B*% 1}-!94͔@ L-|OF!:yr@8½*@m$Nx =Yye"Zʬ}Lɚ1J3m!.,8 9zMg:,}"[,V8+ *9o-!nNں!NΗ"\`x. I›n!pe&b& jƮ /6 _&dFzNتlŦ卢 zc YFЅֺ گ-*-:!r pI#!'Љ_//O8" L U{U) &m X!m$Hdtx[bJ G$y!bAb h"IqQ}o(e2#w ]!1'g(M4``1Y{ ]~ >~!>%~)-1>5~9=A>E~IM4REW]V#hcE"a)4x~"t~$ v>Bz>Y~%p噞Q\F/2J$nv"kJv4HdOme땥WjmbH[#># o~iIiSݾJJ#B B^l pv->۞,Bt4,.$^l;_!U_Yn3zP$buׄG( "rӄu]VEeH!Ha^%VfsbQRMԤuS<@y!Fr<DEK Bs-%W *$"l_7w W@r!)$RB2gV9c… jCgp -gB44լgZkB ̔5,Y4<8"+" 3dHJ&CJh ?;{l1g2qQ"JJhS,g2d̅\`i6B>.t0E# ֩Y GEr Xhղx2%O :ѤK>:լ[~ ;ٴk۾;n*Al2fjVLa!gv4h!vQYsW/g:r E ttկ3$^Ȏ nLB9C q_x MQghO"B%z| qD3t@~ tQ!,}B P%|)talHX (y桷[N> eRNIeV^eZ2."\3Œ) r RH!)yPh0,$A50 1%hE t6ȐPB -([ 8#G" 3!̴4A(3**W13>&2-0CBM匈%8IP1vhs2* ЯLnm~ nKnPBDb'B$,,%E&P130$` ;U L dH&p/  08V4﫠tkpdBX;/t02F.㼐< 0*KuV_uZodBh˴['mA,p B 4s -B?t?+TZhʸBx/\O||X#3DŽ1 #ġ _1Ŝح, #=Hط;C OqS\[ T:5YNZ8 >i.~#ݬwkb ]#@KЧ>npl@˨I:D+%{\T?1r %Bpl2K_ Әtb\So4eMNI`@%R)vtQS6$8Mլju\.!0$[hļִulm[g#`[Pފ׼u|. v-a*vmc Jve/jvg? Њv-iOԪvmk_ vmovo w-q*wms 7 ujt @AB cVm{}Ȅx}_Eb䊃 [@<+x RPFY5TMp? bQT{UB{x3 TX@,x 9 yuՌL$+HZ (梲Z\[βl.F1hN1ylެ]sgܴb4on >hF">1}$AzҔ.SHClA!`\T:FM.6x >@RW `է1FҀ] D ьOZԮ6[meٿ01pd0CypL{n x{|{ |/6̘E( ـ_p@ OǵlHV[2k=P+ܥ!'M/1jD #{i> 25я&0`J$09#}\Af(c{@ ̫!x LƩO@ D`#ɀfh IM`?`DϭCI򐯼OCy'eR6{~}nLO?U_{ҨBc7# ^>+>`t^ o s~06;2(!;b!/ `/'[gpV V!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,PX @ \ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cLHS M2sɳϟ@ JѣHpBPJJիXjubS8>JٳhӪ]˶ٱ_m{S]n˷߿2:6x1cŎuL˘3kvyϞqtY4ңO̺װcڔ)]sk3; Pȏ/0ΙC_@سkߺ,YO~˟Ɵw`h&na1(m`5VhۃuqWce($h"OI,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)' i!Ω|΄矀)蠄j衈^w&裃2*醐Vj雓f⥜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+찘 E^TH Eq n4 T$vE|DO LJ:snN`8FRL$˾Ґ0 2Ĉ2u 7˶3L3r HI^y L S@%3 Ψ!\(ol0"L O2 DՂT±J0C3&wvQ<8Co3B1KЩTr$C rLPXG-8 F_T@"y= KE/$H{K3d!p{4L03P4C`3c W L2; 4C#y5Ќ) S45aJ2ˬATq/= I0C"?ُ!@(0> Dp16/7twA gC 8@}@0A d d B@P GA 0A.dS-"g!I.O|0/a#0-&Y|!38c p#bӀ@RЌex"@( e4"H\9#l##M 0L)WtN 2eɰ0Th!׊Ő% C&ĥ.JUt1Lt,51# ͐ 8l1j1:1*8ÍX 6850B I0HѳBAp$&rgB bpF!SHA p"g,A+;)|&EJ@⛮p!z du !3ZA]!-bv3i J@HGzT9 yjT0ժu(62 d\Bl2` E8 3zpf-90DE#(B\E.*\԰!EEG_ $ØX0Ik DW(| r)#@X4kzv#B@2 ,kr ]\T3v13`xT"pFg<3h,$4"6he3@6ёtp1*M. D"!ZltoХz!Pn@`-kSKs PEESHCP@h!t()^`b6P1f-"pdp.DRD@#qR88k,\V'i3 rU˶?\Nx*w!P9댓^G˲pٖ (68.m l"!r , JBA2F DgD!Z,;yŌaapc B]8Np!p aϱR`4Ѐb 72 z$bYr҄ygx<@S 9CwJf5ݛ=E ~=",ln?4*DBgB $ITߡ k q 'fXfj% |X t6NDPTtHq 8(A-t7g0PUv@ HcPNdR d Hg A Vp~}헆VRwPD3' aQ1oXSaO1denv+gp9G"su p wx0 ՊXxȘʸ،8X'y!" " X!Q(܈x(昏*)EHA*'8hi( y)9vYH^+1 Q3IY""!("9ɒ* )!O1A9u!B)QYhRAI:89!%ḓHMٖRZ "^9ciXi|u9ɗf鐉 hih yȐ lyəIp!yyqYgɑ\irym)Hy@Xٙٙyy隴)i쨎.)ɜ`y܉Yiɩ idYNIɘnٝ)Y ۸9 鞿険ANCyh~ Jڠɝ)y2+9\ٛ!I١29iYڤYɉK:9N*iK") (YFvRِMɤZڑ^ɥmʦvJU)B_J))|*gڝ(Ili'1ʟfڑ8v9 ej:ZzZ%Q9":ڪ:Zz*ҫ*". ! lg."n@a 6 wp ךQ.2z7W21#\Pq*! 2 v:o un  dqK+c6F6&J [˯) Z5{ "+#^ > 9O Q#AA:,+ Uѱ ˊv [MQ; ICCΠ ?St ^X@]a* 5p{@jTŰKܴFD?UCnAB#rl+@Tz qC3Z@A|pCBHveֵ0vh )<s "<` pgh̰RtK K0 AII$ǫMJI4j ѮX pHKJ{= gLFNʗq՛;JKRK4L0dBJ AM + ԾN+E+IJ h'XԱ ³6 Q`$T? n0,R0ՆM%p)E@ а:R Rpmj%UTAdz AεThXV B \gMVO,?, W-RbS <' 2w yǽ R 񂺨f[3[5qA0 \p7 Eԕ^?c|L%/s^Zhe+%u]{lȈ ȹUiX #( x! <(b,FNcavt %(\b{ b@fR6C'{7= eLb1'b|v~0B ˀN2c}͂\ΰ0}iifz > ҡfbG, jiVϐ|ӎҪj k-п+4-a)%$) gG@y@G!dmց yPnq'G6CO_0p:E4s%vvrAa؈\  soHs>w mo$u` oq 0kp˰Q.3W8 w3_{}wzy܊wlyyh^^x}>pgf|zGxs{AgϣWzws}xW|7wP}|mN$ǝ}~x]V W|  1W z4 *(. ̜1 X P #,hh0΁ |qP7ܢ=,:g;."$B~0ч1n)D;0Hz>~qq1q^~阞难>^.z'`K2wk !꯾9n6Ybڎ ړygx;Y-Z>Kў<Ҏr# O jX\*z:ϡi~ Q*JN])𰒡90Y5יPAx3zy=.*ڮnqi7w%*RߞN{rʔ#Vk/ɞ|zt*٣noyV_q/B?oQ95ߠ3yT*0jE4y)9yE?'_ߨӟԾ*t _OI ̿y+O!:دި)@ XB2PaD).$8A5nRH%MDRJ-]SL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?(KXW+C|fΝ7!3gHB6)ѥ6s0tg湅FBaD s">CH6 {ݗcfg/>(0QCǍ-܃<Yd6ݍ Xb@WZ uu^vieeY[/6i\eƠ}יxA _lhWpFݠYy" o?ݾ_dQVeuW{Za_vuF4XWVq34z@ ] #щcH L3Qgױ֊B#,@x“l3шH0#2 *5C¡(@~V̟@&X bg BZưW ' D]jE0$p|A8"q#vc/2.r@, ،81:" _`q#/`' pYdIOjE|ƃlia]qR"#gB03J.^)EB86k mJ貋t2tW%"TΈD6$T8 h3Tq4Nl/dAR`;y DMc"%2KO'rՓZ gB vpRg0DJ` )d^+[탇p "@JP.dAÄf=,u$aR|yj'>G%8 /& <V*BTVquU[_8:H#2Ӛ'jXJ ODVֱ8uNR&v-_ 9wD)JSjvmTFZV)Qzڬ1YuX P@TU@X\s8HNwDgB pFq.B_`W!38QV Έ-h^WY3z1`1kxjTzִ5nxC;ސOF^ bH1H e3|f A6=60 eD-x 3H d4HBD!h*3tدc-304y=ȏ]eyrIa oQb'k+$sW|g Y.gg/bnm `Ȗ!.fV$fu1 fxpT|KF |cx#31\TͻdFPr6)2z!cDodEQn42:liSn0-9͊2e-9rf+|Lp F))4A >(6.R ^Hu:f8 ~dPذ%ʲDN{O.uD| UT6;;X /4 G9i4: ƉYXt|:5:#"9e~u Auڇ\S_775u~7Bqu w/[_H@ :H.Rn79YE }' {_b4S?g`@@[p.:@d>Ce q>ӻǁ<˓?@+>LgRA>[q,?f<D$H(Zf04\4P*+,+b/gp;B /)=ޓ*{gBg1y@bpB:$HJ<KCȲXg`AB<Ē*DDD:T$DCTBD*DCQfUE"땥cD\'EōFҙ@g FFdGDefcd]Yّ /؂;p=8]6ؤEh%YYڐڐ'@O;YHY[Z]# *'.Nd1P>4fBMeaechaphn>b"[O V j!`Ij 硅 I1 iy՞QqiE.>Dy&>bވN؝&qbWfV1I֠QF֙k+lyĎx~YkzlAV+vm(q`kY"{B`&n1ƖFaV⾝ѓnH 10ӹ`F#lFyk!N$.8fPOLh pE2X2ئhJґpp'vnkfM"=""2"?%~##$9fv,Ҩ(Vq4rM#p"fs$t$.&Ȯl5w,RRr&2!jҦ1>7GJ' ##w+5S4 f0$D&g8^](A"3U%*>1r9׮NS Et.XjvTA t!yA$7#!j4`?ZWLqc?!^o@'1&$fo%$-I_K{|~'Z-"-0{obNw|w}_"0k7B*7*%.bT@H0 DhgG*܂`>.P*7.XB/6?zCbUn0B Gs%+^MW+PĞ-z -'z2wC(9 ֫ t7BzNd. 늰X_*JgB{8C.?`HygǠ*|WeǗyɟ+ٯz*' W+/|y{z p\\~~44b3c[HB8W|HKuxT.Y#12 xzca5 ` K2l!2_ _`03MQ9#E g@dI0X&%\)3 ]-;YY&5ې$M8 0ANPK` Kg+rb!˲(V υ?$j4BGej/cpd2VBr3oчB@yJ&K8#,P3'z5 @J욡A']S( 8z))ۯkVlP/ө컚,-&Î3f$rnq @͕+ggqGY2q'e k-BxX&Yl$i!!8"%x")88b3D P/:Dp_ ]@s * 95 #.(#}-Cj#,6(Ld(b2lux W2*!bD-Õ3`\UJ8CBufk KO)\ dI\ٙujC@uԁb @%ΐ 3,䨍 +u=΀IJZtXҩfCM+sd'YɥGEࢾuкЩ DQ kݒx%5 Px׻: FFxjjAS+]+2-2=L3$(c5< ; ڪ2Ñl3AL39 -@SVɨ*l, _(@mqW0Ȕ@3tKIP)P 'C{3c}(EEj4SA1.>LI:I/Di}v~i t=9gNJy%ubu 9oѠû.kJ2@{vKId#>|TK:r;}u7HܢP\•l\3@l!ט7_4ֹ4m!z# ;$PuKUT>!( Lq!шHTbBif!,8"jL%G#⵨XI @BA O@D B4:0{QHHRgpB 8rEsF0:&.>~ i)Pi3`.n(<(I n71tQ\Їt3 2\J # CT&3J)(x\+ AT|yZ0za J5W?q)CO8%[0IB.d6%ui~&֘X+f4e@t $I:58y&Mх^zJ0(sc$$%yC&HIJ*9)E@*X*V>@Yӈ!KӺ"]dHr,IY;#ʓSJŒKȁr1 9J<*J $2@堺`KD%Q(98-3>|E[E9@D+E@&4.0Dѭ,CP ;QFf#6@30^P/zMkk\*.uw<b Ѕ_E\.[z޷ϥt J8* `4@ ^>m}ADLb+~&AWk_آ(Uׄ_ȸ'/$""T^gp6YZ 1%p5 [/{ /erz5ygAIYT6 0b IXE^>s\HpFR%|P̐3,G}_K b,d )d:rpUg8 x2 ?ӡf "贽H#1f ON`/42!khaH+ga!"m悲cڿx ^&/RƹM5wśi$& _jfa$nKcZ hHz@2+;D> A`…}>IF{/l?G!𛈪wH^C_NlTk06C(B9 "H0H襠 `̸ ~ 18C +8$\ C3މ` &*Z4,] ʅN^!vd r! 3C`܂ !a]*ҡ!! * ".")2"$F$N"%V%^"&f&n"'v'~"(("))"**"++",Ƣ,"-֢-".*|Wb/"%>0_2.#3CP BeWP N&Zr#e3|T:fA'0f`vW6YDbNqdC f΋x &iuإ3"9^&}p&\jC\@mE5^rf&s:r* VfaMhxDv6vv]c_z6qj_ginyuZYԟ%ggV")P/I\A0  2Th1,_L2@^INL,W3e^t/0M0DB2,*L=fZht-pZ.o=JF2AN٥202D W1"Af%A)>M6T)|/H" č2D |)J$>-k*2inH" 5ųtJ B38!$hƧ(I/5)d(ph΂oBaf](p! D'hE "i.̯2k6[kj1uf"%8hܪ/HI\A$D0@lp( ^R,L,+W`>KTP3(C#D3$4/U@3,'B"tBv") 420^P:vRR3L+T-^.XTe9]Dp&  5C+ :D~-Ҟ-պ^z22$-~ 2,mHlhmITIlVչ^k@6~nnQ[d-,,B֋*pH,lφDx"$nN.m~l6^j3΄IGmzcg9/QtB/8)m ol]..oꖬko&oo'/,&A03 !@!w8Q@Q 0z 8"p'd_F45@)5w53D&5Lj9C @{vEۚ]3A#0̭-D/8 ZӺOj313d16@0el rn8^B8U#r0D1C7Q%-ѰI }o P1[r&^"r+ 1^1#!8 ,g^1Cq ԰p6T7`/p)20 &K 3-84D!q%G"V"2!\NwEH_2vIpG~@x+ ZL"Jl`Ls\ = cDkqՇ@TjLE{Sۦ.1BKTt0,@1}Ft uā^Z9e- ,P8wGx[@1dQdNE0gP^BӤsD4ıӏWLѤ{;he3f<֓Cy @" PAzTD|oB;12ىyTwTQ 3 Ӛ=FI @:^A| N1ûQL Lay Pz QPe|W:CCQ]`3};I=Y}LiSY5FQ}σHWz{֒ S@]!6Cy|_ @۳8C%}3=S'D0V.htXk|gk/i*5>9Qϳ߽q>KK8uػ,>fzȑ Ό˅Wז #@b-VcQ߇ϟVP?vDͼρ#ːٌ徍YRq͗5U]/C}Co?{ @ bhД Wy`9Ce0(3fr&Q`2 ĸ%C%$ha?hQ])eӢO'Ɖ˙T/8&gN1g<:S)L.}uqM%O:Kvk׳2`…I0f !$زwY2I% n1` g6jN7cZ k绁f܉tzz7i4F]tsʖ1D4usױg׾{w.-Øm\ۙ&$ L2wSE{OO@rxC"\r.Ecq$/h"0?g!dAF믦PQE; gh*gXKEf`$Kq(|dE*O96rD0) 5|hZ7P 47\ B&lP2S:L,2;L 4o#ZP4,bt3tJ jO2JoșA{\N /0h0 `[rINAՈJE"eh&S\,Գ /,JgVYsegN'=9Gi{W}[@^Ov;`!@m#s߆N^rTb*`,.J䧪vJX fa怋*`0I72gz:G& i&d &Zfc9l8ff.`UZ[/-/.Y oA1\9\Aғ^FFEd_)cG~.i>%OiN "Y^XPM\h*/P{Vݑ^PL WfѨ*گ3df­(=D 5`nj̛^t;)I;eu#MeQ}gWi@K}ӝHLeb2 ьb0Lf,/ (&]Dad;8Ff5| eX@"30'%B/2Ӌ pg&ZaPj."=|! `5­kJ#b@FfN] ZVv]%ͨqm1>u [:׺«Dt۩,1f慱0Sd; Dh/lǺF,f5Y-yj99S?o?anmp5Wt+L؍8@/FaE'> pX)-~p^W Fz C?vAbdLʉ]lvel._Yd-+f,PF^W8P@| XB,!^}gH@ *!F`g8F; &| ӯ ety[fdـYp1 : 0qK]zؔ @ HT. [mWԚ61 PF#"dhQ34caD'݊`dy13AZҔVFE7Ze-o2`ɮɲ5 kU8cGpF$HmjTS񅫛YN= d8.2{Qzmn[GvE^ԧN5@rd;"Θt/딇{~I!py)i33jX;kpKS  Ɗ}#Uwg:`- 8 ׽b8 `!`$o!T aB :!`m!TO BbO"t#8avI ``0bzcjk n+0/5R"BN#d>p^J]0b}8(.B 8A:AbOmhPh)p40ң0ZE V 5CP (N& o"Wx/!^p B(ү(O(HQB9(~pNuZB F!%`OqPF|/`$Ur/2C+DP@ ॠ @`!1ONIfZ)0Q oA@`>!6(q !`dH`)HpPYP%1 OaB L[PP>*C0*q/ L!Ā:D.@bQ|"O @z#! ?Ɋ4 g$bʨ+"CR;hi&E114gj7F/+$7-mq#" *1. 25Q&r$aF)7B1)%("3Q7il1vv"2c@(⥂X'xxL &-6BX*є DP@b6ӑ-s6d!d))M.;,b9gCB R6(s@>%b; 2؀jb7 $f-PL% 598q82T nete)In (fCJ(ԣ:-3` 6|*ĊAP(/nC}Cq9X4/(4NDKsH A[%:21"J8"LA`a^P@XLFׄFsZM(%´N}ʖ4)-.7ag)~/1InAMnFKT o as&t6 l5D;_b6jͽ3A\욢v)hVquVo5WA^(|nO0Ԥu1#x %J/@u&FTJs#5\Ѣ6}hFiK4#T@c]us!fZ8駜!O8ZmUcYA(SuK?<T7"_$44b6ZbD^#U7 T5l#pvdܠx5ffh1Uu#u!Qu6`o6)x0B8;'/1PLOu6x^>U~S`bB ;wuLg># O&pXXbt)70bqtq#ҋXY-d&j.m/vV f!0QRPcL/Ӱeq) `a*Ҥmoy74A.0}B؋&8s@!$%Aؖ`,9:dÏ:gFXy3xyy]JJ\E" yyCdA]$G|?Me\F$ ]2cۺ [ZK Iqi"4W4?ՄaB}(`5Nde#r <=6R@؟ϤŷW(E3:L=xƦbk ` %;RFTfp9&sx `m;fcH恴fnԓo&ilbVV*cG;YFdE#bP&cC#d '*^ҏ;`MJijA\ ~@ȕJÇmS|X !ʽw `N- |=ʳ|˛ ͵<(M. mNK- `& QHpE[l2$d͈W6Ҙ$D5џl*⒫h螚&< 9@a\߆;3 @%8IA겻'Hn"0$tٛ )1Ѳyѕ2,K *[*Ҭ&[Q/lzѭJp~7vhK ]{zurMwv|E!D2Zu"'\L0D cA72^C @2%ƪJݯE^L)]w3 eqWUB ,@邋,@X03WzAՍy"P|.:P1(ZxD|31Dmv2ܗ _ۏ>zl}WTݶ㩽~>?}_ǿm l4?+.kM\z!)D DЈ@#V7fb#|E dPD6u1"^ T H\„x*' Q@3nL6DmmeCF%ːIfYMh%5os߄ yHIۤi>5HRl+_Y7N Π@ C0}).V_rg AAF8I2 f !@\./& / ot+'҂ /Q|R99h3 figBYN eȓ~"wPt $8~ %#R2&W5m2NORU-+VV ҔDM2RXJuT`OhCWG4h! &8"Zծx1 9̡p$+8|3^`}e$B&:EA*VP+[W9c-k Lb4pFHYmu\aГ@Ve@{A"@aϚֵ&D:J4X3PJTd)%㖟.3"yH_S#xwd6>!H>y^#틼U-żQ r\pF 40cA,TTGkhF "bDO6`)+;F>6 @A"< _܆YZI @-l?ikM !"0c6 6lt,' 2̀"WP 3 KOPF!FӌFM 7`2`?A/Tj%%Znw_P˸^LI jL0^_ XCU1D:PA0H(+~' KePRqDp-9hAv PnuIp=P׳ݐ %`p؊*MhirZd7cR$H+^5SY+|l2kA轉#3Ap$d4/ktc_V@49͠L+h69c> :8ЏJV#}vݜK=[}Vud/ώ}lo}t}| ~/7=o=Rpޔ$Ћ~꼾j;| '//y~#rd[ևͽpy _z{wjY-_BG=*~U tF׾cSfy7SEcW?{O_@Zh`'@J;uI~?v7y"_!h}?%SEc'5 j+€$6FuS)~%T7ȃ"?AmmCj&iSDzdSO` Ą6E?R4gÀZ8~i(a(45SStSj_Hxׂ@fcHyA꧆2ȃxL5H%T9(i{P膣$ji?hhHS98hUȂ2pPOXT؉+H }6_Hy_ׁx6_hf h҈8V|8~8,(hx᷁_87j_ژE@؍ve]( k(9y˒&NSzt5yRv$yINx{Dvip"v')y$yrv1)3IoX79;ɓ=? A)CIEiGIKɔu'_0-OsRٔUi [@ ] V)6*AՁrΐ-Q $ dkٖscy{ɗ+ Ĕ@ 6 lxP fY=3Q+q M!@ *Qur՗&K ! C)`:s٘2R ;Y79U i P )9o.!Qa׹ b4ѝ 9Iy WɚFP@|W 1 UŠCx 0d Z    G Q AG 0ǀkPM` ɰ .AAә ` * e  AV d BJZZW Y I1Yy`90C-a#b]0À(QA.!a : 1P=lpdQw΀ V +A Π x b .aũ*-qmX pj1"0qG qAQJP   `0ZvqZWY% bs (.3O :¤=d+1$ 1W ǰA@r( Ne Ubt]$`+ Z ;83CK( _(FmFa4B CQîP*1 p nP Kʾ#;:*qA? A\W> PHBYEŵ%DŽPWzɧ,= qP@K| $KQIuPTM:˿ U'@KgS,*1OP1kO: k gƐa P ; 3n3 q0l7!x|b8UV%NH R+f- @v6=@ޡ{8^Cl/1rX0qЃK)*?H_N+{nwmSz ɿz _ ՁP**,*/Zg:EjG::`DZRN l`ܱ CƚRp* ] P `jZ7;F{hXe諥i|s!@L2qJ"x͸kajqŚީ0D`$Y24;=#/8Qa;0H.w%.q'p .KA/;QWQr")*L3%[8iI4p+k"mg6!=r"; `LJdh"0"C1[%iIx0iK]>!,W!,PRH XȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜIa›8oɳϟ@ JѣH*]ʴӧPJJիXɵ`ÊKٳh&6ڷpʝKݻ,-߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_Rȗ}JPh$B=TJüNPZH#gΐ\0)yqDPh( u cB(#Q'Thᅩᆪm 38G10FAFk {ԢD).P3⣏@3j,D%HV23$BB(aDĕr23p(昕QrbK031Q<8Cʞ{2C1 T$C F @r3 vD`駌Œ3lFP&М]{pftCjH4#!@BpA35D04 30T,0$1avkC8̹4sn2l2Ā*"5Ќ) 4ã 5aJ2ˬACTbb/=0I0"BlC^2GP'!3.{k,D ǧ| |p/AC L1j O B(Bw9"lG|x3,~8SCx - IL% .Π's7w)0DK .DCu3k(m0*.B)4'8 C0L#0,#3p9cEWD0/J -1t.$c0;$¬Э;; {X h//3ah06! P~GM "P)6 dlp`{H2Ѹ-^ XQ<RX*9<a'@;-!uCd,#+a? ɕCV,!pF2ghB8>#{a 0fMC8FS"Lp  @D0clr *"p2rQ"F2~qZR+[H2artaP%`!QF"1$1?!S$"J L4D !F3a\PpB˅0[/M;e1"!r \43Vx>s|38TTY*ARP(3萊Au %"chCHP f cfX d!9.VJ؅ÊVs:uHS4G[!KHY MsxH04mX-R8.lh_[u 1.ry;>4@i$Y@ 8# Y@)c(FQ H4هpxrHVt`'+ Ќ?QΠB AmVh3rG@RYݺq 3LbԷ!pFQNl 1qDLb "c?9Cp31]U9Bx6qߛQY$a:C,B7 PdHD!|v;yRaapc Ba1%}[!pƩPSAëvW2C`4XЀb N~2 Qmz0$NzTCMkg q5j5Ɩ5Q 9#Y)X4 ģPzhF 7ڙ",PeMX}'B9r`-5l!"ΐ0l s /9r'/]"-gp9%CPsd$!*+1o9ΐל-y 1 04(1%~ D ed_?woC49рm>&1HsC:`]1%mHb'E ID?c߼Fں\bI3rq*xDޫ!O0;SD?T D%q!-:DIKP!0/OOOϿ*8a1 1>*A5a a ȁX偁K!؀"a (/#ȁ "$(4hBH(AHG0I\aK;8@фCQуXZ#x`hg8i8d|Q 3Ȃl:q\DWH*h0RE((n~*HJ(p_7P(i؇H!8VS聲887s؇H6qY؊ȈX茅qHh=<؍ȍϘ> xRȃ⸎9،8_ȍxȏ(9刎UeȎiٍ ȨXylؐՈx()'Ʉ َȈS؏iɑ@Y9xXh i*KYP);MR+6 8I:邼Vfi3TIkQɒbymviUkɏȔ ؒȗvhyYgyɓIȇr)8hNIh;9ق)iə !i^)X CٗNY1 Pٔ?cX2蓢HIIiЙyHYyٟ:ZzN ڠQ#0! & w# %z3VH"1"%RMCb a,u" ĥ;Jj@B}Ecc#!["ѣ'eZ]a!Kڦp! oe&p rZVJRO/*al dj§o*-禚v [:":44 Π 0 S}+s zS0[:@tA=\T >8.E4G$1L2:0/ 133@ƫ5H/ ae $ A5U*\ z0H >-r A-̀- Ww =d<ȣ< cs::볱93:;0 Pì OmSQ#n0f˱Qò36#=D>6;s>C<[;<>;?@v/3 0C!:?AI_ $KQ`CEj_0>DBxb7Db;y` LC@C ^|DFf$XaиE[QVr$C;g4~ %~aycAe]iٜa! Δع>!^N'a9-$N&n+*>=~yn# @(7n;ΓȌ.nY)IYaəa~)hI[^YIy8ٓ(.ohtrID Yɹǩ?~e>^S y/n9R~gq~Y~x'|ɖޞ~nދQ>hN7YސU2>ZNoYٕ^h"Ν8ډJ)ipYnNI>8o缩ƎNH^fN)/o);ǫM8eHB_)oN~X9iHM>>.ޝxJbThjlnpr?t_vxVZOzJz1.v3 ;(%G`o؈qO@a{FB5RGJ_0/8j"$?:"8 =A/1E^Psp 7:p8C #FQt-v3a@@ $W>`d")s$‚ #~RaH%r0gp4'HȜAتɈhVPEETR@~a#Q=N-SĮW Z2-Xetm[]Jլ-\v$,0.X`ƙQJ&[a<}u#grE`grNPkS.xzpō/4j`Δ!CW3g mb*ٲUB_-Iu1k 7A!.!s^ff S:뎂/f饇@fafap^`I>JoދoBTdѹKtE5)# 3 IIEq3qM )<3O "<0CADVEQL^D]w߅(ЗԜ@ qƕUaFRhfO`J5QFdE:O$ap`fe >{`Ź:f@_~e8d QHI4pe;7`\k|b3 re:kXޗCVN͇6၆.?@D&U[aXbnfjnY_bv扂$s+숀 =_c8WƼjjQ4gxk{W9D&fPn;sowݿؕelM@U)A#$H,hU" Bo/d`}ד` $()ٔ139M&Q'AA-*fqd: Fv=8@vexDڈfb! < Ќ[>X2|hOF@ " zK2G{ nhzO kgȾkqF綷 w=GR 4^m/osj;z7\QK暑ABk ]$fXdFc\6t}:Wr ,*o.>8_Xˆ|Gls?q!@:uOY;dW%/S Z3X1c|u_[f}o 'HSĶ=;z*klσ^}bT'G/Q|MG_ D>{>=Cr@;?R>H 4hePhe0' s[k>3Ahgx$9b?0](k;8 ,}K@ ^ <>'C<#+ >A0<ʃNaK\p4*|<144@3"` <88? fB&s瀄L"@23DC5dC? 8F9;DB#D5@%=C?DhDexHlENQ4dEpC8$4EQ$ŏ88ZL0Pzd:ÁdI3E6AYbPhYZkrW>MEAEXt2ELх<Ѓ^pR ~(CLD^G[HgE{ AA Ql,;CVb5g BP,qXDPj9YjS~Yǁ8-{ etDHtI8-| KGWÑF1ʨ\ d41,Y5\hcPg9H_\;_D=ĂDeXʭ,, L|^BʖLRC2P˖`CÜ˖KL'ؚL$?fK ,!QL_`̇ʰMP$x:\ӬlCfhL$\<' EL„0~iR_KJ dL$LL&j eXf-y0$B0dxdtS`e(;bltLLb&、4A A xQ8L:$ %0Rp҂72  X,Q-8gR+}*5 x4Q RRpӐ'L%= (.H[ -hԥ#SNTkeQUNԇURUS=V V+dh,<8u\TIU_a%bu-E@dEVI5ւ(eUVfmi  90np`dWqsEtUuVex-U;{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،0` !XYY<(MٍuٗE0 Yق g@YY= ؁pD6E-ЁpZfٟ٠-=Zm ٪T2?IڂHZ[ڏڐX[2mۈx[Z=XZۣ e2-я[8,"ŪǒHX% <(b\mVDž܃0]܃@ݒڅy}X \M[[u Uཽ`]Xm[5 ۂ5Z Y =^ Dۡ\ P-UAnes] 7ЌOVUގMt# Q3=_8U]M-\XѨ60F_W[-fs  a߁0]`, !0]bX'f% -R` ۼb!`% ₨`ѐ\ ީ0]3b&b¢ܮ^:ԠFX7q8"IHIN&IX>ZZHu MD)316meRs0]x䏠ZR2]f>k>Zlb1` >rT4!1gzf]^9hg6YE񑣵,.fp he֎)]jg9PZ&7Qa3ePQe@`^a=c>9Z|2hYas`V <6#Y_EhHgjgvMXKDNd1^k`:Zʱ$ikFkfkkn,ZHeؗͩ!A-ٚ2efѠbfʛcqfuZAm5Xmf܆$RnlN9nٞ|mFɉl8iI[Rp,gйzmky& nN@SEo{ ze)>Zm [VWlܚE&)eG>o`B̾nw kY>k_K#$w&%RGqb"TR$$9,)%&G/_rf=\b#%#Z"o"M؈K~*Fh5gABg2?qs&%+X3pv*GoۖlM:o&Z9?:@n2eBZtyXKmX:EF.)3.+PI*t#Irt*{:bߟ^2%c'[7H;.Y _&"-2t>X^2`Yet8&[&qO!>r.X=*բ=w_cf3VjB#ywA%{d/Y>W\'s)k"m"U \UP`yFI+-꫍{yƂyだ/@Zz.Bu`mVY<*+D//y4CIJxY.^ 6*+",)su]|-C^'E;TJ,}z{Xۢ./Evg7`p?Z z"0:tSϟ߀!x7]g=* ةpr}&q ZG.R-oے|8~~yx+~ȗ.,h „ *f"tљD"jFЇ@WpI U]P`Fc 2ZlVL e @FdlnI#OpٴYUUodmu PD6mzSdNnxȅ"k϶u[T3m gjnU @A@=H 9IER; ' us9,c쌌t^Q 3x㖚hLBB8#Mv?Kj9SAO1 _L@R>>K!G@Ö-XU ' @tmiO|Z22 ;1+DdNHJ2/(Hy{ݬi4G h3%~)PZE=jR͛<3ӬR4mUԐ0Q(ꟚD*3~D**:\"@ZZ3UU%P6?@nzVs!SʃPaP:C!}-loRSdpc(=Irp%`5[O.7LeUAa ŘLQaNgBL7,  ɀ2Ĕ?xĸ% yE`V 2ץO $-~T t .o 9 %SD'a:0fH Ly^Q~a$Q!|Lρ)і3z/ W c*cXǼrg@1̵u}Fӻ< `Xgz a9hYHbOӒhɵi+jIl gt!~6M$k1} k!0AN0cAB\MmȨ18ammq!bEwRs 1.p[E/lLل6aw}M}|`bD(6Bo[4z |_-  fF8A# $~rFC/s߲:"3F1}p$d4#6ywkH}?3>/Sֿ>s>/??ӯ~i m[[mɯ{7`BPD Ax:Bۉ 6 V,$iD=Bl%# _jAl៴ `մy+B1؆Waz!C@ * -=E! ^Mj`D18 `U`WT~ A1܎g$S!MaZaMDFS` R"D0! ` *"Bt&Ť "3d|ba@ĸED؝@$֖A$"cbYB̢r8'P!%b(V1~&0"Q` a\\̞bAآe6Hu,cXh*:3b:bL49D>Hr@@LB?>ЛHA?Jr|.5&En"CDD* nGD4n$-ZxT$$c5d!d\d/҈,46)TL/Iy Cz!SK A/xD/A6&RLSM6U95C/(}DE'BÒA4)$211W>%v-l_jJqU2.e ]*Qb2AM`hଢ2PÝeeD 0T1Wc&1@&a)8)|/@D&2fnDe\Υ@0IDle^[¥\Y%rJs'SoNȦeE9JMPAXn\/4ߡNX]RFnd\gzwwFUe@H%aTeM{@f@ 桠g)(9!]bO| D'I " %e Z[ }h~ Z\iQ3(`HH{+DB$ .b D9MDBMP3(C#D3$c,&@3,'w1"tBu2@)*) ؄,30C+*DiR:vzL30VBj4K*1#4꣪ q5C+atDnj**!22$-Dak⩞nȩG)F鞾:.^z+ +*뫎" SD)CS46 DN+隶~]:+fk ĕ:Cn:Iî@ SBA'3bXd)FЅ.lkNFzi*,([l'*iD @!@D@4IyL~mϲٻ8"m' ԣ̤(^`WKLT90;03--MMb843&.3M<k1AHTn.j8C+,nFB߶ɤ2@@$Mh8C+8z﫮 R㚡a(F.MA 5=v^´?*3-Qq-2Mo=.A. :̭hp.Ԭ-"֮.Iv UZJ~N2D@tJ@5%/ BDZM)@ο^ʞƞ@ $S؄@MH(L NN y/0*8HX"yRL  ;C*J.1z!1@/04@}@Tr"/2j4H 1`qq@!%+2AÍ1(*g-#2a7>aF*0 > ,+O3G3o1+)'3aLsUH5C0+&sl4w08-hP|D9200@9}|%002H,l+p*WrDŽH]H7Q$,tT]FkOoFp0:. VUO;C{03\2qyzGV'.#vuRHy# qBh5XE|_  W7IRs/&1%@hu6xGX^+KkOj(YXg [OlauYz0аʊ@d@46@6RBψ2RCEW ,1A!0tM- ϔnD EijEH 8մKθO VX]LüD@3$zMàT؄(+Vy ňsȋР S\{wt Íճ$`sSGww ]j47 * /eGЈxsӰ|S%|s{8 rTwvoM^ v̨|77ɓDI3| 5e84xӷm#$C03<` ww D΂tPPPMEEyi~m[z$zz/xN1%yVǒ7!}E9]>Y}<u+=3; sW8Ol&PvADw%6IƝmxD4`ǟ2Ī| ĥRVĨ?@@f`i`CDJ̙cQ,Fa%@Ȇp9pL]-0ʁ0x@.aʤ MFK)R0` @ g !5 Č/9G` b|%T3M:ڶo= ԋrIY_ XwdTs\ͽ<$ `o jB$ÇȿfJQ 4a/` A> K1FĻ!}d-? Y뀬  #qHL<ϼ7S9;SO@O3jCM>m>FTI)K1NL t.Pe NI-uNHMTYmWaOe oZqU]y_ Va-cMVemgVikVmo Wq-74DW$\նw1Z{WtcVMrCu"$N=&S/MIİ$jDF2~xb\=MU&9[N2 of}U[^ 4!f eH,KәNƛ4,cՓhba栬NJzj,<n!Sś<ĻN)FSe=C׀p~g 9 bAix11 X(0sx8g l >d ,p^.2OW3i)Ul`&T@$Q &~ьBy!EeaH1̀?|Gh`q5e3@"74C"}zq^r @-5U #Y3t!F) H4BL![PrS887q<$/?D [MF(c$㏁d=1~f39x!1l1ќYg@F1bKE2r  X|a JZ'A)ʆ87|'\` DFN.1Le:#J˧3It %3Q4 g첗#-eIRy)#ɆTS՛b&L!jQUVHJq}vg:cڠ;wAʎ3@Cg sȽnG(blɟ!fA,_NVX$p2> 7tBf+Ѝ3rq56#e p jSvtd(NPԍ̯sA@#! 6! .nn`!@bCo D7a bwJ"*z*h xPG ƈCp!P`UDza&!6%0+D/I!az(nPLP+Aã pP7O" l gBPz!:" L5p6į |j0&$o&X"7ϊȦb%NᒢBh(Pz+m!6A? !Bq `ojwK(@JBfb#&̑H5N` h NsƆ"="  +zn U+| b`!qV.b,-3i*Nn>G=W!:7o1/o/[7bCB+Bsv>AGJB#9 -s648s fA k<3Kt&X9"CBKW[&Mq6!`&tvr7J/f8s x>cmfć4G! U;͂f nrAStaF@nt+X5fVeY_5VOkXa=k+0R8UNyj&L"* S4 n[[ asVTtX3;U+AaQ+LF+YUQʌ(HnH\uf'Yc;v&Lphl ?/(̕d+PcCO>5T?!Mu.ufgS!#N T1n`SAu FP f ek-VQc^!`&+5 YG !\T1ܖ!JTH h@/+a@;.A"ju u !# Ud&J sVyvT Np!qrWq'Zg6 Xg`.mU\$%~6:*L\qvn׶'^̓ @wyH*5H`.wZ56|17}7w;("6 oWp 76 7v_w^AX}/ws7 (CZWv-tQWuϤCWe~(7p/7Rxiz׃u]"Blyo‚!uy!Vn"mhnTbׄfw okq7nkV^3xɖUc0 !{'N4á8_ J!x&"fW#8d.A3 22,T"*teRtA*j#2B#7.fbaBu9w/B)(?( B!#PP _9cXx=5g&nW6E,@B%:R3Yg"CAP@",b/bCqBi:Yol"F,:3;&"$L:y9JAӑ a!4.ڸfFf9H@ #4gfbJR/ Ac8\cVpZYJ!`  dx<8,;TqDBRx K<+D6LCL'I2šdy_,ڼ<α'b1u\OJ oTcQkz=B֟\A.R) d bhoꘒɬH7Taؐ&&ɛ#,Öpk] 8is;5B ,CĪMx (vߟ ʞ( Ib*?d+:,˭-S +荞q{~o矞h>鉼q> ˹b$ ƫ- dQrJK+>+0g&AƂ@ľ|( 9tv˱ K(+<-Am٭<H ȭ ,\>,^6 ?8ϰZd"N`-W#~!{摵(o;>g@ ҳ̵>SOMo r䄫-Q//ؾ~ݾ.v`H |bJJAU4HY ZYvPU8,S]|)bLB$iCx,˙]z(s A8TZ0.c1DA (LZiY%cg"}Tf۹ne{Q۽uEүx*=\Xo_|6\1dlxpś5|WgĈ-ff3j[~ ;ٴk۾;XHRb6]6 ]-3XY*feh.Zf~綯tŏ'_޼}ی pL!AT-FY::0P `Rtaķ0$Y5wtJ1{fP2<jFiY\)L7bcF#^'[I")'ג0eeblAd|n/tktJ߉OJKr>:! 4tyHc.9/JtݓB3:rpc(=(9]5 % >)c PTdJS t/:w%6tGC:Ғ}J_Xi'CcASU2}2ČTQjNT`!QChBU>Y!ouF\a (Ğш@ Dň:%;Ս_li;1\CYP̺VRBY7EV lE ))/`d W%+ L8GRjp/ -3]%7+s7!|}es 6ͮi+Sa:lnl&M '%8?,&,c$qdO5$>1 g@ @F3xޱs-D. RE(yJޯn$3yN>m@p>! VS0W\$ό4J9>@\8Nrsz0)YX py% PL) 'v WY qZcYP %  AKv U(=JB_ YJo7s3ws63͉AC  r+ UJsA56Ѷˠ lʳ> ܉;JJ/VӴ!G7RKH d aѱ B$==K˜k‹sgtT%0 z*;>D;5 /q\?B Ơ 3?˹qҳ7F | `љ,b cHMIqIMʹHT Ip"lI& t[m '4P4\'| BCJLH+!΀AI5|+`l 0ʿJŻ"۴7ú L\X 1U G뼩b{'~esGUX5WS|Sg,Ȯ2ip: ðT'){>YemqV"ER>YA ^'x#Z6Ub QU¼rΐuLSpvׅf1_\;Qy| XlI[` -| u\ c ~ -Mm փ3pcR)]X_n*xOqRMs؂~,::kl* ;HKP 'Cэ&XV/M&%Ћ=oQ҉7AM֊V LP> mm k4\4׺׃(aQ8_8(em؄V$, jx$ y!ٗFЁA(]MğXVXyM/N}س-i`\r8ٕysK*'!t{ ísH9J9MY)df95i[`cYNM :ɓ~ "`) ] P 4q2(#Y'iSYWpۅ-bHi!Π<2qj:&Qʠ Ȑ 1iX&$yc$۹R 򩐽\BI 34ae515VL-K+E 㩋晕Nr~!Y mug`4Lf2 A41VZʥ|_ZjJ%qyqy61%XnIg! [ !؈2RbV28:;ڣ7!Ml.v~6:赹w|cmϮfe kI` !: PǚڬZQT!تX1dډ( p@ J!\lJ( ~*֎>uJ/h7Ӿ ',2a}"$k(z*RxW9/)YI-Qh-;V~ [ uD_-G/O@dO} [?] aL#lbkx|뷀UӸ0#3Q${4>?@Ti~ :#,#.Sf;rC71WO(Y#jJrtSXoi #?u ٻ+=k0;#8;+Fgfa#MϓsN:N{W`vXb5X2eYV:쪓VdZlv[n(@1V D3nZ?u]xw^z]w_~_x` 6`Vxava#xb+b3xc;cCָ]K6dSdF,Z`0J: ?졛sy;71_*fbYe6h\YeZ^%`pW<)*zIp J{ bƘ^Af苨}l]HY(ˆinrj#|iJb'2<$6B}"][>;'u8.uqɃ~xE!0&t7U:䶉MeI W>tTV-U.`yBEO}z?+O񐧼\`9?Pi.(pDq EA>.Љ`ؤH yQaȦ+C0dÇ4X*6N0!CAM ȀD3J <Ѕ|aDI y^j"T 3 !2q/"-Kńx -A{W|/ƄFLH9$OTCs׹ .& DP",D@TeD}XB6!""6JgrC'zSt(H1{d.K$΀ \@_| 8_a#r X'bq|DA ]Z3fȂ2U %RXY24CİD(CH-4X*(" ^Ȃ?O AP|/Qrԣ%>wiɊ12h ` ө'=jN(*Վ- k/hTGj : 'PUisp[mQ tn kF qT7] CxpPlO0 , d+#H?3$Bdu Y2Bġ9z X pF+),)@L+.k/)Dmo\z&]p{܄5>7In@|W2b$9ܢ`%p+fC8kR o3Mp98!rCb %p&v $PQ@5aYa\ؽ8*!)H`ng5.(zćP2 (A@8֍ A 8S~q|9"N7T Feao:CqDFl`Lgb,^3V ӡBB<% Ѕ M,R'&a CF/Z7{^>rD_4KLދ!1ZNh>A:.#n^IRh'nw$/z rvZ=q+{>4&WQo56n&֚x+w3q R7d-R-ƍ' w3 kSmHCYʱv7pdws 1y#K{u"pwV2 @B"&: SEː|XϺAN:!;6) Bx\OvBfnqG`G%!7,A8"չ<敼ږ.R|PL@08pƀ >@} @bz ^ A>@:"ϏCcZnB${$?AO}3>s@s3g@l>s8^8p=ɛ@   R]h8x =pdq: SpeIhs58 8:z8&ڶX>c %#ZL"h XK 2(SЄؙ(B7` $%H8@PA`AB 걽| |DH|phHB!%KZD26g7.UT `eX١ %1&K8%q 16ġ0z/p ^u *Y{8\(x9Аj,xhtRÅ`e(8H_ .k̰fPƋDk;R8HS\<^1ųDwiD) y Pѕ4{RY$O9Zi/؂ H,%g`8@IW숐HJl (f`g+dh I\Kl˒J҈q)K -Ԇ +˜:c6r_.$c0,u' pE$ 㑉0 .T0dKHQ@/|@03sc )+Wn,j,`~a@r8cܕ.- 43@$F' 84jO"@07}# ?w+Ψ@G ]4x,tD<=FOP^Ї@2P@bjPP I398|Y^P:g؁utǻ s GHBp83:2p:6AT@ Ra Q'Re2ݥ}BF0&y3CDI\bG0A |IawD"]$YdBf~!Dw#, gx"!D83pRGP ꐇB$"7z (]RZ(c3tR2g*ΐG5ېAJ$>DgEfppdm` /!c ѧ>q&2LcH3|y"x .[>3e0یDC_h/ (/!R@VA$vj`w/rtSQe(xN{ZebV@@(XZ3zz9$/v$ܧU#YjQ: Mmz$MMbDgxGzUPS8<neCD S5^$-$]e$76pm <$ ..  @ )@_mP\ڮʬEV;϶BΠCDm%\@Wny;zZ֦Fb;x-3*`2G E^# {apK! Bj 1 9̡CtxxEL!l RLd6X *@utV!O㱏aˏPЀ,4!al8^ zB 9o?0c09ǀ/ A3Ĺp08ǏLRL2hEլvm#-êP B0H6]3"'Kl\X  e'>6N@dp/Qa2 qf4,Xp629Rk ͺڦܭ+qPg @}_` v/6zҩ$ռm{}k*mFꖻ07ObٍP@c"9/H1:$@N`H) X @ e t0 z:k4<ԩ|>#bNxPRqHϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8XxI ؀!W"AH$,gt 0 a`9!8;QGH p7 -J'O4Πt#*r.Fa7N+`J8PU8M\L)A:"[ LN0#tla7QH +8 F3  , %FQ3шcP7 "D#l3uL(ӈ!xEQuLs P戎p!hя֏ e l Ftȏu3%R)d P`Ȩ ˸x m2}# Έѐ.h,cA+r+++'"ƒ++,F@79-l8<).mw.T,ǒ,>B.`.1T r ѕ> P }X)B*TQ&(V j_IByG'gym  Q l` R"(2++UҘHB 8))v z&*M)Uћy) * -Ғi&= g7hP[I,U ,.uy J +uBy" ` ё$  @`H}x)b4)9°Ɩnp)i)ARQ770 =V582X5]5a5C6q6i#Tm6q s r7g7M+~ J#z8sSX5cð?$11CPH B8027`7c7ڈEEz4Q0 ao mF7s5;C8U{3PG6:3Z5^6)3vz&Z%:id+404AZQe*b3N*Tc 22:5 y㥆   i5"Ctc7 9 7rë$8 cLu/J([ @X\P<AM =>4J<%㊠DCHcZʥZf<_YӢ ѷ؄TATt%=(sc?8S ==@ $A QA>sZ>@#MC* @b6[*^Of>0>HE:^Z!<:7@{v ? ?qĨp۱ CAKA3} @SBr[[d#KO+R %pP*1 QsC++K`eۺt_C  QH R$]=и ,@i`ŒtKG| ی!QH" AIC=5#q @uVv>d;QJHH 0FptF A9d=I@DCB@](:d % HgE-L``9 #xZls$CTD (& tt }=щ{<9s_%a= +օM !*ȉv V}>]ӘUU#V1'^n)H̐RmXS`M ׽]}3٧M4"!Y׾U; N>^%^s2_A`Kf˳PZ`Zq `,\u㠽tFI;"⵵L`޵m$ngN|L0&,ToM5N>ހᢥ `~8,./~瑮^S]]-a P =!nC!$ދ^'l2I! AϥFx&N'!iV dpsVgwv(zcMtd$h1hXbhVqC!!fnCf '>P}Kei(daMbvbvNce6fn^b iz c\ݾ8t3dqi4fc8Ff"_ aː ɨ*oKs`gx훆| edJd3ǽ谻f KfDFq @z @ A~^h^B{&A`fhF6A]{ɄP lː)We΀@ Oh:f8㾾 l0r&mn@pupMl m=ʖhRo1oڨ%m'&[D1(fF AKoSuk_,g c F/ ylr pf@@4svL3F/rP+E8Z8YbZ63L]hfBˆC) D%E Μv*peKui 9YɪZF Jkفd*P$I@kTiFbNa8k&W9=b+ 3(LfM!K `- Ă_k2nKbƩG\r͝?F ȭKP<o/X _n|9tHD'2TJFStCV`)>CT,#=2K-K/kb1/4.L24M7߄KV @i&83qO?4P g%B E4QG4RI+AK/IK54TQ9cT8)FUW_3gcSYi5W]wW_6zh3Xc MEYg6ZiZk6[m[o7\q%\sE7]ue]w߅7^y祷^{W/*}{_`]`0r "$Kxa--(.ۆyX׏C2 (VudXVN2ՈІ/rr-[` )t G@K<)f ꫱]j$#(&"fZMM^q:Q_;5s7ߦmW9g .P,H Om5AO•AɛYFrUBhQUqӔ]Q7G g>u2;ա[|=oX]\NQj-w_>qb%(]*xpg_XPsڕ B 3:L:ngxH'8Gʒدm[@9ݵ[B +x4X*60N p2@@jp2(  '85@/@*j@ &6n WE31 c #=֕!)A~!N'L ;P 8B15P 2R0_EDAt+" H HEEbILjyc@:=$ &(TJqb/ ]nJV"É!dIhBXp##)V8g1\L fӼF1BL )TӔό#8QU2ј.32q*#O&%b7ϩI|s 2O(>}Lv  cIZ2nPfd%xiLgZӛ D,y)ABъ` g9)MmSF*6 p30Hf(`F2tHDb" S)sP*S.E3PUg|5,QaT PNe_ @M@F2l! <6K$\H9@GpF$&#Wg5wgp1 a0mo5+gphI{\D|6[ W2V_3TA 4.p gƴBE-s9dRԣ^,fg;׺3NqYELuVXzbL|Ӌ.DfO^6_Xֶv(ЌaLps.`ta'aނر@E@(^BF#+o+(epKR#}섫]PWF>P&4^W I1/Y]g[ /yMM)wm~- Г@DW((ჀG@CQ0B^-nYۻfhP 1HA F(Dp2" dj/^8! ;#6{ .}wɭf ; Rlbõ@$~YD. WJOУIw邌){YH?=T/SOI|:ȩ3y8Oo>8> (<<;s[`f?@ $==t[;$@sERA>:k:fp  8S\fX B"B+ܡ]JPH6(7:\ bB)+ۊg¦ChBBB%ܶҵc? AkDբ3)4\6YCDCT b@.n˵Cx !p\:$\DP>R%L| K6${8 H<̉=,\ D[$@B$łė8FCS`:ef@clB0jt g @C7 FFvF{OAky)YIH!fȁ,Hgxe>LHTH @) $h1I+`h[pb7JG=cЅbtO@dH4M PP [KC^pacKg K4L" *hQx|RdPpPO)U2қpџ 4EUW(ٓuV5XO%9wpX1Mv5x]Pd_ a MumwZ]Y؍uZlLŤ֥FB3zת-׈pZS%[-[Z+VZ+PۈUi]e%Zhr}8H&t?(U 5  s ȉ`d@s@؋Ds5E\H"@B XU]08uڭ(W 9m\ٲ  M" \Z_Ap= pvp^vM߼`ؐ pFeX5K [l8ު@_ȋ^&ag `V>=\qa]?Y ,bH琒䨒:Jh? 7F**c5Ԙc$Yc8c+Ԩc X``D.EHAb2edLTVWYC9;ɓU~埡]QZR9TuU9d.fvDl.}jklmnopq&r6sFtVufvvj&/gX.g.Wg-w^gII}v  >h踙rJИ闠h8ih.1Q?iixi,锁3i6YiXiz@-0jbj,`t;kYj^^~J}&kF؏6i/볎vMcl16- H{Ci_FiGȮ׎NVmk8iA.ilmy^ljny퐮l^iTFF~Lvmf:mP_T` @ |>땾&o&vki 6pekpߎp.Nn$!XGIb*(MbV"0":&WڎdZ'x&&h]^(s(pp/r"#/=2$N!\bis ."%rh4'p(UjWJvvt8r`ZtU2t.$ 8tu6f@F)(KOT_PoL<'$$oukur?'V#R&m&3O =[WHG&ROjlmި('lgϦvhv@~gP Eh.1[o&+B+vB,0@x*{aS װ+u6yykO $Mj*$xy' I.R_Ă2y?˨2oi?-8S??z&[2hg0 o_$-'k O\whG0#0Ƈh0.wxg/ kjhmwǿ+B||ď!zHgds Q496+5X+}._cx;~stu:zuii밠E5E48w5.?Wh#T0gai̍3 #PC!K ՌAU ," Ղmds+g38sӲŌ?Y5TQ |bJ@U4y3T0z5V: *VZ`'  Tκ Om_9XY)U9_~m+炃b y bE>#"b71p 0< g6l0kز7:Q3-5 x * : 8#G" 3!LG I&u3, DA1@!8 [9GI,Q2Z@Y `ҕW1 >t[4y2tRH3 ҋ"SVyeTɷ&"di%ZxPBRr 1@$* C!u9ʵKs^IhW4Ob`P<(%I`#MuUPCYmIZ'B⌑w{HwH, M8Jp9"c+Q@@ūF*vT$ tT,mdTLh-6nZ,)ǜwILu̘mOz-ǒÉ|( pl oA !)2- 2+Q,,9#Kd(3ɰk TEpJ3L;*MHՒuU BTh,[2% -k;ӶZ_Խvۺ  FD3 @̬bn:}PSw+@TW'[w>Vc}PVw˞®*kux%tO t .-\;ӵ+ʹO[1>ڐ Գ7?;ϒKuZ̯>M;S d{H睁\omCw_ R%9I'e&3/PDnHla 0$!1-BN吉r Ld. $J:͜| 8̌3OZδ 7o &I rĜ+(F3Q&8䬊; $A !3I&z(o O@D ĕ1+-Q""3J@ŒLU1nG8#!Ā > q BUZ͛*Gn1Z^8xA2U*YM U<dk*b5AKb {Xȓ)hSTWfv) O{ *guiVT@.  I? MSJ^ll]ZVʦiLt!7;@J/msڢy 3qKJNW XfzZTw<@`;g [| d^Ad0C,xFXh` !mg4hL4={,vqUcPÐ Hp-t &WAmF] 0/rW\Rյ̘C.&TC`Y\[e 3Yh[l"e>s1̕$3c"= p^v//Ȳ :BA24(U :I}~RᴧI%@(+i\:ԣ. h5T3Oy ^8]yE>r,"+`۷WoʺF嵑>&z-NuW5 kAϸ7vFL#o@hH+թn;X%gwҝmvОF}nz6l*`&_t5>9˔e RJ  ]Dn2,Y@ngBk iPzPD"L%x^ B lOFR.72 L;p֤}#᝱ ΠB{"D~^AKJxb <*84vK)^򄐧O¾v [;3n9{NqE$+Z" +i駽C}ַ`@&L?{ uu=^jzaM/xHӠTm腟@:օ 0sA3 E qK)@ - Bf{LNE 3!F@g$Ȫ( hvlH(@-BRx!&NO,}@TA!Mʓ Ia"Z( BK3AX#4@3U4f6am#88Rc249#С`4>#??ޣ?@n3@$B&B.$C6C>$DFDN$EVE^$FfFn$GvG~$HH$II$JJ$KKN2|KfdL"L&aA֤@$'"OPM@N8%$ 4A,$E}#{,$@l%%R" uQbX%$j%WNfTYb\ZЀ,XAPA"+%\@1tS(Ũ 3|3tdF*njOCe#s  C10mev i4&3S؍3lnfj.jbHosHse NLEa^uW9f\ԇ!&DOYI9 fiLy u-4(/0c(8)wvA1SD*l*D@H(fj$dpZg gϱg^ $xr/DhwۜZ(vBA("Og˱D-A3@O\ĒjOgD- , LG J.Eₖ`n)\ pRliBDO 𱩠DOxM<9NEȊN>j=gigr0§֨C @B2,*t!$4C1010C B3\#H,2R>!QCAA0\.d/ucjD'BAA/O/ 0yl+@빦@Rܴ6@4.GE 2ӌ+^tAH2؉P5C/y%K+*fG|Mř1߀P*@+n@bxnV)ICА](l,ЦT-/B鄿Fkz 2X+jkMBR ˖R@2jjj@-ښ,ֿJ1AD‚ΪB,,AH ml f2.l>@@.-% @/BA$@Ql 䍮4J@BR~+;*B @ 42xB,p]A` 20F3¬0 ,2 BV@0Bڒ"t1f't+ /̯3V,ò3=oN/L5/@ .nDB$ I +/]g o/v-l@((22$-\]po'40\024B$0C2lH9 "0E3B0\E 01b K/RJ@-!m=*-V0D&qx(3DB{ /k0 ӮCo @ ð -l1uc"K!wpc rαSp[t3|/<r%F@i\0$#w =RGT`Q7izk EThGO'D .6.HT54SXg4Vs?DtLtSbDEVѮ5@cq5XuNFtGܠ DA Asd@ lna3oe`p\8AOn~ .GGT[usBT BȈ8C WjEˊʙ ''KwJ I w7^O6Ut#l3@( P711( hKm;dD)8 K%E ۑ,2"ID}eI; !фEŶ@Tqм_XR3Mj] T]4@@ԩ_|ڱ\sJ9? PG;á!ROOA: Ob?J&C D L?'M{=@#ۅa0d4upcn @2 8tă C]͙'; @TБ?gTiSOF:jUWZ@YYf( K̪ */~`Ǔ'=9+!Se m:Y *A `I)WA$ MIq%<|4& B"$fǑp 6Bgq D)!Tk匄@GMzKBa䟒 "mi ,gٔ `ȺÙre i'g|3&zιک'R;UQę Vgn d2F !c _djbr&:2<9pڵ"| &B~ (pU DgApB耫YڪV.)R`zNdXF+gB2T$w!$̨%fƐ͈S/I (gIAh00x $ʈ?!q?F*ȸ!]H ,83YюMYlcیVu,dK{ƖmV@p " oIDvzJ3Q.n{)>mX7{]nװW^je-UZ^j׻m{_Η}_`6`/ v!a O1a ?خdwÃ%qQb8SfI!VOO@y?)X*=@>O̐!C c1U_̽ ƞl)?9Lq:|S8Ə+Xx8F-GBa,qfaJ+e(I/GT~L9I63 Hi4yBҙ޴hjJ;ЏGH'UkjU[*BJ,8CUz CeFv;ME} ! @%}hdAmBJU_oOΔڑXRTAʮ7@jzЋCi)UlC@)U14y*׉` 89TNWOL:2G}p1r+~oS>8i CGx%I1:O.s!(g ȵ^/<~ьf85xvZ ` hd,q5+{H? >w-.!3gyZ2/\O/b)RЌexپ@ ] #FJ V<=(,T)% 0,5kg"E$hB sX2>v UADp+VYn/pOI/fZJJ/f.ďNjVtKB o$"0p48pwB@(ZxAV m Dn0hmZziz|`OjP im,uz0  Nx@ TP`$DH.o6/4/6$VcP HhSP BbS&/qxȦS GocRQQ~t@ 8= 3R@  N0MQ A ԧn/E1 IđF‘ ˑ̦1pp: $ `XE&Fb2/<_ i {q^I&!&鴬%Gh!b" A @ &cH L"O tqWd=\!Nb&R 22=$r#ґ 3R)L0o  Ռjgʟ8%˞Rڎp/gz02P+N!fp?H&ahbCeV0 1[/J03^2!>Sj!8#%rbBU62gjHvxKVBB/2bp(.#79"=s$s]x/2 s _.P.AOHp3/.2 0>SQ/5='0n$ J@ ";s!2tbFT J4M5"$?5QbD$C;0TC#2=Sp4C7?Z!`a" I#`BYH#r#d)$x9pR$j;B&p"Nz!JJ&"LH)#a `1R׳s?ٲ/S/SuLO1!M/>OL @P7Rk,#sS5B_>AN#/+8T5GMT(#4\, @L~m|Lp(hbƝE2|HJu,xwyYɕķ#}!XA !$![^m(?s=Wqw_3rx. X@Ӂ@YO1-RA9sb)*1s;WFj) J p)* `X(*n@ !~* *%CO o#rxe&Ԫx)z LLXuLlEm0fӰKAm͊@1xWOx`ؽk9NT+ >yJ@$y%ى+)y-k AyIL9UyY]a9eyimq9uyy}9y˺SCYYD9ڢ9Ek?0Wʜ] w{u?}KV1ٹrY>y yޙ-Lm-B>%ԟ8Fq 1jy!=w(MJM?Ըa p$Wا|G\%w% WI~Uз}7~K#k>r '8Q=X= 4Q m~s]z5mrQ=^ubj^xޡ):!;}빚ݻ}~k;'Փ];}# ?)=5f͆_|9}ًM}*O3|F}>>YYI1kO?Ŵp_]1c_,AMq??? BL?_1(b (a)ǜAǼSԟ$ "܄@:լ[TJĚPo聂+ l!~WTUq崇6Ys5NXwg5w]?룆l`kb@<Ҍ3qfTF0(GM\K3mBVs L1j&KefT0ä[@L1LL ) ,# 2.xLk,Lc5aJ2ˬAE&@Z$2*NauK<؇ApIWG/d%BH^igL}jGi^iV@8 i _2θ3hPfY+>I 8-eaaL3SZ0L#0rMe+]I$ Jx+8 3̈́H'hI'L,@3k2/!lFkf'`0aB+*z,AAPAG8 ٚL+, 0"KBMtF-4X؈Y>]*3LKka[@v@8Ӆ@sG3: O8@btRY6c7D 1J:OL:C !U~KM>vٝ)Rtl7o3toLl;Svȹ y+@pè.6~: mpH~O>J0L Pw(20V3bH!άx `iB PAp !d0He$"Ds`ED3_ chwlǭq5H e|M0,3Avgq32g`,Nb (B sB. ސ ;gE,j4ٗ8qta!1!I] #x%lJ1xaц8H)g$ `"yAHKD(0 !C+8_@F_,,a)`R ͠ 0H *63H@+B|*4(}Y A3ά&(ٔ7ql; 9$W)XCH??#CvR@(@$k Y AH)Qu!2{( BK\*;7 Y 0FǐAqع=)3i\Ԁ3e(V{dbM\gFP-g&bwh7 =8g.9Ոz< ׸uA0ʐQAT#@z`J (Y8qQOn'7h pxDT8b7O8D,XsX4@ DY蔳d95gQ5'TirCgvCP D=#UpD[ b^xbatm{ KepHGrqB}-D%q./DBg Cs(3,+Djqm%,΢& 1 ,`W4UMaވ jl{.nMHF0@|`J$ƱkU$iĮViY1+l nSaax]`o|<.`h\Ŝ_d cL13g " *@ %Ō]b? dhKR_pЋ[.y.ƕ-2Tz(Ay5JS P3d@L6&e,4 ѪRsݲҸfe)vAl5Z&3-?AL6;y/Y5dR rխ3 C$`C&PH2&#OuvUVx!'/Kn& S>W8uK}TiW0ꀚ b U/ώ}t}| ~/+~vK>n@t|+]ahH'Ћ^#KȚA0A 9teA"@.TLF\?>"\b*&$ \lY\dcm2|<Bd%믖U2cϢE_:~ ~V!1  FR3r _ B^ Hm(B"E"H"%abc )R (A&H%%lB# #UF" ] "Y U1r!N%R҂!(WrY8p)r;~EA+1**"T ` @i*}q.R,.R3Cm0-n bce0-ۂ++a@vA,D r++,P// xa+bckZ(WJ4!'p }cX-#6X38\s P!A9+s9= s7y{EQs:::R1FcCrp GqS&u5Ug606A ⌂6(:8l#ou>X@&s?? "h*?&aB(B,BC[Ae@%DA%)F(J U ' R@"(Ud@!r9KF'h2ɒ5mptGy4̸ iHWHA 5by9H{JKNT+D)NIuiI%'r@%AItYldVv iGHoI=DO!AOA R+R/%\cE[>e0TΠQ!Vd%QK Z ~9u; 1`Ne P ؛x `  vW#i)1X% ꠄ5 Z [\YA [?Y@\ߙ+^ !YPdYjecYSu #sm![ g/:.* SU N ˠYU_$qAv `hPhH*d`c4cd^vfyLd`ahƧڤ7aW )mp>NAaȰ,G'bN j}!Sbb!"t""{25! <"iQ á80 ?+BeEB'1+(w2'"!8,)A7#;#a h]f@Hd 1j 7V~%`,1G8W4 $n\y@R!3" 79;]EqESC!hA?YEڙ]#42!7`3Q퀭2 SI?CC=]da@Ȕ핖 3c٭EE]4Q|_q ف>{(~91=G ͤWehUMSQ$ZJ)HI*MM$ ּї" C.ݝIyy{ i[)i+.1iW^E CG)GQ hjn0-Vv .DZiNSM`'>nb.nROh\ E]tMa!d:6hJr]!t> ~z滞)c^*WEkL51^8%5y׹GAD|=J?Z>UJ% fR ^M\r @dgΐ5РnoK>YC>pmX~%_)h$$`'6aogb60 &v!,DZ"z j!>xjLap3T--#e P5ː VgkZ[?l T3NhZ j2Va6`Z" 8~@ `/hh$if`j oiFi!C!t7,vfMA \]olP&eooojbR!]>q :Hs !ЯM P 85q\&܏i#f Z&@g Lق%NXE5nG!E$YI)UdKL,D fr,D5De{i AuJQbb0f6zr gz6VEyֈ6TiZ YgDB_&\aĉ/f@YY9tfPIwgСE&]iԩUxA n9 덝qo'@ŕ/gsѥO^uٵowŏ'_yկg{ϧ_߾I!_K?( #I& cf%)S A\}1bC gQÙ ESxȨ``(\& 5Z]dUJXVP)%L;b;Ù5q[\·Je<_*]cl줓~"H6 qQiF^_^d| ٔ hf `g\Yf4pV(]dl&)E j_fs f>qij^DSm'ssC/ W1D&zzi+Yь(c'w DDt@LA|]-xAM  !{L$p2"j ; , <j0 Z`3T8C ReV-dIb4V N 9#JY0wڡ@&#Ф(;r{cg$C BV $ "p߭- "eL&r \Tma6X6\ň (2JQ 8AvƂ^z3*eHdȁl1S'9?FS\%ACxL")=%I2ÕA&(n2(3$A#(1| eT@ R*0@xcqN .̩S(A(S#7gԤiMmZchF.Hg,r, ]3wp9+I@t @y pFRO [Z3XaG !İ#<,G@ E\vUUÃLֵԭ(s3OK  iV3*\8A9T4ȃ*%x@|8$^TBШ g' Hd£Tf\B>AyEQ4l h @J3B! e8 n{K0N.wQV %,;ޕt0 ua X$uH$6ݕj1P\/l<  2PY-n@ȉ@r-0b\1|2Jxm>6H+q\5C AQ47(9[ %@ 4Egr֥\*g@)3S$gBX%btDiڄ-^lzPtzڑρfu]D%EeWZ׻k`3k qn%}ld'[fvlhG[Ӧv}mlg[vmp[&7qLb[CKVTLw7I确$Qs n~g Qp;v3~2vƋ\0i!~r<Ko l)Ox!RIr{iḢrgGLυc2YEt֋ǧwcwegKu }Iu¾K/<񬹵b ;2O|Jl3R;+;Ac|AC7=s|s; T92< \eAܳ;:\B3Cûd:,( #B{9?;:̳.?%dB9 @ CBusc@<$?zA \;3Dۼ#DIGD*9D߈CDDKd8P0C 4CQlĮSJdDZDCM@DsA5N#C1,B廵J?QF`Fl a@plFpm\E GsaULWu BK0lYM>TioL{N.DPLp灼#SzDI_W_!$H$8Af`Y3p"N8d3| 2@-C Aߋ0X2Pw@c ^z?9@L  _EK6B8BV%AQP>~Lh=喢yPI' U؄| gB8S@l8㈑B I#!P,x!PsbH*bCY9@( @dmDKm!dd؄), 2|N$1,2'D/bDe|̮ t/AD+IVTZ/=T_T I30q 3 T3 /elL`*.k1/ @WBb1j`&,ACD5+Wx*P7 ,R+,@ 2CF1Q3a!@Xk:1./uCf߻P)΀  |"Pn뺷E4nPvo<oI0 b,T+̊b C3 ̼ 11a:A3Lȼ'pGL5VtfBA3L2θ3hP&wZ@) 2"̼1щ WD$"l(R㾽L|@|XbWYҷX_efPF#"dXI3qf"Y`Bby8" +2Eψ bVnj8Q?}&322!*Q~H׿@ bm$VS xBA66QHT@8vS  $f!$-쫠B Qh`pF6)@U~s%C 6,b)5 TzXF0?D*Q]s$ g` p*B&w ,t"pӛ4 vyJɬ9)U:sBLp@ ;xA'B ٦,V, @yHC83 ģ@998 G茐F`D!iTBӒ:cC' 萋8 @Sc!I 9FT@Q,NtBI9@T*aZBL*:c`O ;Rֲ+mKİG*EttZI6LO;!881w7Py&qmD[Ǧx @ g PF/r ܹQYn2R%qn0- eyn򓽭i ;Fx^ 8ONdb8Em 8 "1pQd ƝL0*kB24(Alxϖ/C@zMp;9An.9QKϙ V @tRr$lhHGv*]| Rr\ d'tqo Ax!VPR {'vYWdF|D+^`bgȺg;Oミ#u14+'Ds4i As :p.RܷH@@æb{s(ˁmn hb&YN] $(  P\p~~X]UsU5U`d6t^tNgpٷN ~Uuqu!QWug;<h~'w@ r awi )8W%@8VBRW XT35~/y[D7@I8w\ t{Mx}zz7 9Q U{ Tz VW ^(Aj 6| O6`E`T2"e}!l4ք޷=z! tQ& Ġ 4S tH Ns>q Laf_ AObTXO@x^x}!gufHtU$,X(Q-)g׋fv 8K  p IXS-XVXWԉg@և$ u(xǒ q͠ ʁNFDv(THi/9^7PY)9%iƠ p#!ZrЖxΐЉi|X؏PJRgɊ)H~8p r EX?b y@xh.h?Q: 4Aq P$isA A<iaF>I0 r0.RPVufUG#8ҩ v݉ z G ٙY:i΀ Yw Qː cG*A Bt8샜0Ij mq ѠJ^Iٚ)'Z,J 񢮙Fޙ QNz @ . {Q q>y1nC^Z )K;@ d s 3aIىiYU`*٨f! )MAb1$5ҙÇ :q ;`gWqp@ r.7D&X  fD:Q vS 'xA!mګf@E^kjs:V d QV PЬ: p AnHvn^vҮzJ6M*p Y!jPZVʪ[PXq:'xD >:Q $)<:H){ˡeABek xưu du lA:q  ; 1*Z*JVX먀+#0 $0/:@!O1f?U(9;RbK'Yb Qv`VjB;ѹq^Бw wF qfbK)ָ7K NБ!aQF !qRPq0 ' [P[˘{ %r ͠A/0@I  \%l| Cg"{$ u0,.|8:q=<PAB|HJLNPR,|7a  A@.r-<<aǧD, #\\hf1Ώ .a\lݜ rz}' -ͪXbA#2qXB<b AT&xGy(Ki3$ ) P) L +A4f32Y9-21&I M=|OԞk٧C=3@017@l;D>thhDC6ߢ@nBpQJP LnI3δJ] G"oj@N2OQ@$A$ĤĴHnM|MdBD@N>G0Gu ' ֱLGbP 瘔H^T2~x Fz 4KLu^{FTA3PP X IATT$ ![n5h3O.1s~@"@5gRX]UZzU.nok`ogZXWU[U``Tx7=_T\ V{[~Y .E Y}`@W`p]ٕ_ Yega4sHT%Eiqg*;)y: [tG>(%ܵ?_a*oy#Su\TExI` QENOauS!X[;.Sxe>+@_:jvkx i-Oƣodhyp6ɶldvmp/h ma=6 nWn dlm'oQcֆmx_h@/&jj,p&m IӍrE{ W)< toV!L"-fH$ʙ)R83QFU1ʙ!i"(E!r"!%\)3ʙĚmиlXB&. BI $%arUV]~VXe!jLm3GU댭[N53겄e"lDoӮmk8ܭhAV je%$Lm26I5x bNX,d4z.ku_u}.޸ƴ |8#U4idcqw$gw;`gVrFB? ?# #. 5𜑏n˪@ *\/6k 4̋CHLHEhp+7PDH0ŽE^TE[-J)J+|f %IQƆ,0ÙGJ!<e~IK02O3'1ȒSř "@44JMhA&!9T-5 WD \M!$!Ne#VtDĄRL Ze$%)Y5sW$=8J3/"hWWAV@aT7uV%LҮp$HG+DJ^{v#!hSP>|7c|XF 3X!CF&5uhSDyYTg:h(@h L9hV飝 ]EY#ȑœ>:饛.:JЄ"#g B DRH:4g g8њkF 'Y&ZDd ~;S7NZ&j=qMqFm Q6svѥ\p'cd !w'M?ubT˼7^Oj^ٗ ;5mjtѹ=!,G@nJ$=oz1^$~:58 ٟG# F9o+ D8>vpi;M~YB:AЇ?"Yp Q#{E4ɐ+8Dڐ8C.!PÐ q2 ` D(JS5]bLj)I\"D `4 Hq D"Q 4}HT]-t9N-vqJX3,hG*d;sE0&"n"Wό%]V,*L:t)qF{z*ADjR?(t#Mpc(= U0CΰFʑf1"FB0Lg#; D 2t"dh]jXrf h_AF/Ddjq+WHVjBP2 2.sHe7v ^G xE|+A_8UKo!Z0A-ALεY,c|[!\ VEnB`v4Nt%uF_5"g+UB%XpGxp7x%>qWx5q[_"B#S.4w+wye>P@-H ;^!9̵"t? z2],I&ztl_oXzWSg }+kNw)ֻrct+XoxC:Gր|Aoɇ$q<̱.Ťy|?_ Q -|#O? zbھ#XSGw߽Y.t䫅7 ^^Jg~r@S"Y [P ^kEy|}++?Ћ>+>[@6pOC>*ȃ@ >[sQ k7s8ȳ$A`\>@ݛA?gӡ?A@ȿ#4(lY9; A(B31Aÿ#C 0)̺xelXE+G8G\lE?e+0G8Ga*5P Nd'TndvsF NQQS2S3MSEŃNg8T6PYIӷ)ÔR%;-S8U8E$MOP8L5S@_TTH QXM\4p#@;gBgWgp[UVxgXNPLH!LWxS`UC#9Rx„x8o%ي| (sWPg K9]WXxXpؒ,M gF`7(Bq}X2J: $ mX!9bpVXCZ WtEYsТM%9d;N" 9m`[#Rn ^m[ SYA}_єaْ{۟!~c C[ H;'b-m\b*Ո_ ^=  _ bK"N,>aӪ-c&@:;V@.8u>nb_01ca n -8FP !9וEc0>d0ޙa^qCIMxN@ÂEYɑ鋘Ҍ' Wb#fЏ6Q: Ɋ .Cfp 6Rf6UBȐg+*Ag8 ae„H#'gqRU8L8ZH;t _!#f!ʍȌx${lYCh;igG<CV ~e&[i#I TWXVVhh ~ݘ6?fchV慒c{X9\enY87(^jl^99fEe~kG(8QjYvir9+SqnQɺ1Qgu}gζîhd"l&9F!م{lnl V=П \I;mn^\&i1$d!12nU.@9[iރ kfHVo^9JI9~jhUi!jaG^TJ{pIj#nЗ֙9I9ksKa:*hVv.I4$Gfw 4d( vCY *G$7!U |!9Bs+/6(Wa!J'&o(!%?Zq\Fz7 I9(h~u%c!-Un!9b6$!9t[q!֢0AMOott.#*}X'! Z.XG0v Ga\Z睒; ݡ!C77/X/Z%deFr&0#4R#:ҩ6U'^)%xC<8X9D)ҽ}'؀: xE"#)Y)) #;#@w%p'~7R,{:-) {h bL%F;|Yw4Z#Uu]w|TWՕsycWR&%g'Q&']xy _ oxzBJhN:{JW#eࠂgzK[)~Xb; _)?^n_6v [j0z0}++b;,iŇh<۹afqs {+wg\~"Ϻѣ:jj-g50/[Ӭ~"hcȜZBI۟𴳬$EzPBs0b^@0 GC,X"!%tVW@PdO5LI0,(@&M9"G,x圛 JJ_RDSՄYigb2+X(Щe)NI-ʥ50эWBS =4S' g2=Eif۷qm6ܺw7‡/.p 伥`!%(N Ĺ q7[m+l|4;d{fu eǞx( 9UuFt U!e(apݦtv\0WЈ(UËX|QW! 6Qx]~X[J9%UZy%YNGZzI]~9&e9eg^̢&q9'U5Iy'}f~N hzhq\"Jm2ƢJ gV:)j)zib:*V(**:+z+++ ;,{,*,:,J;-ZKj ŵf۶e~mQ2j[1FBH띪04A&$a*/n[Pp# cVn 3|f>v힛xy@a_ok b+{/1u1xg2 }"tF%Ғ1^tڥ'XoÌ[E;3Be,վQ7tq6_x6zǜhsFP B̑b~ 33M[FH3x"Ijht3UvK3 B3¸3efrb3*6E| Ǐqog8{'.Ӯ"tPM9n7ߤm %XFX<\mú@ӛa';B ق3\= sd'5`#`p,W<q!+,(Kn#Y6<,\ "&)7E^TdNp |nJS$cC H4L83ѐ+nBn  S]K91P!Pn]8FL 6!Eq>FieANU6d$f$H d @H` t'o:ZA^4ҍ.U V"PC(̍hG2BAF%/IL3"1<2,"d.tF4|ylNu%]C*bG|,N0fQNxn9AdjaHD΄fAǂb,8R IS-VA:CKՆ|d."Cf,&G^WNmd[p5DATA0YD'Nt y}\gH XFW f˶Alg? "%nA6P\lͽB$"1f]ns _\nyۗdRP)CH-qB5.r uXh0.P 0C3qFu{ҌVÑjPY0-iaڈB׳mu^ .B8#ED^{UpΈ}W(XpK`31bE"b=0_ ع qi "\o{ eK/|R^ҵp2Ld%O"f֑3"_GьVk) )p"Mޠ@ti!ԬE: gPysbVWx)U :/ 2!?88L <Ŏ>jKį$U 7ΰGb4 ю3 Cp.! )f-{ہ`pz0sf\n1ъEuM{S27Joa  X;/;p4<=#r͵mwЖBlݐ>_G tH:@ ` YⵉxmD(1nz΀w9߼ a0p!y\ PvW3.ˎo|W.0~g}aqm抄#spm󹹾fKpe O$,oō{Ax3pPQ%;9s>]9(65UBPGm0(vn8C.40emDMi!IEA3H }ӲIƁG303SP@j :7Й }\# Q5C@* | n~Q3< Ћ2$te 2 H0ӝFC}`33_A8C j!BN4ۡ)0F]aA v(C/p1]N5rk!,a>R)"@N 1 F_f'f5Da~"J(eDE-&!2J-A"2!4C @ RW3 # * N5_^=`JB P,@.D1B 9&49M[PhcF, eYAdB桟G3dBABD)C]P$У$Ld%H@AЂ3aaTQdBOdQQ$8$3$ oK2HL3B`Z(ю!%YfIdKnl%Bx? (2 -`=51dHS8dbm&.CI$TU:^AQOP`Qf"fSP0CB$/IbPޅ$&HdT$36c$HY&Fzcjn6o2H,l+p*D$uYKf`FڣyH$EZ$?:\Y]< 8#P"/>Q,24U$A#xzrne2GZzy3o']}KHiQv_: *"fy'Y  J&1f$yg}@h("gN*6iH@z㌮O`kbPm inH he褚(+jgNE8-Dأ,1A!0thpghrg_(@6=gf)ep.~e!/VMnX~B FF׈`8#8CB dPH"mhO.)PBAA A2]޻Gk*)^j:HC3$1mkA<+(=8+4 Bn)&o(K,G8Nψ*am@j-җ2D}lA83, ) _՛.fr1B1DXeNk=3]̒@Ɔ,Ǣ\1A,Y_ka܊lZN{%k+ц'PܾɊ86kA|bvk"@ P30Z[Z"nA3+y6j&+Ѯz!@k43BBbk p$dB]n2d&(23! Hr]ZnI+,Pzd4AA@A֜v3HânCV:^P61 \A/3pJ=prI (/ut$\#hn,/ﺄo4p`\PE=oq"&GAdqSZ^Rp]P0+HKD ' C$p1,0 jmFj/0xR12L( g?:[|Z+0%)2ao#5/'Po"#oN F?TGrXF8@/dࡆQos֊O$ EM' CDDdVg&fwWKj7+U3B|oA](8AZl;wSl΋sh.M/>/O곾i>|~꯺f:~; w3v9wyWAԘt5ZXANP_WFW73O@8oH}*(8g@pg0Q(6N6hB:Q,\ c=PqF )SMN9HZQ JQ! q:=7 6"bљR!L ˻tH;7qv3׮s%u_}R뢗[nQũNX!K#8eDYe mN2x4)یm`.po#nFXI".c6 Qb&W)r*֎IRY%⵪Kɲ<\, o 6<&e{ 1_m81J :|_]>ze&\rJooJ%Ç{oAUq=y?*~]Z5xSf )A]EM eT.$fr\R`Tux髿$gn K #o_uw_"A궘gA!n(L?P:P5 P9.U@3 8̋]&8[1A˕<\WFxC L8`萘D%.pHdhDt:C63H@Gخ!2Fi U( m!;$ÊIEqK\[ gT$#@YP ݦi" Ɔ)AK8#)t& ":bD*[ WFZypHn9i28hK+a ;ra2#h'INfjqLg8Oyγ2t B $)+ DE=8#c TD'ZQAlx@AEz7I\e$B9?PuEheӀ:SYF&t̸r 9p9)OF mh-`-5Hd¢{MAqЄ@6Vef;)4 gAHbC ΰ|Mq ,t ؀qF5e;Xv͚qkvφ&h5Xz]ȀB@p E$+O=5a!X% "H*H :rx: wΥ )g,Ou.en^E7(~X1 2TA(!LHv_nnexKޣ`!$A^+q\Pf +Q5#B3v-f}YvmƁlb'7lN814m)F>: c5?b,*OTvfĀVOrMTY@ g;3#Oa{YP0hP`@-(f Q;Y(A#MFҘ~`pǤ[t ѹ&cWL7\jqh T_浘5avvKl0Ύ; g@ @F3ڌmq[L&ѝnu."oxS7 #8Cps7p/2qO1qoAr%7Qr-wasϜ5qsu]s#L /Б.#1s^cN'Mzs[LS3FXWM]xBd$m!}P_{Nv/L/z"~};EI|0چ+/.z+GN :e0jo Zo_}dž  !0Z$"Ήm܉ sHG. l읺,JО̐[f wdo̰ {/zt펺 SO LT pb H 5H/pp0N J ̜zMVpFgvNpH&jUL1D0pPqPAGQ"T(MkB1H\rLNԮEa9@26]4FOd4`4tnFu@[tG}`hGq&=?HuIGC1TDItJJJ4KtKKK4LtLɴLLtNsش4MtN4a 2Ųb&! S(t,(# +P!Q;1( U$ QD/RUPSAu䖁"a1dR.cjU:pUW$BU:a,z:+UyP7$T5ZM c$AbrY#b5+2UQ&I#b\XSc[R1UZ^J;XDRuUI1Pgi 0մҌ0BAGua2 ceaJt`&^1V(^Uvẻa,(U"(x xjSU B ~aM)X:AA f *zah((5Hk% !`$Ha `"Ak,ta Hg}VaVYjaujX!B U,:@Br3wsBhA"|zV{gbp p;ssbiieuww@>dsf#fC\tA~)^h}y` 6#>"$#",`"!bC("av( "aB yIA4  }wb:<:$w!.Rb|w||qH€8BzG]!Cю"t7zIz/87kCf|ᡨ{e"wyws(@Jz{al= B>~?C$+DI@0@6 a8ʬ7)C(wamXZ$ Xi~^Q bmIb˘GC_bJe%9H?B?R9Hb~xH(x4CV`?$86l+(!ATN%UV>StHb$4[}(6Y!(v|C"ty(@8^*|p)yb, R)6SV-@IR6Ve;li# іU*eiFdYq:)h-醈"WhQ}sgr lv"cbVx ZSM78_A`a^Pav(z! ih"E$ ch0Le$GXXcK*(t-Ay,XwIǻ(0mrzzTռN3aӓ_ifꨒ fB“B@vNJvhv!․؊{I"A=;gaŋ. $`:*] ])cj_j Z+$]}o7LLM ̕X$@g}7*oGi͵} KfG7"L($ R;j$H. (fkk,jע`_x!=އ5L6h. bf" %=)`ҋj"+kkyia) +k)ڬ$`@3( Ż≮@H$ͷ=D_m(Brg.4۟4N /bIsHd뛾B)ܛ& cΞZ=.G < hU﷎;HMTa 1_Gcе>=A?EIMQ?UY]I?Nai4n),ur1z=Beh6v_(zKXVc#c7B_FQ<|5ږ1K5ci(<(:|a+Z<8+d)^q3b KT Ǝ W谡ə4kڼ3Ν<{ 4СD=4CHΖə٠ٱ|iDV&3e|̙/#I!Cv/gHvER%$ML%[jA*5c߿?6xƬ[ sY)Hi*3a]) YY:5'kzxe`ŒU =ԫ[=wȣY.%8E*W}w&Ae\rL5B-6_}W%(33@2"@0L#0 LPZaX\{D2̃/Gv83Hr% 18s@,33[L-1th׌{ab'}_wn grIgvֈiL!@8#(CB1δA6hEi8lP3H)R3m>" z*_z3DhT4/$'H*dGN 3]43xJE. )Koދov€3TiRH)6#A+̰3G3r$ 2s L\Q( [%I#|2+3| c -LPː$dO 2IP) ,\Lp~ vbMvxBЈnbd &Vfm!# , *)aՍ@dL2l\l5^lI6AqTAT@1JI"vp .Ë* |ۍO|8lkԻܶ:AGP@uP_}DrL'#%G%HxUľ= 8•f6!H ^ D͸9)' y$, O p1ГpFBM{@H o0"P fA p =c,'Fsbq/q,ѸpgЂ F't2 gGk3jEǥ]S 'b0ꢡ qC8  HJrD31BȰs s 9Bc44dF(Gxa+3h ;"|k1 94<.yy92tF1HH q"53BiA:X*² y/L陯r0\BWr `˄(Є*t `dƠ}[@0ʖbl"P@15\_.TĴ#%Y)[RjU$lMYQ0o#`3@FŒ; `ay4A p?{gQj 7`2 иut+`J'r\},I`uҊI2H0XT* '*n2)JĮ-iO"%)nRYvmo'N!PE~d$ -q*wms Jwԭujww w-yϋvG8 {^w(_d0{d9X }ۋ7H4!! }[8] 8hC1aֿ#@f 3^fK|a7y ޱR|'Arʦ xBQC6yz"q 2` 2ROP!4A<$X2p(^+磘!Z? j=o)%*YSъ`3A.p `L45@p}a0 1lM4H#e8s $p'lNr$% Y%z6^8d/c2 ^U7 C B @ *85 5{oV(eķ 5xVexdTpAc(M1؉wxm$54X e hwz;S;J1 h*ѺlG nFFs&ڣ *eHl e-;Mb6/ƒJKts~fOaZM64Q M MpR!JJ:Kǎګy anrz̰MD]OA&=Z^)FJ4䛮^UmSS VbD`dQS^ Q#RSTx%T>{B_j뛝XHU_VlASgaiNemVGgv"ޗ}%^U1+Xl;m l5e%ÖZ~Ke0|foA5K[ "%o')+-/1/3O5o79*,ߐD;& ODbUo6XHCZn oi`W?6Y*/-?Rofq/v=,kaWf |c|ψNw]ck47κמ\I_ɜjDLj/=hήm~O|y_N0\=FOol\_ טh_w}4|ď Ko&  ``A .dxPCHaE #^ljZRcB K$rcC'eΤYM9uOA%ZQI8rgӦQtzpjU#cf\͉*]Jՙ j2gؐ^v*-׎P7FE+M}kuaĉ/fcȑ%Ogܒ~NլެX7QӼ|vu@wyvniշa^ivgãVj/gsѥ?|fqҵh #/2Bm{xKwlkF=p@ 4@j2;N"+8Ϋˬ&50>„sBCo<p8OdFsqG/r.d0|? <w %$2>dHr۲G4TsM6DG-/;Ѫg(ו`qIA!gzy^= gxLSUofU !oZO ?] *pgW{~[oFQefp D0r: \e00go2d^ r0W U5$cMX6I,9 NZ:Xdr(%'BWCd&PFB,  OPЋ\BHZ0#wrDŽQ53`Gl0'SI H0R!$Lg"ə!%MK!p$R:P H2VPhF1p f D h3`` AvU - [L%{1/ЌYx !@2N_3YF/%2 gSl8=Sdh`YsC9!(a8`x+bCL Q 9F2 Rr"4-sQbnԟ5=" \:8F.hcXADJReL)M SE>(D(f/v !(=k'Ue HU*Q* *)2ADӕ49͉Nuՠ2WzҜVհM$}<.dbcYҖe#{V~ U &)2N@F2l! qm @D: s``ӋB$"1 @lE0 76C('lHCZO_r[`&d8A`mox{.y ND'AEthr'T@~grgA8+Pl-`z(fCx!u|$Sz@g\` wۍ&Du/|@3@ x vtj1+BE# ~\Y¯.'B .w+ piΰA&l8BWCr^ $*$I`9 !3Z8 L*$C ;f{n ZcV6 1qBzogv0c|Q8Wȯ]?{I}n{y @/:vK^󓘢ApkrugA t+dG:Y^h 7ڼvw7g+_' ]9vsꮆuPOCI`~&PQw|A 8(/mT8C Rni G"]A/c %x" eHhdw3ogl/Wro`w g=!C QgB"4xo~!wj< gh=gr ? =C=c= K 蹟3?X@>X/HaHWp0pL0Spۑ |.TA \b0,S-ӈ[\|l˪$B%$;[(d@4k<OHC5L@5Th88brۭ 0YB.K6XY6?;Ût!B(mRc(^;ƺ$g(D(D9DvDXB`UX)蓈8U|VԸ,LF|K3]^<[hC09C?D2D thta4bU'pd]Уpdp…8FaE Aҷ{0?LDF(C3|ji1f`=pGC=F4xr S&& FLɕD+H$p?J`@Pfv`>zʂJ,˶I# r8qg8*K仝HyǺI<9/Em{Iƿ4KxʄK@GpTIˆgu̼+6}L6/d; LѤ! ZhHJKc…LżK͆_|;FH0MddԈcXPgAЅ=LNjls|gBDIj-NN!cЅbP?/l8v+`›PG80d4xZ' OOK0O U#腕 F򸾔>0Q ]ϓЄl9H Ln Op8 -Q c1 mGL6L%@d@ (R]͈jMX&+/5ڔϹͷDSx 5)SӔ2R|NP: Q`0@P2RFx<(Hd><DhJ6PKR6ы8؅$j3K}L5Ke6bUWeU$PH@B4hSDPb*bգ_}U$S5*UMemև8o5=@GI03Tb8(UfS(`$FW}UU DWuQ04XTיVb5V8nBXq,XSX7gH -MSRO(jpuMUwMؐ?{ӄZ+$b`6YSYeZNABmքZXXNFMY2SF$HA pYg8'g(a]fB*1|D`0q^ujSJq_x,p`# =tt 6` 95d ]X\qt5\cB܄0GXܧq?(&f6KH?c0eMùMν>'L ޅޚPXBfڅo[/ݚ]݅g ZXaބ= B7~E(2_@X__]`8ueքɝ1\߽M_Y\`]Ya;䝬Ma\ۼ۾5Na:[$> 0'Qrg[a(>68JVȉQ8T2T „-8 ҃ Ĺ# ?Cn$66 ؛H䥈 HƉF.èd,B,PNbS)K@`@0_:>8eS^e0^f0_ffp`SO3 P1hfpgqdqNgu^gvngw~gxgygzg{g|g}g~gghh.h>hNh^hnh~hhhhhhhhhii.i>iNi^ini~iiiiiiiiijj.j>jNj^jnj~jjjjjjjjjkk.k>kNk^knk~kkkkkkkkkll.l>lNl^lnl~lȎlɞlʮl˾lllllm mpe^>J}vPm־m0Lޮmkm>_hn\Vn.ngQ'6nhfnvD^C(.oo@o^oVpoovooo{C8o.{ ) !,W!,PYH*\Р/ #JHqÊ3.Ǐ CI!ǒ(S\ɲ˗0cʜIsB5CRp Iě%gNE}\0)ѧ:FOJrBē0"˶۷-;WW\(chS̿ Kze,Ob̚\\qHӌ2>{ 4MWs BK0lYYL>T)oLwW,$뉅vvk S󡥇,Hʜ9!~gr08d3| 2@y -C A݄Vh2&]  WF'eP-D/H8P~ 8Byq @4cGat$9 @ qL#"%&+9u0 6ATdZ3ă.bGM2l0) sDS1!"'ABRZ/ 64,Ș2Тƪ:dK Q $12,8:P'2} ꨥ+߆;nKP c E:i1,JJ mŘ {nک33+ һ&Q LdA,+3cBȪZ%7t.FGkP)΀  |"94[]'9( eBeخ[g?[  bf-x;x`3@(Bo(`3|q@'3P D( i D&b! "дQKH! lHCh5b i+#F"HrwR3J #8#wR ,PAHЄ=OMrB' DTt?/8$)i.tЄBp@ ;tL!h2k $yp "jʞ6@.d@ Äf#1f wDog'8  g aCԳ3Q 1=eC66]͌Ujyk$fkLV wMNVF^+/4J+ ~1\^-kye 9T4ˊ 6B\nkK68*I_J NB9 pF)PJo/㖧u+6ni;|hT_n pe3g<-81v*_y{f}%`G͸@e(c}|{ޑj $ v_|쑏}~q†Dcw 99ZeBvB|P9c+?B菾/9|k st=h 36| HDߕ} @DEisKyzzm7vbiwvm A ΀^wh<H R7Pv mcwZck 0,2HmdXw@XQI(v6/Gt;xKQaHƄGYbXd1joA6 9Z|Ѕ S| P xÕQqVX^%P (5XOzq&&DG hƠ Űxc!| u61[KцdskшH*(P   ym0h*hhHO 4Kq|XpP P7'T( e#3؏yq#9 r0+^ -QO)i-X1P'IA! 1rp9 ܴ -8D^ ɐaɀECiCU mɖ9a9 !JDw)0 y ! OsTGɘA3,Ű ˘Xw Ppːp8U` :l61K ;0ēpCH/QдN۴ LNJk Es w` ) Pz1ejl۶n2t Mw[z|۷~;[{۸;[{v #q9ѹ" b*Aoۺ%!+ѹ[ZAk!QWQK @2< qd;! 6!O4ѻ۶+` 1$qq;  !vSqF+)a aQ2,۹!Q"l+|!",ˆx  @%N|Q_K-,ԫA81-Z V+),PrQD 1*v @ "BR{Gܶ KAɌcyŁ`ăC<%;!% QƠ j,˯\&LQlɱLc1C<)̣\%Q$KuLP7o|Ҝ !l?,Yʜb7BlrΏ $ɔ{ й34r//  = ̫( 0,3+ӻ1y,l4Xc+c/a#.tl @j66s>=g 8tc7t+t(x*Y5"#hCNE}19F)*ċ} 018-u#35pcҪ+I l TS4TM)L-C* d.:ʆ4њ3 6d *eS4~ "74-ٿ% F =2]+ 2`sӇ|] +fҹ}+'9B2G p  PٽC HBDD2-=Iay:I$@)?S?("FL5A#L4D!ܹkGLLtHfBs̐$ԔCDC GuK4T L >4=#9NHd`C<[@i7&3 5tC4 ' #V:d@છ!EftGUn6^A% y ƣkiFld:L$܇EB~wo>MH^H|D; EDLG~Q^D=0k:|ݑW~ @e#WTUqU1(>;[iO"EEUXEP|[t V vߞOq\ ż-UOng[}kY47YLOR0XyX_X+.d$hK84{)H _YREy ONoilO%E3yE_L~X$S%\u7f98-.%״RKPPk0_Ԍ!^$uOTeu};{OP{޹C ;+.=CFgEcZNb/c00aiގ f)5E7@-AйgIEֹ_pA``C0׿/ _‡, f)fE` EޯWVQ&0 F p d Q•2X !' F%ɐC S!9Ϟt. !h*ʙ)R83ʉ;~8rقOM>L ),RhPPV*Q3WbƌO\Q)τ:.}/65,Trr!ސf=La( NHp̙ m✜\r͝?]tաkL{3G bwN5 ղe*lUHg/8{ݛ\) X OPFdJ|:%U.:|1erfN$Zi %փ=c+4LQ'4 @BN /YS(± I#@x줸Bso:`H p揉~D,MS;c/si2.$ BJG#r+D%2QT9 N0lΜH( Njҥ4çO 4lE]D4W"-N5M>rB0քluQ<7\q%\s'{f %IQƆtmw`)A?Mse2]wW]7قGU #X@$Qԧ`yHfn C"vNUq&;^7]tg@O?sgw5ߣRZ,"DŽhkdddReVLizGkvՂ™d@- }wi%dnՔ:.=y)-ʡT(Iܹ9[Ṯv66PB/_@d-dFQFxYs]؉Jקg'bkkvBO(m\sPB) @ , ] K+,TG0#$I(&CA @1 H@AI( R Nd$&f,c3ϱYF1 k4QKR3&C)ΐBB:h7b,a ɇ!1."ʠ@B2 Q$D6Hwdxg/)pP áW1VQr\X@1!Z gRc Yĉt}l /ȅW! }5'8&"#i:ޑD"a5N3!C$&D:58By!Ő8ˬ0n"Y5o: y$+kIAQN8"qs bAy?, E:R: R4"xy8.(=8#hR ^‰0r Bg Cs( 8ġURLDnڴNNyrClF 0pQ rqh/_Sg19Ap1 fHMh@F1Ѐ~D|=U㰋+!/*e3:^AUUD!&U-Z Eb+&vŬU+{n `M) ]pLU!EǾ40n+٫Zֱu9@ !@ꕉjH2%]^6NUk{Oa7 }vIf+<*v꽤uWՙ¬q=*:=]"Tp~*7UNa~7*Hv\=ԺpW3 *l5_-ny36OFR)1ܯ=7!1!gXB,R)Z&>$Ę&R'9$u/  dJ(@Ϙ0lZ{z&Ϋu#S6$v ./G n u`AB@0ӊ(d R萐ӿmd&QYm(A(u3Hd$s 2?4"x Xkt2ɶ l u $hB*$p5#nkB,]1`Z i GivF[O AD(L(ti (c@ r񉄥 'B `vx.b S9#6sB^s"fm gtgG{ڡͭ9tЩK- 4@_H 'vqxT =i_Nl"}o ?$/AD;3@Dt+TĴHJ,7ɠ@jMtN|2 Q$EO<(YIX@Fl4EJEO  WE` Ʀ82?hrDKelFq!FKW8帅cFPlmFӤc5@G1A_,tobH SMXG)E[|F<(bPlH;gK$}ٟ'H`F4oGݑG`x$ԋlԧػ4FT)ɓ$D<DzI6pOv4)d1Lɳi>?Ƨ#G%$)-t ę%E$r4L(1K[ʐhLu{ PX>ϩɔpqʷpqȵLD=4 췘LJ4 tͤY "=$uS`hd@@U$!_D*TdV X=Y>4S0gP P?WS_VgHa(؀…QPVւ q-W `ehH`dnͩ_KfXO<E섈 Ws% RHE X`fJpX)YgNXho_X.JRżuق fh`XHؙٕ ښ-tT]@da ZZ8؄]X_( EڐuEXeN3[p8[%۩Eڬ U[rd:dG:*}WةXAe AnVm۱=} ڽZZQWvmlg`\x \勢=ڤ-{W܇T<^pSY\.)1Mܟ١ ނXW(^Ľ]]W]N^ 38ڂ`h4p"$V(,78 - -xgX[ޢtq5_: Hz8g$L _, 3HY0p;hfp`HgЁ&Xy fqVXK"$^bxSxY.F!)N.pb(b.Cp5/?NA&?q!(䞊4cj9 cF Va+dXGne>F`X6r4 Ё(,J_@98 ͨ[ X `ؒ9ExI ^( h gI*YɊ h!ansxј堔\b0&  ڀ &Ph `Op |v h{VO3f{R 8锺ɟD;MTv6ݐW0P yegwF^ 臞Ը U\jw_e(LJeQjqCkgHfۀhBdX؄WTȈsʙ^! *N)@f q6HJ96l[&0:<cIIaJ cAgv+#3ivTK mNa fYRj)jlcJYҶ)ӆ|կl6ni@! .eݹ*fn)~wDҞOXto1&wivl)YcpB`脄(:Ynlr( Frm gaqmƽV᯶rkhd`岈p鞈+3x)8~8+8;8K>9[~9k9+_xҎ~ӫ:-zՄnn(tP C $dllR L[P2XqL5^ۊIO=?9g2c|~nξoH^.l8F23(6hWa:gt~p\0I(16Op ?C1 l"@O!mh<LC0g;TCXf`KCrr* "7uġ2C!(3y"(O! V01n(~!*- (X‡6 ĸP$Uq2| +* ,ZkA05),_C]+bKVrID8R/Xv'eZ*.K`-Q-8%{O*hj(~lB YҐK/#K 0PTZT3}sLĴK@1#}Pz^dU!@Zsb? ëY3tD@) dGUW`U(HH4#R:mOӳ!T6r d5ůҕO*>R9r 81* - [5OaS*UZU7euٻ~%)Fg9W^.)ʈӟ Upk%'luO[<}7؝K ׼BL *I/`ѓbHh%P;_v)xE= )QTJKŁuv_pRЌex": g4C$UD[|$/` ((P1,Ǡ`':+A124n!Ya`Ҍ(Y! .FB]!F3'g:OGar(2a aTlvB,63͇B3qK2C3,"E<a}(+r r+9=Yd&+#LRԧNY+V!Ʈo?=2U Έ f1_"0sӼMczڃqҀpw:gɵBUx1)Md3.9횴8cM~%.Kwz:i<412I4') h9vQ3No`˝s|=u2Љ^8a588~)qLA1F匊JH3bw~ ,0],+Fx/3èq3 <^!p 'fOy3 ~?!3Z  5ӨxL s3<P:Q+V'RP*&Y*f_DiO:pHDI+~gcPAMDNDO8P Ɓ KE#n^lppe1W0+H%K p E`T+,1 ӯ-2k2v2Mo 027zP|ug 3؆ bOTD3H ̂ÆH Yh,Im HLtNFOɅFQ QoaRW3sDyla)ɛH=p0G MZNOSEHVOPdPXOuD2x<2n: S^@B)l80+F( ۠J< <% tStLbLpTs˿wE ,O^8++fEsFlwy{xɺѭp 7;Qq7$rsÜ;/-xyw7鰂3@Ox@ |Y[7 ͌8 0h 8M 8C08my8y9W9@෕o7K k9ф999ǹ9׹9繞9y{s7MDy͡:CϪ < 5AƤW:ƦLNe3ͩ+:y4zxAT݀ LJz^:m¯3E+SH۾7lݰϺ[;d3wγ ?'@j@B{ @ƹĺ7CӐECMa{t3{ $DmP; 0CD-Nx-@OLwaD{}loʗG:ƒ Pϳ˥$ xIěgXU`d/V^ w) 2 BtDHۗlm6aUZ1-C'FؗاzI2LUi|Iq|1_FmߌR~Ty}g,#)2WJJ[IYbd*WUfB0aTCsVop;K!S832RUUPU3pԯë^[2t nx^,3dlmJ9U͊umkP]^|YGtdŶa'F\fM3~!\'="уtmsHK`$nQ!.@ vuIW-ڱ 9E@]bWnϼ;MY.ݥ!l([zߔ +yk=0(EH۳b ɸ 20GKÈKCBI3!D܀ȀpjO[֊-}]9бֶ֪̕;bɠEr0g\&vLpF]gC&1M:=GA+v'0jCYRpF5*vmp ΀igc.#~.b7`pLs5Y.keɿ9.yJnd\˙vF iO[ڎEjmjO^++ѝ6.cny%PĽ}oU9˾wozZq 20pz wv Lj?x-zq' 2+Qr-wasϜ5qs=ρtE7ёt/MOuOU[`^62e7;ȡSylE83gw<ދFt%*]7w^wyيآyڕb/!?>&,TdiYoͼ3_Z˶A|f`hkzP^Y^/dˮ7oħar|⏟o|?of9DK}G曘 J?o ojLpO"oRˡͶO ʴFF(Pb M:PHL P~$*׈jhZwj0dv|Npl&O\t8&vj Rl**Dspp 0s+0 Q /NvpPPO  ) p辯|qp{#0  +/B5ok1UFj/a|/o6x0v_c^Qo1kϒخvg)FJQh.unEɱoO eͱEMa12 r 2!r!!!!2"% `"#'r#9܀rc (a$G /` 7>2/(-eZ^6V$ "&gxjRQN2%;2(70"7^Ap!lrrtc)^+R#&򍜡+',%%k(R!e-70Bg727LA*B-)K+#RyRP-s!-62#&ޒ6’l#/Y*32gm0)=Q 4 s7NS4}4s51"16 An#2.yP, 2 ~#fX2B35">r@ 389a2bMu-.`MG d2#ĕ&HXUEcBBf#[>*: R^XSYauMa_uDcaQ_EpVI6aܓ1eAXA @ ֔BX]^0:1\^%_lXbgUMA5Aa|-U0i6{63iinaVSEnT2X]{!v\BhGd!!:B xDHMmALhpGq5#i ,t#Ԛ|1A`a^P!b^5bl1bf6ڦg1T7Xz x7T'<ƣ|D|@sg!WoitfV#7}QL 0Ie1H+d"~#@H>u V4Bh%hH#i4/0BzcW!hwcdܠx t9sx7/z46 |`AI@zzzw= 7ho&i>{W}xn (4~!r{]?O)ȎhIgj7/N ̘&mIbBD`{w Lp2/6,¶3/PZ;`a6ͧݢ{o9`IYp0BIڤY:7 6\ - $}C6l Ô&Z#*!;SC R90!@.@Q; 0U]a;e{imq;u{yu -4ـ۷[!{n#K'T1"k';rb 9'sb;S S~ENrkäuu KXri{{g.' '|@ \"/oHջ0`+7@sC‹{ė!tRU0Mt-.` $ICs6RG 69)Qg06!ƃM<}&5xX18t)~3l|A8wA\…[6=B CT;>|&uZE"1VY^/(LHk7bp6f#f`9fBfifgAkkl"mU6!u ia3&~)x NeԬ{& ޗ&gm%$u p fٞQG. mڟ`s{<@.pgvo7wwwwgfl7jp$cmxEG;rDo,Gts"q4J+#iO*u+?d_hE~Bb*g"8 '%똛BuJ٣8!aFؠ#ΊV*se8$T3iΝs<\JY1eJ YEnTŌgW2 MYPG.l0" 1Ō;~ 9ɔ+[9͜;{ :ѤK>b|K/G$@HLJbή-n߆!sv 3fsr J9%>o p:S ](щ%*e O#h4rBBxP#Ha#f%t3AT33%V]xu_wf¥3x`joc2Hc6ވc:c) kDv 0s GB:h\H*Ltz @S̄"IKmdW2q"Vz",eiH+qզ3@ 3)Ce -–lV&U?R"l> mNKm7QH4qCHNĎiTs* "0q%t.k3=H"ZT&z-׷@ P+Ҍ34¡)t3w8c)`b$I2cjIX!L:cnJ70 *V' [u^ vbM[;ITeJQf/6xP;ds-ޖq6S0DU`50TA X I@dE6Uv.Mz馟zꪯO,9*;y{|8r"V2Fh$y=OO}_}Њ}~O~柏~~Oߏ p*p%h,`a?L &aB`ŀI+86Mtl`ČNBp4 &e̢* UDbKY 4bKHĄ0yǘQ䈐Ѣu1"c8"fXQn8ʑ*ˠEUQ6j/g|; FXQccmS!#>&;93:0Pu, WMq ^5Wi' g>?Y阱 ėA\i,r$ƘIS=fN&bRS-G p 9AfĎnUC ^1Nu΂1\c#'@(C@'q yE> PS$cE:aQ*C;<* (τ@!t<YZ1̀?$@)5YN;]O)" PP<[&UO)ґ"Lu*T@T 0NNu'MiFwЩ i,aGNk-T"rY+K^uc!kXBMy Zg| B8sVDW((N  D@s`B/!p]S$8ʉ3 ^5)LP*@c#!ePэU_H FBHÄgam"̰ݒq;$nӗXpI1xan0ci7nwWrr ]4߷w)[T )B1v=WS亢B5elM > ![ u3'FcE xb>IZa[Bҩ_=xkӷCul"wtݹ/B>IϏ~ݜi[bs[d_F~')!|;v`[bCfCsWq4AJyw[E9qq "+d d!1X1hzj<~"(XhGsS &lؤK(~uC~nAGU(=W< "*Pw$ b)%D'!e\81I2g'yb:wqWw`90 9hz\"#R %hxW  rƠ s5j ΠU X!VGsa( FJt8!^ h؋OBohLj &*Pq(z U**emȆk, $*b*Pxyqx&j҇y)iz%b0,fː <$Q2%9ax"kt)^ DA%fr{$PR R6Y!Ը(̨*6 討(Cy:qC3k391&Dh-SY^e$@BUj]" ʰ#@%6Sqˆ[7yp yVqQy$S, j4|r]px~PYu.3qQ6"b #r/bjΧ. 2{ TMzDW30YxPXq5FIC9E:8+49Τ9:S7>8P:9:a89l[p /)6-  q0 MUڴι*Yj7CQ3:X W v0 CB Ǔ<g) P!*3Jnw=5ʣ=? A*CJEjGIKʤMO $UjWj-#Ff  H`6Bu@P0$$Jc5XJ>GLL0!_q J)cV+ I\*rʧa@lZ?/3jɑ]d9El +D~q/!^C qqj7pB@MQ)҄;i4jɺg0@JJHk5ت麭 ` pEuQrV$uLUZPe 2u kM*"= `9aEQݱW+*sTSfeOq5WVOU0 lDcekU-`QQVWU`\/:j5IsU?g k/gUbCFaCV__I LO 9 @DyC\E\b&f0 ]F`$ab(Y1O &k+in YSƵ_[^h^u;%E+Zں´ Vc2J[fgjj9Qkqkk-q m&+oe)ǖL 0M"jed~if@flζ%+vpY,GfȋVY۾Uٗ{ X% l zC_ [q 0qG-Bu&u:9q A pp g1&9r%wr`sɋnXso[> N׿{OG( r} ј5f\·Kez̻l٨ *'Л>Їy(YKa|:Fq7+Û|ƈj{N,} AH+\Χ`  ,G;Lɾ||? ` B'‰91^ȍ,'Kx> ʀk.̜h;lMk9[Ks|" ŖU)<9q 1t H Ȳ_0 Ј(h*;X[؅E&`q" R8Q"'r.@e~˾}Μᵍ5:ZnN *s.]妪~ ~n76Г>qlOI Q С |~ z5lN"<oTgۼꩮ!U 鼼˸ ^u%'/k.GoC1˔̫f5,WO ծa>n؞E?,_^_N /{>߮u_`:S/9ntwƹC|OVNoߑT\OxG/OoM:3Ts],7 Z2D 4#OqOpa`jB4#Kzn#AТa7K@c1F tA .dC%NXE5nǃ l&dE<Ŋ1k61 AthLI^< bM'oK8'6qɓ_8`phQ#Ȭ5^U ~LK[ ɲ87,BO%9󑐩Sr dpῑ%O\e 8SN7ч*͖V#}$/M*i脧SF횭fDhFtD6>QZ8 \u[j8c C>;ϧ_}]9٫ @HbH$/bq+:pFJ[@?r!:@8eϕLA <CqChaFvTHELHȃpH¶WXLd*Udܳ?6m%UTRPg9\"嘑>fWrEW1ŗ a8#!!z_56^-;VNx`O\*Fg`:4UUYuwUe=6ߒ-zX- 3ZأM7!=PAyU2T{mgT)aTD#WiF:re qƕU"O׋=e!g"tW\ -etA&[ɕN& }?W(gqUgO#d]`FfT!f$FWq9V!xET_w޳H݃`昃0Fw7m ܕ1ND'Et(`'0M38c pF\.FǹxŸ‘L0 lm&g\8D,!"uk]T|[hxUcϰ(ψӐ8Q|vF4Q)0?p BA#V0pUdVH &F@K1rb(QY/J^,md!XEB5BŬqLn,Z7S +{2E3 aq Wkd/\`+9"RF2Cwo#g$C ֱ RmBL3X3NRzoxOnRy1LH &﹤2gƚnv '[˖XPexƩ> P f D@p)<M}dHȘcaf\FG{ eZ=x8Hg{HLEY_6hYo+6G.n/1xBڙh܎yD,]Lڍk Ҹץ|W/gxe,Rg?hFV u[;q7oH<#do62[sE `ʀ'-]jkom GBIpFB/*Cw/2ߺ*֝|+;軞Y P /[||b^t"_sƿ^&km>#戮'A1fhVԙ>H$$cPy_ڛ?RCS/:K=z@ӶZ? *;GBH@\•c;@D=-T.ӳH(` <03Mt8gAB&@ƒE" ƄEYD{C1,21PTF5aCM$B>F?\DlCnLFA$+E GtDG|@8 Eg8gm$$Xf8/pb2 JtDl HH8J968kɗDxHȁHII$`Qbȋ4ؤ8fHpYʢHN+dh ʕ<Ȅ\Ȇ<HTApi,HxI"|>/+˺ʇ Dq H2_ B S?S@ TATB-TCT3MT=e sT4CeKTI KTLT˰ԉTENmO P UTՍPU`ՠհ8ՄO-UUJUMT=UaW bcUXbc%VOmVHVx`VTjZ}npEa֊0WfU`UqeoUxEVk}vv}{ye`KWEWw]VxWVT {ՅEr@xXuT%W=WRM\= %WVmؑ؃=Y|WsPmٖ]H؃@ՓYcXكYXjY[-Շ%Y%a-ڄzE[MYX]h֛YVEXVTuڬڕ=ژ%خ5ۯUuV\E[MZxYuأڈ׽رWZ \[u]ָU%\۵de[e\[u[N=\ \Z=gV{m[ͭ[˭k[-Ymݹ\\څ٭\ZE[ޅ\MY5ܸ-Z\]U[[]^}]uX][bm^%ܿi]]V̝ܺ^]__M]ɽֽ۠___ UZ&`5-^ _E_ߏ`=v`UY` `eT`>߫X\Ņan_5ݍ_M\YV-b^%6`v'^ X-`&בbm$&v 6\*vc=`abT>]-~vNҍ]4>cwEfd]\UbH._E.^"~@&fdLdRp]V)fcf-[Bؕ}d=,V]<@5<%]۵GYV^1a]>e@W F]PenfJFeU*N[O.W_f[vd4`Ͻe:Vee _c`^clc#bz&h|6cSfhdg&guJvh{^~hԅhy`kaHvf]2N^iyDgaiN[j6mvޠ6/_ek^`vvb;.]i^Nc&kTN{fjjp靾kj6f kfn=-l&l^f:Dhf꽆jߐvydNKl梖`_leFm斶bOkڦ0Y0ǖj[df鸾RmSl&gʮ Wmy%]=|l# X_.%VoNѭ~oo4]noooooopp/p?pOp_po/pp p W% p$ /75gh@qw ?0p5b4q9,΅r"p%0L Xhh`+ Y`,( ]S 0W(?#/O6O? 8C)E;esHȘx%?b;rPt@N`J I蘎t t4uCAidXQKd(E` _quXQQ \RGt`_#EH0 ,A#ytS(dvH8TlPǒbv3h/ň/m+9vk(?P 9J"P'?Ą g@x`o4b19Krf!A_``f腒Dx85ycyȨ~ys9?WMA} CAq9efDGyiϕhj z!y{ثrfPʿ|fHIwx?#fʢ"*0"c+x%!* :V_'.fPFfHO%x}g"w!}?'9 *~~q?!Rf`+" kFpg`r,AW͚LŽ>8Dt!KfK5SE3F8ӱ_=!D4,sj3fqLYɖLYH̒g(ᑠ]zd#bq.6Fkq\+x0†#Nx1ƎC,y2ʖ/cά9rgnsj`R F1Ph,9 ̇zDLA;;b68ZqVgw7p5~OYs!8;m =cTA+9sCG/z^|A8IEqq%ԙ"A8} f߄Ya A1uJM}BA'A4&l3lTwy9^G4SǼQ4A|BjZ0sZAn{٧ZXg25)FPTB - RH)&U&ȡ~2d%Q"@0ց3f+ +(J馝:鉠5hG( A+, :2v &-3BLxؑW1J2m ʄ{azL. eBzS޾J[z$Rj)JZ wD_$ Qq)<92lsG8M2C]G#m腉U/j,_ CW;# EJ8 ˥:dټF8ΈZq7|vQ1d5Y_uBCXL7.mEJ3ttrt5#푊ޓGa??.DNvO[:A7ZG/SWz)k|P){T@ɮ1nJcV/{d{_磟 a;T@A*Q (kT:D-n!1 6D AFӂ(37rZ?@B\ A<BVa@ T؁kXNg:%H,,@Fl5SuHCTh!h ,$u/|Ӹ#h)3*7FF2Add#'v=?wl38A8@r06 pc(-91a t^!g@&t&ǰ®,!&\f11Fܱ+!M^_oasxG #O^K8Ҟ6)-kC H k "@0'P`g$A0w)\ CĸM;R4Hq0oãoxa n9S/xGu{9aͨ29k~ 8ps mȗ]=PĎm@ ь}0BZ=b; BK3Q ?v=z;w2A.o#>_<C><+oc><;σ>=Koӣ>_=[>=ko>={?>o#?_>C?ҟ>oc?>??o?_???o??` `"`*2`:B`JR`Zb`jr`^Ay j] NH"E ` _,3A*1R! 4TrL`jHa!5!aTMa~3 >]A "2̱D@!,W!,PYH*\Р #Eŋ/j1#Ǐ CHqIO*ˍ%_ʜI͛8s܉|raQ9CRABC) !Bk\ź3҄cwNJ,ӚZ- ON^ݘaކn#Z( فeǐ#Kv-#^t٬cFl30JcɋW_Sfynөi r B`bJ#t6]7 ONHk2iEj6οSipV ~x - b1F>a3hJMwPˍ8Tupn0|BC=#x"BW[)H){W}wR~]TVP.4%Z lyЖP:@祏F2Djk8PbGՉ񉐢vVr"vh A8C8*)@i)e9zFT$!P$iN CJPmyeVF+mB@4>@M2l0P'!3AP 8SRP|-@O@<"PQo0D\LQWL3x@Gc!@$C3٩ztKtے @Έ~ vGwQ_ AO*;FdTB;}'{{Xg-@ΈME7ؼil @ε9vuNRӊrf(D2ьT`y"O\q1_ьVce 5AZp", L+V  PF#"d 0&@C$be1&f_+l ,,+3gdXԢ B qT3TA1Bi!3N &8+$4! UxERu"K" Hn*Qp":qtLeAH F1*xD/qw*Yg; Oܹ1r\Ȍo,$xM]@,(0(N4QmF6Rړ1 `Kul7(4xc3|FBd1uPJV6[%(_A6ei{v# X= "^Y`ۤO04)Y:3 _86*bi%l[[s9,&TA+\/*1t# t!sp r#a#PYU pex k,j W[ C `KXG:WdvG gB p JG^ҚV ]- @te{0R =s+K>7-[W c_{3`  ]w"׺u]!Wj҉Hi^W A+,qsjv,.D6) V!0ǖ%H*qZUaB3!>.oT$9-mu+68-Kn2-l]gEk`ʧ@z!WĆxHF'rF.(*H+eҗ0 xQ-J Ld5?fiIÀ*t fhƄPA_)H /h2":zD@"[jL!p& g2rLrϓ<, HU`0i1/[0$u1UG ЙɞmRO *SVw.ӂjUVV7!vp"6HnG{R`K4,@"pj.3VAz TQOz7L,dY PJ2pIdwJ1x!ke6IglB '2nbr/W'7˽1!?67h @'}PqD oDAo6zq{^rH̵ D%w',^$ `8ps@A4z}_'$}1}C 2sdD6v~}YE|`|(F*[7,U 7,FX>lf'J8~+2B~_dcJ>WMxW>1{g:\^8HowQ .6H32% x\˰r<,H`؈ ?u 7!׵PaÒ  @ pj@} }aDa7SWHΠv~ BG `wQslHPj`xDdWw@iAaq<`Rr@] 5 x1 -aBԎWuFR(؃a"HGI`P&i7v85.q+b˜1vˠ ` 9>[hqE  q9։Ia P # eXQ)ɠY)Y])oISp@1@} `QȐ0 ` ()ىa0 7Gg Ԓ!aY c>(#B4ȜɚCT^0 z-V՟#!  >qIF VZqX6`ir tY' mi0]כgazYdj~٨* {u_ y0|)*ΐ BAjrJG S10w r ;OT siqG^ T@3 2rzZL^%H('B)0D T \痁 yA<0ͥh7hحߊU q@Jf]Y=7 /M d0P_誮[ ڮ_ q[JќZ zʍ! 4P>+p6:]2> B}Za zD/x2{=A;{Q .)k qLSWq7a+cAڪX;A [i]˱zgF<z |)稠+5]wUǠ0XK+ 3d 3&E!c0 2r{JrX 8>!@`q̀ F :6c/JnۺsOE3k 馬!7Jrΐr~+GY+ϋ7f@d`_4T1eR~J1>^ Y̹y~0C($@C- ^AP84ܿ %ϫ! QĂSF ; ^ħaJE',WxtK 0PQ>Uvh\}t\J!Ȇ 1x6fLkaM Mܠ;Ħ@eaT* Q;khJd'\M,0@R<)%F1@+Q1 jMͬBˌ#G˳^PpP\l!= Q8z̪~Ll|A.  }S ]\,  * x4˟+M01u- W l1=Ԓo9$VRCNh0=Q7 uC% FL|Lb {c6%e}cnp%T*q=q׸qG>\-$ywЬun@ZA]}q~+ ,k! +dތ2KlN$ÈД%ߌ.l+mN)J'|.\,~=x_D E Ȓ"%?y+=zCeb32p,<.1k ]74.? :s;S9T8S8c.1σ;n2N>:@ '/7aГN?34#7?B<# 7>|@j3Oo</Axds4 CԤȾ890 4d6<_7E1A[:s i1#pk81PA^<+3; Q y 4$V9uP>QRF)1ҧQ$lQ4EU&U.PIUN>aSOQ'M@PQ.c;Sqvz8P#D-fUNA/P?QTQTQ?S?I*DLC E ­]P$ETdEWUOdHg|M,pLYH̒@B ALdya3W1Ӑp3gF1kg`r,%RQf5sv)!#8aÄM6өS:)R!W˚pi@fJ[S4[)_4P [0¶Oujի gB?Ydʕ-_ƜYs4΂i3$^(74j0!Atn6'"քJuSSRr:3M_z!`$,l5#Bu; 7z4gΡ- Ù;a gKo=9KgtX"/5/bieĭr=~ЎBdQ k.ƅpF:EHqxsȘҰ2<[&1K(gHhgpWS-Ȅ;Ԓ2O ɭ1ٜ 󲋅$3$B,l KH!|LAa9꫰49jOMlR^}R.T~@81~6Xa%vX#_f:ӃBpFnS`A) #Bd](ۦ() 9@X0J+OJ.c~ gĐB L,b>3VrubxW[1EB J^fЩ ͘CMad`:6y!}Q'vj~z(6XWrddx2]e}Je#avj}6.gX`ۄf(oJoΙߥ'i2^J,")a5zl׶uVLٮfb'x%CFX6yT~edvzR2i)6nG+Z=SI%!ؒp`iIgxP= p{π /< t );W4@E >p~!a BbS Qe#lCS>0Vɝc7M|K1pb&SCʯ)NtЗ:J1l e!D[bق v1ĿX 2\O Ph);+ądRw91 9̡k>18g>:+ѯ]͌K!ȒLOꋑԨV5+)l잇ֶfOBFIu5 nvY׹B24,3!:mO"pnNvw9x+~-nrǞD/o<}E!-iJ[ 2 dtTp•[r 8:|B1#8 9*zæCҌbBFDf8a)0GL/8OTCK#44įPE{ D< 6<>3_@ELCXlCIڌA ^c$ijkFl#hYq$GhrsDudvtwt;(G UyGkT}~ǀȁ$HxƂl3TȅdȆtȇȈȉȊȌȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘɎtnƼfQgu g Q2x* ,t MP^P UٛYkFJ4dgK yʠ ՍBR\)̦` ń%Pp+ ѽY!M1+9AA<h;M[ˑOM/}(   }Pː&eFIP?фSAR/+/p?]OTԐˠS1K4;UQr\&0dXUP*@Hhb`c`@P+fGqN2胯X+3@fz ]88c]-` >p #NƴU\>0!jM?@qE!gVaX)f1 q=/0=Vi5WW'%5d(HfRUQ%զ8l5W75҆8XYSEUUe@T*(؃@3mc%*VqcsզZh_ VcEVeeVep֦WWL< @(bX_9i yW{u MUmOYe+V ڇbA3UxX}hEZZsUVa%WI]X^(Ixqx۱` 5܄Vc*$]*TXp d8fQMp U_6 HKibHFEcMW E ]gf 0 P+Hir^g*l ͆ҪU ełf  0dc Օ ݄ޝ艟zXTmx؝݉ ཨG M]&j _+ ]mZ&8g80^䵊NX^E߄]굋HmӦHؤ!_ߜߜp DG9 e ]-h{3 U0g ܥgP `av P.fcc 8N>͑ Cc`&z Ay`rmǰ Pp9]>>5 *|pG f&yr&' nc+ ?] 6QUqWDG #/ae(AeJpHْQ_6aI &_DvIBŏހS\@i\RXɕ]$<6_l>ThxqbnT0#f]^YA^Yv;F 6jB 6xqI@ t KbEIЁOF] !eg  ˑZv[nj 蚨qȡ u`V"gvFc7g9x񓘙M 21Βy{(Yj) elw)ESR譁Q^XciӾ“} 9`p`6kƘ~򝗄И.pf`HzY1pApg݄(>ű Q9dYf~ Ԯ&^ o T40)Nkl좦 qn)82 L> N49E2;m6ZJ.9ȃV,u]R>~ r"3a`-kMW+6Rb' *gf\?Y49țJl3V╕lola3Ş}g+Wثz^$M0E2 @) U%Fح `D `H'!C `F3zQ4!3|e( "9y޳J̣2cB|`+'sH'xQ(<3sEf~ьf̢) 3g r@ 1e݇ywOTelQKv7w w 8E *g9~^1m_h~Cn: Įxٺΐ6j̻4qq,0'O[^ kX//d'z@ۭy)*>s!% G1Li_ś- GXAP@D-]A ,G3̚S,0J@)C" _fe^o8C]aD"3@AVU(D\! =ڣ"AXeS$b GݹI$E1O/>?EQ+ģA1]t'[#a0e:ِM#ycU5cvi1qcIO8VB%Y2md;U*8CSX##Bs,Ce5"9JbA$A#ĢXc=q3 A. 8jeF #!_C`-DtbuVhhfH@%El&TxP|)@3B fO@PF㹡 R6 4!XFeCNe\%~X[g\*<XJw`2~V:4n'G:e  \ B(C\FF^VoCIhG\P ^QDa6CB$DU8Ă%Ot$-TOC$qTA GJ:as@X b hH踤lC0a@$3Ђ)S v!c~RQSgUria'joWvc{zgriegzN:g\ސɑğ$Ĭ ELz"<JXIXOt'v|H"(¸B!$*żjMj TV~K]YRĨ.CjK˩*D'T<^3&,3A04REac콩aX^}⩺fzgܰk杞૞ AN ͤAPHC,N @*2A3NƆ\]O@B,ê f]N"̲fMWwՀP +jP,P,m>Z2£4C# @8pv$^#uy:3l<.\#-eIeܖ3g^߆)D"}R|T@ 4ڑ%g5nf HӆD%,S03䂚2!OTM.S+ nzdsc۲cSb2Wڞ+pv.-W,ngd/n&?^u/"ԯ/~/ޯoRyfpA6)070#jݔ.0Wo0w00 0 0 0 ǰ Tϰ 0stM:sy )21UʮoKo#_1;Cq*%Kj 1/;>/0'piE֙q1U#xpm5kߢmh':2-&S1'wrCޞqn^)(k>N_2pk^2{2/rөk|2|Z3z2vcy:30#"K34C/o37[Vm:+6Y٠VZZY2!k1'Sk8>W#w>=ͳ{13=W25'x)$)Ul2)W$Z9Rs/?o4G/Y޳1k%ks.Kt{DiKgG4O3۩9g36'e2E O43QgPPSZOgV -+;N4ZR5 76#વYVߵ>1#-_5A(\u"4]_Lgcs$?vd&ewʱ41}h5E2mv7^S$]6lt9l;6n6W6I6Snp75q7r'r/7s7s?7tGtO7uWu_7vgwLqLyvxo`PzHhHwh3|{${U77ϰx /ND0 A1/lVUOG99PxluӄL /2$DHOȈa7G *PH87y8A8ΔZB)p8OOnj/@g_yhLoxmw9d9t{a,Û쇒󀈘<9OD۴UOLyHt۷ɣEڤe22aڋG2@B33~s@1H\ڝMzC1Ɂ4z=~-LKG~ )DD ۄ ;/-yHzHux[S\BG37]25= ބO,^0u] L,5,~P3(Wǭ |"t`>8`D>~^ 'd;xp:~,C3 å3*8HD}$,,ʢ3ba}*2.6^a$2$O!n<ܖ}{Ǘ?~}_('3X)뮼Př "H0λ`YHfnYL9dJlhp.M4LCmYd9ƍBx- ÙGJDݎae4夣& g(uLG}

ybpBy mg^c^wtFYf%8Y0Z裹1xR~޷[鮛>0`^!f1PuF ,s8g27fpƒQ_.! g8eTgnJglh>Nα~$(KSt h125&,C02‡b@%< d Nҕ . XHLebŤB+ь^/\#ZVq_a*Cl*2!M y)")i⟁@0C8$+".cVj _I]jSGU*R|oqSדkYiGqEs=h`p*@d*CH-aZ pH g(@hhBf(`F2bw^_ms#+D"x[_1rΐ&6 [1N,#č!;=!]1o*`M ;R$A ! YfX AJTNu1Р4|)  3:>RXY*'8c tQ;˺ZΥ^-ZOلVQqComt.knHLixY a~\a6v\ P1HA `)܌ ΘvmپK/1C4Cx(!'h[=Y#PyL_Fd,eRH2-a(#so#k3(qh>t-ϢK:T+3l8Z_@s_z;մ5x3 blo.22?;QN T-DdG1`<%lyU.ٺ}"}l3B] ZP"HFR~t6 !{F//uBr5 @ i7!Pfjv1NPP'Tƚn)Ix=c ~{xe8ⓟ(A(TZ3Zl*8<4y`k(X~F%^ @\Υho!&$ @RP``dVOn~qʮ_B Hz_sbAb|Fl/Ci@f "30b//=`ff J*+" d)6A6>5+b2"|=|3*PS5%-7-">3:(4i41Xsm !<-9ssvS+r,S֩8c=B;<-Bs?H@(_k's'+bD"i*bi%m4"DrI oC'M DC;s9""sF?@GN+C;A ,p9)GQ'@AaarIԡA"Bx !#`ǐjڊK!LUTE+ ᱖G56GN? AJʪ%*.Z'(io!OL*J ,Kp@Nb@HM!\K""&Ful`dzt*Z!64X5nnL(Z{ǒXlYKm ȠK\\#Y4!AjȪOa^U~2 ˻K@d!2x/Ϧ+bl]b +Y7*X5#dlfc]\[-"ĠrW։zh{N"@[%A:$#I՘`m@Avؐ =N@t,`l֨mL6R B4I$o،րJNV ׄ@CSg5vD:˺ל@\!&7BjjaYV Z-knnBol-B@-h!yi}5 B{.⏜jrºLln*JdeP bd(@`W ^AF.XH. o;E $rat!FJLl'^ /2Hڼ X(޷W!)TU@E{{w{%zpb|7WC1jbiR͇b |kRA|1:=#:l[C73eeTLlͦV:*r:#;7" AROlzńͯQ5R"bCk, ` &bPb.&c^R1AzlcN{a"0oÖ3*ҦrYf%`zmVl2  s†/ly^MA01[mz &AiY}zot qBcSB'r,_qJNs[4`7Vq&g&x5|x&D|;EttRsqp ۺJ*Ga[/t;{˳JR |{gs%_·*Q!H\Ǜ![\]܈Z2D+ɜb\DT# +T2Ӝ*MRBe!'j` 1&``C!*h|,n!*4`_5*N$h+BhJuФ*֤8+hȆ+\-1=5}9=A=E}IL=U=HȒr'$ ܓ2> +3]+WfD#)*xir0>ٓ$=N+ӂ]*Tt&!I"I!ظb3#d+ ]}+h6`. Eb#o dۧDSBو`ǜ^D=7,֩}q|Ѝ!fMT"dQC$t!脵 KKht@b M:TT2~TRb'`ZL4Oͺ.=e=ɭѫ%?o> xTcr6^J PaWl b*̟7@apa*ЕmVƺcF;2َe'eU (h 5LLn> g_BF01y!姝l)G ΗtmWRVwBT1#HPBR p bʢB; L嬋9t։I3crfg:Û~91K89k 'T $V X Co" @ZPܶ;"KwW|/޻v5\Wpᄋ;~ 9ɔ+[9͜;{ :ѤK>2] #%aد+eF9QنȐ)g,rRhљ!i(LY[ \Ō " SX6!+NPSX2U^PF Tuw^zΰVnׁ`Wv!Z("-!_$v\j.c2Hc6ވc:3 3Μ0+T3@Ҍ3RVT1Ld^91T!,+`&KrҔf ˔Rzy^%*1V&BkԊqr xb"T@q,yuen#fXi6"'*X]ƅac; kJkފ+e8 HT*YR{8H Ae\M&*-&M 2m)-'2h@*lA,P.KN<;2*TWb$@۪ˮV؀5j"1zgB"*nir*r.fLAL."I3t(D2leKC9Be8#3qL8ы'v: BQA T]S%BHZ3gA892ӥqRƢ·Aۥ{o˪z뮿;i6p.P_I.ɩR8Jh"T0A@>{1 4I!8ӄUD3@z]3kd%r*$6ХyϣAFE5lK{̐_.Q?TBJ[*SuHc& )Jbp<졍0#Fm4F Pz0:R_dH~M" [`2HE Zt2tm@˨@@b.I2c&"H6RiE3f4B'XlD4Z x/tf -a>"4%*ZLd&o\r *; TJ72*# /`.Sؤ2|&(\1`^)ͤ L8x *r? Pq#Gm*3 C шJtT1qJI(,=CVt$-IOҔLJ_ Әt4MoӜtK&yd>jllV K:8Ó]+oJW!>s hbƟj]`D6cojkh4Om39М4v7wӅ2H:n3_ ok\ ` {.d+{n hK{Ԯ6Sbۨێ]Ymk;=0kJ{6Jat'd2?C)!1 Dj9`2n }d$ wSc9o )sqd|J7J Fx(F1ɄRSfZ mt)\48Ƽo>ͨ H'gVhl!'c`.E?z"P )1YU fΰfhW @5x$5;{g'5:a -Fyd|7cWEDo(Dg1Vlp'pW,]C+[Jご2/Ru]Az̹yq%A/DC~\3gˬ2Lc~ q 1[އ$Q1Pr|A{ $߇""-%1|Dq}1}%8"XWRQt` ˰ @> P Lp  $pv Q F0~7xMJȄA8 p7W @P p _ RM XH q8ux] _Hx|y(0xS j |RE`^qxA e qqq 0dTP(Th舓!t8 v( SFp 6p Q">UHx` @| e !%pxwQ討HֈҸʰDAgI{؇0 xȐx9Q8U8@XQ 0M w~n Ix3; a-0cؓ˰.G3 oX> %p y` ` `5$bɕwJvcvfj W 0  %|͠ %0y KٔwъA Q2i 3IC),1u c > Dp (ћqFIY)g> ? B s9љ99({p84U} g W IΉ 4x zQɟ)њI L1)U  X 3 ,TDF9g!kq0%Z':?r0BN$!aH1$@;QO24JK0w%6 x&0!f3qa1dizki \ʚ +JΠMVvQzS:hQ!rhQGpzx,PbGXR 8sw$jѥZj:٦Jz[~ -:j =Tthjzڃ`A%?) 58;8;?I!C7*S g"TZ! ANj5x!Aa:!i(bJE3w*!󊙫ʊQ !J v}z ; 'xF+ⲒLPGy7wѲ1Q  (p ` } Z[^{KmjkJ誮YKӪC@ [{qaOrR?778”3"'`rxa ^ip5JBP !w& '4GJjzy)D$ g*S%nzrVӼRq `z5ڹ [)@ |BK c+=#A2$E %K;_+ W@!ڔS2}~oKk x;}ˮg%{CsxMǒ,˹7ksn13 .q,4̲xH 4O//,  | Gl .J M̷wA/ȱuG] gy+h0Td5iŤ^K2̮rÑQWK`;p9+ [`-k_.,9êW >LwQ\Ú ]|ZJ%Pǰ `<4/|8;:ʂ89jŔq<ɌƠ K025J4*LZ[Sь6lε< pAϐ#96{Z2Lz8 7O:ȗa8n )8,1C4C<Mc5M,M!|%J،l{_6M԰<}<4lE}4`0<{z P(9A0=q [wƒ;t*=C>>3T  Fq }@z[wւM>?9ː xAfJ7 m59ّmڎQ>-?AAЃ0#=mֽ϶;6==Ճۛ;W caAss<{!=QI[t'!UNDFڋ!Y>FR fI~凎{ێAwDq`(nHrb`^~[]NUt!l>~GP `N LHN.RHB<6L7 <$΄ل^`GƷ?QM"8Lq61QN說L^ؕQOEoGIKMOQ/SOF5kuxUk9UK~"d_%E^[dܵkg_Vq?+ij{+avoOO`Nv^v0t_` fQ*kfmFg`5O]2WXe=iѵ/tE+Y1:2#2 1Xjke^UY&u*5d%ȿ/jjOh"oUKRYEBJ-ed[ 8 *ؐaC%J\!D/jĘ`ǁ9vHE)U^r!ˈQdK"oi2L =͢FtgKGcN5*4ҟ8}Z8h֐1&Yiծe[qΥ[]#urrlצg_-Y(`|V [_WB VWI ՠR;'漲ҦF fzr5^_FΩ6Vx'^qɕFdX*O٧Fl$Z]c.%y k6cg8dUv7v;O,#;p n$ m  1r:CC9JLo2г[%l:m?B 4  Cz:EZ16|<>"as= H+yl,9#qM6tMLTT1L$ʒ@h̬JzJ};WMFW%tQE qZw_PFd}.Av =']M 2(`=AP#$a MxBP+da ]BP3a mxCP;a}C P_bXD$&Q<\3ND]Dg@.n 6a ?8 D2EgThcҀ# %A Ƿq$dњD< X-@@p dd P&=$ f0R#%q `2 f$FD ;ձ>HPN=π4']MgN gΈAЉ^8Vyk`32AW,:ݎ&܊`)h2Ⴤte!3Z䃐s[?8(DnC )A1zAc:3y>;_Z <@h'@v `FRx׺<R.dANkK$U!BQ"LD.yl&J͍ngx[p7b)Ѻ1y^;M^HtO K<N>d7{ cXf5f*c@@t_` : :)kcK9g*Bg)93)+'M˩4gHZ`5J `x8O #; 3PAtAgA(e8Z=gh=BBW@#7g8<(gXa8&>)2Sh4T)B9C;ãPC`p" ?PB&ABDI+lA4A@"N$C[3^8(2[c_IE$@dLƕ+ (YXEX&g7g'.."2P'J`LFxGAsC\bFh-T K ]"3DÃ8{<|tr;7{*[8`z";gG}HۃHH IC:8M?ǎs4IhHkFmFiƴt\v<\bhbb-8ۦa5B+^/n8$H c:cbc;Aܻ:@Iabg+dhd5d]d9dN>NPId6Ig:!`N~eX:PYe]e^e_e`fafb.fc>fdNfe^ffnfgyffifkNyf5f g[8osvk~gi fbXv>Yhg7A}g>ƋVhXh Yhofuihh.hph@I|qg=g֠uh`i1 >iNvޑiu1ٚ;ޑy做v.e)~jƕmkjv &`F鑮vll~֌^[a%9蚱NΙi xi&!ma ynj־n`qv nbYji)QoNyʦ%jٓ>h.pq4hFXQk j.oAyPgᙋ넱Vk >qnn7pgom񛾮qіhv^nVjr)n뽞#pnXrp? Y~p~fr.F*ǘ57nnfFꟁn0OYb4l6yoLߌptPsnt@tnEuwQhoXjam6tj.`7v rM?T_9hv}6r̙iT^o[g&1?Fpucq'Yg=p1GæD9uouq/qih!jo6x /yGyOy_yoyyyyyyyyyyzz/z?zOz_zozzzzzzzzzz{{/{?{O{_{o{{{{{{{{{{||/|W?|sp#X|ɯRG5|͇AQJ}?}/dHWE8G}Oy g9}y85X+}z~y0PԴ~-S~.BrcEp JO_$Ё !,W!,PYH*\ȰÄ<(ċ3jȱǏ#XqB&S\A,cnt)͛8saDC Μ!AM4ԔDfQ.΢P R6S,Yv+H eX܁} kW2~yǐ#?p "x"剷u|2Q٧1u5H/1ڙ1/}2ؖxc a6OcͬnI= Lވ%2iCTo֙knbIKmg 3QmD F!V`T8ӌ'$L!`|-͈"/ID8C(9SFAxgׁiQ]n8Ë*@"62( J8.yw!ڒMGeNlFzW` hP"6҃St`:YaibntBhp'Bu@і3KƂ] IltOB(3θlUJ'P 3Qa$A ªB5w)A2(euTlA6 gBF%IZi,;^43< hIi8 Є),Q $124,4T"d2lPӌ3D@3<F]պ;P'! }$D/8Ӌfr125pL TSBk/ D2}zvkKԶHH O,5~fs6@ CKQز #c1gGۦfe$-e׸C-5VYޛ@ qEK92|&|To{ZKv^ a1'tSWoOEDzCH`-Y[ mHc 6t @ OkY2^a!YK">H ,nQ0dQ1l8l: &H!h`Z3!#d-|/(3Q0WD$ь\1[b3VHT":l l@ beɰ0vGWhVĢ%@ Bf(`F249*,Ԋ`<=C fc!2a3l9х0R$)WA\."t\P9 ,# g "GpF$ @.xEҤLⱓ:dͨ-i<2$`ְ]GsN:c!8FTRR@m)%j[ÊF>2GA R JSu( g=S:ԩyt8!N * JV<R*L*UA]R@[Y5v, Ata9!1 ?!?X;ql Z?!h\Ł3! v!3ZpȵeO ٔ`1kb3<(m'@`$rɶlc"Dy 4#Q[z gBM:u]DDİrH`hsQmA< dUH%pOڐ@\;:Z3PG&P{^$(.qTuuqrg`A^$Lv!"spF_\#X'/p!*T :.@W) ª2%r,% ) 6z1\e4  +> _80*zj!@rf1ưF!C M}uJ32 Ng "%p& d j?k]-weۖ6n!$%f1n3GT`x:fܒNSx')^U:= \(J1x8cTV  @i[E,?H%N|}oz #!pF:5 2FEA 6`}`~ iRHC"`#zZ3 uĶ8z$"ʠ p XUtv (F&G1wnb 2)̰ $ACH ~"{g{_G~2g[pc i{p7 'K(a ?!|7}Fa [&GF=x}^,'y{{z$}E7p"{ pN mgWxq "CWEXŇ(?XNjUrS7% EKOg؋X2 _dU f`؋jVu > EG)hz (eP a D}" b2Bz.(b2HE eWt޸t ȋjExt ?,xX"wq8\*/!8%_j6Г ]yhI)K)  R1x}iz⢌lj~y. 0lhqe { XR?AG_?`Z)@7_ @ɰ\xA)NIɓ@ qKEB Y9) _ )T Ȁ?R;K?x_G ٔBܙ)N @hMmu8aƠ A9hI+=h,ib0i$NW$pHҜ4©iXj&Z\(sE)vt i ({W," Zyu*J:ژvP7'@ {E͑T_ 0JŘ1#yhwuw zi9: y~g V> k. !ː yf.YZ 4(0E 2$Vx|luu!M >qP Pp ^JbШ)3R` #:܃h`j\Iʬ7 [F` s*V  z@pF Wxp /L Z'r .Q I!Uyq˪ v Yʃ>HʪjNE б0#:۪0ΠZpo®ڲ _:! : X6pe4`:E{Hj pnު 1U F *;w"d9G|+ Iq =_ @ aAf%~gD4 %(@'cP7v|gK9{vA:  zn0{ޖ(tF1# Y;1F  0F^V`%]mr0$a 4 qXa;f[H{ 7 *BJj@!G^!1g;w1$$U`+ׁ݅ ;K+& va+;g˺ +09+/l*I,~jq DS K< M;W :w`ť I,la4[9b<ַ~@2&0p5][pw!0 LVɔJɏOGY1'Irp(PW#Bq)$)ɣ<ق|!$WqȊ,JԼo$W͋ȕ<Ω̱ܷ p<0J}2QͰϼ| z & p`|^QMͭATP}ѭ ]zvz4 \:5=ӟ@7ӑ1A}HJLNPR=T]V}XZ\^`b=d]f}h.Lk4!imq=t]vΛ-0-A'%i~|=9։ld2};4Mlmw}B֢F+|QuU&Jr&0Wڭq ݗMc&aګӝmj!Aܟ ڞ+ &m P7 "(%@% ֭] spȝǚc"- Dq/䪍( z  Q'jVΈ+rq޻}!+1a* ($lDH=),.V.nߓ&213q8&<;u#< &spӃs04=FA=SH K@@>xƓ?ɳaD?s>;Bt=8@3%n\^P#>B~Y='e/ǎORPJǢ>Mwƽ"+j%>UF]8Cj mFqLb46P95KPKYmGO>LRT9 ($ZÎS>FjSXy'ePVdDP~_u۾(;pUUSuS 5d+Rn! ITU.髎o} NQkb%Nynon^]2(/,EZ*XVi[eY΀ShGF%U$@o_ki_]gFS%huYOvZ@c4H7kYNen\Ւ L_u/Q6e!qVUߦhxjnM_֦_*?r/l6lml7%'PwF_~ ٣dwl8rϚhu'vyGuqjl0Wpu!u,myongpuE:jN  <( B ,PD%&0C=~qD$VHO2E#!X'·%at'К>yrИ"S:ݸTL^ŚUV]~1,#jL3 lK]-SXY&x 5jăa[pY2zĶ ߂ 2vpH kYay٥b:.Q1\7xybu[`ey ;XT&N(M]6Iͧ/+)<9}׉{yHANo@0C0AdZÙGJڅe~Qs5J,j> C{O frA\R`.pC:KH"5̙["4Tqf`"RC&r/>H+V!en\ NWq$`xR@͆7tEdrxzsE9 9ia,TEkh& \1A%D+Nl Xb( !pĵ4+u$b⇴CzbUFh OtFa q<dfx7<(K S*(d܀Ȁ|D0ƪ ֔czP5,j&6yBfVܦ5Ya.߄[7չsН'bt`BG*T zҶ@ =o+S ^ vgO"0:'1e$A)؁ PҏJGQ5Ӂ0:MfF-@KIjC0j45EꠠQUթjV*&,ë_j jb Y H\h?:Wuk^Wկx+";X%` kA;Ylf5YvֳzVЖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt TuA]v׷ܵ4uW\v- ś]RUzwn~ސ ,~υqJZ[!Sp~5|\<د!qyz_6L1Qc oS0F{LΊfg7gHr-CXͲ%fge֣]Rj"gAlI:frJgrZ׌Nr&ߙƵy}mnxDWۨ nvۯv"]n`EmnB;=6צ` {ۿӌYi9NxSM nO'x uͧ9_WjxӶ%vdüݒVx~*.3Mm]hf{`UpgZ-U2+vşiY缂dpjG2+\?5mwSӻ^Ȫh7ކ9p{DGZKnm+M¦=\f,K{?w{]Q)Cw(=&nO8⩗=}YU[gK=痏vߙg:RI%t^?*yZԫ$ߣv3W7I-k[Ż=ۺK6K~l*ø-;$ C8@T9{?颎ü <#7b !gk< ?=3@(;#@5kA!41ƃB6㶷YA$BѳB |7+q3g˿0LAһ*<85蓼C<.<D>t>wEC0@6^ 3pھ59B;oã@NKBO$E/īºCs , *)љ8NΣa^1cEʺ0NdJ*!>\\[ZF`oǬzq$G:1t4updwěGrGQyG}!ZG{9ǁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȌH3 !` ɍ$ɒ47 JpI^00Pɔ@t\Iw2 Djɓʩepb(Ƈx7 <(b`8J<Ʈ[86RKĉ5@@KwrNH4{EsI$L΂XafJ S ˏ̮K,GUKmíKꃉ,TMƲRЀĔƤǴL4˼(5Ɨ ΔMʊX%KKSLѮPN{N@+bY4HĹ!#xî,`H>+fhY 0*5M*؜f=Z7 d<df(&8fDRX bx]8B:cXOTm&0dXU б~ $h9ӛ@Mea_p8Y87(^\TaPdC"!d=dXeԑ _0iZ΄@]%0N} 5e󴓆H4fD`4|iY` `a9?xDh 1D6E.d(I:*_?aO&Opa<^8#IwggV5pV([dF 41](eiq|]i| maS#Oh̄fXtP. 2]p҉]P8Pqa9( 7f1jU}~P @ԴRgBVi︞^xjkpEkZ`5 nqMD`f~5vm4҃JP$h$QpRZSzbQ"rP(:X@gd7]0/pYgg8T[ aL1*]zd$?@A'B7tCWE-<.G<-Hg JgK7%l( uxK!!KȴQWH&׊EpcETUuhuUpTW._gaKZduvXWvlM @_0l)`qNn_NJ*vwd9Y_vGHnhfvcL _0S_P wwPQ.QQQ0QE|Q@M6 ]HSad8dp'xYQiQҐΏQjwwgz9ӫgJivsBufSgLZT]@da?Yվ\|VVkNUwXlBUVoVqd?q_x,gxg`s8$gbbITgXqTa-VcѬgVDSgoGUX 8zȏۊ gh:MoM MڥgZYY諝~ZZ]ۉa?ʿh #%Yg0Y(wQugn,h+gH3;83t"ƌ7r#Ȑ"G,i$ʔ*Wl%̘2gҬi \D`BC8D31Rqf f"U)G$lΡf JRf3)8SȲgvdC$`+g)X,2b8Dղe"(LYg bvQ/F9}4ҦOon5زgӮm6#!4jLLϟy#t ,gʗ˂ZbʛsD& ֦WP"T3j Q</ϱ4V :*5}U1T /7AFF'ui!z!!8nr$ ,Prы1X#GrL'#%]%шy6ttdK6ѓQq3s0-#< +beLA 4sFIP3xP x(*(:(8sL-"=LA@pEv n2Μ@3A-4@.M>GQ{ګ3g^WP`xt3dD/43 Ț8#ŷqp3AT33JBX1Kz AN0P <0|0Œf"Z3\"G.[dW|qrtE[, JэG31G11+WlF4یץqđ^3Hb^1XJz8"u"4+I&]C-/Rl1Tr$7 >8c 0! ō:S !{K̬EI- :M3=brG+w wĺrto}Ar3J3a9L#L+3w @*)F3ʼn[qt;>noo>y 2>??2HAr)$$LH@68E c Rd0 F$ఙ# S.L;،Y/!s D0rU&H"|%2N|"()RV"-r^"(1f<#Ө5n|#(9P G:~cF@A&O# D`En9=2$3; Ӥ#;C&5&cF$!eGIH@Ҳ%=. b8bˆ J29XL0Lyd1@ɓN<%&YL&ӔD%8YC 0y̙`3#-q`/UaDAީo .PٜI7KNrN5:_εt#I=1r gt`.} [ (xR(< vwLHyNś'PE*T#'*A(έjEz. b=HYUdt#;e V ԋ,0+^ g4?$N r_fSz@j(i:[XpRP2q\IJ,g adr@' #/ ,C0‡< H2V1V;f0hȀD3 \`F/݋z!-ƘA5gpמնTr82~S 24]Q$;D );>R oC}.4E>8HFwݕHt8V,` ,bV C"2ȼ*h{3 N#6Amc[ۏ9&D.vڅAb a 7A.C6ȏыyQLE8C{ve m-7x`|A؅T%5XAF[!1 (WfT6HT*`j4Rۥð5L~8+_KeuoEhwk2mo`٤xl ;(zsrGq-{P}NA9w&Iz䑁DSB9]s+Ea؇u1<#`eHF' ޠМAr(APx5qR<A(Hџn!\֜ɝxשIA[9T XdB9@"I@5ɔv^ޝFtʎ[i`uA ݍ8%D`  Mz"1bA!HZʉ7b6\!CP1ʆvaR`K9#z3a7EVGvIT\c6ҙʾa'/8C't̢@ ̜3A$# L`5:<9㺴KJc"D1$Oi @` ڨMQ%MT@2HB]q٤M* 82DM"1ڴcM.".T+bTVM堽i-CKyDF3IMp1G0"D/DUF+>1gMUKtJ|H벺Dg벬JkRk.҂g|B)r1H ,IշjęTRJXGd&,W)jþ)xA\m+WpF1f*L3m2AHT C}yĽb1AA{)&L~"f -i nrqmR}'M*:a*,.3W]ٯ٫#u"tJY'݄EB$ 1  .1i\UH`A3 |Z!g1 YAڣEڤ$,D=r£z\h.uYYڥ X-Yr~Ꭿ. $YEQ #\*.3 ӗ!8 BB0S61t+adC f}csݎpV\A&AY2r`>,0ᒯ 㦣D2e w$: ɱ"Q@oh\"]qB i=_o;yec2p`a HFj\On S >h. =j6A008oA2| Q$&Aa*Gp`bbIҟ~tx+}Q P o,r1Z3K \H2A@"Q 92AY9 ib},2nЭ@2-C#N.Ӝp4-rG)  QRj2-s1C(J3.b2Z#  Ё!A2z$4~/3BAtGV$A f>~ 99F7jtA,Mu Hd8 9+]$Q dADD $cLr7M) Ӥ&N'4<2R\:e>&-dm]B_`g&UZeQfG81 vO*uZcLfуOPP5e#!08S',Ԏ׆'B['=sb$W4n2, @T\۱T}AD(&(lCKhh!(G[6#O8O4 5Wך`e"PHĀAĩyi~+DT}88|7 8I,/xH kZwԄ3_x,*g}{88888Ǹ8׸ϸqJxkLJ9'*;k0J|Od*lQZYc7HM>Ԕ'xQjӖ{99r ĤldDR59Ґ3k93y9C9:y1v[|3 wSz/&r%ҳzP:Q#d#;rRz꺬z:w~-:v:8e6 sB_;r㺂mSS;q#x{P{IZB;s29 {I׻:Q|?zSq#{{_o;,B[{,9ȣ㳵v.|ǃ;kw;:T9N<<|G#ûk+oK;,'{3,Ww/K|<<=yW |cssg~wj?׹/ҏ:˗Uzѿ1G;{]c{k;;ʷ~ׇc:G~?y_z +{:ӫ>?l:Nf;@@@&L(P !*|ؐ!E#JĘō'v(dI'QTeK/aƔ9fM7qԹgO? I`я(UiSOF:jUWfsHY:lYgѦUm[ouyn]wջo_chE)5ihǚ6pd2&&M™[: %qƇ`Ɠti'tc)L#T)e U% U(!1ѓ_tτ5B}fD̨ g>$UqGh5i48`8+W9ӧٵIgg^$*TВe$07#;bq&HT&".Jr׫8(}_R6r2ۆeՕ]]>zMVX$Z5"/VIdP_ GE_P>hnNY *7M,J 0%eV *b8@$ @IxХg0()K!ah)[@7+~Y<@d9 _#e.hgf"Gum}1q%% gQ(`1?:ݙ `sڱ`#!wbI!}뮿{>^u>!QvcE$]yc8y蕑'4UxQa B/֋{k&؉.P <qWA g |ÚMr@N|aj33Iy ! _g%k^&NPR (AHRex"^ jq2LDp+V!% nͰ"U$c,AT/ ΈDVk\RƢ$eɰ0t($h»J)|t+RGV&N~qWD$1.984 UmG "k|Iẉ-0%0Fdl\F7 AMg<: gPHщc8`ͧE8cE x-LћҜEy%!qX)8Mrғ@HefIy˝ҧU$tK)BNw2ԤNWx7SH Qpc0Gv0 |pAV R*\@*Ѕ2C1ъE* gtA sY WBk`?q\8ޕ3W:,fC5ΖEkmpmoWurjA4f*aΠ2$xZQ)7E<3q1 9~q 㡈m˜1;4nkb ):bW51D +ĻM댸εzp V!G 3P##YgtRH e΄F!@-A3 ) 슬cXsNT2ڋlcBpsbm IM  HH0 F2a(v{Ky3VHtǹ03܂Be.{bVu3-@#DFH|$Yֶ1il B$ 8)P6=`q+ qH~%\܂0 `ZqB=z{6t&'N3/Aboq~:k#h Z]0UOmw\P[{x7m^|yo|X9" ͠/Ψ9n $e^36GꊐFL!O(  !." v$A~p! !&bJ(eO!!qE@ %Tby+BOP!a !/OsP$ !B0!mVv"oEaP̮pO(V޺0 Ͱ[|Z"`o,0#0pPlT0"R 9 q('#ad@@r OC` # ED A0Evnt]Ŭw>.̒& "gQ`s,Vwj ZzLpQ /O# 5%<\y]#4Ppj !@r!Ew&"y u&Hq -%R'' Q̈r#*q*m:B0 %vjE`@J.A&,`\1+L&,_A,,J.r^2VD`v h( 1K&@|0r^X-G.%2- J3t4BLO, J2m ڒTSx$R|P s8# @bs63L98;417&6$ h9A9;3"lAV^A<n :i3.q$"=׳=_&052i@ a-AB1ƐD2BCR;˒<*e&2ES f"` .? ;s b n GH@HXjR(  GZ *禃H je:NaMAKn! >ކ  PqJ¿ 9cdFD":v>$w"@Pq$qHtS$t:U!["CV!|T3V8g?U!:;\UW9Tgu:"d1"ҭ]|HL;V4Aa\UQ)^iLJTMN^4MouHH !"@`hF))@B)g ]._L"S8Y%v )n@ 61! `Vd1F? *@rEFd"$`;&%H)$n6gaBD$v'b`NkQBka"e{g'V$jVi׶'+vna .1'|&X!fh3%"h.Y$ gn:#>ؔOvezZ&4y! #Fzvs:E]\Z#6 !W@!bN\N`w ⮏3!&!Z`LvQy]#$cZou`.P ̤ b?b!@GEǵ 6H#@-L̜۹ow 1c~F#! اV'~"} m&8ȃvpGwj^ȹCh {qqBt.=ԇ .|xx¸qۥE{*lj)`|[!M <`(Iĵ45X8h\ԕ[e<|))xpziHXPL4LCJj\[ Z@~ ֍"[AЯA̧ %MJ\Z(R :+ Ti^?OjjކwlʐrJ ʜ|"&RʲP$}QNYqiI!!HC k"08˳Jp>eU~ x'bZF,a+S+6h/ bZ뵺]7_;^ ^ ~> ALX"׎![@( lD;Z!F`A +۰H\ŒSFؤ!H]'BY37Ƶ0NLMDZCtϧ!zgj$tL!c^ EbN? @Tp" NJA !̇@ X(PDR$> LE \ t 0ER`ƁyH#} ,RD .r&F0L*D/Z8eXģEMWWI ЀAx^zy 3XL1@%H~vli Uٸ BٺW͆3@҅ 2 )-5SD1 zB/ @{8H {NVEZ d/K!5bQ촐SZQ}, l_J,b%Dbf2R;L2m(%o8Cű|MP2ӑ):m}Z춽i2jYޜb.[7Nxxeªˬ<'٭Ez#!2Ŋ3x0).D8cqc3xHt3\")H41'>jX8Ge?%xT;-se9h.IZ6Ve@ @ ʈz~8C{(:v, +~':]`U`΅rs)yD@DO Z;I H" S@)&5I"Akvь7C,Oi m4?CdG/pr K!ΐ>wJM|N'-D |"hpJÒ3B!\ Tp00b8\Wь'C Q揁d!3YKF"pDﭥlʀD&VJ8G"1pEbTWaA&9):rq#)LhJ}$cDi/Ԕ\@G9J&MȄ.%Җ\(O$H򔩌fDh9yd A (Rqx@6*:#!S:jè*npsQըJuTq'4`!8 0K/2Hd 0L1dU  Ց34D"(KKX8Dq!W.D f8K0ֱ,aVՉ-0XZ PJh " I1f$aj 98q E8ka@vz ik^[];]5PC4hPBĻBV fE 2YX" H#RLԈjxT0a Ȱ=t4X{M*ގӢ:T^$RT.ocd|xok ^Uvum$ @'g fܰxVOk g@ @F3 dsgwU͝kփcw x{޶sb*{1FJ-7 vqzkk oK|⥦8n-j[\77|$/O|,o_|4o|< }D/я+}LoӟK}Tկk}\׿}d/ώ}lo}t}| ~/+~oK~򔯼/k~?Ћ~/Oԫ~o_~o~}5y!|aT·Ooy<8mW ,`98 pa)| @OkQ:e[yC^pqTw hk @~wZJpU#}7| q $-8F,s7bFe烰 HQ;MACXq ˀ P#]1#XilbqE1(p1-@(53E/XFsrSbփ? Vx?q -N -537PiqPEσ!ҔǁqsшcCmah&xhb1ssv4~%1+7z#F7t({v XH~! $u ǰepaUYF 5`zT"%3W }1 hVŠ[HJ @]( +  Xpx鸎@5rبT RLp 5 & e " #5H4i8vFyʐEU f @$!cjYIc2kcr㕻XH4` t 0AW D  5w H[ʠ Ȑ b3( N  Jt# ) @[H̠  ̐  T#JT I͠)_m .!̰e ɜPpp PP"Dҩk 9 1qA_oqT,^Q%WQd%#"{%cM6(>C$ Zbh8876hipڦbX*{~ X 5;{v":䫘q:A,@/9Z0,J(Jû*%nP 3+{~+9h+ 8,;;rT U@,>;̮&g!IlnU&b=@ӤM_,;2+TAD±r.vǠFR#+T{Jh {s `rNĽ'!IKPGs$!$%MODMĤdJJ) `ʡ<ɝtS,(%"$,QdGxN{OdXW>^}\53M>S{&tVeS~=euaX]zuz*v Hi rܥ-(&aegddDhc5&}L6RBhI i;MY:!^*9їX#mhՅ!jjBe/Ig[uyiiܠh'"q^&)HFBNfJI樍F㘢6izgZH*룵槡 klιJ$q;^_Fj}:l&Z+k{l-V *RFWꬽ߅).@r;y{(痰k߆lNoluJL^ R`/17>ƫϫ-w"j1d{VC %<~~,Iϊ~x\0Ĺj*KyO6; <ˡWy:¯=yKz~9~0:F.|; ˤŷ yUhE]62[W򜗨zRH:n,U|pj{Q䡘JpC"W5 f&nP m">1t. ʍ:?Qt5#zG4aB`kKaV1V΄{cH9ZP;B$+2 ]!yE#2qQD..z2q|!Xϔ7;Sm7~ @JЂMBІ:D9U!|%TF'юzQ-P⤍P&md 3qD4[A`JI!!8E,hYiKAԦ:1˘AAhȨQ f4#θ(Յ]Κ)+Q .\\;TO `ۑXd 0aU"*PÚn *׬ε"fWU5䯄MjWKB)b؂v(k +YR حC,1 r6 "5]7 ɭgkG x g,CT bؠ@pF" p2+͘c W(~ *« R`26\[PhF1p f؅Dz C0c8^}_ H2V8 ]%"d8YͪP:2C}eF-8xj* @wxγG e8#6`"J֫@p+V fh@/^U 3-DV(rpF3ZPF#"dM kAH  QBȐ% Z)p@k[7C(1ډN0hƤkiHD, Zլv;!,`Ho-WHΰm|K`"@ $rgD4c n;.@Mnw;ԣ.5?p#e0(RgA"6z]AI3 9~6J~ }3!1tŒups׺F/2cg@XipFt !Ar9+z) Ö!Koocfcz!; 'q DׂH%p[z7G<Nw}(<5OtWDشfX9P 1HA `pƓ/kӚ01K"@[*#@XDѵȝس`G p d͎$##+a a}gp $2u x% [  Ca}'z àצz2O&}%& 3 sUұ  Q ̰ `dgΐ l<FHk&UI хHa F>khS(V@h U Qΐ gAt i"qňx_?wO08X$ Ch'ah  pErJ[ Ƞ PMH{l( hDҀZ 鉙p&HlHa8[Ў]ljs؈ n( %P. O@Hyӵ 'tjb P \Q汅ey'H 5R9F @T"i @r`h0h ~Q=Tg0qqU( XT sP 0p6yiהOeI^_3EΙ! ܙp ) y9 9] :Fމ9q٘3rX ў)_ z_ugv _4!TcY@RĚ 'X Q^UP1_j0g0S^)1@Ȇ_ @ gWyai @;Zq.:12qǠΐdN G  P]:S< X8)*x_ FI1ʦq*j_0a ;ס : Ja0:0qw$i\!4,0`J]JL]3 Uؚj4L0Ӗ`Q꺮єW䮋lPpq0캯گѭ]:[{ ۰;[{дQ;^FNkA3!%۱($.7a@htĵN3Kl>y5VU5@z vii?+NOKV5YAZJi @aەC)].du-UV;΅n˵u^uAf{f>feF0a0S^ )&,&/&j6dE6G f c_aa 9bit& ] `a p%o`5vc9&=FZ5k˹ g~h!Re;Fi&hhVʠ Ȑ h_{Vlɶl'nv:j&qj n &ovk 3 Ov PE 6mfmWB8Ā@ Qgk(83e Л ]Wh [̥ ;O艊n-rx A4ELVX[X\,İ Եh ؍ؖɸЌ !91W>|kO|-ȋ8*0W=rԴ8I\ӀM$i!`-3IԺ`2V XA hkYG li/}-n\pE> B XyB90 y*_<] , MN ]ݭי)M׬- Hhph᭚ q̧pI9 1Z qę߇>М) ~X &Ap`Ema{[ > f[ҊZQnL訞N Lz"м>^~ȞʾItRӞjR(R,0%@~N^tjTQD-^ĘQF=~RH%MDYQ1fXIp+#Ù3X) Af5 ЬUf.-i>өS:)ªW0W&fԬZ,,AW͚LWv}+@faľo2uZBUPy~/DЎ1)ǟ_~0@;Z \Pkfzafp g hgPMZT9Ьl` 6glj%d~,pˬ2g 7rsC'Lb%UI !  # CB!c(;2C93dgBXgl3gZY Bx2ܨ,)D USO@/9 0E [, 銓- !9ni`@[o5W]wW_hזiFcy a)H20e) k\hfTņqcz1@[ IV !%QJv{7醹0L| gpgĐB LDct&3f6P (!*.]6b2JJ`e0TV _}di%P' m reeY۝ޅ6kk?sun"\ *TnlfV1 Rm5p8FIܱt 4~$蕷jrf"8kr nf E!ee8Fa :Oju`O'~x5c 1\~W"¨殛N{^ijF?}g}O[Zm0d R[O GOyQ8;aQ3 0J\ T {p#J&]0&[k]EV)m 7ja[IrG]Rΰ!u($ToDZ P{ HO#/Hc8G:QWL#qXtԿ뼄qD 7:_֌8#la*c`#%8‚=z9H9hJtQBEp!/tSgā  Tc^xa /Q|b K_dbS5 rZpӃ4KēdH/G2CƂXҎh@:Pbkz<Hd`az]2^  Iԥ= 2c8c Hgx(6rPG+л~rqmԃ38Qx1%`pK!@YtcΩMȄ.jCh@ 2UfTcYqa MƁXS[j(u#YV KmJS%JQb %C!JȖt;AZ҂vֳmhqGO FA $?čDزZDhIA853=,ƑO`>IBr,=\ 045-D 2t 2dƺ@ڵ q;RT a/!wV(MiF#|?g:݉wF*0pAj J$Uj[Zղ63,Ƭ 7qu<L>H`r"p @$ "1e hƐ`0 ;8CѲH/C%̀㐼*/x#qC|d(yt=hBxIEX H\h瘣BWҗt5- >OZ{;RzӧFuUjV=re=kZַuuk^׿v=lbFvlf7φvm!0*=vmn 'N@7# }̵I!\߶OfwӴ=|Gp[y/ND>3{$$qq}wO;s"0G.; G Mrd9us&Ƌ蛾)s>t6S В#1$KC$,R?8gh %٠$!7A1U9@&hc8Gq8A.Q$Д%"0!@h G)C86B@BHQCDQ YD8FlGHDi H9aD,9)=aTyPXh!f`#˙ٙ;(i)8 3X gHYÔC8g2WęE9E|6>HIpD'P*]Ѕ:9 6EL"E癜(%Y ́1hnd aɛJyFRvEԘFGqɑ5Kp]0G`Bu=إJ~ E)$`E!+Z2ceP"ʡ㢂`0!]LF|"x® (R%Pm3$:\$d˶L5cHkjYuqrZ%EOpGآ@d@{rzg`p & &Oء9a'DF]h2x8gX# R_LpfXV|D;rwA-pA"\p ˖ j +PŖBZU(ZfB&z\̂,hL)<+ <(J SHn֤uړ%Zڊ}ZE Wڨ'mcژX%[AXתSګuĐ,ڙ=$ڭź=:۶%׽u.ے[9Z$\pٲu\sڎM\od4XYEZߤϭ8pF ݘ ^mݬFY mX}u]] 9]-ޤ#M-mo ]^ܵYUe]4ߥ ^5HS%l S5]}W_M][xm.5Z]E^ N[uU_^vdD{`-\*e w_E[GY} n̕Wq6" 8'NYѵ].\m`boݮ%]~uZUnbV'ໝ)c 5cAf.N[^ݵ N7>1d(<ߥ%a|[Wc; UDdL`%Tֱ0>0` FWܐh߽\1%beeV`fQaFd^5ݭd4deh.4W6:iklmnopq&gbdSKg_[giyr&W>͏-|:eg}Əxи}psq[Kvs7Xב/Ph ?͈vF #p"ޜ^<(b?si̒Li`v;CvhgH'x%[pcp,j; ŋ[ ~8kCbg`듀"ꭶ~˙VՌ0K`-$ 9jUlU {]0" nOBQl\~֏m저뎸fQgG[ag欈82s喈-؉* 52Kڶl)Љ =1m@HKnop]&E `mnKv~SFFp:{ f:9sw3np7pn1$ֺPp^* :;#F*@Hx&8f` dkPȓhQm|o(me;1-_!= ă=ًX- X[K{?gȿLg|k ,AGng0n6?o_ |@@#x}[ }'X-q][B”1I5i%9k#HY@o-눊꿔*v.ñCC:8No,9 ࠩf,NA9 ,HY7j/: rp1! 38&΍M 9|L6}Q<}3Rq@k2-Y VFٛZQbgkʙ UtOCCǍa5lqϊsV,; ))U9ӰbFV7Z.إ`kyǙyo V\MO}wpҧSn:ڷs;e/Ox<@3gƘ<(JQc- BIA8#R`eF$A-A ux_~`/(a 0,$5t$8IE θRC*f*@(3VĎ9V2xHI8BaNNFCyPPh_uK|qRdW9HdH*TIFnEfB9sJje)KA S3 T3 Q@9ffi%ʙgRr 1UA JEMa|npb~$VX੐"[ty-;. '骛n 讫n tBI))"VA7gTx!NCo|"I>8C)1,$@1Vt8SJE\+lt7-bH0o$0V/Sܖ׈%Q]g3 3ΜPЁ t+ ჻6\!Z4}51¼5 I'|2SV4Npub𵊏~;;#AK33:ٮ4SC1 kD}M)' dڱ  2 )-B3.Re~!U@{ndz,#$I [, x A:SPt8+(#֞/uvz=, ն鼪"QZ wX|cnbJHB tgf$/_AC∼BBc,7pZ[ÍԎw<$"n:X e (ş?B/vj=q`!e:PtKbR@2.% "'J$])* Ky 0"$=q(H*W9b$qp 2*N RS 1B/2ޤ|G[ ׉MUư"gHpgY.` P3B$Ӕ&Sl6S"G !@ őpDrdf&hJM6T5aQs| O:@C%N)թRVŐ,9#3HF8y8XpH6 ` f\BJA|8”q)XfEktB֘ I|+`@( Ed h)Se$B@K$^ul_Y\,g=[9V-& e,̈́.<BծxHW$nĞ+sk\8"pcoTe׹e Vkپe cA<jmayzޜ,.I&Srm' g4!{l q|ZmĦ=k|v o?R UqnMR%)東*!V " @q E3^IEAfKc@FAAo_ ^8 rsfHE/<2 D3鰁.9E$ 2 iaA3/j>40a!KT9M@3KZD< n&*5ΰdLd4#(uBe-sYO^f :>  |=5HllzL!Z6ҕTU!Cq^hǂֶX;> 1يT +[fzȶx0^Z4u rEYW\l#^%s[ 0̹0JAҩ r6| B}d}CRF wb:ף j#^* #LI0a<])ٹ!?;Pu?+M3dKqIqYqC/ѓ݁ $x'SX1+mgJ0M/_:}p|'v~/S)pF0}\@c>ӯ??  &. 6> FN V^ fn v~  Ơ ֠   !!&.!6>!FN!V^!fn!v~!!!!!ơ!֡!!!  "!!""&"."#6#>"$F$|zU`rbyU$ ̵qt L{1`U۸bu3N. ו(j,$h ä3b-vtآu5rF$G8"mřΊ5Rc6b(JN -C8#g@]è֭""BRD>LC#7-d<SC|0K*J; B6Rl;JHJGK2dEQ,wR\ +8/3buI'\RdW:Nv3|KHRd٩IZT֥w̥Vn]R\ 2$"yhc$C!,34{Ilfg~$i)HM8fYxL)ЦWX~@f(M@9RaZ%PG,'O$ku,f}G̅kƅ[wևOHgAoEs"gڝ'cLVnOuTw_'dG|D,A mO8C0AmNAd`Y"-BkȀ'^`=lX>.,Z%``/ZlfqPdG Ir1@WLA(C vH C/H**]xff*UBA"tD?3Zpbhc8 R{"VB:õڢPH8HT jHC̮F{/@EaYtA߶A WD7FřZ@_PnF.Bcp8L.4Hh3B3d\]$OrAT3\Erg0.l2]d`ʋo&<Ӂh_nAIAo\d2ƦY^Qsrxb3P2-0j%!*WD%N3_0662AT'2ЙC0<IJL EIE0戮DU"0{G? }J6\IԑFxm:3Ehˎ 0[˞D2x,%A"WQyP7PGQ$ M2+fVl+3l-Olæ]V,V%-cu-Y..-6 3N|Ȃ2}=³F(C|$R2b0}bWV`\_M5g` hl ^OLM`Yq[ŐBOauEML &GbsF6NmZ3S `6$Cϐ t`@L}0*3lz7xoGȪvtluk"v|*7&rW,6XX]A s5 -A4pYf\ Ӆ5k|d4aJ@y߄Vqł_8,O@wH>{DD lWPEM(#D̈oP.J8F}ϔPx'ItSx=,yd:b$A7QA-GxK {/-7}28/wW۵|7oRa, AdS3383,K: mLLY3 B T;LM ;w1ܺ3z; A̺(.L/'Ғ1X}-YCĺ+%y4QA7u{*SAG-[,Y309*y::6,)\|B )Ld"؈0LpeBB3mPw87!U7UGK:S)G:f֍؃31OܙzXܼ|`2C(Habz Gf,lB;[e?2o}xgXkClKed[\1Np%p-EkXEdfԫؘneC,r)WE٫WkeV{:٣}G1 Z/"\t('iGu/>{awN5Z03#[p}ɑcPG;OY ,LPl!P ) |H а y*@ %PR$N*L gj gTCjA$a7* (*=%ńJ3b*g0^$r5;rQG=#h`B Qe0 Ē@ېpOA UQI-TRAU<5UYuA|POYу`cx԰>k%S^?eHf=!Ijm%=bOŔq-sM[NTvM`PpXc-UTn1 3W߁ .NXnX8CmuQw!@X9AYI.QNYYnaYiqYy矁Z衉.裑NZ饙n駡Zꩩ꫱Z뭹[.N[n[[\ /O\o!\)1\9A]I/QO]Yoa]iq]y߁^Ku!y$%yRC 46*\`0& [)J}g_/74~<ވqT}xr8ch1W c}"PfC=j%? aP `7 Uv!jDoEO\_D830&:1ቒta"` O6Q :eBgPXG[6" pt942|{s$t5;!Dv=Y7&H>c*Px@e`$lh,c$MH irۏwua>ApޛWT,v~"[qHڏN :* ɘL?H(|a8>0]9T$ٰ&b#T6 p0 ANPb!n & b!T" a bV  b d ^!" /js b\`!PBLFG+p б.&q$#/'"K@K  ha"LUq #.!R?<J`dp! 4OƮ R  f! R! ѺQN)w1bpQ-P6K` Q8O# * >$Cm\Ұ2$%qHw(N"',y. C h@ { ``.A $t clal;` !C ,YB-$$q-a`BH-i``0)ײ-2++J))pXꦒ*P)  t --3q!4M5U bl2a@n/?k39o8&/&0o*vN,&:; l= :B02"2""6H 3<<#4 1d!B/ b%)%l ዄc?=+S8$"',nXpC7x(6`32RB #C1"?q0#E[46D4L8ӭ38QxLRRFUK a_&S5RCUaS]bZN5Vq5WuuWyW}W5XuXXX5YuYYY5ZuZZZ5[u[[[5\u\ɵ\\5]u]ٵ]]5^u^^^5_u___6`v` ` `6ava\KU6bC`WU6xn~Ub >`1JKc/xcQ\EfUd #pdǠ ( JRB d7g?:m6duvjD:aԀb i h(lli)BS.o)I mYjAkUb!f LVa`B5 |*y&Wj VtHJLp{t>4ut^6^Koo6p3 E&jq%K}Zgw]Rn@ z"D8R'ON@POyBN5[{TjH:v5'H=;~EMQ;U{Y]a;%b-@p%d{dcBR0NeV{nx0B$vAL;j!koÖ'|'{@*V;joAw"Q ʼ!z*rLahvw#AxxK vAL '%NhP @/QhBHy"~My"?b?':zR<fkx"0N8~!>%~)-1>5~9=A>E~IMQ>U~Y]a>e~imq>u~y}~a@X*~J,r"QͲ2귞- "! C h! !>j ̾<>]5 S~˂B)!_d%;I>JDA_`a "[y" _0b! !,W!,PXH*\ȰÇ|HĊ3jǏ CIɓ(S\ɲ˗0cʜ [(lp0m*DּIs$2 )OMjʵׯ`ÊKY YE<Ŋ1k6%n:ց޾ 2vNz,|ݲ#KL˘CAaj4E7]eU1#7᱌M:L۸s]R) ;]pC*x`B8}IլZO Ljy_ϾBrLDA䡫3_F4V8 ]K3A2iQ\ 2@ c"q"I30q 3,D.@H@'1# X5aJ2ˬCr@߉)$ uK@^)f~ - )"AJ2$_̘MX矀*+2bC ,+8 p  /:#@>-PPL3c0L#0yi } D2Li 2* Q @ kH'I'Li*B3x :kR s@ K@lگ۫@8S@G8I<-*bHwǀRP (2r/, T3v!m:S@v8@8Ӆ@s8ǩ3: O8@btB7!s̎Pa38@Z]AV}5CO"`POD3uѮ8C3x̯5T37P}7c tt,'Ȭ.ĸ20-3bH!Xf̃&*3m01!Q$C"<d8(3r$ 2sҌumv C\Q(C=܂ A7A(9F0- _'(Jˠ@ع0 F0H 'Kh2Md)/Gf! 6hT2bb -[2$MEAH X SLJdRE" D\ Lk@*d*(@xǢ4$z % g" iU DX`F͸ 5 HE=kZپ0*d8 ` fqc )Ʌ8FaJ27 9&I Z1(ol̤@z`MB1`8XIWIG8#!pO9 l38K #Tt%? .2ә IN@!9&h@tAνΈig l@JOCq**L hWpҔOF'J׺/D3aQ0% ԣ f8Cvq8xA z$Cs(cI-@Lem 0m!^0PD6,A `F8yaSYЊS}pZV\N7R+H"C |L2#08XH >= ک #@L!ɳv9F;zPD 4јδ7P+uT1NԨN?UհgMZָεw^MbnВe##qvMjs*6Dmt[#> R!Hinu!~Hݍw[F3g!EIZl nwE n0 Bka@".Pd7IMًpU].W@>ٶ͵B:shS^}NP)ۀu#pɝh\zq^+y5Hwr]Z(ۏ8ynv!@oxO-}um I]6 (JJ%Ѳm $NMzƣԌ}>FnwٯhF#-ۛB"Svד0Ct)N`$ 9h ? Ґ '/y~G»Y6o"mn7^ں %)JY S ` 2)r)wn-"b-.u.b+б~W Ws/lG.-mP@*ss93e*@I&IbJ -.EF[Gnߖǀwpg\`f"69Xs318F m/#03ꗇdc6E6J9x)O`P#5[nl37'5(h3675UӇCpsrp UWtj4%BlA34UOr#xU(~gh52nNȋy8]xX؋p= ~#<`Ͱ;3<Wl>?<@yD=@p'!D(=˶?X4R x@ &; v<=~=>cpݣ?، Wƈ~7"9d~ꇌD\CDUH !m+C.i0FetFi4IvCy${DEl@v'䓌(qAYE7DMg'&5 Q DY[IǀDΦDvsdoDV0В X!YLGtY3adjJKG 4m| K$MDMU4N?lwO% fN`LF%7%7lNGˀuY8?dKUKԊd fzJ~ pgwvxxeؔeQQo ҹliҦSS>UVITOR U)qfliS) 6x0Qq5WqR]PdAnB1c a,Ͱ,X$ )jz6Ƭ  8x7j0 #.*D0<8L 1} !EɓBTR|5(2,CSX-(mlӨB3llѼ 9h4:9'7)cV::$U5>5$6u(3ř_S,p(8c9cpU3ņAҡCK]4J[=Ѭ@4] FxV}׺;;! E*ҐhBBiLn~ZB(I LSAW r X ;\==c~\4 -TB\6(_DK4MnZYۏ=bY݋nv PvmVpԥZtE!\eITӬZÖ@$Cm4G nY֌ L* mU) Τ၃`V4#[]AaG5Lݙam˰ {[ΦE# >OIDnV>Z">JT 4Mٗb}OO)m8 :/Nd݅ VZ埞K^!J~yK*e:Q&RVT"%]> *^pEfToIhV9ExFJ ZٹDE`9_V> iˎV֍VĮ\R]JO쨾M%YZ *zʾYE'tNmZTmP]Y~S^~7 8Nd"e6 Pt HE!]f) ~'$ b}ogxmNhPq*Q $XB ah  leˁ 8C 8cQ0D|V6xSg0HBETRM>UTU^ŚUV]~uȱP 4NV ] s$^}X`… FX :zAeUL33OS8 VhҥMFZj֭]{GImƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^xU b^zݿ2õ;)hFxBߔhIH?[@2&B 7p6I> +k DVPWIĆd#lHDVlpqDH>B#DCtqTaF)!Z(QFjdž*R%(|,I7߄0ZC &.`!2o|i,c)P06sF yЈFZS=-IQTSdUWjS|1Nx)Cgñj”dYeH1/|t9gv @&b@^)#]p_A@ dLy]E\S= ߃AƙbpFEFY_4 uٝ6bfIh=cݷ=w!{5_S\ʜesXSCVfS'}5hV gPę r]_vFJe<f Q]IahZ:A;c#dfڀgpf40 4%3eBx7F,vƕU2{+m6Hgi%i fߕpZ̜yB;F)@f|[j4XǙv Pq)](ˊQ,hgՔp W1 )d-p  HR.dx1x90 ,,AXn9_A㉊Hد$yMd3*bϋ_ ax H A BF U`F(ЀJL!p& " eTF{-$zEqkY01kaA .5Y0p _pH\2tF'{AozëeWWջb-њt ]Bn'`2Rgd/@N!-T(9헧SP+gl ˊw E;5YQyb*TJxB h+h^t,!9D"% uFCC3-orC1'0sU1=84M.bӧ?%ng9:=8%i]YG8C2DAa&(x1| eD@,UZ/0ƒkÅV(-C\(si@̩51tf2jjUct hF.ZzR!pFPV3h/*ΠA#~%3@28PrG %Le^xKKW;v-6 A.Gp-\X-HXg|etTQ8-Γx*twl`݅+I[s.S!p+p: Ex qLŢkfX3qw]wXF 2cZų6%jR]͚BZьCH- ى<5܀HYI;^%i,y]MGqcH3I5#"lV%1ARzRI Ǥ!Pr؄3l|Uu'hS2N":zԥΕ/gWo_{#d'o{܇u=w{w|?xG|x7|%ֿwŤys)g1yַ9_LG]{GUlzFSQ=IJ~zt"H[I;mkIz~&W?L?`bl_H4k4@4Q?-"b@۰[*ջ@ <AĐ?r {:4 ,AٺLӲ0Ӵ,J=4D!|07O)'\BTB*:?<B"@10-@RZ;ݳ74k\ #P(,3l4 | l'vjA <(bj'b Js /6g8 ʩ(lG &pDx'4Z [P(c82ʿ * h˨Kg , JI*JK0̺H0]K S`ʝUMMU0̭`fHH8Ȃ L)MMlQrj+ 6pO@p&A\-Ќ͠:bh+3 MG9M@T IщYpal\< TO͕xϺ 9ψF2d%@MAp’ZIυXPTeXPNN2GΤP ]>a) ϕd\:a!c*@Hhb`c`@0NqBњY4e`b9aЯ[`1uuicaX,=Y%x9}S4/:MeSlі!)Eb0d T0mU 2PQ>0{RhЅ8dl9pR(R*A%B?*6j-ir1PU1X\ٕ>Xo0UVeL\^9`j TX+=N3]RCSgk+hMR5iכ RԅWDuWxu')RLUM=}@gP206\jYʔ߁@U OX9) ]qAqh]h>Y=MԐuYйq mU#g`靤׆0i"`zڶOES[NDYӉׁɛ-ҽ ۝0Qqѝ?ڣڵeE[@QGPv F !o~_# #3J9P#V#4AraAq>h?⛠N)[ S0VLec^#pg_<f]f鑆auNvO~hd6B.dOij= ^Sub'/_H w&_Q6R([V(`P5$(]Wg(Ȩ>n'ߵF煈(.re` f <6Bj4lf0C0|M6)މF ®" m&orpj{ fl&F+h vd+&Pm:N=nĮeONi:uyz*~̖v)-Ț+*1e_0o*h.p>&)lnfjfOo g6 !^lq "*]0) r+fPo(o'/o;&d6fn O3cX\e#"$^p#0C0pUo>7?_cЅbHpb^.O_#$Mt*0btO_ SZ^psU?;j@lof\Wt^]9wsAOtV SgN{N /hV_:U17BRX>AE>m*/^-t?OxwGdw;vۤottwxp98`0@\R01kl9DhiC2"]4](8XKGg1^`!729 56+XueHESy* z,cDD[47"yЃmR1eRWSZvw,$ːcPv8qwV3?F?';q{eSvC1sg|%c2gp2zķhg σrxz$Gg+zח~֧ _o|d(m'T(H1iIZg͖ڕ5hV`S(bSY?_$k9wDgi;[k 6f d9~9l`1B+It6!Ďi挙g1y,%etxД.6wY'ODke6iQcϝ9,Y' ^qvŧQy&\Ц g4F=I39.mvfMǙ, C23=RHiiBUc⭼3*68c9qď\\S;>A$g>l :txn~ ;Ỳ;8$rǓ/o<׳o=*0c- %~ل3W $wĠ_0w3zt!O0sy?E{$hQ8 (<z1W{M> @,$9rDJ9%UZy%Yj{ r3Ip9&|8\x43y0'y'yg{rihtɥs'*(.3( 2gw*cP):*z*~zc:+z+++ ;,{,*,:,J;-Z{-j-z-ኻx[[뺤.UX[ZI/y Q񫥿 /{#pXM;p{˻q|S,^; ,2+wN-lsOʬ אַ(yD B^;, /=/Ss4u|F9rr}qxLVg=vc|v {}Omu 7]3v߅G^7[]xыO;9~8yŢ?ysWwT~7{Ql9=)t W2QLyMj;܄CZOm./~cSOϏ_{(Mw~g=x$_r=-|hf@]z`(=`'An la2/l8%-dB xcIi/yJ>*ܓHE1Њ`]B.*]LtbɅ1XC"x:nы#Sw$z#8t1s+#!G쀢D`"mKf0y"SE"Qg4 +XBBt  όa %#HN%9IC jN9DTBs"~ЋM(yOoB\* M_zΞ|΋ԥC^sPNT_=MMu6ՙh&y2r#8ѥc3SRT3Zk-~j1S4-}+VHz`Cy:mqI_`8;vC-mU;5Qb>!ڏjlzt]-c#Km}J=* WhUKQ`=*5EnQvc;wmo{Nѽ[ouKµl)T}-s[^)L} ٿϷ۽p軷3G/[]LqS57 V ɲ[FJl0AS<cܲr1זd#3Z9 )SV|-s^2,1f>3Ӭ5n~3,9_X_=y\KHvC =F8j hCO iQ ~äI=vFM%iFz< 8BlR'n5zJYk9BYynqt 9Qb+A5 "*Β,k${9:v|"P0U%צj6m?8c ;9I)A Xnx;d&6M}c'`Ëgt' o683=򸪑 VA݋E3Q!18#X3a0A$18O@OdT(* `-'SV$kI3=Mt "NMY{yzAn78;3pp2$ QwB  rdX!T@$Q &pta_̜'OIY!u p2]%8|C ={P1m?;mrӄ 6ߴ_~?380ЂM-(Ԟ=_.8,tB0T2l^'BMEC]^B2,*lQ_ȵ_:Dn`ʟCh,B D9i9 J D}_ڄ0(DA3MHfM3HaM22$-~\A$D04M34,Ah28+IhC$3ԥ/I!,B'I'"*A@¥8024B$0C2 'zMx3AO#1:,N,"@¥(CD$V%+2+! "38C$tB/8)"3:4"4zodA(3bJ4C+Ih\ 42xa)6v!"M(EFc=v~]31DL0D2@0F#5R%2&*"20#B"b.b/1W$ h.ACC1A8%O34†$feN3BD"2ahH!`eJB&6I C/8!9C! MA,nUA<3,u8D\eO3O8&dќ3&Ba8Zc[eWe": ,^@NhNpgg8>*3%^/8'H<)HA_:&:_)AAtg&ouuFW!)8I:dde@`NfZ'hn@YY@ZgafbcD.4~+D^3#B3U*Ȃ6A<(O3\@dVnhp6 Dt/`Y(*8H()e{0-_eiOb 42-"_"yt@~N)|CH%Ċ:C:g~hV2Ckmc>:Cbp2 C0q(hb8nMRNniř@rN8CNyD.3(hA$@(ҧ3艒ENLM$qN-L"/T)$#`*P:$Ǒr 6% 3^GVȂg3li"zM(@$CZ2+O樷1M/vjiTH%O'8#MkΫ=63oln2*,E)[dkT$«C*xllT+h\Cy$~@J*"*븖C,z:C=*CR:A0&-O+JF.lDF@XDyC,_2gl4&ڪ-*D0(@3r؆sCDAC .}EJ Ǝln.Cfq3<<'X,`A.,D6.@Dj-e6}^n-قjڭ3୻5b2@Z C$:,FOjDfV-1J'ڬ#8CLC83,]'cO,p,^g9q".؄NE;_Ԓ*'D/:DFã kY043('8.nVk-8d&İJ'AqZ1 /8~'/xc1/vmV;C#D( B3 )ȩ- 801#;CB3ԣMq^ĊA$({AI\*n#Uk3!\82/S&3$Q3 ,-V4gs1?"$d@*3+i20&w'c%S6+C7A!q.4r2H?jBԫ.r(Ɓ)2˳7C,s7Oإs1xr2dBg5-6s<3E83^B/2+33S44].^/"x%w-PCXMcRˊ=EnuXjvlF`5 02i D9+B3[#ZCB9@WMh@3BO^ZD35BCV3ZWnDDq*7)…\a{"4hsh8DIDJk]uTcCY6g*]{5X[@cKD$uO5[v%WaoAxU;kv@ȵCu4h`B5#3vkC t/x ܀< ڋIO7#9  IO䷘ʷ5HTex jG{ɂypmo7OHG}L拤xxʠl ޘ|HG߉I4 /ʓ˸'T9@`OӼJ99ǹ9׹9繞W9:E )YOv 队?h6͎T!9K:RS)z,HztOL yxz}cUT:6 ΪzPʯχ n;r1ϭ:QNZՆUתO;T_zY\UO :v吱/Cɓ[Њ-uϾ1qAE EuzxP|MẆ;ǻw!|DW';Xk%;dqSɳPě|pVtWWcB|s XH]VMdbU 3{bUȳ;_cayYV`Sք#ɐK#+=PoD}5XiQ,=J!Vܖw.RSH }៖Ϗ}+;YԯU{{SU_V\89ɔ,C19A~QEWOװs{~>N9}8i}2=iY{QrD}SV+T*]ɼ֛>_U |k{g;;=WN>@@@A4Hp†FD"Ä+N8P#Ň;r’"/LiaHYD e̗0W^H3͍& s&NC+IqROF:jUWfպkW_;lYgxQuZ5i-_m2U;7fߵDWH‰Y%x* 7Իc:{˚?6n[9cuƖ=vm۷qֽ7T˧W#5}9Q/NbrF.4̞ЩG}Пի^u׿$#O-|A[A䎣BDp* M§${(DʹBPiq< OC8v"S1!\'R)F&kÒ= S1,3L7'\S6S9;S=? TA -CMTEmG!TI)K1TM "A}1b RA/|ٕD9fZde+~iY<s9(d)F gVi"ezEb$;qwػ←H) Hp ^>"n#qdĥhе{e/ھ*`dJ7?@HP݌ fSD(+8z3REt7@4 gb Ԁ@ ] #FNmT@|+Xo! #@hF+Ć:PhD$ QP8AtCDȐ6;N0y#,3N(08p, .+FH< "a4"fDHBR" EhP1,#[,iI58)30i!"B gBW0xH* nzp ) X@ L% 2 g79jR4[2G9r3`f:+**< T5c )<9~n(6̈"hJ%tMqSpB\'pƧSR٥JB`vT[]4!T8C RG6Tn +פ01 P `+Yg90aRF"`8C2pf̬+ 2eSU=:C-O`U3yA?Ҳկhլ@:ٕ֤M@a9:mq{2Bx/df mH䓩@ bWu,I?k:9."R ^@d83 C+8_7ժvAV cgYR׺= Lxn? S#\`t5M%Ulx*0@0l@T D(1r"HWq 8y @_IB#ݨBpC!xNLVVLX x"KArOxǡmr|As0ft(]Igx@4iOW@R aD(s,G8#!͙-Y Z 6f|"2=8TIN@f0cögqlcLiyk#Xup\+Ѭv5T:lo;0E'*i/\k322Uy1aYk bp013.!-:@ЀtWū i 7WFw.=WL͇!9|R]8yr˜"IN~[S~xȩ8Anw2213W%5W3DU 0'63"v+c ]X%J4V3,wUah%i9,Xm!ax|=Vog+zة|qŞҟU+h3 ~Ve ~(^mpmȯt*``d``(%0"* ^H,(+$`e=e d]a00Py}(0 )z 0 p 0 p 0 p H.ؤ p e P,+b?MBҐ pѰ)cC@0,zHpKceG+!1d3(XC>lKgC%1Eq@L%Q%n&>dE]1xd: \#@9FBGp2LbBF#=4QE"A ;DE<3^$#Q}1D8ŃqDCݱKQI3_Qq ]=fK1Ax=N1%P!{DKCA*2.J'"R!1q"E2G# $C!a'$;( G;B^29r(qmr$]&ebQr)}CZ$A2 eQ+ *'rRI2HB'ߢ#R(W(U(I2+B)-a)w]r*kr/Q!)1R.<Β'ߣ.fr1.!s "d('2@\$=3rD3+I4"R'4%-0A32e 9 /./$w6r>#9,d% 22Q9'277gs:OL%U:]E؃Q:i;,7s)&5:;s>P eB2$13 1?;-@ @tA;A!]1B)B-B14C5tC9C=CA4DEtDIDMt O DYE H @mH7EutGwhW&+>HxxtI-d:"6M Hlղ"iBKBI&4L*~ +!""z L!VawqNNxXu`gL5Q#B^4HA"gRmomDT*n@ vQ{'r&BsA7tEwtItMtQ7uUwuYu]ua7vewvivmvq6xrwZg,x72M61ywA)5`g4K3w{z/{,byB 4xTh(|!{7Shԋ6!w"귐7!DS;'J %c~x'B|} I!ub!!VOLrE +˪*Y/+ b4z!!Mbqx ,"#7"̺zӧ! 2 %ψIȊ0xv: u58M"Xh-!Θ!ȭ)Aa[S # T΁vAT.ZVw)x8︑PL"t ӥ"`pΉ$=yёI@Q{s 첔aY!`:( brps}9y9y\Q"c9c,~:y" ^ݏ  ʅfk-!t6/;5wǦH_zx锎0[a{Q fx!Vno @'fO O c;E-:&"b*0"@ HXc=tw#@88/}+ZgC`a$j3Bd,B-Jhp D@rvU$2 g\wV!\aT+} \^LC-H4ў(N;cE!0>90 QJqvC[Hdpc(@ #9s^Xr܃.M)=CHslE3Fl 1.Sf`"dXH@a+ xXmM mq"k݀Ȁ}]+JoŠG ͩt{ W"O A 3)<^ ~P 0QB$ಷOKg3*%N~Q{q78Qƃ\@cHIq(ޖN|/O;'N[ϸ7{ GN(OyK{J< Y$0/Als$+vodN괻7l`DMΐ\PzY%+T#APbLI!Ifԛd? cDAӄ`@:?('^;KڎpMOLNMz/)_s D y,{!byGBHgRL&7Hq~%ːE>! |_ * /I?{D)Q߻QC ueC((R! `0)0 " 2(1 Pp"}b""Z$O"(؁R'7gT s#,#BKq;V f 2B#6##2 W fj0 sB;ƒQN#3R#7 Gyц1a'z1WF' )s",  c-7v ^ c s=S-@S/Bʂ,(g2(2,xӊ3xo|  ` Ts3h : BF5q;>61|+= C6; n3&58|18):5SXvuce (N]`$!,s Q6gC^5 (x)9C58B YIQD cYb!:# =*i*p !y6IL24f>J$:EIu3``+ Ks1ZYp32`İvNFi{u2:@ dZdN I_ΐF?GQt1+dD`Ģ}1Az{ZF5UQY))j4*z-/zEZv3Pl9:EY?JN゜ :H:7.¤ΐRQږysLѫėvfWdZe҄UTڡixj*#Pڮ 顜YF5`d$zEQX 5d 墯 o3~<\W6h5mmT;:wZdHMi, J)j?]!Tu'), ,p YDę5$ZLTNܟjZi k/WEB&4n44Dù&@ >bŖ}zӇcRc> Ğ vZqJHd>MѢ%D<0it;'pKArҧ4l긞Zmc$-&gU~ۨϔUR{CNa ΰ  /;NL\2Fa,?J*QJˠ F"5qPLA!0O^a$DRi`YlX0I% i^%IS?"/fF6H4%,pǖ8UE+( qMS1Z*鍊*i]5TS7YE%YPISk_6d x%˻[A+Fa&^E-P|D9T[a1) 45_P_>Σo%;&b۞&=o4!@@h ‚ :d0+R1Ƈ=~RH%MDRJ-]SL5mę&!g]qe 8ä SJΜ:Hɬ1ɪAAX%tI!ΐq茓 ʖU08&b0 43B4 %V-k ]jY\9P[r#Z f`H\Tu##^0oݻCZ[x]tխ_Ǟ]v;:W{y1@,J0Jx 0*,o><@(8*#$fe6\q-k2D&(X8bݍ]xe.]|͝\&ЀE5Y]sa]L kcrw 9dqsbΰc-7f]em7gn~yd&:M]nfPUhoipfK.:l7yeuZ]i݆;kb<>;ߴx5ԙ񼧆Xnen>[?=t'w\ey=p~}wUⓗp3Tt>tcxO>b)<`.gaU7l?mp*Yʓh%|7ID%""*ٌeS!x=(O@60@sT!g? d:/IT dr&w P4Rl*0tQ%=cSv&JθA|W0B :Г 3ajJ.@!!JTQP%9SRѣvĬ!2RW(y+KAke[Z0C:"#%K8b(+@Xd!8$ݰHchN0t[WpI;^v91r1]#4A>+IҀf&@'xQaB/BӋ11e.{Y!E>r*)(2A>ozase(縼0Zttam;B P}~zªO Ȣ!Q h`p* >w$6j*䧪>3"]; c*CH-_4!Ajmlk5 bw7H ërM+ Fh_{vG Ww-p `1o;DȠu3l] md':,p;XmyMlkP3R S=؀aq1 G{˗몇>ЉN:8hlXs;Ց.v;7q{'=OkLWK*R` )05X!r'ٵA ;x7J&>u"P>*ĻA0YxHH 'X>eoRxU'glX8o{gi]!#gc>+@ Z g??z@Đ p5}IZb&d=g-ДpL̼0L8/0\J! U l͒@R%& Kp]MϓA=6rC҇`R%t+mh͈NO\Ob`B5B=Q5J\D@UO6dO?9e)XeBZp]P\Ԫlg=Gp80 18KJPMTOeCcЅbP EϽE]8 O]D LD_5>BUUVu_O/,gOf]Vu#4B-u,o}Vp8DUҚdWhc5duw< OpRuMo֐0[f8FͰp$H WWwG4/(:UVD;?5MXC]ُgVz]D}H C#WPI<DhJ`Kb 8؅TՇ8ڤ}JUڭ**x'H$@C4ُpeHEpSȭ[J[ZZfZ5[UOe[Ѓ۔[LKe(ƒ0%X ݫw58xDɥܯL]e\p[e[WD BXPݪe] >gZB&(E\]u%^YӱUƭb[ͫ4m]e_.YmZdT_IH=)˲ TΊ^g g/p ^>BwZfH0K IQ Eh PmX /`òST (a( 8/J`& #a`Jr]V\ՈMb& dhb0 ` >Zb "#6Ap- 5 > F`9. Xdd2igਃa' (Nan"1~2fegb `ctZ0'F0 xfRe)bgf菎-8@)=xtv଎P%@g瑈y 1 H & vm>-PB}ef A$VH+8Ȑ9ainni ~֠p`@l3($YVޓ [ꩦꪶ뱶 &V&볶]ў &]뛩kˡk>l)HQ췮f)Fnk ˾ A l lvl(Ȇ밟8m֎8lXi6l gmu! 1Iv9>pqoߦMnnnٗ1 ~qpX amXĎӮk>p/wpoę9&pž Oֱp$'amxY8&r㙚WF'rq3/?0lqr5g*7Y-9p։Bp.snΝtEnHrGtI?ioOFG1YKnD-/Ǘ:_ zu6ws ZAWLWp~Sd t&+wytj'UWg_>got(Ӂmu\]9szv#q YnE?4Ol6m؎uvqwoMvvֱk?nvAsaxdnqxr|7ymPsYwʾxfIhv{oWi(m oxݑrGY?v~ӦytzjwfGms/iQgzT{gWv֙[/$/FNǛ"cϖowc/xrOuOgww! y9Yus}ug}ۧx?{W|ϞyΉv~o't+xO}zww-w'qɉ8gy7s|q}wtwoq| _,@„d0C #dQC!j̈FHH2$ɑUeˋ#M~M)-<93ɒB-j(ҤJ2m)ԨRRmip%RVp+W54lSdž-;'٠]j]y+ߴ>^ %P` T1Ȓ'SlcĘ7Oi]͜G.mtgp-F5زgӶZ[6}o7‡/nܴw+o9ҧSn:ڷs;Ǔ/o<׳o=ӯo>?R xqK837 EHHe63mHġ@H8hTG Q>ĀM͈ Aׄ3<IrLRAp$+ "%ai,$iP_*%U 3H%G)ђMlt3ktH3 "sAv02X:3L~JdJnvTZ)*̔ie!8ӉDT'PQFglT2@ (4C@b8L!0ӌ (ՎB3dzK^E]Q dnAݰQU+ՋT DXSkн{ SAUpT Ou0R^(0IP3~38T3rK373m0\dY3wDJ|˂+2jD24S 0@<ҧ/nAe,/QU31.y zq 0lI5ATl/==vIR᭷3|tAZs5 3 C A"(V w.G>@12;wK¤A0ZL77aJ2ˬnk~K4A @QKN@4,Lf ALD:YLA-5Vcm. " eI }@@@;0!/F `җ8qA ] #H ^fȢx2U80%g (/ `8ƨ: 5Q@Z_bAOFDH/8aEgpы`Ee9aXE(J! MB.;3"! %> WHO@ĖN7Xp$r'x%~/qB />`_"/[A_џ@43 8ٱXݙ -8S_wEZ}[9A9C^/8n' Ah" ܟ!_[}_9 (B3 )^3CA聋e.4'DaU$AӠAzA^^@]B(@ KMh90A!&b~1C(H©80ŘU *4CH'bA$v $d \ 2 #""@a*bA 2d(`E$"9 +!T%fģY D @ԤCCEߩA!Ff$S*Fjw0V*fqa\jh4Sxhh*FũF*sj[jFh*~vT*`FISjr_Ffjl fVjg0FNv(kdXk+HEe+djYt`rEcDF+vn^|jad`+kګvƾnhkn `$lVW,FD꿺+nlgF*+ɂ,Gij΄HX,\lP`DnLO+N2GDO̢"&„W`̾DHE`+^VǦr2lvD"-՞-PTҎزDڒmۮmlʲm_K+-mJ҄Jm.bn*ZтBmz^Znƪa|.j&E隅Ɗm璮rzj.Ģ.VnOnN.j->]4zզn&z..F^ʲ.l6mXnoOϾ/ofo8oh+Ok...Rj.V/noNN^p/~l֭2. [-pRpDj- Bbr/Zlr/օgp nҲ7pR*p/o0Æ'گ1Nd / [0ڱSonl "!nopư۾1#3$1&g$Com1,/"ñ*nⲲ,3-n+1**C^4 mWr&'3g'22F*WrΆm4w6q޶),r7.g6s.7g3IJss*#23anrsrȄ64,</4+4"[x3Z B_c3?tjޯ+2fk/DtL4Mw Ei|K״O}t4PQ5R'R/5S7S?5TGTO5UWUwˀPEV_5W0QdeHHTȊXFDHW5(3AuݵQ,ě E:ø` FcDPd˵ei*$5Ad6lvQA`'I[m6dJtbFM^A٥݌@,1A!05]١%?y觿o]Sk7@8`g&TaC!F8bE1fԸcGA9dI'QTy3/rRẻ-@0E3a =9+26|,A($ g6^r`gj +X %O 9;A9av*jàC="fuҦF(2T%sh /g~:wo߿>xqǑ'6e2gJ B1΀CH p쒜\ԁY14hOU!g Ʉgx ?$ =IFWi@gcbȋXg,/? o:#+c= ּO}#]%#1C#\J(ęe2%B S1,3LSM1+A1C6ߌ"C"t;: x<5Ih)*ѿ(D9K#Bfpƒ_Hgl!hfN jQg MO@Sg gC?T4+1QhSRL7hlep#cBswWy{W: xH,aœ A- >x `x BJXUxb)%/8;ߑI.QNYYn7V @iaqYy矁[E挠NZ饙n駁>꫱Z뭹[.N[n[[o@\ pCb<\$/1p $sFG))/Uu==i]gQ'o:rsW[x䊷]|ߟa?t#J>!c]gPΧ'o!~r;={7ڏ@/z`gOw+B( JpABᏁ"BЄ\ -@0 8CƐ.}PE4+; zN"ܟ.Q{T\)&ܣxBO&Tb %.xj7ucpF/ZOceG[#%qDd֘H9YlA˕%9rdP8J҅d%qM\GYіh(Lr:w+_4hnG i)Ul !@2N_|H-ů~K+͘E{ cXCB f4=1H 2<\_$$2a a/!XM! ":q gtL FDneu#$LC` )D΀XBV,!aBR.dB'8c,g=2c"+aTA2'z!PFBV 8W!O"gMozn}Q DyС\ C 9.R ^L!d@mi]:mVH^+fB!|\X!.V MQ@387$ @-xnqwq3` IN@ gHj6(D,1 A#̥.6&ChXj?Pd [J"| 4,N-? A3EBz*t !5/6$@&S.>t E8գu\@V՟E*S]ҞlH þ:ywϝuw}x7x/% ߈O(C11V)Lzwz}^u >MK2B@WGFߴ@/Z%A/X3\ 0ˋ=UG~1e.oGpF$|S^K|@| +} Uug1[ ΍oA @ LAB/! 0qpˀA!dBo|eFm0Dl"`#̶Gt}o-Z줴.#3LP!,o0vAخ* pFG-Ud$=֣=#UNNErGB pNWer(Y"ne@=AipN, bT!A `, BA0!]eqimq1uqy}1yCJQQt@jq|@U)Q|aff! 1 p+K!"n/! L &˜q qڑqN,  bFa¾,`ǎ V @ Ar r"˶ D ; R `%ﬡB' IrФ NXp(mq$`32|*j$(@s^Mrd-!lC!hr- (h* >ڲsҒ-1G&Zo -Ƣ,"..b33+j0G<= "IL?bCX436JAFP阮sȠ~APRTH6ӝx&c _f!n3;-;K3<K-ų<<3=s=ٳ==3>$_.`?<2b""C֣"A{fJ@5`'( ,a;܀">h BIg$t#T'4 "_!*^S(Dq4eNT#>HoLP= o2`LBa@Pr4KI&G!f" a("HT'aCzL~,ȆȴOGF1!<~M.ܨCt`rbr&&g*btSPۊ!@>$` Q)O!#SoSm5^<B\ "\P& ,g,bVBSoYդ3` ABa.+G Ƃt MwRV1YkZ5rhZQPTiAL@ u!n]6LJ @1pp+ zHA!$] 6H\$D6dg63BFP!X B8BR@VZ.PDvg]uzd7`.gviii6jvjjj6kvkkk6lvlɶll6mvmٶmm6nvnnn6ovooo7pwp p p7qwqq_Bpfr7ZZs 7 Xg9n,! -t+tPoe%(u~lo@wVoBraxl Q.awoTo@!,W!,PYH*\ȰÇ#J(@ċ3jȱǏ CIɓ(S\ɲ˗'+"Bf# &x?m Be&`Ν0;6}8 F.2i3ׯ`ÊKٳh X6`,VX1fRpvicbΜ1+Fo3 YR &סds2 UޖֽbI˺װc˞mv--ŠɅT郡5q. /̛ju]Bg;rǜuMӫ*>d/A 1 PPs͗UP21(JJ]|`|e^B^d!p9dG4Sދ0(4{4,ToM @T<|Ì3sL.Uye[R$2pVP'0U2 /e2} XEM2l0ЛqY| %&D24S V)4/F]V"$i2D 2Ȝ/yq:0 ->9gj8)An@}@j%h&P?9S tDAH8I覫{эr˜!JRr8L+h$ D3)tE  0%2j:@KH +&@)'l Y͜3X, 2θ`+bB6Ϫ)V2 -tO358S@G8n ԊȂJ34073s; 5bd@ Љ{2+m|Ό褗n-L/"@Ѕ@s\3:TI]3033u uWU/#1d3j+P@H!* }o/ 'B+Dd ΀a{&crB gb_{M3nvF|*!BЀ6g@vg?A*w`Cbh;dz-*ZXbH axQ0wY0} 2cFM v0\"["Rg`"|H̅! \ +RCli#B4!)3pT8C RLI)@v2AhMPAPJPF GDfZ0E)yJ8Ana DV23QrLCZ@B8DXFxHJL؄NPR8TXVxXBBY؅^`SW{ HpSs dna!at~x!;xg5 q 0Xwx\ e8zyx#mRt'a~nQ w2pRX HlSታ qHhNe%#2(A|($h| Vw!'|x Ńq·¨h)y -B'=(0$ Ǡ)Zr k *U$B: Fw'-B!KP,R\j!-JR"*`# l$6-'Ē)RHy7(b9œ c8˨p)g kyǒ9&2ᘟQ>C<QD` 8@3ԕ)`ُU1jZh ΰ )!^@J4Z*AUu\ˠ 7]e*3inz^&4_ {77]κ&R5\ ︭l2ꢑqZHȮ>ưUU \{ڣiVkob nCr@ɀ@S'a!J$7Tvf8RdG=8cacJVJq#ro#*ASdB!N 0jB3*14*9, jʳ 6gua k7o'pՁ@x@3ik6i xPU5q bD!lnA;eflyQ&nTtgz A+?8uoҖo8xĕ/Kܪz @<@{WZu!dR!xqprնr-zd.n$]z'zgUa dwHbxҝw]&v3fx8EarHs)+i':•gxBr̀ 0 ٚmX|k=_ ;:d}U! `G}ݧ|׏B|`HNm<;u+׈ع6۳5ace\ɖ8S0!X|ɢ<9@V] ʔLʰ˲Lc|˸˺˼˾<\|Ȝ̤ˡL5̌؜X; -͘;\1q )!L<\Ț،"a(j|b|Ǭ-[V̿=\\x  Z )}G97)T 2!ӹ<  ~^~W[(h"!.#4@`(0y..n'0gA,aEB )^1@BDKNFV >S@8&PRB-1xay8CA"^pr3 5nuM OCg VpaQa a!wX\D$~. l{[]f0'` b>.V P9 (N+(n0쿞/ ;ΰc!a~fQ 6@a~N>_6W9F ƾP8Q Q3 TȗҞOi<q $nNQA (*HA {`. ?,NA qӶxu@'h") &&wYm_,++2,BТPL`2qdOR2@(1*R *io'Ȁ'X9_8 "Id(2)2 %X%\ZrWY i I."')*zo? y;?'pU |k_C,Fi+b(RPo~-_[^_-Π Q@)-˙`!{嬙d8L5,sj3f4J1:iAQ g4(ꥂ 9{Fl]!cWDVYgWq<7JadKY .'v]wOJ]gbLgkEؽ\.p➊߆Yg}OBd<1@, sBHjg)299#9~qd d4 )WC1pqbBNPQȐ6LJ@Bgn8lLj#cH0A"qp [ _$Aq!4baCtܳ}A" RҝNE;*0OpF2t "OdŹ 젔֥"\Ml "8A`HldA7>ɟJ4b΂`)GE e.uK^H $/=8aRF])oT3C PdbSWH$2fBNX3F>"T@ 2Դ&6$d  ~ S@M2 (NӚ׌ּVoh@{ubW{I3v1} h!HWPTQ$mT2HMd` uF)NEՒkD??JQ䯗ok\:c.Z8cxEr66yq)8 9Ѿ54.1s^t J+< ̞ Xb FVq@f  6op`Lֱ=z1+%@h q@[♕nm{ځ+N3S(1Fhیy"J,'dT,eqmkD$ L%!ee4Zj5 um;bPx*m+]Xѽ&[bŹ,g0 ېb }EӯZ@D+#%rŭ8aJQ븓'1'7YQ ` :@24 0YF"1S $sd(8r4 dr!Ў^4L0sL&I:Eًi##yӭ@D/:$Fk3mA#yv R,  3jZКAN g,r3?t09 ADDTEdFtGHIJKLMNOPQ$R4SDTTUdVtW$CMWEEXEG]ܟ_`FYbcdTFFaFJƷƌƓFdtF ^4+GbGiudkv x\lw4FxlcGǕGu Ȗ~|nFT$uyztGH<njd}hdG$GDHq}E,I%<I\2IfIrHFȟHeHplwlƙɆDJšǦGv|GʪJ`|ʘ\hʁJJfʦJJJ|JdJl˘ɝ|{K,J˽ ʹK}\GjEKzTIdJGŒJ,L,GdL{M,K̿LL%W?uٚM8Sڢ,-T}JI=Mm֊YZg}ؑ]'7QY~-YPWMءeٴSwe[iYv Ѓ5[[^ پv֏cEZ}WmX&ZOPmUy5\ڹP[ZVɅ+%1U=הUҕȼYJM͵Sە]RMZUM\e؎WiLˌ^\=[]ʥm̽͵ڵ]}^ߐL֩TTI܏T\zͤEX]J<_PUYT_!ME`< FXO=N`Q֘ F@e` T E6FVfv^!^8 "6b4\ 9@15q[1p6h ,b;2?YIibgxbjci# c :y#<;cV9hkWȧP FFfHdidb f`ibOӌKn[:XC dC[,8YZv*ZH>3Q1QdHfQNhfe6ONiAh+nd@.TXQ d(Et^vIzR8`g,f@*.<DDȵ) TfNhfy)ih ;.> zP2ApjP&2pG^ &B"p>/?g5; *@Hhb`c`@H(K[wgPhP20#eЅc@c8508k``Mf#nk8rlQ ^9i ar¡0k_@뺾Fj_~+YN@^(R>8@bgOkSUk֕ˎ &mn*6mE@b0dx쓘l¶ll;&*8n^ >HfXKo_`lp+ Y y p% IksqJ pݐhqV>yfehH`d/Br-w_%@p0ɉ ڰ &x6)YPqNi I )wqp1Is٨ra h4r$Wr0 ?r8I  q0ظD(6Ԁҹ?% uwi w*o9(^lfYfWpEN8A_7f<0vpqd9TluW"0%^SonK$G{>vc`wD9J"Wvw0ZOeogϨ'\h9WX>f r[h]{ygfeW̑6218Ka&bw{e6DOh_ zJ!yh`9{)/{9 |Ço"z({X|9z͡&V?$ț[ ^?* S@r6׏"}&7 Zj+D6fbwz!; ^/ ed`Z{~J9"ⷢzTo r!?#x'7u&(Iۤ 4܊xjYAeJ1\:$VM ;8c䰐 [1sX %LYk2p$e26AtY,ǙLV éU2lSLǒ-k,ڴjײm-ܸrҭk.޼zm Ybʒj搦9wPlC0 ־BЙƄJʹ3 ]tO5=mUd]0 *dʢI3<?x8șl/Y1zp<'D8]wL&4-dWxvnx0LZVczau+9; !L1yv2>>IO [P0͑t0]7(bt/!$6W00ٛ4D"/YB81]3@aB(hAhK oxP a$p a??9cyY3$A8ci (c 0ca\/9"у &zńJd`/xŗzsbAc#XZCP" $,b LE30`Ē)n<SP]򲗾%0H0SBb6e/S'H xÔ<HX  z5cEj+Rt1pKɔ ф&ZNEpnYQ$5Mzjf7 C)ґ&@RtI)]iK)&IH:c)Yf:1 =)X H\h q Q)U}M*T*թRDk$UU1[gHVêֵn}+\zե=h]׽~+`+=,b2},d#+R,f3r, zV=-jSZUkZʅkXp"Im/1ᖅ0qӒ2kakfC{$j/ݍ t{]Fr)&6!uo{ $ν/~g_%,/Y7/nKu[.x}{;N{{r=W!_w%] bknaOEV.7>|)L[?~2k 7p+_2#18^./;JXimu 3G_6s'xtoe5W824vd [r#-i&ς.t\fd-ˠ/,%u[S'ZU&rU=$9չ歟LawΎn=e3;5lZܮE޲ W#ڛNl܍fpGmnq/.[be{mxfin3D^q=?}k0y߫x|v'8K>n[n}77^uu8'.pGxM.ϱ`t(VS~LG]f{gVGopw]\5p)t O};:>\ngWR?xk^m{`۟wDܙylq>ћWkWwɍ^vg%nsp[=1;;w?ev I1^y%  1 *``qYµ`} ZiU^PqW j!XXq]ae![ j5Aĸ!̩9e!! !!:cZ"$F$U"FVN"&f&n"'v'~"(("))"**"++|^+֢-"RZ%LB/2:C3ޢ4N#0BI(3܁CXdcZA -< S Id d],{dL9c:J<-CE>#5#@O*`4C 8AE82`'Ns$:. 8'P@^Q#d@I0De|$$ZC3d8C4FEE*DYSY\u^xC] PR$=6AX6FNERUVn\AD'C3xW6X%YE8)8L*1$2-)8 RAKX1 2%B34, dReb()P1AL I4C/Y`,D1HBfVe&a"a"3.e]%^YP2@0Ac{/&t/0N$Dn.R]e}ogt*t6"xP12W'}+1,ާ'3Y\3 "tOu2NV/H#-3* o22$-gtB/%*,2<>L5C+eP3(C#D3$CV%8h@WL:Cp@.h>h3D脞M Q4,$ghbzRV30h'8(\A$D0(ˊ2錢idi>wu4*8R}.*ҁ3P2cB8*JY3G8,9:C!EA@BE8C+ZClDDJAjAԪ3pB<3,tMEMN4#Ҫ.*N~j%Mcև3\Dz3*AGUʦ*+N jļR)+Wn 8,&,Z`*!p>Q J[j3HMDł|E[C2$\hA,ɚlz T$L"2 DɪRA *X0I3H3PlYЄ؄tbBT S&Cl9+PGAT fv-ZD+-@-(2/d--ݞE88D$0L,y&J$E@&K0*I<OP2H,l+p*Q Kl.nh$m OnLy,:~LD8.KQ>D4DFlڲ-ޢ 12d),8/,LBgqxH0[,oȆ@zGhŶ,/*ϦV%иnLctHrЮK13`D]tB(424@UZӑX4SSY`][1Z4VR$BP5QPQ!UQ/5SXY5TOu]Q5VgVo5WwW5XX5YY5Z"#>bZ5(Z7!uV[j}_מ!]UL55c?_{`%bGaXco(>c?6:aQ.a Vql n V v`d vq 1`v `e϶tUm;w:`vY b7nGwSewsxO7|?%qA9Yq5y_~OY6d;^ݟǷ'gs-[`9^v>Z~kwS>8S7mٶշE!" ;Í8[;x)`/y`Uv͸vyi8ixw^ 9q9 >y^ͷX%չe3_/x\ydo9ڝw矽E`z z9'z8{!ޔ_sIxwxs=!a)z:w`Zsw7b͵[!#ڵu O{X8_;g;wm1;;;;/ \ 06jsLA:ì+'+ʽo%CH(HRdžʪC,2㟾VF~\\3YD)2UD}㊾Cd3?~Y0|xk1C@'ȃT+YGˡUHxаq CϿ*!Y]b@lq,"bN٫<9PdР)@ŋ7*LL̜@3`l9RԹgO?:hQG&UiSOF:jUWfպkWZE ̐ eS^"g=VlGcrĒ,"23:D"L@m}5:re˗1gּsgϟARAa`)AFֽwo߿>xqǑ'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl-() 1 ba I,2çBDazRQD.`%yR!,HxХg|1PJHrIhd9 _"MZŖ'5l4XWVt)sUS5QFdETqp&҄K1T q3G)WԎpFTjepFR-T]y5+TC )QWXauXV EcA3W_oșdAV'q*bng@B~L{wWU #Xܕ`Y%OpH^})  D9zę8DcVuY#ct)&zwiAD%!8v9/!Psa"0HͅJ꫱O1BvD'g~k+"f$Ҭna;H!vuWAq&!\rSp&:&\sA]I/QO]Yoa]idiy0("UofU a(“zDƗoI懲Ҩ/mQ{0%eV`%!zY'9ffaR*Z^EB*Yj}J< lO!@ .F!< !=P 3Q*Mo t @_ BC8!jI! tA!}BE UC)NQ@2I$p2)Q 2$B! I"pũQuWS$ 2 cbJGȠ$ 0!o?HD! ()|RHh둒t+דY(#tI@!BB2Vu A!ep'hΠ#aMiGC G@3 *HjrrtxB kH.](ErP`b'=F!cߙPF{8'4m…nZSGAR|T%5)|4zR-uKaSΔ5MqSb *( ON&j f(IB%R*$ \(f I',A7 DjV®u_uJrWP^!G b:Q\Xڵ)@nA)OJZBTg*DGDq x.c uңPfd{BU<*WrI"B.M@ajLi͞Rjʵׯ`Êr3fRpU JxXCB [:!%ʝ՘bE٪˘3k̹wP # Y.m0Nؚ1ϪKZN{d+_μiD@ `oi pn Zan/~{qԍ'Tz7} }UT[ ݂ 6@3@R0(a} Ԅ),)_ rL3c̎$%؋z!SF0A4,Ș x[3Ũa #L: %\F1d218v ^G&IZ1P^>1(-yI :qxAz)v9_jꩨJά3 䊓NB3x3. $2 -DH'I'zI$48(4AlB#,t@a03rַ>4J049l&[.`+P+93OBS6㋸ʻ 2oDS^:J r0餪<) $!26 H!*Ό,1δUߕ&)t3$3ĆLv,-P*t!.s@8c@r`(+/ ')Z ]4v\]ɗl@m3 @_:ׄVpZj.|'+P2 2 &6 /W13>tIL3{`?u3,DAj{ Sh"0ʜ& 3o*!)H4V鞲aDO sF Retd(~ x@g$Sl2d^@epڝü"H ]"['2Rgd‡>)h>Z)Y,c88#M )/E3] dGUJƧ r\ ?$t#YF1Utx3He!.ƻNh@Deu`$򕰌g,]8d"G(cE>K~Q#Q(`F& h-u ,CR36rF`"\ qCS9lnSsU2 9Fr"*I5ri8)y*!lP a:C) HEb ? ȅ.9K…hLtQ"pF L@t 4ڄsFdRg0N Y3X1G '%d^x7xO9LRрal h !4~ycjBl JRCD UU3.!4ļXm$C2klg[[Pʈk0fBpF[`4+YvߕI%r}f''GcQ{wb* Gt3 %-iٕ?p|a;:`ϻn۝<{_ҞFnr; Wg'Oy+>c#e%d=pc?_ֻbW%~h`tԢc c .Q& 0&D@ g8œ;벐q 8e^ %ˤ!@a1 9/<Д\1,yj9Π F+,`d P"+uZW1r/jaѪ,A5&Wa.ΐ0c, J$꓃ ʫ!/Z0QrR-/0K 0>24jZ:2.ګ"@* & ZZ  ,1,1BN *+EC+B.آ--J*[" #[1Ѳ_ G;kqB:+3pJ iN),PK0]KkZ,+jR 5R T-8'4k)R:s4JzO  fZpS9@7#P Auk9ũjѹAF8 ,>>:~s3ꯇ6i7Ki ѷ:+iA#Ӊ@#Bs;J:cq6"[k4ۻylw0k+N,˺ἲK֫5tٯ;իpe$&lFP'­Isk E =^B@WMeZU+d@@kA=U n4[=[I12\E<ABD S , 4L`CLZBBD@BBIpe7*b\?ɽ&ljBsc^ѳֳb듑>\rɡ p ` 2_[,|}<ƼZǜ{ŭK8éV V<*G|F\G+) `.AqHH }sD]4ϜKЃ\$%QEZ9qǦ\Vi$<8lI&  -9HљKDO Qûf ?W@7q/v]D -, ս,<,\9#k5ML[JӇ<ӳR1ReNzwSĴH Sմt$A$-dP4h0?1k=Zy Ǚ}WU͟GASti P q {OŹ7%4csT+.yY,Qd :X5]ż{ē4Pn rk V Al=v>W~ QRRVS Cui"at>iT ^ -}~~f=`J!? K ZZ3-4ǀ-Z`՝[q ~uZ[%_^@[lː5ԅu%[^[L^Cː =z~`HhPnTnX>pR._>K[ Y7Z Ǖ\\&QE^zɾn.% REb9q 2c_ @ 7Ͱbgdcya5RMP65El-9q adNxInvfyk4 bfY/{cZbO.v 7}k T]4d[_j{d\) //vcUg$96`mE0Hf 3_4>|= ^50cfBec9ɓ Vr0 )T g@ KXPCJrJ-]SL5męSN=} S'Xv`@ 1^(&R+8cu RoHrkכPV˖F8ӳ,`lQϹRq9/ lL2QsI$̫p 7WpsJХMFZj֭]0蘳$me @ȚYYF@Ar͝?irҏS_m=9tݽ>| gBdgh^P5|ǟ_~cϵzp,@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgF@s& {$ȗrr5$TrԐiIr%([rʘ,JۤK IJ$ (IM#&2K:o4;eʓJ1<Ϝ\)9mICu23G}Ԓ! S?ɔJwNQ+$O$T&mљX JSLUGX HarTVoe*w NYU;vTe2Y@H+EU*`֠f6kvjӜ[JUKUS4]1SZ\mMqɭtmU~E T@e8kK?Tx_ߵ>m\3IW&[r=Փ+xi\yflkYgh4GgV9u8u'Nj~a6sb}&cqјz璟Qm^5n]li;YϷmVIfËiyci:sfe 8_FyыvcuS{u6}umZuU]aGEϭwV9}]vq+x};>|׼|jU|q<˞ݿǞtetk}P֭Nk[ukv?-o#dV9egjW?J|~ӗT8+qsr#q/`bC ru7=:-Pg[BMoH!5Ŏ^#WTMOwԠPӔGu-TO)ДO)QtDOD_`!YkRbeeT`yPqZ_9VE=4wdiV,$cekda5}EdX-[ٽQ4EmjU$}vmle;[ֶmnu[ַnp;\׸])υЄ AO #ц9fOǼLp>pXF.ʋ@IHÓW &k@K0Y0,+D aF1PsKЄ-q0bИ$~pVrf$=$3 ,Y rC@gX>pY78-Ia f˫ 3:ђ04_ 񉰤4A 9ȠQ4d3QE0F0H]CD(HcR, @ 0 Pu^re 3dZ異&5LD8,r% lX3O`$AJ Xz$q3X8q f8 h1mnt Jizh+!ŝO_$+32T* (@4/Rd#8uL*\`8C|h.c\9MnM 'N8I C+xIr _$i˝\I! |^9}]-H [D orsQ"D0@xwe@@zN7`d,cpʏqry$1]4I<2{2H̀? :̙ ~/yoDAyd{`,HB _ !~K~ оѽIaeɰ0rHDb  g4C}7 W'82y}g4 @1#@hp'06fPFfH꨿# /p;h X@gh@PHk?>>Pgp#pH0<^pS@E0t8WXPsL0W?,?k`tKfXOڣA>?`B'l+?CBK akU cA|%TA=|As?C3? @ @8DDj gSE;gh@E ghܛ747d?p(Z.4ò(^0= B0;p*kd.[@xgXDhhƖxf(xxT@xK4gGHggHdF]sA2a~ (B+tf6e8# =eMH*(tu,gXah&8I+(Qn| LtNꔉN4ĂpK$l,$ MȔ̪<oD4͕OH4˕[X?^ *3SA6 PCtI8t,Lg̈X`2gʤ4g2ߤ9J32PHdlQPo %N\ bQ&t bxņ0IHAj9)m*B-lN|NfX88 u ,)6 6c0S@/mQkQ_xQ"5R$m&EJg<\c8EDUUuV%^ΕUAUKo a_#0 xDUQgpI[$h"d]֕8XVpj`p2Pfta%;]eP1ummsmt](lʈ6B;gx0FIW45Xn]EWu>y.φVX@r5XlWb-֪Vm9q}&K ld8׆g8ڤ% }pը\b^mKuQGp80 1цpfXi|fmO[R\BCIDxͅ8۴] ,ܸhMuF=PN0[[}۸e u U-<|]]ҍp\hgXIpUS6=ZHtgSӉ]]uSE[] ^pO(Y(\ɻ5ݮڰ[Z}5m] Q05f@SH;[VpaX =Tߧm]h($ U484@8S4`/^LZxK\J O@cVg{B @GfI(g95 N Uhh 4a/8H!5f`qk` ^UW V!&bJCS݌d-L}<`bFAF8P`X,k+m :kbIeȄ[TvNa,"~Je`]~kc8Op?@]S3S._\3[ EX>z``x&8(ex`dl̛`fjVVh+Yl@82_PPff& hRh tVgko6,fd0+P[^(;lAp'zG[fN?]c.\HcPT$kg]Qg[hVOr^fgc&e£dfnFi|^20_L.pNq.t O5Lfxujn>iYj ,K H h m& 686h wnV p Wkh @ X pȞhc\k? pk8l예l8#@zLXҐm`렐{]v۾ؘ^؍ mDXmhn؆n.uf0Qp֬ن!EFVfvoҺ,i,bQ ?,pӒ$j+7*2) 3 ҩ)YqvZ%B*,g!kIq0"(qwo߉gz4qrJqT.Ųuqϥ?M:Rrg!r ^##*bqA)sژlڠ(,šZ^aq))(߫+w6W7)C/s#t1 R#'("uU*ytRr%t[ꚨ:uK"PqMpur\)=&dʛ54t u5&vk&%mvvt:tvbgscod𻉨gwO!T*)v#n:-w 9s;*(`};wypd"u|+_:t.vT*b! !C2 #!x+4Jª rmyg$f!l'*z(W7}ylxt C"+Xv7RY@?{,_+7Fz>Wzqt9{/wbu&v k$vkZ{x:wi{gtQr&G9|Hy:aWgvYGGtx[w;7~zX|&SG/Οob/|)7}~t>,i{EO}*{;?} r"Cug$7~pP~GQqh+|η  B2,aC>Ȱ"‡)n谣ǁ Eb(ďQTaH_<ʑ8w'РB-j(ҤJ2mZNSJI'ͬQ+XP5Flؕiײm-ܸrҭ mURm[tVz.l0Ċ3n{l2̚7s3ТG.m4ԪWn5زgӮm6ܺw7‡/n/Go9yPdict0Ko=ƄPǼ2h " Xs3e%vh qM-t`T!!V*p3MT)3`I3tA*!t Xl8 HAhWUI*$ c w8AOF9eH4c@N8 :#@tG@p Ԑ`&Xjid<љgBh6HӠMz(Ac0ӌ'[h3>E!8s A8#.Z:s kt`8 K1) sGG224,T23 DE+4K!@"P1, T뭹 @5z*!Q $įL3 /ej;ja+2"!0Ml'2 T"Hk2$212 3(G8l<%Τ"L'M3q걾Ri3.$c0BG'lڴ"p,p˭ L3K+@ <$_8Cg,B b<g!uAAp %?M~I,0 Cl?1% "IA#YZN qfJЂ.pF&^M4t=O:e@:0sRVMtu _,y.꨸U19P36F PBi-ׁ(YFJ $ B!2 Y 0:!X6̫,ӌ"/n ̷ƕu=*Y"D@: ۧ*VtES  S*rܛ^@.|9>71):/ 4C3JO Έ@ @1Lz,VSrB H Y8WpD`ΠCHP̘}I_gW poB+޵6i0͋^E wMmRk['x02AO11a h bp0֟3-+3.!O:@CЀ DŽª hV,=xT!9,ªPi^0!O,J8 er}8qx6f5MVV[F&FBiƉ!jķP(%V\` ђvRB&pF h#cyM?Ԉ{@u#@Dt6A=gC˯`-=g|uFu}bdĮƦ@~.CbH,nNc;M,q?ko5c.s @H+ӊ)?l VD:o ϛ0)^n,%=̼^:9 g@ @F3n 3v;ޓr<~;/?<3<#/|07<3yXDQ*Sϯ/C1Sz,2Xf"/Hn>(_=wO=If^Mi}Sm1~?>܇d}ߗd=o\jO$c0G~D}L__ FL֞F`W4 `VDbzRv m`_L ~`] "`N  r `` 2`a %a VXUT!YB` fʞnza%`^!6aWh!:FF^K^` Nvaza"!Fa!!&&!`NT"% (_6(~'` `(>""*v"ڠ+"YԢ-^_&mvb-_( %b.Nb +&V(_,""Q62.#0#!až$"*2#<#&` JcY-Z,6Nc%f3r# !9$ޙJ "1a aD!#rn@ c4D b$C*I^e 7d$0JB_IZ:¤ F2!d7bddG3R>dK6I$$.uRvW '~Xe$Y%ZʡU%[[%\ƥ\%]֥]%^^%__Mx`aL @ۦLX\aN&e,yP|$D $mU&iZu> E,8@Hw0lh"ΙnOB#!fP,C0KB,s t `<̼ԋe˶t oxfE8* 4p2xBk@|M،M}nN~'&EP5̖3(PB EPmPy)((0hP8hi1\A3+564@+ 'y(P\3BCD)(yhK51El@py|f)o)A4dZ3@.=xZh!^%nqcA)iri02GfP -` h{1)|W!^_!\¦.&LLlA$"@#8+N)Y@Y%A]3*^Ry@3 څۦ \.1(3' my\ȑeܳm\͛/aE܀H+At+E8]B$+,,&.,6>,FN,VŦP6vA1Pǖl_6ɮ,\IBl5 Mf5!8JGM~,st -/d F1IϦD~⧲U DE>ق` QA,8D8.C ĶE\:R0!6n1A$U`W/1g-VNANT.TT V.z]ٕl.V-xHN%Sen=X yą1B1%NPm킬 DmYyu-H!o9Z[[QDfF%/P@7+DVzoM@.+?09B ,M@weC\0+v00 0 0 * S8?UU 0*p3,B<qI2BRğI #1B,q&rҨBϞKJH`pb|'/M.(@ਪK#r1}DN[' ēP*WY@(%h0"q(Lj@ ,P 8DT+?(p2A)4),NI4ITTv./{\1}=@lD_InĝU238;3qJ+v$Eȣ> AT3>78SǶ@rBJ!DYYs>?4q2 2˕\(@0y骙A1n6_6$8U#0f"fLPl!rreJKƙh)r qHF&D!gL#$šG!1]$LR%l'(99g.* pfDpDZa5iƓBq 4dmfLdgp$f.c; @))K1TMEO uf!i(6  fJ%8ehȨә_@WUVRB^nܒe ifi dpB98Vmo7sϨ`U )xBt)IW}X .NXn!X)1X9AYI.QNYYnaYiqYy矁Z衉.裑NZ饙n駡Zꩩ꫱Z뭹[.N[n[[\ /O\o!\)1\Un|u@t9/ 3r:"!iX!`fdX>áY@Kzri@22P@?>|qZ_3+u[ 3f g 1A%$h |]4 TɀְD qC  HYD83C%.3+Q P Ќe@]e e-@d_tr# !.:)j3!,W!,PYH*\Р #JHŋ3jȱǏ CIɓ(S\ɲ˗0A>|fE+gtqϟ@ JѣH*U9K<.**J$*Ժׯ`ÊKْR)6fښoOb`ݳx˷߿xN\kW$Ի ڌ@D̐㞎!̹ϠC%\4FbY_F=8ektiۿܴnȓ+_μ+ }:Ὡb/Nxa=Uz\mט_p'`df߀F܂F|Vhb(]6tibh"n_tn! &]i'r7a8<"H{\XPRV[ImP. R%%{=f\vҏ@ԍF#O)bg8c fiW:i|m"Vgj2_TJX9鋓Yv駠>ggcxut1GfbZWktrj{TfHAq޹ꔭ.:ز [hFvؓVN@9ŢQ+khkkl' 7G,Wlgw ,$_hr+rX/,AD/mA΍3)DLIQ3H$$aKА4;@Jmݴ^fd@T[QM33*SF0/@K^AA b* ABJStªXUV"T A2p!b(.3] |@XYZիf3)8sbz;A -sKa: $e U )'D؟,\)W,Ȅ@4 gbS<$X=Έ5Cgx ] #<ҀMxbu.3]W،D$A\9[B Uomo\J!E6} e|RR,_mloW Y/v]RHUZ9+l[ΰ@kR$t0jo36d]Ib8c ;X6#[Xn]R'* kHc=kg:#.c[ޮa#(wK}Arme3{ t=HFgF`S2+&<<@qwrtfAպ3` gC .sq:+ YM> ZajT?܅W(~i_apwSv1, \ k_H Y ZS%(V' " 5ݷn3M G?Kΰ@zd gt~|'_y\ߙ@lghBo>I׋ x۞gOF;CF)_ǽ]$# % <A }؇~rx% BR @ ptyx{u|&h%u{'~x|.u1v0D8% EH5'np |C5 APx@~:jBx # 'S41n CY3p t5 FX[ pq S$ѷMQ8C`*`:ET`> 7:h0Bːl Ktjuo:S̠\*y}:_( VP `O樐Jvp )1:^xJ9:s uzAs@x@૳6@m ΰA ?Mঘʨ]3 ɺCqhꤒKj]xY*]:Z@Yj`#Pʯ+RD5q e=_ @prsl`0 І03zKбpa!lCS$6slGKs YG IC,4/;KK5MY;7_0~@T%o+۲];O63:Y6Qxo˵0KpY +T3#r. aKc!qp]ڞȷ AsK*K- ]3; G4C<8;[*^;cc˴aK +$+; > FINt ~*+D@7 SF[[p'BzP,)%0M"ց)r+Ϧ-J<}-i}I}ԧ";بԂx ]r ,ˍz؆}!*yMט l֟A2؎Ӓ(n"$.~ON0j]6'^rkJ7^AM[}!:jNܾONNuՌ-r^]ѷ-=l}ٍ~,Q=7.8M?,> YxeNו>?>L&+6 =?3N?ab]a_/{\#ݓ>@<*! /a;!E A1`GOV0aP X@4CU!V  bf`B >h0N'VQ#=`%RpvcG-]TxL2 @A5ΐ-լ b%+Y3#E&]QUGrvM]~VXe͞EVڍMxǝ*<3 o(ЮC ,pW_p׼FqcTW_3 »7lЍ3? c9A395+AIJoH>]tխ_-\r˙3r"+f 2H͊19,PA9%U޾ˌl#e(Hc;5RA 6q=ZYϙ:ƗJ4 3d +~kf \0 #ah1[%>̥N)'脗21A&ÞB SYf p0/z2 r.=3Jzq< X$ @M,HE 5tF? ?k# !FCQff`1_z5Y ͮW_6Xa%VZetA&[H"gM4XWVq O!ISUW]gv`NNZ|%~e'ed[יv ;v` atւ4( gihbo=ww{gZ9!R&ސg`tRbz]g !Ȏc 6^ΩJz™EޡWi~ O@*x 4VoxK3g BH@I[]4gXx/p9O0b|AA6XЄ(NDvN~Cߕ Z !0N@) E3*cUi`fLFv  <*̸@C;BҐDd"2mM9޵!H *!)H[^`;MD $  e@t@$'JWRH(EMrғ׌GVI 1tAgd 0A4%@ ,car"+aSC"yM`S&AIΌ`Ӟ3&DvM$H.wV$? L)iI`reCj$ ExAPA(:Ҙnn""uSԧCXyF0EGqXǩΐE(i@e!B+!2Ɠ zDzGmYwy>F)/ԧB5 jC\B!T1Z>6EMf ȉ)TQrD)[*W:4fc;b5L4Z ֯S"@XZւ BIR< 0|I& W @۟V׺nvF9-Rm  .4@*zW5DBZ r+ݷ @0B43tyѫm$|RӿQpA5.1HҸY[ك3Ua vAB` Ï%1ڂ"s$Mk{ۥdEsm%  dΠCg,ng>xw%ΈA @1H N`2>ִ:#Rё4 =8dխ^觝K8Ah,PVHo\ΐ!&,vhh (dM\xAƭf[x]u &[-" rъf' .ȫ" S4@)✓BYlE3f'Gyʟg AF8t5m[hrςFbtA[xAۗXRg Csd(xtpѾЫg[ fĦy{tg8-y1bigGzN!+dHBjy+@Ns+cu]tv)􌟌a.:cOՎkSG=Aw.wnzDϯ{KcƈBr['@1uCA8\Yy00e[`d/g88H0#kf8h)@;ػ0@4 hRpD@ @D30b ;s3k)Ap#9 Yf',~`\cP1 Aj%,Ģ<L8%dB&RA ܖT59,????_=̈cjGP!sM$.#RMO#u%%T=Q TCmQ*=TS-/R1TQMSlL!T55MF/US/SUSXQX5UY-W]]SE4UIETY%V`uO^=PUmc}I"UEhlUcOf][^QWVl AZ} te\Mj uwV]U}W]{mWpgTs$пplH2?:XI9A g@KMd Pgd卸\4Pd6Krə `qe3eec`b6HXҙ&0dg`挈OW~ _);r6P LgXgXkw,mŇE8 o$}g] ĨHs. r Bo-g(%$M(Z"j"z(m(*sb.)H_@9rm0,/R"S*IKZ:d'pڧ¬{s}'RCDc;/.ZPex^p]JLt.+h'Z@ӊ-i׬ךu(,Wq,#: ފdX؄WTײuβZf3Z;'4jxu)DkCvuk_jsĺ4[IG (epEYwG'Z g2 ;/Xr!۱1eh#YcpB`)3x ;2wK[²vl,ĂWwJ%;t٥gȹ\5(K$n6MSu7^Xg̀^f7f#k#lcˈDf` vb'Kq[55w{y7g7sw1M7zW|5ZG09B0Cae󻪃{2:==;؈ ><˚SӈkՏ<. ;v;C=׏ 9~{鹽KM8s5>wC1ϗr D#D8gΐ`d 3frY:@_rrl(-Ø5LJWx BgZЙ8,e08bi3L _Ɯ i_MD AR\LWDF:ҭk.޼z/.l0Ċ3n1d)@W0J@.NϠ;VAâb~u漫{r;D7‡/n8ʗ3obV ]iڷs;Ǔ/o? 8 x * : J8!Zx!j!z!!8"%x")(18#,aywe Z:Vc'rv'}Se\I%]rrUu6tQ hVئ)Y捤)夬jꩮZIp:k+@ꢪ2kY" ;dJ;-?Jl{쳩rm;܆#KsanN /қk/p鶺6ڑm{ k>qG<1)bZIr&(õ~Z2mL]1qs =,5U[}uF%u`)>l85a^̶+ekL3;-Tc7V .2ͰRhNSg >:۳ ,Oc?2ʱ~4~}{3^wv+G5y|4}}~{@ kܛ߸ѧ.m^7߼W scV*&9Nr3"(yuҗƹPo~Q\<!(!F<"%2N|"().O-. ag"6Y"5:X cg4@ $ ~$, gQ0p g/\=ҥ#&3_4 `0HLeb!2q/B ,iiK\h,Ni]-8BV0&)a,$` U4Md OA2tdBD:N@ X2B`Et@` 0C3qi2X`H N ATh:Q6$A <4y3a1t)NSHtu0 g!h+ETC+ZdžPHOrխNk3J1"+)jG1b#EC _tF2սuO^mHxf!|E g<3 QwVr$8q % *q3!̻kQH@ gEA#pF 2A*t -tK"9Du!/[p2 p+ Uh@F1ЀE. L` 3A< P gW~~a 7`26`D A. C΀&Tlw% CH!wh{@̑ǀ\ZN~2,)SV2-s^2,1f>3Ӭ!nnnĚ,hfF8=8hF,Ass &IzMa~4]@F(֟K8i0,k BEHlUz.X3\ 0;4^UDD.:yJEGpF$lV3[ͅp CL* yZ4j[i !Dk6 gA RLQm@7d~3m腋1Z^3"ysXYx $N8\J =ssxB*(D[D 6 Ul?=oZ~`B o#-b49ԫlf\B]= "R\ |ghPQp8C)7M"@)QA⃄ؙx* 5z~M;rVm8$\O3Qϓ^F.=Sճ=c/Ӿ}>^aXA.wT|q*_K/}iU`hwŒ>#,leC %Z,Xï#< 8\AlF(4G@A%Tl QSCXF7q'BX!D*J@K"`MO֠6 P =)8 VS|@YVY٠rYћA,ĔAؕ@Da`4<ZLeHfmxhe U-@mݖA\$]PLA(W b=%z ё'R4=~DX-X% 2\X•؉9 /$A\Ah"2P^ GXhtE^2^#6nU7~c=8#99#::#;;#<T_TX<xN_ Y5 E,XDA?6А^MChXU'XBA^3|qCd@TJ.T!zA KMIŔ\@)G}AHP"A1`2S1!M^}\ 54",xBdB3pF*ԓ3ܓU=tB/@)>?V}$]B/\%ʔ0.H J`L:ChuDMf·_^G0D.b:1a@UCerDfnmGgzDRA4#D@ PlTݦsd6S!B(L#R/eYƦe2s'y`_nB i҂(=1,-2o1bqUl6q!zhD?f)(Q0 BC()vrv !2,"I8B*A#A3XGPz82($(8nDgƏ6>)FN)V^)fn)v~i&h|LB)2̂13(b)w,0($9ZUѩsi)ʟ *2*RR]h,. @ \V16*"H 9 -ԊUp\dM`JVNO֒ёhp6e-9/ 6!}"5ME@B-܊c.$-;r'A)u(H C内 $D+e^p׆IY4X. D/ 4+C5KOE+(C!Z3A]K>^YHDx\__avMNUu];6Aض☋g'Ō ̊jfuVi6lǶl6m׶m6nn6oo6pp7qq7r'r/7s7s?7tGtO7uWu_7vgvo7www7xx7y7y'x3gvzb {-!w}^~v{8!|?x7Gx N[8:bkxuuU#]x96I@!,W!,PYH*\ȰÇ#JH/3jqŎ C qI%Or˗0cʜI&= ` xI)(O:8 $gΐ$\0)%PḩQ <@ϟ6uVڐm]AYVܬv LaAm&&bŘ5s.]GK0,9cJ>dDO,X2T̯EטSP *b 2{g QC,n,b#bKr惠kز!~˟O>C3ΔuٍPS1*6 r9' $1(j9Ax 67]3 TfƆ3P*0Hw@|0>TT0WP چo)L6$L8s@>8C; Cd!Dҗ]C88#LeBfF!Pݢ@;@4FQ}Θ(A6D 3,"4UJЦ63xЦc-*AJg6妞듼 A$*D24S 0@(2baYP.۬@B/D.WL3x0) s@EBh;,K*Lм<|Lo G WP 3P"c2 1j4A[A/OBtL2mܯB+-ֺ,1 {oR3sL. rbZ@7NP͘ˌR0aQ/3t"7-`k=B;*@(L, ts?9JydŜ{NгN[ުmЮ!*%)&``(++ L&i3]YLeL$_3ܒ(.$c0;HG4LWq{?+VC1%kT3TA 0"{d:Ԍl+C,8PdHfC W 9ãd*PbXA@\ASࡅp "ԟ)Fѧ"=3*sF0 0D39hA* M[ :"Uk\Yc&A+IuEK\:=HEYaXKg#ʀ4O 0S&@P 1HA 35D>,2zP ThfkB; 0mq Ͻ*A10ph#eW7[٫<  k*|K%ܽ2{{"<3,[A\E DF̺{E?S|wkL\Yõ]l[2l+>,#,al+lP},Ǽ=}圯Π<تҧ|w؎ÌMl5\-(=/֓&<,/لk-]mKф [bYڛ\۵]؈ {}ܜ ܔƂͺ;فdĉ֥ڮ*$=] ^%|-m>q^==ީ[##b02"<=8:<>@B>D^F~HJL3NPT^ZqQj$c hac^LBf+AV[+g>s p Z>С|.un;"q. y7ya6w^$>N~Fqx :vЗˀP1hgpC>+H3~R ."-r!;.پ-'# 0 :U 3~.0 > p~NDY+ q++1p~byQB X+^B:V~Pi~ㄈ>N^7/9oA-q^Lk99946>sZP Q6:3ss8_b# lP2; aX?P_r[e[ Z 357?a8I:Hg/a55[3R0--:C #c.\_4MoO5C809'2+21qh?:4βm_r} V Na mYFBkdADXFJJI:783TF3TGE`EdH/F ZOb̠  ,YHrA^ah!DIA aeTe\rLCE9I5B̖0T9+QHtTLE= 2e*Y3_ZI((YV9T0Eeb9e˘f)Ұf;:,d֭]ςoj̹砱eq"C0jt Ȓ'S ٫Q@Fl0gX.g= 2ŐX .OYě_Ǟ]vݽ^x͟G^zݿ7ęĜZpT_@p Ig|bz; )ȎR:L"D ÙJ z™EH$Wi@F9sfDJ<T颠9 )ZC?RJ!l H`*rA_ѡ NB) i%@n,Ȭ4*M˂:řƊr$ĂL?$Wܱň"(f*W"×(fx(H:V WtMf.H UE6YeeYg6Zi>& O JM|2TC )R3cD1 X(, O+| a1H :7uiN|#,[ P &+#z8≿?]g0)ha bΈ(cw5NOR.HbW^.Hf#6"gr1HG J8" a~\ten wrVF` ( ][J⅄ʔػ5sfIJ6qgqLY!#8Ms㈄Vtx L1eֱv!agF澂sS^j4 Ωvs"?&*tKL1W?2Q`$BЅ/a U"h2 عrdb PwP'^!r$c0"]a` h-q>Qsl$(΀ANƐ21M 7i0tg<"(2þ hTc$FĒr(L S b1ьOD!p AERuA2ƒ6MI+2 gP:t&CN9/Rf6Mn2L 1wKΈCA @1."N`2*ĝ%du PLKC 1 <#g: u4Ђ\BDAΙN'8bPmzYEǕQ4s#)?1So1-!)1!,ʻƯ&׌GxFN0d@8r%>qS\>Sps9LE68uN ň!pFsi( ngީS_1O(Tyww/<7+{8 LPAw++s3xi|E?zҗZP8#u0@k;}u{s]G~|7χ~?}W~}w?~G.w?s0ke@;lJ@Yh@x @i?˿C@C@@Aed, 4@L zAY,@PAA@ ABdfAA(A|$ \A&t@)T"B?.,/+ 1$tB'B)B4.@*@B98C3C=A7tCC:,D< \4 C;A&H?IBl@1,LD#A.l EKB+ADA0`(1@ `:/gc9‹_؊YP+@fP^a*5ʯfR^pb`䝧E]9]}]d#c D]_]^(a>0/e 1Juy`N`e }Y@+3@ YWc08y5aJafXag_(} -W8 0 P ؎H脦`XP(0٠ gP  h(&b8Ẹ  Hhbb( @6a (n ?A*D69h01䞥gȏeБMXgq%Sq 49縏$ێ=5>/.)597QaK4Ȝ qq]֔C ʹO )MAXvXFkI *fn6o^F4Yhx;gWg{Qg SNeHqy3y[v)qJ_@9H4hq8zюr 2tFv晞fNVy6jw-ZPex Ine쐎=`H%8*=ynɝ@IMxN@j[봾&k>cJ6Z\ 6Ŧ&ǎ&*x>6W?cel ގϚnh&lYj# z#b~/>RPOCJꭢ+mY87(^N܎CR&2+!ZJhq$$6J1qR:%Wpʅ*oYb!f+'Hyz*0k¨"** f*Df`VSp:} z(:o|qab)쟦1**vVeeprr c C}-}m-C0m/0_b 1[pYrSڂn2q.'*//://ĵ0/g"n#JHJ05)tgt0H5CsV36;UZ3,jSMa+F{4~qukt/Kqg=#u쨷{4Sm ҒСwvls`3rsrH ۨ뎞KxO ˎSyvw}ﲃ㺴m(s7woɣ<MH6| %|,C$ 4D SfRwJp JƟ"M€{SΤRyѾwNV~?cdֽXP &<ؐBBx0B%bȰć EZQǐ#?n$KMD&Μ:w'РB-j(ҤJ2m)ԨRj,Y*ȉ5mfj̟[W|̱!ܚdJkҭ[׍28$~R-l0Ċ3n1ȒӒ%Wež,l2ϱ0GkڳZ`v˹evYl/a҄=y2‡/n8i¾۵ͺS}9t֯Wy۳OڹefVz}_ǿUn>|Ga&^U呥}=xM"ZgH=(8!x")"-*( h9շTj5>P0xcR3"GeEy$I*$M:]OJ9%UZy%YjI]z%a9&=X&i&m&q9'uy'y'}' :(z(*(:(yDZz)jJ8sQ^$ (l* FL3@3( 3 ;,Ş(3tBQ8@8# P@<{S-[/pE- C8@M2l) sJ]K3@ӌ3HBTL30.{NnD5* ĵ)4'PL2o73> -(@tr38̈́@0L#0 k5\ pH!*h1δDmP*t!ж=" ]~8~MT؛$el7soܗK$2I+|+F'D⩫u3)Z9B C"zHdxL2l<:C 30.)3 K 2)-īD#1]@F9O  -*|R2@ 0Õ I0Qgt =ÙΈD|cљOpIC|$ "g!r[@D A.lOM*;bS U r0)2zQc+S}+\Dg0D]\hW,pFŵ%S6Fn'ߜX: _M?@9aC+%=q!2ΈCARZ:p+E1Ў]Qq 9Xϒ>Cv8@ 0 ps K.шHH6q]Ɛ>gC5 $@aH<XG0D_ MDJK `Z, )F( g0C,&>1S.~1_Ƹ6IfR`G31YUeDVv 39A/wbF%Q_@%򢗽"^@D0 bX]9$]6` DY ".F1W DѢ] #W;όfC\.@䊅H*p7ro":M8,YҮ^'e9M p Br"@P:e2X~5kΫ,UDx1Gdsۢ\I |[Ż@>}$yQ6 -@ t QKNpO7iodӇ@sqB ]DtUExby|"rj> /D d@*T( aĠp*'J&ճ`j[:.f?;Ӯnzd@JC25C=IW_U|h=1:aQ'lp'@ǓRJ}r*G !n21NoNw\ A\ Hp0t. !8!1: b;pCA(9B3qYx"hW*U&BsьdIk.\!B/ C(CMNeA*$%~aD8]3 1 8M#A*cjTӝP2^#6f6n#7v7~#88#99#::SLB#=2BE1@[D\=,CA0,;6? $C A^AB B,dC^d<$BDdK`NKBB8@b$KCGYAP5C+ĬdKd,3QY_@ D@AOUR240l04C_`102 B0J^%[b%G6-PS^0*DZ%_6 A2A2\|^,/(e_6&hdBpdX6.腻AbU:gKe_Uѕu% $BO~&lHh >Q5! |1@ 3D%&q%НJT@ `q>'tFtN'uVu^'vfvn'wvw~'xؤ b#2gCvʧJ"*lD+8w8zcJŭʮJ JD}g~%(K4P5Ru'qҁӵ$hC˹4PK tD Ęٙh[%'2@W2@ԧM10AD 3A ,2PL @2@D8C&ğ9C @X)Bdi&R!+,K / 3 CYPdj!0XaVYNHF*DJ@R⣯@+<@1D^^1B.+CD\OTirD jA0kfM Dv|knAHc5+F:OP IfjiA@\Qe@b/x+djD8il 9l= d fP P DD "\ uі ,)hBF]pE Du5ͲcݟՍѬA3`µJXRB2r*@/,2:5C6!{yWײr'BTDӅ36 PG8~.膮.閮.ꦮ.붮%a:.CaU'vB6.EԓV>"as,Z"4v|F|tX{ojʮ5#|0GzmV!noFou\o/nFkxDZ0EţᯱpoHL#.Bf۵un&vQpzʯ  pL1X]p o\q'/17?1GO1W| M3 2@86{5^P9L3*_BFǾ*jbD$>DH(!  Bxa`W5# P@!,W!,PYH*\ȰÇ#JH3jqŎ C qI%Or˗0cʜI&͋-g̩sgLwb!КB.乲MB32})UGU&5hV]KٳF0ՈjOeW#[Ju t*Ź8/T߂EqڼNvȒ̹ R쑯cz$9Mc$YUzt%q{z-ȓ+wJ"YnMpv^s~_]AFyǟEKl?}Az܁&`ae)ee[iVKYi]PU\=hvjx$&2)Xq Vi啠$+*]a %^E΅dp l>a蠙ruze~7(ahqI)ho([ą)q"vKaǤ{}:/J੢'Xz.ꮛښ뫼&xMlu])k;5f+zmh:䯣k~&FUj:JL 'V*T򻧿ljV(^vRfE,1j7~^Fm,Wl)4'.1|[# "g 0t(Jk&<.ӫqZ˵Z]vv==Nt2[T֬zC|L ._;Z|;?^aN:fϯs ے_|i\t l&;.IMBԤd@nWz׽] | $[<+zQn{&C0H' *twN4*8B_ F0b‡ kͳE)vQ}3` E 1u 25D*KhG\!-<̣ˢ%~r!RûbB&' *|WrdFL{ (G<2\&Iʽрe+gIZΖ&q^ \JbL2f:Ќ4IjZ̦6nz 8Ir Lu'z:@=#<Ј18 1(Bs2 u&TB=ц4%8H|"JW&8#Ox rct#$ Y""TȂ35Qz$Ũ'3}^!N=HMozƫ3PC48Az. km3:d+KW eO} Ԅ9LBN]bAg|2C&.zƳ)2QX( D HF!fᵱmmo Iⷣ 3a5_r8nA 7(C~݃p }H]$=oz;B] u D yFۑ>eH&q3PX83 _4#p3 cX.1Ԃ 8(Nr Bў k0ZdPu T@$Q &tqV_ -Hiޅ p20]2Y`e,kY cPEdn@A `2 f$+o9A ;VНAt Eѕ|%?yqs@ w8 g`Έ@Љ^8:W> 32!W36ފ`)h2<`ۜ:)nqb _@ 9}.7}o3TA2 X'ֻ@7Inr`7zARр.z{ ĸ1џ끄0H N" pF+=R^ Ga@\ 0}0yrE%P mN v 5EwUBWbU ΰ H 2u$[$ ] s x  u Hwq vO1_6P;؃Axx]xЀXaΠ V Qwjx'<@ȅ^SHW(Hn8gx G4(|7#({Xu Xx&q Pp P}c͐u` `  X `XNokp BhKa b RqUWl FōA )] H'eu Hn!"' ȁވ~X iO QH( ʶ +% 0 gXWPnqȐPX  8`i~(l(3Y(xH}戎!IHv ! TZulm`)7 S쇒ĈqApW S ΰ ۘXf %d c 8 ȍi@ wŗwf`GP q 9xX p geOpY9Z( 9~~)>IAgx|)ti٘9`xXi` ' Yɖ)Nn釻POYw )G  ] mhc)n %zcPXp k vjHr`0zx]1@G <{ R؛Xh@*B Y#J[ڢ/o7zC ]y t)*cڥt' ʠ8U Ih5Z d81 @ᨐJkj@ zjw }IN A vw ~xxhQJ .Π z *K a ʪŠY** jY]F Pכ:Zv9Jj@~ l jB* ښJ`! ` :Z $ Pz@< `xzh`chq7^@{0Pr 0a:rU 4@l E0 r0Q`MH !s[mR Vе_Kak۶N Ѯ xfָ^A0\f= y֮ٛ7UW땤 ^j1RM[ O ~ @dk[rtk{\`K ax|K_{ل)8c YqHR05ckOs0;zW} O0veg S&)7 p A8ql`#\O `Vr ;@ :+|V+K`T  "L–;T{!ΠEKF<;(ek 1ZxV0y  t @~(,OM\<d)ar6Csڼ" c?t<=mHm >aՃM-B>ē/1M؟CrF4$E3tKC5$GO4=3BA@=ߎANIBד2qQ=;K=s:(ز-FF;@1Dߑ@/S>5"5S}4F34-ݝ@,SBG1ٍ)4r>K^3r+R.?Ӓ;"&[N>:<~"a2=&8D={,ǣ>390|d$ /\iH +%^GNS(%ߍNk>:^.e*}sEDnm?!S6Qn,rA^LVTDH9OD73eI6?1nH'6hΎ硍>}1C8y9#Fvn&G3"nZ כnҳ=nxJB7 .z~>7X+ ~>3AA:Î)#@,n [fTF0^HM.⊮5AR>$'7?ߗoqJ2NHFT*T(-~C7,(?l0BEcG=}[;.UjOm9v"o_wo٥]oK$=׎?cQDB>6M?_K?< 1P4PQ1QQODp-: qr hPYP%UA]u/EOqX D0@ >QD-^ĘQF=~RH%MDRJ8A0eJl&O͜u9YWXd]:ZQ(QQNUV]~VXe͂f g ]Vf6 :q+PE xx 9A)ԃG%ߋX>(!fXErhҥMFZj )X3O[n{vm!:YA]tC`2)s.$ ٩/9#Q1fΐ!eʯffy89+A*5H٥^`)I = n 8;F9s:@fa@ ꄗ2y,<.bj>]QoqǃZ|1F X$@֦J+2K-rEqc/+9ѠKIE:9ƙNdb|y' `g\Y%L ZetA&[y!<:;)ȇ`2ݴSe>@gieedD;gTRpFJMSDeQHNh{:I=řd8 `t▲%X=y2tHp4o<%\FM|<3sYK?^Jg)GP]("O~ӟQ3\ hA'R^ )h0 g/ %8bML#' r҂TMx !"N؃3 DT`3R3TE[xMmhdF9Q,HRGեV}':N=('OխoAre8 su]'¶cNBA `4#SIf\BAt JHd<8YDNķ#aa(mD,; h?[VlabS!fTXȂaq8A@sVeTu[]22Aսo|%W 8 /[CT(L$t62|}CTC ۃ`aȸA, >a,a@lD|g 6OB w" !_pzUgܠ N1 ,$^frA^םMÅL8gF PE`YI !'8H8d΄sh/lhetwk^3=$xϛK=VOyի~v߼zҧNO&ӟvhu}i/^Yz]{ ?|y~z{?"2ףǝ~Ko֯^/?oտ|׿Jy.}K>㾥?>ȓ  @?:? @4As? ˿>k?@c4@L$"̊=ͣ;8D!?ߓ>d<8& @2|?#D4 $>??@A%B5CEDUEeFuGHJFLTb(8MC5x`TMHRE8 TZ9R}7U0m )avETfM@$b@+7^57hՖi6,ceFg5yRa:^glS[pA63<~0ixlzc^ȶce׉5:7W=5!UX#MY2rؓG'SJ% SB%z-C^2=fEٞG l#Zz 3](Brtz,u]Үz,0u*8L{U[n%%k7L^j۪P: 0r]F84k^ ˃ 4lI{LʜZζM ͵,am)?Vy? 6]`tMYu!v+@N':&.6~=N΂(PX*7dt%&v06e^sSO-)lCd@MlcН<527L5BaB.-}E=]6dpps)e:2_+ SԈAf /GnfċȻ3xN'!Hvxg\Q"gPyD ފŃlR6ì:[l_v8cp AJ#S-#hE8YȄfUzcKaJNqQr駶 RbЅ?8v`ŷЬ9굾EE  vc0ƶ9hlskuӀ)fp;1".#F/a_,'BP99 \6.6̖s#?(D7 @Q 0XcX&]e Z׶lЪنn6;on@SHps`0@:='.). ]nV?)B.PN. CS'c>0'@+S ٕ[IgqXY`` :qXc-7ac!ce:&-r"wqCeIIb ȏ0W(o)Xa!KcSAUa 1Xf;^#i`Q[4сl+8CwE3QXaض1tDw)<# 70'tq;v\є[_ض_SGu#)?c<"l[u"'slr?>HQZ2-Rct6/KLҼR11ksk˨>Uswwxyz{|}~wxx 6 3^w="}SNChS}c!܈llH=ax_HԮpot yX]ޕlɗ܈IgNIl+d^U_a6x5h 7\vVe]J4rl_g_u.dfjSᅊt'6l-iU<Ĉ\n{{{L6 ѱ|*?8*nB6 Y׮tg_ǿt|Paha7=2H} yӄ}MT$!y ~e7^8b#?^ُΊ΃:֞l鯞߇e +P#,X.7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w'C9:aI]CH欁FΤY&Y$R, gA%p< 88 !..l0Ċ3n19:t٥7,Vr-Ζ%RD٩ACԊօ05T&Y}6ڶo lfJ2gmd`vIN.r@ s;Ǔ/o~/=/_x2%|Ti"9t 3!@/n + 4L1(@gq)"-"1V@J7HFQ tGU0Bɸ$M:$QJ9%UZy%Yj%]z%a9&ey&i&m&q9'uy'y'}' :(z(*(:(JhU#%䤙j)mVj)KVz)z*>)j)O:+. $Ѱz+*H$먰,**jD-2-v:b*j[BvK{ozl풛-V{-{/ ;,'E.+0 [< {0!%M,ml-+<35{1A= 0A 6}4Y.Hv4G1>'|Ik5.;;Di5m-d-L6ko7s9gjx;8K>9[~9k9{9衋>:饛~:ꩫ:S)>{n!!A; F3(oH>23̯JW*?J>̘|0L;XpJ1̀ , iF/z0]91`+͘RF]xFHLebF{\͈F7P9"°E|a RrvPk f#v&; H CqE)aT`Q1ȈPhD$zd83:L&,eh 9X&5p`Ld* 8f>3ӔmZDrsE ElQep"hAGCgb!vp6B WZ х sp.g,b!b脏FRB 3 B8 'F` "̧D8åL)O}b!?:N8ΈE Uy3ghB]ESZgCYB;e$'Y0a 8"A3 )EBF hd"`BX`ðYJLQF/8 te2 ^8C }mlg[ۆu!XF n`l \t¤3H1x!X@XHNE!Uyq]dw!XEp3u*ys~k|f4 \ V YF&Z\+,E\$) D60,dxv0ʞ"&_Xt1 "3[Ii98 $d'C$ ޡ?4mbl@ ,~"RbPE. "y3R 7ùoވ@ggp ʒ?7`!ֈ1tQ*Ә3ȼ GhԢ&I|,CqR^d/S84]F&ظa*8crC1 hPA"vHf8@RyE;c&lZ~B]IRζ}5"zޖ@ 3h7SZ, xLk0~#:;- FNSH@) "}i$`~_=?OG:I; g@ @F3О' I; |J3Q3AS<3s>#??#@@$AA$B&B.$C6C>$DFDN$EVE^$FfFn$GvG~$HH$II$JJ$KK$Lc9$M J8Ã9$O6t))@Oe T$%S$PL6TI)$C-,pTve<3 QmW%ЖTEgY%R[eY2]%3 _&0B%]&c"dgMWcN,!,W!,PYHB\ȰÇ#JHŋ3jpǏ CIɓ(S\ɲ˗0=.qF h"h3iq6"%j?\0)Ɯv2ͨtkî)qe^뵭۷pʝKdgeTmȓ+_w NP[p'd#g{] CVgj֌@1$S"4cXH2ʃ1ޅf:C@Q}X EgXA7b%^A3JT,xP"?G(TA!F4ȏ hPz )@Y@P U Y8 hɦpD3e|矀aAw!@T I30q 3 ă.`A*TM::X8 rLl*@ÆfDE+҃.t/";P:@W,i:̡:0-r)~I0X"g'!}pWg$*|- F4 -P"8k2t,Aʄv,еx*PVzi7ی\0T&P) e0 A"PKm/Hv`}Р-.$c0^I$4CL3,8*0AD3I? ,,1uˑO^B/@0L#0 'Nq3.42!߁9sh68D")+{+`L&¸ $ݭ)4'br-9c6r#;UO} אxa^V#5CĈ # B;.w> pݐa7 ;]V x T jBGQHtPlPhB nhB 6 A8LBx@syP%g,?8ǁ 8##i;bQss d$'IP|%:_F!ir‰7RHL?d'?^R 4m)Sr;36HIzВ@IKj1#2Lg" bN1^Q>$-Q%B m3Z_0'7юzT%VZ3L/B/5*2bf6#vv4QJgȧsF J `NUE:P0*Q D~Kc:Sgt@%H ReB Ǡ+KXU XuEp)2]@ ,ca1z2d4ݪfyk_VU$3%%S OPEVTTتLizҔ-!Rj$ (n7^T)ndž 5Dm:ЍHHX-*lXa gl + ʠI24b OۋV\w^.)&x7u @yj`WaRU L ҋD Ǽvs$H}Fos +k^H` FsЮ\bFUЏ ufB΀fJ4 ^ ʂHz Aؕ|2 vxY(b>vˤ8@R]aD6- 5OsXB!hxQ6i9eokhՖ| aIƤ2 gP 7AsW;dfCi3f>q! XF#gX ABàڒz1Z\o$̼Q=3R~ dT#W| $?Rbp}.F8#pīZZ-A8%Ϸ׵8Asg//P|bAT~ఏ3]Qh@}8^hc ]B8b&ĽO3A<Ѐ ʌPH"K3!9hJt>AVьj Mό'M}w}`{{auiur#A0!,[k >pbu&b}#{\v|#~ʀ*XW Ch )8~Ƈ|ʷf G&G~$>brJE &8@)tŰE3WfxLqyWs0RCJ w0,Y0%7 `FqSqP2׈H wD 8x@ A8x͠`4Q 4Q|@!@8*k k4Y>  4q D(s8XWan(~+CNxx8}haۥH80" `j)ɖ'`"9$Iwb)Cq4!b12z#7`AR'Lde Ip?hY8d0[ Aje#IyP*QX1PW20ѕ"#[p87hGIVfYL9;YnYpHІ$%9q p @)a1a!!y5G0C p ̀YٙIfc01^ u#ɛYy%9Yyؙڹٝ9Yy虞깞 ]YI9ǑAٟ)aq   z) !A(A& )zZ+!L6Ѣ%&J .)j#ZJDOڣM'Q7>[J:ڥ0:B:IbʡUڣJb:\ZiJqpZs qmʟHʧKJ}zh:xaʥjڨ?ʦ}Jɣ^n 9* ʩuJ꣛ ʩ _*ڥ`ꩦګzaʫr:zyĊx ڭ4A CT `1E.r**3b)r"//400B0F=2%S ':z=$ u 8Ǡ=! W <#=7T98 87'T<g3Aأ= 3Bc@C@%F#?C:I Πp7)CB<<t<]ҌB-7ēB@ $<6qS$A7@9@D>`AAWLː'AV 6 K``TGwL4J5YDg Qj4-MdKTKo'Hyipt3&uNtQf>hDOweMid~=k ~Mhd!N%NyΠ^M@bN : Z]UeqZSWu p& 0QʎYΈR*RY!Y~XpXY|E(tδe@ ʰ w`G K Վ}cPaubbaubdd Vcc0^% 6`>Q`ukac(IuuTL?~(Dz 2O?! Kz.H-omFC VlmlFkV'Qh  kmW>7|:njiBoDFamҶMJ|r/ QVˀQ! t"WN2xExDfh@wlg߇gwuvrrqT xxh'}A%F7?wvk{w @/kdt `%8}A ^-+X٦01$'39uAV  =~L8șT)3MTɲg$jKg)&G/',p )Wp1Ǝ8&pA z,_qC)t`gbZG8Srе `o߿qqBΖeҕWΝ=ZhҥMFZj֭][lڵm 2 oцr:kfHɒV4h3M KZPJI-H)H,Ν!|Rd&ǙV:ݳg cƣKs<3:γ/^B놂n$s{ HLkùB4EgT0D,ȏo~2H!$H#D2I%d$P`4HJK.AN5/O+Ѭ23kb*gh2O=O?4PA%PCg dQI'RK/4SM7ӏ@;dTSOE5UUWeUW];,_V[o5W]wW_6Xa%XcE6YeeYg6ZiZk6[m6Zxn%\s7t]t]>5z7_}ނ3zk^{>`|$޷b/n` o7܇Yɓ1fe8G8]S6X`VN 6A4ߚcKz痟:jNA8nyAKk&j>k>#Λ:pG'ZKq#+ݕrO|s=glE'-._a:86ҒO~ӟh@:PJO@AP pV8mPvwԢ# $yԥ/m,fԉ&xL!\_ihXʙH GE'шYF0<2 gx M0E2 $@)pakY r_4jAtqkHZfIl`[P8ui3T4)h2@A.Ck aG@,*PAT')Qu}܎RG:jM_IG4mrFwսnvw=ozwo~x+JGxYb%> x5X$zLn' 2#|s#b%3$ Zʅ>h`p* 2:W 볚U[o"Ů(1^K>iXt\ݑǾwbS;ǽ*2zcHm|Ǽ) << ᡠg^"0G\З~,1c0ޤo1Y.Dd"4U6vpga-LG;R2Pbk:Z'@r53)c;J$AKg:(LncBY'B!l0q($#&,P((TB&'kdI9 ,4~.L*!腜腖K2++["3xr5tȒX zـQ+R=(-8 ں N|A, .R.oB(TЮ9.U\t'P pQP8g`q0ӯvȈ+hL'^;<(Y@0zHӥ s4,w11 : k"3I%+GtGp.tZ0oAd3Rnjܦ4J Ƶ@O(hD0R P;Iudt55`2_)h6ɥ&6pq0/qS#J­J¿|2DZ4˳D˴T˵d˶t˷˸˹)2#p:-a^Ueefughijklmqb 0r ez bL1F0xev\~mz͚{mWWEX%؄ثʪ/L+S+(5ׄ"ziXCDtLD,-hV׎Y Yf腚 v`5{٘5ZXff(= I2/Xa&أ٠׭iXkD1bfXtڮe[Z5;1Geqၵm۾M5%HڞՅ*V-ZuoiX4Σ˴p\ȭoYW]5#`;Hυ]P< 2%5Eէ",!aQ%5͇(֠(︨H#hkT K(f8VCj߿_BʩJ_e+9yɭj?|PU˥j[+No)dبC9Cp`ɐ`@HpZ&x@(U*&Hcz9VKŠHJƂvA pYDghGtè  dxar'K:+ٓ -+ᴜa.A՛`pAPc"Nxt1ig(oJ 0;沽-f. 1ad8Xc !_9P9VOJHƣڈd`0 CFdm,dactdheH^8==2QV.f1x1>o2yLf0x e9ހzɈ=ګ=涜)24)Xܺȅu.VdX. k9pIg(Rs>Bp>K?4>DS4Fg8Dث"f Ih蕸gjkFSЄs\JVX5Ѱ5M:5hLV }VPBf88%z9citAиL X毐ʡ0h08ԯ뺶#U_%JiJlMnlAǖȎ^4ǣYP>CV?%<Ź-r%m"Ӑ: ;NӉTnm'!2"%7B#Nm #` ^7"b 2%&$ @lq&Ź% l6"5]. nRmCJmҁ9FmpvY3\rWiIR՞l_]Sp 'q/(qgu s$0q%//Bp;0VSW2θch!y#Yh8XTd;ɄrrπB)\*D-"]3*3(r³0+6/ 51k sր3/? 5_Oh`-cEgtGtа 2f^(U>Epb0d84ث 6ϠN+ZPa_``CMZ+uucON]g`w8/RC'Wc08vvfиxtweLHa^PwhAmU/g٢-­P-rN`QtJ *:+4xς?x2-+TY\xH+;l':pZ .gyPt:.;pRwWpÃ/ֲa/?. ͮ(x;,.nYBoz4zڂ Z'ER+C ;g@h{x7wG*y+?0~wFs/N^fH: /xp||E~&i̙  TŌa0d4Ő*g"p@gJ̇BWT0Ċ%"ID)?`i(ҤJ2m)ԨRRj*֬Zr+ذbb \E)2_ _-SlBR+Ly9 3F JROH*,28!},@嬁@]'JB˘h `3,}:tE8ʗ3o9ҧS4Na)nx;\ G8ӣw ` 9[IW8&gN1C42dŒH 3ȑ3rԈ33 T h _F$#+("!aA 9$Ey$I*U% 5 Q2L/s%34Taޖa2#~3h$`q3XȄX !]K(L gG=@{B th6:ЄH$**v3z,tPIB[S0PүN5.T +%B@"+z-;., $WL3ՖL{//pKȜW)8L+0 ;0WñWUk1{1!<2%|2)2-21<35|393( @A =4EQ?#mF;4QctQ4KJk4+U\`TL}-5ic Q[o @}Ik7;m5}{/xRy{8UN;8k>\w^9wNxߣm:s#9?Br{ܨ>;ַ;;~^8떇~'nzz#z|[<{oڇ~cWƣ|3.ï??4.z+]7?ҥr )[H=rt;m/ 2aX7B-Ka7;"PÞbp"ZH; r^|XCQG*zjb-F, "qUQ:bHCR|$"IR҃] H@>ωٓd#7(G-#!y6PV|XhFя>*nr%095豌<&2L|&4̔2ּ&6mr&8)q<':өu [Bq!Z wl3'|$)$xd/VrրRNP7@W>9J= H qESҜuGѤ,3 @`%3WBr#/\{fg |cB2xX6K$"X%HA"4SC*E Q8/g(^N1 jzb]`ֱLf;(1@H ca:R|eX2T/d I"(D>Q 457]"A#BVԟž7HWO52.B6ɡ(F tbxfR|”D)7IN>9ʃP*+ef pd}RQ^>@ t(Az3N:ԣ.SV:ֳs^:.f?;Ӯn;.ӽv;~;/?<3<#/S<3s$F!Qh=8FgL&~SZ3?Z3.PSߋJ3&1sH/ ӏǟ!@``.N@!,W;bubbletea-0.27.0/examples/paginator/000077500000000000000000000000001465647402200173415ustar00rootroot00000000000000bubbletea-0.27.0/examples/paginator/README.md000066400000000000000000000000671465647402200206230ustar00rootroot00000000000000# Paginator bubbletea-0.27.0/examples/paginator/main.go000066400000000000000000000031501465647402200206130ustar00rootroot00000000000000package main // A simple program demonstrating the paginator component from the Bubbles // component library. import ( "fmt" "log" "strings" "github.com/charmbracelet/bubbles/paginator" "github.com/charmbracelet/lipgloss" tea "github.com/charmbracelet/bubbletea" ) func newModel() model { var items []string for i := 1; i < 101; i++ { text := fmt.Sprintf("Item %d", i) items = append(items, text) } p := paginator.New() p.Type = paginator.Dots p.PerPage = 10 p.ActiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "235", Dark: "252"}).Render("•") p.InactiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "250", Dark: "238"}).Render("•") p.SetTotalPages(len(items)) return model{ paginator: p, items: items, } } type model struct { items []string paginator paginator.Model } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "q", "esc", "ctrl+c": return m, tea.Quit } } m.paginator, cmd = m.paginator.Update(msg) return m, cmd } func (m model) View() string { var b strings.Builder b.WriteString("\n Paginator Example\n\n") start, end := m.paginator.GetSliceBounds(len(m.items)) for _, item := range m.items[start:end] { b.WriteString(" • " + item + "\n\n") } b.WriteString(" " + m.paginator.View()) b.WriteString("\n\n h/l ←/→ page • q: quit\n") return b.String() } func main() { p := tea.NewProgram(newModel()) if _, err := p.Run(); err != nil { log.Fatal(err) } } bubbletea-0.27.0/examples/paginator/paginator.gif000066400000000000000000000777141465647402200220340ustar00rootroot00000000000000GIF89aX '/1 !!!"!;"""###$$$%$B&&&'''('K((()))***,*W,,,---...///00011122231l33342o44464u666888999:8:::;;;<<<===>>>???AAAB?BBBC@CCCDDDEEEFFFHEHEHHHIIIJJJKKKMJMMMNNNOOOPPPQMQQQSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaadddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvyyyzzz|||}}}~~~! NETSCAPE2.0!,X '/1 !!!"!;"""###$$$%$B&&&'''('K((()))***,*W,,,---...///00011122231l33342o44464u666888999:8:::;;;<<<===>>>???AAAB?BBBC@CCCDDDEEEFFFHEHEHHHIIIJJJKKKMJMMMNNNOOOPPPQMQQQSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaadddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)*cVR喩a%` Wi晗%l٘ĸ)眅Ixٙ矀nE4E/ J裐F5@ RBE(ìѨ**S  0L \d*CE$0⩣+lM@E (t0% 0:Ժ0D@0QɫV+"PC /JT &@P08eK+L)[dkZ G,EOlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKڼͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw,!,W!,@7 'HP  P2-j$!$P!à !,W!,H0d( DP@HVBP8P/)dh"ā*0pWE L̓SpT,1Гd)(228U*ŀ!,W!,P0o( DP@HL%b _L(`X/4mH$$9If2,F`I:գ̰*A# 5l*Ikr!ÖSnAkK!,W!,W!,W!,X0k( DP@HL%bĨ`L(@&d( @HQ^| kAd>Jɐ@0@!4 ݸgذNKk Pʆ:ܘb@!,W!,`0y( DP@HL%bKa^HQU[B [Ca-\Xْ!`wxdX H (#hn9l+ 205 Xx&&X)!,W!,h0`( DP@HL`_R8ɌFPH < C z9L"7ބU  װ.U)qdHMu:!,W!,p0_( DP@HL%bם^ M(`2{H$ڰ$9̈@[tf2,iSN k̹qXԸF$2 !,W!,x0k( DP@HL%bĨ`L(@&d( @HQ^| kAd>Jɐ@0@!4 ݸgذNKk Pʆ:ܘb@!,W!,W!,W!,0i( DP@HL|ѳ@:BKذ_\ZHdX c+ ml( Ыd9@05lX<*P0D^!,W!,W!,W!,0m( DP@HL%bƬaL(-H1ð+ya Qư?I°%q!*ki!qad8Ω 5RU+Ā!,W!,0_( DP@HL%bTE~Jخ(k3( $C8Z$)sװ&uQ#NOb !,W!,00p$H*\ȰaC#BtHŋ JǏ7FII"'\ɲbJ-cDrM5odsO= tQE*UtS)J=tӪVbjt+W/+TdJE;VSe.KL\v{t/ߡ~ ,x'7#xqƎYB|r2咖/̬c@!,W!,0BH*\ȰÇ!,W!,AXHA ~M:ȰÇ#JdX&N!3jl0a l8H_l(ˣ<+#"P̛)FJҸ@$G,VM7}i@2Ka^H 0{@ZKذ_1뮘 %lCY JnHgXk/a} :%X0]`J**d5l U[B [#PY{g زi lR-$H2Eka:(k,15?Aa,4{vm}&jR-z4l iD@)à!hq0L \A70KF8q A s@'4QKh@"L A(!}/]D ~tOq$rƁi ,l 4/r!\. ԡp;`K|)8 , ' ĉU7&fЄ$! dĒ sI@)09 VP/}P˜G S@k~曜:*)BK "~.AI+:: @ df9AH(FT,BFjncFق k E"s ¸P6(~P0UM!a0l gh4|k g+L ?TDHĂ|0C<`6ֱ,kHRDQ Я#K $lcH5D7nL"F:򑐌$'IJZ̤&7Nz (GIRLL`#M# T a8B#>0H]"2fOJcHd=@Dω@,X ȇ>D#tyiCV$Id qÇS!|&EHJ=Do2 O$xSbE/Kb4 <&+ a0P @8 MlG4( ICPTJժZXͪVծz` XJֲhM+UL4҂.>K|CTpLL 4 z,s_I@4` @d.9ʩAtv!%*zRDsg ӨQ/ Vqg„CS.bD >HIdAyādt m ASB"0KelitRa,V.֝wPdž.Dj5ZLN;'L [ΰq^R5x .LJW^*,p"kٹV43>D`6ObpRpŠ97Ά@Zhyx*q'>Y:$r,P''~0[2@0eENt% +ݎ VN]rw3f Zأ{}Ǡꑾ.bQJĿGMRԨNWVհgMZ+؞jLdLщr 5ɭ"SLOƊ4&4rݔe'(NSȝC acUlrj*eRمdq*,BŃy+Hw> q1jCVK,>o#Vj6 %DavG`!_0" x"Am@ЇNHOҗ;u"ыaLֶg6C.-=쏽 S )0rQ 50yܭOxg:[@C$e|YP7q4dR4Yn ,4x@LQcQ )iwQ:荇Чw/H1 rKef; Mܐ1N[Ͼ{O~G8A I`U5E2 H˞X36"b 3HpZ>mfwDYq ngZ'v6x+Tx\ YG&Cff@qgWGzϥGY0 &Rg&qUhi1 ηIS&_|<hitsPR8TXVxXZ\؅^* @rv [ ! NIgb C0 l3X7vcgGciX i u@YwܦY xXE恂Dxee A2 ԁy8Pg7ÀPWUp)H+pP`u@ Uwq'^h)PE rCe5x,hzs8Y8R8{Rqh 0—h6WE8}Xfyhjlٖnpr)=0`t~=!0##Ԇ–>> Pr@ y䐈~ a@@2 Q4> d8dAYuA6Ճ Z+9eȉ1dM0 X p @ؚ8yw 1D3( @CiEy#8;5 Ms&>]Ww FmF0 ptHA7_FGz}Ija5ٟ:Zkp38#Ѡ Z:!ڡbYPqH ;d !`3QF @TV$K` QmѭAp*CeKlQÐ< 0:GE pS QQ2^b3YV 0 wqz;&eqIvy f2@z- q0):" px#i TYa 0 p]oN .ő "- xHnGc+!g7pB O"7Cr!&,O xC Q 1⚑25S `.z S !`u{HK Cz2&e2h2f ^9&k*; ;Pk0 ,+Ƃ!r*2uyh Qkd@9ޛp" E^!;zP ;*4P1`6 [u ۳3100.& 00X+%Dzq` .wpB.ҿqR@+e5à Ao31|@q5152-&f12 Q` N,`@ pBd#a d%`~876l6Mu N0Ap<:81ǃ99S900}8!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,A}GpH*TXGX#J@¬`:U`)RACVapF` H IFέ`ÊKٳhӪ]˶۷pʝKݻx˗B)ZtǶ#KL˘mkږOlpҦOjV])]ͺװc˞M۸smb(:V2ηl)NVz5ԼËOӫ_Ͼva$3n2[窭fkQǙukavyWE(Vhf|mDb-K̹ t=IQyTv ȝiA<@)D![ &}kgbc(֊n 8v`[)dih^Gd}KdAXs6=Wee`g͸` k&袌6裐צZoej9Y'Q9] ʥ`꫰*묓UZئl穞)jnYZug([aF+Ԓ\fN醖y5F(շRZ)uS7_vlwx 0(4ֈUѧsuu_ ٶbbhPF)8_la~?u#'~X^oTp镕1gH*a7v+qWg8Skʩ袌6(D)s`Bblq! wZH܅dd1 ^8&*02J+v )`;D;@sb+m -`Cl+C*Xd ";C!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,q}pǰMH C-(a& ("8rBF$U<) 0+Oda2b irϟ@ JѣH*]ʴӧPD8LĆ#x1#ˎ,5N]9Q̚odnԻx˷߿{"kv X+SYo/yagCMij4R%/?3eO NCSW]V;m;ËOEsxDyI{[M:y*QJ:}*ȓ+_Μ Eh:nԫtwl2m HXa}3Xxd˟OIG_;biqZ]lSxVnp Rqevh\~i(݁Ŧ m 6Xnoqy@)$B "ӽuډtk-&8B58!ބ9Vސ`)yБ#WסH DB ST!zȞ!jWua&BqvW9BAގ詨*&2P0A"H\`HK 3*0H$(K +iT2/Oq1+i, '<&Rᢵ覫Wu ) ;;As+Őo P0 Kd0 dªX (@[PBH!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x|q Cr& NIf"F\2 @T4Bt1 $XWR2<(@CYxIa\xr.N'WJ JիXjʵׯ`ÊKٳhET+^9G 4ReԖ/cFy3N' :XQoy2u j崘3k̹ϠC}uնFkcTC*{2%U0JSgc@#,zOKVNУKN:YUQVz뎱W)nyyD-#7>ϿQ{uR%PuK o\c'dY ($XbQ E6Sy6A^}VU!q@hH&[ܱ)(_ޅ>W$BBАLlCA9\<5y6֩ap=|In6裐F< Ue θP(|h9RI꫰*kOf Ru 220y ,ɐ )"dr{ -Gb~X00pR51 (r( F3 #LbA݊0~K(Hô# {  ,2X0BA!&0`H1 Rs{jiKNm7bj-xnAbO;,eYzх{9-``)R:0l+)xFذ` LHέ`ÊKٳhӪ]˶۷pʝKݻxUDi1j6Ȓ'Ѯl2̚7 Т&5)Th^ͪWS^ͺװc˞M`;Q&i1K0ӴyΤ^6lQӊƪ5iËOӫ_O[wZހ&,\$g#w꫰*무)YU)ew~gnY6jVF+Vk *<)0Mt$0Z4qc" h0ccY1̾p3,H-28" 7GpbA0Bb́Ǯ $ V*̃@1La2.=; )/,CbmA !d " V@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Q|/qH hÇ0ċ{]  *acB<(@aV(>fΔkUK*[u'P R FqX"![ʵׯ`ÊKٳhӪ]˶۷pʝKݻx .d+E9zL;ɔj[&ε<}n=+QJ:M+ԫ/MӨS^ͺװc˞wھma(*)dE\M\tZkνËOv`$#x&?rI-gSU'% 6F(ޥzmavbYO&Bt~v (4h8[!`wo}}C5wҝEXf\v<2tD)XoCv]g܈1i_YfMiՋ`矀*蠄Y?$f&}G)$ՉO -Ye*ꨤj艩e9:Z1&ii-IM虧Y&6k .3Z8@(Vsu0\$VBrAbj2 &   ( )bU0p`0u0 kPCF,Wl6A!&A #$0@ cRr<*; )/҃@0мa*20A Bb!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,I|6qH @Ç #SÈ3 0+X.O 5|(┈L /\eH0 Is5s& JPsÊ*]ʴӧPJJիXjʵׯ`ÊKٳh |ubEZ9zLɵI^]:N :QI*^̸ǐ#KL˘3k+[n-v3Vz k`8Jt၉;ͻ Nȣz/Vxuu׾mc)pmNNӫ_Ͼ:|tN_zWfR% 6F(eEqTU`v؝!H,0(42UixuV?7"hY""b56PF)TV8bxTn[FW* Vp)tFeU9ne]>)TagGnwYxu6裐F*餔JeB_YQˢx%\)I  ~ 0ҁg0}x)(T >%#TQC pe0I1HV*VkfPbA0BV́˹ `U*˃@1ˮU/.=;KB@+CVmA !d "\U@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,A}GpH*T(‡#Jаċ%VtG?rɋ%O|r˂[\S̛8sɳϟ@ JѣH*]ʴӧPJJիXjzD6Z5l1 uIa@|SP6/<>HkU⩧t]x*5jp֩vJӨS^ͺװc˞M۸s[UZt 6 F5(3L N̹ 0.C-U Uk&-F $Ma0R)Va]S! hAxE@ nVhfv ($Z(@', |N5$,7h58T",6T!$ eE9 593d)H-28!SKhhlp)tZȊ30HRܢ SDIV %*F{.%0T^&ړ 4!eT T,iR sh #F"%o=e@ Xk&6F I/˧X 3|^"d~T!RBE@00[ ,ѐ, А)/00n  BE*Bkgw \RcN"`V$0p-T€`R:TY c~pH$@Ƞ"WmXg\w OmKYD8WpÔ0ѐ/uN(0wSd0A S` 3TTP/L  )>/ _ .n I0eAS\ cL-1  Ե0H4KCU /yLiP,"P{$pt:5wW HŸPPatN, O('"82aA> "n X R@pV A8̡w.8Nҁ Q.芁x`PTR%@ 1"ST= .> UT2E *[!j6 @{J@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,1HA*LxaÅ J$Qċ^FW Hp8ABq@ )?LtQ.:fhV 9 k0>PHb/`p$0+X' |5m"I>+נӺm1 !,W;bubbletea-0.27.0/examples/pipe/000077500000000000000000000000001465647402200163125ustar00rootroot00000000000000bubbletea-0.27.0/examples/pipe/README.md000066400000000000000000000000551465647402200175710ustar00rootroot00000000000000# Pipe bubbletea-0.27.0/examples/pipe/main.go000066400000000000000000000034331465647402200175700ustar00rootroot00000000000000package main // An example illustrating how to pipe in data to a Bubble Tea application. // More so, this serves as proof that Bubble Tea will automatically listen for // keystrokes when input is not a TTY, such as when data is piped or redirected // in. import ( "bufio" "fmt" "io" "os" "strings" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) func main() { stat, err := os.Stdin.Stat() if err != nil { panic(err) } if stat.Mode()&os.ModeNamedPipe == 0 && stat.Size() == 0 { fmt.Println("Try piping in some text.") os.Exit(1) } reader := bufio.NewReader(os.Stdin) var b strings.Builder for { r, _, err := reader.ReadRune() if err != nil && err == io.EOF { break } _, err = b.WriteRune(r) if err != nil { fmt.Println("Error getting input:", err) os.Exit(1) } } model := newModel(strings.TrimSpace(b.String())) if _, err := tea.NewProgram(model).Run(); err != nil { fmt.Println("Couldn't start program:", err) os.Exit(1) } } type model struct { userInput textinput.Model } func newModel(initialValue string) (m model) { i := textinput.New() i.Prompt = "" i.Cursor.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63")) i.Width = 48 i.SetValue(initialValue) i.CursorEnd() i.Focus() m.userInput = i return } func (m model) Init() tea.Cmd { return textinput.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if key, ok := msg.(tea.KeyMsg); ok { switch key.Type { case tea.KeyCtrlC, tea.KeyEscape, tea.KeyEnter: return m, tea.Quit } } var cmd tea.Cmd m.userInput, cmd = m.userInput.Update(msg) return m, cmd } func (m model) View() string { return fmt.Sprintf( "\nYou piped in: %s\n\nPress ^C to exit", m.userInput.View(), ) } bubbletea-0.27.0/examples/pipe/pipe.gif000066400000000000000000000415671465647402200177530ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^_____```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^_____```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:0檫Z1,ȶh,6ⲻ:+m: V+,r-݆Èkn䞫n.y~ pTA[E1)Q#L/u% Q Mt`$ µ3JRlu$10Lԃ©`( IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6rpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^w !,W!,m\ È-d@XFKஊZ0 @/4TpB %8),ϟ42I < X!TP0@V`A`%"V@BѷFʅ;(B!,W!,zP Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,Ā3dL`~8yO_|JR%aXƧMCSXAŘ4|ޔO1/qvf9 N|h砾)LQa. 8PE+>M`*`%?j2ǘ)Q&}4ܓ!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ,, *kyL$mδR 6֌ &^„"pS‚%aӨidؓt՜1!Jب m AWh9-hG{7@ϰt⥨w j=Q$-HG+E6Ωg皟9=ZG!,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,řT&LC g/^-PIR-ahSdAZW9 #lW*€0WQ\KVOm2MقRҭx 1.!)q\zX R`"mJC7Y1fJ۳eצe@!,W!,P hHః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"G,X+  &ɂ3kn90M8iTǛ2D:Ǣ@C1 prԪWyzĚInkQlX͖E;mTYI!,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"G ֢h*xA05WIϠ$qMDu*tiѦHA*]UkXI,դcUK֡L*5lըf5[pʽw/*hgSBi啗fֺog!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,ař,d%LXFά箢Z %)pOi_$TU9{^ HFحɶ/LEn*Mp)ӂŘ 3C0(y+s J1 h,QjR+ !Ra#NM쿷% !,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ,Z2Ɠ{ 9KL͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fEw.]ߙ ~ըVק&z,lq!,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ,Z2Ɠ{ 9KL͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fEw.]ߙ ~ըVק&z,lq!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,řT&LC g/^-PIR-ahSdAZW9 #lW*€0WQ\KVOm2MقRҭx 1.!)q\zX R`"mJC7Y1fJ۳eצe@!,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"G,X+  &ɂ3kn90M8iTǛ2D:Ǣ@C1 prԪWyzĚInkQlX͖E;mTYI!,W!,P hHః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,"P Hః&,p‡6Q"C-ĨPA= r+A.V00[*I|LWެqgN]tP}OF.tCURTzOF:XMv*۳k Tb %Jl(ʀ!,W!,0P hHః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,>P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aLL7=IRfO?yd(Ŝ6 vfc¢r4@\QJ]Rrd`"R;uVc[k͒ !,W!,LP Hః&,p‡6Q"C-ĨPA= ! +2Ff=*IJ!,؅ %jʆ 3S&;l}4Z009Ks" ؃FiO ᕩ@@b]:04kv+A\U [4 '2M$lĕ,%fX ,a(ȃf+ ZdiC !,W!,W!,W!,ZP Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.adAƕ P0av8\9,aVC%E0 QNAB Y9nƂ Z9jFe6֨'FaWl:q,0'TpT]v))aco|+P?aMDKUDIXəI!,W!,W!,W!,hP Hః&,p‡6Q"C-ĨPA= r Q^l$9$a8$YP@3AT`͂Ed)4˖n[Pg S  fA\jEaz%lFn;sXn酹KFjIk=-XhcJՅQ[^ʵѬKV&eӪ],۷p"t+]t{5/߿ L+w*CLbʘ3ϕg?zĥOz뻭_ˆ{o{o w|qŏ+?ugINLk{۽ ^:WG~z|]}?20f_V4`Bt` .``0a^!n`bH~&h_*by2(^6vcȣs>\BGdo!,W!,PpzH *\ȰÇ#JHŋ3j(ǁCIɓ(9~˗0cԸ̛8sifA@ ҧAH*](HPJTԫX@ׯ`r KlֱfӪMv۷9K7ܺxn߈| |00z #^'y ,̂P# #@AfL"8iX0N&0R.hDsBC.dqP+ز Y!g"$0(0t&F%?Y RF " at/ŃD%BȦ:G9‰L8F ]<DAIQπMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָu|,1\TTb˂e"aJm"342 +!C}<*Vft4 CFS(+W$0 φbAI~ NPE؝; ك % C_7,v.!J#HDq<+K~lܠ\zs"|Y[Z B1!KQ/B!œ c/|!]~  |!TP `Zֹ :RR!?bČ,kɣ$h .!3baL ?A8b"vk.rE^!( RmF\%EzoC!ORo (]-.=p fK?R}yWL$sUCt]u{\B03LEU_!x'p0 R@@S[ A%$uEa@ "3N'4}@<[Z`ad|&Z@  R fC2$ 4bOQ( SXUQC%( 'HLAEDD a p-9ԃ(Gx,% ?t { 'x^ >EH42TvM q?u{ *KJɤ }"P#1 X( Aad mw})p,-Un AOqUֈ(1< v ׌uOA!M_5sѸ5|pb:#xcf5ĒaeS%oQSxS(LYq Q W ~_|" +~N*- UE= uH% X(yh-!' A !e^ͥX ѵ $"XӖ&QeZfpX ]]Ae إsz0|i|uLrB+b!bYmQ *Y;2-qf3j" p) yU8Zb4qeHdD yPcS"17c"a8aع!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Z %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,] H&,PC >|D^TQƅ?B )KG%O4IRʔ-?tsL5/޴sN=)jTC:R0a}DT@+a%̋X0eZpgƮA1U!,W!,W!,W!,h hH &,p‡6Q"C-ĨPA= R$Ƀ"GL$.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,v H &,p‡6Q"C-ĨPA= R$Ƀ"GL$.aLA5p.K%0a `8a:&@aZL| C 0KZI%Ga I H+FW {c3HX`T!l^{#`yBTX Hu@^G(PQ*G0@+GL=Ƥ\rjG2 !,W!,W!,W!, H &,p‡6Q"C-ĨPA= R$Ƀ"GL$.a,řT&LC g/^-PIR-ahSdAZW9 #lW*€0WQ\KVOm2MقRҭx 1.!)q\zX R`"mJC7Y1fJ۳eצe@!,W!, H &,p‡6Q"C-ĨPA= R$Ƀ"GL$.aA -W ]dvƨP$I.aC*GB])/cj"U!U[VءSUݴyS%Wt=L9[%_ɀ!,W!, H &,p‡6Q"C-ĨPA= R$Ƀ,Z2Ɠ{ 9KL͏8 y$á?JQIG.%(ǣMUցU^j#֨Nb9["[fEw.]ߙ ~ըVק&z,lq!,W!,W!,W!, H &,p‡6Q"C-ĨPA= R$Ƀ,Z3?Z$2L5e8`s]„3&G0JjN" 5"@NIL#,XtY-jHֺ$SA;rit7/DV.4NY oDRV]LQ vi*@B:dS@1ѥȫMc׷i !,W!, H &,p‡6Q"C-ĨPA= R$Ƀ"G,8֬+ & &ɂrhYЍ`;9\3(Ƃi3JL+#WԌu#A.xu]HJر%V0-ʂ łS/cESNޛ4gA pnƋ!?Qɓ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, %H*\ȰÇ#JHŋ3jȱcÀ!,W!,R H*\Ç#JHŋ3jȰ CII=\ɲ˗S2I͛eɳϛ:JhȠ*] ҄MJ @5ϧä:gU~ň؃bnT5Y\ };PpȶC woݧD,`G@jٰFŖLbkQ bubbletea-0.27.0/examples/progress-animated/main.go000066400000000000000000000037571465647402200222700ustar00rootroot00000000000000package main // A simple example that shows how to render an animated progress bar. In this // example we bump the progress by 25% every two seconds, animating our // progress bar to its new target state. // // It's also possible to render a progress bar in a more static fashion without // transitions. For details on that approach see the progress-static example. import ( "fmt" "os" "strings" "time" "github.com/charmbracelet/bubbles/progress" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) const ( padding = 2 maxWidth = 80 ) var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#626262")).Render func main() { m := model{ progress: progress.New(progress.WithDefaultGradient()), } if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Oh no!", err) os.Exit(1) } } type tickMsg time.Time type model struct { progress progress.Model } func (m model) Init() tea.Cmd { return tickCmd() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: return m, tea.Quit case tea.WindowSizeMsg: m.progress.Width = msg.Width - padding*2 - 4 if m.progress.Width > maxWidth { m.progress.Width = maxWidth } return m, nil case tickMsg: if m.progress.Percent() == 1.0 { return m, tea.Quit } // Note that you can also use progress.Model.SetPercent to set the // percentage value explicitly, too. cmd := m.progress.IncrPercent(0.25) return m, tea.Batch(tickCmd(), cmd) // FrameMsg is sent when the progress bar wants to animate itself case progress.FrameMsg: progressModel, cmd := m.progress.Update(msg) m.progress = progressModel.(progress.Model) return m, cmd default: return m, nil } } func (m model) View() string { pad := strings.Repeat(" ", padding) return "\n" + pad + m.progress.View() + "\n\n" + pad + helpStyle("Press any key to quit") } func tickCmd() tea.Cmd { return tea.Tick(time.Second*1, func(t time.Time) tea.Msg { return tickMsg(t) }) } bubbletea-0.27.0/examples/progress-animated/progress-animated.gif000066400000000000000000000674241465647402200251310ustar00rootroot00000000000000GIF89aX / ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+++,*W,+Y,,,---...///00011122231n33344455566677788897999:8:::;9;;;<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGGGHHHIIIJJJKHKKKLHMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYVYYYZVZZZ\\\]]]^V^^^___```aWaaaccceWeeehhhiWjjjkkklXlllmmmnnnoXqqqsXssstttvYvvvxxxyYyyyzzz|Y|||~~~Y Yぁ[㄄[㇇[㊊\㌌\叏\呑]唔]旗^暚^盛^瞞_砠_裣`覦`觧`骪a魭aꮮa걱a볳c뵵c뷷c칹d켼deeffgghhhiiiikkllmmnno! NETSCAPE2.0!,X / ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+++,*W,+Y,,,---...///00011122231n33344455566677788897999:8:::;9;;;<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGGGHHHIIIJJJKHKKKLHMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYVYYYZVZZZ\\\]]]^V^^^___```aWaaaccceWeeehhhiWjjjkkklXlllmmmnnnoXqqqsXssstttvYvvvxxxyYyyyzzz|Y|||~~~Y Yぁ[㄄[㇇[㊊\㌌\叏\呑]唔]旗^暚^盛^瞞_砠_裣`覦`觧`骪a魭aꮮa걱a볳c뵵c뷷c칹d켼deeffgghhhiiiikkllmmnnoH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~E pd[eE/"c;82- UT`+ sLRlu@1LDh @(<sp7%?0L;7-3Q/R/J\\7-c'}u]-\?waaJAxL=Lm8o,qR@||3ڇW.]`pE@(,MpKWkݛ/Ft=n:Fd"!.c/%<Τ=(ܧߛ tp3. D6~BA?ngL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6jpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָ!,W!,m\ N @*$aC xbŠ1>`ńիЇ.Dl* ŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA=  18Fg1=G*IJ,b^ %ʆcS&CD}4ZAKsboރkO!ᕩ@K]:=;kͦ'/A\+5 ,2eĕ,g/s쵳X6{(*f+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adBƕ#àL={Ԅ8\y7{C%IE!@cNABi %Y9n'"ZIjFe6֨,FaWlBq<+pTu֭i)ac}`\P?0MDKUDIXəI!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a("J-Ws^# -ճgP$:{ƸCD*GBC])*<cl"YUWU[ާSUݴyqgΜt=L9[%_ɀ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,Xř`@gODR;-PIR 9{t Sp$BP=qW9 co]/(=l]\K=kYmOق\ҭؤ'}Q:%):qGiz9 "z"mJP7Y1fJ۳eצe@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$hęg]!Gl$)O{xwl(HDxB 3M[@:(=_}JtO?6TPsW D9u i֘@xJ !4c1 u4p Ir|De&K0D칊LQ{ Q$,R{(UTU'fuc׏$eI2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,řp g1I ޼"9<LnPi' W . Viϳ-g90Yorg&(IO\%%))ZOy; eH5Ag`# iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adhƕ&{={8\P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,řp g1I ޼"9<LnPi' W . Viϳ-g90Yorg&(IO\%%))ZOy; eH5Ag`# iSR6l۵5}2 !,W!,LP H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H`‚+ &I3k^)0MWϞC^QNZZ T=r?9⼚V;oZd?5lUspu&]+9֭D@Tk 84俔,c֜I-!,W!,ZP H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,(ř0g;TδЮ红 %)"􄣒xeYU9{f ^ɶ-<F.4]p) ŘٛC,y+ S@ 9KQ ‰Y ]TkmR-8Qba#NM쿷% !,W!,W!,W!,hP H࿃&,p‡6Q"C-ĨPA= R$Ƀ3EJ$2L5e 8`sus4&G0KJN&vB@^Ic^Y-ֺteWCriu7/NQV4PY (@Ej]LQતi*@MdSp1ѥȫMc׷i !,W!,W!,W!,PP4@H*\ȰÇ#JHŋhȑ#Ə CIɓ ;܈˗0clr̛8syJ@ gGH*]ѨGPJԫX⬪Qׯ`Erٳ Ǣ]ڶp^}+]t{3/߿M L+Nu)C<1ˁ-cެW3q=V4`M^U5P]ÞT6@m޽U2ߵ}[8㽫[μysq:<ԩ_2tKzuw|ͫ/O/A(G``} ._aMHax^]^a}"r"H\&b"n.H[2Fc݈#j:HZ>!,W!,Pp~H *\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗ ͛8sɳϟ@ JT̙E*]ʴӧPJJQUjʵׯ`ÊzسhӪ]˶۷+˚KݻxR.M L~^̸ǐ#7L,@˘3k,2ϠCM:fҨS^ְc˞M;ڸs[ N7ȓ+m|Уn.ػRν=Oϫ_Ͼ}˷~{Ͽ'B`&`^.`Vh!Y~]b(W (Nh(ZTb,.(:x?B I$F$GJ:%E.IV)TZOf饘`bɤWrIacYiYv&m&z''}h"(BhR:)I㦜vW&j*:ꪨf꬯ZqƊ둺Қd+ [%;,*$:,J#zUiJj布뮺[._koK^zoツ+p' p lh;pC#l |j(7r+Gkl4sƜ6ˌs?,r7#;]@3ISMK-"w=wlvhvgplۋ;x-tu|7y0܄'nËS߈7>9eؘg_cO=޴3$+4$# Gc=uѴ^{շ_{ֲÎ.?<^<+GKWwO.5- =觟B3:vcHF8x dG2{5=ց}8; =4Nz6A2pz}b)a U8KY07d-iH]25 KbҖ64/f&ЌKPag@Ї8G04 {Lgi^ae~8`@E^ ]$!8: 5$ ȅ"jW4:8-ዄa=w/&hSY$zԃG zV2 wU7kz޲]{;^׽UML@S 50t2FwMb8|aqBˋZh[oΰj?QVħ51hWg\g ҷ߽ooc>{l_yG"#Kv2hL*(β_ b\.qOŰ%b6]>3 L:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{Ā! NEpff0](M?G3x(@x!877PH`'DE&PxB(n71%FxA4O8{<@BXot7D"Cσ@" иHRNQIٜvv B}Cjogy !w-"ɞ*wԗ. QfsQpN`g)Hfmɹ ѣꜢ%JpLp1֊9ej$Ɂ pvisx_src`s]toAטQ{OЅu~HXp׆N fZ Nv^ښ wVN S~WMpD8c vqziyaP{Nx~UpX3zPQP{fPc@|ylSPzꭤ-Lم   Wh oPjpX9H\oC0z0 2z2*sؑǔ 0@@0Q@Dg1J˴!~ƳzAHkx=QSsmX .ѷ I{m-hN 9K+0wfд6aK!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l H *\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲˌc|I͛8sɳϟ@ JRLH*]ʴӧPJhLXjʵׯ`ÞZPٳhӪ]˶ۅd Kݻxew޿ Lpվ[ +^̸l'L˘3 @d͠CMz1g3|sװc˞U@_'qn gG{zУKgc@/ٔs\_`ٗs-`:vϿi]~ht&(Vxv7 {vbȠE((ח0(s~ΨtPB9=!%VL~`Y Q2"X\Ȟp)vܗ&s&$f"j()蠄}}Ne*餔BQ=WznW騤tha*무Zʆ0)NXSq6I0"2z,a6vkN pBz{emZzqoQp] G,1gLa@!,W!,  H&$İC"JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜ ́ s"|ȳ!͟@ JѣH*]͛:uٴիXjʵׯڌs*OhӪ]˶۷p;-HVهq˷߿}O+^̸c.l˘3k9idɓUfعӨS (Ѫc˞M 3$h˶ N8٫E"Αޡνw< ݞ=Qx+"ڿ˟Oo"崡D}F(3qd(9P"Y1:gF,FSԳh=Hd+P$ `]hH֗Dc)L.)Q`(fb\veqaQcc9`Y})t& ʵWzÍ4IVuj~e$:P#8pZƉ覜v i!)s`p髰Ժ,gF r+,b4RE! ֘9T[kvymH9ѶDa0mYfbVăy$! Ϊszl}7 ydáyS+f lň.< <M?ETr&1F kW+ls2/D<,gΔDs ALG-|N'=X!,W!, (@8T`BJ)H yuRF#pϞ*ك108\T=R\) s4Q՛*0{e׮AFlwވ%Plõy:h!,W!,0  H *\ȰÇ#JHŋ3jȱǏ CIɓ(Sb,rʗ0cʜI͛8sc˖= JѣH*5ҧPJJիʵׯ`ÊŪسhӪ]˶mò.ʝKݻ1 ˷߿5È3իǐ#C$8,Ϡ"G_63ͺS;ĥ ͻ@\!ȓ+_~Q _ͼI aǏcO|d*mO]˟O/-fze'uiH@VF(Ri  != ("Oѕ(a߈,"IS,2</a:ɏHhic?%i:jB<ެc:P d KQgpQ*s!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,>  H &|İC"JHŋ3jȱǏ CIɓ(S\ɲ˗0cX@8>pϟ@ JѣH*MjfΜefGl\P驨E!H@NǑ*롚SMyџ H~(خ6K&eB0cO;6wr(, 9M!Q+vγ yw"LFiY gc!ܙ gf |]Ǘlɹ1,,,̗,8X@!,W!,h % H`&İC"J8ŋ1ȱcQ Cyɓ'\ɲ˗0cʜI͛8sɳϟ@ JѣHW\:PS6HUbƫ=j8kH`M&KٳhӪ]˶[L>}*UjժXnkذo LÈ tӺQR{u־]U̹ϠCN̸cJH9eGjF9۸s]i:kУKٻTqPɕ/?5 .:옶Gn ǗTϿRǞ{|ubxG^F(ᄃ NIBqG߂ $h>Y(!r!L+ Kn_ ؠ~((<bKY$!@Vi(%,ȥLVgcv8FݔY/=k4~J/b_~E#W?N!,W!, U H &ŰC"JHŋ3jȱǏ CIɓ(S\ɲɂ0*͆.sɳϟ@ Jb̘4i޼YӧPJJģ0\jӪׯ`ÊK%ւZr}X۷py`ښkq˷߿bʼ{0^+^̸` ո˘>VdʙCMZ( 7w\װ;P6Ϟ=yDTuR϶=MطУ g& َ]ËOm/xeZǫ'O>PM=q ah'cO#=X׀y!h^dq bI9 Y((כ|)hcx_W9#bU"W7idl?-Dă8QC.uX 엞 MԌfi晉Y*^xxhi[!Vt)^a#D4gR*Mm@CSS:D<=k,JnE6Qj-Ԧ&csV.!,W!, g H *\ȰÇ#JHŋ3jȱǏ CɁ$S\ɲ˗0cʜI8sɳϟ@mJѣH*%)ҧPJJueSUjʵ+ҫ(KY`]˶ۭigKݗ({߿0@=ol[hJ1cȘ3k`u^`u˛S^a Sw:-۸s,`b'3Z%w}ON:A ؾ={ [O>X6k~e@6Mh](h<T 6wv9Tqw (F!S e4ĝi|Ǎ2.qW< sB/m dbLViF7nWveF\~)%HhBflzfp2ft!,W!,H BPF &hn`i` 3pC\R0P&P@uxitJ P@$e)gD{5:pF21b`qhO]/ ̀M@D[f,8c=xN:8USEʞ1; iwN{Ȏq g {Ap=SS.F5i0XMxΰ=Y͑Fd` tQ*=F4 p|A!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, k H`&ŰC"J8Qŋ1ȱǏ CIɓ(S\ɲ˗0cʜIfDgC@%fzѣH*]ʴӧP9ĹsOA%ׯ`ÊKVԛUu^֡eʝKݮg Ua[o3Lu˳ϿBEL˘U*ǐIӨng^#۸:kرg M&xwlѳKN0eؓF歝^_;C GOcA6}&H Zs=wvx"cf~!y"ucO# 6rb):h/)dna= bI9U_i啗Ǒ6F֔mUh%S9P^^|C``#&S'wd}6WhObVEfVf>5Y*t$:(Ux"ƚ.TS*G9Ǫjj૲+,Ix8ev%ʗT;`2 5C A[Ֆ+Q;x|g'|rJs" Y L*Ġ:[ZK{Zis,rc#d@!,W!,V  H`&dưC"J81ŋ1ȱǏ CIɓ(S\ɲ˗0cY@8>ِO^IѣH*]M9sPMjʵׯ,֌sΪ>˶۷p~[BRTQ߿ >Iנ]x{wǐ#KZ჉/~ϠC6YYe̙mװcK.]tԪW&ZH6՜[_μyG£l##qسkQqʝvq={7~ y'@Q Sh`O fb'r 7{mp}-4h׃zEH(v% KHr|'Xq!gb<؃N08d֎>F)eKL:ɣLm(c’7z#xM( !`#F%t LFdUP)5l<8spx9Bu}Ju})Γ(Go)㊀u)nj#Gl$Fzת%(b5nT%Ў=0+ f;<\r!arkY (ڶ+^M!p$cVcf:yQߔ%:^(AcGKJ6pbq%)ӵ2^-o QRXƘ ( Ѭ)}V IgNcu:HuZVmh!,W!,O  Hൃ&ưC"JHŋ3jȱǏ CIIST× OʜI͛8s꼨Re˖0aJѣHwLeЗIJJjΥ*|Ъׯ`zjPK1Ū]˶mI+D֭ݻx(w.]my ,u﴾&̸c*Fnۼ9"g8Lz0oḛc[dvm5 ͣ^yEn-ȋ¼JKf^P^smIPDr( n8G SԳD1}Zx5 G @=h$: \ hjĆduV0>!:"F0vKDie_@&!pE`N<*XAFyy`j- QM(嘏ai"7DdD`$&tZؓ jJDv^P'PPi`rZ|b)&۵qNW衘%dRRfDATp[n"V.rl))JĬsR>kѠN]촍Af azUꣷ+gjk뗺U@!,W!,%  H *\ȰÇ#JHŋ3ja;Iɓ(S R˗0cʜeA8sɳ͛= JTOE*]TѐMJ*@XjUi֯`>سh X{H\/ͦKZZjݿuޥd^Xq˘5ޅTXe3-<{VKkg_"ʥtшd/X[ĬK_=Gw?=;BMmYB`Spk/{Ÿn}T!y;o؇߀MW+BQ6Hw@(EJAV*xRaq"H&*H.2x6(R@!,W!,  H *\ȰÇ#JHŋ3jǁCIɓ(7~˗0c̸̛8sYfA@ zҧAH*](HPJTԫXr Nׯ`r K,QHҊfʽ̞]{~y[u߿);ĥ |^̘:{<HV Y徘CNhW ;~@Xy"uמ&[허]Y;Gb=וgE4;Su|y@!k^}y8bM})Ɯq{H p_~e] cJx+(!R57ൎ4A1Omdh  jD@S((cPh#U1ި#cL5(HAidF!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,   H&Ç#JHŋ3jȱǏ $B(S\ɲ˗ G4i͛8s)S$͒; Jhς?]ʴӍG &=իF Jׯ`Uj\سhV;YpZ0![r)y[@e*^RH=hg H#MZ+{FG-iM8DdO죴m @#`wwã`'0A v\&t"Ç v? #=\_٫wn]`u"L݂CLL{gB @=! u뵗|G}$d ~+R*vy\,.=xA% @T$l(Fn,VXG0 āJ>D \&>H[Md}س K=&4E=@0z%v"Ib-l.`=Y K`ʞ駘IJ7=X(& j&f)gdv* v "* ϡ}'2)d +fI,ڣ e:ha" h2lx5.=>޺$>d!,W!,n}  Hྃ&ǰC"J8ŋ3jȱǏ $‡(R\)˗0aidʔ,YɓL5KDseϣH;,TЇE)&Ju'ڒמVIb=u+~_ +p,ٲFTK$[}n+_&dw\P6=yX$pT\wqdc-L5vvd1XEs%T2/_mai#`Ϟ w#6[uztvSdy./poc/zXd:"{CH?w 8cLޤybO8hBqE֔lQq5c"&bQ*=ՄhQcM7#HxpeMq% iS~X44@rR ElVv$ԃQ;xScXGL180i_s=ߜ;P8}j":1'Bj2QjRaR@!,W!,E  H *\ȰÇ#|HE%^bƂCȓKDJ-c.| SM4o@@!M:90@=oy M)eڔuy!!K8_VX( rR)Ex=T2e܃ ȫW {(VLƞ #tb-)+{i֞;+Tʱk{Ψ:cͩg/ȝTP7s>(+{`,.y4X^xq yY%q9sМ{pݛO(R]ͯ-!,W!,(H DPo4Lj6 )Z/{ ')\ `$M#d={" pE 0pf͛9w`ݗl0 @g@ DΨS[ҘԬAsGvY? j в`^Zv ݂4 ̀ /nI Lu9CΟCWa)3޹ j{v۹v %{B @H 'siKEw "L׎{v`'@8h  "^]9XHhiam }@&9#KA%݌ܕC R* ᨣ=<6$$p|&y@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R> H*\Ç#JHŋ3jȱǏ C*Hɓ(S\H-cʜI͙/Cɳϟ2s2JѣHmӧP;.իV&ʵkW`հf{lڪh\nBk/WVU^M` v]˔1sԜ⃜U~&c|tFkcߕͶ ڌekm6nu-7n)|{ws16~BT@hoI?=O_N\y%v?]xGHQ^Нz!xh! Zz J߂er%ȠAE݆(\ XD ~$ߌh{=h#zc5 s1x8W0Ê.Nf!hFZX{a{@%&LYшBd9 eE/V}?g_Z'ɩkvg]"RJg0VߑZ2R3gZ(hB0``B$bGzNѥwD豈Zl+Hhh=☤~ilW B[j]S%v*fv[[^ZZcq}~%Z%1z)ãn05G p|&W*K`|oo~q$ر#t\tлڧf{RҐF{V5RWL ]_A\)vL7 0Td s_gTrmUt߭$!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/progress-download/000077500000000000000000000000001465647402200210265ustar00rootroot00000000000000bubbletea-0.27.0/examples/progress-download/README.md000066400000000000000000000020171465647402200223050ustar00rootroot00000000000000# Download Progress This example demonstrates how to download a file from a URL and show its progress with a [Progress Bubble][progress]. In this case we're getting download progress with an [`io.TeeReader`][tee] and sending progress `Msg`s to the `Program` with `Program.Send()`. ## How to Run Build the application with `go build .`, then run with a `--url` argument specifying the URL of the file to download. For example: ``` ./progress-download --url="https://download.blender.org/demo/color_vortex.blend" ``` Note that in this example a TUI will not be shown for URLs that do not respond with a ContentLength header. * * * This example originally came from [this discussion][discussion]. * * * The Charm logo Charm热爱开源 • Charm loves open source [progress]: https://github.com/charmbracelet/bubbles/ [tee]: https://pkg.go.dev/io#TeeReader [discussion]: https://github.com/charmbracelet/bubbles/discussions/127 bubbletea-0.27.0/examples/progress-download/main.go000066400000000000000000000042061465647402200223030ustar00rootroot00000000000000package main import ( "flag" "fmt" "io" "log" "net/http" "os" "path/filepath" "github.com/charmbracelet/bubbles/progress" tea "github.com/charmbracelet/bubbletea" ) var p *tea.Program type progressWriter struct { total int downloaded int file *os.File reader io.Reader onProgress func(float64) } func (pw *progressWriter) Start() { // TeeReader calls pw.Write() each time a new response is received _, err := io.Copy(pw.file, io.TeeReader(pw.reader, pw)) if err != nil { p.Send(progressErrMsg{err}) } } func (pw *progressWriter) Write(p []byte) (int, error) { pw.downloaded += len(p) if pw.total > 0 && pw.onProgress != nil { pw.onProgress(float64(pw.downloaded) / float64(pw.total)) } return len(p), nil } func getResponse(url string) (*http.Response, error) { resp, err := http.Get(url) // nolint:gosec if err != nil { log.Fatal(err) } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("receiving status of %d for url: %s", resp.StatusCode, url) } return resp, nil } func main() { url := flag.String("url", "", "url for the file to download") flag.Parse() if *url == "" { flag.Usage() os.Exit(1) } resp, err := getResponse(*url) if err != nil { fmt.Println("could not get response", err) os.Exit(1) } defer resp.Body.Close() // nolint:errcheck // Don't add TUI if the header doesn't include content size // it's impossible see progress without total if resp.ContentLength <= 0 { fmt.Println("can't parse content length, aborting download") os.Exit(1) } filename := filepath.Base(*url) file, err := os.Create(filename) if err != nil { fmt.Println("could not create file:", err) os.Exit(1) } defer file.Close() // nolint:errcheck pw := &progressWriter{ total: int(resp.ContentLength), file: file, reader: resp.Body, onProgress: func(ratio float64) { p.Send(progressMsg(ratio)) }, } m := model{ pw: pw, progress: progress.New(progress.WithDefaultGradient()), } // Start Bubble Tea p = tea.NewProgram(m) // Start the download go pw.Start() if _, err := p.Run(); err != nil { fmt.Println("error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/progress-download/tui.go000066400000000000000000000031621465647402200221600ustar00rootroot00000000000000package main import ( "strings" "time" "github.com/charmbracelet/bubbles/progress" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#626262")).Render const ( padding = 2 maxWidth = 80 ) type progressMsg float64 type progressErrMsg struct{ err error } func finalPause() tea.Cmd { return tea.Tick(time.Millisecond*750, func(_ time.Time) tea.Msg { return nil }) } type model struct { pw *progressWriter progress progress.Model err error } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: return m, tea.Quit case tea.WindowSizeMsg: m.progress.Width = msg.Width - padding*2 - 4 if m.progress.Width > maxWidth { m.progress.Width = maxWidth } return m, nil case progressErrMsg: m.err = msg.err return m, tea.Quit case progressMsg: var cmds []tea.Cmd if msg >= 1.0 { cmds = append(cmds, tea.Sequence(finalPause(), tea.Quit)) } cmds = append(cmds, m.progress.SetPercent(float64(msg))) return m, tea.Batch(cmds...) // FrameMsg is sent when the progress bar wants to animate itself case progress.FrameMsg: progressModel, cmd := m.progress.Update(msg) m.progress = progressModel.(progress.Model) return m, cmd default: return m, nil } } func (m model) View() string { if m.err != nil { return "Error downloading: " + m.err.Error() + "\n" } pad := strings.Repeat(" ", padding) return "\n" + pad + m.progress.View() + "\n\n" + pad + helpStyle("Press any key to quit") } bubbletea-0.27.0/examples/progress-static/000077500000000000000000000000001465647402200205065ustar00rootroot00000000000000bubbletea-0.27.0/examples/progress-static/README.md000066400000000000000000000001031465647402200217570ustar00rootroot00000000000000# Static Progress bubbletea-0.27.0/examples/progress-static/main.go000066400000000000000000000037761465647402200217760ustar00rootroot00000000000000package main // A simple example that shows how to render a progress bar in a "pure" // fashion. In this example we bump the progress by 25% every second, // maintaining the progress state on our top level model using the progress bar // model's ViewAs method only for rendering. // // The signature for ViewAs is: // // func (m Model) ViewAs(percent float64) string // // So it takes a float between 0 and 1, and renders the progress bar // accordingly. When using the progress bar in this "pure" fashion and there's // no need to call an Update method. // // The progress bar is also able to animate itself, however. For details see // the progress-animated example. import ( "fmt" "os" "strings" "time" "github.com/charmbracelet/bubbles/progress" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) const ( padding = 2 maxWidth = 80 ) var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#626262")).Render func main() { prog := progress.New(progress.WithScaledGradient("#FF7CCB", "#FDFF8C")) if _, err := tea.NewProgram(model{progress: prog}).Run(); err != nil { fmt.Println("Oh no!", err) os.Exit(1) } } type tickMsg time.Time type model struct { percent float64 progress progress.Model } func (m model) Init() tea.Cmd { return tickCmd() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: return m, tea.Quit case tea.WindowSizeMsg: m.progress.Width = msg.Width - padding*2 - 4 if m.progress.Width > maxWidth { m.progress.Width = maxWidth } return m, nil case tickMsg: m.percent += 0.25 if m.percent > 1.0 { m.percent = 1.0 return m, tea.Quit } return m, tickCmd() default: return m, nil } } func (m model) View() string { pad := strings.Repeat(" ", padding) return "\n" + pad + m.progress.ViewAs(m.percent) + "\n\n" + pad + helpStyle("Press any key to quit") } func tickCmd() tea.Cmd { return tea.Tick(time.Second, func(t time.Time) tea.Msg { return tickMsg(t) }) } bubbletea-0.27.0/examples/progress-static/progress-static.gif000066400000000000000000000635501465647402200243370ustar00rootroot00000000000000GIF89aX!/ ! 6!!!!!7"""###$#@$$$&&&'''((()))***+*V+++,,,---...///00011122231n33344455566677788897999:8:::;9<<<=:===>>>???@@@AAABBBCCCDDDEEEFCFFFGGGHHHIIIJJJKHKKKLHMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaadddhhhkkkmmmqqqssstttvvvyyy|||իת٨ڨۧݦߥ|³óųDzɱ˰̰ͯϮѭҭӫӬ! NETSCAPE2.0!,X!/ ! 6!!!!!7"""###$#@$$$&&&'''((()))***+*V+++,,,---...///00011122231n33344455566677788897999:8:::;9<<<=:===>>>???@@@AAABBBCCCDDDEEEFCFFFGGGHHHIIIJJJKHKKKLHMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaadddhhhkkkmmmqqqssstttvvvyyy|||իת٨ڨۧݦߥ|³óųDzɱ˰̰ͯϮѭҭӫӬH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~WEpt[U-J)l! YPPt0@E() wJ#KuCL0 KD0H `π@Ds| @2rttDHAU\#At&wq>GA{x2L*imnDa@uWnX`pE<(<p LWkݛ/Fx *4FqŸ.rH # R:7O@: /)2*"*,ܧ xp$, tFAiBA?ngL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6jpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָ!,W!,m\ N @*$aC xbŠ1>@ńT*P.$@K* 0ŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= ! .4Fg*8*IJ *U %"RʆRBS&C7<}4Z05Ks 6REhOTᕩ@:2]:*3k͂QuJA\'3- *2jĕ,0 dTX &Uu(f+ ZdiC !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adaƕ!P*U|8\Y&URDC%IE!@FNABIY9nU ZIOjFe6֨*F aWlT6׀q,*)pTQF)acuXP? MЪDKUDIXəI!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aI-W@T 퓓FR委P~$H(UD*GB\)ci"YUU[VSUݴy%e:TD1t=L9[%_ɀ!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,8ř\HBJ)=$g).1PIR'UlTӳ ShBNW9 jTA-P(*KY\KJUmLقWҭ' ~TmQ(#)*qG`zX( ҩT$mJP7Y1fJ۳eצe@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$xęސR8 $)pOUxvRh(H@xJ C$M[:( Df Izj%vO=rc.R+t!ڕzI\Q0}9 bꑋa 20Zcm2gli&!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$HE3萤g)<$a'R= %)0*T9B%STa"e IЍ38*U%3Jm$`96LvC R=) >zI\Q0}9 bꑋa 20Zcm2gli&!,W!,P sH࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=IҀ@ROBԙSRM->UTU'fuc׏$eI2 !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$HE3萤g)<$a'R= %)0*T9B%STa"e IЍ38*U%3Jm$`96LvC R=) >zI\Q0}9 bꑋa 20Zcm2gli&!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+Q &I3k^)0M֘2JCᨼ&UQNY T*O?9⼚V;oZd?5lUdput(]+(FZC@NSkC 84俔,c֜I-!,W!,"P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,řh0:JU.I S8H)H,R5jP`Ȣ W 2A ٔ iϳ-gJ"Bor(@IO\*'#6))`RSR: 2GHE% J`% iSR6l۵5}2 !,W!,0P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+Q &I3k^)0M֘2JCᨼ&UQNY T*O?9⼚V;oZd?5lUdput(]+(FZC@NSkC 84俔,c֜I-!,W!,>P H࿃&,p‡6Q"C-ĨPA= r Fdl$ U$Y:3A\ Ed)T˖>ZTP7 SS OfA\jEaz%lFn;sX>9J'FjIk=-Xhc!`*&Bj2ǘ)Q&}4ܓ!,W!,W!,W!,PP@H*\ȰÇ#JHņ2jܸǏ CIE(5\ɲ˗0+L͛8sFRϟ@QѣH$QӧPc2Uի' ʵWZ~Kjزh"=[lʝ2.ݻxN˷N~  xv+ƛx㷍KFye/k6[xg?>z韥Oz뗭_6{퐵o붘{{ ȑ_1̣W|\ԝ_0{rziW<ͫGo\zͳI` Hp[ `=lNZamh~Y"nFbd*X..cH`!,W!,Pp~H *\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗ ͛8sɳϟ@ JT̙E*]ʴӧPJJQUjʵׯ`ÊzسhӪ]˶۷+˚KݻxR.M L~^̸ǐ#7L,@˘3k,2ϠCM:fҨS^ְc˞M;ڸs[ N7ȓ+m|Уn.ػRν=Oϫ_Ͼ}˷~{Ͽ'B`&`^.`Vh!Y~]b(W (Nh(ZTb,.(y:x?B I$F$GJ:%E.IV)TZOf饘`bɤWrIacYiYv&m&z''}h"(BhR:)I㦜vW&j*:ꪨf꬯ZqƊ둺Қd+ [%;,*$:,J#zUiJj布뮺[._koK^zoツ+p' p lh;pC#l |j(7r+Gkl4sƜ6ˌs?,r7#;]@3ISMK-"w=wlvhvgplۋ;x-tu|7y0܄'nËS߈7>9eؘgJ*+D# Gc=uѴ^{շ_{ֲÎ.?<^<+GKWwO.510*觏B *hi0R@EB U!$\fQPp,5Xmq`/x8bЃ# MXB2 WB0r5 * Bq@ Tшy%&:17B@  U$ U0CIƧuf,cϸ6woL>:vcHF8x dG2{5)*F}8H)J  *Nz6A2`pa)a U8KY07d-iH]25 KbҖ64/f&ЌKH3G<8"4 ULgiGt~(зq D$!8: 5$ ȅ"jS UfN2*2ZUr`* Jְ&Y@"U"!P!U/MW(`D'zT"!uPE`UTu%E7YNVŬG *4g7{ВV EmEUkЗP3A8HbUaBHH6 '} pBR1%Aj[$H#J 5 bU3V.wUbwc5xk^׻Reoz8Ad* mpLຐ` Z`Dpl5Ԟ^-'l wÝhAv" ;(Ev;1k@qyLBNr 8;ڰLk'V?S]61k\/ZF H(pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζ5D@bm@r wxl YJ_`.pȾρ |a QA CM\.`Bͽ7([ YȐ(!h {(>S+A9D*Qz5n#$]B%oAPHlaYC$@gA_@gl A݄ $[8B X1{n~j?|@ Z@zt'DȻdu  F [P [<]7B>u^ ת N! º/A!  M ?Fa}?u)":P*}}}_']`8 zYwH@twb^n _xYЂfx'8W]p5̇ ny_{? V0`[: N61ZE ?)n0!_0SpFXGKlpMMT@s%n(` uMD  x{&( qv0~xTrD]t 1_0E !~"8!6IxHPEx|зp5nxx G' a66`@p~)Zn_ q׃.بG1r2n di g ъ1ˇp胫ƷR@0F AIK%ǃXjȆ#pL9Fy YXIn Q3a <2v.*_P[rBИ:z7 ! rnG<_4ZyRט]z]hY~)n1 aWn|'81vq^|ҹn9Ywqv g{`I0x$Xy PpT{o yoٝ8ljqvv =}Ijn) v+y$ϗ:a( _@soJ`$Hvg9Y qEVlHH Av٥_jy vm9xZpoHr]sPWno'Qw{KujHHoއJ`u !_AJpvY wHO}I?a]uk{{JpJxXywQppT`-zM{_Q]{1vgGiOF*WW񊭞-zF nzl٦W n8?~zЬ0z0ʊn䈑g *|PPHLKP>Dka!1Kx fyBKk X=Samm`T.qIAu{m(J91K)fp6브!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l  H &ưC"J8ŋ1ȱct Cɓ'\ɒ0cƔEMrܹϟ@ JhUH*U ӧPJJիXjʵׯ`ÊKٳhӪ]˶۷^ .‡xR+1ߋsI8$&[*^)1̛k3F3]9)ϠCMӨS^͚ܹv˗߿.ŎGL˚5wܺУKNuƮ;opÿo<r-'ϼϿUeWv uwx7y(z2w{<|Fշ ($h"D]`_ `ab2FcJaebfzvH&L69UtxP.xM28N6N:O>xKB)LF:p)眠A)SR)aiq %/I9铚CVj饘i1x2| [ J藆":(kJ鬴jpe@iy Ω֣(/J Vk֖)rI@G'Kg Ȧ(ξ *C*J#D ŠZ&,>v O*S0LAP>Lej oIooDmlqOyON+)"XNe`^Lfhn&hT=(P- #UU_Z){i=*~T @05_6c]6g7[F<8 B0$+:~>B'7 b $ N?΂φ=η"fx(<X݋t9ߝ['<|֧<94a=@E`Ђzfb-Gbقd"E0ain *USh09 xo;DᙏB;8>:P$K!< ]aS06ASDq=IT(p&AS}Q6X |8:2TC@ $,3R; X,"HHf0RYP q)!4*ri#4N MSo)o)Tie;JѓE"xK钗Z;h*ȅF|(#ĉ2MJӦQO6$>O>@WӞaG R3$UIR:K4B5M3` +!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,zq  H &|ưC"J8ŋ1^ȱcGm C٭ɓ'\ɒ帗0c4GMrܹϟ@JhQyH*UZӧOIJXfǵWŠ;ٳhZ˶m[]pʕ˫ݻw˗.Faë+^ؕǐ!L˘3k̹ϠCMӨS^ͺכ 6‡R-1sI<$&[*_)9̛k3F]=)N<֯軒]/6n㳝K?.v+?؀Efc% 6F(6mopWr-sEu]wvux7y楗{|W~ x PF)TViXZ(iyHǙͩӹh( I) :i Vj饘f)lZĥB^>&EbfDGf&JjĦLn'OrEQv.'TzVŧV~~(YE[΅(^Ũ`)cFf.ةAnV*pq&*s>tVW+vnw+yzöW,|Η},X-fw鷴{и+͹{ͺͻ;μ֛νξ[Ͽ,'| 7G,W{\wui $$?crD([F,rI0$K4dsN8P<#sS@K%UDsetXHZLt]P%_TfubX;wa+363e}vԬro3}ysC~щ/t?SW~ՙGee^'zڴ78myc{="|/W^sHF/H(@*R 1zN罵O|W}OǛ<8#T1P a$. M{eǺ|[և/~;\Gʻ\sH2R@6R2p* LB2( ll˞((l&Ϯ,m.Ӿ(0Zmg̤&7 8p+ 2H*#j0DYBAf$yBah,DCj4'fFPEDI2L$TV $SbUA'Pf#b uvB+Ph+b B/Pj3c ~2x ̐!`)F xD7qS9mYH\S;}H`S$=YIdSL Uxģ(PM1̀%1\~, )v"٩~1,$)ɆQ&gJֲ95$*CTЀ2@$` B xQ?Q-5]9C3_\;G3a=#KӬA4TA"(Gt,七r`R=kZ}">bf\i @`SAT$$l9$[2vUO%lTg5UVuWWelVUvuY_lX5iG L 9dT  ئ׶l-{uK'׷|.}K(׸B. SOxC ʢN& x|CeR<ؕ}R)<[ )]/ڻ)/;"*/.{JiP(82 &* x]_l^#V2a'!2\b+ )2F;Ba"0@\Sԁ6h*kn9\k~9`l +Î9d^6pɠB ]*CRȱ!pMFWV!Hg]Z)Jw^ŽUsA2H2@O'COTՄ3[:G04dO1Dˉ_]QeyVaVqy^X'ezfZ~!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,zq  Hಃ&dưC"J81ŋ1Jȱci CYɓ'\ɒe0cFMrܹϟ@JhqH*UZӧOIJjXf]ǵWŠ;ٳh[˶mypʕ[ݻw˗/Ga+^ǐ!˚LreZ3klϟoMtӨSźk׼b˞=ۗ۸qͻwoa NǍ)_ΜУGoEu믲k߾ËOӫ_ϾG_@>ߐxGr4ҁ!I-5Ltӄ5dNAeQԇIA%SU8V(bՊ]Xix[45׍qᥣ]}`@vؐ1fb%eLRٓ&gU9jXږlyod6ܙ!q͵tpBwݜqgv|矀g}' .蠃FH!^v"#h)"/(5ֈ#;裏AI$GM6 %SNiYf%_~)e&k馛qI'wv7h}w~h聑*8iBx鄙Zir釡8jxꊩjꍱ8ky됹k2J9lbyzl͒Ѫ9my<[P PQ;R(R2{S<TFTP \UZUd-Vn=x0`,Xؽ.a2pq7qRqwqqηq qqr7rSrwr%r޷r-rr5s~&99W7 qdBdFdtttu7uWuwuuuuuv7vWvwvvvvvw'8<P ` -XPX]= g.hp/qŗ/Gq0ˇq͗0q1r1Gr2ۇrݗ2r3s3dewPX 1 `ゃ碃JsxNxRxVxZx^yb3yfSyjsynyryvyzy~z3zSzszzzz؍Bhd G"Bb‹#C cÌ##'C+c/37ÍxB{a?Fawly|{)}8)x**+8+x,,-8-ٔSE3 W||(Bh€耭(Bh(B|9PR{T('))Xi)+)\)/)*`i*3*d*7)+hi+;+l+?),pi,C,t,G)-xi-K-}@Cxtttu&uFufuuڦuuuv&vFvfvvvvvwƚڹ3EpI|)q|iq|q }qI})rʉ}ir}Щr ~rI~)sۙҝ2RrҘ 3Ssә"&*3.S2s6:8-!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,zq  H&\ưC"J8ŋ1>ȱcGh C)ɓ'\ɒ%0cƴFMrܹϟ@jJhQnH*UڭӧOIJ*XfǵWŠ;ٳhњ[˶mspʕݻw˗/vGa+^ǐ!˛Lrez3k\ϟMӨSǺkb˞={۸qͻwX .g)_ΜyУGEu뷲k߾O|]ӫWϫ{ɟOƿ(c"X̂ 6ؠ1F(Thrʇ ",$h,0XЌ)d#BE ABRL"F:$AJZ̤&Nzr (cARrL*mV,wAZڲ̥.^r 0AbL2a̢Ќ2ɐjFF n* KIr>IP։v6RUɕzfZ ~z _J&栎Idv桢i&ʚ梶n6  sFJfIxV}fʟv V ꇆJ"6EHERT2ؔ*UiUS\%WNfE+҃:+]x>Ӈ;;x+>ԯ٤%8P*@*xOUwnG۔ōojܜ> wݤެ> ߴ> ľ%*:*̽+³eH*R>H" l^ˉt~ | + ޺RVRRR SVSSSTf.;*r|-R0 *br"egl!}߳}\}`}d~h4~lT~pt~t~x~|~~4Tt4TtԀ4a,r"` ,l+ m eÂ#Ccà $DdĄ#'+$/D3d7;?ąCGK$OD`c+|60hF) 뢇iÇmqu#yC}cÈ㈑#CcÉ㉱#CcţÊ#_C*2] W l;",.}7}~;'~G~?g~~C~~G~K'GOgSW['G_gcǀg瀼k'="s  φV϶,i6ق!9#Y%y')+ك-/193Y5y79;ل=?A9CYEyGIKمMOQ9SYt"hlv"l"G i.8/x/и//80x0ظ0081x11182x22283x33384x44485x55y.U Yloh @ *R+m`mkmهoqs9uYwyy{}و9Yyى9Yyي9" q| "C |"ySsEsgFsFtgGWtGtgHtHugIWuIugJuJvgKWvKvgLv3`Vf" *ҤE6x8'F:x'y@'GBgyDGFyH'HJyLHN'zP'IRgzTIVzX'JZz\J^'{`'Kbg{dKf{h'Lj{lL_ ۊ *By} "rЗ"mzx ڌ :Zzڍ:!Z#z%')ڎ+-/:1Z3z579ڏ;=?#o,lh$ , rz /ʛ *Jj˜ + K k˝ +Kk!#˞%' )[$0Z1Rw"9K\TʑX *\Jj`dʒh *lJjptʓx *|JjΪʔꔈ *aԷ;6=K/?/A/C 0EK0G0I0K 1MK1O1Q1S 2UK2W2Y2[ 3]K3_3a3c 4eK4g4i4k 5mK5o5q5s٣񪛽6+7k7ë77+8k8˫88+9k9ӫ99+:k:۫::+;k;;;+ bubbletea-0.27.0/examples/realtime/main.go000066400000000000000000000042101465647402200204270ustar00rootroot00000000000000package main // A simple example that shows how to send activity to Bubble Tea in real-time // through a channel. import ( "fmt" "math/rand" "os" "time" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" ) // A message used to indicate that activity has occurred. In the real world (for // example, chat) this would contain actual data. type responseMsg struct{} // Simulate a process that sends events at an irregular interval in real time. // In this case, we'll send events on the channel at a random interval between // 100 to 1000 milliseconds. As a command, Bubble Tea will run this // asynchronously. func listenForActivity(sub chan struct{}) tea.Cmd { return func() tea.Msg { for { time.Sleep(time.Millisecond * time.Duration(rand.Int63n(900)+100)) // nolint:gosec sub <- struct{}{} } } } // A command that waits for the activity on a channel. func waitForActivity(sub chan struct{}) tea.Cmd { return func() tea.Msg { return responseMsg(<-sub) } } type model struct { sub chan struct{} // where we'll receive activity notifications responses int // how many responses we've received spinner spinner.Model quitting bool } func (m model) Init() tea.Cmd { return tea.Batch( m.spinner.Tick, listenForActivity(m.sub), // generate activity waitForActivity(m.sub), // wait for activity ) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case tea.KeyMsg: m.quitting = true return m, tea.Quit case responseMsg: m.responses++ // record external activity return m, waitForActivity(m.sub) // wait for next event case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd default: return m, nil } } func (m model) View() string { s := fmt.Sprintf("\n %s Events received: %d\n\n Press any key to exit\n", m.spinner.View(), m.responses) if m.quitting { s += "\n" } return s } func main() { p := tea.NewProgram(model{ sub: make(chan struct{}), spinner: spinner.New(), }) if _, err := p.Run(); err != nil { fmt.Println("could not start program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/realtime/realtime.gif000066400000000000000000000514771465647402200214660ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:0檫Z1,ȶh,6ⲻ:+m: V+,r-݆Èkn䞫n.y~ 4ojS`HkpupTKA!HGs1 Q-<&.. %|< @SF"8`A7MCm"L0fĴ\+ ”,w6mQFA-+hݰ&"E-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP Hః&,p‡6Q"C-ĨPA= ! +2Ff0=*IJ!,؅ %jʆ 3S&C;l}4Z08Ks" ؃FiO ᕩ?b]:3kr+A\U [4 '2M$lĕ,%eX ,a(ȃf+ ZdiC !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aA -WX ]dvƨP$I.aC*GB])/cj"U!U[VءSUݴyS%Wt=L9[%_ɀ!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,ař,d%LXFά箢Z %)pOi_$TU9{^ 8Fحɶ/LEn*Mp)ӂŘ +C0(y+s J1 h,QjR+ !Ra#NM쿷% !,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,`řd%LX+I S8ID|k\ W . ' ™ iϳ-gN ,Jor p I \!f)`U_; RHu% `# p@iSR6l۵5}2 !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ,Z2Ɠ{ 9KL͏8 y$á?JQIG.%(ǣMUցU^j#֨N;["[fEw.]ߙ ~ըVק&z,lq!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"G$8`‚+6 &I3k^)0MLCi'XQNY T0[?9⼚V;oZgd?5lUepu`&]`.vC@~Sk 84䰔,c֜I-!,W!,P Hః&,p‡6Q"C-ĨPA= r Q^l$9$a8$YPL@3ATPg͂Ed)4˖n[Pg S  fA\jEaz%lFn;sXn酹KFjIk=-Xhc @E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+aSV]zש[ [_گmŽZ^ެ}[]⨍G|.a>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,Pp2~H *\ȰÇ#JHŋ3jȱb;Iɓ(Sdʗ0cʜISeˏ5sɳ'ʛ} JO*]ʴF!JJ)TUjݚj`ÊuٳhM˶صnʝ wݻCw޾+a+^01ǏClX2}-clW3m=mV4\M^MU5L]ÞMT6CAt2Bh&dvF|p%lgEzTpzbQA [ O&HH?-$ V"v aBHhƒL@='xtJNSAx!xCY1 ER\WԃlsC^!A; n!_P!I"]"Chv̑B CCv\F71!]$ )@+InJ _]aC `HI.w M1!y|UJ=E C撗Aj;->  IH%OK!V!lV'iB)?L!lquH`{1XT /8+g,a UQ)]f;YR=8R:d(q};a$`:])!Y<[Ѣ OL Cۅ"`b8chER G""fx!E þ.BXqx%8>0ңED/\`(jl&dm0+4 dܢDq+aTzuP)hcH~]qZBC BP d9!5dOxrBq_⬬`&p&grDJ`ƦT DI&`'dD8W8?Jg9ǤY;kDbžK2D<δ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{Ǎ*X',u)tV [#ĔcJbģ L0'霂3v8F7ɢҗdI 9HHt%^JjnC7F@\+Yg•r BU izZNVB(e)LiP0GD1:"1?&jZJWnx T=պUcHs* 0Ld-K!wը|n[ Jۻ =E v0) !AU/ }Cf9}-'P&GA2}Ay[E!nƥ嶿aC59E4' dc6hzQ'7V1PP~938( k? )vVPQ01z#p0!X =sCeԃ֓V =GxIx\9dtBiL|֧ ^+֋e,"3Q:hgwxg>P`4"Zte*~) p`^c5Qq!4: ڬq2sDz!,W!,^ G80A †B\pA /6QF 9ɑD4yA+~Ԙ$B31fa@!,W!,W!,W!,^be*\ȰÇ#JHŋ3j`07CIɓ('0Z)cʜIM+Ȫ%B IѣH` 7 ۔իX5@XЧPj!ٳh~WWM6Qת @ٶ ?sXeμ⺏#,KXسWma"aGϐ{tM{3L%lٷ_- m!/ gp`A /œqpA!,W!,` [|`%"„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0\À!,W!,`  @ +2 -az2!,5 pa HЎ0[='e(€=p9J<fp N.~%JآMvDVTX0.[ƋaGXU8.Ò\!,W!,W!,W!,^ G80A †B\pA /6QF 9ɑD4yA+~Ԙ$B31fa@!,W!,^be*\ȰÇ#JHŋ3j`07CIɓ('^`GX0cʜI&~ $B IѣH a%$lSҫXj8KX."L!]Vk7 `Ki˷_L `'aǐ-=8#  zC!%a@^8 ΕKC٬sNzcg ȓ\  㥼uPᰀ/a]TT*&A3١ (*""8 PAuT*WDC8/œQ r (^@!,W!,W!,W!,` [|`%"„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0\À!,W!,` @ +2*\ȰÇ#JHŋ3jȱcFǣɓ(S\ɲeA˛8ssbUU!HM:\ʴӧ8U &*fׯ`r -0 |He!A;lK ,űK?& b $P{p(/p(a0Ma Wja6J˞mY۱>0 ٵ+PL VJ!a`>&H`hJآӫXNF/0V 40"0߂ *TTh.,W/p`@%\1@B0,"8v'BW xpcD7dHaLnwdPdTb!,W!,W!,W!,^ G80A †B\pA /6QF 9ɑD4yA+~Ԙ$B31fa@!,W!,^ vbe&azb:{e8~'l-$U&Ȝ_ 6FVJ`ᆥ!,W!,`  @ +2 -az2!,5 pa HЎ0[='e(€=p9J<fp N.~%JآMvDVTX0.[ƋaGXU8.Ò\!,W!,W!,W!,^ G80A †B\pA /6QF 9ɑD4yA+~Ԙ$B31fa@!,W!,^be*\ȰÇ#JHŋ3j`07CIɓ('f0Z)cʜIM(L_h! 7*]ʴ;)%&ajʵk:@a8HDX0 ^ʝO*'`0!0o?^[UshQ0B~s-,#6# ݷ>% +:]ܱP"¬߁2t+M`T k V >1ZS y$W)h*= C[@4W$F "5]L @"\}!,W!,i ha"DL֜;(2"a#,` $ K bވ# W?P?@?)p0QJ)lj՟!L?*%l.% O.C 0RhL !,W!,` [|`%"„:D@Ç%bxqF.0O@J _)˚-iּSLm^ %0\À!,W!,`  @ +2 -az2!,5 pa HЎ0[='e(€=p9J<fp N.~%JآMvDVTX0.[ƋaGXU8.Ò\!,W!,^ G80A †B\pA /6QF 9ɑD4yA+~Ԙ$B31fa@!,W!,W!,W!,^ vbe&aV}pP M F)*6EK"aw˘Wr"!*a(̺k8 xae5_ >|1菳:xXa NiFH*4BU鳯_o񹓄 _q:} 0n JV@%X TR 4$QQ ! /!74рZ)[$D0(6i$Ȑ#Hp _ bGVId[oY‚|QTTZ`sܒ bubbletea-0.27.0/examples/result/main.go000066400000000000000000000030461465647402200201510ustar00rootroot00000000000000package main // A simple example that shows how to retrieve a value from a Bubble Tea // program after the Bubble Tea has exited. import ( "fmt" "os" "strings" tea "github.com/charmbracelet/bubbletea" ) var choices = []string{"Taro", "Coffee", "Lychee"} type model struct { cursor int choice string } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q", "esc": return m, tea.Quit case "enter": // Send the choice on the channel and exit. m.choice = choices[m.cursor] return m, tea.Quit case "down", "j": m.cursor++ if m.cursor >= len(choices) { m.cursor = 0 } case "up", "k": m.cursor-- if m.cursor < 0 { m.cursor = len(choices) - 1 } } } return m, nil } func (m model) View() string { s := strings.Builder{} s.WriteString("What kind of Bubble Tea would you like to order?\n\n") for i := 0; i < len(choices); i++ { if m.cursor == i { s.WriteString("(•) ") } else { s.WriteString("( ) ") } s.WriteString(choices[i]) s.WriteString("\n") } s.WriteString("\n(press q to quit)\n") return s.String() } func main() { p := tea.NewProgram(model{}) // Run returns the model as a tea.Model. m, err := p.Run() if err != nil { fmt.Println("Oh no:", err) os.Exit(1) } // Assert the final tea.Model to our local model and print the choice. if m, ok := m.(model); ok && m.choice != "" { fmt.Printf("\n---\nYou chose %s!\n", m.choice) } } bubbletea-0.27.0/examples/result/result.gif000066400000000000000000000457121465647402200207110ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:0檫Z1,ȶh,6ⲻ:+m: V+,r-݆Èkn䞫n.y~ 4ojS`HkpupTKA!HGs1 Q-<&.. %|< @SF"8`A7MCm"L0fĴ\+ ”,w6mQFA-+hݰ&"E-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP Hః&,p‡6Q"C-ĨPA= ! +2Ff0=*IJ!,؅ %jʆ 3S&C;l}4Z08Ks" ؃FiO ᕩ?b]:3kr+A\U [4 '2M$lĕ,%eX ,a(ȃf+ ZdiC !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.aA -WX ]dvƨP$I.aC*GB])/cj"U!U[VءSUݴyS%Wt=L9[%_ɀ!,W!,W!,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a,ař,d%LXFά箢Z %)pOi_$TU9{^ 8Fحɶ/LEn*Mp)ӂŘ +C0(y+s J1 h,QjR+ !Ra#NM쿷% !,W!,P Hః&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a$8Ņ3H%gB᫧-^=? %)p0`B%"E  IЍ3),X3JU-`96jӭѵFϽ}N0Q#|΍BNt:̮֯'31)~Ԃ@0`!LX0^Mf ҏV(YLGEҧw5 A" &=Ru)P~! ~ AEG& XD}  b4)"$ )%k10P>tVVC2Ȑ2ߙԊq0]0uHf8aM[Tdlh5,ad|1:0XTE0Y:'WjDfLyHtL q2@PA@#PC P(H2A~jQ9td5^$ ɢBJC>!/Q1AQ -l( *ܮ68{"*di"L&c 0v: /BB2d\"5\E 0-] .l2-0pD*麇<5s5A BJP}"6+;$Dݓ Yؽ4RFېβ0l# r. }P[uBmwC#$dU_"z E蓉5rk:DsЁκls9ֹ\~ -T[]A?OA b_@ u!98E $dbۚ0;f9`0Яe"GPH,zA`!'x*8`8!dlf+j NFāYI0babns>R,Z Ueew5䋓d0RqDLdpN5R"H-$a #B !G2gH8B`!h /bA %-RNf.v!"F(H!y|H٥R%/`6D A {!!^pd@B6adlH& jD% yd6]/BC]h pLbD@P 0K !C1K sQT dzaK%ňҖ4>+'ΙΊPa!=hBQMS"'@Ȉ qԃ,uF7%dț;㉐YCPT]B\ (BUah[fTya_;Xa2O ab؃0(Ma!!lB QB29b2XxZDB@袪d*{Ju! C3$!XGU6Mwbv!=&$mkc[ H5"OKD`.{ԃ!M$BR7-R\}s ]og( # q/z^Жe^q)`x!ԯ:s,d HQ>E 90P ;hge2&Vu(-@d#ir2"w C!* \\s|T@DNi7 $ηXZK # r-@*5λP]Iw !La-kq8εE̊4'DBd63ai`:`n2lN9},Z!FHtO K'~˜dl a #,Y`p2^Vȋ3b#m aIsCkHCw= Xh(20zia,i!jp!%"_CQW Q.B<~l\!xB(pU0=0O9;g#yBr.WdS3>'ZȨhH3~* 9;DagVY9qb O8W?nŜ## 1;W&Uw%NĀ|{g Uғ> [ON Mܜ'_>10aGh'Ez l{#$u 1ģV8=Ldo= σIk'~$ w|xANw` ztAqӂxeaV,k}d5Dx,k !ng-G<@?J,4HVa;awrJxLi]{#H2 1S Q1P0j 1 yV q4HF6z$ (IplQF}_q#,Y82xy_oׇ(np 1 QAN&`Y1+050'pBsp d>1*Y0sHGV  q q! -qg""a dHWnV Gy{d)+^pJ2^Ҏ8} yGcg( ܈ Q84"m!y ѐDvggg,( !@XiYӒ<)i 69Hzx0䃏E@P,{\r aaQ ǘ7 +@_ "XgrDW0 Fa TBG*'As @7P"xxᘐ)S) UyQQy` n }vSgd@5⅛"yD) | ~Y{eg/^ iY[yoqf|u !uT)d= aD A  Z&i mbl酬p F j |4zNw&F"BC[C05077E$ vm6) D5 E*$ \ ڠa:wbC CAp| ?92!A+Ԗ#:䱢,g9Qatj 5W Yga꠷;=z ZG*Kzo[j꡺ 2 nh*;F:@jA䱑!e0JxAw0p5p ! 6°UaL0xl57 5p QH#~ Q=i f { }"q JJXJzͪ0sGr $9T zKY䱫zJDyЇDЭ ]ڮ#R¯:zўR d *50+$ c{u+ *zg?DYs+ !6K=˒J q>` 1УH8A9>>-q;QH@tx^ "l{of +X &+}!dpQ{8pkۺjW"ۻT!G-;=q{[ kx;[K֛ڻ۽;[{蛾껾۾;[{ۿ<\| <\| "<$\&|(*,.02<4\6|8:<>@BCx;=q7 ̯KFKLGt !ey,%FnN\~XTxT(|զ cR!"ZF_ kc@6cϟ% l7PЕv o mك BB !2YՌwp mws'Иzf*$+QlD|g *=, 9`s& ^ ;QɨxQ  |( i g4$ lPzsmL-9B!ZeDK M )GTcZ*-+T2A * }U+kCƫF!P{_\a}؝ڽ=]};eg m, oq   AvP` j!$&ILȆ/05B2T:#>,#=# ĐF!}  " [E~5ĞJ0u* o މ,-[n.K.lw :s` b35cEq>t~C5"'], ip* _:Sv}"Pb |Y' ҭmݢ?_Mq/Ng_)(+,,!}l׏)|, :/&,  `_@@ DPB >1"aHDhG/lTX4CA0'`I@P0`6XA ~UըO@vDTRM>UTU^źYNoT#DŽT* XHX.|U-4O 2 8K_gEXbƍ?YrCLD9MPX q!KhVL.gE Nˇ@0ν@oa'G\r͝K.%lSW8MH5* VKN (a =?\~Ъ$y%0k*:A \!hz 敁, ;0OD1EWdMĩ**:hDc *Š CX"%%lE)J+dDÖ2aB;SHZ.N^#H'I%N9S9J=O?C R&\PP˽RMx'xG>ygy矇>z駧z>{{?|'|G?}g}߇?~秿~?`8@ЀD`@6Ё`%8A VЂ`5AvaE8BЄ'Da UlC(Tda gZD5p7Rd!.ohL3&иhGHxTd EDa+R@0Ex! aqfxAċ@Ep!P X`!@ƢHDLBB981Lȫ@qQ"0|aR|l Nr<`JZAz 7xP T27Hd:z|,I* C<#H.ý(HQ b'ALp9v8| #`` 3.ˆ^,KE b'ЈbCX, ;SIb #C.Jh0'@@4D̢7QT02U2'l04yFqXa3nx H+Y!Ђ6*@! !"l[jtW)B~SԵ!UڻL@0 H@[ĀӢe-DV  fscd>c-^j{ۗKS0{2:݀ԷMy/ D"H* &2-/R DinA@FTPY=b_{Q.+ ^VyѾ ۝EI G[q`X$щ!0K26D$&[D]I.K["HR ` 2be(;DA$N H@6lD\-Ϙ 5.ȍtI   pHRAPC dSr>Q DЄvt)2Z ݮ@b+wlfH&gݕJgE@9ॳ3B~a a-pk:׻_HD љ/<#Trɒ="lb{ #DIUZwњVi0'0{KxE6߷w#TYrC DfP#RAci4B.?4 :~vx3'ﻤοO?}>+` 'I@ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,` *n@"LhÇ#JTA3jȱǏ CIɓ(SD!'8  &0\ذɳME\D( E҆v Ebl,p:bRTEWK M0 -&!+ѼKE7S@y„#]ܢq- &2Al\4RELsfD! @n Q-ݨDrWT7E rf+gTtC\-Fp%AbW$-*Nm! /M0yRDg7H5݄?8Wq0J0d:E6C`$~KD*`U (ˆL1EhqG1D/B0EPH#+a}ٌ'Ÿ2P$^,nD5CE,<@p"ۚ"E#M$b["HXEa\q"z#I$؁D*`)ι@ H!bF(6"ȜȽ>ؖ0pD O0Hp>4Β@8IIE@#ZVAءEV1_"7zER "\D. Yn0P"#U%((aP=>1 >9t<9-K+ 1ěy@)#X SA>`|Q|L Q9 (䃉GAnH@$>rDPJԢHMRԏ PjTZTUUմlժ]EWֳue-YVmu[:b+^BuEv(QR`Aۄ䱐 X H@$,P@'(6IhE പ+kg֩hK`)]nNmn AKe\$v + c[]DA (,wKde zӫ)}Q+_зB/~b$ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,R6 H [ȰaÄ#BtHċTc=,ȓKZD)RJ].Q01eh΋6h%6teʔXFXi]T%!Nt@9c׮`ҪQג5$q DMv uoA@NȠ͂ZV,̗: "p1y$^T P(C y)@ vK C.@omL ӷmQt0*/abI0O`l/ bubbletea-0.27.0/examples/send-msg/main.go000066400000000000000000000052421465647402200203500ustar00rootroot00000000000000package main // A simple example that shows how to send messages to a Bubble Tea program // from outside the program using Program.Send(Msg). import ( "fmt" "math/rand" "os" "strings" "time" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("63")) helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Margin(1, 0) dotStyle = helpStyle.UnsetMargins() durationStyle = dotStyle appStyle = lipgloss.NewStyle().Margin(1, 2, 0, 2) ) type resultMsg struct { duration time.Duration food string } func (r resultMsg) String() string { if r.duration == 0 { return dotStyle.Render(strings.Repeat(".", 30)) } return fmt.Sprintf("🍔 Ate %s %s", r.food, durationStyle.Render(r.duration.String())) } type model struct { spinner spinner.Model results []resultMsg quitting bool } func newModel() model { const numLastResults = 5 s := spinner.New() s.Style = spinnerStyle return model{ spinner: s, results: make([]resultMsg, numLastResults), } } func (m model) Init() tea.Cmd { return m.spinner.Tick } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: m.quitting = true return m, tea.Quit case resultMsg: m.results = append(m.results[1:], msg) return m, nil case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd default: return m, nil } } func (m model) View() string { var s string if m.quitting { s += "That’s all for today!" } else { s += m.spinner.View() + " Eating food..." } s += "\n\n" for _, res := range m.results { s += res.String() + "\n" } if !m.quitting { s += helpStyle.Render("Press any key to exit") } if m.quitting { s += "\n" } return appStyle.Render(s) } func main() { p := tea.NewProgram(newModel()) // Simulate activity go func() { for { pause := time.Duration(rand.Int63n(899)+100) * time.Millisecond // nolint:gosec time.Sleep(pause) // Send the Bubble Tea program a message from outside the // tea.Program. This will block until it is ready to receive // messages. p.Send(resultMsg{food: randomFood(), duration: pause}) } }() if _, err := p.Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } func randomFood() string { food := []string{ "an apple", "a pear", "a gherkin", "a party gherkin", "a kohlrabi", "some spaghetti", "tacos", "a currywurst", "some curry", "a sandwich", "some peanut butter", "some cashews", "some ramen", } return food[rand.Intn(len(food))] // nolint:gosec } bubbletea-0.27.0/examples/send-msg/send-msg.gif000066400000000000000000002710231465647402200213030ustar00rootroot00000000000000GIF89aX !!:""""###$!&&&(((*)U***+++,,,---.../"0001112(2224>>?= @@@@A-AL#AQBACCCEEEFFFG?%GGGH HHHHT#IGJJJL;M2MMMOLPPPQ$RQTTTUUUUaW4WSXXXXj Xv YUZ+ZZZ[K7[7]L8]]]^9"^^___bI&bbbe>$eeeete}fI0g7gjjjlllqqqrI+uD!vvvwZ;wExxxyyyzY6zzz|||}eFO'Y#3O5[*i+FU)]/czT#E.f40i<0{5-P-.9'Q4Z0h2a:9k>;I:Nj9/*d11q?\:ŗ9r5ǽIh+v3:{1~?чHҫ;ԃ;֯OTI5L6U1ډJ/<ܓJܔUKHqb_fCAHGceMJo(7BKチEVtE2HKl?f@+3RHA5`_e_IHXipx{1U`kyziH[! NETSCAPE2.0!,X !!:""""###$!&&&(((*)U***+++,,,---.../"0001112(2224>>?= @@@@A-AL#AQBACCCEEEFFFG?%GGGH HHHHT#IGJJJL;M2MMMOLPPPQ$RQTTTUUUUaW4WSXXXXj Xv YUZ+ZZZ[K7[7]L8]]]^9"^^___bI&bbbe>$eeeete}fI0g7gjjjlllqqqrI+uD!vvvwZ;wExxxyyyzY6zzz|||}eFO'Y#3O5[*i+FU)]/czT#E.f40i<0{5-P-.9'Q4Z0h2a:9k>;I:Nj9/*d11q?\:ŗ9r5ǽIh+v3:{1~?чHҫ;ԃ;֯OTI5L6U1ډJ/<ܓJܔUKHqb_fCAHGceMJo(7BKチEVtE2HKl?f@+3RHA5`_e_IHXipx{1U`kyziH[H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y `R]+$IvEA#%@CA@ /H#,1t ӐNtzq!Q\B!x422w\ȉ лAC_ MӴ%pt<@@F 4`@[Ă/hRaZQ hR:kvt/{Z=ۆ7^GWgnw瞇袗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[XS@!,W!,zP H࿃&,p‡6Q"C-ĨPA= a'$Fgqկ8*IJk׃ %2ňN ʆm~(!_k,8f@ R(V)bQv~xv_^~HpʯZ6ꗟm;x_$d))n5b~呫wj?,xY"Qqq@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$Hă3=I 0窢(P)T@_(S JEW9 ғ8"贫.Q^HK=CmJm̥(kEmj*_2,nS ba)þp9(h-L9vSۯ= !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,Xař0׬@lXȧ YzjQTO/DdΞj*hL=ӪՕBɝQ[_S_[b.E|V\sժ BZS9z%`GqzkRF֫][d@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adƕvJh֯_r8\׮PFFgׯ _rA;DH`_RlKmܖD+"Խwc͈X ;9yI)_vZf!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ3E;D$2L5e 8  sX~͊3&G0JNvJAFIk痩-QЁl交˨`޵8X(S4e!jaBZةcy2ڃ1E\RU&[džk۳A!,W!,P sH࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=I@OBԙSRM->UTU'fuc׏$eI2 !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.ah5̮_ S+$(,HI Ye4 OE@_K`_A]nʥqM7ou15pR'^| qypי&A{thEk4=d@!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$Hă3=I 0窢(P)T@_(S JEW9 ғ8"贫.Q^HK=CmJm̥(kEmj*_2,nS ba)þp9(h-L9vSۯ= !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$@ęk8h9ЯEihGCA ѦDI 3@IdЁdŮkO=L'A?j@zA سkW "j*X=N)@ZJٌS )*R_\ lSLk h/Xns"棝@8,I(6ɀ!,W!,PP@H*\ȰÇ#>@E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+SV]zש[ [_گmŽZ^ެ}[]⨍G|.>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,Pp>H *\ȰÇ#JHŋ3jȱǏ Cr,Hrȓ(S\ɲ˗0cR,YR͛8sɳgG$} JѣH-ӧPJ=ԫXj:@`Ê+WhӪ]Ҭpʝ;-ݻx󪵫߿PLpN+^1ǐ#Ct,ǔ/k73ϠzMtѦSzD[ÞMڸs^ 7O|u?N}U_=5Oӫ_Ͼ˟ODP S2~@N|S #E͠elK?!F)\*$H"# ZDD䇃yS8h /(Ƃ58Q(6*yq - /~L=f pDa9$U8XM:إ_8LFDd ! CJgFDPx􀃆:= ~  ,O(, Ƒ*k e , 02P2 qȟ²: BR; ˪q\i^|,ؑb(.v PT."઼B  B6hK)FčH\{W58C mPoBREK`(#LѢ0Pp/M?5B0rυ$?Dh<|ɼPͮ"D8˵!!B$88CBP,PH. Dr-N`tED7K !P 0u23B5w)~ iABLPoA{bB9[DSChj :P#/{(Լ'/ _禷r9!{3DV%J BUKB>!a" % ?JiсD!)!HZʍOvwA27ʨe!<% (hbC .Bċ0 V6ݰ!;pPp"d ª!B*H;!KdHADOPd!rAmACHxb 5$&?1$A6=0AƃrR.Y %q"#TȷV9dAUvH0yvqGA3(Q!CO@K5DJlZ"UFT*BZ&ijK3!S`=GRiTCX!੪I.6E3:HTII=ӜHFo!,c3x_ӟUEH80TBDQrTy)u!yV-5Jq@CUp5-A !~[!X !uk\!uH`@ҋjCm(c]U)`#٘`JED_;KZ0 eJֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN`)"H2aT8u0C4+ 1BD 'p)b (ebQxc8;vHܐ!B#'EV򓙼'GM򕩬+gU򗹜/]Ɍ3eV|7a= sm=ЁFt|hF'ыt%hJG 4Io:!K{ԢFSU:ӊIC!6S(z!B[ZF}lf/[ ! mHƶlnW vŽmrw@=nvw;҂( ۴7R{?Ʀ=|_ ~p~ xp'\! G8/C㍭8'q7yQrxgN8Ϲw@ЇNHOҗ;PԧN[p!1ob%1gjz>#vnLg\]xx>; 3~ɐr<1W~͗sy7)5!=zK~=czҷG}Xjړ]_{a{Ge3_?˞#vnξ??~u_7??_~r-r/ rs#Ȁxrx+ (s#(1gH'X,X0284X6x8:<؃>@B8DXFxHJL؄NuwwvSvovnpwrDžtveW[veHR(TVt8vyxy'y~Hyhyyyyy|z׈W}˧jGg·ҧljj(Hh؊W6VFh膋Ƌ(G ȁ؁،ȌҨ)Hhۨȍ؂H蘎긎؎8Xx؏9YᑆZ[]Ȑ_acȆgHِɑ  r'هȒ蒆(%ɇ7iuh4'!@ BAHII9LiEGRٔP6'芲h_c)ZٕȖhHXӘʨw|{iH刘稘ɘi9Yyٙ9Yyٚ6q#9ن!)Iiɛ9"IYٛ=-/)1I3i5Ή>ɝ9Yy㙝޹!TyȞ螩(KiSiX)ks)\Igi aeɠJ[hږ(ї*١v!jxIi :Y+z-y4Z6z8:<ڣ>@B:DZFzHJLڤNPR:TZVzXZ\ڥ^V3sP(`&nC>o.K!fVYAf"7 %Ug2Q@+a]E5ff2;F!la&FfR aT $x"Z:'!*zOtOO gHijoNi9p&H0Lj&JV 1PCFH@.fJO+Zg(ZHp3fLz ; {ZfO̺LfLQO\RC0Zz&K33K:1a<˨> P 9f9v&OVp 1cg Q(T{} ʱƵ 1QbQp;84Sfh | `& c:KkBfBoc_k?{{Yׂ1p#;FЧ+˰Ck ;1 v8`&U{ A<0Z[ q[|KLFcQ ŴS&0k!DJc& ;?8GRk*Q;ç{{ZorjPo?(;Q%6ëwt`&SQpq/0`E{ Q %T;oVko|ڿ qQ+?|A *9"(*)W!Q,cwe\˴\fN Jo;Zage Lл  |7Qe|;gacQ! cΫ6pʨlmgƪʛkc9{,l:ʫOQ:ufbȜ̪dz%YL 0QI<H)ry\4oHT+9cӌĞQR-|Z e,Lp@!^V[ϼ|Ж кKj# Ǻ0-as{lKu!]kL{}߬@M1QvHp8к\gտρs, 1s+ f aXimok>%prVt9 -ܧQ=;pHm4cz0moO̪Ҵ~ -Zkͨ=hHв>0\\['p9gNgMQ`ƃߪk-ۼeJރjkngAkܝGIE~O!,W!,W!,W!,mR(PA Dp† B,pBT(1E:9ɑ5̸ckKL`Q3kfLvn;M:lҨSO=롬_˞$۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k8fI8@ 5Ps9Ԭ7Q@Ψζ̳5ӌM+_@@7;9ȓ8H#M,V4~QTr(Ӌ3cI36T / u 0ĵUAGC(ܐ ֿmB IQ[d.TM`6BG/@dOPkYȇaxCPF,P5$@,~ᅄa/@8$fM8Pp{HA@X1E'ʅB%D ; $D-',2aB†n9PHWDbyvb-WHC 6H̖> DŸBH2!H@Fm a@Ά0+$Z _be(^R@8Hp҆]0fl`DX1qɀWaDJ7)r2EK*"0bL1f2Cb.&lv!TD@PX pk欈 GlgE$H4- `6, 1HGDbJWH[bk/Rڔ2A+/әDPLk>%̽e v)恰dW~1bd0m#@w@PQ\0 $\r<~q 5j C@…QNwYX`(P.z 8\UVUY6WX2߾hskBya{ή/P-WS@-mjcrfx V}ˁ>c8,К\$H-W!w F` 6a(GO`&/p;9EPt4f"֓7AݧC/ aTo9t@BG|&hB0,P  &\ g3A<Tئk`"DBk9m`KZµ" 16էRşYOh!wfc?{&!dH2, T=!Z{ /nH QWX_!`pU`7pgp]p' 2`&PnUvl#AOFj7 ǷX#YY#BudHC#!KLK Fn $x&X#d#mu,x.8򶁿Pobփ;B A]aR؂"aiOy~zVb>`@06#pAg)Hsx@ @o@+@PEiP`0sv`Ea8 c Eo5 /` A4g ]3]AXc'ݖM'8g^5p vp|nPAVx8E}8BX$sx|F4!($Wjb"Cyu `6ՈY g ˠ `u` 00T AoDEM(NG'VMT>SNAd=qU F A "O#T> p5A`=}Yؓ_tAa`w딖TT>Z`E3q 7qW)3vH v3;p~BjQ Nqg@ `0 RpX;1O^6sMܘ c aLy8i_f1:{0QyfqѤx!倜B$b NT~B$N8f u8hTYbɈ!Y *j id!xɈR  p@P`Rpt O 99*`9>`A6p<?q fA pAp@hJg Ap0B`P@h,!,W!,mDq!@A?8AN( `! ',8v4 {0DiP f$5)@#@vUQحnmqȡL/΄S=GM8TSM2BJ4F93fCTa qCPp/GtвB|#d@t?|P ?4H@C E[B0$# YȇaxCPF,P 5$@,~ᅄa/P8$fEx BC2M/:p5Ĉ(]؁!%j8XY5b@!g~qdqOf[M?䨳HRԊ "gL)X+D2@E;"䩻T 嬄x/xA>"q e;`8JdQAB$6hԴhP@FQ\0k `3qb80na [rae-F.5!Ee Kxv"E*6dqnf6 9;~l!޵ ]d hpmƊa+JֹoBu0kvQ_wyBy+B`ErZmA- } >/ U5!~UY! x$ >(A>./Lq9S 0F ã]茠m; FW`ԩ qQp 6G\r<~r 5k Cl{ZN IYX(~2! xWU6X7Z=lso1lB b{+l/-_@mncs lxꄜ _@Z WL]8!dA(px%BUcw Qw(NP0#^Ca~& 7{fqE');9 %6zUX3F?~fTBLF@Tg|8B0&u/P  &\ g3A<Tl`"T­lX!8  l~} r66W=s=C/#}@/`}a7?W~! QBK{kT!gu4 n` }x (`pU`7pgp]p' 2`&Pn^lO֖s7 Է`Y Z !b2G8$ 5ą0=Ufh4N`7T]T>fyE30q ?q'q 4.E9xk??߳ y#p 00  0 cufW脎 m8F&O fS30D#pԩM׹ չD+E;0BbܹD߹khQsO. IHЂ Aq4HfpiU&bH}ؚy'R  @P0Rp$ XtO;.P6ЈEz>`L6=I!F_ʤiA pAp@t:Kg Ap>`اzڨ:a16E?H3g47eq6>7Yu 65%@o@`:999QC@TʨGW ŇA?ꃬQ ɨ][!4o`%&?l3R*(F-~ PQ>*9!0|xEAZ +qH#6v'bטl^?30X6jĺbC}mAƚ'>SfCQbGJ'x ꨜQ7-6P؉mS W G $j&~n^!6xnC*6?y6YFQ LJP|*!,W!,m fH I 6|Q@+*0QŎ9f {\ԘG*_N\Yq˚iBy3!Of|1#JHŋ3jȱǏ CIɓ'ڹs֭viPɳϟ@  Agֽ<7oi㸵RիXjʵc}kt޹uҍ&MZ,+ ʝ<9~$W_-&tƽ-.]oZDjՃ ˙h_:gDI';:T]|4ɓ'oa=fU~תZOh^B"AP:]R5.nU˖m)U)f_sЙ'G HiH<#hDdwZIvUhVȡL/΄S=$F8TSM2BJTԆs1@QsaT%eaWEP0@NIt YE<9ޏ(\$I>&m6P 4vH@Ekj8Q %DDG ֘N>cN

G @gC"&ɼ d1nmD%4 v@s@E]'[AK /Grt~\ź00$l.|xe'a>l!v>E o8$xbD"X d4k- Kw %Wȵɕ~, ! ErS d 2L"YpAB lB}_lw/l WUOYVkPn%Z@8<wq,|p:@@MXdNsl7\ & JAA T8V XHCa6T $D$ Y@ T NhS8Gx(J*BrclHo~g:5ρ迁vH2zmB@o`8@vvk 1;ڇ~@hsWIqio:4AZ ;͟X2JH!@?$4 :^Z!"Bt9 k*c;<ޫ)mZۓt7/ [>':%ȉ!T,Ib1obAZf~%p-3gXXm (-xx`Rk&y yW~Gop 00  g 6rysM>Zv-+xpO} M@+:#`}N4QXO+d,;P)mFIV+YXmikOMg8tƒTX0H`jtXX$I(/~'@~WAR  (PЃRp#  90s 9(`'8$>`6$vBƈ(ۘD fe`q\z %sRP؏apyyrx ِ9Yyّ "9$Y&y(*,ْ.0294Y6y8:yp|縓B `rB/D/38;_C9 I8%%1[<1F(FT9)je! 3 0QQdQ%#P7jdX@'uiSx| %,xt6pbIbC*gIM 0+7iSdf\Y&Qk6o1Aig&Vɏ*VuY9!*IhȁٝcCxYQA4Ai -{ 0aXXE$L  jDu_!x0O0\i hk6( ~#0#aX!sB *F 3Q$0\QYH`M'R1hB:DqQ&i۲$RJb 0 clڦnpr:tZvzxz|ڧ~:Zz* @ Ќ:'HvQ]$&h,v?VbZuDri.gaX-9v8 gl@@f ~)e(tXs8YyX%SǗb( HHbҖo򖆕]@hgzjgVjj! _vw|c%?9&b9'Jy*-!+hf0  [,EV3 lH 2**--{'))!)$G3Iv&'xG/i"S0 07&33ZF`FJ)MtV]E+KCH~R`x83:o0S33a'*4S3)GN A*89A9u99#Frbt#Nvr)>E>c.?EEs~ eH?p?*@-;;:Gepb ۰%p_?dA!4B%tB)t%] zTgo۸ttdGQmt#j L*DEExȖXwb$UbAV/7yld7JJ qsMEBm*{O~RvR[ɛGj Lg +Veip82||ɊeޛX*/"/O` LQ%gŁRj XmEX@'L]Rdk*G\=s%FXT^&k4V[[pۑX_soPYqY5p\Oed6ו]B Rn17߆e^ab\Š(#p(؛L<ၨcDY-P٢uq shy0|epҭj{XUW㪄*˄\KV-]op9@́%sC]98o+p}Mh8@8{]襠؋0a:h.AH&bS$a B$  )L ~HP!,W!,m fH I 6|Q@+*0QŎ9f {\ԘG*_N\Yq˚iBy3!O7d@4!+P 4H@CE }@G.p[c;D96Ă&K/h1, rq8#<=K SB(OD!,{H@CWE'~%ҷ ;o $D-'@~CR=m9xHAbyvb-巿 6h셁(`+{H$: H@Rh! ː0݅8D+\ _ hD0|ыVC  <PCڰ嫏$M Fm#p*H 3@UY 9hH<;CJ|hI 锔u”Oۅ_ja/B!?TʒR#.BB \yEi:!-[|(L` `|(Ā1C#IL'&"E(pЀD05Kv AD  OF/d8@, `@@V \BYPF/&^H` ]8E> 01HIOP2Ʉ ?}ZP/(!pYD9Vjb3 ( @2psTW(05`08F1Qc-N 9|N"UF$~K;B"0+j֪ |me@@0ېn$~;-g24 OR? d%~A V!~r_4@< ځA8ӁTUePO>@ *< " 6?"2;@dl 2,A \`l}zlVFA ئ@:_ [ .9?g}ЄR1!_bHtMw) ;,6NPP^@.t,1:DO> ނ)&1 җtG(0scvȘAl]Ӗ`2)8pY3?1 9\ؐ̕ECL~;PFH>PZw0|"W((:b8_—CDq!66ơ"Ӯ׬L` 4hb ,@MB0<Ãg8 x w})(D}hɼ>H"ov0_T $۩A/Pxi@^ y"ቜx: 9l,P~&!sQy Ht4~WG|᳾/`\A<8!p@&0A9ÌFt9i|Ձȶ ~ dOw3 O#;|!x x `aO#(iqGr&~7X8@  L3Rޥ 7eOv'1{Q{>@bl h|IHL(Ox(A0P 0tT@+EPXu\%~4Oc55 /P >g %S/4% PY2vw jxQ&wLJxwZH5 0Ձs  聿!8 d@SpX8>0K8wsu @?{E^ 2[QȌ3(w(|Ȇx ˠ `u` 0~gTA7AVJKJ'OReIT:SK >D4k'e鐻ؘx >>#UP G8  3T Ƒ' O\/J4'Զ/{Lٔ^Ԍ>n/;z)ȍ؍gpg@ `0 RpWU`83K%69UJЈOc )4f&w0bNyd A; >]@iXkpda$EP^fZ_)VyfӉǶ8a!@kIR  ` 699!vA 4pAp@2Gg ApП`p@z?;ZFzHJLڤNPR:TZV"aB)zv6AD/`yc1ٴ>祁L,oiQ-ZZnk@`6k55]5 MC@[ڧtQP:7tG;(MHnv6(!^xO0ZwNz`^hDޑL4δ /vt!9!z78](VtzQ͆ N㥍u^]t2CpAe_A5]T-f.$ _5?(~Z:s-Ӧ U iEvxW. ^L9-SqSF^QW Ez_gFdUQ-˳\mH`H2hۘf/3L_U(BY L] 0 k;t[v{xz|۷~ۧ @ ࠃ[Q-Rvܘ$Ew[/\(sHx(>>/0){y(&C5kdPdžho'WM4Ͷ23+5erӽcbZ5̦hB:-+< @w:::35M "Q 0Ov4_é3:PB@g0  AK4 l]$?B B`>3>A>%+ Hq;!CJC$P$EVEB;]$F \Ny6Zŝ) q7,\ b)&zHHt|2G({?H>OlhItca=AlLQL22tlM夫L[hkƻJ>ES7|S9EClgZ0ZЇp|y)VTTTP,oAPzlQ1P,~DOifiVmVq5WL]eHX[aaֈ/U~EaYYlYLhoW̸Z|za^le^_ٕu_$P!.` 649c- µЈDz(dR8, vlCQDO`1a fff{֕_ gr+$llj H(q?6mkiV\ xiԿE}/ N rS/l%tmmN6Wpy9HqqӜłKs!x*rvLG G= 4Z?+6=ZMt:Q2 $HyvgA xm>8ara@@Ƈ [#Jފ %cI)vPCiK01*lxS#PrϩV m6a;#9B -d'ĉ h\ y`e]~ᚎi#l yj^3~ N M2ddQҡ;Ç>Aϴ\gɾX6a(%' 2bBQ aSځ4asIixHP FHJLNP K5SoWGM;BX0,эhiE+;8s2;xz"K; hC6ZpU:{+Ă%9::a5$Ⱦ8髞;Sf+{לSRP"A*SAO||pŠĉB7BByP3 (qC9T#hBDա !ZĝQ"H)J+b@lK(* |PQ(@";0Ť3Vn]lKbd2`0ѳ^w&ҨO<#; 6/eH/zŶQo  D/ 2hζ^7dMhD(+E@H<#BCl?rr(Ӌ3cܒ36T // DnUH+Ex* Y=j5 ,?MdvHo{d TM/CGA6CTjjd֘N>cN 4${bt{GPB.v<> Ԣ1,O@$<;D/kJaKM ,.Z0x!AlИ| Q(VJt|C}!a p0V3f8Ca@)\!Q=a#GdF2Udhhg+ /0'/y@f'?|"BE])D5 4Ȇ_B ~XխF\65 n`C(@_Q@| YQc4F8"'vKLDP%c> V25v @4āXa~!1[WF?䙳4QM XL)C2=6䚻6 au/7xʓA " B1^dQC$ҥeP@JF8e QX&`0k `3qb80na [rP[GEE!͌^7{vb#E*FOc",kH. ~!fp'׳d hpO5nC +JkaBuDvpgvWuyB[5|CH)L _̓2Ko;h*< >!qTЅ.6z#1{HX1i^}y/\נi.}@yrUW7kEP%{-uH!Q 8˹vλSxY];L掤 Q`\?!}o6,dRp?Ad~cru/>); ;T7BypCt' L`" Lsy,umȂJOufC 5Fj*t(Nu{ExI%i徭ߣ$Vs|DΓ](Hչ3/ߐOD&,w~GjAx `(,F}GAw'@ @o@&+@PEiP`0kuY' H91vI PsHx/CV:bI'm|f!DhxG{T'9Px5Q>X.K M 7~E8A=vP3rȄᄮC(~4P;s@[\i ͣqܗR(bRȁ=gG7 ˰ P P  sauF @ kfp+|TqVaHp3| HoZhs]XZٸ 8T#H7 .Hq@6@h(?Hy1HPu 7X>3xii|w),> ȉcʲz8fHu p 00  w Q_APp Xf1@?yO ,_H,99)`  6P `[Cj#!i _}q\z ПbU*A& `,Ȳ3@J;p-Ziq/ö4 /wvգ!{f1c3#8&2*4 `bQНL[p#PtHzjP7]$c ?T ,Xh`΁UCxT!u-dIIXR7Qz'R,5w8?QiHХZ[5urW?,0(bY [C /-u qiiLϊ)Yp/<BO %T(ѨSw-/z/Eqi z@A%$%c(ǯ 60qr*i4/18b8&0+˲APB;D[F{HJL۴NPR;T @ Uk3Y?AAn4wIA*(YHgm6Q͡T.w|۷~۪ǒ,Kb7_"151il@v7ص(s=iIBi+7#|t S )06;6,UZ2'sieoï@9w{xr#tCw#53X ͢7wJ7kjm8n9 %#˃v P v/`lnjqF>S=3; 357"$YچX%bX8 jO~@Y][QczfauY{s`|v\UZ8:}HŖ( \E\L"^2+~;H`{lX. Xh tցS,ޜ:GʚV DΥH u+c7j(;A"gv0gK&?g{x^X~(gFIxIu)i;B)9kO9!z "[;x z :b  e` "?$_k1&/"*Y(Q+Mk -{,w3OKmic/tMMnM« ;32t;_R {xXo(6672a5[to8cz%XP=>OxCUtn? ??yP (!@T#;LaAQ !%t$A}JHB&BLB6'FNsќ~EL_GLnFx{4HMtTwV/~Qѫ/vWI> 8DB0 )^xq!Ì7~RH%MDRJ-]\h!0EFfX7ƹI_0l pSa!6fYe_EjʐɯUGPӐMbd(4TQ$s@\@ XM3n(LҥMFZY 4. BR~TA(`evH`/[ g̅S>ݒx|a!($> Hp 0QZX,@8(4#o50B Ub "* | -$ >Sz`7kV ~Mم IL$ E2O$P=!Q H)^x`'dM7<J4pl*-7Bnŋ#6n' C-LE)[O 4 )ɐ":'Z쉅"UTGKsW6XaE)BB̋Pk*S 6~IԅB7PzZh c pjB6Ok˖$Q?(b7C(H'\Êd :VDφ8cQ{Lu<v't3Pna6@Q4~^[T+C $2Rlƃ_p!Ej ězc&[hYp! neV,~hC_nZհ,$vR*$i` !Z +NlB""#h{Qg@<"tyBS'8%$olT':-dIFRfĆ<Q@G$0T}ѕI| 1Ha>`#"v}e+e6!P@ dMf6Ss͗g89N|%b9չNvӜb;9Oz֓%g>O~ӟh@:PԠEhBP6ԡhD%:QVԢhF5Qvԣ:A@ Q1';eh}6BXԦ$GHޖKH*@3UiȠ݈A DL f?BIDIZ;ZSQCDci]8!^04w!xBZ.wxZB`?pI0RwWP,3 6h-N4pSf:e/P_@X-_wMw!,/s}4JVk (a-@  l@9FP؏@ԋOq&P6e;-,`1@&OXH0C~Hhʅ.ٛ4M=H E6`ޅ);C) H|4ϋiF RZdn -Ёe%O^,)"#+C  U_ d >ȿªP %:њDȀQ+\bO( wԸ;haZR*J i&ZB#@]J+1`<"7-,XMXғ0@)Dڅ@ma \ H 2RL 0 @2Tr !,W!,W!,W!,mw(PA*\ȰÇ#JHŋ3jȱG~Iɓ(S\ɲbȖ0cʜIM/oɳϟC JѣHY MʴӧPJի(bʵׇKKiزhӪm[nݻ:w.] n85cB>Lʘ3eg?m34ӨSNͺuGc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(VhaM5ᅹ%`DD @ HC !0.nbm ,C<@@QDQBB Hb$(>d "@A@Q dJa9 dO R &d@c&ig%iP!d=>1E &Q8 QPAT*@Cf!`"l A 4*@A6Ę9) &t"C9Q0 4FBp:~C$%A2Ao1kqhHҢIlP6* &:h99AzP A>ƟXBoֹпƲg BvLBBFV;qHؐC"7* a%l@Brӕ[bH`@Aq"oN+`SFL@q|߀.n';%иL yS!Xp+:FtC!H0p0;dgwdԁ.|//}:C9AK_llaθ @ GǪ 5?R=T<`%eiK]*@2P\B\H{pT0ATb _CD8坎1'D`ľ L@-vn@L9MU\ЩE+$MBHHUȃ* QfM Zg.u?R@*M$JazA^h/Y),ZI= @A!"cNŹYL8P=W@-~MFkRT`!a +D @(``ܔLd @B8DXFxuH9#k<a`Aa>0P; gPS(f ^X9f>1 [36yv?Ɔy8s$4 H"?32U?k(A+` & >A;SF<e[*K5)l4\Z!du@9pYhi]*`Q4H#-"^^'4)dNQ__:mQ4z`M3hGdZ[` _:ȗ7IzSwWgJ7 Z%C4FJ8(9):Dfdi?8cWrMmQveeTeLϤ9F|]aUfgikvՌbYz툆(bNFJg}YdhChvmĥg# f4uhD;g֛џj5PWKk߱EJZV1\`FŖrD:hڎF}Q*)JUKo&ovo% PID*-Fp1tpr ׫Lotj 274R|bKq(p/ D9fZ*'-rQa!8a ѳ= [is5-j/GMGnPǯم `TG#vP dTuɤ&+rz C y DM0uSum`k,j;Z 2:\&+F*W6<bwgz nKX9pj%'\1)|g|+=vIzIuBvNxpOA`kkA~.f~/釨Z YH~.=Cy1Ȋhˊ+ /XX [K޻G1ۻ껾;[{8M(J%~pKf: s膄;WA;&PȎ;C<Ϧ",""S$tQe أ=x!@k>>&1+kKq@#@f6wWr@-T@VCQ>?JA$:C!dT\\x~(/Tpr$3t06(xuWDqDIDD:̸28Hq9zTK}Gd"y'TE{EK.XFgFmFZɂɟ L'wPH)2MgԈFhp"$2Y,I !-IIHJw1K7ʈJo KbfKQ]ELQM(M1m K*Ja$zPL\L<wi:ls/Gޤ`C|]kNg=+N~,?9O$D9~GwFQɔYhsP[Kep\KOO̥egaF*[|C=uQQdP'R$E'9*e?Pu0U9 aj QEE,m&h%qKZR^QPUQ_g9V}|hM4Ma*KP sVwjA; $l*oUmgeWFr{e~X+J<1yMS$9q@tgX"Y*.ROC+rYעYUpEi S[ՅD*[ޓP\7F Y [{EI\՞n QL zm(]]<F]%Z'!䔵"^V Zyvvavh4B$UA_PQ8jKv`.W+Ôf rREmQҷwc&"Ab}j /Dz^.C1ƶ4BvGް VQSdyP]ڄ&Q ВSdKddp'SFW:Z:B!."a#ujx!A01Hg gTehjLd_s:`%н"D>)efJD** 0mJ!iRi^ PiiBPȭ:L^>{jfNda> Q2 qyKki6:C VȆ ANĖDvuS`]8mp5fڶ~*Fn^l~JQ9on񮼋fN N3jo+y:JVqBxǮ:83եMqPOs2Wnƻqr#m` vrrB~*. pK P"_dV2($NL sDA"'DpC% 7 ]śW^xXQn(X7ÎvHʅ -LY KBͅR`GvQOul&<@s\8ĿGIA4"a b_Ǟ]vݽOvX4am`PVY|߷oa.2e!:?dAZ$ʈ7C?1DG$DOD1EWdE_1FgFo1GwG2H!$H#D2I%AQq%?˭*1*N#3=rGh7? #% NC`'xb B $A4(L3Bө `$*;T(JP):BFc`;1ɇ(j?x F+L=UTEU!02@T@W̄& v kl<+Ϯ \@@_C-B=" vZY8x %F 06]h]<^Ze?WJJT0U0܆8(b*:+@;5!dbrGpSTE) Є `=V JjPf]$H4=Q"b* (3g؆h{&V9fb 4$!h"EPmk ?D?;5d=l@ b΋ &ʀT6aZ%  /v` ^v!yϛ(%.P DFl J03yM\ ˜A-Y(.R'hA^(! )^D44~4|\_aˡtK!-p_ꢐ3Rbv k<OB lwA^B% [f "c. _/&#_|(`(ؔE!kQ"`l# AYM# U%JP-1ga%2 P˔ fB@.~L#f"~&U{B l VQ@NOt2@BeHΦ[VX93% E%B,5!(_2hBPiE2AA%sR/JΈ5&Nw ĞOB\Z . Iq DCBt"YE5S)Lʘ3eg?m34ӨSNͺuGc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(b%PaZ yT!X9"GaFZ9/Dpg<@%@xP  < BP`*B H@JUC6lBmY'4Q0UP U.+ȪPB(4+Z,tR B$P.H.D+xB  m Q@e1G2R Yz8 P ,) @(@( y I, P~ߨAxALTA PՊA?$Q ' \0@hiH wz03bX'pR24` (¶Njɚ79n^ "~щY_' q"Ɔ !  ?_L*хTv@ T[v0Ă*C $(_r"FD"6SH%RA&oLZTzD>E RY*& Qfa5`(??$ u@(*=nv! /Ȃ/(4L{%#ڶ3q2!!Va ;,$B%ĒDH5c2OLJ/" ^~ oَHHv J _lD] |`/)D~=BtXɦ64= H X!Us*$ W)΄` ˙yr}/@/{*H.)<s@$KUU"C d_BXJ@MҺDay:wJx&1-\(fRmAr s2Nrb d!2*Œ1Hō`㐰դZPPPU@$@J)ɣy@wIEwS (0Ka~xlZ+J&$^0xDAЀf|f#Ϸ*䄸MJIOqSU dd\\@{r8q:)Qd'0MĝP@ w mn !RhCWJ(\AXغ)GQT&WwZ2؆ $N!A,؂閈a+J@'ʅ!@2qH: (QLѰ}\ȥ%-ZҠ2Aiax '4 $ȄyVaKys̓7!dSvD2C(9J-Ax| xmC45D=!wK M7b4Q=ubA*@M&9 @B w;'N[ϸ7qs|' K6sȑ|@;*`6: &8qw+S,+z )TC_netQXB&q,̟:u!b{BUmW$a>riO` uZ9%n\-௼ /kvAU>|=aUN#86Fby0w"K %7 %B4!QXEah14%q{yiNk|DIRۼD#[dn&($#P`%S'QS"T`U^&t@TxCtNEJA-R##:߷MorQc>9R#S +;< =%a53={m#Y c6bi$q@#hw]9y !I?--e$E$@d@@ ?6Su>uA7+36AI@2J@$5X +$76 ]Qc5-b1P{A"VXx3Q0yuyU'TdEE!(&^dHEs^JEr/Fq>"6e4xXG!1F +&cl@-wa$+DD 0H'BfʅfJ0eWg%P"HO" K VK(g|U$Dpf#P@c0 `2ԏ5B#uڸxϵf>"dAf3H"9,euA(P"G6BPU#(3Oߵ:F\eQDQ ?{$i=IȑT%(R,`J7{ŋ&yfSDW#wHGgvy-SŀQT5T#@9QǨeEhcq_e"$8LIǔUQQBp9 j[Pw M')mh*R*&9yaTΟs(2v9a=΅-D@Dx0 :(aD#&83vRH%M<9E_Se0rU0_ڕG]A]UJ(_艒"ń `Gd<0D&QbT$XQ 8 'Qx;!~ `ۍ!qDʙ7Zh3jAJQv .%T@`_Jd+@?-Y[`]zc.2׶Y.K/ 8ow2v+7(D0A 8r E+/ ڔ:(R@i(lDi) 譣Z~"Dfcn,I Ch(~L* ̋!xb9+  HdM(dTdzB @0(eJB ,@FrjУ;P$軎.°:/|2`%" @C(vHH ?4H@M5D6Y r ;(S2 Щv_EFv!CFbOMT"@!x=vB`uA %IpM^34<سccM脶D0ސ*̨ m*FҪ(k[&C_0eu*:~x@<Y勂 ^xB`a@̯'r@LNb2>3f2Edz%T6e3-~ *"}"Zl+C{;` !FXaZ=@vվݸmtkJc"SP o'ݠ(Qt4YRh&`ŊlL[E'ա{{5pczg@@W>vZ/ip_0J]uְ=Fwcb/p$Ա# (_Rɶ) UJH-aC6Ur1vCȖ,iy x~@O{ͪ,Ȗ);Z0 *^ mzFQxG i.8*tdB ގiŔ^aj12UphUv1bXp(Q.R)JTtȨ@0SY:a54GdiNDǁH7_:KZ , ci B]8lkIcl M0*dbā4d Ӓ@yFu,$CS:aK/Cg3W7AHNOQb!}Px-ma.9&>OĠk{Tӣlu`HT(J<O@sD'gC'9C"E((t adH#u<3f?0. @´ eo:D AE\@ž*)QJXMJ"~$m#mHH@m\&.yf'灠 zJ(Gu\ y֍r)CM L.OiXX@Vl5˃j?\rT39y*6bi*mU*.rt;N>ei!zJ. JG^  iԢptB4w. g]f8[ ϒ4~$?pɟy>\%F,/ҙv #CBH2T&g2[v18{n@HT))n 2z~{h|@٠zh.j ; H-K3U#?ei=KA*4H4J(Q8HL9Tرz*%hTcD>J+.@7 B 9ۙ !a b ;)(S_` :I5<,IPYA$|؁Ft@a:0c¦ Lj6ɢYآ^XTP&r?d7L(Ct I(" + `EhœE0ȁ)TD죃k& ,<8B9QdRX@; T? TYH|\%Zx|L} B J$ԍN~L%HHHOB 5j̕^>Ê#p'&:twr:&2Yuj Knġ j ܍Ի(JDJ)uJH'nӘ[{z%$*ƒ‚I1S(L`-}X0(* x$ rK*4,LDͷ ްt͸zׄ!,W!,mDq!@A?8AN( `! ',8v4 {0DiP f$5)@ $BA10ȳUq `0U"#ڶd9$ W\1jn;V =7 J~lPS+F~Z7K .yT4.X.uU@AgaE ǘA! !C( 064f (aYh*/ PBz dGIe0@< %u ^$J州/T.X &P %9ƙ@ 4`Dn[QX0SE\MMP**Y1uS"1X0i0" oRKq`Iv^@!H* VU|1 @Zd/vL7P7U@a YTPA ж,CL@ Ma@#Ti)wajgw߮!˕UM (^K*y= Piדi'̒ı 9`S|-hkПmpCy0(Qԅ] 5%AfׯL ׁ=@$/i%U/dZoib8sUC6] S\$hE$=Ы@Th'4_Q fh߲d@'hb)u vAl@>| @F[2y+8ݴ;3#nA1x!E=@޹@~9Y$ˣ2_ZK(@Nj/M EF1  ' S d :SP]x E dqOx@Vx~bPb>"+At]m]#kP /;UārݨBO/ Q0h"u!+.p:55`& 2#hZA0 5-W S"$bI 'P~@"DE*~CUR'$䰅;ȥ.wQIP|H=' PTjZLf $aZݰ**t&Q'*_ء%^ALTx'b˃ \S<|Iɾ" hvY:2A`!%)UŌE<ǁ KX~`rJ~tzJ=H~A71$`H |hЈV)L zc(} :%j+ꆈҎP2;,Xjih T܀@Y3ET",eNdY+BJ@U(ZQD a.M1IҪ3iJ!@삀ಾbA4+isO > mF,#tVKrW|^`hͯ~ؑKpD^'N;'L [ΰ7{ GLWMb&D$$KB? _ !iuT֥ /b,6C>,ΐDYA@ $ıZEc2dM~P+GfHE 2Y@3Z\ ,Di`SR*9+in#TFgčm1FMAj$H GU|6'wQXt,-{%Ń~9'iM\?[tcҜ~+K1HR"YpmUd2 |%u6K@]&'@S(, -^|0_`)@x} RD^ =X9=Oz'-Ge] bg5%\꛹,lha~,%|÷&j,Hz*[ < (Z4͡6@27!=T>(..5gQ/M*seltdvp/q0A|4hfA0)tMT604ӃdU5F%W'!0 (2fԆZ\B sZ!56[bC[:4Q04E%4sZLPD_60I.ES">0b{uDWA|f]Âvv:a*\}$n7refs7Fp4w& P Q[S!WmWRU!9Pj 'FPQ#AQ#QxVk%:c&S=E!=A|DB:eOe@rW"KA0RIb<~#e<[mINM6?Xj!CM(L.vVi>Y? @h!@Rdy'7*RmN?`?4g@h14A9*i071?'#ERM%L'1zx& >]t()[i%;(1bDKDk$k|>a(D(ćԍ&k{A`A'q WWuT!lz b7Z'rU{$":r:wf>bLqMAs$Ir l@:"(;Xyz)([pjiRa5Ev78 $ 1&[~yMHN y>BсH9PFYaYL%MYfWN$dћQ1B3 jNɹau4?М1 T.SBw$nO#j.%0b,yI}'%lQ3|JyLIx"Rx%Ssu3u, 6_ 1 S\[aTW(g)!'/؝u>Xb3T7Ѧo\qX/R DgFT3/GPjUY4R WQ]VH WW%Dћ-N롫Iy."{Od*y TPGXie=Di68}(u#. *31_{NAi!f&^=rm+r[$$d2kr*L!{ %$72&6 !!bC@Q)3>Rss."6tAt72hy5}½o%Q" ?Vg+[Š!etcR&@jxrxRRC$[y'^y! zR!zQ@zZqzzk(z'T+q1D"h (W,,*I '*lVS",aU6[e Q.X8ڧW^~xl_.1'A+0!Xx%2@22 ). %5lc#ehkb4T׋5R9˶|X!R8ϙ:Ky7} 8x 8lW8QfQ`Mj&l6Y?L=y=*= 71&xc <ѓ4\}ǝ;KPL` L-)l')]haDy 3]<ќAcL)X71z'\:=C9\†Ҵah4Efa׭A+_<,Ou<1=2$x]T! =^*mOpj_rfUWU#XSg:TV*^v,1z]NOXYy?4{PyY̮ZwE!/}!ZuVZTgLjq0nz۴5gh.&m].T !\ֲ_.+F^W~ï.?4v<^nԹ^~Ȟʾ>^z^aα;]s| c軦[F0 2N^ga;\u>ig3pdrn!dq!bĻ+1kIJ&ο=jֿ";qR%U[^TaALxaamk Ar e S9Q @GoqQlAp RFJ?uOQ/|op1mR!2}!a @"Rq"?ì:6Gg`A2$/qOぇ]`o Cn1`'3'vfB0-3}_X/*'C4;$gvM~R.ŭ_M(trzb;pW`,sɡ2*)H0~Ƈ|B7ŷ~#$Og/ود~|в C->G3/-R",H|8I\D(#"A DDRJ-]d9W~u/0 ~J/HkUA;3$Y AOQ PiѣNڕ -TzJfjDpD} Sj`ĸ@߉ @(-" aF:5_:E5ch :ۡtZbk{vjj hJK;%ީ}Y5I(aż4dbgL ؠ(4SAlЋm'lS _B68NU~ X~)B~!-LJ93+6p#B~E/LV0%$+ԚOi+l'=; {" D3͖ ʺ > 霒B]k_c `]rZz PJ2h T(o Bp˃r/S RM]|U C cG~I6O (i/ ~EY4eTXztf%EiJb⮼6 ދ Ȑ81)(^u5@Y \0kWj  U]zhr5 y.-2@IfQtjD v@:鿐!|Su*(r0(N. D (%g|l`^=(Je XcSƂnmBH&=~g➻nFVYP)W%N#N{ҷ _cP?00v@XXJ;%; %Z|K%+Oe  (ImE;W޼nLeDΐX~5@wsB$ږ0' L  ~$`vLIŠnJ[$n''y~s $ K4Ew>xY1 ¹脝0]2@]!@C^Ү~ ԧ ^6՘ W,I{  `Aȁ <`$kD ( A> `9IJ ;AC%5INvғtOҔD'ٰUP1e,e se.uK^җf09LbӘDf2Lf6әτf49MjVӚf6Mnv (\Mr~V =~CwEyD|ˉJmAQE< = 1XRF[Q :o' 24p+Ȕ %FxKxWfԓ 璐 p& I@ @aP@,LBvQ{-A=UF@?0 t@8%d:G T=iRbxU yUU E>D0[@2Ad w'tgH# O FDa@".Lf] QtH`];م& Kl`%5&+ zP$" PSK!ژ 70QjYxG " M]pH+م@-V2hV^`isxʾ'~Ӌ/ZB) qL[q2_(0PI5fѧ%XОd@+؀@wN &H%Dp#]LCP yqi*k-)JY {x^EG#!HDB]mÝ_y d.B\U6q ,6) '`Ve,sヌ'a3 "-eA `F-F9$-D2yf8@/^#ЂsO $pހ\3{-9t~u<1D4ReJs@B3gx~Z)G?xdV@~!} Crb8*"+bLﷰE0/-{J]>{\b%\! T#8. wMLd2ɿm T(z8 Xe9[?E(C+Q!EB]Na:Lb lIݪh\[)ju+)1.vmIԓ[N?mu[ | \Iy$M ez4<1^%GIާY. +,ˌ/~QFme/,'$Y+G+AĚ󁮛I#|{⥠Xș` P# k=';(ӽ#Wq\33*<㒟:(PS&@ ,AC1#93n9A [==)/QĞ__"U=L6 C/b3ƒ[<(&{p(D/1 'z'CJ 0܁8ዼ<Z؃ۛ!8[Ńp9!bL6 ꄁഃ[5t:xi 1"Fz"D#< @ >bM#$p>T6:G5>b Eb$HRG$]GrTȆdsȈtuȊ,&ok !,W!,m fH I 6|Q@+*0QŎ9f {\ԘG*_N\Yq˚iBy3!Ok 4lH<# Px>d`ېUC ?5lsV/5 AUL@^ke>QRO[QLp$PR@<Y,tR m?4-b.q.t!5a@~"J%X BC[Pb#F 09d[~9K TYo5ѣջP@Í|rڭC 'H`l6:C +#^ Q 'ſ@G@v8U,p,t@m@Wۡtvp|s^*P7<+H Xpm^0>rv1lltC:@P*|07`uh@@)sz) YB&00!B cYD+n1o^?HT",ƈ x,%*{ۂ/'8pk O z as B'-P]T#%(F dN`DpP^?hDaz 5 D@8QPF& À34`WtJ%v yL_^O /Ц4k Y*rD$#[zA<^lv >/ !t,t$QɁ\2%Imq[D!v`PpB@&A:!*KsE" ,=gB@H4`^U`Α)M|uq##7#R~`Cb'FNw23EU ΤS GM _L"|%hSu0ٞD9ÂW; pMd į6u%J)Ы?@>,yh m@<+_qhKPX R[C6ʌ< , Pn^*nN)l/LCSGl^[ t JHBV SR ~%5G>^{L BPCXnzT@ z X?nsм׵H_4u"T*Ձt =vazblJ\P@u17 aC0>aV 3nyN5h`߆45]/z [ tc(h w+=LuwW5(qBF !7u]`AQX eJ! A8I=%jsc:;X4j>"H{Dm8fv :( %׶` ?oENkpu)I @@U0һ!?+D3QF(PO> Ͳ.-,-IB[Yd ,'I<(m R44eذa9swu-I'xPg~XKh;(ر0X 7ޛSa@0PFr 5Foz~v5`7$X,RARݻ-8pQ Y> +(OTڑU8!%Ut* vIo/Cb=DVE$(j'-.VQd B膕a4PBAbt3]Q~ @S eӈ؉8Xxu&cVO~ІQ?,qHh%aW($f1W籍e[cbjH@)0:B<5WJ,X%/T%%gYxrȠ7՚! 6 is{T',$fsBe\[cu,qz0u ZpvLT+d*Ugy{l qhO:i^棢Gn- I+I;O`rAIhCOЫ&9pUrPːR};DѺnQ(J( ˕dzcsD'`Ǥ3jgjB jf 8ˁ6"h(lv ?H6a\r4cֱr>G{( Z8-&-՜o^/K:p'89C5]'/p=*oLP?M YI'QDaڠI*5֊!uczv jKp &dO  Zx}c J' ĴfF'HP zǻG1 *t>H+^+ԻR~"):8:e ||!x9=j4+`DZx]ZMc.dF'hr:ȧ ;i HZ$d)++ |iuoa[.".6~>2]l^$7 =,Al18ѐ2zF\H|&RlTZ\^`bh Я첏jL`uJ 40+ V+#ʟʠ+{*;)?24%_ۢ1}x,zH,Cf϶Ll9i#ɚ3J63;C$ 9)e #*8Zx^8566`N V[4U LQ5σ58 2_6W6࢔F|cY( ;u&csy;0_Gy.{$Z(6V&i@=  73>0TK4bUiCf?6-Ӝ@Hdyc5 >wrS"(1t&\fie-?eA@2A7Ea4FxE>كjD[!wztmI <׊H]2P*S[-1o11P_`y3`BVJKKKro g>Ң O )$O- @$(*F-sjQF :C:ؤ5zr+Y7Q0R%C**e.$ӗ?&ڍ(њiվM>U1e w59j*o|6He?-͗2*UǕޫK0c 0HC-^Fv[Y5$nЂEEEn1[ :JaHg=- ' N )-#]ZXIbF$mc:^.ր`v~HUaG 4ݭ5~hUoˡ>Y*^b^ p&Tfe#YR91^f>.>ƙrb_kNH! 5֋KbJ{salo > -)mK; CHFGu9'n|'Hp apA¸!,J\3FrөaA@K6$+( a tG1rk"0t/W؄ti+>vk${>k]@?O>zRz\G6f/UG'py+VhM7W'+c{x k`:hIo*4^9dSr>3t W>vDU#d|8Bç>?Q̓Aj6!+l@؇C گ]8e"\C@@ DPB >QD-^ĘQFjDG%MDRJ-Y> L5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZm$j[u#b!(>'@GhX%'k#H<`ODAbtө `lڎm/,6dPĬ9ӧ(ɗ8ݼ mسǾh3A#N 8 z 'x]vԵO![(j+ ˭,OB,lJlh(H01>TdQ 6 i @3hZf٣@H`yG2Ur61`i8@%Ʀe`[e;S`]@Ŏ /4,R "! CC=r+SMB L҆f60mm|C=+*Ze(1l _赃BH<%MȌUdP`O $s%Z,ϐ dڅT҅(植4 Î2(|Xn`4<"X镒ZC3fE e?c3"SM23 `_J@ȕ</4B1P@8*Y xഃla,|l4 AhIɵxVXBvI' )pa 㠍_(ȋ<Lsp#Gy@׌R]<6)Apk> P3nz$4 " l0hnku* H0ڇN;Sj $_7#vA I$!B"_7(o((NL4$7M, I5Q4/4ì.|Z:]"eACe$ dJgky֤iC4rR9\>= (Y. UHVRA^ƕY`nvHGU {]rPEaR!*u:)ʴ(U$`EȏB哫 ⅁0Hv@ MѥJddfjE)HT<4z(TQZφvx(XeDP '̛6:*S*UӺS_ .OUSMM 6E7"U;*'BtIvVAif  ;@6 %؛Lp @[ּmU&hЫP,vnoe ZA}HDt5hb$J/ 3H"0.;0@~lL%J@@0[ q W7mT@5 hD&c$=h( knDQ"gr3g>#s}g<Ї^*hF7яt%=iJWҗt5iNwӟuE=jRYʥFON U3(G]) Cr}Tծ~B~F6d/DHj> {πF4ngB⸦6l͐akn%i FA1 `Hوon{߶H}l}㚈 7 GqԌlҌmz͝)$Ȍ)D_h|-jJ㐮pdGLPќ6d <ݚt0ӂ:(DP4K|jRȟsNQь-H ȂRu*6d%ԯ:G⚔0$Rƺ )̐  O՚X=?ԁT9KՂ;"RS"+Z x0h0Yʂ?!=HN7MǬQ<NWhr++Ы'L]IT!,#Wǂ0mb?)֩%-P+9+rmP^,U}1څ;TSEQ2$]“] G$0QAXt;d${tQD$]5U% PH'T -uaJBz ;4Es!m( EZ0x1,&@֑Ζ4 .I$DQ"S V< s PN ыY.kaV : )D) !`E^--G"#UM[3`M2 P(!+2؁X@M:]V``в3']x~ &8` f7c3:u  _a!,W!,mR(PA Dp† B,pBT(1E:9ɑ5IRڻ@-"$!,DK"*9$6$DzKpMKK #ܐ .v0oD&A`-=E | o"0H 0 1HC/msIu'@ ,Qr5E .%@)*R/ G=Bh /c3B 4P͗)"B-I訊NL ꃚ?or*vQ@ P+{qč1Bĝ2"6@LP-8.'"p3^u@{Qp Q@TBĄ. 1%nfQ廭 2Vb //R/xp!,8uq~@$ ޮ M^ٵ(d1b!oQH ځB$Pw]0wa_SF09JH:0`0nACE!F +CL6m-pDbD4C0cQJ](@ "Xkk^R'2Q(rnȄ5 A ؂)f!-p!>d~&!MER%F& ـD, $%]"Lg'ւAx)bO|2P\H|掉gD,/K4^;a =PZm&Bк  oWT"<&\meS9Sx@NݧP" SM|+萬%tEW1 *_yAJ~a ~f<!σX[/ n5gːUP07.eSX+ * M%.B>($-y_X!X,="q _"X%qiOEX'0(w .?5 H0c\5N\0#;Ät"Fb T,A{j c@OBY YQneU `jQFOO4!l)Ҝ63ii9pAoY H|@2A!@`ƌ$OsIuMc0† cņMj[ζn{ݒqGuIdZ憖/mkw_ h3-ҀN[=OD.\EX|\R<ρMF{r:^:MT5]5,xcZc o!(^tp<[y]< mU?: w!P6c=zxSvщdqpȄ$RdȻ&'R nJC)Ȱe1 ~ۣwwK[G-NzI\fLP7MHҢ^BM!R.tYx@4\Xx8R xr2>=ll  ']>̣ !adr|yOAΒs9s-c:b"P::Q;D;1p!<>>S,mP˧Yb=3D OO{%+#$ c]11i&7>HF&"{fsB`` q5ec$7JwEt@ @O@Gc!A u]Am[c=ՂYF9AU|mC6$ZC;]qxQ>wv 1BGL>XBCY&d?(;2X\_D.{ieT! 7ܗLr#/86'ld=S} H|!2H0%I8Zǁ%شB]LhD&4‰DF 0H(-POQ@?~VKkS!HN؁`a=oz7veքMڄ6ބUΈi/0LB&8#ߨAU:CĎPD4&u!~qXֱkLȗRQ !% ؓB%gPkpKO Е/13ST0K:iَK&37(!VƔUr%Oc~ } Q!V@V`VhEMNU藕3Uq> q)0de?GvjĒGX8!qZ Z,>d1aٗH H/v1S'GZ`Z>r n75 k ;;H([!{*mY\%^[+h P^r#z UrM 1^%z^y zh {S]B Bbie*0$`= P`"c 9 a*Scu 3 p8CZ scTbr%x0 и6P f2bfqaeDc[)O&>ɖgddQv!w^36 q>$3gBR afDDCif=yɘ+ 3$g_I@ olR.gęU>u)>+hc$ip9jjq*MoB0a6gj6 M@`6kjgnH $h&rk ⪮7{\@!Zگ;[{ W#7#?E$~p%#QQ֯~U !2!&jB&$Xo3s-X {|'Q3"dq (9(!Ge {4*P+B+ Qss:ǧ4gs“P'o.tF.A,y,7/s .Tv.x_uc{;}KsvQ/cr yy#0Bas0 0 ch#$꣌T11$S:D2pc2C@Tu-%>7i"4ZR4.fq{~K{{L#/7-Vc:HA!y6is5P Q,m o7sS7%rS6'8c83'7FùĄ| up#Pc%q:WoUX:8;4-uPT!BspAä0 >,%< o&V8_ .0*׈/Fc@%ٿ`9. 7`vB)B BCI2CzB6Ġ C>n]6DtBB%BYu'E{VEWDح2EH}4d.ɝ(2Gu̵>@LXI}THDtAHdHHN-+z9DŽ Xۇy~{*u>ӻ" #`C ]=!U]-Dr0xL<]Z j^Mb҉T`U JQz*ݯ/5:R`bVpszR VR}XM໦Ef"FbBu)bb04697fo"8/EvdRW%uޙ'^!ͩSŋɛƗJ!O  36Y,el6o:~8RgTh+u )'O5 Ai?+Una*vvQj2Ku̬qk zn!k&ommhΰqE̡>^~阞难V蜞#5˝6` ~G ^Ƒ"VfrFk˯&(.ɡ.FRNԈB)?+OA) )G  HuPFYZ@+f.^\stZveP'wr0a0C,5aX?; taT.i .͊3  av>g Sic{` 8sf0^60yR 7 * /iQ7@ 3=050 Qy1wmg|kzU  z Lps_zvOW(wxwgCcݻ A4L |Süjd2SaGL Aq3cS('V 7 6 7:z=Y] 7H7ܫRQ,x?BbZ2<$aן$+sR Q}q}s6}h: !@ t=hBЇFthF7яtL ݚW+IfA; äAAF  MӸq i^d2gv"R\o@gG\#yv24`QhfBQ;dME= EmmN[@ylX!1K|_Mγ 0I+aY`:3LfV@P[:yjXߐ|b]E-R]-x bi d Ћξ.D4xBi;\8c! @HgW1؂ArkǤ{in|'/̌̌8Vr%wI x<~<J!.|GX QtDQ+Md%HF4Ѷ.{/(&@}S8ޕXE6Pc3f,$DI=8kNl+v`/pd_09Qxt3Dt5$X7߻73z !! Q9Y }*_,)3) &6zC/y0 3QR3Cwk6랾+c@=Y@4*wC%c9<(A lYd @/=eixnDb((L[@!6x6?䕗AZKB`f; G̜ Qz20$s'Q8/"? =E̷M,D퐯Y#Ż µ+\]`L$ĂxȀe#Bz٪A  BE j=ܑ6߁EГ7Իv6E6 lB')!'a4! }= g7 `58<\F9,(6CZ[GY%FL#Tt|L_.S-t̆.7 婢D( cMPP@r6|/EzGxŨ4E߻ʴ<Χh/HkG6J <䢷,3 xP1E)+H P(C_@Q5;Q˂ կya  ' !,W!,Q?H(DȰÇ*ŋ3jȱǏ'|'O(N`@~bp̙+9Ђ̖ Ez1DLӧqkÕX$AHLIEU)YҦqZ9rf JmZA&굥_PӊZjVZe숴ϻ~5hSU ǎ yY&L/`l&ew{HDzҮKh$1YҖrہͮ-8˯Y`:E~g( P xQf]Gu}iE@uwP>F5P 1TgXyW u @%1,u,q4Q`&@ 5!@//3:(M41,(B(VG˚*E6֎<4fG&`G5)#&hyT\'UciQYk Tvzh%PON%)韧S*jrQ飕Af@3XU&l@6쓦(X,[YDj*|-AݙV]zDZ.'RXHGZyYaf@ I @jU$M5UEB1&``0KNYg, @lPO̐m @hU󫡥 |@7wqծ@q&i8%9k6.LTͰǁhP!BA`r*@ 2"pw'B)3@$(O8x0c ȊhX脞U۸yTXS8)k8xhIX=yH7ؓ @FPuv/0t^I2ٓؒ|(ؓ8 BЃ?Fy42SHqJ(ٍ9B*8LXv(; Qهy)Yҁ9q2V9pZ)IA9Ijm9{i:fШlh6mhlU bubbletea-0.27.0/examples/sequence/main.go000066400000000000000000000012171465647402200204410ustar00rootroot00000000000000package main // A simple example illustrating how to run a series of commands in order. import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) type model struct{} func (m model) Init() tea.Cmd { return tea.Sequence( tea.Batch( tea.Println("A"), tea.Println("B"), tea.Println("C"), ), tea.Println("Z"), tea.Quit, ) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case tea.KeyMsg: return m, tea.Quit } return m, nil } func (m model) View() string { return "" } func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Println("Uh oh:", err) os.Exit(1) } } bubbletea-0.27.0/examples/sequence/sequence.gif000066400000000000000000000221161465647402200214660ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQWSWWWXTYYYZV\\\^^^___```aaaeeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxyyy|||}}}! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQWSWWWXTYYYZV\\\^^^___```aaaeeeggghhhjjjkkklllmmmnnnqqqssstttvvvxxxyyy|||}}}H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:-檫Z1,ȶh,6ⲻ:+m: V+,r-݆᷷kn䞫n.y~ 4ojR`HkpupTKA!HGs1 Q-<&.. %|, @RF"8`A7MC=bK-aĴ\+ ݊,w6mPFAm(hݰ#E-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP Hୃ&,p‡6Q"C-ĨPA= ! *2Fe8*IJaօ %:ʆj2S&6T}4Z-5Ks|bփ^hOlٲᕩ:J]:-1kb5+A\=3 '2cĕ,e `lX )[v(ǃf+ ZdiC !,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a$8Ņ3dg<!*X=' %)P-ZB%l"h  v)IЍ3`iV(1JD-`96<2甼V" =) ek;zI\1Hbk+a . cZcm2gli&!,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a,ař,4eV@ά竢B %)OiYLdkSU9{^ ֪ɶ,Dn'Gp)ӂŘhC0'y+s lqJ1 PY+Qj;R+ !Ra#NM쿷% !,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a$ęȼe3.$)O[xj(!jB"K<\)V- SQ 1u1![ Y[HЍ@@{WAzDMT!@ ij֪YVEn+0OR[%3/nhq4[]וML)$2f!,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.aLSYʤdllcKTO?-zcRm(ԁRb|tjL]R|`T}:j *1IJUGzY'-Xlm;S!䄱JlŁ |8deq-yYcf'!,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a,ař,4eV@ά竢B %)OiYLdkSU9{^ ֪ɶ,Dn'Gp)ӂŘhC0'y+s lqJ1 PY+Qj;R+ !Ra#NM쿷% !,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.ad(ƕ"hz(-[8\y-Nj4A%E ;NAB%[rj:BH`lKmܖD+bԽwchB/A6iwLL=Vrg !,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a,Ā3dD˖Zs8yAOY|JR"[X gMCpMXAŘ4|ޔO1/qvf5ĪHdH'i˕Q[. 8PE(>5`*`%?j2ǘ)Q&}4ܓ!,W!,P Hୃ&,p‡6Q"C-ĨPA= R$Ƀ"GL-.a,ař,4eV@ά竢B %)OiYLdkSU9{^ ֪ɶ,Dn'Gp)ӂŘhC0'y+s lqJ1 PY+Qj;R+ !Ra#NM쿷% !,W!,PP@H*\ȰÇ#> @E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+[SV]zש[ [_گmŽZ^ެ}[]⨍G|.[>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,Pp*H *\ȰÁ #JLċ +ƍ9~4H%/Rʖ IHeM iOV$RHWDzp`ʴ4N`tJ]e'Y+'٢l2N(dVpr"Jȑ8eό:KؒEڬ%[ %@ h pCoO9![g~y{r̗ 9uͣSνËOAҧuhw2R-5i L} 4NgK b ("x)a PE'ȉ``e}Š, bubbletea-0.27.0/examples/simple/main.go000066400000000000000000000036221465647402200201240ustar00rootroot00000000000000package main // A simple program that counts down from 5 and then exits. import ( "fmt" "log" "os" "time" tea "github.com/charmbracelet/bubbletea" ) func main() { // Log to a file. Useful in debugging since you can't really log to stdout. // Not required. logfilePath := os.Getenv("BUBBLETEA_LOG") if logfilePath != "" { if _, err := tea.LogToFile(logfilePath, "simple"); err != nil { log.Fatal(err) } } // Initialize our program p := tea.NewProgram(model(5)) if _, err := p.Run(); err != nil { log.Fatal(err) } } // A model can be more or less any type of data. It holds all the data for a // program, so often it's a struct. For this simple example, however, all // we'll need is a simple integer. type model int // Init optionally returns an initial command we should run. In this case we // want to start the timer. func (m model) Init() tea.Cmd { return tick } // Update is called when messages are received. The idea is that you inspect the // message and send back an updated model accordingly. You can also return // a command, which is a function that performs I/O and returns a message. func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": return m, tea.Quit case "ctrl+z": return m, tea.Suspend } case tickMsg: m-- if m <= 0 { return m, tea.Quit } return m, tick } return m, nil } // View returns a string based on data in the model. That string which will be // rendered to the terminal. func (m model) View() string { return fmt.Sprintf("Hi. This program will exit in %d seconds.\n\nTo quit sooner press ctrl-c, or press ctrl-z to suspend...\n", m) } // Messages are events that we respond to in our Update function. This // particular one indicates that the timer has ticked. type tickMsg time.Time func tick() tea.Msg { time.Sleep(time.Second) return tickMsg{} } bubbletea-0.27.0/examples/simple/main_test.go000066400000000000000000000034311465647402200211610ustar00rootroot00000000000000package main import ( "bytes" "io" "regexp" "testing" "time" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/x/exp/teatest" ) func TestApp(t *testing.T) { m := model(10) tm := teatest.NewTestModel( t, m, teatest.WithInitialTermSize(70, 30), ) t.Cleanup(func() { if err := tm.Quit(); err != nil { t.Fatal(err) } }) time.Sleep(time.Second + time.Millisecond*200) tm.Type("I'm typing things, but it'll be ignored by my program") tm.Send("ignored msg") tm.Send(tea.KeyMsg{ Type: tea.KeyEnter, }) if err := tm.Quit(); err != nil { t.Fatal(err) } out := readBts(t, tm.FinalOutput(t)) if !regexp.MustCompile(`This program will exit in \d+ seconds`).Match(out) { t.Fatalf("output does not match the given regular expression: %s", string(out)) } teatest.RequireEqualOutput(t, out) if tm.FinalModel(t).(model) != 9 { t.Errorf("expected model to be 10, was %d", m) } } func TestAppInteractive(t *testing.T) { m := model(10) tm := teatest.NewTestModel( t, m, teatest.WithInitialTermSize(70, 30), ) time.Sleep(time.Second + time.Millisecond*200) tm.Send("ignored msg") if bts := readBts(t, tm.Output()); !bytes.Contains(bts, []byte("This program will exit in 9 seconds")) { t.Fatalf("output does not match: expected %q", string(bts)) } teatest.WaitFor(t, tm.Output(), func(out []byte) bool { return bytes.Contains(out, []byte("This program will exit in 7 seconds")) }, teatest.WithDuration(5*time.Second)) tm.Send(tea.KeyMsg{ Type: tea.KeyEnter, }) if err := tm.Quit(); err != nil { t.Fatal(err) } if tm.FinalModel(t).(model) != 7 { t.Errorf("expected model to be 7, was %d", m) } } func readBts(tb testing.TB, r io.Reader) []byte { tb.Helper() bts, err := io.ReadAll(r) if err != nil { tb.Fatal(err) } return bts } bubbletea-0.27.0/examples/simple/simple.gif000066400000000000000000000413111465647402200206260ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""$#@$$$&&&'''(((***+)U+*U,*W,+Y,,,---...00011122231m42o44466688897999:8:::;9<:<<<=:=;===>>>???AAABBBCCCDDDEEEFCFFFGDHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:0檫Z1,ȶh,6ⲻ:+m: V+,r-݆ˆkn䞫n.y~ pTA[E1) /t% Q Mt`$ Ӌ´#JRlu$10Lԃ¨`( IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6rpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^w !,W!,m\ N *$aC xbŠ1> ń3F.  V* ^KŁL̸3bF{!,W!,zP H&,p‡6Q"C-ĨPA= ! +2FfqV0=*IJ ؅ %f ʆ3S&C;j}4ZW8Ks׃ 6iOᕩ?`]:pW3kr +A\SS4 '2ELĕ,eX`(tȃf+ ZdiC !,W!,W!,W!,P H&,p‡6Q"C-ĨPA= R$Ƀ"GL0.a$8Ņ3@'/Bѫg]== %)pO_B%"E  ىIЍ3 3JM`96jӭѵFϽ}N0Q#|΍BNt:̮֯'31)~$G|~7:@ H ·@Of7"8.6C&W[H DI.Pb*SR 9zNDI Xp69XEd25L /0LqP!iU$_RL(Yo(&0Րh"m٦zR o@P RFL}V VZDTLb5U#:Rk8f0NQxc'`hQElT!@)P)4 h?"LM6B԰!EN$!($|! SE:Ux0!2I ȀR6d7P_У9&DP` E: ApZq!x(W'&`HE ,@`">,T0 YJ.A /|pKC W3lt!gmj&8#@X}rq!a[[EH%!5]H`{^. D=" e&仿PxYwHz4 0Vf.2zV Y.GԌ_ j8Rަ&wd׷z rcY!5> ޵ -rnVt !'I I2zDŽyPmϔ2cCB>1dv!+r$V<Ԝv!2HMB"ApcW:!\CԨ!=["zƙԍAֶ"XRiS(D %qG~H_\>"bW VT #CD )vBXmKt0& J˖ v `Y!7]VMtE  Dž دȫ۞Hs8鱔񌈟 B_?F/{}||9xQxgtzw x:|px WQ3 }TW^H|| 10}`CCv`v$ap0ByaHk LU ]WitptQ ` aBDJ_dyV kwe 3OUgI'$ =}!W$GL@9R{6H]x  PixhXywya$3!oP6  f0xw!ohPqw6uHmh8CkŔ[_ ]w~EI Q"KitYf ZHPX  uh@))!&_%dYɑi}i~)[Q Ў^Ep P [ I40 !GY 9 QcZHևR Wɹ+yh"b'X Wg@yzk9 ArAUx5 Aw$<FќҙH3Yяj1CxII{ !#*e 5I)ԹEa|W ѣ )יʨ (TIPp Uzy;";q Yqa1F ACsEGv'z8Ai8EY{Httf#8kX Ni.0 2sR ^pTeD/e)9A|p~ax z  Qo0Pp师HX@pPQfnfyjZ Xa !H,Zvl ZNJ:K'ic!u uzYh Zٺ,z2~f,H_1 .xh*1F՞mMn}Se%Wx܍ m%( @8#8,"`|> wQH@ `N*J?Q.?~ x:69 ;#^O!> T,a[fq+!I${7#(x9Qz^4 p>懐*SdMPη}>>|^y< ^ޟn JZ갮w qxaHGb8N@lX U>7HϞھBQ>^!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,y M:  fPǁ{**A`w".1( <H@(T'H`)'&>6u]{b{W,P*PO!p1`HT !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x x!=T LT2'Ta$ICR 'S4f|;S3@ WhAɈa}ID.`\r@1:IU L0` u@$ꃡ V])1V`L%1s%!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x `|ʍH`YpA@2a?e'Zde^af]K\ \+X7 8 X+ F֛N6d&p+[qkpk/Q!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x k`AdE M.p @  XUDŽ{IqA'1pgΛ\Y 1ǛAJ nE V@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,Rx8H*\ȰÇ#JHŋ3jQCIɓ(S\0$]ò͛8sST ѣH*]jTOP7 |իXjEbֳhӪ]`/ p*-x݋L0]4È+^ u˘2 v Ӊ%#u @M~*BC-N8N5-ӸCRGn>vEνY0+X$ӧoGX@CiOxRhZX"BP#s F 0(Vhfv ($'̉(b,h0-#8h#9*(@8)#LJMFHie}T^On%bdd \4flS`@EkigVgPT着ZAp!DhR1 QVj-@:ivz.h%<: lZSƪkI v+@6Q:0&V;Qj)i$y KӾ K!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,R6 H [ȰaÄ#BtHċTc=,ȓKZD)RJ].Q01eh΋6h%6teʔXEWiUT%!Nt@9C.`ҪuQג5$q DKMtuoA@N vȠ͂ZV: "p1y$S P(? y)@ fK C.@omL ӷmQt0 ``I0_l/ bubbletea-0.27.0/examples/spinner/main.go000066400000000000000000000024161465647402200203110ustar00rootroot00000000000000package main // A simple program demonstrating the spinner component from the Bubbles // component library. import ( "fmt" "os" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type errMsg error type model struct { spinner spinner.Model quitting bool err error } func initialModel() model { s := spinner.New() s.Spinner = spinner.Dot s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205")) return model{spinner: s} } func (m model) Init() tea.Cmd { return m.spinner.Tick } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "q", "esc", "ctrl+c": m.quitting = true return m, tea.Quit default: return m, nil } case errMsg: m.err = msg return m, nil default: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd } } func (m model) View() string { if m.err != nil { return m.err.Error() } str := fmt.Sprintf("\n\n %s Loading forever...press q to quit\n\n", m.spinner.View()) if m.quitting { return str + "\n" } return str } func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { fmt.Println(err) os.Exit(1) } } bubbletea-0.27.0/examples/spinner/spinner.gif000066400000000000000000000370151465647402200212060ustar00rootroot00000000000000GIF89aX /  !! 6!!!""""$#@$$$% &!&&&'''("(((*#***+$+)U,*W,+Y,,,---.../'0001112223)31m42o4446 +66688897999:!.:8:::;9<"/<:<<<=:=;===>"0>>>???A#2AAABBBC$4CCCDDDEEEF%6FCFFFGDHHHI&7IIIJJJKHKKKLHLIM':MMMNNNO(SOSSSTPTTTUQV*@VVVWSWWWXTY+BYYYZ+CZVZZZ\\\],D^^^_-F___```c.Icccddde/Jeeeg0Kh/Lhhhi0Ljjjkkklllm1Ommmnnnqqqr3Sssstttu3Tvvvxxxy5Wyyyzzz|6Y|||}6Y}}}7[8^9_9`:b;ck?l@nAqBtDxEzF}IHKKOPRSWXX\]_! NETSCAPE2.0!,X /  !! 6!!!""""$#@$$$% &!&&&'''("(((*#***+$+)U,*W,+Y,,,---.../'0001112223)31m42o4446 +66688897999:!.:8:::;9<"/<:<<<=:=;===>"0>>>???A#2AAABBBC$4CCCDDDEEEF%6FCFFFGDHHHI&7IIIJJJKHKKKLHLIM':MMMNNNO(SOSSSTPTTTUQV*@VVVWSWWWXTY+BYYYZ+CZVZZZ\\\],D^^^_-F___```c.Icccddde/Jeeeg0Kh/Lhhhi0Ljjjkkklllm1Ommmnnnqqqr3Sssstttu3Tvvvxxxy5Wyyyzzz|6Y|||}6Y}}}7[8^9_9`:b;ck?l@nAqBtDxEzF}IHKKOPRSWXX\]_H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~p[ڡ5Q'K9wp3>-6>4 [wp)ܲDLAވQBE=ߜv&08\ ss"dcfzmh0/Ft1>FB0Bn4н t54 tφACA˟qp6<:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6ppL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^) !,W!,m\ N @*$aC xbŠ1>"ń+ .p* NŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= a8@Fg>P*IJ %÷ʆS&CM}4ZIKs<ބNlO'3╩@S]:>CkGoA\5m 32ĕ, ᯃX8|(e5f+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$X3 ɆWd1g:x= %)0>{'"B%S#8' LLЍ3P7CJf-6`96Ҭ X) O]Mz"J\Qĩca :Zcm2gli&!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adxƕ)P>|ݚ8\'9|WD%IE"*PiNABi`)Y9nŗ (ZYjFe6֨3FMaWlK)q2pTw޽)acP?#`EMDKUDIXəI!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= r izl$/|$YLT3AlEd)T˖[ Pɛ SS fA\jEaz%lFn;sXNoFjIpk=-Xhc|8\9=l4*B%IEUNAB 4|вr܊/ASH&|RlKmܖD+bԽwcC/ALiwLL=Vrg !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.ad"ƕ,콛L>|8\9=l4*B%IEUNAB 4|вr܊/ASH&|RlKmܖD+bԽwcC/ALiwLL=Vrg !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř:\绢 %)( y ZU9{z (ɶ<Fncp) гŘDpŞ3y+ X泉@ aKQ Ρy ixk.R5ta#NM쿷% !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a-W"'% !ÇKP$ ;|ЀD*GBg])cm"YUyU[_SUݴyO޸δ1 t=L9[%_ɀ!,W!,PP@H*\ȰÇ#@E3jȱǃCVHɓEDɲK*CI&ØmY'F@9RѣRDʴBJ:Q)իHbT+ׯ6R,ٳ0]K,۷)-ݻO݋.߿U+yʖbμu3竞?OӧEEڴ귭[f쵵QF;n]pŏ-OWιBu:u֯Kͮ)H87*~|yOs=ό/%,?}` HFQ F`!,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,}H*\ȰaBӸpHŋ3jȱǏ C Qȓ(/|$$G4ɳϟ@:|ShE7X ߷`Z0:XPʵW08z1*`taN >x[>5dệ UY'*^8%"|77=G@ͺTA0^ͺˮ3&_TwG4^+t.P`rdA=08E`48׳ozbכּ@XDAA.L*.„Q-D`ӣ@ᎋOX=<*LA,`lj,Lې&b)uϫ0z@V 2֚% "lBI&!c,4.A,0Jw$/BM@O xuE=uW5AO4VS O)a@.9>t3T!R@0:m쒾xԹ@.P(&c@99==voRS `{83mEYo :! y=XdI`9H`"~ "?|ß`2 ` 5 { D 0AANB|p(aWP2 p$4!>P8A JHC FKA Ex,@zf"}9f%lC F7 !@$$b|Ʌ Ƶ$1̶,o wď̋2"+Gt3Ɯdgldd,Ł ^<ܥ7"r +/QIhxZ(H,0yM3<5l < CDF3# Z+k&`2؝$(A@ n+MmS쳟@R͂3E~Zt'W eU gA8ceG>Os V : :,=d\/.jl(#JCVb;½aic|ܰ6TbeK- A8.N Zu$TRւ]y[ۨփX @ѐӓQC6&7dr 2-J>u3 Vġ@& GbF^fHx}w!aH|{UdG V ^Ç` "Q1.KrVUE\&RJUXowG \ ` 0aVRa2V݃ @*F5@& ^׮(V1!DA p<0jÓL]Q 9APw Pb0MNLef|<"V,6ԅ BG-H⁴"-% ry$7 H y}`)bpbk ` -`ݴg C|p#1"蓑)]ֲ3B.)6@KR|H@mi' Xiǹӽ &(@ !n Qu 0 )[dו d8ȳk|̺"φޯq f9\1  DS|H v:Ow&@=>$#ba&7t}1= 1dbh&^C]f09A1 cheRsth )T@nvCV6̭'D00,'.,L |nw]Ö8.f~0ח)CB:HqwL ^!v'"% x(]zd=P] )6&2j`\v #Vk ܨ,*rFK LdcKUdXwoD,Wg=A1au nyXs11نJKt0 @2!Ґ#In70 3H Pzw v/8HR&6c @-U6'AЀQ8]qia|  !,nh Xb~-E@QaQЅ Q*#0#H(-1(S_2 gzq]s,v밄x(FxDTA1` p鸎muIx!,W!,W!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,!( @#lÇǟ?Y!,W!,W!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,} #evg삸AtQA~ n(hc@!,W!,W!,W!,} (]? "F @OWiHo>!,W!,} &X@ ?w$ #.Hh0(!,W!,W!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,W!,W!,!( @#lÇǟ?Y!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,W!,W!,} #evg삸AtQA~ n(hc@!,W!,} (]? "F @OWiHo>!,W!,} &X@ ?w$ #.Hh0(!,W!,W!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,W!,W!,!( @#lÇǟ?Y!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,W!,W!,} #evg삸AtQA~ n(hc@!,W!,} (]? "F @OWiHo>!,W!,W!,W!,} &X@ ?w$ #.Hh0(!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,W!,W!,!( @#lÇǟ?Y!,W!, &tኧ% ;H(q?\!,W!,W!,W!, ""F l#ÇFm%+]\ !,W!,} #evg삸AtQA~ n(hc@!,W!,} (]? "F @OWiHo>!,W!,W!,W!,} &X@ ?w$ #.Hh0(!,W!,W!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,!( @#lÇǟ?Y!,W!,W!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,} #evg삸AtQA~ n(hc@!,W!,W!,W!,} (]? "F @OWiHo>!,W!,} &X@ ?w$ #.Hh0(!,W!,} #?6@)#Jͅ^y,D@!,W!,W!,W!,} !ۧm֜O5y$"/=!,W!,!( @#lÇǟ?Y!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,W!,W!,} #evg삸AtQA~ n(hc@!,W!,} (]? "F @OWiHo>!,W!,} &X@ ?w$ #.Hh0(!,W!,W!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,!( @#lÇǟ?Y!,W!,W!,W!, &tኧ% ;H(q?\!,W!, ""F l#ÇFm%+]\ !,W!,} #evg삸AtQA~ n(hc@!,W!,} (]? "F @OWiHo>!,W!,W!,W!,} &X@ ?w$ #.Hh0(!,W!,} #?6@)#Jͅ^y,D@!,W!,} !ۧm֜O5y$"/=!,W!,R( H*\ÇJT"‰-j1Ɗ~ȇ%M<2J-drl [aæ8cbfL$RaS^!#ȫ&<~;V6>5ujՓ8 S©P8MO8F4,PLj?9Ŗ/ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R06 H [ȰaÄ#BtHċTc=,ȓKZD)RJ].Q?1eh3΋68 0Ft X"G'%iTe*Nǘ@)ݻ{pӪWגI|q:Kd&'oAŒ N7ˠ͂ tVo^: &1y$^l 0=:\vQe+NÔ9ʦlpD协6fL6>y{=QP\t"E}<添L..!,W;bubbletea-0.27.0/examples/spinners/000077500000000000000000000000001465647402200172165ustar00rootroot00000000000000bubbletea-0.27.0/examples/spinners/README.md000066400000000000000000000000651465647402200204760ustar00rootroot00000000000000# Spinners bubbletea-0.27.0/examples/spinners/main.go000066400000000000000000000035611465647402200204760ustar00rootroot00000000000000package main import ( "fmt" "os" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( // Available spinners spinners = []spinner.Spinner{ spinner.Line, spinner.Dot, spinner.MiniDot, spinner.Jump, spinner.Pulse, spinner.Points, spinner.Globe, spinner.Moon, spinner.Monkey, } textStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("252")).Render spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("69")) helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render ) func main() { m := model{} m.resetSpinner() if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("could not run program:", err) os.Exit(1) } } type model struct { index int spinner spinner.Model } func (m model) Init() tea.Cmd { return m.spinner.Tick } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q", "esc": return m, tea.Quit case "h", "left": m.index-- if m.index < 0 { m.index = len(spinners) - 1 } m.resetSpinner() return m, m.spinner.Tick case "l", "right": m.index++ if m.index >= len(spinners) { m.index = 0 } m.resetSpinner() return m, m.spinner.Tick default: return m, nil } case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd default: return m, nil } } func (m *model) resetSpinner() { m.spinner = spinner.New() m.spinner.Style = spinnerStyle m.spinner.Spinner = spinners[m.index] } func (m model) View() (s string) { var gap string switch m.index { case 1: gap = "" default: gap = " " } s += fmt.Sprintf("\n %s%s%s\n\n", m.spinner.View(), gap, textStyle("Spinning...")) s += helpStyle("h/l, ←/→: change spinner • q: exit\n") return } bubbletea-0.27.0/examples/spinners/spinners.gif000066400000000000000000000750071465647402200215570ustar00rootroot00000000000000GIF89aX #)!-/#1 %4! 6!!!!'9"""####*>#*@$#@$$$$,D%%%&&&&/H&/I''''0L((((2P))))4T***+)U++++6Y,*W,+Y,,,,8[----9`....;c////=g0001111An2222Br31m3333Ct42o4444Ex5555G{6667778888J979999M:8:::;9;;;;P<<<=:=;====S>>>>T????V@@@AAAAXBBBBZBZCCCC\DDDD]EEEE_E`FCFFFGGGGbHHHIIIIeJJJKHKKKKhKjLHLILLLMMMMlNNNNnOOOPPPPqQQQRRRRsRsSOSSSTPTTTTvUQUUUUyVVVWSWWWW{XTXXXX|YYYYZVZZZZ[[[[[\\\]]]]^^^____```bbbccceeeggghhhkkklllmmmnnnooopppssstttuuuvvvyyy{{{|||~~~! NETSCAPE2.0!,X #)!-/#1 %4! 6!!!!'9"""####*>#*@$#@$$$$,D%%%&&&&/H&/I''''0L((((2P))))4T***+)U++++6Y,*W,+Y,,,,8[----9`....;c////=g0001111An2222Br31m3333Ct42o4444Ex5555G{6667778888J979999M:8:::;9;;;;P<<<=:=;====S>>>>T????V@@@AAAAXBBBBZBZCCCC\DDDD]EEEE_E`FCFFFGGGGbHHHIIIIeJJJKHKKKKhKjLHLILLLMMMMlNNNNnOOOPPPPqQQQRRRRsRsSOSSSTPTTTTvUQUUUUyVVVWSWWWW{XTXXXX|YYYYZVZZZZ[[[[[\\\]]]]^^^____```bbbccceeeggghhhkkklllmmmnnnooopppssstttuuuvvvyyy{{{|||~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~p [92$J$Q/O>O5 y@`Q4 NRlu,20LĆ @ (<sT 0W0L;7-O6lS6J\\7O2%u]-A<B2)sj\+,Q7pS7w3yPP2ET7 IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6mpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw}!,W!,m\ N @*$aC xbŠ1>ń[0.v* Zp/ŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= NUFgq?_*IJl_ %bʆS&C]}4ZО?ZKsd_'mO1╩@b]:?Vk͊A\c6F2]/ĕ,Oᯪ᳈X;(=,f+ ZdiC !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$XI31g>dԡ'=|= %)?~1C%S# ɭPЍ3:VJEǏm`96ӭgv2 d) t^izJ\Q@yO?coܒa >3Zcm2gli&!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adƕ51n?8\g<E%IE*PpNABI0Y9n 3ZYO)jFe6֨FFaWl[kq,?E Dp{Aٔ0űaW/P?)бMDKUDIXəI!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= r pl$`4$Ypb3AlՃEd)T˖[4 P S fA\jEaz%lFn;sXyO/=FjIpk=-Xhc4G9lp) (SŘSE0)Fy+ 3&( OgrGHԵug)XG&]kZ_]!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a8c-WǓ_2 e+,P͊$=:!F*GB])> cZn"YUU[_SUݴy/% t=L9[%_ɀ!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$XI31g>dԡ'=|= %)?~1C%S# ɭPЍ3:VJEǏm`96ӭgv2 d) t^izJ\Q@yO?coܒa >3Zcm2gli&!,W!,PP@H*\ȰÇ#>@E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+SV]zש[ [_گmŽZ^ެ}[]⨍G|.>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,Pp~H *\ȰÇ#JHŋ3jȱǏ CX(S\ɲ˗0c\i̛8sɳO5KJѣHv ZPӧPJAXjʕՓ]ÊKlįͪ]˶SʝK.Kv!޾ fwÈN̸㝋KLydʘ3kxyϚ;MҨS=붬_˞56۸ͻݾ |)#_|УE+uϯk}ݿ~ϫ_Ͼ˟OϿAODX/x Z'Ql-SO=мd! vlFUd#υ4F\K-42'r`Dž<^50*$$5&xbF+5q =LT1I#qa S<4BADnCzxF\xCB0O'D?,[.@B"%_H,v6>i}#1́ Ƭv \!):c<BͰqBp"o ^7VpBxLGVb CLxYW;́,\ EhG.,|Cp;H|C8Jv4WA8G:Q!#Bn10;%> !#uw=J%Avyc^9,*Ze+˄R*EC9d;e21'"K\(t8l`-+XQe4$AC h xIWR VNs- Զzc U$X=JQh@*юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZBT+m}~";p?tEpU8BBpD`WV EY^E6O !hYzL" j"cE K6Άv gyb[As*P b!ͭp"0)' sr!'ʛ#7.vS{:x&C+\y~|]HN< -ː@8"HpB8#{dNȇ'Ҁu'1C` $Um 0淿 a(~$DLlyH1*ljngVDž2*2"]D$Ȇy!F%pN8*!lֲ%ڈ A…NhmDpяgBf6^s* 4H1"ĉ-FĈQĆ =.RdɎ&IV4bB*[Rd̗)OtsgL!,W!,^KHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;!,W!,W!,W!,^ LxHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;c!,W!,W!,W!,^[= @ AXȰ!CJtH!‹Vč1hdC QHȕUB)RFSĹH2?ti$̠:yt t΀!,W!,W!,W!,^ Jx(@O*\x0C>4H1"ĉ-FĈQĆ =.RdɎ&IV4bB*[Rd̗)OtsgL!,W!,W!,W!,^KHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;!,W!,^ LxHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;c!,W!,W!,W!,^[= @ AXȰ!CJtH!‹Vč1hdC QHȕUB)RFSĹH2?ti$̠:yt t΀!,W!,W!,W!,^ Jx(@O*\x0C>4H1"ĉ-FĈQĆ =.RdɎ&IV4bB*[Rd̗)OtsgL!,W!,W!,W!,^KHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;!,W!,W!,W!,^ LxHpA*\ #2|HQĊ-^XQB=NHRdBM6$$J*Yt)3e̗Uy&L;c!,W!,^[= @ AXȰ!CJtH!‹Vč1hdC QHȕUB)RFSĹH2?ti$̠:yt t΀!,W!,W!,W!,^ Jx(@O*\x0C>4H1"ĉ-FĈQĆ =.RdɎ&IV4bB*[Rd̗)OtsgL!,W!,W!,W!,] H`A*\ȰÇ#JHŋ3"4ȑƏ CIŽM\ɲˇ(9IM1 ɳʜ} Jt"PE*-zt S XbШS.TW"`xzYlڭ_^DJ6y5Z_k[0\ ТgWe|l0kՃe7w|xY bN{U-zޭR@9͢PXyh9ZoC!l8g@H_'TFA ~i@8@椺yEk0O;@Z鼑3`k" .dKl#-4p[ !c:PO9ѓ `N<<P 6؈<]c?9d![N=TDfX$S!Dd=ߤ"r1"Jbc$O=@&dP-hbAsY֝}&TZܔcYP$bACa)F;-!(f/ q:"@C͟^j'Z&! E4m* a'`84Bjh bhųGBi"fktíRO8"h"M=,$ }P%&ž$q("(ل,pZ!uoBwJK= %#T0 CMHB$ȁE@% Bi.U= 2*IJO.SBl 5B *RG S-Hko/d-(h &xb]D CpeTԃNv4Ȣ,4-5ɼ:>w0DK)@Z4$ AN vh5@"hϳ6|`Uެ{))e^  ZWe<4?fr$\G񐗼$J0n h||CD;0#r `C28#p9v6X !ZJ^mK9J<W&M[e/ \=p2'ja^R~es2*C@#LB%hLUh (x jC D$YɘEA <>EBBU줎%E4YlEEQ汍d\렢MPIUZdi^IQԆfN8{ N'|6IfrTH@!,W!,W!,W!,] AE- $(q!Ŋ{HJdLX\XI`Idž/VLq!,W!,W!,W!,]g`=sЄ$O#YGċaFs Jb4@%>> L2"2zzj@80RRI8钞(!,W!,W!,W!,] AE- $(q!Ŋ{HJdLX\XI`Idž/VLq!,W!,W!,W!,]g`=sЄ$O#YGċaFs Jb4@%>> L2"2zzj@80RRI8钞(!,W!,W!,W!,] AE- $(q!Ŋ{HJdLX\XI`Idž/VLq!,W!,W!,W!,]g`=sЄ$O#YGċaFs Jb4@%>> L2"2zzj@80RRI8钞(!,W!,W!,W!,] AE- $(q!Ŋ{HJdLX\XI`Idž/VLq!,W!,W!,W!,]g`=sЄ$O#YGċaFs Jb4@%>> L2"2zzj@80RRI8钞(!,W!,W!,W!,] AE- $(q!Ŋ{HJdLX\XI`Idž/VLq!,W!,W!,W!,]g`=sЄ$O#YGċaFs Jb4@%>> L2"2zzj@80RRI8钞(!,W!,W!,W;bubbletea-0.27.0/examples/split-editors/000077500000000000000000000000001465647402200201575ustar00rootroot00000000000000bubbletea-0.27.0/examples/split-editors/README.md000066400000000000000000000000771465647402200214420ustar00rootroot00000000000000# Split Editors bubbletea-0.27.0/examples/split-editors/main.go000066400000000000000000000111011465647402200214240ustar00rootroot00000000000000package main import ( "fmt" "os" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/textarea" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) const ( initialInputs = 2 maxInputs = 6 minInputs = 1 helpHeight = 5 ) var ( cursorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("212")) cursorLineStyle = lipgloss.NewStyle(). Background(lipgloss.Color("57")). Foreground(lipgloss.Color("230")) placeholderStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("238")) endOfBufferStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("235")) focusedPlaceholderStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("99")) focusedBorderStyle = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(lipgloss.Color("238")) blurredBorderStyle = lipgloss.NewStyle(). Border(lipgloss.HiddenBorder()) ) type keymap = struct { next, prev, add, remove, quit key.Binding } func newTextarea() textarea.Model { t := textarea.New() t.Prompt = "" t.Placeholder = "Type something" t.ShowLineNumbers = true t.Cursor.Style = cursorStyle t.FocusedStyle.Placeholder = focusedPlaceholderStyle t.BlurredStyle.Placeholder = placeholderStyle t.FocusedStyle.CursorLine = cursorLineStyle t.FocusedStyle.Base = focusedBorderStyle t.BlurredStyle.Base = blurredBorderStyle t.FocusedStyle.EndOfBuffer = endOfBufferStyle t.BlurredStyle.EndOfBuffer = endOfBufferStyle t.KeyMap.DeleteWordBackward.SetEnabled(false) t.KeyMap.LineNext = key.NewBinding(key.WithKeys("down")) t.KeyMap.LinePrevious = key.NewBinding(key.WithKeys("up")) t.Blur() return t } type model struct { width int height int keymap keymap help help.Model inputs []textarea.Model focus int } func newModel() model { m := model{ inputs: make([]textarea.Model, initialInputs), help: help.New(), keymap: keymap{ next: key.NewBinding( key.WithKeys("tab"), key.WithHelp("tab", "next"), ), prev: key.NewBinding( key.WithKeys("shift+tab"), key.WithHelp("shift+tab", "prev"), ), add: key.NewBinding( key.WithKeys("ctrl+n"), key.WithHelp("ctrl+n", "add an editor"), ), remove: key.NewBinding( key.WithKeys("ctrl+w"), key.WithHelp("ctrl+w", "remove an editor"), ), quit: key.NewBinding( key.WithKeys("esc", "ctrl+c"), key.WithHelp("esc", "quit"), ), }, } for i := 0; i < initialInputs; i++ { m.inputs[i] = newTextarea() } m.inputs[m.focus].Focus() m.updateKeybindings() return m } func (m model) Init() tea.Cmd { return textarea.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmds []tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch { case key.Matches(msg, m.keymap.quit): for i := range m.inputs { m.inputs[i].Blur() } return m, tea.Quit case key.Matches(msg, m.keymap.next): m.inputs[m.focus].Blur() m.focus++ if m.focus > len(m.inputs)-1 { m.focus = 0 } cmd := m.inputs[m.focus].Focus() cmds = append(cmds, cmd) case key.Matches(msg, m.keymap.prev): m.inputs[m.focus].Blur() m.focus-- if m.focus < 0 { m.focus = len(m.inputs) - 1 } cmd := m.inputs[m.focus].Focus() cmds = append(cmds, cmd) case key.Matches(msg, m.keymap.add): m.inputs = append(m.inputs, newTextarea()) case key.Matches(msg, m.keymap.remove): m.inputs = m.inputs[:len(m.inputs)-1] if m.focus > len(m.inputs)-1 { m.focus = len(m.inputs) - 1 } } case tea.WindowSizeMsg: m.height = msg.Height m.width = msg.Width } m.updateKeybindings() m.sizeInputs() // Update all textareas for i := range m.inputs { newModel, cmd := m.inputs[i].Update(msg) m.inputs[i] = newModel cmds = append(cmds, cmd) } return m, tea.Batch(cmds...) } func (m *model) sizeInputs() { for i := range m.inputs { m.inputs[i].SetWidth(m.width / len(m.inputs)) m.inputs[i].SetHeight(m.height - helpHeight) } } func (m *model) updateKeybindings() { m.keymap.add.SetEnabled(len(m.inputs) < maxInputs) m.keymap.remove.SetEnabled(len(m.inputs) > minInputs) } func (m model) View() string { help := m.help.ShortHelpView([]key.Binding{ m.keymap.next, m.keymap.prev, m.keymap.add, m.keymap.remove, m.keymap.quit, }) var views []string for i := range m.inputs { views = append(views, m.inputs[i].View()) } return lipgloss.JoinHorizontal(lipgloss.Top, views...) + "\n\n" + help } func main() { if _, err := tea.NewProgram(newModel(), tea.WithAltScreen()).Run(); err != nil { fmt.Println("Error while running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/split-editors/split-editors.gif000066400000000000000000002310751465647402200234600ustar00rootroot00000000000000GIF89aX!+ !!!"!9"""###$$$%%%&&&'''((()(P)))***+++,,,---...///00011120k22233344455566677786|888999:::;;;<<<===>>>???@@@A>AAABBBCCCDDDEEEFFFGGGHHHIFIIIJJJKKKMMMNNNOOOPPPQQQRNRRRSSSTTTUQUUUVVVXTXXXYYYZVZZZ\\\]]]^^^_____```aaaab cd dddef f fggghhhhhijkkkkklmmmmnn$o'oooppppqq+r.s s2t#t5tttvvvx=xxxy*y?z@zB{|G|||}0}13K6OP9TV>>???@@@A>AAABBBCCCDDDEEEFFFGGGHHHIFIIIJJJKKKMMMNNNOOOPPPQQQRNRRRSSSTTTUQUUUVVVXTXXXYYYZVZZZ\\\]]]^^^_____```aaaab cd dddef fggghhhhhijkkkkklmmmmnn$o'oooppppqq+r.s s2t#t5tttvvvx=xxxy*y?z@zB{|G|||}0}13K6OP9TV IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKڲͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL!,W!,nPH *῅8PD_ahfp9];zx꜍vV1)$9p8;%pWDDqTn#6$sNt.ؘ>@JqSlv !,W!,xPH *῅8PD ->Ĩq#Ŏ hQdY!qVn$H#V ܢCƒΉ;D_ĝ;nNKR Q#N|tUs66iRk~XQQo_!,W!,PH *῅8PD ->Ĩq#Ŏ3Zp n ٹsآ4"Rn9'ÛN$ φ7hBtG8Azwׇ̕2w*oqBB!,W!,PqH *῅8PD(2hQ#nƙ(`->xC(\)eʎ,c2T eÞ7KphЗ8fN锝_JTgRsV] !,W!,P|H *῅$JDN8w@ F#H&1pq(Q@W )kɳO,OEP@A{g9S|ű9lZl2lϕd:2 !,W!,PH *῅8PD ->BQ%- ܹn0dTJWsr)$Ɉ*Sϊ&,*@׹DrۧG-xJhUshm0 1M1mۤA!,W!,PTH *῅8PD ->Ĩq#Ŏ3Z F[re9tɜ)sDɏ'M)N?!hO!,W!,PH *῅8PD ->Ĩq#Ŏ D(4ssʌ!#IQ sNMے$ s~:ӧ͔6@\X!,չ>|u"L;秬A_9F,Fn_~!,W!,PH *῅8PD beah hqȎ )Q&p縱 ҡ?!f&JgG b8cm 6!ֆ KYϓG\:wnNY5 BOqK/D!,W!,W!,W!,P|H *῅$JDN8w@ F#H&1pq(Q@W )kɳO,OEP@A{g9S|ű9lZl2lϕd:2 !,W!,PH *῅8PD ->BQ%- ܹn0dTJWsr)$Ɉ*Sϊ&,*@׹DrۧG-xJhUshm0 1M1mۤA!,W!,PH *῅8PD ->Ĩq#Ŏ3Z9s<9fΉ!RatQ pNYMM 0 d7Ph@:Cs&T"խql$KpdVjH#9՛^!,W!,W!,W!,P}H *῅8PD ->Ĩq#Ŏ/Ĩq#Ŏ hQdY!qVn$H#V ܢCƒΉ;D_ĝ;nNKR Q#N|tUs66iRk~XQQo_!,W!,PP,H*\ȰÇ#F@E3jȱ#G xIɓC^Dɲ˗UVI͌2)ɳg̜> }SУH=MʴDNJ=tթUjeuW]vYeϪEvۑmw]u]w_} PÈ+NŐ :NÕ-_~fΝx4OMz/w_Þ+{ڶ}v7ﱾ .|+W#|yΛ!,W!,PS)H*\P#&t(ŋ>(P#E9bH0ȓ(q#ȏ%])ʘ3&JwμR(O@sy1iQF{F-T"P-u`֝WMzT,ҖRvMƵdtvڻfƥ{JnҍߏuZU[ĐLإcnUl72Bl9dev^Z'eL~{ཪ%|Y'oðv9᳭ΜO\1/k;wΣG,tۆM.ᾍ3M.XWDWuIMe~ jqMqVQ'!v}($h(J0b4X݌6#M#($8idAI.餈M>)%QNi|]eYn饆]~)&CUit=|fn gcIv޹ez^gS!,W!,Q[PB*\ȰÇ#JHŋ3jȱǏ CIS\ɲ˗0cʜI͛8sɳO F0IѣH*]ʴӧPs.p#իXjz `ÊKٳ>@˶۷fO@KݻxBA߿*È_>/Lˀb̹CMhS>["װc BKc ͻ^N\& œ+_4 ЉNӯk_ËO{ӗ_Ͼ˟OϿRwHނF(Vh7 2^$h(m዗} "fب-UK c!^*{ǎYη "I{Dg|m`kAA m-A f@,p- = @P ׂ)`PLU 79@zr;a虖zW3=h M~Xõ֠G|YF$ + w mgC  0H>QoRA >|@@J\@ Z4 d" 1i d  @1 d.3_R@9i!h0v:%pw1ZqTؒPE|'^ xhDw8YxaJ+\!zVGM hx<P)J|`tф!3>@U,mRK`p Z kp~ <>,L$E E4 h_ag LƝTPa A>~矽 hrJW {oM hE{ʨ/Cށ>§52GI5/H+paBӅGz: 3 p%@k*T A4AT h XP)Tj}dQr0? P$vqȃc ` .xiDyBye :7t(7xnn"f`#%Nhi19d\=Α4k?'fTQX ؅^83""gXvzh~Iч8E!xH8v(x8X(vXBH"؊{8!x8xp,Xq(hѱ0 @0Pޘ18xH񘏎4V9!Ɍa 9yّ`y $#Yq(Ȓ.>24Y8i7<.@CY|h!H9JєNP~1TVywZ\ٕp`b9lQfihG–n ka(QɐhьӍz~9i(hxXɎg18Iad鍢9NQYJF Y3ZyOI8‰YHyٜ҉YRqp8i䉋蹞֞ IXٜ9sȩi))t>|y8}ɍ 鎌h3 ɡĸ)j(-Z&/ڐ,3isYɣ:Z>AIZ1FHjKѤ NjSzUJW R ɥ˸)`je 0gdk= ئvIrJwJu) Zɧ] jg:IZٙبijꛟꖣzQi mz:o1]izʁ zګ)pIi-ͺY (FiԪٚz|zክښJJX Z *:*j*Z$JZ x+f ˓[IO+$#{d5ɲ*./);0.6˭; &^)7[FD[{ʥN=A*ZaڵZ+%_efH7nߺ;K!i3*˷$ )Ki ˸;ضˋ;ɹ Zs;P{S+`:;Bk<1 ۭkɛKgkҋ{[ԛӛ{ [;껾۾T {ojBۿ Q;̞WT0{ɻb{ \hnzj;",$\›»s0l.L57l3Þ>ܝ2 D|C|xíįĩ=JT\t!ťشX\ 3 fQc쥸[d<ʵk\ s'Bl|~tȂܖ\0zȈzŎ[ŢhɟɞɖI Ƞ| ̪|ښʪLQʜȮ ˮakhbp,\|;Qr|̿īΌ<֬՜G!˔`F<,|)Ȍ,<ώlϮ|Ϥͫ\|+_ |ɺL/m:!j;ұL(-- \2*]@8]X7/;=?ݧA=C]EmG]I-K]M}:=$Q=UmΙ  f,Rk .a\}v:iMJ+׀W (-رHؠՊm=ґ]z Փ֛Mѕ} Й^]s-0 t^v~xH~>^~芾>^~阞难>^~ꨞꪾ>^:3 vH6>P^*[f~ :%"*qla?'$^]^ 0Q<aaώ= /ONM@n?/#M@./o67`8Ay1 x&T@*Zq8[C*6/5B$I_K5DOF߅MOo W1:BY83[Z0`01H1^pЀSmuU?_u+61Iq*)*FA+1/?//_ca?O[vR@;LM.a1@3:L <q3>W0ŏ,^o?~[0KRPO7TRC I)!ʎ ɖ& >Č 6~xE(& 0x ga9-F&< "EG"[, $@"(!ɖ)&p|q ;hLjgӮ 1le AaB,y2Y6Բca8C3xh1ƎCjK_:y*t 'F U)ԇRZMĠ#HT B<0ѡ+[i$r}W/_ݏn[AC|yt̚{.NZ ᩈ*0vi@ܚa9Lr{($hxb Nt$,h"a ,© HSrTaIaA#A0L2#6!Kn$-*h*X- h0b NnO!ŇHOQ4n_C 79PQ# B$YAvZ2 @~Q\oq up3eVx#` IhH R8 OL}%\i-` 3H Ѩ; @OdT"$UK6*b.< Cr p44]+q-T293C6N hrJ0o#0` Z(pB QU/'?C$Mw?$(`J>cDP<B !5G΁S&4':uMby0iP P@h(6' $0aMf 5*QSsL`C kR՟5$÷Q,գNuOCR-4&܀, 4JrNC$* U[A a:e+-p$Xl,$@cd\80HvfZ-s91k2&Ƥ>%dS{JqȡXo{/5]hq.'LhWtͶcdT{P2?cH@gƄB)U~[/š/G\@w`ҕ uN`W. {"H?Ah$}CHkF+1r{jnIއw1oCbς4?Эng8ҞVmlb֍ @ӌ[)'@368%B,XUZKc;2 [uexy[㲿Μf"tw{nuD@o\$^q;Jj5V ^ J:㢵3>8֊iYKrj0acfh PA0О2̿6HOc'֖t54i4 HokJ->nU #envv%C*@gJ;Cǃ2-ৌ i_Q L ?i ?M@KX-IQDFD8r '??ux|= nPy B)ƒK&'V5#f)E,itd?$DJDLMN"PE"F(B(U  @AdAVt1I4pǘ+G8|-njx ,EC" ? ȣ{$ kHɂȊ4\ Ȑ|@9$ɐAgI䀉44H$3pE'J–g,ːFF (ɭKlħElɐxH9.JK˘0ˊ$SKIxˈИSj>LJ(1`Fv)ǏʈMԴӷN|LxLHLLP" `L'5 xˊ|IŊ x&8O`P\DBcAIc e͑BxЌP 5PPPёPI ElFP cѯuĉ2 2 &u'(*+,-./S)5m 253 24e6u789Ӄ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xf RHV "paBD"E/Vh?ZȒ OHr)Y2˙e&Ć "zh!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xf S H "paBB"EvZ؅Z,Ȓ OHr)Y2˙eWhN  1C!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xf RHV "paBD"E/Vh?ZȒ OHr)Y2˙e&Ć "zh!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xfH *\ȰÇ#JH"‹*jȱǍ~IɆ!\+-4Ɨ._hE_;Vݳ23ͣ q&PǞ %:UJ f=BjS[+̰c(wmSZ˴.]jM /޶`wg㈅7+ie%/X߾xSW幖s:6&f8QoM7ͶǏozm;j}c+mq[Ҍ˶|vaSV۶n䁹C]է'?pЭf dM} _zUb…tUc1Yen7&V׎sj8b~}wbke6[rJDۄ aM#J$I-TړT4"CcUF*`!,W!,W!,W!,fH *a8PD ->Ĩq#Ŏ D(<~aR>&#Ih~MVs +~:Οӧ6"MaHMX_.a:1LmE֠@WsR#@yFh/I{?j !,W!,fqH *a8PDT2Rhъ{(`->xC(\)eʎ,c2T eÞ7KphЗrO)JuTgRsV] !,W!,W!,W!,fqH *a8PDT2Rhъ{(`->xC(\)eʎ,c2T eÞ7KphЗrO)JuTgRsV] !,W!,fH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,W!,W!,fbH *a8PD ->Ĩq#Ŏ3Z F'MT)J+yR1dE|Y_-G+),&K~ c@!,W!,fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,fH *a8PD ->8KBQ%-Z?|0g]iEڷ{Q@}$TIMD*ou8Е?z΄!iTjŕ2Z*Zmj !,W!,W!,W!,fH *a8PD[ Z4he]>;~\GW"Z ?}ȏĨq#Ŏ D(<~aR>&#Ih~MVs +~:Οӧ6"MaHMX_.a:1LmE֠@WsR#@yFh/I{?j !,W!,W!,W!,f}H *a8PD ->Ĩq#Ŏӄh |б_郇/;zp@ O]&bɝrҠ;hEѬ|f#䵖`u,ĥg.DVc@!,W!,fH *a8PD ->Ĩq#Ŏ D(<~aR>&#Ih~MVs +~:Οӧ6"MaHMX_.a:1LmE֠@WsR#@yFh/I{?j !,W!,fwH *a8PD ->^D;~HPNJK`(A7eCL8  AJn01I lO_-&FK!ŘQ&E!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f  H*\ȰÇ#JHQa@!,W!,U[a@*\ȰÇ#JHŋ3jȱǏ ? I 1r\ɲ˗0cʜI͛8sɳϟ@ JѠ2F,hӧPJJիXjʵׯ`ÊKSSA``۷pʝKݻtTA ޿ LgH`ǐ#KL#V̹Ϡj~zBӨS^Y˞MmM*qo8ȓ?MBУKn4sسkNËeHY f?Z)tixGrי*蠄jH}y#o磐F*餔Vji~fv覜v駠Sk f@^z)f꫰*4&Ael*ѨM r&fHo<Nyb1 >zL/yWo{7Ps4#i8AZ!:.B|,#8FVxa%,b-cb%ư"cc,!HX"Z8/\(FhqQ$ABGC;H"~h )G^r A66Le2S<PV'l.҇K "ᢋp@X#&QB-aXBvB$xczx㧲'84!A]4 Z0ƀ#-TB8%2&-KT Z5IVB W0&$HKB%3M|&Ya[4Ѹ1Qӑ8ɡ@&#mHjr ɘqnޢgAicb)LY s x1N3N41tdž:tP|$HpCR% .8R4[jb [H4![ePD$L)u)A4'ḅ& DLiͪZuV\6Ռ^x$(Р:_^  @WOy\I]x8 Y< e$wk-0hE$KH:& hb5#ᒫԠf#G"ղmG*@N¾5n[+R-npbVͱd݄`!?H b0z^ |^DGNrAKLMH-)< +~G.FGWsk+bs'6c*hxǠuz3$ȟ IkDX4 nq\"ͫ{*USu@lcI LjKbsd\`8WN8򰇛EV;|(G7R2zĹn!8+4w$ +;B xr'<|Hnr|f<!31<ltge`xG.(B2P+]3k{ 0 h@ІFBYԊG-=\R\ I Xm~R[b}Hq8|ś5д>O+}O=֥ݗde>vA' dAV}_ n cuA|w=u/w 3r0b/vSiCKlQ$Í"q?K0\/$noY1D-a#/w'Y&gqpA*u 1'/p oC`a! ]7~8(~,*6gLQs\h9$]I;M@cWbfpT3ZzW,`(%?iHx0r Y[Xׅb؇~x&d؃͒w wg D-hpx8~W?=r^8uh%8!H47Xxt1ËX8GǸh،u%xnظԨ,(8x(踎X8x(h9y"b 9 ya⡑ 9$y!(a,094y!8a<@9Dy!HaLP9Tyt!Xva\e`9mdy(hoalS!p9Vty60x\a|Ir)Q8kv,9~` ɖy[iyٙTə 9O)HIC隲Y7DC{aJ[=۴]P+O;Z!VUW\ۗIb[[RAh[an;gMt s{y3zy۷۷v;qKQz˸Kwkt˹q빀 n+}Kkkzhw˺et b+qK_kn\k˻Yh V+eKSkbP_˼M\ J+YKGkVDS˽AP >+MK;kJ8G˾5D 2+AK/k>,;˿)8 &+5K#k2 /, +)Kk&# +K k +Kj  *Kj *Jj *Jjت *Jjފ̪ *JjȽ ɺ*JɷjƊɴɱ ʮ*ʽJʫjʺʨʷʥʴ ˢ*˱J˟jˮ˜˫˙˨ ̖*̥J̓j̢̟̜̐̍ ͊*͙J͇j͖͓̈́́͐ ~*΍J{jΊx·u΄ r*ρJoj~l{ix f*uJcjr`o]l Z*iJWjfTcQ` N*]JKjZHWET B*QJ?jNQ>Qs9傩po |)lI{ikxhwg t)dIٶXxv>}^WΨnYY.Ε週XN~Ԩ~AI/! R K2&`N6h!0pSK!4[ 1(`+^ N(`~;pP$np`u3R?ahG "?$1#!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,vf RHV "paBD"E/Vh?ZȒ OHr)Y2˙e&Ć "zh!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,vf S H "paBB"EvZ؅Z,Ȓ OHr)Y2˙eWhN  1C!,W!,vfH(\ȰÇ#JHE3ZAȱŏ CQ I\ɲB'QtIfE+a 9ӦO8#TiE_;mĠ BHT;ItաT_:0+OjڱXeƒCթ*X /Aq[Œu6 ر`~us<~rf:SҨF^jiaGPEM⎫{_ۺ̘jͣ>>q[a?g.5JwK{yPhVtF^D;~HPNJK`(A7eCL8  AJn01I lO_-&FK!ŘQ&E!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f  H*\ȰÇ#JHQa@!,W!,Xf,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͎;ɳϟ@NpH*]TdD8`6npp\`ÊK"CҎ*V^ʝKVt]z>֮ÈGl eS̹ )|ܗ_zp@˞M0f`]Io5ykv2,P0MNy =Cu˟O_bz뻷GGs#JwxC}LsS9@bKZ ńz zJQ(C@#(a!8<@)DiHeŒL6P.ϔTVXf\v`)dihleptix|fV)蠄j衈&J(T*裐F*餔fy%p蔕v駠**?榣꫰Ȋ'(VC?r+ɒ3X:F+-߼ä)@+v) ?6m覫L&=2lCIWE׎ {-Z#HKRHY|iÑƑ fC+}$Ys&ӤF>%Ǧ?1ԚV]! !,W!,W!,W!,|H *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,|H *a8PD ->Ĩq#Ŏ3Z$O`u]x͟5Y/YY(O,:K<|2ߵuޠ'Rvr޷Ho}~mh%?}VD6a'$G!~b`!,W!,|IH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,W!,W!,|H *a8PD ->Ĩq#Ŏ3Zة\>}ǟo[ rFāeL"OV 篩? JGZi篋@xXARNX̰5ӼkO?FY G#9ԛ^!,W!,|}H *a8PD ->Ĩq#Ŏӄh |б_郇/;zp@ O]&bɝrҠ;hEѬ|f#䵖`u,ĥg.DVc@!,W!,W!,W!,|H *a8PD ->Ĩq#Ŏ D(<~aR>&#Ih~MVs +~:Οӧ6"MaHMX_.a:1LmE֠@WsR#@yFh/I{?j !,W!,|IH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,W!,W!,|H *a8PD ->Ĩq#Ŏ3ZBAyDJ_U?gKҡ+ GO H+فtӨFUSt{V|*?T])0?~eZS]đa=RxT£5!,W!,|H *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,|H *a8PD ->Ĩq#Ŏ3Z+hEt+1g6 S&H=u&T@9ARJ`PO}PGZAϟYYY ,hŨ~T dZ!,W!,W!,W!,|H *a8PāeD(=ehѠ2O_%W튕uHR!@)h>Hx+LbncS]u Zن16@;Xr.ߢ|ڥX4 !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,| H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,|  H*\ȰÇ#JHQa@!,W!,U[a#*\ȰÇ#JHŋ3jȱǏ C(c(S ˗0cʜI͛8sɳϟ@ JѣH1ʧPJJիXjʵׯ`ÊKٳQTa%ڷpʝKݻxu{  LÈӺ2ǐ#KLnc' T̹Ϡv0rӨS^͹c˞MRMͻٍ/M3GՍɲA:س aË'βDӫGMAw2(W,@&S ߂F_Vh|,,w'@(Y!$h(,0xb?4h8<@)("Tu}"PF)6VϔXf\v%FjdI_fV޸p)AdxۙVY#jSTF̉5RS⥙i3o J#j**z93-H*묋'O".â0ܳ?%k,X">Ž(ꕨf~g) JR,P3.x5ԫH[m0kbYrI-r k-J+[fd*"Oyw_=,G^"+ŅI D1328-PUbX[>m6c[Ic;J=xc|'"sl=jG?=%øKn Sd].P 41zjU*ۅ?aH~af%ZE$ ~BDLGDʆkF/ P-H EJ\D2+h^n7n#0HutqDK&3Fr=Zɏ ~'ASAFS>̭4ML㛢X8fk<~qH>>'d";9Bz%oA,)Xβ.{`,oUyhNЙve2pL:ۙ/E[s=wMBE13- ? ѐ'MJoYьt~ @tQԨ&45jph5B3^ D\.)W`J-صMl.ϫWB<b3"`X ȶM;βGO<#,k~ lg%xMN8t]MȢ%7xmo@hF+,OЂ%XKqP)(OpN<ū0bָ`MzQ"Ǹ9ΒK%ƨKdp  Na#\X?sux-ѵNU?3 g4C%CM: e\EKPdЂƈE/8en=DjCzfJiIڤƤPgO:{&VfUS\d[Nb:daZ9Fhbg)namtZszezJTyڧŧzL:$HF?㨒*:ZNC1.*+zb )ڪzª':e":&L$ZdYE4Ǻ !Ԛ z bzDڭí:!:#ٚ}֚jDZAꡯ!yza Z۰;+ ; ''́"K[T(' B.!4!3{:+9۳@?;!FEL KqhR Q[HX W^K]d-{jc۶po;!v[u|+{i+;~{x۸[;s!+[w+౹[{ea+ۺb;_!\;)[A[ǻ΋$˛׻J;*;Oۛ 曽˾{KK˽| \ L ,̻l\!<#,% ')ܺ+̻-/1|3l5L7<9,; =?ܺA̹CEG|IlKLMޤ~!^#N%.')+-΢/135n7^9>;.=?AޡC΢EGI~KnMNO>QSUWޡY[]_~a^cNe.gikmΟoqsunw^y>{.}ޞΟ~nN>.ޞޝqY >~ݫM.^a~ޝNʾ{nϮޜپ~ֹ)I9n߾Ii ^ra$7.2rt+&`Qs`Q*݅4?0A>Cqq&L(pQCuu1%V*p p`Ughon/#Qvxz|~1m!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xf H*\ȰÇ#Jؐ~3jȱƋ=I$CM\(>Bfš6YJIqZ4iO4iqM:585; Izh(RN!E  6Ӷ XʺcՅ yۅVEXA~h%)C MوEYƑ&G`bȒED6E8F%K^1XɒVHF}HԊJqlƑDO>?h$\.4hcPE1&A-}mZJxV^5H|hqH%HR }ᧉ~G$ahk\:bIq*G^J pў&wЄ&zd&$U98ƒGJrVH 2xǑ)RVȅfXISG2f%,p* `7dE%I#aDžM fcLVP!BLh V`&=L"bZrbNgED!1@zdcsrBE !v5! U*C֦ӶzkNVrn+g# x&:#U| 0B`a4姖;긧0â*J뚶YSM~&Ye`rw,';eАnlj= A3l5ɫ2 @|_!;lbDSdl zا'F|zӓ= ePmx39"wAq8xq ZqQ2JHV(nAa%xeExB9P$im nBI";{HԜW~2.^qJ A kSs!ZB\P VcHuB3Xv~DMeW,x18E%,Ƿ1ABL0BF )!|@v!>;H6 ^PFh0!!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xf RHV "paBD"E/Vh?ZȒ OHr)Y2˙e&Ć "zh!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xfH *\ȰÇ#JH"‹*jȱǍ~IɆ!\+-4Ɨ._h?@^23ͣ q&PG+pۧOˢH TJ+WV ։L6eukڬ @]w6ەoݼ\`KU,VL3nhX2a1_wrdΈƝ2bɦ!:MکkqvuJm:qٱ' }0ݦ?N|/sxy;6 9mʪ{8΋H_z)ffw`e(OA V؅c}.WGB,hFmGQX{ ֒1iduLFyR %&!]XvR@!,W!,fWH *a8PD ->o^D(1ȊMt%ȁ趭l1K7L1gM=y ВA.!,W!,fH *a8PD ->Ĩq#Ŏؑju·/ٕS_|2ZJ>|V %+YOQѣI6}T)ScB:5ѪRk"5b)q-ڏjZ !,W!,W!,W!,fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,fH *a8PD ->Ĩq#Ŏ3ZrE>`K&RggG :~7A7ЕM 6QzJ<eXFu$4~b52+Yv:L%/҄vo@0q$G!,W!,fH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,W!,W!,fH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,fH *a8PD]bh2qȎ )Q`| ҡ]Ǐ&J+)gG+ dt7o #6#ֆVwM]ϓG$oN$ 'Ś`ڥ"ʀ!,W!,W!,W!,fwH *a8PD ->^D;~HPNJK`(A7eCL8  AJn01I lO_-&FK!ŘQ&E!,W!,fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,W!,W!,fgH *a8PD -s寣ǎ4$?}%I[Q&L6iÜYP f)NR B E!,W!,fH *a8PD[ Z4he]>;~\GW"Z ?}ȏĨq#Ŏ3Zة\>}ǟo[ rFāeL"OV 篩? JGZi篋@xXARNX̰5ӼkO?FY G#9ԛ^!,W!,f|H *a8PD ->Ĩq#Ŏ Dh[Ĩq#Ŏ\hQ )uc$d}Uo$HPtNƒeFDVK9QϣY߯goׯ{XvRyGѰQo_!,W!,fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,"fH *a8PāW`KfŇo=Lŏc17|ÇJWy7o~:QMLL)PTAZtiզ]F *JRL[bֵl/6k@!,W!,W!,W!,,fH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,6f}H *a8PD ->Ĩq#Ŏӄh |б_郇/;zp@ O]&bɝrҠ;hEѬ|f#䵖`u,ĥg.DVc@!,W!,@fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,JfH *a8PD ->Ĩq#Ŏ3Zة\>}ǟo[ rFāeL"OV 篩? JGZi篋@xXARNX̰5ӼkO?FY G#9ԛ^!,W!,W!,W!,TfH *a8PD ->Ĩq#Ŏ\hQ )uc$d}Uo$HPtNƒeFDVK9QϣY߯goׯ{XRyGѰQo_!,W!,^fH *a8PD+`-hP?o9zC+CZ)Ur Ei41W&=۷/OEu(R|kTgJ[UҊ:)Ѝ2c)V%W9ߪ!,W!,W!,W!,hf{H *a$HUD/@ #H&1a2|ݻ(ъj 9~<A%Ҥ!T-TĨq#Ŏ Dh[Ĩq#Ŏ3ZrE>`K&RggG :~7A7ЕM 6QzJ<eXFu$4~b52+Yv:L%/҄vo@0q$G!,W!,W!,W!,fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,frH *a8PD ->Ĩq#ŎRQ@XR5~80ϽxpfJĘ&Gh }rjZJK&ڗ/NI(Ė~!,W!,fH *a8PD+aSh@jXE8̾{#%TŎYvE`LJ$A~m$]MCM%r3~"%_.TLQ>1i2mB|JmU7!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,Zf,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s Ο@ } Vu>uţ/.թ4s瀴|0.Я1w {&¡ h(ϫ 0Kڴ3,񜮎aǭ_qpOS8|2'W/+nCRsNM ^ssׄsN Vt]zv"8kC\+Kx̽\{COlT #GDo1F )M?.?J9 80D* \\ؘc3D 8qN\e#QuE63 AD8d0.֬% 2c r9t4mxa8Ta Ve-5F"٣@@ )%\9ݍ9@ 6`V9'hG_qh 2̌ g1ܘs*3Ѵ)2hJ@@XhMD 9*c9\ n8I#l9.駡33 8D *Ĭ:wر +ZFb) łp-6<~"4 _kBݜ30 h\`sN^2"[&:@"!L%$!1` 2,#.Cb|x0&?@!C@ -F|YcξI Ĵ|5C#pc È_t(x @v8Ep2mc@CLP77;(P Eh-¯9tl.َNjAoP-qC3L O-3cDuy҉Z mbв;(Á҃2 J8nԐN+_1v #D; d!Y!?k~ splF 0Z8,Fc-` 3)1ELqV\س }Xn@hAv;@(/:Gpcݘ ~܎ǁp ;lN(*! PBp IZͯ~砜BTj`@ R~q.Uс#Wi4/T 4 ix91#z; Ȃr&.hJ3y&mr <GK[m!E87<0X< A. U8C\DX2!h-10R8ctg8bA,dE`H,̀>yA -͆!VbrJY*`U RJUlZH%U0͵NaXH1Ғ6D̈́U leEZ9=ŀ!T7T'4Ie dA l3)v8 3x6R`ᇜ.0f1;e idck-ms+W-#Z:$XA63'Sjɳ@щm|R9% X!|5_#Izއ`y'xzְc˞8 M_ͻo,~ ȁHΓ8УKg|zRسk]}KËT1MlH;ens-нl kJbkȐa$;Ú05@(x (-3(k(D aF5怍3 qC{ d"s(шY0E4cOD@ŋ,!W`SIx >ˀz4 d f9K8J 2hW(KZM$!gHmGBr<$/RJ\ ~(&( Nt!$ X:Zpy=@Vip` y@x&-!0GoӟXYA2r ;4ق d{b6mN sC,F(! Z<H )eXF4(U)K]@2w D@ DX~.0j!ȥ P`ZW`zδ@` @y~^!)6?bH$=N@" dU,j;243$E78nj݀F£b=l- u3ȧȁeXz.$*$23c`lm Z37#4@ `7kyT^#2x:! G24q " bu~n1Nۚ,2ϋS%@L"HN61P2*KXβ.^L*xhN(ps|f9xγ߬>ktq0hЈNa eīD\1-P .bArD/>b:tD@G "lVXTP.e1#Q1M:pq/3y XTq Jy>o@# 򳊕"B2  &@3q 8#H2hA cĢ02S<6.#F响uU(#, I ]&{(Er7܉}-1!'HahĻ@V|KD9VSr@))<# p)1B&!@a{v &w!$"Ƈ|` ϐviF@z%+ 7TR} 8xwW"g p`b,6Ra&L؄&!+ *j?  p} 0sy(7v @ ? 0( ( 'ðu\H{$x||o-p2J!wM(Z6}ovq6ppFaN)V)x(m|8r {h p 6$nxYsrǁ1 xs{XxPihZwkwwkp(q8<0e # ؏NȊ(Ap_(  0 O0 p_pbGp77s a{"hGu h(`spI$lG}?X}ߗwx7KV i8&GQ7)X*[ Sp (6ő l)!P` b449@~Ž5jҧHeImK& x @ixVIl#LrG6l &;l'Ax%P EPbp{ )`Qʆ) P(A |$uv෈TG7Xvte10t uy#Q(\r* `v T̀@)BYi@ (|q:Ɇp, {؂mUqv9YB僒8߸`P&` 릠[gdu,W׍"a"@NqZ-e"{RzFx*x9 QAI{zz; T eYzOcdکbڪꪴZzګ:Z;vD Iĺڬ:Zzj F4::Z披^Iʭ :ZLʮW@ :[+X몯q°@ z"  [ j۲.!J Z 0 WP, B;DK2 I4[aj +E[V{يꪴi: Td[E{!~ʟ =PckxCXGI+r~K㑫m@ vz;;|艠(1#H]=A[ۺzh![P {;c\& P )IaPн0;;Zr۾;۱Z ۿki+{ h"<ë*\\1, ,Z2םЅ8݉{c Ѳ> MٝΦNڪTڮZ ۲]DL۶ױغ Լ :ܭ1MƝȝ/ܨΝ}=#]ָέ?]޺-ޤqޝ-"Eًύ ?߿=;JKxٹ+ ^>- N1$&(ü 24I79~N;=6E<~HJhm1N.PR>\qXZ\bdNf~}}Moq+N~qtO<.8蝑nŔ.~Q遱ĞI<Q~ĨS^ӭ><\zq~ún5uN~+Mr^ |pڞl1εqIs~a--ƙ~{ J>-Yў,?_MoO_I9dQ&?n(?*-a4_e689 ^BbDF ZL^NoP"5UQVOF^ƍ{nei|&1m^E & VT)?͉_]j**?星hL!8ŤN_/n,CÿgpN"N  >.]8lڏ H-õs<@@ DP >QD-^ĘQF=~RH%MJ-2tSL5męSN;UfPEETRG6*rhTU^ŚUVO~M8Xe͞E֠W[ŶW\u? m^}o`{ FXb4Xdʕ;<3rfΝ=Ɗ4ͣMF:h!K[lik|}[nޞmC$@o @Ncʝ?ۡ ,$an/'O}"uصG&$pa7~={0@Sx t@\B /@ ðC?4IC9DOHDIDE_HYF1@oGrToG$6 H%3PC NDetOE4RA9bP|RI7i#nۮ̯Bc&8a V a$Fb7v48<6 dOLFTegMLMXo]Or|PgS g^_}/V;UV[d(0/2xڇ~O~O_ P$ a x@%00 dF~K-= E|, nB.JB8) iP7dIB`C$!}8D@/R!H@KEPD%1WLJD,vQ! @ hE/1!ZոF6эoc8G:Pu!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,U[a@*\ȰÇ#JHŋ3j(Ǐ+Aɓ(S\ɲ˗0cʜI͛8s)cȂ JѣH*]ʴӧPJJQ#Pʵׯ`ÊtA ]˶۷p U[ xLs=ǐ#`ɘ3kޜCeŤS^ !X˞M{*c׵sޝuPy N;Dē+ό\`ˣKLADسǽC>xq=R { T~O>Y_( X @ ~ 6(ax NhvFxUb_C %p`5FWA|A8<^%59TAF ~| 0H!%1]=sIW 䖅IT,P@P%3eGрGtH9l 2d /W>Glu)6 X &\ɕlaBVdXDHJD1hP=)R~4@M*3w9SRrvgRJ VA 0/ F Ї1C1dv.4ӊ/0FH20nGc3|Q ]rg쑨?ɺ0-30 1ƈ.Ab`@4r@dm̰L2to[-cj p dW@=Լ3{lԳ͜L3! A # $ߧBݝTb* @^3 ?#zgnc8 2}Œ1f!3\r892#Q2cL,,ʘzG;);0 z3.:N|zde6+٘#T8 ^\GD9M  e ( 'R<#BSxFcA jP1xFp yJKŞ1`O DAS g4{x& RtP `Gt e5 iWD!Q1x!zC@PFPqx9`/(P(ySp >!3r&/3T!LjVG^`Ž )4VbgL#A<`@) f0h ďxR @@WƣrD&0̏җӘKN#ʶhl3|PaA2[T9dPE‘+;B#7@eP2'+iJB'{% EɖPD(#A@F#@PԢA(B:ҒvϣA٦G4 `2NO :ҍiVaw6nyOx-'` `Z[!ZW;5q[[x K 4&q12`,hW+Bj#"1ߌ>{+񵧓:qWZ[g< qZ~4e%@=BZ<́#pP"dP`.oC q5'[n1ϹXR ,:ϣ꭬;H %CTrjg9J/eǔIhwi`!y'jvЪpgg Yɏǂ P zZlA &AwЌPhY9wX)8jWgg骤֊*:G { ;wH:y ?kqGW[p!| {~Ѳ.02;4[u8G'$6۳>@B;U9dzDL۴NMkAAGHhJ XZ\R T[u A*p]jlK_+xbsdX`Q`mzi;; QD[vF|@6AK1@frV+ E7B & QP{K.".;īۻO QZ{;Hk \E ۽LK7[{{+ a\;0 UveL@aa% 9[L2\,KB"$ (w%|(!#2ܽ.2x6|<- XD}C}PA> -;Ml853 ,.Ml)$ ,Ml ,Ml ج ,Ml̬ ,Llڽ ۺ,L۷l۴۱ ܮ,Lܫlیܨܥ ݢ,Lݟlόݜݙ ޖ,LޓlÌސލ޽ ߊ,ߺL߇l߷߄ߴ߁߱ ~,L{lૌxu r,Lol៌li f,LclⓌ`] Z,LWl㇌TQ N,~LKl{HxEu B,rL?loU (HKg:ѧ$ ' Kg b'UJ_gcJu!u#o%y^Vw;P(IGhH>A:'9Gg1''FgbO_' ,Fl$k5,OaD^gtq?Gxuz7u_?9 Fӕ`{JWtWV"PGbIHA":GLbIrroT_ɟǯn$?۟ݯNկ"o?"/O?߾_"!@sDPB >QD-^ĘQF sRH%MDR#HUSL5~SN=}LPE RMTZPSU^uV]F5UX5EV-GWn˶s[-^}XpS . b2 7bɕ-c||Yf9=0shҟ=Fytj֐O-xulځ_-wvnqo6nͫ"w(sՍB='usb^%wU7>$yCw"{+·!}/30?A[+B ͻp40C4DLT[ԎE{qd1stG| H$k;rIޔt& J*SJجԒ,LK0?rL4S24 @6[MДS5댎N<s>e PBe$TAPHztR$tJ3 SNKOkcAFGU@5\0Ub]HdMh˺L"WacC cM :,xʲ%h݌8\܌\@ArۂLP^P]{ Nؗ J(wN88ct2b/8c7c?9dG&dOF9eUhr9fgfo9gwg:h&h!!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,[a@*\ȰÇ#JHŋ3j(Ǐ+Aɓ(S\ɲ˗0cʜI͛8s)cȂ JѣH*]ʴӧPJJQ#Pʵׯ`ÊtA ]˶۷p U[ xLs=ǐ#`ɘ3kޜCeŤS^ !X˞M{*c׵sޝuPy N;Dē+ό\`ˣKLADسǽC>xq=R { T~O>Y_( X& 6`?F(Vhfv (~x J(c?0h8$!;E9qHb!| ꪬFщc)ʡRE^q?*i-vAӪXBF+%+I)Sk6<#J"^ 6`_]a̿zL/ԷCИav! .B|,#8Vxa%,'cb%xLcH%GbIL Jr$D`h4I%q$$P; $t !IhH`W /70e /}ZR k!I  "9ZT ~[TІ Wfh""I%;&#xh[1ʋ c\ ̲!ݕ2"-IAWEwpN:zhEᚌj&kF|nb:I"V0@?AZ - -h}c9<(Ha/ e =^a"_ J,AhD .]~C?\hOԈ Z BdieI\bAMPU{Ԁ7Ŀ! C& nxtU4lqaPAr 5 V!u |43+LA:6 ] рH9?M$#4+ZAv%m[q!̣0K*>Jŏ A&ҐÐr=Rpr7HH 8Av!0qEltKqX+9NqʒTe0]*sc0Ip+ȴ@ЈNgIАV BgјN{AytG]I7 P2lBQs &] ָ>4A"jRi @\p^ \xF,nA8x޵~mG!xF 2Z#(38}AV Vcko*y!EAn9;.ьVX An 'SP (x 5a &EqE,? AQ HA|.Pnj } YvA`-i  @@TА4Ch3pQ$ 1bыC@P)d7d'@ M?Z'*ag<! 3ps9Gtz@/R=DCzaJ*IڤPO:!VzU\J[|baZyAhgqn&'tmzlzyڧc::`!bř:)ᨒ+ZAdOzLa:7sڪQj:G:DJCZoAȺoͪ-"Zڬ*ۊZʫ*嚫jʫ: jڪ: zڪK{ K [+[!˨#+%')k+˨-;/1 3k5ۧ7;9; ={?ۧAKCEG{IKKMOQSU[WY+[]_[a˥c+egikk˥m;oq skuۤw;y{ }{ۤK{룋K룕[+[ˢ+kˢ; kۡ; {ۡKë{Kͻы[׻+ۋ[˟+囟k˟; k۞; {۞L| L \,\!̜#,%')l+̜-'%~^-+13N)7> 9^;N5ޟ/.A~?=.GEnKM>CQOIW"YN[nU_n]caSެigmoΠes>$uwqky{.^˃.}..ˏ^C-Fq/N1! 0D0p~&.0鲎.ױA7g?"4Z|wvQ&׎P>%n'`qZ;?_;!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, fH(\ȰÇ#JHE3ZAȱŏ CQ I\ɲB'QtIfE+a 9ӦO8#TiE_;mĠ BHT;ItաT_:0+OjڱXeƒCթ*X /Aq[Œu6 ر`~us<~rf:SҨF^jiaGPEM⎫{_ۺ̘jͣ>>q[a?g.5JwK{yPhVtFĨq#Ŏ D(<~aR>&#Ih~MVs +~:Οӧ6"MaHMX_.a:1LmE֠@WsR#@yFh/I{?j !,W!,4fqH *a8PDT2Rhъ{(`->xC(\)eʎ,c2T eÞ7KphЗrO)JuTgRsV] !,W!,W!,W!,>fqH *a8PDT2Rhъ{(`->xC(\)eʎ,c2T eÞ7KphЗrO)JuTgRsV] !,W!,HfH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,W!,W!,RfbH *a8PD ->Ĩq#Ŏ3Z F'MT)J+yR1dE|Y_-G+),&K~ c@!,W!,\fIH *a8PD ->Ĩq#Ŏ3Z F'MT)ʏ)aXRfK]޴gÀ!,W!,W!,W!,ffH *a8PD ->Ĩq#Ŏ3Z$O`u]x͟5Y/YY(O,:K<|2ߵuޠ'Rvr޷Ho}~mh%?}VD6a'$G!~b`!,W!,pfH *a8PD ->Ĩq#Ŏ3Zhj?~ ɟu#RtR OXMVXƟ {G^< "P ? $?oP'Ym>$e>XTA (Ođ5Qo^!,W!,zf}H *a8PD ->Ĩq#Ŏӄh |б_郇/;zp@ O]&bɝrҠ;hEѬ|f#䵖`u,ĥg.DVc@!,W!,W!,W!,fqH *a8PDT2Rhъ{(`->xC(\)eʎ,c2T eÞ7KphЗrO)JuTgRsV] !,W!,fH *a8PD]bh2qȎ )Q`| ҡ]Ǐ&J+)gG+ dt7o #6#ֆVwM]ϓG$oN$ 'Ś`ڥ"ʀ!,W!,fwH *a8PD ->^D;~HPNJK`(A7eCL8  AJn01I lO_-&FK!ŘQ&E!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f  H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,f H*\ȰÇ#JHQa@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,PSH*\pG#&t(ŋ3jȱǏ CIɓ(S\ɲ˗0crF(r:89 ,BOH*]ʴӧPJJի[7n!7HUقhʝKݻxw LlEbԞc qǐ#KL˘!qs6  pE (\u  L۸s޽t(K4ZA%Z19qb4KVpZ7s纉4zN:kN;x l͜g vTaO"rF( KDCy49582N8ODY7PaK7 u a 9s89 s#|h#ȣ? O̸(%4M6N0b'Xp)t)P+|8 d9;.bZ#KTL( *y(as `@Ü#@HE W Z衉ک뮼T 0@>8ABGKA=sJx@ MzЩ_筷ꥺEI`qN0@C* @6 qcN̞,,I `' 7G,WlgsP+8n}191PrY [Щ9`.#O@ӌ@CLLS2+}Sg"xy] 1A\P $)v4@*D9@ 8Z; H]ibe@ QMrdp_@$WTĈqʴ@:z35z+X,>]&ƘAJNhTt^bH6kS>Dp [86>0G(,c B `Wb ذ6{_sؾ"1B;[hl8`@&pxkPQ(xQ("h,6H8(3Qyc1' df>l'^\$'$R#*r?G# )^&@5!$Ü*eÂUD̥.b]#HrUdL2e: ̈́ .jZ3Ѽ2nz&8)qdf:YN:IеS ˧>~ hǠxLBvOD'JъB<(<ю HGJҒF=q>ȥ, HMJӚ8uJ-wFllG`Z=%SRcPTӊ YA*S )W!2V(`%Wyְ,+S!ԩxͫV Y ٫ZӊVTՈ\֥,.g%[#عrzͬf7kSn3*e [ٕ,VƎ$Kd:YZV7unwۀB7NDDk[fvljT-Ir;vas0"ؚb)sjUu9noKRІ6vع5^{ ` K%o{ |aX0{{(>1~>-Ŀ0f11xup*;˻!K<&hldRL{6s$ƊS.o"^ zƬ,~#.*a)ɘiUVOn`8v"r-{ѐNA&=2c{:o1\G<8'ZČU0` Z̓V3 ?Zetm^(%[̶IK4;Mh>9ɰtIB6.msE{<:^+_#%hNgi2vpo;wz\[}7&xm5p|ԷA nzݕ57q~zO>ȱ#,hm+ۭ^ʫgߘæ2# הgaN¹9񰵻HO>Đ>w-`XuĝlPDmKm \}^;&{q:2NOeodH%zkGǻ't?q.͛}ҫZ̷枏| zѻޤ3[lwCay|o3BIϾJpײ㑈~o?y?H Y_v'xyrVaHwlXk`rvg,E ht/AvlDfmjrr' nf_W~vV:XccgTnGs sy xhZ6H)r9w(dWm&pWqDX`MLxxa)uugDTkeEt?HGhNaqa-q7؆ׇ36gzxȀ8GorfT}&juצv8䉏HrWh9sdɥ2m5Nn(vyXJa6]sw_]@RQ[mxv|al{88|-AwsDhɴç}|(|X8O؏ N8Q X %K Y)IY"x#bx%%XȒ0k1a.3y?˸x>i?DYdUHqK IQ֔NiZKi~`ٕPdy:)xnYRɒߧoYhFY|y}ٔz99]C i Z٘Iq9OiVٙ4Uyeyٗ9vY閺])9řE՚sٖ|IgǩI։T9uY/ hVfyTyoyʉBɜyɚ)) iʟʏ ȩ Z١ʠ:)Έ&ʡ%-Z*H26͙!𩔉i9Iu)G0i 6٘9xɣ7Z]vd(`ڄdje/yHlڀpsWv~z}w ๦zVڨ:Z:w|穜j Z))^HUi]>Jᙤ_i9W šZyJʺڬjH JJӺk٭z ~YVڇʍj ̪zҚ>|:3EکjxuM* %)Uji ة j}!\ȯ$&{*ڲ(0);#kDz:k9+}?۳dzBKD[$ZH{JyNˢM̷Q ɰ _J ˭Ilk;UI vx8|kV|4HL+۶~aڸ+[[68kD[{۹G{>y{s纬9q\S5{'Q۵Iy:o{fK Y˛něMۻҽLE+{竏K[׾‹!z;}QH|| Lc <[뼲9uk{ La˜# ),{һŸXkSÃ< 0|?<Ĺ[F>LlNRQ\LXW^`d Z|%j}MЇ{}ѭ9]Mё|匑[ͯ!L["̕YL%< `k7i9"S!LE=IiHKGK,V]C1k`[=ׇf-eֻ֗p]'ns]r}Jz 'u]Μ34<&5 e[͐͸;]p|É ֞ :IԥMIԩϡQ_ڰmנ=`Kۄm ׾MZ۞K==0]DԲ=ݹ mѝ>ʜݟt͇}V*9?<ͫݼݱ-mߢMިN' ^tu'=NN!.#%')+~-/4=̍S0 6Wv7HJLNPR>T^V~XZ\^`b>d^f~hjlnpr>t^v~xz|~>.>X+~lT&cgA]WjR<` igv~6xhÐUr"WX_(wM VZ}fyžX4x$iIe^HfL~inPw#1n'&xaVx=8?sֆOhv(f^vh^zHoj/g_og`,7t`Wk{1_8퇪_uXT.:_y'OrxX(6?px9.f 7dx7Hjhνdp?sͨl6zsѦhA)l=谿8v~pchpgs\jXx|! Dh0@  É#Z\PF=~RH%Mʋ*A”Gʔ͖.5I'ŚwN ڱRe -qhӟTy:zuAYٓKH=:6հfۢ}[I *2j^\=tǼnJ-["`s% {8㓝=Zܪ~dMSwb7>hLedsZֶ ,״j+G_v_m<9dplB?+}ڭ26a߬4ȣD0A?lZS@COr+ 0s.ԶP8Jdq{:pDĢh0<GLB n-#*42Ro74Gj<'_,B+y|K%ܲ6/D3M5T$o$3$#ٸEs@9;/X nO@N,ҽH,$LL1[s4m,>R UeU43a[/ԵWwe3Xa/KB*ԚC>X'#tWmtDC%Y74M?-[d?x%pI-eT_)u4q}X\dWxu`8bۜ=` -*.@q᜘KK/"rL7lf$W{ØKw~ϓl:ifiW~:j!j:kk&lFwf!,W;bubbletea-0.27.0/examples/stopwatch/000077500000000000000000000000001465647402200173715ustar00rootroot00000000000000bubbletea-0.27.0/examples/stopwatch/README.md000066400000000000000000000000671465647402200206530ustar00rootroot00000000000000# Stopwatch bubbletea-0.27.0/examples/stopwatch/main.go000066400000000000000000000041601465647402200206450ustar00rootroot00000000000000package main import ( "fmt" "os" "time" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/stopwatch" tea "github.com/charmbracelet/bubbletea" ) type model struct { stopwatch stopwatch.Model keymap keymap help help.Model quitting bool } type keymap struct { start key.Binding stop key.Binding reset key.Binding quit key.Binding } func (m model) Init() tea.Cmd { return m.stopwatch.Init() } func (m model) View() string { // Note: you could further customize the time output by getting the // duration from m.stopwatch.Elapsed(), which returns a time.Duration, and // skip m.stopwatch.View() altogether. s := m.stopwatch.View() + "\n" if !m.quitting { s = "Elapsed: " + s s += m.helpView() } return s } func (m model) helpView() string { return "\n" + m.help.ShortHelpView([]key.Binding{ m.keymap.start, m.keymap.stop, m.keymap.reset, m.keymap.quit, }) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch { case key.Matches(msg, m.keymap.quit): m.quitting = true return m, tea.Quit case key.Matches(msg, m.keymap.reset): return m, m.stopwatch.Reset() case key.Matches(msg, m.keymap.start, m.keymap.stop): m.keymap.stop.SetEnabled(!m.stopwatch.Running()) m.keymap.start.SetEnabled(m.stopwatch.Running()) return m, m.stopwatch.Toggle() } } var cmd tea.Cmd m.stopwatch, cmd = m.stopwatch.Update(msg) return m, cmd } func main() { m := model{ stopwatch: stopwatch.NewWithInterval(time.Millisecond), keymap: keymap{ start: key.NewBinding( key.WithKeys("s"), key.WithHelp("s", "start"), ), stop: key.NewBinding( key.WithKeys("s"), key.WithHelp("s", "stop"), ), reset: key.NewBinding( key.WithKeys("r"), key.WithHelp("r", "reset"), ), quit: key.NewBinding( key.WithKeys("ctrl+c", "q"), key.WithHelp("q", "quit"), ), }, help: help.New(), } m.keymap.start.SetEnabled(false) if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Oh no, it didn't work:", err) os.Exit(1) } } bubbletea-0.27.0/examples/stopwatch/stopwatch.gif000066400000000000000000001602511465647402200221010ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566677788897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566677788897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:4檫Z1,ȶh,6ⲻ:+m: V+,r-݆ӈkn䞫n.y~E4ojbpHkpu@$TK;QHGs=$Q8<&\:. .|,@b81F*D`A7MQ"M4vĴ\6Ҕ,w6m_FO-/hݰ*,F-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP Hഃ&,p‡6Q"C-ĨPA=  3>Ff4E*IJd"- %ʆIS&CCҌ}4Z0@Ks" ΒFjO%I╩G҂]:;kͲlA\uI4 12$mĕ,p&u1X 0i(f+ ZdiC !,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.a$H`3%gJTᬧ1f=_ %)p4h%B%S#FN JKЍ3)-Z;J-.`96' K) %HzI\Qрl$c+Va 6RZcm2gli&!,W!,W!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"G$HB+6 &I3k^)0M9sMCi(ZQN>Z T4c?9⼚V;oZd?5lUupu,]+2Җ- D@vTkC 84䴔,c֜I-!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.a,"řj&MK|g3~5PIR1iʀԳS|\BbW9 #mYA2Ҡ(4_g\K^cmOقaҭX Q2))ڈqGkzF+X2 $Sh(mJÓ7Y1fJ۳eצe@!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.adXƕ'9P4i8\0iѢ&D%IE!@YNAB#Y9nv&ZIjFe6֨1F=aWlTBq,4.pTeҖ-))ac|P?#PA%MDKUDIXəI!,W!,W!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.aLI@K6p4". I%4i't8%i: GiZ$MΜI$4SZI &I iJڞ GZ_Jہ;:UIZ hT]!mfH#`9åTZ u@fG٤(P1g0@3G#LL=Ƥ\rjG2 !,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.a,ř|z&MZ3I S9J3!TlPl8g W 60ყ  iϳ-g -Ror$(J\J#)))`WgŢA; ZHUI&`)0 iSR6l۵5}2 !,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"G$HB+6 &I3k^)0M9sMCi(ZQN>Z T4c?9⼚V;oZd?5lUupu,]+2Җ- D@vTkC 84䴔,c֜I-!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.a,x3|xMh8Og|JR)ihpgMUD[XA 3Ř@|ޔSO19TqvfOA-5VҜMh社)MQi8 8F/>m`*`,M"j2ǘ)Q&}4ܓ!,W!,W!,W!,P Hഃ&,p‡6Q"C-ĨPA= R$Ƀ6l45AkyL$mδR 6֌ -*fҤp[Ң%aӨx|Pt՜1%"Kڬ mJSAБ_h9-XH{W@ϰt⥨w j=g$-8H/E6Ωg皟9=ZG!,W!,PP@H*\ȰÇ#J\(ŋ'jȱǏ bi1ɓ(S,Hʗ0cu?wTE`@O .Sa2MH!L^R@!,W!,W!,W!,Pp\]H *\ȰÇ#JHŋ3jȱGCHɓ(S\ҤH-cʜI͛_ɳϟ@*YPѣH*HҧPJtԫXjeZU֯`FMhѦepݻvS `Y").BVߵWMmC oZ * +Z~ž(I,!6pKso5ߜNJ2 )0XA _; -E _ $4(T+)}}).Tc5\ܟ4}ۣ e.+ Kx"침4%7(  Vj1HpUp5 κ땷N`/ā_ɲĀ4'4TҐA_< O~ /B}A3Cge{ Akt#DBa!*HH.:$$nB y!CHa  gf#[\=\0  $%p! at"!9uz4͐2 i!/ /䵀DK2\(P8a:`-vq^~Y!/(F4(E_VY (rB; Ka6\xA ʠt8 d3VH@҃3>A`&8jf1FYb "VBhE !s8 ( >`t P;V^H ^8C|WCU`3(DЄ5:NGԢ&5Fd@2R a' B>!EHwl_3.IQ0NL@z& Qց8pæDMqbi:X#05d`Xh#p4[ $>]:LpyvS<T)@ vE\@>\P;/B*$%D`[i\@xb򃴀 A@ȥllE-v`< Hș gog~>!39Ap++"`I0;Cpru1lǀwkX rmkQ;@RW$Olu#>wk=#Ƿ)4)iDPSW}Kt9PLY6sgdg*|r 0``}}рi g%> !&u7gjw(60aV׃kgo~$! 5Ѕ^X/=F[H6d]RhyT*Ȃ'5[3XX7H0ȕuL0~q27p P6wsW|mm(0}5~}у/X[*xLPiaP`bgu^xgs*@_щAa@ h F{iPH:#pn zTci[>sHwf@^`6wHP@a0 %TƉX1@`(gBёL3;Y=e8195i 0O^8z7"([ ¸'Mi[yUO8>Ɔ]5D  &&6wCkY=V`mc`9 q?@aE6hFhxhVw љJ{9`~ ҉չ yYw7qAH70ZI'aFۖfI`%z A@W|o8w $'ѡAAP?Zԑ 0 "zZ5:TAjZCETG׍g!Jf3!,W!,y8b@(\F< 4Fq!EU"rhUQZBbsQ&B0c&72L0P\4PtKƤXJ̥ #-@a.u V@2e$biŮ2K7&*v3iKOPTm IBM(A&5RCh2M( !,W!,xCH An Æ" H# LZ_~̣AS:ȡF & 4Ҥe*ZΟ8JP8pdEPˤ-C`}_J Fc FF=3DD&$0C@<@Ev]Z-(4Y7IQ *6c.r*H$uf2߁H*T*:7h+M|3PƘ|ec420d\P\ڨrPLA+q8g 89" YWX")" 0!GCd EQ%/$w# GNhPBC TL EUM?9#AѬ1@ S4܁]cGM`gBMM4ȤN.>儋娔C4u&H3 H f1&TeҐQ' M٧(uu-֦@g@]gDzju8jI p(2&1 DNxͰq7,@eW {6+)p 0jAD1M3fZ3iZҐRa2@RXC HQp!,W!,x@(G-h=% b3j@iUHH&  * d4088b䘃PaN`RAC5:  IKtTS4&;&w zt aʑMչ&M2+rXfŒF@iL- EڠPH1i ,I#W Lkj/i T&̤} `4^-T4@L84N%Y]@"=nD vXה -upΰ!,W!,x(a@Ȱ ZϤE凡BRhPM & 4Ҥe:xB ՐaҒ@aTJ&:֌ALI+S >$rQ1id*PBIth^|%MVD|]80bA1]&SΤKW`J7ibpP7)tL96! ڪ%UX#" @p4MvfJh>rACҜ5h @Sa5)E}e*8Et]؁ ;$KbD2+iX#冁Rq,J@Z rFURMz 0VX3",C@Lt()qTY`" &`e+PI~a0CWU9h0|u UV|"%, ܕdCL&YXH`P@!,W!,x(` \p!%LI& BIHc T)FNhT^4hLv0pgϟAG|"Ae0L&mIIc4JIdd䎯pICFɁ1: v(~5`jā&|%,A `Lr%SZ_`,20I.@4:2jU+Pʲe&:-pZgD"[`d#W9Ϟt$-\AjL-FL딍9Q4AHV "53HA d%L@ IjH#_ALL*IP HÌAl#L@Bd@8N(Y)91ia ̌F0iNB9&Ah *S'g &RBg@*AFwI!,W!,x(@ "$XKbg(FX1<``2jj`# mFsIMĪQ hHG4XdjX@E\6Y( P|B$_n @Z8ĵD 8 dk]i E"Mv,Ҩ aY⠜gLZT<0KcODm1p \9Rid\*™ } ? wZ!,W!,x((@*‚ cepaaTDBV3iф :4 &J46@Bt$M ,<8AvHjBU')B3Ť0 \ҙ^F08s09k+hjJd+R-UR*ФXȰBr|G͡^ч âMoޥmЂ w! Cu 4Z}U!EF\FIQ" /1  L0 h O@J#Հ4 4~M4,c2 TQbIZ$#4ڸQudt*qe3 $XI&ƤA5{Bge[!,W!,x9,@(Pf P]ФI[HZ1p C>6X`0 4cpPyѤ5zliT&M&i M&$}K(:(U"=(3iwl-[4HÙbҌQ0C#&MqFLl$REMb,@ʲe40$p>(hړD4V c҆MfX @h5Sk@&TUF2F]f=xKkR2&P4~!g sB qA!,W!,x(H A D,0ŋDFX1< : @0ҒfPZ lҡ+iV8 @0@Z94iѤќQ8 (&`7t'+I#QV'*KC %-)&dyN&2NZ.V &@[u*yf(`h \bҜu,X@8k2y B=0Nl8DXg 9IUЀ@$8A!v.@-E(ۯ xx,C~0RH!мZ7@Ŋ' :@cD@4؄MҚ0(vk@cX,O,6P.*TG@pTFPe*dW5S"@!,W!,x(H A @ b! dI& UjQؠT `*2@-Ф TI` -@jq2@E-0`Ke!H?~0L)l!4FVCOҞY A4duJ 0&A|4`J%JJ"و(`9j2@9 @2Ⱔ  YQC BX1't֙V0hYd(&zrR4+(yi(xrA,U:p&%+&k4gBYȶ3|rMcA1p44t^!p@ A B2U\ 8#MO&ZLNd{$RtA*0`V)E˓ɓ!C' j pl d4@!,W!,x(@ "$XKbgyHb1 @06&m!* mƁ)Ȝi)R! GcȔ p* hH1r . ⒖C  4TH>U"V9Ң8d4_@`gp1Ո' x@0) , %'0pIB?iM`dҘ \Lڧ|X8(&烅ҖI_&jy`Τq,pL4ц,AEi;@d\*H9olXa@!,W!,x(9 \P>jA&( LZ_~ X԰C$8PH4PtPd`$`0iɊ0"I+U $Psp^?P$1i*&fFT@5@-іJ: DP}IC%le8Ɲ>M x.AUֱFmEʪZ("xfK^;K&4ɼ 4e&:9j(IWDᡐbH?l Lv`C{BXFCN &xdaADHculfZ rBPk@hKu 6 Ep,C^)"BQ !*E`/If-D%&O48L K1ASX9ET"@hQ>Ѕ{PXHpP@!,W!,x9,@(G-h=%%IL 6XŁc@1HPH 8WSL9p^rP4L>lTqbR.iF$蠯?(3iwٸKУcVgI3FaIq bL$MZ4d)3e*KC@ʨ6|"8Y<P %i PʁpD3KH ZY%[*H(lTK!@6(Dj`f-rehu`)bLfZe( `3 SAhQ> q@!,W!,x(@†*d5Mؠ *a4Š(P 4H:THd!*ph5,C`&t$y&MZ4i6ڡX'ϒ*Jo2# *Ml\@ 0eu i"(u*iT6hK$ig| B4M$M9Lጦ`XF g)$MSCD8JIJtА4g f4ze 15~\aͼ^aJ8?Q2+ixnY c҆Ȫ-0F!(N`"4 bˀMQW" &Y&s_-rS(8MSJ je'Xr41>Q 1!,W!,x "BV3iф ZÈj&#n6ˤ-C`T%Lv 'im'O?nf+: @SGJSJ';  4\,O)) +V $RAM:8c'|ѣ3 9 gщOσUGQ #!nimBQDkPdqOo졘4ZmW\Қq n:N!,W!,xQ(@ "\#J8`a\X… B-gb(Sl2ʗŀP$ȡF+z􈰁yҒF(Q27*Ve9ψF3Ϋ];&Ph- L[-f+32vԙ^ɤm!FIo I;Ő @ުRڎ ( *wdCtB"6D@*? #0% 4[ܸӧW P3Ƙ}Eܳ޿ L _Dv`[UWh*<4Д r$ 6 28cV>V Q_(srт&(r4 [![Q2bGFsBq @q=#P.QR{B@ 50Tق vEu餞A>4A  DbBtBBA"5" 3i |- '1T+GAJel-U&#(!2ȯG w S6%Ð'1Q$D$PDbAAjLɈ |ljlu Ak@c/4ޫAO4'/ ^JS (LPUX;TC2LR$ʯaH]Q@VZc|IXQ0CMd4 Q n`!D2ԀE,P@!,W!,x((@*\HP@aDXС0 XVj`#GxȊ(r3ҢIk9QMi9wVXёf 8_B].mt'C ϤyGװV.:th*֠ #8vĹrr eDҜ%KNC [0pO "IǕ i vL(K \LAA9LJ+-LH&@V@.rޔb_$̈́;,uyBI$p ФtSUEw@I7M4$4B2P@!,W!,xH A[b@LZ_~6q GU LShYR#) 82 Ϟ3O OƤ9y'+j'Wd13))V, *udҾZTڞ&`2 h L h/\O4%p Y,Iٞyp#(SE;qxp@S4< !,W!,x5a8,@PÇWz&-/?X 4iit8pID ƒ&O<8LZ"(d fҎa@1$̹sDLh\ * F3 dvht*k`Qd0 '\5D koָL'(1Gc>2Ln>aHÙbҌQ0HLYΒ5(b8&0`&l19j+7ȡq,[R|tb6Y #PezM \4 xGGbTA'5V4d$@HIL|@gġb]b $G,P HÌAp !l($GDU KGZ@s@lP[gS@LTbY`dTK IU_UAԀE4g!,W!,x' "\PZ!4i$RlI6 􈱤  * dt40ar1GHFt!~!N)RCҲ$dJ&h_P\[irp3KУc8x‡/Z x0(GAfETv6 ZAP'hҢ![&P^8]iI;lT ɚ HKk>z5`I˃U1؝]*0?GE J2ί/Ы2i1T+ C|T@0e@ J@gQ@]@A.m@ft(Ї!400Fx`@ 4]%4ڈ4: Fs F$g(aAK6I㓪UR-5Duq m5 E !,W!,x(`\ !%LÄ caB,ŊQ(p4'(B b @0 4p *JLHZ31bt% ڊOr1 & % Zw%& ~}L&41#VP#0S+ X"Th\KxNer1҈RV7U4FK@R ڰcA ? |`.7ool`@!,W!,x(H A Hb6)3i~Q( bx%4&$42JLZ0@Z 8LZ"(*Ʉ)P4!:wPHVƤ9F 32~pڂZ-[Jx T%ܸӧ_I4~mIiʪ̪MI# $gz g5@`djN⫁9(NF6;!S@!6&Y N%7J&7%љBT1ߎ. i#$%v 7P%2jxǂZq@R&b,3?f@03@2#P\ BM@%93Is A5qd!,W!,x(`>X8ÇQ 4i@I@i/V$ȏҀmLK-HK14fw$Xt@ 0J@ b* 0$BƤ3DZ}ICUh*sqG0jv,Bo ȘlEe&X@"&Qm*d%iUq|K(I;Dh%rۂ:?8+!@["eQ!ԝd'sy!,W!,x(H A  `!CXa8]ФI[!XXf(PXxx2ʆ3mGI;WSΞ?G\*ҪF]BMFI dmdj< 3iw>[- |VY fA-id\a*913QpXRѤ7"UePʲe40PF sK㍇q>>N4 CpE#l {&zaV ~@@r {HK0 ɑx kh $ 4T2Ҡ$P((64F4D31(P)I91aҎ=3B>@`!Τ&0JV$%AUdl*qig 0fL!,W!,xT!h%\Tb1-!'`$ X6L#&P8-AOT&M7IpEII*i hP@n@Ґ8zMHvU4eU鈭ei.! ^8JIJ4P@Q2j #I؁  %phTep1 08&mZA(D`ܢE[2d{=3dh>*B*-'&LЌjՃu:\!!z !,W!,x(H A 䰠 b! d࢈59d4iҖ)BȓNJ24UZrd (Q  4p *@0i*& IO^r!ժ؀\A4^6%)@]FjL)ܸӧ@VNrESAhT* fc `@il 1(PռU3JY,HTx&Lqؐ,4h{ ʬ9^K:I?w#ދ 0̤}2U 3 RtA5 UyM GHHHQ/v DJ* Ԁ3p@Ċᜉu$ P20"uA&Lu!(P)91i!$jcAuw*pd3 dA'P n`!? !,W!,x(* @†>jA&( 6F<rV F$èCB|)0CĤ1#A"i0hlPhҐ(98 o2#+i7vU E (64PMܧ$H/iPء<]8CFl.4w0+r2g"e hȖQTfrFƈ6 RT )&-m$Í*(2Q97^L!yqh)~4^- vw p+MrQL~d-ZDҨ%4@h B̂"@ R1Apvhbh8Z,k m7P@!,W!,xH  @3 }Ԃ&M3P `` "&m`E`lJ IcvGEX"SY)`4^;WP$T`HZ%PhAɤ%K*Z*.+Vw*U櫘T,9@!{}Xř4\ɐl4e&qteDapKJ$**2$mm1KI;ەo $PF-ϤFY"9䪘BÎA}][EQO,CP.*4DC3x(oBQEo@!,W!,x(9 \(P*d5MؠWz&-/?  R@[ %!ѤI[)3BF!,C`& d29("ءX'~I$1i#r4D[+i XM>WIC岁]"TE>\&U\L9tH2\ XFjHYڳZ%ΐH "Ri},~M"Vڤ9PNF>8L0ɮ/͙ S R3^$4!@邐!H3LOdLc^\}Q }94I[}%$pHƆL{ vh!J y5d)pD ]GڥSCcDC0 #x } 4x UO5P.xBDdlR@!,W!,xQ i@IP(V"(m )8,q 1HPH #4cp䘃J(?H! h93a2i ag 1ɬHAPҀD#̢2w ѐ-8]i!;2UDUl9NF5O׍agplY MύZ|a @D@$~:h@ X9MY x"(Ig_&>)`(K|C DJ 0?@,1CЄJ!BBcD#0ǠSx Iphh2墂w@R^MA!,W!,y8b@(\V6Fq!EU*aD)8ЌC0c&TJ j &+v.bǞI#23i)GZ4;p@Xr H4%g@TxD; 7Is2R.h&MB|j" ZHv%& 0CC+d [i3a6x fJCI"p кn4'iJa@!,W!,x(` \a%LA BFQFWz&-/?HR *8DqhYJ$@30J̞ͤjIKVDQx"Ae0 |@b~H#ch2JA]F kwzj#Ȧ K{ -e8Lr,X5p4#`& _lY",cp8`Nv~|.-@ Is_pJX^uplb '4hE{nK) @4XG*4`n(M 0 Gp(+IP HÌMiG|/ A"\(8чAh]BXASDCBgSVyb!,W!,x' \p YD66lBN 3fܸ2؀I`#EvKάMZ@2A) +V 4+, t`CB:VZ. ^ p,ųc@=0;]k[?01!2V#0C 0#'1ćaňaX-V&c#Mq~Q I_qB'1!$)aHc|L0`!]IҘMD Ts'A*@v'd D@dIP n`!B  ٢!,W!,x(@,(Kbg2,XZ`  RFA[0dAGҚ18)4ip0"LZŖW@F`b*djCfrsgJhHs`!8f4_ź UD7I$Pi> .6(/< >'2ͤ)bX 'D iѴLY& `4&Yݼw4f|T8Vh)_nX#2!P3$ % 1D"vL31r>ɲThIؠ!,W!,x1UH*\ȰC,jA&( Ȳ˗0c|$IiHCiPʙ@ JBbҘݑbIF} 0JիXJ 9'Qx$0BYӪ]*~V \95DTm L5D^}ICEP3Ƙ|UT˜3knyG.AA)SLA2כc˞}VN^̊LJ@+,hȖTf`@3j@!u Ѐh^oy~Z@ L.םe5`PJepRUAd(Hw(F}D@ǝG\>Iv|ȁ88:xIÚ@Hs ![PF.dAp 0y'hd(* aMiy&Z>ԀE4Гz&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫n 7 LUj\B6Zq){@j#A 7~}@\B+̰11BT H`hA#@ hSJ @+W @Q B-TsA$|4F/A 0g(\21Fe] "X`rDAxVֽ[\+5)0()T@ǸLBm6i]w AIP ` )w YV uiQ8 Lmڄ'950PL@3>.5+-8Zxi0^wg= @ȁ  w!qDŽt|aWo}] o}H A|Lz~P0 4X}1h0w2,M-uxX9Ѐih:Hdi)VQ +@"  ԑ kC~$=1s@eG+J _D %Ms|* 2}/ P!R4\! 'mA"۲,r}~,B7Taj%rh vH7 h@i0B~hBL^/?> 0'HraґyDb)tJcG9*rtf4S@dLzȄPd(<*ϐbC Q&iBAw8(59CRN'L%VyV ?_ !'z; U i!lY}Հ 'vJR m/UrzUMHV(`/<65(K6}a ~$Ж A7]{Zw}h>/ ["D>bk"J&@G+-{ʝMPK0 f|'3fw PDi4 "1l6!ĜWD dc@ h]zK &Fq8Ubl8+HC?y>DBE/:9'dp&@>kP+2Wl@]|a+6h5V@[7@P8 @t!@ pf{4;Y @'V ey~r-~@idV.Q*I \cyo%ގA`i| t +p VȶMb?P6 1wH%0URP "߹=;-yAxN-P ֤L2h`X0$A@qY&7XzfXʠ~ rBoNo „#q>7.7Piw@nr2`9N8#:@Phjɏ(;(FKbg`l@ܚPZ!kv9c*␖  *xdLC:/+c@第]旦yp^0GW`p!"P[!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,xC`*L(@‡Z&P j G 6%P 9:=̲jQj& Y Օ֖93UGҞeEA656Z;9IiH;+.kqLVD 5" 3OUJVdd^GiF HOH#AgġF|]m- A"1 4DVx8ǠT饇s@Wq2YE1Y-:Dz.`A< ɘU-5$w_i rC HQęQYIx !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,x1UH*\p! #JHŋ3jȱc%LI& Ǘ0cʜIMcDU.i@IѣH"$ 1T^ CPP? Aׯ`Ê=D'D0Mv&%rt߱  `$u莸qqIC63>Фb (D:mVӨS˄3w! ـ" XPiop3RU+_<"k `bVK ( ŤHMѼsD\H@@fd%&(Crtu߆,C4Dp(rFfȬPE'# PhaZ@)dDZ-9"kb @m[43xc5@KP`IGP@6JEC%4. Q^DS: @b t& y6E"naڌhʠ<, ? (yL)A[FoFx[{wJ lOi= H\rc#NH PIy 6WS >.@ b93%xi?j _?|-n$.*0sHֿZ$#7vڶC0!eKs< &^ ?`~yE~T@=5ra%H7Ι#앬ze(R3sgn2`^¬8zvH} cD$_5 ( T} 3X}O@Ys;7~dp3{G'0MMdž9Q% %@aMAB=*w) '9`t -ZP7AR xY<09x@,xa5LQ;n sL؄SReSfgl?""ƅF!,W!,x "g$,l 4"XFz fw$X$A(U2㘃(AA4 (6@2LZ|@UY ctG<4h Pρ̊ Qy MZ4d*3aF (RB&HYe $AҘ e ]ʤZu@,g٥.0`K \*P*-7 *? -uu!,W!,xC(@ "\ȰÇ V „ cu!b@PV4 h dh`H<84iѤ`#i\J;Ȍ/K೐V 9phH`ځxP+!e%TVvlƌ] r*,BEݬE#8v`ǂ$PC0ˠ0H#&T*6K3fS+/3s`2j=-mTT?l(& @J3_"d i:(`hK[f`IHAhWHL XBU.l@q9- ބp9B%BsZ4`LA"'PT/w&, @4ZL!eSh1'җ@DSԇ? $Bx]}jF 3˖]2 UOdR裛5#L,rѥzpF*d%1ETwK~bBAZ4ˎy×?4ĮS"R(`AE31?=3k 0η?d1*4'tS.*\fA;PLA~HC YK Vi}R ڰcA ? |`.7ool`@!,W!,x(`*$p.h-SpgҢpAe18F@QM4.3l< 4p *18LZ"(r Ei~0%'T. 4G$i`hh2Jjl [3w%Lv$4`$D:)Vcݸ42P`9B)-._X8ÇQ i@IH4AJ2I46²GS $ * d@ς85P1Ol>A C(И4R@{&_Pq#-x%1f8Al=^dVA2#˵ˢ8;kD )hGu!,W!,x((@9,@@*KvA&m b)VE)@P@crRfxQ#iHcpPy% ]IdD Ϥ9 G.`pF\WMFI +6"H33ijl!띋%P-DҜ K:)&Z.V "*Ic86 fᰦ|1@C2)˖E*@!{}(X/. *غ8Ărgtq$-)„aO8 A l6NA=GV d@SL,"̆Ռ0D44G*ćz%$GSdQ(`rtHA5 # /3b2`4/AcD@43E &'X%0W2C5 qᛝ|!,W!,xT!h)X+@Ki"0 l 16`I#AO%Ml!\@yp4TH%r03iD $ `&m@8c `,9guIJ8&D"k)&5V*b"KY3 4h d$D'?`JekW^iaV c҆Hmhe JZ [j3a `CvI$Ϥ~VPa?ID!,W!,x(H A pQ@lB!ċ LZ_~ҒFRdD,(-@!H $i 0iia`rs0iɊ0$ʤ AРB"$Is$#Vj @KeT&k47ib`By@+0e80! ڪҔU!hcȒ놤Kd:$4]1j`k<J2jm6BQ؁ j<ӡ@4g1Ɩo@&q :3>+Y/$"!2ȁU , lxd@+Ebi( yAzUؘ0 $8t3 d0T'T$AS(w(4TZ%!,W!,x(H A @<󐠀I& NE*d5(lŇF @P 4rѕ4h+ T@LvIa`e!HY G!d6 MvDAgYW@Fk;⒆l&i (8p)0-ԇL-)p4T%"@Rok!_EFE4E&0b .@4:ԇKe5>QjlE/5Գ)}`E7Ĵ4Rg41d@HG 4Z4$QKA@c,AL< 1 @Ќ6EuyD (%7b@Z5 OnE!IZ#3GJ T -hRXA*= pfAA~^dhVW!,W!,x(@ "$XKbgyHb1 @06&m!* mƁ)Ȝi)R! GcȔ p* hH1r . ⒖C  4TH>U"V9Ң8d4_@`gp1Ո' x@0) , %'0pIB?iM`dҘ \Lڧ|X8(&烅ҖI_&jy`Τq,pL4ц,AEi;@d\*H9olXa@!,W!,x(H A&SaC\A뙴hHa `*D LRHF@ -8sjq$2aҒ@aH&V(ӧ$@S?$BU1i*&$fU]bh˺ |%MA+)i.Ɖ w41 /U9Ul F&A[52$@lj `Hgz@`<Oap2 Ոe[S%0X^,l@/Y9?MKŏϧR!rC̤}ה1hAtft]4%G$"@|H r1`q 8CX~Q HD+f"u@?YI 3D8/ $31Iei 5!,W!,x9,@(G-h=%%IL 6XŁc@1HPH 8WSL9p^rP4L>lTqbR.iF$蠯?(3iwٸKУcVgI3FaIq bL$MZ4d)3e*KC@ʨ6|"8Y<P %i PʁpD3KH ZY%[*H(lTK!@6(Dj`f-rehu`)bLfZe( `3 SAhQ> q@!,W!,x(@„|Ԃ&M3PT(P1V*L# Xƍ )@PH6(4fw$X$ #:֌͔sU&mC LJ@fd~UJ)فx@Uɤ%K*I;2d*>SqG,9ؙ9 )90+3n_$C5e8hHhݸ"TQmP(d4 }hI1TTd"phZw%핖jLc(巊4T!"Thb 嗗4T" &<b`.P$M\(r ,4@@( U1D}"%A3Z_H 98P@!,W!,x "BV3iф ZÈj&#n6ˤ-C`T%Lv 'im'O?nf+: @SGJSJ';  4\,O)) +V $RAM:8c'|ѣ3 9 gщOσUGQ #!nimBQDkPdqOo졘4ZmW\Қq n:N!,W!,x(@†*d5Mؠqcx:,h 9aHKCid6!* X6L#  @0HZBӧZ=x6T4!0l`슩* x&CXrdrUPm0ܩn^zFJa i @Cs@)MYȑM45 %9Ջ&4C'w_Hq6i2Bx"uPV^  TJbAܨ}EP n`^Cd !,W!,xQ(@*a‡#B,FX1<1# B-M +^T˗.H(C jȑf] hSF i]̏s&-P@%Bx¢QЙ% fa"(5BWʙsPAYEcG^ H JH# #*GpD Dp iwAF"U$K%'$1a$F*Ce +p`p*1 Qxͷ]mX=/\Ȍ$M)y .z $A# X SsQlQ1u 2a) 0 B# Tq2BhT-5<s"d4C55 E2 !,W!,xH A )Ɛ!ŀ d4iҖ) @#VePuLK-0HcpPy$ǟ?I;5IH.IhSl0duItcHTg GZ4Rp4c& ;Jh' lY4"$ dyVA?nMD 簁 IDx BO 6he`!%Z Wk&4N ()!0{mK t˘@iZp@ 8,U93s`@!,W!,x((@9,@@+KvA&m H1C6z8PXL)pe9H&fHͤÀ+iX#O eFWOprPLj*"(U`Q.0j ii^}XE2rx&lؤ@ fD 13qsg 6F(e2PEzԫiCVCPSo] 6N -20oъȿ7II/L8R.p5np` dҘ<u 6RgهGwvLK848ЂH5уƐ qoי!,W!,x7@(G@I`BV3iф :$C`j&m4i  * d42i؀d$!@;T'i|8!n`K+H&-@JگL$]l@ҐdrJdV)h-Г&zvr"Qm($k2=O8l%i,V3`#4P(p!Ǥ [`s 8@<Q9kv lJ9h@fvAxuQi5e (wS5~^ DuuE!,W!,x(a@P!IC cp b C@H4i&-AT8K,&-YFdb#iBӧZLA I*v;v'SD[+ib\Ye٠\2iFp&Pױ}h%UVF&LXr @DԐ g)$MSѥɤ1!,W!,x(` \P]H[PˤE砀E 0F@QlKK@!8WT&\v(BaJ @.d0Mv&QViBfd厰#qICf4L6 v&5`eā/oȃ:)D˥MH4eU4̄Np љ>vfDhJY,DTV +,"PKQ2 T9~k t$ͯ\pA`6d-|X8 0u]AxԀKV%"63i iHË`0 -W&#(112&IP HÌAhĄ@H@ UA'"33KdMb4d4jaAh@*c4^י `)4Dd4`(5!,W!,x(@9,@H b0d4iҖ)*Pf0xp CHJ+hT^a4 `pVD.IS:l2JPjKZ25丒3iwzj Z%86-HÙbҌQ9 c4_x3PYp FL@Z8)˖EÈ*<A'rV 4Frr  lliL!aV,l\ 2!PY<@ d@ cqXJ_J2ɲ! 4 }& qA!,W!,x((@9 \H‚ c ZϤEa4Š"h D($4i(_fB(CVHZ3 ^2(`NFr(!c?$Ԙ4GdFWԠduh˂x%M@<@E`VjΤJe8 ,Be`_Ist,9$!Bt҈:FTp4M45xU᝿Hhhr4U\q2 64EMf 1t.`F-SJRpislp^W?S/v/"an&,VI/CrǛ@Hn 2u  Kr 3͈pH"0 44{@p(zTC8@!,W!,x(`68ÇT!h l$M@UH9 LK-P`ecl1@ @;*g?dqMl I#%*imБB9U $ Zh:.@llY3:j¦]O0Iut2 4g #XMڟ t c҆-(PJZCtgT@%lPiU@My!,W!,x(H A  bd %ILÆDZ7HI l*I+O  4v *2P8Z2iB>*| Ae0Y:pSI@`Q `X(]pw41 w4&CҠJ)MN:)&HJgz)K6YcjD+R-U >!2x 2$ n qpFg :#^z@V3|B#D4F*4]4%@j@Bl$ Հ4Ԁ3p@l0( ~30)2ZxTF)v0DDXP n`!AaUYX@!,W!,xT!h!@"g*-!X`  X6L# J!UB*vడ|k,QCM"TڤB@3ibY3 ؤ\1̓M9IӕVH28&mI 4&dEI66>6Kh3@H6C@A/<-6K i8&a=313fsoA!,W!,x(H A *T!g\TŊM*F@@Z J#4< lJ ?O hƠ :ҤaL& JxӠФZ(4PhhQ%PCX)o@΁I;$s>U V%MJT8c `,93 櫘e).(͙^I D7Д)^Vqk2! nF)؁  4E7$MWA#D2~WZ,u^ Z rL Tb $b 440B`8"„(^KrZP5@$Ŋ4|@HGcD#0@&2!#v@O6P.*TKz }"%}-@ n`!!,W!,x(H9SaC @10x( (3i~HINJ2C+ 2LShS#)RZIKVDQ&ԸQ驁o`FQLiL1٘\14PxmdPKeT& ƲQ܍X&@T1/GWI#&@shMXTvBuԚP8B4n,~@P\splf>^7iStXd9=$ɝ5ܰQaM@@64h B@?tRJD~(8t1Ma!JDA+"dP@!,W!,x'H ASaC9(E I8p*-` -(Sjq1Eȋ#KR)`S/+E?)/ج3c*4RU8hWP Rh* .@<]:`AIF38]iy:un-z:֠&0#.i\قHcLΖx-LS^,V`H6+֢T#0cm:3:E`i\J%!,W!,x59 \H ÇQ 4i@IQ ZϤEG-bq$QHLf(şf<(4fw$X$  2 (RL1:P1G5E"pTIY.$0Caۋ* 0@-і}@_i*Lf \?U" 0D}ICR2izN$Y4*]4"cw.hv @Js1@9@0+ҲFׂL4NKSf!( t ZEh@E Q U 5 ĀP1(-?EqX" 1QEL D.5H&Ҵx$ ." ( 4 dJSh-$$(Itd UEd" /EZ^M %y) G`v u(BI`&uqeDv 'r|40Ex`KS䲋J Eu@ Te*Eo,3Oqz*3z"g?RAhQ>HC.,D HQD!,W!,x@(G-h=%BX;P 8fP(fw$X$A[q1GURai+4R{H&-A_P%-KYtGK jK )c @3%Y]D:&h3'1G_K=Ay. fzi+'!]Bg2uMv-IсU^I@͊|Cw63qTxQeBgfH}h ;&Yp 0%vA}bԀE4@V!,W!,x5(@*‡ V XT4iҞ16*%H+"4`$K 4+Y|BbҘݑbHF:_҂^05լ %S(i "u iqM I+H*PEe6.7a2i g 1 @YG S;>w zt B+!>mrjצLZd+ܛXq!#' @4d@*3q0HWZ6j[DbҒl@f^qw%S 1|.wz(P/x4,T+ aa]E!41qphh:H](@XÀ@HD)!R#RT@"3OGQ2@5T  Jw1Bh\VS-5 C*Duz 5 E !,W!,xH A )Ɛ!ŀDᙄI8p* @0²GSDJ")`S3GgʝFl\1s4iL)U1C ʑMEA-m|VDؐɰ b-B63i X@A<6 KZA?dM@WA \Lڧ7Y& ukO aNT RK3-lVw14 &a<a<0Y~xCfC؀!,W!,x(a8,@Ȱ ZϤEKvA&m*@!Ѥc&0Du!L &-YFqd2@3i0JhD@ 0&M'TB 4%ڲ d$hjU:A.Ʃ!wFp&Tp4B3Ť3g ́%Q1Qe08&'3B)˖*@>7IZ }a.8h`EqIlbV8  )]I{@S"$CV pd@Zk1#$QAHLp@ᆌ5#L, !$G,R H@Z4ÁqČN/\q`ZRVHSL`00CZ'XR^y*qF 7P@!,W!,x9 BV3ф Z`gҢsP  &M6X`0 tpdEPU ;k%X 4G6Ipi*jl)WdX% A 9U2i!IC4%eꦤ3J:j-݁v0jV Oi&2*m^&pSҜI@쵁1 p]JW&v`pL08&nQk^:$vٔܣ[|V_#|\q`W!O>!,W!,x5`\@!Ç@2E qc C:p4':H+Aid I fa@1P(ѣdl('TSPe҄() LGn5d LؠK%nJĆɐ3wVpN&Pᬮ1fu_ g0Fa VխJA+![V`rttfW]h> 6)9)eٲhQE椨L+-yO0v`Cff!W`'#-P 4!AM5Pi$D]mU+uLHK\Lԥ@|XD@XXdq d(aB IAԀ4 A]XHÉAĀ@HrT@b@Z4o,S26@s@%e AhW[;AԠzATXH@RRI!,W!,x5(@9,@ #",(P1V'.LZ4ap "Q 4i@Iؐ"h <@<"v4`+Y(f (T@Lvp4fw$XtС%U"&-JuⰚ|ÚYi,!s{}(X\י4\WaK14j`.u! &@,ӻFKO%g1rfp Z58ȕ28&a>;Nc|`. ɛG$tOfȀ!,W!,x(H A*\Ta1\A뙴h(X+iI) I2D ͤL ),r 0ii0iɊ0j$4cPP4!&0HTƤ%-(-rPKed&EJ)Ɲ>M $*u4N#8v@Ҡ")MY|iD10KFfի$40 &jJ⫁9MFC$6l/¤9!Uf dACҜ5x @8F]i)*gh)Ea;'؀Qizak'i D ѴLOx袒QWG"@L E( "YU+FKeF0$W32qp`[Jb@Z<,944$F[- ~؍{q A:Q#4lW[=@$BHcgh$CP-tVAArPR@C !,W!,Qx[UaA*pC<4qE /jpǏ CIɓ!LZ_~\"b8T!Kav%BFDjr!FIJJuh (MI &hҪdڴl֤tȯV˷߆$+"¨LBmJ ,l F(e̚.] ]ͺ1hL#]I ǡ5zlh52/ސOZR5>sj,+ip?\Ml\V@җf \ TIYեw`tW'A5Y\5.qT M 5H3B%Js"*8#1rP]E҂X$D@neđf@YZRA Mh8@HseGd)͖-4S@)YvY fziFTCq#2i0iEK1-Ӧ@3t@&,c@3(zi(crt&Sr)uFbv-dP0tB U!#/t%,$A+ZH4t*nHY*>*. 5 4]Cx8ƫBjuTfo+AW`2ZHd M/wj`n6 RFLRMlj4dHx%4,6rX<*% .SW`_rtpB@)i h 04)H3 Qm5֣vTyҐ1"asR 0 o qfdNT Tgџ@b]}F#89ܜSz_DDZ9/&\EqtFZ{/À@HĶ&Rsjp{C 1XE3LĥU -K#]p 0?BL8B;F ,# $$iBJaZ~Vfm+G WC} d2 T5@ Eh)Xl? X$HLb&:Ma"H*ZX̢.z`4H21hLcF2plM:ڑ*sdǒь} 53H!ݘFrct$iLq$&7FMrÀQ< R IIHiV b GHb f@pX:"0) A@LfZ;A4ikz< 6?Ro*p4ps^BPL18a< D!Y/ςbAj O:4$_8VIЇZ"DI9/Ql hCCJҤ|(IS҉05Kcә8ͩNwӞ@ PJԢuFڨM`z.!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/suspend/000077500000000000000000000000001465647402200170365ustar00rootroot00000000000000bubbletea-0.27.0/examples/suspend/main.go000066400000000000000000000014531465647402200203140ustar00rootroot00000000000000package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) type model struct { quitting bool suspending bool } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.ResumeMsg: m.suspending = false return m, nil case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c", "esc": m.quitting = true return m, tea.Quit case "ctrl+z": m.suspending = true return m, tea.Suspend } } return m, nil } func (m model) View() string { if m.suspending || m.quitting { return "" } return "\nPress ctrl-z to suspend, or ctrl+c to exit\n" } func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/table-resize/000077500000000000000000000000001465647402200177435ustar00rootroot00000000000000bubbletea-0.27.0/examples/table-resize/main.go000066400000000000000000000107011465647402200212150ustar00rootroot00000000000000package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/table" ) type model struct { table *table.Table } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.WindowSizeMsg: m.table = m.table.Width(msg.Width) m.table = m.table.Height(msg.Height) case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c": return m, tea.Quit case "enter": } } return m, cmd } func (m model) View() string { return "\n" + m.table.String() + "\n" } func main() { re := lipgloss.NewRenderer(os.Stdout) baseStyle := re.NewStyle().Padding(0, 1) headerStyle := baseStyle.Foreground(lipgloss.Color("252")).Bold(true) selectedStyle := baseStyle.Foreground(lipgloss.Color("#01BE85")).Background(lipgloss.Color("#00432F")) typeColors := map[string]lipgloss.Color{ "Bug": lipgloss.Color("#D7FF87"), "Electric": lipgloss.Color("#FDFF90"), "Fire": lipgloss.Color("#FF7698"), "Flying": lipgloss.Color("#FF87D7"), "Grass": lipgloss.Color("#75FBAB"), "Ground": lipgloss.Color("#FF875F"), "Normal": lipgloss.Color("#929292"), "Poison": lipgloss.Color("#7D5AFC"), "Water": lipgloss.Color("#00E2C7"), } dimTypeColors := map[string]lipgloss.Color{ "Bug": lipgloss.Color("#97AD64"), "Electric": lipgloss.Color("#FCFF5F"), "Fire": lipgloss.Color("#BA5F75"), "Flying": lipgloss.Color("#C97AB2"), "Grass": lipgloss.Color("#59B980"), "Ground": lipgloss.Color("#C77252"), "Normal": lipgloss.Color("#727272"), "Poison": lipgloss.Color("#634BD0"), "Water": lipgloss.Color("#439F8E"), } headers := []string{"#", "NAME", "TYPE 1", "TYPE 2", "JAPANESE", "OFFICIAL ROM."} rows := [][]string{ {"1", "Bulbasaur", "Grass", "Poison", "フシギダネ", "Bulbasaur"}, {"2", "Ivysaur", "Grass", "Poison", "フシギソウ", "Ivysaur"}, {"3", "Venusaur", "Grass", "Poison", "フシギバナ", "Venusaur"}, {"4", "Charmander", "Fire", "", "ヒトカゲ", "Hitokage"}, {"5", "Charmeleon", "Fire", "", "リザード", "Lizardo"}, {"6", "Charizard", "Fire", "Flying", "リザードン", "Lizardon"}, {"7", "Squirtle", "Water", "", "ゼニガメ", "Zenigame"}, {"8", "Wartortle", "Water", "", "カメール", "Kameil"}, {"9", "Blastoise", "Water", "", "カメックス", "Kamex"}, {"10", "Caterpie", "Bug", "", "キャタピー", "Caterpie"}, {"11", "Metapod", "Bug", "", "トランセル", "Trancell"}, {"12", "Butterfree", "Bug", "Flying", "バタフリー", "Butterfree"}, {"13", "Weedle", "Bug", "Poison", "ビードル", "Beedle"}, {"14", "Kakuna", "Bug", "Poison", "コクーン", "Cocoon"}, {"15", "Beedrill", "Bug", "Poison", "スピアー", "Spear"}, {"16", "Pidgey", "Normal", "Flying", "ポッポ", "Poppo"}, {"17", "Pidgeotto", "Normal", "Flying", "ピジョン", "Pigeon"}, {"18", "Pidgeot", "Normal", "Flying", "ピジョット", "Pigeot"}, {"19", "Rattata", "Normal", "", "コラッタ", "Koratta"}, {"20", "Raticate", "Normal", "", "ラッタ", "Ratta"}, {"21", "Spearow", "Normal", "Flying", "オニスズメ", "Onisuzume"}, {"22", "Fearow", "Normal", "Flying", "オニドリル", "Onidrill"}, {"23", "Ekans", "Poison", "", "アーボ", "Arbo"}, {"24", "Arbok", "Poison", "", "アーボック", "Arbok"}, {"25", "Pikachu", "Electric", "", "ピカチュウ", "Pikachu"}, {"26", "Raichu", "Electric", "", "ライチュウ", "Raichu"}, {"27", "Sandshrew", "Ground", "", "サンド", "Sand"}, {"28", "Sandslash", "Ground", "", "サンドパン", "Sandpan"}, } t := table.New(). Headers(headers...). Rows(rows...). Border(lipgloss.NormalBorder()). BorderStyle(re.NewStyle().Foreground(lipgloss.Color("238"))). StyleFunc(func(row, col int) lipgloss.Style { if row == 0 { return headerStyle } if rows[row-1][1] == "Pikachu" { return selectedStyle } even := row%2 == 0 switch col { case 2, 3: // Type 1 + 2 c := typeColors if even { c = dimTypeColors } color := c[fmt.Sprint(rows[row-1][col])] return baseStyle.Foreground(color) } if even { return baseStyle.Foreground(lipgloss.Color("245")) } return baseStyle.Foreground(lipgloss.Color("252")) }). Border(lipgloss.ThickBorder()) m := model{t} if _, err := tea.NewProgram(m, tea.WithAltScreen()).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/table/000077500000000000000000000000001465647402200164445ustar00rootroot00000000000000bubbletea-0.27.0/examples/table/README.md000066400000000000000000000000571465647402200177250ustar00rootroot00000000000000# Table bubbletea-0.27.0/examples/table/main.go000066400000000000000000000141051465647402200177200ustar00rootroot00000000000000package main import ( "fmt" "os" "github.com/charmbracelet/bubbles/table" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var baseStyle = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). BorderForeground(lipgloss.Color("240")) type model struct { table table.Model } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "esc": if m.table.Focused() { m.table.Blur() } else { m.table.Focus() } case "q", "ctrl+c": return m, tea.Quit case "enter": return m, tea.Batch( tea.Printf("Let's go to %s!", m.table.SelectedRow()[1]), ) } } m.table, cmd = m.table.Update(msg) return m, cmd } func (m model) View() string { return baseStyle.Render(m.table.View()) + "\n" } func main() { columns := []table.Column{ {Title: "Rank", Width: 4}, {Title: "City", Width: 10}, {Title: "Country", Width: 10}, {Title: "Population", Width: 10}, } rows := []table.Row{ {"1", "Tokyo", "Japan", "37,274,000"}, {"2", "Delhi", "India", "32,065,760"}, {"3", "Shanghai", "China", "28,516,904"}, {"4", "Dhaka", "Bangladesh", "22,478,116"}, {"5", "São Paulo", "Brazil", "22,429,800"}, {"6", "Mexico City", "Mexico", "22,085,140"}, {"7", "Cairo", "Egypt", "21,750,020"}, {"8", "Beijing", "China", "21,333,332"}, {"9", "Mumbai", "India", "20,961,472"}, {"10", "Osaka", "Japan", "19,059,856"}, {"11", "Chongqing", "China", "16,874,740"}, {"12", "Karachi", "Pakistan", "16,839,950"}, {"13", "Istanbul", "Turkey", "15,636,243"}, {"14", "Kinshasa", "DR Congo", "15,628,085"}, {"15", "Lagos", "Nigeria", "15,387,639"}, {"16", "Buenos Aires", "Argentina", "15,369,919"}, {"17", "Kolkata", "India", "15,133,888"}, {"18", "Manila", "Philippines", "14,406,059"}, {"19", "Tianjin", "China", "14,011,828"}, {"20", "Guangzhou", "China", "13,964,637"}, {"21", "Rio De Janeiro", "Brazil", "13,634,274"}, {"22", "Lahore", "Pakistan", "13,541,764"}, {"23", "Bangalore", "India", "13,193,035"}, {"24", "Shenzhen", "China", "12,831,330"}, {"25", "Moscow", "Russia", "12,640,818"}, {"26", "Chennai", "India", "11,503,293"}, {"27", "Bogota", "Colombia", "11,344,312"}, {"28", "Paris", "France", "11,142,303"}, {"29", "Jakarta", "Indonesia", "11,074,811"}, {"30", "Lima", "Peru", "11,044,607"}, {"31", "Bangkok", "Thailand", "10,899,698"}, {"32", "Hyderabad", "India", "10,534,418"}, {"33", "Seoul", "South Korea", "9,975,709"}, {"34", "Nagoya", "Japan", "9,571,596"}, {"35", "London", "United Kingdom", "9,540,576"}, {"36", "Chengdu", "China", "9,478,521"}, {"37", "Nanjing", "China", "9,429,381"}, {"38", "Tehran", "Iran", "9,381,546"}, {"39", "Ho Chi Minh City", "Vietnam", "9,077,158"}, {"40", "Luanda", "Angola", "8,952,496"}, {"41", "Wuhan", "China", "8,591,611"}, {"42", "Xi An Shaanxi", "China", "8,537,646"}, {"43", "Ahmedabad", "India", "8,450,228"}, {"44", "Kuala Lumpur", "Malaysia", "8,419,566"}, {"45", "New York City", "United States", "8,177,020"}, {"46", "Hangzhou", "China", "8,044,878"}, {"47", "Surat", "India", "7,784,276"}, {"48", "Suzhou", "China", "7,764,499"}, {"49", "Hong Kong", "Hong Kong", "7,643,256"}, {"50", "Riyadh", "Saudi Arabia", "7,538,200"}, {"51", "Shenyang", "China", "7,527,975"}, {"52", "Baghdad", "Iraq", "7,511,920"}, {"53", "Dongguan", "China", "7,511,851"}, {"54", "Foshan", "China", "7,497,263"}, {"55", "Dar Es Salaam", "Tanzania", "7,404,689"}, {"56", "Pune", "India", "6,987,077"}, {"57", "Santiago", "Chile", "6,856,939"}, {"58", "Madrid", "Spain", "6,713,557"}, {"59", "Haerbin", "China", "6,665,951"}, {"60", "Toronto", "Canada", "6,312,974"}, {"61", "Belo Horizonte", "Brazil", "6,194,292"}, {"62", "Khartoum", "Sudan", "6,160,327"}, {"63", "Johannesburg", "South Africa", "6,065,354"}, {"64", "Singapore", "Singapore", "6,039,577"}, {"65", "Dalian", "China", "5,930,140"}, {"66", "Qingdao", "China", "5,865,232"}, {"67", "Zhengzhou", "China", "5,690,312"}, {"68", "Ji Nan Shandong", "China", "5,663,015"}, {"69", "Barcelona", "Spain", "5,658,472"}, {"70", "Saint Petersburg", "Russia", "5,535,556"}, {"71", "Abidjan", "Ivory Coast", "5,515,790"}, {"72", "Yangon", "Myanmar", "5,514,454"}, {"73", "Fukuoka", "Japan", "5,502,591"}, {"74", "Alexandria", "Egypt", "5,483,605"}, {"75", "Guadalajara", "Mexico", "5,339,583"}, {"76", "Ankara", "Turkey", "5,309,690"}, {"77", "Chittagong", "Bangladesh", "5,252,842"}, {"78", "Addis Ababa", "Ethiopia", "5,227,794"}, {"79", "Melbourne", "Australia", "5,150,766"}, {"80", "Nairobi", "Kenya", "5,118,844"}, {"81", "Hanoi", "Vietnam", "5,067,352"}, {"82", "Sydney", "Australia", "5,056,571"}, {"83", "Monterrey", "Mexico", "5,036,535"}, {"84", "Changsha", "China", "4,809,887"}, {"85", "Brasilia", "Brazil", "4,803,877"}, {"86", "Cape Town", "South Africa", "4,800,954"}, {"87", "Jiddah", "Saudi Arabia", "4,780,740"}, {"88", "Urumqi", "China", "4,710,203"}, {"89", "Kunming", "China", "4,657,381"}, {"90", "Changchun", "China", "4,616,002"}, {"91", "Hefei", "China", "4,496,456"}, {"92", "Shantou", "China", "4,490,411"}, {"93", "Xinbei", "Taiwan", "4,470,672"}, {"94", "Kabul", "Afghanistan", "4,457,882"}, {"95", "Ningbo", "China", "4,405,292"}, {"96", "Tel Aviv", "Israel", "4,343,584"}, {"97", "Yaounde", "Cameroon", "4,336,670"}, {"98", "Rome", "Italy", "4,297,877"}, {"99", "Shijiazhuang", "China", "4,285,135"}, {"100", "Montreal", "Canada", "4,276,526"}, } t := table.New( table.WithColumns(columns), table.WithRows(rows), table.WithFocused(true), table.WithHeight(7), ) s := table.DefaultStyles() s.Header = s.Header. BorderStyle(lipgloss.NormalBorder()). BorderForeground(lipgloss.Color("240")). BorderBottom(true). Bold(false) s.Selected = s.Selected. Foreground(lipgloss.Color("229")). Background(lipgloss.Color("57")). Bold(false) t.SetStyles(s) m := model{t} if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } bubbletea-0.27.0/examples/table/table.gif000066400000000000000000001500221465647402200202220ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!"""$#@$$$&&&'''(((***+)U,+Y,,,---...00011122231m42o444666888999:8:8:::<<<=:===>>>???AAABBBCCCDDDEEEFCHHHIIIJJJKHKKKMMMNNNOOOPPPQQQSOSSSTTTVVVWSXTXXXYYYZVZZZ\\\^^^____````aaabccccddde eeegggghhhjjjjkkkklllmmmmnnnnppppqqqs ssst#tttv&vvvx(xxxy*z,zzz|0|||~~~49킂=녅A뇇BꈈDG鋋J獍O搐P摑T䔔X㕕]ᚚaeߞjݡoܤrڦvڨyت~׭ղԳҶҺѺѻлϽϿžàŤȨˬͰβдѶӹռ׿ȿ;Ѽ׻ںݹ! NETSCAPE2.0!,X !/0 ! 6!!!"""$#@$$$&&&'''(((***+)U,+Y,,,---...00011122231m42o444666888999:8:8:::<<<=:===>>>???AAABBBCCCDDDEEEFCHHHIIIJJJKHKKKMMMNNNOOOPPPQQQSOSSSTTTVVVWSXTXXXYYYZVZZZ\\\^^^____````aaabccccddde eeegggghhhjjjjkkkklllmmmmnnnnppppqqqs ssst#tttv&vvvx(xxxy*z,zzz|0|||~~~49킂=녅A뇇BꈈDG鋋J獍O搐P摑T䔔X㕕]ᚚaeߞjݡoܤrڦvڨyت~׭ղԳҶҺѺѻлϽϿžàŤȨˬͰβдѶӹռ׿ȿ;Ѽ׻ںݹH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~7 p4[ a&ݜs8wB) Ip>d @E(|N8 KsN-Ka7<0 bA0H p@D|@ 3rttDJA,Ow*L .DRP$Z F`@DdOR$is̲r+w|'ΛgP#F8 Lɠp0p/73]-v1@s[ 8 W%Cki@p^c `9n0҉\v~o$4½0?[Go8L:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6kpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָε!,W!,m\ N *$aC xbŠ1>ࡁńΙ+ƹ.c* ŁL̸3bF{!,W!,zP H࿃&,p‡6Q"C-ĨPA= !$+Fg9@*IJq\ %:ʆ̝S&=}4Z۹:Ks$r:7jOΝ{ᕩ@D]:۹3kR97A\4#2tnĕ,wcuXs(m4If+ ZdiC !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$8 +9 &I3k^)0M gܹC\QN"Z Ti?9⼚V;oZgd?5lUcpu"]`5mC@6Tk84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL?.a,`řVw%I d9\8<:mTHg W *ذ' qfiϳ-gI+Ror P'#G \ '")`Xq̑; \Hv`!Ԡ p@iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"\T>;ɘ3kJ|M=uvHspILC3#Gn&9#3Espezt@[ǂY  Op? !,W!,W!,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W[AiH*\ȰÇ#JHŋ3jȱǏ CyP (S\ɲ˗0cʜI͛8sɳϟ@ Jѣ+"]ʴӧPJJի9bʵׯ`ÊK6)hӪ]˶۷>Kݻx┫߿ nwÈ+[xǐ#Kx˘3kNYyϠC,ӨNͺ;WÞM6lٶsޝ7 -m#_μ9VΣK^:سӴܿ<<LVnz%.P yɗV $`M(}gĂ4R*b9<(h.)a=Q+գvD[Jƨ2RA,I1iz({+u0PL›HCJKʤ< /MS1EW8-iJ DJ+2N,l*?3M'*t#PJΜ JՐ0TG8y wR%R ZT(ˣ#G%JRs|pJ  x)ܲ]ڦ4=d3CA.3 )s-RmR"34G1Kc/m<:oJXJ,949#\#ArN-+y1(9ڰc >#`ꬫ:' 288'稴9Ǡy:J{o  &''onvJw'ٞtؠ&R̀4'3:#Fw("J2αK_2Kba2sh'Cpz a oLӀ*$% #x'ޥk(@U+fqQ04)y^ødအ cvF%,#spQ1!dF@^C sIHto8,xءM F#x$.94Py5„ xRC]\-S]V2/Y9&as,$<3G$-4kb$<ObWR,q+cZÖߔ &U28DI7wšJK ]qDJM,4l`F?B| f$p._i"4% p%scd]NxPSJħ9UmAjJю~KS5E-)E R*6Ĥ2e1P@Ru<^Yɾ$AXF*2piKh*b!dVgg^,Ej\_2דV%.@MYQ$T rD.iOFhX'QjqWLVZ˽5LsH5ugJV%ohT/6{_B,\o +wÛ\\U X7qJ")[91s4SIsڕX @$ "[S $`*SP2$;<dxɓI2ê[$fu,5ŕsZq'D4 Ht4x,U9!@#4L`_[]ɒQ2%2DVQ89R̓ % u䲦E`SpH3!sz]Ik[Ma(ApWbs`ZVIb`>ɷ7Tw&=$m@ @@Ւ;~ΚPq`2?!",CG[P94+9CVYS!wel+Px+A3LDp||a.s#'¾As:_Jϓ(<)010uA*4̡B'! }RBjT2uNIp~i?RJ "i)(|(i<yb2fOiS^/pf c^ڐXY.'᫁j(%q{K|???y<`VQ\I<QP"ed(IT$J&@.<# mCmg 5P(H"2 v e_P</ $P$gՀovHAxg$Հ*WB.~',' )xD$X"Xa oM5@zeQH@gebHj%52Aqiu ap+ 0>^+a;q\vs` XQW#%( &eXQCъl(TQ~xxƘ،yҘ6xzظh؍XXx긎NHX(؏)Y ) ِ9Aّ "9$,1ځ*ْ.2YA6:ٓ>BYAFJٔN3 RY7IV;Zٕ?ɕ^CYQJPfyhjlٖnpr9tYvyxz|ٗ~9'I٘9Ywy+aٙ9h*Aٚxi)Yy99ęyřʹٜy9Y٘y YZ9onuu 09y t٘Ixpy *ui hz0xp &,z)tr蠠 >ⰟYy ?j@GAjФ:t) pQ*@hY : x pfjz?i)`{rɟ Hj` P9`d@کХd@@LPޠxکПP]pf٫6dkIY_Шj9$a0m piS`|p[ږr٭@gI n9i9J y`]pikPey*ِʣӺmY̐gfYhPrg9%{jg`hXvvBKF{d0 J}@z ŀg m) jtIphPg x gPfif|[~ e)q!tJб)kWڟYZ*p`L/k}jgI g)v{fp:JJ~_гJ:lЗ(J mfp`˶eɽ ;막Y!j *fz ʯf9{+ J9*eYZ Lo |{akU0Zl {kg0P e(A<:Zɋ ps)Pg 0);֠S{`reXlZ=e) J f \Qg)tle Z`Kldm`P[_w[ Kkr ʪlo)rIſih ꛿ * jy}:f\Lo쭘o`w|j*l k9!Ōū JeYf35 ц j(y @KOuv* jJ Jb]rIqѺfD"~jg\| eIhi.JËZiӇ4A+8][zīmp@*`}pf9 Zey~\( U jY k˚{j }zgU@\v6"Ll/؎P ؅|f9j[U{ jY^:r ~ggI ]\z *'J, }e ҕ dj Bnӄߙ}ghln i٧@l-ph^^\nZO gYfyQ9j–p$ eˑ^Ppꀶjd|ULPJЮJ@fYZO~Q\ mPnWkimY̰ɾ_] پ~^[ъ۾o) 6k:׆p0(8S Pn~p9̪ ^n欣_ؘM߹ʮhYpkƳܤ:[NjK hi=_?C_} 0,p =n^S` Ż=S:j tgo_jfM:*?=ZlY^jLs9՞ϖf@­Ms~QD#E=~RA&MRIɓ*]6S&"Df|SNZ`TPEETț1k6]UTU^ŚUkզ4mVXe͞E+ӮmݾW\uśW^}X`… bƍ?Ydʕ-_fΝ=Zh35FZj֭]{lڵmƝlݽ}\8bÍG\9],sХSǎ >|.)ܹV)䦫zW@_'Jps2aPcFYB*rd=jf 9ǘ:?jĸI јLs'*hQ19X 8h2!9VXb97)59n T IGϽp p1\c=+ -M);}]ܖB@` mRDADL:M誌)}dqE PRL 0d y ^^SROf) !>s^XV~ӆLDcBACбLQ ӈȷgAs=-NT(ѫj]&R4FʼHF+{2)kL79ጭR3&) n9ݕy;<@w*r<)(MH@2%cn˔Ȏ):ݞR:'ޖYl ACаrHڃ'+zg>SP}= &G[Jd <**#M'+ݏρ}.A&`( $ %ॼ>/@;A,@ph Á@ ?3DAH'IJ$+|˛ATHČ #D$AT&t'&)*l ),- ,/0, /243 2D5d5T687:&;=\BCȰq@9C߀! ppDb ?:/Į HxэS)mC`G, 1]$:EE-AX\нN@'rfPr )2Y,* iĔ f*i Dl@`Z?aH+Ǹ,D QZehƺL 8g{ Q[ SH  haikIن9/y-GHs(85:W& s3px9 vqxyPT(hs~Pن# XFqś Cǻs` "ǐA› A-| ̍XkDڑT˽Hٙ3ɭpȂ$Ht 4P sP q )i (ɼ(ӱ XF88ٛFQƩS;r`AY,8Nٜ`ʖs@䛙9YyNVFQ% ؝ХNPѤʦw O0AT3rFpjpM5F ϞV;# 'H~8+!-r.0C273W54g7sS$8:o9sp?A B7C<H]sKh F )(T(s acu$9PȂh \bԑ!cahhdNej|fD1ɔ3 VG"TqP6+Hw lNq_,HBAHaIH נ[]ᕞ o?C]lۋtu7<Vn9mzz^ <ʤ 0 W"tͽv)i5Y_Sx0LgHUYxLLFowkxӘ$¨LqQXkL eLMi#3j 2P #Y7#ԛlzXr+7Na| l\N?п yy1q_ɷy||OU[ Wz-( 7dsx03uÎOi ї fs(`9rΙA(\ɝӡ q9hiEM඗+5zxnXK$\P9-Jt9LF Uth~T9J#sS ;j; &;WXf.VXD%\R/1<pFWumVp9$)fWXK~02<s  #iӺ zh48\[5Hiv0\Ǒ["PQwo_Fym!0u R9㐰ZYgP@$8\% UAS }%FaQr3 UAeds egm"Pxch"I݌ѐy$oD$9tR88}PQ4A^Ah3A5f)Q'(Q^ VɨP%UQz؇ "EeuG6kNGuEZ큗!H(K#Hh Q lH@$Ikɶ5\cS84k&BD vh䊘iT9hɶTAD`SMD\ *PܪlrHaAQL0`꣫&!ѐ9 u6@iQFwBPѝaZjhvQzj43?9lA1YQ8,.b 1 MLk@nAF8fGA,5ϠmD5w R3ND 9Siۜd~_)r-k4R*El,aP qH`u0rN,@w40Gԕ'3뽧w#JS:%'Q̛$a4QB;o٭мmr>QdgmPʹ:O6?C&9Hg:ԩ#q`ƺVduQ XL#)}LlmL亂@ u0B_1WFW0C#` p)Nj.Q '0^DfļB#F" 0\T6"J..<@9D‚/YrsQ0`g4tb(8G5&F񣈆qjP5h"Yp4CK=,@q l1_" ow t #slHE{$*vd 9!FYNd~QbAb%8"P4ȸDI)r SAE!".%\#ȪFd F9O 8d"FY #4S#4FO y',?RE58GRIW c@0gADA:)9RPыftT(*%0,(EρQhH4. #=Mt5B l dd)K5S Mts(c-S+4qS'@@A}FďH23.'O[Qxp9.a`H G#^"9l,Y*6#C0^6TlgT0"F5r N8DZ & QII „8xn^e6U$1 GV"#12/b$QFGHMfiW_:ľ;Ŝq$H5K+#1aka ȅC "InA,(\8>G"5cAa$&SV +r=Uc'NAAqD˜R(+ő8ycPP:. e8@iX(#кU3.<{PŌVņf j 40^t-*M%9`P-e=ӊĀa «,a YXAb] H^-abȍ`7) mgGԾ6 0TD!5qW .w=uu!ߘ R@E*\{;7Qd{8#.7|83qV|8C.t|&?9S.9QӼ6ykf<׹σ.D?:ғp+&A-!RS L84@X@\e+Ϲ'@F@WsݷFsB?b0"Rl1Bd4ߌV!Yab'KȂb+!E  }? #qioAkHx@a2G3`bɝ=3oF y԰Aoph͡x%FRЋqd/&F@ 9eAIJaaF #5.hc\bʬDB\AP6Fՠā ,")@CdPAOI$=Ob 5Hf\S,cFTUD&P_duEfI0AH,_l@BPPCtADGn&,bX-nnJ-ԟJhCo DG&@l6 e E-, $%^&nRPF5b.Ǎ {_,QgAQ9U9$Ȃ4A2 QW8+2 + E%  ڼhّw~9|'І9cIA 'P}FDd_mWHeF9FDz)Jfʡ0 $Q(iDI. E~|I E8R@j_`D@pԀH!@L$^ Jx_D,t'MQP G(ScFi8 hAFTA@DQR d9 LL`( @Jj9$C#rI_L CXDp5|@Dkñ&9tXXx_vUE.D0 L vQ؈kEOkХ@4(8MXP Tp*zjcJ\ ƅ  B>E @NQΪnIXrB ĆŃE,L8NGF(C(("v=jAlƹB&9'xPpISQO蔎Nd᧍-Q8́4uCdA|9 ߊCf]`A*AhDpVPqzij<5FĊ+^jjt6.Qm$ VABgll,ĭQy R$x`ܑ7Rf!Q`,6 覶U2bC,E@ݠznQrT؝Ë6&n+RȮ0nQ*8eGTSPS:SM?٘FC98#99 C n\L@ FAU)@$PQ-1I4EpEӔI9,$A)'~Dg91۫TKTEU@CNY@RyUASP@0[QN]ݕA9"YD(2#;28C3\6tjqjp4\5HRLPrkD7pB+njߍ2C@2WjE/,H2s7h DF^>st2uAHnUCoAwGmhZEb%xqHˆsAzuC{WDxL9Mس\*f[XMj0(ԪRYD$@quF cۈ,94#XMјA%jѐqԜbNMSY߂G8OKYeClPxT T`kZXA dbvx P&ˣYP!YurթF)X^xgA`޵b/BM[i9%6cO6e eG6V6gwva6Ig6jvmjkձ6l6mSi6nݶnoop7q7r?q'7s7w-sGt7tOu_UA9w˵}7vv) ŝЩ=]|#l1HL33HCt*).Px?8*x'\ ߇HC`P0!d^⩆4485QYG25q8DzCB:@9 đJ   J FF EKD5Gd89$vIPADGP hC+X^!ފraDž@vaZ` ,tSQpyFE"`9̙ɺAGĭ:MznVb46*#1c G F2"Qd{Al{`no~/pG9@TDS@*,8dBfm{CdD\@,9d;#`0ATGҽ}EGo*CD $^X|ĩL$G֜xD\yأk٣@=+PAwWYQe]fjfDx,A4SFe`Uӗ+2+o0Qװ`iqPe rc s1fŢʊ%44C$c"mQG4".LL̾bJs5mp2r:<9#:j+Lj@M|8#;32E@-tQSDTTzS_\a HTh*Pr(#̢嚳Ձ`@sr09' o:M8EuW9 ASSc0AԢj98ws%eHun#='^f^"}%H=3 yܐ(tҢH΁#&ͪ J~XZZۚ?`5's `֡(yh (&< L/*Lȓ~Chު/:kjgZ#:&Α#J΢N2́c 鳝/jEN:/i/! hS:`oBdlHlH"([g휊,,191WIL7Bϡ<0y9٭b;^ֽ!1-$ N<1ZheEq%1$"m"80u D3Ī@ qBpy^ d @(/ax8884wy:L.#^ x]5 $M_D10zLkA dWF0"e<x5ZO#n#(1:Î ɣ8 4Y9Z I#1XLa~1;N` Mbd9L5 ="W!vNmbw 4iƳ^9vTb %Tss?#! ᖶl!1G3>~ IM;S:m'@iQ7[|ܲ&-%/R/f6.|j[( r^hnsԙ\"(gHmss@0сs/ 4òL0so=w@Fc4FW:ӕQ"̝dJ){{w \$c/{J ~ ډ|y i`L@L @/uE_` 0t a, /"A]eUWz"* Xf 3%0RU@?!%? :9Rq@94"Z@"!( 4d8! ! +CЀ bd@c$&&l` dMd(RV0,,3p;cO4댰u"`P!X@CJ zX`AE"  )8&xM$'hvD"!F,Tv % 05)v`#P 1"`"%%$hB%%`7"Ա%q ܑ(:.I"'`PΡ8#""2B3j.$<% ꥮi0+ 5TCP4-E7#bl(br&k&/$5^&)[m/8 (`V,TfёD.B@xP\0‹PD$ e .B É# Fd#ނ$)c I"FbKΡG/dGS#LF3G0<5Ypb!$"*3}\-4PE+EO#1"]bi="T0$2V%R$/*S XLebk"9eZkN7>SZZ(V_p^!+I* >"c%5Y!-3b"f-` H (rh@C3#Jbvl(vnr*G#>l/1#w|$N}hj49@E?|l",!&Ґ"-b ]#.g@D..O2#tSL1B0φp|4RńP8J>TO2'34*iv;`rf蔂 t&I[x'"-b aH #4{ }lLw*ȡ:Aa b }b׷CHT`""x"8 wB"q($8-" gWI!طQ8U]8Xex7-iql8ym}8X΀xͬxxɔ8u쉥8x&D8ɸb8ոxx㘎gxh&9y 9y!9%y)-195y9= !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,^L@H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`>-q سhV@͵j.kI3ii.Ʒ@떶$}5Ics継%1?w\8+[`i,"s-W6:6kװEVp\!Gx~Cq,7.A~ A]/q )_S0ꅳ sgL8`5=$؃8S  dG v!u3`CY z!X$P ő@ @fA8#>=GY@ P D`GX:X  i`Bc6AYis$ xJD`AӜcHYW6\2 B 9颍~9oSVP pN$@ӍUB1@9$Dz@B,aDA7  [y@69P 0Rz(DdD9t,kP X @P/\3; Q ; )TTZy]2 jtF@ϝ@HŐsqK qG)A@Lg1V@#o]ePh&KtA s@@Z+P_ 6^GáJlPڔ6d QP73['-ݜˬV-P͝1ihW A([tgJ[9KH- yљ]n%`D8.#Pf_|o'ƏĶSd4D9hl&5aP%@3 d?ݷ@TA{$@V@#B Hsh@dqx-&dY]B*hX k9*!LhAkȬ@ &D s01L kxÐL)3:7$m dpd '#K36AA 8A-rыsj196*dSF*l!xcAP%QQ.k| 9Q~=2d#/yIPJi1B{)B!%D y eA D2$_.|nt8 5n`9A@xH>` C|2 8Q\g;? P n,1G}!dg? $oL9jykNr;xQLDuPdAT2G Δ" RRst u t@W#@`CЛL DO!S59 @eh("n2@q @%e^-x" a/F^6f$\I7׺MYp2=( -C Y,Ҋ!!@Sd;,d4>Q@xB`^t:~B Zi1 FH+ ;$E@~T,*AjV|C1 0z#7 wfVG3H wh $د@; 8TD2ʂvPaC4ׁ<8NKto tD p&*f@^Q.ԺiARkV d xB|%7sBH>sTP09ļ)Vy2,ՂHhMF:@S.ܹ3y5,;7H! sϱ3ICҖ~L19B^W, G2KJ~tV 5CLhA[Lx@ P)<`$0@pd ;N bޘ#i18 X`y2,Ay@=X7(@`5D* f6PsO"8G$5'& %} Er/9 rԠ`t & K9Ѕrsa 2 o3^@u+[ozLz9}$D?M]Pjǝ#iLf]X%l{p{U2TB.i_ ϼ7{G%OWֻgOϽwOO;ЏO[Ͼ{OOOϿo'h  z (dzX 0{PLGP  {Z瀾g Ѓ0 a{F )z<>(({zNPxz4h8p7zЃz@T' zrzu8wzn 'dȁ~`sh{ ؈HzJȄP S7hW{Y'hȁzFP$zUhzPzF7،'`tU`x~x {d؉{a0@ZEH}ˈzȍ  P G`0 YG"Iziǐ)|_tz ЌJ*z현KxzdX{{fPWd{S H35yz7pz]Јzz?ç(tzlp9|:ɓG `JpSPEJ@0yMQzdJP p8hIzoiz _hz 7zXPgd g.|EizڹziziԐwmizX@@izK7hPȇMzjԙK(WP xzj(qJ6( 瞵7˩L ӹZǁJ z`wzi3z*zz-`iΩᨠ 7( L, gʏ z JJو`UP''d@+*U0@zJʤǐ`zZHJ@eȁCxzarj 7x9PjzʨjZ|m`{~ &zzp Z ya"ZwgxzFtzvz l4*Ɂpg J pʁ șz@ZPy|ZP I؝J pcʊzgpz/zZwa6(p(z;{૎@`P@(ɮ 8J6@ZWд R[|PP7'oP H7 Pdfjg 2 G zzʁ>`{zs[ 0G0j{L^{z J ZJz뇷`z}p[{kʸ3K끓[ugЫй p{+{`pz}pG Wk{pfKjzˁlzW;{XjzZ:{{⫲kz{zz6kz;Ox= 0 | 詧'${IËl8 izTE+{OPӫzVYlzQ<@ćPwkԹKp˟{zk;É8w?A찰ۭ [x rzOzO`c赪@(Ay@z\ʪGezʨ(xʫL|0xr PXZz-|7 [çwæ OklzUjIQ7n̰׈zSZ JPdJ6XЈP '9= M7x =|_h lzl pħe/: < H Ilz`B;+7I9ҿXdh)HW`~ҩW!zfЙPߐzЈW ֭ٚǐzu}xM87ЈǒZ`jLɭ ~;)h٩xțzJ tڵSة?Qh i֒ݺ'zfPYzzȱܪ9Gݔ--"{X}]~P@l{U<ʀf p޶zd ګ𝄖 a|z{ W|>$^L}(n,.n}-J6~8:<>@B{!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,^L@H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjݚD`) Vٳ +][ RasZ]䒛wXC KULq%ҎÁ"8u,qJx.h3fh2:g sWK1m:,2EEnEK rF4ԩ8\Ztȕc.҅9RRq%6B肤M;LǍhFA`DG *hI@0PݜLl ^HDTȈ`HЅ9ՐT{8EwvA-X=0HiMl)UE;ĂX9J^q$P0xYp+}p2QĝxFQ@'WAp#Agm~t^049x49۸H*dh AVF94A AAlTZԀWm:@@V6\2 bxgЦ.4)F 9z9,bJPA@v8Ш*#MUCꪭ98gLs@n(7/ $0\ ȋw #a@KйـWXr5}( AXGT@:A2C@6lrkФ0A[A"YBFvAuA#|h=P58S6hĂ遛@@vBPGT` zٌM% W( b4INA㐗t^2Hm9 t8:3@EF$Bmyp^3rB ^xTAZ^ ,!M(9Ct2^u6*"あ؏SABs8c 8Bs"w @2S D@@A`@g*̡} ^* veP!Adƒhr` 31)4؅1sE tXċ9>RdUQƐT@9H xYpjT(ΑpA+$D@DH 81 D QV ()؆PA?ܑFz]r\ ɍ@P Ehhe0ewZ,="H:GApe8rp Mp:/iPd^L6/@&f7'2y"}" fX JDvg"P1 Bøm(^c ipD~H9@v3m< RM z)'Oj9tN 2 Mdb :@0q`SNa*8D&a[ W x9@j<`bM3:N@zOws.gqDB28\Ȋ-A8crK#&Cα A@+H^1id=NĀ@ `:\X )n HOB.$ %k~Ww;/EGP2hp^e2T1)GֻgOvOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xo`Jȁ ͧOUP ,X}PLO)3X"}8X|_P >8|$~x (2h@\X} /xS {^|acg@|oM S|0X 0@|@|t p0|04} (@phl[؅X}P@ Ȋ׆W(' }{vp|2GZ WpGh{PX WM8 H}H dp_~ȁ a MXxĨ~@LP<W S` |p*X{@(|f|P`X b{ K(]|2Hwl t{>>xd7|f)Ǖ^|`ip{yh9}cI|k9V{{SP wr0| '9 2Gg ~ X7TH ܧJ d{UP [8@0}{o0i{d 𛾧  ) YyW pWIɛ iȩ霽H鰗28g |T' Jbل|ag{z { Y7K9~Z@o Pp(|^1f{rH[θ3{<ٛ00ڣJPh8{T*hP Ϡ G7UW{:Ɋ; @h DxJ טL<@@KûS{/ JjJv:(o‰\\7x{(ȼXUP֛݄7' 2X aə0× WB HƘݚ2 Ε,+ {;N@c~ ӽWM"8һ }h IElpLr{Q{d@gy2 '}0N( ݵ9< lp*پG P a2{p{rޯv{0Iit`kˎnυ!L罧q>PJ={L =Xڮ!M$뀷*J2=g^l` j|UD~|a7~ p~ޞྮW   |_` @GXptpN z: ?J˩`0~ +|ꀯ$x~.,!/U ;:<>@B?D_!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,^L@H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXj$ZRt 5سh)V@ .)w.Pε\M/ RpLi]j3`sj~ͱR^>–.A?4}5pe6,$@Ғ+On㠓f,|IE3׬AmoEai{E>/@ڳFbhѲ9&wNy~& %9$C)c\DU {(A7,D@<&)k dy4vluR$n3G$+7cW!+hdt 9@4ts )sNE)gbv焘+}@msL"W 0L^d9$ yA6L y@P$PXP'.A MpBLMtwoW*Fj\ Ms!9#Ax#.(E^ L ] m2A]2 Y( 0RЋ$9"9Zx49B,wbcAhw4:9$I 30yIlP53=1r6mo'',394Sl1srg 98ԣ,) 0A{,,Qf!9} (]r.}WؐXr5YJdvFR 4bBMv+9 $9|N-&KZ, { 8\Olnxq*9#N驟:Aӎ"$Aǜ^Dyq`*A10ٍMR-.+QP)@˟KHH9y1itvҹ/@moC^%\w*&kdfw;& 0/!4 @s@P砠@FެxB^d@3eu@D5Sl4c6`WG.4 :ܭ M [ec"pX zڳ ,K5AO =@0" T_RTȤq4@; 9@$K^YdK`a^8Ƀw$##)P,^ 2RD,pZA~7@D -l@FD,@A4"AF9pAI1|(\3"ȋiF'vk@C_s%(`Wv ke"Xj9Ⱥ=FQZIݮ@ʻ^w5/hЛ p QELYp"ہ`(H8,abhdb :@h |$;G9Ú?78ȁG#[dd{p`k'6a8$kĉ*?iA"% :EApA5Ȍ(S dFB7D]@"x Io8ᬏrl|0Gk><g^t-79o9Kj~2s"b5rďa{.ΦZ_D&/{pؚblr4#@ۈ653uS(3H2 x@a5 )uOdc3<46}8 Rkf,GW#T 7PsO@1}GPzb~~a!~2%!h@ r RFt]c"?z@8G UD\NS`e+p|5KsNAW`)p,5`ZmVHVG(I^@N1aH,c+@MBWTH`Za^хPKJ0 VHT2419 t wc51$Y Mtx p1]GQ`P8XxJЋ8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Yy ِ9YyX Pm Б ѐ)IHP !iZ5_PI PL`0B9 &)a@CI` [( ڨL9f gkٖȓ> Px9ro S Xi UpXdٔOѨɕp^i`)ٸ(\ ([[i0 v0ٌZ\ ؜YU?`iy r [iY9)itU [؟ ٝHJ,ً0fP i[$:fS)|ip J@ :Sꉌ?˩L @Zfˆ_iEJd)aТlpI;ڣ[IH p/1)8[ aɌ0x [X)@[ HSPZp(Xhj)Pʪd0􀪽  x¨*p[Х` Oڋt\J[yHpJhψhJ`rZh ʌ ۰ 8z 9K"zUr١ڙ(jyxɕꙻ&4j芜P([y:)2K[Y8nꚽy[HV[d)DJ Ƹx6  Hً| jZ UK9[J j) LUdꋰʹ๠a`JP?[J3xJ:Lh7ڠ -ZE XJP ijؾΨ[  Pl+܋ jJ  +ȯ( ྽[ְۙ#&(l($1<û[ʫ©I:ZH9%|¾`L`^{h:iˆyL<6 xI:Kp0 ֈۋr\ȐJKai)a`Q @8ʛ[Y;e˥+XdxP;iݨj:̈ݹ(싉P l܌,[%ǺZ \h][ P [iʽ蔖 ̧IXŬ" 8̼ -ҾH싴o0\0Y|98ILv tJ nj|,Qi{en@ ܋x [L'`F~ ݑ7 в%M̾()fMؔ݋Z6[Фv)@ zݍLz@kms݋̩šςKֽH L;l׫,u y Z Z^{ށ ۋ =&p--/-|Ҋݍ␚;nи:=xw6-x :~ޏ LmJ[I1أ [)޾MaRNV$ ݋l?0|c܋W l*=`(>?:1Q ; uA+oxAncSA %:z`Rh|9ۮ1w 5B*<=мGDA臣>}Hpҷq9C,`s0b 4/, {sAw?=͐Z I >dԲĨ1|0_I(DiO!^pr 9A,/!W$>)" IKÓA(qgB91$ M| x=< "ȁҐT@dѳ& @<3Gh #-`|R٘3R 2 QhI ZcẍƄwIvA$+> Yȍ\s ipєZ8 b\yD%4@6gu yQkT.4P';9k (@H节HAIPD(H&* |FU9A.|@T ͉NTd؀@B^zND,25s0 Hh9EmlX3ƍdGI괘H^ $S N2ֲSp 9+  dDA. QHt m@@q䫤[@(11sx#Q@±Hu9̓ d0H ڃ RL3ij:RAȅS,BhuxDW ځLx+G\ݳepN p]򚵠+FIDa;^W @ +W nQ^l.H6s !vͅ'R\s7Xnsuj$D8G0 RzmVVS<|WZ0PEq+ FF2wWHqmEvߧ7xEA_ZH٨:Ͷ}xv9C)=Xq_4h1 '8JAcs$ȴf͹<@\6ӳ%r>9Bw^N1AV}VW6 ֶ^"[pX`;sp-"E 'G6%p FdK!>aӚ4=Ys~+Hڃm{ّ^ꋗ ;|HSc$%>3=lnY 3ğ*tl  Z$@h ;4Nv2 H 9P#?A2?K ~K%F5fO#!;0.gt!aM +t2b8{=aAA.AKq)|Agi0#HnBAȇU|:#81I&nMP vl'Ul [$< р(L< tgOwJ`&lQf2YQ"H&8 dDW V`HxeqWY9&D 1dUQPVuWZXɗc$B7R]$A('5gpzȇv~({h`j[11PE 1=v 1SMQFc+R(qYDpG0u%h3*dC w GA6VP̨A  1ݘ8GQpP与؎8hJp؏9Yy ِ9Yyّ "9$Y&y(*,ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPRٓlSZU( S jd k m9Z {ّ} X@UZ И٘zr  )  q}0a@` ( qY  f 9 I 0  q0p 9Y鰛ɓrY)q)^I ڙm& P ޹Z rЙq xq Y9 "I iɞ8*;ZpDZٓy@l  됑y0r q 59Pɦ@LPpy(tjq ) zZw7*X yl0f q q P9i EqI8ڏd ٧mpjfjLa r0:M€z9I z݊`e퐏*ȯY)yyUP pJP`m`(kH ۱#9 t>`z&kK?`ʴꔄ,jXZ*XWY h [ٺJ` 0hPuxz˷J z:  ( {| y9j@( d+8rpиK2;ߺP{尠<:ieL !Jaۻ@?* ۫JyZjz(0 pa.Gaz WX#/`QV4HV( GmGVk{g`u88PἔU)ry2/)Vx RP d@88S9,"ADfeE#,qP+bY [0fVe99 T!Bh^AnlnM6=CY l9z@b@(sҜS A8H L@A*)XZ:PYU)& R#*kDl$W4ksĬk_p؍I2b m3l`9=v TЋ4V-04GVy,u/Bkӂ@S1EdEL .YaY܁v.ݭ@kfEXx!`34Ant+ -9e{ t#; -1Al@s9#_dZSIFYkCUzcnfc ؀  \{Aː$yM>Ǔe*U ?ˍrJE@r PD!@X48p. xֳA茐 VH([Rto i| Ae8"jͣsobg* ,nw^AWыNgf;qM/Vj[I(9w!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W;bubbletea-0.27.0/examples/tabs/000077500000000000000000000000001465647402200163065ustar00rootroot00000000000000bubbletea-0.27.0/examples/tabs/README.md000066400000000000000000000000551465647402200175650ustar00rootroot00000000000000# Tabs bubbletea-0.27.0/examples/tabs/main.go000066400000000000000000000056061465647402200175700ustar00rootroot00000000000000package main import ( "fmt" "os" "strings" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type model struct { Tabs []string TabContent []string activeTab int } func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch keypress := msg.String(); keypress { case "ctrl+c", "q": return m, tea.Quit case "right", "l", "n", "tab": m.activeTab = min(m.activeTab+1, len(m.Tabs)-1) return m, nil case "left", "h", "p", "shift+tab": m.activeTab = max(m.activeTab-1, 0) return m, nil } } return m, nil } func tabBorderWithBottom(left, middle, right string) lipgloss.Border { border := lipgloss.RoundedBorder() border.BottomLeft = left border.Bottom = middle border.BottomRight = right return border } var ( inactiveTabBorder = tabBorderWithBottom("┴", "─", "┴") activeTabBorder = tabBorderWithBottom("┘", " ", "└") docStyle = lipgloss.NewStyle().Padding(1, 2, 1, 2) highlightColor = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"} inactiveTabStyle = lipgloss.NewStyle().Border(inactiveTabBorder, true).BorderForeground(highlightColor).Padding(0, 1) activeTabStyle = inactiveTabStyle.Border(activeTabBorder, true) windowStyle = lipgloss.NewStyle().BorderForeground(highlightColor).Padding(2, 0).Align(lipgloss.Center).Border(lipgloss.NormalBorder()).UnsetBorderTop() ) func (m model) View() string { doc := strings.Builder{} var renderedTabs []string for i, t := range m.Tabs { var style lipgloss.Style isFirst, isLast, isActive := i == 0, i == len(m.Tabs)-1, i == m.activeTab if isActive { style = activeTabStyle } else { style = inactiveTabStyle } border, _, _, _, _ := style.GetBorder() if isFirst && isActive { border.BottomLeft = "│" } else if isFirst && !isActive { border.BottomLeft = "├" } else if isLast && isActive { border.BottomRight = "│" } else if isLast && !isActive { border.BottomRight = "┤" } style = style.Border(border) renderedTabs = append(renderedTabs, style.Render(t)) } row := lipgloss.JoinHorizontal(lipgloss.Top, renderedTabs...) doc.WriteString(row) doc.WriteString("\n") doc.WriteString(windowStyle.Width((lipgloss.Width(row) - windowStyle.GetHorizontalFrameSize())).Render(m.TabContent[m.activeTab])) return docStyle.Render(doc.String()) } func main() { tabs := []string{"Lip Gloss", "Blush", "Eye Shadow", "Mascara", "Foundation"} tabContent := []string{"Lip Gloss Tab", "Blush Tab", "Eye Shadow Tab", "Mascara Tab", "Foundation Tab"} m := model{Tabs: tabs, TabContent: tabContent} if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) } } func max(a, b int) int { if a > b { return a } return b } func min(a, b int) int { if a < b { return a } return b } bubbletea-0.27.0/examples/tabs/tabs.gif000066400000000000000000001061061465647402200177320ustar00rootroot00000000000000GIF89aX ! %/*0 !.!/! 6!!!!!7"""#1$4$5$#@$$$& 7&&&'''(!<((()"?*#A***+)U,*W,+Y,,,-$F---...0&M0001112(S2223(T31m4)W42o4446667+]8889,b97999:8:::;9<-f<:<<<=:=;===>>>?0n?0p???AAAB1tBBBCCCDDDE4|EEEF3}F4|FCFFFGDH5H5HHHIIIJJJK7K7KHKKKLHLIM8MMMN9NNNO9OOOPPPQ;QQQS>>?0n?0p???AAAB1tBBBCCCDDDE4|EEEF3}F4|FCFFFGDH5H5HHHIIIJJJK7K7KHKKKLHLIM8MMMN9NNNO9OOOPPPQ;QQQS4 uq`3 MRlu'1L@(\Q B&cfzmvP@Ft?FRn IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6ppL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^) !,W!,m\ N *$aC xbŠ1>CńЉ.u* RpŁL̸3bF{!,W!,W!,W!,zP H࿃&,p‡6Q"C-ĨPA= @FFg?[*IJ_ %Zʆ;S&Y}4Z?WKs߄~mO*k╩]]:?Ok2oA\;6 82-ĕ,ᯜ᳈X ;(ELf+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H +&I3k^)0M^ϟCm9_QNZ T?y?9⼚V;oZgd?5lUpu`2]=sE@Uk 84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL?.a,(řp_=AI <p9y͟%`lwoZEgW :`a' ziϳ-g>ɯhor /@MO\z./)\}; pHO`/h!iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ23fd'ɘ3kJ|M=u`L,훉C3o&%#wI~ez[[ǂك-^R( L'o)I_%-r"iy_$r_  `rxŀ_@$P#N'NgPbAhP0 OM3q}TL ѴP;H yЁ7lM xB.?a38 d71.ON/3E(?ADhg`@А[g|TX3j4 +pCXǒ )3ȥ1'"Ì!1Ǔb?㋠,H㔧T3 O4I;o#@.Q (A=q̲%х?!HRNB$xΜ'vJxD2GLl7 c" )i*㕚CBq~eFf/R%˒Ӗb9 Eod.S?$_l6[P(FPs\FΞ^ ä iCFja c;ȉ($ 'Bxc=ъGiip~""#b4q=UA4TRt$*@(FE?$_lCx"A0Y4@z #BvdHHX MH0hTֺ! D.ẕ!u Go $TBY>7C; Ew=2Hƃ" BWnCBdla yuBZ} 9pf ɤ.&{Ֆ℉~1/B: J8#{ ôK= P?bcR׸?VV1?{%wA5d "{" ^"9&L _2L#8.G/ o&z 0w?i^=+`n?r3j1Q(LHA-鍔w̸ qȅ{LG?BWC\awԂ0k_k{>H|6?`r )D+* sAO{.Eb40^`YCF¿c@e?L`dBGdHnHqc !d&ODCh9B\(Du7ၗS(A`_%^R8H;/NI VҿG]E_;]Bo:B6x8?mt~ P_ԙwZ½Vy[`B //|<(=rf n?[y4Ni'pWYwɃy)42QqE'EMD ؎Y*:RsTX7(r頇 5I7J^T墍YyEI6X7ٙqj/h uvgȨFE f X13znJ { %~i#%CNmiɠ; T=J eJv0sYjyiohZh2 #A5 ŷ$ZC ao-ʘ u>hLGWVך 1#eFq Jڤ sqՍPLYE尯ZX;hw بaԮ% \WvjبLH gze݈A&˦/  +)y% ! 갲z ۔Xy>D QSi]Wh 1UV8xP &jXH|c  Z Q To˶ :`:psx~ r 0RЌ. g}(_y|s_(qnl 1Ruf"빕Kk۶𸷹 "8  El8_f[Wq|˪+8 Qڴf}{ŋ:Y T _xhEF` !pL;Pz t9M_t aI ˹PZYr ȀU/t`IO[ jEg}@|uV vk,[)]CEa1R0e!h !-i,\; P|R,^!o[(]q1_N  !I PΡ/Qhq d!n<H/OcTС}-oV?Qco:Q||Ajl\F1-Eqz_|B}Q60A@d$?Łu!i{~OAsqOB_Bo?ooѲ?NAKWoB??(?poс=!YGT^A@@ DPB >L0C-^Ęą5~RH=xJ-]RL1ięSʃW``Vava'.Vb/b7Uc?fcGUdOdWTe_fegTfofw^NgnYhhYii^SgRkkdžQlFlQmmPn^QjRoVnOppOOqo'oq/r7VruƜ!8Plnrn9&_.c1`o#p2&u^d{R率( 'u@x[(!u tN!d!Łyك B.?K}S{Ç;яX>rg~-~(D~D0JП?(Q0ˆ H]#@%Xt0$>"${ D ?D'±ԝ a?ab-(0H!Z1/ _d>ȸ HMP鏯 u{HCk!,ï l*HYC)*AYlc :*meIFW?tCd`-:؁6A  s $o} \ `9Ql-g6L| lp0W>0;q $(4&DH{K8˰$VzZkmZf]`A^Ӈ"uC  3AE0 H#fi} ԙ` Eu*R5%z+c@\!w& Ɂ愄rAucCB(<.Y aǘߩb\AosO d@GSw@c=`Rk\?^A@ >@x,!{n Ǩm5W H>% ]$Sq~H<:AΛ0R{$cn}иAP煣ٶG#@8g44T L d,`p~ķ52/!Jy/%Ђ @܂L@ oJwx t yHrK-wVs5ǹgfsd=L~tEG]tMzXuUug];NY7٫vGmotϽu{9kxǜor/w< yM!y3GAO8яp7=Pz~_{g׵=q?]؀ [3|O4Ohշаm;o~όѿ2dw͟/O<4Ad}qޓ@ 9 t,$T1,)  !$"C!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,tmS H*\ȰÇ#:<ŋȱǏ CIɓa\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6`=I_9r̕WF-Uc@OTJG3iQ :@R>g]zy?>#rR yJRMny2E zfJ rɧJ#JSI͢9 hJT:acNď,T,4 ̠6Ģ>JkNJPQzb䦥B JOL J) 5&[-G^?` ?\ @>kQ\3 : k7Y 85;\ˑZ0Pv?@(c4?h >yʃO:8ZQ?&3yr 7?K}ESjCBpEM~@*R6u\^;SlsY'yom>яG>𔧼9e}c鵄FՄ逎B%3/ҳV#^|Po OEd#\戏mkГ=V5XyA;7//USҖ0@ (K.TwdCzϕJ+Ķ9k!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,)HnOH*\ȰÇOH"C2jȱǏ CIɓ(SQ=R3DsIށN?N(`KSt׉ð C?CL4tp @+T2NtGsȷ{{ oRo%YR1p9V?S?DߑE:,<D70Q/nJY1(Vxhip.z3(rNd [@m|Pu(Q :**"gգN2c-7?LsS'ۊtJpVxH LDJRR Ѻ QRdyG<Ƕb"!\$Bj=_PiDo砒 1rRKVTzѡu=(*Tk+2phcpE+5hH"SFj!SKvx#NQ6"g J EX*Z0=d5X>с#1ވ.@P؏OX*C̞ н+jhL@ xM =xy-]B`LS' !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,QnOH*\ȰÇ#J3b<Ǐ CIɓ(S\Ɨ0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(VhfR10G:#N#e"R7N<<-t #9bNRd3:- @Ea)T\vY$5A4dGʄ"pVԤ?ddΔUC  ?䙧a.IHv?͕%/I@Cb 7L ԇ,0I*$CS4@Fg"b3AG>E#Ne>i&l$NN-?D?sLFs9mj1[ 8N6y/EM JG̰,\b# )>EnccO?/NGsSnD. !hE$qkc1F0K+0n4FM9O=@|5& 6ܣБ044\Hp}? Y`t^{|ﶋe0q|vFDb{ɕ8J>pOzrp : /ppDO '9nؑH̜3ć r}ic ֡W*HڈFV%sWҨHĚF11M|I52:1?% F"~𯄐r?|aC `E0nIVLIRCNv ^1d_$/"u *pl8#+2"|t.rL䑋C1RL`zɔ%f<٘&p + :0YU\ R6DV\.i}`7G8q2#,]G4%"m!D\ri-Ud/COHG?UҌL"`pIkGNPW>A|jPNQ^/t%G>@|0ŠL%-#n3#GFa=F ]X5]K,^^PԈ#ɒ˲kՊi_8YӴiZ0j 8 `E<І-'M-E&E).&3qRWK<ە!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, jH*\ȰÇ#Jx*ŋ3jȱǏ CI⩆\ɲ˗0cʜI͛8s9ϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TV٘ߘ3q(L=?؜ŒBc\6I

DC B J IM>KUzO!*H*iOZGO(k Aꏤ&Ui<A- "t A@BîЯi Ŋ$íKԾ@E]P3>L@ m35*Or@r@Fp@/O? ̶l:@#1B$6Ci)Ss/K8VN eB_O> ij8(KlAz]<{t(,.Oޫ..cnh$ 95=5zҲl,6Pc'=ʘt*=@u #в/F \P& tͶð R J+[<~~+,З.Ө6H%hRP') ?xtS tc B{n hEW L>l FM?N݊ RCP B@n:R ?Z; ' )/#X !f# ׹1q /L|#.i]cj'b+D0,Vm,Fc G6Z쩤ݘ+A«$*΍1޾CYRj &81dL[eDrw^nt[X#1%.<G9AVa i^D|@D§Mvқ8ǹA*C;8-c@yKԗ8 r 䏧aGЂ|R#8V6۩@B de9r!A0&#q;n;ߦX:cYP3\ 'ecԇ[W  C7M(J k)1`êCj{jr hƘRwO*8C ٻ@v+*)ØvW#{  Z+5*c X]@ okF1cʡهp _<<zQ>63B.{8G~̟8$=,u{ 蘇t cI@^&4ҝ4sZwQ%mL+oCh:-T?qM1-:'wYu,  cCA& -` ˨?(wב bΣ6UG+ghcA;,5/)#B8-P5!@( TB26 pO-=(f$MiKdZ֟!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, jH*\ȰÇ#Jx(ŋ3jȱǏ CI⡆R\ɲ˗0cʜI͛8s9ϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TVFVvwSX1PY.QDKA,Am9c҉T;瞷@2uZT&Eď?9(6sRZhK 馂RG JhBdԙ-#餘VkV~b+0cJ|j^jRv.d)A~3PJjz:@pC,}бM>ƚ[u@akG?Zd7@=H+O>D[ #P?,@Ö:@Dt>q.B/𻂲S 415"P;$U ?Yt=2l0+0mZtA6#TkB쨭jO+90,S_{ 063k}µNA(x"r#]=7H}z椛8ռ.B6p?\{i+pqE"8Ap~SF|R @ b-%0C*!(m[tʀp>χ@). `PNP b[)R7B[tCKiLCG]0k9G:&丗E)>^H5RJ?}eRH /8#!2~CPX/ s7H-We IӖ%+IMT-T%* EUjl\?2 KgY @N{]A`p:K1U) ^<@&Sz7+?Q : ̈Ǝ! W8Zvtb ZO a4Nch0эAP&6 b{-Ũ4ԁXӧ@2M(8 N'*? Sr@'.R\@  Vk W]++õ!5UPZJŃb غKt}ЋAlmmv"Ʌgj~Tcc4dԃ?(? Ed<\cL2(Aph#FSǖZ֣FCԑI$dI_Ri%SȞ|@i> :ҏ?ڠIH*E~ |T?We2AȂ ԩF:؄"iJA]L/x T1M>(ji6L&FJϙ B5ڀ #GZNb%=8 9 ~)HCN(r YAFZ台o2?rq"#FSأNh5%DŽa[;t dK[֊X35"$E% u +CLҦҒأ(oh2 zFȵr_B8#cԈ"l@4 / Nk0 .kw3ďrh{ȧ\X1?t0e$pB*Nap7ZKJ"sR $}H=V'f@G> &8U'|HϨq"7[n,"p8a82ra;I`QȬɖVoѐ?0!>A8(U"JpQ#[{;eiMX)S6ĵ2x p*?SH!(?X u*[(Nb 9.H nAjtHH:0]W/ȡʏ&wLw=t.xx_&B2"BNk? Ԝ0X<@S|E|ѣ=\=2bBւG8QUTO==ԎHxM2(AB7XE9R@E\e?X$?>YlfDO"eQIZ,1.I㏘PDNgYM~(0B:L: MRvOjRd5~((ةEK(LLR9LZd:kPEV?R>O89Q? )5.++>9#EVA뚲 ([;bm4?Tý36 9`r܏ C\$SG,hT,;B17k j * ȸpml2EKpDA\ LM 6+=5 6s\2%FKl -ݰ[&>Z_<io_OČ?r\ Ӑ7lc2JcˇӲ܏owkv>^fNH<蓣>Y(zWyE d?VS n~A_,//Zvog1:|`D#\:}]Za ~r4jU >K.aAI)^@a*B(h uezFQmD#G KD‹P) 7p"1v"i T)V(4 ~(*" TP}à~]x_ Gs֭N&&\Ȃ½6,PxLDda1^u#1!G0,Y|HBb]V0d% %&AG`cS#z h:cK0&ĭ $p@Zy hyAA%a ~T9X,6vx%cg9E1CP+&v H"izҋ9G~?:Z/]΃q~X98YUJ[">[t!1A`I62k X)&+ *UE`#c~&iĉG--XP-k'BF@ dZ(KW&K$#;R.YLN@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,tmH*\ȰÇ#:<ŋOȱǏ CIɓOa\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6`:|cO?`A09BK#/4V1P%S~L`ɋYPK PstF`ihzPM裐R XJRL Bzi+UE\j? љ=-J?*5VzRnB-ъ;/+>nOJ,M~-0𣭶Jꏥ"UΚ.F`E`وz/xKL ӻ 4?D@D Tp1;˾@ PL >LO0cD44{B \ܜO=`41 hNK6[$CEkKk5̬2ƨs_ @>669KuEQEGh=-\41;ݎOetvL'uEB+[4C- @+r-ݪP(Xi X0p uð?%]뜭:L].,+8@"YH4,Ȏ3j[Y:0TEtXdbQ?i&~@,iWEH@? F`ݼWJ`IpxF,jw">Lx' [x;Krh<-],"Z@XnPFtċ8J'VH, -"x ƊLl%X#q"GT)<ʘ9變 aKFpH9uc&sܙ<Ɋ\[F4TJ#\eNZْW"\#޸NJL ;q 4""F@a})%xB%_<-k#-r,S6!'K͊"H!?yVTa{V W230ȩqL;]P PK&916[e@ժ^l](a&GMdA;.SBTg{ A\\dU%Vz_I33L?i#7ɔetXg局s"}I*"h^qڂ}-~O3; (v#_’e\FsZ΁}ģlDѴBai '6يhW}H$ d`\iE uU)Uи! ]CÅ!0qd8'C UCv,3x`X&($ Ɨ dƵd5v Hҕ\@ %p12-8"3%rm!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R6 H [ȰaÄ#BtHċTc=,ȓKZD)RJ].Q?1eh΋6X 6MtiGX:G_(i=Te0N@y޽~ӪYגOqk&H,oA@c"NG̠͂VO: "2y$^r `ð"(3 Y.] w cCoP;3S>M[*pk_vC ,g.:q;w.$]/wy!,W;bubbletea-0.27.0/examples/textarea/000077500000000000000000000000001465647402200171725ustar00rootroot00000000000000bubbletea-0.27.0/examples/textarea/README.md000066400000000000000000000000661465647402200204530ustar00rootroot00000000000000# Text Area bubbletea-0.27.0/examples/textarea/main.go000066400000000000000000000025241465647402200204500ustar00rootroot00000000000000package main // A simple program demonstrating the textarea component from the Bubbles // component library. import ( "fmt" "log" "github.com/charmbracelet/bubbles/textarea" tea "github.com/charmbracelet/bubbletea" ) func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { log.Fatal(err) } } type errMsg error type model struct { textarea textarea.Model err error } func initialModel() model { ti := textarea.New() ti.Placeholder = "Once upon a time..." ti.Focus() return model{ textarea: ti, err: nil, } } func (m model) Init() tea.Cmd { return textarea.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmds []tea.Cmd var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEsc: if m.textarea.Focused() { m.textarea.Blur() } case tea.KeyCtrlC: return m, tea.Quit default: if !m.textarea.Focused() { cmd = m.textarea.Focus() cmds = append(cmds, cmd) } } // We handle errors just like any other message case errMsg: m.err = msg return m, nil } m.textarea, cmd = m.textarea.Update(msg) cmds = append(cmds, cmd) return m, tea.Batch(cmds...) } func (m model) View() string { return fmt.Sprintf( "Tell me a story.\n\n%s\n\n%s", m.textarea.View(), "(ctrl+c to quit)", ) + "\n\n" } bubbletea-0.27.0/examples/textarea/textarea.gif000066400000000000000000001124761465647402200215110ustar00rootroot00000000000000GIF89aX!/! " !#! 6!!!!!7"""####%($#@$$$%'+&&&'''')+((((*.)+.****,0+)V+*W+++,-1-----.-.2/1400011113513722231n44455556:66668<79<88897999:8:;>;9;;;;=@=:===>>>>?C?ADAAAACEBBBBCDCDGDDDDFIEEEFCFFFFHKHHHHIKIIIJJJJJLKHKKKKLOLHLILMNMMMMORNNNOOOOPPPPPPQQPQTQQQQSVRTWSOSSSTPTTTUVXVRVVVVX[XTXXXYYYZVZZZZ[^[]_\\\]^a^^^___````bdaaadddddedfhggggikijmjjjkkkklnlllmmmnnnoprpppqqqsssstvuvxvvvvwyxxxxy{zzzz{}||||}~~~~! NETSCAPE2.0!,X!/! " !#! 6!!!!!7"""####%($#@$$$%'+&&&'''')+((((*.)+.****,0+)V+*W+++,-1-----.-.2/1400011113513722231n44455556:66668<79<88897999:8:;>;9;;;;=@=:===>>>>?C?ADAAAACEBBBBCDCDGDDDDFIEEEFCFFFFHKHHHHIKIIIJJJJJLKHKKKKLOLHLILMNMMMMORNNNOOOOPPPPPPQQPQTQQQQSVRTWSOSSSTPTTTUVXVRVVVVX[XTXXXYYYZVZZZZ[^[]_\\\]^a^^^___````bdaaadddddedfhggggikijmjjjkkkklnlllmmmnnnoprpppqqqsssstvuvxvvvvwyxxxxy{zzzz{}||||}~~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~4ojtHkpul( RG, i A,@Gslr 2ߞs)Q/ !2p[lF0H`?'M\,BFӏ#!կKd?`SuXM۽j3vf [%O=s]|7AV-qnxp8o/m?.lOnyk_w砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&) !,W!,zP H࿃&,p‡6Q"C-ĨPA= a=DFg?S*IJ %.ʆ S&P}4Zp?NKs|V'lO)S╩V]:?GkoA\5m 82ĕ, ᯍݳX9(U+f+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$X +F&I3k^)0M8ϟCM_QNZ T?w?9⼚V;oZd?5lU"pu 2]+(]pg %)P* L|"/[U9{ ɶm>F.ep) ŘkD7y+ x3mKQص/ wk[R;a#NM쿷% !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aL?~.N%I!?o|("?g2LFIO?蓏aRw4ƫ;mZ;Rjo%&ުJ9 G(Q<̻c҄E&]Kt!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$X +F&I3k^)0M8ϟCM_QNZ T?w?9⼚V;oZd?5lU"pu 2]+$`HWoP6=gW :XA' nRiϳ-g ɏaor+(L\zg+/))[O}; 2kH鍙`/T iSR6l۵5}2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aB-W.Ǔ_' ŕ" P$_=3E*GBk])j> cm"YU{U[߬SUݴy  t=L9[%_ɀ!,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,bř>(]pg %)P* L|"/[U9{ ɶm>F.ep) ŘkD7y+ x3mKQص/ wk[R;a#NM쿷% !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,(řL߼=I ,R9_>$`HWoP6=gW :XA' nRiϳ-g ɏaor+(L\zg+/))[O}; 2kH鍙`/T iSR6l۵5}2 !,W!,PP@H*\ȰÇ#>@E3jȱǍCVHɓ(˗0U͛gɳO:1JeБE*xҧP'6Jjuק]%vYeϪv۔m%w]SXw_} >xaN/{C+yʖbμv3糞? -+SV]zש[ [_گmŽZ^ެ}[]⨍G|.>v:֯ͮ},_<*~橢Ou='/(??`1 HKR `&=!I!,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,Px05HQZA q9DHŋ3jȱǏ CIɓ(S\I]0cϟM`ּ/'˟@  ѣH*]ʴiRPm&'~=VթWJٳhӚm,ڶ-_Wv}=v޿ ؐ|W̸b R  ,2ž_tиBS^za?(g.x"|߽Kv1fZAٴȴ\B,9ˇ| f, [ϯu7q O\"wϿ!=6C?AqUyS! X rTDr ΁J?"EwWNQQO=X岓MTM5$?gHA(W@zQVHM|Ў? $>O5s ?x \?;=tMf=TzL14?$i饘A!FB0dceE n衢fC3P <16Q/CPU"'BD@cMatK!a Vk@mJ6y&"3jnUO)?? 9"6Av {q\#BE؄@CWMT j"ڮw&h9`MH"?MEF:%'a,D-57ˌk,O4Us$\@?0wI7nÜ9s`ӲT?JL.NMhqAc42 ̮@Hp"?x4A3KE"شÐTƒn;a`W# W\YC7aS P5ra"ֲWD*A|kzB(@L:4!3޿ŋ&'~ȟ? ؤEx|֑r 5MяP#Q9Q E7'*Qx@PaP$ 7 IȕB98xRr%gc#I $|H&[-&qzaRf&uk 0#+e0H#x,&eBH24BH0("@.Wu^h,0 "BHR8^L:c쌧KL,@JPՀ,BІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J}x݆^׾ ` Mb:d'KZͬf7Xn-lT@KҚMjWֺ}bE ͭnwJ6+myMr \&ˍtKZ-smrz jCMz޾׷m|ڂ)\ͯ~eF~9! NI_bЄcoGHp`E<]G08Lv5n :k]#Wrb@l-K`ō=LF bc(jdXUβ;d>6@?Xb )F 4U> Tp9UWG`A[N4u-7T.Im&P q9d*0p_ .5/P ٲB3npЉmj A w nw]8 |q{;=l|rB# Bs\#+ iHkP x?ꮏ S`ݹu76 Q?b@쪁>U/cL=wuџNFSg,?ꍨH[6^wZw}}RX컇q5+q}cW7A(@gB^r+r`5==eSՏPyֻߕegnG'rg|g`~|gnxxU~׀G|X$`2'}~⧀#|wwW((2Z7YXpWi[x}}Fpl@x|WxWǀh`0t}5y~%n~'XFw3UuK66<#p ? KXw~WHWMP8J(U`wSyZX\8X^W`Xben臂XZlYnXoSmxU|x(g8Y g!ƀ ' ggg}eHՂFxjX(XWN-sg|֍(YxXe:# weA؈(WFtq7eWE狁Ww1pwDwU~r0hۧvhg*HwǗxo`w%$5iyRid ֏vwœlǂd UXņro2jWw|qe5EUr ڨ9WBYl&PGWzh`1Wu wOǒ!5fx%'ifϦ}DyGyujTДf'χWaPq} 鈇n&UxWW@ȑ Ir~yWʹ ~eX'Zp KW@Śט*FGi`]ЏŔ'g G'YpWE)xC|iKX9vF5vj@wE:7 րX& .pmgX.pY-ʂ/zZ$5ʁ;jY'塧_ֵBJzbu\FZ]HR:؅bε]koTڥSJ^:dz]`ZZbZjulrZYuuKcx|⧀:I"zaᨐ:{!zfaNI᩠:@!z)a$0:WpWЫ# 0w0!@ʨʺ0  WzتW?A `MJڮ :zʪگK;Z˩ KJ [z{ڱ {:${&{t*+W,۲p0V2;lU6V8h^<8`Ɓ3d]|ƪjܺlưp!$qq|m1  6QP 1!<HrٞAs1 p4#0P@0Qۢm{s< } " '"+97##GS1M3+r"!#mp!fb7@3{#H6a֍""CK;L@`s}((#>'2@P(XV7wc"=}8CI" +"&?!Q=ȒI`=".G+X!KJ0!0sC* R90%!A0q0CR 2^sn醮&06أ~(@Q*^X0A3ECPur^QI,>tC멓7[}~sSn1 n^Xn5Bݎne S,.n31 +`c k4^ړT,*>v1c=P >b'"6!!>sp~Q?bfA -UXo\!$$dBQ P( Nk2*=A}zFROGvGGHDFJEd1idlFp$GRE@dD7g`;?DNOp1'0<}ؠ$K7AKɳ1UI<!K4P M7 + N7&o?"@ @ DPB >QD-^ĘQ#0QA 3|X1H*OD("Kʟ P9%BgTRM>5c[^ U'ϬeUXe͞EV-֭kݾW\uݎw^}u!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, GH*\ȰÆ&F2F xc.`#M.X\2P EΔ$8XQ0r2( 9QZtaMrtzsq"ς5ʲ ǯ*ߐ c@x#.-X&$;f{P k*^̸!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, Hp&,ȰÇ#JHŋ3jѠ;Iɓ(SzP˗0cʜ G8sܙfK@ ZBH*iҧPlR՝#jq+CX*;wjR=KcVeOTZ'&> Ee &l傋/Otm`2,YZcfWn-/~2_پ.@Г ypv .Ơb5QނAx׃]EPM|?:, \h_aW#u8D7Hmeazy_&O*,.a:ΘZTzބ1[yil)a>ė Zs":bT9{tQaC jImOnIQV6hwveA~txi&(霒N:"k2ꖝr*u򘫦ٍzdZc(((gy6+) 9ڮZ%ï&\*+gfi'![robep龸҇|{A j1" ,K{zp~%GKP~X/>oX$ݡL7SIk4JK/TRSWFWo+UcwMW!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,ř#XCI `9 @/#T`oD(W B@ biϳ-g&eor'-yy S#1w!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀse?kyL$mΔR'N>F㇏Ɉ#b @?@#k&9"A*! CsN뢍ZńVlL;~}r@.ǠoIeuKu2Z^*v$J%TxD$5)fH=WѠO!,W!, GH&,p‡6Q"C-ĨPA= rll$`2$YY3AlSEd)t˖#[ P S fA\jEaz%lFn;sXiOoGjI0" UGƏkT6@UލOF۩uR4GA}/^SLpׁ-MѬ@hAT,0y- *GOkaoLC 1iZ2 !,W!,W!,W!, hGH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!," GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLrZ73.O&FF8%; i Z$@5fZI` G sЂLM ~TM`PNr^]ng#%E1 u4lGsĦ(Q[Au8dq1iטܸZϝ !,W!,0 GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,ř#XCI `9 @/#T`oD(W B@ biϳ-g&eor'-yy S#1w!,W!,W!,W!,> GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLr'@0! =$ = _&QN=pwP>T6@UލOF۩uR4GA}/^SLpׁ-MѬ@hAT,0y- *GOkaoLC 1iZ2 !,W!,L hGH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,Z GH&,p‡6Q"C-ĨPA= R$Ƀ4Xʵ$2L5e8鯠#$Fs'{s5&G0KNGXdiIߑ$Y- ֺ4ZTriҝv7/^VTTY8IRr[]LQ i*@[eS[2ѥȫMc׷i !,W!,W!,W!,h GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,xř#x@>]2΄ӯg>еPIR`<3S#lCpwW9^A8"s\K-rmRSقҭxq=|T4#1y&./8]O]R873em5ަۢˀ!,W!,v GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLrZ73.O&FF8%; i Z$@5fZI` G sЂLM ~TM`PNr^]ng#%E1 u4lGsĦ(Q[Au8dq1iטܸZϝ !,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.adƕGٓ1-8\?o4C%EbOZNAB 6ֲr AYʉH*RlKmܖD+bԽwcD/TiwLL=Vrg !,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"G$HBF+j&I3k^)0M#HC]_QNZ T&x?9⼚V;oZ爙d?5lUpud];<E$UkC9^6rI/g6QsJ&O!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,xř#x@>]2΄ӯg>еPIR`<3S#lCpwW9^A8"s\K-rmRSقҭxq=|T4#1y&./8]O]R873em5ަۢˀ!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLrZ73.O&FF8%; i Z$@5fZI` G sЂLM ~TM`PNr^]ng#%E1 u4lGsĦ(Q[Au8dq1iטܸZϝ !,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.adƕGٓ1-8\?o4C%EbOZNAB 6ֲr AYʉH*RlKmܖD+bԽwcD/TiwLL=Vrg !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, %GH*\ȰÇ#JHŋ3jȱcÀ!,W!,P0@*\ȰÇ#JHŋ3jȱǏ C9 (S\ɲ˗0cʜIɚ8sɳϟ@a JѣH*]p(ӧPJJӪXjʵkƫ^ÊK,Qf)-HڷpE[.St&7\ ̐*͹,ԵE{otO;pG g BiTb3hHUJ5:25q+ΜelƶmEv˽'sB^= d@!7P Q/<& 3P=<"2T%BX%E ><8PQ4Kq%b Df?9dGɎ'u'9:f I$FnhV@@$ʗ z'@;)SϮYmh %yݎX@u@9(p#P- - ':P<+PN4ڎvP&m @9Qk-x ,H@0jR+k{mv+8bQDz78!K䬼 x #ۖR+Ūg" %@-*Udx@& 48 D? \LAV .=EIA uT[ٌ:3Bu p7y-P\4xcqJ * <1pGCZQ5 5 gGAE{ 30Qh:/_iǮfGOn0P+Mq0 @==˻8 a7an~;˘R":f X0]͜uV$+9*lU piR 1d-<~Dj PoVT(/f.qa"q)py `4DwDXD8tEP$1 'diH+4'["HFr l4 g ZVMv(͒L,Zeu ^>]F(hjA~86ɌfA| n5H=\"`6fA)y HrXġTO>OSϼM0_97dg,:AvB+5#bMP &~cd% 's2ҙH$gx7JFMѢOEf1pC@&^HWT8=vT`kx!n(9p*T‹:2(BƊbjTւfYIiFV  b\⤕ ~+G O Jp mDlUHcciI>My#+ H. l:*F\P!@nB@jRv(!CZŶ  ٖ L #~D#愼)J@vr dY=|7uՉԠ 8F2|k]A+ףÅ+ӄ8Q@(L\ĵT;,\׈6`܋<(![Af*8Aԃ1ٍaIWFA4iDrA|.HcI!'yf VepyoMHazԃQfyu3⧰X"fe k @(p c N3Ax 'c0 17U2dF 錬ധA Q'5FbԊ<sBk_WQߙl>0-j vC;<(RBE`I-?{q@d!-#y7YbM簫qiGp<rw,iRu,'-gӼ# xJ9ЇN/DFO;>;$NԧN[Vַuc`NhOpnu]Ov?7{_|_ !,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,ř#XCI `9 @/#T`oD(W B@ biϳ-g&eor'-yy S#1w!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀa[Ɠ9KI͏8 y$á?JQIG.%(ǣMUցU^j#֨#N;["[fGGw=Z]ߙzՊT'6Ub'!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀse?kyL$mΔR'N>F㇏Ɉ#b @?@#k&9"A*! CsN뢍ZńVlL;~}r@.ǠoIeuKu2Z^*v$J%TxD$5)fH=WѠO!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= rll$`2$YY3AlSEd)t˖#[ P S fA\jEaz%lFn;sXiOoGjI0" UGƏk!,W!,W!,W!," GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a$HBJ3Gg\$ GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9`q.:AGhԢ1Qr#AaMYQx+gZ Υ]!,W!,L hGH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!,Z GH&,p‡6Q"C-ĨPA= R$Ƀ Hҍ'Mp`,@?ob$A6=]90KɗOMX9M6=#AdDԦڍL}h۴kޥ0y1u`p%:SH+[lEΔO!,W!,h GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,ř#XCI `9 @/#T`oD(W B@ biϳ-g&eor'-yy S#1w!,W!,W!,W!,v GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,h 3G~Z8#||JR 3h#MGuEnXAӉŘ_|ޔ֧Ƙ9|&9;')Y Q 5$_P(|9S(Oܤ0KF8.pf5c̔I6]ɀ!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,($ř#r@@>a&μ %)0O8!|4\[U9{ H Ghɶm>F7hp)0VbX"xGPF z!8B ODKRȵEgg)X7عǿ&]kZEڳO!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a$HBJ3Gg\$!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a$HBJ3Gg\$(^[]5*$ dpmܒ @ l۶]K{, D>^:"PxDWpUR@ḲW?mSfCOI'<P7rv TJRLh߆Dp142Q5"Pux1P=̑Mj v 4A Px P;P-  5 3G)0 !dCbr~! aM+2eR@1I9xP3(Pm- CA3rOAxb PԄm!q ܘ,V &ҨdjB%HZ* $2'B kE,5&}EB*r,jfPh6LTLAfЃAk* z! Y @P4E51{) p41 mm |,B[qPP:8qA< kT !@0 3 {#w6#pA B)2܈ EtB`M6BD{{18+TcG1#0gHA8D>I0@g^ zNEJ+`VJEC0Bd(/q*5P3*%N'd=iQ׮,-~A`> ٰ "qa@ W{V }'? K j3󀊰Sh80$JV@{g=jQ?بmy L 3.MĀbpā `!b4@2P1drc"i\#@!q$Ѩƅ1.|P`lH!"F  u @X P22 Bf1!Է@ @[\ȬI]9x\V'-E[.r +BV/t %XiP< PO ]HW@lrKfȇC<]ICA`qwZ"!@6bo/!6q;HrdߨxEbP{o "/˟7d$G@[%C0Ps|^h!سJ./j>n/,!H  _Wt+be,Ԭxz!7dś΅7|d /&FƳRd(c֓*ߡe^#%0ӻ" -}:@JLH~B}m0| wMZ\X|O}~P}X؅fxhh_}$ wP WizW w|@  ߗp$ȉx}}22@xx~̧BȀXƸx}h`|X֨h}|0w8Y &0}xHj7`˗숈؏8}0|I ِG E8R0؀ّ)}˰||},ْҧ n|퐒*Y.R:09}I p׎;YF ~=~DyLٔ(N9TPRYZYI~Y`ɔ]~_fc~eyl!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"G,(ꝻWl$  `NY9 MH QS0ۢr( @}p(s9F٤7j~X R;w~&T&Ƴ0C ۳ϜBK_SGlLR3ЈZ<NThA^NjG)wKoS!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.adƕGٓ1-8\?o4C%EbOZNAB 6ֲr AYʉH*RlKmܖD+bԽwcD/TiwLL=Vrg !,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ4Xʵ$2L5e8鯠#$Fs'{s5&G0KNGXdiIߑ$Y- ֺ4ZTriҝv7/^VTTY8IRr[]LQ i*@[eS[2ѥȫMc׷i !,W!,W!,W!, hGH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"G˗ܑPIR ,8s4A@!yÕ!w@L7:iͤKէY~V]QUYi{r,˩' tS)OՈ8ec->8ɀ!,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"G,8+ b&ɂ3kn90M8iTǛ2D: YC1qԪWyzĚInkQlX͖E;mTYI!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aB9̇?Zx J#IQZT4rK*RZFЏĈ\y@- v-ǤƝ[7f#AW_x/ᾌ.l#^Ɋ+S;(\1eL3MxZ5Rԯ] !,W!,W!,W!, hGH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,W!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ#rRkyL$mδR#-6֌E4|pn%cӨFp՜1"h @ mHB0th9-x @{wDϰt⥨w j$"ܓsMϛM~ڣˀ!,W!, GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,xř#x@>]2΄ӯg>еPIR`<3S#lCpwW9^A8"s\K-rmRSقҭxq=|T4#1y&./8]O]R873em5ަۢˀ!,W!,W!,W!," GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aB9̇?Zx J#IQZT4rK*RZFЏĈ\y@- v-ǤƝ[7f#AW_x/ᾌ.l#^Ɋ+S;(\1eL3MxZ5Rԯ] !,W!,0 GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.a,($ř#r@@>a&μ %)0O8!|4\[U9{ H Ghɶm>F7hp)0VbX"xGPF z!8B ODKRȵEgg)X7عǿ&]kZEڳO!,W!,W!,W!,> GH&,p‡6Q"C-ĨPA= R$Ƀ#deI#ɘ3kJ|M=uiLBIC3o&/#'I~ezAX[ǂ)FF]2΄ӯg>еPIR`<3S#lCpwW9^A8"s\K-rmRSقҭxq=|T4#1y&./8]O]R873em5ަۢˀ!,W!,W!,W!,Z GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.aL?}?ۦ'T\O?-zcRm(ԁRb|tjL]R|`/T}z;1G͈łz)+(|t;1`aPNlŁ-H8deq-yYcf'!,W!,h GH&,p‡6Q"C-ĨPA= R$Ƀ"GL9?.adƕGٓ1-8\?o4C%EbOZNAB 6ֲr AYʉH*RlKmܖD+bԽwcD/TiwLL=Vrg !,W!,W!,W!,v GH&,p‡6Q"C-ĨPA= R$Ƀ4Xʵ$2L5e8鯠#$Fs'{s5&G0KNGXdiIߑ$Y- ֺ4ZTriҝv7/^VTTY8IRr[]LQ i*@[eS[2ѥȫMc׷i !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, %GH*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R@H*\ȰÇ#JHŋ ȱcnj CIɓ(z\1˗0cʜ)%K8s3͕= J*]ʴ)HJJ*ԖUjF`Ê5سhB,۷lʝ 6.ݻx˷oϽ~ x" #^XƐ##|,dʖ3/Ƭ`ΞC-\ҦSEuX֮cg-SڶsŭwP޾.OƓ+%УKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼 ?kl.l"gBK?Rm:>K&],q@E[ft[Ļ Ld'/HFC$h&?q /LG t`a˅(Pq!,W;bubbletea-0.27.0/examples/textinput/000077500000000000000000000000001465647402200174215ustar00rootroot00000000000000bubbletea-0.27.0/examples/textinput/README.md000066400000000000000000000000701465647402200206750ustar00rootroot00000000000000# Text Input bubbletea-0.27.0/examples/textinput/main.go000066400000000000000000000022611465647402200206750ustar00rootroot00000000000000package main // A simple program demonstrating the text input component from the Bubbles // component library. import ( "fmt" "log" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" ) func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { log.Fatal(err) } } type ( errMsg error ) type model struct { textInput textinput.Model err error } func initialModel() model { ti := textinput.New() ti.Placeholder = "Pikachu" ti.Focus() ti.CharLimit = 156 ti.Width = 20 return model{ textInput: ti, err: nil, } } func (m model) Init() tea.Cmd { return textinput.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter, tea.KeyCtrlC, tea.KeyEsc: return m, tea.Quit } // We handle errors just like any other message case errMsg: m.err = msg return m, nil } m.textInput, cmd = m.textInput.Update(msg) return m, cmd } func (m model) View() string { return fmt.Sprintf( "What’s your favorite Pokémon?\n\n%s\n\n%s", m.textInput.View(), "(esc to quit)", ) + "\n" } bubbletea-0.27.0/examples/textinput/textinput.gif000066400000000000000000000523611465647402200221630ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''(((***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566688897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLILLLMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnooopppqqqssstttvvvxxxyyyzzz{{{|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''(((***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566688897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLILLLMMMNNNOOOPPPQQQRRRSOSSSTPTTTUQUUUVVVWSWWWXTXXXYYYZVZZZ\\\^^^___```aaacccdddeeeggghhhjjjkkklllmmmnnnooopppqqqssstttvvvxxxyyyzzz{{{|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:6檫Z1,ȶh,6ⲻ:+m: V+,r-݆ڈkn䞫n.y~4ojcpHkpu8#TK3QHGs;$Q6<&\8. -|<@c01F)D`A7MO 6wĴ\4ٔ,w6m`FM 1hݰQ+D#F-xs wxxx6yvy朷y砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;P!,W!,zP H&,p‡6Q"C-ĨPA= a 3u?wTE`@O .Sa2MH!L^R@!,W!,W!,W!,Pp %H*\ȰÇ#JHŋ3jȱcÀ!,W!,PwH*\ȰÇ#JH"ȱGE (\ɲ˃Ic'˕eu'Aԕ %#pβRfdf -ctU'*ZSٲːŪCM6iR6!CƦ5;UF l5*Ty%cC'=ˆHHd#O)5cmp6lmv1ՒIsty29lzh3Kgw.Hq:C:_Lg \ @&hL%dBLeBAY(dR X_DZB~CJ8р E:%A#:%fІ - H "B)DpP0 3P:QI6gE4:-c_A5@ \5H@P TS2tҹɈ DCty%aAPfY%Stpg{I.ڨN Lt a^mʤӈrD%Dat EJr4.+44~ ifKAǖ@F#,ČA  K#,:U@ E $5p&6äfA`%gc3Ad#B)T 3PfCDd@d AM|9 ŠN!M4X@D:ES Nv(2j6㜍έ,P2t5AtgDZۏR g_tNi6%Lkor] l\i6O2NHkFO{W'7j-Ild 82q_3 ry5+ v2.vm`"X <22A 7|Fo"2Al#, D,Td A[gDz X6}q+MphD]WcM64֪3b vrF3Ϸ3c!W'uN-Ak"wl> ) g4ߗ#V |?e,@,/זD$ Q ?m70Gp:zebeGGCt(.0mU >AJdPjayQ0B MprJ4!,0>^!4hPQ >SV V`adXfxh 9pr8t8%Wz|؇u<@~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Ws%X9Y1ba 9m ѐ)@@@iqaG 0^0/ĨR0 X`5m1+ba`]a,9Ye"%;ٓ?mN P t{CJɓH@锦 u% 0 A qyM)%}Ng90ؓ\pOEVZRu?!,`\@=`! \0i%B vѲ V!YqQ] 0?aЙaXXI?9i]!Y)ĚhSocq2J1K P=X# aPS?!l> *י Ȣ rǐyvj% K9!9p7'a@41' a`)x  ~X4$7̦ 0a@yia,`Gy;*AA:iaqKjJuiLX (؇aVʥ,0 X}0 >fJhc? ?MJhwjZyw{b YgʡE `au:N ta M7ꇮy8G5ڡIٞJs!i-V񩩦(:|~ڪ):2 *'m֔}:jT!i麇ؠXjQP!9 ٞ@TKPDZ]pSaP%AY) ۰u̚tJjjz^FB`S`RpFBp!2+yڝ V<@R`Haˉc8tv{瘷z[|۷;[{۸;[{۹;[{ۺ;[{ۻkˆki~ٸ)p%{@5c^0aUp}xcWAsbz"uX!Hv?$k[{:j1:11` !61e#)s8S#t4Z~7s[5;#jT0W0YwԸt ?1A$s ; SQ AAu"s$(pʐbBy@ˁ d{ocQ qZҸDq QQt\LMHiՄTLOdd QJDd6qc '̸3 ԕD4FU>,|fOWP*͵Gɂjᒎ+h̅G:^^ZbZUL'l͸,LcT\% ˸q H da:1a)^EVFX&7kb ]eM{ ͊ fi6sVgg~D0 4vĶis ;5C6כEl&tGp%JtzӨY|%jǞ( 9܁5U58v!}Z؟Vb2y!2trAD<{%#Him" ҃%Փ NNUVe=m%H!,W!,z H`&,p‡6Q"C-ĨPA= R$Ƀ"GL)d6.a,"řfMl45PIR 3|SxLBPeW9  Z2(bc\K-aam2OقbҭH'$Q@4() qGkzb[3 ,'l(mJC7Y1fJ۳eצe@!,W!,W!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"GL)d6.ad"ƕ)Ek̤8\ ^4A%IEAOKNABɈ-r IH "RlKmܖD+bԽwcB/CiwLL=Vrg !,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"GL)d6.aLӵa}\J2 3$J3 @Q`0%pe |lR,Sv(ot ]2F_Ur9@\],&o<꼇&1q&,ƤYˀ!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"G$HB+ &I3k^)0MQ C[QNNZ T&f?9⼚V;oZd?5lUvpu,]+3EDTkC 84d,c֜I-!,W!,W!,W!, H`&,p‡6Q"C-ĨPA= R$Ƀ"GL)d6.a,řxԪ3I 9 5 RmPl W 6(  J iϳ-gy,Uor%(JO\J$()) Xj˰]; ]HQy`)( iSR6l۵5}2 !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!, % H*\ȰÇ#JHŋ3jȱcÀ!,W!,  H&,p‡6Q"C-ĨPA= R$Ƀ"GL.a,H řي)qpH$)BHgbX6fsH4[+N";xLeU՜+ȁPPX>;`ۘ.)Yr|60ݿI;H *V=s ޝ9 Uh]z6eL8=6[l'!,W!,W!,W!,W!,W!,  H&,p‡6Q"C-ĨPA= R$Ƀ"G$MZ+0&IhSEdԔ"EJR)GٞYxуV6R굁Jf˹&lԀHA+[4daDa 3P3a<^j+ƃa+8X@ϲ?Q k*O ВЃ g;*=,F6R8 dfTXmk_3\BG*%ʳlUD͚Cl8HX'uf)2 !,W!,W!,W!,W!,W!,( H`&C#THË$JXC9RdA I64iEY tRD k 3&gaDMZ0  ҃Lj`lB"+I{֑#(9!5HAA޽6Qigg ܔ-K `= _CȧVnm,J F E+m %AD88`SMf%x bubbletea-0.27.0/examples/textinputs/main.go000066400000000000000000000076701465647402200210710ustar00rootroot00000000000000package main // A simple example demonstrating the use of multiple text input components // from the Bubbles component library. import ( "fmt" "os" "strings" "github.com/charmbracelet/bubbles/cursor" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( focusedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("205")) blurredStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240")) cursorStyle = focusedStyle noStyle = lipgloss.NewStyle() helpStyle = blurredStyle cursorModeHelpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("244")) focusedButton = focusedStyle.Render("[ Submit ]") blurredButton = fmt.Sprintf("[ %s ]", blurredStyle.Render("Submit")) ) type model struct { focusIndex int inputs []textinput.Model cursorMode cursor.Mode } func initialModel() model { m := model{ inputs: make([]textinput.Model, 3), } var t textinput.Model for i := range m.inputs { t = textinput.New() t.Cursor.Style = cursorStyle t.CharLimit = 32 switch i { case 0: t.Placeholder = "Nickname" t.Focus() t.PromptStyle = focusedStyle t.TextStyle = focusedStyle case 1: t.Placeholder = "Email" t.CharLimit = 64 case 2: t.Placeholder = "Password" t.EchoMode = textinput.EchoPassword t.EchoCharacter = '•' } m.inputs[i] = t } return m } func (m model) Init() tea.Cmd { return textinput.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "esc": return m, tea.Quit // Change cursor mode case "ctrl+r": m.cursorMode++ if m.cursorMode > cursor.CursorHide { m.cursorMode = cursor.CursorBlink } cmds := make([]tea.Cmd, len(m.inputs)) for i := range m.inputs { cmds[i] = m.inputs[i].Cursor.SetMode(m.cursorMode) } return m, tea.Batch(cmds...) // Set focus to next input case "tab", "shift+tab", "enter", "up", "down": s := msg.String() // Did the user press enter while the submit button was focused? // If so, exit. if s == "enter" && m.focusIndex == len(m.inputs) { return m, tea.Quit } // Cycle indexes if s == "up" || s == "shift+tab" { m.focusIndex-- } else { m.focusIndex++ } if m.focusIndex > len(m.inputs) { m.focusIndex = 0 } else if m.focusIndex < 0 { m.focusIndex = len(m.inputs) } cmds := make([]tea.Cmd, len(m.inputs)) for i := 0; i <= len(m.inputs)-1; i++ { if i == m.focusIndex { // Set focused state cmds[i] = m.inputs[i].Focus() m.inputs[i].PromptStyle = focusedStyle m.inputs[i].TextStyle = focusedStyle continue } // Remove focused state m.inputs[i].Blur() m.inputs[i].PromptStyle = noStyle m.inputs[i].TextStyle = noStyle } return m, tea.Batch(cmds...) } } // Handle character input and blinking cmd := m.updateInputs(msg) return m, cmd } func (m *model) updateInputs(msg tea.Msg) tea.Cmd { cmds := make([]tea.Cmd, len(m.inputs)) // Only text inputs with Focus() set will respond, so it's safe to simply // update all of them here without any further logic. for i := range m.inputs { m.inputs[i], cmds[i] = m.inputs[i].Update(msg) } return tea.Batch(cmds...) } func (m model) View() string { var b strings.Builder for i := range m.inputs { b.WriteString(m.inputs[i].View()) if i < len(m.inputs)-1 { b.WriteRune('\n') } } button := &blurredButton if m.focusIndex == len(m.inputs) { button = &focusedButton } fmt.Fprintf(&b, "\n\n%s\n\n", *button) b.WriteString(helpStyle.Render("cursor mode is ")) b.WriteString(cursorModeHelpStyle.Render(m.cursorMode.String())) b.WriteString(helpStyle.Render(" (ctrl+r to change style)")) return b.String() } func main() { if _, err := tea.NewProgram(initialModel()).Run(); err != nil { fmt.Printf("could not start program: %s\n", err) os.Exit(1) } } bubbletea-0.27.0/examples/textinputs/textinputs.gif000066400000000000000000000744321465647402200225340ustar00rootroot00000000000000GIF89aX !/  ! 6!!!!!7""""###$#@$$$%%%&&&'!'''((()))*$***+)U+++,%,+Y,,,---.../'///0001112)2223)31n3334445 *55566677788897999:::;!.;9;;;<:<<<="0=:===>>>?#1???@@@AAAB#3BBBCCCDDDEEEF%6FCFFFGDGGGHHHI&7IIIJJJKHKKKLHLILLLM':MMMNNNOOOPPPQ(=QQQRRRSOSSSTPTTTU)?UUUVVVW*AWSWWWXTXXXYYYZV[[[\+D\\\]]]^^^_,F```bbbc.Id.Idddeeegggh/Liiijjjkkklllm1Ommmn1Pnnnpppq2Qqqqrrrt3Stttuuuvvvw4Vxxxz5Xzzz{{{|||}5Y}}}~~~7[8_:a;dk?k?n@oAqBtDvEzG~HHIKKLNOOPQRSSUUVWXXZ[\]_! NETSCAPE2.0!,X !/  ! 6!!!!!7""""###$#@$$$%%%&&&'!'''((()))*$***+)U+++,%,+Y,,,---.../'///0001112)2223)31n3334445 *55566677788897999:::;!.;9;;;<:<<<="0=:===>>>?#1???@@@AAAB#3BBBCCCDDDEEEF%6FCFFFGDGGGHHHI&7IIIJJJKHKKKLHLILLLM':MMMNNNOOOPPPQ(=QQQRRRSOSSSTPTTTU)?UUUVVVW*AWSWWWXTXXXYYYZV[[[\+D\\\]]]^^^_,F```bbbc.Id.Idddeeegggh/Liiijjjkkklllm1Ommmn1Pnnnpppq2Qqqqrrrt3Stttuuuvvvw4Vxxxz5Xzzz{{{|||}5Y}}}~~~7[8_:a;dk?k?n@oAqBtDvEzG~HHIKKLNOOPQRSSUUVWXXZ[\]_H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:?檫Z1,ȶh,6ⲻ:+m: V+,r-݆kn䞫n.y~4ojsPHkpul0(TKWgqHGsD$Q?<&\A. \A+kkM\q A44mpp3<Xoc<`c5YMQ䫑`ϣ>-7lvT<ws] N)9INYw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;9N!,W!,zP H࿃&,p‡6Q"C-ĨPA= alO)c╩V]:PݼGkA\5m 825ĕ,h7ᯌ橳Xy(}e+f+ ZdiC !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H +F &I3k^)0M>k'o޼CO9J^QNZ Tq?9⼚V;oZd?5lUpu 2]+@9СD^Uk 84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,"ř<s7o;^䠮' %)+ k'o޼CO9J^QNZ Tq?9⼚V;oZd?5lUpu 2]+@9СD^Uk 84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= rgՄl$ y$YV3Al Ed)T˖[ P S ͳfA\jEaz%lFn;sX酉N8FjIpk=-XhcWNAByy̲r:VHyRlKmܖD+bԽwcXC/AQiwLL=Vrg !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.adƕ+ݼyդ8\㧷yD%IEF"@ gNABي*Y9n׃*ZIO!jFe6֨8F]aWlTP?q,<6psС9)achLNP?%xMDKUDIXəI!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLk'o޼CO9J^QNZ Tq?9⼚V;oZd?5lUpu 2]+@9СD^Uk 84俔,c֜I-!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a$H@346';Y|Ѯ8u= %)J5eTUjxuׯ-K`ײhM˶ڶpKWܺxuW޾U L8ˆMƐ.Lyʘ.9Ε?,ztҦN]x5WɞMѵsϾ Znޝ}Yxm♍F^Yn攝ˆ]:]}{H_x/uÏ+~_v?UnE`Y U .T6aHMHQ^T!,W!,W!,W!,W!,W!,PprH &ǰC #JHŋ3jȱǏ CIɓ(S\ɒe3>ٰ͛8sɳϟ@ L3*]ʴӧPJ ˣH!Rʵׯ`Êh ֬ Ǫ]˶۷p/5ָx˷/ʹ1M뷰È,,Z<˘3d,qV@AS^:,g`H> uD2 N뺮Z{h@> ] wسk'+\,aI_Ϟ~dX?2h@" PWUB@~5)P*c? k)ACD!de4pPkAeEIDBeRhL(t@TVi\ݙÐ>|\u!,mKE9cD!lP @k4qh|*Q(ڊihZ)@hbLGWf)qC AE$K:`?F g`h!$bhlЪg&@ %d$6Db$'7]đBaA"F¦]AP¡?`ؗ,' ЫBEᄮ  ǽ)G@B@qBB+ 04˺=jɦh2Vnq0 qyPIGpA B$EXg}L.*&C +BJQ E9q(BU(q:j4lM? @ێz֌7;`W$`8&DBm_7WYu'tw؊IZtN8NclN{/[~8> #yBQqDy@n76>8Ӹ^÷bY2O^<6C4wPڞ.Hʀ0(nw FPiV;/wAѷ tA! k YB'=) q8Ú&+=(3#|u^ fєA`( qhBHE'0AG _hFEPapS>Љb $& IC 4%-TNk"x,2fpx QJ)8 KȐ^uL ~ihwnq'= *$ &ICg# @dX`joH2-AaZ !f،nz;ڴ7Ir&11vQ;IϽS"> ?x) @JЂMBІ:D'JъZͨF=l HhF#'^HWHt0}l3D$M%Kw%iQ73uEI v٠pmM/f@$xʃ3/z00J| drGo'Ў{-8 m~KŰle#XӝPM $VMc c#$O4C@GE8=2X^ W Lp8葏( 2~(UF),L-O5e D+Xa-nBCș4F;ѐ'MJ[Ҙδ7N{ӠGMRԨNWV<讫mH^ Ԍ0n\2 :C*ƀL8&vRQWDSn'Gu'fYoA783qdK6PVjx5x>dB`GZP3"'"m(#4R(EeƆre_G$|fFx(mt[g0qF!"]qN@RXcy'Ҋ(Q6QAJegf@P("((J! 2}wHwc(V q94ؘRhG`}de @Yyّ "9$Y&y(*,ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyWxkpyQ kلh EVzy#q  (1R:lwl Y !M%a fQS~j 0푗j?BEdWg%ai9)9-qBsَ<1'aꁚ"!Axh1Pd iɜ!vC=854p$d<Q"6WHbWq$W"7zt:S:}'XYmwYhY~ڕd 1je⦠=t'DqbKZdAv' 1(_m*ʞqPOW;1Z\lP1_ w$ .q14F@HښVHe1&8y='q$Jg _ D( CE`h e٦np(+jG{jgfD6zT:VZ.b(JƉd c*7Z:JOz'EBvg٧[Q53z !0BCS#X0Uȫk+"Guv1R̢}s~>#d`*0PYweiFhf9Xfbr!Qy)L)`FqbHk`>K8FhoIQ {!P|ؚIM<y+ ` B+@%A;P?L۴NPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{xz|۷~;[{+pWM!!( !0k o_v  l"@ҹ@aR(*iSW(Q:38!kKJ` (IIt߻ 3Q!!umsoYs+˼B $W{{1"QT.: TJq |T#v8; K6kx!"c>@ !A:AnmAnqn9@\n|  Ad!ܿL&Q=89< V<,4,e6Ő'zreän> &A$J&b(*0k6qql3p&7(qYW>t1 qQ '{O%e0d#2(Q P,Y aP  Zz 07y)Rp&I0'"d-vZR]8:#7xa2UAvϭ # e}gZ8Ӽ/<M++ȪQwʍݸYMvם)L-w'3,bȢdw,.N (J N*9RPcm|qu.]'yDdzê'N wwzaSh _y_-h r|~20X/.x健"zhI:nq+~~U4cvug9u{;mCR={ܨݽ7—ҧeJ }y=Uxc~@maNȺ,l"1!܎U=%0!N}rOt=O׽!4D7s=>c0TKdP#5lSvGT<$m[w~gsiq:=Iy>ͺ.^J^W@a'n?n^'¥v.NoP=_h`~|~Ž`'|s?^swR^(Pd#K(Oo: )jvςhJRT/ހ 1Qf}ث֍ 2r21ئn'tJcc~/;G` HA^( ! 8N<~tR"8`rdqJC#qrd!a!6qMA #ϠC Ƥ0)TD`Huk0CNj`KN*fꔢ! tJt0GM/Xt(ńkXziB+kDQ -]<8@ %82Ns u3 Lp_C='+t#zVՂ]Q&xA7"(fDH.H4q$2 *>ۯ P/8H8r;==D6d$ /렿3h0K 2dOH㌣. :< "H3 Ҡ8^ j /1l޴,%Θ (4B ,('8BII‘ =c32 '-"/ @ #-$ @{ʠTW-WuL  F% ATSC#Q AT뮼DƂ ̃'ÈE҆!;X2tJ&-Iע[Yu m7J LDIXB 4.h͂( 3G cHvPG-8NUay"3l-vRĨ48 C"?; ,* _A 6x01 .Rm Ò)k-뉾e6H W KTEw"Œ  Cz">(# 1D8H.g!q1d1\FLA:n(K\k-'{'uG:r voK0 肍50K3N:3֢o6+:ݥ]C3g? qHC$ b`8;DA! dH6 ,h bdϬ 4 Ɔ6AKC V D@H1'<ؒF`AbE.v";["[uD%x-<)U"M†4@ J,iX#cG И"PÑ4"AtWX:ԧ $ S'g6z:JhNJK!,W!,W!,W!,zp H&,p‡6Q"C-ĨPA= R$Ƀ"G,8aĕ0$>3kE hPJ*m:7(S8:bŨէ́8z ؍0J`R~x(' rG@={8ؾgm8ai=RM95)1lj@!,W!,p H&,p‡6Q"C-ĨPA= R$Ƀ 1xriG#I^dꔙaKk`I0VF< =<2+Th`I)>yr,Øt=>9H={x.`KQbV@?Nё d.IܒkA V `=̒:PPwHNse/$86,Otx8q!,W!,W!,W!,p H&,p‡6Q"C-ĨPA= R$Ƀ"G,8F:>W  ML1I f?8?lcn@suǑRrdU҂]VSU%VWežYi'@ l NJ|gxǽ)9ee21;|2 !,W!,p H&,p‡6Q"C-ĨPA= R$Ƀ"Gdh]+ >`L9g&H8S =}r@IRgbu4TRi)U@>s~P  !NÇ^IN#,CWL]f?@j3ƔC,Q0j)ad@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,p %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,p % H*\ȰÇ#JHŋ3jȱcÀ!,W!,Rpn@H*\ȰaA#J谢ŋ-N1Ǐ rɒ#7\ɲbʉ-c4̛1kvN=K`󧀠 dpJ5x;Pp wO#NԳQ*3 Xb&e7aEC0MjtkʫV " sl UmR8<7tY(9 ]s.{6Sv* W6P/ P/>1d)|.Q6Q`KQ ?$@%WQU7UdBbDe^AbÐ!A`½?D Г>z45;`]px n@JEN~) bxȡ,I8Ć>!/ !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l \H*\ȰÇutHqNhܨQ 8M@i#O*L2ʄ9nT18ide˗ySfǚF=B\ʴӄ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,ld H *\ȰÇ#JHŋ3jȱǏ CIɓ ˗0cʜI͛8sZ\Rϟ@ Jѣ yDʴӧPJQiAXjʵ׋V ~Kٳh]e۷p]+PݻxI޿ P +5#Uǐ#H˖4̹?) pxA^ͺGѬM*yߏaNy_μyVј//K@cνuËGs,T |ϳ߀]thW 6@ wVhc}]ᆂe a$Xֈ&"V(H4$c8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<Øu xeI"!cIX]fG' 5F*dB1 ȅuCpgg+< ]Se `Շ;TC5_'qT pGPqz. 朣dzBıFZ#z`'qwH: 9ΐeIt^|#pERs$B.A ೑{/=P믣;wᏏC@FY@FFz HB!Q>`[:|2W B1@,qlMŁCN%]'#ºvv1׃8\!q퍳9g老mh ޖCg4κ~xA8V ФEVZ NƁ25NC :" dӠPtvŝwxwh6H0bt`wHiZЖ8 [\f_z$ 24;>ucu;1y|-ެo,dV|Fr:CPynŏw8Q(X۽hi?]E7􃬞HWz0+'F[FE _a-B1eu[!nsڸ<=0Biϖtn׳2I D+&\rMSz%9GHȄ [z^N7pC>\O!rpy@Vn F;&:‡?Wsa'lXlk{}8JX=C[NxѳpXsn4(fw;vчZF] EG.V`qjvsEob>*u@@l& h \s=wx SvJNTz6e@z<"vUV%HELGWXMq;X@upWjdljf|QCPVu|Bp^ \@s[!| 6 xȥ 3H4 hKv"Y` P q% cC\#rKIDhMJ Lp`o_~7lCegPI A:6u 1b 1|>:5`8cZ7" >~'fwLFFkxTzs8@_fnv hgmoSqQfqr}ELOgBvQK > iq\p P RB5`J)4xљ@qP\3 m gU ք}ZeNapNq@[hG_ :a -NcSXpR \ Jm G<Zp OuiK]cلRj`•yd2HDq]̄1 VkoՊLQZ@\Dl%CsWUz4>@6 ڠ#CF{x1PF"߉`֔`B y8n:Ux7kl4UEP>@9(DS PRZA[*'C}+}Ӕ(zz`\֨B02wk ^|@p*ppH SaQ%h*YPs9@:cWJcCh:r+ ?T fT*: )[8i LQ@1-fC{?Xt=o&'G~Ɋ2ׯ`*A@KEJp 7XP>$"a#`6L&~7q^: :?CµMFv6 PѴ7JKhRɵZQ* W'+!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,lD H&Ç#JtX@NqE3vINJ!1\9d Y| L3sּx`N;) ˠB4 bCC-)CUF* kM#V]~0R)ͮe5 1gOL)VxVǐ nO1؇11Ѧ=rKӆr"АSf7&-x˜adqCеi%`Ɋ\ڶק)',y幩 8̅~vAG) S4ۦcϊ@(zO~|D?ԃcŶs  w Bᗂ.wxu-A[uU\UyGʡ8a [.b2Dc"#^#!,W!,z H&,p‡6Q"C-ĨPA= r b`l$,$Y0P3A4(ЂEd)T˖[4Gp΂[:$ +VZz ZVШÞvnƺk /z}0Jv+Ç-Xhc=F8beG!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ 1Lxr^ Ö`/X0zNCF14DIXp JV[67X 4=d[xB(S}-,jl|n2ߺȊHE|1ȼO8n4 @XѵqpZvo: L>.'aă8Mf[t'!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř>@?LĠ~= %)~^,ӳJR" @ LiSbL=5Mk1&#么 |r # @<+ ֳ2KİȂ8=L9dhb5M2 !,W!,W!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLs}Ct [O?-zcRm(ԁRb|tjL]R|)T}.`:1nz)({4;_|9g1dƗҤe@!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"G,8aĕ0$>3kE hPJ*m:7(S8:bŨէ́8z ؍0J`R~x(' rG@={8ؾgm8ai=RM95)1lj@!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ař&@>Vp %)p!}tڬ*Ȝ=1Wd\VYi{6KY`1~ ފ!C<][d@u=9Q klmܑ %G~jGYvl!,W!,W!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLL7=IRfO?yd8bŜzgcNsTQJ0{Vrdh`"R;uVc[k͒ !,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,ř>@?LĠ~= %)~^,ӳJR" @ LiSbL=5Mk1&#么 |r # @<+ ֳ2KİȂ8=L9dhb5M2 !,W!,W!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,8řXD>R<үg>-PIR:l4SdBpuW9 ^A/(lY\Kۂ'\@Vҭ Q=#)qGjz[@< T󬠡K pͦ)cQIm>!,W!, H&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.ah ̇/? 4Y+I4Qmւ\DMXTT@?1@ 4-Fg+ژ[ค&=ׯ]x"[xƕc2Y+9zIIZj!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,R"H*\ȰÇ#JL(ŋ'jȱǏ CI$S\ɲ˗OI͛8W4ϟ@}ѣH7͘ӧHJgՄTݪPjE`!7B&*@[ȶB:ꒁhI ]LJ {Xs9ai7b)yw5(Z)hT2k\Q@ʗo.8(db U(. Wk;դ$|&m gǠyP4?K@  .4N8H q w 2WÛ̷‚fjdqh q\芥Y(t3f:# =A1N҂A`'% dd)$^` h`ħ򩰍 ;CqP"n3>c'i HT$*:U:8Cn촍@2L vd4 Dt&Ժ%Z  .x-Ap XApc:$A8@/3! '@zha;EOpb76*# b“~Ĥ.Εӵ8m#Ls촧@OJԢHMRԦ:PTJժZXͪVծzuPXYҏi`hI?T< pV}!xHVp !u(MB& *, Y,&P>b|A]k[ߊZ#0h-d*ͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"y:!lЍCЉN!1`-@'47TY C'^ͩJLWh*6y͙sAq3LX`ωfLZ 6ؕ (tV,Gn &Vj ,хLWu=dʖ,J0`yKgA`~@KX;o)4} @yڶ@.Qo/D%ҽhV'E+g'@_7 \`*/ʖȶPe8.zR ħo$(gb瓧+@{[p@.^?̖u`D&:ap^z"p7H:!. DӃ \8zBNPgۧrv8{x[󃜽s/rigw &OA;Q-U )yAd8uPl`T gTY6<WyWAly!/ZЕE,\ָ~_!|O:h p8p0AE sw |̂޺$ y?olq'wUV gn U *6xQ{5A' wJPu i{"XePh~X8_`F0W jу?{-r!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,nlH*\ȰC#Jఢŋ/NH1Ǐ rɐ$J<qaD-M9ˉ,B5 K) 48Tϟ5:iҦ|/M.ehǕJrt haW+r[ۚc'u+Z0:֥fM1+xaݾK |?nwD9;溎EZڍu疊5s=+֛M WRZk]o{y&]5׍lшaCvM9,L!(tbkw=dڼU' ~YJg݇`\~EQ!,W!,| A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!,W!,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!,W!,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!, A`Y0DϟC0b6*VNCD<:\J#>j&Pu#0W !,W!,W!,W;bubbletea-0.27.0/examples/timer/000077500000000000000000000000001465647402200164755ustar00rootroot00000000000000bubbletea-0.27.0/examples/timer/README.md000066400000000000000000000000571465647402200177560ustar00rootroot00000000000000# Timer bubbletea-0.27.0/examples/timer/main.go000066400000000000000000000045261465647402200177570ustar00rootroot00000000000000package main import ( "fmt" "os" "time" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/timer" tea "github.com/charmbracelet/bubbletea" ) const timeout = time.Second * 5 type model struct { timer timer.Model keymap keymap help help.Model quitting bool } type keymap struct { start key.Binding stop key.Binding reset key.Binding quit key.Binding } func (m model) Init() tea.Cmd { return m.timer.Init() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case timer.TickMsg: var cmd tea.Cmd m.timer, cmd = m.timer.Update(msg) return m, cmd case timer.StartStopMsg: var cmd tea.Cmd m.timer, cmd = m.timer.Update(msg) m.keymap.stop.SetEnabled(m.timer.Running()) m.keymap.start.SetEnabled(!m.timer.Running()) return m, cmd case timer.TimeoutMsg: m.quitting = true return m, tea.Quit case tea.KeyMsg: switch { case key.Matches(msg, m.keymap.quit): m.quitting = true return m, tea.Quit case key.Matches(msg, m.keymap.reset): m.timer.Timeout = timeout case key.Matches(msg, m.keymap.start, m.keymap.stop): return m, m.timer.Toggle() } } return m, nil } func (m model) helpView() string { return "\n" + m.help.ShortHelpView([]key.Binding{ m.keymap.start, m.keymap.stop, m.keymap.reset, m.keymap.quit, }) } func (m model) View() string { // For a more detailed timer view you could read m.timer.Timeout to get // the remaining time as a time.Duration and skip calling m.timer.View() // entirely. s := m.timer.View() if m.timer.Timedout() { s = "All done!" } s += "\n" if !m.quitting { s = "Exiting in " + s s += m.helpView() } return s } func main() { m := model{ timer: timer.NewWithInterval(timeout, time.Millisecond), keymap: keymap{ start: key.NewBinding( key.WithKeys("s"), key.WithHelp("s", "start"), ), stop: key.NewBinding( key.WithKeys("s"), key.WithHelp("s", "stop"), ), reset: key.NewBinding( key.WithKeys("r"), key.WithHelp("r", "reset"), ), quit: key.NewBinding( key.WithKeys("q", "ctrl+c"), key.WithHelp("q", "quit"), ), }, help: help.New(), } m.keymap.start.SetEnabled(false) if _, err := tea.NewProgram(m).Run(); err != nil { fmt.Println("Uh oh, we encountered an error:", err) os.Exit(1) } } bubbletea-0.27.0/examples/timer/timer.gif000066400000000000000000001347451465647402200203220ustar00rootroot00000000000000GIF89aX !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566677788897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaacccdddeeehhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~! NETSCAPE2.0!,X !/0 ! 6!!!!!7"""###$#@$$$%%%&&&'''((()))***+)U+*U+++,*W,+Y,,,---...///00011122231m33342o44455566677788897999:8:::;9;;;<:<<<=:=;===>>>???@@@AAABBBCCCDDDEEEFCFFFGDGGGHHHIIIJJJKHKKKLHLIMMMNNNOOOPPPQQQSOSSSTPTTTUQVVVWSWWWXTXXXYYYZVZZZ\\\]]]^^^___```aaacccdddeeehhhjjjkkklllmmmnnnpppqqqssstttvvvxxxyyyzzz|||}}}~~~H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무:4檫Z1,ȶh,6ⲻ:+m: V+,r-݆҈kn䞫n.y~Ep[}!4!D 3$) a[`( GӌD#KRlu \1L¸t (<s=$Q#K0P̈L;7-8*ѰR+J\\7RCTK4dI9wp< ؗt [wp!,LJ4 L8oD1p#TDIIi/laCp.%.6/]dtJG3 ⫷;ljD@$(l3WM( 4F D4ԇ?s'!Gs +L 2@ïl/(HG@ :'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6rpL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^w !,W!,m\ N @*$aC xbŠ1>"ńAH.| ^* ,ŁL̸3bF{!,W!,zP H&,p‡6Q"C-ĨPA=  3>FfqXD*IJd  %ʆES&Bъ}4ZY4@Ks홄ʊ6jO%E╩@Gр]:pY4;kͲlA\sE4 12Mĕ,ht-Xh(tf+ ZdiC !,W!,P H&,p‡6Q"C-ĨPA= R$Ƀ"G$HB+މ& &I3k^)0M5k-ZCYZQN:Z Tfb?9⼚V;oZd?5lUtpu,]+1є)D@nTkC 84񤴔,c֜I-!,W!,W!,W!,P H&,p‡6Q"C-ĨPA= r Yvl$)hV$Y0G3Ad@HOEd)T˖=[P1 S EfA\jEaz%lFn;sX酩LoFjI0k=-XhcJJy4ъ v-ǤƝ[7&@W_x/ᾌ.l#^Ɋ+S,`G4bDbʘgTja!,W!,P H&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.a,hbř6r-3N̰x %)PO&􌣒f$VU9{r ('ɶm3E.Tp) sŘEC0E/y+ ` ȢJQ ц gjkR3Xa#NM쿷% !,W!,W!,W!,P H&,p‡6Q"C-ĨPA= R$Ƀ"GL)4.ah-Wy"#¢ ՔʔAP$*h0D*GB/])jczk"YU?U[6SUݴyqs| t=L9[%_ɀ!,W!,PP@H*\ȰÇHH"ċ3jljCI2G%S\$J0ctYQ͛iZɳB } *DH{ͥN**IV4kF^ö*BfD6-۶e +wn׺v[u/ߨ~6 ,)C#x1ƎoB,s2eKi̙媝Co,UhQMFTugM]{ThDmkƝ[7|y"O~s9sΟÌ.}%)c'}9(q Op? !,W!,Pp\]H *\ȰÇ#JHŋ3jȱGCHɓ(S\ҤH-cʜI͛_ɳϟ@*YPѣH*HҧPJtԫXjeZUrVѲc]׋E[1\vj@  l#ÆQ ĘI#,48c/$DLoFELCuIC,V*۷-Ȁ DoƁF-qGۤ 4~^haY4`}g#V>)x1chpI.D\0J4ϬxƉN)W <6aȑD\FuVCBD B5FBqr3p MMc< {#D,H3\ P&K>ӤB*<M1S,tw 3\% uerсiI4(\*  1~6CD&3J=R,Sry0̄*W  #*& - 5\D#E ފQDcFDsB ȵ%DHBHpp"C*4;&LR?AtY u HB# :"W$-!.norApGCELIq r-r#ƨ8CBZuЁ pѤJa !Wlr:MC ,vD گ=\\Td51!E3B&'rBqHL q/3Bdq$3JA*Pr BBD BDÊB4vcG9Bn6Fv"(!F#IBd\13'cBB U4{KBpՊ.083#ay  BDcB- Zٷcԟt[#TuA+d D8BH`*bh({Y@1.s ;'}ѸBp|%("ha 8\+H uJDc\KhB! DK*x  .jNa4L8CWD YP 1"|) re" h0Njh|b!pVۢ (*!Upc4ȠŒ`ϋ\`h >LK#BhԌ,z0 B)qM͚EFZDȥ.Ō`-!тF  )$Z2JCA:;HޢaJBwWɏ\(]ϢRz1D|\2ҎA \EhƎ" !m 6EZx81'89"%rnzBnⲌ<3ZH.RKCqe(*eiҥ2ȜG Y `BoWW vX! yqF rpzi iP %`1gWwt~LXGgRy gc'}i`z!~Lo at0x[%'gFI9<'g]OS0r'zKlWap~L@ !r{3Y+;~}d0y!~ߵ@g#2vzXLp1H:Ȉi@`8(~m цƇ2qRpz90]j7Gg Gg*}i J!~J@ŶϦ3 ĸܸ*HѨXA01g1"  q(w(PmVt`˷h(W!~,5"YfIg Ip(9!Ygiю(sfg qg6 Ꮲh00C || vL ቐJIggǕtyga *HgxBYP`y5rdه9@g՗?07hP}*`k}{7lĨ\9Aɚ !F7iPyuILJ3|azHT)硚u@gGx&`k#MˇIvPpqaƖ~  ixGE ]CIi pOjty7EЗ~ I7gIy \XZp`0aJA`xJgC@@gJz'|CwO=Vpyc`Xq?`mE`\+wt=t< 1VJ06EȅZpy5Ijm=gxVABAJ|DLq3pmmPOن;PlA51 <9>z2g70dp3qf(y{Vbʍ xpppvZ:A   :qAAGʧ$ *gA vɰ0p"07!,W!,xA?X@(p,gcZϢEsI@! TQ h#a@A@&E[fG E b qDE@ 4e%k*(YtY4Dhv,ڧmV9hG@m1n gt R#e3> ȠvLd&m,ZbAyj@!f~JV4hM `B7іj*Y /'`$o$WT`WV g7LD )~l@T.åKdBh=' ȱ##v@$(QhaƌVe2rP0HPHࢁ)(]8{ -N9( .< `jE  0@60W SkD ^N=dX,ڨE V92VqbqAS&~rY ?^ɤvLd&#lӨzjC!Ģ!cH@PǑ5Y)0Td MWO y&fe<1OU|CTEHM EqKP5@3l"xPKkKrŗ7xK22|D@3dbovk DtEi!,W!,xH A X( M0w D׳hє%$q SqZ `T\a ed|)@.E1ڧœ(H& @*.$86,K gE+FaPIF @2e.J60#aIKTf@ 2 aV>48)ڮL0 ,q,2k q06Uo4-KbјB sApΤ !,W!,x((@*Pb#J2PD ,( 3EpdFAF Zr@E#Q 9 h Td(Mȑ7Q nȆ䊤΢qUgFlV`6aO oECơXD"TFKv򠖑F:U"RdFeZF>qPHhT4;OfdLҺ(d$4v6̡eXBM~!)YlbƂ>Fn)Z.!`Y4Osmj92lhI4'aM G4"x @rfS#bAAj@MQ/&3U"@bIIR0A^c@0L\&<&% Dy%TCXH@Az!,W!,x(H  `<qELÂ>h=' ! 0jyfpH/*[E{B(C`%̎H."H1X`%SQT]W6hn%BFlh8 @Su6 Id h*H:U T @Cr@;urd HBU8ohDcI"7afnYӗQxJٲHF'c%3 (NP ,B DKd@IpsG`0LA}]`4L ^C`CPQ$ GXc좗@@ 7i,=Iz$B Lm%G_ b@2BS4Dz$arY2cJ-sBnB7hZV!,W!,x'(@ "\Ȑ`ABV\Xbņ +RxƒCN8bh\,)r%I$8FKfp1aOdtbA")eFH!yFhԁ*F+L-DQ9TYwDKreHT -O~YDC] h֠&~‰.\,Z#l0Ki4h +Pi-SbJ wr=3}SW6-W2RJ7ˊINY0XQq>H_voV$o~l I4$2REDQRF !,W!,x5H  䠰aAE"IAE+f9W gm`%HlǁBdFӸJ Châ-#A  62I0Y4!*qLXa#Ek Grm4p E(P 4egú \+Q" pv41`Y4D|{E;E0Ye6Tlce]0SUɪs[W G8( @F>}VB)Ь/|Cs21xjD3q@@22C p2FhA@AyRPp A U5L4`P*m /vT@!0i*TĊݑ ObQE u&@2RP)e%PE,(PT d.Y  Foȗ@gAYmF9Q" rY4) GK{&Dc ! 3(#2J d@-3-22a/E9̋t:*x d@(:yG@SZJPP m`qBhA>xi5 E !,W!,xA "b3|Q8P/6(dು(M`Id  29 08sZA 4( DMHWbuA T`h%oĀRX@ў 6YikP=up fx|-V,)PT6LBM Xf1 &eZBq+%p+&ivR`VЙBFP* DSF@\avP-'\FTgP_/'qWӊDX  !,W!,x(H A*P!l3SH  $q`C #p h UȰQ4f J l*ڳ:ShJTh)hJptE{CNE3uUM xmUUbgf $x+25ҚDذX٫5)UZ*V b'f1 ZѠ"SYҳ U@!@!Ry}`XX>uhҶ-P P2{OWZ-Wd"1'ȫʗ/0%ں"HM|DIU(́L0OTEHh%u@DsU! i,{5&(|h0 &%MI4$ hgM4AA FP@!,W!,xa7@(p(eѠ{PE &Ȣ rE `$ /Jn8f))}<(̟9ISAF +hXpaBM=, ӿQ1(،ԃPŲǔ $5*U 3 ( q!,W!,x(a@†Kt=MY"iܨIBipPJN[eʤ8W2de;l &s_K&4:r z@+:=l$ p"(_9'E@ D@ S 4$x D ERKhq$/=@3@>#[FPH3(E#!@5Py)%I1)L(P m`!^!,W!,x((`\+f9WTb Z0A \YhMುjyypHcNW4c ,"y'oM?x)Zu722S&'ϳYJ4ӪAgRрn|!,W!,x5a \HÅ @)-2b!F Q  OŒF@A!X>c ɅTaD3 h ECVQ,(MJ;\5# b1$0&VceW%P--Д)*Z,DpdF:є6PJ'B817Tьee,] `/" rb4gJ,@#5-!Ds3+,} J1RYC>EuMXiylUaC*MWVFL R+ZX6P# 5R >3^DL 50 Ob@yĉRSP4&r,!~AӄaݑN,b,BD#@DbVuT:TEcѐH>)5L4 rKp% Zġw*%tB=Q/&HG^{ԉ/À@Ht*fѐҦc@4#3 Jy@$4PA (J""22jqрIAuyE\+P@!,W!,xa hЂY@EBV) W>Ih@B&؇];(Q4f h DMТ-HSh*lqGJ#jQMJ։R!,!:WȡǏ" WqrvKͬ|1AC5$PZgI]5Z6)c䋐.`-Οi6 eV\ia2&$⁌,۸-806* ƽ{Yf` <脛GhX26f)KPAMP P$@!,W!,xDa*ƒ<(pgѢ)KDqX RQ!b$>ؙc2fTGZ%܄$". 0 0f *2y2pI $EcƠV8$#ɢu*N4h5 X ΢5N4o6\D @-FS! B(`rlg2UlvЀ&E35[ѐqț0"gE+F5 f @#Рh5++UVzĔ ̄k3h6*i1>QSL aV)&2@s)&("( ~h@'a| Pr]qF%vR*3&vǏ+]LVg1~`64ZLae+ѸKod<[mXY 0`@3MQT 11I4DFUC裺1 ,c ő#Fu5s{%)(\O[Z&@dԌ/ B`ZdD5B#} @!$  p`jyM% =ALz p`NtCA!,W!,x( "\`>h=' #>VBELA$8%h:tύK(g0%(mBEC6 /h`TI4GLT v L:%ўd'L4 &@2Hf & dy[G@2Vc47XV(luG(p@CFS@H*١lp_.؄@Yn%E_Fzf()oo.$.0bQnC~*(CS!,W!,xa@(p-L( M0bw& )p`5B0W ,Z4hL|"d. t 22r*\DT$xjh>&U ,{v`Q >MAŢ@޽irpݧqAS`ċ h(- O;Fl4`&6 ڴ @2edF[h. \8hq bV:ݸox`Y4Owu*A[y7i)!%~-~t:$c 4&]UP' E@A52bMV5&) 5K1;EAI͊UH3 s"_ҦZ_= !,W!,xaH(`(eѠ{p@ic"V(Z> ErMJd4 n.#gEM\x w}υu)hh2Ӗ:kB%9E b3+.}0@Qhy . vZQ4pQ])/2S"U2J tXP-^)"\ @CFgˣbuBCj;!,W!,x(H A *4!g&;  `DF@@X d pP@hV(hТlIah(-&`_B6,W<6 j;>Eu(؆2;V4djDPJƶZDhсZ*kVE\9 Z/b?(P/n2 |h i*oF(p \xpp6f}h"4ɚ e0yk'hL /pU?/ۃ8M _BH0&H3S4]sni$(\2$10Ϥ8U*2`C^ҒO,v.*~g̋y@%dlЀK.!,W!,x(H A~`P>lRp,gѠgѢ9$aଐ!$CPh )C* W4Ba e8PX4dEP aіّBQEE"BDv-@ !Ljt@&Mb]E5CHk E8S ;|((oWe6D ^N0**UI(kFځ+#c"gXY-^ -FęrYj 3HsBA2/ ؐa.i h`hNm(Q0 [QTP% #VW*!g$@TJZ 'v  aeAFc}KDG0BI6!VAwpKH)PbL(ah3-Ü.2ES@tȔ"BMq^3 NaP m`yp Dt!,W!,x(H A @XpBBV9lD#vg@ 4B I2ȁ@F%6ƌAI2i8PhѠEs :< M754E:1^zOP%P@f $x6-NP8vBDњٔ*AzCu= ` d*8!Ñ3)] Q4k PS m4EU=.`-@ӨήÉ eV\ia"p8Ǔ/0U@g*;Pڣ-[.pᅊ_Y0XӯW=yRwoYwaI%@k<#3M u yM% vegL ~+!,W!,x(a*\(pgѢ)KP`lP!@Sgf2"Px@̢{ÀcF(ѣ(3D@h^R5R Έ 8DTcsEu0,0c*r`lܘ8s0v417Bhƥ h( 4홪ɪ$DY]9 9$0lVg>28|(hF L4" T2]&a],Թml9)>7Ѡ.o^ JeV\iaBf d@ZryB$H+2DyLD@{HDZHd"(aEb52e*Io,(X DJDRZ$ID K,Z<^X!$LIpT{Pb)0bXHB!,W!,x((``!Y@ F #q h"ˤa@A@&1lFâ-#A" $bFI&c h+銐~ih )h8ԨiY4D5{E;bFj3Z%ѩ+#c#gP@% @Yqv\V2((D 4p Ў)ә5S,$pZ7EuЀ@$+_ `T Z>&RQI$!IB@Lh}VD~@JXVD ]4 :$1 4FJc@ .M!LA"-g nwXbBAy Qn@!,W!,x((`>X@P@#vAE):(+0i )7H,8Eâ-#A '7ԡE X *ڮPHNO*F, E#6j,BeZECWSS cv  x|AqPn[U_*LKhǔmLf"iQO~1Gq26$$$`4EiPDL ֔U&∶50bBD-o5[*Ips@㥴c tG.Ϩx8R)qZƀ1SZl`MFW+PPx@[5XR̹Ag`Yx~TFhz4h4n)/@AHvx-Wc`,M:jhE>s@o (@MA5` \ @2*FCK\ÍA HQlo!,W!,x5,HȰÃ>h=' MYz 0M`KRxɄXfG E $ 7 8ahD1ZӁD \J(YMfp8 HszPШ'$+af,ې3vFhP`U43\lȑ3( 1(ET9(ڳN8ˊ g<0>$PSL?EuMȜvLYdJQdSh LaX+Z(6PܷA`B 2 }Y 3$50sD3g`(@c@Ĩ8+Zxd-'L4D O@Y!*=2 UadVfAt4ɘ Ąao̜tL0 tq d%eH@`M  R$ P1p9"pDcT ab2ldX\I"P33}Bh%/ubߨwZg t.zM% s0tჁ :DiC HQD!,W!,x((@ "\b#JrBVM| )[Esςȡ)gZph a\5se׽"!%P}̂Z4&{Ѷ(\—UAAwY "a5x\xM%x$UaC0!,W!,y53 *4XؙJAF !Č @HRŊ[E{BbVX,E:Ѣ("N;m 0O3.\,ڨJ 20**D"rFcFȒ oECơDžb8Ybˢp,-9tFDFw~əbaMrBE @4eF0\ ?EuQ8T8PHN^Vq{Kk ΎV[!t ubL!/l0K+4^vR)Z.r"1 @ᣍ_x'WӜ h).D觚U6Mb ő >SDFApP\ 8 MbIZ8, xBDc &!"$1{@\r m#I=!XNPZEHh %-kյBA6P HQDB@@!,W!,x5H9,@P"b d'BBpgѢ)Kଐ!$3ʔ/ 婒E#O ShJTK)`T\s`hBhmuh> ɥ+h2*+6\D$ %3Jp&-mTA8CPEŖtDg)N&8ѠB3Q t w.Q Y-^pMQrj?EEMjv":R)TpBҒx`6d`'!iE2ьfqE A 4p{,Glי\WoAwRH!g$@](yb#vd @Z5U!U4,L-$v]ot 4I4*&px)hd*@4l |f Z$ P1,C/M1 !$=2)St$Ё_"P3/Ƅ AEeBiA4$C02/RCA5\ pC HQ!,W!,x(H   `!Cz8ZϢEsIC#v$C (Phy24lɰQ4f X0,2;T(`·ZE{%C ΢E4(A)7C?] T**@抌x>,!ECTWSoECơԴ5 *Uv4 hT 0hCM2GFˊZє:Y&HZ4hHGKfb>0̢%|"Om`(w~@JAϵL/Օ&U0i1FI4d m2@Dc$r@L(̉(L0J4+!k-ϞLh"y~ 8˟eʈ8 h@s2'%#@pԊ&P2PD[B A 4(boDU0+pݑKc@Qr +@ ĘW0S @f^44dqYYCW@td(y{l#\hNP1\yT  !oz@PK:3iP /]S?H +`@y(g!m%MD4YN3 NLh'*% "=3iτ3'fƁ(0N?I15\MwK>*$d\2*VU &IdB (ŕ sMO]zJlobiYU Bس R =MiV$i@`0YϤ1(YzMP +1 7HJO }.XځԻ %Uij2a Z `A qT?2.쀡޴v R6ry 26ճh5\0j=Ʉ luJ/$Ke+[?cA\[Ʉ5Y~U9z3Aw "+4oI2b iziXm;>5ZW#ԯ!HmzdUV̀j` u=&H=I~AB+HC(1EZ1ݜ??&\L.A3l؝Ϛ5oYx`J@w"3(A! f?=;ڡ'0S̮z`{I. ޠY.H=zBO cŽo A  +q Vk:{?y!7S%E&01RK΄&Kd{e;p^qu 4xf߁je@o؂c@D aNVTb UOdtMr80u8p8j( !P$P1,o'.֖1 O- @@R Nh1Ϥy!Njj'VbOlx PH3 c&1!X4Ԁw gPZ(E 0馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k. U&04GQ: {'$ф0Bwy\ 2ɢ r)B 213,dz9o B- sH܌дB?$1p@FuF98#~pd&`AWWe]F X>w4H3E@ @d98F穧Nc"A 9h  A #bA >Px 2 `'8)Pj0AyPD "h>@c!(;^$"gN #O`~[ V<PFBsa%֚ρ( ?7"V ja NV1.@e͑K9+`g=%r %;$ ˛X^}t\H˺+_6KD 7ʫNlBRkah3@S4s 7'N-\Fh&&nA" |x!SFv }Bvާ>'|@ -P!,W!,x((` \aB+f9Wwi%E,A!> hGV8f YD d20H4-@̢{Àc|H`1Ku&T(Or+ YK@SvXds&"+Їnz8XQd, 05X@hT5HbъQ08F "aMр́.2 }BA)ʔA``њ0nh2N2@7ahc'|RX`Y4O 3(m~ dEBXEh%$ #S{ DXz1R$ $T1,01e@*d4)#5W#i!#(Pu PH3 h vFB*qS!,W!,xaH(`(eѠ{p@ic"V(Z> ErMJd4 n.#gEM\x w}υu)hh2Ӗ:kB%9E b3+.}0@Qhy . vZQ4pQ])/2S"U2J tXP-^)"\ @CFgˣbuBCj;!,W!,x((`DȐ4Yxaĉ "V`#H$)TH8 Z*eӠB1c`Ѝed|9ЍHJ{T(a&!w} *SwlT2PY@f]͢JuU"lWqYR?)2{Hhe3BXƌ1䊑=X,Z.gft2wh0[uIW\r9D@Q2  ҩ45һyhh62K dfL-ןwy@%|edJ !,W!,x(a9 \PʢA Y$$@\Fh)X 8g Q> ZᠰhȊ j%)H$k~Hkb-4+QShjYWb5f u)(@2, &l%'0pFkF0#Q@Nn>JxJuWȢܔ֙gxW0XY!(pGV3FEA6Y" NNfH\H.4H4vCuuu2 =dz– dTYD B{ vED%<@'1#+4+aVC 4e/֥2+X4h*EL=ITT]PA8EC%HP q\v)P@!,W!,xQ(` @@#J|( M0bw NL" I*G\9r#XQK2|Hh, 81 2L T2\&`=\۬aJ߁E@)p%1 3Pl6DH\!J,AËU0 KLTb\>@DS hAwBK'*ƕ!iq% !PBr-PUqetG4P"dʥH0l32p5gfpW4)K$T@peDcS 2ZI32PbF;FbRKܑ?JYUI4$F`-RAhA>P m`\w1ԀE40P@!,W!,x((@*\xÇ ,X36 "h2e(#H^FB͛ZLQR@hVPXF SP48PS f!¢A]:MQW<6Ղ^0T`1L ފC -{`hT2hHoSzgO~^!y}X[ f/eB@pR>Mp)Z.",@MtAnvS$xr3:ۂ졕P/Ah i ^f`w`&1!xP"u@=q@Pd]l%dl`B!,W!,x5H  *\P<ZϢEsIA C62Th40͑5lȁâ-#A"Hs o A㘊RH`N"(a~Ш"mh % x+25@ Q^NTLce0]+PFe*QЎ@]8gјʟ4B7$`Y?EUMׇU"I%c%3AVZT*Wsg!z6S `Y/<&M䂖h@0LA*DAw䒑F`^DOF I^`HU O%TF g41pd$b^Z8,qKLK40ݑp?#ŒwP L {B0GRR=F4H)2b~a/RÅ~*Dt 5 E 4T!,W!,x5H  @CI$&Pb*b1- z-D*YK2<3 1,sJiW4Ba 02pI E3W%$,`X`'>),ȮM h*M+\DT$`sEU.(%tM ;|(*ک$21XwTѬde%]0YgђU!(1hJ6B3QX;%S,&Y-^8d#&&'K`&@ 8 eIZEQ%iTh'(MID@%duRXTR3XwBP+ /VAq`Ips^!F4lFT-hq !*ŀ1C^d DEcCU` LHA"Hٴ"XÙD hL6p 6ld@*D4l#Xlb A]$p T DIw usRL6)@ w͂@TK1iAЎ<;I/@LRL^8TH3 jAh -eTCXtia)ԀE&P@!,W!,xa@(p(e Cŋ@4AFD#0`K`)ȜE44*TxPSqc  =& u@hTgQE6j!J`{8ѠX -@Ekfe (+PT4ZgE;"=AQ4gqQ􆚚d4NC'Ɛ<$U!eB.XSm΢a=,Z-{aL>"Q͢mj.PzJZaUI3TL!,W!,x5H`A*\8PCzXp,g}9cGRxŁB $)SH0A6t(3'  2 L%8h4,QB38 u0@l2H2]UhpQ"ǯE3uk]l"Bobˠ}Yt+hpyWmY w`#f9 _k,=Uh.B5)k8(BmpB.r EK4#gYpAe`QkBU4WZ%pK}ܑ3b{EނP x5_ P+pGz1 ,It*P%wDsu~2K4pAZ0@O@o41p)i1'TBj ̂Pv1dB HQp!,W!,x5aL Çz-D %>`cB/B|8bEN!,)0@K4 s@̢{Àcn2+A'PT"*d.E`2ZJF*ְ pHU&jHs+nܪs$$3JY4;#ƏhVزGV h(0$m@qYszhJS12+30x.h)ʔAsy*BB9v}=©JKVqLaÿO`Y&A eF4_&*xPT-15 ia\4PXѠP?EC$b 6Ƈc4:cs1Q|fEP D@P @TZK[@e!QRQ3R4Z(F@p3P @-)ЁbLHTg& #u(E: LԀ pD:R>ԀEx(P@!,W!,x((` \p!櫏Ä[aB,Ĉ1(g1y@%1ZX@V(LblBl,QR ΢T F:ѢP 4e]TQQd;&\,(0t0Bhvx+250@4#EkvTΫ8U1z j頰zs,EL"0d($, uA1.`-a +(( bA2RWZ-A`,v`%jTB5(̄L0x%@cB(BDsIG- i!,@xbAc0 Sd+%I4,ZC]9dCA!,W!,x5(`*\P4) bg:tȰ!V`1eXdGrE-I[xBƗ\FƗ͟|  SFoRQ[23J+l Y   U4 YlLWjf:U⠢%R [ @Hh!<_-`A`fn 'd+-2c^P>MN4̚Iׂ9;̊p\k ̝DBPrgoО}q5^ [I{qwEQ3@p`Jl%O- hb@Z$nÀ@HtGk%3,B 4FMcHl8"62S EcAO$F.2тW`nB HQD>!,W!,x5a*PpÁ @)-wi(p#Kt=MY 6$H 3Zcj<a"}0EZ*҈d E3W$(MvmQ°afj\HB38lBsCV6$W l"*Ra+E!$K&3J)@).mEsPE3Ŗt'0jF8E)t8C @1 E{VBDfVH]먴sfO~DhΌ<"\ ?v|~)(CV46$Ef5Z4P $m_XL\j,2A k!'hMAQAQyvQ.#tWX1-y2$xd w dBU`  ɒDJP\aM. M tm $%tBa=BG5&K)K@ 9/S1 $! f]4'ItAԌ/H/Ɛa2P@Hk|P!$ LMԀ qCd:g`FKUM)}"Lhe< /HDO_2& $w|PpˊC4<nj1R+Z,e]kgHE Q)$D 3RVϬ\B%50 PbeQ!$8 B*Ą@G t yJF4p DGh1%dmHфdϘ hP]@'L>4 wbYc)ͫ(vz*AFT !,W!,x(@Ȱ@ #vg!%$FS h ](")XfG El"h1e $ 78hUkB#'5LU,;>E06Y"d"T<-RaE-@Q2_)SpbL{Y෴B53! JhǔLfrɩJQhS9zjB!Ģ!sҲ%Ra'zB`WO)L4~150Dӕa Yp@HW}ѨpGgty DM, P _--KH%Lg@Ԍ/ J5D1s5s0PDtQhCp@!,W!,x((@9 \H;"JY΢AՇaAX"(Z& 3&1!ha`³F0S  YDd2VўAaL bр6@䛪Ѧ䊁Z)3UXMxmؿr6e6!UC j ѨLmL9$hh  x !QT&4'.BLPJh"@43xIF` Mr!4ˢy<1jk@&Q $Y v@q9E&A i t`@?d@&-CР(19"ɊMt=ApYxC6 nA!,W!,x(H` n PPCXyHpg)KPE,fѠ4 #@Qha AC ΢E4(ډ `.0Op X(M4 x 1E3t`YDvj`h#(SCDњ*NE;urdl㌁a4pL "pV4P@5Eý hЎd<" Ek}z"Om(nY=FEA SJ4h@D3As yCS`'QoD@DIA$!QmH4H04(3"*\G@ dI M(l%&(\%Bk8@̈́hnP@ࢋJ4g 1)%&'TR42T$  2jZW* q@!,W!,x(a@ z-Dȱ#*b1(TiMUP™?s,Bd w`k ,'GD#  M.1QQbV UW(i@Eb52z5L47y7^_)5d*iFt^)46Kzr#Jy7f$d 1g,Pa6@!,W!,x((`\C+f9W,`2>q"@l &<)@,]  "(d`eє!R4 T(Q1X @u<0 Imhkh`HB۸ 3 ڝ6 &,MZ#E;FP nH5)68WL ,ajŔpaQ}I:$"wGM@`њň<Щ%`tyDds ǵC#,x l&LBь}8Fmۅ"CFƀ"džcz0c{@Oa"`j0cOMShc K4pP׹v1$!,W!,xa o*"F"&ZhA$@@"0`K` CȢiE$ 䠀0Fqc K:(: 4P 䳨(Aްç'Md&=Sնm* 9%hͬ!pIfxy%,*3Ϣ[ejچ*)TWEs&/npɆѣS)|&|-1mq(ڲZMmS1 m=є@3N@} WZMU,k{o4RF% |LV4F3XAF TCXHpP@!,W!,x((`Dxp #vg+""hЂ RH+0"iPɁ+- ᦅrE-̜(Th2pi'$n.#k(K)V9;EsNOl%:jZ;U2pս ZTTB v9(x ۸>pB4;0ڒ_*- !QʢC3Q BK($]e4I[7P™?s0o/d`,0,_JT"LJ٩gk K;c,@#D3qa@!,W!,xCa9 \(P#J\Yh1\1Y4h0tHҡē\xB!Тx"&%syh0☃¢!+"Lʓ\J&viDJH%r' M+HI&jh:,k e{,bK欶%mR됃G;f5+i  [ MC[&tRpXb :lsшi"g1]PY w.\!Ɂ*eFf"]!G̕j)گht@)(S4D!i8o!_Cp\Ԋx_w G0@04B@ D8t ̲4t%|B)J`H8ܑEb@fD W(@YP)FQ)Pr9TEQѐ!fM.2q IryZ&gwDcɆ$E,P DC@~0wiCJ6 P 8EwlYI\Ԍ/PUE[ƒm)t<~1) PHl 3k[SDL C4G4x2ECK x pBU(E H!!,W!,Pw\VH( JH1Š3jȱǏ ClHI)<)%H\4"M 'Fɳϟ50M̢)U:`R"<bhfCLN Sٳhy.&U4qB& \tuhkZ~IVl+^lP|!庍OqA@P @XϨSUh(Zh(X) 3ptAc{ ]檳V+eXyEG>D 2f$TLUO3`RpbxyhQUpig|T DCKf D| tR_=1̤/ C44A,2JҘx<aHMea-n%Z [Z#%҅@)H&B* PRV a@@ ADŽ@o(At)Eum;Ax%nH# p xBwB$-A)g4 LxFcAqD̤_IVѥVSiZz@B(J4HfizP%"'N2_ 9@(ArDcAmV,FV C,hQZ-BD 駻 0F4L:V ْe" RidrjGr4줟u o40$36GdAg3AZ|DOH-tc)mQTЙи&NLAa@_āRTF-uFʍ]Y6I{unP6P`1*BO(t01NV!m[Z˘iECA)ByWgP,c4>^s/(K,P,.Knȟ]G@@@F4d8$Sa(n׳޶GPd( cxpI,6O,Esy /""5h1킅 8 $} 2]+ZH&#miKhQLjՀ"L"xpFd RC| 8'T(GɩL*Ud!cIZr.w^ 05$b2d:Ә̌4}gNH5nz"D7IN3L7 Mu,;xJ=_Dπ[_H@RЃ:TK_hp4U  -#ͨH=+H HHG ]hhAdZxIx# b* DTy POՏ` @ծU# `ѲPhH׾ծ~ _*Ml[ A*YRͬf7z hGKҚ} %j ZOQ,jc|mk[,;%\r1əb[61ϥ_7 RSk`4"R)(^쒰f927]̫Dw}1^mYuosr |؃K`ػ Clz5KbK: p W9zcvLh^cD7#1lXHVG2 mz?."WxIf@v9]r=d/p+3n.#sYGdegc>:),68E$N̳=ɛB3fW(Ki3;fElPN3iL!A]կx=_qxY ovvf[gɚenqi J둹S ]><8jElܴ'tZ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l %H*\ȰÇ#JHŋ3jȱcÀ!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,l % H*\ȰÇ#JHŋ3jȱcÀ!,W!,R6@H*\Ç 20ŋ)R1ƉCPɁ$4J-sfȘlvĩ#ϞXs(іFL Q(SEBE*uҪbtkW_:iYg5vh[oF]r[7@|W0Ệxqt7a !I ,C ,F /<[ abk[HLhŎve vRᥪhʢ:3`ѥt'GxdpxY &б[kw] }_|NL\4 X[e1M5_c_fC:Ub_NL4"zAYO ' -N#rwq;#d!,W;bubbletea-0.27.0/examples/tui-daemon-combo/000077500000000000000000000000001465647402200205145ustar00rootroot00000000000000bubbletea-0.27.0/examples/tui-daemon-combo/README.md000066400000000000000000000000771465647402200217770ustar00rootroot00000000000000# TUI Daemon bubbletea-0.27.0/examples/tui-daemon-combo/main.go000066400000000000000000000056311465647402200217740ustar00rootroot00000000000000package main import ( "flag" "fmt" "io" "log" "math/rand" "os" "time" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/mattn/go-isatty" ) var ( helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render mainStyle = lipgloss.NewStyle().MarginLeft(1) ) func main() { var ( daemonMode bool showHelp bool opts []tea.ProgramOption ) flag.BoolVar(&daemonMode, "d", false, "run as a daemon") flag.BoolVar(&showHelp, "h", false, "show help") flag.Parse() if showHelp { flag.Usage() os.Exit(0) } if daemonMode || !isatty.IsTerminal(os.Stdout.Fd()) { // If we're in daemon mode don't render the TUI opts = []tea.ProgramOption{tea.WithoutRenderer()} } else { // If we're in TUI mode, discard log output log.SetOutput(io.Discard) } p := tea.NewProgram(newModel(), opts...) if _, err := p.Run(); err != nil { fmt.Println("Error starting Bubble Tea program:", err) os.Exit(1) } } type result struct { duration time.Duration emoji string } type model struct { spinner spinner.Model results []result quitting bool } func newModel() model { const showLastResults = 5 sp := spinner.New() sp.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("206")) return model{ spinner: sp, results: make([]result, showLastResults), } } func (m model) Init() tea.Cmd { log.Println("Starting work...") return tea.Batch( m.spinner.Tick, runPretendProcess, ) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: m.quitting = true return m, tea.Quit case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) return m, cmd case processFinishedMsg: d := time.Duration(msg) res := result{emoji: randomEmoji(), duration: d} log.Printf("%s Job finished in %s", res.emoji, res.duration) m.results = append(m.results[1:], res) return m, runPretendProcess default: return m, nil } } func (m model) View() string { s := "\n" + m.spinner.View() + " Doing some work...\n\n" for _, res := range m.results { if res.duration == 0 { s += "........................\n" } else { s += fmt.Sprintf("%s Job finished in %s\n", res.emoji, res.duration) } } s += helpStyle("\nPress any key to exit\n") if m.quitting { s += "\n" } return mainStyle.Render(s) } // processFinishedMsg is sent when a pretend process completes. type processFinishedMsg time.Duration // pretendProcess simulates a long-running process. func runPretendProcess() tea.Msg { pause := time.Duration(rand.Int63n(899)+100) * time.Millisecond // nolint:gosec time.Sleep(pause) return processFinishedMsg(pause) } func randomEmoji() string { emojis := []rune("🍦🧋🍡🤠👾😭🦊🐯🦆🥨🎏🍔🍒🍥🎮📦🦁🐶🐸🍕🥐🧲🚒🥇🏆🌽") return string(emojis[rand.Intn(len(emojis))]) // nolint:gosec } bubbletea-0.27.0/examples/tui-daemon-combo/tui-daemon-combo.gif000066400000000000000000002205331465647402200243470ustar00rootroot00000000000000GIF89aX! %%%($:))(,,,-.%//.00&02,1002223-W4445657778-&85x::::_<_>)9>>=>h+?@@;$A@?B3%B:BABC`wCk9DC$[IE[L4[[[[7]K^^^^_Py`e^bbbcccdddedcefWge hGhO>hEigdj_jjjjk0kPlF$lllnnnopop_Dp|]qqqssstGYuuvv[vwcRwxM&yS*yDzzzz[{]|S7|h|VӁV)`qa;x79ulNr\nsȍ/]tʘ{YgqJH-W0ji.-#X[vYq~S}F:}5*n YER/[ibi?l*侾J²ŔXŕuǗeǢ/ȘF̐q.M ȓP+2QւJןٮۦpëݝʻlQIFWO恆FҮG+c/:H>'Y{)9>>=>h+?@@;$A@?B3%B:BABC`wCk9DC$[IE[L4[[[[7]K^^^^_Py`e^bbbcccdddedcefWge hGhO>hEigdj_jjjjk0kPlF$lllnnnopop_Dp|]qqqssstGYuuvv[vwcRwxM&yS*yDzzzz[{]|S7|h|VӁV)`qa;x79ulNr\nsȍ/]tʘ{YgqJH-W0ji.-#X[vYq~S}F:}5*n YER/[ibi?l*侾J²ŔXŕuǗeǢ/ȘF̐q.M ȓP+2QւJןٮۦpëݝʻlQIFWO恆FҮG+c/:H>'Y{ IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6ppL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^) !,W!,m\ M @*$aC xbŠ1fpbTݴqg Ox@&f1cO<  !,W!,zP H࿃&,p‡6Q"C-ĨPA= %FgYB*IJMۂ %ʆ uS&?ݘ}4ZY7;,&S jO u3ᕩD݌Eʱnf.~۵rfi\ b/ej[e-ĕ,&"dƺ)%j,Ri=2 !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"G$H+ &I3k^)0M\[7jHRy󏶢F>Mn~rĉU+FYw޼v#O3~۳X%v@F!,fF={f'ĺQU $(З)`NY/ !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aLsk\å ݺXO?-zcRm(ԁRb|tjL]R|z%T}j 21H+C@NAL4mvyBf[q`&49c\>iVxɀ!,W!,P H࿃&,p‡6Q"C-ĨPA= r \>l$ nR$YLE3A,NEd)T˖i[TPI sS ufA\jEaz%lFn;sXL/GjI0" UGƏkUTU'fuc׏$eI2 !,W!,W!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ}X3ED݂$2L5e 8 s gݺI+4&G0RKNuC6ATIDM[W-U>r]ҵKZ V-Q KSnϴ.vX#ݮE:̘"*0Lt)jeaXum !,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,xř>ĺ֭۳%I 95&lPQW `@[ AvYꩭWR=϶\'#yɣybg"%{Wkl<.l!,W!,P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,Ȁř֭KL 糢݂ %)jt*Ȝ= ӍW>\˖Yi{Kש,bLں!8aB`gݺg7dzj8@ +UTU'fuc׏$eI2 !,W!,"P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,3,u[7m 8Oj|2JR`H03ʦ"tU`17%4Sc>'NZQ`nl\_1$h7i S!O00K0pb5c̔I6]ɀ!,W!,W!,W!,0P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.a,8!ř6֭HΜ $)Yg#g)Hz 2yZI7m`1 XA =R\-X q[DCr+%3 xu-<%( JOmwcF`BH< *(ǘ)atQk]!,W!,>P H࿃&,p‡6Q"C-ĨPA= R$Ƀ"GL)?.aX & n J~$(--WuQ8 RKi# RR\A&&C7fM1o΍pE/`+xbh2+L/(S=diM#%Z5Ȁ!,W!,W!,W!,LP H࿃&,p‡6Q"C-ĨPA= R$Ƀ\D(tvɘ3kJ|M=uN(n p]C3uӦm6#N#LU\Y=D԰ {n a<2ֹƝvCijC"I^h9|Mݰ"H *\ȰÇ#JHŋ3jȱDžCHɓ(S\H-cʜI͛_ɳϟ@YPѣH*}HҧPJetԫXjeZU֯`.UٳhiM˶[kʝKaܺx󶽫߭| <+ÈN̸Ŏ#K. y+cٮΠC,4hͦS7F5a֮c-6]ڶs%w]ܾ.UƓ?EQΣKNسkνË7?1auh [TnTȷ~`1GاH~ -э4ҏ(UT}w @ȐVdHц<Ehc&bo~Mj 2 }L7 4%G`0%DL>T-dC P@S1 %cn'E 5 3 M3"}ذ NG!ڔ p(M$J"|4ac/d . %p5IsIqr#Eq(BhCAjB*M!* á%yP*Hcj$z/30{ zJ1i ΰhKjsA kZ45FB:n69d[ @DE}tAط#dd\}4;!BjXpjP, όp*nf 1P 26\}$܍)wRP}pH*ty3\{ vB ,ᶚ'P6H. 7B }+B@k_Ϳ!qҍ1 -Ƽw؞I7/ շKEX"5t^ڧ'_bG??v/Q .gH*D6?wtBCOP"<\=~Km >uSb\;A`y}f0npB @po 5`UQ <`"SHʎ.!Oއ)CȻ"߱n"EQP!9&z"5,:8 آS P! ס&RpaFbcX _9yN  !bGġ]()Bc ؍ &7ybhXF=ćiC$.d*k!7:RkZA:mSKEl n4.KH/I9*VX7 H,B7xG]*d #Ԯ,`Q, , P^ɥt}xQ!$ B̃C %Y: n"%-uNVfjHØ я4-aгNndON{?2pHȑ-( I( MTEчؑik7ǫ!U"&II <)Dd>)l+UbU5 q>zph q} F3,X OfC(`m HT0ɲ\0x^a>-ijZk%`5$e a}n8D-3: cJ8,LV3 ^`5 Hz6^3vuag& p!# 84Yj탋 , b\ 8 Fᨋf0p7Wd):H#?xȍsn\L0Ʈ*3R@ !1+2M.3Znkcmr' 7"pev;"@ ?ЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{@CMy667CнnuӞ^Rwci)A-oxozCԨ Áp Ex5>qy=?qxQ^=u+<",된 yЁEzeCѥt/Mlյ~ug]1Xi/m߆ yC3w;;w×u|q{ x#wxOGD|c$!u<7z֗^mzai{>!='~D'A[_"_>C$~%OOϿ8Xxpvp p&&poȁ*7r4s#8sg7gs5r*؂1'r%X)h+$x>XbudAuOuguIeMȄDvQSECxORUȅTb؅RwWygxyxfnhysu(oymhtȇl{hxh÷Lj爸׈8ȉ؉~7~XNJ犧eHh؋8XxȘʸ،8X؋ Hp ؁(!HhX옎1,ȃ(?؃؏yisd i ɐ yu9ui8臆Xh*,).x+0ْ5)|ȓ蓞(HF |Ƈȧ;ɔ= ?)AI(Z\e蕷(H[i]Xlpr9tYvyxz|ٗ~9YyIٸۈ蘑鎘 wɍHiXyyɚ 1cב B9ƙyFŹΉA'Y4968 7ٝ9 9晞ŷٔY[IQISiUCiEɟG )I9a |_ce g)iɠ | jʡꡉ":$Z&z(*,ڢ.02:4Z6z8Zə陝)?JAjCyE ȣK= Oji)YJW]ʥT_ajecz ٛ̉moqʛ! vx*yڜw~ʧ{yꩇi≨穨ڇ٨z*jʩ:JZzZꪠ ڔ}j:}꫻* Z}jê9ڬ:Zzؚںڭ:Zz蚮꺮ڮ:'z10j}&OfaK</ u@KQkaQ <0! $ , ۰BasA(o|wBK%H4Q6}L+OeKUKеKpQKH0e0k۶o{g>0^?PH=\%\JvKUw 1{a^ Oൄ0wkhX е k'+c? ۵zW>O ??c`[w=@;}{O׹l[. x{K@pɫ[`;s܋wk $@<B#g{s+ <};^*?1%H% K&о8Թ&Q[}-zP R%;'כ> ,8;==`B[h!OpxտS&8J|_|PVOg <4 ǯk4sK$۲+Kl,\J O0^l|Clla\k\,!c#01pYtŸ VXA@4{'OP ;1+̿$͜&Ь!<{ qOO˒= Cm , m3=қ=z̾+% .=pT=W0R-PM<@;\Bl }.]Yi\ в=|͒K{{; ظqgҹ}!w׏לms{% ZQMۭM %Ԋ^׻Î,k4QX| l½٠Eѷܟl{'R Q]U p ![%񰴴~Nh-&Bq]@9^" Ƕ>!,W!,W!,W!,^M8PA8P@ bD bh1ĉ- $ЯdI&K@2%ʔfMA9G} !,W!,]L*\ȰÇ#JHŋ3jȱG;ɓ(S\ɲˍ͛8sq@~<IѣH'dҧPJPTjʵqڵٳh!G3۷pkܻxԮ޿c@X @s,3k ~7v %ͺ5U|uM6@ͻ!ڷ'X퇼sE0=Im 0@y T?Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+ c^ ,3=P T2:0d.| ;093=,98sA.!p%vvQF M7t$3%`",` \M H@%M1N;q=S983G, @Ȅ-62 XD33B3Gqw3Et KtFu\1v0T' M45K8t޹<9[;L&6$H۬_`6'. BI Hs;J}ウd633?%@'ԃ_Sy=SSN;찳NB >OzEgwGP9T7W3Tm)PHEH $ #pb<{Rʗ5g$ א l!v6B DP! ! @JjΌa"8 d;B̠ $ݸB ;, %bLD{Q8q̄hC"b!dp5"ԏY0XpP#'i(j㒗bB&g 3lf`2 Q!HFx̐AJ$%ƱK)OIpғe-+rg($ڈBf03 dDHvM@ Ґ׋< QeZ?E4~1l [l"XC8O3F'K6&GL #B.0;Mkh8gхL3cF(ǎb I@(J!o3C(gft.58 J<<mNU:3BD'daf,6! LU7Fca8af}@HyHfVH `uc 9,C ܡafH3*H̤@0̬Bd2IEnD Q6Bv#[`#@c`e` ,afc(p - H,وXG3Qrx /xd88lA!P 2C^gE"Faά E7&0FBnp`"DfeYw6Φ1@ `ـᢊ0rs) la@Kn8J$Q XaPb/ #];Hw*;ZQuQ_BvËq7 XFDP.0-zv}C20dS C@Yt3F@@fXAL33#@k:T"`-Zʸ;諝@5y!4Ư "D #l`lB6a k5 y̢=mڠҷHQcD5U\y٦2ka 8DN3ܱ]@lYovȻnE'dvnw CC5n'D. g m3*lPf ` v'B <"H "|A >k="0, |!yH~-ݐ $H"Hh#mfO#7t_1vzEv+$ a*Bn`eC 6d`χ/ х 8 G}S03Y0@ԫ0wx]̰8d}C`dx`0A9 zGuP1[qW lzyWw{ `{g8 `ڀf]7< Ap!X}G- ` SPC+PD~S QEp~8E x̓|/ {ЁAb${ ;P73 (O% ,@ 8x8}sTpzw ppEz3SWO'18Wxݰqh  ȋ p r3|̓ ~Q?4R3QW q ( w8b3C(ɣg` l#@hԇg{`86l莛&iHhhӆg{_6ND9  #F@y<83ϰo `m` 9sB5 BÌP@̨ `iY Rtw&;ǔC'rS`Ì݀ .&XlưL,w pWx^6Tn~R)n 1l㕻# 0؏I֕3 OBpGɐ E_e` 0(|єy{hg*04<`Yp*xٚH`qQFvx {` P s$)d+a0@Aq!,W!,_tX(T8p~,\PÈ6QbF=~t@M R\SL1E 9P%OgǍA"%Ԩ̊C_*RSJŨU!tf@d@!,W!,_  < H ~~04_?  Oĉ Xq`A?8Q"Ē&+cp ~d@?;2(<0 d(SN3fOeP kFff*@Z 5ޠ,0 !,W!,W!,W!,]LHPA*\ȰÇ#JHŋ3jȱcÃ=Iɓ(Sr˗0cʜIb˚8sS'Ȑ= JßF*]t%ҦPJ&PXj tׯ`av KيU `ZQgʝ ۶nE˷/ر~ xE #^Ɛ#yU#c̙ΠC/,ӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix2{@ {̢=#:̑ԙ@%3ϧJΨΌa_\ʚs=SϨc3W hJ\bI$pBtM*E;-F XJ>XGFR-PD KEӎ:Z- MpF`{B 4C PdJKW/--A,-k2o@%ݸB p5,y "bLDo%(qxhé b dh5"T$V0X`P% ghi7A&g 33lf0 Q!H+lAĄ$1%61뫈ÁЇRb)bg$$ڈ@f -Y dBvM@ Ґ֋ Q"ÚE4~1lD [l"P7ǶIm@[vCՐ"1!8d23P1ic r PCZ?˻ 3XpLZ*L\겙\`FX7ύ!@)6TtX{@v1ef2̇ ,lAP򢠶&d &`q A@* 0 kCE >d$.3f*[J:m\ @014PuxA% ԁAZڐP#3MJ4X(#S .Qf$d @qSmD2vӜB|:r`یt$xC$*H u26*-Ul!i7LꐨTZ H,τx 10|XhE*ct @p օeռidJρ#`5xPG`@ZXfyvUhF"эR $HkŹ|a14wx<ъ" j`D$d@ۍ.Vj$b 0:4 .pyI,"1|Ў.6fP򌬴PPmlQ~TZ0EY<cXG|w8 $T#XA a0RBH@V?YqN.| 93+7Q"ș_\KwH jxP a/Jhi!58{C%w) 8 ALxd8@c&3)L ?Z cwYYL 6 ۅHw/ Ԋk ? HS{"6,80%A kC@J Ǟ Am .*pǗq^ luA}rP9B:TƊo|O!l0n 9Ilga\9-N#/dF_! )/WЋ~t p`xȠ;) -pG,98pȘWkzڅ6:gG,O kd %6rwۺ1fd8P*ݜRaH"q)x7FDI'"n,Ȃ xW  %I77AjgFu&ES6gf#%͕`|"㲻َDнd ږ@d , !!%%AN@X2NΗAh7Qo|0|a3ґ gP@>+ /H_R}DzݠE $Dp (GQ@ƾee16W$UH8(N$򪕍 ;J C׍XP6D7J1+fq [E a#i|fDuxG+uYaD`!vU)d7e$ȞM`z3ɹ$X.@^ƏS4&H0&%/XA1#@.1r((i]@}tLhB6&<,n/ uzɞD`Q}:h[0GIrCJ GQT)2Af $9,[MͅEs HiVd$h)~p E̞@Hmd/˓ЮiEFhfq)NK ⱐpE $k1Rz'HP6D;CUϫ b3R$8(J r Łr*,e&Q.~ڻKh"H4`5ҞjW&D`(v {lx*B鍄+"<{=KO$s-!b_)nЪ4o}_x!XD` x3a LW.jIc*R\Q#6,Nlw0LD~,Ce(mEƍN|-W-r`sc"C潢6p)U-%@ PACbSBW*S`*\0=xt]R6(݊L,d*w:Zo0}O?z]czW\"2oh(+\;tQ8dfyS= zr{%Y:lq' j5 a(\0ΗŻI.pqC "/1;=7ZBv F@V 8wchϡF$7vS17@tCY">~j.]a4ЍpGw{R|w_Dz+P:6,C3P21xg^XQ6`6X$hQH… 0_@'NRFxH>q#G`@PXZ[hW\b8dXfxhjl؆npr8tXvxxz|؇~8X!P `! vX>1]_wP~ XHEV7 ~p `wXVd5 i `}X_`&p%@ p'h +^XV qx,dx 8A$ fp)tk` "P Y%]{7gGp  E o `LuZ+ ǰ ,)P6i`EE?F0 ,9 / 7D7Z* }t @IRd B9 @p4ɔfnt{ҠPu+ ϔE0e, `؞yr%y?F+)j@ N&  渡f=P[_ 0  +c5ɢ@zE:Ju^3PR:TZVzXZ\ڥ^`bJ- B' hcKv@t Цoڧ1 ;w /4IV: cj A j[qZ?*Qz0Llwp/Щ'ڇh dp0 d& Lwjp j/7-` ko,縅\xe\7Fn\ 7'R!,W!,_  < H ~~04_?  Oĉ Xq`A?8Q"Ē&+cp ~d@?;2(<0 d(SN3fOeP kFff*@Z 5ޠ,0 !,W!,^M8PA8P@ bD bh1ĉ- $ЯdI&K@2%ʔfMA9G} !,W!,W!,W!,^ ߙ ZDp"BQDA(ЃF$ $F(S 3xFЋ0 3 =huLhLh0~)2@وh@%pl€!,W!,_tX(T8p~,\PÈ6QbF=~t@M R\SL1E 9P%OgǍA"%Ԩ̊C_*RSJŨU!tf@d@!,W!,]Ly#JHŋ3jȱǏ CId$Rwox`ɛ8sɳϟ!TnQ/)u6Ч1TPJZUW+jzJ3 ?\dSg 0vI0TnJԒ">,98pȘWkzڅ6:gG,O kd %6rwۺ1fd8P*ݜRaH"q)x7FDI'"n,Ȃ xW  %I77AjgFu&ES6gf#%͕`|"㲻َDнd ږ@d , !!%%AN@X2NΗAh7Qo|0|a3ґ gP@>+ /H_R}DzݠE $Dp (GQ@ƾee16W$UH8(N$򪕍 ;J C׍XP6D7J1+fq [E a#i|fDuxG+uYaD`!vU)d7e$ȞM`z3ɹ$X.@^ƏS4&H0&%/XA1#@.1r((i]@}tLhB6&<,n/ uzɞD`Q}:h[0GIrCJ GQT)2Af $9,[MͅEs HiVd$h)~p E̞@Hmd/˓ЮiEFhfq)NK ⱐpE $k1Rz'HP6D;CUϫ b3R$8(J r Łr*,e&Q.~ڻKh"H4`5ҞjW&D`(v {lx*B鍄+"<{=KO$s-!b_)nЪ4o}_x!XD` x3a LW.jIc*R\Q#6,Nlw0LD~,Ce(mEƍN|-W-r`sc"C潢6p)U-%@ PACbSBW*S`*\0=xt]R6(݊L,d*w:Zo0}O?z]czW\"2oh(+\;tQ8dfyS= zr{%Y:lq' j5 a(\0ΗŻI.pqC "/1;=7ZBv F@V 8wchϡF$7vS17@tCY">~j.]a4ЍpGw{R|w_Dz+P:6,C3P21xg^XQ6`6X$hQH… 0_@'NRFxH>q#G`@PXZ[hW\b8dXfxhjl؆npr8tXvxxz|؇~8X!P `! vX>1]_wP~ XHEV7 ~p `wXVd5 i `}X_`&p%@ p'h +^XV qx,dx 8A$ fp)tk` "P Y%]{7gGp  E o `LuZ+ ǰ ,)P6i`EE?F0 ,9 / 7D7Z* }t @IRd B9 @p4ɔfnt{ҠPu+ ϔE0e, `؞yr%y?F+)j@ N&  渡f=P[_ 0  +c5ɢ@zE:Ju^3PR:TZVzXZ\ڥ^`bJ- B' hcKv@t Цoڧ1 ;w /4IV: cj A j[qZ?*Qz0Llwp/Щ'ڇh dp0 d& Lwjp j/7-` ko,縅\xe\7Fn\ 7'ɜɞɠʢ<ʤ\ʦ|ʨʪs'\햐̗\ɳlH3`2tIbÕAlv8 π $pļ]@G'!6D<?vV  J&AK!w=)#2_{^=|Ĥ` ܀mϠ0釀ШSMp3Ӫcf꧟ׂsI^?^N%~r_.μFtN:~ Pܺ I^<ͣ_OdwcOOϿ(h& 6F(Vhfv ($h(,0(4h8<@)l p'1G ܐ%@sL9Sg@"м6 ̇ d0tI78T,`C^DCd}-mIQZA/4S`qÂF*PC د kc B_` Œ"*[7G2ؐҸ0 Bvi80 FzB 2'".µ DҀzQ!E4~1l`G [l"&CIfx0濙#1V8d 3p2iiCz~Db P#S@`GH! @3Ȳ+SL2H@ ^G4 !@)f6Tt@d3M^ e$35ɉ ,lLf򢙶&d jUl1!S}h 0I@'v1!n!|Hܴ14dʈмu 4L3u2C ?!<P{zd 2@f, {7ѐ%djd2NpW?IAh7Qo|H=j3ґ gs!@> Sg7ӔiD`gD. L!F1BVp``:3iE@IЁ`j6 ̫i@yցup9 qx( dJwaXnɥI$Q5*b/ #0X;ִޮ;ZQ'E.aH[C.o ҹN(C1J\ T%P`\X\`fw&VLb 2c ˫fZZPlm93bE1}~3@/Qq RHڐj!ju'bL5,g7ɐ'Cڐ95\)q7nڠF2.b0Qs0B2G9a 8Dpbg@cR7)Ǘ! , 0UFr/FM^PoM@)S!caZ ,bٻf<؛m6NSIppP/d؇;FnZXPC`< r\Of>7X!yD`v 4nlnX p#qGǵƮq{_!@;`2/p\/ps67(Gi )6?U;7p'LкlLb ";=лs#Qu@62qL0{T77}``|Y ,R  p7@kPp@}5oAC6Ci K'@77 thj Q5t k; @N&@@p'PuR~;޺Ҵs`A,$QC 5Y|aB Ԕ F&KG6;- Ů `Z$aXݠXe2 c@ݣ bEMyM!;zgu,F B M# p)0O/v rƧ+kɔ M0L L`kY,ˇx˻L) ` ͐ ̔ $ pkOH@c\c@ `s p LβHqV{HfcK& ps P nPEɲp/ x˷k]=BB bSyEG|<Q3m F@K=<ZaJLNPR=5M՟o s06 `\˽*Eb  P @V uCX/.bx-Ya`0 ڀ հ\*=o=0k;_ pۛz] EhJ0 [p2z6}7S785J ט}M hHx{d&Ԑ[v`W0xYFP p  ).=v\oF@Tc`)KjoZy)`At+xpg WO[Uid?_/ P0  /ob0%QQy9`!YV}+ 0Q*2 B ffh`a&<$XH@B >QD-^ĘQF,dnH(ifL(BTbUUc@RcR a$3UP9V0YY@[… F$ AdK#}C+$ 'Bl8AÇ xA'&~Ɲ[ u .׺ڙyb"DX@㇄ $\`'hNz\hزƟt+7#$p d `B H` {C?\ʌz#fDDIq:&~{Ɔ?@H0"H`"2(2%T'A2J)%cQ3,9An%ߴ7 dX @ dH~! 4)ЦmyFgf\P]iхXbX>`p"O ~ D.`RxRPYgMBOIJT![]@B0 ‰.p 0$S(̠%JOZ%H)n sQV ~k7:>-Wb4 TpB04$$ Pe rx)39iHDQhⱤ czd0>Ka'HaA ڕv8bw(+C!/߂bbL؉R`R6HCŖ-&!4*vA.8-~Ke-(.HX i/`! 8p!'? a(`Z襟RP ZPE, @JY `ŜXIЂL@!,W!,^M8PA8P@ bD bh1ĉ- $ЯdI&K@2%ʔfMA9G} !,W!,^ ߙ ZDp"BQDA(ЃF$ $F(S 3xFЋ0 3 =huLhLh0~)2@وh@%pl€!,W!,W!,W!,_tX(T8p~,\PÈ6QbF=~t@M R\SL1E 9P%OgǍA"%Ԩ̊C_*RSJŨU!tf@d@!,W!,_  < H ~~04_?  Oĉ Xq`A?8Q"Ē&+cp ~d@?;2(<0 d(SN3fOeP kFff*@Z 5ޠ,0 !,W!,W!,W!,^M8PA8P@ bD bh1ĉ- $ЯdI&K@2%ʔfMA9G} !,W!,^ ߙ ZDp"BQDA(ЃF$ $F(S 3xFЋ0 3 =huLhLh0~)2@وh@%pl€!,W!,W!,W!,]&@\ȰÇ#JHŋ3jȱǏ (S\ɲ˗0@d̛8sSL%OJѣ)GEʴӧDڄJիEׯTi.Kٜx۷pQmݻӲ劷_bMK0֭ +^qbƐ#t,喎^Ycf͝C~HykϏ]fۋ?mxL 8ou(GμУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vh!N(B)B0tBhvFpG9~07[$@7p|"Ѹ(P.iR70mB~q(!|6Fh@7pFV P@*fMm(S,ِ1kV&'"Jux'S LP@dg|bO! H,$(#L81Lj*E %H-  @+l#8Oj(Q=M! d J L#4Sx$L `F7G"p vF4h;;O>ガ+~ڍ4*, LV;ģ;$|ʌ<@ T۸CN=@Bǧ$@ >CrhBľ|L\3N'AB88Od*' W г?x ht/M0MmWѯ>s}|Ƨ.gګH7cG|*M/ٍm;{-NV8@1IF4ƾ1:.!C[|@(*Lê&+7uy?6迕Vbo$K Z!L d*@"X&؁t@AHv;L(hu'*5BB 5a zKh@6pwxs؀I A2.!52-D`d؁ d܁ j8^܀8 xP,nrl ,xXpP$&0!l` Ϗ@FI "sU@*XgHP 7 xI&`#(ŐDb! ҮS`(Np:vd:ìm) ,xFCbX\I.l%;:ᛟ CXÌnB3D:/!$s @h. h mLقXXk&0# $yWz*҆Dek6pn"-F!|H2dL=mdz:!UWxF@]V7]k[KD7Lp;A ?ħs  @RxB:"-iĥ Qr.mLp!#pD| +6p# 3r Mw(͐^t!Denh.3_uR<8>okԢ$4m9 б7aZ&ސ>*3-|q w- <S*dtWl t SB]™XMx8glX{. tܶ6t9S pn|>wpDφ+ĎMXzjgMbư eƹQ = ;Fuߟ+Za5.pw pݰ8r"e# ƁK`b1v(`Nk<`ؠmG W$}YAuU S7WbܰoqҠ t m,N8 2)yB Y`O?.."*.&" @q~S0c8"`20 @@ P p"dYC0 0E00a5gB    K`p9!?`2W8LSRPCq)"P)w%10F  HLj?NH`,,,z?7cTK <$}3;cwQ \3]f"B)pN` q*Q`4pK6~ r&6j`#.6Jaݰ *)**  N~FB%T6[e xRYN) 0< e0z (u[28!s"HNЯB0*))誦:es<P996',r9 S"P1v*z,Pphگ䊬/:;zB;:袳]% /F )BDb@2%<ģ(eÃcs Qӱ&i)U'0,@R@y=S?փ=Ta>$`  0`0Xѐ 4@:A, PK% 552EUT%Y"E s 025* Qy| PZ ɞ͐ "RvGqƐ(!3ETFÐZZkm.`a6p_9_(V`KEİм<ǖ~UF4` ZzW(*8@m` :Ѽ0 x8 r4eׯMC 2@P{|\HG >"$>g/* 8A/+iJȀcM$@zA+hb?D`B!7)45p *=@60 07A"Ÿ&5o`3d )@Q7P!H MIjB%7`"5:$B̀'HlLT'p&:p||F.4 <8 @ȉJ.4 ʤn'8lIkԢ$4 63[ TxJS)N6Xb <-[#xh$$!`K@F7ѳ}QLK ,%6EЄ' Apx&D $'"nci7zʀ^Ƈd8"a [fă&xэO 'ilgC(ncGSxDڍ6j ^A7}f@F1`ZiUyCpA?&6BnDV"VC8 |8G2H~yXNڐ`1hvlk{"$pBaCJ |0UjߐЇ$ P%d$l!lHÖ41rcHAt7.18QJ@`e0GhÖ3l-稤# G_ EhC@ Ƞ-Ƞ@8 ]{@ c5bE C~]*b8C(RQX\)h&q/uAFLcJBH/pf$7J-0Q:a FHA-.l`Xy)s9% + fGMRԨNWVհgMZx  "hk(14.Ȗ[18H#DQBbE58!Y.w!t!Pd ! p0`3 x  |o#1$,|"آ@D`̀6<%~@6vf3 `!~iy,Ӈ }H` W TaVb|6(X Z{~^Øq[0! 4 > P' `d_}6 ЯDg!<20#Nu@"@ .pQ h("kWp,cˠg|7`; D ؼA ,pNӳ)t OD Ν[0`` "!Oۯ7kD1O0ݩ A԰ p26 )0o ~60A (`Hp[ 5}Cq- 2N<@ GHt)pH*p[Pp%O)O!& QUQ2 "4!`yB)pN` B(Q`4pKv6MX qC1{x 21h twvN vH 2:@lq$)5"+= E4 ptK 2 r pgH艇 eDvqra%ȀNpB0*))nHAXh L (x p/ER pp8׸V0! B/ BAxa4x +ר)uYV2Y W=6:ҐQ,f)?0,@R3ie@AUyYCm3 `9喢/z=s}9YyiG 0cG Ӓ$0 s}00隡 cpi9'0i ` "y}f=E0ΰpx<K<1B` vb 0)` 4sމc 6$g78E 03p E0ƹ gϰax ΐ _*QGC4gR!# ѐy@ Y.y7m`FcY2#`27b!/$`  0`P.ѐ $! h%\.P5xj3xj(*$d%y // ~  Sg Z ΀V!Qc +G>'*TftE+A(؀ihc#bHpyD7$l`' [ tϰAsXXpN؀($ E @@5e@: _ȀS7F/P5奱0(F1|3"ň%R!Dd4ɗ4^`$$#,!f`DLxBJ&%%xp@Lp8Dq]n֙9t*F!t~N H@@/`ZhYDCrC@ C"F<"C'ҡr N`o!*\K_ B 7M%2`8 h0rp<>HJB1/eC\(*Q*d   h0 2hs!4̀ Oh^Wv @~B l! *0 0`; bPN/W0nmԪLD`'Ѐ$ f@ &!Bh0TC;6 D  $<`(4 ^BH}ۤjhJa4bH0Pd D   )YnBY'ƒ" e2EK fEH':V[7O1D,dĠOE0NK59l`ޚ/p?m0#ZxƊfnOr^ @[d'?0@ ,@ p9*)  @OSiQ@B%AWNH0HBhp%ik$>ؐu6224![j"@¤5V*p    xsʜQ!tow`"g%` 7d\.S?e;.pJ'!N MF|)@ XpCߺhD@ !@ChN? HX*&(܏Q (A7? `0i"J@0G)abUQ)tIS@y/\&NX2gnH# )焮] @lRHP [=zGd[M) YK$J@ T ' p@bc%-6;Џ#|cI_' f{W/)I@%ơyo1s¿%0PP'`pyxMEP~Xh G~%ʡ3_HZ!w2"̷! `,kp &`u%C%VhSnS#{+3h }`P pvD:_s< '06 FJho 2 MO4R*Zڪ=78godh !0pp {@R >"2-dR AԇIW @ W)JO"+/ċF5/!pp p(ڣ!! $ mG@ ۺ :SeI4MF0 gxF)-`zp`7*(d"7 @!xٺ5bH9 wL`0<+&ؠ!GIAg : ׺[۵`a.i?-BUr ` {`kV3"&O O6"s0{0ʯ:<fҷ p3AG ` ְ}Tf^`5btKRtњ1+IKW@  kP FJOcH'VZgRsfwcP0t pW|JZ2A"ʞb;mֲLdM*4G Fpˤ'R7°1&*,.014Za au4T9@yT@:@|[4puױ(>? W٘ ? y„ 6̱ʂSkνElSǗ ,[ 'Bl8AÇ  ( &݂ 6t3Dp5PRȕ|\ PD4 A$P,5A$ *LH"n$^DtH0QXHK.z` H2hL6pi#|cPDMHY"9d- $JCd&َN:c (b9ؤ=Iyθ842#, 0vC<1Lsp"Y3ƇYYs4.m\Hlюqߔ8١s$$iK @0F6Hao#dG;uE-J@ `<F W(Ad|a %c|!0+"'DxF?y4xeIo3Yd [@T,Q.E4~1lGP [l"P(RUZg4"p ,lW򢯶&d fpd"t \0 ;³Ah7Qo|㳠l3ґ g!; #2cM8vK܀t/ #g;iޮ;ZԆmXbjt{mVE1}}3@H2ӸT̝6b@6qrĢ `_ģu0@"8/zx^L4O5nIppP/d؇;ƋXXႯh @SG) х 8 @ xS0F,PKSucZ rBļTaI+P61ՃqCv , l;XAhXˇ&;P[D@o diNQZu@ mE4{c+aB:T bHE8 Ъ7AZ&#EamDn H@"t؃-2QLdb_x$lG&@ =7]d ~NOx)p c2@,`:>c$n[[j/b],&`Ap @&QPBt`<4D1 A}C *>vy/$j* B*m<+8"0l2ι&HCl0Ud=H{`  0Wx8=!={| "KkJQ*^"&x_`Cˆ)q^M3#؋n`BrT;*A_߫ig p0'PĵM#p=,6w{M[V KT0L"Xl')-`T{w;^!G3Zr;ѷx_{)PG<6 ϐ> ?^(\\=' X{p{#4m.&vv].B-SDҵWEx}-݁cIgeq x`Wq ` u {P]J(;)ّtQ5a xc*4n cLJ)7ckPvڠ. |F1 ` ְG<6ٱrOQUWguKs B `wXete"ri HcP0t pWӸ#k kԂ&`k8m2 K!&mQF0G Fp-&Wev$y(*,ْ.029}4IDyڃ%q_ % 4T9@uT@:@C{!A,.A : r@[0N@`]IVȐ 3t2wRa$(JQ9I. |9DkY#}~O$WOi}"^HJ.2r9brE1 H@ @ Aa#ЙTq qTG`G9Pɚ!lR&ڠuĆGr0 `oPpI6B! c7D;aCJ0 : uX|@)\bg'&(`E!3CTo_ui %6!`ra `)0Xa3K!Qɢ:穠 )T 2J b'+Z[ H)^0^Punr S*b4ȥ\\% !@:Ш,:nqJШJ@u: A'Y&\*%*bt+Е:j*} 6 =p i0k\Ǔyp 0 00J1x\j3;3eǺ~j.pœ\̱i|[3abp(\ P\8;'! o͑%\éS>4;g,Qg݀,1,&mL*3^\i{Bj(P`Ҙܸ *8(m;0͂ eֹ#B+dy]VAh$l m]j-!,W!,_  < H ~~04_?  Oĉ Xq`A?8Q"Ē&+cp ~d@?;2(<0 d(SN3fOeP kFff*@Z 5ޠ,0 !,W!,^M8PA8P@ bD bh1ĉ- $ЯdI&K@2%ʔfMA9G} !,W!,W!,W!,]'*\ȰÇ#JHŋ3jȑ"xHɓ(S\R?𠵜I͛8W(Я9 J(JQD4ʴӧD=$իX3YÊ{L?dӪ]sdOTʝKqWx5<@̯+L+~̹s@z8Գ5A߅)LPZC`3/ {a6= u ~;{Y<ӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4hP p'1G Py7– {̢=:̑Z<\rd;`:3Vfli<idEӎ:NY<j;άUY`< )D1vTjQ3N=*ϩc8 `Ld`B dI9#;zK_t x&  @1Xdqh.3|3VF7݀@ BBDC,\-m,)E6|{3ƢM,F-D8=$M2lIB̒t\a=%&bK´-l" &SfL= φ ,ˇ<4M9xpL:8GWL7 :Oa\)0sj;6+:#;w*@o0 e5쒐aLaEGP#>^;δArֆXhCSm8І)3 8@ѽ(W>63MQIE|:1N8߽X@Pb b3[|V z!x{H`.Vp+!Лb@Bb&B0*P`U T14E+c=.*%;T [EP#,PC2@-"%DH6 ]G=jh-1-pҠ[nf 4BpAB/jX/B&J6sCaD HrD İ%1O1Z="D&DJseZPI;NPu‡nz 8Irr1 d+zw^ŖpuM{:p-pP|ҟYrP-&`Ap @&e?b:+B #@ax J/@ `@T"}!찁zr!H#8^#m¿VRaT\U D`' f6X7( pIUZ [a縇5i3$5JH5+0z1ĖW/~ lC NS/*؄D^RX[/_T H ?öҙ!ur3 3l8LA~va:,ao`C xJ=W%&xЭug8LKPjrk=6g5lb)v+g<8@C &dW@FA/@|9 n+:C0H!' qC9c#B.э%|'yX˿CalS KXZq!2 ˜21(|Dsޫ)t6ln406>kXH,@<Fln_ @:1jo 5T?A7j!ȚD]3hKB#\!Ӛ<d/䯶KɄ\A J )p'%:#C S#pyg[V+@4܃[%'N[ϸƉbߤW $ h (9r :Br@9t@X\I@^@r* ]EdXacKs5XWvP@ Id`zՇdVr6I/S# D/x!JP@ -a iy+T= H%ň+_ ~# <9!TLpٞ=cT^2z'*g@xaHW@#$!_ Qyxߚaw' Ы0d,(aDA@@:A X3T-4@/"0J@oXptW: }v1PB}PPa `+3\5 ae6K@/:Wx'gxxTfFj g{c-~87 5dxuPwT8xp +9:C:&v/ `8 hA:pxWZHJpJ@Vd%RcA^s1'T`(^@J?EX~wegvoqm} 6 <@TV>F/3+K`b@1R)9EAD (D@|@ N@$T-TGqv@@ݰ@XGq@` 0H 0 HrT7 # 25zB^vb ×-@Ȏ0 H qۤid)L䆪f8vb pJ d0 ,ْ@@&gKo l@G\#e1 Q\D@ PF0 2)w  CIBunS>`lIt--`Hqo{eP-ndrYvyxz|ٗ~6]dE $q<Q rotKZy0#.R I)@);0 E,Zy 5Tnx1+xSMi M M0$7`0 b-)Fi**z0Д?$ {>w`00i0 y'_8`#Gai*0И5Ip8=>`MMy0Gip&qpg@}ut =S^%1 0MPy`tYNh}$ CCxA %i0bZJCy 0 G [:R&@bkHM*lڨM0p' 6:N*+{&7DRoʪIe ݀ a3H]p@ʭi5D;6BQYKp % % lN aPᏋ3QM%i  3tUDEƳ٪J*kM>" QAsTGpG QP`۫ k*VP)TҀQn}d 0+aa۱=P[i{8M_QMrQ``;z|۷~7 &x|[ Y@ {k B Ő ِ @ |뗀cP ۺ @ Ft$qP ܐ ` 0N)) AR&%%R%%B+ ˺ н;P ))G%T|D/Lw}[ + ` @L_p-b1 nWoEy '0 UֻŠ mm@:y /#{#Y-'/P 8 Yƈ6|ekr\ #|g$y'(h| 3ͳPŌ c\E_pJc@kADf,-) R q &b+/#L4\az 6x 0tJjEQօ50R0 etcEXH~'Ga 18&9P4K  '@n=#50M)abтNF)De<@C}hc D'Il)( /{0@%@$7Z$!ip#xjKn)A~@]ܧ%x! .H P 0x$AD7 d:I $ p #x(TB8P G0@]xF7Dv1ٖӘ X$P8P ! 9iBl* -bBpK`!XP$v9:x x Q5+ףgb9J  dCP,u&Ę3%5X>`z[t2!86Y[3Nd/}D'6 C A`x3j " dhbD/ԡ<)IWzPXC`2*\x( :H8xҦJH qDσDKjce+j`JV@@`!L OEġ6u:e.-Z&`1~Aʇ"Df5Y|X"0jn:d@f^Ǧ#dtha ^8#F4xEbvCDhڛ.2j$ dB p%1 `$@wz^"MseǓRf #yЄAރϝ 9zI>$"G /P8 r JAȃ, e5mN cJ4 bPz# a8M`WT P {_0bnuQ)b"DB# "cx P _ {@dEmXOV(h9Dkp6 y 3Y(1Ie)&~#$AARkpXY P)0(ћf "$Ȣ'gry-W`͉@ ԙd9!Q:Ƞ p^4Ų-fx7Y  y1= 2!qO&sM!`pYpYE_pRfo.WE0*/ tY _P_@_PL( p4JAuIg`Y9J .&PES)4;С;)G6[Yc#y:aÈ0njpr*6ZSCT#s= J$lhCspp>ИQiE:_ P Bis*P)Y1)jw{ZzȚʺڬ2vQA| Q9k<$&6Y10`$n~!g5ZAqH$ I ?Ô;Bre'>$*Z%&T&R){}'%(}x bubbletea-0.27.0/examples/views/main.go000066400000000000000000000150321465647402200177660ustar00rootroot00000000000000package main // An example demonstrating an application with multiple views. // // Note that this example was produced before the Bubbles progress component // was available (github.com/charmbracelet/bubbles/progress) and thus, we're // implementing a progress bar from scratch here. import ( "fmt" "math" "strconv" "strings" "time" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/fogleman/ease" "github.com/lucasb-eyer/go-colorful" ) const ( progressBarWidth = 71 progressFullChar = "█" progressEmptyChar = "░" dotChar = " • " ) // General stuff for styling the view var ( keywordStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("211")) subtleStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")) ticksStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("79")) checkboxStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("212")) progressEmpty = subtleStyle.Render(progressEmptyChar) dotStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("236")).Render(dotChar) mainStyle = lipgloss.NewStyle().MarginLeft(2) // Gradient colors we'll use for the progress bar ramp = makeRampStyles("#B14FFF", "#00FFA3", progressBarWidth) ) func main() { initialModel := model{0, false, 10, 0, 0, false, false} p := tea.NewProgram(initialModel) if _, err := p.Run(); err != nil { fmt.Println("could not start program:", err) } } type ( tickMsg struct{} frameMsg struct{} ) func tick() tea.Cmd { return tea.Tick(time.Second, func(time.Time) tea.Msg { return tickMsg{} }) } func frame() tea.Cmd { return tea.Tick(time.Second/60, func(time.Time) tea.Msg { return frameMsg{} }) } type model struct { Choice int Chosen bool Ticks int Frames int Progress float64 Loaded bool Quitting bool } func (m model) Init() tea.Cmd { return tick() } // Main update function. func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Make sure these keys always quit if msg, ok := msg.(tea.KeyMsg); ok { k := msg.String() if k == "q" || k == "esc" || k == "ctrl+c" { m.Quitting = true return m, tea.Quit } } // Hand off the message and model to the appropriate update function for the // appropriate view based on the current state. if !m.Chosen { return updateChoices(msg, m) } return updateChosen(msg, m) } // The main view, which just calls the appropriate sub-view func (m model) View() string { var s string if m.Quitting { return "\n See you later!\n\n" } if !m.Chosen { s = choicesView(m) } else { s = chosenView(m) } return mainStyle.Render("\n" + s + "\n\n") } // Sub-update functions // Update loop for the first view where you're choosing a task. func updateChoices(msg tea.Msg, m model) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "j", "down": m.Choice++ if m.Choice > 3 { m.Choice = 3 } case "k", "up": m.Choice-- if m.Choice < 0 { m.Choice = 0 } case "enter": m.Chosen = true return m, frame() } case tickMsg: if m.Ticks == 0 { m.Quitting = true return m, tea.Quit } m.Ticks-- return m, tick() } return m, nil } // Update loop for the second view after a choice has been made func updateChosen(msg tea.Msg, m model) (tea.Model, tea.Cmd) { switch msg.(type) { case frameMsg: if !m.Loaded { m.Frames++ m.Progress = ease.OutBounce(float64(m.Frames) / float64(100)) if m.Progress >= 1 { m.Progress = 1 m.Loaded = true m.Ticks = 3 return m, tick() } return m, frame() } case tickMsg: if m.Loaded { if m.Ticks == 0 { m.Quitting = true return m, tea.Quit } m.Ticks-- return m, tick() } } return m, nil } // Sub-views // The first view, where you're choosing a task func choicesView(m model) string { c := m.Choice tpl := "What to do today?\n\n" tpl += "%s\n\n" tpl += "Program quits in %s seconds\n\n" tpl += subtleStyle.Render("j/k, up/down: select") + dotStyle + subtleStyle.Render("enter: choose") + dotStyle + subtleStyle.Render("q, esc: quit") choices := fmt.Sprintf( "%s\n%s\n%s\n%s", checkbox("Plant carrots", c == 0), checkbox("Go to the market", c == 1), checkbox("Read something", c == 2), checkbox("See friends", c == 3), ) return fmt.Sprintf(tpl, choices, ticksStyle.Render(strconv.Itoa(m.Ticks))) } // The second view, after a task has been chosen func chosenView(m model) string { var msg string switch m.Choice { case 0: msg = fmt.Sprintf("Carrot planting?\n\nCool, we'll need %s and %s...", keywordStyle.Render("libgarden"), keywordStyle.Render("vegeutils")) case 1: msg = fmt.Sprintf("A trip to the market?\n\nOkay, then we should install %s and %s...", keywordStyle.Render("marketkit"), keywordStyle.Render("libshopping")) case 2: msg = fmt.Sprintf("Reading time?\n\nOkay, cool, then we’ll need a library. Yes, an %s.", keywordStyle.Render("actual library")) default: msg = fmt.Sprintf("It’s always good to see friends.\n\nFetching %s and %s...", keywordStyle.Render("social-skills"), keywordStyle.Render("conversationutils")) } label := "Downloading..." if m.Loaded { label = fmt.Sprintf("Downloaded. Exiting in %s seconds...", ticksStyle.Render(strconv.Itoa(m.Ticks))) } return msg + "\n\n" + label + "\n" + progressbar(m.Progress) + "%" } func checkbox(label string, checked bool) string { if checked { return checkboxStyle.Render("[x] " + label) } return fmt.Sprintf("[ ] %s", label) } func progressbar(percent float64) string { w := float64(progressBarWidth) fullSize := int(math.Round(w * percent)) var fullCells string for i := 0; i < fullSize; i++ { fullCells += ramp[i].Render(progressFullChar) } emptySize := int(w) - fullSize emptyCells := strings.Repeat(progressEmpty, emptySize) return fmt.Sprintf("%s%s %3.0f", fullCells, emptyCells, math.Round(percent*100)) } // Utils // Generate a blend of colors. func makeRampStyles(colorA, colorB string, steps float64) (s []lipgloss.Style) { cA, _ := colorful.Hex(colorA) cB, _ := colorful.Hex(colorB) for i := 0.0; i < steps; i++ { c := cA.BlendLuv(cB, i/steps) s = append(s, lipgloss.NewStyle().Foreground(lipgloss.Color(colorToHex(c)))) } return } // Convert a colorful.Color to a hexadecimal format. func colorToHex(c colorful.Color) string { return fmt.Sprintf("#%s%s%s", colorFloatToHex(c.R), colorFloatToHex(c.G), colorFloatToHex(c.B)) } // Helper function for converting colors to hex. Assumes a value between 0 and // 1. func colorFloatToHex(f float64) (s string) { s = strconv.FormatInt(int64(f*255), 16) if len(s) == 1 { s = "0" + s } return } bubbletea-0.27.0/examples/views/views.gif000066400000000000000000001671221465647402200203470ustar00rootroot00000000000000GIF89aX.) !!!"!"81#!"$$$%>6&&&'"'('())))H=,,,-!%-TG/"(////1112#.31n3333eT45556667&/77788897999:;(/;(5;{e<<<>*:>>>?*1????@@@A>BBBBtCDDDEEEG.6GGGGH.>IJJJJKKKNNNNNO1;O1EOOOQQQQRNRTTTTVVVWŠWX6MY7BYUYYYY[[[\ҫ\޽]]]^9O^^^____ׯ_ܾ```aaaabbbcccdddde6&&&'"'('())))H=,,,-!%-TG/"(////1112#.31n3333eT45556667&/77788897999:;(/;(5;{e<<<>*:>>>?*1????@@@A>BBBBtCDDDEEEG.6GGGGH.>IJJJJKKKNNNNNO1;O1EOOOQQQQRNRTTTTVVVWŠWX6MY7BYUYYYY[[[\ҫ\޽]]]^9O^^^____ׯ_ܾ```aaaabbbcccdddde IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6) !,W!,zP  H࿃&,p‡6Q"C-ĨPA= !/1FgP*IJ" %RWʆ[S&CM}4Z01&=mQtg]!,W!,W!,W!,P  H࿃&,p‡6Q"C-ĨPA= r lbl$2y$YV3ADEd)˖ν[4Pǭ sS ɳfA\jEaz%lFn;sX酙NGjI0" UGƏk Op? !,W!,Pp % H*\ȰÇ#JHŋ3jȱcÀ!,W!,QWVH$PC JHŋ3jȱǏ CIɓ(S\#č I͛8sɳϟ@5Ƅ2ѣH*]ʴӧK իXjʕК_KٳhƤɈݦKݻx3/a<(x߈R˸ǐ7a×-,lЯ#MiKUežc Ӹs8j*`k/i#|УcM5qۘ<|mĥOO( _Э{7O$ѿM=]uhG^ ~xF^fiNu]s5Hk|| 8,Y2vɖr"@Z5G(bF"w:&`PF)ePOu ^Ef]N)dReE=~҅Ypa)x|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬꪥJnRRUZ`8 T9Ab k`D E,Z  `Ec<8@q<")G G9ю<1 78Ṽ< aECP#*aŃ1m#ّ<SHfZr `2 He $4 b́8ӂ`*_'i1s<{<(C3g!% ]A1K1fΈ g 2Qb,|4P` D+;hA`ŏ!!<+F.i /Ġ2|XDlꮍ#㽺 . *OZ.1CΆNR0^&(όLv-5!жHpo vBlh#dprme *.WPy{bг;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpu*AC~*(As Axc#!(<VFyc| `%8hbOE ~#5_CB»^%}

/݇#g>'DOH ҁL J !P~r~Qm@װϷw~wzG/ װzʗwQ 1A z`-/3X2Ё 20 RVZHx\8(PC A8Dh!Px 燁dy`~wzP< ̗x@~ ~ׄQ<(7ňKXx8/p ~g xyxyrx<8< v'xh z!GQcX 6}}0Xw1 Xpm|X z ^UYqw  wwX Hh'+8~ 6G~yPǓ 74iP(W Q9+)8|^&@w9&xȃJh` #@* 7nYHJ*a$J0ۗǧ{hzꉌ0*h 9X J G0y ${Z-(9Pºx: Z؁*Aw[j(ฬ'pPZJK8Y^&Gzj AJx=ڭz* q ٩:tR9(uwK84+ZaЪ! 5%,by-Lٴ:@{APmRKV QA'IAR q ys+uz|۷~;[{۸˸Ki[_O{tTeQly+c, ӹH!; %XAѠ8 <k!Q}XL[?`6)5.s:S1UNj /ռV#!c b Iݛ{A; KNa".AA34 PH1cZF|_M903;˿L! 19C9sc9wӺ9JQ9}3ódchcK:0 @8݀5Fj6n7:/0 @0ğcv$& (lhAp=>>?=s=>?c<d^ ֛;Na.K?0V3`e2 /%|K nS|mtd.C2DC?CMFAWqOPl Ba.ʰ$@/ E$dB ƥ3F`_@I{O@B8 ̓5U15920IUQGmXa>FF6HPWa.], Gs[wB$c`=PMIa{K!-DoS3I3QNLF%UJ-Ll,l1քhEF1=ן_д_%:כRs QBS|ePWR|G 0 mFA0Ls\aOUX5 SD6 =@ \؞,YzbEV2łbԀ-=۶]֚=j`] ?h}1݊M} %ZcغM}WZ] 5P`fCW}31@!D# `.]ȵq];=nʄވ۷[y^#Wd/P[vsM`60BpF-b@bVFj,#/ik;H1/M!N._[l'WH@hV5~7993KXe\Fdsefq6gffWtD:jP LF7{F8I 6  `dnem=GKk -LF#ϬfkJ~/Vk66ih ud{|}B\Cǽ&iF͓R=%DQN8 Su1Q `] Za  `hjlO\F,1YQeA`=`.T!N4@O a=5=<2 Ȍ_]S 0aƋQL:c8cRO8d86j8KbN/5_Ɨ?|6~W:>B7 ֻ0 5O?`ON@:y …3|WP( QI|(\Š=2Bk+.p\)Dyq,xB,g+,&R ǭZpG.}ה27bVXe͞EVZmݾW\uū6Q] 5# [7t*V.D9n9uTB@=TܘBF1lA(lu8B֨R@0*+C`Sr? rBRy`~^x͟Gw}/ ,Pz_8CfU\R * 2 Bq*K*b y ?y[>2:bBR"v`hnT/I%dI'2Js/hɜ -CsB@!h(H(L++򫽅Pj(8ZCK/+ sL+.b;zn3Zyj: I)7SO?5T˯;)tP N g\y.7BǠȅ|m^M1CX#=#_'tTz#MXb(Z:2QSQe]w߅/R2f-RjW_"ƚ]yeWqaH 7CeĸayQJ^hdʭ\fo9u睫޵Ȃ(hybqMf~x^~]k ‚eF,kGۓVǴ+r!Jf;og|F5hˈ7`@jΡ,0P!]h@dqO:<=#2W+ʶ׵vp&wZȇxGf<-+%l rE " ƹ &;t͜pt Vq%TP`gW%ȞG tv&CvwFnx`5A,.C*Bw0r!FRt 0<) (H a e[bU?I]NX1 GeV ϱŜl۝ڼv`ոF6e/XCq 9UZ FrDa,@XYБXhM72"Z@ "bS yo!$Vª}kdXd8LbSʉ[H FX0`v AT0 @:8fy$ @19Oz&'>_Ӗ{3'頔-$()D@P6ԡCC2 chF5QGࣉ6QԤ'EYDAR)iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժWjVUvիE*VBqb]BUnokΖGHN"te.ЁC420G Hh\طdh"GxEK tDHMbҖɣ{HZ֎Ńo!Z0ttIP6Z\-D!*Զָk۳$ B)Yq*--&\s!xX 7,Bk <@"BQ_n],]GVĢFF1 BX^ رnx gT`9D?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDd,Ƶj+(aFRh‚jJ,i<2pj*+8G'90؂0؂)m̠Fh@”.8(ȁ 0Hx0 6&>*GH$ 5H4@yh/ȡS= 6x $ 󸯶܂ HɎ0:y{\Iʨ L%iK @ 1#1CGXIw(+1HL  Dn@ &"JLMw8PwWQk1  cg C;@00KKT80\|1ĈkX x@b4 |M1hNر_ OO 2y0CP8X8 MP3؈HГyߛ%2CK2t3PѺ5 4 Ύ)84"-XC*S- v E6CJ x%Q} ] (tIcX ՑzД64I4y2 H @ r8 A1J# ?SK5x{xX΅0ˎh'0XHL LUCA7@ ֨SU5Q ψYUc53] 4} a+Ȑ 24z0 xP0kԢI=HKl Tk6hG(S#0(˯H(ذWжd5^cXОmky%JU׊؅Xim &dX%?29yK0a<Z=ֲ(3=y @9 SWIX KԂط*#΅P#@IΈU {[|y8Lڊ7T7?&8iWI0tW=[ZOyײzʫ|Ҋa)̽״lɔ<HMUhJdT\ C"[(ehV2J𹏰i `"+؁y9$U5]O 98UJ}V}=6ݶ8݊NԁQ0ر_sˁ+U_d1_,.;^@S Ҡ%N[y\- 7̽a_ZZܰx;WK__Ȁ4 3aټja&n`1z_qa$+aё25p Ǒȑaahw+H+vvFPs]_aG0aVYsxR["X?("U)P %. N[ҝa@-i-PՅP "?c"ӾYt/AhxPh#g#3~6@װL9N^Zh`׵ CDE潈QR);XQ7%,+Ub%WI8y+bʋ\P_J d@Sbdo"\ L^6k'hvZw&߷&HڎtrnP&H} FB! !Y(&=攁t=(yFvɘԖ力(fM&ŏOFpO\ '7GWgw !'"7#G$W%g&w'()*+,-./0s&X XoI5J(77 033HXs@ &E_/2V A33N' 0l#-UKpwyX<;ц`H04Pa'0uTg# Ѐg3h3k[<lPr:uuqyn7Dzwv8wO)p}vAYv29@L HE|i&'xHxx2qᣀ^xnx' `ypxyny=(+)0 w/Ђ.0!xS9@ ,s-H".A/:,+,0Pukv7"Xu-ׂ{.h7˷|BW X o(j ˿sΧug8x&Xu{ȿ/$\09 Ag Jq۾X1`"USI ޲/lC & UHf+#vN gQd{TfV2)^TXࠟV_6m9H$I+|xrh D$ĄU@ADa!S [ztd^Mcxp PAe8] AU}8]EJiFiVF=9XwҍhƎmјC& XpA=ߔU^I$"TfXdPpn yeyXN]NnJfU:dRz$h}ިPzjeaDMNf(D5HԠcN|3I(u'%вAUYfy$4Af@A&<$߳L<<֍J%ldTA@myJ%c!gB +7 IAT Qe@3xkDMtFµe@P֬P}nFrV<Vfda.?vzJrYC?{D&uW-Qe6}AP-NZ{?6Ҷ#68D7-(Kn,X3WrcA!W PWƿcBL iCl"!hXCa ͐C*K38 BDA~V pߣ"AsQ##F 0S|@6Ɉ1<1kzInbdhȈ`A|G-"̀*&HE NgXU< PVI,bY7.ue%-]_]R&-mY'33_DuIsCHxSʼnόJ0^*͗,$(-dRByKg UpY-Xnt$$DnÚCP:Vȏ]@0P*!RBF ID?&yRE9]K\ 1PZ`S\bZBUI^7*R$n Q)vZb,(D Ti1V5VJJ.#@ϤT h |%p/GQ T&pJ*cHQ*#HD]g$; <Y BZ6WK:G=$Z,̈/a1Ll?@.d.IpYFY `` I!V$dC]1۵,J\6]+o};M@J7lʋ\ֆWl%/m 2]4׀ {YR|m,T\z Y=1q 9c„ﰳRm%k[ $D RF$f(R@Z@Jjh$@B6%~Kw0UoYcIȀ(EJO:C$s}LH8 =s!ymmc )!% Ca!v l\E`R#.K3;yv!1;bqݽR=CY?g^"s/A98K|M񐣊֒5oɄ"n?tD EUH(f+(ZHD"DX@/@Ir18%G%ep^r@];Sb7Q|*]ĝK8!E}[Ľjj ; >/:~Ћ^no"!O8]Px%sPawjgsbz#:d1^!M?)Uh<-DQ~Y CFf}$ʦMT*}w?o$mmm-KEE1 Ο_4z@ ܝtiNjp3-J . ֠ `< D c :Z .F!6>!F!Dt2^!M @ ` j!`$a!!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,ZX`XÇ#JHq^$.$Pq"[„yCSrȲˎyȰcE@r˟@ƜgSl0 0 2ի\I- $tB)PaA=00Qׇ@,Zmk]T RɪU&Z)Dc7p݄, dWk@- <(r YˑI 6 m'1EBP+x =` Eg**3zDP qgȤRKfRTgYq"$d: GL Ԗc LcK k@Ed؃ koY@Y1A"##j$Z m`*$d3̄%R9O΂ 2k3 )M ~%1܈Oi]>`$D #6&tZ@:>dFG3c\ԤƪIQZЖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծ6UkXQUUPVpk=B.9*U|E* 0b9A˅8@? \p7d@8,h'P?1!o݇N0Y vlcdoIkڨ6p#0m%BЁKcmr\6.H愶jۄmnZdծwҁVd!hHh%U0C,!H6(ˑC ,+r\wh@5R|6qaYb#3Ho[ laUo,xq=0cpÜAt D8! G"eWY!CƱ H6hzW~`d!D;lBO#+i$/6&ߣȨf&MN5+{h2\ 7] k:%5[ vhubC{n{!%[H?ᖵÁ9R` ^ 4 C8 0l?T!{3Q<'8|j/S"Anc|#B |E,y{eZ~{Õd(GG4pӆC7F ?v+Z_Hg;nz֮{17}"o|9Pf @su1x5X:k(!iW ݱ{CʓifIsP@1y(|(ؼB3$Xoy.έ]H7r Av'޸!Ȉ?v^z"n ƷX0`h6Wo}HgGzYW$XP~~~Y zX|^!fZ0cU+K7 ,ʃ oYcc<ԗ>-|H A З fA *OKHR>X$1ɖwB7yԢ"j,n,)R$rtl &xv!?)P~0eƇh-U|7Ʊs|@)}6.Z.KYd<$렊I !4Tl[>t8LgH ΧsM\=G"rj2E/iG7@/?GncBD-пe`|OxT+$;K58clI!:d 2N`DHwpZħ@u%JIt.!*8I$"8%K d' ,!%S B`QVBzP% k792a@PK ,aGbXvDL0D9<`1!F?Ҋ@Vi sAZ#(iGֺlgKͭnw pKMr:ЍtKZͮvz]@^aoy!:PPo=BU1:(pEmw1& &67`` ;:K"(>`71OF0}F v` @LwABT,r и01h:FH "TahB3O>ЋVA!F>cL؇~P>܃לtGdPCFA9g!!4XHw]m_+٦v 6<0jC:{4 J>B8A|TERl8𫄅YB`9 rS_y-o{-WരO>!r8@}}lv26~݇`+6 r>݁m8!Vr #)v:@#xBK$DӀ7~သc / sVwMwp5rTvw"vL^r=8g X!c{҆C/B#׈w( m:"1x * w}ه }d_Pf} A{U1)׆3Q|z}vas@6qaw`;%e ~Az۠mawgq_,.0wfv6j) !_!FQ~Gs w 8 pl(&Zvr(ld0Fdpxq_}q{H8Mw@H\Htͦ g8iPmvx`;V؋p uW ]r`pr5 lI8( щ  Al6 iacFo%|lqfnQz7V~6& #wk㇏'(KH }Uȉ剥8!9 1 aa'lwX(x0OgIyZ7jB_'jL!l= x@Y`oV"IP'')# kؒn6pl W'&lR~whOcsy{ juLy3 2_6–r]iI ehؖnb0_(ww Aart1`sƜ_si& q|Ɔ1xxHf؉3aP +#P_:SЈ_u=W fmAC )mb t ( p| 7(g X)c0;19 "Jeii@n(fZ xx y1ԧ_-__a*AKڀ hjv24qA U9g}yZja{H ਺`y Ѩ^v$șF`uvu)\!У`[3Up^Y!,W!,ZXH$(\0&d1 a< AS!)IEtIejt ̉& LsP$$< )7 0m4fɓ.lISI[ JVc@,̓M`ך:'Μ*0 !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,ZY80 H-O XH0[T\D0V<@0Dl$ H)$2)y0唓a|@A$<0sd@ |`t 3`Ԣ10@O6jtȓ$ ?)R8 _F!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,kw6H*<[ #JH@Ç3jȱǏ CIɓ(S\ɲ˗0cʜI )*tP`u쇍+A 2E_Q7AS(qa#6J $OD8˰Xt\vnRշa&^[̠<0^7?.`о?Y疶s\δ z:Bfmfdy5g Ҷ,G8ZāM̱ B(H= O$R嫔o*UA`'~0 gH#'w3[\ǍP8@ CfD=ydR}:?a簠[g"pcC<@OÀІ:+R$j9K[F@PJ\@FQTߦw+bKb, (#X0JVNz=eNb T+98#$KI"P x#oX" A0 rd0z ]|6׈vlc 8(C(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^Mr#.U.?^@L U,_$&腸PҊQ݋rdvwdt_ P qЦ|(xBя~dh!8e ~/uVP%sY0AX+˰&0W R򟜜渹9dDCKYh b 2 s,3~ 8@K#Tz?_4A:p s8l H6+OR1jZI=p A$??|&o|BdcZƿ&'ǴSb;zGJs!^:&6{q{^^͹WW%/ԓOėIa*(!חㅒ}X>FӇA!O {dWFlE{H[6Kd]*F #@qX} |lwtm!մ 'Hx%+xb ۗ('XP?7PP7>X12-hl@)]0p~':H_'@{I@fH]hh` aa1%0be `@HPPraǷ>A,`7ܠ'mR F7X(̄9&xq\ĕ&k2Bn7rє%[%(2(JRxQ%WŠ2Y4k`%0%1(?q(q5H%%a"aXHrLP8U5('QBY _Q4(QR( XHKA$Lj'O)XhԸ.YgVp o .i גo!9%aA9pFIa{b'4`` 4U Փ G1FiXpZ 7%0֋mg([,Ab0 ?IGdaKk"9Ebw^TJ-ɌϘ$\,, w **rLr1,  HN?2UbYط|+,I,+RDVYM[ 1{~5H-"1+21Cx5|z),IT CT' d0bH')ʩ ),Y.uMPu/p@0+)Gp@p12p77iH`dudY$57JIZWVW8~qD!7#|>1~4% ` ks.ZĈ BAP7A2EQ=0Qe!X_2FrC !3Q0313l4mY?Q0]0=333?!o ь 1@j(3Bjy  A~jʦzEYp0770 `_%Z:7Z%oZrj#P83*+yҚԊD?!:K0z %yj~Z8^!p! {9*^Bj` j`*`(`>8*K`^ڳ?C+T-J`-$v#c`k%T?t_?W;6g26c6(S[?0ej> K$5_ScC1p# rC7y"u&%$+ 0 ƹ;K;m 6*[[5"oi akc Y9&hջ-)̻YTt#su;j G*%&Ӗ > q!{/j0۾k2,:j{P v 0  q%JDay!Vu P`ZYIM+G*LTbǑ3_S`*>A, Iڡ"MD!G-U]|bP 4klN} zdHq5Q[򐐟犑͋Oa5Ql*gZ  >u`],^G^͵`\;o疾*n 1Ԟ!;?>T47 ?LN~ q• ݠZS~K R Eg K;FXG(A!ٴ - mDe՝cDI팹$#z"KKl7L-.J>?|hqI 0a꟨<` -&@Pa[6 WѾnz~}=mvx/z!A  u۞蠒Jj#`CJݪyg,fzפ%_)qHBATC_ tII2Q7qm:ߩ-]Rb%6$O&b{+kPѤ 1Y=&EFyYYCo -^a+5QH!I!{ׅ`0VWkFyxy3gJy䭓 ##q $hp! ! 䅓scǏB<𢦳i6 &>%࢏/mw1_ׯ]GC^}V F8p?[#) TdӆPIG\8j2i c*\ppp3ɷHW& G\_z*AO(D@ǜ4 *-scQh2$sJ'Gb0GT`:r!"KBK! 1T( #ņ^Dp|'LPg 9nh>y #2fZ(fжŶĻlGcFBnZ ۩;o AQR!"A\ Z}S^9hRb7"@ ƀjɹ:~.q'q$#H@*G3*ЋRIE1ظ0!#F-pE<KxuТKh42,_#rcǮp\Mza!/ Y_sT<>1,eƘe3ze230Uˬb$kɬEgӜ W0\dGҁs5SL‚?%6)=*17=kZ+ӥf,kSzνuU\Vú3{Z7ّUeBGyL{O_ءMjVսn2۹>˭hն]6#bӧN6EGx<}bX3|mK.wme_ y [|&yѬᇋ׍V{vEs2)}զ;ũ<ϗm7HutWWzֵuw_{>vgG{վvo{>ww{w|?x^ֶltß3e%X"E/4R (nѐjL|CsP$:?m#)F`z Q!)ky'z;0]g tYp?uA& !fb7~t ` 1#$oŬo7C 8$@)_ :+<4)xX[!L tSs3R?\{ڿ%*KȩڙaX 5xttx?\jsp yRA<@kЏt*YP@8?LOuQx]K2 5۲C*A^P"0up@A\h xmx !DTD3 GTDylHjX1+8ˢ8ECyEtyX鎆qEY@ yH%bGi F=v!Xƚsm793H:SȪ+$Z. !y@w؝BVh ơJL  (ZAKxGul‰4HkC&,|ʹ|+I@p|B<v ",1I`f ~ ^` ` ` ` Va&._vaF`>n_aa a!"$& ^b#v^$nb%>b&b'^(b)~b*b+^,b-b.c/^0.c1b2^c3^4nc5>c6c7;~]VSf鐶idiNiQiiNjGvii馆ꢞ+F9Ņ묪.h}Finhzf&&iF.khNkhkl6>FVƎ붆lj~lɆfƞrlzlvflЮA+ 6V߻V걦.%m޳efޞHV&^m~nfnm^n^jnjnnn.noidk3[3,W M Ȩs)n.>ng>~ko"_q:Npqp>llqp&'lqfqo?lE{J|qmCԫO3 Wmfrxmfpn,mVrݾmrVn.-s&nf^oos7n<=os59s8>s?svoj\dT۳7W5nL)qm0Vk)?pFⵎcg+ϐR'u(S' q[uw`uau]Oq_qc_q`f/vbOvhWjň+Hw!7,np)ZOou >s2WrrdNnBtA7;~x~'w@7/wx_xD?,֞R*FoM_KCjq7yvcOOFuܖ ᙏut /陏uXZy]GNggwhozW^zgWuGz׋?8fEn1 -ٷ?'y߼__wr?GnQpvOsNp/Bw}?o?xʷ˟||}'}/eIc Ŵw}vb}T"z{u}_vO~'~Gz7~o~~W~ ?|'?7wG~W_owx,h „ 2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*WlR!A1ifuܙO@j'ѡG"esRM>5TNj+ԬHjףd~]kU۴eт}lܺr5kk_yWma N̸ȍ'C2˚F~3ТG.m4ԪWn5زgӮm6ܺw7‡/n8ʗ3o9ҧSn:ڷs;Ǔ/o<׳o=ӯo>? 8 x * : J8!Zx!j!z!!8"%x")"-"18#5x#9#=#A 9$Ey$I*$M:$QJ9%UZy%Yj%]z%a9&ey&i&m&q9'uy'y'}' :(z(*(GZz)nN)b)mjjߨ yR& ݩꚨҗAjH 髽+[ +ZlAг9[BF[ѵ%kж"eKu+з[Ԛ&׎ lЛ.һnD pJdbl& \/+l1皭Z+L-{i'i-! +LZlTM6-7}v:(:=q#-4Ҧwy[+q췺Hg}s7^7ܙt {~ oڠwr^8뺝3?뤗+9\?nnuR^u͏޺^w.kcvȫ~|җs,< ?ξ̛޽ŋSyuh5os 6rq{$}x<IЀd8wyP}Kdή:,o}$WJrxϻ8Č-OSgܥ)Z23$T&jXv5$limi1$7)Y<':өu|'<)yҳ'>}'@*Ё=(BЅ2}(D#*щR(F3эr(HC*ґ&=)JSҕ.})Lc*әҴ6)Nsӝ>)P*ԡF=*Rԥ2N}FMX!jLp%6u< zDqiJ%ɕOBeXݰhU^W/1xs0Xvi,h %Je ;Az&QGnoa`8bfSthdkM eDI ؋7s1Ϗ2GCUz2e_U=rŤXK4WbEqd ]jɵ3Q8\`n#+[Ҽ.(+ݩ |ndϦcT0$ߧ_WNj,&/~F׍p9Җ^Xb׺5Gߍh*@&WSeUN36r'FuRaջ)i>1k!ͬ':r3Wy%U,́{ek̊/'juIr𼀬(-C/ьs<$fUF /ͨ>Wִ4? i.̹HXbHfV}V-glڳ55]$RxkH~ʹ#LIQq|jpq,$2G;؍.ﭔlo:eQ6N4]^z;1'31o~/Mj[MrRָ jhKܘ#fgbkӅoiرi-eyÂs\2swӏM9;ٌC<[>#MA&<{Fxl׷px\sɈG1x {qNG-+9e?|Yv=nx; ^o6x?_=G=m|-i8Rne\eK7AUyW Q)6|I~;ґc[j`V]1ۅvŋq`*i]Yw}\1.MՁ6U  & !_ Ps!,W!,l h H &,p‡6Q"C-ĨPA= R$Ƀ"GL)$4.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,*  H`&\ưC#THË %JX#F9RxdA I>4iEY t23i63;y&NB,:tiRHm6T)է,œ*TRvjRJ(fUlZ ͒D+RmYgօQG;Wo`!,W!,T  Hృ&,ưC"J81ŋ1 ȱcǂ *ɆSJǗC$II*[ S&H#męR'K/}PCfDQA%RK1 ĚUk1]V,كf"ۍbǾ{vnݵw&{{\b Lذߺ{8q།)?Vd!_vYkhΣfkgdVrlͳE|unԻac͕6Xq}wrˁ7Δ8TTWW~yvۡw6:PD#~{z||4Tϓ}~ן|}W9 S@!,W!,T } H &ŰC"J8ŋ1ȱcǂ *ɆSJǗC$II*[ S&H#męR'K/}PCfDQA%RK1 ĚU.]V,كf"ۍbǾ{vnݵwzˋ\\Lذߺ{8q།)?Vd!_vYkhΣfkgdVrlͳE|unԻac͕6Xq}wrˁ7Δ8TTWW~yvۡw6:PD#~{z||4Tϓ}~ן|}W9 S@!,W!,Z~ g H&ŰC"J8ѕŋ1ȱcU Cɓ'K\ɒeDfC8%fyѣO#DIdˣ+aœ9Ӧ͜9ySТE"UL5┺OAzkA >KlFюTmKҔ{N=;QI <0,ÇR*Ǐ!<, 1GlF A,ӧQ~zk؟eM7˪{V\vᶍNzysᴣ>[oΡ>wA,r=>2wꚭ.Z򆝧XzX{_|_}g|}~'!t |r)!z9"pI ZX j vy ~X#bhj`$hX$^X"'"+"d #l%P)IX9NIY&VY&Li$Kz$O%RY%Z'Qq!,W!, I H&ŰC"J8ŋ1nȱcL Ciɓ''\ɒ%0c,Hs›lHČ@/zqѐ(lţ0kĉsN>%JQJ6 U*M7S+PCT,SODPCfQH(+SA9SPE #ETSQ Y2(ʕ-wœYs&Ν=OZ4郦"덮A.)[%헢G}zwտ^|nbߛT8%ڹ; ^h!∊-2$䒂O|rś;?/8 Zm:s۬C,vθu&[o%/7\qɅO[u٥8cg^y鵯\s{Gyxz7 {w | ʷ   Hhp)!:!!J8"%Zx")jHXy`8#5x#9#=#AHHP$M$Q 9%Uy%Y*YIY@!,W!,p (@ "<0!ÇB\(`ĉ+.hqǃ CIɓ(S4QaG/'8G7e椹ϟ@l(ǝ1UzѤ5] JЧQCbE*uW`ZK,ȧTmXMKwךYʅV/^u N[n];{"۷2ˏ3 FgN?LzdufV9Tvm[a]}OO1T^ G=]uu]GNyδ;yكN~!,W!,|T (@ "<0!ÇB\(`ĉjȱǏ CQŅ'OfT9eJ0MIM%"F?ylyѣwSҦI"JRPeUkկ`qJʔӱO͆]˶Rjf}˶״x ծߣr 5UQ1پ#$2t%kx%̠!o nasS&M3Q/aePq-Yž.9 !,W!,D8 (@ "<0!ÇB\xŋ3jxQ)N QB(S8aH/],͌1Ayě@\8aI<*9O4\JcQHFLZƦX-lحZ&jYpt[ݵq)W,߷z;8o`c&N{x)ᰏ6f2c!,W!,( v(@ "Y|z1ԟT"Ū4UNVU,Ā!,W!,W!,W!,( hH &,p‡6Q"C-ĨPA= R$Ƀ"GL$.aLL7=IRfO?y9hQ&5)FOFuJjUWB !,W!,DF H`&ðC\"J81ŋ18PGC6HRbƓ9rQȒ%QTG!ayfA q>IgF:I) TOf:j Fjk_Bv+W`mkڹdz۽wjj߼ūUN#-pJ FLaPgLTOB- TsdΓ=WmTtk:MDSum6]}Zvjh!∊-2$䒂O|rś;?Zd /8Zm:s۬C,vθu&[o%/7\qɅO[u٥8cg^y鵯\s{Gyxz7 {w | ʷ   Hhp)!:!!J8"%Zx")jHXy`8#5x#9#=#AHHP$M$Q 9%Uy%Y*YIY@!,W!, v(@ "Y|z1ԟT"Ū4UNVU,Ā!,W!, v(@ "Y|z1ԟT"Ū4UNVU,Ā!,W!,W!,W!,* [H`&C#THË %JX#F9RxdA I>4iEY t3ig ;y&NB,:tiRHm6T)է,œ*TRvjRJ(fUlZ ͒D+RmYgօQG;Wo`!,W!,q9@ *\ȰÇ-Fć+^qaFCIɓ(S\ɲ˗0cʜI͛' (W!%ɓWP@-ZsI>SիXjʵׯu^D%^ҪMdx[yqs“-aL'Y+^̸ǐ9x%1#S gAu`"",۸s-v̐>HLѤyx UyGֳkνwF<| < ' 8hJd @DP]CH} z XwfDѰ3:,H3b(bH9;ā5$'94B1 ,a"*I>#` y !-MdHFb" AeLYBK6}9! "' QLi?WPJ&5BBJֲ^Py܀+; Bx! !BأW@a(PV:dh :haQJB{Gɴ#4U)G0PVFgPf*H 5ŌEH7AP390t8Bd^ wxAorde9;D:{@Cx@<$JFT:*Z9dg<M8AZ)fY7DC5w@@H8 Qb]̶ -1R'kfFG%Nzr(6Go4//:BO(D7 ( @t˙YHvp_():D$RUs.B]u!@DFk,;7 =*1u7[{q*zOWֻgO=N. ?G=/[ϾGԿOqއ>/~?ɗW}}Wx\7( { ؀؁$Qp &x( ($.؂0X62Ȁ4x<؃ܗ>8D{@hBXJw뗄LRyN~P8XWᗁZ`w\~^fxB6Wh؆nPjX|ltXv|9xz؇8#8xKxXX8x{Ȃ)QX&!g!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,(82 B"@ L&@  c aHQ LDŽ:l S3(SLA)a(@t0aD䉒 BuJ:I%q`\a[Q {,ܝN" !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,}H rx2 ,   P1Gr%Ó00d`L D2w yPhOAgE*"P4M 5Q"̨u㖯[~$HaYu`@!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,`б%̖)"<$0aH$a < :  !Qr#aN $42㓃 BbD@RG# ܒ#(rh8U>M0@FxbaXT CJah)aRtfJa $aS>U ƍ0 !,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,W!,QwH*\P!JH!Ĉ3jȱǏ CIɓ(S\ɲ˗0cʜ^IpT?=8ɳѣH*]ʴӧPJZa mKmKw]"Xt̍Jݻx˷ߎLہb $oGbϠCMtQcAE(xN;)[Y@GM Nȓ,,/Zaœ)zbwnCN`zBiWK@7 *[?*@@FD3:ØGPo7n; ;x5"``Cn1XV` ;&8RQ^I`/B_L6PF$ `v Ij[zaO:#P8pni@8]z0ZB&@C3Nd $Q榔f馜vh heBʰ9rHb;EYB< fj5<Ĉ@ tBz=d'نA XՕPff5{+6`kk*Z9PhCY3hz"9栕 {@nxH Zo 5+O.Xұ(, `QU9~ Z s:urXPɆlBhCV4 )Q,5AnȳehlvthUP3C"BPE ĜNzRSL#YViqm 5ͼav۠.褳/Dv 7 5{.&\+0<j58A);XÌVGd9ș˃ ywv"p'[aY fbSjt" Qg 5Xm-wBU DK&H Z?b:y@@}'3BŭP% VplA d z;̣@0!X&:1/֑G4  K`5.HM2a@& 1,hP*=71yVZ!IԊ1! ovı':򑐌$M<#rF ZG՛+O  XHs+@ڔ/Q@ґKs @;2<.F}dGnadz;ŲW=`Γ@Sq"qtO潂#@ Ґ^Hfj=7|B4}hK{_8)New. >9>6<}4Z\.oi+.h?T Ч}+ND [WQY8c%9&+s}y_u|9Z<41O?MpŎu<{[wo|smCgnps"HI'Y[euo*7=i/%ߎU-y1Ew={5#ĉngf9{E?}.|D߸ܓO|0 ~_cgpnh2?oD"_K}gwv7ynrȗp{I}gyhvdlr@~)qhWw7{ Grb5(.fnwwh53x}(#+@ou`#"9kZf})}vG~T6:H{48}7'ZHx׃Qc~lhwvYe @{Aք/n<؇q| x{8~H,zSDXN}3w'37we7{'6Us5v(ϗugup2Gi=&|gvqh8qv> 6kVr=2&}Y18jXaNJye؋hvHwHHŖeEzg8eV&tHgh~2y PnGhQwX|؉gw8xVX:G>(tX }.y,e{resMv ȓ8bx~tItByP 7d}i(M9d9HWh'ihitX烚cɈDI'LIx ix0u]ymX~p`j#kFMG$+\ ؐg|a~IȗBّC(Imh7omh(hț8xVlN!}gsf%`kI70M`qbsvv{vɎg x׎XslV'pȐn}*:i9v Z? %vNEPYj"qq}IJynڟө!JI})\wi1*ojHZF@JU~ZPPr(ʓkH.imjt*VAxɇsnQ}VlsHa֨`lsLȀ{a#)fI:wq:`:YjUJ9f` cYT/)j^Mګĺ^ZȚʺڬ:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ;[{ ۰;[{۱ ";$[&{(*,h-;_~Z1;3$F*7 GRj>M1Qv%*ɫSL2O Qx<; 7PXKf+==YK%vFk(:җl : )s7ض)x_ةmYڣmC c7M;vȏ6[>gxvh6)K,~ ʻX*p7~Xƻ_M{jI{؀)= ޷iǖ6(ƹyKkɔky ɼ[]ٔ{T) s]*W$y 2)OeYX-Ig+ b Z sIysj)tɋWÁ*6tKl83ܵ5l{[*<@;$\ !|}0LU[JۍyÌyy^:|+KZǘK2,!u&l_Ke+I+J{XȦ¹jL\w܌wK t\[ y+ o|똽+쩜g8;|G훿ζȉw|\=@{A8Ϧˤkx˥S -čr ~LЬKIz[Ʌl|VI.La"= -D}wjH3MLPRL\V}XZ\^`b=d]f}hjlnpr=tݩu}xz|~׀؂=؄]؆-U{؊،؎ْؐ=ٔ]ٖ |ٜٚٞ٠ڢ=ړؤ}ڨڪڬڮmڰ=۴]۶}۸ۺmز۾=ڽ]ȝʽm=]}ݯؽ}]}}]}^^~>  >^ ">$~(*.I.0Zm2^6~N8<>B> D~HmJNP>T^-VZ嚍\`b^f~sMhlbnr>'!,W;bubbletea-0.27.0/examples/window-size/000077500000000000000000000000001465647402200176345ustar00rootroot00000000000000bubbletea-0.27.0/examples/window-size/main.go000066400000000000000000000014061465647402200211100ustar00rootroot00000000000000package main // A simple program that queries and displays the window-size. import ( "log" tea "github.com/charmbracelet/bubbletea" ) func main() { p := tea.NewProgram(model{}) if _, err := p.Run(); err != nil { log.Fatal(err) } } type model struct{} func (m model) Init() tea.Cmd { return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: if s := msg.String(); s == "ctrl+c" || s == "q" || s == "esc" { return m, tea.Quit } return m, tea.WindowSize() case tea.WindowSizeMsg: return m, tea.Printf("%dx%d", msg.Width, msg.Height) } return m, nil } func (m model) View() string { s := "When you're done press q to quit. Press any other key to query the window-size.\n" return s } bubbletea-0.27.0/exec.go000066400000000000000000000067341465647402200150240ustar00rootroot00000000000000package tea import ( "io" "os" "os/exec" ) // execMsg is used internally to run an ExecCommand sent with Exec. type execMsg struct { cmd ExecCommand fn ExecCallback } // Exec is used to perform arbitrary I/O in a blocking fashion, effectively // pausing the Program while execution is running and resuming it when // execution has completed. // // Most of the time you'll want to use ExecProcess, which runs an exec.Cmd. // // For non-interactive i/o you should use a Cmd (that is, a tea.Cmd). func Exec(c ExecCommand, fn ExecCallback) Cmd { return func() Msg { return execMsg{cmd: c, fn: fn} } } // ExecProcess runs the given *exec.Cmd in a blocking fashion, effectively // pausing the Program while the command is running. After the *exec.Cmd exists // the Program resumes. It's useful for spawning other interactive applications // such as editors and shells from within a Program. // // To produce the command, pass an *exec.Cmd and a function which returns // a message containing the error which may have occurred when running the // ExecCommand. // // type VimFinishedMsg struct { err error } // // c := exec.Command("vim", "file.txt") // // cmd := ExecProcess(c, func(err error) Msg { // return VimFinishedMsg{err: err} // }) // // Or, if you don't care about errors, you could simply: // // cmd := ExecProcess(exec.Command("vim", "file.txt"), nil) // // For non-interactive i/o you should use a Cmd (that is, a tea.Cmd). func ExecProcess(c *exec.Cmd, fn ExecCallback) Cmd { return Exec(wrapExecCommand(c), fn) } // ExecCallback is used when executing an *exec.Command to return a message // with an error, which may or may not be nil. type ExecCallback func(error) Msg // ExecCommand can be implemented to execute things in a blocking fashion in // the current terminal. type ExecCommand interface { Run() error SetStdin(io.Reader) SetStdout(io.Writer) SetStderr(io.Writer) } // wrapExecCommand wraps an exec.Cmd so that it satisfies the ExecCommand // interface so it can be used with Exec. func wrapExecCommand(c *exec.Cmd) ExecCommand { return &osExecCommand{Cmd: c} } // osExecCommand is a layer over an exec.Cmd that satisfies the ExecCommand // interface. type osExecCommand struct{ *exec.Cmd } // SetStdin sets stdin on underlying exec.Cmd to the given io.Reader. func (c *osExecCommand) SetStdin(r io.Reader) { // If unset, have the command use the same input as the terminal. if c.Stdin == nil { c.Stdin = r } } // SetStdout sets stdout on underlying exec.Cmd to the given io.Writer. func (c *osExecCommand) SetStdout(w io.Writer) { // If unset, have the command use the same output as the terminal. if c.Stdout == nil { c.Stdout = w } } // SetStderr sets stderr on the underlying exec.Cmd to the given io.Writer. func (c *osExecCommand) SetStderr(w io.Writer) { // If unset, use stderr for the command's stderr if c.Stderr == nil { c.Stderr = w } } // exec runs an ExecCommand and delivers the results to the program as a Msg. func (p *Program) exec(c ExecCommand, fn ExecCallback) { if err := p.ReleaseTerminal(); err != nil { // If we can't release input, abort. if fn != nil { go p.Send(fn(err)) } return } c.SetStdin(p.input) c.SetStdout(p.output) c.SetStderr(os.Stderr) // Execute system command. if err := c.Run(); err != nil { _ = p.RestoreTerminal() // also try to restore the terminal. if fn != nil { go p.Send(fn(err)) } return } // Have the program re-capture input. err := p.RestoreTerminal() if fn != nil { go p.Send(fn(err)) } } bubbletea-0.27.0/exec_test.go000066400000000000000000000025321465647402200160530ustar00rootroot00000000000000package tea import ( "bytes" "os/exec" "testing" ) type execFinishedMsg struct{ err error } type testExecModel struct { cmd string err error } func (m testExecModel) Init() Cmd { c := exec.Command(m.cmd) //nolint:gosec return ExecProcess(c, func(err error) Msg { return execFinishedMsg{err} }) } func (m *testExecModel) Update(msg Msg) (Model, Cmd) { switch msg := msg.(type) { case execFinishedMsg: if msg.err != nil { m.err = msg.err } return m, Quit } return m, nil } func (m *testExecModel) View() string { return "\n" } func TestTeaExec(t *testing.T) { tests := []struct { name string cmd string expectErr bool }{ { name: "true", cmd: "true", expectErr: false, }, { name: "false", cmd: "false", expectErr: true, }, { name: "invalid command", cmd: "invalid", expectErr: true, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testExecModel{cmd: test.cmd} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) if _, err := p.Run(); err != nil { t.Error(err) } if m.err != nil && !test.expectErr { t.Errorf("expected no error, got %v", m.err) } if m.err == nil && test.expectErr { t.Error("expected error, got nil") } }) } } bubbletea-0.27.0/go.mod000066400000000000000000000013261465647402200146470ustar00rootroot00000000000000module github.com/charmbracelet/bubbletea go 1.18 require ( github.com/charmbracelet/x/ansi v0.1.4 github.com/charmbracelet/x/term v0.1.1 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f github.com/mattn/go-localereader v0.0.1 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 github.com/muesli/cancelreader v0.2.2 golang.org/x/sync v0.8.0 golang.org/x/sys v0.24.0 ) require ( github.com/charmbracelet/x/input v0.1.0 // indirect github.com/charmbracelet/x/windows v0.1.0 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/text v0.3.8 // indirect ) bubbletea-0.27.0/go.sum000066400000000000000000000054541465647402200147020ustar00rootroot00000000000000github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/input v0.1.0 h1:TEsGSfZYQyOtp+STIjyBq6tpRaorH0qpwZUj8DavAhQ= github.com/charmbracelet/x/input v0.1.0/go.mod h1:ZZwaBxPF7IG8gWWzPUVqHEtWhc1+HXJPNuerJGRGZ28= github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= github.com/charmbracelet/x/windows v0.1.0 h1:gTaxdvzDM5oMa/I2ZNF7wN78X/atWemG9Wph7Ika2k4= github.com/charmbracelet/x/windows v0.1.0/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= bubbletea-0.27.0/inputreader_other.go000066400000000000000000000003241465647402200176100ustar00rootroot00000000000000//go:build !windows // +build !windows package tea import ( "io" "github.com/muesli/cancelreader" ) func newInputReader(r io.Reader) (cancelreader.CancelReader, error) { return cancelreader.NewReader(r) } bubbletea-0.27.0/inputreader_windows.go000066400000000000000000000042621465647402200201660ustar00rootroot00000000000000//go:build windows // +build windows package tea import ( "fmt" "io" "os" "sync" "github.com/charmbracelet/x/term" "github.com/erikgeiser/coninput" "github.com/muesli/cancelreader" "golang.org/x/sys/windows" ) type conInputReader struct { cancelMixin conin windows.Handle originalMode uint32 } var _ cancelreader.CancelReader = &conInputReader{} func newInputReader(r io.Reader) (cancelreader.CancelReader, error) { fallback := func(io.Reader) (cancelreader.CancelReader, error) { return cancelreader.NewReader(r) } if f, ok := r.(term.File); !ok || f.Fd() != os.Stdin.Fd() { return fallback(r) } conin, err := coninput.NewStdinHandle() if err != nil { return fallback(r) } originalMode, err := prepareConsole(conin, windows.ENABLE_MOUSE_INPUT, windows.ENABLE_WINDOW_INPUT, windows.ENABLE_EXTENDED_FLAGS, ) if err != nil { return nil, fmt.Errorf("failed to prepare console input: %w", err) } return &conInputReader{ conin: conin, originalMode: originalMode, }, nil } // Cancel implements cancelreader.CancelReader. func (r *conInputReader) Cancel() bool { r.setCanceled() return windows.CancelIo(r.conin) == nil } // Close implements cancelreader.CancelReader. func (r *conInputReader) Close() error { if r.originalMode != 0 { err := windows.SetConsoleMode(r.conin, r.originalMode) if err != nil { return fmt.Errorf("reset console mode: %w", err) } } return nil } // Read implements cancelreader.CancelReader. func (*conInputReader) Read(_ []byte) (n int, err error) { return 0, nil } func prepareConsole(input windows.Handle, modes ...uint32) (originalMode uint32, err error) { err = windows.GetConsoleMode(input, &originalMode) if err != nil { return 0, fmt.Errorf("get console mode: %w", err) } newMode := coninput.AddInputModes(0, modes...) err = windows.SetConsoleMode(input, newMode) if err != nil { return 0, fmt.Errorf("set console mode: %w", err) } return originalMode, nil } // cancelMixin represents a goroutine-safe cancelation status. type cancelMixin struct { unsafeCanceled bool lock sync.Mutex } func (c *cancelMixin) setCanceled() { c.lock.Lock() defer c.lock.Unlock() c.unsafeCanceled = true } bubbletea-0.27.0/key.go000066400000000000000000000522761465647402200146720ustar00rootroot00000000000000package tea import ( "context" "fmt" "io" "regexp" "strings" "unicode/utf8" ) // KeyMsg contains information about a keypress. KeyMsgs are always sent to // the program's update function. There are a couple general patterns you could // use to check for keypresses: // // // Switch on the string representation of the key (shorter) // switch msg := msg.(type) { // case KeyMsg: // switch msg.String() { // case "enter": // fmt.Println("you pressed enter!") // case "a": // fmt.Println("you pressed a!") // } // } // // // Switch on the key type (more foolproof) // switch msg := msg.(type) { // case KeyMsg: // switch msg.Type { // case KeyEnter: // fmt.Println("you pressed enter!") // case KeyRunes: // switch string(msg.Runes) { // case "a": // fmt.Println("you pressed a!") // } // } // } // // Note that Key.Runes will always contain at least one character, so you can // always safely call Key.Runes[0]. In most cases Key.Runes will only contain // one character, though certain input method editors (most notably Chinese // IMEs) can input multiple runes at once. type KeyMsg Key // String returns a string representation for a key message. It's safe (and // encouraged) for use in key comparison. func (k KeyMsg) String() (str string) { return Key(k).String() } // Key contains information about a keypress. type Key struct { Type KeyType Runes []rune Alt bool Paste bool } // String returns a friendly string representation for a key. It's safe (and // encouraged) for use in key comparison. // // k := Key{Type: KeyEnter} // fmt.Println(k) // // Output: enter func (k Key) String() (str string) { var buf strings.Builder if k.Alt { buf.WriteString("alt+") } if k.Type == KeyRunes { if k.Paste { // Note: bubbles/keys bindings currently do string compares to // recognize shortcuts. Since pasted text should never activate // shortcuts, we need to ensure that the binding code doesn't // match Key events that result from pastes. We achieve this // here by enclosing pastes in '[...]' so that the string // comparison in Matches() fails in that case. buf.WriteByte('[') } buf.WriteString(string(k.Runes)) if k.Paste { buf.WriteByte(']') } return buf.String() } else if s, ok := keyNames[k.Type]; ok { buf.WriteString(s) return buf.String() } return "" } // KeyType indicates the key pressed, such as KeyEnter or KeyBreak or KeyCtrlC. // All other keys will be type KeyRunes. To get the rune value, check the Rune // method on a Key struct, or use the Key.String() method: // // k := Key{Type: KeyRunes, Runes: []rune{'a'}, Alt: true} // if k.Type == KeyRunes { // // fmt.Println(k.Runes) // // Output: a // // fmt.Println(k.String()) // // Output: alt+a // // } type KeyType int func (k KeyType) String() (str string) { if s, ok := keyNames[k]; ok { return s } return "" } // Control keys. We could do this with an iota, but the values are very // specific, so we set the values explicitly to avoid any confusion. // // See also: // https://en.wikipedia.org/wiki/C0_and_C1_control_codes const ( keyNUL KeyType = 0 // null, \0 keySOH KeyType = 1 // start of heading keySTX KeyType = 2 // start of text keyETX KeyType = 3 // break, ctrl+c keyEOT KeyType = 4 // end of transmission keyENQ KeyType = 5 // enquiry keyACK KeyType = 6 // acknowledge keyBEL KeyType = 7 // bell, \a keyBS KeyType = 8 // backspace keyHT KeyType = 9 // horizontal tabulation, \t keyLF KeyType = 10 // line feed, \n keyVT KeyType = 11 // vertical tabulation \v keyFF KeyType = 12 // form feed \f keyCR KeyType = 13 // carriage return, \r keySO KeyType = 14 // shift out keySI KeyType = 15 // shift in keyDLE KeyType = 16 // data link escape keyDC1 KeyType = 17 // device control one keyDC2 KeyType = 18 // device control two keyDC3 KeyType = 19 // device control three keyDC4 KeyType = 20 // device control four keyNAK KeyType = 21 // negative acknowledge keySYN KeyType = 22 // synchronous idle keyETB KeyType = 23 // end of transmission block keyCAN KeyType = 24 // cancel keyEM KeyType = 25 // end of medium keySUB KeyType = 26 // substitution keyESC KeyType = 27 // escape, \e keyFS KeyType = 28 // file separator keyGS KeyType = 29 // group separator keyRS KeyType = 30 // record separator keyUS KeyType = 31 // unit separator keyDEL KeyType = 127 // delete. on most systems this is mapped to backspace, I hear ) // Control key aliases. const ( KeyNull KeyType = keyNUL KeyBreak KeyType = keyETX KeyEnter KeyType = keyCR KeyBackspace KeyType = keyDEL KeyTab KeyType = keyHT KeyEsc KeyType = keyESC KeyEscape KeyType = keyESC KeyCtrlAt KeyType = keyNUL // ctrl+@ KeyCtrlA KeyType = keySOH KeyCtrlB KeyType = keySTX KeyCtrlC KeyType = keyETX KeyCtrlD KeyType = keyEOT KeyCtrlE KeyType = keyENQ KeyCtrlF KeyType = keyACK KeyCtrlG KeyType = keyBEL KeyCtrlH KeyType = keyBS KeyCtrlI KeyType = keyHT KeyCtrlJ KeyType = keyLF KeyCtrlK KeyType = keyVT KeyCtrlL KeyType = keyFF KeyCtrlM KeyType = keyCR KeyCtrlN KeyType = keySO KeyCtrlO KeyType = keySI KeyCtrlP KeyType = keyDLE KeyCtrlQ KeyType = keyDC1 KeyCtrlR KeyType = keyDC2 KeyCtrlS KeyType = keyDC3 KeyCtrlT KeyType = keyDC4 KeyCtrlU KeyType = keyNAK KeyCtrlV KeyType = keySYN KeyCtrlW KeyType = keyETB KeyCtrlX KeyType = keyCAN KeyCtrlY KeyType = keyEM KeyCtrlZ KeyType = keySUB KeyCtrlOpenBracket KeyType = keyESC // ctrl+[ KeyCtrlBackslash KeyType = keyFS // ctrl+\ KeyCtrlCloseBracket KeyType = keyGS // ctrl+] KeyCtrlCaret KeyType = keyRS // ctrl+^ KeyCtrlUnderscore KeyType = keyUS // ctrl+_ KeyCtrlQuestionMark KeyType = keyDEL // ctrl+? ) // Other keys. const ( KeyRunes KeyType = -(iota + 1) KeyUp KeyDown KeyRight KeyLeft KeyShiftTab KeyHome KeyEnd KeyPgUp KeyPgDown KeyCtrlPgUp KeyCtrlPgDown KeyDelete KeyInsert KeySpace KeyCtrlUp KeyCtrlDown KeyCtrlRight KeyCtrlLeft KeyCtrlHome KeyCtrlEnd KeyShiftUp KeyShiftDown KeyShiftRight KeyShiftLeft KeyShiftHome KeyShiftEnd KeyCtrlShiftUp KeyCtrlShiftDown KeyCtrlShiftLeft KeyCtrlShiftRight KeyCtrlShiftHome KeyCtrlShiftEnd KeyF1 KeyF2 KeyF3 KeyF4 KeyF5 KeyF6 KeyF7 KeyF8 KeyF9 KeyF10 KeyF11 KeyF12 KeyF13 KeyF14 KeyF15 KeyF16 KeyF17 KeyF18 KeyF19 KeyF20 ) // Mappings for control keys and other special keys to friendly consts. var keyNames = map[KeyType]string{ // Control keys. keyNUL: "ctrl+@", // also ctrl+` (that's ctrl+backtick) keySOH: "ctrl+a", keySTX: "ctrl+b", keyETX: "ctrl+c", keyEOT: "ctrl+d", keyENQ: "ctrl+e", keyACK: "ctrl+f", keyBEL: "ctrl+g", keyBS: "ctrl+h", keyHT: "tab", // also ctrl+i keyLF: "ctrl+j", keyVT: "ctrl+k", keyFF: "ctrl+l", keyCR: "enter", keySO: "ctrl+n", keySI: "ctrl+o", keyDLE: "ctrl+p", keyDC1: "ctrl+q", keyDC2: "ctrl+r", keyDC3: "ctrl+s", keyDC4: "ctrl+t", keyNAK: "ctrl+u", keySYN: "ctrl+v", keyETB: "ctrl+w", keyCAN: "ctrl+x", keyEM: "ctrl+y", keySUB: "ctrl+z", keyESC: "esc", keyFS: "ctrl+\\", keyGS: "ctrl+]", keyRS: "ctrl+^", keyUS: "ctrl+_", keyDEL: "backspace", // Other keys. KeyRunes: "runes", KeyUp: "up", KeyDown: "down", KeyRight: "right", KeySpace: " ", // for backwards compatibility KeyLeft: "left", KeyShiftTab: "shift+tab", KeyHome: "home", KeyEnd: "end", KeyCtrlHome: "ctrl+home", KeyCtrlEnd: "ctrl+end", KeyShiftHome: "shift+home", KeyShiftEnd: "shift+end", KeyCtrlShiftHome: "ctrl+shift+home", KeyCtrlShiftEnd: "ctrl+shift+end", KeyPgUp: "pgup", KeyPgDown: "pgdown", KeyCtrlPgUp: "ctrl+pgup", KeyCtrlPgDown: "ctrl+pgdown", KeyDelete: "delete", KeyInsert: "insert", KeyCtrlUp: "ctrl+up", KeyCtrlDown: "ctrl+down", KeyCtrlRight: "ctrl+right", KeyCtrlLeft: "ctrl+left", KeyShiftUp: "shift+up", KeyShiftDown: "shift+down", KeyShiftRight: "shift+right", KeyShiftLeft: "shift+left", KeyCtrlShiftUp: "ctrl+shift+up", KeyCtrlShiftDown: "ctrl+shift+down", KeyCtrlShiftLeft: "ctrl+shift+left", KeyCtrlShiftRight: "ctrl+shift+right", KeyF1: "f1", KeyF2: "f2", KeyF3: "f3", KeyF4: "f4", KeyF5: "f5", KeyF6: "f6", KeyF7: "f7", KeyF8: "f8", KeyF9: "f9", KeyF10: "f10", KeyF11: "f11", KeyF12: "f12", KeyF13: "f13", KeyF14: "f14", KeyF15: "f15", KeyF16: "f16", KeyF17: "f17", KeyF18: "f18", KeyF19: "f19", KeyF20: "f20", } // Sequence mappings. var sequences = map[string]Key{ // Arrow keys "\x1b[A": {Type: KeyUp}, "\x1b[B": {Type: KeyDown}, "\x1b[C": {Type: KeyRight}, "\x1b[D": {Type: KeyLeft}, "\x1b[1;2A": {Type: KeyShiftUp}, "\x1b[1;2B": {Type: KeyShiftDown}, "\x1b[1;2C": {Type: KeyShiftRight}, "\x1b[1;2D": {Type: KeyShiftLeft}, "\x1b[OA": {Type: KeyShiftUp}, // DECCKM "\x1b[OB": {Type: KeyShiftDown}, // DECCKM "\x1b[OC": {Type: KeyShiftRight}, // DECCKM "\x1b[OD": {Type: KeyShiftLeft}, // DECCKM "\x1b[a": {Type: KeyShiftUp}, // urxvt "\x1b[b": {Type: KeyShiftDown}, // urxvt "\x1b[c": {Type: KeyShiftRight}, // urxvt "\x1b[d": {Type: KeyShiftLeft}, // urxvt "\x1b[1;3A": {Type: KeyUp, Alt: true}, "\x1b[1;3B": {Type: KeyDown, Alt: true}, "\x1b[1;3C": {Type: KeyRight, Alt: true}, "\x1b[1;3D": {Type: KeyLeft, Alt: true}, "\x1b[1;4A": {Type: KeyShiftUp, Alt: true}, "\x1b[1;4B": {Type: KeyShiftDown, Alt: true}, "\x1b[1;4C": {Type: KeyShiftRight, Alt: true}, "\x1b[1;4D": {Type: KeyShiftLeft, Alt: true}, "\x1b[1;5A": {Type: KeyCtrlUp}, "\x1b[1;5B": {Type: KeyCtrlDown}, "\x1b[1;5C": {Type: KeyCtrlRight}, "\x1b[1;5D": {Type: KeyCtrlLeft}, "\x1b[Oa": {Type: KeyCtrlUp, Alt: true}, // urxvt "\x1b[Ob": {Type: KeyCtrlDown, Alt: true}, // urxvt "\x1b[Oc": {Type: KeyCtrlRight, Alt: true}, // urxvt "\x1b[Od": {Type: KeyCtrlLeft, Alt: true}, // urxvt "\x1b[1;6A": {Type: KeyCtrlShiftUp}, "\x1b[1;6B": {Type: KeyCtrlShiftDown}, "\x1b[1;6C": {Type: KeyCtrlShiftRight}, "\x1b[1;6D": {Type: KeyCtrlShiftLeft}, "\x1b[1;7A": {Type: KeyCtrlUp, Alt: true}, "\x1b[1;7B": {Type: KeyCtrlDown, Alt: true}, "\x1b[1;7C": {Type: KeyCtrlRight, Alt: true}, "\x1b[1;7D": {Type: KeyCtrlLeft, Alt: true}, "\x1b[1;8A": {Type: KeyCtrlShiftUp, Alt: true}, "\x1b[1;8B": {Type: KeyCtrlShiftDown, Alt: true}, "\x1b[1;8C": {Type: KeyCtrlShiftRight, Alt: true}, "\x1b[1;8D": {Type: KeyCtrlShiftLeft, Alt: true}, // Miscellaneous keys "\x1b[Z": {Type: KeyShiftTab}, "\x1b[2~": {Type: KeyInsert}, "\x1b[3;2~": {Type: KeyInsert, Alt: true}, "\x1b[3~": {Type: KeyDelete}, "\x1b[3;3~": {Type: KeyDelete, Alt: true}, "\x1b[5~": {Type: KeyPgUp}, "\x1b[5;3~": {Type: KeyPgUp, Alt: true}, "\x1b[5;5~": {Type: KeyCtrlPgUp}, "\x1b[5^": {Type: KeyCtrlPgUp}, // urxvt "\x1b[5;7~": {Type: KeyCtrlPgUp, Alt: true}, "\x1b[6~": {Type: KeyPgDown}, "\x1b[6;3~": {Type: KeyPgDown, Alt: true}, "\x1b[6;5~": {Type: KeyCtrlPgDown}, "\x1b[6^": {Type: KeyCtrlPgDown}, // urxvt "\x1b[6;7~": {Type: KeyCtrlPgDown, Alt: true}, "\x1b[1~": {Type: KeyHome}, "\x1b[H": {Type: KeyHome}, // xterm, lxterm "\x1b[1;3H": {Type: KeyHome, Alt: true}, // xterm, lxterm "\x1b[1;5H": {Type: KeyCtrlHome}, // xterm, lxterm "\x1b[1;7H": {Type: KeyCtrlHome, Alt: true}, // xterm, lxterm "\x1b[1;2H": {Type: KeyShiftHome}, // xterm, lxterm "\x1b[1;4H": {Type: KeyShiftHome, Alt: true}, // xterm, lxterm "\x1b[1;6H": {Type: KeyCtrlShiftHome}, // xterm, lxterm "\x1b[1;8H": {Type: KeyCtrlShiftHome, Alt: true}, // xterm, lxterm "\x1b[4~": {Type: KeyEnd}, "\x1b[F": {Type: KeyEnd}, // xterm, lxterm "\x1b[1;3F": {Type: KeyEnd, Alt: true}, // xterm, lxterm "\x1b[1;5F": {Type: KeyCtrlEnd}, // xterm, lxterm "\x1b[1;7F": {Type: KeyCtrlEnd, Alt: true}, // xterm, lxterm "\x1b[1;2F": {Type: KeyShiftEnd}, // xterm, lxterm "\x1b[1;4F": {Type: KeyShiftEnd, Alt: true}, // xterm, lxterm "\x1b[1;6F": {Type: KeyCtrlShiftEnd}, // xterm, lxterm "\x1b[1;8F": {Type: KeyCtrlShiftEnd, Alt: true}, // xterm, lxterm "\x1b[7~": {Type: KeyHome}, // urxvt "\x1b[7^": {Type: KeyCtrlHome}, // urxvt "\x1b[7$": {Type: KeyShiftHome}, // urxvt "\x1b[7@": {Type: KeyCtrlShiftHome}, // urxvt "\x1b[8~": {Type: KeyEnd}, // urxvt "\x1b[8^": {Type: KeyCtrlEnd}, // urxvt "\x1b[8$": {Type: KeyShiftEnd}, // urxvt "\x1b[8@": {Type: KeyCtrlShiftEnd}, // urxvt // Function keys, Linux console "\x1b[[A": {Type: KeyF1}, // linux console "\x1b[[B": {Type: KeyF2}, // linux console "\x1b[[C": {Type: KeyF3}, // linux console "\x1b[[D": {Type: KeyF4}, // linux console "\x1b[[E": {Type: KeyF5}, // linux console // Function keys, X11 "\x1bOP": {Type: KeyF1}, // vt100, xterm "\x1bOQ": {Type: KeyF2}, // vt100, xterm "\x1bOR": {Type: KeyF3}, // vt100, xterm "\x1bOS": {Type: KeyF4}, // vt100, xterm "\x1b[1;3P": {Type: KeyF1, Alt: true}, // vt100, xterm "\x1b[1;3Q": {Type: KeyF2, Alt: true}, // vt100, xterm "\x1b[1;3R": {Type: KeyF3, Alt: true}, // vt100, xterm "\x1b[1;3S": {Type: KeyF4, Alt: true}, // vt100, xterm "\x1b[11~": {Type: KeyF1}, // urxvt "\x1b[12~": {Type: KeyF2}, // urxvt "\x1b[13~": {Type: KeyF3}, // urxvt "\x1b[14~": {Type: KeyF4}, // urxvt "\x1b[15~": {Type: KeyF5}, // vt100, xterm, also urxvt "\x1b[15;3~": {Type: KeyF5, Alt: true}, // vt100, xterm, also urxvt "\x1b[17~": {Type: KeyF6}, // vt100, xterm, also urxvt "\x1b[18~": {Type: KeyF7}, // vt100, xterm, also urxvt "\x1b[19~": {Type: KeyF8}, // vt100, xterm, also urxvt "\x1b[20~": {Type: KeyF9}, // vt100, xterm, also urxvt "\x1b[21~": {Type: KeyF10}, // vt100, xterm, also urxvt "\x1b[17;3~": {Type: KeyF6, Alt: true}, // vt100, xterm "\x1b[18;3~": {Type: KeyF7, Alt: true}, // vt100, xterm "\x1b[19;3~": {Type: KeyF8, Alt: true}, // vt100, xterm "\x1b[20;3~": {Type: KeyF9, Alt: true}, // vt100, xterm "\x1b[21;3~": {Type: KeyF10, Alt: true}, // vt100, xterm "\x1b[23~": {Type: KeyF11}, // vt100, xterm, also urxvt "\x1b[24~": {Type: KeyF12}, // vt100, xterm, also urxvt "\x1b[23;3~": {Type: KeyF11, Alt: true}, // vt100, xterm "\x1b[24;3~": {Type: KeyF12, Alt: true}, // vt100, xterm "\x1b[1;2P": {Type: KeyF13}, "\x1b[1;2Q": {Type: KeyF14}, "\x1b[25~": {Type: KeyF13}, // vt100, xterm, also urxvt "\x1b[26~": {Type: KeyF14}, // vt100, xterm, also urxvt "\x1b[25;3~": {Type: KeyF13, Alt: true}, // vt100, xterm "\x1b[26;3~": {Type: KeyF14, Alt: true}, // vt100, xterm "\x1b[1;2R": {Type: KeyF15}, "\x1b[1;2S": {Type: KeyF16}, "\x1b[28~": {Type: KeyF15}, // vt100, xterm, also urxvt "\x1b[29~": {Type: KeyF16}, // vt100, xterm, also urxvt "\x1b[28;3~": {Type: KeyF15, Alt: true}, // vt100, xterm "\x1b[29;3~": {Type: KeyF16, Alt: true}, // vt100, xterm "\x1b[15;2~": {Type: KeyF17}, "\x1b[17;2~": {Type: KeyF18}, "\x1b[18;2~": {Type: KeyF19}, "\x1b[19;2~": {Type: KeyF20}, "\x1b[31~": {Type: KeyF17}, "\x1b[32~": {Type: KeyF18}, "\x1b[33~": {Type: KeyF19}, "\x1b[34~": {Type: KeyF20}, // Powershell sequences. "\x1bOA": {Type: KeyUp, Alt: false}, "\x1bOB": {Type: KeyDown, Alt: false}, "\x1bOC": {Type: KeyRight, Alt: false}, "\x1bOD": {Type: KeyLeft, Alt: false}, } // unknownInputByteMsg is reported by the input reader when an invalid // utf-8 byte is detected on the input. Currently, it is not handled // further by bubbletea. However, having this event makes it possible // to troubleshoot invalid inputs. type unknownInputByteMsg byte func (u unknownInputByteMsg) String() string { return fmt.Sprintf("?%#02x?", int(u)) } // unknownCSISequenceMsg is reported by the input reader when an // unrecognized CSI sequence is detected on the input. Currently, it // is not handled further by bubbletea. However, having this event // makes it possible to troubleshoot invalid inputs. type unknownCSISequenceMsg []byte func (u unknownCSISequenceMsg) String() string { return fmt.Sprintf("?CSI%+v?", []byte(u)[2:]) } var spaceRunes = []rune{' '} // readAnsiInputs reads keypress and mouse inputs from a TTY and produces messages // containing information about the key or mouse events accordingly. func readAnsiInputs(ctx context.Context, msgs chan<- Msg, input io.Reader) error { var buf [256]byte var leftOverFromPrevIteration []byte loop: for { // Read and block. numBytes, err := input.Read(buf[:]) if err != nil { return fmt.Errorf("error reading input: %w", err) } b := buf[:numBytes] if leftOverFromPrevIteration != nil { b = append(leftOverFromPrevIteration, b...) } // If we had a short read (numBytes < len(buf)), we're sure that // the end of this read is an event boundary, so there is no doubt // if we are encountering the end of the buffer while parsing a message. // However, if we've succeeded in filling up the buffer, there may // be more data in the OS buffer ready to be read in, to complete // the last message in the input. In that case, we will retry with // the left over data in the next iteration. canHaveMoreData := numBytes == len(buf) var i, w int for i, w = 0, 0; i < len(b); i += w { var msg Msg w, msg = detectOneMsg(b[i:], canHaveMoreData) if w == 0 { // Expecting more bytes beyond the current buffer. Try waiting // for more input. leftOverFromPrevIteration = make([]byte, 0, len(b[i:])+len(buf)) leftOverFromPrevIteration = append(leftOverFromPrevIteration, b[i:]...) continue loop } select { case msgs <- msg: case <-ctx.Done(): err := ctx.Err() if err != nil { err = fmt.Errorf("found context error while reading input: %w", err) } return err } } leftOverFromPrevIteration = nil } } var ( unknownCSIRe = regexp.MustCompile(`^\x1b\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]`) mouseSGRRegex = regexp.MustCompile(`(\d+);(\d+);(\d+)([Mm])`) ) func detectOneMsg(b []byte, canHaveMoreData bool) (w int, msg Msg) { // Detect mouse events. // X10 mouse events have a length of 6 bytes const mouseEventX10Len = 6 if len(b) >= mouseEventX10Len && b[0] == '\x1b' && b[1] == '[' { switch b[2] { case 'M': return mouseEventX10Len, MouseMsg(parseX10MouseEvent(b)) case '<': if matchIndices := mouseSGRRegex.FindSubmatchIndex(b[3:]); matchIndices != nil { // SGR mouse events length is the length of the match plus the length of the escape sequence mouseEventSGRLen := matchIndices[1] + 3 //nolint:gomnd return mouseEventSGRLen, MouseMsg(parseSGRMouseEvent(b)) } } } // Detect bracketed paste. var foundbp bool foundbp, w, msg = detectBracketedPaste(b) if foundbp { return w, msg } // Detect escape sequence and control characters other than NUL, // possibly with an escape character in front to mark the Alt // modifier. var foundSeq bool foundSeq, w, msg = detectSequence(b) if foundSeq { return w, msg } // No non-NUL control character or escape sequence. // If we are seeing at least an escape character, remember it for later below. alt := false i := 0 if b[0] == '\x1b' { alt = true i++ } // Are we seeing a standalone NUL? This is not handled by detectSequence(). if i < len(b) && b[i] == 0 { return i + 1, KeyMsg{Type: keyNUL, Alt: alt} } // Find the longest sequence of runes that are not control // characters from this point. var runes []rune for rw := 0; i < len(b); i += rw { var r rune r, rw = utf8.DecodeRune(b[i:]) if r == utf8.RuneError || r <= rune(keyUS) || r == rune(keyDEL) || r == ' ' { // Rune errors are handled below; control characters and spaces will // be handled by detectSequence in the next call to detectOneMsg. break } runes = append(runes, r) if alt { // We only support a single rune after an escape alt modifier. i += rw break } } if i >= len(b) && canHaveMoreData { // We have encountered the end of the input buffer. Alas, we can't // be sure whether the data in the remainder of the buffer is // complete (maybe there was a short read). Instead of sending anything // dumb to the message channel, do a short read. The outer loop will // handle this case by extending the buffer as necessary. return 0, nil } // If we found at least one rune, we report the bunch of them as // a single KeyRunes or KeySpace event. if len(runes) > 0 { k := Key{Type: KeyRunes, Runes: runes, Alt: alt} if len(runes) == 1 && runes[0] == ' ' { k.Type = KeySpace } return i, KeyMsg(k) } // We didn't find an escape sequence, nor a valid rune. Was this a // lone escape character at the end of the input? if alt && len(b) == 1 { return 1, KeyMsg(Key{Type: KeyEscape}) } // The character at the current position is neither an escape // sequence, a valid rune start or a sole escape character. Report // it as an invalid byte. return 1, unknownInputByteMsg(b[0]) } bubbletea-0.27.0/key_other.go000066400000000000000000000003141465647402200160550ustar00rootroot00000000000000//go:build !windows // +build !windows package tea import ( "context" "io" ) func readInputs(ctx context.Context, msgs chan<- Msg, input io.Reader) error { return readAnsiInputs(ctx, msgs, input) } bubbletea-0.27.0/key_sequences.go000066400000000000000000000062141465647402200167340ustar00rootroot00000000000000package tea import ( "bytes" "sort" "unicode/utf8" ) // extSequences is used by the map-based algorithm below. It contains // the sequences plus their alternatives with an escape character // prefixed, plus the control chars, plus the space. // It does not contain the NUL character, which is handled specially // by detectOneMsg. var extSequences = func() map[string]Key { s := map[string]Key{} for seq, key := range sequences { key := key s[seq] = key if !key.Alt { key.Alt = true s["\x1b"+seq] = key } } for i := keyNUL + 1; i <= keyDEL; i++ { if i == keyESC { continue } s[string([]byte{byte(i)})] = Key{Type: i} s[string([]byte{'\x1b', byte(i)})] = Key{Type: i, Alt: true} if i == keyUS { i = keyDEL - 1 } } s[" "] = Key{Type: KeySpace, Runes: spaceRunes} s["\x1b "] = Key{Type: KeySpace, Alt: true, Runes: spaceRunes} s["\x1b\x1b"] = Key{Type: KeyEscape, Alt: true} return s }() // seqLengths is the sizes of valid sequences, starting with the // largest size. var seqLengths = func() []int { sizes := map[int]struct{}{} for seq := range extSequences { sizes[len(seq)] = struct{}{} } lsizes := make([]int, 0, len(sizes)) for sz := range sizes { lsizes = append(lsizes, sz) } sort.Slice(lsizes, func(i, j int) bool { return lsizes[i] > lsizes[j] }) return lsizes }() // detectSequence uses a longest prefix match over the input // sequence and a hash map. func detectSequence(input []byte) (hasSeq bool, width int, msg Msg) { seqs := extSequences for _, sz := range seqLengths { if sz > len(input) { continue } prefix := input[:sz] key, ok := seqs[string(prefix)] if ok { return true, sz, KeyMsg(key) } } // Is this an unknown CSI sequence? if loc := unknownCSIRe.FindIndex(input); loc != nil { return true, loc[1], unknownCSISequenceMsg(input[:loc[1]]) } return false, 0, nil } // detectBracketedPaste detects an input pasted while bracketed // paste mode was enabled. // // Note: this function is a no-op if bracketed paste was not enabled // on the terminal, since in that case we'd never see this // particular escape sequence. func detectBracketedPaste(input []byte) (hasBp bool, width int, msg Msg) { // Detect the start sequence. const bpStart = "\x1b[200~" if len(input) < len(bpStart) || string(input[:len(bpStart)]) != bpStart { return false, 0, nil } // Skip over the start sequence. input = input[len(bpStart):] // If we saw the start sequence, then we must have an end sequence // as well. Find it. const bpEnd = "\x1b[201~" idx := bytes.Index(input, []byte(bpEnd)) inputLen := len(bpStart) + idx + len(bpEnd) if idx == -1 { // We have encountered the end of the input buffer without seeing // the marker for the end of the bracketed paste. // Tell the outer loop we have done a short read and we want more. return true, 0, nil } // The paste is everything in-between. paste := input[:idx] // All there is in-between is runes, not to be interpreted further. k := Key{Type: KeyRunes, Paste: true} for len(paste) > 0 { r, w := utf8.DecodeRune(paste) if r != utf8.RuneError { k.Runes = append(k.Runes, r) } paste = paste[w:] } return true, inputLen, KeyMsg(k) } bubbletea-0.27.0/key_test.go000066400000000000000000000372501465647402200157240ustar00rootroot00000000000000package tea import ( "bytes" "context" "errors" "flag" "fmt" "io" "math/rand" "reflect" "runtime" "sort" "strings" "sync" "testing" "time" ) func TestKeyString(t *testing.T) { t.Run("alt+space", func(t *testing.T) { if got := KeyMsg(Key{ Type: KeySpace, Alt: true, }).String(); got != "alt+ " { t.Fatalf(`expected a "alt+ ", got %q`, got) } }) t.Run("runes", func(t *testing.T) { if got := KeyMsg(Key{ Type: KeyRunes, Runes: []rune{'a'}, }).String(); got != "a" { t.Fatalf(`expected an "a", got %q`, got) } }) t.Run("invalid", func(t *testing.T) { if got := KeyMsg(Key{ Type: KeyType(99999), }).String(); got != "" { t.Fatalf(`expected a "", got %q`, got) } }) } func TestKeyTypeString(t *testing.T) { t.Run("space", func(t *testing.T) { if got := KeySpace.String(); got != " " { t.Fatalf(`expected a " ", got %q`, got) } }) t.Run("invalid", func(t *testing.T) { if got := KeyType(99999).String(); got != "" { t.Fatalf(`expected a "", got %q`, got) } }) } type seqTest struct { seq []byte msg Msg } // buildBaseSeqTests returns sequence tests that are valid for the // detectSequence() function. func buildBaseSeqTests() []seqTest { td := []seqTest{} for seq, key := range sequences { key := key td = append(td, seqTest{[]byte(seq), KeyMsg(key)}) if !key.Alt { key.Alt = true td = append(td, seqTest{[]byte("\x1b" + seq), KeyMsg(key)}) } } // Add all the control characters. for i := keyNUL + 1; i <= keyDEL; i++ { if i == keyESC { // Not handled in detectSequence(), so not part of the base test // suite. continue } td = append(td, seqTest{[]byte{byte(i)}, KeyMsg{Type: i}}) td = append(td, seqTest{[]byte{'\x1b', byte(i)}, KeyMsg{Type: i, Alt: true}}) if i == keyUS { i = keyDEL - 1 } } // Additional special cases. td = append(td, // Unrecognized CSI sequence. seqTest{ []byte{'\x1b', '[', '-', '-', '-', '-', 'X'}, unknownCSISequenceMsg([]byte{'\x1b', '[', '-', '-', '-', '-', 'X'}), }, // A lone space character. seqTest{ []byte{' '}, KeyMsg{Type: KeySpace, Runes: []rune(" ")}, }, // An escape character with the alt modifier. seqTest{ []byte{'\x1b', ' '}, KeyMsg{Type: KeySpace, Runes: []rune(" "), Alt: true}, }, ) return td } func TestDetectSequence(t *testing.T) { td := buildBaseSeqTests() for _, tc := range td { t.Run(fmt.Sprintf("%q", string(tc.seq)), func(t *testing.T) { hasSeq, width, msg := detectSequence(tc.seq) if !hasSeq { t.Fatalf("no sequence found") } if width != len(tc.seq) { t.Errorf("parser did not consume the entire input: got %d, expected %d", width, len(tc.seq)) } if !reflect.DeepEqual(tc.msg, msg) { t.Errorf("expected event %#v (%T), got %#v (%T)", tc.msg, tc.msg, msg, msg) } }) } } func TestDetectOneMsg(t *testing.T) { td := buildBaseSeqTests() // Add tests for the inputs that detectOneMsg() can parse, but // detectSequence() cannot. td = append(td, // Mouse event. seqTest{ []byte{'\x1b', '[', 'M', byte(32) + 0b0100_0000, byte(65), byte(49)}, MouseMsg{X: 32, Y: 16, Type: MouseWheelUp, Button: MouseButtonWheelUp, Action: MouseActionPress}, }, // SGR Mouse event. seqTest{ []byte("\x1b[<0;33;17M"), MouseMsg{X: 32, Y: 16, Type: MouseLeft, Button: MouseButtonLeft, Action: MouseActionPress}, }, // Runes. seqTest{ []byte{'a'}, KeyMsg{Type: KeyRunes, Runes: []rune("a")}, }, seqTest{ []byte{'\x1b', 'a'}, KeyMsg{Type: KeyRunes, Runes: []rune("a"), Alt: true}, }, seqTest{ []byte{'a', 'a', 'a'}, KeyMsg{Type: KeyRunes, Runes: []rune("aaa")}, }, // Multi-byte rune. seqTest{ []byte("☃"), KeyMsg{Type: KeyRunes, Runes: []rune("☃")}, }, seqTest{ []byte("\x1b☃"), KeyMsg{Type: KeyRunes, Runes: []rune("☃"), Alt: true}, }, // Standalone control chacters. seqTest{ []byte{'\x1b'}, KeyMsg{Type: KeyEscape}, }, seqTest{ []byte{byte(keySOH)}, KeyMsg{Type: KeyCtrlA}, }, seqTest{ []byte{'\x1b', byte(keySOH)}, KeyMsg{Type: KeyCtrlA, Alt: true}, }, seqTest{ []byte{byte(keyNUL)}, KeyMsg{Type: KeyCtrlAt}, }, seqTest{ []byte{'\x1b', byte(keyNUL)}, KeyMsg{Type: KeyCtrlAt, Alt: true}, }, // Invalid characters. seqTest{ []byte{'\x80'}, unknownInputByteMsg(0x80), }, ) if runtime.GOOS != "windows" { // Sadly, utf8.DecodeRune([]byte(0xfe)) returns a valid rune on windows. // This is incorrect, but it makes our test fail if we try it out. td = append(td, seqTest{ []byte{'\xfe'}, unknownInputByteMsg(0xfe), }) } for _, tc := range td { t.Run(fmt.Sprintf("%q", string(tc.seq)), func(t *testing.T) { width, msg := detectOneMsg(tc.seq, false /* canHaveMoreData */) if width != len(tc.seq) { t.Errorf("parser did not consume the entire input: got %d, expected %d", width, len(tc.seq)) } if !reflect.DeepEqual(tc.msg, msg) { t.Errorf("expected event %#v (%T), got %#v (%T)", tc.msg, tc.msg, msg, msg) } }) } } func TestReadLongInput(t *testing.T) { input := strings.Repeat("a", 1000) msgs := testReadInputs(t, bytes.NewReader([]byte(input))) if len(msgs) != 1 { t.Errorf("expected 1 messages, got %d", len(msgs)) } km := msgs[0] k := Key(km.(KeyMsg)) if k.Type != KeyRunes { t.Errorf("expected key runes, got %d", k.Type) } if len(k.Runes) != 1000 || !reflect.DeepEqual(k.Runes, []rune(input)) { t.Errorf("unexpected runes: %+v", k) } if k.Alt { t.Errorf("unexpected alt") } } func TestReadInput(t *testing.T) { type test struct { keyname string in []byte out []Msg } testData := []test{ {"a", []byte{'a'}, []Msg{ KeyMsg{ Type: KeyRunes, Runes: []rune{'a'}, }, }, }, {" ", []byte{' '}, []Msg{ KeyMsg{ Type: KeySpace, Runes: []rune{' '}, }, }, }, {"a alt+a", []byte{'a', '\x1b', 'a'}, []Msg{ KeyMsg{Type: KeyRunes, Runes: []rune{'a'}}, KeyMsg{Type: KeyRunes, Runes: []rune{'a'}, Alt: true}, }, }, {"a alt+a a", []byte{'a', '\x1b', 'a', 'a'}, []Msg{ KeyMsg{Type: KeyRunes, Runes: []rune{'a'}}, KeyMsg{Type: KeyRunes, Runes: []rune{'a'}, Alt: true}, KeyMsg{Type: KeyRunes, Runes: []rune{'a'}}, }, }, {"ctrl+a", []byte{byte(keySOH)}, []Msg{ KeyMsg{ Type: KeyCtrlA, }, }, }, {"ctrl+a ctrl+b", []byte{byte(keySOH), byte(keySTX)}, []Msg{ KeyMsg{Type: KeyCtrlA}, KeyMsg{Type: KeyCtrlB}, }, }, {"alt+a", []byte{byte(0x1b), 'a'}, []Msg{ KeyMsg{ Type: KeyRunes, Alt: true, Runes: []rune{'a'}, }, }, }, {"abcd", []byte{'a', 'b', 'c', 'd'}, []Msg{ KeyMsg{ Type: KeyRunes, Runes: []rune{'a', 'b', 'c', 'd'}, }, }, }, {"up", []byte("\x1b[A"), []Msg{ KeyMsg{ Type: KeyUp, }, }, }, {"wheel up", []byte{'\x1b', '[', 'M', byte(32) + 0b0100_0000, byte(65), byte(49)}, []Msg{ MouseMsg{ X: 32, Y: 16, Type: MouseWheelUp, Button: MouseButtonWheelUp, Action: MouseActionPress, }, }, }, {"left motion release", []byte{ '\x1b', '[', 'M', byte(32) + 0b0010_0000, byte(32 + 33), byte(16 + 33), '\x1b', '[', 'M', byte(32) + 0b0000_0011, byte(64 + 33), byte(32 + 33), }, []Msg{ MouseMsg(MouseEvent{ X: 32, Y: 16, Type: MouseLeft, Button: MouseButtonLeft, Action: MouseActionMotion, }), MouseMsg(MouseEvent{ X: 64, Y: 32, Type: MouseRelease, Button: MouseButtonNone, Action: MouseActionRelease, }), }, }, {"shift+tab", []byte{'\x1b', '[', 'Z'}, []Msg{ KeyMsg{ Type: KeyShiftTab, }, }, }, {"enter", []byte{'\r'}, []Msg{KeyMsg{Type: KeyEnter}}, }, {"alt+enter", []byte{'\x1b', '\r'}, []Msg{ KeyMsg{ Type: KeyEnter, Alt: true, }, }, }, {"insert", []byte{'\x1b', '[', '2', '~'}, []Msg{ KeyMsg{ Type: KeyInsert, }, }, }, {"alt+ctrl+a", []byte{'\x1b', byte(keySOH)}, []Msg{ KeyMsg{ Type: KeyCtrlA, Alt: true, }, }, }, {"?CSI[45 45 45 45 88]?", []byte{'\x1b', '[', '-', '-', '-', '-', 'X'}, []Msg{unknownCSISequenceMsg([]byte{'\x1b', '[', '-', '-', '-', '-', 'X'})}, }, // Powershell sequences. {"up", []byte{'\x1b', 'O', 'A'}, []Msg{KeyMsg{Type: KeyUp}}, }, {"down", []byte{'\x1b', 'O', 'B'}, []Msg{KeyMsg{Type: KeyDown}}, }, {"right", []byte{'\x1b', 'O', 'C'}, []Msg{KeyMsg{Type: KeyRight}}, }, {"left", []byte{'\x1b', 'O', 'D'}, []Msg{KeyMsg{Type: KeyLeft}}, }, {"alt+enter", []byte{'\x1b', '\x0d'}, []Msg{KeyMsg{Type: KeyEnter, Alt: true}}, }, {"alt+backspace", []byte{'\x1b', '\x7f'}, []Msg{KeyMsg{Type: KeyBackspace, Alt: true}}, }, {"ctrl+@", []byte{'\x00'}, []Msg{KeyMsg{Type: KeyCtrlAt}}, }, {"alt+ctrl+@", []byte{'\x1b', '\x00'}, []Msg{KeyMsg{Type: KeyCtrlAt, Alt: true}}, }, {"esc", []byte{'\x1b'}, []Msg{KeyMsg{Type: KeyEsc}}, }, {"alt+esc", []byte{'\x1b', '\x1b'}, []Msg{KeyMsg{Type: KeyEsc, Alt: true}}, }, {"[a b] o", []byte{ '\x1b', '[', '2', '0', '0', '~', 'a', ' ', 'b', '\x1b', '[', '2', '0', '1', '~', 'o', }, []Msg{ KeyMsg{Type: KeyRunes, Runes: []rune("a b"), Paste: true}, KeyMsg{Type: KeyRunes, Runes: []rune("o")}, }, }, {"[a\x03\nb]", []byte{ '\x1b', '[', '2', '0', '0', '~', 'a', '\x03', '\n', 'b', '\x1b', '[', '2', '0', '1', '~'}, []Msg{ KeyMsg{Type: KeyRunes, Runes: []rune("a\x03\nb"), Paste: true}, }, }, } if runtime.GOOS != "windows" { // Sadly, utf8.DecodeRune([]byte(0xfe)) returns a valid rune on windows. // This is incorrect, but it makes our test fail if we try it out. testData = append(testData, test{"?0xfe?", []byte{'\xfe'}, []Msg{unknownInputByteMsg(0xfe)}, }, test{"a ?0xfe? b", []byte{'a', '\xfe', ' ', 'b'}, []Msg{ KeyMsg{Type: KeyRunes, Runes: []rune{'a'}}, unknownInputByteMsg(0xfe), KeyMsg{Type: KeySpace, Runes: []rune{' '}}, KeyMsg{Type: KeyRunes, Runes: []rune{'b'}}, }, }, ) } for i, td := range testData { t.Run(fmt.Sprintf("%d: %s", i, td.keyname), func(t *testing.T) { msgs := testReadInputs(t, bytes.NewReader(td.in)) var buf strings.Builder for i, msg := range msgs { if i > 0 { buf.WriteByte(' ') } if s, ok := msg.(fmt.Stringer); ok { buf.WriteString(s.String()) } else { fmt.Fprintf(&buf, "%#v:%T", msg, msg) } } title := buf.String() if title != td.keyname { t.Errorf("expected message titles:\n %s\ngot:\n %s", td.keyname, title) } if len(msgs) != len(td.out) { t.Fatalf("unexpected message list length: got %d, expected %d\n%#v", len(msgs), len(td.out), msgs) } if !reflect.DeepEqual(td.out, msgs) { t.Fatalf("expected:\n%#v\ngot:\n%#v", td.out, msgs) } }) } } func testReadInputs(t *testing.T, input io.Reader) []Msg { // We'll check that the input reader finishes at the end // without error. var wg sync.WaitGroup var inputErr error ctx, cancel := context.WithCancel(context.Background()) defer func() { cancel() wg.Wait() if inputErr != nil && !errors.Is(inputErr, io.EOF) { t.Fatalf("unexpected input error: %v", inputErr) } }() // The messages we're consuming. msgsC := make(chan Msg) // Start the reader in the background. wg.Add(1) go func() { defer wg.Done() inputErr = readAnsiInputs(ctx, msgsC, input) msgsC <- nil }() var msgs []Msg loop: for { select { case msg := <-msgsC: if msg == nil { // end of input marker for the test. break loop } msgs = append(msgs, msg) case <-time.After(2 * time.Second): t.Errorf("timeout waiting for input event") break loop } } return msgs } // randTest defines the test input and expected output for a sequence // of interleaved control sequences and control characters. type randTest struct { data []byte lengths []int names []string } // seed is the random seed to randomize the input. This helps check // that all the sequences get ultimately exercised. var seed = flag.Int64("seed", 0, "random seed (0 to autoselect)") // genRandomData generates a randomized test, with a random seed unless // the seed flag was set. func genRandomData(logfn func(int64), length int) randTest { // We'll use a random source. However, we give the user the option // to override it to a specific value for reproduceability. s := *seed if s == 0 { s = time.Now().UnixNano() } // Inform the user so they know what to reuse to get the same data. logfn(s) return genRandomDataWithSeed(s, length) } // genRandomDataWithSeed generates a randomized test with a fixed seed. func genRandomDataWithSeed(s int64, length int) randTest { src := rand.NewSource(s) r := rand.New(src) // allseqs contains all the sequences, in sorted order. We sort // to make the test deterministic (when the seed is also fixed). type seqpair struct { seq string name string } var allseqs []seqpair for seq, key := range sequences { allseqs = append(allseqs, seqpair{seq, key.String()}) } sort.Slice(allseqs, func(i, j int) bool { return allseqs[i].seq < allseqs[j].seq }) // res contains the computed test. var res randTest for len(res.data) < length { alt := r.Intn(2) prefix := "" esclen := 0 if alt == 1 { prefix = "alt+" esclen = 1 } kind := r.Intn(3) switch kind { case 0: // A control character. if alt == 1 { res.data = append(res.data, '\x1b') } res.data = append(res.data, 1) res.names = append(res.names, prefix+"ctrl+a") res.lengths = append(res.lengths, 1+esclen) case 1, 2: // A sequence. seqi := r.Intn(len(allseqs)) s := allseqs[seqi] if strings.HasPrefix(s.name, "alt+") { esclen = 0 prefix = "" alt = 0 } if alt == 1 { res.data = append(res.data, '\x1b') } res.data = append(res.data, s.seq...) res.names = append(res.names, prefix+s.name) res.lengths = append(res.lengths, len(s.seq)+esclen) } } return res } // TestDetectRandomSequencesLex checks that the lex-generated sequence // detector works over concatenations of random sequences. func TestDetectRandomSequencesLex(t *testing.T) { runTestDetectSequence(t, detectSequence) } func runTestDetectSequence( t *testing.T, detectSequence func(input []byte) (hasSeq bool, width int, msg Msg), ) { for i := 0; i < 10; i++ { t.Run("", func(t *testing.T) { td := genRandomData(func(s int64) { t.Logf("using random seed: %d", s) }, 1000) t.Logf("%#v", td) // tn is the event number in td. // i is the cursor in the input data. // w is the length of the last sequence detected. for tn, i, w := 0, 0, 0; i < len(td.data); tn, i = tn+1, i+w { hasSequence, width, msg := detectSequence(td.data[i:]) if !hasSequence { t.Fatalf("at %d (ev %d): failed to find sequence", i, tn) } if width != td.lengths[tn] { t.Errorf("at %d (ev %d): expected width %d, got %d", i, tn, td.lengths[tn], width) } w = width s, ok := msg.(fmt.Stringer) if !ok { t.Errorf("at %d (ev %d): expected stringer event, got %T", i, tn, msg) } else { if td.names[tn] != s.String() { t.Errorf("at %d (ev %d): expected event %q, got %q", i, tn, td.names[tn], s.String()) } } } }) } } // TestDetectRandomSequencesMap checks that the map-based sequence // detector works over concatenations of random sequences. func TestDetectRandomSequencesMap(t *testing.T) { runTestDetectSequence(t, detectSequence) } // BenchmarkDetectSequenceMap benchmarks the map-based sequence // detector. func BenchmarkDetectSequenceMap(b *testing.B) { td := genRandomDataWithSeed(123, 10000) for i := 0; i < b.N; i++ { for j, w := 0, 0; j < len(td.data); j += w { _, w, _ = detectSequence(td.data[j:]) } } } bubbletea-0.27.0/key_windows.go000066400000000000000000000202521465647402200164310ustar00rootroot00000000000000//go:build windows // +build windows package tea import ( "context" "fmt" "io" "github.com/erikgeiser/coninput" localereader "github.com/mattn/go-localereader" "golang.org/x/sys/windows" ) func readInputs(ctx context.Context, msgs chan<- Msg, input io.Reader) error { if coninReader, ok := input.(*conInputReader); ok { return readConInputs(ctx, msgs, coninReader.conin) } return readAnsiInputs(ctx, msgs, localereader.NewReader(input)) } func readConInputs(ctx context.Context, msgsch chan<- Msg, con windows.Handle) error { var ps coninput.ButtonState // keep track of previous mouse state var ws coninput.WindowBufferSizeEventRecord // keep track of the last window size event for { events, err := coninput.ReadNConsoleInputs(con, 16) if err != nil { return fmt.Errorf("read coninput events: %w", err) } for _, event := range events { var msgs []Msg switch e := event.Unwrap().(type) { case coninput.KeyEventRecord: if !e.KeyDown || e.VirtualKeyCode == coninput.VK_SHIFT { continue } for i := 0; i < int(e.RepeatCount); i++ { eventKeyType := keyType(e) var runes []rune // Add the character only if the key type is an actual character and not a control sequence. // This mimics the behavior in readAnsiInputs where the character is also removed. // We don't need to handle KeySpace here. See the comment in keyType(). if eventKeyType == KeyRunes { runes = []rune{e.Char} } msgs = append(msgs, KeyMsg{ Type: eventKeyType, Runes: runes, Alt: e.ControlKeyState.Contains(coninput.LEFT_ALT_PRESSED | coninput.RIGHT_ALT_PRESSED), }) } case coninput.WindowBufferSizeEventRecord: if e != ws { ws = e msgs = append(msgs, WindowSizeMsg{ Width: int(e.Size.X), Height: int(e.Size.Y), }) } case coninput.MouseEventRecord: event := mouseEvent(ps, e) if event.Type != MouseUnknown { msgs = append(msgs, event) } ps = e.ButtonState case coninput.FocusEventRecord, coninput.MenuEventRecord: // ignore default: // unknown event continue } // Send all messages to the channel for _, msg := range msgs { select { case msgsch <- msg: case <-ctx.Done(): err := ctx.Err() if err != nil { return fmt.Errorf("coninput context error: %w", err) } return err } } } } } func mouseEventButton(p, s coninput.ButtonState) (button MouseButton, action MouseAction) { btn := p ^ s action = MouseActionPress if btn&s == 0 { action = MouseActionRelease } if btn == 0 { switch { case s&coninput.FROM_LEFT_1ST_BUTTON_PRESSED > 0: button = MouseButtonLeft case s&coninput.FROM_LEFT_2ND_BUTTON_PRESSED > 0: button = MouseButtonMiddle case s&coninput.RIGHTMOST_BUTTON_PRESSED > 0: button = MouseButtonRight case s&coninput.FROM_LEFT_3RD_BUTTON_PRESSED > 0: button = MouseButtonBackward case s&coninput.FROM_LEFT_4TH_BUTTON_PRESSED > 0: button = MouseButtonForward } return } switch { case btn == coninput.FROM_LEFT_1ST_BUTTON_PRESSED: // left button button = MouseButtonLeft case btn == coninput.RIGHTMOST_BUTTON_PRESSED: // right button button = MouseButtonRight case btn == coninput.FROM_LEFT_2ND_BUTTON_PRESSED: // middle button button = MouseButtonMiddle case btn == coninput.FROM_LEFT_3RD_BUTTON_PRESSED: // unknown (possibly mouse backward) button = MouseButtonBackward case btn == coninput.FROM_LEFT_4TH_BUTTON_PRESSED: // unknown (possibly mouse forward) button = MouseButtonForward } return button, action } func mouseEvent(p coninput.ButtonState, e coninput.MouseEventRecord) MouseMsg { ev := MouseMsg{ X: int(e.MousePositon.X), Y: int(e.MousePositon.Y), Alt: e.ControlKeyState.Contains(coninput.LEFT_ALT_PRESSED | coninput.RIGHT_ALT_PRESSED), Ctrl: e.ControlKeyState.Contains(coninput.LEFT_CTRL_PRESSED | coninput.RIGHT_CTRL_PRESSED), Shift: e.ControlKeyState.Contains(coninput.SHIFT_PRESSED), } switch e.EventFlags { case coninput.CLICK, coninput.DOUBLE_CLICK: ev.Button, ev.Action = mouseEventButton(p, e.ButtonState) if ev.Action == MouseActionRelease { ev.Type = MouseRelease } switch ev.Button { case MouseButtonLeft: ev.Type = MouseLeft case MouseButtonMiddle: ev.Type = MouseMiddle case MouseButtonRight: ev.Type = MouseRight case MouseButtonBackward: ev.Type = MouseBackward case MouseButtonForward: ev.Type = MouseForward } case coninput.MOUSE_WHEELED: if e.WheelDirection > 0 { ev.Button = MouseButtonWheelUp ev.Type = MouseWheelUp } else { ev.Button = MouseButtonWheelDown ev.Type = MouseWheelDown } case coninput.MOUSE_HWHEELED: if e.WheelDirection > 0 { ev.Button = MouseButtonWheelRight ev.Type = MouseWheelRight } else { ev.Button = MouseButtonWheelLeft ev.Type = MouseWheelLeft } case coninput.MOUSE_MOVED: ev.Button, _ = mouseEventButton(p, e.ButtonState) ev.Action = MouseActionMotion ev.Type = MouseMotion } return ev } func keyType(e coninput.KeyEventRecord) KeyType { code := e.VirtualKeyCode shiftPressed := e.ControlKeyState.Contains(coninput.SHIFT_PRESSED) ctrlPressed := e.ControlKeyState.Contains(coninput.LEFT_CTRL_PRESSED | coninput.RIGHT_CTRL_PRESSED) switch code { case coninput.VK_RETURN: return KeyEnter case coninput.VK_BACK: return KeyBackspace case coninput.VK_TAB: if shiftPressed { return KeyShiftTab } return KeyTab case coninput.VK_SPACE: return KeyRunes // this could be KeySpace but on unix space also produces KeyRunes case coninput.VK_ESCAPE: return KeyEscape case coninput.VK_UP: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftUp case shiftPressed: return KeyShiftUp case ctrlPressed: return KeyCtrlUp default: return KeyUp } case coninput.VK_DOWN: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftDown case shiftPressed: return KeyShiftDown case ctrlPressed: return KeyCtrlDown default: return KeyDown } case coninput.VK_RIGHT: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftRight case shiftPressed: return KeyShiftRight case ctrlPressed: return KeyCtrlRight default: return KeyRight } case coninput.VK_LEFT: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftLeft case shiftPressed: return KeyShiftLeft case ctrlPressed: return KeyCtrlLeft default: return KeyLeft } case coninput.VK_HOME: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftHome case shiftPressed: return KeyShiftHome case ctrlPressed: return KeyCtrlHome default: return KeyHome } case coninput.VK_END: switch { case shiftPressed && ctrlPressed: return KeyCtrlShiftEnd case shiftPressed: return KeyShiftEnd case ctrlPressed: return KeyCtrlEnd default: return KeyEnd } case coninput.VK_PRIOR: return KeyPgUp case coninput.VK_NEXT: return KeyPgDown case coninput.VK_DELETE: return KeyDelete default: if e.ControlKeyState&(coninput.LEFT_CTRL_PRESSED|coninput.RIGHT_CTRL_PRESSED) == 0 { return KeyRunes } switch e.Char { case '@': return KeyCtrlAt case '\x01': return KeyCtrlA case '\x02': return KeyCtrlB case '\x03': return KeyCtrlC case '\x04': return KeyCtrlD case '\x05': return KeyCtrlE case '\x06': return KeyCtrlF case '\a': return KeyCtrlG case '\b': return KeyCtrlH case '\t': return KeyCtrlI case '\n': return KeyCtrlJ case '\v': return KeyCtrlK case '\f': return KeyCtrlL case '\r': return KeyCtrlM case '\x0e': return KeyCtrlN case '\x0f': return KeyCtrlO case '\x10': return KeyCtrlP case '\x11': return KeyCtrlQ case '\x12': return KeyCtrlR case '\x13': return KeyCtrlS case '\x14': return KeyCtrlT case '\x15': return KeyCtrlU case '\x16': return KeyCtrlV case '\x17': return KeyCtrlW case '\x18': return KeyCtrlX case '\x19': return KeyCtrlY case '\x1a': return KeyCtrlZ case '\x1b': return KeyCtrlCloseBracket case '\x1c': return KeyCtrlBackslash case '\x1f': return KeyCtrlUnderscore } switch code { case coninput.VK_OEM_4: return KeyCtrlOpenBracket } return KeyRunes } } bubbletea-0.27.0/logging.go000066400000000000000000000025571465647402200155250ustar00rootroot00000000000000package tea import ( "fmt" "io" "log" "os" "unicode" ) // LogToFile sets up default logging to log to a file. This is helpful as we // can't print to the terminal since our TUI is occupying it. If the file // doesn't exist it will be created. // // Don't forget to close the file when you're done with it. // // f, err := LogToFile("debug.log", "debug") // if err != nil { // fmt.Println("fatal:", err) // os.Exit(1) // } // defer f.Close() func LogToFile(path string, prefix string) (*os.File, error) { return LogToFileWith(path, prefix, log.Default()) } // LogOptionsSetter is an interface implemented by stdlib's log and charm's log // libraries. type LogOptionsSetter interface { SetOutput(io.Writer) SetPrefix(string) } // LogToFileWith does allows to call LogToFile with a custom LogOptionsSetter. func LogToFileWith(path string, prefix string, log LogOptionsSetter) (*os.File, error) { f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o600) //nolint:gomnd if err != nil { return nil, fmt.Errorf("error opening file for logging: %w", err) } log.SetOutput(f) // Add a space after the prefix if a prefix is being specified and it // doesn't already have a trailing space. if len(prefix) > 0 { finalChar := prefix[len(prefix)-1] if !unicode.IsSpace(rune(finalChar)) { prefix += " " } } log.SetPrefix(prefix) return f, nil } bubbletea-0.27.0/logging_test.go000066400000000000000000000010051465647402200165470ustar00rootroot00000000000000package tea import ( "log" "os" "path/filepath" "testing" ) func TestLogToFile(t *testing.T) { path := filepath.Join(t.TempDir(), "log.txt") prefix := "logprefix" f, err := LogToFile(path, prefix) if err != nil { t.Error(err) } log.SetFlags(log.Lmsgprefix) log.Println("some test log") if err := f.Close(); err != nil { t.Error(err) } out, err := os.ReadFile(path) if err != nil { t.Error(err) } if string(out) != prefix+" some test log\n" { t.Fatalf("wrong log msg: %q", string(out)) } } bubbletea-0.27.0/mouse.go000066400000000000000000000173411465647402200152240ustar00rootroot00000000000000package tea import "strconv" // MouseMsg contains information about a mouse event and are sent to a programs // update function when mouse activity occurs. Note that the mouse must first // be enabled in order for the mouse events to be received. type MouseMsg MouseEvent // String returns a string representation of a mouse event. func (m MouseMsg) String() string { return MouseEvent(m).String() } // MouseEvent represents a mouse event, which could be a click, a scroll wheel // movement, a cursor movement, or a combination. type MouseEvent struct { X int Y int Shift bool Alt bool Ctrl bool Action MouseAction Button MouseButton // Deprecated: Use MouseAction & MouseButton instead. Type MouseEventType } // IsWheel returns true if the mouse event is a wheel event. func (m MouseEvent) IsWheel() bool { return m.Button == MouseButtonWheelUp || m.Button == MouseButtonWheelDown || m.Button == MouseButtonWheelLeft || m.Button == MouseButtonWheelRight } // String returns a string representation of a mouse event. func (m MouseEvent) String() (s string) { if m.Ctrl { s += "ctrl+" } if m.Alt { s += "alt+" } if m.Shift { s += "shift+" } if m.Button == MouseButtonNone { //nolint:nestif if m.Action == MouseActionMotion || m.Action == MouseActionRelease { s += mouseActions[m.Action] } else { s += "unknown" } } else if m.IsWheel() { s += mouseButtons[m.Button] } else { btn := mouseButtons[m.Button] if btn != "" { s += btn } act := mouseActions[m.Action] if act != "" { s += " " + act } } return s } // MouseAction represents the action that occurred during a mouse event. type MouseAction int // Mouse event actions. const ( MouseActionPress MouseAction = iota MouseActionRelease MouseActionMotion ) var mouseActions = map[MouseAction]string{ MouseActionPress: "press", MouseActionRelease: "release", MouseActionMotion: "motion", } // MouseButton represents the button that was pressed during a mouse event. type MouseButton int // Mouse event buttons // // This is based on X11 mouse button codes. // // 1 = left button // 2 = middle button (pressing the scroll wheel) // 3 = right button // 4 = turn scroll wheel up // 5 = turn scroll wheel down // 6 = push scroll wheel left // 7 = push scroll wheel right // 8 = 4th button (aka browser backward button) // 9 = 5th button (aka browser forward button) // 10 // 11 // // Other buttons are not supported. const ( MouseButtonNone MouseButton = iota MouseButtonLeft MouseButtonMiddle MouseButtonRight MouseButtonWheelUp MouseButtonWheelDown MouseButtonWheelLeft MouseButtonWheelRight MouseButtonBackward MouseButtonForward MouseButton10 MouseButton11 ) var mouseButtons = map[MouseButton]string{ MouseButtonNone: "none", MouseButtonLeft: "left", MouseButtonMiddle: "middle", MouseButtonRight: "right", MouseButtonWheelUp: "wheel up", MouseButtonWheelDown: "wheel down", MouseButtonWheelLeft: "wheel left", MouseButtonWheelRight: "wheel right", MouseButtonBackward: "backward", MouseButtonForward: "forward", MouseButton10: "button 10", MouseButton11: "button 11", } // MouseEventType indicates the type of mouse event occurring. // // Deprecated: Use MouseAction & MouseButton instead. type MouseEventType int // Mouse event types. // // Deprecated: Use MouseAction & MouseButton instead. const ( MouseUnknown MouseEventType = iota MouseLeft MouseRight MouseMiddle MouseRelease // mouse button release (X10 only) MouseWheelUp MouseWheelDown MouseWheelLeft MouseWheelRight MouseBackward MouseForward MouseMotion ) // Parse SGR-encoded mouse events; SGR extended mouse events. SGR mouse events // look like: // // ESC [ < Cb ; Cx ; Cy (M or m) // // where: // // Cb is the encoded button code // Cx is the x-coordinate of the mouse // Cy is the y-coordinate of the mouse // M is for button press, m is for button release // // https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Extended-coordinates func parseSGRMouseEvent(buf []byte) MouseEvent { str := string(buf[3:]) matches := mouseSGRRegex.FindStringSubmatch(str) if len(matches) != 5 { //nolint:gomnd // Unreachable, we already checked the regex in `detectOneMsg`. panic("invalid mouse event") } b, _ := strconv.Atoi(matches[1]) px := matches[2] py := matches[3] release := matches[4] == "m" m := parseMouseButton(b, true) // Wheel buttons don't have release events // Motion can be reported as a release event in some terminals (Windows Terminal) if m.Action != MouseActionMotion && !m.IsWheel() && release { m.Action = MouseActionRelease m.Type = MouseRelease } x, _ := strconv.Atoi(px) y, _ := strconv.Atoi(py) // (1,1) is the upper left. We subtract 1 to normalize it to (0,0). m.X = x - 1 m.Y = y - 1 return m } const x10MouseByteOffset = 32 // Parse X10-encoded mouse events; the simplest kind. The last release of X10 // was December 1986, by the way. The original X10 mouse protocol limits the Cx // and Cy coordinates to 223 (=255-032). // // X10 mouse events look like: // // ESC [M Cb Cx Cy // // See: http://www.xfree86.org/current/ctlseqs.html#Mouse%20Tracking func parseX10MouseEvent(buf []byte) MouseEvent { v := buf[3:6] m := parseMouseButton(int(v[0]), false) // (1,1) is the upper left. We subtract 1 to normalize it to (0,0). m.X = int(v[1]) - x10MouseByteOffset - 1 m.Y = int(v[2]) - x10MouseByteOffset - 1 return m } // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Extended-coordinates func parseMouseButton(b int, isSGR bool) MouseEvent { var m MouseEvent e := b if !isSGR { e -= x10MouseByteOffset } const ( bitShift = 0b0000_0100 bitAlt = 0b0000_1000 bitCtrl = 0b0001_0000 bitMotion = 0b0010_0000 bitWheel = 0b0100_0000 bitAdd = 0b1000_0000 // additional buttons 8-11 bitsMask = 0b0000_0011 ) if e&bitAdd != 0 { m.Button = MouseButtonBackward + MouseButton(e&bitsMask) } else if e&bitWheel != 0 { m.Button = MouseButtonWheelUp + MouseButton(e&bitsMask) } else { m.Button = MouseButtonLeft + MouseButton(e&bitsMask) // X10 reports a button release as 0b0000_0011 (3) if e&bitsMask == bitsMask { m.Action = MouseActionRelease m.Button = MouseButtonNone } } // Motion bit doesn't get reported for wheel events. if e&bitMotion != 0 && !m.IsWheel() { m.Action = MouseActionMotion } // Modifiers m.Alt = e&bitAlt != 0 m.Ctrl = e&bitCtrl != 0 m.Shift = e&bitShift != 0 // backward compatibility switch { case m.Button == MouseButtonLeft && m.Action == MouseActionPress: m.Type = MouseLeft case m.Button == MouseButtonMiddle && m.Action == MouseActionPress: m.Type = MouseMiddle case m.Button == MouseButtonRight && m.Action == MouseActionPress: m.Type = MouseRight case m.Button == MouseButtonNone && m.Action == MouseActionRelease: m.Type = MouseRelease case m.Button == MouseButtonWheelUp && m.Action == MouseActionPress: m.Type = MouseWheelUp case m.Button == MouseButtonWheelDown && m.Action == MouseActionPress: m.Type = MouseWheelDown case m.Button == MouseButtonWheelLeft && m.Action == MouseActionPress: m.Type = MouseWheelLeft case m.Button == MouseButtonWheelRight && m.Action == MouseActionPress: m.Type = MouseWheelRight case m.Button == MouseButtonBackward && m.Action == MouseActionPress: m.Type = MouseBackward case m.Button == MouseButtonForward && m.Action == MouseActionPress: m.Type = MouseForward case m.Action == MouseActionMotion: m.Type = MouseMotion switch m.Button { //nolint:exhaustive case MouseButtonLeft: m.Type = MouseLeft case MouseButtonMiddle: m.Type = MouseMiddle case MouseButtonRight: m.Type = MouseRight case MouseButtonBackward: m.Type = MouseBackward case MouseButtonForward: m.Type = MouseForward } default: m.Type = MouseUnknown } return m } bubbletea-0.27.0/mouse_test.go000066400000000000000000000433151465647402200162630ustar00rootroot00000000000000package tea import ( "fmt" "testing" ) func TestMouseEvent_String(t *testing.T) { tt := []struct { name string event MouseEvent expected string }{ { name: "unknown", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonNone, Type: MouseUnknown, }, expected: "unknown", }, { name: "left", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonLeft, Type: MouseLeft, }, expected: "left press", }, { name: "right", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonRight, Type: MouseRight, }, expected: "right press", }, { name: "middle", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonMiddle, Type: MouseMiddle, }, expected: "middle press", }, { name: "release", event: MouseEvent{ Action: MouseActionRelease, Button: MouseButtonNone, Type: MouseRelease, }, expected: "release", }, { name: "wheel up", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonWheelUp, Type: MouseWheelUp, }, expected: "wheel up", }, { name: "wheel down", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonWheelDown, Type: MouseWheelDown, }, expected: "wheel down", }, { name: "wheel left", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonWheelLeft, Type: MouseWheelLeft, }, expected: "wheel left", }, { name: "wheel right", event: MouseEvent{ Action: MouseActionPress, Button: MouseButtonWheelRight, Type: MouseWheelRight, }, expected: "wheel right", }, { name: "motion", event: MouseEvent{ Action: MouseActionMotion, Button: MouseButtonNone, Type: MouseMotion, }, expected: "motion", }, { name: "shift+left release", event: MouseEvent{ Type: MouseLeft, Action: MouseActionRelease, Button: MouseButtonLeft, Shift: true, }, expected: "shift+left release", }, { name: "shift+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Shift: true, }, expected: "shift+left press", }, { name: "ctrl+shift+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Shift: true, Ctrl: true, }, expected: "ctrl+shift+left press", }, { name: "alt+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Alt: true, }, expected: "alt+left press", }, { name: "ctrl+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Ctrl: true, }, expected: "ctrl+left press", }, { name: "ctrl+alt+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Alt: true, Ctrl: true, }, expected: "ctrl+alt+left press", }, { name: "ctrl+alt+shift+left", event: MouseEvent{ Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, Alt: true, Ctrl: true, Shift: true, }, expected: "ctrl+alt+shift+left press", }, { name: "ignore coordinates", event: MouseEvent{ X: 100, Y: 200, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, expected: "left press", }, { name: "broken type", event: MouseEvent{ Type: MouseEventType(-100), Action: MouseAction(-110), Button: MouseButton(-120), }, expected: "", }, } for i := range tt { tc := tt[i] t.Run(tc.name, func(t *testing.T) { actual := tc.event.String() if tc.expected != actual { t.Fatalf("expected %q but got %q", tc.expected, actual, ) } }) } } func TestParseX10MouseEvent(t *testing.T) { encode := func(b byte, x, y int) []byte { return []byte{ '\x1b', '[', 'M', byte(32) + b, byte(x + 32 + 1), byte(y + 32 + 1), } } tt := []struct { name string buf []byte expected MouseEvent }{ // Position. { name: "zero position", buf: encode(0b0000_0000, 0, 0), expected: MouseEvent{ X: 0, Y: 0, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, { name: "max position", buf: encode(0b0000_0000, 222, 222), // Because 255 (max int8) - 32 - 1. expected: MouseEvent{ X: 222, Y: 222, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, // Simple. { name: "left", buf: encode(0b0000_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, { name: "left in motion", buf: encode(0b0010_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseLeft, Action: MouseActionMotion, Button: MouseButtonLeft, }, }, { name: "middle", buf: encode(0b0000_0001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMiddle, Action: MouseActionPress, Button: MouseButtonMiddle, }, }, { name: "middle in motion", buf: encode(0b0010_0001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMiddle, Action: MouseActionMotion, Button: MouseButtonMiddle, }, }, { name: "right", buf: encode(0b0000_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "right in motion", buf: encode(0b0010_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRight, Action: MouseActionMotion, Button: MouseButtonRight, }, }, { name: "motion", buf: encode(0b0010_0011, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMotion, Action: MouseActionMotion, Button: MouseButtonNone, }, }, { name: "wheel up", buf: encode(0b0100_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelUp, Action: MouseActionPress, Button: MouseButtonWheelUp, }, }, { name: "wheel down", buf: encode(0b0100_0001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "wheel left", buf: encode(0b0100_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelLeft, Action: MouseActionPress, Button: MouseButtonWheelLeft, }, }, { name: "wheel right", buf: encode(0b0100_0011, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelRight, Action: MouseActionPress, Button: MouseButtonWheelRight, }, }, { name: "release", buf: encode(0b0000_0011, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRelease, Action: MouseActionRelease, Button: MouseButtonNone, }, }, { name: "backward", buf: encode(0b1000_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseBackward, Action: MouseActionPress, Button: MouseButtonBackward, }, }, { name: "forward", buf: encode(0b1000_0001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseForward, Action: MouseActionPress, Button: MouseButtonForward, }, }, { name: "button 10", buf: encode(0b1000_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseUnknown, Action: MouseActionPress, Button: MouseButton10, }, }, { name: "button 11", buf: encode(0b1000_0011, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Type: MouseUnknown, Action: MouseActionPress, Button: MouseButton11, }, }, // Combinations. { name: "alt+right", buf: encode(0b0000_1010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "ctrl+right", buf: encode(0b0001_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Ctrl: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "left in motion", buf: encode(0b0010_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: false, Type: MouseLeft, Action: MouseActionMotion, Button: MouseButtonLeft, }, }, { name: "alt+right in motion", buf: encode(0b0010_1010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Type: MouseRight, Action: MouseActionMotion, Button: MouseButtonRight, }, }, { name: "ctrl+right in motion", buf: encode(0b0011_0010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Ctrl: true, Type: MouseRight, Action: MouseActionMotion, Button: MouseButtonRight, }, }, { name: "ctrl+alt+right", buf: encode(0b0001_1010, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Ctrl: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "ctrl+wheel up", buf: encode(0b0101_0000, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Ctrl: true, Type: MouseWheelUp, Action: MouseActionPress, Button: MouseButtonWheelUp, }, }, { name: "alt+wheel down", buf: encode(0b0100_1001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "ctrl+alt+wheel down", buf: encode(0b0101_1001, 32, 16), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Ctrl: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, // Overflow position. { name: "overflow position", buf: encode(0b0010_0000, 250, 223), // Because 255 (max int8) - 32 - 1. expected: MouseEvent{ X: -6, Y: -33, Type: MouseLeft, Action: MouseActionMotion, Button: MouseButtonLeft, }, }, } for i := range tt { tc := tt[i] t.Run(tc.name, func(t *testing.T) { actual := parseX10MouseEvent(tc.buf) if tc.expected != actual { t.Fatalf("expected %#v but got %#v", tc.expected, actual, ) } }) } } // func TestParseX10MouseEvent_error(t *testing.T) { // tt := []struct { // name string // buf []byte // }{ // { // name: "empty buf", // buf: nil, // }, // { // name: "wrong high bit", // buf: []byte("\x1a[M@A1"), // }, // { // name: "short buf", // buf: []byte("\x1b[M@A"), // }, // { // name: "long buf", // buf: []byte("\x1b[M@A11"), // }, // } // // for i := range tt { // tc := tt[i] // // t.Run(tc.name, func(t *testing.T) { // _, err := parseX10MouseEvent(tc.buf) // // if err == nil { // t.Fatalf("expected error but got nil") // } // }) // } // } func TestParseSGRMouseEvent(t *testing.T) { encode := func(b, x, y int, r bool) []byte { re := 'M' if r { re = 'm' } return []byte(fmt.Sprintf("\x1b[<%d;%d;%d%c", b, x+1, y+1, re)) } tt := []struct { name string buf []byte expected MouseEvent }{ // Position. { name: "zero position", buf: encode(0, 0, 0, false), expected: MouseEvent{ X: 0, Y: 0, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, { name: "225 position", buf: encode(0, 225, 225, false), expected: MouseEvent{ X: 225, Y: 225, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, // Simple. { name: "left", buf: encode(0, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseLeft, Action: MouseActionPress, Button: MouseButtonLeft, }, }, { name: "left in motion", buf: encode(32, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseLeft, Action: MouseActionMotion, Button: MouseButtonLeft, }, }, { name: "left release", buf: encode(0, 32, 16, true), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRelease, Action: MouseActionRelease, Button: MouseButtonLeft, }, }, { name: "middle", buf: encode(1, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMiddle, Action: MouseActionPress, Button: MouseButtonMiddle, }, }, { name: "middle in motion", buf: encode(33, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMiddle, Action: MouseActionMotion, Button: MouseButtonMiddle, }, }, { name: "middle release", buf: encode(1, 32, 16, true), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRelease, Action: MouseActionRelease, Button: MouseButtonMiddle, }, }, { name: "right", buf: encode(2, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "right release", buf: encode(2, 32, 16, true), expected: MouseEvent{ X: 32, Y: 16, Type: MouseRelease, Action: MouseActionRelease, Button: MouseButtonRight, }, }, { name: "motion", buf: encode(35, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseMotion, Action: MouseActionMotion, Button: MouseButtonNone, }, }, { name: "wheel up", buf: encode(64, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelUp, Action: MouseActionPress, Button: MouseButtonWheelUp, }, }, { name: "wheel down", buf: encode(65, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "wheel left", buf: encode(66, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelLeft, Action: MouseActionPress, Button: MouseButtonWheelLeft, }, }, { name: "wheel right", buf: encode(67, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseWheelRight, Action: MouseActionPress, Button: MouseButtonWheelRight, }, }, { name: "backward", buf: encode(128, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseBackward, Action: MouseActionPress, Button: MouseButtonBackward, }, }, { name: "backward in motion", buf: encode(160, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseBackward, Action: MouseActionMotion, Button: MouseButtonBackward, }, }, { name: "forward", buf: encode(129, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseForward, Action: MouseActionPress, Button: MouseButtonForward, }, }, { name: "forward in motion", buf: encode(161, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Type: MouseForward, Action: MouseActionMotion, Button: MouseButtonForward, }, }, // Combinations. { name: "alt+right", buf: encode(10, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "ctrl+right", buf: encode(18, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Ctrl: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "ctrl+alt+right", buf: encode(26, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Ctrl: true, Type: MouseRight, Action: MouseActionPress, Button: MouseButtonRight, }, }, { name: "alt+wheel press", buf: encode(73, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "ctrl+wheel press", buf: encode(81, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Ctrl: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "ctrl+alt+wheel press", buf: encode(89, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Alt: true, Ctrl: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, { name: "ctrl+alt+shift+wheel press", buf: encode(93, 32, 16, false), expected: MouseEvent{ X: 32, Y: 16, Shift: true, Alt: true, Ctrl: true, Type: MouseWheelDown, Action: MouseActionPress, Button: MouseButtonWheelDown, }, }, } for i := range tt { tc := tt[i] t.Run(tc.name, func(t *testing.T) { actual := parseSGRMouseEvent(tc.buf) if tc.expected != actual { t.Fatalf("expected %#v but got %#v", tc.expected, actual, ) } }) } } bubbletea-0.27.0/nil_renderer.go000066400000000000000000000022101465647402200165310ustar00rootroot00000000000000package tea type nilRenderer struct{} func (n nilRenderer) start() {} func (n nilRenderer) stop() {} func (n nilRenderer) kill() {} func (n nilRenderer) write(_ string) {} func (n nilRenderer) repaint() {} func (n nilRenderer) clearScreen() {} func (n nilRenderer) altScreen() bool { return false } func (n nilRenderer) enterAltScreen() {} func (n nilRenderer) exitAltScreen() {} func (n nilRenderer) showCursor() {} func (n nilRenderer) hideCursor() {} func (n nilRenderer) enableMouseCellMotion() {} func (n nilRenderer) disableMouseCellMotion() {} func (n nilRenderer) enableMouseAllMotion() {} func (n nilRenderer) disableMouseAllMotion() {} func (n nilRenderer) enableBracketedPaste() {} func (n nilRenderer) disableBracketedPaste() {} func (n nilRenderer) enableMouseSGRMode() {} func (n nilRenderer) disableMouseSGRMode() {} func (n nilRenderer) bracketedPasteActive() bool { return false } func (n nilRenderer) setWindowTitle(_ string) {} bubbletea-0.27.0/nil_renderer_test.go000066400000000000000000000006421465647402200175770ustar00rootroot00000000000000package tea import "testing" func TestNilRenderer(t *testing.T) { r := nilRenderer{} r.start() r.stop() r.kill() r.write("a") r.repaint() r.enterAltScreen() if r.altScreen() { t.Errorf("altScreen should always return false") } r.exitAltScreen() r.clearScreen() r.showCursor() r.hideCursor() r.enableMouseCellMotion() r.disableMouseCellMotion() r.enableMouseAllMotion() r.disableMouseAllMotion() } bubbletea-0.27.0/options.go000066400000000000000000000170171465647402200155670ustar00rootroot00000000000000package tea import ( "context" "io" "sync/atomic" ) // ProgramOption is used to set options when initializing a Program. Program can // accept a variable number of options. // // Example usage: // // p := NewProgram(model, WithInput(someInput), WithOutput(someOutput)) type ProgramOption func(*Program) // WithContext lets you specify a context in which to run the Program. This is // useful if you want to cancel the execution from outside. When a Program gets // cancelled it will exit with an error ErrProgramKilled. func WithContext(ctx context.Context) ProgramOption { return func(p *Program) { p.ctx = ctx } } // WithOutput sets the output which, by default, is stdout. In most cases you // won't need to use this. func WithOutput(output io.Writer) ProgramOption { return func(p *Program) { p.output = output } } // WithInput sets the input which, by default, is stdin. In most cases you // won't need to use this. To disable input entirely pass nil. // // p := NewProgram(model, WithInput(nil)) func WithInput(input io.Reader) ProgramOption { return func(p *Program) { p.input = input p.inputType = customInput } } // WithInputTTY opens a new TTY for input (or console input device on Windows). func WithInputTTY() ProgramOption { return func(p *Program) { p.inputType = ttyInput } } // WithEnvironment sets the environment variables that the program will use. // This useful when the program is running in a remote session (e.g. SSH) and // you want to pass the environment variables from the remote session to the // program. // // Example: // // var sess ssh.Session // ssh.Session is a type from the github.com/charmbracelet/ssh package // pty, _, _ := sess.Pty() // environ := append(sess.Environ(), "TERM="+pty.Term) // p := tea.NewProgram(model, tea.WithEnvironment(environ) func WithEnvironment(env []string) ProgramOption { return func(p *Program) { p.environ = env } } // WithoutSignalHandler disables the signal handler that Bubble Tea sets up for // Programs. This is useful if you want to handle signals yourself. func WithoutSignalHandler() ProgramOption { return func(p *Program) { p.startupOptions |= withoutSignalHandler } } // WithoutCatchPanics disables the panic catching that Bubble Tea does by // default. If panic catching is disabled the terminal will be in a fairly // unusable state after a panic because Bubble Tea will not perform its usual // cleanup on exit. func WithoutCatchPanics() ProgramOption { return func(p *Program) { p.startupOptions |= withoutCatchPanics } } // WithoutSignals will ignore OS signals. // This is mainly useful for testing. func WithoutSignals() ProgramOption { return func(p *Program) { atomic.StoreUint32(&p.ignoreSignals, 1) } } // WithAltScreen starts the program with the alternate screen buffer enabled // (i.e. the program starts in full window mode). Note that the altscreen will // be automatically exited when the program quits. // // Example: // // p := tea.NewProgram(Model{}, tea.WithAltScreen()) // if _, err := p.Run(); err != nil { // fmt.Println("Error running program:", err) // os.Exit(1) // } // // To enter the altscreen once the program has already started running use the // EnterAltScreen command. func WithAltScreen() ProgramOption { return func(p *Program) { p.startupOptions |= withAltScreen } } // WithoutBracketedPaste starts the program with bracketed paste disabled. func WithoutBracketedPaste() ProgramOption { return func(p *Program) { p.startupOptions |= withoutBracketedPaste } } // WithMouseCellMotion starts the program with the mouse enabled in "cell // motion" mode. // // Cell motion mode enables mouse click, release, and wheel events. Mouse // movement events are also captured if a mouse button is pressed (i.e., drag // events). Cell motion mode is better supported than all motion mode. // // This will try to enable the mouse in extended mode (SGR), if that is not // supported by the terminal it will fall back to normal mode (X10). // // To enable mouse cell motion once the program has already started running use // the EnableMouseCellMotion command. To disable the mouse when the program is // running use the DisableMouse command. // // The mouse will be automatically disabled when the program exits. func WithMouseCellMotion() ProgramOption { return func(p *Program) { p.startupOptions |= withMouseCellMotion // set p.startupOptions &^= withMouseAllMotion // clear } } // WithMouseAllMotion starts the program with the mouse enabled in "all motion" // mode. // // EnableMouseAllMotion is a special command that enables mouse click, release, // wheel, and motion events, which are delivered regardless of whether a mouse // button is pressed, effectively enabling support for hover interactions. // // This will try to enable the mouse in extended mode (SGR), if that is not // supported by the terminal it will fall back to normal mode (X10). // // Many modern terminals support this, but not all. If in doubt, use // EnableMouseCellMotion instead. // // To enable the mouse once the program has already started running use the // EnableMouseAllMotion command. To disable the mouse when the program is // running use the DisableMouse command. // // The mouse will be automatically disabled when the program exits. func WithMouseAllMotion() ProgramOption { return func(p *Program) { p.startupOptions |= withMouseAllMotion // set p.startupOptions &^= withMouseCellMotion // clear } } // WithoutRenderer disables the renderer. When this is set output and log // statements will be plainly sent to stdout (or another output if one is set) // without any rendering and redrawing logic. In other words, printing and // logging will behave the same way it would in a non-TUI commandline tool. // This can be useful if you want to use the Bubble Tea framework for a non-TUI // application, or to provide an additional non-TUI mode to your Bubble Tea // programs. For example, your program could behave like a daemon if output is // not a TTY. func WithoutRenderer() ProgramOption { return func(p *Program) { p.renderer = &nilRenderer{} } } // WithANSICompressor removes redundant ANSI sequences to produce potentially // smaller output, at the cost of some processing overhead. // // This feature is provisional, and may be changed or removed in a future version // of this package. func WithANSICompressor() ProgramOption { return func(p *Program) { p.startupOptions |= withANSICompressor } } // WithFilter supplies an event filter that will be invoked before Bubble Tea // processes a tea.Msg. The event filter can return any tea.Msg which will then // get handled by Bubble Tea instead of the original event. If the event filter // returns nil, the event will be ignored and Bubble Tea will not process it. // // As an example, this could be used to prevent a program from shutting down if // there are unsaved changes. // // Example: // // func filter(m tea.Model, msg tea.Msg) tea.Msg { // if _, ok := msg.(tea.QuitMsg); !ok { // return msg // } // // model := m.(myModel) // if model.hasChanges { // return nil // } // // return msg // } // // p := tea.NewProgram(Model{}, tea.WithFilter(filter)); // // if _,err := p.Run(); err != nil { // fmt.Println("Error running program:", err) // os.Exit(1) // } func WithFilter(filter func(Model, Msg) Msg) ProgramOption { return func(p *Program) { p.filter = filter } } // WithFPS sets a custom maximum FPS at which the renderer should run. If // less than 1, the default value of 60 will be used. If over 120, the FPS // will be capped at 120. func WithFPS(fps int) ProgramOption { return func(p *Program) { p.fps = fps } } bubbletea-0.27.0/options_test.go000066400000000000000000000074671465647402200166360ustar00rootroot00000000000000package tea import ( "bytes" "os" "sync/atomic" "testing" ) func TestOptions(t *testing.T) { t.Run("output", func(t *testing.T) { var b bytes.Buffer p := NewProgram(nil, WithOutput(&b)) if f, ok := p.output.(*os.File); ok { t.Errorf("expected output to custom, got %v", f.Fd()) } }) t.Run("custom input", func(t *testing.T) { var b bytes.Buffer p := NewProgram(nil, WithInput(&b)) if p.input != &b { t.Errorf("expected input to custom, got %v", p.input) } if p.inputType != customInput { t.Errorf("expected startup options to have custom input set, got %v", p.input) } }) t.Run("renderer", func(t *testing.T) { p := NewProgram(nil, WithoutRenderer()) switch p.renderer.(type) { case *nilRenderer: return default: t.Errorf("expected renderer to be a nilRenderer, got %v", p.renderer) } }) t.Run("without signals", func(t *testing.T) { p := NewProgram(nil, WithoutSignals()) if atomic.LoadUint32(&p.ignoreSignals) == 0 { t.Errorf("ignore signals should have been set") } }) t.Run("filter", func(t *testing.T) { p := NewProgram(nil, WithFilter(func(_ Model, msg Msg) Msg { return msg })) if p.filter == nil { t.Errorf("expected filter to be set") } }) t.Run("input options", func(t *testing.T) { exercise := func(t *testing.T, opt ProgramOption, expect inputType) { p := NewProgram(nil, opt) if p.inputType != expect { t.Errorf("expected input type %s, got %s", expect, p.inputType) } } t.Run("tty input", func(t *testing.T) { exercise(t, WithInputTTY(), ttyInput) }) t.Run("custom input", func(t *testing.T) { var b bytes.Buffer exercise(t, WithInput(&b), customInput) }) }) t.Run("startup options", func(t *testing.T) { exercise := func(t *testing.T, opt ProgramOption, expect startupOptions) { p := NewProgram(nil, opt) if !p.startupOptions.has(expect) { t.Errorf("expected startup options have %v, got %v", expect, p.startupOptions) } } t.Run("alt screen", func(t *testing.T) { exercise(t, WithAltScreen(), withAltScreen) }) t.Run("bracketed paste disabled", func(t *testing.T) { exercise(t, WithoutBracketedPaste(), withoutBracketedPaste) }) t.Run("ansi compression", func(t *testing.T) { exercise(t, WithANSICompressor(), withANSICompressor) }) t.Run("without catch panics", func(t *testing.T) { exercise(t, WithoutCatchPanics(), withoutCatchPanics) }) t.Run("without signal handler", func(t *testing.T) { exercise(t, WithoutSignalHandler(), withoutSignalHandler) }) t.Run("mouse cell motion", func(t *testing.T) { p := NewProgram(nil, WithMouseAllMotion(), WithMouseCellMotion()) if !p.startupOptions.has(withMouseCellMotion) { t.Errorf("expected startup options have %v, got %v", withMouseCellMotion, p.startupOptions) } if p.startupOptions.has(withMouseAllMotion) { t.Errorf("expected startup options not have %v, got %v", withMouseAllMotion, p.startupOptions) } }) t.Run("mouse all motion", func(t *testing.T) { p := NewProgram(nil, WithMouseCellMotion(), WithMouseAllMotion()) if !p.startupOptions.has(withMouseAllMotion) { t.Errorf("expected startup options have %v, got %v", withMouseAllMotion, p.startupOptions) } if p.startupOptions.has(withMouseCellMotion) { t.Errorf("expected startup options not have %v, got %v", withMouseCellMotion, p.startupOptions) } }) }) t.Run("multiple", func(t *testing.T) { p := NewProgram(nil, WithMouseAllMotion(), WithoutBracketedPaste(), WithAltScreen(), WithInputTTY()) for _, opt := range []startupOptions{withMouseAllMotion, withoutBracketedPaste, withAltScreen} { if !p.startupOptions.has(opt) { t.Errorf("expected startup options have %v, got %v", opt, p.startupOptions) } if p.inputType != ttyInput { t.Errorf("expected input to be %v, got %v", opt, p.startupOptions) } } }) } bubbletea-0.27.0/renderer.go000066400000000000000000000041551465647402200157010ustar00rootroot00000000000000package tea // renderer is the interface for Bubble Tea renderers. type renderer interface { // Start the renderer. start() // Stop the renderer, but render the final frame in the buffer, if any. stop() // Stop the renderer without doing any final rendering. kill() // Write a frame to the renderer. The renderer can write this data to // output at its discretion. write(string) // Request a full re-render. Note that this will not trigger a render // immediately. Rather, this method causes the next render to be a full // repaint. Because of this, it's safe to call this method multiple times // in succession. repaint() // Clears the terminal. clearScreen() // Whether or not the alternate screen buffer is enabled. altScreen() bool // Enable the alternate screen buffer. enterAltScreen() // Disable the alternate screen buffer. exitAltScreen() // Show the cursor. showCursor() // Hide the cursor. hideCursor() // enableMouseCellMotion enables mouse click, release, wheel and motion // events if a mouse button is pressed (i.e., drag events). enableMouseCellMotion() // disableMouseCellMotion disables Mouse Cell Motion tracking. disableMouseCellMotion() // enableMouseAllMotion enables mouse click, release, wheel and motion // events, regardless of whether a mouse button is pressed. Many modern // terminals support this, but not all. enableMouseAllMotion() // disableMouseAllMotion disables All Motion mouse tracking. disableMouseAllMotion() // enableMouseSGRMode enables mouse extended mode (SGR). enableMouseSGRMode() // disableMouseSGRMode disables mouse extended mode (SGR). disableMouseSGRMode() // enableBracketedPaste enables bracketed paste, where characters // inside the input are not interpreted when pasted as a whole. enableBracketedPaste() // disableBracketedPaste disables bracketed paste. disableBracketedPaste() // bracketedPasteActive reports whether bracketed paste mode is // currently enabled. bracketedPasteActive() bool // setWindowTitle sets the terminal window title. setWindowTitle(string) } // repaintMsg forces a full repaint. type repaintMsg struct{} bubbletea-0.27.0/screen.go000066400000000000000000000175131465647402200153540ustar00rootroot00000000000000package tea // WindowSizeMsg is used to report the terminal size. It's sent to Update once // initially and then on every terminal resize. Note that Windows does not // have support for reporting when resizes occur as it does not support the // SIGWINCH signal. type WindowSizeMsg struct { Width int Height int } // ClearScreen is a special command that tells the program to clear the screen // before the next update. This can be used to move the cursor to the top left // of the screen and clear visual clutter when the alt screen is not in use. // // Note that it should never be necessary to call ClearScreen() for regular // redraws. func ClearScreen() Msg { return clearScreenMsg{} } // clearScreenMsg is an internal message that signals to clear the screen. // You can send a clearScreenMsg with ClearScreen. type clearScreenMsg struct{} // EnterAltScreen is a special command that tells the Bubble Tea program to // enter the alternate screen buffer. // // Because commands run asynchronously, this command should not be used in your // model's Init function. To initialize your program with the altscreen enabled // use the WithAltScreen ProgramOption instead. func EnterAltScreen() Msg { return enterAltScreenMsg{} } // enterAltScreenMsg in an internal message signals that the program should // enter alternate screen buffer. You can send a enterAltScreenMsg with // EnterAltScreen. type enterAltScreenMsg struct{} // ExitAltScreen is a special command that tells the Bubble Tea program to exit // the alternate screen buffer. This command should be used to exit the // alternate screen buffer while the program is running. // // Note that the alternate screen buffer will be automatically exited when the // program quits. func ExitAltScreen() Msg { return exitAltScreenMsg{} } // exitAltScreenMsg in an internal message signals that the program should exit // alternate screen buffer. You can send a exitAltScreenMsg with ExitAltScreen. type exitAltScreenMsg struct{} // EnableMouseCellMotion is a special command that enables mouse click, // release, and wheel events. Mouse movement events are also captured if // a mouse button is pressed (i.e., drag events). // // Because commands run asynchronously, this command should not be used in your // model's Init function. Use the WithMouseCellMotion ProgramOption instead. func EnableMouseCellMotion() Msg { return enableMouseCellMotionMsg{} } // enableMouseCellMotionMsg is a special command that signals to start // listening for "cell motion" type mouse events (ESC[?1002l). To send an // enableMouseCellMotionMsg, use the EnableMouseCellMotion command. type enableMouseCellMotionMsg struct{} // EnableMouseAllMotion is a special command that enables mouse click, release, // wheel, and motion events, which are delivered regardless of whether a mouse // button is pressed, effectively enabling support for hover interactions. // // Many modern terminals support this, but not all. If in doubt, use // EnableMouseCellMotion instead. // // Because commands run asynchronously, this command should not be used in your // model's Init function. Use the WithMouseAllMotion ProgramOption instead. func EnableMouseAllMotion() Msg { return enableMouseAllMotionMsg{} } // enableMouseAllMotionMsg is a special command that signals to start listening // for "all motion" type mouse events (ESC[?1003l). To send an // enableMouseAllMotionMsg, use the EnableMouseAllMotion command. type enableMouseAllMotionMsg struct{} // DisableMouse is a special command that stops listening for mouse events. func DisableMouse() Msg { return disableMouseMsg{} } // disableMouseMsg is an internal message that signals to stop listening // for mouse events. To send a disableMouseMsg, use the DisableMouse command. type disableMouseMsg struct{} // HideCursor is a special command for manually instructing Bubble Tea to hide // the cursor. In some rare cases, certain operations will cause the terminal // to show the cursor, which is normally hidden for the duration of a Bubble // Tea program's lifetime. You will most likely not need to use this command. func HideCursor() Msg { return hideCursorMsg{} } // hideCursorMsg is an internal command used to hide the cursor. You can send // this message with HideCursor. type hideCursorMsg struct{} // ShowCursor is a special command for manually instructing Bubble Tea to show // the cursor. func ShowCursor() Msg { return showCursorMsg{} } // showCursorMsg is an internal command used to show the cursor. You can send // this message with ShowCursor. type showCursorMsg struct{} // EnableBracketedPaste is a special command that tells the Bubble Tea program // to accept bracketed paste input. // // Note that bracketed paste will be automatically disabled when the // program quits. func EnableBracketedPaste() Msg { return enableBracketedPasteMsg{} } // enableBracketedPasteMsg in an internal message signals that // bracketed paste should be enabled. You can send an // enableBracketedPasteMsg with EnableBracketedPaste. type enableBracketedPasteMsg struct{} // DisableBracketedPaste is a special command that tells the Bubble Tea program // to accept bracketed paste input. // // Note that bracketed paste will be automatically disabled when the // program quits. func DisableBracketedPaste() Msg { return disableBracketedPasteMsg{} } // disableBracketedPasteMsg in an internal message signals that // bracketed paste should be disabled. You can send an // disableBracketedPasteMsg with DisableBracketedPaste. type disableBracketedPasteMsg struct{} // EnterAltScreen enters the alternate screen buffer, which consumes the entire // terminal window. ExitAltScreen will return the terminal to its former state. // // Deprecated: Use the WithAltScreen ProgramOption instead. func (p *Program) EnterAltScreen() { if p.renderer != nil { p.renderer.enterAltScreen() } else { p.startupOptions |= withAltScreen } } // ExitAltScreen exits the alternate screen buffer. // // Deprecated: The altscreen will exited automatically when the program exits. func (p *Program) ExitAltScreen() { if p.renderer != nil { p.renderer.exitAltScreen() } else { p.startupOptions &^= withAltScreen } } // EnableMouseCellMotion enables mouse click, release, wheel and motion events // if a mouse button is pressed (i.e., drag events). // // Deprecated: Use the WithMouseCellMotion ProgramOption instead. func (p *Program) EnableMouseCellMotion() { if p.renderer != nil { p.renderer.enableMouseCellMotion() } else { p.startupOptions |= withMouseCellMotion } } // DisableMouseCellMotion disables Mouse Cell Motion tracking. This will be // called automatically when exiting a Bubble Tea program. // // Deprecated: The mouse will automatically be disabled when the program exits. func (p *Program) DisableMouseCellMotion() { if p.renderer != nil { p.renderer.disableMouseCellMotion() } else { p.startupOptions &^= withMouseCellMotion } } // EnableMouseAllMotion enables mouse click, release, wheel and motion events, // regardless of whether a mouse button is pressed. Many modern terminals // support this, but not all. // // Deprecated: Use the WithMouseAllMotion ProgramOption instead. func (p *Program) EnableMouseAllMotion() { if p.renderer != nil { p.renderer.enableMouseAllMotion() } else { p.startupOptions |= withMouseAllMotion } } // DisableMouseAllMotion disables All Motion mouse tracking. This will be // called automatically when exiting a Bubble Tea program. // // Deprecated: The mouse will automatically be disabled when the program exits. func (p *Program) DisableMouseAllMotion() { if p.renderer != nil { p.renderer.disableMouseAllMotion() } else { p.startupOptions &^= withMouseAllMotion } } // SetWindowTitle sets the terminal window title. // // Deprecated: Use the SetWindowTitle command instead. func (p *Program) SetWindowTitle(title string) { if p.renderer != nil { p.renderer.setWindowTitle(title) } else { p.startupTitle = title } } bubbletea-0.27.0/screen_test.go000066400000000000000000000052471465647402200164140ustar00rootroot00000000000000package tea import ( "bytes" "testing" ) func TestClearMsg(t *testing.T) { tests := []struct { name string cmds sequenceMsg expected string }{ { name: "clear_screen", cmds: []Cmd{ClearScreen}, expected: "\x1b[?25l\x1b[?2004h\x1b[2J\x1b[1;1H\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "altscreen", cmds: []Cmd{EnterAltScreen, ExitAltScreen}, expected: "\x1b[?25l\x1b[?2004h\x1b[?1049h\x1b[2J\x1b[1;1H\x1b[?25l\x1b[?1049l\x1b[?25l\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "altscreen_autoexit", cmds: []Cmd{EnterAltScreen}, expected: "\x1b[?25l\x1b[?2004h\x1b[?1049h\x1b[2J\x1b[1;1H\x1b[?25l\rsuccess\r\n\x1b[2;0H\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?1049l\x1b[?25h", }, { name: "mouse_cellmotion", cmds: []Cmd{EnableMouseCellMotion}, expected: "\x1b[?25l\x1b[?2004h\x1b[?1002h\x1b[?1006h\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "mouse_allmotion", cmds: []Cmd{EnableMouseAllMotion}, expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "mouse_disable", cmds: []Cmd{EnableMouseAllMotion, DisableMouse}, expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\x1b[?1002l\x1b[?1003l\x1b[?1006l\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "cursor_hide", cmds: []Cmd{HideCursor}, expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "cursor_hideshow", cmds: []Cmd{HideCursor, ShowCursor}, expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\x1b[?25h\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, { name: "bp_stop_start", cmds: []Cmd{DisableBracketedPaste, EnableBracketedPaste}, expected: "\x1b[?25l\x1b[?2004h\x1b[?2004l\x1b[?2004h\rsuccess\r\n\x1b[D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) test.cmds = append(test.cmds, Quit) go p.Send(test.cmds) if _, err := p.Run(); err != nil { t.Fatal(err) } if buf.String() != test.expected { t.Errorf("expected embedded sequence:\n%q\ngot:\n%q", test.expected, buf.String()) } }) } } bubbletea-0.27.0/signals_unix.go000066400000000000000000000012261465647402200165720ustar00rootroot00000000000000//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix || zos // +build darwin dragonfly freebsd linux netbsd openbsd solaris aix zos package tea import ( "os" "os/signal" "syscall" ) // listenForResize sends messages (or errors) when the terminal resizes. // Argument output should be the file descriptor for the terminal; usually // os.Stdout. func (p *Program) listenForResize(done chan struct{}) { sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGWINCH) defer func() { signal.Stop(sig) close(done) }() for { select { case <-p.ctx.Done(): return case <-sig: } p.checkResize() } } bubbletea-0.27.0/signals_windows.go000066400000000000000000000003411465647402200172760ustar00rootroot00000000000000//go:build windows // +build windows package tea // listenForResize is not available on windows because windows does not // implement syscall.SIGWINCH. func (p *Program) listenForResize(done chan struct{}) { close(done) } bubbletea-0.27.0/standard_renderer.go000066400000000000000000000460471465647402200175670ustar00rootroot00000000000000package tea import ( "bytes" "fmt" "io" "strings" "sync" "time" "github.com/charmbracelet/x/ansi" "github.com/muesli/ansi/compressor" ) const ( // defaultFramerate specifies the maximum interval at which we should // update the view. defaultFPS = 60 maxFPS = 120 ) // standardRenderer is a framerate-based terminal renderer, updating the view // at a given framerate to avoid overloading the terminal emulator. // // In cases where very high performance is needed the renderer can be told // to exclude ranges of lines, allowing them to be written to directly. type standardRenderer struct { mtx *sync.Mutex out io.Writer buf bytes.Buffer queuedMessageLines []string framerate time.Duration ticker *time.Ticker done chan struct{} lastRender string linesRendered int useANSICompressor bool once sync.Once // cursor visibility state cursorHidden bool // essentially whether or not we're using the full size of the terminal altScreenActive bool // whether or not we're currently using bracketed paste bpActive bool // renderer dimensions; usually the size of the window width int height int // lines explicitly set not to render ignoreLines map[int]struct{} } // newRenderer creates a new renderer. Normally you'll want to initialize it // with os.Stdout as the first argument. func newRenderer(out io.Writer, useANSICompressor bool, fps int) renderer { if fps < 1 { fps = defaultFPS } else if fps > maxFPS { fps = maxFPS } r := &standardRenderer{ out: out, mtx: &sync.Mutex{}, done: make(chan struct{}), framerate: time.Second / time.Duration(fps), useANSICompressor: useANSICompressor, queuedMessageLines: []string{}, } if r.useANSICompressor { r.out = &compressor.Writer{Forward: out} } return r } // start starts the renderer. func (r *standardRenderer) start() { if r.ticker == nil { r.ticker = time.NewTicker(r.framerate) } else { // If the ticker already exists, it has been stopped and we need to // reset it. r.ticker.Reset(r.framerate) } // Since the renderer can be restarted after a stop, we need to reset // the done channel and its corresponding sync.Once. r.once = sync.Once{} go r.listen() } // stop permanently halts the renderer, rendering the final frame. func (r *standardRenderer) stop() { // Stop the renderer before acquiring the mutex to avoid a deadlock. r.once.Do(func() { r.done <- struct{}{} }) // flush locks the mutex r.flush() r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EraseEntireLine) // Move the cursor back to the beginning of the line r.execute("\r") if r.useANSICompressor { if w, ok := r.out.(io.WriteCloser); ok { _ = w.Close() } } } // execute writes a sequence to the terminal. func (r *standardRenderer) execute(seq string) { _, _ = io.WriteString(r.out, seq) } // kill halts the renderer. The final frame will not be rendered. func (r *standardRenderer) kill() { // Stop the renderer before acquiring the mutex to avoid a deadlock. r.once.Do(func() { r.done <- struct{}{} }) r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EraseEntireLine) // Move the cursor back to the beginning of the line r.execute("\r") } // listen waits for ticks on the ticker, or a signal to stop the renderer. func (r *standardRenderer) listen() { for { select { case <-r.done: r.ticker.Stop() return case <-r.ticker.C: r.flush() } } } // flush renders the buffer. func (r *standardRenderer) flush() { r.mtx.Lock() defer r.mtx.Unlock() if r.buf.Len() == 0 || r.buf.String() == r.lastRender { // Nothing to do return } // Output buffer buf := &bytes.Buffer{} newLines := strings.Split(r.buf.String(), "\n") // If we know the output's height, we can use it to determine how many // lines we can render. We drop lines from the top of the render buffer if // necessary, as we can't navigate the cursor into the terminal's scrollback // buffer. if r.height > 0 && len(newLines) > r.height { newLines = newLines[len(newLines)-r.height:] } numLinesThisFlush := len(newLines) oldLines := strings.Split(r.lastRender, "\n") skipLines := make(map[int]struct{}) flushQueuedMessages := len(r.queuedMessageLines) > 0 && !r.altScreenActive // Clear any lines we painted in the last render. if r.linesRendered > 0 { for i := r.linesRendered - 1; i > 0; i-- { // if we are clearing queued messages, we want to clear all lines, since // printing messages allows for native terminal word-wrap, we // don't have control over the queued lines if flushQueuedMessages { buf.WriteString(ansi.EraseEntireLine) } else if (len(newLines) <= len(oldLines)) && (len(newLines) > i && len(oldLines) > i) && (newLines[i] == oldLines[i]) { // If the number of lines we want to render hasn't increased and // new line is the same as the old line we can skip rendering for // this line as a performance optimization. skipLines[i] = struct{}{} } else if _, exists := r.ignoreLines[i]; !exists { buf.WriteString(ansi.EraseEntireLine) } buf.WriteString(ansi.CursorUp1) } if _, exists := r.ignoreLines[0]; !exists { // We need to return to the start of the line here to properly // erase it. Going back the entire width of the terminal will // usually be farther than we need to go, but terminal emulators // will stop the cursor at the start of the line as a rule. // // We use this sequence in particular because it's part of the ANSI // standard (whereas others are proprietary to, say, VT100/VT52). // If cursor previous line (ESC[ + + F) were better supported // we could use that above to eliminate this step. buf.WriteString(ansi.CursorLeft(r.width)) buf.WriteString(ansi.EraseEntireLine) } } // Merge the set of lines we're skipping as a rendering optimization with // the set of lines we've explicitly asked the renderer to ignore. for k, v := range r.ignoreLines { skipLines[k] = v } if flushQueuedMessages { // Dump the lines we've queued up for printing for _, line := range r.queuedMessageLines { _, _ = buf.WriteString(line) _, _ = buf.WriteString("\r\n") } // clear the queued message lines r.queuedMessageLines = []string{} } // Paint new lines for i := 0; i < len(newLines); i++ { if _, skip := skipLines[i]; skip { // Unless this is the last line, move the cursor down. if i < len(newLines)-1 { buf.WriteString(ansi.CursorDown1) } } else { if i == 0 && r.lastRender == "" { // On first render, reset the cursor to the start of the line // before writing anything. buf.WriteByte('\r') } line := newLines[i] // Truncate lines wider than the width of the window to avoid // wrapping, which will mess up rendering. If we don't have the // width of the window this will be ignored. // // Note that on Windows we only get the width of the window on // program initialization, so after a resize this won't perform // correctly (signal SIGWINCH is not supported on Windows). if r.width > 0 { line = ansi.Truncate(line, r.width, "") } _, _ = buf.WriteString(line) if i < len(newLines)-1 { _, _ = buf.WriteString("\r\n") } } } r.linesRendered = numLinesThisFlush // Make sure the cursor is at the start of the last line to keep rendering // behavior consistent. if r.altScreenActive { // This case fixes a bug in macOS terminal. In other terminals the // other case seems to do the job regardless of whether or not we're // using the full terminal window. buf.WriteString(ansi.MoveCursor(r.linesRendered, 0)) } else { buf.WriteString(ansi.CursorLeft(r.width)) } _, _ = r.out.Write(buf.Bytes()) r.lastRender = r.buf.String() r.buf.Reset() } // write writes to the internal buffer. The buffer will be outputted via the // ticker which calls flush(). func (r *standardRenderer) write(s string) { r.mtx.Lock() defer r.mtx.Unlock() r.buf.Reset() // If an empty string was passed we should clear existing output and // rendering nothing. Rather than introduce additional state to manage // this, we render a single space as a simple (albeit less correct) // solution. if s == "" { s = " " } _, _ = r.buf.WriteString(s) } func (r *standardRenderer) repaint() { r.lastRender = "" } func (r *standardRenderer) clearScreen() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EraseEntireDisplay) r.execute(ansi.MoveCursorOrigin) r.repaint() } func (r *standardRenderer) altScreen() bool { r.mtx.Lock() defer r.mtx.Unlock() return r.altScreenActive } func (r *standardRenderer) enterAltScreen() { r.mtx.Lock() defer r.mtx.Unlock() if r.altScreenActive { return } r.altScreenActive = true r.execute(ansi.EnableAltScreenBuffer) // Ensure that the terminal is cleared, even when it doesn't support // alt screen (or alt screen support is disabled, like GNU screen by // default). // // Note: we can't use r.clearScreen() here because the mutex is already // locked. r.execute(ansi.EraseEntireDisplay) r.execute(ansi.MoveCursorOrigin) // cmd.exe and other terminals keep separate cursor states for the AltScreen // and the main buffer. We have to explicitly reset the cursor visibility // whenever we enter AltScreen. if r.cursorHidden { r.execute(ansi.HideCursor) } else { r.execute(ansi.ShowCursor) } r.repaint() } func (r *standardRenderer) exitAltScreen() { r.mtx.Lock() defer r.mtx.Unlock() if !r.altScreenActive { return } r.altScreenActive = false r.execute(ansi.DisableAltScreenBuffer) // cmd.exe and other terminals keep separate cursor states for the AltScreen // and the main buffer. We have to explicitly reset the cursor visibility // whenever we exit AltScreen. if r.cursorHidden { r.execute(ansi.HideCursor) } else { r.execute(ansi.ShowCursor) } r.repaint() } func (r *standardRenderer) showCursor() { r.mtx.Lock() defer r.mtx.Unlock() r.cursorHidden = false r.execute(ansi.ShowCursor) } func (r *standardRenderer) hideCursor() { r.mtx.Lock() defer r.mtx.Unlock() r.cursorHidden = true r.execute(ansi.HideCursor) } func (r *standardRenderer) enableMouseCellMotion() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EnableMouseCellMotion) } func (r *standardRenderer) disableMouseCellMotion() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.DisableMouseCellMotion) } func (r *standardRenderer) enableMouseAllMotion() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EnableMouseAllMotion) } func (r *standardRenderer) disableMouseAllMotion() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.DisableMouseAllMotion) } func (r *standardRenderer) enableMouseSGRMode() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EnableMouseSgrExt) } func (r *standardRenderer) disableMouseSGRMode() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.DisableMouseSgrExt) } func (r *standardRenderer) enableBracketedPaste() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.EnableBracketedPaste) r.bpActive = true } func (r *standardRenderer) disableBracketedPaste() { r.mtx.Lock() defer r.mtx.Unlock() r.execute(ansi.DisableBracketedPaste) r.bpActive = false } func (r *standardRenderer) bracketedPasteActive() bool { r.mtx.Lock() defer r.mtx.Unlock() return r.bpActive } // setWindowTitle sets the terminal window title. func (r *standardRenderer) setWindowTitle(title string) { r.execute(ansi.SetWindowTitle(title)) } // setIgnoredLines specifies lines not to be touched by the standard Bubble Tea // renderer. func (r *standardRenderer) setIgnoredLines(from int, to int) { // Lock if we're going to be clearing some lines since we don't want // anything jacking our cursor. if r.linesRendered > 0 { r.mtx.Lock() defer r.mtx.Unlock() } if r.ignoreLines == nil { r.ignoreLines = make(map[int]struct{}) } for i := from; i < to; i++ { r.ignoreLines[i] = struct{}{} } // Erase ignored lines if r.linesRendered > 0 { buf := &bytes.Buffer{} for i := r.linesRendered - 1; i >= 0; i-- { if _, exists := r.ignoreLines[i]; exists { buf.WriteString(ansi.EraseEntireLine) } buf.WriteString(ansi.CursorUp1) } buf.WriteString(ansi.MoveCursor(r.linesRendered, 0)) // put cursor back _, _ = r.out.Write(buf.Bytes()) } } // clearIgnoredLines returns control of any ignored lines to the standard // Bubble Tea renderer. That is, any lines previously set to be ignored can be // rendered to again. func (r *standardRenderer) clearIgnoredLines() { r.ignoreLines = nil } // insertTop effectively scrolls up. It inserts lines at the top of a given // area designated to be a scrollable region, pushing everything else down. // This is roughly how ncurses does it. // // To call this function use command ScrollUp(). // // For this to work renderer.ignoreLines must be set to ignore the scrollable // region since we are bypassing the normal Bubble Tea renderer here. // // Because this method relies on the terminal dimensions, it's only valid for // full-window applications (generally those that use the alternate screen // buffer). // // This method bypasses the normal rendering buffer and is philosophically // different than the normal way we approach rendering in Bubble Tea. It's for // use in high-performance rendering, such as a pager that could potentially // be rendering very complicated ansi. In cases where the content is simpler // standard Bubble Tea rendering should suffice. func (r *standardRenderer) insertTop(lines []string, topBoundary, bottomBoundary int) { r.mtx.Lock() defer r.mtx.Unlock() buf := &bytes.Buffer{} buf.WriteString(ansi.SetScrollingRegion(topBoundary, bottomBoundary)) buf.WriteString(ansi.MoveCursor(topBoundary, 0)) buf.WriteString(ansi.InsertLine(len(lines))) _, _ = buf.WriteString(strings.Join(lines, "\r\n")) buf.WriteString(ansi.SetScrollingRegion(0, r.height)) // Move cursor back to where the main rendering routine expects it to be buf.WriteString(ansi.MoveCursor(r.linesRendered, 0)) _, _ = r.out.Write(buf.Bytes()) } // insertBottom effectively scrolls down. It inserts lines at the bottom of // a given area designated to be a scrollable region, pushing everything else // up. This is roughly how ncurses does it. // // To call this function use the command ScrollDown(). // // See note in insertTop() for caveats, how this function only makes sense for // full-window applications, and how it differs from the normal way we do // rendering in Bubble Tea. func (r *standardRenderer) insertBottom(lines []string, topBoundary, bottomBoundary int) { r.mtx.Lock() defer r.mtx.Unlock() buf := &bytes.Buffer{} buf.WriteString(ansi.SetScrollingRegion(topBoundary, bottomBoundary)) buf.WriteString(ansi.MoveCursor(bottomBoundary, 0)) _, _ = buf.WriteString("\r\n" + strings.Join(lines, "\r\n")) buf.WriteString(ansi.SetScrollingRegion(0, r.height)) // Move cursor back to where the main rendering routine expects it to be buf.WriteString(ansi.MoveCursor(r.linesRendered, 0)) _, _ = r.out.Write(buf.Bytes()) } // handleMessages handles internal messages for the renderer. func (r *standardRenderer) handleMessages(msg Msg) { switch msg := msg.(type) { case repaintMsg: // Force a repaint by clearing the render cache as we slide into a // render. r.mtx.Lock() r.repaint() r.mtx.Unlock() case WindowSizeMsg: r.mtx.Lock() r.width = msg.Width r.height = msg.Height r.repaint() r.mtx.Unlock() case clearScrollAreaMsg: r.clearIgnoredLines() // Force a repaint on the area where the scrollable stuff was in this // update cycle r.mtx.Lock() r.repaint() r.mtx.Unlock() case syncScrollAreaMsg: // Re-render scrolling area r.clearIgnoredLines() r.setIgnoredLines(msg.topBoundary, msg.bottomBoundary) r.insertTop(msg.lines, msg.topBoundary, msg.bottomBoundary) // Force non-scrolling stuff to repaint in this update cycle r.mtx.Lock() r.repaint() r.mtx.Unlock() case scrollUpMsg: r.insertTop(msg.lines, msg.topBoundary, msg.bottomBoundary) case scrollDownMsg: r.insertBottom(msg.lines, msg.topBoundary, msg.bottomBoundary) case printLineMessage: if !r.altScreenActive { lines := strings.Split(msg.messageBody, "\n") r.mtx.Lock() r.queuedMessageLines = append(r.queuedMessageLines, lines...) r.repaint() r.mtx.Unlock() } } } // HIGH-PERFORMANCE RENDERING STUFF type syncScrollAreaMsg struct { lines []string topBoundary int bottomBoundary int } // SyncScrollArea performs a paint of the entire region designated to be the // scrollable area. This is required to initialize the scrollable region and // should also be called on resize (WindowSizeMsg). // // For high-performance, scroll-based rendering only. func SyncScrollArea(lines []string, topBoundary int, bottomBoundary int) Cmd { return func() Msg { return syncScrollAreaMsg{ lines: lines, topBoundary: topBoundary, bottomBoundary: bottomBoundary, } } } type clearScrollAreaMsg struct{} // ClearScrollArea deallocates the scrollable region and returns the control of // those lines to the main rendering routine. // // For high-performance, scroll-based rendering only. func ClearScrollArea() Msg { return clearScrollAreaMsg{} } type scrollUpMsg struct { lines []string topBoundary int bottomBoundary int } // ScrollUp adds lines to the top of the scrollable region, pushing existing // lines below down. Lines that are pushed out the scrollable region disappear // from view. // // For high-performance, scroll-based rendering only. func ScrollUp(newLines []string, topBoundary, bottomBoundary int) Cmd { return func() Msg { return scrollUpMsg{ lines: newLines, topBoundary: topBoundary, bottomBoundary: bottomBoundary, } } } type scrollDownMsg struct { lines []string topBoundary int bottomBoundary int } // ScrollDown adds lines to the bottom of the scrollable region, pushing // existing lines above up. Lines that are pushed out of the scrollable region // disappear from view. // // For high-performance, scroll-based rendering only. func ScrollDown(newLines []string, topBoundary, bottomBoundary int) Cmd { return func() Msg { return scrollDownMsg{ lines: newLines, topBoundary: topBoundary, bottomBoundary: bottomBoundary, } } } type printLineMessage struct { messageBody string } // Println prints above the Program. This output is unmanaged by the program and // will persist across renders by the Program. // // Unlike fmt.Println (but similar to log.Println) the message will be print on // its own line. // // If the altscreen is active no output will be printed. func Println(args ...interface{}) Cmd { return func() Msg { return printLineMessage{ messageBody: fmt.Sprint(args...), } } } // Printf prints above the Program. It takes a format template followed by // values similar to fmt.Printf. This output is unmanaged by the program and // will persist across renders by the Program. // // Unlike fmt.Printf (but similar to log.Printf) the message will be print on // its own line. // // If the altscreen is active no output will be printed. func Printf(template string, args ...interface{}) Cmd { return func() Msg { return printLineMessage{ messageBody: fmt.Sprintf(template, args...), } } } bubbletea-0.27.0/tea.go000066400000000000000000000455331465647402200146510ustar00rootroot00000000000000// Package tea provides a framework for building rich terminal user interfaces // based on the paradigms of The Elm Architecture. It's well-suited for simple // and complex terminal applications, either inline, full-window, or a mix of // both. It's been battle-tested in several large projects and is // production-ready. // // A tutorial is available at https://github.com/charmbracelet/bubbletea/tree/master/tutorials // // Example programs can be found at https://github.com/charmbracelet/bubbletea/tree/master/examples package tea import ( "context" "errors" "fmt" "io" "os" "os/signal" "runtime/debug" "sync" "sync/atomic" "syscall" "github.com/charmbracelet/x/term" "github.com/muesli/cancelreader" "golang.org/x/sync/errgroup" ) // ErrProgramKilled is returned by [Program.Run] when the program got killed. var ErrProgramKilled = errors.New("program was killed") // Msg contain data from the result of a IO operation. Msgs trigger the update // function and, henceforth, the UI. type Msg interface{} // Model contains the program's state as well as its core functions. type Model interface { // Init is the first function that will be called. It returns an optional // initial command. To not perform an initial command return nil. Init() Cmd // Update is called when a message is received. Use it to inspect messages // and, in response, update the model and/or send a command. Update(Msg) (Model, Cmd) // View renders the program's UI, which is just a string. The view is // rendered after every Update. View() string } // Cmd is an IO operation that returns a message when it's complete. If it's // nil it's considered a no-op. Use it for things like HTTP requests, timers, // saving and loading from disk, and so on. // // Note that there's almost never a reason to use a command to send a message // to another part of your program. That can almost always be done in the // update function. type Cmd func() Msg type inputType int const ( defaultInput inputType = iota ttyInput customInput ) // String implements the stringer interface for [inputType]. It is inteded to // be used in testing. func (i inputType) String() string { return [...]string{ "default input", "tty input", "custom input", }[i] } // Options to customize the program during its initialization. These are // generally set with ProgramOptions. // // The options here are treated as bits. type startupOptions int16 func (s startupOptions) has(option startupOptions) bool { return s&option != 0 } const ( withAltScreen startupOptions = 1 << iota withMouseCellMotion withMouseAllMotion withANSICompressor withoutSignalHandler // Catching panics is incredibly useful for restoring the terminal to a // usable state after a panic occurs. When this is set, Bubble Tea will // recover from panics, print the stack trace, and disable raw mode. This // feature is on by default. withoutCatchPanics withoutBracketedPaste ) // channelHandlers manages the series of channels returned by various processes. // It allows us to wait for those processes to terminate before exiting the // program. type channelHandlers []chan struct{} // Adds a channel to the list of handlers. We wait for all handlers to terminate // gracefully on shutdown. func (h *channelHandlers) add(ch chan struct{}) { *h = append(*h, ch) } // shutdown waits for all handlers to terminate. func (h channelHandlers) shutdown() { var wg sync.WaitGroup for _, ch := range h { wg.Add(1) go func(ch chan struct{}) { <-ch wg.Done() }(ch) } wg.Wait() } // Program is a terminal user interface. type Program struct { initialModel Model // Configuration options that will set as the program is initializing, // treated as bits. These options can be set via various ProgramOptions. startupOptions startupOptions // startupTitle is the title that will be set on the terminal when the // program starts. startupTitle string inputType inputType ctx context.Context cancel context.CancelFunc msgs chan Msg errs chan error finished chan struct{} // where to send output, this will usually be os.Stdout. output io.Writer // ttyOutput is null if output is not a TTY. ttyOutput term.File previousOutputState *term.State renderer renderer // the environment variables for the program, defaults to os.Environ(). environ []string // where to read inputs from, this will usually be os.Stdin. input io.Reader // ttyInput is null if input is not a TTY. ttyInput term.File previousTtyInputState *term.State cancelReader cancelreader.CancelReader readLoopDone chan struct{} // was the altscreen active before releasing the terminal? altScreenWasActive bool ignoreSignals uint32 bpWasActive bool // was the bracketed paste mode active before releasing the terminal? filter func(Model, Msg) Msg // fps is the frames per second we should set on the renderer, if // applicable, fps int } // Quit is a special command that tells the Bubble Tea program to exit. func Quit() Msg { return QuitMsg{} } // QuitMsg signals that the program should quit. You can send a QuitMsg with // Quit. type QuitMsg struct{} // Suspend is a special command that tells the Bubble Tea program to suspend. func Suspend() Msg { return SuspendMsg{} } // SuspendMsg signals the program should suspend. // This usually happens when ctrl+z is pressed on common programs, but since // bubbletea puts the terminal in raw mode, we need to handle it in a // per-program basis. // You can send this message with Suspend. type SuspendMsg struct{} // ResumeMsg can be listen to to do something once a program is resumed back // from a suspend state. type ResumeMsg struct{} // NewProgram creates a new Program. func NewProgram(model Model, opts ...ProgramOption) *Program { p := &Program{ initialModel: model, msgs: make(chan Msg), } // Apply all options to the program. for _, opt := range opts { opt(p) } // A context can be provided with a ProgramOption, but if none was provided // we'll use the default background context. if p.ctx == nil { p.ctx = context.Background() } // Initialize context and teardown channel. p.ctx, p.cancel = context.WithCancel(p.ctx) // if no output was set, set it to stdout if p.output == nil { p.output = os.Stdout } // if no environment was set, set it to os.Environ() if p.environ == nil { p.environ = os.Environ() } return p } func (p *Program) handleSignals() chan struct{} { ch := make(chan struct{}) // Listen for SIGINT and SIGTERM. // // In most cases ^C will not send an interrupt because the terminal will be // in raw mode and ^C will be captured as a keystroke and sent along to // Program.Update as a KeyMsg. When input is not a TTY, however, ^C will be // caught here. // // SIGTERM is sent by unix utilities (like kill) to terminate a process. go func() { sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) defer func() { signal.Stop(sig) close(ch) }() for { select { case <-p.ctx.Done(): return case <-sig: if atomic.LoadUint32(&p.ignoreSignals) == 0 { p.msgs <- QuitMsg{} return } } } }() return ch } // handleResize handles terminal resize events. func (p *Program) handleResize() chan struct{} { ch := make(chan struct{}) if p.ttyOutput != nil { // Get the initial terminal size and send it to the program. go p.checkResize() // Listen for window resizes. go p.listenForResize(ch) } else { close(ch) } return ch } // handleCommands runs commands in a goroutine and sends the result to the // program's message channel. func (p *Program) handleCommands(cmds chan Cmd) chan struct{} { ch := make(chan struct{}) go func() { defer close(ch) for { select { case <-p.ctx.Done(): return case cmd := <-cmds: if cmd == nil { continue } // Don't wait on these goroutines, otherwise the shutdown // latency would get too large as a Cmd can run for some time // (e.g. tick commands that sleep for half a second). It's not // possible to cancel them so we'll have to leak the goroutine // until Cmd returns. go func() { msg := cmd() // this can be long. p.Send(msg) }() } } }() return ch } func (p *Program) disableMouse() { p.renderer.disableMouseCellMotion() p.renderer.disableMouseAllMotion() p.renderer.disableMouseSGRMode() } // eventLoop is the central message loop. It receives and handles the default // Bubble Tea messages, update the model and triggers redraws. func (p *Program) eventLoop(model Model, cmds chan Cmd) (Model, error) { for { select { case <-p.ctx.Done(): return model, nil case err := <-p.errs: return model, err case msg := <-p.msgs: // Filter messages. if p.filter != nil { msg = p.filter(model, msg) } if msg == nil { continue } // Handle special internal messages. switch msg := msg.(type) { case QuitMsg: return model, nil case SuspendMsg: if suspendSupported { p.suspend() } case clearScreenMsg: p.renderer.clearScreen() case enterAltScreenMsg: p.renderer.enterAltScreen() case exitAltScreenMsg: p.renderer.exitAltScreen() case enableMouseCellMotionMsg, enableMouseAllMotionMsg: switch msg.(type) { case enableMouseCellMotionMsg: p.renderer.enableMouseCellMotion() case enableMouseAllMotionMsg: p.renderer.enableMouseAllMotion() } // mouse mode (1006) is a no-op if the terminal doesn't support it. p.renderer.enableMouseSGRMode() case disableMouseMsg: p.disableMouse() case showCursorMsg: p.renderer.showCursor() case hideCursorMsg: p.renderer.hideCursor() case enableBracketedPasteMsg: p.renderer.enableBracketedPaste() case disableBracketedPasteMsg: p.renderer.disableBracketedPaste() case execMsg: // NB: this blocks. p.exec(msg.cmd, msg.fn) case BatchMsg: for _, cmd := range msg { cmds <- cmd } continue case sequenceMsg: go func() { // Execute commands one at a time, in order. for _, cmd := range msg { if cmd == nil { continue } msg := cmd() if batchMsg, ok := msg.(BatchMsg); ok { g, _ := errgroup.WithContext(p.ctx) for _, cmd := range batchMsg { cmd := cmd g.Go(func() error { p.Send(cmd()) return nil }) } //nolint:errcheck g.Wait() // wait for all commands from batch msg to finish continue } p.Send(msg) } }() case setWindowTitleMsg: p.SetWindowTitle(string(msg)) case windowSizeMsg: go p.checkResize() } // Process internal messages for the renderer. if r, ok := p.renderer.(*standardRenderer); ok { r.handleMessages(msg) } var cmd Cmd model, cmd = model.Update(msg) // run update cmds <- cmd // process command (if any) p.renderer.write(model.View()) // send view to renderer } } } // Run initializes the program and runs its event loops, blocking until it gets // terminated by either [Program.Quit], [Program.Kill], or its signal handler. // Returns the final model. func (p *Program) Run() (Model, error) { handlers := channelHandlers{} cmds := make(chan Cmd) p.errs = make(chan error) p.finished = make(chan struct{}, 1) defer p.cancel() switch p.inputType { case defaultInput: p.input = os.Stdin // The user has not set a custom input, so we need to check whether or // not standard input is a terminal. If it's not, we open a new TTY for // input. This will allow things to "just work" in cases where data was // piped in or redirected to the application. // // To disable input entirely pass nil to the [WithInput] program option. f, isFile := p.input.(term.File) if !isFile { break } if term.IsTerminal(f.Fd()) { break } f, err := openInputTTY() if err != nil { return p.initialModel, err } defer f.Close() //nolint:errcheck p.input = f case ttyInput: // Open a new TTY, by request f, err := openInputTTY() if err != nil { return p.initialModel, err } defer f.Close() //nolint:errcheck p.input = f case customInput: // (There is nothing extra to do.) } // Handle signals. if !p.startupOptions.has(withoutSignalHandler) { handlers.add(p.handleSignals()) } // Recover from panics. if !p.startupOptions.has(withoutCatchPanics) { defer func() { if r := recover(); r != nil { p.shutdown(true) fmt.Printf("Caught panic:\n\n%s\n\nRestoring terminal...\n\n", r) debug.PrintStack() return } }() } // If no renderer is set use the standard one. if p.renderer == nil { p.renderer = newRenderer(p.output, p.startupOptions.has(withANSICompressor), p.fps) } // Check if output is a TTY before entering raw mode, hiding the cursor and // so on. if err := p.initTerminal(); err != nil { return p.initialModel, err } // Honor program startup options. if p.startupTitle != "" { p.renderer.setWindowTitle(p.startupTitle) } if p.startupOptions&withAltScreen != 0 { p.renderer.enterAltScreen() } if p.startupOptions&withoutBracketedPaste == 0 { p.renderer.enableBracketedPaste() } if p.startupOptions&withMouseCellMotion != 0 { p.renderer.enableMouseCellMotion() p.renderer.enableMouseSGRMode() } else if p.startupOptions&withMouseAllMotion != 0 { p.renderer.enableMouseAllMotion() p.renderer.enableMouseSGRMode() } // Start the renderer. p.renderer.start() // Initialize the program. model := p.initialModel if initCmd := model.Init(); initCmd != nil { ch := make(chan struct{}) handlers.add(ch) go func() { defer close(ch) select { case cmds <- initCmd: case <-p.ctx.Done(): } }() } // Render the initial view. p.renderer.write(model.View()) // Subscribe to user input. if p.input != nil { if err := p.initCancelReader(); err != nil { return model, err } } // Handle resize events. handlers.add(p.handleResize()) // Process commands. handlers.add(p.handleCommands(cmds)) // Run event loop, handle updates and draw. model, err := p.eventLoop(model, cmds) killed := p.ctx.Err() != nil if killed { err = fmt.Errorf("%w: %s", ErrProgramKilled, p.ctx.Err()) } else { // Ensure we rendered the final state of the model. p.renderer.write(model.View()) } // Tear down. p.cancel() // Check if the cancel reader has been setup before waiting and closing. if p.cancelReader != nil { // Wait for input loop to finish. if p.cancelReader.Cancel() { p.waitForReadLoop() } _ = p.cancelReader.Close() } // Wait for all handlers to finish. handlers.shutdown() // Restore terminal state. p.shutdown(killed) return model, err } // StartReturningModel initializes the program and runs its event loops, // blocking until it gets terminated by either [Program.Quit], [Program.Kill], // or its signal handler. Returns the final model. // // Deprecated: please use [Program.Run] instead. func (p *Program) StartReturningModel() (Model, error) { return p.Run() } // Start initializes the program and runs its event loops, blocking until it // gets terminated by either [Program.Quit], [Program.Kill], or its signal // handler. // // Deprecated: please use [Program.Run] instead. func (p *Program) Start() error { _, err := p.Run() return err } // Send sends a message to the main update function, effectively allowing // messages to be injected from outside the program for interoperability // purposes. // // If the program hasn't started yet this will be a blocking operation. // If the program has already been terminated this will be a no-op, so it's safe // to send messages after the program has exited. func (p *Program) Send(msg Msg) { select { case <-p.ctx.Done(): case p.msgs <- msg: } } // Quit is a convenience function for quitting Bubble Tea programs. Use it // when you need to shut down a Bubble Tea program from the outside. // // If you wish to quit from within a Bubble Tea program use the Quit command. // // If the program is not running this will be a no-op, so it's safe to call // if the program is unstarted or has already exited. func (p *Program) Quit() { p.Send(Quit()) } // Kill stops the program immediately and restores the former terminal state. // The final render that you would normally see when quitting will be skipped. // [program.Run] returns a [ErrProgramKilled] error. func (p *Program) Kill() { p.cancel() } // Wait waits/blocks until the underlying Program finished shutting down. func (p *Program) Wait() { <-p.finished } // shutdown performs operations to free up resources and restore the terminal // to its original state. func (p *Program) shutdown(kill bool) { if p.renderer != nil { if kill { p.renderer.kill() } else { p.renderer.stop() } } _ = p.restoreTerminalState() p.finished <- struct{}{} } // ReleaseTerminal restores the original terminal state and cancels the input // reader. You can return control to the Program with RestoreTerminal. func (p *Program) ReleaseTerminal() error { atomic.StoreUint32(&p.ignoreSignals, 1) if p.cancelReader != nil { p.cancelReader.Cancel() } p.waitForReadLoop() if p.renderer != nil { p.renderer.stop() p.altScreenWasActive = p.renderer.altScreen() p.bpWasActive = p.renderer.bracketedPasteActive() } return p.restoreTerminalState() } // RestoreTerminal reinitializes the Program's input reader, restores the // terminal to the former state when the program was running, and repaints. // Use it to reinitialize a Program after running ReleaseTerminal. func (p *Program) RestoreTerminal() error { atomic.StoreUint32(&p.ignoreSignals, 0) if err := p.initTerminal(); err != nil { return err } if err := p.initCancelReader(); err != nil { return err } if p.altScreenWasActive { p.renderer.enterAltScreen() } else { // entering alt screen already causes a repaint. go p.Send(repaintMsg{}) } if p.renderer != nil { p.renderer.start() } if p.bpWasActive { p.renderer.enableBracketedPaste() } // If the output is a terminal, it may have been resized while another // process was at the foreground, in which case we may not have received // SIGWINCH. Detect any size change now and propagate the new size as // needed. go p.checkResize() return nil } // Println prints above the Program. This output is unmanaged by the program // and will persist across renders by the Program. // // If the altscreen is active no output will be printed. func (p *Program) Println(args ...interface{}) { p.msgs <- printLineMessage{ messageBody: fmt.Sprint(args...), } } // Printf prints above the Program. It takes a format template followed by // values similar to fmt.Printf. This output is unmanaged by the program and // will persist across renders by the Program. // // Unlike fmt.Printf (but similar to log.Printf) the message will be print on // its own line. // // If the altscreen is active no output will be printed. func (p *Program) Printf(template string, args ...interface{}) { p.msgs <- printLineMessage{ messageBody: fmt.Sprintf(template, args...), } } bubbletea-0.27.0/tea_test.go000066400000000000000000000114201465647402200156740ustar00rootroot00000000000000package tea import ( "bytes" "context" "errors" "sync/atomic" "testing" "time" ) type incrementMsg struct{} type testModel struct { executed atomic.Value counter atomic.Value } func (m testModel) Init() Cmd { return nil } func (m *testModel) Update(msg Msg) (Model, Cmd) { switch msg.(type) { case incrementMsg: i := m.counter.Load() if i == nil { m.counter.Store(1) } else { m.counter.Store(i.(int) + 1) } case KeyMsg: return m, Quit } return m, nil } func (m *testModel) View() string { m.executed.Store(true) return "success\n" } func TestTeaModel(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer in.Write([]byte("q")) ctx, cancel := context.WithTimeout(context.TODO(), 3*time.Second) defer cancel() p := NewProgram(&testModel{}, WithInput(&in), WithOutput(&buf), WithContext(ctx)) if _, err := p.Run(); err != nil { t.Fatal(err) } if buf.Len() == 0 { t.Fatal("no output") } } func TestTeaQuit(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) go func() { for { time.Sleep(time.Millisecond) if m.executed.Load() != nil { p.Quit() return } } }() if _, err := p.Run(); err != nil { t.Fatal(err) } } func TestTeaWithFilter(t *testing.T) { testTeaWithFilter(t, 0) testTeaWithFilter(t, 1) testTeaWithFilter(t, 2) } func testTeaWithFilter(t *testing.T, preventCount uint32) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} shutdowns := uint32(0) p := NewProgram(m, WithInput(&in), WithOutput(&buf), WithFilter(func(_ Model, msg Msg) Msg { if _, ok := msg.(QuitMsg); !ok { return msg } if shutdowns < preventCount { atomic.AddUint32(&shutdowns, 1) return nil } return msg })) go func() { for atomic.LoadUint32(&shutdowns) <= preventCount { time.Sleep(time.Millisecond) p.Quit() } }() if err := p.Start(); err != nil { t.Fatal(err) } if shutdowns != preventCount { t.Errorf("Expected %d prevented shutdowns, got %d", preventCount, shutdowns) } } func TestTeaKill(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) go func() { for { time.Sleep(time.Millisecond) if m.executed.Load() != nil { p.Kill() return } } }() if _, err := p.Run(); !errors.Is(err, ErrProgramKilled) { t.Fatalf("Expected %v, got %v", ErrProgramKilled, err) } } func TestTeaContext(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var buf bytes.Buffer var in bytes.Buffer m := &testModel{} p := NewProgram(m, WithContext(ctx), WithInput(&in), WithOutput(&buf)) go func() { for { time.Sleep(time.Millisecond) if m.executed.Load() != nil { cancel() return } } }() if _, err := p.Run(); !errors.Is(err, ErrProgramKilled) { t.Fatalf("Expected %v, got %v", ErrProgramKilled, err) } } func TestTeaBatchMsg(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer inc := func() Msg { return incrementMsg{} } m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) go func() { p.Send(BatchMsg{inc, inc}) for { time.Sleep(time.Millisecond) i := m.counter.Load() if i != nil && i.(int) >= 2 { p.Quit() return } } }() if _, err := p.Run(); err != nil { t.Fatal(err) } if m.counter.Load() != 2 { t.Fatalf("counter should be 2, got %d", m.counter.Load()) } } func TestTeaSequenceMsg(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer inc := func() Msg { return incrementMsg{} } m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) go p.Send(sequenceMsg{inc, inc, Quit}) if _, err := p.Run(); err != nil { t.Fatal(err) } if m.counter.Load() != 2 { t.Fatalf("counter should be 2, got %d", m.counter.Load()) } } func TestTeaSequenceMsgWithBatchMsg(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer inc := func() Msg { return incrementMsg{} } batch := func() Msg { return BatchMsg{inc, inc} } m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) go p.Send(sequenceMsg{batch, inc, Quit}) if _, err := p.Run(); err != nil { t.Fatal(err) } if m.counter.Load() != 3 { t.Fatalf("counter should be 3, got %d", m.counter.Load()) } } func TestTeaSend(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} p := NewProgram(m, WithInput(&in), WithOutput(&buf)) // sending before the program is started is a blocking operation go p.Send(Quit()) if _, err := p.Run(); err != nil { t.Fatal(err) } // sending a message after program has quit is a no-op p.Send(Quit()) } func TestTeaNoRun(t *testing.T) { var buf bytes.Buffer var in bytes.Buffer m := &testModel{} NewProgram(m, WithInput(&in), WithOutput(&buf)) } bubbletea-0.27.0/tty.go000066400000000000000000000053021465647402200147060ustar00rootroot00000000000000package tea import ( "errors" "fmt" "io" "time" "github.com/charmbracelet/x/term" "github.com/muesli/cancelreader" ) func (p *Program) suspend() { if err := p.ReleaseTerminal(); err != nil { // If we can't release input, abort. return } suspendProcess() _ = p.RestoreTerminal() go p.Send(ResumeMsg{}) } func (p *Program) initTerminal() error { if err := p.initInput(); err != nil { return err } p.renderer.hideCursor() return nil } // restoreTerminalState restores the terminal to the state prior to running the // Bubble Tea program. func (p *Program) restoreTerminalState() error { if p.renderer != nil { p.renderer.disableBracketedPaste() p.renderer.showCursor() p.disableMouse() if p.renderer.altScreen() { p.renderer.exitAltScreen() // give the terminal a moment to catch up time.Sleep(time.Millisecond * 10) //nolint:gomnd } } return p.restoreInput() } // restoreInput restores the tty input to its original state. func (p *Program) restoreInput() error { if p.ttyInput != nil && p.previousTtyInputState != nil { if err := term.Restore(p.ttyInput.Fd(), p.previousTtyInputState); err != nil { return fmt.Errorf("error restoring console: %w", err) } } if p.ttyOutput != nil && p.previousOutputState != nil { if err := term.Restore(p.ttyOutput.Fd(), p.previousOutputState); err != nil { return fmt.Errorf("error restoring console: %w", err) } } return nil } // initCancelReader (re)commences reading inputs. func (p *Program) initCancelReader() error { var err error p.cancelReader, err = newInputReader(p.input) if err != nil { return fmt.Errorf("error creating cancelreader: %w", err) } p.readLoopDone = make(chan struct{}) go p.readLoop() return nil } func (p *Program) readLoop() { defer close(p.readLoopDone) err := readInputs(p.ctx, p.msgs, p.cancelReader) if !errors.Is(err, io.EOF) && !errors.Is(err, cancelreader.ErrCanceled) { select { case <-p.ctx.Done(): case p.errs <- err: } } } // waitForReadLoop waits for the cancelReader to finish its read loop. func (p *Program) waitForReadLoop() { select { case <-p.readLoopDone: case <-time.After(500 * time.Millisecond): //nolint:gomnd // The read loop hangs, which means the input // cancelReader's cancel function has returned true even // though it was not able to cancel the read. } } // checkResize detects the current size of the output and informs the program // via a WindowSizeMsg. func (p *Program) checkResize() { if p.ttyOutput == nil { // can't query window size return } w, h, err := term.GetSize(p.ttyOutput.Fd()) if err != nil { select { case <-p.ctx.Done(): case p.errs <- err: } return } p.Send(WindowSizeMsg{ Width: w, Height: h, }) } bubbletea-0.27.0/tty_unix.go000066400000000000000000000021061465647402200157500ustar00rootroot00000000000000//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix || zos // +build darwin dragonfly freebsd linux netbsd openbsd solaris aix zos package tea import ( "fmt" "os" "os/signal" "syscall" "github.com/charmbracelet/x/term" ) func (p *Program) initInput() (err error) { // Check if input is a terminal if f, ok := p.input.(term.File); ok && term.IsTerminal(f.Fd()) { p.ttyInput = f p.previousTtyInputState, err = term.MakeRaw(p.ttyInput.Fd()) if err != nil { return fmt.Errorf("error entering raw mode: %w", err) } } if f, ok := p.output.(term.File); ok && term.IsTerminal(f.Fd()) { p.ttyOutput = f } return nil } func openInputTTY() (*os.File, error) { f, err := os.Open("/dev/tty") if err != nil { return nil, fmt.Errorf("could not open a new TTY: %w", err) } return f, nil } const suspendSupported = true // Send SIGTSTP to the entire process group. func suspendProcess() { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGCONT) _ = syscall.Kill(0, syscall.SIGTSTP) // blocks until a CONT happens... <-c } bubbletea-0.27.0/tty_windows.go000066400000000000000000000032531465647402200164630ustar00rootroot00000000000000//go:build windows // +build windows package tea import ( "fmt" "os" "github.com/charmbracelet/x/term" "golang.org/x/sys/windows" ) func (p *Program) initInput() (err error) { // Save stdin state and enable VT input // We also need to enable VT // input here. if f, ok := p.input.(term.File); ok && term.IsTerminal(f.Fd()) { p.ttyInput = f p.previousTtyInputState, err = term.MakeRaw(p.ttyInput.Fd()) if err != nil { return err } // Enable VT input var mode uint32 if err := windows.GetConsoleMode(windows.Handle(p.ttyInput.Fd()), &mode); err != nil { return fmt.Errorf("error getting console mode: %w", err) } if err := windows.SetConsoleMode(windows.Handle(p.ttyInput.Fd()), mode|windows.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { return fmt.Errorf("error setting console mode: %w", err) } } // Save output screen buffer state and enable VT processing. if f, ok := p.output.(term.File); ok && term.IsTerminal(f.Fd()) { p.ttyOutput = f p.previousOutputState, err = term.GetState(f.Fd()) if err != nil { return err } var mode uint32 if err := windows.GetConsoleMode(windows.Handle(p.ttyOutput.Fd()), &mode); err != nil { return fmt.Errorf("error getting console mode: %w", err) } if err := windows.SetConsoleMode(windows.Handle(p.ttyOutput.Fd()), mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil { return fmt.Errorf("error setting console mode: %w", err) } } return } // Open the Windows equivalent of a TTY. func openInputTTY() (*os.File, error) { f, err := os.OpenFile("CONIN$", os.O_RDWR, 0o644) if err != nil { return nil, err } return f, nil } const suspendSupported = false func suspendProcess() {} bubbletea-0.27.0/tutorials/000077500000000000000000000000001465647402200155655ustar00rootroot00000000000000bubbletea-0.27.0/tutorials/basics/000077500000000000000000000000001465647402200170315ustar00rootroot00000000000000bubbletea-0.27.0/tutorials/basics/README.md000066400000000000000000000164311465647402200203150ustar00rootroot00000000000000Bubble Tea Basics ================= Bubble Tea is based on the functional design paradigms of [The Elm Architecture][elm], which happens to work nicely with Go. It's a delightful way to build applications. This tutorial assumes you have a working knowledge of Go. By the way, the non-annotated source code for this program is available [on GitHub][tut-source]. [elm]: https://guide.elm-lang.org/architecture/ [tut-source]:https://github.com/charmbracelet/bubbletea/tree/master/tutorials/basics ## Enough! Let's get to it. For this tutorial, we're making a shopping list. To start we'll define our package and import some libraries. Our only external import will be the Bubble Tea library, which we'll call `tea` for short. ```go package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) ``` Bubble Tea programs are comprised of a **model** that describes the application state and three simple methods on that model: * **Init**, a function that returns an initial command for the application to run. * **Update**, a function that handles incoming events and updates the model accordingly. * **View**, a function that renders the UI based on the data in the model. ## The Model So let's start by defining our model which will store our application's state. It can be any type, but a `struct` usually makes the most sense. ```go type model struct { choices []string // items on the to-do list cursor int // which to-do list item our cursor is pointing at selected map[int]struct{} // which to-do items are selected } ``` ## Initialization Next, we’ll define our application’s initial state. In this case, we’re defining a function to return our initial model, however, we could just as easily define the initial model as a variable elsewhere, too. ```go func initialModel() model { return model{ // Our to-do list is a grocery list choices: []string{"Buy carrots", "Buy celery", "Buy kohlrabi"}, // A map which indicates which choices are selected. We're using // the map like a mathematical set. The keys refer to the indexes // of the `choices` slice, above. selected: make(map[int]struct{}), } } ``` Next, we define the `Init` method. `Init` can return a `Cmd` that could perform some initial I/O. For now, we don't need to do any I/O, so for the command, we'll just return `nil`, which translates to "no command." ```go func (m model) Init() tea.Cmd { // Just return `nil`, which means "no I/O right now, please." return nil } ``` ## The Update Method Next up is the update method. The update function is called when ”things happen.” Its job is to look at what has happened and return an updated model in response. It can also return a `Cmd` to make more things happen, but for now don't worry about that part. In our case, when a user presses the down arrow, `Update`’s job is to notice that the down arrow was pressed and move the cursor accordingly (or not). The “something happened” comes in the form of a `Msg`, which can be any type. Messages are the result of some I/O that took place, such as a keypress, timer tick, or a response from a server. We usually figure out which type of `Msg` we received with a type switch, but you could also use a type assertion. For now, we'll just deal with `tea.KeyMsg` messages, which are automatically sent to the update function when keys are pressed. ```go func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { // Is it a key press? case tea.KeyMsg: // Cool, what was the actual key pressed? switch msg.String() { // These keys should exit the program. case "ctrl+c", "q": return m, tea.Quit // The "up" and "k" keys move the cursor up case "up", "k": if m.cursor > 0 { m.cursor-- } // The "down" and "j" keys move the cursor down case "down", "j": if m.cursor < len(m.choices)-1 { m.cursor++ } // The "enter" key and the spacebar (a literal space) toggle // the selected state for the item that the cursor is pointing at. case "enter", " ": _, ok := m.selected[m.cursor] if ok { delete(m.selected, m.cursor) } else { m.selected[m.cursor] = struct{}{} } } } // Return the updated model to the Bubble Tea runtime for processing. // Note that we're not returning a command. return m, nil } ``` You may have noticed that ctrl+c and q above return a `tea.Quit` command with the model. That’s a special command which instructs the Bubble Tea runtime to quit, exiting the program. ## The View Method At last, it’s time to render our UI. Of all the methods, the view is the simplest. We look at the model in its current state and use it to return a `string`. That string is our UI! Because the view describes the entire UI of your application, you don’t have to worry about redrawing logic and stuff like that. Bubble Tea takes care of it for you. ```go func (m model) View() string { // The header s := "What should we buy at the market?\n\n" // Iterate over our choices for i, choice := range m.choices { // Is the cursor pointing at this choice? cursor := " " // no cursor if m.cursor == i { cursor = ">" // cursor! } // Is this choice selected? checked := " " // not selected if _, ok := m.selected[i]; ok { checked = "x" // selected! } // Render the row s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) } // The footer s += "\nPress q to quit.\n" // Send the UI for rendering return s } ``` ## All Together Now The last step is to simply run our program. We pass our initial model to `tea.NewProgram` and let it rip: ```go func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { fmt.Printf("Alas, there's been an error: %v", err) os.Exit(1) } } ``` ## What’s Next? This tutorial covers the basics of building an interactive terminal UI, but in the real world you'll also need to perform I/O. To learn about that have a look at the [Command Tutorial][cmd]. It's pretty simple. There are also several [Bubble Tea examples][examples] available and, of course, there are [Go Docs][docs]. [cmd]: http://github.com/charmbracelet/bubbletea/tree/master/tutorials/commands/ [examples]: http://github.com/charmbracelet/bubbletea/tree/master/examples [docs]: https://pkg.go.dev/github.com/charmbracelet/bubbletea?tab=doc ## Additional Resources * [Libraries we use with Bubble Tea](https://github.com/charmbracelet/bubbletea/#libraries-we-use-with-bubble-tea) * [Bubble Tea in the Wild](https://github.com/charmbracelet/bubbletea/#bubble-tea-in-the-wild) ### Feedback We'd love to hear your thoughts on this tutorial. Feel free to drop us a note! * [Twitter](https://twitter.com/charmcli) * [The Fediverse](https://mastodon.social/@charmcli) * [Discord](https://charm.sh/chat) *** Part of [Charm](https://charm.sh). The Charm logo Charm热爱开源 • Charm loves open source bubbletea-0.27.0/tutorials/basics/main.go000066400000000000000000000030321465647402200203020ustar00rootroot00000000000000package main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) type model struct { cursor int choices []string selected map[int]struct{} } func initialModel() model { return model{ choices: []string{"Buy carrots", "Buy celery", "Buy kohlrabi"}, // A map which indicates which choices are selected. We're using // the map like a mathematical set. The keys refer to the indexes // of the `choices` slice, above. selected: make(map[int]struct{}), } } func (m model) Init() tea.Cmd { return tea.SetWindowTitle("Grocery List") } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": return m, tea.Quit case "up", "k": if m.cursor > 0 { m.cursor-- } case "down", "j": if m.cursor < len(m.choices)-1 { m.cursor++ } case "enter", " ": _, ok := m.selected[m.cursor] if ok { delete(m.selected, m.cursor) } else { m.selected[m.cursor] = struct{}{} } } } return m, nil } func (m model) View() string { s := "What should we buy at the market?\n\n" for i, choice := range m.choices { cursor := " " if m.cursor == i { cursor = ">" } checked := " " if _, ok := m.selected[i]; ok { checked = "x" } s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) } s += "\nPress q to quit.\n" return s } func main() { p := tea.NewProgram(initialModel()) if _, err := p.Run(); err != nil { fmt.Printf("Alas, there's been an error: %v", err) os.Exit(1) } } bubbletea-0.27.0/tutorials/commands/000077500000000000000000000000001465647402200173665ustar00rootroot00000000000000bubbletea-0.27.0/tutorials/commands/README.md000066400000000000000000000160721465647402200206530ustar00rootroot00000000000000Commands in Bubble Tea ====================== This is the second tutorial for Bubble Tea covering commands, which deal with I/O. The tutorial assumes you have a working knowledge of Go and a decent understanding of [the first tutorial][basics]. You can find the non-annotated version of this program [on GitHub][source]. [basics]: https://github.com/charmbracelet/bubbletea/tree/master/tutorials/basics [source]: https://github.com/charmbracelet/bubbletea/blob/master/tutorials/commands/main.go ## Let's Go! For this tutorial we're building a very simple program that makes an HTTP request to a server and reports the status code of the response. We'll import a few necessary packages and put the URL we're going to check in a `const`. ```go package main import ( "fmt" "net/http" "os" "time" tea "github.com/charmbracelet/bubbletea" ) const url = "https://charm.sh/" ``` ## The Model Next we'll define our model. The only things we need to store are the status code of the HTTP response and a possible error. ```go type model struct { status int err error } ``` ## Commands and Messages `Cmd`s are functions that perform some I/O and then return a `Msg`. Checking the time, ticking a timer, reading from the disk, and network stuff are all I/O and should be run through commands. That might sound harsh, but it will keep your Bubble Tea program straightforward and simple. Anyway, let's write a `Cmd` that makes a request to a server and returns the result as a `Msg`. ```go func checkServer() tea.Msg { // Create an HTTP client and make a GET request. c := &http.Client{Timeout: 10 * time.Second} res, err := c.Get(url) if err != nil { // There was an error making our request. Wrap the error we received // in a message and return it. return errMsg{err} } // We received a response from the server. Return the HTTP status code // as a message. return statusMsg(res.StatusCode) } type statusMsg int type errMsg struct{ err error } // For messages that contain errors it's often handy to also implement the // error interface on the message. func (e errMsg) Error() string { return e.err.Error() } ``` And notice that we've defined two new `Msg` types. They can be any type, even an empty struct. We'll come back to them later in our update function. First, let's write our initialization function. ## The Initialization Method The initialization method is very simple: we return the `Cmd` we made earlier. Note that we don't call the function; the Bubble Tea runtime will do that when the time is right. ```go func (m model) Init() (tea.Cmd) { return checkServer } ``` ## The Update Method Internally, `Cmd`s run asynchronously in a goroutine. The `Msg` they return is collected and sent to our update function for handling. Remember those message types we made earlier when we were making the `checkServer` command? We handle them here. This makes dealing with many asynchronous operations very easy. ```go func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case statusMsg: // The server returned a status message. Save it to our model. Also // tell the Bubble Tea runtime we want to exit because we have nothing // else to do. We'll still be able to render a final view with our // status message. m.status = int(msg) return m, tea.Quit case errMsg: // There was an error. Note it in the model. And tell the runtime // we're done and want to quit. m.err = msg return m, tea.Quit case tea.KeyMsg: // Ctrl+c exits. Even with short running programs it's good to have // a quit key, just in case your logic is off. Users will be very // annoyed if they can't exit. if msg.Type == tea.KeyCtrlC { return m, tea.Quit } } // If we happen to get any other messages, don't do anything. return m, nil } ``` ## The View Function Our view is very straightforward. We look at the current model and build a string accordingly: ```go func (m model) View() string { // If there's an error, print it out and don't do anything else. if m.err != nil { return fmt.Sprintf("\nWe had some trouble: %v\n\n", m.err) } // Tell the user we're doing something. s := fmt.Sprintf("Checking %s ... ", url) // When the server responds with a status, add it to the current line. if m.status > 0 { s += fmt.Sprintf("%d %s!", m.status, http.StatusText(m.status)) } // Send off whatever we came up with above for rendering. return "\n" + s + "\n\n" } ``` ## Run the program The only thing left to do is run the program, so let's do that! Our initial model doesn't need any data at all in this case, we just initialize it with a `model` struct with default values. ```go func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Printf("Uh oh, there was an error: %v\n", err) os.Exit(1) } } ``` And that's that. There's one more thing that is helpful to know about `Cmd`s, though. ## One More Thing About Commands `Cmd`s are defined in Bubble Tea as `type Cmd func() Msg`. So they're just functions that don't take any arguments and return a `Msg`, which can be any type. If you need to pass arguments to a command, you just make a function that returns a command. For example: ```go func cmdWithArg(id int) tea.Cmd { return func() tea.Msg { return someMsg{id: id} } } ``` A more real-world example looks like: ```go func checkSomeUrl(url string) tea.Cmd { return func() tea.Msg { c := &http.Client{Timeout: 10 * time.Second} res, err := c.Get(url) if err != nil { return errMsg{err} } return statusMsg(res.StatusCode) } } ``` Anyway, just make sure you do as much stuff as you can in the innermost function, because that's the one that runs asynchronously. ## Now What? After doing this tutorial and [the previous one][basics] you should be ready to build a Bubble Tea program of your own. We also recommend that you look at the Bubble Tea [example programs][examples] as well as [Bubbles][bubbles], a component library for Bubble Tea. And, of course, check out the [Go Docs][docs]. [bubbles]: https://github.com/charmbracelet/bubbles [docs]: https://pkg.go.dev/github.com/charmbracelet/bubbletea?tab=doc [examples]: https://github.com/charmbracelet/bubbletea/tree/master/examples ## Additional Resources * [Libraries we use with Bubble Tea](https://github.com/charmbracelet/bubbletea/#libraries-we-use-with-bubble-tea) * [Bubble Tea in the Wild](https://github.com/charmbracelet/bubbletea/#bubble-tea-in-the-wild) ### Feedback We'd love to hear your thoughts on this tutorial. Feel free to drop us a note! * [Twitter](https://twitter.com/charmcli) * [The Fediverse](https://mastodon.social/@charmcli) * [Discord](https://charm.sh/chat) *** Part of [Charm](https://charm.sh). The Charm logo Charm热爱开源 • Charm loves open source bubbletea-0.27.0/tutorials/commands/main.go000066400000000000000000000025611465647402200206450ustar00rootroot00000000000000package main import ( "fmt" "net/http" "os" "time" tea "github.com/charmbracelet/bubbletea" ) const url = "https://charm.sh/" type model struct { status int err error } func checkServer() tea.Msg { c := &http.Client{Timeout: 10 * time.Second} res, err := c.Get(url) if err != nil { return errMsg{err} } defer res.Body.Close() // nolint:errcheck return statusMsg(res.StatusCode) } type statusMsg int type errMsg struct{ err error } // For messages that contain errors it's often handy to also implement the // error interface on the message. func (e errMsg) Error() string { return e.err.Error() } func (m model) Init() tea.Cmd { return checkServer } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case statusMsg: m.status = int(msg) return m, tea.Quit case errMsg: m.err = msg return m, tea.Quit case tea.KeyMsg: if msg.Type == tea.KeyCtrlC { return m, tea.Quit } } return m, nil } func (m model) View() string { if m.err != nil { return fmt.Sprintf("\nWe had some trouble: %v\n\n", m.err) } s := fmt.Sprintf("Checking %s ... ", url) if m.status > 0 { s += fmt.Sprintf("%d %s!", m.status, http.StatusText(m.status)) } return "\n" + s + "\n\n" } func main() { if _, err := tea.NewProgram(model{}).Run(); err != nil { fmt.Printf("Uh oh, there was an error: %v\n", err) os.Exit(1) } } bubbletea-0.27.0/tutorials/go.mod000066400000000000000000000015671465647402200167040ustar00rootroot00000000000000module tutorial go 1.18 require github.com/charmbracelet/bubbletea v0.25.0 require ( github.com/charmbracelet/x/ansi v0.1.1 // indirect github.com/charmbracelet/x/input v0.1.0 // indirect github.com/charmbracelet/x/term v0.1.1 // indirect github.com/charmbracelet/x/windows v0.1.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.13.0 // indirect ) replace github.com/charmbracelet/bubbletea => ../ bubbletea-0.27.0/tutorials/go.sum000066400000000000000000000054561465647402200167320ustar00rootroot00000000000000github.com/charmbracelet/x/ansi v0.1.1 h1:CGAduulr6egay/YVbGc8Hsu8deMg1xZ/bkaXTPi1JDk= github.com/charmbracelet/x/ansi v0.1.1/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/input v0.1.0 h1:TEsGSfZYQyOtp+STIjyBq6tpRaorH0qpwZUj8DavAhQ= github.com/charmbracelet/x/input v0.1.0/go.mod h1:ZZwaBxPF7IG8gWWzPUVqHEtWhc1+HXJPNuerJGRGZ28= github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= github.com/charmbracelet/x/windows v0.1.0 h1:gTaxdvzDM5oMa/I2ZNF7wN78X/atWemG9Wph7Ika2k4= github.com/charmbracelet/x/windows v0.1.0/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=

 M!cKBgo σ7"ȑ 96ftEP u8ބ, M+ބ@o:K#}dO $vPL5<cb=hc A- HB~տY/֐5uz뵬`9oE=!$l ]蒒 ".)!B8f }qAjxv]ADQld]*`h(340¹Ġp Zu0F! B<'z AEk3B<rCC }9A:Go nN@T&0rW ԡDžbI+oye.[3.t]Qⅰ`[(AAP0zc[X b6 #sA |6F{{#Zۅ _n=^ PEAT] l@aB4o{I=ʥ>uxCς4z?OGHM$v=zN Uy?HCQ~U+_ԟY{6~ǫW?FCi]ZAH| 'IP@/p*wGy[`O/P@[XP xx[ywTyyPy!]aU`iqPnz |%h@q{6_{|UPːiD&G0It||:udXf+0Z-A:) Q4p I%#WDp/%]L;?WwLP !]&7UqsFzT%R1W4{;s]x*@IC|J7j`(bUj6ll&lvlXlר(HhȍH/h%@P`G3@ XpA P ` ?(d&8|Gl4QymPNpex\6xqZ(x5p/&FflUuƊ]9 tR6 EKaQ@3P[@oȃ,6GuVxdYfp.T3r  Q ]-Q[D&P0 DWX p O%`mX@*Q"88Io#Yh%Z0BUBl&30J:)WR-D=II@uiMل]&$_ŷW7`i0|ϧ=~~ ~)቞y婞Y}9inlЇVHPPc ] Z+,U2u1 xd&)1: 9FXHLA8:6PDYТ]-jr(Т ,ꢄrX  %⒡&Qr4QuF98`^*Pn& ESًtuSP@W[j]JK$7O zLIcy 9No%.FNtH42y( 5 5f 1 "+ΐe! <$A1w]@]Z)4*Ū/ʪ 'P '?$_k ifJ$PЛr;|BK Qby`#D@@mPe4T rR[ t0gjG`QמK 7~K~[˺ |40 ELU{u<^@ [;K@ fϿ([mf "m :( ¦!n^a衈 hb(>Ƞ~xPSā1h#@)D#]GK= SI xh & f%^Q.\^zI_陵pUq9g)gYt꧞*hڙpQP1AF4¤(UN:ѥNQ;oM22ΫDF832`"i)bBF+DP5둨h*p$}EDOГn=ꗴqn(%,;)~X0S1c|sD=ơ9Ij#40 &(ۑz(r-7])c` |1"b`=,1׃m)aa zꨥ#q*[,YNp/VБ$p5KvUڶD1jGDŜIiկV`MkY<4kVauk b־Q!q+&E#-3$I`R,iHF\g-(F.Dg{y~7K ^zC s?BE=đ0)EJ]9PףK]䒛 Ľb6;Q0Z4U y=lp:'i+W@G)L$87=:V7F.( 38 oF=u 2V&9qJbqK\|{xE^鴎ݫ $QƼAذ~wD AGk>o˭q$T#q <;(rGQ)v6mT p`E]N|;| 6ϫDټ#kL/6;WۆH;㈛ԗSr P1LW&{b> Omu1LR $X)i0`g%)"ToH tAY1omccq u/Kp.TDTE$VXe4PeM$u pyD(&lfLĆk̈́Ɔfp8gHnXrVsbOt*|"8 ړ!p/Vp.<@-H1RLr$ Pm jHdUHwGcx9Z9,O( !!BKILrVzDR7 jge@w# Y$Aq@( VJ@( & 9.RO #*,p DbȍXGtvxM$l(ww]Gygyy\IYO)MIWiQɕ/87︎(NaU$`\})UP`?B)YȂTPfsY1g%/% F7-Yٙ9 cI:ҍ}cQ,rw8yH9VyykI|QqvIJyؙڹqta@j),d=+r^]ٞɔP)X9I멕yyrƖyh ڠ񛹖 Z9Jچ&z(*,J$"%/*1*R3:5Z0j298>ʣ@?zBj=:4z:ZMʤAHO*UJQD [jYNL]Ke \zfڦbjdʦjr:kijtu-:ZJ{Z*\w~:JjZzZ*:j ʪzj:Zzqʧzڦ: *zڬz *pJZzΚSZ:Zz蚮B욤ڪڮj: * *[ ""C4b#PA " CF^?  /N0 2{*  ˱JG WoڭNPSU۴TWZ۵Q_˴\[ۧdY{jDSh % qm +"`9u.Zp{.Rlгño G#[p A $ CڠQ+Ֆ+MM046qaNpg|.ʻмA- a$ =[[@ ھ˰ K K;˿˯ۿ+  pZ$$Tm ./j(04] \Pƻ"1õʽnA1[@3pF|z.)./EZ%n'DF4J;^pf v !6k1w6of)P|*.17~>||L |8 FVlXlɞɠ<f;ʢɧLʽʕlʥʱʬɩ|y@iM*DHaBAIn%ShOQmbR# k4,s.=H p+GѻqL?\ج E| Rt3 8qP 1* гp}=pїK @G L=K `+"M,ppuгP aNv!PQ$ČSBjPdL>pO@2v,NELEGL}T ,^Fho=qt̀$1&}гР=7г<=ݳ=&<}AP0M &|^*ڱ]A =M9 ёp!` q+ <\ Lm m-] Q,WcpO.vGI@J11'-p !A$7{⃔EQ1φa_"L" iq]I. гE,Ӂ6׀a MKu@<װ=@X3 [_<=Iڋ׀=Rn PI aL2>S>TBemplLΓ|AVP*h+p|5| an]qmRuT=k.O A`D;Z^с@ٞupL=г=P}~β+-,˫,|b;LeK?On!L !cᩕ.u?_n͎$4Pn4U q` | 5/73H!f [ODWn$0/*гy<ip!3 ;a=0гNp  l~K3 q,bPb b/camP3Ge Ae}eaNŒon4>HsVF*XG PNOn=q=A k{ak?K}^k !@,P ,QbÉ FѢC/nȎM$ȓGt%˗2U9SgΚ8c$̄>$PRMTz < Ыk$km ٺGz )˦ytEàΓV,]1LjjzUέn^jȪ2KOu oV:R~(=[j|^&2/_9hTo)_5oF醋"E<4ж@ӿ_|ǟ_~0@難x6hDzPGrh  84#l)*5(kl)ɤ)$L9 b*f 2\S^=j!TA+Q{˂LŽڠh,<T:YjNS)BBPEwBPF Ҡ$Җ,Ӓ4SN~i,Jf g:h&h֥xJKL h5WY-s: QJ D1Apq\qձ܆|DHF`.ޓ|8 J~nX ʆG P̂ӧJ1#^BhAS EtL(䂜g{e)gi1:YjФo{~{{|w5|?7_(察&UjEդ )&dĂL`q-nY\ čsЅciHv ]1ẓ/5H5αC KXv!hDxpl / +=u=X|t)_a]>Q#$@j{hbqZuSr؃e.K ܣ8S9ꃎ kYA@0F{yKBLLb ɤj64RҔDe*UJVH6_`ɍ`^th K;QԃApM/d0z`"إ3(2tEBFz BBzmF줋;Ng3 5 RR|Ex =v.F:T)=(yPFJ-x vhBHP$w|яT09R疛Q"UPM%TTUUFeR7ժN1SNPZԩIRԭ>QjX*V5} ']Qj)njy mB~`R~ N[L#&T@a8J@ ɨ-)AU͞n A·[`žY(>$`#p|6=@L Fжmnu[ַF=Dy0$@"xm  ,,D ]}?ί#Ixk^񞗼z˓ʷo~ݫwP|0\w kјYyG p5awqA dA?qYT*{`k˪cXf1m,d=&ya%EF|d&פWf Ѐ8_sfϿ([mf "m :( ¦!n^a衈 hb(>Ƞ~h`F1ƨPSā5@)䐻W2,腤=iAB RO=S%r^zI_陵pUq9g)gYt꧞*hڙICaFiERb 㐣UzQ;"˖M"T l48]VE5lɎ&18lEBTDklB˂"Ѱ2 I$!Q NR[ƻ/N=Tk)~!O-FY ?J"B0 +13\'J1k!%BR찒&9-]mfJ=t@Qspq̖hTTL: f 0v`-d+GC6oA6Lj՘C,s R4/>@= 3O=B*[A:7׀lǶ梃5 {"jǮ(ˎg߮{{.<{tlnȯN;ѬPّB,IP@ D4@4*s 1 @'tm\8Y< LEHǓ1g d H<0p A-AP =C0 L"x1 q)NAR<V*%K]&:P$HYшGa$0 5; x%ꑍ c,X䐉"H +F=,p(ALB0FK QB '!6+H 0MI\YSkL4Y@v2ezl(k&ǠLfRș5kb`f5ùrL'6ͩo6H$Q iF]bD\8]Gv!yA0L Kq-Ch%D?F1d! "zC`*e)F%-|(T#tqD=a>ĒJ6%@Π$[m)'=TMFEɕ5hMZ3&fX@E0FFx (b OSFEq(X,I(!fY3B|oءtjo/!S" \ =TaҲ[:LdY9y}j.t4]BUWy}ʤrW-^vWt qQkL# i׈aKCb?ƬA`J6kDZv %G4; gj#҂>0 $:! Y@ agI6؅1Q[%fRS-_YĨKZ&HTDϦ/"@(flI}P!_(a*HD^%;%F6HIq9KTc)'5UK\ l i@|[Iq tBG$[%Vd_Q2=7NRSHmٙVzd^5:c NUךs}WF.P*EAZm)H4 `4Hx@ѯ٥s=YM~9c hQ =c ηhK!5Dz<tdžLlN'~mufgui&t3ZgQkowҊʹw;K1 iPw=vf!t|ս; ?.9U5Tp|gH6nMgW2 Ծyox]k{~w{__R8܂aѽTM9 xGd l.yBJopn#v8A8~5IΨ%ﬤ"2%aK|r}ROղv޳- ز ODA%xhA l>ry-'H0 Rp `z:wg4#I;"b3Z*&qr e1cP `BB4-*%,h$R`[  xF"eU*x}2~/6jk$ޤkfjfTj[j]8k_kXkd8f~DfxE8O7Ipζc4*$G_mG'2*b@& 8 a!A12.sCph+h7@HDHb@9[ cC /bOHHcsD@>8eo6e'io ׄq7XiƄ+#~3o -B @@yHo_f`0 DiAa!+R#b % >%&>78 W#P6`RhC[E99/|XO8vH،v5)EGwux;)xG]tw^:)?i]AEHٔLNIٛ9Yyt9Y9q陜IɅɝ 婝iٞ9Yyٟ:Zz ڠ:Zz8#ڡ 0#:%\b&0ٷV}02%R4:%_0G: CڠAR:H0VzW|st1.b=Z?:i,t[ 3lPs JWuXzxڟ1ez.g}@sĦ@P(ub*CPyzkS{>*wcA!_7j8 QnSy%g[$Xª~=ѩB!=%4[R 7%tB[BBa@+q>ζ>>l #`/@>.7Jb@'XXA[R5dtOI4tb%ܐ)6Ӷm/D; Pjt3fa3Φ B*FddFhNPzQd :D[_S I| \Z`v6m94:)P[PP[9O'e!a[2q};rk qU=k@{B۬бBDKktl 1F*Pf[R@xrW!C/s{ _e˩z˰|6P@F8 )&%>}RBUWf[,U.vee1%8[3%JjFK]faFѫtK`0Tk7Nm9=?^F~>O^KSUmYNQ_-]a[.n~ /Mv=p H9l@pQm0 "J`苞%[+ P> pA~Mu1;~CA㭮ꯞ겾nݰn~빎>Nn__X \?^0"Az5zQ[9R`7 $p`7p  0p =+v+ |@IMzF j(.4hocZz[* zk< p^*  GP  =d~fh>`gb_le.fOqx?y_{z|~?[Ub$[r:OP $/MM4] 0;/܏qIKʁXROp@L3[OH4L4P)0G/%*09~+(joYjϯ* Q <ϟ D? ` $&tx `"=a<$ᑃZ4iϟo SСBE*4iУF6eR>&)֭Zr굪جY=[kڮf}mXVڕ^yc.b8aZWouXiTB4WUB/m~tQO=xsc7Bػ$\"-rw*tʕkBhXxW7v3۹w~ i+vB??M g\ȟv8h}釡 ه!|ր IП~B  pW2:rGT+"_6%X`~PhFP#$H#D2I%dI'2J)*p)!jEta!1acQƠAh6qjKȇz扦"r79MzsQzD9 K"L% O#"=d4PԆ+q$>'V"c 5uÃ0@29 "AA P>b}&Yǎ/Ɩ$2hF l%]B]=H^{wz{7`w/ `xvJ6!JJ1&v/19(z~A5x\HO?;nȲ4=e(pHH.$25펻L%.TlgY("X!]H ZZHC< #k"h/ZYf1 8ȟ:* a(2Յ#RFiqC=tG'tOG=uWX՜.R\`#'$jz"&Ԙbsh =jz!5 "2!:M= Ph xKDR;5~Fp͍!=8Hd6AAwrG@xR$|aT/ta °2LЇ: h!p`D21 SSn"2L" !|b=ᄄH@mhļEE=q=Db4Dr>xA8ǂ @##i$BAzP"f@,l $8:緃Vaʄ\E%4$"\ (ҏtuDf2Lf6әϤQ?"c7L‚cvIs聎cVL\3" 6CHfq0c8F$=0"L %BHAV{gdYyPBTa6J/mXAږ!"+RG`H"qAl7Pԏv %.u^:G)s0!.FYHmS#&ՌQ5V*TԩjKXX:֧r^WZZV6J|3$}jߠbIªQ kM&ىL40P=^$5{F1rЂ^*j: MV׺nv[c` AE=APA"fhC {w%mBpzGK v-@vT !Gk3!P-X+jG1R!@L y"8j+/CpCZnBf@"G4-_ԉG$!?@. '.90BV2d)'yG2Le.oQ2|e1HitAKHva`HHe,!" Lh{6MaOD|!]ف~ 1dB 5ZԒ_R~$PB" }\6G Bd uRAt\[?l*T0&% zw=nr!P BCѫFJ= -1s!QDoAkyD8G "!Z(LD 8gJ!b ؅G@p"< յNjɐr$D E0ʛ`:uAv 69!A3*Kq-&0$I{"|H$8I|돮KBEк֮kVYJ۽oWwQMRv6^!CiŽ/ˆ B#Bs^XrI m ;3EsQxA n«; X>2 Axੇ@ Rs47x|ҧ>q}\$//Pq$GCA~| m+f"?\~fч05`~s!X+ {|Pf[ĕ\{(@yHʩHd s\͢ m  (:$)r#iȢx6Pф" G{M;Ixp e8PBs/q3("Tx0C),D.dRs0#508D\`:A) قڂj[Lj%x@_й?E$| :9X܇ZS" 32F+#F-+a4Fd|`,efdh,sciddF`|FmjTFiT+%TpP`#@+ r,p X;ݫG{&d[P`TP 9&`@ȝ&p(6)8DCtɗɘt6(=z$)1<0; I#zX0% qJUtC4DTdtL"g(|LlFpF"oG GLL Mn44\MthD@DD<$T̫,KJKtNTNdN$43 !,W!,R H*\ȰÇ#JHŋ3jxǏ7Iɓ(S\K,cʜI͛6_ɳϟ@RѣH*IҧPJziHXj*ӪG Xxqٳh*,mKTgܢk߿=ÈKvĐ#K~qɘ3c^رϠs9jG%,װru۸fm;7g q?μ9G/wNz䭧[Ν Ë;^䵟_;cw_^ϝ' ha f NW@!,W!,Q H*\ȰÇ#JHŋ3jЍǏ ArIɓ(S\ɒcȗ[ʜI͛8s Sϟ@ KH*]ѐMJJ§"jʵM1R+@ ^Ӫ]*X7R mK-\cOQÈ;I&KL[ԴAQ ӨS Lc˦,Z jXͻ(Ly׷[nM8؁7#F࿲wbӧ} (C6h"m\AVb 蠁Іr=h!}a ^z~I@Tg",bb-x܋ho4x㎪@W@!,W!, %H*\ȰÇ#JHŋ3jȱcÀ!,W!,Q I(A- PD>'UV͚j׫KkXf~ET٭m7ʝKݻx˷] KÈ+^̸ǐ#KLb3{ʒsA V:ҨIi^_^=UٱimݿyӴLȓsУKNسk7ܼȶiÃY|ybͧGß/>_jh>݂%F(Vh 2[oq(\Qס"#Xbg)"+~VیH*"]xG)dv.xL6v edE& Uye_%%BS5,B } &hĦF,D"]I*) V w6{YTEh26 褋R*i^!s& 饨PO=!|鐩6DtJ=ؘ&vd3O-#@[ϰN3C6D:T綳>WH^+z.C*eһ׭n^>AϩM&$p,Qףl=e*(0 5L92;2=3.z|ڋ#;sͳEB~o:{./RҎkhS;'v2Zs5Q8%r*qWqf߀XjF#ޙ@oG8tP8P@I4m G,x~)dD CXm,`1ՌéK+9R|Cf7}>jrGZ}o%z?~Rxᝉf$  xhSU f21%t3 @b 1 d Ҩ@ށ ] p"UzCA &8;4!`,tjuz#8ح*^#Y>%z$Ǩ2ՠ &px̣T4}pJ$0 lĔ5$ @:VqC$H#S#hAr9 2i`y"ei&T8%R RDtF=~Uќ2 $bX 54:юd4v̝9<}6v'=iϟӟg=9Ѐ(B P4(Bq:‡p%<Uq Ҩ@:* T37N`R-!qBV! qԃa:Fj@HG* 7ta@i*lЩ05F#b2jQDk83Q0# D0KrdDY %b-*nQa$`5r-g$ FM\2i#D5op&fknlv"<o΅l8@%^P/Wxq;h])0E *GKAkM!6[{+Z\۵Ejº˰ fj۶)˶o s+{ z[{i۷y˷JP뵌.`bd˱[{ kKHJLNk;+뺩 + Kk+ ' i@ Ԡ[[빟;{Ckj'^P!`%k5EVbu_$@ pXd y$`{;ۮ\v ,{ ,%MZ a: & k06| :`]ZI0ZpA|*CW7OG wN<[Ɩ; о Aˆ@R-,B,![hsdYf%[|Qp*;Ȅl`?R ɋeX\LN``,KK[ʤkʬʺʼ|ʰʱʳʬ L,ʲ˴ ̶\˸L[%,PB1yH0C 0Sxl4] \QAzdvq7 N ʝ+f[{+ 9 6n7Y7wQ6]5acٌ=YJ } A; 1 : 6H<\)*33п q-}?}$0!NL W;['(lt*F%!G@AۿN[].d7 E@3Pn ;u0PZ݂6=_ś<aNL|1mx. -` >;\̫˽$9}p |i W0ZPWpWq%щ⋭ɠ]TE]NAq+0!VR Qɽ-/EO}l Rx/on Na , ׀-/?( .Դ?i.,k]ov ]n}qMs=!@ $(0A .DxPbC VlHbE=fQbG"5XPJ- vW@X`Q*ī%E9iMY&,ة'VJzAz֡%**i% QfA\ GĢYr)`GzhșzTYIzO3 BE5\K'琕8Ƶ~ D%s-<6n # /t;_ѳBs.欳;T#f3FQgVe>W/PVluׅt]^Mv׏rVX_U:6_qY`UYf]vXhVZk[lYnÝqz4)Zr|X YA$Pť tqU%BiKh0PxpiiE"Y:{ZrR)YY+#S%3Tr11-ӟ.-S#釄)rO?1F#ѨqQbg暣R %FzzØUV_}UVY!n;ooϑТb9F *Vx6hhFk%TgtZ\ &~.)}dJAZ-v\I/bV:K4K,PT͌\mkOilM76-(y/^Y]~{Ǘ`S$*UUrU"+rkj`%ANЂ / 7($ G2_4Cwj.t``:a|EcT†=@%J :AAɥ'sItw$L  2o?S-(GibX:@%+/P@uf?{qQ$>.0%B Tdq`6c@ 0?e.uK^җ8 b3&F2T'Љ\"zTc%& 8#HddzyN-D&`I )F]$ 5d HC'n$f=haB!f[@ ѕGK DȞ=rP8=#:FMdH QZ4i(5Q `%Ih6Ye.jX:m}b=+YSUլnmkتVq\ӺW5E=PVT) "z"u!ɢMBe(ݕtʈq_+:v0B%I/t B>6K {)6-g,v}lsý͢"N##1Ƿ,)d^~ NPYL㪤T8m6{b|Hɨ-&|%$``0-)tsv6 K\({@$0rU}nXs?zYzA% `ĈB9Q,AD@qpB=nsN.կIJk^ӎvj;^]q˽yܵUw[)X1P=<@LY830 _>`}yҗG}x՗2N\(؃&oscWvC 勻g~/}O~_ڇ!Y` C^N \G~/1L @=1;<;@K@C@s{ @@@ @  A$ AAa= tT!,W!, %H*\ȰÇ#JHŋ3jȱcÀ!,W!,Q @/D X/m~HXD5,ؤM  fPƍ;x9L,)PB)'F!{\9tΟ1UPDEԠVb:tR_6K+Tc-V-SinKݻx˷ߺ& È+^̸ǐ#KLy k<K&(跤^]j`Ofvlڷag'oۻqmȓ+_ΑṣKNسkΝ߮/]矿~g ug&x F(Vh6HoHQaq!8O%x")¸g1X#39at*PSĂadFTViM靖(uQO=$˘t%HqG  &e)$ /I)Z"Z(*z(B&*iUiZ餞騠"cwj AfgU19Q˘`N\𳗩st6HP@ xȮB wiY,C9A @fQhP ׂGTןU_ՖQb2o+۬.\GPe=&}=p\9t]\==&@>4 @ Z ĢC؂`L>K\CW P,1%Ɗ<\+%,{0zZX d;39 B:0&КU}`Lz+~mno ́=U9pJ"0A&)z]I7l$~_ aL!E-,{Vch? @<$ x OJ#<_Ʊ2 h66YÁn2*ԫ$ 0D;UV\u]=kXַ5nT^׻Q}j`Ϧ9a\)=9 u&FAfwBaPk@6i#c]%Ñ^PQq$cm#ZȤ}3K+A][QLcr F~Ib28e--kBtu  MsD!Pfj AQK3EØ.O8#iNKvw|nwV}t{ޛ+ݺ~r;w۝uFHQ P9V t%)z{[8IT#,Ozx0񮬴J1&mQ## 4Dr=mX kInvfў,kpvد=X砒$f@}{5[{/Qi8p < 1Ф Z1$!sWzn5:[Ct UP}ZBc s0&18&LEcC0&T,}4[E5h18LЗTc}'lkD8lEclVChĄI(f9l˳rX s (DbUm'pr( @Bebe6r"6Z2@ADvn҂& -VB Zud6P C ncCߒD XD<}+Wv5.cOc}֊@(㗋nUSULuCeOaJT0QBm @#X]+gInJ\0c070K#9:gb7O&q5xEqawŤw]ugxwYxّ]!y)9x&8ygLgV$5Lm`P!@ QT0izA$*% FЁ\tR|BV,09YyvTl 8d9~[Y+ `7pQ\1c$U|~Il)yTXMؗ "HRnWҒex)ٙp adw'yx& )I#q ǚR$ʹٜΙȹU9HQԙYɝ9y蹞ٞq9Inp9ٟw:a` ڠ*  :!  :Z"$j-.*0j'ʢ4:1z:3 59E:F;ʢ=z<YT:yZڟڥ*`b:YUX[^JѣnJpP*6uxtʧswڧ ?꧁JAj:ڨ*dZFfTWZʦ]j:ɩڤtL :ZnJjIHOګ ZJj.ʫ̺:bY\ʪ_JaVʭw ʨꨓ ʮ *%Jjʯ * J k / $J `=p eJg`犮s*( 1lZtQm! 6k!X5{6i*@ 01E*.@@ "K%kΚd{i[Kڬnk ʶBJf;zj˷v ~m[[Q6utr?^0[ F[`TYX1{R=uI{ A I;K7p  PA ku ]+n&*[a kT`,+,b,r˒0Aj(ka@wgo{0{/avPk A~q0L0I`$; [ *Jk v.0@Gl   0 S7 aCMM4] db\ͲA|aGP$дq7 I  퐴. q*&kPu)p0kL[5_6'es6i#(j$XkmrnjLʜ4t<3~17p I{!ȡ d@M@ a؊:{Kσ }} ] -uAuIBdIC3s;I7;6U^?@o# kp8& F0Ic2CBC\p\LTA#M9P7p|  `Xa R`=Pû0t !t|. PAfװIk  p 0 ` ̭Y,P4D*E%>D!D{E;g!dbo3͜}hx AD(ҝI0NQ-H4&;=ȍ06$u@:̻.@P0`0`I -ͻ=A0, Ι0` l)ID\FlHJ@CEDFHRqeC P{c@&DJT/ Aab$-p Ek32 X>1R%%(5K zn{snWc" xKc ,z, ^*%u˻I 3@'uPj =l3!p􌪩ͪId2RC acSQS7S;Sj0lmHzQ |7~^y8YaP >>;WQ>P^ nMؙ0P =upL;"<{  G=ϧ:o]S?YOZTbdore_Q0 PG&.K20&UYE mNn/({gb/ ` 1 U\Q<0BA'*_$I/0[ 0 ʋd0ʛǚ M kp͖o׮c|A]t%<^=z[G/m~LQFz^eHq$Tǃ-dYO y<'xhIrISQU=e@7/#$O^FZ9 (?L4j֮_./-/ Faj#z8x?|3_9ndUҥMvZs\ lڵk|07[޺O~\yrˋNsէn:sط+gO{{{go^>[PH#Ig#wy ȇXJb46&@BjN҈jz) R&\FGbriG*Q)B)V2bk"K,њ-hb-ʃT ʁƘZrG4SfMً O4U-6C_-QdQG4RI'RK/4SM7J‰' z(Ȍ6b-C2q)9☑ (6baR<(5h9*Չ:)-&b K<(hr4R!!rןTc 4fa#y"av"9TןLL\ 4PB =PEsJFY[dyk9ydwfgs6h}hTK(BȈz`jzjhz,و6t =rh25b$"G|E[_up- b"Zb7-wDE&JEkj7D8ce DɈ~bH^h+ЍЏy矇>z駧z믇ziXNψ$HzȄȃ6Q3|_Ҧs:8FBha$0FJp zۑߤ%Aj ҟXj@0Hz}ItGWfp:%;H.@0R8HuAI$J(2#u“?d215ci"e62638 9R5ɋl󟐱?/CZ6qc7}G?2zxHERJH@a!H+F4I=4,8@,i C`97 DBGsHvH1ẓ'@51M_N:4=kb3%7q̓R}!B08: 9;zC`%h6Q*Kh)>!@M:r !p$(H@1P"]Pk&װH*d5P=Њ "0&G8.B,!dL[`B\ (P^:&9 @ҦЍOr'!,W!,R H*\ȰÇ#JHŋ3jQ CHɓ(S\ɲK"c|I͛8sܹQL@ JQ>c]ʴӧP &իX:Sׯ`V ^˶۷*~4KD/pw\?tQKa |K 0+/˘3הLϠC{+BeѨSf(yհcnmZsZ@eܻ KmÓ+7У?m~؇Rm6:wLO|Kͫ_}zGt/}֤V|M`w` `~(0Afכft!,W!,P@H*\ȰÇ#JHŋ3jHǏ CII)\R`K/U\&M5gysN6ɒ(ϝ@e T)ҡOF=TjUBV͊(WSju:lר_fMkVڦm_nKݻx˷ߺ' LÈ+^̸ǐ#KL k9ܶ ~ Mp4ӦS/% jԯUeMlZk΍oȓ+ȹˣKNسk;eK~џ/㻗O}ug&Yx vF(Vh5` o!"R#Xx"P)"-g76#5ha(PSF!$BI ؆PTVi%dKޕD& w! & yK= sH 5m) &'~}fHP4VB":ڨR ॐb*iVqz֦Z騠*j1f'L fpbJ=@oN"(oRP Zбɺj$)2εfD `3O-#m^Nd![^)^ ]B|[ƻڮzgGLbRO8KL$ \O*="MI2n6:z3?C\/o~jo?~_殙qVYӪ$! zT 21'tO`@ޡ uq 0 8@Y=pC4 9dC  AB pu@B6頉|rJcS`N9jw;#?63OCȝx $ p@čzĐMHBJy r@Q`dW ; c  ;FY*a=RJb :$+])ՃAE=ҁ2 $DKBH:ꁉd"qs3֨7±GLZ8FΩj缚8q脧:Ny3={곟\ēLlJnj)Aʘa1K - o;T&z!!)"1sͦ~ :^b &vh>X jLćUr{~Q`"'&{Bc ,:&ֶb,+2j )Á%t`J a Ru`i,stM(,q $ HPE=vt֮2w8Ꭴ j\ۊdㄛqIn{<%@.WsFʥuGI׺ݝ5B5@ 1zeTz؀b*2I02+$]w)%,moKl!Č&qIV`:hZ)xM ,wJ"Y1r p/ 0Q l:RUVE@2 Ldf2f+O(p%Sgo(jYZ_1bI8v:9>IF]>ڟhFOVUMkY5.u]\׼5hwpr @)SKʲKpayH@< 2?I'aH.4 E0%1nJ1hŨ1@B#X% ,]zV9`St&BUNcz97q {Sg A+ҊK&KRJ1հlM̪-8.(j|– #pG=fpT]YبG-\Xa"{N 0_zc1톗۝w}w|nwڞL!$TfG d@ +0 lA΁4) C%q;ĀpwL2psO>%dV|=\GO&@ vi NtrO+ € d3ii.0%0,SzrP  9I{. enl" &"X$1h:''f6K2d@I[Qlr!1,|v~zR~wvvL6yK~k–#Zl[4_5aN]cjgjikk8ke5IQyA6DJlH.=X5 C'cg`RtJ+# Bs5SeThR~m0b ` WP&V lP H /XFwq$M7EVpcV̸Dp\#%% '9 /d11(c]K7y }Fl+_ZS 8&;(pxV1YFP[R U'p ^0qbDl=jXbxw% x{]x+ixx,'Ix-9/ ^v1\  1T QT&Nrb+I&SY Pm} 2% F g=ġ%U=r3#XvqR.Gln焆dwFs)^f\؆٘ )I lq|VvL#MYuyVe61F 47 (6ÉGi2)iw2lF@eII)Y!Ii뉙渚Ɇ醙Y ٟq:Zg  s0Zz~С*n+$*&Z$*'z*-#ʢ#ڢ2):1z6 ;=Z>AʣC@JBDERGK M:L OI*VX]:WJZ*azɠjڦjpJ: vhz|*knqtJwz^YYbʨ\Q ꨚکꩣ E*Zz}ujm:pZszv ګm% Jj Zʬ`ڬz֚[۪dZʭD zZ*lJojrux گ"Jn`wJʰ* 7۪ +0Jk!˱8% #+'k"/ EF$Fq=p n% Jj F{1lp|m!%TX1T V{k&A@ pd   Ѐkųg BDڷJkFۮ?귃 +[۸k.ʸ+U븜뮋!8ET.x'j!ق-⠖u,h!A c Z(7 ` A o K$  ۽G Av sDH}  A4wHA p2m gJyso 2Y ,Q0{k ` A&$Ao2kD+k"-˲?L=AÒZJKM\O|F`HѰJ 3,9@IVu۩2D$H 8H !JzY0ܪd2=ioz_ j Ppū,@rko o NNA-0 P֑0! &LL]Tč:V:;>=^8~Q C<~>DNFN?P>t1c`H1L@M1˿m}&Dt} [+5ЇQۯ-ڽ̅Ss^u.Q&Ҡz,0ܲx x }=@3 $p ~$|-ҋ͜8 ,ڤ})lcX x al2X!UTUWUm2&72ea<.o^pﱳCQ=QhoKA0׋̼ 뽞{h{-P֙K 1 -N/LM N -SUZ^VacOTu< f{.2&JB Z]@Ip 1 H-J0&c4Vf5< QAe;z bhP=s2 GB1̫ŤA*W WJƄ :XY=U US 2 rp~En14+x֭T H(?LVwO(Z+ %A> jի}2取P"bƍY9-_|GfΜ|:t7KfxZjը]NmZAֳmצ};ְyƒM⽑;OzWM}֙o7=;xҽs^>89z駧z~%D >Z oR$af16@k# m9P!2)A p-#ʚKV¬9 +=HC!AVP24!AQBQ<Q;&\L3HU#RPLD#>%WxKEI8 ;Zt$OGB<o2Ì:<Ѩduhƌgm\c87Q;t#G={@rJmР b   AJ6RMt 23=DU#|z֭ "p aRtP`Ax@ Rs44ǧ[փLkb , T[袏iG~ 5G>%aO|((=44HCЌp,Y?(8E&DƐ["x'0I}"#7SԦ7iNu*=4f<i +AHF5.D Ԡ f0&JςD=tB0I #pj=хv lj=Wnu0ɫBUu@)zCPRAQn, SlH@*.ʏW!8@FnpEumHI2TTLpҔa,m^ ӘAg˲ ʬf߽Yws&ޝgey^nx;W#HlISWB> * ml,81 yPAN "$Š@#fLP]<#d+$P^cgYDhCausLW3ґ3]iLwZӞEjR3ҦޣJ@YqZ#.ȟd&;vlf7φ6!س?d [ɂ6v1ozmt}w|o۾Ʒ|w\n6z*BaPvx5qwy#@=Q ꕏv4c{ thSJF=:5RWzuV^Vjٳ_5u-Za7ʝKݻx˷/ݔ <دÈ+^̸ǐ#KLDŽ3kxlLMP馤F=鱩cfAo {vo9e_Nr^μyУKNسkoν{anë~ϒW}|(݁T 6F(ᄖ%hƛmqRz! "#!(,(c4Xg-y}PSs>xхHzgL6]Ucb8A")4bRO=T啰dЗkC )BAvIXޟ~j **:g&ZiFEe\QI3Z$iE]*BlU ,cr֓*>DS=(j䠌|Ȳ EQ,E.ي6"/߸-&œ̥#Ϫl>?o׏צc '{YVuyJ@w [4 ~ AS8ejrHt0PMUE)>CzEB"prL"sH*p& $0 ^&VO(m$b @=h<bwj9&\$V0끍\c_z$#@6B zHX֤`wxsLUdGRcփ8 #0 |x3_c b"fHi5RZ҈4% YфQ" }DJQZ4G;ҍrh.TBIFp`X8s`H #2$W'<@+e BTMDG;=4i 'ÈTU]X&; 3#OaLwJ"J6%h>z\hGKÔok+eJ"~QҒi= 6tBE=v! Ʌ!YrxŽ0&!JՂF7%1\#t=;JV qL9͂bȫ8BQ@)/!i"c,avDz٩Au.3,h j>04/< x'z$0v_NkH07V ][Ak$H\i40@=b\,k +ӛ<҇zW20̛@M ޺wԌ .{`sB;`n, 6m"ƪG)l,E" aׄWR>OuIDzlLĚAwKTsޜˆp\sLTCz`C}[Oͧ=&j4fj Em^M5>D~=S:F=W|!$o!G -X=3IP|Ԥ֙IGiI?O|$8?.w$GWn򔻜3n>RU{ 0jM\ @!rIM !bx~!hѽw=>kC`4lT#8|8 ϩk 턬@4΂'dl` 5TJ'Ǻ)C'Oy5yZ >.B #A͂1X҅ `\p/c솕{G$ڋ;-f d. c;z/$ =ԅҘ_Z ?>8oqS,br+6@Wb7 f xRyipu^p zt&'%6in]0&0u{`G0aK@.hGL38 v=Q WV\vx5gւ/Dx0&zx0OPmr +`(q P Au~.N&qwxhj 4_8' `kDkEFPj dt7%+hu+ p Uz fcbU1 e\u8xE2  7Z+&pcRh}U(8X8Bcb !cB!Pt$六&jVzrq*r0/hqX@؏)as.:c5aM!dAz 7E07p-i%0&0E8zА ~t|*m--+@iSǢ~1y,3/a|M'E(0'ّt!.Tٓ6&43&&8`,+eYg7Oڠs'{8&B:jcs9% Yj@ڎ9YWXQ[ZQh\bJaZGJyO|pr:x}oǧɞ:~JZ ztz.xZyJz$zQAJa ^ڥ7`:Z rɩ:BJgZjsʺz ~0Z:ؚڪЭ!A 暮zZ몮ʮڮʮʯzj+ Z K* ;˱۱!"[*, ʬ2Zj8Kۺ >*B;D-۲0 3;6k9<˳? [[%XKV&˵Y_d;f{ghj۶b˶o[p;ib[z+G˲IK+M[OQS{۸$}+{ˬk ;˵{U%˺$;ۺK+v+y;K{۳ ;[kKɫ{;+u;t+{v{x۾컾+kK{˿ ^ 'Py@"$[=p w۽s:Z$LC!X'^@!gr%;*/% 6e@ :3@y `9ôagn L" {ۻWZŻ^VX'+ƼYfdlg\r,IYd00 ,l0\ 72++!5+@ס@RH$ A @ əNS,…P² `ȶ<AnH{,b,Ȣ,a@1P WU6s;0|`/^1 N@@Ohmm݋mziUVvvWTI,O5}׆^Vt,6Q0&P],w@1ξć @ N3  -H,X_/?.ux@adN^a< A`pH;[}Yy U(γ 'Ji=l]tcޒ %]\]\/`U'O6)O+O`A7!`*:Ld ` C@` CMupL=@?,7.fO?A`/nx !@@I!8З?yB3-^FF|2%MRʕ\ L5kSN8y3Π@5*PB}Z)ԩR6YuU\b5Vdju6WUǦe ܳqν[޶qpz˨WOBObF cԃGbEFpObb &T\ghy,&zZ8qx:a%l6~wO"&/!DPDf1e:A}UW 𙯾Kd?z/H+h3 k(D:"q#N$KbEb%fi:o1GwG2H!$H#D2AӺvIҠzЙuh+~,Kz!f(Am6 'K 0~덳ά'5rURn짟.;P 0[ĞDPYvTWM܇ WSՁAhL+tC4dӄn'WDQDq]t1iѮ pR[-WsE]v7u yﭗ޹7)~]#+ܩgN>4r"_V(q S3  Md3!B-h0NpIli%>4! YDYIGqtR*nLӿ%hʁJ(rFҚk.gzoTB hc j۶mhCDjOVEl[FngLq(e&,^TA.\aS06 P.`:aiL#†= [TB @ 3G07 LΖ籁l 2xLFE'-'?q%p@8U5ч?^F>r @ ̠[Z%!)Iqѿ@g2$@򒤤G@10Ed_$AQFCf2Lf6әϬ$$ 1L)H &GbzyBb-$F&K )~:^tvg=AMH#1c $@PP $  W#< TRkH1m-KSE4)w_~Zӡ:D|K`A$ y~1_VW9[jֵʵj}kS׹µ|+]wucZM0"1Mb488(g&A=i] 3|FK8GbATa;Aj$&! JR/F7O%{TUxFbj/=h19J*3a!ytG5+pZӳ4xmZ}q:'aWlHlߖ! l[ gmt1tzRDlɂ睡( ܢQ畝,81 KPe`%$K G y[%#${-g L,w&06$Pʑts?-~=c?Tƅrԥ>uWF=D!y02{u'd2x@%CT_SO߫`+~z.]%#~\)XAMe@Y\U=1fozǽ={ ȡa{rx?|˵j~u[-wso_?כ7}~ Ѐ8 Jw=xǿ$ (d@?^?bslA{@@`R!$"L!,W!,PP@H*\ȰÇ#JHŋ3jHǏ CIɓ(G%K/d9%L6qެysgΚ{ thSJF=:5RWzuV^Vjٳ_5u-Za7ʝKݻx˷/ݔ <دÈ+^̸ǐ#KLDŽ3kxlLMP馤F=鱩cfAo {vo9e_Nr^μyУKNسkoν{anë~ϒW}|(݁T 6F(ᄖ%hƛmqRz! "#!(,(c4Xg9u}܅DvH&\;դ"eB`M$E %DEXޙfikos)wYf|g=C)dD%hD#餔"RH<S88喗"*di2*櫙*무ng 2%ZQNJ'[ť]= 0*z-*.`'ژ"+ 3[#7.皘.;V/ort+B*Ȭ>DR^ ;W,( S;'v"Q mE4T8\sk0I4P 0\XSO/3c9BhK=jPź6LSBmpͤkt|~7i-Cנg~ᚳZm'K@L<Ⱦ3 ^N@) }~;& {|ȿ(*tS_r]01l_e$X8Fwo :ʑg$# MhS$@BkBGP,> $ F hĄ%IIK ]'|uCP4TC=葃DŪ#Dqzăy"gjIH$QyJb C&2ya|0{ & h~QX@Q.ጁ@Iw z#QI^ ЕQ>b fL*NM\4Ԫ6J~ӣ@*HtǬCIΥ-`j9Ԧ1} NkӞGO)KyS4 0@ٺb`G}92  3]䵾k KX` ZBV1R*zؠIvk4HfIQʍ>2.QBRu7U:.mzuU7F)T!@کΨ*@}v,m,!"c;p :Hacg ОEэKle՛n6v`{ zHsY{s! W`u5Rig;wf{Cx.07Wc)89ʯCȠW_8_v@ê0p zd@A',t,ȲP[oU||Nd 3V.Ofw?}bkTFk6hT$hk9D*k x,‘'QH^E)Y !6&Pe@CX Ҵ+ Qby`7RX7w7Wee'GKQxH$׆n3hhFJ@rbax(zX|X(T`+EVok&|wsw8u'xExH``AA40 0XȊa7T8X$8X@ 4ɸ(V`r|H("X捷ւ!k0؍X)(xSrahq AF|x!ye  wHh8ىɑ _ؐ$9 %*,ْq02)nP6y79:<ɓw@ADYFiJKYNP 0TYU\Yٕaa dIf)h9j)i oYl s)gٖ^YkytɗvqIny闆Y )9Yw钞31i=y;) GٚEɔQ9OiIY)Y隱IyYЉiӉՙٝIɝYy乞왞ٞ99YyٜIz b38=ɟBG L)QIVɡ١~ $&%')ʢ+0*:.J1:/*5ԩ>Y Jjʚ*Z?R:TA:CZEjGzIK:MOٞ虖g iʖkɦ mڙqJswuږoʧyj}ʕj"/ @ EPq0ZsХ?DI9NYS ڐCָ^?  𪯪t᪰ zU*$ !zz~bꩠ-z٬:}ɣZ8j9zʭ:ژZ読*sa%1,'j!2)␅vQ&QsɢaƂ O 0[G `k`:꥚Z:2Z{OA4̐2 p5[,7MM0A2pUs|p°y| `Mбf{Lh`ڲ1~*;׉K˸r*xJj;[)WӢ匿"b~1Rj(04] \Sɦ1m8[ʻe3 pбn{Yʷ]j.:M2"&)-KV U4dѾ!32%;^p$[ h Q@ [@a 17$ ‰a` K Qd !CJGje *JڭGf^~;@ﳢWWcA,W|WamP٠^V`, FW],n۷[E a0@=- Q}ܞf a[>Gƀpѻy;<=\c}j~׀=lׄonpOr_sxwkov]<Q]-t >P/]o]"M  Qn4P T'lɳ,?mubb68__ ;a&BV[@!@Q(J">qz"0Rlt9f0 DBIdaTꉑ8eҬ D4rbՌŸ?tA 54D{;r=ZaYfwֹxzIdAQ.TeD`8@0;Q ԃ @$΂ >P 5h nn(O2z`e鰠3 (%EBF@ 0BBnXzK C, 1a RRڸbCRH*zCwcxFx|M6Av|H8ȄP"O284IwfIe9&EɲPr)%*OVjҔT%,[U2٣0p%X ;jb,"V;~)/ 2@>'|`/&XR*N8a4k"$EH(&.paS LDi1i)CQ$"=9O $ ECYRQhF5Qvԣ*#l ܨ(@*RTD >:SHAoOBeJAKL@t@PAԇa)HMIahCzFThE-)h)kʛije[ڞ5l+^ڛt+kJWޚjb;#AСHi I(-⒰ f+YabUXR櫙 g:ַnp;\N ߸3`c^&$K@֞nlg[[?m"R9Kזm.;_Zʒe}_Fow_Ӷ` 4E2b 70iB(la CDA'w\ys[/qeM!۶rW%FkL≠c ޥ\#F5 .E UM턢g6 ɄȓcM|8qʣK7V'SHN|f_~ib'~sַt߀rZ&hс 6 C >(EH Z!,W!,Hp %% H*\ȰÇ#JHŋ3jȱcÀ!,W!,Pp@H*\ȰÇ#JHŋ3jHǏ CIɓ(S\ r 0_ )K0g̹S'N>ys'ѡBc& ͥF>mRL^՚(W^& kٯSѪklZʝKݻxw.˿ LÈ+^̸ǐ#KLe3kYY ]+U4G>MuԬWuMm_k&;ٶ/ Nu;+_|0УKNسmνwݒ~;6ӟWzٿ/ᄒ|?o(}g 6F(!DVha`OvonTX~!%#7Et#H! yt㐕]h&L2(dqbS<q˕W]HQ@yߜGw։~vg}gUny&'**h~Ũ1Ԧ]U!9>􎔠jg(SO.gJ:Ep|3!̧|'E4EF6:v줤*r'.;{oȳ3-^̔ A49t=*qÆQEzd<Qȅ/kaN6Bfu8vz 40l=Yo w8㺅h@>* @LGEXH Ѓ^LAR`/¸iQ>pΆq<!ZKH> %R¼L^+ɡ( 1d+X^ʇd;+S2Xde-iKSj ,3!@F\Cq<ԘcƤ(iRR`=H TRA*tDR@/APR)bz a&țtR !Ұ#dAJ% ɇX](G (WcE`IfLgB%t`q /fr4?EP < SJ1#H) ԫ84љiء%$mꤜT jL6)znu(cHJؕx;K쎇*Vwc#ϲlb){YfֳhK}@ (~uM&Ch $@= YX@>W'zQ e 0%``ػ!5ZªB4t+3T\,,( K Vm_KS' N0T ma H"($>-=JI6x{XJݒU"īժBOR$p£zp=+^ݑ {BInZ1A׿r_IaN1V]겗Ռ\one)K7ywn3g;+/#m,"5(>)0,f>S4x -! Zϼ5os󗳼7hdH=GD^@zzi{ ] 䡫|ˬ9rFfsHG X6h\6=6ee6I9@z w V h% %\& 5 %j4@p_Vb2AO !p4!L3 0x%hF9UV*Gr=_=6Q(%PD84xxZ&_e"ynq`Fr"D I# ]`&P'o'7чj9&%砃7ڠi 6c% %WCV`p ROA&0685" |mgri`(s(s?njbstH،҈;1g.RXgUWQToP|Q F(NA9)8)Y8Vby+B%~R}urXXpxIo;30 'Xicd8!WX0m(ihK9K ؓ;yf>i?gBY7ɀ)+()%*Y rhY9^`i0 @ J6pF8ztȕ3x@Ѹ֘}zɍ4G8gB'ti6syLv9RYy6dI G9g<™8$yyٛn99yȉwٜ)PyYڹɝYi깞Y9iij 9ڠ * z J"jz!-Z2jYI8*ɹ>ʜщDjy)J ٤ɞP3:TZVj66j9<ʣ?B*EZHKNQ,Z0nmJoZr tzvzs qʧxy {}z W58ڥ;>A:DZGzJMP*Aiĉɩɩ )IiY/J~*:jZڦ *Ѻ zjJڭʪ ڣ :jʤ*㚯z骮z:*j* Jjz*k۠˨[ ۱+'K /p@ A$,ʛ+; [ Kzp8lwsQm0$V%V1Xb1_ [ Pu;pp#*1gPnpHKMO;U+ z޺ʹZ;[{t&!Uan @b?^P+[+ntQ&Ж)@%TL@+p zpk@p`7p fIkKO[;PX+", A»J KCڠa0P U&m (%H.B.|0.[0 ༐ kDGpAL$`{ pK E ;M[LUk*;,u\(+zLsܲwy{}lDžp<SPmKIG_ '&%mA]0%x[ pČqpR@Y~Kx [<d * p  df\K D5X5R5qVPq #( Fm4c 1q Q@@ 7 !,u{ !˴. 171A{uPu@,0=@1Zzi Uͺ+F=IO}J=*UN=VZWՋCI%}qcP0PIT8R"L8^?G@ dKRGغU~2-cTT@)7| m ڮ P a!۴=3@@@ @ p " 7 ˾1ӾQ/qP7xӰӴ =!% 1F+t!`pq 2m].76mp|~mr4taG69U`mdMA g*gtF+T$%_ }MDRR>G*.ARVH{, =mNP.`p1pq[ _,-l*Pq|Ml p+m}nǂ|<Ȇ~ȀȂ镮ȘNn'AIxc0%Q1|@Ia$^wOD(<xWdR7 MԤnM>K4;5QPj- ,@G n 3p۳|N\&z1`\. p {+p ɌKk͝[_*: u aRk9P UMSp qUUQ ^AT4(%e]= 1;Y_\%A!R1LNupL@QpK\  L[a P  { pakN,x[(/3+\zLjJ` /_Ymɏ_\Z/֟a}t5wUye2 %iB4N|d1%mV]5u]RR ! gBhWO Cih"ƌ#Va^=EVpXa W*Ӡ/JPÌ mS C:yJ?ArtFNLU_n $ʟY-$ Lݾe \ܲ_23߅4Ǧ_g? dʕ+Y;=GhҤF:u!֭]N[ٍlƍ[n޽{\pōG\r͝?]:JXœ`W/]iգ.|u4(~icBr=QYo!z2 =l!:b$(dz0Bi rUR&bHH4-! (ڇ+dzgغ.D-R 9;Ȯ|2-)۬@ӳM53Q{-hcS޼79y#荂s!<sVC'T-_}9|G~;8G=12P.F``:a  W}f` lC ҫ -C0rbR8$ `@6]dj-0eIPaEf"ʋ,0O`a `A6F&Ҩ !;p$& Y qcB~yɓ.<)Ƞ}L$(_: 0 RA)8$82(ZNg(ŠYCn0c0KGfPQ Y:)JSy)bʚ)89a W0qfd@CG+ P=!jtyAPMx$w% 2 ) r()ed0R̞. 12}d28%@)sCt5 o[(0W$p lv30ͮ[-wd1{]_8PxJÞ 3ʐJ_"U_X.0Kth0M܈y]ï5m?}Οyl_36T|, MbVZ-baƄm5+AJ@V #dQ9)B&Z- pJ7:B-@q̈:A!.sB^Rn0SjVհi]k|7yu.nC)#"/ vt=O(γU XD(KK:8/S>T߁cZGjTNչ[r;nwXz;[ ^V?IU>%o qјꁎ+ǣn1;{W4/}e?{_d /h^r臝q8+_5Y=C6ki'>}/>OG?՟ן&@"Pj?+Kk׋0Sdt9$\)|))); <A,<źU+Ү[zU*VjV`];jٚʝKݻxwn˿ LXdÈ+^̸ǐ#KLȅ3kYl,ytIF-:հU~=,۱i붝wm NÝ+_УKN2ν;JoC<ͧGV}{ᓕ~XV߯;w؝& 62d6pofӆa:o!v8%u)2GME8ZDْH&d>D"8(K= c Rba `B_dJ$fc d. itW~||zڧ"Z}27\q6kRZ\*,XbX`)i Ỹe[Lr>mAJn{߻#_|7|O6)}>JP@ Jh#KpZ4 #@=nt:롚vZr9{LF3L٬ed(gɘ(W)JVt%*a$J!D!G Q'V Ut1 D5Mnԛ0qx LW6&A9'q+g/C= l 0VLgTx:vР(anHъސz$ ,`SbE(Ә5AB5t TpIzDd̗#oQ)9~ @:>lcdsCXHCGi.7pibyk#76JZ"2ϭk=[uU _@=R36` .gB}@iRjV[T}P>+bh o`,Jj[-!"@.BR# #H80#"N1 6Jaz$UlT[8]X@@A/R͝q)wH-bEyXU/cd򕲌e+ d"2Ȫ4#+9M^ )[YXrCG+T@{`Wu0~Sߏ fJF0zH#H8wHT@g=&Ţ(H'W)b4hab1R6Cج=N5#VG^-Fg23پ;\Ύ`}H .* AMZqi+<Ҋ @-FzX9PUHu9D 7%70Yz&u9JۺlH~Twq^jW•{Ex_ >X*ux7'v5VñR fQZ E+@ 8łHC r4.Ѩm.=0`q,a1mCMBD9z N&Oӆ- cBu$wkvN3$XG'2a//=Fu "<%y tXBh,xy=%|*M*[.!}ัX(z#"s;ͷw\w?!+kDr}*wrߚW_ϿZB7C>%-Rs_ 찿96@DrDQVTr$>`+3Z0OpP)XT&?O# `+FbsZOp+GV)ـ=O-/H%|)$k'o:&LӧjtRx1v'd86>Յ@0 XBO& myQ 5s8^FX:xhp)V[X" tP$p\iD]a]C8rN~evOpX7qRq(X 'Xpx3I#&Htl2T 8 H=e% Fx"yi$B|]m=\v881V ΁Eh=}(H}7~~'ǐ )D1xv GMTmHɑtWH,ْuF -(10)w*pAIxwqqHJFP.#=cYٕ^I79b '[c iڇܧǖwrsYs 'cU⥗~9Yy٘9Yyٙ9YyٚI%S Q,, 9Y!&$/t:> Pp D9Qיw-$r.fIF%&@ c)-%'N %p%&=XTP X% ڠz8a<zi)4B{ !^0I+ZTK@TM!G lRBZDJ^=0p Ia@L]+) J! 3AY`+ Zpu0 `@a8; Xa+ Z>!jXQkڦo*b@HPUfGZ%ʤR,p\hdZڞHhjgz A!(0bggJu %VV%Eg 8I:Oɪ !8 ֺ*zj^JxZv@Vz,5u56Tz0t*WXL@9i0AQQ4@P/,0+Iv%=Xv)GA+D/GNIQq\@AU~4PQ4JUzl T8p\ P\Xj0OV+6.e!!ĄG1 %H@OXRaɕʹP{ X_&Y4`$QbP biKS!60+%%*}M9Up p9jH0uk(%C@_[{EQr[+ɻN{fRavW l`+%2f%Uk%+ B`NS+GW :g%٠`# +|{!Eäz*F` &}>0b`g<%M܈P, ZLcVf&:P vAԀ[\W~& v|0: Κ#c\gEÅ=쭈\Qrt|ǐQ{DU@)&Z`X[\ʦ\<,P x Z4r S|R yy,A[K|V4V%@9 n@ 4l!a+Ph A,l +Ǎ\L78`c5lPy \|@;E6 =9 u4g,].]0}h<ӎw1 Ll%[LM^Xa!@i) G5_]tH K}жGLk-i#mX\-%EanXȢ{DXr>ؐm@О @ 5(SLռ Z*OOh()+ٝmXm)Z4͈zt7wWKw9p%dmmfݻݑmB (#r0 % S %p,/ ) sKPEr;X΃ !ܜn%..)UдQTY"Y)Y`xa8E*9D~JCJ|?~UnW/`~Icf~hen_n:p~xz|~>^sw芮n>>Nwp阞>^~ꨎꉰ.P~^ o`.0NǾˮNҞn>ؾ.n^.NnnĹ^^?难~> ?$?o /_!^@>/^>JALOM/KO?FOXZYF_y ?_ x|!Nn.NnOz|~?o/ȯOo?// o]/U?V/o[oO?N!! DPB >1"eԊHĘQF=~%MtRʕs\ L5kSA=}YHPDE4i#M:Uԩ^ŊUV]~VXe͞-8^VnBNš]XyWo\U Uℙh=~< '-dYeL/m~StN}E=TjO]7[jVW]0ۻ} \7Ç~\x;'ƙկ{]7?{yѯO>yflP\=M Y@NhC 4dGª>z'0 PB !X%?zEUǟ~9.L: F3ʹRc^Mj;I'2J)Do!!+z KmQg ,ZFh6@#N6'#Pz8TPA eI JH4Ѳ~iQ#.-qW Ѳ3ۑ?Q K"W;ҵ$c[rփrtMW%]56cMX^EZfheV" ۇ $ZA t7N2P 6.:IW_.O!%] Rъ1Ӱ#* ((ԓFeԘN)՝Vբ^U*֧f֬9fgY>q9Awf(A=(zqBsGrNڡ />ңx !*"̅(:mDA `j(KHf!"wpn\P'5ƌ< D&LV T\-X죯ד=ouvq=w߃]xGf(ICrz!J1![ sŠC Y6vkrМ ZB Ax],`bc,lp6c`B?/0K%w@BF\ N#HHc qAʱ"}!2R{8 *X Zh G*Ⲇ~ 0"C%>T %cAX3*q AČlk\sg87}t~HWӝuPXWUҒd&§Z { 'tԃ=؁cC^=rpC!/P,%F3$q Z]tf j{B(Xwt30U%0bi^ 8\(qBN(1Dh R;䔌\p 1ClGA$ P $91"T=qO@EяHZLRPTE I>A $L ]Rș'"ȣ<)$biaZ͂*ԧJu9TjTUZWjSZխ̑&O"Di+CƐ.y9AJdPǍt!\"08!~$" %A9h* 6!e'b}> Q4Z s1F BEu2`@H&J4P)d@x:a?+vVd bFK\WtK G [߅ w q) qSBԧPITBJ&5awIq]z"v"T8G=d m /X8H-]aSBF @F+lS! 'cku A^f -pGWE=?6JǃАA3/}S5a6 @p,gPȈ;H_L)gn1҃T6ũ;<0QQaJû;O'\b#96U8!> LE䎤%m3bE=q=b (5eÔb#I y[9,Y90n (04<: Uķ!bf(&TVCCxF.ҕ(Udt ]- V~[Q:9}$8SjձQkaoH}$x  $ :Zu !fhC B,#d{8a!z`c IrCw&॥2B, z!D",Uyn:P{0Y_>{AʇX㛐GSiyR~@l=bǮSV:B5/ԯz5d+*+;+? @@:@L@\@,@a D@ +)24rXH*+BC>ƒC:8:2LC6#̙A?E?ۿIKLD%;: `3Tqؠp6 :<ӣc.hzH}S`ZBl 0BH$,V*('kÆ*c-#-7Âè[vh}:)/FKKGK:@$F8RoT[0+C:;KGZ;gcg6`HhȍȌȎII$ɓɐ@N̞zQlZHuK01Ek[A`=%!C@D.rz*3-Jd44;/3d8E8TЇk-Pr;5y;Cl?8-X}Ї}H3ȁO.sGT?TKӱE ATχ ##~-{P>({Ȃ3Ո(ZLKVk"/|֖{V%bc"SGhEe|WƐ & "2W 5 @&:`$ qe=둆jPJ0h3 MhߴEyÕRgQ!%.(.ˎ,mXYن+ (9CӴxVH3݂#BW[[>ĉ3)0?cW5U[[6L˵EI]]]-] 5]E]=sS -|XN=,[ވMCDF6Α789.:Nm6=Յ݈,IdOVM&eP.NeM6VFb!X@De vd1FVfv\6cFdVe^]&^_`a{a *mopqnbn.gp&Qt>gqntffy`ghdidjdkb>!,W!,Q/ H*\ȰÇ#JHŋ3jȱǏ nIdIO(ST˗0cʜI͛81Irϔ9 JѣHjOPJJդLw:yׯ`Ê֕cӪ]˶ۆeOݻxs.JL``#KL9M=9~\Ϡ]^μrӨSF8V˞MrkMͻssMq}Bo]?JwJyCyΛo2AT&zw.(`q&jp F(ag 6fXXy šha!,H+(FH8ec<8ӎ>)G@iL*a@!,W!,PWH eԊ(Hŋ3jȱǏ CIɓ(S\ɲ˗0cʜI#C qի7l͗B`i  H*]ʴӧPJJ8 )gCo+9i\ύƩ]F#Wkջx˷߿۸7Wg.Pw砇^0A{T#>? d ; k+@}3U*FAa'< ^ &pwilF:׳dG9oO:D> ]=*0Hwe0OFgX0Dcu qeDTd$nYڪ* [Iiqf~<$aNBڝ6"HD`0!5䲓h )^;qe pV1@ 2QB^=jE\jV$JȢ$y~qDĠ>„8&*"J4  9 4&̤&k'ZR!1v0,>+A3䌋a 6&;,1@V 0*C+wA( 0j̼2ZiD&bMz 'DawdTᵝ@+zu'9NxG2 Rc-*'Ȏ 87&JD RPȸID](=8aHz&L?a]0LĀ~Dr~=Sz= hR h<l%ޒT 4UO](="_-V,2)>([EӭpuO5! @ǙE"A)Ѓ ;d)/l2J5Yr;Dex#,+D;A[|r Hii J ;eEl@lUQZKܝ8;hȤQ :2Eb:CAsN?@(aUwLhce^;Wp _D ;ĖqbǁdVD17 U[m' wHŢ8α>' 2s̯dJδ7N{ӠGMRԨNWVհgMZָεw^MbΉ3`d;^,lEmm O‚P)Ve>{VTNDrq QdmA-_^!rߨMAw s+fc30aMn r +"BdC߻::Q &瀁AH.w@vH 6UdͼP"n@u[v ÀNO!NBn! QrAr0v@_Bx\HE#$){OMH3#!PAЬ @Qi>L:KScpgD@|P)nF нx_ Ziի+ELmޡġ xhz 1V6Ѻ:'(O4?L( lVE@{B0-a`5V|1C11A=$%'CBtR*m32-#/0%l0R91s "4X$7o|# b2J{pDPFtc7A=80?)%dS8vG?WJB٠#X6؆nG1|Gn"& (Z2P&Ydhs _C(aa;tOΥYXS ~aH}H4DLj9 tat sA RLۢba@ SFE@`x>&{l&20i KJplpSntZ4vz|ڧ~:Zzڨ:Zzl xʩl jcZVoq0xX6 NR{w}^C+NoIqFp S̀ lq6qڭ߲5|ѫp*iRʒgȚB,; aq;-rA뺏hT}"A 9%mDi1  'HYK'a(7gA^8`dsFQ08M9' !r7x62(B*,BWy,syFp 1l8N{:VBX # 3""8.<;gb@@H,q&z !X1a}/T50|}7)}1JE { *w\V{=((p UN7 |B{hLKt/0  ѳhRp)90J}KP)` ;1 %Bұd2;a;x3JCۙ;=w%tXMt *aa;?QV%t6#]#Gһhϑ${dr Hd,봐E@@ܒr@)@wQ)Z)+Ԑ@bť( >AC`Ce3c\Ƙ_ᴌ#3 520" PVĴB:ė-R`V$"\< 4~p6,D e|xL`4%ó1<0"@<,&w.GB$Jdr_z7/bČednҾs,K|+Q|g9$Al#bK)]F pNN]iϷrS b'^QR٣U| ;s#ip#U3n&%0+`#8Ю =LJ1\8y-Rj DWA,usUWLy.{aYoϏs}>=I@)c%50QYCr`$#Hiw쌍%CA-fr֨1JZ}K9 eJ0_B+# x“W`L%8^t['ut<"fD+%=Wҩ]1l6Teͣ=T:M-`j^~ ">$^&.~*~g&$'c 0 #a"!a+Av̓.%g%:^ q1ufpAEtJ=kNA a9aWzmF}`uu A⹿QP;qoNqnt M5[i 2,AW̲qS|V 7w0+ &bcp 0@"" Rv6*n;wuwwj b;+d{> V>s;yIA'^{^ BE*[LaX 7w((a+J\TLy0 $h7Lx _2kZ(8>xua!/3˻.ɓd(8 6K6*蚤B}%'I3w iR02>@#4AYE[+/%7 " a;IX5 <]1*]a@,HVr;oPF(&#XM!Q9u9a0!;_7a8\=qǏ,SȰ (AţT*@lĬH7~ُ!F@T D86ԫWLL bQ#bЫG;h4D#H$TS% JęSN=}TPEETRM>UTHu@XE2 +D@5]=D(?0J 0ܘz"gNFv dPkE XȺl[[Lیr5ĘW^' d\t?[{=P6ՃpōG\r͝?Nj["qbTo$!o6H<0 Ԛ z1N;g>k(c"~*H"*|  ND1EWdE_1ƠB xȆX*'ZAi?84OL0z؁ A@Dz|*ZY(2`i3ɊIB zjYluDBPIZR3Дi1RI'RK/4S `1!FP֒#I6>wP= P!2X'L"zHe컁 ΉsWs˝zjMO>M oEz]7ݘJHM7_}_{n4*JT*"Q!g2*HR`'"ֺ˯]Z2ʃ>16@ zq W :V1 :3ʆG`AVnhjCiw"QF;mfMŮ!J2gzaO }T\^v<O],ׁZh.@罁 (ケZb$spzœu ip2Ȉ@pGw!!!!T+m駧zW1CrssgZں'`4$7!oV]Eɥ4U.3u#SGP5D~r dHK/)``LD"D d8CІ7 愢zp@AI P ć@bC>$KIR1"FL628Y#8G:юw,  R<яd 9Ha-/!HF6ґ^b`AҒd&5IYBdVЪd.0n t-@H @ B#hhou׸ji1+# )4@UT>[v灊Q]Lap PR-<JF8FhÆɴ!bp~V& @H={\ W8_:XB*XexaCnrs-D "U \>Kt HŝT !q:bu1$ZL, (8 o'_1(EC$؇+V-o%H0~u! I# uAA)MI6`R4r(.Vk *Όr0.3&r WFH?ZsEL8x@ E=wc!j~N_YFo;1!HQգL{ ~Θcj2}QoL@^L-j]TÕ&)A Kd$%9%[gLh ztBA5u4eSHfJ3xސ}cǑ,q8 oFcSlYcH#A0z<9A@B)[:BSڀ܀<ӝgZQ jB 'Cdd. |}O][ݼD(މFX7Q~MF)!BOh'gy,Cpp_/{'G n X6xm8!xdcɏCvj<_#z0t <Rrq" T B$?l3tdA:Hy#z3Kπ-H3f0@QЙ6! h Aኯ«!h8Cª(ɹc8TԊDq%Dj8@@40ybw"Đ? ,'9<9üXD[Yq乐N$:92c5BWD,9pρ z i(S1к1@NSA\ (@(k!E(c!1 ;pD&ʁ154="zl)rH0S+ Gz'j3ڬnـ>HsG2{Ȏ̉IpO,;qGDɔLӈȍTɘbV\JP኷ɟʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$KLGpd˶ ~,: XЪ.X86yybB܉}r\& ̊Q7{R 0̴Ia ̥4 >pfh >`e5`z< .(K8⼐DpCֈkӑ~(hЈmwuVY]};_e∙&܂gِHk ؤ%OE Uy  M\xW&cYչYY: V؀w060XMW3ٍEUھ$ ;ڿ]nZ( 1Ђ-z8ͨҊz= ہ`Ơͧ3٬[YȤU 1`P˓ܠ(ט fj=?vid:6z 3ŔrܝL}㞌F?1zxΆhЉ D@}C* v,9I$V$k^臆舖芶&6FiIQKΗ NiHKi!xkDX#'xiM霘Ђ&Cv Ynyjj~ǁبe?ْ!]jinjx>k4(e'hkQw\* 1hHԸfj kLnbl[ ΞCz` XR sЃ&Pl ؀ (jtn1m 8x$n8PXn nVJ-Xi SSVL~w@R,隱ZF /%蚸A ψwHp[Y`w Ee#Ru#҆. $?g[ 8!q͉*"Dbq ~< 1vjn7 mc@E-75Hb`E sTY!Ԭ TAm0s ޔ@@` Z#_XXـX6z(p 3MK/!n꼚H,.wPM`rۃsWF V`]O%[?; hQ6։h6 s\H]1 hez\] ^kPi#Qk3c> ,1@{1 :Wa> N S{Gn S1V il膔vͯ8sX޵=ฉРO 4y@ԸYɨ ( v1>?l dnƱ؋ૉn y҆R?_ΑW)@,"4+1OF˦A$,\E5;VD <نne}6i܂zU%PAmAN|`~BY0@hFu@[PUX=:饛~:ꩫ˫:>;>+;;_<+n3>髿>>?????(< 2J( RvN L (wjQX<V&Bq.DW #Xq|HX`HHz]1 !-Z.'hWX"7$hk wb5yj(G1! m!W`*vee̊?A "#(I!4AgjP%!(C ‹/Pt%qG2TH%?V"hKa%%)L=d0;f\3x$41RF4)X(A¤"$K- d0VQZxDnsLCje P~6m=h(4D*6CYYс!<*HF/)Od{z (>!ҍgl/*ԡΉ|z5Q4Z HSU P!WH:gqR:&tQ*NhɁ|OӀ05,Q7Q lH᚞;::V3@`q$A [_S{\䳵ʡZ' ֋3'W buz֯s=dU(r0݈D!.EBU` i6\M[Hp{5h 4QhBRJoEam*'T@!0:-EOFSq[mQV%`DLz@y4^(/G'akA{X!Jr*0qm[ !,0pl=9, Nj]Sc9WBb#iBRe.,Z4:a E7)/uנ9(|>ӺÓ S1,YAؾJDrp-2ȠqɎ j(UJ=-7ZYmyۚ!QN tHԨ6 6l,Wm#"TV6^vJn4JBwHſS7e}ڞ10J9c^R!Ur^ZfThϑH4!R10`C՘G,rOɾ 4i ڶ6.w hAYO*P A ٮ~[UF*W lp9^5Za;zyUi{SM=6={wj|72 gx9Kh/#ʨ:2r+#l&1"f,q~볯}y$_KJ:Z`m6hBZ1 iv: "|8] fJĴ)E` V Q BP`rJ Ơ ֠   !aB7LٔZ hF }'jǥ!Ȅ6@̘! 4UBWH [r`FؼXE=|#""Wpz$V^(@GtH}C@tvU,uP "G[\i)d!:} } nJT \Y=,6AR"kȢPDcVҼ%YQmԃ\_M0~Eu ,Ԑ3}*tCX ,b>J:N< 8TC 1!2!G;09TC4<LI<V = ;;IփX%VP Lօ@,8 G_tT<8@XA iU4X t XW@ Uؤ]RF 0ZiQD@H__`BT!TvQRV~t%ID: }T$xEn ă3TXXEE ݥmP#d;Ra*of0f=$fEGD8NTHLrD=(@^2 EdW0HtdCvk~dԃY Jlަ{"`& AK g:}@}DP: AF} Bh E8t>U s fF xABX 'DTXW`6B.J)'Pk%L0B8NgDШVSýLtJ;˴E@j(SW\hXW(c[)y F̓4C DD6SWD Đ"ْ)! ĒDiF(WB=PqdC[#B^jIC)4}֛٧R"."zMUCRfR DIGDt<.wFJpQpi7^R(4b*On)rXE=xfBě2ƳRyKSBBD8sF=ZJZfM;튳N@ j8U"!UED룆[t0PT;&+O^2@@i țHr>ĂЩ4<Ľ+Jj~@X"KlUՄFDa*kF&JDʤ,l  4ʣ- g|ՃTJ?\t "D 8 T=ëИm#WNEםJK=dKdDDLR̕x” փ5BDU DLFLR@ = ۽Ъ@HqRAт^M-C0HzJ2o@DDDSzDp E5o ] APPWpo~/'L#|B^M$//vh8/K/ @+.%(qXM@]%6O0W_0go0w00 0 0 0 (5 iQ ߰e FMWD,HiaqiE 0LԄh%Je%Q ِeP J 851K$N"EL!0pC`qZVP}qɽ(ȱiq/PcWåD _M4g1psDdNMHSrz@JSV-X Pzbeh޾L_gC[EP]iΗj E3JUKKDSE hiNEDujy5UZ D֭89Gwx"xoMVUWduMl5r4u`+B*w!wQx!Cux DecMCʗ@$Dt(6xem]Ez9v.1avV-I@s5y)Fye@tjۀ¬hCĘCj甕BdJJئҙ0y6?'b#'7Ahٿ =xY~ \O2 DY=jU#jFJYy7xZ6GEtn=EڤD}G8qՂJڨYS>g`]Z=«ٶ@FH"DiRĴ}DQȆDMφ.k[.`<@FЫjGML=8+SlLtq܆CDfшTTхhZȍDiQ_Bh@֐qۨl=h˺,,lDDBw;h V2˱0JS?#D!yL  8EI"rH+Y Utgܭmt,8Et@8hBt0ݻz7ϘL Έ= @t@X"^S̘;ЌDީD͐7Uuܤgn:%|4^=<^{.H@/k^ȿQ 1__m]o^V1O%AX"wPш۾~iy+22^]F*Wp{=(㔌TuK?P F!SDsD+_6΅5166KGrs]DV@0z&TPaz DȐbE1fԸcGA9dI'QTeK/aƔ9s!c iB FūW/H* ԛBP0P `B뽛aYJi# V -hل@]hcV{b_C3tSKE`b֮zcEFУiVukׯaǖ=vm۪Y `=s '`D9t 0n1BsV7u )Zvle'ՓPZ IW!,PGo{K~ۯ=H ɴʈzbH`$p 1A QI,QyҠ C!a' r 38N ҉`$RÅ)*#'>Bj҃4Km G  * Bts0)N 0%,(*+ #;z#%l*uH'MQM9OA UԒtd.z`DQ :j"scs.x82\XU @xtcKK1OUEYO@DQ\zd̽g1v\T]ꗏf'x.2~ F1xԇ!X)Lʇl1#=+F ʢ\mZQ© ej(C '"]buc[gzsXNZHf)#?a'tt`(': /O\$$Bυ la/z [rX휈薡l4:l#gW!\-2vψ#Mh)_gKyJfj{{O_o$!?z+N+B_ietw4@i#!Eyrz`ùV]By q|2!cس<( T̽RУ !1Df-#7JCݹE4D`(9BXRT-!(CA:M{b}QwP PD=0%$SLDYXGLQ^ȅ\hH24  D=CHRddB.I%4)?Gd HFBvX Ń`樂WL2@(vBxD=F=XqE1' u@H(ԙP AnP NAb.RH)C ـPZq"BY|&d@AP.t&èQ0&  r?r"/2 S^t_ Q%EMKESҒ?;PRVZjH3O{C185#,!R+eH(Q  P u[WvK> &Y c`ZЃhcF`vKcw ZQE1a|+NupAAC9q"H csX9IOa0+D*:Z,׸CAP;WNMǁ8|. {C p [MfqjԮؓB"hW옦fH!]8W=_6k F9<($RfvZdMB~GjI"EB̎3$%ơuacxT)C"ɐP{ E>'|"0lO  q )V&E%۫Airۋi El2mvᬸsg=1Ѭ\@Ѕ6 @ghDOҕ\|iMoӝAjQԥ6QjUխvakYϚֵqk]׽la6le/v5A 9ն2!TIgP NN(2$=ls Ոsj @!Ɂ2AoM63Z0Խr7\:[$ o)$"̲ Չ7Mp7&.sG=95#T\(A ]}sosSa G+hW;#>bȄ1+diq2'~O^xNvO69G<$d  &ч љEX;ABp*EprWP. q&-huۦ5i"e(%[Ί֝>l|ECcbW?TIܻD"4z,xv@bOo!(R#B@7, HY#NTONFD 7#gPZf@0I+]M(( #ͲAn&b#0FLp &tF]B~݁rȌ04N( t(@  o0UQ%Z)Lrd˪.(N8F / +v'~چJ!BҢ# +/BF n1C  _e"._ EН؀ `r`(e#I `+A R#f W,2!g"Xp hD2끗l2=OXA X@f(u&&'e с iAdr!FYl¡'@sҲ4S2S;. Bgj,24hu &h b"9:S7^iø{;4ų )@;^RZs^;8 Wd,m!2L:LL`8Ӑ݂`؂!D4aX@cH,UR"CЪPr3 sia LXPXYx hA(ÄqbAn`?ba6WxIkn@hg`y2"Wv{C!xb,ÿE3Rv ΀mX"!AhaBh?W؏Y v"ŇbԖ px AY҃2 ڭ!P^he\tAi!^|qMB2!{fi)@K7ꏢM`zvKWh)7[RÄa+zx} .Jy W N+>v{=1*x.k$@֧"!a+$T`ϞÎ-f/B1qM b^VyQ&5'___#ϒ{?rQ\3I{U Rwġ?d?cE$ !,W!,RJ H*\ȰÇ#JHŋ3jȱǏ C.4EI"S\ɲ˗0cʜIf8Kɳϟ@ Z3gNH*]ʴӧJիXjE(֯`ÊKVcWeӪ]˶mӳ%)P` x"\r)h㥯Èk*0 Š#KLY) W̹甌}\ӨS+ =ZװcO-۸sM_B“+_șKN}%qѫkΝsٻnO^w˫_/qa׷߀`&{ n fVhaU ^o5o(bs ((s *(u% 8c!,W!,QY H*\ȰÇ#JHŋ3jȱǏ Cj\EI"S\ɲ˗0cʜI&œ8Kɳϟ@ J`ΜE*]ʴӧPo=իXjp*U`ÊKlH(ͪ]˶۬hu@W"˷ߍqIKA6?$]̸cW { 3kii2ӨSMb=aҧPJJիXjZUHy;r aՉ*4)CxRmQvB {̸ql*^̸ǐ#K+X˞U$Cp\%N<@4FcuAu@ N8Dˏ5ptz+wNO.nj!=b_u_Ͼ㻷wAqX#ڑN is)4B<&iV5A@ @|$h("G p_ Sy%@V8Y< ;c>^FK#<<Nl O3K|M 0ϦuZ^ԓFHi,Z01^8P8jTQBF ;,[~YPZ2ч oVKP4Âv+nS5K0hbT>J-\"tF S;(lD[/|KڷD~LN;'L [ΰ7{ GL(NWbZ#&ogLr8ƱwRdqbUT$ͭ,QK=5ø qKhBd^<f@PGq6yֳnL: |ȳ|π Vrڞ$7 ,@Q>$+hF>5Rs7"iBbtG'P=^Dp ZZ ǎEhhN!d=>}@Io$CԄЧA ɃQܑmCQV * XTj`qiX'1L 2 ,j,q gJӚ䦆MӢcdJF՞)xb _4bT@9#hj!:o2;04^RPۼ|X{R<*(aHƢ((y&CV8;"m|99pr#c2/qbra Ysqݓx7OrN602(L1#Y3! UgWΕ.؁9d]L9^g][+&f`{Abwȼ =Bzp}_8JbE= hDA,Aj!-#Rl4C[}x1c3Ecx|F`6%&`> @}p04{P$ ЖDuY'Wa?awU*0vf|*vpz21`H}P QPD=  @ `a dRn-1%hp)vbX+{Omd{5`R46H.U J%S7rz\7]gAhTb7DP~"CDdb7lWe!!1KBt$"7RL]`FFDh,AFƈߦ "7OC-5a,، !s``AqPSfQ" tMNEHjn]'KTcVlqQFPye$F(@)9DaLTURuoU )@N&DWmUu0WE@A)(+m&2B6" M+rr$c2SAV`XQ#x@EE &Zf˜B9 qV@U;&#`@ "%zi0AS fH@?yZeɛ!(PUD{CYa(H#@ӕ])#%@1\ť-`Ne\ع8{9Yyٟ:Zz ڠ:Zzڡ֜jY2`C00P!#m"Z":s899 F OqiEzIevfifT8ze':@jR&\Wiy÷uuO3 !@Jӱ&jXv#fS4 ~ѴRpWZWJ|:I@w0QSy7;8&&`-P#'X%h*Ô/2!Sg>&ߠ%@GF+r.V๠+z[ۺWqrB|KE|[~xrDVX}0}k*B L|a!;V=x~1M;XqEX(~%S ?iu?>18X u0>0{x !86AZqudlq50|)2l4-I@W:DFQGWVAJ''Sq YjЋBE!*H?;dQ AʼnY,N&0-cQ~la!AO1ąTc0ٷ*ǗaO'O 1,\ Xƙ}X/&!nJF1m\p\L%<0[\:x)WW1X(P*,%+R(( A;y؊~2ʺ5l~gFjεhAW%$,lm}jǫ5qIX);Aq0Clr`HL,mA+EIPyo#-{=EVS ajQFmLO=Lq0"1q Ykq~J;o/]y<en4ʟdSf]9FQ T) F1ShQ0,G,rF3QPժW: ^It ;h=٫1.3.R$1y%@ٝa @肞_]YYNF.Hn N> Qby`]a>e~ў@q7 tvP렞u7=|7F0~芾>^~阞难% bF nM兑cn8Ae1Q!vn Rk->TRf02Ѥ5BZ:ar>n`9}z m!i{?,ʲ(*G薧᮵/.ѨkJ KR\]Zj}jw;q^ljA\(#1s#-&Z U.ߺĎ##'/ \aoc  .uGF~5p ka ܎ ^F-萉\}7pE$G#(YN\s)]r+rdU$2tfhyo <*W.ۄ 9sd$|߽(//^!\o1=h"I;BfxyϊI-$ls En^~_p\};1(Ȉ!@x4 ЫBÄX=e)aF Pq#BK /&[ r#59y sˁE]=x]!$BM]*uUjLU^ŚUV]~VXe͞EVZmݾ9ezBnL#`SZSeMcErīo4䚥+w$JLJ5dzZoؓC`t::tT)le*Wtխ_Ǟ]vݽ[$ZNM)< ,rq+DYY)y級B`4KLto 6s_V(qH`+y0dpmŭ/FgFo1GwJ<;l=2 1䫇xh†n,2y)&d6 ۜiP@쪇 1ȐfH #L+\d7%PCE4QE Kki L2cJ%+R lL]tLr!L1שp}.AzYTPQk6[mۦeT )>6myq!TIfJR2u A1KyH#U@YJɄqIaznlZAHÜu1dRljE9eWfeU,+`#O u)!H {Dp(`4DiYJR*iN/>SQBP猶ae{b/TG#) O' EĘRJڏkW_Ƣr.ҩGD< A j4LA Q` dNQ,S u _ժ+?-V`)PCm|;F^uGO @ rLF!z0d4J#0=DAa $1\Cg `M$<|ݬrm26Qnxk~[=&iDJ-NvH.]AHO SpwM뱵s4 ; Xan͔ Eljs' o.A[IȒM.#܂uT; @%J!-8ѳE؆W=L=<$n={s^hب:ͪ""A(YlKGiLuVJ eW$N!m O-ĕSQ_1X{e)a :g06- O^T[ px#|vq \}x|dg-Ppz=b3EaAI<ژM N3;<2wh k =Q0A@ !D PɁns؟8U=`e 18aP3P3*V `x [_F*H""'S',X$ iFPz@+'FX&z`4sRCttw #)a; )x|Ԟ[)rǀHab#(ƁDȄTȅdȆtȇȈȉȊȌȍȎȏɐɑ$ɒ4ɓDlBjJɗ NIpJ++la'I#X GdɫЂ\z'ʰx(B ,JyD`-E PBjʺ7 F{F*y)j 2KhT' 1̚01ILˬx5,„МɘtHȒˊ z ;=.zTN H`lb  硁* ,",>YzX RĊ; 9tVXwpDxjix!C!܃U@OY}w@V  X`w3 5 ]ިyOPyb! s8.yϪP P1 QҊ*Aj.Ŗ k<+w=m)d௡ B :cȉSs@#)v!=>}<0f# ۰* |=$lLPx  PXU@zCu9 !12˘&C)>-Ѫw`EЃfVԔhTr/: PzKgqU¤P4m,Xʬ(`]5Մ=1 Dze0` cD۽z_"ٍK!/R݉ 8WHפ`wrW!W@+YL13W,n7A @։`R ӕ!]c#؃(1؃H۵ex (h[P[]tp[(Pkʦ۷[*Y7`CXm(\h,,`#|_Ъ50Z1Y!8a e0lTe] I ]Ҡt\WVm&U}]hȝ\p, xPӅ_I`]!!= Yjz`ozv`iPEH`8m/H ą̨ ~ )3`FhǰVz(aH] X]_Jy KݗHc>S.86*%~&N5pb6"Z8W2<:`:i9ajb&v,伊Գ3( 67HPU 0N1fJ QV!z0`?P]fc *R=6%zZ -cudd8yzżoވ'xqw HІr^+ @gq#怼nP@u "T"egst𽑻98z R@"!š:摦delc䱾)䳾j\mVᆗf)nB :@qw0.˹[+Bp*in|59.ܑ P u 9T_xІ k: h;= 19[C|DcLJp7ɦ X#І->"CN3E8 Rl( OdtDl؞+ L[d @wΦY:}pPvnw' x" a'G;F,H>棤*𳪰Ʃ(gDͪدo*6oMr7$Wpw '7GO~̑z@q#f ШҊrD 8qg8.kr(O'/2E : fZrrlGtWD leE i7( i>vxCv "ō9kyꥏ<=+xh%f;clsznWlX ٖ Pv(w P%Oky5CJ&)?.Őzۑۖ i(k'2GkrK[7_<`| ~0xe&*EO_ܚ`IFInwa}PQAŏ]79| )]=1݂7sCq˟~$%]v``P5d |}^Uk3y þגi;zx?e8zW{JJ`  8!D#Rh"ƌ7r#Ȑ"G,i$ʔ*Wl@8(Цc%lz<,VM -fAu!CnpWoDsX^ճ‡}ImDiͪnԩJԛP.^.l0Ċ3nyag^T8r&X JWO]ocT ٩w5LЛ7=A ղUx^c-bԵ_OsǓ/o<0޻'SI=rXz ~GA3v OdSO,ͶL!iR@,H#@=8$LeZm}u{mg!h݌ut|A 9$Ey$L3=V@ 'j!h`_u Y=%7i"P ied4C"% Ya6 1d P(7)ܢY5֣;F(w;㊋&)z)i76ZUA)t!d) k+i0$R U0!,n&E%;hP-! mBz4P$S-w}㤗..BY %LL=,@2CԤu  y"D%1Iz籼!<2%=12P,P31r2=3A =HL8O49[~9k9{9衋>:饛~:ꩫ:뭻:>;~;;; ?<|Ϫt\] K?=1Ӟq ܛ!iC W>TLtNZilVMNppE( 7-@7 R' 7űJ$ME@7Էg&t Y>aH$”p 9P@/c206lQdU` )(1 "D"2Dh ŌESC cHf4#2z؊|$QBB:F84D%MB Qǰ +F1 %`AzcD4Uсdr@t])$G`ᶄ`&9$6 pp-[e`T'*P`9RzŁZe-ZE  +b=A&mlFh:X c* \47*3Y6C*=b06d=)cAqSO=d !ଶQ:% "&fRQo"t;-J*@ -xZu!C@LȖ Yءřs K" 7@1- nrPzc[xB4)dP(I 9)P) 36.(bU8Z{w^%d#CXt*_ZF=tH#ۙa+Y;+~H,(R*VwWL.$!^+aa A<$ݯ=/|b`Gtݵ8Z<'wm׉ -,P ^˷0 SC V` 42Y v~  Ơ ֠   6e (5z!Vt,0( mKG@&.]@4C`QS~j8C-tF@Ctd`~!!yP^i$!F<e7!1 C ev|D9`!G $!TB`;'D'D@ot"0`a)#(*vxuL@ʽDx+fV/_!9C$bBH$-t 0C&A<`T 5ŃT(<@$MV?:@ d XYA2C*~\="P9~쬛:7uS~TAl7C @8S`9@$9K=I$񈛸&Dq2DI#EE7U'qp=AAq@P<kb_ D94bD[r]R=T#Ńp#uhuWHE59^%cNVW+_VtH=|H1jm]EL! A<ކ6(Gl-h}cG/~ooU.BoGlP:Y)Q$=jPw\Flpl& Iw(]ȯ@dV:f bփ"εFpS0xZBwTt@8#Eȑ` DQƼQ_BHEC.^TFIq@ q1H'|(aRЅ*Ȑ08dA+R+,,RR;HKBR')*+E'*ywh@$LȒbEZ(A iaD-/ LȂܓ;e-EL _$R@mx(>>#Ճ4ـRՆ*1#<3)B`mnPFR,c.`F@@r<o'WuxVq |5} @X PAELvq&TK3=TOԐ4OT[CPMQ+3̄)W@e:5'T'BA ^hE p_QބNh,@@V@q4 3U@ gdHA;<YyC|* zAZaE2Iʟ!Ǻ@[ 5I} d||5@U= BEB,=LZtC }mL}.:;0ղI770;Kj8 D?ALxsll @Q]:e<9_ s(2@P>L~.A ]@tk 3s[Jॊp#%N5$\]=$<1BL<^BvJ 3z(VxBYHCS+z/@S%` ~D0ZDH!E,)4 H  pPGz!($KeIfȎMjq|T4Y4ѤCF:jUWfպkW_;lYgѦU[Z-_[m]wջo_xqǑ'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿BjL8MťaZ)$LJìbCI,z܁ DB*eo( 2™y\"iq)2Zš:Đ!"pHЌ 5z4ɩH*IB 2+DUhDAtV f'J-%4HjP`x$Z^ajq%7y9Ly9hy'Ayu^`ÐmdPyᡦsw 7b=ՠ9 vrzƩQ KJܘY@}p鰕9 vءGX1%5裓`ipaP'c@,wv (L>c>pibyMLxʦ_ z,ܷeƻ'vnq{v[za6rF3߼sZ& k1h^=o1͹9ސ5Dj9*Lꁧ>#q٘o~\빞) p)Vp% WGf}ߨzd_vG(Ou;twN,r ҁ]"ZT䱡dPJ㽎o|Dz<VH l,NKpeU!{c'…ԴQ\`KR(7:hP ȋ.APјL|@4JEEpz'05D%ByC[@TPmNbIB˶Td9I)6e[!eQJD% }T ݖ4 !D aOqhe;o1!ňSsjwI.@i$rL`ND$tp!j>f!b&.$HCj8h]BZ֤c)$7 S~wos6]F7n,;nrۍ g[ 0@5^#F*4-we4' Z!3L!?wHZ B_R~eň8;l!|Ԓt^Fr&#o9! r [ vI:v L0I$s0p /-~hpz;%4U2jj">$^';j IcА0bc HJo|HB aAeᓖx[`Y0*$InR⒴f5rgHbQ=ESDرܱ& a1Q~&mR Z2fPRe'^e*iI HT B!b' 72+Y$Z\%1Z1 I1r`Eqc,UK~*\0fR1ށDXD* F@*2*C G+-sU( \B +H%&I%԰&baLbC1ZQ&3l 4c&5.c¬Ԋ$-G*,x!.3;$h/4gS.Q   \\sJ0auSBa >#>$ZLPG'\TGb%f'JY0砍N +c E\bBtLK$! xyqG1@#J% L/rAx/TamG MK"N`MA N]Nc _#0<{e> K"ޤLIDZ R#> '@M#RuUaR"& *TnXX˩XuYuʚYup5ZZZ5[u[[[5\u\ɵ\\5]u]ٵ]u^\ˠ v@ ^ܢ^E+T@H^_~ $ MZ "A* ( !*5@@aO->"Ԡ P$6d2HU, !e6ee]vԪFiB ڠ pvb+0$V8@`@ An R6,j#4`Q 03X4BT@$f aIf rCwq7fqo+HP6N( lRm3Vo9 ,uS RDȀxbBP8RR #z e@ !RV2!jBywb7zT`{iAzj!/'`!s?Ŏ`n ҥ{ˡ֖ ~(J!KS!Dv1oS;)|azɠH'$@R,9@VzV >>6&> m|`N" .*.aZ8 #4!:UUNdC@K)(H`£9$Tc?+Dn`bp,vCM@^ ? ?! \!,W!, %] H*\ȰÇ#JHŋ3jȱcÀ!,W!,R _)P` p pq)L|q#D1VQ/?nL$ʏVD̙2U:&˛=Iq(I KB !,W!,Q @/D X/m~HXD5,ؤM  fPƍ;x9L,)PB)'F!;@,T  qKIL&' zkT$ؐNGlX8R"x̣3r p2 xQZoyՠH~b5ar1bAٰ?Ncben^옍?,]p1L f1AkJ`QhՑ ?)Ah$!6v z1aQ,!,i3H.F;MhBq 5PB.@QKT<:v0 x8)m9XGa!'ꁎ D9MrQ<գM aɆAGPPG ؈gO` X{Y%OJJa9~VeDA.6 "^$ U^.XW7p4,MӪ0/ @ӲHd GjWԠ  a R$`+ /!ȂD#% ZKZͮvz xKMz|Kͯ~LN;'L [܂-7^˖I`0x$5glئN70DJ\ lW}lC#8Uř##Y_C*[:?JR"@L' 8E\4o6?iU=rs:9!6. Cg k"a1qA8aWYЈV43|'< OsNw:lКP| *,XE$2bl)n p@OJ~ف<0&6A|lK jW9D"[=$)U)l, G@x&'Ap"SvU$`a #޶ bC&޺nBm%XgK EĎ)PN ۴SYUT`yS8+sqt(1 ({ n"SUaq>˴;4i`bn`y3?q\<+8'QD<#QC>8H:3#W=׳ܗ*F8hw=<t @Q(>Zh>ʲPTO[<?`qDshlq&ASrЊцBCB=(BQr$$–AMpx?Q [8N9,ponds?w`yQUgV+#*hq Q TD5t;0>8X):%=іHRj!q~vBun` *WP8&!*ʢnsxh٣%n !WWWayQ.t;~H1 XX!JHSHFW~Ar 00}yp shIF)>v9}*>磊z_E[QT@^\5$dUJ*=N|'\̥b Qby`iZr7'zPvX됪zȊGՃg9FZzؚںڭ:Zz蚮꺮ڮ:Ȫ AeMb0sQ+ 2/gzk#jJѯ(`Ue1!Y|!dd+)- yZ\&1;f>KL`DQ'p0aAgkv?fPU)=1KY?- avvhhT0~'|@|0B*,vaaF}KKѻ"(j|v%48l;|4]LKW`Q}$(Cہ`I<!~_)pfh rkI%mG؇|P`XPL<\}5⌍Ka \L,Z wHx+/H| t&baGeu$6LF|,zj)]U3Q7fBwiTA@j2X>y@ie$7w @1{F&|~I]4Q qbL-qIX=0ȾaYf<~5 AMPBC}׶>|r:|kd)Ym'T+ tR$Q%ڝ!iWd^EԷ=&L5S ʳP%u7"$SAS͍\!x[ gYuM<8XW)ѢבeZe,*.AD9!\Z*eTa6SUCj6IdzdZaY3fçQ;! WFؒ$Ӈeeޗ22[Jxp W>^~븞뺾>^~Ȟʾx?7 A>3EaqbY J %;bԞ! %>宅Ԡԑ?q#ƻ\XfC o/;?F@pWVs+-c91o;!]5~#K "}lIjmF|mu%pq9K! FKŻ@$KB*N߮$LuN6*;T2A(U'{Ů)+0 Shuc 1ӢB h* {sF+4}JoykvwǮ.B//%"9 {g{.o x!0ZQB/c<qx6u>j=w!@@R@xz98PPz:W/=~RH%MDRJ-]SL5męSΓ:v"ȉ@ t=! գ`uEDH̢桀Zի §Ȫ-ض#z&P/\BHI$9Ydʕ-_ƜYfΝ=)Al|x DU/Q ` иqruNJeM;i=see+H(@{ܺ-R=x |l(Tt(Z~0@$& Ҫ"Pc$v{M[I;( tBsN=ĩAdM @s1*Frb_V(qI@)J+2K--;p$ 摦\P +DD yZkDc9 ơ J0Тb9&MR*J)6ʁ"*5TQG%TSOI4!`!R*4[5DPeᝊz}ı @#ja) bS#_ǥZ ܩg"!Uue]w߅K&1h`H ́258N 8(rD=U!@H(FP#+L9&do!) [*Ă` $^wg.Uy( {3D pw ss˅!0]f6 H0%!rdhe[bi?cIѠ%2.4i( hgqIv)8晧Ikiz:{wpঠsfـ F ڽQ{?&LZ{ +ێ iJ '|GhIhrт8&$$rQ. CN8H@hg6 NBIW;Ӥ'R?M>t>58OS&O M;0 CA,u`r IxPъAI_ԪWJS9Ʀ%)Q]ӯ^,\ժ82%@H+N=HQ zAbհLV62@%/V%nVD4Rq:6Pd 1K2z4e `i IW1*@lp{wFWfD8'$> bz,d &VLj>K!$$"hAp2욢3(ˊI]=9 O2 =nrdtF!B FHҵqlS0 zV Ʒ.Ya)BLw=كe'b Fv UB8 Io TuӍ7bPw@TH<e njX!/| E=N+ "sAp,>Ѱq^Mx C%A6J$Y`( qg=s|^qNit4z>\cz ^_Rό@ڻ;s `k{G6CDa=kN@;JxPw%|8 !qy̩&GrI&3QDRl(!*@^/ _4k[-ɸ`8h+B h36`@9Z Z\19a`! McZa "s !A _kgcLM2m(qᄉk9+Խư̳ݰL9 M&T+Z8w,p2J2I!ܧj+X*J!'1[4,H%ROT"-*XqgcmK =`TuPI Ŧ k %5EUeu Rh!5C~JҜ+r:*M' B-.0g؟Z>ot$+ , 7] %(9:5#8OÑxj n(S`uhT+6%O:m6: G*ћzotPWs0ZvH\W?.dre_[l} |T>#M!c0HSR ()V6ˬ9H5 '_VJbb~i@\> (:Cj&m %eh#z0.PӁNXˁ(;=~ n(Ơ֒p3Wr)AřqEB>xy-TUA R!4ګ%GsV›&6 NU$mҝ=bVՑV0? Ј4W@TR4dyp}rRb1) FE]XB7 +ӋE'vP5&$ȭ1Unca1i a1'".SmhyD1ȱt`DiE=k?+}O #QaN0hCx4RaB H۪% _EhKA؊4$輼4o8g`6֤`}cɷ| ½D7aGԬ~\ 5 z@wȭ$lhvpxy`x*U-S:[ټI !(U9^ຍ7,4o]_. E73˯iHg hχ{D0da<>3= 0w:; 7kK?+3}me?La7P}`>؍zR/ 7$ײ;Y)#g~/BRI+:ճ!@ +(0<R!! @SoCUH R) G$!̛;ΠB-j(ҤJ2m)ԨRRj*֬ZrU(Cjxz0'@ð!a0¶z:G!]@wq0[/Mka,$ a RaAAiڼj j6ܺw7‡{wl% #ҵkV@ )<'(=XL9pN)t:e VABG#T {0K<1'8IizӁ|k1)2-2RI0[O.a7wK'3A =4EC+ %JȤ3P+H6CFk5]{5ql3}6i6m6q=7u}7y7}7 >8~8+8;8K>9[~9k9{9衋>:鑗-PSD\:n7'n;4V=Èd,{:7 #>;;; `M&#H UO-O&pG= 3[֧ؿQ@p(⨇;1p U RTs !ɏȠV%2y'd C ׍ I(@D>N (M|#+יq0cI'yC`1l 0Ar(bx8xIp$td(!"vRwq|%,G:$︥[p-z@.hcrVD򎇩%82%X{0Q!ʚ7FXPq(Y(KuqY\ȣK|`ȴ'C C3.(SnJA!s ӉAy56AEOH6^-1a G'Yv{'XTyn&07 K !L&S9T!ͲL0\ɆĘ=l*B]*ֱ 7gS AA|cfc3AR q *<|0-ŘNCtkjJ"IB&3YE]{Hʃ0n&*ͬ[Mvuya( DU4hdbxnJ23 B([#mNgQك#It vLQ^glm\9 DoD\uӇ%*ݫ2cKa/}0&^ȒAdX\UTu) &E/6Q  L%"+7YǾ>2S6TXdXbL uFH25.ǁ˦e.ŨYCL@&@5g!@KqMbE9oI340GHd<*wQ@fPL h(miLkZl=4ALH T6Ճ@B$B!|-ag4 p䰅(ȑ$ @ƇQ{nqGyPtبHD Ct]1d^z[J/eyDUBm (R;hm(b) 3*?Ϸ2lV]@ԃP`RD}]RP!]GTQ\=(֥J `݊ GU EL*qE!@&ClR=,C@{AQCa=a1Ѕ'1TJ:,A ;`8d Q C,A<6;C< 8CTzb)b*X(UC4#F"m81CEC012 `V=G AĈ qF`C? 1lFm8a0=L!!AĊ40+tX='5!}]͡?2@,:~:PI,E"¡I$8DE^2v$X$QPT==@/hpgVyf \oʼn)eP@ C< J dT!/$=TV/RXGOPNA"Q!Ĩ0 [ ĥy^r fiB=A#C8ƌՉC MjD\%V @ʹ[If\B=BRa"b:ȅ@"AW`Vf`"XG7,d :8;ʑȉD7P(;N޲ŒhuCX]=@H.8٣ɖ@:hHA[ȳ9EG@3 T c=u 2CB4dI2+rEtI TQ@N4DFC@K3P=Cgql֍EXy@LtVo<4-߅0̃;Aq!G8h(h0ؘ3G`,KX|1D tuR\W2dP pa Avj6A0SX0D^30-LՄ\lR /D67%E`mv4_gsuWv,GD12Mj2Ly"z7?Sd9@6 1Xu9|vDޡ|AZԱ I\ԙhTR`3fJ=]s (whצ7AVnvE'ٷ;PیoF}! lD1h@9AwD`R@3K*b2d`Sb1{?]ѕH_] ju㌔Z)HB.Go %,H92 _E0I(yQ`wzShKƇ3Bl8tOlDj|yg9H9r'raSD&Š3tg`AZ2xSɇ'QMXƌUx#"{у{6}eČ k5WU50 #G Њ{m{mF *,l=} 6ӃͧTփ4s-bCOXKHJ-(Je<ǫ2>g>O|MDOEJ{=|gS@]AZ8Bǐ< WXgFRN՞|>Ճ˞$l'|g=f7pl ύND~wDĶ|Gک//DGCźVI=0n }ۼYvfs_o,?4KpZDX#(nLqfӧQVukׯagt8wo߿>/ #)'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl!P  1PƀF*Dt㉅v YlE@K|Bj I歚!v4q&#xj'rgiDrm'JGIɰ~1'9I)S쨤LÜiʓ*xGs耋cB&qqGrNKrbp@pX7S-iP]sFIp%+cu`3%\em'4''q%@Øy !axTA aw4El@vd* Vzޙ) \t`yJ9yAy IUבቨ`8,(ggYne9`WR0F׬'HSw@@ 5YӜyAYMY9(wu>Z٤9HzlP<*x&0-zzY[na0AXr9 ƩGX̩g$b00!otaz+\䡩H(;\!*.Ҩ i:s>Xٜldjzyɯ8"t6h\ب (@]2(Ly!? Cd o~C! x\oe@ Sv \n&ȝ퐇OB.w'P! AB=FO}HW4#"Ww#wL\f'!Ndܢpԣ 8-!}&l$Lj]ߚ&z2s %,XCAFXl(AIx M_@!I\: Mm.!L=NqL `4!*SQ* *I lѕ[4Oi!̕:qY+,AjA -!YGţh $9X6AR!&ynR& ;Rb)^aa*UJϖ2kZAI(ҹ!:HV5A $+XpQ¿Q9Y* #᫔XJ=Ve' D62km4zE6rwp4ldxgę<94ICU uE*<,U 2 0<5iC 2\##H}G+jDB±0$MjȑhHVhْ8A|uёB ͉YТE QakYe%q׽5~la6le/vmiOնmmonq6!尤CtēN8 y˻1K_&ȣKR'%ġz#Drf؊PD1^ uW&wTyP&K Zɜ$:G+2~y9>'JZN_ӡ ՙcW%Kh%(Ub';TY$cHpt@'>VuF#KZ'KmT!󛔬{Hu 08=$GI1g ` &&b5E5A&V~#&JozثI/Pu8B9 +Q]WүlG'h6zZxx5 `-D pCa7XiEh8L!|MJŽЏ!bAP% &0g0Px`#4*bʆX0fm+$4*PMr $r͡!(z0Ilbi0&&u&" ֤!Fkʋ )BpnAp !( p _! !d0qDE@r$63@!!(@ͬ GHFPQ$e8EH"8otJt؄ &v!wXQbi"bqq$&yv } 5aPcR&B2+0X!.8 d!FJP#&5F1W( &BZ 0) !G"kAQxBl%pq$O1iB%E& %@Zڨ(`TBĀ~+0 򡦈'R`l"h"J pN(0m,+n!2RRV#uw%$33pR*XFs&3A7nAv~())Q*+!‚> \p!%*K*RMWR " "*t+ "ds6A+ir/s\q02K1QF12q1A< RFʑJ@7fꡠᠤQji1J梡^s! "ls"p$0HPꁌ͞PA &ʡ!&&*  sE+3%%J iR1q<-~!%\JʩSGat" F"z 7„(bTG J MI!\d"J9e$r@I]D3"N]!XtO#CIA" LQlTkGgRQQ &!+2BAo#GZ5#XO1Pnؤĥ:F5fUU%Z0\+U༰EUuMtU.!#2#0D´4x@!KkMu 2}lBcc3#4'h,#@MiZe]v$lMBЅj$oQ!q&q͡mlbe) d`B\OML/fr3'璪p6tb\*lM܁Vu!8aIMh1lFBuau_w"! 0AN"V$6OL!,("ͤͮ<9Hw͐_lbN"0"hq6Ɉ"WOag8Ew" 4#: Pz,BXWu{ B&q%& u7&2mJ8XÂq0Y[3>c]x]x66h8Y8_a[b azn;ͱLުZUǻ9e+ "2 Za6"Y O ;}g;@*A_$G_b ꠩B?W@FKc!,\`#f [ <0… :|1ĉ+Z1ƍ;z2ȑ$K-Jx}KC6"Lڼs$4@FT R |'oQ @PρUf=(?j-'4A gDK*֯!@JyքY &a  hXN}K)\Qk7լ[~ ;ٴkSllV=VbiCd)8w_]}*z:t9g)g/Y];w eq)\ZO#T?O>%D`,n 'T>peW=^)-Gb&b*BQp1BjktxӃVL9\&@A -)T9PrES I ѵHd^O dBk$c p r$+NB<<>!DG$c> iNScԃCfQzDLP0C#6Cjjoq J GikBBABCyi> mҲZC/´ڲB?ԹmKn枋nA ` oKoFSqo pL*l /p!,W!,Rt H*\ȰÇ#JHŋ3jȱǏ C(ɓ'G\ɲ˗0cʜI͐(sɳϟ@ J(E:*]ʴӧPDSիXjU$U]ÊKY_S]˶۷p 5I /N˷߿5疬KD/+^̸B8츲˘B&,rϠC Y@ɈG^ͺ5ҧ=MmMͻoй)MqQbйyسMܺs^ݻc$ؼ#dϼӷ߀&k.gVhbrv"'@u(mIH(eb,(t .hR @<d!,W!,Q @/D X/m~HXD5,ؤM  fPƍ;x9L,)PB)'F! S޼ STN(a0# 9jʵׯ`ÊKٙB0hUk Si,^=z%tkЈyE!t-[nM[kj̹ϠCMZã6) 'm;L2!dޚIE\j.JじY@8qC.Mسk=NOs"DzT;>(;A#rp*IOiR"PQMQ- ']x5F(r8t)idtaP"P CQKdN=(8_A#AIUcc N= ԂnX^L6PF)eKy ;3No !MqQp8d(  F*E 4xQ SBqn34 ^Rΰ::tPTᗆo";$p3ٌ~7 zyNmQ`gaƈp 'x3o-F|м qC_!E`Sz`ct>w$ hW=F1&@@?GArPΤ4!V> e*Ir,0'0$PWݒuBY <6 UQYlD8H1O7YBa9`4I(5A(HX9WҖT%Z"cC\*<8PO< f(2mA|tHhN40<`itV_6܂UG %ld5<9pW\xͫ^j dcEN1zby< |U2Px*n&g-[#`U锱a؁`*;<ڕA9ƨRm )Fb^ PHe)V `z&A*BJ @VMz׫|bāa1Ӏ88V;'L [ΰ7{ GL(NW0gL8αwȏL"ߑ ct<"X-#Yh*D*TGl.{+e;Qj.A*`"n$1 *+ȳ҅U0Q lBˈNMlÏ m"GZy5)b&a焈 o$ 8_"ac-H@!N`"BPQ,B)Y_s~SF֌<8!ڭTQ %uzTQo`խ>Ճ>bHPdBf߽| *׹vxoux `ؒuaIp9:9 q쐃%m=r)0Cec愎p3;wN{D{@!;qY QHZ P_wPdѽ Cj{A$8|/ kDB?@:LHȡ#?|W})U#X ZY@)`+7z`gΧv<AW3~wg=~*Hd$e{r3e@8G̗X|!O0$P2C eqD(|$t.*A4j7e뷂f8d-XD0"QfA'}xt>x|{5'@DcʱK ZPP ^~Q=RX}EAp'Eg_qkHrQfPX Ic|wH -P@E{KUYiH/r[2GvDI$Iuv]EВ q BkErtar]ou C"GA PH6 4:ٔ >  $;TԌ[)c W KUaWP\5!e$0xZ%yQ e}AQ-d-Y Q%SZ1F-+s!kD9#NTBUEuGUI)\ a<@6 rq 0VEV! `a$e%[hVWA Hib q qH0TDIXYX-) ]E&ZU@6EB [A[ 8{%NpY\me&e#ٜ "/8@ؙ4])im9D㙞Yv0$g9f3KSٟd_F!Yz ڠ:Zzڡ ":Ji%A$  1N.zoe2 Ne+^#q,q Zvh)pmhf30~ QV\dJg|P᥾)i '0m&@v*{!:48:rO.d|.|*Oԩ0U+@ QPxz\( yAQ|@aQA*Np[Y]|ЦѷlQV1Su)Щ%lA`B0+F@IE;s33 1?JIT|L9PA6Iv U6hy21i+mG!ѿK|i~y40Z,+ UsAS Q ;Uȱ(ͺ0\ uE pK@đ, kg L${@<8\G<}~*W阞w>^~ꨞꪾ>^~G>>:X%1g{}Vх|#0=צS{ƾkZ0sajIjWF~>&lFliɆ#O? Uze)V6n4 ~y9 'q rur na;q !7~VתU)q{!Gp4'_(,NehI,Aq:AXqI 'bL,l1.>a.\@O7\к^$ݳ+Qp ӳ4g/Wv47GG}.3;3tggW _~,9<!75RUg__ԧeHgE!8|~ mR_BP'e q.(5}FA~oU .QD-^ĘQF=~RH%MDRH#뽄)"HAe ؉pgO $0D`xfb +p@Nfq"Zԩ!-v\q-dv^}X`… FcK?rSfTo$HvBEil]U=qis֩]}RE捭Xr͝?]t+Y\{1V̽*B [2A 77kB9B,Vu,i/9|.5co>\pA.B 'B /0C(G@1BE * JqEt#3hdx-aLD!)Ȅ> M1A2*5K/3L14ax RX*A>SN: @yx*?X` B4@ hGt<- 2dUW_5VYx:g4_\J>5(QZϠy QeOZh+!+: 0wz(QZQHyvU duV}_S VmHR1CZSapd g =aQM_a0嫨!_KVHfxT,`:h,.pP zJmi:!eAg R1ÈJq ߑ̮힉fm߆;n0 F2 { B%FYnG{{?|'|G?}g}߇?~秿~?`8@ЀD`E}dE`O"t(C`6tPTP@!s e8CU%|"%`8؀ !x(#P#2B.mVa8pbyBB=! (1|B5ÀIU%1 &"]ljhr AJ.܌!}i|$CCV.\DuE?Ҕ\6D 2hȇP>I6z聒KܑQR!02zLDZ WMi&(pk1t<g0հAV g<1aC0G!"xx u,rTTT-BI:!3r`"?jlԤϡ@8ޱw#+zAĘeN"7v҂&!)pAbl X6Dh( . -rQf9VԭoK[p4C&>waSptW\g#7pH-AJ &61tꐯ29ڎϭ Y Wֶ$\o*:0n@AEWQ Ax\dBzSQ@Hsup٘;4ۇ֘(BKf͵|Z?J׾"Qn|F`Xg۩!pxV)p5cA( +WஊT`"7H1퓜eR"}h{c|ou<D#¡8$8A^RX`SQAPrGA\%.!{(hb^3|UJ,ͳe[wGbwP TįÄI0<At%z&C|" n`s45OL@bOS< B$%=oNxNx3Yy%1jʔ]?EJbԼXZ P+ދ1FmGт&oZ)`H''g2E8q&o,(Ȅ@H,BخhǒL P*Nuy;lHI+AH\J sHʓzGU"[qɹ%zX, bɌs@wrQضx13"∽L⊔JJ'fd N ,6yK`KIK wp2;3 z ڈd)ÜHL'᪻55'LI@4 z@Z31AD)1z |̪е'1TP3lK+3N4 `#KIÈxTP O(R'̃ P'XЗȴh zQyMl5]5V8Kh.w p !-[=XlKbG0Ni' US)L=LQе,(4y82 8RQz;Dp3ϔC8Ԇz`1AI3ͬ4z@ Hnh8(U}&ᐔzK5lJ0#:@Efmj8h=h5VivX IpfDNue61W?e3n&prA˃8Xp>Di6Y8*̌Hڥ1PH|٭ş{M>(DET۳cD۶E 6۹ۺۻۼ۽۾ۿ%5EUܣEduLXXq184_=ڌ ]Eݭ\T CEHEȈ K"xoE^mGh7DC$PN%Z$7j^Ei޽2MEƧ'X1.iEHZ D؊_5_ԵhM- Džax`x6``*ۣ,@? 4z@a.åO(]XLATh a*@[A{:YR:OvGy˄'r2'Huj'/V'v=Fbzw`z@6e+P*<=e`2szhޟ7zX7 *u  P ]bzÖ*ŗh éUVd5fJ&E^{X@&dÀ]蠊e f yK;e \]+:.Yc¢* 0]y+x+2O yb]Z62,p~ qNENy8J҇X^{KfMR^pXxM_hz(JcP DK],J?4.ѓ#㢷g%H] !_/fr$$xz8jjAꮾ5`O(Pn(z 5xy@pϠ/sI1A~^Xzx3[| $t(+g`fA耗͉8v0R`l@T>,xiϙ000lc22VLl $K 1ԵVcVBS E 42OCY8-ꉠqpcx 4ᚋ>Pjj X)51qN!ώ3cƾ|zKV9G:s \f"@w`=𨁀 i`'g)|K.w79n3rXv32p׵S7y7cRx =HM 5buzcIPA\86x8'x J/ 6lD:p69 KKl5}9};M|\8J`z wSSԪ`cP`&z8qKDOVh WqY(1 n6a?~(o%ƻ]= ^wM㽴[R iwsV;Ӱ %>Nr-S\|4R ʍ\!ȏxxse )Ձ)IhORH w=lۃC0|N,={a^M=og|'M0ڈ' Eؚ?c?;|sZN4x/W[ 5 `T / $ǐ͝~%AP',h „ 2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w'РB-j(ҤJ2m)ԨRRj*֬ZrI+@Q+,ڴjײm!ظ [R,Mqի7,W+*ha-Ċ3n<5.عN.;JXɐ̡]=z&]Јy}Ap胓u7‡Ν@#/gna wwbd !dOuͶ@=8ӗZ97R^@S;hT+}rP~`&9pW'ɩANy!! <6]_&bQa(@e&AAUB 4B<7"QJ9%pl0O<)23-1`D8"f})@ \\靓&KTmjklCB|#ԓ %(.EAw2|1U6d=,N4AiG:ֳ N4*ya<<͉#,c)KȆ5`A;1 jsЮ DPXQPwtW+ 4 Jn=ŎHwCtyb.,`A8y3V.g},†Xo F(pu|`Ad5@"1C\,bAÈSʡb.; u Rʬnp!L[?*ԡBYG0׈;3n@itHVJ6X (>oXlSNVn ;j 莯H@bFeC*fQ P.K0}6R 8N R;2 kץzP>l@+X,Lʃ -s12ߡJƫ@-ȣ%bոMC( bDɃ>0/zM0#,2 v3 sò;!(~1c,Ӹ61s>1,!F>2%3N~2,)SV2-s9>J,Vz&a4_n~sC2e7))XP"AjC2p>4zY)q7K"OP@ShB?@4h(U#HPs=t DIH )ȅ6iP*ހ Â2.b p9&Ah;LBkw V`L ԇ'k -5=4!.w B6MQVPeCȾ]b+1 TF/8y+tKŽy)BUT*qF= PChl}#>:R@@Szx/ykCP!s: #Vqpu;';]$! XGL#4 ׾Jw V1b" "Vqj|^$.AoLzӣ^ _Q۰!3H J5 T{-WO6f ZR9ZExܮ7/S }uѱ߁(=`@AŘ@pT@T:Ճ~EB\p3 > y\ \)T\ %}ŤE7%RG`` ͟VX( \AHױQDU:Pc)d w[C MaNI1# @aR ABu$<<!ua<<>;)L8_fj8@dS1e]Nd5qR H.@D?NNbD54SV£<@;0a X ĀP@Xg=`'HCt4GJ O5QKULOMŔϼAPG4Mf^pzS~9_|"4nEt)@SCHy ddP]iL=h_(A|{ A|+Mq @@piCÇc5@h)V5VI)ބi](EÀE9ԤYW(B=,@C.wă*d&D_whv@ @ ijBvIQs}P D8TiA\W tihq`טOM}_D tABG}_@R5A"ͅdJ~+++TkQ+K+ƫ+֫+櫾++,,&.,6>,f͸F,jN,|d Kp,lNkS@[ŞlU\jl|+>ܠkBFy,*FF7CuQ0CЃ6`%ҬV*ZE|bZE\-yEe"^Uun> ī)oOQu JC! ,w D$91J8*0EeA!eGAP0ݶZDE8/ rĀ M8RN_L|@L<Ȁ@ԃM.-CОEBۆGC )BHpEhPEFA_0! LT R@ b_ LAB=põAcZLD-uFDS@\jD#?)؄BoE1FAP2L!@ MUd O+uَ/R ɪa4 O2/r  M([ H:@**3K-%+אG,'e|E6O)60{YRN%tA\s6 @rE3E|3IC:$DJ;ː 3VB5V4(S+DA`_$Ad B=Aj2EEQGET@4F4WL;P)Q (Q@CtՃj`$ni %eP @g^{CPtD/(2Bx:vA(L=[W_Hh @cvOj/RKB Ad`dlȐ 0=t(O$+-F¡*q zRsM P)i"*K' $J̤;S=O f'esƎTzr41ժAQ# UTiѫz摦\c@7ːfH 1 zđ(Ȕ֋0?mgVi?3cJPZ|1ƋwȣE NiA!XzKxpkA.璫w( ¦Z.`z,LӀ > jI.QNY#ܩGm@o-bxk!3X/ӬᵪAI;z`@~j9byӁؠV'1PҮ/ L(ӦgN턨k\ /em9,|@Ԩ;@aϋ'~&axqRp30JJp W\'zL* ­$\t#.McAphPy* J@ !Y/Mر7rn֣R.h(xݹHH Huq1zTvI]2A "]Vx gҨF(&aUaa'=!q\"&eE`G_?e 9HDZut#Ks^o 9asr5 bhcrnQw #;#J81W!IIN}@t#bt! )H @ ,k"dIr4h2gB<A_)-oY=z41Leϓt3MiN3Oͤ5Mmn"=An49љNut;OyΓ=O}?P5AP. uC!QNE1QnGAR@"'MJKͤ'=YO,O!3ŒP{dTЌp3(a80q0&$8KED(P 1B , WViP=u@(X!EbASh} #&D"$#n #>x'|I felنVo?D\D^=>a "?@e3[6] !+Y8& 4H:l 郗 ^$r8y!",&kz 4E,0.!#,[fEK LGoyaadsu\ K;'.ůO_V6AR!H#VPΩx)U> *7Y0Y`@6rnj?2VLopaGPARo1)Ja7(bQ8kSq^-: O L#,2AYB6pbV?HA̬kԵ*2|`EVCa:K*w>y1,(A/]YP5aq cJ5etiv$MsX y`W&1ԣȾm8è R.|PךY6s~x.qAt4B"w]qj%9z{Ӝyy#($ ZW, T rà B 0l`z@0i^o;xR|xqq(b1n[vHD[J/y}sC\FQgSlKqY܂_6 `B?DhBpW1WF(DZsO"u~$":%%}9XA}5bP#zkpC1_NB><,C뚏t$,0 f#n"'dTBT'HX}b1.&8 DA4#*.@Xn&"t=VVO . ,2Pp"l*~ &/Ec(@A*" &`8X: v#d!a N6p #q"$e=J )- =(f/P@p"ipqX#$C#BEj5["  /8onF" %'P.cMn ?;j¡z( "LµT Z0N'uVuu(l@ H G nIvSX`:߶G{A6'! Dq GNR!CC CKʐq'bO?K .~b)"Ұ +ab maV1NNŊyYE! „B*RN."-Rj/Р@!* Ӆ0o y1? $mX 29 䰀H183>,n Q-C">a P,"b.a )!"$₸1ϐ(N@ψ1&w1s(SdbJ"1#X @'+ v&'3#r`"tj."?- N$$𦪳@ 94A4sAAK*'!tB)TȱB14C5tC9C=CA4DEtDIDMDQ4EUtEYE]Ea4FetFiFmFq4G)PtG}O*bHHKCT3Hx[T@~J]"H-*K`"KT4@@4!` !OS KT? aP!2K!U#@!-AM!B\`"26S?4 K` t&!KLAJb RP{  v!R"hKlRA.YYK4aPP[UcuVA` TQaz Wb]8@ KɠXu=³fP+BTJ aAaqjn # V$t!!*[F`UVL$4ܴ".@ UdK__ǚ ʁQ@xajviUV 6ih T`K4̨jVk-:e2A|A Z2>*D XaB! v* |!h 5mQKqD-Mr ( QW B6s9i1Wsks3wjI`]t(t4P7l[N(^bmm m b]]U8 ^iOs)CburE- QAi!\A6!H 7|$m!LN$ dKqpG.lt7-x7iw.\`fZIm2 I\` 6FEk洱y*}bXW"xo'b+iA]]jS UuS 25nVHZ`{U2ALK& f]4G¢z`Xx`NA"JVIX՘"VTa 7 b 5dSVUn8a|6V 4`v a D !"@S#O  ødU$WÕ"Ɨ"Kv 8ؗt.wU~ ِw[8\HiCY^BICg5o*Uh9o"rYLϵaN9/9(K\}!o3a \+tUݎD}e[LYC g.6yKKxakyw.p| "^\@z Ƞ9`P3M/x8KMfhyt7@ /hAOUz"b` nz}LcMeMwBy .n|"BBx @ ^%eS7!K#@AMSWAq n)47z%\Ϸ HKYX |"9NTzvµZ!]}7FnKdᘀgp {l1Wu"T6\U^2&gR#*˘1:-W2zQK k[*N ^`BWrV=em4!r*#\C%Bf;E@+3%CXM}|Pzu|z`CV@1~Lx)"!!i$k;(*܆˚"5uU491c9Cz g Pz ΝST +\ɠTu"z@ "nnJͼE@E%41=R9ӧA=5:IC!,W!,QWH*\mjI\˼G1֋tNkνÓ-2]=7w=޲+5O~dz(S;hT+KrQkG\UhfgA 4U!PW)T,&PN+ :,c\ՇDbzD7~RKdN=\$bB4K=\dRcN=p`)"UӁ4K13[Nf1AK);cm@+3;``K J\D0O)239U!)BRZ$` lj[$>HЎ#i[ζ-Um{w_-rNvMzη~NO;'N[ϸƻՍ{QިjG$00H򖻜C"'ɍB896#89!Ao8c^rrPqu[ RF*DŽ #-A`iR=Y }q'y\؈Xad` S)P%Fҋx(`i}4+v $I@3[vhXw}hKJ\b]%1sd+}dIw#BKтt萊(G藏$$`U.ŀ*Y-Y-@@9?Xo<5 Wuؠ~D% Grf3L'l%*<pTTK%؆REc7^il k&'r2Гt3xu&V:tvIfyה{ȗRYWYUZQY"0JjHYИqU*Q".@r5@,&[SI,逗7v))wd{`~``1Ӄ.PA-W"@a% `I!<}#yv96fQ@)`3%Evaihp #T Uqi`{t_:t9QkYPr2BPx*)*+ڢ y3ZA% F 9;!yAJ$zPY]L6\ڥ520 Q1eJhv`hja^:t:@G`6q z*k("Zz+ahqFQک:Zzڪ:Zzڦ PWQ)r:&K-A :P@ aGCĚR#<.@z`pswҡQtG5AYJz ށ>ʀ\&SݐQTxBf1 Y)H}p H/Q }:wGv f `+`$"22@hA#A*[Ukz{++$ f1%"iqhZ:;aA"V 1'lpa+ V LJ("1# iX/KQ cǵ:Lo#Gy`++uȵ.abd;[A 0,@"!@_"VI@a1}60S/vI̔,%k1`!e*("I[ :#=.KB_PW,?ȂV0U2-p !C"6 B? mi Q,[xAo,6ѹ*0 aBAä#mf0w 5D;"R JQc 9, 6sL,D(S6+ZL&F?#V;9Q=@"5"˯1}pwq+@]E= NIB0tNJy8[[Ŕ,y?ņ(NJEeLN Ji$ s1a?J, /bLԆlG<\2ɘ"ID*&EЏ4K`3kvKA Bϒ{|M,X<\Ϩq,*TQgΜ+ Q#mMA#??R P (:6F[ȸGYQ>!v;l]A< Q3,VPLTr,0*Q\ICUSFoѹLQsqu`Kؗ\Z`%X @X2"TbP%̉)99|LF2 Qۢ Cq-h%Fgkg*֔d fV%l%5,}֛?]!1?'h,D%b`A,9LD4Vɿ Jٞ]h S6Uf{t `W+<e~ 9V3K! wJ ]Jv JAjxj+!3\a"VP(0iqY]\? 6n+ 0Fqt(jE~Nnq0 @ J600\^`b>d^f~hjlnpr>t^v~珤|pOΖIKa >s( z ڝ+>Ձ y>z驧={&We1  \ K#?QjTz^2^   t;I )"H% ^p"0bb#騇 t1< aЇ )z|BqYThP 01qdW+FO4d(L0tЄPa>ecNBlX 8cQ(AHG;D.nD `GB & )BQthA&Yvғ cFp#99R!Dw B~%|@G3a@l@ $Gj\ xt-:7›$)H&=9k*$eVI|+h$BLH``iEwZħ9|TF8Q@{+hb(AAH|fcRȄ!x$)Cd3 TPbI1&N zLh9Cf!&#~ҔX V"H5ROVQ#rhnzQXjDTXz`3 ){u\M(.䫷сy$@|;(RX!2eN&S*""E=!$ ]2іvj:[ڶAm:C b Bmd_,@Hp 8-Q X5bVF'gA{ yB7 &}T;JG >{: 7A:0'd\[ W;H70Is\9/m~Iz[{ aR]kF"l̓ 8eR(pbMl,YAz"+ V.J%ty _-f6W' nGA IE igpbV4q"9 ѼoMőF1!2 ̌gcL&D}>s T`F $D Ȫj:mu z)$1ܙ &>r@f0Rw*50am[V:)8r3#o{Z u=-#jA4 U"2oԻ>Huk/7qYPdl {HM W~3g|sa uEOۤ7^=R D4хHz8 iu c9ьhSr'Z<70Lhaa K:%hlMpWzBP=,'ddwuLj vZz/KHDچ~ ze i3bцpNZY*gWh, `tXt=\nشPI>Yn `G04 , CM. U?ȞƪR迁c!qu)7X=gz9m<ˊfI4xX..%`0,<DE>ґ#WVXf7s`ZS'tBVs-ŠH0'aՠ+ KPrCh$6>|C8}48C~XFI) 8 ?MNDKܰĈ(ODTyQ &IXYT[\]^_`a$b4cDdTedftghijklmƈeNr4GAl4DxC !G_kp8}48Vux}л;PXSG0g8xPLIyǐĿI0<PP#3a1-{cnHIGz4ʑdGtLJ@IIu 0fz pALꠣDK){,o%8˄KԈJ3z -7GB"-(ʴL"f*#ʁy/QyȬ%XEÄ' !Mi!'@yXrsE[p&+x̺d)I^3J7$zPx&S2甍b#O(I+M@!  Rp(͹m0mĊ3_3P2`]O Y P٧4N8 T0e` `0 mѯ"2 q%E92NcűDu#G; dHHAxx>8-, 09}сɐq87h7PCOR J0#3Ik04T H۪"12ۀNuԫT@`9SshB8-m(\XnI9IzX̄pNxhGfK%љTCٸlϓR:zՐY]*dŸl6s}IqD pxdVgئy6V.V;m%7W)Q =5)E`F`+@zpS9Vk1Ђ-V؝-t- O8zyR+&XYFBՙePf;WXEpH2̘78 T k㷄)ٷk8  /=ZrQbըuȽڃQÆEZΠdȤۘ ؍ KNyo[Eݟ:x8B$;"y(Pؙ sݲh\"5r2%}d4ls12JAQ" Kk2,i:կnpn_5wn=3x(ܙzZSD)v8Ytf8 @-3I @=S%aD LP9Y% 8 cII1 6` FtH Bmy6`i]i[ +Њ0u  PJ3HD9DAv|xG:8=>E;!buI>&mx )n<̨94xN*+, 5h6(s3jpRRuvo\AFnM88Xtxc莭kYY5poz@ X]q#qz ʍʢ : 'H>ȝ FՌ!i6CD5ug.NwZ60Y3q7-8PĞ bP6 ..jXZ'ݝ,j@ ֆ$b5jA/eքЦ@=4s7A/nc>ֹQYOrZ =u@.ޒ1#H1G/mޙN?z{|W biTd؀@>xQ`7q%TuuXuaQCdbwS1NE\9Yهǥ/0&lYwvodx3Y>;O$G v gi#fք^sulCg6s%ytt1L4;TEPkWݮ |xd 'IywE铥Zoz$9@P;GX0 {wi4] ]5]8X *`΃\\܍ǏrrX+7{>ci+EO?Ƀi0@A!wz}3l} ]?rYՂEhNA׀VE)ȅfqaV?µ]9s(W bȵ{#=#A 9$Eas4$M:$QJ9%UZ fy%]z%a9&e慤f&m&q9'uy'y'}' :(z(*(:(J:)Zz)j)z):*z***:+z+މ+VOcbH~)^SZ{bxlsQP h[WPSQ_Nn$ ߌC_:0O=h <0^&!gRo8"쓹\oqqDUBj0}WՓC2,\pwDH= SOPuq_A_}o=#N=8!@ 8DEU[lvaGJmU@PtpF% [E3 7]?5CM|+SW+SJFt̓NZSx"x%>&O0,+-!Mn"cBɳϮɖ5ŽChҶU+s; P)0簒~qR}\K^bSJԣ 髿$H+@A C>QRV!D v& <bw8+E~sz"whљC(%$ |ݖa-`?ȎR@Kh 8 axg񰇡r(=“o%¨6D!!כ BzH+- Cho%׹V"wPMzpVywP#z-qA>}`'T" ̎(G1q+O+Rzpc%kh60&fO*0G%_N" Jj*Kx  "#~QּfVx 0,$:ѽA CUC!T9i 26XI!5 h=ZЃхV'>ۥO`3͏.&JS[vMzVyb4jfX`zfTa0BIE(P' ĖqjQSbg2p7:D=f4KMxΛ !r!5PVho%J2059Xd#+ `%.:DV~A -F=!6e{@4UҶyA=QwP Ē= y*# [9l҂MFrXH-%0TԵhܵ1-9X\\em8)*ʄ!68D"KlZ@t#z2!8zRcNH넸XIOڽp6qdx_|c!z/&i4dho=vu# K|\' pZfaՄh$0øT`)EwPAZ+жYҠFwB-2:ԣ.SV:ֳs^:.f?;Ӯn;.ӽv;~;/S snBoɓB֛yGog 33PZ܊X-Vʳ>@ |SKōhh5[/GH҄CAst؋YI!zD zᓿea y%Gʰ @%3<~{}Q{` !Z=dGXU8POXN,{< 8HVADO1M:%(ZTCd@MCq9 @Mn 1zTD<&DďO vV=|JCQU{Y ьCtvxD|a \p}aJdC=_\\QUCO&ɛ n!T@yOBh! DQFCG%آL uQ~@ _7 pbnW\#‡Ń%D 9)㭌7)b=OD2@DL%eR6J *v@|N0Be8>4rdA>ӱU=sR݅lS7}SDFō J"VaQOX&^\9a]U(c^UCxdBHHC1*x`VCXuv TQ Jw~CHPJ ĝ!.--E-&..6>.FN.V^.fn.v~.膮.閮.ꦮ~D0"m.b+ZHbŕ\FZnVB=!o}-=8 0x8RI~0U . ;_˽(" ֖rC4(5p}A`S @:VF[E>C;ҭ=y"^/u_:.FYZ\p(' BjI5C;!tjW<#hBDlTrA}_`^K8j̓Uj$τp@C|Ԁ JX00v@փ%V @Gփ?C6$(t5`^ oK\XX=,E/0'iF4 <k**fDq-c- @bO2p=8BPB8DgD$XM8 B)8^arH Od!( 6hqh|BŌ&3=R;6m\MEd>a3MRY[%A2B51r(O }@DPi_b=bIh sV:e:w`3<"L:x 4D #wCP2I0#! D1o)2Z3C,V!.5< DJ̰Xp`ƃ364M{sMWK @9@ly/` `'DEg`$%YOT/{0 * EEVcQ5A&{t2CN Qu C6Chc[ص']5AuXs5O\ ua @@}BOCueOLQ@[FI6e_u[4,3h8¬ 5FaBC(7j'bR@lG4Gmv06Oz i` w\7Z`UhByepgfTF  EeKx^P|<T&&s snZ8wTKD;cS_#C*SMfC$xq/[c'zyNL(N|@C(&IE\r(|SkgUB=J`TaO:vJp#seDy;(uIsc{0WF:DDo5Z$,@t@j,IrZi=Ld3GmE3E@`Ty@ N^ 7PÅDřnLdE K͉ď eˌF@@Dt^'V4j4+ġOyVX0z1D8Ho;ZYN%Z6|]GC ƻ*k@H|cB@mXZ`KZvjhN{GôS,A4Lq34} +I!h!<$%ŠVo\;CR:IU(ERpe8Z< y?j.Qj+)G5A ӈn8_Z/C%'h@C!";p vp'ю_B;XfDÇ|4[4^/O<~\@AoE qo؁ 9\6A\J@`4n?@P8P@A&TaC!F8bE1fԸcGA9dI'QTeK |9fM7qԹgO?:#AG&UiSOF:jUWfպkW_;lYgѦUm[oƕ;n]wջo_EqjԂ>Rwf`ga)*/qށDyzVb |1A@iLɂaEҜLqiA ('R rJ=ȃĢ@1<b;0TL.3仨WVk,8Քzs!a6sbLE"@Y Nx2 ꁆM=b(88'#.i D=.D8|ƀ͙=RAWͤj7(6ZV%ӦH)JUȉ8i+H΃AH5Qhe1FЁ[-(VQw4zG=<[Ը eImbTiQst GժcDȜ̉FڠAAĀ%rj;PA&Q 5yY5Q@9qwjƣ9SnͯKq AV+Z_hv髝ٯ_LA0GsL OB4DA=s$Ei szdP@6(E/ g Y=\ i;Ib9 pV2I{7 ڎ3e g>PY_߅PE~B "&diP ҕK2& iIAPpn!2d2*k yȂj@FAх!9Cbmia:>$PxqHvcdFG4fA`td9u2m=<4ѝnuh@Dnyϛo}p7p/ w!qOxGSdbI4d8I jZT#,j80ԧ2Ix&ϯ4=pAt@d+?I,FX)(dI!q~;YzA9Čuƣi5F"5$E+JHt7"z8Nu @2od&CَdnU(w3O%W.xO kA.%8d(b_2Ne!ux+Jȥ@^~ n:n[RDͤc(L'J3 q:eH=U!# Σ b8|*0IiD]j]h>`| e\z!F`k bd e0 .8V xAoY9r`[c[C]bk΀֥n`qJ.Wi W F`,Φ 8&Ңn&ggkFQ`/jȣ 㞶 ׬@Pv "<"U0 p {~ @ J> @Z`,f@reFr` t@ @KrCPJ a!Gr(K68zg~ 2stQFC( "1/SަDA;Xq QíPfb u`j m Ov$8*`qiG}؇ ac݇84!&Zr~ ~;qbA!R(/S BAM .aq Cbb/CT鋪,$^H12O " 8z8Ɯ245*fb& Ta! ,GfƲr N/Qh }B!R|KZggm $&1W)d \ ή!.G C~AiK424C4(TS#iLJLCa}6jA7`j.J 隈3ΰPe` !8r5= ĞRIDΪֳE'4( )+F J*!JYt  B͢ #&eQxB&tBIBs:6$p {m"L(j!!H\4N! _!Rcrg jMH+q4$ B;F j d 9w ,8TS TS(`UG9k 8dRtWT!& " Df8l+weK[NpP"QFaN $X˻r8AdKSUlP,Ql!^e dvAՃxua a'¨8K W l[a U?ޡT9bC   fU"a)Vu6`8JaaŖ0J8,#8g5̀q ֡ R bL4 NV q nt> C8qG,A x lV !>-ĮrDxW|f "xmodVtvW5m -7}׷|ުm8-b/~W݀ly"7-/߂M%x)-185xt=?xEXA=xQM؄SwK؅eXlagwCyx=u1^z!袈3 `$`V2؊g!| H/,/4 ^\8bx#WTX 2F8!hCa|:7#$ (anAn 2@ fe !8 B}iSB)i1Y`r{W9znF_R~1 횠 cF9+l$ّGY*ܘ ,.Q 6fO!Y f\ ` XYfKMn>ҙ(J$6~/B @ g@`|2! B!b$ a :3 ꙋi !X2Gaޚ49f?AifX: ɍ{# 2H  Ժ$yyfHہ9zˁ& Z] {?!ܚ<{vM R ,_ p Vے)`c?@ $@ bv[g ֠Ȁ/AI@'yiX\ I92Sa BOLȿ3|9Bϛne@ ˏqihe[&\ BA\ᚙ&H j|9 2 $@a\&ܜ\ 2}ӯܤ "9ܑF*ʖ2)@D <@d>I? YeBaXf43]&8`[pNǏRAa>z +TӇ} })@ě=&D9BH x5A:>@~` |!"]:狞A^A]E!8мe|3(sk N298>!Gh䯜hk^a 9؋b諛!%҇~BB@*@P8bkn'EC=A02$8x"\xl_pF-0fH?&'VX4? paƟS Xjѭ\z 6رd˚=6ڵlz 7nܶtڽ7޽| &N& C6":~ y/H BLJye7,#sL?&2Xn,2lHb(3AܢS#G avViR/+'Bk# |ʝ #L Vק yj֮1=C#?rÝ?'&4Ă4ԃCWXA=aZCEPxMX? aC1>sDQX$B#Ն?BmQT9#>I gh0P-xOC@SEDN!Rtdԩx0f]o ĉOn ggvމ'Y8;T3ρxBj~B!ЉL蚎d >Pp s+167HEJ[險M$,+#!$X6o)%8)gdifQR;,A^m\Y~ ._bDmnzmU{` `` W$0BH+/WX$lEk֙]оron~q"\aĀ`@ # !$1q,d :M|UtJ/tci?Ђ%>[:HMEVc vd}fvo`lKjߍ5ow~ d *-8zxONy_oy嚇N!,W!,R H*\ȰÇ#JHŋ3jȱǏ Cɓ(Q[ɲeK0cʜI͛8sɳ”@OҧѣH*]ʴӧ3%JիXjʵ+T@JٳhӪu 6XkʝKݹmU-z߿ Wޕ(ǐ#KÈhㅲϠCi`)<װc,}:ֲsͻ.mܻț>\5УKr^ΉSνwbË/bn^~h[7@Fؓp1șf"Q%$X| Р,A(t߅"ȟ!ֈ@#i bs")"kEBi啽II\vy)星h) j)Fsgeub!,W!, % H*\ȰÇ#JHŋ3jȱcÀ!,W!,Q H*\ȰÇ#JHŋ3jȱǏ CI2$(S,ɲ˗0cʜI͛8sTΟ@ JѣH&SӧPJJULy^ʵׯ`~ͪRٳhӪ]!ٕmʝKݚo}W" LyOKA6?$L@#[D50M鉚9ShҦɄӰc˞}8^ ԴAA&漣ȓ+_Զ@e`N B ËOv SZK.ϾC e=p!@ &^9g1(mZvLyFl(ȑmDqE_*( 6m#<8cj5ac>i䇩};j&Dx@$XfYyMjq!dflbpVvqia!,W!,Q I(A$1cGDq Nr3g ^MسkH1˧W?gzMO\E]mwrɡ')Z x\g n'Vh/Q0,v;$A#~ub+ <<^smUDW _ %!~ҚtB:zɅ\Yt[ZdiR;æ5@8N=W$2RO:U(9ң[S&2eS/9OQN\ 'ZG\>hbꪬjR?EQ4-B4)J_ +XDx`AQ=FJ{egY##@<:&iڞ %wfB@ILO!#|e€K= @9?I E{B.tnj"%C< ~S0 MJtE)+_@W1VO1S$=61Ai#=:4LK*Krc onxuF'aD<nv#ք drW-^~*EI܉趪4}K̼͇o#x4<0 JAS^۲9x0I\[tgȵ4x:S_Qa@7 OW H+Z! l:V Q_wmD`Lr$`I[G=,q"]C&&+w5_x@ c *0O2(D RDMkג&k 5eF\L@֩bhOT]RȞwxA / HOH $5J5-xlCi녡RU5ծz:)BROɨ-bVuQF=qe؀J @Lv7C@'2:6/֢b @*[DP`cGKҚ<1jIm=Vگ vT=  8\!q+0#FtKfh@DxjajMz|Kͯ~LN;'\^UtC)Rp {WyN'eQmuVXgWuwF &AHTwQ ]lf=6l,gHcz|8β+NW"oY TSx-W2QcH+YTnπWʼ@e!|UECaniVz"Р_:h )uCd[xgqp@eVēCŸĵ@YENvSAPb:F8FIņy SP:=+pFYlC @r0v@>9}%!HÜPvxc6T7L̞A$;Ԇ $GvϐZ1a6.ףXl/65}M%A|0h\0AwSM! H0Rl_YçN?0x01ȵ;uxt]`O8qQ b1R(T> f@ .RQ@ED[I%3Ĩ_s-2ت[ ?NF%"vD0tL. ftQ"k2(,IyϵQMv"8T J*Ezt !5J 'K #E0Yu<8@8R6y>Y"PyQ`uU6_r8mDԆ"A6A .`>Pl8#sl80x9u2)G#P9](n&Tj\#R&PFQ\#`4JXV`! F2HJOUX񗗺pr%@@#n;Ca$9a5Vk-`E0Q y)XAYU0 Fu$BarhyqdoqSh:p 5cCVPa)tZVQ0sڡ ":$Z&z(*,ڢ.02:4Z6z8:C\@ g㴣D:u&b'JC& "J6[6GWZ<5!SW 0U\aNaq0``NfWQXqZ6S|3a6f0 @giB!g@g:}j{Ôqi*Q47z2f)` %A^oJ/# EZ2jlK&G0mF3'q#910MlGdA$1o|WuVy*-㒒Gj k&qW"U& %bNE(a(h eljS$:W%8 a)N1tEW/ ^4z ۳=sm3&G22qD%,W=*Ju`HR-!l.H.oV"Ɣ_x Yp/@#RC;&'#c1 q0j9B>Z$C&!|@|/w|;+!sB&Gl|85Us5;8 RKJ=_,Q'`Ci6mj T+ ¸Ѐ2cz;fQRwیc9"C+a}R Ĵ5cѻ#;JJ~Z.|& -YxAARY#7y?7{B`*BtB:-Bg/Ũ=1hxF[XEECQB\нcYnhNF:1 2qG FYŊl!^`$7cq Q o<T7%ɟoLRDKXDrK Y $=+)T$0Q|ȔBIr윒O9NqW"O3M9 ۜ^+dN'{%dy-gy,\$p-G|2_!:Nj#9 Q)S45%P \ lowѐ TBU2F=S˚;lSSx!ja #@ӹrEW!Tl J\)|Wz2 Ai^-!*Euf_6X{g3#\Ep}ׁ&^E|~׀؂=؄]؆}؈؊،؎ْؐ=ً=}ٿ%0q(&\ٞo!Hi]_J}z-ڠ6VA ۜAjPIr|RmSzԍ}P{Jm T 6X<B3ݵ j+fj\j15*u +>- n0p ^6m4l"Pg@"Itn."?1 @\0RGVn6an㶇r"!A&:VA*6}{5,P'r<6!9M&07G&Js`$ i6@T!| )(Pir>bPw.ǔJ(ng!lt0b!A>ZlJ^kJI@^ǔ xb6h-8+a+`w@^_k8.edvvX"vnwmvq!w~+3vjMѾ2_Q 1dZ'TP{qzW|GKf.@B}ҍ"T[P'@| n[&?_z'׌-M6DGΙ;alnX;5a?eEj.g+ߞ-AD}RUj5j /ɾ;q?arw_~O~<W-[D,6`^:_?W_lTSw( ApFSA@`ݸ}"hG'T(H_"z32 } !Ґ^ DPzJ+!@ A-^ĘQF=~RH%MDRJ-]SLI"5PQ7^4  3z1(MVi 7U7NEЃ:KT@:n&W[Ik!W^"X!Z=zUDR:1l3=MFZj֭][6Js fvR:pcxZ1V 0Xp^~U{G!O=EM׽_6To= ,`w[e 44!> <0B /0C 7C?LPy'܀ '6 U9(#J-@1xz zT4z.Hr2,IN'+@ǼTHQhZAHznHNzLz?D4QEeQGԣa0 JHp z/Bj 1Fw,t!iTwI㴞^Aծ#ٲ1rjj`&5'[ZPVf D H݄إ]GH8`&Hu(qIkJ(2n1ժY.z@HSIv9x⊩doza/kuZ)bis68dPhpC nX!+ʦ~ɥ*[R{ ;ooA@rFpu)x#pFo򲞸q00(0A:l>qYbsX=!&߽Syз3_~lsy>{@JB 0,#6K,R(i~WMR(*Rj?<#`4Av|5T@'Da UB0LÐ -"CІ7auh!u- ЈGDbOb8E*VъWbE.vы_c8F2ьgDcոF6эoc8G:юwcG>яd 9HBҐDd"9 (Yd$%9I00$B&8Xd긦%EJJҕt$H@X1Ge2,ig$,*2a#L^9Mj16ҁIB !D=Q1$k*@q#)JD0 VfD=O~fJ9Α| h@CV0z"ԓ;1pb \N?tf>O )'*eG-P 4LRXa9ܰdqs)2 37"܈K=jRVu{9GWt 쀭lwW[ՃEAE=ԕ^2 ?D J<#0|` **% dIf09:=|SzZw`%jNX$9MlAԉ ).OHJsVDaa@h3H1phpJf'R GFb@Nbn͢=y9/dp%ODNnId tr i6ΏgP _X=J'+IR6\_eDQvQͷ->pDVjCfע¹8(`zڿKXer?qNFFPPq` ȗĠ,_zKhOE6TB׃F6R=\ee d[鲳t * 4,cI2 hnV|z <PœxfWsW.p&DžJ5z_-(#U Pbv(!W'1{30txā~S)n :|?Gbwm^{BBNh]pz z/@I)2ixnp! d@\H\`Ӌ0px?htP Zc: ` 4g wjPzxٿV%sA!'BS0NZˑQ 2*P 1Y0 ؕwxq) B[[A"2H?47/F Si1VJĎ 01lC@#ExIcDGXj֘DV\)QoR[|]$b!'kEctgt!0jklmnopq$r4sDtTudvtwxyzGi{}T1CS9`TRDž;^Df*HB| b2&dbȐ$6 ȝ P zȃ@.X'wɛ3t@ڨȃ:=.8ɨX8PrHʫe)Uj51ѿz0*K7By (YqDHj]fX !UP1yMx2w8\́AX`w# ܝ|'yX5 yH`ySG\X5R,d5bJCK$ s< +0wP І\ sT 4@v  i %"|(Mcg9/0/j 5`X1ي \DXq@2u@ z'v;d'Q%Ѻ$wp>@MQ XQ*z4,z1x 0)`1y;;2# A P L]0Ũ(p,'zBv2K :;5Y Ӂ0HRv(BKXTzPXhIXJ.'!63Xߡ0 F탟 (NH`BU p;̉_U3a=PyH2\5:՜Ȃ2_;x5ʨXVzZOP reObe )9k&BXVX < X=ClhP>zȷr5Ub >pIv.7י_<}]X]EO#؄%@z8XH؃We6eTeƘX )3 ֘99sEzX9qh9-ٶ}hAڅUڞmV?V@a۸b PX]Zex۴%-Ȏ莇܈#7&w5鈶[;5]%0 L[[uCՋX zh8;5܃H( -"1$K=ڛ==YPR)[3_$ i }ݻeڃpTvWj =5b5X\q_q T_]锜@`Q& ?XRx !@_p"cƜ wLs޼9ȚqXt8[o0y0`a + 87˘Em cBz8k H>\R8U 7&y8FZ: LӡaS}!vY9,>d' 0Hj+ل'hƊ(SFʁ=` Q$ES ^ʞ`G>bG%4d^G`Vfvghijklmnopq&r6sFgqff  We" NyLf^g٨\"IMЃтN" 8qfpzEg}g )Iv(>iv:PI%  $ds".}bL~0 ɑY`tp([~GS\h"!jj{*HN |'qJLO89XiP*h4Іz`@Nz3fǜcHz7=**I*REllܢy؜ڼ͜b*l*Ƭw@Sº ĂOLk(L͖IC'H J\ⶈp146:nG`J16H"2ܚz-䭻X X16"}-*hP_)+os@<2,ʠ.򤔁@χOAXe<N" ' i] = sz(Kgvg7z(x5 vE`I:vsB<|:# \V;P:d6U!&DMR **v-BeE7vMK,h „ 2l!Ĉ'Rhz(p]!Qz(()LJWOI&EnXȅ8r|́l M@ajPkAlg3Š#Ůt {01n ޻o! 'hzV|I=G.m4ԪWn5زgӮ-`W滤Q(tEr^`լ^bëVZoQ CnQ'r3 IBe"kAyvqq;OpOFG=zA@֣AfS-AR=`YB$Am-"18#5x#Q=<&;,$ dJgIӍt$ gĤNByL.QLoB]oF T-DI$9$A";쬕_"P=#9(cUX=%$3i=T:P5瘪lpYb1;~;;; ?<<+<;>髿>>??BV{L &?7ٯ<`lFgg(EP CQhA$nD SBPF A)=%#BP ‰p+<"h$`ܢMA8AND9:cg<[8 69?T"x aN Ɂq]hd N!!hāi xu depQAdWy:?"EH(U6K؉@ށ D#Fpa-K! N*~dCtR1 \("A4-oik 4z5f1,f^8̒h2[;0UX<+Q=] c=5P pqVV@ꡈmS4[V K63 HR ʨ</AOc.³pOF!ۘHkw$6܌z'a1̚( `ʧf/2e,ꁄ(Di94AKRyy=$ulBEQE(П `=5ٞ"QĞyEɊ h^D@_(J$A@@|Jo AL<=^OIZTq HFīDDw64JoH%BMNC]. ѿ YLBԤA? =poP&@S!A@V=èČH$@Cב^Al Bm| QAP D8H1ۆ%)u*xM2D X>#??#@@$AA$B&B.$C6C>$DFDN$EVE^$FfFn$GvCF0"B/H$IkX;Uyĩ@VnTY+4博EjWAǠ| BYxRE<@@< n*xFRD@^Iڞ &e@LS.fQG4`&Xd,pӦL j=S=f5B^sVo1V%zY<8C^rN|Q@B= W pj7jΝc\bwx@ԗYZ* ~(U 뎖NC_B&djbD=d6ގ -ғA\uDΫQ.ǒM+G<9βDگ'LEflf1-0YeQ8ށ<̫酜)@mkD߶|tcȶJ=|ԘrJo4Ƭ.<LmmB@(_jC-=hLa ~}UByAʎ* Aݣlm7mdW=̛ۺnԾ@E1(UPY .(hHעjo( hHj YAdNvRG˴lʫʬEvA 1Ea _PiGؐĦDLHԃ}Ad] DץqM*qS1dD` G\W"-nl @IGS9HkDl*Ӎ ao-A^ Mg"J2X=( T&<`r4U8؟ Ʉ pz 입`TfT&FXռMS @5Zj!B,@ՃU/Ar)jY D d6 +gΎ` Mp` Ih1űtJ=| a [T <@ԃZ=+&A ` <DxwB-)u0Bz+s z ̄ X3q!aUD#u$Ճ$b(!<ăY(u{"@SìBbQ^HDt3 @ٮaRA\DTFUM/DInTZ~F_^S;uz#.Af /{ Ǒɻb@`<1@8@X CzT F,F@K? pGAbGA9dI'QTeK/aƔ9fM7qis %,(0@. qzZ<6}G)[*U=x#WO@j9PxfO(bI C=lDTo 8PrVHsgϟA=tiӧQ\t"-[ JQ7URR:CjaHsX֬дrRx@muXlN$F!,Sm4y˜$YA * P ,Lp0 Vw +bgCs6HCKM_!qps2EFıCzGvH"r$ РpΩ(LzaG\SP5l7S+Sh)Dz!-)ctH;CG t JCZqDQNQ HPgGrÒ ๒+H#)s%9-cMVe뵠b HH[$67o '>(:5 ^@ (HJ+,$);Q @(HSa ٨/Uk%B>@FKH"PXA!x4d`" @`l~C2H*,D@TDAPpH)xxT @c#zUe=khpm=HH Oq(pMUVUV~F 1*}1!CҮJҜ\ ;R;B"MhNHt d)y y,ա }*z1,'NWu_z@ b,ζ|Fx%Wx:N+ԣtBC=XL(Yl 7,NiȬbH@M'H&; @Ҡ%z!Af-O Y(/QE9ˆp!M|n F6%JkQdeZD8[3ȏC|@dXsNʉ$%ba 2+t[, IWs3.*Rb| F\kjnY ~7+ iOPi@v]_34YQKxР+TR-ג*򈬒'!+U.R LBB* vA: ixNr2$*N#2ŔԠR.!4{\#Le.KK&JIRn x`3W2}siv@ c 5Pa8c:ġI¤*)Q,r`,I@S:LaAA!y2)XdѫTDު5f arX2FvyzHL)h !A *B:5@!45OsdP4m-l P呀ؠBAM"4X#+uYFQR…A5ɨDIƢS(Xu\=*4V Ax] $- -)%UTY5euښ| Lq 6Y0@d.[4O39B>Eb>"Vl^C!a!3__Y6gJ5tΥ I h!n16NUSIb>d8(t"+O[("b1!ҜeV,ʮ6.)(D./HehK+&bn!#iBO0*CEp#ns]3l-wa̗f`:#(8I:#t) R(PL@oB^v5??A(Bw]&$rMtou_/7z+VHHD^ H$G5=,>HQys΃-ts!b6jGL*L%{gp3 ~-yQzc( % TU&xu͹^d=՗#r@壺:*`,XbW d1 !J~zgR;]Qą\Rgk_V%y"H^ ;" ]$z}+wY+S21xFYƍ8&I߸-8x9y 9y!9O2%Ǝ?MB4 &-W@98@+'aY@LB|!?B6Nt)9P9MByy `$8Y44w9D"Wby f$2A99d+`xfBT[#A#ha \!ʲA Ha4`=@BR>) C}$aA:B)y @ VOA6!m;A 6cTZrBu(x5Z"$"BaRA|A9՘a .$wO~a3ʅ|A B"VzW{!Yt-(`N)L\g`ոU@@1 χ\[!$A:z ;1[asz[墢}yAa zQ{$ |z a *H2|8 hi[.`뚙ʈf@r4a ,n@S6.q@J!Ӄ;YZ 8YWūISSOV|Wz_Ohզ-[ʁ(UKKȃn!|md }aꙶ!їQ(.AVS4t8]iᤠTO(F >Zm$c\ ֕Y,D1}-V|U fD@3Y1S8:G!?b` λ:(y ؽ-"ƙ%ਭvj7kʫC]y6FZXG{!H[!aO@ ab@u!{L(`vJ^'~<ݦ|W Lۖ+"ù^/•. 4^w>B < nᗙs`_7h!. ۆ n8@ `;b?dT Q-} z#.?~1X?XM8П/ !,W!,QWHUuÇ#Jb` 3jȱǏ CIɓ(S\ɲ˗0cʜI&A1 O8l$46kHЖ+*wer=ơ#z#s*gApD7 Ս1ժ6aEJֲrx 2go]Xk$RH[tuhYS!!gƘx<Jׄ fB"L X $s -{"Pl % R,]vCbm["9„.daLO PϾ"0Cv됓Ļ xk|bbӐTu%ャ#`qGW\4駜WN% @l@z GloG%W0gL8αw@L"HN&;PL*[nA>F]X]ܓmHaBYJL`D209S S=V`BF ģq)b$7q !Ó注G|] $ a5Fмp#mmq_eMb2q7!⨇;1p"'uy(ŁMn1dNvW%٘>ȲxCd4жmdF3 Cچ5B֋gx݂(Kh E 6ڂ9.Ph"4#YARΖ\&η:Mvtͳ|B җ^jKQXvF*nX 8XJq!Z)N<% NR4H:1A> V~D#}w8Ox D*z)|XRL))U :GG{n%!>q87ĦҌaz%=xzz,~^ܵ5=c 5_8?|+y˱ ;nzD`N tI_#D!Չւ. 4Mv٠#}{`q`]lb}pf1s)i(R5v:HNBtBjG,Ȃwa+r|[d>W^fvKH}az6@>@t::F!N(F\A3q?$c) tqׂdH/s''=2k7QX"%ЃryYvG9utzCt9qCgP"#FXngi|@U-@v 'ZT_yU5]apR'S}RvGFG ۶p1 XWnq3(1k>\ $r 2wz'83al'&sd742TK >Ƹ/*i`E! !fU2`Q L7TKJАi>,Z&G OFOOPγPB>oȏ:gR}%^>)6AJ1~ ER4;'#X2G!P)mEqsG`V& kYU LU"ORX9T% P"-n9|fHrWgQo1W/0^&TTP$P @"&0/gAPk4,a]%YhJ  g{ٗf)l6T]xQ cMT} {% FH]]ٝGl)u@sYvN GmY(,`ٟ:Zz ڠ:Zzڡ $ + Ve%,q%q !g>*~xW"ڠp!T Vʣ\E`zBʅ aj'I,}*@ PrJc]ˡajc:mol*k^WSGqƉX-*T@|a<@Q W@ J"giz&rs0-w7fmAǩJ0p E! IGP1`K`Hc*CTb%X!0E3@M0-)#$M$9%:¯N%X9:W"b8b@5!6H6a7rB)mBr!Pp :r",g+*b*#Bc@2zH*`**ZG*NZ'G+:*.0A"*!GXC le;gJ/K!P)~B*w)C!/0 0@RB3YG;.xjk/BEr/aYRG(vq), Xgq`!^dֶr5k |B=C&h#4P U4Cw8s.E!cpNS @ {H 4DG|բIISګ5` !qw"]),)|Sa9V8W2{@b v3G EZ5U2@PI<B*9>LhmAA 9Pp9%?C? lP7Y`,hyV=Rp Bv8> Bv#d@>^=6:X9Sb=vEmyH >P gQ?ZG$LȊ9i\4_/A$A@  %yEk @54IȻ{ }P0X2;40VYhIt)4D\mpIIkQ X@qrrM]aӐ)4hMpL$|ycS},lVNNNl1*t@pلX$=O@ o=cOwHsaN9N149)Bu9iEPQM@0`RU3W"܀ZlSSB%PK XR$192SP=)R@y&S]8?8=TG9~U 3]" 9m5}%]oN „6hIwXXlFt.3{qUE*K`Uj>IŚQϦȩ%Z' Z0]tl~)Uˤ[ŰNXa\ ju`~hɕ׻8 |.^\1Tl >5_!ֻ䵂]a^dƞʾ>^~؞ھe]&>L޿5f0v6];/j~Ξ!2%&Q&@qbhF=Ð wn.j A':` wFkskJJ5 ^#!#v6mvm˺p4>J6/4JWEBW|=~TE"&BC)B)]HVRF#@8S[BskasY Op~ _)`/!7rlQrG&0uqq7«1. >v&'ԋ(Yk>pmMs?88;J0>eU )>`[ǟ!\uCv/mk1u`(ava֢K :,-Cosv! ^x;+LA^6P za „ >hНN&j"7!UA ƫWťAꙣrdN @zf<*@jDHR.1ՃA@c|tVIqgNGŲYVZmݾW\uśW^}X`…WO'JҬXZȑ'-K8I 1YD`v SY 6͡]ԐiJ5M>}smx.ԬX2o.tխ_Ǟ]vݽgT/DRc.* ,\K |b&…(mJ&JҠG%tgƊ!`G9B- /FgFo1Gwke*1XxGj})&R}BAⷃs zA(ltu$;j UToevŶc?9dG b.h<-Wz!i%zu4 ʑ V ee[Tb`Y*zu V].oWaܘHfm߆;): ]&q/e;N*()S"1QLO@)#1C[BJ9L bAp>'+VYM[=wwwDҝyq[waŐWno[ cG|st|c@ t'`bl /.iQ3%Fe@Xa)v$8A VЂ@-4‰ sI=>D~IA0 B! bHq &F+;Ɂ2hX"3{E_hhn*XbҠBv%]Ћ_cH]t2+@h'"f$T)#*wZʼncDd"HFf y_vyFVҒd&iuۙd59JRҔ$#p'De,e9KZ;,0B lK^җf09LbӘDf2Lf6әτf49MjVӚf6Mnvӛg89NrӜDg:չNvӝg<9HAӞ' CE, ,@&gBеT=!0$ (T ȓ\ţ#`hJUPBTYUp=# Rbҕըl?q>"}G: zQ)E&rtgE+-, tY`t-[ A :P\ԋ&ZP1d][F$(%Mkf5[I4cy 0^5:0z02B0]bࡊ3!;4!lĴjS?4|,NiD,A!#ajC8 =!oz#|تwK&,MRwU|3MG<  Py P$@s3"5ȃ Ĩ܀ ʼn|> wx7HIRBhzx‚`-Q@ : xH(tb ?*@$BpB"B$Ġqtp=)a -(S +ЉHT JL KԉR,Pz+B9\x*+Ft  CDd 4ȉ?8,D ?]<4(I S(xP,,,,jk 3-HmnTmL0 \'J`| %p'RƆtH@j+;',ХȊt*~ ȁ=`%<ڣ>zȗCɚɜmɟʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$˲4/J}8XXKhų JK0GH*[ɶт(" 8q`Hf zE L—x>@ I̺< 4Cүn4Д-Iդ r¹tp(? 0P\ O[ܨ"O, < ތC0+ꫤϲκ0,ה 3442czR3x E[ LxK Q%ы# 倅yH>@Ϛ .:..ЉHQZQ 9X֪w@GiMX ۭt B.rRq'0.0/bOZXMzƂ8>(00P0@xX(EF% Tzȕ3H3 AT@X8 BTspí/9y Êp0 K ʂH|07d7t`Sp1 '8S`Kn v4XzB%PpJw͈3⣀vYG)0hWx26A Hz20#L6+893WdY=hC `YVw֜A8U1W)X=7Q/z6jk68PDnpl֡XΌX[5]sLH6'H qzh۷M }l= ! H (LC #Q}Hyƥ+Ҫ+Z㩔],غ0©!͉Ex8>h )޽z ΂ڭ1KEP`HoD ̅](<\r1 xZaCueuW \ɔMQ Oizz=~3A]? jЯhDؒtvn <ɫ<@z \z n_ +ԛ  X㷈>#nGȽ囖^tij>&+4ԕC&t.f ': ?^@Ȑ!Ƚk Tn m!󛉇Q ;> ] voaf@w mI .2D^ߗiȣZADA0Hd=0ӂ0A # z[ ̉ @P#R`҉A5Plevz4b赐xHL_#R;  r>KR! ]08,-8i]jޘ=[=ȩј၂Bp)BC$O ªÖM ;.ՙE u`0wE [!ZK$9 . XTY$U v  nHeZq: ^U(EIT?\ T/S9󩋱vBU/;ehl@g )q"N}G|? ‹A  F QBo葜*"FOb"uG7jK"ӄ􍡂'E TМ<^7:҄Pozvu*w**2*,u"F' MutO _RO pO! Q}`Vzj,YqKs^`kG ˉ3\'1*]u}䄂h(hk93~ =AF?B Qb3Mρ=``1߀r44wt4H^/x~ǧJ Jc7.uq 5q6 6)Z:p(;b[`;FHy:,HBgՋ& zԫgD „3S;'jq@h>FA g<&͜&Ki'РB-j(ҤJ2m)ԨRRj*֫WLL<m`zl7o`zUp5` PQ ˮ^:$zh\!>Ťx Q0b&q p-::Y$4C:)eʼ~07hҧSn:ڷsݻefadtRl2+xk/W@ [E (\M thG#gByK$M %c;@N#/+ 8J)G:cO[o?}#A 9$Ey$eD5| DL>% Š9REH>וr'Ҹ4KEHSL.5X|4@Zжۇ"8PdHfrzee u=ZiIz):*STFLQR!jɴҘSM5PG=s:Cgc9XE(f{j:J\B'C@9Y|N=mi@bNTԅB'|&H kd(NK YLJ@U}ZJw9)#n&Iځ)$2e2l8dq)iRּ&6@@3&8)qF=AKr|'}'@*Ё=(BЅ2}(D#*щR(F3эr(HC*ґ&=)JSҕ.})Lc*ә* |`"J:S),%'iԥ2 C8GFGF5;#Ei3 d㰃A1> D881  ΰnvDDa1u8|ckPp%6h7h Q20Hb>:EM0tdm e%`  ֍^-gvod'c,A@  bD1*r9;f8&FTCp f} mKϜdw-~{M ؀URpLT!p= 7' lP%`@ "HWA4Q!$1PBJ5W@&<1 ڐmshV>q2ap1HE$bq<0\(s9 0Y0Y!`Yo-ɉ i\t0&Hn( R\'PbUض9@ S7*Ed9Ql)Lb)t$B%)6 C EL!gP|5^)qq&T*wD#doiޡŤH@"D}5XQXtP=g*QtS .@DMMLTՂp%Fi &0fQQU;hO0@DDL."B4`A/Qn+ %P Cr@I.R-WxXHI (a:P6  _9ijCƯ ;Ao/&ČBr,7oS\0@ Dބq~7H[_FdXCuP o Dn  ɘ@Bq?S8vE|=TD_TD 4܎% LD.FNNܰıx Dv1L`*VÆFʪ( z %@!#3P`KC^2PF4i[Y 'r5Dߖ20+s",#roi (`=2 R 9 0ce1&/LE%/@yuu{H ['^(MT5< kzOڜTtӱR@;$Ce@Xd=`$Bh!@C 4O7$Nn5Rw; 9Q'Z05tFt=)փxSRCSDWTf041Q( \JXYvY6um<]@4`{ ^~HB{'dI[Ui9vԃiUIL |!rgB@HK8øf#\5P- bH0A@\`wh'_Gw\%8C_$QRstRRĒ(pwBy=_xy#0BޡCe7| (DjV|7 B/~788'/87?8GO8W_8:|?h8#ˉ@,8t,%xPRC O*FGđ(AOPJ񶥋;7MsGN@fLiP3q< )7UĒOgœ֛+uf Gj pq=,GpCykE7S7ŝ[fUdzu{Of[k*1Aۉ"'TJSQ\İX(je({ŦăDf6B kuõ i+(D_d{Ϝ܊3kJ.Aox DiWTd V*,@`%&nEx0zM MD(([7F V[\Q \B@G-!ADAτTdbN?Rgɭ8(@U<+x/Ä'kFz/*60QXkg|̿ =S QB@]ekT?@h0P2o$8Q(R/A^Hpclj"C$ȧ^˖9fM7qԹgO?:hQG&UiSO޴8*9VQ)@GK!-iicz^4+Eh'@ hKlg FpEKm;GGKmElb֌>>&(JpZBUK\ɂ]t%NL"kװ)=0 zеFTǑ'WysϡG>ԪW Ⱥk[謞"RfźFN'uhĴwk;J+7 (+-gP%$FPK-Yhch;vs·_V(q\NiqQy:>npƫXI/-\PGbri齶e껏&z)Li л40"Dt%'jEh~>O@%r+TZI)K1TM1Qꉳh:*ɉJ -hE?`ٕZmּMs΁$HUV ruBgڥ%4FR)v#zt۽¦-)ZK8mwWy JhzQWĪV2\Z,L-C TQYjh _VRZ҃Gn =1睉īLzn駡ZjPki4,J*iz%jdiZbDp{qլ7oWy RH5ؒwXHzC "FZBDضp)0G)뼥ω$%MdaiqsxGـyos;߁$?ĉjgz桪VingPt`=sFa  y?x`YV6`zn%\(H)c IP Q ԣA3 QBYFOf&  As̯O(\pCB/#@u.RO=h@( "`PEŎf dq BvNOKji">|[q@I 1 bvfu\G>fM BE.t$67P!4nQMTXE*| DRЅ,T2(<%MrWb ܲ)#41LwO |ct˕a3zHS7Nqn`,⇎e9vtS=OCq)@?AP.F&@"FGDQnGAR%5IQR-uKaSΔ5MqS=OTE5QT.MuSUVSUU?IPU),MzY$>*+VњVJŝ7 >bu]CR2(xIVص.͍OTO4 uj<|r%,QԬuiQ[U$@`[1($v;DK*`iPCU91MsQ @5C(iM"ݝXnL׫7cz “M67Wm6w`AK\"{p~txްaO9С%m$ uqpQ lJqb(ǍL@*x4q"{ȩoLxra_.r\AԃFV#ϙ΋!) U|'8&$FND[_aݺm] E&T-A #smnkYKdZr!]IG o ̜Jf18 5HX=jw%(,nKϚZ݁!CK! ޫw!!6.dG WuH; RBjLg$ P_K~Aꍏw6n 3Dlm"/l2~v=؇'ZpU@knqg@Q hEVc.8kr7\E>)Li !1BDCA`C`hD"ăC$0c{~=F!vO~FGqE.Ji[T*xnU[dG`.qmܗHe1qe$ X̾\)|' [6!vq2M؟oyb!T=.A~n!Z6]z2rz $ThIݺlNo o*"p.!`ֺH1:#) |#mHL&2"L5h#AR 2!Js2" ZxI႔͎"}B50O7x'}<0,'.~xءb(.,B!8Z"r p"d!\BnOK0h Z‹  ' ,"C$ #r@P*`.B%I&CJ p1s"VI> ݎV`") "m&q$r`@vxQɱiI̱S)&߱]J +%M q 2!r!!!!2"%r")"-"12#5r#9#=#A2$Er$I$Q9`M?&@ (8h&'L&oRlR2(yj%խ%g P(%'CѺJǪQ 6'@(RՌR&2"|)w)A2-ҕ\BOLX`βD'L'ϲ1{-(.u.' /qZc*`HoaР5]~U6"h Xjx1-/*2k7G.)x$&Z&F"7wźe+"ۀM](gls=i , nZb)@Tef*,-AB$*/BJ(3C!?G%hi6#O4bR}ޡ=+ >k*"!f8BނBBٳG>.Sa!)n&B@-"M!vFt%5`I%~{b3-,J ˬlnjH}CHMC0ٯOBZb XcA`'uPҁG)̔ q"Bg )`8>`T#p7&]tKoSmbVsL-= #& F"V"W'R#BS9uKVs (i`%'xZ"A*5]M[YrƤS/J0-$&KU n6-*s+u6W,f"-;-#5#lm6P_]̴ZZl"?\&vB>!U]avjBr" `h \4@%.MZ@B9)fCg&UJb -$H0 1##f*4fh br}@q0$Zb#L'tP2F`'f7j@.aRv"ޯlіDvJ$WyB <` grVHlhZ4H?r0_ 'Tgjwvpip%; tPhCa8s o+d#y9wUl"%bn$Ƅ\R^ |C ϱ m" ".B%bpIup"@+Ͳ Ā w$6uL6 x_T_@pw "v"~V kW'L[E%r"lb(F!B"^r-.7`+[U%!l/&O8;WPtw"O$/#LDTWB_݉n7v/f7l$"xu X8Rx$Z#p"7>. >U_u >7V q롒;7lB0"60#Fg),#gu5BXDrQOR%g`O33BM 8bZy{|ć||DZA8spJ)`i" 'yBœ3$4F ˙ ~ , 'B ᧜PYƧ||1p`.(@ 6|fA8EM& |¡ ܸydw " brA>E5X4U/b\֐"Qa( ~O rԂBkiߧ8"4"΂h:dGm|Z0G'BzH&@8ZBئ ]Z BY&R #s-!";ejqT~<^t\vG) a;e{imq;u{y};{{1;[۹{/[[ûOn;_$۸ `$ 2p$z2a(2\g'H@/RLNNe«2 *G 8ib ABaG\ |FpH*nDatBC!ogp"2@ 3Ā#.BUBP!d } i!u!A]b^R~ P"aɀ@x6^]Ȟ <} bAE"Ca"HA|bk(F\/=g ZH݌όD?֠,bF<9} B|VGfAQa)0)a&_>`͟"b|AR`E-Ɵ? ;z2ȑ$K<2ʕ,[| 3LjڼysΝ<{z\$Bو. ѱ)Z5B^=DBݻHa¯ (WuҸFZuϟ Sم7 Tb&'5x\ĽȬ}- #W #Cc3ZԊ;ݼ{3ċMAHz:vuPψC "zp}6E!Q}s ITg)P [IC[@(чH%h q? vbpNc.D,D]'m\6W#Ź}Z-Q*\}rif̗D=C7Χct4&?lQ lG|zAH! ulQV]і~De4}0!$Z.  YZ+W"Cz$,oW' "YH Q,XaD4ҏ{1#|HJ/[>A5|i>||B"|1>ꢢ4]BӲc1Hc{  ZXĤq1y |@Jr=Aa3(ɔ bQ(N=r!A 4؄GP$VCzЎ3 {e>\H:%-5 pQ$G֠GF#\H7Y#xs$=;=90vxD .C'2OEq"M@p@ G0D㣂5~dgPxCKt, [ ӑi@I^@tK$Cj6_pW[v~M^;+_μУKW HBhm1w4"GX<:!}1z(h`u6vQC J^)C#A@UɗQ8S0(4~Dh3ώ;.v40TÃSH@9SA< 4eSU^ YrTQR8{]-"DGP񧠛5矀*dMU'Y8$WaM\{@hCSԓ@>虔`%=DRP=N:kS&eS/myP4 ĄfdN=r"W+k&,E~HA<0vQ1s;tbQA© #9պ殊U#SOakR@e@HCAf2 v`eA\]̻iJ: [Aa@]SO4s;! ospOG.WQԫIgLd= ' lv۟'8A/+bU3@{8U0-CnWo;ƝTۙ:S:ekj#K= v=GD0}Kd)۫ vhMO- 2L;i< @" W1`p:a Aau=ofA5HL'DjARR&L#荴LXA~%(ihzZj{=>,Maƴ\ ೎C ެ) J) w)zd;G>xK9(2Xt^>.pqSp·NީW=p5ƒ9wԷ ` 1,kT@#.~}f=ą:6GD4)7.x!DӃcgV9*OiU rSD!xD=vx $..d?9#([xahѪ#p8]8pX {]&5@F-b@{@$ t0`2(R8P0@PNF;3S;N(b1MQ|u6f(UAp?-Es,00P{:A3AfWi850 Ӂ r@GJa2/T|!#d:(<؈?H3zQ'D:gMnW>aq>h]x>2,% bhA@YAH(]TQf PB4CpdmQ8 ( XSQ/r98#ix(hT!9J`刎+P afAD ],p&8TT4]oIaN'=P @yfTt!Y UG$s8)󏬈!yBVY!qCYpñqaZ)9ϵ@3088Hld-0,.Gv0sQ4ӖQ|H$p.CF.{MyQ #B}-I&=|0SudXBd5 ylN%%ہ>)x/qq}y9E10|))3W$flֆ.2` "0$p1QL/yYqFALHg& A!˄z z\@)p0h/@;RB" X( لCl0VpyVzUTMFgСjq1CT@`NM4N1%Ayv7\949`lxGsYZ[ %^za:jJ[ :)X1])]7o* 'M.O;ak+0<&tjv*FJ:uرz,R fSz0NTٕ]9P \)U{QT@YG̔NZD)Y`\[6`Ɗʊs\?b{J:3Qk?i]Z^ ":eDc::6sz K [+Qe[{۱ ";$[&{(*,۲.02; A8B e62/&!dN+Wo `9 ebg8Ēb8%CO1W*80bpdft"Q 0 pKUڶ+ (t;v{|+00]U+r@ 1qָ[;1`wA`/%O+q&Jk!BWآRbI1"EFK;90_a2K%>cjqn7黾$KM2Dv{0p)#ZiLJ}?FAV(frx19a58;š" 9-A!u)I)TS (ĐA >' s` / A*M!+!`85ES˻Kd&CBcF llI4q<-)Q@A* 258&_6NDGE/X/ !}p BFa_,s>(,,5RpȹcL# Na?f)Zq bpf | Ո"D MktASKbt˫̕km/0?4TV3CwK$¼MMf#CZ ҔqEYT[+p@$e=,"H!Ɛ. F7xnT~Yv =߆߰s֦=MIJMlI rB%۽** &³"wL#4{K K&JIU_76FP! - B@.@zNAO1yDNMQ$0ZC8-̠:PPQb:QK~0=vzBF%oH$G|S+T00];ŬeqE0hMfVj@Ds)ܼ/Wwa+`K3-=`zXUY'!d5^Үqc=ڮYm>p[U>)E\>^~?__ٞ O=c NL+ ^x W>V.QC&zx|5 ILP{q2_-A#~ܺ\tz\ }Qag_'wtxe+%j IhaV&{^<1*7ge;M з{Q Kڢ'B ;7p r_AQ1oAlM9!mFm6š|U =wQw&lb\}O*Gpa|; qOfaDt+7.G$6`C!@D`, Pbt0ޯ=~RH%MDRJ-]SL5męSN-&; 'W`!Z1CBIGsЫMÜb; viӧQ%zAhVc7S=G z:sFK`\ HԹzDZj֭][lڵiSίz6Ԉ6U.FFa ABq`P(~<HPEIOAzbv'KGRKXS $ r)wB /0C 7C?]Jsꉄ2zh+   岑QYT4W眃 ,> *py)CJDx> 4,a')~ 4v>[A3O=O?D'[ozp (p;H! l*HPǐ=$, ީG$Kx=HJBteYg6Zi *CHF_R&a.ʹ;N=EP&^ytwUf*qF1N -.FcĠ?* HBEqd rc?9dw*zqʊ]]cR4N>d(+PXYlUfXꩦw(ȣEx$'ҀDe> c fm߆Y pJ gI?ul]p껣b'Hс[1;8z+psh(hn"oVgwI$mKHiM>x'EQ{|p  Q|J?(wL AH렾!i w#*$*"tIurU`~R$8A VЂ"E=1 B:5>DN8JӊN HqH8V B8p  %2_%mXE !$ AiTF8F2ьS 4ig82)$ N.8 B`PV) t\!mhacw#@̞XUL @Œ``zθJVҕtI&r) pr")BRP[ė@@ ȃKjVӚfkdMnvӛ7NrӜDg܆NvӝOzӞg>O~ӟh@:PԠEhBP6ԡhD%:QVԢhF5QvԣiHE:RԤ'EiJURBkp`%!$ENsf9?^ L6UA@n$Z2qe%p8T0cІ":VjhwN8V&-Ug3ZE>,R]I P6 jJIP2El j̸:$(ëJǠ;4`QtPGZڀӔ#j4 J,1b[&Dog+ O'ؚZ dB֗C.H0쐯(Ӡ њNYB^YֶW1KO 9G<0yKKX0(9EL <YAb 摎ců~e_aQ^pz4F?DIbBCM w̢ B&;]p-Iuj&b$brz(ýgF) ~8> ƺn))  E!g,Ճ21UiN"|Qs ! $k6q PQFDa:ԒEH DQ5 @ ˢ)>˔ٓ'jKp.dN|FsG:yAH=p8HFxp9) @`|C2;ݨ_'dTP/1"8+= Bn!(;e,e[38إx9\!d 8Be01J;H7OtU^ÿݎM-,SXM bISr`? "88UЍ@][ۈ=v `= )I tG%rd^ޕay7j``ه~ãMHwc>Hご(0zXВ@K,;A^%b9L@i) 0#ʅ4 }$IN5 _"U2`Nأoޱ|;}?B!@ʸpX <[q1 `A;r >+q % Uˤz XA <AD[);`oh$y?ؼZ ܡB#pz [q#A0Hpyz1DH;z8*Pa4? z05B; %D2b[(R%e1J/Дx TMZ0 墀nءw4MnM/ ZB"I3{> 8 nD @ABH y+B! XY+!s_Os ̄KC;(P8n!A Z 'lgq wPI٘ArJ"E|Q-xlq gS *#$AJEzh¬)(e$2褉 vhG81=$7ݧ*(G*5 .U&* Pƃm'0]J`Y^ThTT8țz O%R);uHTSeV(G)pYՉb#Z]^_`a%b5cEdUeefughijklmnaNppKIv9op^+#pŠZ/K; =-qrׅj0>WyTnג<+ T3t Y,veؓ%P;]S@w+N( sЃbTS2Y؄UWE٦ ΎHGabZ ҄Ȯt툊 %YHˠA,ϕۘMڃEuڿu%xva*sp t5U 0 0:xXgjx (s" 4ct`-ه%?;/P,.$*- *ډm^][ 1[Ly6{0YFGH[z $P[_Z7$0Ryp# XǤ :Јߵ2MBXmQ`N`ChR 7 =$~?B ET ܁27 ҈š l Ӡ  b~7& *lPP;X0z:1^KY*n/d%U4a?k ͑U`>( [ْ` XaQ`[ネ%YW3܄0̃X5ayQ*q,iTQN+A!IQF8S0"A=# g`A, a-|uR30X>[Z^< SUVyXz(E34U`pغ"5zx]}bYd2`Hg]6[7&ZB#p }9Cu*6mPE i(!VCYXSj+` aVgkaT#:XZa,[ZO,`ҳdUOPULGZ"d8r+q I[.6W  HK HHёc_HXZGU椒 !Òؤɾz`8A ýN㒝nX[7GkˆP>1a⮇gyI1xj@1 P <BM$BtM& N郈P2 VhœT&FbzN3Z!fܾU4 9 zOpxzf+Q{z#Q1."*5:m0ظ 'MKHB =J6GL~N[+N6EN)m܃Z.cXk1%SR;EHwtogIe`KvCEԘ []x)m\%Y`(* p8>HU.qMg&izOP&~ ܞ%kxQJglGWVuDwxb'7GWgw(F@@ wyyÉw!Q`{[zp]amCqPao@u؅3&mp]$*G0{RW?ӡhP`K|'|(B)z ONHnJ#H<Q_` WneW?b}pxO0@=z|p C1bp mXRyS5bxMGUkn5l WZݬ A*\ TX; 5]=G)GI( +Ыh 9 Uʄ*JUHMa !Ǿ/uHU6ܺw7‡B!NcE;02"^058  KNplM= Dq!8"%x")bC P(s1b($z`R |1()lE@zACHN % 9PGeiɘc#B0XҘT !,^%8SLdHKbgR<"*(:(*yBBF @ _!<P.ժ ن\iH*񁉘bNh&%IhbIS DAf uCC~ [LaMc);.+ SB}B0F$[kV ^S +`0ɚo1ᚥlnk_r 3^ `ɘ8NZ ;r=˗;('/ҟ񱔄I0PFs.E}4I+&U0B=fk{hz<}2U)3lQuS,g`=% |8U*P!!2j̻4K>9s=n+ԣz `5@ AjhIҨ4d:3)ӲS݂SO&(CP/J-+JSsK=-{=?> &mFlPfj-zt f,qDu U$l(pTaPeacYr 8KiCt%Er`3`ʘ4.|∅PH,dc*02 $\F!HTb%\ jLvPQq,iw Pa*c=Bā;3Z"w($Ӄ! )A'à†b. Ƿ|Gc.{HA:14FUw lpzEKJ5 uc! "@SVWR4EBp;7!4I:Rhb2 )qBR#bQ vƁzcz4uI-=2h,S)EbuxSXHjÓE4v:Jr@xh K0Je*,C5 G8vWx Ӝ>)P*9!tN!UU\i=@@Y@(`Z]lZmH沄Os$&_VT%x;qi@8P'=L8GC~h5 L2J0B Ĝfa.d!`fi*X1" ȫ `"T`؀iz iH`4ϱ=.rKH*}.t=Jֽ.v"j.x+񒷼=/zӫ}/|+ҷ/~/,>03~0#, S2qY s@x%Q[ 8ŰXqfG2&9dLV")' !hCiTؒ%KZd%Pz<4~ ]76Q AXL6p dh,2#+ؒ7Еlmz BQ4h| 0t<恄yamIf6V$&pQۘ|M6!,Y'Jer]3U ዮ?Mٙb޴H'PQ@R `&0":@GX$ ѵ{kP@#I>`Y^%yz 8w%,9HJrr$mI * pS!]#Q< 'zo/$gBr0v@З9=K0`(Q"{K>= ΢YLҘݤ ;o*19stzo1 =^-PnAf/؅Iwճ&MнV螫e{zPXlR<p>;}Ƴ {\vi0v=3Ԩ/`R(A ɶ6d9,E}t @)D= F-Lҙ&1Qp/d qyK̂(Q U15 AbG!rZA&$Q_+DáEp܂8v$VZudt-L:0-T>IPá@`$}`9(^%v"H=C*6C77#y#=(LEdez]D%^5h ;9Wh&`e_BVՃ88fjTii*Dnk*J`7fqBUK4 yMaGN Oc=U].\evQ@Ut@-0;p2z6IJlAg[!c[Ճ{_'A(%3@#̣KhA]= BHC^e0Bxw1wu+&C=ŘXdLGQBBqD()Q=XTF>{m@,t :'fh8Qmw B ))Ʃ)֩)橞))**&ziXPWnآN͘q,( ]![Q,4)DueN;DJ@P*OME5ĖBT[Qz9ڮʛ BW49+vYҕ8CKC-lQ~@ڡaZCj=oPk2Vڥ ⚱Z%T2]^2k>\p+.͹%Kkkƨvݎ"BƲIBHrՎܦ;'%,&žJ8Xۻ!( 6 ù[RfCS|I=BTY-.G=lBIVId̮mMhҀK5hC D:Kah ,!ThD]L^ʵCΨr"]؎9@d\QC&Xmbݧ-X 1 ݚ7T@d-HH D ʌ5L f'{zEc(N&M̟*!"C0=/ft/ŴDꌆ&,}`#DՃ#_=HIȥ0PEX (I(7T[ z*ɔTɓ(kIhe|߄5D߿rA6+* 9(N<gq̬.N^xD:&0E93KCEhȪCUDg^J&0 Daƒ׮Ht`=2+y`}ZS&;pq{q셃փ }^؇LЀH^KʆA7UH_ѰI|^Lf2.DR}!*ߔ=.v+/6D7w!+O::(v!p@됀@MO*#H0BG1D.Eh.OQÔLZ&f$4[ "_"ͫ&j"6D),W5Q>BOCӋU/D] dB5Cι} h6FC%ĵk\R]kاPK:2@LT*aCQ`T\^E@(2D PAP@c>Q}C8>M>닁Íe۶DT@t$ Ɍ姑>ljC,8S3ヾꂔH8BD\=T/iCGS7}] ^ 15[ lCܲT#h@ЫW^Ax$@aC :lHg %6TXe`ꡋƄUpH!83L0iԹgO?:hQG&UiSOF:jUWpzp /[OلH&7.]( Dn=|EՔ83#sr-,SP=v 18͙,T9nP=tiӧQVukש)|Ge| r0OBB]7CBqLAs6ZpB&0A!z A$0ҩ'1doz vb #r"4 @i,#LR%jX cbĨ@G+c8:ҸoJμbH|8zl2bc ѡ3,aGz~AO2&!TI)K‘6RfڤA-F-$ ,%H )Dd+M[ZdOP'!iJTUȬ5.1kVmTof6`r(ݗ0iҬ/V4_$Ed2ļY/hI,a3ۉ)1/z&84 y I̥wZY ܩ=x>YDiJ+6Pњ9㩩꫱.s;ƈ=rh+U {;jF{9b@R7߄įe/R; V [TN엞\j˳\9R )H!bLP nLHz'*F2QLD>00Z¼tlze $jr~/JbR6`Ht\oQBX8zV6朁1,/E"PC*@>+̆C }HcK6lF*L2 0y@ : } qCQ@xż{qȽ"hӭ{Ea dU@x`~@4X&/Ȏ12rS8bEςG=f.]B ,8S #C+@U(ȘA$|HC"u"ɝ`lNR*E4)D;RL.C+aKYQV-gK]!~KaŜJc.t3MiNմ5Mmn7Nq49љNut;OyΓ=O}QOU"&1!!I, OmF/q( C{<>XLIb́2Ho8bQ8TV(`*>T"NNJzL|Jz(3 #DV%&m Q$`sqiI;EqQ((@C1&h!#;Vx.Vi 2p# )쐳.4ֳ@ Jҙtf*odB(8Di B2+8,Aohc!*!lSf{?&FLB: 86PP:+H2s Uөd\]6J +J18@*d&-AW`.(u=<-$"9[bLj[ 뷾?!HBLuTQnZrW"k%tgZ@&Do_q݇jO@FE^X\+Do`HUٌtd&2ϻ.ff\ b؀A **'b"jEmLqT!aGϷ&A X~ IpgON!x` N0L2.'X` V ZDDL̐:¡LhC . .gPPlPDlp!22xJ!PAfm:# .F/!F#f& "F#fʤF0n/DN&1Z@q&F7e  aqΐ&h$@ >!"B ؂\-!TnO!jrvbP& (dvlurg&xhbatt`* ! Z3R` ! fbH!J\G@ 2Cb1!J!3ޡ :Cơk:blW!FQ a%h%A !,M2Qt 8o* ̣P&p~*!!#rC¢&J &@ ! r- _# rX zP!"|.Š s>>>3?s???4@t@ @ @4AtAAA!4B%tB)B-B1@9C=tI6C3D" tn&.t& E_FKCFgE#jEORfD}I|l &PlxF Ά"4`JrH" IƁhvlI'tBGTIʪT':` AJ"NtFbp'NtH(" `"Xt&P̊p4S$뤢Q]JKj)$S TIʱ'U!t(+.:55W($Q;}t+vbFreTtRWTㄷU1b2"`vq(`` :SWu?$WČ.ZEBk]b7u&܋1&2,3D/!$BA&ln]Z1U1V([B Bd\a5;#f <5Ȇ , %ςlg.S"B,$ͪ/I)hQJg3M@#PB@,ag !P)hbnWX!2ClA-"| i4&i/ԬQi6C"B6ga+!6.kfDY6"DM>0 l!ku$5piwMGo=R!B'0 "N v bATldsas_oyBc)@#($::,.!!m!B2|~Kx%!UN".N)Xv&2%$VM8w L{If|먿c.K#تK$/!P}HnQ~ǃFA>ECA$B>94"pV!.)X,s%zot981G%.HbVd#~؆*ptX(O"'8 gw7k87'4V!]^':7Wc^m+$衑߸"geBm/bczS&|K#.ZoBtcjfR7%!SahtB26MOykT(l6d_'8""PF!&X=&"nIp@f6Di&Q9 @Թ:A6jb330K[!8sSn ^TV*6m7Sƙ`gA,]`"!=7*W^&T`\Az %"A"aC!"[ގ.>&f̡!>>=>pA)`b<fb!֠`s/ !!@)o3L~$GD>"2b`V=$MiEr,"}/~B##"ʁ>p|S?Yp$'f?A<_6t!$(v]_j?& 80ƒx+?~!RX&`"d=$ PAW?gڜ `(D'd@U4@ 9R(A uBԣ֭\z 6رd˚=6ڵlۺ} 7ܹtrVԺ|ԟ= Sǝ4XXNǭL 5oQLs `3P ܛyifP av4 <ċ?<=<:gw4kb/\ϗɯ^q5Bʹ_nxQ#U}uѬM*PuRN?#] .`>aݕt^u]zawIDB2_W4 yȒ fm+@FQBvEDJ.dN> e]R9gaV7ut84W-?(S,P*\3$4C[Ts0tώBYX eu>fxe^i5emڤ&jX` a`(H)eOu I9 L硇IjA2SPBI1S(zxl\1,#Y=Pt>Òc t@Sb>#h~O>lA.:S?p:s>%-x"4pȃo"\&z|L*W$|XQ a1w 5ThXcbtC8IȔ0BY+X: -mֽ& rH+$V2L 8B*~qs{ ְp<(OW9gN)E ąq=ЇNFOҗ;PԧN[XϺַ{`NhOpNxAA|s>!nwU#1 <`T.7rK wH4ߛ Ɂ2Bo43xZ`8@^&.SZ}H&ac؈x y9AOlq{S[<f}(AWUb Ӆ @_hkAOA bG".'  [!0ds<b $}+،ķ!X.@Q@Bx(بq%p?!\U q!Ev_101 o>w">@ # }p |H iM ـ(FA kv0P  "J>O Ҏda@) |P))ME 21NI 3KVV|'tUZ9WGW1C2V fZ7Ae ȇ MHiαM9|وI3C^7H` z1TŔ[q6h$pI0CN 8Ca9r1r٘ȉw)S @8I|8JP g2z`.'y 1l Eā C9YbY p b23wj) Y0Wչ,99z ,@ $.6Ape>HqemW]nٖW.8k 1Zi6\P$I3):$!r.](p> $JB1Vb@XlDRd[0 D&{UjZ vz`V֧X~F:oG *Qj/z8ha9w1Nm`d H2t@%1 >SkԑI XIĚvU7) ` b9ì  *#@(. efƢfklf8` y&_`+* p*Yy 9JG^ԙZHdG3R43R !LSvVwl69$m8 P;fmj NYA\' i{Lv)&G*Qby`Z>|J˴l;|UM11ٶt[aer+vҢڃs緁[,` ;[{۹;[{ۺ*;;pI)QLG‹vsʌú{Q_!{g{{aW‰Td!~kT}n܇uګT@#6([$y1bB6r%Qɑ ||o2X4rFZeE+XT\]Ԕ3 }Q $ #)da!;?Z}T2AG<X%@% &g"Qp`)Cxq0E@dY&7[19cV 3s-2*OL#[>,+K",ż1,š,Gpnܐu[|]&@ !@+f)*] k!~ :}ŕRhȬ2TV5! @" 3B3Q} [>%l3~A/d,:ЌkՆ` =lpSk\<81w QWhaE-:!9"Si2}Ϛ9:M!CiUakK /?ND /<:#* AB6SM^IɃD.QB B.$\MB_-@#Zj YT `;wQhOra !.aYÒh:FÂf=iH)$ٻjGr$Hћ~ As|_&y7 y{ =W=*hѡ’RU=PmFײN]>-͔X$MTZ0A j\A')J0kQl4ݖݓ+^T4W$ڤ-* Q 1>;"ER&R  W| k1ge7 60ke+ ]ЭՌ= -Jw-%quVS>FXUXQwjy3'9loF7~a9$m e-J!QJՠ|.|]B^@%5įCF`.R 7"B1=@|r/r]>rgfP BRdkAdpfowKqZ,LLV>ڠ!Mk .b0 (I(uh54 3 (njvi rjkkKA#H &U> ."Kx-`:IN@15pO11{`+dJ_bNϘRo ;V{Z\^`b?d_fhjlnpr?tY?az-@1D^}RazWq.0-_tax?q|'NqҲMQNGK}#1!K+e룤#<7If!X||-*  X 14&Ui !@@¨Wo As@QD-^ĘQF=~RH%MDRJ-?Rؼ>m00Ǽx0}*lyE`z.a=XTa&@̚W &y|pgO@ ԥr: G*`44.;M\,Y'Es<޻ijit !@[OcWX=e.}\pōG\,% \O>j@IfHر?^z=P&ՓUBZ$@Žzcw: Jg=9e#P( agEB:je:TLń^4贏BxΒbj#IcI'2J)vg4@Ⱥz ZGPR̰R}gUZU|zac|HH +6ZiZk}Nz-:& zX w eE+uaGH(* ;K٥5T4\ Sj`4]\*X#\%H }z"!Yd:xHYk:h&jMH 3q.wةaRaB̻ ej(C`F=*F ~b1X*kʹVHtNj<{<"`\p @x>i)hgvo ٛ0ifQu,Cš <Z[0n@` .Wh&fA]HS՝āg C\ nॺd$ư;va]B1iÚV נ(@/z z^~r/{n;P ԠIBaEq ;H7eE F( `K=>=,n1]6zC Zc1q 1#:H*Џd AԫJH<Պ2 O-#a蟄kPPj'P,,HvS-5q:OHIDw)d=VpXCC`0]^sF䀔cD9,=f6Mn>&;1$ bUIRm|<Ɂjp3 I2\Pi00B@$gEZDeԃA'"&XcI8P4H H60φvG4$dvmnw{#v :lmrFmSp!w=ٱŦwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>p8m L0Gg>t<abVFpFQt$ H";"Xأoqa]t_5DV 7jgGb87{Ok"!Qc˒yrztB#p9.xn_|U_ DpP#20tDhI/o{3CG563ksFT k,CdmƕD9 zyȹEO6T Y!I!Њ0+&># 1r6.trt4z@Ũu4AH_5Ы@ !IjAd9 0H=Ĉ8HȶL DǢ )F L¡.!, '_XHB-@\F"H@ K:$ܸAX"!!!L!@/|| "03"Ti(L3Jk#ȁtŸkz`">8#N6k3vV(vQՊR%9qpKt(PHlڜ45Zh$  zPPxz(c=Cʁi˄HS-i:ׁ0`1 =K)TuYwYXHъє4EzȅiELL:Z]_U;+J=uHqK>+@#I>6VVK:^\ 5^CW=u^c%5EUeu_>`D%M ʖ( M!O`[ 3zpa0ɩq@aPԂ@uՈぃo 08au f~hP`J)"6b$V(rӂ@0|_=1LHej3_a `).nx]! ڒ:V #DxF+6,>219- F  ܼm>U^ޛQ޶86\B``=X(50H/d!䢌0z`J%PХu)뻈<wH#d*&n62`0#'C PX Pgx ,\`@[* YIP '% fpGE+5R(È U׀ h64 !Bx#( h‹i-QJ 6d$d_)h8Heit]΁CP̊ #he%鳦1zܒ. D/}Ʃba!]dVWXGYP>(j7yzHht) j b rFh> lfc]vxp'FԶ-:nLh Ek}HP T(艉`.FH)JM3FO]c6VzcU6*[$-aCNێ'ܦƧ Nv?&@q7emYh)8tOM*'bI( ytS>Nm:2/zkx1DȍpXDUV=rgTq񬞮,uu3awPzPXHM*7.^(Z dlCRqYqR-Υ m3\卋zڭ[R]o#~MgUH"خ-0dGЁPpK pzt~TҤkzMXxٶۊ1GP4Xpx`'1;;E̦Y|?šx}4#ٳ%(A0`p@fh 6.;.IT[ۍ\ $Id)Ə+-OxȽِ2L646H>SDNE ;(TPh {(x!D&F@yҬ#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:wH'РB-j(ҤJ2m)Ԩ*}:j*֬Zr+ذb{k,ڴjײm-ܸrҭk.޼z/.l0Ċ3n1Ȓ'Sl2̚7s3ТG.m4ԪWn5زgӮm6ܺw[4eԊ.n8Q0B(INOoXVt갬 :vr,Q:TH_OT _~ (^YuQ@B3τ썤3@6L㰁S=Q1ʘT7,F# (@|HO=FA|г`Ueu0!HdZa%% ITpH!3&4a@"Q0OMGQ]V^X(I#@:NPP.D\JHTTC^ q:*#@AA{}CezSS@0CBt ,a9B)#S,>d';nNO7!%dqGN͇ Ӭ@y3k8M^ |:b~/B D! R;>a y^=9My%鴄Q"ԭꪣL"@ T@Q'M,|6I,C!'](!5TB {1%Aފ#iD,d_>ng.y^A3'3(3@BM~iV pW=jAȃ w& <Ȇ̢ѠV.{! _գiJO;I10&de8:X#C !3T=r@i#z,xY:4G$0HƵDl:tЁ1-vcif ;Hj[OT1!UȬ?yu؝0c c!d LH> g)צ dZ骇4l8zt%gX"}$xC*QXqVX<;BQyl"G*3zTkE=9գz"iyf1>'>Kq`'gʏ!)6  "HJSnBn 7G NL*$& Þ)N]F|\08~Y"{9T +|M,;$@>RLJM '| 6Eti AEZs׽et)!zM@jk&vUU\=]<#KBpsPXCBF N'I LD "jII?H+p Q᥽ x\sG΅.[]B>͘ /S7q`9;bOyq^vR"PK$(@!H$zmI2ep#,P::P 3@^)#L t@*PWx11ް8XB'D 1<(e DZAr2b΁t ^ɘ"~&(&d Rauh#+p0дy+=, Ў~4mm!D#Ms&@NԦf Ѐ8 Ԯ~5c-YӺֶ5s]׾5-a>6e3~6} '/i#ms$ߩ9fē1h3CqKd ZoR 00Ag_rP=k'Pc@suC8(Dpx©q$?IQzV#IG:PH"^ǨvGeecΪbWt@zC&HTEx8ЃHC7;t{l(  8=XC'HMUtW| @@ Fi% G6DP~䫄X{`ԃ;HC5`*&FlGGt@V`ɱ>:ttxIb&دă*֗ܬ6@~eUXQN]DȒȪ+Γ^VC`-XyiE,ZFPEĚ DADT8/Y tA-mHmJl@!S  gVj -đXQ`@hn=MڅDq+Nn]Z噮էDJE/ޮ WZ2E6>/FN/V^/fn/v~///"/ڥ/|@H/FDѕC8oDHHtY4,o%f0`Xâ[|BbˎD$&杆 j D|I0Aԃp >va9ApAFAIj WSP慓h1K~eopTĶKݾփD*ZٱG [Dyp| N + t8yH8¹XݺO0L=h@ DfT.p@I7`1, D 6_]z.+2#D /0\[?'_ 6&3t%q)a+3&Y M)W 4GYSD^S+UZ}GAc_x_vD6pƶpڋ5ah_S~:қB>K68tY(g!< %@%tI vGİВ3FFNxkĈ;W'nȓąvGPǔ@D@vG q7WanU 1AdUx@HOtm;w67=M)piUU=0˖>)"PyLxVw8G|Q;@hK*hS 8f7\(O)||oRH NGJ*C4nj7f6u ķLӃ|ahSb|hص];rQ@9kIsUi DaQȂUz48Plƒ6y@5'5䬏,Y@A*E2nU٨1 GsSʹk%m0<3:DҙsL vDAA;D(CMu{羲[gop /<įGşE_S<_ xD,T2J|vDBuoڭ@V[뼏GJAM3;G8 'kIAWn?=?DI\cG} ``e JaxĘtҷ=˽ԻcaD{gIV 0S=BN>IXD (KS1Hd>@,=Jփ 2{t DبBM |'S$2;RzC%4IǴ@P!A"GfR⤞ydPpGs*ң 4:Dl.gB;i. v k7S9; 0 ʥq z4tGY zE(O%F:ɑj!!*ESғ* @4<*ה g)h#)l93Hu 9"%xG22 @0F ]5M`fݨb*0@vLg;1N%ЃkBrZ*rm,8t;#y>H'AJQbKTAS8pp<d6DeGEQcJN9U֣ 0,D8G.(Z((5a IA:1u"dPCl ;IGRPad3~J; +ڠBe5Azit%CYp9@S=+X\&3)[X;U-=SKͱa!WFӸC5aBnh,2;Jбto!@H=X!% C!*QaF /bdCP7.ʎDT@zC?W}}`Jhp SE )dU,Kz3uCS4ae9UN8C%́2TV^56b@%BqRaHC"=/X]nmvY k-g sd mJLN%]B rI/qe[A`N1a oAb%6Qb-vacϘ5qc=d!E6򑑜d%/Mve)OU򕱜e-o]d (Ϙ<449mvs9 9yZU1+Ͳ^y}<8u&nќfE/ZInBzOz"JϜLHz)qtA ]'Fo m(ѽuRŇ+!D]X'Fvm-X(]qv3$aOYe{pDv/[>YmkjE޾W~@TXy ( oO=b+,46۲؀% tNO{7aj T+FВ5%qGYL;)Al)t%47ljsI 9HB>BY%NO"4~7%=Z5 4;_T DDS1)Ē0"paHIIziqxR|"y""t$h-2R0 A"A B}aR.Єڏ4E":PR"QhpB+hz\RUΉb)`z`#kT:7."zT4BZB;b _p_/o!%4JA2(ҥօ)f!}l !bZ Gdn_@fdFD^d($CԈ I S$Ji۬lBmFP"")SdDkHEn&0ѷoqƳF4BQe!60.<#vkqEu4xq*jw,qy)*1 cH *f"x#:+!8@ @ L4F=a"%Um!tq,4 ]R*G%ꆸ2wp!Z!)U2npo4дQ %[qvh+v &dr(kR,O|+3HR0 B)У "h)~bKо!2%2(+"%d,i*̪`,EʲnR,b:a'-S!fIj)(^oP:"iL0**)R iOVR܉*Fs<\ 9`j̳!=ǂâ "dª㡺!"hKPwVMvs*؁`=_b"(=-tL$"dF;Bl"1b&0j**1ZenDU"m ?Vn+` ]YBT.+H >(^JU"N **dm_uH|!1]1[5ۄ$*Zuf=5",mX܈LK T028v.6cv[`"Aed_MV4Bւh{(fveS*` rar@G!Tleli')`)R'8a9XJT"UVe!:Y,%rAR-RI! a"%HzK2h-%{+"渜BjW0jd>\(RRNcȑ faa n~b]R.b `QmOk-W+N+P9-p>/- +|"J@ !]G>~陾>~ꩾ>~빾>~ɾ>~>_,_vdD~<ˠ v@lc+"h!Ѝ ^~.+z2> j>S~ ~!@! $ bb A)JM*q%aR"Ԡ P}/%A Q_dv!X~!_aiO"C` * ڠ _U4,lᜠ!"P lHBI v R@0bBl8`čW#"K6@b@ 7θaE/cڼ3Ν<{ 4СD=4ҥL"s@懄\z%ڣ?qҢR8GV_-J‘rKV kEӣ>Qa޾S)÷tb>4LOL90ھ;ݼ{ |zZ}]_=?D{ fҍHb&b*JwE A #nsCII4C? "&P&C5E;H ?(%]Jae 4T>L iNJi^=dG=l$A msoeލK]TW9 z_-LY-fNJ{8w},s!Cfjxh/~']A4SEIfCxe>?ı Ǎj]f vQ S? Qh# -dȀAL@ !Au!h*pمpC WࡊЗ X@~hj!Ob!:@-zs%Z) $?(Bϵ2?dur AxG?ql#R M遅@ڀG.V $l陬xDJ|p#'A)ʒ IU?pWO|^U LBG@u!F( VԤ7 G2BSF"L \ )@a$P[Pjcc&ԆI2MHQQ2.=<Т\[IӼu҂HqՀqa4gD8 ##E,PJv#b/X` PrBҚmk"൴mo!,W!,R _)P` p pq)L|q#D1VQ/?nL$ʏVD̙2U:&˛=Iq(I KB !,W!,QWH*\ȰÅ@Q+ŋ3jȱǏ CIɓ(S\ɲ˗0c¤@XWoZS! ),ڑ̧PJJիXjJu79ST &>t̡]=z$gxƫ5"I)Kw0†*^̸ǐ#K nGbvdH-BBqX|Bϴin}--!pӇo;̝ Nq9b ZCSa+ .98tq(z:$ͻ|˟O} zFIğGA%RO<)8OhPNF3)z X},0(@9]@K<<iԣ>9$OE <Ѕ@WK<&dan ]:C 'Q3 .D~+3&袌6hL>DW ;#@,j\馝 @hPԓW[c;TAУj֚l $Oaε]:`BT6Qcɚ|DWkFJ"*t(lDK` aѴۅ3ƈz V(OaRd&5;T~j&J̤&]8p[M MQ~Q$F=@-98J!.'%ٵAy=8z &h "Lb߈4o$Y1MKn 8qөnث(v]¥[\ɅAhZ( T$<14DPi a(OzGhؤdAtrm(MJWJa%/;4wt,LkznP( .slᘨqM5G TtS]i1Vg@Ҩ䇌(ݎ.Q.<-10H:$v0#w)^b:ى`rk^`ARed]5 lF+/HHg@ΡpHwѨN5e ,H. (`M_k9 :`Ȭ)HDt2C }ȅpHvV<pDPe=1!X'Ph۽C@mnc'_ wB=sMYu<1ṿY{zdT#5ة&I햻*8j/Wf DSGwV< fzZ1AbaM""V0 CMШ5Jz85OmԽO@ȯC<@h<уҠ eP} {2m,Ҡ~l#? ā'p-:6Px, ocv!#$ ^Ez`(0d[c v(#w~~,Wdxt6YC|[ % C OP**!} {C'3(2`c5@>u`G4=Wa4Cq#d{ 7$Tt"a?Ȳ?ku m*-vQRQ|8n<(50( 0(( 2 Ed>b>FASDGt7{qCCxC $F,胠u*38dчHQP?4kb'P @yPyy1:aЎ,!HD϶-8G`b`V臾(>(>'()-3s~ n@WWt 4QQ S% UQb**RB7Dq`cGsvi1΃'[HG#k j+f2,t'Lfyp›PãEL7VuW?ALO^ȌCȞ뾃!MXOFR(?LVAgH#t"`lY>5H78@؝A' 4E-#f(J;,AqНϝ>ȵˬ͜0B@E XP':At.Ǹġj2[/C7.o_< H:$ \aTsPҰgNY%Au[\a[a5^)UTfvT\Ii-N_ !]k 6?\3/TP^BC``JXa8T_VXZ\^`b?d_fhjlneÃ[r |g gzff!U}?$\@ .f6,fƝA- <?^l!@iVi!_l[|2ϑ#Io`/_!J[ -soӖ!RVVm/UjZȿR+:P# j(&^=xF0k^)t3Hݼ%2q poa' ޻Y`tl>4H7TYXhz)")7(NGqQI.\˞=+Z#-,\uśW^}X`… FXbƋs41[XoV0 x7'ՓfBZ(QO :~G$)p]z،R@Rz; U-AA؁İkhPIdzMJAi睾ܿǟ_~0@dpZR2u0& <9=(H+몶! L( *ң9>r8ƺ겏 M ,ܒzqDsJZ`#+sJpo+\"[@7߄3N9礳N;O >^ J X(r1Q 0xੇ"Ķ A!QD%@Ar`%XH6iz vb!#6 >2['/=4Zk6L3i6[m[o=*F (Q>D*ejC`!Ub괞!DUZAIʧ(#T㮀3+؃iL ѡZ1]-|<ِ v'zO:l\fiz[Ɍll~9nw\@!^>n _CT g: 5#P$H(HWo(' J"to*>Iƅ1F=uWgu׵"N3+Y,zpg^N.\(\Fg0$Y@"7MGEqaOLZ]?utzA~@DP,k^F5A!(ZJ @% _XEЄn88 acG84=o CAABJ]6/QЬc51` M'зƵh@PPvM^:)x 8 e$th //dh H%[Ln77?[@ʬ' D0'u6".] A;H49٥礼:Lb,|wUbeA JzY(4yYh|iBm׃ * NzD(GRAoeZX.ymob!^y:;~ !@q¤CI;*IF?؜ iċ ƌH },"s tX@x9YIiG*}4 QM@z@; f$1#lɥʪ ˢR /tK | 먲i9 9`:+,41؊` kgT#)4< 8@w0(-wC@6ˤaO?: #?$K{P xHHAq؊l%8%Ĥܨ?@HaLm- [a"cd@0LO쾙mmz  pw0"ؗz)'k|ID؅bUJRjq# x`mk>4Zqޣ̍ZB\OZL[C4߲0Hデu ˋ!<,!vx· 6) S>@ A * =9J!IC2 X@"BC?̠YZx03ݢR yz-譼މE_A +P6XN:ՌL0+. /hl `42z H4J;"xA/@&ೲXZۻ폽=CZ!ڬ$Уya$kY7|ֺ{͍0{ [[bF5׌ݵ,.8Gŝ}$4Jc)Z㹼:E*ge.2ЭDm=]/D( 鐕]Hk9L 0;Vn}4NM; x E3Mx es ]xHЄyMA^82-%@p$ a qzB9L= " p jˣcr$RI[#&-ƅ6V Npx-^*&c ֥*絟뀿?;_3؎c*ͨI # uA΋^r(Xix ` B]`'b 54IҼ(8$#XbЎz-Ll j&ש qizΎ_emd$K+-ҫ&P P) y@N\ E4.Ɠ=inNf돚~|f^bo訥s]ګQj =zU 5u"vq1Q &!Ѡ*@sr`!7 !#ֵ؝!vk@fHQI&$"?# ,& f R\"UjX"5ixSgRB=?nZwSŅ6Dz6+(Rs0Vr,AՐYN l"g?pꮋu@$XM  \wv] ˆW8dxP-'r.r"p jwa)]kJYhDtxoG(uoKw'X@D}{|}~'7GWgw؍xx"=YVzY0XcX2io0V3 Cm%e iZ,;=fG eRo͍] z[{#pىZnw ` \ z3o羖9p  {"='Л~?f  ?"p|tz] =A|]Jr$wNX=O| ǁs M80P/8 UX}5% 槐z~|X)陒wn` ^#Z` hx` n 2ń'( CvjU+ū', nw2Qy"E.@abŋv( i+ɓs&COc}̩ӥO htɄ06H8Zr+ذbǒ-k,ڴjײm-ܸrҭk.޼8Ϋ X@9[o^6փ'ЉH ;fv nX A4'a1뱛 {8>*h}q"ʮjտ^8S41[_z׳o=ӯo>&z, aqG)&AO=$FҴ@ M70YQ9 CPlF@7:P0&dPaPn BA lTvXr "@.1XDQS[=QQi^:e lT#SO<@&m&q9'u_.!6$'V߅Qȕ]~X+EP6tK=ฑ&*SO2 QEQd<tzn e\_)mvJ;-Z{-j*q iNc@ӢF4V "@6@+lĂ}sΩ`( KE.(S0YI8Ke ץS-;QL =\W:4l3=3A UkBr9S**2ICDrt&4 qȕ%Uv)d%:e*YFͱ}Meslܯ ^0Pҥ34k9{Vэtb-Q<]PeCj=Z[a-KGdv6?<0k[ڶVu:ZNTnTatZbw&*QQ9>z._z=jF TrR^ HHCl!N(@`Q6ldr񼏐8ͳ@RR֛.6 &RX$.kꑻ(!ԡjh?qml9cE:QC㨍($a/ ,;x9A^&%yRUBH@~L!zh;~ gA(GL4$&3-=,\}MLH#!O5d@HJ )CDq!]8jq`<];鎧Nσ.@NYT |[WD$.'KL:zp3F &BNje=6yҳ]q}^4}nğ(3z$(e7T!=DR;H yG7BpCq͋I7VI6Lg@I7و8 dyT@lըisGRCT`ip4ᘺᳫ^*XúңRtY/cV8$H9^z 3 165p")B>yntr¢l;!Z{׻"1"Fp'q͢GB.!}ף}0#, eЙG4fRt.u}, o>1S s3k1s&@"ٺN?{%3N~2,)SV2-s^2,1f>3Ӭ5n~3,9ӹv3=~2,A:֡‚R,&[@\IS͉JL%4C:X3%iBJӺhtWNu`jo+rBa;G-.+N Ġm $&6P #6]CPfX?dӾ7I+ pr[u-zW\!pRƄuXd|[g hi ;PsS28Fym,4 6qrP[s@;QCBAX(AfkqM*+fAC;-kb<7 ;&̚'0SNHFovKO%H6s?6x~C|Iɸ%hcvv/iQ T8Ʌ&Rzp'o}n#6-.O,$\X4 )et8=M6 LN=@HLT\`=CNFāuߨX;у ɯ 3sUVdh/R9aYD|3=`C!5^FJ^tBZ zM ePTTuBu xPkؕ4LWACEA ^58DvM!:-bN`RZ7E"aT!Pƿ DjaMʀE"VYa !,b[L=aKFʐ;X+z!GpuĿ!xPu%LTܐK$XAxlDaP&.,#:%m\`TS@ AʠOXؕ8dKM7;آoeAmȆ;Q@leA1`DmIpCLU͆lu 7cN6eR$Y,Rdd!TF8fU:MLF\]_R2k VtD\wkgbPtL8؎ٞ&i^'v~wW7}@8w'#Y 0]P@NWAWV<Hcvh LJ$6g>(Vh}P'an(v~(((((ƨ(֨(樎YXihuBѡ'*i~$ \VxupZ&ex Y NiN(W(F# qBZ|\)SgHZZcZ|Hv]]Wڞ8"exG0 D7Pi%( *\$nDW8i_\kU N=o. cL*Z <,% tDxuj:V@V,*ſIVjWIJ6ԉlDm]EF[ $"!&Abu@D4 @}}!R"r1j"i20 `j)W\~E,LGM.3AW;I([=gFD?@v;;sV- #"umhE~_D4K=Q7 V\G8I|N<8DN =+vHjWpf3ڪg@nB\C)Ԗ @nHۡ,KLޡN'@̫E@ArWϜ(P08"E !Z(bGNlVG' eK/aƔ9fM7qԹgO?:hQGgF'@FƫWeLs!hᤊT( qyi|TA\Q)> \ª(!P3NK5D-r7OFApҁK,ڥg77BV-'#'@^Nhb.EG.\p%>r>-d.`%F-( 1P 9B0C *s H !EԪAĂV(0X\ {=(ťlLRz?(z A);S=?OI|IK#hRT0;0H1a$I,s6r1ly01,swNM6 |oLemgYA`MB׫N?j( 5HSIW]ia.RCGuDUV5 ?F@&GG -.c È- )x-i1X9(wker`"Tqi҉~'LG(MUd䨕ys*aHd(★Љ/܉ b8!vY[.8jY䘺܈b'Zbrd"TI栥;t>BX(2xʈhcZ8Fz :*e!=̮q]/cbGpp((zHp)F諔6RHGhnt"^B[zE-ń(xb!>/UY7D% I{J=;. t q .4  łpDqS -Lzc;T{! :XIX3 H`#&sP9x /q :-E@d"y_nY#&b$ HZ=@=}cMRt RDHaHG.J`56@ 086B{ ("'I@iY(&H wTdAޠ=$9Cc(gQT̤Dd=Q_kAjGiNմb+))Cft! (D:@Mk#&X,8!MZ6AKӚ?P5AP. uC!QNE1QnGAR%5IQR-uKaSΔ5MqS=OTE5QT.M9yU?IթU*QN\-K C-,|uPjMUX|58+9]]}[)+F$*RV9a۽%Eaz8|ceX+z|Comxb~uk?$Ċ|@f=Y$#R{X2U4mc j )p$I"%A'&no Cu[޺DH N>P ;Pb!HvGA G'`)[KĀ#6&楬A*P`—Dh{)nI{# 29Q^$WdF൉X!HC 0Rwq# *&NP` @;PP`ɈǓGcD0p-rAށed0;f!0b83YWMbk6\'LD Qt"OO$1=LQ-+dF=}/س!SVV/3F$! iC  aȭ琰h;YX:#$y^A"KJ$4cT M YDz`b"٨ǼSp{Yb9T$7T\ f8#4)8cSM"DGD`t^%r^"EdFTV%/{) ~ݾ4` )zq!)cםSDD:V)zеxmSr*PA>v }U f=Oq7C#c[!N=6]"^%"G% 2@hJw/+VdQ>7 TNbr{YRafC4Te$I{Pz>@o!DdK蒘LAEE/D9Q2 z!E ‚!cJ`´}D"lEr# Ёd/ Q -"Jhn"hDC[ pK / V(&V$"HPVh%fL ȇS$ b$D!"T³2Q"UlOI:ʥ#/Ih"y~f H|p#%*bS^>e 0"a`erI^Pv0|0 a]%&~ QӅ+w &b؀y*ā"r`! YѵL^R.1 (N4ްi #χĀxNi~f[$ Gg~f⦱q0+dMFP(J#e"zZmAS6"nF )+ bt2*#s#: QFn `!A4r"  -g#g&BTB2p $ Q\v|aǬ& %(J%'"'yq"x/@6E~PC, 2r`܁#ݐIr")#r!"+j'""/'{'&W5Lbb  D11=c!4X8(9`!DL*” *.'(H3 fb4e"br]6B6q"LRrh!x4`(j(A"#p ⇢芨HpԈh# xDp -A"320H_Τ3T)H"NA(u( &,d>#g,7B Ov'DHT   e#* Wn" bBkϴp *n!f HJ&> BI$T'JJ%q=I-X) R '4L?i\L'ItNNN4OtOOO5PuP P P5QuQQQ!5R%uR)R-R15S5uS9S=SA5T=YHTEuU5#1(J6B6BVqc?GXYuXŲ6@@*BV-$YgW Z5[&&afU0[uUhb&Wu]nk:` !KY986"^Z&J@ *_(`&X5]!6c Z ^ /Z#("Ġc=V k3i°!FG"8c;6d]N]Saf#vfebAbgp~ELVKGh gchb  $";hb`WXjEv˄U#ofVOZs"ԏ Vz "!RD!<1 v!pH7q Ԗv0F@G.A4aC)`!TbL3JVb+uauWeTlW lvwͶU2/&?w3ge`kwgd# .6zQSwSkxW cy b 4~,E<Z/b;4v3 lM[Di_؀yw1).X^x}/( V*~qD("B,,a,,P&0|h.ZC B*EkӦ K4@5 g؈d ]8)$0"bq|xY °.Ez,: Qb2%QG + W@ Mo^pxMڄMBcDm~V58G8tbu)h80ELck̈́c@y*H(yxp#G]-)>u*DDz!%G *} $2hg`|b~"H/ׅc#r~{-D!v}#N \Jt`h B!Nt<(t92ؾ^&"x^w[* GA蠤 ڠ & !ۊ"8"^c# B9 a^Y*e >2@ fj?k!?q=8^}'"c 6n&6_sU6 %[d h>""b8@b\ WMv)&#Hl jH <0… :|1ĉ+Z1ƍ;zȑ$I<2ʈV 9N+(icΝegߟqz c9g枤K>: K:lUpBHM./Ԩ0;pc%jО0a^Ҡlm~No$ ɗZ | Dž/@}NnO9pW?. \]5M6~Ip'a^$D8\"Hb&Bk'("  MSZ,[qgC!ԀxHz]?w~rTf,b׬?f\ziUף .dRP*62T9.HB9N=!e~=H3C}?p a(NJi"knR -1攀P!ԙq "ue!](2Ak"'xr"YAUBkfb\ӠAA g,>2ZrU&hKojiI [O74$_o m檼2UXId5I, hebm}ܭB9К7|XE4@XuAsp\}ZȠڬ-ZDpRO-i&QuCBfPT3Ŋka4OVPj7^O94[lWx#+ׄl> W>YFmMr=mv馟հ~O|S3ІP>oi;6 7N%7y#w28G;15-7"J{# O8 Ȁ[H>4@O.G=``+_mȌ?8ֶ5)=@vy L$H\ۖEs.{=S#U=ddF~fЦD4CAN OM NņOJ"s5G(2QdZQ rp)h&đgpX>ѽpUS^]yZM |?E?RJ5BijB x$b ӲDj&:l>kq =i~Y6CuHME*$]nir6  `ϠCcŬӨS^}tͬc˞M6AMͻøMa Ї*g? bnCLϾ{џGUh]mف 6X BViY℡($}"(De0(r2h#4ި@cDސF&u!,W!,QWH*\ȰÅ"RxHŋ3jȱǏ CIɓ(S\ɲ˗0cːE%NT# aIѣH*]ʴӧPU͞ u&ĹQqv^Rm ;Mb+q6^xFHKݻx˷JV+re`K0 kE4 J =r뷳ϠCM4TW)k<wX3N9=Ƣzm'ȓ+_μe c  qP` L:v8i`]Gī7cV!N#NSt& 6 Fh3O:3O8"mUӁ4n13PDBH#[2VŽ[h!~X|3 QPșSJDt̓D̳|}1T.ODT[9DI=P8TS6QDR_;)/!Xe.oYE4‹|b=l9wZOX@V Ůi!fflK a=(@ hwXj$ JfHPfqOoI? B4HEic K%Y'~Á*A h,!a2( C'o>8H+NV5vp2d7"  "<@t`jy"Xz).3nqE CER tq T:q v('$q b2r0&6%R4z,Mj%*A'qDdNԧ\ =XT2ވb}Iz3ՊKΙ˦;__HqFڒjfcृq%(P=xj<0}y J@6z nqjD}p@AvĀG<4Bzs{!ވ|XT' ڀET+ \3OPyG  -O[Gr;a1IJ YD(M)"UR?%791CB5Hж#$  \# > y OBv )!gs]"{ ?E@ P_bL*I@|p"<.@bQ$B HFk 7N8%ưUnլ-:~^)$7Qw3J/3(,BRT ,Du|1(EpU`b \HA"< vzG/Rq W( :A,0 H\55Fnx$''1a6ngR5k./R-V FS3TB0X0w1131~a~JaB 0r%&' On <"I&707uCw:AT^%xU@FtXwV5Zlh6! OO@x>hzS|=FB0ʲ_&>I1jr? ٳ$X$S(6C^ & a <!e[!GA,Oq̐V ƅn=5M5nl? "u# fхnG"*;%RB%VT60$&#?vDnFp @lU6k pi"i٩R_seog|8,%YRnawEH00"((*Bzr"@1_-IJ)h4=A'*#Hm!8˝<*#[I,"Ȃ|+Póm\f? Q("'w#bp⵳. 1P1e,WP@!R&/8A$ڜǀa% ,2.#f"C2&YQ,м,+yhY7' 5=!5ehOkHLAT:A?e0r@AL:;yIRMplJBmDƺLN-`AЌf:'@C:;3<(A3)e=:?E+m@F0I$e l8|c4Cʍ-ӳWҷlLmƑ-A+y?;A?AT KX9y()0YJj>-Ж1+t=D0$AG'֋mݝ|b].ADXQE_FcU־Mc!m 5%tU0j==utG:G8K#Gi!!EIڥtJJ΁c\6]Y4UX^{ 9DZ}\]BKETԀ&j`Z L&ZU*n$DZOڰ^ 4"1N0cREU+*+; 3@*쐮xXsUWdБE5ԓ@O5%u"K@>_9pT]+=UZ!55}NȔn.'H[uRnGi[FM4]=ݮK`ӸC\]Е#0rO%9`.Doʢ^H^U%Wi?m q݌R|aٓ\໘ֹ QTP|m;&aq EL/ _[6?o?_!@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^ŚUV]~VXer‡"@)]6(K|bF X`A81/v9Vu!8l(nq߆:Y<*A1J4ηqp[3MaōGn[=zDb%ϣ,b=sdp\=J+Ձz}_R`1l৾M #@D0( CDi0&ixb <3 1)&hrGvM*xGs耋cB#" z돢!A'2J)T+JzT&2K,?aD L2Dꉂ MB SJTh ȝ49/5$5TQG cO!PxT 'HYe58o51\M)wfQcu]Y4־RaZ ©;V$zAM ȁ H)[M!\HE8aV.Qs\A`2F'B RۖiQlVQF[>XCp5r zN>87HgX`Mb(zaA&laE4j8{zuN&+ڧ[ e@ĂwKq'7t.֑$*:>!1G㜰jaj4-6Ƒܶf9>xᇟ4!zF`֛o©8ey*>zog6E7=9yd T/&-dc<$8A gm#޴w=ꭠ5ۜ :MqQB,h\i> ~RS1[0x(GhjxOY`;"XBl@ ]ފ*F6qJHHL\7e O5MP{~xfR.9M6JԔ Vbbt:>}cD53de9KZf$mV&}" ǾqF2) `4O T&00K(Q=.Iuo…(D 8 s[=>uҒxX_yjO~,bjW~'v$H ٔ?rML*D Z9)DRX5UzzÞw4Lb @.q "ڃ$IA  AgP:ԧdCA;1R Nsb >`rQ"p8*]*WIHqJAV/(j VDOc ֙>5 ThO@ىDqA 'Q%;YD?Ђ@#RPሠ@O䭪&߬: eS)㤟w-Eu't\ 3UM=|%%|kA)EƼz0opK*!\RY&&)Aa]1Io|+ 5Gt )R挃wgj;3w@Hh*SJ4b@(4x (zpFz iէy0|9jύQ+(ƎAùhȺEr! iUȜ\ .fvd@bV9cι \B1 !D,4og%8A~-X`pGxp7_7AOC\bpqB6 AZ `a"3KOP 5.G!@:TV}}K:DTEt aOp1} }cכ6H ZN_Pˉ `%db6:N2K ՉҕaȁyjQy8jy=a@S?(@vaȑz0KhwM^0#! 8%HeA9 ahqC1"yס(\*H"H-cB}+ĨJ׃@C*D>$!spx8L* lcHs3r +AM]HXjH*8)-l@DzXzd2'AN|:(:9D~as >S" ;ixn Ȇ>IFw+8!L /WKTjPhaCűرj9VE!(_Xp`sYh$xphuc(!^#[ǼHF s2 ЏaHiGكdrD /bJ+<2@oq6t)ȧD<,HnO|jB1 `UUlCdzE6fzADo U2#My%HdKi f 74FDJjB-$I!VdzJT˱ B;HiKˉ*{b0,zKNJsL^jM ՐP?d[P=0,p2yX"Wmec6аXY{,z%8ٕe؀Yx t֖ٛ p(ٟڮ04@8ɠEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲8P?8u[kS[59wck<XP"B4󈛓!8\duܦ8J #h; rֽX:݁غ":XK]6#pZp][5SS%=5R?| n_>t0>Hއ ͱ*n=q9#Sߑ=+ΝTwNH պH_ق> ^5 0P.54a`?cNDcҩ]ĀaWܭHF3T Ɖ\DyX^֨L A$#H61LxCWMax  ,D$7J)V ]_WG(ݭ(da4,!d b؃C9P6^nȱG.p9(j5$$`"1Av]q2HXMa%CMB;$^zg. L fIfJLa>`1rs\S:`ګĐz` k8є9FM&q$FhƲ ǁ GO2Gtlyz i.ǧ<U wpʗ땈Wj^єAւ9Ma#`A#ÂeCQDV"DCĐ+MՔv4N8 e"DRti齭0X#6%#NPMQ F@1Dj5[d=&R 9KhYPЮKKj!˔kmKxն0@'8_P$' NKpF]C>zLMtX֔zDZA&hb̞M a mpބxMCofrmPq(_'ff%N ДikNN(^+ Zn6k:[^0Pn9 nrrFl$aЭs6~1n"t0p"MQjPPjk,-_:3A0*Д"qIE]G_CrOi)j9,Q*ՃWpfb0s@vHj)GLH R&'m(nJj0'keڲ u3ubP$]&}R$OF` w1^ t0,a!`Gx@TTDTV^d HeI(Xz i"yn@! wkEP0H+BSKmvwq;T[8R'ZU<1m8Ts`o n:nGC/Rm@vď/9O)$zGi#thCK`Yx!Q~!((&)BB Pspq@h(ь!Q`Ey`РCEBO ۏDmQGA8D B-SO'Q9%|V4FBÊ]Iњw"'}0P;`@KHSARh3b:IHϙ|zuYeDt$V!P ES:FPZvj'U Ď`CddcR{1j:ϙP%띹Ҫ#@.D 4OEz B<[ +0nCŔ GB0 S2qRWH0HgΩFXTA,dQP -1N=攀 0QKMԳA"3 R7j}͍Dc&y u&f83G,D#Ӆ@F8}euCԑK>H+ %B}#Fu^.8{A8@]\~}Q3lDf;tq_4[=B;(}@Ѓ }Ϩwjե4}I{ݲw" P )‡u ~ RXړ3( `@x~0ie{W (CExCs 1Y D q TA<X%2BPAtGH(,.phnـ;$AcN.TGndH a :65p5)K ̀FK-wOG Qz$;֊H0\Sԣl2I#'n!LP`x')toYӆʌGO kƍ:@'ě< C&01)Y@!b@S'| I@J_ 黡-u (q {As'wFZ҄Jb8B Ta#e N=f `񢨴aB zѭr55/i - %jЃ8C hǨ]T9PF?gJ@6 Tw83BQUѣhW3YФ YH>'|`%Ў73k>eq-Er6t$o7+BJ݋qI2aC ]Rr"uB.w+񒷼=/zӫ}/|+ҷ/~/,֍rFbER{\a L4X*򆇢It IAbvgٻ;l8qT$`Jɝ8NȊhgHd\7"±ub1p i .i솈,%8*fJЃeh˩  ^0)lV kF=&IS%)X5MG "46Ae6Oz)@q,) teكԋnEH8l) +e=$ik $NI,$nIG-"&l&|;D@TA%ڹ̝@ @dKU˳nBPPn\0\QpdKdR@X%pD Jt/0[C /8ޔDɣ)C+Df 橉ML2 /i'EUcVfPf71Jɸ&81 aS..C؁@$CeYrC@IE_BH7 ׄ.(1pԱ.YqEX2ԂM$`t\ ,,nD.  Mr2y`2.P8aL V)+ QaA)2[An\N֌ <=23B@w83ۯI*P/ "j/DvNG AlP?D #F7+4V2CC78.[6 %ӹr #C Dn3ۼJS[ED`eBleWf ,B+PG-1 f3DYc%`z7dv[;|onO/ĐFk,_'OlĽ|A&raSn#ijf3AALS5qH7Dt`R6$;3KQ6q>9]MV] &4yCp1"7FK▉G);xH`w ڧEhhWlTH3(C(hB8"Jhe-m8HȁO skp>ϫi=@p@)楃@*H)Bp\G X9"lt.' ^y9BjYU[ *J9\oBxja!皿bm2ބ*EtVcCAӯ+onk;'/;7?;GO;W_;go;w;;DźGBllyvJXD;D!zI{JE dz໻`=S-pCȣ;A;hS y@oI,2DЎ*_wBw|CV|;:C-4k ;y#į ;GI|KmnCYw =7||/JB<,)D<![Zc ҆l &sn= roל@dp3CH0/qe WK,@XW޻y}aC sG"049w5HH@[ȱzXL "`d1-dCiҨ. ɪ%J2]ٴUm[oƕ;n]wջo_h"2 4 !TȆ7o@%:)bڃbĨ(BPࢀ6wX!H1)c!N+$I K1z RV =!"i(XX0X"GL$M2ӽ­mJ%J4YKA{W}`^TS%6tHU>`fRzġ RikHV#f⏫R/]zjaQ&2\(F(ٳj#֘se(U[(Yrb_VX(qI߭ޗ=a㇬}"[=8 !G2{LoH!iB䦳nE:qCs;Fi \Bs(`G)GLd-[L`yEg2[y߁P@`EjeD`YH1cJ!BxR1Xxf՚zx'lj(ͅJhfz9[`Aא'"z!ױD0A nLbĢHCC!-?$z{ذ#`!‘Є7 @G&9hH їդ&iaCq2AAtRd(:oT)QBgeҸƆd| 1@A=}$a GsHTE8؈E 3r˩Bs!z!B0@m!_ٜ OH @8zfRe?hCtn5a!4 "͆Gd4RGq4'@z^@"T%{n&[H:sNJD(2@:P> qv)(= vXˍVC %ڨa#zX!8K#RsG] $ ܅VH.i-TRFI+ @i=ih]0u i˅ Đle!%¡KJޱ_;Nvl[Z.5 6Ep`I@dKUh%8񞷧A uz.#8\V}Yx)b-p#GCLfpd 8<Iff [).Uxğ/|JQ LW'!*PB 1RBՌY%+Q 8os7WZWk!Q 4^  00 ".b(v@pcR:!.j!R2O%x3XA(s!("%!B@| Df)lv:#yJJ,~O :P>0☂ARJ,x4d^/=h8L,FbM԰!LbJn6q(b3aVf[r%=: U҇st,QuKN ULk RJRH.V4H˜p`1DdņQhpZ*`(nnNL^ '. ZV+EE7lxt p. #!vq$zp!R ?D@Crqv"@ 8 w ,(%B]RA@Z |@o:mYE& C/φ"ď!h^-)`>bjm`&+A+Sǻ(dG%RFo&06(XrC )vR0/$G!r!v% b8"3qd`x"!4E#+rC"37,-M8޲6gLR1z 2\!*0Վ2:g1O%1a3aR0,>#.B% V`=!<"6m r6s\ hBƋ-%>Tbr:"Ntj éS\ޡ44B*C77A@cR~aB³ឰ;T(?⧔)`3qlQfGrcLqhj-i6sIWQ""dXp Ђ !:@j3fOT*b\IVF*8 ' F{dꡤ>ԅ"tQJON ?nI%&[2NF Lr 2(: T)d"rPb@1Vl/`s '5W&]štuXվxk6#Jo< X5ZoOӸR&[UL !x[\5]u]ٵ]]5^u^^^5_u___6`v` ` `؈LWba!b'Ub?U'b`TUe DcL8cdeɚ !\bAbbQBc+(zVeLZhS2Ivi X#DiV_{ijklȖ @t`rC.8l7"nnq/t:'Ԯ-@-i!PԢpp6$q&pqrBss"&mtt)ADyBbLzu3u/qp7h3(Isaq#z w0Bx_,@qs/DNJ@\D.!6`{"{'{wvh lk!7|V#h~pSޞ-rpwV}W-yXW-X-.x.-ifb}WY"bGq2xsX)*zyB!\M:.x|C:V8f‚r& .+kC@fb౎8*h隮#$ 8eF!"rn!8 9U̠n5!" bXjey!y"v|~XX!%鈪!f.ِ5!xq Oy!$8"< :X!X 5˸%!b9!g9y/ YYJD,`ٓQX.ĀB*_-Eb0j2!!d"lB$>/X#gXc5ވrN!x7'4Hf``5B&!$O(V`=&ZHcc(4TC(n&di3/c+7Ze:Ͳ" z&:~r/5Zob!ZOe(z1ORdz#:b&B!ZfbK"kj3ZKICg:!Z!"Z#X#@1Z/Z9m:b;d-neA a[%dm9<:Cjz>@?{!I`H; bc]V51O ;<:t:5ЅC~֬![<5W"ۻ-,c aEo&q-~;[ !{!|5#fw4 !\%< Z)P#3ą,]י=ܸg. F-h4n AEy;/(/[#:Cbf6j.*`O$佽*sf"j(*s){I"ϑq)χ|PIМK =h) RP4!8}!7)$Wܬ ӄ |\W1[]x! Y\a'(4R:(L v,^R)LBW],V~!N_8I~盾yER#T5.xU Υ"]?ff;NNGٙF"e潙b!1Fc& Q"+%8gRau FLM3gh^a|iޛk9e-{҉!"+! :X_z*){>{(_?W1^z_%?|  hA' I98ą-b2ȑ$K<2ʕ,[|AiWOΝҀt`zU) ţ8$9y9N(F"G TXZdE: WT^%hQ`gnQ qkB:!bGg8ċy!_gEm̜;'n$!jp֋`HQj]O;1Giƍ<+/$v)f8ehIuE0ۻ?U YT?ZA 尐a8eGQ_=ǐY\'_켅FE[ E\LaHd T<Uz}~IЉ-]V "qBs_6H]FD`oi}5ER>cH[v]d !)vߕefJFH94ِnРB2j_^ib=O8v]=EvGE,; P 7Pme*s!]d·Hj:*Af:FXs:ش #*:.-<9B$TayHPҞZ&A %A˦;лey{9;ˆ*AԘʧ/C4CC,̢E pY nY;R)8ey4H=TP'F;=C3TI/iV_u֛RAO=H0))s033gBYAuBb]i,@'2;φ= n<(&D C{M9CEZCOv%9Fi&ޑ:';t܂^O qG _M=t08b;]6/J~LP !CoPgзrߐEOw3HDd IGCRa/]EC2@(X jm$, Oxt,;& NaP {h :1eTx{Adx KpqYэddxQ" mX*r:b4v0b!h<'ERB(F2vC mXGA⤐84 D)|󵳀63q!d+_7RRAȁP8q#}C>l c}Ɏ562yBJk ` IlV333}h4i d J < lb6 1|Vol?C+,(  шJ=H)Xj,DZp a`O/B!'ne02Q HLXq(G-zЀB3#f16VJ5@3(@T"5KjSCU"SUT$8A7lsZ>q@Lܔ )9!zDQTYɠoiYPڐ76`BJOƒ8^'"X>v5CjXH6-mjZWV5Im>*6 HhK"!0ZD&L# ).;@$˝u$]B @6& Up@]ﶤVLK< * VƔ&K_ v~W*T$]ɁW,8oyOd!0{GYE`0$&vUx4nj< yD.|vcn)Ln (KyTL|+Wy\ 0ό4yln 8ytZh AH<* ,$2{H?"@0=zP ,7|&`g|:?jԯ >:{? q~≟$GDқE _uG߾G>n b@'@"P~?AG{0:{7nlrA@ `mXprlW 0H6x{L~Q(Pva k@ ^lulx6(e GoW . VgHoև (ѷζoװ=@PXSl 8hj8xy 1rn@2xwJ/j0^jЈ xxxmҊ€Go v P1La( @!p mA`b f˸øm88P(qGъyVx @ o!"0Po Φb*g׍ cTGL*@l7PA іdq§ \FqG -@3he)C)Ps6 xay'dž~ ug|, 2I{)o18LkGy piSi qZPm`vW:r堚Yːnі\!tyΦ|i2ilG é{Isٚ8M{O uY ZP Tf1V$#&^L7*;F!9)21r;G*a z^?) {碌8顢&61 Amp6r(2uFm v)sI.1:L1fkGn@Рvx\'Jzw2Y oj mWZ $X? }8)HzwC9j@!h3uyP v6Jʍ_KJR0km m@j-H{({l:+Ipgy ZSڍ((x-zyeJ`zgتz JyQЯZךJd z/tQ!C6 l=){ d Qq׮d yv|3!u^hY ѳIڗ@7p ̊oƵh+-PYEG[jei[d'vGm-P+_碷p5A* z8 j*/@+cH{{k= jʹoko˺S!,W!,R8 H*\ȰÇ#JHŋ3jȱǏ CIɓթ\ɒ%ʗ0cʜI͛8sɳ'Ζ@WJѣH*]ʴSA>JիXj݊5*P`ÊKٳID˶۷pݪܻx˷oú+)P` +^̸qO*S8Ƌ˘3k duQTLӨ~,`tװc˞--ͻmv /۾;У]NسkO Y`u^oORG}kO޾'& FJhEavOm!$hbN",m#(4J"k5@cDYF&a,)'@Tf}!,W!,QG H*\ȰÇ#JHŋ3jȱǏ CIɓ( [ɲe˔0cʜI͛8sɳϛ.IѣH*]ʴӧ JիXjʵԠ]ÊKٳh~u۷pʝ[vKx˷_v@X"*^̸D$H/m~H̹ϠC#2mdͺװJ6MI&bͻoSȠ ȓ+_!i;xiN뭟 /fËҟ] jXϾT 0f?S6'X|?}6g5@hW Y [yWADn"⊞iAmx"4h#^@fBA&L=WCfTTVs_d6Vv!&Dx %hDp)P\iU!|{))7&!i!,W!,W!,W!,Q I(AջzļzLV$= ϠCM&ЧA dֳ1\tNEУKNs<*$DڷC`=/7`De-ClѠ{@2I#GyPN  T-A9f݇ ($ lF'<@< <8 Q@78ώ PϏ26P!#2O)1O:A3/ƨԌ5^$DVKzKHS;h7#CqƩ~C;W ,T<٬9&IGzWS1(c⩨ꪬPMPx8ʱ*tE=ґz*0Af2 ɤ¸$$|q[L:Sf#yWZPFѣ, G,H+y$G4 U4e"$@iJ 0Ѓ/ 8JGRԍ#"-ش8gpZ(KIԢla5.=UqփV=Bef@ըư"+lSTZ.1(.ʞ zku-ba5%BdZSHV!/dzz,y#d $T]4H^Ī&Pz] )BRRL|wKQ2x32;񐏼abϼ7y_k/FGO/FWֻgOϽwOO;ЏO[Ͼ{gA~r%O ]sw,'z| xbհMN!w8Ae G8D~N H'G$>X Hv (~,2e T[W5]}09P) QSqz\VM'(q ~~!K%؂RX|aj qY |DŽc2s O@-@XWA#@r1n3fnxfh#J8|iCl&# bZPpBb #RB%`%XZ!t`+ Q NK({B(gQx1U@4A5v"~R5UՅ. Xi&燷hro7Hk\n1Aa Ga-آ--F.KaT/T1IK0 iHk!McowMeqO J 7d1`ؘH `$){ k76_#67GmQ0szp5YDHP@URi###69@*pr&0 |EUVT4SEuS l5H葬hgX|9{n>a_ MS<=[bJ`;c ?tH@@ hgE+Tz9|D1[}H@pꇗԘ#ٗYz@D`DxE6C]w5i/$2r6qD,Gt4 0JQ'F} m$>@F@b0tqPt l0iIizRqBuqZyz UqK)BEQ$L$DMtM9i$&&tD?TH))GQDhPϙXN0'ZsfP? cJhyQU1Qq-LJ6PPPnP`N(RR! ?0Pte!U5-ã9J818@Q)hxizWnEq7SaV@duE`jWAA6WY}U H$'4X!yY1$Yݑ`Tu)aJ7\ܘg5=` {?K\F7 oE^J0*ʨ hW@A\1tv>cFapq fRC:务yh: clO]Rz#y"h@& ba$_bh@[ee e%p="$XkVDgHPIeFz!&,@, $Q<2YmB0vևiW84[Fj\+!6 *riZѴ+:kklFF0#N T3lKg0FҳC֙01k{ˀ)ԼjҫnW)<@.J pȘ]@!aT ѴK^ds9s1]4@LW p s\IDM` K<xjv׸-`8Twyw QTXPY|WWW% FМ{suwHLRyN8O"TƤAS4@FBHQJ^U jخýT 6e$iq`j&.0p:WP`(t܁y;j7fsq^X5!0!iЬj 23+lBmي/_ 5.]!9dѬQi !q !5wS"`QRjCYZO[`A3y1P./:e[eRFUg6.Bc:.W+e&oh^  5R *|PaQڠqQ[*Qgz@_K+>lVKqgA >\( =౫7PTD\빃IČQ"ASMmpRO%U[TRaZx,cABN%ظJ2*zG2ߠ9iW2`h:UzW,!m ac no06_}Vd >~Z Fa>(Rx!:Đx%ܯZ!22_oh󕂡*ٶj9.c@+  '((#uba,M2R*"@FS2b:Ļ*hth `(j0:2X""s%k HJXjN&tFH$axfRdg,&asثAw*2.q'w d^pL*ȿ]BA'ag,zJ z9ZrA*2*³hAtT1 dpA|Pb)УƻaeBV2ǥD)Ȉ_H3O{G 3R-$ 9wPKB"kK 8.26щzj 2",c ➺'n!)Bi[Xg0aB0b :B kHcb+bFg+_FCX 퉟团89  Hh.r^bLd,BB,9sc)k!0`-8\F0cQ@~pdKqfY#@Fх!D"z'AT:z\9xWLn;H0糇C XFr[jC,`_:3` 3蕎8 CA:Pӥ/:Ixd\<(NK:*f9f=0c! $8d$"V> ~X#q}r4ܹz\o+dw0ZNYT|!\ YqV8%z1 CH40YIG*T*5zz8r+5,Rz`6NVē@*qwOV+D`bdkV5Fq88iֽ(:q!"NEX1<*p} GaYHH.JCJ9z"CveAB{/N|u$@t[X o*'d W)! ~EϱR"g%!CaPw}Rh @ek`t_\3Rt7&@"OWWzֵuw_{>vgG{վvo{>wwǻ*u)"y{+T5V: `! TPd,jאCVA¡ ?zF]k ; 걫` !p|gsn?>DT=/\ǺVCE8J ƣ$} %5cC~.ז|>HMɖ#}(<)@E[>< 8@3&!L Z;KsA#>?s\Л;x0P{@0D ̺;@ع-AЉʙHzXƒhB0ȈXB;&+(꩞%tj0@a9 #pH6@ Lxjʈ[C5<yY(1ؙ( C0C\ēxzXyòBPAnȚ$H::h:5J+dzX3a`aia(8b `o@nSwzH9&2H$' #3B l#Hy|«}쉥,{<#jpQxXJ6)H+IA k]4:`GT+muƈ+s\۱I@eZBT%[%#hGB1pL=Cz[<00t Ix@@:<Č(z'{:|'(**Ƌ6PB j+O0̤?x z@X0,$EԾŸ sUE/sMɑ˼*g3h ̞.b쉟 NrψتJJR<<ǰ 'x_p$tL*˪rꥎ(bz8Џa*%=]M+i+x4 7J]L2!"u,`! ج5=O0@S.Qό 6LzO8.(%P@nsiR.M7 %N2.3B6A!1U LU&EuKZ͒=]0Oƌ**CK (%#'dTGE/趡;LQ RM]!0xпa]E1۰zМ_y#9tu?v*.\xi}+r>4(ВBR29* &SzxҠjy9nwxvRVVP]=2c]6 Fi%PtD> ٌY#xP2ףeP4Q;P$վQHҠ4K#Oxz %ixn@[@'e n*kxHˆpE4aVy"NZKPYW 5J[@PpWi"%Qh鷁@膅8-okFqC5:u<8&U2{Ȉl[- u;]*N2΃}di2W^__4 wЕ_,I@Q ;ø(*XiD'X}; - pA^` ޜ@#ᗃ 1#zvڹq3aaຈ9|N6{ !N%~)-b':&+,-./01&263F4V5f6v7c8c` ފ=>:%23B q`Fvd9y{΍l@69OB ?@ON]l 4H΄eN\FQVz(e1a[݊C geE f9=.S}fOdmn8̊"V4H^> ReQt@,#ѱpm֏E*<~FgsViiƃNJLD JŽxjҐy ܮBΘ_c0AL%2e` # Rv |<N#^cm<D#s̚k{kƬ5JNR!tYm6 sD9\F侴̃HbcF վB|FlĶΡd, ' z0' D YVnO> qh΃ +B}(nvڞ#ތ(T#zfSғ2Ҍӓvƌʦ1b0TfeyE**"E6_> so+:C5 >Ҿo?Rq,:>W ɂ ંp¶~&R87?CP :}3K ߠ?ln/KG.;*st )6ʓ N h0:T\AHHP+XzyL/wtVV|0^a ;K x,9G_Fy-#syESJáYTtD}`O[X^IeG ׈߃d*g*x r^Q0SWW ;nr3H&sѓH`!@l qa@B?SɃ?Hio {$viVnբό !E$ Feew.݋w7y;B_y; i9]pi.PsZ !yHj)8ɐr^ t=O`kI{0hC4쓘P9i!~aa|Ň| p%ȷ$'7GWgwׇgc/ڗu~ !M kP)P8u^N_ }- [=8:p9Z^m:L&TmhA!F'h%Ha ReZ6CA Q%,$RIB8DI#UH:4Rh)2*ђJF7JnB1#E{1n i8nɎk @-jPZ P0pybZD*<ɐrk8+8Ymk18(@l`e`̝H d$Ԙ7 5ɣ9<r>5SUծ~5c-YӺֶ5s]׾5-a>6e3~6-iS־6ms6-q>7ӭu~ˀ j/]ox߯,qzOu"#<aF.pX܏3qL"P]_ F"U2 K%Q=N>/U.jT"a|$pAц"6$l|HҁI(27|,jLuoP/milv= *O`$I[&I>>u;M~sYzk5҇1%IPH^ߺR+AldPH[u Q|Nm%b(Kwde Le)|DD>ig xd ̬H;-ψJT]Ux<Ẽm␘>"0O1ណHBTȅԞ~;JPE-XЃD/eEWF8XWUAd{=IМZT0DLJA`?AQDPBDK5Q mBC E%A8 DWT  D) @K[W< lpȠFPY <.T8%, W bQ+ D6aiTAP$UaBU"h]Dƙa%j@P ϠP=I!C PUA HLpB E#GyaQR@Vt\@,jȨ";,PbbXDL0\/N\,cAטV\D=T""3vJ0Mc5VF81BTP˜yXCWC #L;VQA#9FPDPcC㥔4AB<$|N32J F"5փGlP}ftG6dAl$99ΣC|C@$\LWMRD Q/ @Uq̕Cxfٰdrj /WDRi1qHBk'lN l; GBI%ZS=S| G` @(DJ8$pF&m4F<'D@PM'|Nh7vji^JFW=,x&J RX {F<(٫N,V^,fn,v~,ȆȎ,ɖɞ,ʦʮ,˶˾,Ƭ,֬,,1^-͗AHUI,(,^@EJ0 d Ҧ-(mAQNHXF^ EBͽ :)M71Cٔ7S8ÖC-|Nnu-]GԢo*^m=ȭK8BhmB0j<,7H.tsn>݆.frPXxE)d @K=d ~t8F%/4KcPoLP@ ݠekD^!E5/׶RnFoFJ|C7FzpmyhWT&bd؀oQ}CpX~@pp~GD)Á hoApmBlH2~&_=rw_( Nɲ-quR! bIs ١o =IL &8^AqCfB@ DDCqphA:jЙ&8D6_a8hD7E E\"Ppb0K+!ٱU Ѓ˾dBfH,C-ӯmP@l(G W` LA(Vo=1jD\L=$l憃8(8S<*sPD-R@2Q=\C,ptHD،LJ Ҝ CDsTtRiAAD׈CHi=k1:Lqi.l;+FPM= EC3QDlN(^,OW? 1dyP4$lQNRG(d$ldQDPB oPQ8h gDu VB^CNhClUQDɬ5fD)5ډIG5aSqn|=@$qCTaisqDTaD v W n0pcE pRjbFȐMt/W$NfexoCQgWR;h6F3']BdA@an{|[oPzaDB=]iM;D R! F8LDxLtRfA:t@D'F0L}V[R*9HI/Tm 'bF0"Y t 91ewão4]3=pD_:DqXK; D{jntA4 dA,(f8(SyJXS=CEC'C 3FňGA(C=W':ߧADsFxk̕ @fI!@hzJRUމ. @5OBY@[ @\: `{A ᒃ,C;`MuNSm;$gV^:Sޘ7d eQ)&P `ٿ:l)mٖJt$K![Onjŧl<9Vpqy9óçA@+X( *DzŖa8Jq)Avvh@WAfET)c,*RHC5lHԣ =׍=)N<z:ĸGwTy@M)3<"ep=v_p\^ĮҹvAEDp q-Nk8x-lOʄВ(32E3D  ??'/?7??GO?W_?go?w??ۼ[-)1ZE^?`x.@8&TaC!F8bE1fԸcGA9dI'?r)(*!D&4w,88G"8iܰ0u",RP3BjQ֠_;lYgѦU>osfI>Լs([ K,\,1ޤZ>l8PzY_ϟA=tiӧQ2˰z8-u+1q:8l;z ̌s߉ >zuױgZCa@Y{_8%l>6Ă9`/LCéFc([+Kϻ 1P EiPyH`%f 'yY_<(yJyh ?WI!K4z`D"OlGvF1g.qgw d-*>XỈzڬS5c9,CMTQDRͫpމKnLyno'M;ȇlBv -'\UVZWU H%N'h…%xVeZ k)x 2m"ƍh@Wyޠx(>X4TB*5uҾ(DVve67O 6SD.XI`!+#}7'L'>^u|vޫZQBI7 N5(vRb)VnwXP eIfaTyvJ᠝kh['X!]l+1N]Yo=z@bZJpq,yqPQ4 d%(7P=/N|;a8#B Rp 0UBA z uM@b' Ȕ$c-o}!]6ќf&~9Cf!z#jgE@T@egtRυ6mfqd!iIOҕ1iMoӝAjQԥ6QjUխvakYϚֵqk]׽MAԀ%ib-6vGlfCWKuz "+hfhvcX~69r qbNB]oX;-,6 6%GwtU! /"ql8NX|!o50_YrE҆". v?1+T`6~FK#Aű[k:ȗ/ )F~E. Y~$*PeEzܔ"y߇>c!Ky#!vWSzIg`9rp!7K@ۅ7կA$VN4ؓu 둙 zܝ9C ͫ!χ1WS#w{_ [}ؽgdovk!_¯y&VE\@"( 0guāH2DI9VZfbJd 1,B@Ĥ! b 2p;/Kd%r`VTaEIX"J@DDP=fpL:PGYnF Pp" Od!NPHI  " 9k%VG !p Jd dG ~$HB J"pIH z!H0BY0Z P] p W [-N0Qװh !0!z5 sKd!Āf r)g$@O#1YgKdFEb"ZZPXXdbEE !FnHB%Y'X%YLb FK,WbeVΰ~%RTR/?hSnfTq (ATQTq%nQ"[UbVG!3rTB# "q%Q"\Hd%8 `$X'QVr#EܬHQ'GR& mRrZ!G%["܈%q '7E#%!r%8#1R#%u*+F.[(Ұx/#)ɒ"rY8c|e"jiAsR S2) ,(Yށ BV`kbpL$ (K+K^fBs4K3:$(eVb\ VcAc84g;@HLBEer +g::s ,9SdK<=)5E `t:K0se.a8s(k <3":3?3!dS dB| vaSn5W"6FlS@?;l-@"<bB+7EB>S!~s?ϳ?KD3V%6n&2&IAIaT376б&rQP `@vZA'K%hp4J`%:K]Ђވ"LM"N NgE &"vZQ_a'yYQ\V%^5T Vf[_fP5n =!`%UYv n g!`%A 2!L@Dpa NVei"kuk V [oenfl"m'guI!Xc("V $+'ql Wkl\PT 0X(3d2*NC1pOY"?J g0Pcu!ad' ؈iWLeYWDW=/htdss67gwbyTiF(mbs3!>|W 6!>B:UVkDBV{1ritWm"}}w!w2W[QGeCtW (zn@F"ZO J"b;X>8s@Es]X>H7*>z Tw X[8K4v 4~H4/xyԋwUz'7x}&vxxOaWfAB~qꗏwwm٘(%{b_!z]Y%*2$5s=W"Mx^V`iX` L/olM`.e VRYv |( b9_Y! 49<;G+(*rc ykf35!Ҹ@%y"LU[Qp! " NAW7{WU ٓwn噞Gw#"[e[z!ٟ!"CbB . b_5 8K9Qʇ`sL*a* N4PrX[/\ V]a"5y ~vuBh0`icd"7JJ!2sYz ڋD"!BTuzQZ0^zRc)!`YL1h lٗ!ZBڪ{²q:?;Z3VB.~;bBفm M e$S@r8(ɑ  &;. bF/Hcx1&p .>&XzyUu.D!`xٻ ⽯B!' [ SmJ r #[Jj%[!! |!V!_#:湅ԏ:K" n[!JN|% tU<G\;S"!j%J'-`$ʷ1b˧ҷ U4&!FEA!`K9!![+[|R-wi-᪕脴1}</4 _2!CUYq>N` d}#|xg%8KX+U^i]lkv>ݒVHϙƟ| 4]=㨽]wCE hy}}Sݵգ> }=i" g ! 7,H Y ͼPh%! B0I9LX= Bu  w &H(_K l `r FSz[« "EaBqRRuuÞ%՞%~"랻g~%^y~u$Wb@* s]  $%?t]9l!tng^ Z_Ba!&]Nslg"l|6l!mb(:!0Y' + L>"Z 9џ# V*#1B 8JStɲĂXĊ 1:ر,N>LLJ,[q"L#KcD<>3hȘ3#QF } 5ԩTZ5֫R 6ׯdž=6ڵlۺ} 7ܹtڽ7ټS7 >8Ō?x_+[9͜;{/ѤK>:լ[~ ;ٴk۾;ݼ{ <ċ?<̛;=ԫ[=ܻ{>˛?>ۻ7d@Q+v\A`'`!ORO=GT,,XQMHYHMvw%`U`Iy(R6OҠ(T ;0!`3Omp ;@oyQih%AY%K"\a4YOibRO8IyfA0(TYp2F~6KPd;tSPPg df_5b`jӥg7hvZ&flVsV;G\ rJP1̣S4HE4®FZTfFlUYq*^@0ѪB+Ҧ_CZ2a+4DdEcE:RD4 N= =t!#B/좿,Ǚ؊&\>KG*/.V7‚l][,ɴLwڂ u)i_(c;фYҵrM**;IMp)eaTxO3zd]lqA'  @ge a#=( C(% 1I84:6`*23 BLJuwI@ `W[R6(Yv`T{LE=AR 2hT"tϋe3 ի,v,TgկjӫY ;=~u`[ϴV{V,=4b(Ƕ40BP @P!ljH%%J{z( .ZA,>  0?5lŸ]Hzs%H t c3 gGA.M$Vֵf0\iC5b fgE+V޼r~:` >X#5?AV >( A(Ql HdA>+5iNĮ@m[?PmnRU|n5^=(k.yР9ty-v=Ce1)>,~˓e$ymV,BPG >1W(FM1aT ְ@8a-K Vn)\ izmka(BI3zPvB Cid’Ҍk;$sqL9f[߸֌ܤ^*>TA򕺍gx G-ڃA0%~]8iEgIW%֞o׊_5 .Zw=V/:"I$Pԣ bAhT Z7 A~z }Ķ{=N[qn:w&638z]+[6!2*tF6xBT)PxSxvH qTEK~gL1$gа ;hpXNz d GD>ij%^@Za qԃ5ǪS=z=lW۾Os5@w'^{d3f葾m`xBx9_C&P j/5&%2; >YHclP G$0Z c߽ $2&B@JNK>`%# T Y#Q~T@JPY_6Mh^5w^:*]Nf^Z6zy=CWe){-X -B{4hI{Cp "Rv9FHB`G @{hda?V5[%$ZZvP `=b@#@6&@dTq! ݐ5 [TV5GA @#0Y1EZBu9 h*90>6eEDGm&(xmYtm8_2GzW_EkYgHs##؋Vb=@8pC > @#d]@]@Pc1 2g `7xDi0:eUK6ǢGU(p6qdS>~bp1-h3VP! LS%fmfGF]fItWEz}%g6;0Ї F|1z߇߶h]n0>]GY˟O bP Xr@%@ԓT=qeTa:,t&J)(Ae{ߊ,0Ƹ J}FXPҐ!C9P 04ģbd@TePЁhSRK09 J!S,['Y{72ixgHNc)hr^u$j*T+X=̂A9e)RpwB$3Ϫ.TKH#Tt!8Y9@bNfԣq(lAUEES:XG+= P CWbjFA *6p{ U"0K=-#<](eϟSɺ `z+SO :Q}9u+)3GdJ)-!$X6G]hTXt( qY@1.`e˃ĠCSC"*.A)6\W=0& #3G6P;UĎ!lI<|j62n@P9(@-H<v=`g탖Q6@ +!غ^,gI˒р#tyzH0(.8q cEAGTD[A&=Y4CQ#3dCecLV2Y1̧>O b,ctIz m,WB dc @1nfFMi҅b# D#A o*9# MոQ:+T JA>QwW,Y~H%pρbTO ;JVC*Tx,PjFl ;Vo]#*R℈JfAJBd@Q[s՟WԤZ%R]>UO  ՁIMH``[0K]z :PR _7|s482)/hΨfr zO~Ԃ^KR`PR@Dszdi \Rd7,$R-TC@6+*2r#G.@mW)J2Fp AY* h2~()F'r).R*G3))! 3,QbRG(,=~6q0x0231[ˢ%3@(3!k. YRMG #0)#e'%'"2D/.pIхxQQA2뢈SkHW(3Y щa&3`XxsgBY#!̰(QfChl8zŒW ll@620ߐ!%A(T58aBF5:%b#Kgc-KXdJAm-NA3P nyuq$*ӊ#'."<#pc, B@m~VTJLa7p0#\p;F2*;ɀX;&U&cbƱa(aHIr0$2b<Lp覂()Y~Äìt:s2RU xa0ܼb8://J/ r1Q5F1Z5/YA 2" jJW:%DV483g*,T~R1RP)T А%j];dU9WZ !7ɇEug|@ʢ-6K'Iױf,>@(wz?! wJ=,mՔNɦJ3S0ږArII+TZ*` qTݲMۄQC9+ѹ:{C6̯LOJ@|ؓ5S .K x%2-uvhIG!H`.`#6q?G<>qBQq {8hJlૉ >䬡Z=@-LTMMoqMy-)oJ(uⶭ^4PNJOۤ&B֏IBD^]; ݃&\Qa6}ۮtTTwS9SWJFh~m-0 M$UV:NmU I+c&M:-WMKcX,4^:D`-t^ n(i:hZ=i K4ZuZ qEz~.KqAdZ& &0'25$]A2dk+0afxF{o}ɓp]"Q -6hF0 PbydJm.ajӺ{j 1kyOB&ʮQl9li?_؟ڿ?_Տ-.;|@QAt!D *$PD ) XQF;~RH%MDRJ-]SL5mޔpaHn'wBRG=!J|갂P}i1aeE}sD1AN̞5[aV`̲W\uśW^}̪#ۇ,bz\Z)cΪwhW2-: DMM_ڵmƝ[n޽Z&I XdMĬq;u";4V2Jj:MB^ ֭7Ooǟ_~C!la#o-JNb8 X()AP@LNz"YꉧX$.2@ң?2H!$Ҿ%ArL(XBG t9 ڋJy9\J+-fb'ZBAEAz*PM"h`aY0H$lҨ't"Xqrho"H98t-"_5VYgV`b)j4hwԦ*X(C2LYq 4\h6MaX"3O)9&!J9[x`0"\iWHK"aZM`AR+zaE[?9dG&Y.aG6`# ]ajv/ >P;".L pYqRŴHMrYf 9"h8O00kx zNe]. !Y/O)!;ui0J;dYV2 ru]^@Y‘w2gs :֨N:ރj1katOdIP (PA;1 (l's?(Sz'q'g}߇߶iΡ>mh52(8a#94LVjU ZգE^=l=b(@ :M1L S[Q )q0-BHoKQt!Yш_8E*V$'ƃl[AQ4 E0  CC$G8[1NAQ 4:y栎b(! }h'5AW: !O3̤̃E9JR}'Ր1$!.RM:sWVVxvl!zDb I- >i4әQ  #`#aS#:bBysWF'SӝN!ZAeRŒb`AQMčWgC?DƋQ6X.(D *r2!SE5#3L31\.+PhB`xԧ?jm -3!AB(`ΦmtEWYA0Pa$lBR9Z ;HyXkpty 터 _W$ثvCr̠VֲŬK*]Clá>aPZl0 4bEw$pyФuh3!4H6q FAƴ`Q G@;S@yHB"K8J: ùC ^*%6hp1@Jo~߇H1zG7ƒKU=AY Lir ,@;PgVst8q6xz [ `:+YDzIQ耘i P[_Hx b Z(8N) ű~Q,44q<_2A2fFsE B!`#!Ur @Bz`8nV3=l0%@9p qPD zzB5D6%dJa?CVIw-EO +((Ҩ噅=lbǓ-l'0TʝH} cm+qCRЅ,`&d{! p3kGxpRzx%>eNx5qwyE>r'GyUr/ye>s7yus?zЅ>tʠbM=EzYJ?;W$Y vd/T=uSD>)H'1a*p8N+҆">yʳ.$ F2(1{>RDas$!XnEu{\.IU)(U7:l'ߐ& ( y{w@*2j DN=g($B q'| H>;`0z4c#,ْ. 7vn+AKALqX!% /#x EB DE$AԮØ>@9AY>䩅1 Bݣda C9@JlA8C5px44*بBn³0 J.:wi y4TC`D=8fYcƒd'HB )Ķ]&IiB!PQR\=x:%C=򷂀YDyH Lc+KlD`NƨAؑ (ƊF)GD>U ^<_(Ad4 xMF ІƆHIoc؊ѧvwlč8 2Tz!|}<~*GR6yrID!FC*CF`HֻȨ : 8J/R#8,IL"\$3rɃɂ`ddҩ ڀЄ8ʆTz*AItL+슚]C9Zi:>K$BS#}|a<=2LGPwۉʼn98e=! ?c(ݕٌr<0 ϑPq 0)5a+]0yM_ɍٟ \,I +2156fp*yx$9&NI) 8B,ߑzl(~ Nw7;6^ `IbbɻjIܵ+dl\Y.;+>Ãa &z+8,\FT>eaE{Iucnfu%. u0H8@P1LHl@7H!:UņD#vmv.é琰 /[(Є`? W's9#3;A &OuB=H`;d sb ZIc#!Ø @Xx0;]M^E_E'ӲPzКz E TÐjJw2fEx 8-UUWȥzEJFVL˳A7@zR1ɴFzzJQK RoE 5NW8 }~E厉hJW} 5zgؓ'ȳ{6tC-J^6r37zq+7ӿ} ?@#'7GWgw S0W[+IYdn]WO: HP 'RLĊ1<#Č )g$J$#^4nKRR&ˋ8w'РB-j(ҤJ2m)ԨRc^=-;L2z 7QgO\Eruy<ʮKϳS.l0Ċ3n1yY}[-Q81ռТŀ2c:xztNm 6ܺw7p~W`eptVFsiQ=Cf%d3찃U,@N*@ruYO"):O4gy"4N=LI#@.hp1ZO.':,JyFjBLRAPh@:P:$L= @EN;,ں%2PI,Dcj|aRB/z(!6)w|k@*Mz<':ө݈V<!/(< 1 T7Ձ[ɥwdK1PC406JLGA](z` xew0ΙҴ6J5ΡSC@rz)@o`IR234wt,IVn|5IB=O̗PG`Kf""(Zc'MWB)bVD߫u<4D'A7r+$[KF\6+". XU:̻ bDLHi@Xu@)z< @CI)0z'ɝs9z\1nM+HP!`a`^t e ]ȠI-@*^d N1,!F>2%3N~2,)SV2-s^2,1f>3AS;6Y:y~nW'+BV"zvNa4rjzDei℥CMkң^ @GW#Now0.i ]o~tEvbA2E$kIFiRr?@B"| <7MbnUbZZY+O7 iޅ#Ln~<J,.մ{" ÁT*sHu$+KqyŒd;9Mn@) !^~׺3ytc^Ͻ41˥\(C4tĤ'N@  ŝp#>h:MOY_*H3#6At0w[jFpޑhÔt;#Ct$xDwGd5]#p{!B͎v[{P"/ 'I)Ovo|"K) KH9 8A=$iE w Q}c D k@8  $OHTzIX%)?0GA@8<-nfHG 2A8 <@|T\N@}T@!@c .`:ʕC H_FY *CPl]_-[}_<߶_#BCCdI@R"<:D @c<"#=rO Ģ (B8OP";PADA|ռBTP$8EU=}@TRUփU P ĮM0@AK VeLe[ 5Q\&"d%Z aĿ0&U`eUcXedzU=ebeܣmJ4S&e~ @t>E) DFՑ靾a*Ʌ\γ"c ĵ#bR+&Ľ~PD1: īRĄ ԃduJv~*,:FCԫ@$K ľN2D}D C |u mŕ!qkPÎӄE*iB\% H K4kdBm\N):~E`*E{O­Ԇ;kX E-Q--E.:DӲC8P^ E| 6TDrkv-JnǖvCDp\x@ԤVC|D ЁeF^L4KJ4CXkf/C|#FP@K-EmBЄoFnDXFFn%-&==D ,5et:Drk-nB\ E4%_ /E$0{D GEԮPLqG  VDRG wq=|q0ݒkB @.o10x;q}$.aӻMDXNrEQBQ>Dd1?%KDR=DL( ׃Z2 1ȆCrY.E2Hq"WrHg=@G@%CİXL2S3?3z]1,ЍdS4h^8BB;KI=xE8sp@t@Be/WdT< pD- jVvsB4w Ա @BB$QD XA^}D@˱ dFQ×ksy>5~Pjc>~P|@81x>bGD>38;7뫝i }/?GO?W_?go?w?????ǿ?׿???@8`A&TaC!F8bE1fԸcGA9dI'QTr$eԊ9fM7qԹgO?ڤ0(D3e"zD*sAH*ʡ;lYgѦU rh2ZT=la=%5ʹQ{NF0Ʊ1/ գMO¢YZϟA=tiklyĺw)vd~y/&Va1~ʴ͜'rnmzuױgמ R|vɪ;cOT,VohzjO[ (礓HKPlA*+O B?r0p n6+&D >hC3*+B֩yZKXjz:bQ(-|+RϖA%12xLrIs0vdDq@!y%r4@5VNf% ' I' \J*9\Xt,[m3b(zЩ*YUo[vgViEqGc:4%BH3y` .ZzK 睁FIQ/ JA[6`%cXuNCXA/  `1,i`䉁RحM'Pi*qm *zv(x k(z1-Uv;+My٘[̮W#̢)X# JqCf; n< b8Nƒ_6. {#8؍/5S=ǩ/)}PD_RSTebhEvTMm@2 :V`CС k4P"r }#K(fjNXF\_r!`ơPB8-IK )O bqFOXn%IE8U(DNVARk(L)i< xA$r5MmJS!* jN41?P+%ꑍ`r<)㇣|@N IN+! .T*vͪpF?1jhH Y D 1&f<\p-uKX.Gih94zbLd; Oy  FO3A,e@MVT aS)IN'͙@ +O:$U6Aj] < `XVKC$HZ3 yd+"ԁ9Ԗ/R`?tjMY5 OC1ǁtz,6_-h=J*<:׾ m |xEr\Hd 8q fn^KX񎗼҆1'|)~)i=DahN0 !bV ᗪHLCPHJI/!L.H6QyGS \-W)$|B:.}I)AAIY[\㭢x Z(U˛d%/4Ch!ՏUXc#:S ^RP3OD4fdWR p`l V@>:itCdơS1$ৗ9 dA(CƬt%y tVtJ!#Yfa뱼![Z)3#pƗ.h@691]PdCQD=Lc߲s×l6Do*Ӱc5%bH7A 3H7{Tӄe;<ʚ wxN>'Ԇ!&X R*dЍ -IA8+{`Cq ir>+Ȑ E7ёt/MwӡuOUձuo]ve7ўvmwwϝuw}x{#wn{ai bδ݄LzCyя>C*$/1ND̀=<&2q25 T7jG m,‚afIm] ~)|fe7G³"L=?T%0[!z?c D ί p"lzj oiddB |B "@nK^iJH`+I2z~a0a0 a! LMDFeD@TRuja4 ׉A+ޣZM~(P[pYPX^Mfk&a@]D`F&j (p /3"o.` ff* #(1 1Qjf `(/l4$jb&\QY켤p.d)(B0a(T/Qk.10G( xvnЂqCD7«*F"k& Ꟑҏ¨.K@XH–m7rdP"# }ވXK(*#WERzJh5P؈bzcA2 >&|KwMۖI# +q$rFL%QҕVZBhɑ4c*h*lj(!w *]$*.)FJ l2(@2*rkXr R) "U̒/:D!j.*j V)žO:LF2/Iaz/S m*.ϑ,s1 !JAH(*6_@S1˰4`(gq^S˾",ULldXmGr Vr ᯆƞ"&jxBȊQ4fE?i5RBgh,flOp7J%+n$]i70)G>t+DM PU?7?F@ٜA45-B| HBvC),/J !DbNF^iFFc,KLq4M. Q"4n.eF3!d"v.4~NM9O5Q# ,pQ!5R.%R1U3S9S=SA5TEuTITMTQ5UUuUYU]Ua5VeuViVmVq5Wu,$/XROXWwu13B`YR(%"Y5Q?4Lo uF5(ܢȥ 4)m #^u3`O3 C2(c U[CX`s Ԋ`gR.5_+!!\w]q5v#IBn)'C9O5aEB`advvg[#ha'eKnΫI"zO z5WqeQrg%6ǏѵFkl[;UY24!~ {ʡ dVN(!;,$[xi7if[Zt(JJ.m{8j{;q9rq;U-ky)%usۊC{gu]fj =8cI!" k)5#%g"(6 8ޒ +7IH"3®8m[poK׷຿z+ZFܷۿɇ 7\=F?C3R) zH!2-"Ǚwdrk K;7MDżq i\"8xbi:8=[Se>{Kuie{UDMݟAly[Y_ݦ+Y}<:oǓ5Rۂ Op4)_6>:)A0vʰbDIC$L)笢$n DwuCKe CBaZT v{x;~ɸc}~>މlL!vS7T"+> 6ʍ M@:/HFv$rؘ4017Q%K*>eJJUtuۊrY>Vnǚu^nB+ !PN?`s-nOUW!"n0?__l_å$Y.|*  pA .=)^=C2{ 4СD=4ҥL:} 5T՛mָzu 6رd˚=6ڵlۊ\g@ڽ7޽| x 48Ō;~ 9ɔ+[9͜;{ :ѤK>:լ[~ ;ٴk۾;ݼ{ <ċ?<̛;=ԫ[KR%eԊ\>B`ij(`w"Ma.WTQTG`:F= Wi\\i!I W!p W메2#5Tb."qbp⢋U@bcj%%98FoN28ֳFLb*1\łc}],B̄Uyɤn S@y%e-=PS;hT+\L F W8)3 njš jTsy)t`M< Cek'jͪR((tTqHFH(Wa }4sdq&Sx%e hԭR>@#4L yAo d$D8 c" 6J e CQ1joY_=nQ*4,c d't$= b!G6PT9!])FC!bD8tF.Iew(e1O!gKƄb!U@e#H T^e" Ml8EG, |p,`bZI4 he=^2e[2RDMh -bV~XA!͈J6 WЦC ,P5:v0 AI>dST: b+z6tǮR*l>pG=f#(ՙ% &$hW AΨG:: +&ZH %%Jh7" \D:8'M!`=fPܢX]"=AJC]M KD Tv "] '=^مcR>aReֵwP^_Jx!8xV=B51KH>kDZKK:Rxr@u&NUmvLK `4y0$HTW7WJ 8zF7nHXgJaȋrI:i&-@^̕/'D.2bĐT`}z\#i葋8. 1Q6 R1زjݘB& jB:$ݐ90 fD.AQw XTT14qE LeńH K%%CP/dTXP  /5 `0՚ ` {.d+{n hK{Ԯlk{ p{.ύt{n x5y{,-2"GH&hpπޯ ~~q{}AܴC?}P|Rgt#8UrkXD I@cD/2G+](03ZG!9K~r\?ZNrB+F8Cp@%[)NYx?t|fn@UDL.G > T G$>-3\OqA.X]gp Hdk^o?x^ I яGqWbKF04D?:4dGj/GA9W_s' L~Ap @qzGv3p ǁG07vTsހ|WzUDQw}-004D `eq * kdq@xP|ɃrWAӷ+A`(GqpT1'ه~CX*B}w&p ?b.fp7hq$@ `7qPq  &"$ ! װ=@LPB8@yAv^w Gݕ#HqBWdB,@Te $Ws }|C \U &Gd з8Hڢq30yhi|B'cKWg xQu' XDW}kB&HĊft0\wAv=8 vhw0@ xwB68=ii7Wi5!7  ("}Ch0? -RBXv$`^G7ُ#o(rHBrrFxT* ZX9NpjI?oV  a I: і)mX.78>B@}.P*' P a:19(w0JhGufY58|D63}Iv`y@^WP)Bohy)Gri*-Z: U"HI[+*8㈄'wIJq`Q`˪Ye"rqJyZP)#g#ProY!. QP dC ѣd@yHG"'0 ?H}@ Hwr= [y|8xJq1 q}}ဴ->qp zjY)PpC ]+ALpY ǠL獴6_+Dq% FpT!,W!,PWH*\ȰÇRH!ŋ3jȱǏ CIɓ(S\ɲ˗0c"H1"͚D3#'X@h =%ⴸcE+*(իXjʵׯ`Æٴ!٧pzpjm-XćT==C[z)+ӸǐW)88!lj̹ϠC,Z c[>՛{n= 2H^85.f^ܸ&4M#4^7kνg}1r[4Nۢc[|5o;4 \w@3  6hBtTL= ޅfvY5C vi@b'^z8P@}  :$ RCNRO<N=I,cLJ`)di&HḲ<<N\F'4*#1 @'N|3;<@4#騝xe PYO5OP4q 8<t꩚00,m We-K=d[&JWrF+Ԏ;[ ilS6