pax_global_header00006660000000000000000000000064146171352100014512gustar00rootroot0000000000000052 comment=6e3f4b1091875216850a486b1c2eb0e5ea852f98 client_golang-1.19.1/000077500000000000000000000000001461713521000144105ustar00rootroot00000000000000client_golang-1.19.1/.bingo/000077500000000000000000000000001461713521000155645ustar00rootroot00000000000000client_golang-1.19.1/.bingo/.gitignore000066400000000000000000000001731461713521000175550ustar00rootroot00000000000000 # Ignore everything * # But not these files: !.gitignore !*.mod !*.sum !README.md !Variables.mk !variables.env *tmp.mod client_golang-1.19.1/.bingo/README.md000066400000000000000000000014641461713521000170500ustar00rootroot00000000000000# Project Development Dependencies. This is directory which stores Go modules with pinned buildable package that is used within this repository, managed by https://github.com/bwplotka/bingo. * Run `bingo get` to install all tools having each own module file in this directory. * Run `bingo get ` to install that have own module file in this directory. * For Makefile: Make sure to put `include .bingo/Variables.mk` in your Makefile, then use $() variable where is the .bingo/.mod. * For shell: Run `source .bingo/variables.env` to source all environment variable for each tool. * For go: Import `.bingo/variables.go` to for variable names. * See https://github.com/bwplotka/bingo or -h on how to add, remove or change binaries dependencies. ## Requirements * Go 1.14+ client_golang-1.19.1/.bingo/Variables.mk000066400000000000000000000021471461713521000200310ustar00rootroot00000000000000# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT. # All tools are designed to be build inside $GOBIN. BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST))) GOPATH ?= $(shell go env GOPATH) GOBIN ?= $(firstword $(subst :, ,${GOPATH}))/bin GO ?= $(shell which go) # Below generated variables ensure that every time a tool under each variable is invoked, the correct version # will be used; reinstalling only if needed. # For example for goimports variable: # # In your main Makefile (for non array binaries): # #include .bingo/Variables.mk # Assuming -dir was set to .bingo . # #command: $(GOIMPORTS) # @echo "Running goimports" # @$(GOIMPORTS) # GOIMPORTS := $(GOBIN)/goimports-v0.9.3 $(GOIMPORTS): $(BINGO_DIR)/goimports.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. @echo "(re)installing $(GOBIN)/goimports-v0.9.3" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=goimports.mod -o=$(GOBIN)/goimports-v0.9.3 "golang.org/x/tools/cmd/goimports" client_golang-1.19.1/.bingo/go.mod000066400000000000000000000002241461713521000166700ustar00rootroot00000000000000module _ // Fake go.mod auto-created by 'bingo' for go -moddir compatibility with non-Go projects. Commit this file, together with other .mod files.client_golang-1.19.1/.bingo/goimports.mod000066400000000000000000000002121461713521000203030ustar00rootroot00000000000000module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT go 1.20 require golang.org/x/tools v0.9.3 // cmd/goimports client_golang-1.19.1/.bingo/goimports.sum000066400000000000000000000007131461713521000203360ustar00rootroot00000000000000golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= client_golang-1.19.1/.bingo/variables.env000066400000000000000000000006311461713521000202460ustar00rootroot00000000000000# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT. # All tools are designed to be build inside $GOBIN. # Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk. GOBIN=${GOBIN:=$(go env GOBIN)} if [ -z "$GOBIN" ]; then GOBIN="$(go env GOPATH)/bin" fi GOIMPORTS="${GOBIN}/goimports-v0.9.3" client_golang-1.19.1/.github/000077500000000000000000000000001461713521000157505ustar00rootroot00000000000000client_golang-1.19.1/.github/ISSUE_TEMPLATE.md000066400000000000000000000024171461713521000204610ustar00rootroot00000000000000 client_golang-1.19.1/.github/dependabot.yml000066400000000000000000000007541461713521000206060ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "monthly" - package-ecosystem: "gomod" directory: "/examples/middleware" schedule: interval: "monthly" - package-ecosystem: "gomod" directory: "/tutorial/whatsup" schedule: interval: "monthly" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" groups: github-actions: patterns: - "*" client_golang-1.19.1/.github/settings.yml000066400000000000000000000034031461713521000203330ustar00rootroot00000000000000--- branches: - name: main protection: # Required. Require at least one approving review on a pull request, before merging. Set to null to disable. required_pull_request_reviews: # The number of approvals required. (1-6) required_approving_review_count: 1 # Dismiss approved reviews automatically when a new commit is pushed. dismiss_stale_reviews: false # Blocks merge until code owners have reviewed. require_code_owner_reviews: false # Specify which users and teams can dismiss pull request reviews. Pass an empty dismissal_restrictions object to disable. User and team dismissal_restrictions are only available for organization-owned repositories. Omit this parameter for personal repositories. dismissal_restrictions: users: [] teams: [] # Required. Require status checks to pass before merging. Set to null to disable required_status_checks: # Required. Require branches to be up to date before merging. strict: false # Required. The list of status checks to require in order to merge into this branch contexts: - DCO - "ci/circleci: go-1-17" - "ci/circleci: go-1-18" # Required. Enforce all configured restrictions for administrators. Set to true to enforce required status checks for repository administrators. Set to null to disable. enforce_admins: false # Prevent merge commits from being pushed to matching branches required_linear_history: false # Required. Restrict who can push to this branch. Team and user restrictions are only available for organization-owned repositories. Set to null to disable. restrictions: apps: [] users: [] teams: [] client_golang-1.19.1/.github/stale.yml000066400000000000000000000063621461713521000176120ustar00rootroot00000000000000# Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale # daysUntilStale: 30 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. # daysUntilClose: 7 # NOTICE: Check below for the individual settings for each type of event. # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - pinned - security - keep-open - wip - "[Status] Maybe Later" # Set to true to ignore issues in a project (defaults to false) exemptProjects: true # default: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: true # default: false # Set to true to ignore issues with an assignee (defaults to false) exemptAssignees: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable # markComment: > # This issue has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. # closeComment: > # Your comment here. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` # only: issues # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': # pulls: # daysUntilStale: 30 # markComment: > # This pull request has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # issues: # exemptLabels: # - confirmed pull: daysUntilClose: 14 daysUntilStale: 60 markComment: > Hello 👋 Looks like there was no activity on this amazing PR for the last 60 days. **Do you mind updating us on the status?** Is there anything we can help with? If you plan to still work on it, just comment on this PR or push a commit. Thanks! 🤗 If there will be no activity in the next 2 weeks, this issue will be closed (we can always reopen a PR if you get back to this!). # unmarkComment: No need for unmark comment. closeComment: > Closing for now as promised, let us know if you need this to be reopened! 🤗 issues: daysUntilClose: 90 daysUntilStale: 180 markComment: > Hello 👋 Looks like there was no activity on this issue for the last 3 months. **Do you mind updating us on the status?** Is this still reproducible or needed? If yes, just comment on this PR or push a commit. Thanks! 🤗 If there will be no activity in the next 4 weeks, this issue will be closed (we can always reopen an issue if we need!). # unmarkComment: No need for unmark comment. closeComment: > Closing for now as promised, let us know if you need this to be reopened! 🤗 client_golang-1.19.1/.github/workflows/000077500000000000000000000000001461713521000200055ustar00rootroot00000000000000client_golang-1.19.1/.github/workflows/automerge-dependabot.yml000066400000000000000000000014371461713521000246300ustar00rootroot00000000000000name: Dependabot auto-merge on: pull_request permissions: contents: write pull-requests: write jobs: dependabot: runs-on: ubuntu-latest if: ${{ github.actor == 'dependabot[bot]' }} steps: - name: Dependabot metadata id: metadata uses: dependabot/fetch-metadata@c9c4182bf1b97f5224aee3906fd373f6b61b4526 # v1.6.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - name: Enable auto-merge for Dependabot PRs if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch'}} run: gh pr merge --auto --merge "$PR_URL" env: PR_URL: ${{github.event.pull_request.html_url}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} client_golang-1.19.1/.github/workflows/codeql-analysis.yml000066400000000000000000000051211461713521000236170ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ main ] pull_request: # The branches below must be a subset of the branches above branches: [ main ] schedule: - cron: '31 21 * * 6' # Minimal permissions to be inherited by any job that don't declare it's own permissions permissions: contents: read jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'go' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@b7bf0a3ed3ecfa44160715d7c442788f65f0f923 # v3.23.2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@b7bf0a3ed3ecfa44160715d7c442788f65f0f923 # v3.23.2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@b7bf0a3ed3ecfa44160715d7c442788f65f0f923 # v3.23.2 client_golang-1.19.1/.github/workflows/go.yml000066400000000000000000000017601461713521000211410ustar00rootroot00000000000000--- name: Go on: pull_request: push: branches: - main - "release-*" # Minimal permissions to be inherited by any job that don't declare it's own permissions permissions: contents: read jobs: test: name: Tests runs-on: ubuntu-latest strategy: matrix: go_version: ["1.20", "1.21", "1.22"] steps: - name: Checkout code uses: actions/checkout@v4.1.1 - name: Set up Go ${{ matrix.go_version }} uses: actions/setup-go@v5.0.0 with: go-version: ${{ matrix.go_version }} - name: Cache Go modules id: cache uses: actions/cache@v4 with: path: ~/go/pkg/mod key: v1-go${{ matrix.go_version }} - name: Run tests and check license run: make check_license test env: CI: true - name: Run style and unused if: ${{ matrix.go_version == '1.20' }} run: make style unused client_golang-1.19.1/.github/workflows/golangci-lint.yml000066400000000000000000000023131461713521000232560ustar00rootroot00000000000000--- # This action is synced from https://github.com/prometheus/prometheus name: golangci-lint on: push: paths: - "go.sum" - "go.mod" - "**.go" - "scripts/errcheck_excludes.txt" - ".github/workflows/golangci-lint.yml" - ".golangci.yml" pull_request: permissions: # added using https://github.com/step-security/secure-repo contents: read jobs: golangci: permissions: contents: read # for actions/checkout to fetch code pull-requests: read # for golangci/golangci-lint-action to fetch pull requests name: lint runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: install Go uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version: 1.20.x - name: Install snmp_exporter/generator dependencies run: sudo apt-get update && sudo apt-get -y install libsnmp-dev if: github.repository == 'prometheus/snmp_exporter' - name: Lint uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3.7.0 with: version: v1.54.2 client_golang-1.19.1/.gitignore000066400000000000000000000010221461713521000163730ustar00rootroot00000000000000# Examples examples/simple/simple examples/random/random examples/gocollector/gocollector # Typical backup/temporary files of editors *~ *# # Never include any accidentally created vendor dirs. # This is a library! vendor/ # The remainder of this file is taken from # https://github.com/github/gitignore/blob/main/Go.gitignore # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out .idea client_golang-1.19.1/.golangci.yml000066400000000000000000000033001461713521000167700ustar00rootroot00000000000000--- run: deadline: 5m skip-files: # Skip autogenerated files. - ^.*\.(pb|y)\.go$ output: sort-results: true linters: enable: - depguard - durationcheck - errorlint - exportloopref - gofmt - gofumpt - goimports - gosimple - ineffassign - misspell - nolintlint - predeclared - revive - staticcheck - unconvert - unused - wastedassign issues: max-same-issues: 0 exclude-rules: - path: _test.go linters: - errcheck - govet - structcheck linters-settings: depguard: rules: main: deny: #- pkg: "sync/atomic" # desc: "Use go.uber.org/atomic instead of sync/atomic" - pkg: "github.com/stretchr/testify/assert" desc: "Use github.com/stretchr/testify/require instead of github.com/stretchr/testify/assert" - pkg: "github.com/go-kit/kit/log" desc: "Use github.com/go-kit/log instead of github.com/go-kit/kit/log" - pkg: "io/ioutil" desc: "Use corresponding 'os' or 'io' functions instead." #- pkg: "regexp" # desc: "Use github.com/grafana/regexp instead of regexp" errcheck: exclude-functions: # The following 2 methods always return nil as the error - (*github.com/cespare/xxhash/v2.Digest).Write - (*github.com/cespare/xxhash/v2.Digest).WriteString - (*bufio.Writer).WriteRune goimports: local-prefixes: github.com/prometheus/client_golang gofumpt: extra-rules: true revive: rules: # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter - name: unused-parameter severity: warning disabled: true client_golang-1.19.1/CHANGELOG.md000066400000000000000000000554641461713521000162370ustar00rootroot00000000000000## Unreleased ## 1.19.0 / 2023-02-27 The module `prometheus/common v0.48.0` introduced an incompatibility when used together with client_golang (See https://github.com/prometheus/client_golang/pull/1448 for more details). If your project uses client_golang and you want to use `prometheus/common v0.48.0` or higher, please update client_golang to v1.19.0. * [CHANGE] Minimum required go version is now 1.20 (we also test client_golang against new 1.22 version). #1445 #1449 * [FEATURE] collectors: Add version collector. #1422 #1427 ## 1.18.0 / 2023-12-22 * [FEATURE] promlint: Allow creation of custom metric validations. #1311 * [FEATURE] Go programs using client_golang can be built in wasip1 OS. #1350 * [BUGFIX] histograms: Add timer to reset ASAP after bucket limiting has happened. #1367 * [BUGFIX] testutil: Fix comparison of metrics with empty Help strings. #1378 * [ENHANCEMENT] Improved performance of `MetricVec.WithLabelValues(...)`. #1360 ## 1.17.0 / 2023-09-27 * [CHANGE] Minimum required go version is now 1.19 (we also test client_golang against new 1.21 version). #1325 * [FEATURE] Add support for Created Timestamps in Counters, Summaries and Historams. #1313 * [ENHANCEMENT] Enable detection of a native histogram without observations. #1314 ## 1.16.0 / 2023-06-15 * [BUGFIX] api: Switch to POST for LabelNames, Series, and QueryExemplars. #1252 * [BUGFIX] api: Fix undefined execution order in return statements. #1260 * [BUGFIX] native histograms: Fix bug in bucket key calculation. #1279 * [ENHANCEMENT] Reduce constrainLabels allocations for all metrics. #1272 * [ENHANCEMENT] promhttp: Add process start time header for scrape efficiency. #1278 * [ENHANCEMENT] promlint: Improve metricUnits runtime. #1286 ## 1.15.1 / 2023-05-3 * [BUGFIX] Fixed promhttp.Instrument* handlers wrongly trying to attach exemplar to unsupported metrics (e.g. summary), \ causing panics. #1253 ## 1.15.0 / 2023-04-13 * [BUGFIX] Fix issue with atomic variables on ppc64le. #1171 * [BUGFIX] Support for multiple samples within same metric. #1181 * [BUGFIX] Bump golang.org/x/text to v0.3.8 to mitigate CVE-2022-32149. #1187 * [ENHANCEMENT] Add exemplars and middleware examples. #1173 * [ENHANCEMENT] Add more context to "duplicate label names" error to enable debugging. #1177 * [ENHANCEMENT] Add constrained labels and constrained variant for all MetricVecs. #1151 * [ENHANCEMENT] Moved away from deprecated github.com/golang/protobuf package. #1183 * [ENHANCEMENT] Add possibility to dynamically get label values for http instrumentation. #1066 * [ENHANCEMENT] Add ability to Pusher to add custom headers. #1218 * [ENHANCEMENT] api: Extend and improve efficiency of json-iterator usage. #1225 * [ENHANCEMENT] Added (official) support for go 1.20. #1234 * [ENHANCEMENT] timer: Added support for exemplars. #1233 * [ENHANCEMENT] Filter expected metrics as well in CollectAndCompare. #1143 * [ENHANCEMENT] :warning: Only set start/end if time is not Zero. This breaks compatibility in experimental api package. If you strictly depend on empty time.Time as actual value, the behavior is now changed. #1238 ## 1.14.0 / 2022-11-08 * [FEATURE] Add Support for Native Histograms. #1150 * [CHANGE] Extend `prometheus.Registry` to implement `prometheus.Collector` interface. #1103 ## 1.13.1 / 2022-11-01 * [BUGFIX] Fix race condition with Exemplar in Counter. #1146 * [BUGFIX] Fix `CumulativeCount` value of `+Inf` bucket created from exemplar. #1148 * [BUGFIX] Fix double-counting bug in `promhttp.InstrumentRoundTripperCounter`. #1118 ## 1.13.0 / 2022-08-05 * [CHANGE] Minimum required Go version is now 1.17 (we also test client_golang against new 1.19 version). * [ENHANCEMENT] Added `prometheus.TransactionalGatherer` interface for `promhttp.Handler` use which allows using low allocation update techniques for custom collectors. #989 * [ENHANCEMENT] Added exemplar support to `prometheus.NewConstHistogram`. See [`ExampleNewConstHistogram_WithExemplar`](prometheus/examples_test.go#L602) example on how to use it. #986 * [ENHANCEMENT] `prometheus/push.Pusher` has now context aware methods that pass context to HTTP request. #1028 * [ENHANCEMENT] `prometheus/push.Pusher` has now `Error` method that retrieve last error. #1075 * [ENHANCEMENT] `testutil.GatherAndCompare` provides now readable diff on failed comparisons. #998 * [ENHANCEMENT] Query API now supports timeouts. #1014 * [ENHANCEMENT] New `MetricVec` method `DeletePartialMatch(labels Labels)` for deleting all metrics that match provided labels. #1013 * [ENHANCEMENT] `api.Config` now accepts passing custom `*http.Client`. #1025 * [BUGFIX] Raise exemplar labels limit from 64 to 128 bytes as specified in OpenMetrics spec. #1091 * [BUGFIX] Allow adding exemplar to +Inf bucket to const histograms. #1094 * [ENHANCEMENT] Most `promhttp.Instrument*` middlewares now supports adding exemplars to metrics. This allows hooking those to your tracing middleware that retrieves trace ID and put it in exemplar if present. #1055 * [ENHANCEMENT] Added `testutil.ScrapeAndCompare` method. #1043 * [BUGFIX] Fixed `GopherJS` build support. #897 * [ENHANCEMENT] :warning: Added way to specify what `runtime/metrics` `collectors.NewGoCollector` should use. See [`ExampleGoCollector_WithAdvancedGoMetrics`](prometheus/collectors/go_collector_latest_test.go#L263). #1102 ## 1.12.2 / 2022-05-13 * [CHANGE] Added `collectors.WithGoCollections` that allows to choose what collection of Go runtime metrics user wants: Equivalent of [`MemStats` structure](https://pkg.go.dev/runtime#MemStats) configured using `GoRuntimeMemStatsCollection`, new based on dedicated [runtime/metrics](https://pkg.go.dev/runtime/metrics) metrics represented by `GoRuntimeMetricsCollection` option, or both by specifying `GoRuntimeMemStatsCollection | GoRuntimeMetricsCollection` flag. #1031 * [CHANGE] :warning: Change in `collectors.NewGoCollector` metrics: Reverting addition of new ~80 runtime metrics by default. You can enable this back with `GoRuntimeMetricsCollection` option or `GoRuntimeMemStatsCollection | GoRuntimeMetricsCollection` for smooth transition. * [BUGFIX] Fixed the bug that causes generated histogram metric names to end with `_total`. ⚠️ This changes 3 metric names in the new Go collector that was reverted from default in this release. * `go_gc_heap_allocs_by_size_bytes_total` -> `go_gc_heap_allocs_by_size_bytes`, * `go_gc_heap_frees_by_size_bytes_total` -> `go_gc_heap_allocs_by_size_bytes` * `go_gc_pauses_seconds_total` -> `go_gc_pauses_seconds`. * [CHANCE] Removed `-Inf` buckets from new Go Collector histograms. ## 1.12.1 / 2022-01-29 * [BUGFIX] Make the Go 1.17 collector concurrency-safe #969 * Use simpler locking in the Go 1.17 collector #975 * [BUGFIX] Reduce granularity of histogram buckets for Go 1.17 collector #974 * [ENHANCEMENT] API client: make HTTP reads more efficient #976 ## 1.12.0 / 2022-01-19 * [CHANGE] example/random: Move flags and metrics into main() #935 * [FEATURE] API client: Support wal replay status api #944 * [FEATURE] Use the runtime/metrics package for the Go collector for 1.17+ #955 * [ENHANCEMENT] API client: Update /api/v1/status/tsdb to include headStats #925 * [ENHANCEMENT] promhttp: Check validity of method and code label values #962 ## 1.11.0 / 2021-06-07 * [CHANGE] Add new collectors package. #862 * [CHANGE] `prometheus.NewExpvarCollector` is deprecated, use `collectors.NewExpvarCollector` instead. #862 * [CHANGE] `prometheus.NewGoCollector` is deprecated, use `collectors.NewGoCollector` instead. #862 * [CHANGE] `prometheus.NewBuildInfoCollector` is deprecated, use `collectors.NewBuildInfoCollector` instead. #862 * [FEATURE] Add new collector for database/sql#DBStats. #866 * [FEATURE] API client: Add exemplars API support. #861 * [ENHANCEMENT] API client: Add newer fields to Rules API. #855 * [ENHANCEMENT] API client: Add missing fields to Targets API. #856 ## 1.10.0 / 2021-03-18 * [CHANGE] Minimum required Go version is now 1.13. * [CHANGE] API client: Add matchers to `LabelNames` and `LabesValues`. #828 * [FEATURE] API client: Add buildinfo call. #841 * [BUGFIX] Fix build on riscv64. #833 ## 1.9.0 / 2020-12-17 * [FEATURE] `NewPidFileFn` helper to create process collectors for processes whose PID is read from a file. #804 * [BUGFIX] promhttp: Prevent endless loop in `InstrumentHandler...` middlewares with invalid metric or label names. #823 ## 1.8.0 / 2020-10-15 * [CHANGE] API client: Use `time.Time` rather than `string` for timestamps in `RuntimeinfoResult`. #777 * [FEATURE] Export `MetricVec` to facilitate implementation of vectors of custom `Metric` types. #803 * [FEATURE] API client: Support `/status/tsdb` endpoint. #773 * [ENHANCEMENT] API client: Enable GET fallback on status code 501. #802 * [ENHANCEMENT] Remove `Metric` references after reslicing to free up more memory. #784 ## 1.7.1 / 2020-06-23 * [BUGFIX] API client: Actually propagate start/end parameters of `LabelNames` and `LabelValues`. #771 ## 1.7.0 / 2020-06-17 * [CHANGE] API client: Add start/end parameters to `LabelNames` and `LabelValues`. #767 * [FEATURE] testutil: Add `GatherAndCount` and enable filtering in `CollectAndCount` #753 * [FEATURE] API client: Add support for `status` and `runtimeinfo` endpoints. #755 * [ENHANCEMENT] Wrapping `nil` with a `WrapRegistererWith...` function creates a no-op `Registerer`. #764 * [ENHANCEMENT] promlint: Allow Kelvin as a base unit for cases like color temperature. #761 * [BUGFIX] push: Properly handle empty job and label values. #752 ## 1.6.0 / 2020-04-28 * [FEATURE] testutil: Add lint checks for metrics, including a sub-package `promlint` to expose the linter engine for external usage. #739 #743 * [ENHANCEMENT] API client: Improve error messages. #731 * [BUGFIX] process collector: Fix `process_resident_memory_bytes` on 32bit MS Windows. #734 ## 1.5.1 / 2020-03-14 * [BUGFIX] promhttp: Remove another superfluous `WriteHeader` call. #726 ## 1.5.0 / 2020-03-03 * [FEATURE] promauto: Add a factory to allow automatic registration with a local registry. #713 * [FEATURE] promauto: Add `NewUntypedFunc`. #713 * [FEATURE] API client: Support new metadata endpoint. #718 ## 1.4.1 / 2020-02-07 * [BUGFIX] Fix timestamp of exemplars in `CounterVec`. #710 ## 1.4.0 / 2020-01-27 * [CHANGE] Go collector: Improve doc string for `go_gc_duration_seconds`. #702 * [FEATURE] Support a subset of OpenMetrics, including exemplars. Needs opt-in via `promhttp.HandlerOpts`. **EXPERIMENTAL** #706 * [FEATURE] Add `testutil.CollectAndCount`. #703 ## 1.3.0 / 2019-12-21 * [FEATURE] Support tags in Graphite bridge. #668 * [BUGFIX] API client: Actually return Prometheus warnings. #699 ## 1.2.1 / 2019-10-17 * [BUGFIX] Fix regression in the implementation of `Registerer.Unregister`. #663 ## 1.2.0 / 2019-10-15 * [FEATURE] Support pushing to Pushgateway v0.10+. #652 * [ENHANCEMENT] Improve hashing to make a spurious `AlreadyRegisteredError` less likely to occur. #657 * [ENHANCEMENT] API client: Add godoc examples. #630 * [BUGFIX] promhttp: Correctly call WriteHeader in HTTP middleware. #634 ## 1.1.0 / 2019-08-01 * [CHANGE] API client: Format time as UTC rather than RFC3339Nano. #617 * [CHANGE] API client: Add warnings to `LabelValues` and `LabelNames` calls. #609 * [FEATURE] Push: Support base64 encoding in grouping key. #624 * [FEATURE] Push: Add Delete method to Pusher. #613 ## 1.0.0 / 2019-06-15 _This release removes all previously deprecated features, resulting in the breaking changes listed below. As this is v1.0.0, semantic versioning applies from now on, with the exception of the API client and parts marked explicitly as experimental._ * [CHANGE] Remove objectives from the default `Summary`. (Objectives have to be set explicitly in the `SummaryOpts`.) #600 * [CHANGE] Remove all HTTP related feature in the `prometheus` package. (Use the `promhttp` package instead.) #600 * [CHANGE] Remove `push.FromGatherer`, `push.AddFromGatherer`, `push.Collectors`. (Use `push.New` instead.) #600 * [CHANGE] API client: Pass warnings through on non-error responses. #599 * [CHANGE] API client: Add warnings to `Series` call. #603 * [FEATURE] Make process collector work on Microsoft Windows. **EXPERIMENTAL** #596 * [FEATURE] API client: Add `/labels` call. #604 * [BUGFIX] Make `AlreadyRegisteredError` usable for wrapped registries. #607 ## 0.9.4 / 2019-06-07 * [CHANGE] API client: Switch to alert values as strings. #585 * [FEATURE] Add a collector for Go module build information. #595 * [FEATURE] promhttp: Add an counter for internal errors during HTTP exposition. #594 * [FEATURE] API client: Support target metadata API. #590 * [FEATURE] API client: Support storage warnings. #562 * [ENHANCEMENT] API client: Improve performance handling JSON. #570 * [BUGFIX] Reduce test flakiness. #573 ## 0.9.3 / 2019-05-16 * [CHANGE] Required Go version is now 1.9+. #561 * [FEATURE] API client: Add POST with get fallback for Query/QueryRange. #557 * [FEATURE] API client: Add alerts endpoint. #552 * [FEATURE] API client: Add rules endpoint. #508 * [FEATURE] push: Add option to pick metrics format. #540 * [ENHANCEMENT] Limit time the Go collector may take to collect memstats, returning results from the previous collection in case of a timeout. #568 * [ENHANCEMENT] Pusher now requires only a thin interface instead of a full `http.Client`, facilitating mocking and custom HTTP client implementation. #559 * [ENHANCEMENT] Memory usage improvement for histograms and summaries without objectives. #536 * [ENHANCEMENT] Summaries without objectives are now lock-free. #521 * [BUGFIX] promhttp: `InstrumentRoundTripperTrace` now takes into account a pre-set context. #582 * [BUGFIX] `TestCounterAddLarge` now works on all platforms. #567 * [BUGFIX] Fix `promhttp` examples. #535 #544 * [BUGFIX] API client: Wait for done before writing to shared response body. #532 * [BUGFIX] API client: Deal with discovered labels properly. #529 ## 0.9.2 / 2018-12-06 * [FEATURE] Support for Go modules. #501 * [FEATURE] `Timer.ObserveDuration` returns observed duration. #509 * [ENHANCEMENT] Improved doc comments and error messages. #504 * [BUGFIX] Fix race condition during metrics gathering. #512 * [BUGFIX] Fix testutil metric comparison for Histograms and empty labels. #494 #498 ## 0.9.1 / 2018-11-03 * [FEATURE] Add `WriteToTextfile` function to facilitate the creation of *.prom files for the textfile collector of the node exporter. #489 * [ENHANCEMENT] More descriptive error messages for inconsistent label cardinality. #487 * [ENHANCEMENT] Exposition: Use a GZIP encoder pool to avoid allocations in high-frequency scrape scenarios. #366 * [ENHANCEMENT] Exposition: Streaming serving of metrics data while encoding. #482 * [ENHANCEMENT] API client: Add a way to return the body of a 5xx response. #479 ## 0.9.0 / 2018-10-15 * [CHANGE] Go1.6 is no longer supported. * [CHANGE] More refinements of the `Registry` consistency checks: Duplicated labels are now detected, but inconsistent label dimensions are now allowed. Collisions with the “magic” metric and label names in Summaries and Histograms are detected now. #108 #417 #471 * [CHANGE] Changed `ProcessCollector` constructor. #219 * [CHANGE] Changed Go counter `go_memstats_heap_released_bytes_total` to gauge `go_memstats_heap_released_bytes`. #229 * [CHANGE] Unexported `LabelPairSorter`. #453 * [CHANGE] Removed the `Untyped` metric from direct instrumentation. #340 * [CHANGE] Unexported `MetricVec`. #319 * [CHANGE] Removed deprecated `Set` method from `Counter` #247 * [CHANGE] Removed deprecated `RegisterOrGet` and `MustRegisterOrGet`. #247 * [CHANGE] API client: Introduced versioned packages. * [FEATURE] A `Registerer` can be wrapped with prefixes and labels. #357 * [FEATURE] “Describe by collect” helper function. #239 * [FEATURE] Added package `testutil`. #58 * [FEATURE] Timestamp can be explicitly set for const metrics. #187 * [FEATURE] “Unchecked” collectors are possible now without cheating. #47 * [FEATURE] Pushing to the Pushgateway reworked in package `push` to support many new features. (The old functions are still usable but deprecated.) #372 #341 * [FEATURE] Configurable connection limit for scrapes. #179 * [FEATURE] New HTTP middlewares to instrument `http.Handler` and `http.RoundTripper`. The old middlewares and the pre-instrumented `/metrics` handler are (strongly) deprecated. #316 #57 #101 #224 * [FEATURE] “Currying” for metric vectors. #320 * [FEATURE] A `Summary` can be created without quantiles. #118 * [FEATURE] Added a `Timer` helper type. #231 * [FEATURE] Added a Graphite bridge. #197 * [FEATURE] Help strings are now optional. #460 * [FEATURE] Added `process_virtual_memory_max_bytes` metric. #438 #440 * [FEATURE] Added `go_gc_cpu_fraction` and `go_threads` metrics. #281 #277 * [FEATURE] Added `promauto` package with auto-registering metrics. #385 #393 * [FEATURE] Add `SetToCurrentTime` method to `Gauge`. #259 * [FEATURE] API client: Add AlertManager, Status, and Target methods. #402 * [FEATURE] API client: Add admin methods. #398 * [FEATURE] API client: Support series API. #361 * [FEATURE] API client: Support querying label values. * [ENHANCEMENT] Smarter creation of goroutines during scraping. Solves memory usage spikes in certain situations. #369 * [ENHANCEMENT] Counters are now faster if dealing with integers only. #367 * [ENHANCEMENT] Improved label validation. #274 #335 * [BUGFIX] Creating a const metric with an invalid `Desc` returns an error. #460 * [BUGFIX] Histogram observations don't race any longer with exposition. #275 * [BUGFIX] Fixed goroutine leaks. #236 #472 * [BUGFIX] Fixed an error message for exponential histogram buckets. #467 * [BUGFIX] Fixed data race writing to the metric map. #401 * [BUGFIX] API client: Decode JSON on a 4xx response but do not on 204 responses. #476 #414 ## 0.8.0 / 2016-08-17 * [CHANGE] Registry is doing more consistency checks. This might break existing setups that used to export inconsistent metrics. * [CHANGE] Pushing to Pushgateway moved to package `push` and changed to allow arbitrary grouping. * [CHANGE] Removed `SelfCollector`. * [CHANGE] Removed `PanicOnCollectError` and `EnableCollectChecks` methods. * [CHANGE] Moved packages to the prometheus/common repo: `text`, `model`, `extraction`. * [CHANGE] Deprecated a number of functions. * [FEATURE] Allow custom registries. Added `Registerer` and `Gatherer` interfaces. * [FEATURE] Separated HTTP exposition, allowing custom HTTP handlers (package `promhttp`) and enabling the creation of other exposition mechanisms. * [FEATURE] `MustRegister` is variadic now, allowing registration of many collectors in one call. * [FEATURE] Added HTTP API v1 package. * [ENHANCEMENT] Numerous documentation improvements. * [ENHANCEMENT] Improved metric sorting. * [ENHANCEMENT] Inlined fnv64a hashing for improved performance. * [ENHANCEMENT] Several test improvements. * [BUGFIX] Handle collisions in MetricVec. ## 0.7.0 / 2015-07-27 * [CHANGE] Rename ExporterLabelPrefix to ExportedLabelPrefix. * [BUGFIX] Closed gaps in metric consistency check. * [BUGFIX] Validate LabelName/LabelSet on JSON unmarshaling. * [ENHANCEMENT] Document the possibility to create "empty" metrics in a metric vector. * [ENHANCEMENT] Fix and clarify various doc comments and the README.md. * [ENHANCEMENT] (Kind of) solve "The Proxy Problem" of http.InstrumentHandler. * [ENHANCEMENT] Change responseWriterDelegator.written to int64. ## 0.6.0 / 2015-06-01 * [CHANGE] Rename process_goroutines to go_goroutines. * [ENHANCEMENT] Validate label names during YAML decoding. * [ENHANCEMENT] Add LabelName regular expression. * [BUGFIX] Ensure alignment of struct members for 32-bit systems. ## 0.5.0 / 2015-05-06 * [BUGFIX] Removed a weakness in the fingerprinting aka signature code. This makes fingerprinting slower and more allocation-heavy, but the weakness was too severe to be tolerated. * [CHANGE] As a result of the above, Metric.Fingerprint is now returning a different fingerprint. To keep the same fingerprint, the new method Metric.FastFingerprint was introduced, which will be used by the Prometheus server for storage purposes (implying that a collision detection has to be added, too). * [ENHANCEMENT] The Metric.Equal and Metric.Before do not depend on fingerprinting anymore, removing the possibility of an undetected fingerprint collision. * [FEATURE] The Go collector in the exposition library includes garbage collection stats. * [FEATURE] The exposition library allows to create constant "throw-away" summaries and histograms. * [CHANGE] A number of new reserved labels and prefixes. ## 0.4.0 / 2015-04-08 * [CHANGE] Return NaN when Summaries have no observations yet. * [BUGFIX] Properly handle Summary decay upon Write(). * [BUGFIX] Fix the documentation link to the consumption library. * [FEATURE] Allow the metric family injection hook to merge with existing metric families. * [ENHANCEMENT] Removed cgo dependency and conditional compilation of procfs. * [MAINTENANCE] Adjusted to changes in matttproud/golang_protobuf_extensions. ## 0.3.2 / 2015-03-11 * [BUGFIX] Fixed the receiver type of COWMetric.Set(). This method is only used by the Prometheus server internally. * [CLEANUP] Added licenses of vendored code left out by godep. ## 0.3.1 / 2015-03-04 * [ENHANCEMENT] Switched fingerprinting functions from own free list to sync.Pool. * [CHANGE] Makefile uses Go 1.4.2 now (only relevant for examples and tests). ## 0.3.0 / 2015-03-03 * [CHANGE] Changed the fingerprinting for metrics. THIS WILL INVALIDATE ALL PERSISTED FINGERPRINTS. IF YOU COMPILE THE PROMETHEUS SERVER WITH THIS VERSION, YOU HAVE TO WIPE THE PREVIOUSLY CREATED STORAGE. * [CHANGE] LabelValuesToSignature removed. (Nobody had used it, and it was arguably broken.) * [CHANGE] Vendored dependencies. Those are only used by the Makefile. If client_golang is used as a library, the vendoring will stay out of your way. * [BUGFIX] Remove a weakness in the fingerprinting for metrics. (This made the fingerprinting change above necessary.) * [FEATURE] Added new fingerprinting functions SignatureForLabels and SignatureWithoutLabels to be used by the Prometheus server. These functions require fewer allocations than the ones currently used by the server. ## 0.2.0 / 2015-02-23 * [FEATURE] Introduce new Histagram metric type. * [CHANGE] Ignore process collector errors for now (better error handling pending). * [CHANGE] Use clear error interface for process pidFn. * [BUGFIX] Fix Go download links for several archs and OSes. * [ENHANCEMENT] Massively improve Gauge and Counter performance. * [ENHANCEMENT] Catch illegal label names for summaries in histograms. * [ENHANCEMENT] Reduce allocations during fingerprinting. * [ENHANCEMENT] Remove cgo dependency. procfs package will only be included if both cgo is available and the build is for an OS with procfs. * [CLEANUP] Clean up code style issues. * [CLEANUP] Mark slow test as such and exclude them from travis. * [CLEANUP] Update protobuf library package name. * [CLEANUP] Updated vendoring of beorn7/perks. ## 0.1.0 / 2015-02-02 * [CLEANUP] Introduced semantic versioning and changelog. From now on, changes will be reported in this file. client_golang-1.19.1/CODE_OF_CONDUCT.md000066400000000000000000000002301461713521000172020ustar00rootroot00000000000000# Prometheus Community Code of Conduct Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). client_golang-1.19.1/CONTRIBUTING.md000066400000000000000000000016661461713521000166520ustar00rootroot00000000000000# Contributing Prometheus uses GitHub to manage reviews of pull requests. * If you have a trivial fix or improvement, go ahead and create a pull request, addressing (with `@...`) the maintainer of this repository (see [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). This will avoid unnecessary work and surely give you and us a good deal of inspiration. * Relevant coding style guidelines are the [Go Code Review Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) and the _Formatting and style_ section of Peter Bourgon's [Go: Best Practices for Production Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). * Be sure to sign off on the [DCO](https://github.com/probot/dco#how-it-works) client_golang-1.19.1/Dockerfile000066400000000000000000000026071461713521000164070ustar00rootroot00000000000000# This Dockerfile builds an image for a client_golang example. # # Use as (from the root for the client_golang repository): # docker build -f Dockerfile -t prometheus/golang-example . # Run as # docker run -P prometheus/golang-example /random # or # docker run -P prometheus/golang-example /simple # Test as # curl $ip:$port/metrics # Builder image, where we build the example. FROM golang:1 AS builder WORKDIR /go/src/github.com/prometheus/client_golang COPY . . WORKDIR /go/src/github.com/prometheus/client_golang/prometheus RUN go get -d WORKDIR /go/src/github.com/prometheus/client_golang/examples/random RUN CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' WORKDIR /go/src/github.com/prometheus/client_golang/examples/simple RUN CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' WORKDIR /go/src/github.com/prometheus/client_golang/examples/gocollector RUN CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' # Final image. FROM quay.io/prometheus/busybox:latest LABEL maintainer="The Prometheus Authors " COPY --from=builder /go/src/github.com/prometheus/client_golang/examples/random \ /go/src/github.com/prometheus/client_golang/examples/simple \ /go/src/github.com/prometheus/client_golang/examples/gocollector ./ EXPOSE 8080 CMD ["echo", "Please run an example. Either /random, /simple or /gocollector"] client_golang-1.19.1/LICENSE000066400000000000000000000261351461713521000154240ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. client_golang-1.19.1/MAINTAINERS.md000066400000000000000000000002371461713521000165060ustar00rootroot00000000000000* Arthur Silva Sens @ArthurSens * Bartłomiej Płotka @bwplotka * Kemal Akkoyun @kakkoyun client_golang-1.19.1/Makefile000066400000000000000000000021631461713521000160520ustar00rootroot00000000000000# Copyright 2018 The Prometheus Authors # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include .bingo/Variables.mk include Makefile.common .PHONY: test test: deps common-test .PHONY: test-short test-short: deps common-test-short .PHONY: generate-go-collector-test-files VERSIONS := 1.20 1.21 1.22 generate-go-collector-test-files: for GO_VERSION in $(VERSIONS); do \ docker run \ --platform linux/amd64 \ --rm -v $(PWD):/workspace \ -w /workspace \ golang:$$GO_VERSION \ bash ./generate-go-collector.bash; \ done; \ go mod tidy .PHONY: fmt fmt: common-format $(GOIMPORTS) -local github.com/prometheus/client_golang -w . client_golang-1.19.1/Makefile.common000066400000000000000000000216551461713521000173500ustar00rootroot00000000000000# Copyright 2018 The Prometheus Authors # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # A common Makefile that includes rules to be reused in different prometheus projects. # !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! # Example usage : # Create the main Makefile in the root project directory. # include Makefile.common # customTarget: # @echo ">> Running customTarget" # # Ensure GOBIN is not set during build so that promu is installed to the correct path unexport GOBIN GO ?= go GOFMT ?= $(GO)fmt FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) GOOPTS ?= GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) GO_VERSION ?= $(shell $(GO) version) GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') PROMU := $(FIRST_GOPATH)/bin/promu pkgs = ./... ifeq (arm, $(GOHOSTARCH)) GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) else GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) endif GOTEST := $(GO) test GOTEST_DIR := ifneq ($(CIRCLE_JOB),) ifneq ($(shell command -v gotestsum > /dev/null),) GOTEST_DIR := test-results GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml -- endif endif PROMU_VERSION ?= 0.15.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= GOLANGCI_LINT_VERSION ?= v1.54.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) # If we're in CI and there is an Actions file, that means the linter # is being run in Actions, so we don't need to run it here. ifneq (,$(SKIP_GOLANGCI_LINT)) GOLANGCI_LINT := else ifeq (,$(CIRCLE_JOB)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint else ifeq (,$(wildcard .github/workflows/golangci-lint.yml)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint endif endif endif PREFIX ?= $(shell pwd) BIN_DIR ?= $(shell pwd) DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) DOCKERFILE_PATH ?= ./Dockerfile DOCKERBUILD_CONTEXT ?= ./ DOCKER_REPO ?= prom DOCKER_ARCHS ?= amd64 BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG)) ifeq ($(GOHOSTARCH),amd64) ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) # Only supported on amd64 test-flags := -race endif endif # This rule is used to forward a target like "build" to "common-build". This # allows a new "build" target to be defined in a Makefile which includes this # one and override "common-build" without override warnings. %: common-% ; .PHONY: common-all common-all: precheck style check_license lint yamllint unused build test .PHONY: common-style common-style: @echo ">> checking code style" @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ if [ -n "$${fmtRes}" ]; then \ echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ echo "Please ensure you are using $$($(GO) version) for formatting code."; \ exit 1; \ fi .PHONY: common-check_license common-check_license: @echo ">> checking license header" @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ done); \ if [ -n "$${licRes}" ]; then \ echo "license header checking failed:"; echo "$${licRes}"; \ exit 1; \ fi .PHONY: common-deps common-deps: @echo ">> getting dependencies" $(GO) mod download .PHONY: update-go-deps update-go-deps: @echo ">> updating Go dependencies" @for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \ $(GO) get -d $$m; \ done $(GO) mod tidy .PHONY: common-test-short common-test-short: $(GOTEST_DIR) @echo ">> running short tests" $(GOTEST) -short $(GOOPTS) $(pkgs) .PHONY: common-test common-test: $(GOTEST_DIR) @echo ">> running all tests" $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs) $(GOTEST_DIR): @mkdir -p $@ .PHONY: common-format common-format: @echo ">> formatting code" $(GO) fmt $(pkgs) .PHONY: common-vet common-vet: @echo ">> vetting code" $(GO) vet $(GOOPTS) $(pkgs) .PHONY: common-lint common-lint: $(GOLANGCI_LINT) ifdef GOLANGCI_LINT @echo ">> running golangci-lint" # 'go list' needs to be executed before staticcheck to prepopulate the modules cache. # Otherwise staticcheck might fail randomly for some reason not yet explained. $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) endif .PHONY: common-yamllint common-yamllint: @echo ">> running yamllint on all YAML files in the repository" ifeq (, $(shell command -v yamllint > /dev/null)) @echo "yamllint not installed so skipping" else yamllint . endif # For backward-compatibility. .PHONY: common-staticcheck common-staticcheck: lint .PHONY: common-unused common-unused: @echo ">> running check for unused/missing packages in go.mod" $(GO) mod tidy @git diff --exit-code -- go.sum go.mod .PHONY: common-build common-build: promu @echo ">> building binaries" $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES) .PHONY: common-tarball common-tarball: promu @echo ">> building release tarball" $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) .PHONY: common-docker $(BUILD_DOCKER_ARCHS) common-docker: $(BUILD_DOCKER_ARCHS) $(BUILD_DOCKER_ARCHS): common-docker-%: docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \ -f $(DOCKERFILE_PATH) \ --build-arg ARCH="$*" \ --build-arg OS="linux" \ $(DOCKERBUILD_CONTEXT) .PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) common-docker-publish: $(PUBLISH_DOCKER_ARCHS) $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION))) .PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) common-docker-tag-latest: $(TAG_DOCKER_ARCHS) $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" .PHONY: common-docker-manifest common-docker-manifest: DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG)) DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" .PHONY: promu promu: $(PROMU) $(PROMU): $(eval PROMU_TMP := $(shell mktemp -d)) curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) mkdir -p $(FIRST_GOPATH)/bin cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu rm -r $(PROMU_TMP) .PHONY: proto proto: @echo ">> generating code from proto files" @./scripts/genproto.sh ifdef GOLANGCI_LINT $(GOLANGCI_LINT): mkdir -p $(FIRST_GOPATH)/bin curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ | sed -e '/install -d/d' \ | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) endif .PHONY: precheck precheck:: define PRECHECK_COMMAND_template = precheck:: $(1)_precheck PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) .PHONY: $(1)_precheck $(1)_precheck: @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ exit 1; \ fi endef client_golang-1.19.1/NOTICE000066400000000000000000000015121461713521000153130ustar00rootroot00000000000000Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/). The following components are included in this product: perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details. Go support for Protocol Buffers - Google's data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details. Support for streaming Protocol Buffer messages for the Go language (golang). https://github.com/matttproud/golang_protobuf_extensions Copyright 2013 Matt T. Proud Licensed under the Apache License, Version 2.0 client_golang-1.19.1/README.md000066400000000000000000000115611461713521000156730ustar00rootroot00000000000000# Prometheus Go client library [![CI](https://github.com/prometheus/client_golang/actions/workflows/go.yml/badge.svg)](https://github.com/prometheus/client_golang/actions/workflows/ci.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/client_golang)](https://goreportcard.com/report/github.com/prometheus/client_golang) [![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/client_golang.svg)](https://pkg.go.dev/github.com/prometheus/client_golang) [![Slack](https://img.shields.io/badge/join%20slack-%23prometheus--client_golang-brightgreen.svg)](https://slack.cncf.io/) This is the [Go](http://golang.org) client library for [Prometheus](http://prometheus.io). It has two separate parts, one for instrumenting application code, and one for creating clients that talk to the Prometheus HTTP API. **This library requires Go1.20 or later.** > The library mandates the use of Go1.20 or subsequent versions. While it has demonstrated functionality with versions as old as Go 1.17, our commitment remains to offer support and rectifications for only the most recent three major releases. ## Important note about releases and stability This repository generally follows [Semantic Versioning](https://semver.org/). However, the API client in `prometheus/client_golang/api/…` is still considered experimental. Breaking changes of the API client will _not_ trigger a new major release. The same is true for selected other new features explicitly marked as **EXPERIMENTAL** in CHANGELOG.md. Features that require breaking changes in the stable parts of the repository are being batched up and tracked in the [v2 milestone](https://github.com/prometheus/client_golang/milestone/2). The v2 development happens in a [separate branch](https://github.com/prometheus/client_golang/tree/dev-v2) for the time being. v2 releases off that branch will happen once sufficient stability is reached. In view of the widespread use of this repository, v1 and v2 will coexist for a while to enable a convenient transition. ## Instrumenting applications [![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/client_golang/prometheus.svg)](https://pkg.go.dev/github.com/prometheus/client_golang/prometheus) The [`prometheus` directory](https://github.com/prometheus/client_golang/tree/main/prometheus) contains the instrumentation library. See the [guide](https://prometheus.io/docs/guides/go-application/) on the Prometheus website to learn more about instrumenting applications. The [`examples` directory](https://github.com/prometheus/client_golang/tree/main/examples) contains simple examples of instrumented code. ## Client for the Prometheus HTTP API [![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/client_golang/api.svg)](https://pkg.go.dev/github.com/prometheus/client_golang/api) The [`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/main/api/prometheus) contains the client for the [Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you to write Go applications that query time series data from a Prometheus server. It is still in alpha stage. ## Where is `model`, `extraction`, and `text`? The `model` packages has been moved to [`prometheus/common/model`](https://github.com/prometheus/common/tree/main/model). The `extraction` and `text` packages are now contained in [`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/main/expfmt). ## Contributing and community See the [contributing guidelines](CONTRIBUTING.md) and the [Community section](http://prometheus.io/community/) of the homepage. `client_golang` community is also present on the CNCF Slack `#prometheus-client_golang`. ### For Maintainers: Release Process To cut a minor version: 1. Create a new branch `release-.` on top of the `main` commit you want to cut the version from and push it. 2. Create a new branch on top of the release branch, e.g. `/cut-..`, 3. Change the `VERSION` file. 4. Update `CHANGELOG` (only user-impacting changes to mention). 5. Create PR, and get it reviewed. 6. Once merged, create a release with the `release-.` tag on GitHub with the `` title. 7. Announce on the prometheus-announce mailing list, slack and Twitter. 8. Merge the release branch back to the `main` using the "merge without squashing" approach (!). > NOTE: In case of merge conflicts, you can checkout the release branch in a new branch, e.g. `/resolve-conflicts`, fix the merge problems there, and then do a PR into main from the new branch. In that way, you still get all the commits in the release branch back into `main`, but leave the release branch alone. To cut the patch version: 1. Create a branch on top of the release branch you want to use. 2. Cherry-pick the fixes from the `main` branch (or add new commits) to fix critical bugs for that patch release. 3. Follow steps 3-8 as above. client_golang-1.19.1/SECURITY.md000066400000000000000000000002541461713521000162020ustar00rootroot00000000000000# Reporting a security issue The Prometheus security policy, including how to report vulnerabilities, can be found here: client_golang-1.19.1/VERSION000066400000000000000000000000071461713521000154550ustar00rootroot000000000000001.19.1 client_golang-1.19.1/api/000077500000000000000000000000001461713521000151615ustar00rootroot00000000000000client_golang-1.19.1/api/client.go000066400000000000000000000067341461713521000170000ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package api provides clients for the HTTP APIs. package api import ( "bytes" "context" "errors" "net" "net/http" "net/url" "path" "strings" "time" ) // DefaultRoundTripper is used if no RoundTripper is set in Config. var DefaultRoundTripper http.RoundTripper = &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, TLSHandshakeTimeout: 10 * time.Second, } // Config defines configuration parameters for a new client. type Config struct { // The address of the Prometheus to connect to. Address string // Client is used by the Client to drive HTTP requests. If not provided, // a new one based on the provided RoundTripper (or DefaultRoundTripper) will be used. Client *http.Client // RoundTripper is used by the Client to drive HTTP requests. If not // provided, DefaultRoundTripper will be used. RoundTripper http.RoundTripper } func (cfg *Config) roundTripper() http.RoundTripper { if cfg.RoundTripper == nil { return DefaultRoundTripper } return cfg.RoundTripper } func (cfg *Config) client() http.Client { if cfg.Client == nil { return http.Client{ Transport: cfg.roundTripper(), } } return *cfg.Client } func (cfg *Config) validate() error { if cfg.Client != nil && cfg.RoundTripper != nil { return errors.New("api.Config.RoundTripper and api.Config.Client are mutually exclusive") } return nil } // Client is the interface for an API client. type Client interface { URL(ep string, args map[string]string) *url.URL Do(context.Context, *http.Request) (*http.Response, []byte, error) } // NewClient returns a new Client. // // It is safe to use the returned Client from multiple goroutines. func NewClient(cfg Config) (Client, error) { u, err := url.Parse(cfg.Address) if err != nil { return nil, err } u.Path = strings.TrimRight(u.Path, "/") if err := cfg.validate(); err != nil { return nil, err } return &httpClient{ endpoint: u, client: cfg.client(), }, nil } type httpClient struct { endpoint *url.URL client http.Client } func (c *httpClient) URL(ep string, args map[string]string) *url.URL { p := path.Join(c.endpoint.Path, ep) for arg, val := range args { arg = ":" + arg p = strings.ReplaceAll(p, arg, val) } u := *c.endpoint u.Path = p return &u } func (c *httpClient) Do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { if ctx != nil { req = req.WithContext(ctx) } resp, err := c.client.Do(req) defer func() { if resp != nil { resp.Body.Close() } }() if err != nil { return nil, nil, err } var body []byte done := make(chan struct{}) go func() { var buf bytes.Buffer _, err = buf.ReadFrom(resp.Body) body = buf.Bytes() close(done) }() select { case <-ctx.Done(): <-done err = resp.Body.Close() if err == nil { err = ctx.Err() } case <-done: } return resp, body, err } client_golang-1.19.1/api/client_test.go000066400000000000000000000074061461713521000200340ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package api import ( "bytes" "context" "fmt" "net/http" "net/http/httptest" "net/url" "testing" ) func TestConfig(t *testing.T) { c := Config{} if c.roundTripper() != DefaultRoundTripper { t.Fatalf("expected default roundtripper for nil RoundTripper field") } } func TestClientURL(t *testing.T) { tests := []struct { address string endpoint string args map[string]string expected string }{ { address: "http://localhost:9090", endpoint: "/test", expected: "http://localhost:9090/test", }, { address: "http://localhost", endpoint: "/test", expected: "http://localhost/test", }, { address: "http://localhost:9090", endpoint: "test", expected: "http://localhost:9090/test", }, { address: "http://localhost:9090/prefix", endpoint: "/test", expected: "http://localhost:9090/prefix/test", }, { address: "https://localhost:9090/", endpoint: "/test/", expected: "https://localhost:9090/test", }, { address: "http://localhost:9090", endpoint: "/test/:param", args: map[string]string{ "param": "content", }, expected: "http://localhost:9090/test/content", }, { address: "http://localhost:9090", endpoint: "/test/:param/more/:param", args: map[string]string{ "param": "content", }, expected: "http://localhost:9090/test/content/more/content", }, { address: "http://localhost:9090", endpoint: "/test/:param/more/:foo", args: map[string]string{ "param": "content", "foo": "bar", }, expected: "http://localhost:9090/test/content/more/bar", }, { address: "http://localhost:9090", endpoint: "/test/:param", args: map[string]string{ "nonexistent": "content", }, expected: "http://localhost:9090/test/:param", }, } for _, test := range tests { ep, err := url.Parse(test.address) if err != nil { t.Fatal(err) } hclient := &httpClient{ endpoint: ep, client: http.Client{Transport: DefaultRoundTripper}, } u := hclient.URL(test.endpoint, test.args) if u.String() != test.expected { t.Errorf("unexpected result: got %s, want %s", u, test.expected) continue } } } // Serve any http request with a response of N KB of spaces. type serveSpaces struct { sizeKB int } func (t serveSpaces) ServeHTTP(w http.ResponseWriter, req *http.Request) { kb := bytes.Repeat([]byte{' '}, 1024) for i := 0; i < t.sizeKB; i++ { w.Write(kb) } } func BenchmarkClient(b *testing.B) { b.ReportAllocs() ctx := context.Background() for _, sizeKB := range []int{4, 50, 1000, 2000} { b.Run(fmt.Sprintf("%dKB", sizeKB), func(b *testing.B) { testServer := httptest.NewServer(serveSpaces{sizeKB}) defer testServer.Close() client, err := NewClient(Config{ Address: testServer.URL, }) if err != nil { b.Fatalf("Failed to initialize client: %v", err) } url, err := url.Parse(testServer.URL + "/prometheus/api/v1/query?query=up") if err != nil { b.Fatalf("Failed to parse url: %v", err) } req := &http.Request{ URL: url, } b.ResetTimer() for i := 0; i < b.N; i++ { _, _, err := client.Do(ctx, req) if err != nil { b.Fatalf("Query failed: %v", err) } } b.StopTimer() }) } } client_golang-1.19.1/api/prometheus/000077500000000000000000000000001461713521000173545ustar00rootroot00000000000000client_golang-1.19.1/api/prometheus/v1/000077500000000000000000000000001461713521000177025ustar00rootroot00000000000000client_golang-1.19.1/api/prometheus/v1/api.go000066400000000000000000001226701461713521000210120ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package v1 provides bindings to the Prometheus HTTP API v1: // http://prometheus.io/docs/querying/api/ package v1 import ( "context" "errors" "fmt" "math" "net/http" "net/url" "strconv" "strings" "time" "unsafe" json "github.com/json-iterator/go" "github.com/prometheus/common/model" "github.com/prometheus/client_golang/api" ) func init() { json.RegisterTypeEncoderFunc("model.SamplePair", marshalSamplePairJSON, marshalJSONIsEmpty) json.RegisterTypeDecoderFunc("model.SamplePair", unmarshalSamplePairJSON) json.RegisterTypeEncoderFunc("model.SampleHistogramPair", marshalSampleHistogramPairJSON, marshalJSONIsEmpty) json.RegisterTypeDecoderFunc("model.SampleHistogramPair", unmarshalSampleHistogramPairJSON) json.RegisterTypeEncoderFunc("model.SampleStream", marshalSampleStreamJSON, marshalJSONIsEmpty) // Only needed for benchmark. json.RegisterTypeDecoderFunc("model.SampleStream", unmarshalSampleStreamJSON) // Only needed for benchmark. } func unmarshalSamplePairJSON(ptr unsafe.Pointer, iter *json.Iterator) { p := (*model.SamplePair)(ptr) if !iter.ReadArray() { iter.ReportError("unmarshal model.SamplePair", "SamplePair must be [timestamp, value]") return } t := iter.ReadNumber() if err := p.Timestamp.UnmarshalJSON([]byte(t)); err != nil { iter.ReportError("unmarshal model.SamplePair", err.Error()) return } if !iter.ReadArray() { iter.ReportError("unmarshal model.SamplePair", "SamplePair missing value") return } f, err := strconv.ParseFloat(iter.ReadString(), 64) if err != nil { iter.ReportError("unmarshal model.SamplePair", err.Error()) return } p.Value = model.SampleValue(f) if iter.ReadArray() { iter.ReportError("unmarshal model.SamplePair", "SamplePair has too many values, must be [timestamp, value]") return } } func marshalSamplePairJSON(ptr unsafe.Pointer, stream *json.Stream) { p := *((*model.SamplePair)(ptr)) stream.WriteArrayStart() marshalTimestamp(p.Timestamp, stream) stream.WriteMore() marshalFloat(float64(p.Value), stream) stream.WriteArrayEnd() } func unmarshalSampleHistogramPairJSON(ptr unsafe.Pointer, iter *json.Iterator) { p := (*model.SampleHistogramPair)(ptr) if !iter.ReadArray() { iter.ReportError("unmarshal model.SampleHistogramPair", "SampleHistogramPair must be [timestamp, {histogram}]") return } t := iter.ReadNumber() if err := p.Timestamp.UnmarshalJSON([]byte(t)); err != nil { iter.ReportError("unmarshal model.SampleHistogramPair", err.Error()) return } if !iter.ReadArray() { iter.ReportError("unmarshal model.SampleHistogramPair", "SamplePair missing histogram") return } h := &model.SampleHistogram{} p.Histogram = h for key := iter.ReadObject(); key != ""; key = iter.ReadObject() { switch key { case "count": f, err := strconv.ParseFloat(iter.ReadString(), 64) if err != nil { iter.ReportError("unmarshal model.SampleHistogramPair", "count of histogram is not a float") return } h.Count = model.FloatString(f) case "sum": f, err := strconv.ParseFloat(iter.ReadString(), 64) if err != nil { iter.ReportError("unmarshal model.SampleHistogramPair", "sum of histogram is not a float") return } h.Sum = model.FloatString(f) case "buckets": for iter.ReadArray() { b, err := unmarshalHistogramBucket(iter) if err != nil { iter.ReportError("unmarshal model.HistogramBucket", err.Error()) return } h.Buckets = append(h.Buckets, b) } default: iter.ReportError("unmarshal model.SampleHistogramPair", fmt.Sprint("unexpected key in histogram:", key)) return } } if iter.ReadArray() { iter.ReportError("unmarshal model.SampleHistogramPair", "SampleHistogramPair has too many values, must be [timestamp, {histogram}]") return } } func marshalSampleHistogramPairJSON(ptr unsafe.Pointer, stream *json.Stream) { p := *((*model.SampleHistogramPair)(ptr)) stream.WriteArrayStart() marshalTimestamp(p.Timestamp, stream) stream.WriteMore() marshalHistogram(*p.Histogram, stream) stream.WriteArrayEnd() } func unmarshalSampleStreamJSON(ptr unsafe.Pointer, iter *json.Iterator) { ss := (*model.SampleStream)(ptr) for key := iter.ReadObject(); key != ""; key = iter.ReadObject() { switch key { case "metric": metricString := iter.ReadAny().ToString() if err := json.UnmarshalFromString(metricString, &ss.Metric); err != nil { iter.ReportError("unmarshal model.SampleStream", err.Error()) return } case "values": for iter.ReadArray() { v := model.SamplePair{} unmarshalSamplePairJSON(unsafe.Pointer(&v), iter) ss.Values = append(ss.Values, v) } case "histograms": for iter.ReadArray() { h := model.SampleHistogramPair{} unmarshalSampleHistogramPairJSON(unsafe.Pointer(&h), iter) ss.Histograms = append(ss.Histograms, h) } default: iter.ReportError("unmarshal model.SampleStream", fmt.Sprint("unexpected key:", key)) return } } } func marshalSampleStreamJSON(ptr unsafe.Pointer, stream *json.Stream) { ss := *((*model.SampleStream)(ptr)) stream.WriteObjectStart() stream.WriteObjectField(`metric`) m, err := json.ConfigCompatibleWithStandardLibrary.Marshal(ss.Metric) if err != nil { stream.Error = err return } stream.SetBuffer(append(stream.Buffer(), m...)) if len(ss.Values) > 0 { stream.WriteMore() stream.WriteObjectField(`values`) stream.WriteArrayStart() for i, v := range ss.Values { if i > 0 { stream.WriteMore() } marshalSamplePairJSON(unsafe.Pointer(&v), stream) } stream.WriteArrayEnd() } if len(ss.Histograms) > 0 { stream.WriteMore() stream.WriteObjectField(`histograms`) stream.WriteArrayStart() for i, h := range ss.Histograms { if i > 0 { stream.WriteMore() } marshalSampleHistogramPairJSON(unsafe.Pointer(&h), stream) } stream.WriteArrayEnd() } stream.WriteObjectEnd() } func marshalFloat(v float64, stream *json.Stream) { stream.WriteRaw(`"`) // Taken from https://github.com/json-iterator/go/blob/master/stream_float.go#L71 as a workaround // to https://github.com/json-iterator/go/issues/365 (json-iterator, to follow json standard, doesn't allow inf/nan). buf := stream.Buffer() abs := math.Abs(v) fmt := byte('f') // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. if abs != 0 { if abs < 1e-6 || abs >= 1e21 { fmt = 'e' } } buf = strconv.AppendFloat(buf, v, fmt, -1, 64) stream.SetBuffer(buf) stream.WriteRaw(`"`) } func marshalTimestamp(timestamp model.Time, stream *json.Stream) { t := int64(timestamp) // Write out the timestamp as a float divided by 1000. // This is ~3x faster than converting to a float. if t < 0 { stream.WriteRaw(`-`) t = -t } stream.WriteInt64(t / 1000) fraction := t % 1000 if fraction != 0 { stream.WriteRaw(`.`) if fraction < 100 { stream.WriteRaw(`0`) } if fraction < 10 { stream.WriteRaw(`0`) } stream.WriteInt64(fraction) } } func unmarshalHistogramBucket(iter *json.Iterator) (*model.HistogramBucket, error) { b := model.HistogramBucket{} if !iter.ReadArray() { return nil, errors.New("HistogramBucket must be [boundaries, lower, upper, count]") } boundaries, err := iter.ReadNumber().Int64() if err != nil { return nil, err } b.Boundaries = int32(boundaries) if !iter.ReadArray() { return nil, errors.New("HistogramBucket must be [boundaries, lower, upper, count]") } f, err := strconv.ParseFloat(iter.ReadString(), 64) if err != nil { return nil, err } b.Lower = model.FloatString(f) if !iter.ReadArray() { return nil, errors.New("HistogramBucket must be [boundaries, lower, upper, count]") } f, err = strconv.ParseFloat(iter.ReadString(), 64) if err != nil { return nil, err } b.Upper = model.FloatString(f) if !iter.ReadArray() { return nil, errors.New("HistogramBucket must be [boundaries, lower, upper, count]") } f, err = strconv.ParseFloat(iter.ReadString(), 64) if err != nil { return nil, err } b.Count = model.FloatString(f) if iter.ReadArray() { return nil, errors.New("HistogramBucket has too many values, must be [boundaries, lower, upper, count]") } return &b, nil } // marshalHistogramBucket writes something like: [ 3, "-0.25", "0.25", "3"] // See marshalHistogram to understand what the numbers mean func marshalHistogramBucket(b model.HistogramBucket, stream *json.Stream) { stream.WriteArrayStart() stream.WriteInt32(b.Boundaries) stream.WriteMore() marshalFloat(float64(b.Lower), stream) stream.WriteMore() marshalFloat(float64(b.Upper), stream) stream.WriteMore() marshalFloat(float64(b.Count), stream) stream.WriteArrayEnd() } // marshalHistogram writes something like: // // { // "count": "42", // "sum": "34593.34", // "buckets": [ // [ 3, "-0.25", "0.25", "3"], // [ 0, "0.25", "0.5", "12"], // [ 0, "0.5", "1", "21"], // [ 0, "2", "4", "6"] // ] // } // // The 1st element in each bucket array determines if the boundaries are // inclusive (AKA closed) or exclusive (AKA open): // // 0: lower exclusive, upper inclusive // 1: lower inclusive, upper exclusive // 2: both exclusive // 3: both inclusive // // The 2nd and 3rd elements are the lower and upper boundary. The 4th element is // the bucket count. func marshalHistogram(h model.SampleHistogram, stream *json.Stream) { stream.WriteObjectStart() stream.WriteObjectField(`count`) marshalFloat(float64(h.Count), stream) stream.WriteMore() stream.WriteObjectField(`sum`) marshalFloat(float64(h.Sum), stream) bucketFound := false for _, bucket := range h.Buckets { if bucket.Count == 0 { continue // No need to expose empty buckets in JSON. } stream.WriteMore() if !bucketFound { stream.WriteObjectField(`buckets`) stream.WriteArrayStart() } bucketFound = true marshalHistogramBucket(*bucket, stream) } if bucketFound { stream.WriteArrayEnd() } stream.WriteObjectEnd() } func marshalJSONIsEmpty(ptr unsafe.Pointer) bool { return false } const ( apiPrefix = "/api/v1" epAlerts = apiPrefix + "/alerts" epAlertManagers = apiPrefix + "/alertmanagers" epQuery = apiPrefix + "/query" epQueryRange = apiPrefix + "/query_range" epQueryExemplars = apiPrefix + "/query_exemplars" epLabels = apiPrefix + "/labels" epLabelValues = apiPrefix + "/label/:name/values" epSeries = apiPrefix + "/series" epTargets = apiPrefix + "/targets" epTargetsMetadata = apiPrefix + "/targets/metadata" epMetadata = apiPrefix + "/metadata" epRules = apiPrefix + "/rules" epSnapshot = apiPrefix + "/admin/tsdb/snapshot" epDeleteSeries = apiPrefix + "/admin/tsdb/delete_series" epCleanTombstones = apiPrefix + "/admin/tsdb/clean_tombstones" epConfig = apiPrefix + "/status/config" epFlags = apiPrefix + "/status/flags" epBuildinfo = apiPrefix + "/status/buildinfo" epRuntimeinfo = apiPrefix + "/status/runtimeinfo" epTSDB = apiPrefix + "/status/tsdb" epWalReplay = apiPrefix + "/status/walreplay" ) // AlertState models the state of an alert. type AlertState string // ErrorType models the different API error types. type ErrorType string // HealthStatus models the health status of a scrape target. type HealthStatus string // RuleType models the type of a rule. type RuleType string // RuleHealth models the health status of a rule. type RuleHealth string // MetricType models the type of a metric. type MetricType string const ( // Possible values for AlertState. AlertStateFiring AlertState = "firing" AlertStateInactive AlertState = "inactive" AlertStatePending AlertState = "pending" // Possible values for ErrorType. ErrBadData ErrorType = "bad_data" ErrTimeout ErrorType = "timeout" ErrCanceled ErrorType = "canceled" ErrExec ErrorType = "execution" ErrBadResponse ErrorType = "bad_response" ErrServer ErrorType = "server_error" ErrClient ErrorType = "client_error" // Possible values for HealthStatus. HealthGood HealthStatus = "up" HealthUnknown HealthStatus = "unknown" HealthBad HealthStatus = "down" // Possible values for RuleType. RuleTypeRecording RuleType = "recording" RuleTypeAlerting RuleType = "alerting" // Possible values for RuleHealth. RuleHealthGood = "ok" RuleHealthUnknown = "unknown" RuleHealthBad = "err" // Possible values for MetricType MetricTypeCounter MetricType = "counter" MetricTypeGauge MetricType = "gauge" MetricTypeHistogram MetricType = "histogram" MetricTypeGaugeHistogram MetricType = "gaugehistogram" MetricTypeSummary MetricType = "summary" MetricTypeInfo MetricType = "info" MetricTypeStateset MetricType = "stateset" MetricTypeUnknown MetricType = "unknown" ) // Error is an error returned by the API. type Error struct { Type ErrorType Msg string Detail string } func (e *Error) Error() string { return fmt.Sprintf("%s: %s", e.Type, e.Msg) } // Range represents a sliced time range. type Range struct { // The boundaries of the time range. Start, End time.Time // The maximum time between two slices within the boundaries. Step time.Duration } // API provides bindings for Prometheus's v1 API. type API interface { // Alerts returns a list of all active alerts. Alerts(ctx context.Context) (AlertsResult, error) // AlertManagers returns an overview of the current state of the Prometheus alert manager discovery. AlertManagers(ctx context.Context) (AlertManagersResult, error) // CleanTombstones removes the deleted data from disk and cleans up the existing tombstones. CleanTombstones(ctx context.Context) error // Config returns the current Prometheus configuration. Config(ctx context.Context) (ConfigResult, error) // DeleteSeries deletes data for a selection of series in a time range. DeleteSeries(ctx context.Context, matches []string, startTime, endTime time.Time) error // Flags returns the flag values that Prometheus was launched with. Flags(ctx context.Context) (FlagsResult, error) // LabelNames returns the unique label names present in the block in sorted order by given time range and matchers. LabelNames(ctx context.Context, matches []string, startTime, endTime time.Time) ([]string, Warnings, error) // LabelValues performs a query for the values of the given label, time range and matchers. LabelValues(ctx context.Context, label string, matches []string, startTime, endTime time.Time) (model.LabelValues, Warnings, error) // Query performs a query for the given time. Query(ctx context.Context, query string, ts time.Time, opts ...Option) (model.Value, Warnings, error) // QueryRange performs a query for the given range. QueryRange(ctx context.Context, query string, r Range, opts ...Option) (model.Value, Warnings, error) // QueryExemplars performs a query for exemplars by the given query and time range. QueryExemplars(ctx context.Context, query string, startTime, endTime time.Time) ([]ExemplarQueryResult, error) // Buildinfo returns various build information properties about the Prometheus server Buildinfo(ctx context.Context) (BuildinfoResult, error) // Runtimeinfo returns the various runtime information properties about the Prometheus server. Runtimeinfo(ctx context.Context) (RuntimeinfoResult, error) // Series finds series by label matchers. Series(ctx context.Context, matches []string, startTime, endTime time.Time) ([]model.LabelSet, Warnings, error) // Snapshot creates a snapshot of all current data into snapshots/- // under the TSDB's data directory and returns the directory as response. Snapshot(ctx context.Context, skipHead bool) (SnapshotResult, error) // Rules returns a list of alerting and recording rules that are currently loaded. Rules(ctx context.Context) (RulesResult, error) // Targets returns an overview of the current state of the Prometheus target discovery. Targets(ctx context.Context) (TargetsResult, error) // TargetsMetadata returns metadata about metrics currently scraped by the target. TargetsMetadata(ctx context.Context, matchTarget, metric, limit string) ([]MetricMetadata, error) // Metadata returns metadata about metrics currently scraped by the metric name. Metadata(ctx context.Context, metric, limit string) (map[string][]Metadata, error) // TSDB returns the cardinality statistics. TSDB(ctx context.Context) (TSDBResult, error) // WalReplay returns the current replay status of the wal. WalReplay(ctx context.Context) (WalReplayStatus, error) } // AlertsResult contains the result from querying the alerts endpoint. type AlertsResult struct { Alerts []Alert `json:"alerts"` } // AlertManagersResult contains the result from querying the alertmanagers endpoint. type AlertManagersResult struct { Active []AlertManager `json:"activeAlertManagers"` Dropped []AlertManager `json:"droppedAlertManagers"` } // AlertManager models a configured Alert Manager. type AlertManager struct { URL string `json:"url"` } // ConfigResult contains the result from querying the config endpoint. type ConfigResult struct { YAML string `json:"yaml"` } // FlagsResult contains the result from querying the flag endpoint. type FlagsResult map[string]string // BuildinfoResult contains the results from querying the buildinfo endpoint. type BuildinfoResult struct { Version string `json:"version"` Revision string `json:"revision"` Branch string `json:"branch"` BuildUser string `json:"buildUser"` BuildDate string `json:"buildDate"` GoVersion string `json:"goVersion"` } // RuntimeinfoResult contains the result from querying the runtimeinfo endpoint. type RuntimeinfoResult struct { StartTime time.Time `json:"startTime"` CWD string `json:"CWD"` ReloadConfigSuccess bool `json:"reloadConfigSuccess"` LastConfigTime time.Time `json:"lastConfigTime"` CorruptionCount int `json:"corruptionCount"` GoroutineCount int `json:"goroutineCount"` GOMAXPROCS int `json:"GOMAXPROCS"` GOGC string `json:"GOGC"` GODEBUG string `json:"GODEBUG"` StorageRetention string `json:"storageRetention"` } // SnapshotResult contains the result from querying the snapshot endpoint. type SnapshotResult struct { Name string `json:"name"` } // RulesResult contains the result from querying the rules endpoint. type RulesResult struct { Groups []RuleGroup `json:"groups"` } // RuleGroup models a rule group that contains a set of recording and alerting rules. type RuleGroup struct { Name string `json:"name"` File string `json:"file"` Interval float64 `json:"interval"` Rules Rules `json:"rules"` } // Recording and alerting rules are stored in the same slice to preserve the order // that rules are returned in by the API. // // Rule types can be determined using a type switch: // // switch v := rule.(type) { // case RecordingRule: // fmt.Print("got a recording rule") // case AlertingRule: // fmt.Print("got a alerting rule") // default: // fmt.Printf("unknown rule type %s", v) // } type Rules []interface{} // AlertingRule models a alerting rule. type AlertingRule struct { Name string `json:"name"` Query string `json:"query"` Duration float64 `json:"duration"` Labels model.LabelSet `json:"labels"` Annotations model.LabelSet `json:"annotations"` Alerts []*Alert `json:"alerts"` Health RuleHealth `json:"health"` LastError string `json:"lastError,omitempty"` EvaluationTime float64 `json:"evaluationTime"` LastEvaluation time.Time `json:"lastEvaluation"` State string `json:"state"` } // RecordingRule models a recording rule. type RecordingRule struct { Name string `json:"name"` Query string `json:"query"` Labels model.LabelSet `json:"labels,omitempty"` Health RuleHealth `json:"health"` LastError string `json:"lastError,omitempty"` EvaluationTime float64 `json:"evaluationTime"` LastEvaluation time.Time `json:"lastEvaluation"` } // Alert models an active alert. type Alert struct { ActiveAt time.Time `json:"activeAt"` Annotations model.LabelSet Labels model.LabelSet State AlertState Value string } // TargetsResult contains the result from querying the targets endpoint. type TargetsResult struct { Active []ActiveTarget `json:"activeTargets"` Dropped []DroppedTarget `json:"droppedTargets"` } // ActiveTarget models an active Prometheus scrape target. type ActiveTarget struct { DiscoveredLabels map[string]string `json:"discoveredLabels"` Labels model.LabelSet `json:"labels"` ScrapePool string `json:"scrapePool"` ScrapeURL string `json:"scrapeUrl"` GlobalURL string `json:"globalUrl"` LastError string `json:"lastError"` LastScrape time.Time `json:"lastScrape"` LastScrapeDuration float64 `json:"lastScrapeDuration"` Health HealthStatus `json:"health"` } // DroppedTarget models a dropped Prometheus scrape target. type DroppedTarget struct { DiscoveredLabels map[string]string `json:"discoveredLabels"` } // MetricMetadata models the metadata of a metric with its scrape target and name. type MetricMetadata struct { Target map[string]string `json:"target"` Metric string `json:"metric,omitempty"` Type MetricType `json:"type"` Help string `json:"help"` Unit string `json:"unit"` } // Metadata models the metadata of a metric. type Metadata struct { Type MetricType `json:"type"` Help string `json:"help"` Unit string `json:"unit"` } // queryResult contains result data for a query. type queryResult struct { Type model.ValueType `json:"resultType"` Result interface{} `json:"result"` // The decoded value. v model.Value } // TSDBResult contains the result from querying the tsdb endpoint. type TSDBResult struct { HeadStats TSDBHeadStats `json:"headStats"` SeriesCountByMetricName []Stat `json:"seriesCountByMetricName"` LabelValueCountByLabelName []Stat `json:"labelValueCountByLabelName"` MemoryInBytesByLabelName []Stat `json:"memoryInBytesByLabelName"` SeriesCountByLabelValuePair []Stat `json:"seriesCountByLabelValuePair"` } // TSDBHeadStats contains TSDB stats type TSDBHeadStats struct { NumSeries int `json:"numSeries"` NumLabelPairs int `json:"numLabelPairs"` ChunkCount int `json:"chunkCount"` MinTime int `json:"minTime"` MaxTime int `json:"maxTime"` } // WalReplayStatus represents the wal replay status. type WalReplayStatus struct { Min int `json:"min"` Max int `json:"max"` Current int `json:"current"` } // Stat models information about statistic value. type Stat struct { Name string `json:"name"` Value uint64 `json:"value"` } func (rg *RuleGroup) UnmarshalJSON(b []byte) error { v := struct { Name string `json:"name"` File string `json:"file"` Interval float64 `json:"interval"` Rules []json.RawMessage `json:"rules"` }{} if err := json.Unmarshal(b, &v); err != nil { return err } rg.Name = v.Name rg.File = v.File rg.Interval = v.Interval for _, rule := range v.Rules { alertingRule := AlertingRule{} if err := json.Unmarshal(rule, &alertingRule); err == nil { rg.Rules = append(rg.Rules, alertingRule) continue } recordingRule := RecordingRule{} if err := json.Unmarshal(rule, &recordingRule); err == nil { rg.Rules = append(rg.Rules, recordingRule) continue } return errors.New("failed to decode JSON into an alerting or recording rule") } return nil } func (r *AlertingRule) UnmarshalJSON(b []byte) error { v := struct { Type string `json:"type"` }{} if err := json.Unmarshal(b, &v); err != nil { return err } if v.Type == "" { return errors.New("type field not present in rule") } if v.Type != string(RuleTypeAlerting) { return fmt.Errorf("expected rule of type %s but got %s", string(RuleTypeAlerting), v.Type) } rule := struct { Name string `json:"name"` Query string `json:"query"` Duration float64 `json:"duration"` Labels model.LabelSet `json:"labels"` Annotations model.LabelSet `json:"annotations"` Alerts []*Alert `json:"alerts"` Health RuleHealth `json:"health"` LastError string `json:"lastError,omitempty"` EvaluationTime float64 `json:"evaluationTime"` LastEvaluation time.Time `json:"lastEvaluation"` State string `json:"state"` }{} if err := json.Unmarshal(b, &rule); err != nil { return err } r.Health = rule.Health r.Annotations = rule.Annotations r.Name = rule.Name r.Query = rule.Query r.Alerts = rule.Alerts r.Duration = rule.Duration r.Labels = rule.Labels r.LastError = rule.LastError r.EvaluationTime = rule.EvaluationTime r.LastEvaluation = rule.LastEvaluation r.State = rule.State return nil } func (r *RecordingRule) UnmarshalJSON(b []byte) error { v := struct { Type string `json:"type"` }{} if err := json.Unmarshal(b, &v); err != nil { return err } if v.Type == "" { return errors.New("type field not present in rule") } if v.Type != string(RuleTypeRecording) { return fmt.Errorf("expected rule of type %s but got %s", string(RuleTypeRecording), v.Type) } rule := struct { Name string `json:"name"` Query string `json:"query"` Labels model.LabelSet `json:"labels,omitempty"` Health RuleHealth `json:"health"` LastError string `json:"lastError,omitempty"` EvaluationTime float64 `json:"evaluationTime"` LastEvaluation time.Time `json:"lastEvaluation"` }{} if err := json.Unmarshal(b, &rule); err != nil { return err } r.Health = rule.Health r.Labels = rule.Labels r.Name = rule.Name r.LastError = rule.LastError r.Query = rule.Query r.EvaluationTime = rule.EvaluationTime r.LastEvaluation = rule.LastEvaluation return nil } func (qr *queryResult) UnmarshalJSON(b []byte) error { v := struct { Type model.ValueType `json:"resultType"` Result json.RawMessage `json:"result"` }{} err := json.Unmarshal(b, &v) if err != nil { return err } switch v.Type { case model.ValScalar: var sv model.Scalar err = json.Unmarshal(v.Result, &sv) qr.v = &sv case model.ValVector: var vv model.Vector err = json.Unmarshal(v.Result, &vv) qr.v = vv case model.ValMatrix: var mv model.Matrix err = json.Unmarshal(v.Result, &mv) qr.v = mv default: err = fmt.Errorf("unexpected value type %q", v.Type) } return err } // Exemplar is additional information associated with a time series. type Exemplar struct { Labels model.LabelSet `json:"labels"` Value model.SampleValue `json:"value"` Timestamp model.Time `json:"timestamp"` } type ExemplarQueryResult struct { SeriesLabels model.LabelSet `json:"seriesLabels"` Exemplars []Exemplar `json:"exemplars"` } // NewAPI returns a new API for the client. // // It is safe to use the returned API from multiple goroutines. func NewAPI(c api.Client) API { return &httpAPI{ client: &apiClientImpl{ client: c, }, } } type httpAPI struct { client apiClient } func (h *httpAPI) Alerts(ctx context.Context) (AlertsResult, error) { u := h.client.URL(epAlerts, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return AlertsResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return AlertsResult{}, err } var res AlertsResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) AlertManagers(ctx context.Context) (AlertManagersResult, error) { u := h.client.URL(epAlertManagers, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return AlertManagersResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return AlertManagersResult{}, err } var res AlertManagersResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) CleanTombstones(ctx context.Context) error { u := h.client.URL(epCleanTombstones, nil) req, err := http.NewRequest(http.MethodPost, u.String(), nil) if err != nil { return err } _, _, _, err = h.client.Do(ctx, req) return err } func (h *httpAPI) Config(ctx context.Context) (ConfigResult, error) { u := h.client.URL(epConfig, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return ConfigResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return ConfigResult{}, err } var res ConfigResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) DeleteSeries(ctx context.Context, matches []string, startTime, endTime time.Time) error { u := h.client.URL(epDeleteSeries, nil) q := u.Query() for _, m := range matches { q.Add("match[]", m) } if !startTime.IsZero() { q.Set("start", formatTime(startTime)) } if !endTime.IsZero() { q.Set("end", formatTime(endTime)) } u.RawQuery = q.Encode() req, err := http.NewRequest(http.MethodPost, u.String(), nil) if err != nil { return err } _, _, _, err = h.client.Do(ctx, req) return err } func (h *httpAPI) Flags(ctx context.Context) (FlagsResult, error) { u := h.client.URL(epFlags, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return FlagsResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return FlagsResult{}, err } var res FlagsResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) Buildinfo(ctx context.Context) (BuildinfoResult, error) { u := h.client.URL(epBuildinfo, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return BuildinfoResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return BuildinfoResult{}, err } var res BuildinfoResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) Runtimeinfo(ctx context.Context) (RuntimeinfoResult, error) { u := h.client.URL(epRuntimeinfo, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return RuntimeinfoResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return RuntimeinfoResult{}, err } var res RuntimeinfoResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) LabelNames(ctx context.Context, matches []string, startTime, endTime time.Time) ([]string, Warnings, error) { u := h.client.URL(epLabels, nil) q := u.Query() if !startTime.IsZero() { q.Set("start", formatTime(startTime)) } if !endTime.IsZero() { q.Set("end", formatTime(endTime)) } for _, m := range matches { q.Add("match[]", m) } _, body, w, err := h.client.DoGetFallback(ctx, u, q) if err != nil { return nil, w, err } var labelNames []string err = json.Unmarshal(body, &labelNames) return labelNames, w, err } func (h *httpAPI) LabelValues(ctx context.Context, label string, matches []string, startTime, endTime time.Time) (model.LabelValues, Warnings, error) { u := h.client.URL(epLabelValues, map[string]string{"name": label}) q := u.Query() if !startTime.IsZero() { q.Set("start", formatTime(startTime)) } if !endTime.IsZero() { q.Set("end", formatTime(endTime)) } for _, m := range matches { q.Add("match[]", m) } u.RawQuery = q.Encode() req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return nil, nil, err } _, body, w, err := h.client.Do(ctx, req) if err != nil { return nil, w, err } var labelValues model.LabelValues err = json.Unmarshal(body, &labelValues) return labelValues, w, err } type apiOptions struct { timeout time.Duration } type Option func(c *apiOptions) // WithTimeout can be used to provide an optional query evaluation timeout for Query and QueryRange. // https://prometheus.io/docs/prometheus/latest/querying/api/#instant-queries func WithTimeout(timeout time.Duration) Option { return func(o *apiOptions) { o.timeout = timeout } } func (h *httpAPI) Query(ctx context.Context, query string, ts time.Time, opts ...Option) (model.Value, Warnings, error) { u := h.client.URL(epQuery, nil) q := u.Query() opt := &apiOptions{} for _, o := range opts { o(opt) } d := opt.timeout if d > 0 { q.Set("timeout", d.String()) } q.Set("query", query) if !ts.IsZero() { q.Set("time", formatTime(ts)) } _, body, warnings, err := h.client.DoGetFallback(ctx, u, q) if err != nil { return nil, warnings, err } var qres queryResult return qres.v, warnings, json.Unmarshal(body, &qres) } func (h *httpAPI) QueryRange(ctx context.Context, query string, r Range, opts ...Option) (model.Value, Warnings, error) { u := h.client.URL(epQueryRange, nil) q := u.Query() q.Set("query", query) q.Set("start", formatTime(r.Start)) q.Set("end", formatTime(r.End)) q.Set("step", strconv.FormatFloat(r.Step.Seconds(), 'f', -1, 64)) opt := &apiOptions{} for _, o := range opts { o(opt) } d := opt.timeout if d > 0 { q.Set("timeout", d.String()) } _, body, warnings, err := h.client.DoGetFallback(ctx, u, q) if err != nil { return nil, warnings, err } var qres queryResult return qres.v, warnings, json.Unmarshal(body, &qres) } func (h *httpAPI) Series(ctx context.Context, matches []string, startTime, endTime time.Time) ([]model.LabelSet, Warnings, error) { u := h.client.URL(epSeries, nil) q := u.Query() for _, m := range matches { q.Add("match[]", m) } if !startTime.IsZero() { q.Set("start", formatTime(startTime)) } if !endTime.IsZero() { q.Set("end", formatTime(endTime)) } _, body, warnings, err := h.client.DoGetFallback(ctx, u, q) if err != nil { return nil, warnings, err } var mset []model.LabelSet err = json.Unmarshal(body, &mset) return mset, warnings, err } func (h *httpAPI) Snapshot(ctx context.Context, skipHead bool) (SnapshotResult, error) { u := h.client.URL(epSnapshot, nil) q := u.Query() q.Set("skip_head", strconv.FormatBool(skipHead)) u.RawQuery = q.Encode() req, err := http.NewRequest(http.MethodPost, u.String(), nil) if err != nil { return SnapshotResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return SnapshotResult{}, err } var res SnapshotResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) Rules(ctx context.Context) (RulesResult, error) { u := h.client.URL(epRules, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return RulesResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return RulesResult{}, err } var res RulesResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) Targets(ctx context.Context) (TargetsResult, error) { u := h.client.URL(epTargets, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return TargetsResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return TargetsResult{}, err } var res TargetsResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) TargetsMetadata(ctx context.Context, matchTarget, metric, limit string) ([]MetricMetadata, error) { u := h.client.URL(epTargetsMetadata, nil) q := u.Query() q.Set("match_target", matchTarget) q.Set("metric", metric) q.Set("limit", limit) u.RawQuery = q.Encode() req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return nil, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return nil, err } var res []MetricMetadata err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) Metadata(ctx context.Context, metric, limit string) (map[string][]Metadata, error) { u := h.client.URL(epMetadata, nil) q := u.Query() q.Set("metric", metric) q.Set("limit", limit) u.RawQuery = q.Encode() req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return nil, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return nil, err } var res map[string][]Metadata err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) TSDB(ctx context.Context) (TSDBResult, error) { u := h.client.URL(epTSDB, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return TSDBResult{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return TSDBResult{}, err } var res TSDBResult err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) WalReplay(ctx context.Context) (WalReplayStatus, error) { u := h.client.URL(epWalReplay, nil) req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return WalReplayStatus{}, err } _, body, _, err := h.client.Do(ctx, req) if err != nil { return WalReplayStatus{}, err } var res WalReplayStatus err = json.Unmarshal(body, &res) return res, err } func (h *httpAPI) QueryExemplars(ctx context.Context, query string, startTime, endTime time.Time) ([]ExemplarQueryResult, error) { u := h.client.URL(epQueryExemplars, nil) q := u.Query() q.Set("query", query) if !startTime.IsZero() { q.Set("start", formatTime(startTime)) } if !endTime.IsZero() { q.Set("end", formatTime(endTime)) } _, body, _, err := h.client.DoGetFallback(ctx, u, q) if err != nil { return nil, err } var res []ExemplarQueryResult err = json.Unmarshal(body, &res) return res, err } // Warnings is an array of non critical errors type Warnings []string // apiClient wraps a regular client and processes successful API responses. // Successful also includes responses that errored at the API level. type apiClient interface { URL(ep string, args map[string]string) *url.URL Do(context.Context, *http.Request) (*http.Response, []byte, Warnings, error) DoGetFallback(ctx context.Context, u *url.URL, args url.Values) (*http.Response, []byte, Warnings, error) } type apiClientImpl struct { client api.Client } type apiResponse struct { Status string `json:"status"` Data json.RawMessage `json:"data"` ErrorType ErrorType `json:"errorType"` Error string `json:"error"` Warnings []string `json:"warnings,omitempty"` } func apiError(code int) bool { // These are the codes that Prometheus sends when it returns an error. return code == http.StatusUnprocessableEntity || code == http.StatusBadRequest } func errorTypeAndMsgFor(resp *http.Response) (ErrorType, string) { switch resp.StatusCode / 100 { case 4: return ErrClient, fmt.Sprintf("client error: %d", resp.StatusCode) case 5: return ErrServer, fmt.Sprintf("server error: %d", resp.StatusCode) } return ErrBadResponse, fmt.Sprintf("bad response code %d", resp.StatusCode) } func (h *apiClientImpl) URL(ep string, args map[string]string) *url.URL { return h.client.URL(ep, args) } func (h *apiClientImpl) Do(ctx context.Context, req *http.Request) (*http.Response, []byte, Warnings, error) { resp, body, err := h.client.Do(ctx, req) if err != nil { return resp, body, nil, err } code := resp.StatusCode if code/100 != 2 && !apiError(code) { errorType, errorMsg := errorTypeAndMsgFor(resp) return resp, body, nil, &Error{ Type: errorType, Msg: errorMsg, Detail: string(body), } } var result apiResponse if http.StatusNoContent != code { if jsonErr := json.Unmarshal(body, &result); jsonErr != nil { return resp, body, nil, &Error{ Type: ErrBadResponse, Msg: jsonErr.Error(), } } } if apiError(code) && result.Status == "success" { err = &Error{ Type: ErrBadResponse, Msg: "inconsistent body for response code", } } if result.Status == "error" { err = &Error{ Type: result.ErrorType, Msg: result.Error, } } return resp, []byte(result.Data), result.Warnings, err } // DoGetFallback will attempt to do the request as-is, and on a 405 or 501 it // will fallback to a GET request. func (h *apiClientImpl) DoGetFallback(ctx context.Context, u *url.URL, args url.Values) (*http.Response, []byte, Warnings, error) { encodedArgs := args.Encode() req, err := http.NewRequest(http.MethodPost, u.String(), strings.NewReader(encodedArgs)) if err != nil { return nil, nil, nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") // Following comment originates from https://pkg.go.dev/net/http#Transport // Transport only retries a request upon encountering a network error if the request is // idempotent and either has no body or has its Request.GetBody defined. HTTP requests // are considered idempotent if they have HTTP methods GET, HEAD, OPTIONS, or TRACE; or // if their Header map contains an "Idempotency-Key" or "X-Idempotency-Key" entry. If the // idempotency key value is a zero-length slice, the request is treated as idempotent but // the header is not sent on the wire. req.Header["Idempotency-Key"] = nil resp, body, warnings, err := h.Do(ctx, req) if resp != nil && (resp.StatusCode == http.StatusMethodNotAllowed || resp.StatusCode == http.StatusNotImplemented) { u.RawQuery = encodedArgs req, err = http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return nil, nil, warnings, err } return h.Do(ctx, req) } return resp, body, warnings, err } func formatTime(t time.Time) string { return strconv.FormatFloat(float64(t.Unix())+float64(t.Nanosecond())/1e9, 'f', -1, 64) } client_golang-1.19.1/api/prometheus/v1/api_bench_test.go000066400000000000000000000131071461713521000232020ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package v1 import ( "encoding/json" "strconv" "testing" "time" jsoniter "github.com/json-iterator/go" "github.com/prometheus/common/model" ) func generateData(timeseries, datapoints int) (floatMatrix, histogramMatrix model.Matrix) { for i := 0; i < timeseries; i++ { lset := map[model.LabelName]model.LabelValue{ model.MetricNameLabel: model.LabelValue("timeseries_" + strconv.Itoa(i)), "foo": "bar", } now := model.Time(1677587274055) floats := make([]model.SamplePair, datapoints) histograms := make([]model.SampleHistogramPair, datapoints) for x := datapoints; x > 0; x-- { f := float64(x) floats[x-1] = model.SamplePair{ // Set the time back assuming a 15s interval. Since this is used for // Marshal/Unmarshal testing the actual interval doesn't matter. Timestamp: now.Add(time.Second * -15 * time.Duration(x)), Value: model.SampleValue(f), } histograms[x-1] = model.SampleHistogramPair{ Timestamp: now.Add(time.Second * -15 * time.Duration(x)), Histogram: &model.SampleHistogram{ Count: model.FloatString(13.5 * f), Sum: model.FloatString(.1 * f), Buckets: model.HistogramBuckets{ { Boundaries: 1, Lower: -4870.992343051145, Upper: -4466.7196729968955, Count: model.FloatString(1 * f), }, { Boundaries: 1, Lower: -861.0779292198035, Upper: -789.6119426088657, Count: model.FloatString(2 * f), }, { Boundaries: 1, Lower: -558.3399591246119, Upper: -512, Count: model.FloatString(3 * f), }, { Boundaries: 0, Lower: 2048, Upper: 2233.3598364984477, Count: model.FloatString(1.5 * f), }, { Boundaries: 0, Lower: 2896.3093757400984, Upper: 3158.4477704354626, Count: model.FloatString(2.5 * f), }, { Boundaries: 0, Lower: 4466.7196729968955, Upper: 4870.992343051145, Count: model.FloatString(3.5 * f), }, }, }, } } fss := &model.SampleStream{ Metric: model.Metric(lset), Values: floats, } hss := &model.SampleStream{ Metric: model.Metric(lset), Histograms: histograms, } floatMatrix = append(floatMatrix, fss) histogramMatrix = append(histogramMatrix, hss) } return } func BenchmarkSamplesJsonSerialization(b *testing.B) { for _, timeseriesCount := range []int{10, 100, 1000} { b.Run(strconv.Itoa(timeseriesCount), func(b *testing.B) { for _, datapointCount := range []int{10, 100, 1000} { b.Run(strconv.Itoa(datapointCount), func(b *testing.B) { floats, histograms := generateData(timeseriesCount, datapointCount) floatBytes, err := json.Marshal(floats) if err != nil { b.Fatalf("Error marshaling: %v", err) } histogramBytes, err := json.Marshal(histograms) if err != nil { b.Fatalf("Error marshaling: %v", err) } b.Run("marshal", func(b *testing.B) { b.Run("encoding/json/floats", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { if _, err := json.Marshal(floats); err != nil { b.Fatal(err) } } }) b.Run("jsoniter/floats", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { if _, err := jsoniter.Marshal(floats); err != nil { b.Fatal(err) } } }) b.Run("encoding/json/histograms", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { if _, err := json.Marshal(histograms); err != nil { b.Fatal(err) } } }) b.Run("jsoniter/histograms", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { if _, err := jsoniter.Marshal(histograms); err != nil { b.Fatal(err) } } }) }) b.Run("unmarshal", func(b *testing.B) { b.Run("encoding/json/floats", func(b *testing.B) { b.ReportAllocs() var m model.Matrix for i := 0; i < b.N; i++ { if err := json.Unmarshal(floatBytes, &m); err != nil { b.Fatal(err) } } }) b.Run("jsoniter/floats", func(b *testing.B) { b.ReportAllocs() var m model.Matrix for i := 0; i < b.N; i++ { if err := jsoniter.Unmarshal(floatBytes, &m); err != nil { b.Fatal(err) } } }) b.Run("encoding/json/histograms", func(b *testing.B) { b.ReportAllocs() var m model.Matrix for i := 0; i < b.N; i++ { if err := json.Unmarshal(histogramBytes, &m); err != nil { b.Fatal(err) } } }) b.Run("jsoniter/histograms", func(b *testing.B) { b.ReportAllocs() var m model.Matrix for i := 0; i < b.N; i++ { if err := jsoniter.Unmarshal(histogramBytes, &m); err != nil { b.Fatal(err) } } }) }) }) } }) } } client_golang-1.19.1/api/prometheus/v1/api_test.go000066400000000000000000001431611461713521000220470ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package v1 import ( "context" "errors" "fmt" "io" "math" "net/http" "net/http/httptest" "net/url" "reflect" "strings" "testing" "time" json "github.com/json-iterator/go" "github.com/prometheus/common/model" ) type apiTest struct { do func() (interface{}, Warnings, error) inWarnings []string inErr error inStatusCode int inRes interface{} reqPath string reqMethod string res interface{} err error } type apiTestClient struct { *testing.T curTest apiTest } func (c *apiTestClient) URL(ep string, args map[string]string) *url.URL { path := ep for k, v := range args { path = strings.ReplaceAll(path, ":"+k, v) } u := &url.URL{ Host: "test:9090", Path: path, } return u } func (c *apiTestClient) Do(_ context.Context, req *http.Request) (*http.Response, []byte, Warnings, error) { test := c.curTest if req.URL.Path != test.reqPath { c.Errorf("unexpected request path: want %s, got %s", test.reqPath, req.URL.Path) } if req.Method != test.reqMethod { c.Errorf("unexpected request method: want %s, got %s", test.reqMethod, req.Method) } b, err := json.Marshal(test.inRes) if err != nil { c.Fatal(err) } resp := &http.Response{} if test.inStatusCode != 0 { resp.StatusCode = test.inStatusCode } else if test.inErr != nil { resp.StatusCode = http.StatusUnprocessableEntity } else { resp.StatusCode = http.StatusOK } return resp, b, test.inWarnings, test.inErr } func (c *apiTestClient) DoGetFallback(ctx context.Context, u *url.URL, args url.Values) (*http.Response, []byte, Warnings, error) { req, err := http.NewRequest(http.MethodPost, u.String(), strings.NewReader(args.Encode())) if err != nil { return nil, nil, nil, err } return c.Do(ctx, req) } func TestAPIs(t *testing.T) { testTime := time.Now() tc := &apiTestClient{ T: t, } promAPI := &httpAPI{ client: tc, } doAlertManagers := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.AlertManagers(context.Background()) return v, nil, err } } doCleanTombstones := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return nil, nil, promAPI.CleanTombstones(context.Background()) } } doConfig := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Config(context.Background()) return v, nil, err } } doDeleteSeries := func(matcher string, startTime, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return nil, nil, promAPI.DeleteSeries(context.Background(), []string{matcher}, startTime, endTime) } } doFlags := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Flags(context.Background()) return v, nil, err } } doBuildinfo := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Buildinfo(context.Background()) return v, nil, err } } doRuntimeinfo := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Runtimeinfo(context.Background()) return v, nil, err } } doLabelNames := func(matches []string, startTime, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return promAPI.LabelNames(context.Background(), matches, startTime, endTime) } } doLabelValues := func(matches []string, label string, startTime, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return promAPI.LabelValues(context.Background(), label, matches, startTime, endTime) } } doQuery := func(q string, ts time.Time, opts ...Option) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return promAPI.Query(context.Background(), q, ts, opts...) } } doQueryRange := func(q string, rng Range, opts ...Option) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return promAPI.QueryRange(context.Background(), q, rng, opts...) } } doSeries := func(matcher string, startTime, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { return promAPI.Series(context.Background(), []string{matcher}, startTime, endTime) } } doSnapshot := func(skipHead bool) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Snapshot(context.Background(), skipHead) return v, nil, err } } doRules := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Rules(context.Background()) return v, nil, err } } doTargets := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Targets(context.Background()) return v, nil, err } } doTargetsMetadata := func(matchTarget, metric, limit string) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.TargetsMetadata(context.Background(), matchTarget, metric, limit) return v, nil, err } } doMetadata := func(metric, limit string) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.Metadata(context.Background(), metric, limit) return v, nil, err } } doTSDB := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.TSDB(context.Background()) return v, nil, err } } doWalReply := func() func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.WalReplay(context.Background()) return v, nil, err } } doQueryExemplars := func(query string, startTime, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.QueryExemplars(context.Background(), query, startTime, endTime) return v, nil, err } } queryTests := []apiTest{ { do: doQuery("2", testTime, WithTimeout(5*time.Second)), inRes: &queryResult{ Type: model.ValScalar, Result: &model.Scalar{ Value: 2, Timestamp: model.TimeFromUnix(testTime.Unix()), }, }, reqMethod: "POST", reqPath: "/api/v1/query", res: &model.Scalar{ Value: 2, Timestamp: model.TimeFromUnix(testTime.Unix()), }, }, { do: doQuery("2", testTime), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/query", err: errors.New("some error"), }, { do: doQuery("2", testTime), inRes: "some body", inStatusCode: 500, inErr: &Error{ Type: ErrServer, Msg: "server error: 500", Detail: "some body", }, reqMethod: "POST", reqPath: "/api/v1/query", err: errors.New("server_error: server error: 500"), }, { do: doQuery("2", testTime), inRes: "some body", inStatusCode: 404, inErr: &Error{ Type: ErrClient, Msg: "client error: 404", Detail: "some body", }, reqMethod: "POST", reqPath: "/api/v1/query", err: errors.New("client_error: client error: 404"), }, // Warning only. { do: doQuery("2", testTime), inWarnings: []string{"warning"}, inRes: &queryResult{ Type: model.ValScalar, Result: &model.Scalar{ Value: 2, Timestamp: model.TimeFromUnix(testTime.Unix()), }, }, reqMethod: "POST", reqPath: "/api/v1/query", res: &model.Scalar{ Value: 2, Timestamp: model.TimeFromUnix(testTime.Unix()), }, }, // Warning + error. { do: doQuery("2", testTime), inWarnings: []string{"warning"}, inRes: "some body", inStatusCode: 404, inErr: &Error{ Type: ErrClient, Msg: "client error: 404", Detail: "some body", }, reqMethod: "POST", reqPath: "/api/v1/query", err: errors.New("client_error: client error: 404"), }, { do: doQueryRange("2", Range{ Start: testTime.Add(-time.Minute), End: testTime, Step: 1 * time.Minute, }, WithTimeout(5*time.Second)), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/query_range", err: errors.New("some error"), }, { do: doLabelNames(nil, testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, reqMethod: "POST", reqPath: "/api/v1/labels", res: []string{"val1", "val2"}, }, { do: doLabelNames(nil, testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, inWarnings: []string{"a"}, reqMethod: "POST", reqPath: "/api/v1/labels", res: []string{"val1", "val2"}, }, { do: doLabelNames(nil, testTime.Add(-100*time.Hour), testTime), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/labels", err: errors.New("some error"), }, { do: doLabelNames(nil, testTime.Add(-100*time.Hour), testTime), inErr: fmt.Errorf("some error"), inWarnings: []string{"a"}, reqMethod: "POST", reqPath: "/api/v1/labels", err: errors.New("some error"), }, { do: doLabelNames([]string{"up"}, testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, reqMethod: "POST", reqPath: "/api/v1/labels", res: []string{"val1", "val2"}, }, { do: doLabelValues(nil, "mylabel", testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, reqMethod: "GET", reqPath: "/api/v1/label/mylabel/values", res: model.LabelValues{"val1", "val2"}, }, { do: doLabelValues(nil, "mylabel", testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, inWarnings: []string{"a"}, reqMethod: "GET", reqPath: "/api/v1/label/mylabel/values", res: model.LabelValues{"val1", "val2"}, }, { do: doLabelValues(nil, "mylabel", testTime.Add(-100*time.Hour), testTime), inErr: fmt.Errorf("some error"), reqMethod: "GET", reqPath: "/api/v1/label/mylabel/values", err: errors.New("some error"), }, { do: doLabelValues(nil, "mylabel", testTime.Add(-100*time.Hour), testTime), inErr: fmt.Errorf("some error"), inWarnings: []string{"a"}, reqMethod: "GET", reqPath: "/api/v1/label/mylabel/values", err: errors.New("some error"), }, { do: doLabelValues([]string{"up"}, "mylabel", testTime.Add(-100*time.Hour), testTime), inRes: []string{"val1", "val2"}, reqMethod: "GET", reqPath: "/api/v1/label/mylabel/values", res: model.LabelValues{"val1", "val2"}, }, { do: doSeries("up", testTime.Add(-time.Minute), testTime), inRes: []map[string]string{ { "__name__": "up", "job": "prometheus", "instance": "localhost:9090", }, }, reqMethod: "POST", reqPath: "/api/v1/series", res: []model.LabelSet{ { "__name__": "up", "job": "prometheus", "instance": "localhost:9090", }, }, }, // Series with data + warning. { do: doSeries("up", testTime.Add(-time.Minute), testTime), inRes: []map[string]string{ { "__name__": "up", "job": "prometheus", "instance": "localhost:9090", }, }, inWarnings: []string{"a"}, reqMethod: "POST", reqPath: "/api/v1/series", res: []model.LabelSet{ { "__name__": "up", "job": "prometheus", "instance": "localhost:9090", }, }, }, { do: doSeries("up", testTime.Add(-time.Minute), testTime), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/series", err: errors.New("some error"), }, // Series with error and warning. { do: doSeries("up", testTime.Add(-time.Minute), testTime), inErr: fmt.Errorf("some error"), inWarnings: []string{"a"}, reqMethod: "POST", reqPath: "/api/v1/series", err: errors.New("some error"), }, { do: doSnapshot(true), inRes: map[string]string{ "name": "20171210T211224Z-2be650b6d019eb54", }, reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/snapshot", res: SnapshotResult{ Name: "20171210T211224Z-2be650b6d019eb54", }, }, { do: doSnapshot(true), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/snapshot", err: errors.New("some error"), }, { do: doCleanTombstones(), reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/clean_tombstones", }, { do: doCleanTombstones(), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/clean_tombstones", err: errors.New("some error"), }, { do: doDeleteSeries("up", testTime.Add(-time.Minute), testTime), inRes: []map[string]string{ { "__name__": "up", "job": "prometheus", "instance": "localhost:9090", }, }, reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/delete_series", }, { do: doDeleteSeries("up", testTime.Add(-time.Minute), testTime), inErr: fmt.Errorf("some error"), reqMethod: "POST", reqPath: "/api/v1/admin/tsdb/delete_series", err: errors.New("some error"), }, { do: doConfig(), reqMethod: "GET", reqPath: "/api/v1/status/config", inRes: map[string]string{ "yaml": "", }, res: ConfigResult{ YAML: "", }, }, { do: doConfig(), reqMethod: "GET", reqPath: "/api/v1/status/config", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doFlags(), reqMethod: "GET", reqPath: "/api/v1/status/flags", inRes: map[string]string{ "alertmanager.notification-queue-capacity": "10000", "alertmanager.timeout": "10s", "log.level": "info", "query.lookback-delta": "5m", "query.max-concurrency": "20", }, res: FlagsResult{ "alertmanager.notification-queue-capacity": "10000", "alertmanager.timeout": "10s", "log.level": "info", "query.lookback-delta": "5m", "query.max-concurrency": "20", }, }, { do: doFlags(), reqMethod: "GET", reqPath: "/api/v1/status/flags", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doBuildinfo(), reqMethod: "GET", reqPath: "/api/v1/status/buildinfo", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doBuildinfo(), reqMethod: "GET", reqPath: "/api/v1/status/buildinfo", inRes: map[string]interface{}{ "version": "2.23.0", "revision": "26d89b4b0776fe4cd5a3656dfa520f119a375273", "branch": "HEAD", "buildUser": "root@37609b3a0a21", "buildDate": "20201126-10:56:17", "goVersion": "go1.15.5", }, res: BuildinfoResult{ Version: "2.23.0", Revision: "26d89b4b0776fe4cd5a3656dfa520f119a375273", Branch: "HEAD", BuildUser: "root@37609b3a0a21", BuildDate: "20201126-10:56:17", GoVersion: "go1.15.5", }, }, { do: doRuntimeinfo(), reqMethod: "GET", reqPath: "/api/v1/status/runtimeinfo", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doRuntimeinfo(), reqMethod: "GET", reqPath: "/api/v1/status/runtimeinfo", inRes: map[string]interface{}{ "startTime": "2020-05-18T15:52:53.4503113Z", "CWD": "/prometheus", "reloadConfigSuccess": true, "lastConfigTime": "2020-05-18T15:52:56Z", "corruptionCount": 0, "goroutineCount": 217, "GOMAXPROCS": 2, "GOGC": "100", "GODEBUG": "allocfreetrace", "storageRetention": "1d", }, res: RuntimeinfoResult{ StartTime: time.Date(2020, 5, 18, 15, 52, 53, 450311300, time.UTC), CWD: "/prometheus", ReloadConfigSuccess: true, LastConfigTime: time.Date(2020, 5, 18, 15, 52, 56, 0, time.UTC), CorruptionCount: 0, GoroutineCount: 217, GOMAXPROCS: 2, GOGC: "100", GODEBUG: "allocfreetrace", StorageRetention: "1d", }, }, { do: doAlertManagers(), reqMethod: "GET", reqPath: "/api/v1/alertmanagers", inRes: map[string]interface{}{ "activeAlertManagers": []map[string]string{ { "url": "http://127.0.0.1:9091/api/v1/alerts", }, }, "droppedAlertManagers": []map[string]string{ { "url": "http://127.0.0.1:9092/api/v1/alerts", }, }, }, res: AlertManagersResult{ Active: []AlertManager{ { URL: "http://127.0.0.1:9091/api/v1/alerts", }, }, Dropped: []AlertManager{ { URL: "http://127.0.0.1:9092/api/v1/alerts", }, }, }, }, { do: doAlertManagers(), reqMethod: "GET", reqPath: "/api/v1/alertmanagers", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doRules(), reqMethod: "GET", reqPath: "/api/v1/rules", inRes: map[string]interface{}{ "groups": []map[string]interface{}{ { "file": "/rules.yaml", "interval": 60, "name": "example", "rules": []map[string]interface{}{ { "alerts": []map[string]interface{}{ { "activeAt": testTime.UTC().Format(time.RFC3339Nano), "annotations": map[string]interface{}{ "summary": "High request latency", }, "labels": map[string]interface{}{ "alertname": "HighRequestLatency", "severity": "page", }, "state": "firing", "value": "1e+00", }, }, "annotations": map[string]interface{}{ "summary": "High request latency", }, "duration": 600, "health": "ok", "labels": map[string]interface{}{ "severity": "page", }, "name": "HighRequestLatency", "query": "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5", "type": "alerting", }, { "health": "ok", "name": "job:http_inprogress_requests:sum", "query": "sum(http_inprogress_requests) by (job)", "type": "recording", }, }, }, }, }, res: RulesResult{ Groups: []RuleGroup{ { Name: "example", File: "/rules.yaml", Interval: 60, Rules: []interface{}{ AlertingRule{ Alerts: []*Alert{ { ActiveAt: testTime.UTC(), Annotations: model.LabelSet{ "summary": "High request latency", }, Labels: model.LabelSet{ "alertname": "HighRequestLatency", "severity": "page", }, State: AlertStateFiring, Value: "1e+00", }, }, Annotations: model.LabelSet{ "summary": "High request latency", }, Labels: model.LabelSet{ "severity": "page", }, Duration: 600, Health: RuleHealthGood, Name: "HighRequestLatency", Query: "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5", LastError: "", }, RecordingRule{ Health: RuleHealthGood, Name: "job:http_inprogress_requests:sum", Query: "sum(http_inprogress_requests) by (job)", LastError: "", }, }, }, }, }, }, // This has the newer API elements like lastEvaluation, evaluationTime, etc. { do: doRules(), reqMethod: "GET", reqPath: "/api/v1/rules", inRes: map[string]interface{}{ "groups": []map[string]interface{}{ { "file": "/rules.yaml", "interval": 60, "name": "example", "rules": []map[string]interface{}{ { "alerts": []map[string]interface{}{ { "activeAt": testTime.UTC().Format(time.RFC3339Nano), "annotations": map[string]interface{}{ "summary": "High request latency", }, "labels": map[string]interface{}{ "alertname": "HighRequestLatency", "severity": "page", }, "state": "firing", "value": "1e+00", }, }, "annotations": map[string]interface{}{ "summary": "High request latency", }, "duration": 600, "health": "ok", "labels": map[string]interface{}{ "severity": "page", }, "name": "HighRequestLatency", "query": "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5", "type": "alerting", "evaluationTime": 0.5, "lastEvaluation": "2020-05-18T15:52:53.4503113Z", "state": "firing", }, { "health": "ok", "name": "job:http_inprogress_requests:sum", "query": "sum(http_inprogress_requests) by (job)", "type": "recording", "evaluationTime": 0.3, "lastEvaluation": "2020-05-18T15:52:53.4503113Z", }, }, }, }, }, res: RulesResult{ Groups: []RuleGroup{ { Name: "example", File: "/rules.yaml", Interval: 60, Rules: []interface{}{ AlertingRule{ Alerts: []*Alert{ { ActiveAt: testTime.UTC(), Annotations: model.LabelSet{ "summary": "High request latency", }, Labels: model.LabelSet{ "alertname": "HighRequestLatency", "severity": "page", }, State: AlertStateFiring, Value: "1e+00", }, }, Annotations: model.LabelSet{ "summary": "High request latency", }, Labels: model.LabelSet{ "severity": "page", }, Duration: 600, Health: RuleHealthGood, Name: "HighRequestLatency", Query: "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5", LastError: "", EvaluationTime: 0.5, LastEvaluation: time.Date(2020, 5, 18, 15, 52, 53, 450311300, time.UTC), State: "firing", }, RecordingRule{ Health: RuleHealthGood, Name: "job:http_inprogress_requests:sum", Query: "sum(http_inprogress_requests) by (job)", LastError: "", EvaluationTime: 0.3, LastEvaluation: time.Date(2020, 5, 18, 15, 52, 53, 450311300, time.UTC), }, }, }, }, }, }, { do: doRules(), reqMethod: "GET", reqPath: "/api/v1/rules", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doTargets(), reqMethod: "GET", reqPath: "/api/v1/targets", inRes: map[string]interface{}{ "activeTargets": []map[string]interface{}{ { "discoveredLabels": map[string]string{ "__address__": "127.0.0.1:9090", "__metrics_path__": "/metrics", "__scheme__": "http", "job": "prometheus", }, "labels": map[string]string{ "instance": "127.0.0.1:9090", "job": "prometheus", }, "scrapePool": "prometheus", "scrapeUrl": "http://127.0.0.1:9090", "globalUrl": "http://127.0.0.1:9090", "lastError": "error while scraping target", "lastScrape": testTime.UTC().Format(time.RFC3339Nano), "lastScrapeDuration": 0.001146115, "health": "up", }, }, "droppedTargets": []map[string]interface{}{ { "discoveredLabels": map[string]string{ "__address__": "127.0.0.1:9100", "__metrics_path__": "/metrics", "__scheme__": "http", "job": "node", }, }, }, }, res: TargetsResult{ Active: []ActiveTarget{ { DiscoveredLabels: map[string]string{ "__address__": "127.0.0.1:9090", "__metrics_path__": "/metrics", "__scheme__": "http", "job": "prometheus", }, Labels: model.LabelSet{ "instance": "127.0.0.1:9090", "job": "prometheus", }, ScrapePool: "prometheus", ScrapeURL: "http://127.0.0.1:9090", GlobalURL: "http://127.0.0.1:9090", LastError: "error while scraping target", LastScrape: testTime.UTC(), LastScrapeDuration: 0.001146115, Health: HealthGood, }, }, Dropped: []DroppedTarget{ { DiscoveredLabels: map[string]string{ "__address__": "127.0.0.1:9100", "__metrics_path__": "/metrics", "__scheme__": "http", "job": "node", }, }, }, }, }, { do: doTargets(), reqMethod: "GET", reqPath: "/api/v1/targets", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doTargetsMetadata("{job=\"prometheus\"}", "go_goroutines", "1"), inRes: []map[string]interface{}{ { "target": map[string]interface{}{ "instance": "127.0.0.1:9090", "job": "prometheus", }, "type": "gauge", "help": "Number of goroutines that currently exist.", "unit": "", }, }, reqMethod: "GET", reqPath: "/api/v1/targets/metadata", res: []MetricMetadata{ { Target: map[string]string{ "instance": "127.0.0.1:9090", "job": "prometheus", }, Type: "gauge", Help: "Number of goroutines that currently exist.", Unit: "", }, }, }, { do: doTargetsMetadata("{job=\"prometheus\"}", "go_goroutines", "1"), inErr: fmt.Errorf("some error"), reqMethod: "GET", reqPath: "/api/v1/targets/metadata", err: errors.New("some error"), }, { do: doMetadata("go_goroutines", "1"), inRes: map[string]interface{}{ "go_goroutines": []map[string]interface{}{ { "type": "gauge", "help": "Number of goroutines that currently exist.", "unit": "", }, }, }, reqMethod: "GET", reqPath: "/api/v1/metadata", res: map[string][]Metadata{ "go_goroutines": { { Type: "gauge", Help: "Number of goroutines that currently exist.", Unit: "", }, }, }, }, { do: doMetadata("", "1"), inErr: fmt.Errorf("some error"), reqMethod: "GET", reqPath: "/api/v1/metadata", err: errors.New("some error"), }, { do: doTSDB(), reqMethod: "GET", reqPath: "/api/v1/status/tsdb", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doTSDB(), reqMethod: "GET", reqPath: "/api/v1/status/tsdb", inRes: map[string]interface{}{ "headStats": map[string]interface{}{ "numSeries": 18476, "numLabelPairs": 4301, "chunkCount": 72692, "minTime": 1634644800304, "maxTime": 1634650590304, }, "seriesCountByMetricName": []interface{}{ map[string]interface{}{ "name": "kubelet_http_requests_duration_seconds_bucket", "value": 1000, }, }, "labelValueCountByLabelName": []interface{}{ map[string]interface{}{ "name": "__name__", "value": 200, }, }, "memoryInBytesByLabelName": []interface{}{ map[string]interface{}{ "name": "id", "value": 4096, }, }, "seriesCountByLabelValuePair": []interface{}{ map[string]interface{}{ "name": "job=kubelet", "value": 30000, }, }, }, res: TSDBResult{ HeadStats: TSDBHeadStats{ NumSeries: 18476, NumLabelPairs: 4301, ChunkCount: 72692, MinTime: 1634644800304, MaxTime: 1634650590304, }, SeriesCountByMetricName: []Stat{ { Name: "kubelet_http_requests_duration_seconds_bucket", Value: 1000, }, }, LabelValueCountByLabelName: []Stat{ { Name: "__name__", Value: 200, }, }, MemoryInBytesByLabelName: []Stat{ { Name: "id", Value: 4096, }, }, SeriesCountByLabelValuePair: []Stat{ { Name: "job=kubelet", Value: 30000, }, }, }, }, { do: doWalReply(), reqMethod: "GET", reqPath: "/api/v1/status/walreplay", inErr: fmt.Errorf("some error"), err: fmt.Errorf("some error"), }, { do: doWalReply(), reqMethod: "GET", reqPath: "/api/v1/status/walreplay", inRes: map[string]interface{}{ "min": 2, "max": 5, "current": 40, }, res: WalReplayStatus{ Min: 2, Max: 5, Current: 40, }, }, { do: doQueryExemplars("tns_request_duration_seconds_bucket", testTime.Add(-1*time.Minute), testTime), reqMethod: "POST", reqPath: "/api/v1/query_exemplars", inErr: errors.New("some error"), err: errors.New("some error"), }, { do: doQueryExemplars("tns_request_duration_seconds_bucket", testTime.Add(-1*time.Minute), testTime), reqMethod: "POST", reqPath: "/api/v1/query_exemplars", inRes: []interface{}{ map[string]interface{}{ "seriesLabels": map[string]interface{}{ "__name__": "tns_request_duration_seconds_bucket", "instance": "app:80", "job": "tns/app", }, "exemplars": []interface{}{ map[string]interface{}{ "labels": map[string]interface{}{ "traceID": "19fd8c8a33975a23", }, "value": "0.003863295", "timestamp": model.TimeFromUnixNano(testTime.UnixNano()), }, map[string]interface{}{ "labels": map[string]interface{}{ "traceID": "67f743f07cc786b0", }, "value": "0.001535405", "timestamp": model.TimeFromUnixNano(testTime.UnixNano()), }, }, }, }, res: []ExemplarQueryResult{ { SeriesLabels: model.LabelSet{ "__name__": "tns_request_duration_seconds_bucket", "instance": "app:80", "job": "tns/app", }, Exemplars: []Exemplar{ { Labels: model.LabelSet{"traceID": "19fd8c8a33975a23"}, Value: 0.003863295, Timestamp: model.TimeFromUnixNano(testTime.UnixNano()), }, { Labels: model.LabelSet{"traceID": "67f743f07cc786b0"}, Value: 0.001535405, Timestamp: model.TimeFromUnixNano(testTime.UnixNano()), }, }, }, }, }, } var tests []apiTest tests = append(tests, queryTests...) for i, test := range tests { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { tc.curTest = test res, warnings, err := test.do() if (test.inWarnings == nil) != (warnings == nil) && !reflect.DeepEqual(test.inWarnings, warnings) { t.Fatalf("mismatch in warnings expected=%v actual=%v", test.inWarnings, warnings) } if test.err != nil { if err == nil { t.Fatalf("expected error %q but got none", test.err) } if err.Error() != test.err.Error() { t.Errorf("unexpected error: want %s, got %s", test.err, err) } apiErr := &Error{} if ok := errors.As(err, &apiErr); ok { if apiErr.Detail != test.inRes { t.Errorf("%q should be %q", apiErr.Detail, test.inRes) } } return } if err != nil { t.Fatalf("unexpected error: %s", err) } if !reflect.DeepEqual(res, test.res) { t.Errorf("unexpected result: want %v, got %v", test.res, res) } }) } } type testClient struct { *testing.T ch chan apiClientTest req *http.Request } type apiClientTest struct { code int response interface{} expectedBody string expectedErr *Error expectedWarnings Warnings } func (c *testClient) URL(ep string, args map[string]string) *url.URL { return nil } func (c *testClient) Do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { if ctx == nil { c.Fatalf("context was not passed down") } if req != c.req { c.Fatalf("request was not passed down") } test := <-c.ch var b []byte var err error switch v := test.response.(type) { case string: b = []byte(v) default: b, err = json.Marshal(v) if err != nil { c.Fatal(err) } } resp := &http.Response{ StatusCode: test.code, } return resp, b, nil } func TestAPIClientDo(t *testing.T) { tests := []apiClientTest{ { code: http.StatusUnprocessableEntity, response: &apiResponse{ Status: "error", Data: json.RawMessage(`null`), ErrorType: ErrBadData, Error: "failed", }, expectedErr: &Error{ Type: ErrBadData, Msg: "failed", }, expectedBody: `null`, }, { code: http.StatusUnprocessableEntity, response: &apiResponse{ Status: "error", Data: json.RawMessage(`"test"`), ErrorType: ErrTimeout, Error: "timed out", }, expectedErr: &Error{ Type: ErrTimeout, Msg: "timed out", }, expectedBody: `test`, }, { code: http.StatusInternalServerError, response: "500 error details", expectedErr: &Error{ Type: ErrServer, Msg: "server error: 500", Detail: "500 error details", }, }, { code: http.StatusNotFound, response: "404 error details", expectedErr: &Error{ Type: ErrClient, Msg: "client error: 404", Detail: "404 error details", }, }, { code: http.StatusBadRequest, response: &apiResponse{ Status: "error", Data: json.RawMessage(`null`), ErrorType: ErrBadData, Error: "end timestamp must not be before start time", }, expectedErr: &Error{ Type: ErrBadData, Msg: "end timestamp must not be before start time", }, }, { code: http.StatusUnprocessableEntity, response: "bad json", expectedErr: &Error{ Type: ErrBadResponse, Msg: "readObjectStart: expect { or n, but found b, error found in #1 byte of ...|bad json|..., bigger context ...|bad json|...", }, }, { code: http.StatusUnprocessableEntity, response: &apiResponse{ Status: "success", Data: json.RawMessage(`"test"`), }, expectedErr: &Error{ Type: ErrBadResponse, Msg: "inconsistent body for response code", }, }, { code: http.StatusUnprocessableEntity, response: &apiResponse{ Status: "success", Data: json.RawMessage(`"test"`), ErrorType: ErrTimeout, Error: "timed out", }, expectedErr: &Error{ Type: ErrBadResponse, Msg: "inconsistent body for response code", }, }, { code: http.StatusOK, response: &apiResponse{ Status: "error", Data: json.RawMessage(`"test"`), ErrorType: ErrTimeout, Error: "timed out", }, expectedErr: &Error{ Type: ErrTimeout, Msg: "timed out", }, }, { code: http.StatusOK, response: &apiResponse{ Status: "error", Data: json.RawMessage(`"test"`), ErrorType: ErrTimeout, Error: "timed out", Warnings: []string{"a"}, }, expectedErr: &Error{ Type: ErrTimeout, Msg: "timed out", }, expectedWarnings: []string{"a"}, }, } tc := &testClient{ T: t, ch: make(chan apiClientTest, 1), req: &http.Request{}, } client := &apiClientImpl{ client: tc, } for i, test := range tests { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { tc.ch <- test _, body, warnings, err := client.Do(context.Background(), tc.req) if test.expectedWarnings != nil { if !reflect.DeepEqual(test.expectedWarnings, warnings) { t.Fatalf("mismatch in warnings expected=%v actual=%v", test.expectedWarnings, warnings) } } else { if warnings != nil { t.Fatalf("unexpected warnings: %v", warnings) } } if test.expectedErr != nil { if err == nil { t.Fatal("expected error, but got none") } if test.expectedErr.Error() != err.Error() { t.Fatalf("expected error:%v, but got:%v", test.expectedErr.Error(), err.Error()) } if test.expectedErr.Detail != "" { apiErr := &Error{} if errors.As(err, &apiErr) { if apiErr.Detail != test.expectedErr.Detail { t.Fatalf("expected error detail :%v, but got:%v", apiErr.Detail, test.expectedErr.Detail) } } else { t.Fatalf("expected v1.Error instance, but got:%T", err) } } return } if err != nil { t.Fatalf("unexpected error:%v", err) } if test.expectedBody != string(body) { t.Fatalf("expected body :%v, but got:%v", test.expectedBody, string(body)) } }) } } func TestSamplesJSONSerialization(t *testing.T) { tests := []struct { point model.SamplePair expected string }{ { point: model.SamplePair{0, 0}, expected: `[0,"0"]`, }, { point: model.SamplePair{1, 20}, expected: `[0.001,"20"]`, }, { point: model.SamplePair{10, 20}, expected: `[0.010,"20"]`, }, { point: model.SamplePair{100, 20}, expected: `[0.100,"20"]`, }, { point: model.SamplePair{1001, 20}, expected: `[1.001,"20"]`, }, { point: model.SamplePair{1010, 20}, expected: `[1.010,"20"]`, }, { point: model.SamplePair{1100, 20}, expected: `[1.100,"20"]`, }, { point: model.SamplePair{12345678123456555, 20}, expected: `[12345678123456.555,"20"]`, }, { point: model.SamplePair{-1, 20}, expected: `[-0.001,"20"]`, }, { point: model.SamplePair{0, model.SampleValue(math.NaN())}, expected: `[0,"NaN"]`, }, { point: model.SamplePair{0, model.SampleValue(math.Inf(1))}, expected: `[0,"+Inf"]`, }, { point: model.SamplePair{0, model.SampleValue(math.Inf(-1))}, expected: `[0,"-Inf"]`, }, { point: model.SamplePair{0, model.SampleValue(1.2345678e6)}, expected: `[0,"1234567.8"]`, }, { point: model.SamplePair{0, 1.2345678e-6}, expected: `[0,"0.0000012345678"]`, }, { point: model.SamplePair{0, 1.2345678e-67}, expected: `[0,"1.2345678e-67"]`, }, } for _, test := range tests { t.Run(test.expected, func(t *testing.T) { b, err := json.Marshal(test.point) if err != nil { t.Fatal(err) } if string(b) != test.expected { t.Fatalf("Mismatch marshal expected=%s actual=%s", test.expected, string(b)) } // To test Unmarshal we will Unmarshal then re-Marshal this way we // can do a string compare, otherwise Nan values don't show equivalence // properly. var sp model.SamplePair if err = json.Unmarshal(b, &sp); err != nil { t.Fatal(err) } b, err = json.Marshal(sp) if err != nil { t.Fatal(err) } if string(b) != test.expected { t.Fatalf("Mismatch marshal expected=%s actual=%s", test.expected, string(b)) } }) } } func TestHistogramJSONSerialization(t *testing.T) { tests := []struct { name string point model.SampleHistogramPair expected string }{ { name: "empty histogram", point: model.SampleHistogramPair{ Timestamp: 0, Histogram: &model.SampleHistogram{}, }, expected: `[0,{"count":"0","sum":"0"}]`, }, { name: "histogram with NaN/Inf and no buckets", point: model.SampleHistogramPair{ Timestamp: 0, Histogram: &model.SampleHistogram{ Count: model.FloatString(math.NaN()), Sum: model.FloatString(math.Inf(1)), }, }, expected: `[0,{"count":"NaN","sum":"+Inf"}]`, }, { name: "six-bucket histogram", point: model.SampleHistogramPair{ Timestamp: 1, Histogram: &model.SampleHistogram{ Count: 13.5, Sum: 3897.1, Buckets: model.HistogramBuckets{ { Boundaries: 1, Lower: -4870.992343051145, Upper: -4466.7196729968955, Count: 1, }, { Boundaries: 1, Lower: -861.0779292198035, Upper: -789.6119426088657, Count: 2, }, { Boundaries: 1, Lower: -558.3399591246119, Upper: -512, Count: 3, }, { Boundaries: 0, Lower: 2048, Upper: 2233.3598364984477, Count: 1.5, }, { Boundaries: 0, Lower: 2896.3093757400984, Upper: 3158.4477704354626, Count: 2.5, }, { Boundaries: 0, Lower: 4466.7196729968955, Upper: 4870.992343051145, Count: 3.5, }, }, }, }, expected: `[0.001,{"count":"13.5","sum":"3897.1","buckets":[[1,"-4870.992343051145","-4466.7196729968955","1"],[1,"-861.0779292198035","-789.6119426088657","2"],[1,"-558.3399591246119","-512","3"],[0,"2048","2233.3598364984477","1.5"],[0,"2896.3093757400984","3158.4477704354626","2.5"],[0,"4466.7196729968955","4870.992343051145","3.5"]]}]`, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { b, err := json.Marshal(test.point) if err != nil { t.Fatal(err) } if string(b) != test.expected { t.Fatalf("Mismatch marshal expected=%s actual=%s", test.expected, string(b)) } // To test Unmarshal we will Unmarshal then re-Marshal. This way we // can do a string compare, otherwise NaN values don't show equivalence // properly. var sp model.SampleHistogramPair if err = json.Unmarshal(b, &sp); err != nil { t.Fatal(err) } b, err = json.Marshal(sp) if err != nil { t.Fatal(err) } if string(b) != test.expected { t.Fatalf("Mismatch marshal expected=%s actual=%s", test.expected, string(b)) } }) } } func TestSampleStreamJSONSerialization(t *testing.T) { floats, histograms := generateData(1, 5) tests := []struct { name string stream model.SampleStream expectedJSON string }{ { "floats", *floats[0], `{"metric":{"__name__":"timeseries_0","foo":"bar"},"values":[[1677587259.055,"1"],[1677587244.055,"2"],[1677587229.055,"3"],[1677587214.055,"4"],[1677587199.055,"5"]]}`, }, { "histograms", *histograms[0], `{"metric":{"__name__":"timeseries_0","foo":"bar"},"histograms":[[1677587259.055,{"count":"13.5","sum":"0.1","buckets":[[1,"-4870.992343051145","-4466.7196729968955","1"],[1,"-861.0779292198035","-789.6119426088657","2"],[1,"-558.3399591246119","-512","3"],[0,"2048","2233.3598364984477","1.5"],[0,"2896.3093757400984","3158.4477704354626","2.5"],[0,"4466.7196729968955","4870.992343051145","3.5"]]}],[1677587244.055,{"count":"27","sum":"0.2","buckets":[[1,"-4870.992343051145","-4466.7196729968955","2"],[1,"-861.0779292198035","-789.6119426088657","4"],[1,"-558.3399591246119","-512","6"],[0,"2048","2233.3598364984477","3"],[0,"2896.3093757400984","3158.4477704354626","5"],[0,"4466.7196729968955","4870.992343051145","7"]]}],[1677587229.055,{"count":"40.5","sum":"0.30000000000000004","buckets":[[1,"-4870.992343051145","-4466.7196729968955","3"],[1,"-861.0779292198035","-789.6119426088657","6"],[1,"-558.3399591246119","-512","9"],[0,"2048","2233.3598364984477","4.5"],[0,"2896.3093757400984","3158.4477704354626","7.5"],[0,"4466.7196729968955","4870.992343051145","10.5"]]}],[1677587214.055,{"count":"54","sum":"0.4","buckets":[[1,"-4870.992343051145","-4466.7196729968955","4"],[1,"-861.0779292198035","-789.6119426088657","8"],[1,"-558.3399591246119","-512","12"],[0,"2048","2233.3598364984477","6"],[0,"2896.3093757400984","3158.4477704354626","10"],[0,"4466.7196729968955","4870.992343051145","14"]]}],[1677587199.055,{"count":"67.5","sum":"0.5","buckets":[[1,"-4870.992343051145","-4466.7196729968955","5"],[1,"-861.0779292198035","-789.6119426088657","10"],[1,"-558.3399591246119","-512","15"],[0,"2048","2233.3598364984477","7.5"],[0,"2896.3093757400984","3158.4477704354626","12.5"],[0,"4466.7196729968955","4870.992343051145","17.5"]]}]]}`, }, { "both", model.SampleStream{ Metric: floats[0].Metric, Values: floats[0].Values, Histograms: histograms[0].Histograms, }, `{"metric":{"__name__":"timeseries_0","foo":"bar"},"values":[[1677587259.055,"1"],[1677587244.055,"2"],[1677587229.055,"3"],[1677587214.055,"4"],[1677587199.055,"5"]],"histograms":[[1677587259.055,{"count":"13.5","sum":"0.1","buckets":[[1,"-4870.992343051145","-4466.7196729968955","1"],[1,"-861.0779292198035","-789.6119426088657","2"],[1,"-558.3399591246119","-512","3"],[0,"2048","2233.3598364984477","1.5"],[0,"2896.3093757400984","3158.4477704354626","2.5"],[0,"4466.7196729968955","4870.992343051145","3.5"]]}],[1677587244.055,{"count":"27","sum":"0.2","buckets":[[1,"-4870.992343051145","-4466.7196729968955","2"],[1,"-861.0779292198035","-789.6119426088657","4"],[1,"-558.3399591246119","-512","6"],[0,"2048","2233.3598364984477","3"],[0,"2896.3093757400984","3158.4477704354626","5"],[0,"4466.7196729968955","4870.992343051145","7"]]}],[1677587229.055,{"count":"40.5","sum":"0.30000000000000004","buckets":[[1,"-4870.992343051145","-4466.7196729968955","3"],[1,"-861.0779292198035","-789.6119426088657","6"],[1,"-558.3399591246119","-512","9"],[0,"2048","2233.3598364984477","4.5"],[0,"2896.3093757400984","3158.4477704354626","7.5"],[0,"4466.7196729968955","4870.992343051145","10.5"]]}],[1677587214.055,{"count":"54","sum":"0.4","buckets":[[1,"-4870.992343051145","-4466.7196729968955","4"],[1,"-861.0779292198035","-789.6119426088657","8"],[1,"-558.3399591246119","-512","12"],[0,"2048","2233.3598364984477","6"],[0,"2896.3093757400984","3158.4477704354626","10"],[0,"4466.7196729968955","4870.992343051145","14"]]}],[1677587199.055,{"count":"67.5","sum":"0.5","buckets":[[1,"-4870.992343051145","-4466.7196729968955","5"],[1,"-861.0779292198035","-789.6119426088657","10"],[1,"-558.3399591246119","-512","15"],[0,"2048","2233.3598364984477","7.5"],[0,"2896.3093757400984","3158.4477704354626","12.5"],[0,"4466.7196729968955","4870.992343051145","17.5"]]}]]}`, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { b, err := json.Marshal(test.stream) if err != nil { t.Fatal(err) } if string(b) != test.expectedJSON { t.Fatalf("Mismatch marshal expected=%s actual=%s", test.expectedJSON, string(b)) } var stream model.SampleStream if err = json.Unmarshal(b, &stream); err != nil { t.Fatal(err) } if !reflect.DeepEqual(test.stream, stream) { t.Fatalf("Mismatch after unmarshal expected=%#v actual=%#v", test.stream, stream) } }) } } type httpTestClient struct { client http.Client } func (c *httpTestClient) URL(ep string, args map[string]string) *url.URL { return nil } func (c *httpTestClient) Do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { resp, err := c.client.Do(req) if err != nil { return nil, nil, err } var body []byte done := make(chan struct{}) go func() { body, err = io.ReadAll(resp.Body) close(done) }() select { case <-ctx.Done(): <-done err = resp.Body.Close() if err == nil { err = ctx.Err() } case <-done: } return resp, body, err } func TestDoGetFallback(t *testing.T) { v := url.Values{"a": []string{"1", "2"}} type testResponse struct { Values string Method string } // Start a local HTTP server. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { req.ParseForm() testResp, _ := json.Marshal(&testResponse{ Values: req.Form.Encode(), Method: req.Method, }) apiResp := &apiResponse{ Data: testResp, } body, _ := json.Marshal(apiResp) if req.Method == http.MethodPost { if req.URL.Path == "/blockPost405" { http.Error(w, string(body), http.StatusMethodNotAllowed) return } } if req.Method == http.MethodPost { if req.URL.Path == "/blockPost501" { http.Error(w, string(body), http.StatusNotImplemented) return } } w.Write(body) })) // Close the server when test finishes. defer server.Close() u, err := url.Parse(server.URL) if err != nil { t.Fatal(err) } client := &httpTestClient{client: *(server.Client())} api := &apiClientImpl{ client: client, } // Do a post, and ensure that the post succeeds. _, b, _, err := api.DoGetFallback(context.TODO(), u, v) if err != nil { t.Fatalf("Error doing local request: %v", err) } resp := &testResponse{} if err := json.Unmarshal(b, resp); err != nil { t.Fatal(err) } if resp.Method != http.MethodPost { t.Fatalf("Mismatch method") } if resp.Values != v.Encode() { t.Fatalf("Mismatch in values") } // Do a fallback to a get on 405. u.Path = "/blockPost405" _, b, _, err = api.DoGetFallback(context.TODO(), u, v) if err != nil { t.Fatalf("Error doing local request: %v", err) } if err := json.Unmarshal(b, resp); err != nil { t.Fatal(err) } if resp.Method != http.MethodGet { t.Fatalf("Mismatch method") } if resp.Values != v.Encode() { t.Fatalf("Mismatch in values") } // Do a fallback to a get on 501. u.Path = "/blockPost501" _, b, _, err = api.DoGetFallback(context.TODO(), u, v) if err != nil { t.Fatalf("Error doing local request: %v", err) } if err := json.Unmarshal(b, resp); err != nil { t.Fatal(err) } if resp.Method != http.MethodGet { t.Fatalf("Mismatch method") } if resp.Values != v.Encode() { t.Fatalf("Mismatch in values") } } client_golang-1.19.1/api/prometheus/v1/example_test.go000066400000000000000000000142531461713521000227300ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package v1_test provides examples making requests to Prometheus using the // Golang client. package v1_test import ( "context" "fmt" "net/http" "os" "time" "github.com/prometheus/common/config" "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" ) func ExampleAPI_query() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() result, warnings, err := v1api.Query(ctx, "up", time.Now(), v1.WithTimeout(5*time.Second)) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRange() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, v1.WithTimeout(5*time.Second)) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } type userAgentRoundTripper struct { name string rt http.RoundTripper } // RoundTrip implements the http.RoundTripper interface. func (u userAgentRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { if r.UserAgent() == "" { // The specification of http.RoundTripper says that it shouldn't mutate // the request so make a copy of req.Header since this is all that is // modified. r2 := new(http.Request) *r2 = *r r2.Header = make(http.Header) for k, s := range r.Header { r2.Header[k] = s } r2.Header.Set("User-Agent", u.name) r = r2 } return u.rt.RoundTrip(r) } func ExampleAPI_queryRangeWithUserAgent() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", RoundTripper: userAgentRoundTripper{name: "Client-Golang", rt: api.DefaultRoundTripper}, }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRangeWithBasicAuth() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", // We can use amazing github.com/prometheus/common/config helper! RoundTripper: config.NewBasicAuthRoundTripper("me", "definitely_me", "", "", api.DefaultRoundTripper), }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRangeWithAuthBearerToken() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", // We can use amazing github.com/prometheus/common/config helper! RoundTripper: config.NewAuthorizationCredentialsRoundTripper("Bearer", "secret_token", api.DefaultRoundTripper), }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_series() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() lbls, warnings, err := v1api.Series(ctx, []string{ "{__name__=~\"scrape_.+\",job=\"node\"}", "{__name__=~\"scrape_.+\",job=\"prometheus\"}", }, time.Now().Add(-time.Hour), time.Now()) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Println("Result:") for _, lbl := range lbls { fmt.Println(lbl) } } client_golang-1.19.1/examples/000077500000000000000000000000001461713521000162265ustar00rootroot00000000000000client_golang-1.19.1/examples/exemplars/000077500000000000000000000000001461713521000202265ustar00rootroot00000000000000client_golang-1.19.1/examples/exemplars/main.go000066400000000000000000000040641461713521000215050ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // A simple example of how to record a latency metric with exemplars, using a fictional id // as a prometheus label. package main import ( "fmt" "log" "math/rand" "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { requestDurations := prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "A histogram of the HTTP request durations in seconds.", Buckets: prometheus.ExponentialBuckets(0.1, 1.5, 5), }) // Create non-global registry. registry := prometheus.NewRegistry() // Add go runtime metrics and process collectors. registry.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), requestDurations, ) go func() { for { // Record fictional latency. now := time.Now() requestDurations.(prometheus.ExemplarObserver).ObserveWithExemplar( time.Since(now).Seconds(), prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))}, ) time.Sleep(600 * time.Millisecond) } }() // Expose /metrics HTTP endpoint using the created custom registry. http.Handle( "/metrics", promhttp.HandlerFor( registry, promhttp.HandlerOpts{ EnableOpenMetrics: true, }), ) // To test: curl -H 'Accept: application/openmetrics-text' localhost:8080/metrics log.Fatalln(http.ListenAndServe(":8080", nil)) } client_golang-1.19.1/examples/gocollector/000077500000000000000000000000001461713521000205425ustar00rootroot00000000000000client_golang-1.19.1/examples/gocollector/main.go000066400000000000000000000032141461713521000220150ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 // A minimal example of how to include Prometheus instrumentation. package main import ( "flag" "fmt" "log" "net/http" "regexp" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" ) var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") func main() { flag.Parse() // Create a new registry. reg := prometheus.NewRegistry() // Add Go module build info. reg.MustRegister(collectors.NewBuildInfoCollector()) reg.MustRegister(collectors.NewGoCollector( collectors.WithGoCollectorRuntimeMetrics(collectors.GoRuntimeMetricsRule{Matcher: regexp.MustCompile("/.*")}), )) // Expose the registered metrics via HTTP. http.Handle("/metrics", promhttp.HandlerFor( reg, promhttp.HandlerOpts{ // Opt into OpenMetrics to support exemplars. EnableOpenMetrics: true, }, )) fmt.Println("Hello world from new Go Collector!") log.Fatal(http.ListenAndServe(*addr, nil)) } client_golang-1.19.1/examples/middleware/000077500000000000000000000000001461713521000203435ustar00rootroot00000000000000client_golang-1.19.1/examples/middleware/go.mod000066400000000000000000000010551461713521000214520ustar00rootroot00000000000000module github.com/jessicalins/instrumentation-practices-examples/middleware go 1.19 require github.com/prometheus/client_golang v1.18.0 require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.31.0 // indirect ) client_golang-1.19.1/examples/middleware/go.sum000066400000000000000000000041631461713521000215020ustar00rootroot00000000000000github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= client_golang-1.19.1/examples/middleware/httpmiddleware/000077500000000000000000000000001461713521000233605ustar00rootroot00000000000000client_golang-1.19.1/examples/middleware/httpmiddleware/httpmiddleware.go000066400000000000000000000061501461713521000267260ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package httpmiddleware is adapted from // https://github.com/bwplotka/correlator/tree/main/examples/observability/ping/pkg/httpinstrumentation package httpmiddleware import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) type Middleware interface { // WrapHandler wraps the given HTTP handler for instrumentation. WrapHandler(handlerName string, handler http.Handler) http.HandlerFunc } type middleware struct { buckets []float64 registry prometheus.Registerer } // WrapHandler wraps the given HTTP handler for instrumentation: // It registers four metric collectors (if not already done) and reports HTTP // metrics to the (newly or already) registered collectors. // Each has a constant label named "handler" with the provided handlerName as // value. func (m *middleware) WrapHandler(handlerName string, handler http.Handler) http.HandlerFunc { reg := prometheus.WrapRegistererWith(prometheus.Labels{"handler": handlerName}, m.registry) requestsTotal := promauto.With(reg).NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Tracks the number of HTTP requests.", }, []string{"method", "code"}, ) requestDuration := promauto.With(reg).NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Tracks the latencies for HTTP requests.", Buckets: m.buckets, }, []string{"method", "code"}, ) requestSize := promauto.With(reg).NewSummaryVec( prometheus.SummaryOpts{ Name: "http_request_size_bytes", Help: "Tracks the size of HTTP requests.", }, []string{"method", "code"}, ) responseSize := promauto.With(reg).NewSummaryVec( prometheus.SummaryOpts{ Name: "http_response_size_bytes", Help: "Tracks the size of HTTP responses.", }, []string{"method", "code"}, ) // Wraps the provided http.Handler to observe the request result with the provided metrics. base := promhttp.InstrumentHandlerCounter( requestsTotal, promhttp.InstrumentHandlerDuration( requestDuration, promhttp.InstrumentHandlerRequestSize( requestSize, promhttp.InstrumentHandlerResponseSize( responseSize, handler, ), ), ), ) return base.ServeHTTP } // New returns a Middleware interface. func New(registry prometheus.Registerer, buckets []float64) Middleware { if buckets == nil { buckets = prometheus.ExponentialBuckets(0.1, 1.5, 5) } return &middleware{ buckets: buckets, registry: registry, } } client_golang-1.19.1/examples/middleware/main.go000066400000000000000000000030051461713521000216140ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Simple example of auto-instrumentation by using an HTTP Middleware with relevant metrics. package main import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/jessicalins/instrumentation-practices-examples/middleware/httpmiddleware" ) func main() { // Create non-global registry. registry := prometheus.NewRegistry() // Add go runtime metrics and process collectors. registry.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), ) // Expose /metrics HTTP endpoint using the created custom registry. http.Handle( "/metrics", httpmiddleware.New( registry, nil). WrapHandler("/metrics", promhttp.HandlerFor( registry, promhttp.HandlerOpts{}), )) log.Fatalln(http.ListenAndServe(":8080", nil)) } client_golang-1.19.1/examples/random/000077500000000000000000000000001461713521000175065ustar00rootroot00000000000000client_golang-1.19.1/examples/random/main.go000066400000000000000000000122111461713521000207560ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // A simple example exposing fictional RPC latencies with different types of // random distributions (uniform, normal, and exponential) as Prometheus // metrics. package main import ( "flag" "fmt" "log" "math" "math/rand" "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" ) type metrics struct { rpcDurations *prometheus.SummaryVec rpcDurationsHistogram prometheus.Histogram } func NewMetrics(reg prometheus.Registerer, normMean, normDomain float64) *metrics { m := &metrics{ // Create a summary to track fictional inter service RPC latencies for three // distinct services with different latency distributions. These services are // differentiated via a "service" label. rpcDurations: prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "rpc_durations_seconds", Help: "RPC latency distributions.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, []string{"service"}, ), // The same as above, but now as a histogram, and only for the // normal distribution. The histogram features both conventional // buckets as well as sparse buckets, the latter needed for the // experimental native histograms (ingested by a Prometheus // server v2.40 with the corresponding feature flag // enabled). The conventional buckets are targeted to the // parameters of the normal distribution, with 20 buckets // centered on the mean, each half-sigma wide. The sparse // buckets are always centered on zero, with a growth factor of // one bucket to the next of (at most) 1.1. (The precise factor // is 2^2^-3 = 1.0905077...) rpcDurationsHistogram: prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "rpc_durations_histogram_seconds", Help: "RPC latency distributions.", Buckets: prometheus.LinearBuckets(normMean-5*normDomain, .5*normDomain, 20), NativeHistogramBucketFactor: 1.1, }), } reg.MustRegister(m.rpcDurations) reg.MustRegister(m.rpcDurationsHistogram) return m } func main() { var ( addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") uniformDomain = flag.Float64("uniform.domain", 0.0002, "The domain for the uniform distribution.") normDomain = flag.Float64("normal.domain", 0.0002, "The domain for the normal distribution.") normMean = flag.Float64("normal.mean", 0.00001, "The mean for the normal distribution.") oscillationPeriod = flag.Duration("oscillation-period", 10*time.Minute, "The duration of the rate oscillation period.") ) flag.Parse() // Create a non-global registry. reg := prometheus.NewRegistry() // Create new metrics and register them using the custom registry. m := NewMetrics(reg, *normMean, *normDomain) // Add Go module build info. reg.MustRegister(collectors.NewBuildInfoCollector()) start := time.Now() oscillationFactor := func() float64 { return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod))) } // Periodically record some sample latencies for the three services. go func() { for { v := rand.Float64() * *uniformDomain m.rpcDurations.WithLabelValues("uniform").Observe(v) time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond) } }() go func() { for { v := (rand.NormFloat64() * *normDomain) + *normMean m.rpcDurations.WithLabelValues("normal").Observe(v) // Demonstrate exemplar support with a dummy ID. This // would be something like a trace ID in a real // application. Note the necessary type assertion. We // already know that rpcDurationsHistogram implements // the ExemplarObserver interface and thus don't need to // check the outcome of the type assertion. m.rpcDurationsHistogram.(prometheus.ExemplarObserver).ObserveWithExemplar( v, prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))}, ) time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond) } }() go func() { for { v := rand.ExpFloat64() / 1e6 m.rpcDurations.WithLabelValues("exponential").Observe(v) time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond) } }() // Expose the registered metrics via HTTP. http.Handle("/metrics", promhttp.HandlerFor( reg, promhttp.HandlerOpts{ // Opt into OpenMetrics to support exemplars. EnableOpenMetrics: true, // Pass custom registry Registry: reg, }, )) log.Fatal(http.ListenAndServe(*addr, nil)) } client_golang-1.19.1/examples/simple/000077500000000000000000000000001461713521000175175ustar00rootroot00000000000000client_golang-1.19.1/examples/simple/main.go000066400000000000000000000026571461713521000210040ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // A minimal example of how to include Prometheus instrumentation. package main import ( "flag" "log" "net/http" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") func main() { flag.Parse() // Create non-global registry. reg := prometheus.NewRegistry() // Add go runtime metrics and process collectors. reg.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), ) // Expose /metrics HTTP endpoint using the created custom registry. http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg})) log.Fatal(http.ListenAndServe(*addr, nil)) } client_golang-1.19.1/examples/versioncollector/000077500000000000000000000000001461713521000216225ustar00rootroot00000000000000client_golang-1.19.1/examples/versioncollector/main.go000066400000000000000000000031061461713521000230750ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 // A minimal example of how to include Prometheus instrumentation. package main import ( "flag" "fmt" "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors/version" "github.com/prometheus/client_golang/prometheus/promhttp" ) var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") // Build using ldflags, for example: // go build -ldflags "-X github.com/prometheus/common/version.Version=1.0.0 -X github.com/prometheus/common/version.Branch=abc123" . func main() { flag.Parse() // Create a new registry. reg := prometheus.NewRegistry() // Register version collector. reg.MustRegister(version.NewCollector("example")) // Expose the registered metrics via HTTP. http.Handle("/metrics", promhttp.HandlerFor( reg, promhttp.HandlerOpts{}, )) fmt.Println("Hello world from new Version Collector!") log.Fatal(http.ListenAndServe(*addr, nil)) } client_golang-1.19.1/generate-go-collector.bash000066400000000000000000000002411461713521000214250ustar00rootroot00000000000000#!/bin/env bash set -e go get github.com/hashicorp/go-version@v1.6.0 go run prometheus/gen_go_collector_metrics_set.go mv -f go_collector_metrics_* prometheus client_golang-1.19.1/go.mod000066400000000000000000000017521461713521000155230ustar00rootroot00000000000000module github.com/prometheus/client_golang go 1.20 require ( github.com/beorn7/perks v1.0.1 github.com/cespare/xxhash/v2 v2.2.0 github.com/davecgh/go-spew v1.1.1 github.com/json-iterator/go v1.1.12 github.com/prometheus/client_model v0.5.0 github.com/prometheus/common v0.48.0 github.com/prometheus/procfs v0.12.0 golang.org/x/sys v0.17.0 google.golang.org/protobuf v1.33.0 ) require ( github.com/golang/protobuf v1.5.3 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) exclude github.com/prometheus/client_golang v1.12.1 client_golang-1.19.1/go.sum000066400000000000000000000140771461713521000155540ustar00rootroot00000000000000github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= client_golang-1.19.1/prometheus/000077500000000000000000000000001461713521000166035ustar00rootroot00000000000000client_golang-1.19.1/prometheus/.gitignore000066400000000000000000000000341461713521000205700ustar00rootroot00000000000000command-line-arguments.test client_golang-1.19.1/prometheus/README.md000066400000000000000000000002471461713521000200650ustar00rootroot00000000000000See [![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/client_golang/prometheus.svg)](https://pkg.go.dev/github.com/prometheus/client_golang/prometheus). client_golang-1.19.1/prometheus/benchmark_test.go000066400000000000000000000145441461713521000221330ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "sync" "testing" ) func BenchmarkCounter(b *testing.B) { type fns []func(*CounterVec) Counter twoConstraint := func(_ string) string { return "two" } deLV := func(m *CounterVec) Counter { return m.WithLabelValues("eins", "zwei", "drei") } frLV := func(m *CounterVec) Counter { return m.WithLabelValues("une", "deux", "trois") } nlLV := func(m *CounterVec) Counter { return m.WithLabelValues("een", "twee", "drie") } deML := func(m *CounterVec) Counter { return m.With(Labels{"two": "zwei", "one": "eins", "three": "drei"}) } frML := func(m *CounterVec) Counter { return m.With(Labels{"two": "deux", "one": "une", "three": "trois"}) } nlML := func(m *CounterVec) Counter { return m.With(Labels{"two": "twee", "one": "een", "three": "drie"}) } deLabels := Labels{"two": "zwei", "one": "eins", "three": "drei"} dePML := func(m *CounterVec) Counter { return m.With(deLabels) } frLabels := Labels{"two": "deux", "one": "une", "three": "trois"} frPML := func(m *CounterVec) Counter { return m.With(frLabels) } nlLabels := Labels{"two": "twee", "one": "een", "three": "drie"} nlPML := func(m *CounterVec) Counter { return m.With(nlLabels) } table := []struct { name string constraint LabelConstraint counters fns }{ {"With Label Values", nil, fns{deLV}}, {"With Label Values and Constraint", twoConstraint, fns{deLV}}, {"With triple Label Values", nil, fns{deLV, frLV, nlLV}}, {"With triple Label Values and Constraint", twoConstraint, fns{deLV, frLV, nlLV}}, {"With repeated Label Values", nil, fns{deLV, deLV}}, {"With repeated Label Values and Constraint", twoConstraint, fns{deLV, deLV}}, {"With Mapped Labels", nil, fns{deML}}, {"With Mapped Labels and Constraint", twoConstraint, fns{deML}}, {"With triple Mapped Labels", nil, fns{deML, frML, nlML}}, {"With triple Mapped Labels and Constraint", twoConstraint, fns{deML, frML, nlML}}, {"With repeated Mapped Labels", nil, fns{deML, deML}}, {"With repeated Mapped Labels and Constraint", twoConstraint, fns{deML, deML}}, {"With Prepared Mapped Labels", nil, fns{dePML}}, {"With Prepared Mapped Labels and Constraint", twoConstraint, fns{dePML}}, {"With triple Prepared Mapped Labels", nil, fns{dePML, frPML, nlPML}}, {"With triple Prepared Mapped Labels and Constraint", twoConstraint, fns{dePML, frPML, nlPML}}, {"With repeated Prepared Mapped Labels", nil, fns{dePML, dePML}}, {"With repeated Prepared Mapped Labels and Constraint", twoConstraint, fns{dePML, dePML}}, } for _, t := range table { b.Run(t.name, func(b *testing.B) { m := V2.NewCounterVec( CounterVecOpts{ CounterOpts: CounterOpts{ Name: "benchmark_counter", Help: "A counter to benchmark it.", }, VariableLabels: ConstrainedLabels{ ConstrainedLabel{Name: "one"}, ConstrainedLabel{Name: "two", Constraint: t.constraint}, ConstrainedLabel{Name: "three"}, }, }, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { for _, fn := range t.counters { fn(m).Inc() } } }) } } func BenchmarkCounterWithLabelValuesConcurrent(b *testing.B) { m := NewCounterVec( CounterOpts{ Name: "benchmark_counter", Help: "A counter to benchmark it.", }, []string{"one", "two", "three"}, ) b.ReportAllocs() b.ResetTimer() wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { for j := 0; j < b.N/10; j++ { m.WithLabelValues("eins", "zwei", "drei").Inc() } wg.Done() }() } wg.Wait() } func BenchmarkCounterNoLabels(b *testing.B) { m := NewCounter(CounterOpts{ Name: "benchmark_counter", Help: "A counter to benchmark it.", }) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.Inc() } } func BenchmarkGaugeWithLabelValues(b *testing.B) { m := NewGaugeVec( GaugeOpts{ Name: "benchmark_gauge", Help: "A gauge to benchmark it.", }, []string{"one", "two", "three"}, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.WithLabelValues("eins", "zwei", "drei").Set(3.1415) } } func BenchmarkGaugeNoLabels(b *testing.B) { m := NewGauge(GaugeOpts{ Name: "benchmark_gauge", Help: "A gauge to benchmark it.", }) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.Set(3.1415) } } func BenchmarkSummaryWithLabelValues(b *testing.B) { m := NewSummaryVec( SummaryOpts{ Name: "benchmark_summary", Help: "A summary to benchmark it.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, []string{"one", "two", "three"}, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) } } func BenchmarkSummaryNoLabels(b *testing.B) { m := NewSummary(SummaryOpts{ Name: "benchmark_summary", Help: "A summary to benchmark it.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.Observe(3.1415) } } func BenchmarkHistogramWithLabelValues(b *testing.B) { m := NewHistogramVec( HistogramOpts{ Name: "benchmark_histogram", Help: "A histogram to benchmark it.", }, []string{"one", "two", "three"}, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) } } func BenchmarkHistogramNoLabels(b *testing.B) { m := NewHistogram(HistogramOpts{ Name: "benchmark_histogram", Help: "A histogram to benchmark it.", }, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { m.Observe(3.1415) } } func BenchmarkParallelCounter(b *testing.B) { c := NewCounter(CounterOpts{ Name: "benchmark_counter", Help: "A Counter to benchmark it.", }) b.ReportAllocs() b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { c.Inc() } }) } client_golang-1.19.1/prometheus/build_info_collector.go000066400000000000000000000023661461713521000233210ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import "runtime/debug" // NewBuildInfoCollector is the obsolete version of collectors.NewBuildInfoCollector. // See there for documentation. // // Deprecated: Use collectors.NewBuildInfoCollector instead. func NewBuildInfoCollector() Collector { path, version, sum := "unknown", "unknown", "unknown" if bi, ok := debug.ReadBuildInfo(); ok { path = bi.Main.Path version = bi.Main.Version sum = bi.Main.Sum } c := &selfCollector{MustNewConstMetric( NewDesc( "go_build_info", "Build information about the main Go module.", nil, Labels{"path": path, "version": version, "checksum": sum}, ), GaugeValue, 1)} c.init(c.self) return c } client_golang-1.19.1/prometheus/collector.go000066400000000000000000000126131461713521000211230ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus // Collector is the interface implemented by anything that can be used by // Prometheus to collect metrics. A Collector has to be registered for // collection. See Registerer.Register. // // The stock metrics provided by this package (Gauge, Counter, Summary, // Histogram, Untyped) are also Collectors (which only ever collect one metric, // namely itself). An implementer of Collector may, however, collect multiple // metrics in a coordinated fashion and/or create metrics on the fly. Examples // for collectors already implemented in this library are the metric vectors // (i.e. collection of multiple instances of the same Metric but with different // label values) like GaugeVec or SummaryVec, and the ExpvarCollector. type Collector interface { // Describe sends the super-set of all possible descriptors of metrics // collected by this Collector to the provided channel and returns once // the last descriptor has been sent. The sent descriptors fulfill the // consistency and uniqueness requirements described in the Desc // documentation. // // It is valid if one and the same Collector sends duplicate // descriptors. Those duplicates are simply ignored. However, two // different Collectors must not send duplicate descriptors. // // Sending no descriptor at all marks the Collector as “unchecked”, // i.e. no checks will be performed at registration time, and the // Collector may yield any Metric it sees fit in its Collect method. // // This method idempotently sends the same descriptors throughout the // lifetime of the Collector. It may be called concurrently and // therefore must be implemented in a concurrency safe way. // // If a Collector encounters an error while executing this method, it // must send an invalid descriptor (created with NewInvalidDesc) to // signal the error to the registry. Describe(chan<- *Desc) // Collect is called by the Prometheus registry when collecting // metrics. The implementation sends each collected metric via the // provided channel and returns once the last metric has been sent. The // descriptor of each sent metric is one of those returned by Describe // (unless the Collector is unchecked, see above). Returned metrics that // share the same descriptor must differ in their variable label // values. // // This method may be called concurrently and must therefore be // implemented in a concurrency safe way. Blocking occurs at the expense // of total performance of rendering all registered metrics. Ideally, // Collector implementations support concurrent readers. Collect(chan<- Metric) } // DescribeByCollect is a helper to implement the Describe method of a custom // Collector. It collects the metrics from the provided Collector and sends // their descriptors to the provided channel. // // If a Collector collects the same metrics throughout its lifetime, its // Describe method can simply be implemented as: // // func (c customCollector) Describe(ch chan<- *Desc) { // DescribeByCollect(c, ch) // } // // However, this will not work if the metrics collected change dynamically over // the lifetime of the Collector in a way that their combined set of descriptors // changes as well. The shortcut implementation will then violate the contract // of the Describe method. If a Collector sometimes collects no metrics at all // (for example vectors like CounterVec, GaugeVec, etc., which only collect // metrics after a metric with a fully specified label set has been accessed), // it might even get registered as an unchecked Collector (cf. the Register // method of the Registerer interface). Hence, only use this shortcut // implementation of Describe if you are certain to fulfill the contract. // // The Collector example demonstrates a use of DescribeByCollect. func DescribeByCollect(c Collector, descs chan<- *Desc) { metrics := make(chan Metric) go func() { c.Collect(metrics) close(metrics) }() for m := range metrics { descs <- m.Desc() } } // selfCollector implements Collector for a single Metric so that the Metric // collects itself. Add it as an anonymous field to a struct that implements // Metric, and call init with the Metric itself as an argument. type selfCollector struct { self Metric } // init provides the selfCollector with a reference to the metric it is supposed // to collect. It is usually called within the factory function to create a // metric. See example. func (c *selfCollector) init(self Metric) { c.self = self } // Describe implements Collector. func (c *selfCollector) Describe(ch chan<- *Desc) { ch <- c.self.Desc() } // Collect implements Collector. func (c *selfCollector) Collect(ch chan<- Metric) { ch <- c.self } // collectorMetric is a metric that is also a collector. // Because of selfCollector, most (if not all) Metrics in // this package are also collectors. type collectorMetric interface { Metric Collector } client_golang-1.19.1/prometheus/collector_test.go000066400000000000000000000035431461713521000221640ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import "testing" type collectorDescribedByCollect struct { cnt Counter gge Gauge } func (c collectorDescribedByCollect) Collect(ch chan<- Metric) { ch <- c.cnt ch <- c.gge } func (c collectorDescribedByCollect) Describe(ch chan<- *Desc) { DescribeByCollect(c, ch) } func TestDescribeByCollect(t *testing.T) { goodCollector := collectorDescribedByCollect{ cnt: NewCounter(CounterOpts{Name: "c1", Help: "help c1"}), gge: NewGauge(GaugeOpts{Name: "g1", Help: "help g1"}), } collidingCollector := collectorDescribedByCollect{ cnt: NewCounter(CounterOpts{Name: "c2", Help: "help c2"}), gge: NewGauge(GaugeOpts{Name: "g1", Help: "help g1"}), } inconsistentCollector := collectorDescribedByCollect{ cnt: NewCounter(CounterOpts{Name: "c3", Help: "help c3"}), gge: NewGauge(GaugeOpts{Name: "c3", Help: "help inconsistent"}), } reg := NewPedanticRegistry() if err := reg.Register(goodCollector); err != nil { t.Error("registration failed:", err) } if err := reg.Register(collidingCollector); err == nil { t.Error("registration unexpectedly succeeded") } if err := reg.Register(inconsistentCollector); err == nil { t.Error("registration unexpectedly succeeded") } if _, err := reg.Gather(); err != nil { t.Error("gathering failed:", err) } } client_golang-1.19.1/prometheus/collectors/000077500000000000000000000000001461713521000207545ustar00rootroot00000000000000client_golang-1.19.1/prometheus/collectors/collectors.go000066400000000000000000000040041461713521000234520ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package collectors provides implementations of prometheus.Collector to // conveniently collect process and Go-related metrics. package collectors import "github.com/prometheus/client_golang/prometheus" // NewBuildInfoCollector returns a collector collecting a single metric // "go_build_info" with the constant value 1 and three labels "path", "version", // and "checksum". Their label values contain the main module path, version, and // checksum, respectively. The labels will only have meaningful values if the // binary is built with Go module support and from source code retrieved from // the source repository (rather than the local file system). This is usually // accomplished by building from outside of GOPATH, specifying the full address // of the main package, e.g. "GO111MODULE=on go run // github.com/prometheus/client_golang/examples/random". If built without Go // module support, all label values will be "unknown". If built with Go module // support but using the source code from the local file system, the "path" will // be set appropriately, but "checksum" will be empty and "version" will be // "(devel)". // // This collector uses only the build information for the main module. See // https://github.com/povilasv/prommod for an example of a collector for the // module dependencies. func NewBuildInfoCollector() prometheus.Collector { //nolint:staticcheck // Ignore SA1019 until v2. return prometheus.NewBuildInfoCollector() } client_golang-1.19.1/prometheus/collectors/dbstats_collector.go000066400000000000000000000106401461713521000250160ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package collectors import ( "database/sql" "github.com/prometheus/client_golang/prometheus" ) type dbStatsCollector struct { db *sql.DB maxOpenConnections *prometheus.Desc openConnections *prometheus.Desc inUseConnections *prometheus.Desc idleConnections *prometheus.Desc waitCount *prometheus.Desc waitDuration *prometheus.Desc maxIdleClosed *prometheus.Desc maxIdleTimeClosed *prometheus.Desc maxLifetimeClosed *prometheus.Desc } // NewDBStatsCollector returns a collector that exports metrics about the given *sql.DB. // See https://golang.org/pkg/database/sql/#DBStats for more information on stats. func NewDBStatsCollector(db *sql.DB, dbName string) prometheus.Collector { fqName := func(name string) string { return "go_sql_" + name } return &dbStatsCollector{ db: db, maxOpenConnections: prometheus.NewDesc( fqName("max_open_connections"), "Maximum number of open connections to the database.", nil, prometheus.Labels{"db_name": dbName}, ), openConnections: prometheus.NewDesc( fqName("open_connections"), "The number of established connections both in use and idle.", nil, prometheus.Labels{"db_name": dbName}, ), inUseConnections: prometheus.NewDesc( fqName("in_use_connections"), "The number of connections currently in use.", nil, prometheus.Labels{"db_name": dbName}, ), idleConnections: prometheus.NewDesc( fqName("idle_connections"), "The number of idle connections.", nil, prometheus.Labels{"db_name": dbName}, ), waitCount: prometheus.NewDesc( fqName("wait_count_total"), "The total number of connections waited for.", nil, prometheus.Labels{"db_name": dbName}, ), waitDuration: prometheus.NewDesc( fqName("wait_duration_seconds_total"), "The total time blocked waiting for a new connection.", nil, prometheus.Labels{"db_name": dbName}, ), maxIdleClosed: prometheus.NewDesc( fqName("max_idle_closed_total"), "The total number of connections closed due to SetMaxIdleConns.", nil, prometheus.Labels{"db_name": dbName}, ), maxIdleTimeClosed: prometheus.NewDesc( fqName("max_idle_time_closed_total"), "The total number of connections closed due to SetConnMaxIdleTime.", nil, prometheus.Labels{"db_name": dbName}, ), maxLifetimeClosed: prometheus.NewDesc( fqName("max_lifetime_closed_total"), "The total number of connections closed due to SetConnMaxLifetime.", nil, prometheus.Labels{"db_name": dbName}, ), } } // Describe implements Collector. func (c *dbStatsCollector) Describe(ch chan<- *prometheus.Desc) { ch <- c.maxOpenConnections ch <- c.openConnections ch <- c.inUseConnections ch <- c.idleConnections ch <- c.waitCount ch <- c.waitDuration ch <- c.maxIdleClosed ch <- c.maxLifetimeClosed ch <- c.maxIdleTimeClosed } // Collect implements Collector. func (c *dbStatsCollector) Collect(ch chan<- prometheus.Metric) { stats := c.db.Stats() ch <- prometheus.MustNewConstMetric(c.maxOpenConnections, prometheus.GaugeValue, float64(stats.MaxOpenConnections)) ch <- prometheus.MustNewConstMetric(c.openConnections, prometheus.GaugeValue, float64(stats.OpenConnections)) ch <- prometheus.MustNewConstMetric(c.inUseConnections, prometheus.GaugeValue, float64(stats.InUse)) ch <- prometheus.MustNewConstMetric(c.idleConnections, prometheus.GaugeValue, float64(stats.Idle)) ch <- prometheus.MustNewConstMetric(c.waitCount, prometheus.CounterValue, float64(stats.WaitCount)) ch <- prometheus.MustNewConstMetric(c.waitDuration, prometheus.CounterValue, stats.WaitDuration.Seconds()) ch <- prometheus.MustNewConstMetric(c.maxIdleClosed, prometheus.CounterValue, float64(stats.MaxIdleClosed)) ch <- prometheus.MustNewConstMetric(c.maxLifetimeClosed, prometheus.CounterValue, float64(stats.MaxLifetimeClosed)) ch <- prometheus.MustNewConstMetric(c.maxIdleTimeClosed, prometheus.CounterValue, float64(stats.MaxIdleTimeClosed)) } client_golang-1.19.1/prometheus/collectors/dbstats_collector_test.go000066400000000000000000000046071461713521000260630ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package collectors import ( "database/sql" "testing" "github.com/prometheus/client_golang/prometheus" ) func TestDBStatsCollector(t *testing.T) { reg := prometheus.NewRegistry() { db := new(sql.DB) if err := reg.Register(NewDBStatsCollector(db, "db_A")); err != nil { t.Fatal(err) } } { db := new(sql.DB) if err := reg.Register(NewDBStatsCollector(db, "db_B")); err != nil { t.Fatal(err) } } mfs, err := reg.Gather() if err != nil { t.Fatal(err) } names := []string{ "go_sql_max_open_connections", "go_sql_open_connections", "go_sql_in_use_connections", "go_sql_idle_connections", "go_sql_wait_count_total", "go_sql_wait_duration_seconds_total", "go_sql_max_idle_closed_total", "go_sql_max_lifetime_closed_total", "go_sql_max_idle_time_closed_total", } type result struct { found bool } results := make(map[string]result) for _, name := range names { results[name] = result{found: false} } for _, mf := range mfs { m := mf.GetMetric() if len(m) != 2 { t.Errorf("expected 2 metrics bug got %d", len(m)) } labelA := m[0].GetLabel()[0] if name := labelA.GetName(); name != "db_name" { t.Errorf("expected to get label \"db_name\" but got %s", name) } if value := labelA.GetValue(); value != "db_A" { t.Errorf("expected to get value \"db_A\" but got %s", value) } labelB := m[1].GetLabel()[0] if name := labelB.GetName(); name != "db_name" { t.Errorf("expected to get label \"db_name\" but got %s", name) } if value := labelB.GetValue(); value != "db_B" { t.Errorf("expected to get value \"db_B\" but got %s", value) } for _, name := range names { if name == mf.GetName() { results[name] = result{found: true} break } } } for name, result := range results { if !result.found { t.Errorf("%s not found", name) } } } client_golang-1.19.1/prometheus/collectors/expvar_collector.go000066400000000000000000000054361461713521000246660ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package collectors import "github.com/prometheus/client_golang/prometheus" // NewExpvarCollector returns a newly allocated expvar Collector. // // An expvar Collector collects metrics from the expvar interface. It provides a // quick way to expose numeric values that are already exported via expvar as // Prometheus metrics. Note that the data models of expvar and Prometheus are // fundamentally different, and that the expvar Collector is inherently slower // than native Prometheus metrics. Thus, the expvar Collector is probably great // for experiments and prototyping, but you should seriously consider a more // direct implementation of Prometheus metrics for monitoring production // systems. // // The exports map has the following meaning: // // The keys in the map correspond to expvar keys, i.e. for every expvar key you // want to export as Prometheus metric, you need an entry in the exports // map. The descriptor mapped to each key describes how to export the expvar // value. It defines the name and the help string of the Prometheus metric // proxying the expvar value. The type will always be Untyped. // // For descriptors without variable labels, the expvar value must be a number or // a bool. The number is then directly exported as the Prometheus sample // value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values // that are not numbers or bools are silently ignored. // // If the descriptor has one variable label, the expvar value must be an expvar // map. The keys in the expvar map become the various values of the one // Prometheus label. The values in the expvar map must be numbers or bools again // as above. // // For descriptors with more than one variable label, the expvar must be a // nested expvar map, i.e. where the values of the topmost map are maps again // etc. until a depth is reached that corresponds to the number of labels. The // leaves of that structure must be numbers or bools as above to serve as the // sample values. // // Anything that does not fit into the scheme above is silently ignored. func NewExpvarCollector(exports map[string]*prometheus.Desc) prometheus.Collector { //nolint:staticcheck // Ignore SA1019 until v2. return prometheus.NewExpvarCollector(exports) } client_golang-1.19.1/prometheus/collectors/go_collector_go116.go000066400000000000000000000045731461713521000247040ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !go1.17 // +build !go1.17 package collectors import "github.com/prometheus/client_golang/prometheus" // NewGoCollector returns a collector that exports metrics about the current Go // process. This includes memory stats. To collect those, runtime.ReadMemStats // is called. This requires to “stop the world”, which usually only happens for // garbage collection (GC). Take the following implications into account when // deciding whether to use the Go collector: // // 1. The performance impact of stopping the world is the more relevant the more // frequently metrics are collected. However, with Go1.9 or later the // stop-the-world time per metrics collection is very short (~25µs) so that the // performance impact will only matter in rare cases. However, with older Go // versions, the stop-the-world duration depends on the heap size and can be // quite significant (~1.7 ms/GiB as per // https://go-review.googlesource.com/c/go/+/34937). // // 2. During an ongoing GC, nothing else can stop the world. Therefore, if the // metrics collection happens to coincide with GC, it will only complete after // GC has finished. Usually, GC is fast enough to not cause problems. However, // with a very large heap, GC might take multiple seconds, which is enough to // cause scrape timeouts in common setups. To avoid this problem, the Go // collector will use the memstats from a previous collection if // runtime.ReadMemStats takes more than 1s. However, if there are no previously // collected memstats, or their collection is more than 5m ago, the collection // will block until runtime.ReadMemStats succeeds. // // NOTE: The problem is solved in Go 1.15, see // https://github.com/golang/go/issues/19812 for the related Go issue. func NewGoCollector() prometheus.Collector { return prometheus.NewGoCollector() } client_golang-1.19.1/prometheus/collectors/go_collector_go117_test.go000066400000000000000000000064261461713521000257430ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 && !go1.19 // +build go1.17,!go1.19 package collectors func withAllMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_pauses_seconds", "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", }) } func withGCMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_pauses_seconds", }) } func withMemoryMetrics() []string { return withBaseMetrics([]string{ "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", }) } func withSchedulerMetrics() []string { return []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_threads", } } client_golang-1.19.1/prometheus/collectors/go_collector_go119_test.go000066400000000000000000000070321461713521000257370ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.19 && !go1.20 // +build go1.19,!go1.20 package collectors func withAllMetrics() []string { return withBaseMetrics([]string{ "go_cgo_go_to_c_calls_calls_total", "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_stack_starting_size_bytes", "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", }) } func withGCMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_stack_starting_size_bytes", }) } func withMemoryMetrics() []string { return withBaseMetrics([]string{ "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", }) } func withSchedulerMetrics() []string { return []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_threads", } } client_golang-1.19.1/prometheus/collectors/go_collector_go120_test.go000066400000000000000000000101531461713521000257250ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.20 && !go1.21 // +build go1.20,!go1.21 package collectors func withAllMetrics() []string { return withBaseMetrics([]string{ "go_cgo_go_to_c_calls_calls_total", "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "go_cpu_classes_gc_pause_cpu_seconds_total", "go_cpu_classes_gc_total_cpu_seconds_total", "go_cpu_classes_idle_cpu_seconds_total", "go_cpu_classes_scavenge_assist_cpu_seconds_total", "go_cpu_classes_scavenge_background_cpu_seconds_total", "go_cpu_classes_scavenge_total_cpu_seconds_total", "go_cpu_classes_total_cpu_seconds_total", "go_cpu_classes_user_cpu_seconds_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_stack_starting_size_bytes", "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_sync_mutex_wait_total_seconds_total", }) } func withGCMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_stack_starting_size_bytes", }) } func withMemoryMetrics() []string { return withBaseMetrics([]string{ "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", }) } func withSchedulerMetrics() []string { return []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_threads", } } client_golang-1.19.1/prometheus/collectors/go_collector_go121_test.go000066400000000000000000000154461461713521000257400ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.21 && !go1.22 // +build go1.21,!go1.22 package collectors func withAllMetrics() []string { return withBaseMetrics([]string{ "go_cgo_go_to_c_calls_calls_total", "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "go_cpu_classes_gc_pause_cpu_seconds_total", "go_cpu_classes_gc_total_cpu_seconds_total", "go_cpu_classes_idle_cpu_seconds_total", "go_cpu_classes_scavenge_assist_cpu_seconds_total", "go_cpu_classes_scavenge_background_cpu_seconds_total", "go_cpu_classes_scavenge_total_cpu_seconds_total", "go_cpu_classes_total_cpu_seconds_total", "go_cpu_classes_user_cpu_seconds_total", "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_gogc_percent", "go_gc_gomemlimit_bytes", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_live_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_scan_globals_bytes", "go_gc_scan_heap_bytes", "go_gc_scan_stack_bytes", "go_gc_scan_total_bytes", "go_gc_stack_starting_size_bytes", "go_godebug_non_default_behavior_execerrdot_events_total", "go_godebug_non_default_behavior_gocachehash_events_total", "go_godebug_non_default_behavior_gocachetest_events_total", "go_godebug_non_default_behavior_gocacheverify_events_total", "go_godebug_non_default_behavior_http2client_events_total", "go_godebug_non_default_behavior_http2server_events_total", "go_godebug_non_default_behavior_installgoroot_events_total", "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "go_godebug_non_default_behavior_multipartmaxparts_events_total", "go_godebug_non_default_behavior_multipathtcp_events_total", "go_godebug_non_default_behavior_panicnil_events_total", "go_godebug_non_default_behavior_randautoseed_events_total", "go_godebug_non_default_behavior_tarinsecurepath_events_total", "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "go_godebug_non_default_behavior_x509sha1_events_total", "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "go_godebug_non_default_behavior_zipinsecurepath_events_total", "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_sync_mutex_wait_total_seconds_total", }) } func withGCMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_gogc_percent", "go_gc_gomemlimit_bytes", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_live_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_scan_globals_bytes", "go_gc_scan_heap_bytes", "go_gc_scan_stack_bytes", "go_gc_scan_total_bytes", "go_gc_stack_starting_size_bytes", }) } func withMemoryMetrics() []string { return withBaseMetrics([]string{ "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", }) } func withSchedulerMetrics() []string { return []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_threads", } } func withDebugMetrics() []string { return []string{ "go_godebug_non_default_behavior_execerrdot_events_total", "go_godebug_non_default_behavior_gocachehash_events_total", "go_godebug_non_default_behavior_gocachetest_events_total", "go_godebug_non_default_behavior_gocacheverify_events_total", "go_godebug_non_default_behavior_http2client_events_total", "go_godebug_non_default_behavior_http2server_events_total", "go_godebug_non_default_behavior_installgoroot_events_total", "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "go_godebug_non_default_behavior_multipartmaxparts_events_total", "go_godebug_non_default_behavior_multipathtcp_events_total", "go_godebug_non_default_behavior_panicnil_events_total", "go_godebug_non_default_behavior_randautoseed_events_total", "go_godebug_non_default_behavior_tarinsecurepath_events_total", "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "go_godebug_non_default_behavior_x509sha1_events_total", "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "go_godebug_non_default_behavior_zipinsecurepath_events_total", } } client_golang-1.19.1/prometheus/collectors/go_collector_go122_test.go000066400000000000000000000177561461713521000257470ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.22 && !go1.23 // +build go1.22,!go1.23 package collectors func withAllMetrics() []string { return withBaseMetrics([]string{ "go_cgo_go_to_c_calls_calls_total", "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "go_cpu_classes_gc_pause_cpu_seconds_total", "go_cpu_classes_gc_total_cpu_seconds_total", "go_cpu_classes_idle_cpu_seconds_total", "go_cpu_classes_scavenge_assist_cpu_seconds_total", "go_cpu_classes_scavenge_background_cpu_seconds_total", "go_cpu_classes_scavenge_total_cpu_seconds_total", "go_cpu_classes_total_cpu_seconds_total", "go_cpu_classes_user_cpu_seconds_total", "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_gogc_percent", "go_gc_gomemlimit_bytes", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_live_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_scan_globals_bytes", "go_gc_scan_heap_bytes", "go_gc_scan_stack_bytes", "go_gc_scan_total_bytes", "go_gc_stack_starting_size_bytes", "go_godebug_non_default_behavior_execerrdot_events_total", "go_godebug_non_default_behavior_gocachehash_events_total", "go_godebug_non_default_behavior_gocachetest_events_total", "go_godebug_non_default_behavior_gocacheverify_events_total", "go_godebug_non_default_behavior_gotypesalias_events_total", "go_godebug_non_default_behavior_http2client_events_total", "go_godebug_non_default_behavior_http2server_events_total", "go_godebug_non_default_behavior_httplaxcontentlength_events_total", "go_godebug_non_default_behavior_httpmuxgo121_events_total", "go_godebug_non_default_behavior_installgoroot_events_total", "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "go_godebug_non_default_behavior_multipartmaxparts_events_total", "go_godebug_non_default_behavior_multipathtcp_events_total", "go_godebug_non_default_behavior_panicnil_events_total", "go_godebug_non_default_behavior_randautoseed_events_total", "go_godebug_non_default_behavior_tarinsecurepath_events_total", "go_godebug_non_default_behavior_tls10server_events_total", "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "go_godebug_non_default_behavior_tlsrsakex_events_total", "go_godebug_non_default_behavior_tlsunsafeekm_events_total", "go_godebug_non_default_behavior_x509sha1_events_total", "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "go_godebug_non_default_behavior_x509usepolicies_events_total", "go_godebug_non_default_behavior_zipinsecurepath_events_total", "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_sched_pauses_stopping_gc_seconds", "go_sched_pauses_stopping_other_seconds", "go_sched_pauses_total_gc_seconds", "go_sched_pauses_total_other_seconds", "go_sync_mutex_wait_total_seconds_total", }) } func withGCMetrics() []string { return withBaseMetrics([]string{ "go_gc_cycles_automatic_gc_cycles_total", "go_gc_cycles_forced_gc_cycles_total", "go_gc_cycles_total_gc_cycles_total", "go_gc_gogc_percent", "go_gc_gomemlimit_bytes", "go_gc_heap_allocs_by_size_bytes", "go_gc_heap_allocs_bytes_total", "go_gc_heap_allocs_objects_total", "go_gc_heap_frees_by_size_bytes", "go_gc_heap_frees_bytes_total", "go_gc_heap_frees_objects_total", "go_gc_heap_goal_bytes", "go_gc_heap_live_bytes", "go_gc_heap_objects_objects", "go_gc_heap_tiny_allocs_objects_total", "go_gc_limiter_last_enabled_gc_cycle", "go_gc_pauses_seconds", "go_gc_scan_globals_bytes", "go_gc_scan_heap_bytes", "go_gc_scan_stack_bytes", "go_gc_scan_total_bytes", "go_gc_stack_starting_size_bytes", }) } func withMemoryMetrics() []string { return withBaseMetrics([]string{ "go_memory_classes_heap_free_bytes", "go_memory_classes_heap_objects_bytes", "go_memory_classes_heap_released_bytes", "go_memory_classes_heap_stacks_bytes", "go_memory_classes_heap_unused_bytes", "go_memory_classes_metadata_mcache_free_bytes", "go_memory_classes_metadata_mcache_inuse_bytes", "go_memory_classes_metadata_mspan_free_bytes", "go_memory_classes_metadata_mspan_inuse_bytes", "go_memory_classes_metadata_other_bytes", "go_memory_classes_os_stacks_bytes", "go_memory_classes_other_bytes", "go_memory_classes_profiling_buckets_bytes", "go_memory_classes_total_bytes", }) } func withSchedulerMetrics() []string { return []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_sched_gomaxprocs_threads", "go_sched_goroutines_goroutines", "go_sched_latencies_seconds", "go_sched_pauses_stopping_gc_seconds", "go_sched_pauses_stopping_other_seconds", "go_sched_pauses_total_gc_seconds", "go_sched_pauses_total_other_seconds", "go_threads", } } func withDebugMetrics() []string { return []string{ "go_godebug_non_default_behavior_execerrdot_events_total", "go_godebug_non_default_behavior_gocachehash_events_total", "go_godebug_non_default_behavior_gocachetest_events_total", "go_godebug_non_default_behavior_gocacheverify_events_total", "go_godebug_non_default_behavior_gotypesalias_events_total", "go_godebug_non_default_behavior_http2client_events_total", "go_godebug_non_default_behavior_http2server_events_total", "go_godebug_non_default_behavior_httplaxcontentlength_events_total", "go_godebug_non_default_behavior_httpmuxgo121_events_total", "go_godebug_non_default_behavior_installgoroot_events_total", "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "go_godebug_non_default_behavior_multipartmaxparts_events_total", "go_godebug_non_default_behavior_multipathtcp_events_total", "go_godebug_non_default_behavior_panicnil_events_total", "go_godebug_non_default_behavior_randautoseed_events_total", "go_godebug_non_default_behavior_tarinsecurepath_events_total", "go_godebug_non_default_behavior_tls10server_events_total", "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "go_godebug_non_default_behavior_tlsrsakex_events_total", "go_godebug_non_default_behavior_tlsunsafeekm_events_total", "go_godebug_non_default_behavior_x509sha1_events_total", "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "go_godebug_non_default_behavior_x509usepolicies_events_total", "go_godebug_non_default_behavior_zipinsecurepath_events_total", } } client_golang-1.19.1/prometheus/collectors/go_collector_latest.go000066400000000000000000000160531461713521000253370ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package collectors import ( "regexp" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/internal" ) var ( // MetricsAll allows all the metrics to be collected from Go runtime. MetricsAll = GoRuntimeMetricsRule{regexp.MustCompile("/.*")} // MetricsGC allows only GC metrics to be collected from Go runtime. // e.g. go_gc_cycles_automatic_gc_cycles_total // NOTE: This does not include new class of "/cpu/classes/gc/..." metrics. // Use custom metric rule to access those. MetricsGC = GoRuntimeMetricsRule{regexp.MustCompile(`^/gc/.*`)} // MetricsMemory allows only memory metrics to be collected from Go runtime. // e.g. go_memory_classes_heap_free_bytes MetricsMemory = GoRuntimeMetricsRule{regexp.MustCompile(`^/memory/.*`)} // MetricsScheduler allows only scheduler metrics to be collected from Go runtime. // e.g. go_sched_goroutines_goroutines MetricsScheduler = GoRuntimeMetricsRule{regexp.MustCompile(`^/sched/.*`)} ) // WithGoCollectorMemStatsMetricsDisabled disables metrics that is gathered in runtime.MemStats structure such as: // // go_memstats_alloc_bytes // go_memstats_alloc_bytes_total // go_memstats_sys_bytes // go_memstats_lookups_total // go_memstats_mallocs_total // go_memstats_frees_total // go_memstats_heap_alloc_bytes // go_memstats_heap_sys_bytes // go_memstats_heap_idle_bytes // go_memstats_heap_inuse_bytes // go_memstats_heap_released_bytes // go_memstats_heap_objects // go_memstats_stack_inuse_bytes // go_memstats_stack_sys_bytes // go_memstats_mspan_inuse_bytes // go_memstats_mspan_sys_bytes // go_memstats_mcache_inuse_bytes // go_memstats_mcache_sys_bytes // go_memstats_buck_hash_sys_bytes // go_memstats_gc_sys_bytes // go_memstats_other_sys_bytes // go_memstats_next_gc_bytes // // so the metrics known from pre client_golang v1.12.0, // // NOTE(bwplotka): The above represents runtime.MemStats statistics, but they are // actually implemented using new runtime/metrics package. (except skipped go_memstats_gc_cpu_fraction // -- see https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 for explanation). // // Some users might want to disable this on collector level (although you can use scrape relabelling on Prometheus), // because similar metrics can be now obtained using WithGoCollectorRuntimeMetrics. Note that the semantics of new // metrics might be different, plus the names can be change over time with different Go version. // // NOTE(bwplotka): Changing metric names can be tedious at times as the alerts, recording rules and dashboards have to be adjusted. // The old metrics are also very useful, with many guides and books written about how to interpret them. // // As a result our recommendation would be to stick with MemStats like metrics and enable other runtime/metrics if you are interested // in advanced insights Go provides. See ExampleGoCollector_WithAdvancedGoMetrics. func WithGoCollectorMemStatsMetricsDisabled() func(options *internal.GoCollectorOptions) { return func(o *internal.GoCollectorOptions) { o.DisableMemStatsLikeMetrics = true } } // GoRuntimeMetricsRule allow enabling and configuring particular group of runtime/metrics. // TODO(bwplotka): Consider adding ability to adjust buckets. type GoRuntimeMetricsRule struct { // Matcher represents RE2 expression will match the runtime/metrics from https://golang.bg/src/runtime/metrics/description.go // Use `regexp.MustCompile` or `regexp.Compile` to create this field. Matcher *regexp.Regexp } // WithGoCollectorRuntimeMetrics allows enabling and configuring particular group of runtime/metrics. // See the list of metrics https://golang.bg/src/runtime/metrics/description.go (pick the Go version you use there!). // You can use this option in repeated manner, which will add new rules. The order of rules is important, the last rule // that matches particular metrics is applied. func WithGoCollectorRuntimeMetrics(rules ...GoRuntimeMetricsRule) func(options *internal.GoCollectorOptions) { rs := make([]internal.GoCollectorRule, len(rules)) for i, r := range rules { rs[i] = internal.GoCollectorRule{ Matcher: r.Matcher, } } return func(o *internal.GoCollectorOptions) { o.RuntimeMetricRules = append(o.RuntimeMetricRules, rs...) } } // WithoutGoCollectorRuntimeMetrics allows disabling group of runtime/metrics that you might have added in WithGoCollectorRuntimeMetrics. // It behaves similarly to WithGoCollectorRuntimeMetrics just with deny-list semantics. func WithoutGoCollectorRuntimeMetrics(matchers ...*regexp.Regexp) func(options *internal.GoCollectorOptions) { rs := make([]internal.GoCollectorRule, len(matchers)) for i, m := range matchers { rs[i] = internal.GoCollectorRule{ Matcher: m, Deny: true, } } return func(o *internal.GoCollectorOptions) { o.RuntimeMetricRules = append(o.RuntimeMetricRules, rs...) } } // GoCollectionOption represents Go collection option flag. // Deprecated. type GoCollectionOption uint32 const ( // GoRuntimeMemStatsCollection represents the metrics represented by runtime.MemStats structure. // // Deprecated: Use WithGoCollectorMemStatsMetricsDisabled() function to disable those metrics in the collector. GoRuntimeMemStatsCollection GoCollectionOption = 1 << iota // GoRuntimeMetricsCollection is the new set of metrics represented by runtime/metrics package. // // Deprecated: Use WithGoCollectorRuntimeMetrics(GoRuntimeMetricsRule{Matcher: regexp.MustCompile("/.*")}) // function to enable those metrics in the collector. GoRuntimeMetricsCollection ) // WithGoCollections allows enabling different collections for Go collector on top of base metrics. // // Deprecated: Use WithGoCollectorRuntimeMetrics() and WithGoCollectorMemStatsMetricsDisabled() instead to control metrics. func WithGoCollections(flags GoCollectionOption) func(options *internal.GoCollectorOptions) { return func(options *internal.GoCollectorOptions) { if flags&GoRuntimeMemStatsCollection == 0 { WithGoCollectorMemStatsMetricsDisabled()(options) } if flags&GoRuntimeMetricsCollection != 0 { WithGoCollectorRuntimeMetrics(GoRuntimeMetricsRule{Matcher: regexp.MustCompile("/.*")})(options) } } } // NewGoCollector returns a collector that exports metrics about the current Go // process using debug.GCStats (base metrics) and runtime/metrics (both in MemStats style and new ones). func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) prometheus.Collector { //nolint:staticcheck // Ignore SA1019 until v2. return prometheus.NewGoCollector(opts...) } client_golang-1.19.1/prometheus/collectors/go_collector_latest_test.go000066400000000000000000000127771461713521000264070ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package collectors import ( "encoding/json" "log" "net/http" "reflect" "regexp" "sort" "testing" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var baseMetrics = []string{ "go_gc_duration_seconds", "go_goroutines", "go_info", "go_memstats_last_gc_time_seconds", "go_threads", } func TestGoCollectorMarshalling(t *testing.T) { reg := prometheus.NewRegistry() reg.MustRegister(NewGoCollector( WithGoCollectorRuntimeMetrics(GoRuntimeMetricsRule{ Matcher: regexp.MustCompile("/.*"), }), )) result, err := reg.Gather() if err != nil { t.Fatal(err) } if _, err := json.Marshal(result); err != nil { t.Errorf("json marshalling should not fail, %v", err) } } func TestWithGoCollectorMemStatsMetricsDisabled(t *testing.T) { reg := prometheus.NewRegistry() reg.MustRegister(NewGoCollector( WithGoCollectorMemStatsMetricsDisabled(), )) result, err := reg.Gather() if err != nil { t.Fatal(err) } got := []string{} for _, r := range result { got = append(got, r.GetName()) } if !reflect.DeepEqual(got, baseMetrics) { t.Errorf("got %v, want %v", got, baseMetrics) } } func TestGoCollectorAllowList(t *testing.T) { for _, test := range []struct { name string rules []GoRuntimeMetricsRule expected []string }{ { name: "Without any rules", rules: nil, expected: baseMetrics, }, { name: "allow all", rules: []GoRuntimeMetricsRule{MetricsAll}, expected: withAllMetrics(), }, { name: "allow GC", rules: []GoRuntimeMetricsRule{MetricsGC}, expected: withGCMetrics(), }, { name: "allow Memory", rules: []GoRuntimeMetricsRule{MetricsMemory}, expected: withMemoryMetrics(), }, { name: "allow Scheduler", rules: []GoRuntimeMetricsRule{MetricsScheduler}, expected: withSchedulerMetrics(), }, } { t.Run(test.name, func(t *testing.T) { reg := prometheus.NewRegistry() reg.MustRegister(NewGoCollector( WithGoCollectorMemStatsMetricsDisabled(), WithGoCollectorRuntimeMetrics(test.rules...), )) result, err := reg.Gather() if err != nil { t.Fatal(err) } got := []string{} for _, r := range result { got = append(got, r.GetName()) } if !reflect.DeepEqual(got, test.expected) { t.Errorf("got %v, want %v", got, test.expected) } }) } } func withBaseMetrics(metricNames []string) []string { metricNames = append(metricNames, baseMetrics...) sort.Strings(metricNames) return metricNames } func TestGoCollectorDenyList(t *testing.T) { for _, test := range []struct { name string matchers []*regexp.Regexp expected []string }{ { name: "Without any matchers", matchers: nil, expected: baseMetrics, }, { name: "deny all", matchers: []*regexp.Regexp{regexp.MustCompile("/.*")}, expected: baseMetrics, }, { name: "deny gc and scheduler latency", matchers: []*regexp.Regexp{ regexp.MustCompile("^/gc/.*"), regexp.MustCompile("^/sched/latencies:.*"), }, expected: baseMetrics, }, } { t.Run(test.name, func(t *testing.T) { reg := prometheus.NewRegistry() reg.MustRegister(NewGoCollector( WithGoCollectorMemStatsMetricsDisabled(), WithoutGoCollectorRuntimeMetrics(test.matchers...), )) result, err := reg.Gather() if err != nil { t.Fatal(err) } got := []string{} for _, r := range result { got = append(got, r.GetName()) } if !reflect.DeepEqual(got, test.expected) { t.Errorf("got %v, want %v", got, test.expected) } }) } } func ExampleGoCollector() { reg := prometheus.NewRegistry() // Register the GoCollector with the default options. Only the base metrics will be enabled. reg.MustRegister(NewGoCollector()) http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) log.Fatal(http.ListenAndServe(":8080", nil)) } func ExampleGoCollector_WithAdvancedGoMetrics() { reg := prometheus.NewRegistry() // Enable Go metrics with pre-defined rules. Or your custom rules. reg.MustRegister( NewGoCollector( WithGoCollectorMemStatsMetricsDisabled(), WithGoCollectorRuntimeMetrics( MetricsScheduler, MetricsMemory, GoRuntimeMetricsRule{ Matcher: regexp.MustCompile("^/mycustomrule.*"), }, ), WithoutGoCollectorRuntimeMetrics(regexp.MustCompile("^/gc/.*")), )) http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) log.Fatal(http.ListenAndServe(":8080", nil)) } func ExampleGoCollector_DefaultRegister() { // Unregister the default GoCollector. prometheus.Unregister(NewGoCollector()) // Register the default GoCollector with a custom config. prometheus.MustRegister(NewGoCollector(WithGoCollectorRuntimeMetrics( MetricsScheduler, MetricsGC, GoRuntimeMetricsRule{ Matcher: regexp.MustCompile("^/mycustomrule.*"), }, ), )) http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":8080", nil)) } client_golang-1.19.1/prometheus/collectors/process_collector.go000066400000000000000000000050411461713521000250270ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package collectors import "github.com/prometheus/client_golang/prometheus" // ProcessCollectorOpts defines the behavior of a process metrics collector // created with NewProcessCollector. type ProcessCollectorOpts struct { // PidFn returns the PID of the process the collector collects metrics // for. It is called upon each collection. By default, the PID of the // current process is used, as determined on construction time by // calling os.Getpid(). PidFn func() (int, error) // If non-empty, each of the collected metrics is prefixed by the // provided string and an underscore ("_"). Namespace string // If true, any error encountered during collection is reported as an // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored // and the collected metrics will be incomplete. (Possibly, no metrics // will be collected at all.) While that's usually not desired, it is // appropriate for the common "mix-in" of process metrics, where process // metrics are nice to have, but failing to collect them should not // disrupt the collection of the remaining metrics. ReportErrors bool } // NewProcessCollector returns a collector which exports the current state of // process metrics including CPU, memory and file descriptor usage as well as // the process start time. The detailed behavior is defined by the provided // ProcessCollectorOpts. The zero value of ProcessCollectorOpts creates a // collector for the current process with an empty namespace string and no error // reporting. // // The collector only works on operating systems with a Linux-style proc // filesystem and on Microsoft Windows. On other operating systems, it will not // collect any metrics. func NewProcessCollector(opts ProcessCollectorOpts) prometheus.Collector { //nolint:staticcheck // Ignore SA1019 until v2. return prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{ PidFn: opts.PidFn, Namespace: opts.Namespace, ReportErrors: opts.ReportErrors, }) } client_golang-1.19.1/prometheus/collectors/version/000077500000000000000000000000001461713521000224415ustar00rootroot00000000000000client_golang-1.19.1/prometheus/collectors/version/version.go000066400000000000000000000027351461713521000244640ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package version import ( "fmt" "github.com/prometheus/common/version" "github.com/prometheus/client_golang/prometheus" ) // NewCollector returns a collector that exports metrics about current version // information. func NewCollector(program string) prometheus.Collector { return prometheus.NewGaugeFunc( prometheus.GaugeOpts{ Namespace: program, Name: "build_info", Help: fmt.Sprintf( "A metric with a constant '1' value labeled by version, revision, branch, goversion from which %s was built, and the goos and goarch for the build.", program, ), ConstLabels: prometheus.Labels{ "version": version.Version, "revision": version.GetRevision(), "branch": version.Branch, "goversion": version.GoVersion, "goos": version.GoOS, "goarch": version.GoArch, "tags": version.GetTags(), }, }, func() float64 { return 1 }, ) } client_golang-1.19.1/prometheus/counter.go000066400000000000000000000310071461713521000206120ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "errors" "math" "sync/atomic" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/types/known/timestamppb" ) // Counter is a Metric that represents a single numerical value that only ever // goes up. That implies that it cannot be used to count items whose number can // also go down, e.g. the number of currently running goroutines. Those // "counters" are represented by Gauges. // // A Counter is typically used to count requests served, tasks completed, errors // occurred, etc. // // To create Counter instances, use NewCounter. type Counter interface { Metric Collector // Inc increments the counter by 1. Use Add to increment it by arbitrary // non-negative values. Inc() // Add adds the given value to the counter. It panics if the value is < // 0. Add(float64) } // ExemplarAdder is implemented by Counters that offer the option of adding a // value to the Counter together with an exemplar. Its AddWithExemplar method // works like the Add method of the Counter interface but also replaces the // currently saved exemplar (if any) with a new one, created from the provided // value, the current time as timestamp, and the provided labels. Empty Labels // will lead to a valid (label-less) exemplar. But if Labels is nil, the current // exemplar is left in place. AddWithExemplar panics if the value is < 0, if any // of the provided labels are invalid, or if the provided labels contain more // than 128 runes in total. type ExemplarAdder interface { AddWithExemplar(value float64, exemplar Labels) } // CounterOpts is an alias for Opts. See there for doc comments. type CounterOpts Opts // CounterVecOpts bundles the options to create a CounterVec metric. // It is mandatory to set CounterOpts, see there for mandatory fields. VariableLabels // is optional and can safely be left to its default value. type CounterVecOpts struct { CounterOpts // VariableLabels are used to partition the metric vector by the given set // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } // NewCounter creates a new Counter based on the provided CounterOpts. // // The returned implementation also implements ExemplarAdder. It is safe to // perform the corresponding type assertion. // // The returned implementation tracks the counter value in two separate // variables, a float64 and a uint64. The latter is used to track calls of the // Inc method and calls of the Add method with a value that can be represented // as a uint64. This allows atomic increments of the counter with optimal // performance. (It is common to have an Inc call in very hot execution paths.) // Both internal tracking values are added up in the Write method. This has to // be taken into account when it comes to precision and overflow behavior. func NewCounter(opts CounterOpts) Counter { desc := NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ) if opts.now == nil { opts.now = time.Now } result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: opts.now} result.init(result) // Init self-collection. result.createdTs = timestamppb.New(opts.now()) return result } type counter struct { // valBits contains the bits of the represented float64 value, while // valInt stores values that are exact integers. Both have to go first // in the struct to guarantee alignment for atomic operations. // http://golang.org/pkg/sync/atomic/#pkg-note-BUG valBits uint64 valInt uint64 selfCollector desc *Desc createdTs *timestamppb.Timestamp labelPairs []*dto.LabelPair exemplar atomic.Value // Containing nil or a *dto.Exemplar. // now is for testing purposes, by default it's time.Now. now func() time.Time } func (c *counter) Desc() *Desc { return c.desc } func (c *counter) Add(v float64) { if v < 0 { panic(errors.New("counter cannot decrease in value")) } ival := uint64(v) if float64(ival) == v { atomic.AddUint64(&c.valInt, ival) return } for { oldBits := atomic.LoadUint64(&c.valBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + v) if atomic.CompareAndSwapUint64(&c.valBits, oldBits, newBits) { return } } } func (c *counter) AddWithExemplar(v float64, e Labels) { c.Add(v) c.updateExemplar(v, e) } func (c *counter) Inc() { atomic.AddUint64(&c.valInt, 1) } func (c *counter) get() float64 { fval := math.Float64frombits(atomic.LoadUint64(&c.valBits)) ival := atomic.LoadUint64(&c.valInt) return fval + float64(ival) } func (c *counter) Write(out *dto.Metric) error { // Read the Exemplar first and the value second. This is to avoid a race condition // where users see an exemplar for a not-yet-existing observation. var exemplar *dto.Exemplar if e := c.exemplar.Load(); e != nil { exemplar = e.(*dto.Exemplar) } val := c.get() return populateMetric(CounterValue, val, c.labelPairs, exemplar, out, c.createdTs) } func (c *counter) updateExemplar(v float64, l Labels) { if l == nil { return } e, err := newExemplar(v, c.now(), l) if err != nil { panic(err) } c.exemplar.Store(e) } // CounterVec is a Collector that bundles a set of Counters that all share the // same Desc, but have different values for their variable labels. This is used // if you want to count the same thing partitioned by various dimensions // (e.g. number of HTTP requests, partitioned by response code and // method). Create instances with NewCounterVec. type CounterVec struct { *MetricVec } // NewCounterVec creates a new CounterVec based on the provided CounterOpts and // partitioned by the given label names. func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { return V2.NewCounterVec(CounterVecOpts{ CounterOpts: opts, VariableLabels: UnconstrainedLabels(labelNames), }) } // NewCounterVec creates a new CounterVec based on the provided CounterVecOpts. func (v2) NewCounterVec(opts CounterVecOpts) *CounterVec { desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, opts.VariableLabels, opts.ConstLabels, ) if opts.now == nil { opts.now = time.Now } return &CounterVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels.names) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: opts.now} result.init(result) // Init self-collection. result.createdTs = timestamppb.New(opts.now()) return result }), } } // GetMetricWithLabelValues returns the Counter for the given slice of label // values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Counter is created. // // It is possible to call this method without using the returned Counter to only // create the new Counter but leave it at its starting value 0. See also the // SummaryVec example. // // Keeping the Counter for later use is possible (and should be considered if // performance is critical), but keep in mind that Reset, DeleteLabelValues and // Delete can be used to delete the Counter from the CounterVec. In that case, // the Counter will still exist, but it will not be exported anymore, even if a // Counter with the same label values is created later. // // An error is returned if the number of label values is not the same as the // number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as // an alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Counter), err } return nil, err } // GetMetricWith returns the Counter for the given Labels map (the label names // must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Counter is created. Implications of // creating a Counter without using it and keeping the Counter for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent // with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) { metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Counter), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where // GetMetricWithLabelValues would have returned an error. Not returning an // error allows shortcuts like // // myVec.WithLabelValues("404", "GET").Add(42) func (v *CounterVec) WithLabelValues(lvs ...string) Counter { c, err := v.GetMetricWithLabelValues(lvs...) if err != nil { panic(err) } return c } // With works as GetMetricWith, but panics where GetMetricWithLabels would have // returned an error. Not returning an error allows shortcuts like // // myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) func (v *CounterVec) With(labels Labels) Counter { c, err := v.GetMetricWith(labels) if err != nil { panic(err) } return c } // CurryWith returns a vector curried with the provided labels, i.e. the // returned vector has those labels pre-set for all labeled operations performed // on it. The cardinality of the curried vector is reduced accordingly. The // order of the remaining labels stays the same (just with the curried labels // taken out of the sequence – which is relevant for the // (GetMetric)WithLabelValues methods). It is possible to curry a curried // vector, but only with labels not yet used for currying before. // // The metrics contained in the CounterVec are shared between the curried and // uncurried vectors. They are just accessed differently. Curried and uncurried // vectors behave identically in terms of collection. Only one must be // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) { vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &CounterVec{vec}, err } return nil, err } // MustCurryWith works as CurryWith but panics where CurryWith would have // returned an error. func (v *CounterVec) MustCurryWith(labels Labels) *CounterVec { vec, err := v.CurryWith(labels) if err != nil { panic(err) } return vec } // CounterFunc is a Counter whose value is determined at collect time by calling a // provided function. // // To create CounterFunc instances, use NewCounterFunc. type CounterFunc interface { Metric Collector } // NewCounterFunc creates a new CounterFunc based on the provided // CounterOpts. The value reported is determined by calling the given function // from within the Write method. Take into account that metric collection may // happen concurrently. If that results in concurrent calls to Write, like in // the case where a CounterFunc is directly registered with Prometheus, the // provided function must be concurrency-safe. The function should also honor // the contract for a Counter (values only go up, not down), but compliance will // not be checked. // // Check out the ExampleGaugeFunc examples for the similar GaugeFunc. func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { return newValueFunc(NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ), CounterValue, function) } client_golang-1.19.1/prometheus/counter_test.go000066400000000000000000000242411461713521000216530ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "math" "strings" "testing" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) func TestCounterAdd(t *testing.T) { now := time.Now() counter := NewCounter(CounterOpts{ Name: "test", Help: "test help", ConstLabels: Labels{"a": "1", "b": "2"}, now: func() time.Time { return now }, }).(*counter) counter.Inc() if expected, got := 0.0, math.Float64frombits(counter.valBits); expected != got { t.Errorf("Expected %f, got %f.", expected, got) } if expected, got := uint64(1), counter.valInt; expected != got { t.Errorf("Expected %d, got %d.", expected, got) } counter.Add(42) if expected, got := 0.0, math.Float64frombits(counter.valBits); expected != got { t.Errorf("Expected %f, got %f.", expected, got) } if expected, got := uint64(43), counter.valInt; expected != got { t.Errorf("Expected %d, got %d.", expected, got) } counter.Add(24.42) if expected, got := 24.42, math.Float64frombits(counter.valBits); expected != got { t.Errorf("Expected %f, got %f.", expected, got) } if expected, got := uint64(43), counter.valInt; expected != got { t.Errorf("Expected %d, got %d.", expected, got) } if expected, got := "counter cannot decrease in value", decreaseCounter(counter).Error(); expected != got { t.Errorf("Expected error %q, got %q.", expected, got) } m := &dto.Metric{} counter.Write(m) expected := &dto.Metric{ Label: []*dto.LabelPair{ {Name: proto.String("a"), Value: proto.String("1")}, {Name: proto.String("b"), Value: proto.String("2")}, }, Counter: &dto.Counter{ Value: proto.Float64(67.42), CreatedTimestamp: timestamppb.New(now), }, } if !proto.Equal(expected, m) { t.Errorf("expected %q, got %q", expected, m) } } func decreaseCounter(c *counter) (err error) { defer func() { if e := recover(); e != nil { err = e.(error) } }() c.Add(-1) return nil } func TestCounterVecGetMetricWithInvalidLabelValues(t *testing.T) { testCases := []struct { desc string labels Labels }{ { desc: "non utf8 label value", labels: Labels{"a": "\xFF"}, }, { desc: "not enough label values", labels: Labels{}, }, { desc: "too many label values", labels: Labels{"a": "1", "b": "2"}, }, } for _, test := range testCases { counterVec := NewCounterVec(CounterOpts{ Name: "test", }, []string{"a"}) labelValues := make([]string, 0, len(test.labels)) for _, val := range test.labels { labelValues = append(labelValues, val) } expectPanic(t, func() { counterVec.WithLabelValues(labelValues...) }, fmt.Sprintf("WithLabelValues: expected panic because: %s", test.desc)) expectPanic(t, func() { counterVec.With(test.labels) }, fmt.Sprintf("WithLabelValues: expected panic because: %s", test.desc)) if _, err := counterVec.GetMetricWithLabelValues(labelValues...); err == nil { t.Errorf("GetMetricWithLabelValues: expected error because: %s", test.desc) } if _, err := counterVec.GetMetricWith(test.labels); err == nil { t.Errorf("GetMetricWith: expected error because: %s", test.desc) } } } func expectPanic(t *testing.T, op func(), errorMsg string) { defer func() { if err := recover(); err == nil { t.Error(errorMsg) } }() op() } func TestCounterAddInf(t *testing.T) { now := time.Now() counter := NewCounter(CounterOpts{ Name: "test", Help: "test help", now: func() time.Time { return now }, }).(*counter) counter.Inc() if expected, got := 0.0, math.Float64frombits(counter.valBits); expected != got { t.Errorf("Expected %f, got %f.", expected, got) } if expected, got := uint64(1), counter.valInt; expected != got { t.Errorf("Expected %d, got %d.", expected, got) } counter.Add(math.Inf(1)) if expected, got := math.Inf(1), math.Float64frombits(counter.valBits); expected != got { t.Errorf("valBits expected %f, got %f.", expected, got) } if expected, got := uint64(1), counter.valInt; expected != got { t.Errorf("valInts expected %d, got %d.", expected, got) } counter.Inc() if expected, got := math.Inf(1), math.Float64frombits(counter.valBits); expected != got { t.Errorf("Expected %f, got %f.", expected, got) } if expected, got := uint64(2), counter.valInt; expected != got { t.Errorf("Expected %d, got %d.", expected, got) } m := &dto.Metric{} counter.Write(m) expected := &dto.Metric{ Counter: &dto.Counter{ Value: proto.Float64(math.Inf(1)), CreatedTimestamp: timestamppb.New(now), }, } if !proto.Equal(expected, m) { t.Errorf("expected %q, got %q", expected, m) } } func TestCounterAddLarge(t *testing.T) { now := time.Now() counter := NewCounter(CounterOpts{ Name: "test", Help: "test help", now: func() time.Time { return now }, }).(*counter) // large overflows the underlying type and should therefore be stored in valBits. large := math.Nextafter(float64(math.MaxUint64), 1e20) counter.Add(large) if expected, got := large, math.Float64frombits(counter.valBits); expected != got { t.Errorf("valBits expected %f, got %f.", expected, got) } if expected, got := uint64(0), counter.valInt; expected != got { t.Errorf("valInts expected %d, got %d.", expected, got) } m := &dto.Metric{} counter.Write(m) expected := &dto.Metric{ Counter: &dto.Counter{ Value: proto.Float64(large), CreatedTimestamp: timestamppb.New(now), }, } if !proto.Equal(expected, m) { t.Errorf("expected %q, got %q", expected, m) } } func TestCounterAddSmall(t *testing.T) { now := time.Now() counter := NewCounter(CounterOpts{ Name: "test", Help: "test help", now: func() time.Time { return now }, }).(*counter) small := 0.000000000001 counter.Add(small) if expected, got := small, math.Float64frombits(counter.valBits); expected != got { t.Errorf("valBits expected %f, got %f.", expected, got) } if expected, got := uint64(0), counter.valInt; expected != got { t.Errorf("valInts expected %d, got %d.", expected, got) } m := &dto.Metric{} counter.Write(m) expected := &dto.Metric{ Counter: &dto.Counter{ Value: proto.Float64(small), CreatedTimestamp: timestamppb.New(now), }, } if !proto.Equal(expected, m) { t.Errorf("expected %q, got %q", expected, m) } } func TestCounterExemplar(t *testing.T) { now := time.Now() counter := NewCounter(CounterOpts{ Name: "test", Help: "test help", now: func() time.Time { return now }, }).(*counter) ts := timestamppb.New(now) if err := ts.CheckValid(); err != nil { t.Fatal(err) } expectedExemplar := &dto.Exemplar{ Label: []*dto.LabelPair{ {Name: proto.String("foo"), Value: proto.String("bar")}, }, Value: proto.Float64(42), Timestamp: ts, } counter.AddWithExemplar(42, Labels{"foo": "bar"}) if expected, got := expectedExemplar.String(), counter.exemplar.Load().(*dto.Exemplar).String(); expected != got { t.Errorf("expected exemplar %s, got %s.", expected, got) } addExemplarWithInvalidLabel := func() (err error) { defer func() { if e := recover(); e != nil { err = e.(error) } }() // Should panic because of invalid label name. counter.AddWithExemplar(42, Labels{":o)": "smile"}) return nil } if addExemplarWithInvalidLabel() == nil { t.Error("adding exemplar with invalid label succeeded") } addExemplarWithOversizedLabels := func() (err error) { defer func() { if e := recover(); e != nil { err = e.(error) } }() // Should panic because of 129 runes. counter.AddWithExemplar(42, Labels{ "abcdefghijklmnopqrstuvwxyz": "26+16 characters", "x1234567": "8+15 characters", "z": strings.Repeat("x", 63), }) return nil } if addExemplarWithOversizedLabels() == nil { t.Error("adding exemplar with oversized labels succeeded") } } func TestCounterVecCreatedTimestampWithDeletes(t *testing.T) { now := time.Now() counterVec := NewCounterVec(CounterOpts{ Name: "test", Help: "test help", now: func() time.Time { return now }, }, []string{"label"}) // First use of "With" should populate CT. counterVec.WithLabelValues("1") expected := map[string]time.Time{"1": now} now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, counterVec.MetricVec, dto.MetricType_COUNTER, expected) // Two more labels at different times. counterVec.WithLabelValues("2") expected["2"] = now now = now.Add(1 * time.Hour) counterVec.WithLabelValues("3") expected["3"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, counterVec.MetricVec, dto.MetricType_COUNTER, expected) // Recreate metric instance should reset created timestamp to now. counterVec.DeleteLabelValues("1") counterVec.WithLabelValues("1") expected["1"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, counterVec.MetricVec, dto.MetricType_COUNTER, expected) } func expectCTsForMetricVecValues(t testing.TB, vec *MetricVec, typ dto.MetricType, ctsPerLabelValue map[string]time.Time) { t.Helper() for val, ct := range ctsPerLabelValue { var metric dto.Metric m, err := vec.GetMetricWithLabelValues(val) if err != nil { t.Fatal(err) } if err := m.Write(&metric); err != nil { t.Fatal(err) } var gotTs time.Time switch typ { case dto.MetricType_COUNTER: gotTs = metric.Counter.CreatedTimestamp.AsTime() case dto.MetricType_HISTOGRAM: gotTs = metric.Histogram.CreatedTimestamp.AsTime() case dto.MetricType_SUMMARY: gotTs = metric.Summary.CreatedTimestamp.AsTime() default: t.Fatalf("unknown metric type %v", typ) } if !gotTs.Equal(ct) { t.Errorf("expected created timestamp for %s with label value %q: %s, got %s", typ, val, ct, gotTs) } } } client_golang-1.19.1/prometheus/desc.go000066400000000000000000000173301461713521000200540ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "sort" "strings" "github.com/cespare/xxhash/v2" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/model" "google.golang.org/protobuf/proto" "github.com/prometheus/client_golang/prometheus/internal" ) // Desc is the descriptor used by every Prometheus Metric. It is essentially // the immutable meta-data of a Metric. The normal Metric implementations // included in this package manage their Desc under the hood. Users only have to // deal with Desc if they use advanced features like the ExpvarCollector or // custom Collectors and Metrics. // // Descriptors registered with the same registry have to fulfill certain // consistency and uniqueness criteria if they share the same fully-qualified // name: They must have the same help string and the same label names (aka label // dimensions) in each, constLabels and variableLabels, but they must differ in // the values of the constLabels. // // Descriptors that share the same fully-qualified names and the same label // values of their constLabels are considered equal. // // Use NewDesc to create new Desc instances. type Desc struct { // fqName has been built from Namespace, Subsystem, and Name. fqName string // help provides some helpful information about this metric. help string // constLabelPairs contains precalculated DTO label pairs based on // the constant labels. constLabelPairs []*dto.LabelPair // variableLabels contains names of labels and normalization function for // which the metric maintains variable values. variableLabels *compiledLabels // id is a hash of the values of the ConstLabels and fqName. This // must be unique among all registered descriptors and can therefore be // used as an identifier of the descriptor. id uint64 // dimHash is a hash of the label names (preset and variable) and the // Help string. Each Desc with the same fqName must have the same // dimHash. dimHash uint64 // err is an error that occurred during construction. It is reported on // registration time. err error } // NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc // and will be reported on registration time. variableLabels and constLabels can // be nil if no such labels should be set. fqName must not be empty. // // variableLabels only contain the label names. Their label values are variable // and therefore not part of the Desc. (They are managed within the Metric.) // // For constLabels, the label values are constant. Therefore, they are fully // specified in the Desc. See the Collector example for a usage pattern. func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { return V2.NewDesc(fqName, help, UnconstrainedLabels(variableLabels), constLabels) } // NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc // and will be reported on registration time. variableLabels and constLabels can // be nil if no such labels should be set. fqName must not be empty. // // variableLabels only contain the label names and normalization functions. Their // label values are variable and therefore not part of the Desc. (They are managed // within the Metric.) // // For constLabels, the label values are constant. Therefore, they are fully // specified in the Desc. See the Collector example for a usage pattern. func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, constLabels Labels) *Desc { d := &Desc{ fqName: fqName, help: help, variableLabels: variableLabels.compile(), } if !model.IsValidMetricName(model.LabelValue(fqName)) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) return d } // labelValues contains the label values of const labels (in order of // their sorted label names) plus the fqName (at position 0). labelValues := make([]string, 1, len(constLabels)+1) labelValues[0] = fqName labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels.names)) labelNameSet := map[string]struct{}{} // First add only the const label names and sort them... for labelName := range constLabels { if !checkLabelName(labelName) { d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) return d } labelNames = append(labelNames, labelName) labelNameSet[labelName] = struct{}{} } sort.Strings(labelNames) // ... so that we can now add const label values in the order of their names. for _, labelName := range labelNames { labelValues = append(labelValues, constLabels[labelName]) } // Validate the const label values. They can't have a wrong cardinality, so // use in len(labelValues) as expectedNumberOfValues. if err := validateLabelValues(labelValues, len(labelValues)); err != nil { d.err = err return d } // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. for _, label := range d.variableLabels.names { if !checkLabelName(label) { d.err = fmt.Errorf("%q is not a valid label name for metric %q", label, fqName) return d } labelNames = append(labelNames, "$"+label) labelNameSet[label] = struct{}{} } if len(labelNames) != len(labelNameSet) { d.err = fmt.Errorf("duplicate label names in constant and variable labels for metric %q", fqName) return d } xxh := xxhash.New() for _, val := range labelValues { xxh.WriteString(val) xxh.Write(separatorByteSlice) } d.id = xxh.Sum64() // Sort labelNames so that order doesn't matter for the hash. sort.Strings(labelNames) // Now hash together (in this order) the help string and the sorted // label names. xxh.Reset() xxh.WriteString(help) xxh.Write(separatorByteSlice) for _, labelName := range labelNames { xxh.WriteString(labelName) xxh.Write(separatorByteSlice) } d.dimHash = xxh.Sum64() d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) for n, v := range constLabels { d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ Name: proto.String(n), Value: proto.String(v), }) } sort.Sort(internal.LabelPairSorter(d.constLabelPairs)) return d } // NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the // provided error set. If a collector returning such a descriptor is registered, // registration will fail with the provided error. NewInvalidDesc can be used by // a Collector to signal inability to describe itself. func NewInvalidDesc(err error) *Desc { return &Desc{ err: err, } } func (d *Desc) String() string { lpStrings := make([]string, 0, len(d.constLabelPairs)) for _, lp := range d.constLabelPairs { lpStrings = append( lpStrings, fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), ) } vlStrings := make([]string, 0, len(d.variableLabels.names)) for _, vl := range d.variableLabels.names { if fn, ok := d.variableLabels.labelConstraints[vl]; ok && fn != nil { vlStrings = append(vlStrings, fmt.Sprintf("c(%s)", vl)) } else { vlStrings = append(vlStrings, vl) } } return fmt.Sprintf( "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: {%s}}", d.fqName, d.help, strings.Join(lpStrings, ","), strings.Join(vlStrings, ","), ) } client_golang-1.19.1/prometheus/desc_test.go000066400000000000000000000015351461713521000211130ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "testing" ) func TestNewDescInvalidLabelValues(t *testing.T) { desc := NewDesc( "sample_label", "sample label", nil, Labels{"a": "\xFF"}, ) if desc.err == nil { t.Errorf("NewDesc: expected error because: %s", desc.err) } } client_golang-1.19.1/prometheus/doc.go000066400000000000000000000235651461713521000177120ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package prometheus is the core instrumentation package. It provides metrics // primitives to instrument code for monitoring. It also offers a registry for // metrics. Sub-packages allow to expose the registered metrics via HTTP // (package promhttp) or push them to a Pushgateway (package push). There is // also a sub-package promauto, which provides metrics constructors with // automatic registration. // // All exported functions and methods are safe to be used concurrently unless // specified otherwise. // // # A Basic Example // // As a starting point, a very basic usage example: // // package main // // import ( // "log" // "net/http" // // "github.com/prometheus/client_golang/prometheus" // "github.com/prometheus/client_golang/prometheus/promhttp" // ) // // type metrics struct { // cpuTemp prometheus.Gauge // hdFailures *prometheus.CounterVec // } // // func NewMetrics(reg prometheus.Registerer) *metrics { // m := &metrics{ // cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ // Name: "cpu_temperature_celsius", // Help: "Current temperature of the CPU.", // }), // hdFailures: prometheus.NewCounterVec( // prometheus.CounterOpts{ // Name: "hd_errors_total", // Help: "Number of hard-disk errors.", // }, // []string{"device"}, // ), // } // reg.MustRegister(m.cpuTemp) // reg.MustRegister(m.hdFailures) // return m // } // // func main() { // // Create a non-global registry. // reg := prometheus.NewRegistry() // // // Create new metrics and register them using the custom registry. // m := NewMetrics(reg) // // Set values for the new created metrics. // m.cpuTemp.Set(65.3) // m.hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() // // // Expose metrics and custom registry via an HTTP server // // using the HandleFor function. "/metrics" is the usual endpoint for that. // http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg})) // log.Fatal(http.ListenAndServe(":8080", nil)) // } // // This is a complete program that exports two metrics, a Gauge and a Counter, // the latter with a label attached to turn it into a (one-dimensional) vector. // It register the metrics using a custom registry and exposes them via an HTTP server // on the /metrics endpoint. // // # Metrics // // The number of exported identifiers in this package might appear a bit // overwhelming. However, in addition to the basic plumbing shown in the example // above, you only need to understand the different metric types and their // vector versions for basic usage. Furthermore, if you are not concerned with // fine-grained control of when and how to register metrics with the registry, // have a look at the promauto package, which will effectively allow you to // ignore registration altogether in simple cases. // // Above, you have already touched the Counter and the Gauge. There are two more // advanced metric types: the Summary and Histogram. A more thorough description // of those four metric types can be found in the Prometheus docs: // https://prometheus.io/docs/concepts/metric_types/ // // In addition to the fundamental metric types Gauge, Counter, Summary, and // Histogram, a very important part of the Prometheus data model is the // partitioning of samples along dimensions called labels, which results in // metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, // and HistogramVec. // // While only the fundamental metric types implement the Metric interface, both // the metrics and their vector versions implement the Collector interface. A // Collector manages the collection of a number of Metrics, but for convenience, // a Metric can also “collect itself”. Note that Gauge, Counter, Summary, and // Histogram are interfaces themselves while GaugeVec, CounterVec, SummaryVec, // and HistogramVec are not. // // To create instances of Metrics and their vector versions, you need a suitable // …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, or HistogramOpts. // // # Custom Collectors and constant Metrics // // While you could create your own implementations of Metric, most likely you // will only ever implement the Collector interface on your own. At a first // glance, a custom Collector seems handy to bundle Metrics for common // registration (with the prime example of the different metric vectors above, // which bundle all the metrics of the same name but with different labels). // // There is a more involved use case, too: If you already have metrics // available, created outside of the Prometheus context, you don't need the // interface of the various Metric types. You essentially want to mirror the // existing numbers into Prometheus Metrics during collection. An own // implementation of the Collector interface is perfect for that. You can create // Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and // NewConstSummary (and their respective Must… versions). NewConstMetric is used // for all metric types with just a float64 as their value: Counter, Gauge, and // a special “type” called Untyped. Use the latter if you are not sure if the // mirrored metric is a Counter or a Gauge. Creation of the Metric instance // happens in the Collect method. The Describe method has to return separate // Desc instances, representative of the “throw-away” metrics to be created // later. NewDesc comes in handy to create those Desc instances. Alternatively, // you could return no Desc at all, which will mark the Collector “unchecked”. // No checks are performed at registration time, but metric consistency will // still be ensured at scrape time, i.e. any inconsistencies will lead to scrape // errors. Thus, with unchecked Collectors, the responsibility to not collect // metrics that lead to inconsistencies in the total scrape result lies with the // implementer of the Collector. While this is not a desirable state, it is // sometimes necessary. The typical use case is a situation where the exact // metrics to be returned by a Collector cannot be predicted at registration // time, but the implementer has sufficient knowledge of the whole system to // guarantee metric consistency. // // The Collector example illustrates the use case. You can also look at the // source code of the processCollector (mirroring process metrics), the // goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar // metrics) as examples that are used in this package itself. // // If you just need to call a function to get a single float value to collect as // a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting // shortcuts. // // # Advanced Uses of the Registry // // While MustRegister is the by far most common way of registering a Collector, // sometimes you might want to handle the errors the registration might cause. // As suggested by the name, MustRegister panics if an error occurs. With the // Register function, the error is returned and can be handled. // // An error is returned if the registered Collector is incompatible or // inconsistent with already registered metrics. The registry aims for // consistency of the collected metrics according to the Prometheus data model. // Inconsistencies are ideally detected at registration time, not at collect // time. The former will usually be detected at start-up time of a program, // while the latter will only happen at scrape time, possibly not even on the // first scrape if the inconsistency only becomes relevant later. That is the // main reason why a Collector and a Metric have to describe themselves to the // registry. // // So far, everything we did operated on the so-called default registry, as it // can be found in the global DefaultRegisterer variable. With NewRegistry, you // can create a custom registry, or you can even implement the Registerer or // Gatherer interfaces yourself. The methods Register and Unregister work in the // same way on a custom registry as the global functions Register and Unregister // on the default registry. // // There are a number of uses for custom registries: You can use registries with // special properties, see NewPedanticRegistry. You can avoid global state, as // it is imposed by the DefaultRegisterer. You can use multiple registries at // the same time to expose different metrics in different ways. You can use // separate registries for testing purposes. // // Also note that the DefaultRegisterer comes registered with a Collector for Go // runtime metrics (via NewGoCollector) and a Collector for process metrics (via // NewProcessCollector). With a custom registry, you are in control and decide // yourself about the Collectors to register. // // # HTTP Exposition // // The Registry implements the Gatherer interface. The caller of the Gather // method can then expose the gathered metrics in some way. Usually, the metrics // are served via HTTP on the /metrics endpoint. That's happening in the example // above. The tools to expose metrics via HTTP are in the promhttp sub-package. // // # Pushing to the Pushgateway // // Function for pushing to the Pushgateway can be found in the push sub-package. // // # Graphite Bridge // // Functions and examples to push metrics from a Gatherer to Graphite can be // found in the graphite sub-package. // // # Other Means of Exposition // // More ways of exposing metrics can easily be added by following the approaches // of the existing implementations. package prometheus client_golang-1.19.1/prometheus/example_clustermanager_test.go000066400000000000000000000117061461713521000247250ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) // ClusterManager is an example for a system that might have been built without // Prometheus in mind. It models a central manager of jobs running in a // cluster. Thus, we implement a custom Collector called // ClusterManagerCollector, which collects information from a ClusterManager // using its provided methods and turns them into Prometheus Metrics for // collection. // // An additional challenge is that multiple instances of the ClusterManager are // run within the same binary, each in charge of a different zone. We need to // make use of wrapping Registerers to be able to register each // ClusterManagerCollector instance with Prometheus. type ClusterManager struct { Zone string // Contains many more fields not listed in this example. } // ReallyExpensiveAssessmentOfTheSystemState is a mock for the data gathering a // real cluster manager would have to do. Since it may actually be really // expensive, it must only be called once per collection. This implementation, // obviously, only returns some made-up data. func (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( oomCountByHost map[string]int, ramUsageByHost map[string]float64, ) { // Just example fake data. oomCountByHost = map[string]int{ "foo.example.org": 42, "bar.example.org": 2001, } ramUsageByHost = map[string]float64{ "foo.example.org": 6.023e23, "bar.example.org": 3.14, } return } // ClusterManagerCollector implements the Collector interface. type ClusterManagerCollector struct { ClusterManager *ClusterManager } // Descriptors used by the ClusterManagerCollector below. var ( oomCountDesc = prometheus.NewDesc( "clustermanager_oom_crashes_total", "Number of OOM crashes.", []string{"host"}, nil, ) ramUsageDesc = prometheus.NewDesc( "clustermanager_ram_usage_bytes", "RAM usage as reported to the cluster manager.", []string{"host"}, nil, ) ) // Describe is implemented with DescribeByCollect. That's possible because the // Collect method will always return the same two metrics with the same two // descriptors. func (cc ClusterManagerCollector) Describe(ch chan<- *prometheus.Desc) { prometheus.DescribeByCollect(cc, ch) } // Collect first triggers the ReallyExpensiveAssessmentOfTheSystemState. Then it // creates constant metrics for each host on the fly based on the returned data. // // Note that Collect could be called concurrently, so we depend on // ReallyExpensiveAssessmentOfTheSystemState to be concurrency-safe. func (cc ClusterManagerCollector) Collect(ch chan<- prometheus.Metric) { oomCountByHost, ramUsageByHost := cc.ClusterManager.ReallyExpensiveAssessmentOfTheSystemState() for host, oomCount := range oomCountByHost { ch <- prometheus.MustNewConstMetric( oomCountDesc, prometheus.CounterValue, float64(oomCount), host, ) } for host, ramUsage := range ramUsageByHost { ch <- prometheus.MustNewConstMetric( ramUsageDesc, prometheus.GaugeValue, ramUsage, host, ) } } // NewClusterManager first creates a Prometheus-ignorant ClusterManager // instance. Then, it creates a ClusterManagerCollector for the just created // ClusterManager. Finally, it registers the ClusterManagerCollector with a // wrapping Registerer that adds the zone as a label. In this way, the metrics // collected by different ClusterManagerCollectors do not collide. func NewClusterManager(zone string, reg prometheus.Registerer) *ClusterManager { c := &ClusterManager{ Zone: zone, } cc := ClusterManagerCollector{ClusterManager: c} prometheus.WrapRegistererWith(prometheus.Labels{"zone": zone}, reg).MustRegister(cc) return c } func ExampleCollector() { // Since we are dealing with custom Collector implementations, it might // be a good idea to try it out with a pedantic registry. reg := prometheus.NewPedanticRegistry() // Construct cluster managers. In real code, we would assign them to // variables to then do something with them. NewClusterManager("db", reg) NewClusterManager("ca", reg) // Add the standard process and Go metrics to the custom registry. reg.MustRegister( prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}), prometheus.NewGoCollector(), ) http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) log.Fatal(http.ListenAndServe(":8080", nil)) } client_golang-1.19.1/prometheus/example_metricvec_test.go000066400000000000000000000100731461713521000236660ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "fmt" "google.golang.org/protobuf/proto" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus" ) // Info implements an info pseudo-metric, which is modeled as a Gauge that // always has a value of 1. In practice, you would just use a Gauge directly, // but for this example, we pretend it would be useful to have a “native” // implementation. type Info struct { desc *prometheus.Desc labelPairs []*dto.LabelPair } func (i Info) Desc() *prometheus.Desc { return i.desc } func (i Info) Write(out *dto.Metric) error { out.Label = i.labelPairs out.Gauge = &dto.Gauge{Value: proto.Float64(1)} return nil } // InfoVec is the vector version for Info. As an info metric never changes, we // wouldn't really need to wrap GetMetricWithLabelValues and GetMetricWith // because Info has no additional methods compared to the vanilla Metric that // the unwrapped MetricVec methods return. However, to demonstrate all there is // to do to fully implement a vector for a custom Metric implementation, we do // it in this example anyway. type InfoVec struct { *prometheus.MetricVec } func NewInfoVec(name, help string, labelNames []string) *InfoVec { desc := prometheus.NewDesc(name, help, labelNames, nil) return &InfoVec{ MetricVec: prometheus.NewMetricVec(desc, func(lvs ...string) prometheus.Metric { if len(lvs) != len(labelNames) { panic("inconsistent label cardinality") } return Info{desc: desc, labelPairs: prometheus.MakeLabelPairs(desc, lvs)} }), } } func (v *InfoVec) GetMetricWithLabelValues(lvs ...string) (Info, error) { metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) return metric.(Info), err } func (v *InfoVec) GetMetricWith(labels prometheus.Labels) (Info, error) { metric, err := v.MetricVec.GetMetricWith(labels) return metric.(Info), err } func (v *InfoVec) WithLabelValues(lvs ...string) Info { i, err := v.GetMetricWithLabelValues(lvs...) if err != nil { panic(err) } return i } func (v *InfoVec) With(labels prometheus.Labels) Info { i, err := v.GetMetricWith(labels) if err != nil { panic(err) } return i } func (v *InfoVec) CurryWith(labels prometheus.Labels) (*InfoVec, error) { vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &InfoVec{vec}, err } return nil, err } func (v *InfoVec) MustCurryWith(labels prometheus.Labels) *InfoVec { vec, err := v.CurryWith(labels) if err != nil { panic(err) } return vec } func ExampleMetricVec() { infoVec := NewInfoVec( "library_version_info", "Versions of the libraries used in this binary.", []string{"library", "version"}, ) infoVec.WithLabelValues("prometheus/client_golang", "1.7.1") infoVec.WithLabelValues("k8s.io/client-go", "0.18.8") // Just for demonstration, let's check the state of the InfoVec by // registering it with a custom registry and then let it collect the // metrics. reg := prometheus.NewRegistry() reg.MustRegister(infoVec) metricFamilies, err := reg.Gather() if err != nil || len(metricFamilies) != 1 { panic("unexpected behavior of custom test registry") } fmt.Println(toNormalizedJSON(metricFamilies[0])) // Output: // {"name":"library_version_info","help":"Versions of the libraries used in this binary.","type":"GAUGE","metric":[{"label":[{"name":"library","value":"k8s.io/client-go"},{"name":"version","value":"0.18.8"}],"gauge":{"value":1}},{"label":[{"name":"library","value":"prometheus/client_golang"},{"name":"version","value":"1.7.1"}],"gauge":{"value":1}}]} } client_golang-1.19.1/prometheus/example_timer_complex_test.go000066400000000000000000000052311461713521000245540ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "net/http" "github.com/prometheus/client_golang/prometheus" ) // apiRequestDuration tracks the duration separate for each HTTP status // class (1xx, 2xx, ...). This creates a fair amount of time series on // the Prometheus server. Usually, you would track the duration of // serving HTTP request without partitioning by outcome. Do something // like this only if needed. Also note how only status classes are // tracked, not every single status code. The latter would create an // even larger amount of time series. Request counters partitioned by // status code are usually OK as each counter only creates one time // series. Histograms are way more expensive, so partition with care and // only where you really need separate latency tracking. Partitioning by // status class is only an example. In concrete cases, other partitions // might make more sense. var apiRequestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "api_request_duration_seconds", Help: "Histogram for the request duration of the public API, partitioned by status class.", Buckets: prometheus.ExponentialBuckets(0.1, 1.5, 5), }, []string{"status_class"}, ) func handler(w http.ResponseWriter, r *http.Request) { status := http.StatusOK // The ObserverFunc gets called by the deferred ObserveDuration and // decides which Histogram's Observe method is called. timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { switch { case status >= 500: // Server error. apiRequestDuration.WithLabelValues("5xx").Observe(v) case status >= 400: // Client error. apiRequestDuration.WithLabelValues("4xx").Observe(v) case status >= 300: // Redirection. apiRequestDuration.WithLabelValues("3xx").Observe(v) case status >= 200: // Success. apiRequestDuration.WithLabelValues("2xx").Observe(v) default: // Informational. apiRequestDuration.WithLabelValues("1xx").Observe(v) } })) defer timer.ObserveDuration() // Handle the request. Set status accordingly. // ... } func ExampleTimer_complex() { http.HandleFunc("/api", handler) } client_golang-1.19.1/prometheus/example_timer_gauge_test.go000066400000000000000000000030521461713521000241740ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "os" "github.com/prometheus/client_golang/prometheus" ) // If a function is called rarely (i.e. not more often than scrapes // happen) or ideally only once (like in a batch job), it can make sense // to use a Gauge for timing the function call. For timing a batch job // and pushing the result to a Pushgateway, see also the comprehensive // example in the push package. var funcDuration = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "example_function_duration_seconds", Help: "Duration of the last call of an example function.", }) func run() error { // The Set method of the Gauge is used to observe the duration. timer := prometheus.NewTimer(prometheus.ObserverFunc(funcDuration.Set)) defer timer.ObserveDuration() // Do something. Return errors as encountered. The use of 'defer' above // makes sure the function is still timed properly. return nil } func ExampleTimer_gauge() { if err := run(); err != nil { os.Exit(1) } } client_golang-1.19.1/prometheus/example_timer_test.go000066400000000000000000000025301461713521000230240ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "math/rand" "time" "github.com/prometheus/client_golang/prometheus" ) var requestDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "example_request_duration_seconds", Help: "Histogram for the runtime of a simple example function.", Buckets: prometheus.LinearBuckets(0.01, 0.01, 10), }) func ExampleTimer() { // timer times this example function. It uses a Histogram, but a Summary // would also work, as both implement Observer. Check out // https://prometheus.io/docs/practices/histograms/ for differences. timer := prometheus.NewTimer(requestDuration) defer timer.ObserveDuration() // Do something here that takes time. time.Sleep(time.Duration(rand.NormFloat64()*10000+50000) * time.Microsecond) } client_golang-1.19.1/prometheus/examples_test.go000066400000000000000000000630331461713521000220140ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "bytes" "errors" "fmt" "math" "net/http" "runtime" "strings" "time" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) func ExampleGauge() { opsQueued := prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: "our_company", Subsystem: "blob_storage", Name: "ops_queued", Help: "Number of blob storage operations waiting to be processed.", }) prometheus.MustRegister(opsQueued) // 10 operations queued by the goroutine managing incoming requests. opsQueued.Add(10) // A worker goroutine has picked up a waiting operation. opsQueued.Dec() // And once more... opsQueued.Dec() } func ExampleGaugeVec() { opsQueued := prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: "our_company", Subsystem: "blob_storage", Name: "ops_queued", Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", }, []string{ // Which user has requested the operation? "user", // Of what type is the operation? "type", }, ) prometheus.MustRegister(opsQueued) // Increase a value using compact (but order-sensitive!) WithLabelValues(). opsQueued.WithLabelValues("bob", "put").Add(4) // Increase a value with a map using WithLabels. More verbose, but order // doesn't matter anymore. opsQueued.With(prometheus.Labels{"type": "delete", "user": "alice"}).Inc() } func ExampleGaugeFunc_simple() { if err := prometheus.Register(prometheus.NewGaugeFunc( prometheus.GaugeOpts{ Subsystem: "runtime", Name: "goroutines_count", Help: "Number of goroutines that currently exist.", }, func() float64 { return float64(runtime.NumGoroutine()) }, )); err == nil { fmt.Println("GaugeFunc 'goroutines_count' registered.") } // Note that the count of goroutines is a gauge (and not a counter) as // it can go up and down. // Output: // GaugeFunc 'goroutines_count' registered. } func ExampleGaugeFunc_constLabels() { // primaryDB and secondaryDB represent two example *sql.DB connections we want to instrument. var primaryDB, secondaryDB interface { Stats() struct{ OpenConnections int } } if err := prometheus.Register(prometheus.NewGaugeFunc( prometheus.GaugeOpts{ Namespace: "mysql", Name: "connections_open", Help: "Number of mysql connections open.", ConstLabels: prometheus.Labels{"destination": "primary"}, }, func() float64 { return float64(primaryDB.Stats().OpenConnections) }, )); err == nil { fmt.Println(`GaugeFunc 'connections_open' for primary DB connection registered with labels {destination="primary"}`) } if err := prometheus.Register(prometheus.NewGaugeFunc( prometheus.GaugeOpts{ Namespace: "mysql", Name: "connections_open", Help: "Number of mysql connections open.", ConstLabels: prometheus.Labels{"destination": "secondary"}, }, func() float64 { return float64(secondaryDB.Stats().OpenConnections) }, )); err == nil { fmt.Println(`GaugeFunc 'connections_open' for secondary DB connection registered with labels {destination="secondary"}`) } // Note that we can register more than once GaugeFunc with same metric name // as long as their const labels are consistent. // Output: // GaugeFunc 'connections_open' for primary DB connection registered with labels {destination="primary"} // GaugeFunc 'connections_open' for secondary DB connection registered with labels {destination="secondary"} } func ExampleCounterVec() { httpReqs := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", }, []string{"code", "method"}, ) prometheus.MustRegister(httpReqs) httpReqs.WithLabelValues("404", "POST").Add(42) // If you have to access the same set of labels very frequently, it // might be good to retrieve the metric only once and keep a handle to // it. But beware of deletion of that metric, see below! m := httpReqs.WithLabelValues("200", "GET") for i := 0; i < 1000000; i++ { m.Inc() } // Delete a metric from the vector. If you have previously kept a handle // to that metric (as above), future updates via that handle will go // unseen (even if you re-create a metric with the same label set // later). httpReqs.DeleteLabelValues("200", "GET") // Same thing with the more verbose Labels syntax. httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) // Just for demonstration, let's check the state of the counter vector // by registering it with a custom registry and then let it collect the // metrics. reg := prometheus.NewRegistry() reg.MustRegister(httpReqs) metricFamilies, err := reg.Gather() if err != nil || len(metricFamilies) != 1 { panic("unexpected behavior of custom test registry") } fmt.Println(toNormalizedJSON(sanitizeMetricFamily(metricFamilies[0]))) // Output: // {"name":"http_requests_total","help":"How many HTTP requests processed, partitioned by status code and HTTP method.","type":"COUNTER","metric":[{"label":[{"name":"code","value":"404"},{"name":"method","value":"POST"}],"counter":{"value":42,"createdTimestamp":"1970-01-01T00:00:10Z"}}]} } func ExampleRegister() { // Imagine you have a worker pool and want to count the tasks completed. taskCounter := prometheus.NewCounter(prometheus.CounterOpts{ Subsystem: "worker_pool", Name: "completed_tasks_total", Help: "Total number of tasks completed.", }) // This will register fine. if err := prometheus.Register(taskCounter); err != nil { fmt.Println(err) } else { fmt.Println("taskCounter registered.") } // Don't forget to tell the HTTP server about the Prometheus handler. // (In a real program, you still need to start the HTTP server...) http.Handle("/metrics", promhttp.Handler()) // Now you can start workers and give every one of them a pointer to // taskCounter and let it increment it whenever it completes a task. taskCounter.Inc() // This has to happen somewhere in the worker code. // But wait, you want to see how individual workers perform. So you need // a vector of counters, with one element for each worker. taskCounterVec := prometheus.NewCounterVec( prometheus.CounterOpts{ Subsystem: "worker_pool", Name: "completed_tasks_total", Help: "Total number of tasks completed.", }, []string{"worker_id"}, ) // Registering will fail because we already have a metric of that name. if err := prometheus.Register(taskCounterVec); err != nil { fmt.Println("taskCounterVec not registered:", err) } else { fmt.Println("taskCounterVec registered.") } // To fix, first unregister the old taskCounter. if prometheus.Unregister(taskCounter) { fmt.Println("taskCounter unregistered.") } // Try registering taskCounterVec again. if err := prometheus.Register(taskCounterVec); err != nil { fmt.Println("taskCounterVec not registered:", err) } else { fmt.Println("taskCounterVec registered.") } // Bummer! Still doesn't work. // Prometheus will not allow you to ever export metrics with // inconsistent help strings or label names. After unregistering, the // unregistered metrics will cease to show up in the /metrics HTTP // response, but the registry still remembers that those metrics had // been exported before. For this example, we will now choose a // different name. (In a real program, you would obviously not export // the obsolete metric in the first place.) taskCounterVec = prometheus.NewCounterVec( prometheus.CounterOpts{ Subsystem: "worker_pool", Name: "completed_tasks_by_id", Help: "Total number of tasks completed.", }, []string{"worker_id"}, ) if err := prometheus.Register(taskCounterVec); err != nil { fmt.Println("taskCounterVec not registered:", err) } else { fmt.Println("taskCounterVec registered.") } // Finally it worked! // The workers have to tell taskCounterVec their id to increment the // right element in the metric vector. taskCounterVec.WithLabelValues("42").Inc() // Code from worker 42. // Each worker could also keep a reference to their own counter element // around. Pick the counter at initialization time of the worker. myCounter := taskCounterVec.WithLabelValues("42") // From worker 42 initialization code. myCounter.Inc() // Somewhere in the code of that worker. // Note that something like WithLabelValues("42", "spurious arg") would // panic (because you have provided too many label values). If you want // to get an error instead, use GetMetricWithLabelValues(...) instead. notMyCounter, err := taskCounterVec.GetMetricWithLabelValues("42", "spurious arg") if err != nil { fmt.Println("Worker initialization failed:", err) } if notMyCounter == nil { fmt.Println("notMyCounter is nil.") } // A different (and somewhat tricky) approach is to use // ConstLabels. ConstLabels are pairs of label names and label values // that never change. Each worker creates and registers an own Counter // instance where the only difference is in the value of the // ConstLabels. Those Counters can all be registered because the // different ConstLabel values guarantee that each worker will increment // a different Counter metric. counterOpts := prometheus.CounterOpts{ Subsystem: "worker_pool", Name: "completed_tasks", Help: "Total number of tasks completed.", ConstLabels: prometheus.Labels{"worker_id": "42"}, } taskCounterForWorker42 := prometheus.NewCounter(counterOpts) if err := prometheus.Register(taskCounterForWorker42); err != nil { fmt.Println("taskCounterVForWorker42 not registered:", err) } else { fmt.Println("taskCounterForWorker42 registered.") } // Obviously, in real code, taskCounterForWorker42 would be a member // variable of a worker struct, and the "42" would be retrieved with a // GetId() method or something. The Counter would be created and // registered in the initialization code of the worker. // For the creation of the next Counter, we can recycle // counterOpts. Just change the ConstLabels. counterOpts.ConstLabels = prometheus.Labels{"worker_id": "2001"} taskCounterForWorker2001 := prometheus.NewCounter(counterOpts) if err := prometheus.Register(taskCounterForWorker2001); err != nil { fmt.Println("taskCounterVForWorker2001 not registered:", err) } else { fmt.Println("taskCounterForWorker2001 registered.") } taskCounterForWorker2001.Inc() taskCounterForWorker42.Inc() taskCounterForWorker2001.Inc() // Yet another approach would be to turn the workers themselves into // Collectors and register them. See the Collector example for details. // Output: // taskCounter registered. // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: {worker_id}} has different label names or a different help string // taskCounter unregistered. // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: {worker_id}} has different label names or a different help string // taskCounterVec registered. // Worker initialization failed: inconsistent label cardinality: expected 1 label values but got 2 in []string{"42", "spurious arg"} // notMyCounter is nil. // taskCounterForWorker42 registered. // taskCounterForWorker2001 registered. } func ExampleSummary() { temps := prometheus.NewSummary(prometheus.SummaryOpts{ Name: "pond_temperature_celsius", Help: "The temperature of the frog pond.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }) // Simulate some observations. for i := 0; i < 1000; i++ { temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) } // Just for demonstration, let's check the state of the summary by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} temps.Write(metric) fmt.Println(toNormalizedJSON(sanitizeMetric(metric))) // Output: // {"summary":{"sampleCount":"1000","sampleSum":29969.50000000001,"quantile":[{"quantile":0.5,"value":31.1},{"quantile":0.9,"value":41.3},{"quantile":0.99,"value":41.9}],"createdTimestamp":"1970-01-01T00:00:10Z"}} } func ExampleSummaryVec() { temps := prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "pond_temperature_celsius", Help: "The temperature of the frog pond.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, []string{"species"}, ) // Simulate some observations. for i := 0; i < 1000; i++ { temps.WithLabelValues("litoria-caerulea").Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) temps.WithLabelValues("lithobates-catesbeianus").Observe(32 + math.Floor(100*math.Cos(float64(i)*0.11))/10) } // Create a Summary without any observations. temps.WithLabelValues("leiopelma-hochstetteri") // Just for demonstration, let's check the state of the summary vector // by registering it with a custom registry and then let it collect the // metrics. reg := prometheus.NewRegistry() reg.MustRegister(temps) metricFamilies, err := reg.Gather() if err != nil || len(metricFamilies) != 1 { panic("unexpected behavior of custom test registry") } fmt.Println(toNormalizedJSON(sanitizeMetricFamily(metricFamilies[0]))) // Output: // {"name":"pond_temperature_celsius","help":"The temperature of the frog pond.","type":"SUMMARY","metric":[{"label":[{"name":"species","value":"leiopelma-hochstetteri"}],"summary":{"sampleCount":"0","sampleSum":0,"quantile":[{"quantile":0.5,"value":"NaN"},{"quantile":0.9,"value":"NaN"},{"quantile":0.99,"value":"NaN"}],"createdTimestamp":"1970-01-01T00:00:10Z"}},{"label":[{"name":"species","value":"lithobates-catesbeianus"}],"summary":{"sampleCount":"1000","sampleSum":31956.100000000017,"quantile":[{"quantile":0.5,"value":32.4},{"quantile":0.9,"value":41.4},{"quantile":0.99,"value":41.9}],"createdTimestamp":"1970-01-01T00:00:10Z"}},{"label":[{"name":"species","value":"litoria-caerulea"}],"summary":{"sampleCount":"1000","sampleSum":29969.50000000001,"quantile":[{"quantile":0.5,"value":31.1},{"quantile":0.9,"value":41.3},{"quantile":0.99,"value":41.9}],"createdTimestamp":"1970-01-01T00:00:10Z"}}]} } func ExampleNewConstSummary() { desc := prometheus.NewDesc( "http_request_duration_seconds", "A summary of the HTTP request durations.", []string{"code", "method"}, prometheus.Labels{"owner": "example"}, ) // Create a constant summary from values we got from a 3rd party telemetry system. s := prometheus.MustNewConstSummary( desc, 4711, 403.34, map[float64]float64{0.5: 42.3, 0.9: 323.3}, "200", "get", ) // Just for demonstration, let's check the state of the summary by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} s.Write(metric) fmt.Println(toNormalizedJSON(metric)) // Output: // {"label":[{"name":"code","value":"200"},{"name":"method","value":"get"},{"name":"owner","value":"example"}],"summary":{"sampleCount":"4711","sampleSum":403.34,"quantile":[{"quantile":0.5,"value":42.3},{"quantile":0.9,"value":323.3}]}} } func ExampleHistogram() { temps := prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "pond_temperature_celsius", Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. }) // Simulate some observations. for i := 0; i < 1000; i++ { temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) } // Just for demonstration, let's check the state of the histogram by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} temps.Write(metric) fmt.Println(toNormalizedJSON(sanitizeMetric(metric))) // Output: // {"histogram":{"sampleCount":"1000","sampleSum":29969.50000000001,"bucket":[{"cumulativeCount":"192","upperBound":20},{"cumulativeCount":"366","upperBound":25},{"cumulativeCount":"501","upperBound":30},{"cumulativeCount":"638","upperBound":35},{"cumulativeCount":"816","upperBound":40}],"createdTimestamp":"1970-01-01T00:00:10Z"}} } func ExampleNewConstHistogram() { desc := prometheus.NewDesc( "http_request_duration_seconds", "A histogram of the HTTP request durations.", []string{"code", "method"}, prometheus.Labels{"owner": "example"}, ) // Create a constant histogram from values we got from a 3rd party telemetry system. h := prometheus.MustNewConstHistogram( desc, 4711, 403.34, map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, "200", "get", ) // Just for demonstration, let's check the state of the histogram by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} h.Write(metric) fmt.Println(toNormalizedJSON(metric)) // Output: // {"label":[{"name":"code","value":"200"},{"name":"method","value":"get"},{"name":"owner","value":"example"}],"histogram":{"sampleCount":"4711","sampleSum":403.34,"bucket":[{"cumulativeCount":"121","upperBound":25},{"cumulativeCount":"2403","upperBound":50},{"cumulativeCount":"3221","upperBound":100},{"cumulativeCount":"4233","upperBound":200}]}} } func ExampleNewConstHistogram_WithExemplar() { desc := prometheus.NewDesc( "http_request_duration_seconds", "A histogram of the HTTP request durations.", []string{"code", "method"}, prometheus.Labels{"owner": "example"}, ) // Create a constant histogram from values we got from a 3rd party telemetry system. h := prometheus.MustNewConstHistogram( desc, 4711, 403.34, map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, "200", "get", ) // Wrap const histogram with exemplars for each bucket. exemplarTs, _ := time.Parse(time.RFC850, "Monday, 02-Jan-06 15:04:05 GMT") exemplarLabels := prometheus.Labels{"testName": "testVal"} h = prometheus.MustNewMetricWithExemplars( h, prometheus.Exemplar{Labels: exemplarLabels, Timestamp: exemplarTs, Value: 24.0}, prometheus.Exemplar{Labels: exemplarLabels, Timestamp: exemplarTs, Value: 42.0}, prometheus.Exemplar{Labels: exemplarLabels, Timestamp: exemplarTs, Value: 89.0}, prometheus.Exemplar{Labels: exemplarLabels, Timestamp: exemplarTs, Value: 157.0}, ) // Just for demonstration, let's check the state of the histogram by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} h.Write(metric) fmt.Println(toNormalizedJSON(metric)) // Output: // {"label":[{"name":"code","value":"200"},{"name":"method","value":"get"},{"name":"owner","value":"example"}],"histogram":{"sampleCount":"4711","sampleSum":403.34,"bucket":[{"cumulativeCount":"121","upperBound":25,"exemplar":{"label":[{"name":"testName","value":"testVal"}],"value":24,"timestamp":"2006-01-02T15:04:05Z"}},{"cumulativeCount":"2403","upperBound":50,"exemplar":{"label":[{"name":"testName","value":"testVal"}],"value":42,"timestamp":"2006-01-02T15:04:05Z"}},{"cumulativeCount":"3221","upperBound":100,"exemplar":{"label":[{"name":"testName","value":"testVal"}],"value":89,"timestamp":"2006-01-02T15:04:05Z"}},{"cumulativeCount":"4233","upperBound":200,"exemplar":{"label":[{"name":"testName","value":"testVal"}],"value":157,"timestamp":"2006-01-02T15:04:05Z"}}]}} } func ExampleAlreadyRegisteredError() { reqCounter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "requests_total", Help: "The total number of requests served.", }) if err := prometheus.Register(reqCounter); err != nil { are := &prometheus.AlreadyRegisteredError{} if errors.As(err, are) { // A counter for that metric has been registered before. // Use the old counter from now on. reqCounter = are.ExistingCollector.(prometheus.Counter) } else { // Something else went wrong! panic(err) } } reqCounter.Inc() } func ExampleGatherers() { reg := prometheus.NewRegistry() temp := prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "temperature_kelvin", Help: "Temperature in Kelvin.", }, []string{"location"}, ) reg.MustRegister(temp) temp.WithLabelValues("outside").Set(273.14) temp.WithLabelValues("inside").Set(298.44) var parser expfmt.TextParser text := ` # TYPE humidity_percent gauge # HELP humidity_percent Humidity in %. humidity_percent{location="outside"} 45.4 humidity_percent{location="inside"} 33.2 # TYPE temperature_kelvin gauge # HELP temperature_kelvin Temperature in Kelvin. temperature_kelvin{location="somewhere else"} 4.5 ` parseText := func() ([]*dto.MetricFamily, error) { parsed, err := parser.TextToMetricFamilies(strings.NewReader(text)) if err != nil { return nil, err } var result []*dto.MetricFamily for _, mf := range parsed { result = append(result, mf) } return result, nil } gatherers := prometheus.Gatherers{ reg, prometheus.GathererFunc(parseText), } gathering, err := gatherers.Gather() if err != nil { fmt.Println(err) } out := &bytes.Buffer{} for _, mf := range gathering { if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { panic(err) } } fmt.Print(out.String()) fmt.Println("----------") // Note how the temperature_kelvin metric family has been merged from // different sources. Now try text = ` # TYPE humidity_percent gauge # HELP humidity_percent Humidity in %. humidity_percent{location="outside"} 45.4 humidity_percent{location="inside"} 33.2 # TYPE temperature_kelvin gauge # HELP temperature_kelvin Temperature in Kelvin. # Duplicate metric: temperature_kelvin{location="outside"} 265.3 # Missing location label (note that this is undesirable but valid): temperature_kelvin 4.5 ` gathering, err = gatherers.Gather() if err != nil { // We expect error collected metric "temperature_kelvin" { label: gauge: } was collected before with the same name and label values // We cannot assert it because of https://github.com/golang/protobuf/issues/1121 if strings.HasPrefix(err.Error(), `collected metric "temperature_kelvin" `) { fmt.Println("Found duplicated metric `temperature_kelvin`") } else { fmt.Print(err) } } // Note that still as many metrics as possible are returned: out.Reset() for _, mf := range gathering { if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { panic(err) } } fmt.Print(out.String()) // Output: // # HELP humidity_percent Humidity in %. // # TYPE humidity_percent gauge // humidity_percent{location="inside"} 33.2 // humidity_percent{location="outside"} 45.4 // # HELP temperature_kelvin Temperature in Kelvin. // # TYPE temperature_kelvin gauge // temperature_kelvin{location="inside"} 298.44 // temperature_kelvin{location="outside"} 273.14 // temperature_kelvin{location="somewhere else"} 4.5 // ---------- // Found duplicated metric `temperature_kelvin` // # HELP humidity_percent Humidity in %. // # TYPE humidity_percent gauge // humidity_percent{location="inside"} 33.2 // humidity_percent{location="outside"} 45.4 // # HELP temperature_kelvin Temperature in Kelvin. // # TYPE temperature_kelvin gauge // temperature_kelvin 4.5 // temperature_kelvin{location="inside"} 298.44 // temperature_kelvin{location="outside"} 273.14 } func ExampleNewMetricWithTimestamp() { desc := prometheus.NewDesc( "temperature_kelvin", "Current temperature in Kelvin.", nil, nil, ) // Create a constant gauge from values we got from an external // temperature reporting system. Those values are reported with a slight // delay, so we want to add the timestamp of the actual measurement. temperatureReportedByExternalSystem := 298.15 timeReportedByExternalSystem := time.Date(2009, time.November, 10, 23, 0, 0, 12345678, time.UTC) s := prometheus.NewMetricWithTimestamp( timeReportedByExternalSystem, prometheus.MustNewConstMetric( desc, prometheus.GaugeValue, temperatureReportedByExternalSystem, ), ) // Just for demonstration, let's check the state of the gauge by // (ab)using its Write method (which is usually only used by Prometheus // internally). metric := &dto.Metric{} s.Write(metric) fmt.Println(toNormalizedJSON(metric)) // Output: // {"gauge":{"value":298.15},"timestampMs":"1257894000012"} } func ExampleNewConstMetricWithCreatedTimestamp() { // Here we have a metric that is reported by an external system. // Besides providing the value, the external system also provides the // timestamp when the metric was created. desc := prometheus.NewDesc( "time_since_epoch_seconds", "Current epoch time in seconds.", nil, nil, ) timeSinceEpochReportedByExternalSystem := time.Date(2009, time.November, 10, 23, 0, 0, 12345678, time.UTC) epoch := time.Unix(0, 0).UTC() s := prometheus.MustNewConstMetricWithCreatedTimestamp( desc, prometheus.CounterValue, float64(timeSinceEpochReportedByExternalSystem.Unix()), epoch, ) metric := &dto.Metric{} s.Write(metric) fmt.Println(toNormalizedJSON(metric)) // Output: // {"counter":{"value":1257894000,"createdTimestamp":"1970-01-01T00:00:00Z"}} } client_golang-1.19.1/prometheus/expvar_collector.go000066400000000000000000000043351461713521000225120ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "encoding/json" "expvar" ) type expvarCollector struct { exports map[string]*Desc } // NewExpvarCollector is the obsolete version of collectors.NewExpvarCollector. // See there for documentation. // // Deprecated: Use collectors.NewExpvarCollector instead. func NewExpvarCollector(exports map[string]*Desc) Collector { return &expvarCollector{ exports: exports, } } // Describe implements Collector. func (e *expvarCollector) Describe(ch chan<- *Desc) { for _, desc := range e.exports { ch <- desc } } // Collect implements Collector. func (e *expvarCollector) Collect(ch chan<- Metric) { for name, desc := range e.exports { var m Metric expVar := expvar.Get(name) if expVar == nil { continue } var v interface{} labels := make([]string, len(desc.variableLabels.names)) if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { ch <- NewInvalidMetric(desc, err) continue } var processValue func(v interface{}, i int) processValue = func(v interface{}, i int) { if i >= len(labels) { copiedLabels := append(make([]string, 0, len(labels)), labels...) switch v := v.(type) { case float64: m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) case bool: if v { m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) } else { m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) } default: return } ch <- m return } vm, ok := v.(map[string]interface{}) if !ok { return } for lv, val := range vm { labels[i] = lv processValue(val, i+1) } } processValue(v, 0) } } client_golang-1.19.1/prometheus/expvar_collector_test.go000066400000000000000000000064521461713521000235530ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "expvar" "fmt" "sort" "strings" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus" ) func ExampleNewExpvarCollector() { expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ "memstats": prometheus.NewDesc( "expvar_memstats", "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", []string{"type"}, nil, ), "lone-int": prometheus.NewDesc( "expvar_lone_int", "Just an expvar int as an example.", nil, nil, ), "http-request-map": prometheus.NewDesc( "expvar_http_request_total", "How many http requests processed, partitioned by status code and http method.", []string{"code", "method"}, nil, ), }) prometheus.MustRegister(expvarCollector) // The Prometheus part is done here. But to show that this example is // doing anything, we have to manually export something via expvar. In // real-life use-cases, some library would already have exported via // expvar what we want to re-export as Prometheus metrics. expvar.NewInt("lone-int").Set(42) expvarMap := expvar.NewMap("http-request-map") var ( expvarMap1, expvarMap2 expvar.Map expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int ) expvarMap1.Init() expvarMap2.Init() expvarInt11.Set(3) expvarInt12.Set(13) expvarInt21.Set(11) expvarInt22.Set(212) expvarMap1.Set("POST", &expvarInt11) expvarMap1.Set("GET", &expvarInt12) expvarMap2.Set("POST", &expvarInt21) expvarMap2.Set("GET", &expvarInt22) expvarMap.Set("404", &expvarMap1) expvarMap.Set("200", &expvarMap2) // Results in the following expvar map: // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} // Let's see what the scrape would yield, but exclude the memstats metrics. metricStrings := []string{} metric := dto.Metric{} metricChan := make(chan prometheus.Metric) go func() { expvarCollector.Collect(metricChan) close(metricChan) }() for m := range metricChan { if !strings.Contains(m.Desc().String(), "expvar_memstats") { metric.Reset() m.Write(&metric) metricStrings = append(metricStrings, toNormalizedJSON(&metric)) } } sort.Strings(metricStrings) for _, s := range metricStrings { fmt.Println(s) } // Output: // {"label":[{"name":"code","value":"200"},{"name":"method","value":"GET"}],"untyped":{"value":212}} // {"label":[{"name":"code","value":"200"},{"name":"method","value":"POST"}],"untyped":{"value":11}} // {"label":[{"name":"code","value":"404"},{"name":"method","value":"GET"}],"untyped":{"value":13}} // {"label":[{"name":"code","value":"404"},{"name":"method","value":"POST"}],"untyped":{"value":3}} // {"untyped":{"value":42}} } client_golang-1.19.1/prometheus/fnv.go000066400000000000000000000022551461713521000177270ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus // Inline and byte-free variant of hash/fnv's fnv64a. const ( offset64 = 14695981039346656037 prime64 = 1099511628211 ) // hashNew initializies a new fnv64a hash value. func hashNew() uint64 { return offset64 } // hashAdd adds a string to a fnv64a hash value, returning the updated hash. func hashAdd(h uint64, s string) uint64 { for i := 0; i < len(s); i++ { h ^= uint64(s[i]) h *= prime64 } return h } // hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. func hashAddByte(h uint64, b byte) uint64 { h ^= uint64(b) h *= prime64 return h } client_golang-1.19.1/prometheus/gauge.go000066400000000000000000000250411461713521000202240ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "math" "sync/atomic" "time" dto "github.com/prometheus/client_model/go" ) // Gauge is a Metric that represents a single numerical value that can // arbitrarily go up and down. // // A Gauge is typically used for measured values like temperatures or current // memory usage, but also "counts" that can go up and down, like the number of // running goroutines. // // To create Gauge instances, use NewGauge. type Gauge interface { Metric Collector // Set sets the Gauge to an arbitrary value. Set(float64) // Inc increments the Gauge by 1. Use Add to increment it by arbitrary // values. Inc() // Dec decrements the Gauge by 1. Use Sub to decrement it by arbitrary // values. Dec() // Add adds the given value to the Gauge. (The value can be negative, // resulting in a decrease of the Gauge.) Add(float64) // Sub subtracts the given value from the Gauge. (The value can be // negative, resulting in an increase of the Gauge.) Sub(float64) // SetToCurrentTime sets the Gauge to the current Unix time in seconds. SetToCurrentTime() } // GaugeOpts is an alias for Opts. See there for doc comments. type GaugeOpts Opts // GaugeVecOpts bundles the options to create a GaugeVec metric. // It is mandatory to set GaugeOpts, see there for mandatory fields. VariableLabels // is optional and can safely be left to its default value. type GaugeVecOpts struct { GaugeOpts // VariableLabels are used to partition the metric vector by the given set // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } // NewGauge creates a new Gauge based on the provided GaugeOpts. // // The returned implementation is optimized for a fast Set method. If you have a // choice for managing the value of a Gauge via Set vs. Inc/Dec/Add/Sub, pick // the former. For example, the Inc method of the returned Gauge is slower than // the Inc method of a Counter returned by NewCounter. This matches the typical // scenarios for Gauges and Counters, where the former tends to be Set-heavy and // the latter Inc-heavy. func NewGauge(opts GaugeOpts) Gauge { desc := NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ) result := &gauge{desc: desc, labelPairs: desc.constLabelPairs} result.init(result) // Init self-collection. return result } type gauge struct { // valBits contains the bits of the represented float64 value. It has // to go first in the struct to guarantee alignment for atomic // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG valBits uint64 selfCollector desc *Desc labelPairs []*dto.LabelPair } func (g *gauge) Desc() *Desc { return g.desc } func (g *gauge) Set(val float64) { atomic.StoreUint64(&g.valBits, math.Float64bits(val)) } func (g *gauge) SetToCurrentTime() { g.Set(float64(time.Now().UnixNano()) / 1e9) } func (g *gauge) Inc() { g.Add(1) } func (g *gauge) Dec() { g.Add(-1) } func (g *gauge) Add(val float64) { for { oldBits := atomic.LoadUint64(&g.valBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + val) if atomic.CompareAndSwapUint64(&g.valBits, oldBits, newBits) { return } } } func (g *gauge) Sub(val float64) { g.Add(val * -1) } func (g *gauge) Write(out *dto.Metric) error { val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) return populateMetric(GaugeValue, val, g.labelPairs, nil, out, nil) } // GaugeVec is a Collector that bundles a set of Gauges that all share the same // Desc, but have different values for their variable labels. This is used if // you want to count the same thing partitioned by various dimensions // (e.g. number of operations queued, partitioned by user and operation // type). Create instances with NewGaugeVec. type GaugeVec struct { *MetricVec } // NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and // partitioned by the given label names. func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { return V2.NewGaugeVec(GaugeVecOpts{ GaugeOpts: opts, VariableLabels: UnconstrainedLabels(labelNames), }) } // NewGaugeVec creates a new GaugeVec based on the provided GaugeVecOpts. func (v2) NewGaugeVec(opts GaugeVecOpts) *GaugeVec { desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, opts.VariableLabels, opts.ConstLabels, ) return &GaugeVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels.names) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. return result }), } } // GetMetricWithLabelValues returns the Gauge for the given slice of label // values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Gauge is created. // // It is possible to call this method without using the returned Gauge to only // create the new Gauge but leave it at its starting value 0. See also the // SummaryVec example. // // Keeping the Gauge for later use is possible (and should be considered if // performance is critical), but keep in mind that Reset, DeleteLabelValues and // Delete can be used to delete the Gauge from the GaugeVec. In that case, the // Gauge will still exist, but it will not be exported anymore, even if a // Gauge with the same label values is created later. See also the CounterVec // example. // // An error is returned if the number of label values is not the same as the // number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as // an alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Gauge), err } return nil, err } // GetMetricWith returns the Gauge for the given Labels map (the label names // must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Gauge is created. Implications of // creating a Gauge without using it and keeping the Gauge for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent // with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Gauge), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where // GetMetricWithLabelValues would have returned an error. Not returning an // error allows shortcuts like // // myVec.WithLabelValues("404", "GET").Add(42) func (v *GaugeVec) WithLabelValues(lvs ...string) Gauge { g, err := v.GetMetricWithLabelValues(lvs...) if err != nil { panic(err) } return g } // With works as GetMetricWith, but panics where GetMetricWithLabels would have // returned an error. Not returning an error allows shortcuts like // // myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) func (v *GaugeVec) With(labels Labels) Gauge { g, err := v.GetMetricWith(labels) if err != nil { panic(err) } return g } // CurryWith returns a vector curried with the provided labels, i.e. the // returned vector has those labels pre-set for all labeled operations performed // on it. The cardinality of the curried vector is reduced accordingly. The // order of the remaining labels stays the same (just with the curried labels // taken out of the sequence – which is relevant for the // (GetMetric)WithLabelValues methods). It is possible to curry a curried // vector, but only with labels not yet used for currying before. // // The metrics contained in the GaugeVec are shared between the curried and // uncurried vectors. They are just accessed differently. Curried and uncurried // vectors behave identically in terms of collection. Only one must be // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) { vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &GaugeVec{vec}, err } return nil, err } // MustCurryWith works as CurryWith but panics where CurryWith would have // returned an error. func (v *GaugeVec) MustCurryWith(labels Labels) *GaugeVec { vec, err := v.CurryWith(labels) if err != nil { panic(err) } return vec } // GaugeFunc is a Gauge whose value is determined at collect time by calling a // provided function. // // To create GaugeFunc instances, use NewGaugeFunc. type GaugeFunc interface { Metric Collector } // NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The // value reported is determined by calling the given function from within the // Write method. Take into account that metric collection may happen // concurrently. Therefore, it must be safe to call the provided function // concurrently. // // NewGaugeFunc is a good way to create an “info” style metric with a constant // value of 1. Example: // https://github.com/prometheus/common/blob/8558a5b7db3c84fa38b4766966059a7bd5bfa2ee/version/info.go#L36-L56 func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { return newValueFunc(NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ), GaugeValue, function) } client_golang-1.19.1/prometheus/gauge_test.go000066400000000000000000000115271461713521000212670ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "math" "math/rand" "sync" "testing" "testing/quick" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) func listenGaugeStream(vals, result chan float64, done chan struct{}) { var sum float64 outer: for { select { case <-done: close(vals) for v := range vals { sum += v } break outer case v := <-vals: sum += v } } result <- sum close(result) } func TestGaugeConcurrency(t *testing.T) { it := func(n uint32) bool { mutations := int(n % 10000) concLevel := int(n%15 + 1) var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) sStream := make(chan float64, mutations*concLevel) result := make(chan float64) done := make(chan struct{}) go listenGaugeStream(sStream, result, done) go func() { end.Wait() close(done) }() gge := NewGauge(GaugeOpts{ Name: "test_gauge", Help: "no help can be found here", }) for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) for j := 0; j < mutations; j++ { vals[j] = rand.Float64() - 0.5 } go func(vals []float64) { start.Wait() for _, v := range vals { sStream <- v gge.Add(v) } end.Done() }(vals) } start.Done() if expected, got := <-result, math.Float64frombits(gge.(*gauge).valBits); math.Abs(expected-got) > 0.000001 { t.Fatalf("expected approx. %f, got %f", expected, got) return false } return true } if err := quick.Check(it, nil); err != nil { t.Fatal(err) } } func TestGaugeVecConcurrency(t *testing.T) { it := func(n uint32) bool { mutations := int(n % 10000) concLevel := int(n%15 + 1) vecLength := int(n%5 + 1) var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) sStreams := make([]chan float64, vecLength) results := make([]chan float64, vecLength) done := make(chan struct{}) for i := 0; i < vecLength; i++ { sStreams[i] = make(chan float64, mutations*concLevel) results[i] = make(chan float64) go listenGaugeStream(sStreams[i], results[i], done) } go func() { end.Wait() close(done) }() gge := NewGaugeVec( GaugeOpts{ Name: "test_gauge", Help: "no help can be found here", }, []string{"label"}, ) for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) pick := make([]int, mutations) for j := 0; j < mutations; j++ { vals[j] = rand.Float64() - 0.5 pick[j] = rand.Intn(vecLength) } go func(vals []float64) { start.Wait() for i, v := range vals { sStreams[pick[i]] <- v gge.WithLabelValues(string('A' + rune(pick[i]))).Add(v) } end.Done() }(vals) } start.Done() for i := range sStreams { if expected, got := <-results[i], math.Float64frombits(gge.WithLabelValues(string('A'+rune(i))).(*gauge).valBits); math.Abs(expected-got) > 0.000001 { t.Fatalf("expected approx. %f, got %f", expected, got) return false } } return true } if err := quick.Check(it, nil); err != nil { t.Fatal(err) } } func TestGaugeFunc(t *testing.T) { gf := NewGaugeFunc( GaugeOpts{ Name: "test_name", Help: "test help", ConstLabels: Labels{"a": "1", "b": "2"}, }, func() float64 { return 3.1415 }, ) if expected, got := `Desc{fqName: "test_name", help: "test help", constLabels: {a="1",b="2"}, variableLabels: {}}`, gf.Desc().String(); expected != got { t.Errorf("expected %q, got %q", expected, got) } m := &dto.Metric{} gf.Write(m) expected := &dto.Metric{ Label: []*dto.LabelPair{ {Name: proto.String("a"), Value: proto.String("1")}, {Name: proto.String("b"), Value: proto.String("2")}, }, Gauge: &dto.Gauge{ Value: proto.Float64(3.1415), }, } if !proto.Equal(expected, m) { t.Errorf("expected %q, got %q", expected, m) } } func TestGaugeSetCurrentTime(t *testing.T) { g := NewGauge(GaugeOpts{ Name: "test_name", Help: "test help", }) g.SetToCurrentTime() unixTime := float64(time.Now().Unix()) m := &dto.Metric{} g.Write(m) delta := unixTime - m.GetGauge().GetValue() // This is just a smoke test to make sure SetToCurrentTime is not // totally off. Tests with current time involved are hard... if math.Abs(delta) > 5 { t.Errorf("Gauge set to current time deviates from current time by more than 5s, delta is %f seconds", delta) } } client_golang-1.19.1/prometheus/gen_go_collector_metrics_set.go000066400000000000000000000116231461713521000250420ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build ignore // +build ignore package main import ( "bytes" "fmt" "go/format" "log" "math" "os" "runtime" "runtime/metrics" "strings" "text/template" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/internal" version "github.com/hashicorp/go-version" ) func main() { var givenVersion string toolVersion := runtime.Version() if len(os.Args) != 2 { log.Printf("requires Go version (e.g. go1.17) as an argument. Since it is not specified, assuming %s.", toolVersion) givenVersion = toolVersion } else { givenVersion = os.Args[1] } log.Printf("given version for Go: %s", givenVersion) log.Printf("tool version for Go: %s", toolVersion) tv, err := version.NewVersion(strings.TrimPrefix(givenVersion, "go")) if err != nil { log.Fatal(err) } toolVersion = strings.Split(strings.TrimPrefix(toolVersion, "go"), " ")[0] gv, err := version.NewVersion(toolVersion) if err != nil { log.Fatal(err) } if !gv.Equal(tv) { log.Fatalf("using Go version %q but expected Go version %q", tv, gv) } v := goVersion(gv.Segments()[1]) log.Printf("generating metrics for Go version %q", v) // Generate code. var buf bytes.Buffer err = testFile.Execute(&buf, struct { Descriptions []metrics.Description GoVersion goVersion Cardinality int }{ Descriptions: metrics.All(), GoVersion: v, Cardinality: rmCardinality(), }) if err != nil { log.Fatalf("executing template: %v", err) } // Format it. result, err := format.Source(buf.Bytes()) if err != nil { log.Fatalf("formatting code: %v", err) } // Write it to a file. fname := fmt.Sprintf("go_collector_metrics_%s_test.go", v.Abbr()) if err := os.WriteFile(fname, result, 0o644); err != nil { log.Fatalf("writing file: %v", err) } } type goVersion int func (g goVersion) String() string { return fmt.Sprintf("go1.%d", g) } func (g goVersion) Abbr() string { return fmt.Sprintf("go1%d", g) } func rmCardinality() int { cardinality := 0 // Collect all histogram samples so that we can get their buckets. // The API guarantees that the buckets are always fixed for the lifetime // of the process. var histograms []metrics.Sample for _, d := range metrics.All() { if d.Kind == metrics.KindFloat64Histogram { histograms = append(histograms, metrics.Sample{Name: d.Name}) } else { cardinality++ } } // Handle histograms. metrics.Read(histograms) for i := range histograms { name := histograms[i].Name buckets := internal.RuntimeMetricsBucketsForUnit( histograms[i].Value.Float64Histogram().Buckets, name[strings.IndexRune(name, ':')+1:], ) cardinality += len(buckets) + 3 // Plus total count, sum, and the implicit infinity bucket. // runtime/metrics bucket boundaries are lower-bound-inclusive, but // always represents each actual *boundary* so Buckets is always // 1 longer than Counts, while in Prometheus the mapping is one-to-one, // as the bottom bucket extends to -Inf, and the top infinity bucket is // implicit. Therefore, we should have one fewer bucket than is listed // above. cardinality-- if buckets[len(buckets)-1] == math.Inf(1) { // We already counted the infinity bucket separately. cardinality-- } // Prometheus also doesn't have buckets for -Inf, so they need to be omitted. // See the following PR for more information: // https://github.com/prometheus/client_golang/pull/1049 if buckets[0] == math.Inf(-1) { cardinality-- } } return cardinality } var testFile = template.Must(template.New("testFile").Funcs(map[string]interface{}{ "rm2prom": func(d metrics.Description) string { ns, ss, n, ok := internal.RuntimeMetricsToProm(&d) if !ok { return "" } return prometheus.BuildFQName(ns, ss, n) }, "nextVersion": func(version goVersion) string { return (version + goVersion(1)).String() }, }).Parse(`// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go {{.GoVersion}} //go:build {{.GoVersion}} && !{{nextVersion .GoVersion}} // +build {{.GoVersion}},!{{nextVersion .GoVersion}} package prometheus var expectedRuntimeMetrics = map[string]string{ {{- range .Descriptions -}} {{- $trans := rm2prom . -}} {{- if ne $trans "" }} {{.Name | printf "%q"}}: {{$trans | printf "%q"}}, {{- end -}} {{end}} } const expectedRuntimeMetricsCardinality = {{.Cardinality}} `)) client_golang-1.19.1/prometheus/get_pid.go000066400000000000000000000014141461713521000205450ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !js || wasm // +build !js wasm package prometheus import "os" func getPIDFn() func() (int, error) { pid := os.Getpid() return func() (int, error) { return pid, nil } } client_golang-1.19.1/prometheus/get_pid_gopherjs.go000066400000000000000000000013511461713521000224460ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build js && !wasm // +build js,!wasm package prometheus func getPIDFn() func() (int, error) { return func() (int, error) { return 1, nil } } client_golang-1.19.1/prometheus/go_collector.go000066400000000000000000000205771461713521000216200ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "runtime" "runtime/debug" "time" ) // goRuntimeMemStats provides the metrics initially provided by runtime.ReadMemStats. // From Go 1.17 those similar (and better) statistics are provided by runtime/metrics, so // while eval closure works on runtime.MemStats, the struct from Go 1.17+ is // populated using runtime/metrics. func goRuntimeMemStats() memStatsMetrics { return memStatsMetrics{ { desc: NewDesc( memstatNamespace("alloc_bytes"), "Number of bytes allocated and still in use.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("alloc_bytes_total"), "Total number of bytes allocated, even if freed.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, valType: CounterValue, }, { desc: NewDesc( memstatNamespace("sys_bytes"), "Number of bytes obtained from system.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("lookups_total"), "Total number of pointer lookups.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, valType: CounterValue, }, { desc: NewDesc( memstatNamespace("mallocs_total"), "Total number of mallocs.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, valType: CounterValue, }, { desc: NewDesc( memstatNamespace("frees_total"), "Total number of frees.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, valType: CounterValue, }, { desc: NewDesc( memstatNamespace("heap_alloc_bytes"), "Number of heap bytes allocated and still in use.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("heap_sys_bytes"), "Number of heap bytes obtained from system.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("heap_idle_bytes"), "Number of heap bytes waiting to be used.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("heap_inuse_bytes"), "Number of heap bytes that are in use.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("heap_released_bytes"), "Number of heap bytes released to OS.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("heap_objects"), "Number of allocated objects.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("stack_inuse_bytes"), "Number of bytes in use by the stack allocator.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("stack_sys_bytes"), "Number of bytes obtained from system for stack allocator.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("mspan_inuse_bytes"), "Number of bytes in use by mspan structures.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("mspan_sys_bytes"), "Number of bytes used for mspan structures obtained from system.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("mcache_inuse_bytes"), "Number of bytes in use by mcache structures.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("mcache_sys_bytes"), "Number of bytes used for mcache structures obtained from system.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("buck_hash_sys_bytes"), "Number of bytes used by the profiling bucket hash table.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("gc_sys_bytes"), "Number of bytes used for garbage collection system metadata.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("other_sys_bytes"), "Number of bytes used for other system allocations.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, valType: GaugeValue, }, { desc: NewDesc( memstatNamespace("next_gc_bytes"), "Number of heap bytes when next garbage collection will take place.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, valType: GaugeValue, }, } } type baseGoCollector struct { goroutinesDesc *Desc threadsDesc *Desc gcDesc *Desc gcLastTimeDesc *Desc goInfoDesc *Desc } func newBaseGoCollector() baseGoCollector { return baseGoCollector{ goroutinesDesc: NewDesc( "go_goroutines", "Number of goroutines that currently exist.", nil, nil), threadsDesc: NewDesc( "go_threads", "Number of OS threads created.", nil, nil), gcDesc: NewDesc( "go_gc_duration_seconds", "A summary of the pause duration of garbage collection cycles.", nil, nil), gcLastTimeDesc: NewDesc( "go_memstats_last_gc_time_seconds", "Number of seconds since 1970 of last garbage collection.", nil, nil), goInfoDesc: NewDesc( "go_info", "Information about the Go environment.", nil, Labels{"version": runtime.Version()}), } } // Describe returns all descriptions of the collector. func (c *baseGoCollector) Describe(ch chan<- *Desc) { ch <- c.goroutinesDesc ch <- c.threadsDesc ch <- c.gcDesc ch <- c.gcLastTimeDesc ch <- c.goInfoDesc } // Collect returns the current state of all metrics of the collector. func (c *baseGoCollector) Collect(ch chan<- Metric) { ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) n := getRuntimeNumThreads() ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, n) var stats debug.GCStats stats.PauseQuantiles = make([]time.Duration, 5) debug.ReadGCStats(&stats) quantiles := make(map[float64]float64) for idx, pq := range stats.PauseQuantiles[1:] { quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() } quantiles[0.0] = stats.PauseQuantiles[0].Seconds() ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), stats.PauseTotal.Seconds(), quantiles) ch <- MustNewConstMetric(c.gcLastTimeDesc, GaugeValue, float64(stats.LastGC.UnixNano())/1e9) ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) } func memstatNamespace(s string) string { return "go_memstats_" + s } // memStatsMetrics provide description, evaluator, runtime/metrics name, and // value type for memstat metrics. type memStatsMetrics []struct { desc *Desc eval func(*runtime.MemStats) float64 valType ValueType } client_golang-1.19.1/prometheus/go_collector_go116.go000066400000000000000000000071351461713521000225300ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !go1.17 // +build !go1.17 package prometheus import ( "runtime" "sync" "time" ) type goCollector struct { base baseGoCollector // ms... are memstats related. msLast *runtime.MemStats // Previously collected memstats. msLastTimestamp time.Time msMtx sync.Mutex // Protects msLast and msLastTimestamp. msMetrics memStatsMetrics msRead func(*runtime.MemStats) // For mocking in tests. msMaxWait time.Duration // Wait time for fresh memstats. msMaxAge time.Duration // Maximum allowed age of old memstats. } // NewGoCollector is the obsolete version of collectors.NewGoCollector. // See there for documentation. // // Deprecated: Use collectors.NewGoCollector instead. func NewGoCollector() Collector { msMetrics := goRuntimeMemStats() msMetrics = append(msMetrics, struct { desc *Desc eval func(*runtime.MemStats) float64 valType ValueType }{ // This metric is omitted in Go1.17+, see https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 desc: NewDesc( memstatNamespace("gc_cpu_fraction"), "The fraction of this program's available CPU time used by the GC since the program started.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, valType: GaugeValue, }) return &goCollector{ base: newBaseGoCollector(), msLast: &runtime.MemStats{}, msRead: runtime.ReadMemStats, msMaxWait: time.Second, msMaxAge: 5 * time.Minute, msMetrics: msMetrics, } } // Describe returns all descriptions of the collector. func (c *goCollector) Describe(ch chan<- *Desc) { c.base.Describe(ch) for _, i := range c.msMetrics { ch <- i.desc } } // Collect returns the current state of all metrics of the collector. func (c *goCollector) Collect(ch chan<- Metric) { var ( ms = &runtime.MemStats{} done = make(chan struct{}) ) // Start reading memstats first as it might take a while. go func() { c.msRead(ms) c.msMtx.Lock() c.msLast = ms c.msLastTimestamp = time.Now() c.msMtx.Unlock() close(done) }() // Collect base non-memory metrics. c.base.Collect(ch) timer := time.NewTimer(c.msMaxWait) select { case <-done: // Our own ReadMemStats succeeded in time. Use it. timer.Stop() // Important for high collection frequencies to not pile up timers. c.msCollect(ch, ms) return case <-timer.C: // Time out, use last memstats if possible. Continue below. } c.msMtx.Lock() if time.Since(c.msLastTimestamp) < c.msMaxAge { // Last memstats are recent enough. Collect from them under the lock. c.msCollect(ch, c.msLast) c.msMtx.Unlock() return } // If we are here, the last memstats are too old or don't exist. We have // to wait until our own ReadMemStats finally completes. For that to // happen, we have to release the lock. c.msMtx.Unlock() <-done c.msCollect(ch, ms) } func (c *goCollector) msCollect(ch chan<- Metric, ms *runtime.MemStats) { for _, i := range c.msMetrics { ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) } } client_golang-1.19.1/prometheus/go_collector_go116_test.go000066400000000000000000000060531461713521000235650ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !go1.17 // +build !go1.17 package prometheus import ( "runtime" "testing" "time" dto "github.com/prometheus/client_model/go" ) func TestGoCollectorMemStats(t *testing.T) { var ( c = NewGoCollector().(*goCollector) got uint64 ) checkCollect := func(want uint64) { metricCh := make(chan Metric) endCh := make(chan struct{}) go func() { c.Collect(metricCh) close(endCh) }() Collect: for { select { case metric := <-metricCh: if metric.Desc().fqName != "go_memstats_alloc_bytes" { continue Collect } pb := &dto.Metric{} metric.Write(pb) got = uint64(pb.GetGauge().GetValue()) case <-endCh: break Collect } } if want != got { t.Errorf("unexpected value of go_memstats_alloc_bytes, want %d, got %d", want, got) } } // Speed up the timing to make the test faster. c.msMaxWait = 5 * time.Millisecond c.msMaxAge = 50 * time.Millisecond // Scenario 1: msRead responds slowly, no previous memstats available, // msRead is executed anyway. c.msRead = func(ms *runtime.MemStats) { time.Sleep(20 * time.Millisecond) ms.Alloc = 1 } checkCollect(1) // Now msLast is set. c.msMtx.Lock() if want, got := uint64(1), c.msLast.Alloc; want != got { t.Errorf("unexpected of msLast.Alloc, want %d, got %d", want, got) } c.msMtx.Unlock() // Scenario 2: msRead responds fast, previous memstats available, new // value collected. c.msRead = func(ms *runtime.MemStats) { ms.Alloc = 2 } checkCollect(2) // msLast is set, too. c.msMtx.Lock() if want, got := uint64(2), c.msLast.Alloc; want != got { t.Errorf("unexpected of msLast.Alloc, want %d, got %d", want, got) } c.msMtx.Unlock() // Scenario 3: msRead responds slowly, previous memstats available, old // value collected. c.msRead = func(ms *runtime.MemStats) { time.Sleep(20 * time.Millisecond) ms.Alloc = 3 } checkCollect(2) // After waiting, new value is still set in msLast. time.Sleep(80 * time.Millisecond) c.msMtx.Lock() if want, got := uint64(3), c.msLast.Alloc; want != got { t.Errorf("unexpected of msLast.Alloc, want %d, got %d", want, got) } c.msMtx.Unlock() // Scenario 4: msRead responds slowly, previous memstats is too old, new // value collected. c.msRead = func(ms *runtime.MemStats) { time.Sleep(20 * time.Millisecond) ms.Alloc = 4 } checkCollect(4) c.msMtx.Lock() if want, got := uint64(4), c.msLast.Alloc; want != got { t.Errorf("unexpected of msLast.Alloc, want %d, got %d", want, got) } c.msMtx.Unlock() } client_golang-1.19.1/prometheus/go_collector_latest.go000066400000000000000000000447041461713521000231720ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package prometheus import ( "math" "runtime" "runtime/metrics" "strings" "sync" "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) const ( // constants for strings referenced more than once. goGCHeapTinyAllocsObjects = "/gc/heap/tiny/allocs:objects" goGCHeapAllocsObjects = "/gc/heap/allocs:objects" goGCHeapFreesObjects = "/gc/heap/frees:objects" goGCHeapFreesBytes = "/gc/heap/frees:bytes" goGCHeapAllocsBytes = "/gc/heap/allocs:bytes" goGCHeapObjects = "/gc/heap/objects:objects" goGCHeapGoalBytes = "/gc/heap/goal:bytes" goMemoryClassesTotalBytes = "/memory/classes/total:bytes" goMemoryClassesHeapObjectsBytes = "/memory/classes/heap/objects:bytes" goMemoryClassesHeapUnusedBytes = "/memory/classes/heap/unused:bytes" goMemoryClassesHeapReleasedBytes = "/memory/classes/heap/released:bytes" goMemoryClassesHeapFreeBytes = "/memory/classes/heap/free:bytes" goMemoryClassesHeapStacksBytes = "/memory/classes/heap/stacks:bytes" goMemoryClassesOSStacksBytes = "/memory/classes/os-stacks:bytes" goMemoryClassesMetadataMSpanInuseBytes = "/memory/classes/metadata/mspan/inuse:bytes" goMemoryClassesMetadataMSPanFreeBytes = "/memory/classes/metadata/mspan/free:bytes" goMemoryClassesMetadataMCacheInuseBytes = "/memory/classes/metadata/mcache/inuse:bytes" goMemoryClassesMetadataMCacheFreeBytes = "/memory/classes/metadata/mcache/free:bytes" goMemoryClassesProfilingBucketsBytes = "/memory/classes/profiling/buckets:bytes" goMemoryClassesMetadataOtherBytes = "/memory/classes/metadata/other:bytes" goMemoryClassesOtherBytes = "/memory/classes/other:bytes" ) // rmNamesForMemStatsMetrics represents runtime/metrics names required to populate goRuntimeMemStats from like logic. var rmNamesForMemStatsMetrics = []string{ goGCHeapTinyAllocsObjects, goGCHeapAllocsObjects, goGCHeapFreesObjects, goGCHeapAllocsBytes, goGCHeapObjects, goGCHeapGoalBytes, goMemoryClassesTotalBytes, goMemoryClassesHeapObjectsBytes, goMemoryClassesHeapUnusedBytes, goMemoryClassesHeapReleasedBytes, goMemoryClassesHeapFreeBytes, goMemoryClassesHeapStacksBytes, goMemoryClassesOSStacksBytes, goMemoryClassesMetadataMSpanInuseBytes, goMemoryClassesMetadataMSPanFreeBytes, goMemoryClassesMetadataMCacheInuseBytes, goMemoryClassesMetadataMCacheFreeBytes, goMemoryClassesProfilingBucketsBytes, goMemoryClassesMetadataOtherBytes, goMemoryClassesOtherBytes, } func bestEffortLookupRM(lookup []string) []metrics.Description { ret := make([]metrics.Description, 0, len(lookup)) for _, rm := range metrics.All() { for _, m := range lookup { if m == rm.Name { ret = append(ret, rm) } } } return ret } type goCollector struct { base baseGoCollector // mu protects updates to all fields ensuring a consistent // snapshot is always produced by Collect. mu sync.Mutex // Contains all samples that has to retrieved from runtime/metrics (not all of them will be exposed). sampleBuf []metrics.Sample // sampleMap allows lookup for MemStats metrics and runtime/metrics histograms for exact sums. sampleMap map[string]*metrics.Sample // rmExposedMetrics represents all runtime/metrics package metrics // that were configured to be exposed. rmExposedMetrics []collectorMetric rmExactSumMapForHist map[string]string // With Go 1.17, the runtime/metrics package was introduced. // From that point on, metric names produced by the runtime/metrics // package could be generated from runtime/metrics names. However, // these differ from the old names for the same values. // // This field exists to export the same values under the old names // as well. msMetrics memStatsMetrics msMetricsEnabled bool } type rmMetricDesc struct { metrics.Description } func matchRuntimeMetricsRules(rules []internal.GoCollectorRule) []rmMetricDesc { var descs []rmMetricDesc for _, d := range metrics.All() { var ( deny = true desc rmMetricDesc ) for _, r := range rules { if !r.Matcher.MatchString(d.Name) { continue } deny = r.Deny } if deny { continue } desc.Description = d descs = append(descs, desc) } return descs } func defaultGoCollectorOptions() internal.GoCollectorOptions { return internal.GoCollectorOptions{ RuntimeMetricSumForHist: map[string]string{ "/gc/heap/allocs-by-size:bytes": goGCHeapAllocsBytes, "/gc/heap/frees-by-size:bytes": goGCHeapFreesBytes, }, RuntimeMetricRules: []internal.GoCollectorRule{ //{Matcher: regexp.MustCompile("")}, }, } } // NewGoCollector is the obsolete version of collectors.NewGoCollector. // See there for documentation. // // Deprecated: Use collectors.NewGoCollector instead. func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) Collector { opt := defaultGoCollectorOptions() for _, o := range opts { o(&opt) } exposedDescriptions := matchRuntimeMetricsRules(opt.RuntimeMetricRules) // Collect all histogram samples so that we can get their buckets. // The API guarantees that the buckets are always fixed for the lifetime // of the process. var histograms []metrics.Sample for _, d := range exposedDescriptions { if d.Kind == metrics.KindFloat64Histogram { histograms = append(histograms, metrics.Sample{Name: d.Name}) } } if len(histograms) > 0 { metrics.Read(histograms) } bucketsMap := make(map[string][]float64) for i := range histograms { bucketsMap[histograms[i].Name] = histograms[i].Value.Float64Histogram().Buckets } // Generate a collector for each exposed runtime/metrics metric. metricSet := make([]collectorMetric, 0, len(exposedDescriptions)) // SampleBuf is used for reading from runtime/metrics. // We are assuming the largest case to have stable pointers for sampleMap purposes. sampleBuf := make([]metrics.Sample, 0, len(exposedDescriptions)+len(opt.RuntimeMetricSumForHist)+len(rmNamesForMemStatsMetrics)) sampleMap := make(map[string]*metrics.Sample, len(exposedDescriptions)) for _, d := range exposedDescriptions { namespace, subsystem, name, ok := internal.RuntimeMetricsToProm(&d.Description) if !ok { // Just ignore this metric; we can't do anything with it here. // If a user decides to use the latest version of Go, we don't want // to fail here. This condition is tested in TestExpectedRuntimeMetrics. continue } sampleBuf = append(sampleBuf, metrics.Sample{Name: d.Name}) sampleMap[d.Name] = &sampleBuf[len(sampleBuf)-1] var m collectorMetric if d.Kind == metrics.KindFloat64Histogram { _, hasSum := opt.RuntimeMetricSumForHist[d.Name] unit := d.Name[strings.IndexRune(d.Name, ':')+1:] m = newBatchHistogram( NewDesc( BuildFQName(namespace, subsystem, name), d.Description.Description, nil, nil, ), internal.RuntimeMetricsBucketsForUnit(bucketsMap[d.Name], unit), hasSum, ) } else if d.Cumulative { m = NewCounter(CounterOpts{ Namespace: namespace, Subsystem: subsystem, Name: name, Help: d.Description.Description, }, ) } else { m = NewGauge(GaugeOpts{ Namespace: namespace, Subsystem: subsystem, Name: name, Help: d.Description.Description, }) } metricSet = append(metricSet, m) } // Add exact sum metrics to sampleBuf if not added before. for _, h := range histograms { sumMetric, ok := opt.RuntimeMetricSumForHist[h.Name] if !ok { continue } if _, ok := sampleMap[sumMetric]; ok { continue } sampleBuf = append(sampleBuf, metrics.Sample{Name: sumMetric}) sampleMap[sumMetric] = &sampleBuf[len(sampleBuf)-1] } var ( msMetrics memStatsMetrics msDescriptions []metrics.Description ) if !opt.DisableMemStatsLikeMetrics { msMetrics = goRuntimeMemStats() msDescriptions = bestEffortLookupRM(rmNamesForMemStatsMetrics) // Check if metric was not exposed before and if not, add to sampleBuf. for _, mdDesc := range msDescriptions { if _, ok := sampleMap[mdDesc.Name]; ok { continue } sampleBuf = append(sampleBuf, metrics.Sample{Name: mdDesc.Name}) sampleMap[mdDesc.Name] = &sampleBuf[len(sampleBuf)-1] } } return &goCollector{ base: newBaseGoCollector(), sampleBuf: sampleBuf, sampleMap: sampleMap, rmExposedMetrics: metricSet, rmExactSumMapForHist: opt.RuntimeMetricSumForHist, msMetrics: msMetrics, msMetricsEnabled: !opt.DisableMemStatsLikeMetrics, } } // Describe returns all descriptions of the collector. func (c *goCollector) Describe(ch chan<- *Desc) { c.base.Describe(ch) for _, i := range c.msMetrics { ch <- i.desc } for _, m := range c.rmExposedMetrics { ch <- m.Desc() } } // Collect returns the current state of all metrics of the collector. func (c *goCollector) Collect(ch chan<- Metric) { // Collect base non-memory metrics. c.base.Collect(ch) if len(c.sampleBuf) == 0 { return } // Collect must be thread-safe, so prevent concurrent use of // sampleBuf elements. Just read into sampleBuf but write all the data // we get into our Metrics or MemStats. // // This lock also ensures that the Metrics we send out are all from // the same updates, ensuring their mutual consistency insofar as // is guaranteed by the runtime/metrics package. // // N.B. This locking is heavy-handed, but Collect is expected to be called // relatively infrequently. Also the core operation here, metrics.Read, // is fast (O(tens of microseconds)) so contention should certainly be // low, though channel operations and any allocations may add to that. c.mu.Lock() defer c.mu.Unlock() // Populate runtime/metrics sample buffer. metrics.Read(c.sampleBuf) // Collect all our runtime/metrics user chose to expose from sampleBuf (if any). for i, metric := range c.rmExposedMetrics { // We created samples for exposed metrics first in order, so indexes match. sample := c.sampleBuf[i] // N.B. switch on concrete type because it's significantly more efficient // than checking for the Counter and Gauge interface implementations. In // this case, we control all the types here. switch m := metric.(type) { case *counter: // Guard against decreases. This should never happen, but a failure // to do so will result in a panic, which is a harsh consequence for // a metrics collection bug. v0, v1 := m.get(), unwrapScalarRMValue(sample.Value) if v1 > v0 { m.Add(unwrapScalarRMValue(sample.Value) - m.get()) } m.Collect(ch) case *gauge: m.Set(unwrapScalarRMValue(sample.Value)) m.Collect(ch) case *batchHistogram: m.update(sample.Value.Float64Histogram(), c.exactSumFor(sample.Name)) m.Collect(ch) default: panic("unexpected metric type") } } if c.msMetricsEnabled { // ms is a dummy MemStats that we populate ourselves so that we can // populate the old metrics from it if goMemStatsCollection is enabled. var ms runtime.MemStats memStatsFromRM(&ms, c.sampleMap) for _, i := range c.msMetrics { ch <- MustNewConstMetric(i.desc, i.valType, i.eval(&ms)) } } } // unwrapScalarRMValue unwraps a runtime/metrics value that is assumed // to be scalar and returns the equivalent float64 value. Panics if the // value is not scalar. func unwrapScalarRMValue(v metrics.Value) float64 { switch v.Kind() { case metrics.KindUint64: return float64(v.Uint64()) case metrics.KindFloat64: return v.Float64() case metrics.KindBad: // Unsupported metric. // // This should never happen because we always populate our metric // set from the runtime/metrics package. panic("unexpected unsupported metric") default: // Unsupported metric kind. // // This should never happen because we check for this during initialization // and flag and filter metrics whose kinds we don't understand. panic("unexpected unsupported metric kind") } } // exactSumFor takes a runtime/metrics metric name (that is assumed to // be of kind KindFloat64Histogram) and returns its exact sum and whether // its exact sum exists. // // The runtime/metrics API for histograms doesn't currently expose exact // sums, but some of the other metrics are in fact exact sums of histograms. func (c *goCollector) exactSumFor(rmName string) float64 { sumName, ok := c.rmExactSumMapForHist[rmName] if !ok { return 0 } s, ok := c.sampleMap[sumName] if !ok { return 0 } return unwrapScalarRMValue(s.Value) } func memStatsFromRM(ms *runtime.MemStats, rm map[string]*metrics.Sample) { lookupOrZero := func(name string) uint64 { if s, ok := rm[name]; ok { return s.Value.Uint64() } return 0 } // Currently, MemStats adds tiny alloc count to both Mallocs AND Frees. // The reason for this is because MemStats couldn't be extended at the time // but there was a desire to have Mallocs at least be a little more representative, // while having Mallocs - Frees still represent a live object count. // Unfortunately, MemStats doesn't actually export a large allocation count, // so it's impossible to pull this number out directly. tinyAllocs := lookupOrZero(goGCHeapTinyAllocsObjects) ms.Mallocs = lookupOrZero(goGCHeapAllocsObjects) + tinyAllocs ms.Frees = lookupOrZero(goGCHeapFreesObjects) + tinyAllocs ms.TotalAlloc = lookupOrZero(goGCHeapAllocsBytes) ms.Sys = lookupOrZero(goMemoryClassesTotalBytes) ms.Lookups = 0 // Already always zero. ms.HeapAlloc = lookupOrZero(goMemoryClassesHeapObjectsBytes) ms.Alloc = ms.HeapAlloc ms.HeapInuse = ms.HeapAlloc + lookupOrZero(goMemoryClassesHeapUnusedBytes) ms.HeapReleased = lookupOrZero(goMemoryClassesHeapReleasedBytes) ms.HeapIdle = ms.HeapReleased + lookupOrZero(goMemoryClassesHeapFreeBytes) ms.HeapSys = ms.HeapInuse + ms.HeapIdle ms.HeapObjects = lookupOrZero(goGCHeapObjects) ms.StackInuse = lookupOrZero(goMemoryClassesHeapStacksBytes) ms.StackSys = ms.StackInuse + lookupOrZero(goMemoryClassesOSStacksBytes) ms.MSpanInuse = lookupOrZero(goMemoryClassesMetadataMSpanInuseBytes) ms.MSpanSys = ms.MSpanInuse + lookupOrZero(goMemoryClassesMetadataMSPanFreeBytes) ms.MCacheInuse = lookupOrZero(goMemoryClassesMetadataMCacheInuseBytes) ms.MCacheSys = ms.MCacheInuse + lookupOrZero(goMemoryClassesMetadataMCacheFreeBytes) ms.BuckHashSys = lookupOrZero(goMemoryClassesProfilingBucketsBytes) ms.GCSys = lookupOrZero(goMemoryClassesMetadataOtherBytes) ms.OtherSys = lookupOrZero(goMemoryClassesOtherBytes) ms.NextGC = lookupOrZero(goGCHeapGoalBytes) // N.B. GCCPUFraction is intentionally omitted. This metric is not useful, // and often misleading due to the fact that it's an average over the lifetime // of the process. // See https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 // for more details. ms.GCCPUFraction = 0 } // batchHistogram is a mutable histogram that is updated // in batches. type batchHistogram struct { selfCollector // Static fields updated only once. desc *Desc hasSum bool // Because this histogram operates in batches, it just uses a // single mutex for everything. updates are always serialized // but Write calls may operate concurrently with updates. // Contention between these two sources should be rare. mu sync.Mutex buckets []float64 // Inclusive lower bounds, like runtime/metrics. counts []uint64 sum float64 // Used if hasSum is true. } // newBatchHistogram creates a new batch histogram value with the given // Desc, buckets, and whether or not it has an exact sum available. // // buckets must always be from the runtime/metrics package, following // the same conventions. func newBatchHistogram(desc *Desc, buckets []float64, hasSum bool) *batchHistogram { // We need to remove -Inf values. runtime/metrics keeps them around. // But -Inf bucket should not be allowed for prometheus histograms. if buckets[0] == math.Inf(-1) { buckets = buckets[1:] } h := &batchHistogram{ desc: desc, buckets: buckets, // Because buckets follows runtime/metrics conventions, there's // 1 more value in the buckets list than there are buckets represented, // because in runtime/metrics, the bucket values represent *boundaries*, // and non-Inf boundaries are inclusive lower bounds for that bucket. counts: make([]uint64, len(buckets)-1), hasSum: hasSum, } h.init(h) return h } // update updates the batchHistogram from a runtime/metrics histogram. // // sum must be provided if the batchHistogram was created to have an exact sum. // h.buckets must be a strict subset of his.Buckets. func (h *batchHistogram) update(his *metrics.Float64Histogram, sum float64) { counts, buckets := his.Counts, his.Buckets h.mu.Lock() defer h.mu.Unlock() // Clear buckets. for i := range h.counts { h.counts[i] = 0 } // Copy and reduce buckets. var j int for i, count := range counts { h.counts[j] += count if buckets[i+1] == h.buckets[j+1] { j++ } } if h.hasSum { h.sum = sum } } func (h *batchHistogram) Desc() *Desc { return h.desc } func (h *batchHistogram) Write(out *dto.Metric) error { h.mu.Lock() defer h.mu.Unlock() sum := float64(0) if h.hasSum { sum = h.sum } dtoBuckets := make([]*dto.Bucket, 0, len(h.counts)) totalCount := uint64(0) for i, count := range h.counts { totalCount += count if !h.hasSum { if count != 0 { // N.B. This computed sum is an underestimate. sum += h.buckets[i] * float64(count) } } // Skip the +Inf bucket, but only for the bucket list. // It must still count for sum and totalCount. if math.IsInf(h.buckets[i+1], 1) { break } // Float64Histogram's upper bound is exclusive, so make it inclusive // by obtaining the next float64 value down, in order. upperBound := math.Nextafter(h.buckets[i+1], h.buckets[i]) dtoBuckets = append(dtoBuckets, &dto.Bucket{ CumulativeCount: proto.Uint64(totalCount), UpperBound: proto.Float64(upperBound), }) } out.Histogram = &dto.Histogram{ Bucket: dtoBuckets, SampleCount: proto.Uint64(totalCount), SampleSum: proto.Float64(sum), } return nil } client_golang-1.19.1/prometheus/go_collector_latest_test.go000066400000000000000000000267711461713521000242350ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package prometheus import ( "math" "reflect" "regexp" "runtime" "runtime/metrics" "sync" "testing" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus/internal" ) func TestRmForMemStats(t *testing.T) { descs := bestEffortLookupRM(rmNamesForMemStatsMetrics) if got, want := len(descs), len(rmNamesForMemStatsMetrics); got != want { t.Errorf("got %d, want %d metrics", got, want) } for _, d := range descs { // We don't expect histograms there. if d.Kind == metrics.KindFloat64Histogram { t.Errorf("we don't expect to use histograms for MemStats metrics, got %v", d.Name) } } } func expectedBaseMetrics() map[string]struct{} { metrics := map[string]struct{}{} b := newBaseGoCollector() for _, m := range []string{ b.gcDesc.fqName, b.goInfoDesc.fqName, b.goroutinesDesc.fqName, b.gcLastTimeDesc.fqName, b.threadsDesc.fqName, } { metrics[m] = struct{}{} } return metrics } func addExpectedRuntimeMemStats(metrics map[string]struct{}) map[string]struct{} { for _, m := range goRuntimeMemStats() { metrics[m.desc.fqName] = struct{}{} } return metrics } func addExpectedRuntimeMetrics(metrics map[string]struct{}) map[string]struct{} { for _, m := range expectedRuntimeMetrics { metrics[m] = struct{}{} } return metrics } func TestGoCollector_ExposedMetrics(t *testing.T) { for _, tcase := range []struct { opts internal.GoCollectorOptions expectedFQNameSet map[string]struct{} }{ { opts: internal.GoCollectorOptions{ DisableMemStatsLikeMetrics: true, }, expectedFQNameSet: expectedBaseMetrics(), }, { // Default, only MemStats. expectedFQNameSet: addExpectedRuntimeMemStats(expectedBaseMetrics()), }, { // Get all runtime/metrics without MemStats. opts: internal.GoCollectorOptions{ DisableMemStatsLikeMetrics: true, RuntimeMetricRules: []internal.GoCollectorRule{ {Matcher: regexp.MustCompile("/.*")}, }, }, expectedFQNameSet: addExpectedRuntimeMetrics(expectedBaseMetrics()), }, { // Get all runtime/metrics and MemStats. opts: internal.GoCollectorOptions{ RuntimeMetricRules: []internal.GoCollectorRule{ {Matcher: regexp.MustCompile("/.*")}, }, }, expectedFQNameSet: addExpectedRuntimeMemStats(addExpectedRuntimeMetrics(expectedBaseMetrics())), }, } { if ok := t.Run("", func(t *testing.T) { goMetrics := collectGoMetrics(t, tcase.opts) goMetricSet := make(map[string]Metric) for _, m := range goMetrics { goMetricSet[m.Desc().fqName] = m } for i := range goMetrics { name := goMetrics[i].Desc().fqName if _, ok := tcase.expectedFQNameSet[name]; !ok { t.Errorf("found unexpected metric %s", name) continue } } // Now iterate over the expected metrics and look for removals. for expectedName := range tcase.expectedFQNameSet { if _, ok := goMetricSet[expectedName]; !ok { t.Errorf("missing expected metric %s in collection", expectedName) continue } } }); !ok { return } } } var sink interface{} func TestBatchHistogram(t *testing.T) { goMetrics := collectGoMetrics(t, internal.GoCollectorOptions{ RuntimeMetricRules: []internal.GoCollectorRule{ {Matcher: regexp.MustCompile("/.*")}, }, }) var mhist Metric for _, m := range goMetrics { if m.Desc().fqName == "go_gc_heap_allocs_by_size_bytes" { mhist = m break } } if mhist == nil { t.Fatal("failed to find metric to test") } hist, ok := mhist.(*batchHistogram) if !ok { t.Fatal("found metric is not a runtime/metrics histogram") } // Make a bunch of allocations then do another collection. // // The runtime/metrics API tries to reuse memory where possible, // so make sure that we didn't hang on to any of that memory in // hist. countsCopy := make([]uint64, len(hist.counts)) copy(countsCopy, hist.counts) for i := 0; i < 100; i++ { sink = make([]byte, 128) } collectGoMetrics(t, defaultGoCollectorOptions()) for i, v := range hist.counts { if v != countsCopy[i] { t.Error("counts changed during new collection") break } } // Get the runtime/metrics copy. s := []metrics.Sample{ {Name: "/gc/heap/allocs-by-size:bytes"}, } metrics.Read(s) rmHist := s[0].Value.Float64Histogram() wantBuckets := internal.RuntimeMetricsBucketsForUnit(rmHist.Buckets, "bytes") // runtime/metrics histograms always have a +Inf bucket and are lower // bound inclusive. In contrast, we have an implicit +Inf bucket and // are upper bound inclusive, so we can chop off the first bucket // (since the conversion to upper bound inclusive will shift all buckets // down one index) and the +Inf for the last bucket. wantBuckets = wantBuckets[1 : len(wantBuckets)-1] // Check to make sure the output proto makes sense. pb := &dto.Metric{} hist.Write(pb) if math.IsInf(pb.Histogram.Bucket[len(pb.Histogram.Bucket)-1].GetUpperBound(), +1) { t.Errorf("found +Inf bucket") } if got := len(pb.Histogram.Bucket); got != len(wantBuckets) { t.Errorf("got %d buckets in protobuf, want %d", got, len(wantBuckets)) } for i, bucket := range pb.Histogram.Bucket { // runtime/metrics histograms are lower-bound inclusive, but we're // upper-bound inclusive. So just make sure the new inclusive upper // bound is somewhere close by (in some cases it's equal). wantBound := wantBuckets[i] if gotBound := *bucket.UpperBound; (wantBound-gotBound)/wantBound > 0.001 { t.Errorf("got bound %f, want within 0.1%% of %f", gotBound, wantBound) } // Make sure counts are cumulative. Because of the consistency guarantees // made by the runtime/metrics package, we're really not guaranteed to get // anything even remotely the same here. if i > 0 && *bucket.CumulativeCount < *pb.Histogram.Bucket[i-1].CumulativeCount { t.Error("cumulative counts are non-monotonic") } } } func collectGoMetrics(t *testing.T, opts internal.GoCollectorOptions) []Metric { t.Helper() c := NewGoCollector(func(o *internal.GoCollectorOptions) { o.DisableMemStatsLikeMetrics = opts.DisableMemStatsLikeMetrics o.RuntimeMetricSumForHist = opts.RuntimeMetricSumForHist o.RuntimeMetricRules = opts.RuntimeMetricRules }).(*goCollector) // Collect all metrics. ch := make(chan Metric) var wg sync.WaitGroup var metrics []Metric wg.Add(1) go func() { defer wg.Done() for metric := range ch { metrics = append(metrics, metric) } }() c.Collect(ch) close(ch) wg.Wait() return metrics } func TestMemStatsEquivalence(t *testing.T) { var msReal, msFake runtime.MemStats descs := bestEffortLookupRM(rmNamesForMemStatsMetrics) samples := make([]metrics.Sample, len(descs)) samplesMap := make(map[string]*metrics.Sample) for i := range descs { samples[i].Name = descs[i].Name samplesMap[descs[i].Name] = &samples[i] } // Force a GC cycle to try to reach a clean slate. runtime.GC() // Populate msReal. runtime.ReadMemStats(&msReal) // Populate msFake and hope that no GC happened in between (: metrics.Read(samples) memStatsFromRM(&msFake, samplesMap) // Iterate over them and make sure they're somewhat close. msRealValue := reflect.ValueOf(msReal) msFakeValue := reflect.ValueOf(msFake) typ := msRealValue.Type() for i := 0; i < msRealValue.NumField(); i++ { fr := msRealValue.Field(i) ff := msFakeValue.Field(i) if typ.Field(i).Name == "PauseTotalNs" || typ.Field(i).Name == "LastGC" { // We don't use those fields for metrics, // thus we are not interested in having this filled. continue } switch fr.Kind() { // Fields which we are interested in are all uint64s. // The only float64 field GCCPUFraction is by design omitted. case reflect.Uint64: vr := fr.Interface().(uint64) vf := ff.Interface().(uint64) if float64(vr-vf)/float64(vf) > 0.05 { t.Errorf("wrong value for %s: got %d, want %d", typ.Field(i).Name, vf, vr) } } } } func TestExpectedRuntimeMetrics(t *testing.T) { goMetrics := collectGoMetrics(t, internal.GoCollectorOptions{ DisableMemStatsLikeMetrics: true, RuntimeMetricRules: []internal.GoCollectorRule{ {Matcher: regexp.MustCompile("/.*")}, }, }) goMetricSet := make(map[string]Metric) for _, m := range goMetrics { goMetricSet[m.Desc().fqName] = m } descs := metrics.All() rmSet := make(map[string]struct{}) // Iterate over runtime-reported descriptions to find new metrics. for i := range descs { rmName := descs[i].Name rmSet[rmName] = struct{}{} // expectedRuntimeMetrics depends on Go version. expFQName, ok := expectedRuntimeMetrics[rmName] if !ok { t.Errorf("found new runtime/metrics metric %s", rmName) _, _, _, ok := internal.RuntimeMetricsToProm(&descs[i]) if !ok { t.Errorf("new metric has name that can't be converted, or has an unsupported Kind") } continue } _, ok = goMetricSet[expFQName] if !ok { t.Errorf("existing runtime/metrics metric %s (expected fq name %s) not collected", rmName, expFQName) continue } } // Now iterate over the expected metrics and look for removals. cardinality := 0 for rmName, fqName := range expectedRuntimeMetrics { if _, ok := rmSet[rmName]; !ok { t.Errorf("runtime/metrics metric %s removed", rmName) continue } if _, ok := goMetricSet[fqName]; !ok { t.Errorf("runtime/metrics metric %s not appearing under expected name %s", rmName, fqName) continue } // While we're at it, check to make sure expected cardinality lines // up, but at the point of the protobuf write to get as close to the // real deal as possible. // // Note that we filter out non-runtime/metrics metrics here, because // those are manually managed. var m dto.Metric if err := goMetricSet[fqName].Write(&m); err != nil { t.Errorf("writing metric %s: %v", fqName, err) continue } // N.B. These are the only fields populated by runtime/metrics metrics specifically. // Other fields are populated by e.g. GCStats metrics. switch { case m.Counter != nil: fallthrough case m.Gauge != nil: cardinality++ case m.Histogram != nil: cardinality += len(m.Histogram.Bucket) + 3 // + sum, count, and +inf default: t.Errorf("unexpected protobuf structure for metric %s", fqName) } } if t.Failed() { t.Log("a new Go version may have been detected, please run") t.Log("\tgo run gen_go_collector_metrics_set.go go1.X") t.Log("where X is the Go version you are currently using") } expectCardinality := expectedRuntimeMetricsCardinality if cardinality != expectCardinality { t.Errorf("unexpected cardinality for runtime/metrics metrics: got %d, want %d", cardinality, expectCardinality) } } func TestGoCollectorConcurrency(t *testing.T) { c := NewGoCollector().(*goCollector) // Set up multiple goroutines to Collect from the // same GoCollector. In race mode with GOMAXPROCS > 1, // this test should fail often if Collect is not // concurrent-safe. for i := 0; i < 4; i++ { go func() { ch := make(chan Metric) go func() { // Drain all metrics received until the // channel is closed. for range ch { } }() c.Collect(ch) close(ch) }() } } client_golang-1.19.1/prometheus/go_collector_metrics_go117_test.go000066400000000000000000000053261461713521000253160ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.17 //go:build go1.17 && !go1.18 // +build go1.17,!go1.18 package prometheus var expectedRuntimeMetrics = map[string]string{ "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", } const expectedRuntimeMetricsCardinality = 77 client_golang-1.19.1/prometheus/go_collector_metrics_go118_test.go000066400000000000000000000053261461713521000253170ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.18 //go:build go1.18 && !go1.19 // +build go1.18,!go1.19 package prometheus var expectedRuntimeMetrics = map[string]string{ "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", } const expectedRuntimeMetricsCardinality = 77 client_golang-1.19.1/prometheus/go_collector_metrics_go119_test.go000066400000000000000000000060431461713521000253150ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.19 //go:build go1.19 && !go1.20 // +build go1.19,!go1.20 package prometheus var expectedRuntimeMetrics = map[string]string{ "/cgo/go-to-c-calls:calls": "go_cgo_go_to_c_calls_calls_total", "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/limiter/last-enabled:gc-cycle": "go_gc_limiter_last_enabled_gc_cycle", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/gc/stack/starting-size:bytes": "go_gc_stack_starting_size_bytes", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/gomaxprocs:threads": "go_sched_gomaxprocs_threads", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", } const expectedRuntimeMetricsCardinality = 81 client_golang-1.19.1/prometheus/go_collector_metrics_go120_test.go000066400000000000000000000103111461713521000252760ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.20 //go:build go1.20 && !go1.21 // +build go1.20,!go1.21 package prometheus var expectedRuntimeMetrics = map[string]string{ "/cgo/go-to-c-calls:calls": "go_cgo_go_to_c_calls_calls_total", "/cpu/classes/gc/mark/assist:cpu-seconds": "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "/cpu/classes/gc/mark/dedicated:cpu-seconds": "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "/cpu/classes/gc/mark/idle:cpu-seconds": "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "/cpu/classes/gc/pause:cpu-seconds": "go_cpu_classes_gc_pause_cpu_seconds_total", "/cpu/classes/gc/total:cpu-seconds": "go_cpu_classes_gc_total_cpu_seconds_total", "/cpu/classes/idle:cpu-seconds": "go_cpu_classes_idle_cpu_seconds_total", "/cpu/classes/scavenge/assist:cpu-seconds": "go_cpu_classes_scavenge_assist_cpu_seconds_total", "/cpu/classes/scavenge/background:cpu-seconds": "go_cpu_classes_scavenge_background_cpu_seconds_total", "/cpu/classes/scavenge/total:cpu-seconds": "go_cpu_classes_scavenge_total_cpu_seconds_total", "/cpu/classes/total:cpu-seconds": "go_cpu_classes_total_cpu_seconds_total", "/cpu/classes/user:cpu-seconds": "go_cpu_classes_user_cpu_seconds_total", "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/limiter/last-enabled:gc-cycle": "go_gc_limiter_last_enabled_gc_cycle", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/gc/stack/starting-size:bytes": "go_gc_stack_starting_size_bytes", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/gomaxprocs:threads": "go_sched_gomaxprocs_threads", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", "/sync/mutex/wait/total:seconds": "go_sync_mutex_wait_total_seconds_total", } const expectedRuntimeMetricsCardinality = 89 client_golang-1.19.1/prometheus/go_collector_metrics_go121_test.go000066400000000000000000000170571461713521000253150ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.21 //go:build go1.21 && !go1.22 // +build go1.21,!go1.22 package prometheus var expectedRuntimeMetrics = map[string]string{ "/cgo/go-to-c-calls:calls": "go_cgo_go_to_c_calls_calls_total", "/cpu/classes/gc/mark/assist:cpu-seconds": "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "/cpu/classes/gc/mark/dedicated:cpu-seconds": "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "/cpu/classes/gc/mark/idle:cpu-seconds": "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "/cpu/classes/gc/pause:cpu-seconds": "go_cpu_classes_gc_pause_cpu_seconds_total", "/cpu/classes/gc/total:cpu-seconds": "go_cpu_classes_gc_total_cpu_seconds_total", "/cpu/classes/idle:cpu-seconds": "go_cpu_classes_idle_cpu_seconds_total", "/cpu/classes/scavenge/assist:cpu-seconds": "go_cpu_classes_scavenge_assist_cpu_seconds_total", "/cpu/classes/scavenge/background:cpu-seconds": "go_cpu_classes_scavenge_background_cpu_seconds_total", "/cpu/classes/scavenge/total:cpu-seconds": "go_cpu_classes_scavenge_total_cpu_seconds_total", "/cpu/classes/total:cpu-seconds": "go_cpu_classes_total_cpu_seconds_total", "/cpu/classes/user:cpu-seconds": "go_cpu_classes_user_cpu_seconds_total", "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/gogc:percent": "go_gc_gogc_percent", "/gc/gomemlimit:bytes": "go_gc_gomemlimit_bytes", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/live:bytes": "go_gc_heap_live_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/limiter/last-enabled:gc-cycle": "go_gc_limiter_last_enabled_gc_cycle", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/gc/scan/globals:bytes": "go_gc_scan_globals_bytes", "/gc/scan/heap:bytes": "go_gc_scan_heap_bytes", "/gc/scan/stack:bytes": "go_gc_scan_stack_bytes", "/gc/scan/total:bytes": "go_gc_scan_total_bytes", "/gc/stack/starting-size:bytes": "go_gc_stack_starting_size_bytes", "/godebug/non-default-behavior/execerrdot:events": "go_godebug_non_default_behavior_execerrdot_events_total", "/godebug/non-default-behavior/gocachehash:events": "go_godebug_non_default_behavior_gocachehash_events_total", "/godebug/non-default-behavior/gocachetest:events": "go_godebug_non_default_behavior_gocachetest_events_total", "/godebug/non-default-behavior/gocacheverify:events": "go_godebug_non_default_behavior_gocacheverify_events_total", "/godebug/non-default-behavior/http2client:events": "go_godebug_non_default_behavior_http2client_events_total", "/godebug/non-default-behavior/http2server:events": "go_godebug_non_default_behavior_http2server_events_total", "/godebug/non-default-behavior/installgoroot:events": "go_godebug_non_default_behavior_installgoroot_events_total", "/godebug/non-default-behavior/jstmpllitinterp:events": "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "/godebug/non-default-behavior/multipartmaxheaders:events": "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "/godebug/non-default-behavior/multipartmaxparts:events": "go_godebug_non_default_behavior_multipartmaxparts_events_total", "/godebug/non-default-behavior/multipathtcp:events": "go_godebug_non_default_behavior_multipathtcp_events_total", "/godebug/non-default-behavior/panicnil:events": "go_godebug_non_default_behavior_panicnil_events_total", "/godebug/non-default-behavior/randautoseed:events": "go_godebug_non_default_behavior_randautoseed_events_total", "/godebug/non-default-behavior/tarinsecurepath:events": "go_godebug_non_default_behavior_tarinsecurepath_events_total", "/godebug/non-default-behavior/tlsmaxrsasize:events": "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "/godebug/non-default-behavior/x509sha1:events": "go_godebug_non_default_behavior_x509sha1_events_total", "/godebug/non-default-behavior/x509usefallbackroots:events": "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "/godebug/non-default-behavior/zipinsecurepath:events": "go_godebug_non_default_behavior_zipinsecurepath_events_total", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/gomaxprocs:threads": "go_sched_gomaxprocs_threads", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", "/sync/mutex/wait/total:seconds": "go_sync_mutex_wait_total_seconds_total", } const expectedRuntimeMetricsCardinality = 114 client_golang-1.19.1/prometheus/go_collector_metrics_go122_test.go000066400000000000000000000214471461713521000253140ustar00rootroot00000000000000// Code generated by gen_go_collector_metrics_set.go; DO NOT EDIT. //go:generate go run gen_go_collector_metrics_set.go go1.22 //go:build go1.22 && !go1.23 // +build go1.22,!go1.23 package prometheus var expectedRuntimeMetrics = map[string]string{ "/cgo/go-to-c-calls:calls": "go_cgo_go_to_c_calls_calls_total", "/cpu/classes/gc/mark/assist:cpu-seconds": "go_cpu_classes_gc_mark_assist_cpu_seconds_total", "/cpu/classes/gc/mark/dedicated:cpu-seconds": "go_cpu_classes_gc_mark_dedicated_cpu_seconds_total", "/cpu/classes/gc/mark/idle:cpu-seconds": "go_cpu_classes_gc_mark_idle_cpu_seconds_total", "/cpu/classes/gc/pause:cpu-seconds": "go_cpu_classes_gc_pause_cpu_seconds_total", "/cpu/classes/gc/total:cpu-seconds": "go_cpu_classes_gc_total_cpu_seconds_total", "/cpu/classes/idle:cpu-seconds": "go_cpu_classes_idle_cpu_seconds_total", "/cpu/classes/scavenge/assist:cpu-seconds": "go_cpu_classes_scavenge_assist_cpu_seconds_total", "/cpu/classes/scavenge/background:cpu-seconds": "go_cpu_classes_scavenge_background_cpu_seconds_total", "/cpu/classes/scavenge/total:cpu-seconds": "go_cpu_classes_scavenge_total_cpu_seconds_total", "/cpu/classes/total:cpu-seconds": "go_cpu_classes_total_cpu_seconds_total", "/cpu/classes/user:cpu-seconds": "go_cpu_classes_user_cpu_seconds_total", "/gc/cycles/automatic:gc-cycles": "go_gc_cycles_automatic_gc_cycles_total", "/gc/cycles/forced:gc-cycles": "go_gc_cycles_forced_gc_cycles_total", "/gc/cycles/total:gc-cycles": "go_gc_cycles_total_gc_cycles_total", "/gc/gogc:percent": "go_gc_gogc_percent", "/gc/gomemlimit:bytes": "go_gc_gomemlimit_bytes", "/gc/heap/allocs-by-size:bytes": "go_gc_heap_allocs_by_size_bytes", "/gc/heap/allocs:bytes": "go_gc_heap_allocs_bytes_total", "/gc/heap/allocs:objects": "go_gc_heap_allocs_objects_total", "/gc/heap/frees-by-size:bytes": "go_gc_heap_frees_by_size_bytes", "/gc/heap/frees:bytes": "go_gc_heap_frees_bytes_total", "/gc/heap/frees:objects": "go_gc_heap_frees_objects_total", "/gc/heap/goal:bytes": "go_gc_heap_goal_bytes", "/gc/heap/live:bytes": "go_gc_heap_live_bytes", "/gc/heap/objects:objects": "go_gc_heap_objects_objects", "/gc/heap/tiny/allocs:objects": "go_gc_heap_tiny_allocs_objects_total", "/gc/limiter/last-enabled:gc-cycle": "go_gc_limiter_last_enabled_gc_cycle", "/gc/pauses:seconds": "go_gc_pauses_seconds", "/gc/scan/globals:bytes": "go_gc_scan_globals_bytes", "/gc/scan/heap:bytes": "go_gc_scan_heap_bytes", "/gc/scan/stack:bytes": "go_gc_scan_stack_bytes", "/gc/scan/total:bytes": "go_gc_scan_total_bytes", "/gc/stack/starting-size:bytes": "go_gc_stack_starting_size_bytes", "/godebug/non-default-behavior/execerrdot:events": "go_godebug_non_default_behavior_execerrdot_events_total", "/godebug/non-default-behavior/gocachehash:events": "go_godebug_non_default_behavior_gocachehash_events_total", "/godebug/non-default-behavior/gocachetest:events": "go_godebug_non_default_behavior_gocachetest_events_total", "/godebug/non-default-behavior/gocacheverify:events": "go_godebug_non_default_behavior_gocacheverify_events_total", "/godebug/non-default-behavior/gotypesalias:events": "go_godebug_non_default_behavior_gotypesalias_events_total", "/godebug/non-default-behavior/http2client:events": "go_godebug_non_default_behavior_http2client_events_total", "/godebug/non-default-behavior/http2server:events": "go_godebug_non_default_behavior_http2server_events_total", "/godebug/non-default-behavior/httplaxcontentlength:events": "go_godebug_non_default_behavior_httplaxcontentlength_events_total", "/godebug/non-default-behavior/httpmuxgo121:events": "go_godebug_non_default_behavior_httpmuxgo121_events_total", "/godebug/non-default-behavior/installgoroot:events": "go_godebug_non_default_behavior_installgoroot_events_total", "/godebug/non-default-behavior/jstmpllitinterp:events": "go_godebug_non_default_behavior_jstmpllitinterp_events_total", "/godebug/non-default-behavior/multipartmaxheaders:events": "go_godebug_non_default_behavior_multipartmaxheaders_events_total", "/godebug/non-default-behavior/multipartmaxparts:events": "go_godebug_non_default_behavior_multipartmaxparts_events_total", "/godebug/non-default-behavior/multipathtcp:events": "go_godebug_non_default_behavior_multipathtcp_events_total", "/godebug/non-default-behavior/panicnil:events": "go_godebug_non_default_behavior_panicnil_events_total", "/godebug/non-default-behavior/randautoseed:events": "go_godebug_non_default_behavior_randautoseed_events_total", "/godebug/non-default-behavior/tarinsecurepath:events": "go_godebug_non_default_behavior_tarinsecurepath_events_total", "/godebug/non-default-behavior/tls10server:events": "go_godebug_non_default_behavior_tls10server_events_total", "/godebug/non-default-behavior/tlsmaxrsasize:events": "go_godebug_non_default_behavior_tlsmaxrsasize_events_total", "/godebug/non-default-behavior/tlsrsakex:events": "go_godebug_non_default_behavior_tlsrsakex_events_total", "/godebug/non-default-behavior/tlsunsafeekm:events": "go_godebug_non_default_behavior_tlsunsafeekm_events_total", "/godebug/non-default-behavior/x509sha1:events": "go_godebug_non_default_behavior_x509sha1_events_total", "/godebug/non-default-behavior/x509usefallbackroots:events": "go_godebug_non_default_behavior_x509usefallbackroots_events_total", "/godebug/non-default-behavior/x509usepolicies:events": "go_godebug_non_default_behavior_x509usepolicies_events_total", "/godebug/non-default-behavior/zipinsecurepath:events": "go_godebug_non_default_behavior_zipinsecurepath_events_total", "/memory/classes/heap/free:bytes": "go_memory_classes_heap_free_bytes", "/memory/classes/heap/objects:bytes": "go_memory_classes_heap_objects_bytes", "/memory/classes/heap/released:bytes": "go_memory_classes_heap_released_bytes", "/memory/classes/heap/stacks:bytes": "go_memory_classes_heap_stacks_bytes", "/memory/classes/heap/unused:bytes": "go_memory_classes_heap_unused_bytes", "/memory/classes/metadata/mcache/free:bytes": "go_memory_classes_metadata_mcache_free_bytes", "/memory/classes/metadata/mcache/inuse:bytes": "go_memory_classes_metadata_mcache_inuse_bytes", "/memory/classes/metadata/mspan/free:bytes": "go_memory_classes_metadata_mspan_free_bytes", "/memory/classes/metadata/mspan/inuse:bytes": "go_memory_classes_metadata_mspan_inuse_bytes", "/memory/classes/metadata/other:bytes": "go_memory_classes_metadata_other_bytes", "/memory/classes/os-stacks:bytes": "go_memory_classes_os_stacks_bytes", "/memory/classes/other:bytes": "go_memory_classes_other_bytes", "/memory/classes/profiling/buckets:bytes": "go_memory_classes_profiling_buckets_bytes", "/memory/classes/total:bytes": "go_memory_classes_total_bytes", "/sched/gomaxprocs:threads": "go_sched_gomaxprocs_threads", "/sched/goroutines:goroutines": "go_sched_goroutines_goroutines", "/sched/latencies:seconds": "go_sched_latencies_seconds", "/sched/pauses/stopping/gc:seconds": "go_sched_pauses_stopping_gc_seconds", "/sched/pauses/stopping/other:seconds": "go_sched_pauses_stopping_other_seconds", "/sched/pauses/total/gc:seconds": "go_sched_pauses_total_gc_seconds", "/sched/pauses/total/other:seconds": "go_sched_pauses_total_other_seconds", "/sync/mutex/wait/total:seconds": "go_sync_mutex_wait_total_seconds_total", } const expectedRuntimeMetricsCardinality = 161 client_golang-1.19.1/prometheus/go_collector_test.go000066400000000000000000000076661461713521000226630ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "runtime" "testing" "time" dto "github.com/prometheus/client_model/go" ) func TestGoCollectorGoroutines(t *testing.T) { var ( c = NewGoCollector() metricCh = make(chan Metric) waitCh = make(chan struct{}) endGoroutineCh = make(chan struct{}) endCollectionCh = make(chan struct{}) old = -1 ) defer func() { close(endGoroutineCh) // Drain the collect channel to prevent goroutine leak. for { select { case <-metricCh: case <-endCollectionCh: return } } }() go func() { c.Collect(metricCh) for i := 1; i <= 10; i++ { // Start 10 goroutines to be sure we'll detect an // increase even if unrelated goroutines happen to // terminate during this test. go func(c <-chan struct{}) { <-c }(endGoroutineCh) } <-waitCh c.Collect(metricCh) close(endCollectionCh) }() for { select { case m := <-metricCh: // m can be Gauge or Counter, // currently just test the go_goroutines Gauge // and ignore others. if m.Desc().fqName != "go_goroutines" { continue } pb := &dto.Metric{} m.Write(pb) if pb.GetGauge() == nil { continue } if old == -1 { old = int(pb.GetGauge().GetValue()) close(waitCh) continue } if diff := old - int(pb.GetGauge().GetValue()); diff > -1 { t.Errorf("want at least one new goroutine, got %d fewer", diff) } case <-time.After(1 * time.Second): t.Fatalf("expected collect timed out") } break } } func TestGoCollectorGC(t *testing.T) { var ( c = NewGoCollector() metricCh = make(chan Metric) waitCh = make(chan struct{}) endCollectionCh = make(chan struct{}) oldGC uint64 oldPause float64 ) go func() { c.Collect(metricCh) // force GC runtime.GC() <-waitCh c.Collect(metricCh) close(endCollectionCh) }() defer func() { // Drain the collect channel to prevent goroutine leak. for { select { case <-metricCh: case <-endCollectionCh: return } } }() first := true for { select { case metric := <-metricCh: pb := &dto.Metric{} metric.Write(pb) if pb.GetSummary() == nil { continue } if len(pb.GetSummary().Quantile) != 5 { t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) } for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { if *pb.GetSummary().Quantile[idx].Quantile != want { t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) } } if first { first = false oldGC = *pb.GetSummary().SampleCount oldPause = *pb.GetSummary().SampleSum close(waitCh) continue } if diff := *pb.GetSummary().SampleCount - oldGC; diff < 1 { t.Errorf("want at least 1 new garbage collection run, got %d", diff) } if diff := *pb.GetSummary().SampleSum - oldPause; diff <= 0 { t.Errorf("want an increase in pause time, got a change of %f", diff) } case <-time.After(1 * time.Second): t.Fatalf("expected collect timed out") } break } } func BenchmarkGoCollector(b *testing.B) { c := NewGoCollector().(*goCollector) b.ResetTimer() for i := 0; i < b.N; i++ { ch := make(chan Metric, 8) go func() { // Drain all metrics received until the // channel is closed. for range ch { } }() c.Collect(ch) close(ch) } } client_golang-1.19.1/prometheus/graphite/000077500000000000000000000000001461713521000204065ustar00rootroot00000000000000client_golang-1.19.1/prometheus/graphite/bridge.go000066400000000000000000000160341461713521000221750ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package graphite provides a bridge to push Prometheus metrics to a Graphite // server. package graphite import ( "bufio" "context" "errors" "fmt" "io" "net" "sort" "time" "github.com/prometheus/common/expfmt" "github.com/prometheus/common/model" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus" ) const ( defaultInterval = 15 * time.Second millisecondsPerSecond = 1000 ) // HandlerErrorHandling defines how a Handler serving metrics will handle // errors. type HandlerErrorHandling int // These constants cause handlers serving metrics to behave as described if // errors are encountered. const ( // Ignore errors and try to push as many metrics to Graphite as possible. ContinueOnError HandlerErrorHandling = iota // Abort the push to Graphite upon the first error encountered. AbortOnError ) // Config defines the Graphite bridge config. type Config struct { // Whether to use Graphite tags or not. Defaults to false. UseTags bool // The url to push data to. Required. URL string // The prefix for the pushed Graphite metrics. Defaults to empty string. Prefix string // The interval to use for pushing data to Graphite. Defaults to 15 seconds. Interval time.Duration // The timeout for pushing metrics to Graphite. Defaults to 15 seconds. Timeout time.Duration // The Gatherer to use for metrics. Defaults to prometheus.DefaultGatherer. Gatherer prometheus.Gatherer // The logger that messages are written to. Defaults to no logging. Logger Logger // ErrorHandling defines how errors are handled. Note that errors are // logged regardless of the configured ErrorHandling provided Logger // is not nil. ErrorHandling HandlerErrorHandling } // Bridge pushes metrics to the configured Graphite server. type Bridge struct { useTags bool url string prefix string interval time.Duration timeout time.Duration errorHandling HandlerErrorHandling logger Logger g prometheus.Gatherer } // Logger is the minimal interface Bridge needs for logging. Note that // log.Logger from the standard library implements this interface, and it is // easy to implement by custom loggers, if they don't do so already anyway. type Logger interface { Println(v ...interface{}) } // NewBridge returns a pointer to a new Bridge struct. func NewBridge(c *Config) (*Bridge, error) { b := &Bridge{} b.useTags = c.UseTags if c.URL == "" { return nil, errors.New("missing URL") } b.url = c.URL if c.Gatherer == nil { b.g = prometheus.DefaultGatherer } else { b.g = c.Gatherer } if c.Logger != nil { b.logger = c.Logger } if c.Prefix != "" { b.prefix = c.Prefix } var z time.Duration if c.Interval == z { b.interval = defaultInterval } else { b.interval = c.Interval } if c.Timeout == z { b.timeout = defaultInterval } else { b.timeout = c.Timeout } b.errorHandling = c.ErrorHandling return b, nil } // Run starts the event loop that pushes Prometheus metrics to Graphite at the // configured interval. func (b *Bridge) Run(ctx context.Context) { ticker := time.NewTicker(b.interval) defer ticker.Stop() for { select { case <-ticker.C: if err := b.Push(); err != nil && b.logger != nil { b.logger.Println("error pushing to Graphite:", err) } case <-ctx.Done(): return } } } // Push pushes Prometheus metrics to the configured Graphite server. func (b *Bridge) Push() error { mfs, err := b.g.Gather() if err != nil || len(mfs) == 0 { switch b.errorHandling { case AbortOnError: return err case ContinueOnError: if b.logger != nil { b.logger.Println("continue on error:", err) } default: panic("unrecognized error handling value") } } conn, err := net.DialTimeout("tcp", b.url, b.timeout) if err != nil { return err } defer conn.Close() return writeMetrics(conn, mfs, b.useTags, b.prefix, model.Now()) } func writeMetrics(w io.Writer, mfs []*dto.MetricFamily, useTags bool, prefix string, now model.Time) error { vec, err := expfmt.ExtractSamples(&expfmt.DecodeOptions{ Timestamp: now, }, mfs...) if err != nil { return err } buf := bufio.NewWriter(w) for _, s := range vec { if prefix != "" { for _, c := range prefix { if _, err := buf.WriteRune(c); err != nil { return err } } if err := buf.WriteByte('.'); err != nil { return err } } if err := writeMetric(buf, s.Metric, useTags); err != nil { return err } if _, err := fmt.Fprintf(buf, " %g %d\n", s.Value, int64(s.Timestamp)/millisecondsPerSecond); err != nil { return err } if err := buf.Flush(); err != nil { return err } } return nil } func writeMetric(buf *bufio.Writer, m model.Metric, useTags bool) error { metricName, hasName := m[model.MetricNameLabel] numLabels := len(m) - 1 if !hasName { numLabels = len(m) } var err error switch numLabels { case 0: if hasName { return writeSanitized(buf, string(metricName)) } default: if err = writeSanitized(buf, string(metricName)); err != nil { return err } if useTags { return writeTags(buf, m) } return writeLabels(buf, m, numLabels) } return nil } func writeTags(buf *bufio.Writer, m model.Metric) error { for label, value := range m { if label != model.MetricNameLabel { buf.WriteRune(';') if _, err := buf.WriteString(string(label)); err != nil { return err } buf.WriteRune('=') if _, err := buf.WriteString(string(value)); err != nil { return err } } } return nil } func writeLabels(buf *bufio.Writer, m model.Metric, numLabels int) error { labelStrings := make([]string, 0, numLabels) for label, value := range m { if label != model.MetricNameLabel { labelString := string(label) + " " + string(value) labelStrings = append(labelStrings, labelString) } } sort.Strings(labelStrings) for _, s := range labelStrings { if err := buf.WriteByte('.'); err != nil { return err } if err := writeSanitized(buf, s); err != nil { return err } } return nil } func writeSanitized(buf *bufio.Writer, s string) error { prevUnderscore := false for _, c := range s { c = replaceInvalidRune(c) if c == '_' { if prevUnderscore { continue } prevUnderscore = true } else { prevUnderscore = false } if _, err := buf.WriteRune(c); err != nil { return err } } return nil } func replaceInvalidRune(c rune) rune { if c == ' ' { return '.' } if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == ':' || c == '-' || (c >= '0' && c <= '9')) { return '_' } return c } client_golang-1.19.1/prometheus/graphite/bridge_test.go000066400000000000000000000307111461713521000232320ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package graphite import ( "bufio" "bytes" "context" "fmt" "io" "log" "net" "os" "reflect" "regexp" "sort" "strings" "testing" "time" "github.com/prometheus/common/model" "github.com/prometheus/client_golang/prometheus" ) func TestSanitize(t *testing.T) { testCases := []struct { in, out string }{ {in: "hello", out: "hello"}, {in: "hE/l1o", out: "hE_l1o"}, {in: "he,*ll(.o", out: "he_ll_o"}, {in: "hello_there%^&", out: "hello_there_"}, {in: "hell-.o", out: "hell-_o"}, } var buf bytes.Buffer w := bufio.NewWriter(&buf) for i, tc := range testCases { if err := writeSanitized(w, tc.in); err != nil { t.Fatalf("write failed: %v", err) } if err := w.Flush(); err != nil { t.Fatalf("flush failed: %v", err) } if want, got := tc.out, buf.String(); want != got { t.Fatalf("test case index %d: got sanitized string %s, want %s", i, got, want) } buf.Reset() } } func TestWriteSummary(t *testing.T) { testWriteSummary(t, false) testWriteSummary(t, true) } func testWriteSummary(t *testing.T, useTags bool) { sumVec := prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, []string{"labelname"}, ) sumVec.WithLabelValues("val1").Observe(float64(10)) sumVec.WithLabelValues("val1").Observe(float64(20)) sumVec.WithLabelValues("val1").Observe(float64(30)) sumVec.WithLabelValues("val2").Observe(float64(20)) sumVec.WithLabelValues("val2").Observe(float64(30)) sumVec.WithLabelValues("val2").Observe(float64(40)) reg := prometheus.NewRegistry() reg.MustRegister(sumVec) mfs, err := reg.Gather() if err != nil { t.Fatalf("error: %v", err) } testCases := []struct { prefix string }{ {prefix: "prefix"}, {prefix: "pre/fix"}, {prefix: "pre.fix"}, {prefix: ""}, } var ( want = `%s.name.constname.constvalue.labelname.val1.quantile.0_5 20 1477043 %s.name.constname.constvalue.labelname.val1.quantile.0_9 30 1477043 %s.name.constname.constvalue.labelname.val1.quantile.0_99 30 1477043 %s.name_sum.constname.constvalue.labelname.val1 60 1477043 %s.name_count.constname.constvalue.labelname.val1 3 1477043 %s.name.constname.constvalue.labelname.val2.quantile.0_5 30 1477043 %s.name.constname.constvalue.labelname.val2.quantile.0_9 40 1477043 %s.name.constname.constvalue.labelname.val2.quantile.0_99 40 1477043 %s.name_sum.constname.constvalue.labelname.val2 90 1477043 %s.name_count.constname.constvalue.labelname.val2 3 1477043 ` wantTagged = `%s.name;constname=constvalue;labelname=val1;quantile=0.5 20 1477043 %s.name;constname=constvalue;labelname=val1;quantile=0.9 30 1477043 %s.name;constname=constvalue;labelname=val1;quantile=0.99 30 1477043 %s.name_sum;constname=constvalue;labelname=val1 60 1477043 %s.name_count;constname=constvalue;labelname=val1 3 1477043 %s.name;constname=constvalue;labelname=val2;quantile=0.5 30 1477043 %s.name;constname=constvalue;labelname=val2;quantile=0.9 40 1477043 %s.name;constname=constvalue;labelname=val2;quantile=0.99 40 1477043 %s.name_sum;constname=constvalue;labelname=val2 90 1477043 %s.name_count;constname=constvalue;labelname=val2 3 1477043 ` ) if useTags { want = wantTagged } for i, tc := range testCases { now := model.Time(1477043083) var buf bytes.Buffer err = writeMetrics(&buf, mfs, useTags, tc.prefix, now) if err != nil { t.Fatalf("error: %v", err) } var wantWithPrefix string if tc.prefix == "" { wantWithPrefix = strings.ReplaceAll(want, "%s.", "") } else { wantWithPrefix = fmt.Sprintf(want, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, ) } got := buf.String() if err := checkLinesAreEqual(wantWithPrefix, got, useTags); err != nil { t.Fatalf("test case index %d:\n%s", i, err.Error()) } } } func TestWriteHistogram(t *testing.T) { testWriteHistogram(t, false) testWriteHistogram(t, true) } func testWriteHistogram(t *testing.T, useTags bool) { histVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, Buckets: []float64{0.01, 0.02, 0.05, 0.1}, }, []string{"labelname"}, ) histVec.WithLabelValues("val1").Observe(float64(10)) histVec.WithLabelValues("val1").Observe(float64(20)) histVec.WithLabelValues("val1").Observe(float64(30)) histVec.WithLabelValues("val2").Observe(float64(20)) histVec.WithLabelValues("val2").Observe(float64(30)) histVec.WithLabelValues("val2").Observe(float64(40)) reg := prometheus.NewRegistry() reg.MustRegister(histVec) mfs, err := reg.Gather() if err != nil { t.Fatalf("error: %v", err) } now := model.Time(1477043083) var buf bytes.Buffer err = writeMetrics(&buf, mfs, useTags, "prefix", now) if err != nil { t.Fatalf("error: %v", err) } var ( want = `prefix.name_bucket.constname.constvalue.labelname.val1.le.0_01 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val1.le.0_02 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val1.le.0_05 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val1.le.0_1 0 1477043 prefix.name_sum.constname.constvalue.labelname.val1 60 1477043 prefix.name_count.constname.constvalue.labelname.val1 3 1477043 prefix.name_bucket.constname.constvalue.labelname.val1.le._Inf 3 1477043 prefix.name_bucket.constname.constvalue.labelname.val2.le.0_01 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val2.le.0_02 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val2.le.0_05 0 1477043 prefix.name_bucket.constname.constvalue.labelname.val2.le.0_1 0 1477043 prefix.name_sum.constname.constvalue.labelname.val2 90 1477043 prefix.name_count.constname.constvalue.labelname.val2 3 1477043 prefix.name_bucket.constname.constvalue.labelname.val2.le._Inf 3 1477043 ` wantTagged = `prefix.name_bucket;constname=constvalue;labelname=val1;le=0.01 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val1;le=0.02 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val1;le=0.05 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val1;le=0.1 0 1477043 prefix.name_sum;constname=constvalue;labelname=val1 60 1477043 prefix.name_count;constname=constvalue;labelname=val1 3 1477043 prefix.name_bucket;constname=constvalue;labelname=val1;le=+Inf 3 1477043 prefix.name_bucket;constname=constvalue;labelname=val2;le=0.01 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val2;le=0.02 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val2;le=0.05 0 1477043 prefix.name_bucket;constname=constvalue;labelname=val2;le=0.1 0 1477043 prefix.name_sum;constname=constvalue;labelname=val2 90 1477043 prefix.name_count;constname=constvalue;labelname=val2 3 1477043 prefix.name_bucket;constname=constvalue;labelname=val2;le=+Inf 3 1477043 ` ) if useTags { want = wantTagged } got := buf.String() if err := checkLinesAreEqual(want, got, useTags); err != nil { t.Fatalf(err.Error()) } } func TestToReader(t *testing.T) { testToReader(t, false) testToReader(t, true) } func testToReader(t *testing.T, useTags bool) { cntVec := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, }, []string{"labelname"}, ) cntVec.WithLabelValues("val1").Inc() cntVec.WithLabelValues("val2").Inc() reg := prometheus.NewRegistry() reg.MustRegister(cntVec) var ( want = `prefix.name.constname.constvalue.labelname.val1 1 1477043 prefix.name.constname.constvalue.labelname.val2 1 1477043 ` wantTagged = `prefix.name;constname=constvalue;labelname=val1 1 1477043 prefix.name;constname=constvalue;labelname=val2 1 1477043 ` ) if useTags { want = wantTagged } mfs, err := reg.Gather() if err != nil { t.Fatalf("error: %v", err) } now := model.Time(1477043083) var buf bytes.Buffer err = writeMetrics(&buf, mfs, useTags, "prefix", now) if err != nil { t.Fatalf("error: %v", err) } got := buf.String() if err := checkLinesAreEqual(want, got, useTags); err != nil { t.Fatalf(err.Error()) } } func checkLinesAreEqual(w, g string, useTags bool) error { if useTags { taggedLineRegexp := regexp.MustCompile(`;| `) wantLines, err := stringToLines(w) if err != nil { return err } gotLines, err := stringToLines(g) if err != nil { return err } for lineInd := range gotLines { var log string // Tagged metric, order of tags doesn't matter // m1 := "prefix.name;tag1=val1;tag2=val2 3 1477043" // m2 := "prefix.name;tag2=val2;tag1=val1 3 1477043" // m1 should be equal to m2 wantSplit := taggedLineRegexp.Split(wantLines[lineInd], -1) gotSplit := taggedLineRegexp.Split(gotLines[lineInd], -1) sort.Strings(wantSplit) sort.Strings(gotSplit) log += fmt.Sprintf("want: %v\ngot: %v\n\n", wantSplit, gotSplit) if !reflect.DeepEqual(wantSplit, gotSplit) { return fmt.Errorf(log) } } return nil } if w != g { return fmt.Errorf("wanted:\n\n%s\ngot:\n\n%s", w, g) } return nil } func stringToLines(s string) (lines []string, err error) { scanner := bufio.NewScanner(strings.NewReader(s)) for scanner.Scan() { lines = append(lines, scanner.Text()) } err = scanner.Err() return } func TestPush(t *testing.T) { reg := prometheus.NewRegistry() cntVec := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, }, []string{"labelname"}, ) cntVec.WithLabelValues("val1").Inc() cntVec.WithLabelValues("val2").Inc() reg.MustRegister(cntVec) host := "localhost" port := ":56789" b, err := NewBridge(&Config{ URL: host + port, Gatherer: reg, Prefix: "prefix", }) if err != nil { t.Fatalf("error creating bridge: %v", err) } nmg, err := newMockGraphite(port) if err != nil { t.Fatalf("error creating mock graphite: %v", err) } defer nmg.Close() err = b.Push() if err != nil { t.Fatalf("error pushing: %v", err) } wants := []string{ "prefix.name.constname.constvalue.labelname.val1 1", "prefix.name.constname.constvalue.labelname.val2 1", } select { case got := <-nmg.readc: for _, want := range wants { matched, err := regexp.MatchString(want, got) if err != nil { t.Fatalf("error pushing: %v", err) } if !matched { t.Fatalf("missing metric:\nno match for %s received by server:\n%s", want, got) } } return case err := <-nmg.errc: t.Fatalf("error reading push: %v", err) case <-time.After(50 * time.Millisecond): t.Fatalf("no result from graphite server") } } func newMockGraphite(port string) (*mockGraphite, error) { readc := make(chan string) errc := make(chan error) ln, err := net.Listen("tcp", port) if err != nil { return nil, err } go func() { conn, err := ln.Accept() if err != nil { errc <- err } var b bytes.Buffer io.Copy(&b, conn) readc <- b.String() }() return &mockGraphite{ readc: readc, errc: errc, Listener: ln, }, nil } type mockGraphite struct { readc chan string errc chan error net.Listener } func ExampleBridge() { b, err := NewBridge(&Config{ URL: "graphite.example.org:3099", Gatherer: prometheus.DefaultGatherer, Prefix: "prefix", Interval: 15 * time.Second, Timeout: 10 * time.Second, ErrorHandling: AbortOnError, Logger: log.New(os.Stdout, "graphite bridge: ", log.Lshortfile), }) if err != nil { panic(err) } go func() { // Start something in a goroutine that uses metrics. }() // Push initial metrics to Graphite. Fail fast if the push fails. if err := b.Push(); err != nil { panic(err) } // Create a Context to control stopping the Run() loop that pushes // metrics to Graphite. ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Start pushing metrics to Graphite in the Run() loop. b.Run(ctx) } client_golang-1.19.1/prometheus/histogram.go000066400000000000000000002011271461713521000211320ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "math" "runtime" "sort" "sync" "sync/atomic" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) // nativeHistogramBounds for the frac of observed values. Only relevant for // schema > 0. The position in the slice is the schema. (0 is never used, just // here for convenience of using the schema directly as the index.) // // TODO(beorn7): Currently, we do a binary search into these slices. There are // ways to turn it into a small number of simple array lookups. It probably only // matters for schema 5 and beyond, but should be investigated. See this comment // as a starting point: // https://github.com/open-telemetry/opentelemetry-specification/issues/1776#issuecomment-870164310 var nativeHistogramBounds = [][]float64{ // Schema "0": {0.5}, // Schema 1: {0.5, 0.7071067811865475}, // Schema 2: {0.5, 0.5946035575013605, 0.7071067811865475, 0.8408964152537144}, // Schema 3: { 0.5, 0.5452538663326288, 0.5946035575013605, 0.6484197773255048, 0.7071067811865475, 0.7711054127039704, 0.8408964152537144, 0.9170040432046711, }, // Schema 4: { 0.5, 0.5221368912137069, 0.5452538663326288, 0.5693943173783458, 0.5946035575013605, 0.620928906036742, 0.6484197773255048, 0.6771277734684463, 0.7071067811865475, 0.7384130729697496, 0.7711054127039704, 0.805245165974627, 0.8408964152537144, 0.8781260801866495, 0.9170040432046711, 0.9576032806985735, }, // Schema 5: { 0.5, 0.5109485743270583, 0.5221368912137069, 0.5335702003384117, 0.5452538663326288, 0.5571933712979462, 0.5693943173783458, 0.5818624293887887, 0.5946035575013605, 0.6076236799902344, 0.620928906036742, 0.6345254785958666, 0.6484197773255048, 0.6626183215798706, 0.6771277734684463, 0.6919549409819159, 0.7071067811865475, 0.7225904034885232, 0.7384130729697496, 0.7545822137967112, 0.7711054127039704, 0.7879904225539431, 0.805245165974627, 0.8228777390769823, 0.8408964152537144, 0.8593096490612387, 0.8781260801866495, 0.8973545375015533, 0.9170040432046711, 0.9370838170551498, 0.9576032806985735, 0.9785720620876999, }, // Schema 6: { 0.5, 0.5054446430258502, 0.5109485743270583, 0.5165124395106142, 0.5221368912137069, 0.5278225891802786, 0.5335702003384117, 0.5393803988785598, 0.5452538663326288, 0.5511912916539204, 0.5571933712979462, 0.5632608093041209, 0.5693943173783458, 0.5755946149764913, 0.5818624293887887, 0.5881984958251406, 0.5946035575013605, 0.6010783657263515, 0.6076236799902344, 0.6142402680534349, 0.620928906036742, 0.6276903785123455, 0.6345254785958666, 0.6414350080393891, 0.6484197773255048, 0.6554806057623822, 0.6626183215798706, 0.6698337620266515, 0.6771277734684463, 0.6845012114872953, 0.6919549409819159, 0.6994898362691555, 0.7071067811865475, 0.7148066691959849, 0.7225904034885232, 0.7304588970903234, 0.7384130729697496, 0.7464538641456323, 0.7545822137967112, 0.762799075372269, 0.7711054127039704, 0.7795022001189185, 0.7879904225539431, 0.7965710756711334, 0.805245165974627, 0.8140137109286738, 0.8228777390769823, 0.8318382901633681, 0.8408964152537144, 0.8500531768592616, 0.8593096490612387, 0.8686669176368529, 0.8781260801866495, 0.8876882462632604, 0.8973545375015533, 0.9071260877501991, 0.9170040432046711, 0.9269895625416926, 0.9370838170551498, 0.9472879907934827, 0.9576032806985735, 0.9680308967461471, 0.9785720620876999, 0.9892280131939752, }, // Schema 7: { 0.5, 0.5027149505564014, 0.5054446430258502, 0.5081891574554764, 0.5109485743270583, 0.5137229745593818, 0.5165124395106142, 0.5193170509806894, 0.5221368912137069, 0.5249720429003435, 0.5278225891802786, 0.5306886136446309, 0.5335702003384117, 0.5364674337629877, 0.5393803988785598, 0.5423091811066545, 0.5452538663326288, 0.5482145409081883, 0.5511912916539204, 0.5541842058618393, 0.5571933712979462, 0.5602188762048033, 0.5632608093041209, 0.5663192597993595, 0.5693943173783458, 0.572486072215902, 0.5755946149764913, 0.5787200368168754, 0.5818624293887887, 0.585021884841625, 0.5881984958251406, 0.5913923554921704, 0.5946035575013605, 0.5978321960199137, 0.6010783657263515, 0.6043421618132907, 0.6076236799902344, 0.6109230164863786, 0.6142402680534349, 0.6175755319684665, 0.620928906036742, 0.6243004885946023, 0.6276903785123455, 0.6310986751971253, 0.6345254785958666, 0.637970889198196, 0.6414350080393891, 0.6449179367033329, 0.6484197773255048, 0.6519406325959679, 0.6554806057623822, 0.659039800633032, 0.6626183215798706, 0.6662162735415805, 0.6698337620266515, 0.6734708931164728, 0.6771277734684463, 0.6808045103191123, 0.6845012114872953, 0.688217985377265, 0.6919549409819159, 0.6957121878859629, 0.6994898362691555, 0.7032879969095076, 0.7071067811865475, 0.7109463010845827, 0.7148066691959849, 0.718687998724491, 0.7225904034885232, 0.7265139979245261, 0.7304588970903234, 0.7344252166684908, 0.7384130729697496, 0.7424225829363761, 0.7464538641456323, 0.7505070348132126, 0.7545822137967112, 0.7586795205991071, 0.762799075372269, 0.7669409989204777, 0.7711054127039704, 0.7752924388424999, 0.7795022001189185, 0.7837348199827764, 0.7879904225539431, 0.7922691326262467, 0.7965710756711334, 0.8008963778413465, 0.805245165974627, 0.8096175675974316, 0.8140137109286738, 0.8184337248834821, 0.8228777390769823, 0.8273458838280969, 0.8318382901633681, 0.8363550898207981, 0.8408964152537144, 0.8454623996346523, 0.8500531768592616, 0.8546688815502312, 0.8593096490612387, 0.8639756154809185, 0.8686669176368529, 0.8733836930995842, 0.8781260801866495, 0.8828942179666361, 0.8876882462632604, 0.8925083056594671, 0.8973545375015533, 0.9022270839033115, 0.9071260877501991, 0.9120516927035263, 0.9170040432046711, 0.9219832844793128, 0.9269895625416926, 0.9320230241988943, 0.9370838170551498, 0.9421720895161669, 0.9472879907934827, 0.9524316709088368, 0.9576032806985735, 0.9628029718180622, 0.9680308967461471, 0.9732872087896164, 0.9785720620876999, 0.9838856116165875, 0.9892280131939752, 0.9945994234836328, }, // Schema 8: { 0.5, 0.5013556375251013, 0.5027149505564014, 0.5040779490592088, 0.5054446430258502, 0.5068150424757447, 0.5081891574554764, 0.509566998038869, 0.5109485743270583, 0.5123338964485679, 0.5137229745593818, 0.5151158188430205, 0.5165124395106142, 0.5179128468009786, 0.5193170509806894, 0.520725062344158, 0.5221368912137069, 0.5235525479396449, 0.5249720429003435, 0.526395386502313, 0.5278225891802786, 0.5292536613972564, 0.5306886136446309, 0.5321274564422321, 0.5335702003384117, 0.5350168559101208, 0.5364674337629877, 0.5379219445313954, 0.5393803988785598, 0.5408428074966075, 0.5423091811066545, 0.5437795304588847, 0.5452538663326288, 0.5467321995364429, 0.5482145409081883, 0.549700901315111, 0.5511912916539204, 0.5526857228508706, 0.5541842058618393, 0.5556867516724088, 0.5571933712979462, 0.5587040757836845, 0.5602188762048033, 0.5617377836665098, 0.5632608093041209, 0.564787964283144, 0.5663192597993595, 0.5678547070789026, 0.5693943173783458, 0.5709381019847808, 0.572486072215902, 0.5740382394200894, 0.5755946149764913, 0.5771552102951081, 0.5787200368168754, 0.5802891060137493, 0.5818624293887887, 0.5834400184762408, 0.585021884841625, 0.5866080400818185, 0.5881984958251406, 0.5897932637314379, 0.5913923554921704, 0.5929957828304968, 0.5946035575013605, 0.5962156912915756, 0.5978321960199137, 0.5994530835371903, 0.6010783657263515, 0.6027080545025619, 0.6043421618132907, 0.6059806996384005, 0.6076236799902344, 0.6092711149137041, 0.6109230164863786, 0.6125793968185725, 0.6142402680534349, 0.6159056423670379, 0.6175755319684665, 0.6192499490999082, 0.620928906036742, 0.622612415087629, 0.6243004885946023, 0.6259931389331581, 0.6276903785123455, 0.6293922197748583, 0.6310986751971253, 0.6328097572894031, 0.6345254785958666, 0.6362458516947014, 0.637970889198196, 0.6397006037528346, 0.6414350080393891, 0.6431741147730128, 0.6449179367033329, 0.6466664866145447, 0.6484197773255048, 0.6501778216898253, 0.6519406325959679, 0.6537082229673385, 0.6554806057623822, 0.6572577939746774, 0.659039800633032, 0.6608266388015788, 0.6626183215798706, 0.6644148621029772, 0.6662162735415805, 0.6680225691020727, 0.6698337620266515, 0.6716498655934177, 0.6734708931164728, 0.6752968579460171, 0.6771277734684463, 0.6789636531064505, 0.6808045103191123, 0.6826503586020058, 0.6845012114872953, 0.6863570825438342, 0.688217985377265, 0.690083933630119, 0.6919549409819159, 0.6938310211492645, 0.6957121878859629, 0.6975984549830999, 0.6994898362691555, 0.7013863456101023, 0.7032879969095076, 0.7051948041086352, 0.7071067811865475, 0.7090239421602076, 0.7109463010845827, 0.7128738720527471, 0.7148066691959849, 0.7167447066838943, 0.718687998724491, 0.7206365595643126, 0.7225904034885232, 0.7245495448210174, 0.7265139979245261, 0.7284837772007218, 0.7304588970903234, 0.7324393720732029, 0.7344252166684908, 0.7364164454346837, 0.7384130729697496, 0.7404151139112358, 0.7424225829363761, 0.7444354947621984, 0.7464538641456323, 0.7484777058836176, 0.7505070348132126, 0.7525418658117031, 0.7545822137967112, 0.7566280937263048, 0.7586795205991071, 0.7607365094544071, 0.762799075372269, 0.7648672334736434, 0.7669409989204777, 0.7690203869158282, 0.7711054127039704, 0.7731960915705107, 0.7752924388424999, 0.7773944698885442, 0.7795022001189185, 0.7816156449856788, 0.7837348199827764, 0.7858597406461707, 0.7879904225539431, 0.7901268813264122, 0.7922691326262467, 0.7944171921585818, 0.7965710756711334, 0.7987307989543135, 0.8008963778413465, 0.8030678282083853, 0.805245165974627, 0.8074284071024302, 0.8096175675974316, 0.8118126635086642, 0.8140137109286738, 0.8162207259936375, 0.8184337248834821, 0.820652723822003, 0.8228777390769823, 0.8251087869603088, 0.8273458838280969, 0.8295890460808079, 0.8318382901633681, 0.8340936325652911, 0.8363550898207981, 0.8386226785089391, 0.8408964152537144, 0.8431763167241966, 0.8454623996346523, 0.8477546807446661, 0.8500531768592616, 0.8523579048290255, 0.8546688815502312, 0.8569861239649629, 0.8593096490612387, 0.8616394738731368, 0.8639756154809185, 0.8663180910111553, 0.8686669176368529, 0.871022112577578, 0.8733836930995842, 0.8757516765159389, 0.8781260801866495, 0.8805069215187917, 0.8828942179666361, 0.8852879870317771, 0.8876882462632604, 0.890095013257712, 0.8925083056594671, 0.8949281411607002, 0.8973545375015533, 0.8997875124702672, 0.9022270839033115, 0.9046732696855155, 0.9071260877501991, 0.909585556079304, 0.9120516927035263, 0.9145245157024483, 0.9170040432046711, 0.9194902933879467, 0.9219832844793128, 0.9244830347552253, 0.9269895625416926, 0.92950288621441, 0.9320230241988943, 0.9345499949706191, 0.9370838170551498, 0.93962450902828, 0.9421720895161669, 0.9447265771954693, 0.9472879907934827, 0.9498563490882775, 0.9524316709088368, 0.9550139751351947, 0.9576032806985735, 0.9601996065815236, 0.9628029718180622, 0.9654133954938133, 0.9680308967461471, 0.9706554947643201, 0.9732872087896164, 0.9759260581154889, 0.9785720620876999, 0.9812252401044634, 0.9838856116165875, 0.9865531961276168, 0.9892280131939752, 0.9919100824251095, 0.9945994234836328, 0.9972960560854698, }, } // The nativeHistogramBounds above can be generated with the code below. // // TODO(beorn7): It's tempting to actually use `go generate` to generate the // code above. However, this could lead to slightly different numbers on // different architectures. We still need to come to terms if we are fine with // that, or if we might prefer to specify precise numbers in the standard. // // var nativeHistogramBounds [][]float64 = make([][]float64, 9) // // func init() { // // Populate nativeHistogramBounds. // numBuckets := 1 // for i := range nativeHistogramBounds { // bounds := []float64{0.5} // factor := math.Exp2(math.Exp2(float64(-i))) // for j := 0; j < numBuckets-1; j++ { // var bound float64 // if (j+1)%2 == 0 { // // Use previously calculated value for increased precision. // bound = nativeHistogramBounds[i-1][j/2+1] // } else { // bound = bounds[j] * factor // } // bounds = append(bounds, bound) // } // numBuckets *= 2 // nativeHistogramBounds[i] = bounds // } // } // A Histogram counts individual observations from an event or sample stream in // configurable static buckets (or in dynamic sparse buckets as part of the // experimental Native Histograms, see below for more details). Similar to a // Summary, it also provides a sum of observations and an observation count. // // On the Prometheus server, quantiles can be calculated from a Histogram using // the histogram_quantile PromQL function. // // Note that Histograms, in contrast to Summaries, can be aggregated in PromQL // (see the documentation for detailed procedures). However, Histograms require // the user to pre-define suitable buckets, and they are in general less // accurate. (Both problems are addressed by the experimental Native // Histograms. To use them, configure a NativeHistogramBucketFactor in the // HistogramOpts. They also require a Prometheus server v2.40+ with the // corresponding feature flag enabled.) // // The Observe method of a Histogram has a very low performance overhead in // comparison with the Observe method of a Summary. // // To create Histogram instances, use NewHistogram. type Histogram interface { Metric Collector // Observe adds a single observation to the histogram. Observations are // usually positive or zero. Negative observations are accepted but // prevent current versions of Prometheus from properly detecting // counter resets in the sum of observations. (The experimental Native // Histograms handle negative observations properly.) See // https://prometheus.io/docs/practices/histograms/#count-and-sum-of-observations // for details. Observe(float64) } // bucketLabel is used for the label that defines the upper bound of a // bucket of a histogram ("le" -> "less or equal"). const bucketLabel = "le" // DefBuckets are the default Histogram buckets. The default buckets are // tailored to broadly measure the response time (in seconds) of a network // service. Most likely, however, you will be required to define buckets // customized to your use case. var DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} // DefNativeHistogramZeroThreshold is the default value for // NativeHistogramZeroThreshold in the HistogramOpts. // // The value is 2^-128 (or 0.5*2^-127 in the actual IEEE 754 representation), // which is a bucket boundary at all possible resolutions. const DefNativeHistogramZeroThreshold = 2.938735877055719e-39 // NativeHistogramZeroThresholdZero can be used as NativeHistogramZeroThreshold // in the HistogramOpts to create a zero bucket of width zero, i.e. a zero // bucket that only receives observations of precisely zero. const NativeHistogramZeroThresholdZero = -1 var errBucketLabelNotAllowed = fmt.Errorf( "%q is not allowed as label name in histograms", bucketLabel, ) // LinearBuckets creates 'count' regular buckets, each 'width' wide, where the // lowest bucket has an upper bound of 'start'. The final +Inf bucket is not // counted and not included in the returned slice. The returned slice is meant // to be used for the Buckets field of HistogramOpts. // // The function panics if 'count' is zero or negative. func LinearBuckets(start, width float64, count int) []float64 { if count < 1 { panic("LinearBuckets needs a positive count") } buckets := make([]float64, count) for i := range buckets { buckets[i] = start start += width } return buckets } // ExponentialBuckets creates 'count' regular buckets, where the lowest bucket // has an upper bound of 'start' and each following bucket's upper bound is // 'factor' times the previous bucket's upper bound. The final +Inf bucket is // not counted and not included in the returned slice. The returned slice is // meant to be used for the Buckets field of HistogramOpts. // // The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, // or if 'factor' is less than or equal 1. func ExponentialBuckets(start, factor float64, count int) []float64 { if count < 1 { panic("ExponentialBuckets needs a positive count") } if start <= 0 { panic("ExponentialBuckets needs a positive start value") } if factor <= 1 { panic("ExponentialBuckets needs a factor greater than 1") } buckets := make([]float64, count) for i := range buckets { buckets[i] = start start *= factor } return buckets } // ExponentialBucketsRange creates 'count' buckets, where the lowest bucket is // 'min' and the highest bucket is 'max'. The final +Inf bucket is not counted // and not included in the returned slice. The returned slice is meant to be // used for the Buckets field of HistogramOpts. // // The function panics if 'count' is 0 or negative, if 'min' is 0 or negative. func ExponentialBucketsRange(min, max float64, count int) []float64 { if count < 1 { panic("ExponentialBucketsRange count needs a positive count") } if min <= 0 { panic("ExponentialBucketsRange min needs to be greater than 0") } // Formula for exponential buckets. // max = min*growthFactor^(bucketCount-1) // We know max/min and highest bucket. Solve for growthFactor. growthFactor := math.Pow(max/min, 1.0/float64(count-1)) // Now that we know growthFactor, solve for each bucket. buckets := make([]float64, count) for i := 1; i <= count; i++ { buckets[i-1] = min * math.Pow(growthFactor, float64(i-1)) } return buckets } // HistogramOpts bundles the options for creating a Histogram metric. It is // mandatory to set Name to a non-empty string. All other fields are optional // and can safely be left at their zero value, although it is strongly // encouraged to set a Help string. type HistogramOpts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Histogram (created by joining these components with // "_"). Only Name is mandatory, the others merely help structuring the // name. Note that the fully-qualified name of the Histogram must be a // valid Prometheus metric name. Namespace string Subsystem string Name string // Help provides information about this Histogram. // // Metrics with the same fully-qualified name must have the same Help // string. Help string // ConstLabels are used to attach fixed labels to this metric. Metrics // with the same fully-qualified name must have the same label names in // their ConstLabels. // // ConstLabels are only used rarely. In particular, do not use them to // attach the same labels to all your metrics. Those use cases are // better covered by target labels set by the scraping Prometheus // server, or by one specific metric (e.g. a build_info or a // machine_role metric). See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels // Buckets defines the buckets into which observations are counted. Each // element in the slice is the upper inclusive bound of a bucket. The // values must be sorted in strictly increasing order. There is no need // to add a highest bucket with +Inf bound, it will be added // implicitly. If Buckets is left as nil or set to a slice of length // zero, it is replaced by default buckets. The default buckets are // DefBuckets if no buckets for a native histogram (see below) are used, // otherwise the default is no buckets. (In other words, if you want to // use both regular buckets and buckets for a native histogram, you have // to define the regular buckets here explicitly.) Buckets []float64 // If NativeHistogramBucketFactor is greater than one, so-called sparse // buckets are used (in addition to the regular buckets, if defined // above). A Histogram with sparse buckets will be ingested as a Native // Histogram by a Prometheus server with that feature enabled (requires // Prometheus v2.40+). Sparse buckets are exponential buckets covering // the whole float64 range (with the exception of the “zero” bucket, see // NativeHistogramZeroThreshold below). From any one bucket to the next, // the width of the bucket grows by a constant // factor. NativeHistogramBucketFactor provides an upper bound for this // factor (exception see below). The smaller // NativeHistogramBucketFactor, the more buckets will be used and thus // the more costly the histogram will become. A generally good trade-off // between cost and accuracy is a value of 1.1 (each bucket is at most // 10% wider than the previous one), which will result in each power of // two divided into 8 buckets (e.g. there will be 8 buckets between 1 // and 2, same as between 2 and 4, and 4 and 8, etc.). // // Details about the actually used factor: The factor is calculated as // 2^(2^-n), where n is an integer number between (and including) -4 and // 8. n is chosen so that the resulting factor is the largest that is // still smaller or equal to NativeHistogramBucketFactor. Note that the // smallest possible factor is therefore approx. 1.00271 (i.e. 2^(2^-8) // ). If NativeHistogramBucketFactor is greater than 1 but smaller than // 2^(2^-8), then the actually used factor is still 2^(2^-8) even though // it is larger than the provided NativeHistogramBucketFactor. // // NOTE: Native Histograms are still an experimental feature. Their // behavior might still change without a major version // bump. Subsequently, all NativeHistogram... options here might still // change their behavior or name (or might completely disappear) without // a major version bump. NativeHistogramBucketFactor float64 // All observations with an absolute value of less or equal // NativeHistogramZeroThreshold are accumulated into a “zero” bucket. // For best results, this should be close to a bucket boundary. This is // usually the case if picking a power of two. If // NativeHistogramZeroThreshold is left at zero, // DefNativeHistogramZeroThreshold is used as the threshold. To // configure a zero bucket with an actual threshold of zero (i.e. only // observations of precisely zero will go into the zero bucket), set // NativeHistogramZeroThreshold to the NativeHistogramZeroThresholdZero // constant (or any negative float value). NativeHistogramZeroThreshold float64 // The remaining fields define a strategy to limit the number of // populated sparse buckets. If NativeHistogramMaxBucketNumber is left // at zero, the number of buckets is not limited. (Note that this might // lead to unbounded memory consumption if the values observed by the // Histogram are sufficiently wide-spread. In particular, this could be // used as a DoS attack vector. Where the observed values depend on // external inputs, it is highly recommended to set a // NativeHistogramMaxBucketNumber.) Once the set // NativeHistogramMaxBucketNumber is exceeded, the following strategy is // enacted: // - First, if the last reset (or the creation) of the histogram is at // least NativeHistogramMinResetDuration ago, then the whole // histogram is reset to its initial state (including regular // buckets). // - If less time has passed, or if NativeHistogramMinResetDuration is // zero, no reset is performed. Instead, the zero threshold is // increased sufficiently to reduce the number of buckets to or below // NativeHistogramMaxBucketNumber, but not to more than // NativeHistogramMaxZeroThreshold. Thus, if // NativeHistogramMaxZeroThreshold is already at or below the current // zero threshold, nothing happens at this step. // - After that, if the number of buckets still exceeds // NativeHistogramMaxBucketNumber, the resolution of the histogram is // reduced by doubling the width of the sparse buckets (up to a // growth factor between one bucket to the next of 2^(2^4) = 65536, // see above). // - Any increased zero threshold or reduced resolution is reset back // to their original values once NativeHistogramMinResetDuration has // passed (since the last reset or the creation of the histogram). NativeHistogramMaxBucketNumber uint32 NativeHistogramMinResetDuration time.Duration NativeHistogramMaxZeroThreshold float64 // now is for testing purposes, by default it's time.Now. now func() time.Time // afterFunc is for testing purposes, by default it's time.AfterFunc. afterFunc func(time.Duration, func()) *time.Timer } // HistogramVecOpts bundles the options to create a HistogramVec metric. // It is mandatory to set HistogramOpts, see there for mandatory fields. VariableLabels // is optional and can safely be left to its default value. type HistogramVecOpts struct { HistogramOpts // VariableLabels are used to partition the metric vector by the given set // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } // NewHistogram creates a new Histogram based on the provided HistogramOpts. It // panics if the buckets in HistogramOpts are not in strictly increasing order. // // The returned implementation also implements ExemplarObserver. It is safe to // perform the corresponding type assertion. Exemplars are tracked separately // for each bucket. func NewHistogram(opts HistogramOpts) Histogram { return newHistogram( NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ), opts, ) } func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels.names) != len(labelValues) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } for _, n := range desc.variableLabels.names { if n == bucketLabel { panic(errBucketLabelNotAllowed) } } for _, lp := range desc.constLabelPairs { if lp.GetName() == bucketLabel { panic(errBucketLabelNotAllowed) } } if opts.now == nil { opts.now = time.Now } if opts.afterFunc == nil { opts.afterFunc = time.AfterFunc } h := &histogram{ desc: desc, upperBounds: opts.Buckets, labelPairs: MakeLabelPairs(desc, labelValues), nativeHistogramMaxBuckets: opts.NativeHistogramMaxBucketNumber, nativeHistogramMaxZeroThreshold: opts.NativeHistogramMaxZeroThreshold, nativeHistogramMinResetDuration: opts.NativeHistogramMinResetDuration, lastResetTime: opts.now(), now: opts.now, afterFunc: opts.afterFunc, } if len(h.upperBounds) == 0 && opts.NativeHistogramBucketFactor <= 1 { h.upperBounds = DefBuckets } if opts.NativeHistogramBucketFactor <= 1 { h.nativeHistogramSchema = math.MinInt32 // To mark that there are no sparse buckets. } else { switch { case opts.NativeHistogramZeroThreshold > 0: h.nativeHistogramZeroThreshold = opts.NativeHistogramZeroThreshold case opts.NativeHistogramZeroThreshold == 0: h.nativeHistogramZeroThreshold = DefNativeHistogramZeroThreshold } // Leave h.nativeHistogramZeroThreshold at 0 otherwise. h.nativeHistogramSchema = pickSchema(opts.NativeHistogramBucketFactor) } for i, upperBound := range h.upperBounds { if i < len(h.upperBounds)-1 { if upperBound >= h.upperBounds[i+1] { panic(fmt.Errorf( "histogram buckets must be in increasing order: %f >= %f", upperBound, h.upperBounds[i+1], )) } } else { if math.IsInf(upperBound, +1) { // The +Inf bucket is implicit. Remove it here. h.upperBounds = h.upperBounds[:i] } } } // Finally we know the final length of h.upperBounds and can make buckets // for both counts as well as exemplars: h.counts[0] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} atomic.StoreUint64(&h.counts[0].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) atomic.StoreInt32(&h.counts[0].nativeHistogramSchema, h.nativeHistogramSchema) h.counts[1] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} atomic.StoreUint64(&h.counts[1].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) atomic.StoreInt32(&h.counts[1].nativeHistogramSchema, h.nativeHistogramSchema) h.exemplars = make([]atomic.Value, len(h.upperBounds)+1) h.init(h) // Init self-collection. return h } type histogramCounts struct { // Order in this struct matters for the alignment required by atomic // operations, see http://golang.org/pkg/sync/atomic/#pkg-note-BUG // sumBits contains the bits of the float64 representing the sum of all // observations. sumBits uint64 count uint64 // nativeHistogramZeroBucket counts all (positive and negative) // observations in the zero bucket (with an absolute value less or equal // the current threshold, see next field. nativeHistogramZeroBucket uint64 // nativeHistogramZeroThresholdBits is the bit pattern of the current // threshold for the zero bucket. It's initially equal to // nativeHistogramZeroThreshold but may change according to the bucket // count limitation strategy. nativeHistogramZeroThresholdBits uint64 // nativeHistogramSchema may change over time according to the bucket // count limitation strategy and therefore has to be saved here. nativeHistogramSchema int32 // Number of (positive and negative) sparse buckets. nativeHistogramBucketsNumber uint32 // Regular buckets. buckets []uint64 // The sparse buckets for native histograms are implemented with a // sync.Map for now. A dedicated data structure will likely be more // efficient. There are separate maps for negative and positive // observations. The map's value is an *int64, counting observations in // that bucket. (Note that we don't use uint64 as an int64 won't // overflow in practice, and working with signed numbers from the // beginning simplifies the handling of deltas.) The map's key is the // index of the bucket according to the used // nativeHistogramSchema. Index 0 is for an upper bound of 1. nativeHistogramBucketsPositive, nativeHistogramBucketsNegative sync.Map } // observe manages the parts of observe that only affects // histogramCounts. doSparse is true if sparse buckets should be done, // too. func (hc *histogramCounts) observe(v float64, bucket int, doSparse bool) { if bucket < len(hc.buckets) { atomic.AddUint64(&hc.buckets[bucket], 1) } atomicAddFloat(&hc.sumBits, v) if doSparse && !math.IsNaN(v) { var ( key int schema = atomic.LoadInt32(&hc.nativeHistogramSchema) zeroThreshold = math.Float64frombits(atomic.LoadUint64(&hc.nativeHistogramZeroThresholdBits)) bucketCreated, isInf bool ) if math.IsInf(v, 0) { // Pretend v is MaxFloat64 but later increment key by one. if math.IsInf(v, +1) { v = math.MaxFloat64 } else { v = -math.MaxFloat64 } isInf = true } frac, exp := math.Frexp(math.Abs(v)) if schema > 0 { bounds := nativeHistogramBounds[schema] key = sort.SearchFloat64s(bounds, frac) + (exp-1)*len(bounds) } else { key = exp if frac == 0.5 { key-- } offset := (1 << -schema) - 1 key = (key + offset) >> -schema } if isInf { key++ } switch { case v > zeroThreshold: bucketCreated = addToBucket(&hc.nativeHistogramBucketsPositive, key, 1) case v < -zeroThreshold: bucketCreated = addToBucket(&hc.nativeHistogramBucketsNegative, key, 1) default: atomic.AddUint64(&hc.nativeHistogramZeroBucket, 1) } if bucketCreated { atomic.AddUint32(&hc.nativeHistogramBucketsNumber, 1) } } // Increment count last as we take it as a signal that the observation // is complete. atomic.AddUint64(&hc.count, 1) } type histogram struct { // countAndHotIdx enables lock-free writes with use of atomic updates. // The most significant bit is the hot index [0 or 1] of the count field // below. Observe calls update the hot one. All remaining bits count the // number of Observe calls. Observe starts by incrementing this counter, // and finish by incrementing the count field in the respective // histogramCounts, as a marker for completion. // // Calls of the Write method (which are non-mutating reads from the // perspective of the histogram) swap the hot–cold under the writeMtx // lock. A cooldown is awaited (while locked) by comparing the number of // observations with the initiation count. Once they match, then the // last observation on the now cool one has completed. All cold fields must // be merged into the new hot before releasing writeMtx. // // Fields with atomic access first! See alignment constraint: // http://golang.org/pkg/sync/atomic/#pkg-note-BUG countAndHotIdx uint64 selfCollector desc *Desc // Only used in the Write method and for sparse bucket management. mtx sync.Mutex // Two counts, one is "hot" for lock-free observations, the other is // "cold" for writing out a dto.Metric. It has to be an array of // pointers to guarantee 64bit alignment of the histogramCounts, see // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. counts [2]*histogramCounts upperBounds []float64 labelPairs []*dto.LabelPair exemplars []atomic.Value // One more than buckets (to include +Inf), each a *dto.Exemplar. nativeHistogramSchema int32 // The initial schema. Set to math.MinInt32 if no sparse buckets are used. nativeHistogramZeroThreshold float64 // The initial zero threshold. nativeHistogramMaxZeroThreshold float64 nativeHistogramMaxBuckets uint32 nativeHistogramMinResetDuration time.Duration // lastResetTime is protected by mtx. It is also used as created timestamp. lastResetTime time.Time // resetScheduled is protected by mtx. It is true if a reset is // scheduled for a later time (when nativeHistogramMinResetDuration has // passed). resetScheduled bool // now is for testing purposes, by default it's time.Now. now func() time.Time // afterFunc is for testing purposes, by default it's time.AfterFunc. afterFunc func(time.Duration, func()) *time.Timer } func (h *histogram) Desc() *Desc { return h.desc } func (h *histogram) Observe(v float64) { h.observe(v, h.findBucket(v)) } func (h *histogram) ObserveWithExemplar(v float64, e Labels) { i := h.findBucket(v) h.observe(v, i) h.updateExemplar(v, i, e) } func (h *histogram) Write(out *dto.Metric) error { // For simplicity, we protect this whole method by a mutex. It is not in // the hot path, i.e. Observe is called much more often than Write. The // complication of making Write lock-free isn't worth it, if possible at // all. h.mtx.Lock() defer h.mtx.Unlock() // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) // without touching the count bits. See the struct comments for a full // description of the algorithm. n := atomic.AddUint64(&h.countAndHotIdx, 1<<63) // count is contained unchanged in the lower 63 bits. count := n & ((1 << 63) - 1) // The most significant bit tells us which counts is hot. The complement // is thus the cold one. hotCounts := h.counts[n>>63] coldCounts := h.counts[(^n)>>63] waitForCooldown(count, coldCounts) his := &dto.Histogram{ Bucket: make([]*dto.Bucket, len(h.upperBounds)), SampleCount: proto.Uint64(count), SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), CreatedTimestamp: timestamppb.New(h.lastResetTime), } out.Histogram = his out.Label = h.labelPairs var cumCount uint64 for i, upperBound := range h.upperBounds { cumCount += atomic.LoadUint64(&coldCounts.buckets[i]) his.Bucket[i] = &dto.Bucket{ CumulativeCount: proto.Uint64(cumCount), UpperBound: proto.Float64(upperBound), } if e := h.exemplars[i].Load(); e != nil { his.Bucket[i].Exemplar = e.(*dto.Exemplar) } } // If there is an exemplar for the +Inf bucket, we have to add that bucket explicitly. if e := h.exemplars[len(h.upperBounds)].Load(); e != nil { b := &dto.Bucket{ CumulativeCount: proto.Uint64(count), UpperBound: proto.Float64(math.Inf(1)), Exemplar: e.(*dto.Exemplar), } his.Bucket = append(his.Bucket, b) } if h.nativeHistogramSchema > math.MinInt32 { his.ZeroThreshold = proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.nativeHistogramZeroThresholdBits))) his.Schema = proto.Int32(atomic.LoadInt32(&coldCounts.nativeHistogramSchema)) zeroBucket := atomic.LoadUint64(&coldCounts.nativeHistogramZeroBucket) defer func() { coldCounts.nativeHistogramBucketsPositive.Range(addAndReset(&hotCounts.nativeHistogramBucketsPositive, &hotCounts.nativeHistogramBucketsNumber)) coldCounts.nativeHistogramBucketsNegative.Range(addAndReset(&hotCounts.nativeHistogramBucketsNegative, &hotCounts.nativeHistogramBucketsNumber)) }() his.ZeroCount = proto.Uint64(zeroBucket) his.NegativeSpan, his.NegativeDelta = makeBuckets(&coldCounts.nativeHistogramBucketsNegative) his.PositiveSpan, his.PositiveDelta = makeBuckets(&coldCounts.nativeHistogramBucketsPositive) // Add a no-op span to a histogram without observations and with // a zero threshold of zero. Otherwise, a native histogram would // look like a classic histogram to scrapers. if *his.ZeroThreshold == 0 && *his.ZeroCount == 0 && len(his.PositiveSpan) == 0 && len(his.NegativeSpan) == 0 { his.PositiveSpan = []*dto.BucketSpan{{ Offset: proto.Int32(0), Length: proto.Uint32(0), }} } } addAndResetCounts(hotCounts, coldCounts) return nil } // findBucket returns the index of the bucket for the provided value, or // len(h.upperBounds) for the +Inf bucket. func (h *histogram) findBucket(v float64) int { // TODO(beorn7): For small numbers of buckets (<30), a linear search is // slightly faster than the binary search. If we really care, we could // switch from one search strategy to the other depending on the number // of buckets. // // Microbenchmarks (BenchmarkHistogramNoLabels): // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op // 300 buckets: 154 ns/op linear - binary 61.6 ns/op return sort.SearchFloat64s(h.upperBounds, v) } // observe is the implementation for Observe without the findBucket part. func (h *histogram) observe(v float64, bucket int) { // Do not add to sparse buckets for NaN observations. doSparse := h.nativeHistogramSchema > math.MinInt32 && !math.IsNaN(v) // We increment h.countAndHotIdx so that the counter in the lower // 63 bits gets incremented. At the same time, we get the new value // back, which we can use to find the currently-hot counts. n := atomic.AddUint64(&h.countAndHotIdx, 1) hotCounts := h.counts[n>>63] hotCounts.observe(v, bucket, doSparse) if doSparse { h.limitBuckets(hotCounts, v, bucket) } } // limitBuckets applies a strategy to limit the number of populated sparse // buckets. It's generally best effort, and there are situations where the // number can go higher (if even the lowest resolution isn't enough to reduce // the number sufficiently, or if the provided counts aren't fully updated yet // by a concurrently happening Write call). func (h *histogram) limitBuckets(counts *histogramCounts, value float64, bucket int) { if h.nativeHistogramMaxBuckets == 0 { return // No limit configured. } if h.nativeHistogramMaxBuckets >= atomic.LoadUint32(&counts.nativeHistogramBucketsNumber) { return // Bucket limit not exceeded yet. } h.mtx.Lock() defer h.mtx.Unlock() // The hot counts might have been swapped just before we acquired the // lock. Re-fetch the hot counts first... n := atomic.LoadUint64(&h.countAndHotIdx) hotIdx := n >> 63 coldIdx := (^n) >> 63 hotCounts := h.counts[hotIdx] coldCounts := h.counts[coldIdx] // ...and then check again if we really have to reduce the bucket count. if h.nativeHistogramMaxBuckets >= atomic.LoadUint32(&hotCounts.nativeHistogramBucketsNumber) { return // Bucket limit not exceeded after all. } // Try the various strategies in order. if h.maybeReset(hotCounts, coldCounts, coldIdx, value, bucket) { return } // One of the other strategies will happen. To undo what they will do as // soon as enough time has passed to satisfy // h.nativeHistogramMinResetDuration, schedule a reset at the right time // if we haven't done so already. if h.nativeHistogramMinResetDuration > 0 && !h.resetScheduled { h.resetScheduled = true h.afterFunc(h.nativeHistogramMinResetDuration-h.now().Sub(h.lastResetTime), h.reset) } if h.maybeWidenZeroBucket(hotCounts, coldCounts) { return } h.doubleBucketWidth(hotCounts, coldCounts) } // maybeReset resets the whole histogram if at least // h.nativeHistogramMinResetDuration has been passed. It returns true if the // histogram has been reset. The caller must have locked h.mtx. func (h *histogram) maybeReset( hot, cold *histogramCounts, coldIdx uint64, value float64, bucket int, ) bool { // We are using the possibly mocked h.now() rather than // time.Since(h.lastResetTime) to enable testing. if h.nativeHistogramMinResetDuration == 0 || // No reset configured. h.resetScheduled || // Do not interefere if a reset is already scheduled. h.now().Sub(h.lastResetTime) < h.nativeHistogramMinResetDuration { return false } // Completely reset coldCounts. h.resetCounts(cold) // Repeat the latest observation to not lose it completely. cold.observe(value, bucket, true) // Make coldCounts the new hot counts while resetting countAndHotIdx. n := atomic.SwapUint64(&h.countAndHotIdx, (coldIdx<<63)+1) count := n & ((1 << 63) - 1) waitForCooldown(count, hot) // Finally, reset the formerly hot counts, too. h.resetCounts(hot) h.lastResetTime = h.now() return true } // reset resets the whole histogram. It locks h.mtx itself, i.e. it has to be // called without having locked h.mtx. func (h *histogram) reset() { h.mtx.Lock() defer h.mtx.Unlock() n := atomic.LoadUint64(&h.countAndHotIdx) hotIdx := n >> 63 coldIdx := (^n) >> 63 hot := h.counts[hotIdx] cold := h.counts[coldIdx] // Completely reset coldCounts. h.resetCounts(cold) // Make coldCounts the new hot counts while resetting countAndHotIdx. n = atomic.SwapUint64(&h.countAndHotIdx, coldIdx<<63) count := n & ((1 << 63) - 1) waitForCooldown(count, hot) // Finally, reset the formerly hot counts, too. h.resetCounts(hot) h.lastResetTime = h.now() h.resetScheduled = false } // maybeWidenZeroBucket widens the zero bucket until it includes the existing // buckets closest to the zero bucket (which could be two, if an equidistant // negative and a positive bucket exists, but usually it's only one bucket to be // merged into the new wider zero bucket). h.nativeHistogramMaxZeroThreshold // limits how far the zero bucket can be extended, and if that's not enough to // include an existing bucket, the method returns false. The caller must have // locked h.mtx. func (h *histogram) maybeWidenZeroBucket(hot, cold *histogramCounts) bool { currentZeroThreshold := math.Float64frombits(atomic.LoadUint64(&hot.nativeHistogramZeroThresholdBits)) if currentZeroThreshold >= h.nativeHistogramMaxZeroThreshold { return false } // Find the key of the bucket closest to zero. smallestKey := findSmallestKey(&hot.nativeHistogramBucketsPositive) smallestNegativeKey := findSmallestKey(&hot.nativeHistogramBucketsNegative) if smallestNegativeKey < smallestKey { smallestKey = smallestNegativeKey } if smallestKey == math.MaxInt32 { return false } newZeroThreshold := getLe(smallestKey, atomic.LoadInt32(&hot.nativeHistogramSchema)) if newZeroThreshold > h.nativeHistogramMaxZeroThreshold { return false // New threshold would exceed the max threshold. } atomic.StoreUint64(&cold.nativeHistogramZeroThresholdBits, math.Float64bits(newZeroThreshold)) // Remove applicable buckets. if _, loaded := cold.nativeHistogramBucketsNegative.LoadAndDelete(smallestKey); loaded { atomicDecUint32(&cold.nativeHistogramBucketsNumber) } if _, loaded := cold.nativeHistogramBucketsPositive.LoadAndDelete(smallestKey); loaded { atomicDecUint32(&cold.nativeHistogramBucketsNumber) } // Make cold counts the new hot counts. n := atomic.AddUint64(&h.countAndHotIdx, 1<<63) count := n & ((1 << 63) - 1) // Swap the pointer names to represent the new roles and make // the rest less confusing. hot, cold = cold, hot waitForCooldown(count, cold) // Add all the now cold counts to the new hot counts... addAndResetCounts(hot, cold) // ...adjust the new zero threshold in the cold counts, too... atomic.StoreUint64(&cold.nativeHistogramZeroThresholdBits, math.Float64bits(newZeroThreshold)) // ...and then merge the newly deleted buckets into the wider zero // bucket. mergeAndDeleteOrAddAndReset := func(hotBuckets, coldBuckets *sync.Map) func(k, v interface{}) bool { return func(k, v interface{}) bool { key := k.(int) bucket := v.(*int64) if key == smallestKey { // Merge into hot zero bucket... atomic.AddUint64(&hot.nativeHistogramZeroBucket, uint64(atomic.LoadInt64(bucket))) // ...and delete from cold counts. coldBuckets.Delete(key) atomicDecUint32(&cold.nativeHistogramBucketsNumber) } else { // Add to corresponding hot bucket... if addToBucket(hotBuckets, key, atomic.LoadInt64(bucket)) { atomic.AddUint32(&hot.nativeHistogramBucketsNumber, 1) } // ...and reset cold bucket. atomic.StoreInt64(bucket, 0) } return true } } cold.nativeHistogramBucketsPositive.Range(mergeAndDeleteOrAddAndReset(&hot.nativeHistogramBucketsPositive, &cold.nativeHistogramBucketsPositive)) cold.nativeHistogramBucketsNegative.Range(mergeAndDeleteOrAddAndReset(&hot.nativeHistogramBucketsNegative, &cold.nativeHistogramBucketsNegative)) return true } // doubleBucketWidth doubles the bucket width (by decrementing the schema // number). Note that very sparse buckets could lead to a low reduction of the // bucket count (or even no reduction at all). The method does nothing if the // schema is already -4. func (h *histogram) doubleBucketWidth(hot, cold *histogramCounts) { coldSchema := atomic.LoadInt32(&cold.nativeHistogramSchema) if coldSchema == -4 { return // Already at lowest resolution. } coldSchema-- atomic.StoreInt32(&cold.nativeHistogramSchema, coldSchema) // Play it simple and just delete all cold buckets. atomic.StoreUint32(&cold.nativeHistogramBucketsNumber, 0) deleteSyncMap(&cold.nativeHistogramBucketsNegative) deleteSyncMap(&cold.nativeHistogramBucketsPositive) // Make coldCounts the new hot counts. n := atomic.AddUint64(&h.countAndHotIdx, 1<<63) count := n & ((1 << 63) - 1) // Swap the pointer names to represent the new roles and make // the rest less confusing. hot, cold = cold, hot waitForCooldown(count, cold) // Add all the now cold counts to the new hot counts... addAndResetCounts(hot, cold) // ...adjust the schema in the cold counts, too... atomic.StoreInt32(&cold.nativeHistogramSchema, coldSchema) // ...and then merge the cold buckets into the wider hot buckets. merge := func(hotBuckets *sync.Map) func(k, v interface{}) bool { return func(k, v interface{}) bool { key := k.(int) bucket := v.(*int64) // Adjust key to match the bucket to merge into. if key > 0 { key++ } key /= 2 // Add to corresponding hot bucket. if addToBucket(hotBuckets, key, atomic.LoadInt64(bucket)) { atomic.AddUint32(&hot.nativeHistogramBucketsNumber, 1) } return true } } cold.nativeHistogramBucketsPositive.Range(merge(&hot.nativeHistogramBucketsPositive)) cold.nativeHistogramBucketsNegative.Range(merge(&hot.nativeHistogramBucketsNegative)) // Play it simple again and just delete all cold buckets. atomic.StoreUint32(&cold.nativeHistogramBucketsNumber, 0) deleteSyncMap(&cold.nativeHistogramBucketsNegative) deleteSyncMap(&cold.nativeHistogramBucketsPositive) } func (h *histogram) resetCounts(counts *histogramCounts) { atomic.StoreUint64(&counts.sumBits, 0) atomic.StoreUint64(&counts.count, 0) atomic.StoreUint64(&counts.nativeHistogramZeroBucket, 0) atomic.StoreUint64(&counts.nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) atomic.StoreInt32(&counts.nativeHistogramSchema, h.nativeHistogramSchema) atomic.StoreUint32(&counts.nativeHistogramBucketsNumber, 0) for i := range h.upperBounds { atomic.StoreUint64(&counts.buckets[i], 0) } deleteSyncMap(&counts.nativeHistogramBucketsNegative) deleteSyncMap(&counts.nativeHistogramBucketsPositive) } // updateExemplar replaces the exemplar for the provided bucket. With empty // labels, it's a no-op. It panics if any of the labels is invalid. func (h *histogram) updateExemplar(v float64, bucket int, l Labels) { if l == nil { return } e, err := newExemplar(v, h.now(), l) if err != nil { panic(err) } h.exemplars[bucket].Store(e) } // HistogramVec is a Collector that bundles a set of Histograms that all share the // same Desc, but have different values for their variable labels. This is used // if you want to count the same thing partitioned by various dimensions // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewHistogramVec. type HistogramVec struct { *MetricVec } // NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and // partitioned by the given label names. func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { return V2.NewHistogramVec(HistogramVecOpts{ HistogramOpts: opts, VariableLabels: UnconstrainedLabels(labelNames), }) } // NewHistogramVec creates a new HistogramVec based on the provided HistogramVecOpts. func (v2) NewHistogramVec(opts HistogramVecOpts) *HistogramVec { desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, opts.VariableLabels, opts.ConstLabels, ) return &HistogramVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { return newHistogram(desc, opts.HistogramOpts, lvs...) }), } } // GetMetricWithLabelValues returns the Histogram for the given slice of label // values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Histogram is created. // // It is possible to call this method without using the returned Histogram to only // create the new Histogram but leave it at its starting value, a Histogram without // any observations. // // Keeping the Histogram for later use is possible (and should be considered if // performance is critical), but keep in mind that Reset, DeleteLabelValues and // Delete can be used to delete the Histogram from the HistogramVec. In that case, the // Histogram will still exist, but it will not be exported anymore, even if a // Histogram with the same label values is created later. See also the CounterVec // example. // // An error is returned if the number of label values is not the same as the // number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as // an alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Observer), err } return nil, err } // GetMetricWith returns the Histogram for the given Labels map (the label names // must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Histogram is created. Implications of // creating a Histogram without using it and keeping the Histogram for later use // are the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent // with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) { metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Observer), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where // GetMetricWithLabelValues would have returned an error. Not returning an // error allows shortcuts like // // myVec.WithLabelValues("404", "GET").Observe(42.21) func (v *HistogramVec) WithLabelValues(lvs ...string) Observer { h, err := v.GetMetricWithLabelValues(lvs...) if err != nil { panic(err) } return h } // With works as GetMetricWith but panics where GetMetricWithLabels would have // returned an error. Not returning an error allows shortcuts like // // myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) func (v *HistogramVec) With(labels Labels) Observer { h, err := v.GetMetricWith(labels) if err != nil { panic(err) } return h } // CurryWith returns a vector curried with the provided labels, i.e. the // returned vector has those labels pre-set for all labeled operations performed // on it. The cardinality of the curried vector is reduced accordingly. The // order of the remaining labels stays the same (just with the curried labels // taken out of the sequence – which is relevant for the // (GetMetric)WithLabelValues methods). It is possible to curry a curried // vector, but only with labels not yet used for currying before. // // The metrics contained in the HistogramVec are shared between the curried and // uncurried vectors. They are just accessed differently. Curried and uncurried // vectors behave identically in terms of collection. Only one must be // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) { vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &HistogramVec{vec}, err } return nil, err } // MustCurryWith works as CurryWith but panics where CurryWith would have // returned an error. func (v *HistogramVec) MustCurryWith(labels Labels) ObserverVec { vec, err := v.CurryWith(labels) if err != nil { panic(err) } return vec } type constHistogram struct { desc *Desc count uint64 sum float64 buckets map[float64]uint64 labelPairs []*dto.LabelPair createdTs *timestamppb.Timestamp } func (h *constHistogram) Desc() *Desc { return h.desc } func (h *constHistogram) Write(out *dto.Metric) error { his := &dto.Histogram{ CreatedTimestamp: h.createdTs, } buckets := make([]*dto.Bucket, 0, len(h.buckets)) his.SampleCount = proto.Uint64(h.count) his.SampleSum = proto.Float64(h.sum) for upperBound, count := range h.buckets { buckets = append(buckets, &dto.Bucket{ CumulativeCount: proto.Uint64(count), UpperBound: proto.Float64(upperBound), }) } if len(buckets) > 0 { sort.Sort(buckSort(buckets)) } his.Bucket = buckets out.Histogram = his out.Label = h.labelPairs return nil } // NewConstHistogram returns a metric representing a Prometheus histogram with // fixed values for the count, sum, and bucket counts. As those parameters // cannot be changed, the returned value does not implement the Histogram // interface (but only the Metric interface). Users of this package will not // have much use for it in regular operations. However, when implementing custom // Collectors, it is useful as a throw-away metric that is generated on the fly // to send it to Prometheus in the Collect method. // // buckets is a map of upper bounds to cumulative counts, excluding the +Inf // bucket. The +Inf bucket is implicit, and its value is equal to the provided count. // // NewConstHistogram returns an error if the length of labelValues is not // consistent with the variable labels in Desc or if Desc is invalid. func NewConstHistogram( desc *Desc, count uint64, sum float64, buckets map[float64]uint64, labelValues ...string, ) (Metric, error) { if desc.err != nil { return nil, desc.err } if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constHistogram{ desc: desc, count: count, sum: sum, buckets: buckets, labelPairs: MakeLabelPairs(desc, labelValues), }, nil } // MustNewConstHistogram is a version of NewConstHistogram that panics where // NewConstHistogram would have returned an error. func MustNewConstHistogram( desc *Desc, count uint64, sum float64, buckets map[float64]uint64, labelValues ...string, ) Metric { m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) if err != nil { panic(err) } return m } type buckSort []*dto.Bucket func (s buckSort) Len() int { return len(s) } func (s buckSort) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s buckSort) Less(i, j int) bool { return s[i].GetUpperBound() < s[j].GetUpperBound() } // pickSchema returns the largest number n between -4 and 8 such that // 2^(2^-n) is less or equal the provided bucketFactor. // // Special cases: // - bucketFactor <= 1: panics. // - bucketFactor < 2^(2^-8) (but > 1): still returns 8. func pickSchema(bucketFactor float64) int32 { if bucketFactor <= 1 { panic(fmt.Errorf("bucketFactor %f is <=1", bucketFactor)) } floor := math.Floor(math.Log2(math.Log2(bucketFactor))) switch { case floor <= -8: return 8 case floor >= 4: return -4 default: return -int32(floor) } } func makeBuckets(buckets *sync.Map) ([]*dto.BucketSpan, []int64) { var ii []int buckets.Range(func(k, v interface{}) bool { ii = append(ii, k.(int)) return true }) sort.Ints(ii) if len(ii) == 0 { return nil, nil } var ( spans []*dto.BucketSpan deltas []int64 prevCount int64 nextI int ) appendDelta := func(count int64) { *spans[len(spans)-1].Length++ deltas = append(deltas, count-prevCount) prevCount = count } for n, i := range ii { v, _ := buckets.Load(i) count := atomic.LoadInt64(v.(*int64)) // Multiple spans with only small gaps in between are probably // encoded more efficiently as one larger span with a few empty // buckets. Needs some research to find the sweet spot. For now, // we assume that gaps of one or two buckets should not create // a new span. iDelta := int32(i - nextI) if n == 0 || iDelta > 2 { // We have to create a new span, either because we are // at the very beginning, or because we have found a gap // of more than two buckets. spans = append(spans, &dto.BucketSpan{ Offset: proto.Int32(iDelta), Length: proto.Uint32(0), }) } else { // We have found a small gap (or no gap at all). // Insert empty buckets as needed. for j := int32(0); j < iDelta; j++ { appendDelta(0) } } appendDelta(count) nextI = i + 1 } return spans, deltas } // addToBucket increments the sparse bucket at key by the provided amount. It // returns true if a new sparse bucket had to be created for that. func addToBucket(buckets *sync.Map, key int, increment int64) bool { if existingBucket, ok := buckets.Load(key); ok { // Fast path without allocation. atomic.AddInt64(existingBucket.(*int64), increment) return false } // Bucket doesn't exist yet. Slow path allocating new counter. newBucket := increment // TODO(beorn7): Check if this is sufficient to not let increment escape. if actualBucket, loaded := buckets.LoadOrStore(key, &newBucket); loaded { // The bucket was created concurrently in another goroutine. // Have to increment after all. atomic.AddInt64(actualBucket.(*int64), increment) return false } return true } // addAndReset returns a function to be used with sync.Map.Range of spare // buckets in coldCounts. It increments the buckets in the provided hotBuckets // according to the buckets ranged through. It then resets all buckets ranged // through to 0 (but leaves them in place so that they don't need to get // recreated on the next scrape). func addAndReset(hotBuckets *sync.Map, bucketNumber *uint32) func(k, v interface{}) bool { return func(k, v interface{}) bool { bucket := v.(*int64) if addToBucket(hotBuckets, k.(int), atomic.LoadInt64(bucket)) { atomic.AddUint32(bucketNumber, 1) } atomic.StoreInt64(bucket, 0) return true } } func deleteSyncMap(m *sync.Map) { m.Range(func(k, v interface{}) bool { m.Delete(k) return true }) } func findSmallestKey(m *sync.Map) int { result := math.MaxInt32 m.Range(func(k, v interface{}) bool { key := k.(int) if key < result { result = key } return true }) return result } func getLe(key int, schema int32) float64 { // Here a bit of context about the behavior for the last bucket counting // regular numbers (called simply "last bucket" below) and the bucket // counting observations of ±Inf (called "inf bucket" below, with a key // one higher than that of the "last bucket"): // // If we apply the usual formula to the last bucket, its upper bound // would be calculated as +Inf. The reason is that the max possible // regular float64 number (math.MaxFloat64) doesn't coincide with one of // the calculated bucket boundaries. So the calculated boundary has to // be larger than math.MaxFloat64, and the only float64 larger than // math.MaxFloat64 is +Inf. However, we want to count actual // observations of ±Inf in the inf bucket. Therefore, we have to treat // the upper bound of the last bucket specially and set it to // math.MaxFloat64. (The upper bound of the inf bucket, with its key // being one higher than that of the last bucket, naturally comes out as // +Inf by the usual formula. So that's fine.) // // math.MaxFloat64 has a frac of 0.9999999999999999 and an exp of // 1024. If there were a float64 number following math.MaxFloat64, it // would have a frac of 1.0 and an exp of 1024, or equivalently a frac // of 0.5 and an exp of 1025. However, since frac must be smaller than // 1, and exp must be smaller than 1025, either representation overflows // a float64. (Which, in turn, is the reason that math.MaxFloat64 is the // largest possible float64. Q.E.D.) However, the formula for // calculating the upper bound from the idx and schema of the last // bucket results in precisely that. It is either frac=1.0 & exp=1024 // (for schema < 0) or frac=0.5 & exp=1025 (for schema >=0). (This is, // by the way, a power of two where the exponent itself is a power of // two, 2¹Ⱐin fact, which coinicides with a bucket boundary in all // schemas.) So these are the special cases we have to catch below. if schema < 0 { exp := key << -schema if exp == 1024 { // This is the last bucket before the overflow bucket // (for ±Inf observations). Return math.MaxFloat64 as // explained above. return math.MaxFloat64 } return math.Ldexp(1, exp) } fracIdx := key & ((1 << schema) - 1) frac := nativeHistogramBounds[schema][fracIdx] exp := (key >> schema) + 1 if frac == 0.5 && exp == 1025 { // This is the last bucket before the overflow bucket (for ±Inf // observations). Return math.MaxFloat64 as explained above. return math.MaxFloat64 } return math.Ldexp(frac, exp) } // waitForCooldown returns after the count field in the provided histogramCounts // has reached the provided count value. func waitForCooldown(count uint64, counts *histogramCounts) { for count != atomic.LoadUint64(&counts.count) { runtime.Gosched() // Let observations get work done. } } // atomicAddFloat adds the provided float atomically to another float // represented by the bit pattern the bits pointer is pointing to. func atomicAddFloat(bits *uint64, v float64) { for { loadedBits := atomic.LoadUint64(bits) newBits := math.Float64bits(math.Float64frombits(loadedBits) + v) if atomic.CompareAndSwapUint64(bits, loadedBits, newBits) { break } } } // atomicDecUint32 atomically decrements the uint32 p points to. See // https://pkg.go.dev/sync/atomic#AddUint32 to understand how this is done. func atomicDecUint32(p *uint32) { atomic.AddUint32(p, ^uint32(0)) } // addAndResetCounts adds certain fields (count, sum, conventional buckets, zero // bucket) from the cold counts to the corresponding fields in the hot // counts. Those fields are then reset to 0 in the cold counts. func addAndResetCounts(hot, cold *histogramCounts) { atomic.AddUint64(&hot.count, atomic.LoadUint64(&cold.count)) atomic.StoreUint64(&cold.count, 0) coldSum := math.Float64frombits(atomic.LoadUint64(&cold.sumBits)) atomicAddFloat(&hot.sumBits, coldSum) atomic.StoreUint64(&cold.sumBits, 0) for i := range hot.buckets { atomic.AddUint64(&hot.buckets[i], atomic.LoadUint64(&cold.buckets[i])) atomic.StoreUint64(&cold.buckets[i], 0) } atomic.AddUint64(&hot.nativeHistogramZeroBucket, atomic.LoadUint64(&cold.nativeHistogramZeroBucket)) atomic.StoreUint64(&cold.nativeHistogramZeroBucket, 0) } client_golang-1.19.1/prometheus/histogram_test.go000066400000000000000000001047451461713521000222010ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "math" "math/rand" "reflect" "runtime" "sort" "sync" "sync/atomic" "testing" "testing/quick" "time" "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) func benchmarkHistogramObserve(w int, b *testing.B) { b.StopTimer() wg := new(sync.WaitGroup) wg.Add(w) g := new(sync.WaitGroup) g.Add(1) s := NewHistogram(HistogramOpts{}) for i := 0; i < w; i++ { go func() { g.Wait() for i := 0; i < b.N; i++ { s.Observe(float64(i)) } wg.Done() }() } b.StartTimer() g.Done() wg.Wait() } func BenchmarkHistogramObserve1(b *testing.B) { benchmarkHistogramObserve(1, b) } func BenchmarkHistogramObserve2(b *testing.B) { benchmarkHistogramObserve(2, b) } func BenchmarkHistogramObserve4(b *testing.B) { benchmarkHistogramObserve(4, b) } func BenchmarkHistogramObserve8(b *testing.B) { benchmarkHistogramObserve(8, b) } func benchmarkHistogramWrite(w int, b *testing.B) { b.StopTimer() wg := new(sync.WaitGroup) wg.Add(w) g := new(sync.WaitGroup) g.Add(1) s := NewHistogram(HistogramOpts{}) for i := 0; i < 1000000; i++ { s.Observe(float64(i)) } for j := 0; j < w; j++ { outs := make([]dto.Metric, b.N) go func(o []dto.Metric) { g.Wait() for i := 0; i < b.N; i++ { s.Write(&o[i]) } wg.Done() }(outs) } b.StartTimer() g.Done() wg.Wait() } func BenchmarkHistogramWrite1(b *testing.B) { benchmarkHistogramWrite(1, b) } func BenchmarkHistogramWrite2(b *testing.B) { benchmarkHistogramWrite(2, b) } func BenchmarkHistogramWrite4(b *testing.B) { benchmarkHistogramWrite(4, b) } func BenchmarkHistogramWrite8(b *testing.B) { benchmarkHistogramWrite(8, b) } func TestHistogramNonMonotonicBuckets(t *testing.T) { testCases := map[string][]float64{ "not strictly monotonic": {1, 2, 2, 3}, "not monotonic at all": {1, 2, 4, 3, 5}, "have +Inf in the middle": {1, 2, math.Inf(+1), 3}, } for name, buckets := range testCases { func() { defer func() { if r := recover(); r == nil { t.Errorf("Buckets %v are %s but NewHistogram did not panic.", buckets, name) } }() _ = NewHistogram(HistogramOpts{ Name: "test_histogram", Help: "helpless", Buckets: buckets, }) }() } } // Intentionally adding +Inf here to test if that case is handled correctly. // Also, getCumulativeCounts depends on it. var testBuckets = []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)} func TestHistogramConcurrency(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") } rand.New(rand.NewSource(42)) it := func(n uint32) bool { mutations := int(n%1e4 + 1e4) concLevel := int(n%5 + 1) total := mutations * concLevel var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) his := NewHistogram(HistogramOpts{ Name: "test_histogram", Help: "helpless", Buckets: testBuckets, }) allVars := make([]float64, total) var sampleSum float64 for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) for j := 0; j < mutations; j++ { v := rand.NormFloat64() vals[j] = v allVars[i*mutations+j] = v sampleSum += v } go func(vals []float64) { start.Wait() for _, v := range vals { if n%2 == 0 { his.Observe(v) } else { his.(ExemplarObserver).ObserveWithExemplar(v, Labels{"foo": "bar"}) } } end.Done() }(vals) } sort.Float64s(allVars) start.Done() end.Wait() m := &dto.Metric{} his.Write(m) if got, want := int(*m.Histogram.SampleCount), total; got != want { t.Errorf("got sample count %d, want %d", got, want) } if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { t.Errorf("got sample sum %f, want %f", got, want) } wantCounts := getCumulativeCounts(allVars) wantBuckets := len(testBuckets) if !math.IsInf(m.Histogram.Bucket[len(m.Histogram.Bucket)-1].GetUpperBound(), +1) { wantBuckets-- } if got := len(m.Histogram.Bucket); got != wantBuckets { t.Errorf("got %d buckets in protobuf, want %d", got, wantBuckets) } for i, wantBound := range testBuckets { if i == len(testBuckets)-1 { break // No +Inf bucket in protobuf. } if gotBound := *m.Histogram.Bucket[i].UpperBound; gotBound != wantBound { t.Errorf("got bound %f, want %f", gotBound, wantBound) } if gotCount, wantCount := *m.Histogram.Bucket[i].CumulativeCount, wantCounts[i]; gotCount != wantCount { t.Errorf("got count %d, want %d", gotCount, wantCount) } } return true } if err := quick.Check(it, nil); err != nil { t.Error(err) } } func TestHistogramVecConcurrency(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") } rand.New(rand.NewSource(42)) it := func(n uint32) bool { mutations := int(n%1e4 + 1e4) concLevel := int(n%7 + 1) vecLength := int(n%3 + 1) var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) his := NewHistogramVec( HistogramOpts{ Name: "test_histogram", Help: "helpless", Buckets: []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)}, }, []string{"label"}, ) allVars := make([][]float64, vecLength) sampleSums := make([]float64, vecLength) for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) picks := make([]int, mutations) for j := 0; j < mutations; j++ { v := rand.NormFloat64() vals[j] = v pick := rand.Intn(vecLength) picks[j] = pick allVars[pick] = append(allVars[pick], v) sampleSums[pick] += v } go func(vals []float64) { start.Wait() for i, v := range vals { his.WithLabelValues(string('A' + rune(picks[i]))).Observe(v) } end.Done() }(vals) } for _, vars := range allVars { sort.Float64s(vars) } start.Done() end.Wait() for i := 0; i < vecLength; i++ { m := &dto.Metric{} s := his.WithLabelValues(string('A' + rune(i))) s.(Histogram).Write(m) if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { t.Errorf("got %d buckets in protobuf, want %d", got, want) } if got, want := int(*m.Histogram.SampleCount), len(allVars[i]); got != want { t.Errorf("got sample count %d, want %d", got, want) } if got, want := *m.Histogram.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { t.Errorf("got sample sum %f, want %f", got, want) } wantCounts := getCumulativeCounts(allVars[i]) for j, wantBound := range testBuckets { if j == len(testBuckets)-1 { break // No +Inf bucket in protobuf. } if gotBound := *m.Histogram.Bucket[j].UpperBound; gotBound != wantBound { t.Errorf("got bound %f, want %f", gotBound, wantBound) } if gotCount, wantCount := *m.Histogram.Bucket[j].CumulativeCount, wantCounts[j]; gotCount != wantCount { t.Errorf("got count %d, want %d", gotCount, wantCount) } } } return true } if err := quick.Check(it, nil); err != nil { t.Error(err) } } func getCumulativeCounts(vars []float64) []uint64 { counts := make([]uint64, len(testBuckets)) for _, v := range vars { for i := len(testBuckets) - 1; i >= 0; i-- { if v > testBuckets[i] { break } counts[i]++ } } return counts } func TestBuckets(t *testing.T) { got := LinearBuckets(-15, 5, 6) want := []float64{-15, -10, -5, 0, 5, 10} if !reflect.DeepEqual(got, want) { t.Errorf("linear buckets: got %v, want %v", got, want) } got = ExponentialBuckets(100, 1.2, 3) want = []float64{100, 120, 144} if !reflect.DeepEqual(got, want) { t.Errorf("exponential buckets: got %v, want %v", got, want) } got = ExponentialBucketsRange(1, 100, 10) want = []float64{ 1.0, 1.6681, 2.7825, 4.6415, 7.7426, 12.9154, 21.5443, 35.9381, 59.9484, 100.0000, } const epsilon = 0.0001 if !internal.AlmostEqualFloat64s(got, want, epsilon) { t.Errorf("exponential buckets range: got %v, want %v (epsilon %f)", got, want, epsilon) } } func TestHistogramAtomicObserve(t *testing.T) { var ( quit = make(chan struct{}) his = NewHistogram(HistogramOpts{ Buckets: []float64{0.5, 10, 20}, }) ) defer func() { close(quit) }() observe := func() { for { select { case <-quit: return default: his.Observe(1) } } } go observe() go observe() go observe() for i := 0; i < 100; i++ { m := &dto.Metric{} if err := his.Write(m); err != nil { t.Fatal("unexpected error writing histogram:", err) } h := m.GetHistogram() if h.GetSampleCount() != uint64(h.GetSampleSum()) || h.GetSampleCount() != h.GetBucket()[1].GetCumulativeCount() || h.GetSampleCount() != h.GetBucket()[2].GetCumulativeCount() { t.Fatalf( "inconsistent counts in histogram: count=%d sum=%f buckets=[%d, %d]", h.GetSampleCount(), h.GetSampleSum(), h.GetBucket()[1].GetCumulativeCount(), h.GetBucket()[2].GetCumulativeCount(), ) } runtime.Gosched() } } func TestHistogramExemplar(t *testing.T) { now := time.Now() histogram := NewHistogram(HistogramOpts{ Name: "test", Help: "test help", Buckets: []float64{1, 2, 3, 4}, now: func() time.Time { return now }, }).(*histogram) ts := timestamppb.New(now) if err := ts.CheckValid(); err != nil { t.Fatal(err) } expectedExemplars := []*dto.Exemplar{ nil, { Label: []*dto.LabelPair{ {Name: proto.String("id"), Value: proto.String("2")}, }, Value: proto.Float64(1.6), Timestamp: ts, }, nil, { Label: []*dto.LabelPair{ {Name: proto.String("id"), Value: proto.String("3")}, }, Value: proto.Float64(4), Timestamp: ts, }, { Label: []*dto.LabelPair{ {Name: proto.String("id"), Value: proto.String("4")}, }, Value: proto.Float64(4.5), Timestamp: ts, }, } histogram.ObserveWithExemplar(1.5, Labels{"id": "1"}) histogram.ObserveWithExemplar(1.6, Labels{"id": "2"}) // To replace exemplar in bucket 0. histogram.ObserveWithExemplar(4, Labels{"id": "3"}) histogram.ObserveWithExemplar(4.5, Labels{"id": "4"}) // Should go to +Inf bucket. for i, ex := range histogram.exemplars { var got, expected string if val := ex.Load(); val != nil { got = val.(*dto.Exemplar).String() } if expectedExemplars[i] != nil { expected = expectedExemplars[i].String() } if got != expected { t.Errorf("expected exemplar %s, got %s.", expected, got) } } } func TestNativeHistogram(t *testing.T) { now := time.Now() scenarios := []struct { name string observations []float64 // With simulated interval of 1m. factor float64 zeroThreshold float64 maxBuckets uint32 minResetDuration time.Duration maxZeroThreshold float64 want *dto.Histogram }{ { name: "no sparse buckets", observations: []float64{1, 2, 3}, factor: 1, want: &dto.Histogram{ SampleCount: proto.Uint64(3), SampleSum: proto.Float64(6), Bucket: []*dto.Bucket{ {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.005)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.01)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.025)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.05)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.1)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.25)}, {CumulativeCount: proto.Uint64(0), UpperBound: proto.Float64(0.5)}, {CumulativeCount: proto.Uint64(1), UpperBound: proto.Float64(1)}, {CumulativeCount: proto.Uint64(2), UpperBound: proto.Float64(2.5)}, {CumulativeCount: proto.Uint64(3), UpperBound: proto.Float64(5)}, {CumulativeCount: proto.Uint64(3), UpperBound: proto.Float64(10)}, }, CreatedTimestamp: timestamppb.New(now), }, }, { name: "no observations", factor: 1.1, want: &dto.Histogram{ SampleCount: proto.Uint64(0), SampleSum: proto.Float64(0), Schema: proto.Int32(3), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), CreatedTimestamp: timestamppb.New(now), }, }, { name: "no observations and zero threshold of zero resulting in no-op span", factor: 1.1, zeroThreshold: NativeHistogramZeroThresholdZero, want: &dto.Histogram{ SampleCount: proto.Uint64(0), SampleSum: proto.Float64(0), Schema: proto.Int32(3), ZeroThreshold: proto.Float64(0), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(0)}, }, CreatedTimestamp: timestamppb.New(now), }, }, { name: "factor 1.1 results in schema 3", observations: []float64{0, 1, 2, 3}, factor: 1.1, want: &dto.Histogram{ SampleCount: proto.Uint64(4), SampleSum: proto.Float64(6), Schema: proto.Int32(3), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(1)}, {Offset: proto.Int32(7), Length: proto.Uint32(1)}, {Offset: proto.Int32(4), Length: proto.Uint32(1)}, }, PositiveDelta: []int64{1, 0, 0}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "factor 1.2 results in schema 2", observations: []float64{0, 1, 1.2, 1.4, 1.8, 2}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(6), SampleSum: proto.Float64(7.4), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "factor 4 results in schema -1", observations: []float64{ 0.0156251, 0.0625, // Bucket -2: (0.015625, 0.0625) 0.1, 0.25, // Bucket -1: (0.0625, 0.25] 0.5, 1, // Bucket 0: (0.25, 1] 1.5, 2, 3, 3.5, // Bucket 1: (1, 4] 5, 6, 7, // Bucket 2: (4, 16] 33.33, // Bucket 3: (16, 64] }, factor: 4, want: &dto.Histogram{ SampleCount: proto.Uint64(14), SampleSum: proto.Float64(63.2581251), Schema: proto.Int32(-1), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(-2), Length: proto.Uint32(6)}, }, PositiveDelta: []int64{2, 0, 0, 2, -1, -2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "factor 17 results in schema -2", observations: []float64{ 0.0156251, 0.0625, // Bucket -1: (0.015625, 0.0625] 0.1, 0.25, 0.5, 1, // Bucket 0: (0.0625, 1] 1.5, 2, 3, 3.5, 5, 6, 7, // Bucket 1: (1, 16] 33.33, // Bucket 2: (16, 256] }, factor: 17, want: &dto.Histogram{ SampleCount: proto.Uint64(14), SampleSum: proto.Float64(63.2581251), Schema: proto.Int32(-2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(-1), Length: proto.Uint32(4)}, }, PositiveDelta: []int64{2, 2, 3, -6}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "negative buckets", observations: []float64{0, -1, -1.2, -1.4, -1.8, -2}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(6), SampleSum: proto.Float64(-7.4), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, NegativeDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "negative and positive buckets", observations: []float64{0, -1, -1.2, -1.4, -1.8, -2, 1, 1.2, 1.4, 1.8, 2}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(11), SampleSum: proto.Float64(0), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, NegativeDelta: []int64{1, -1, 2, -2, 2}, PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "wide zero bucket", observations: []float64{0, -1, -1.2, -1.4, -1.8, -2, 1, 1.2, 1.4, 1.8, 2}, factor: 1.2, zeroThreshold: 1.4, want: &dto.Histogram{ SampleCount: proto.Uint64(11), SampleSum: proto.Float64(0), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(1.4), ZeroCount: proto.Uint64(7), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(4), Length: proto.Uint32(1)}, }, NegativeDelta: []int64{2}, PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(4), Length: proto.Uint32(1)}, }, PositiveDelta: []int64{2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "NaN observation", observations: []float64{0, 1, 1.2, 1.4, 1.8, 2, math.NaN()}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(7), SampleSum: proto.Float64(math.NaN()), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "+Inf observation", observations: []float64{0, 1, 1.2, 1.4, 1.8, 2, math.Inf(+1)}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(7), SampleSum: proto.Float64(math.Inf(+1)), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, {Offset: proto.Int32(4092), Length: proto.Uint32(1)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2, -1}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "-Inf observation", observations: []float64{0, 1, 1.2, 1.4, 1.8, 2, math.Inf(-1)}, factor: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(7), SampleSum: proto.Float64(math.Inf(-1)), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(4097), Length: proto.Uint32(1)}, }, NegativeDelta: []int64{1}, PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "limited buckets but nothing triggered", observations: []float64{0, 1, 1.2, 1.4, 1.8, 2}, factor: 1.2, maxBuckets: 4, want: &dto.Histogram{ SampleCount: proto.Uint64(6), SampleSum: proto.Float64(7.4), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by halving resolution", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 3}, factor: 1.2, maxBuckets: 4, want: &dto.Histogram{ SampleCount: proto.Uint64(8), SampleSum: proto.Float64(11.5), Schema: proto.Int32(1), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, PositiveDelta: []int64{1, 2, -1, -2, 1}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by widening the zero bucket", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 3}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(8), SampleSum: proto.Float64(11.5), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(1), ZeroCount: proto.Uint64(2), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(1), Length: proto.Uint32(7)}, }, PositiveDelta: []int64{1, 1, -2, 2, -2, 0, 1}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by widening the zero bucket twice", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 3, 4}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(9), SampleSum: proto.Float64(15.5), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(1.189207115002721), ZeroCount: proto.Uint64(3), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(2), Length: proto.Uint32(7)}, }, PositiveDelta: []int64{2, -2, 2, -2, 0, 1, 0}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by reset", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 3, 4}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, minResetDuration: 5 * time.Minute, want: &dto.Histogram{ SampleCount: proto.Uint64(2), SampleSum: proto.Float64(7), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(7), Length: proto.Uint32(2)}, }, PositiveDelta: []int64{1, 0}, CreatedTimestamp: timestamppb.New(now.Add(8 * time.Minute)), // We expect reset to happen after 8 observations. }, }, { name: "limited buckets but nothing triggered, negative observations", observations: []float64{0, -1, -1.2, -1.4, -1.8, -2}, factor: 1.2, maxBuckets: 4, want: &dto.Histogram{ SampleCount: proto.Uint64(6), SampleSum: proto.Float64(-7.4), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, NegativeDelta: []int64{1, -1, 2, -2, 2}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by halving resolution, negative observations", observations: []float64{0, -1, -1.1, -1.2, -1.4, -1.8, -2, -3}, factor: 1.2, maxBuckets: 4, want: &dto.Histogram{ SampleCount: proto.Uint64(8), SampleSum: proto.Float64(-11.5), Schema: proto.Int32(1), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(1), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(0), Length: proto.Uint32(5)}, }, NegativeDelta: []int64{1, 2, -1, -2, 1}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by widening the zero bucket, negative observations", observations: []float64{0, -1, -1.1, -1.2, -1.4, -1.8, -2, -3}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(8), SampleSum: proto.Float64(-11.5), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(1), ZeroCount: proto.Uint64(2), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(1), Length: proto.Uint32(7)}, }, NegativeDelta: []int64{1, 1, -2, 2, -2, 0, 1}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by widening the zero bucket twice, negative observations", observations: []float64{0, -1, -1.1, -1.2, -1.4, -1.8, -2, -3, -4}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, want: &dto.Histogram{ SampleCount: proto.Uint64(9), SampleSum: proto.Float64(-15.5), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(1.189207115002721), ZeroCount: proto.Uint64(3), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(2), Length: proto.Uint32(7)}, }, NegativeDelta: []int64{2, -2, 2, -2, 0, 1, 0}, CreatedTimestamp: timestamppb.New(now), }, }, { name: "buckets limited by reset, negative observations", observations: []float64{0, -1, -1.1, -1.2, -1.4, -1.8, -2, -3, -4}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, minResetDuration: 5 * time.Minute, want: &dto.Histogram{ SampleCount: proto.Uint64(2), SampleSum: proto.Float64(-7), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), NegativeSpan: []*dto.BucketSpan{ {Offset: proto.Int32(7), Length: proto.Uint32(2)}, }, NegativeDelta: []int64{1, 0}, CreatedTimestamp: timestamppb.New(now.Add(8 * time.Minute)), // We expect reset to happen after 8 observations. }, }, { name: "buckets limited by halving resolution, then reset", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 5, 5.1, 3, 4}, factor: 1.2, maxBuckets: 4, minResetDuration: 9 * time.Minute, want: &dto.Histogram{ SampleCount: proto.Uint64(3), SampleSum: proto.Float64(12.1), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(7), Length: proto.Uint32(4)}, }, PositiveDelta: []int64{1, 0, -1, 1}, CreatedTimestamp: timestamppb.New(now.Add(9 * time.Minute)), // We expect reset to happen after 8 minutes. }, }, { name: "buckets limited by widening the zero bucket, then reset", observations: []float64{0, 1, 1.1, 1.2, 1.4, 1.8, 2, 5, 5.1, 3, 4}, factor: 1.2, maxBuckets: 4, maxZeroThreshold: 1.2, minResetDuration: 9 * time.Minute, want: &dto.Histogram{ SampleCount: proto.Uint64(3), SampleSum: proto.Float64(12.1), Schema: proto.Int32(2), ZeroThreshold: proto.Float64(2.938735877055719e-39), ZeroCount: proto.Uint64(0), PositiveSpan: []*dto.BucketSpan{ {Offset: proto.Int32(7), Length: proto.Uint32(4)}, }, PositiveDelta: []int64{1, 0, -1, 1}, CreatedTimestamp: timestamppb.New(now.Add(9 * time.Minute)), // We expect reset to happen after 8 minutes. }, }, } for _, s := range scenarios { t.Run(s.name, func(t *testing.T) { var ( ts = now funcToCall func() whenToCall time.Duration ) his := NewHistogram(HistogramOpts{ Name: "name", Help: "help", NativeHistogramBucketFactor: s.factor, NativeHistogramZeroThreshold: s.zeroThreshold, NativeHistogramMaxBucketNumber: s.maxBuckets, NativeHistogramMinResetDuration: s.minResetDuration, NativeHistogramMaxZeroThreshold: s.maxZeroThreshold, now: func() time.Time { return ts }, afterFunc: func(d time.Duration, f func()) *time.Timer { funcToCall = f whenToCall = d return nil }, }) ts = ts.Add(time.Minute) for _, o := range s.observations { his.Observe(o) ts = ts.Add(time.Minute) whenToCall -= time.Minute if funcToCall != nil && whenToCall <= 0 { funcToCall() funcToCall = nil } } m := &dto.Metric{} if err := his.Write(m); err != nil { t.Fatal("unexpected error writing metric", err) } got := m.Histogram if !proto.Equal(s.want, got) { t.Errorf("want histogram %q, got %q", s.want, got) } }) } } func TestNativeHistogramConcurrency(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") } rand.New(rand.NewSource(42)) it := func(n uint32) bool { ts := time.Now().Add(30 * time.Second).Unix() mutations := int(n%1e4 + 1e4) concLevel := int(n%5 + 1) total := mutations * concLevel var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) his := NewHistogram(HistogramOpts{ Name: "test_native_histogram", Help: "This help is sparse.", NativeHistogramBucketFactor: 1.05, NativeHistogramZeroThreshold: 0.0000001, NativeHistogramMaxBucketNumber: 50, NativeHistogramMinResetDuration: time.Hour, // Comment out to test for totals below. NativeHistogramMaxZeroThreshold: 0.001, now: func() time.Time { return time.Unix(atomic.LoadInt64(&ts), 0) }, }) allVars := make([]float64, total) var sampleSum float64 for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) for j := 0; j < mutations; j++ { v := rand.NormFloat64() vals[j] = v allVars[i*mutations+j] = v sampleSum += v } go func(vals []float64) { start.Wait() for _, v := range vals { // An observation every 1 to 10 seconds. atomic.AddInt64(&ts, rand.Int63n(10)+1) his.Observe(v) } end.Done() }(vals) } sort.Float64s(allVars) start.Done() end.Wait() m := &dto.Metric{} his.Write(m) // Uncomment these tests for totals only if you have disabled histogram resets above. // // if got, want := int(*m.Histogram.SampleCount), total; got != want { // t.Errorf("got sample count %d, want %d", got, want) // } // if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { // t.Errorf("got sample sum %f, want %f", got, want) // } sumBuckets := int(m.Histogram.GetZeroCount()) current := 0 for _, delta := range m.Histogram.GetNegativeDelta() { current += int(delta) if current < 0 { t.Fatalf("negative bucket population negative: %d", current) } sumBuckets += current } current = 0 for _, delta := range m.Histogram.GetPositiveDelta() { current += int(delta) if current < 0 { t.Fatalf("positive bucket population negative: %d", current) } sumBuckets += current } if got, want := sumBuckets, int(*m.Histogram.SampleCount); got != want { t.Errorf("got bucket population sum %d, want %d", got, want) } return true } if err := quick.Check(it, nil); err != nil { t.Error(err) } } func TestGetLe(t *testing.T) { scenarios := []struct { key int schema int32 want float64 }{ { key: -1, schema: -1, want: 0.25, }, { key: 0, schema: -1, want: 1, }, { key: 1, schema: -1, want: 4, }, { key: 512, schema: -1, want: math.MaxFloat64, }, { key: 513, schema: -1, want: math.Inf(+1), }, { key: -1, schema: 0, want: 0.5, }, { key: 0, schema: 0, want: 1, }, { key: 1, schema: 0, want: 2, }, { key: 1024, schema: 0, want: math.MaxFloat64, }, { key: 1025, schema: 0, want: math.Inf(+1), }, { key: -1, schema: 2, want: 0.8408964152537144, }, { key: 0, schema: 2, want: 1, }, { key: 1, schema: 2, want: 1.189207115002721, }, { key: 4096, schema: 2, want: math.MaxFloat64, }, { key: 4097, schema: 2, want: math.Inf(+1), }, } for i, s := range scenarios { got := getLe(s.key, s.schema) if s.want != got { t.Errorf("%d. key %d, schema %d, want upper bound of %g, got %g", i, s.key, s.schema, s.want, got) } } } func TestHistogramCreatedTimestamp(t *testing.T) { now := time.Now() histogram := NewHistogram(HistogramOpts{ Name: "test", Help: "test help", Buckets: []float64{1, 2, 3, 4}, now: func() time.Time { return now }, }) var metric dto.Metric if err := histogram.Write(&metric); err != nil { t.Fatal(err) } if metric.Histogram.CreatedTimestamp.AsTime().Unix() != now.Unix() { t.Errorf("expected created timestamp %d, got %d", now.Unix(), metric.Histogram.CreatedTimestamp.AsTime().Unix()) } } func TestHistogramVecCreatedTimestamp(t *testing.T) { now := time.Now() histogramVec := NewHistogramVec(HistogramOpts{ Name: "test", Help: "test help", Buckets: []float64{1, 2, 3, 4}, now: func() time.Time { return now }, }, []string{"label"}) histogram := histogramVec.WithLabelValues("value").(Histogram) var metric dto.Metric if err := histogram.Write(&metric); err != nil { t.Fatal(err) } if metric.Histogram.CreatedTimestamp.AsTime().Unix() != now.Unix() { t.Errorf("expected created timestamp %d, got %d", now.Unix(), metric.Histogram.CreatedTimestamp.AsTime().Unix()) } } func TestHistogramVecCreatedTimestampWithDeletes(t *testing.T) { now := time.Now() histogramVec := NewHistogramVec(HistogramOpts{ Name: "test", Help: "test help", Buckets: []float64{1, 2, 3, 4}, now: func() time.Time { return now }, }, []string{"label"}) // First use of "With" should populate CT. histogramVec.WithLabelValues("1") expected := map[string]time.Time{"1": now} now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, histogramVec.MetricVec, dto.MetricType_HISTOGRAM, expected) // Two more labels at different times. histogramVec.WithLabelValues("2") expected["2"] = now now = now.Add(1 * time.Hour) histogramVec.WithLabelValues("3") expected["3"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, histogramVec.MetricVec, dto.MetricType_HISTOGRAM, expected) // Recreate metric instance should reset created timestamp to now. histogramVec.DeleteLabelValues("1") histogramVec.WithLabelValues("1") expected["1"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, histogramVec.MetricVec, dto.MetricType_HISTOGRAM, expected) } client_golang-1.19.1/prometheus/internal/000077500000000000000000000000001461713521000204175ustar00rootroot00000000000000client_golang-1.19.1/prometheus/internal/almost_equal.go000066400000000000000000000042761461713521000234450ustar00rootroot00000000000000// Copyright (c) 2015 Björn Rabenstein // // 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. // // The code in this package is copy/paste to avoid a dependency. Hence this file // carries the copyright of the original repo. // https://github.com/beorn7/floats package internal import ( "math" ) // minNormalFloat64 is the smallest positive normal value of type float64. var minNormalFloat64 = math.Float64frombits(0x0010000000000000) // AlmostEqualFloat64 returns true if a and b are equal within a relative error // of epsilon. See http://floating-point-gui.de/errors/comparison/ for the // details of the applied method. func AlmostEqualFloat64(a, b, epsilon float64) bool { if a == b { return true } absA := math.Abs(a) absB := math.Abs(b) diff := math.Abs(a - b) if a == 0 || b == 0 || absA+absB < minNormalFloat64 { return diff < epsilon*minNormalFloat64 } return diff/math.Min(absA+absB, math.MaxFloat64) < epsilon } // AlmostEqualFloat64s is the slice form of AlmostEqualFloat64. func AlmostEqualFloat64s(a, b []float64, epsilon float64) bool { if len(a) != len(b) { return false } for i := range a { if !AlmostEqualFloat64(a[i], b[i], epsilon) { return false } } return true } client_golang-1.19.1/prometheus/internal/difflib.go000066400000000000000000000465751461713521000223660ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // It provides tools to compare sequences of strings and generate textual diffs. // // Maintaining `GetUnifiedDiffString` here because original repository // (https://github.com/pmezard/go-difflib) is no longer maintained. package internal import ( "bufio" "bytes" "fmt" "io" "strings" ) func min(a, b int) int { if a < b { return a } return b } func max(a, b int) int { if a > b { return a } return b } func calculateRatio(matches, length int) float64 { if length > 0 { return 2.0 * float64(matches) / float64(length) } return 1.0 } type Match struct { A int B int Size int } type OpCode struct { Tag byte I1 int I2 int J1 int J2 int } // SequenceMatcher compares sequence of strings. The basic // algorithm predates, and is a little fancier than, an algorithm // published in the late 1980's by Ratcliff and Obershelp under the // hyperbolic name "gestalt pattern matching". The basic idea is to find // the longest contiguous matching subsequence that contains no "junk" // elements (R-O doesn't address junk). The same idea is then applied // recursively to the pieces of the sequences to the left and to the right // of the matching subsequence. This does not yield minimal edit // sequences, but does tend to yield matches that "look right" to people. // // SequenceMatcher tries to compute a "human-friendly diff" between two // sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the // longest *contiguous* & junk-free matching subsequence. That's what // catches peoples' eyes. The Windows(tm) windiff has another interesting // notion, pairing up elements that appear uniquely in each sequence. // That, and the method here, appear to yield more intuitive difference // reports than does diff. This method appears to be the least vulnerable // to synching up on blocks of "junk lines", though (like blank lines in // ordinary text files, or maybe "

" lines in HTML files). That may be // because this is the only method of the 3 that has a *concept* of // "junk" . // // Timing: Basic R-O is cubic time worst case and quadratic time expected // case. SequenceMatcher is quadratic time for the worst case and has // expected-case behavior dependent in a complicated way on how many // elements the sequences have in common; best case time is linear. type SequenceMatcher struct { a []string b []string b2j map[string][]int IsJunk func(string) bool autoJunk bool bJunk map[string]struct{} matchingBlocks []Match fullBCount map[string]int bPopular map[string]struct{} opCodes []OpCode } func NewMatcher(a, b []string) *SequenceMatcher { m := SequenceMatcher{autoJunk: true} m.SetSeqs(a, b) return &m } func NewMatcherWithJunk(a, b []string, autoJunk bool, isJunk func(string) bool, ) *SequenceMatcher { m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} m.SetSeqs(a, b) return &m } // Set two sequences to be compared. func (m *SequenceMatcher) SetSeqs(a, b []string) { m.SetSeq1(a) m.SetSeq2(b) } // Set the first sequence to be compared. The second sequence to be compared is // not changed. // // SequenceMatcher computes and caches detailed information about the second // sequence, so if you want to compare one sequence S against many sequences, // use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other // sequences. // // See also SetSeqs() and SetSeq2(). func (m *SequenceMatcher) SetSeq1(a []string) { if &a == &m.a { return } m.a = a m.matchingBlocks = nil m.opCodes = nil } // Set the second sequence to be compared. The first sequence to be compared is // not changed. func (m *SequenceMatcher) SetSeq2(b []string) { if &b == &m.b { return } m.b = b m.matchingBlocks = nil m.opCodes = nil m.fullBCount = nil m.chainB() } func (m *SequenceMatcher) chainB() { // Populate line -> index mapping b2j := map[string][]int{} for i, s := range m.b { indices := b2j[s] indices = append(indices, i) b2j[s] = indices } // Purge junk elements m.bJunk = map[string]struct{}{} if m.IsJunk != nil { junk := m.bJunk for s := range b2j { if m.IsJunk(s) { junk[s] = struct{}{} } } for s := range junk { delete(b2j, s) } } // Purge remaining popular elements popular := map[string]struct{}{} n := len(m.b) if m.autoJunk && n >= 200 { ntest := n/100 + 1 for s, indices := range b2j { if len(indices) > ntest { popular[s] = struct{}{} } } for s := range popular { delete(b2j, s) } } m.bPopular = popular m.b2j = b2j } func (m *SequenceMatcher) isBJunk(s string) bool { _, ok := m.bJunk[s] return ok } // Find longest matching block in a[alo:ahi] and b[blo:bhi]. // // If IsJunk is not defined: // // Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where // // alo <= i <= i+k <= ahi // blo <= j <= j+k <= bhi // // and for all (i',j',k') meeting those conditions, // // k >= k' // i <= i' // and if i == i', j <= j' // // In other words, of all maximal matching blocks, return one that // starts earliest in a, and of all those maximal matching blocks that // start earliest in a, return the one that starts earliest in b. // // If IsJunk is defined, first the longest matching block is // determined as above, but with the additional restriction that no // junk element appears in the block. Then that block is extended as // far as possible by matching (only) junk elements on both sides. So // the resulting block never matches on junk except as identical junk // happens to be adjacent to an "interesting" match. // // If no blocks match, return (alo, blo, 0). func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { // CAUTION: stripping common prefix or suffix would be incorrect. // E.g., // ab // acab // Longest matching block is "ab", but if common prefix is // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so // strip, so ends up claiming that ab is changed to acab by // inserting "ca" in the middle. That's minimal but unintuitive: // "it's obvious" that someone inserted "ac" at the front. // Windiff ends up at the same place as diff, but by pairing up // the unique 'b's and then matching the first two 'a's. besti, bestj, bestsize := alo, blo, 0 // find longest junk-free match // during an iteration of the loop, j2len[j] = length of longest // junk-free match ending with a[i-1] and b[j] j2len := map[int]int{} for i := alo; i != ahi; i++ { // look at all instances of a[i] in b; note that because // b2j has no junk keys, the loop is skipped if a[i] is junk newj2len := map[int]int{} for _, j := range m.b2j[m.a[i]] { // a[i] matches b[j] if j < blo { continue } if j >= bhi { break } k := j2len[j-1] + 1 newj2len[j] = k if k > bestsize { besti, bestj, bestsize = i-k+1, j-k+1, k } } j2len = newj2len } // Extend the best by non-junk elements on each end. In particular, // "popular" non-junk elements aren't in b2j, which greatly speeds // the inner loop above, but also means "the best" match so far // doesn't contain any junk *or* popular non-junk elements. for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && m.a[besti-1] == m.b[bestj-1] { besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 } for besti+bestsize < ahi && bestj+bestsize < bhi && !m.isBJunk(m.b[bestj+bestsize]) && m.a[besti+bestsize] == m.b[bestj+bestsize] { bestsize++ } // Now that we have a wholly interesting match (albeit possibly // empty!), we may as well suck up the matching junk on each // side of it too. Can't think of a good reason not to, and it // saves post-processing the (possibly considerable) expense of // figuring out what to do with it. In the case of an empty // interesting match, this is clearly the right thing to do, // because no other kind of match is possible in the regions. for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && m.a[besti-1] == m.b[bestj-1] { besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 } for besti+bestsize < ahi && bestj+bestsize < bhi && m.isBJunk(m.b[bestj+bestsize]) && m.a[besti+bestsize] == m.b[bestj+bestsize] { bestsize++ } return Match{A: besti, B: bestj, Size: bestsize} } // Return list of triples describing matching subsequences. // // Each triple is of the form (i, j, n), and means that // a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in // i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are // adjacent triples in the list, and the second is not the last triple in the // list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe // adjacent equal blocks. // // The last triple is a dummy, (len(a), len(b), 0), and is the only // triple with n==0. func (m *SequenceMatcher) GetMatchingBlocks() []Match { if m.matchingBlocks != nil { return m.matchingBlocks } var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { match := m.findLongestMatch(alo, ahi, blo, bhi) i, j, k := match.A, match.B, match.Size if match.Size > 0 { if alo < i && blo < j { matched = matchBlocks(alo, i, blo, j, matched) } matched = append(matched, match) if i+k < ahi && j+k < bhi { matched = matchBlocks(i+k, ahi, j+k, bhi, matched) } } return matched } matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) // It's possible that we have adjacent equal blocks in the // matching_blocks list now. nonAdjacent := []Match{} i1, j1, k1 := 0, 0, 0 for _, b := range matched { // Is this block adjacent to i1, j1, k1? i2, j2, k2 := b.A, b.B, b.Size if i1+k1 == i2 && j1+k1 == j2 { // Yes, so collapse them -- this just increases the length of // the first block by the length of the second, and the first // block so lengthened remains the block to compare against. k1 += k2 } else { // Not adjacent. Remember the first block (k1==0 means it's // the dummy we started with), and make the second block the // new block to compare against. if k1 > 0 { nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) } i1, j1, k1 = i2, j2, k2 } } if k1 > 0 { nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) } nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) m.matchingBlocks = nonAdjacent return m.matchingBlocks } // Return list of 5-tuples describing how to turn a into b. // // Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple // has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the // tuple preceding it, and likewise for j1 == the previous j2. // // The tags are characters, with these meanings: // // 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] // // 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. // // 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. // // 'e' (equal): a[i1:i2] == b[j1:j2] func (m *SequenceMatcher) GetOpCodes() []OpCode { if m.opCodes != nil { return m.opCodes } i, j := 0, 0 matching := m.GetMatchingBlocks() opCodes := make([]OpCode, 0, len(matching)) for _, m := range matching { // invariant: we've pumped out correct diffs to change // a[:i] into b[:j], and the next matching block is // a[ai:ai+size] == b[bj:bj+size]. So we need to pump // out a diff to change a[i:ai] into b[j:bj], pump out // the matching block, and move (i,j) beyond the match ai, bj, size := m.A, m.B, m.Size tag := byte(0) if i < ai && j < bj { tag = 'r' } else if i < ai { tag = 'd' } else if j < bj { tag = 'i' } if tag > 0 { opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) } i, j = ai+size, bj+size // the list of matching blocks is terminated by a // sentinel with size 0 if size > 0 { opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) } } m.opCodes = opCodes return m.opCodes } // Isolate change clusters by eliminating ranges with no changes. // // Return a generator of groups with up to n lines of context. // Each group is in the same format as returned by GetOpCodes(). func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { if n < 0 { n = 3 } codes := m.GetOpCodes() if len(codes) == 0 { codes = []OpCode{{'e', 0, 1, 0, 1}} } // Fixup leading and trailing groups if they show no changes. if codes[0].Tag == 'e' { c := codes[0] i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} } if codes[len(codes)-1].Tag == 'e' { c := codes[len(codes)-1] i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} } nn := n + n groups := [][]OpCode{} group := []OpCode{} for _, c := range codes { i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 // End the current group and start a new one whenever // there is a large range with no changes. if c.Tag == 'e' && i2-i1 > nn { group = append(group, OpCode{ c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n), }) groups = append(groups, group) group = []OpCode{} i1, j1 = max(i1, i2-n), max(j1, j2-n) } group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) } if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { groups = append(groups, group) } return groups } // Return a measure of the sequences' similarity (float in [0,1]). // // Where T is the total number of elements in both sequences, and // M is the number of matches, this is 2.0*M / T. // Note that this is 1 if the sequences are identical, and 0 if // they have nothing in common. // // .Ratio() is expensive to compute if you haven't already computed // .GetMatchingBlocks() or .GetOpCodes(), in which case you may // want to try .QuickRatio() or .RealQuickRation() first to get an // upper bound. func (m *SequenceMatcher) Ratio() float64 { matches := 0 for _, m := range m.GetMatchingBlocks() { matches += m.Size } return calculateRatio(matches, len(m.a)+len(m.b)) } // Return an upper bound on ratio() relatively quickly. // // This isn't defined beyond that it is an upper bound on .Ratio(), and // is faster to compute. func (m *SequenceMatcher) QuickRatio() float64 { // viewing a and b as multisets, set matches to the cardinality // of their intersection; this counts the number of matches // without regard to order, so is clearly an upper bound if m.fullBCount == nil { m.fullBCount = map[string]int{} for _, s := range m.b { m.fullBCount[s]++ } } // avail[x] is the number of times x appears in 'b' less the // number of times we've seen it in 'a' so far ... kinda avail := map[string]int{} matches := 0 for _, s := range m.a { n, ok := avail[s] if !ok { n = m.fullBCount[s] } avail[s] = n - 1 if n > 0 { matches++ } } return calculateRatio(matches, len(m.a)+len(m.b)) } // Return an upper bound on ratio() very quickly. // // This isn't defined beyond that it is an upper bound on .Ratio(), and // is faster to compute than either .Ratio() or .QuickRatio(). func (m *SequenceMatcher) RealQuickRatio() float64 { la, lb := len(m.a), len(m.b) return calculateRatio(min(la, lb), la+lb) } // Convert range to the "ed" format func formatRangeUnified(start, stop int) string { // Per the diff spec at http://www.unix.org/single_unix_specification/ beginning := start + 1 // lines start numbering with one length := stop - start if length == 1 { return fmt.Sprintf("%d", beginning) } if length == 0 { beginning-- // empty ranges begin at line just before the range } return fmt.Sprintf("%d,%d", beginning, length) } // Unified diff parameters type UnifiedDiff struct { A []string // First sequence lines FromFile string // First file name FromDate string // First file time B []string // Second sequence lines ToFile string // Second file name ToDate string // Second file time Eol string // Headers end of line, defaults to LF Context int // Number of context lines } // Compare two sequences of lines; generate the delta as a unified diff. // // Unified diffs are a compact way of showing line changes and a few // lines of context. The number of context lines is set by 'n' which // defaults to three. // // By default, the diff control lines (those with ---, +++, or @@) are // created with a trailing newline. This is helpful so that inputs // created from file.readlines() result in diffs that are suitable for // file.writelines() since both the inputs and outputs have trailing // newlines. // // For inputs that do not have trailing newlines, set the lineterm // argument to "" so that the output will be uniformly newline free. // // The unidiff format normally has a header for filenames and modification // times. Any or all of these may be specified using strings for // 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. // The modification times are normally expressed in the ISO 8601 format. func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { buf := bufio.NewWriter(writer) defer buf.Flush() wf := func(format string, args ...interface{}) error { _, err := buf.WriteString(fmt.Sprintf(format, args...)) return err } ws := func(s string) error { _, err := buf.WriteString(s) return err } if len(diff.Eol) == 0 { diff.Eol = "\n" } started := false m := NewMatcher(diff.A, diff.B) for _, g := range m.GetGroupedOpCodes(diff.Context) { if !started { started = true fromDate := "" if len(diff.FromDate) > 0 { fromDate = "\t" + diff.FromDate } toDate := "" if len(diff.ToDate) > 0 { toDate = "\t" + diff.ToDate } if diff.FromFile != "" || diff.ToFile != "" { err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) if err != nil { return err } err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) if err != nil { return err } } } first, last := g[0], g[len(g)-1] range1 := formatRangeUnified(first.I1, last.I2) range2 := formatRangeUnified(first.J1, last.J2) if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { return err } for _, c := range g { i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 if c.Tag == 'e' { for _, line := range diff.A[i1:i2] { if err := ws(" " + line); err != nil { return err } } continue } if c.Tag == 'r' || c.Tag == 'd' { for _, line := range diff.A[i1:i2] { if err := ws("-" + line); err != nil { return err } } } if c.Tag == 'r' || c.Tag == 'i' { for _, line := range diff.B[j1:j2] { if err := ws("+" + line); err != nil { return err } } } } } return nil } // Like WriteUnifiedDiff but returns the diff a string. func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { w := &bytes.Buffer{} err := WriteUnifiedDiff(w, diff) return w.String(), err } // Split a string on "\n" while preserving them. The output can be used // as input for UnifiedDiff and ContextDiff structures. func SplitLines(s string) []string { lines := strings.SplitAfter(s, "\n") lines[len(lines)-1] += "\n" return lines } client_golang-1.19.1/prometheus/internal/difflib_test.go000066400000000000000000000154501461713521000234110ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "bytes" "fmt" "math" "reflect" "strings" "testing" ) func assertAlmostEqual(t *testing.T, a, b float64, places int) { if math.Abs(a-b) > math.Pow10(-places) { t.Errorf("%.7f != %.7f", a, b) } } func assertEqual(t *testing.T, a, b interface{}) { if !reflect.DeepEqual(a, b) { t.Errorf("%v != %v", a, b) } } func splitChars(s string) []string { chars := make([]string, 0, len(s)) // Assume ASCII inputs for i := 0; i != len(s); i++ { chars = append(chars, string(s[i])) } return chars } func TestSequenceMatcherRatio(t *testing.T) { s := NewMatcher(splitChars("abcd"), splitChars("bcde")) assertEqual(t, s.Ratio(), 0.75) assertEqual(t, s.QuickRatio(), 0.75) assertEqual(t, s.RealQuickRatio(), 1.0) } func TestGetOptCodes(t *testing.T) { a := "qabxcd" b := "abycdf" s := NewMatcher(splitChars(a), splitChars(b)) w := &bytes.Buffer{} for _, op := range s.GetOpCodes() { fmt.Fprintf(w, "%s a[%d:%d], (%s) b[%d:%d] (%s)\n", string(op.Tag), op.I1, op.I2, a[op.I1:op.I2], op.J1, op.J2, b[op.J1:op.J2]) } result := w.String() expected := `d a[0:1], (q) b[0:0] () e a[1:3], (ab) b[0:2] (ab) r a[3:4], (x) b[2:3] (y) e a[4:6], (cd) b[3:5] (cd) i a[6:6], () b[5:6] (f) ` if expected != result { t.Errorf("unexpected op codes: \n%s", result) } } func TestGroupedOpCodes(t *testing.T) { a := []string{} for i := 0; i != 39; i++ { a = append(a, fmt.Sprintf("%02d", i)) } b := []string{} b = append(b, a[:8]...) b = append(b, " i") b = append(b, a[8:19]...) b = append(b, " x") b = append(b, a[20:22]...) b = append(b, a[27:34]...) b = append(b, " y") b = append(b, a[35:]...) s := NewMatcher(a, b) w := &bytes.Buffer{} for _, g := range s.GetGroupedOpCodes(-1) { fmt.Fprintf(w, "group\n") for _, op := range g { fmt.Fprintf(w, " %s, %d, %d, %d, %d\n", string(op.Tag), op.I1, op.I2, op.J1, op.J2) } } result := w.String() expected := `group e, 5, 8, 5, 8 i, 8, 8, 8, 9 e, 8, 11, 9, 12 group e, 16, 19, 17, 20 r, 19, 20, 20, 21 e, 20, 22, 21, 23 d, 22, 27, 23, 23 e, 27, 30, 23, 26 group e, 31, 34, 27, 30 r, 34, 35, 30, 31 e, 35, 38, 31, 34 ` if expected != result { t.Errorf("unexpected op codes: \n%s", result) } } func ExampleGetUnifiedDiffCode() { a := `one two three four fmt.Printf("%s,%T",a,b)` b := `zero one three four` diff := UnifiedDiff{ A: SplitLines(a), B: SplitLines(b), FromFile: "Original", FromDate: "2005-01-26 23:30:50", ToFile: "Current", ToDate: "2010-04-02 10:20:52", Context: 3, } result, _ := GetUnifiedDiffString(diff) fmt.Println(strings.ReplaceAll(result, "\t", " ")) // Output: // --- Original 2005-01-26 23:30:50 // +++ Current 2010-04-02 10:20:52 // @@ -1,5 +1,4 @@ // +zero // one // -two // three // four // -fmt.Printf("%s,%T",a,b) } func rep(s string, count int) string { return strings.Repeat(s, count) } func TestWithAsciiOneInsert(t *testing.T) { sm := NewMatcher(splitChars(rep("b", 100)), splitChars("a"+rep("b", 100))) assertAlmostEqual(t, sm.Ratio(), 0.995, 3) assertEqual(t, sm.GetOpCodes(), []OpCode{{'i', 0, 0, 0, 1}, {'e', 0, 100, 1, 101}}) assertEqual(t, len(sm.bPopular), 0) sm = NewMatcher(splitChars(rep("b", 100)), splitChars(rep("b", 50)+"a"+rep("b", 50))) assertAlmostEqual(t, sm.Ratio(), 0.995, 3) assertEqual(t, sm.GetOpCodes(), []OpCode{{'e', 0, 50, 0, 50}, {'i', 50, 50, 50, 51}, {'e', 50, 100, 51, 101}}) assertEqual(t, len(sm.bPopular), 0) } func TestWithAsciiOnDelete(t *testing.T) { sm := NewMatcher(splitChars(rep("a", 40)+"c"+rep("b", 40)), splitChars(rep("a", 40)+rep("b", 40))) assertAlmostEqual(t, sm.Ratio(), 0.994, 3) assertEqual(t, sm.GetOpCodes(), []OpCode{{'e', 0, 40, 0, 40}, {'d', 40, 41, 40, 40}, {'e', 41, 81, 40, 80}}) } func TestWithAsciiBJunk(t *testing.T) { isJunk := func(s string) bool { return s == " " } sm := NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), splitChars(rep("a", 44)+rep("b", 40)), true, isJunk) assertEqual(t, sm.bJunk, map[string]struct{}{}) sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) assertEqual(t, sm.bJunk, map[string]struct{}{" ": {}}) isJunk = func(s string) bool { return s == " " || s == "b" } sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) assertEqual(t, sm.bJunk, map[string]struct{}{" ": {}, "b": {}}) } func TestSFBugsRatioForNullSeqn(t *testing.T) { sm := NewMatcher(nil, nil) assertEqual(t, sm.Ratio(), 1.0) assertEqual(t, sm.QuickRatio(), 1.0) assertEqual(t, sm.RealQuickRatio(), 1.0) } func TestSFBugsComparingEmptyLists(t *testing.T) { groups := NewMatcher(nil, nil).GetGroupedOpCodes(-1) assertEqual(t, len(groups), 0) diff := UnifiedDiff{ FromFile: "Original", ToFile: "Current", Context: 3, } result, err := GetUnifiedDiffString(diff) assertEqual(t, err, nil) assertEqual(t, result, "") } func TestOutputFormatRangeFormatUnified(t *testing.T) { // Per the diff spec at http://www.unix.org/single_unix_specification/ // // Each field shall be of the form: // %1d", if the range contains exactly one line, // and: // "%1d,%1d", , otherwise. // If a range is empty, its beginning line number shall be the number of // the line just before the range, or 0 if the empty range starts the file. fm := formatRangeUnified assertEqual(t, fm(3, 3), "3,0") assertEqual(t, fm(3, 4), "4") assertEqual(t, fm(3, 5), "4,2") assertEqual(t, fm(3, 6), "4,3") assertEqual(t, fm(0, 0), "0,0") } func TestSplitLines(t *testing.T) { allTests := []struct { input string want []string }{ {"foo", []string{"foo\n"}}, {"foo\nbar", []string{"foo\n", "bar\n"}}, {"foo\nbar\n", []string{"foo\n", "bar\n", "\n"}}, } for _, test := range allTests { assertEqual(t, SplitLines(test.input), test.want) } } func benchmarkSplitLines(b *testing.B, count int) { str := strings.Repeat("foo\n", count) b.ResetTimer() n := 0 for i := 0; i < b.N; i++ { n += len(SplitLines(str)) } } func BenchmarkSplitLines100(b *testing.B) { benchmarkSplitLines(b, 100) } func BenchmarkSplitLines10000(b *testing.B) { benchmarkSplitLines(b, 10000) } client_golang-1.19.1/prometheus/internal/go_collector_options.go000066400000000000000000000022151461713521000251740ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import "regexp" type GoCollectorRule struct { Matcher *regexp.Regexp Deny bool } // GoCollectorOptions should not be used be directly by anything, except `collectors` package. // Use it via collectors package instead. See issue // https://github.com/prometheus/client_golang/issues/1030. // // This is internal, so external users only can use it via `collector.WithGoCollector*` methods type GoCollectorOptions struct { DisableMemStatsLikeMetrics bool RuntimeMetricSumForHist map[string]string RuntimeMetricRules []GoCollectorRule } client_golang-1.19.1/prometheus/internal/go_runtime_metrics.go000066400000000000000000000113671461713521000246540ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package internal import ( "math" "path" "runtime/metrics" "strings" "github.com/prometheus/common/model" ) // RuntimeMetricsToProm produces a Prometheus metric name from a runtime/metrics // metric description and validates whether the metric is suitable for integration // with Prometheus. // // Returns false if a name could not be produced, or if Prometheus does not understand // the runtime/metrics Kind. // // Note that the main reason a name couldn't be produced is if the runtime/metrics // package exports a name with characters outside the valid Prometheus metric name // character set. This is theoretically possible, but should never happen in practice. // Still, don't rely on it. func RuntimeMetricsToProm(d *metrics.Description) (string, string, string, bool) { namespace := "go" comp := strings.SplitN(d.Name, ":", 2) key := comp[0] unit := comp[1] // The last path element in the key is the name, // the rest is the subsystem. subsystem := path.Dir(key[1:] /* remove leading / */) name := path.Base(key) // subsystem is translated by replacing all / and - with _. subsystem = strings.ReplaceAll(subsystem, "/", "_") subsystem = strings.ReplaceAll(subsystem, "-", "_") // unit is translated assuming that the unit contains no // non-ASCII characters. unit = strings.ReplaceAll(unit, "-", "_") unit = strings.ReplaceAll(unit, "*", "_") unit = strings.ReplaceAll(unit, "/", "_per_") // name has - replaced with _ and is concatenated with the unit and // other data. name = strings.ReplaceAll(name, "-", "_") name += "_" + unit if d.Cumulative && d.Kind != metrics.KindFloat64Histogram { name += "_total" } valid := model.IsValidMetricName(model.LabelValue(namespace + "_" + subsystem + "_" + name)) switch d.Kind { case metrics.KindUint64: case metrics.KindFloat64: case metrics.KindFloat64Histogram: default: valid = false } return namespace, subsystem, name, valid } // RuntimeMetricsBucketsForUnit takes a set of buckets obtained for a runtime/metrics histogram // type (so, lower-bound inclusive) and a unit from a runtime/metrics name, and produces // a reduced set of buckets. This function always removes any -Inf bucket as it's represented // as the bottom-most upper-bound inclusive bucket in Prometheus. func RuntimeMetricsBucketsForUnit(buckets []float64, unit string) []float64 { switch unit { case "bytes": // Re-bucket as powers of 2. return reBucketExp(buckets, 2) case "seconds": // Re-bucket as powers of 10 and then merge all buckets greater // than 1 second into the +Inf bucket. b := reBucketExp(buckets, 10) for i := range b { if b[i] <= 1 { continue } b[i] = math.Inf(1) b = b[:i+1] break } return b } return buckets } // reBucketExp takes a list of bucket boundaries (lower bound inclusive) and // downsamples the buckets to those a multiple of base apart. The end result // is a roughly exponential (in many cases, perfectly exponential) bucketing // scheme. func reBucketExp(buckets []float64, base float64) []float64 { bucket := buckets[0] var newBuckets []float64 // We may see a -Inf here, in which case, add it and skip it // since we risk producing NaNs otherwise. // // We need to preserve -Inf values to maintain runtime/metrics // conventions. We'll strip it out later. if bucket == math.Inf(-1) { newBuckets = append(newBuckets, bucket) buckets = buckets[1:] bucket = buckets[0] } // From now on, bucket should always have a non-Inf value because // Infs are only ever at the ends of the bucket lists, so // arithmetic operations on it are non-NaN. for i := 1; i < len(buckets); i++ { if bucket >= 0 && buckets[i] < bucket*base { // The next bucket we want to include is at least bucket*base. continue } else if bucket < 0 && buckets[i] < bucket/base { // In this case the bucket we're targeting is negative, and since // we're ascending through buckets here, we need to divide to get // closer to zero exponentially. continue } // The +Inf bucket will always be the last one, and we'll always // end up including it here because bucket newBuckets = append(newBuckets, bucket) bucket = buckets[i] } return append(newBuckets, bucket) } client_golang-1.19.1/prometheus/internal/go_runtime_metrics_test.go000066400000000000000000000044351461713521000257110ustar00rootroot00000000000000// Copyright 2021 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build go1.17 // +build go1.17 package internal import ( "runtime/metrics" "testing" ) func TestRuntimeMetricsToProm(t *testing.T) { tests := []struct { got metrics.Description expect string }{ { metrics.Description{ Name: "/memory/live:bytes", Kind: metrics.KindUint64, }, "go_memory_live_bytes", }, { metrics.Description{ Name: "/memory/allocs:bytes", Kind: metrics.KindUint64, Cumulative: true, }, "go_memory_allocs_bytes_total", }, { metrics.Description{ Name: "/memory/alloc-rate:bytes/second", Kind: metrics.KindFloat64, }, "go_memory_alloc_rate_bytes_per_second", }, { metrics.Description{ Name: "/gc/time:cpu*seconds", Kind: metrics.KindFloat64, Cumulative: true, }, "go_gc_time_cpu_seconds_total", }, { metrics.Description{ Name: "/this/is/a/very/deep/metric:metrics", Kind: metrics.KindFloat64, }, "go_this_is_a_very_deep_metric_metrics", }, { metrics.Description{ Name: "/this*is*an*invalid...:µname", Kind: metrics.KindUint64, }, "", }, { metrics.Description{ Name: "/this/is/a/valid/name:objects", Kind: metrics.KindBad, }, "", }, } for _, test := range tests { ns, ss, n, ok := RuntimeMetricsToProm(&test.got) name := ns + "_" + ss + "_" + n if test.expect == "" && ok { t.Errorf("bad input expected a bad output: input %s, got %s", test.got.Name, name) continue } if test.expect != "" && !ok { t.Errorf("unexpected bad output on good input: input %s", test.got.Name) continue } if test.expect != "" && name != test.expect { t.Errorf("expected %s, got %s", test.expect, name) continue } } } client_golang-1.19.1/prometheus/internal/metric.go000066400000000000000000000057711461713521000222430ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "sort" dto "github.com/prometheus/client_model/go" ) // LabelPairSorter implements sort.Interface. It is used to sort a slice of // dto.LabelPair pointers. type LabelPairSorter []*dto.LabelPair func (s LabelPairSorter) Len() int { return len(s) } func (s LabelPairSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s LabelPairSorter) Less(i, j int) bool { return s[i].GetName() < s[j].GetName() } // MetricSorter is a sortable slice of *dto.Metric. type MetricSorter []*dto.Metric func (s MetricSorter) Len() int { return len(s) } func (s MetricSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s MetricSorter) Less(i, j int) bool { if len(s[i].Label) != len(s[j].Label) { // This should not happen. The metrics are // inconsistent. However, we have to deal with the fact, as // people might use custom collectors or metric family injection // to create inconsistent metrics. So let's simply compare the // number of labels in this case. That will still yield // reproducible sorting. return len(s[i].Label) < len(s[j].Label) } for n, lp := range s[i].Label { vi := lp.GetValue() vj := s[j].Label[n].GetValue() if vi != vj { return vi < vj } } // We should never arrive here. Multiple metrics with the same // label set in the same scrape will lead to undefined ingestion // behavior. However, as above, we have to provide stable sorting // here, even for inconsistent metrics. So sort equal metrics // by their timestamp, with missing timestamps (implying "now") // coming last. if s[i].TimestampMs == nil { return false } if s[j].TimestampMs == nil { return true } return s[i].GetTimestampMs() < s[j].GetTimestampMs() } // NormalizeMetricFamilies returns a MetricFamily slice with empty // MetricFamilies pruned and the remaining MetricFamilies sorted by name within // the slice, with the contained Metrics sorted within each MetricFamily. func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { for _, mf := range metricFamiliesByName { sort.Sort(MetricSorter(mf.Metric)) } names := make([]string, 0, len(metricFamiliesByName)) for name, mf := range metricFamiliesByName { if len(mf.Metric) > 0 { names = append(names, name) } } sort.Strings(names) result := make([]*dto.MetricFamily, 0, len(names)) for _, name := range names { result = append(result, metricFamiliesByName[name]) } return result } client_golang-1.19.1/prometheus/labels.go000066400000000000000000000120131461713521000203710ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "errors" "fmt" "strings" "unicode/utf8" "github.com/prometheus/common/model" ) // Labels represents a collection of label name -> value mappings. This type is // commonly used with the With(Labels) and GetMetricWith(Labels) methods of // metric vector Collectors, e.g.: // // myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) // // The other use-case is the specification of constant label pairs in Opts or to // create a Desc. type Labels map[string]string // LabelConstraint normalizes label values. type LabelConstraint func(string) string // ConstrainedLabels represents a label name and its constrain function // to normalize label values. This type is commonly used when constructing // metric vector Collectors. type ConstrainedLabel struct { Name string Constraint LabelConstraint } // ConstrainableLabels is an interface that allows creating of labels that can // be optionally constrained. // // prometheus.V2().NewCounterVec(CounterVecOpts{ // CounterOpts: {...}, // Usual CounterOpts fields // VariableLabels: []ConstrainedLabels{ // {Name: "A"}, // {Name: "B", Constraint: func(v string) string { ... }}, // }, // }) type ConstrainableLabels interface { compile() *compiledLabels labelNames() []string } // ConstrainedLabels represents a collection of label name -> constrain function // to normalize label values. This type is commonly used when constructing // metric vector Collectors. type ConstrainedLabels []ConstrainedLabel func (cls ConstrainedLabels) compile() *compiledLabels { compiled := &compiledLabels{ names: make([]string, len(cls)), labelConstraints: map[string]LabelConstraint{}, } for i, label := range cls { compiled.names[i] = label.Name if label.Constraint != nil { compiled.labelConstraints[label.Name] = label.Constraint } } return compiled } func (cls ConstrainedLabels) labelNames() []string { names := make([]string, len(cls)) for i, label := range cls { names[i] = label.Name } return names } // UnconstrainedLabels represents collection of label without any constraint on // their value. Thus, it is simply a collection of label names. // // UnconstrainedLabels([]string{ "A", "B" }) // // is equivalent to // // ConstrainedLabels { // { Name: "A" }, // { Name: "B" }, // } type UnconstrainedLabels []string func (uls UnconstrainedLabels) compile() *compiledLabels { return &compiledLabels{ names: uls, } } func (uls UnconstrainedLabels) labelNames() []string { return uls } type compiledLabels struct { names []string labelConstraints map[string]LabelConstraint } func (cls *compiledLabels) compile() *compiledLabels { return cls } func (cls *compiledLabels) labelNames() []string { return cls.names } func (cls *compiledLabels) constrain(labelName, value string) string { if fn, ok := cls.labelConstraints[labelName]; ok && fn != nil { return fn(value) } return value } // reservedLabelPrefix is a prefix which is not legal in user-supplied // label names. const reservedLabelPrefix = "__" var errInconsistentCardinality = errors.New("inconsistent label cardinality") func makeInconsistentCardinalityError(fqName string, labels, labelValues []string) error { return fmt.Errorf( "%w: %q has %d variable labels named %q but %d values %q were provided", errInconsistentCardinality, fqName, len(labels), labels, len(labelValues), labelValues, ) } func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { if len(labels) != expectedNumberOfValues { return fmt.Errorf( "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, len(labels), labels, ) } for name, val := range labels { if !utf8.ValidString(val) { return fmt.Errorf("label %s: value %q is not valid UTF-8", name, val) } } return nil } func validateLabelValues(vals []string, expectedNumberOfValues int) error { if len(vals) != expectedNumberOfValues { // The call below makes vals escape, copy them to avoid that. vals := append([]string(nil), vals...) return fmt.Errorf( "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, len(vals), vals, ) } for _, val := range vals { if !utf8.ValidString(val) { return fmt.Errorf("label value %q is not valid UTF-8", val) } } return nil } func checkLabelName(l string) bool { return model.LabelName(l).IsValid() && !strings.HasPrefix(l, reservedLabelPrefix) } client_golang-1.19.1/prometheus/metric.go000066400000000000000000000220121461713521000204120ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "errors" "math" "sort" "strings" "time" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/model" "google.golang.org/protobuf/proto" ) var separatorByteSlice = []byte{model.SeparatorByte} // For convenient use with xxhash. // A Metric models a single sample value with its meta data being exported to // Prometheus. Implementations of Metric in this package are Gauge, Counter, // Histogram, Summary, and Untyped. type Metric interface { // Desc returns the descriptor for the Metric. This method idempotently // returns the same descriptor throughout the lifetime of the // Metric. The returned descriptor is immutable by contract. A Metric // unable to describe itself must return an invalid descriptor (created // with NewInvalidDesc). Desc() *Desc // Write encodes the Metric into a "Metric" Protocol Buffer data // transmission object. // // Metric implementations must observe concurrency safety as reads of // this metric may occur at any time, and any blocking occurs at the // expense of total performance of rendering all registered // metrics. Ideally, Metric implementations should support concurrent // readers. // // While populating dto.Metric, it is the responsibility of the // implementation to ensure validity of the Metric protobuf (like valid // UTF-8 strings or syntactically valid metric and label names). It is // recommended to sort labels lexicographically. Callers of Write should // still make sure of sorting if they depend on it. Write(*dto.Metric) error // TODO(beorn7): The original rationale of passing in a pre-allocated // dto.Metric protobuf to save allocations has disappeared. The // signature of this method should be changed to "Write() (*dto.Metric, // error)". } // Opts bundles the options for creating most Metric types. Each metric // implementation XXX has its own XXXOpts type, but in most cases, it is just // an alias of this type (which might change when the requirement arises.) // // It is mandatory to set Name to a non-empty string. All other fields are // optional and can safely be left at their zero value, although it is strongly // encouraged to set a Help string. type Opts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Metric (created by joining these components with // "_"). Only Name is mandatory, the others merely help structuring the // name. Note that the fully-qualified name of the metric must be a // valid Prometheus metric name. Namespace string Subsystem string Name string // Help provides information about this metric. // // Metrics with the same fully-qualified name must have the same Help // string. Help string // ConstLabels are used to attach fixed labels to this metric. Metrics // with the same fully-qualified name must have the same label names in // their ConstLabels. // // ConstLabels are only used rarely. In particular, do not use them to // attach the same labels to all your metrics. Those use cases are // better covered by target labels set by the scraping Prometheus // server, or by one specific metric (e.g. a build_info or a // machine_role metric). See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels // now is for testing purposes, by default it's time.Now. now func() time.Time } // BuildFQName joins the given three name components by "_". Empty name // components are ignored. If the name parameter itself is empty, an empty // string is returned, no matter what. Metric implementations included in this // library use this function internally to generate the fully-qualified metric // name from the name component in their Opts. Users of the library will only // need this function if they implement their own Metric or instantiate a Desc // (with NewDesc) directly. func BuildFQName(namespace, subsystem, name string) string { if name == "" { return "" } switch { case namespace != "" && subsystem != "": return strings.Join([]string{namespace, subsystem, name}, "_") case namespace != "": return strings.Join([]string{namespace, name}, "_") case subsystem != "": return strings.Join([]string{subsystem, name}, "_") } return name } type invalidMetric struct { desc *Desc err error } // NewInvalidMetric returns a metric whose Write method always returns the // provided error. It is useful if a Collector finds itself unable to collect // a metric and wishes to report an error to the registry. func NewInvalidMetric(desc *Desc, err error) Metric { return &invalidMetric{desc, err} } func (m *invalidMetric) Desc() *Desc { return m.desc } func (m *invalidMetric) Write(*dto.Metric) error { return m.err } type timestampedMetric struct { Metric t time.Time } func (m timestampedMetric) Write(pb *dto.Metric) error { e := m.Metric.Write(pb) pb.TimestampMs = proto.Int64(m.t.Unix()*1000 + int64(m.t.Nanosecond()/1000000)) return e } // NewMetricWithTimestamp returns a new Metric wrapping the provided Metric in a // way that it has an explicit timestamp set to the provided Time. This is only // useful in rare cases as the timestamp of a Prometheus metric should usually // be set by the Prometheus server during scraping. Exceptions include mirroring // metrics with given timestamps from other metric // sources. // // NewMetricWithTimestamp works best with MustNewConstMetric, // MustNewConstHistogram, and MustNewConstSummary, see example. // // Currently, the exposition formats used by Prometheus are limited to // millisecond resolution. Thus, the provided time will be rounded down to the // next full millisecond value. func NewMetricWithTimestamp(t time.Time, m Metric) Metric { return timestampedMetric{Metric: m, t: t} } type withExemplarsMetric struct { Metric exemplars []*dto.Exemplar } func (m *withExemplarsMetric) Write(pb *dto.Metric) error { if err := m.Metric.Write(pb); err != nil { return err } switch { case pb.Counter != nil: pb.Counter.Exemplar = m.exemplars[len(m.exemplars)-1] case pb.Histogram != nil: for _, e := range m.exemplars { // pb.Histogram.Bucket are sorted by UpperBound. i := sort.Search(len(pb.Histogram.Bucket), func(i int) bool { return pb.Histogram.Bucket[i].GetUpperBound() >= e.GetValue() }) if i < len(pb.Histogram.Bucket) { pb.Histogram.Bucket[i].Exemplar = e } else { // The +Inf bucket should be explicitly added if there is an exemplar for it, similar to non-const histogram logic in https://github.com/prometheus/client_golang/blob/main/prometheus/histogram.go#L357-L365. b := &dto.Bucket{ CumulativeCount: proto.Uint64(pb.Histogram.GetSampleCount()), UpperBound: proto.Float64(math.Inf(1)), Exemplar: e, } pb.Histogram.Bucket = append(pb.Histogram.Bucket, b) } } default: // TODO(bwplotka): Implement Gauge? return errors.New("cannot inject exemplar into Gauge, Summary or Untyped") } return nil } // Exemplar is easier to use, user-facing representation of *dto.Exemplar. type Exemplar struct { Value float64 Labels Labels // Optional. // Default value (time.Time{}) indicates its empty, which should be // understood as time.Now() time at the moment of creation of metric. Timestamp time.Time } // NewMetricWithExemplars returns a new Metric wrapping the provided Metric with given // exemplars. Exemplars are validated. // // Only last applicable exemplar is injected from the list. // For example for Counter it means last exemplar is injected. // For Histogram, it means last applicable exemplar for each bucket is injected. // // NewMetricWithExemplars works best with MustNewConstMetric and // MustNewConstHistogram, see example. func NewMetricWithExemplars(m Metric, exemplars ...Exemplar) (Metric, error) { if len(exemplars) == 0 { return nil, errors.New("no exemplar was passed for NewMetricWithExemplars") } var ( now = time.Now() exs = make([]*dto.Exemplar, len(exemplars)) err error ) for i, e := range exemplars { ts := e.Timestamp if ts == (time.Time{}) { ts = now } exs[i], err = newExemplar(e.Value, ts, e.Labels) if err != nil { return nil, err } } return &withExemplarsMetric{Metric: m, exemplars: exs}, nil } // MustNewMetricWithExemplars is a version of NewMetricWithExemplars that panics where // NewMetricWithExemplars would have returned an error. func MustNewMetricWithExemplars(m Metric, exemplars ...Exemplar) Metric { ret, err := NewMetricWithExemplars(m, exemplars...) if err != nil { panic(err) } return ret } client_golang-1.19.1/prometheus/metric_test.go000066400000000000000000000056511461713521000214630ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "math" "testing" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) func TestBuildFQName(t *testing.T) { scenarios := []struct{ namespace, subsystem, name, result string }{ {"a", "b", "c", "a_b_c"}, {"", "b", "c", "b_c"}, {"a", "", "c", "a_c"}, {"", "", "c", "c"}, {"a", "b", "", ""}, {"a", "", "", ""}, {"", "b", "", ""}, {" ", "", "", ""}, } for i, s := range scenarios { if want, got := s.result, BuildFQName(s.namespace, s.subsystem, s.name); want != got { t.Errorf("%d. want %s, got %s", i, want, got) } } } func TestWithExemplarsMetric(t *testing.T) { t.Run("histogram", func(t *testing.T) { // Create a constant histogram from values we got from a 3rd party telemetry system. h := MustNewConstHistogram( NewDesc("http_request_duration_seconds", "A histogram of the HTTP request durations.", nil, nil), 4711, 403.34, // Four buckets, but we expect five as the +Inf bucket will be created if we see value outside of those buckets. map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, ) m := &withExemplarsMetric{Metric: h, exemplars: []*dto.Exemplar{ {Value: proto.Float64(2000.0)}, // Unordered exemplars. {Value: proto.Float64(500.0)}, {Value: proto.Float64(42.0)}, {Value: proto.Float64(157.0)}, {Value: proto.Float64(100.0)}, {Value: proto.Float64(89.0)}, {Value: proto.Float64(24.0)}, {Value: proto.Float64(25.1)}, }} metric := dto.Metric{} if err := m.Write(&metric); err != nil { t.Fatal(err) } if want, got := 5, len(metric.GetHistogram().Bucket); want != got { t.Errorf("want %v, got %v", want, got) } expectedExemplarVals := []float64{24.0, 25.1, 89.0, 157.0, 500.0} for i, b := range metric.GetHistogram().Bucket { if b.Exemplar == nil { t.Errorf("Expected exemplar for bucket %v, got nil", i) } if want, got := expectedExemplarVals[i], *metric.GetHistogram().Bucket[i].Exemplar.Value; want != got { t.Errorf("%v: want %v, got %v", i, want, got) } } infBucket := metric.GetHistogram().Bucket[len(metric.GetHistogram().Bucket)-1] if want, got := math.Inf(1), infBucket.GetUpperBound(); want != got { t.Errorf("want %v, got %v", want, got) } if want, got := uint64(4711), infBucket.GetCumulativeCount(); want != got { t.Errorf("want %v, got %v", want, got) } }) } client_golang-1.19.1/prometheus/num_threads.go000066400000000000000000000015061461713521000214450ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !js || wasm // +build !js wasm package prometheus import "runtime" // getRuntimeNumThreads returns the number of open OS threads. func getRuntimeNumThreads() float64 { n, _ := runtime.ThreadCreateProfile(nil) return float64(n) } client_golang-1.19.1/prometheus/num_threads_gopherjs.go000066400000000000000000000014011461713521000233400ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build js && !wasm // +build js,!wasm package prometheus // getRuntimeNumThreads returns the number of open OS threads. func getRuntimeNumThreads() float64 { return 1 } client_golang-1.19.1/prometheus/observer.go000066400000000000000000000050271461713521000207650ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus // Observer is the interface that wraps the Observe method, which is used by // Histogram and Summary to add observations. type Observer interface { Observe(float64) } // The ObserverFunc type is an adapter to allow the use of ordinary // functions as Observers. If f is a function with the appropriate // signature, ObserverFunc(f) is an Observer that calls f. // // This adapter is usually used in connection with the Timer type, and there are // two general use cases: // // The most common one is to use a Gauge as the Observer for a Timer. // See the "Gauge" Timer example. // // The more advanced use case is to create a function that dynamically decides // which Observer to use for observing the duration. See the "Complex" Timer // example. type ObserverFunc func(float64) // Observe calls f(value). It implements Observer. func (f ObserverFunc) Observe(value float64) { f(value) } // ObserverVec is an interface implemented by `HistogramVec` and `SummaryVec`. type ObserverVec interface { GetMetricWith(Labels) (Observer, error) GetMetricWithLabelValues(lvs ...string) (Observer, error) With(Labels) Observer WithLabelValues(...string) Observer CurryWith(Labels) (ObserverVec, error) MustCurryWith(Labels) ObserverVec Collector } // ExemplarObserver is implemented by Observers that offer the option of // observing a value together with an exemplar. Its ObserveWithExemplar method // works like the Observe method of an Observer but also replaces the currently // saved exemplar (if any) with a new one, created from the provided value, the // current time as timestamp, and the provided Labels. Empty Labels will lead to // a valid (label-less) exemplar. But if Labels is nil, the current exemplar is // left in place. ObserveWithExemplar panics if any of the provided labels are // invalid or if the provided labels contain more than 128 runes in total. type ExemplarObserver interface { ObserveWithExemplar(value float64, exemplar Labels) } client_golang-1.19.1/prometheus/process_collector.go000066400000000000000000000111121461713521000226520ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "errors" "fmt" "os" "strconv" "strings" ) type processCollector struct { collectFn func(chan<- Metric) pidFn func() (int, error) reportErrors bool cpuTotal *Desc openFDs, maxFDs *Desc vsize, maxVsize *Desc rss *Desc startTime *Desc } // ProcessCollectorOpts defines the behavior of a process metrics collector // created with NewProcessCollector. type ProcessCollectorOpts struct { // PidFn returns the PID of the process the collector collects metrics // for. It is called upon each collection. By default, the PID of the // current process is used, as determined on construction time by // calling os.Getpid(). PidFn func() (int, error) // If non-empty, each of the collected metrics is prefixed by the // provided string and an underscore ("_"). Namespace string // If true, any error encountered during collection is reported as an // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored // and the collected metrics will be incomplete. (Possibly, no metrics // will be collected at all.) While that's usually not desired, it is // appropriate for the common "mix-in" of process metrics, where process // metrics are nice to have, but failing to collect them should not // disrupt the collection of the remaining metrics. ReportErrors bool } // NewProcessCollector is the obsolete version of collectors.NewProcessCollector. // See there for documentation. // // Deprecated: Use collectors.NewProcessCollector instead. func NewProcessCollector(opts ProcessCollectorOpts) Collector { ns := "" if len(opts.Namespace) > 0 { ns = opts.Namespace + "_" } c := &processCollector{ reportErrors: opts.ReportErrors, cpuTotal: NewDesc( ns+"process_cpu_seconds_total", "Total user and system CPU time spent in seconds.", nil, nil, ), openFDs: NewDesc( ns+"process_open_fds", "Number of open file descriptors.", nil, nil, ), maxFDs: NewDesc( ns+"process_max_fds", "Maximum number of open file descriptors.", nil, nil, ), vsize: NewDesc( ns+"process_virtual_memory_bytes", "Virtual memory size in bytes.", nil, nil, ), maxVsize: NewDesc( ns+"process_virtual_memory_max_bytes", "Maximum amount of virtual memory available in bytes.", nil, nil, ), rss: NewDesc( ns+"process_resident_memory_bytes", "Resident memory size in bytes.", nil, nil, ), startTime: NewDesc( ns+"process_start_time_seconds", "Start time of the process since unix epoch in seconds.", nil, nil, ), } if opts.PidFn == nil { c.pidFn = getPIDFn() } else { c.pidFn = opts.PidFn } // Set up process metric collection if supported by the runtime. if canCollectProcess() { c.collectFn = c.processCollect } else { c.collectFn = func(ch chan<- Metric) { c.reportError(ch, nil, errors.New("process metrics not supported on this platform")) } } return c } // Describe returns all descriptions of the collector. func (c *processCollector) Describe(ch chan<- *Desc) { ch <- c.cpuTotal ch <- c.openFDs ch <- c.maxFDs ch <- c.vsize ch <- c.maxVsize ch <- c.rss ch <- c.startTime } // Collect returns the current state of all metrics of the collector. func (c *processCollector) Collect(ch chan<- Metric) { c.collectFn(ch) } func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) { if !c.reportErrors { return } if desc == nil { desc = NewInvalidDesc(err) } ch <- NewInvalidMetric(desc, err) } // NewPidFileFn returns a function that retrieves a pid from the specified file. // It is meant to be used for the PidFn field in ProcessCollectorOpts. func NewPidFileFn(pidFilePath string) func() (int, error) { return func() (int, error) { content, err := os.ReadFile(pidFilePath) if err != nil { return 0, fmt.Errorf("can't read pid file %q: %w", pidFilePath, err) } pid, err := strconv.Atoi(strings.TrimSpace(string(content))) if err != nil { return 0, fmt.Errorf("can't parse pid file %q: %w", pidFilePath, err) } return pid, nil } } client_golang-1.19.1/prometheus/process_collector_js.go000066400000000000000000000014241461713521000233530ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build js // +build js package prometheus func canCollectProcess() bool { return false } func (c *processCollector) processCollect(ch chan<- Metric) { // noop on this platform return } client_golang-1.19.1/prometheus/process_collector_other.go000066400000000000000000000036311461713521000240620ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !windows && !js && !wasip1 // +build !windows,!js,!wasip1 package prometheus import ( "github.com/prometheus/procfs" ) func canCollectProcess() bool { _, err := procfs.NewDefaultFS() return err == nil } func (c *processCollector) processCollect(ch chan<- Metric) { pid, err := c.pidFn() if err != nil { c.reportError(ch, nil, err) return } p, err := procfs.NewProc(pid) if err != nil { c.reportError(ch, nil, err) return } if stat, err := p.Stat(); err == nil { ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) if startTime, err := stat.StartTime(); err == nil { ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) } else { c.reportError(ch, c.startTime, err) } } else { c.reportError(ch, nil, err) } if fds, err := p.FileDescriptorsLen(); err == nil { ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) } else { c.reportError(ch, c.openFDs, err) } if limits, err := p.Limits(); err == nil { ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) } else { c.reportError(ch, nil, err) } } client_golang-1.19.1/prometheus/process_collector_test.go000066400000000000000000000107721461713521000237240ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build linux // +build linux package prometheus import ( "bytes" "errors" "fmt" "os" "path/filepath" "regexp" "strings" "testing" "github.com/prometheus/common/expfmt" "github.com/prometheus/procfs" dto "github.com/prometheus/client_model/go" ) func TestProcessCollector(t *testing.T) { if _, err := procfs.Self(); err != nil { t.Skipf("skipping TestProcessCollector, procfs not available: %s", err) } registry := NewRegistry() if err := registry.Register(NewProcessCollector(ProcessCollectorOpts{})); err != nil { t.Fatal(err) } if err := registry.Register(NewProcessCollector(ProcessCollectorOpts{ PidFn: func() (int, error) { return os.Getpid(), nil }, Namespace: "foobar", ReportErrors: true, // No errors expected, just to see if none are reported. })); err != nil { t.Fatal(err) } mfs, err := registry.Gather() if err != nil { t.Fatal(err) } var buf bytes.Buffer for _, mf := range mfs { if _, err := expfmt.MetricFamilyToText(&buf, mf); err != nil { t.Fatal(err) } } for _, re := range []*regexp.Regexp{ regexp.MustCompile("\nprocess_cpu_seconds_total [0-9]"), regexp.MustCompile("\nprocess_max_fds [1-9]"), regexp.MustCompile("\nprocess_open_fds [1-9]"), regexp.MustCompile("\nprocess_virtual_memory_max_bytes (-1|[1-9])"), regexp.MustCompile("\nprocess_virtual_memory_bytes [1-9]"), regexp.MustCompile("\nprocess_resident_memory_bytes [1-9]"), regexp.MustCompile("\nprocess_start_time_seconds [0-9.]{10,}"), regexp.MustCompile("\nfoobar_process_cpu_seconds_total [0-9]"), regexp.MustCompile("\nfoobar_process_max_fds [1-9]"), regexp.MustCompile("\nfoobar_process_open_fds [1-9]"), regexp.MustCompile("\nfoobar_process_virtual_memory_max_bytes (-1|[1-9])"), regexp.MustCompile("\nfoobar_process_virtual_memory_bytes [1-9]"), regexp.MustCompile("\nfoobar_process_resident_memory_bytes [1-9]"), regexp.MustCompile("\nfoobar_process_start_time_seconds [0-9.]{10,}"), } { if !re.Match(buf.Bytes()) { t.Errorf("want body to match %s\n%s", re, buf.String()) } } brokenProcessCollector := NewProcessCollector(ProcessCollectorOpts{ PidFn: func() (int, error) { return 0, errors.New("boo") }, ReportErrors: true, }) ch := make(chan Metric) go func() { brokenProcessCollector.Collect(ch) close(ch) }() n := 0 for m := range ch { n++ pb := &dto.Metric{} err := m.Write(pb) if err == nil { t.Error("metric collected from broken process collector is unexpectedly valid") } } if n != 1 { t.Errorf("%d metrics collected, want 1", n) } } func TestNewPidFileFn(t *testing.T) { folderPath, err := os.Getwd() if err != nil { t.Error("failed to get current path") } mockPidFilePath := filepath.Join(folderPath, "mockPidFile") defer os.Remove(mockPidFilePath) testCases := []struct { mockPidFile func() expectedErrPrefix string expectedPid int desc string }{ { mockPidFile: func() { os.Remove(mockPidFilePath) }, expectedErrPrefix: "can't read pid file", expectedPid: 0, desc: "no existed pid file", }, { mockPidFile: func() { os.Remove(mockPidFilePath) f, _ := os.Create(mockPidFilePath) f.Write([]byte("abc")) f.Close() }, expectedErrPrefix: "can't parse pid file", expectedPid: 0, desc: "existed pid file, error pid number", }, { mockPidFile: func() { os.Remove(mockPidFilePath) f, _ := os.Create(mockPidFilePath) f.Write([]byte("123")) f.Close() }, expectedErrPrefix: "", expectedPid: 123, desc: "existed pid file, correct pid number", }, } for _, tc := range testCases { fn := NewPidFileFn(mockPidFilePath) if fn == nil { t.Error("Should not get nil PidFileFn") } tc.mockPidFile() if pid, err := fn(); pid != tc.expectedPid || (err != nil && !strings.HasPrefix(err.Error(), tc.expectedErrPrefix)) { fmt.Println(err.Error()) t.Error(tc.desc) } } } client_golang-1.19.1/prometheus/process_collector_wasip1.go000066400000000000000000000014271461713521000241460ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build wasip1 // +build wasip1 package prometheus func canCollectProcess() bool { return false } func (*processCollector) processCollect(chan<- Metric) { // noop on this platform return } client_golang-1.19.1/prometheus/process_collector_windows.go000066400000000000000000000066101461713521000244330ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) func canCollectProcess() bool { return true } var ( modpsapi = syscall.NewLazyDLL("psapi.dll") modkernel32 = syscall.NewLazyDLL("kernel32.dll") procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") procGetProcessHandleCount = modkernel32.NewProc("GetProcessHandleCount") ) type processMemoryCounters struct { // System interface description // https://docs.microsoft.com/en-us/windows/desktop/api/psapi/ns-psapi-process_memory_counters_ex // Refer to the Golang internal implementation // https://golang.org/src/internal/syscall/windows/psapi_windows.go _ uint32 PageFaultCount uint32 PeakWorkingSetSize uintptr WorkingSetSize uintptr QuotaPeakPagedPoolUsage uintptr QuotaPagedPoolUsage uintptr QuotaPeakNonPagedPoolUsage uintptr QuotaNonPagedPoolUsage uintptr PagefileUsage uintptr PeakPagefileUsage uintptr PrivateUsage uintptr } func getProcessMemoryInfo(handle windows.Handle) (processMemoryCounters, error) { mem := processMemoryCounters{} r1, _, err := procGetProcessMemoryInfo.Call( uintptr(handle), uintptr(unsafe.Pointer(&mem)), uintptr(unsafe.Sizeof(mem)), ) if r1 != 1 { return mem, err } else { return mem, nil } } func getProcessHandleCount(handle windows.Handle) (uint32, error) { var count uint32 r1, _, err := procGetProcessHandleCount.Call( uintptr(handle), uintptr(unsafe.Pointer(&count)), ) if r1 != 1 { return 0, err } else { return count, nil } } func (c *processCollector) processCollect(ch chan<- Metric) { h, err := windows.GetCurrentProcess() if err != nil { c.reportError(ch, nil, err) return } var startTime, exitTime, kernelTime, userTime windows.Filetime err = windows.GetProcessTimes(h, &startTime, &exitTime, &kernelTime, &userTime) if err != nil { c.reportError(ch, nil, err) return } ch <- MustNewConstMetric(c.startTime, GaugeValue, float64(startTime.Nanoseconds()/1e9)) ch <- MustNewConstMetric(c.cpuTotal, CounterValue, fileTimeToSeconds(kernelTime)+fileTimeToSeconds(userTime)) mem, err := getProcessMemoryInfo(h) if err != nil { c.reportError(ch, nil, err) return } ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(mem.PrivateUsage)) ch <- MustNewConstMetric(c.rss, GaugeValue, float64(mem.WorkingSetSize)) handles, err := getProcessHandleCount(h) if err != nil { c.reportError(ch, nil, err) return } ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(handles)) ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(16*1024*1024)) // Windows has a hard-coded max limit, not per-process. } func fileTimeToSeconds(ft windows.Filetime) float64 { return float64(uint64(ft.HighDateTime)<<32+uint64(ft.LowDateTime)) / 1e7 } client_golang-1.19.1/prometheus/process_collector_windows_test.go000066400000000000000000000045341461713521000254750ustar00rootroot00000000000000// Copyright 2019 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "bytes" "os" "regexp" "testing" "github.com/prometheus/common/expfmt" ) func TestWindowsProcessCollector(t *testing.T) { registry := NewRegistry() if err := registry.Register(NewProcessCollector(ProcessCollectorOpts{})); err != nil { t.Fatal(err) } if err := registry.Register(NewProcessCollector(ProcessCollectorOpts{ PidFn: func() (int, error) { return os.Getpid(), nil }, Namespace: "foobar", ReportErrors: true, // No errors expected, just to see if none are reported. })); err != nil { t.Fatal(err) } mfs, err := registry.Gather() if err != nil { t.Fatal(err) } var buf bytes.Buffer for _, mf := range mfs { if _, err := expfmt.MetricFamilyToText(&buf, mf); err != nil { t.Fatal(err) } } for _, re := range []*regexp.Regexp{ regexp.MustCompile("\nprocess_cpu_seconds_total [0-9]"), regexp.MustCompile("\nprocess_max_fds [1-9]"), regexp.MustCompile("\nprocess_open_fds [1-9]"), regexp.MustCompile("\nprocess_virtual_memory_max_bytes (-1|[1-9])"), regexp.MustCompile("\nprocess_virtual_memory_bytes [1-9]"), regexp.MustCompile("\nprocess_resident_memory_bytes [1-9]"), regexp.MustCompile("\nprocess_start_time_seconds [0-9.]{10,}"), regexp.MustCompile("\nfoobar_process_cpu_seconds_total [0-9]"), regexp.MustCompile("\nfoobar_process_max_fds [1-9]"), regexp.MustCompile("\nfoobar_process_open_fds [1-9]"), regexp.MustCompile("\nfoobar_process_virtual_memory_max_bytes (-1|[1-9])"), regexp.MustCompile("\nfoobar_process_virtual_memory_bytes [1-9]"), regexp.MustCompile("\nfoobar_process_resident_memory_bytes [1-9]"), regexp.MustCompile("\nfoobar_process_start_time_seconds [0-9.]{10,}"), } { if !re.Match(buf.Bytes()) { t.Errorf("want body to match %s\n%s", re, buf.String()) } } } client_golang-1.19.1/prometheus/promauto/000077500000000000000000000000001461713521000204515ustar00rootroot00000000000000client_golang-1.19.1/prometheus/promauto/auto.go000066400000000000000000000360671461713521000217640ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package promauto provides alternative constructors for the fundamental // Prometheus metric types and their …Vec and …Func variants. The difference to // their counterparts in the prometheus package is that the promauto // constructors register the Collectors with a registry before returning them. // There are two sets of constructors. The constructors in the first set are // top-level functions, while the constructors in the other set are methods of // the Factory type. The top-level functions return Collectors registered with // the global registry (prometheus.DefaultRegisterer), while the methods return // Collectors registered with the registry the Factory was constructed with. All // constructors panic if the registration fails. // // The following example is a complete program to create a histogram of normally // distributed random numbers from the math/rand package: // // package main // // import ( // "math/rand" // "net/http" // // "github.com/prometheus/client_golang/prometheus" // "github.com/prometheus/client_golang/prometheus/promauto" // "github.com/prometheus/client_golang/prometheus/promhttp" // ) // // var histogram = promauto.NewHistogram(prometheus.HistogramOpts{ // Name: "random_numbers", // Help: "A histogram of normally distributed random numbers.", // Buckets: prometheus.LinearBuckets(-3, .1, 61), // }) // // func Random() { // for { // histogram.Observe(rand.NormFloat64()) // } // } // // func main() { // go Random() // http.Handle("/metrics", promhttp.Handler()) // http.ListenAndServe(":1971", nil) // } // // Prometheus's version of a minimal hello-world program: // // package main // // import ( // "fmt" // "net/http" // // "github.com/prometheus/client_golang/prometheus" // "github.com/prometheus/client_golang/prometheus/promauto" // "github.com/prometheus/client_golang/prometheus/promhttp" // ) // // func main() { // http.Handle("/", promhttp.InstrumentHandlerCounter( // promauto.NewCounterVec( // prometheus.CounterOpts{ // Name: "hello_requests_total", // Help: "Total number of hello-world requests by HTTP code.", // }, // []string{"code"}, // ), // http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // fmt.Fprint(w, "Hello, world!") // }), // )) // http.Handle("/metrics", promhttp.Handler()) // http.ListenAndServe(":1971", nil) // } // // A Factory is created with the With(prometheus.Registerer) function, which // enables two usage patterns. With(prometheus.Registerer) can be called once per // line: // // var ( // reg = prometheus.NewRegistry() // randomNumbers = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ // Name: "random_numbers", // Help: "A histogram of normally distributed random numbers.", // Buckets: prometheus.LinearBuckets(-3, .1, 61), // }) // requestCount = promauto.With(reg).NewCounterVec( // prometheus.CounterOpts{ // Name: "http_requests_total", // Help: "Total number of HTTP requests by status code and method.", // }, // []string{"code", "method"}, // ) // ) // // Or it can be used to create a Factory once to be used multiple times: // // var ( // reg = prometheus.NewRegistry() // factory = promauto.With(reg) // randomNumbers = factory.NewHistogram(prometheus.HistogramOpts{ // Name: "random_numbers", // Help: "A histogram of normally distributed random numbers.", // Buckets: prometheus.LinearBuckets(-3, .1, 61), // }) // requestCount = factory.NewCounterVec( // prometheus.CounterOpts{ // Name: "http_requests_total", // Help: "Total number of HTTP requests by status code and method.", // }, // []string{"code", "method"}, // ) // ) // // This appears very handy. So why are these constructors locked away in a // separate package? // // The main problem is that registration may fail, e.g. if a metric inconsistent // with or equal to the newly to be registered one is already registered. // Therefore, the Register method in the prometheus.Registerer interface returns // an error, and the same is the case for the top-level prometheus.Register // function that registers with the global registry. The prometheus package also // provides MustRegister versions for both. They panic if the registration // fails, and they clearly call this out by using the Must… idiom. Panicking is // problematic in this case because it doesn't just happen on input provided by // the caller that is invalid on its own. Things are a bit more subtle here: // Metric creation and registration tend to be spread widely over the // codebase. It can easily happen that an incompatible metric is added to an // unrelated part of the code, and suddenly code that used to work perfectly // fine starts to panic (provided that the registration of the newly added // metric happens before the registration of the previously existing // metric). This may come as an even bigger surprise with the global registry, // where simply importing another package can trigger a panic (if the newly // imported package registers metrics in its init function). At least, in the // prometheus package, creation of metrics and other collectors is separate from // registration. You first create the metric, and then you decide explicitly if // you want to register it with a local or the global registry, and if you want // to handle the error or risk a panic. With the constructors in the promauto // package, registration is automatic, and if it fails, it will always // panic. Furthermore, the constructors will often be called in the var section // of a file, which means that panicking will happen as a side effect of merely // importing a package. // // A separate package allows conservative users to entirely ignore it. And // whoever wants to use it will do so explicitly, with an opportunity to read // this warning. // // Enjoy promauto responsibly! package promauto import "github.com/prometheus/client_golang/prometheus" // NewCounter works like the function of the same name in the prometheus package // but it automatically registers the Counter with the // prometheus.DefaultRegisterer. If the registration fails, NewCounter panics. func NewCounter(opts prometheus.CounterOpts) prometheus.Counter { return With(prometheus.DefaultRegisterer).NewCounter(opts) } // NewCounterVec works like the function of the same name in the prometheus // package but it automatically registers the CounterVec with the // prometheus.DefaultRegisterer. If the registration fails, NewCounterVec // panics. func NewCounterVec(opts prometheus.CounterOpts, labelNames []string) *prometheus.CounterVec { return With(prometheus.DefaultRegisterer).NewCounterVec(opts, labelNames) } // NewCounterFunc works like the function of the same name in the prometheus // package but it automatically registers the CounterFunc with the // prometheus.DefaultRegisterer. If the registration fails, NewCounterFunc // panics. func NewCounterFunc(opts prometheus.CounterOpts, function func() float64) prometheus.CounterFunc { return With(prometheus.DefaultRegisterer).NewCounterFunc(opts, function) } // NewGauge works like the function of the same name in the prometheus package // but it automatically registers the Gauge with the // prometheus.DefaultRegisterer. If the registration fails, NewGauge panics. func NewGauge(opts prometheus.GaugeOpts) prometheus.Gauge { return With(prometheus.DefaultRegisterer).NewGauge(opts) } // NewGaugeVec works like the function of the same name in the prometheus // package but it automatically registers the GaugeVec with the // prometheus.DefaultRegisterer. If the registration fails, NewGaugeVec panics. func NewGaugeVec(opts prometheus.GaugeOpts, labelNames []string) *prometheus.GaugeVec { return With(prometheus.DefaultRegisterer).NewGaugeVec(opts, labelNames) } // NewGaugeFunc works like the function of the same name in the prometheus // package but it automatically registers the GaugeFunc with the // prometheus.DefaultRegisterer. If the registration fails, NewGaugeFunc panics. func NewGaugeFunc(opts prometheus.GaugeOpts, function func() float64) prometheus.GaugeFunc { return With(prometheus.DefaultRegisterer).NewGaugeFunc(opts, function) } // NewSummary works like the function of the same name in the prometheus package // but it automatically registers the Summary with the // prometheus.DefaultRegisterer. If the registration fails, NewSummary panics. func NewSummary(opts prometheus.SummaryOpts) prometheus.Summary { return With(prometheus.DefaultRegisterer).NewSummary(opts) } // NewSummaryVec works like the function of the same name in the prometheus // package but it automatically registers the SummaryVec with the // prometheus.DefaultRegisterer. If the registration fails, NewSummaryVec // panics. func NewSummaryVec(opts prometheus.SummaryOpts, labelNames []string) *prometheus.SummaryVec { return With(prometheus.DefaultRegisterer).NewSummaryVec(opts, labelNames) } // NewHistogram works like the function of the same name in the prometheus // package but it automatically registers the Histogram with the // prometheus.DefaultRegisterer. If the registration fails, NewHistogram panics. func NewHistogram(opts prometheus.HistogramOpts) prometheus.Histogram { return With(prometheus.DefaultRegisterer).NewHistogram(opts) } // NewHistogramVec works like the function of the same name in the prometheus // package but it automatically registers the HistogramVec with the // prometheus.DefaultRegisterer. If the registration fails, NewHistogramVec // panics. func NewHistogramVec(opts prometheus.HistogramOpts, labelNames []string) *prometheus.HistogramVec { return With(prometheus.DefaultRegisterer).NewHistogramVec(opts, labelNames) } // NewUntypedFunc works like the function of the same name in the prometheus // package but it automatically registers the UntypedFunc with the // prometheus.DefaultRegisterer. If the registration fails, NewUntypedFunc // panics. func NewUntypedFunc(opts prometheus.UntypedOpts, function func() float64) prometheus.UntypedFunc { return With(prometheus.DefaultRegisterer).NewUntypedFunc(opts, function) } // Factory provides factory methods to create Collectors that are automatically // registered with a Registerer. Create a Factory with the With function, // providing a Registerer to auto-register created Collectors with. The zero // value of a Factory creates Collectors that are not registered with any // Registerer. All methods of the Factory panic if the registration fails. type Factory struct { r prometheus.Registerer } // With creates a Factory using the provided Registerer for registration of the // created Collectors. If the provided Registerer is nil, the returned Factory // creates Collectors that are not registered with any Registerer. func With(r prometheus.Registerer) Factory { return Factory{r} } // NewCounter works like the function of the same name in the prometheus package // but it automatically registers the Counter with the Factory's Registerer. func (f Factory) NewCounter(opts prometheus.CounterOpts) prometheus.Counter { c := prometheus.NewCounter(opts) if f.r != nil { f.r.MustRegister(c) } return c } // NewCounterVec works like the function of the same name in the prometheus // package but it automatically registers the CounterVec with the Factory's // Registerer. func (f Factory) NewCounterVec(opts prometheus.CounterOpts, labelNames []string) *prometheus.CounterVec { c := prometheus.NewCounterVec(opts, labelNames) if f.r != nil { f.r.MustRegister(c) } return c } // NewCounterFunc works like the function of the same name in the prometheus // package but it automatically registers the CounterFunc with the Factory's // Registerer. func (f Factory) NewCounterFunc(opts prometheus.CounterOpts, function func() float64) prometheus.CounterFunc { c := prometheus.NewCounterFunc(opts, function) if f.r != nil { f.r.MustRegister(c) } return c } // NewGauge works like the function of the same name in the prometheus package // but it automatically registers the Gauge with the Factory's Registerer. func (f Factory) NewGauge(opts prometheus.GaugeOpts) prometheus.Gauge { g := prometheus.NewGauge(opts) if f.r != nil { f.r.MustRegister(g) } return g } // NewGaugeVec works like the function of the same name in the prometheus // package but it automatically registers the GaugeVec with the Factory's // Registerer. func (f Factory) NewGaugeVec(opts prometheus.GaugeOpts, labelNames []string) *prometheus.GaugeVec { g := prometheus.NewGaugeVec(opts, labelNames) if f.r != nil { f.r.MustRegister(g) } return g } // NewGaugeFunc works like the function of the same name in the prometheus // package but it automatically registers the GaugeFunc with the Factory's // Registerer. func (f Factory) NewGaugeFunc(opts prometheus.GaugeOpts, function func() float64) prometheus.GaugeFunc { g := prometheus.NewGaugeFunc(opts, function) if f.r != nil { f.r.MustRegister(g) } return g } // NewSummary works like the function of the same name in the prometheus package // but it automatically registers the Summary with the Factory's Registerer. func (f Factory) NewSummary(opts prometheus.SummaryOpts) prometheus.Summary { s := prometheus.NewSummary(opts) if f.r != nil { f.r.MustRegister(s) } return s } // NewSummaryVec works like the function of the same name in the prometheus // package but it automatically registers the SummaryVec with the Factory's // Registerer. func (f Factory) NewSummaryVec(opts prometheus.SummaryOpts, labelNames []string) *prometheus.SummaryVec { s := prometheus.NewSummaryVec(opts, labelNames) if f.r != nil { f.r.MustRegister(s) } return s } // NewHistogram works like the function of the same name in the prometheus // package but it automatically registers the Histogram with the Factory's // Registerer. func (f Factory) NewHistogram(opts prometheus.HistogramOpts) prometheus.Histogram { h := prometheus.NewHistogram(opts) if f.r != nil { f.r.MustRegister(h) } return h } // NewHistogramVec works like the function of the same name in the prometheus // package but it automatically registers the HistogramVec with the Factory's // Registerer. func (f Factory) NewHistogramVec(opts prometheus.HistogramOpts, labelNames []string) *prometheus.HistogramVec { h := prometheus.NewHistogramVec(opts, labelNames) if f.r != nil { f.r.MustRegister(h) } return h } // NewUntypedFunc works like the function of the same name in the prometheus // package but it automatically registers the UntypedFunc with the Factory's // Registerer. func (f Factory) NewUntypedFunc(opts prometheus.UntypedOpts, function func() float64) prometheus.UntypedFunc { u := prometheus.NewUntypedFunc(opts, function) if f.r != nil { f.r.MustRegister(u) } return u } client_golang-1.19.1/prometheus/promauto/auto_test.go000066400000000000000000000015151461713521000230110ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promauto import ( "testing" "github.com/prometheus/client_golang/prometheus" ) func TestNil(t *testing.T) { // A nil registerer should be treated as a no-op by promauto. With(nil).NewCounter(prometheus.CounterOpts{Name: "test"}).Inc() } client_golang-1.19.1/prometheus/promhttp/000077500000000000000000000000001461713521000204605ustar00rootroot00000000000000client_golang-1.19.1/prometheus/promhttp/delegator.go000066400000000000000000000266601461713521000227670ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "bufio" "io" "net" "net/http" ) const ( closeNotifier = 1 << iota flusher hijacker readerFrom pusher ) type delegator interface { http.ResponseWriter Status() int Written() int64 } type responseWriterDelegator struct { http.ResponseWriter status int written int64 wroteHeader bool observeWriteHeader func(int) } func (r *responseWriterDelegator) Status() int { return r.status } func (r *responseWriterDelegator) Written() int64 { return r.written } func (r *responseWriterDelegator) WriteHeader(code int) { if r.observeWriteHeader != nil && !r.wroteHeader { // Only call observeWriteHeader for the 1st time. It's a bug if // WriteHeader is called more than once, but we want to protect // against it here. Note that we still delegate the WriteHeader // to the original ResponseWriter to not mask the bug from it. r.observeWriteHeader(code) } r.status = code r.wroteHeader = true r.ResponseWriter.WriteHeader(code) } func (r *responseWriterDelegator) Write(b []byte) (int, error) { // If applicable, call WriteHeader here so that observeWriteHeader is // handled appropriately. if !r.wroteHeader { r.WriteHeader(http.StatusOK) } n, err := r.ResponseWriter.Write(b) r.written += int64(n) return n, err } type ( closeNotifierDelegator struct{ *responseWriterDelegator } flusherDelegator struct{ *responseWriterDelegator } hijackerDelegator struct{ *responseWriterDelegator } readerFromDelegator struct{ *responseWriterDelegator } pusherDelegator struct{ *responseWriterDelegator } ) func (d closeNotifierDelegator) CloseNotify() <-chan bool { //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. return d.ResponseWriter.(http.CloseNotifier).CloseNotify() } func (d flusherDelegator) Flush() { // If applicable, call WriteHeader here so that observeWriteHeader is // handled appropriately. if !d.wroteHeader { d.WriteHeader(http.StatusOK) } d.ResponseWriter.(http.Flusher).Flush() } func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { return d.ResponseWriter.(http.Hijacker).Hijack() } func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { // If applicable, call WriteHeader here so that observeWriteHeader is // handled appropriately. if !d.wroteHeader { d.WriteHeader(http.StatusOK) } n, err := d.ResponseWriter.(io.ReaderFrom).ReadFrom(re) d.written += n return n, err } func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { return d.ResponseWriter.(http.Pusher).Push(target, opts) } var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32) func init() { // TODO(beorn7): Code generation would help here. pickDelegator[0] = func(d *responseWriterDelegator) delegator { // 0 return d } pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1 return closeNotifierDelegator{d} } pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2 return flusherDelegator{d} } pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3 return struct { *responseWriterDelegator http.Flusher http.CloseNotifier }{d, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[hijacker] = func(d *responseWriterDelegator) delegator { // 4 return hijackerDelegator{d} } pickDelegator[hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 5 return struct { *responseWriterDelegator http.Hijacker http.CloseNotifier }{d, hijackerDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 6 return struct { *responseWriterDelegator http.Hijacker http.Flusher }{d, hijackerDelegator{d}, flusherDelegator{d}} } pickDelegator[hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 7 return struct { *responseWriterDelegator http.Hijacker http.Flusher http.CloseNotifier }{d, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[readerFrom] = func(d *responseWriterDelegator) delegator { // 8 return readerFromDelegator{d} } pickDelegator[readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 9 return struct { *responseWriterDelegator io.ReaderFrom http.CloseNotifier }{d, readerFromDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 10 return struct { *responseWriterDelegator io.ReaderFrom http.Flusher }{d, readerFromDelegator{d}, flusherDelegator{d}} } pickDelegator[readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 11 return struct { *responseWriterDelegator io.ReaderFrom http.Flusher http.CloseNotifier }{d, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 12 return struct { *responseWriterDelegator io.ReaderFrom http.Hijacker }{d, readerFromDelegator{d}, hijackerDelegator{d}} } pickDelegator[readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 13 return struct { *responseWriterDelegator io.ReaderFrom http.Hijacker http.CloseNotifier }{d, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 14 return struct { *responseWriterDelegator io.ReaderFrom http.Hijacker http.Flusher }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} } pickDelegator[readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 15 return struct { *responseWriterDelegator io.ReaderFrom http.Hijacker http.Flusher http.CloseNotifier }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 return pusherDelegator{d} } pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 return struct { *responseWriterDelegator http.Pusher http.CloseNotifier }{d, pusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18 return struct { *responseWriterDelegator http.Pusher http.Flusher }{d, pusherDelegator{d}, flusherDelegator{d}} } pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19 return struct { *responseWriterDelegator http.Pusher http.Flusher http.CloseNotifier }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20 return struct { *responseWriterDelegator http.Pusher http.Hijacker }{d, pusherDelegator{d}, hijackerDelegator{d}} } pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21 return struct { *responseWriterDelegator http.Pusher http.Hijacker http.CloseNotifier }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22 return struct { *responseWriterDelegator http.Pusher http.Hijacker http.Flusher }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} } pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 23 return struct { *responseWriterDelegator http.Pusher http.Hijacker http.Flusher http.CloseNotifier }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom }{d, pusherDelegator{d}, readerFromDelegator{d}} } pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.CloseNotifier }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Flusher }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}} } pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Flusher http.CloseNotifier }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Hijacker }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}} } pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Hijacker http.CloseNotifier }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} } pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Hijacker http.Flusher }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} } pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31 return struct { *responseWriterDelegator http.Pusher io.ReaderFrom http.Hijacker http.Flusher http.CloseNotifier }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} } } func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { d := &responseWriterDelegator{ ResponseWriter: w, observeWriteHeader: observeWriteHeaderFunc, } id := 0 //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. if _, ok := w.(http.CloseNotifier); ok { id += closeNotifier } if _, ok := w.(http.Flusher); ok { id += flusher } if _, ok := w.(http.Hijacker); ok { id += hijacker } if _, ok := w.(io.ReaderFrom); ok { id += readerFrom } if _, ok := w.(http.Pusher); ok { id += pusher } return pickDelegator[id](d) } client_golang-1.19.1/prometheus/promhttp/http.go000066400000000000000000000371651461713521000220020ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package promhttp provides tooling around HTTP servers and clients. // // First, the package allows the creation of http.Handler instances to expose // Prometheus metrics via HTTP. promhttp.Handler acts on the // prometheus.DefaultGatherer. With HandlerFor, you can create a handler for a // custom registry or anything that implements the Gatherer interface. It also // allows the creation of handlers that act differently on errors or allow to // log errors. // // Second, the package provides tooling to instrument instances of http.Handler // via middleware. Middleware wrappers follow the naming scheme // InstrumentHandlerX, where X describes the intended use of the middleware. // See each function's doc comment for specific details. // // Finally, the package allows for an http.RoundTripper to be instrumented via // middleware. Middleware wrappers follow the naming scheme // InstrumentRoundTripperX, where X describes the intended use of the // middleware. See each function's doc comment for specific details. package promhttp import ( "compress/gzip" "errors" "fmt" "io" "net/http" "strconv" "strings" "sync" "time" "github.com/prometheus/common/expfmt" "github.com/prometheus/client_golang/prometheus" ) const ( contentTypeHeader = "Content-Type" contentEncodingHeader = "Content-Encoding" acceptEncodingHeader = "Accept-Encoding" processStartTimeHeader = "Process-Start-Time-Unix" ) var gzipPool = sync.Pool{ New: func() interface{} { return gzip.NewWriter(nil) }, } // Handler returns an http.Handler for the prometheus.DefaultGatherer, using // default HandlerOpts, i.e. it reports the first error as an HTTP error, it has // no error logging, and it applies compression if requested by the client. // // The returned http.Handler is already instrumented using the // InstrumentMetricHandler function and the prometheus.DefaultRegisterer. If you // create multiple http.Handlers by separate calls of the Handler function, the // metrics used for instrumentation will be shared between them, providing // global scrape counts. // // This function is meant to cover the bulk of basic use cases. If you are doing // anything that requires more customization (including using a non-default // Gatherer, different instrumentation, and non-default HandlerOpts), use the // HandlerFor function. See there for details. func Handler() http.Handler { return InstrumentMetricHandler( prometheus.DefaultRegisterer, HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}), ) } // HandlerFor returns an uninstrumented http.Handler for the provided // Gatherer. The behavior of the Handler is defined by the provided // HandlerOpts. Thus, HandlerFor is useful to create http.Handlers for custom // Gatherers, with non-default HandlerOpts, and/or with custom (or no) // instrumentation. Use the InstrumentMetricHandler function to apply the same // kind of instrumentation as it is used by the Handler function. func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { return HandlerForTransactional(prometheus.ToTransactionalGatherer(reg), opts) } // HandlerForTransactional is like HandlerFor, but it uses transactional gather, which // can safely change in-place returned *dto.MetricFamily before call to `Gather` and after // call to `done` of that `Gather`. func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerOpts) http.Handler { var ( inFlightSem chan struct{} errCnt = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "promhttp_metric_handler_errors_total", Help: "Total number of internal errors encountered by the promhttp metric handler.", }, []string{"cause"}, ) ) if opts.MaxRequestsInFlight > 0 { inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight) } if opts.Registry != nil { // Initialize all possibilities that can occur below. errCnt.WithLabelValues("gathering") errCnt.WithLabelValues("encoding") if err := opts.Registry.Register(errCnt); err != nil { are := &prometheus.AlreadyRegisteredError{} if errors.As(err, are) { errCnt = are.ExistingCollector.(*prometheus.CounterVec) } else { panic(err) } } } h := http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { if !opts.ProcessStartTime.IsZero() { rsp.Header().Set(processStartTimeHeader, strconv.FormatInt(opts.ProcessStartTime.Unix(), 10)) } if inFlightSem != nil { select { case inFlightSem <- struct{}{}: // All good, carry on. defer func() { <-inFlightSem }() default: http.Error(rsp, fmt.Sprintf( "Limit of concurrent requests reached (%d), try again later.", opts.MaxRequestsInFlight, ), http.StatusServiceUnavailable) return } } mfs, done, err := reg.Gather() defer done() if err != nil { if opts.ErrorLog != nil { opts.ErrorLog.Println("error gathering metrics:", err) } errCnt.WithLabelValues("gathering").Inc() switch opts.ErrorHandling { case PanicOnError: panic(err) case ContinueOnError: if len(mfs) == 0 { // Still report the error if no metrics have been gathered. httpError(rsp, err) return } case HTTPErrorOnError: httpError(rsp, err) return } } var contentType expfmt.Format if opts.EnableOpenMetrics { contentType = expfmt.NegotiateIncludingOpenMetrics(req.Header) } else { contentType = expfmt.Negotiate(req.Header) } header := rsp.Header() header.Set(contentTypeHeader, string(contentType)) w := io.Writer(rsp) if !opts.DisableCompression && gzipAccepted(req.Header) { header.Set(contentEncodingHeader, "gzip") gz := gzipPool.Get().(*gzip.Writer) defer gzipPool.Put(gz) gz.Reset(w) defer gz.Close() w = gz } enc := expfmt.NewEncoder(w, contentType) // handleError handles the error according to opts.ErrorHandling // and returns true if we have to abort after the handling. handleError := func(err error) bool { if err == nil { return false } if opts.ErrorLog != nil { opts.ErrorLog.Println("error encoding and sending metric family:", err) } errCnt.WithLabelValues("encoding").Inc() switch opts.ErrorHandling { case PanicOnError: panic(err) case HTTPErrorOnError: // We cannot really send an HTTP error at this // point because we most likely have written // something to rsp already. But at least we can // stop sending. return true } // Do nothing in all other cases, including ContinueOnError. return false } for _, mf := range mfs { if handleError(enc.Encode(mf)) { return } } if closer, ok := enc.(expfmt.Closer); ok { // This in particular takes care of the final "# EOF\n" line for OpenMetrics. if handleError(closer.Close()) { return } } }) if opts.Timeout <= 0 { return h } return http.TimeoutHandler(h, opts.Timeout, fmt.Sprintf( "Exceeded configured timeout of %v.\n", opts.Timeout, )) } // InstrumentMetricHandler is usually used with an http.Handler returned by the // HandlerFor function. It instruments the provided http.Handler with two // metrics: A counter vector "promhttp_metric_handler_requests_total" to count // scrapes partitioned by HTTP status code, and a gauge // "promhttp_metric_handler_requests_in_flight" to track the number of // simultaneous scrapes. This function idempotently registers collectors for // both metrics with the provided Registerer. It panics if the registration // fails. The provided metrics are useful to see how many scrapes hit the // monitored target (which could be from different Prometheus servers or other // scrapers), and how often they overlap (which would result in more than one // scrape in flight at the same time). Note that the scrapes-in-flight gauge // will contain the scrape by which it is exposed, while the scrape counter will // only get incremented after the scrape is complete (as only then the status // code is known). For tracking scrape durations, use the // "scrape_duration_seconds" gauge created by the Prometheus server upon each // scrape. func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Handler) http.Handler { cnt := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "promhttp_metric_handler_requests_total", Help: "Total number of scrapes by HTTP status code.", }, []string{"code"}, ) // Initialize the most likely HTTP status codes. cnt.WithLabelValues("200") cnt.WithLabelValues("500") cnt.WithLabelValues("503") if err := reg.Register(cnt); err != nil { are := &prometheus.AlreadyRegisteredError{} if errors.As(err, are) { cnt = are.ExistingCollector.(*prometheus.CounterVec) } else { panic(err) } } gge := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "promhttp_metric_handler_requests_in_flight", Help: "Current number of scrapes being served.", }) if err := reg.Register(gge); err != nil { are := &prometheus.AlreadyRegisteredError{} if errors.As(err, are) { gge = are.ExistingCollector.(prometheus.Gauge) } else { panic(err) } } return InstrumentHandlerCounter(cnt, InstrumentHandlerInFlight(gge, handler)) } // HandlerErrorHandling defines how a Handler serving metrics will handle // errors. type HandlerErrorHandling int // These constants cause handlers serving metrics to behave as described if // errors are encountered. const ( // Serve an HTTP status code 500 upon the first error // encountered. Report the error message in the body. Note that HTTP // errors cannot be served anymore once the beginning of a regular // payload has been sent. Thus, in the (unlikely) case that encoding the // payload into the negotiated wire format fails, serving the response // will simply be aborted. Set an ErrorLog in HandlerOpts to detect // those errors. HTTPErrorOnError HandlerErrorHandling = iota // Ignore errors and try to serve as many metrics as possible. However, // if no metrics can be served, serve an HTTP status code 500 and the // last error message in the body. Only use this in deliberate "best // effort" metrics collection scenarios. In this case, it is highly // recommended to provide other means of detecting errors: By setting an // ErrorLog in HandlerOpts, the errors are logged. By providing a // Registry in HandlerOpts, the exposed metrics include an error counter // "promhttp_metric_handler_errors_total", which can be used for // alerts. ContinueOnError // Panic upon the first error encountered (useful for "crash only" apps). PanicOnError ) // Logger is the minimal interface HandlerOpts needs for logging. Note that // log.Logger from the standard library implements this interface, and it is // easy to implement by custom loggers, if they don't do so already anyway. type Logger interface { Println(v ...interface{}) } // HandlerOpts specifies options how to serve metrics via an http.Handler. The // zero value of HandlerOpts is a reasonable default. type HandlerOpts struct { // ErrorLog specifies an optional Logger for errors collecting and // serving metrics. If nil, errors are not logged at all. Note that the // type of a reported error is often prometheus.MultiError, which // formats into a multi-line error string. If you want to avoid the // latter, create a Logger implementation that detects a // prometheus.MultiError and formats the contained errors into one line. ErrorLog Logger // ErrorHandling defines how errors are handled. Note that errors are // logged regardless of the configured ErrorHandling provided ErrorLog // is not nil. ErrorHandling HandlerErrorHandling // If Registry is not nil, it is used to register a metric // "promhttp_metric_handler_errors_total", partitioned by "cause". A // failed registration causes a panic. Note that this error counter is // different from the instrumentation you get from the various // InstrumentHandler... helpers. It counts errors that don't necessarily // result in a non-2xx HTTP status code. There are two typical cases: // (1) Encoding errors that only happen after streaming of the HTTP body // has already started (and the status code 200 has been sent). This // should only happen with custom collectors. (2) Collection errors with // no effect on the HTTP status code because ErrorHandling is set to // ContinueOnError. Registry prometheus.Registerer // If DisableCompression is true, the handler will never compress the // response, even if requested by the client. DisableCompression bool // The number of concurrent HTTP requests is limited to // MaxRequestsInFlight. Additional requests are responded to with 503 // Service Unavailable and a suitable message in the body. If // MaxRequestsInFlight is 0 or negative, no limit is applied. MaxRequestsInFlight int // If handling a request takes longer than Timeout, it is responded to // with 503 ServiceUnavailable and a suitable Message. No timeout is // applied if Timeout is 0 or negative. Note that with the current // implementation, reaching the timeout simply ends the HTTP requests as // described above (and even that only if sending of the body hasn't // started yet), while the bulk work of gathering all the metrics keeps // running in the background (with the eventual result to be thrown // away). Until the implementation is improved, it is recommended to // implement a separate timeout in potentially slow Collectors. Timeout time.Duration // If true, the experimental OpenMetrics encoding is added to the // possible options during content negotiation. Note that Prometheus // 2.5.0+ will negotiate OpenMetrics as first priority. OpenMetrics is // the only way to transmit exemplars. However, the move to OpenMetrics // is not completely transparent. Most notably, the values of "quantile" // labels of Summaries and "le" labels of Histograms are formatted with // a trailing ".0" if they would otherwise look like integer numbers // (which changes the identity of the resulting series on the Prometheus // server). EnableOpenMetrics bool // ProcessStartTime allows setting process start timevalue that will be exposed // with "Process-Start-Time-Unix" response header along with the metrics // payload. This allow callers to have efficient transformations to cumulative // counters (e.g. OpenTelemetry) or generally _created timestamp estimation per // scrape target. // NOTE: This feature is experimental and not covered by OpenMetrics or Prometheus // exposition format. ProcessStartTime time.Time } // gzipAccepted returns whether the client will accept gzip-encoded content. func gzipAccepted(header http.Header) bool { a := header.Get(acceptEncodingHeader) parts := strings.Split(a, ",") for _, part := range parts { part = strings.TrimSpace(part) if part == "gzip" || strings.HasPrefix(part, "gzip;") { return true } } return false } // httpError removes any content-encoding header and then calls http.Error with // the provided error and http.StatusInternalServerError. Error contents is // supposed to be uncompressed plain text. Same as with a plain http.Error, this // must not be called if the header or any payload has already been sent. func httpError(rsp http.ResponseWriter, err error) { rsp.Header().Del(contentEncodingHeader) http.Error( rsp, "An error has occurred while serving metrics:\n\n"+err.Error(), http.StatusInternalServerError, ) } client_golang-1.19.1/prometheus/promhttp/http_test.go000066400000000000000000000251631461713521000230340ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "bytes" "errors" "fmt" "log" "net/http" "net/http/httptest" "strings" "testing" "time" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus" ) type errorCollector struct{} func (e errorCollector) Describe(ch chan<- *prometheus.Desc) { ch <- prometheus.NewDesc("invalid_metric", "not helpful", nil, nil) } func (e errorCollector) Collect(ch chan<- prometheus.Metric) { ch <- prometheus.NewInvalidMetric( prometheus.NewDesc("invalid_metric", "not helpful", nil, nil), errors.New("collect error"), ) } type blockingCollector struct { CollectStarted, Block chan struct{} } func (b blockingCollector) Describe(ch chan<- *prometheus.Desc) { ch <- prometheus.NewDesc("dummy_desc", "not helpful", nil, nil) } func (b blockingCollector) Collect(ch chan<- prometheus.Metric) { select { case b.CollectStarted <- struct{}{}: default: } // Collects nothing, just waits for a channel receive. <-b.Block } type mockTransactionGatherer struct { g prometheus.Gatherer gatherInvoked int doneInvoked int } func (g *mockTransactionGatherer) Gather() (_ []*dto.MetricFamily, done func(), err error) { g.gatherInvoked++ mfs, err := g.g.Gather() return mfs, func() { g.doneInvoked++ }, err } func TestHandlerErrorHandling(t *testing.T) { // Create a registry that collects a MetricFamily with two elements, // another with one, and reports an error. Further down, we'll use the // same registry in the HandlerOpts. reg := prometheus.NewRegistry() cnt := prometheus.NewCounter(prometheus.CounterOpts{ Name: "the_count", Help: "Ah-ah-ah! Thunder and lightning!", }) reg.MustRegister(cnt) cntVec := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, }, []string{"labelname"}, ) cntVec.WithLabelValues("val1").Inc() cntVec.WithLabelValues("val2").Inc() reg.MustRegister(cntVec) reg.MustRegister(errorCollector{}) logBuf := &bytes.Buffer{} logger := log.New(logBuf, "", 0) writer := httptest.NewRecorder() request, _ := http.NewRequest("GET", "/", nil) request.Header.Add("Accept", "test/plain") mReg := &mockTransactionGatherer{g: reg} errorHandler := HandlerForTransactional(mReg, HandlerOpts{ ErrorLog: logger, ErrorHandling: HTTPErrorOnError, Registry: reg, }) continueHandler := HandlerForTransactional(mReg, HandlerOpts{ ErrorLog: logger, ErrorHandling: ContinueOnError, Registry: reg, }) panicHandler := HandlerForTransactional(mReg, HandlerOpts{ ErrorLog: logger, ErrorHandling: PanicOnError, Registry: reg, }) // Expect gatherer not touched. if got := mReg.gatherInvoked; got != 0 { t.Fatalf("unexpected number of gather invokes, want 0, got %d", got) } if got := mReg.doneInvoked; got != 0 { t.Fatalf("unexpected number of done invokes, want 0, got %d", got) } wantMsg := `error gathering metrics: error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: {}}: collect error ` wantErrorBody := `An error has occurred while serving metrics: error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: {}}: collect error ` wantOKBody1 := `# HELP name docstring # TYPE name counter name{constname="constvalue",labelname="val1"} 1 name{constname="constvalue",labelname="val2"} 1 # HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler. # TYPE promhttp_metric_handler_errors_total counter promhttp_metric_handler_errors_total{cause="encoding"} 0 promhttp_metric_handler_errors_total{cause="gathering"} 1 # HELP the_count Ah-ah-ah! Thunder and lightning! # TYPE the_count counter the_count 0 ` // It might happen that counting the gathering error makes it to the // promhttp_metric_handler_errors_total counter before it is gathered // itself. Thus, we have to bodies that are acceptable for the test. wantOKBody2 := `# HELP name docstring # TYPE name counter name{constname="constvalue",labelname="val1"} 1 name{constname="constvalue",labelname="val2"} 1 # HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler. # TYPE promhttp_metric_handler_errors_total counter promhttp_metric_handler_errors_total{cause="encoding"} 0 promhttp_metric_handler_errors_total{cause="gathering"} 2 # HELP the_count Ah-ah-ah! Thunder and lightning! # TYPE the_count counter the_count 0 ` errorHandler.ServeHTTP(writer, request) if got := mReg.gatherInvoked; got != 1 { t.Fatalf("unexpected number of gather invokes, want 1, got %d", got) } if got := mReg.doneInvoked; got != 1 { t.Fatalf("unexpected number of done invokes, want 1, got %d", got) } if got, want := writer.Code, http.StatusInternalServerError; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } if got, want := logBuf.String(), wantMsg; got != want { t.Errorf("got log buf %q, want %q", got, want) } if got, want := writer.Body.String(), wantErrorBody; got != want { t.Errorf("got body %q, want %q", got, want) } logBuf.Reset() writer.Body.Reset() writer.Code = http.StatusOK continueHandler.ServeHTTP(writer, request) if got := mReg.gatherInvoked; got != 2 { t.Fatalf("unexpected number of gather invokes, want 2, got %d", got) } if got := mReg.doneInvoked; got != 2 { t.Fatalf("unexpected number of done invokes, want 2, got %d", got) } if got, want := writer.Code, http.StatusOK; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } if got, want := logBuf.String(), wantMsg; got != want { t.Errorf("got log buf %q, want %q", got, want) } if got := writer.Body.String(); got != wantOKBody1 && got != wantOKBody2 { t.Errorf("got body %q, want either %q or %q", got, wantOKBody1, wantOKBody2) } defer func() { if err := recover(); err == nil { t.Error("expected panic from panicHandler") } if got := mReg.gatherInvoked; got != 3 { t.Fatalf("unexpected number of gather invokes, want 3, got %d", got) } if got := mReg.doneInvoked; got != 3 { t.Fatalf("unexpected number of done invokes, want 3, got %d", got) } }() panicHandler.ServeHTTP(writer, request) } func TestInstrumentMetricHandler(t *testing.T) { reg := prometheus.NewRegistry() mReg := &mockTransactionGatherer{g: reg} handler := InstrumentMetricHandler(reg, HandlerForTransactional(mReg, HandlerOpts{})) // Do it again to test idempotency. InstrumentMetricHandler(reg, HandlerForTransactional(mReg, HandlerOpts{})) writer := httptest.NewRecorder() request, _ := http.NewRequest("GET", "/", nil) request.Header.Add("Accept", "test/plain") handler.ServeHTTP(writer, request) if got := mReg.gatherInvoked; got != 1 { t.Fatalf("unexpected number of gather invokes, want 1, got %d", got) } if got := mReg.doneInvoked; got != 1 { t.Fatalf("unexpected number of done invokes, want 1, got %d", got) } if got, want := writer.Code, http.StatusOK; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } want := "promhttp_metric_handler_requests_in_flight 1\n" if got := writer.Body.String(); !strings.Contains(got, want) { t.Errorf("got body %q, does not contain %q", got, want) } want = "promhttp_metric_handler_requests_total{code=\"200\"} 0\n" if got := writer.Body.String(); !strings.Contains(got, want) { t.Errorf("got body %q, does not contain %q", got, want) } for i := 0; i < 100; i++ { writer.Body.Reset() handler.ServeHTTP(writer, request) if got, want := mReg.gatherInvoked, i+2; got != want { t.Fatalf("unexpected number of gather invokes, want %d, got %d", want, got) } if got, want := mReg.doneInvoked, i+2; got != want { t.Fatalf("unexpected number of done invokes, want %d, got %d", want, got) } if got, want := writer.Code, http.StatusOK; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } want := "promhttp_metric_handler_requests_in_flight 1\n" if got := writer.Body.String(); !strings.Contains(got, want) { t.Errorf("got body %q, does not contain %q", got, want) } want = fmt.Sprintf("promhttp_metric_handler_requests_total{code=\"200\"} %d\n", i+1) if got := writer.Body.String(); !strings.Contains(got, want) { t.Errorf("got body %q, does not contain %q", got, want) } } } func TestHandlerMaxRequestsInFlight(t *testing.T) { reg := prometheus.NewRegistry() handler := HandlerFor(reg, HandlerOpts{MaxRequestsInFlight: 1}) w1 := httptest.NewRecorder() w2 := httptest.NewRecorder() w3 := httptest.NewRecorder() request, _ := http.NewRequest("GET", "/", nil) request.Header.Add("Accept", "test/plain") c := blockingCollector{Block: make(chan struct{}), CollectStarted: make(chan struct{}, 1)} reg.MustRegister(c) rq1Done := make(chan struct{}) go func() { handler.ServeHTTP(w1, request) close(rq1Done) }() <-c.CollectStarted handler.ServeHTTP(w2, request) if got, want := w2.Code, http.StatusServiceUnavailable; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } if got, want := w2.Body.String(), "Limit of concurrent requests reached (1), try again later.\n"; got != want { t.Errorf("got body %q, want %q", got, want) } close(c.Block) <-rq1Done handler.ServeHTTP(w3, request) if got, want := w3.Code, http.StatusOK; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } } func TestHandlerTimeout(t *testing.T) { reg := prometheus.NewRegistry() handler := HandlerFor(reg, HandlerOpts{Timeout: time.Millisecond}) w := httptest.NewRecorder() request, _ := http.NewRequest("GET", "/", nil) request.Header.Add("Accept", "test/plain") c := blockingCollector{Block: make(chan struct{}), CollectStarted: make(chan struct{}, 1)} reg.MustRegister(c) handler.ServeHTTP(w, request) if got, want := w.Code, http.StatusServiceUnavailable; got != want { t.Errorf("got HTTP status code %d, want %d", got, want) } if got, want := w.Body.String(), "Exceeded configured timeout of 1ms.\n"; got != want { t.Errorf("got body %q, want %q", got, want) } close(c.Block) // To not leak a goroutine. } client_golang-1.19.1/prometheus/promhttp/instrument_client.go000066400000000000000000000222341461713521000245600ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "crypto/tls" "net/http" "net/http/httptrace" "time" "github.com/prometheus/client_golang/prometheus" ) // The RoundTripperFunc type is an adapter to allow the use of ordinary // functions as RoundTrippers. If f is a function with the appropriate // signature, RountTripperFunc(f) is a RoundTripper that calls f. type RoundTripperFunc func(req *http.Request) (*http.Response, error) // RoundTrip implements the RoundTripper interface. func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { return rt(r) } // InstrumentRoundTripperInFlight is a middleware that wraps the provided // http.RoundTripper. It sets the provided prometheus.Gauge to the number of // requests currently handled by the wrapped http.RoundTripper. // // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripper) RoundTripperFunc { return func(r *http.Request) (*http.Response, error) { gauge.Inc() defer gauge.Dec() return next.RoundTrip(r) } } // InstrumentRoundTripperCounter is a middleware that wraps the provided // http.RoundTripper to observe the request result with the provided CounterVec. // The CounterVec must have zero, one, or two non-const non-curried labels. For // those, the only allowed label names are "code" and "method". The function // panics otherwise. For the "method" label a predefined default label value set // is used to filter given values. Values besides predefined values will count // as `unknown` method.`WithExtraMethods` can be used to add more // methods to the set. Partitioning of the CounterVec happens by HTTP status code // and/or HTTP method if the respective instance label names are present in the // CounterVec. For unpartitioned counting, use a CounterVec with zero labels. // // If the wrapped RoundTripper panics or returns a non-nil error, the Counter // is not incremented. // // Use with WithExemplarFromContext to instrument the exemplars on the counter of requests. // // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.RoundTripper, opts ...Option) RoundTripperFunc { rtOpts := defaultOptions() for _, o := range opts { o.apply(rtOpts) } // Curry the counter with dynamic labels before checking the remaining labels. code, method := checkLabels(counter.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { resp, err := next.RoundTrip(r) if err == nil { l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) for label, resolve := range rtOpts.extraLabelsFromCtx { l[label] = resolve(resp.Request.Context()) } addWithExemplar(counter.With(l), 1, rtOpts.getExemplarFn(r.Context())) } return resp, err } } // InstrumentRoundTripperDuration is a middleware that wraps the provided // http.RoundTripper to observe the request duration with the provided // ObserverVec. The ObserverVec must have zero, one, or two non-const // non-curried labels. For those, the only allowed label names are "code" and // "method". The function panics otherwise. For the "method" label a predefined // default label value set is used to filter given values. Values besides // predefined values will count as `unknown` method. `WithExtraMethods` // can be used to add more methods to the set. The Observe method of the Observer // in the ObserverVec is called with the request duration in // seconds. Partitioning happens by HTTP status code and/or HTTP method if the // respective instance label names are present in the ObserverVec. For // unpartitioned observations, use an ObserverVec with zero labels. Note that // partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped RoundTripper panics or returns a non-nil error, no values are // reported. // // Use with WithExemplarFromContext to instrument the exemplars on the duration histograms. // // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundTripper, opts ...Option) RoundTripperFunc { rtOpts := defaultOptions() for _, o := range opts { o.apply(rtOpts) } // Curry the observer with dynamic labels before checking the remaining labels. code, method := checkLabels(obs.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { start := time.Now() resp, err := next.RoundTrip(r) if err == nil { l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) for label, resolve := range rtOpts.extraLabelsFromCtx { l[label] = resolve(resp.Request.Context()) } observeWithExemplar(obs.With(l), time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context())) } return resp, err } } // InstrumentTrace is used to offer flexibility in instrumenting the available // httptrace.ClientTrace hook functions. Each function is passed a float64 // representing the time in seconds since the start of the http request. A user // may choose to use separately buckets Histograms, or implement custom // instance labels on a per function basis. type InstrumentTrace struct { GotConn func(float64) PutIdleConn func(float64) GotFirstResponseByte func(float64) Got100Continue func(float64) DNSStart func(float64) DNSDone func(float64) ConnectStart func(float64) ConnectDone func(float64) TLSHandshakeStart func(float64) TLSHandshakeDone func(float64) WroteHeaders func(float64) Wait100Continue func(float64) WroteRequest func(float64) } // InstrumentRoundTripperTrace is a middleware that wraps the provided // RoundTripper and reports times to hook functions provided in the // InstrumentTrace struct. Hook functions that are not present in the provided // InstrumentTrace struct are ignored. Times reported to the hook functions are // time since the start of the request. Only with Go1.9+, those times are // guaranteed to never be negative. (Earlier Go versions are not using a // monotonic clock.) Note that partitioning of Histograms is expensive and // should be used judiciously. // // For hook functions that receive an error as an argument, no observations are // made in the event of a non-nil error value. // // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { return func(r *http.Request) (*http.Response, error) { start := time.Now() trace := &httptrace.ClientTrace{ GotConn: func(_ httptrace.GotConnInfo) { if it.GotConn != nil { it.GotConn(time.Since(start).Seconds()) } }, PutIdleConn: func(err error) { if err != nil { return } if it.PutIdleConn != nil { it.PutIdleConn(time.Since(start).Seconds()) } }, DNSStart: func(_ httptrace.DNSStartInfo) { if it.DNSStart != nil { it.DNSStart(time.Since(start).Seconds()) } }, DNSDone: func(_ httptrace.DNSDoneInfo) { if it.DNSDone != nil { it.DNSDone(time.Since(start).Seconds()) } }, ConnectStart: func(_, _ string) { if it.ConnectStart != nil { it.ConnectStart(time.Since(start).Seconds()) } }, ConnectDone: func(_, _ string, err error) { if err != nil { return } if it.ConnectDone != nil { it.ConnectDone(time.Since(start).Seconds()) } }, GotFirstResponseByte: func() { if it.GotFirstResponseByte != nil { it.GotFirstResponseByte(time.Since(start).Seconds()) } }, Got100Continue: func() { if it.Got100Continue != nil { it.Got100Continue(time.Since(start).Seconds()) } }, TLSHandshakeStart: func() { if it.TLSHandshakeStart != nil { it.TLSHandshakeStart(time.Since(start).Seconds()) } }, TLSHandshakeDone: func(_ tls.ConnectionState, err error) { if err != nil { return } if it.TLSHandshakeDone != nil { it.TLSHandshakeDone(time.Since(start).Seconds()) } }, WroteHeaders: func() { if it.WroteHeaders != nil { it.WroteHeaders(time.Since(start).Seconds()) } }, Wait100Continue: func() { if it.Wait100Continue != nil { it.Wait100Continue(time.Since(start).Seconds()) } }, WroteRequest: func(_ httptrace.WroteRequestInfo) { if it.WroteRequest != nil { it.WroteRequest(time.Since(start).Seconds()) } }, } r = r.WithContext(httptrace.WithClientTrace(r.Context(), trace)) return next.RoundTrip(r) } } client_golang-1.19.1/prometheus/promhttp/instrument_client_test.go000066400000000000000000000257461461713521000256320ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "context" "log" "net/http" "net/http/httptest" "reflect" "sort" "strings" "testing" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/testutil" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) func makeInstrumentedClient(opts ...Option) (*http.Client, *prometheus.Registry) { client := http.DefaultClient client.Timeout = 1 * time.Second reg := prometheus.NewRegistry() inFlightGauge := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "client_in_flight_requests", Help: "A gauge of in-flight requests for the wrapped client.", }) counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "client_api_requests_total", Help: "A counter for requests from the wrapped client.", }, []string{"code", "method"}, ) dnsLatencyVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "dns_duration_seconds", Help: "Trace dns latency histogram.", Buckets: []float64{.005, .01, .025, .05}, }, []string{"event"}, ) tlsLatencyVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "tls_duration_seconds", Help: "Trace tls latency histogram.", Buckets: []float64{.05, .1, .25, .5}, }, []string{"event"}, ) histVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of request latencies.", Buckets: prometheus.DefBuckets, }, []string{"method"}, ) reg.MustRegister(counter, tlsLatencyVec, dnsLatencyVec, histVec, inFlightGauge) trace := &InstrumentTrace{ DNSStart: func(t float64) { dnsLatencyVec.WithLabelValues("dns_start").Observe(t) }, DNSDone: func(t float64) { dnsLatencyVec.WithLabelValues("dns_done").Observe(t) }, TLSHandshakeStart: func(t float64) { tlsLatencyVec.WithLabelValues("tls_handshake_start").Observe(t) }, TLSHandshakeDone: func(t float64) { tlsLatencyVec.WithLabelValues("tls_handshake_done").Observe(t) }, } client.Transport = InstrumentRoundTripperInFlight(inFlightGauge, InstrumentRoundTripperCounter(counter, InstrumentRoundTripperTrace(trace, InstrumentRoundTripperDuration(histVec, http.DefaultTransport, opts...), ), opts...), ) return client, reg } func labelsToLabelPair(l prometheus.Labels) []*dto.LabelPair { ret := make([]*dto.LabelPair, 0, len(l)) for k, v := range l { ret = append(ret, &dto.LabelPair{Name: proto.String(k), Value: proto.String(v)}) } sort.Slice(ret, func(i, j int) bool { return *ret[i].Name < *ret[j].Name }) return ret } func assetMetricAndExemplars( t *testing.T, reg *prometheus.Registry, expectedNumMetrics int, expectedExemplar []*dto.LabelPair, ) { t.Helper() mfs, err := reg.Gather() if err != nil { t.Fatal(err) } if want, got := expectedNumMetrics, len(mfs); want != got { t.Fatalf("unexpected number of metric families gathered, want %d, got %d", want, got) } for _, mf := range mfs { if len(mf.Metric) == 0 { t.Errorf("metric family %s must not be empty", mf.GetName()) } for _, m := range mf.GetMetric() { if c := m.GetCounter(); c != nil { if len(expectedExemplar) == 0 { if c.Exemplar != nil { t.Errorf("expected no exemplar on the counter %v%v, got %v", mf.GetName(), m.Label, c.Exemplar.String()) } continue } if c.Exemplar == nil { t.Errorf("expected exemplar %v on the counter %v%v, got none", expectedExemplar, mf.GetName(), m.Label) continue } if got := c.Exemplar.Label; !reflect.DeepEqual(expectedExemplar, got) { t.Errorf("expected exemplar %v on the counter %v%v, got %v", expectedExemplar, mf.GetName(), m.Label, got) } continue } if h := m.GetHistogram(); h != nil { found := false for _, b := range h.GetBucket() { if len(expectedExemplar) == 0 { if b.Exemplar != nil { t.Errorf("expected no exemplar on histogram %v%v bkt %v, got %v", mf.GetName(), m.Label, b.GetUpperBound(), b.Exemplar.String()) } continue } if b.Exemplar == nil { continue } if got := b.Exemplar.Label; !reflect.DeepEqual(expectedExemplar, got) { t.Errorf("expected exemplar %v on the histogram %v%v on bkt %v, got %v", expectedExemplar, mf.GetName(), m.Label, b.GetUpperBound(), got) continue } found = true break } if len(expectedExemplar) > 0 && !found { t.Errorf("expected exemplar %v on at least one bucket of the histogram %v%v, got none", expectedExemplar, mf.GetName(), m.Label) } } } } } func TestClientMiddlewareAPI(t *testing.T) { client, reg := makeInstrumentedClient() backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) defer backend.Close() resp, err := client.Get(backend.URL) if err != nil { t.Fatal(err) } defer resp.Body.Close() assetMetricAndExemplars(t, reg, 3, nil) } func TestClientMiddlewareAPI_WithExemplars(t *testing.T) { exemplar := prometheus.Labels{"traceID": "example situation observed by this metric"} client, reg := makeInstrumentedClient(WithExemplarFromContext(func(_ context.Context) prometheus.Labels { return exemplar })) backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) defer backend.Close() resp, err := client.Get(backend.URL) if err != nil { t.Fatal(err) } defer resp.Body.Close() assetMetricAndExemplars(t, reg, 3, labelsToLabelPair(exemplar)) } func TestClientMiddlewareAPI_WithRequestContext(t *testing.T) { client, reg := makeInstrumentedClient() backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) defer backend.Close() req, err := http.NewRequest("GET", backend.URL, nil) if err != nil { t.Fatalf("%v", err) } // Set a context with a long timeout. ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() req = req.WithContext(ctx) resp, err := client.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() mfs, err := reg.Gather() if err != nil { t.Fatal(err) } if want, got := 3, len(mfs); want != got { t.Fatalf("unexpected number of metric families gathered, want %d, got %d", want, got) } for _, mf := range mfs { if len(mf.Metric) == 0 { t.Errorf("metric family %s must not be empty", mf.GetName()) } } // make sure counters aren't double-incremented (see #1117) expected := ` # HELP client_api_requests_total A counter for requests from the wrapped client. # TYPE client_api_requests_total counter client_api_requests_total{code="200",method="get"} 1 ` if err := testutil.GatherAndCompare(reg, strings.NewReader(expected), "client_api_requests_total", ); err != nil { t.Fatal(err) } } func TestClientMiddlewareAPIWithRequestContextTimeout(t *testing.T) { client, _ := makeInstrumentedClient() // Slow testserver responding in 100ms. backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(100 * time.Millisecond) w.WriteHeader(http.StatusOK) })) defer backend.Close() req, err := http.NewRequest("GET", backend.URL, nil) if err != nil { t.Fatalf("%v", err) } // Set a context with a short timeout. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() req = req.WithContext(ctx) _, err = client.Do(req) if err == nil { t.Fatal("did not get timeout error") } expectedMsg := "context deadline exceeded" if !strings.Contains(err.Error(), expectedMsg) { t.Fatalf("unexpected error: %q, expect error: %q", err.Error(), expectedMsg) } } func ExampleInstrumentRoundTripperDuration() { client := http.DefaultClient client.Timeout = 1 * time.Second inFlightGauge := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "client_in_flight_requests", Help: "A gauge of in-flight requests for the wrapped client.", }) counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "client_api_requests_total", Help: "A counter for requests from the wrapped client.", }, []string{"code", "method"}, ) // dnsLatencyVec uses custom buckets based on expected dns durations. // It has an instance label "event", which is set in the // DNSStart and DNSDonehook functions defined in the // InstrumentTrace struct below. dnsLatencyVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "dns_duration_seconds", Help: "Trace dns latency histogram.", Buckets: []float64{.005, .01, .025, .05}, }, []string{"event"}, ) // tlsLatencyVec uses custom buckets based on expected tls durations. // It has an instance label "event", which is set in the // TLSHandshakeStart and TLSHandshakeDone hook functions defined in the // InstrumentTrace struct below. tlsLatencyVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "tls_duration_seconds", Help: "Trace tls latency histogram.", Buckets: []float64{.05, .1, .25, .5}, }, []string{"event"}, ) // histVec has no labels, making it a zero-dimensional ObserverVec. histVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of request latencies.", Buckets: prometheus.DefBuckets, }, []string{}, ) // Register all of the metrics in the standard registry. prometheus.MustRegister(counter, tlsLatencyVec, dnsLatencyVec, histVec, inFlightGauge) // Define functions for the available httptrace.ClientTrace hook // functions that we want to instrument. trace := &InstrumentTrace{ DNSStart: func(t float64) { dnsLatencyVec.WithLabelValues("dns_start").Observe(t) }, DNSDone: func(t float64) { dnsLatencyVec.WithLabelValues("dns_done").Observe(t) }, TLSHandshakeStart: func(t float64) { tlsLatencyVec.WithLabelValues("tls_handshake_start").Observe(t) }, TLSHandshakeDone: func(t float64) { tlsLatencyVec.WithLabelValues("tls_handshake_done").Observe(t) }, } // Wrap the default RoundTripper with middleware. roundTripper := InstrumentRoundTripperInFlight(inFlightGauge, InstrumentRoundTripperCounter(counter, InstrumentRoundTripperTrace(trace, InstrumentRoundTripperDuration(histVec, http.DefaultTransport), ), ), ) // Set the RoundTripper on our client. client.Transport = roundTripper resp, err := client.Get("http://google.com") if err != nil { log.Printf("error: %v", err) } defer resp.Body.Close() } client_golang-1.19.1/prometheus/promhttp/instrument_server.go000066400000000000000000000450351461713521000246140ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "errors" "net/http" "strconv" "strings" "time" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus" ) // magicString is used for the hacky label test in checkLabels. Remove once fixed. const magicString = "zZgWfBxLqvG8kc8IMv3POi2Bb0tZI3vAnBx+gBaFi9FyPzB/CzKUer1yufDa" // observeWithExemplar is a wrapper for [prometheus.ExemplarAdder.ExemplarObserver], // which falls back to [prometheus.Observer.Observe] if no labels are provided. func observeWithExemplar(obs prometheus.Observer, val float64, labels map[string]string) { if labels == nil { obs.Observe(val) return } obs.(prometheus.ExemplarObserver).ObserveWithExemplar(val, labels) } // addWithExemplar is a wrapper for [prometheus.ExemplarAdder.AddWithExemplar], // which falls back to [prometheus.Counter.Add] if no labels are provided. func addWithExemplar(obs prometheus.Counter, val float64, labels map[string]string) { if labels == nil { obs.Add(val) return } obs.(prometheus.ExemplarAdder).AddWithExemplar(val, labels) } // InstrumentHandlerInFlight is a middleware that wraps the provided // http.Handler. It sets the provided prometheus.Gauge to the number of // requests currently handled by the wrapped http.Handler. // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { g.Inc() defer g.Dec() next.ServeHTTP(w, r) }) } // InstrumentHandlerDuration is a middleware that wraps the provided // http.Handler to observe the request duration with the provided ObserverVec. // The ObserverVec must have valid metric and label names and must have zero, // one, or two non-const non-curried labels. For those, the only allowed label // names are "code" and "method". The function panics otherwise. For the "method" // label a predefined default label value set is used to filter given values. // Values besides predefined values will count as `unknown` method. // `WithExtraMethods` can be used to add more methods to the set. The Observe // method of the Observer in the ObserverVec is called with the request duration // in seconds. Partitioning happens by HTTP status code and/or HTTP method if // the respective instance label names are present in the ObserverVec. For // unpartitioned observations, use an ObserverVec with zero labels. Note that // partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // // If the wrapped Handler panics, no values are reported. // // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { hOpts := defaultOptions() for _, o := range opts { o.apply(hOpts) } // Curry the observer with dynamic labels before checking the remaining labels. code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, nil) next.ServeHTTP(d, r) l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { now := time.Now() next.ServeHTTP(w, r) l := labels(code, method, r.Method, 0, hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } // InstrumentHandlerCounter is a middleware that wraps the provided http.Handler // to observe the request result with the provided CounterVec. The CounterVec // must have valid metric and label names and must have zero, one, or two // non-const non-curried labels. For those, the only allowed label names are // "code" and "method". The function panics otherwise. For the "method" // label a predefined default label value set is used to filter given values. // Values besides predefined values will count as `unknown` method. // `WithExtraMethods` can be used to add more methods to the set. Partitioning of the // CounterVec happens by HTTP status code and/or HTTP method if the respective // instance label names are present in the CounterVec. For unpartitioned // counting, use a CounterVec with zero labels. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // // If the wrapped Handler panics, the Counter is not incremented. // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler, opts ...Option) http.HandlerFunc { hOpts := defaultOptions() for _, o := range opts { o.apply(hOpts) } // Curry the counter with dynamic labels before checking the remaining labels. code, method := checkLabels(counter.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) l := labels(code, method, r.Method, 0, hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } // InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided // http.Handler to observe with the provided ObserverVec the request duration // until the response headers are written. The ObserverVec must have valid // metric and label names and must have zero, one, or two non-const non-curried // labels. For those, the only allowed label names are "code" and "method". The // function panics otherwise. For the "method" label a predefined default label // value set is used to filter given values. Values besides predefined values // will count as `unknown` method.`WithExtraMethods` can be used to add more // methods to the set. The Observe method of the Observer in the // ObserverVec is called with the request duration in seconds. Partitioning // happens by HTTP status code and/or HTTP method if the respective instance // label names are present in the ObserverVec. For unpartitioned observations, // use an ObserverVec with zero labels. Note that partitioning of Histograms is // expensive and should be used judiciously. // // If the wrapped Handler panics before calling WriteHeader, no value is // reported. // // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { hOpts := defaultOptions() for _, o := range opts { o.apply(hOpts) } // Curry the observer with dynamic labels before checking the remaining labels. code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, func(status int) { l := labels(code, method, r.Method, status, hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) }) next.ServeHTTP(d, r) } } // InstrumentHandlerRequestSize is a middleware that wraps the provided // http.Handler to observe the request size with the provided ObserverVec. The // ObserverVec must have valid metric and label names and must have zero, one, // or two non-const non-curried labels. For those, the only allowed label names // are "code" and "method". The function panics otherwise. For the "method" // label a predefined default label value set is used to filter given values. // Values besides predefined values will count as `unknown` method. // `WithExtraMethods` can be used to add more methods to the set. The Observe // method of the Observer in the ObserverVec is called with the request size in // bytes. Partitioning happens by HTTP status code and/or HTTP method if the // respective instance label names are present in the ObserverVec. For // unpartitioned observations, use an ObserverVec with zero labels. Note that // partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // // If the wrapped Handler panics, no values are reported. // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { hOpts := defaultOptions() for _, o := range opts { o.apply(hOpts) } // Curry the observer with dynamic labels before checking the remaining labels. code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) size := computeApproximateRequestSize(r) l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) size := computeApproximateRequestSize(r) l := labels(code, method, r.Method, 0, hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } // InstrumentHandlerResponseSize is a middleware that wraps the provided // http.Handler to observe the response size with the provided ObserverVec. The // ObserverVec must have valid metric and label names and must have zero, one, // or two non-const non-curried labels. For those, the only allowed label names // are "code" and "method". The function panics otherwise. For the "method" // label a predefined default label value set is used to filter given values. // Values besides predefined values will count as `unknown` method. // `WithExtraMethods` can be used to add more methods to the set. The Observe // method of the Observer in the ObserverVec is called with the response size in // bytes. Partitioning happens by HTTP status code and/or HTTP method if the // respective instance label names are present in the ObserverVec. For // unpartitioned observations, use an ObserverVec with zero labels. Note that // partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // // If the wrapped Handler panics, no values are reported. // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.Handler { hOpts := defaultOptions() for _, o := range opts { o.apply(hOpts) } // Curry the observer with dynamic labels before checking the remaining labels. code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) for label, resolve := range hOpts.extraLabelsFromCtx { l[label] = resolve(r.Context()) } observeWithExemplar(obs.With(l), float64(d.Written()), hOpts.getExemplarFn(r.Context())) }) } // checkLabels returns whether the provided Collector has a non-const, // non-curried label named "code" and/or "method". It panics if the provided // Collector does not have a Desc or has more than one Desc or its Desc is // invalid. It also panics if the Collector has any non-const, non-curried // labels that are not named "code" or "method". func checkLabels(c prometheus.Collector) (code, method bool) { // TODO(beorn7): Remove this hacky way to check for instance labels // once Descriptors can have their dimensionality queried. var ( desc *prometheus.Desc m prometheus.Metric pm dto.Metric lvs []string ) // Get the Desc from the Collector. descc := make(chan *prometheus.Desc, 1) c.Describe(descc) select { case desc = <-descc: default: panic("no description provided by collector") } select { case <-descc: panic("more than one description provided by collector") default: } close(descc) // Make sure the Collector has a valid Desc by registering it with a // temporary registry. prometheus.NewRegistry().MustRegister(c) // Create a ConstMetric with the Desc. Since we don't know how many // variable labels there are, try for as long as it needs. for err := errors.New("dummy"); err != nil; lvs = append(lvs, magicString) { m, err = prometheus.NewConstMetric(desc, prometheus.UntypedValue, 0, lvs...) } // Write out the metric into a proto message and look at the labels. // If the value is not the magicString, it is a constLabel, which doesn't interest us. // If the label is curried, it doesn't interest us. // In all other cases, only "code" or "method" is allowed. if err := m.Write(&pm); err != nil { panic("error checking metric for labels") } for _, label := range pm.Label { name, value := label.GetName(), label.GetValue() if value != magicString || isLabelCurried(c, name) { continue } switch name { case "code": code = true case "method": method = true default: panic("metric partitioned with non-supported labels") } } return } func isLabelCurried(c prometheus.Collector, label string) bool { // This is even hackier than the label test above. // We essentially try to curry again and see if it works. // But for that, we need to type-convert to the two // types we use here, ObserverVec or *CounterVec. switch v := c.(type) { case *prometheus.CounterVec: if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { return false } case prometheus.ObserverVec: if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { return false } default: panic("unsupported metric vec type") } return true } func labels(code, method bool, reqMethod string, status int, extraMethods ...string) prometheus.Labels { labels := prometheus.Labels{} if !(code || method) { return labels } if code { labels["code"] = sanitizeCode(status) } if method { labels["method"] = sanitizeMethod(reqMethod, extraMethods...) } return labels } func computeApproximateRequestSize(r *http.Request) int { s := 0 if r.URL != nil { s += len(r.URL.String()) } s += len(r.Method) s += len(r.Proto) for name, values := range r.Header { s += len(name) for _, value := range values { s += len(value) } } s += len(r.Host) // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. if r.ContentLength != -1 { s += int(r.ContentLength) } return s } // If the wrapped http.Handler has a known method, it will be sanitized and returned. // Otherwise, "unknown" will be returned. The known method list can be extended // as needed by using extraMethods parameter. func sanitizeMethod(m string, extraMethods ...string) string { // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods for // the methods chosen as default. switch m { case "GET", "get": return "get" case "PUT", "put": return "put" case "HEAD", "head": return "head" case "POST", "post": return "post" case "DELETE", "delete": return "delete" case "CONNECT", "connect": return "connect" case "OPTIONS", "options": return "options" case "NOTIFY", "notify": return "notify" case "TRACE", "trace": return "trace" case "PATCH", "patch": return "patch" default: for _, method := range extraMethods { if strings.EqualFold(m, method) { return strings.ToLower(m) } } return "unknown" } } // If the wrapped http.Handler has not set a status code, i.e. the value is // currently 0, sanitizeCode will return 200, for consistency with behavior in // the stdlib. func sanitizeCode(s int) string { // See for accepted codes https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml switch s { case 100: return "100" case 101: return "101" case 200, 0: return "200" case 201: return "201" case 202: return "202" case 203: return "203" case 204: return "204" case 205: return "205" case 206: return "206" case 300: return "300" case 301: return "301" case 302: return "302" case 304: return "304" case 305: return "305" case 307: return "307" case 400: return "400" case 401: return "401" case 402: return "402" case 403: return "403" case 404: return "404" case 405: return "405" case 406: return "406" case 407: return "407" case 408: return "408" case 409: return "409" case 410: return "410" case 411: return "411" case 412: return "412" case 413: return "413" case 414: return "414" case 415: return "415" case 416: return "416" case 417: return "417" case 418: return "418" case 500: return "500" case 501: return "501" case 502: return "502" case 503: return "503" case 504: return "504" case 505: return "505" case 428: return "428" case 429: return "429" case 431: return "431" case 511: return "511" default: if s >= 100 && s <= 599 { return strconv.Itoa(s) } return "unknown" } } client_golang-1.19.1/prometheus/promhttp/instrument_server_test.go000066400000000000000000000421251461713521000256500ustar00rootroot00000000000000// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "context" "io" "log" "net/http" "net/http/httptest" "testing" "github.com/prometheus/client_golang/prometheus" ) func TestLabelCheck(t *testing.T) { scenarios := map[string]struct { metricName string // Defaults to "c". varLabels []string constLabels []string curriedLabels []string dynamicLabels []string ok bool }{ "empty": { varLabels: []string{}, constLabels: []string{}, curriedLabels: []string{}, ok: true, }, "code as single var label": { varLabels: []string{"code"}, constLabels: []string{}, curriedLabels: []string{}, ok: true, }, "method as single var label": { varLabels: []string{"method"}, constLabels: []string{}, curriedLabels: []string{}, ok: true, }, "code and method as var labels": { varLabels: []string{"method", "code"}, constLabels: []string{}, curriedLabels: []string{}, ok: true, }, "valid case with all labels used": { varLabels: []string{"code", "method"}, constLabels: []string{"foo", "bar"}, curriedLabels: []string{"dings", "bums"}, dynamicLabels: []string{"dyn", "amics"}, ok: true, }, "all labels used with an invalid const label name": { varLabels: []string{"code", "method"}, constLabels: []string{"in-valid", "bar"}, curriedLabels: []string{"dings", "bums"}, dynamicLabels: []string{"dyn", "amics"}, ok: false, }, "unsupported var label": { varLabels: []string{"foo"}, constLabels: []string{}, curriedLabels: []string{}, ok: false, }, "mixed var labels": { varLabels: []string{"method", "foo", "code"}, constLabels: []string{}, curriedLabels: []string{}, ok: false, }, "unsupported var label but curried": { varLabels: []string{}, constLabels: []string{}, curriedLabels: []string{"foo"}, ok: true, }, "mixed var labels but unsupported curried": { varLabels: []string{"code", "method"}, constLabels: []string{}, curriedLabels: []string{"foo"}, ok: true, }, "supported label as const and curry": { varLabels: []string{}, constLabels: []string{"code"}, curriedLabels: []string{"method"}, ok: true, }, "supported label as const and dynamic": { varLabels: []string{}, constLabels: []string{"code"}, dynamicLabels: []string{"method"}, ok: true, }, "supported label as curried and dynamic": { varLabels: []string{}, curriedLabels: []string{"code"}, dynamicLabels: []string{"method"}, ok: true, }, "supported label as const and curry with unsupported as var": { varLabels: []string{"foo"}, constLabels: []string{"code"}, curriedLabels: []string{"method"}, ok: false, }, "invalid name and otherwise empty": { metricName: "in-valid", varLabels: []string{}, constLabels: []string{}, curriedLabels: []string{}, ok: false, }, "invalid name with all the otherwise valid labels": { metricName: "in-valid", varLabels: []string{"code", "method"}, constLabels: []string{"foo", "bar"}, curriedLabels: []string{"dings", "bums"}, dynamicLabels: []string{"dyn", "amics"}, ok: false, }, } for name, sc := range scenarios { t.Run(name, func(t *testing.T) { metricName := sc.metricName if metricName == "" { metricName = "c" } constLabels := prometheus.Labels{} for _, l := range sc.constLabels { constLabels[l] = "dummy" } labelNames := append(append(sc.varLabels, sc.curriedLabels...), sc.dynamicLabels...) c := prometheus.V2.NewCounterVec( prometheus.CounterVecOpts{ CounterOpts: prometheus.CounterOpts{ Name: metricName, Help: "c help", ConstLabels: constLabels, }, VariableLabels: prometheus.UnconstrainedLabels(labelNames), }, ) o := prometheus.ObserverVec(prometheus.V2.NewHistogramVec( prometheus.HistogramVecOpts{ HistogramOpts: prometheus.HistogramOpts{ Name: metricName, Help: "c help", ConstLabels: constLabels, }, VariableLabels: prometheus.UnconstrainedLabels(labelNames), }, )) for _, l := range sc.curriedLabels { c = c.MustCurryWith(prometheus.Labels{l: "dummy"}) o = o.MustCurryWith(prometheus.Labels{l: "dummy"}) } opts := []Option{} for _, l := range sc.dynamicLabels { opts = append(opts, WithLabelFromCtx(l, func(_ context.Context) string { return "foo" }, )) } func() { defer func() { if err := recover(); err != nil { if sc.ok { t.Error("unexpected panic:", err) } } else if !sc.ok { t.Error("expected panic") } }() InstrumentHandlerCounter(c, nil, opts...) }() func() { defer func() { if err := recover(); err != nil { if sc.ok { t.Error("unexpected panic:", err) } } else if !sc.ok { t.Error("expected panic") } }() InstrumentHandlerDuration(o, nil, opts...) }() if sc.ok { // Test if wantCode and wantMethod were detected correctly. var wantCode, wantMethod bool for _, l := range sc.varLabels { if l == "code" { wantCode = true } if l == "method" { wantMethod = true } } // Curry the dynamic labels since this is done normally behind the scenes for the check for _, l := range sc.dynamicLabels { c = c.MustCurryWith(prometheus.Labels{l: "dummy"}) o = o.MustCurryWith(prometheus.Labels{l: "dummy"}) } gotCode, gotMethod := checkLabels(c) if gotCode != wantCode { t.Errorf("wanted code=%t for counter, got code=%t", wantCode, gotCode) } if gotMethod != wantMethod { t.Errorf("wanted method=%t for counter, got method=%t", wantMethod, gotMethod) } gotCode, gotMethod = checkLabels(o) if gotCode != wantCode { t.Errorf("wanted code=%t for observer, got code=%t", wantCode, gotCode) } if gotMethod != wantMethod { t.Errorf("wanted method=%t for observer, got method=%t", wantMethod, gotMethod) } } }) } } func TestLabels(t *testing.T) { scenarios := map[string]struct { varLabels []string reqMethod string respStatus int extraMethods []string wantLabels prometheus.Labels ok bool }{ "empty": { varLabels: []string{}, wantLabels: prometheus.Labels{}, reqMethod: "GET", respStatus: 200, ok: true, }, "code as single var label": { varLabels: []string{"code"}, reqMethod: "GET", respStatus: 200, wantLabels: prometheus.Labels{"code": "200"}, ok: true, }, "code as single var label and out-of-range code": { varLabels: []string{"code"}, reqMethod: "GET", respStatus: 99, wantLabels: prometheus.Labels{"code": "unknown"}, ok: true, }, "code as single var label and in-range but unrecognized code": { varLabels: []string{"code"}, reqMethod: "GET", respStatus: 308, wantLabels: prometheus.Labels{"code": "308"}, ok: true, }, "method as single var label": { varLabels: []string{"method"}, reqMethod: "GET", respStatus: 200, wantLabels: prometheus.Labels{"method": "get"}, ok: true, }, "method as single var label and unknown method": { varLabels: []string{"method"}, reqMethod: "CUSTOM_METHOD", respStatus: 200, wantLabels: prometheus.Labels{"method": "unknown"}, ok: true, }, "code and method as var labels": { varLabels: []string{"method", "code"}, reqMethod: "GET", respStatus: 200, wantLabels: prometheus.Labels{"method": "get", "code": "200"}, ok: true, }, "method as single var label with extra methods specified": { varLabels: []string{"method"}, reqMethod: "CUSTOM_METHOD", respStatus: 200, extraMethods: []string{"CUSTOM_METHOD", "CUSTOM_METHOD_1"}, wantLabels: prometheus.Labels{"method": "custom_method"}, ok: true, }, "all labels used with an unknown method and out-of-range code": { varLabels: []string{"code", "method"}, reqMethod: "CUSTOM_METHOD", respStatus: 99, wantLabels: prometheus.Labels{"method": "unknown", "code": "unknown"}, ok: false, }, } checkLabels := func(labels []string) (gotCode, gotMethod bool) { for _, label := range labels { switch label { case "code": gotCode = true case "method": gotMethod = true default: panic("metric partitioned with non-supported labels for this test") } } return } equalLabels := func(gotLabels, wantLabels prometheus.Labels) bool { if len(gotLabels) != len(wantLabels) { return false } for ln, lv := range gotLabels { olv, ok := wantLabels[ln] if !ok { return false } if olv != lv { return false } } return true } for name, sc := range scenarios { t.Run(name, func(t *testing.T) { if sc.ok { gotCode, gotMethod := checkLabels(sc.varLabels) gotLabels := labels(gotCode, gotMethod, sc.reqMethod, sc.respStatus, sc.extraMethods...) if !equalLabels(gotLabels, sc.wantLabels) { t.Errorf("wanted labels=%v for counter, got code=%v", sc.wantLabels, gotLabels) } } }) } } func makeInstrumentedHandler(handler http.HandlerFunc, opts ...Option) (http.Handler, *prometheus.Registry) { reg := prometheus.NewRegistry() inFlightGauge := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "in_flight_requests", Help: "A gauge of requests currently being served by the wrapped handler.", }) counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "api_requests_total", Help: "A counter for requests to the wrapped handler.", }, []string{"code", "method"}, ) histVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "response_duration_seconds", Help: "A histogram of request latencies.", Buckets: prometheus.DefBuckets, ConstLabels: prometheus.Labels{"handler": "api"}, }, []string{"method"}, ) writeHeaderVec := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "write_header_duration_seconds", Help: "A histogram of time to first write latencies.", Buckets: prometheus.DefBuckets, ConstLabels: prometheus.Labels{"handler": "api"}, }, []string{}, ) responseSize := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "push_request_size_bytes", Help: "A histogram of request sizes for requests.", Buckets: []float64{200, 500, 900, 1500}, }, []string{}, ) reg.MustRegister(inFlightGauge, counter, histVec, responseSize, writeHeaderVec) return InstrumentHandlerInFlight(inFlightGauge, InstrumentHandlerCounter(counter, InstrumentHandlerDuration(histVec, InstrumentHandlerTimeToWriteHeader(writeHeaderVec, InstrumentHandlerResponseSize(responseSize, handler, opts...), opts...), opts...), opts...), ), reg } func TestMiddlewareAPI(t *testing.T) { chain, reg := makeInstrumentedHandler(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("OK")) }) r, _ := http.NewRequest("GET", "www.example.com", nil) w := httptest.NewRecorder() chain.ServeHTTP(w, r) assetMetricAndExemplars(t, reg, 5, nil) } func TestMiddlewareAPI_WithExemplars(t *testing.T) { exemplar := prometheus.Labels{"traceID": "example situation observed by this metric"} chain, reg := makeInstrumentedHandler(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("OK")) }, WithExemplarFromContext(func(_ context.Context) prometheus.Labels { return exemplar })) r, _ := http.NewRequest("GET", "www.example.com", nil) w := httptest.NewRecorder() chain.ServeHTTP(w, r) assetMetricAndExemplars(t, reg, 5, labelsToLabelPair(exemplar)) } func TestInstrumentTimeToFirstWrite(t *testing.T) { var i int dobs := &responseWriterDelegator{ ResponseWriter: httptest.NewRecorder(), observeWriteHeader: func(status int) { i = status }, } d := newDelegator(dobs, nil) d.WriteHeader(http.StatusOK) if i != http.StatusOK { t.Fatalf("failed to execute observeWriteHeader") } } // testResponseWriter is an http.ResponseWriter that also implements // http.CloseNotifier, http.Flusher, and io.ReaderFrom. type testResponseWriter struct { closeNotifyCalled, flushCalled, readFromCalled bool } func (t *testResponseWriter) Header() http.Header { return nil } func (t *testResponseWriter) Write([]byte) (int, error) { return 0, nil } func (t *testResponseWriter) WriteHeader(int) {} func (t *testResponseWriter) CloseNotify() <-chan bool { t.closeNotifyCalled = true return nil } func (t *testResponseWriter) Flush() { t.flushCalled = true } func (t *testResponseWriter) ReadFrom(io.Reader) (int64, error) { t.readFromCalled = true return 0, nil } // testFlusher is an http.ResponseWriter that also implements http.Flusher. type testFlusher struct { flushCalled bool } func (t *testFlusher) Header() http.Header { return nil } func (t *testFlusher) Write([]byte) (int, error) { return 0, nil } func (t *testFlusher) WriteHeader(int) {} func (t *testFlusher) Flush() { t.flushCalled = true } func TestInterfaceUpgrade(t *testing.T) { w := &testResponseWriter{} d := newDelegator(w, nil) //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. d.(http.CloseNotifier).CloseNotify() if !w.closeNotifyCalled { t.Error("CloseNotify not called") } d.(http.Flusher).Flush() if !w.flushCalled { t.Error("Flush not called") } d.(io.ReaderFrom).ReadFrom(nil) if !w.readFromCalled { t.Error("ReadFrom not called") } if _, ok := d.(http.Hijacker); ok { t.Error("delegator unexpectedly implements http.Hijacker") } f := &testFlusher{} d = newDelegator(f, nil) //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. if _, ok := d.(http.CloseNotifier); ok { t.Error("delegator unexpectedly implements http.CloseNotifier") } d.(http.Flusher).Flush() if !w.flushCalled { t.Error("Flush not called") } if _, ok := d.(io.ReaderFrom); ok { t.Error("delegator unexpectedly implements io.ReaderFrom") } if _, ok := d.(http.Hijacker); ok { t.Error("delegator unexpectedly implements http.Hijacker") } } func ExampleInstrumentHandlerDuration() { inFlightGauge := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "in_flight_requests", Help: "A gauge of requests currently being served by the wrapped handler.", }) counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "api_requests_total", Help: "A counter for requests to the wrapped handler.", }, []string{"code", "method"}, ) // duration is partitioned by the HTTP method and handler. It uses custom // buckets based on the expected request duration. duration := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of latencies for requests.", Buckets: []float64{.25, .5, 1, 2.5, 5, 10}, }, []string{"handler", "method"}, ) // responseSize has no labels, making it a zero-dimensional // ObserverVec. responseSize := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "response_size_bytes", Help: "A histogram of response sizes for requests.", Buckets: []float64{200, 500, 900, 1500}, }, []string{}, ) // Create the handlers that will be wrapped by the middleware. pushHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Push")) }) pullHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Pull")) }) // Register all of the metrics in the standard registry. prometheus.MustRegister(inFlightGauge, counter, duration, responseSize) // Instrument the handlers with all the metrics, injecting the "handler" // label by currying. pushChain := InstrumentHandlerInFlight(inFlightGauge, InstrumentHandlerDuration(duration.MustCurryWith(prometheus.Labels{"handler": "push"}), InstrumentHandlerCounter(counter, InstrumentHandlerResponseSize(responseSize, pushHandler), ), ), ) pullChain := InstrumentHandlerInFlight(inFlightGauge, InstrumentHandlerDuration(duration.MustCurryWith(prometheus.Labels{"handler": "pull"}), InstrumentHandlerCounter(counter, InstrumentHandlerResponseSize(responseSize, pullHandler), ), ), ) http.Handle("/metrics", Handler()) http.Handle("/push", pushChain) http.Handle("/pull", pullChain) if err := http.ListenAndServe(":3000", nil); err != nil { log.Fatal(err) } } client_golang-1.19.1/prometheus/promhttp/option.go000066400000000000000000000055371461713521000223310ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "context" "github.com/prometheus/client_golang/prometheus" ) // Option are used to configure both handler (middleware) or round tripper. type Option interface { apply(*options) } // LabelValueFromCtx are used to compute the label value from request context. // Context can be filled with values from request through middleware. type LabelValueFromCtx func(ctx context.Context) string // options store options for both a handler or round tripper. type options struct { extraMethods []string getExemplarFn func(requestCtx context.Context) prometheus.Labels extraLabelsFromCtx map[string]LabelValueFromCtx } func defaultOptions() *options { return &options{ getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }, extraLabelsFromCtx: map[string]LabelValueFromCtx{}, } } func (o *options) emptyDynamicLabels() prometheus.Labels { labels := prometheus.Labels{} for label := range o.extraLabelsFromCtx { labels[label] = "" } return labels } type optionApplyFunc func(*options) func (o optionApplyFunc) apply(opt *options) { o(opt) } // WithExtraMethods adds additional HTTP methods to the list of allowed methods. // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods for the default list. // // See the example for ExampleInstrumentHandlerWithExtraMethods for example usage. func WithExtraMethods(methods ...string) Option { return optionApplyFunc(func(o *options) { o.extraMethods = methods }) } // WithExemplarFromContext allows to inject function that will get exemplar from context that will be put to counter and histogram metrics. // If the function returns nil labels or the metric does not support exemplars, no exemplar will be added (noop), but // metric will continue to observe/increment. func WithExemplarFromContext(getExemplarFn func(requestCtx context.Context) prometheus.Labels) Option { return optionApplyFunc(func(o *options) { o.getExemplarFn = getExemplarFn }) } // WithLabelFromCtx registers a label for dynamic resolution with access to context. // See the example for ExampleInstrumentHandlerWithLabelResolver for example usage func WithLabelFromCtx(name string, valueFn LabelValueFromCtx) Option { return optionApplyFunc(func(o *options) { o.extraLabelsFromCtx[name] = valueFn }) } client_golang-1.19.1/prometheus/promhttp/option_test.go000066400000000000000000000075261461713521000233700ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promhttp import ( "context" "log" "net/http" "github.com/prometheus/client_golang/prometheus" ) type key int const ( CtxResolverKey key = iota ) func ExampleInstrumentHandlerWithExtraMethods() { counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "api_requests_total", Help: "A counter for requests to the wrapped handler.", }, []string{"code", "method"}, ) // duration is partitioned by the HTTP method and handler. It uses custom // buckets based on the expected request duration. duration := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of latencies for requests.", Buckets: []float64{.25, .5, 1, 2.5, 5, 10}, }, []string{"handler", "method"}, ) // Create the handlers that will be wrapped by the middleware. pullHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Pull")) }) // Specify additional HTTP methods to be added to the label allow list. opts := WithExtraMethods("CUSTOM_METHOD") // Instrument the handlers with all the metrics, injecting the "handler" // label by currying. pullChain := InstrumentHandlerDuration(duration.MustCurryWith(prometheus.Labels{"handler": "pull"}), InstrumentHandlerCounter(counter, pullHandler, opts), opts, ) http.Handle("/metrics", Handler()) http.Handle("/pull", pullChain) if err := http.ListenAndServe(":3000", nil); err != nil { log.Fatal(err) } } func ExampleInstrumentHandlerWithLabelResolver() { counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "api_requests_total", Help: "A counter for requests to the wrapped handler.", }, []string{"code", "method", "myheader"}, ) // duration is partitioned by the HTTP method, handler and request header // value. It uses custom buckets based on the expected request duration. // Beware to not have too high cardinality on the values of header. You // always should sanitize external inputs. duration := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of latencies for requests.", Buckets: []float64{.25, .5, 1, 2.5, 5, 10}, }, []string{"handler", "method", "myheader"}, ) // Create the handlers that will be wrapped by the middleware. pullHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Pull")) }) // Specify additional HTTP methods to be added to the label allow list. opts := WithLabelFromCtx("myheader", func(ctx context.Context) string { return ctx.Value(CtxResolverKey).(string) }, ) // Instrument the handlers with all the metrics, injecting the "handler" // label by currying. pullChain := InstrumentHandlerDuration(duration.MustCurryWith(prometheus.Labels{"handler": "pull"}), InstrumentHandlerCounter(counter, pullHandler, opts), opts, ) middleware := func(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), CtxResolverKey, r.Header.Get("x-my-header")) next(w, r.WithContext(ctx)) } } http.Handle("/metrics", Handler()) http.Handle("/pull", middleware(pullChain)) if err := http.ListenAndServe(":3000", nil); err != nil { log.Fatal(err) } } client_golang-1.19.1/prometheus/push/000077500000000000000000000000001461713521000175625ustar00rootroot00000000000000client_golang-1.19.1/prometheus/push/example_add_from_gatherer_test.go000066400000000000000000000053211461713521000263200ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package push_test import ( "fmt" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) var ( completionTime = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "db_backup_last_completion_timestamp_seconds", Help: "The timestamp of the last completion of a DB backup, successful or not.", }) successTime = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "db_backup_last_success_timestamp_seconds", Help: "The timestamp of the last successful completion of a DB backup.", }) duration = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "db_backup_duration_seconds", Help: "The duration of the last DB backup in seconds.", }) records = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "db_backup_records_processed", Help: "The number of records processed in the last DB backup.", }) ) func performBackup() (int, error) { // Perform the backup and return the number of backed up records and any // applicable error. // ... return 42, nil } func ExamplePusher_Add() { // We use a registry here to benefit from the consistency checks that // happen during registration. registry := prometheus.NewRegistry() registry.MustRegister(completionTime, duration, records) // Note that successTime is not registered. pusher := push.New("http://pushgateway:9091", "db_backup").Gatherer(registry) start := time.Now() n, err := performBackup() records.Set(float64(n)) // Note that time.Since only uses a monotonic clock in Go1.9+. duration.Set(time.Since(start).Seconds()) completionTime.SetToCurrentTime() if err != nil { fmt.Println("DB backup failed:", err) } else { // Add successTime to pusher only in case of success. // We could as well register it with the registry. // This example, however, demonstrates that you can // mix Gatherers and Collectors when handling a Pusher. pusher.Collector(successTime) successTime.SetToCurrentTime() } // Add is used here rather than Push to not delete a previously pushed // success timestamp in case of a failure of this backup. if err := pusher.Add(); err != nil { fmt.Println("Could not push to Pushgateway:", err) } } client_golang-1.19.1/prometheus/push/examples_test.go000066400000000000000000000022751461713521000227740ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package push_test import ( "fmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) func ExamplePusher_Push() { completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "db_backup_last_completion_timestamp_seconds", Help: "The timestamp of the last successful completion of a DB backup.", }) completionTime.SetToCurrentTime() if err := push.New("http://pushgateway:9091", "db_backup"). Collector(completionTime). Grouping("db", "customers"). Push(); err != nil { fmt.Println("Could not push completion time to Pushgateway:", err) } } client_golang-1.19.1/prometheus/push/push.go000066400000000000000000000272601461713521000210770ustar00rootroot00000000000000// Copyright 2015 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package push provides functions to push metrics to a Pushgateway. It uses a // builder approach. Create a Pusher with New and then add the various options // by using its methods, finally calling Add or Push, like this: // // // Easy case: // push.New("http://example.org/metrics", "my_job").Gatherer(myRegistry).Push() // // // Complex case: // push.New("http://example.org/metrics", "my_job"). // Collector(myCollector1). // Collector(myCollector2). // Grouping("zone", "xy"). // Client(&myHTTPClient). // BasicAuth("top", "secret"). // Add() // // See the examples section for more detailed examples. // // See the documentation of the Pushgateway to understand the meaning of // the grouping key and the differences between Push and Add: // https://github.com/prometheus/pushgateway package push import ( "bytes" "context" "encoding/base64" "errors" "fmt" "io" "net/http" "net/url" "strings" "github.com/prometheus/common/expfmt" "github.com/prometheus/common/model" "github.com/prometheus/client_golang/prometheus" ) const ( contentTypeHeader = "Content-Type" // base64Suffix is appended to a label name in the request URL path to // mark the following label value as base64 encoded. base64Suffix = "@base64" ) var errJobEmpty = errors.New("job name is empty") // HTTPDoer is an interface for the one method of http.Client that is used by Pusher type HTTPDoer interface { Do(*http.Request) (*http.Response, error) } // Pusher manages a push to the Pushgateway. Use New to create one, configure it // with its methods, and finally use the Add or Push method to push. type Pusher struct { error error url, job string grouping map[string]string gatherers prometheus.Gatherers registerer prometheus.Registerer client HTTPDoer header http.Header useBasicAuth bool username, password string expfmt expfmt.Format } // New creates a new Pusher to push to the provided URL with the provided job // name (which must not be empty). You can use just host:port or ip:port as url, // in which case “http://” is added automatically. Alternatively, include the // schema in the URL. However, do not include the “/metrics/jobs/…” part. func New(url, job string) *Pusher { var ( reg = prometheus.NewRegistry() err error ) if job == "" { err = errJobEmpty } if !strings.Contains(url, "://") { url = "http://" + url } url = strings.TrimSuffix(url, "/") return &Pusher{ error: err, url: url, job: job, grouping: map[string]string{}, gatherers: prometheus.Gatherers{reg}, registerer: reg, client: &http.Client{}, expfmt: expfmt.NewFormat(expfmt.TypeProtoDelim), } } // Push collects/gathers all metrics from all Collectors and Gatherers added to // this Pusher. Then, it pushes them to the Pushgateway configured while // creating this Pusher, using the configured job name and any added grouping // labels as grouping key. All previously pushed metrics with the same job and // other grouping labels will be replaced with the metrics pushed by this // call. (It uses HTTP method “PUT” to push to the Pushgateway.) // // Push returns the first error encountered by any method call (including this // one) in the lifetime of the Pusher. func (p *Pusher) Push() error { return p.push(context.Background(), http.MethodPut) } // PushContext is like Push but includes a context. // // If the context expires before HTTP request is complete, an error is returned. func (p *Pusher) PushContext(ctx context.Context) error { return p.push(ctx, http.MethodPut) } // Add works like push, but only previously pushed metrics with the same name // (and the same job and other grouping labels) will be replaced. (It uses HTTP // method “POST” to push to the Pushgateway.) func (p *Pusher) Add() error { return p.push(context.Background(), http.MethodPost) } // AddContext is like Add but includes a context. // // If the context expires before HTTP request is complete, an error is returned. func (p *Pusher) AddContext(ctx context.Context) error { return p.push(ctx, http.MethodPost) } // Gatherer adds a Gatherer to the Pusher, from which metrics will be gathered // to push them to the Pushgateway. The gathered metrics must not contain a job // label of their own. // // For convenience, this method returns a pointer to the Pusher itself. func (p *Pusher) Gatherer(g prometheus.Gatherer) *Pusher { p.gatherers = append(p.gatherers, g) return p } // Collector adds a Collector to the Pusher, from which metrics will be // collected to push them to the Pushgateway. The collected metrics must not // contain a job label of their own. // // For convenience, this method returns a pointer to the Pusher itself. func (p *Pusher) Collector(c prometheus.Collector) *Pusher { if p.error == nil { p.error = p.registerer.Register(c) } return p } // Error returns the error that was encountered. func (p *Pusher) Error() error { return p.error } // Grouping adds a label pair to the grouping key of the Pusher, replacing any // previously added label pair with the same label name. Note that setting any // labels in the grouping key that are already contained in the metrics to push // will lead to an error. // // For convenience, this method returns a pointer to the Pusher itself. func (p *Pusher) Grouping(name, value string) *Pusher { if p.error == nil { if !model.LabelName(name).IsValid() { p.error = fmt.Errorf("grouping label has invalid name: %s", name) return p } p.grouping[name] = value } return p } // Client sets a custom HTTP client for the Pusher. For convenience, this method // returns a pointer to the Pusher itself. // Pusher only needs one method of the custom HTTP client: Do(*http.Request). // Thus, rather than requiring a fully fledged http.Client, // the provided client only needs to implement the HTTPDoer interface. // Since *http.Client naturally implements that interface, it can still be used normally. func (p *Pusher) Client(c HTTPDoer) *Pusher { p.client = c return p } // Header sets a custom HTTP header for the Pusher's client. For convenience, this method // returns a pointer to the Pusher itself. func (p *Pusher) Header(header http.Header) *Pusher { p.header = header return p } // BasicAuth configures the Pusher to use HTTP Basic Authentication with the // provided username and password. For convenience, this method returns a // pointer to the Pusher itself. func (p *Pusher) BasicAuth(username, password string) *Pusher { p.useBasicAuth = true p.username = username p.password = password return p } // Format configures the Pusher to use an encoding format given by the // provided expfmt.Format. The default format is expfmt.FmtProtoDelim and // should be used with the standard Prometheus Pushgateway. Custom // implementations may require different formats. For convenience, this // method returns a pointer to the Pusher itself. func (p *Pusher) Format(format expfmt.Format) *Pusher { p.expfmt = format return p } // Delete sends a “DELETE” request to the Pushgateway configured while creating // this Pusher, using the configured job name and any added grouping labels as // grouping key. Any added Gatherers and Collectors added to this Pusher are // ignored by this method. // // Delete returns the first error encountered by any method call (including this // one) in the lifetime of the Pusher. func (p *Pusher) Delete() error { if p.error != nil { return p.error } req, err := http.NewRequest(http.MethodDelete, p.fullURL(), nil) if err != nil { return err } if p.header != nil { req.Header = p.header } if p.useBasicAuth { req.SetBasicAuth(p.username, p.password) } resp, err := p.client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusAccepted { body, _ := io.ReadAll(resp.Body) // Ignore any further error as this is for an error message only. return fmt.Errorf("unexpected status code %d while deleting %s: %s", resp.StatusCode, p.fullURL(), body) } return nil } func (p *Pusher) push(ctx context.Context, method string) error { if p.error != nil { return p.error } mfs, err := p.gatherers.Gather() if err != nil { return err } buf := &bytes.Buffer{} enc := expfmt.NewEncoder(buf, p.expfmt) // Check for pre-existing grouping labels: for _, mf := range mfs { for _, m := range mf.GetMetric() { for _, l := range m.GetLabel() { if l.GetName() == "job" { return fmt.Errorf("pushed metric %s (%s) already contains a job label", mf.GetName(), m) } if _, ok := p.grouping[l.GetName()]; ok { return fmt.Errorf( "pushed metric %s (%s) already contains grouping label %s", mf.GetName(), m, l.GetName(), ) } } } if err := enc.Encode(mf); err != nil { return fmt.Errorf( "failed to encode metric family %s, error is %w", mf.GetName(), err) } } req, err := http.NewRequestWithContext(ctx, method, p.fullURL(), buf) if err != nil { return err } if p.header != nil { req.Header = p.header } if p.useBasicAuth { req.SetBasicAuth(p.username, p.password) } req.Header.Set(contentTypeHeader, string(p.expfmt)) resp, err := p.client.Do(req) if err != nil { return err } defer resp.Body.Close() // Depending on version and configuration of the PGW, StatusOK or StatusAccepted may be returned. if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusAccepted { body, _ := io.ReadAll(resp.Body) // Ignore any further error as this is for an error message only. return fmt.Errorf("unexpected status code %d while pushing to %s: %s", resp.StatusCode, p.fullURL(), body) } return nil } // fullURL assembles the URL used to push/delete metrics and returns it as a // string. The job name and any grouping label values containing a '/' will // trigger a base64 encoding of the affected component and proper suffixing of // the preceding component. Similarly, an empty grouping label value will be // encoded as base64 just with a single `=` padding character (to avoid an empty // path component). If the component does not contain a '/' but other special // characters, the usual url.QueryEscape is used for compatibility with older // versions of the Pushgateway and for better readability. func (p *Pusher) fullURL() string { urlComponents := []string{} if encodedJob, base64 := encodeComponent(p.job); base64 { urlComponents = append(urlComponents, "job"+base64Suffix, encodedJob) } else { urlComponents = append(urlComponents, "job", encodedJob) } for ln, lv := range p.grouping { if encodedLV, base64 := encodeComponent(lv); base64 { urlComponents = append(urlComponents, ln+base64Suffix, encodedLV) } else { urlComponents = append(urlComponents, ln, encodedLV) } } return fmt.Sprintf("%s/metrics/%s", p.url, strings.Join(urlComponents, "/")) } // encodeComponent encodes the provided string with base64.RawURLEncoding in // case it contains '/' and as "=" in case it is empty. If neither is the case, // it uses url.QueryEscape instead. It returns true in the former two cases. func encodeComponent(s string) (string, bool) { if s == "" { return "=", true } if strings.Contains(s, "/") { return base64.RawURLEncoding.EncodeToString([]byte(s)), true } return url.QueryEscape(s), false } client_golang-1.19.1/prometheus/push/push_test.go000066400000000000000000000204521461713521000221320ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package push import ( "bytes" "errors" "io" "net/http" "net/http/httptest" "testing" "github.com/prometheus/common/expfmt" "github.com/prometheus/client_golang/prometheus" ) func TestPush(t *testing.T) { var ( lastMethod string lastBody []byte lastPath string lastHeader http.Header ) // Fake a Pushgateway that responds with 202 to DELETE and with 200 in // all other cases. pgwOK := httptest.NewServer( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { lastMethod = r.Method lastHeader = r.Header var err error lastBody, err = io.ReadAll(r.Body) if err != nil { t.Fatal(err) } lastPath = r.URL.EscapedPath() w.Header().Set("Content-Type", `text/plain; charset=utf-8`) if r.Method == http.MethodDelete { w.WriteHeader(http.StatusAccepted) return } w.WriteHeader(http.StatusOK) }), ) defer pgwOK.Close() // Fake a Pushgateway that always responds with 500. pgwErr := httptest.NewServer( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "fake error", http.StatusInternalServerError) }), ) defer pgwErr.Close() metric1 := prometheus.NewCounter(prometheus.CounterOpts{ Name: "testname1", Help: "testhelp1", }) metric2 := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "testname2", Help: "testhelp2", ConstLabels: prometheus.Labels{"foo": "bar", "dings": "bums"}, }) reg := prometheus.NewRegistry() reg.MustRegister(metric1) reg.MustRegister(metric2) mfs, err := reg.Gather() if err != nil { t.Fatal(err) } buf := &bytes.Buffer{} enc := expfmt.NewEncoder(buf, expfmt.NewFormat(expfmt.TypeProtoDelim)) for _, mf := range mfs { if err := enc.Encode(mf); err != nil { t.Fatal(err) } } wantBody := buf.Bytes() // Push some Collectors, all good. if err := New(pgwOK.URL, "testjob"). Collector(metric1). Collector(metric2). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob" { t.Error("unexpected path:", lastPath) } // Add some Collectors, with nil grouping, all good. if err := New(pgwOK.URL, "testjob"). Collector(metric1). Collector(metric2). Add(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPost { t.Errorf("got method %q for Add, want %q", lastMethod, http.MethodPost) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob" { t.Error("unexpected path:", lastPath) } // Pushes that require base64 encoding. if err := New(pgwOK.URL, "test/job"). Collector(metric1). Collector(metric2). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job@base64/dGVzdC9qb2I" { t.Error("unexpected path:", lastPath) } if err := New(pgwOK.URL, "testjob"). Grouping("foobar", "bu/ms"). Collector(metric1). Collector(metric2). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob/foobar@base64/YnUvbXM" { t.Error("unexpected path:", lastPath) } // Push that requires URL encoding. if err := New(pgwOK.URL, "testjob"). Grouping("titan", "ΠĎομηθεύς"). Collector(metric1). Collector(metric2). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob/titan/%CE%A0%CF%81%CE%BF%CE%BC%CE%B7%CE%B8%CE%B5%CF%8D%CF%82" { t.Error("unexpected path:", lastPath) } // Empty label value triggers special base64 encoding. if err := New(pgwOK.URL, "testjob"). Grouping("empty", ""). Collector(metric1). Collector(metric2). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob/empty@base64/=" { t.Error("unexpected path:", lastPath) } // Empty job name results in error. if err := New(pgwErr.URL, ""). Collector(metric1). Collector(metric2). Push(); err == nil { t.Error("push with empty job succeeded") } else { if want := errJobEmpty; !errors.Is(err, want) { t.Errorf("got error %q, want %q", err, want) } } // Push some Collectors with a broken PGW. if err := New(pgwErr.URL, "testjob"). Collector(metric1). Collector(metric2). Push(); err == nil { t.Error("push to broken Pushgateway succeeded") } else { if got, want := err.Error(), "unexpected status code 500 while pushing to "+pgwErr.URL+"/metrics/job/testjob: fake error\n"; got != want { t.Errorf("got error %q, want %q", got, want) } } // Push some Collectors with invalid grouping or job. if err := New(pgwOK.URL, "testjob"). Grouping("foo", "bums"). Collector(metric1). Collector(metric2). Push(); err == nil { t.Error("push with grouping contained in metrics succeeded") } if err := New(pgwOK.URL, "testjob"). Grouping("foo-bar", "bums"). Collector(metric1). Collector(metric2). Push(); err == nil { t.Error("push with invalid grouping succeeded") } // Push registry, all good. if err := New(pgwOK.URL, "testjob"). Gatherer(reg). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Push, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } // Add registry, all good. if err := New(pgwOK.URL, "testjob"). Grouping("a", "x"). Grouping("b", "y"). Gatherer(reg). Add(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPost { t.Errorf("got method %q for Add, want %q", lastMethod, http.MethodPost) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob/a/x/b/y" && lastPath != "/metrics/job/testjob/b/y/a/x" { t.Error("unexpected path:", lastPath) } // Delete, all good. if err := New(pgwOK.URL, "testjob"). Grouping("a", "x"). Grouping("b", "y"). Delete(); err != nil { t.Fatal(err) } if lastMethod != http.MethodDelete { t.Errorf("got method %q for Delete, want %q", lastMethod, http.MethodDelete) } if len(lastBody) != 0 { t.Errorf("got body of length %d, want empty body", len(lastBody)) } if lastPath != "/metrics/job/testjob/a/x/b/y" && lastPath != "/metrics/job/testjob/b/y/a/x" { t.Error("unexpected path:", lastPath) } // Push some Collectors with custom header, all good. header := make(http.Header) header.Set("Authorization", "Bearer Token") if err := New(pgwOK.URL, "testjob"). Collector(metric1). Collector(metric2). Header(header). Push(); err != nil { t.Fatal(err) } if lastMethod != http.MethodPut { t.Errorf("got method %q for Add, want %q", lastMethod, http.MethodPut) } if !bytes.Equal(lastBody, wantBody) { t.Errorf("got body %v, want %v", lastBody, wantBody) } if lastPath != "/metrics/job/testjob" { t.Error("unexpected path:", lastPath) } if lastHeader == nil || lastHeader.Get("Authorization") == "" { t.Error("empty Authorization header") } } client_golang-1.19.1/prometheus/registry.go000066400000000000000000001064641461713521000210150ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "bytes" "errors" "fmt" "os" "path/filepath" "runtime" "sort" "strconv" "strings" "sync" "unicode/utf8" "github.com/prometheus/client_golang/prometheus/internal" "github.com/cespare/xxhash/v2" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" "google.golang.org/protobuf/proto" ) const ( // Capacity for the channel to collect metrics and descriptors. capMetricChan = 1000 capDescChan = 10 ) // DefaultRegisterer and DefaultGatherer are the implementations of the // Registerer and Gatherer interface a number of convenience functions in this // package act on. Initially, both variables point to the same Registry, which // has a process collector (currently on Linux only, see NewProcessCollector) // and a Go collector (see NewGoCollector, in particular the note about // stop-the-world implication with Go versions older than 1.9) already // registered. This approach to keep default instances as global state mirrors // the approach of other packages in the Go standard library. Note that there // are caveats. Change the variables with caution and only if you understand the // consequences. Users who want to avoid global state altogether should not use // the convenience functions and act on custom instances instead. var ( defaultRegistry = NewRegistry() DefaultRegisterer Registerer = defaultRegistry DefaultGatherer Gatherer = defaultRegistry ) func init() { MustRegister(NewProcessCollector(ProcessCollectorOpts{})) MustRegister(NewGoCollector()) } // NewRegistry creates a new vanilla Registry without any Collectors // pre-registered. func NewRegistry() *Registry { return &Registry{ collectorsByID: map[uint64]Collector{}, descIDs: map[uint64]struct{}{}, dimHashesByName: map[string]uint64{}, } } // NewPedanticRegistry returns a registry that checks during collection if each // collected Metric is consistent with its reported Desc, and if the Desc has // actually been registered with the registry. Unchecked Collectors (those whose // Describe method does not yield any descriptors) are excluded from the check. // // Usually, a Registry will be happy as long as the union of all collected // Metrics is consistent and valid even if some metrics are not consistent with // their own Desc or a Desc provided by their registered Collector. Well-behaved // Collectors and Metrics will only provide consistent Descs. This Registry is // useful to test the implementation of Collectors and Metrics. func NewPedanticRegistry() *Registry { r := NewRegistry() r.pedanticChecksEnabled = true return r } // Registerer is the interface for the part of a registry in charge of // registering and unregistering. Users of custom registries should use // Registerer as type for registration purposes (rather than the Registry type // directly). In that way, they are free to use custom Registerer implementation // (e.g. for testing purposes). type Registerer interface { // Register registers a new Collector to be included in metrics // collection. It returns an error if the descriptors provided by the // Collector are invalid or if they — in combination with descriptors of // already registered Collectors — do not fulfill the consistency and // uniqueness criteria described in the documentation of metric.Desc. // // If the provided Collector is equal to a Collector already registered // (which includes the case of re-registering the same Collector), the // returned error is an instance of AlreadyRegisteredError, which // contains the previously registered Collector. // // A Collector whose Describe method does not yield any Desc is treated // as unchecked. Registration will always succeed. No check for // re-registering (see previous paragraph) is performed. Thus, the // caller is responsible for not double-registering the same unchecked // Collector, and for providing a Collector that will not cause // inconsistent metrics on collection. (This would lead to scrape // errors.) Register(Collector) error // MustRegister works like Register but registers any number of // Collectors and panics upon the first registration that causes an // error. MustRegister(...Collector) // Unregister unregisters the Collector that equals the Collector passed // in as an argument. (Two Collectors are considered equal if their // Describe method yields the same set of descriptors.) The function // returns whether a Collector was unregistered. Note that an unchecked // Collector cannot be unregistered (as its Describe method does not // yield any descriptor). // // Note that even after unregistering, it will not be possible to // register a new Collector that is inconsistent with the unregistered // Collector, e.g. a Collector collecting metrics with the same name but // a different help string. The rationale here is that the same registry // instance must only collect consistent metrics throughout its // lifetime. Unregister(Collector) bool } // Gatherer is the interface for the part of a registry in charge of gathering // the collected metrics into a number of MetricFamilies. The Gatherer interface // comes with the same general implication as described for the Registerer // interface. type Gatherer interface { // Gather calls the Collect method of the registered Collectors and then // gathers the collected metrics into a lexicographically sorted slice // of uniquely named MetricFamily protobufs. Gather ensures that the // returned slice is valid and self-consistent so that it can be used // for valid exposition. As an exception to the strict consistency // requirements described for metric.Desc, Gather will tolerate // different sets of label names for metrics of the same metric family. // // Even if an error occurs, Gather attempts to gather as many metrics as // possible. Hence, if a non-nil error is returned, the returned // MetricFamily slice could be nil (in case of a fatal error that // prevented any meaningful metric collection) or contain a number of // MetricFamily protobufs, some of which might be incomplete, and some // might be missing altogether. The returned error (which might be a // MultiError) explains the details. Note that this is mostly useful for // debugging purposes. If the gathered protobufs are to be used for // exposition in actual monitoring, it is almost always better to not // expose an incomplete result and instead disregard the returned // MetricFamily protobufs in case the returned error is non-nil. Gather() ([]*dto.MetricFamily, error) } // Register registers the provided Collector with the DefaultRegisterer. // // Register is a shortcut for DefaultRegisterer.Register(c). See there for more // details. func Register(c Collector) error { return DefaultRegisterer.Register(c) } // MustRegister registers the provided Collectors with the DefaultRegisterer and // panics if any error occurs. // // MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See // there for more details. func MustRegister(cs ...Collector) { DefaultRegisterer.MustRegister(cs...) } // Unregister removes the registration of the provided Collector from the // DefaultRegisterer. // // Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for // more details. func Unregister(c Collector) bool { return DefaultRegisterer.Unregister(c) } // GathererFunc turns a function into a Gatherer. type GathererFunc func() ([]*dto.MetricFamily, error) // Gather implements Gatherer. func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { return gf() } // AlreadyRegisteredError is returned by the Register method if the Collector to // be registered has already been registered before, or a different Collector // that collects the same metrics has been registered before. Registration fails // in that case, but you can detect from the kind of error what has // happened. The error contains fields for the existing Collector and the // (rejected) new Collector that equals the existing one. This can be used to // find out if an equal Collector has been registered before and switch over to // using the old one, as demonstrated in the example. type AlreadyRegisteredError struct { ExistingCollector, NewCollector Collector } func (err AlreadyRegisteredError) Error() string { return "duplicate metrics collector registration attempted" } // MultiError is a slice of errors implementing the error interface. It is used // by a Gatherer to report multiple errors during MetricFamily gathering. type MultiError []error // Error formats the contained errors as a bullet point list, preceded by the // total number of errors. Note that this results in a multi-line string. func (errs MultiError) Error() string { if len(errs) == 0 { return "" } buf := &bytes.Buffer{} fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) for _, err := range errs { fmt.Fprintf(buf, "\n* %s", err) } return buf.String() } // Append appends the provided error if it is not nil. func (errs *MultiError) Append(err error) { if err != nil { *errs = append(*errs, err) } } // MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only // contained error as error if len(errs is 1). In all other cases, it returns // the MultiError directly. This is helpful for returning a MultiError in a way // that only uses the MultiError if needed. func (errs MultiError) MaybeUnwrap() error { switch len(errs) { case 0: return nil case 1: return errs[0] default: return errs } } // Registry registers Prometheus collectors, collects their metrics, and gathers // them into MetricFamilies for exposition. It implements Registerer, Gatherer, // and Collector. The zero value is not usable. Create instances with // NewRegistry or NewPedanticRegistry. // // Registry implements Collector to allow it to be used for creating groups of // metrics. See the Grouping example for how this can be done. type Registry struct { mtx sync.RWMutex collectorsByID map[uint64]Collector // ID is a hash of the descIDs. descIDs map[uint64]struct{} dimHashesByName map[string]uint64 uncheckedCollectors []Collector pedanticChecksEnabled bool } // Register implements Registerer. func (r *Registry) Register(c Collector) error { var ( descChan = make(chan *Desc, capDescChan) newDescIDs = map[uint64]struct{}{} newDimHashesByName = map[string]uint64{} collectorID uint64 // All desc IDs XOR'd together. duplicateDescErr error ) go func() { c.Describe(descChan) close(descChan) }() r.mtx.Lock() defer func() { // Drain channel in case of premature return to not leak a goroutine. for range descChan { } r.mtx.Unlock() }() // Conduct various tests... for desc := range descChan { // Is the descriptor valid at all? if desc.err != nil { return fmt.Errorf("descriptor %s is invalid: %w", desc, desc.err) } // Is the descID unique? // (In other words: Is the fqName + constLabel combination unique?) if _, exists := r.descIDs[desc.id]; exists { duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) } // If it is not a duplicate desc in this collector, XOR it to // the collectorID. (We allow duplicate descs within the same // collector, but their existence must be a no-op.) if _, exists := newDescIDs[desc.id]; !exists { newDescIDs[desc.id] = struct{}{} collectorID ^= desc.id } // Are all the label names and the help string consistent with // previous descriptors of the same name? // First check existing descriptors... if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { if dimHash != desc.dimHash { return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) } } else { // ...then check the new descriptors already seen. if dimHash, exists := newDimHashesByName[desc.fqName]; exists { if dimHash != desc.dimHash { return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) } } else { newDimHashesByName[desc.fqName] = desc.dimHash } } } // A Collector yielding no Desc at all is considered unchecked. if len(newDescIDs) == 0 { r.uncheckedCollectors = append(r.uncheckedCollectors, c) return nil } if existing, exists := r.collectorsByID[collectorID]; exists { switch e := existing.(type) { case *wrappingCollector: return AlreadyRegisteredError{ ExistingCollector: e.unwrapRecursively(), NewCollector: c, } default: return AlreadyRegisteredError{ ExistingCollector: e, NewCollector: c, } } } // If the collectorID is new, but at least one of the descs existed // before, we are in trouble. if duplicateDescErr != nil { return duplicateDescErr } // Only after all tests have passed, actually register. r.collectorsByID[collectorID] = c for hash := range newDescIDs { r.descIDs[hash] = struct{}{} } for name, dimHash := range newDimHashesByName { r.dimHashesByName[name] = dimHash } return nil } // Unregister implements Registerer. func (r *Registry) Unregister(c Collector) bool { var ( descChan = make(chan *Desc, capDescChan) descIDs = map[uint64]struct{}{} collectorID uint64 // All desc IDs XOR'd together. ) go func() { c.Describe(descChan) close(descChan) }() for desc := range descChan { if _, exists := descIDs[desc.id]; !exists { collectorID ^= desc.id descIDs[desc.id] = struct{}{} } } r.mtx.RLock() if _, exists := r.collectorsByID[collectorID]; !exists { r.mtx.RUnlock() return false } r.mtx.RUnlock() r.mtx.Lock() defer r.mtx.Unlock() delete(r.collectorsByID, collectorID) for id := range descIDs { delete(r.descIDs, id) } // dimHashesByName is left untouched as those must be consistent // throughout the lifetime of a program. return true } // MustRegister implements Registerer. func (r *Registry) MustRegister(cs ...Collector) { for _, c := range cs { if err := r.Register(c); err != nil { panic(err) } } } // Gather implements Gatherer. func (r *Registry) Gather() ([]*dto.MetricFamily, error) { r.mtx.RLock() if len(r.collectorsByID) == 0 && len(r.uncheckedCollectors) == 0 { // Fast path. r.mtx.RUnlock() return nil, nil } var ( checkedMetricChan = make(chan Metric, capMetricChan) uncheckedMetricChan = make(chan Metric, capMetricChan) metricHashes = map[uint64]struct{}{} wg sync.WaitGroup errs MultiError // The collected errors to return in the end. registeredDescIDs map[uint64]struct{} // Only used for pedantic checks ) goroutineBudget := len(r.collectorsByID) + len(r.uncheckedCollectors) metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) checkedCollectors := make(chan Collector, len(r.collectorsByID)) uncheckedCollectors := make(chan Collector, len(r.uncheckedCollectors)) for _, collector := range r.collectorsByID { checkedCollectors <- collector } for _, collector := range r.uncheckedCollectors { uncheckedCollectors <- collector } // In case pedantic checks are enabled, we have to copy the map before // giving up the RLock. if r.pedanticChecksEnabled { registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) for id := range r.descIDs { registeredDescIDs[id] = struct{}{} } } r.mtx.RUnlock() wg.Add(goroutineBudget) collectWorker := func() { for { select { case collector := <-checkedCollectors: collector.Collect(checkedMetricChan) case collector := <-uncheckedCollectors: collector.Collect(uncheckedMetricChan) default: return } wg.Done() } } // Start the first worker now to make sure at least one is running. go collectWorker() goroutineBudget-- // Close checkedMetricChan and uncheckedMetricChan once all collectors // are collected. go func() { wg.Wait() close(checkedMetricChan) close(uncheckedMetricChan) }() // Drain checkedMetricChan and uncheckedMetricChan in case of premature return. defer func() { if checkedMetricChan != nil { for range checkedMetricChan { } } if uncheckedMetricChan != nil { for range uncheckedMetricChan { } } }() // Copy the channel references so we can nil them out later to remove // them from the select statements below. cmc := checkedMetricChan umc := uncheckedMetricChan for { select { case metric, ok := <-cmc: if !ok { cmc = nil break } errs.Append(processMetric( metric, metricFamiliesByName, metricHashes, registeredDescIDs, )) case metric, ok := <-umc: if !ok { umc = nil break } errs.Append(processMetric( metric, metricFamiliesByName, metricHashes, nil, )) default: if goroutineBudget <= 0 || len(checkedCollectors)+len(uncheckedCollectors) == 0 { // All collectors are already being worked on or // we have already as many goroutines started as // there are collectors. Do the same as above, // just without the default. select { case metric, ok := <-cmc: if !ok { cmc = nil break } errs.Append(processMetric( metric, metricFamiliesByName, metricHashes, registeredDescIDs, )) case metric, ok := <-umc: if !ok { umc = nil break } errs.Append(processMetric( metric, metricFamiliesByName, metricHashes, nil, )) } break } // Start more workers. go collectWorker() goroutineBudget-- runtime.Gosched() } // Once both checkedMetricChan and uncheckedMetricChan are closed // and drained, the contraption above will nil out cmc and umc, // and then we can leave the collect loop here. if cmc == nil && umc == nil { break } } return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() } // Describe implements Collector. func (r *Registry) Describe(ch chan<- *Desc) { r.mtx.RLock() defer r.mtx.RUnlock() // Only report the checked Collectors; unchecked collectors don't report any // Desc. for _, c := range r.collectorsByID { c.Describe(ch) } } // Collect implements Collector. func (r *Registry) Collect(ch chan<- Metric) { r.mtx.RLock() defer r.mtx.RUnlock() for _, c := range r.collectorsByID { c.Collect(ch) } for _, c := range r.uncheckedCollectors { c.Collect(ch) } } // WriteToTextfile calls Gather on the provided Gatherer, encodes the result in the // Prometheus text format, and writes it to a temporary file. Upon success, the // temporary file is renamed to the provided filename. // // This is intended for use with the textfile collector of the node exporter. // Note that the node exporter expects the filename to be suffixed with ".prom". func WriteToTextfile(filename string, g Gatherer) error { tmp, err := os.CreateTemp(filepath.Dir(filename), filepath.Base(filename)) if err != nil { return err } defer os.Remove(tmp.Name()) mfs, err := g.Gather() if err != nil { return err } for _, mf := range mfs { if _, err := expfmt.MetricFamilyToText(tmp, mf); err != nil { return err } } if err := tmp.Close(); err != nil { return err } if err := os.Chmod(tmp.Name(), 0o644); err != nil { return err } return os.Rename(tmp.Name(), filename) } // processMetric is an internal helper method only used by the Gather method. func processMetric( metric Metric, metricFamiliesByName map[string]*dto.MetricFamily, metricHashes map[uint64]struct{}, registeredDescIDs map[uint64]struct{}, ) error { desc := metric.Desc() // Wrapped metrics collected by an unchecked Collector can have an // invalid Desc. if desc.err != nil { return desc.err } dtoMetric := &dto.Metric{} if err := metric.Write(dtoMetric); err != nil { return fmt.Errorf("error collecting metric %v: %w", desc, err) } metricFamily, ok := metricFamiliesByName[desc.fqName] if ok { // Existing name. if metricFamily.GetHelp() != desc.help { return fmt.Errorf( "collected metric %s %s has help %q but should have %q", desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), ) } // TODO(beorn7): Simplify switch once Desc has type. switch metricFamily.GetType() { case dto.MetricType_COUNTER: if dtoMetric.Counter == nil { return fmt.Errorf( "collected metric %s %s should be a Counter", desc.fqName, dtoMetric, ) } case dto.MetricType_GAUGE: if dtoMetric.Gauge == nil { return fmt.Errorf( "collected metric %s %s should be a Gauge", desc.fqName, dtoMetric, ) } case dto.MetricType_SUMMARY: if dtoMetric.Summary == nil { return fmt.Errorf( "collected metric %s %s should be a Summary", desc.fqName, dtoMetric, ) } case dto.MetricType_UNTYPED: if dtoMetric.Untyped == nil { return fmt.Errorf( "collected metric %s %s should be Untyped", desc.fqName, dtoMetric, ) } case dto.MetricType_HISTOGRAM: if dtoMetric.Histogram == nil { return fmt.Errorf( "collected metric %s %s should be a Histogram", desc.fqName, dtoMetric, ) } default: panic("encountered MetricFamily with invalid type") } } else { // New name. metricFamily = &dto.MetricFamily{} metricFamily.Name = proto.String(desc.fqName) metricFamily.Help = proto.String(desc.help) // TODO(beorn7): Simplify switch once Desc has type. switch { case dtoMetric.Gauge != nil: metricFamily.Type = dto.MetricType_GAUGE.Enum() case dtoMetric.Counter != nil: metricFamily.Type = dto.MetricType_COUNTER.Enum() case dtoMetric.Summary != nil: metricFamily.Type = dto.MetricType_SUMMARY.Enum() case dtoMetric.Untyped != nil: metricFamily.Type = dto.MetricType_UNTYPED.Enum() case dtoMetric.Histogram != nil: metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() default: return fmt.Errorf("empty metric collected: %s", dtoMetric) } if err := checkSuffixCollisions(metricFamily, metricFamiliesByName); err != nil { return err } metricFamiliesByName[desc.fqName] = metricFamily } if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes); err != nil { return err } if registeredDescIDs != nil { // Is the desc registered at all? if _, exist := registeredDescIDs[desc.id]; !exist { return fmt.Errorf( "collected metric %s %s with unregistered descriptor %s", metricFamily.GetName(), dtoMetric, desc, ) } if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { return err } } metricFamily.Metric = append(metricFamily.Metric, dtoMetric) return nil } // Gatherers is a slice of Gatherer instances that implements the Gatherer // interface itself. Its Gather method calls Gather on all Gatherers in the // slice in order and returns the merged results. Errors returned from the // Gather calls are all returned in a flattened MultiError. Duplicate and // inconsistent Metrics are skipped (first occurrence in slice order wins) and // reported in the returned error. // // Gatherers can be used to merge the Gather results from multiple // Registries. It also provides a way to directly inject existing MetricFamily // protobufs into the gathering by creating a custom Gatherer with a Gather // method that simply returns the existing MetricFamily protobufs. Note that no // registration is involved (in contrast to Collector registration), so // obviously registration-time checks cannot happen. Any inconsistencies between // the gathered MetricFamilies are reported as errors by the Gather method, and // inconsistent Metrics are dropped. Invalid parts of the MetricFamilies // (e.g. syntactically invalid metric or label names) will go undetected. type Gatherers []Gatherer // Gather implements Gatherer. func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { var ( metricFamiliesByName = map[string]*dto.MetricFamily{} metricHashes = map[uint64]struct{}{} errs MultiError // The collected errors to return in the end. ) for i, g := range gs { mfs, err := g.Gather() if err != nil { multiErr := MultiError{} if errors.As(err, &multiErr) { for _, err := range multiErr { errs = append(errs, fmt.Errorf("[from Gatherer #%d] %w", i+1, err)) } } else { errs = append(errs, fmt.Errorf("[from Gatherer #%d] %w", i+1, err)) } } for _, mf := range mfs { existingMF, exists := metricFamiliesByName[mf.GetName()] if exists { if existingMF.GetHelp() != mf.GetHelp() { errs = append(errs, fmt.Errorf( "gathered metric family %s has help %q but should have %q", mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), )) continue } if existingMF.GetType() != mf.GetType() { errs = append(errs, fmt.Errorf( "gathered metric family %s has type %s but should have %s", mf.GetName(), mf.GetType(), existingMF.GetType(), )) continue } } else { existingMF = &dto.MetricFamily{} existingMF.Name = mf.Name existingMF.Help = mf.Help existingMF.Type = mf.Type if err := checkSuffixCollisions(existingMF, metricFamiliesByName); err != nil { errs = append(errs, err) continue } metricFamiliesByName[mf.GetName()] = existingMF } for _, m := range mf.Metric { if err := checkMetricConsistency(existingMF, m, metricHashes); err != nil { errs = append(errs, err) continue } existingMF.Metric = append(existingMF.Metric, m) } } } return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() } // checkSuffixCollisions checks for collisions with the “magic” suffixes the // Prometheus text format and the internal metric representation of the // Prometheus server add while flattening Summaries and Histograms. func checkSuffixCollisions(mf *dto.MetricFamily, mfs map[string]*dto.MetricFamily) error { var ( newName = mf.GetName() newType = mf.GetType() newNameWithoutSuffix = "" ) switch { case strings.HasSuffix(newName, "_count"): newNameWithoutSuffix = newName[:len(newName)-6] case strings.HasSuffix(newName, "_sum"): newNameWithoutSuffix = newName[:len(newName)-4] case strings.HasSuffix(newName, "_bucket"): newNameWithoutSuffix = newName[:len(newName)-7] } if newNameWithoutSuffix != "" { if existingMF, ok := mfs[newNameWithoutSuffix]; ok { switch existingMF.GetType() { case dto.MetricType_SUMMARY: if !strings.HasSuffix(newName, "_bucket") { return fmt.Errorf( "collected metric named %q collides with previously collected summary named %q", newName, newNameWithoutSuffix, ) } case dto.MetricType_HISTOGRAM: return fmt.Errorf( "collected metric named %q collides with previously collected histogram named %q", newName, newNameWithoutSuffix, ) } } } if newType == dto.MetricType_SUMMARY || newType == dto.MetricType_HISTOGRAM { if _, ok := mfs[newName+"_count"]; ok { return fmt.Errorf( "collected histogram or summary named %q collides with previously collected metric named %q", newName, newName+"_count", ) } if _, ok := mfs[newName+"_sum"]; ok { return fmt.Errorf( "collected histogram or summary named %q collides with previously collected metric named %q", newName, newName+"_sum", ) } } if newType == dto.MetricType_HISTOGRAM { if _, ok := mfs[newName+"_bucket"]; ok { return fmt.Errorf( "collected histogram named %q collides with previously collected metric named %q", newName, newName+"_bucket", ) } } return nil } // checkMetricConsistency checks if the provided Metric is consistent with the // provided MetricFamily. It also hashes the Metric labels and the MetricFamily // name. If the resulting hash is already in the provided metricHashes, an error // is returned. If not, it is added to metricHashes. func checkMetricConsistency( metricFamily *dto.MetricFamily, dtoMetric *dto.Metric, metricHashes map[uint64]struct{}, ) error { name := metricFamily.GetName() // Type consistency with metric family. if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { return fmt.Errorf( "collected metric %q { %s} is not a %s", name, dtoMetric, metricFamily.GetType(), ) } previousLabelName := "" for _, labelPair := range dtoMetric.GetLabel() { labelName := labelPair.GetName() if labelName == previousLabelName { return fmt.Errorf( "collected metric %q { %s} has two or more labels with the same name: %s", name, dtoMetric, labelName, ) } if !checkLabelName(labelName) { return fmt.Errorf( "collected metric %q { %s} has a label with an invalid name: %s", name, dtoMetric, labelName, ) } if dtoMetric.Summary != nil && labelName == quantileLabel { return fmt.Errorf( "collected metric %q { %s} must not have an explicit %q label", name, dtoMetric, quantileLabel, ) } if !utf8.ValidString(labelPair.GetValue()) { return fmt.Errorf( "collected metric %q { %s} has a label named %q whose value is not utf8: %#v", name, dtoMetric, labelName, labelPair.GetValue()) } previousLabelName = labelName } // Is the metric unique (i.e. no other metric with the same name and the same labels)? h := xxhash.New() h.WriteString(name) h.Write(separatorByteSlice) // Make sure label pairs are sorted. We depend on it for the consistency // check. if !sort.IsSorted(internal.LabelPairSorter(dtoMetric.Label)) { // We cannot sort dtoMetric.Label in place as it is immutable by contract. copiedLabels := make([]*dto.LabelPair, len(dtoMetric.Label)) copy(copiedLabels, dtoMetric.Label) sort.Sort(internal.LabelPairSorter(copiedLabels)) dtoMetric.Label = copiedLabels } for _, lp := range dtoMetric.Label { h.WriteString(lp.GetName()) h.Write(separatorByteSlice) h.WriteString(lp.GetValue()) h.Write(separatorByteSlice) } if dtoMetric.TimestampMs != nil { h.WriteString(strconv.FormatInt(*(dtoMetric.TimestampMs), 10)) h.Write(separatorByteSlice) } hSum := h.Sum64() if _, exists := metricHashes[hSum]; exists { return fmt.Errorf( "collected metric %q { %s} was collected before with the same name and label values", name, dtoMetric, ) } metricHashes[hSum] = struct{}{} return nil } func checkDescConsistency( metricFamily *dto.MetricFamily, dtoMetric *dto.Metric, desc *Desc, ) error { // Desc help consistency with metric family help. if metricFamily.GetHelp() != desc.help { return fmt.Errorf( "collected metric %s %s has help %q but should have %q", metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, ) } // Is the desc consistent with the content of the metric? lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) copy(lpsFromDesc, desc.constLabelPairs) for _, l := range desc.variableLabels.names { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ Name: proto.String(l), }) } if len(lpsFromDesc) != len(dtoMetric.Label) { return fmt.Errorf( "labels in collected metric %s %s are inconsistent with descriptor %s", metricFamily.GetName(), dtoMetric, desc, ) } sort.Sort(internal.LabelPairSorter(lpsFromDesc)) for i, lpFromDesc := range lpsFromDesc { lpFromMetric := dtoMetric.Label[i] if lpFromDesc.GetName() != lpFromMetric.GetName() || lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { return fmt.Errorf( "labels in collected metric %s %s are inconsistent with descriptor %s", metricFamily.GetName(), dtoMetric, desc, ) } } return nil } var _ TransactionalGatherer = &MultiTRegistry{} // MultiTRegistry is a TransactionalGatherer that joins gathered metrics from multiple // transactional gatherers. // // It is caller responsibility to ensure two registries have mutually exclusive metric families, // no deduplication will happen. type MultiTRegistry struct { tGatherers []TransactionalGatherer } // NewMultiTRegistry creates MultiTRegistry. func NewMultiTRegistry(tGatherers ...TransactionalGatherer) *MultiTRegistry { return &MultiTRegistry{ tGatherers: tGatherers, } } // Gather implements TransactionalGatherer interface. func (r *MultiTRegistry) Gather() (mfs []*dto.MetricFamily, done func(), err error) { errs := MultiError{} dFns := make([]func(), 0, len(r.tGatherers)) // TODO(bwplotka): Implement concurrency for those? for _, g := range r.tGatherers { // TODO(bwplotka): Check for duplicates? m, d, err := g.Gather() errs.Append(err) mfs = append(mfs, m...) dFns = append(dFns, d) } // TODO(bwplotka): Consider sort in place, given metric family in gather is sorted already. sort.Slice(mfs, func(i, j int) bool { return *mfs[i].Name < *mfs[j].Name }) return mfs, func() { for _, d := range dFns { d() } }, errs.MaybeUnwrap() } // TransactionalGatherer represents transactional gatherer that can be triggered to notify gatherer that memory // used by metric family is no longer used by a caller. This allows implementations with cache. type TransactionalGatherer interface { // Gather returns metrics in a lexicographically sorted slice // of uniquely named MetricFamily protobufs. Gather ensures that the // returned slice is valid and self-consistent so that it can be used // for valid exposition. As an exception to the strict consistency // requirements described for metric.Desc, Gather will tolerate // different sets of label names for metrics of the same metric family. // // Even if an error occurs, Gather attempts to gather as many metrics as // possible. Hence, if a non-nil error is returned, the returned // MetricFamily slice could be nil (in case of a fatal error that // prevented any meaningful metric collection) or contain a number of // MetricFamily protobufs, some of which might be incomplete, and some // might be missing altogether. The returned error (which might be a // MultiError) explains the details. Note that this is mostly useful for // debugging purposes. If the gathered protobufs are to be used for // exposition in actual monitoring, it is almost always better to not // expose an incomplete result and instead disregard the returned // MetricFamily protobufs in case the returned error is non-nil. // // Important: done is expected to be triggered (even if the error occurs!) // once caller does not need returned slice of dto.MetricFamily. Gather() (_ []*dto.MetricFamily, done func(), err error) } // ToTransactionalGatherer transforms Gatherer to transactional one with noop as done function. func ToTransactionalGatherer(g Gatherer) TransactionalGatherer { return &noTransactionGatherer{g: g} } type noTransactionGatherer struct { g Gatherer } // Gather implements TransactionalGatherer interface. func (g *noTransactionGatherer) Gather() (_ []*dto.MetricFamily, done func(), err error) { mfs, err := g.g.Gather() return mfs, func() {}, err } client_golang-1.19.1/prometheus/registry_test.go000066400000000000000000001120221461713521000220370ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Copyright (c) 2013, The Prometheus Authors // All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. package prometheus_test import ( "bytes" "errors" "fmt" "math/rand" "net/http" "net/http/httptest" "os" "sync" "testing" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) // uncheckedCollector wraps a Collector but its Describe method yields no Desc. type uncheckedCollector struct { c prometheus.Collector } func (u uncheckedCollector) Describe(_ chan<- *prometheus.Desc) {} func (u uncheckedCollector) Collect(c chan<- prometheus.Metric) { u.c.Collect(c) } func testHandler(t testing.TB) { // TODO(beorn7): This test is a bit too "end-to-end". It tests quite a // few moving parts that are not strongly coupled. They could/should be // tested separately. However, the changes planned for v2 will // require a major rework of this test anyway, at which time I will // structure it in a better way. metricVec := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "name", Help: "docstring", ConstLabels: prometheus.Labels{"constname": "constvalue"}, }, []string{"labelname"}, ) metricVec.WithLabelValues("val1").Inc() metricVec.WithLabelValues("val2").Inc() externalMetricFamily := &dto.MetricFamily{ Name: proto.String("externalname"), Help: proto.String("externaldocstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Label: []*dto.LabelPair{ { Name: proto.String("externalconstname"), Value: proto.String("externalconstvalue"), }, { Name: proto.String("externallabelname"), Value: proto.String("externalval1"), }, }, Counter: &dto.Counter{ Value: proto.Float64(1), }, }, }, } externalBuf := &bytes.Buffer{} enc := expfmt.NewEncoder(externalBuf, expfmt.NewFormat(expfmt.TypeProtoDelim)) if err := enc.Encode(externalMetricFamily); err != nil { t.Fatal(err) } externalMetricFamilyAsBytes := externalBuf.Bytes() externalMetricFamilyAsText := []byte(`# HELP externalname externaldocstring # TYPE externalname counter externalname{externalconstname="externalconstvalue",externallabelname="externalval1"} 1 `) externalMetricFamilyAsProtoText := []byte(`name: "externalname" help: "externaldocstring" type: COUNTER metric: < label: < name: "externalconstname" value: "externalconstvalue" > label: < name: "externallabelname" value: "externalval1" > counter: < value: 1 > > `) externalMetricFamilyAsProtoCompactText := []byte(`name:"externalname" help:"externaldocstring" type:COUNTER metric: label: counter: >`) externalMetricFamilyAsProtoCompactText = append(externalMetricFamilyAsProtoCompactText, []byte(" \n")...) expectedMetricFamily := &dto.MetricFamily{ Name: proto.String("name"), Help: proto.String("docstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Label: []*dto.LabelPair{ { Name: proto.String("constname"), Value: proto.String("constvalue"), }, { Name: proto.String("labelname"), Value: proto.String("val1"), }, }, Counter: &dto.Counter{ Value: proto.Float64(1), CreatedTimestamp: timestamppb.New(time.Now()), }, }, { Label: []*dto.LabelPair{ { Name: proto.String("constname"), Value: proto.String("constvalue"), }, { Name: proto.String("labelname"), Value: proto.String("val2"), }, }, Counter: &dto.Counter{ Value: proto.Float64(1), CreatedTimestamp: timestamppb.New(time.Now()), }, }, }, } buf := &bytes.Buffer{} enc = expfmt.NewEncoder(buf, expfmt.NewFormat(expfmt.TypeProtoDelim)) if err := enc.Encode(expectedMetricFamily); err != nil { t.Fatal(err) } expectedMetricFamilyAsBytes := buf.Bytes() expectedMetricFamilyAsText := []byte(`# HELP name docstring # TYPE name counter name{constname="constvalue",labelname="val1"} 1 name{constname="constvalue",labelname="val2"} 1 `) expectedMetricFamilyAsProtoText := []byte(`name: "name" help: "docstring" type: COUNTER metric: < label: < name: "constname" value: "constvalue" > label: < name: "labelname" value: "val1" > counter: < value: 1 > > metric: < label: < name: "constname" value: "constvalue" > label: < name: "labelname" value: "val2" > counter: < value: 1 > > `) expectedMetricFamilyAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: >`) expectedMetricFamilyAsProtoCompactText = append(expectedMetricFamilyAsProtoCompactText, []byte(" \n")...) externalMetricFamilyWithSameName := &dto.MetricFamily{ Name: proto.String("name"), Help: proto.String("docstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Label: []*dto.LabelPair{ { Name: proto.String("constname"), Value: proto.String("constvalue"), }, { Name: proto.String("labelname"), Value: proto.String("different_val"), }, }, Counter: &dto.Counter{ Value: proto.Float64(42), }, }, }, } expectedMetricFamilyMergedWithExternalAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > metric: label: counter: >`) expectedMetricFamilyMergedWithExternalAsProtoCompactText = append(expectedMetricFamilyMergedWithExternalAsProtoCompactText, []byte(" \n")...) externalMetricFamilyWithInvalidLabelValue := &dto.MetricFamily{ Name: proto.String("name"), Help: proto.String("docstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Label: []*dto.LabelPair{ { Name: proto.String("constname"), Value: proto.String("\xFF"), }, { Name: proto.String("labelname"), Value: proto.String("different_val"), }, }, Counter: &dto.Counter{ Value: proto.Float64(42), }, }, }, } expectedMetricFamilyInvalidLabelValueAsText := []byte(`An error has occurred while serving metrics: collected metric "name" { label: label: counter: } has a label named "constname" whose value is not utf8: "\xff" `) summary := prometheus.NewSummary(prometheus.SummaryOpts{ Name: "complex", Help: "A metric to check collisions with _sum and _count.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }) summaryAsText := []byte(`# HELP complex A metric to check collisions with _sum and _count. # TYPE complex summary complex{quantile="0.5"} NaN complex{quantile="0.9"} NaN complex{quantile="0.99"} NaN complex_sum 0 complex_count 0 `) histogram := prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "complex", Help: "A metric to check collisions with _sun, _count, and _bucket.", }) externalMetricFamilyWithBucketSuffix := &dto.MetricFamily{ Name: proto.String("complex_bucket"), Help: proto.String("externaldocstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Counter: &dto.Counter{ Value: proto.Float64(1), }, }, }, } externalMetricFamilyWithBucketSuffixAsText := []byte(`# HELP complex_bucket externaldocstring # TYPE complex_bucket counter complex_bucket 1 `) externalMetricFamilyWithCountSuffix := &dto.MetricFamily{ Name: proto.String("complex_count"), Help: proto.String("externaldocstring"), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Counter: &dto.Counter{ Value: proto.Float64(1), }, }, }, } bucketCollisionMsg := []byte(`An error has occurred while serving metrics: collected metric named "complex_bucket" collides with previously collected histogram named "complex" `) summaryCountCollisionMsg := []byte(`An error has occurred while serving metrics: collected metric named "complex_count" collides with previously collected summary named "complex" `) histogramCountCollisionMsg := []byte(`An error has occurred while serving metrics: collected metric named "complex_count" collides with previously collected histogram named "complex" `) externalMetricFamilyWithDuplicateLabel := &dto.MetricFamily{ Name: proto.String("broken_metric"), Help: proto.String("The registry should detect the duplicate label."), Type: dto.MetricType_COUNTER.Enum(), Metric: []*dto.Metric{ { Label: []*dto.LabelPair{ { Name: proto.String("foo"), Value: proto.String("bar"), }, { Name: proto.String("foo"), Value: proto.String("baz"), }, }, Counter: &dto.Counter{ Value: proto.Float64(2.7), }, }, }, } duplicateLabelMsg := []byte(`An error has occurred while serving metrics: collected metric "broken_metric" { label: label: counter: } has two or more labels with the same name: foo `) type output struct { headers map[string]string body []byte } scenarios := []struct { headers map[string]string out output collector prometheus.Collector externalMF []*dto.MetricFamily }{ { // 0 headers: map[string]string{ "Accept": "foo/bar;q=0.2, dings/bums;q=0.8", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: []byte{}, }, }, { // 1 headers: map[string]string{ "Accept": "foo/bar;q=0.2, application/quark;q=0.8", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: []byte{}, }, }, { // 2 headers: map[string]string{ "Accept": "foo/bar;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.8", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: []byte{}, }, }, { // 3 headers: map[string]string{ "Accept": "text/plain;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.8", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited; escaping=values`, }, body: []byte{}, }, }, { // 4 headers: map[string]string{ "Accept": "application/json", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: expectedMetricFamilyAsText, }, collector: metricVec, }, { // 5 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited; escaping=values`, }, body: expectedMetricFamilyAsBytes, }, collector: metricVec, }, { // 6 headers: map[string]string{ "Accept": "application/json", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: externalMetricFamilyAsText, }, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 7 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited; escaping=values`, }, body: externalMetricFamilyAsBytes, }, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 8 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsBytes, expectedMetricFamilyAsBytes, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 9 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: []byte{}, }, }, { // 10 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: expectedMetricFamilyAsText, }, collector: metricVec, }, { // 11 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5;version=0.0.4", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsText, expectedMetricFamilyAsText, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 12 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.2, text/plain;q=0.5;version=0.0.2", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsBytes, expectedMetricFamilyAsBytes, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 13 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=text;q=0.5, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.4", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=text; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsProtoText, expectedMetricFamilyAsProtoText, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 14 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsProtoCompactText, expectedMetricFamilyAsProtoCompactText, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{externalMetricFamily}, }, { // 15 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", }, out: output{ headers: map[string]string{ "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text; escaping=values`, }, body: bytes.Join( [][]byte{ externalMetricFamilyAsProtoCompactText, expectedMetricFamilyMergedWithExternalAsProtoCompactText, }, []byte{}, ), }, collector: metricVec, externalMF: []*dto.MetricFamily{ externalMetricFamily, externalMetricFamilyWithSameName, }, }, { // 16 headers: map[string]string{ "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; charset=utf-8`, }, body: expectedMetricFamilyInvalidLabelValueAsText, }, collector: metricVec, externalMF: []*dto.MetricFamily{ externalMetricFamily, externalMetricFamilyWithInvalidLabelValue, }, }, { // 17 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: expectedMetricFamilyAsText, }, collector: uncheckedCollector{metricVec}, }, { // 18 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; charset=utf-8`, }, body: histogramCountCollisionMsg, }, collector: histogram, externalMF: []*dto.MetricFamily{ externalMetricFamilyWithCountSuffix, }, }, { // 19 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; charset=utf-8`, }, body: bucketCollisionMsg, }, collector: histogram, externalMF: []*dto.MetricFamily{ externalMetricFamilyWithBucketSuffix, }, }, { // 20 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; charset=utf-8`, }, body: summaryCountCollisionMsg, }, collector: summary, externalMF: []*dto.MetricFamily{ externalMetricFamilyWithCountSuffix, }, }, { // 21 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; version=0.0.4; charset=utf-8; escaping=values`, }, body: bytes.Join( [][]byte{ summaryAsText, externalMetricFamilyWithBucketSuffixAsText, }, []byte{}, ), }, collector: summary, externalMF: []*dto.MetricFamily{ externalMetricFamilyWithBucketSuffix, }, }, { // 22 headers: map[string]string{ "Accept": "text/plain", }, out: output{ headers: map[string]string{ "Content-Type": `text/plain; charset=utf-8`, }, body: duplicateLabelMsg, }, externalMF: []*dto.MetricFamily{ externalMetricFamilyWithDuplicateLabel, }, }, } for i, scenario := range scenarios { registry := prometheus.NewPedanticRegistry() gatherer := prometheus.Gatherer(registry) if scenario.externalMF != nil { gatherer = prometheus.Gatherers{ registry, prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { return scenario.externalMF, nil }), } } if scenario.collector != nil { registry.MustRegister(scenario.collector) } writer := httptest.NewRecorder() handler := promhttp.HandlerFor(gatherer, promhttp.HandlerOpts{}) request, _ := http.NewRequest("GET", "/", nil) for key, value := range scenario.headers { request.Header.Add(key, value) } handler.ServeHTTP(writer, request) for key, value := range scenario.out.headers { if writer.Header().Get(key) != value { t.Errorf( "%d. expected %q for header %q, got %q", i, value, key, writer.Header().Get(key), ) } } var outMF dto.MetricFamily var writerMF dto.MetricFamily proto.Unmarshal(scenario.out.body, &outMF) proto.Unmarshal(writer.Body.Bytes(), &writerMF) if !proto.Equal(&outMF, &writerMF) { t.Errorf( "%d. expected body:\n%s\ngot body:\n%s\n", i, scenario.out.body, writer.Body.Bytes(), ) } } } func TestHandler(t *testing.T) { testHandler(t) } func BenchmarkHandler(b *testing.B) { for i := 0; i < b.N; i++ { testHandler(b) } } func TestAlreadyRegistered(t *testing.T) { original := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "test", Help: "help", ConstLabels: prometheus.Labels{"const": "label"}, }, []string{"foo", "bar"}, ) equalButNotSame := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "test", Help: "help", ConstLabels: prometheus.Labels{"const": "label"}, }, []string{"foo", "bar"}, ) originalWithoutConstLabel := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "test", Help: "help", }, []string{"foo", "bar"}, ) equalButNotSameWithoutConstLabel := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "test", Help: "help", }, []string{"foo", "bar"}, ) scenarios := []struct { name string originalCollector prometheus.Collector registerWith func(prometheus.Registerer) prometheus.Registerer newCollector prometheus.Collector reRegisterWith func(prometheus.Registerer) prometheus.Registerer }{ { "RegisterNormallyReregisterNormally", original, func(r prometheus.Registerer) prometheus.Registerer { return r }, equalButNotSame, func(r prometheus.Registerer) prometheus.Registerer { return r }, }, { "RegisterNormallyReregisterWrapped", original, func(r prometheus.Registerer) prometheus.Registerer { return r }, equalButNotSameWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r) }, }, { "RegisterWrappedReregisterWrapped", originalWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r) }, equalButNotSameWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r) }, }, { "RegisterWrappedReregisterNormally", originalWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r) }, equalButNotSame, func(r prometheus.Registerer) prometheus.Registerer { return r }, }, { "RegisterDoublyWrappedReregisterDoublyWrapped", originalWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWithPrefix( "wrap_", prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r), ) }, equalButNotSameWithoutConstLabel, func(r prometheus.Registerer) prometheus.Registerer { return prometheus.WrapRegistererWithPrefix( "wrap_", prometheus.WrapRegistererWith(prometheus.Labels{"const": "label"}, r), ) }, }, } for _, s := range scenarios { t.Run(s.name, func(t *testing.T) { var err error reg := prometheus.NewRegistry() if err = s.registerWith(reg).Register(s.originalCollector); err != nil { t.Fatal(err) } if err = s.reRegisterWith(reg).Register(s.newCollector); err == nil { t.Fatal("expected error when registering new collector") } are := &prometheus.AlreadyRegisteredError{} if errors.As(err, are) { if are.ExistingCollector != s.originalCollector { t.Error("expected original collector but got something else") } if are.ExistingCollector == s.newCollector { t.Error("expected original collector but got new one") } } else { t.Error("unexpected error:", err) } }) } } // TestRegisterUnregisterCollector ensures registering and unregistering a // collector doesn't leave any dangling metrics. // We use NewGoCollector as a nice concrete example of a collector with // multiple metrics. func TestRegisterUnregisterCollector(t *testing.T) { col := prometheus.NewGoCollector() reg := prometheus.NewRegistry() reg.MustRegister(col) reg.Unregister(col) if metrics, err := reg.Gather(); err != nil { t.Error("error gathering sample metric") } else if len(metrics) != 0 { t.Error("should have unregistered metric") } } // TestHistogramVecRegisterGatherConcurrency is an end-to-end test that // concurrently calls Observe on random elements of a HistogramVec while the // same HistogramVec is registered concurrently and the Gather method of the // registry is called concurrently. func TestHistogramVecRegisterGatherConcurrency(t *testing.T) { labelNames := make([]string, 16) // Need at least 13 to expose #512. for i := range labelNames { labelNames[i] = fmt.Sprint("label_", i) } var ( reg = prometheus.NewPedanticRegistry() hv = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "test_histogram", Help: "This helps testing.", ConstLabels: prometheus.Labels{"foo": "bar"}, }, labelNames, ) labelValues = []string{"a", "b", "c", "alpha", "beta", "gamma", "aleph", "beth", "gimel"} quit = make(chan struct{}) wg sync.WaitGroup ) observe := func() { defer wg.Done() for { select { case <-quit: return default: obs := rand.NormFloat64()*.1 + .2 values := make([]string, 0, len(labelNames)) for range labelNames { values = append(values, labelValues[rand.Intn(len(labelValues))]) } hv.WithLabelValues(values...).Observe(obs) } } } register := func() { defer wg.Done() for { select { case <-quit: return default: if err := reg.Register(hv); err != nil { if !errors.As(err, &prometheus.AlreadyRegisteredError{}) { t.Error("Registering failed:", err) } } time.Sleep(7 * time.Millisecond) } } } gather := func() { defer wg.Done() for { select { case <-quit: return default: if g, err := reg.Gather(); err != nil { t.Error("Gathering failed:", err) } else { if len(g) == 0 { continue } if len(g) != 1 { t.Error("Gathered unexpected number of metric families:", len(g)) } if len(g[0].Metric[0].Label) != len(labelNames)+1 { t.Error("Gathered unexpected number of label pairs:", len(g[0].Metric[0].Label)) } } time.Sleep(4 * time.Millisecond) } } } wg.Add(10) go observe() go observe() go register() go observe() go gather() go observe() go register() go observe() go gather() go observe() time.Sleep(time.Second) close(quit) wg.Wait() } func TestWriteToTextfile(t *testing.T) { expectedOut := `# HELP test_counter test counter # TYPE test_counter counter test_counter{name="qux"} 1 # HELP test_gauge test gauge # TYPE test_gauge gauge test_gauge{name="baz"} 1.1 # HELP test_hist test histogram # TYPE test_hist histogram test_hist_bucket{name="bar",le="0.005"} 0 test_hist_bucket{name="bar",le="0.01"} 0 test_hist_bucket{name="bar",le="0.025"} 0 test_hist_bucket{name="bar",le="0.05"} 0 test_hist_bucket{name="bar",le="0.1"} 0 test_hist_bucket{name="bar",le="0.25"} 0 test_hist_bucket{name="bar",le="0.5"} 0 test_hist_bucket{name="bar",le="1"} 1 test_hist_bucket{name="bar",le="2.5"} 1 test_hist_bucket{name="bar",le="5"} 2 test_hist_bucket{name="bar",le="10"} 2 test_hist_bucket{name="bar",le="+Inf"} 2 test_hist_sum{name="bar"} 3.64 test_hist_count{name="bar"} 2 # HELP test_summary test summary # TYPE test_summary summary test_summary{name="foo",quantile="0.5"} 10 test_summary{name="foo",quantile="0.9"} 20 test_summary{name="foo",quantile="0.99"} 20 test_summary_sum{name="foo"} 30 test_summary_count{name="foo"} 2 ` registry := prometheus.NewRegistry() summary := prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "test_summary", Help: "test summary", Objectives: map[float64]float64{ 0.5: 0.05, 0.9: 0.01, 0.99: 0.001, }, }, []string{"name"}, ) histogram := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "test_hist", Help: "test histogram", }, []string{"name"}, ) gauge := prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "test_gauge", Help: "test gauge", }, []string{"name"}, ) counter := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "test_counter", Help: "test counter", }, []string{"name"}, ) registry.MustRegister(summary) registry.MustRegister(histogram) registry.MustRegister(gauge) registry.MustRegister(counter) summary.With(prometheus.Labels{"name": "foo"}).Observe(10) summary.With(prometheus.Labels{"name": "foo"}).Observe(20) histogram.With(prometheus.Labels{"name": "bar"}).Observe(0.93) histogram.With(prometheus.Labels{"name": "bar"}).Observe(2.71) gauge.With(prometheus.Labels{"name": "baz"}).Set(1.1) counter.With(prometheus.Labels{"name": "qux"}).Inc() tmpfile, err := os.CreateTemp("", "prom_registry_test") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if err := prometheus.WriteToTextfile(tmpfile.Name(), registry); err != nil { t.Fatal(err) } fileBytes, err := os.ReadFile(tmpfile.Name()) if err != nil { t.Fatal(err) } fileContents := string(fileBytes) if fileContents != expectedOut { t.Errorf( "files don't match, got:\n%s\nwant:\n%s", fileContents, expectedOut, ) } } // collidingCollector is a collection of prometheus.Collectors, // and is itself a prometheus.Collector. type collidingCollector struct { i int name string a, b, c, d prometheus.Collector } // Describe satisfies part of the prometheus.Collector interface. func (m *collidingCollector) Describe(desc chan<- *prometheus.Desc) { m.a.Describe(desc) m.b.Describe(desc) m.c.Describe(desc) m.d.Describe(desc) } // Collect satisfies part of the prometheus.Collector interface. func (m *collidingCollector) Collect(metric chan<- prometheus.Metric) { m.a.Collect(metric) m.b.Collect(metric) m.c.Collect(metric) m.d.Collect(metric) } // TestAlreadyRegistered will fail with the old, weaker hash function. It is // taken from https://play.golang.org/p/HpV7YE6LI_4 , authored by @awilliams. func TestAlreadyRegisteredCollision(t *testing.T) { reg := prometheus.NewRegistry() for i := 0; i < 10000; i++ { // A collector should be considered unique if its name and const // label values are unique. name := fmt.Sprintf("test-collector-%010d", i) collector := collidingCollector{ i: i, name: name, a: prometheus.NewCounter(prometheus.CounterOpts{ Name: "my_collector_a", ConstLabels: prometheus.Labels{ "name": name, "type": "test", }, }), b: prometheus.NewCounter(prometheus.CounterOpts{ Name: "my_collector_b", ConstLabels: prometheus.Labels{ "name": name, "type": "test", }, }), c: prometheus.NewCounter(prometheus.CounterOpts{ Name: "my_collector_c", ConstLabels: prometheus.Labels{ "name": name, "type": "test", }, }), d: prometheus.NewCounter(prometheus.CounterOpts{ Name: "my_collector_d", ConstLabels: prometheus.Labels{ "name": name, "type": "test", }, }), } // Register should not fail, since each collector has a unique // set of sub-collectors, determined by their names and const label values. if err := reg.Register(&collector); err != nil { are := &prometheus.AlreadyRegisteredError{} if !errors.As(err, are) { t.Fatal(err) } previous := are.ExistingCollector.(*collidingCollector) current := are.NewCollector.(*collidingCollector) t.Errorf("Unexpected registration error: %q\nprevious collector: %s (i=%d)\ncurrent collector %s (i=%d)", are, previous.name, previous.i, current.name, current.i) } } } type tGatherer struct { done bool err error } func (g *tGatherer) Gather() (_ []*dto.MetricFamily, done func(), err error) { name := "g1" val := 1.0 return []*dto.MetricFamily{ {Name: &name, Metric: []*dto.Metric{{Gauge: &dto.Gauge{Value: &val}}}}, }, func() { g.done = true }, g.err } func TestNewMultiTRegistry(t *testing.T) { treg := &tGatherer{} t.Run("one registry", func(t *testing.T) { m := prometheus.NewMultiTRegistry(treg) ret, done, err := m.Gather() if err != nil { t.Error("gather failed:", err) } done() if len(ret) != 1 { t.Error("unexpected number of metric families, expected 1, got", ret) } if !treg.done { t.Error("inner transactional registry not marked as done") } }) reg := prometheus.NewRegistry() if err := reg.Register(prometheus.NewCounter(prometheus.CounterOpts{Name: "c1", Help: "help c1"})); err != nil { t.Error("registration failed:", err) } // Note on purpose two registries will have exactly same metric family name (but with different string). // This behaviour is undefined at the moment. if err := reg.Register(prometheus.NewGauge(prometheus.GaugeOpts{Name: "g1", Help: "help g1"})); err != nil { t.Error("registration failed:", err) } treg.done = false t.Run("two registries", func(t *testing.T) { m := prometheus.NewMultiTRegistry(prometheus.ToTransactionalGatherer(reg), treg) ret, done, err := m.Gather() if err != nil { t.Error("gather failed:", err) } done() if len(ret) != 3 { t.Error("unexpected number of metric families, expected 3, got", ret) } if !treg.done { t.Error("inner transactional registry not marked as done") } }) treg.done = false // Inject error. treg.err = errors.New("test err") t.Run("two registries, one with error", func(t *testing.T) { m := prometheus.NewMultiTRegistry(prometheus.ToTransactionalGatherer(reg), treg) ret, done, err := m.Gather() if !errors.Is(err, treg.err) { t.Error("unexpected error:", err) } done() if len(ret) != 3 { t.Error("unexpected number of metric families, expected 3, got", ret) } // Still on error, we expect done to be triggered. if !treg.done { t.Error("inner transactional registry not marked as done") } }) } // This example shows how to use multiple registries for registering and // unregistering groups of metrics. func ExampleRegistry_grouping() { // Create a global registry. globalReg := prometheus.NewRegistry() // Spawn 10 workers, each of which will have their own group of metrics. for i := 0; i < 10; i++ { // Create a new registry for each worker, which acts as a group of // worker-specific metrics. workerReg := prometheus.NewRegistry() globalReg.Register(workerReg) go func(workerID int) { // Once the worker is done, it can unregister itself. defer globalReg.Unregister(workerReg) workTime := prometheus.NewCounter(prometheus.CounterOpts{ Name: "worker_total_work_time_milliseconds", ConstLabels: prometheus.Labels{ // Generate a label unique to this worker so its metric doesn't // collide with the metrics from other workers. "worker_id": fmt.Sprintf("%d", workerID), }, }) workerReg.MustRegister(workTime) start := time.Now() time.Sleep(time.Millisecond * time.Duration(rand.Intn(100))) workTime.Add(float64(time.Since(start).Milliseconds())) }(i) } } type customCollector struct { collectFunc func(ch chan<- prometheus.Metric) } func (co *customCollector) Describe(_ chan<- *prometheus.Desc) {} func (co *customCollector) Collect(ch chan<- prometheus.Metric) { co.collectFunc(ch) } // TestCheckMetricConsistency func TestCheckMetricConsistency(t *testing.T) { reg := prometheus.NewRegistry() timestamp := time.Now() desc := prometheus.NewDesc("metric_a", "", nil, nil) metric := prometheus.MustNewConstMetric(desc, prometheus.CounterValue, 1) validCollector := &customCollector{ collectFunc: func(ch chan<- prometheus.Metric) { ch <- prometheus.NewMetricWithTimestamp(timestamp.Add(-1*time.Minute), metric) ch <- prometheus.NewMetricWithTimestamp(timestamp, metric) }, } reg.MustRegister(validCollector) _, err := reg.Gather() if err != nil { t.Error("metric validation should succeed:", err) } reg.Unregister(validCollector) invalidCollector := &customCollector{ collectFunc: func(ch chan<- prometheus.Metric) { ch <- prometheus.NewMetricWithTimestamp(timestamp, metric) ch <- prometheus.NewMetricWithTimestamp(timestamp, metric) }, } reg.MustRegister(invalidCollector) _, err = reg.Gather() if err == nil { t.Error("metric validation should return an error") } reg.Unregister(invalidCollector) } client_golang-1.19.1/prometheus/summary.go000066400000000000000000000625601461713521000206400ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "math" "runtime" "sort" "sync" "sync/atomic" "time" dto "github.com/prometheus/client_model/go" "github.com/beorn7/perks/quantile" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) // quantileLabel is used for the label that defines the quantile in a // summary. const quantileLabel = "quantile" // A Summary captures individual observations from an event or sample stream and // summarizes them in a manner similar to traditional summary statistics: 1. sum // of observations, 2. observation count, 3. rank estimations. // // A typical use-case is the observation of request latencies. By default, a // Summary provides the median, the 90th and the 99th percentile of the latency // as rank estimations. However, the default behavior will change in the // upcoming v1.0.0 of the library. There will be no rank estimations at all by // default. For a sane transition, it is recommended to set the desired rank // estimations explicitly. // // Note that the rank estimations cannot be aggregated in a meaningful way with // the Prometheus query language (i.e. you cannot average or add them). If you // need aggregatable quantiles (e.g. you want the 99th percentile latency of all // queries served across all instances of a service), consider the Histogram // metric type. See the Prometheus documentation for more details. // // To create Summary instances, use NewSummary. type Summary interface { Metric Collector // Observe adds a single observation to the summary. Observations are // usually positive or zero. Negative observations are accepted but // prevent current versions of Prometheus from properly detecting // counter resets in the sum of observations. See // https://prometheus.io/docs/practices/histograms/#count-and-sum-of-observations // for details. Observe(float64) } var errQuantileLabelNotAllowed = fmt.Errorf( "%q is not allowed as label name in summaries", quantileLabel, ) // Default values for SummaryOpts. const ( // DefMaxAge is the default duration for which observations stay // relevant. DefMaxAge time.Duration = 10 * time.Minute // DefAgeBuckets is the default number of buckets used to calculate the // age of observations. DefAgeBuckets = 5 // DefBufCap is the standard buffer size for collecting Summary observations. DefBufCap = 500 ) // SummaryOpts bundles the options for creating a Summary metric. It is // mandatory to set Name to a non-empty string. While all other fields are // optional and can safely be left at their zero value, it is recommended to set // a help string and to explicitly set the Objectives field to the desired value // as the default value will change in the upcoming v1.0.0 of the library. type SummaryOpts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Summary (created by joining these components with // "_"). Only Name is mandatory, the others merely help structuring the // name. Note that the fully-qualified name of the Summary must be a // valid Prometheus metric name. Namespace string Subsystem string Name string // Help provides information about this Summary. // // Metrics with the same fully-qualified name must have the same Help // string. Help string // ConstLabels are used to attach fixed labels to this metric. Metrics // with the same fully-qualified name must have the same label names in // their ConstLabels. // // Due to the way a Summary is represented in the Prometheus text format // and how it is handled by the Prometheus server internally, “quantile” // is an illegal label name. Construction of a Summary or SummaryVec // will panic if this label name is used in ConstLabels. // // ConstLabels are only used rarely. In particular, do not use them to // attach the same labels to all your metrics. Those use cases are // better covered by target labels set by the scraping Prometheus // server, or by one specific metric (e.g. a build_info or a // machine_role metric). See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels // Objectives defines the quantile rank estimates with their respective // absolute error. If Objectives[q] = e, then the value reported for q // will be the φ-quantile value for some φ between q-e and q+e. The // default value is an empty map, resulting in a summary without // quantiles. Objectives map[float64]float64 // MaxAge defines the duration for which an observation stays relevant // for the summary. Only applies to pre-calculated quantiles, does not // apply to _sum and _count. Must be positive. The default value is // DefMaxAge. MaxAge time.Duration // AgeBuckets is the number of buckets used to exclude observations that // are older than MaxAge from the summary. A higher number has a // resource penalty, so only increase it if the higher resolution is // really required. For very high observation rates, you might want to // reduce the number of age buckets. With only one age bucket, you will // effectively see a complete reset of the summary each time MaxAge has // passed. The default value is DefAgeBuckets. AgeBuckets uint32 // BufCap defines the default sample stream buffer size. The default // value of DefBufCap should suffice for most uses. If there is a need // to increase the value, a multiple of 500 is recommended (because that // is the internal buffer size of the underlying package // "github.com/bmizerany/perks/quantile"). BufCap uint32 // now is for testing purposes, by default it's time.Now. now func() time.Time } // SummaryVecOpts bundles the options to create a SummaryVec metric. // It is mandatory to set SummaryOpts, see there for mandatory fields. VariableLabels // is optional and can safely be left to its default value. type SummaryVecOpts struct { SummaryOpts // VariableLabels are used to partition the metric vector by the given set // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } // Problem with the sliding-window decay algorithm... The Merge method of // perk/quantile is actually not working as advertised - and it might be // unfixable, as the underlying algorithm is apparently not capable of merging // summaries in the first place. To avoid using Merge, we are currently adding // observations to _each_ age bucket, i.e. the effort to add a sample is // essentially multiplied by the number of age buckets. When rotating age // buckets, we empty the previous head stream. On scrape time, we simply take // the quantiles from the head stream (no merging required). Result: More effort // on observation time, less effort on scrape time, which is exactly the // opposite of what we try to accomplish, but at least the results are correct. // // The quite elegant previous contraption to merge the age buckets efficiently // on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) // can't be used anymore. // NewSummary creates a new Summary based on the provided SummaryOpts. func NewSummary(opts SummaryOpts) Summary { return newSummary( NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ), opts, ) } func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels.names) != len(labelValues) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } for _, n := range desc.variableLabels.names { if n == quantileLabel { panic(errQuantileLabelNotAllowed) } } for _, lp := range desc.constLabelPairs { if lp.GetName() == quantileLabel { panic(errQuantileLabelNotAllowed) } } if opts.Objectives == nil { opts.Objectives = map[float64]float64{} } if opts.MaxAge < 0 { panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) } if opts.MaxAge == 0 { opts.MaxAge = DefMaxAge } if opts.AgeBuckets == 0 { opts.AgeBuckets = DefAgeBuckets } if opts.BufCap == 0 { opts.BufCap = DefBufCap } if opts.now == nil { opts.now = time.Now } if len(opts.Objectives) == 0 { // Use the lock-free implementation of a Summary without objectives. s := &noObjectivesSummary{ desc: desc, labelPairs: MakeLabelPairs(desc, labelValues), counts: [2]*summaryCounts{{}, {}}, } s.init(s) // Init self-collection. s.createdTs = timestamppb.New(opts.now()) return s } s := &summary{ desc: desc, objectives: opts.Objectives, sortedObjectives: make([]float64, 0, len(opts.Objectives)), labelPairs: MakeLabelPairs(desc, labelValues), hotBuf: make([]float64, 0, opts.BufCap), coldBuf: make([]float64, 0, opts.BufCap), streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), } s.headStreamExpTime = opts.now().Add(s.streamDuration) s.hotBufExpTime = s.headStreamExpTime for i := uint32(0); i < opts.AgeBuckets; i++ { s.streams = append(s.streams, s.newStream()) } s.headStream = s.streams[0] for qu := range s.objectives { s.sortedObjectives = append(s.sortedObjectives, qu) } sort.Float64s(s.sortedObjectives) s.init(s) // Init self-collection. s.createdTs = timestamppb.New(opts.now()) return s } type summary struct { selfCollector bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. mtx sync.Mutex // Protects every other moving part. // Lock bufMtx before mtx if both are needed. desc *Desc objectives map[float64]float64 sortedObjectives []float64 labelPairs []*dto.LabelPair sum float64 cnt uint64 hotBuf, coldBuf []float64 streams []*quantile.Stream streamDuration time.Duration headStream *quantile.Stream headStreamIdx int headStreamExpTime, hotBufExpTime time.Time createdTs *timestamppb.Timestamp } func (s *summary) Desc() *Desc { return s.desc } func (s *summary) Observe(v float64) { s.bufMtx.Lock() defer s.bufMtx.Unlock() now := time.Now() if now.After(s.hotBufExpTime) { s.asyncFlush(now) } s.hotBuf = append(s.hotBuf, v) if len(s.hotBuf) == cap(s.hotBuf) { s.asyncFlush(now) } } func (s *summary) Write(out *dto.Metric) error { sum := &dto.Summary{ CreatedTimestamp: s.createdTs, } qs := make([]*dto.Quantile, 0, len(s.objectives)) s.bufMtx.Lock() s.mtx.Lock() // Swap bufs even if hotBuf is empty to set new hotBufExpTime. s.swapBufs(time.Now()) s.bufMtx.Unlock() s.flushColdBuf() sum.SampleCount = proto.Uint64(s.cnt) sum.SampleSum = proto.Float64(s.sum) for _, rank := range s.sortedObjectives { var q float64 if s.headStream.Count() == 0 { q = math.NaN() } else { q = s.headStream.Query(rank) } qs = append(qs, &dto.Quantile{ Quantile: proto.Float64(rank), Value: proto.Float64(q), }) } s.mtx.Unlock() if len(qs) > 0 { sort.Sort(quantSort(qs)) } sum.Quantile = qs out.Summary = sum out.Label = s.labelPairs return nil } func (s *summary) newStream() *quantile.Stream { return quantile.NewTargeted(s.objectives) } // asyncFlush needs bufMtx locked. func (s *summary) asyncFlush(now time.Time) { s.mtx.Lock() s.swapBufs(now) // Unblock the original goroutine that was responsible for the mutation // that triggered the compaction. But hold onto the global non-buffer // state mutex until the operation finishes. go func() { s.flushColdBuf() s.mtx.Unlock() }() } // rotateStreams needs mtx AND bufMtx locked. func (s *summary) maybeRotateStreams() { for !s.hotBufExpTime.Equal(s.headStreamExpTime) { s.headStream.Reset() s.headStreamIdx++ if s.headStreamIdx >= len(s.streams) { s.headStreamIdx = 0 } s.headStream = s.streams[s.headStreamIdx] s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) } } // flushColdBuf needs mtx locked. func (s *summary) flushColdBuf() { for _, v := range s.coldBuf { for _, stream := range s.streams { stream.Insert(v) } s.cnt++ s.sum += v } s.coldBuf = s.coldBuf[0:0] s.maybeRotateStreams() } // swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. func (s *summary) swapBufs(now time.Time) { if len(s.coldBuf) != 0 { panic("coldBuf is not empty") } s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf // hotBuf is now empty and gets new expiration set. for now.After(s.hotBufExpTime) { s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) } } type summaryCounts struct { // sumBits contains the bits of the float64 representing the sum of all // observations. sumBits and count have to go first in the struct to // guarantee alignment for atomic operations. // http://golang.org/pkg/sync/atomic/#pkg-note-BUG sumBits uint64 count uint64 } type noObjectivesSummary struct { // countAndHotIdx enables lock-free writes with use of atomic updates. // The most significant bit is the hot index [0 or 1] of the count field // below. Observe calls update the hot one. All remaining bits count the // number of Observe calls. Observe starts by incrementing this counter, // and finish by incrementing the count field in the respective // summaryCounts, as a marker for completion. // // Calls of the Write method (which are non-mutating reads from the // perspective of the summary) swap the hot–cold under the writeMtx // lock. A cooldown is awaited (while locked) by comparing the number of // observations with the initiation count. Once they match, then the // last observation on the now cool one has completed. All cool fields must // be merged into the new hot before releasing writeMtx. // Fields with atomic access first! See alignment constraint: // http://golang.org/pkg/sync/atomic/#pkg-note-BUG countAndHotIdx uint64 selfCollector desc *Desc writeMtx sync.Mutex // Only used in the Write method. // Two counts, one is "hot" for lock-free observations, the other is // "cold" for writing out a dto.Metric. It has to be an array of // pointers to guarantee 64bit alignment of the histogramCounts, see // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. counts [2]*summaryCounts labelPairs []*dto.LabelPair createdTs *timestamppb.Timestamp } func (s *noObjectivesSummary) Desc() *Desc { return s.desc } func (s *noObjectivesSummary) Observe(v float64) { // We increment h.countAndHotIdx so that the counter in the lower // 63 bits gets incremented. At the same time, we get the new value // back, which we can use to find the currently-hot counts. n := atomic.AddUint64(&s.countAndHotIdx, 1) hotCounts := s.counts[n>>63] for { oldBits := atomic.LoadUint64(&hotCounts.sumBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + v) if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { break } } // Increment count last as we take it as a signal that the observation // is complete. atomic.AddUint64(&hotCounts.count, 1) } func (s *noObjectivesSummary) Write(out *dto.Metric) error { // For simplicity, we protect this whole method by a mutex. It is not in // the hot path, i.e. Observe is called much more often than Write. The // complication of making Write lock-free isn't worth it, if possible at // all. s.writeMtx.Lock() defer s.writeMtx.Unlock() // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) // without touching the count bits. See the struct comments for a full // description of the algorithm. n := atomic.AddUint64(&s.countAndHotIdx, 1<<63) // count is contained unchanged in the lower 63 bits. count := n & ((1 << 63) - 1) // The most significant bit tells us which counts is hot. The complement // is thus the cold one. hotCounts := s.counts[n>>63] coldCounts := s.counts[(^n)>>63] // Await cooldown. for count != atomic.LoadUint64(&coldCounts.count) { runtime.Gosched() // Let observations get work done. } sum := &dto.Summary{ SampleCount: proto.Uint64(count), SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), CreatedTimestamp: s.createdTs, } out.Summary = sum out.Label = s.labelPairs // Finally add all the cold counts to the new hot counts and reset the cold counts. atomic.AddUint64(&hotCounts.count, count) atomic.StoreUint64(&coldCounts.count, 0) for { oldBits := atomic.LoadUint64(&hotCounts.sumBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + sum.GetSampleSum()) if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { atomic.StoreUint64(&coldCounts.sumBits, 0) break } } return nil } type quantSort []*dto.Quantile func (s quantSort) Len() int { return len(s) } func (s quantSort) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s quantSort) Less(i, j int) bool { return s[i].GetQuantile() < s[j].GetQuantile() } // SummaryVec is a Collector that bundles a set of Summaries that all share the // same Desc, but have different values for their variable labels. This is used // if you want to count the same thing partitioned by various dimensions // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewSummaryVec. type SummaryVec struct { *MetricVec } // NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and // partitioned by the given label names. // // Due to the way a Summary is represented in the Prometheus text format and how // it is handled by the Prometheus server internally, “quantile” is an illegal // label name. NewSummaryVec will panic if this label name is used. func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { return V2.NewSummaryVec(SummaryVecOpts{ SummaryOpts: opts, VariableLabels: UnconstrainedLabels(labelNames), }) } // NewSummaryVec creates a new SummaryVec based on the provided SummaryVecOpts. func (v2) NewSummaryVec(opts SummaryVecOpts) *SummaryVec { for _, ln := range opts.VariableLabels.labelNames() { if ln == quantileLabel { panic(errQuantileLabelNotAllowed) } } desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, opts.VariableLabels, opts.ConstLabels, ) return &SummaryVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { return newSummary(desc, opts.SummaryOpts, lvs...) }), } } // GetMetricWithLabelValues returns the Summary for the given slice of label // values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Summary is created. // // It is possible to call this method without using the returned Summary to only // create the new Summary but leave it at its starting value, a Summary without // any observations. // // Keeping the Summary for later use is possible (and should be considered if // performance is critical), but keep in mind that Reset, DeleteLabelValues and // Delete can be used to delete the Summary from the SummaryVec. In that case, // the Summary will still exist, but it will not be exported anymore, even if a // Summary with the same label values is created later. See also the CounterVec // example. // // An error is returned if the number of label values is not the same as the // number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as // an alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Observer), err } return nil, err } // GetMetricWith returns the Summary for the given Labels map (the label names // must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Summary is created. Implications of // creating a Summary without using it and keeping the Summary for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent // with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) { metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Observer), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where // GetMetricWithLabelValues would have returned an error. Not returning an // error allows shortcuts like // // myVec.WithLabelValues("404", "GET").Observe(42.21) func (v *SummaryVec) WithLabelValues(lvs ...string) Observer { s, err := v.GetMetricWithLabelValues(lvs...) if err != nil { panic(err) } return s } // With works as GetMetricWith, but panics where GetMetricWithLabels would have // returned an error. Not returning an error allows shortcuts like // // myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) func (v *SummaryVec) With(labels Labels) Observer { s, err := v.GetMetricWith(labels) if err != nil { panic(err) } return s } // CurryWith returns a vector curried with the provided labels, i.e. the // returned vector has those labels pre-set for all labeled operations performed // on it. The cardinality of the curried vector is reduced accordingly. The // order of the remaining labels stays the same (just with the curried labels // taken out of the sequence – which is relevant for the // (GetMetric)WithLabelValues methods). It is possible to curry a curried // vector, but only with labels not yet used for currying before. // // The metrics contained in the SummaryVec are shared between the curried and // uncurried vectors. They are just accessed differently. Curried and uncurried // vectors behave identically in terms of collection. Only one must be // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) { vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &SummaryVec{vec}, err } return nil, err } // MustCurryWith works as CurryWith but panics where CurryWith would have // returned an error. func (v *SummaryVec) MustCurryWith(labels Labels) ObserverVec { vec, err := v.CurryWith(labels) if err != nil { panic(err) } return vec } type constSummary struct { desc *Desc count uint64 sum float64 quantiles map[float64]float64 labelPairs []*dto.LabelPair createdTs *timestamppb.Timestamp } func (s *constSummary) Desc() *Desc { return s.desc } func (s *constSummary) Write(out *dto.Metric) error { sum := &dto.Summary{ CreatedTimestamp: s.createdTs, } qs := make([]*dto.Quantile, 0, len(s.quantiles)) sum.SampleCount = proto.Uint64(s.count) sum.SampleSum = proto.Float64(s.sum) for rank, q := range s.quantiles { qs = append(qs, &dto.Quantile{ Quantile: proto.Float64(rank), Value: proto.Float64(q), }) } if len(qs) > 0 { sort.Sort(quantSort(qs)) } sum.Quantile = qs out.Summary = sum out.Label = s.labelPairs return nil } // NewConstSummary returns a metric representing a Prometheus summary with fixed // values for the count, sum, and quantiles. As those parameters cannot be // changed, the returned value does not implement the Summary interface (but // only the Metric interface). Users of this package will not have much use for // it in regular operations. However, when implementing custom Collectors, it is // useful as a throw-away metric that is generated on the fly to send it to // Prometheus in the Collect method. // // quantiles maps ranks to quantile values. For example, a median latency of // 0.23s and a 99th percentile latency of 0.56s would be expressed as: // // map[float64]float64{0.5: 0.23, 0.99: 0.56} // // NewConstSummary returns an error if the length of labelValues is not // consistent with the variable labels in Desc or if Desc is invalid. func NewConstSummary( desc *Desc, count uint64, sum float64, quantiles map[float64]float64, labelValues ...string, ) (Metric, error) { if desc.err != nil { return nil, desc.err } if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constSummary{ desc: desc, count: count, sum: sum, quantiles: quantiles, labelPairs: MakeLabelPairs(desc, labelValues), }, nil } // MustNewConstSummary is a version of NewConstSummary that panics where // NewConstMetric would have returned an error. func MustNewConstSummary( desc *Desc, count uint64, sum float64, quantiles map[float64]float64, labelValues ...string, ) Metric { m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) if err != nil { panic(err) } return m } client_golang-1.19.1/prometheus/summary_test.go000066400000000000000000000263071461713521000216760ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "math" "math/rand" "sort" "sync" "testing" "testing/quick" "time" dto "github.com/prometheus/client_model/go" ) func TestSummaryWithDefaultObjectives(t *testing.T) { now := time.Now() reg := NewRegistry() summaryWithDefaultObjectives := NewSummary(SummaryOpts{ Name: "default_objectives", Help: "Test help.", now: func() time.Time { return now }, }) if err := reg.Register(summaryWithDefaultObjectives); err != nil { t.Error(err) } m := &dto.Metric{} if err := summaryWithDefaultObjectives.Write(m); err != nil { t.Error(err) } if len(m.GetSummary().Quantile) != 0 { t.Error("expected no objectives in summary") } if !m.Summary.CreatedTimestamp.AsTime().Equal(now) { t.Errorf("expected created timestamp %s, got %s", now, m.Summary.CreatedTimestamp.AsTime()) } } func TestSummaryWithoutObjectives(t *testing.T) { reg := NewRegistry() summaryWithEmptyObjectives := NewSummary(SummaryOpts{ Name: "empty_objectives", Help: "Test help.", Objectives: map[float64]float64{}, }) if err := reg.Register(summaryWithEmptyObjectives); err != nil { t.Error(err) } summaryWithEmptyObjectives.Observe(3) summaryWithEmptyObjectives.Observe(0.14) m := &dto.Metric{} if err := summaryWithEmptyObjectives.Write(m); err != nil { t.Error(err) } if got, want := m.GetSummary().GetSampleSum(), 3.14; got != want { t.Errorf("got sample sum %f, want %f", got, want) } if got, want := m.GetSummary().GetSampleCount(), uint64(2); got != want { t.Errorf("got sample sum %d, want %d", got, want) } if len(m.GetSummary().Quantile) != 0 { t.Error("expected no objectives in summary") } } func TestSummaryWithQuantileLabel(t *testing.T) { defer func() { if r := recover(); r == nil { t.Error("Attempt to create Summary with 'quantile' label did not panic.") } }() _ = NewSummary(SummaryOpts{ Name: "test_summary", Help: "less", ConstLabels: Labels{"quantile": "test"}, }) } func TestSummaryVecWithQuantileLabel(t *testing.T) { defer func() { if r := recover(); r == nil { t.Error("Attempt to create SummaryVec with 'quantile' label did not panic.") } }() _ = NewSummaryVec(SummaryOpts{ Name: "test_summary", Help: "less", }, []string{"quantile"}) } func benchmarkSummaryObserve(w int, b *testing.B) { b.StopTimer() wg := new(sync.WaitGroup) wg.Add(w) g := new(sync.WaitGroup) g.Add(1) s := NewSummary(SummaryOpts{}) for i := 0; i < w; i++ { go func() { g.Wait() for i := 0; i < b.N; i++ { s.Observe(float64(i)) } wg.Done() }() } b.StartTimer() g.Done() wg.Wait() } func BenchmarkSummaryObserve1(b *testing.B) { benchmarkSummaryObserve(1, b) } func BenchmarkSummaryObserve2(b *testing.B) { benchmarkSummaryObserve(2, b) } func BenchmarkSummaryObserve4(b *testing.B) { benchmarkSummaryObserve(4, b) } func BenchmarkSummaryObserve8(b *testing.B) { benchmarkSummaryObserve(8, b) } func benchmarkSummaryWrite(w int, b *testing.B) { b.StopTimer() wg := new(sync.WaitGroup) wg.Add(w) g := new(sync.WaitGroup) g.Add(1) s := NewSummary(SummaryOpts{}) for i := 0; i < 1000000; i++ { s.Observe(float64(i)) } for j := 0; j < w; j++ { outs := make([]dto.Metric, b.N) go func(o []dto.Metric) { g.Wait() for i := 0; i < b.N; i++ { s.Write(&o[i]) } wg.Done() }(outs) } b.StartTimer() g.Done() wg.Wait() } func BenchmarkSummaryWrite1(b *testing.B) { benchmarkSummaryWrite(1, b) } func BenchmarkSummaryWrite2(b *testing.B) { benchmarkSummaryWrite(2, b) } func BenchmarkSummaryWrite4(b *testing.B) { benchmarkSummaryWrite(4, b) } func BenchmarkSummaryWrite8(b *testing.B) { benchmarkSummaryWrite(8, b) } func TestSummaryConcurrency(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") } rand.New(rand.NewSource(42)) objMap := map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} it := func(n uint32) bool { mutations := int(n%1e4 + 1e4) concLevel := int(n%5 + 1) total := mutations * concLevel var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) sum := NewSummary(SummaryOpts{ Name: "test_summary", Help: "helpless", Objectives: objMap, }) allVars := make([]float64, total) var sampleSum float64 for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) for j := 0; j < mutations; j++ { v := rand.NormFloat64() vals[j] = v allVars[i*mutations+j] = v sampleSum += v } go func(vals []float64) { start.Wait() for _, v := range vals { sum.Observe(v) } end.Done() }(vals) } sort.Float64s(allVars) start.Done() end.Wait() m := &dto.Metric{} sum.Write(m) if got, want := int(*m.Summary.SampleCount), total; got != want { t.Errorf("got sample count %d, want %d", got, want) } if got, want := *m.Summary.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { t.Errorf("got sample sum %f, want %f", got, want) } objSlice := make([]float64, 0, len(objMap)) for qu := range objMap { objSlice = append(objSlice, qu) } sort.Float64s(objSlice) for i, wantQ := range objSlice { ε := objMap[wantQ] gotQ := *m.Summary.Quantile[i].Quantile gotV := *m.Summary.Quantile[i].Value min, max := getBounds(allVars, wantQ, ε) if gotQ != wantQ { t.Errorf("got quantile %f, want %f", gotQ, wantQ) } if gotV < min || gotV > max { t.Errorf("got %f for quantile %f, want [%f,%f]", gotV, gotQ, min, max) } } return true } if err := quick.Check(it, nil); err != nil { t.Error(err) } } func TestSummaryVecConcurrency(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") } rand.New(rand.NewSource(42)) objMap := map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} objSlice := make([]float64, 0, len(objMap)) for qu := range objMap { objSlice = append(objSlice, qu) } sort.Float64s(objSlice) it := func(n uint32) bool { mutations := int(n%1e4 + 1e4) concLevel := int(n%7 + 1) vecLength := int(n%3 + 1) var start, end sync.WaitGroup start.Add(1) end.Add(concLevel) sum := NewSummaryVec( SummaryOpts{ Name: "test_summary", Help: "helpless", Objectives: objMap, }, []string{"label"}, ) allVars := make([][]float64, vecLength) sampleSums := make([]float64, vecLength) for i := 0; i < concLevel; i++ { vals := make([]float64, mutations) picks := make([]int, mutations) for j := 0; j < mutations; j++ { v := rand.NormFloat64() vals[j] = v pick := rand.Intn(vecLength) picks[j] = pick allVars[pick] = append(allVars[pick], v) sampleSums[pick] += v } go func(vals []float64) { start.Wait() for i, v := range vals { sum.WithLabelValues(string('A' + rune(picks[i]))).Observe(v) } end.Done() }(vals) } for _, vars := range allVars { sort.Float64s(vars) } start.Done() end.Wait() for i := 0; i < vecLength; i++ { m := &dto.Metric{} s := sum.WithLabelValues(string('A' + rune(i))) s.(Summary).Write(m) if got, want := int(*m.Summary.SampleCount), len(allVars[i]); got != want { t.Errorf("got sample count %d for label %c, want %d", got, 'A'+i, want) } if got, want := *m.Summary.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { t.Errorf("got sample sum %f for label %c, want %f", got, 'A'+i, want) } for j, wantQ := range objSlice { ε := objMap[wantQ] gotQ := *m.Summary.Quantile[j].Quantile gotV := *m.Summary.Quantile[j].Value min, max := getBounds(allVars[i], wantQ, ε) if gotQ != wantQ { t.Errorf("got quantile %f for label %c, want %f", gotQ, 'A'+i, wantQ) } if gotV < min || gotV > max { t.Errorf("got %f for quantile %f for label %c, want [%f,%f]", gotV, gotQ, 'A'+i, min, max) } } } return true } if err := quick.Check(it, nil); err != nil { t.Error(err) } } func TestSummaryDecay(t *testing.T) { if testing.Short() { t.Skip("Skipping test in short mode.") // More because it depends on timing than because it is particularly long... } sum := NewSummary(SummaryOpts{ Name: "test_summary", Help: "helpless", MaxAge: 100 * time.Millisecond, Objectives: map[float64]float64{0.1: 0.001}, AgeBuckets: 10, }) m := &dto.Metric{} i := 0 tick := time.NewTicker(time.Millisecond) for range tick.C { i++ sum.Observe(float64(i)) if i%10 == 0 { sum.Write(m) if got, want := *m.Summary.Quantile[0].Value, math.Max(float64(i)/10, float64(i-90)); math.Abs(got-want) > 20 { t.Errorf("%d. got %f, want %f", i, got, want) } m.Reset() } if i >= 1000 { break } } tick.Stop() // Wait for MaxAge without observations and make sure quantiles are NaN. time.Sleep(100 * time.Millisecond) sum.Write(m) if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) { t.Errorf("got %f, want NaN after expiration", got) } } func getBounds(vars []float64, q, ε float64) (min, max float64) { // TODO(beorn7): This currently tolerates an error of up to 2*ε. The // error must be at most ε, but for some reason, it's sometimes slightly // higher. That's a bug. n := float64(len(vars)) lower := int((q - 2*ε) * n) upper := int(math.Ceil((q + 2*ε) * n)) min = vars[0] if lower > 1 { min = vars[lower-1] } max = vars[len(vars)-1] if upper < len(vars) { max = vars[upper-1] } return } func TestSummaryVecCreatedTimestampWithDeletes(t *testing.T) { for _, tcase := range []struct { desc string objectives map[float64]float64 }{ {desc: "summary with objectives", objectives: map[float64]float64{1.0: 1.0}}, {desc: "no objectives summary", objectives: nil}, } { now := time.Now() t.Run(tcase.desc, func(t *testing.T) { summaryVec := NewSummaryVec(SummaryOpts{ Name: "test", Help: "test help", Objectives: tcase.objectives, now: func() time.Time { return now }, }, []string{"label"}) // First use of "With" should populate CT. summaryVec.WithLabelValues("1") expected := map[string]time.Time{"1": now} now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, summaryVec.MetricVec, dto.MetricType_SUMMARY, expected) // Two more labels at different times. summaryVec.WithLabelValues("2") expected["2"] = now now = now.Add(1 * time.Hour) summaryVec.WithLabelValues("3") expected["3"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, summaryVec.MetricVec, dto.MetricType_SUMMARY, expected) // Recreate metric instance should reset created timestamp to now. summaryVec.DeleteLabelValues("1") summaryVec.WithLabelValues("1") expected["1"] = now now = now.Add(1 * time.Hour) expectCTsForMetricVecValues(t, summaryVec.MetricVec, dto.MetricType_SUMMARY, expected) }) } } client_golang-1.19.1/prometheus/testutil/000077500000000000000000000000001461713521000204605ustar00rootroot00000000000000client_golang-1.19.1/prometheus/testutil/lint.go000066400000000000000000000033231461713521000217560ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package testutil import ( "fmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/testutil/promlint" ) // CollectAndLint registers the provided Collector with a newly created pedantic // Registry. It then calls GatherAndLint with that Registry and with the // provided metricNames. func CollectAndLint(c prometheus.Collector, metricNames ...string) ([]promlint.Problem, error) { reg := prometheus.NewPedanticRegistry() if err := reg.Register(c); err != nil { return nil, fmt.Errorf("registering collector failed: %w", err) } return GatherAndLint(reg, metricNames...) } // GatherAndLint gathers all metrics from the provided Gatherer and checks them // with the linter in the promlint package. If any metricNames are provided, // only metrics with those names are checked. func GatherAndLint(g prometheus.Gatherer, metricNames ...string) ([]promlint.Problem, error) { got, err := g.Gather() if err != nil { return nil, fmt.Errorf("gathering metrics failed: %w", err) } if metricNames != nil { got = filterMetrics(got, metricNames) } return promlint.NewWithMetricFamilies(got).Lint() } client_golang-1.19.1/prometheus/testutil/lint_test.go000066400000000000000000000037001461713521000230140ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package testutil import ( "testing" "github.com/prometheus/client_golang/prometheus" ) func TestCollectAndLintGood(t *testing.T) { cnt := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", ConstLabels: prometheus.Labels{ "label1": "value1", }, }, []string{"foo"}, ) cnt.WithLabelValues("bar") cnt.WithLabelValues("baz") problems, err := CollectAndLint(cnt) if err != nil { t.Error("Unexpected error:", err) } if len(problems) > 0 { t.Error("Unexpected lint problems:", problems) } } func TestCollectAndLintBad(t *testing.T) { cnt := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "someThing_ms", Help: "A value that represents a counter.", ConstLabels: prometheus.Labels{ "label1": "value1", }, }, []string{"fooBar"}, ) cnt.WithLabelValues("bar") cnt.WithLabelValues("baz") problems, err := CollectAndLint(cnt) if err != nil { t.Error("Unexpected error:", err) } if len(problems) < 5 { // The exact nature of the lint problems found is tested within // the promlint package itself. Here we only want to make sure // that the collector successfully hits the linter and that at // least the five problems that the linter could recognize at // the time of writing this test are flagged. t.Error("Not enough lint problems found.") } } client_golang-1.19.1/prometheus/testutil/promlint/000077500000000000000000000000001461713521000223245ustar00rootroot00000000000000client_golang-1.19.1/prometheus/testutil/promlint/problem.go000066400000000000000000000020301461713521000243060ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promlint import dto "github.com/prometheus/client_model/go" // A Problem is an issue detected by a linter. type Problem struct { // The name of the metric indicated by this Problem. Metric string // A description of the issue for this Problem. Text string } // newProblem is helper function to create a Problem. func newProblem(mf *dto.MetricFamily, text string) Problem { return Problem{ Metric: mf.GetName(), Text: text, } } client_golang-1.19.1/prometheus/testutil/promlint/promlint.go000066400000000000000000000065701461713521000245270ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package promlint provides a linter for Prometheus metrics. package promlint import ( "errors" "io" "sort" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" ) // A Linter is a Prometheus metrics linter. It identifies issues with metric // names, types, and metadata, and reports them to the caller. type Linter struct { // The linter will read metrics in the Prometheus text format from r and // then lint it, _and_ it will lint the metrics provided directly as // MetricFamily proto messages in mfs. Note, however, that the current // constructor functions New and NewWithMetricFamilies only ever set one // of them. r io.Reader mfs []*dto.MetricFamily customValidations []Validation } // New creates a new Linter that reads an input stream of Prometheus metrics in // the Prometheus text exposition format. func New(r io.Reader) *Linter { return &Linter{ r: r, } } // NewWithMetricFamilies creates a new Linter that reads from a slice of // MetricFamily protobuf messages. func NewWithMetricFamilies(mfs []*dto.MetricFamily) *Linter { return &Linter{ mfs: mfs, } } // AddCustomValidations adds custom validations to the linter. func (l *Linter) AddCustomValidations(vs ...Validation) { if l.customValidations == nil { l.customValidations = make([]Validation, 0, len(vs)) } l.customValidations = append(l.customValidations, vs...) } // Lint performs a linting pass, returning a slice of Problems indicating any // issues found in the metrics stream. The slice is sorted by metric name // and issue description. func (l *Linter) Lint() ([]Problem, error) { var problems []Problem if l.r != nil { d := expfmt.NewDecoder(l.r, expfmt.NewFormat(expfmt.TypeTextPlain)) mf := &dto.MetricFamily{} for { if err := d.Decode(mf); err != nil { if errors.Is(err, io.EOF) { break } return nil, err } problems = append(problems, l.lint(mf)...) } } for _, mf := range l.mfs { problems = append(problems, l.lint(mf)...) } // Ensure deterministic output. sort.SliceStable(problems, func(i, j int) bool { if problems[i].Metric == problems[j].Metric { return problems[i].Text < problems[j].Text } return problems[i].Metric < problems[j].Metric }) return problems, nil } // lint is the entry point for linting a single metric. func (l *Linter) lint(mf *dto.MetricFamily) []Problem { var problems []Problem for _, fn := range defaultValidations { errs := fn(mf) for _, err := range errs { problems = append(problems, newProblem(mf, err.Error())) } } if l.customValidations != nil { for _, fn := range l.customValidations { errs := fn(mf) for _, err := range errs { problems = append(problems, newProblem(mf, err.Error())) } } } // TODO(mdlayher): lint rules for specific metrics types. return problems } client_golang-1.19.1/prometheus/testutil/promlint/promlint_test.go000066400000000000000000000446171461713521000255720ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promlint_test import ( "fmt" "reflect" "strings" "testing" dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus/testutil/promlint" ) type test struct { name string in string problems []promlint.Problem } func TestLintNoHelpText(t *testing.T) { const msg = "no help text" tests := []test{ { name: "no help", in: ` # TYPE go_goroutines gauge go_goroutines 24 `, problems: []promlint.Problem{{ Metric: "go_goroutines", Text: msg, }}, }, { name: "empty help", in: ` # HELP go_goroutines # TYPE go_goroutines gauge go_goroutines 24 `, problems: []promlint.Problem{{ Metric: "go_goroutines", Text: msg, }}, }, { name: "no help and empty help", in: ` # HELP go_goroutines # TYPE go_goroutines gauge go_goroutines 24 # TYPE go_threads gauge go_threads 10 `, problems: []promlint.Problem{ { Metric: "go_goroutines", Text: msg, }, { Metric: "go_threads", Text: msg, }, }, }, { name: "OK", in: ` # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 24 `, }, } runTests(t, tests) } func TestLintMetricUnits(t *testing.T) { tests := []struct { name string in string problems []promlint.Problem }{ // good cases. { name: "amperes", in: ` # HELP x_amperes Test metric. # TYPE x_amperes untyped x_amperes 10 `, }, { name: "bytes", in: ` # HELP x_bytes Test metric. # TYPE x_bytes untyped x_bytes 10 `, }, { name: "grams", in: ` # HELP x_grams Test metric. # TYPE x_grams untyped x_grams 10 `, }, { name: "celsius", in: ` # HELP x_celsius Test metric. # TYPE x_celsius untyped x_celsius 10 `, }, { name: "meters", in: ` # HELP x_meters Test metric. # TYPE x_meters untyped x_meters 10 `, }, { name: "metres", in: ` # HELP x_metres Test metric. # TYPE x_metres untyped x_metres 10 `, }, { name: "moles", in: ` # HELP x_moles Test metric. # TYPE x_moles untyped x_moles 10 `, }, { name: "seconds", in: ` # HELP x_seconds Test metric. # TYPE x_seconds untyped x_seconds 10 `, }, { name: "joules", in: ` # HELP x_joules Test metric. # TYPE x_joules untyped x_joules 10 `, }, { name: "kelvin", in: ` # HELP x_kelvin Test metric. # TYPE x_kelvin untyped x_kelvin 10 `, }, // bad cases. { name: "milliamperes", in: ` # HELP x_milliamperes Test metric. # TYPE x_milliamperes untyped x_milliamperes 10 `, problems: []promlint.Problem{{ Metric: "x_milliamperes", Text: `use base unit "amperes" instead of "milliamperes"`, }}, }, { name: "gigabytes", in: ` # HELP x_gigabytes Test metric. # TYPE x_gigabytes untyped x_gigabytes 10 `, problems: []promlint.Problem{{ Metric: "x_gigabytes", Text: `use base unit "bytes" instead of "gigabytes"`, }}, }, { name: "kilograms", in: ` # HELP x_kilograms Test metric. # TYPE x_kilograms untyped x_kilograms 10 `, problems: []promlint.Problem{{ Metric: "x_kilograms", Text: `use base unit "grams" instead of "kilograms"`, }}, }, { name: "nanocelsius", in: ` # HELP x_nanocelsius Test metric. # TYPE x_nanocelsius untyped x_nanocelsius 10 `, problems: []promlint.Problem{{ Metric: "x_nanocelsius", Text: `use base unit "celsius" instead of "nanocelsius"`, }}, }, { name: "kilometers", in: ` # HELP x_kilometers Test metric. # TYPE x_kilometers untyped x_kilometers 10 `, problems: []promlint.Problem{{ Metric: "x_kilometers", Text: `use base unit "meters" instead of "kilometers"`, }}, }, { name: "picometers", in: ` # HELP x_picometers Test metric. # TYPE x_picometers untyped x_picometers 10 `, problems: []promlint.Problem{{ Metric: "x_picometers", Text: `use base unit "meters" instead of "picometers"`, }}, }, { name: "microseconds", in: ` # HELP x_microseconds Test metric. # TYPE x_microseconds untyped x_microseconds 10 `, problems: []promlint.Problem{{ Metric: "x_microseconds", Text: `use base unit "seconds" instead of "microseconds"`, }}, }, { name: "minutes", in: ` # HELP x_minutes Test metric. # TYPE x_minutes untyped x_minutes 10 `, problems: []promlint.Problem{{ Metric: "x_minutes", Text: `use base unit "seconds" instead of "minutes"`, }}, }, { name: "hours", in: ` # HELP x_hours Test metric. # TYPE x_hours untyped x_hours 10 `, problems: []promlint.Problem{{ Metric: "x_hours", Text: `use base unit "seconds" instead of "hours"`, }}, }, { name: "days", in: ` # HELP x_days Test metric. # TYPE x_days untyped x_days 10 `, problems: []promlint.Problem{{ Metric: "x_days", Text: `use base unit "seconds" instead of "days"`, }}, }, { name: "kelvins", in: ` # HELP x_kelvins Test metric. # TYPE x_kelvins untyped x_kelvins 10 `, problems: []promlint.Problem{{ Metric: "x_kelvins", Text: `use base unit "kelvin" instead of "kelvins"`, }}, }, { name: "fahrenheit", in: ` # HELP thermometers_fahrenheit Test metric. # TYPE thermometers_fahrenheit untyped thermometers_fahrenheit 10 `, problems: []promlint.Problem{{ Metric: "thermometers_fahrenheit", Text: `use base unit "celsius" instead of "fahrenheit"`, }}, }, { name: "rankine", in: ` # HELP thermometers_rankine Test metric. # TYPE thermometers_rankine untyped thermometers_rankine 10 `, problems: []promlint.Problem{{ Metric: "thermometers_rankine", Text: `use base unit "celsius" instead of "rankine"`, }}, }, { name: "inches", in: ` # HELP x_inches Test metric. # TYPE x_inches untyped x_inches 10 `, problems: []promlint.Problem{{ Metric: "x_inches", Text: `use base unit "meters" instead of "inches"`, }}, }, { name: "yards", in: ` # HELP x_yards Test metric. # TYPE x_yards untyped x_yards 10 `, problems: []promlint.Problem{{ Metric: "x_yards", Text: `use base unit "meters" instead of "yards"`, }}, }, { name: "miles", in: ` # HELP x_miles Test metric. # TYPE x_miles untyped x_miles 10 `, problems: []promlint.Problem{{ Metric: "x_miles", Text: `use base unit "meters" instead of "miles"`, }}, }, { name: "bits", in: ` # HELP x_bits Test metric. # TYPE x_bits untyped x_bits 10 `, problems: []promlint.Problem{{ Metric: "x_bits", Text: `use base unit "bytes" instead of "bits"`, }}, }, { name: "calories", in: ` # HELP x_calories Test metric. # TYPE x_calories untyped x_calories 10 `, problems: []promlint.Problem{{ Metric: "x_calories", Text: `use base unit "joules" instead of "calories"`, }}, }, { name: "pounds", in: ` # HELP x_pounds Test metric. # TYPE x_pounds untyped x_pounds 10 `, problems: []promlint.Problem{{ Metric: "x_pounds", Text: `use base unit "grams" instead of "pounds"`, }}, }, { name: "ounces", in: ` # HELP x_ounces Test metric. # TYPE x_ounces untyped x_ounces 10 `, problems: []promlint.Problem{{ Metric: "x_ounces", Text: `use base unit "grams" instead of "ounces"`, }}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { l := promlint.New(strings.NewReader(tt.in)) problems, err := l.Lint() if err != nil { t.Fatalf("unexpected error: %v", err) } if want, got := tt.problems, problems; !reflect.DeepEqual(want, got) { t.Fatalf("unexpected problems:\n- want: %v\n- got: %v", want, got) } }) } } func TestLintCounter(t *testing.T) { tests := []test{ { name: "counter without _total suffix", in: ` # HELP x_bytes Test metric. # TYPE x_bytes counter x_bytes 10 `, problems: []promlint.Problem{{ Metric: "x_bytes", Text: `counter metrics should have "_total" suffix`, }}, }, { name: "gauge with _total suffix", in: ` # HELP x_bytes_total Test metric. # TYPE x_bytes_total gauge x_bytes_total 10 `, problems: []promlint.Problem{{ Metric: "x_bytes_total", Text: `non-counter metrics should not have "_total" suffix`, }}, }, { name: "counter with _total suffix", in: ` # HELP x_bytes_total Test metric. # TYPE x_bytes_total counter x_bytes_total 10 `, }, { name: "gauge without _total suffix", in: ` # HELP x_bytes Test metric. # TYPE x_bytes gauge x_bytes 10 `, }, { name: "untyped with _total suffix", in: ` # HELP x_bytes_total Test metric. # TYPE x_bytes_total untyped x_bytes_total 10 `, }, { name: "untyped without _total suffix", in: ` # HELP x_bytes Test metric. # TYPE x_bytes untyped x_bytes 10 `, }, } runTests(t, tests) } func TestLintHistogramSummaryReserved(t *testing.T) { tests := []test{ { name: "gauge with _bucket suffix", in: ` # HELP x_bytes_bucket Test metric. # TYPE x_bytes_bucket gauge x_bytes_bucket 10 `, problems: []promlint.Problem{{ Metric: "x_bytes_bucket", Text: `non-histogram metrics should not have "_bucket" suffix`, }}, }, { name: "gauge with _count suffix", in: ` # HELP x_bytes_count Test metric. # TYPE x_bytes_count gauge x_bytes_count 10 `, problems: []promlint.Problem{{ Metric: "x_bytes_count", Text: `non-histogram and non-summary metrics should not have "_count" suffix`, }}, }, { name: "gauge with _sum suffix", in: ` # HELP x_bytes_sum Test metric. # TYPE x_bytes_sum gauge x_bytes_sum 10 `, problems: []promlint.Problem{{ Metric: "x_bytes_sum", Text: `non-histogram and non-summary metrics should not have "_sum" suffix`, }}, }, { name: "gauge with le label", in: ` # HELP x_bytes Test metric. # TYPE x_bytes gauge x_bytes{le="1"} 10 `, problems: []promlint.Problem{{ Metric: "x_bytes", Text: `non-histogram metrics should not have "le" label`, }}, }, { name: "gauge with quantile label", in: ` # HELP x_bytes Test metric. # TYPE x_bytes gauge x_bytes{quantile="1"} 10 `, problems: []promlint.Problem{{ Metric: "x_bytes", Text: `non-summary metrics should not have "quantile" label`, }}, }, { name: "histogram with quantile label", in: ` # HELP tsdb_compaction_duration Duration of compaction runs. # TYPE tsdb_compaction_duration histogram tsdb_compaction_duration_bucket{le="0.005",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.01",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.025",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.05",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.1",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.25",quantile="0.01"} 0 tsdb_compaction_duration_bucket{le="0.5",quantile="0.01"} 57 tsdb_compaction_duration_bucket{le="1",quantile="0.01"} 68 tsdb_compaction_duration_bucket{le="2.5",quantile="0.01"} 69 tsdb_compaction_duration_bucket{le="5",quantile="0.01"} 69 tsdb_compaction_duration_bucket{le="10",quantile="0.01"} 69 tsdb_compaction_duration_bucket{le="+Inf",quantile="0.01"} 69 tsdb_compaction_duration_sum 28.740810936000006 tsdb_compaction_duration_count 69 `, problems: []promlint.Problem{{ Metric: "tsdb_compaction_duration", Text: `non-summary metrics should not have "quantile" label`, }}, }, { name: "summary with le label", in: ` # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0",le="0.01"} 4.2365e-05 go_gc_duration_seconds{quantile="0.25",le="0.01"} 8.1492e-05 go_gc_duration_seconds{quantile="0.5",le="0.01"} 0.000100656 go_gc_duration_seconds{quantile="0.75",le="0.01"} 0.000113913 go_gc_duration_seconds{quantile="1",le="0.01"} 0.021754305 go_gc_duration_seconds_sum 1.769429004 go_gc_duration_seconds_count 5962 `, problems: []promlint.Problem{{ Metric: "go_gc_duration_seconds", Text: `non-histogram metrics should not have "le" label`, }}, }, { name: "histogram OK", in: ` # HELP tsdb_compaction_duration Duration of compaction runs. # TYPE tsdb_compaction_duration histogram tsdb_compaction_duration_bucket{le="0.005"} 0 tsdb_compaction_duration_bucket{le="0.01"} 0 tsdb_compaction_duration_bucket{le="0.025"} 0 tsdb_compaction_duration_bucket{le="0.05"} 0 tsdb_compaction_duration_bucket{le="0.1"} 0 tsdb_compaction_duration_bucket{le="0.25"} 0 tsdb_compaction_duration_bucket{le="0.5"} 57 tsdb_compaction_duration_bucket{le="1"} 68 tsdb_compaction_duration_bucket{le="2.5"} 69 tsdb_compaction_duration_bucket{le="5"} 69 tsdb_compaction_duration_bucket{le="10"} 69 tsdb_compaction_duration_bucket{le="+Inf"} 69 tsdb_compaction_duration_sum 28.740810936000006 tsdb_compaction_duration_count 69 `, }, { name: "summary OK", in: ` # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 4.2365e-05 go_gc_duration_seconds{quantile="0.25"} 8.1492e-05 go_gc_duration_seconds{quantile="0.5"} 0.000100656 go_gc_duration_seconds{quantile="0.75"} 0.000113913 go_gc_duration_seconds{quantile="1"} 0.021754305 go_gc_duration_seconds_sum 1.769429004 go_gc_duration_seconds_count 5962 `, }, } runTests(t, tests) } func TestLintMetricTypeInName(t *testing.T) { genTest := func(n, t, err string, problems ...promlint.Problem) test { return test{ name: fmt.Sprintf("%s with _%s suffix", t, t), in: fmt.Sprintf(` # HELP %s Test metric. # TYPE %s %s %s 10 `, n, n, t, n), problems: append(problems, promlint.Problem{ Metric: n, Text: fmt.Sprintf(`metric name should not include type '%s'`, err), }), } } twoProbTest := genTest("http_requests_counter", "counter", "counter", promlint.Problem{ Metric: "http_requests_counter", Text: `counter metrics should have "_total" suffix`, }) tests := []test{ twoProbTest, genTest("instance_memory_limit_bytes_gauge", "gauge", "gauge"), genTest("request_duration_seconds_summary", "summary", "summary"), genTest("request_duration_seconds_summary", "histogram", "summary"), genTest("request_duration_seconds_histogram", "histogram", "histogram"), genTest("request_duration_seconds_HISTOGRAM", "histogram", "histogram"), genTest("instance_memory_limit_gauge_bytes", "gauge", "gauge"), } runTests(t, tests) } func TestLintReservedChars(t *testing.T) { tests := []test{ { name: "request_duration::_seconds", in: ` # HELP request_duration::_seconds Test metric. # TYPE request_duration::_seconds histogram request_duration::_seconds 10 `, problems: []promlint.Problem{ { Metric: "request_duration::_seconds", Text: "metric names should not contain ':'", }, }, }, } runTests(t, tests) } func TestLintCamelCase(t *testing.T) { tests := []test{ { name: "requestDuration_seconds", in: ` # HELP requestDuration_seconds Test metric. # TYPE requestDuration_seconds histogram requestDuration_seconds 10 `, problems: []promlint.Problem{ { Metric: "requestDuration_seconds", Text: "metric names should be written in 'snake_case' not 'camelCase'", }, }, }, { name: "request_duration_seconds", in: ` # HELP request_duration_seconds Test metric. # TYPE request_duration_seconds histogram request_duration_seconds{httpService="foo"} 10 `, problems: []promlint.Problem{ { Metric: "request_duration_seconds", Text: "label names should be written in 'snake_case' not 'camelCase'", }, }, }, } runTests(t, tests) } func TestLintUnitAbbreviations(t *testing.T) { genTest := func(n string) test { return test{ name: fmt.Sprintf("%s with abbreviated unit", n), in: fmt.Sprintf(` # HELP %s Test metric. # TYPE %s gauge %s 10 `, n, n, n), problems: []promlint.Problem{ { Metric: n, Text: "metric names should not contain abbreviated units", }, }, } } tests := []test{ genTest("instance_memory_limit_b"), genTest("instance_memory_limit_kb"), genTest("instance_memory_limit_mb"), genTest("instance_memory_limit_MB"), genTest("instance_memory_limit_gb"), genTest("instance_memory_limit_tb"), genTest("instance_memory_limit_pb"), genTest("request_duration_s"), genTest("request_duration_ms"), genTest("request_duration_us"), genTest("request_duration_ns"), genTest("request_duration_sec"), genTest("request_sec_duration"), genTest("request_duration_m"), genTest("request_duration_h"), genTest("request_duration_d"), } runTests(t, tests) } func runTests(t *testing.T, tests []test) { t.Helper() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { l := promlint.New(strings.NewReader(tt.in)) problems, err := l.Lint() if err != nil { t.Fatalf("unexpected error: %v", err) } if want, got := tt.problems, problems; !reflect.DeepEqual(want, got) { t.Fatalf("unexpected problems:\n- want: %v\n- got: %v", want, got) } }) } } func TestCustomValidations(t *testing.T) { lintAndVerify := func(l *promlint.Linter, cv test) { problems, err := l.Lint() if err != nil { t.Fatalf("unexpected error: %v", err) } if want, got := cv.problems, problems; !reflect.DeepEqual(want, got) { t.Fatalf("unexpected problems:\n- want: %v\n- got: %v", want, got) } } prob := []promlint.Problem{ { Metric: "mc_something_total", Text: "expected metric name to start with 'memcached_'", }, } cv := test{ name: "metric without necessary prefix", in: ` # HELP mc_something_total Test metric. # TYPE mc_something_total counter mc_something_total 10 `, problems: nil, } prefixValidation := func(mf *dto.MetricFamily) []error { if !strings.HasPrefix(mf.GetName(), "memcached_") { return []error{fmt.Errorf("expected metric name to start with 'memcached_'")} } return nil } t.Helper() t.Run(cv.name, func(t *testing.T) { // no problems l1 := promlint.New(strings.NewReader(cv.in)) lintAndVerify(l1, cv) }) t.Run(cv.name, func(t *testing.T) { // prefix problems l2 := promlint.New(strings.NewReader(cv.in)) l2.AddCustomValidations(prefixValidation) cv.problems = prob lintAndVerify(l2, cv) }) } client_golang-1.19.1/prometheus/testutil/promlint/validation.go000066400000000000000000000021151461713521000250040ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package promlint import ( dto "github.com/prometheus/client_model/go" "github.com/prometheus/client_golang/prometheus/testutil/promlint/validations" ) type Validation = func(mf *dto.MetricFamily) []error var defaultValidations = []Validation{ validations.LintHelp, validations.LintMetricUnits, validations.LintCounter, validations.LintHistogramSummaryReserved, validations.LintMetricTypeInName, validations.LintReservedChars, validations.LintCamelCase, validations.LintUnitAbbreviations, } client_golang-1.19.1/prometheus/testutil/promlint/validations/000077500000000000000000000000001461713521000246415ustar00rootroot00000000000000client_golang-1.19.1/prometheus/testutil/promlint/validations/counter_validations.go000066400000000000000000000025151461713521000312470ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validations import ( "errors" "strings" dto "github.com/prometheus/client_model/go" ) // LintCounter detects issues specific to counters, as well as patterns that should // only be used with counters. func LintCounter(mf *dto.MetricFamily) []error { var problems []error isCounter := mf.GetType() == dto.MetricType_COUNTER isUntyped := mf.GetType() == dto.MetricType_UNTYPED hasTotalSuffix := strings.HasSuffix(mf.GetName(), "_total") switch { case isCounter && !hasTotalSuffix: problems = append(problems, errors.New(`counter metrics should have "_total" suffix`)) case !isUntyped && !isCounter && hasTotalSuffix: problems = append(problems, errors.New(`non-counter metrics should not have "_total" suffix`)) } return problems } client_golang-1.19.1/prometheus/testutil/promlint/validations/generic_name_validations.go000066400000000000000000000056371461713521000322140ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validations import ( "errors" "fmt" "regexp" "strings" dto "github.com/prometheus/client_model/go" ) var camelCase = regexp.MustCompile(`[a-z][A-Z]`) // LintMetricUnits detects issues with metric unit names. func LintMetricUnits(mf *dto.MetricFamily) []error { var problems []error unit, base, ok := metricUnits(*mf.Name) if !ok { // No known units detected. return nil } // Unit is already a base unit. if unit == base { return nil } problems = append(problems, fmt.Errorf("use base unit %q instead of %q", base, unit)) return problems } // LintMetricTypeInName detects when metric types are included in the metric name. func LintMetricTypeInName(mf *dto.MetricFamily) []error { var problems []error n := strings.ToLower(mf.GetName()) for i, t := range dto.MetricType_name { if i == int32(dto.MetricType_UNTYPED) { continue } typename := strings.ToLower(t) if strings.Contains(n, "_"+typename+"_") || strings.HasSuffix(n, "_"+typename) { problems = append(problems, fmt.Errorf(`metric name should not include type '%s'`, typename)) } } return problems } // LintReservedChars detects colons in metric names. func LintReservedChars(mf *dto.MetricFamily) []error { var problems []error if strings.Contains(mf.GetName(), ":") { problems = append(problems, errors.New("metric names should not contain ':'")) } return problems } // LintCamelCase detects metric names and label names written in camelCase. func LintCamelCase(mf *dto.MetricFamily) []error { var problems []error if camelCase.FindString(mf.GetName()) != "" { problems = append(problems, errors.New("metric names should be written in 'snake_case' not 'camelCase'")) } for _, m := range mf.GetMetric() { for _, l := range m.GetLabel() { if camelCase.FindString(l.GetName()) != "" { problems = append(problems, errors.New("label names should be written in 'snake_case' not 'camelCase'")) } } } return problems } // LintUnitAbbreviations detects abbreviated units in the metric name. func LintUnitAbbreviations(mf *dto.MetricFamily) []error { var problems []error n := strings.ToLower(mf.GetName()) for _, s := range unitAbbreviations { if strings.Contains(n, "_"+s+"_") || strings.HasSuffix(n, "_"+s) { problems = append(problems, errors.New("metric names should not contain abbreviated units")) } } return problems } client_golang-1.19.1/prometheus/testutil/promlint/validations/help_validations.go000066400000000000000000000017171461713521000305230ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validations import ( "errors" dto "github.com/prometheus/client_model/go" ) // LintHelp detects issues related to the help text for a metric. func LintHelp(mf *dto.MetricFamily) []error { var problems []error // Expect all metrics to have help text available. if mf.Help == nil { problems = append(problems, errors.New("no help text")) } return problems } client_golang-1.19.1/prometheus/testutil/promlint/validations/histogram_validations.go000066400000000000000000000040361461713521000315650ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validations import ( "errors" "strings" dto "github.com/prometheus/client_model/go" ) // LintHistogramSummaryReserved detects when other types of metrics use names or labels // reserved for use by histograms and/or summaries. func LintHistogramSummaryReserved(mf *dto.MetricFamily) []error { // These rules do not apply to untyped metrics. t := mf.GetType() if t == dto.MetricType_UNTYPED { return nil } var problems []error isHistogram := t == dto.MetricType_HISTOGRAM isSummary := t == dto.MetricType_SUMMARY n := mf.GetName() if !isHistogram && strings.HasSuffix(n, "_bucket") { problems = append(problems, errors.New(`non-histogram metrics should not have "_bucket" suffix`)) } if !isHistogram && !isSummary && strings.HasSuffix(n, "_count") { problems = append(problems, errors.New(`non-histogram and non-summary metrics should not have "_count" suffix`)) } if !isHistogram && !isSummary && strings.HasSuffix(n, "_sum") { problems = append(problems, errors.New(`non-histogram and non-summary metrics should not have "_sum" suffix`)) } for _, m := range mf.GetMetric() { for _, l := range m.GetLabel() { ln := l.GetName() if !isHistogram && ln == "le" { problems = append(problems, errors.New(`non-histogram metrics should not have "le" label`)) } if !isSummary && ln == "quantile" { problems = append(problems, errors.New(`non-summary metrics should not have "quantile" label`)) } } } return problems } client_golang-1.19.1/prometheus/testutil/promlint/validations/units.go000066400000000000000000000051111461713521000263300ustar00rootroot00000000000000// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validations import "strings" // Units and their possible prefixes recognized by this library. More can be // added over time as needed. var ( // map a unit to the appropriate base unit. units = map[string]string{ // Base units. "amperes": "amperes", "bytes": "bytes", "celsius": "celsius", // Also allow Celsius because it is common in typical Prometheus use cases. "grams": "grams", "joules": "joules", "kelvin": "kelvin", // SI base unit, used in special cases (e.g. color temperature, scientific measurements). "meters": "meters", // Both American and international spelling permitted. "metres": "metres", "seconds": "seconds", "volts": "volts", // Non base units. // Time. "minutes": "seconds", "hours": "seconds", "days": "seconds", "weeks": "seconds", // Temperature. "kelvins": "kelvin", "fahrenheit": "celsius", "rankine": "celsius", // Length. "inches": "meters", "yards": "meters", "miles": "meters", // Bytes. "bits": "bytes", // Energy. "calories": "joules", // Mass. "pounds": "grams", "ounces": "grams", } unitPrefixes = []string{ "pico", "nano", "micro", "milli", "centi", "deci", "deca", "hecto", "kilo", "kibi", "mega", "mibi", "giga", "gibi", "tera", "tebi", "peta", "pebi", } // Common abbreviations that we'd like to discourage. unitAbbreviations = []string{ "s", "ms", "us", "ns", "sec", "b", "kb", "mb", "gb", "tb", "pb", "m", "h", "d", } ) // metricUnits attempts to detect known unit types used as part of a metric name, // e.g. "foo_bytes_total" or "bar_baz_milligrams". func metricUnits(m string) (unit, base string, ok bool) { ss := strings.Split(m, "_") for _, s := range ss { if base, found := units[s]; found { return s, base, true } for _, p := range unitPrefixes { if strings.HasPrefix(s, p) { if base, found := units[s[len(p):]]; found { return s, base, true } } } } return "", "", false } client_golang-1.19.1/prometheus/testutil/testutil.go000066400000000000000000000310131461713521000226620ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package testutil provides helpers to test code using the prometheus package // of client_golang. // // While writing unit tests to verify correct instrumentation of your code, it's // a common mistake to mostly test the instrumentation library instead of your // own code. Rather than verifying that a prometheus.Counter's value has changed // as expected or that it shows up in the exposition after registration, it is // in general more robust and more faithful to the concept of unit tests to use // mock implementations of the prometheus.Counter and prometheus.Registerer // interfaces that simply assert that the Add or Register methods have been // called with the expected arguments. However, this might be overkill in simple // scenarios. The ToFloat64 function is provided for simple inspection of a // single-value metric, but it has to be used with caution. // // End-to-end tests to verify all or larger parts of the metrics exposition can // be implemented with the CollectAndCompare or GatherAndCompare functions. The // most appropriate use is not so much testing instrumentation of your code, but // testing custom prometheus.Collector implementations and in particular whole // exporters, i.e. programs that retrieve telemetry data from a 3rd party source // and convert it into Prometheus metrics. // // In a similar pattern, CollectAndLint and GatherAndLint can be used to detect // metrics that have issues with their name, type, or metadata without being // necessarily invalid, e.g. a counter with a name missing the “_total” suffix. package testutil import ( "bytes" "fmt" "io" "net/http" "reflect" "github.com/davecgh/go-spew/spew" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" "google.golang.org/protobuf/proto" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/internal" ) // ToFloat64 collects all Metrics from the provided Collector. It expects that // this results in exactly one Metric being collected, which must be a Gauge, // Counter, or Untyped. In all other cases, ToFloat64 panics. ToFloat64 returns // the value of the collected Metric. // // The Collector provided is typically a simple instance of Gauge or Counter, or // – less commonly – a GaugeVec or CounterVec with exactly one element. But any // Collector fulfilling the prerequisites described above will do. // // Use this function with caution. It is computationally very expensive and thus // not suited at all to read values from Metrics in regular code. This is really // only for testing purposes, and even for testing, other approaches are often // more appropriate (see this package's documentation). // // A clear anti-pattern would be to use a metric type from the prometheus // package to track values that are also needed for something else than the // exposition of Prometheus metrics. For example, you would like to track the // number of items in a queue because your code should reject queuing further // items if a certain limit is reached. It is tempting to track the number of // items in a prometheus.Gauge, as it is then easily available as a metric for // exposition, too. However, then you would need to call ToFloat64 in your // regular code, potentially quite often. The recommended way is to track the // number of items conventionally (in the way you would have done it without // considering Prometheus metrics) and then expose the number with a // prometheus.GaugeFunc. func ToFloat64(c prometheus.Collector) float64 { var ( m prometheus.Metric mCount int mChan = make(chan prometheus.Metric) done = make(chan struct{}) ) go func() { for m = range mChan { mCount++ } close(done) }() c.Collect(mChan) close(mChan) <-done if mCount != 1 { panic(fmt.Errorf("collected %d metrics instead of exactly 1", mCount)) } pb := &dto.Metric{} if err := m.Write(pb); err != nil { panic(fmt.Errorf("error happened while collecting metrics: %w", err)) } if pb.Gauge != nil { return pb.Gauge.GetValue() } if pb.Counter != nil { return pb.Counter.GetValue() } if pb.Untyped != nil { return pb.Untyped.GetValue() } panic(fmt.Errorf("collected a non-gauge/counter/untyped metric: %s", pb)) } // CollectAndCount registers the provided Collector with a newly created // pedantic Registry. It then calls GatherAndCount with that Registry and with // the provided metricNames. In the unlikely case that the registration or the // gathering fails, this function panics. (This is inconsistent with the other // CollectAnd… functions in this package and has historical reasons. Changing // the function signature would be a breaking change and will therefore only // happen with the next major version bump.) func CollectAndCount(c prometheus.Collector, metricNames ...string) int { reg := prometheus.NewPedanticRegistry() if err := reg.Register(c); err != nil { panic(fmt.Errorf("registering collector failed: %w", err)) } result, err := GatherAndCount(reg, metricNames...) if err != nil { panic(err) } return result } // GatherAndCount gathers all metrics from the provided Gatherer and counts // them. It returns the number of metric children in all gathered metric // families together. If any metricNames are provided, only metrics with those // names are counted. func GatherAndCount(g prometheus.Gatherer, metricNames ...string) (int, error) { got, err := g.Gather() if err != nil { return 0, fmt.Errorf("gathering metrics failed: %w", err) } if metricNames != nil { got = filterMetrics(got, metricNames) } result := 0 for _, mf := range got { result += len(mf.GetMetric()) } return result, nil } // ScrapeAndCompare calls a remote exporter's endpoint which is expected to return some metrics in // plain text format. Then it compares it with the results that the `expected` would return. // If the `metricNames` is not empty it would filter the comparison only to the given metric names. func ScrapeAndCompare(url string, expected io.Reader, metricNames ...string) error { resp, err := http.Get(url) if err != nil { return fmt.Errorf("scraping metrics failed: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("the scraping target returned a status code other than 200: %d", resp.StatusCode) } scraped, err := convertReaderToMetricFamily(resp.Body) if err != nil { return err } wanted, err := convertReaderToMetricFamily(expected) if err != nil { return err } return compareMetricFamilies(scraped, wanted, metricNames...) } // CollectAndCompare registers the provided Collector with a newly created // pedantic Registry. It then calls GatherAndCompare with that Registry and with // the provided metricNames. func CollectAndCompare(c prometheus.Collector, expected io.Reader, metricNames ...string) error { reg := prometheus.NewPedanticRegistry() if err := reg.Register(c); err != nil { return fmt.Errorf("registering collector failed: %w", err) } return GatherAndCompare(reg, expected, metricNames...) } // GatherAndCompare gathers all metrics from the provided Gatherer and compares // it to an expected output read from the provided Reader in the Prometheus text // exposition format. If any metricNames are provided, only metrics with those // names are compared. func GatherAndCompare(g prometheus.Gatherer, expected io.Reader, metricNames ...string) error { return TransactionalGatherAndCompare(prometheus.ToTransactionalGatherer(g), expected, metricNames...) } // TransactionalGatherAndCompare gathers all metrics from the provided Gatherer and compares // it to an expected output read from the provided Reader in the Prometheus text // exposition format. If any metricNames are provided, only metrics with those // names are compared. func TransactionalGatherAndCompare(g prometheus.TransactionalGatherer, expected io.Reader, metricNames ...string) error { got, done, err := g.Gather() defer done() if err != nil { return fmt.Errorf("gathering metrics failed: %w", err) } wanted, err := convertReaderToMetricFamily(expected) if err != nil { return err } return compareMetricFamilies(got, wanted, metricNames...) } // convertReaderToMetricFamily would read from a io.Reader object and convert it to a slice of // dto.MetricFamily. func convertReaderToMetricFamily(reader io.Reader) ([]*dto.MetricFamily, error) { var tp expfmt.TextParser notNormalized, err := tp.TextToMetricFamilies(reader) if err != nil { return nil, fmt.Errorf("converting reader to metric families failed: %w", err) } // The text protocol handles empty help fields inconsistently. When // encoding, any non-nil value, include the empty string, produces a // "# HELP" line. But when decoding, the help field is only set to a // non-nil value if the "# HELP" line contains a non-empty value. // // Because metrics in a registry always have non-nil help fields, populate // any nil help fields in the parsed metrics with the empty string so that // when we compare text encodings, the results are consistent. for _, metric := range notNormalized { if metric.Help == nil { metric.Help = proto.String("") } } return internal.NormalizeMetricFamilies(notNormalized), nil } // compareMetricFamilies would compare 2 slices of metric families, and optionally filters both of // them to the `metricNames` provided. func compareMetricFamilies(got, expected []*dto.MetricFamily, metricNames ...string) error { if metricNames != nil { got = filterMetrics(got, metricNames) expected = filterMetrics(expected, metricNames) } return compare(got, expected) } // compare encodes both provided slices of metric families into the text format, // compares their string message, and returns an error if they do not match. // The error contains the encoded text of both the desired and the actual // result. func compare(got, want []*dto.MetricFamily) error { var gotBuf, wantBuf bytes.Buffer enc := expfmt.NewEncoder(&gotBuf, expfmt.NewFormat(expfmt.TypeTextPlain)) for _, mf := range got { if err := enc.Encode(mf); err != nil { return fmt.Errorf("encoding gathered metrics failed: %w", err) } } enc = expfmt.NewEncoder(&wantBuf, expfmt.NewFormat(expfmt.TypeTextPlain)) for _, mf := range want { if err := enc.Encode(mf); err != nil { return fmt.Errorf("encoding expected metrics failed: %w", err) } } if diffErr := diff(wantBuf, gotBuf); diffErr != "" { return fmt.Errorf(diffErr) } return nil } // diff returns a diff of both values as long as both are of the same type and // are a struct, map, slice, array or string. Otherwise it returns an empty string. func diff(expected, actual interface{}) string { if expected == nil || actual == nil { return "" } et, ek := typeAndKind(expected) at, _ := typeAndKind(actual) if et != at { return "" } if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String { return "" } var e, a string c := spew.ConfigState{ Indent: " ", DisablePointerAddresses: true, DisableCapacities: true, SortKeys: true, } if et != reflect.TypeOf("") { e = c.Sdump(expected) a = c.Sdump(actual) } else { e = reflect.ValueOf(expected).String() a = reflect.ValueOf(actual).String() } diff, _ := internal.GetUnifiedDiffString(internal.UnifiedDiff{ A: internal.SplitLines(e), B: internal.SplitLines(a), FromFile: "metric output does not match expectation; want", FromDate: "", ToFile: "got:", ToDate: "", Context: 1, }) if diff == "" { return "" } return "\n\nDiff:\n" + diff } // typeAndKind returns the type and kind of the given interface{} func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { t := reflect.TypeOf(v) k := t.Kind() if k == reflect.Ptr { t = t.Elem() k = t.Kind() } return t, k } func filterMetrics(metrics []*dto.MetricFamily, names []string) []*dto.MetricFamily { var filtered []*dto.MetricFamily for _, m := range metrics { for _, name := range names { if m.GetName() == name { filtered = append(filtered, m) break } } } return filtered } client_golang-1.19.1/prometheus/testutil/testutil_test.go000066400000000000000000000264531461713521000237350ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package testutil import ( "fmt" "net/http" "net/http/httptest" "strings" "testing" "github.com/prometheus/client_golang/prometheus" ) type untypedCollector struct{} func (u untypedCollector) Describe(c chan<- *prometheus.Desc) { c <- prometheus.NewDesc("name", "help", nil, nil) } func (u untypedCollector) Collect(c chan<- prometheus.Metric) { c <- prometheus.MustNewConstMetric( prometheus.NewDesc("name", "help", nil, nil), prometheus.UntypedValue, 2001, ) } func TestToFloat64(t *testing.T) { gaugeWithAValueSet := prometheus.NewGauge(prometheus.GaugeOpts{}) gaugeWithAValueSet.Set(3.14) counterVecWithOneElement := prometheus.NewCounterVec(prometheus.CounterOpts{}, []string{"foo"}) counterVecWithOneElement.WithLabelValues("bar").Inc() counterVecWithTwoElements := prometheus.NewCounterVec(prometheus.CounterOpts{}, []string{"foo"}) counterVecWithTwoElements.WithLabelValues("bar").Add(42) counterVecWithTwoElements.WithLabelValues("baz").Inc() histogramVecWithOneElement := prometheus.NewHistogramVec(prometheus.HistogramOpts{}, []string{"foo"}) histogramVecWithOneElement.WithLabelValues("bar").Observe(2.7) scenarios := map[string]struct { collector prometheus.Collector panics bool want float64 }{ "simple counter": { collector: prometheus.NewCounter(prometheus.CounterOpts{}), panics: false, want: 0, }, "simple gauge": { collector: prometheus.NewGauge(prometheus.GaugeOpts{}), panics: false, want: 0, }, "simple untyped": { collector: untypedCollector{}, panics: false, want: 2001, }, "simple histogram": { collector: prometheus.NewHistogram(prometheus.HistogramOpts{}), panics: true, }, "simple summary": { collector: prometheus.NewSummary(prometheus.SummaryOpts{}), panics: true, }, "simple gauge with an actual value set": { collector: gaugeWithAValueSet, panics: false, want: 3.14, }, "counter vec with zero elements": { collector: prometheus.NewCounterVec(prometheus.CounterOpts{}, nil), panics: true, }, "counter vec with one element": { collector: counterVecWithOneElement, panics: false, want: 1, }, "counter vec with two elements": { collector: counterVecWithTwoElements, panics: true, }, "histogram vec with one element": { collector: histogramVecWithOneElement, panics: true, }, } for n, s := range scenarios { t.Run(n, func(t *testing.T) { defer func() { r := recover() if r == nil && s.panics { t.Error("expected panic") } else if r != nil && !s.panics { t.Error("unexpected panic: ", r) } // Any other combination is the expected outcome. }() if got := ToFloat64(s.collector); got != s.want { t.Errorf("want %f, got %f", s.want, got) } }) } } func TestCollectAndCompare(t *testing.T) { const metadata = ` # HELP some_total A value that represents a counter. # TYPE some_total counter ` c := prometheus.NewCounter(prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", ConstLabels: prometheus.Labels{ "label1": "value1", }, }) c.Inc() expected := ` some_total{ label1 = "value1" } 1 ` if err := CollectAndCompare(c, strings.NewReader(metadata+expected), "some_total"); err != nil { t.Errorf("unexpected collecting result:\n%s", err) } } func TestCollectAndCompareNoLabel(t *testing.T) { const metadata = ` # HELP some_total A value that represents a counter. # TYPE some_total counter ` c := prometheus.NewCounter(prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", }) c.Inc() expected := ` some_total 1 ` if err := CollectAndCompare(c, strings.NewReader(metadata+expected), "some_total"); err != nil { t.Errorf("unexpected collecting result:\n%s", err) } } func TestCollectAndCompareNoHelp(t *testing.T) { const metadata = ` # TYPE some_total counter ` c := prometheus.NewCounter(prometheus.CounterOpts{ Name: "some_total", }) c.Inc() expected := ` some_total 1 ` if err := CollectAndCompare(c, strings.NewReader(metadata+expected), "some_total"); err != nil { t.Errorf("unexpected collecting result:\n%s", err) } } func TestCollectAndCompareHistogram(t *testing.T) { inputs := []struct { name string c prometheus.Collector metadata string expect string observation float64 }{ { name: "Testing Histogram Collector", c: prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "some_histogram", Help: "An example of a histogram", Buckets: []float64{1, 2, 3}, }), metadata: ` # HELP some_histogram An example of a histogram # TYPE some_histogram histogram `, expect: ` some_histogram{le="1"} 0 some_histogram{le="2"} 0 some_histogram{le="3"} 1 some_histogram_bucket{le="+Inf"} 1 some_histogram_sum 2.5 some_histogram_count 1 `, observation: 2.5, }, { name: "Testing HistogramVec Collector", c: prometheus.NewHistogramVec(prometheus.HistogramOpts{ Name: "some_histogram", Help: "An example of a histogram", Buckets: []float64{1, 2, 3}, }, []string{"test"}), metadata: ` # HELP some_histogram An example of a histogram # TYPE some_histogram histogram `, expect: ` some_histogram_bucket{test="test",le="1"} 0 some_histogram_bucket{test="test",le="2"} 0 some_histogram_bucket{test="test",le="3"} 1 some_histogram_bucket{test="test",le="+Inf"} 1 some_histogram_sum{test="test"} 2.5 some_histogram_count{test="test"} 1 `, observation: 2.5, }, } for _, input := range inputs { switch collector := input.c.(type) { case prometheus.Histogram: collector.Observe(input.observation) case *prometheus.HistogramVec: collector.WithLabelValues("test").Observe(input.observation) default: t.Fatalf("unsupported collector tested") } t.Run(input.name, func(t *testing.T) { if err := CollectAndCompare(input.c, strings.NewReader(input.metadata+input.expect)); err != nil { t.Errorf("unexpected collecting result:\n%s", err) } }) } } func TestNoMetricFilter(t *testing.T) { const metadata = ` # HELP some_total A value that represents a counter. # TYPE some_total counter ` c := prometheus.NewCounter(prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", ConstLabels: prometheus.Labels{ "label1": "value1", }, }) c.Inc() expected := ` some_total{label1="value1"} 1 ` if err := CollectAndCompare(c, strings.NewReader(metadata+expected)); err != nil { t.Errorf("unexpected collecting result:\n%s", err) } } func TestMetricNotFound(t *testing.T) { const metadata = ` # HELP some_other_metric A value that represents a counter. # TYPE some_other_metric counter ` c := prometheus.NewCounter(prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", ConstLabels: prometheus.Labels{ "label1": "value1", }, }) c.Inc() expected := ` some_other_metric{label1="value1"} 1 ` expectedError := ` Diff: --- metric output does not match expectation; want +++ got: @@ -1,4 +1,4 @@ -(bytes.Buffer) # HELP some_other_metric A value that represents a counter. -# TYPE some_other_metric counter -some_other_metric{label1="value1"} 1 +(bytes.Buffer) # HELP some_total A value that represents a counter. +# TYPE some_total counter +some_total{label1="value1"} 1 ` err := CollectAndCompare(c, strings.NewReader(metadata+expected)) if err == nil { t.Error("Expected error, got no error.") } if err.Error() != expectedError { t.Errorf("Expected\n%#+v\nGot:\n%#+v", expectedError, err.Error()) } } func TestScrapeAndCompare(t *testing.T) { const expected = ` # HELP some_total A value that represents a counter. # TYPE some_total counter some_total{ label1 = "value1" } 1 ` expectedReader := strings.NewReader(expected) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, expected) })) defer ts.Close() if err := ScrapeAndCompare(ts.URL, expectedReader, "some_total"); err != nil { t.Errorf("unexpected scraping result:\n%s", err) } } func TestScrapeAndCompareWithMultipleExpected(t *testing.T) { const expected = ` # HELP some_total A value that represents a counter. # TYPE some_total counter some_total{ label1 = "value1" } 1 # HELP some_total2 A value that represents a counter. # TYPE some_total2 counter some_total2{ label2 = "value2" } 1 ` expectedReader := strings.NewReader(expected) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, expected) })) defer ts.Close() if err := ScrapeAndCompare(ts.URL, expectedReader, "some_total2"); err != nil { t.Errorf("unexpected scraping result:\n%s", err) } } func TestScrapeAndCompareFetchingFail(t *testing.T) { err := ScrapeAndCompare("some_url", strings.NewReader("some expectation"), "some_total") if err == nil { t.Errorf("expected an error but got nil") } if !strings.HasPrefix(err.Error(), "scraping metrics failed") { t.Errorf("unexpected error happened: %s", err) } } func TestScrapeAndCompareBadStatusCode(t *testing.T) { const expected = ` # HELP some_total A value that represents a counter. # TYPE some_total counter some_total{ label1 = "value1" } 1 ` expectedReader := strings.NewReader(expected) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadGateway) fmt.Fprintln(w, expected) })) defer ts.Close() err := ScrapeAndCompare(ts.URL, expectedReader, "some_total") if err == nil { t.Errorf("expected an error but got nil") } if !strings.HasPrefix(err.Error(), "the scraping target returned a status code other than 200") { t.Errorf("unexpected error happened: %s", err) } } func TestCollectAndCount(t *testing.T) { c := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "some_total", Help: "A value that represents a counter.", }, []string{"foo"}, ) if got, want := CollectAndCount(c), 0; got != want { t.Errorf("unexpected metric count, got %d, want %d", got, want) } c.WithLabelValues("bar") if got, want := CollectAndCount(c), 1; got != want { t.Errorf("unexpected metric count, got %d, want %d", got, want) } c.WithLabelValues("baz") if got, want := CollectAndCount(c), 2; got != want { t.Errorf("unexpected metric count, got %d, want %d", got, want) } if got, want := CollectAndCount(c, "some_total"), 2; got != want { t.Errorf("unexpected metric count, got %d, want %d", got, want) } if got, want := CollectAndCount(c, "some_other_total"), 0; got != want { t.Errorf("unexpected metric count, got %d, want %d", got, want) } } client_golang-1.19.1/prometheus/timer.go000066400000000000000000000047321461713521000202600ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import "time" // Timer is a helper type to time functions. Use NewTimer to create new // instances. type Timer struct { begin time.Time observer Observer } // NewTimer creates a new Timer. The provided Observer is used to observe a // duration in seconds. If the Observer implements ExemplarObserver, passing exemplar // later on will be also supported. // Timer is usually used to time a function call in the // following way: // // func TimeMe() { // timer := NewTimer(myHistogram) // defer timer.ObserveDuration() // // Do actual work. // } // // or // // func TimeMeWithExemplar() { // timer := NewTimer(myHistogram) // defer timer.ObserveDurationWithExemplar(exemplar) // // Do actual work. // } func NewTimer(o Observer) *Timer { return &Timer{ begin: time.Now(), observer: o, } } // ObserveDuration records the duration passed since the Timer was created with // NewTimer. It calls the Observe method of the Observer provided during // construction with the duration in seconds as an argument. The observed // duration is also returned. ObserveDuration is usually called with a defer // statement. // // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. func (t *Timer) ObserveDuration() time.Duration { d := time.Since(t.begin) if t.observer != nil { t.observer.Observe(d.Seconds()) } return d } // ObserveDurationWithExemplar is like ObserveDuration, but it will also // observe exemplar with the duration unless exemplar is nil or provided Observer can't // be casted to ExemplarObserver. func (t *Timer) ObserveDurationWithExemplar(exemplar Labels) time.Duration { d := time.Since(t.begin) eo, ok := t.observer.(ExemplarObserver) if ok && exemplar != nil { eo.ObserveWithExemplar(d.Seconds(), exemplar) return d } if t.observer != nil { t.observer.Observe(d.Seconds()) } return d } client_golang-1.19.1/prometheus/timer_test.go000066400000000000000000000132311461713521000213110ustar00rootroot00000000000000// Copyright 2016 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "reflect" "testing" "google.golang.org/protobuf/proto" dto "github.com/prometheus/client_model/go" ) func TestTimerObserve(t *testing.T) { var ( his = NewHistogram(HistogramOpts{Name: "test_histogram"}) sum = NewSummary(SummaryOpts{Name: "test_summary"}) gauge = NewGauge(GaugeOpts{Name: "test_gauge"}) ) func() { hisTimer := NewTimer(his) sumTimer := NewTimer(sum) gaugeTimer := NewTimer(ObserverFunc(gauge.Set)) defer hisTimer.ObserveDuration() defer sumTimer.ObserveDuration() defer gaugeTimer.ObserveDuration() }() m := &dto.Metric{} his.Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for histogram, got %d", want, got) } m.Reset() sum.Write(m) if want, got := uint64(1), m.GetSummary().GetSampleCount(); want != got { t.Errorf("want %d observations for summary, got %d", want, got) } m.Reset() gauge.Write(m) if got := m.GetGauge().GetValue(); got <= 0 { t.Errorf("want value > 0 for gauge, got %f", got) } } func TestTimerObserveWithExemplar(t *testing.T) { var ( exemplar = Labels{"foo": "bar"} his = NewHistogram(HistogramOpts{Name: "test_histogram"}) sum = NewSummary(SummaryOpts{Name: "test_summary"}) gauge = NewGauge(GaugeOpts{Name: "test_gauge"}) ) func() { hisTimer := NewTimer(his) sumTimer := NewTimer(sum) gaugeTimer := NewTimer(ObserverFunc(gauge.Set)) defer hisTimer.ObserveDurationWithExemplar(exemplar) // Gauges and summaries does not implement ExemplarObserver, so we expect them to ignore exemplar. defer sumTimer.ObserveDurationWithExemplar(exemplar) defer gaugeTimer.ObserveDurationWithExemplar(exemplar) }() m := &dto.Metric{} his.Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for histogram, got %d", want, got) } var got []*dto.LabelPair for _, b := range m.GetHistogram().GetBucket() { if b.Exemplar != nil { got = b.Exemplar.GetLabel() break } } want := []*dto.LabelPair{{Name: proto.String("foo"), Value: proto.String("bar")}} if !reflect.DeepEqual(got, want) { t.Errorf("expected %v exemplar labels, got %v", want, got) } m.Reset() sum.Write(m) if want, got := uint64(1), m.GetSummary().GetSampleCount(); want != got { t.Errorf("want %d observations for summary, got %d", want, got) } m.Reset() gauge.Write(m) if got := m.GetGauge().GetValue(); got <= 0 { t.Errorf("want value > 0 for gauge, got %f", got) } } func TestTimerEmpty(t *testing.T) { emptyTimer := NewTimer(nil) emptyTimer.ObserveDuration() // Do nothing, just demonstrate it works without panic. } func TestTimerConditionalTiming(t *testing.T) { var ( his = NewHistogram(HistogramOpts{ Name: "test_histogram", }) timeMe = true m = &dto.Metric{} ) timedFunc := func() { timer := NewTimer(ObserverFunc(func(v float64) { if timeMe { his.Observe(v) } })) defer timer.ObserveDuration() } timedFunc() // This will time. his.Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for histogram, got %d", want, got) } timeMe = false timedFunc() // This will not time again. m.Reset() his.Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for histogram, got %d", want, got) } } func TestTimerByOutcome(t *testing.T) { var ( his = NewHistogramVec( HistogramOpts{Name: "test_histogram"}, []string{"outcome"}, ) outcome = "foo" m = &dto.Metric{} ) timedFunc := func() { timer := NewTimer(ObserverFunc(func(v float64) { his.WithLabelValues(outcome).Observe(v) })) defer timer.ObserveDuration() if outcome == "foo" { outcome = "bar" return } outcome = "foo" } timedFunc() his.WithLabelValues("foo").(Histogram).Write(m) if want, got := uint64(0), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'foo' histogram, got %d", want, got) } m.Reset() his.WithLabelValues("bar").(Histogram).Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'bar' histogram, got %d", want, got) } timedFunc() m.Reset() his.WithLabelValues("foo").(Histogram).Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'foo' histogram, got %d", want, got) } m.Reset() his.WithLabelValues("bar").(Histogram).Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'bar' histogram, got %d", want, got) } timedFunc() m.Reset() his.WithLabelValues("foo").(Histogram).Write(m) if want, got := uint64(1), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'foo' histogram, got %d", want, got) } m.Reset() his.WithLabelValues("bar").(Histogram).Write(m) if want, got := uint64(2), m.GetHistogram().GetSampleCount(); want != got { t.Errorf("want %d observations for 'bar' histogram, got %d", want, got) } } client_golang-1.19.1/prometheus/untyped.go000066400000000000000000000031341461713521000206230ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus // UntypedOpts is an alias for Opts. See there for doc comments. type UntypedOpts Opts // UntypedFunc works like GaugeFunc but the collected metric is of type // "Untyped". UntypedFunc is useful to mirror an external metric of unknown // type. // // To create UntypedFunc instances, use NewUntypedFunc. type UntypedFunc interface { Metric Collector } // NewUntypedFunc creates a new UntypedFunc based on the provided // UntypedOpts. The value reported is determined by calling the given function // from within the Write method. Take into account that metric collection may // happen concurrently. If that results in concurrent calls to Write, like in // the case where an UntypedFunc is directly registered with Prometheus, the // provided function must be concurrency-safe. func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { return newValueFunc(NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, nil, opts.ConstLabels, ), UntypedValue, function) } client_golang-1.19.1/prometheus/utils_test.go000066400000000000000000000042541461713521000213360ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus_test import ( "bytes" "encoding/json" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) // sanitizeMetric injects expected fake created timestamp value "1970-01-01T00:00:10Z", // so we can compare it in examples. It modifies metric in-place, the returned pointer // is for convenience. func sanitizeMetric(metric *dto.Metric) *dto.Metric { if metric.Counter != nil && metric.Counter.CreatedTimestamp != nil { metric.Counter.CreatedTimestamp = timestamppb.New(time.Unix(10, 0)) } if metric.Summary != nil && metric.Summary.CreatedTimestamp != nil { metric.Summary.CreatedTimestamp = timestamppb.New(time.Unix(10, 0)) } if metric.Histogram != nil && metric.Histogram.CreatedTimestamp != nil { metric.Histogram.CreatedTimestamp = timestamppb.New(time.Unix(10, 0)) } return metric } // sanitizeMetricFamily is like sanitizeMetric, but for multiple metrics. func sanitizeMetricFamily(f *dto.MetricFamily) *dto.MetricFamily { for _, m := range f.Metric { sanitizeMetric(m) } return f } // toNormalizedJSON removes fake random space from proto JSON original marshaller. // It is required, so we can compare proto messages in json format. // Read more in https://github.com/golang/protobuf/issues/1121 func toNormalizedJSON(m proto.Message) string { mAsJSON, err := protojson.Marshal(m) if err != nil { panic(err) } buffer := new(bytes.Buffer) if err := json.Compact(buffer, mAsJSON); err != nil { panic(err) } return buffer.String() } client_golang-1.19.1/prometheus/value.go000066400000000000000000000210171461713521000202470ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "errors" "fmt" "sort" "time" "unicode/utf8" "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) // ValueType is an enumeration of metric types that represent a simple value. type ValueType int // Possible values for the ValueType enum. Use UntypedValue to mark a metric // with an unknown type. const ( _ ValueType = iota CounterValue GaugeValue UntypedValue ) var ( CounterMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_COUNTER; return &d }() GaugeMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_GAUGE; return &d }() UntypedMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_UNTYPED; return &d }() ) func (v ValueType) ToDTO() *dto.MetricType { switch v { case CounterValue: return CounterMetricTypePtr case GaugeValue: return GaugeMetricTypePtr default: return UntypedMetricTypePtr } } // valueFunc is a generic metric for simple values retrieved on collect time // from a function. It implements Metric and Collector. Its effective type is // determined by ValueType. This is a low-level building block used by the // library to back the implementations of CounterFunc, GaugeFunc, and // UntypedFunc. type valueFunc struct { selfCollector desc *Desc valType ValueType function func() float64 labelPairs []*dto.LabelPair } // newValueFunc returns a newly allocated valueFunc with the given Desc and // ValueType. The value reported is determined by calling the given function // from within the Write method. Take into account that metric collection may // happen concurrently. If that results in concurrent calls to Write, like in // the case where a valueFunc is directly registered with Prometheus, the // provided function must be concurrency-safe. func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { result := &valueFunc{ desc: desc, valType: valueType, function: function, labelPairs: MakeLabelPairs(desc, nil), } result.init(result) return result } func (v *valueFunc) Desc() *Desc { return v.desc } func (v *valueFunc) Write(out *dto.Metric) error { return populateMetric(v.valType, v.function(), v.labelPairs, nil, out, nil) } // NewConstMetric returns a metric with one fixed value that cannot be // changed. Users of this package will not have much use for it in regular // operations. However, when implementing custom Collectors, it is useful as a // throw-away metric that is generated on the fly to send it to Prometheus in // the Collect method. NewConstMetric returns an error if the length of // labelValues is not consistent with the variable labels in Desc or if Desc is // invalid. func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { if desc.err != nil { return nil, desc.err } if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } metric := &dto.Metric{} if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, nil); err != nil { return nil, err } return &constMetric{ desc: desc, metric: metric, }, nil } // MustNewConstMetric is a version of NewConstMetric that panics where // NewConstMetric would have returned an error. func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { m, err := NewConstMetric(desc, valueType, value, labelValues...) if err != nil { panic(err) } return m } // NewConstMetricWithCreatedTimestamp does the same thing as NewConstMetric, but generates Counters // with created timestamp set and returns an error for other metric types. func NewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) (Metric, error) { if desc.err != nil { return nil, desc.err } if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } switch valueType { case CounterValue: break default: return nil, errors.New("created timestamps are only supported for counters") } metric := &dto.Metric{} if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, timestamppb.New(ct)); err != nil { return nil, err } return &constMetric{ desc: desc, metric: metric, }, nil } // MustNewConstMetricWithCreatedTimestamp is a version of NewConstMetricWithCreatedTimestamp that panics where // NewConstMetricWithCreatedTimestamp would have returned an error. func MustNewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) Metric { m, err := NewConstMetricWithCreatedTimestamp(desc, valueType, value, ct, labelValues...) if err != nil { panic(err) } return m } type constMetric struct { desc *Desc metric *dto.Metric } func (m *constMetric) Desc() *Desc { return m.desc } func (m *constMetric) Write(out *dto.Metric) error { out.Label = m.metric.Label out.Counter = m.metric.Counter out.Gauge = m.metric.Gauge out.Untyped = m.metric.Untyped return nil } func populateMetric( t ValueType, v float64, labelPairs []*dto.LabelPair, e *dto.Exemplar, m *dto.Metric, ct *timestamppb.Timestamp, ) error { m.Label = labelPairs switch t { case CounterValue: m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e, CreatedTimestamp: ct} case GaugeValue: m.Gauge = &dto.Gauge{Value: proto.Float64(v)} case UntypedValue: m.Untyped = &dto.Untyped{Value: proto.Float64(v)} default: return fmt.Errorf("encountered unknown type %v", t) } return nil } // MakeLabelPairs is a helper function to create protobuf LabelPairs from the // variable and constant labels in the provided Desc. The values for the // variable labels are defined by the labelValues slice, which must be in the // same order as the corresponding variable labels in the Desc. // // This function is only needed for custom Metric implementations. See MetricVec // example. func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { totalLen := len(desc.variableLabels.names) + len(desc.constLabelPairs) if totalLen == 0 { // Super fast path. return nil } if len(desc.variableLabels.names) == 0 { // Moderately fast path. return desc.constLabelPairs } labelPairs := make([]*dto.LabelPair, 0, totalLen) for i, l := range desc.variableLabels.names { labelPairs = append(labelPairs, &dto.LabelPair{ Name: proto.String(l), Value: proto.String(labelValues[i]), }) } labelPairs = append(labelPairs, desc.constLabelPairs...) sort.Sort(internal.LabelPairSorter(labelPairs)) return labelPairs } // ExemplarMaxRunes is the max total number of runes allowed in exemplar labels. const ExemplarMaxRunes = 128 // newExemplar creates a new dto.Exemplar from the provided values. An error is // returned if any of the label names or values are invalid or if the total // number of runes in the label names and values exceeds ExemplarMaxRunes. func newExemplar(value float64, ts time.Time, l Labels) (*dto.Exemplar, error) { e := &dto.Exemplar{} e.Value = proto.Float64(value) tsProto := timestamppb.New(ts) if err := tsProto.CheckValid(); err != nil { return nil, err } e.Timestamp = tsProto labelPairs := make([]*dto.LabelPair, 0, len(l)) var runes int for name, value := range l { if !checkLabelName(name) { return nil, fmt.Errorf("exemplar label name %q is invalid", name) } runes += utf8.RuneCountInString(name) if !utf8.ValidString(value) { return nil, fmt.Errorf("exemplar label value %q is not valid UTF-8", value) } runes += utf8.RuneCountInString(value) labelPairs = append(labelPairs, &dto.LabelPair{ Name: proto.String(name), Value: proto.String(value), }) } if runes > ExemplarMaxRunes { return nil, fmt.Errorf("exemplar labels have %d runes, exceeding the limit of %d", runes, ExemplarMaxRunes) } e.Label = labelPairs return e, nil } client_golang-1.19.1/prometheus/value_test.go000066400000000000000000000055601461713521000213130ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "testing" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/types/known/timestamppb" ) func TestNewConstMetricInvalidLabelValues(t *testing.T) { testCases := []struct { desc string labels Labels }{ { desc: "non utf8 label value", labels: Labels{"a": "\xFF"}, }, { desc: "not enough label values", labels: Labels{}, }, { desc: "too many label values", labels: Labels{"a": "1", "b": "2"}, }, } for _, test := range testCases { metricDesc := NewDesc( "sample_value", "sample value", []string{"a"}, Labels{}, ) expectPanic(t, func() { MustNewConstMetric(metricDesc, CounterValue, 0.3, "\xFF") }, fmt.Sprintf("WithLabelValues: expected panic because: %s", test.desc)) if _, err := NewConstMetric(metricDesc, CounterValue, 0.3, "\xFF"); err == nil { t.Errorf("NewConstMetric: expected error because: %s", test.desc) } } } func TestNewConstMetricWithCreatedTimestamp(t *testing.T) { now := time.Now() for _, tcase := range []struct { desc string metricType ValueType createdTimestamp time.Time expecErr bool expectedCt *timestamppb.Timestamp }{ { desc: "gauge with CT", metricType: GaugeValue, createdTimestamp: now, expecErr: true, expectedCt: nil, }, { desc: "counter with CT", metricType: CounterValue, createdTimestamp: now, expecErr: false, expectedCt: timestamppb.New(now), }, } { t.Run(tcase.desc, func(t *testing.T) { metricDesc := NewDesc( "sample_value", "sample value", nil, nil, ) m, err := NewConstMetricWithCreatedTimestamp(metricDesc, tcase.metricType, float64(1), tcase.createdTimestamp) if tcase.expecErr && err == nil { t.Errorf("Expected error is test %s, got no err", tcase.desc) } if !tcase.expecErr && err != nil { t.Errorf("Didn't expect error in test %s, got %s", tcase.desc, err.Error()) } if tcase.expectedCt != nil { var metric dto.Metric m.Write(&metric) if metric.Counter.CreatedTimestamp.AsTime() != tcase.expectedCt.AsTime() { t.Errorf("Expected timestamp %v, got %v", tcase.expectedCt, &metric.Counter.CreatedTimestamp) } } }) } } client_golang-1.19.1/prometheus/vec.go000066400000000000000000000532171461713521000177170ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "sync" "github.com/prometheus/common/model" ) // MetricVec is a Collector to bundle metrics of the same name that differ in // their label values. MetricVec is not used directly but as a building block // for implementations of vectors of a given metric type, like GaugeVec, // CounterVec, SummaryVec, and HistogramVec. It is exported so that it can be // used for custom Metric implementations. // // To create a FooVec for custom Metric Foo, embed a pointer to MetricVec in // FooVec and initialize it with NewMetricVec. Implement wrappers for // GetMetricWithLabelValues and GetMetricWith that return (Foo, error) rather // than (Metric, error). Similarly, create a wrapper for CurryWith that returns // (*FooVec, error) rather than (*MetricVec, error). It is recommended to also // add the convenience methods WithLabelValues, With, and MustCurryWith, which // panic instead of returning errors. See also the MetricVec example. type MetricVec struct { *metricMap curry []curriedLabelValue // hashAdd and hashAddByte can be replaced for testing collision handling. hashAdd func(h uint64, s string) uint64 hashAddByte func(h uint64, b byte) uint64 } // NewMetricVec returns an initialized metricVec. func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { return &MetricVec{ metricMap: &metricMap{ metrics: map[uint64][]metricWithLabelValues{}, desc: desc, newMetric: newMetric, }, hashAdd: hashAdd, hashAddByte: hashAddByte, } } // DeleteLabelValues removes the metric where the variable labels are the same // as those passed in as labels (same order as the VariableLabels in Desc). It // returns true if a metric was deleted. // // It is not an error if the number of label values is not the same as the // number of VariableLabels in Desc. However, such inconsistent label count can // never match an actual metric, so the method will always return false in that // case. // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider Delete(Labels) as an // alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // See also the CounterVec example. func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return false } return m.metricMap.deleteByHashWithLabelValues(h, lvs, m.curry) } // Delete deletes the metric where the variable labels are the same as those // passed in as labels. It returns true if a metric was deleted. // // It is not an error if the number and names of the Labels are inconsistent // with those of the VariableLabels in Desc. However, such inconsistent Labels // can never match an actual metric, so the method will always return false in // that case. // // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. func (m *MetricVec) Delete(labels Labels) bool { labels, closer := constrainLabels(m.desc, labels) defer closer() h, err := m.hashLabels(labels) if err != nil { return false } return m.metricMap.deleteByHashWithLabels(h, labels, m.curry) } // DeletePartialMatch deletes all metrics where the variable labels contain all of those // passed in as labels. The order of the labels does not matter. // It returns the number of metrics deleted. // // Note that curried labels will never be matched if deleting from the curried vector. // To match curried labels with DeletePartialMatch, it must be called on the base vector. func (m *MetricVec) DeletePartialMatch(labels Labels) int { labels, closer := constrainLabels(m.desc, labels) defer closer() return m.metricMap.deleteByLabels(labels, m.curry) } // Without explicit forwarding of Describe, Collect, Reset, those methods won't // show up in GoDoc. // Describe implements Collector. func (m *MetricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(ch) } // Collect implements Collector. func (m *MetricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) } // Reset deletes all metrics in this vector. func (m *MetricVec) Reset() { m.metricMap.Reset() } // CurryWith returns a vector curried with the provided labels, i.e. the // returned vector has those labels pre-set for all labeled operations performed // on it. The cardinality of the curried vector is reduced accordingly. The // order of the remaining labels stays the same (just with the curried labels // taken out of the sequence – which is relevant for the // (GetMetric)WithLabelValues methods). It is possible to curry a curried // vector, but only with labels not yet used for currying before. // // The metrics contained in the MetricVec are shared between the curried and // uncurried vectors. They are just accessed differently. Curried and uncurried // vectors behave identically in terms of collection. Only one must be // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. // // Note that CurryWith is usually not called directly but through a wrapper // around MetricVec, implementing a vector for a specific Metric // implementation, for example GaugeVec. func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { var ( newCurry []curriedLabelValue oldCurry = m.curry iCurry int ) for i, labelName := range m.desc.variableLabels.names { val, ok := labels[labelName] if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { if ok { return nil, fmt.Errorf("label name %q is already curried", labelName) } newCurry = append(newCurry, oldCurry[iCurry]) iCurry++ } else { if !ok { continue // Label stays uncurried. } newCurry = append(newCurry, curriedLabelValue{ i, m.desc.variableLabels.constrain(labelName, val), }) } } if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { return nil, fmt.Errorf("%d unknown label(s) found during currying", l) } return &MetricVec{ metricMap: m.metricMap, curry: newCurry, hashAdd: m.hashAdd, hashAddByte: m.hashAddByte, }, nil } // GetMetricWithLabelValues returns the Metric for the given slice of label // values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Metric is created (by // calling the newMetric function provided during construction of the // MetricVec). // // It is possible to call this method without using the returned Metric to only // create the new Metric but leave it in its initial state. // // Keeping the Metric for later use is possible (and should be considered if // performance is critical), but keep in mind that Reset, DeleteLabelValues and // Delete can be used to delete the Metric from the MetricVec. In that case, the // Metric will still exist, but it will not be exported anymore, even if a // Metric with the same label values is created later. // // An error is returned if the number of label values is not the same as the // number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as // an alternative to avoid that type of mistake. For higher label numbers, the // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // // Note that GetMetricWithLabelValues is usually not called directly but through // a wrapper around MetricVec, implementing a vector for a specific Metric // implementation, for example GaugeVec. func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return nil, err } return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil } // GetMetricWith returns the Metric for the given Labels map (the label names // must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Metric is created. Implications of // creating a Metric without using it and keeping the Metric for later use // are the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent // with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. // // Note that GetMetricWith is usually not called directly but through a wrapper // around MetricVec, implementing a vector for a specific Metric implementation, // for example GaugeVec. func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { labels, closer := constrainLabels(m.desc, labels) defer closer() h, err := m.hashLabels(labels) if err != nil { return nil, err } return m.metricMap.getOrCreateMetricWithLabels(h, labels, m.curry), nil } func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { if err := validateLabelValues(vals, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } var ( h = hashNew() curry = m.curry iVals, iCurry int ) for i := 0; i < len(m.desc.variableLabels.names); i++ { if iCurry < len(curry) && curry[iCurry].index == i { h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { h = m.hashAdd(h, vals[iVals]) iVals++ } h = m.hashAddByte(h, model.SeparatorByte) } return h, nil } func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { if err := validateValuesInLabels(labels, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } var ( h = hashNew() curry = m.curry iCurry int ) for i, labelName := range m.desc.variableLabels.names { val, ok := labels[labelName] if iCurry < len(curry) && curry[iCurry].index == i { if ok { return 0, fmt.Errorf("label name %q is already curried", labelName) } h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { if !ok { return 0, fmt.Errorf("label name %q missing in label map", labelName) } h = m.hashAdd(h, val) } h = m.hashAddByte(h, model.SeparatorByte) } return h, nil } // metricWithLabelValues provides the metric and its label values for // disambiguation on hash collision. type metricWithLabelValues struct { values []string metric Metric } // curriedLabelValue sets the curried value for a label at the given index. type curriedLabelValue struct { index int value string } // metricMap is a helper for metricVec and shared between differently curried // metricVecs. type metricMap struct { mtx sync.RWMutex // Protects metrics. metrics map[uint64][]metricWithLabelValues desc *Desc newMetric func(labelValues ...string) Metric } // Describe implements Collector. It will send exactly one Desc to the provided // channel. func (m *metricMap) Describe(ch chan<- *Desc) { ch <- m.desc } // Collect implements Collector. func (m *metricMap) Collect(ch chan<- Metric) { m.mtx.RLock() defer m.mtx.RUnlock() for _, metrics := range m.metrics { for _, metric := range metrics { ch <- metric.metric } } } // Reset deletes all metrics in this vector. func (m *metricMap) Reset() { m.mtx.Lock() defer m.mtx.Unlock() for h := range m.metrics { delete(m.metrics, h) } } // deleteByHashWithLabelValues removes the metric from the hash bucket h. If // there are multiple matches in the bucket, use lvs to select a metric and // remove only that metric. func (m *metricMap) deleteByHashWithLabelValues( h uint64, lvs []string, curry []curriedLabelValue, ) bool { m.mtx.Lock() defer m.mtx.Unlock() metrics, ok := m.metrics[h] if !ok { return false } i := findMetricWithLabelValues(metrics, lvs, curry) if i >= len(metrics) { return false } if len(metrics) > 1 { old := metrics m.metrics[h] = append(metrics[:i], metrics[i+1:]...) old[len(old)-1] = metricWithLabelValues{} } else { delete(m.metrics, h) } return true } // deleteByHashWithLabels removes the metric from the hash bucket h. If there // are multiple matches in the bucket, use lvs to select a metric and remove // only that metric. func (m *metricMap) deleteByHashWithLabels( h uint64, labels Labels, curry []curriedLabelValue, ) bool { m.mtx.Lock() defer m.mtx.Unlock() metrics, ok := m.metrics[h] if !ok { return false } i := findMetricWithLabels(m.desc, metrics, labels, curry) if i >= len(metrics) { return false } if len(metrics) > 1 { old := metrics m.metrics[h] = append(metrics[:i], metrics[i+1:]...) old[len(old)-1] = metricWithLabelValues{} } else { delete(m.metrics, h) } return true } // deleteByLabels deletes a metric if the given labels are present in the metric. func (m *metricMap) deleteByLabels(labels Labels, curry []curriedLabelValue) int { m.mtx.Lock() defer m.mtx.Unlock() var numDeleted int for h, metrics := range m.metrics { i := findMetricWithPartialLabels(m.desc, metrics, labels, curry) if i >= len(metrics) { // Didn't find matching labels in this metric slice. continue } delete(m.metrics, h) numDeleted++ } return numDeleted } // findMetricWithPartialLabel returns the index of the matching metric or // len(metrics) if not found. func findMetricWithPartialLabels( desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, ) int { for i, metric := range metrics { if matchPartialLabels(desc, metric.values, labels, curry) { return i } } return len(metrics) } // indexOf searches the given slice of strings for the target string and returns // the index or len(items) as well as a boolean whether the search succeeded. func indexOf(target string, items []string) (int, bool) { for i, l := range items { if l == target { return i, true } } return len(items), false } // valueMatchesVariableOrCurriedValue determines if a value was previously curried, // and returns whether it matches either the "base" value or the curried value accordingly. // It also indicates whether the match is against a curried or uncurried value. func valueMatchesVariableOrCurriedValue(targetValue string, index int, values []string, curry []curriedLabelValue) (bool, bool) { for _, curriedValue := range curry { if curriedValue.index == index { // This label was curried. See if the curried value matches our target. return curriedValue.value == targetValue, true } } // This label was not curried. See if the current value matches our target label. return values[index] == targetValue, false } // matchPartialLabels searches the current metric and returns whether all of the target label:value pairs are present. func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { for l, v := range labels { // Check if the target label exists in our metrics and get the index. varLabelIndex, validLabel := indexOf(l, desc.variableLabels.names) if validLabel { // Check the value of that label against the target value. // We don't consider curried values in partial matches. matches, curried := valueMatchesVariableOrCurriedValue(v, varLabelIndex, values, curry) if matches && !curried { continue } } return false } return true } // getOrCreateMetricWithLabelValues retrieves the metric by hash and label value // or creates it and returns the new one. // // This function holds the mutex. func (m *metricMap) getOrCreateMetricWithLabelValues( hash uint64, lvs []string, curry []curriedLabelValue, ) Metric { m.mtx.RLock() metric, ok := m.getMetricWithHashAndLabelValues(hash, lvs, curry) m.mtx.RUnlock() if ok { return metric } m.mtx.Lock() defer m.mtx.Unlock() metric, ok = m.getMetricWithHashAndLabelValues(hash, lvs, curry) if !ok { inlinedLVs := inlineLabelValues(lvs, curry) metric = m.newMetric(inlinedLVs...) m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: inlinedLVs, metric: metric}) } return metric } // getOrCreateMetricWithLabelValues retrieves the metric by hash and label value // or creates it and returns the new one. // // This function holds the mutex. func (m *metricMap) getOrCreateMetricWithLabels( hash uint64, labels Labels, curry []curriedLabelValue, ) Metric { m.mtx.RLock() metric, ok := m.getMetricWithHashAndLabels(hash, labels, curry) m.mtx.RUnlock() if ok { return metric } m.mtx.Lock() defer m.mtx.Unlock() metric, ok = m.getMetricWithHashAndLabels(hash, labels, curry) if !ok { lvs := extractLabelValues(m.desc, labels, curry) metric = m.newMetric(lvs...) m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: lvs, metric: metric}) } return metric } // getMetricWithHashAndLabelValues gets a metric while handling possible // collisions in the hash space. Must be called while holding the read mutex. func (m *metricMap) getMetricWithHashAndLabelValues( h uint64, lvs []string, curry []curriedLabelValue, ) (Metric, bool) { metrics, ok := m.metrics[h] if ok { if i := findMetricWithLabelValues(metrics, lvs, curry); i < len(metrics) { return metrics[i].metric, true } } return nil, false } // getMetricWithHashAndLabels gets a metric while handling possible collisions in // the hash space. Must be called while holding read mutex. func (m *metricMap) getMetricWithHashAndLabels( h uint64, labels Labels, curry []curriedLabelValue, ) (Metric, bool) { metrics, ok := m.metrics[h] if ok { if i := findMetricWithLabels(m.desc, metrics, labels, curry); i < len(metrics) { return metrics[i].metric, true } } return nil, false } // findMetricWithLabelValues returns the index of the matching metric or // len(metrics) if not found. func findMetricWithLabelValues( metrics []metricWithLabelValues, lvs []string, curry []curriedLabelValue, ) int { for i, metric := range metrics { if matchLabelValues(metric.values, lvs, curry) { return i } } return len(metrics) } // findMetricWithLabels returns the index of the matching metric or len(metrics) // if not found. func findMetricWithLabels( desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, ) int { for i, metric := range metrics { if matchLabels(desc, metric.values, labels, curry) { return i } } return len(metrics) } func matchLabelValues(values, lvs []string, curry []curriedLabelValue) bool { if len(values) != len(lvs)+len(curry) { return false } var iLVs, iCurry int for i, v := range values { if iCurry < len(curry) && curry[iCurry].index == i { if v != curry[iCurry].value { return false } iCurry++ continue } if v != lvs[iLVs] { return false } iLVs++ } return true } func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { if len(values) != len(labels)+len(curry) { return false } iCurry := 0 for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { if values[i] != curry[iCurry].value { return false } iCurry++ continue } if values[i] != labels[k] { return false } } return true } func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { labelValues := make([]string, len(labels)+len(curry)) iCurry := 0 for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { labelValues[i] = curry[iCurry].value iCurry++ continue } labelValues[i] = labels[k] } return labelValues } func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { labelValues := make([]string, len(lvs)+len(curry)) var iCurry, iLVs int for i := range labelValues { if iCurry < len(curry) && curry[iCurry].index == i { labelValues[i] = curry[iCurry].value iCurry++ continue } labelValues[i] = lvs[iLVs] iLVs++ } return labelValues } var labelsPool = &sync.Pool{ New: func() interface{} { return make(Labels) }, } func constrainLabels(desc *Desc, labels Labels) (Labels, func()) { if len(desc.variableLabels.labelConstraints) == 0 { // Fast path when there's no constraints return labels, func() {} } constrainedLabels := labelsPool.Get().(Labels) for l, v := range labels { constrainedLabels[l] = desc.variableLabels.constrain(l, v) } return constrainedLabels, func() { for k := range constrainedLabels { delete(constrainedLabels, k) } labelsPool.Put(constrainedLabels) } } func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) []string { if len(desc.variableLabels.labelConstraints) == 0 { // Fast path when there's no constraints return lvs } constrainedValues := make([]string, len(lvs)) var iCurry, iLVs int for i := 0; i < len(lvs)+len(curry); i++ { if iCurry < len(curry) && curry[iCurry].index == i { iCurry++ continue } if i < len(desc.variableLabels.names) { constrainedValues[iLVs] = desc.variableLabels.constrain( desc.variableLabels.names[i], lvs[iLVs], ) } else { constrainedValues[iLVs] = lvs[iLVs] } iLVs++ } return constrainedValues } client_golang-1.19.1/prometheus/vec_test.go000066400000000000000000000713461461713521000207610ustar00rootroot00000000000000// Copyright 2014 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "reflect" "testing" dto "github.com/prometheus/client_model/go" ) func TestDelete(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) testDelete(t, vec) } func TestDeleteWithCollisions(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) vec.hashAdd = func(h uint64, s string) uint64 { return 1 } vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } testDelete(t, vec) } func TestDeleteWithConstraints(t *testing.T) { vec := V2.NewGaugeVec(GaugeVecOpts{ GaugeOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "l1"}, {Name: "l2", Constraint: func(s string) string { return "x" + s }}, }, }) testDelete(t, vec) } func testDelete(t *testing.T, vec *GaugeVec) { if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { t.Errorf("got %v, want %v", got, want) } vec.With(Labels{"l1": "v1", "l2": "v2"}).Set(42) if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), true; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { t.Errorf("got %v, want %v", got, want) } vec.With(Labels{"l1": "v1", "l2": "v2"}).Set(42) if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), true; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), false; got != want { t.Errorf("got %v, want %v", got, want) } vec.With(Labels{"l1": "v1", "l2": "v2"}).Set(42) if got, want := vec.Delete(Labels{"l2": "v1", "l1": "v2"}), false; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.Delete(Labels{"l1": "v1"}), false; got != want { t.Errorf("got %v, want %v", got, want) } } func TestDeleteLabelValues(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) testDeleteLabelValues(t, vec) } func TestDeleteLabelValuesWithCollisions(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) vec.hashAdd = func(h uint64, s string) uint64 { return 1 } vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } testDeleteLabelValues(t, vec) } func TestDeleteLabelValuesWithConstraints(t *testing.T) { vec := V2.NewGaugeVec(GaugeVecOpts{ GaugeOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "l1"}, {Name: "l2", Constraint: func(s string) string { return "x" + s }}, }, }) testDeleteLabelValues(t, vec) } func testDeleteLabelValues(t *testing.T, vec *GaugeVec) { if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { t.Errorf("got %v, want %v", got, want) } vec.With(Labels{"l1": "v1", "l2": "v2"}).Set(42) vec.With(Labels{"l1": "v1", "l2": "v3"}).Set(42) // Add junk data for collision. if got, want := vec.DeleteLabelValues("v1", "v2"), true; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.DeleteLabelValues("v1", "v3"), true; got != want { t.Errorf("got %v, want %v", got, want) } vec.With(Labels{"l1": "v1", "l2": "v2"}).Set(42) // Delete out of order. if got, want := vec.DeleteLabelValues("v2", "v1"), false; got != want { t.Errorf("got %v, want %v", got, want) } if got, want := vec.DeleteLabelValues("v1"), false; got != want { t.Errorf("got %v, want %v", got, want) } } func TestDeletePartialMatch(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2", "l3"}, ) testDeletePartialMatch(t, vec) } func TestDeletePartialMatchWithConstraints(t *testing.T) { vec := V2.NewGaugeVec(GaugeVecOpts{ GaugeOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "l1"}, {Name: "l2", Constraint: func(s string) string { return "x" + s }}, {Name: "l3"}, }, }) testDeletePartialMatch(t, vec) } func testDeletePartialMatch(t *testing.T, baseVec *GaugeVec) { assertNoMetric := func(t *testing.T) { if n := len(baseVec.metricMap.metrics); n != 0 { t.Error("expected no metrics, got", n) } } // No metric value is set. if got, want := baseVec.DeletePartialMatch(Labels{"l1": "v1", "l2": "v2"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } baseVec.With(Labels{"l1": "baseValue1", "l2": "baseValue2", "l3": "baseValue3"}).Inc() baseVec.With(Labels{"l1": "multiDeleteV1", "l2": "diff1BaseValue2", "l3": "v3"}).Set(42) baseVec.With(Labels{"l1": "multiDeleteV1", "l2": "diff2BaseValue2", "l3": "v3"}).Set(84) baseVec.With(Labels{"l1": "multiDeleteV1", "l2": "diff3BaseValue2", "l3": "v3"}).Set(168) curriedVec := baseVec.MustCurryWith(Labels{"l2": "curriedValue2"}) curriedVec.WithLabelValues("curriedValue1", "curriedValue3").Inc() curriedVec.WithLabelValues("curriedValue1", "differentCurriedValue3").Inc() curriedVec.WithLabelValues("differentCurriedValue1", "differentCurriedValue3").Inc() // Try to delete nonexistent label with existent value from curried vector. if got, want := curriedVec.DeletePartialMatch(Labels{"lx": "curriedValue1"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Try to delete valid label with nonexistent value from curried vector. if got, want := curriedVec.DeletePartialMatch(Labels{"l1": "badValue1"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Try to delete from a curried vector based on labels which were curried. // This operation succeeds when run against the base vector below. if got, want := curriedVec.DeletePartialMatch(Labels{"l2": "curriedValue2"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Try to delete from a curried vector based on labels which were curried, // but the value actually exists in the base vector. if got, want := curriedVec.DeletePartialMatch(Labels{"l2": "baseValue2"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Delete multiple matching metrics from a curried vector based on partial values. if got, want := curriedVec.DeletePartialMatch(Labels{"l1": "curriedValue1"}), 2; got != want { t.Errorf("got %v, want %v", got, want) } // Try to delete nonexistent label with existent value from base vector. if got, want := baseVec.DeletePartialMatch(Labels{"lx": "curriedValue1"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Try to delete partially invalid labels from base vector. if got, want := baseVec.DeletePartialMatch(Labels{"l1": "baseValue1", "l2": "badValue2"}), 0; got != want { t.Errorf("got %v, want %v", got, want) } // Delete from the base vector based on values which were curried. // This operation fails when run against a curried vector above. if got, want := baseVec.DeletePartialMatch(Labels{"l2": "curriedValue2"}), 1; got != want { t.Errorf("got %v, want %v", got, want) } // Delete multiple metrics from the base vector based on a single valid label. if got, want := baseVec.DeletePartialMatch(Labels{"l1": "multiDeleteV1"}), 3; got != want { t.Errorf("got %v, want %v", got, want) } // Delete from the base vector based on values which were not curried. if got, want := baseVec.DeletePartialMatch(Labels{"l3": "baseValue3"}), 1; got != want { t.Errorf("got %v, want %v", got, want) } // All metrics should have been deleted now. assertNoMetric(t) } func TestMetricVec(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) testMetricVec(t, vec) } func TestMetricVecWithCollisions(t *testing.T) { vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, []string{"l1", "l2"}, ) vec.hashAdd = func(h uint64, s string) uint64 { return 1 } vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } testMetricVec(t, vec) } func testMetricVec(t *testing.T, vec *GaugeVec) { vec.Reset() // Actually test Reset now! var pair [2]string // Keep track of metrics. expected := map[[2]string]int{} for i := 0; i < 1000; i++ { pair[0], pair[1] = fmt.Sprint(i%4), fmt.Sprint(i%5) // Varying combinations multiples. expected[pair]++ vec.WithLabelValues(pair[0], pair[1]).Inc() expected[[2]string{"v1", "v2"}]++ vec.WithLabelValues("v1", "v2").Inc() } var total int for _, metrics := range vec.metricMap.metrics { for _, metric := range metrics { total++ copy(pair[:], metric.values) var metricOut dto.Metric if err := metric.metric.Write(&metricOut); err != nil { t.Fatal(err) } actual := *metricOut.Gauge.Value var actualPair [2]string for i, label := range metricOut.Label { actualPair[i] = *label.Value } // Test output pair against metric.values to ensure we've selected // the right one. We check this to ensure the below check means // anything at all. if actualPair != pair { t.Fatalf("unexpected pair association in metric map: %v != %v", actualPair, pair) } if actual != float64(expected[pair]) { t.Fatalf("incorrect counter value for %v: %v != %v", pair, actual, expected[pair]) } } } if total != len(expected) { t.Fatalf("unexpected number of metrics: %v != %v", total, len(expected)) } vec.Reset() if len(vec.metricMap.metrics) > 0 { t.Fatalf("reset failed") } } func TestMetricVecWithConstraints(t *testing.T) { constraint := func(s string) string { return "x" + s } vec := V2.NewGaugeVec(GaugeVecOpts{ GaugeOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "l1"}, {Name: "l2", Constraint: constraint}, }, }) testConstrainedMetricVec(t, vec, constraint) } func testConstrainedMetricVec(t *testing.T, vec *GaugeVec, constrain func(string) string) { vec.Reset() // Actually test Reset now! var pair [2]string // Keep track of metrics. expected := map[[2]string]int{} for i := 0; i < 1000; i++ { pair[0], pair[1] = fmt.Sprint(i%4), fmt.Sprint(i%5) // Varying combinations multiples. expected[[2]string{pair[0], constrain(pair[1])}]++ vec.WithLabelValues(pair[0], pair[1]).Inc() expected[[2]string{"v1", constrain("v2")}]++ vec.WithLabelValues("v1", "v2").Inc() } var total int for _, metrics := range vec.metricMap.metrics { for _, metric := range metrics { total++ copy(pair[:], metric.values) var metricOut dto.Metric if err := metric.metric.Write(&metricOut); err != nil { t.Fatal(err) } actual := *metricOut.Gauge.Value var actualPair [2]string for i, label := range metricOut.Label { actualPair[i] = *label.Value } // Test output pair against metric.values to ensure we've selected // the right one. We check this to ensure the below check means // anything at all. if actualPair != pair { t.Fatalf("unexpected pair association in metric map: %v != %v", actualPair, pair) } if actual != float64(expected[pair]) { t.Fatalf("incorrect counter value for %v: %v != %v", pair, actual, expected[pair]) } } } if total != len(expected) { t.Fatalf("unexpected number of metrics: %v != %v", total, len(expected)) } vec.Reset() if len(vec.metricMap.metrics) > 0 { t.Fatalf("reset failed") } } func TestCounterVecEndToEndWithCollision(t *testing.T) { vec := NewCounterVec( CounterOpts{ Name: "test", Help: "helpless", }, []string{"labelname"}, ) vec.WithLabelValues("77kepQFQ8Kl").Inc() vec.WithLabelValues("!0IC=VloaY").Add(2) m := &dto.Metric{} if err := vec.WithLabelValues("77kepQFQ8Kl").Write(m); err != nil { t.Fatal(err) } if got, want := m.GetLabel()[0].GetValue(), "77kepQFQ8Kl"; got != want { t.Errorf("got label value %q, want %q", got, want) } if got, want := m.GetCounter().GetValue(), 1.; got != want { t.Errorf("got value %f, want %f", got, want) } m.Reset() if err := vec.WithLabelValues("!0IC=VloaY").Write(m); err != nil { t.Fatal(err) } if got, want := m.GetLabel()[0].GetValue(), "!0IC=VloaY"; got != want { t.Errorf("got label value %q, want %q", got, want) } if got, want := m.GetCounter().GetValue(), 2.; got != want { t.Errorf("got value %f, want %f", got, want) } } func TestCurryVec(t *testing.T) { vec := NewCounterVec( CounterOpts{ Name: "test", Help: "helpless", }, []string{"one", "two", "three"}, ) testCurryVec(t, vec) } func TestCurryVecWithCollisions(t *testing.T) { vec := NewCounterVec( CounterOpts{ Name: "test", Help: "helpless", }, []string{"one", "two", "three"}, ) vec.hashAdd = func(h uint64, s string) uint64 { return 1 } vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } testCurryVec(t, vec) } func TestCurryVecWithConstraints(t *testing.T) { constraint := func(s string) string { return "x" + s } t.Run("constrainedLabels overlap variableLabels", func(t *testing.T) { vec := V2.NewCounterVec(CounterVecOpts{ CounterOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "one"}, {Name: "two"}, {Name: "three", Constraint: constraint}, }, }) testCurryVec(t, vec) }) t.Run("constrainedLabels reducing cardinality", func(t *testing.T) { constraint := func(s string) string { return "x" } vec := V2.NewCounterVec(CounterVecOpts{ CounterOpts{ Name: "test", Help: "helpless", }, ConstrainedLabels{ {Name: "one"}, {Name: "two"}, {Name: "three", Constraint: constraint}, }, }) testConstrainedCurryVec(t, vec, constraint) }) } func testCurryVec(t *testing.T, vec *CounterVec) { assertMetrics := func(t *testing.T) { n := 0 for _, m := range vec.metricMap.metrics { n += len(m) } if n != 2 { t.Error("expected two metrics, got", n) } m := &dto.Metric{} c1, err := vec.GetMetricWithLabelValues("1", "2", "3") if err != nil { t.Fatal("unexpected error getting metric:", err) } c1.Write(m) if want, got := 1., m.GetCounter().GetValue(); want != got { t.Errorf("want %f as counter value, got %f", want, got) } m.Reset() c2, err := vec.GetMetricWithLabelValues("11", "22", "33") if err != nil { t.Fatal("unexpected error getting metric:", err) } c2.Write(m) if want, got := 1., m.GetCounter().GetValue(); want != got { t.Errorf("want %f as counter value, got %f", want, got) } } assertNoMetric := func(t *testing.T) { if n := len(vec.metricMap.metrics); n != 0 { t.Error("expected no metrics, got", n) } } t.Run("zero labels", func(t *testing.T) { c1 := vec.MustCurryWith(nil) c2 := vec.MustCurryWith(nil) c1.WithLabelValues("1", "2", "3").Inc() c2.With(Labels{"one": "11", "two": "22", "three": "33"}).Inc() assertMetrics(t) if !c1.Delete(Labels{"one": "1", "two": "2", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("11", "22", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("first label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"one": "1"}) c2 := vec.MustCurryWith(Labels{"one": "11"}) c1.WithLabelValues("2", "3").Inc() c2.With(Labels{"two": "22", "three": "33"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22", "three": "33"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2", "3") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("middle label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"two": "2"}) c2 := vec.MustCurryWith(Labels{"two": "22"}) c1.WithLabelValues("1", "3").Inc() c2.With(Labels{"one": "11", "three": "33"}).Inc() assertMetrics(t) if c1.Delete(Labels{"one": "11", "three": "33"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("1", "3") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"one": "1", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("11", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("last label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}) c2 := vec.MustCurryWith(Labels{"three": "33"}) c1.WithLabelValues("1", "2").Inc() c2.With(Labels{"one": "11", "two": "22"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22", "one": "11"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("1", "2") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2", "one": "1"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("11", "22") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("two labels", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3", "one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33", "one": "11"}) c1.WithLabelValues("2").Inc() c2.With(Labels{"two": "22"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("all labels", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3", "two": "2", "one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33", "one": "11", "two": "22"}) c1.WithLabelValues().Inc() c2.With(nil).Inc() assertMetrics(t) if !c1.Delete(Labels{}) { t.Error("deletion failed") } if !c2.DeleteLabelValues() { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("double curry", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}).MustCurryWith(Labels{"one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33"}).MustCurryWith(Labels{"one": "11"}) c1.WithLabelValues("2").Inc() c2.With(Labels{"two": "22"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("use already curried label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}) if _, err := c1.GetMetricWithLabelValues("1", "2", "3"); err == nil { t.Error("expected error when using already curried label") } if _, err := c1.GetMetricWith(Labels{"one": "1", "two": "2", "three": "3"}); err == nil { t.Error("expected error when using already curried label") } assertNoMetric(t) c1.WithLabelValues("1", "2").Inc() if c1.Delete(Labels{"one": "1", "two": "2", "three": "3"}) { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"one": "1", "two": "2"}) { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("curry already curried label", func(t *testing.T) { if _, err := vec.MustCurryWith(Labels{"three": "3"}).CurryWith(Labels{"three": "33"}); err == nil { t.Error("currying unexpectedly succeeded") } else if err.Error() != `label name "three" is already curried` { t.Error("currying returned unexpected error:", err) } }) t.Run("unknown label", func(t *testing.T) { if _, err := vec.CurryWith(Labels{"foo": "bar"}); err == nil { t.Error("currying unexpectedly succeeded") } else if err.Error() != "1 unknown label(s) found during currying" { t.Error("currying returned unexpected error:", err) } }) } func testConstrainedCurryVec(t *testing.T, vec *CounterVec, constraint func(string) string) { assertMetrics := func(t *testing.T) { n := 0 for _, m := range vec.metricMap.metrics { n += len(m) } if n != 2 { t.Error("expected two metrics, got", n) } m := &dto.Metric{} c1, err := vec.GetMetricWithLabelValues("1", "2", "3") if err != nil { t.Fatal("unexpected error getting metric:", err) } c1.Write(m) if want, got := 1., m.GetCounter().GetValue(); want != got { t.Errorf("want %f as counter value, got %f", want, got) } values := map[string]string{} for _, label := range m.Label { values[*label.Name] = *label.Value } if want, got := map[string]string{"one": "1", "two": "2", "three": constraint("3")}, values; !reflect.DeepEqual(want, got) { t.Errorf("want %v as label values, got %v", want, got) } m.Reset() c2, err := vec.GetMetricWithLabelValues("11", "22", "33") if err != nil { t.Fatal("unexpected error getting metric:", err) } c2.Write(m) if want, got := 1., m.GetCounter().GetValue(); want != got { t.Errorf("want %f as counter value, got %f", want, got) } values = map[string]string{} for _, label := range m.Label { values[*label.Name] = *label.Value } if want, got := map[string]string{"one": "11", "two": "22", "three": constraint("33")}, values; !reflect.DeepEqual(want, got) { t.Errorf("want %v as label values, got %v", want, got) } } assertNoMetric := func(t *testing.T) { if n := len(vec.metricMap.metrics); n != 0 { t.Error("expected no metrics, got", n) } } t.Run("zero labels", func(t *testing.T) { c1 := vec.MustCurryWith(nil) c2 := vec.MustCurryWith(nil) c1.WithLabelValues("1", "2", "3").Inc() c2.With(Labels{"one": "11", "two": "22", "three": "33"}).Inc() assertMetrics(t) if !c1.Delete(Labels{"one": "1", "two": "2", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("11", "22", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("first label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"one": "1"}) c2 := vec.MustCurryWith(Labels{"one": "11"}) c1.WithLabelValues("2", "3").Inc() c2.With(Labels{"two": "22", "three": "33"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22", "three": "33"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2", "3") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("middle label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"two": "2"}) c2 := vec.MustCurryWith(Labels{"two": "22"}) c1.WithLabelValues("1", "3").Inc() c2.With(Labels{"one": "11", "three": "33"}).Inc() assertMetrics(t) if c1.Delete(Labels{"one": "11", "three": "33"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("1", "3") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"one": "1", "three": "3"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("11", "33") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("last label (constrained to static value)", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}) c2 := vec.MustCurryWith(Labels{"three": "33"}) c1.WithLabelValues("1", "2").Inc() c2.With(Labels{"one": "11", "two": "22"}).Inc() assertMetrics(t) if !c1.Delete(Labels{"two": "22", "one": "11"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("1", "2") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("two labels", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3", "one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33", "one": "11"}) c1.WithLabelValues("2").Inc() c2.With(Labels{"two": "22"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("all labels", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3", "two": "2", "one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33", "one": "11", "two": "22"}) c1.WithLabelValues().Inc() c2.With(nil).Inc() assertMetrics(t) if !c1.Delete(Labels{}) { t.Error("deletion failed") } if !c2.DeleteLabelValues() { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("double curry", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}).MustCurryWith(Labels{"one": "1"}) c2 := vec.MustCurryWith(Labels{"three": "33"}).MustCurryWith(Labels{"one": "11"}) c1.WithLabelValues("2").Inc() c2.With(Labels{"two": "22"}).Inc() assertMetrics(t) if c1.Delete(Labels{"two": "22"}) { t.Error("deletion unexpectedly succeeded") } if c2.DeleteLabelValues("2") { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"two": "2"}) { t.Error("deletion failed") } if !c2.DeleteLabelValues("22") { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("use already curried label", func(t *testing.T) { c1 := vec.MustCurryWith(Labels{"three": "3"}) if _, err := c1.GetMetricWithLabelValues("1", "2", "3"); err == nil { t.Error("expected error when using already curried label") } if _, err := c1.GetMetricWith(Labels{"one": "1", "two": "2", "three": "3"}); err == nil { t.Error("expected error when using already curried label") } assertNoMetric(t) c1.WithLabelValues("1", "2").Inc() if c1.Delete(Labels{"one": "1", "two": "2", "three": "3"}) { t.Error("deletion unexpectedly succeeded") } if !c1.Delete(Labels{"one": "1", "two": "2"}) { t.Error("deletion failed") } assertNoMetric(t) }) t.Run("curry already curried label", func(t *testing.T) { if _, err := vec.MustCurryWith(Labels{"three": "3"}).CurryWith(Labels{"three": "33"}); err == nil { t.Error("currying unexpectedly succeeded") } else if err.Error() != `label name "three" is already curried` { t.Error("currying returned unexpected error:", err) } }) t.Run("unknown label", func(t *testing.T) { if _, err := vec.CurryWith(Labels{"foo": "bar"}); err == nil { t.Error("currying unexpectedly succeeded") } else if err.Error() != "1 unknown label(s) found during currying" { t.Error("currying returned unexpected error:", err) } }) } func BenchmarkMetricVecWithBasic(b *testing.B) { benchmarkMetricVecWith(b, Labels{ "l1": "onevalue", "l2": "twovalue", }) } func BenchmarkMetricVecWithLabelValuesBasic(b *testing.B) { benchmarkMetricVecWithLabelValues(b, map[string][]string{ "l1": {"onevalue"}, "l2": {"twovalue"}, }) } func BenchmarkMetricVecWithLabelValues2Keys10ValueCardinality(b *testing.B) { benchmarkMetricVecWithLabelValuesCardinality(b, 2, 10) } func BenchmarkMetricVecWithLabelValues4Keys10ValueCardinality(b *testing.B) { benchmarkMetricVecWithLabelValuesCardinality(b, 4, 10) } func BenchmarkMetricVecWithLabelValues2Keys100ValueCardinality(b *testing.B) { benchmarkMetricVecWithLabelValuesCardinality(b, 2, 100) } func BenchmarkMetricVecWithLabelValues10Keys100ValueCardinality(b *testing.B) { benchmarkMetricVecWithLabelValuesCardinality(b, 10, 100) } func BenchmarkMetricVecWithLabelValues10Keys1000ValueCardinality(b *testing.B) { benchmarkMetricVecWithLabelValuesCardinality(b, 10, 1000) } func benchmarkMetricVecWithLabelValuesCardinality(b *testing.B, nkeys, nvalues int) { labels := map[string][]string{} for i := 0; i < nkeys; i++ { var ( k = fmt.Sprintf("key-%v", i) vs = make([]string, 0, nvalues) ) for j := 0; j < nvalues; j++ { vs = append(vs, fmt.Sprintf("value-%v", j)) } labels[k] = vs } benchmarkMetricVecWithLabelValues(b, labels) } func benchmarkMetricVecWith(b *testing.B, labels map[string]string) { var keys []string for k := range labels { keys = append(keys, k) } vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, keys, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { vec.With(labels) } } func benchmarkMetricVecWithLabelValues(b *testing.B, labels map[string][]string) { var keys []string for k := range labels { // Map order dependent, who cares though. keys = append(keys, k) } values := make([]string, len(labels)) // Value cache for permutations. vec := NewGaugeVec( GaugeOpts{ Name: "test", Help: "helpless", }, keys, ) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { // Varies input across provide map entries based on key size. for j, k := range keys { candidates := labels[k] values[j] = candidates[i%len(candidates)] } vec.WithLabelValues(values...) } } client_golang-1.19.1/prometheus/vnext.go000066400000000000000000000017331461713521000203020ustar00rootroot00000000000000// Copyright 2022 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus type v2 struct{} // V2 is a struct that can be referenced to access experimental API that might // be present in v2 of client golang someday. It offers extended functionality // of v1 with slightly changed API. It is acceptable to use some pieces from v1 // and e.g `prometheus.NewGauge` and some from v2 e.g. `prometheus.V2.NewDesc` // in the same codebase. var V2 = v2{} client_golang-1.19.1/prometheus/wrap.go000066400000000000000000000151731461713521000201120ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "sort" "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) // WrapRegistererWith returns a Registerer wrapping the provided // Registerer. Collectors registered with the returned Registerer will be // registered with the wrapped Registerer in a modified way. The modified // Collector adds the provided Labels to all Metrics it collects (as // ConstLabels). The Metrics collected by the unmodified Collector must not // duplicate any of those labels. Wrapping a nil value is valid, resulting // in a no-op Registerer. // // WrapRegistererWith provides a way to add fixed labels to a subset of // Collectors. It should not be used to add fixed labels to all metrics // exposed. See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels // // Conflicts between Collectors registered through the original Registerer with // Collectors registered through the wrapping Registerer will still be // detected. Any AlreadyRegisteredError returned by the Register method of // either Registerer will contain the ExistingCollector in the form it was // provided to the respective registry. // // The Collector example demonstrates a use of WrapRegistererWith. func WrapRegistererWith(labels Labels, reg Registerer) Registerer { return &wrappingRegisterer{ wrappedRegisterer: reg, labels: labels, } } // WrapRegistererWithPrefix returns a Registerer wrapping the provided // Registerer. Collectors registered with the returned Registerer will be // registered with the wrapped Registerer in a modified way. The modified // Collector adds the provided prefix to the name of all Metrics it collects. // Wrapping a nil value is valid, resulting in a no-op Registerer. // // WrapRegistererWithPrefix is useful to have one place to prefix all metrics of // a sub-system. To make this work, register metrics of the sub-system with the // wrapping Registerer returned by WrapRegistererWithPrefix. It is rarely useful // to use the same prefix for all metrics exposed. In particular, do not prefix // metric names that are standardized across applications, as that would break // horizontal monitoring, for example the metrics provided by the Go collector // (see NewGoCollector) and the process collector (see NewProcessCollector). (In // fact, those metrics are already prefixed with “go_” or “process_”, // respectively.) // // Conflicts between Collectors registered through the original Registerer with // Collectors registered through the wrapping Registerer will still be // detected. Any AlreadyRegisteredError returned by the Register method of // either Registerer will contain the ExistingCollector in the form it was // provided to the respective registry. func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer { return &wrappingRegisterer{ wrappedRegisterer: reg, prefix: prefix, } } type wrappingRegisterer struct { wrappedRegisterer Registerer prefix string labels Labels } func (r *wrappingRegisterer) Register(c Collector) error { if r.wrappedRegisterer == nil { return nil } return r.wrappedRegisterer.Register(&wrappingCollector{ wrappedCollector: c, prefix: r.prefix, labels: r.labels, }) } func (r *wrappingRegisterer) MustRegister(cs ...Collector) { if r.wrappedRegisterer == nil { return } for _, c := range cs { if err := r.Register(c); err != nil { panic(err) } } } func (r *wrappingRegisterer) Unregister(c Collector) bool { if r.wrappedRegisterer == nil { return false } return r.wrappedRegisterer.Unregister(&wrappingCollector{ wrappedCollector: c, prefix: r.prefix, labels: r.labels, }) } type wrappingCollector struct { wrappedCollector Collector prefix string labels Labels } func (c *wrappingCollector) Collect(ch chan<- Metric) { wrappedCh := make(chan Metric) go func() { c.wrappedCollector.Collect(wrappedCh) close(wrappedCh) }() for m := range wrappedCh { ch <- &wrappingMetric{ wrappedMetric: m, prefix: c.prefix, labels: c.labels, } } } func (c *wrappingCollector) Describe(ch chan<- *Desc) { wrappedCh := make(chan *Desc) go func() { c.wrappedCollector.Describe(wrappedCh) close(wrappedCh) }() for desc := range wrappedCh { ch <- wrapDesc(desc, c.prefix, c.labels) } } func (c *wrappingCollector) unwrapRecursively() Collector { switch wc := c.wrappedCollector.(type) { case *wrappingCollector: return wc.unwrapRecursively() default: return wc } } type wrappingMetric struct { wrappedMetric Metric prefix string labels Labels } func (m *wrappingMetric) Desc() *Desc { return wrapDesc(m.wrappedMetric.Desc(), m.prefix, m.labels) } func (m *wrappingMetric) Write(out *dto.Metric) error { if err := m.wrappedMetric.Write(out); err != nil { return err } if len(m.labels) == 0 { // No wrapping labels. return nil } for ln, lv := range m.labels { out.Label = append(out.Label, &dto.LabelPair{ Name: proto.String(ln), Value: proto.String(lv), }) } sort.Sort(internal.LabelPairSorter(out.Label)) return nil } func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { constLabels := Labels{} for _, lp := range desc.constLabelPairs { constLabels[*lp.Name] = *lp.Value } for ln, lv := range labels { if _, alreadyUsed := constLabels[ln]; alreadyUsed { return &Desc{ fqName: desc.fqName, help: desc.help, variableLabels: desc.variableLabels, constLabelPairs: desc.constLabelPairs, err: fmt.Errorf("attempted wrapping with already existing label name %q", ln), } } constLabels[ln] = lv } // NewDesc will do remaining validations. newDesc := V2.NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) // Propagate errors if there was any. This will override any errer // created by NewDesc above, i.e. earlier errors get precedence. if desc.err != nil { newDesc.err = desc.err } return newDesc } client_golang-1.19.1/prometheus/wrap_test.go000066400000000000000000000235741461713521000211550ustar00rootroot00000000000000// Copyright 2018 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "fmt" "strings" "testing" "time" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" ) // uncheckedCollector wraps a Collector but its Describe method yields no Desc. type uncheckedCollector struct { c Collector } func (u uncheckedCollector) Describe(_ chan<- *Desc) {} func (u uncheckedCollector) Collect(c chan<- Metric) { u.c.Collect(c) } func toMetricFamilies(cs ...Collector) []*dto.MetricFamily { reg := NewRegistry() reg.MustRegister(cs...) out, err := reg.Gather() if err != nil { panic(err) } return out } func TestWrap(t *testing.T) { now := time.Now() nowFn := func() time.Time { return now } simpleCnt := NewCounter(CounterOpts{ Name: "simpleCnt", Help: "helpSimpleCnt", now: nowFn, }) simpleCnt.Inc() simpleGge := NewGauge(GaugeOpts{ Name: "simpleGge", Help: "helpSimpleGge", }) simpleGge.Set(3.14) preCnt := NewCounter(CounterOpts{ Name: "pre_simpleCnt", Help: "helpSimpleCnt", now: nowFn, }) preCnt.Inc() barLabeledCnt := NewCounter(CounterOpts{ Name: "simpleCnt", Help: "helpSimpleCnt", ConstLabels: Labels{"foo": "bar"}, now: nowFn, }) barLabeledCnt.Inc() bazLabeledCnt := NewCounter(CounterOpts{ Name: "simpleCnt", Help: "helpSimpleCnt", ConstLabels: Labels{"foo": "baz"}, now: nowFn, }) bazLabeledCnt.Inc() labeledPreCnt := NewCounter(CounterOpts{ Name: "pre_simpleCnt", Help: "helpSimpleCnt", ConstLabels: Labels{"foo": "bar"}, now: nowFn, }) labeledPreCnt.Inc() twiceLabeledPreCnt := NewCounter(CounterOpts{ Name: "pre_simpleCnt", Help: "helpSimpleCnt", ConstLabels: Labels{"foo": "bar", "dings": "bums"}, now: nowFn, }) twiceLabeledPreCnt.Inc() barLabeledUncheckedCollector := uncheckedCollector{barLabeledCnt} scenarios := map[string]struct { prefix string // First wrap with this prefix. labels Labels // Then wrap the result with these labels. labels2 Labels // If any, wrap the prefix-wrapped one again. preRegister []Collector toRegister []struct { // If there are any labels2, register every other with that one. collector Collector registrationFails bool } gatherFails bool output []Collector }{ "wrap nothing": { prefix: "pre_", labels: Labels{"foo": "bar"}, }, "wrap with nothing": { preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}}, output: []Collector{simpleGge, simpleCnt}, }, "wrap counter with prefix": { prefix: "pre_", preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}}, output: []Collector{simpleGge, preCnt}, }, "wrap counter with label pair": { labels: Labels{"foo": "bar"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}}, output: []Collector{simpleGge, barLabeledCnt}, }, "wrap counter with label pair and prefix": { prefix: "pre_", labels: Labels{"foo": "bar"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}}, output: []Collector{simpleGge, labeledPreCnt}, }, "wrap counter with invalid prefix": { prefix: "1+1", preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, true}}, output: []Collector{simpleGge}, }, "wrap counter with invalid label": { preRegister: []Collector{simpleGge}, labels: Labels{"42": "bar"}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, true}}, output: []Collector{simpleGge}, }, "counter registered twice but wrapped with different label values": { labels: Labels{"foo": "bar"}, labels2: Labels{"foo": "baz"}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}, {simpleCnt, false}}, output: []Collector{barLabeledCnt, bazLabeledCnt}, }, "counter registered twice but wrapped with different inconsistent label values": { labels: Labels{"foo": "bar"}, labels2: Labels{"bar": "baz"}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}, {simpleCnt, true}}, output: []Collector{barLabeledCnt}, }, "wrap counter with prefix and two labels": { prefix: "pre_", labels: Labels{"foo": "bar", "dings": "bums"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{simpleCnt, false}}, output: []Collector{simpleGge, twiceLabeledPreCnt}, }, "wrap labeled counter with prefix and another label": { prefix: "pre_", labels: Labels{"dings": "bums"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledCnt, false}}, output: []Collector{simpleGge, twiceLabeledPreCnt}, }, "wrap labeled counter with prefix and inconsistent label": { prefix: "pre_", labels: Labels{"foo": "bums"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledCnt, true}}, output: []Collector{simpleGge}, }, "wrap labeled counter with prefix and the same label again": { prefix: "pre_", labels: Labels{"foo": "bar"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledCnt, true}}, output: []Collector{simpleGge}, }, "wrap labeled unchecked collector with prefix and another label": { prefix: "pre_", labels: Labels{"dings": "bums"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledUncheckedCollector, false}}, output: []Collector{simpleGge, twiceLabeledPreCnt}, }, "wrap labeled unchecked collector with prefix and inconsistent label": { prefix: "pre_", labels: Labels{"foo": "bums"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledUncheckedCollector, false}}, gatherFails: true, output: []Collector{simpleGge}, }, "wrap labeled unchecked collector with prefix and the same label again": { prefix: "pre_", labels: Labels{"foo": "bar"}, preRegister: []Collector{simpleGge}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledUncheckedCollector, false}}, gatherFails: true, output: []Collector{simpleGge}, }, "wrap labeled unchecked collector with prefix and another label resulting in collision with pre-registered counter": { prefix: "pre_", labels: Labels{"dings": "bums"}, preRegister: []Collector{twiceLabeledPreCnt}, toRegister: []struct { collector Collector registrationFails bool }{{barLabeledUncheckedCollector, false}}, gatherFails: true, output: []Collector{twiceLabeledPreCnt}, }, } for n, s := range scenarios { t.Run(n, func(t *testing.T) { reg := NewPedanticRegistry() for _, c := range s.preRegister { if err := reg.Register(c); err != nil { t.Fatal("error registering with unwrapped registry:", err) } } preReg := WrapRegistererWithPrefix(s.prefix, reg) lReg := WrapRegistererWith(s.labels, preReg) l2Reg := WrapRegistererWith(s.labels2, preReg) for i, tr := range s.toRegister { var err error if i%2 != 0 && len(s.labels2) != 0 { err = l2Reg.Register(tr.collector) } else { err = lReg.Register(tr.collector) } if tr.registrationFails && err == nil { t.Fatalf("registration with wrapping registry unexpectedly succeeded for collector #%d", i) } if !tr.registrationFails && err != nil { t.Fatalf("registration with wrapping registry failed for collector #%d: %s", i, err) } } wantMF := toMetricFamilies(s.output...) gotMF, err := reg.Gather() if s.gatherFails && err == nil { t.Fatal("gathering unexpectedly succeeded") } if !s.gatherFails && err != nil { t.Fatal("gathering failed:", err) } if len(wantMF) != len(gotMF) { t.Fatalf("Expected %d metricFamilies, got %d", len(wantMF), len(gotMF)) } for i := range gotMF { if !proto.Equal(gotMF[i], wantMF[i]) { var want, got []string for i, mf := range wantMF { want = append(want, fmt.Sprintf("%3d: %s", i, mf)) } for i, mf := range gotMF { got = append(got, fmt.Sprintf("%3d: %s", i, mf)) } t.Fatalf( "unexpected output of gathering:\n\nWANT:\n%s\n\nGOT:\n%s\n", strings.Join(want, "\n"), strings.Join(got, "\n"), ) } } }) } } func TestNil(t *testing.T) { // A wrapped nil registerer should be treated as a no-op, and not panic. c := NewCounter(CounterOpts{Name: "test"}) err := WrapRegistererWith(Labels{"foo": "bar"}, nil).Register(c) if err != nil { t.Fatal("registering failed:", err) } } client_golang-1.19.1/tutorial/000077500000000000000000000000001461713521000162535ustar00rootroot00000000000000client_golang-1.19.1/tutorial/whatsup/000077500000000000000000000000001461713521000177465ustar00rootroot00000000000000client_golang-1.19.1/tutorial/whatsup/.gitignore000066400000000000000000000000341461713521000217330ustar00rootroot00000000000000internal/e2e_* whatsup.yaml client_golang-1.19.1/tutorial/whatsup/ContribFest.pdf000066400000000000000000036561011461713521000226770ustar00rootroot00000000000000%PDF-1.4 % âăĎÓ 3 0 obj << /Type /Catalog /Names << >> /PageLabels << /Nums [ 0 << /S /D /St 1 >> ] >> /Outlines 2 0 R /Pages 1 0 R >> endobj 4 0 obj << /Creator (ţ˙Google) /Title (ţ˙KubeCon 2023 EU: Prometheus ContribFest) >> endobj 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 6 0 R /Resources 7 0 R /Annots 9 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 6 0 obj << /Filter /FlateDecode /Length 8 0 R >> stream xś˝UÍn1Ţí©óSPRăńŚ˙E¤JH+ő@9D@ˇ¤%…GŕÍx‰ÜĘ9OÁxĂf7Ů4´ °–מńxľń7ţ™* ©<^tX[i?L` ZiŤŃ«ą´X—Ĺ(5 g˝Óĺôq-m=§ÎÖ„ôÁ)\ČúĎĆ_F ĂŻ‚`Rő C‘ŽAS$¸î5‚ó#x+eÚ@©,âťá@bŤä#«Ă2MŐ¸ˇŠŮ•şzf­[&H ·uŻ$¶RËĆ)vl˝¬FÍŢPĹľPíŚg+]‚!K%9l…“b^“â ú///ľpQQúç«iŤR˝x‘‘EΊŹđşŮ÷ü¤”F»ůŁĽ“Íółłüž4ĽčÁ{(^ĂqqçHhK$̨РăV<ÝYŠĎСbboŰ€\2«j۵ ˘ŢD("©Ö˝ßŕóabó$?Ě®ł'Âi!bMę ҉`Omč˝×Â~‡Ęs¶Ńa$ĹkÜ #Ĺ‚“AąŮAłěioáG8K{ŕ6 mA6˛ĂšČÝ,ĎßHy ‰ř™ýHř‡)9{,ĐX­‚ŹŢµÁn™ľ)x/#ŢýLÜBšţ™Uĺ}Sĺzíľ9‰Í{˛uҸdŞ#ŞdÓ‘4—Mł×•DnC $‰Ôhuh‡»ää·ů¶·…µ±fqˇ/Ź rD +Ęq­DËheýF”Ő즮ń ý ç§G囌:ç–Dé 9¨7LúŻ&á'†—ż©Jĺ’š_ endstream endobj 8 0 obj 586 endobj 9 0 obj [ ] endobj 10 0 obj << /CA 1.0 /ca 1.0 >> endobj 11 0 obj << /CA 0 /ca 0 >> endobj 14 0 obj << /Subtype /Image /Interpolate true /Width 400 /Height 397 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 15 0 R /Filter /DCTDecode /Length 16 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔŤ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůRŠ( Š( Š( Š( Š( Š( Š( Š*晦^ę“ů:}¬×–¤…ÉŔ$ôÜńIµvT!)ľX«˛ťčGĂ NĺCęW0Ř©Sňć¸9ŕ\cś†=żăIđ§0sl×’$5ÓoŚm)Qý+Š®cFž‰Ýůľ"ĹÖÖK•y˙–ç‡YÚ\ŢÍĺYŰÍq.3˛$.ŘőŔ®‡Mđ'o„L,MĽNOĎpÁ6ăŐ~đéé^íkm¤ ¬1Á çlq¨U98ŢĄ®™¬ßÁÍĄ:łoÓOó<’ÇáUë‡ű~Ąo1łÉF—=sśíÇo_µ,~Y&˙·ęW3g<”X±ëśîĎoJôz+–Y†"_hô)äx(}‹ú·ţv8›?†š o”Ţ\®1ĺË( őů@?­]˙„Ă?ô ˙Čň˙ńUÔŃY {b;ˇůťę?MµĂk^ŐôbćúĆU‰FLČ7Ç‚p>aŔÉěpys^…,]*şFZž.'+ĹaUęCNëTcQEĐyáEPEPEPEPEPEPEPEPEPEPEPEPEwIŇďu{Ák¦Ű´ó[h rO}}E&ÔUŮQڦÔb®ŮJµôęzôˇtëfhĂmi›ĺŤ:g-ę2N;W¦x[ὝŽŮő˛—· äD¤ůKÁě[§~9#­wŃFÄ‘D‹hˇU`(…yUóHÇJJţgŇ`¸rs´ń˲ßţâpZĂ=6Ö-ú˵ôě¸(¬ŃĆ‡Ž ’#$Ň»«[h- XmaŽW;cŤB¨ÉÉŔő-äUŻRłĽÝĎ©Ă`čaU¨Ĺ/Ďď (˘˛:BŠ( Š( Š+?\ŐěôM>K»ůBFŁ…o˙uGs˙ë8ši9;"g8Â.RvHТ¸˙řŽ˙Ä÷—·RB¶ş|GAKovÁ$Čq’¸čűă=vuiĘ”ą%ąž D=Ą=žŢaEVfÁEPEPEP)ŻřEŐ˘ýŐşX\*íI- ďŤĘ8<źcŔŻ0ń'ő}|ľWÚě×'Ď€ghäĺ—Şđ2O g­{ŐŮCVŽ—şó<śfK†ĹknYw_ä|ąE{׉|¤ë{ĺňľÉxŮ>|Ź',˝“’x'kČ|Iá}OĂ̦ţ%09Ú“ÄŰ‘Ž3ŹPző88Î+ÚĂăi×Ńhű#ŽĘ+ŕýćŻëőěaŃEŘyaEPEPEPEPEPEPEPEPEPE>(ŢiR(Q¤‘Ř*˘Ś–' ąŻađ7€SJš GVe–ů@d€ ¬žąţ&{śg\řŚL0ńĽľă»—ŐĆĎ–šÓ«íýv9x÷YXîŻËYéîˇŃ° Ę3ü#řFSęW°i]–‘f-tŰu‚Ŷ‚I$÷$ňO×ĐUÚ+籺‡ďmŘűśYGq^][ßţQEĚz!EPEPEPEPWSÇkk5Äí¶Q¤vÁ8P2N=|÷âŻ^xŹPóî¤)‘ ĺbů““߀ŢüfŐš8,ô¨dÇ›™çQJ„čA;Ž9ĺAăż”W»–a”aíe»Řřľ!Çş•>­¤wóđ?3Ü~Ú}›ÁńKżwÚ¦’lmĆÜ÷ű™ük˛®ŕýÔ“řQá‘Ă {‡Ž5ŔT€ÝşüĚÜźé]ĹyX»űißąôŮeľ©O—˛ (˘ąÎࢊ(˘Š(˘Š(˘Š(¦KMĹ2,‘ş•daŔőwú( Ď5ńgĂX§Ýsáâ±JK3ŰHŘB1ŔCŽ #ˇ8ůş¨ĺ2ĆđĘńLŤĹY`©AŤ}A\÷‹|)aâX܆ę0DsĆ@ç†ÄąçwÁ5ęasv®«ąóyžC׫†Ň]ş?ň>}˘´µÝ˙CĽk}BŚî!$ě r­Ür>™çłkÝŚ”•ÖÇĆΧ' «4QE2BŠ( Š( Š( Š( Š( Š( ¬XYÜj‘ZŮDÓ\JŰQ©?ĐwĎj]6Ę}Jţ ;D/<Ě@©öIě}ᏠŘxvĚCf»ć`· 0Ňź\v€~§$ńâń‘Ă«nŮëey\±ňm»En˙DSđG…-ü5dK›P•q4Ŕp]‹čżĚŚžŔtÔQ_9R¤ŞIĘNěűÚ!B ť5d‚Š(¨5 (˘€ (˘€ (˘€ (˘€ (¨®§ŠÖÚk‹‡Ů HdwÁ;T “ĎJ¸›I]ź=řĘűűKĹ:ťČhŮ ĹŁ9VUůTß!AÍbŃE}„"ˇĐü®­GVnovď÷žđsRÚíÍ• yW‚ItÉ€m.yôʱ×Í:5űézµĄô[‹A*ɵ[nŕ+źB2?úFŇâ+»Xn-Ű|3"ČŤ‚2¤dc^iK–˘šę}źbyč:/xżÁ˙Áą-Q^aôAEPEaézčŐ&Őo<#ńîęÖ%[[ˇŻ ,ë€ńŃ·çÎz‚sľ®Übő±ĹŤĆÇÔšĽ[łňó=zЎˇę֚ޝí„›ân<27uaŘŹţ¸ŕWëEĹŮîuÂqśT˘îV_ŠżäWÖ?ëÎoýÖĄex±‚ř[X,@c”sţᪧńŻR+˙ ^ŚůĆŠ(ŻŻ?, öż„šł_řuí&“|ÖO°g$ůg•É>ဠQ^)]oĂ Téľ+·ŤÜ,cěďO'î`ű€=‰ú×:ʵ˘íşÔőrlOŐńqoihţ{~6=ÚŠ(Ż™?C ä~%x…´=Glqyyş(Č$\|Îî21ČäçśW]^ń V]cĹ7SC'™m „ńŤ«Ô‚:‚Ĺ>„}+·CŰU×e©ägX×…Ă>_ŠZ/Ő˙]Î÷ŕĽ.}p©‰¤ąňŮňyUE*1Ó‚Íůý+Đ«‚ř3˙"˝×ý~7ţ€•ŢÔc]ëČŰ)I`é۰QEĘz!EPEPEPEPM[OUÓn,nÔg]­ŽŁĐŹppG¸ŻńW‡®ü9¨›kˇľ&ɆuYúÜv÷ôMexźDÄD¶7 Sq €dĆăˇÇć±=+·‹xyYü/ó<śŰ,Ž:ť×ƶ˙/ëcç*Ţ©c>™¨ÜY].&Ę7čF@8#}Ş•ô‰¦®ŹĎĄâ÷AESQEQEQElxOG}w^µ±ü¦mÓ2đV1÷Žpp{F2ELäˇ'˛.ť9Uš„wzoÂo «Á¬ŢFÂŢţŽY_[źîö }î‡ĺ"˝z˘µ‚;[Xmŕ]°Â‹.I€2yč*ZůlMw^Ł›ů¤eř(ਪQß«îŠ(¬ТŠ(˘Š(˘Š(˘Š(ŻřÍ˙#EŻýyŻţ†őěŐá_.%›Ć—qČŰ’Ž8ĆÚ»cß–cĎ­z9Z˝kůIG gŐŻŐš?őÁc«É¦\I¶Ţ÷÷QÓ©n $ ŻdŻ—â‘á•$‰Ů$B]N ‘ĐŘ×Ňš5újšMĄô{ÜD˛W‘Ęäw űŠÓ4ŁË5Qu9řsçNT%öu^Źüźć\®S⌞żWtVs f±óŕzś~€×W^qńŞďf—¦ŮěĎ›3Mż=6.1Ź}˙ĄqŕăÍ^+ĎňÔőłZŠž¤źk}ú~§‘ŃEő'ćÁEPŇ^Ô—WĐěoŐ´Ń}ŠB‡čŔĎ ü:žµŁ^ađ[R-CKrˇ ĆH8VÉé„üĎ^Ţź_)‰Ąěj¸ĄĺŘź­aˇUď×Ő-ÔŽ‘á˝Bő #Ů@%]ľU8<`1ükç:őĎŤW{4˝6ĎËĎť3Kż=6.1Ź3ô÷Ż#Żg+§ËK›ąň|E_ÚbU>‘_‹×üŹLř'qÝjÖĚŘšDŽE\UKsőuüëŐëÁ~jŮţ0˛Ý'—ĆmßĺÎíĂĺß8^¦kŢ«ĎĚáË^ý˙áŹw‡«)ŕÔ?•µúţˇEWž{EPEPEPEPEPń+Â˙Űšp»µâţŃބəz”ŕg<|ľäŽů_Q׌üUđßönĄý©j¸´ĽsćeňVc’xô={óžěe¸Żůs/—ů)Äu×Ö©Ż_ó˙3‚˘Š+Ú>H(˘Š(˘Š+Ý~řy´=Ër1yy¶Y(¸ůPÜdçÉÇ8ĽĎáÖ…ý·â(ĽäÝgk‰¦Čʶ>ęäö=@j÷ŞńłLFÔcó>݇0Wľ*kÉ~ŻôűŠ(ŻúТŠ(˘Š(˘Š(˘Š(˘Š(Ż™ő[ż·ę——›<ż´LólÎvîbqžýkÜľ#ęCMđŤéĘů—+öd ż ӡ۸óÇ…x{yM;FS}t>?‰«§8Q]5=żŻ0Żhř;zn<55«Ę­g!S(Śͷ׋פ|» ©ęV~^LЬŰ÷tŘŘĆ=üĎÓŢşssP~Zž~EWŮă"»Ý_3ÖëĹ>/_}§Ĺ"ŮZM¶Şcňîo•î Śű{ ö‰dHbyfuŽ4RĚěp¤žÂľlÖµŐuk»éwžVp¬űŠ‚x\ú€=…yůU;ÔsíúžďWäˇKy?ÁÁ±JŠ(Żxř ˘Š(©ři¨}Ć[Ąňâ¸Í»üąÝ¸|٧8N¦kŢ«ć}*ď쥝ćĎ3ěó$Ű3ŤŰXg·JúbĽ,ÚśeÝgĂ5y¨Îźgżţń/‹×QÜx»ĘŚ8kkt‰÷bKńĎL8ôç5ÄÖߍn%ąńn®÷ ąÖĺâű aPíQÇ P+˝|49)F>GËăŞ{\MI÷l|2ÉÉ,.ńËGC†R9Đ×ŃŢÔ†ŻˇXß‚Ą¦ÚÇ <ŕ0#𯛫Ńţë~Eôú<Ç÷wš:HĚ:wQžNßzą̈{J\ëxţG§c=†#ŮKiéóéţG®QEóÇÝQ@Q@Q@Q@Q@TŐ´ř5]6âĆě ëµ±Ôzî÷nŠi´î…(©+=Ź™µKôÍFâĘévÍ”nĐŚă‚9ĐŠ«^·ń‡CY¬aÖ @%€§#řź”őěÜp2wz ňJúś-u^š™ů¶cx:î—M×§ő QEĐp…WEŕ!µŹZDUX\LC)E#‚PNż^•&©ĹÉô4ŁJUŞFśwnǬ|9Đż±<;ś›o.±4ŮeĎÝCŔ<ǡ-]MWÉÔ¨ęIÎ[łôęcBśiCdQEA°QEQEQEQEQE2YžYťcŤł;©'° 6<źă>§ćę6Zlo” Ň“#sp/bČĎgüüŢ´5ýN]gXşÔ'^wČ^>U*đpÇ8¬úúĽ5/eJ0?3Çâ~µť^ŤééÓđ ě>]=żŚ­â@Ąnc’'Čä»ř÷ĘÖ¸úé>ÜÁiă>{©Ł‚ó7I#QŘ “ďOą¨Éy1`%ÉŠ¦ďoy~g¦|SÖ˙˛ü:Ö±\ßć!íńž„t!{›#Ąx}ořçZţÝńÍĚlŮ?s¬jN I-Ď#8íX– ‡±¤“ÝęÎŚßőĽK”~˘˙?QEÖyEP_LÚßAq¦E~Ĺk$"pŇávˇ]Ůnp0:ó_3WĽG"Kđ´´N®ŁH*JśŚpGÔGÔW•šC›“ÖßyôĽ9UÁŐ·ký×<Š(ŻTů ©m.%´ş†ćݶM ‰°ďQQCWŃŤ6ťŃôʇµ{}oI‚öŐЇQć"śůoą‘ôçĐŠŇŻřI®ýX}6áńm{÷7QÓ©ŔÜ8čI!E{5|¶.‡°¨ăÓˇú>YŤúćT{ěýBŠ(®cĐ (˘€ (˘€ (˘€ (˘€ (˘€"»·ŠîÖkk…Ý ČѺ䌩##Ř×ͺńş^©uc>wÁ!L•+¸Ă`ö#{ú^Ľ§ă6’±ĎgŞĂ<ÜÁ; X ˇÇRHÜ3Ď ý,˛·%NGłüĎźâ,/µ «%¬&y•Q_@|8W°üŇVßGźS’Ü(˘Š(˘Š(˘Š(˘Š(˘Š+”řť¨¶ťá Ż/x{¦ŞÁAvKźUVĽţ5Ő׎üdÔÖç\¶°M„YĆYČ0wÁ ç‚6„#§źN¬/iZ+˘Ôó3ŚOŐđ“kw˘ů˙ŔąçÔQE}AůĐQEQEQEQEWŞG#Ĺđ@´nČÄ%N ĆúHükĘë˝Ón?âĎę±Í7üľ,q+·ĽmµA˙së\¸ó(‰¦W>GWÎ8*(˘şĎ,(˘Š|R<2¤°»G"0eu8*GBc_Hč:śZÎŹk¨@6¤é¸Ż'kteÉ8 ŚăśWÍuëźu?7N˝ÓdžFLť­Á{FN;żçćf”ą©)­Ńô<;‰öx‡Ií%řŻř=Š(Żűp˘Š(˘Š(˘Š(˘Š(˘Š(¬Źé§WđޡdŚ’DLj¬gSąFO,˙Zµč§8ÉIt"Ą5RŮ«.Q[ţ:Ó?˛|Sn©¶6,G±v·8Qč2WŹîţ__ ©ĹIu?.­JTjJś·NÇIđîÇíţ0Ó¬…"=™ÝŘ7}ŕŁńŻŻ&ř)jŹŞ]’ŢlQ¤JăI9÷ůë^ł_?™Ďš·/e˙ű~ŁÉ„çţfßéúQ^yî…Q@Q@Q@Q@Q@|ׯßiëwס¤ežftóX.~PzôöŻ}ńuŕ°đƧpehYmÝRDÎUŘm\Č;çµ|ç^ÎS %?‘ň\M[Zt—›ýęQE{'ĘQ@Q@Q@Q@[Žďf—qgł>lŃMż=6,÷ó?J©E&“Üq“‹ş (˘‚Š( »„÷R[řĘŢ(ŐJÜĹ$O‘Čwä{ĺášă«OĂ.‘x“I’WHăK¸™ťŘ*¨2I<ďYWŠť9Eö:pu=–"ě×ć}!EWɧ…Q@Q@Q@Q@Q@Q@[ń«O;´íIă o#îŕ ß|˙ő«Ë«Ţ>(Y­ßoÉid€¤ŃíÎT†›ŃKuăöŻŻŁËgÍBÝ´> (űůCúWkXžµŽĎÂ:LP—*Öë)ÜA;śo=şeŽ=˝knĽ,DąęĘ^gŮ`)ű,58y ˘Š+¬(˘Š(˘Š(˘Š(˘Š(˘Šä>*ÜÇ.Ł×GqŐţJkÂëŮľ3ČŻk˙_‹˙ =xÍ}V­BţgÂńś±vě—ę˙P˘Š+Ń<˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ę:(˘ľ4ý`(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š«ŞÚ}żKĽłßĺý˘‡~3·r‘śwë_3WÔuóg-â´×µ+kuŮ 72F‹’pˇ'Ú˝Ś¦_}”âzzS©ęż/ř'ŃZm˘ŘiÖ¶hĹ’Ţ$1ęB€3úUš(Ż»»łę’IYQ@Š( Š( Š( Š( Š( ;âŢÜx:iY6ŇÇ*Ü“łđsůW†×Ńľ+±ţŇđŢĄiĺ]ŕc‚\ §ţ<|ĺ^öU;ŇqěĎŠâZN8Ô¶Ť~)˙ÁAEW¨|ŕQEQEQEQEQEQEQESŕŠIćŽ#y%‘‚" %™‰Ŕ¤Ó+sŔöŻyâí&(І[…”–é„ůĎă…?ŤEIrE˱Ą~Ö¤`ş´ľóčz(˘ľ@ýP(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+Ŕ>"ŰĹmăMQ ]¨]d#$üĚŠĚyő$š÷úđ_‰ßňw‰Rú´_÷żF{ŐQ^aôAEPEPEPEPEPEP_:řżJ:7ď¬Â‰d/‘ĺ·*2y8Üú*Ľăă‰çŘÁ¬B>{|C7=Pź”őěÇ ťŢŐčeµ˝ť^Włţ‘áçř_o†çŠÖüş˙źČň:(˘ľř0˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ŻGř3¦yşŤć§"e`AeŁČÜÜ’±`ű?ççô?‚´˘xnÎÎUQq´É6˝ŽH$’8\÷Ú+ĎĚ«{:<«v{™ŰbąŢĐ×çÓüţFĺQ_:}ŕQEQEQEQEQEQEWŚüf˙‘˘×ţĽ×˙CzöjńŹŚ¬ŠmŔ •´@qŰçzô2Ďăü™âqű›őGłŃUt«ż·évw›<ż´B“lÎvîPqžýjŐp4Ół=¨ÉI)-QE†QEQEÎxëUÔ4=j:jE/”á%IFP+q»‚AÚńÁAj—¶6’ł¬w4LPŕ€ŔŹŔŐŇ’ŚÓ’ş1ÄBU)J0vvŃůžeańYÂÄş†–¬Űży$ăŚőAç·sí] ŹÄŹÜď󤹴یyĐ“»éłwO|uŻŐl'Ňő‹+µŰ4Q¸ B2Á ÷UJú eŘy«ĄoCâ!žăhľY´íÝ•ŹĄěő]>öfŠĘţŇćUŠĂ2ą¦pNE\Ż—+bÇĺ݋DmµKµX—j#H]cml®éÇÉ<Ąý‰}çĄK‰×ü˝§÷?ó˙3躊îŢ+»Y­®|3#Fë’2¤`ŚŹc^9ań;ZbK¨­.•[çvBŽă=2§h8ă;:čl~*Ů>˙·i·0ă<—YsëśíÇoZĺ–_†©_Đôéç*ŞÎVżuý#Î|SŁK ëw2e‘NčśóˇčzsčqĆA“^ąâŤ_Ă^0ҢµMN;Kőýě-q@Ť´ĺČŔľP:ŕäuíájʤ=ői-ĎŹĚpôčŐnŚ” öµľďQEŇyáEPEPEPEPEPEwF˛MGS‚Ö[¨,ăüÓĚŘTdźŻç“i+˛Ł9(­ŮÖü*đ÷öž®u•?e˛`ËÔo—ŞóßO?ÝěkÚk‰·ń…Ľ?Ą­Ť•ŰζËĹ,ç8$6śś’sÎ;VN§ńVĘéšl˛e8{‡ µůţÎGNă¸ă­xé×ĹTćQvésíđuđYmNU}m®ż+ězeá÷ßŐsŔž+Ö|M­yw oťĽfIL0¶ž qÔ·ť§ŢĽ~˝ĎántĎ G4Ş˘{ÖóÉÚ2Ź#7¶ăĹF2… =ă^†™V7ŽĹ%9ű«Wm>GaEW}€QEQEQEW‚üN˙‘ăR˙¶_ú)+Ţ«çß7Iyă-RXYDGpç(ˇá•?…zyRýë~_Ş>w‰Zú´W÷żF{'€îĹďô©D~^ŘD8Ýśě%3říÎ;g˝oWđ~âYĽ&ńČŰ– —Ž1€6®±ůłĆ»ŠâÄÇ’¬—™ëeő=¦śźdQEbvQ@Q@Q@]ń‹B˙Q­[Çé ÎŐ˙ľ\ŕŔI'ű€W–×Ó—Öv÷ö’ÚŢ“[Ę6ĽmĐŹéőŠůăÄú,Úł5„íćlĂ$ˇJ‰Ś‚3ůŁ ŚśW˝–âyă쥺üŹŠâ ĄWë^ě·ő˙ţfUQ^ˇóEPEPEPEPEPEPEPEPEPEPEPEP˙ôOíď[ÚČ3l™š÷·Py$/Śçµ} \§Ăꮇ Ç$¨ë}v«$ű‰ă®ŐÁ‘×$óŚc«ŻšÇâ=µM6Gč.ę{Ëâ–Żô_×VQEqŔQEQEQEWÍ:ŐŇ_k7÷qXî.$•Cu‘ź~kčťnéětkű¸B™ ·’U 2 U$gŰŠů¦˝ś¦?˝“âzźĂ§ę˙/ř'Łü»ŮŞjV{3ćÂłoĎMŤŚcßĚý+×+çż]?é2üÂóBçëLţłřWЕϙÖ·7twpín|/'ň·řëţaEWś{ÁEPEPEP\§Ä §4Ć–Ú%ţÔ€~ĺ÷mŢ3ĘÜuĆzŕ]]tęJ””ăş1ÄP†"›ĄQhĎ—ćŠH&x¦FŽTb®Ž0TŽ#±¦W©|TđźŢÖ´»VĽD?ů/ç»đ8űĆĽ¶ľ§^5ŕ§óŚvx:ΔţOş (˘¶9Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˝ág…ľßr5‹ô•míÜ5°č%p~ösś)ŘžüpĽáIüKzı†Â<éGSźáQÜź^ż`}âÖíma·JĂ ,h¤“…Q€2yčyY†3‘{(=zůI‘ĺn¬Ö"˛÷VŢoü‘-Q^öEPEPEPEP!ńRôZx:á3 {™)ŰťÇ>ŰU‡ă^^™ńŞ˙uÖ›§«H6#Nëź‘·Ş~Łk~~ćĽÎľŹ-§ÉA>úźź×ö¸·‘I~ż¨WŇ>Ô†ŻˇXß‚Ą¦ÚÇ <ŕ0"ľnŻYř5«‰,î´™YŚ‘1ž,±#aŔ`08=yŢxëQ™ŇçĄÎşpî'Ůb'´—â¶ýOJ˘Š+çϸ (˘€ (˘€ (˘€ (˘€ áeřaˇĽ®ë5üjĚHE‘pŁĐeIÇԚ)Öť/ŘçŻ„Ł‰·µŠv8/řUş'üýj_÷ń?řŠ?áVčźóő©ßÄ˙â+˝˘µúĺćg?öNţ}Ł‚˙…[˘ĎÖĄ˙˙Łţn‰˙?Z—ýüOţ"»Ú(úĺćaý“˙źhŕżáVčźóő©ßÄ˙â(˙…[˘ĎÖĄ˙˙®öŠ>ą_ůdŕ˙çÚ8/řUş'üýj_÷ń?řŠ?áVčźóő©ßÄ˙â+˝˘Ź®WţfŮ8?ůöŽ ţn‰˙?Z—ýüOţ"ŹřUş'üýj_÷ń?řŠďhŁë•˙™‡öNţ}Ł‚˙…[˘ĎÖĄ˙˙Łţn‰˙?Z—ýüOţ"»Ú(úĺćaý“˙źhŕżáVčźóő©ßÄ˙â(˙…[˘ĎÖĄ˙˙®öŠ>ą_ůdŕ˙çÚ8/řUş'üýj_÷ń?řŠ?áVčźóő©ßÄ˙â+˝˘Ź®WţfŮ8?ůöŽ ţn‰˙?Z—ýüOţ"ŹřUş'üýj_÷ń?řŠďhŁë•˙™‡öNţ}Ł‚˙…[˘ĎÖĄ˙˙Łţn‰˙?Z—ýüOţ"»Ú(úĺćaý“˙źhŕżáVčźóő©ßÄ˙â(˙…[˘ĎÖĄ˙˙®öŠ>ą_ůdŕ˙çÚ(hzM¦‰§GeaČ—’O,íÝ÷'˙¬0~Š+žRrw{ťĐ„a«$QE"‚Š( Š( Š( Š+ Ćú±ŃĽ3{uśŻ—Ěďn¤rŘ˙dŐBrQ[ł:µcJ¤öJç‹xâů5/jw1lňĚľZ˛8u`€ `Gąü{ÖW×B*Q]ËęÔujJ¤·mżĽ+oÁšżö'ěďĘÁ»dŘ':ăďcÔ Ä˘‰ÁN./fjĘŤHÔ†éÜúŽŠäľjË©xVŢ&“uÍźî$S´ŁîŰp2q’§®3]m|•ZnśÜCôě=xâ)F¬vjáETQ@Q@Q@qZ‡ÄŤĆţćŇ[kó$´LV4Á*H8ůúq]­|áâŻů5Źúü›˙C5߀ĂÂĽšźCĹαŐppŚ©ug©ÂŇŃ?ç×R˙żi˙ĹŃ˙ KD˙ź]Kţý§˙^3EzŮ”<ţóçÖgu÷Í˙ KD˙ź]Kţý§˙Gü--ţ}u/űöźü]xÍfPóűĂýaĆw_qěßđ´´OůőÔżďÚńtÂŇŃ?ç×R˙żi˙Ĺ׌ŃGöe?Ľ?Ögu÷Í˙ KD˙ź]Kţý§˙Gü--ţ}u/űöźü]xÍfPóűĂýaĆw_qěßđ´´OůőÔżďÚńtÂŇŃ?ç×R˙żi˙Ĺ׌ŃGöe?Ľ?Ögu÷Í˙ KD˙ź]Kţý§˙Gü--ţ}u/űöźü]xÍfPóűĂýaĆw_qěßđ´´OůőÔżďÚńtÂŇŃ?ç×R˙żi˙Ĺ׌ŃGöe?Ľ?Ögu÷Í˙ KD˙ź]Kţý§˙Gü--ţ}u/űöźü]xÍfPóűĂýaĆw_qěßđ´´OůőÔżďÚńtÂŇŃ?ç×R˙żi˙Ĺ׌ŃGöe?Ľ?Ögu÷Í˙ KD˙ź]Kţý§˙Gü--ţ}u/űöźü]xÍfPóűĂýaĆw_qěßđ´´OůőÔżďÚńtÂŇŃ?ç×R˙żi˙Ĺ׌ŃGöe?Ľ?Ögu÷Mé÷I}amwań,Ş`€Ŕź~jĹexSţE}ţĽá˙Đj×ĎÍZM#î)IÎśdú¤QEI QEQEQEWücŐĹƧmĄÂͶŐ|ÉFâvŽ™ Îyűäzתj·đišuĹíÓm†.Ü€O îOz‘_8ę·óꚍĹíŰ–žw,Ü’ $ŕ ;+ÓĘčóTuËó>s±~Ίˇ忢˙ú•(˘Š÷ĎŠ (˘€:ox‹ţím^v?aśysŽNx|¤}±Ö˝öľ\ŻlřYâ%Ő4uÓ¦âňĹä‘űČú)cîŚ)üyŻ4ĂÝ{hüĎŞáÜ}›ÂĎ®«ő_ŻŢvôQEx§×Q@Q@Q@|áâŻů5Źúü›˙C5ô}|áâŻů5Źúü›˙C5ëe?˝âoáSő‘—EW¸|pQEQEQEQEQEQEQEQEQEQEôw…?äWŃ˙ëÎýV­exSţE}ţĽá˙Đj×ČTřß©ú–řQô_QEÁEPEPE›â^ßCŇgľşeÂ)ˇl ëÉúqÉč)Ć.MEnLçqs“˛Gń‹]˙Q˘ŰIé5ÎÓ˙|!Á˙G÷MymO{u=őÜ×Wrg•‹»žä˙ž•}VЎMAšăńo^U^Ý=:Q[śaEPZ^Őî4=Z ëV`Q†ô "g”=x?N8=EfŃJQRV{ Ęś”ŕěŃôΗ§§[ŢÚ¶čg@ëČČőäő­WŠ|2ńOö=đÓď^4Ó®_q‘řň¤ĆgĐŕž#>×_/ŠĂĽ<ůzt?EËqŃĆŃS[­×QEĚzEPEP^)Żř#Ä7zöĄqo§ď†k™$FóăRĂޕítWF<;nNv_OŤ«v˙†g‚˙Ââoú˙äxżřŞ?áń7ýň<_üU{Ő×ý«[˛üĚó?Ő¬/óKď_äx/ü &˙ oţG‹˙ŠŁţĐ7˙#Ĺ˙ĹW˝QGö­nËń˙0˙V°żÍ/˝‘ŕżđ€x›ţżů/ţ*Źř@ň+«9Z›r:őúŹnőîľ ńeż‰,ö°ę1.f€t#¦őő_Ôb| ¬é÷·:uě7vS476äuíţ#±‚8®LV8ö}ĎO,̧źx˝×ęĽĎ¦¨®+á˙ŚÓ]‰lµTŐx=ŕôoQřŽ2k_9V”©IÂ{ź}†ÄÓÄÓUi;¦QEfnQEQEÉcI˘x¦E’7R¬Ś2 ŽâźEŐĎ›5í2]X»Óç;žÚąz«`Ś‚;fłëÚ>(xZMbŃ5 >&’ţÝv˛)ćHą8»r:g'©ŔŻŻ©Âbzj]zź›ćx`«¸}—·§ü˘Š+¤óŠ( Š( Š( Š( ľ…đN‡ýáč-$ąoŢÜsźŢdpHŕąg˝y·Â˙ K¨ęPę×*ĆÖMÉśćYLc°89éĆ9çĎ^gćj”^ŰźaøMFAÁÁ8ŻźÄŕç‡wz®çÜeů­j˛v—oňîjQEČzEPEP^mńŔ¦í®5mY®XďšŐTă€óq’K{đ}&ŠÖ…yPź<\fž2›§QŔ>\˘˝÷Ĺ Ňü@Ď<Ęö÷Ĺp."<śĺčçˇŔ"Ľ»^đµĄÍű‹wż› %˛–n§AČ8ă3_ACJ¶ŤŮůźŤÉq8WtąŁÝ~«ˇÉŃEÚyEPEł řkU×$Achć<Îălj2;»ă=O^*e8Á^NČŇť)Ő—-4Űň1«°đO‚.|Bżk¸ŰiĘŔoÇĎ/<„íĆ1¸÷ěpqÚxoá­Ť„«>­*ßČH‹aXŃúž˙8Ď8g#ž;óÉÉë^N+3VĺŁ÷źM—pűż´ĹíüżćŃ^ÂÎßOłŠÖÎ%†Ţ%Ú˝ţ§ľ{ŐŠ(ݶÝŮő©(«-‚Š( aEPE ĺÔVĎqw4pŔ,ň6ühJú nÚ˛jä|găkOoµ…~Ó©ĘĆ>ädôŢsžśŕrqŰ ×!ăÓ]µđűIo,ŻrFAÓĺţčӦ9óšőđąk~ýo»üĎ—Ěłő ŇÂę˙›§ËúűËZ–ˇw©Ý5ÍýÄ—7ń9ÎIŔ‡'ŔŞ´Q^ŇI+#ä%''y;°˘Š)(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*{+ąěnŁął™áž3•t8" ˘“I«1ĆN-J.Í«áo‰‹#Ąż‘"Oú\jpHÉÁäq’8šô›Ko-ُµ•&‚A”‘C ăő~ó hiÎŁŁĚdÓ.ĺ·-‚ÁNUđ”đq“ŚŽ3^f#,ŚýęZ>Ý?ŕEâ”—&!s.ýŕ˙ZźIŃ^c üRY&ňőŰD‰Y¸šÔ¨ T’p99žśWˇişĄŽ§™§ÝÁrˇUFŕ• 27Ş}ŽŇĽz¸j”~4}N0Ăâ×nżqrŠ(¬NŔ˘Š(˘Š(†ŁŁéş–ăcmpě†=ňF …ç€ÝGSĐń\Ý÷ĂÜěňcą´Űśů3»ëżwOlu®ÎŠÖęSřdŃÍ[B·ń źËő8/řUş'üýj?÷ń?řŠ–×á–… ë$Ź{p9ŽI@VăľŐň5ÜQZ˘ęŘvGňăpŘ9<µćľ!ńnŻŻnKËŤ–Çţ]áů#íÔun@<“ÓÝC/«WW˘ó˙#ĆĹç¸l=Ô4Ľ¶ű˙Ęç¦x«âź¦!‹Jhő ł‘•oÝÇĆA,8nHŕÇ$W”x^Ô5ëˇ>Ą6ý™ňăQ„ŚśůrrNIĹeŃ^Ö N‡Âµî|–74Äc¦íËoř!EWQçQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Mis=ťÂĎi<°Ną $NU†Fçˇ#ń¨h¤ŇjĚi´îŽĎFř‹­ŘlK—Žú´beĂ…pĂąŰwóĎm¤|LŃîÓ‚Ma(RNĺ2!9Ŕ¨ÎqĎ*Ű>-ErUŔQ©Ňއ©‡Î±t4Rć^z˙ÁüOĄ4ÝgMÔöŤ>úÚáĘy›@\/•ę:Ž˘Ż×Ë•Żaâ]jÁ˘6şťÚ¬CjFŇ@1Śm9\cÚ¸g”ż±/Ľö(ń2Ú­?ąţŹüĎŁ(ݞř•ŻŰÄRcitĹłľh°@ôů Ś~ëf/‹"A6Ž­ s-ÎĐOrÓí“\ŇËk­•ţgŁO?ÁOy5ęźésŐ(ŞúeĎŰ´Ë+Í›>ÓslÎvîPŘĎ|f¬W N.Ěöc%$š (˘ÂŠP+ÍőO‰ß`Ôď,˙˛<ĎłĚńoűN7mb3Ťśt­hĐ©YµM\ĺĹcháuĄků7ůŹExÍßĹ f_9míě FÜěft§$ŕ‘ôÇ·jĂ˝ń§o"ÍŞNŞva ĎŐ8çĄvÇ+¬÷iUN#ÂÇáMüżĚ÷«ŰŰ[„··0[F[hy¤ ôÉďÁü«™Ôľ!x~ËpK‰.äWŘVŢ2}yÜŘR8ę ë^,Ź4Ż,®ŇHěYťŽKÔ“ÜÓ+®žUńĘ˙ĺÖâZŇŇ”ő×üŹ@Őţ(jw*SM¶‚ÉJŹśź5ÁĎ$ă`©ďřqšž©}ŞKćj7s\0%‡ä…Ď]Ł˘ŹaĹR˘»éáéŇř#cÄÄc±źâÍżËîŘ(˘ŠŘĺ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€?˙Ů endstream endobj 15 0 obj << /Subtype /Image /Width 400 /Height 397 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 17 0 R /Filter /FlateDecode >> stream xśíťw`eúÇw7…Ф˘‚€ ‚pś˘`‡“Ó‹"Q~bl§±—OEí@EÄ*-€…`EŠ@(Ň‚@Ęü˛3[¦ĽS÷)»É~ţ~gžďűĽÉÎĚű>ĹçK’$IťÂßú”~C˙śź_PXXTôß™µĽZT4©đŃüü19çźÚ6•[_=ˇíﮞ0eöŇ’]Ő’5űľ[ţÎîÖŻ} ·ä:IJ×?=đü‚oËmVAŔŃM‹§=<ĽG:÷ ę ţěś‚y+Ý/„Žó sł“˙,1ŃtĐCďďy%Tě[ňř­ąg•řłó¦o„\Š(;ćĺ÷Kţ|ąˇĂÍ3¶â¬E=sď:•{–‰Á19E?á®EdMfćµăžmśÓ+ż8ö'· ŞWJ~ŞpňCë)×"ĚÖ§úúą§ôśĽ‰c1öőK.‰Š®%|‹ˇ°urrIŤ\j·ůAĂ×ă[qű‚˙ ™ö@°¨^SŻźî­ňżá^=; ;q{…‹>/âöľĘ·/ p»†ž´Ü5ÜŽ7gS~sn˙ĐҢ ”ŰçÖ”M>ŰGtt—?TZŽÎěĂí'˛_Şŕöµ3jćőçö>=r»Ů +‡pű —ój¸]ě’ĺą}†G·™ńń!îŽâÜ~Ăář玠ů¬lĆ]Ż˘ÝĽćíÓą}O“‰xű"nhäk´íö’T==‹Ű°ř‡ăąëŔÍÁ=§|´űËş§·é˝ĎS_ČűMŤ÷âYPřáÜ^„˘íKŹńĘßí0< ><…Ů‘ ¤O8čŁçB["Úpô©ÄßÖę»ÓCEˇ3˝vUV˘ě¸Š×›±’9őűovxcüL+ŢďŔęĐظt3ŞoÖ7 zŐŽ†ýy‰zÎ~ü<\Ď”ť1ő®%-«{2:Ő;7ěFöËč¨-ô·] ĺ÷¦ńąŐ#­ŢĆöĘü¨±ę}±/şńyÖC÷`»dż*ö¶5¶1ĺů‰tĆž1[ý•˝NčÖŚĽ“8y$稯W§:µĹ·gdĎP6»"Ą€"D}°Úd¦7áň± ÚČ.×Ř 0ťs­ďÎädç\€ý–«p±Öę&ŁFĘGńxŮ1ů4é4«uf? ±*˘(ž33^ ňÂťá)Dv|żďY'|Aä˝:Ë7±µ7‹łíŠyСáI˝éS¨,‹¨Ěçđ¶-wťAÔb÷đ˙Bf[Äsń—5’BřľÎh~ťuď75JbĄečCFű·šńCzź[pꩬAxZwji<=ŐłqĎulIř’R˛K¨˝nĘŔý¤3Y¤á!R "*ó¨ýnÂđŁ´.ŃŤV‰qq˛>†z3ďxˇŚO‰Ux6©&P?I·‹uŚqy›ß0´Mă.@çcZ–Ľ+VŇÂ]\É8âŇú_‡ʬ,™h˘e¶››¬Î\€ŁŽuAĎâLĘ’LÄ uqŹ5™'`=ő>ć;4L™†4'KÎ5Q“î|kÓ±ľ{Đô­ŕ şŕĄYŃŃLĎżśŢáŕ©>ß'x??†p˘ř‹đ¦dAµil`o‡w¨ąÂçk™ż¤ĺ:„ů'âŚ,(3Wä°"Jđ…ŕBTŤ0â>Ś:#sv™KşŐŃ V§â«źM~ ňWÜ ™ó“ą¦&N(+䬳YČ*©äV¶ýí U/:¸ţoňHôzŤSI÷˛†óZřŇBV_űËż‘ó?ÓđJ„y‚h)‚\BZ´XËr+a_Ů^®”ěˇŔľ‹d)‚ôEŮ‹sČGVĘlźčs•q}„ÖĎ8‰&$Ô“íD…¦eÖWź¦Ś»”BéQšŇ@ÇŘ˙(xc­Łő·,Ĺý×ŮĹ4ů¸»O˛Ô C*Z¬ěeéCěbĽj©®źĺµUáxt˘xĆď2ń×ăy4őÓkď>ضÎs–ęüßZ];#<Ś*°śűđÄ ~CµüŘfÔĂÖúî¶ş6Rˇ’,Ţ÷ äϡß}Ř|:ßf-°­Ĺ«řŠČ(şřkAě ÝPC¦ď•m¤Ěµô'‰‘Ł×Fĺ+7§ú2Äĺhö=Şö·+Ë­™G…ąĚôĘMŃ`ËÁµ›R†WĄÉ˙?\éß…ědY%ŻŰeâ§šľÜô{őf¬A;QʬĽ*\ď*‹A¶§ˇ7ą°Z·ŐCľÓ–Ł?ú®Ő‰aSÓM‡TŘľ°t5yĺX¤ÓibĆ ,Çq;Ń…˙>l+sźŮí…._9Z=.*ŽüŢLj ¤!Ö¤ sEÄÚ8ł!ďŰ+!Ľ°BóCgůĘÎ6„śĎÇt_±–fÖ8gŠ˝ŇĆÂî ł4c#•Ţ^ ߹٪ę“!·;Đ*|úhż[,?ă¸v5|ÍH2nrŁ&˙ N>Ż.\Wˇ „:#‡O†]WÁ±žÉQY4©¨ëd ;đłńşůÚ!-¨Ď˙K@żBęwŞ»m¤ ;GmTQäŕu·–łŚęŰA‘ÇşV_µľ”eDšŰ«­f‰>?-OkŁNAÖęGü™`:Z¶µ„Y b,¸–ŁÚě"Ń3ëgŠŃ_÷~D‚ůčxd1|ľ®TM7iíŠ6aŻKÔsšţ:ăŹ…ŕ™Ź L3ŞY¦ä"­áTA‹Óľ(şNęĺĆsS†T˘Ň±Ż†Ď—G¦wşÎňK†ÁÔZtńŇËŚ#MJÍżc\Š ímBšů?ťé‹ #ć % ĐĄŁ ÝĐÍ+B @DÍ— Śľýbša—÷QDzµÓ#Ţ$›W” 1w=˛:¦ĘP´č-ý?:Ö­Ůţ<ÚX0ât3‹bcKsŰx(8Ö¬]íĹśŁľě3Ń4ô’ćŽd{_‹ Ďj5Ö‰é¨a‘‹Ł'Uý[÷/á–"Ĺ1dťNWO’n5Ú˙N;âyŇŐq?ąÂNó?aąV¨Ĺ!vÁ‚ ¶¤u)Ľ×Gr·őťťyˇ˛%†ä[7%bfł@ŔHÍ7ÇžŞČ“˛;±Ż<ča! ·Ľ±Jkw™¬RŐŚâŁ)uš iÍ’WTŢŃőB„ =Ôµ’ókąKÉ۹άŤŁüOx¬3&ĚÉĆ`qTXeBÓě"WňŁô«Í†tĺIK=ĎĺB„ŔËô!ÎÓToś}Ő™31rˇů;˙{¤S ó™§wŢ3h˙xÄE·ŻVŤXčN䌹ÂüŚw é# s7ë°pÄ ÝU#ß'VśľÎp6¨b5í$Cüčˇ_^oÚ §ĄEëđT·1##_1­>ăŢnČ[R…ëđŚ×CWZ—şçiuTęrפ?±ľ3!‘-÷9î&PË?” mBčúđT*růßn’CFW3!‘3Ű+ÝMŔ©üÍ0ŽsBIÚáę Bý«úą©’đÖN÷%đBńBďŮ ëŚ_{I„>XŔ’ĹÄâî0UŇ ôUęüä}SŘď`ÓäLjQ6Q(F»KÁGëˇjĹ: A ÉsäűĹęrK»ĚFZD=ý f‘€>†”ěm¸ Ü{ş ¤/ÂTË_ÍőĚ Ö2)VŹ[Ó\’®s3ţĂÔ¨ĺ[S9¨Ý DśłË­9`Ľk€eËôëOÔJvŕţ\Ó;Ü冑ôůŇcZFţsĺ&żßłĄž®Ć§r„bm0Ó43»üÓQ}Xć…ü9M¬…ĽB×!ônW‘ŽuwÁŐöŞáy@¬…˛vŚŚ— Cw \&"5ÁěSoĆJ±–ŤöWÂ".óIfĄŰ+¨JŰŞ©ÖUěf!,5mbw¸VąµB •b)žaw#2ŕ(R-FśEű¨čOí… úBž2ä‰t˙ŚÝݶ–Ę0#ăR*uoDUő8ÂĄ·ÁeÎş/š•KĘ™Fäo»1ćBäij?Ľńţ›ZĂbrW;‚¨µ†A1ËĆČŕvvőĚÉÔ~Ri(uŰŠ<  V3)äĎŃ †‚ͤĄT7ăđ¶ÖP{"H^ĹăÔ ľgpµ#^ŁöDCŘů>Twp„}’°9¨ËI˘˙ rUꀒë©=!Łűˇ.Ż$Içł8Űô®˘Kr!Ďá¬6ĽáĹ YÔ®Ńĺv΢¶ż™Ĺ×Npě`é[”RŰ˙„ÇŮNŘBí M’d{ró/pyŰžĎÉťäj ô#îçň¶=óÉťDłĄx/ąyWq´ĽLîŚ ˙SK ˙&őV‘„ňś$MÖzűńŔśť{ĺArg©RĄĄ¶^S%\Č T‘”ôą×ŰůÜm KÖ¦VĂrăVYAÜ\Kî Uq™IäĆťÖFăŕ roȨ¶Üß'7nW—žę}RiTÁäĆÝW˙¦ĄPC-‘Ö}…ć79nSÓéÔ°€ăčm;+ČCzwČD*Cťc?š¸=­őń­GäHŠĽb˘$Íćt¸ Ň»C&RG’áłęU¬0˝_EK{Đ6”YÄépz|I«Â>˘·ý5§Ăm¸‰Ţ2{Ă~¤·˝ŤÓá6Çv„ ElúÄ”ÇńţîD{ů8„>@šsŘŽăóŹ—8üd€b˙$ŰgńúÜ †Ç©BŽbźĄvąűvidg„ąE±‡m‡eŐüĆᏠˇ›\Űń»Ő‰Ă2O)X΋ă÷„ĺçB&”†ţ‡í#.ÚďŃňĘbâŠ6ULÎQú§’7™Ó™Ůůň¸|!ÓEÖŔp\«p7łó|Čĺ ĺŔ–ĽňUuq÷IÉö·)٤H‘'«E@mćĺú[Ţ~p°şôdďľ2đ‘rË|Ŕ[~Ş›f»?>ľĚî×ë`{*§›“µßvj5?ÎĽç˘Vú ÇÂřM&””?đ–’`G*­÷Ř×6Y]ÉĎł-'UµáŐńÄý _N˙­Ü´Ő„Y“®¦ýňç™ ßhr×™ÎçpńäÜěTÓ A·XVîy.ä=w¦™Ď:í¬±Żý$şhs6a á–jĹE7÷¶iéúHßݮܳ;ä=mŃŽ˝˘p‰ˇíű‚›«PńÚžW¬rc‹ż¬0©; ]wrÓ6÷ '1XOŁ×mŻhkný=&‡Ć6!iל ç8mt [Z#t\š şQPĺ4j¤őŕ‡Ţů9|U c~g˙ʰŠň•“‡uqs)la˝pÎ1č?ťô´› µąäŢ7ĺ>Će§¸ą ’,ůáQůŐËcÎr𠥡;ě–WŰĐma·të‘ôěÜÉĹßdş˝ ††k~™W“íéö"¨ă~ ßxŁůO~i*l:ŤO»ÓĚßfmh›©ţ7ĐŰJY_–ąÖo‘7!Đt‰˘Ď|\± Öm‘ŕčußÖŹč:YÂ7î |ci§›¨H‡îktUřÎiĐAö›Ó9Ex(|ŻČ­¶ěŽzđ’^U/ş—żúÖ›2zІ[ˇ}v0zďgˇď-=Âç(šívŮŠčÍÁ×Z*?‘ĎU$łŐ25zó~ŕ7×¶ «{´OŇP…4E‹»\PfŔ;ě<Őí7Áß~ŰÍŇDâ|xIęý;Ŕ »w˛y ťBÉM…hř§“$ýÚ‰Ë]č`t`Óäî]Ť`@Zŕň2ÇDđ–ćÄú’4†ËaČ`üşK׫-¤"> 8p—ÇPÁé‡wŞĆN•xËgˇ%Jţë^mT9Ć]Šë®ÚžÁ)·ŻűÓ˝Ĺt¨ŹĎ1-Ť‰ű´VŽAŞ3´Ş®ť„t8€ă¨ţ:;XeÍâ«”𣠅#ú ¬˛šŐXü†ĹťHnú\o­áî,ŃĽ”ó*í'ě ĂĎ^—…Ĺu'Ú¤Z-qcř2^Ůň¸¬[é…Ŕ{h>jg0ö*š­ęşrÚ¬c˝ŃŘp4cRiÝŘ7ąŻö¨ŕ-´bać5u!ܤb_© ö>Ă3?E1ĽÓ6KFC™č«ąĎž$ÝLî?`ŻFôΑE×<ÜPޓڰ )źŠ»1MîHčĎB˙tLßHâ1,*–'ňÎâ3¨®Ů 6:Ő¨4…Ö… ·Ŕ{JlőXäÚţqX®ÝŁ+Ç 4±‹Üh­f_‚‚Ü2g—YB)FXQ[L‹Bg˛<­—śg¶ľ¸ĄŐG¶™‡ ŽâÖV±¨@Üś·IýäóőđÍçW˙ŘbU^u$·şúÇ“ËákYÁ-ŻŢq¶Őzř^á–WßXkąľó¸őŐ7n·^ßnő‹Ăv ‚îâVXżxŐf9|™É':%ú0j#¨“I´śD©Ä­±>1Á~=ü?Řß& †v îò>+/Ay Ë#o9X_‹CHÖăŞ×  ëKFčíČ_?äJ—őçáěö µĂ«OĚőzę!"őSîé$:Ą­—Ăçë\Ć=ˇÄ¦ş' F@o=Âe¸®’u4bŕ«ŕëŃĄŤný ˘řrř|}“•Ľ2 a9|ľ1ÜÓJT¦˘,V§é:O1Ô>‰žŚUÜSKDv»ËLsC‡=Ü“K<* -‡Ďwar#Ë-¸»ÚrO/Ń ąme$e.˛ţa9´üŚ;ť/™7nČXŽ;X˘)˝€»[đ»üe~‡:nčĐ‚U Of6Á :ŁöŤěC0is©¤i4ŢŻq’L!B&âT¤›&‘‹ŘŹďF˘9„8o&˘¦ćHÜ7 řKĐLÇ}ÓUăm‹Č&!ó$ÚD–zK˘ő†˙?XÓ8@÷WdÖ<–Ć–çá–´w°&Ň‘rţ_f±.“rµ¤ÍCš‰°7;}‘&Q{^[Ň‘šy‚Ä€;ĺď8sř˙łÜHŁĄ(s9Š˝ăŁ§;ÓfĽ+šáO]C7n((íB7 m×aLgÝÂĐżÇ{ý…Xi†±Ů[s •üĆ{ä˙t"•|ŃŚ"̨Jý-âż?J˝sŕ§TAt@89řÚmÝPh2ľCˇ‘>^ů:îĺđůR^źŐ’”F[Á…/oF!Ü„ů…nřMęĄń°µŚ«†žŮEř˘;VfQ–ŽŻÚ#ŹO !>_ĎŔ’ĄBÚťiKúBź©c… G€~×=’‹­Řťˇëď{­ÁéŔ1ű1ŁB˝ĐxwńPWLµMż‡U»©;¦ZO4Ž\ü˘1žV?Pʼn0kŹÇÓę>l°ő"Ľgúł BĄçńß>©ă/” @" šÂŞ LT÷Ű(Xu(´ <ů4!ó]Hm_Q¤ű+ŕ¤ËÇÁ »ň·Ş î«ÂśĽpŢŇ+@_†)H?Çۉ ź…|‰)9BS׏%IďQ'ÖĹČŔíłźó†D“ÉÝ—~ŤŻÝ\'´ŤtŘ3*%&5n ~q“Hąl ¤¶ŚËđ*$ű¤’yqtňä†F… ;Ś;ó=}¦ä†QÎjí':BŐWŘVŕú9Ňl,l#Ţ˝#ôźC!-¶ŠYőÂŐ‹üf‚nßH5E”Ń÷(ôZ ę‘Ú’˘!ŽrÁRű?ţ °éc{‹˙0đšż˝ű—Ţ–˙&î#gě¶zđî8=wrKă‡CűF’*>}fxoA–^ÓÓŻ*üˇZpőó öhEűH%®™ődáů·ćĺĺĺßS8éőϰŠy,>“ۇ°ô\‚ä(Öâö8ë C´ČŘy§çOŃxĆ?d ·g˝°=/nârˇ ä$Ü˙ČŽş»A9Ŕ‘¸ě‡•4»™ŰËNŮűhKnoQRĚíi'lČ­ÓżTzMŹ÷BľĹC°˘#ă“ΓÁó“ਚŽŃ "Î9ajaLď~ą·ox š y¨ BÍÂś:ůńçvůąW@Í=ÂMúĚČ3µ˙udC=F˛Ć.ĎvÍ×­÷˙*ZćÎΙvAMń8Ţ20ń×’$Ă”ăFżu€v1ĘÜI]Á?±ôĘ_Hô\łŞ°_„¨s’uӛ蟊eÜ‘üÇpAÖÂb¤÷ŕš’˘ÜNÜóKDZ )\\עjő”ëxޱÖ˛†äO/Ř ®)™Y0¤SňyBósÇL]˛Ĺ몔®v×…ü•ôęé' úóÄ+w:]‡}«g=qŰĺÝ)?ÔKRZź|öă{nćÂ…Ĺ«Vmܸm_-;7n\łjĺÂ…ł_(ś0jčąŮmőxď˙Ĺ’Á– endstream endobj 16 0 obj 15970 endobj 17 0 obj 7670 endobj 7 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 18 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 19 0 R /Resources 20 0 R /Annots 22 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 19 0 obj << /Filter /FlateDecode /Length 21 0 R >> stream xś­”Ín1Ç×ABęüßČŃ‘ĎÜ LŢÄĺ’CrŮËöKŽQ^ÁÁă·—đf‚< Ęłů›Í\Éé࡜^[ůžC·P=Ćc]U7ŞSü.&=xĺ8*w™ßYÔÁ@K»čö |#ŮÖ0[w‹2•x_¨E(,˘H4ă5®1ŘĘUŻk<ŢšJ,Ú:Ęą™S×ER.LI…%R6j‚óčuŐşn}«amť"ż‹Uż8UÂÇÖĎâ“°ť+»Żî±6NNÔmnNUÉĂ?z`M=:PmqŢjóŔť™Uťâ/8–•e#ŞŤw.xɦ%,Ű"±Vł. „¬cć‡ć¨ŢőUŃýÔw‹ ;Š w_Ş> 7j{š­&ô¸úĚ;@|ňŽ? 㵄ĎsHżěéŞč‚ô+Ë“*13ĽRµ[ߙޑępźŮ¬`î°Áţ‡ }¶ öXí«=Ż€W{˘äíűLÚcÂŐDţű(ĺ |Đ endstream endobj 21 0 obj 594 endobj 22 0 obj [ ] endobj 20 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 23 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 24 0 R /Resources 25 0 R /Annots 27 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 24 0 obj << /Filter /FlateDecode /Length 26 0 R >> stream xś˝VËj1ąľ!•M\܉4z]µ.Z(]4 –$'­ÓBvY•ćSŇE)ý.ňŢ%+/üéą3™Ç3ÍĂ8±đŚtçJG:ç^IC.cÁ©<É+ZĽ?ěń!±2µŢťy̶áDŻ=®¬qVdÝU#ĆiŞ řLž»ü-ßČŻ?|Ůí ľó ýť×J#V"őBĄŠě̵˷ó7(Ă)$™!eĂJç ­ÜXă}ś¦ŔHR-…š¶ *›tRX=ŚEßi[ I ĘěVµŚÚ˘Aomco”H¸Ô>6‰3Şň)ţčó˙pŔ×_|Ţ˙¦x˘aŰWĺK‰ 2üxČő ů;ľmE¶ąÉ^łĺčś…Ößč,:e!štą¤nkѸ5bmÖc¶LŽ=rE#jŤ­´Fp^ír%2× ľÁĺň3 hD§vĄuŇĺďyxÉ7Â<ó7ZĆ^[­W±ÖĺፌŃN@›ä?Ő;ĐeđĐÍ šKg Ş“I¤EÍ#tŻaf ™Ä&Ĺ –§łHŃq…•şÄč”ňńáűDŢm—Łh=ł($ýt ąř}Ö†zťL°\Bu/Š0 Ý3µ_ˇ¬R°L9"nčS'‹•ŔŽrĺ'›Pé^¦Ö =ŇÇ6űŐ&n ¦]ŁčŢÄĘ=„5†LáŮŐSéUćäů´FńyzvąÎýOYD}ć@ÎzëU/÷'3"Á, IđőłMěčrűyÝGÇ´Y˛ĄčŚőP«¨ç>Sä/dćÚŚŁ}I÷¦G"ŐCčQ!=ž–Űň!Ţ ě°ĚŠ Ľ7âOč´M®Cż-śA˛M4$Í{`Óbˇú†·ŔĚhŞmőcdAĚ·i?ĘvŁ’}xôiˡ#Ł´"䑪ŁS)ĺdá™jÜŔĽUőe•<ÝpÝşůú'S‡Ű—QÔ ÷?+$ŞIiT&­•ÉMUĎĘ6ďĺN±T©®¸|߉˝„‘ďîľůšđť ‰?Č:Ű‘:ËŮ9ô˝ÚŘ k;?¦[¸5„Öďą•˝nnĆĘŘokĽ˝¸Tţ¬} endstream endobj 26 0 obj 828 endobj 27 0 obj [ ] endobj 25 0 obj << /Font << /Font3 13 0 R /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 29 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 30 0 R /Resources 31 0 R /Annots 33 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 30 0 obj << /Filter /FlateDecode /Length 32 0 R >> stream xś­‘ÍJÄ0ÇŰ‹ŕ2ÉoňOµBq:8-ۇ5ô€ ±Ž.X4ąb?ć"1k g˝ĂĽ˝›ŤÖq:Ř dná6 éa~Ö˝´ „Ő+´ü>Ş™ˇc@ŠŰŐźP-,Oŕ†GżCŞ3)>Vk$§UP“±rw†X‚VSŞ›R†´RÓÎ)÷ $…QŰÉËÂŽXë"ľ$_:şQűčµ5‘ÇšŁ^ôš¬ŽF?O|BÚÂüňyó¦Árˇ|Ňňç›Fˇhĺ ¤áÁŇ#ÜAU”ĺő ˛PUń^•ÇeÓ3Öď+Ő4ĺb§†—î!]ÁEúĎîĽâg¬ýŻ«¤'ˇĐsXţR[‡\ endstream endobj 32 0 obj 305 endobj 33 0 obj [ ] endobj 31 0 obj << /Font << /Font2 12 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 34 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 35 0 R /Resources 36 0 R /Annots 38 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 35 0 obj << /Filter /FlateDecode /Length 37 0 R >> stream xśĺ]Ź7†!!á›ţ D75ö9ţĽlËj‹Jłd7´¤¨¬ŞvĚ5ż‚מĚG6I•ŮÉö¦MfüĆ{üř=¶s%ŤŇ2ß×7V;\˙x'ݤVZ›äŁÓ¶ä¸žF¦|y'Ů»ŕu)^u Ň.Ř|SÉk‰ü})ň=*ą’Ź~¨ţą|­ĺŰŹ¨ň˘e:ë5'–ŢިŞKůć;9ñQŹÚĹH·ÎGO!ßqý±ą:đžxMŃ•«v.EßSŞVń)FS”¦T§ôšŔ±éëî®tt“ČWëÁÉIĂZÇ»L͉öý8Gůůčřď÷ź9*_>rţf©±*„)HfENŤ<5ąůźňHü&NÄqG</Ä‹©ś˙%źĚo\Yt äüŽşš§Ďţ˝CĆŕ Ć8^ĂŐ(®dh°)Ő)#páŮŔŰź!M’h­ű‚ĹCqg,'˛ Ă+—Ön«ćâ\üšżÇVśJžĂŽšnqHŔ\ĆżwΗ!a}˛©/Uť„¦S4šrť2tPŁw 1#“Eż –Ťh†ÓÚ%łĂÂżĺČćâąx:WR.qúĎ Üöz‰×i5RŹV É…5ZťrsZÓ†÷VóČ‹ŕ Ű]÷XśÂ\gâ%"îĹč‹*8Ď–ă5ČLAVŽUd­“KTŔx"÷”ŞUŕŞ•ŻšRťŇb[ˇô­ L##«ÉëËQ’Wɤ”bŻ«^LJc˛ĺŹ0žŇ‰XdBżËůéFč%~ŘVń!ůDˇ6Ź©0Âş)™ľTµéV3âŞ\ON Żm"ş öÁ{z"˝_´ËŁbŁŁę©‰×ýňPĚÝ ňˇî©ř,Ä3xh†•Ë=śË#ń v:CĆgÍO{Zk[CČP‰~ł9‡°%Í:0bräÖ‰µZ^҆P[¶§ ‡ĆśT´Î¸[öžă8A¸kP}P©3 |\ěUĂ㏑ľ(üfât ;K*¦hí­°#ÇXÍ(CT‰qؕا¨ľXőÄŚ*Żë2ҶxOÎĎ{§‚±T›Îí7eí‹/C ·ĺE –…Hˇ÷-¸]ź°a8+!ň)R…ᑾÎű…ůů Ŕą•"Ĺ8pŕ6‚’.ŻáA—·lľ§T­bŚĎ; W›˛ëICW!ľŁË»4X^‘fkţźŰľ®CŹřlkěŠmi0ťÁHuRŐI–Á¶6\[˛Ó†űÍ…¨8bŽăň¦É7˙¤@Φ<´ FH!˙K‰ÂôF’tşî¸Ն ďí5N&?OĄ­%ź'w'÷&0ä—©¤FZ.'Ż{yľt®;`ë1Ë»`ÂF÷§›ŹŻÚs endstream endobj 37 0 obj 1030 endobj 38 0 obj [ ] endobj 36 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 39 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 40 0 R /Resources 41 0 R /Annots 43 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 40 0 obj << /Filter /FlateDecode /Length 42 0 R >> stream xśíZmo·^Á@0‚ü‡ĽXFJs†äě·¶ăŞÎ‹¬łĄÄĘCil§¤N ôďös~EźáŢľśîNľóJ‡Ť'íÍ-9Ă™‡3ĎpőĆuF_j/‚‹ř{qiŢgťŁ"9şPď¸ú7éźKă%&quř|řŔ.¦ ssĺţ~mNÍĎPňĆÜ˙ËüŻ_:óęźĐŔúN9x‚ë]ÉÎo~}őNŞ^›ď™cĽVôdąÂUŚ’…ł^Q’H•GĆDĚE¬ŞfÎŢÉX6Ébf—«l;ČF†řÜy|¸Şîî>č_Ď٦D’ ¬´XÜŃßÔ˝açç3 ýjî?úĺçE xöărLC¶E8±7‘mIT’™µ‘›ý`î6ľyÖÂĆý¬ą35N,ŕ•XLëÔ<(ž5ßę頻RDňi¦[„v Żřäú ‰ %”±h>`:·ŐŁ7Hv{x—Ř{Üŕ—í˛ř5ŃÂť‹…6láošós„lÖ|Ý|19\ĹF$ň˝oŕŢë)ż­N4ŠVN%¦Ąh ’wŹV ÎOĚ¸Č B>lĘ¸ŹšŁZ|Ďq·,ş×d\¨đJ›¦¬ ŐŐ,I™î$Oě` ĚŔtŔ¦"W§/\>Šy«ŕßäČůÉ(#úŇĽřŢ™úRyŻ˝zúPb´đ  E{›Ăµ'KjÔŰEĎő7čęKÉĹ€]ŚZ‘s‚)( •bÄyD[B„-@©˛ h„ ÂţŞ`üü޵î]]ŐeďňL”Ým¸w­Ň’Ru2™‹6yîÍŽ‘ܲ@i(lIęę…HcźI’©o '°Ţqëwđl–P‡gtűrmÎ’@‹±ŤąPT8íĹ·9%±žu±Ńٱ ę€"Ɇ*Ě(ÍŠlM˘Q÷X€9S±KQđ÷ćaç9YÉP%xT–ý ×Á™‚޵H˝ha«@ŃŃÂ%)«)Ő/Ů„R)#; ÂNu0X=ď ÂČ !¬4‰ÇR$ě'űFŠ6´FM®˛Č1ŰÔt݆:Ř ľ/Ő@Ŕ˝5đíF&oY7ćŻ • gĚ{ µ ŤÝ¨AŇsŽÝžj(a›NkHOi‚φĹ*([#đ¬#Şáą‹Vď(vţ ß›ŮѢi;|±NńĆŘË,qÇöŞířŘE§řʤ§ő¨Ć{'cŃ|eM‚môşhçsě`Îy4ĎÂëSĂ—`Gň…u:Tý%'6˛hÇž€;>FŻţ)®žăúiۢţOnŃnúXЦ­µ`Ëéu3¬Ě\,­/& &Ân^ćűXa‰`a¤řa]ŇqĹçc,ómwc¬ČýčĐřTŻţĽń śpŚ»ÎĐüÔ;·Äó:S‰ÍOń peĹTĺígPtZŹÍ>¬Ż?Nđ eFmđ‰×*»âŽýÓrśŃaf/öĂŽŐ™"·łÝ4[–’kmş{öBăQ*úDpÉNéŘJeBR JíëŢZE|qdčŕÁläznŚâ™–„ó‘0†”˛Őľa=ČF é6&?˝Wá ^zLÁ ŰY3H»˙×Ë—ŻţĚ_zLnr‡€¬W€Ł—ęę’]ˇ±hދإ´Č‹q#Éîe;‰ĐÂk?!č.¶;{Y·CŐP@Ţ/wďźŐtsŠuVŹĎŹqýď'5ÝiŢĂűünóÍýSÜř¤űjJ E^Ňs Y5ç&ňvI¦ĺ€±W,-G¬—é“–ÔŐŇĹŘ‘l÷ yŹ @őn-hZ%ľĆë1’x*­RÓů3đ¨V ^űdäQ­=żăćhJěŇĽťLŚÝ¦Ó4`ŕýĘy¸ -‡Ç–n©íŞl>–eĆöSVí6=Zqň‚.Yżëłx'ą0@4lŁŰ2f•ĄąÉBăĹH©,jĐHڧÇňÚn¤·˘“\ŚŤíoëWÔĎ5H/:nÜ+†_®‘Ť Úy.¸´ {Ă;É’áým˝™ý\+»X}˛yĹđßăľMÜwh–ď …ž˘né¶ŁöuKrţgÁrrŁËüZoÖÉíżçö©ú=lĹŠ·*y~‘ĺ×=ću%¦´ ‰>s⥠Pë>m>޲’mTŁç-lzšŰ| ä×gµâŨOxAód$™÷"чľ±e(uŘH´s·ďmŽú]ĂŘů@˙źOä74?đ(ÇŃłÚ¦_biŃ|ů© #Ůîä1błz$)}rŽ•éţ‹©Tf¤Đ" $ĺ¤˙É”ąćą˛‰®ua^K)y W.ľ:4ˇ=RűĎÁŢ;8?o~;4܉ÎĎ^Žîům8ś¸AëĽOVb˘´băöŃŐ×8÷1Ř endstream endobj 42 0 obj 1999 endobj 43 0 obj [ ] endobj 41 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 44 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 45 0 R /Resources 46 0 R /Annots 48 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 45 0 obj << /Filter /FlateDecode /Length 47 0 R >> stream xśí[mo·^Á@l ýnmą.M_†Ě·ňKś´‰,ŮRkĺC 46‚UR§úwű9ż˘Ďp߸w{ňťîNëpŇŢhÉÎ gžŤŇµĽţÜ^8íń÷ňŞ~WkĄµI!zíň‹źq“üąŞmđtŢŚH{vrŃÔ ä÷Űú¬ţLŢŐŹţŇüëí7ş~óop ystÖ€‡˛:Em“­zs#VoëďÔÇx-ń‰ÖSrWއ(Ę•áŕŘ3CžacRPš(ZJZSĐ|$3m;Ň Alě5>^eu÷䯥¨MŕR*,ęnęßóÓS 8ý©~ôäÇţă1 äÓď¦6uQĄ@L¶ö¤›ÄőikąÓoëű•­^V/ŞŻŞgŐYő9~źWŻëÓďëǧ7aFd”K<ćm1±±^‰¶}ťôꉏŻWňŚ#Ö>Fňbq–+Űţ¸ě ‡5¦h8;‚÷)†‚Ň ”bf× ŁFʦ.ŕ‚Â6y,]+öp‰u\ŔDňϲáHś"qm­"ŻY‡‰#üĆ\Ý©ŽŞ“ęd=K­f˝Â+xÝ‚ąŘo'ćę)Łą’ˇÎ€ý¨‘˛…ą0÷Ě׆4aKÍYë.6îĂęζv"§ŕ^LˇvnŽÍ+8ĹËęďň{[Vě‡,Żŕ´G—Ŕ´Ů˙b}v ’K%©IťÚěŃŹ)›:Yh×µ¸ÉA/ëEńk¬…%jí“Y±…żŞ..`˛ÓęËęéÖćJĘ#ßú´Î1Ů©µzRa­ČÉóÄZ#ĺćÖrŔ!8m·Ś¸ ÁX·*â>©žçä{Ž»fŇ˝&â‚…Ř´˝Áz“™l˛ü‚$ÉÉ^AđÄĂŚHhĘSVz§ňÂć-˙b’絩żŻýµ~ýµ®ż…éSĆa4{őâ)ĽĐyŻ Á€mUt+ŘžLŘh°1z>×ß «O)&ĺ v1rEŚ Q6ÄUR´…µó^*(Č× ü*ÎřékŐ»ĽŞ«AĺѨ÷ˇŢY¦‰B5ב’ń6Ô5!¸Ĺ¦.‘2!Ż>#¶Ź&h #şMÄ4řzŹ­o Ů\n(˘Ú¸-ŐưےńâN·˘ŰČ”%Y¬·(,LV@ ¬\&F¤fńl ˘> îĂásä¶ő]ăţ­iX[b"Řúŕ,2Ëíx݆2˛Ř"ô˘„Í DE X¤¤(˘Dd?VŚT*!: Ăn«` zş5FÂJ9X,%¸Ű‰ľŢx ¸z ®ˇ‹>*çDpŐ†(Řü?eáî­€ďW0"y‹ş1^hp’pFJ3PŕYhěGŤ”slV8Xŕ|@gŰt»˛ÁH—ĆŮXSPÉ$¤­ĽęŕĂÚdóÜG©÷D*ŔŹŻëÓçŰ ŰśđŹ9Ć[ Ćľ-3ÁŽíU[ń‘öZüßé>äVŤµ:”¤f$E ‚­őú#iă> v0E‹8§ őmÍÇ-f!™Y˘Ä*tĺŘŔŽĎP«ßĂŐ+\żhK4Ŕ˙­ B”›Ö'”ił¬9˝l†Ą™“˘$ůĄv†l°›§Žů[,Ç`‰ca  řq^ŇqöĎgXćÇRîzź=÷îam9_}ŇŤř#”pŚ»ÎQüä;×ôç9QŤ!?ÉÂĄ%Q·źŃYn›ý>ż~·…^L$äË4ËlŔű§Ĺ8E3s Á÷݆ŮŮxjgs˛iÖL%×Ęŕe÷Ü ŚGŞp¨%{¦ĄÖ!¤Ś„@4Ţ ´Ą+˛Č$B9;°’Ú !ÉËeŰĽÎl)Y“ĺ[´1%­)hcďx{ó~r@¦¶ŘÖnł~2bgW/:­ €ň Č6$+Ç“-ň;÷¨ú ďăęh˝Í±š™ô~#!ŻĎ3Űvzŕ…„Ś‚9„vz·™>9¬sµpżk‘ĆęáşńĺşU‘ ŘJ<ËvëUI?“˘wňó‹úSĹxŮaiEp•Ţâčśň€cłě"°Ť;cħrF`LIŰ9,žek5’ć”íŢYÁÔäm«¬T™bĄ(Ąxr ‘kéUáě=gcämČąwÄ[›)•¤f$ŤŕjxsĽ‚GůŠši#¸•ÓŐұôe´7yŁřĹ(BĐÇR|Ža'ŻŮźĺ'ÇhŠfîb7 g‘…[&nŰ$7Hókn†Y®(ÇXą::8žtpnc3$TÖśűV‹nKDäŐČN$<;˘”Ö,, ”×) ^§Ť†C¶×¬<彆5ó„ŘD–ŕ8z¤ľżŹÉĎäóu»„Á 1”ÓĚxףϮľyóOWý8řá*uXŠ&Ę0Ö‚IĽÉ€vw%­iŃ89QR?t$•a`Ç_݆Ą!›i¶iQ-ű`•Ď> ywBl "ˇ®H˝'ăKjé{b0ŐŠćN/dP•ČܸA5aŐ„D9ßD1ĺ¨4śLIjić.#tă Ęć-D<„WŁm-˝ddF˝ŢąŰ\u&‚"žŰéÉÍĂ\jž!AśçG'Žq}„÷ą˝S}„÷ĹýęuuÂ+»mS>Ł&•3©°,Î.jDÄŃh¦#+Áfj±&OŮpßGéĆ´ÍŤfĹÍś7~oF“Á—9Ż?L%ťKů—]ŽoŤ×>ó$÷Ä~ÇŐóml°ĺŘl/¶ëpŇ Ę÷,ĘaiIl ˘Jž0aŮ”¸ąýZh†„źíç‰Ö;<]×|R±8ě¶¶ËŐZ$[ďěöŞúuŮ‹ÜĎ|ŠOنE9Ócąő»śłV¤¸“¸ę<h¸ Qkቖŕ‚k»đHY-ÂZ¦5%- ü2ŚĐĺ0ÍXŕ |Ţ5ôazĘ%~!›Ż¸ ~Ba2×Hé8^4oR/  vlärz,Ż=O¤č)—Ą°ĂmĂŠ†ąFJÇń˛wŐ•‘mIđ«Z)¸“łŁ©ŕŽR rÁ{ĘDđá¶AĚa®%].?›¸ ř»Żc÷ J™÷ôé¤Mů‹u–“ť.ók˝ÇµN68ŔłÔ>7T[é EÓbĺ÷f>ŰEůą5uňěYŇP§Ćh‚cĺ^ő‡5ńČJ6rbę ó 67Mi â } @ŢtŤo—|ň©IžSjőŃä§˝!-Oďâ 9-°w˘štžFҦm¦(Sj/çůrfáźł& _Ńť±ądGUäŃĎ‘ÚTÂ6lÝ´ gás9 2ŻH r§<¶Ivé@\ŕIV'Fž“ĎĹ ay,ˇ˘Gó—‹NĆŮcgQś´Y´<öX8ÖAţéÝkXŐÚ~;.mnö›#±_á)NöąŮó›;“×nOsü˝sš÷sš#kZuŽ3]Ő~Nuđ/Ň«ű9Ő‘Ő­:Đ™¬®¨~λŁęٱ ±ő*= ĆDŃ|8ŰůĹźí¬Ňo’L›·ŮŘ>±FĺTf¤6%f5ąëŚ0:Łä,łKQy;› 1%wť-űá#qŞ”=Lß«$ v~p•öÓĚ A'qŞ“ ż‚„Â.™(č(g Wµ7Ú†‚Ň c‚|+É·mT­§¤ŤGł*zů†—ÄŇÖ™_çWĆVBçŇ•šł#ŕ›w°ĄIÍHBaÇ]‹t9Ň6ďzÔ˘`RľÚ…•¦ĐÍ6ĺĆź¸)*VĆĄŽ”ńč’ óůqÖ`śE°ü288řŰaíÚg>˙wđ›Ź..ŞźkęIß÷ü<"„Jg±gĂK2®o]yýy endstream endobj 47 0 obj 2922 endobj 48 0 obj [ ] endobj 49 0 obj << /Subtype /Image /Interpolate true /Width 256 /Height 279 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 52 0 R /Filter /DCTDecode /Length 53 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůRŠ( Š( Š( Š( Š( Š( Š( Š+Ő>ř>O:=wT…D@n´ŠAÉ=ĄÇaéžąĎáÄG9x,LeUJ7ŮxáĂÜ7Űź§Ý\Ć_ËßLĘŽ c¨ëëJRQWnĹB›ĺ‚»ň3讳ţçŠ?č˙“ńUGX𮱣Y˝FÁ˘· ¸‘)=3´śsÇOZÉb)IŮM_ŐÁb`śĄNI/&`ŃE±ĘQEQEQSZŰOw:Ái łĚůŰHYŽN砤ݵcI·dCEvzWĂßĹćI jUY~Ó& gŮA Žŕă­u–?íRoµYć‹o B"®In:ńŹĆą*cđôôrűµ=*9>2¶±…—žźž§Q^ëeđżĂÖň—^]©\lšl}~@§?Ž9«rü:đĂÄčş{F̤YäĘ’:ڱyW;Íč'łţľgdxoŐŰŠůżň>˘˝Şo„ú1‰Ä7ş‚JTífd`bFŃ‘í‘ő®oTřQ©Áą´ëŰk´TݵÁ‰Ůąů@äzrHëŰ­m Ë=9­ęsŐČń´Őů/čîyÍ>(ŢiR(Q¤‘Ř*˘Ś–' ą®ĎDřo­ß_Ľ7ńgÁCĚű_ś€~nŁśăÎF+×|3áŤ3öţ^źe9Ýq(VŽ 8ŕp08Ď\šśNeJŠ´}çĺţeŕr{ýÇ”h? uŤB8¦ľx´ř_ŞČ JܰqÔă‚0xőôMá燴×mZň@Ć»mŕ1Ť #ę ÉúW]Ex•±őęî켏«ÂäŘL6Ş<Ď»×ţČbŽ’(Qc‰*˘  °§ŃEq¦ÁEPEPEP=GK°ÔŐWPł·ą _60Ĺs×ôč:zW¬ü,ŇnČm2y´öČĘ˙®LsśAĎOâÇ+Ш­©b*Ńř%c›ˇ‰V«˙?żsđßĂŤJŰ-ę˙i\Źâ™G–:ôNGB>öy®ŢŠ*jÖťWÍQÝ•‡ĂRĂG’ŚlżŻĽ*Ž·§¦«¤^XK°-ÄMf@áI6ppG¸«ÔTE¸»ŁYEN.2Ůź+\Á%µÄ°N…&‰Ę:žŞŔŕŹÎ˘®›âU´Vľ8ŐcvŁ:ČFIůťţ%‰®fľŇ”ůŕ§Ý\ü»KŘŐť>ÍŻą…QVbQEí_cAá«ŮB(•®ĘłÉ€O ÉüÍx­{oÁ/ůn˙ëő˙ô\uçfżîďŐçľ/Fz Q_0}čQEQEQEQEQE2ic†'–gXâE,îÇ@ä’{ »˘ą=Wâ‡t˙5~Űö©cÇî픾ěăŁ}Ă×űÝŹ~+™»řąÎÂÓH–XxÚňÎŹĺB°űšę§‚ŻSXĹţ_™çÖÍpt]§Q|µü®z•âł|XÖL®a˛ÓŇ2Çj˛»;w ź| Łń7ÄW;<™m¬öç>L îúďÝÓŰk˘9V!ďeó8ĄÄX8­.ţ_ć{ĹáV?üCmIŤťŰÎůˇÁÓä*1řgšÔ°ř·|‚Oí 2ÚrqłČ‘˘Ű×9Îěöôé߲–WŽÉ?źů•!ÁĘ×mzŻňąě4Wžé_4{ź)oíîl¤lďl #N¸ä|Ç<Sř×_ŁëÚV˛ é—ĐNĹKya°ŕ‚J úŽăÖąjaŞŇřâŃčPÇańšo·_»sNŠ(¬°˘Š(çߊň>jźöË˙E%ruč˙Ľ7y­6ąól®6 Ža`ˇFďcęqéź8ŻŻÁÎ3ˇWŃ#ó\Δéâę)«]·ňo@˘Š+¤ŕ (˘€ ö?×jú>Ąf‡†q1nÄ:ŕü†:ńĘôO‚wŤŻ- Č‘Oo»c ş°Ć3É 3śŮ=«‡1‡6^G­’UöxŘ_®źüÚ¨˘ŠůSô0˘Š(˘Š(˘Š(¨®®`´¦»ž(!\n’WŁ'$đ95‘âĎYřkM77g|Ď‘ pŇ·ôąíîHÁ|Mâ-CÄw«q¨şálqFHÇ|O'ą<ţcż €ž'ŢÚ=Ď#2Íé`}ĹďO·oSżń?ĹOő–ţŐ~Ő8úŚŞß$úŻ9Öµ­G[¸j—r\8űˇ°xĺQ€3ś{Öuô0”¨| ^ýOŠĹć8Ś[ýě´íÓî (˘şN ˘Š(˘Š(§Ĺ#Ă*K ´r#WS‚¤t ö4Ę(ܶ¨íĽ9ńXҶÇzßÚVĂřglH:ž“ÔŹ˝ž+Őü9ă Ä%ŤÉK“źôyŔI^$7ź”ś¸Żś©Čí«Łu9 >˘ĽüF[J¶«GĺţGµĎ1kFoš>{üźůč}YEx%Kiţ‰â7–â”GrŹ ůű°Ç9ĺşőĎż‰4I,.˛DęNCČ ÷óřŚ5L<ąf}– GjOŐuA4QÍ Ĺ2,‘:•taŔđAĹ|ýńÂłxoTfŤCi× Ínëź”uŘsÎGŻqϨBVgô{mwHžĆíP‡Sĺ».LOµÇ#‘ź^y ­0X·†ťţËÜÇ4Ë㍥o´¶˙/F|ÉE[Ő¬'ҵ+›µŰ<Q¸ t# ‚pETŻ«M5t~u(¸·n‚Š(¦ ­? jmŁkö:€, A}€PđŕĆJ’?̢¦QRN/fT&éÉN;­O«şQ\WÂ]sű[Ăki)ÍÎź[ޱ˙č@Wąůrz×oŠřÚÔÝşrݨa±ÄŇŤXl˙ŻŔměQŠĘć×E;b‹…ĆÖ'‹D0)ĂJßĐç·ą {Éâł´žćá¶A 4’6 Â’p9č+ç/ř†ëRÝJH·RRŢńuφ/v¶é´Ů[3@ ˙}}ô#ŘŽZŠŠ”ăV.WLÖ…yĐš©MŮŁęm>öŰQ˛†îĘešŢUÜŽ˝ţ‡±A«ŕĽVţŐV+©i3·ďÓní‡8ŹLă¨ěHďĐşM K ¤‘:†GSŔň=Ĺ|®3 đÓ·Gł?BËsc©sm%şţşcń—ĂÉ%šk–±ŞÍîH.§XóÔ/Bpò×WŐWv±^ZMmp›ŕ™9$eHÁô5ó·§É¤ę÷–n-o+Gą“nŕ ŹB0G±Ż[)ÄsÁŇ{ŻČůľ"ÁŞUV"K_ř?ćQ˘Š+×>p(˘ŠŢđVľţ×ᾼyS˘€KFHÎ3ÜéÓ3_HŰËÍĽSŔáá•CŁŽŚ¤dřWËş%jšĹ•‚1Ss2E¸.í śÇ| úžRR(Qc‰*" €ě+çsĄ8µń3ě8ju)Ĺü)éë×ôb¤ĹŻçŇÜŹb¤ĹCyqť¤÷W/˛Q¤‘°NŐQ’p9č(Nú rI]žSń«Ä%DZ «Ź n±ß(ťx鸂?şkÉ*毨OŞęw7÷mş{‡.Ü’z’NŔ°©×Úa0ëICŻ_Só|Ă,eyU{tň_×âQEtśAEPZš©ëňË“h× †sąT('– dúuŕúíţ|:ţ×·MK]Ĺfřh Sµ¦Îć=BŔĆ ÎAű5Ą¬vé¤Aglq U98ޤבŚÍcE¸RŐţż—äSÄ%Rłĺ‹űßůWŁ|"@ˇµ­E‹9ŠŃpç˝ČÇmŁ“×Ž{KxnĹťˇŇ-°Áóó0ü“ŹÂşlQŠđęă«Őř¤˙#ę(eŘ\?Á~ďWřżđŚč_ôÓ?đ?đŁţť ţ€şgţÇţµŠ1X{y˙3:}Ť/ĺ_r9Kżřfęáć“J‰]±‘ĽkÓ*ŕ+”Ő~Ű2¤ęSFáNĺC†nß2ăhü z¶(ĹoO^źĂ7ůţg5\· YZT×ËOČůźÄÖôi/ě›ěÁűDDď8ä{đIŻ[ śĆ^íuo4|ţ3‡eĺ†wň{üźü1áUýkHżŃ/Ťž©lÖ÷Cí$AčA}PGQT+ÜŚ”—4]ŃóRŚ Üd¬ĐW­|ń8Çü#÷ŻĎ-g„˙yťIČţ÷=y->d‚d–hĺF އHä{ÇŽ"›¦˙¦tŕqrÁÖUcó]Ńő†+Ć~8ék«a©FűLf)6¦>dĆ nä†ÇŃ?/Pđ~´ž!đő¦ …®»fEÇÉ á†2p;€yÁ˝a|błŽçŔ÷2Č\5¬±Ě€t$¶Î}°çńĹ|ÎrˇŠŚeŢĎň>×3Ś1XJ:«s/–ż‘óýQ_\~~QEzÁ=;í~.k·I¶Y@ήŁĺß qÝK8?/±ŻyĹy‡Ŕ;š>«}ćgÎť`Ů·îě\ç>ţgOo~=Ońٵ^|L—m?Ż™÷y%?g‹ďwý|ńF*LQŠó®z÷#Ĺp?u&±đ¶ŠHÖKŮ–&RŘs¨Ď¨PzŚ6;Šô,W„|rÔľÓâ‹{—|vp É·$s“Î9Ęů~ŁńÍwĺtý®&+˘×î˙‚y™Ć#Řá$ÖďOżţĎ8˘Š+ěĎ€ (˘€ őO„ţ7o»« ű2ťÖĐ0Ě=7·˘ŽĂ©#=>÷ŕř–Ţɲ-®‘ă#¨ęH^:g=«éaŽR(Q#Š5 €P8ÂĽLßé/c Ţţ‡ŃdYz«/¬ÔÚ/OU×ĺů‰Š1Rb«ß]ŰŘZIu{Í۶îbŘĎĆz×Đd˝I˲ü˙Ꮭâ)ţîî˙/řr•Q_P|QEďź´•łđ¤šóoĺ$2±'ËBT:»y㱇Łb«hÖ?Ůş=ŤŹ™ćý–ŕß·níŞ8íśt«ŻĎńUý˝iTî˙áŹŃ°”VŚiv_Ź_ħ©^Úé–3^ßĚ[B»žFčő=€“ŔŻť> řŇçĹwÁP<\'÷äňO÷ßŐŹäą=‡ÇoKö4 i„"Ďs˛L–bNÔ`:`Ř=r§°Ď×ŃdŘĆ 5«ŰÉ5ťćśŢ›÷Vţl(˘Š÷Źž (˘€ Ňđöµ{áýR+ý6]“'O+"÷VÁ˙0@5›EL˘¦śd®™Q”ˇ%(»4}1ŕ?Úx¶ÎVŽ#m{ýí»6ěŃ•°2čz¬WĘÖďĽ?ŞE¦KĺĚś2žVEî¬;ŹäFľ˘Đu[msH¶Ô¬ {…Ęď]¬$G¨ ŹN8ČŻŹÍ0Tź4>řy‘öŮVeő¸rOă[ůů˙™wbźŠ1^MĎZç—|lđ»ę:rkvśĎcÉbńnÎF8IbxčI'€+Âëě)˘Žx^)ŁI"‘Jş:†V‚=Gµ|ˇâ]"m]˝Ó.ç·“hnő<«`Ś©ă8ŻŞČńn¤=c·§üÔů,˙ ˇQWŠŇ[ú˙Áý Ę÷Ţ)Óađ§Ř5=BĘŇ[IXFłH#-ŔĺŽ Ü\qĐžĽř}ęc0‘ĹÓörvęyX,d°u}¤Uúu?<''‹użłxlˇ_2âe\ąŔPq€Çśg°'ś`áčşmƱŞÚéöKşâćAđHęÇś’N8šú§Âú ݇tKm:ÍÔy’*ŕË&ç9$ä‘ęp0Wm}R°řžŢ^gNU€úŐNiü+?"Λ§Úé–ŮX@Z»R5čő=É<“É«;}ŞLQŠř§6ÝŮöŞÉYíöŁoµIŠ1Jăąßj6űTŁ\.G·Úľ7Żł1_(xî ń®ş“Fń±˝™ÂşJł–SĎb ÷WŇpěýú‘ďoÂ˙ć|çĆń§.×ümţFQ_R|¸V‡‡¬ŁÔµý6ĆrëÍĚPąBgă=ů¬ú»˘ßfk6ţ_›ö[çŮ»ní¬çÇZŠ—ä|»—NÜË›c뽾Ômö©1F+ó[ź¤\ůÄÚ—öżu-@4¬—$~iË'ĺSÉč¸íŠĚ˘Šý.1PŠŠŮ›JNrr{°˘Š*‰ (˘€ (˘€ őż€ZáŠţ÷C™E2›w0Ě  c,Jŕőŕ!ă“^I[ľżm3Ć:=Đť UşE’GŔUŤŽ×É<´·=«“AWĂÎZzŁŻ]ĐÄBkżŕĎŞöűQ·Ú¤ĹŻĎn~r=ľŐá˙´o#U°Ő⏠s‚R±`^Tłw%N<â>ý˝ÓŔüo°[żÜNŇÍ”ńNŞwKy{IČÇž~î1ÎGŁ•Wt±P}ôű˙ŕžvkMUÂÍv×î>q˘Š+ď…=Ëŕ/…ăŹO“Ä7ŁO3í†J ČvđXĺy€§łWŻb«h–ööş6źoc7źi ĽqĂ.ŕŰŃT9€9UĚWćřÜT±5ĺR_đČűěáčĆś¦3bźŠ1\·:n3bźŠ1EÂă1F)řŁ\.3óŻÇ]&k5ű ľˇş9Ś… Š7F céĽ{ôn+Ě~>hnđ´:Şľ×ÓdĺIá’BŞp1Ën Ü nëĹzą.#Ůbă}Ą§ß·ăcĚÍé{\3¶ë_ëä|őEWŢźQE}qŕíDkŇŻţĐ.$šŮ ˛Ű™@Ä0ŕcŽ20kcâł˙‰-íŢëĂ×$¬×2ý˘Ô„$3lýâłgŽHă6O@}żůÖa‡x\D©ôééýh}ޱ#>»?SäoiŘľ,Őtń“7 ĺG»v"'rs“ü%zóëÍb×Ń<.˝§ÇŞép<şĄ˘ěxŐŽe„dáW»r1Ś‚G'hŻťëírĚdqt–ëGë˙ůĂ đŐśz=WőäQEzQEQEQEhřvĘ=OÄe„ěë ŐÔP9Bg HĎ~je%ą>Ś\šK©őţÚ1OĹŻËî~Ťq®KâŤ×5í“{¬k)ĺGWcϢ©?…v®sâ5Ü6×fąlkG„yj Ý Ř˝Hăs žĂ<•Ń„“Uŕă˝×ćaŠłŁ5-¬˙#äú(˘żJ??=sáwĹě¸SIń<Ň=„hÚě‚íÄlI\ŻNŰďIÄ͉,2(ttmĘĘFAuwŻŠëľřuń"˙Â~]•ÂýŻF2nhŹúČÎLg8śí<?„’kćł\‘U˝l6’ęş?O3ÝËłgI*UľŹ·üé­´m¬ý ^Ň|A͢j^Ƈ ĺ’y F—;N2kOńňRĺ’łó>’3Ś×4]ĐÍ´m§âŚTóq›hŰOĹŁ.3mA}g ő•ĹĄŇy–÷´R&Hܬ0FG#Ú­bŚSSiݳџřŁF›ĂŢ ľŇ®Nç¶“h|˝O*Řă*AĆxÎ+*ľřŮŕÉüC¤Á¨iVćmNË ˘c|°žJŽ2Ě g»c$_7×čąf9ch)ýĄżŻüâ1ŘW†ŞăÓ§őäQEz'$IoĆĐBľxyňTAEWQ€U˝7RľŇçi´ŰË›9™v3ŰĘѱ\‚Ad=ŞĄĄ%f4ÚwGceń/Ĺöv©o·3"ghă•ů9ĺťK˝Í>Š>1š "}i‚ČĄ Kx‘€#0PA÷\]Ěđ8fďěăDmőŞö·;űŮoQÔoµ9ÖmJňćňe]‚K‰ZF ’q’O'Źz©EҢ˘¬Ś[mÝ…V·†4 CÄşÄ:n•™;ňĚxHÔuv=”gů’@Ą9Ćś\¤ěF.MF;› |"ţ-ń,pʸӭvÍvÄ6sţŻ#fäu#8Ĺ}U[Á0F‘C„HŃBިĐÚł<áËo xv×Jµa'” ’o-Q¦rrY±×Đg$(Q“ŠŰĹ~s›fOZëá[źĚű ż°´ěţ'żůíŁmIŠ1^_1ßr=´m©1F(ć ‘íŻť˙hŤlĽOgŞF&Ł W‰c$xxkF=żFbĽźöŤŽŃĽ%be–Ů/Rě4*ă÷®›HuLĆJś9Ú­‘×tń°·]?Żž§źšAO +ôÔůŇŠ(ŻŃŹŹ (˘€ (˘€;†>3“Ázó\´Mqcp‚+Cväę2uçă ĂŚä}g±ÜAÖň$°ČˇŇD`ĘęFApAëáĘő˙‚ ĐĐuÉ<˝>i7[Ü»ť¶îz«g€„ó‘€ $đI1ÄSݬŃ^ňÝw_ćżŘĘńľÉű*ŹG·‘ôF(Ĺ?bľúKŚĹ§âŚQĚŠó?_ ´ß<·ÚS&ť«;4’6 Šáţ%ĎĘrÜŁ»šôüQŠčĂc*ágí(ĘĎúÜʵ*uŁËQ]xłÁÚç…g٬Y#ř7áŤWĚ’Ę9´»–ŢŰ­›1—n„ŁdmřWoŹL}nŠiÉrâcgÝm÷oůž|žKZ.ţLůzŠö kŕNµm˝´ŤJĘú5ڶŮCA#??*Ź™yă°äóŚfą;ď…ţ2˛µ’âmfŤ1‘ ±Ěü8DbÇŻaďĐW»K5ÁÖ^ĺUóvü™ćĎ^çů]˝˙w‰żč\Öđ_ţ&­éźĽY©NĐŰč‚:®ňn#ň†“h'ž™Ď_C]2ĹPŠ»š·Ş2Tj=_ÜrÔWŞxŕŹďÝ[V’×J‡yV âiqچ ‡iă–íźQđŻÂ hn“ÝDú­ĐP Ľ˘ ‚¬xĆz6ě``äfĽĽVĂÝ)s?-ŽĘ9ez»«/?ňÜđß|;ÖĽ_ ’ţǦŚĽť# ŰHŹűě0Ü 0HČŻĄü%á='–-mŁ[y^fÓ,®Ű¤”ڱ?‰ŔŔśšč1F+ăłć¶=Ůű±ěż^罄ŔÓĂjµ—ëaŁüQŠňyŽëŚĹ§âąĎ>&‡Â>ąÔĺĄ?ą¶_,˛Ľě¬P6ŔůI<ŽăśĄ(J´Ő8jބΤiĹĘODt¬Ýo\Ň´(<ÝcP¶łR¬ę%pŁ'jőcČŕyµň&«â­VKő-gP¸†á·I ÎŢSŰľćv€001ұkëhđ«Ţ­Oą~ŻüŹyßňCď×ć}â˙ŤöV» đµŻŰĄ˙ź«•d}ÓÂpÍüCť¸ Exfł«ęÝóŢjד]ܶ~y[;FIÚŁ˘®IŔ< ˇE} -Ăŕ•©G^ďëĐň±ʸ‡ď˝;t (˘»ÎP˘Š(˘Š(«š=„ş®­e§Ű˛,×sĄş4„… ě€N2}*ťvż,ŕľřťˇEu™Čó’>tŤťŚŞk U_cFu•7÷#JPçścÝŁë+ 84ű k;Dňí­ăXbL“µO'€:Ôř©1F+ň6ÝŮö‹M(ĹIŠ1K.GŠ1RbŚQĚ#Ĺ©1F(ć ‘âŚTŁsČńF*LQŠ9‚äxŁ&(ĹÁr]Ľy[kUl¤ {V8nřěSâ‡Ä ĎjAP=¶ŹnÄŰŰÉ=<Çě\ŹÁGą<5~…‘dßRʶ­ńżü—ţ»×ćó w·|řWâQE}ćQ@Q@Q@Q@wßäŞčöß˙DI\ v˙o ±řˇ Ëu'—Jđ‚rňFČŹVeŹ5Ĺ™&đu’ţY~LŰ íZ ÷_™őö(ĹI¶Ťµř˙1ő×#Ĺ©6ѶŽ`ą(ĹI¶¨kšĆťˇX=î±{ť˛ç畱¸ŕťŞ:ł`(É8ŕUEJmF*í’Jě·Š1T4{I×íĚÚ.ŁkzUÜC fŚ0Ęď^ŞN ŕúVžÚ&Ą rÍYˇ))+˘ťĹSŐ5=?I·Yő[ëK(¶,—3,j[ŕ gńěkä­câ׍5D¸‰ő—¶‚fÝĺÚF‘Ćě…Wx§ŢÉI渻űŰ­FîK­Bć{«©1ľiä.í€ËO»püY»×¨—¦żťżS*™¬WÁĽú7Ĺ´k8ć‡Ăv“j7#„že1AĘçvÎŘ8H\óĐźńwеoj’^ë7O!.Í ÇĘ€|±©'hŔÔă$“ÍaQ_W€Éđ¸ hÇŢîőסćWĹŐŻ¤Ţť‚şÍ3â/Ś4ۆšßÄZ‹»)B.eűBă đ˛nń×ëęk“˘»ęЧYZ¬T—šą„g(kcÔôżŽ~/ł·hîNť¨9bÂ[›}¬Ę<˛g¦y<ô­KÚ_K¸ŰPŇtąíFwÇ’'<a‹0ăřOáÖĽbŠóç’`'{ŇZöÓň7XĘëi3ßżá˘ęW˙ʇ˙jŻgđź´ßhęš<ŢeĽś2·Ž¨ăł ţ Ś‚ řjşŹ‡Ţ4ÔĽ­‹Ý<ů¶ňanm°“ ě}dá»g¸$#2ál<čßąfĽŰOËVíĺřůuaó*‘—ď]Ńö®(Ĺax3ĹÚ7Śt÷»ĐîĽß/hšR˛BĚ2)üFFTpN t8ŻĎ*ÂtféÔVkŁ=ČÍI^.čŹb¤ĹRÖ5+-L¸Ô5Kí¬­×|’ąŕćI8I MLo&ŁvĆä’»<‡ö™ńYxjÓA‚`.oĺĚiýĘŤŮĺrűH s±†zóMt;ńE׌ö> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůRŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š|QĽŇ¤PŁI#°UE,O@s_Q|ř Š.±ăËh®n·Ó[ćŽ!ÁĚ˝™»mĺ@ë’~V•É””V§xኼm¶]O1Ř˙×GĘř‡~T°6\W´řwöb´XŐüIâ ĺvAş+„aľ÷n㫤IÂFż@qţ*ř—á HĐęÚÜ vĽ[@n%PĽÄŠÓ•-Ě]IKc•Ň˙gĎYŔ#ął˝Ôţz\]ş·ţCÚ?J˝˙ +á×ý ç˙n?řĺb^~Ń~‘kĄëwC±ňăÍŞ‹~ŇZ7đxgU?[…­3©˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡,ÎłţWĂŻúĎţÜńĘ?áE|:˙ˇ|˙ŕmÇ˙®OţOJ˙ˇ[R˙Ŕ¸˙ÂŹři=+ţ…mK˙ă˙ /ĺ™ÖŠřu˙Bů˙ŔŰŹţ9Gü(݇_ô/źü ¸˙ă•É˙ĂIé_ô+j_řřQ˙ 'ĄĐ­©ŕ\áEâł:ĎřQ_żč_?řq˙Ç(˙…đëţ…ó˙·ürą?ři=+ţ…mK˙ă˙ ?á¤ôŻúµ/ü Źü(ĽC–gY˙ +á×ý ç˙n?řĺđ˘ľĐľđ6ă˙ŽW'˙ 'ĄĐ­©ŕ\áGü4ž•˙B¶Ą˙q˙…rĚë?áE|:˙ˇ|˙ŕmÇ˙ŁţWĂŻúĎţÜńĘä˙á¤ôŻúµ/ü Źü(˙†“ŇżčVÔżđ.?đ˘ńYťgü(݇_ô/źü ¸˙㔊řu˙Bů˙ŔŰŹţ9\źü4ž•˙B¶Ą˙q˙…đŇzWý Ú—ţÇţ^!Ë3¬˙…đëţ…ó˙·ürŹřQ_żč_?řq˙Ç+“˙†“ŇżčVÔżđ.?đŁţOJ˙ˇ[R˙Ŕ¸˙‹Ä9fuźđ˘ľĐľđ6ă˙ŽQ˙ +á×ý ç˙n?řĺrđŇzWý Ú—ţÇţĂIé_ô+j_řřQx‡-C¬˙…đëţ…ó˙·ür¨ęźłç€Ż 1ŰYŢéďźő–÷nÍ˙‘7ұö’ŃżŹĂ:¨ú\ÄjőźíáIX ­/[µĎ— ~MEâš9Ź~ĚVŤ?†üAéHj7Öšfźs©\Çkcl†I§áQGčRx¤Ól­ôÝ>ÖĆĆ!­´K QŻEEňó/í1ăi5oÂ-a1f–ŔÝÔľ?ÉńŇý•ńÝ}‡ńř˙Ĺ ńŇýµńÝ9îM-…˘Š* BŠ( Š( Š)(h˘’€Š( Š( Š( Š( Š( Š( Š)(h˘Š(˘Š(˘Š(˘Š(¤Ą Š( ŠJZ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(¤Ą Š( Š( ŠJZ(˘Š(˘Š(˘Š(˘’€Š( Š( Š( Š( Š( Š( ŠJZ(˘’€Š( Š( Š( Š( Š( ľÄř˙$ĂßIżôk×ÇuöŔ˙Ă˙IżôkUĂs:»_űbőđŹý˝˙íůşľý±:řGţŢ˙öŤ|ßJ[ŽźÂ‚Š(©,(˘Š(˘Š(˘Š(˘Š(˘Š+č˙ŘóŻ‹íÓ˙kWÎôě{×Ĺżöé˙µŞŁą>Ô~>źř´ úC˙ŁVľ<ݰľ>˙É!ńŇýµńí9î*[QPhQEQEQEQEQEVµź†µËí ]jÇIĽşŇ˘”Ă-Ě™7G 9Ć9¬…eaň~”´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEöŔ#˙Ă˙IżôkWÇ•öŔ#˙‡Ă˙IżôkUĂs:»_űaőđ—ý˝˙íůÂľŹý°şřKţŢ˙öŤ|áJ[ŽźÂQEIaEPEPEPEPEP_G~ÇÝ|[˙nźűZľqŻŁcţľ-˙·Oý­UČ©đžŁńóţI>˙čŐŻŹk쏟ňH|Aô‡˙F­|}N{Š–ÂŇQEA QEQEQEQE´”Q@^ţĆßňNµű É˙˘Ł®˙Ćż |ăňęşVüv×x‹ĂúφnľÍâ.óMô•V˙uľë~żI*ľˇai©Z=®ŁkÝłýč§Ś:7Ô(ó>Šű/ĆłŹ„u­óhMq ]žqn|Č ÷ŤşŔHŻńźŔźřgĚ–Ö¬—ź;N%źń›ňÍym%,ŠŃĚđĘ­Čpńş•e>„E%QEQEQEQE´”PEPEPKIEQEQEQEQEQE-%PEPEPEPKIE-%PKIEQEQEQEQEQE´”PEPEPEPKIEQEQE-%PEPEPEPEPEPKIEQEQEQE´”PEP_a|˙’Cá˙¤ßú5«ăÚűŕü’ý&˙Ń­W Ěęěy‡í×Â_ö÷˙´kçú7öŔëá/ű{˙Ú5ó•)n:QE%…Q@Q@Q@Q@Q@}ű uńgýşíjůĘľŚýzřłţÝ?öµTw"§Âz‡Çżů$^ úC˙ŁVľ?ŻŻľ=É"ńŇýµň 9î*[QPhQEQEQEQEQE}{űÉ:Ő˙ě+'ţŠŽ˝îľaý”/Ń#şN†ëNmŹŹSôa^ăŕß‹> ńqHô­nÝ.Űţ].żq6}¶7Ŕs_R2« 0ë@§TWçׄ>(řĎÂ[H×nŐxű-ŮóâÇ  Ę˙ŔHŻpđ‡íEm!H|aˇÉlÄŕÝiÍć'ÔĆß0ü PŇ´W3ář_Ĺń†đö·gy!0‡Ű*ýcl0ü«¦ Š( ˛ĽEáÍĶFÓ_Ó-5 sŃn" ·Ü űŠŐ˘€>yń§ěǢŢů“řGSźIň-®3<@OÎŁńoĄx?Ť>xÓÂI5-[›$äŢXţţ,zś|Ë˙ľţ˘€?1U•†TôĄŻż|kđ“Áž0/.©ŁĹëřüłýÄŮő%xoř5ŕľ3ýő«óxGT‡T„r-Ż1 ĂŘ8ů[ńŰ@>QZž"đöłá«Ákâ .óNśś(¸Ś¨÷[î·ŕMeĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP__|˙’Eá˙¤ßú5«äú÷ŕ7ü’?ý&˙Ń­W Ěęly—í{×Âö÷˙´kçJú+öĽëá?ű{˙Ú5ó­)n8|!ET–QEQEQEQEQEôWě‰×Ĺźöé˙µ«çZú'öEëâżűt˙ÚŐQ܉ü'§|x?ńhő˙¤?ú5kä:úëăÇü’MéţŤZůś÷=‚Š)* ˘’ŠZ(¤ ˘’ŠZ)( ˘’–€ ))h˘’ŠZ)( RRE‘ $Šr®§ §ŘŽEzOţ6řëĂ#ŹV:Ą˘ŕ}źRw°|‡™Ż5˘€>şđí7áëýř§NşŃć8xżŇ ú’á˙|ź­{W‡|I˘ř–Đ\襞ˇso(rżP9Ř×ćÝMcuq§ÝĄÖźs=ĄŇrł[Čcq˙ý4˘ľ$đ‡í ă}dZŚÖúí˘ń¶ńvĘ´‹É?ď^çŕŹÚ+Â^#¸†Ęţí#R…X¤ÎŚO`ńů(Ú( r( Š( ăśqÉđ‡ĹždhűtůYw(8`ĽžăÖż?—~üo˙’CâďűÍ˙ ×çÚýŃô QIE-”´QIE-”PŃE%-”PŃIE-”PŃIK@”´QIK@RPŃE%-”´QE%-RPŃIK@”´QEQIE-”PŃIE-RPŃIK@”´QIE-”PŃIK@RPŃE%-”PŃE%-”´QIK@”PŃIK@”PŃIE-RP×ןĎüZ=é7ţŤjůľşř˙$“@úM˙ŁZ®™ÔŘóOÚ﯄˙íď˙h×εôOíu×Âźö÷˙´kçjRÜpřBŠ(©,(˘Š(˘Š(˘Š(˘Š(˘Š+čŹŮŻŠ˙íÓ˙kWÎőô?ěŹ×Ĺöé˙µŞŁąřOMřń˙$—_úC˙ŁVľEŻ®~;˙É%×ţ˙čŐŻ‘¨žâ§°QE&EPEPEPEPEPEPEPEŚÁFX€=M-ÖxCáĎ‹Ľ^Q´ î[v?ńő0ňa˙ľŰţŻođ컟.oë„ô-i¦®ĐĘĂ?’Ź­|Ç‘¸/Vn“ôč~ř7ăŹl{Mě-éZ‰0&=B‘˝‡ĐWŮ~řqá/ŞťD´‚pn]|ÉŹü ˛ß‘Ĺu´óż˙fÓdŢ,Ő®uIG&ŢŰ÷ý ĺŰóZöß řSAđµ·‘áí"ĎOŹ&€f˙yş·âMmŃ@Q@Q@GĆ˙ů$>.˙°lßú ~}ŻÝJűgăçÄ? YřÄ ë6Ók¶rA­ąó\;íą?Ţ"ľ&(h˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+므˙ňIt¤ßú5«äZúçŕA˙‹K }&˙Ń­W Ěęly§ís×Âźö÷˙´kçzúö¸ëáOű{˙Ú5óĹ)n8|!ET–QEQEQEQEQEô?ě‘×Ĺöé˙µ«çŠúöIëâŻűt˙ÚŐQ܉ü'¦|v˙’KŻý!˙Ń«_#WÖ˙żä“k˙Hôj×ÉOqSŘZJ(©4’Š(˘Š(˘Š(Ą¤˘€ŠJ(i*ęZŐâÚhÚ}ޡtĺ•´-#}Në^Ĺŕ˙Ů·ĹÚĆɵéí4+fÁ*ÇĎźî©Ú?ü(Ä N­Ż xW_ńTţW‡4{ÝDçáŹ÷kţóś(üM}ŤŕďŮ˙Ŕţ1Íue&µxĽůş‹oP}ŁOĚő{kxm`H-bŽPa#ŤBŞŹ@€>NđěĂ­^l›Ĺš˝ľ›äŰŮŹ:_ˇs…†ę÷|đ?… KeŁGwxĽ‹«óçÉźQ»ĺ_řč”P0Q@Q@ÉĄŽžYäHâA–w ¤šňŹü~đO†ĚÚŢ>·|§Nś¨>ň~ý(Ö«#Äž&Ń<1fnĽAŞŮéđă Ď(Rß}€5ňŤ?hżëľd:(·Đ,Űä~ör=äa˙QőŻż»şÔoďQşžňíÎZ{‰ ŽÇęy ŞĽiűOiždŇçÔĺ «¬Á}Býö‚×řĎ⿍<_ľ=WZš7ŕŮŮ~â,z|Í˙&¸j(UF=©Ô”PKIEQEQE-%PŇQE-%PŃIE-%PEPEPKIE-”PKIEQE-%PŇQE-%PKIEQE´”PŃIE-%PŃIE-”PŇQE-”PKIEQE-”PKIE´”PEPŇQE-”PKIEQE-”PEPEP××ä’čIżôkWČŐőżŔŻů$ÚŇoýŐPÜΦǛ~Öý|)˙oűFľxݎżknľ˙·żýŁ_<Ň–ĺCá (˘‘AEPEPEPEPEP_BţÉ]|U˙nżűZľzݎ?dľľ*˙·_ý­N;“?„ôżŽżňIµď¤?ú5käšú×ăŻü’}{éţŤZů&ś·&žÂŇQEI RŇQ@ E%´”Q@-%QEő˙ěfü+­\ŕgűVNqÉýÔuďµŕ_±źü“ť_ţÂŇč¨ëßh˘Š(˘Š§«ęş~Ťd÷šµíµ•Ş}én%¨üM\˘Ľ'Ćź´Ż…´ź2[Ük×K$OÜŰţű źÁOÖĽĆź&Ő¤ŰçH?îŁű«÷›đ§ńźíC§Űď‡Áş<·ŇtWن/¨Aó0úí ¤kÎ|kńźÁ>2Ew«%íňpm,ź&}>UüHŻŽügń;Ć1ޚ޷qöF˙—KSäCŹB«÷żŕDתa@Ú€=÷Ćź´Ďµ?2 X[čÖç<Řž|z€~EüšĽO^ÖµOŢ›˝wQ»ÔnOGą”ľ=€<ě¬ú(˘ŠJZ))h˘Š(˘Š(˘Š(˘ŠJZ(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (¤ ˘Š(˘Š(˘Š(˘ŠJZ(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ))h˘Š(˘Š(˘’–€ (˘€ (˘€ (˘€ ))h˘ŠJZ(˘€ ))h˘Š(˘’–€ ))hŻ­~źř´úŇoýŐňU}gđ/ţIFô›˙FµTw"¦Çś~Ö}|+˙o_űFľ{Ż ˙k.ľ˙·ŻýŁ_>R–ă†ÁER((˘Š(˘Š(˘Š(˘Š(˘Š+č/Ů?ŻŠí×˙kWϵôěˇ×Ĺ?öë˙µ©Çrg±é?˙ä”kßHôj×É•őŹÇ#˙Ł^úC˙ŁVľN§-ĹO`˘Š*K (˘€ (˘€ (˘€ (˘€ (˘€hÝ»>´´Q@Q@Q@Q@Q@Q@Q@Q@Łá˝ăÄ> Ó´k'Š;«ůÖŢ&”ŠÍж8ú ö?řfĐSĂß÷öoţ7@E{§ü3Ťżč)áďűű7˙ŁţĆßôđ÷ýý›˙ŤĐ…Ń^é˙ Áăoú x{ţţÍ˙Ćč˙†`ń·ý<=˙f˙ătátWşĂ0xŰţ‚ž˙żłńş?áJđô`Ęt#4´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEőźŔĎů%ŇoýŐňe}cđ4˙ŨĐ~’˙čÖŞŽäTŘóźÚĂŻ…żíë˙h×ϵôí_×Âßöő˙´kçęRÜpŘ(˘ŠEQ@Q@Q@Q@Q@}ű(őńOýş˙íjůţ˝˙öRëâŹűu˙ÚÔăą3ŘôŹŽ?ňJuߤ?ú5käúúżăŹü’­wéţŤZů>ś·=‚Š(©,(˘ŠZJ( Š( ¤˘ŠZ)( ˘’Š)i( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( Ăŕďü•Ź˙ŘNç_ˇŐůáđwţJÇ˙ě'óŻĐú(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šˇâůj_őí/ţ€kó6ő)ôŻÓ/˙ČR˙Żiô_™°©O  ŇŇQ@-%´RQ@Q@Q@ E%RŇQ@ IE´RQ@Q@Q@-%´RQ@ E%RŇQ@ E%´RQ@ E%´RQ@ E%RŇQ@ IERŇQ@ IE´”Q@ E%´RQ@-%´RQ@ IE´”Q@ _X|˙’Sˇ}&˙Ń­_'WÖ˙ä”č_IôkUGr*lyĎí]×Âßöő˙´kçú÷˙Ú·Ż…˙íë˙h×€R–ă†ÁER((˘Š(˘Š(˘Š(˘Š(˘Š+ßżeNľ(˙·_ý­^^űű*őńGýş˙íjqÜ™ěz?Ç˙«]úE˙ŁVľQŻ«~7˙É*×~‘čŐŻ”iËqSŘZ)(©,Z))h˘’–€ )( ˘’ŠZ)( ˘’ŠZ(˘€ )( ˘’ŠZ))h˘’ŠZ)( ˘’Šéţ_Úéü3¨Î–öv×ńK4Îp¨ ňM}µ˙ Źáďý şgýü?á_źÔPčü.?‡żô6éź÷đ˙…đ¸ţ˙ĐۦßĂţůýE~€˙Âăř{˙Cn™˙řQ˙ Źáďý şgýü?á_źÔPčü.?‡żô6éź÷đ˙…đ¸ţ˙ĐۦßĂţůýE~€˙Âăř{˙Cn™˙řQ˙ Źáďý şgýü?á_źÔPčü.?‡żô6éź÷đ˙…đ¸ţ˙ĐۦßĂţůýE~€˙Âăř{˙Cn™˙řQ˙ Źáďý şgýü?á_źÔPčü.?‡żô6éź÷đ˙…đ¸ţ˙ĐۦßĂţůýE}ë¬ü^đú=ô1xŻLi$‚DQĽňJ;WÁ±(<)ÔPŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIK@”PŃIE-”PŃE%-RPŃIE-”PŃIK@”PŃE%-”PŃIE-”PŃIE-”PŃIE-”PŃIE-}]đ<˙ĹŞĐľ’˙čÖŻ”+ęď‚ňJ´/¤żú5ŞŁąŘóŻÚŻŻ…˙íë˙h׀׾ţŐ]|/˙o_űFĽ ”·6 (˘‘AEPEPEPEPEP^ůű+uń?ýş˙íZđ:÷ĎŮ_݉˙í×˙jÓ[“=ŹEřß˙$Ż]úE˙ŁVľSŻŞţ7řµšďŇ/ýµňť9n(l-”T–-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃE%-”PŃIE-”PŃIE-RPŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃE%-”´QIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”´QIE-”PŃIE-”PŃIE-”PŃIE-”P×Őź?ä•č_IôkWĘUőgÁ˙łBúK˙ŁZŞ;‘=Ź;ýŞzřcţŢżö•x{çíQ×Ăöő˙´«Ŕé=Ç ‚Š(¤PQEQEQEQEQEW˝ţË|O˙nżűVĽ˝ëöYëâűu˙Ú´ÖäĎcŃ~7řµšçŇ/ýµňĄ}Sń´˙Ŭ×>‘čŐŻ•©ËqC`˘Š*K (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ úŻŕ‰˙‹Yˇý%˙Ń­_*WŐ?ŹüZÍé/ţŤj¨‘=Ź=ý©úřcţŢżö•x%{×íM×Ăöő˙´«Ái=Ç ‚Š(¤PQEQEQEQEQEWĽţË}|M˙nżűVĽ˝ăö\ëâoűv˙Ú´ÖäËcŃ>6řµşçŇ/ýµňµ}OńŻţIvąô‹˙F­|±N[ŠQRXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWŐ?ĎüZÝé/ţŤjůZľ§ř)˙$»CúK˙ŁZŞ;‘=Ź>ý©:řgţŢżö•x5{ÇíG×Ă?öó˙´«Áé=Ç‚Š(¤PQEQEQEQEQEW»ţË˝|M˙nßűVĽ"˝Űö^ëâ_űv˙Ú´ÖäËcĐţ5˙É.×>‘čĹŻ–+ę_ŤGţ-~·ô‹˙F-|µN[Š E%%‹E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´”Q@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%µő7ÁOů%ÚŇ_ýŐňĹ}KđT˙ĹŻŃ>’˙čĆŞŽäOcĎ˙j.ľ˙·źýĄ^^íűPőđ×ýĽ˙í*đšOqÇ`˘Š)QEQEQEQEQEîżł_˙Ű·ţŐŻ Żtýzř—ţÝżö­5ą2Řô/Ť'ţ-~·ô‹˙F-|·_Q|i?ńl5ż¤_ú1kĺĘr6ŠJ*KŠJ(h˘’€ŠJ(h˘’€ŠJZ(¤˘€ŠJ(h¤˘€ŠJ(h¤Ą Š)(h¤Ą ŠJ(h¤˘€ŠJ(h¤˘€ŠJZ(˘Š(˘’€ŠJ(h¤˘€ŠJZ(˘Š(˘’€Š)(h¤˘€ŠJ(h¤Ą ŠJ(h¤˘€ŠJ(h¤˘€ŠJZ(¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJZ(˘’€Š)(h¤Ą ŠJZ(˘’€ŠJZ+ęO‚Çţ-~‰ô—˙F5|·_Q|?ńl4O¤żú1Ş˘Dö8Ú݆żíç˙iW…Wş~ÓÝ|5˙o?űJĽ.“ÜqŘ(˘ŠEQ@Q@Q@Q@Q@{§ěĹ×Äżöí˙µkÂëÜżfNľ$˙·oý«MnL¶=ăGü“ oéţŚZůvľ řĎ˙$Ç[úE˙Łľ_˘B†ÁE%-"ŠJ(h¤˘€ŠJZ(¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘Š(¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€Š)(h¤˘€ŠJ(h¤˘€Š)(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ľ˘ř.âŘhźIôcW˵őÁŹů&:'Ň_ýÔâLö8/Úw݆żíç˙iW…׹~Ó}|7˙o?űJĽ6‡¸G`˘Š)QEQEQEQEQEî_ł/_Ű·ţŐŻ Żqý™şř“ţÝżö­5ą2Řďţ3ř¶:ßŇ/ýµňý}=ń”˙Ų־‘čĹŻha ‚Š(¤PQEQEQEQEQEQIK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}Ađd˙űŃ>’˙čĆŻ—ëéďGţ-–‹ô—˙F54Lö8?Úk݆˙íç˙iW†×¸ţÓ=|7˙o?űJĽ:‡¸G`˘Š)QEQEQEQEQEîł?_˙Ű·ţŐŻŻoýš:řŹţÝżö­5¸Ą±ß|e?ńlµŻ¤_ú1kćúsă!˙‹g­}"˙Ń‹_1ĐĹ‚Š(¤PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÓߏü[-é/ţŚjů†ľśř6âŮčżIôcSDËc„ý¦:řsţŢö•x}{í/×Ăźöó˙´«Ä({Ž;QHaEPEPEPEPEP^Ýű4őńý»íZńößŮ«Ż˙íŰ˙jÓ[Š[ďĆC˙ÓZúE˙Łľdݦľ1˙É4Öľ‘čĹŻ™(bŽÂŃIE"…˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( –’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( –’ŠZ)( –’ŠZúoŕŮ˙‹i˘ý%˙ŃŤ_1×Ó?äšhżIôcSDËc„ýĄşřsţŢö•xŤ{oí+×Ăźöó˙´«Ä¨{Ž;QHaEPEPEPEPEP^Ůű6uńý»íZń:öżŮ·Żżíß˙jÓ[Š[çĆ#˙×YúE˙Łľfݦ>0˙É5Ö~‘čĹŻ™¨bŽÂŃIE"…˘’–€ ))h˘’–€ )( ˘’ŠZ)( ˘ŠJZ)( ˘ŠJZ)( ˘’–€ (¤ ˘’–€ )( ˘’ŠZ(¤ ˘’ŠZ(¤ ˘’ŠZ)( ˘Š(˘ŠJZ)( ˘ŠJZ)( ˘ŠJZ(¤ ˘’ŠZ)( ˘’ŠZ))h˘’ŠZ)( ˘’ŠZ(¤ ˘’ŠZ)( ˘ŠJZ(˘€ )( ˘’ŠZ(¤ ˘ŠJZ(˘€ )( ˘’ŠZ))h˘’ŠZ(¤ ˘’ŠZ))h˘’–€ )( ݦ~˙É5Ńľ’˙čĆŻ™kéźßňMto¤żú1©˘e±ÂţŇ}|;˙o?űJĽN˝Żö’ëáßűx˙ÚUâ”=Ç‚Š(¤0˘Š(˘Š(˘Š(˘Š(˘Š(Żjý›şř‹ţÝ˙ö­x­{Wěá×Ä?öď˙µiˇ=Žëă˙‹m¬ý"˙Ń‹_4WŇßü[mgéţŚZů¦†(ěRQHˇh¤˘€ŠJ(h¤˘€ŠJ(h¤Ą ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€Š)(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤Ą ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤Ą ľ—ř?˙$ŰFúK˙ŁľgŻĄţźř¶Ú7Ň_ýÔŃ28oÚG݇íă˙iWŠ×µ~Ńý|=˙oűJĽV†5°QE†QEQEQEQEQEíłŹ_˙ŰżţŐŻŻhýśşř‡ţÝ˙ö­4'±Üü_˙’o¬}"˙Ń‹_5WŇźŹü[ŤcéţŚZů®†(ěQE"‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ľ•řA˙$ßGúK˙ŁľjŻĄ>źř·?Ň_ýÔŃ28Ú;݇żíă˙iW‹×´~Ń˝|=˙oűJĽ^†5°QE†QEQEQEQEQEě˙łź_ŰżţŐŻŻfýťzřţÝ˙öĄ4'±Ü|]?ńn5ʤ_ú1kćĘúKâé˙‹s¬}"˙Ń‹_6ĐŢŠ)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEôźÂ#˙ăGúK˙Łľlݤľř·:?Ň_ýÔŃ28źÚ3݇˙íă˙iWŚWł~Ń]|?˙oűNĽf†5°QE†QEQEQEQEQEěżł·_ŰżţÔŻŻdýťúřţÝ˙öĄ4'±Ü|\?ńnuʤ_ú1kćęú?âŮ˙‹u«˙Ű/ýµó} QŠJ)-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PKIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE´”PŃIE-”PŃIE-”PŃIE-”P×Ň?Ďü[ťé/ţŚjů¶ľřHâÝiö×˙F54LŽ+ö‰ëá˙űx˙ÚuăUěź´G_˙ŰÇţÓŻˇŤlQE!…Q@Q@Q@Q@Q@{ěń×_˙·ý©^9^Ĺű<ő×˙íß˙jSB{żĹŁ˙ďW˙¶_ú1kç ú;âŃ˙‹w«˙Ű/ýµóŤ "RRŇQEQEQEQEQEQEQEQEQEQEQE%-Q@Q@Q@Q@Q@”´QEQEQEQEQEQEQEQEQEQEQEQIK@Q@Q@Q@Q@”´QEQEQEQE%-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}đ”˙Ĺ»Ň?íŻţŚjůÂľŽřK˙$ďH˙¶żú1©ˇ3Šýˇúčöń˙´ëÇ+ŘżhnşýĽí:ńÚ-‚Š(¤0˘Š(˘Š(˘Š(˘Š(˘Š(Żbýžşë˙öď˙µ+ÇkŘgľş˙ý»˙íJö;_‹'ţ-ćŻ˙l˙ôb×ÎUôgĹ“˙óW˙¶ú1kç:lQE†QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQI@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPE”´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEôoÂc˙óH˙¶żú1«ç*ú3á1˙‹y¤ŰOýÔĐ™Ć~Đ˝tűx˙Úuăµě?´']ţŢ?öťxő [Q@Š( Š( Š( Š( Š( ˝ö|ëŻŰżţÔŻŻ_ýźşëßöĂ˙jP&vż?äžęßöĎ˙F-|ç_E|W˙’{«Ű?ýµó­‚Š( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_F|'˙’{¤˙ŰOýŐóť}đŁţIî“˙m?ôcP&qż´]ţŢ?öťxýz˙í×A˙¶˙űNĽ‚€AEP0˘Š(˘Š(˘Š(˘Š(˘Š(Ż^ýźúëßöĂ˙jWׯ|ëŻŰý©@™ŮüV˙’}«Ű?ýµóµ}ńX˙ĹľŐżíźţŚZůÚ†Z)( bŃIE-”PŃIE-”PŃIE-”PŃIE´”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-”PŃIE-}đ¤˙ĹľŇí§ţŚjůÖľ‰řRâßi?öÓ˙F5Lăhşý·˙Úuä5ëßúč?öß˙i×Đ(˘ŠQEQEQEQEQEëżzëżöĂ˙jW‘W®|ë®˙Űý©@™Ů|U˙’Ş˙Ű?ýµóĹ} ńSţIţ«˙l˙ôb×Ď4 (˘…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}đ«ţIţ•˙m?ôcWĎô7Âżů'úWý´˙ŃŤ@™Çü~ëˇŰý§^E^ąń÷®…˙m˙öťy‚Š( aEPEPEPEPEP^·đ®»˙l?öĄy%z×ŔNşçý°˙Ú” ť—ĹC˙«˙l˙ôb×Ď5ô/Ĺ3˙«˙l˙ôb×ĎT0AEP0˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(i(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ úáY˙ŠJ˙¶źú1«çšúáa˙ŠJ˙¶źú1¨8˙Źťt/űo˙´ëÉ+Öľ=őĐ˙íżţÓŻ% QE (˘Š(˘Š(˘Š(˘Š(˘Š+Öľő×?í‡ţÔŻ%ŻYř ×\˙¶űR3±ř¤âŐíźţŚZůîľř¤âŐíźţŚZůî€BŃIEŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤Ą ŠJZ(¤˘€ŠJ(h¤˘€Š( ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h˘’€ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€Š)(h¤˘€Š( ŠJ(h¤˘€ŠJ(h˘’€Š)(h¤˘€ŠJ(kčO…§ţ(+ţÚčĆŻž«čO…§ţ(+ţÚčơ ś‡Ç®şý·˙Úuäµë?zčöß˙iדP(˘ŠQEQEQEQEQEëúëźöĂ˙jW“׫ü ë®Űý©@‡ĹůµOűg˙Łľ}Ż ~(Č…ŞŰ?ýµóíBŃIK@Š( ŠJZ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘’€Š( Š( Š( Š( Š( Š)(h˘’€Š( Š( Š( Š)(h˘Š(˘Š(˘’€ŠJ(h¤˘€Š)(h˘Š(˘Š(˘’€Š( Š)(h˘Š(¤˘€Š( Š( Š( Š)(h˘Š(˘Š(˘Š(¤˘€ŠJZ(¤Ą ŠJZ(˘Š(˘’€Š( Š( Š( Š( Š( Š( ľ‚ř]˙"—˙m?ôcWϵôÂ˙ů´żűi˙Ł€g#ń㮇˙m˙öťy=zżÇnşý·˙ÚuĺQEQEQEQEQEQEW«ü ˙ßý°˙Ú•ĺęßşëöĂ˙jP_ńCţD=SţŮ˙čĹŻź«č‰˙ň!ęźöĎ˙F-|˙@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}đżţD=/ţÚčĆŻź«č†ň!éöÓ˙F5r_żć ˙m˙öťyEz·Ç^ş'ý·˙Úuĺ4QEQEQEQEQEQEWŞü ˙ßý°˙Ú•ĺUęż:ëöĂ˙jP]ń?ţDMSţŮ˙čĹŻŻ~řť˙"&©˙l˙ôb×€PŃEQEQE%-Q@”´QEQIK@Q@RPŃE%-Q@”PŃE%-”PŃIK@”´QIK@RPŃE%-RPŃEQIE-”PŃIE-”PŃEQEQIK@RPŃEQIE-”´QE%-”´QE%-”´QE%-”´QIE-”PŃIE-”PŃIK@RPŃIK@Q@Q@Q@”´QIE-Q@Q@”PŃE%-{˙Ăů4żűi˙ŁľŻřc˙"&—˙m?ôcP%ńÓţ`źöß˙iוWŞüsë˘Űý§^U@Q@Q@Q@Q@Q@Q@z§ŔÎşßý°˙Ú•ĺuęźzë_öĂ˙jP[ń8˙Ĺ ©˙Ű?ýµŕ5ďżOüPşźýł˙Ń‹^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@{÷Ă˙&—˙m?ôcW€×ľü2?ńBéźöÓ˙F5rúčźöß˙iות|rë˘˙Űý§^W@Q@Q@Q@Q@Q@Q@zźŔďůŤŰý©^Y^§đ?ţc_öĂ˙jPYń4˙Ĺ ©˙Ű?ýµŕuď?äFÔ˙íźţŚZđJ(˘Š(˘Š(˘’€ŠJZ(˘’€ŠJZ(¤˘€Š( Š( Š)(h¤˘€Š)(h˘Š(˘Š(¤˘€Š)(h¤Ą Š)(h˘Š(¤˘€Š)(h¤Ą Š( Š( Š( Š)(h˘Š(˘’€ŠJ(h˘’€Š)(h˘Š(¤˘€ŠJ(h¤˘€Š)(h˘Š(˘’€ŠJZ(¤Ą ŠJZ(˘Š(¤Ą Š( ŠJ(h¤Ą Š)(h˘Š(˘Š(˘Š(¤˘€Š)(h˘Š(˘Š+ß>řˇtĎűi˙ŁĽ˝ďáźüÚgý´˙ŃŤ@§Çů‚˙Űý§^Y^§ńĂţ`żöß˙i×–PEPEPEPEPEPEP^ĄđCţc_öÇ˙jW–רü˙×ý±˙Ú”ÖüL˙‘S˙¶ú1kŔëŢţ%˙ČŤ©˙Ű?ý kÁ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ż|řg˙"6™˙m?ôcW×˝ü4˙‘L˙¶źú1¨”řß˙0_űm˙´ëËkÔ~7˙ĚţŰí:ňę(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+Ô~˙ĚkţŘ˙íJňęő‚]uźűc˙łĐYń/ţD}OţŮ˙čk^ ^őń gÁ§Ńţ>µŕ´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW˝|4˙‘L˙¶źúW‚×˝|7đF—ôs˙ʵrźżć ˙mżöťyuz‡ĆŢş7ý¶˙Ů+Ë袊(˘Š(˘Š(˘Š(˘Š(˘Š(ŻNř(ŔK¬/r"?úř××ođŠěAâ†Üq"ŻbŔ†ţA¨Ó3ŤĂ¸üFGăTč ¦-."»µ†âÝ·E*FődW”|YđűZj_ŰČ~Ëv}ÂKß>Í×ëšµđŻÄé-ôU›V=2y)źsČ÷$zW¦ÜÁ Ý´¶÷Q,¶ň®×Ťş0¤ÍWiă^iIs¦¤—zw\¨Ě‘F·¸ý+‹¦EPEPEPE%-QEQEQEQEQEQI@ EPEPEPEPEPEPEPEPEPEPE%-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQI@ EPEPEPEPEPEPEPEPEPE”´QEQEQEQEQ]§ü y«IΤŹi§uË I(ôP{{źÖ€.|&đű]ę_Ű1˙˘ÚÝdpňöDzőúâ˝^îâ+KY®.lQ!wo@MĐCim˝¬KĽKµ#^Š+Ěľ*xť&E±2«fé‡LŽBgŘň}Ŕ´€ŕ5‹ů5MRęöl‡žBřÎvŽĂđ…S˘Š`QEQEQEQEQEQEQE($A ŽAę> ńú:%–ż GXîŹFöCţ×O_Sĺ´PÓ‘¸!^6C)ëXÚż…´]]‹ŢŘF%'&XvÇëŽâ+Ĺt?ęş!Ćé„9É…ţd?éřb»];⏠şŽťÎ9x©˙t˙Ť!šłü1Ńť‰Šęú!é•aüŞąřY§vŐ.ÇÖ%˙ąmń#C”~đ]@Ű‹?ú 5hx˙çţ_Ű˙ Ç˙…Yc˙A[źűňżăI˙ ˛Ëţ‚·÷äŤl˙Â}áßůýoűđ˙áK˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăK˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤ/ü*Ë/ú Üß‘ţ5ł˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăGü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăGü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…c¬˛˙ ­ÇýůăI˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤđ«,żč+q˙~GřÖĎü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@ßđ«,żč+q˙~GřҬ˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăK˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăGü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…c¬˛˙ ­ÇýůăGü*Ë/ú Üß‘ţ5ł˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP7ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[?đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…c¬˛˙ ­ÇýůăI˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤ/ü*Ë/ú Üß‘ţ5ł˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP7ü*Ë/ú Üß‘ţ4źđ«,żč+q˙~GřÖ×ü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@ßđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤđ«,żč+q˙~GřÖ×ü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŇ˙¬˛˙ ­Çýůă[?đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăK˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP7ü*Ë/ú Üß‘ţ4¬˛˙ ­Çýůă[?đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăK˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤđ«,żč+q˙~GřÖĎü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@ßđ«,żč+q˙~GřҬ˛˙ ­Çýůă[_đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…b˙¬˛˙ ­ÇýůăK˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP7ü*Ë/ú Üß‘ţ4źđ«,żč+q˙~GřÖ×ü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŇ˙¬˛˙ ­Çýůă[?đźxwţ›ţü?řQ˙ ÷‡çůżďĂ˙…c¬˛˙ ­ÇýůăI˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤđ«,żč+q˙~GřÖ×ü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4żđ«,żč+q˙~GřÖĎü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@ßđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤl˙Â}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4żđ«,żč+q˙~GřÖĎü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤ/ü*Ë/ú Üß‘ţ5ł˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4żđ«,żč+q˙~GřÖĎü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţ‹˙ ˛Ëţ‚·÷äŤđ«,żč+q˙~GřÖ×ü'Ţ˙źć˙żţÂ}áßůţoűđ˙á@żđ«,żč+q˙~GřŃ˙ ˛Ëţ‚·÷äŤmÂ}áßůţoűđ˙áGü'Ţ˙źć˙żţŤ˙ ˛Ëţ‚·÷äŤ'ü*Ë/ú Üß‘ţ5µ˙ ÷‡çůżďĂ˙…đźxwţ›ţü?řP/ü*Ë/ú Üß‘ţ4żđ«,č+s˙~Wükgţď˙Ďó߇˙ OřOĽ;˙?­˙~ü($|,Óż‹T»?H—üjÄ td`eşľ”zeT#WŹŹü:?ĺńĎý±đŞ·?48‡îĹÔçý±˙ˇ@šG…´]!ŮXFe"YżxĂéžŕ+fG3ČŔÉf=+ĚuŠ<2éÚw8áç~‡ýŃţ5Ĺkž%Őu˛EőÓs‘ |¨?×ńÍw>6ńú"=– w9Y.‡EöOSţ×OOQĺÄ’I$’y$ŇQLAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP˙Ů endstream endobj 52 0 obj << /Subtype /Image /Width 256 /Height 279 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 56 0 R /Filter /FlateDecode >> stream xśÝťy`EÚĆç —ŕr@"DÄEÄED#ňÂ~b8pQ1 ě.*â‚€h@Ŕ€P?\E.Eb9„ý’p@\D„E–`€p‰$™éÍäśî®ă}««»Ŕßź0Őő<“™žęŞ÷pą®­HoŁZB9­iĹłë©–ˇß|¦•s¤‡j%Jh˝O«Ä?÷7ŞĹ8OźóZ ű§ZŽÓLôkÁ\řŁjAŽâťŁđOő¨ĺ«ŚöËH U-Ë)Â7ěkÚ†ÚŞ…9Cčj˘}MŰ\Gµ4'đ® Ř×´ôŐâŕ=Ş}M[ńëż ŽbŘ×´9ŞĺŮMOÓż6\µ@{‰>öŻwR-ŃN¶sěkÚáHŐ"md*׾¦­T-Ň>âJţµGUË´‹đýűÚéFŞ…ÚD"Čľ¦-T-Ôb ţ}żW-Ő>Ú×´ ŐRí 5čćWÁŞĹÚ@*Üľöµj±ňiĂYřęé¨Z®tR0öµ%Şĺʦá/(˙WnP-X2cQö5í/ŞËĹťôżYµbątDÚ×üC;^ŻZ´DŢÄúĽW'ő» pqw‹ă’gîÉÉŮ—ťÝĎv/"ěđ_Á‘Ą#nc\8äé/żţ`c¦ŕ4@¬ýú°?ń<ěĎK/^ü˘ÓćxÜňÂú"Kö”nIěčÖ_·ő,âfÚá56É´LÜeŮ{‡f˝w,Ł-()´«'ü‰,?E¤ 'D—_9:…~ámŠ]WŃjćYąćËńĄ=âËÜJhĄÚyž?eJţÓ×÷/ö˙żˇÚĽ+ěŮźě2 ×ÍWh'uĆW辌v*݇Uě^é $á j÷š¶ÚgŢú7·Ž-Ł1댺‡Ęď}5jIôÝčáď¤l>Tó‹ă?µ'kI‶ćxť• Ms‡$ë˝§¤ÓlKö~8(:čŐa ü¶ó„uď=gîĚ”»đáĘ •¸˝¶Ű3ŐŞůŢ‹.‚'+ü2ˇ¶+b޵G<ąXÚ>őöI˝Śśďâ"ěţ–˝lwßäµĂŞŐ[ç'aűĂpűÔW)G„ýĎU-] g…ýăŽi®VN ű_«Zş űĎT-] {…ý§ZşŇ„ý˙ Zş>öĎŮZşF/ěź y- žQ÷Ť ą%‡6-NŢŻK›¨úU9 nŤë™0ň­ĺ»…Öcâ„e{csęëä!]šy‚<1˙űü‚}ü+Szź°˙ŻěńI d{ňŁ1PY‘˝¦d v.ƉúÇDi‰ăŰ‘Ô}ĽŃsÎ!čçE¨L‰yň)^?´± :W»qٰIňď›`˛˝ŢµŇ5 őEÍWĐfú1ČDg~+tőmuź3ĎÁĂźřU8(ô!{Ü>óţ ˝¤Ąw5I:Çťo‡H:a'»ÜĎ—{,[çîAËc€&ö¸żňř§Śwŕż9łÎÄ_Ô}É÷ţÔ[¤»ŕŔŮv8€lú#ŮŇAľőJÂFśdÍ\€Ż«°\¶űüa¶&µÖ™^Ě|ş˛Ćk’í/żŃ×Á´ÝĚţ l,D/©îóťĆrfd•Ž@^ě&™ö3›ÚbŘDä2Ş„BVô( ć …?Ić9<›§¨ç•;ń_Ȳľ§=VÉÄRďq!É~®Ă•˝Ľ‰”€Đ’»P×i'ÇţvŰďű&zPâ-÷˘*Ëxx)ú 2U”´ŠŢA3uG€kÔT2 źOTSzřđĽ\Y ú8bÔ-ަ@«öW+,ĺ”@TŹú)ʰhťŇ”>¤}âڤżZłż]q«.ćśÜ2¸Á+öĹöÝdrçiłŞÓß#+aśůbű®RąťđĽŽßOÜľ/Ţ6WÚ盄 >–! v"â'ĎR‰3oăÍF ]Ôţ*Ĺ©ŐÄ›v… ‡ÂM—GŻžâMOšB“Ł Ů÷u·Íž1Fuç'®í„’·¦ŰçF€÷ŤňF"˙SŔţľ««|cH†AßaÄvT;Tą’r|âQöĐŕ€Aa_ÄŕĎĐţgŮfD”Ű ô ×!ĆĆbÁÇëÚćCGő}}€YH˙rnäcgź‚ÚĐĽ†d±YŇĘÇÝ´Ë3o,ް-»śoÓS’Ç>Ů]řáş=:‘ÇX‘fF†běűď•ÄőÝ'¤‘÷ńĎoť;˘=F|mô»ÝCÝY˙K´é‰µ•“Bu~ÍčO™~;˙CĚĐßÂËVߊեç¦1”­[#‡’˙÷1đč":Ď 6&G‚ý„Ňd$n ë ŰČÉ٨Sý–şd6Td°š R‹3Śg >ćzÓ přş6Ü şľg9îbg^‡zgČCÝ@€Á >áo˙íë…ܸ0ąp’{‚×ňÚu€!Ç«D¬—>ŐŇQĂĹ)ŔżŕUĐX„ľ@!ąwĹńâ׸ä=ú8GKf!?ţ»„܇L—‘1˝ôy]3ŕřťúń*bżÉ& îË(ť8Ú  ś‡?Ą˙ ¦ŕ’ČQw'ń-f#?Ę%'ÔĽ| XăG°ůç Ř‚Yđđře7ÂĐSÖ .ŽâÎM/б`¬äÚPéÜr©Ş_{*“~$qO—ë> ‚lä©©ÎŃ(X˛]mËýˇtűek^±ÁŐ/…>| ›ą-Ö˙[6Ř/[ľÂž5¬úŰ \…Š€üµ¨D’Ěţ"VĎű Lç˝°Y±˙Çm+‹§Ícî \_Őpp L(đëÎţťÖKŇYĘŚ;J®|Ő1RŘ Đq\p}{«Ł­amď´©|‘tLĺ!EŃÁeÚ»ż„\łřdNvvöÎcř#(íÖ=`[ĺ‹ZC¤¶‚M8ĺźÝü«ŚÜĎ^čSő5®Ő´óó văŢ…·ł«| (nh:_CŚý–Ě*ßćż· Šě÷8í·Ś—éÓ×­üE{˘u&h¶aě»3W:;ž#掛yęß˙]Ŕ˘Š—°>#ŐŔ €.Uă@ĺäKױdž>­Ěp™ľ ëZń ČŔSŔžĄ’ţűő©)«EŻBB&;ĄĂŢ€ýÔXwEiłµ€ÉbasaŇ™§Ń.’Ůx…Îß‚D­¤ţĚ.˙˙oSĹf:  )ĺćW2 ţéy”ś@Ý⸿üż÷f‚­Ň—•»\“/‘‡Ű>\ uĺvĘčZĺoßIŔ<˙ů.Ľy«ű{tA€§w¦lZ¤ĎüŔ˙^Ě«Ö .›üÔ›&°wŘPh”öŚŰ?đź—“Ŕ¶'áq µ‰ąIicĽęňŹ%‹(YŹőźÂBţa §Ô|¸ćżĆgq~ôixY=„+ŘHş%đćđgh ±Żm‡K&ťńî'6őÁo$J‰u ô`|˙źů˙ ¬÷Âč ŘĚ\Ł&{É·ŔÖ>@Ü­ŔŻI`ąă ŁŔÝx›'îYň¸ľkŢă‚7zz8ń X-ˇŞpކ›˘}Těćâ Żü &ą™ OüË_A(ďq”ČU[` €Ň–Y&ž1ʵ^ˇńQ¶ş<|˘w4Ş„;xóăÓĐo%„KvĺDO<Ž˝`«’†?xďÓ|’Ř«ŤÄl}¨Í™2:#Ϥ/@/ÜÔ4t+R™°ŮQq)îżcqŔU¶2 •Tânöć(&í9đ>úzŮ82WVI ůLĹđÝŮÚëĐöáß/Óío‚Y7±)A;˝ĂoĹüo1Ž´.j€} „¶Bk&Ô¶ěßxčő Y7°ëµÁ’‘oëÚöo\T$ Ű53›)ô„Éů±ężžq `Ľ$‘ćĚ_­ťy˘5żˇţŁ ă|RkìaIôó«đ„ă\Ě@ŢÜ- ăĐ!#LµU‘Ŕ/Ť”Th¸¬¦ˇ­‚HÎ,ť=dmt˙iŇüCoeý­¸r„Áî…dŽ1l.YCú0lÓn“¸şŽ­ĐbqŰCG2P¤ŰżOCçbÜ_Őă3ߢ‘활€VşWRZ,oČŢ-0ů÷‡‡ńŕóšÉň?‰©ď8aÄ»ýł6ŘtÔ5¤qý «` »c éíf®‘€ű|t3UÇ­Z˝–ÝDJÄ„]»\oF~-EŔ„[ą8Q„ĽFŻEQPĄăYí@é.O±ĺ#-ĂWI{h;LfęS7 ˙f=r!Oąęe­Oeů/€Ź›šö­µÚŃĂO }—ř&{ţOÖ˙¸n6ĺňN˘GB‡NXď¤,Ň&KŞĹP b÷›†çO"ß[Í+ôoŕVTźQHÉŠ~ îLg!Üż+’Č[Ľôaă.…·ozů_‡ŔČÓ4?e•v°Ć¦Űr±ÁRÁÚŃT˙­[ Y|ĽňßOq®Ö¦đ%Ç6j,ÜăÜpZűâÓߤ§¦®ß\z‚W\nPáNJŞ]X˛”›Ŕ0ŚWЇ6€źSł<Ľ‘I-O/ŁăáYDw‰€ěń°;Ď9^Évxł®RęwôFń"ś5|ň_ö;đ)`f ·i "ny;ő;ꊫőMťĐó»TNěŐÎűą×čŚQřWúun´Ţôîľµ{tă«·˝?ྩÚČ<ÍŞ2Ń“ÓJšO†@}ňZ=ć7/ó?ŐSGýů9 @BGRÚG‚ÁTׯÁŰaÔŠśŕß âěi÷7Ő2póŘńőgĐ~—ařPŵuÔi˙ÔKc¦Lťü\˙Űŕi{=± y•ZŁŢ±ÔţýŚÜcačS¬Ü[JĂ)Vľ{íň ^ ó ⱊäĺ¬éŃ HŚŔgőSĐ•ď~_8:âÇ y2ä]¶h é˝Pđ-xÓ^×5NÚ“Ń·^.˙ę#$Hľ‡YŽďô`yĹ3$1ËÁ C—ĄŠ±vPúĽŁîÍYĚj)@ô`“Ą‘źţnżn™ŐŞ=‘"µ”8 fµ=G)áĽ{— ×$ÇFr%žě! µ˛S,]:˘í¤Éş–x†d Ő7%sŐÜ˙ŕíĄÂď>긜kiđ:†ă+ż ¸ť'ť˘ą˙ČlŰ`Tv·•AŞŤW’©ĆľënŐĆ+™¦Č˙ Hť?ŹĎ˛eǬ»"˙.\`Âçő\®ĆCWKЍá˛ÝqT§ ś¨ŞŇyR–¤jC¬Ueźß{ş˙"]čkČ=#—K*<Ťčm(ťP‰[H5>u{qîöËöŻŔ{[ʦ,üŕ#Śč†w>aEĺç2Ůť#ŻjĹ%~yXËr2Ěőęă Ő[tü­dgĚ endstream endobj 53 0 obj 12037 endobj 54 0 obj << /Subtype /Image /Width 1024 /Height 1024 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 57 0 R /Filter /FlateDecode >> stream xśíÝ]h]é}ďńaŚ1Ć!$„P…ŞĘ¨B Ő•+\«FŘw„±cĆ3ő`ăÁÓ’‹¶W…¶ô®ôćś$Ą˝JsQ8„hZN_rÓˇ‡ŇN é )i&É´yi“Î0™7ź®g­µĄ˝eOf’zkiüű|Ľ\ÎÚđýŻçyÖÚ[Ź=ŔĂô8đľuÝëĂŃő§t]7ü#ęúcGG×5˙pŢëjžöx4f€ÚáářŔÍáĂĂöAď3ýCŔĽĎ!Đuçôîńď^ßáZwź/d{űřŕŚ€Ćß^Sďş*G€h'–¦ťÁ1p0'Ŕâ/ĺ7á—Kęú3…š:śf Ě€7öÖ_·?p·?z´úg×1`ŹţBJ1»“ ý3ŕ` €=ő·űöž?Xűđ'B»hĎܸŻţťö{ĺ75Z´˙3:ě1ÚßHß(h‡@;Ö¨żwëďµßë~l řqŕ¦ÁXoěĚ€EŔA}őßßţčČXéţÇććo|ěS/|ös/~ţ űŇ—ţţKŔýý—^úŰ/|ţĹĎ}ö…O}ě7žý™/s`ldôţĐ7ş®żwóoüJýĺ¶_ý«˙؇>őâW^{ç˙?‚w^űĘ‹đˇ«We´j„%ŔžĄ˙áťřGJüżđÇ/+ţŰŢyůʎڀ‘ťpxĎ& ăü Ô_âżô'Żuý©ÁŁăµ?ąÔŚ€ľ p¨ÓĐżőoWţő­tlü·_éúă‚GÍ+ż=^oF޵»€NţĘżP{ďźřź˙Ůő'Ź˘˙ü_íŕH˙& ‹ĐżößąůWőŹ˙Ęwşţ”ŕQőť_o&ŔŃţ °˙ /˙ć™_}ä?>ţ×ő'ʞżű‰ńńŃŢč˝´ß ńßËżĽŘóëotýńŔŁíŤ_/Ż ő@'[€˝'eç?6>1ůg]6đčűłÉ‰ń±ö`ŕpżóŻ˙GŹÔ;˙*˙ŻvýÁ@‚—Ë({€*ľýß ä¸¬ý«ť˙ÄÄO˝ÚőÇ^ý©‰‰r pěčîw‚öměö_˙ÇŽ«oţ§lýaźĽńłőŕXŮ´[€ýęż—óŕďhóĚň§ßěú#oţôdó.Ŕѝǀű3˙řÄÔńďwý@’ďźjöy ,ţ«üGĆĆ'§¦żÝőÇYľ==5YÔ`w °ů·ý·Źý«ügţ¦ëŇüÍL3ŽŐ+€ý9Ř]ý÷ĺ?ýń®? Čóńéţ°/;€ÝÍyí§ěý«ü®ëý\=FGĘ‹@»GCÎ˙ńť'##Łă“Ół6˙ĐoĎNONŚ×/µGC^ěŮüŹŽMLMĎ|˘ëŹ2}bfzjbltĎŔđó?ÔĽöWÝý§f~ŇŻ|A'ŢůÉ™©zP^<4ôĐřwěXsô?÷ą®?HőąąŢC€ţ#Ŕáćß[ý—÷~¦çÖşţ ×Ú\µÝŹŔŔíż=ű›˙‹®?Čőóíŕđ«˙ѱ˛ůź[´ű‡ÎĽłXvĺ«@Ă;ý7«˙±ÉÉ™ąăż×őÉ~ďřÜĚääŘXý `żúoo˙łó ˙ŢőőC˛_źÝY ł˙ľĺ{řWÝţľëˇl?_-ĘWwźgěĽú×»ýOĎÍ/|¦ë«‡lźYź›Ţ=V˙}˙ęÝ}ű_üf×WŮľąX/ĆÚŔ°öźţŤ´·˙Ĺ÷şľzČvďÄb»ć ŕîň˙hÝ˙ÔĚüńĹßęúâ!Ýo-źź©żpôčđ6ý§ŁŁő«? KŢý…Ž}niˇ~ ¨~ pçđáçżóđŻ^ţĎTË˙ĺŻu}íîkËŐ`¦Ţ ď`ßňż~őwzvnaiĺő®ŻŇ˝ľ˛´07;˝ó5Ŕaőżsú_~ő§Zţ/.źrü»wŞZT€ň÷úž<ěüN˙ËĂżĄ•Źt}éŔGV–šG€Ă{0¸ýŻ–˙3ó K«żŰő•ż»ş´0?3Ý~ p¨ý·ďţ6Ë˙Ő˙Óő•źYím†vĐß»ü_\9ń˙şľrŕĹ+í;€ŁCěgű?26Y^ţYZ]˙R×W|i}u©Ľ496ŇđpóßÝţŹŐŰ˙ĹĄµő—»ľrŕ_Şţ뀱!ěŮţOÍĚ_\^[÷íčÜż­Ż-/źť™ÚŔ¶˙K+'N~·ë+ľ{ňÄÎŔˇö¸í˛ŢţźŘxµë+^Ý8QL¶ýF˙˝ßý.Çĺé˙ňęú)Ż˙Bç^?µľş\Ţh?ôŔ˙UŰ˙Sov}ĺŔ›§ĘŔý€˝˙jýßüňßěüâĘÚúé·şľrŕ­Óëk+‹Çg›_ÜýK Cčż|ůobj¦î˙äé·»ľrŕíÓ'ëţg¦&ĘW~˙Ç˙ő㿥•§ýíčÜ;§7Ę€á=ÜÓ˙äô\}üż©čÜ;›ő€ą™ţŻŻ˙ňřoaiu}ăŚţˇsďśŮXŻż89¤˙—·˙K˙§ÎřůčÜ˝3§šţ§&‡ó@Ż˙=Ź˙őÝ«űx`ýʶýŻé‚Ň˙ZŰ˙čđúoükçőźÓ[ú‡ÎÝŰ:˝óĐÎO€=äţű_˙›ŞżýwR˙pTýź¬ż85¤Đ˙Šţá@¨ű_Ůżţ§Ű×˙ôÝkűźźÖűŻ˙ňçĘ ýĂAPú?±R˙Đá÷?Úüĺß•µŤMýC÷îmmn¬5ýOڱ˙ĂM˙íŹ˙žÜ<«čÜ˝ł›'{?\÷˙°żÔ˙őßúëőŻé€¦˙ĄŢţ€ďűúŻţá ŘÓ˙Ă˙đŔßţťŘůúŻţˇ{÷Îî|xbŕoëyűÚßĎčş××˙ŕ€ ·Ď˙ŕ(Ď˙ô™ö»˙鹦ëč^Ż˙ąiýCš{gő©ôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôąôą:ë˙ť®ŻxG˙««ţ·ŢîúĘ··ö·˙™YýĂAŃëvfźű«ë+Ţę¦˙ÓgßěúĘ7Ϟ޿ţG'vű˙~×W|·˙‰Ńýëóěk]_9đÚŮÍýé˙p˙'7Ď~Żë+ľwvód˙‡‡Ö˙‘ÁţżÝő•ßě˙ČĐú?Ňö?w|±î˙ë]_9đrµţ_[Y<>×ö?¬ő˙ˇ¦˙ÉéąůĹ•µŤÍ­ěúĘÜŞűźź›žlú?4ÄţÇĆ›ţOś<˝ő…®ŻřüÖéjý_÷_ž˙ »˙‰éŮr˙Żú˙ż]_9đŮŞ˙r˙źťžŘ—ţ§fŹ7ý˙A×W|˛é˙řěÔţőż\ú˙µ®ŻřµŇ˙ňpűĽé˙čČhµţź™Żú_?˝uŮ€@Çîmoť^Żúźź©Ö˙Ł#G›ţčý?q¸îl˛ęˇę˙Ô™sŻw}íîősgNUý/TýOŽŐý~bxýŹ´ýŻ–ţ_éúÚ!Ý+Ą˙Ő¶˙‘aö_ľPÝ˙§Şţ—ęţ˙Şëk‡tU÷żTő?UÝ˙Ëë˙Cę˙PÓ˙ÄdÓ˙Ć™sďúÚ!ÝÇĎťŮhúźśhú?4ÔţË @Ç—VË€8„nÝ»\~ţcuéřÜĚäřľôżű|:őí ďöó­˙űżÜľxţĎ»ľzČöçç{Ż˙ ëëż_®_*ýŻWýßíúę!ŰÝóĺńßëĂëç Í @§Îś»řÝ®/’}÷bóřżyýg(Ż˙ő˙Ŕŕ g/ţﮯ’}úâŮű˙Ł˙ľĘŔöŔ…m:óÎö…öř÷ńßĂ~üß ĺ€ę_Ű:éó]ëó—Îo5żţ57´Ç˙ý· >Ř:wńé®?ČőôĹs[őö˙řlóëCíż˙p©>Ľ°íG€ #_ŘľP˙-=ŕřď!öß÷ >śŞÖ76ĎžňCŢ„NÜűĐ“çĎn–·Ź×o˙ŹôľýűpŹ˙x°XŢÜ:éň§»ţ Ó§/WŰ˙ňö_óăżĂÚţßw0Y~pyődyŕÉ+Ţ€|÷Ę“ĺé˙ÉŐĺňăĂŰţď9h~hˇŮ\¸tůĂ]čĂ—/]h–˙ íŹ˙ iűßßů  ť'€§Ďśż¸}ĺ…®?Čó•í‹çĎśnźţ•ĺ˙ö˙ˇößö}¸Ţ”W/óôµËŰĎźÝ<µľ¶R˙§z·˙ać?pX-Ć&'Ë`iuýdspő©j<űÉW»ţ„ŕQőę'ź­ňęjłů?ąľşTn˙““cőíźúß9hw'NnÖ«pă™[·˙Č‚×˙čö­gnTů׏ţ6OžhW˙»»˙aö?8Ę#€ňPy `ýT9|˛ן~ćŮ[w>ó]Rđ¨ůŹĎÜąőě3O_ŻĎţÎť9}ŞţŐ˙úŐźć›CÎż˙`ýŕřdó  ZlśŢŞVŰ—Ż•=Ŕ­Ű·çĄ7şţ¸ŕŃńĆKżsűö­˛öŻöţŐÝëôFąý×g˙“Íłża>üí`¤Ý”ď­olnť=ńÉ+WŻ=]–·ď<÷‰—ľă—ÁŕżíŢw^úÄswn—›˙Ó×®^yňâů’˙zůŢO»úŮŹŰß`ç% ŢX;yjsëÜ…KŐŕÚőë7nŢ|ööť;w?ú±żü§o˝a ŔŹäŢßú§żüŘGďŢąsűŮ›7o\ż~­Zű—»˙ćĆɵťü{Żţ űöżwP `ş>lŔŮóePźÜ|öŮŰ·ź»s÷îóĎ˙ňoţţ úâ_ńľüĎ_yůkßx啯˙ë7˙ h}ó_ż^şxĺ_{ů+˙üĺřâ_żř§/üţoţňóĎß˝{çąŰ·ź-Çţeç_­ý«»˙fyíż>ű›®_üß—ŐŰď/–@sŘ€ŤÍ3ÍŕʵjܨFŔ­[wĘ2ŕąj<˙ü˙h|xWm&Ą*śęĆçÖ­*ţUý×®”›˙ą­3őÝżäßžýŐ«˙ťW˙†Ř˙î Ŕˇ#ÍŚON•ź©Ďę=Ŕů‹ŐŕĘŐfT«€[·oW×đÜťçž»{·üçîÝz{Őy4ĄTÉTáT›ţjá_×őJuóżxţ\ąů×{˙ňŁSĺWJţG }÷ßëçđh9¬Ŕ|9(ŹĘ šŐŕjY´3 ZTc •ćżűő©ÂŻnűműĺÖµÜűKýĺćbµěýç›üGÚŐ˙~ÜţwŔý`¦=\[ß8µyćěą Ő(‹€jP-nÜxć™j ”9PM‚ćż«‹»´ę$v©r©˘©Ňyúzuç/·ţŞţ çΞŮ<µ±ľÖýÍôç˙ÄľäßŘü5đvPŔňęZy`sël˝ŘŢľR­®=U†@ĺF홞›Ď­ÝšNJ1UúO]«îüW¶·ë{˙Ů­ÍňÔmuąäß»ű×ń{?˙vűoŹš0Zľ 8=3;ż°°\M€ő“§š P-.mo_.Ë€k×Ę(`×ÓŔŽţ6J+Ą™r㿼˝}©şő7őW;˙Şţĺ……ůŮrň_öţ#ÍâV˙ď2ęĘ«ŔKË+k'ę p¦e#đd—ŻT®6®]k®­ý?®żŠ˘Ôrą¤˙dYö×ńź©ë?±¶˛ĽT^ú­_űé"˙#€ú›@ĺďL´‡e°ZM€ŤS§Ď”PÍ€z!PŤjT˙ő•]v´YĄ”*üú¶_µ_â?súÔFU˙jYú·[˙r÷?věŘŔâ?ňďëżÍ‹€ŁăŐ`znţx˝¨'ŔF˝ Ř*CŕÜůj)pábOua—€Ą‹ž*—óUůUú[őťŁ®żľ÷źź›®ÖţăŁÍk‡ű^üŰ—ţŔ‘Łő‹@Í`vnľŮ¬®µ# šŐB`ëlĺ\«ş°óŔçęäkĄ—Şü3UűmükMýóósłíÍżĽöSúßďüű@ł¨öĺ1ŔÄädy¸L€ĹĄ•j¬­ŻŻoTC L2Ę((Ăx°:‘ŇĘéR~•ţFŃZ˙ĘŇb]˙ĚôÔdÉżŞżĽöÓ.ţ÷5˙P›ĆĆË“Ŕf,,.-­,ŻVË€ëë'+ő (Nď˘i¤ÔRŞY_?QÝřW—W––šúËSżń±ö±ďK?űś˙Ţ-@3FGÇË&`z¦Ů”°\íŞ!PMe'×› jóX/ŮWŞŰţjµę_îĹ?;SnţăeçßćßÁâ˙ľPŻš 0ÖŰ”E@Ő ¨†ŔňĘJ™ő(~¦”*™ĺ’~µě/ńW·ţŢʬWďÁ_ůnš p¬™Se03WVÇŹ/TS ŚfěZZi4µTŮ,,TUí—ř§§¦Ş´šúŹő×ßIţíč?¬—Ő. ZLÔű€˛­eT ú§ ĆBc‚íÍ`ˇÎ¤ô2_ßögËŞż^÷O”C˙ŞţŢÍż˙äo˙óď‡Ú%ŔŃŁí l&¦ęÓŔb¶şŠ˛(ł v|×<{@ Ą”RĚlO9ń›š¨ţÍ˝˙h{đ×·öď"˙Ŕ eLÖC ”IĐ\PY{őň©s™žŞÓź,í·ń÷×˙D·w˙ÝĐ›‡Ű]@ł(# Z”óŔ˛š,ç‚­©žiw_u,eĹ_Îűę˝đoăŻ_ů믿«ü<8ÔN€ŁeÔ«€‘±f ŚW[—r&P›ŢĹN#Ą™¦ü±‘ćÎ_Ő´­˙PÇ[˙˝`w°wT j)ЬăŔ»Ří¤Î¦>ďŰŰţAąů÷€v´ß j7e4S ™Łí˙Ś÷éo¤©¦čh»ěßý®Ďný]ç˙  Đ7Ęh¦@ß(ŢÝn/GŰô{íŔú‹= > čiÇ@= ZÇ€űô%r¤ ˙HďŔo÷Č˙ Ő˙ŘîŘ™í (Cŕp=ľ€JN}Űďo·ţ“˙c} oÔ[C‡Ű1přđŔŠxťXšvÚߍ˙@Ő_<ţŔ°3ÚcvÜoO!{BzüŕÖ_{÷đŔq řŮôřkŹřWĽOUuÝř{xü>]|đÁtK]×ýţÜ˙ďm Ŕ{xŹlş®ú‡óĽo]×ü#ęúcş®~8şţá¤ë^Ř_˙Ű´Ü endstream endobj 55 0 obj 33253 endobj 56 0 obj 5272 endobj 57 0 obj 8054 endobj 46 0 obj << /Font << /Font5 28 0 R /Font7 50 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R /Image6 49 0 R /Image8 51 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 58 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 59 0 R /Resources 60 0 R /Annots 62 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 59 0 obj << /Filter /FlateDecode /Length 61 0 R >> stream xśíZŰrÇ]FOŢ—üD¬Č*e4Ý==—Ǹ$ŮQśŘˇK"úAEÇRą@;rR•żĘOäoň9={0A˛Rrq¸ł=Ó§§çô >¶ä|kŻßtÁ+ţžť·[GłúPď¸ř7ŮźóV˘¦čkóĺô˝¦`ËöÂűýˇ}Ýţ#ŰÇż]ţőĂ;ßľ˙,°˝SB°áÄ—ěĄHűóű+™úĐ~˙°=ĆkÍNĺWŞ1GÎvE)†DfŚ gÉxůPĽ83ÍEsć9¶śaę3iŦ¶6ëäÁăÓUu÷đÁţŞŹŽ˝i9©Ń’¦›†7úůů ?·ŹźýôăßµëĘâűUNCv%rbi•]I„G-:ćßµi^6/šoš/›×ÍďńűMóęłvńCűtqcĚäBŘŘd쀓¨c8VŰâ·?řřr'o„ĽQ¨ĆżB˛+é~‚u.kŕhndĽj ‹FžAË Šr®ĐĐnBö ĆÙđ]Ţ%(»XÖ}\J%sjE«O>®„ÂźA˙Óć^ó¤9iNvăj»±Ś¸Ą·Řş¢tÉaFŘÍĂTí9ÚMČ„Ĺt„!ć=±gŹGżGʱ^ lŔć”eŻ1¬R6AW§,`Ic-9|ŁË‘$lKľĎšçu%~ä»ă |Iň… 1 u8imTi«/HA3[ţTJ9Łî€ÓR˝Ţű|F|gáxĘó–ÚZkđ‡öí·ľýü—ŞĘxăŐ‹/`5yŔ€şĂ»'+v<ěßÇĐĺ7Ôń'ĹT=Ţt9'ëJžc[ ‹‹A-BC %9\kŔĚw ‚Öňó‡—»xm\ç“Ű“¤śnÄĹ­&Á$€äJŞóů–\śŠMXőĄ8Š˝‡1pD@ ě±ČRçŕ’u+!GŠű*îU)%TĚ…[óŻšHÄ]f7ĹhauÖ*Č\ł,‡ÚÇ:0ą\`CŠ›€Y¶´›í–” p88†)*z‹AlU©ŤJm­ąĄ(Žpgäz•ŕ¸>Qg`.Xˇ˛Ô0ΦC’ŘUF˘Ŕ˘{°Ź±ĘĘí2˛˘äm&ĹpK>ö­™Ě¬˛­ŠťŹY‚ Áś€đ5ę—5 $YЦX޸S [q`ů–3•~¬‚˘Ě ĺ!ŔzA9´›QěYVŔÉČy¨>¬Ş ŰČ ’[Ô;‚Ąä™:x -’>¬2Ž | ab›%ß¶‹ç‡Č’ÂŽÓăFĂ×!KŔV ‡>Vâŕ”ëĆ "UVŔĺ Äâ†ZŐę©ő„ÍtăM<üőĂş F„rtôfâ;— m0ţÇż;÷ţ/ˇ}ňÓč©mîHAëFt0—Ř…mÔÓ[NDŻôňĐtíą–ޱś@ď ˙5†w«{¬[k±ăjĄ*«ŞůQsŚ:ç5‚ôMÝĂ:ĆőĽż‚’>nî5źŕ}ú y Qý7~5ükG˝©# c€¤^ëÎuë’LO®p&®žV9›°‚4Ü—BcŰ Űź4%,R\ńĆH»ľĆëK=UżQź^€Ę'5ătäuŰ“ĎđůUĺď¸y~w].kÂaÜm«d%±Úćđ…R–…™ęZ)úőc[Î1źmíBÇ’˘Sż„/kEčćäśµ¬äQ@«M·ˇBń|áiÖ[=›a!¨v‚l†E¦Ý73`µOYéÇ€śÍ»;Ţ6Žj|Ö„ôφ@ÝšŮ×:~ľ›w\‚©©•Ž ĘYéř€¬t|Ľm˘cxÖigëG :~Çý®Üď!NŚBZ׎‰lúQw^TUă˙nŔś\ë0ďÂk‡đ:Ů}ů‹ľÔŤ?iÁ*r{"Ýiů“>ăo:uńE“&[’ Š Ąő|5LX÷~Ý|şă޶ŐLŔ襴ĹĚM¸xT¶xDÎâDë>mŽÄ3h9AäłÂ64śA{oÓ9f!ăÝĄRţ?ŹČ¶ÉČ#üÄRť “r^Á–3,8W19¶ť°ýĹd@YS˘_Kl‰Ăw J•J_„Ů–r˛ďd® o͋ܪďĽ7jLe«ăçD==ş´8:==úăŃ»ŁO›ăăéió/C>9zttđî5v5†Č×»s\r§éÁ‡r="·-ň=G=¶śaZâPŚm'l.EŔĄjH6™]˘B#™‹!;›meÂĽËť?u9nÝ"°Im'Nw~ńω˛ë3Ǩҳ/”6˝VŢfŇ#GłéK™}ľŔŰ„ÄŰę±ôo—ňFś’ůľHň]î$‘bE÷„-gŮ×}úsä±ń ĽsT3ŠU«ęJąÜ·qĽŇ­27‚+Ô©zZŁn Nbv–;âţ;qT’}ăĹľ>äý~eż§>—s0Ĺčűď`MÍ'đ*ÄÇQ1ÎŔĐ˙>Ęu=uöúć - endstream endobj 61 0 obj 1968 endobj 62 0 obj [ ] endobj 60 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 63 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 64 0 R /Resources 65 0 R /Annots 67 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 64 0 obj << /Filter /FlateDecode /Length 66 0 R >> stream xśíZݲÇ^Á•ç&Ź›`Š,3Ý=—qv Ž'§Š:ގ\ÂNŞň€ąJž ϧČ׳»Ú‘´"Ň‘ŽĘU•tV;Ó3ýőď¬Ţ×ZŁŻ_ub=ţ^ľ3ďŤm­u9$oĄÜ±ţ7éźw†ŹÁ–á‹ń YE/fí‹~ľ5/Í÷ňŢÜűőâ/o_[óćŻ@úŽIŘAFË6'˙͏o®$ę­ůöŽ9ĂkCNbOY®Ľ)PŇ+D§Â\¦Ä s8+Ůr«˘)ű”¨Ććmrľ`ăŘ«ÂiĐřxUÔ=|ѿކÖ1Vc(ú–Ůç8Ţ4Ľ±ÎĎç0˙ŃÜ{řĂ÷ó†u)óoW9•Ôć@‘ŘxjstjŢ17˙ĆÜn¸yŢP-F(¤T aÜěk„ÉÉyçśkF—v1—ÚPţmęPÚs˘h[ň6Ú°b ýš›ÍýćĽ9ߍ«íÂěÖIŘ"ë„î‚CEŘU„ÁU{‡q#ra!0ŘĽud 3Ońő 8ďÝććˇLaŐŽm¤`D¦ÄĽ€Y»-žü´ą¸oóćIóĹÁśĺÖ#˘źÜŹ—z{]ŁlŔjĘ’őAV)ˇ«S&Hiäs ßЦŕX¶߇ͣ’‰żBđÝ1 řBk u8im®ĐV^Z ‰O¤ńÓ“řĐ‘ł¬{PŔőZďu^ßIř;fydśůÎč€ß™W_[ó řĎĄ*ŁÉ«g_@j´ŚŐ…pöm’-rĎWäXČqvAľˇě?z¸˛$¬Ä"‘¤u)xjÁŞÚ ^-T‚äŘâÚKQĐŞA~~çĂ*®÷ĺs§ăAí‘cŠ×˘âI©‘á(ą˘÷âÓ‰Tł: ¤Úś[z că°€(d‘d]§ŕ$Q—هŠű*ęőśłL“ÂÉôëµHÄ]*7† fu ű€.HU±°¬˝Ź.Fŕ\­˘‚ćFŕe ˝Yo @‰ÁÉÁ6ě$»ěOhÄÚµˇ Ő]yÍ5'˛âu*WŠëSnL1+q1ă¤uHd˝JÄ-’îÁ:F–ĺÓ2˘˘60äÔ“‚śHÇŢšśŠőwűPA,­*ć«Ô/ŠpÔíBta'CÖć@ă-%—ű˝2Z\A‹‚őĺ0nD–…Čžm”ڇ~€±éĂş §9ÂÉ ß ćśŞęŕj‘řĘ*ĺč6zÁç(LôpEÉ×fţč˛$SëÓäŕc”%ŕYŁĹ™XZOĺŕ–Ę+࢑ÜĐ«j˘GŹXU7^Çä/ď”S0ç¸TQť¦ŕQ°ď”'Ć`˙÷~óîő›?‹ą˙ĂRSkĄµđŇK#yɸrÝYZç0ë'UĨ5h<Â8çŘ·°fĚÎ6GÚóTĂvF7{!ÄQ‡ O‹Ylď#§]fg{ü١[Î ElLŽ–ŕIóľwďÓ«‡Š¸rLžw÷‹âËÁ(ú.Ę}W[—µ«Úr2«]Ú]ńtŢŹŃąť57›Ođľ¸ÝĽB÷ 7>ţkGć¦óźč26—sŚF.ŁB«ś1Ňu«śŤXFÚď[ďĺŘŰź4·%řáÚH»žŕő%ŇZ[řGîwĺ~Źf¨*©Pi)ĺëš ]ĘO×`ÎŹşÍŹćµyťďžţ‚Íĺ ™ XElŹÎď”ţ¸ŹřSOůlöŃGMI(ťĐJ6ŚČ{żl>Ý1«m#Ř˝¸·9FiÂ6č)ň¦xBÁ¸ôőśô)ňß.*Ô# 2ČM]NQĂUĎrťBúć.ˇ5lá=EuÉĆ ő¦Gą˝«.{ąńčŤ<'žŠĐŢíő ôc{÷Óoď*“…|´këľ2˘µŻD 1·ÉŻşJ…N»ă‘EěęŚËA;ůâ˙ţ5‚•X~U:)_b¦ŕ¨‚#älŮ‘bĂŔ Úű&쏝&©6ćLî˙ó÷#[¬9Šłr¬ŐSÉÜč|˝¤´‚-*LXŤUĺrěíßůę“Óô·]\6›ĂđĂ»<„őŕPÄőÇw‰JŕßĐ"߇„4Ů{ŇCł[łůěâböűŮë٧Íđőâ˘ů‡"źĚîÎn Ú=âB„¶H6—s .+ Dú8Öv'š1łEơĹU)o9r"çíîi1|´>âÚ(Ó©¤°őđĽ“\µvn~ăźÍź@Ţ­Ůk|ţüĆżnüűĘüm—ŽXŰĆ”Ňô®A n7jKsKŃ×)ć&ş endstream endobj 66 0 obj 2051 endobj 67 0 obj [ ] endobj 65 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 68 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 69 0 R /Resources 70 0 R /Annots 72 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 69 0 obj << /Filter /FlateDecode /Length 71 0 R >> stream xśíZÝŽÇî+÷M¤Ľ@n DŠŞ:§ţ.cĆ–'¬#ˇu ˛zíŕDĘú*y‚şXȆŕ:ŃżB'j˙±0[/b´řdC0–ś·ÔŚ·c†úq#˛­XLnŤâŚ1Š`tq#0QůüoU†¬BHцšHY§ö ¦đg¨˙QułzXWÇ›éj=±»5ě×Đ:€Â<µÁˇPX «v:ěÇŤČ óa ÍkcµĹĚSúúÎ{żşą«¦Ŕµ!¬Ż™§ČśŔ,^U’ß»’B0K˘„iJWhÁSL9Ś$ăŰxn ;ëJ¬)0—¬ †ŽĐÖ†ˇ5˘˘Çj‘˛°p Ć;†Ĺ:µvɬńäŐé)ô6ŻžWźî¬ł¤"úÁýx»×Xë’Ęz¬TYÔÎó˘ĘFčň*c¤4ëRô;_Ż˘7Äë‚ďăęiÎÄ_!řn/ľ ARCí®´^m&«-¤@b­ÄOgŮůV9CÝ®“z'óBń-…b–§µ©ż«eŔő›Żuý ôźrUf'ź^~ ŞA TLÉ©Čkč/ĐŃ cô6„.~!Ż?8¸2Gp˘‘Hb  {=ű±€+ĺى…˛çž ­ä'÷.qą.—Z÷bb¸OR '@Éś3 $âÄi@U§¤Śď$Ś…Ă[Ť$kZGÂV@Śî+îË×QJś1I “Ż“"o Ýŕ˝Ő!ě<ş !Ȳza†á\Š­ Ść†áeŤĽ,Żx – Ë;۰ád’; K׆‚TVĺ$×ČŠ=Äém~ \(Č&%`LY‘˛G©CÉS´¤tw–1˛,ÎĄÉ€!ű(žäů@2ÖđÖh„¬“¸Ű… K¬E0_Q}“Í€‚„hăŁđ˛4om4©[+ˇ…HÔŚ ¬+(űq#2"[¶2bú¢wë*Ślä0Ĺý\0ĄXToP‹„»(«DGwĐ ľBa"›(Jľ®çOw)K’U1ÝOŢGY] k(đ@ČĬśÍ7°TZ›DrCŻ*‰z=bEÝx“żľ—wÁڎ\Eµ’‚GÁľcšő?řěüí»żrýđ‡ARKĄ5Óŕ%DÁ:Nx2í^Zë0Ë;EÄ(65zhÜÂŘçض°&ĚN:»ĺ®†nŤ*¬öBŁ:<ž4˛ŘÖ[N›ĚNz˙łC m™)ber´Ď«gđ˝#xź<=Ú•ĂícŇ$ą=¸_`—7FŃwŮÔuŢ“kF Mu2ýĐÚ>RJ9ňő5ü%ÇĚÍúlak%V©Ľ3B‹]Ú}(ăęx…>íE§š‡řy†Îí¨şY}„źÓ;Ő4q/ńâłţż6ÔÜ#0?č]Ć*;űhä*„°¨3BzĐfQg#–ö»Ö{;bŰ+ÍÁm- |eJ» <Çç <ŞWŐo (Źo/ˇĘ‡9õĘk·ĂăűIÖßQőtÝ1ZĂQ즻u;'mt×´´ubÉZ“k3DŰ®^YĹšÓQj%F)xÇŇm$‘čň*¸őÉ9«­3Úç|| ±¶KłŤXGő¬Ŕťk€óÖ$ôéµÓ=rV˛;Ľ6¬jkD:Šg˝ˇ®­$V?źŔJƉĄz_`śĐ.Óă=˛ŔřđÚ¨Ž~®Ąť­i-1~­űMużE3T”T(‹¤”reM….ĺ—k0Ç{]ćµym`^Ç›§?ŻSŢh¦ZElĆm”ţ¨‹řS§|:ąŕ‚¤$”†íB6 Č{żŻnmŐÖ’a¬žMkČěŁ4!íey“ťEÁ)÷őĺůoD›uH‚ĺĆŚS”pŃł\%‘®ą‹h Ľ'‹.ęŕĺPozԞۻâtčĺĆ#Đ<'NEwhď¶:˝nď~ůí]a˛ ŹvmŮWF´ô•Ŕ>$ݢ«č´;î™Ä¦Î8 ÚČţ6‚ćoDŹNĘĺCĚčŤ- f„ŚÎ+¬X@[źaÂţ¬%#IJ…”¬ąľ?˛Aô$ÚŤmc¨źr0´€5>ű:ڱ­#¨śÄř¤Y¶•EąsA˙"hŕÄrôd`cxcçIn”pSÂÖÚ1Ŕ sčB ˝:"?EWí'Š&©#–\R\Í/ąä€Ťî7 ˝ĽG˘˝@„°×vą¶vF+śI¨ô‘täî•“7®žĺŤ¨›y§ń¤ú|ă«^k Ű ’7üSš"ü[{RÝŞ¨:˝»+-UÍÜiRűp&Ë^w`ňm.ąŠşĄum;Ń­Ď={»ĂcŢ]“T!ç±Č.ź|nF÷řbćC mz÷Ü7žŁä°¦Ŕä.p6óaěmżď*÷v’—›Ĺ”SmňýµďÔ§EoІäęw+^1[».śĆÉíXgĺµ4˛GłŰłůěôtöĺěíěVő_|==­~äŁŮýŮíŢ4öČ#)‚’_eg†Ŕ-X+—t{žLŘ5#T4\ĂȉŽkóř$‘ÖmĚŤ lCĽ¤*­_{tŰŇAž_:µ˝ńŻę/PŢíŮ[üţÝŤßřĎĄő·ž:*}bŚÓ,\AYn µ=źO›ĽY„B<9ÍíiKDĐb=ÔŚBMô-6-ŔKś¶8…Ú’Řç¬Ćž]8­Ľką[ç«™wŞĽ.ż5™ţjÁ>ŮpŠńö×a4ňů—ÁĐę endstream endobj 71 0 obj 2351 endobj 72 0 obj [ ] endobj 70 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 73 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 74 0 R /Resources 75 0 R /Annots 77 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 74 0 obj << /Filter /FlateDecode /Length 76 0 R >> stream xśí[[ŹÇî'÷K¤üĽ u9u{Ś–Ŕ ëHh¬ĆN¤<ĺ×ĺ)ůů ţůNőĄjfz–ž«l´;ÚŮžo»ęś®sŻ:óˇVBÖüú]{AŇâďůűúC-…”*ş`%Ą;–?ă&ţóľ6Îz'Óđ&ĐŇz⋦^úŔďďęWő÷ ňˇľóűćoďŢČúíßAAóŻdh#c&šúÇ·[‘zW{«>Ák…N0VGR¸˛Ö§_)ďČ+&¦˘&`%)J#´Ž6]bMY”MX›±‚úĎWiąűü×J'”7µöVcŁĎ7őżŕó‹9̬ďÜ˙áűŘÚ0+óoeJAD§˝6µŐ"z…©ć­äćßÔ7*S˝¨žWĎŞŐ«ęŢżŞ^ެçßŐ÷ćŰÓZ Š4Ćí0±2Vh,¬­Ł\?ńÉĹ‹<˘ÎKˇeůł"xľ2í1sÁ’vĽŚݤJët5ršBHP?.#›*ĆäZYN)% ”.LQ„K?«kHÂű´ŻŤÚJ/Ý‚*üâżW]­îV§Őé4Y­' ·ŠÜZG3­s(ÖC…Ŕ`Şť űqŮA`ÎďC`Đy©´ÔyL^ż…ńŢ®®î*)p­ŚôÚŐDcd^B-^Tâ÷]IÁ™EÂ8Ą*…w&ÄäF˘r­?WЬ¶%ÖŤZű„ C3´±bH Żčđ´YxpvĆ;)†ĆsJiŁZcÉĎŞł3Čm^=­ľÜYfQXxôŁŰń°îNâY—DÖcĄČ‚´ŽE–ˇíEFiÚĆŕvtľN§ ­sľ÷«‡)ç;1_ŕ|AÂpµ»Đz±©$¶ôâ‰lĐě?­&ëZá y¸nŐ»5/ßRř'fyX«ú»šü±~ýµ¬żücĘĘôčŐó/AŐKŮ™hE 5tOčHĐQrBßžß[2p"HBđĚ 99»eW‘e %GŃ \[ň@=ZVČ/n]ĽÄĺsŮŘ®qżěŢřŕ˛ÄŁT˝ ĺňÖ*GZbŮh@UĆ(”ëV đ¤%‚¬j8g¶<|tźqołĽÖÄH ă p´őµś$â.¦ëťcµ:Ć[‡*—dˇYµ3C0.AšQBqC°˛†oć[Pm M;ë°˘¨˘=˘sŐ†„”źĘr¬9’;,§ÓéĘcá:Gat †źLRăŔy7|´ş;Ż1˘¬9ž"Ă+r‘Ev-ÉŃ‘ÖXÂZb˛–ýnç*´!AÄ‹őeŃ7I Śg­\$Tn’"sqŔţV»g5(!b5‚‚u e?.#C"˛aYE†ĎC=`đĐ»UŠ7rČ„őL0ĆPdŻ‘‹ř›H«XF7P ľ@b›HJľ®çwIK˘ >ÝŤŢGZY jđ`‰IXť6n ©fl Á µ*ę<:cEŢxÉ_ÝJ»`J™”Eµ+‹‚~‡82Ďçď߼ý+ŐwVj)µ&3X‰1^[ЏRí^Zk0Ë;…Ç(65z(oaŚěslšXĚndôzĂ] Ů*•_­…ŕGtX4,ÍKD±Ť·ś¦ĚnäţgÇ ¤Ąj„•ÉQ<­ĂöN`}|uoWrłCډŁäö`~žlÚEÝĄcW8 NJ¬ÉŠ,ÓmČôC hsOÉéŇä×°—ä3§ŐŮĚÖŠŻigÄ,Vi·!Ś—Ç ÔiĎ:ŃÜĹďcTn'ŐŐę3üžÝ¨^Ł{Ž÷˙š(ą1F ~'ŞŚUvöQČEd~QfáAŞE™e,"ěwĄ÷06c› ÍÂl5|w0ˇ]‡žâőŐ‹ęW”ççĺÝáZáµŰá÷ńůe’ßIőpŮJĂě&»u;'­w—fiëD­UĘÍŕm»|ekJLΕ5ŢYâjK!›ž‚Z›óZ[%]ŞŔóm¨Ą^š-cŐó#˛¶- ĚiQg¸ÖŽ |ôČyÉîpŰđTĂ\é(ž÷Šş6“XaüýV2nł÷Ć ĘełŔxŹ,0>Ü–ĹŃϵ"´óŐ#­%Ć/e?UöCEJ…´S)[ćT¨R~ľ sş×ÇĽTŻ ęu:=ü9ÓFł©!UřvŻě¤đg:Ź?vĘ'ŁőÖsHB¨H/DCʏ÷yumbT[K†đô¤Ľ_Cf©‰‘ŽwA7Éj$ŚÁ¤şŢ>ĹCüËhS AĐ@¸!ˇĂ%\Ô,‡$ŇwĄˇ€ő¤Ą Ň;>Ôµçň®8ją|ÚCůŔsäTt‡ňnŁ3ĐËňîç_Ţ* ú(×–m%ŁĄ­xr>Š`MĄ@ÇÍqĎ$¦ă0h’-Zî’Ü=D”Ňň”Š+6K;b*‰‹g6Ľ¬)°|ĘśÇnňśĚ‘'Úđäů“4Çţ!×ă®jsśŢę°Ţđ6¸Ú"%ŤEä•Ňu‡ˇl|^] M‰Z)îŃcýŔڸ˚ÖFq'|ŚZ]vXN¨/ŚňíŃŻR¦/0¸ubk |ö%Ć06cűPîUpQ´  ]ÖźNŤá)˛ŁáĆ>ť BŔm}Y†›ÖH‘‡`Ł@Üčá|ÄŤ®ÚŹŤ\i/™$›š[2ÉËć7 ÝŢ"5ExŤĺÚĚ"×î.! óVEeá™Sw˛\üÖBß“ü8Ő\Mgq/«G“›ˇ×Fťť’ŕßÄ1Âż±ŐµĘTg7wĄĺ‘đqç8©}“&'; P©_° ®,nŢÜmsÝŤ;z˝Ăe:âPÁK6őMŁ{úćűl»ďë€}‰„űi„§˛ß·`•łěĐ–5ťý‹ „}O°! ź-ŘvŚĄ°¦ŔČđw•’“Ćflósaî+ŽŽżůdR˘]˙µ´Ř'%Žk=<5­]Z1@]Ű.…Ńăb«ą¬4ń{łëłůěělödöfv­ú ĎÎŞ3ňŮěöězo{d„ˇ*Ôn•ť}¸„HAknV–mżŹŹp8Ŕ¨ÉP±!<ŚŮž8ÎYŹ:•đ¤}ŘR”Ú­m-ké ËZę*»ňźę/ŢőŮĽ˙ćĘŻüoků­§ŽRKřÂ8  ČŹëůŔoĎýs*fˇ ŠVRŰ …%«E5‚Ł®ĹňĐܢÄ dö†\Ę)Č‘őGӕ׬-7ëôŐ‘Ő Ö“żÝŞLßú¸O6¬ ŻśţĄ+MH±@ë¶9żÝăćoŕ$_2`Mˇ\ďľ@›Çfl›Y\Ol@ĘÁQWeŞĎo¦Ň®ľ1ű×ěBÄ?ÍžLu”%*€Óă_‚îđë˙§Âęđ endstream endobj 76 0 obj 2637 endobj 77 0 obj [ ] endobj 75 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 78 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 79 0 R /Resources 80 0 R /Annots 82 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 79 0 obj << /Filter /FlateDecode /Length 81 0 R >> stream xśí[ËŽGîß^Ń$^€ I<–i×ĺśş‘íŰÄ—ŰO¬ ±µXÁ[đD¬@<@–¬Xđ|§úRőßĆýĎ!±fF3Ó˙7]uN׹Wť~[ëFŐňýóî‚ăďŮ›úm­ĄttĄ;?ă&ů󦶎˝Six›?Ş䢭>Čď×őóúky[ßüeű‡×/Uýꏠ`äDz4«bP6ÚúŰW"őşţňzýßKt‚eIăŠŮg‚\iďČk!¦Ł 6`­(*Űi9Sbm± š–Çf¬`ĆaĹóUZîáüeĺmÁMm<7Örôů¦á|~|‚'ßÖ7ď|óőꏶÂĘÉ—ó2ĄĐDgĽ±5›&zŤ©N:Éť|Q_«lő´zR=ŞîVĎ«űřýYőě¨>ůŞľ}rbĆ膢ŤUĶX[n –ë¨ÖOüřüE^ˇÎ+!‹üEĽ\Ůî‹„ąŔdś,ŁÁwRm,;S@m†śˇ4ŚËȦJ`0ąŃ Ái­ Ą S”@‡ĆĄŻĺ5¤ĆűŚŻ­m +ŻÜś*üâż]]­nUÇŐń4Y­' ·šÜZłťs(6@…Ŕ`Ş˝ ‡qŮB`ÎďB`ĐyĄŤ2y•Ľ~ă˝Q]ÝVRŕZ[卫‰V‘yµxZýF~oK Î,ŠVSÚŁRxgCLn$j×ůs­‰ —X[`Ťń ‡fhcĹP ^Ńái˛đŕ⌷R çTŠŁ^cÉŹŞÓSČí¤zX}˛µĚbĂđč·ăqݝ³.lŔJ‘ĹŽćE–ˇ‹‹ŚŇ Çŕ¶tľ® N[Zç|ďT÷R$ţ Îwb>Çů‚„•j{ˇ bÓIlé[$â`IJ!vťpĆĽ \żęýš‚ď(üłÜ«uýU-~]żř\Ő_@ţ1eefĺŐ“O@Ő+‹ŮŮČM 5tŹçč(ĐŃjBçßžß3L™8Q$!xa…ś†ś]IJ€«Ć‹†’Łč\3y  ­(äÇ×Ď_âňą8vk<,»·>ř˝,ńJŞŢÂryf ňá@KěŁ ¨ŞíúĆC<… «»ä…-=dÜY^¶1RÂ$(l}Y’DÜ%t˝s˘V‡X`v¨‚d AšŐ öfĆŐ”Pܬ¬•›ĺÔXHŔĐÖ:¬)ęČTb©ÚĘS±Äši±Ăr:“®<®wÖÄFŔáł‚Mj$ńV®‚± ‚îÖkŚ(k§ČđŠRd@‘]Krt 5V°Ö …,‹ßí]…±ÔÉ"@}EômRëĹEk Ő€›¤ČRż5AÇţY-JX@m† `}B9ŚËČlXV`‘áóPX<ôvU…–Ť˛ˇF˝Ś1ŮÁ ä"ţi•ČčjÁ§HLdsIÉçőÉ˝mŇ’h źîVŢEZY j4ŕÁ"SĂ&mÜ@SíŘ ‚jU ÔytĆŠĽq“?żžvÁ´¶)‹ęV ýqĹ<˙Í_˝yůę÷Tßúf\©…Ôšěh%ÖzĂqĄ»˝´Î`w0 ŹQlj PŢÂX±Ď±ibm1»UŃ› w5T§T~ą‚ŐHĐaѰ4ŻĹ6Ţrš2»U»ź+@–®"–&GIđ°zŰ{ ë“«ŰŰ’#bL\Inćç‰ÓĆ(ę.űŞŔ18)±6c(˛lż!3 - Í=Ą¤H__Ă^’ĎśVg [KľŞI;#vľJ»a<8ž˘N{Ô‹ć~ r{\]­~„źÓkŐ qOpăá_%·Š¨ä‰*c™ť]r‚ź—™ExPz^f‹ű}é=ŽÍŘćBc­A‚ďö&´!‡řľ ‹DőcĘáÓňVŠpťđşíđ;řü,ÉďquoŮJĂl'»u;'ťwWvaëÄXctĘÍŕmű|ekKLÉ•4µŢ1IµĄD§§ Î&Gä¬6¬•Kxľ ±2 łe¬§zV`DĚ]P`Îč:Ł µvśăc@ÎJvÇŰƧçĘHOńlPÔµ™ÄăoV`%ă–${źcܢ\¶sŚČăămYĂ\KB;[>ŇZ`üRöSeżA1T¤TH‹$•â2§B•ňýUăť>ćĄzMPŻăéáĎ©6šm ©Â·{͓Ÿí=ţŞS>Ůł—„4P“™‹†qďŁę‰Qm-ÂÓ“ö~ ™]¤&V9ŮAÜ$6HMu˝ rЇř—Ѷ@AĐB¸!ˇă%\Ô,ű$ŇwĄaëIK”wr¨·zÔŽË»ât¬ĺňčĺϧ˘[”wť^–wß˙ň®PYĐGą¶h+-mĹ“ó± ČĐŚ±ZʸĆÇhôe‡ĺ„úÂjßýjm‡CZ'ć°¶ŔŔçPbŚc3¶±•^ÉA[c‚ĄËăý©1±ľŘ—Ř^¸źFx*űC V9ËmYÓŮ?źđ;Ř÷+h”•łîÁ2…0‡µFVŢUJNf›±ÍĎ…ĄŻ8:yóɦD'şáµ´8$%Nj=ĽĽšÖ­- ©ąfaĺq1i›ďúŰ‘”ťřçµŮŤę?Őßg˝ňŻŮÉ•ďŞ_ŕóżg/g'ąj‡ěXD B2k–Ú‰3@đ,Ś‘–eŐuýř·l„Ú ŰÂăČűÂÓc„D;ö¨öP?4žŚ¨qkĚ::ȵzË®üŁúäřáě%~˙ôĘ?Ż|7¬č©Łŕj|a5 { (ŹëĺŘoÇ]t:iˇЬ¨ë 1Y„ˇ6Cp÷ÁuXZ€č áů˝%—2 rÄţ`şňB´ĺ¨N/\«f°öÓÓŮŤNe.lôç°Á yíĚ]iBŠĆt-úÝN·Ľ‡“|ɵ†˘˝Ť6ŹÍŘEúddŚxb RŽę°*S}t” <ŤżĚîĎnĚ>…âT˙ť}ş7ŐŃL jI’ŘşĂ]÷ů]ŁS_íÔŽu.˘Ą: “Äפ Ą×6¬˛P¶#r–ZíÉËvŐ€ĄN{ë˝”aăHĆČôvRx5\\łö¤eQŕĆ`AÎdSCG”†ŕ#Ô`FÄ ŇËhÄâńśw4ň–A¤×±­˘Ç‚ń˘<:mxł4z#Ú:ťş‚ó# ČYń¨Öćő ~ĹňÜ=02°y+Ě Q$š—Rű?Jí¸··˙~űŚ[ endstream endobj 81 0 obj 2817 endobj 82 0 obj [ ] endobj 80 0 obj << /Font << /Font5 28 0 R /Font2 12 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 83 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 84 0 R /Resources 85 0 R /Annots 87 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 84 0 obj << /Filter /FlateDecode /Length 86 0 R >> stream xśíXMŽ5v‰…fFŕńóĎł˝$ !1™&‘duČŚ˘ž„ Hě¸'°ĺś€ENÁ÷\]Uîénčů‰Ä"]Şn×Wöűě÷çç>Ód¬–ëÓ®lÄďěTźik¬ĄÂ9ÚP{śF'ů9Őžcb[‡ĎÇgc Ňësň}˘ŹôKśéýĎć?ś<µúřG08ąSžŔaĽ-ŮúâőëăKQťčç{ú×YĂD•©^K)G2!$M!zŃHBI$ŕ€Í,;l;bĄúÜkwlUŐöňŘä¨Dt2ä ŮÔëż$CAˇw›rdçŁ+A&k Ó×z˙‹W/r:˘Ł|˛ž>_¶kÁťá §ťŃ¦Ďô#˝Ł~ÝŐEW;“OÔßęŹÉ/7ţśLoüĄ>ĽŹ§›“›»Ú×÷ęÍ䣉Rovő=˝«?ź^çôBf“|Ę+sÜŮŐÓBö=Xő$N6ćě"š‘3»$-ß}ęěb]z†ęąÚťl Ů5Đ|„Č:\ë6Păh[Ůś ǨE‹óاżĎ+0jĘťyEĆaŤŕµ÷ĆE›,·ZTż©ďÔ=u[©ęˇ:Tż÷z˝,aÁgXĎwy«ĺę<$F«VËҢÄ!‘ĚĎĂËÄ0ä}I Łyź«‹ŘĽÁRÉ9wܡ‹Z-c~ÖÁÎÁ#na5/îłęń¦Ŕ'ť—Gf)iÉ^^}«î«oÔX쾪ŰYl-™sČRÚYKvÁäŁq6ÓĹnĽ•lČÎT‚‹žČ‘r2ŃU‹Ă”´ÎÎ3ófô56ÂŹöę®FĐ š"— ž\ÖŚÁú÷ż:}zü}Đ·_ šÚśĘ|MąÖźËeÉs—Wbr5.V ůĹRl2A§ČÖb ČEČŢ6×. `¦s±ä B}ŔJ]ěĺ @Ď5ˇäĹ•~„ăHôŤäÄ\KßłfŽ=6,Ł—3 ®YoćM~µ2áÓU¨™0{çyiÂb>n'Üí„{l4ĹBΊmfmˇ˛nÂď ĽŢŔm¤tiĺghě®&ýBKĎŻőŁ'V?CĽ„nk‘ eťT–PÔ•Nß˙ňč‡×ąĽw>´âC‡(ŮrK^ăp‚lŽDľUÍć‰zuó Ć–bŞŐ3·T$Ĺęcőá–•ÚFšPPŞPJh®a“ĆţOUł}=|ZMĚRMv±pmW ×]O˘§ňÄEę1. µJvłÔs*Íp28…DN&w,ذ‰d%8Ł™ ĺjK4Eé”(.vţ[{˙®¤^#¶ę ŽéąĹć ćŘr‘ĂĐşř)Ó‰ţi‡Ú7‹CŘŐ8Q&Ž.iǦP)%/9ď%뱏«÷pú¸–3A ¸ăÎë(7cňNJ5˝ĺhş?29ŹfÍGHţłD­‡±-Ú–›oAx_n›‘˙¤,eÁ…DBM٫㆒ł,—ś›T‚qâ}‰\M›§C0ާä­c»‰‚,pmH®ˇ‹ )¤„B¦®ĐľZśăd Š€ó\)X@faAL°É$9ymD";u1xźť P#…1Ôĺú˘°©~ endstream endobj 86 0 obj 1211 endobj 87 0 obj [ ] endobj 88 0 obj << /Subtype /Image /Interpolate true /Width 868 /Height 420 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 89 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ¤d"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ů˛Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¬YY\ßKĺÚBň·}Łő=«CĂš3ę×'$Ą´}ÇňőčöVY[¬6ѬqŻaßÜúĐkŕË·Pn."‹=€,Gň«_đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•đ„ÔC˙ ˙öUŮŃ@gü!ő˙Č?ý•ŮŃ@7´úQ´úVŻŮ=¨ű'µem>•ŃřÁşŻŤučôÝ&/ö¦ť‡Éwf?Čw­x2˙Ĺúü:^šŞ†ů$o»`€\ţcęHŻ}ń?„%—QOš6Ś’ĎV8?)äuDRHžŔµ}˛Ýŕ>(üÔ|Ł[j–¶Ąh‘zU0a~ě÷=úŽőä›OĄz÷Ăo‰Z§…µKżíc.«Ą_»=ä¶ć.Ý]Kw=Á஽ÓřŻđ˛;ń_„TÉáű¸Ňá Á n® ţGşçÓ ‡m>”m>•«öOj>Éí@[OĄ*Fîęąf8ÔÖ§Ů=«CA˛ ¬ZîÝů ˙Jěô‹Ó´řmŁĆT|ÇűÍÜŐĘ( »ťŔ/&ť§âř´«ÁţűxÎp=şźjŁđÇJŹVńuŞNĄˇ·á—¸Ć}·üŞŻŽuëŤw_ą’Wamá‹vUTqź©ęO˝t‰áŹ^•‡Oń,ÉpNĐfib8Ŕ*˝ýëńg…µ ܢ^…’?ŐĎJ··=·ó§x–ô­¬t«ë)Ţ Ď5Â0K–Úź4ybÎO}á]g._ÄŢŐ|7z|Ɔ6ŐŘ’WĐ6?EyťQ@ľđĹkÖr[¤:\>|ÂV!™pÇ €r~C׫ ˝?á7ü‰źě˙´ć¬Żř6ËTŇouď^=–…jv–ʇ‘řŕpxä™$ŕP Ez›x3Âţ(ŇŻeđ-íŮÔíy´ş8óŰ#©őÉŔ8ÎkźřyŕŘüGöËýVĺ¬ôK-q:ŕ18Î É8=¸ć€8Ę+Őí|ŕĎÇuoáRň-VˤwCäü¨<äq\Ď‚Ľ? ]Ůß_ř«Y[-›bÚÄę.%n2BśśrבŠă«vŰĂ·şńIn,m¦:>ac·1Ś|ăż­uşź„Ľ5«ř[RÖ|yzdÓđóÚÝpžŁŚŽ9ÉčG.Ź˙$\˙°Š˙8hŤľđĹí—…4˙K%ą˛˝Ĺ+0Xr1Ś|‡ˇ=« ˝¶ÚĂG˝ř/áçńô¶z}ĽňHL $mň€‹Áçśô<őĎü#áëŻĎâO^]Ľ6˛î-îFJä¨ăŽŁp=HÁ<Śb€<âŠô/x7Jo ?‰šÇ…uv,$Ű.źy"‰€=Őx'zđIĎČť:ôiâřŮÜ‹ŰÁ‰Ľ˛Ţ›±ŚŐZ÷ÉŁđŹü*Ke’mWűí?+ľ~ýÍ׌c9Ż+đ߇´ývăW?Ú‹coj ÁçąÔ“‚ÜŽ€ ăÖ€0tÍ>ďT˝ŽÓO§¸ş‹üÉ<îk¤Ô~x†ĆĐÜ5ŞLŞ2Ë †eü:źĂ5˝đŻ|^ń-Ćś»µT‹aw0ůX®~sÇ| Çřo¨ęňxÎŮbžâa3rËĺ›>śsëŢ€8ŘѤ‘R5gv!UTd’z+ŻO†ţ$kA7Ůb F|“2‡˙Öş­'Lł˛řÍwĹUňÚxý¶PN?7®3]Ő5ĺńťËîÓQK‚‘F„ńó|Ş«ÜŽ1Ďľhśş·šŇâH.bx¦Śá‘Ć źqZv>»Ľđýö˛’AťŁ}ěC3p ö‡R:×eń¶Ć8oô»Đˇn.ct—oBSnţ=ŹŔSnÄWĂ]Ćńš$ÔîÄ÷;>ń‹9${ăË 7˘»Â)că«]ŐĄkkŁFb „nžŕ†íĐQăß &‡®XÚi†iaĽP#2°$É»dężťsţŇ.5ÝZ>ŃâIĄÜUĄ$(Â’s€OoJ©}löW·˛•2A#DĹz§•zf‘ŁXh?4ë 6Y¤TšS+CÜă€;m?Ť2÷Fđtľ%ą°ľÔo_RąąmĎqČĚHLŕóČŻ>”ćWEáˇeăŃ.oˇ‚ ăý*bBݸäśqŚőâşX4/\jI¤Űęwďví±n©Ťź PvŕŚ˙účÎŕ†[‰’xŢY\áQł1ôuĄą‚kYޤ†d8d‘J˛ýA®ëÁúUŽŹăöÓői. íĽę¶­ňrŮä šoĹ(ô‡×®E“^6˛Ó¨™V6|ýßÖ€8:+Ńő xSò[Xř‚÷P{ůŁď8Á$g¦{ß§AY1xcMÚij+{§\e„Öň)ec´‘‘¸ü˝3@uˇâ+(ôíwP˛€ąŠŢwŤ ś’ŔÍtŢ(𭆕ă}'H¶’á­nüź1ťqľB§ t”ÄŃ^›«řcÁľÔ ľˇ|ď&8““Ő^yüZćüuáô ­n,. Ηx›ŕ”OAÁ#Ô€9j(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€9_°űQöję~ĂíGŘ}¨Ă÷—ţŐ Ôt©š ¨NAwR3Č>•ěúĄŢˇń@ţŐ𞯩iÚí˘w¦C{"$Ő`>‡żCÍy‡Ř}Şö‹qy˘ęPßiŇ®"<ĐŽŕŚňĄd?ĽU˛Iâm]NZúPAô?5Aw­ř†ňÚK{ÍsU¸·mxĄĽ‘Ő‡ˇ°k¬ń† ž#ÖN˘,błwŤVEŤł˝ÇW=9?ĐuëXaö [ě>Ô}‡Úşź°űQöjĺľĂíGŘ}«©űµaö j&·“Ě·‘â~›‘ŠźĚłöŤGţ®˙ďűŤn}‡ÚʰűPMËUÔ§#í÷qۧ2Jfl(üúÔľ"Ô ÄBÂĹä6¨6´ŚÄ´żRNq[ÜHúlVPưģçÚyúšÍűµrßaöŁě>ŐÔý‡ÚʰűP-öj>Ăí]OŘ}¨űµiüżŹAńí¬“]FÖ®ĺÂ…Ý‚ ÉÇŢUüë#â„gđçŠ/m¤‡m´’4–Î ń“‘ŽÜgvĹIöjôĆăű&=/ĹlZ˝ś`,nřó;ő wŕűĐŠý‡Ú»{i_\Őî%¶Ôî%Qkf@‘ËwÎ2/Zî˙·ü§ź?Hđˇ{ˇó)ş`U[×›§^߇ZăĽQ«j>%Ô>תK¸„Ť21čŁ<:óď°űQöję~ĂíGŘ}¨–űµaö®§ě>Ô}‡Ú€2|?¨j~˝{˝éí.&…ť$ˇĆG9ôŘ^…űGŰyŢ8±ltÓäYk“űµz¶±âř†hnőýPšő"Ź…p1 Ď$óŚĐ€}‡Ú˝§âV­Şiź|c§]4×ÚW“tŠůŠ"„c'‘Ő‡¦§űOĂ_ú5?űúßüz˛ţ!ë– ‡H´Ňm'·˛ÓbhŁ»(ď$ć€<Źě>Ô}‡Úşź°űQöjĺľĂíVtëo&ö'ÇCŹĚbş°űR‹,(Ąe*pzŇPcđ›QŹOńŚ 1 —Qµ¶ăŘ’ ţe@ükĹšDÚ˝ue2mPĹŁ=™ ůOĺúY(ĚŽ®ŚU”äpAŻBłń–•­iŃXxÎŦx— {ů˙„tçĎq@~ _Z]xkÂZÝA4°Zm•#1Śěa€čx=} _řahÚ6µâK # 0ÂÄrÍxő¶ŹŻŇš©đćɾҳ_ßó r­Čă ţ'Ö°üeăü@±ÚŰ@,´¸ľĺş  Ŕđč(•˘Š(ÓţČ™ńţÁßűNj»Ą[ËârXi!¦˝±ş/5Ľ|»Ťĺşu<6G®Ňy¶“ŻjZE–ˇi§Üů6ú„~UĘyjŢbá†2A#†nëG‡őýOĂ׆ëG»{i™v±0ačAôźşMö—¬ęZΧo-–ť›ŁË:Á;•»ő!ϧ´x3Żü-ń^ʦ5¸űJŔ%?v@_-—ńĹx‹Ç~"ń ™´ÔŻËZ Ejéś ź\+EŐŻôMA/t«—¶ą@@uÁČ=A‚=ŤmřsŔzö»s`ŃďZ¤!ž&Utc낸Á cŃîfľřuâËą<7eˇA%ś‹ŰĂĺ4ŘŤň[20~µÇh˙ň@uĎűŻó†ą›ß'˝KŘîuGxŻ"ňfŹĘMĄ0FŰňýăČÁ=ϲa×µ(t ôHîvé“Č%’Šw7îĆďá^ý¨Ľń1˙‹áaŰíŹüć§řţH˙ŚŢÉk€ą×µ+­ ×Fžçv›jćHaŘŁkäî'ď7SŢ–Ă_Ôě4{Í.Ňç˰ĽćxĽµ;˙2:v4éZŐĄÇľ h-ŁD÷/a6Ű!™qąIÚ9Ď ý=)ß ¬®´ ř§XÖ –ÖÉ­‚ ™vy¤č_Ľő-ŠóŹ xźWđÔŇIŁ^5żš‘v†WÇL‚üzŐŹxĎ]ń,IŻ|e·Fޱ"*.}p?Žh«đ6Ąâ­Âowo¤ĂŞřjy™ áČ9Úܸś‚;÷Í_ńf“˘k®n TúWáŻkžYGżx"‘·čç׿ŽĽUď řĂ]đÜ2CŁß´ČŰÚ2Šę[ÎOJOń.ݧ\_OexŃKzKNÁç$“žśOLu  _‡vşÓŢÝ^xzâÝnmcÜöň±ĚęsňŚGr0Hć»/x“Äşö»šéĐiń,Š÷“, ­µNJ’Ç‚zzó^WĄę7zUâ]ióĽ Ń—ÓĐŽ„{ču>"ľ˛6Ň^,hĂk´Q…f^߆(ö¶Óřâ„ăEĽŠ H&v*»Ł@©Vö5ąsâŻÇŞ ,鍩î1-ÂŔç#¦đsŚwĎOjň¸¤xeI"vI†VS‚¤t ×]ÄĄŻ“öČٱ+BĄÇéŹĚPĎʼnďSĐ´T—í°DGîÎű@ϡ;sřŠĄńzxÓY±ŇíČň4űUŚ/÷I˙ěBVOĺŠëĆÖwzĹÜj‹!žI®% –‘ÉﻟâÝCűSÄÚ•ŕ`é$í±‡t/čzĆĐŢéš/‹.>c§iÓ,¤ź™ť@Qü¤?Ş~ ŹţťEş»o2çIż‘¤w<• ¸?÷ŃOűćĽÂ {RE›I†é—O™·<[W“Ç|dtüÍF˝©čđÝE¦Ý#ąeTîÔŽ§¦(®đ~Łý­ńl_n,łK9Bąĺ°_Đ çŻ ˙„ţsž´Ű˙FÖV“©]é7ńŢéňů71çkí Ś‚ĐšŤď'{ö˝i3rŇůĹđ>ţsśtë@§ŻhöşçĹ´´ż?č˙gYÁ“ ÷súý©ô›±'‹#Óě<gmŕÝĶďîŰÁŔČäó޵ćWzţ©w«¦©5Űý˝1¶dP„c§Z·>?ń%ÄqŁę%v0|¤H¤r3Čöč{ĐöŞÁ~6!bűL#˙!­cüI°ş˙„âô]âTHăj6Uz1ă˙ÔkťľŐ/oµFÔngf˝fWóT9P#*îµâťc[˛Š×S»óáŤĂ¨1ŞťŔś€Bh»ş×u{Y-´ďřb-Lr*sž2Č-ě1M¸Ńôď üSŃÇ1A:ďň™‹lf  dö'Ď9ö®RĎÇľ$´µX#ÔY‘FŐ2FŽĂń#'ńÍ`Ţęw×Í{wq$·LŰŚ…ą¶=1Ű(Ąńg‡ő;ź_ŰĂg;µÍÉxŘ!ÚUŽwg¦y=°k§ń˙ü•o}mżô{W#/ŹĽI-›[6¤ŰXm.#@ř˙x ţ=j+=vďUń†Ť}­]+´7©••c ‚Ló€IÍmüTе&ń|÷PÚO<A meĆB…+Ç|ŽžőgÇń¶™ŕ? é7źńü¤ĘĘNJ ?ńŕ?ŕ4ĎxăTÓüU©.‰©G-)Ť˛¦|µÎÓĎ|ôă9®VÔď5{×»ÔgiîY°0`{ §EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPĹQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÜB%_F g:26`Ö˝5Ń\aŔ"€2h«Íf‡î±­7ě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙Łě_ôÓ˙  tUϱÓOüvʱÓOüv€)ŃW>Ĺ˙M?ńÚ>Ĺ˙M?ńÚ§E\űý4˙Çhűý4˙Çhťsě_ôÓ˙˘€+˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáGü$Ţ˙ żţKIţäPŻ˙ÂMáĎú ˙ä´źáEyQEQEQEQNŠ7–EŽ$g‘ŽTd“ě)÷6óZĚĐÜĹ$3/ŢI«¨4Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@^ …ý§ď-˘óăářëčj}VŰN°łyM¬Eş ő5ĚéW­ax’Ś”čăÔUŹjnĽ!`ŹĺOS@„ä’qĎ Ĺ%PĄüA©­_ůjd´°vŤŘd#ţţµŔëĄćł¨K}©NÓÝKŤÎ@^­đóW‹]đ6µáč­—O¸·˛gűM¶Ě9ĺ¸ëĐyôŻ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( «á߉âđľ±4×vÍsgs ·™á¶’GĺúÖ7_K“Wťô®aÓŽ<´¸ ¸ăž„÷ĎsTźÉňbňüĎ7ź3v6űbŁ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ÉşÎŮ<ýű7~ďf<Ľź^ůŞőby7YŰ'źżfďÝěÇ—“ëß5^€ )ńHŃH®‡ §"»˝9íŻmtŠ1žmâ€8+¦ńMÔQ(´]ąr a\ÍŃ?u„Ľ¸µhbó ˛ţĐqć®>ąőö®vşąžőßk_|?wŕícWđÇü$ÖWzJ$Ó[k–Čž|LŘ-P:u9Ďő $˘˝á—|;â˝_›VŐo´ËÝ./µĽ˘%{qŔ'ÜĎťÜ vć§Ôü!á-WŔÚ¶»ŕ}GX{Ť˘7¶ş¤q‚čí´<{: ó‚OáĆ@<ĘŠď|ŕ˝6˙Ă·ľ(ńv§.›áŰi…Ş}ž0óÝLF|¸Áŕ`rIăň$oĂŕżkţń«ámwYŠçJ˛{“§ęQÄ$r1† Ľě@ç$tîätWáOiGÂřłĆW÷Vz/źö[[{$V¸» ť»ŽGr}ăfűÁŢ×<'ŞkľľÔŮ´Ż}§ęŠžhśyé…`9ČĆL€y˝č^đ~Ź7nü[âiui,#˝ÚéH†Rű—vl„\:g5‹4'aŐĽ)«ęO©5ęÁ&›¨ybXŁŘĶ|Ă!FáÇ8#4Ééz5ć§i¨\Ú"4V1yÓp0ľŢ´k5ć,Ťň"‹Ëuş‡k†ĚmĐśt©t]jM.ÇV¶Ž0ë¨[ýť‰llůĎżB?5ýjMdi‚XÄa˛ŽÉpŮÜ8>Ýh&Šč| áÔńG#ÓdĽ[5dgŢWq8ţ?ŕj—Š4ĄĐőűÝ5nRč[ľß9pNpyÁ÷—EP€OAšN•ę?¦{kOÜŔvÍ Žôl´€äu÷ĽëVÔ®ő}FkíFc5ÔĨ\ŕ8€P:(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€,O&ë;dó÷ěÝű˝ňň}{ć«Ő‰äÝglž~ý›żwł^OŻ|Őz+ODÔÎť$›hťOËţĐ…fQ@žWžg–C—s’i”Q@Q@uŤZŢÁo,¬ŚÄŹ>öa )€OĚçÓR+ŮuĎŰ^ü2đÖŚĽöí6ćęi‰Ö#ŘVB í=IăŇĽ*ŠôŹpŰYüTÓîő WJ±´Ó]ä–k«Ą‰$)„cĂN~śÖżÂ;MărÝjţ–›$˛˝Ó_ †`ń°'<1ËŚý yéż ´K[oęö×>/´Ń®l,ĺšĎV´ĽO!¦Ę7žJłdN zn™â-jĽ?<[áMsÂßf‘ZŢmćšáŠťľPŤCg8äôýGĚ´P÷€µX4?č:Ąćákg{ Ň•!Áb~3^âO‡ÚfˇâM[Y“ÇžD»ş–ć9VčË>×bÁ|7ň3^CEz÷Ák»Řišĺ†“â[ăŹJŐ/qyaĎ;—oż§Jëô–?ř«@ńGÄÍ7RŐµ;KxgŐ[XáËL˙(sźşĽŕůĘŠőĎ„úe¨đżŽ`»ń‡ěĄ˝µ:| w¨$EÝ][pŞчSMřQ§ÚËŕ/EsŻh6ęPGkoíúBĺ‘Ă“´ó´ŽMy-ęž»Ň|UđĘ_j:µ¦ŤŞZ_ťBÂâőö[Í”*Ń»ă zO¨™«řJđî‡{uŻxłJ›RŮ‹=?I”]4Źë# _óě|úŠ÷O‡>1»şřeká˝ Ĺž×ôë™$ŚŢ˛Ç ä.KóHW Nëü“ĹşŻ‰íĽ)©E⏊\ď< ‹ĄéĹ.¤śž ;">ą5á”P˛ü*ŠňÇŔňj^ńÝ–â /^),/î˘HgŤQJ°W ’y#§«ßµą.ľIkăŤ[BÖ|Z÷öRi¦'–€ůüÇŚóî8ăĂ( Š( ‡Ŕšv“Şř†+m~űěVEĽÍá2âî<ţµRńEĄ…†ż{m¤]»ßLH;†qÁÁČČëŠË˘€ (˘€=7ŕßü‚Ľc˙`ó˙ ˝y•uńkx\ę lc˝†ö!îSŽ{Ź©¬=^ćŢóQšâÎÉ,mÜŤ¶čĺÂpSĎ'źĆ€)ŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEby7YŰ'źżfďÝěÇ—“ëß5^¬O&ë;dó÷ěÝű˝ňň}{ć«ĐEPEPV5Ť/$XDb1ŚßzôzŻV5řü“ýGoős é@袊(˘Š(˘®i/©ęVöqşŁĚŰC7AIµv&ŇWe:+VçE’ *{ó4l‘]›BŁ9,sô¬ŞQš–ÂŚ”¶ («şV—yŞĚŃŘŔŇ”śäQęIŕS””UŰĐm¨«˛•ĄŞč—ÚZG%ÔKäČp’ĆáĐźLŽő›J2RW‹¸FJJé…QT0˘ŠĐŇt{ÝWĚ6qC2HěęO2’ŠĽťĄ%vgŃWőm&óJ‘ö-‚AąX2¸ö#K¤č÷ş«Iö8$c/#°U_©ŠšęÖâŇAÔÂĺw‘J’=pkf?ëOńi†+ĽDdQ!»sšR««É¤LŞF:¶`QJAV!pA­¶đ®°¶ľqµţ3ĘŢľfß]™Í©|NĂ”ă‰Řâ•AfA$đď[WŐíí^y-FwĽk"—Eő*h•HÂĘN× N1Ý”SáŠIĺHˇF’G;UTd“člÜřWW··’Y-ÔůKşHŇUgAęTŃ*´ť‚SŚ]›0袊˛‚Š( Š( Š( Š( Š( Š– y®<Ď"'“ËC#íÚŁ©>Ő …˘ÚEŔŃF¨¶ß°…SĎQŰĄgTĆJ[ I=‚Š(ŞQEQEQEQZúg‡u-JÔ\[B˘vŁI" sčą<ÖmŐĽÖ—AsE4g Ś0A¨U#&➨•8·dő"˘µ´żjZť·źi1Ú¬ň*ooEɬÉá’ŢgŠthĺBU•†4Ôă&➨âÝ“ÔeµcáŤVöŃ. ·_.OőaäTi?ÝäÖ<±ĽR4rŁ$J˛°ÁĐŇŤHɵ{śděÚ+fÇĂZ­őšÜŰŰäĆŐZLuÚ É¬vVF*ŕ«‚Áśg6˘ď`SŚť“Šč-<1=ÍĆ“ ÜÂQŤ¤BsňŕţU€Ăkśŕă"”jFnŃ×ô‚3Ś´LJ(˘¬ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Äňnł¶O?~Í߻ُ/'׾j˝XžMÖvÉçďŮ»÷{1ĺäú÷ÍW Š( Š( ¬jńů'úŽßę>çAҫՍCţ?$˙QŰýGÜč:Pz(˘€ (˘€ ±§ÝÉa}Ü|Ř\:îµ^ŠM&¬ÄŐŐ™v]JâM=ěÜ©…î>Ňxç~1ůb¶|3ˇGw¦]jwV÷7qBâ(í­ÁÝ+ŕ’ŔŽÉćk¦đîŻnšEΓ{u=’<˘x®˘ěl`†’« ęQ‡îű˙Ă™UMGÜ/®©ewĺh—şEÔ™c2oh媒Ăé\Ś7wŰĎo ®Ď·ĚE<>:gó®’w°·µ—í$żľ‘”…†Ü:‚qĆćn1ę*/ËŁÚË=Ö©t°ÝGŰxZDSýňR=8¬ˇ'JM6ş+?×S8ÉĆ-»ż“ýu&żVŃüşuá˙L˝\XP§Đśt¤Đ´ކu[«+­@Ľ†8mmĂsެÄ@ŞúäZL]]Ťv]KQ‘”¨ű;F:óśűtĆ*}V·źAM*îţ}:H$2Cqb¤ŞÁyëßü™|ţÎńľŻ]űşö%ór^=^ş5˙žóBŠóFĽĽJĽŇnmĚhĺŢc•;ŕ°Č"ą»M'QĽ‡Í´±şž,ă|q3 ý@­­Aě!ÓćGńöŁpë…Ž Ë?íę>•“c­ęvlďg† IŘŤšŇ—´ĺ|˝úßőÔş|ü®ßŤ˙áĆÜčÚť¬ 5ÎźwK÷ťâe·$ŠŢđý¸Ő<'ya$«e7"ăíRń»v1őďޱnőíVňÝŕşż¸–ĆägČ<ć´4«›ß>‘{t,ĄKŹ´E+!d—iVÇ#ëEUQĂŢŢëml:Šn>ö÷čXńeíŤÂĆłĽń°čO|]óAŃáľÔ&Škt‘Z8ˇÜFç'$śĘ©ëŤ”ZLzNŽe{q'ť4ň®Ó+ă°Ű]/H¸¶†C®%ĽĄA–)mŰ*{஠5ŁwtŻue˙ŤE(ÝÝkĄ‘_^Ň[Hą‡Ëťg·™ĐN×éŘ×_ĺ]j:_†”ë?d2©W ;¬’eńňŕr~µĚř“P´˝’ÂÎĹßě6QVi—Éů›žŐ­¨ŤóNŇí—Ä Y#&˙˛JwŮČ㊚śŇŚ9Ż}z_Ł˙€)óJ1ćßŇýĚ]wS–{h´ŮŮĺk9ĺÄň9fpHݦ?ZŢÖ4ëŹ[iš;ĆÖđZ¤2*§ŮŮz““Ç×ŰéXşńŇâŇl-´ë´Ľť$‘ĺBŃ’0î˝ u–Źn°ÝjZ’L 6FĹŘ˙t’őm.U(¦šżGůy”ŇĺRŽŤ_§č\ř“iâ%hŘ3Io»âlźČ ĐÖôëťzM3QŇ%‹ě‘ŰG9•S쬽s“‘ŽżäW)®jRjÚ¤÷“ ¦Cň čŞ8đ٧Yčöf+˝GQKť H- Ť‰sýÖbÖ—ł•:pţd»\\ŽŹuĺsoÄz}˝÷Ä-Ž sÚ\qź—'óő¬/k7łë—9ĺ†8$háŽ6*#U8ŇŞÜkwSx„ęůăÍ(ęéŠŮÔ!đţłt÷éŞ9ć;ć·–}¬z•#źO˙UĄËíŇVď¨F.ź/:˝•»ędxŹZ“\ඏž=˛ÇÂç9ŢA$·¶sŇ´Ľn—:Ľwł_¨»…÷Gn[N@áC9éÖ˛5!Ą­ü)`×Mh  d|nsžJŽÜt¶¬ě|?k{ ęë¬đBâAŮŘJH9 žźŤ]NXŇäŠjëµţENĘź,S_#"k‰žćú~l°ăîüů+]źöMäţ9‡Y‚â&ÓĄ™$K‘*ál9ĎđăĂëŁUÖ®nČ,ňänţŰ8ö­ť8é>›íßmMJú1űaF«c†f`3ŹAQZĺMokZ×˙†ő&¬_*¶öµ­räµÓĽ{$ڵ‚ř±p ?§·ô®›LŃŻSÇ_Úm4Ma4Îé8•H•X(äőý+Ďw5ÝćéćUi¤ËĘůŔ$ňÇ×Ga6™áĎ2îŢőu OiHDq•ŽF7’Ă“ě(ŻJ\¶‹Ő«mř`«MÚË{[oęĆ-Ü­§ë—`ć3 ďĺ2öŽ+{Á^e•ĹÇ/]–Ňu%Ź70űמM`i g6«Ő¦x­ł,€8ëŰžOŤuş»řTą„Kâ+OĺŠŇ)"űy>¤UWz{6ž«Wfôí§_Čužś–z­]›8Ë[[‹éĚvvňM& l‰ >µ\˙„X˙ U÷ýřo𪶗·}ÓM§Ď$/ʇS‚VŻÂO­˙ĐNëţű­§íoîZŢw5—´ż»k|¦ŘßŢŢXę°H’,NâRĺL%zĺ{˙őŞk(Ľ3¨Ý&ź7ÖňJŢ\Wo l±ŕn^€éëMđ$ÁµËŮîĂL ¤Ď('—ă'źz]9|7§ŢG¨hÝ\Iˇ·*ű‡ 3goąŞ7Ď%w˛µŻżőßC ·Ď-ö[wţ»čQŇ­m­|BtíZĐÜ“0·ů%)µ·cw‘Z7ŃřoFŐ.mg¶¸Ôe`Űe(± ś(îĚ;çŚŐ-.ćŇűÄjz­ňŮ0¸[€ľSIżćÉQŽŔëNń$:L÷×özĘĎ,Ň´«٤Só6q¸ńĆJ©]ÔJWŰ[^×őţĽĘwsJWŰĄíq4}6Â[[ýV˙Îu»„ŽožF'…'錚µ¦ŰčŢ!™¬m,¤Óo™IÄćTr;[#ŽQTô FĚi—šNŞĎ­Ă,‰:.ăŽäw{K“GđíÁÔ#ÔFŁxŠEĽQÂȡ#sŰž”Şs'-ďÓ{–űÜS漷żMíţ^·ĄŰčéṯŻôŮf¸µśDŔ\žĽ| {zV±Ň<<Úµž›śűő<řĺ3ô}ĘJ€;ô=}kÖ}9Ľ!yo>¤úy~Ńĺ\ňąÂçç×µ^ŹWÓ^đöˇöĚĄ˝˛CpžSf"¨FzsÉíéYMMą5Í׿m?9©¶í~˝űiř”Ľ; Ç6•s©ŢZÜŢ$ry1ZŰşFîIŁ=ɸú :–›{$:5î‘um™D›Ú9TuaĂzT:~©d–z<š”Öđ‰Ěö÷ĐŁś`†QÎ GtöYĚ&ńőüĚ„,PUÎ8Ü[¨ő©şŽmÝ­tŃíůzܦćä÷ňßoËď,řéeŐ<Ő˝űOö|ţ~Ň»<ľ3·ŚîĆ:ńÖ°5C˘ű)u6ď›í,…vűmzTŢż¶±ľą[âëmum%«şŚ” Ź›úT—v:­¤¬šĽ··O”Ű”ö,[·°­RäŞŰľ¶ďcKrÔmßSCĂĆÍ|©ľ˘˛É\ĆŢ\m´ąÁŔĎaďUu{M2ďĂ©ŞéVĎfÉ?Ůć¤2W!<Ó¬eÓWÁ×v’ę*—“H&ů.pW .@Ç>˝¨¶—M žÎMEVőćű@‡ÉsČÎ1Ď­Eš›’żĹçk]HŐIÉ_=ż®Ąť;AŠŰC¶Ô.tŰ˝R{˘Lvđn?‰ŠŚäúS5Ť 'ĐeŐ-´ű˝2H,ÖÓî*A8 …†zźóÝÖz­ľˇ˘YŮ\j“éwv`˘HˇŚrˇ<·ETÖ$°ŹNx“[ľÔ®Śa^yÎîO¶)GÚsęÝďçk_îŘKźźVď=ż-ők;!á­.ţÖݡšWxĄĚ…·źoĄ?[¶ÓźĂö:Žźhö­,ĎŁLdÎç&ĄÓçÓ5 ǦęĆĆ{išXÜÄ]]Xr8čsOŐçћ¶öV7îóÚĘ϶HYLű’;(úśńTĄ%%toľÚ˙Ŕô)6šZîűěOcŁ[Ĺ XŢGŁĎ¬Ks¸Čc‘‚ĂŤ¸^ső¬żE¦Ä,Ćźgse9V7ÜnĘśńרëZgL].ĚŘkłiwĺ?Ňy»]˛y%z‡Ĺz¬zvťeăę3Ű2]şÎO 3ÉÇ©ĄMĎÚ­÷}×—Ü(9{N»ľ˙đĹ_iú^ˇ},zÍçŮbX÷!Ţqúž? ÉżŽŻ®#µËHˇř” kxA´Eľ—ţĆ/÷{˝öóҲoţÎo®>ÄZůŤĺnë·˝óU袊(˘Š(«‡ü~IţŁ·úŹąĐtŞőcP˙ŹÉ?Ôv˙Q÷:”^Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  m[“F3´6–“´«°™Đ’¸#ŢŞę—Ë:ʶ–¶€.Ý–čUOąžjť śTąí©‘RćęQEYaEPEPEPEPEPEPEPEPEPEPEPEPEPEPíGVľÔm¬­ďnXlŁň BľśuúžxFŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Äňnł¶O?~Í߻ُ/'׾j˝XžMÖvÉçďŮ»÷{1ĺäú÷ÍW Š( Š( ¬jńů'úŽßę>çAҫՍCţ?$˙QŰýGÜč:Pz(˘€ (˘€ żˇX®Ą«ÚŮÉ!Ťf}…ŔÉBĄµ¸–Ňć+‹w)4lv"¦i¸µĹ$ÚvÜŐ»ŃâD¸ż[†fŽů­mŕ€ąÝXµaď.Ő­ÚRai|⾯Śgň®źÂ:*ÍŁ]j†Ň;éŇO&%p©»–l‘žOň1•GF.Uő2söQĽŮČV–ŤŁĎŞůďÁo 4ó>Ô@zgż85םMBÂńu}/OÓäŽ#$6®Š7áe r­pPů˛"ěd ykźöă˝­íSQvkć«íĺŃŻ™©ŞčRŮY%ě6÷–Lţ_ť$+z0#"±ëŞŐöč~+¸{ű™÷*D ýî™˙őUżč›|:şśVjłČR(îV8ÔpX‚Fă‘P±ćžşŮtą ·,9ĄßO3Š˘»˝CHk­ ö}KN˛ÓŻ-—ĚŠKg@˛ŽęUXóď\ö•áŤ[U´66˘HI*ĚUäu๸biĘ.MÚŢ©qŻ›nĆ-jé,ş…Ľ×O<–q­<í»űŁ“íV5 k:u”—w– Ź›ÍCŚśt=Mhh1Áuá;¸5yM®ś—"H®Wćo;n6íţ.9ĄRşpć¦ď­´×úbťTăÍÄĆÖ4i´Řá›Î†ćŇ|ůsŔŰ”‘Ô{j]#E—Q‚k–ž [8HWžv!wŠ1ÔÖ·‰’+oi–údźiÓ Ź!ą<—ˇRżĂPę_'€ôuO»%ÄÎřîĂúTƬĺ®­ŰóéßBUI8®íŘÉÖ4ąô«„Šs‰" #–&Ü’)čA­|!­MRÇhŤ«ąźĚ?瀞Wůü »ýô–tSßněŇkźň&řgţŢżô`ŁÚÔj)5vÚ۵ü×`ö“i%˝ÚűŻţF.٧Ýé·Mő»Á.3†G¨=ëVĎĂÜiÖ÷’ęZe¤wŚks9F 1íVDŻ}ŕ)ŤŰ{;ĄXŽH 9P};Ň.«˘Ë˘é–Ú…µěÓÚ«©ňÜ"ŤÎN{’zQ*•˛Ý;;zyüÎmYnťťŚKűi}öT¸¶şcŚIo&ä$öϬ|®€ ´ŚĐý˘>ńę­âM*>KY¬eylnâóa.0ĂŐO¸®…í4ë˝+Âɩ޵¸*T ŕÉÎ[#oÖ”ëÉF2‹ßÉżÁ? ťVŁż‘Ëęú%ţ±5ü5—!‘\c= ő«¶ž–[Ky®Ż¬¬šäfî†qŘđ8Ţ©ę—n`]=›;iĺ0°ś‘ßżAůÖţ§ź­ôۤÔí,Ú u·ž+‡*Ë·ş |ŮĎANU*(Ç™Ú÷Ő/»MBSšJúyŰî9KëIě/%µşCń¬§µm[x^i-ížćöĘŇkĄ 3ą ŕô<3Ú­|Jň˙á!ŹĘĎü{G¸·RyëďŚUŤZ+/ôŐ--p$WĚä:ë±qó{bĄÖ”ˇ m}ô¸˝¬ś#-®rW–ÓYÝKor†9Łm¬§±­kO j·0Ç(†8–QÄŇŞ3ý9®Ź^··Ľřťk Ş 1‹ĚVîBçđŔ®SÄ÷S]ë÷ňÜ32„@…T+NŞŠŽŤ«ŽeRÉiĄČ5m.ďI¸X5Ľ©Y…Ü‘Űčk^ Í+Ą¦ýą†VŘM–~î>]éžý1QZ´˘“NĘ×ďŻbjŐ”Rk·®§2K:Ă3JĚ ’N1]ŢąO6(Ż,¦ż‰wÉi„ČR$zS/Ż"Óüw=ŘMŃC|ÎTwĂóŹÖş=O´G©Á«ZÍ Ó<±DŽLİ'qŔ9'°ĄZĽ˘”–Š×ŰŻaU­(®e¦—˙€p6Vł^ÝĹml›ć•‚Şç5şŢ™„ŃÚßŘÝ^BĄžÚ%đ:ăŚ=+'SqłvöĚP ܡS‚ăŚV˙…˘ţĂ€ř†ř”UVKHŹw#˙tg­iZsQć‹ô]Ůue%hż—vrtUí/MĽÖ/ „łí.Wp^;őÇ­l âůń÷ů?Ć´ťzpv”’~ĄĘ¬ í)$sÖĐIssŤŇĘág$ŕQu–·2ŰĚ»e‰Ę8ÎpAÁ­Ď 46#‚ÚţŔOp.ىXĘWÉpř'ŽźĺV|M¨i_Úz¬?؉öź:UűGÚdÎíÄnŰÓŻ8éPëKÚr¨Ý[ËüÉu_?*W_/ó9Z+_ÂóDZoÖ–×QÜH‘:Ú ‘ĎZŮÔő'FÖ.í¬ô{k ł8‘îFqÉůPtP:fśę¸Ë‘Fă•FĄĘ•Î>ŠÝđÔy«O,dQ*łĺ}±D ŕ’{C]ő„ÚĄ$öú*Oj‚X¤Ó\dsČ`ĄMLJ„ąZíř“:ęĺgEtš­ť®‰w­jâďË”[Á)r2K{zU«MwGĽ‚í5M"ĘÚo%ÄŰDTnÁŔ#צ 9WiľX¶ÝWwËŘäGZĐ×lílu‚Ćńo •G‘Ȩô»Ő°¸iZŇÖě۲á (÷Ŕ#šŇń˝ĽŢ!–;XRŚq¶Ä”ŕUą?jŁä˙Bśź´QňˇEuľ’ÄxWQ¸˝Óm®$łxü¶ †rÄđÇ<éĹ2ýí5 Í~¶Öw–ł¬mödŘŽŚ;Ź\Ô{y§/k“í˝ë[­ŽVŠétř¬´ŻĂŞ]ŮĄíÍÔ­1ĘO–Š˝I©Ďjş×:eÇ„Żď­ô‹Xo<Ő…ň *îćLź”˙…g¤[WµÁÖłŃi{m©á٦.Ż ÖĂ,ŘÎ3Ž3Žqô¨őó§ť^ŕčá…ŽG–>=yĆsÖµç÷ů,öߡ|ţ÷-ľ} t=}ańŤxŚĺ K€§ňŞ7Öíg{qlä3Ă#FHčH8ţ•wÂßň2é_őőţ„*?ČÁ©˙×Ôżú¨R—µqoK›öśŻki¶Rę7ĐÚÁŤňdôQÜź`2j]oM“HŐ&±™Ńä‹dÎT×ŘÖÝŽźweᦸµµ¸šďQ5hŁ-ĺÂÍĐpXńôß¶óGâ‹™¤‰Ö)BvRb4Î|Vq­Í[•=5űŐŤ^jś«m ěĽ=$Ö^^^ÚXŰĚHÎçtŕ™î}…WÔ­a´¸ÁyÚíÉx§ Wc¨ĂĄZř[A‹Ršéa’30ŠĐ.ćvä»ă€p+™ń”şUÜB ĽűK–x$#ˇőµ4«{IjűŰNŢdÓ«Ď-|íň,ÚxfYm-ćşľ˛˛k‘#¸rÇcŔŕzÇľ´žÂň[[¤1ĎÚĘ{WW©Çgâ+}6é5;K6‚ÝmçŠáʲíî6sĐTĽżřHcňł˙Ńî-Ôžzűă4«IÍF]oÓkN¬śÔeÖ˙"­– Ŧ‹+\˛¶ˇpĐ2…ű8Čőę+Q·[MBęÝşĂ+FŚdFiŃjQ-ŞÇ3µËŔůsú Ż,Ť,Ż$‡są,Ä÷&·„f¤ÜžźđČÚ1’woú¸Ú(˘µ4 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€,O&ë;dó÷ěÝű˝ňň}{ć«Ő‰äÝglž~ý›żwł^OŻ|Őz(˘Š(˘Š*ơ˙’¨íţŁît*˝XÔ?ăňOőżÔ}ÎĄW˘Š(˘Š(˘Š(­ÍVµ‹N¸ŇőXe–Âg†„€ń8Ü3ÁăŠĂ˘˘pSVdĘ*JĚč%“ĂVÖň}ž Böá”…3°Ťö?/''őm/I72ßEvnŘm†h ÉŽ÷Á®nЇAJ.-˝|Čt“‹‹oSTźĂĎeplU–ţVKvÉ…ç,~SÉ>ůŁLŐldŃĆ•­E;[¤†Xf·ĆřÉę0x Ö{ËĘŰd­fÍŰÉ|=ś‘ŘŰß]\şŕKpÁ¨UëřÖ4sÍíŽY}¨č«ŚUŻRă .äŻq4ŠUć‘”ö,H­­+R°“E}'W¬"o>) ˛60A¨Ĺ`QDé©+ PRV7uťJČé6úV”łXĄ3Ľłŕ4ŽF:€ ]+R±“G}+X‹q/ť Đ€Z6Ć ő°h¨ö1ĺĺůůÜ^ÉrŘŘń©âYÚXG$vhR!&71',ÇdšÓ—Qđő΋¦XÜ˙kfÖ1¸ąą'¦zq\Ą:˛I˝é+%ŘÚÖux'±‡NŇíÚŰO‰Ś„;ny_ÜÇúSíWĂr[BnźS‚áTyˇ:±ď·ˇŤaQOؤ­ĐýšJÉŘŮ×őX5+›H …ŕÓíPE—ŰžI÷5«}¨řjňĆÂÖOí…K4dB©['<ó\Ť.„l’mXNŚl’čnë—úlşUŤŽ”·{-ŢGfą ÝŽ›Oµ.ť.…b°ÜËöË۵„"čÇ$‘źÎ°h§ěW/-݇ě—/-ËZťôÚ•ü÷—-™emÇ ŔqZÚtú›ĺ]w}x€:Äč±ÄýŁ’Hó®~Š©SN<»/!¸&ąvEɵ+©ufÔšB.ĚľnńŮł‘Źj߼Ô<;«Îo5oí/™–Űk#źQžA5ĘQJTc+5Ą» T“µ´·cGRşÓćż…¬¬L6q€¦3!- ’Ob}şVŽDžmŠ=PĽlm›fŇĂ‘óuÇë\µJŠi+żĽ$Ő®ţňćŁzÚ–©5ÝĎČg“smÚ§®lÚj:FZ}(\Ýę;JÇ5ÂH˛0X($“ő®jŠ%J2J=;©©.^„‘l’áMĚŽ¨Íó¸ ňqžOă] ¦—˘Ĺ3h˘ć{ůĆ.gP‚ z”PO>湪)ΚžŹnĂ”·Ř»ŁKg§šśRMh­™żsˇ^Éyufu1y<†@˛¬b0Kdô9îkź˘‡Ess݇ł\Ü×f÷‡5K+k=COŐ#śÚ^ËŔFô*r:őˇa«xz Ű8mő‚ę#—,PÉ×€8Ż|×#ELđń“m·©2Ł6ű›ş6Żkmmy§_Á,ú]ĂůFĂŁŮĆ8©&¸đíĄ¬ÂĆŢňňćE*Żu…XłÜę~µĎQMŃŤďw÷ŤŇW˝Í-(i$ţÖkđů>̨F=÷ŘńŁáýVy®—űU.LaQJGł*¸ç8ăšĺh˘TTĄĎv7I9s]ť™¨éPxjúÂä_}¦č«ˇ@T’˝N{óĹ-†ŁĄCá{˝>q}ö©ŘHJ*l ąŰÉ9ÇŻÎŃCˇ}^®ât“ż­ÍÍ'Z‚9´íVËí–[üÄÚű&îAôö­›ë‹y<pm,~ĹjnŃb ĹšC‚I$ő˙ëW-ĄjwzUɸ°Ă1RĄ¶†Č=°A©ú®ŻŞş¶ˇróű ŕôŠÎt/4Ö׾ďň؉QĽî¶ßwůlKá«Ű=?W†ăR¶űM˛”ŔnqÁÁŕÔzýŐ­îŻqq§ŰýšŮČŮÇ<O5źEoě×??]Ťy7?SoĂW:M•ĚWzŹŰŤÄ,‘¬ …H<äÖ™â;Ť*îęKť3íŢtŇ´’ …@Ł'?. őďXôTű%ĎĎwq{5ÍĎscHÖn-䊝GS†ĹAme ŹLqÖ¬xĎX¶Öµą´’ô¦Üî1µů@'ĆO˝sôQěcĎíáěŁĎĎÔě,5ť/¦›*j°;ü×/l#ýéô$śíöâ°µą4–6ë˘ĹtŞDŹrFç9ăˇÇOĄfQJ%Ě›i(»¦ÎŽßRÓu &ŇË[űTrYäC46ä<í`};©âmZ=RękEgk Á ·ŢÚ;źsXôSŤĆ\ËúľăT˘ĄĚŤí:] Ĺaą—í—·j *DŃŽI#?ťeęwÓjWóŢ\¶e•·t€{ĹU˘śiĄ.mŘÔ|ÝBŠ(­ =/C[á-ć§wim>ˇ©NĐZ4±+•mČČăsőĹyĄM%ŐĶĐŰË<Żo &8ŮÉTĎ]Ł ĎµC@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@'“uť˛yűönýŢĚyy>˝óUęÄňnł¶O?~Í߻ُ/'׾j˝QEQEcP˙ŹÉ?Ôv˙Q÷:•^¬jńů'úŽßę>çAŇ€+ŃEQEQEixrŇýrĘÖëw“4iÁć¦RQNO ¤ůSl͢·ďtŰ(Ľ=sy“ĎME­“-Ç—·#ŹZ‹JÓ-/t]JᥝníĚl+:őĎZŹmsyŘŹk_äbŃE© QEQE^ÓtŮoăĽx™ZŔg}ÝŔ `{óJRQWbm%vQ˘Š)Ś(˘Š(­ÍKL±ŹĂöÚ•„×^o!Öe 'íXuššş&2RWAEU”Q[zö™ei¦é—şt×Eyćq2…+°Űęj%5˘ú’ä“Iő1(˘Š˛‚Š( Š( Š+BŮtăŁ]´ď(ÔŻ |ĄsógđĎéS)XMŘϢŠ*†QWuŤ6]*ů­gdg ­”éó(?Ö—2˝şŠęö)QEĆQEQEQEU˝-lZäŤNKŕÚp`PÍ»ń=:Őßi–úeŐŞŮË,°\[%™ gŹĄC¨”ą:‘ΔąLz(˘¬°˘µ´ űOíSO8¶˛µO2iŠî €äÔş¦ŹZję:]Ů»łó<©7G±ânŁ#ĐúÖN´ą:™ş‘Rĺ1(­ŤGKűk»ËËź˛ŘZćIłsx sFŻŁĹmcˇ§Ý}®ÂW1ď)±ŁqÎÖJ=´9ą:‡´Ź7)ŹElxnÂÚýµ/µďÄRΛN>eĆ?ťÝ…µ¦›ŁÍożĚą€É.ă‘Řăň4{Xóňuţ{EÍĘcŃE© QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEby7YŰ'źżfďÝěÇ—“ëß5^¬O&ë;dó÷ěÝű˝ňň}{ć«ĐEPEPV5řü“ýGoős éUęơ˙’¨íţŁît(˝Q@Q@:9)H™‘ÔĺYN> Óh ™d1ËąŚ¶âąă>¸ő®źÁWÖĂ^ť˘Žm– „eIÝĆGqšĺkwAÖ­4Ű Ë{Ť4Ý5ĐŘî. / `÷ďXb"ĺTŻ·ćeZ.P˛W5Sź_đľ®51˛Ůĺ‚A©L¶ŕ1P錚7„˙µ`Š9/î. É"†¨ČŚšŁ˘kVz~™yi>š×&ë î. |Ł1ĐÔz>¶,¬ć±ĽµKÝ>fŢĐł*ßŢV `éI)F1ŇéŰMUµüL]6®’ŇűwFÖ‹/‰ŇöĂXÎënóCq±Uâe÷qPřFâô«¸­ďm´ýUĺ..`ÇŽT1iÍS—^¶¶±¸¶Ń4˙±›…Ů,ď)’BżÝ n“­ŮŰh’i·ú`ĽŤç3óvů@ăéJT¤âŇŤ“kM?áľBtß+´l´ÓOřo‘łâfŐĂ,.ĺÓőVuf˝´1^°Ż_ń¨üŞÓ5X…•‹}žÉäŢĐŇr8süCž•‘{­ZŤ&m;I±kXgeižILŚűN@誚ŞÚMÔ˛Râ˘hf…ގę3ۧZjtś\zÝ[ Qn›‹]EŐuvÔbHÍŽźmµ·n¶€FO±#µf€I “ŘVĺî­¦9`Ó´H y ŇĘҲ˙»ścëUĽ7«bjŃ^}€ŤŚqÔcŘ×D[Ś,mĺý\Ú7Q|±ůgÍv:ŤáđĹž›k¦Á¸¸¶K™î$Ś;1lüŁ=ĹsÚţ¤u}Zâř°ů¤ŠsŚ:÷Ů, #ŽtĆĺG@ŢżZ~ĆV\ŃĽnôÓĺĺßďfôşş×OËČgµčuť:Á>Č]ÄÎfhĐ*ą8äcż×IŁXAy xnY¦_:ÜÜĽŰ‚µĂ‡ČPOqĎÖ¸ýkTŽüAµ”V°gdqňÇ8Éf<“ĹM¬kQ^Zi¶ö6ŤeŽňą%$çŠrŁ' ڷéŁ˙>•&ăĹ[WňßüĹŐő;ÝwSŠ á—ËXÖ0žY$Îşý[ÎŇîţŢęÚF›m c‘żxíŽKĺ5Ęx‹\´ŐĘÍm݆Ý×rŰ;ŚžśűTŇřOÔ M­iiĽU ÓE9ŹÍÇpÇ_qS*R’Ź»dşh˙[ TäÔ}Ű%ÓOřa|h,Yěnm&ł{Éý©mcŢ1†wÉü«Rď[aá}3P»·‚ëP2Ę‘;ơä¨Óťs:žĄmy=ż“¦ŰÚŰBŐÄNçÜç“ÓŻjÖ—Ä:<¶Yľ€ćŢgEűsp[Ż;iĘ“ĺ‚qnŢ›k¦ŕéľX§íéţfFµ­Ţk"·™ˇ+$aIqô¬Đ €p:š’éâ’ćG·Ă 1+mŰG¦{Öţ‰âĄčş`˛Ž_´nýálcr㑎kĄŢś§–ÇCĽ"ą#ň9şëÓRąÔĽŞý±‘ţÎđ,dFŞT}ô®RDž6š?25`Y7mÜ3ČĎjéˇńŹ …Ĺśz {‚­"ýąą+Óťµ·kFí4úwódVMÚŃ˝šíÜÂŃn%µŐ­f€ J†ŕđx>Ć»MKÄW~2’ÂŢd°7 °W÷ą#qcŚçšä…öžšÄ7Qi¬–‰‚mľĐI$wߌőÁéÚ­Ţëvw^$MU´Ň;Ţ´ťÇFÝŽ;qŽŐi{Ió8t}·űÉ©OžWqéä3Q‘4_j omm4qĘč±\G˝ĎJßń–şÖšŰÂ4Ý.aĺFwÍlą@z×-â BWS–ň SkćüΞfü¶y9Ŕü«QüC§Ý¬2ęş*Ý^GŹÍ Šŕp (ĄIľIĘ7vłŰËĚ—MľYJ7Ó_ĂĚŹŔöúžľ~Ú¨`†7ť‘ޱ޷?ĄtPß^5Ú‹˝kĂňéŰö›†Ížäô®F nk]sűJĘ {vy1®#ŰŚ#ßż˝]ţ×Đ™—ĂŔĚyŘ×Lc×éíSZ”ç.f®­ĺ§ßůˇU§)Jí_O->ň˝ŐŇhţ$ą} th‘í6śqóôϵt+×›Fń%äZE´JLł4aŮÎŃŔĎAŹOzć Ô,ŰSšę˙MŽhäű°A!PńÓÖ†·Żiš¬—7˘˛^L?×}­SŚ·nJ©RĽăÍ«Yíĺľşő*Tď%Íé®Ţ^eĎj2Üř˛V™"ňîÖGš5Śm8VUşྤ“ËzÎĄ*š^×Mím?ĐÎtś§¦×MöÓń.xP˛ţĘżŇuI.JČ— ›ü·_QÜÖÔÂÓáě‘YL÷ %čÄΛ7¶ŢJ©ç }s\Ć—6›uIî[Ť‹ŢZűç‚iúŢŻ&¦aŤbŽÚÎÜ‚Ţ?ş€őçą=͢ĺSKĄ{˝­ţ J“sÓkßËüĚčäx÷ynÉąJ¶ÓŚÔjW‘ÝQ]Ů•Ł9Ŕôäše×c¦ÁEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP‰äÝglž~ý›żwł^OŻ|Őz±<›¬í“ĎßłwîöcËÉő@Q@Q@XÔ?ăňOőżÔ}ÎĄW˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€,O&ë;dó÷ěÝű˝ňň}{ć«Ő‰äÝglž~ý›żwł^OŻ|Őz(˘Š(˘Š^k·ÖĽamŕöń“®BÝf•6Ť$ŕőlń‘Ú¸Šôčä‚O˙a˙ˇ-yŤQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@'“uť˛yűönýŢĚyy>˝óUęÄňnł¶O?~Í߻ُ/'׾j˝QEQE“^µ«éÓhĺÓőnÚőd“+ä=±Ż%˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ +Ňü9iŁx“áî¶Ť¤Ĺk©hÖÂayÓ3|ß÷Á9ëĆ+Í(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ô>Óx….Ä_ŘÍgţš\B᱌{oÍp~%]%5«á÷¸}7#ËiƧ?†sŚó]׆&ŇĽ7đď]š}bŇâűYµÇg Ě‘:üèűů9qß5ć4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE˙Ů endstream endobj 89 0 obj 29646 endobj 85 0 obj << /Font << /Font2 12 0 R /Font5 28 0 R >> /Pattern << >> /XObject << /Image4 14 0 R /Image9 88 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 90 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 91 0 R /Resources 92 0 R /Annots 94 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 91 0 obj << /Filter /FlateDecode /Length 93 0 R >> stream xśíYÍnGîY$$úqÂÁČ4ý˙sŚ Á x(e­!&‘ŕÄ )·üŠK^ Ę%Š”Ľ§DyŽś|đK$_őěěĚîÎÂÚ;‘r`G»ÓóÍLU÷WŐŐU˝{\ Éé8[5¬t8ďěň=.…”*ůč¤ÍOL_ă!:íră]đ2ż>l.´tÁRcȧ.č÷żÎ@É?÷ţđ‹{Ű’ßý4}C´FA‡02Ei’áŹîIŐ=~ç ż‚cŻĄIeMů€X˘SÂÚŔ•u†8€›‚"pŚ [µĆUXónŤU’Rkv›V¦¶ľ łő":«’ĂCB™¤d¨ůOA;›Đđŕ]†ČQ§“ĄÎŻ—Q>âç>xřŕ+ͤOäĺťI»&|ťŢň˛2Zy›ßä§ŮóU®quşXcűěEńtđwQ^˛w‹ă¸:Yś\ĺ&ßgĹJÁŘÁ*żĹËKüBŮg÷lô"gúxz•—÷IŮ˝2ëI>HŁvh:˝Ô2Ő'÷Î+—‡A˝ĎvWŇ٨[а”Ô82VżŘ‚ZŽ¶Í•W‚ťăZ9‹űć™ú;M ă*Vú•Ö°†#´“Aú6‹ěwöŰ`çŮuvŤÝ`›ěŹš×Ł*L¸Éi»őÝj1;Ź"Łe«Ej©ŕmPÔ?/#Ă(cRÍ]tŚ [XH1Ćjׯ6Đa­Ń?i&*&»·qp«rźYŹ >© ą<"K ö2ěSv•}Â.Âbř˝Á®-f±NeZ#J%°Ó©l ÁĘ8ˇ5lĆ“ś/x!/ťU˛Ú x˘w*át¶8L©&Ŕa „ł¸Ć°ővµlţ_ż~&Żj Ěř1SJĐSÇ;˙ąŹv·ď~nůů‡c¦ć‡2“C®4S±,Hĺ}W\Đy^Ě@Ăr)É ,ÎK-”‚XD“Ń[ĆüČŘá1Ie¦úKÖV°–3j];  fqVß@ăô-ÉÁ{«Űęk`§ŐÇŁ–Ó#];µ™çůŐL‡wgˇV‡˝ŃĆOtĚçŰ®v‡k¬1ĹHÎŚmvÚ‰JW‡ß¸ŰŔWÚ3Ą +ŹÁŘ%®ř}NO~ĚoŢ’ü6ć‹­–Ę0‘ÖQfIJU)¦ćW?üzĹfźĂ{ëC3>´y”-Z(ĐÁp'ćä ĺlf¨gO+drÁ…ś˝yݬžČóě=vjÁLm®›Ş¨ć¨éa‘ĆúŻ2łu>Ľ›MdĹDNv¸éÚ-\·[’T Ę(ź(’Í ˇB•ś/uŠŇçQUIôAÄJ lĄh$¨Ń„Ątą%šDş ĘŤVţő3Ż'©fD¦dl‚cßƆ-L{é«9~µ_ejâO+®‘ű:+Q„-Wp ˘ ŢéŔµIĄ”â„ó–HY/"‰ÝÚbÇP}ôRs(°€Ż›ŁłŹtµ^ȵ2‚†­˝€6JV?Ú ¨_l Ă›ČÄ$TD†GŰBiÎ7ÉóŠ4j…ź*úCmŹjUţ>ÎMŤ_¬Ť[OWąŐýăÖţŕ—¦ú?jź4ni‹S[¨ yť`ž˝¶Žű$ś#ą¶řÁ7ź—Uá~ş¤«hߤŘÚ"r/®ňł)Sů$oĄŕFYlżđť]žK…(PŢ9⥠…pç$Š;šx$>MúmO„vI'B×[îř¤ť‹+ĹS¸í:{ŽăZŻŞMŞLý pŚ‘˝ÂöÉ«uŞ=XĄ‘÷ŔşCČŹŃŇ‚ÚĹK´{‹ě‚˘ň·é(7ř®/Ú;¤wĐÎţĎ˙đŕLń,Óf6VÔsˇ8ŐéČ`DÄüî&eYBĚś4R¶(&öß÷E÷”ä:Sdíąľóţ¸‰ľĹe iÄ?ŁĐŇB`‘Ťb Ó˘ĚwJćë±·ôB|@\Ąu~†šĄ] ‡lÄYä&rr-üĐëÓ’'X9ÉsfoŤÖĹÚÁOä¸rázÇ Úď…RZ•Ułăî!vDIŰqXŃ’r"ŐüŘ«Ň;#v±Í^ÇsěFą—)~{‡ţ``ĎŘO5ŐŮ˙{Ěąs”`ácÚC‡ ËĆ€K’lV[}·Ş…ÓP:ţętMY endstream endobj 93 0 obj 1600 endobj 94 0 obj [ ] endobj 92 0 obj << /Font << /Font2 12 0 R /Font5 28 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 95 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 96 0 R /Resources 97 0 R /Annots 99 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 96 0 obj << /Filter /FlateDecode /Length 98 0 R >> stream xśíZÍŽEÎj$¤ÉgXÄaeŻÇ2éŚüĎăZ¶1Ě®wÍ4-ć` Ćę5 ™“OHÜöWľđ ­VÚ}N‹x9ůŕ—€/˛şş˛»«qĎtYÚ]ęéěčŞĚ/~2"rîKRZňőJ;pÚăóčXŢ—ZiM9$Ż]ącő;nâŹciŹA—ÇgýŁ}t<É•/ü÷žĽ)?„űňâogľw[Ë»ź@‚áwLÎd(«sŇ6[ůńÝS‰ş'ß?/oŕş_I˘"©\`K1yRÎEIÎ[ĆB\ŽÄÄmVŃśłľĄőĎö´…HjS‡n?*Đv_řÓ•ĽŁěq“"›IÇ˙ŤwÜuL‘uŚő&;žüĄ)xL?–Ż~ôá§FzÜČŻ$§ď/ë5ăíŤ NN[ĄMß“ďČsâŃľ$ĎXťk.'âŰćáäűf:y,^j^Ä·—›—÷Ą-ż‹§ÍŮF§űň]9}]^™Ž9=—‚Š6¦µ9žŰ—ÓXŘ3˝±nI!jź’ńú‚‰<˛í«Ě./KO€>˝“ö.™Š4ëI¤ ®Bë¬H•ˇmĄs ¤ŔŘ{iČ+h<ô÷tďU˝¤ÔÖ¤ ´á¬´VŻŁ5Šâ?âOâ@\7Ĺ[âmq(ţŰázZżŔ9ݰĽÓk-ă!VZŃZâĹŕ"ńü,¬ŚCÖć8Wšµ©č‚6«h1§”ZîíI'ŐZÂü´%8*ś=8‹8¸…Ö,›ĎşĹ« ›4–M‘%Ç%}Yń¦xCüQ\Ćđ÷mńÖvf ˘T:Âv`LÖ+c 3™őfĆ[YÁ†čLŮŻ`‰ÁSŠĘ›˘q¨’–łŠcń YőtO«tţ<ß<_v52a™xRxëżřÚńí»wśĽüѩ̖͡«íJ,‹šBh㊏¦řĹiÖ“|Î:*'ŁÚ(   ±S zëTn™ŽdĘš¬‚«/hŮą6v|„NÖQOŠ^\Ä÷$ř8}Ĺ9†ŕL-ľ#Usěh‹et|zÂ\ÖQ§ćMvµ6áăuR5á`Ť Kfő…z¡žpGëU1糦›Ł:Qšđ/ VđŤÚSÚ°ň˝.I~ ůÎßËwŢŐň=ř‹k·Î0‘ÖqfÉEmŠiäŻţZĹáËűņÖlčđ)[r`˘•(NÍČ·ĘŮě.*rj)';™»Ö«…é‹@Ňj,…Ěů„.1Ő`Jz3×HڇŞć˘J­lŘDĽÔhĘq:€ÜCť"ůůÎéüĎÔ!˘s¶®¬€`6Ô´YE3A‡Ö#Źö¤“W™†ń3$ r_ď4Š°Ý Ž¨´N!JT¦śsZ˛]‡ŚőrŘ[·Ä (>F)9HE¨qŚ:Fş‰Z/–ZAĂŞŞĐ“f= %kwş{ŇÉUdSV”áqŰA‘Aŕ|¶’,±©Hc¦N…•˘˙ߨíQͣʂϾĆo.,F÷Ą™×ý‹Ń“É×}őÚ9üd~X™ŘVeČĎ1†EÂkŤó2daŮ×ě'™|µ«ŁäΨ^áľIsë;y<ůßľ|%(?+­ü0mn7“ďpţkw,-6˘ČEřŕŠwĚ˝×(îá‡Ůç%@˙: CÜĐK•9~ĐÎĹłÍCí%ń×çýĐ6© ô{Ŕ öYń„­Úä΂)Ď-xÔ=B~JŽ7Ô!\F€=8dż­FąÉßĆ‚}€űěâÇ…˙ .Ż#m×cEç Í™1@GŁü{”]ÉP#rŇÄ٢Zę?Nţ>Ü+ś»@Ě‘ˇíą2^Ž÷Z«á:€ť›0 ?h.Ŕţ§]đmŻůbaÖOGAŘ™‰Ü_ag“ÖĘ#ďđظ1\Šú“Ś„ď*ç%|7úý¬ą^ŕ»Ŕ;`gĘ{E×ĎâÚăV÷(ňfGŽÖ×=B”HšoŘđ0Ňz)©źüs,T¸Ććć¶řˇy±Dix<Ŕ˝Î‘ú…_ńQ‚ř\|ŮA],}„\&Ç©^¶^:T8í¸#Č.b_Eš;,ęô]îŞV·¶;DY”ęÜçÎ&/źM¬žV CtŹír2ˇ-ROkĂÉN&ćG;q=ßËđ€’ĘrÉu¤“÷ž·áÎĆ86÷rއĘ˙:sqUüAüUÎ qłŚ®ě*ΡŞÁ—ĹŤPݸŔçÖ‰ě%g• äcéťCI¬¨łŠšMÂ~¸ČíTÄĘŔž—€yS=*cřG,iî+Ŕ…žŮÔTß‹Ci§JŻ"ÍťÍkgVüh§öĹ ­˝ ¦d×&đÉď®ý ŻQţ(+8Úd”)b,' Ž—âÂcď˛ĺWgřNňNiżU#ëŇ8«ZŢç kҬ'őÝŠîąťúV…ě˝Mcu0ř@ËşČÁ}°…ŕŕoŠËâP\Űů°”ÁLÍsë[Ŕ€JG4h—-¸ß.NnŔ|±ń®1w9X,6Iź:bŐ[¶Ţć »!O<©2Ŕ Y†1lž> /Pattern << >> /XObject << /Image4 14 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 100 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 101 0 R /Resources 102 0 R /Annots 104 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 101 0 obj << /Filter /FlateDecode /Length 103 0 R >> stream xśíYËnG­žHHÔ?D,"‘˘ŢŹe‚ó20 f ˇ6Ä$Rvů ľ!Š”]"~e—`—¬˛ŕ+rnőtwÍLOńŚĄ,`°§ű¸«nŐ}Őą·Źą’ÓçăćÂJ‡ďĂ#~ĚĄR%ť´ů‰Ů{¬{łÍďńń ~uĽÉĺŮčE0!έqk›Źź°·htwŢ“|.Fípé|ô:Đ•iţĺŐyĺňÖ#TďłÝ•t6ęŞ{HIŤOĆÚT8ÚR6W^ Lě×Ę XÜ÷Ď´?ł t\ĹF~NĘ kXĂŤÚÉ }©Eöű†í°+lźÝfwŘű˝ŐëI&üÁi‡ĺťÜj1;Ź"Łe«EşRÁŰ h}^F†QƤ01š11»h‡ŐRڱ ŕvh­jµőIٍvo ňŕV3ä>ó/|Rryd–¦ěeŘ-v“}Í®Ăb;ř}‡Ý^Îb´F–JĐΠ°5&VĆ ­a3žä≗ň‚ŮY%«ť€'z§bNg‹Ă”j ¬ Îâ".ębtŹ6?ŤÉ÷/äSMA3ľÓ”Ňę‰i` ö鳣űŹZ~ĺY§©Ĺ©Ěä”+ÍL. RyßätŽ‹9¨î!—’ ÂňŕĽÔBy ČEČŢ2ćG&Ŕ!ŹI*#ę–¬m`;O´˛{(DqßCq$úbćŕ˝ŐĄř8,ÖŘbÝ6Úyz`"ë°5ó"żš[đŃKŔ™ę>űkô3Ô±:x§úr›ŰIC¦:ĐCř‚­F/XiŇ ÉVęm4­ID+mĚůÔęt@‰«hö-ŕiią; ëÎŤ––íeEÚu¦6çQ9ľ4sŰÇşËöóŐŐuĹYxtQ·ŁÓzjŠŁy´Č"ÂČGÜY ľ,Đş@“ŽÁ‰H Şź  ;-“ŽMT ]ʬ°(‰´"„Ć,ęŘ,P‹ohpś›“VĎÄŃZÜxP„”NxMaµ§× ë’cęiÜ3š¨…Îb x°´´ÂH÷6ęć(ăIĺ@\ÝR9É\•üŘąäĺ4=î ž ·ăÖ"ÇFř䜉›˘ÇÔ-56Dż€{ř-v´řúÚťx…zßĂCO‹ĂrąíĄ ÓÜ«;0}Čyç&·Él6ň€+`×KÖu“ ŰKZx¤BCg`"Z“{ŇÚ5ňş7XĽ…•\vN€”âdş0.ĺ°¨PűµŻţŽ` K¤îŻ# !Í 8ł" M2¨çQŇ‘«ęS©^lSë€ĺCöÁvĂĆpŤş”´}Y¸š@ACŘ­µ k‚µ :xhÂÉÇAMČf2Ň;EŻ+:¬.0T™Mµ] °|p “·ďđ7Kď &ç‘űFJ´Î:…dĄűQÝy¤d Ńç_¨‡‘ endstream endobj 103 0 obj 1881 endobj 104 0 obj [ << /Type /Annot /Subtype /Link /Rect [ 298.6378 245.00552 657.1224 263.00552 ] /Border [ 0 0 0 ] /A << /Type /Action /S /URI /URI (https://github.com/prometheus/client_golang) >> >> ] endobj 105 0 obj << /Subtype /Image /Interpolate true /Width 792 /Height 42 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 106 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ*"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ů˘·uďjz敥i×Ň'Ů4ŘD0".Ü€˝N˙ëÖv~đ,Ţ.Ńu{› Ĺö!JYěÉ—=÷dcˇěj1ĄM*µzuí} ¦§'ɧ,Ź+ď•Ůßnc“ŔŔý)•Ů|Fđťź„M˛M@ÝjŹ{؆6ÂxÚ×ćëč=kŤ«ŁV § ™3„śeąłŕýU´OYj)y§´ X\YƲH‡Fe Ŕ 1š÷ ö„‘-5řH®µ Bi-^ ( Óá‚0ě>ü‡Í'<€kĹ|á]GĆ~$µŃttSs6Iw8XĐ}çoa^­˙ ő=ŇŢťĆ:& l…ÚÇťĐČvĄ±ĐőÇN•R·Q+ô<ĎŔ>;×| ¨Ëwáű•ŚĚˇ&†Uß tÜľŁ×Ż'Ö´> üQń7Ží µÖ® ŽĆŢ–¶±ůqîĆ’I8Éă&ł<ááôŻń÷…lü-yk Źôťy'Ś»I§ĘFAĆŕ÷ˇI7`±ę~řďu¦_éÖÚŽ»«ßhvŰKçKnĄ Ń ůŘĆ@ş‘őŻ4ńŤ®u‰ş‡‹t).,&’ë϶l"Śŕ‘Đr9‘ÍqµBŇouÝbÓKŇá3ŢÝH"Š1ĆI÷ě;“ŘQĘ–ˇsÔ.żhoĎdđ,Úl2şíkíx÷%Jň˝+Q»Ňu+mCMťíď-¤Ĺ*Q‡C^Éuđ[»iňxßĂëâ5Źöc>8Î3ś˙ăµČ|ńžµá_ÚZč×Ĺ«wmot%}Éćc‚G;tő¤­m^˘řÓâЎ–—ţNťhayoQId$nl+0çhďÔš»í ăȢXÖçOÚ_řóNkřđçVđO‰í4‹ů ™ov›[¸ÉňĺźQ‚yνżg;‹}QtíGĆ:-­ýŔ&ĘÜ‚dąrHRAŔ9gĄíSÉ|qâýWĆşĘęšëÂ÷K Ŕ QĆĐIv<×Ucń·Ćö~]jMh°eiíŃä Ť¸ÜG8dćąű/kמ>Ál­¬G3C ň ^K–ţî9ĎÓąĹz§đĺlµĐ|SŁëZÎś…î´Ës‰S@äóě@çŠ.Á©ćÚŚuŤĂzÎ…§ĎiÚ°QrŤ±8ô'‘Ĺ:ßĆzĚąđ”sEý‹q8ąxĚCvđTđÝq•ÎAÁŕŇUYô_üań_‚ô6Ň4™íd± ^$ą‡Ě0’rJśŽüŕäf˛aŐ}¨mX59/ |[’?źđxÂÇű[Q‚ĚŰÚ,!T~ǡnzó^o­ęw:Ö±{©ßČdş»™¦•Źvc“řVŻ<9kâ}bK+ÝwMĐâHZQs¨H6 ¨Ř #ć;łô˝ßăźÂßi[\iúç†<5äéŕý‰ĘÂ×, áF3žpzQtjĎ>řMńJř/ÄvP%ŘÖŻdŽ[9R$x¨ţ<°8>ŔÖÄŠľ'ńŐ”ZÄđEc oÖ‘ůhÍýćä’G×צ~ĎZ3řá/Ä *aîÚ(üéŽ1´ĺú“\/Ä?„ÓxWÂöľ#ŇőÝ?_ŃĄ“É{‹Öţ'Ň´»ËČ+++Žeą(Ľ2;pJůÄş%÷†őŰÝ#VE{i!ŽE#=A¸ ‚=Ť(ŮŤÝE‡ĹOŘÉáÇ·ş·@‰ŕ˛ÝNÔu CqópŞ>ř…â? xŽóZŃďDww®ĎrŚ€Ĺ1f,w'N¤ăŚń\•uß Ľ«|@ÖßOŇ<¨Ňón.f8ŽÎ2}I쿡§d…©łăŹŚž+ńއ&Ź©=Śt¬­,6¶á<¤0É$ž é\ׂ kúżŤmďËĐÖ§Š~jţńćŹá«éŕa«OV—±äÄáÜ&ěuŕ·#ükĽ“ös–(ä–_h‰ ¬Ćé8¶8AË}ăą8;~đëEâSÉ5k—ľ35á‡[iV_> † `1‚;÷ë]í×í ăąěž›M†W]­s óäŻé\?ÄoŢxĹ—ZüŃÎńtš0BČŚ2Oqë]ĹO„ú‡Ă˝7K˝ľÔm/ů™¬  ÷ę9§ jaü=ńö»ŕF{żÍýˇM Éľ9é‘ÁČÉäÖµücńĹľ.Ńnôť^ćÔé÷2$ŤVę»v@SÔ ¨=i˙ ľętÍNúËR±±†ÂDI>Ó»rY˛ 3ďíÖ§řđšăÇÄzF·§řCi<©.¬Ď¶p3‚Aă őúŇ÷nŚđWĆřC@·Ń´Ó§Í§Ű–0ĄÍľóf,pA«ÎkWńťçŠĽgg­řѤԢŽHİG„J¶Lh1€?™­Ď†? uO:-ţ٦ßŮ[-śé %ĆápY˛ sďŠO? âđľ—g¤řźJń sÝ 6KŇR ›?tŽÜăŠ4¸jg|]ńÔźjţ3Ôµ(Rk}:ÇL$^ŢÜśG ăÜđO ’8¤śzĄŤgă'ڵź MáýNţ‹˘XdwL® Ëzđ9ëGľ1ř·Â: ľŹŁOf–P1‰-•nbÇž§’jÇŹ~\xsĂ)â=\ÓüEˇyžT·VGýSg 1ž:ő#ŽkŃľ ü5đőß‚”7§’řó⏉|s§[ŘëóZĽMç †Ýc;đFr9čMočź|qĄiPXý˘Ęđ@"šîßĚ•@éóddűśšŔ׼+gáohPYxŹIףždv“O8ډÚŘ'­{çĆo„Ëă_˙iizUÝŐşEge?Í5Á@wą¸ˇˇ¸†§ĎV_ĽIi㹼`—qľą6CĘđ©R lĆÜc@…Aá_kŢÖ5-SI¸‰/5Ţ;†xUmÄ€FÍ:ËŔZő珟Áđ[+kĚĐČ|’ĺż»Žsôîq^©üą[-EtčúÖł§!{­2ÜâTÇP9<ű9â›q Oҵ˝'R¶Ô4ŮŢŢňÚA,Rˇĺt5ŰxÓâď‹^xŘ^[­ťµĐµ6ä7Ä•Î1ŐÇĺF©7‘đ×ţ‚^0˙Á}·˙¬ív?Ç`_Ă·Ţ"“P ĄVöŇăĆyů’V úq]Oţ>żá$ń.ąâ=3Ăş<Ň´6ňŢ™X2@†sňž1\ŻÄ/ ŹëqX¦«c«A=şÜĂudű‘‘‹ô9SĆOj4¸­áŻŽ÷Zeţťm¨ëş˝ö‡m´ľt¸ęP˝żťŚd[©Zóořćę÷â…˙‹ô '±™îĽëbpT 0Ž@är9"ş?Ů×–ÚçŚ&Őő”CˇčP›Ű“*ĺ€;ÁÇű5ÉërÝ|@řŤrÚ5Š,úĄŢŰ[hT"ŞôQÇ OÔŇI\5:üuń§49ô»‹‹;h.Ç;ÚÁĺÉ*‘‚ dă#Śq^\¬ČÁ•`r8 ×·]|îÚ|ž7đúřŤcßýφÎ3Śç?řírüg­xWŶ–ş5ÄqCŞÝŰ[݉_ryŕ‘ÇÝ=hM[@ő%Ö~2xËYđ¤ŢÔďḱš%†GxĘę<·Żžµ?„~6xĂÂúZ=ŚösÚ@1oö¨<Ć„v r8łśUďÚń“TÇüđ·˙ŃkW?g_ Ü]ř†ÇÄ^» ĂŞÚĎ,pé—ÎĆYG”A`ŞAĆştŃĄ®Üâ¶×őß鞲˝}–_m#3“Ó©Ď8ęxÎ+âŻĂMCáÄúd:ťí­ÓßFŇłî rzŠže°Xŕ诠üákýá?ŚŻ´]{Ăz”:ŽŽ%ľ·WwšŐ|©ß”đŘf0ęľŐăţđ寉ő‰,ŻuÝ7C‰!iEΡ HŘ‚Ł`$ŹîĎĐ ĺô×Ç?…ľţҶ¸ÓőĎ xkÉÓÁű•…®X;ÂŚg< ŕôŻ™hNŕŐ‚Š(ŞŻxřgo§ü;đ¤>&×ĺqq«´qĂ» wcż1ôëÁëGSÖµRÖĆÚţîIಏɷFézČ~CҸ±¸ib˘©^Ńo^ívűÍčUT›•µčt?í¬ŕńŢŁ&ź~—°Ü‘qą\ľÂă;wwëÇ=ĆŃEtQ¦éSŚ˝•®e9sÉĘÖąí˛UÔ˙.bšEŽ[­2h`'»ďŤ°=đ­]żěóŕźřcUń¤ţ °¸´‡ěŤn$”`O&Iܧř†ů‡5|Ű ŢŦęö·“ĄÓ¤-ż·g”6Ҳmm¤‡Ąz¦ńĎSÓmµQ{©«\Ý[=­Ľ—şe¶ >öÁÜŮŰÎGNÔäźA&y† júä˛ KľÔ ;L˘Ö—`=3´gňŻný¬+׼,× áíRëO7DľCc~Üă?LźÎµu/‰ľ4Ô¬.,ŻüI¨Oip†)bi8u#b*šw¸t='öe†Kß|J°µS-ĺΖ« K÷śí`~,ă^1®čż‡çŽsLĽÓĺ‘w"ÜÂŃ–ĆFG4Ý [Ôü?¨-ö‰qcvŞWÍʶÓÔuŐcÄľ'ÖüO<3xSąÔ%…JFÓ¶vr@˘ÎáĐĆŻQýšŻ­,>0hĎ|ę‹*Ë lÝŚ„/ćxükË©T•`TG ŽÔÚş°ŹTń×Ăo]|NÖŁ‡FÔ.{Ůn#ĽXŰĘdg,­ć}ŃĆ;ńŚW ੣¶ń–<Ě(ŻŕwcĐ"’kuţ+řéôł§7‰µjSa†ý¸Ć7ăwë\E$źP=×öˇđ¶»'Ä-O]‹J»“Fđx‘–‰pˇNXtçÖµ~'hşźŠľ|5¸đ͕ƣĄ°‚â;HĚŚ˛lDÉUçď# ăż˝xÝĎŹ{7«ÚĽŕÝŞwĎLř%á}~ĂáĎÄű{íR·ž÷K m¶ÎŤ;ys #ć<ލŻÖ4ťGE»ű.±auarT8Šć&ŤŠž‡ Çźję“âĎŹBŻŠu<űĎţµs~"ń­âKń{®ßĎvD%™˛B‚HL“ůŐ$ď¨3Ţj kz滢jş6•{§&’›®-˘2*ᙎHéÁ´ľ^ŮŘü;řM©ßş.—a«^Ew#’d3™ű OLŠđ«^.°ŇKłńŁž±–1Ú¨F6ŹAô­_†˙&𮼨čúŽ™ąáÝ@~˙NžBw÷•°vžná<®Ö ę{ńđ÷‹4m+âŐ÷‰µuşŇő6ńěc7>főŮ!VUţ‚ŕzŹA\oÄĎë3řEđÂă¶sęPZY k­†â’ěŤr@ě 8'·ă^WâxKP°š-7ÂZ†źrSd6¸ó¤<˙qŁävĆE'…Ľ{yáť";="ë\łvr×ŰQTŠ\ž Ćb;ÉÎ(Q{Žç¦~ŐöÓY[řÖěćâ 9â”ç9eĎ~EXř%á}~ĂáĎÄű{íR·ž÷K m¶ÎŤ;ys #ć<ލŻ3řłń Ľs¤Ó›O¶Óm~Íosçłz±m«ÎíÚˇO‹>™'ó­k^.°ŇKłńŁž±–1Ú¨F6ŹAô¦ÓÜLř<Ěźľ'•$-G…4í#źŮ[Ďm]q˙}Ă^7§ëú¶ťĄ_é–:…Äŕ ČI@é‘K5xĽ?.…ˇrş<˛‰žĐ?îŮĆ9#đ•.Pąî>/ĐőO~Îź‡‡ěn5'·™’TµC#!%×9ĆF íĹZýˇ-&°źá=ťŇ츷·X¤\ç ¦Gć+Ć<1ă˙xZÂ[-[»˛´”–h‚ ž¤Óî1T5ĎëşëŮ>±«^^=ŰnŇČI‹§CëŔçŘP˘î>ŚřËŕ˙jź´†57O»¸±&Ô‹¨ĐŕĘY÷7EŔůąĆsĆMywí9ymyń‡Vű+«ů1Ă „}Pd~? ćâߏa[…Oj8ź—,áŹ@>RFW€:b¸‰dyĄy%vy–fc’Äő$÷4$ÖŕŮęţMđÖĂMş—XŹQ’<{VÜۨ?xç­uźł’¶©ŕş™"¦ąyg›uݵśluŔ?R¶ęń˙řĂÄ>(ŠŢ?j÷z„pŃ,Ϥă'ĽVn‘Ş_hÚŚ7úUÜÖwś¤ĐąV_ÄSłjĚ/©łyŕéşNˇ¨ę&ˇcciµ'–ć&eś(v7rGLײ|NŃu?|řkqá›+ŤF KaÄv‘™d؉’«ĎŢFÇzňüEńoŠ4ńc®ë·wv`†0ť¨¬GMÁ@ÝŹ|Ô^ńďŠ<%°x{Yą˛‚FÜŃ. zí`@<i4Řh{ÇÄeÓĽAđGÔkYIl.P¶Ys%˛Śţ(ăđ5ĄâRá ř˝‚äa‹˙B‚ľd˝ń±}ŻÇ®^j73jŃČ’ĄÓľ]YH*Aí‚*yü_âíu+iµ‹×Q\]ˇ”âi3{đ?!éK”.zgík˙%U=ôč›Ôü)ăčÚţ-ń7öŐ´Ěë{Üů-µIűĂž;űW—ëúî©â˙¶ë—Óß]ěůł6ćÚ:ÔŐżřżÄ%‚Ú{W»żŠŰ&$™ň?^RMX.{GŔ=6÷Wř1ńOŇѤ˝¸@‘F˝\ůgĺ^źŤ/‡´Ëď ţĚ>0_ÚO`×÷Š-`ąŚŁ±Ěc;O#•?‚çĄyç€>&Ýx/ÁúţʧÚIö˝IŇHŻŁąňÚŮ—ˇ ´îüĹsŢ,ń·ü]äę÷7ËLhřURzŞĎľ3JÎásŐţJń~Î_&*ĹÂ’b¨üA"Ľ‹Ŕ·PŮx×Ă÷7ŚÖFŢYIčdRIü3UěµýZÇF˝Ňlő tŰŇ Ĺ˛9 )2?YtŇÜW>žř‹ŕďę´®ŹŞéöréŇOgp—±ˇ1G{wĺÇî·®G­Złą†ëö‰řĄ%ł«˘řzhÉ^Ě‘Ű+¨e#đŻ Óţ)xŰNŃÓK˛ńôVH‚4@A(Ł€ÜĐ×;Ąkş¦‘qw>›qm=Ü/o<‘ą $nAe'Ż$ʧ•ŽçÖž'íĆN?ł.żô™+/á•ë˙Âń6ĎIŇěő­Z vâŕé— ąg˛6÷űŹę|ßmăoŰ>”ĐkwŃť);,Hp¬0BűÇŇŞi%Ötmiő}/Sş¶Ô¤,^â7!źqËnőÉäćŽAÜöżxĂĹŇü4×íOĂ‹?čs*%Ôëlöŕę …;wŕg_öe†Kß|J°µS-ĺΖ« K÷śí`~,ă^câž-ńE—ŘőívîîĐL„F#‘•PÁçšÄе˝OĂú‚ßh—÷7jĄ|Ř«m=AÇQíO—K úšQ过üM¤C®i—š|˛\FČ·0´e†đ229Żuřśěk ‚Ä…{0=†ăţ&Ľ Ä>+×|Gwou®j·w·ĂÉ+ó9ů}9¤żńNąŻĂ®^j—sjđ”hî™ţt+÷p{b›M…ĎĄĽ!ymiű\ř®;‡D’ćĚĂăŤŇl°=ö«U}7Ĺ>7Ó!řOńJÖĘ.ĄvËmĺ‰V8UëŘ€*Äş§ ţÉz¬Í”öWj):Ă:p†X€%O#îžµáŢń>µá]AŻ|=¨Ďar˱š"0ËčŔäő{^ń÷еű+›=c]ľ»´ąq$°Č˙#0Ć>QŔĆŽ)ň»Šç«|7×µ~iz?~\x«Â’M$¶SŰÄ]ă;Ü60!·óňžO8®kö‹đfŤŕ˙iĂ@Š[K}BĐ\µ”­ą­Ű$c©88é“Č<×+ᯉ/đÎś¶˝ukd™ŮÚčą$ś$ž=k9|K{sâ»m{\fÖ.bť&‘nÜ‘(RRGAÇAEťî=ĆGţ§Ŕť/Ă)ű˝{ħí—˙ŢHx;ţ:ż×)ű5_ZX|`ŃžůŐU–Ůş _Ěńř×+ńĆWţ;ńLúަ‘Ĺ#˘Ç1’V$QÂŚűäýI®eIVIríM-úž©ă݆Ţ6şřť­GŤ¨\<÷˛ÜGx±·”ČÎY[ĚűŁŚwă®ÁSGmă-y$Q_ŔîÇ E$ÖëüWńÓégNojÔ¦Â7 űqŚoĆďÖ¸Š}D{ŻíCámvOZž»•w&Ś-ŕ&ń#-áBś°éĎ­eţÍ:°~'ř{XUńŇAśŃy#÷2/ßĆ:ńׯÂ\řóĹWZ ŃnuíB],Ć"6ď)*Pc ëŽ&…ń Ĺş™ťŁë÷Öv1Rß ą$śrIüiYÚĂşąŐkşVˇá˙ŤË­kÚeí–Ž|LfW2Dč.wä1?('é^ÝńO]ń•ă°tφšw"•b’×T[6™Ű :ş´©r8ÁŻŐőťgöˇűG‰tŘtÍQlZ9mbmŰ äääŕŹĺUżg†i>*|B.K¶ş,OsçŠđ»_kÖľ"}z Zńu—$µçšLŤ‘’zŚqʧĄ3Fń6µ˘ß]^iZĄÝĄŐŇ2O,rŇ99=ňyŁ”.ußłĽ‰Ćo ´ŚL˛.O©…Ŕ™żü-Żiţ9ń.©{¤_C¦M¨ĘŃÝ´-ĺ0f%pÝ9çM%ĽńÍŹѰttb¬¬At ×EŻx÷Ĺ^ Ółő­vţöȰsŇd:ëNÎ÷‡3[ţş‚ËÇ~»»`¶ĐjVŇĘÇ E•I?5µý»ŕ/úu?ü˙öŠÍ×őO ÝéÍ‹á›í:óp+<şŻÚŕ§”ąĎÖŹˇ5˙x–çö˘±×mě®%ŃšX.Vőy‰"H•YKt ŚwĎ˝/.­íżkŹGpę’\[° żtňs°ľŔWâĎ]ëţ7ľń4A¬nî.~ŃŠBZ1· Ç ĎŻ©W=ßö|đŻ<-ńĹ:§‰,®¬4Ë[9Ň{‹„+§ĚVʓà +Śţµŕ š;oh3ĚÁ"Šţv=)&µµď‰~2×ô¦Óu^\ذâ%T8˙h¨ż×T“ę+žëűPř[]“⧮ť]ÉŁ x ĽHËD¸P§,:së]=Ž‹iŕ˙†ľżđçĂűjzÄ 5ÍÔđ}ŁČvUmíb@6śäׄÜřóĹWZ ŃnuíB],Ć"6ď)*Pc ëŽ?‡~#x»ĂzYÓ´]zňÖČäT† ž»w·đĹ.WkĎný¦#–-OáŠ\[Ăm:©Y €b84U˙dµ3âs±ý¬<. ěŔöŹřšđoĹ:îşlޱ«^^5"٦”±‹§C×<}…ţ)×/őřuËÍRîm^ŤÓ?Î…~îlP˘>–đŤÔ˙µ·‹â–EŽK«&†{ɲăß ŐGöyđO‰|1ŞřŇX\ZCöF·J0'“$îSüCüĂŹšľy‡Ä77)Ms\žţöčż™$±]y3ł²ɵ¶‘…ězb˝#Ařç©é¶Ú¨˝ŹTŐ®n­žÖŢKÝH2Ű{`nlíç#§jN/ ÓGđßÂŻăoiŢŽílÚóĚÄíđ›#gűąÎÜuďSüQđdžńtÚ·«|c‰$ó–?/;†qŚźçX&­ˇjj:EÔ¶—ĐçËš#†\©Sʍ$~4ý{ZÔĽA©I¨kWł^޸ ŇĚŮbŔzܓ޾&xwXńźÂ/†łźR‚ŇČ[\El7—dk’`QÁ=ż­űWŰMeoŕ;[ł›4çŠSśĺ”F=ůć~ńíç†těô‹­rÍŮË\mER)rx+ěl`g'8«~!·Źît‚šsiöÚmŻŮŁŤî|öoV-µyŔ»T$î;ž™đKÂúý‡Ăź‰ö÷Ú.Ąo=î–Ú9mťvňć@GĚyQ^¬i:Ž‹wö]bÂęÂä¨qĚM=Ž>ŐŐ'Ĺź"…_ęx÷źýjćüEâ [Ä—â÷]żžţě K3d…>™'óŞIßPgĽţÔÖőÍwDŐtm*ö˙NM%7\[DdUĂ3‘Ó‚ |ĺ]U‡Ä/Xi ĄŮř‡Q‹OXĚKíT#G úW+DSJŔŠ(ŞQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE˙Ů endstream endobj 106 0 obj 11407 endobj 102 0 obj << /Font << /Font2 12 0 R /Font5 28 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image4 14 0 R /Image10 105 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 107 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 108 0 R /Resources 109 0 R /Annots 111 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 108 0 obj << /Filter /FlateDecode /Length 110 0 R >> stream xś­‘ÍJA €w˝™'i§™źĚdŽ zP„VA”¶Č¶şŐłoá»yôěSl­]ő fň3Ů|3I Ö ¨ě®Ś€$úz- A´92ač2ľű’¤j>RŠŘýŢl‡”‚ |stźÁ,ŇÂhŻąź]!L„ŕt%Ţ ĂxĚŚ>{XN˙„šÁdNEÚÉv¤N¤¬µ>ŮlČFŕ”µZŚc"k ůM°é­M‰?˘˝ýđ'Záž×]ŢX]‹×Žj—Ů„CçŃpŚ.¬ç“ŁĹŇLśtě<ąôűEj”%ŚďŹHőc(“ŻóͲș ¬†WnŕŐeőVŹÇőI˝]˝n˝TĎCy‹¶pP?ŐÇrV†pĺĘŢĆ2„Ě?®4BąUŘ/ \ż  endstream endobj 110 0 obj 313 endobj 111 0 obj [ ] endobj 109 0 obj << /Font << /Font2 12 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 112 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 113 0 R /Resources 114 0 R /Annots 116 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 113 0 obj << /Filter /FlateDecode /Length 115 0 R >> stream xśµVKnAťžE¤ô@YĹŘČ4ý˙HlDŠ„4 (%r+8°á X‚mIJ̊E.Żf<žńGăöxşË]U]ďUwő+!9µUÇJ‡÷“c>äRH©’ŹNÚrĆě“čuĚŤwÁËR}Đ ´tÁRgŔgô{Äďóçp2ä7o^íK~ř4=!ZŁŕC™˘4ÉđW‡Ką:â×ů=´aË“*=• fU@<Âi®¬3€Ŕ‰ŠÉ[=%´„ÖW kí–lâ”ÜšXăŰôJpë˝­Ń©ŕ& e’FđcRĐÎ&t<—!b!jăt˛´ü­6ŠWüćťĎßhŽĹxúD^L3›đ8-ĽĺEE[ń”?ŕÝěQvÎööŘ.[ĎÎňÓěsŹ+EŕuŮ{¶˙ŠČ‹»|»ř÷Őh24»cťp2ĆąŐt{ĽxF~ţ‚Ýßؤ©+2˘LăCJ-Ń Ľ*Eµ^#Y’E#ˤJ»”š9ő3‹‘áÚWŚů9 TĘ{m ľ Tţ!˙Rµ¬uJ.¦ S>\íq“JţűlźuH‚Ý& –ŽĆ' ź‹ć˛‘(%‚sŇ8 6%7ÖǵČ:!v«F,;bYvžźćßĐß`ëcKťˇßÉO ÄńĽs¶35*đŇĽÍ:ŮŻ^µsşĄúěŽĚż_ž çíeł±âm´;AZAćÓ!źVDČ"ëDČ[ô8Ôú,ká|Â6Kf®˛ ČäXV UGXĘ~âý=(Żł·@~LŃ*@·8:LRÎ.†ĺ˛ĐJꞂݸrĂÁ‰ŮĘqřvńEţ¨]«1eďzÜÖ™˝‰LoŁ˝Ű®'Ë.H;ÚńŢÚąe­$VŤÝ¶đ€Z\rJ­…QŰč%4ëŘ’ jž48­ +őfÇ- Ô—¬RÁ;Şş’î˝XŐ_÷ďÁˇ6E)QĄ¦Čdk”ňřî”tŽňQűŃ›Ő5a /bü ¶G?e?Y?;Ăx„_dÎ::Ű0˘Z§şZü îřJ‘Źš$7L ŃůTĂ;çĹ!ţŁěżB=ń˛îI>]ŔaEYÎŕŇŇŽ|"kE„]— ›$ÓܸѡWžZt5ÂÇ,u§ŁöżÜtl endstream endobj 115 0 obj 862 endobj 116 0 obj [ << /Type /Annot /Subtype /Link /Rect [ 41.889763 107.0055 583.63574 131.0055 ] /Border [ 0 0 0 ] /A << /Type /Action /S /URI /URI (https://prometheus.io/docs/concepts/metric_types/) >> >> ] endobj 114 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 117 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 118 0 R /Resources 119 0 R /Annots 121 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 118 0 obj << /Filter /FlateDecode /Length 120 0 R >> stream xśµT˝nAľ»‰y” ä‹ÂzgwöŻÄ$(NJA(, ¶Đ9Á‚ŠŠWŕ5x‰Tđ)©Rä)ąËůÎ?"J<:ďěç™ůfżßPi{Ü:¤Żď°­´ĆäŁÓÔDlî9H–Xď‚×MzÝoŚvÄ©ac#ßs8„&YÂřIýi>Ő0űĚ FžÉ"s(«SÔ6Y8›ýŐŽ÷á5ŰrŔ„ Sc\Ct¨ 9+0 Ą€®°z€Y×b}nŹ­(…ÔĆNÝŢk¤í6˛’WŃ&ÇA mB:ýS0Ž;žu×!ąh¬3‰¤ůIĹ5Ş3??=ůbŔq |"TÇë÷šřqFy‚Ş˝´ę=ĽQö „FŞQ~OóGůŃQv•ż*á-T/áYu›-ă•F4n«‘Q ŐGa“°îŮ,mó›Ň~ç鸲ňë§+~e“ü Űžđkq‘?ĚÎů”ߊ‹l’ý`űÎŢĆöŘ*ţý>+ŔË= Ë.ó˝ŚeW%`ë]?‹ßw˘EŁ"łu–•@7ĚŐżć\Ć׊Vč(*íeĚ9™űďÁz˘ 8Ĺ9†»ô5pđ÷ş›ň‡űÍ;ÂÄH&JRŁ•eˇIĄäwĄ± ă‹éě"<=])v“,hŃjv 7Ž= Áz5޶=Ŕvr›ĹŻ%I1ÉÍăőôX~mČmĄôr^±żdą)ń endstream endobj 120 0 obj 531 endobj 121 0 obj [ ] endobj 122 0 obj << /Subtype /Image /Interpolate true /Width 1020 /Height 128 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 124 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ€ü"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEQESćŠH$)4oŽŞęAüŤ2€ (˘€ (˘€ *o˛ÜnŤ|‰wJ2aËŹQëK=ťŐş¸¶š%'şô〠˘Š(˘Šx†S Fć v—ÚvéźZeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¨Śěł€ “Nň¤ŘÍĺľŐ8c€}č”Sž7Ś"2’27 dzÔ÷}ݵ¬3ŰMĽ˙ę¤d!_čh¸¨˘Š(§4n¨®ČÁ6€ +SĂÚĄâ߲é­< eŽ@T¬O©_[=•őŬĄH$hˇĘ’§ÓŠ‚Š( Š( Š+oÄ^Ő|>°É¨ŰbŢp SĆÁŁ|ŚđGc@”QESŇ)Y’7e^X>´‚71—ŰÁlqź­6Š( Š( Š–[iáEya•ľë2Ң Š( Š( Š( Š( Š( ŠÔđö©x†÷ěşE«O(c«ŔŞWÖĎe}qk)F’ &(r¤©ÁÁô†˘Š(˘Š(˘Š(˘Š(˘Š(˘śŃH±¤ŚŚóµŕăĐÓh˘Š(˘Š(˘Š(˘Š•-§xZd‚V‰z¸BT~4Q@Q@Q@Q@Q@T[ÍpĹmá’RHE-ŹĘ€#˘†X†ÁµQEQEQVtË ­Rţ +Zk©›lh;źĆ´|Qá»ď ÝĹm©<é~">ŢqčhŠ( Š( ­év-¨Ý}ž9cŽB¤ sŤçűŁÜŐJ• © ŽA¨óE$ĽS#$pĘĂąy¦MgaĹË"4Çä„ýýżŢ#°­Xu»)âKťN×ĎÔ­Ć#oá—ÓŇ°Ż®ćľş{‹—/+žIíě=©€^˙ÇÓţĘ ©ďăé˙ĺPR˘Š(˘Š(©m?ăî÷×ůÔU-§ü}Ăţú˙:öżxg@Ö~ IĄ®IkŞ^¬kopUůBŤÍÓ$Ç˝kË#đäĹĎ ÝÝŰÚşNĐ˝ÄĚ5 ś¶O°ŕ{Šíüw˙%ŇÇţľěżöJ–ĘÓLľřĺŞC¬$2DdĹßqĺŔÚŻ~=©–ţ Đ5=I|3ŻË{¨éń4ŇE$;RU^»őç·®k3Á˛ńŤ¬jú‹XE§ůlĎĺďNwu'€:šő/Gâ8›Y!Ó´Ť:°Ě"ŽŮ#YńČÚIŘݍŻ<đgü“ý-żô3@üQá-6×Ă0kţÔäżÓÚołĘ%ŹcĆřţ_â:ÔşGôü)k­řźX—OK×dµŽ(L„ŕY€íÇ·ny©t˙ů":źý…×˙@JÖźA»ńźĂŹ ˙a¦¸Ó °ÜBdU)ą‡''ŃAúŹâ„׸đsé×@Ďg¦˘ĹpŠ0ŘÜőĎëúçÁí>óU¸7'V)Ľ¨ß€Cń’ŘYCáKQ"Ę Ó/1NCmŔČöâ§Đt›Ź|(M+F1K¨Újfw¤Ĺ ‘ź÷żC@/…´IüEŻZiv¬©$ěrě2@$“ř]uÇ‚t;ëMM<3®Ë{©i±´łA,Šżxˇ˙őţąŁŔKŕ߉¶vŢ T´ŁFÄČĄWz¤qÉŔük®Ľ˙„żK¶Őnu éš|1:­Đ·LÎEP§9>ýčÎĽ á[}v J˙Uľ6:Vśç•Sss€áďŰÖş­bĂO°ř9yýŤ¨űµ5•$hĚlż*©V¸+úŠŁđŢŰűsÁľ)đő´¨şŤČ†hŘ3cdůřŐí[Aşđ÷Á««MCbÝľ¦˛É¸o+* ) ‘śňš(˘>›˘h×> ľÔîu¸ŕŐar"˛8ËŽ;u9Éäp1Y5mE-úĘÄ2–óŻ%ňă ő­m7Á×—ţ˝ńW6«mjĺZ&sĽăíÔ`ż–rĽ?q¦ŰjI&µe%íRĺ1’qÁČ Žo¤PĽźđ–xYö©m«’qŘqÖ¸şíçÖ| ĐȱxZń$*B±ľcŽZâ(®îËÂ4~ҵÍkY–Ň ÂęcH7±`ĸí€I'ŰÖ¸JőKŹŢř‹áź…"ŇÄr]Dgo%¤T,¦B ‘ӏα­.[km@ăĽoá±áËűe·şv7p‹‹yöíܧÔz˙Ťu7žđöť«[iÚ—fŠęíŔ‹ośŕ=NF?ŐŠÂ;OřGôŹ9%ąÓ¬)ö…~8ý?QIńŤ™Đ˛”2ăĺvě»Î? ۸đVŤyk©/‡5×˝Ô4řÚYa’Ő~öÓ˙ëýsTţëB6wşĹ۱4oq<…ŽJ»ţşo x^ďÁ2ëš®ą$Y-ś°@ţb“;66ŕžqÓŢ•IĘ.Íëeó`rţ𾙩hŞęÚŚö‘-ęÚmŽ ůܠʧ'ňgÄž ˛Ó4}Z{=NK›Í*dŽę6‹jís…ÁĎ^F›ĂßňLd˙°ä?ú Öç‰˙ăÇâoý|Y˙čb“śą÷ëúŻóŽĐt ôhők˘ÔLĺ#¶¶_6QŚŤĚ*8ôţu_ĹŢ­i 7bîĘň4žŢp¸ÜŚ{ŹZîô› ´đf‰?t­.öiUľß5ÂFň#äpw‘×ňŽWĆxî<2óU±Rć Éť¸ţô§ŤÔµűĎëľ‹Lńě^K™$‰ć‚/8¨ ›rqíş™6‰¤iţ.Ôt˝cRžŢÎز¤éöf`=‰ü«ĐőŹ Ýkźt˙éňÁ&†íÓÜůŞÂäśçĺü;ôŻ/ń­ě:Ź‹uk»V·Q‡FŔ?Ť:ss˛żM}@ô?‰:w†R¶ký^âÖäXÇĺDZ`ëÎÖ$t&¸Źřf-r=BóP˝:]‚žm…Ď9Ŕđ?§­uŢ?đÖĄâCa­h±Ĺu§®ťydJ‚H ‘ëY!]gž%đü3Gˇv!–Ý‚ů›$Č~u0—--oŢ%𵍮ąáýIµ 5Ąň$ó#Řńľ3Č˙=G­réŢ›/…~ÉĄjĎzťőđťmŐĂ2 P2p}żQ\ç€ü'7‹ő9ěໆÔĹ ”´9ä řőí[Q“’zÜ ^ źěŢ+ŇdíöÔý ťw÷Öb x®É—çą»ąąŹýŘŢ"?ô*ó%ݧę,¬ÖÓuCJ·cřWłëIńΙ¦äl»´ą-˙m9˙Ů*+i$˙­ !±ÂříläńŇYęoioPĽ›Ęâ<Śü‘Lń•ŞĂáť[M^ć˙Nv‘`IcŘoľŁš«âK;żx˙T¶ÓŁ\4îˇwČAÉ8í]>ŻŕýnăÁZźk»W™ĄO5ĐÎHç8ŁüG\Ő­ÂBxRŰ[ń6±-„W˛4v©BpH,ŘíÁ˙kcDzřŽ×Áë›J±73‚¶ń(•¶˙*H˙­L†ŰOńwĂÍÍuť?OÔ4—•eKÉ|°Q›;‡ŻQ@çÄ ÁáitÄ·˝7‚îŘNdŰ…˙€űVßĂ[†Ö<;â_ޱ–Ůl^ňÝ_ź*DÇ+éÉ_óš_Ś‘A^ŠŇ_:Ú=-)?ľŁ€ß揇˛hŢń7ďPĂnÖ/glÎ1ć»ă§¨Č^~ľ†€<ŢŠ+©ńWgđö‡¤jRŢŰΚ‚ TʆëÜsÖÂy`‹E×ŕŢY Áô”˙Ů«>ňĆM3áţłe7ßW“ë…?ćŞxp•ř}⢤‚Ô‚;~ňşoÜŨü5MN5ˇá„±ń&›`÷žmގĺ´7H¸Ę9Ŕ8=ë­ŃçÔué áŘ,®î­ ‘\A:#2岤nč1ţx®oĆ÷z…ľ±§¦ˇsg-Őš+yv©µa9ÎĂŰRŠ~śΡNROĐn)4S<»şţÓ·×í¶7Q˛¤ *ůMü$v¬Ż x~=a/nŻnĹžťd¦›făÎpü+eü.žš•Ţż:ŰXŔŚ`‘$Rfá{ţtĎÄ5_ řD†XŇúäE$ ě™±˛@ü‡çWx¨·!Y·ď5˙Z[h±k& otö—É}ńěxßäžŐOVŃRÇĂş6¤ł3˝˙›ąŔMŚş-^ÂO|=}7ShÓP»Ľ, አP2qôýjEŇ®!đôzöٍŰK;Â-m%ą Şâ„ ~´˙řnwűFćţđŮéÚ|>tň*ons€ŕ*í´ ]ř1üGŞëo VfÎk{vó™ŮČ+€{t>µÍ|1‡Z{«ů|9měq‚m&ÇúRóăŹĂŻZ·Qµ'¦€PńŤ ÁĄ%ţ­ýŻ÷ž[ÚΞ\Łý ;ŹÂąŠő_Ř˙Ĺ—ľ"Ňôý3Ää$Kk´cÇ%€'ßżaÓ5ÇřÂsxżSžÎ ¸mLP™KH3ž@ŔŹ^ŐĄsDvM€ĚćkÓ|WâŰßx˝4멤Ů,hmUĄA#8Č88Ż6t6wěŚUĚ2ŕ•9iě ôĎxNăÄŢ)M^Îh›E»XŢK‘"Ź-B€Üřă]0˝´0«ËĚąöÔâmlWÄţ-6úTBÖ+ąYŐ[‘ŕ±ééϵ?„t›»}Ate®ď¬Q¤–„¨u^»O˙®™ŕËŤ;GřŠ‚+­ÚzĽĄÄ„r¤OLüëkĂţşđŚšÎĄ¬<1Z I!…ĽŔLűŚ{âśUÉśÚz>Öó8Ý+DŽ÷ĂZΦÓ2=‹jĂďlrh‡DŽO\kFfEv-ÄXŕ‚ ç?Ťmř !©řÄZ,RF—·iŔ®Řó 1$Ó󩵫<9đěiš“"j7w˘qpĹ(8ú~´”tąNo›–ý­§…ôü;¦júľ­-¬7eÔĆďmÁÇlI5źâOAˇëVPÉxeÓn•&K•N|¶<śzĎĺZ'˙’}á/űx˙Đé> Č3Âźö Źů Vű…+­wąĐ^iţ>°I5[…±lRŕ[ěŘ9R=:×c˘Ç«xť4˝ŕË Żç‘ ü d’?]6›ĄÜř‹áĹĄ–’#šňÚőžHŚX)“î+;Ŕ­˙˙Ź ‡U+!x$,Ŕ„b¤ ‘Ç\~tŢ­h(·+=u%›ÂšMݵúč:ĂÝßXĆŇÉ”*ýâ§˙×Yţđěí¶©5Ő鳎Ę5”ľÍĂo9$uŕ‚»KĄń6ťm¨Ďz4}>Î8™EŔ…30=vó“ď\Ď‚?äWńýz'ójWZśą^˝uź éëáÖÖ4Iď-ˇE:ËĆBq‚=ąťkM«]řgŔZŃś[Ď|ňË<ˇłmlČ>Łň® .®#¶’Ú9ĺ[yH/ą ät$t5ŢŤ"ăĹ^ĐŁŃĽą®´÷–9á2*˛=°çíI;ß”©«[ťÝ_ô(üH w6…¨”T¸ż±ŽIŠŚo_×ô«÷~ĐěőĹŇnµŮRň}˘gôÜzrsÇÓÖ¨|Dh şĐôÄ™%›OłŽŠ€ýÇéú×Wâ? _j?ˇÔ­ŚMeĽîdŰ) ŚçZ«]˝ ůąb•íżüÎŕŇl¬őűÍ?Ä’ZGnY<ŘŁ/ąăĐŚší<aá׿ŻuIí®ś~\inX0çi'¶k‰ńĄÜ7ľ+Ő.-śźđţUO{˙Oř*‚€ (˘€ (˘€ (§Ľ{bŤóťůăÓĘ(˘€îň6険eŽi´Q@*»(`¬@aÔRQ@Q@9¤vUVv*żtŔúSh V*Á”ĂAäRI$’IęMPEP†`ĄA;O$gIEQEVö§â&˝đÖ‹¤­ąé¦R&dľöĎLqŹ©¬)8§k€uëESĄ,H’@č éIEQE(fPÁX€Ý@=i(˘€;*í<‘ž %PEPł$±$ž¤Đ¬TĺI¦A¤˘€ (˘€ (˘€ (˘€ (˘€5<=Żę^˝űV‘töň‘†®=<Ąu%íőĹÜÁDłČҾі98śÔP@ŕäQE:Gi´ŚĚÇ©c“]†uťM¶•5¦­+>ä‘®š-wú×;Et4ń4ľ'Ô ŰGimm ÁooČŤl÷˙őT^#ńN­â…5;˘Đ@ŠQ8Çu>ç&±( ”± I€ éIEQE*ł)Ę’¨4”Q@Q@ Y’@č éIEX’I$÷4ŞĚ§*H> ŇQ@Q@Q@+1f%‰$÷&’Š(˘ŠÔđöż©xz÷íZEÓŰĘF ¸ô đjď‡j稥$¤¬Ŕ’iZWbI X°\đ3QŃE0 Ub§*H> ŇQ@Q@)ve X•^€ž””PEPEP‡`ĄC§¨IE¬ěÁC1!xž”€AwQ@ îÎĹť‹1îNM ĹNTzdJ(Ą ÁJ†;OQž %R–$I tö¤˘€ÁČëJĚY‰bI=I¤˘€ (˘€ (˘€ł± tô¤˘Š)U™UŠźPqIE*®­čsZţ+×_Öî5 ¶ó•TĆw@\ ôô¬z)ß ¬Żp˘Š)  äJěÎŮv,}IÍ%gLżşŇďá˝°™ ş…·$‹ÔĐńG‰5]CqŞLѦŔŃĆ#9ÉÇSXÔPEPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQETóÇ­żü ůÔ<ßńëo˙ţtQ@Q@Q@śMK-´ńJ±K ©+cČA9éN°˙ŹëúčżÎ˝ëâMśwţ&еuýö›ŞŰŮ\ăű®c‘ÓćÇÔÓŔ$Ťâ‘’Tduŕ« řSk·ń~ś5oŠÚ•‹]Ahł]0iç`¨€ ’Iú~&Ż?‚t FĎR_ ëňŢę:|M4‘IÔ•W®Ăýyíëš@yŐŰř?Âz^«á×Őµ}FâŇ5ľ[=±Fvĺ\}9oČUŻřĂJŃu‰ěµInŻt™ăŽę6‹jíáp}yühϨ®ßE𞔞¶ÖüS«Kamy#Gm™öś>#˙ŻÍdřŰĂGĂZŚÇr·–WP­ĹµÂ®Ýč}Gcţ"€9ę+§ÓtMçÁ·ÚťÎ·¬.DVGqÇn§9<Ž+ śň"ł3€3M®“Ŕwöúv§y%Ô«=ś±©něqúR“˛ą2vW9ÖGUVe`­Đ‘ÁúSk¤ńü^đĺĽ2«Mn“ PuL°ĆWôďĹ{«Z[ ÇX.4ô˝!vţf§ť%v.t•ŮĆRş4lUŐ•‡b0k^ëIz6ť}$Ťç]M"yDp ĎÖ»ŹčšVŁăbĽŐZŢúč †$„°S´¸ú’:Ť˘LN˘Lňú+M4w m*ââ wIZ'šFÚ‹Śääý+uĽ3¤Ţ[_ W{«Ë8ÚWŤáÚ˛*ő*ýtÜŇšGEu˙í´Éu‹I.®äKĺź@"Ü®1Ý»wüŞż‹-4H®/¤˛Ôf–÷í Ş>c‘»Ú—?˝Ęţ÷)ĚQ]>— i˙Ř1jşÝü¶ĐO!І-ĺ±ÔźN‡ň¬ÝsNł˛ľ…4ýB;ëi”2şŚ2çłĆš’nĂRMŘʢş _@ŽÇĆ ˘¬ěń´±Gć•ÁůöóŹlÔ¶^ŽçĆŻˇ‡XŐÝ<ĐŁ?*“ÓđŁťZâçVąÍQ]đ®›sk™«›ťJÉI"0•F Ô)=yă5ÇSŚ”¶dĄ°QEuw‡tń CŞkz“٥˲@‘Ä\ś}¸?äĐ䣸JJ;ś˝Đx§Ăńč—|q]}ˇnˇYw…ŔäööŁWĐ#±ń‚h«;¦°,ô+‹Ź®ŠĚ±ÜyĆ&n c9#×€O˝ i‰M3&Šë/t-Rň+Mq…í°o–â-‰!^Ş­rtÔ“Řq’–ÁJQ‚+`­Đ‘Á¤ŻAšĎNąđ7†äŐŻšŇĚŔlŚ»9/ŰĐ iJ\¶ K–ÇźQ[^*щ} Ep.mn"Yá” nSę+b×Ă:#Moc>Ľ§Rś ˘üČ•ŹE,'ňŁťZâçVąĆŃ[ú7‡Zóſؗr™^DgAžTÇף˙¶›si~šf¬nuÚIb0•F ×iý3Cš@ć‘ÇÓ¶>Íű[fq»f·|/ˇCŞÇ{wwöM>ÍCK ]ĚIÎ…nęV––ż'ţÎĽ7vŇj ęě…~@ ‘ëĹ'4ťÍ'c6Ó…Üa”(ÎĂŚTUßx[\Ôµ-Ä××M4é’R mŔÇaé\śM8¶ŰL#&ŰL(®×ţ2Ţî 2˙Xhµ‰‚â5€´hÍŃIő5‡§x~ćďÄĂE,±Î%hÝú… śź~)Ĺ‚śYîHEf dŕg›^•á­3I´ąÖ[IŐí˘°š)Qâ*{|Ę{ŚŚWšŃó6ź3aEč~ łŃ‡«7Űĺg{!ö`˙SÇ%}phśąUÂrĺW<ňŠÓÖ­´Če…t{ŮoŢ^"„Ŕz×K˙~™Üeţ´bÖ&Q–Ȭz)49Ą¸9ĄąĂŃZöúmĄ¶µuc®Ý=˘Áą Ĺ™– cĐŚś×a㛯`k­JkyĹšlŤ-Ëŕ“Ű4śŇišM#Î(­i–šÜI¨jXÚŔ»·.ţĘ˝Ďw\Đ,ŕŃŁŐ´k滲2ů.$ŹcŁc?çđ§Ě“°ů’v0 ´áwe s°ăwŢ×5-KGńµőÓM:d…¨p1ŘzWD[m¦(ɶÓ$ĘJ’Ă+…<ŹjŽ˝#I׬!Ő<1$—Q*[ií¤ź¸ŰxňććÉ˝ĐFM(Ş,(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ žořő·˙:‚§›ţ=m˙ŕ_΀ ˘Š(˘Š(˘Š({řţ·˙®‹üëŢ!ľüe×´[˛<‹ä·–0{MhęCů đ (Öl­4ËďŽZ¤:ÂC$FI QÍ÷\  ú÷ăÚşżGâ8›Y!Ó´Ť:°Ě"ŽŮ#YńČÚIŘŻ¨ŻžéÎď#n‘™›¦XćŤáŹů%˛Řzý+wĹňřŁ˙__úŻ˘Ů Ýęڟý |)o§_^Y!ş¶ąDfL·ĘĂqçńö®/â¬ú‰Ô¬,ő{» î­ ĂEeŐ<ě=‰ăµq1»ĆŰŁfVőSM ›Mđuĺ˙ď|EÍŞŰZąV‰śď8Ć{`uŻĺžf”3* Úy#<J(˘Š+Ňí/–×Ŕş^¦[#ÇhO˛Ożů-yĄ3Ź5ś9¬v˙Ń-5]?O(ňŚv2JÍü±Rř«ţJ˝żý|Űě•ÁŃRˇk S˛Üď­měnľ)_E©,o–B‰/Ýwě ohńë1j bËN˛ŹěrŇEv86’vŹjň:VbÇ,I>ôť;ő%ŇżScÁ“Ĺmâť2YÝR%eŕ ńÍ^ń†ő; «ÝBâRÜ1IVE;·GĎé\Ĺn.÷FŽ/ščď|'@GŃZËQµy’Ćm§Ę9ęCׯ˝PřmieŞX ‚ŢíˇW»‚”I3Đzú«’Ve9RAő’’‡˝rT-+žĄ©hW·Śěőű9!}%š+†źĚP g9ůk+Ă7Q^üWk‹vÝ “NQ˝FĆÁ®q FNQZ~Őż°ő¨5'Ďň/vÜĺHëëSěÚMyXźfÔZň±ŮxD¸Đ%Őő[÷…l>Ë*C(8¶6ŕßç4é»1瓌ôÍjčŢ"Ô4{w†ĹâXÝ·ń+śăHöŞQk]ŮJ-]îĚŠďJ¸ń'‚4EŇĽąg±icž2áJîl‚r}üëRńV©©YIiu$&1¸,§‚ä ő„ Á#<oČm9y§Ä8…ˇđôAÖA „kąO ŽăÚ·µ- ăVńťžżg$/¤łEpÓůŠ Śç?-pzî±ý«™‘ĺ}ŠŮmłżvüwč1ô¬­Ä)8=EJ˛!Aٶ‹«Ú/ÄéošU[I§•VRp0Aý ÇçZ×+â=>ŰPžěi66‰(śB€ĚE]Ľäű×™R–$I t”Ý;±şwgYŕ˙ůüU˙^ÉüÍrés:[Én“J°HAxìGLކ˘˘­FͲÔlŰ;φŢÔ×[Óuv·Ůřůľbô(ËÓ9ëíXö…©hwIs¨Űă’RS÷ŠŰ°sŘśV<Żš÷‹ć˝Ď_Ő?¶oőt˝Ń#ŇĺÓ& "ÝÉdÇ€3¸ź›#ŔÂ÷7ţ4/ĄWo9+x>XË„{cń®|1€NQIJ4ůIŤ>SŐĺłżą˛Ôżá2Óôô·Š1ß&Ő‘śtÁśýôŻ(Ą,ÄX:zV¶Ťâ-CG·xl^%ŤŰyąÎ1ÔŹjq‹ŽĂŚ\V†Euž"˙‘Âßöń˙ˇŐ KĹZ¦Ąe%ĄÔdĆŕ°"ž#3ÔV;7fÇfěŮŮx¸DŃxIn¬&Â!—Śţ•Ö=¦ˇkâUÓtý& IKť‘’ËĆ~brXśř}kČiK$ŕtťŐ®K§ukž‡ŁÉaźţ»M˙ 5eü?˙¶ł˙`ů˙š×E?f?gˇŮx.íOkú<‚öqŁ0ö¶HüęÖŁĄ\h˙ ć·ĽŘ. ®ń«Ů”GŔĎă\$AÁO48;Ţŕŕď{ťoĂÍ“K¬Xů“ŢXI ;Î1íYZ¶©ř~Kiu;a»ü‘[v0OBkŠ®W{Ź•ŢçŻęźŰ7úş^č‘éré“‘näŽ2cŔÜOÍ‘ŠĺŤŞËckky­ĆWÉŠŕ;ëú~:^$ËđţeŐ#´†č^®b·UŢ7ă?ÓćęJTGqE'Nî÷%ÓĽŻs­řy˛iu‹1{Ë !‡yŔf=«\đö§ˇ¬M©ŰVRB"¶qס>µ•EW+Nĺň´îQO…•&ŤäA"+ČN7 ôŞ(čü]á7đÍ–“%ÍâIs}śmŐ1 §<ňHü s5·ă\xŁ\“QąŤaĘ,iśÔńÉük€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( žňnŠ4Ć6gź\Ó(Q’ďĹWGâk¶†çPŠ'´•¶¬đH7zdtéY:.™>±Ş[éöf?´NJ§ŰA8'ü(•wYŇŻ´[çłŐ-¤¶ąQ’ŹÜz‚8#ÜU*(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ (˘€='I´şŐľ Kc¤E%ĺÜzŻ™,ŤÎ‰ł‚®3ŹÖĽöňÖćÂéíď!–Ţć27G"•e=yĄz™wwĄü–ëJžk+‡ŐvË4LQÝvt 9ĆqÓĐםÜÜ\ß]4×SMss!žF.ěz “É @Öç:˙Â+ JńĽÝCM˝6^s}挮@'żUü«ÎkŃőëgđ÷Â=;MĽSţĄ|o -÷–0¸Éş'őçQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE‚ĄPCâë$‚5)Łű4'rCa7Lŕwć˛ôMNăFŐ-ő -‚ćY ®ŕÎ?ĄE]Öukíjýď5K™.nX`»ö€öJŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˙Ů endstream endobj 123 0 obj << /Subtype /Image /Interpolate true /Width 340 /Height 46 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 125 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ.T"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞT÷żńô˙‡ň¨*{ßřúĂůPQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPEřSĚ™8ÜŔgë@ ˘şŹxR]ÄWš}ąĽ‚Ůšo(ńąAçµËĐEXžĆîŢ–âÖx˘şďP~„Ôq[Í*;Ĺމ€ĚŞHéšŽŠšęÖâŃÂ]A,,F@‘ ’=y˘ŢŇćĺdk{yĄXĆ\Ć…‚Ź|t h®żVđÎť¤Ëá§ľżš;MNŃ.§G¸Ă¸gµ?Š|-ŁXřNß\е[‹če»ű/ďaňđv±'ž„~tÄŃEO=ťŐĽi%Ĺ´ŃF˙uť †úÖ€ ˘¤‚ n%X­âyenŠXźŔWDžŔ×zäŇKÍ˝đ´6ěÚ§'<Ís4QEWwoáOŁĎ©®»uöXRVű)áŽ01Ôő®2â7ÓE`Ďqv6ÂÔ;qÍLfĄ°ÜZ+ŃRµĽÉ•á‘bc€ĺHR~´ČѤp‘«;ž¨É5BEI<ŰľÉâxź®×R§ő®—Ŕ‡^żą›RÁ¤iń}˘ňA×hÎ{śČĐ-Elx¦˙MÔ5%}N}Śq’2ű™đOÎÇÔçߥu7:VŹâŻ ^ęşźöv«¦ {Ë@壖ÉlżęHčTă ĎŻ\ăľę3ińŤő¦Ńq€ĆĚ íbXÁă śţVĂÇš.Ž×żŘ~KawĂ#µă3ŤŢ„…ťřô®oEńög…őÍěľoöź—űď3o—°çîăśýEuúľ«uâo„_k../¬µ! s•Š•ýŻĐT·úí˙„ľřQt ~Ë-ůšyćTRX« ˝ů-qvţ#ň|uáď˛çĎ»_hó>îFݸ˙g®k_Fń­”~Eń‡«Ł™-XÎb(IÎ#$ţPŹĆK¦ľ‡Â—n‹Ϧ$¬Š0¶çUŻżäi˙öoýő‘ăż˙ÂW.śćĹ,ţÉ“µ$Ü­ĎP00=ą©ü5ă };ĂňčšÎŤ­§4ßhDiŚMă0ü“@ü±·żńő‚]"ÉAćĂ ˛©Ć~‡đ®˙űfŢęŰ[·ń'‹tťJĆî Vʸ0Éü%NŢßĎĽľE¦ř¶ kĂújiŃĂŤ¶¦f•~î8<‚~•ł}ă][_ľŹá{{-Jů Kq$Ć`™ęQHŔ'ŰsáŐŰčžńfąb j0ů0Ĺ)PLa›Śýsř ą©ë—ş˙Á‹›ťMÄ·1ęk—h@Näg…ržń`đęßÚŢX&ˇ¦_ K‹v}™ĆpAçÔŐÝ{ĆÖ—Ţéşiöbq4en ÷˛2I=ó@MÓxÄĐx_TžîçL‹PYa1v©$‚AôÁâąŰ©D×2ʱ¬jîX"ô\śŕ{ @uÚGü’ý{ţľáţkQ|)˙‘ćĂýŮ?ô[U¸ń$ÔnbÔ 7MüFŢî!×ičĂÜdţf´‚˛ÚÄČĺ«Đ~>%-˙ăGźĚĎLĺqźĂurţ+±Ňě5@š˘u #$Ś›Y2OČĂÔcĐu®ŞóVŃ<-áKÝ#Ă×M¨ęš’»ĽŮµ#Lr‹ëÔŹÄóĐUóĘ(˘Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEPóÇ­żü ůÔQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@˙Ů endstream endobj 124 0 obj 13275 endobj 125 0 obj 2517 endobj 119 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image11 122 0 R /Image12 123 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 126 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 127 0 R /Resources 128 0 R /Annots 130 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 127 0 obj << /Filter /FlateDecode /Length 129 0 R >> stream xś˝•˝n1Ç×[ 1ď€R „l6¬í’ R$¤•RpDh“p" ©x^—¸ Ĥ¤JqO@3öííćîřP”pÖží˙zfRë;iKTjz›pQu‹‡e %áĘĆ`j]äźóŻ «ÎŮxUzTjnâ×Cøyř”‚ŕlĹ:%zSĄśżĹôęŹS6NĂG„hśmew ÖO"Ňî.ÚTĚenCŤÚ Ő˛ë ·1F‰ói덄ú˙p÷ ËJeçMÁ˙ĺ¨˙éęáEó 5ľ”ß> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ„"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQETóÇ­żü ůÔ<ßńëo˙ţtŞĄ*‚Ič>X%‡tOznR3@ŃEQEQEQEQEQEQSGkq*Ž ]OB¨H4ɡ–ŃĽdôܤfť®†QE†QEQER˘4Žł€ “RKm<*XdŤIĆYHě+‘QE†QETŃÚÜJă‚WSĐŞ 6he„4OznR3NĚWDtQE!…·Ąř_UÔ´‹˝V }şuŞ3Ľň0U;FH_Sô¬J(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ĄŤG ł1ŕ&ť<2Ŕű'Ťă~»]H?­2Š( Š( Š( Š( Š( Š»˘é“륾źfcűDäŞyŤ´‚qźÂŤgJľŃožĎT¶’ÚĺFJ?qęŕŹq@¨˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(§EĘá"Fw=FI¦ôë@Q@Q@Q@S’7pŰ›hÜŘŔő4Ú(˘€ (§IÄĺ$FFC mQ@,V·¦č •×ŐP‘Q˛•b¬`pAę((˘Š(˘Š(®ŹFđf±«hłęĐG v>l҄߷¨QÔô®r€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žořő·˙:‚§›ţ=m˙ŕ_΀=áÖŚ–Ţjqjšaş6,Ń~÷-jÄgsŚpĆąď˝ôóŘ.Ł®ŮjŮ,Úş·•’ąÎëÇĺSxţ<î˙R¸Ś·,RU‘NC1#Śçô¬“ćĂéŮůöÜŃ«VÖ[Żé6Ţ _‡şü#^o™ľ7Ë xó{ń®;Ĺ7Ôš…Ľ^(iĽÔ\…ePÁ çăµuVúN±Şü<ĐCŽIĚ›&đ\ă©®G^Đő« Űhuh¤k›Ź– e3sŚ ÜŐâ9ů#díeé˛"Ź/;Ő^ď×siĽ óëé÷&m&î/<^ŔD{wˇ×ëX–z4z݉פNd…ä*“ȸʒŘCŹÂ˝ĘKĘŢ\¸¸˝‰ĽůŐţX%|mAíţ>ćą©đ×Ä­µb°”/ ;(Ęť§>‡ŹÎśčÓRжŤëĺĺý~ łjNű-<üśºUݵúčZ»Ý^ŘĆŇI•*ő*ýu[Ă~ÓďôVÔu+é­Ł[µµÄqîÎ@Çę!]eČń.źo¨Ďz4‹ 8ăeĚŔôUŰÎO˝súü“ç˙°Ä_ú Ó•()ëŹMż[‰T“Ž’ęż­őďÚiú^§5®ˇ%ĹÖ›*%Âö®×8\^F-<1Ą'‡tÝ_VŐeµ†čş”H·±!c¶$šÜńüyüA˙®öżúŞóčWzçĂ˙ ǧ’ć31ň™Â–Rç$gÓŹÎś¨Ç™ňĆúmŻó[ň«.UÍ+kżĘç;â 2o ëwm监‹‹[€ cţy­ťSĽŐľÚ\ę3™çţŇŰĽ€8¶:U_‰!-±4Ď5$¸±˛XćÚr˝?OĺV´}:oü;];K1É}o~fxYÂ’ĄČĎ×ô5 59҆ÖŰĎB›N©.űśv‘d5J F¸†Ůdlf`Ş$“ô®Ąü+ŁŢÚߍY{«Ű(ÚWŤâÚ˛*ő*ýtßhqŮxÚ=;ÄpD˛,e’)23‘•é]–‰·Őµc¦ŘĹö9Di"»:m$íţÔđŘu(űńę×]?Č+ÖiűŻţůž{áA®[j“]^HěŁY ěÜ6ó’G^íV5ŹiëáćÖ4-Eď-áE:ËĆRq‚=ąťMŕŻů<[˙^©üÚąDş¸ŽÚKtžU·‚ń!\ބކ°|‘§ÇVžż7cUĎ)»=šüŹH¶ź_Ŕ˙„l\&7ÉŚ?aĆr˝qŢ&ą×nŻ-˘ńśLŁ÷bhÂ¤ŕ‘€=?JÝŐoîě~x`Ů]On]®d)źśőĹrŢ]^ÝĂ%ĺĚפ(i\ą=2kLEM.öŹ¦ČŠ0ŐĘËwëąÜ]x'D´ÖĆ“s®J·łcČA@Čăqé’sÇÓÖ¸}JÂ]?T¸±›Xe1:3]·‹żä®[×ÍŻţÉ\ŚőVEÁ"–&J\ŞÖ•‡BRms;Ý\éľ3\µ–­gáŰ2bÓ4ëd đ ‘’ÇÔôý}kÁ‹^ŹQ˝ÔŻľÁ¤éčâ`››śŕ(üéÇ5»ń–ÎKÝJËÄ–eÓ5hŘL ®6źCŚ~ľ”ź ŕ]oÂ'đäGŁv!šÝ‚ů›$Č~uĆuž'đ¦™oáä×|7޵ţźçy¬±ě’6ţ٧nă­uż´˙  ëĚş­ĂÉ.ś>ÜÜ˙ŁpwăćÁĎOJä|Gŕ‡đ×†ŁĽÖ®– Zi¶EbĄ\ěÇ,H?_Ň´~ ˝µńF•‘­íöžc·Gm»Űž3řŠćĽEiáëK»A˘jwWöÍţ˝ž-“‘÷s׌×Nß žă_Ó#ŇîÍƇ}ÚEůP<´ß»°##óö5ËkľÖt;űK-FÓeŐÖ<ŃŐËäŕ”žőë:tşf§Ű|>żĽ]j?ÚnO–Ţi1µ±ôď‘ýă@/­CgoŞÝCĄĎ%ĹśnV9\\ř‰Î=Ş•_×t«­WąÓŻ“eÄ´ú0ěG±5B7<3ąˇy¨^‹.ÁĎ6ÍíÎpüéëVĎÄwÚo‰/¤łŽŘşy°ÄdÜá€z“]oŤ˙ä·Z×ÝźţÉ\ŻÄůµŻúůj)9;&÷Wşř“§xaő+fżŐî-nEŚ~\qŰĽíbGBk†đ†âÖăÔ/5 ŃcĄŘ {‰¶ns…QÜśě<á­KĆĂZŃcŠëO]:0ň,Č •A#ÖŞü(»‘ôOivÔ곥¶Šä+$»Iܸ¨Ë˝˘¶ „ZB>ť>ŁűŐ\ňäşwwÓĚSÄúť ëv:dşË öůX ĆB÷$ źĘ»‹Ý7§áÖťšĹĘéÂőĚwBÔďwĂeJőÇ^}«‹ř‹ˇť/ZűeĽ­s¦ęYş¶¸'vđÜO¨Ďę+ Ňô‹Żü-ł°ŃDSŢÚ_Ľ’ÂdT`¤HőOXĆN@yţ­ś:Śńé·sf­űą]6î;UJł©ŘÜi—óŮ^§—s‘wőWAâŻĎáíHÔĄ˝·ť5 >©• ׸ç­t­€żŕYΕáŹkĘżn·X˘†FP|˝í‚F~Łň¬ícĹrk~K=Z3q¨Ĺ6ř®đŞBc• óĹhx%Ő<;â)cK륊HŰfĆÉôüę–ąáQ řy'Ő¦ňµifۢş¶#Ç,qţzVşňé±ĎîóľmďúŇ|3§.o«x‡S{(.śĄşGvl}ç5CĹ>:Ąo \-ÍĄÔk4¨Ćä>޵ҝ"ăĹ~ĐSF1Íu§™bž V]Ě<öŔťRř‚ŃAs é‰2M>źhĚPäă#ôýhiX#6ĺk÷Đżuŕ}Ó\Mλ*^ĎŹ!‘ĆăÓ$珧­r¶úUŤ®˝y§ë÷’ZGnY<ŘŁ/ąÁqčFMu/˙’żm˙_6żű%s^=˙‘ËW˙݆˘I-SrvMîŽËÇö{ř÷TžÚŕYÇĺĆ–ĺv’{f¸ď hęé}u{v,ôë$<» z=x®§ĆŢÔ5óe«éÇsb¶†u•FŇ ’&«ü4şwŇ5Í:ČŰJQ¶ńÜV]¤ä`ńźńĎj¦Ż-Q1“Ť=ż‘‹ŻřzÎßE‹XŃ/Ú÷Oi|‡G±ă|g×˙ŐI†´<7ĄŁK%ŐŔ”Asm´nŤ‰Â‘ę ţ~ƶübúĺ·†– léÖž|Ŕ‹(#Q!Çń’Ľc˙­Sř:xü˘.·¨ďiµXŕ¶VĆbʧO¨őĄĘ®W<ąnťÝţóšń‰a˘ëz|—Ď#€źmuLIĆBú2*ě/4˙ źŘ$š­ÂŘ‹¶)p-Žöl©ťk’ńŢŽtí[íPJn4űüÜ[ÎNwÉúŚţ˘¶ôÝ.çÄ_-,´‘ז׬ňDd ÁH8<źqBÝ« ZĆ2ąÄęIm üɧÎóŰ+~îV]Ą‡®;Wy­Îu˙„V•ăyş†›zlĽćűÍ\€O~«ůW}cqc-ťĚ{nb}Ś€†ĂzqÖ»ízŮü=đŹNÓoĹ©_Ă }ĺŚ.2Gn‰Ç˝ft-Ź8˘Š) îěĽ!ŁGá}+\Öµ™m Ľ.¦4{ @ ŽŘ’}˝kĆţż¶[{ˇwcw¸·źnÝĘ}GŻř×cqáŰß|3đ¤ZXŽK¨Śíä´Š…”ČAa’:qůÖGĹa§ü#úGś’ÜéÖ űBż~ꍮZsnvżW ď<áí;V¶Óµ/ÍŐÚ!ß8-Ŕ,z śŚ~9®b/ŢÉăvđĐ‘>в”2ăĺvě»Î? ×řĆĚž1…ŃŠ˛ÚBAŻđĎZüAł˝Ö.ÝŚÁŁ{‰ä,rP…ÜÇđâçěůď}ąqŕ­ň×R_kŻ{¨iń´˛Ă$Şýí§˙×úć¨řSÂúfĄ >««j3ÚD·«i¶8çr‚>śźČWQᯠÝř&]sU×$‚+%ł–ĚRgfĆÜsÎ:{Ö7‡żäÉ˙aČô©çm;JëM@‡Äž ˛Ó4}Z{=NK›Í*dŽę6‹jís…ÁĎ^F­Łř[KO[k>%Őd±·»vKhá„Čď´ŕ±ô˙<×Wâřńř›˙_ú©t;ťSSř˘§…íôűŰ»#$WV÷ ˛e˛¬7‘ŹçíKÚO—W×ô¸Ž Äž‹A×,`ž÷ÎŇŻ9㻍L,ymľ dăéë]Őî›áSđëNŽMbĺtázć;ˇjw»á˛ĄzăŻ>ŐÉ|N›P:••¦­uc5Í´ěÓjÁžvŮŐłĄé^'ř[ga˘§˝´ży%„ȨÁH8<‘ę)É·ĘLe_†YĂńNÖ=6áîlÔKĺĘé°°ň›¨íK/4ŤB×V6¶÷Z¶žŹ4Đ Ł…űÁ ëĆ{ńëLř[cq¦|Qµ˛˝O.ć9$]ŔŕůmÜqGÂĎů|A˙`Ëźý h›jNQ{%ú‰ŕ˙ ŭǨ^j˘ÇK°@÷l.Üç Łą85cÄž±¶Đa×4 EďôÖ›ěň "Ů$OŚ€}GřŹZŢřQw#čž Ňě ©ŐfKmČVIv“ąpxĎřçµ9“ÄžX5óĄŮ}¦pVÂŢ%6ßă%xÇ˙Z©Î^ŇוÖôôď čZŞNîú—te@ ±€ŕ÷ëGŠtô[-xçyNˇf·L°žÂşŐŃ®ĽađëĂđč~T÷šl’Ç<EVPíÜ‘Ćüý«7â«Á ·¤Ç:M.›aĽě‡ 8ę?OÖś*7%őwýłqŕĎéRÚXkŢ š×Tž%‘‚ÁŁÝÓ-éď‘řW ©Ű-žˇqmÄW)•Y˘9Yb>µíZUŹŠZM>Ňţ #ÄZ*{(C˛#×r±Ż#ńt66ţ&ÔˇŇYZĹ&aÓ‘Ź@{Ść•ą6›¸Ů|=˙ŹŘ*_ĺUĽUŕŮü=ˇé”·¶ó¦ ‚GŐ2ˇş÷ő«˙ mĄĽŹÄvÖëľi´Ů#EČcŔ>őŮ Ěęü áë¦Ń´]ô”ż×5‘l%r‘ŰŔľdÄðü)šź‚uý2ĆkËŰ%ŽŢ!—o9qĐ÷®żL±şO ixSMÓŻ%‘[í˛Î¨ÎŹÇqŕuý?»ę‰ťEouśo‰´ ę–‰ Čş´ąEž ‚ărÜz×săGÔük,WÚĂŰ_ÝÖRŔ|  ÍÓ$ÇřÖ?Ĺ ˙iđçšĐ´źd]ĆlÎyŰŽŢ•żâ/ _jˇÔ­ĚFĘ)!’w2(1l H#9ä®]ŇFNwQ“vŃžuiá»»źť2-Ŕ•Łg?tÉ-ů ÖĚŢŇníŻ×AÖîúĆ6–H¤„ ‘Wď?ţş»¤k6Ińn{Ö™¤łI”ź—•*} ÇçZ÷Kâm:ŰQžôhú}śq2‹ f`z*íç'Ţ’Š±Rś®µ¶ć>kúĄ¶µ¦iݲŘÉpEµpryç¬/˙ČÓ¬×äßú§ř>â+OésÜ8H’á 1čŁ=MnxÓÂZĽú¶¬`Ťôćťç,Ş~V|Ž3žăµN®%ű±©ÚäG‡4ßřG˘Ö5íF[X.%1BĹ˝›É>ťĺY>$Ó¬´ë¸Ć™¨Ĺk,bEue˙e‡c]ˇńxr947±Ôí$‰,& |Łž§qzđ{ÖgÄŰ;+MJČ[Áoky%¸{»{s”ŽOAŽť˙Jm{·&3|ölăjÎť§Ţjw?gÓ­fşźĽ¸P»`u8Z¬X_]éóůöSÚÍ‚ľdlŮÖgAßxŢ ôď†>Óµ$k{ô–w6ďĂ.Ř$vę?:óšôoÍ>ˇđżÂwú˝ÍóË:‰ć*€»ô}+Îh˘Š(¤đĄˇ–ÇSž;(Ż.#ňÖ(ĺMĂ$śţ•KÄp$Ž˝2ÚÁ×,<Ęî\śŠ4[ ‹ű[¤˛ş+:ŕý›vß4zç8â®ë‰-§‡l¬őůfgT-ąŁŹÔóO Śm6ĆMBi#‰‘JFŇ’ŢŠ3EĄ„—6w—(ČŮU§'VŹ™?µÚ)SφH•›¦â8­ }&çKđţ¶/B$Ž‘pÇúśtX Ë]i­ –K«Kv¸˙SÎC?éQYč—›“,°[EnŰ$’gŔ č1Ö·ô«kË« ®,­5+0% µŕĺKpF*;-.Đ&˘úu´zťÄ7>ZG#đ±ăď`»ž)ŘSҧ°–fŽdśnŠHNĺqíZ)á{–™-ţ×d/3oć|ꯇ8­-zSi˙Ü×QA…Ůž8ȸu$OOçšuľ‘1ńZj+qYIqć¤ÂPwdä(sÎ(°ý®‹<ó]+K0Ú±Ig•¶ 9ĆsśS5"{6·ĂĹqÇK nW9Ć>µŇŮÉçŰjÖvöÖ×Wk~óy˙ôČär?­Q× ÜVÚ}­ÄVËć,qş3Ósrp;ţ¬+źĎsbęÎKW|°$™uűsŠÄ®ęîĆK¨ď\˛¶Ś$E—P…öďaĐă?6~•ÂĐĆQ@ëÍ ;ʇ^Ňő/$ÔšXŘ*Įя˝ÁĎ˙Şą]rÚ =bňŢŇO2¤*Ťśä}k±°źŔö‘EĚŇc #‡ţ°ĽR<:ŃÇ&€Ó¬»°ń0m»qÔĎZbęVđ•´wzż“,K(1>†FvńEĆ4vÓK ŐĄË@34pÉ–AÜôä ›ŔřţÝ\¶ÁĺIóz|˝jŢ“¦\č¦úóQ ¸·xĐďLXpGzČmŕ^ŘŰ+FćńHŘŚ7ݻӆ‡qýĄwdĎ˝Ş4’9'nĐ3žžâ·t[χ>ÜěƲÇŻďÚ2hÔ®#ţĐV˙IľŠ;Vőʸţ v"?JmmîgĽł·†t Ť+‘“éÓüć§Ň´¦¶ŐîíuŁr–˛HżÄ§ŽUÍOI»Ô´Ť¬”LÉnFą<ßáV‘‘udµYI-t¦†FS‘¸‘źlŃ`9ë=Yí"¸¸şµ´Ž\Ľ÷Áp1ÓŢ­hšo L˘läǸ Á#iťO§\ëvZ\úb‰’+d·‘ceÎr ďVăą—g%¦´R-.ŇÚÉC„ś¶é$8ÚIďÔńÓ5皢Š) (˘Š(˘Š(˘Š(˘Š*yżăÖßţüę žořő·˙:‚Š(  ÁJ‚vžŁwîlôÇúšĆ˘Ş2qM.¤¸§fúQRPRł3±$ú“IEQEQEQEmé~(Ő´Í"óK¶ą'OşFI ‘C(Ü0JúĄbAE®í#–‘™ő,rM%PEPEPGZWfv,ěYŹRNM%ŞĹNT}A¤˘Š(˘Š(˘ŠWfv,ěYŹrri(˘€ (˘€ RÄ€ $'Ą%E+1f,Ä’z’i( V*r¤íIEQEQE¬ĚěKÄ÷'4”Q@Q@tMNăFŐ-ő -‚ćY ®ŕÎ?5ťZűZż{ÍRćK›–.ý‡ €=…R˘€ (˘€7µ?5]%mĚGM2‘0“%÷¶zcŚ}M`őëE”Tv˘Š)€Ą‰H=)(˘€ TvFÜŚTúŠJ(˘Š(˘Š(ĄvgbÎĹ÷'&’ŠTvC”b§¦AĹ%P„Ž vz¨<mP–$I p=)(˘€ PĚPZJ(Ą @ ŕŕő¤˘€ RĚTÄĐŇ’Š(˘ŠTvC”b§ÔRQEQEtz7Śőť'F›J·ž7Óĺ <™ŁvrTőkś˘Š(˘Š(<žh˘€ ĎZ(  @ ę) äµP©ÚŔŕŕô5ĐC­i°Ü-ä:BĄâň¸”Ő˝Băô®zŠ`>Y^YžW9vbÄűša$ś““E€RÄ€ 8%PEPEPA$€ 8(˘€ (˘€/ę:‰»‚Ę5C¶‡ĘÎěî篵P˘Š#8$g­Q@Z(˘€Ip:QEQEQEQEQEQETóÇ­żü ůÔ<ßńëo˙ţtQ@Q@Q@X°±şÔ.6ňÜLA;#RÇ˝W®ăáő•ŤĹݨ´Ö™Ż—9?xńĐf˘¤ą#réĂžV8†VF*ŕ«‚ÁťRJŰbGvôQšťˇ3j¦'Ug›cM)ŔlcéÜרé:lş'vézţ‘mq5çĎ{ć.߸ŽĽgZU*r%ćU:\íöG“HŹ”‘YXu 0E6´üLÓľąt×wĐßÎJîą„‚ŹňŽ„ĐqřVeZwW3jÎÁEu>đÄ˙ö•ÖŁzlôÝ::âDMďś?ëÓŢźâ]ĂĐi ¨xw^ű_ď<·µ¸O.aţĐÇáLG'Ez Źt8ü)¤kşîµ5ś…ŐŁHw±`ĸí€I'úÖ'Ź<.ľÔ-–Úč^X^B.-§ĆŇĘ}GĺůĐ3EzE—‚|2ך]׊kWJ6‹hÄ«·E,8'ń­břwÁć˙Ç­á˝Bv…ŁyQĺŚgî) Śö8ýh‘§EÍ"Ç3»pFIü+Ń4[Ű V-^{˝cMŤĄš€Ş8_ĽžĽńź§­/ĂkŁx7Ĺšő˘§öŤ˛C 2ĺďl3őđç·6ÓÚËĺÜĂ$2c;dR§CQWe®řÚOřM4ýnsŞĂ?™ îpĺH{ţž•×|:Óü4|/Ż2ę·$şpűpksţŤÁÜWŹ›==(Çč­ďZxzŇîĐhšťŐýłŻg‡Ëdä}Üőă5Ó·Ăg¸×ôČô»łqˇßCö‘~T-7îěČüýŤyŐwZ†ÎßUş‡KžK‹8ܬr¸¸đ;ś{U*(«š5µ˝ć­im{r--Ą•RIČČŤIäŐ˙éšv“®ËiŁę)¨Ú*©YÔ‚2G##ŹQ@”WY¤ř55: łâ_Ú™Ww“sy˛DçŁ pk/ÄščsAęşfŁć©mÖůˇ1ٸŕĐ=V§‡mô«›çMrú[+Q+$Q lŚ }3ůRnĘŕeŃ^»ń'NđĂęVÍ«ÜZÜ‹ü¸ă¶,yÚÄŽ„×ŕź Űx†ÓWžîüŮGaĘŇlÜ6śî$uŕ/AÖłŤdăĚô•˘»=wÂşbřaµĎj’_ZÁ(†á&‹Ëd'#Ű‘ůő¨4B}=GÄčµ9Hí­—Í”c#sĘŽ=?ť?k\NŠčĽgáżřGµh­îEĺĄÜ+=´Ę¸.ŤÓ#×üEtÍŕMĘňŰHŐü@đk· ¸‰ -3}Ő-ßó:±I>ŕy˝[ąÓ/­líîîm'ŠÖă&]Wú»ý•oaây4ÍvčŰŰĂ+G4ń.ü`;äăó®›Çv‹„´¬u»˝GK‘äKxćŚ ŹgŻ\Žhu5Iu˘şßxZÓ]Ň5{ëíDŘŧůlĎĺďNwIŔটâ_ iöŢ]đţĄ%őMöyD±ěxßüżÄuŁÚÇ›”>Šítź éKá{}gÄz´–Ţ;Gl‘Bd'i ±öŕ˙Ź5KÇ^‡Ă2é©á»VÂs&Ü/'·µ ¬\ąP˝WQđÎŇĎŘGp‹$kľM¬2 Hýp ą>TŘŇ»±ÎKm<(Ż,2˘7ÝfBúTUŢEă Vţ-J=bÎký6ę7XŃbDŮŕ†·ô¬ č1ęé{u{v,ôë$4» z=x©Si^C·cŠéuďYŰčŃk-ű^ií/âHöҬő'ą“RÔ˘°´·MîÍËľz^犽ŻřvĘ -cDż{Ë/‘ ’=Źă<˙žâ›šNÂłµÎbŠě­<1¤ÇáÝ7WŐőYmaş.¦4‡{ŚvŔ$“Y^.ĐF pÜ ›K–x&”úŠJi»‹Jĺoh—o~ˤZ´ň–9Pz±< Ą}löWײ”i ‘˘b‡*JśN+żĽť´/ÚRŘ&}fâFą‘8gDbçÓ…ý}MqţĐçń˝kĄÚ˛ŁÎN]†B(“ů ±4WŁĎŕ}ú J ř‚K˝SOŤ¤’ˇŘ˛á¶źŻ×őÍEđ~ÓD›Ä^ßÍŞ·Aj!,’.ÎĄ»ĺ@{Ew>>Óü1 Ö«6ť¬\ÍŞ}©÷ZµąTR\î±Űš­Ć©á+][@šk»ˇ0·»´*7DĚ@R1ŐI#óö4ÇÖ߼/Şř}a“Q¶ĹĽŕ§ŤFůŕŽţƬřç@łđޡťë]ޤA®đHÜň©ď˙×Ńü5¸mcĂľ%đíëm–Ĺď-Őůň¤Lrľś•˙9¦śQEu>)Đ´]3DŇ®´˝n;ű»”xŚÄpAČçŚiËQEQ]Ć…á=#ţh5ďjłŮŰ]LĐŰÇoöbąÉ'śrŢőŤâŤNÓu;hôŤZJÎáÖDáăÉű®;Ŕ˘˝Z÷á׆ěřdč-­Ć˘óMq8Efm­ŔäP? ň×VGeu*ĘpA ŇW[âĎŘxŻYŇ®® k)6Gˇ:wň7H{gŹ ®î˙Lđ‘řk¦E.µtš`˝sе%ÝđŮR¸Čyö ˘şM3LĐŻ<`4ćÔç]*WňáĽňÂťÄ n ĎłĂç°ţݸń%Ä–z~™ň,¨ ›‡8*PGć=肢Š(H šáŠÁ’°!¶?*ŤV*Ŕ‚=«Đ&Ő®Ľ5ŕ=čÎ-çľyežPŠY¶¶äQůW;â˝j?]ÚÝ-Ż“yä¬w 1‰\üô¨Ś›{hSI4W{˙V•owoĄęá‡ZťF"X "łtRßţŞÄĐü4׾0ţ½”Âęň#ş ň ž=Ž(U"őVs´Wk˙–—ug¨&•¬5ΧaI,F¨Á~öŇ}řĎřÓ~[iRëVr]ŢJš‚Ď­Ä[–A·»vďůPę+6ş+˝Ž2Šęücg Ĺq%ާ<·˙hmÖíUqÜ7{Ri~Ó×C·ŐuýIěŕşvKxâ»6 Aš9Ő®.]lr´V牴%ĐőxÍÇÚl®#Yáž5ÁxϱčúŐ˛ŢyőŤ>=>äͤÝĹç‹Â¸ďnô#úýhö‘JáĘÎ*ŠÚ¶´Ń[ą‚çQž-5\w3@űŁ <źĘ»OXxyďíÚóTžÚŕYÇĺĆ–ĺŽv’{f‡Q&•†ŁusĚkoS𾫥h–ú¦Łoök{‡ ČŔ;eIÎŢ `wö­…št§Źt›k´Y ŢŇ27C±€?źăMbç\ń-ýÝÔ¬ŕĘË“ 8Pn*Éđľ«/‡W\‚ŰÎÓ˛ÁŢ6 bÚpw/P=ëşď…şĽÚgŚ´řUɵ˝•mgň˛+ťŁ#ęEdřĘÂ=/Ĺzµ•¸Ä0ÜşĆ=<Ę€1éQG ł1čdšJ±§_\é·±ÝŮJb¸Ź%q‘ŽţƆ5ťĘ©f·($ˇŔ¨+Ň1tĽđ3dž3Öş–'ţdľń&•§i~"7!"[B ËrŔďÜô3Šň5%H*H#E:IF-#3±îÇ&€=fçĂwŢ$ř[á(tˇ—qŰÉi )‚Ă$8üę‡Ä´ł¶Ô|#˘^\#˙gÚĹ ëFxL• >¸ţUĘjľ%kď hzB[[L28—&MížÇÔ×R{׬éŇéšźmđúţňAu¨@˙i¸I>[y¤ĆÔÇÓľG÷ŤxU]Ň®´M^çNľM—>ÓčñÄ`Ő (  š6ź&«ŞÚX@ń¤·2¬JŇ6qÉ«Ţ/đődž5ątŰąˇšDU}ńAduč}«•™ť‹1,Ç’IÉ4×iŻŕÓ`ŹSđíŐŐâ®%™/śő++Ä÷š%ÜĐ7‡ôÉ´řŐH‘dśËĽçĎJŢ€ (˘€=SÇţÔĽHl5­8®´őÓŁ"Ě€©PI=kŔň(xŰţĽăţm\%Фůyxď.c´–Ö;‰’ÚR «ŽGBWˇĹzĆ“avž Ń'đn•ĄŢÍ*·Űć¸HŢD|Žň0:ţCńň P̡‚±ş€zŐT§Ď°—ńrW†ďÂŇÎayÉţĎ ŚíÇô­x*ďĹ~.Îť<˘_,r=Ř‘qŞ*¶A9'?ĎäTˇŘ!PÄ)ę3Á¨T\RĺzŻÔ ¤Đ$Ô|M>“áç†×q„Ş z·'­z&µŕ\řĂşd6J×¶rNÓGç ÚÉ^sÁí^AETá)ZĎo/ř wŢŤˇřwăät6ęĂ=ŠŽÇţHÎŁ˙ae˙Ńk\-{=o~·Ň!·°ń_€t[5Őôű ý)ĺYň_,fÎáëŔ­Cńr(aO Ek/ťnšdkźßQĐţ#šç<9«hÚuĽ©«x}5IY÷$ŤtŃlé€iľ0ńž$ż†f¶ŽŇŢŢ‚ xÎDh: ÷˙őTFś”üµü@ą¦x6{˙_řŤ/mŇ+G*`oĽŘĆyěyŕw¦|6˝‚ĂĆ62ÝH±ÄwF]Ž,¤ ţ8®h1 T´ňFx4•Ľ—2hiŮÜő˝ĎYđ˝–§ý·v‘čA*ۦő"Wc‘´yÉëëX ®]ôŤoNł6ÇRG%Ľw“i9éýŰdŹlć§đćqáŮő­cQ’ÓľË*A*ȧÎÜA\{ăżzâ<+¬`k–úŹ‘öŹ(0ň÷íÎTޏ>ľ•™,†FbI±lg¦j6ÝşY™ĎĂë4źDŐ¦Óí-/5ŘŮ<®@`ąPxĎ_Č~:ž'[őřs:ęŃYÁt/S1[*€o‚ń»úbĽÁX©Iw”Ý;Ę÷m,v>&˙’á?űx˙Đčń˙ü<+˙`Č˙®:ŠĄ [ć'#Ň.me×ţim§©žăFą•n#A–Tr[v;ŽWőô5•đQ¶Ó”Úíţ!x7ZŇďő=^ęŢ1§Mvě“,ŞŰ±+ĆsúWEŕ)ář}áŐń­ć5ĆŞÉ˝˘¶ „ZB>ť>ŁűŐäÔP_ń/A:VąöëišëLÔóumpNíÁą źQźČŠŮřqk&ŤáŻxŽő 6íbövĚăkľ:zŚ…çëčkÍëoÄ~)ŐĽB°¦§tZ@€*'ŕ§ÜäĐ%tŢ,đŁřoMŇ..oKťB7ŮÂb\ÉĎ©Çŕk›‰•dFuŢ ‚W8Čô­ŻxŽkM¨\D°Ĺ(r#P:Ç'ń  :(˘€=cŔPx®/ Ă/‡$Óµ{)$a.›p=Nâ:őëß8¬ż‹}Ž˝¤}–ÚÖĎP–{ëkb qÉžŘéßňç±Čń6čť‘şeN(ŤöJŻÔ‚Öíâżę:ŻĹK]Zѡkd‚K‰ Š %6’ ç<€ú×5Łť^řÓ¨Iz`¸ł‘ä6âSűądPçÔ=x®/Ćľ$x‚çSX  ť BMü(“žž•@Bxr?ÄÚČńť¤iĐý†avÉČçŽFŇNŔ=}Eyç?äxßém˙ˇšŕŢFÝ#37L±Í6€;ý?ţHާ˙au˙еż±.ĽkđŰĂ‘h&)Ż4Ç–+‹s"«(fáąöţ>ŐĺTčäxŰtnČÝ2§/Ź$ş˛ńţʎč“Jך)Z‡“wŰQWksśŕűŹS^%E^ŃtçŐu›=9$Hd¸™a'I8ćŻxĎòx_^—Lšâ;–EW Çg‘ŘÖ+1v,ÄłI'$Đ  &ăĹ>ĐăŃĚs]iď,sB\+(fČ<öŔźµsţ'Ň­<=©Y[ĂrnncŤdş‚LňŁçĄsę̧*H> ŇTF =ô)´ĎXŐ|9s«řŢŰÄ62Á&Ź#Ăp×b€äśçĺ˙ÍđÍä7˙$ą¶`đÉ$Űt`#aźŇĽë'dŕö¤©Tť¬ßKź[ťŻĂźů kö¸ţkX޸Š×Ĺş\ױij łž9ü늮MüÉľÇUăO jşuÝöĄs nX¤«"ťÁ‘ĆsúWSŁĎ¨ę ŇðY]ÝZ"¸‚tFeËeHÝĐcüń^YJ¬Ęr¤ę 'M´“{ JĚë6Ń.´/_ZÝÄȦVhśŽ Č ÷ŕŠÂ­˝OŶ©˘[éZŤÉ¸µ·pńP]p¤cwR0{ŐŐřU˘Üjž1ÓçHŰě–R­ĚóĂ'Ô8¬o_ÇŞx§V˝„ ÷24dw]ÇňĹHž)ŐŁđâčp]tě±xă7ťÍÔŹn•‰@N™ŕŮďüâ4˝·H­©ľócç±çް4˝>çTżŠÎĆ?2âRB.ŕąŔ'©ă 5X1 T´ňFx4”0=3Ć~ŐźÂúŰPł­$7?Ľ_“>ĽđLÖĂصgąĽ“A˝‚+ÄŚfÖ\¤/98ü:×%@$Ž f ůy[+™^çŁřÚĎK˝sN±ÓµĂp5¶Ŕ2GŽKOżä:f˛ô _]éVZź…o^KŢVć%DđśńŽGëŤfgl±,}IÍ Ě‡*ĹO¨8ˇAĄdÁÉ6wźš 5M Nh¤żŽMFH=ÇR;şşą,ő+OZ®—¦čđx}dĄÎČÉeă8brXśř}kĹéKˇI;GAš—KD®>}nz]Źü”/˙םĎţËVĽ/˙!oםÇňjňš(tŻ×ú°)ťç€¬›Pđ—Šm#tI%*8·6}ÎăNŐtéĽ9đęK P¤w×—˘T€8bÉÇÓőĚézßŘ4_Mű?™öńó7ăËŘIéŽsźQY ĹŽX’zsO‘ą7Ňá̬v? ¶O.·aćÇĹîź$0ď8 ç¶k#Wđö©áÉ-fŐm„Jď”ÄŠŰ¶ŕž„Ö%|­JäßKÓ«sPÖc˝Đcҥҧ "ŢKdĹ€3¸ź›#çÇřSTEř›ö«ű¸dód’3pj3 žÄăó®3* zŚő¤¬Ő+&ŠsÖç¨řS·úŢą.ˇĺ˘› ه ”pw@ŕuő®gáfˇ™ăÝ"âĺÂBdh™ŹA˝JŹÔŠĺY‹cq'sIW´Űl–ď˘7|m˘]h^$ľµ»‰‘L¬Ń9:AďÁ§đ«E¸Ő8¤—>Tnřë´ŠY –%Ý$R é–R(:*E‚fŹzĹ!Oď8üę:(©2’ Dä°ĘáO#ÚŁ Š( Š( Š( Š( Š( ŠšÖŇâíŠÚŰÍ;’#BÄ¢udvWR¬§‚ %Q@Q@TA5Ă‚)%`2B)l~T0*ĹXAÁµQEQEQEQEQEQ[zź…ő]+D·Ő5ł[Ü8H–FŰ*Nvőżµ á}V_®ą·ť§eĽlĹ´ŕî^ {Đ%Q@ř˘’fŰ;¶3…5/Ř®żçÚűöh¸袊(˘Š(˘Š(˘ź2ĚO“ÉŽ»TśP(©e·žÝ,2"çe P¶Ó´~bĂ!Ź®ŕ§ť*(­Oh—o~ˤZ´ň–9Pz±< ˢµ,ô;«ĎbŔĐ›Ď9ྲçˇ÷ÇłĄ_h·ĎgŞ[ImrŁ%¸őpG¸  TV˙…Ľ'©řťnż˛DöűwG$ˇłśmĎ^†±níć´ş–Ţć6ŠxŁŁUÁ€"˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€'‡ţ=n?ŕ?Π©á˙Ź[Źřó¨(˘Š(˘Š(˘Š(®ÓĽ5¦ Yë:®©%¬3HŃ”H·’A ǰ'&¨xłĂéŁKg%ťĎÚěocó`—nŇGëČüëKW˙’cˇ×ÔßÍ«—ł±µÍ,±[śÇ9!A!AéÓµcfď~¬Ţ|©rۢ;řC´«{Ë}+PÖšju\FŤş)=Éü+žµÓ,íµ»«]Éf°nC$Q™2ŕŚz“šôíTëz†łî…•.•:¤‹y,q“Îâ~lŚśW”x†á٥ž+‰C™b\+öČ•Ą)îË­ĂTżŕţ'{ăŰ=ü y©Ďop,ÓËŤ-Ëŕ“Ű5Ćéz*^řsXÔÚfW±ň¶ >öÇ&şżhúń˛Ő´ăą±[ ë*ŤĄA$Mgx!©h!Ńb‘öé"xŰĘ1$ÓóĄ rÓş}ľZ•8óUł[ŢŢz°č©'„'ÖLĚ$Žč[ńÁAÎÓÓĽ5¦ Yë:®©%¬3HŃ”H·’A ǰ'&®ë62xwáđÓ5&DÔ.Ż|ńpĹP(8ú~µWW˙’cˇ×ÔßÍŞąÜ¶{˛9w[/ÄĎńO‡ŁŃç±{KݵX_F$‚m»IdřŹÎşŻč–šŘŇnuÉRöly ČŽ7™'<}=k†W›h¦žY"„â4w$ 'ťŁ·á]ż‹żä®[×ÍŻţÉN\ĘĘýC‘ŢVęŽ'T˛“MÔ®l§Á’ 6#ˇÁę*­nřďţG [ţ»µaVŃwŠfV“Hë|ákM{IÖ/Żucž#f/xÚs¸ŕrN€:š“ÄžÓíü7»áýJKë;ěó cŘńľ3ůëZß ěSđO‹ěŁ‘#’an¨]¶‚Ű›=˛p?~łĄĎáo…˛éÚąŽ-FúůfKpá QÉÁ>ꍮg7í-~«O‘&n—á-!Ľ'aŻkZĽ¶pO+ÄČďbA ǰ$“Yľ4đĘhSXKawöí?P‹Í¶—fÖ#Žőä~u«­˙É"đçý~OüÚ¸ôÔ.YěĹÄóÍ«o!*  đ3ŽŐpćmĘýX÷ü :-­í¶Ź©ř…ˇ×îH… -3}Ő-˙×ʰü?á¶ř›TŇ5;“jÖË#Č‹¸e=9ÍwzĎ…nµż6ž&Óć·“D•ŕą{ź5@Ś \‚3śüżăYZ ôŹÄOÝÚ8x$°şŘ㣴d{VQ©'Óé÷0 Ŕ5ä–qŮkW/&ĄlÓX«@J‚X?2őâ=k¬řaáÓá­q†§;É&ž>Ú ą˙GŕäŻ÷°sůUÉâ O ¬ůŇěľÓ8+ao‰oń’Ľc˙­Tľ Ľ¶ń.—‘­ĺíG;ŢÜńźÄS“r¤Ű}@çő»]ÖöĚh:Ś÷ѱýá–Ó‘Śg­z_Ž|9ˇęţ>– C[’×R˝XÖRĘż(Qąşdxúz×ë^Ôü;¨ZĂ«Ű$—€HŻ‘ś 5ŮřßţKu§ý}Ů˙ě”ĺ«\˛čőű€äl|-ywăáŐd[•™˘iv€ą%ľ­éüŁ^ÚęKáÍrKÝCOŤĄ–`($UűĹ˙ŻúÖ­†Ło¦ür»šňEЏ–##,¤ ţ8ŤjŢi–şĄĹřĐôۢe[‘fpx Nr}éJ¤îµ¶8Ńôďü)®jí;¤šq‹laA˝±ÉíEľľą×Śî%†đZ°0APsźĆş‡ [Ă^'Đa–4żĽŽ)-ŃŘ0Ł@ĎáůűTúöť/…ţŤ'UhăÔďoĹŔ·W Č@ÉÁ>ź­[¨Ôąo­×Ü^‰á}+ţuĎęsYŰ\ĚĐŔC˝›É'· ńíďXŢ*Ňě4»Ř—IŐ"Ô­&ŚH®Ł ™ţŤvŢĹ)áhĄđóéúµ”’0—N¸ ĆĎS¸ŚgŻľk'âÍŤ…–©§‹[kkKé-ŢŰ[Çž;ţB”&ý§+}ŔákwŔżň8iőňźÎ®iž ž˙ÁWţ#KŰtŠŃĘď61ž{xęźäpŇ?ëĺ?ťuÇtLţWńgüŤ:Ďý~Í˙ˇš—ĂZMž¤÷2jz”V–é˝ŮąwĎ@‹Üń]<â+Í{Rą·±V†k™dFóăRä‚ކťŕ }X{;;Í~U†¬g’ śgŻä?ĺ|Ú™:‹“Fdkţ±C‹YĐőĽ±2ů #Řńľ3Ďůî+ˇžÇMşđ†$Öuł¶ŚĚ—wv/ĐŔI5gĹP_‡ «ĹgßŰS1[*€hĆíĽnţŞ×: ć»đ˙Ă1éˇ$ąŚĚ|¦pĄ”ż$döă󪵛˛čgÍt®úţ‡)âď˙a_Ŕ\}ŞŇę%šŢP¸,§Ű×ük{ţÍ&ŢňßJÔu¶‡ZťW¤ŁFnŠOr ŹâÇasáý?ĚIgÓ­'Řr qú~µŮęÇ\Ô5ďtô™t©Ő$[ÉcڰwódcúvˇE]ŤÔ—*Ôňč/µo j·¶ö—&ŢĺĂ)@6Óî:VßĹY^}[I–VÝ$šd,ÇÔ’äšćüEp÷zĺěÓOÄŤ!̱.ńĆ@ô®çÄţÔ|QŤ¨hIŐşéńBř•T«.rHőý*UÚiÚŚŁ)Ż„´µź·\^Ý[ ĽŮ¤TŢÜçŔţTíwJŃaÓR÷DÖ>Óóě{y“dŁý ;Š˝đţßX—çBĽ·Šö$­e#ý dä ńĆ?ZŮń˝ž<"—zîťc§k†ŕ,km€dLrX}˙!Ó4%î‰ÍŞ–¸Ď„.­oă /U’Ââ-5RGk©#+Ă îĘá|-ĄMáŤ?O»’@ßl–eFuC¸đ:ţźŤI¸«6\›Šłg!â}űöáś][\ÄłA(\nSÓŹZŢ>Ň­n Óu-iˇŐć űµ„˛#7E'˙ŐNří΀ň™ÖŃ y8ŘH<íÇô«ţ$đ˝ĎĽIý©c,-¤ÝŞ;\‡\Fˇ@9ç<úŞyݕ݉çvWv8űOÝ\ř—űYŔ•Ł/Ő@%ľ­i|3¦][ß V{«Ë(ÚY"’‚E^ĄM7ÁóŮi< Ą’Í]á[†AČ ˇ5ĐÜŻôűmB{±¤ŘÚ$l˘q 0=vó“ďNRwÜ%&žçámZűLÔ˘K†…n%Ťe¸néČ÷5Żń+Vľź_˝ÓĄ¸f˛†UxâŔÂťśă=ĎçY~ŃŻőmJ7°„J¶ŇFňťę»F}Ď=J×ř—Ł_[ë—š¤Đ…˛žUHäާ'g¦sü'µ7Ëí |ľÓĚ·u­ę7ü4ÚmÉ€Éçď»ÇQîk3ÇńÇ$şN˘‘$Rß٤Ó* ýĎăý+V} PÖü áÁ§B˛|ó#4ЎA~'Řô¬ŹĎ›KÓŕš9ÚÂÍ –HÎWxęéS siľ¤ÂÜÚo©ż¤ëÖęž’K¨•-´öŠROÜmĽů ósE¬`˘i(ětţ'Ń4m7EŇn´˝n;ű«”âĆb8 äsĆ5ĚWMâo^xFŇő+››YbÔ2,NK.@nxçÔW3TXWqˇxOH˙„Z {ÄÚ¬öv×S46ńŰĂ˝®rIçÇ·˝pőëĹqxN|9&ť«ŮI# tŰ€¤ŔŮęwׯ^ůĹpŢ(Ń´í7S¶ŹHŐˇÔ¬î]dN<źşă±®Ţ÷á׆ěŔÇÚąx~ÇĂw¶v·†ęô@đ Ç!ţŹëí@¦xHü5Ó"—ZşM0^ąŠčZ’îřl©\dĽűWťéšf…yă§6§:éRż— ç–î cp=x®·JŃîüUđšÇOŃ<©ď¬ő’XLŠŚ†Áä˙´+’Ń.ţŔ‘79űKd0…76GŻćElĹđůě?·nç9Á÷¦ĽEÓźUÖlôä‘!’âe„<ś$㚣^6­uáŻčFqo=óË,ň„R͵° úŹĘążřvO ëŇé“\GrČŞâDŕŚň;éF“qâźhqčć9®´÷–9ˇ.”3d{`ĎÚ˛©m/±Qľ¶9ĎëQř‚îÖém|›Ď%c¸aŚJăř€çĄo˙ÂĄ[ÝŰéz†¸aÖ§Q–ȬÝ·˙ްüOĄZx{R˛·†äÜÜÇÉt$™ĺF?ĎJíő_\ęţ7¶ń ڰIŁČđÜ5Ç  @ąg9ůƢRI+;"’»Ôât? 5ďŚ?°Że0şĽî<¨'ŹcŠÓ˙„KKşłÔJÖçS°Ť¤–# T`ż{i>ügükGĂ7ßü`’ćŮĂ$“laŃ€Ť†JÎřs˙!­oţÁ×Íh”Ą˝ú I řimĄK­YÉwy*j >"·nYŢíŰżĺUücg Ĺq%ާ<·˙hmÖíUqÜ7{UÜEkâÝ.k‡XâY†YŽĎţu{ĆžŐtë»íJć2ܱIVE;1#Śçô¦ô©«ŮŘ4żiëˇŰęşţ¤öp];%ĽqD]›Ź ÍQń6„şŁo¸űM•Äk<3Ƹ/ö=˙Z»}}GPđNž‚ĘîęĐÉĢ3.[*FîçŠć|vuő[é­./#Ťc٦EŹ Çý)FMĘÍ÷Jņđ3Ϭińé÷&m&î/<^ŔD{wˇ×ëX–Öš#kw0\ę3Ŧ "+ćrtt“ůW ŮIcŁŮCŕ«Ë—±7Ú'Wů`•ńµ·Ż×Ü×—ęúuĆ•©Oex›f…¶źCčG±Ó§'+¦˙®â’Hô?XxyďíÚóTžÚŕYÇĺĆ–ĺŽv’{fąĎ…št§Źt›k´Y ŢŇ27C±€?ąăM˙^ű­¤ÇÍŠŘFÖUJ‚H šĂřY¨E¦x÷H¸ąp™&cĐoRŁő"ť‡pžćŤ5‹ťsÄ·÷wRł+,jO€á@¸­?…şĽÚgŚ´řUɵ˝•mgň˛+ťŁ#ęEgxŰDşĐĽI}kw"™Y˘r8t' ß‚+OáV‹qŞxÇOť#o˛YJ·3ĚxTw źR@âµ Çń•„z_Šők+qaąuŚz.x•cÖżŚ/ăŐ)ţÂVAp%hŮú¨ ’[éší|Oá+ŻxźűVÂh[HĽXÝî„‹”( śçŹ˙U`ř.{âj.ÖK%y![–ůAĘĐźçDfů[NîŔă®Ă¦đ®•wm~ş°÷w¶1´˛E$%Šżx©˙őÖG„u‹ý/U†; †….eŤ%¸néČ÷5Ý]/‰´ëmF{ŃŁŘYÇ(¸¦f˘®Ţr}ë‡đv‰¨jú¤Riđ RÖXŢS˝WhÝîyčzQ^/™č Y«˙u‹űŹ_i“\3XĂ*Ľq`aNÁÎqźâ?ť_»×u-Ŕ^}.äŔdó÷áCnĂńÔSTţ)hš…¶˝{ŞÍ[ ĺTŽMęrvzg?Â{UëŹę:÷€Ľ0şl+ ‡Ď23H¨ŕň}ŹJźw–7Űţő»2>"Dzčú’D‘K¨Y$ó* ýĎăźŇµď'm ŕö”¶ÉźY¸‘®dNŃ€ąôá_SXßç€M¤é¶óÇ;iÖI˛FrĄÇP?!ůÖÝͬş˙Áí-´ő3Üh×2­Äh2ĘŽKnÇqĘţľ†¶§đ˘%ąćŕr85čÚÜç_řEa©^7›¨i·¦ËÎoĽŃ•Č÷ęż•yŇ‚ĚA$ś;ףkÖĎáď„zv›x¦+ýJřŢ[ď,aq’;tN=ęÉ9_ÍżŤ4In%ň˘K¸Ë98ćO§Żµk|JŃ5x|O­j7:uĘX˝Ó2ÜygË*[ĺ;şsĹex8ćń¶‡±ů¨o#Ęă9ů‡_nő§ń/YŐ¦ń^·as©]Éf·N«nfo,(l¨ŰśqĹqÔQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPđ˙Ç­ÇüůÔô“lR&3żúb™@Q@Q@Q@Q@ ‚• BžŁ=i(˘€ Š( f,ı$ž¤ŇQEQEQEnčţ ţÍđ浥}›ĚţŇ7ĚÇ—±‰éŽsźQXlĚÇ,I8Ç&’ŠJ)6×P (˘ …* ÚzŚŇQEQE+ł;v,Çą94”Q@Q@)ve X•^€ž””PG•™ť‹9,Ç©'&’Šr;Ćs2źPqM˘ŠPÄ)PNÓÉŕŇQEŞĹX$ĐŠJ(ĄRT‚¤‚:IEˇ)PÄ)ę3Á¤˘€ (˘€H9R»3¶]‹RsIEYÓ/î´»řol&h.ˇmÉ"ő´ ŇQEQEQEmę~(ŐµMßJÔnMĹ­»‡ş‚ë…#ş‘Ţ„ńN­‡C‚čçe‹Çɸäîn¤{t¬J(Ą B•í<‘ž %QEQEˇ@=FzŇQE(f T1ÚzŚđi(˘€ł$ĐgĄ%PEPZž×ő/^ý«Hş{yHĂW„ eŃ@–zí城·”/|çśe2ˇ›9ăń¨5ťZűZż{ÍRćK›–.ý‡ €=…R˘€7Ľ1â˝SĂ)t4‡†7¸ G;.3ŤąéÔÖ-ĚňÜÜK=Ă´“JĹÝŰ«19$ÔtPEPEPEPEPEPEPEPEPEPSÍ˙¶˙đ/çPTóÇ­żü ůĐQEQEQEŇAŕ˝bçĂ_۶±E=VwČ ŞH$Ż^Çđ®n˝ ŕën»ń Ľ, ĺĆ•2[ÂNŻĆą˙ëĐžŃWµ]QŇ5Ő,nmLěĆSv:ă=zŐ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*yżăÖßţüę žořő·˙:‚Š( Š( Š( ˝ŕŘdşńđ·péS43cý[qő˙^y]^2Ö đĎö ĽŃĂ`U‘ÂFş±$‚Ý{źÂ€2u-WPŐRľşĽdÎĂ<Í&ÜőĆONŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (©¬í./gÚC$ŇNČ×'6–¬oDCE;ců›6¶üăn9ĎŇ–HeŚfHÝL˛‘EĐXeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O7üzŰ˙ŔżťASÍ˙¶˙đ/ç@QEQEQEW]§xkL>łÖu]RKXf‘Ł(‘o$‚@ Ź`NMr5Řę˙ňLt/úú›ůµgQ˝}Mi%«jöFo‹<>š4¶rYÜý®Ćö?6 ví$qÁĽŹÎ¶˙áŇ­ď-ô­CZhu©Őq@Z4fč¤÷'đ®8^ÎĆÔO4˛Ĺnslä„…§NŐëÚ©Öő f;Ý =*]*uIňXă&,ťÄüŮ˙8¬ŞJQ˛oą­(ÂwivĐó]2ÎŰ[ş°ńÜ–kä2E“.ǡ9®ÓǶ{řóSžŢŕY§—[– 9Á'¶k‚ń ĂÝkwłK©e&›©\ŮO$4lGCÔWmâďů+–ßőók˙˛W9ăżů5oúîÔ©JN×wşąUŁ{+YŘ­˙hPjş~ŁusyöXěöm›†sÇ\ńŔ¬ ęÇ>fő3žľŐÍRvŁ5)m{m®›áz±ĺŽö僚ś’ÜĎg©%aq„‰:śç­u:Ρu©ü?¶žúc4ßÚwҰüAˇęLžmü$™ŰaŢ­žýŹ˝méV3k~űť˛KČ/|Ö¸S´ˇúţ•ueˇSM×ţ ”Ó•=vŘăh«Zžźs¦^=­ě~\ę+¸6229UZëMI]­4ěŠ(¦ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€ (˘€ P̨bőëIEQEĹ+1f%‰$ő&’Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*yżăÖßţüę žořő·˙:ÝÁzĹφż·mbŠ{ ¬î#TI^˝Źá\ÝzÁÖÝwâxXËŤ*d·„ś _Śs˙×®/UŃő!Ł]RĆćѤÎÁřôŻ«şŐÔ—ÚĹíÔ×&îI¦w3”Ůćäź›olőÇjĄ^ž‚ĂÓT×ôÎZłu$äŠ(­Č (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€&ň?Úý(ň?Úý*j)‘ţ×éG‘ţ×éSQ@ůí~”yí~•5‘ţ×éRÉmáé»·˝-H˙ęcühŻ‘ţ×éG‘ţ×é^íűLĚ·˙o?űJĽ>€!ň?Úý+´˙…•ă/±}—űv_+g—ţ˘-ŘĆ>ţÝŮ÷Îk‘˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(ň?Úý*j(#ýŻŇŹ#ýŻŇ¦˘€!ň?Úý(©¨ Š( Š( Š( ¤ő1ţ4Q@ŮűLĚ·˙o?űJĽ>Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˙Ů endstream endobj 132 0 obj << /Subtype /Image /Interpolate true /Width 778 /Height 92 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 134 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ\ "˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQE=—ü}'ăüŞ žËţ>“ńţUQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@SáŠI¤ĂČ碠$źÂ€E`ŕđh Š( Š)QYÝQł1Ŕd“é@ EOťÔ’ĽqŰLŇ'ŢUŚ’żQÚ™<[¸K¤‰ČČWR§ĽĐtQEQO–beŤĐ8ÜĄ”ŤĂÔzŠeQ@·Ąř_UÔ´‹˝V }şuŞ3Ľň0U;FH_Sô¬J(˘Š(˘Š(˘Š(˘Š(˘Š(§KąIQ‘ÇUaM Š( Š( Š( Šthň8HŐťŹ@Ł$ÔĆĘč ›iŔ˙®f®W˘Š) (˘Š(˘Š(˘ĄŠÖâTÝşúŞ(*)YJ±V08 ő”QEQE=â’5VxÝUąRT€~”Ę(§ÜĆdŢX8ÝŽ3éšmSž7@ĄŃ”0Ęäc#ÔPh˘Š(˘¶<=á˝KÄ)wý“ Ď%˛‡x·€ě ţzô  z)ŇĆńJńĘŚ’!*ĘĂHę¦ĐEPEPEPEPEPEPEPEPEPEPEPö_ńôźŹň¨*{/řúOÇůTQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEÝ|˙’‹§˙ą/ţ‹jákşř'˙%O˙r_ýÔ~ohÚ•¶°4Mu=^iŕh ĆÁOĚž¸˙„sUµ‚Öçí¶—¬öÓÁun€Ź_ńÚižŃt?č–WZó¤đÜ Ž6Í݉ŕ“řsY_ĺXx fôČ\í´×Y­xNďVřť§řšÎkwŃ'–Úăí>jŕś’JŚcÖ€8Źx‡Uđ÷Ä/IŁÝµłË9W!U·Ó¨5?Ćą^}{FšfÝ$šLÍęK9&°ţ&Čű®×ËWoă? jž2‹AŐ|8ŢZŤ2(*”u,H ‘ýě~€8źřb-v=F÷Q˝ű•§ {‰‚ns…QëÁý8ć¬řźÂ¶ľ‡^đî¤÷ú[Möy±l’'Ćyőâ:ćşO„·3.ŹâMĎěźŰ.c’ެ’•'rŕđz~ąíMńěľ#µđzÁâ&ҬMĚŕ­…ĽJ%mżĆJ’˙ëP>‘ŕý"? Zë~'Ö%ÓŇőŮ-cŠ!8$`;qíŰžj÷Ć;ae…-VU™aÓ1*Śpúő«łč7~3řqáźě#×a–LŠĄ70ääú(?CTľ2[ (|)j$YDbEć)Čm¸ÜP›ŇŞ–`Ł©8®ŁLđl÷ţ żń^ۤVŽTŔßy±ŚóŘóŔď\ş’¬u"‰ńšĺ¬µk?Ů“™§[ XW€\Ś–>§§ëëXţ 𵦽¤ë׺‰±‹Oł?—Ľm9Üp9' ŔMm|eł’÷R˛ń%˘tÍFÚ6($+Ť§Đ㯥 ěSđO‹ěŁ‘#’an¨]¶‚Ű›=˛p?δśctí·ćO‰<-§ŰřnwĂú”—ÖwŮćDZă|gň˙Ö§Ňü%¤7„ě5íkW–Î ĺx™ěH$¸ö’kKYŇçđ·ÂŮtí\ÇŁ}|ł%¸pĚ(äŕźOÔU oţI‡?ëňćŐŠ”šI>¶ż^4đĘhSXKawöí?P‹Í¶—fÖ#Žőä~uŃ˙¢ÚŢŰhúźZ~áTRŃŁ7ÝRßýqü«MBĺžĚ\O<ĐZ°1Fň¨2 8í^»¬řVë[řiâm>ky4I^ —ąóTÂČ#9ĎËţ4ęJP˛”­ľż'‡ü!ößjšF§rmZÂdyw ˇ§§9­ř<Ł^Ig–µrňjVÍ5Š´d¨%óÇOçřĎ ßA¨üDń}ÝŁ‡‚K ­Ž:0FG±ĹjxGţC??ëĆçů5g:“ŢöÓôl<đ†âÖăÔ/5 ŃcĄéčâm…ŰśáTw'¬x“Ă6Ú :樽ţšÓ}žA$[$‰ń¨˙ë[˙ nä}Ä]µ:¬Â9m˘ą É.Ňw.˙ö¤ńĚž ´đšÁŻť.Ëí3‚¶ń(‘¶˙+Ć?úŐŁś˝Ą®ď‡ö>×jsĽ’iăí Űźô~J˙{?•pšÝ®‹k{f4F{čŘţđË ŹiČĆ3Öş…/-ĽKĄÇ$ky{`ŃŔŽÁw·– C[’×R˝XÖRĘż(Qąşdxúz×›XřZňďĆ'ĂŞČ·+3DŇírK}03]wŤ˙ä·Z×ÝźţÉRŘj6úoÇ+ąŻ$Xˇ{‰b21ŔRĘ@ĎăřÖtĺ(ĂGvŕeOŕÝö×R_k’^ę|m,°ËA"ŻŢ(ýÖ°´};˙ kš»Né&śbŰPCďlr{WŁŢi–şĄĹřĐôۢe[‘fpx Nr}ëřqŐĽ5â}cKűČâ’Ý€ó 1$ ţźµ8Ô—+wľßđ@çíôĺđ5ÎĽgq,7‚ÔE‚ śţ5§˘x_J˙„fsÄzśÖv×340$ďfĆrIíČ<{{Ö¦˝§Ká†#IŐZ8ő;Űńp-ŐĂ2 P2pO§ëV| ŠSÂŃKáçÓők)$a.ťpŚ-ž§qĎ^|Ó•FâÚ}@â|UĄŘiw±.“ŞE©ZM‘]F3ü.;Ĺ®ëâÍŤ…–©§‹[kkKé-ŢŰ[Çž;ţBł´ĎĎŕ«˙ĄíşEhĺL ÷›Ď=Ź<ő˝)sA0áwüŹz_ÖOýő»«Ýřţď%Ý%’,Ĺ#ŔN}˝+ áwüŹz_ÖOýŐˇ©řCĆ ×NńÎÖäłnÔ‚ĽöÝé]ż.‡4íí5¶Ý~f/…ôuř/ˇ†ĺ“TŠ?2Hf¨ĎŻřýiÚŹ‡“KđÍ­ţˇ;Ǩ]¶`´Ű˙,Çń7§˙\{Ő߇şzÇu//¤xtí3ç,§I; úägęz»ă•$ŇíüSc¸¨ŢîŰĽ†ö9ýG©¤’ĺżRśß=ݧőˇťĄxsN] ßUń¤öp];%ĽqD]›Ź ÍA«xcű?Ä:mşŮßš ”\nGlgżýjětyőCÁBxv »«C$WNĚąl‚7cçŠÇ×fľ>3đý¶§sg5ĹĽ°ŞmXrŕě=łô¦â¬Jśśž˝ÇÝx7D¶[©%ÖnvW"Ţç÷ĺľîŢ3ő¬Ë«xůü;5˱2¨Î<˝ăʦ+wÄ?ňń‡ý…bţfݧü—g˙w˙m…7ˇ*rIëŃţźćsŁÂ]Ý®ˇ“¬µÖ©cI,F¨Áz…'Żâ+OésÜ8H’á 1čŁ=M-š{˝ő%¸Ď˙ČÓ¬×äßú­-EŃźIKýsYÂW)Ľ ćH1üL;®řÓÂZĽú¶¬`Ťôćťç,Ş~V|Ž3žăµoé–7Iá-"o işuä˛+}¶YŐŃřŕî<ż§â”uwQr+3‰ńn‚4Ř‘uisž ‚ărQë]-ß‚ô+ NŢÂ˙]–+›ĄC 3ŤÜǧ'"™ńc~íÍhZO°ŤĆlÎyŰŽŢ•Wâ«2xŞ&BU…¬DpAĹ6’¸FR’Ž˝ÎQŃ.,|Fú;•{2¬:6ěm?ŽEz'Ä1˙†ďm­TĆć(†?癍W˙B?řírßŇMOưŢ_Í$ßfFş–IXł‹€I>‡oĺ]‡u»Ýë:dJYO©ŰČÍ(™śÉ ÉŽäŃ[ÔšŤó'Řä<%áčuxŻď5łg§X i¤ ą‰9ŔđţUĐęvvVź .?ł/Mĺ¤şŠş»FQ—ĺ«QŹÖŞxŘęľń‰ ˘ßÎ"’(Üă~ĆÉýçVő=ăEř]=µîĹąmAdxŐĂyyP$qś ţ4% ĺ+ÎÍőZ:o†tÔđíľ«Żę’Y%Ű2[¤p™ ÁÁcíÇůÍ[řťn-“Ă–é"Ě#ÓŃĐpřŕő«rč÷>(đ.ýŹĺÍ=–)â2*•ÜŔääúâDbÂO Feö1®ä<6ÓÔN(jŃ+Í]뮂¤ŰŢ[éZ޶ĐëSŞâ4€´hÍŃIîOáX:G‡žçĹéˇ^Ča5âwAśäg·éş±×5 f;Ý=&]*uIňXă&,ťÄüŮţť«‹đ˝ĂÝüT·ši⸑®2ĸGÂ0Č”ÜUС98·~„‘ř7J»{ë 7Ziő‹Uv1JŁm8*׌ţ•Ći÷·:uě7vS<7°tu8 еuqgŻ_Ki<°KçČ7Äĺ[Ź[M°şÔ°…縕‚Ş É˙ëz͵ĐŢ ­ÝÎ×ă PKŞé:˝ĽkŐtř®¤ 1—=OĺŹĘ¸ďľ1K :Ć•¤@ę˙ŮZ|V˛s‡‘ům¬ořNoęsŮÁw ©Š)isČńëÚ‘g5EIu ·ą–efŤĘ§ ŕă úTt€(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠžËţ>“ńţUOe˙Iř˙*‚€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( Š)óÇĺJÉśă˝2•Ł`ČĹXt ŕŠJ('''­Q@.öŘqŘvçŚŇQ@Q@ŕäS¤v‘‹HĚĚz–94Ú(UŮCb ˘’Š(CĄA;O$gIE·ĄřŁVÓ4‹Í.Úäť>é$‚E ŁpÁ+č~”íÄŮľÖ´ŻłyźÚB!ćůňö1=1Îsę+ ŠM)hŔVfc–$śc“IEŔ)CĄA;OQšJ(˘Š(ĄvgbÎĹ÷'&’Š(˘Š(˘ŠRěʱ*˝=)ÁČŕŃE+3;rYŹRNM*;Ćs2źPqM˘€ PÄ)PNÓÉŕŇQ@Q@Q@ ¬Čr¬TúŠJ( µĽ)¬˙`k¶úŹ‘öŹ(0ň÷íÎTޏ>ľ•“E4í¨šMYŹ–F‘Ř’@,[nx¦QE!…(f€H¨­%QEQET‚ t"‚rry4Q@ ®pHČÁÇzJ(  ÁJ†!OQž %P[>ń.§áÔ»DâÝî•Qä čONµŤE:YYI]žG%™ä±=I4ŠĹNTzdJ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š({/řúOÇůT=—ü}'ăüŞ (˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( žńHЬńş«r¤‚úS¬íŢîî xą’gX×ęNzŹÄ!˙‡/m­TÄŠć(†?癍W˙BăţQ)ň´ŠQşąĺ4ď-ĚfMŤĺŤŘă>™®Â~‡WŠúóP»6zu’š@»“ś?ĺ]§geiđĆăű2ôŢZ˨««´e~@ °őýh•DťGKž{OňeÜ‹ĺ>\eFÓóoZę´ß i©áë}W^ŐÉ.Ů’Ý#„ČN n?ÎkŁ×1¦řŁŔ責©Eć/F‚ä~4ťE{ Qîy—•&Ćo-ö©ĂďHńĽd ”‘‘¸c#Ö˝VúĚCáŻŮ2ü÷7w71˙»ÄGţ…\˙ŽÖÎO%žˇpöö–đE ȉĽ®#ČŔďÉŁW™ě7 ŤĆźwmkĚöÓGo?ú©Wú­]§Ś­V č˛Új÷7ús´‹KŔ›xŕuőŇ|4¶ŇĄÖ¬ä»Ľ•5ź[·,ovíßň§Ďîó —[e9ŁuEvFßuŕý+©ńŤžĹü–:śňßýˇ·[´TÇpÝí[łŮi·>đĚšÍűŮŰĆfQĺĆ]Ü—íč&‡SDí¸ržoV>Ĺu˙>Ó˙ßłZľ.ĐF Cp.m."Yŕ›ܧÔWŁxĘO®ą ĐEÇŘ6&ÝŠ„gőç­)TÚÝAGąă®Ťu*è#RVí¤cVńKCâ+ą ši rÍ´edč2:c#¤ž {?퉵ɚÖĎOůE\™ÜňˇsęüÇ˝[š[‹•˝ŽBŠŢđľ®—·W·bĎN˛@óK°±ç ׊ź^đőťľŤ±˘ßµćžŇů$ŹcĆřÎŻ˙ŞŽu{+µÎjŠď,Ľ§Ü[Ř«ę’Ĺ{yeö¸ĐĂ•\ śśô˙Xž%Đítű}.óNş’ćĘýXŁH›X2ŹĆ’©ě†âÖ§=OŠf$EČG]ŞN+Đ.Ľ˘YëkĄ]k˛ĄäűD Î é¸ôÉ9ăéë\ş^jľŐď­¬îL٤d†ńÔ~4)©| ămĚyb’Ű*:63†4Ęí>*JóęşL˛¶é$Ó!f>¤—$Ö'†ô«=IîdÔµ(¬--Ó{łrďžąâ…;Ç™‰­lcQ]>żáŰ(4HµŤýď,LľD‚HöłÖumRKXf‘Ł(‘obA ǰ'&Źh­qňł­Oh—o~ˤZ´ň–9Pz±< ·âí=K9m.ľ×a{›»v’8Č#ńťt÷“¶…đ{J[äϬÜH×2' čŚ@\úpżŻ©Ş‹RWDµc€ľ¶{+ë‹YJ4HŃ1C•%N§FęŠĚŚş85oEąµłÔb¸ľµp 'É'›n}łŠęü_©M«x3FĽą${‰FÔ\*€H`+EÓw1ťGĆ6Ńő8z(˘ Ř(˘€ ’h˘»çđV•ogĄ^km±6ŇŃIAźáÝëŚă˙ŻX?đŤÉ?ڤĐlĺÜË3F%qŃTXě B©S‹G?EvsxWJ»¶ż]X{»ŰÚY"’‚E_ĽT˙účřimĄK­YÉwy*j >"·nYŢíŰżĺC¨¬ÚW{eM­Ä8%u= ˇ"ş_Ůč1\_Éc©Ď-˙Úu»@UAÜw ŢŐÓi­âř{ ˙Â3ćů›çó|°§Ź1±÷żN¦‰ QÖÇË °&Ťă'¦ĺ#4ĘßńMƵ.ˇoŠo5*¬Ş!<ăv­fđ3Ϭińé÷&m&î/<^ŔD{wˇ×ëOť%¨rßcŠ˘¶¬´dŐ|Nş^‘9’ŞO"ă*K`} …lÍá]*îÚýtaîďlcidŠHJ ~ńS˙ë¦ć–âQlă(®«Ă~ÓďôFÔµ+é­Ł[µµŰ{łýOä*Ć˝áM?KÔćµÔâëM•ĺ [Wkś.zň3řŇö‘˝‡ĘísŤĄDg`¨Ąôdšě-<1Ą'‡tÝ_VŐ¤µ†čşŇěHb1Ű’MRń™7„ő‹;Ť6óÍŽHÖćÖä. Ř˙žhUvAĘÖ¦¶óBˇĄ†DRq–RE]^j˙ ­.uĚó˙iíŢ@ŰŠăt‹!¨ęPZ5Ä6Ë#`Í3DÉ$źĄ8Ęé¶&µĐ©EvŻá]öÖüh:ËÝŢŮFŇĽoŐ‘W©S˙ëţµ›áÁ®[j“\ŢýŽ;(ÖRű7 Ľä‘×€: ^Ň6¸ů^Ç9SGkq"Ž ]OB¨H®—XđŢžľmcBÔ^ňÚS¬±ld'?NGç]˝Ç đ‡á[’ÄĎçy1ăĚ8ÎAÇzN¦šŹsÍ%†XHFńç¦ĺ#4ĘÝń5λuym‰ Ŕ™GîÄŃ„!IäŚÜ~•Ó]x#D´ÖĆ“s®Ę·łcČA@$q¸ôÉ9ăéëMÔIj·ŘóĘŰŇü/ŞęZEŢ«ľÝ:ŐŢy*ťŁ$/©úV~Ąa.źŞ\XÍ,2‰ ®ëă5ËYjÖ~ł&-3N¶@°Żą,}OO×Ö­jIçTWUଠEŻG¨ŢęWß`Ňtôq0MÍÎp~ôăšłâ i–ţMwĂz«_éţw‘*ËÉ#oę:vî:ĐE{Ă­?ĂGÂúó.«pňK§··?čÜĹxů°sÓŇĽ÷ÄVž´»´&§ulßëŮáňŮ9w=xÍ`ŐÝLźXŐ-ôű3Ú'%SĚm śŚţÜ7Ăg¸×ôČô»łqˇßCö‘~T-7îěČüýŤpúĚVvÚµĚZ\ň\YĆűb™ŔŔţ.;g8ö YŇŻ´[çłŐ-¤¶ąQ’ŹÜz‚8#ÜUżxoRń ]˙dÂłÉlˇŢ-ŕ;„˝+®Öç:˙Â+ JńĽÝCM˝6^s}挮@'żUü«ÓďntëŘně¦xn!`čępA ±ĽRĽrŁ$J˛°ÁR:‚)µß|aŠ u]'W·Ťc:®źÔF2ç©ü±ůW@Q@Q@Q@Q@ŮÇŇ~?Ę ©ěżăé?ĺPPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEu_ íçŶňËŹ&ŃĺÉěp2+¦đî·câK˝gL‡IK)ő;yĄ3™$# ńÜšňú+9Sćw)JÇqŕ{sŞřgÄZ$.‹8ŠHŁsŤű$ ýçVµ-"ăEřa=µîĹąmE]ăW ĺĺ‘Ćp3řמ‚Aî('''­›˝ďćÚ…&‘sâŹh?Řţ\ÓŘbž#"©]Ě''ĐřÔ_‡ömÇ…ÂȲ}šĘ,:†ÚzŹĘ¸0ÄgŚđqŢ’…M§ľźćÚă¬y'Ç:f›‘˛îŇä·ý´ç˙dŻ8ń%ťß<Ş[iщ®wP»‚ä Áäśv®VŠPĄÉłťĎQŐü­Üx+AÓâł wjó4©ć ÚÉçŹJă<*XxÇMk·X–9ö»1áO#“ő¬)Ć &›ÜNZÝWŤ<1Şé×wÚ•Ě,eąb’¬ŠwbGĎéSř›ţI˙„˙íă˙C®:Š|ŻK˝‚űŘě|˙ Ď ˙Ř2?ä+§ńׇ|K¨ř†[ť!f6Ť+r¨2ž ňz*}›VłŘ9Ťí;ĂZ…÷‰Î‘:îUłpĹykŐ‘ÁëůšíőË›Oi—zN“$­s¤öÁźwÚŃWks×ÜzšňŞ)ĘM;ě VĐďţ\ČÚNą§Y›í)Dr[ĹpY “‘ĆÇÚ“Ć®[xi`ÖÎťiçĚł‚5ŰĆ+Ąf,ı$žäŃěýî`ćŇÇ«ŮČKĂ_öý×-âůĽ˙o_ú1kĄSµô9¤©ŮŢ˙ÖżćW=wÄ~˝Ô>"C©[šÎ9!yÜČ‹`RAĎ >µç^3şŠ÷ĹZťĹł‡…ć;Xt`8Čü©î€¸ééXôSVo°ĺ$ö=#ÄţÔ+Y9ĂČü¶×N–G–G’Wg‘Éff9,ORM6€ (˘€ (˘€ (˘€ (˘€'˛˙ʤü•ASŮÇŇ~?Ę  Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(§Ď'›+>1žÔĘ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˙Ů endstream endobj 133 0 obj 28789 endobj 134 0 obj 9973 endobj 128 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image11 122 0 R /Image13 131 0 R /Image14 132 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 135 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 136 0 R /Resources 137 0 R /Annots 139 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 136 0 obj << /Filter /FlateDecode /Length 138 0 R >> stream xśµTÍn1^ç€Ôy n(©ŔőĎŚ$. @$$$K=PĐDhӒ™+oxNE<GÎy fv»ŮMhA%ÖĆögŹgüÍ|^‚Ő¤ÝihűW X‚ŃĆŘlvlĎy“t đb0ŤyÝOśˇ2¨ak"˙s8„v˛„{ő»ůÔŔě={pňń޲íMNĆggłr5‡ă}xÎm9đdOMăcmLd5b‹ä…v‚9Z×X=Ŕ=µXoŰck—âÔ§ŽÝ~ÔPŰM¤Ç ˇÍÄ›´őŮšŘńźŁ#Ě<Ě»‰)J’óä2Jđ÷ źQÎŕŕŃéÉÄĺ— oć5óGN„Ň&­Ľ†0®îN ˇj\}USUU« Ľ„ň–ëôn“ŃŃ!źµĂxĺ­x»„±?e­wr‡črä{FI ’™{°€Ěp´\ćŃÎz Ęć~¸ßTľË$ĹĹ& QŁ'ťsŘaĹ <^Lgo,ÁÓ5Y—1bMbůhc‡í˛·‰ÖÔ9ľÎş>`î`ĺştĚ`Fę+Čg'Ää]V=3á*ĚŘl‰#ăâň&5Zw–K{Ő=DÉX×*ý®Gţ^ç$/›ńü¨Ł ‰źµőžîŰV•ZU…ťšö¨Ă¦¤GçŐuĺ|t4ú®ĘčÔGőTíU?˝ÉŔł řÜ~Ą ŻÜV·T©VĽRÔžú4á۶«ŁĎŁoˇ#q#Bbu˙.B”ĽÉ˛ćŐU/í·]I˘ endstream endobj 138 0 obj 573 endobj 139 0 obj [ ] endobj 140 0 obj << /Subtype /Image /Interpolate true /Width 1072 /Height 126 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 142 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ~0"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQETđ˙Ç­ÇüůÔ§>ý)ŹEZ]6ů™ŐlîK ÜŔDß(ő™§CÓ0Ĺ$XŞ“´{ĐtSž7Ś)te 2ąČőő·ťˇi– KŐÂťŁń ¨˘˝YŇ´xv+mJĎíŢ$Ô-‹üĎ„łVSŽí×ń§p>˘žË"3Dz&72© g¦i×ÓŰ0[d‰Č)RGŻ4\¨©˘´¸—Ëň •üÄڄî>ÖŁ–7ŠFŽTduŕ« řQpEL–—N–ó4+Ö@„¨üzS"ŠIIFî@ÜBŚŕzŃpEXkµ2nµśyjóůG©ô hň8HŐťĎTdš.h©. šŢCÄRE ꮥOäk{ĂţşÖ4ýRč!V˙hU0“çuáO˙®“’Š»ť˘§{Y˘–8î"’"çz‘üëwĆ^“BńćźiçÝĂl¨Í/—ÓrÎ:uŁ™^ŔstQSMkqhóA,h˙uť ô'­0!˘ž±HńĽ‹´iŤĚżSÚ†(ŤĚ@í/´ŕLĐ(©­­..‹ X%Ż$F…±ůTr#Äě’+#©ÁV"€EŁáí&moX¶Óí™VIŤÍŃ@“ůMj&ě®Ěę+¸źÂMÔńč:Ó]ę(ŇI ÂT8^»O˙Żú×4Ž5fsŃTdšn- 3RŘJ*IŕšÝö\E$O×k©SúÓZ)ŮQţë€~•% ˘śńÉS"2†Râž-n%”A)ŤŽŐp‡úë@QJčŃąWR¬8 ŚRKm<(Ż,2"?ÝfRúPTWAá?G¬­íÍíŘłÓ¬<ómÜyΫ!đĺť®‹±˘j {§ĽľKďŹcĆřĎ#üöŞĺvąŇ7ĺ9z*hín$ŮĺÁ+ů™Ůµ ÝŹOZŚĹ —Ę(ÂLíŮŽs銒ĆŃ[Óřfę/ Űj HÍ4ćn";—üŮü=+ DhܤŠĘèa‚)µa)'°”TóYÜĂ’kyŁŚôgBüj°ŕg“éHbQ^‰ńJ @‘<;¦hń$±$r¶ ÎL’dţĽî€ (˘€ (˘€ (˘€ (˘€ (˘€ žřő¸˙€˙:‚§‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š(®—á§üŹşý|­sUoGÔ&Ňu[Kű\yöҬ©»ˇ çÚ€/x×ţG-{ţżî?ôcWˇx`ëZW‚4đšĆŹáËk—iŁšA™î†z° Ś ŹĂŹ1â_čzÜ7’ EmŞ\üĆń/\áÉÉm›@9çó©mĽi¦\řOÓĽEáőÔ¤Ó”Ą´«rĐüĽ|¬äp?*`h|lŽ7˝ĐŻĂ4÷v ÓOÂLGńŹ®,Weµ>´úkř'Äú}šĹ Dš=ŇË/Uő9ŕqéÁŻ,ń·‹?á'}1’Â;c…R7ܤÜÖô~<Đdş¶ÔŻ|#nú˝ľŇ˛Ăpbڞôm€cŻÖ€9ëÍg\đ÷‹µ;ŠişŁ;Ç:Ŕ‹´d‚@#€kşř­ă {JÖm-l5†Ţm>)$@Šw3nň;⼿_Ő'Öő›˝Jč(šćBě«ĐzôÖßřăLŐě ]sĂŢj0Ű uĽ[¶ŕ P9äç­ 4ľęoŁxÄÚŚYÝmsg&ń(ČüFGă[ž?Ó#Ó| ݵ¶ Ąî«ět)")ü·nü«ĚôŻ}š֋ö_3űI˘>w™Ź/cnű¸ç?QZšŹŽĄżđ݆§łË[•Ĺ×›ŐTťŁfŢŔ×µ0/řÓţIŹ‚l\˙čbµĽCƧđż?óíi˙ˇ%sÚŚě đě:'tTŐl­ä2Űź8ÄŃ’I# r2OçŢŞkľ2źWń^ť«ÉiPX4^E¤m¢6í»±Ôúăđ Lńő[{K Ó,–Z¬1[¶Ńűµ$ůüĎ­g,ií¶5  z›LźÔšâuOýş×]‡ě_öĄäwyółĺm?wîóź^>•#xç?G‹?łżí×Ď˙¦>_ßŰřôö  üE¨x-ż´Ł¶ŃuÔ ‘RVąĘ‰2~b3Ó=«'á§üŹşý|­iÝx§Â—s šLť˙ÚrpÇľ6ú×%Łęi:­Ąý®<űiVTÝĐsíH Ţ5˙‘Ë^˙ŻűŹýŐęZFí#áLJƙŻYh3^'šyÓ-9 Ŕčzĺ\G‰|WˇëpŢH<)¶©sóÄ˝s‡'%¶mçźÎ“Dń…Ś~DńŠş­•ł´–ěł´ONHČę2OĄ0:]麇Źü%wayiwxň[Ąě¶Ă ň,‹ó~9ü€®“Ä#ŐměµĺúŻŠÖ÷ÄşnĄ›oii§ĽFHpÔ`p[“ޏ«:§Ť~Ýk®Ăö/űRň;ĽůŮň¶ź»÷yĎŻJßńMŢźŁ|t–óQŹ60Ͳ»°L*wcľ†ü+ŁŐ.|A¨Ůë3č~"Ň|E§K´–2 Gžs8äţŻ:Ô.ť®ëI›ĚRa'Ó=85®ľ=Ńôčď¦đď†#°ÔŻ"hžvşiuÚ¸ÇĺŠóş(˘ŢńVˇá;é®´ĹžXü¦Y°ĆAěAϵ”˛Ës© ¶$“Ë.ý¤ ¬ÄçôÍmxÄ~Ô¦ążŇ Ő#’IqňQG·N˙žĢK™%Ž5‰YË*/DÉÎŇ€=Źěţ2˙˘{áŹüŹ˙ŽW–xˇn—_˝…•˝…ĐŢ[[¨Xă8(€?«ýŁ}˙?—?÷őżĆ«Čď+—‘™Üőf9&€^ŹđßP›JđOŚ/mvý˘·1–PŰ[,`ń‘śţçčß ďSOđO‹îe·Žć4ááŕHĄíÁ<Ö5ő‡Í~`?RŐ.ĽIđž{ÍaĹĹĺ– ±Ĺ9PiQp?ÚţU2ë·úÂ] ]*ołÜKu2B‚Áw1 ddăň®wÄž-¶żĐ Ńt])4˝9%ó¤O8ĘŇ>1É#üŕV}÷>Őá 7Cű6ß±Ěňůţfwî'Ť¸ăŻ­B¤ÚI­/{Ąâď[x®M Ţ)SHÄłUśŚţ÷aÖ»}{ĹZ–Źń.ĎAÓĘCŁĂ%˝·ŮV5ÚęásŰ?Ĺú}kĆA ‚ď^Šżl帶Ե[Üë¶č/<öPHčĹ1Ś˙‘Š*Rµ’WZ§áŘ#Ňľ&řµ,TDŮ\Ľj ÷[zV˙‡µ‹ëíGÁ°]ÜbÔlgűX`?}´67ză©őŻ-ŃüY=–·«j—p ©ő&…Ŕ}L„r8< týjö‘ăŹěëßÜgůźŮKß;nđyűż.3ďQ:2}/§č˙P,ü3ŹT·µŐő >]6ĆE‰őÜć{'ąČę=+{Ćeµ†_hľŐmu›»[ŕ‰wăj•ĺ×?•qľńDV—Ąjšję:]ă+Ľ^iŤ•‡B}ĺV5ŹÚ]xZM NŃ#ÓíLë:˛Î\đ9Ý‘–'×>R„ťKŰŻ—ü8üa˙$ŰÁGÚç˙C'Ä ĺ´˛đEĹ»ç‡L†D`9V ţuGBń}ś‡F×ôdŐ,­ä2ŰţřÄŃ’rF@ädźĎ˝eřĂÄsx—SK™ Kha‰a‚9 č3߯Z¨Â\É5˘żâyă z?†Zf¦šŚ‚ú[ç‰ĺŘą*`cě+áˇo|IµąŐČş•·ĚĹÔ|̨pHéÇđŞZ‹mm)McFµ[TŽBŃŰ3™TŚ,y<Í%IĄ(ĄkßP;ßřźQń}Îż¦k®·RŮM2DČŁÉe# gŚţ•äőŢÝřňĘ+=@h>‡MľÔÇqsç™8nˇF3ţEqú%ňişĹťě–ńÝ%Ľ«!†Oşř9Á«Ą6íd*ö9ţϡi¸?0ł´´Ýě.#ňS^wămvř‚mFŢĹ,cuUň”ç8IŔäÔóxŞGđu¦„¶űMĽľgÚ<ĚۏVőíUVV±Qv6~%Ăö ?H°l–îR=wLqúTÚNą©k> ńHÔîšŕA^ĺnXç öĎřËÄßđ’ę–×oh ŽÄ~W™»wĚI9ŔĆsúV­§Ś4KK+»K ·» &O·ąŢ’9+‘Ôô¨ĺ|‰5Żü®®ő9M#U˝ŃîšăM¸h&d(Y@9RAÇ?A]ďÄ?k•µ˝ĄóÇ ¶Q»¨U9-śžEpZĹÍĄÝóK§Ř‹r‰L=ÎăÍt7ž+°Ô¬a][AŽęú( t·-pJĎ­TŁvĄa'dŐËŢľ—MđŠ.í¶‰˘$µ‹qśţşžŁq®ü47z›‰îíoÄI16Ň ŕăëú ć´˝oě:­¦}źĚű—űÍřňöôÇ9úŠ"Öüż O˘ýź>mĐąó·ô·n=şć“‡˝{um,u>Ďü+żżÖy6ůÇ]»ź?¦kĎ«©ř}âHŘŞß ŻµŘ5‹‹_[[^OźksŹ.D_\‘ČÜ3L‹VÖŻőß‚ó]j­ć\.¤±ůĹB™(Á88Î? â<ćÂo ů9ßöŘsŹîďżLף|CšîËḰ×!Ó¬oćľ ocdXâ č ďž}ĹrţĽđ˙†l“Ä· {­€â×OEŔŤşv˙<†€1ľ#>;×vck~žąçő®r¦˝ą–öň{«†Ý4ň4®Ţ¬Ç$ţfş]/ĹVö^Ô4Ň`šk—Ţ·eą^ť±ÔcŽG_Í˙…ňţŁqm»qęsśÔ>2ńń.«çپʩŚFrIÎRjcNJZíýXnJÇWâ›2˙â.٧}qi3µş[ůQîÜĹr{sŹÎ±¬´{»_Ťc§¬WÓ[HX5ćvď>=3ůâ­/ެĺšŢ˙PĐaąÖmÔ*]yĹA#ŁĆ3ţx¬M#Ĺv&—Y‘yf-çFxW Ô{vü©Ć3JŢ@Úąčz}ĹƧ·m©ëÚ~«–’żŮŕ\ůl:8č>ľ•ÇxkţI÷‹>¶˙ú>ÓĹú^šn˙˛|<–˙i…âvk¦f˝ éߊČđ·N†×qMh—–7#žm»€Î=Ź'ó¤ Ňzv$jZÉ(˝˙°š˙č Z3ę·ľřáöѤű;ÝÉ+Ď2¨%Š·äťµâĂĄAĄizriúlRy¦1!‘ťńŚ’~µłŕ‰üCwˇÉi§éş~Ąc ąQxůNyŕ=sNKKľŕž¶B|Iv˝źĂO2ž{ËŞŚm,yŔük®ŐoŽ•âHmâ×ôű2Ô"6žÉÉLAůzx®3âťĎ›¨ipI4rŢ[٢\ŹĘ˛däqţyŤă=>îX/u_ĂwŞÂˇDţyUr:L`Ôň9EiÜ|ÖlçĽB,‡‰/NžČÖ&rŃ”ű»Iεu_·ÂŔ¸ÝťžD[>›{~9®öĺď/&ą”"Ľ®\„]Ş3Ř»ÝcVŃަźŕźÜËoĚh-ĂĂ!Ŕ‘K0#Ű‚y¬ox¶Ú˙@EŃt¤Ňôä—Α<ă+HřÇ$Źó\ś­Ôv]Vż$Dşíţđ—B—J›ě÷ÝL†P °]ĚH8ü«źńw-ĽW&„¤b ŮŠ*‰NFÁ˙{°ëY·Ţ űW„4ÝěŰ~Ç3Ëçů™ß¸ž6㎾µ„ pGzÖ’|ÍkvłkŢ*Ô´‰vzžR-íľĘ±®×W žŮţ/ÓëT|;zWÄßĄŠ’+—Ť@á~ë`JĚ_¶rÜ[jZʇ-îuŰt —ž{($tbĆČĹsú?‹'˛ÖőmRîu>ˇи°)ŽGŽź­cRĺjÖŇŢ z—‡µ‹ëíGÁ°]ÜbÔlgűX`?}´67ză©ő®OáTImá˙jqÝ[ŘŢÄ"†+É×+brzĽ~•ʤxăű:÷Ă·ŮţgöDĂ·ÎÇ›Ľ~ďËŚűÖw„|Lt·Aqeţť|.-ťŠnĆpC„dÓö2I¤»~oô¬ń­ýĄ÷‚C]±Őő›{ĐÍ áü˘0Tđ;óř ›áç‰ő‡đבť§fÔm_Ýăž­r>"ń…ć—™˘h°é–k'šě_Í–F÷r2µCŕ˙Ü]ů–qßYŢB`žÝŘ®ő>üăżçUěŻNÖü€ŻŞkú¦˝yjú˝Ű\ĽGjUA#=ŻUńG‹u[Šöz]¬Á,h"–‹‰<Í ’qśŕř ň­{RÓ//-ĺŇ4qĄÇůă-6óśç,8«Úߊżµ~x϶ßú%Źü‘ŤGţÂË˙ -dx;ÄçĂÍ{ öqßi÷Ńî-ť¶î8 ö#'ó«'ń\ŽŤoŁhúbišT2yĆ1)‘¤|c%ŹÔŐ¸KšÖŇéÓx/Y¶> ‡KÓuč4 Y.Y¤ťYÁéóž…s˙—ZµˇńŮÉ1·+«QňÜ&xb{źŔTz7‰´ôHtÍwĂĐę Šxĺ0ÉÉΖëëTücâSâ+‹AśvVVp-íŃ‹lQę{öü¨Ś©{wě=]ŹÂ_ůě˙Ü“˙@5—â«{/j é0M5Ëď[˛ÜŻNŘę1Ç#Żç‡ˇj“čşµ¶ˇk´Ë dčŔŚ~ šę‹łL‰®h´Ž—Âş—«ŰĘTĽUHe–HR<(U?Ţ÷:>¦Ł¶©}c&źg˘Ć÷÷yĚ9ěžç#¨ô§\řŇĘ+{ă˘čqX^ß!I®<âř®ŃŚÖg†ĽG›¦ŢišŤ‚ßé×LŁó l¬;‚>ňŞĽSFMM§tu^,-}đóĎĽÔ­µ[›{Љu ă W•<_ĺXľ)˙‘Â?KŹý U]WĹ6·>“F°Ň#±¶3‰”¬ĹĎťŮ$úçđĄŃĽSk‰“­é)©ZA!’ŢŮ 9##¨É?źzm¦(ÂQIŰf[ńҲđŠ1Ŕ:l@źN•Ôk:ö٧üF°ŃlŔM-–ŘF6˛śeşgŹý–ĽďĹZôľ ÔRâHRŢŁĂ ĐtďֽÓř›PMí冗öuŘ[R“oťäägśä3ÚšwnÄÎ<±\Ţf6™i çĆK¤ąE’4¸–M¬2 Hýp ÓţŐ†âßV‡^ń.ťis ŕU Ç'đ•ů{…qz–şÖ>>ĽŐôÇI6];!<«©Č?«7ž*ŇţĎxÚg‡ µľ»R˛Nň™Bg®Ő#ŇRHn›v~H“ĂňNĽWŹď[˙čt–_ňIőű /ţ€µ—á_ ŢC=˘^Ř^ IŕvŰ»Á·SVxhé’ůĘÓ”(,9;y ÇĺTţ!]HÓxoYŚŻçłŽwueĆlžŐz]JĘÇŔMOMMBÚC91™ l¬˛GÔńŢą/xüA}żgK[x"Á„QďŢśž–żbiĆň˝şł˛˝ńVµĂÍ;PK÷’Ţ!Ťť„+n®JÚJ|Ĺ F6’zőëIĘöw*0µŐŹDÔn5«ë]Vm'\Óµ»#v{GP8Ďpľ {ţ®#ÂŤáPŹ˙ :jÍ/62›6÷ÝžzúVń†™eäš'‡ŇĘúę6Ť¦7 áuÚ¸Çň®(HČôĄ7qŇ‹ŤîżŻ‘ÜühűGü'·_hňöyQů:y{xĎľs\5zĹ+ťÄ/t˝ai8›OxĘČźOóšóĘ`˘Š(˘Š(˘Š(˘Š(˘Š(©á˙Ź[Źřó¨*xăÖăţüč (˘€ (˘€ (˘€ *{/řúOÇůTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETđ˙Ç­ÇüůÔ•ŞZßÚmóí¤&ń‘{Š@Wžmĺh®#xĄ_ĽŽĄHúL­ř‚óÄÚ»ę:ŠÂł˛Şm…v¨§ROëYWeaŕčnŻtX ë¨Ô-MĂä gžkŤ­«ę÷FŃﲄÁSřH#ź^µ3R R Ž¨Í¸˘ł$‚—É—äýŰü˙wĺ?7ÓÖşO6űQł?ň÷a4@{ă#ůWo 1™ô=Ę1˘ć9ý»+çţú¦U9]‰•NWcδÍ^hZ˝űJČö>^# ÷·69ô¬™ˇ– 4oH8®×ÁÚ„ö~ńMôD}ˇL,¬@8bÍó`÷çđ¤ÔoçÖţ­IĽë«kď)% ÚTqőýÍ7Ř9ÚoµÎ2%ťŠÁ’0ä„ROéLŘŰömmůĆÜsźJď´FŐ4˙ ZlÔtÝ ݤI:~zžŹŇ«üEs§ŁjK]Ékͱ{k©ËĄëVÍ”‘»=«¨g¸^Äóšç<;˙"'Š~¶˙ú ¦—©us”ňÜĆ_cl±Ć}3NKy¤)˛Ý“»éë]M·ü’űżű /ţ€µĄu­^čţđéÓ¤ňe”Ě@ ž9 ÇĺC›éÜno§sudb®ĄXpA"’»n.—CÔnně•ć*1ą˝Zăęâů•Ę‹ćW4´K}2âY­{%śarŚ‘7N*Ď‹thtKëhm®â)íÖá]“iĂŽ? Ä®łâ7ü~č˙ö ‡ůµKş’ş’9DVv ŠYŹ@I§M °>ÉŁxß®×Rë]_SP† JöÉě-"T˝íŢsžÉîxíéZŢ'fĽđžďP·Ôî Ľ—1.RĽ©ŕśRs´¬'RұçđA4ä"’B:„RqůSLn$ňĘ0“8ŰŽséŠďlôăóˇÔi'a:Ť$ěyThň8XŐťŹ@Ł&śĐJ± Z'€ĺN ú×gŕŸ_‰/!Hn|ÉĽČăUmŤś{Uď ë—şí޵§j,˛Y5¤¬ěE·vŕv˙ Úč›];Dg`¨Ąôdšt±I ě•6ôa]'m3Ă> Ő­•~ÝŠ8¤*ŔÍ‚F~żĄK¨ßO®ü>{ÍL‰Ż-/Di1P©QÁÇ×ůSçwň›˝­ˇĆĄĽŇňá‘·ýÝŞNď§­FęČĹ\aÁ`Šďnő«ÝŔ^:tľL˛™·HŔ~śŽ„‘ůU®._EżtU¸»°ŽIJŚnoZJm˝M·k˛ZÜI• •Ł\!#ó¨kŐăÔćԚż/®ŮÚ¬q,k¦Ü.̰ţź6zqů×7áK6ąřŚ#Őm˘IRY$’_8đ=3Í%SFŘ•Mg!$DŠňE"+}ŇĘ@?JŽ˝?űR;‹}R-oÄ6Ö·ż— ©Ěr _”tŻ0Ş„ś·*rÜ)đĂ,ěVŢF$"“LŻJÓËéŢ ŃţĂ«Zé2Ü´’Ë,«óJC`‡ ÇéNrĺ Ë”óŰŕ{ŘŁľ• ·-‰$ ¸¨úVöą éÖľ‡UŇő nâ{ŹłáâŮ´“ü…IńâĘňúĘâÖć ‹–· u$# Ňâč:˙JuÇü’ű_ű źýŐ7nĚžfěÎN¤’ ˘Ey"‘ľée Ąt?ma»ńu’\"ĽkşM¬2 Hýp ężµ#¸·Ő"ÖüCa}kq ůpŞśÇ'đ•ůGJ%;;$9Tł˛GšEŇăĘŠGÉŔÚ¤óéHĐʱ‰7“€ĹN ôÍvţľąÓü$Ör¤:¤jXz§â{™n´ĎA;n†Ň{să2ĎŹŻő4:Žö°˝Ł˝¬y¬0Ë;†7‘€É¤Ó ŕ‚ĄzVž_Nđ^ŹöZ×I–外Ye_šRt=?JÁńĺŕ楧ÜZÜÁqrĐ*ÝI´€ýîŻôˇNîÖj]ÚÇ3ö[Źź÷ü-ň”{úTqE$­¶$glg 2kÔő˙ęmôűyBY™aŽH‚ŚIżnI8Îp@ü+ŤÖ/.4ę­¤Jm•Đl…'8ÁíŔ˘3rč(Íˡ[ĸŃçś<+6őŚ€ąĎ†+4i$jĚÇ Q’kĐ|}â=ZËP¶·µ˝xá–Î7u Ľ–ÎOJČř©Ziój qr,®n!ňíîĘoó‘ďÇĺDe.[°ŚĄÉvróA, ¶xž6ôu ţµł§čqÝxrmM®.’ßËŰĆ9ĎăúVߋƲމ®ď¬um8M•»„†tl}Ň{~żĘąX5Ktą4řĘ‹w•f#î9¦›’Đią- üSĄ&‰®ÜéńĘfXvüä`ś¨nźŤeU˝_QźUÔf˝»*g—¶Ś>‚ŞUFöÔ¸ŢÚ…QLaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSĂ˙·đçPTđ˙Ç­ÇüůĐQEQEQEOe˙Iř˙*‚§˛˙ʤü•A@Q@Q@Q@ÚWľÁáMkEű/™ý¤Ń;ĚÇ—±·}ÜsꍭMGÇRßř×ĂSŮĺ­ĘâëÍęŞNŃło`@ëÚ¸Ú(ą¶ń¦™sáý?Nń‡×R“NR–Ň­ËCňńň°‘ŔüŞxÜjúLJď—LŽŐt‘Ç/ĘáX6ËňŽ1޸Ę(°ŐńB ŔÎ@=»×%Ew—Ţ5Ńŵűčţ·˛Ôݤ·Lf žĄŚ}±\~Ťw†«iw=¬wqC*»A'ÝĐ˙“Tč  żë6Úö»5ő–ťť ¨LxĆ@űÇ źĄbQEQEhř{S:6łm~±yľI$¦í»śZÚOČ«Żhöˇ;yţ٠ݧ<;t®RŠ—őd¸'«5´ÝcěZ«§yţÝĺţó~6l9éŽsőE¬lđĽÚ?‘ź2ä\yŰú| cn=şć˛h§Ę•D>%˛›Hł˛Ö4…ľ{0V íĘ{{~UKÄúđ×ZČ‹DµĐBŁeHnkŠJ ;‚‚NçG¤xŠŢŰFţËŐ4¸őE—ÎŚŚLŚF V}®§žş/ílb+’¶˛ź1B‘Ť¤ž˝zÖer ĺZťxń^ťgŰčÚYŢ\ĆŃ´Ćáś n»WţU•á­xčĆę)­RîĘíO6ÝŔgÇ“ůÖ-r+X\ŠÖ:{Ä1^ééše‚Xiń?šcg|c$šß—Pł˛đ7‡QÓŇţÚC1(d1˛üGÔń^E'Mh„é­ąŻë?đę–ĆDKHŐ`Ť,"Lő>żýjµý˘ĐŃo˙€˛W3E>[hť‡Ëm±gR‚ kŮ!µş[¸WfU*€Ož…t_đ”Ř]ŮÚE­hQßOm…&-*:®RŠSÜn)ît!°˛˝Óď¬óNş`ć/0Ł#„0ü?*“Sń%˝Ç‡ßH˛ŇŇÎÜĚ&Rł< s‘É÷ý+›˘ŽE{‹‘^çEĄëştzTV:¶‹ęÄĹŁ•$1?'8$j·‰µĂ­OmĺŰ%­­´BaVݵG©ďXÔP “¸Ôw:=#ÄVöÚ7ö^©ĄÇ¨Ú,ľt`Ěbdb0y¨[C§ęZ´űçM&Ѳč4ˇy\ő?_jˢŽT¶T¶:oěţ†‹ü’łô}cű;MŐm<Ź3íŃ,{÷ăf ç篵dŃG/wpĺčÝÂşM3ÄVɣŦk:bę°ąxH”ÄŃç’2:Ś×7E7÷Š{šzöŞşĄâK ¤6pF‚8ˇp zśr}ëz?i-<—>µv‘$SаčŰÇó®:ŠN «ŕš±Ůřţ]Kâ4·D“´®@č?vÜ dľ,¶··ż]?GŠŰP»VŠk‘) ÔŞž™®>ŠNšnâtÓw6ü5ŻíPÍkĺ•Úšm»±ś{MM®řŠ+Ý.-3LÓÓOÓŇO4Ć$23¶1’MsÔSäWą\Š÷5µcíš—¦ů>Ăć~ó~wďlôÇúš5ÍgűR 2?#Ęű˛Űç~ířďĐcéÍdŃME ĺHěcńV’ÓÁysáČQ‡iE9Ť Ť° :Ĺ‹Äqř”ëkłíFS!\|¸#~8¬Š)($%Ł©»ń&›ä];A‚ÚňéJĽĎ)”.zíR0 fčÚnź{nď}¬Ec lŢrĂr+"Š9l´-–†îĄ¤év¶RMkŻCw2ăl+©n@<ž8ţ>™â+dŃâÓ5ť1u X\Ľ$JbhóÉFk›˘Ž[«0ĺşł4őýQu[Ĺ’HlŕŤqĂá@ő=Ď˝^ŃĎ»7kućoÇAŤ¸Ç·\Ő»˙ý®-}>ÉłűUâ|ůąň¶6qÓćĎá\ĺr-Ă‘ntšg­“G‹LÖtĹÔ-arđ‘)‰ŁĎ$du¬ýwU]Nú9a´†Ň”$pÄ8zśr}ë.ŠRwťÍíWÄ?ońdz×Ů|˝’E'“ćg;1ĆěwÇĄgkw˙ÚšµÝď—ĺyňŮ»vÜöĎŞTSQK`QKcŞ»ń=ގeęš$w7±@ [•¸hř‚T}k7ĂÚĽgÚb˝Óˇżµ¸P®Žv˛ăş¶2:Ö=ą¬ŠÖ:=cÄVÓčßŮZNš¶m/ť&e23¶=OOţµs”QM$¶Š[z-íŐ¶‰đ‚ĆĘ! jĽď4„`˛FďŰ;Só5çTSQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETđ˙Ç­ÇüůÔ%ł_ŢZýŹZ!ͦ Žq#uëţ áh©Ż­e±˝¸´ą]łÁ#DëčĘpQPĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSĂ˙·đçPTđ˙Ç­ÇüůĐQEQEQE·ŕr|aŁ}„ ąű\{ ŚŻŢ϶3X•×|6‡KŹZŹTŐőôäÓĺŽeڎfźś }ző  ?‰íáOí}`iéŞmýĄĽĆ;>ĎżwĎŹâőükśđ™˙ ľäçŰaÎ?»Ľný3UĽY¨C«x›Sż¶BÜ\<\Ôýz×Oŕ{ĎřfÉ> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ.8"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE¨¬ěfc€É&€Št‘ĽR4r«$J˛°ÁuSh˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠTVv €ł1Ŕd“@ E:HŢ)9U’D%YX`‚:‚)´QEQEQJŠÎÁPf8 ’idŤâ‘Ł•Y$BU•†#¨"€EPEPEPEPEPEPEPEPEPEPEPEPE=â‘#I7XäÎĆ*@luÁďL Š|ŃI¦9ăxä^ŞęA˘¤žA1Ľ’ŠŠI?€ QEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEP˝"ę -JŢâîŃ/`Ť˛öîŰDĐšîü[ʍ|7łÖôÍßL¸“Qű;śľT#ž§ÜĘĽć˝ xdźŕ}ź’Ť'—«–}Ł;G–Ă'óťpş}•ĆŁ{ Ą”/5Ě͵#QËęuʇ!Ň´ŮŻ§‚ b€n™a;D;–ášoÂím[Ć——6 o3KnvË´ §ÔçL×yŕô+«źĂWŽCc7Ú'˝”:żłüDäţtŔňż řsRń-ëŰiP‡hÓ|Žě}I5wÄŢ Ö<;iÝôpÉi#lÁ ‘ztéZu+Ť:Ď\ó4yµ=âŽ˙Éb­üŘ9VôúŐďé\ţmkĂ7Z­ľś·"9l.ßä.qó.8=G<ţ¤żü6—PĐ5 ÍB+y$žČK§˛Ück°Č,ă¨ë\†ąák˙ę0ę˘Üýˇ˛˘)C‚ç:×Cđ˝OxÚ8Ô»¶pŞ2O Ú¸[4dľ¶ŢĄx˝F;Đ­üDđv•aâźK¦ÚG„×±Ů]BąŰ¸˛°ĎŐXţUÇkž“QřŹ©hš FD®"ڶŐUUÉäת´©©üEń;Ë5ž§měń,[‡â ÎąťŐ?h;°Ä ŇĚŁÜůfgˇh7ÚÝÝŐµ‚ĆŇŰBóÉą¶ŤŞ@8üĹ_đׂőoXµŢś-ĹşÍä3Ë(L6ďőękŞř_cseŻřŞ[¸^(í´ëĺg Ů&ˇđą#ál$Äúý(žÖü ­čşLš…ü1,1IĺJ«(gŚ“€X€öúŠé­_BĐľčťď‡mµ;«Ů'Gy$(~Y™í[,$é˙9âË˙CZ«Żü=đŁÂňiĐŰĘŇËp¬&‡Ě §ĄqzŹ4{ť^ÂęßĂV¶ÖÖůó­VbV|ôÉÇ­˙ÇŁę ěő˝3E·Ó.$Ô~ÎÂ'/•ç©÷ň®?ÄÚŐ潨-ޡ1J# ^Zŕzzó]dđÉ?Ŕű?%O/W,űFvŹ-†Oć?:@p–w…ä6–PĽ×30DŤKéő݇~!Ň4Ůon-á’FgL®Ńö€ţ™«żB'ÄK8üą|°Ăř¶éščôMSK˛ľ×—Iđîą-ëŰËč–euPz–_ëLĂ^ ŐĽEb×zp·ë7Ď,ˇ0ŘżÔ©§ë~Öô]&MBţ–¤ňĄU”3ĆIŔ,@{}Et>$|-“ŹřźC˙ Ąnř°“§üPä ‹/ý hđׂ5źŘ˝í”pEfݰMq(ŤY˝­fř“Ăúʇ/Ŧ«•+.ô*Á•×Ô]–ŹŞÚÇŕ[ ?ĹÚôÚ0™äł˝µ}§q'#ň[żáYżtUŇfŇd¶ż˝»°»µŰ%á&HWŹ— Á…qUµŕ˝.gÄÖ67LV X—ÁÁ!T¶?b«ŰčzťÎŹ>«”ݧŔŰdś•Oâ)|7a}¨ęńC¤¸KŐĚ‘¶ý„çëS-ÖçQyyá{¦Ô´ë˝$hň@®-®ť¸ŕw÷˙ë×+ˇč·úĺÓA¦Áć:®çbBŞRO»ťöo­ö›âM>35˝»:߼ą"eħ:zRđ ¶ń?Ú!šeÄ&Xŕm˛2dô>ťsíšĹIĹ>úy—kłš×Ľ9©hk—Ń/‘/͇F>™ÓxcŔ˛Ţč÷·7‘ÂÍ-¨’̉ńµČČÜă·ZŻŞęŻŕWµÓ4«ř¬ Đ‘n.2‡ĆźÖŁđ łčţ*Dśéç “Ö‰JNJ潡^čR—ţVéAeňäÓé]®,~ ř}m˘ŽMkT™ˇ¶–E -ăRA äŻę?7 Ž Ź­z‰®~xRâ0J[\O çigb3ů~µş˝µ!śJÇ}¬_ĚńÇ-ŐܬŇɱrÄ“’p=Ív·Z^ęëOř?ä:´ˇ~ÎĎ_řćnřŹÁsĂ2>›+Ŕ­ yĆwó»5Îx{K}cV†ŃÔ'tŹýÄMl|BFţÔ±m§i˛‹µ?„ć–ĂÂÚÝöžˇŻ•‘ ۸¤g©ÇçůTÂĄHĐć˝ŰµľzjTˇM×ĺµ’ßä`x†[)uiżł XlĐěŚ üŔĎ­\đ–• íÄךŹe’ů“źďz ÷?ç­jŢ]O¬xâ÷VP÷\*[ÎP+8=WŽŁŻů(]:ëÂv|:Ĺ­˙[rŽ g“¶qéţ”ÝV©ňm­ŻżĎúę%M9óoĄí·Ëúčq·˛Ç=ÜŇĂ Ă1+ôQŘWˇč2ÇŕχĐř†Ú(äÖµIšidPÂŢ5$îJţŁńçľ!Aľ§a; ľd ËsřÖ׉®~xRâ0J[\O çigb3ů~µÓFjpRG=X8MĹś•Ž© _]]j–I¨ÉpK·ĺ>br[ŹZ˝ă›KK]BÄŘŰ­ĽsYÇ1E$€X·Żá\ĺu^>F3čň%NÇŻřŠÎjŐ˘űܸ»Ň’ícHŇŻ5{ „&FQą‰ *ŹRMK¬čWúBĆ÷‘Ż“' ,lńżŕÓđĎ|řĄ•q‘!m®S'ˇôëšQ˝·o5µ†ť{™ąłÎá”>0@8ôţµ´ý«ŠZ'oĂ×ô-Q‡łćoVŻřú~Ą ?ÂÚĄýĄ˝ÔGöy+#Č sźzĎŐ´Ű­&ń­o˘ňĺ8ÎA úVöĽě< á´ěfťő!řţf“Ćě^ÓĂÎç.Ú|y'©˘ťYą«Ú͵÷éAEŰt“űÎA–?|>‡Ä6ŃG&µŞLĐŰK"†ń© rWőʦXßx›_[h Ë{#>ç!C7,I?ťuţ$Fąř=áKÁ)mq<2cťĄťĎĺúÖgÂ/ů(ş7űď˙˘Ú»Q÷ź |Ii¦O{%¬L°)y"ICH«ë´{sŽľŐ‡áżę~$˝km&ßÍt]ň30TAęIŕV´~'żđťBĎĘ–ifž)pYYYÎr‚şO…ćĐxĹâćŢ{…Ä&h­,­OCé÷łíš@qŢ'đŽ­á´†]F6ÓG<.6>™Ö¬xkÁĎl^öĘ8"łWŘ&¸”F¬ŢÖşoS±“ᤶz6‹©Á¦5âČ—7R+˘ÉÜ)úz{Ňhú­¬~°Óü]ˇ_MŁ žK;ŰWÚwr1%»ţŔăüCáÝKĂÚ’Řę¦p`ĘęN2®|)ńG›,fŢŘ:”ÔyśňúőëŇ›ńE]&˙D’ÚţöîÂî–Ů/ 2Bą.A‚; ęĽu˘ß´†…& Éna`8Řßř}ěýhČ.`–Öć[{Ú9˘bŽŚ0UÁŁ®ŁâSăýof1öÓ×?®k'RĐő=2ÎŇîţĘX-®×t28áĆ3üŹz@jxűM¶ŐŰTŃ ÔĹܱD†Y ů9l09ÎGĺ[?ĄŃěµ[­KЭ쥵™ÝÇ!,ęS;vžś°ďÚą/ «7tÂŞHQg§Î+âň°ř‡¬±S´ş`ăŹők@ ŃţëÚľźg}i¸´ş VY&  ·źBOAXž"еęMcŞĂĺNaĘz{Ž+±ń„®>x. ÄFÍ;2úÇő?ť'ĹG{Ť7Á’ČKÍ&“f=XŕuüéJÇáŹď, ¸Xm˘3§™2Ϋ#ČăükGđ¶§ŞëW:L1Ç őşłJ“¸M»Hd÷Éč÷WzoĄest÷rĂ)S;’Yű‚sߤ}ăO…×1]Ĺ&´V‹j­*Ésów¸ôé\†Ľ9©ř’ńí´<ÖEÝ#łD¤ž•Ö|i†Câ 2AŰL‡ ÁÁnő€ôŰtđŽ˝¬ęwzÓbd‚[;ŘgÎ>˙ű#wó  /x;WđÔPϨĹv¤đČ ôĎcĹ\ŃţëÚľźg}i¸´ş VY&  ·źBOA]^˛Útż'm"ÎöÖËűELkváÉ8e?Ýţą¬ŻJăáG‚â DlÓł/© pSůÓŽń…¨xwRkV*p †SĐÜq]—Ă]éńÝ%¬(dMńÁ$Ádq콿VźÄy°ř{¶ żM„ĘíÜ|ąĎëV~%Űë’|\Ť´Á7Ú[É6Ł€ŚśôŔmŮĎ´çé—łęMŠÚVż2y^@6üŕŠčő݇~!Ň4Ůon-á’FgL®Ńö€ţ™®‡áŕĽOŚ›u÷Ťő@f0Ű'–zmă8Í_Ń5M.Ęű^]'Ăşä·Żo,w˘Y•ŐAęX}­ydž|9©x–őí´¨C´iľGv ľ¤š»âok´Žîú8d´‘¶ ŕH˝:t­?‡:•Ćťg®yš<Úž‹q Çä±VŤ~lŹ«z}j÷ôŤ.6µá›­VßN[‘¶oň8ů—Łž R†şďÚ§‡ÂšĚqÜč·ĚŃ"˛ŤĐČÝ[®süëŹ×ôćŇ5Ëý=Űq¶ťâÝýŕüEiü;´’óÇ:p‚Ynă”ŕg Śţ€Ó~ Η7×$ĺ ÜŠ®?ĄuúUăxűÂ:­–®¨úľ“nn­.•B»˘ŽQ±ÔtüÇĄyÖ•¨]iZ„Ö®ˇmČřčx®ăáfńNĄ&E˝ľ“4lqݰ@úü†Ľö‰ăhíüEŕÍ?ĹŃA˝ů›ěwË»€H|v=?1é^w^„Ń›/ëçdí[Ěc¨ ‚~ź!Ż=¤EPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQETóÇ­żü ůÔ<ßńëo˙ţtQ@Q@Q@nxwŚ߇#–=ýíŁ”îtŘ®¤úá¬:(nokSxu·żqŞ(N¨«ŔĆĆ1íZ—_ń&ł§5Ťţ˘Ílă*Fd˙x¨ý:VE®ą¨ÚégM‚ăe‘¸[ŁĹ?ĽĂdŚög›ElÝřźW»ŹTK‹˝ë©˛=ŘňyĄW ăŘ«Ú/Ź|I˘i±Xiš—‘ivGäDŘÉ$ňĘORk˘€6/×LHźoo“m‹¸ăÔă&±ď.fĽş–ćĺ÷Í+nvŔ?APŃJ4á b’ŞNzIÜÚĹĚbŽůľÍłËŘČ­ňăÉéTt˝NóJ¸3éó´2‚F#Ü S˘…J 4’Ô=¤ÝťŢ†ŽŻ­ę:ąOí –•Sî¨T~VuUF**ŃVDĘNNňwe­BţçPxžň_1˘ŚD‡hQĐp=ë đw‹›B¶şÓŻě˘Ô´k˛ Ö’|Ü|Ę{ä:W+E $¬¶ÝŮ=űÁ%őĂŮĆŃZ´ŚbŤŽJ¦~PO¨­KkV©ok|Ë *˛+`zA¬J)Nš´•ÇĘńv.işĄî›vnlnŽA Ô M¬kšŽ±ĺŤBŕȱýÔ GŕfŃGłŹ75µyrňßBŐĹýÍĹ•µ¤Ňî·¶Ýĺ&Đ6î9<ă'ń˘öţćő-’ę]ëoŠ!´ Ş:?ŤU˘šŚWAs7ÔęĽâćĐ­®´ëű(µ-ě5¤‡72žÇů•‘oŞÉĄëí©hE­ r»[nĚjr;˛ ÚqÎk2Šb$ąšK›‰g™·K+vĆ2IÉű+-ßgŹbŤ›ŽO dţ$ŃŞkú¤PßĎćÇe‚±Wb€3ő95źEv6żüWmf¶Ńꄪ.Őw…ÔĽFOă\ťŐÄ×w2Ü\ČŇĎ+wc’Äő&˘˘€:‹_řž×Kt:«ýŚGĺxŁrĆâ¤ô÷Ş>ńFŻáą%m"ě²ŕH…C«ăÔkŠč5źkúŐŚ–zž ÓÚČâCŤtĆ@öV}ćł{ĄŘé×3ﲲÝöxö(ٸäňOâMgŃ@¦±ŞAe üţlvP v č8?S“[Ö_ĽSe§-”Ły(»š4gUô Fk‘˘€,C}u úŢĹq*Ţ,žh1Ý»9Î}k˘Őţ x—VÓ^ÂűQ-o Ű H‘ Đ®VŠÖđďµ_]<ú=Ű[»€®6†Wŕ‚ Zń'ŚuĎĂ:µé’ÝrĨ úŕźĆąú(°đ÷Ś đć‚ńhúj&ą0t“Q‘˛QIŕ"öăőěkŹbX’Ä’y$÷˘Šěu˙Ă6€ş‡´äÓ4¶!§ů·IpñúŽśôJç4)ěmµkiµ[V»˛FĚ+m/ÁŔĎ×FŠčĽe⫏ĎlżgŠĎO´O.ÚŇ»ăżsŔü«ť˘Š(˘Š(˘Š˙Ů endstream endobj 142 0 obj 15008 endobj 143 0 obj 7263 endobj 137 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R /Font5 28 0 R >> /Pattern << >> /XObject << /Image15 140 0 R /Image16 141 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 144 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 145 0 R /Resources 146 0 R /Annots 148 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 145 0 obj << /Filter /FlateDecode /Length 147 0 R >> stream xśµTÍnÔ0Žs@ÚyŐnUĽ¶gü'qQ$8TBŠÔCŰĂ č®P¶e o…¸Â•}‚>C_f’f“.寂ŚŰ_Ćţ¬o>g V¸ßČxî_¬` FcsHŢP“±=ç$éV€ÁÇ`šĺu?qĆG’A [y/áN™d ł‡ő›ĺÜŔâ-38i1ZćĐhr2Îw˘ZÂÉ<çXlĂÔokcňVE°äQ4`ĘŃ ¸ÁęF„ľĹúµ=¶ˇRLťşý¨‘¶›HOA'O6{NŇł5±Ó?Gç)ó °î&¦(5H˝Ë$‡TńŐ9Ěžśťľsŕ9QžŐÉÍşfnŢé@PµE«^Â!LŠSh¤š_Ô\ĹUyY~*öÔ¸ř6e!ĺ‹Ú-?OáŞg°WýË3ˇ#ťÉĄ6™BőZČ~#ăŻĘJ™ëĄŤ‹Ĺ#ěY.¬ Á:m­¨M!˘kęŘo0~ú_;͵pžÝĆ7ŻőrQRnYĹJĚž®ć‹W6Â㳍h?5|¶^®8&“±±»3˛×Ş{ČÇ(|böëu=ň÷V÷rą˝ĎłÎÉěSş¶í Z…[]Ť¤ĂMS—_‹Źęú証Tď;Wj_Uj¤vŐńQűy¤*~ďłůÇ#nEůˇĽč ׳ń_K[˛ž¶Ořçî–řuĹç endstream endobj 147 0 obj 519 endobj 148 0 obj [ ] endobj 149 0 obj << /Subtype /Image /Interpolate true /Width 942 /Height 452 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 150 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔÄ®"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(Ş=ďü}?áüŞ ž÷ţ>źđţUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEPEŞ 0QÔśPQ]¸řaâo6X͵¸t(3¨2pËëׯJćtÝ÷PÖÓI‚-·Ěí—!ۆPr§CPŞAěŔ΢şëż‡~"µÓfĽ’Ö2°©y"YU¤Uë’ŁŰśuö¬oxRńă[iVţk˘îv,Pz’hU"ŐÓ*ŠŢń/„őo$2jP'‘1ÄsDáŃŹ¦Gz˝iđű_»°ŠîŢ&€\D‚eŢč}ÔqůŃí!kÜNŠŘń‡/ü=%şę [„ó"’)«üŹJزřqâ;»(îÚ2'™2L«#ݍSýqC©®Ř}©Łč7ú¶´4›X€ľË‡n ‚H9úMD˝Önn`±Ti-áyä ŘÂ.3üęś’ęeŮü:đ|ľ!ż·ąť"“KIĚS©›cź—<˝ÇJŹĹţżĐţŰzVÝtôś¬ag áKar:ôĹGµŹ7%ő˘şOx/ZńŁ]ŘAÚ†Ř%š@ŠÍč3Ö˛µÍűCÔËT€ÁpŁ8$AčAT§ůSÔ Q]/l-u ]z;VIâÓäžs•eî?1NO•\i\樯N‹ĂsËŕĺČLŕ‹ÁĎÎŢRÉϡ5Éé:%ĆŻ­^IĄClĐŰOżĘš@ŞWqÂóÔ`bˇTLn-íĐřőgOĚ·VÖ„LĂnA^ťr;Öď†< -îŹ{sy,ŇÚ‰,Čź\ŚŤŔ;u¦ę%f­»#˘µőťóDą·‹PfnWË?çĄuŢ*đěţ »ţÄ´†+0«ĺFe \…¶‚ry?JH«j¬óŞ|PÉ1anĺT»mRpŁ©>‰˘’žQ’TbڤrŕŠôżŢźéřKFTŤĄ¶¨Üíćgęąě1úřŮ'Ń[~đ¶©âU»ţČ…fk`ĄÔ¸Só3ô5kÄŢ ÖĽ9eĺü15¤Ť·Í‚@ę­čqÓżµsTWKáŻk^!łkËbŽĐ6Á5Ä‚5fôëYZöŤ ę/cŞŰ´ Á †ˇpEgÓáŠIäĂÉ!訤“ř ě řcâi¬íîÖ3ŕ¬-2‰’>bľśóÜzVhřSÄlAĄc)— »őŕő  š+ŃśUĚ—Pł1(®żÂ:]„VZŢ«¬ŰýŞ-4*-¸|+»1‘Ű ~u˝>©č){am›©Ç6ǵG,˛&>đô˙őÔóëk—Kś­»ˇxSUÖ­šćŇ(ŇŘ6Ń,ŇV>=jŽŻ¤^é˛Ô!1OÁ †ˇu\É»\V{”(­;íöË]]"tAzΑ… Ëăţ"™&ŹzšÓi"÷ÂO+ËCś·ÖŽdf}ŐÜř]·łC $Q´ŽË2¸ űâ±t=˙\şh4Ř<ÇUÜěHUAęIŕRS‹W¸rł:ŠŘ׼9©hk—Ń/‘/͇F>™Ň#hú?4;Ű­ ű‹Ă0wyĘäžßĘ“š˛k[‚Źs˘µµËű-Nkq§iQiŰr¬±Č_y8ĆsŇ™}ˇŢŮk«¤N/YŇ0ˇ|cźÄU'Ü,fQZöţż¸ńhѢĺfRĄĆ2Ł'ź «·ľ ÖěôÉ/¦·O.!şTY™éó+Úú…ť®bÓĺ†H‚ct»Ór‘ą}G¨ŕ×ođżN˛?Űţ§¸·Ń , ÷d‘ł·?÷ĎçŠćĽE®_ř—UűnĄ"ĽäĐ*…TPNNM1TWn>x›Í–3mnĘ ę śňúőëŇąť7E˝Ô5´Ň`‹mó;GĺČvá”éĐÔ*{03¨®şďáß­tŮŻ$µŚ¬*^H–Uizä¨öç}«ĂžÔĽExÖÚUżšč»ť‹T¤šHµtŔʢ·ĽKá=[É š” äLqŃ8tcé‘ŢŻZ|>×îě"»·‚I  ™wşEő~t{HZ÷“˘¶xŽęĆ;”´ŤL‰ćG“*ĘëęźçŠHĄvŔä(­mĂ÷úÖ§5…˘F—Q+3¬î#Ű‚÷Éé]ÇŚ~ÜCuš$VńÚ­Ş´˘K‘“';ÉéŇ”ŞÂ/•°<ĆŠî| áÔ׼)â?&Ín58Ě lÄŕ¦ć;ąÎ’kÄľŐĽ;ęFm¦8Iˇ:é‘Ţš©' `Q]‡|¬kÖŤwe ih­°M<‚5fôëYşĆŤŁęgOÔ­Ú ˇŚ) ‚BŕŹzjqnÉę}ݍxzţĂÄI˘\¤býŢ8‡rřŰĎâ*)ôKřµćŃĽź3Pů>ZrŢ™éřÓćO¨´Wa©|:ń…”÷/ĽËn»ĺHgWt©#ü+ŹĄĆ_ ˘Šî¬áŃü?á-7RÔ4´Ôďur«$…V4SŽ0:ôüý«D®LĄĘp´V˙Ś#Ńľ×mq >Ř.!Io’LÝrjݧ€µë›Dť-âC"oH¤•VFĘ­®öBö‰+˝VŠŃŇ´[ÝOWe´`^eIÜ ţF“HŇ.ők‹lŐYŕ‰¦}ÍŹ•qźçJĚ®dgŃZžĐoőű§M9EÜě͵P{šµ¬xKVŇ,ňö(ÖÝd‡Y$dŽ˘‹;\NqN×ÔÁ˘·t/ jşŐ«\ÚE[ŰćÍ EfôëTuM"÷KÔŤŤü&ŚŚr=#‚(łÜ9˘Ý®P˘˝>î i>"µđĚÚ2Ü—ňâšńĄ`űÜ ?Đ÷ö®>ăĂwxľëCÓ±$©+¬eŘ.UA<ź\ §ŤTüŚ +Ą˝đFąg¦I}5˛yq Ň"Č Ć:äŻjźŔ~“]˝‚âd‰ôä›Ë™L»Xńž^â—+˝Šu"—5ÎNŠę˘ľ"ľo ęŤý›2¦Ňa€1×#‘\źŞŢéúŞjV— ·ČĹÄĚťÇ9'p ő=k’ť)8k¦–n/_h1Őµ O*YĄ–häĘÁśç č+cÁ+4ź|e&ě2ď÷ߦęŕ®&{‰äšfÝ$Ś]Ž1’NM^е˝GAĽ7ZMÓŰLFŇTzră[Jťă¦ú~uń$ŃüąűXeFÔÔŰî6Śíöűß­uZi#Tđž ˙‘u˙ô^]â/ë"h˙µďZuŹ”@ˇ}đ÷ĄŹĹÄrÚH—{Kci ň“ĺŚéĎĎ5›Ł&ľđ:=~ÝŻ<ŕ e`­3]Dş ̢şG‹GÓţ!Ři÷ ŻęzÜBżk–qŽÇ8ĆvyöĎÖĽ˛ëV˝ş°°˛žrÖÖ;ţÎ@ň÷[2y®kyľ"x Á_ÚŤűĽaü¤Ţ@9¶2Ż|Ń*Sµ—źâŔë4Hţ=ÝBîžp=ÉŤŤfü5˛¸łÖĽO%ÔMvÚuÄrł lŹČ\=Ć­}>®Ú¤—.5“Í3 wúŚ` ŘÖżŻë\˙‡Ľ_®xzJżh`c¸ĆČ®ąőÇáYš¶§{«ß=ćĄp÷/ŐßÓĐ€{ Ó’–»+ţ Moˇęw:<ú¬Rľźm’p>U<­ż†‰^Űţ~­f‡ą\˙JËłń6Żg \č¶÷e4ۆÝ$[Tç=pqţµCLżąŇ±—Ęą‹%hldx9 ­fą˘Ňvw=“Nu:–°ęF4›ŤăŘ SóZń ¬Ý?JŐ‹ÄZ¬GR1Ýu,‹Ż‘yśç·xôÇZ]Äz®„“&•uä,¤Z6Hé÷ő¨„.T¤™·ńeOü&w'\|˙ŔEV}ĹH€łť<ŕ’zÖ~ŁăOj6RÚ^_ů–ňŤ®žLc#ę5•¤j·Ú=ßÚtۆ‚lm, ŹB… rr°şćąZ DŃäóżZô/Ď(ř˝g‡a˛{d_`vä~§ó®3Z×u-nâ)ő;ź>X†ÔmЏĎđLĽÖoď5…Ő.gß|¬Ž%ŘŁq´ŕ qÚ›‹něI¤_ńąřÓU`8,qř×CńĆ&7k †ęÚ)clpF1ý+†ż»žţňk«·ó.%mÎŘ'č8®Ş?ĹyáC˘ëúr_5ĽL–a¶ÉnqňęĽŔw«Š˛HOVhü5‘âđ‡Žš6*ßaA‘ďĽĺ­|G{mákݱş•fbŔ—F”ç;Fx5[NÖoôŰ;ëK)ü»{äÜ&Ĺ;Ôg$du=1YôÄzőäş, <*ú˝ŤőÝ2ŹôI“qÎě÷?6?Ŕř•©-ĺ߇Zm.öĆ-•í„– FxĎ_ZÁđ猵ßŔđiWĆ;v;ŚNŠëźP~™­j÷ÚÝűŢę—/qrŕí€:{ `{‰4]nďă.—©ŮĹ3éŰ ‘.‘sDŢ tçćăľęó?‰ň>ëźőňŐŐxOTŃlm4©u/je-™'m-`—`e „ĎB2>•ÉŢëZ~ˇă›ť_Q˛’}:k—•­mf^v‚GNŮüh}Ł6_×ÎČ7Ú·™ÇPý>C\Ą´×—Q[ZĆŇĎ+DQ’ĚxVUqâYí—ěńYéö‰ĺŰZC÷bwîx•bé÷—uô–R®`pń¸çi:ŇM_K˝ŃďžĎS·{{””~¸=˝z.—~–_ĹĆ ­Ň]ZĚBŽę9öÎá^ŻëWúţ¤÷Ú¬ţuË»¶…€ĹEs©ÝÝXŮŮĎ6ë{=ŢBmfă“Č<Žő‡5Š‹±ŮüKł]:çösÉoj±1=¶3ů ŰńUÖ›măȤ“MÔî5 bkv‚PđŚtëźĆĽŰZÖő nX¤Ő. ďěBQWđ5ĄgăoZY-¬‘vˇdVeÍgěĺdW2ąąˇ\ßš´/nöͨĹqBýT•Éß+]\D¬ç|:Ěű+ö@?ô%5ăö:…ŐŽ˘—ÖÓ2ÝŁäő'9Ď^őm|CŞ(Ô€»8Ôăëä_Ţuöă©éŠ%I· )¤ořV7şđ‹!„&ýÄ›G$€ä“ůVuhôëďĎŞG˘ŰéÓ}©a‰’\pIü*ä4m^űF»űN™pĐJFŇ@0ô đjĆ»â-S]1˙iÝ4©(B¨÷Ŕźz§Íqs+,¶zv™á]őą5KŐ» ,6đJ~™ţ#»ůÓľ&YĽ6â9bQdź,Ç.Ł=úŠŔŇü]­év"ÎĘôĄşś˘˛+ěú*†Ż¬_ë jW ;BžZ3(r?SIB\×`ä­cąńMťÄżlÚ8™–Y­ĺBWnOáFŤ4#ă<ě̸7"“ýíŚ1ý+šµń·-lÎEÄ*»”RĘ=šÂ·mב´ł4y›’ËĎ-ęOz7k>Öe{ŁŃĽ¤jú}ď‰eÔˇš(šÎef‘HżPGŻäzŐ›aáý˘¦\BeŽŰ#&OCé×>Ů«i®éze­üßđ‘ßkwrÚ˝´1KŠ©»üßA\.Ź«_h×_hÓn^ HÚHÁzx5*.Iü‡t¬u®ˇjţ{]3JżŠŔÝ âáĂ(|`€qéýkBMjMá÷†š;;Ł)śuśŚu®?]ń©®ůcSş2¤|˘  úŕÍUąÔîîtëK ¦ÝijX›@۸äňO>µ~Îé_¸ą‹:¶°Ú¶ˇͶvľX ¶Ö/-H9#'žkłńMťÄżlÚ8™–Y­ĺBWnOá^o]ŻŤĽAk`¶pę.!Uؤ˘–QčŚÓ”Ů}ÎźBeŤH#ÎśqěŚ+;áěŇK­xĚrŢm…Ă>är3ů×%¦j—šf˘·ÖSî×8¨cČ ő¦—MŐ/4٧–Ęo*IŁh¤;CnVę9Ôť7fĽůާÂK,žńZY‚nH‡!~ńMÇ?¦ęĆkKŕörJčfŕ|­·™1ŐsĎĺÇZŁŁj÷ú-×Ú4Ë–‚R6’!‡ˇV5ßęşď–5;¦•#9D AőŔš|Ż›ČWV:ż‡¨×^ńŤ@´ĆŢ‚ŽI Xž? ŕ ˙_űĂůÖŻ…řĘ;MŮd'Ţ1î;żMŐÁ\L÷É4ÍşI»c$śš˝ˇkzŽxn´›§¶Ť¤¨0ô äƶ•;ÇMôüëâIŁř+sö°ĘŤ©©¶ÜmŰí÷żZę´ŇF©á<˙"ë˙輻Ä^'Ö1»Ň­~#A$şNŻuŞ©‰íšŢ`ŔW3ň˝VňóN±±¸›}­–ńn›TlŢrÜ“’;ć·,|âk+łSq .Ä-3 ô Fh•tóüX7!î;ćş?Ś1ą×tÉ1FÓaĂc÷»× #Ľ˛4’3;±,ĚÇ$“Ôščí|uâKm,iĐęoö1#DŚBcÉRz{ÖŽ 8¸ôgÁr<_I„íĹĺđsŚôŚâ“¦ŰoÍ0=î]?†>mVĘöęЇú,ˇIĽçvGSÎ?Ăř‡¨ý®ď@/¦ŢXGol†ě‚ňFĘxükĂŢ.Öü? ĂĄŢŕs¸ÄČ®ąőÇáYÚĆ«{¬ß˝ć§p÷..Ř€Ŕ”)5+ż?ÄHń……Ěß,(]’YífF‚‹łqĎ Úk"öňňŰă ĺÖŹlo®˘Ľ¬ üx0ü·VUźŹüMg¦­ŚŁv!(¬ęľÍsöw×VwńŢÚĎ$whŰÖP~mŢąĄ RJϵ€ô»KÄÓë-˘.±ˇëQĂ$óŁHLMĎĚŚzň}qôí^aim5ĺÔVÖ±´łĘÁdłŇę_|K¨ŘÉis¨ź&UŰ&Č‘ ŹB@ąÝ>ňăNľ‚ňĘSĚ7í#§ZşP”oĚšľ—{Łß=ž§nö÷((ýpzzíŻäX|ŕűé,VţÖq‘6v–c€=Á?…qÚţµŻęO}ŞĎç\° »hPčU­ Ĺ:Ć… æŢác¸ĆĘ®ąőŹÂ·‹Ks:‘rµŤďivżjđôvvPéÓßB­,Kź‘€3ôć¶Ţ-.ÇÇVV3ŤoPŐá–%űT“ v9Ć3°Ďă^m©ęwšĄë^_Ü<×-ŹśńŚtĆ8…mźřŚĂÚMňcĺ¦ăŽ@'?×˝W2˝ĚÝ9Y+ť6ŠĘź® nš`>» gü?´ž×VńÜDŃĄ˝„é#0ŔVČăô5ÇĎ©ŢMŞ6˘ó·ŰZO4ʸS»ÔcĄjjľ2×µ[g{~ÍnÜ:Ş*oúhRCtĺ˛ě‘µŕXfĽđЬěké"¨żyÔ=xČüjkËí?á3E¨Ç$.Ú€xăa•J÷§9?Ťrľ’(µ@óęÓi*âćfl˙w Ď5ŃxźZÓ‡†?˛¬u;­ZâkŻ´Íu:2ă Ś Üö­4Ő…(ľ};ÜŃş“JO‡žmJŇîâŘGú4ľă÷˛:őÇăY8żűMކ^ÂęÉ ·DCrAwŚó¬}Ĺľ‡ C§]ác¸ĆĘ®ąőÁ…PŐu+˝Zőîő Ú{†ŕłzz8éIĘč¨ÓjW~g{â«+™>.Ú´p»,łŰČ„ ¨LźĂ¤ŃY_ă\ĺH#Î~Q°®^×Ç!µ°[8uŞěRQK(ô Fi<Ş[iž.µżÔć) ů†I,rQ‡l“ɧ̛ůéÉEßµŽŔqŢGâ/µ‘Um'Dz>ýZçľxÓIĎüöţ†“PńŽ·ya&ź-űµ›eHÚˇ™{ŘÉo4–óÇ4ŃËGS‚¤t"ĄÉibÔNýMFńř‡TڧíRőţ#]&™¨Ű§„lěĽK¤^KĄ‰YíníŰiÜIČçÎkWńf·¬XýŹR˝3Űî ´Ä‹ČéČŇčž,Öt[cm§Ţ·Îď-Ń\íqBi1¸ÉĹ'ąŁăMÝ©6›Đ¸&Łfr´U­RKIu‡Óˇx,ŮÉŠ7mĚ«ŘŢŞÔ”QEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@)F ¬GĘÝ)*yżăÖßţüč (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( §›ţ=m˙ŕ_Π©ć˙Ź[řó (˘Š(˘Š(˘Š–ÍCÝŔ¬2¬ęőŻ^ř‰ŕí*ĂĹ>—M´Ž; Żc˛ş…s·qeaźŞ±ü«Čě?ăúßţş/óŻ TÔţ"ř‡Ať€ešĎS¶öx–-ĂńPçLń~ŚOŹő 'E´$ý¤ĹŹn‚­k)ęý´0t»Ű†ĚGĽ Ľ±˙ ăńë@V>Őo|3uŻ[ćO·b—Ž1’ Í`ÖµĄľ¸ÚÔ¶‹ýŚyć2ŢNî>đÓô¬š@ŃřĘŇűS»Žţ–4ł’Ežců×9NŠY"$Ä섌§”¤®¬L•Ő‘Đř†ĘŇßĂ>¸·…R{„ĚŕśąVgő­!ágÔü-ˇOĄŰF·ůĆâg}هÂä“ů\cK#˘#»2&v©9 ž¸ô®Ç^IŰá׆ĚaŚćߎ›·ťą˙Ç«9&¬ŻÔ‰&¬Ż×üÎkVŇo4›óg—? ä0=>”űÍňĎZ]*tQxÎ0#-ŚsřŠčĽyľ8Ľ4.˛.Ć?3wQőýj˙‰m'“ⵣ$LË$Öň)‚Ş'đÁˇMéó7eó8ĺŃ®Ű[:V#Ę\Č<ôí[~-˛ĽÓôM*ŢóN˛· ąVâ Ňă®qYľ3!üYŞ”;‡ÚqěkO\S˙ űĂC>eÇţ†i¶ýÖ żuŚđeΙ5Ýž›}ŁCs$ól7 +ö•‡ŻĂľ»¨Á „Š;™v­ř0ăĹšVx˙HOçQřŞ'ŹÄş¶ôe˙J”ň;$kIŤi2}ÂÚ¦Żd×v ·jĽ’}jߍ´¸´¨ôXŇÜA;Ů#N;™;“ďVĽD˛ż€Ľ0a mÁ>Ţ›÷qź˝KńL±ř|\çĎ|bMÝwwÍJ“r_2T›’ůśmYÓlfÔo˘´¶ŮçHH]ěp ę~•Z€ < Ö¦ÇYâŰ+Í?DŇ­ď4ë+p›•n `Í.:瑢膵ď§B%7~cÇ_ˇ­ŤqOü+ď ů—ú§x]Ú?x¨ˇ*vŔą…?ˇ¬“j:wýLSj:wýLŤsĂšŽ‹3^Ɔ xYcpęO¦GzŮđ_†¤ą{‹ÝOLąžÖ+Vžö˛‹†ţëźjd Ďđşä1ČMHmĎo‰«>Ôo›O×ĐŢ\”MĦVÄd óĆ=©IÉĹ„Ą.Vcř±v›_ř6Ź÷¸bÇÍéýáŰúÔÖŢ×n,Ňá-Po]éHŞě>†±Ążą˝¸€ęSÜ*7t…ö‚Fz×oâXŻ[â­«F˛e€Ä@ă` »đÎěÓmĆÉ ·$qZT uË;{¸Îß´$rĆÜq¸ uşĆ•¦Ăaâ׆ŐK;R ýŘ,ź­`xŃ€ńv¨Ńbáą^ÇżëXíq3 K!_,~cďëUg+1ŮĘĚŽŠ–ÎÚk˸m­c2O3ăAŐśSęúećŹ|öz” ¤´lA###§µYˇNŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€7hÝ]H űÖŃńV˛|Gý˝öŇ5oůî#Aü;>î6ýŢ:V%Şž"ŐS_mj;ÇMMś»NŞŁ$ŚĆ=±ŠÚşř‘â›’űő=ŞčѲ$…!‡9zűőô®BŠŇµ×5],é°\l˛7 tcا÷l‘žĂŚâ§»ń>Żw¨—{×Sd{±ĺ óJŻAĆ=±XÔPCáĎkľŕŇŻŚvěwť×> 08ü+3ZŐďµ»÷˝Ő.^âĺŔŰtöFŠŮłń>ŻgáűťŢ즛pI’-Şsž dţsXÔQ@Q@méŢ*Ötč-ŕ´˝) ‚'–¤NNr9çÖ±(¤Ň{‰¤÷-ꚍީx×Wó4Ó°ÁcÇ €+RŰĆ:őµŠÚC¨8…Wb岏@Äf°(ˇĹ=,'ôhą¦ęwšeř˝˛Çt3ű¡Ź=z[đžx“ţ‚_ů/ţ&ąŠ(q‹ÝŚ^čť źÎD»·‡ŮÎEm_x»\ż°’ÎîřËm ”Ć™ ő=˝k ŠSÜn)#ÄÚľŹlöú}ăE ě*¬ő î±u©ÝZI«Č×iTÁÂ’€äŚ×Ż'šÍ˘ŽU{Ř\Ş÷±Óiřcţ…űŹü ođ¬ŐŐŤ†´×Ú 5«)\®,9Ď?ťeŃIEŠ:řOŐ±­ü9ńʦË}sm Â30†Píőaţ >ŠŢđׄµo[ÝK¤B“ fEp\)Ë1žÜÔľ(đn±á«x.5˘6Ó©42MÝqźZç(®źĂ^Ö|Cb÷¶QÁšľÁ5Ģ5fôµSV𮫤ë¶ÚMü ŐË"ÂĹÁGÜpnĎĺ@tW¬\ü+ş˙„BĎČŠÔkho:Cuňđp8ĎJä|9ˇyě4m^(Ąĺc™·+3ŚŽ´ĘŃZľ,·ŠÓĹ:͵˛ŕ†öhăAŃT9~BťáŻj~$Ľ{m&5‘wHěÁQ©'ĄdQ]Š<«řj(gÔbŤ­¦;Rxd„úg±âşĎřA¤ÖüውŇ»”L×W>Ŕ@|.Iü€ć4Vź´-CĂş“Xę°ůS€`ä2ž„ă]źĂOÝéńÝ%¤HdO28$™VW_P§úâ€8Ę+wĂÚŤ–‡ytşÎ‡¤ßęü©ÜĆb`yí×µm|ZÓě,5˝3ű.Î;8n4č®(É 33篰đ "Š×đχ5/Ţ˝¶•vŤ7ČîÁQÔ“W|Mŕ­cö‘ÝßG –’6Á< 7ˇÇN”ÍŃ[~đĆĄâ‹Ém´ăi"ŹĚs#…gŹq ŰĎ$3.Ů#bŚľ„@ ˘ŠĐŃ4{ÍjęK}=ĺH̤3ůF3×ę(m%v4›vF}Ôż5µ»‹ÍRł)ó}ž¸˙ZÇĐô[íré Óˇós±!U©&ĄT‹WąNśÓłFuµŻřkRĐăŠ[ŘĐÁ)ÂM‡B}2;ŐŤ3ÁşĆĄemwm_f¸ VG”(;yĎżJ=¤m{čÎwĺ¶§;W-´»ű¨„¶Ö7SDzg}Jöäö–Đçč­­7Ă:žŁiŐ´QýžBGŇ śűŐ=cJĽŃîţĎ—!”ĂÔµV\©ęK§5f´(Ń]‡ö>ˇĄxkQéö3FáXÜyŠĎŕqŠć´­>ăTľŽŇÍCO&v‚p8<ţ0­'+芝)EĄmYRŠÝ»đ¦­ka%ܰ/—Ý"«‚č=HíT´]÷Y¸hl"Pnvc…QîiްiÉ5d'Ji¨µ«3ęŐ¦ť{y{K;™ĐĄ˘‰é*ö§áÍKLłk«¸‘`#®1# ŚuŃ|$×5+OišeµÜ‘Ř\\î–Ś9Űßň•T'«ĹÜ™BPv’±ĂHŤ˛HĄ]I ¬0Aô4•Żăůużúţź˙F5[¶đvŻqo«(e]ńĆňŞ»Ą)ÔŚ>'aÂś§đ«śíŁaŁ^^ęŘĆŠ—1]epÁŽ~µŇxŹÁsĂ2>›+Ŕ­ yĆwó»5ÄS„”[ܸЩ(ą%±ĹQZ:F‹}«‰żłâB–€<śµ6±áÝGI¶Žâę409Ú$ŤĂ€}*ÝX)r_R=”Üy­ˇ‘EužŃő$ZŤ˝••ěN¬«ň(öÎŇąyÁk™ĹB\ü«ĐsĐ{RŤU)8®•7©>¤tWK˙F·˝ĐÁuč Ş ńź—×­aCes5ňŮĹ µŃ,GŽwzQĐźÂÓ Rś~%b˝Ń\x7X€HZŠĆ†Ge•H\ }ëžRFFy´áRř]Ĺ:r‡Ä¬Jmn°ą0J-ÉŔ”ˇÚO¦zT5éßu[صÁ˘E7—¤EO˛¨ §ťyŤYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQETóÇ­żü ůÔ<ßńëo˙ţtQ@Q@Q@XşÇ{nîp«"’}kŃ>*čwúźĹ)-í fká’Ř;HŘŞI>€šóZëlľ#x¦ËM[5G˘„BŃŁ:Ż b3@ 4ćŃľ,E§ß4-sš<Łewě9Áúf¬ü-Q‡_ńKęi*Ć,gŤ ™2>˙xý+Í ˝ş‚ýoa¸•.ŐüÁ0c»vsśú×C¬řűĺƜÖ7ú›=łŚ:¤h…ÇąP úSoŔŇĽ? üpѱV+äz ŹČšmśŤ'Ŕëĺ‘‹,Z˛„řAE<~$ţuĆŮk7öZ]öťm>Ë;ÝżhŹbťűNG$d~Q±‡.Ž“ăN–a;ñy|śă=ă8¤oŁę¶±řĂOńv…}6Ś&y,ďm_iÜIČĆ@<–ďřVoÄÝt™´™-Żďně.íD¶ÉxI’ăĺÁč0GaYŢńľżáëO˛i—Ű-rXE$ję î28ü+3^×5~űíz˝ÓÜĎ·h$z0¦e¨ĆňüŃĚhÎS“vŃśpýk á°+ăí AKÁŞţń†˝áŰy Ńő·…Űs!DuϨ ? ¨uÝHë˙ŰFçţ&~gťçl_żë·J@Zń¬RkÄFäűŹá?óŃ«Łđ›nž×µťNďRlLKgbű ůÇß˙dnţJ©˙ KĆ?ô˙ÉXřŠĆđ˙Šőťćâm.đÄnfVEesĎU#ĎJďu–ÓĄř1;iw¶¶_Ú*c[·IŔË)ţďőÍPń\WR| đy…]­Ä’ů›FFâÍ·?řőrşĎڵýjĆK=OPiídq!ŚĆ€:c {*}Ç~#Ň-mm¬5µ˛˛Ç‰ €Ç'•˝cńĹ:zŮAŞ7’‹± ĆŚč=šĎńŐÁ»ń~«pö˛YĽ“–h$Ćänŕăľs]7Ć%}CĂó$nж‘«H,HĎâ?:óédyey%fy–fc’IęMtúWÄi6YŘę®–Ń ¨Ťo´zĘN){áÎĄq¦Úk‚]mOFžŽüBĹZ5ů°r>­éő«Ţ#Ň4ąüÚ׆nµ[}9nDrŘ]żČ\ăć\pzŽyü1\–…âm_AľšďJĽh&›ýoĘ_śň¤cÖ¬x“Ć:çáŽZôÉnŤąbDTP}pĎă@<9ł=돭ńş’ßc,g|•íÓô¬ąa `ŕťŰşç޵|7â-SĂwr\č÷>D˛'–˙"°#čAk2i^y¤–V/$ŚYő$ś“@ ®»á·ü„u_űO˙˛×#VôÝJďL’Y,ĄňžXš;Ce¨ä{TÎ<ŃiNJ2Mž—ႵĽ 2qö;ŹäŐĚřJĆáÍcSżąż1”ŠKk7ÚeĎ÷˝†ďçX–ľ!Ő-f±– ­ŹbŤąňÔěVÎG#ž§®i4={RĐŢFÓ.LBA‡Rˇ•ľ ŚV>ĘZŰúŐłokk˙Z%ú†¦ÖR|.•´ëk¨-ľŢĄEˆ$íä©ÇO뚥âťľřdĆ®`MżŤŰŰnńęÁŐ# ËĂ+s‘r4őó}áÓŻëVőŻů"Ţ˙°„żű=qz¶§y«^5ÖŁ;O; n8€®ÇGńW‡˙á˛Đőý*ňě[Ló+C6Á–'ńčkjq卙…I)É´rľžęŰ\´šÂÜÜ\#±Ë ŹË5ÓAk¦krjM¦.٦jIË*—ĚgűĘO^ľµĹŰ\Kkr“ÚČŃJŤąO"¶/|[­^Ú˝Ľ÷§Ęmp±Ş–ä Ö©NRć‡çúlͨՄci˙_>|˙#V›˙]Gň5O^FMoPĄOÚ$ę?Ú5J^RXť’D!•”ŕ‚;Ö®§âM[T´×÷fX ´ĆŁ‘îkG *śëkXÍJ.ź#Ţ÷4ő'ađóH@NÖą‘ęA8ţf±u-ZăQł±¶¸íłCl î#ŽĽöĹC-ýĚş|62K›XXş&ŃÁ=yĆj˛1F §E:\ş˝îßŢ:•y¶ÚÉ}ÇQá áń?îA˙ˇ53áČÇŚ,łé'ţ€ÔĎřMüC˙Aü˙Tż©\j†çý8 ˘_-zc1ŽžŐ“ĄVJiĄďyů[±Ş©N. 7îůyßąµŕ‰d“SÖüĆ-ćYNĎźâ9źĚŃ᥺đÇílÁk·HŠ˘ýćPN@őă#ń®nĂPş°–i-%ňŢXÚ';AĘžŁ‘íV<>ń¦˘mJ]5BźßĬÇ>^y§R‹÷ź§ŕ*uWş˝ˇş´»˛řncľŤâc|#q‚ŞWÓ·9Şż żä hźőßú5[á˙ěëKűŤJyn~Ń-ĨËü8ÇÍĎĄIŕ-{AđüÉy©é—wZ”3yË»UW`Ż~sůŐa”ą[—VN!®dŁŃŢ0çĹÚßýO˙Łşi®,őmVÎß]°Ô,5‚$šďü-ÓźJăő»ĹÔu«űÔR‰sq$ÁOP‰ÁüëJë°[¬)|v¨ÚĄŁV`>¤fŠôĺ;8ďëaP©]KoK™úő¬–ZÍĺ´ÓŢ9 ™ňŢç޶ţ!#jX¶Ó´ŮEŽZĺć•ć•ĺ•ŮärY™ŽI'˝lAâŤf ±G|ßfŮĺědVůqŚdŚô§(Nń’łkäś-(˝4<"욉ŠŮ”dzA¬X5kt[ť-DfÚwYŕw)éϰ¨m/îm-î`·—dW*UÚŕ>ŁŹÂŞÓT˝é9uiýČ—WÝŠŹD×ŢtÁ˙„ĂO88ýçţ‹jĂś|ůňĐ˙:Ő°ń^µai­Ąď—c ľRsž¤f«ęúţĄ«¬K¨ÜůÂ"Y?v«‚~€T¨Ôö®M+=7őňó)ĘźłQMÝk·§ź‘Óx–iÄűl9ů&·UönGę:v–ŃÇńZmä(3Ę>ĄMrZ­íÖ¨şŚónĽ ®$ÚŁ•Ć8‡jŽK©/5´ÝÎVYd $ˇy<¶ô¬Öňrżĺ±ŁÄ.~eü×;_ išť•Îż%ü2Ç´•Yś$~ą˝ů÷¬O x©ü<Ž‹¤é7Áäľîß{®;+gŠ×]_NÓíŻe:őćŻs-łŰĹ‘ş…ÝŽ~cě+…‚8#‘U†ćr”¤»t·ć,G*Ścß­˙#ąřŃn ńőăy’9š8ĺ!ÎJżt{q\5v~5ń^™â›Dş—I{}{’\¤ÄĆę?Ůíţy®2şŽP˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š({ßřúĂůT=ďü}?áüŞ (˘Š(˘Š*yżăÖßţüę žořő·˙:‚Š( Š( Š( (ÁUů[Ą%O7üzŰ˙ŔżťA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEPSÍ˙¶˙đ/çPTóÇ­żü ůĐQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPEPŁéZ6“.§áĄ´FK›–`IůÜ/Sϱ®HŇîµ{§·±UiU ›Kc uÇ©ŞËs:˛2Í(dP‡?(ô•{Ă:‰Ňuë+ܱH7˙şxoĐš…ĚÔeő"Ńô»­^óě¶H­.Ňçs¤“NŃ´{Ýfé ÓáóYFćl€Ş=I)¦\BdHk”Éč}:çÚ§Ú6›DűFÓhçużę*Ä÷±/“/ ,núdTú_…5]NĘ»XŁű4Ą€‘ä 9÷­=NúŮüÖşv™}‘ş,ó¸eŚ=?­&¨ě>h¨ Ú×R’=H-Źćh敾cć•—©­č÷ş-çٵĽą îRCPkV×ÁŐÍ´S,Pˇ•wÇ“*»ÜVf§¬\ęvZ}­ÂÇ¶É Q˛¸ŹĽsŰŇ»)î,uŤ^ĘŰÄvĄ§kd$I4 Ć…°zséNR’H%)$Ž"×Kş¸ŐFš¨ďs!I.ÎA'é[ţ-˛ĽÓôM*ŢóN˛· ąVâ Ňă®qXž!ł–Ç\˝µ–f¸’) ™O%ýĎ˝nkŠá_xh`ç̸˙ĐÍ ęŰÖ,ÂŃ4kíjčÁ§Cć:ŤĚITz’j}wĂşŽ±=ô*!—„–6 ¤údV×…–WđOŠÔpD9 Ô¦ăźÓu¬‰đ¶o´ŻÁ‡w”gŻëC›¸śß1ť¦řGVÔ,íîíâ‹ěÓ†+#Č sźzĚÖ4»˝ő­5Ľą€ Śäz{ŠčĽC#xb0Çc4ěG©Çó4ž=f’ĎĂr9Üí¦Ç–=M“o_0Ś›zů›:VŤ¤Ë©řf)m’ćÁĄ~w ÔóěkÎZ•ngVFYĄ jçĺŇ˘ŞŚZÝ•µ»7µ˙ ęş™a¨Ä‰oz ĆUĂ‘ěqX5­«Űë‘iÖ «-ř˛d˙DűAm›qüŕ c§lVMQaEP^ŹĄhÚLşź†b–Ń.lY'çp˝O>ĆĽâĄ[™Ő‘–iC Ú„9ůG ô©ś\¶dN.[2ΑĄÝj÷OobŞŇŞ6–Ć@ëŹSFŹĄÝj÷źe˛Eiv—;(u$š—Ă:‰Ňuë+ܱH7˙şxoĐšíőKđ˝ź‰Ż“ o\[Zý×›Çü¦RiŘR›NÇ9áÝ>×Xе;4…µ­ÇÚ`™}ä˙­!°µÓĽ//!WżÔ$Űk¸śÇýçÇżOÄVo…ďeÓüAaqÉ•HőŕŹČšŐř•tóxŞ{|*Ah« HŁWh=>¦‡~ktÜNüÖéąjŇ-'B𾝨_i«¨ÝęřY$*¨ŠqĆ;ôüý«?ĆÚmť•ÍŤÎŤĄő˛Ü,Ls°žŁ?•]ń O7<1,J^8ĚčÄ á‹ŚĐŇxýOA(Ű4zrCŐ~ż‘©‹Ő?QEűÉú”üoamasĄ­ś+˧Ĺ+ź™ÉlźŇ«x7J‹YńĄ•Á"%źiÁ!Tś~8ĹiüERnôlâWójgĂĆ–A¸%d>» ;żgqÝű;šv«ˇxŽ=RÎĎI[­ yíçI ,łë‘Xľ˛´ľÔîăż…eŤ,ä‘A'†ÁţuŁŕ+Yíµ=q®"hÖ ’BĂO~†¸ŘĄ’"LNČHÁ*q‘éB[Ĺ1%ĽS:ŮZ[řgĂ·đŞOp“ś—*Ŕ ţµÎSšYŮ‘3µIČ\őÇĄ^Đô]G]ş{m&ŐîgD22© çÜŠŇ*ČÖ*ČϢ•ÔŁ˛·ŢSÎi)Ś(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ žořő·˙:‚§›ţ=m˙ŕ_΀ ˘Š(˘Š(˘Š(yżăÖßţüę žořő·˙:‚€ (˘€ (˘€ (˘€ (˘€4u-oQÔ¬í­o®L°[ DĄTmă@Éŕw¨ôťR÷HşűFťpĐKŚ0A„ R˘••¬++XÔÖµýKZňĆŁreHůD GŕŞŇę7Ré°XI.m bńÇ´|¤ő9ĆjĄ(¤ )tvţ6ńËz*Łj–Ť€ú‘šç(ˇĹ=ÁĹ=ŃzÇVľ±ÔގmpËxK+Ä–ëśë[?đžx“ţ‚_ů/ţ&ąŠ(q‹Ý Â/t_Ó5‹ý2ő®ěnZß;CgÔ I­kÚž¶Ču+¦'Ý\QřăY”QĘŻqň«ŢĹ»ťFęćÂÖÎiw[ZîňShwž@ÉçÖ‹íFęţ;d»—Ě[h„1  mAĐp9üjĄě‚Č(˘Šlë>'Őő­:ĘÇR»3[YŚDĄTcŚH'sXÔQ@Q@Q@hęZŢŁ©YŰZß\™`¶‰J¨ŰĆ:“ŔďYÔQd+&:RHÎ2źB:TÚŤíĆŁ{-Ýäžeħ.ű@Ďč8íUč˘Án¦Ć‹â][E‰âÓ®Ú8î(UXgÔ*†Łu©]˝ŐôÍ4ďŐ›ů{ ­E.TťĂ•'s¤Ćţ!‚á‹PŰjG“Ŕřk*÷WżĽÔĆŁqrĆô"U#¦0P˘…­”b¶Fî§âÝoS˛6·—ĚĐ7 ŞŠ»ľ¤šÂ˘ŠKa¤–Á]—‚ĽGiáĎř…‘Ük‘-˝° ÂŻ;›wnąüq´SQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEQEWŁéZ6“.§áĄ´FK›–`IůÜ/Sϱ®+Eżł±šVľÓcżFUy m>ĽT)ßdBťöFmÓřţÎÎÓR°:}˛ŰE=”sÔ’1o_²4]÷Yąh4ř|ĆQąŘŞŁÔ“Ňš’jăRMsôVľąáÝGEŽ)o#C§ ,nIôČ«:o„umBÎŢîŢ(ľÍ8b˛<@ÁÇ9÷Łž6˝Ăž6˝Î~Š»¬iwz=ëZjysČ ô ÷±‚5Ém ™myŘ+‘Cŕ÷#ÓšnIkprK[śŐ©oˇ_\kʤDoU™J—ĘŚž ‡KŇîµ9§ŠŃUžšgËc ¸ĎóŁ™™h­ G˝ÖnZ >1”nv$*¨ő$ô©őĎę:,qKy%8IcpęO¦EĘö2˝®dQ[š7…µM^É®í!AnĐňH3z ŐMgF˝Ń¤5„O4~b®ŕHţ†Že{\9•ís:Šé-Ľ­ÜZ$élŠd]éĘ«#/¨Rk'JN·gowÚn9cn7AŁ™=™=Š4Ww¬iZl6-xmQdł¸… źÝ‚Ŕ9úץŘ\jšŤµŤš¸¸q)8źzQ—0F\ĹZ+SÄş÷‡5WÓő4E¸U ň6ĺ ô Ö]QAEčúVŤ¤Ë©řf)m’ćÁĄ~w Ôóěje>R%5Ď8˘¶ĽĄE­xŽŇĘrDYźiÁ qřă´÷žŐ"żµ:tzcG5­Č‘»†;Đçgkťť¬qtV†‰Ł_kWF :1ÔnbH ŁÔ“SëľÔtE‰ďˇQ Ľ$±°e'Ó"ź2˝‡ĚŻk™QJŁ,8őô¦P”W~4˙·‡µ¨´čšîâĆc|äŤěN>Qč1ţz×SssWAáŻě{{;ëí]Vćx‚­˝™bľa=IÇaţ4۲¸Ű˛ąĎŃ]~ąk¦ę>Ź[°˛|Ésöi"W%Śägüő§E— řsLĽ»ÓSPĽÔ7żď\…Ťăç"§źČŽ}68ę+Łń–ťgjú}î™Ckn&łnň۸ŇşM+FŇeÔü3¶És`ŇĚ ?;…ęyö4:‰+¨’ąçPzŃVhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@O7üzŰ˙ŔżťASÍ˙¶˙đ/ç@QEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@Q@­ĚęČË4ˇmBüŁĐzTTQ@ÄXÜÜč˛ci€ŔpOÍţ"™á[(G‡µmJúâřYFR)-­i”źďvŔĎóŞ:w‹őÝ:Ń-­5HaUŁGŔô8Şš>˝©iK&źrc3¬Rˇ•ľ ŚV|˛ĺ±—,ąyNŻR6ođŇFÓíî`¶űx*.1'o$tţąŞ!‘‡€<1c±šv#Ô‡ăůšÇÔĽG«jvŻm}xŇŔÎ$(Q@ `p=‡NçQşą°µłš]ÖÖ»Ľ”ÚÝÇ'2yő¤ ÖýÁA­űť/Ž_|–c¸ť>"Äő5Đkzf§qń.ĆúÚ)^ČĽ.“¨Ę,` ĂwO_ÎĽęűQşżŽŮ.ĺóÚ! ChPtë» iřJÚŇć;ű GE„IeŻ-Ű“¸0'Žť˙Jámć’Ţtšh匆WS‚î+oRńv·©Y5­Ýó4 0ʨ«»ę@śŕŰĐĘpmčiřYdřˇ-7C˝Jn9ý7QČź fű@!üwwůFqúţµÍé:­î‘söŤ:á ”Ť¤ŚGˇSkZö§­˛Jé¦ ÷WT~řĐŕîţFeP¤«:ŽEhjuŢS˙ÇŠ¸?ńďov®D‚5Ó˙ÂyâOú äżřšÂÔďîu;é//¤ón$ĆçÚ8 RM¶DT“mŽĽÓ/l­­î.í¤Š…ݰá…[đÖ‡6ązcF[D7Ď;}Ř“ą>ţŐĄ­ę•ť­­íÁ– eŰ•c’<ôý_ÔôA0Ňî|67ţí[8Î>đ>¦›ć·>n_2˙‹5xnŁ·Ó4¨Ú-"Ďň9•»»}yüýënóQ—Kđç†/íí ąAo< ç&ä°ýx?­sşŻŠő­VÉí/ď|Űv •ň‘s‘ČÔZ?‰5]‡O»1ÂÇqFEuÔ*9‘<ŽČÖńş´:W† ”™,˛ČFÉă?‘®]ngVFYĄ jçĺҤÔoîµ+·ąľ™ćťşł/j­WŮY—ŮY…ijZĄ¦YYÝßÚĽ÷‹ľb?x0@ÎzůŐB4Ѭ¬R2Ŕ3ś ňq]gÄďÁâ-rěŇ˙Ůvp¬Á†Ţ1ÉÇnxúTQČQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@O7üzŰ˙ŔżťASÍ˙¶˙đ/ç@QEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@Q@ŹĄhÚLşź†b–Ń.lY'çp˝O>ĆĽöÖŢk˨ííci&‘¶˘/Rh[™Ő‘–iC Ú„9ůG ô®—áQă;-ŘÎŮ6ç×a˙ëÖvpM™YÁ6WÔü¬éÖR]OnŤC2yr)őł`Ň.粷»‰ˇžŕZˇÜ3ćpEuŽî=O^kĹ‘PYL.KŽ7q×ß­Yřt‹w¤Íś­ŤôWÇŘlźüv“›IÜNm'~‡)sáíBÚ}F)ŁE{Wźç±ŚzőkM𮭨YŰÝŰĹ٧ VG(8ç>őÓxŠbŢźSsűÍR+H™˝Y7n˙ĐEdx†FđÄaŽĆiŘŹRŹći)É˙^@§'oëˇÎë]ŢŹzÖš„^\ŔĆr==ĹkŰx+[¸´IŇŮČ»Ň'•VF_P¤Őß8xĽ/$çví>"ě{Źzč|Os§Űřâ7};R¸ÔŤ he_`(ÇNąühs••ÎVV<çOÓnoő4°‚<];çnÎAĎN†µî<­ŰŘËu%˛mnxÖ@]WÔŻů5§ˇĚn~)Ç3[µ»=ĂłDýTílďšÇ‹\»ŃüK¨^ŰůrK$’ىA*Ŕ·9Á\ŇoAąI˝ | ei}©ÝÇ ËYÉ"‚O 1üčń •Ąż†|;qo ¤÷ 1™Á9r¬Ďë\ôRÉ&'d$`•8ČôˇĄ‘ŃÝ™;Tś…Ď\zUrľkÜ®WÍ{›>đĆĄâ‹Ém´ăi"ŹĚs#…gŹq ŰĎ$3.Ů#bŚľ„Z^YžőLJVřÝÉo±– łľJöéúV\°0pNíÝsďTX”QEQEQEčúVŤ¤Ë©řf)m’ćÁĄ~w ÔóěkÎ*UąťYf”2 ¨Cź”zJ™ĹËfDâĺł5Ľ%ĄŰęš”żnf[+Xć}ťJ/aůŠč4x´ßN-‡M•¤Ű’ŘKź-°qąŹ Ó™ŕř÷ńý‚ćţ•ŮhË©µç„źç˙e‹1çůdů{°wníśăŻzĘŁŐ™T–¬ŕtĎ ęZ”rÉj°ůqĚmŮž@ 7ăř~tšź…őM2ÁîîáEŽ9<·@̇¶@čo·ă$xRűń<_ĺWµă›Oçţ{Z˙čtůĺëČ|ňżőär:7†u=^Ů®-bE· ·Í•Â)oAžµCUÓnô«Çµż…ˇťyÁç#ÔÁÚÜɦ§€Ľ>Ú…­ÔöŕĘ?Ńä÷˝‘×®?ĆńÍá»m,›EŠŐcO´ZDtÓŚŰ~EFmż# Ň´m&]OĂ1KhŚ—6 ,Ŕ“ó¸^§źc^pzÔ«s:˛2Í(dP‡?(ô•\bÖě¨Ĺ­ŘQZZ–‡©i–VwwöŻ˝âďŘŹŢ 3ž„~u›TXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPóÇ­żü ůÔ,ަT™sźÎ˘ Š( Š( Š( ¤·š[yŇh$hĺB]N>˘Ł˘€7u/ëz•™µĽľg¸eTUÝő k?MŐotŘîRĘsÜÇĺĘ6ą}9u=*•ąRV±*)+X»>«{>—o§K9k+v-{GĘN{ă'©ęi·:ŤŐÍ…­śŇî¶µÝä¦Đ6î9<“Ď­T˘‹!Ůﵫří’î_1m˘Ä6µAŔçń­[Oë¶¶kk ű‘v®äVeÍsôP➍ Ĺ=-XęV:‚^ŰLVé°€Ç'©ç9ęjĽ˛4ŇĽ’»±f>¤Óh§aŘ(˘ŠkxoÄZ§†îäąŃî|‰dO-ţE`GĐ‚:ÖdŇĽóI,¬^Ił1ęI9&™EQEQEQEQEkř_VM#S2ĎšÖhÚ ăŁn¸÷«:«XÚZ!ĐőËÉPÉź˛ĽmŚrwť¤ôé\ý<şÜ—n\ŹTĽŽĹ¬Ňb-ÚapT¨9qĆsŚÔÓëzŚé~˛Ün[öVąo*r˝¸ÁôĹfŃNČvFľŤâMWF‰˘ÓîĚq1ÜceąőÁKSÔ.µ;·şż™¦ť¸,Ţž€Ş´QĘŻpĺW¸SáÓF˛±HËĚp3ÉĹ2Šc:˙‰Ţ%ÄZä?ŮĄ˙˛ěáX- Ľc“ŽÜńôą ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€˝*k«[‹I]A,FvČ…OäjH Ž˘˝?^ŐnőϰßkR «ÄŐ<¨¦**ě'őý(Ě(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ žořő·˙:‚§›ţ=m˙ŕ_΀ ˘Š(˘Š(˘Š(ŻPđľ¤|;đ–çQŽÖŰPkťLBĐ]©’đ™Ý·=xëî=+ËĆ23Ó˝v~&ńfťsḴéo§éâ´Je—Ěyü;wě(Ö/Χ©OxÖÖÖ¦R“mČו{t©µ-RÓ,¬îďí^ {Ĺß±Ľ g=üę„!hÖV)`€Îy8®łâw‰`ńąöiě»8V `Ăoäă·<} BŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©du0B üËśţuzPEMukqi K¨%ČÎŮ©üŤC@Q@Q@Q@Q@Q@Sĺ†H‚ct»Ór‘ą}G¨ŕĐ(§ÍJcž7ŽEꮤřeQEQEQEQEQEQEQEQETĆÖŕ[ “˘Üś J¤úgĄC@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEP@$GQEéúö«w®|†űZ]^&©ĺE1PWa8$Żé^a^ˇá}Hřwá-ÎŁ­¶ ×:… »S$1á3»nzń×ÜzWťëçSÔ§ĽkkkS)ɶŹdk€Ę˝şP:+KRĐő-2ĘÎîţŐŕ·Ľ]đ;űÁ€rsĐŹÎłh®×Ŕţ’éîoµM.ć{H­Zx"ÚĘ.ř@#®kŠ®ďŔ:•óiľ!F˝ą)o¦HĐ©•±‚ĽńŹjĘłj:PQs÷ŚĆL–j<<Ú)mŔ,|Ţž tţµź{ˇŢŮk‹¤Î/YŇ0ˇ|cźÄTę7włŔ×÷—6Ę™¤gŰČÎ2}«»ńEťÄżěÚ8™–Y­ĺBWnOáK™ÂËÉŹ•TĽĽŃÇ[ř~ţ}}´hŃ ňł)RăQ“ĎĐUëßkvzl—ł[§—Ý",€Ľc®Hí].†Ę˙® Gť8ăŮVwĂ餗ZńĺĽŰ †|˙Čäţgó©u%şě™J”6}[G3ˇh—úíÓ[é°ůŚŁs±!UG©&¬kţÔô(â–ú$0Jp“DáĐźLŽő·á%–Ox©,Á7$C˝Jn9ý7V8‹Z_ł’WD7ĺmĽÉŽŁ<ţ\u«ç““×B9"˘ťťÚą»đżN˛?Űţ§¸·Ń , ÷d‘ł·?÷ĎçŠć|IŻ_xŹS7ÚśŠómˇ*˘Śá@†MußQ®Ľ ă‹HiŤĽ3’±<~絩‰éúUăxűÂ:­–®¨úľ“nn­.•B»˘ŽQ±ÔtüÇĄy…zÂ8Ě âťJL‹{}&hŘă»`őů yí0 ×đć‹q«_ŰŞŰĚÖ†eIeD$(ă9=¸¬ŠŢđ]ĺĚ> ÓŕŠâd‚K…ßą ßQĐÖUś”Žć”T\Ň–ĆźŠ­˘µ·Ľ†ßĂRZĂ›ő™Ď±žxçëŢť¤6•«iz˘ 'µ˛yVa#1,\}y¬j7˛ëť´——/n.d&•Šŕ9ŔĆqĹ^đ:—·ń ,í§Hަąhó7®ť_—™Ň¦ĄZÉiŻEćrŐĐŰř7ZžŐ'Ke×zFŇ(vJ„š?0aw çÓ5ÜřŠ;Ćř›lѬ„a1Ó` »đÎěÖőŞJ-F--×ČĘŤ8É7-uKO3†ŇyŻÖ(]®KlăťŢ•łá-ZĆÎK™aŤ’!™DrhǸ­‰Ô~#ßG̶Á$’C$Ç/ąÎ?:»áy4ɤÖťm¨+9|É.$ ęűÇük™$ś{&ţf´đńm©wi|ŚřzMbîĄXÚĹeŮ(2cĆx{Šg|5wĄ››†XE˘ĘU1(fÁÂÖĂĂSęşś+,·9ŠĘ&Č统aţz×5^™$:v©âŤ>Xu‹&¶·)aÝ˝2¸/(]{RU(ą:ÓĂŐ瓾ď_O!b)rE[e§Ż™B•H äzŇWGáO?‡‘Ńtť&ř<÷ÝŰďuÇelń]g)ŐümŐob׉Ţ^‘‚Rkf^Ńő{íëímĂA)IĂĐÁ«ďµMw˝ѕ#9D AőŔk&Š9c~kj>y[–úńç†uő <©p Iڬz©ü©|W¨éş¦¨.ôŤ4i±ĽcÍ_r‰2rWĐc`V5É;Ć0Í .…áí94Í-iţmŇ\0Ç,~٧=Ҹę( Ąłą–Îę+‹gŮ4LŕŹcQQCWŃ‚vŐ\Í%ÍÄłÎŰĄ•Ë»c$äž*]:ţëMş[‹š€Ćĺôô#˝V˘“ŠjÍh5&ťÖćž±®ę:ÂÄş•Ďś"$§Č«ŚőčĄY·ńf·of¶±_¸‰WjĺT°ÍaŃQěiµËĘ­č_µš|ÜÎţĄ‹;Ű›;Ĺ»¶™ă¸RXHNO\úÖ¬ţ.Öćßľôíu(Ę#@=xÇ_~µ…E9R„ťä“jN*Ńm†W†T–'d‘ee8 Žő«©ř“VŐ-µýŮ–Cm1¨ä{šČ˘›„dÓkT%9E4žŚŐŇ|CŞi14VMLrP¨aź\qTµ ëťBé®/fi¦n¬ß犯E śTą’Ôä×+zYÜÍguÍłěš& Ť€p~†›q4—7Ď3n–V.íŚd“’j:)Ů^⻵‚€H ‚9QLGgă_éž)´K©t—·×°‰%ĘLLnŁýžßçšă(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( §›ţ=m˙ŕ_Π©ć˙Ź[řó (˘Š(˘Š(˘Š(˘şČţkîĹ|ă+şeřÎÖ¦SŚ~&Ta)ü*ç'EZuáÔżłĹĽ†÷ĚňĽś|Ű˝+gTđ^µ¦ŘÉu<ĽQ Ę"•]˘˙x â´l$îŇ9Ę+Şđ/…ä×/`ždŤôĺ›Ë™L»Xńž^â™âŹ ^č˙kş"błŚ,Á)l/}){XórßR˝”ůyíˇĚQWŻ4««M6ĆţeQoy»Ę!˛NÓ‘ÚŤOJşÓał’éT%Ü"x°ŮĘž™ôŞćLŽVşh®˛?‡Úű±_"8Ęî™Fţ3…ő¬[ ţűZţĘŠ·Ŕ˛ä;pTyü*UH˝™NśÖč͢şKßkvzl—ł[§—Ý",€Ľc®Hí\ÝTdĄłŁ(üH(˘»YhÍaozŤ}z[1äŞ[¨Ď\u'oëůÜcĚěaVŞĄf®qT÷č±ß\" *ČŔ@ AHŃ;«…QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQETóÇ­żü ůÔ<ßńëo˙ţtQ@Q@Q@wîć¶ń…śń9ßoo ÇžÄd˙:áęć«©Ýę×BăP›Í MŰBđ: *o$ËŚí˝żŔúŁkˇż˝HRyĂť±‚pŚŽ2OaV´­BÂÖçXv‹«IrĐIĐ’PĘ ő,1ëýkĎ­ç–Úxć·‘Ł–6 ®§Hî+sRńŽ»©XµĄÝńhaÂĆŞ\{¬çI·¦Ć°¬’×}ĂáůÇŚô¬˙ĎočjʉcxüC©‡FSö©:ŚŞM%ĽŃÍ´rĆÁ•Ôŕ©­Ť_ĹzÖŻeöMFôÍo¸6Ó/#§ Z8ľ~dfĄNVlřŠ'›áď…Ą‰KÇO3†/Ŕý 'ÄTh-Ľ5o(Ű4ZlaĐőSďůĹĐüO«čpĽZmŮŽ;ŚlŞëźP8Ş–ˇu©Ţ=Őüď<ďŐŰů{jÓ’–»+ţ%ʤ\tÝŰđ:ď‰ws[xÂÎxśď··…ăĎb2ť?ŔÚśÚÇÄČ/îR4š`ĺ–0BńdźJä5]NďVş„ŢlÁnÚĐ`IĄj7ZMôwš|ľUĘd+í ŚŚ#ˇŁŮ~ď—­¬×÷śÝ/s­ř}4’ë^ ó·›apĎźâ9źĚţuĂŐÝ;TĽÓfž[)Ľą&Ť˘í •nŁ‘íTŞăIł9NńKµÂş?‡€˙Âc¦śnnŕ \ĺnéŢ-ÖôŰ(­,Ż|»xň<¤8ÉĎRąękh4ťŮĎZ2”cÔËŐŤÖA˝ćjµiëZöĄ­ů?Úw>“ťź"®3ŚýĐ=fT»_Bˇ~U͸QE‹ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( Ą‘ÔÁ ó.sůÔTué@5խŤ. –#;dB§ň4Čb’ypĆňHz*)$ţ€EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQEP ÔQEz~˝ŞÝëźaľÖ¤W‰ŞyQLTUŘN ëúWťiZ…Ö•¨A}a)ŠęÜŹ€p~‡Šôo ęGĂż nuímµąÔÄ-Ú™!Ź ťŰs׎ľăŇĽďXż:žĄ=ă[[Z™H>M´{#\>UíŇÇŤŁ·ń4˙Ev÷ćo±ß,C î!ńŘôüÇĄyÝzFlľŻťoµo2!Ž & ú|†ĽöQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEP@ĆFzw˘ŠěüMâÍ:çĂqh>ŇßOÓÄ˙h”Ë/ň>1řvďŘW5ˇOcm«[MŞÚµÝ’6d[i~~¸Ş4PEă/\x–{eű> /Pattern << >> /XObject << /Image17 149 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 151 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 152 0 R /Resources 153 0 R /Annots 155 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 152 0 obj << /Filter /FlateDecode /Length 154 0 R >> stream xśµTÍn1Ţ͡󜊲UqĆžńß‘ ŕ€„´R”C4Ú´¤pŕ©x Nđ}‚ú0öfămT@TíZŽÇßÎxfżoâh…ĆăŢ`´˛ľ[ P!ęč‚EÎŰ{qJËČYď0‡wecĐzNF[›ô»€C8•$+=é>-Žćź%IÓ&-9a H‘ŕ|~«T 8Ů×2VŁL:gĘCŽŐ>X­=h¶”8$˝NŕëF3Ů+±ۤLI) ě+S;lŇĘNË:ZqRš˘F?đ˝±ĹpÂ;úŕ“Á5‘Sń­śŃžĂěůŮéVÓ =ą®k”iŤr m/ZűŢŔ´:¨Ôm}tTď×UýŞĚŰ´ú^ď6đÚ—đ¬˝Ë2L*©b»–iíÇ”ěĚýUɨ-©@˛ŽFKµc¨+ ¨MŻâ:® ˙ݎM]‹$ ¨,[iŮŤĎ0·‰"0®'Ęݨ±r×ĺšüÁö ¬RýurQýj¤ßך%!'˘h^vyT]Ö˙ꪑoÍÖĄĽŃwŞ«zwňmňł}Ű‚)°ňĚh¶Ëľ eů¤ýĽSŃŮôEc¤5Gh7B5“w&YÝ&~ŚŤ®†ű9ţp/ßoĆQ6™« w†ud‰f/–Çó:ŔÓł ]âÄpđŇ­dĺç"÷WŞOLWŔn :±ż¦Fáqr?ÇśxO”^Żűdžc¸)¬Đ -iüýbLł endstream endobj 154 0 obj 568 endobj 155 0 obj [ ] endobj 156 0 obj << /Subtype /Image /Interpolate true /Width 968 /Height 300 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 158 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ,Č"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQETđ˙Ç­ÇüůÔU3¨2pËë×ŘP E]µŇo®µuŇŕ¶vżi ^OBuÓ5é^řqw¦Ţjoâ;;k‹UÓ¦dd”8Ža´ŚăqšňŠ+˝řo}˘ÜßiÚ.ĄáŰkÉ®'ŘoRÓĺÇo­rŢ+·ŠÓĹĹ˝˛ŕ†ňhăAŃT9~T—EtľđFµâ6Ľ±†(íl\H#VoAžµ•Żh×ú˘ö:­»Ap `zGP}č^řk®}·H»ż˛‰¬ä¸‰ĺ·iG™ĺ‰_L{Ő˝AŇçřÓs¤ËgiË,Ŕ@s´„ŹÖ€<ĘŠôëKořĆfĘÇCN«em%ÄC;2Hň¬9źµp¶íö‹¨ę–ę†ŇĂgśK`ŤÇ˝eŃZqhw˛řvmm>ÁâÝŽď›yôôäVľ‡ŕ-sZÓmµ  ű倖IB„Úpwg§4ĘŃZŢ&đîĄá­@YęĐyr2ďFSą]}A­ű/†^%»±Žĺ-ˇŤ¤O28%™VWËŰńĹqTVÖ…á­GZŐçÓ-R8ď ViwíÚÁHçľOJďĂâÝ›w;ȧЊî<#đî[ýţîú(ćłŘqŤ®FA`GZ™ŐŚŰͨ­Źxr˙òÁŁän™K/•(~®+fÓΈ.¬ę;8×ĚO1!yUdeöSýişJíÇQOš'‚gŠdd‘«+ #‚ 2¬ŠítMĎPđÖŹ2Ű©¸}am'~rČFp}±ZZľ‡ĄŰÜř¦âTű,6PËj2p†@#źPk?jŻbąçWmŕ- S2ĂŞŰXX_Âęč°ÜJŁśă8=ř5Éů]ężgŤ#ŽY¦ňŐ©-Śg°ŞSMµŘVĐ«Ez$˙ná¶1Gn5_=Ľ×7iŹçéY Đă>;‡JŐáŽe]âD •$!#‘řTűX´Úč>FrTWM¨ř+Y´°žůíÓÉ‹ć‘@^5ë–^ÜUoh©âéÚd¬Ëî|½vŞ–8ü«RRŘM5ą‹äÉ伷ňCl/´íÝŚă>¸¦WcńÄňj—ݤŮG®‡a)KkxĐ•Ęď'ą<ţŤAˇř \Ö´ŰmBĆ(>Ç9`%’Pˇ6śŮéÍ1­­âoę^Ôž­—#.ôe;•×ÔÝłřiâ[˝>;¤´‰ ‰ćG“*Ęëę˙\PE\łÓ/o5DÓmíäkçÄ!Ćpęzc9é]e×Â˙Ű Yá¶dŠ&–GIÁ ´d©ďśâ’)'‘#vŽaä;U)Ĺę¬ĚÚ+fëĂzŤ´ú”3FŠúz,“üă61Ź^˘Żkş}­ż‚ü9y *—7&6Aśľ×ŔÍëK™ĚQ]?Śôű[?=¤+\ińÍ)ůÜŽI­Qˇjz/„µQs¦éłĹ W7>j´‘Ć?ĎZ^ŃY1ňś5ť¬×·Q[ZĆdžV:’k˘żđ.·gi5ĂĹ«î•"™Yw$U9%ŁbIł—˘şżxZMrö ćHźNYĽą”˵Źŕuî*?xF÷Gű]ŮXŠĚV0ł`Ąľ^:ôĹO´Ź7(r»\ć(­íÂz¶·j×6P · ·Ě•Â>=k;XŇď4{ç´Ôa0ÎŁ8' ŽÄÔU)&ípłÜĄEu0ř_–Ö –Ú1ç`¬m*‡ ŹN Ę‹B˝—_:2"}¸9ŹnጀIç𤧳VeŃ]=ϵŰ{ ®¤¶B°ŤŇF˛)‘WÔŻů5“ˇh—úĺÓA§Cć2.çbBŞROJâŐî¬Î˘¶µ˙ ęZqK}yNhś:é‘Ţ­Űx'Zą˛Šćbt–Ď÷Ľłý3Yß  ÔăÖź§\'uMv aQy,ăo89Ç]€źĆĽYX«RCGjëŰâOŠÍĽQj°ňń‡ň“yÁȶäŹçß4Ŕ«ń4ăípŹô’•nüi†Câ 2AŰL‡ ÁÁnőÂęw÷:¦ˇ=íôžmÔíľGÚqúoÚř˙ÄöşXÓˇŐ_ěb?(#ĹĆ7'§˝ 9•G¸¬ßAšďţ8Ł\°V* ‹śq÷k›đç‹uż Ĺ4z-ďŮ’f ň‘ňGOĽ¦®ęźĽQŞéóŘßę~m¬ë¶DűŇŘĘ0OR(ÔüqŻßiŇé˛ęNö-•#b†dě c$cßë\Ő!)IĄłKő[á䏄ülѱVű ŹCĽç\ÍŻ/-ü5yˇŞÂÖWR¬ĚXęŔŹşsťŁ§8üëÎ.|CŞ]G}÷[’öe¸¸ZŤî:AN“Äš»ëç[7®5BA3ŞŞç  ĆĹ%FKgÓüżČJđ,ú%Ěţ!:=–¬Žl&ó演:żűŔĽNOç\炢{݇~3·KͶŢM®ĐÄ“ůY—_ĽOr_ĚÔWFŤ‘aŚ) 0r6ő÷ëXş·¨č7żjŇnžŢb6’!‡ˇBĄ+?—ŕ[ Omđ^ĺ§R‚ăUV‹wĆÁČ˙ľOĺMřlŤ&…ă$ŤK;i§ Ië\çĽO«ř‰Ł:˝ăL±}Ä Wđ űŐmYÔ4;ßµéWOm>ÝĄ”‘čAČ?ŤWł“‹Ovî[P©wž1őݸqŚó^Łâřu&řŮbđ¤ĄLÖí(ăËwţßź­yď|CŞx†x¦Ö.ľŃ$K±–©ś˙©ińÄöšrŮAŞČ UŘąDfQčŚţ´ç ĘÍZú !řŽPřçZňń·í-Ó׿ëšÎÔ´=OLł´»ż˛– kµÝ Ž8qŚ˙#Ţł¤v‘ŮäbÎÄ–f9$úšŘÖ|M«ë:u•ŽĄvf¶ł]°©Uă2N8É­bąR@vż Ęˡ߆Ć,®’đç·ČßüMÓcáŠŢg&ň [b}Ln˙á\—¬ßép]ĂapbŽí<ą†Ĺ;—c‘ÇS҉µ›ů´h4©n X@ţdqm_•ąç8ÉűÇżzÉŇ|×ó/ťZĆßÂĺ?đśé‡˝çôÉëśÔ‹ŰŚ‚?xßζtßkúm”VvWţUĽCžLmśő+žőW\ń&­®Çz­ßž‘Č<´\×îT”ą®+«XÜ˝F…ZiE,P}Ä ă†ëQ|*ńÍ€=vË˙˘Ú˛tOjúO—zĐDçqMŠă>¸`qQA®ęPkM«Es·PbĚeا’0xĆ:JNłŹqÝ]3¦ř{4’ë^ ó·›apĎźâ9źĚţuÁÉ–ÚIs€Ţbîc`?Zć4ÝRóMšyl¦ň¤š6ŠC´6ĺnŁ‘íU­n%µąŠâÝĚsDáŃת°9®1łl–î‹Ző´–zÝýĽĘVH§t`F:1®Ó\‘×ே# B5ôŇ® ăůÖOŚČŢÓ¤˙_i¤B’CÓří`x3[Ó´ ©Żo´ĄÔnĐ)´>7–#żlqůVf»«]ëš­ĆŁ¨Éć\ÎŮb°Š@.‰˘ę:ĺËŰé6’]LdeNĘ;óőŞ‘#GvęUŐŔ ŚsŇ´|9â-OĂ—r\č÷& dCťˇBëY˛M$— <ŽZVběÇ©bsšöioüs­čň‘¸KkožĎǸrĽ~uŁ.|ĚgΛf}vţ˝q'Ä:ˇ×¶>Ô´żç°EĂ·îă8éUfÔŻ&ÔŰQyŰí¬ţa•p§w¨ÇJÁQkO#G4wzNˇ§Ú\ëNŃ5i.š #şJ¬ŞRÜz˙Z_†h—ş<đÉĘŘ_Ă~}€Vç˙®cRń–»©XµťÝńhaÂĆŞ\{¬í/XľŇ㺎Âs ]GĺL©ÜĽńČă©äSömĹ÷esľń4ĹĽqŞąýć­ śLެ›‹č5 ÚíΉŕ 5¬6˛™|đ|řăzzu®ăWľ¸Ňm´É§-cnĹâ‹hůIĎ|dő=M2çS»ąÓí,g›u­¦ď%6·qÉä ž}hTş>âç:ż‰· vž¸‘Q^m:9 ‚yŕv„U‡‚ü^ śíű´ŐÍŢę··żcűLŰţÇĹĘŁbŻAŔçń­ĎřX^'˙ źţKĹ˙ÄÓä’ŠŠţµe{ł7ÂSŢŮřŽĘ}:Ő®năb˸Úr?,×_mg¤ř‚]U´•Ő4}Y"’i‘ź17?2“ד돥qwzö§u«¦©5ŰôĆŮ•BŽZ:‡ŤüAg%­Ĺůňd\$h…‡ˇ f‰FMÝi ř}ÇŚôś˙Ďočj‡‰cxüCŞFSö©zŚŞM%ĽńÍ´rĆÁ•Ôŕ©­ť_ĹzÖ±eöMFôÍo¸6Ó/#§ TÓćş&ęÖ6üH“IđóÂĆŮY­I´doÝĆ}ţő/Ä-ŃÇáqzÚÂ?87ŢüZÁĐüQ¬hpĽ:măE Ĺ «®}@ ăđ¬ýOP»Ő/ęţwžwęíü€č°©Ś~Zţ%9+ť®éZ­ĎĹ BÖ)^Ä´.— 3ĆÜ7tçćă޲t˙ů,ď˙_r˙č-QxrűK´¶ÓĄżń]ţČ&m=a¨e9 žČúW7{®Î|Ss¬éĚmćižX‰PĹAČäކ˘1nëĘĂmnY‹_ĽŃ|S©_[yrK$’ĆâPJ°fç8#ŇŻxFĆá˝cTżąż1”ŠKk7ÚeĎ÷żŮżťrSJóLňĘwHěYŽ1’y5َkú–†ň6™rb :• ­őZĘią)ë©Řjme'ÂŮ[M¶ş‚ŰíęP\¸bNŢJśtţą­[FĄáś˙ '˙Đ yţ©â}cT´{kűÖšÝÜHP˘€Ŕŕ{)‰â-Q$¶‘n°öĐhŹ–ż,dcoN~§šĎŮ;Ě®kř›źxCýŰŻýµ«âDkźŢ¸Ś–×Ă&9ÚYŘŚţ_­qZŤŐŐŤťśňî¶´ßä¦Đ6n9n@ÉÉëÁŢ.m ÚëNż˛‹RŃ®Č3ZHqóqó)ěxéZÁYX†îr´T÷ď—×gEjŇ1Š69*™ůA> b ŞQEQEQEQEQEQEQEQEQEQEQETđ˙Ç­ÇüůÔ“ńţUOe˙Iř˙*‚€ (˘€ (˘€ (˘€6ü;ámWÄPÝI¤Ŕł rŠŕ¸Só_ˇĎĄKâ_ęŢ·‚ăPŠ3m1Ú’Ă uÝ×ë˘đ \Iđ˙ĆËfĚb‡…ęW-»˙Í6ÝfO‚·źi #mIL»ŤŁ8öëú×;©%+tş@chľÖőŤ:ŢúĘ~É1`%yB…Úpwg§5›â=Qđíř´Ő`ň¤+˝H!•×Ô]Fµ#ŹŢŚ1׳=H/Źćkźľń ÎŻ‰i¨,FśHáNćBWďNplUBSný.ŔÔ´řoâK«şŽÎ5óĚH^UY}”˙ZÄŃ<=¨ë:•Ĺ…”#íp#<‘ČÁ @#žů5č>/‡RoŤ–/ JTÍnĐ2Ž<°áťůúÓô҇⍠DcěW]=~\ţą¬ŐiZţW–“áÇHDVÎ/9 \)óW;=H˙ZÂđö¨ř†ń­´«5Ńw»Pz’xęž'űgáŕÉÇŘn“VĂcj<âß´Á=Ââ,VěFŹ'ˇ=şçŰ4{i¤ďĺůŘOÄžŐ|<ɨB†Ţcç‰ĂĆÇÓ#żÖşĎü;–˙Cż»ľŠy¬Ä¶\ck‘XÇQÖ«ë:•”źäłŇ4}J5Ż‹ss tY1‚úZ‹á˛4šŚ’5,í¦ś('­9JnŮÜ]đÝ÷‡îíbÔÄź•ňĄ08éÖ»_|7ż¸ń-ďü#öVđXŞŻ“LČB ŰA9<ž˝+ĚŕR·1n|è÷ŻNń­ĚËńşĂlŚ<»‹D_e;r?ńăůÓ›š’łč˙@<Ú:ňmHiń[ČצO+ÉćÝś]±ŕJÓ弸·ŠHˇC*»Eţđ×č>Rüy»4ű3ýí‡˙ŻQhÚž™gw®.• kRÝ˝Ľ±Ţ fWU©aŹ_ëJUĄueŃ0<öËEĽ˝Ň5 NCkcłÎ%°FăŢ’=ňM]eU>ĂâÝ›w;ȧЊë|Ý|;ńťĽ ^m¶ňlv†$źČ!‰íľ Ü´ęP\jŞŃnăxŘ9÷ÉüŞÝF›^i‰áßjúő‹ŢYÇ vŠű<Ůĺ«7 ĎZĎń…¨xzřZjyR•¤0euőu®·IŐ-SÁ66+Ń/ĄŇÎö—–Ď´î$äsÁä·Âłţ#hËĄMĄÉm}yuawj%·[˛|ČWű¸ě9”ŁR\ö`qőŇ|:°¶ÔĽ]ek} ÍnâMČÝýEfŰčzťÎŹ>«”ݧŔŰdś•Oâ+sáOüŹZű˛˙č¶®üHŠ®ĐvŕŤ:Ň˙TÖc»eHlg–0sň˛•Áýk?ÂÚ%îŻtŇYGm ¶dwIä ¬3ÓžŁ]Ç…|Mw¬]ëv—öQĆ–¸haÄ‚'ÓšňЬßtôNÉ""äŰ[lt>>YÓÄ“-Ő…µ„ˇ0ŰW§\Žő…á=SZłk»T‰-U¶yłHôëZż”˙ÂirpqĺGÎ?Ů&™¨Ű§„lěĽK¤^KĄ‰YíníŰiÜIČçÎh˛ćw“öiÄçµj:nŻ›y Çq9Q, ¶ă€CtĆk°¸řws˙Í©Š;q«yí湸 x8śgĄax÷J]6]5íď.®l®mÄ-É;â_îă°ééVáNQKÔvqĂuˇ$›M ĘME¦sSi‘ë'KX„·ˇÄa"!˛}Ťkęľ×4Ë.î-ăh˘—Ę9Śz*×ÂŤ«ă‹!&l.}véšżđö+صµňȨ,¦%Çň>ýhŚSç(żC”đţŻÝ<lAĘ.çfmŞÜŐ­cÂZ¶‘`÷—±F¶ë Ś:Č1# ŚuąŕXfĽđЬěké"¨żyÔ=xČüjkËí?á3E¨Ç$.Ú€xăa•J÷§9?Ť *×Qó[ĚŔŇ|«ę¶0^ZEµ”°<ˇBŕŕç>őC^Ń/´+Ńk©CĺČWrr¬=A®ŹVv ô$ B5ܤŹ\Çó5‰uŞÝëéŁi·J‹l[Ă €7öŔô¤ŇEFRný54-<Ż\Ú$éozE$Ş˛0öSýk'IĐoő]B{XGÚ FwŤŰiNçľMzĹĄŘřęĘĆq­ęĽ2Äżj’aŽÇ8Ćvyüj·â‹qÇú%ÉăţUČŚŐYkés›kŠ$"+v šĄgSćŚděőÇřzÓü§éßٚƵ«Ű›¨tô@–űЇv$ ‘ř~uÖx\źíoŚś}Žăů5s~‰î|âČ Rňţáö¸ ’ hĺIčňi§ĺůŘ5ë]+Uđ‚ëşe‚éÓĂsöiˇG,ŚČ#?QúÖv—ŕ˝cR˛µĽ¶Š/˛Ü+#Ę 6ŢsďŇ´a‰ŕřKrÓ)A>˘¦=ÜnG#ň?•K⸆>1«“oŔăvöŰźüz“Ięű I­ëcšÔ4 CNÖbŇď"]JĘ©–Ŕ9éŚ×cqđîçţ›SvăVóŰÍsp6đp8ĎJˇń H¶>[ś‹‘§ŻďťZeň3ü)Ó )`şîŔÎ8n´ě“hĄ%™ÍM¤^G¬ť(F$˝Ţ# ʎé[WţÖě­&¸x •`]ҤStÉťáďlüIe>›jn®âbËęăiČüł]Ťµž“âµfŇUŃőtŠI¦F|ĆÜüĘO^ľ¸úRŠL©ÎQ~G›©##<ŹZôߍş­ěZŕŃ"›ËŇ"‚'ŠŮTSŹÎąO x©ü<Ž‹¤é7Áäľîß{®;+gŠÖřŃn ńőăy’9š8ĺ!ÎJżt{qPlpÔQE (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žřő¸˙€˙:‚§‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š({/řúOÇůT=—ü}'ăüŞ (˘Š(˘Š(˘•ť‚¨ËěĽâ8t? xŠ(îÚßSśŔÖ›P’J±'ś`p{ő¬x«YńBšµáš8ąD¨ ă“X”T*qRręéő{éô‹m.Y÷XŰ»I[mcśśă'©ęjŤU¤–Ŕu6źZ¶r9ő=sUô=oQĐŻ Ö“töÓ´•†„ gQO–=€ÚńŠ5yCV»2ÇĘF¨¨Ş}pçŢŞčšÎˇˇŢýŻJş{iöí, ŹBAük>Šb—-´[^ń«ŻÜĂq«]}˘hWlmĺ˘`g= eö˝©_ki«Ý\ůšŠ::˱F1´í`v¬Ę(QŠŮzăVľźWmRK—ű{I晓 wzŚ` ŘŐĽwâ=WN{ÝDµĽŤ¸ô$Ms4Rp‹µÖŔhčZŢŁ Ţý«Iş{yÚH†„ Xń‰ő4gWĽi–/¸B*ţźzƢŽXßšÚĐč3×t Ck¦ß¶ÉaĆ® úŤŔăđ¬ísYÔ5Űßµę·/q>6†`ĐŔJϢ…§Ě– lŮř›WłĐ.t[{˛šmĂn’-Şsž¸8ČŚ˙Z٤ęWzMüwš|ľMĚy űCc Át&ŞQV&ŻŁ.éÚ­î›5ĶSyr\DĐČv©ÜŤŚŽGJµˇx“VĐ’dŇ®ü…”‚ăËFÉ>đ>µ‘EhN)QńŻ5)m/u2ŢQµÓÉŚd}Bć˘Ń­6’ˇ.aFfĎ÷pĽó]‰ő­8xcű*ÇSşŐ®&şűL×SŁ.0¸ŔÝĎaú×E5++ Á7v\›TĽ›K·Ó¤›uś^8öŹ•ŹSśdőőŞ`A‚9QE"’±ÓřŚĂÚMňcĺ¦ăŽ@'?×˝fGŻjQę7wÉs‹«´hć}‹ó«uĆNŐ™Eϸ”"¶FµŻµKY¬%·şŘö(ŃŰź-Ĺlär9ęzć Ńµ‹ýěÜé—-¤m$CB¨QEŘr®Ć¶˝â-S^hΩtÓ,q…Uüëď]ń|şg…´ }ôÇ{oç üĽŚ3ĺs¸`ţ+˘š“ÜNśZJŰ5mNóW˝k˝Fvžvn ŘŔsDń6±ˇÂńiw­NwŘ®3놏E+˝ĆâšłZźVľm\ęźheż/ć”;˝p8­mCÇ żł’ÖâüůR.×Ů!qčH®nŠ.ÁÂ/tAr+łńŻŠôĎÚ%ÔşKŰëŘD’ĺ&&7QţĎoóÍq”R((˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  ěżăé?ĺPTö_ńôźŹň¨(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š(˘˝Gá‡4ťE×F«oJ8a™ł™ĂGľq@]Evë˘[Űü3Őîn­Pj–ş¨µ2Ľ *ĺ<Ö†Ľ­x†ÍŻ,ˇŠ;@Ű×Ő›ĐzĐ1Elę^Ő4ßCŁ_[ŻftHÁ`U÷)Ó5ľß üF¬ˇŁłČbv7+ĎmŢ™ăQë@=§s ęVţ m­™ő%“ĘňSćÉíéŽsé[z×Ăżél··đÉ #3&Wh‡ű@LĐ#EZŇě.5MFÚĆÍÜ\8ŤśO˝Zń.…}áÍUôýMnC|ŤąH=4—EPEPEPEÔiV6Rx2âîx®Vţ8„„ś„ d:MŘ™;˝ÓxłIŚxŢ}3J…"VxăŠ=ŘŠ/sîk5ô+ô°ľĽh”Ae7‘1Ü2Ż1Žü‘II4)&“2讳º_ŮiÚÄ "I‘ŁÝ‘aś~V˙Áú˝­Ś×ŻnžL3˘Č Ćľ¬˝¸Łž7°ąă{íˇ˘č÷şÍËA§Ăć2ŤÎÄ…U¤ž•>ąáÝGEŽ)o#C§ ,nIôȧ̯aó+ÚćEÜxoÁrŢi7—7QÄÍ%°’ЉŔĂ‘¸Çă\η˘Ýč˛D—˘-ŇËĺȧҒś[˛ś[˛3h®–×ÁŐÍ´S,Pˇ•wÇ“*»ÜV]†Ť{}«˙fCŰĐYLnvŕ¨$ůQÍăç‹ęgQW´˝.ëSšx­Yቦ|¶0«Ś˙:źEĐ5 j+‡Óˇ ‡€?18ëô4Ü’ÜnIneQ[ç†őf˝Ť<‰NHÜ:çÓ#˝cĐšz M=PQEt±x#\’Ú –Ůť‚±™>9#ӟ‡$·$·9Ş+RßAľ¸×HŤŢ«2•.1•<ţ—ĄÝjsO˘«<14Ď–ĆqźçG2dQ˘Żčş=îłrĐiđ™Fć$…U¤žO­řPŃV'˝‰|™xIcpčÇÓ"Že{2˝Śš+wK𦫩ŮCwkf”°őK[Ńďt[Ďłjyrܤ† Đ¤›µÄ¤›µĚú+¶ţĹÔ´Ź jbăNÓç‰Â±¸ó¤p8ĹqÖ¶ó]ÜÇomK4ŤµFI4”“É2*+ ÔĽ¬iör\Ím_ëDR+˙ŢłôM÷Zşh4ř˛.÷f`ŞŁÔ“O™5{‡2j÷3č­ťoĂZŽŹoĹÔqµł¶Ń,R\úqXÔ&ž¨i§Ş (®»HđVŞntë‹»D6ŇKIoň÷ ’ąÎ0~´JJ;ŠRQÜäh®‡RŃďĆWş^“)8Ž2Ř ž§ŘVf—ĄÝjsO˘«<14Ď–ĆqźçB’µÁIZĺ+OEĐŻőˇ?öt"SR˸ÉŔëSë~ÔôkXîo"Cnçh’' úQĚŻk‡2˝®bŃ[z/†5=bŮ®-bE· ·Í•Â)>=j­î‹}c«G¦ÝĂĺ]HĘŞ†Ó¸ŕôÇ˝Ęö¸s+ÚćußOŕ;ŹřG-Ú8ŕźžDŚnŇ8Ç8ĎJä—F»mkű(ľ×¸ŻúÁ· gďtéJ3ڶglgQ]g‹lŻ4ýJ·ĽÓ¬­ÂnU¸4¸ëśV‰Ł_kWF :1ÔnbH ŁÔ“B’jăRM\Ϣµőßę:"Ä÷Ш†^XŘ2“é‘VtßęÚ…ť˝ÝĽQ}špĹdyŽsďGÚ?ô˛Xls·A$ý Éő(ľĄ+ˇĽđ~łi§I{5şyq Ň"Č Ć=H*†…˘_k—/źrsł0UQîhćV˝Ăš6˝ĚÚ+±Ô|:tŻO5ý˛-đ˝UI•·Ś čAÁÍdčľÔµ{Fş¶H’Ů[g™4oAšJi«‰M5sŠż­iš5ßٵĽą îR!‡¨"»Ť+FŇeÔü3¶És`ŇĚ ?;…ęyö4Ą4•ÂSI\óŠ(=h«,(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  ěżăé?ĺPTö_ńôźŹň¨(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š+Ń<s-—ĂoÝ[¶Ů žÎT>ڞ‚?Q^wWí5‹ëM*÷M·źe•éC<{ďÚrĽ‘‘čE{ÄX­äřo}ŞYcěúµÜŔu™0úĺIük›–ĂIŃüáöńšÎ˘—Á¦‚ÚŢ`°Aßâ;żźăÄÉâMZ_GˇÉv[KŤ·¬’~ö7u'˝_Ń|wâ-MKUűŠńŁů|çĺ,)Ţxëiń_ĂĆH¦í°“śČŁĚ\>Łż˝'f_ްOü†`ďî+Íők:•í…ĺőëMscŹłČČąLŚńór;ć›uâ]Zę+čç»Ţ—Ó-ĹŔňĐo‘zA@Ż~Ń—nÝĆ1ĺçűßf_éšÎŃ5M.Ęű^]'Ăşä·Żo,w˘Y•ŐAęX}­yĄö˝©ßk‡Xą»s©VóĐ ¨8µő%Ő´×°ľÔK[Č6Č$C ô$h›˛K‡ĽlD­t\„Yßż'TŘśÉ=k’ÚrVô­NóIşűNťpĐMŤ»—#ĐÁ©5ťf˙Zš9u9üů#]Şv*ŕg=€«I©6RMIł´žâÇXŐě­ĽA§jZv¶BD“@Ügř[§>•WÂvϧ|O·y#ySÍcËüŤ‚}ë"ßĆŢ ‚Ů`ŹP%TmRŃŁ0R3XBîŕ^}¬M şßćy»ľmŮÎsëP ěŃ ›łG_ŕ[Y­µ}§ŤŁX,gI lŽ?CMđzĚţ ńZŰ2âázíËný3Y:ź‹u˝NĚÚŢ_3@ßyUw}H5kĂÜzO‡ő¸Ňĺ żÂÖűT’J±'ś`qëCڬŰňY·äZ…d_…·>x!ýL;»üŁ8ýZă«WZń§­,K©]R>UB…úŕÍ[łÔ<=¬Iu˘O,ę <‚ě¨cÜăU+ÇtRĽV¨Á‡oś›ń·pÎ}+ŃőqšŐΗqä˙eiňYíÝćośÉż¦:ôÇ?ťkhţ1Őb›O¶»ÔińM™ňŢXaHŔĄ$ިRMꍭ‚ü`źqĆg®ĆŞ>µšŰQ×ÚxÚ5‚Ćt°ŔVČăô5â Afń=ĺţť3i̱JąSׂ;Š›Sńn·©Ů›[Ëćhď*˘®ď©f§‘µň#kNČŰđ9·ń'źÓ.!2$ µĘdô>ťsíUő;ëgđ[ZéÚeôVFčHłÎá”>0@8ôţµÎi:Ąî‘uöŤ:á —$`‚=<źZ×ő-kËŤÉ•#ĺ(U€«‘ó\|Źšćިě>h¨ Ú×R’=H-Źćk TÖnu;->ÚĺcŰeŽ6Pw8ëĎl{Tę7Ré°XI.m bńÇ´|¤ő9ĆjŞ1GVS†SjŁnTcmÎłÂĘGüYÁ˙Wţ„Ôφ[WĆv^fŰ&Üúě?ýzgü'ž$˙ —ţ@‹˙‰¬{íbţűS…ÍË5ŕÁ¨F:cTňÉÝ>¤ňÉÝ>§aĄßŘÚĎ« ?GŐdąh$ŽäI(` ő-ÇŻő¬o_KeoŞoÓĄľÓ%%ŘŚPs‘řŐmGźޣdÖ—wĄˇq‡ ŠĄÇą&¨čÚĹţŤpÓi· °Ă`{Á¤ ěÁAŮÜč5Ť:Â_ OCžţ+5¸Éirß.ě}ĺÇ·­r­­xŹTÖŁHő Ł$Hw,jˇT\3V¬őGk]h“Ë:¨ »*÷8ÇQĽVşŽ7Š×Sßh¸‹~6îϦkĐ|CářµhȲe€ĆGO,Ýř}ęău«ť.ăÉţĘÓäłŰ»Ěß9“LuéŽ:»Śuč­"¶MAÄqcnQK`t‘’8ďJIËTNZŁŁŃ/Ć ÷fy€úějŁŕ[Y­µ}§ŤŁX,gI lŽ?C\¤Ú…Ôş‹_ĽĚ/üÓ*áNďQŽ•§©ř·[ÔěÍ­ĺó4 ÷•QWwÔ€3IÁěKŮ^ vŹĂž*d$˛¨Čô%¬+}fć ëIQZÜH˛1`w+ tç‡j‚ĎQşł¶ş·¶—d7JeÚŕ;r8ü*ĄZŽ­˛Ôumť¬¶š~ťáŤ!ő™5;Ĺş ,0C(X˘çß<óüčř–ţ$Ec’1öÂĘrę;>µ‹¦x§YÓl…ĄťáHĺU‘[gĐqTµ]ZűUh[P¸iÚŘ…€¨ýMBć»%B\×gAxŚß ´âŞH[çɧąă5­Łx‹UѢxôŰƆ7;ŠíVőĂŠŽ sQX}R+Ť·îIiv)É#ŚcôŞI«•ŐÍ˝qOü+ď ů—ú©<,˛ż‚|P– ›‚!Č^Ą7ţ›ŞŻü'ž$˙ —ţ@‹˙‰¬}3XżÓ/ZîĆ塝óą€6}AŕÔňĘÖdňĘÖÖ§EČź fű@!üwwůFqúţ´ßČĂŔŚ1ŘÍ;ęCńüÍaëZö§­˛Jé¦ ÷WT~řŐ{ťFęćÂÖÎiw[ZîňShwž@ÉçÖšÝ÷»ît~=f’ĎĂr9Üí¦Ç–=Mr5~mNkÉ,F˘ĆâŢŃV%Śź»îäNýk_űOĂô/Üŕk…5x«XjńV±ťáYîíuű9ôësssX@ĺĆGĺšęíí4˝zMQ´µÔ´ťQ"yeF|ĆßŢRzőőĹqÓßG­ö˝9,Qh—Ě,Čp3ówÉĎçZ7ţ2×o­Úâř¤\$jĄ‡ˇ f”˘Űş˘Űş6<mÇ…|IçĹ4ËL‰mr™=§\űU}NúŮüÖşv™}‘ş,ó¸eŚ=?­sšN©{¤]}ŁN¸h%Ć  ŹB§ÖµýKZňĆŁreHůD G࣑ó\95Í߬Żŕ e3 6ô»ŚűýęË×SUŠM(kÍ•ňPÂnDYŕsůóQhľ%Ő´Xš->ěÇĹC.}@ ăđŞ:žˇw©ÝµÍüí4íÁfôô J#ă™Üř–+Öř«jѬ„`18Řîü3»4ş9Sń†/ó¦é뱳úćą«oëÖÖKi˘â]«•RŔz#?­eéÚ•Ţť¨-íśĹ.—$H@cČ őÎzšźfío+©»[ĘÇQŕ9¤—V׼Ç-ćŘNĎźâ9źĚÓ|.˛?üP¶ ™±BőٸçôÝ\Öź©]éŇÍ-śľ[ÍDçh9Vę9ÔýWľŃ®LúmĂC![€CB©Áëo!¸=mätaf_…OçubĎ÷vööÎi4íB𵥟t«ą4Ń+=µÔ ´ä“‘ĎśÖ.©âM[T¶{{űĂ,.âB…|Ŕ`cě8§čţ'Őô{soavRsĺ˛+€}˛)r;|Ă‘ŰćZń®ştş{Áwsqiqn$nĎ˙wůVÜÎ¬ŚłJÔ!ĎĘ=ĄO«jwšµŃąÔgićĆÜ TęâšVeĹ4¬Â´µ-RÓ,¬îďí^ {Ĺß±Ľ g=üę„!hÖV)`€Îy8®łâw‰`ńąöiě»8V `Ăoäă·<}Ş(ä(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  ěżăé?ĺPTö_ńôźŹň¨(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  ěżăé?ĺPTö_ńôźŹň¨(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š+´đ¦—ewŕŢÜۤ—V‚"CÖ=ĚAÇÖ¸şô߆:ŚşOĽc}nÉ,?geY“r™‡#żZÄ´Ó,źá5î¦ÖčoÓT¬ßÄbťż™5KĂ^ÖĽCf×–0Ĺ m‚k‰jÍč3Ö»g_ąńÁëË»Čma‘5E-Ľ~Zŕ"ś‘ëÉ«’č±ü,đ«ęö7×v`Ę?Ń$MÇ;łÜüŘüiçłŘ\xSÄ‘Ăâ 0La!ŢÚGÂʧ8Ă ńî=+Şńlz>ˇđŢĎ[Ó4[}2âMGěě"růPŽzźp?*©ńOP7íˇĄŢŘ,6b8ÍáĺŹřOŹZžxdźŕ}ź’Ť'—«–}Ł;G–Ă'óťqţŃ®üA«E§iĘŤs(bˇŰhŕyú ÝÔ>řŠĂH—QžÖ/*ß,i(i#\g,żN}jßÁe+ńN ;%ŕŹúfŐąđÖřĽ[âĆľIV5´¸EÇ÷3ď÷ŹÓ4ćz]…Ć©¨ŰXŮ {‹‡˘“€I÷«^%ĐŻĽ9Şľź©˘-¨o‘·)ˇ¨Ů%ĂŢ@¶"Vş.B,ďßž6ăść­kŃjęr¦ş.…řĆ˙µ.xă$ňx¤}Q@Q@Q@uUŤ”ž ¸»žk•żŽ!!'!Îązx–AŚ;ÉÜT őĹ)+“%s ńŤ˝ž—ăK­íSěpc(ÜěHUQęIéSëžÔtXâ–ň40Jp’ĆáÔźLŠŐđ­”#ĂÚ¶Ą}q|,Ł)–öŹ´ĘO÷»`gůÖ–¤lßᤍ§ŰÜÁmöđT\8bNŢH8éýsIÍóXNošÝsD𾧬[5ͤH¶ęvů˛¸E'Đg­QŐ´»˝"řÚj¦8ÎA Ž˘şO¬Żŕ e3 6ô»ŚűýęÉńzĽcMÓ|…ű8m»„}Ç?ź4ă&Řă&Ů{Ćš:Eă94Ý"Űh-c‰3Ô¨ő¬[Ť&îcű0"ÉyĽG˛6 óŮéţę÷˛XjPŮ«EâµÄJAŹvÁ€Ł±ÇőŻ3đôş…ŹŠ ’ŢÚKŤB0śîc¸|f¦m|§6×ȵ{ŕ­fŇÖiŢ(dXWt«ŞĚľEsučöš^˝&¨ÚZęZN¨‘<˛Ł>coď)=zúâĽţ®orá&÷ î<7ŕąo4›Ë›¨âf’ŘIhDŕaČÜăń®şď©}'Äꀳ€9'­/mĄíˇ‹¬h—z5Äßł/#Ë?ö®«ÄţĽ—^ş5¤QZľRB—;Fí śžk„Ś*dČ®÷Ĺ3H>+ÚaČŮ=˛Ż°;r?SůÔË™5gÜRćMYôg•Ě·ÂÎ8]®‹ů~P6ě㱩x?XÓěäąšÚ8żÖ¤W1˙Ľtš7–żî7`:mż]§˙ŻQiwö6łęĂOŃőY.Z #ąJ(=Kqëýi9ľ‚u%Đŕ(˘ŠŘŘîtWŇ5Ť#WA˘Ao=ĄĚł,¬Ä°^¸úó\5uŢV’ŰÄq ,í¦JGS\˝µ»Ďu äi\ -ĐqQFqŃ´oÚř'[ąµI’Ţ52.ô‰ĺUv ëYz^‹y©jŮ@—]e`ÁŽ{ä×rńi¶^5ł˛kú¬RÄ>Ó$ĂŕçÎŃźç\Ť@,Őq˙? Są;ą;‰ü <3Ćú\pĄşŰ«HqťüîĆMrZ.Ź{¬Ü´|&FQą‰!UG©'[˙‘żµ¬iÚl"ÁÇ­Zđ9·ń'źÓ.!2$ µĘdô>ťsíIJJ)(\çużę*Ä÷±/“/ ,núdU­7Â:¶ˇgowo_fś1Y@ `ăśűÖ†§}lţ k];LľŠČÝ yÜ2‡ĆźÖ“Ä20đ†# v3NÄzü3OšZ!óJÉyśî±ĄÝč÷­i¨EĺĚlg ĐÜVÍŻ‚5Ë‹Dť-ă_1w¤o*«°öúŐż8xĽ/$çqm>"ě{Źzłăµ7ř “í b6Ś:p٧lnÎhçnÂçnÇ#e¦ÜÝękaş,Sl‡nÎAĎN†şŮ^iú&•oy§Y[„Ü«qiq×8¬moŻvş‰ z$>q9ný8­ýqOü+ď ů—ú¦Ţ©”ŰĽY˘č÷şÍËA§Âde’Tz’x>·áýCEXžö%ňeá%ŤĂŁLŠčĽmÇ…|IçĹ4ËL‘ÂŰ\¦OCé×>Ő_Sľ¶µ®ť¦_Edn„‹<îCăŹOëKťóX\ďšÝ ­Ă–Żh×VÉ[+ló& -č3Tő­"óF»ű6ˇ—!]ĘA0őWE§j/…­,üCĄ]ɦ‰Yí® m§$śŽx<ć©x×L]:]=໹¸´¸·@·çŤ»ü©©>k0R|Ög7V,l®Żć1Y[Ëq(ŠFĄŽ=p*˝Miwqg)’Ňâh$#nřś©Ç¦EhüŤ‘čWz,:=ĄŚxVmNg¶Yg¸,ăs•ŔcĂčš5öµt`ÓˇóFć$€Ş=I5ÔřűUÔmîôĄ·ż»‰_N…Ř$̡–É8<šŻáe‘üâ„´ÜBő)¸çôÝXŵ÷1‹j71ußę:"Ä÷Ш†^XŘ2“é‘Si~Őu;(níbŹěŇ–G(\ç޵#Yálßh#_î˙(Î?_Ö›Ş;†š*vµÔ¤ŹR cůš|Ďo2ąĄ·ťŚ oG˝Ńo>ͨEĺČWrrzYőĄŞk7:•–źmr#ŮeŽ6Pw8űÜöǵfÖŠöÔŇ7¶¤¶–Ó]ÜÇomI4Ťµz“[Ú—5ť>ĘK™ ŤăfQš1ę@©ţ3˛ÝŚí“n}vţ˝VŃ ×…ö©ö é:Ä˙l/´ ąůł»Śţµ“˝‘“˝‘ť˘č÷şÍËA§Ăć2ŤÎÄ…U¤ž•>ąáÝGEŽ)o#C§ ,nIôČ­_ ŮB<=«jW×ÂĘ2‘IohűL¤˙{¶ťijFÍţHÚ}˝ĚßoEÆ$í䎟×4śß5„ćů­Đ‹E}#XŇ5t$óÚX<Ë2ĘĚK돯5ĆŘM˝äRÜ[­ĚHŮhzdWOŕi-ĽGÎÚdˇTu5É+ÔőŞŠŐˇĹjŃŘkɦÝř.ßT±Ó"±™Ż|‚ËeB1ďř~UÉÚ[Myu˝´fIĄ`¨ą5ÔČŤ'Âč )mš™-ś ‡Żć+ÂÓŢZx‚Î}>Ů®nŁb˸ÁČüłJ:&vL˝{ŕ­fŇÖiŢ(dXWt«ŞĚľEsučöš^˝&¨ÚZęZN¨‘<˛Ł>coď)=zúâ¸(!’âxáId`ŞŞ2Xž‚ś$Ţá 7¸Ęę4«)<qw< ×+BBNB2?ťsú…•Îťtö×°Ľ3®2Ť×šK ŚĆÄdî*úâ©«­ k™hmřîÎÚĂĹWÖÖQ­ăŘA”RRkť,Ź,…ĺvw=YŽIükBŰCÔ®tkŤZWm:ݶI>@U 08ü+ž˘€/kZ˝ö·~÷şĄËÜ\¸»``€ŔÂŻxwŚ߇#–=ýíŁ”îtŘ®¤úá¬:(şđ_‹‰ř‹k®ř¦÷!QŇIüŻúfU~T_§jˇ«x÷Ä7útÚdš“˝ĺ1±C:v±’1ů÷®Rб§ŢÜi×Đ^YJbąĂĆŕ´Ź­Y×ő«ýR{íV:ĺ€]ŰB€@⳨ Š( Š( Š( Š( ­Ĺ¨ÝE¦Ďa¸´ťÉŃóĐ窔QkŠ×,i×·uěWvrywŁícˇă˝C,Ť4Ż$‡.ěYŹ©4Ú(·P·SKE×5äm:ŕÄ$u*[ęĹK©xŹVÔí^ÚúńĄśHP˘€Ŕŕ{+"Š\Ş÷°ąUďccEń.­˘ÄŃi÷f8î(Ęsę…QÔµ˝Nń®Żçi§n¬Ţž€tÚŞŃG*˝ÇĘŻrýޱwŞŤJâŕµč*ÂPˇH+Ó€1Ú‰ő{éµ_í'¸"űpo5!ČΨQEY˙ڵŰëG¶¸ľ&)× ©ačH®~Š(QK`QK`«šV§y¤Ý}§N¸h&ĆÝË‘čAŕŐ:)µ}Á«îhëÖˇ¬ĎÚ•Çť$kµĹ\ ç°Ű˝^úďV]Nâ}÷ŞĘâMŠ9\mŕ vŞ…¬•"ÔÚ…ÜÚ“_ĽÍöĆ0ʸS»ÔcĄię>-Öő&´»˝- Ś8TU.=Č5…E«°ąSčQE2‹ZfŁwĄÝ­Í„íŕcrúzx"­ë>!Ő5Ą„jW^p„’ź»UÚN3÷@ô•E++Ü\Ş÷:#ăOŁŹűAľLaĽµÜqĐŚźëްďn¦ľ»–ćé÷Ď+vŔ?AĹCE )l„˘–ČÜ·ńnąźöďŰě» {ľ\c#==ꆓŞ^é_hÓ® q‚F#ĐÁŞTQĘ»*ějkZţĄ­ycQą2¤|˘ ŁđUkťFęćÂÖÎiw[ZîňShwž@ÉçÖŞQBŠCQKbÝöŁu˛]Ëć-´B†Đ6 č8ţ5«kă-zÖÉmaÔD«µrŠĚŁĐ1®~ŠSѡ8§ŁEÝ;T˝Óµ}g9Kľx@bsר>µµ˙ ç‰?č%˙"˙âk˘‡˝Đ8Eî‹Únݦ^µÝŤËC;gslúÁ©µ­RÖĽ±¨Ü™R>Q…Qř+.Š9Uďaň«ŢĆÖŹâ}_G·6öe '>["¸Ű â¨ęÚťć­tnuÚy±·$čŕU:(ĺIŢÁĘ“˝‚Š(¦2ŢŁ¨ÝjO ŢËć´1,(v„Ŕŕ{šv“ŞŢé?hÓ® HÚHÁzx5JŠ,­aYZĆžµŻjzŰ!Ô®š`źupGŕŤW—Qş—M‚ÂIsiŽ=Łĺ'©Î3U(ĄdE ˘Š)Ś’Ţim§Žh$h匆WS‚¨­­GĹúćŁdÖ·wĚĐ0Ă…ERĂÜ€ `ŃIĹ=XśSŐšZ.ą¨čŻ#i×! Ă©PĘßPF*]KÄz¶§jö×׍, âB…@ŔĆŘqYQĘŻ{ •^ö-išŤŢ—v·6´ŤËéčAŕŠ·­xSÖÖ%Ôî|ő’ËUĆzýĐ=+*Š,Żqň«ÜÔŃĽAŞh«"é—mąË.Ő`O®#5ε¨\ęĂS–ĺľÜ"UHŔŔŕ:V}r«ŢÁĘŻ{˙ڵŰëG¶¸ľ&)× ©ačH¬KK™l¶sŃ0taŘŽ•(Ą˘@˘–‰5mJďV˝{»ů|ŮŘ[p: *ťSJŔ•¶ ěµoÚ/Ăť'ĂÚką”Ę×Įѻ$Şűő÷Č®6ŠQEQEQEQEQEQEQEQEQEQEQEQEĂuö}»üß%¶íëśă÷¤Őu˝ZţKÝFv¸ş“äldŕ:{^ŹŕsRÔ|!â»Űą&´´Ň`Ť±„Hăđĺ´Tövw7˛¬ŕ–yݶ5,qëĹwWZĂұµČc·ÖµaP‘Gq""ŽŔ1UFĄćŕŐ‰tí4ĘTVĆŹá˝KV·ií"Q;|É('Đg­QŐ4ű­.í­Ż˘1LĽŕó‘ęqMT—*z‰Ó’Ź3Zh®†ŰÁÚÍŲLFĄ×zFň*»`­féşEޡ}%¤ «<`–YX&0@#žů4•jnö’Đn”Ő®·(Q]Żü<3#é±Â°, Ňśg;±“\燴·Ö5hmíBwH˙ÜAÔÔĂNpsODTčNäkVfŃZ^!–Ę]ZoěČ4;#?0ÄsëW<%ĄC{q5ćŁĆ™dľdçűŢ=ĎůëTę(ĂžH•MĘ|Á§Á łĘ±ÁË#tTRÄţź{,sÝÍ,0¬13±ŻE…zÂë©tď řËP±ŰˇmoŠr ”¶@χĺZ-LŮçRĹ$2´s#G"ś2°ÁĐŠmt>¶oř±µfy Ŧťú3ŕdţu­§˙bř“íÖVúBXK5´ŃČIů{0=sW]T® ím·ň8Š(˘ Ü(®ßÁVZłX[ŢŁ__Ţ–Ěy*–ę3×IŰúţ|}ú,w× ˛0ĐTăes(UR›…¶ ˘Š*MBŠ+¦đ˝•Ši:¦±©Ű›¨ěö$pn*Řă$ŽĂЍ®gb*MA]śÍŐę¶úv©áwŐěl–ÂâŢq ±ĆÄŁ‚8#= r”J6:śëkX(˘˝BmöĆçPżđőµ®›n0Óy®Ĺ߲¨îiĆ<Ú\šŐ}’˝®yÝ-ŰÇ-ÔŇA•;2GśíRx…EPj‚Š( aEuńG¦h^Óo.ôäÔ//÷żď\…Ťăç"©xÇOłµ}>óMŤˇµż€L!fÝĺžŕJ· +Fş”ąmß_Cť˘ŠtQĽŇ¤q)y…UI=A¸Ú+¤ńuť–“ž—h×Ń&űąÁ'.yŘ;`gůW7U%gb)ÍN<Č(˘Š’ŠU` Ŕ'­w‚ĂĂÍáýf=:&ş¸±…XŢą#{Ź”z žµqŹ1•ZŞť®·8*(˘ Ô(˘Š(®ĂÁźeÔ<č6÷R®Z[©&e ąÎHŹzČńlÚdşĚD€Cg„΂rĂ?犷Gšć1«zŽťŚj(˘ Ř(˘´ü7¤ľµ«Áf‡jşWţâ§ü÷Ĺ4®ě‰””S“Ů”Vź‰&±›Wźű*‚ÉČŔĎĚńúőü«2†¬ě|É;QH ˘¶üĄC«ëqÁtĚ-‘Yvő*Ł úń[šZčž%šçN·Ň„Â&{iŇRÇ+Îjă Ł •ÔVŰ#˘Š* Š)Ń(yY‚† =˝6Šď`—Ă?Ű6Ú-¶–·–ň”މ[{;öÖV•áëyüq.“4ŚÖË&ć–UÉÇ× 5§ł}α ÍÉ5e‘ËÔĐZ\\G$A,©.Č…‚ýHéŇ»?űÄźn˛·ŇÂXŕy­¦ŽBOËŮëš‹áVł¨éŢ-Óí,.|«{ŰŇâ2.zsěN*\l]:śí¦¬ŃĆŃ[ľ“ńţUOe˙Iř˙*‚€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( ˝3á–Ł6•ŕ_^Ú¤O4?f*˛¦ő9fŽýkĚëoĂ~*ÖĽ6· ˘Ţ}NTÉű¤}ŘÎ>đ8ęzPwâ{ŰĎ|-:®µlm.lnŐ-öŽ9‘°8Bq‘žľÇŢłĽY·? Ľ=ş4‘ÄÓÄĺFv±~čk•ńеż,k¬ę\¤gr¦ŐE× Ď˝MáżëľŕŇoŚvîwťÔPĄ0:ʉQ‹Qŕ‹[ĐH4ŘDčßÂ2Ďä*łń.ß\“âäm¦ ľŇŢI°udç¦nÎxőŻ:Ö5KÝfţKÝNĺîn_«ż§ €=…t6_ĽSe§-”Ły(»š4gUô Fh{áúę ń˘%Öť_R0ť—n yMź»ÇĺZÚ›YŢü9ÖăđTrŰ´Weő8Ą9™ăçGđńÓĐ7ľ|·JÖµ +W]RĆĺ’ýK7śĘĺ NŕAÎOZ“Eń©˘ßMy¦]g™JHv+䂬?•wź Í đ/‹ĹÍĽ÷ LŃ[0YZ<ž‡ÓďgŰ5_[Ôědři-žŤ˘ępiŤx˛%ÍÔŠč˛w ~žžőĹhzö§ˇ_5ć“tÖÓ°ĂQµ‡ˇR1ŹÂ­x—ŚωK«Ţcĺ#TTE>¸sîhĄř^Ť'‡Ľmj]ŰL8U'†í^~cpÁJO@F*ţ…­ę:ďÚô‹§¶ś®ŇĘzAń©ĽGâ=WÄsĂ6µuö™"R|´Lsü RÓ.®ôßxM´ń^‘¬i%eŽ®m_Śçĺlv' 8őŻ4ńŽź6—â}JĘćéîĺ†R¦w$ł÷çľ1[6żüWmf¶Ńꄪ.Őw…ÔĽFOă\ťŐÄ×w2Ü\ČŇĎ+wc’Äő&€4u{}r-:ÁµeżLźčźh-łn?<ŚtíŠÉ­ťgÄúľµ§YXęWfkk1”ŞŚq€I$ăŽk€ ô†ßň*xçţÁă˙gŻ?®»Ŕ~%Óô}bŰVłžîŰQ…ae‰ÂsĎăLF˝áŹü€©4š5´¶¶'o—Ż˝—śź®MuÚGŠĽ?¤řcP˛˛ŇŻQľ±6łÎfŠăp ÉÍ 8{[«‹I<ËYĺ‚B1ş7*qé‘]wŽ5;ř.´Ĺ‚öę5}>'`’°ÜÇvIÁä×Vµ űťAákÉ|ĆŠ1  aAŔ÷¬gIJq—kšÂ«Ś{—|"@ń>—źůřOçQřš7OjŐ—ý&CČěXâłcvŤŐăb®¤`pAő­›ßë7¶Oiuzd·p)Ť2@9ëŚö˘P’¨§ÖegÉ/SK]Y_Ŕţ000}ŁŤű¸ĎżŢ©!#jX¶Ó´ŮEŽZźÂsKaámnűOP×ĘČ„íÜR3Ôăóü«"k0X}Š;ćű6Ď/c"·ËŚc$gĄQŇő;Í*ŕϧÎĐČF  Źpx4{ş^ÍŰK|ýt˙0öĐU}˘ľż‡§ôŽžňę}cŔ׺˛‡¸‚áRŢrYÁęĽuČ©Bé×^°ÓáÖ-l‡úŰ”pK<ťłŹOđô®cWÖő\§ö…ËJ©÷TŞ?+:áݵvÖúl‚X…}ô¶§[㕎Ă[ŇÚ†EŠŇűź$fäŽŕâş»uĽQđďĹqIaa¦ 4†`t輕—,~W9űż­yގs¨Ý«z0p‚‹ÜƬÔćä„řhGü%p®FçŠE_s´ÖŻď®..Ú‹H ŹL°ž7uŚ«vűç׏ç\}ĺÔ1ëÝhË-¤ &řľ^1ŰźZ˝©xŻZÔmÚîőšűꨩżę@®M$pVˇ)ɵ×đßüĚh!’âhá…ĺ‘‚Ş¨É$ô-ý•Îźtö×°Ľ3®2ŤÖ™iq-ĄĚWÎcš&Ś;ҦŐu+­VőîŻĺóg`lŔč08¬ô·™Óďsy˙„ÇM88ÜÜ˙Ŕ±u@FŁuGď_ůšÔÓĽ[­é¶QZY^ůvńä"yHq“žĄsÔŐ]k^Ôµż'űNçĎňsłäUĆqźş «n<¶1Śj{W&•¶ß×ČKmRąŃ®5hm]´ëvŮ$ůTńÇ'?Ä?:Í®ËVń˘ü9Ň|=¦»™L­q|Jí˛JŻżQ˙|Šăk3 +°đÓ8đVşĐ –Hf·ˇĎ#ÓšăęŢé&}:ᡍ¤€#ĐÁŞłÔĘ´ăeĺřUĺě—ŢŐŻ® ŽßíwŃěX×j’g—çšä´Ý:óSťˇ°·’yUK•AĐőcY×ud§öŤÉ•cű*ŻŕÍWľŃ®}:s Ž»í ‘ô"ŞRRjäS§:p|¶»űŠi4˱mż7>őŰř~M{Ań®…/Ďlň$;C##csGˇý+†wiťÉfc’Os[ŃxĂ^ŠČZǨH" ´ŞXMŘĎëD$˘îéʢ˛Iúţe/Ă ·5m@G;ŞĐz~(Ô´=KL˛ł»żµx-ď|Ä~đ`śô#óŞm’tóÜŞ3 ďŚ3É÷®łâw‰`ńąöiě»8V `Ăoäă·<}¨złh«$ŽBŠ(¤QŢ]ę2éžđÍüĐ\ ‚xÎMČ aúđZÎń˛´Z_†ŕ”™,˛ČFÉă?‘¬˝Äz®Ź Catc…ŽâŚŞę¨UFúçQş{›éžiŰ«7ůâµ”ÓV9)Đ”f›Ů_ńżůŽ‹L˝›O–ú+iŇ&ÚňÂźňGç[ż ˘ŽOBdPďo$H‰ÂńýOáXöúÖˇo¤Í¦CpVĘcąăÚ9éßS·ž[iăšŢFŽT;•ÔŕRšM3YÂs„˘úěwţŐµ~÷R±×TKcäČň†/ŮŘt#Ś\ ť´×—pŰZĆdžgĆ«18µőëZŤ›ZÝß3@Ă ŞŠ»ľ¤MXřy¨iúO‹lµ ]Ým­·H&âÍ´…™ĎáNrć±4i86ÚJýŹ«é—š=óŮęP.ѱŚŚŽžŐNŻkÚśÚÎły¨ÜźŢÜĘŇýĐzŔ`~Fł:şĎ ©˙„gĹ<ř÷Ź·ą®MIRę9®›ţż˙ĐG˙ G˙ÄŐÁ¤îĚ+ĆsŹ,-˙ ýĚAć´µ-RÓ,¬îďí^ {Ĺß±Ľ g=üęËٵ]LÝjs–’VQ,ˇŔ ŕ ptĽKµČłK˙eٰ[xÇ'ąăčI˛˝µ9 (˘Î‚ÍuŻYÚjvěŠř­śşŔŽą«żă_í :áâXo.lŇ[”QŹśç$ű˙…ehţ%Ő´x>ńŁ„śě*¬őź{q¨]=ÍěĎ4ď÷ťŤhäąlŽhŇ—´ç•şúżRŐ¶‡©\č×´6®Úu»l’|€Şx㓟âťf×e«xŽŃ~é>Ó]̦V¸ľ%vŤŮ%Wߨ˙ľEqµ™ŇÚx>y´˙ ë·úr†żVŽ2vî)ęqůţ^ŐĹŐÝ+T˝Ňn úuĂÁ!$`‚=<¸K•Üʵ7R¨ęŻn®5Ż\_k ćŢĺRÚŕ Vp~ňńÔ/jć4=Q×nžŰIµ{™Ń ŚŞ@‚y÷"ź¬ëş–˛SűFĺĄTĺPŞ?­˙xŽÓĂžń #¸Ö/"[{`…^w6îÝsř '.f*4ÜOľËˇÇ:”vVűĘpyÍ%T´MNăGÔˇ˝´+ćFz0Č`x ×nu+M7·´\}öŁş1bWřśgîŹ@=«ÎŞćĄ©Ţj^GŰ&ó˘PˇB(ěV‘ź*9ęĐU$źßţDvÓ^]Ămk’yśG¬Äŕ źWÓ/4{çłÔ 0] Łb =«cá桧é>-˛Ô5wu¶¶Ý ›‹6Ň~g?…dëÚśÚÎły¨ÜźŢÜĘŇýĐzŔ`~™ĐQ˘Š ‚:Šítëtđ†žš•ěaő©Đý’݆|•?ňчݷ˙_ţJóxĹZg-4É.Kuf*OřÔđťřŹţ‚?ů?ţ&±n5;ËŤLę2Nßm,ÍPätĽ:ćün·~0Ń iZ ÷q čpĂćcďNÔĽW­j6ŤmwzÍ }őTTßő ŐŻëZFx÷Úž—-ýä,’Zm—bĆĂ<ź^vö=)JIŮ#Z4Ü[“ŇýŤĎŠ){ÍcXŇN‘ĄÂ±ÜţÔ ˙H;©|÷ǧC\n‡˘ę:íÓŰi6Żs:!‘•HP@Ď>äS5˝F]_WĽÔ.‰neiX/A“Đ}+ĄđWí<9á߲;Ťbň%·¶xUçsní×?€¬ÍÎ9ÔŁ˛·ŢSÎi(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žřő¸˙€˙:‚§‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š({/řúOÇůT=—ü}'ăüŞ (˘Š(˘Š*[WTťYŽgůTTPEMĄĹÄrIĘ‘ňěX/ÔŽť*(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  ěżăé?ĺPTö_ńôźŹň¨(˘Š(˘Š(˘Š(˛řU¬ę:w‹tűK ź*Ţöć4¸Ś€D‹žśűŠĘńâEŤ5¸íăÄ·r(@0ô”Ďۭߌ4hV=ÜCz0ů‡CŘű×QńCĹ/y¬kIŇ4¸V;Ú„écu/žřôčhĎh­ EÔuۧ¶Ňm^ćtC#*0 ž}ČŞĄ•ľňśs@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSĂ˙·đçPTđ˙Ç­ÇüůĐQEQEQEOe˙Iř˙*‚ĄµuIŐáF•E@Q@Q@Q@7ő­#AĽ{íOK–ţňI-6˱cažOŻ;{•Ť­ę2ęú˝ćˇpKs+JÁz žéT¨ ËÁ^#´đç‡|BČî5‹Č–ŢŘáWťÍ»·\ţ¸Ú( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Š)éŹČ‘»G7°RBç¦OjenřCÄ÷ľżi­rA6âŢE ł ?tç§SÍaQ]ŹĹÓH×á›K]š~Łn·§dÝś¨öďř×@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQEP$2Oj+˘đf·§hS^ßiK¨Ý Sh$|$n,G~Řăň  ˙‹ÉöFđĆť'úűM"z˙ÇkĎŞţ»«]ëš­ĆŁ¨Éć\ÎŮb°Ў@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETđ˙Ç­ÇüůÔ> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ6ś"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPEPEPEPEPEPEPEPEP«`ĘJ°9jö•«ßéZ˘ę67 ę–"VÎXIÜ9ÉŞPŐô`+±wfc–c’i(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€  ‚:Š(  z¶Ąw«_=ćˇ/ťrŕ}ˇsŔtRŠ)‰+h‚Š(¤0˘Š(˘Š(˘Š(˘Š(˘Š(§Ă,Č$…Ţ7Nüi”PEPEPEPEPEPEPEPEPEPEPEPË]NîÖÂîĘ ¶[]íó“h;öśŽHČü*ťQ` (˘€ (˘€ (˘€ćÉäĽÇň‹nŮź—=3ŹZePWouKŰŰ;;[«‡’ŢŃJÁĆ#®?!T¨ Š( Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š(yżăÖßţüę žořő·˙:‚€ (˘€ (˘€ TRł J–Óţ>á˙}ť]ń‹yáýV];RT[–ۇ##ꎬÚ÷o_řwţbi–ě·Ć¦»’Cş2Ŕ*…pç<źJóI´[ ?â4ÚMÜW—:|7LžU˛ď™×’ŞsĐĆĄíżđŤŮkz~ŻoqŕÉ4%··y¬ď7ÄŻ@ţç®9ďéšĺ>ŘčĎá/jzŢž·˘ÇÉx×qRI'ĺČč Ŕ>Ôç´W˘ř’ŰEÖţ'´­.=*îÚđZÍLJ8#9úňż­Koáoh×úŽ‹­¨jćF"Y ăSŹ”€py_|źj@rŤá=Qnô{vXDš¬K=¶d##'µOâokÓŁ˝ÔŇÜ[É(…LR‡ů'·˛ščľ1›c… ‚˛Ůť1 *Ç$'A?LUkďů"ý†[˙E˝08 +Ąřu Ăâ?Yi÷e…«n’]§Ş©8SřףËákMnĎVµ“Áňhg岽~r˝óëďďH­8ô;Ů<;.¶Şź`ŠqlÍ»ć߀zz`Šę~iÚLZ˝â-nÍo˘Ó–4ŠŮ…gsŽŁżS[ZĹ|ĽąŇtń§+ękç[«—U“jň¤ö#iÇÖ€9Ťáćż«é6úŤ”Víop 4ę¬Ř$t>âąÍ_L˝Ńďä˛ÔíŢŢć?ĽŹüÁî+µń#áw‚8 ÜŕŹ÷ęo‰_épř"ćă÷“Üi°‰]ą/ÓŻć:óŠ+ĐĽ]Łiöźí´»kHăÓÚęŐ ÷Hm›‡ă“RYčşsükm%­":wÚdOł˙důĐśŃ^Żk/‚ő-OVđýĆ“kĄE•mő).pĆE8–ŔëŚă¶+—řuiaquz÷š-öµs`ŰÚŔ§Ë,sĚŚ:ž˝č«Úv‘}©[ŢĎeneŠÎ?6v ÄőäóĐôŻDń燭_Á)®čŚ7" -Á;dB8`>¤~F´>kšcř[_Uđý˛5–š Ă OúfČn8ÎŻZńÚŢŇ|5.Ąá˝OXKËHٱ 42>$~üÇŹSLńFݧęŇ۶›˘ÁĄ,jC¬Ró čN@é]­¬şĽâk« Úi÷:t1–9 ’X‘žwő /˘şo‡#ńu–źxXZťŇJŕ•U'÷8ŘéËáoŤcLÓôôÉím¤¸´şŠBK„ăćr:çô (˘˝ áÝŽŚţń6§­éëz,|—Ťw$’~\Ž€śíOń%¶‹­ü>OiZ\zUݵ൚(”pFsőĺZóŞ(©-”5ĚJĂ ¸~4ŇÚř_ą±KíP]éČŞě=@?Ö±t­"óSŐWNµŹý,–íÁPI?C]ŻŠîf_‹ÖŰdaĺÜ["{) ‘˙ŹάhŞăMŔQçLňV ¤­wÚ未ö<Ń”«=AÁ¤ŻDÓcТu’1ćÎj™2rŰçšęľ9¶đŽn˘âa1¬XçúWe,p^A4ЬńG"»ÄÇ@J“ďŇ´$žM*ö-&Mŕ"ĆY I.F äc9ěj•{ ÷4„řo¦Ţ?†­^ŇK×Eł36Ô`ćĎ­yŞj–+â?í¤Blwűvcn1»Ż^k*u%+Ý&­áétÝ LŐîŇTľ¬Qľ]?Ţç±+ĽńĽ:\ţ đţݦéPéŇ^I2Č‘1n¶ŽOÓ?ŤMŕËm*>§¨iP_Î5D¶_0‘…e\ôëÔţ4•[G™÷ĎhŻSńnŹ˘®‰â¨l4¸ífŃn ňçW,Ň ö8ú Ořv/iÚś~m~ţýť™YŽČ#Ü˙ŹĄ/nąooëp<¶Šěľ'hÚ&Ła5Ť´–_[,ćÖF$Ŕ˙Äą<ńÇë\mk )®d¶–Ó^\ĹokK<¬G$×C©ř\Ó¬d»žŢ6Ž!™DR†hÇ©©x;U‹Dń%–ˇp…á‰pŁś+‘ôÎk¨›KĽµ]KXđ†±ü#ŔUŤą;•łźŻ¦riب¤ŃÁ[Dg¸ŠʆFÎdă$úUďi˘joe-Ä Ş|-•ç·Ö¤Đ5+-9§7úT:p6‰$+łÎ1ëźŇ´~$XZéľ*žÚ‚ŤEč Qš|Ϛ¶—9Š+ľDŃüˇj7Z•ĘUívâK˝jţâbZIgwbNy,kŇ|ˇÚĹŞŮxzjrÜ2O’ăČAśa}đLüŢŐb<˘ŻK¤_EŁĂŞÉnFź4†(ćÜ0Î3‘Śç±í[ľ-źJÄ–“Zh7:x‹cÝé×YUf$/p¤qý+żżńŹĂ=2ůü1hör_á .öűJMJóR2ŢHT")Çčyźµ7âq€§‡Mš˛Ű9 AŽH^Ŕţ•KÉ$¶GEzµć“cĄAd¶ľţ×Ó^yocrŇ6zO^Ăé^gz-źR”Y$±Ú´„F˛ýő\ô>âś'ϰJ6:Xü#—…¶|A¨ 'ą‰ÚÂĚ&dśň“čąÇŕ{UhÚn»u5•ö¨4ë·Ú-Ótr9<«ݰťtecă—·CmmqŻ`1źë^~GZ˛KÚć“w˘j·~ˇ—q m#±őr+ đ˙„­üEˇI&‘¨«k+É&ť"`Č€đQ»śvőô­O‹ĎöŻřEďäéZD/!ő=©®{áĺÔ–ž9ФÍyGžÎÁOčM09öR¬U =©+ˇř… AăŤr8†Ôű\„Lś˙Zç©QEQEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPR[0K™ŽXŽŠďüYâ 2˙â˝®łisći©qlí7–Ă ›w¤gŚŐoIńn“cńkPÖĄ‘źM¸2"\,g)¸ >Ň3Ű3Íy­ëÚ±áíăT’çĹ÷š´·V’Ĺř%ŘĄ°Fsś±őč9Ír>Öl,Ľ âť:ć}——ľGŮăŘÇ~Ö$ňâEqôP_g¬ŘGđ˛űGyń¨Ë¨¬éĆĺ6¨Îěc¨(k:>­ý…;Kogd¶ä:2”Ç@r98ôČ©ü=©řRđđ˦I çÚˇť`i•˛¤`…çąý+€˘€;?jş_ü{kya|úž™Úó LC.ąŕźÇ±¨Íá›;]Bę?ꚡ•ZX§›F=7±ęáÇ­yĄÜü>Őô„ѵÍÄ7ii©*2\ŞşśŚĎ\ÂŻkzʆě~Ď hÚ›ŢÝýµggkwŚKŔ†F“ž+Î( K~ÖĽáÝ;U×ßO¸ÓĽÓ$Ig$Ą·6pc×­`řűÄ6š¶Ą§EŁ,‹§ivÉmle3íţ#ú~UÉQ@Áu«x3Yń-—‹o5y­naÉ6źövfiSpĂŚp?!ŇąmÄÖŤńU×4Č|/¬čwÚ¤ş5Ĺä‰$WŃŁ7L|§o qí÷ŤyőéZţµˇĹđîçD˛×.uKöĽYŚ“Ĺ"ďŰ»8QŽ„ç9¬Ź‡Ö—§ jĂ[šKkMNĐŰýˇż–yçžć¸Ę(o_Óô[;Űhô}iµw˝”ÚĽ^_>ŤÉăšď4#ŕ˝'@×tÁâć”j‰ť0ňö=1Îw{W”Q@§‡5M+ÁŢ=´Ľ°ľ}SLE+$ÂĘA·<|WAeŕ˙ &Ż¨čš´ÚŤĺĺ»ÁmmövA|}âx8 ~Ąy]ŘxgY°˛đ'Štë™ö^^ůgŹcűX“ȉ–zÍ„ /´wźŚşŠÎ‘lnSjŚîĆ:Ćs\…Óx ÍŞNľ.šX­$ÄSv äuÚ éśW?1Ž;É «1‰d&6aÉPx'ޡ˘€=.çPđ¶©Ż[xŽëSšÚâ?.IlĽ†bŇ Ă1Ŕ˙ëV/‡ĽCh>"¶µ~ćŢÖI%rJ–*HQ€ î+Ž˘łT•­ň+ťž§ßxoB‹TÔ´ýB[›»¸mSî~fčqÇ5ÎxYtiá5‹»›° µÔ@°ŤąÎ@äöýk ŠjľˇĚw~%ÖlÂG‹X›Zşk/ź$l˘% -ÉüűšnťŞiş§…ôý6űWźH»±g *ĆβŁŕí=Gż§˝pÔRöjÖcgĹ3iň_G“=ŐĚF§¸bLŤÜ€zjąńS´ŐµĺąÓćóań¦íĄy‘‚sTU(Ąo!\|ĽÇ4LVHŘ:°ěAČ5ßřßÄúUö„ńé~רË÷«±†Í¨Üä™č}kĎh˘PRiľ€¤Ň±Őř/X˛µ°Ő4˝NâkH/• ÜĤťNAŔçáďQřŤ´4¸í¬µk˝Vő¤Üň¶ä‰Đ+u>őĚQK‘^áÍĄŽëávˇb± ęł‹kmf ÎÝAťą˙ľŹä+›ń>}á˝PŘjJ‚]˘Dd`Ęčs†đ=k&ź$˛JI#¸EÚ»ŽvŹAč*Äw:6ˇ ęž‡BÖµ9tą­nÚá%í2¸ ń…úšćí¬4‰*x‚Ă\˝ŇăÓ®$˝ű°†KŮcN޸8>˙‰«:.ŁáíWŔ0hć©.•=­Ű\G(·i•ÁŚ/űĆĽúŠíü«éńăÎ÷Ou¦xRńa*@ aöG§Ż5ÓčzLJ´ŤRKźŢjŇÝZK{ŕ—b–ÁÎrÇ× ç5ä4Paŕ˝fĂMđ׋-/gňî/­R;uŘÇ{ ٨ëŠă袀;?‡Ö—§ jĂ[šKkMNĐŰýˇż–yçžć±> /Pattern << >> /XObject << /Image18 156 0 R /Image19 157 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 160 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 161 0 R /Resources 162 0 R /Annots 164 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 161 0 obj << /Filter /FlateDecode /Length 163 0 R >> stream xśµVKnÔ@u{‰şÄ,PÂ8 ťţ–D FB˛”aI„ś„ ,˛áÉQ¸Ä¬@`–Ye1'`Uvlw&|Üňt÷sUWő{]öŚArÔ7#,öo` ‚ !Ł VÚb~ŽFÔ€vÖ;Q»WýD ë *›Đď>lÁ!Ăú“ęăţŽ€˝OAŃíŃcp-b:j8Ţ»Q¨}Ř]…WŘĆI$YGŞ.+}°’ăA«‰ b˘—vX•`ĆhŰ`˝oŹu!)¨-»ý¨¦¶ťPoÖČhŃKĄđ-˙Ń+k"ň.|đ¤APÚŞh(ůŤ×(ŹaýŮŃág é Pî^Ő5âmwĘF´ňĽ†a¶Á°’moł5–±Q5oĂl–óiţ3źfŹ PäşFöKżůŃ-sˇń„ ܢ±xĆ;›öžgJr SnˇŔÚpwUßü*ĽÖ ĹNPĐ_(h+)źOńÔÝ"+ŮE"ě¬Ŕ˝ÖŁ |ާd‰´Ďżćß{µoš°†{c„šO»Sö6T¸Č}ÄËÎóQ@hvÄŘ÷ż†ű:©wŽü`ełM,ÝXM˛ól–mfSć°XF8ź-(ŤI[Í“l†vçŘ epҰ}Ňq;ˇ°×tA¦G˝ËJ>˝=ĺN É2žźĺ§ů)¦^6ÚŢŽ‰ŻIiíÂ`wP¸&FA¦AzoytTąR{,Ćč{°J@é´u’FUçťbɇâ>ßZ­żuĘé-5Y¸X ÷ÇuÜ˙úóť˝÷2ŔÓŁŽŞ?ńˇ\Š ‰Ś;/ô:éŕ˝iň»« ^»ŔŁB4ńOĐ„“ű ĐňV/Jhgđż†Zč×qŁDĎ µßFž»Â endstream endobj 163 0 obj 725 endobj 164 0 obj [ ] endobj 165 0 obj << /Subtype /Image /Interpolate true /Width 1204 /Height 84 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 166 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔT´"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQE=—ü}'ăüŞ žËţ>“ńţUQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@W_đŁMłŐĽqeg©@—Î’Ťú!#ő BŠěµ‡zýŽťs©=¬_g‡/$I(i"NąeíÇăXžđć§âKǶŇ`óYtŽĚz’zPEŃxŁÁÚż†˘†}F(ÚÚcµ'†@čO¦{*ćŹđ÷^Őôű;ëH­ĹĄĐb˛É0P¸mĽúz äh­?hZ‡‡u&±Őaň§0ÁČe==Ç×ř᮹öÝ"îţĘ&ł’â'–ÝĄg”\n%}0yď@{Ew:µÖŹáŻkÖóč6ú…˘ËĺĂ ČPEŹN 7âÖźaa­éźŮvqŮĂq§EpŃFI™ź=}€…qV·†ü;©ř’ő­´›5ŃwČĚÁQ©'V|Oá[Ăi şŚ(m¦8Žx\!č6Ú0đ¬ f¶×3XĆnÔui8 ź|ć€8:+ŮĽC„m|ržąđÔqĹ3EŢA;+ŁHßLźZóçđŤěŢ5»đîžR[Ą‘Q¤`ˇ•rA'×Ŕ樭] AľÖîî­¬6–ÚžMÍ´mRÇć*o x[Tń*Ý˙dBł5°Rę\)ů‰ú@bQ]/‰Ľ­xrĘ+ËřbkIo›Ő[Đă§jw†Ľ­x†ÍŻ,ˇŠ;@Ű×Ő›ĐzĐ1Elę^Ő4Í~ú ěΉćŔ`Ý1žőßÜü+ş˙„BĎČŠÔkho:Cuňđp8ĎJňz+i<5~ţ'ţÁGŰ÷˙Z6d.ď˝ÓĄt˙tíCJđ¶‡g¨i:e¨˛-Ýł‡yîŔüO^hϨ­ řsSń-ë[i6ţk˘îvf ¨=I5kĹ>Ö<2É©Ŕźgâ9˘pčÇÓ#˝sÔW]Łü=×µ}>ÎúŇ+qit¬˛L.o>„ž‚±Ň6澀sVŻô GĂ·âÓUĘ®ő †W_PEnZ|7ń%Ő‚]Ggů‰ć$/*¬ŚľĘ­¤R»`qÔV¶‰áíGYÔ®,,ˇkäŽF@R÷É­ą>x„ElábóĄÂź5q“łÔŹđőˇÔŚ]›Ž˘µ<= j>!Ľkm*ßÍt]îÄ…T¤žYń'…u_$2jˇ·â9âpń±ôČďő§ĎňßP0¨ŻIđŹĂąoô;ű»č wšĚK`EĆ6ą€2řoqâ[ßřGě­ŕ±U_&&)„¶‚ry=zWśC§^M© >+yôÉĺy |Űł‚(…XÍ]0*Ń]V±ŕJÓ弸·ŠHˇC*»EţđŹe˘Ţ^醧ˇµ±ŮçŘ#qŔŔďT§®´VŚz-䚺ʪ}†)Ĺ»6îwOˇĄáßjúő‹ŢYÇ vŠű<Ůĺ«7 ĎZâ•Űś˘´üCˇjľš¤TĄC© ]}Ak2ši«  +ˇř}em¨řżOµ˝‰f·ľän‡±¨ˇ{â $žđĄ¨*Yýˇ¸íž•j:\‡;>T®qÔV–ť˘^j:uí嚤‘Ú Ó(aĽ/®ŢăŻĺGö-ŕĐżµÝ,ŚžRł0Űý‘ßżäiYŹ™´Vî…áMWZµk›HŁK`Ű|٤¬Ţ=jĄć‡¨Yk1éwpŻ$uEV# ¸ŕzcŢ‹=Ăž7µĚÚ+¬okŞĘ;`<ñťqí»Ó=ľŁÖ˛ đîŁ7[EX”_©e(ĚŕgŻŇź+©ł2(®–÷Áĺž™%ôÖÉĺÄ7H‹ /ë’˝Şß®´©ď,t«ý ©g›aąiX ô”r»Ů‰ÔVşÔăč­A·58 @Ĺu*"ŽŠˇČŻh^Őu»Vą´Š4¶ ´K4Ź ĎZVw˛+™%v`ŃWµ­&÷EľkMFŔn †#¨®‚?‡ž w+ä@§®é”oă8_Zj-‰Î)]ł‘˘ş/ hQń|N¤ŹWo=:0Ú #ńĆ?číĂŢ'MZĆÇG[ í`yí®BK…ţđ÷ČőˇFâ•EyŐŘř;BMgĂ:˙•j'Ô#0-ąÎ ’Ç=ńÓÖ˛|Aá}OA†Ż˘CÇ ,Nsé‘ŢŽWkŤT‹|˝LJ+{Bđž©­YµÝŞD–ŞŰ<٤ z őŞZîŤ}ˇŢ mJ.B»Ô‚Y}A¬íq©Ĺ»_S:Šę-| Ż\ŮĄÂ[F¦EŢĽŞ˛2ú…?Ö±tÝ.ďQŐcÓ`ŹnĹHvŕ€I=:9X)ĹěĘ4WQsŕ]zŢÂką-¬#t‘¬€Č«ęWéřÖ<:EÜÚ-Ć««ZA ŠC»ćRqŽ=9ŃĘĐ)ĹěĚú+BŰH»¸ŃîµHŐťł*;3`î8ŔżQWt/ jşŐ«\ÚE[ŰćÍ EfôëE›$µl¢®ë]ćŹ|öšŚ- ę3Č ô Ž®†?‡ž w+ä@§®é”oă8_Zj-‰Î)]ł”†)'G o$‡˘˘’Oŕ)•ˇkqáíif„µ®ˇi!ĆTŚ8<+´ń´vţ"đfźâč ŽŢüÍö;ĺa]Ŕ$>;źô¤YçtQE (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˛˙ʤü•ASŮÇŇ~?Ę  Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(®ëŕźü”]?ýÉô[W W´M^űCÔcżŇçň.ă+ěVĆF čh˝řYq,Ţ&ńH•Ë ôë—âmĂ“ůźÎ©řM·OëÚΧw© 6&H%ł°}†|ăď˙˛7:ätťoPŇ.®.4űŹ&kš[b¶äb AÇAҬřkĹż†ä•´‹ł Ë"ŻŹPA ˙Ym:_¶‘g{keý˘¦5»päś ˛źî˙\ÖWŚ%qđŁÁq"6iŮ—Ô†8?©üë›Ö|eŻëV2YęzOk#‰ f4ÓŘqY÷šÍýî—c§\ĎľĘËwŮăŘŁfă“Č?‰4ÜüFK'ş`ĹôŘLŽÝÇËśţµ±â¸56řń§ĽK)S5»BŔq䀾gá÷óőŻ.Ő5‹ýR (oçóc˛„AŘ«±AŔúśšÝ‡â/Ša°‚Ň=UÄPíŘLh[ ,FHăż^ôŔâgüŹşçý|µnüa‚WÔ¸ č4Ż(Ňl"ł±Ő]-˘Q(ßhô”śR§ř^mĽ^.­ç¸P!ó˘¶m˛´y= í÷łíšŻ­ęv2|4–ĎFŃu84ĆĽYćęEtY;…?OOză4_jš&˘÷Ú]ăŰÜÉťě!˛sĘ‘ůUŹřłYń ‰u{Ă,q¤jЧ×}Í0:ŻGq/ÂĎ›Eg´a(A‘ćÂçßďÔßÖáÁ«{»íCNK»®ţ3źĆąOř×_đýŚ–zUűElĶĆEp¤÷]Ŕâ©k^!ŐuąmeŐnÚâKdŮ2( g<ŕ ýNhŃ|cgqyńÖŐmayJ\ZHŰFvŞ„$ź@5'‡na“ö€»dpU¦ž0}XFAˇ®FçâW‹®ah¤ÖdĂd1ˇüŐAĘÚÝOiwŐ´ĎÄl$S† ëšôŹ…ö76Z˙ŠĄ»…âŽŰN¸ŽVq€­qůjźĂY/xéŁb­öűÁ¬mkÇŢ$Öt汿ÔY­śbEHŃ źďź§JĆÓµ›ý6ÎúŇĘ.Ţůw ±NőŔÉOLRÍŻďmĽ-{ "ÂÖ7R¬ĚXčŔňśŕghĎ»Il4ťÁ>oɬę)|h-­ć đţ#»ůţ>e]6‹ăżhÚh°°Ô ZŻÜWŤËç?)`q@7Ć­Ą|.Éѧ.s™q€ÇÔw÷ŞÚŚo/Á=ĆŚá597mÇÖą wĦĽÖí«ÝµË[§—2¨!}Č?SÍZđ÷Ś5ďŰÉʍ=Ľ.Ű™ #®}@`qřS#Ú·zcšôĆçáÔ#nÝdcźőŤ\˝·‰ő‹oI­Áy·T±iĽ¤9ČÁůHŰúVçü-/˙Đc˙%a˙â)ŁŕTžO†ž5‹OŢź#r ůŚ{Žďüw},)<_n…겣ęjmń‘’ľß{ő®;Fń«ŁjRßé—ŹÔąóCääĺHÁçÚĄń/еź´Ű­:Fr‘…Š}p÷4Ŕę|a+Ź… 1łNĚľ¤1ÁýOçMř­#MĄř6iXĽŻ¤ĆYŹRp:ţuĆŢk7÷ş]Žťs>ű+-ßgŹbŤ›ŽO dţ$ŃŞkú¤PßĎćÇe‚±Wb€3ő94€uľ‡©Üčóę°YJú| ¶IŔůTńţ"łăm’+uÁµěüM«Ůč:-˝ŮM6á·IŐ9Ď\dĆ­cP |q‰‡ŤÚäaş¶ŠXŰŚJw€RâO‡ţ6[0ĆcQŕŻý¦ î™b·`˛4y= í×>ŮŞúÎĄe'Ăą,ôŤR‡MkÁ"ÜÜČL`€~źÖ¸ý[Ôt+Ău¤Ý=´Äm%@!‡ˇV|EâŤ_Ä^Pծ̱Är‘Ş**ź\9÷«tź=únEđŮM ĆI–vÓN “Ö¸­Ě[0ę=ęމ¬ęďÚô«§¶źnŇĘČô äƦ׼GŞë÷0Üj×_hšŰyhĎE­FJMô`wľ5ą™~7Xm‘‡—qh‹ě§nGţ<:›Aň—ăÍŘp ™§Ůźďl?ýzó›í{RľÖÓWşąó5tu—bŚ2ciÚ8ŔíQ\j×ÓęíŞIr˙oi<Ó2aNďQŚYŞ/–ŢVŃ´mOLł»×JĐ5©nŢŢXďł+ŞÔ°ÇŻő¬źD÷_ügo—›mĽ›]ˇ‰'ň±őořŹUÓžĆ÷Q-o ÄcD.= YZ·¨č7żjŇnžŢb6’!‡ˇBĄ.WßOŔ¶žŰŕ˝ËNĄĆŞ­î7Ť‘˙|źĘť¤ę–©ŕ›č—Ňég{KËgÚwr9ŕň[żá\ÇĽO«ř‰Ł:˝ăL±}Ä Wđ űŐŤĆzîhmtŰâ–Ů,"xŐÔQ¸~Ý98ůŢŕ_řŤŁ.•6—%µőĺՅݨ–ÝnÉó!_îă°äzV ľ‡©Üčóę°YJú| ¶IŔůTńţ"›®k:†»{ö˝Vĺî'ĆĐĚz8éVlüM«Ůč:-˝ŮM6á·IŐ9Ď\dĆ­kM5Ą¸? żä{Ňţ˛č·©uŻj·+{g%˝…÷ĆYm€lr:úű×5ĄęZUüW¶ůW1gcí Ś‚Đšß“Çţ&’6GÔňŚ ‘äEČ?đŐKKĘ Ëš×%ř`—źđ“¤Ö®±ÚČ׎˙sÉî×·çÚŻ|OÝ4ZMÎśČ|N?ŇSůÔš‡Śu»Ë 4ůoݬŰ*FŐ ËŘĆH¬¤xĄI"fI†VS‚čEK’ŇĆŠ[ő5Ľ_ ‘ř§Xó#eÍÜ­ČÇÉşIlôÝ3š+ë’j·ËxXmŕ”,0ý3üGwó¬=CĆzţˇ§Éey¨m¤]LH ĎPąíëMŇĽ_­évÎĘôĄşňŠČŻłýŇAĹWŚÚK±˝ńP.<˝©čńM™tÖë3+>ŐRIS‘É&˝âMW^X—T»2¤\Ş  úŕÍĘŔá.o+Üč4ÍFÝ<#geâ]"ň],JĎkwnŰNâNG<sUĽiĄE¦_i%ĺÍÎźs ËÝľ$ČůHôĆ+;Dńfł˘Űm>đĄľwynŠŕlЎ¬j×ÚÍßÚµ+†žlm€€'%`P’•úťâ«­6ŰǰÉ&™Ş\j@ÄÖí #ŕ é×?Ťsú ćçâěs5»Ű4—23B˙yĆČ>ů¬k?ř†ŇĹm ÔXD‹µ "ł(ô FkĂR»°ÔRţÖb—hĹ„„99Éç ő5Ni»“M&Ľ¬lGŻŢhž+Ôď­Ľą%’IŁq0%Xç8#ŇŻü5•.nµဇT¶h×=¤PJźçúW!<Ż<ŇK)Ý$ŚYŽ1’NM>Ęę{Čn­$1Ď G8#ëPĄfi(^6[ťŹ‹‘´?hş —3föé{‚xP Źř i]IĄ'ĂĎ6Ąiwql Łý@_qűŮzăń®XŐ/u‹Ö»Ô§3ܶмWt?jú-ťvc…Žă*şç×~\Ęä:o•wÜÓřzoIOşłX­Dqý¤‚ň ű¦®üNĽšŰĆ6SÄç}˝Ľ/{IţuČjş•Ţ­z÷z„í=ĂpY˝=ôĄŐµKÍZč\ęyÓh_”tRrܨӵĽ‡kš¤ÚΫq¨]$I4ÄX ŔŚ“é]ŁFlľŻťoµo2!Ž & ú|†¸˝ {mZÚmVծ쑳$ ŰKđp3őĹjxËĹW%žŮ~Ďžźhž]µ¤?v!Ç~çůTš%edaZ[Myuµ¬m,ň°DE,Ç€O«éwş=óŮęvďor€Ź×ˇ÷¨ôűËŤ:ú Ë)LW08xÜs´ŽťjÎż­_ëú“ßjłů×,îÚ:†gQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţUQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@+Ł#a†•=ďü}?áü¨ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ )QYŘ*ĚÇ’M,‘ĽR4r«$J˛°ÁuPh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(§Ë ‘2Ćčw¦ĺ#rúŹQÁ¦PEPEPEPEřb’ypĆňHz*)$ţ€EPEPEPEPEPEPEPEPE?É“Č3yoä†Ř_iŰ»Ć}qCĹ"F’Xd!–7@ë˝7)—ÔzŽ 2€ (˘€ (˘€ )ď‰HńşÇ&v1Rc®zeSćŠH%1ĎÇ"őWRü 2€ (˘€ (˘€ (˘€ (˘€ (˘€'˛˙ʤü•ASŮÇŇ~?Ę  Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©ďăé˙ĺPT÷żńô˙‡ň (˘Š(˘Š(˘ŠÜđN‘ąâk;’Â,Ňm8$*“ŹÇ®žŃ\…w©2˛ú‚+¦Óut𕝗‰4‹É4±+=µÝ»m9$äsÁç5WĆzTzmî“"^\Üé÷0¬±-Ń;âLŹ”ŹLSS|Ö`ұŻuë›4¸KhÔČ»Ň'•VG_P¤˙:ĹÓt»­CUŹN‚<]»çn ç§C^›â«­6ŰÇ‘I&›©Üj@ÄÖí +ŕ é×?Ť`h3›ź‹qĚÖďlŇ\ČÍ ýä; űć¦5$ÓoµĆâŻc.çŔÚí˝„×R[!XFé#YČ«ęWüšČ‡H»›E¸Ő#UkH$Čw|ĘN1ǧ#šŇ‹_ĽŃ|S©_[yrK$’ĆâPJ°fç8#ŇŻü6•.nµဇS¶h×=¤PJźçúU9I+±Y7dsÖÚEÝĆŹu©˘¨ł¶eGf`ăŚ;őwC𮫭ZµÍ¤QĄ°mžlŇVoAžµłâŐmÂ:6„ĂeĚŮ˝ş^ŕžĂ#ţZ7Riiđ÷ĂŤ©Z]Ü[(˙F WÜ~öG^¸üi:Ž×]Xr«śÖ•ŁI§řĎOÓuŰLťăsĂ8Ô}+ ¸đíŚ~ń<†ÝEĺ˝ä«nÜĺcŤĐ{aŞźŠőBú·‡g6VKk{ ÉÝSšîu›e>"ŹJăý>ŢőĘú—*GţQ)˝ţ¬RKSĎüUˇF|Ym¤i0ĹźgŚ0-´ٸ’Oµ;ĆV7şv¤[^é¶â2Ę·6îĄ#®ěśŐsźę¬9ġ8˙eB˙JżŻ+·đ¸Úsć\v˙¦†­^Ńą=Č< ái5ËŘ'™"}9fňćS.Ö$źČ äő˝&óEżkMF/*`r„âş_ČĂá×…c v3NÄzü3ůŇ|Cv’ÇĂHwHÚdeő50“ľľc’F§‹®ôëRX/†mgŠŰĚĚąČĎJăŕłokĎ•o «LIŠÜÉ…={šîüâťGJń$¶¶°Ú"ŮYYęšyÓ­RÖ)ěcśĆ„‹zţ•SńéSă-[f1çžž˝˙ZŐř™µÖ‰*ŁŰK„‚rÝ˙Uz/¸ş4sš‰®]4t>c"îv$* ő$ô«:˙†u- 8Ąľ‰ Ľ§ 4N ôČďZް…|7¬j—÷7âĆ2‘ImfűLąţ˙ű#wó­MM¬¤ř[+i¶×P[}˝J — IŰÉSŽź×49ľk-EXćôźjúĄŚ–‘EöYK#Ę.sÓšˇŻh·Úč¶Ôˇňä+ąH9V Ščµgađ·C@Ä#]ĘHő ¶?™¬ [[şŐ,të[Ą‹e„f(™AÜTăďóŚJqroČM$vş ±ř3áô>!¶Š95­Rf†ÚY0·ŤI€{’ż¨üxíJÔ×îě"»·‚I  ™wşEő~uăJ·ü'wGiÇ“8˙dW_¦’5O ŕźů_˙@5ŇQ§ß [â?_řzKuÔ"· ćE$RVů•ŻiđëÄwV1ÜĄ¤jdO28$™VW_P¤˙žjć»ÝéVż ’]'WşŐTÄöÍo0ŕ€«Ž™Č?Ť¬ě’ß_ÁâŇĆđĘńJŚ’#ea‚¤uSkkĆ—ďĹz¤ďjöŹ$ěÍărŕăľjľĄˇęzeťĄÝý”°[]®čdqĂŚgůőÓtžÓ,n,őŤOPµkŐÓâWKUb7–Ď'†*zďĂú–—66«¦ęÉ.Ö¶Śł$‰ŹĽ0?úÇÚˇđ˛kvv÷zΆä-ˇU™Tä°>«Ü…mk†ÁRk·:|VZŚ ™ ”K…8çĽőöü+'¤îZ؇ŔZ¦e‡U¶°°ż…ŐŃa¸•G9Ćp{đkŹąŻ%62±~ęśôŐŇü.S˙ ÎpqűŢq˙Lžąű•#T“ Źßý ©_ť‰ěŽŹţç<ÉŰÂ~ę™”8ĺőë\Ô67SjĆ(®Ëů~V>mŮĆ+˝ńlňŹ‹Öxv'¶EönGę:›CŘżî·`,Ű~»˙^ˇT•®ű\§{#™Ôü­éÖ2ÝMOC2Ą ŃŹR++CŃoő˦MĚu]ÎÄ…T¤žjh–ţ"†­ýźľ;…ŠO¶—ÚÜüŮÝĆ^µ±ŕl<#â´C4ËL±ŔŰddÉč}:çŰ5NrŠ}D’lćµďjZĹ%ôKäKÄsDáŃŹ¦Et_ ôë#ý±Żęp‹‹}2ŔßvI;s˙|ţx¨ő]BŐü öşf•ş-ĹÆPřÁăÓúŐχ¨×^ńŤ@´ĆŢ‚ŽI Xž? ¸6Ö¤É%±Čř“^ľń¦oµ9ćÚB(UE€; šč¬~řŽňĘ …†Ú#:y‘Ă,ę˛0<Ž?Ƹ•©â˝ŽęďMń4ŰOéĆ‘âVXáŠćŐřÎ~VÇa’zŹZˇqŁř[SŐu«ť&ă†úÝYĄIÜ&ݤ2{äŠîĽiđşć+¸¤Đb¶ŠŃmUĄY.~c Îâ7ť+ńŽź6—â}JĘćéîĺ†R¦w$ł÷çľ1]_Ćd> Ó$ąŤ´ČpŔď@ź†Ľ9©ř’ńí´<ÖEÝ#łD¤ž•oĹŐü53ę1FÖÓ©<2B}3Řń[ľÓmÓÂ:öł©ÝęCM‰’ lěaź8ű˙ěŤßζµ–ÓĄř1;iw¶¶_Ú*c[·IŔË)ţďőÍr€µÍkM¶Ô,běs–Y% iÁÝžśŐ=_š¶‘®Űi7đ,W7,« oqŔ!˝3ůWI®HëđWĂ‘†!úbĂ×ńüë–×|G{­işM•âĂłMĂ  !™N>ń$çGLPsđ®ëţ ?"+Q­ýˇĽé ×ČcÁŔă=+ϤŹ„üFDr¤ZŤ“đńŕvěx5Öj1Ľżôs3„ÔäÝ´g?Zó śAŤ0=ĆŃŰř‹Áš‹˘‚;{ó7Řď–!…wřěz~cŇĽî˝ Ł6_×ÎČ7Ú·™ÇPý>C\Ą´×—Q[ZĆŇĎ+DQ’ĚxR*î´űm+DđeޱwĄ RâöWCć9T„)#w8˙8®GWŇďt{çłÔíŢŢĺ%®Cď]&•}Żř_Hµş‰b¸ŇݞD2/™ ŕä ţ…EMRH¨™~,ţĹ’îŢ–H¦4¶ä7îdî ‘Čúf­Úř^ąłK„¶ŤL‹˝"yUduő Oó«~9Óě­®´křmż„M=ŻhÎFp;žžŐÔxŞëM¶ńäRI¦ęw15»A( řF:uĎăYó´’‰\Şîç–ŰŮ\Ü_-”0H×LţX‹6ďLv­íOŔúŢťc-ÔĐDńÄ3(ŠPÍő"·Ľ)p·?äš[vµ’Gů2}äm‡ űő¬ ßÄCPŐżł÷Çp±IöŇű@Űź›;¸ĎëÖ©Íß°¬ŚÍ Dż×nšßMĚuś’Tz’j}ĂZž‚±=ü*!—„–7„údw­ß¬˛xĹif ą"…űĹ7ţ›¨ŤeO„łý¤2Łj `ÝÜmÇ·Ţýhs|ß;*±™¦x3XÔ¬­®í˘‹ě׊Čň…çߥeëzMć‹~ÖzŚ^TŔä0==Ĺtľ%‘ÇĂŻ Ćěfťő!řţgó§řĺüČü%,çqm>"ěÝúu˘3•őó•ôoęĆëL¸Ľ´Ck$Ń´™˙+pÉ+śăëY>"Ó3ăÝ7K·ërb†$úđ9®żÄq_Ś6mČAšŹ,ßř}üÖEĺĹĺ§Ĺ+«Ť6ŘÝ]Gtě°Ž®0r?,ÔĆRnţCilRżđ.·gi5ĂĹ«î•"™Yw$UOh©âéÚd¬Ëî|½vŞ–8ü®ŞÚĎIńş«i+Şhú˛E$Ó#>bn~e'Ż'×JĚř92ĂńI.pĚ@}ĚlëWNMčÉ’¶Ă>"xžMRőô›(âµĐě%)mo2ą]ä÷'źĎń«ß ußµO…5ăąŃo™˘Eeˇ‘ş2·\çůׯ[Ig­ßŰĚĄdŠwFcŁÔřwi%çŽt8á˛ÝÇ)ŔÎ1ý­ 35ý9´Ťr˙OvÜm§x·x€T+ ř:\xß\’#”7r(>¸8ţ•FŰCÔ®tkŤZWm:ݶI>@Uřqµ+K»‹`ečŇ űŹŢČë׍/hůS]C•\âŻ4Kű-b=.î䎨ŞÄ`î8÷­–đ¸¬ˇŁ¶Ě1»×žŰ˝3Űę=kOZ˝7ž%đ :}ŐšĹäGÚH/"M[ńě˙rä)ó4ťIh>Tq°x{Q›Ä ˘¬J/Ő™J38ëôvóÁ:Ýž™%ôÖÉĺÄ7H‹ /ë’ŁĄv‰˙%Ń˙Ý˙ŰaYŽň?řŚÝ¬VŇqp\q»=ýúţ´{IZţI‡*ŘĚđ=Ö•=ĺ–—˘Au$ól7-+>Ұ|EvŢ ÔŕCÔ¨Š:*‡ ąŕb‹ôŚś¤§ó¨Ľ]‘ř§Xó—7r·#$µ¤Éű$Ú…5]jŮ®m"Ť-mÍ Ecč3Ö¨k:MćŤ|ÖšŚ&)€ÜA ;GQ]l¶zv™á]őą5KŐ» ,6đJ~™ţ#»ůŇ|R ˙ůXĺŚÂĘrę;>µ*mĘÝâ¬RŹáöľîWČN2»¦QżŚá}j/é1Ďă{m7W¶Ü Č˛Âür¨Çś{ŠŃř™w5·Ś,ç‰Îű{x^<ö#źçKŕ}Nmgâ}­ýĘD“MćXÁ Ä,8É>”ą¤ŕŰě;.kîÖcŽçEľf‰”n†FčĘÝsźç\~ż§6‘®_éîŰŤ´ďďďpâ+Oáݤ—ž9Đă„Ëw§8T`Çô›ńt¸ńľą$G(näP}pqý)×éWŤăďę¶ZşŁęúMąş´şU îŠ9FÇQÓó•ćč_ă0'Šu)2-íô™ŁcŽí‚×ä5ç´Ŕ(˘Š@QEQEQEQEOe˙Iř˙*‚§˛˙ʤü•A@Q@Q@Q@Ţ˙ÇÓţĘ ©nť^ve9SŹĺQPEPEPSŢ˙ÇÓţĘ ©nť^ve9SŹĺ@QEQEQE%´ňŰ\G=ĽŤѰdu8*Gq[š§ŚµíRÄÚ^_ł@ĂŞŠ›ţ¤šçč¤âž­ízF˝©hńM›tÖë3+>ŐRIS‘É&»â=W]X—Sş2¤\ŞUP}pć˛(Ł•^ö ˝ŤÍĹz΋lmôű–ůÝĺş+€}˛? ˇ¬j·ÚĹßÚu+†žlm€€R˘ŽTťě{źŤĽAid¶°j "EÚ…‘Y”z#5Źa¨ÝŘj)k1K´bÂBśäóśő5RŠRčcć•ć™ĺ”î‘Řłc$ňiöWSXÝĂuk!ŽxX:8ÁZ†Šb.ęúĄć±z×zŚćk‚–ÚĐ`*ć‡â}_D‰˘Ó®Ěp±ÜceW\úŕŹÂ±¨ĄĘšµ‡wąoTÔnő[Ç»Ô'içn 7§ €>•~_ë3jÖÚś—¤ŢŰ!Ž)<´ůT‚Ć0~ńę+Š9W`»4m5˝FÓX“T·¸Ů~ěÎŇěS’ŮÝÁďé[?đ°ĽO˙A?ü—‹˙‰®VŠN{ ćh•.fK±r’2\óŻ6s‘řÖľŻâ˝kX˛ű&Łzf·Üi‰‘Ó¬:)¸§«B».]jwwZ}ĄŚónµ´Ýä¦Đ6î9<“Ď­†§w¨EkäŢbZÄ!„mjĎăTč˘Č.uCâ‰ŔŔÔ˙ň^/ţ&˛ˇń©ł.«Č„ †›ĘBy8`tě+*ŠJ[!ó>憙¬ę]Ě×W,’ÎĄ%,ˇĂ×!›¤j÷Ú=ŮąÓn Á*zx5FŠ|¨Wf¶»â-S]ňƧteHůD AőŔšÄZ˘Im"Ýaí 6Ń-~XČĆŢśýO5“EŞÖ°îËłjWW–6—-ä¦Đ6n · däŽőŘř§Ç·Ë®Ţ7‡µ&ţĎ”.Ňb nŠŕh¤áő@¤Đédydy$bîäł3’ORkMńź4Ű8ílőH#EhŃöŹ@XŠç¨¦âžčIµ±«Łx‡SѦš]:čÄf˙XĄC+ýAďRjž'Ö5KG¶ż˝i­ÝÄ… (Ś°â±¨Ł–7˝‡w±rmNîm.ßN’mÖp9xăÚ>Rzśă'Ż­S˘Šv°Ž«ÁŢ.m ÚëNż˛‹RŃ®Č3ZHqóqó)ěxé\ĺűÁ%őĂŮĆŃZ´ŚbŤŽJ¦~PO¨¨( –×Ç^$¶ŇĆť¦˙c‚4HÄ&1Ś•'§˝Uđ÷еźÇ2h÷źfIi”Ź’:}ŕ}kŠźg¬Q©řűÄşĄ„ÖWÚ—›m2í‘<—#꣊5ĺ´‘/0ö–ĆŇĺ'Ë+Óž;žkŠ8-íŢ«yy§XŘÜMľÖËx·MŞ6o9n@ÉÉó[–>?ń5•‚ŮÁ©¸…bŤz#5ËQC„^Ťé呤‘™Ý‰ff9$ž¤Öľłâm_YÓ¬¬u+ł5µší…J¨Çä’qĆMcQT†‹¬ę-ÉźLąx$a†Ŕ0÷Sëľ$ŐuĐ‹©Ý´±ˇĘĆ*ë€5‘E.U{ŰQÝět:oŤ5ý6Ę+;+˙*Ţ!„O&6ŔÎz•Ďz­­ř—VÖŇŐ.üő…‹ ňŃpŕ V=ą"ťě{šÍýć°şĄĚűď•‘Ä»`®6śŽ0;Tsjw“jŤ¨Ľě/ZO4ʸS»ÔcĄS˘ť®t:źŚőíJĹ­.ďŮ q‡ Š…ÇąĚŃőkíëímËÁ)I ŹB¨ŃBŚR˛C»5µßjšď–5;Ł*GĘ PŞ®ÓĽ)â Ď ëęyRŕ’7YőSůV=ŇKD&îlřŻQÓuMP]éhÓcxÇ›ľĺd䯠Ć8Ŕ­‹_‰~+¶ł[hőBUj»ÂŚę?Ţ#'ń®:Š–ęâk»™n.dig•‹»±Ébz“]ŻŹüOkĄŤ:UţĆ#ň‚n{Ö¸š*w••ŤťÄúľ‰E§]ác¸ĆĘ®ąőÁ…QŐ5˝Vńîő ÚyŰ‚ÍéčŕĄT˘«•'{ŢĆƉâm_C‰âŇďZśî)±\g× *µ˝B-lęńÜcP,_ÍŘ˝H ńŚt'µgQG*ěgQ'ŹĽK$lŹ©e#Č‹ŕ5Ťk«ßZé—:}Ľţ]ĄÉeT\ľ;ĆqíśuőŞRPŠŮŮ~=^ú="M-gÍ„Źć™°Ţ ‘‘Ó±kCń>Ż˘DŃi×f8Xî1˛«®}pAÇáXÔSqOF‚ěżw¬_Ţj©©\Ü´—¨Ęë#ÁS‘Ś`zcűŤsQ¸Žń&¸Ü·r‰§oqĐôăđ¬Ú(ĺ]…vužń> /Pattern << >> /XObject << /Image18 156 0 R /Image20 165 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 167 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 168 0 R /Resources 169 0 R /Annots 171 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 168 0 obj << /Filter /FlateDecode /Length 170 0 R >> stream xś­SŰJAťŢ7낯;˛éíKU_Ŕ—A| ‹‰»Č¬fM~*äŁĎţDRŐ{›(NÓÓU‡:}¦N÷,Ŕj2Ţ/4ÄëŐ`´16‡DkĹóś‹d™©ôn›8C%čŕY"ďśÁ-‹,`üˇű>›ţ`'3&ô–5´79ź=ÜO˙Kj×{pĘcŃS˛U©ŢÖĆDV#F°H^<`ĚŃ ¸Áş†či‰mą[l#)˘>­ÝÝFŐÚu"+ťm&.ŇÖgkâÚ˙ać °ď&¦(gś'—Q>ţcá=Ę=ŚŹîn: .”'Aąţű\3Or: ”塕Żđ†Íľ:iˇš5T#5QÇ5j~šËćIťź«µÓ<Ş2řĹĐ»|^•îŞ]Î*±yjŮó= eĤŇ”ĎpX޲‹YÇčE+ĂĘŤýĂř×.BÂ૆÷´ĽÁî0Ą Öő0+=%í‰ŃµőnŢ[o|¶WOžBFő‡¬ĺZ.yÁáľÇźć“é7gáŕne‘Ś?SęÄ- endstream endobj 170 0 obj 415 endobj 171 0 obj [ ] endobj 172 0 obj << /Subtype /Image /Interpolate true /Width 1700 /Height 246 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 173 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕö¤"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEQWtM=µMVŢÍ cavQÉ?•R˘¬j1CýÄVÎd†7*®z°fŻhšR_[ßÜÜČŃ[ÚEĽ˛ŽYŹEüy  š(˘€ +[IđţˇŞ@ÓZĢvď‘‚‚}zŐ-JÂçMşk{ČŚrŽpyČő¸  ÔQEQEQV-¬î.ŁžH#.&ů#ĺ_ZŻEPEPEPEPEPEh^éoi¦Ú^4đ:Ü‚B#e—ę+>€ («ÖwQĎ$—H|„ňŻ­W˘Š(˘Š(˘Š(˘­iš}Χt-ěŁó% ¶2w$ÔÚ¶‘uĄ…ŕŚy™Ű±ĂtĆz}h>Š( Š( Š+jĂĂ:•őśWP$^TąŘZURpqĐý(Š·©é×zeÇ‘} E&2Áz‚85R€ (˘€ (˘€ (˘€ *ĂŮÜ%’^4d[;”WČĺ‡j]6Ć}Jń-m4ĎśqĐgúPj(#ÔqEQEQEQEQEQEU‡ł¸K$Ľhȶw(Ż‘ËŐ^€ (§Ă–dŚ2©v –8>´Ę*î±§¶—|ÖĎ4S2€wDŮŐ*(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*{ßřúĂůT=ďü}?áü¨ (˘€ (˘€ (˘€ éü3˙ÝTŐۉ6ýšÜ˙´ÝHúqú×0$2OjéĽZE…Ž™Ł!ćüé±ŢF˙:`s5Óęń+đ…Ťâ{ćűLľ»„#řÇĐl§«ÚÚvČ˙>;(äţ€ŐŹ_ŤC]¸’ć䎳ë\ď†a¶–iĚö:„Ş™ŠÚO«ČzčéAs*kwŚęD0(tÚO÷‰ę3ĂZ…¤zEţźsvö2NĘÉpŠ[§đśs˙ë4gÄZdGĂé¨f¶›t“yONHÎ@?ç­Yđ¶ˇftŤL 2 `´ýéŢ}ŽąôÍQÔŻ´ôđĽš}˝ü·wŕHZHŮw vĎAőć©xZúŇŰíöÚ„ŹpĽŐ]Ű®(ž§uo4"ÎÂ;<|ĄQËn$ű×fú%­­ô:pĐdą¶;V[ŇÍśž¬1Řf¸˝N ;IâţÍľűbăq$Ç´ç¦ZéootŤVńu µk›MĘľu˘ŁH°ăśP/¬Ů‹ VęŐX˛Ĺ!U'©żJ§S^H’ÝJđ‡łˇŰsc¶O­CHŹÂ–¶2Řę÷…żž¶ń+Şî*s“ĆGLŕ /ßIÔ4 .míá°ľ‚@˘%“>jžŕóĹWĐŻ­ítťfäŰ%Ä*± ¤î źNźŤbS˛Ň´¨íô KÄŇTąą,H$íŤAÇnćł|[ĄEc{hmaxę%“És“wZłg}cˇYŮ]ęé×…¶Č™]Xç·zÉ×%´7şt×G€e™Ž]»A@5Ô:-–»k˘>š%ĂFŻpd!‹6ăÓ‘Ç˝sÚ—Ů´ďݲ¤¶ŃLŔ@IŽ@®†×RŇő}rÂő¬ď?´ŮăVUÇ•@Ţ{ń×đ¬=b+kŹߥĺ×Ů`3>e—Áú ±â(ě¤Đ4»ë;(íᤠ¨ÄýÓÉúS|am{-ëMÝO [ˇ¶/·Ě?_oëWî˙°n4[ ?űpŻŮYĎ™öIíÇ=;VšcKpš…ÔÖí˙,.#RB‘ę>”oÄBÝmQdŃĄÓo·đF|·_ǿҵĽ-¨Yť#SL-?zwźßc®}3Tő˝JŃ|:4Řőu9ĚÂO5Ń”Fč3Ď˙¬Ő _Z[}ľŰP‘â‚îš«»aőĹRŐŻ-Ż6´°ŽĚ( „rŰ˝ů®§V:“«Ái&•‰*!–FŤ€úÖąMVŢĘÚT]>űíW,ŢQŹiôÁ«Ţ/ľ·Ô5ešÎO2?%;HäzĐ›+m.=›ůwZ|­ĺهČ€*A‡Š~“ŁĹiy«ËŞD%·Ó‘†Öŕ;žóţ˘ą…%X$Č#µvţ5ÔKh–”Ý^˘\\ă©Â€3ţ{PzŃE€íü"Ú@°ÔJ-đX·ÚI+‚¸ů¶{úfąťLi’Ié vą$?ÚJőăÇăVĽ7}ogo«­Ě›{7Š?”ťĚz:V*1GV^ äS·ą‹DÓő¨tI4Á>JG%ËHCî`9ń“§iPGăeÓg_:ÝfdĂÁ#?ĄjOy _ęđëSŢË Ë±äµňI,ę0Ý1Ŕ˙ëVNť«ŔŢ2]Nä`iYÎA;Aź…hBÚ ÝÝć›%”VhÄWo1ÎŕxÎxçÓđ®>¦˝u’ňwC”iőÔ4€+ł—J›Sđކ!šŢ//ÎĎť&Ěĺű~UĆVŢ«}o?‡4kX¤Ý=ż›ć®Ň6ĺ˛9č `[ń}Ä?aҬĺ.§´Ť„˛ˇÜą8ŕřÇň­-XčzNݤšTr$¨†YB6č?ZáëoĹ÷Öú†¬łYÉćGä˘çiĎZłeŁYÝřČéđĚ%±ÜX:>rˇw`ůUËQŁë«kk¦­śÂŇÁ2ČIm˝{Ö†u$Ňu«{ąT´KŕuÁZŰ‚ăCŃRúçO˝’îyâh˘‹Ę+ĺ†ő'®( +ü>×—VQÜĘ/VĽ‘…*=?µ­ŘiăOÖ㵳XdÓĄŹd‰gpAÍeXßŰEᦴy1poRm›OÜsŚUíGV˛š¬sdŢI Aň7β{qřĐúV•ľixšCj—7%‰ť±¨8íÜÖŠ4ű}+R±ž+fH&Ťfkiü§?2g®*{;ëý ÎĘďP—N¸´-¶@ŚĘęÇ=»ÖF˝%›Ý"iňÜO S,ĚríÜ€z ę®5Kđ•¤çH… k–Qp§śÖ_eŽÁ,0¬¶ň±©Č_ńšfźs¦^xq4ÝBń줆s*¸ČÓëPxnęËJńLs=Öë8Ë7–Ăp*@;y=čJÍ4ťb=JÎ <[É/43‰ fŰýď­Sđ–—Ý˝ýäöŹzm‚íÔ‘˝ŽzăŇ«řbţÚĘöţK©6$¶˛F‡i9bF˙ ę6°Z_Ř_M%Ľ7AJĎ$ĆĘsĐs@|CĄFtÔł[MąIĽą"ÉÚęG 3ďýk?W´‚ č—Diüß1ÇVĂ(ÖNźŠCk¨\_Ü—ËČw,jľ›OSďVínt˝O@ł°ÔoĘ{7b’yeĂ«žť˙€*x–Ň []­âÓZ,’üL{×Gs§ZXEl-ôí‰Yî‘Ë;g©t®oĹ:ŤµíͬVŤĄ¤+3 Çz×ÓfѬî`ş˛×.­ RKFŤ“Üdpsô4É^y&ę_ł+¤ŽĹĽˇ¨Şî·uöŻws ŽY (=qT©Ôh1XÇáöĽş˛ŽćQz°ŤäŚ)QéřŐ­nĂO~·­šĂ&ť,{$ K8s‚k*ĆţÚ/ 5ŁÉ‹z“lÚ~ŕśbŻj:µ”Đř•c›&ňHZ‘ľp­“ŰŹĆéZTvúĄâi Ş\Ü–$vĆ ă·sYţ(Óíô­JĆx­™ š5™­¤cňśüÉž¸©ěď¬oô+;+˝B]:âжŮ3+«öďYô–ot‰§ËqµSBžĎMńD5Îű8ťż}°ŚŚŢ´­ h7wwšl–QY˘]ĽÇ;ă9ăźOÂąý&öÖĚĘnôřďCchw+·ŻĄU˝u’ňwC”iőŐ˝&ÓOąYˇ©"¤mCI»×§J·ăKH,uů ´‰b*Ł ČvôíĂö7—V+}uz\#¨Şqţť;Ųhú•ÍĹý¶ŞZrŞł¸Ý€Ţ5µÎ—Şh6VZŤăY\Yłl“Ë.®¬sŰđü¨/_:kÜĹ.‘ą#’0ŇBsű·î=Eu—:uĄ„VÂßAţѱh•žéł¶zJĺ5ů4ÓszDmäEV•˛ ­Ý°zVö›6ŤgsŐ–ąuiňZ4lÄžă#ꎠJóÉ7Rý™] Üv+ýŕ= EWu»¨ďµ{»P¤rČYA늵¬G¤.ź`tÉe{˘żéŔ8ľůéH Š(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( G•ݤbÎĹő$äŇQ@ŽGŤ·FĚŤę§›EQEQEQEQEQEQEQEQEQE±oâm^ÚŃ- Ľ) .ŐP‹>¸Íd;3»3±fc’IÉ&’Š(˘Š(˘Š(˘Š*Ρ}s¨Üy÷’y’í ś€: *µQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEQ^Ëâi<#áżYi“xnÚh®˘‰®'yJCeGN1’sŢ€ ľ±ĽŇd—[‘Ɇě„cśäcž0sY ҆˘źŰÂôŘí;…žß38ă¸Ćh>Ší&o‡žKů1ř§ÍÚvn0c=łĎJâ袊ôĄ]Cđ‡u[Í-BţéĄRBŠŔ9Ë63’sQ9ňŰKÜ5˘»‰:Vťg>•¨hĐ›{MNŃnD'ËcÔĚWWâ7đź‡|Kg§MáŰy˘¸Š&¸ťćeăĺŘÉ>őŰDŇÜ#˘»­+Ă^Łń=´{K•¸Ň´‚H¤ ąnÚuçĺĎÖµtőđĎ‹×WÓ¬44Óg¶¶’âŇć9Y‹„ţđ>ąsMÖK aEz-´¨|úžˇĄA8ŐŮ|ÂF•sÓŻSřÖŹ‹t}tOCaĄÇk6‹q—:ąfHŘ ç°ÉÇĐRu’—-żŻéĺ”W©xwðŮx;NÔăđŰk÷÷ěěĘĚvA8çü}+â‹eáÝ{I»·°hí.˘K™,&cň0?›gkŕ_ ^[ۤwWB:AŐö°?Jq¬Ąo=ä(®żÇšmť†™áy,ŕHžëMŽiŠ˙2Mv÷Ú.ťŁŰŘĄź˙¶ô—·G–ţ) ČäýâéëŘ}):É$í¸3EZŐ ©ÔnNźŃÚy‡ĘIľú®xÜUZŮ«¤h†Żg{scɢî—ćăđ;ô5iWOŁIŞ*ŻŘă”@͸gqéř×qđÇQ]+@×/$Ç—ö˘L˙qźk~„Ńâ 3űÁšĺ»MYL~čQJţ„V>Ńó8—Ę­sÎhŻEĐ´(­<-a¨G 6·{zÎX;a@p:w?çĄTń‡aĄxłBahŃXßyRKi)'Ę%€uĎ^3Tަě.Gkś-]Ń´»­cQŠĘĹU®$ÉPĚp <ýw7ľ˛Ańű:‹čî¦kCÎVŢ<ř=XŃm-l>.ŰŮŮD±GoF ÝĽ’XţfĄŐM;“]NWRđVą§ŮÉu-ŞÉc.ĐĘŻ´{€s\ÝzʇôźřDcÔu­OR´šĘHŢŠŐĚ‚W<…R}8üjˇŕíM×n¦˛ľŐťvűEŁ:nŽG'•c۶ó®ăڬ|röăm­˘Ž5ě3ýkĎÁÁČëV"öą¤Ýčš­Ćź¨GĺÜBŰHěGb=AŠŁ^…ńyţŐ˙˝üý"ëH…ä>§Żő5ç´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEŘ|SÖl5ĎÇwĄĎçŰ‹Xă-±—ćČĂkŹ˘€:/‡Úô~ń]–Łp¬öéą% 2v° ‘ôČ?…u:ŚŢłµÔ.ŁńN©ŞQ…ĄŠy±cÓ{ ~zךQ@—ĂďŘi¶ş¶“­ÚÜ\iš”j˛}śń˛çőýu ţÍŹŕ䩣ZŢ[Ů IUóIÎÜ—8ăŰţ^m ëz†öÍ"ăě÷; oŘ­ňžŁ íVĽCâ­oÄIk7ň\¤Gr&ŐE× Ď˝01(˘Š@túm݆Á—Óß_\Çâ|A©ŘĂŚvĆ99Çç“áýfďAÔ’űO1‹…RŁĚ@ă`đk:Šíçřźâ9ˇ’'’Ďc©S‹TčF+˘Š+Őf´ŃďľřN kP}8–ť˘¸™W‰ĺ sÎG>ŐĺUzďV˝»Ó,´ű‰÷ŮŮîň#ÚŁfă–ä ž}k:rµť¬AńYÓµ+Ť2ĎEg’ĂMµ[d•Ô©Ž§žĂő¦üLŐěuŻĄÖ™?ť¶Ž2Ű~`Fą:)ĆšŤ­ĐŔZä~ńMžŁpŚöéą% 9ÚŔŚŹ¦sřWYg}á? Ç«_čÚ¬ÚŤĺÝ»ÁmoövAoď×ćtRť%'{ŘhÚÍ…·_Nš}·‡UŽäG±Źî€[8Çn™Íkkľ$Ňn­Żu=•¶ ¨Rî,au9ś?/ză(˘T”Żçú×ř¦MŰGŠŇĂZľÖoÚMŇLĹŇQĐn§ßëZ:u÷‡ő˙éš>·©ľ—w¦Čć9|†‘dF9#އ·áŢĽţŠ=––¸gÄ-nĂUżÓíôŤí§iÖ©k¸ÚdÇ|uş×OˇÝxcMľ´Ô4Żęuśed—Nx¤rÇş’>RN†Ľ˛ŠNŠqQ¸Ţ-Ô`ŐĽK¨ßÚĆc‚âftR0qę}Ď_Ƶ|W…cĐ´wđőÄňjLíŠá°s‘€sžśbąJ+D¬¬€čômJŇŰÁľ ±š]·WM…6“»kĺąĆµą®řžĂSř{kdÓÄŮZ1*lo&@mŘÇLw®Š—M7™\ĎcąÓµM7T𾟦ßjóév,á%XŮÖTcś§¨÷ô÷¬\ŘFŁÜ]ÜE n.’ďÜ€~čö¬J(PIÜ®z­ď‹´IüS§ÉöýśÖÓ-ËůoňĽ$c<ŞôąÝ _ł‹âLşĹěţ]›Í3 61ůH`ĽźNŐĆQR©E+›g]á}^Ăű7YŃő‰ü«µ2Ă)Fo.Px8žxü©ž Ö,­lu]/S¸šŇŢůP­ĚJI‰Ôäp§˝r”U:ißĚ9™ÓřŤ´4¸í¬µk˝Vő¤Üň¶ä‰Đ+u>őoMÖt{ď ÚiZőµű=“łA-¦ŇX1ÉSžźýa\mlhž%Őô8$‡K»ň#‘·°ňѲqŹâ“†–@Ą©ŃüO1Ľţ3m°Ź÷G““ĐŹoéVtźřE´íWÓljLPX×Ěű ŁËÚIéß9ö®TÔnő[¶şÔ'yça‚Íéč@*Ą%OÝQl|ÚÜŰH4;_Ĺ·“_éÇ4Q›‘ŮO<Wac«húžŁĺř’çU‚{wŠ…Ŕé’Ü tí^iET©ónÄĄcSĂ„zW,/¦Vhˇ”3…뎇Ąâ»} GşżŇµ§ąžyŚźfkWMˇ‰'ć<W3E7n+écĄÔu;IĽ ¤iŃÍ›Č.$y#ÚFĐIÁÎ0zú×5EҰ7sÓ4 eěľÜ]Nźéď%ť”§Żď0N>śźÂĽÎ®ĎŞ^O¦[éŇÍ›+v/A@ž§ dő=j•L!ËwÜrw=CÇ6đši0řłE’9$‚Ô.Łl\…rŘ=F3řŠăĽákĎ_Ľ6­Vđáîg‘‚¬HO_~‡˙­XqK$EŚR:R­´ă őÚ…–DŤăYc|nPp2;Ő’ußµ«=_Ä1EĄ?™§éöég ŽŽ9aíÎ? 㨢€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( Š( Š( Š( Š)đDÓMQŚ»°Uú“ŠeąuámV×]·Ň%Eěŕ4jAĎ9üĺYş®ź>—¨Mexˇg„áŔ9ă=JIě;4U˘Š)(˘­Ůi×wĐÝKk ’;dó& ±}y˘öĄŞ 0©8®˛_‡ž!@Ámˇ‘Ôd˘N›ż,ŇrQÝŤ&ö9*)óE$2ĽS#$J˛°Áv"™LAEPEiřsG}sRq\AnĹ ď™°ĽvúÖ|ńf’2ĘĹ©*rcéJęö ˘Š)€QVő-:ďL™"ľ„Ă# ‘A ĺOCĹTˇ;€QEQEuđ™Ö­®µBő4ÝÓk©vIţĎ?¨ ^ŠžůmŇúálťäµYDî0Ě™ůI¸ĹA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP^Ëâi<#áżYi“xnÚh®˘‰®'yJCeGN1’sŢĽj»Šz͆ąâXîôąüűqke¶2üĂ9` ^ŇĽ)ĄjE˛ą[Ť9I ˇ·F~ĐĂŻ?.zőď]tľ´ÖěőkY<&‡öx[+Đçç+Ń_>ľţőćżµčü7â»-FáYíÓrJdí`A#é ęuĽ3gk¨]GâťST2Ł Kób(Ǧö=@ü8ő¦‡zn”š&żâ nĚ_E¦¤b+fbÝÉţżSWµ¸tOá•Ć·Ąčńi÷źoXdUráĐHR{AÇ©5ŹđűÄ6m®­¤ëv·fĄ¬źgĽląÁýA]G?łcř9*hÖ·–öCRUFĽŔ’s·%Î8ö˙€Đ’Ő­#ţB¶_őÝ?ô![ž‡Ăsj“Ż‹¦–+A 1Ý‚ův‚zg‹ŰÁ¬Ç$nßeŽŕ2łvŕ‘ëŠO`G±ęú–žšĹĹÄóÄş­˝¤ÜKłkÔ…Üß­s&Â×RřÇuk} ÍněĹ‘şE‘\ßőK;ĎI¨ŰMľĚÜFâM¤| .NĎcÚ´Ķvż$ÖŕfžÄÉË*J”ÚHŹé\ѦŇÓ±«’oćSđ.źi©ę±Ţ@˛¤V3Jż…\Ö§řsĄYęSęR\Ú­őÍĽíěÚM‚Vç<űqůÖŚ7žđôZµć•©I}u{ÁC'”űÄőĆĺ\ß…—F‘îX»ą±›Ű]D ŰśäOoÖ­¶Óz“˘±Łâńh¶1¬ŢźFÔĂđW>T‰ř÷úV÷őm=´ eF‹µµ€3·Ňp9ÝéźoZÎń.ł`ž[1†ägńĹ_˝mÚÚňxüA¨4ŠEµŞ #(O÷Řő”“ş°+u*ř*ÇN]+YÖu[Qw‚ ŽÄ+3’9ý?:·«EŁßx ][OÓĘëí˘' ĺ‚üąÂç±ŕăëYžÖěě-ő-;V·žm>ý?‘ŤčTś×ôż¬ý~:ép]Cj5®±ćJvňÜqířS•Ôľ`¶)|=—IÔ5 űD·žY ›®šC¸áY‡†+ŚĽP—sŞŚ*»=k˛đ+xIż°ŐŻuÓĚaËÚý’C‚U—ĆG|ô¬OZi:ÍĄjçPidbéög‹`ëŐşŐEűďÄOá;«Í&ÇJ‚Ém|-ýݦĽ*ňŢĆĺ¤lő ž˝‡Ň¸+;í6ĂZş›ű3í–-ąb·ą}Ą9GqŚ~5Öč÷Óď-o´ß_XZˇW–Áâw,{©#ĺ ý q~%ľ‡S×ďďmÇ ň—U#§Üő©¦ťÚ¨ĺÜďľ k:mµýĽ7:˝ÔŻe,­+€ç v¬č_ZjšŤÍŚš‹YŞmó‰ëŽp1üęÇ.<=â(-ŻĄÖ$˛˝ŠŃakfµwÜĘF “T<¬YZŘjš^§q5¤Ę…nbRLN§ ŕsŹđ÷¤“P˛Ü÷µ4Ľ[ˇÂ|.ş¸ŃŰFĽŽŕC,‰WR8`Nxü鶉Łi~Ňő[Í&;ëÉg’0Ę©ž[p÷¬ż¶“—µ–­wŞŢ´›žVÜ‘"ún§Ţ›¨ęv“xHÓŁ›7\HňG´Ť “ś`őő¦“i/0ş¸xŇ-—MľŃ<¨EÜ%§µI7ů1Áî3źŇ·|Jćßŕ˙„ŕŹ„¸žydÇń0v?ý+ĎkŇü=^3ř}‡mçŠ-oLť¦¶ŽVÚ'Ť‰$ë–?őăh«+ÝĎ4˘Ą»·–Ňękk„Ů<.ŃČąÎÖqî**b (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( Š–DQ,ĚŮĎçQPEPŽ­ę˙Ű4‹ŹłÜě)żb·ĘzŚ0#µZńеż$I¬ßÉr‘Č›U\(>ő‰EQEQEQEQEQEQE]Ńő[ÝóíZlŢLűJnÚ­ÁëÁUŤoÄ:®¸#ĄăαśŞí  úŕ3YTRĺW˝‡w°QEÄQEQEQEŞĹ2’¬AJ(Ň;I#<ŚÎěK31É$÷&›EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPEřc2Ě‘®7;ő4Ę+Ő5©<#áŤv?ÝčIu j‹u~ň7 (;€€€~ť+šđ¶¦ëźM·žI´#şľ łĆ 9䂲U“\Íi¸…tŢđFłŻX-Ţś–í1@eVČö5Ôéëáź®Ż§Xhi¦Ďmm%ĹĄĚrł ýŕ}r:ćą/‡ň2˙‘ż\˙Żé˙ôcWEđĎţAž1˙°<ßČÓś¤ ¤€áh§CK*FÜěgÔ×¶Iá]?OŐm´Tđ„×ö"OŞ>ćęăĎ8ţ”ęUT÷Äh®ßFđŤ˝ÇÄéőĘA˘h˛|LM).ă—E{€T”2˛•Üx>ż.­(ÖM^Ý.Ez·Š­,, Ô`Ôü5ŤŞ[këF/†ţcÓŻ?Jňšşu9ŐŔ+Vă@Ô Đ`Ö$‰~Ă3mW ÎHävčk*˝oK ŕ]C“nuK“ç¬n?­*“q±QW<ËRŇ®´člĺşUT»O©éźJŁ]źŽŁf±đ¤XĂť:5Áăž•ÔÉá»+NßI_ Ë{dB$Ú‰v ¸őaŽ€gµ/kd›%އ‘Ń]ž›ˇZĹâiF&h-g6ÎÝC® ž;â·ˇđĆóř]~Ě®ˇ×ćo!eçđ&›Ş”8 Dż×nÍľ›šę71$QęI©üAáťOAX¤ż…|™NXÜ:é‘Ţ·|=(OxÂ{qĺohTc˛—#oäH¨őm#ÄG„¤·ş{WŇ„ë! r®x=©sľk•Xăh®ćÖ-ĂŢÓ5 ý-5;ÝEś…’B«)ÇďČüýŞ—Ś´« MCIşÓ#1Yj0¤â9ŘIädöäU*‰» ”e§€őű«ąŽŐH»Ň7•UŘ{ýk–7†WŠU)"1VV Ž ×iń"ţćĎâ$×HV[_(Ä{.N>™'ó¬˙ Ú˙Â[ăH×Sn.Ąź`Ű»śLăő©Śź/4¶•ěŽfş Â:®µf·6 FĚTn™Tä{čěWĂţ(]RĆËG[ ­ŕyí®BKmţđ>ąĚxţG #ţľůÓsm;hĐrędŢŰIgy=¬ŕ ˇ‘Łp@e8?Ęş |¬Ç§K|c·6ńÂgbł)!@ĎOĄfřŻţFŤcţż&˙ĐÍnü?˙Ź˙Ř*_ĺD¤Ôy$ŻcŽ˘ť$D_ĽÄ(ükÖ¤đÝ•Ž§o¤Ż…彲!mD»Üz°Ç@3Úśę(nŤĎ#˘şí'ĂOń ôIÝÚÖ)_qΑA }OŐ‰µO jPßZÉĄ&Ú\ĆĚěĚ:ďď˙ףÚvAĘrsßŢEki’yNÔ@@Éüj9á’Ţy!™vËeô ŕŠě~jpëvV“i‘Mu,ůK¦r1· CůŐjúuÍΡk‰µĘܰ7K),Hc“ŽśŇç|ܶ +\äč®ćÖ-ĂŢÓ5 ý-5;ÝEś…’B«)ÇďČüý«7Çz]Ť”ú}攍¦ˇl· ůdő=şSUv.sW¦ë­á­ _µ°—B†XçŽ6žf•‡–Ź”{uĎ˝pţ"łł´ńŐ®›:Od$TáÁRĆG\g…ź7@q±µ„`˛đŻöĎ5d÷1;XY„Ě“>R}8üjˇŕíM×n¦˛ľŐťvűEŁ:nŽG'•c۶ó®ăڬ|röăm­˘Ž5ě3ýkĎÁÁČëVI{\ŇnôMVăOÔ#ňî!m¤v#± ŽEQŻBřĽ˙j˙„^ţAţ‘u¤BňS×úšóÚ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(“€2MąŕŰ%»×"y°-í¸”ž€/?Ď´¸ô‹‹{q+=Á…^`GÇřEWŃ4öŐ5[{4$yŤ†aŮG$ţTÝ^őµNćíó™\°°ě?ŠÜđĎüKtMSWn$ŰöksţÓu#éÇëL F(`ż¸ŠŮĚĆĺUĎVŚŐz(¤ű-&îöĆćîŢ0ĐŰŚČw@ĆzP4›żě©ůcě›¶îÜ2NqÓë]?‚n’ĎCĽ–|yć8ĺĎM­ňśţyü*}ií×ÂW––R¬¶Ö†ˇ3gsŹsúS‚˘»-+JŽß@´ĽM!µK›’Ä‚NŘÔvîk?Ĺ}ľ•©XĎł$Fł5´Ś~Sź™3׊öw d—ŤÎĺň9aÚ«×yqŞX/„­':D-\˛<Ă…8<ćąý-u/ŰŁZ˘ZĘç÷’ÚxÍaÓáŚË2FT»ËźZëamîîóM’Ę+4@â+·çpŃînăŤ1¸yŠXdă >őoÁgMţÓµKto|ńĺĘůc¦7gžąĄńCčĆďP-˙ö‡žŮ.WËÝ»ć÷Ç\S›˘ş»tÓl|+cs§ĄŐĚ’şaś¨ ÉÇ\c÷Ş>"‡N‘¬.4ź.?´§ď-Ő÷yOǸëúPÜ\ŢiúÔ:$š`ź%#’ĺ¤!÷0řЎ¤éV°řŹU´ş‹íŰC+(c‚qŚtďŠĺ¨®úĘÓJ˝źL‹ű2(ÎĄnĺ™Xţě¨8*? ŕh­m'Ăú†©MkAŰľF ôëY5ÖŢŰMyáż Ů[S/žŘfÚ¤ś“ůţtÍęV:mÓ[ŢDc”sÎG¨=ĹV­ßŰę‰%„:ŁDĚ"ÂČAĘŽHë[w1hš~µ‰&'ÉHäąi}Ě ~"€8z*ćłf,5[«UbË…Tž¤vŞt€(®ŹÂ–¶2Řę÷…żž¶ń+Şî*s“ĆGLŕ /ßIÔ4 .míá°ľ‚@˘%“>jžŕóĹ09Ę+sW´‚ č—Diüß1ÇVĂ)Ţ"ł·¶·ŃZ• ö‰$„¦4W{¨&‡eâeŇ˙˛QÖfDy Ť”,6ŹÄĆą©E¶ŤŻ^Ă=˘ŢĂ4j’1^üŽř¦}íťĹŚ‹Ôf7d ĺOCĹE fY’0ĘĄŘ.Xŕ ú×oâýJƸc›I†w{T+#HAPsřW+¤ŢÚŮ™MŢźčlmĺvőô k{iwÍlóE3(tM‘ÍR­ĎZAcŻÍ¤KAP…@­űK,®ťm6žŽ×6{ʆÜxüŤp”WAâ kitýöÎŮ-šídVŤ Ű•`çë]č–¶·ĐéĂA’ćŘíYoK6rz°ÇašóĘ*ćłf,5[«UbË…Tž¤vý*ť (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š(  ć˙Ź[řó¨*yżăÖßţüę (˘Š(˘Š)ŃHŃJ’'ŢF >˘›Ez–«uŕŻëqx‡QŐf¶vTk­8Ű»@ 8Áđ®kĂ~#±ŃĽ|ş˝µŁC¦yŽ˘ĺ’6§¨ŕ×%Ed¨¤ąo¦Ŕzeť÷„ü+­Łjłj7—vﵿŮŮ!żĽO\`W áŤE4ŹéÚ„^;yÖFUę@<ăß™E8ÓI;»ÜŰĹöŢĽ›RŐtßI%ÝÄŤ:Ů=“‚Y›%wôîjŻĂÍgOÓ.µ;maäŠËQł{Wš5,cÝßńý+“˘Źgîň¶ţżeŁi¦Ú]\:ś›É`m/ üÝúŐŰęš·†üC©Ç¬Üř’˙NVD7:rG!bŔ„aŔÎ=?*ňš):WµŢ u~ń®‹ă´Ő–9͇ęUŰ|‚6džäp ÖšßŔÚTŤÜ:ęňÍ-Ą™ăňXô,Üg˱Ż>˘›¤›˝Ŕ×đ†§Ťâm;PťYˇ‚PήއťkřÎŰĂ’Éy©húóÝÜÜ\>ČÖŽ›COÎx8®FŠn—5Ŕô ˙xÂ^•®ęRiwšc8Ž_!ĄYŽHăˇŕ};Ö_Ä-nĂUşÓ­4o1´ý6Őm˘’A&:¶:úu®NŠJ’R˝Ŕë>&jö:×ŇëLźÎ€[GmŚż0#X~:hŐí˙·c§DľIĂ‚>‡…gŃT ŁT¬éÚÖ‡áŰLÇâ«˝fÚâŮáNx$g¦Kp1Ó·•yž¶-¬Y®¬ň&že_=Ł`™çJŠP¦ˇwÜ ßEˇĂâ “ĂĽşhUÚÍź˝Ž@Ď$}kJăÄ[é6RďĽÓ^W™6‘·.# •ČQU(©n4ěvżµÍ;UÔ´é´YĽČŕ‹äeÚŰłŚ+OQÔ´ sPMZă_˝° Şn,R7$°°ŕgćôT{$’Iě>vtľŐ¬ěĽh—Ň´±iĚŇ+I‘‚27c’yŇĹâÝ0“9 #ÓţFůĎ”b¸ŕ/\WšŃD©);°Rh꼪iĐéú¶‘¬ĘđZjť·–ĘIźOʬkwÚF›á3ˇč׏¨I5Ŕž{ŤFýë\mÝ5{‡6–;k;Í[𾝦ëňi×Z{8I|“"ČŚrGOʨx×Yłľ»ÓŕŇ7›=:‚)`ąĹŹĘąŠ(TŇwmGÔ.ü'®kë·úŚ>Ôk‹·fŢĘĆáĆ1ţĎč~ µÓ š·¤Úi÷+!Ô5#dTŤŁČi7zôéYÔR«ńlš>ĄsqmŞ–śŞ…ěî7`÷ŤGmsĄęš •–ŁxÖWlŰ$ňË««öü?*ć(¦¦ż&šnbŹHŤĽŁ ҶA•»¶JŢÓfѬî`ş˛×.­ RKFŤ“Üdpsô5ĆŃ@u»¨ďµ{»P¤rČYA능E€ż \Ei­Y\\6ČŁ•Y›ŕ~±2\j׳Bۢ’wu8ĆAbET˘€6ďo­äđ¦ťf’fć)ťť6ž'ô¬Tbެ˝AȤ˘€;iď4 ý^j{Ůa™v<–ľI%ť@Ʀ8ýjÎÓµ›v×ukŰ–ňRć UňŘÚ8úW5E0:ý#X°·˝đü“Oµ-a•&;í'v;sÔt®BŠ(®žÖçKŐ4 ;Fń¬§łfŮ'–\:±Ééßü+˘ľ&Ô­®g˛‡N,ÖÖQ,Hě0\Žřü«f{Í˙W‡ZžöXf]Ź%Ż’IgP1†éŽ˙Z¸š)oWĽţĐŐ.®ÂíČX)ě;UJ(¤Ţ…}ok¤ë0Ď&Ů.!Um'qútükŠ(§µąŇő=ÎĂQĽk)ěÝŠIĺ—¬rzw˙ ©â}FÚöňŇ;ĆŇŇ…† cľ+Š`tšÖ§isăHďá—u –2m#…ŰžĎcY~!¸Šď[˝¸·mđÉ!el‘řÖ}ŐjóhúĚ0]I©=­Ôvë€ŔĎ–Pz0ăšĆŇm4ű•ꑲ*FŃä4›˝zt¬ę(«ńlš>ĄsqmŞ–śŞ…ěî7`÷ŤIł`·ZS´˙,{A!Řß+í#?^•ČQ@Z•üč:$I›‹_8Č»OË—sĐţµ{{¤j·‹¨M«\ÚnUó­’@Ƈ⸺(kÉ[©^â6bT;nlvÉő­b=!tű¦K+Ý˙H Ŕő÷ĎJȢQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEQEQEQ]7‡ü¬ëÖ w§%»DĚP™U˛=Ť)IE^LfŠžţÖ[ë‹K€Öň4NČ §ꍮžo‡ÚěZ\ÚGlm˘„Ü9YÔwŹĄ'8Çv#EUQEQVtŰťJú;Ś·3¨€¸ţµ›-ńŽÜŰÇ ťŠĚ¤…=>”$ŢŔ䣻9Š*Λe6Ł} Ą¶ß:VÚ»›hĎÖµuď ęš’]ߤ"D9CüŘ'·ĐŃg¸9$ěŮER((˘Š(«vZmÝôSZÂdŽŐ<É6/Ż5R®QE!…V–ˇßë·fßM‡Ěu’Tz’iĄq6’»3h­ŻřgSĐO¨B˘xIcpčÇÓ#˝bĐŐ·Ô•ĐQE[“M»ŹL‹PxHł•Ěi.F Ł{P±RŠ(¤0˘•Af 9$ŕWgăo é^´ŽÖMR[Ťň۬XŤ†~÷ŻNôĹŃ]݇Ľ)ĄřĂw3iú¤«®Z[˝ĚÖ’EňR~ë}1ëÉ®*€ +Ż×|#Z ëľÔĄ¦+śl+-»8aéžüuZä(˘Š(˘Š$ŕ “@«â-.="âŢÜJĎpaWÂ1ţUôM=µMVŢÍ cavQÉ?•R˘¬j1CýÄVÎd†7*®z°f«ĐE_˛Ňnďlnní㠸̇p gĄI»ţČ:ź–>É»níĂ$ç>´BŠ( аöw d—ŤÎĺň9aÚ«ĐEřc2Ě‘†U.ÁrÇgÖ€E]Ö4öŇďšŮćŠfPč›#šĄ@Q@Q@Q@jâÂ{{[ąT.wyg9'iÁâŞĐEPE-ĄĽ·wÁn…ĺáTdĐTSĄŤá•ămtb¬=ëM Š*ĂŮÜ%’^4d[;”WČĺ‡jŻEYÓlgÔŻÖŃCLůŔ'ĄV#Ôq@Q@Q@Q@Q@Q@Q@Q@-ĄĽ·wÁn…ĺáTdÓ%Ťá•ămtb¬=ë@ ˘Š`SĹUŰ­.ę×TtȢ負PŔڶ1Ďâ)đč÷“jí¦˘)»RT®áŚ“ÍgŃWâŇ/%ľş´XÇźl¬Ň)`0ŻÖ—HŇ.őf‘lŐ Ź·8^˝:ý(>ŠŐŐ´ ý&-âĆŞ\'Ë cśĐ}*µŢ›skgmu*Ż‘r ŤŐuĐĐ:*ĺöťsc´·*\&řĆáťľ¤vŞtQEQEQEQEQEQEQEQEQEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPO†3,Éăs°QźSL§E#E*Hźy0úŠő-jOřc]ŹĂ·z]C˘Ý_ĽŤćĘŕ  ŕ§JćĽ- işçÄÓmç’m Č¬ń¨$y ®ŹUşđWő¸ĽC¨ęł[;*5ÖśmÝŚŚ  `€řW5áżŘčŢ>]^ÚѡÓ<ÇQňÉSÔpk’Ü®×˝ż:-=|3âőŐôë 4Ůí­¤¸´ąŽVbá?Ľ®G\×%đďţGŤţľ’ş«;ď řV=Z˙FŐfÔo.íŢ kł˛Cxž¸Ŕ®ĂŠi!Óµ Ľv󬌫ԀyÇľ*ŕ›Ś’˝ĽŔ—Ć_ň7ëźőý?ţŚjčľ˙Č3Ć?ö›ůŹĹöŢĽ›RŐtßI%ÝÄŤ:Ů=“‚Y›%wôîjŻĂÍgOÓ.µ;maäŠËQł{Wš5,cÝßńý)ÉóRŃĘĂK*FÜěgÔ×¶Iá]?OŐm´Tđ„×ö"OŞ>ćęăĎ8ţ•ćý–Ť¦›itpęro%´x|Ľ`óu˙ëWoŞjŢń§łsâKý9YÜéÉ…‹‡8ôüŞj·+5{kÜ Â6÷¤đýÄŽÖpÍ&â‘A`3ęxń«Së Ő`ÔläŃÓI +¸™Ý™‡Ý ďď˙׬ź řŽ×EńÚjËćĂĚu*íľA2Or8?…kMoŕm* FîAőyfŤ–ŇĚŔńů,zn3ŹĺŘŃ$ů˝ëě¶ďÔ|$Ôě ń…”ÚL3ÝËpZ;Ćr!· CůŐ_ëz]Őާgoáűk[µşpoV,Ä9ÉĆ1ÍaxCS‹Fń6ť¨N¬ĐÁ(g ×oCŹÎµügmáÉdĽÔ´}yîîn. źdkGMˇ‰'ç<U8ĄVî˙¶č~đn‘©ęZBj×úŁHÁeŞĆqĆç‘ůűV_Äm#O°ąÓ/´hÚ-NŐnV$ůdőžÜŠŃ±żđ÷Q팓ď\¤&‹'ÄÄŇ’î9tW¸eIC+)]ÁwëňçúÔ_5{kÄiu¦Oç@-ŁŚ¶Ć_‘‚¬?ť4jö˙Ű‹1Ó‰"_$áŔÁÁCŹÂť85 ÝŢŔz7Š­,, Ô`Ôü5ŤŞ[këF/†ţcÓŻ?Jňšőť;ZĐü;c©üUw¬Ű\[<0iĎ€ ôÉn:văňŻ3Ńŵ‹5ŐžDÓĚ«ç´c,<âť ęźëúJ˝oK ŕ]C“nuK“ç¬n?­p>6‹C‡Ä'†%ytĐ«µ›?{žHúÖ•Ç ·Ň<$lĄßy¦ĽŻ2m#n\2F@=*ŞĹĘÖ*.×$ńÔlÖ>‹s§F¸©$¨Ëkjaxü¦= 7ÇůSÁzĹ•­†©ĄęwZA|¨Vć%$Äęr8˙zeňÜ:ęix·C„ř]uqٶŤyŔ†X7®¤pŔśńůÔŢŇ-żáŹQµŃcÖďŢvIŁi1ä¨éň÷ĎךĂńi0iqŰYj×z­ëIąĺmÉ/ Vę}ęo&†údMýąw˘ęČÄI We‘sĆ6ăc©˘Ď—ţţ4ą›âÓbu%ű›s¦>ÁçŰMü/ßnyĹwwšMŽ•’Úř[ű_MxU彍ËHŮę@={Ąrżu«=ZóO[)¤»¶â.¤MŤ3zăŻ˙¬ÖÖŹqáí>ňÖűMń5ő…Şyl'rÇş’>RĐŇ•ůWüV»(|9Íńg‰l ¦%—ď(ŘŘŢąÝ?]żÓ®ďg·”»FŽmăppÇž=kbËÄÖÖżź\H\YĽÎJóm`FqëÎj믄4¨µ »{ĂŞÍč˙ŻŢŹę–_Ú–z¬Żµý±ÎD-ĺź\{Ó”o . ÚF~µ}iŞÜŰŤ?K‡Nţ±ČX9'‚s]­Ü>Ň|Eoá©tas¸Ç׍+Ţŕ`€>٧ô®#Y·Ó¬.ŕ:>§ý ¸ÜÎmÚ-¬L7Zínu ęšőżîµ)­îË’[/!ł Ă1Ŕ˙ëQ>–˝ľ`ŚM#C¶‡âJč÷(.-áÓk˙…$gô­Ky<-¨čŇéĐiŃĆ$_˝Á ]N9Ŕç®? ČŇ5űgřşŐë{Vťä$‚ĹT©’{W9©J“j7RÄwFň»)Ć2 $SĺrzöŇZ_Á¸–_ÚHqľkî#lW3®ÜIw­_ÜLKI,îěIĎ%Ť^đ>˛žńf›©Ę Š?yŽ»cůk_â/…ßK»mbÂh®´=BböóĆŕŕ¶[iÜţ^ĽVÄqhžđn‘©ę:Dz¶ˇŞ4Ś«4…R4CŽ8ëČüý«źńbčwzťśžÝw1©–ŮĂb IĺA=G=«vĆűĂţ!đ~—Ąkz“éWşc8Žo!¤YŽHăˇŕuô÷¬/]h‹©Y§…âaok«\8 Ď ęäź§zç…ůµ˝őôň·˝‡Âš/Š-|).‚·[ŚPĎ|ó0“|€`€?ŢjóŻi‹ŁxŹQÓărńŰĚČŚz•íź|b˝ ďSđn±âK_ÝęłÚܧ—,Ögf-"Ś0ă(˙ëWťř›SţÚńţ˘Ć·łŞž vߥGšúßmoÜźâßü„ô/űŰ˙7¬‡ňń]®•s¨k˛éW¶ÖqÚË łyŰžA_©ý+Ťđ桍â[ň °Ű\+ś PyÇľ*ˇwMĆÚ€˙Čß®×ô˙ú1«şđď‡a˛đvť©Çá¶×ďďŮŮ•ě‚0p8ĎřúV‹íĽ-y6ĄŞéľ"’K»‰u˛{'ł6JďéÜŐí+XҵişVˇ­Üh—şs8I’7t•çiŹOz™¶ŕ­=ŔˇńĂ–úVݦť:ŢK8µ_˛ĘÄ$' ą<ŕqúÖţµ'„|1®ÇáŰ˝ .ˇŤQnŻŢFóepĐpÓĄqž,ĽÓżµm˙°îo.á·EâéÉ28ä§îŹjěu[ŻxŹ[‹Ä:Ž«5ł˛Ł]iĆÝŘČĘŔaĆ…&ťŁÍ{k˙6Ú÷GŇßěÖo!1Cśě^»ź]xcĹZjk’Ř_Ăd°µŁYĽťAĆp2MT๣'Çô?Ŕzn–4mo_ÖíMärƱŰo*ÜŕdŹ|~f¬x†ÓGÖ|˙ “§.—sot-§‚7,ŽČ#=:ŹÖŞxXҡҵť_–K{-EP­Â!)ĐädOoËެx‡RĐôĎč7˛jRMr.n.ŚF5ŕ`=‡ëIó{N»ü¬Ű$Đ´Ź‡šF±}˘Ĺ¨_Mq$@<…€ÍËc®zÄńě:®•¨řÉ€^ŔZâÎ9CýžAŽqśűtŁTŐěgřs˘éqOşúÚćY%‹c ŞK`ç=GC\ę22*éÁß™ßvł_hşvŹob–~ţŰŇ^Ý[ř¤/#“÷§ŻaôŻ#Ő ©ÔnNźŃÚy‡ĘIľú®xÜW¤čw^Óo­5 +Ĺş†ťgY%Óž)±î¤Ź”Óˇ® ĹşŚ·‰uűXĚp\LΊF=OąëřÔQş“N˙Źő÷“]dÔĽâ‹H^(ä—ČĄmŞ0Äň Íń\>ŹBŃßĂ×É©2¶+†Ŕ8ÎFÎzqŠ‹AŐ,í|â+ćŮuwäů)´ťűX“ČŤuÇG©ťTÜtňüÍ˸âđ瀵-.űPµşĽĽ• Vöňů‚ %ʧOĺďQY¦ŤĄřKŐo4ďŻ%žHŔw*ňŘë€Ç˝pUÓjZĄśŢŇ4čćÍä<‘í#j’psŚľµJD85eÝę?ĹöúDďĄ]č>T?mŹ÷Ö©.˙!ň8=Ç_Ňş[Č|3¤řŽŰĂRč«s¸Ç׍+ 7¸ ¨č•yśnc‘~ňĂę+Ňnu jşýżîµ)­®Ë’[/!ł Ă1Ŕ˙ëQqN-YkmŕšW…ŕźâ#čs;µ¤Rľăś3"‚@üxbmSÂz”7ö˛iI¦F6—Q3;3€ý˙úőOKńLvţ?}vh[Ë+–AË`@üGđ«’Áŕí6ű¨ŻźT’XŘZÚ^?)ŹBÍĆqţE5n€ďuÍ}–ÝČľčv÷öš¦Łsbú‹YŞ,6ÄyŽŮëŽĂήx»B„řYuqٶŤyŔ†[}Ä«©0§<~u™ŕ­bĘÖĂUҵK‰­ ľT)s’bu9śtü˝ę?>“—µ–­y«^´›žfÜ‘"ún§ŢŤ9A©{OëţÝđ®‘m˙|zŤ¦‰ą$ě“FňcÉQÓ ß<^k–ńq±:’ýMąÓ`óí¦ţď·<â´Ľ<šé‘7öĺŢ‹«#,]’EĎŰŚqަ“âµe«Ţiëe4—bŇÜE%Ô‰±¦o\u˙őšNܡó˙Ă˙Ă]î‘aĄAd¶žţ×Óyobrň6zO^Ăé\˙Ăjßâ6qČ–ĂÍ1$ż}FĆŔ>ýŞţŹqáÝ>ňÖűMń=ő…Şyl'rÇşä|¤ť cXřšÚ×â#ë‰ ‹7™É@>m¬Î=yÍSj锚’ňó1´ýz˙MĽ˝žŢP^íZ9·ŤÁĂž=kcÁz~ś4ťc[ŐíÍÜ6 ‹ľâˇÝŽHü?:Ľëŕý*-BîŢđęłO-µ«Ű˛‰čI>•źŕÝSM‹MŐ´}nI ´żT"tBŢ[©ČČú~U)YęhÝâÜWbÖąkĄjŢţÝÓ,N¸‚ä[Í 9d`FAúŹÖ™đűţAţ*˙°TżĘŤwPŃô˙ Ť E»{÷–ăíÜŚkŔŔ Ş~ŐltëťFßUwŽŇţŃíšT]Ć<÷ÇçONd+7s5Ů\˙É&´˙°©˙ŃmXşýŽ‘fť#X:‹1;ÔŰ4[o˝Ö¶´KýűÁí˘k7ŇiďßÚb™aiC|¸Ážçô©Šłh໤×s+Áöq€úţÔ˙ęšlzn­Łër<—ę…gD-ĺşśŚĎ§ĺLדÖ"YéSťKQiw˝áŤŁ¸ű ţżz_dŻ·­Î—ŔÚ¶žŢÖUtX­lťĽĂţ“€s»Ó8ýk‰Öݬők›eÓ´¸tďŕ+…’x'5ŁŕmSO˛ţŐłŐĄx-ŻíŚr!,úŕsŢł5›};O»€čÚˇÔT ěćݢÚŔđ0ÝhnńAĄ7˙îo!đΓâ;o K˘­ÎăS^4¬$Ţŕ`€>َţU…Łčv°üK]ĺŢ\:mâP¤Śţ•µs¨xSU×íüGu©Mmpž\’Ůy ĹťĆqŽ˙Z°tŤ~Ůţ"®·zĆŢŐ§y ±U*@Č'·J§küČŹ5žű~&˝ĽžżżÔtY´Ř4čă/Ţŕ†.§śŕs×;V…ťˇř}âÉ";\ůXuÁ|ůů×)ŞJ“ęWrÄwG$ÎĘqŚ‚ÄŠčĽŞi±iú¶‘­JđZjť·–ĘIźOĘĄJěąBŃű‹6ÎŇ|%»Y a¤»ţ¨éůźÎ­¨Ń4č:•ÖŹőíÉ•Hy ©Ď'HëTµëýOđšč:-ă߼—?hžŕÄc^ýkËmĄ^|?đÄ:˝óŘÓç‰Të‘ϵ?ň!÷{7úŢ3±ÓtíGFÔ´űP,oaK¦´f8ę \úÇç]%ć·Ą§€l.ŰĂöĎl÷n‹jem¨Ř?08˙9®OÇšµ†ˇ>ťi¤3Ée§Ű-şJĘAr:ś}*ć“}˘ę>‹FŐő 4é­îLé ĄW0żSBz» Ćń‹w2ôH´ýoĆV±Ď Yi÷s ąÂŚ}Üű‘ŹĆşŻZŮYCˇŕůlíÔ2ŰŢZ±lá,z`ő渻HôÇ|÷UďZß.<˙^/•$fă‹.0_ ÷ľ‡5Ă ddŕwŻNřۤŢË­ r„š<ĹW(ęA8é×5™ĐSř2 Ć«­iŕ7šdŃ}ŁŚCÓćon•s'ĐWB–M[LÔĽĐÇ63ů›1Ź˝éśţ•Ú|0Ň®ě|?â-_PŚ[č÷Z\ĐĄĂ0Ë6q€:ö#ëŠó @z żđ”iň Öóé3;Żşŕý מרi¶Ŕ>Ő®őybMcW¶ű5­Ş8gHŘrç:çđÍyxÉ4Ŕ(®ßâf‡Ąxlé:uŚoýĄöe–öBä‚Ä!Źâ+¤[ž ˛[˝r'›Ţ؉IčóüńXuÓŰÄ«ÁsĎŇăR“ĘO_-zźć?L =^őµNćíó™\°°ě?ŠÜđĎüKtMSWn$ŰöksţÓu#éÇë\ŔÉ=«¦ńi:fڇ#ó¦Çyü9ü虢Š)Űx&é,ô;ÉgÇncŽ\ôÚß)ĎçźÂ§ÖžÝ|%yie*Ëmha:C6w1÷?Ąs–WÖńxWQły1s4±˛&ÓČžzQg}o…/ěŢL\Ë2:&ÓČĎ=)±ĄiQŰč—‰¤6©srXIŰŽÝÍgřŁO·Ňµ+â¶d‚hÖf¶‘ŹĘsó&zâ§łľ±żĐ¬ě®ő të‹BŰdĚ®¬sŰ˝dkŇY˝Ň&ź-Äń"2ĚÇ.ÝČ  ŞăT°_ ZNtZąey‡ pyÍsú Zę^+·FµDµ•Ďî$´ńšł§Üé—žM7PĽ{)!śĘ®"2tŔúŐM {=7ĹL×;ěâvýöÂ20@;zĐ´- ÝÝŢi˛YEfEvóîŚçŽ}? çô›Ű[3)»Óă˝ ŤˇÜ®Ţľ•VőÖKÉÝQ¤fÔVô›M>ĺd:†¤lŠ‘´y &ď^ť(ߍ- ±×ć‚Ň%Š ¨BŽ UŘ#Ó´ŘŢ]X­őŐérŽB˘©Çř~tďÉŁęW7öÚ©iʨX>ÎăvxÔv×:^© ŮYj7ŤeqfͲO,şş±ĎoĂň  ˝|éŻsşFäŽHĂI Ďî߸őÖ\éÖ–[ }űFŢV{¤rÎŮę@+”×äÓMĚQé·‘aZVČ2·vÁé[ÚlÚ5ťĚVZĺŐ¤ CÉhŃł{ŚŽ~†€9+Ď$ÝKöetqŘŻ÷€ô5]ÖŐîîaB‘Ë!e®*• 6Ľ3 ´łNg°ąÔ%TĚPÄŇ}XŽ@­Oi‘¦ˇýšÚmŇMĺ+†×P¸żą/—îXŐ}6ž§Ţ€0éQKş¨ęÇ’•Ł«/Pr)Ůę ˇhÚšéSé˘hĐ(žĺśďÉäčjÍđÝ•Ťß‹–Ř´Ř“&ÍŕŤĘ‘šŃľ›ĂÚ¶˘š­Ýě± f´11,@‡n?ýUŤ¤ę¶ú‰Ňţ v‚FÄ`äŞGçÎi'…,íîďoŇć%‘c´’Eł `Ôľµ±–ÇW¸Ô-üő·‰]WqSśž2:gUČ®4]=BâÂůî繉˘Š/(Ż–Ôž¸¬˝ úŢ×IÖažM˛\B«ÚNâ ôéřĐ‹÷Ňu K›{xl/ (‰dĎš§¸üńV-ÓM±đ­ŤýΞ—W2Jé†r €O'qŚcŢąJŰ˝ľ·“šušI›¦vtÚxśsŇ€ÄpéŇ5…Ć“ĺÇö”ýĺşÉ»Ę~8>ťJéßDµµľ‡N —6ÇjËzYł“Ő†; מŁ`ËÔŠěďotŤVńu µk›MĘľu˘ŁH°ăśP-I·_ť6ĺÖčň.¸ HÎ? łdšFŻŁeo§ y-áyaśHK6ßď}k;ĂšŤĄ§ŠŁĽ™Ţ+@_ ův©8'Ą3ĂöÖW·ň]I±%µ’4;IË08  ^Ľ¶‹Tµ·’Ć9gy˛·)Ç@?Öˇń&ˇg4÷CĄĹ âfu’pÇ<{Ön…xš~Żiu ,‘H€ëŽő{ÄéLóÝŘjm<˛Ę_Č02í’~cLJN‡ýjĽ)´AuŇŻńü”hżëâßů%YŇ˙ä¦Ď˙]%˙ĐM$׺ ţŻo­\_I ɱäµňX’ëŚaşc˙Ö¬ÍX·_6§vĆäl[h ŕqřSĐZ¨şľ:˛¶÷K“ĚÇi ßҸM3ţBVźőŐ?®—ÂšíĄžŤg&ĆĂŇrYH#ÇAůÖ.]yş…˙ŮL®Éi7ó’8éĐ~t źĆßň4ß˙Ľżú­Ź˘ęö·:Měm%¬l·ĂřGăţ5ťâ÷Ó.ď&ż°Ô|ůff!—hŰŚî=zΑőH4íÖÓJś›©Os(R¸aʨČçÓŢ€(ř’ökýfćYĐĆUŚkţ¬ĘÜńMÝ–Ł5˝ý«…ą™ÚaÚF×ÁĆĄaŇkÁ¶^řŠÖŢę1,,rž‡ MkŘǤjë¨X[éÂÝŕ‰ä†ŕHK6ßď}k?Ŕň5Ůý˙@j˝is˘é+yky$×3ÄńGlb Ć[Ôô8ő¦? ZŘËc«ÜjţzŰÄ®«¸©ÎO3€(ż}'PĐ$ą··†Âú –LůŞ{€Ď_Bľ·µŇug“l—ŞÄ6“¸‚}:~5‰@Léş>cywb·×7ĄČĺUN8ÇáůŐOiöĐ\Řͧ)Ž ŘVUŤŽvŰ5fÚçJŐ4+-Jńě§łfÚţQpęÇ=»ôüާ‰µ;k«›8ôíĆÚÎ‰Ć ăľ?*ŘÔBѵ5ҧÓDŃ Q=Ë9ß’ČĐŐŹŁi–š—ŠÎěK± Ń™$…kßMáí[QMVîöHX…3Z– €Ă·ţŞÇŇu[}?ÄË} ;0ě@ä„ ŹĎ˝t-¤Co}hRiŢTM%Ľű›’:Ď­cx2ÂÚö[Öšşž·Cl_o~ľßÖĄş:D\ĘšĹÝă:‘ 6“ýâzYš é®Ó.Ąq5¬ă„>ŕsé@ĎŤ®v™®?ĎZ­i|?t÷2Ę5@ßş@ăđő  Š(˘Q@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEPóÇ­żü ůÔĄŘŞ©?*ô¤ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( źćÉäĽÇň‹nŮź—=3ŹZeQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUËťNňçO´±žmÖ¶»Ľ”ÚÍÇ'2yőŞtS‚Š(¤0˘Š(©~Ó?ŮţĎçIäg>^ă·>¸éQQ@µĚď@ÓHЧ+bU~ĄEEůĄ’i “HňHzłś“řŇC#Ă*IÚčÁ”úŇ›EZŐ5 ˝Vú[ÍBwžę\o‘úś Đ «ESšGeUfb«÷A<Ą6Š äpi]ÚF,ěYŹRNM%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEbÂöăO»K›I<ąÓ;[ă#ÇCUÉ$’zžh˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( şýwÂ0E ®»áí@jZb°Iò۱†™ďÇQő®B˝ á †_řJ4ůëyô™ť×Ýpţ†hĎh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*{ßřúĂůT=ďü}?áü¨ (˘€ (˘€ (˘€ ő 6ŔřÁúµŢŻ,I¬jößfµµG é\ă§\ţąŻ/§Í,“HdšG’CŐśäźĆ€EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSŢ˙ÇÓţĘŠ( (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€?˙Ů endstream endobj 173 0 obj 31404 endobj 169 0 obj << /Font << /Font2 12 0 R >> /Pattern << >> /XObject << /Image21 172 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 174 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 175 0 R /Resources 176 0 R /Annots 178 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 175 0 obj << /Filter /FlateDecode /Length 177 0 R >> stream xśµSÁnÔ0M¸u~‚ë¦R˝cĎ8ö© *­TÉR¤ Ú]ˇlŰ-ř~…ŕ_zŕ+É6›ĐRP‰•xü<3Ďy3Ţ€w6¶cÔůý6€ŃK›#rďqw­N6­ÚZěĂ»q0&6Ł; ű®ŕ.”dógÝŐęaůI‚˝)3yĺp„’‘„ŕzůOT+8߇c› “ď™úˇi}ĘŃ;ćž#™JÂ’Ľ;¬›`Ě·Ř;b;J#Ą<¨;Z˝´ĂÂfn]Žě%Ş“ó$Ó ż¤YÔhUwL9Y r „íđ‡Es”kżĽĽř ŞŁ=ĘůŻu}cp-CŮ­|€70«ŢŐ{ŐMuS?m€L˛YőŁQÍŞż Vő˝^4Ŕ·űuyň­úÚ€ž´w[Ô{őQ}¤‹‡Cx ĺ5Ľ(ŹůS E“eą÷głĘG#űKţŘÚx1:Íž29k íA—óvĐ'¤ÄN+ŮMâ§č¤!˙ÁÉ~Ż| ™â —‘)˙Ű(Ubţj}ş< ž_îD{H™łXbď·÷Ĺsˇuze¬›`^2avhÇb§ŘD“ÇO=¨éEöń¶{4™$óą5ŞAŁ6~aű˙ď endstream endobj 177 0 obj 471 endobj 178 0 obj [ ] endobj 179 0 obj << /Subtype /Image /Interpolate true /Width 1300 /Height 702 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 181 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕľ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Í˙¶˙đ/çPTóÇ­żü ůÔQEQEQE§ˇŢŘčÚ~©p-/÷ů0$í89«2˝văRŇô݆>¸Ő4”Ő$Ěë 2ČQo;ŕžÜ×1ń?HÓlntťGE„ŰYj–‹r É>Y=@ĎÔ~´ÄŃ^Ő˘čú\Ňéö6ŢľźKťU%ÔnÁIrÝ_€ëÁÄÚxsOŹâĐoe#N[ĆŚł6 (Ş“ďÂçŢ€8ş+׼Yi§Ř[ęVú§&±´@ËkdŰČ#îł=y>Ő…đżĂ–Ú•Žł«]鯪µŠ˘ŰŘŁódlőÇaÇë@}Ez‡ŽĽ7x1uŃ ¶¨Cr!šŘ1)"ĂŰś~ľŐĺôQEtún©áč|}cy¤É.·#“ Ř#8Ç9ČÇ<`ć€9Š+CA:PÔSűx^›§płŰćgcwÍt“7ĂĎ%üüSćí;71žŮçĄqtQEWĄ*č€ü;ŞŢhqj÷M*ňVÎY±ś{šĆř“ĄiÖséZ†Ť ·´ÔíäA’|¶=@üĹe©»[żŕEzçßÂ~ń-žť7‡mćŠâ(šâw™”DŹ”{c$ű×;ĄxcKÔ~'¶Źir·@vI· MŰCĽüąúŇŤdŐÚ˛µŔáhŻOÓ×Ă>/]_N°ĐÓMžÚÚK‹Kĺf.űŔúäuÍRđe¶•SÔ4¨/ç˘[/H²®zuę=µ–«P<ö´otkË-"ĂRťZßoňH`IÚpr;Wˇx·GŃWDńT6\vłh·ys«–iŤ‚{ ś}:ăQÓ4φŢźRŇÓS—3¬QK!TQĽîcާ€ÔÔűkŮĹuý.•UŮ4«Ř´u7€‹d1$ą,3‘Śç±®«Çš~—Ąk&§¦Ů§ß[ĹxlŮŽ:ä¦{0?:꯼A¤'Ă}6ńü5jö’^ş-™™¶Łß08ÎxýişÎÉĹnŹUÝ[J˝Ň.#‡Q€Á,‘¬Ş¤•=Ú´¬ő­6 ~ćú]Ţk9TŞY4¤$GŽAĆOCů×ń3]Ҭő;h.Ľ;ky,–˛Ló2ÁÎ;UJ¤”’Kp<†Šď<cŁÉáę:Ő€ĽBŤw”9%ľ\Ž€>”ý~ŰGÖĽý˝¦i‘éwv·BÚh˘rČę@ óß‘úĐęĄ.[yŔQE¨r|=מ=ë®Ď_´/­r÷–ňYÝĎm6<Ř]Ł}§# ŕŕ×Y¤É/׿ëîćµGáŐŤ¶ĄâŰ;[čVkwY7#t8BGę+%&“rč[KDŽnŠô=:=_‡WÓmt…´–ŇŢIíťöq–úäqďYźt«=J}JK›Uľą·}˝›I°JÜçźn?:~ŃY¶¶.§Vě´ë»čnĄµ„ɲy“@ŘľĽ×Gâńh¶1¬ŢźFÔĂđW>T‰ř÷úV÷őm=´ eF‹µµ€3·Ňp9ÝéźoZ%Q¨ó$ :Řó:+S^Ôlµak .-9PË–ßďÍw:ëxkB×íl%С–9㍧™Ąaĺ†ăĺÝsďMÎÖĐoÔó*+ąĐ4m*_‰GNŚĹ}ĄĺĘa÷«,°pxü+?Ŕş}Ąţ§ŞÇyĘ‘XÍ*ţpZ=˘S–˘» Űé°řQőí6ن˘–ăĚ$aYFz}OăWĽMĄi+¤x’+-=-ĄŇ'‡dÁÉg69ě3ÇáKÚ«ÚÁËĄĎ:˘˝BТ´đµ†ˇ€ÚÝíë9`Xí…ŔéÜ˙ž•ŹăÍŰJŐ,$´·{h/aYM´„“gć^yôýhUv•ÎJŠő=Y<5§xÎ=ű)ᣎILŚ eŔhě9®y5ÇN,Ľ9â­FŢćÁ5h]âHĺr¸är;ăŹĆÔćč625-:ďL™"ľ„Ă# ‘A ĺOCĹ>ĎJşĽÓoŻ U6ö{|âX7 őč_5ť6ÚţŢť ŢęW˛Ť–V•@s€;V_€­c˝đ—Š-湊Ö7ű83K÷SćcÍJ¨ů9š*˝ŽE4«§Ń_U żcIĽ‚ۆwŕcčjŤz©§A¦ü2¸†ŰP·żFÔUĚ}Đv·ëĆ©á[k_ěUšßĂ7zÍóHDŹ"‘ /˘‘ÔôíMTѱrëc˘şďčÖş^«§˝ťłÚĹyĚÖÎI11<Żů÷®—VO iŢ3ŹCţÁŠD¸hă’S#pÚ;AëžM?j¬šAČye^Ň4«­ZYă˛Uf‚ť÷0EĆ®‹HđŐ´˙dѦ,ÖqM&yÁdPHü…t^ÔômBď[n’–Ça0Ťă‘$|}ŕzŕţ4ĄRËA¨÷8ÝÂ:®µf·6 FĚTn™Tä{Ĺ˝¶’Îň{YŔC#Fŕ€Ęp•kxţG #ţľůŐ˙ČѬ×äßúŞMóYŠĘ×2čŻEĐ´(­<-a¨G 6·{zÎX;a@p:w?çĄb|BŃmô‹ű9lŕ’ÖËq1·’aâ^Ö’¨śąAĹĄs•«ş6—u¬j1YX޵ę*‚Ž'ź Ż@×[ĂZżka.… ±Ďm<Í+,7(öëźz§ŕű[K/ŠÉo¦Î“Ů©Ĺ"8pTÄN2:ă8ü){[Ĺ´ş—[Z—‚µÍ>ÎK©mVH#v†U}ŁÜšćëÔ|?¤˙Â#Ł­jz•¤ÖRFđ,V®dąä)ăŕÖ€tH/­5MFćĆME¬Ő6ÄyŽÄőÇ8ţt•M`ăŘăh®÷Ĺş'Â뫍´kČî2Á¸•u#†ôçŹÎŁ·‹GĐ|¦__iI©^jM!Ä’ŠqĆ;ôüýŞ˝˘jč\§ Ev>:ÓôŰYôŇ­ü›{«D”‚I-“ÔűâźâM.ĘŰâd:|č–FâÝ C8ĂČüriމ‰ĹŃ]¬´Ô>&O¤„ň¬VwĘ!ĆA8\cń­çđýľ«k©@ţ“Hň!ymn·7ĚW˘¶zćĄŐH<˛Šě>éVz”ú”—6«}soű{6“`•ąĎ>Ü~tß‹E±Ťfđěú6¦‚ąň¤OǿҫźŢĺ].s–ZuÝô7RÚÂdŽŮ<É l_^jĄzgőm=´ eF‹µµ€3·Ňp9ÝéźoZâ5ÝJĎP–°ŇáÓŐ ±ąpçÔć”fÜš°4’ą©iŕ=~ęÉ.cµE.ôŤĺUvŔ˙ZćfŠH&x¦FIО°Áu˝*ů!ńv©m¬řVŽŰXŤm•ÁÚÁ—źžü1ë޸™Ż&IJÝkÖ‹wp˛7Ú “°G;GóĹ(M˝Ç$–Á©hrXhú~ ÷VŇ%ŕ$GĺÓę+"»?çMá]TÓôجęI¤l[…lOÓő¬_ ßÚYÉ,wzbŠŃđţłw ęI}§Ĺ©Qć q‚0x5ÓOń?ÄsC$O%žÇR§©ĐŚWEQEz¬Öš=÷Ă_ Á­j§Ó´W*ń!ܤyČçÚąŹşÎť©\i–z+<–mŞŰ$®ĄL„u8<ö­s÷zµíŢ™e§ÜOľÎĎw‘Ő7· dóëTkRĺwożâYń3W±ÖĽF—ZdţtÚ8Ëleů€9 §ŕ-r?ř¦ĎQ¸F{tÜ’…í`FGÓ9ü+ź˘­S\śťôË;ď řV=Z˙FŐfÔo.íŢ kł˛Cxž¸Ŕ¬=Y°¶đ+éÓO¶đę±Üö1ýŘP gíÓ9®>Š•Euwѵßi7Vž:H.·6§5łZ-ÇnŁŚ\V/µ{ĎxcO·ź}ĺźźçDZ†Í͑ɜڔ ĄÜ]\ŰÂŞ{†$ČÝČ=«Šw+ťŹő› ĎĐj–Óď±YíÜ˱‡ ·qÁăµbx¶ň ˙ę7VŹć[Ë1dl‘ô<ÖMă Ęçuâ ŹxŠ kéu‰,Żb´XZŮ­]÷2ч$ÖV©ÚZřKÄVS˲ćěCä¦ŇwíbO `~5ÍQISIZăćÖçI§hżn4Ć—Ϩ Ä{O)° çę=kmuM+Tđľ“i&ą>Ź-Š”–$‰ŘK’>a·ý}MpPé¦Ç]ăť[NÔdŃF›q$ńÚŰ,NŇ© =ň9?LÓüG¬Ř^|FT¶ź}ŠĎnć]Ś8]»ŽĎ=«Ž˘…M rlěíĽGgeń&maĄ°yź,ŞA(ŔŚŕóďZzMÇ…tőY-5y.îÖH˘guŚ)8䓎p:WśŃIŇO¨)3CĂ÷ë¦k–7˛)t‚evQÔ€yĹnř˘ßĂ·Rę–ź®»ÜĎ#L¶ŤhŕîfÉúw5ÉQTăwq'ĄŽçNŐ4ÝSÂú~›}«Ď¤]Řł„•cgYQŽpvžŁßÓŢą˙ͧÉ}zL÷W0EVžá‰27rč=«ŠJ ;•ŃŇü@Ôí5myntůĽŘEĽi»i^@ä`Lř©Zi>*´ĽÔ%ňmŁö–ĆPŔő5ÎŃO‘rň‡6·:ď ęöٺΏ¬OĺXÝ©–J3yrÁŔóÇĺLđ^±ekcŞézťÄÖ–÷Ę…nbRLN§ ŕsý=딢“¦ťüÇĚÎźÄm¤ÁĄÇme«]ę·­&ç•·$Hľ[©÷­ [ÍZ𮻧ęÚ‹é×zsľÖňZA"1ÉĆ;ôü«˘ŽM7cąřĐáƲÜ-Ćź‹w]˝łďŚV•ĆĄá}S^µń%ÖĄ-˝Äa$–ËČf-"caĆ8ýjŕ5 NďPŽŐ/&óÖ! #hPt§R©č“cćÔętŻĄ·Ź\š&ň%™ŮĐrÁůŚŹĘŻŢ¶mmy<~ żÔE"ÚŐ‘”'űěz\=Nš˝ĹĚnřYtiá5‹»›° µÔ@°ŤąÎ@äöýk{ĺ͂x@hńkkWMp%ó䍔D tą?źs\%8]ݰR˛±ÓřT°˛ţÔłŐex-ŻíŚr!o,úŕsŢłu‹m2Âňßű/QţÓ‹ď9h ?w­eQO—[ŠúXďŐ<6©o¬AŞM§¤l’µ‚۱eeÇ ĂŽŁßđ¬ BîÇÄ>-»»ľş:uťĂ–Ś…@\Ş÷8ĎŃIBÝFĺsŃ/˙á»đć—¤˙ÂJPX´Ťćý†Sż{Ó¶3ëYżî´=2ööďR˝XnŁl¤xEç/´ŁŽ kŤ˘—łŃ«‡6·±ŃřŽ×Hň弴ńęwŇI—F´xËg«nđî§âKćµŇmü×UÜěHUAęI  Š+˘ńGuŹ E Ú”1›iNÔž„údt‚ŇK;9¤·u‘‘Aq\ 08?‰®?ž%łŃľ!Ǭl¸ţÎóH‘ĽÉlĄA'ąď<eá‹=KÄ/ j˛jϧNęžCF°EĆT“÷ŽJţTĂřcL˛şřyâ»ë‹t’îÔÁäĘz¦ćÁÇÖ’ËL˛„Ú†¤öčoăÔÖ›ř‚lSʧ&źđ÷ZŇ­ôÍsC×ć’ÚËSŤ¸D/ĺ:’A sÜ~UgÄÚž‡Ąř"? ř~ůő)%şűUÍ×”c\Ś~ץmřkĂPXx/MŐ"đËx‡QÔŮŐś„‚0H8É˙Jç>*xv×CÔ´ůě-¤ł‚ţŘLmdbLüKĎnź­jiŢ“¬ř7LŇ5 zçBżÓ™ÂL‘»$±±ÎŇ9}=ë—ń­Ö•6Ąz-Ííí´…{‹©™_ąPyQ@›ˇéş-˝‚Yx,kšCۣͨE!y\źĽ@űööĹy…ާ¤i~#˝źűíúknHmokG–Fy#ń®çB»đ®™}g¨é0Ô4Ű(ĘÉ6™$R9cÝr>RN†Ľ÷Ć:”ÇŠ5-BÎ3˝ÄĹŃHÁÇ©÷=ô˙Š> Ň,u[X/<5k}4–şLó1» ;W#đŰYÓ-lő˝X¸’Ę Z$ŤnŃsĺ»ď{է⫿ x˛=J}zm>ţ%­Íä”aŔÉ8¬Íá©´ýCLń(6Ż9V·Ô2í TÎŻJżâ­\đ÷…RÖßS·Ôü-q0‘f· Ę$÷<•éŘăń« .tMORÓt Gö·JeÝzňÇ Î>\{Ö˘×u-Eđ-LJ4=JMZ{»•žiĚF4Źű ÷;GŻ~jO‡ á]RÓ5»˙4w‡2Yý†R˛˛ăxąé@¤‹Łt‘€¨˛ş€;Mzß®<=®Ĺ{{}á :ĂG˛BÓÝ´Ěß68U?縮 Ĺv^ŠtźG×ŰQićc*}‘âň”śç-Ö»Ź]x3RѬt{6źĄZŚů §LćY;»¶Oáëřr^Ň,ńäW–÷}¦Dí™c(ŇFĘFŕ§‘ŚçŐ˝¨Íá›;]Bę?ꚡ•ZX§›F=7±ęáÇ­yĄ»ŕmuďiştˇŚ3K™@ŕěPYąíŔ4ßE¦ŰřžţßDŚĄ„yI—,XŻ r}N @bQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQEQEQEUýXżŃ¦ž]6"IákyĹmČŘČäAĎZˇEQEQEQEQEQEQEQE\ŇuKÝ"ďíZmĂŰÜm)ć&2ëÖ©žNMPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEĄĄ¦§.gX˘–B¨ŁyÜÇO©¬iú^•¬hšž›fź}oáłf8ë’™ěŔüč…VÝšďřĘÉĄ^ŤéĽXË!‰%ČÁaśŚg=ŤRŻaľńź ôŰÇđŐ«ÚIzč¶ffÚŚ|Ŕă9ăőŻ=łÖ´Ř5ű›éty¬ĺR©dŇ‘9=çD*JIÝ›«iWşEÄpę0%’5•Tr§ˇŕűU*őî•g©ŰAuáŰ[Éd°Ť’g™”Ćp ÚąßXčňx_ÄşŽµ`/…Ł]ĺIo—# $OĄ(Ö|śŇ@ptWŻŰhú×€ż·´Í2=.îÖč[MNYH{ň?Zŕ+XO™W\źuçŹzÇkł×í Çë\ŤvZGü’ý{ţľáţkJm«X¨¤÷9;Ëy,îç¶›l.ŃľÓ‘ppjé>XŰj^-łµľ…f·u“r7C„$~˘·ôčô ~_MµŇŇ[Ky'·ş–wŮĆ[ë‘Ç˝)Tĺv°(ÜóĘ+°řsĄYęSęR\Ú­őÍĽíěÚM‚Vç<űqůÓ|^-Ć5›ĂłčÚ~ çĘ‘?˙J|ţ÷(résś˛Ó®ďˇş–Ö$vÉćLAbúóU+Ó<«ií k*4X­¬ťĽĂţ“ÎďLűzׯj6Zڰµ†—ś¨eŤËo÷ć”fÜš°4’ą—EznşŢеű[ t(eŽxăićiXya¸ůG·\űÖ^ŁiRüJ:tf+í/.S˝Xye€ČëÇáIUŇöMlpÔWSŕ]>Ň˙SŐcĽeH¬f• ¸?­^đ­ľ›…QľÓa˝j)n<ÂF”g§Ôţ5N˘@Łs˘˝ÄÚV’şG‰"˛ÓŇÚ]"xvL–q#`žĂ<~hZVž°Ô#Đ[˝˝g, ° 8;źóҧګ\9ěyŐÖřóD¶ŇµK --ŢÚ ŘVSm!$ÄŮů—ž}?ZéµdđÖťă8ô?ě¤K†Ž9%201— ٰäąäÓöŞÉ¤‡–U˝KN»Ó&Hݎ0Čč$PH9SĐńZó‹/x«Q·ą°MFÚx’9\®9Žřăń®»âł¦Ű_ŰĂsˇ[ÝJöQ˛ĘҰ(pÇjÝŇKpQÓSĎlô««Í6úúSog·Î%€#qŔŔďBiWO˘ľŞ~Ć“y· ďŔ8ÇĐ×]ŕ+Xď|%â‹y®bµŤţÎ ŇýÔůóSjštoĂ+mµ {ômE\ÉÝ`~Ľgń¤ęYŰĚ|ş\óÚ+·đ­µŻö*Íoá›˝fů¤"G‘H…ŃHęzvŞŢ?Ń­t˝WO{;gµŠň™­ś’bby_óďTŞ.nQrés‘˘˝OVO iŢ3ŹCţÁŠD¸hă’S#pÚ;AëžMsšG†­§ř‹&Ť1fłŠi3Î "‚@Ďä)*©«µć;¤iWZ´łÇdŞÍ-;î`0‹Ś˙1ZZ'„u]jÍnlŤ¨Ý2©Čö5Ůx[Sѵ ˝lişJXK„Â7ŽBD‘ń÷čsř×ŕoů4Źúř_çKžNý,>Uˇ“{m%ťäöł€&†FŤŔ9”ŕ˙*†µQí×>ô˝¦ŠËpĺîy˝Ą´×—Q[ÚĆŇĎ+DQÉ5Đęž×4Ű.î-ăh˘”G cő Vç¬ě¬ţ*4é’âÎ?0Ă"¸q=G\g…rZ~»§]ŢĎo(/vŤŰĆŕᏠk:mµýĽ7:˝ÔŻe,­+€ç v¬č_ZjšŤÍŚš‹YŞmó‰ëŽp1üé*žď4Üu˛8Ú+˝ńn‡ đşęăGmň; °n%]Há€=9ăó¦Ú&ŤĄřKŐo4ďŻ%žHŔw*¤yluŔcŢź´M]!ręp•ÔxCÂgZ¶şÔu ÔÓt[L ®¤]Ů'řTw<ţ˘™ăH´v]6űDňˇp–žŐ$ßä8ǸÎJÝń+›ţ‚>âyĺ“ÄÁŘ ţô«‹ş¸š±Â_-ş_\-“Ľ–«#ťĆ“?)#ר(˘‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ć˙Ź[řó¨*yżăÖßţüę (˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š( ˝VkMűᯄŕÖµÓ‰iÚ+ •xîR<äsí^UW®őkŰ˝2ËO¸ź}ťžď"=Ş6n9n@ÉçÖł©+YÚŔtuť;R¸Ó,ôVy,4ŰU¶I]J™ępyě?ZoÄÍ^ÇZń]i“ůĐ hă-±—ćä`€k“˘śi¨ÚÝč<®GáßŮę7Ďn›’PŁť¬Čúg?…u–wŢđ¬zµţŤŞÍ¨Ţ]ŰĽÖ˙gd†ţń=q^gE)ŇRw¸†Ť¬Ř[xôé§ŰxuXîD{ţě(łŚvéśÖ¶»âM&ęÓÇIÖćÔć¶kAĺ¸ó0-ÔqëŠóš):1n˙×Oň¬ńŻcyŕo iöóSóüřö0Ůą˛9#ŹLŇxßW˛Ôôď Ec?›%žśN62ěpG gę8®RŠĄM+|˙;ÍPĐuOCˇkZśş\Ö·mp’‹v™\xÂýMqšś6Đ_ĎŤĎÚíQŽ,¦ńë´ň*µF­´Ŕô_]xcĹZjk’Ř_Ăd°µŁYĽťAĆp2M;Ḳoř˝uG’;6ë$»ŠeÇ|{WśUë=ZöĎN˝°¶źeĄîß>=Şwí9‘‘ĎĄCĄîň§Űó®×ő Kđ8đţ‡~úś×"ć{Ź%ŁU Đ~µ“ŕ|76©:řşib´“MŘ/‘×h'¦q\ͤ!Ę€’čD.eĹšçË,0JçŚűâ˝Čř^ßÂ×ÚAń!?j•%2ý†_“n8Ç~žµçtQ(óuv:Źßiú'Ťb¸žď:|-*­Ç–ß2í`­´Fxă¶i<ŞŮéşž©5ěŢTsŮMgimĚÄ`p=«˘“‚w¸)XÝđ˛čŇ=Âkw63`k¨asśÉíúÖ÷‰u›đ€ŃâÖ&Ö®šŕKçÉ(‰@č r>ć¸J(p»»cR˛±ÓřT°˛ţÔłŐex-ŻíŚr!o,úŕs޲őŰM6Ňx×IÔÎŁ.]Ě Óžnµ™E>[;ŠúXé~ jvš¶Ľ·:|Ţl"Ţ4Ý´Ż r0@Şž ŐÓCń%ťüĘÍ d‡ ×k)ʦsřV-(.^Pľ·=Ď řz-ZóJÔ¤ľş˝ŕ‚!“Ę ýâzăň¬m/U˛Á­c,ŰnŽĄĆͬ~@ śc·NµËŃSě×V>c»Öuí6âŰĆI ÎćÔ%·kaĺ°ó¶[·¸¦éÚ¦›Şx_OÓoµyô‹»p’¬lë*1ÎÓÔ{ú{× EÉZß×`ćfç‰'Ó›Rt»‹«›xUCOpÄ™ąňµjřŹY°ĽřŤ©m>űžÝĚ»p»wž0{WEW"1­âŰČ/üK¨ÝZ?™o,Ĺ‘°FGĐó]'.<=â(-ŻĄÖ$˛˝ŠŃakfµwÜĘF “\-ś6ňcĄĐu;K_ xŠĘyv\Ý|”ÚNý¬Iä Ć’ NŃ~ÜiŤ./źPöžS`Î1Ôz×7E>DÇ~ş¦•Şx_I´“\źG–ĹJKDě%É0ŰŽ~ľ¦łĽs«iÚŚš(Ón$ž;[e‰ÚU!ľG'éšäh©TŇw•ŐŽÇÄzÍ…çÄh5Ki÷جöîeŘÅ۸ŕŚńÚťmâ;;/‰3kÍ-ĚůeR Fgźză(§ěŐ­ĺ`ćgŁi7ĐgŐd´Őä¸k»Y"}ťÔF0¤ă’N9Ŕé\O‡ď×L×,odRéĘ죩óŠĎ˘… _ĚNG[â‹ÝK¨jZ~şďs<Ť2Ú5Łą›$oéÜŐÍ;TÓuO éúmöŻ>‘wbÎUŤťeF9ÁÚzŹOzᨣŮékŹŮńLÚ|—ŃǤĎusQ…iî“#w Ú®|@Ôí5myntůĽŘEĽi»i^@ä`\ŐÔR·®mx3WM Ä–wó+41’˛ëµʦsřW@ëá *-BîŢđęłO-µ«Ű˛‰čI>•ÂŃIÂî÷+WµM6-7VŃő© KőB'D-岜ŚĎ§ĺSë—úFźáAˇh·o~ňÜ}˘{ŤxôÇQGłW¸ů´±ŰXŢhš×…4ý/WÔMąÓÝĘKä™Dc’8čĂ˝Pń¦±e¨ę:|:fóaa[Ćî0\/ńcŻĄsP©¤îÚXě|G¬Ř^|FT¶ź}ŠĎnć]Ś8]»ŽĎ=«Ĺ·_ř—Qş´2ŢY‹#`ŚŹˇć˛h§(ŘNW;Ż\x{ÄP[_K¬Ie{˘ÂÖÍjďą”Ś8&¨x/X˛µ°Ő4˝NâkH/• ÜĤťNAŔçáď\Ą˝š·-ÇÍ­ÎźÄm¤ÁĄÇme«]ę·­&ç•·$Hľ[©÷¦ę:ť¤ŢŇ4čćÍä<‘í#h$ŕç=}kš˘š†Âć ôżAŚţCáŰyâ‹[Ó'i­Ł•¶‰ăbIúĺŹä=xóJUbŚIV ‚ P‰.íĺ´şšÚá6O ´r.sµÁ{ŠŠť#´’3ČĚîÄł3’Ori´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQE,h¦ Ź™qŹÎ˘©á˙Ź[Źřó¨(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š˝¬iÚ5Äpjvć dŤeU,Pô<čhŤQ@Úéź üC©XŰÝÚ%ŁEčzLSîÔ-®Ą’X¶0Ú¤¶qÔt5ÉC#C2KĂŁSî(Ý$đ–ť§jÖşx6[ý9‚%ĆŞŇ6ýĚ9aŽĂ<ăúW ˇx>ÚoŠĎáë¦i,`šBÜáťK($w<Źzču]cĂ>"ÔâÖî{ i,ŕż¶Y“˙óۧë]Íţ‡¦č¶ö eŕ±®inŹ6ˇ…ĺr~ńsďŘsŰć^5şŇ¦Ô ŹEą˝˝¶‚0Żqu#+÷**+·Đ®ü+¦_Yę:GŚ5 6Ę2˛M¦IŽX÷\ʔӎ ÇSŇ4żŢĎýŤöý5·$6·ŹµŁË #<Śřף|Qń‘cŞÚÁyá«[餰ŤŇg©ŚŘP1ÚĽĂĆ:”ÇŠ5-BÎ3˝ÄĹŃHÁÇ©÷=íYcždaĐtőď[ľ*»đ§‹!łÔ§×¦Óďá˛XѬŢ@YA  “Š©đű\Ó!𾳡ßj’č×’$‘_FŚÝ1ňťĽÇ·Ţ4ŁăĎZż‚S\:Đ5nD[‚vČ„pŔ}HüŤf|.˙GŤě 7ň5o_Ö´8ľÜč–ZĺΩ~׋1’x¤]ă;wg 1Đśç5‹đŰ[Ót«­VÓZy!±Ô¬žŐćŤKóßž™ý(Ź˘·üM¦č61ŔÚĽÚŁ»"›G‡ËŽ[­l˙aiV? Zľ‰ßUľą1ZäPpN;ýÖüĹ 8z(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'›ţ=m˙ŕ_Π©ć˙Ź[řó¨(˘Š(˘Š(©á˙Ź[Źřó¨*xăÖăţüč (˘€ (˘€ (˘€'‡ţ=n?ŕ?Π©á˙Ź[Źřó¨(˘Š(˘Š(˘Š(˘Š(˘Š(ţŤ¬_čÓO.›?‘$𵼇b¶äldr ç­P˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*íî©{{ggkupň[Ú)X#8Ä`őÇä*•QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQEőÎé^Ňő‰íŁÚ\­Ć¤E mČvĐĂŻ?.~´ŁY5v¬­p8Z+ÓôőđĎ‹×WÓ¬44Óg¶¶’âŇć9Y‹„ţđ>ąsTĽmĄCŕÇÔő * ůƨ–Ëć0¬«žťzźĆŹmeŞÔ=­ÝňËH°Ô§E·Űü’vśŽŐč^-ŃôUŃÚöq]KĺUvM*ö-&Mŕ"ĆY I.F äc9ěkŞń查éZƉ©é¶`i÷Öń^6cŽą)žŔŚÎş«ďi đßMĽ Z˝¤—®‹ffm¨Ŕ7Ě3ž?Znł˛q[ăŐwVŇŻt‹áÔ`0K$k*© ĺOCÁö­+=kM_ąľ—A·šÎU*–M) ăq“ĐţußüL×t«=NÚ ŻÚŢK%„l“<̦0s…ŐR©%$’Ü!˘»ĎXčňx_ÄşŽµ`/…Ł]ĺIo—# $OĄ?_¶ŃőŻoišdz]ݭжš(ś˛:<÷ä~´:©K–Ţ@pQEj\źuçŹzÇkł×í Çë\˝ĺĽ–wsŰMŹ6hßiČČ885ÖiňKőďúű‡ů­Qřucm©x¶ÎÖúšÝÖMČÝ‘úŠÉI¤ÜşŇŃ#›˘˝NŹ@×áŐôŰ]!m%´·’{{ˇ)g}śeľą{ÖgĂť*ĎRźR’ćŐo®mŕßofŇl·9çŰŹÎź´Vm­…Ë©ÇŐ»-:îú©ma2GlždÄ6/Ż5ŃřĽZ-Śk7‡gѵ0üĎ•"~=ţ•˝ŕ}[OmYQ˘Ŕ­m` íćôśwzgŰÖ‰Tj<É޶<ΊÔ×µ-FXZĂK‹NT2Ćĺ·űó]ÎşŢеű[ t(eŽxăićiXya¸ůG·\űÓsµ´ő<ĘŠît J—âQÓŁ1_iyr}ęĂË,G\? Ďđ.źi©ę±Ţ@˛¤V3Jż…\ÖŹh”娮ß¶úl>}FűM†öa¨Ą¸ó VQžźSřŐďiZJé$ŠËOKit‰áŮ0rYÄŤ‚{ ńřRöŞö°résΨŻEĐ´(­<-a¨G 6·{zÎX;a@p:w?çĄcřóD¶ŇµK --ŢÚ ŘVSm!$ÄŮů—ž}?ZDÝĹĄs’˘˝OVO iŢ3ŹCţÁŠD¸hă’S#pÚ;AëžMqÓ‹/x«Q·ą°MFÚx’9\®9Žřăń˘59şŤŚŤKN»Ó&Hݎ0Čč$PH9SĐńOłŇ®Ż4ŰëčM˝žß8–ŤÇ˝zÄ gM¶ż·†çB·ş•ěŁe•Ą`PŕŽŐ—ŕ+Xď|%â‹y®bµŤţÎ ŇýÔůóRŞ>Nf‡ĘŻc‘M*éôWŐBŻŘŇo ¶áťřúŁ^…ŞiĐiż ®!¶Ô-ďѵs$t€múńźĆŞxVÚ×űf·đÍŢł|Ň#ȤB‹č¤u=;SU4l\şŘâ(®»Çú5®—Şéďglö±^@ł5ł’LLO+ţ}ëĄŐ“ĂZwŚăĐ˙°b‘.8ä”ČŔĆ\6ŽĂzç“OÚ«&rYW´Ť*ëV–xě•Y …§}Ěqźć+˘Ň<5m?ÄY4i‹5śSIžpY!]…µ=P»ÖĆ›¤Ą„±ŘL#xä$Ix‡8?Ť)T˛Đj=Î7DđŽ«­Y­Í‚@Ńł¦U9Ʊom¤łĽžÖpĐČѸ 2śĺZŢ˙‘ĂH˙Ż…ţu_Ĺň4kőů7ţ†j“|Öb˛µĚş+Ńt- +O Xjč ­ŢŢł–ŽŘPťĎůéXź´[}"ţÎ[8$µ†ňÜLmä$_ř—źĂő¤Ş'.Pqi\ĺjÝkŚVV*­q&J†`Ł€Içč+Đ5ÖđÖ…ŻÚŘKˇC,sÇO3JĂË ÇĘ=şçŢ©ř>ÖŇËâ˛[鳤öjd1HŽ1ŚŽ¸Î? ^Öńm.ĺÖĆĄŕ­sOł’ę[U’Ć]ˇ•_h÷ćąşőé?đǨëZžĄi5”‘Ľ «™®y xĆx5ŕ ëMSQ౓Qk5A ˘1c±=qÎ?ť%SFŘ8ö8Ú+˝ńn‡ đşęăGmň; °n%]Há€=9ăó©Ľ-¤[Â!Łk˘Ç­ßĽě“FŇcÉQÓĺ5^ŐZâäw±ç”VďŠ~ÂÚ´bËM¸Ó[hŰMź•űíĎ8®ŰW_ éž2Mč1H— I)•‡–_mťŻ&‡RÖĐO,˘» 7ĂóüE“D‘ÜŮÇ+矢‚Ŕgň§bľńBę–6Z:ŘMoĎmp’[o÷őȡÔHO<˘»/ZioáÍ~˙V˛BĎĘd]ĹNI毳KlJ°Űśóő­?i­¬ş\⨯Cđ¶‘m˙„zŤ®‹·~ó˛MIŹ%GO—ľx>Ľ×3╳—V‰4ý6ăL‘”,ÖÓtY3ü9ç*‰»Ť•Ě*–ŇÚkË­ícig•‚˘(äšőy<7ec©Űé+áyolD›Q.Á·¬1Đ ö®6ÂX|ń™CMog;§,P‚úŕćĄUćO”nÜŹSđ>ą§XÉw=ĽmC2Ą ŃŹRs¶Ńî"„2ˇ‘‚s…8É>•ŢÍĄŢZ®Ą¬xCXŠţ ‘ŤĚ`*ĆÜťĘŮĎ×\¦©YiÍ9żŇˇÔC´I!]ÎqŹ\ţ”ă&Óę&’d~"ŇDÔŢĘ[.T6ř[+Ďo­f×Oń"Â×MńTöÖ¬,hB/@JŚŐżÍi~öšRřnÚú蓾ćIY~\“ą°8~)űŠAmlq´WKă¤Íâ!oáč+xŔ„˛–GÉÉÜźjíäđÝ•Ž§o¤Ż…彲!mD»Üz°Ç@3Ú‡U$›[‚…Ď#®ľ?Áeá_íźjÉîbv°ł ™' |¤ú.qřŐ‡Żi«¦x‚óOV,ĚcV=JçŚűăÖüq•ŹŽ^Üq µ´QĆ˝€Ć­hťŐÉ<ţŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ć˙Ź[řó¨*yżăÖßţüę (˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  á˙Ź[Źřó¨*xăÖăţüę (˘Š(˘Š(˘ŠőY­4{ZÔN%§h®&UâCąHó‘ϵsuť;R¸Ó,ôVy,4ŰU¶I]J™ępyě?ZçîőkŰ˝2ËO¸ź}ťžď"=Ş6n9n@ÉçÖ¨Ö0ĄĘîßÄłâfŻc­xŤ.´Éüč´q–ŘËór0@5OŔZä~ńMžŁpŚöéą% 9ÚŔŚŹ¦sřW?EZ¦ą9:é–wŢđ¬zµţŤŞÍ¨Ţ]ŰĽÖ˙gd†ţń=qXz6łamŕWÓ¦źmáŐcąěcű° Î1ۦs\}*ŠęîŁkľ$Ňn­űË??ĎŹc ››#’0xôÍrtQJ6·őĄ€ęüo«Ůjzw†˘±źÍ’ĎNH'v8#3őVŽŤ¨h:§ˇĐµ­N].k[¶¸IE»L®›Tť|]4±ZI¦ěČë´Ó8®včD.eĹšçË,0JçŚű⣢¶Ń,Ź…íü-}¤ö©RS/Řeů6ăŚwéëX~ ľÓôOĹq=ŢtřZU[Ź-ľeÚÁ[hŚńÇl×/Egěôjű•ͱÓř+UłÓu=RkŮĽ¨ç˛š(ÎŇŰ™Ŕŕ{U_ .Ť#Ü&±wsc6¶ş·9Čžß­aQTḮw~%ÖlÂG‹X›Zşk/ź$l˘% -ÉüűšËđ>©aeý©gŞĘđ[_Ű<äBŢYőŔç˝sRTŐąGÍ­Í=vÓM´ž5Ňu3¨ĆË—sE´ç¦­i|@Ôí5myntůĽŘEĽi»i^@ä`\ŐůuLW6Ľ«¦‡âK;ů•šÉ®ÖR Lçđ®žĎ řz-ZóJÔ¤ľş˝ŕ‚!“Ę ýâzăňŻ>˘” ¤î5+F—ŞŮAŕÖ±–m·GRŽăfÖ? P Î1ۧZÓÖuí6âŰĆI ÎćÔ%·kaĺ°ó¶[·¸®Š=š˝Ă™ťÎťŞiş§…ôý6űWźH»±g *ĆβŁŕí=Gż§˝ax’}9µ(K¸şą·…T4÷ I‘» {V($îW;ë6ź Ő-§ßbłŰą—cnă‚3ĆjÄńmäţ%Ôn­Ě·–bČŘ##čy¬š)Ć 6•ÎëÄń×ŇëY^Ĺh°µłZ»îeŁI¬­S´µđ—¬§—eÍ؇ÉM¤ďÚÄž@Ŕükš˘’¦’µÇÍ­Î’ NŃ~ÜiŤ./źPöžS`Î1ÔzÖÚęšV©á}&ŇMr}[),I°—$|Ăn9úúšŕ(ˇÓL9Ž»Ç:¶ť¨É˘Ť6âIăµ¶XťĄR{är~™§řŹY°ĽřŤ©m>űžÝĚ»p»wž0{WE š@äŮŮŰxŽÎËâLÚÂ3K`ó>YT‚QÁçŢ´ô›Ź č3ę˛Zjň\5ݬ‘D>Îę#RqÉ'ŕtŻ9˘“¤źPRf‡‡ď×L×,odRéĘ죩óŠÝńEż‡nĄÔ5-?]wąžF™mŃÁÜÍ’7ôîk’˘©ĆîâOKÎťŞiş§…ôý6űWźH»±g *ĆβŁŕí=Gż§˝sţ)›O’ú8ô™î®`Š0­=ĂdnäĐ{V5”w+ŁĄř©ÚjÚňÜéóy°‹xÓvŇĽČÁ™đ˙R´Ň|Uiy¨KäŰF3í-ڎ€ ękť˘ź"ĺĺmnuŢŐě?łuťXźĘ±»S,2”fňĺ€ çŹĘ™ŕ˝bĘÖÇUŇő;‰­-ď• ÜĤťNAŔçú{×)E'M;ůŹ™ť?ŰIKŽÚËV»ŐoZMĎ+nH‘}·SďSxy47Ó"oíË˝VF"I»,‹ž1·ăMrTQÉĄ®.mnuŢ<Ölő}CMK)ä»°,/u"mi›=py˙őšë|U‡SÇoÔő)-n- R=ż’ĎçRtěöŻ$‚ę*Ţ«©]ę×Ďy¨Kç\¸źh\ŕ`pO˛Ů&W9ĐéŢ(Šßâë˛D˙f’WÜď`@ü@Á­K[ż řq5;Í+R–úęę†<†Aoď×çôStÓ“:] S´µđ‡¬§›mŐß“ä¦ŇwíbO `~4[ęv‰đúëLi±z÷ÂeŹiĺ6śăG­sTUr!so‡“C}2&ţÜ»Ńudb$+˛ČąăqŽ1ÔŃăír×SżÓżłç{ŁgĆ×r&Ó3śŕ˙žMrTRä\ÜĂćŇǤj:–®j «\k÷¶•MĹŠFä–V âąM*˙K‹Äís¨ZIqĄ»0)+op§ŁÜŽ+ Š4•®W=K¸đ×…Ţň˙OŐćÔg–Šo!“±÷ÉŕôöúW/ Řé‰1Őµ§2 f—xî~^•ŹE ęÇwăŮ|=¬Ţ]j–zá{’Š×ě’ Ä>ńŔ/‡/4 _˝ ÖŽť©Ţd]KöY%`™8E ` cąę?˘—ł÷ynÚÜÔÖm´ű ¨Ź©ťAqąśŰ´[XnµÚj:–®j «\k÷¶•MĹŠFä–V âĽŢŠnę V,j3E=üňۉD,ä •÷>;d÷5é9°˙„ÓI‡Ĺš,‘É$ˇubŕ<,–Áę1źŔ W—Óâ–H‹¤t,Ą[iĆAęµZ$eQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Í˙¶˙đ/çPTóÇ­żü ůÔQEQETđ˙Ç­ÇüůÔeĆ?:Ч‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠéĽ3ŕ}oÄvŹwaih­łÎž@ŠÍč=h™˘´ĽCˇęÔZËU·0Nŕ2eěAE\Ň|5.Ąá˝OXKËHٱ 42>$~üÇŹS@4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO7üzŰ˙ŔżťASÍ˙¶˙đ/çPPEPEPSĂ˙·đçPTđ˙Ç­ÇüůĐQEQEQEOüzÜŔťASĂ˙·đçPPEPEPSĂ˙·đçPTđ˙Ç­ÇüůĐQEQEQEé¶  hß ´mj˙C‡QżšćX€w(ąluŔď^e]†­¬Ř\|3Đô§Ý¨[]K$±laµIlă¨čhOZhw2č—ľň mF/ßŮG0łÉ0{ŚçۦkĐäđ–ť§jÖşx6[ý9‚%ĆŞŇ6ýĚ9aŽĂ<ăúW…Ă#C2KĂŁSî+Öő]cĂ>"ÔâÖîŐçö—:-Ď‹ŚÚ˘^bÉ+nýái•pB’ÝČŕźĆ˝M×t Řꍋnő«k‹g†ßM’0ąé’Ü tíĹ`|:±Ń¤đ§‰ő-oO[Ńb!x×qS’[ĺ :@úTž"¶Ńu߇ÇÄ:V••wiv-¦Š&,Ž?¨ýjÇòxĹ5W’;'ë$‘®ć@KŔwÁÁǵSńĄ i>ĐuŐ'ąą7KFŞ?AÇÖ€'ł‡Ađ§‚t}SSŃŁŐőU¤`łHUcŤN8ŕóĘţ~ŐťńDÓ,uűF‰ˇÓő[tą1'Ë$Ś€OnGëW¬5 řŹÁšN“ŻęriWş[8Žo!¤Y#c’8čpçÓ˝fř˙Än§©höş1éšUş[Ç,ŠA“Ëc®0_zî5´đŽ“ăč|:|5©vŃG$ćF&p„^á'9äúWiáÍ>?ŠŘ7˛‘¦­ăFK6 P U'ß…Ď˝[ńg4Ë˙ŠöşÍĄĎ™¦ĄĹł´Ţ[ *mÜv‘ž0{U _Pе?‰—şM6‡q;’U¶•Ŕ`ĎcĄuŢ,´Óě-ő+}SŔ“XÚ eµż˛mä÷YŹLĽźjÂř_áËmJÇYŐ®ô×ŐZĹQměQŠů˛6ză°ăő®M×t Řꍋnő«k‹g†ßM’0ąé’Ü tíĹrß5ý>ËMÖtmbî{mAPÇw ’au9Îś?/zŘń׆ŕo.ş4Đ5nD3[%$B8`;sŹ×ÚˇŃn4řOđĺ檚Eý„Ż$m8Ä3îby9?6?ƲĽ[.‹m˘Gea®_ëzËşIŘşB:Ťśź|úŐŤ2/kž°·Ô/°µk\¬˛‹s"Ü®zśwǸďÖ€3~ Ăâ+ë;Ę'ű,!-eP»^.€†éßšémeĐĽEŕź][řnÓOąÓˇ¤±Č\’ÄŚôűż­b|AÖô­RMLŇfšM;L€[ý®T!ź8ÉŰ×]„|¤čî<\ŇŤQ#C!Ó¦^ÂǦ9Îďjó} ňŰOŐ`ş˝±ŽţŢ=Ű­¤mŞůRO± ţę7ŤáŘüq«ę~łÓ¦»FŹO‰$-$„Źőś…?â3Ĺévž´ńĄ¬wšł^č(<É.>Ě齀$!LĆp+Łń¬žńü÷óx͉D+mjšdˇ#P>T·Ö€(ü/đĺ¶Ąc¬ę×zkę­b¨¶ö(Ĺ|Ů=qŘqúŐ˙xnđbëŁAmP†äC5°bRD#†·8ý}«áćż§ŮişÎŤ¬]Ďcm¨*îáRL.§9ÂóÇĺďLńlş-¶‰•†ą­ę.é'bé č6r}óë@UŰ|5ĐtÍN=oQ×ŃßNÓmĽĆTr¤ąÉŹe#⸧ »]ŞN@ÎqíH˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(yżăÖßţüę žořő·˙:‚€ (˘€ (˘€ žřő¸˙€˙:‚§‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š(xăÖăţüę žřő¸˙€˙:‚€ (˘€ (˘€ žřő¸˙€˙:‚§‡ţ=n?ŕ?΀ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(BËXż˛Ó/´űYöYŢíěSżiČ䌏ĂźEQEQEQEQEQEQEQEv RößLąÓˇ¸t˛ąei˘Ă‘Ó?•R˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šžořő·˙:‚§›ţ=m˙ŕ_Π Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Šžřő¸˙€˙:‚§‡ţ=n?ŕ?Π Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Š(˘˝)W@ĐüáÝVóC‹PżşiT‡˘°rÍŚä€ÜÔN|¶Ň÷Íh®ÇâN•§YĎĄj4&ŢÓS´[‘IňŘőóŐřŤü'áßŮéÓxvŢh®"‰®'y™DA¸ůG¶2O˝G¶Ń4·Čč®ëJđĆ—¨üOmŇĺn4€í ’)n@›¶†yůső­]=|3âőŐôë 4Ůí­¤¸´ąŽVbá?Ľ®G\Óu’čQ^…ŕËm*>§¨iP_Î5D¶_0‘…e\ôëÔţ5ŁâÝE]ĹPŘiqÚ͢ÜAĺήY¤69ě2qôťdĄËoëú`yíîŤye¤XjS˘‹[íţI ;NGjÎŻU¸ÔtÍ3á·„§Ô´´ÔĺĚëRČUo;ă©ŕő5ăÍ?KҵŤSÓlŔÓď­âĽ6lÇrS=ťŞŰł]˙9Y4«Ř´u7€‹d1$ą,3‘Śç±ŞUě7Ţ Ňáľ›xţµ{I/]ĚĚŰQ€og<~µç¶zÖ›żs}.o5śŞU,šR#Ç ă'ˇüč…II; 3um*÷H¸ŽF˛F˛Ş’Tô<jĄ^˝ń3]Ҭő;h.Ľ;ky,–˛Ló2ÁÎ;W;ŕ O ř—Q֬಴kĽˇÉ-ňät€ ôĄĎ“šHŠďőűmZđöö™¦GĄÝÚÝ i˘‰Ë#©Ď~Gë\k ó ë“áîĽńďXívzýˇxýk‘®ËH˙’_Ż×Ü?ÍiMµkžç'yo%ťÜöÓcÍ…Ú7Úr2 C]'Ă«mKŶv·Đ¬Öî˛nFčp„ŹÔVţťŻĂ«é¶şBÚKio$ö÷BRÎű8Ë}r8÷Ą*ś®ÖžyEvt«=J}JK›Uľą·}˝›I°JÜçźn?:o‹Ĺ˘ŘĆłxv}SÁ\ůR'ăßéOźŢĺ].s–ZuÝô7RÚÂdŽŮ<É l_^jĄzgőm=´ eF‹µµ€3·Ňp9ÝéźoZáőíFËQ–°ŇâÓ• ±ąmţüŇŚŰ“V’W2čŻM×[ĂZżka.… ±Ďm<Í+,7(öëźzËĐ4m*_‰GNŚĹ}ĄĺĘa÷«,°pxü)*ş^ÁÉ­ŽŠę| §Ú_ęz¬w,©ŚŇ oá`Wő«Ţ·ÓađŁę7Úl7ł E-ÇH²ŚôúźĆ©ÔHnqW˘ř›JŇWHń$VZz[K¤OÉ’Î$lsŘgŹÂŤ BŠÓÂÖ„zkw·¬ĺc¶§sţzTűUk‡#˝Ź:˘şßh–ÚV©a%Ą»ŰA{ Ęm¤$›?2óϧë]6¬žÓĽg‡ý‰pŃÇ$¦F2ŕ´v×<š~ŐY4ňĘ·©i×zdÉô&Š *z+^qeáĎj6÷6 ¨ŰBďG+•Ç ‘ß~5×|@ÖtŰkűxnt+{©^Ę6YZVÎíC›şIn :jyíž•uy¦ß_@Şměöůİn8čM*éôWŐBŻŘŇo ¶áťřúëĽkQo5ĚV±żŮÁš_şź3jmSNMřeq ¶ˇo~Ť¨«™ ű ěo׌ţ4ťK;yŹ—Kž{Evţ¶µţĹY­ü3w¬ß4„Hň)˘ú)ONŐ[Çú5®—Şéďglö±^@ł5ł’LLO+ţ}ę•EÍĘ.].r4W©ęÉá­;ĆqčŘ1H— rJd`c.GaČ=sÉ®sHđŐ´˙dѦ,ÖqM&yÁdPHü…%U5vĽÁŔçtŤ*ëV–xě•Y …§}Ěqźć+KDđŽ«­Y­Í‚@Ńł¦U9Ć»/ jz6ˇw­Ť7IK c°FńČH’>>đ=pâ| ˙#†‘˙_ üésÉߥ‡Ę´2om¤łĽžÖpĐČѸ 2śĺPÖ§Š˙ähÖ?ëňoý ×cˇhQZxZĂPŹ@mnöőś°,v€ŕtîĎJ§>T›ŤŮçTWUń E·Ň/ěĺł‚KXo-ÄĆŢBI…˙‰yü?ZčőÖđÖ…ŻÚŘKˇC,sÇO3JĂË ÇĘ=şçŢ—´ŃYn˝Ď?Ń´»­cQŠĘĹU®$ÉPĚp <ýięţÖ´«FşąµV¶_˝$R+…úŕäWCŕű[K/ŠÉo¦Î“Ů©Ĺ"8pTÄN2:ă8ü*§Ă¦gÔőëf$Á.ź>ôĎ ‚1üĎçS)»Ýl5q4WO ŘZÜx/ÄwsBŻsl`ň¤=Ssŕâ‹k Vřsw~Đ©ĽKńËÜ.ŔqúÖśčžS˘»»DŃ´żiz­ć“őäłÉĺT€O-ޏ {ÖOŚâŃŮtŰíĘ„]ÂZ{T“ăă9ý))ÝÚĂq˛9Ş+Ôtť3O–K+H<y6ź0T’úä2I“Őđ:×\„âËĂž)ÔmîlR¶…Ţ$ŽW+ŽA ‘ß~4•Nm–ťw¦L‘_Ba‘ĐH r§ˇâ ¶Ďq!• Ś3ś(ÉĆIôŻLř¬é¶×öđÜčV÷R˝”l˛´¬ ś1Ú¸]R˛ÓšsĄC¨‡h’B»1śăąý(„ÜŁ{I;ř‹H}S{)n ¸ePŰálŻ=ľµ›]?Ä‹ ]7ĹSŰXB°@±ˇ˝*3ZV±hţ𦙨_éi©Ţę,ä,’XŃN8Ç~GçíBźşž÷]YĂQ]WŤ´«;Í.ďKŤ˘łÔmŇŕBÄť„őôäWS«'†´ďǡ˙`Ĺ"\4qÉ)‘ڏm‡ őĎ&‡Wk ĺ<˛şřü#—…¶|A¨ 'ą‰ÚÂĚ&dśň“čąÇŕ{Vż§¦ťâ+ŰآśĆ¤őŰž?Jë~8ĘÇÇ/n8†ÚÚ(ă^Ŕc?Ö´NęäžEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQE›Tť|]4±ZI¦ěČë´Ó8®fŠŇĺ@It"2‹bÍsĺ–%sĆ}ń^d|/oákí řźµJ’™~Ă/É·cżOZóş(”yşŤ;G‚ď´ýƱ\Owť>•VăËo™v°VÚ#o6onÚW9 UOęéˇř’Îţef†2C…ëµ”‚GÓ9ü+Š/(_[ž ç†ü=­yĄjR_]^ŔđAÉĺţń=qůV6—ŞŮAŕÖ±–m·GRŽăfÖ? P Î1ۧZĺč©ök«1Ýë:ö›qmă$†çsj۵°ňŘy[-ŰŚ\StíSMŐJm'~Ö$ňăI§hżn4Ć—Ϩ Ä{O)° çę=k›˘ź"cż]SJŐÎę#RqÉ'ŕt®'Ă÷ë¦k–7˛)t‚evQÔ€yĹgŃB…Żć'#­ńEż‡nĄÔ5-?]wąžF™mŃÁÜÍ’7ôîj杪iş§…ôý6űWźH»±g *ĆβŁŕí=Gż§˝pÔQěôµÇĚlř¦m>KčăŇgşą‚(´÷ I‘»AíW> jvš¶Ľ·:|Ţl"Ţ4Ý´Ż r0@®jŠj)[ČW:/‡ú•¦“â«KÍB_&Ú0áźileOSZö÷Ú‡-µ)ô˝JmOP»íăĹ»B‘ęNî˝pÔR•5'q©X꼪iĐŘjÚNł+Ái¨":©o-”’ ž˙ĄOŻ_é6ŹBŃ®Úýžăí3ÜĚkścĂň®:Š9îÚXéuNŇoitsfň ‰Hö‘´psŚľµe2ŰŢŰĚč$HäW(śT4U(Ą ›ąé×úƇuâH5·ń%ŕĚŤţÂ!|ˇ\pOMĽdŕző®Ĺ·_ř—Qş´2ŢY‹#`ŚŹˇć˛h©Ť5ą\îĽAqáďAm}.±%•ěV‹ [5«ľćPz0ŕdšçt"ń&:¶°tćRlŇďĎËұčˇBĘɉĘîçwăŮ|=¬Ţ]j–zá{’Š×ě’ Ä>ńŔťć‡­ř_NÓu‹ů4ë­=ś$ľI‘dF9#އ§ĺ\M•;$ݰůµąÓřĎX±Ô/të}/y°ÓŕHG/Ž­Žľ•kÄzÍ…çÄh5Ki÷جöîeŘÅ۸ŕŚńÚ¸ę)Şi35ĽYy˙‰u»Gó –bčř##čy®ëÇ6đši0řłE’9$‚Ô.Łl\…rŘ=F3řŠňú|RÉcŽ…”«m8Č=Aö«JĘÄ˝FQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQE‚ŇK;9¤·u‘‘Aq\ 08?‰®OĂe•×ĂĎß\[¤—v¦&SŐ76>µÜx.ËĂz—_@ŐdÔ'źNťŐ<†Ť`‹Ś©'ď•ü«‰ř{­iVúfąˇëóIme©Ć€\"ňťI 9î?*e–™d˙ µ IíĐßÇ©¬+7ńاNMtţđÔ ÓuHĽ2Ţ!Ôuvug! ŚN2Çұţ%­Íä”aŔÉ8¤OÉ0ńżŇŰ˙C4[;\üĽ±[jŞ!Üs°\˙}7ćj/ęZ,~ń‘­ęźŮÇP0äű;ÍÂ’O >ťÇZo‰5ŤĂÁŃřoĂw3ß$—?ją»’3bŞžGAů{Óé–Vžđ•í˝şGut'óädÚŔ ý)> é–Z~“áI,­Ň.´Čć™—řÜ’}ëOMżđEčÚî¨úUć™#ĺ0HŘäŽ:źNő‘ń'^Óő‹í:ŰEŢÚn›j–±HęA“đyÇNľ”ŰxšOřoĹZd޶š+¨˘k‰ŢR˘ÇQÓŚdś÷®çKŃ`řŠö´ú†Š&ů‰<ŠWpE óÉÚNsÁďOř§¬Řkž%ŽďKźĎ·±Ć[c/Ě3‘†Ó>k¶^ń\wšžĺ¶hž#"®ăoâÇáŹĆ˙Ý–·§ęö÷ “B[{wšÎóqÜJôîzăžţ™®Wŕî«coâ ´'Ľšä´wĚä7…t=KLÖďüHŃŢBÉgöHRĘËŤŕzçĄp·Váő‰­ˇAśĆ°ů°+ŐŻˇđ†‰â«OËáô»Ţb‚{÷•„‚IÁĽ:×Ú¸_ŰčvWQŢčéÔçyĚŹ´xD|ä·^k¶»Ő<¬řšÓĹ—z´ö·Qůrͧýť™šDnqŹ”~]¨Âľ±‡âôšěKwe̡dţ%YsďŇ´´¨|/âµÝËBK¬­ĄžÖńe,ď°ă-ÇrAÇNMdxcĹ–?đµ¤ń¦ćŇĘW•˛TąPPŞ‚ž•Káć·§éîłs¨\y0ÜXĎ M±›sł)Q€:´ĹŃ[ľŃ×^ńf›§JĂ4ą”Ĺ›žÜMń¤Zmż‰ďíôHĘXA'”™rĹŠđÇ'Ôçđ¤%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Í˙¶˙đ/çPTóÇ­żü ůÔQEQETđ˙Ç­ÇüůÔxJ}KKMN\αE,…QFóąŽ:žSX><Óô˝+XŃ5=6Ě >úŢ+ĂfĚq×%3ŘůÖ0ŞŰł]˙9Y4«Ř´u7€‹d1$ą,3‘Śç±ŞUě7Ţ Ňáľ›xţµ{I/]ĚĚŰQ€og<~µç¶zÖ›żs}.o5śŞU,šR#Ç ă'ˇüč…II; 3um*÷H¸ŽF˛F˛Ş’Tô<jĄ^˝ń3]Ҭő;h.Ľ;ky,–˛Ló2ÁÎ;W;ŕ O ř—Q֬಴kĽˇÉ-ňät€ ôĄĎ“šHŠďőűmZđöö™¦GĄÝÚÝ i˘‰Ë#©Ď~Gë\k ó ÔńZ—Ú ő–şšDč‚őÝ(pF_yüEfĂţµ?Ţëţ!Ń-.>#ŰßI­YC:ĎnÂŃóć»p>§}kXĆčĘu9Ţy6Ąe6ť=ťĐ <.QŔ9ŹzŻ]ną´˙ocľŠćkf»mńŰ.éŘs]Oö®­e©Ă7…dŃÖk[˘[$Ż@Ůî˙Z/°ť^T®yMÚx&ÓJo ë÷úµşű”Č»Šś’~\Ž€śíN×mô­WÁi­éÚzi×0]}šXăbU†Ü矨ýhĺŇĺ{OzÖ8šŘoę s¦@É}F5– Č0TôÉí]1čŢđ~—{}ĄG©^ęfCűÉ „E8ă#óö¦üO0ü8lŐ–ŘéČb rBöđŁ–ĘěźhܬĽĚM{Âz¦‡d—wéäŽP˙6 íô5]•Ďü’kOű źýŐ•ŕŤ-sÄÖ–7%…»ny6śŞ ÇăŚPÖ©!Ćv‹rčaQ^Şţ¶Őm58ÂňhţD/-­ÖćůŠôVĎ\×7ŕ;-2}3ÄZµ şK8T]ĹNrÜ:gfŽG{¬šo±ÇWIĄx+XŐ4Ř/­cěógay•IÁ đ}Ĺ^ŐeĐ5 M{iimĄę–˛Şl™ŕdÉĆOzŐ“GŹVř{áˇ&§c`#7ą6̇§ĺMDR¨ěşjqÚţ} Ľ+¨ľ\úc=>µ“ZÚ¶•™¨ŰŔ—öwčŕ1{Y7¨ç'׏ַüKĄŮ[|M‡N‚ÝÉ®-ĐÄ3Ś6ĚŹÇ&§”Ą;nqTW}Ąhú|ż§ÓdµŤ¬VI@„çh ­O¦Ĺá˙E¬i–şBÚKio$ö÷BRÎű8Ë}r8÷¦ 'U.‡ťQ]o‚ě4á¤ëŢŻoö¸l;}ĹC»ś ‘ř~użyáýOEK›5Óud—k[Çą’DÇŢÎ0˙_Ú—.—>¶±ťá_Ţx—X‹O°3 ŇHßv$Y˝©|Sc¦iş’Űhú‰ÔbHÇ›8MŞdÉČ_lcžkŞř|ćŰŔ^9ş‹‰„ÄpB±`źé\ Ż’.b7AÍľńćń»nyĆ{â¤ĐŐĐ|3ŞkË6ź ´1­#¸EÓšŁŞŘOĄßËgvM7l`ĂQěkŃf“ĂáüÇ«˙fň‚žo™°őí·Ďx>ËIÔüw´6ňÉĄşąXîHÝÄd󷎵„j˝döGD¨Żv)ęÎBŠę| §Úßęz¤w,©ŚŇ oá`Wő«> ´ŇŰĂşýţ­f.ľÉĺ2.â§$ž2:pµ\Ş%—âDi9[]ďřmÚkiz§SZÓôôÓî!şű4±ĆÄ« ąĎ?QúÔ–±i𮙨_i‰©^ę,ä,®BĆŠqÇż#óöĄítŰ]Ůkľ–˝ÎşŹxLëV×Zގzšn‹i5Ô‹»$˙ ŽçźÔU/[¸'Đ7G±– ű™;¨'¨®źÄ®mţřNřK‰ç–L`3řŇ´‹şąś—+±Â_-ş_\-“Ľ–«#ťĆ“?)#ר+®řw§ZjŇë–wVńË1Ó&–Ů›ŞJ¸Á™®îé/sŕŐ6q|“Sáßěë7Íţ{ÓâÔWˇü=łŃol|]¨jşrÜ[ŮÄłĹbĄF\ítÎÍG­ĎáťwÁ7…•Ť¦Ť¬YΨ¶ŃĎ“ľţőČü2Óô‹ťĹšÝĽŽĆÝ&EÜTçć8tÎÍp4W­ĎáťwÁ7…•Ť¦Ť¬YΨ¶ŃĎ“"˙|:öźßx|üI]+QĐ㼖őˇŠk§•!`BĐŽzň}+*•$’WÜ«ş¶•{¤\GŁ‚Y#YUI*zµn\  řÇT¶şÓŁŐ-aw†8¦r¸ů ‘ÜŹĆ»_‰šî•g©ŰAuáŰ[Éd°Ť’g™”Ćp Ú“Şů’JéĺZmŤÎĄ} ťŚF[™ŽÔ@@Ü*+$¶¸– ×d±9GSŮÁÝ|$Ôě ń…”ÚL3ÝËpZ;Ćr!· CůŐ_ëz]Őާgoáűk[µşpoV,Ä9ÉĆ1Í?i.~[ĹŃ^”« h~đî«yˇĹ¨_Ý4ŞCČQX9fĆr@îkâN•§YĎĄj4&ŢÓS´[‘IňŘőóFŞnÖďřÇUíKşÖu¬lUZâ@J†`Ł€Içč*Ťuß ?äy°˙v_ýŐĽUÚDN\±mu?ëş}ś—RÚ¤F2í ŞűG¸5Íשř{H˙„A5oSÔ­&˛’7bµs •Ď!OĎą˙‡ú˝ý¦©¨ÜŘľ˘Öj‹ ˘1c¶ză°ÇóŞpÚĆq«Ło[eßř»B„řYuqٶŤyŔ†[}Ä«©0§<~u7…t‹ořCăÔm4HőËů'dš7“JŽ^ůŕúóK‘ŢĹ{eËsΨ­ď}…µh…Ž™s¦6Đ'¶›ř_<íĎ8®ßX_ éž2ŹE: R%ĂF’Jdaĺ—ŔGäzç“BŹ:–¶‡•Q]Ž›á{yţ#I˘Hîlâ•Éçć( °ü…iŘŻ‡ĽRşĄ…–Žš|Öđ<ö×ČImżŢ×"…ŞGťŃ]§‚m4¦đŢż«Y ݱůL‹¸©É'ĺČč Ŕ>ÔívßJŐ|šŢť§¦ťs×ŮĄŽ6%XmÎyúŹÖŽ].?iďZÇEz/…t‹ořCăÔm4HőËů'dš7“JŽ^ůŕúó\ÇŠ’Ę]^(ôí2ăL‘”,ÖÓôY3ü9çśl® ˘r±W´í*ëQ·˝šŐU’Î/:\°/¨őŻP“ĂV6:ťľľ–öČ„Iµí»qęÆ{V†tń§xŁĹ*±xÚĆâ'©čTýqUÉg©Ů4Ú9áŤLť$yIťPmóŹ›ëéÔVMÔms4ẳĘ6FAÁŻj˛‰^˙B‰ľî‘0„źAö5oć+†đ]ľť}iâMCX´BŢ1:®â§$± Ó848tBŤfÓoúÔâ«SĂz4šî¦,⸂݊ß3axíő­íV]Wđ¤×¶––Ú^©k*¨&É™@<śgô÷©ţM¤ę…†Ť}˘[Ď,†M×M!Üp‡†)(ëbĺQň¶–DzÓ'ÓŘť7ĆŃl#YĽ9>Ť©‡ŕ®|©ńďôĄËĄĘö‹›”ćě´Ű»č.¦µ„ÉŞy“0 l_^jĄzoµm=Ľ=¬Şč°+ZŘ;y‡ý'çw¦qúׯęVZڵ†•ś¨eŤËo÷曊J÷fÜšhÚ×|#Z ëľÔĄ¦+śl+-»8aéžüuZä+ĐľČe˙„ŁOn·źI™Ý}×čfĽö Ô)T`Ł’N%t~đÂkčěÚÖ“§'—y>Ç|÷Uď@>6đ®•á{HídŐ%¸×đŹ-şĹŃXgďzôď\]w?.<˙^/•$fă‹.0_ ÷ľ‡5ĂPEPEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEŢ}÷–~źĆ76G$`ńéšOęöZžťá¨¬gódłÓ’ ĆĆ]ŽČä ýGĘQP©ĄoźâyŁj©ŕht-kS—KšÖí®QnÓ+‚_©®3S†Ú ůⱹű]Ş1Ďĺ”Ţ=vžEV˘Ă•¶‹âkŻ x˘ MBmr[ řl–´k73¨8ĂI§|7Mŕź®¨ňGfÂÝd‘qLłŘďŹjóŠ˝g«^Ůé×¶Óě´˝ŰçǵNý§#’29ô¨t˝ŢTű~`uÚţˇˇé~ĐďßSšâä\Ďqä´j €úÖ˛|†ćŐ'_M,V‚b)»ň:íôÎ+™˘´„9PKäĄëýťŰ‰ÂĂ’ąŕź|W[â-oOĽř“mŞŰÜo°IíÝĄŘĂvî8#<`ö®2Š´ěKŠnçuĄřŹNłř‘{ŞČěÖ3ĽfT9@Ý3úw­ 'RŃ4yµ'›Ä×Z”·˛F›ˇ 'Îs–?ćĽÖŠĄ6tSętÚ©gkŕ˙XĎ6Ë«ż'ÉM¤ďÚÄž@Ŕüi-µ;4ř{w¦4Řľ{ń2Ç´ň›@ÎqŽŁÖąŞ)sČżS¸·ĽĐµż i¶¶˘úuޚμ–HŚrqŽý?*§ăýSLÔŽŽš<­$¶k …Jă 9śzW'EWV¦“˝ÎËDżŃŻĽÚ&ł}&žń]ý¦)–”7ËŚ9îJ«ˇęń•˝ŐťŰjü­(ĆX2ŕáO<řâąz(ćfµěÎęůü?km{<~!Ô5‘H¶´A${ ţű ~—ámRÎÇAńµÔŢ\×vę®Ňw°'ŚÇ^őĚŃG6·f­fÂş]kSłąđ_‡ě!›uÝ«LfM¤mÜů‘ÇĄsTRNĹ8ŢϰŞĹX2ő"˝.ăRđ¶©ŻZx’ëR–Ţâ ’Kcä3‘1Ś0ăţµyťÔ¬)Ă›©ŮxsÄV‹ńµ­AţÍk$’ą%Km ¬`{Š«ŕťVËLŐ5IŻfňŁžĘhŁ;Y·3Ŕö®^Šť4ÎŻÁş¦››«húÜŹĄúˇYŃ yn§# séůS5äđ冖zTçRÔZ]ďxchÂ.>č˙ŻŢąz(ćŇĂäÖ÷;Ż…Ú…:ĆŞÎ-­µ+;tIvçţú?®oÄú÷†őCa©* v‰‘+ˇÎŔő¬š|’É(A$Žájî9Ú= ©,čgÔíáőľ˛ćő/Ěć=§„ŘFsŚu>µSÁÚ˛h~#łż™YˇŚázíe ‘ôÎ Ć˘Ł‘Y®ĺűGu.Ç CyáĎE«^iZ”—×WĽ0Cä2yAżĽO\qůV…©ÚZřGÄ6S˶ćďÉňSi;¶±'0?ć褩+j˙¤S¬ď˘¶˙‰Ň[ęv‰đţëMiqz÷ÂeŹiĺ6śăG­iZ^hšç…ôí7WÔM»ÓŮÂKä™ŃŽONý?*âhˇÓOŻ*­técoĹrčíw:L-á#ĚŮgîŘ=?Jě<=^3ř}‡mçŠ-oLť¦¶ŽVÚ'Ť‰$ë–?őăÍ)UŠ0e%X‚5q\ŞĆr|ÎçSŕ;čü3ăXco--˝×¶ĺYHÂç88éé]´^;Ń”xÁľŇVI\ľ|§ýáň C·ËŔ^¸ë^C#´’3ČĚîÄł3’Ori´Äv Öl4ß x˛Ňö.âúŐ#·]Św°Ý‘0:ޏ®>Š(Ńľ7…t=KLÖďüHŃŢBÉgöHRĘËŤŕzçĄsľ0łĐaqqˇë­©Ë<¬ŇFm,s–ë\Ýč:.ŁáíWŔ0hć©.•=­Ű\G(·i•ÁŚ/űƲü'¬XřOÇ‘^[Ü=ö™´feŚŁI)‚žF3ś{W%Ez^Ł7†líu ¨üSŞj†TaibžlEôŢǨ‡µ‰ŕ˝fĂMđ׋-/gňî/­R;uŘÇ{ ٨ëŠăč Š( ŔÁfŤ›€ů×oâť{MľřĄo«ÚÜďÓ’âŮÚmŚ0©·qÚFxÁí\-. »µă[ë}KĹzĄĺ”že´ÓŤö•Ü=py®ŻÄ×^ńDš„Úä¶đŮ,-hÖo gPq† “^uEK¦´łŘ jqhŢ&Óµ Őš% ázíčqůÖżŚíĽ9,—š–ŹŻ=ÝÍĹÁ“ěŤhé´1$üçŠäh¦áys\UšÓGľřká85­AôâZvŠŕBe^$;”Ď9űW1ńYÓµ+Ť2ĎEg’ĂMµ[d•Ô©Ž§žĂő®~ďV˝»Ó,´ű‰÷ŮŮîň#ÚŁfă–ä ž}jŤD)r»·ßń«Ňáđ«x#P’ţâuńżú<`6ă1×9çô͇ş•¦“â»KÍB_&Ú5pĎ´¶2„'©®rŠÝ;;“(ó&™×ř[X°ţÍÖ´}f*ĆńL°ĘQ›Ë”'ž?/zg‚µ‹+[ WJŐ.&´·ľT)s’bu9ś?/zäč§ĚÉtÓż™Ôx‘ô4¸í¬µkÍZő¤Üó6ä‰Đ+u>ő7‡“C}2&ţÜ»Ńudb%+˛HąăqŽ1Ô×#EÚÜ94µÎżÇşŐžŻ¨i‰c<—ea{ąkLŮëĎ˙¬×]â¸ü:ž<ű~©©Ikqhb‘íü–a1!‡NŔŹjň H Ž˘­ęÚ•Ţ­|÷š„ľuË€ö…ÎĐUsďr]-’z+ťťâ­ţ ľ»$Oöi%}Č>đFGâ jZŢxgĂi©Ţé:”·÷WP<0Aä2yAżĽO\`WžŃIMŤŇLé´RÎ×Áţ"±žm—W~O’›Ißµ‰<řŇ[jviđöďLi±|÷âeŹiĺ6śăG­sTRć+‘~§]áäĐßL‰ż·.ô]Y‰d ě’.xĆÜcŚu4x˙]´ÔďôßěůŢčŮ@±µÜ‰´ĚŔç8?ç“\Ťsia{5ÍÍsҵO@×5Ő®5űŰʦâĹ#rKŚ+q\˙„ő‹­ôď,ZsڤČá 3’sŠĺh¦ćďq*I&®zuŹ‹ô¸î™ă ˝+Ă#IÓ ŽÚSt·2]ˇ;äÚAU>ŔůtëžbŠÝńNľľ!ńöŁYĂfîÍX‰!ŘusîÎzÖďŠuí6ű╾ŻksżNK‹gi¶0¦ÝÇiăµp´TĘ NŕmxÖúßRń^©ye'™m4Ĺă}Ąw\k«ń5׆ŐĚ|EÖtíJăLłŃYä°ÓmVŮ%u*d#©Áç°ýkź»ŐŻnôË->â}öv{Ľö¨Ů¸ĺą'źZŁQ \®í÷ü@ęô¸|*ŢÔ$ż¸ť|DŻţŹ ‚8ÇAŚuÎyý3_áîĄi¤ř®ŇóP—ɶŤ\3í-ڎ€ ękś˘·NÎäĘ<ɦuţÖ,?łu­YźĘ±ĽS,2”fňĺ€ çŹËŢ™ŕ­bĘÖĂUҵK‰­-ď• \ĤťNAŔçŹËŢą:)ó2]4ďću$}& .;k-ZóV˝i7<Íą"Eô ÝO˝hZŢhZׄ4í;WÔ_N»Óťö·’Ň ŽHďÓň®Š9Ůékť×Ä×…G†ÚËp·zwuŰü9÷Ć+JăRđ¶©ŻZx’ëR–Ţâ ’Kcä3‘1Ś0ăţµyţˇ©ÝęÚÇy7–±a@Ú ŕsřŐ:|ú’©{©6uZWŠŰÇ­®ÍyĚĺĐrÁůŚŹĘ´/źĂö¶×łÇâCPi‹kDG°źď±ęá\-ą™Nš˝Ń˝áUѤ{„Ö.îlfŔ6×QÂ6ç;€çÓő­˙k6 ŕńŁĹ¬M­Ý5Ŕ”O$l˘% -Éüűšŕ¨ˇJĘŔé¦îŮÔxTÓěżµlői^ kűcś_Ë>¸÷¬­zÓMłž%Ňu3¨ĆË—sE´ç¦­fQEô°ům.cÔ4Űŕę×zĽ±&±«Ű}šÖŐ3¤l9sŽťsř漾ź4˛M!’iIVs’eIa@ĆFNz( NřۤŢË­ r„š<ĹW(ęA8é×5ć5/Úgű?Ůüé<ŚçËÜvç×**(˘Š(˘Š(˘Š(˘Šžořő·˙:‚§›ţ=m˙ŕ_Π Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Šžřő¸˙€˙:‚§‡ţ=n?ŕ?Π Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Šžřő¸˙€˙:‚§‡ţ=n?ŕ?Π Š( Š( ĄŤÁ3ó.1ůÔUâŹi^áĘö9ş*ţµŁßh·fÔíÚ HÜ † Ž lřCÂgZ¶şÔu ÔÓt[L ®¤]Ů'řTw<ţ˘©;ę„rôT÷Ën—× dď%ŞČÂ'q†dĎĘHőĆ* (˘Š(­Żčx—WÝ[Z·–Ňy“¶ŽĂßźçY7P›{™afGhܡd9SŚÜPtUét‹č´xuY-ČÓćĹۆĆr1śö=ŞŤQEQEQEQEWAŕíM×n¦˛ľŐťvűEŁ:nŽG'•c۶ó¬ÝsI»Ń5[Ť?PŹË¸…¶‘ŘŽÄz‚9FŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ć˙Ź[řó¨*yżăÖßţüę (˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  á˙Ź[Źřó¨*xăÖăţüę (˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š(  á˙Ź[Źřó¨*xăÖăţüę (˘Š(˘Š*xăÖăţüę žřő¸˙€˙:‚Š( Š( Š( ˝vçSŇô݆>¸ÔôőI32Ĺ ˛EÎć8'€ÔבWaâ]fÂ÷Ŕ^Óm§ß{eçý˘=Ś6nlŽHÁü   ~(imŤć•˘Âměő;4şdź,ž¸Ďlú×k˘čú\Ňéö6ŢľźKťU%ÔnÁIrÝ_€ëÁĆř§ÄuŇř1í_íGLł….b(ˆR¤Ż gˇädW[©kŢĽńe·_Ĺ÷ëkćE'öjÁ'ČWĐ/¤âşß†ÚŢ›Ą]j¶šÓÉ ŽĄdöŻ4jXÇžřôĎéT|Aeˇémk7‡µćŐ%ą•­/ üÝię˛xKNÓµk] <-ţśÁăUi~ć°Çažqý+…Đ<9imńu4+¸ĹŐ”w2G¶OăPŚW8ďŇşWXđϵ8µ»Źjb˛!şÓcI7V ă¨đ®GÂZÖťcń"ŰUžI ÓRi|ĹĄuRŚâ$ň)ÓÚËŕ˝KSŐĽ?q¤ÚéQB%[}JKś1‘N%°ză8íŠňŠą­Mα<-ş)g‘ѱڂÄÍ.¶-¬Y®¬ň&že_=Ł`™ç€Ą]Η>™â YhwZŠé—–R;ĆÓÝM¸“Éěy˙őÖŤ˘ĐáńÉá‰^]4*ífĎŢÇ g’>µŁa†u]ÎŰł¤j6ůY$qž§ńţMEM‘Q*xşß[‡Pł°Öä´1¬vŇ6´yŔ!€Éüy®ćO ŮXęvúJř^[Ű"&ÔK°mÇ« t=«ŚńžłetúU¦ňKm¦Â"Iä\ăÓ[úŽĄ kš‚j×ýí€eSqb‘ą%€Ć‡8¬ĄÍdRµŮŤŁhvĐüIMéĹŞ\<{_ř”)#8ďҵ-äđµýţŁŁK§A§GA~÷1u8瞸ü+Ă:ĄŤźŽ-ő žXlWmŇ“#…*@ÎIäVĄ*M¨ÝKÝĘě§Č$‘WĘäőě+¤Ž‡ĂZu¦­á}rťRŐEÔ2A÷—ô˙Ǩ}Ą—ĂÓu˝őýĎ—lÇ9D_ĽGâüERđF®š/‰-n®-[1OĆ~Fź• KšÝ7 -swBТ´đµ†ˇ€ÚÝíë9`Xí…ŔéÜ˙ž•ŹăÍßHŐ,%ł‚KXo!YŤĽ„“ çć^Ö®iÚ¦›Şx_OÓoµyô‹»p’¬lë*1ÎÓÔ{ú{Ö‰§ÓźQ…4«‹«›x+OpÄ™ąôŐ1ććÔnÖ=Ä:-ĄÇÄk{é5›(gYíŘZľ|ÂWnÔ㏭yçŽäpŐ˙ëáżťkx‡ZÓîţ$[ę–÷ě{wiv0Ŕ]»ŽĎ=« Ĺwp_ř“Qş´2 ¦gFÁľ4R‹M_°I§±ąă_ů<#˙^ŻüÖą­ţC?őŢ?ýVĎŠ5;Kí ööłošŇÝ’eÚFĆ$q’9éÚ°ôÉR JŇYNŘŇTf8Î šŇ ÝűÉ{›źäwŐß_ýk˘źB¸Öüá•¶žŇ+Ď,n%Ůśżo^•ĘxŢúŰSńMý唞mĽ¬Ąi\ü t<ö«:î§iuŕ˙XÁ6ë«O;ÎM¤lÜّǥEź,mýh;«łCâݰÓt-*;Čﮬba<ń¶ĺÉĆ7|cůUßą·ř?á8#á.'žY1üL€ĎŕJóÚôżAŚţCáŰyâ‹[Ó'i­Ł•¶‰ăbIúĺŹä=xÖ1ĺV%»»_ôëMZ]rÎęŢ9f:dŇŰ3uIW#ó5ÝÁŕÝ%î|¦Î/2jcś;ýťfůżĎzŕ<}†|së mŕ…Ą·şŕ¶Ü«)\ç=+¶‹Çz2Ź7ÚJÉ+—Ó”˙Ľ>Avůx ×j„a|=łŃol|]¨jşrÜ[ŮÄłĹbĄF\ítÎÍG­ĎáťwÁ7…•Ť¦Ť¬YΨ¶ŃĎ“X<ç-ÖŤâ=?†zeóřbŃěäľxŇČĚvĆŔ7Î:đ:áĽ%¦YxÇâ 6âĐXéÓ3Jöń9;UW;A÷#ő­ Qđö«ŕ4 sT—JžÖí®#”[´ĘŕĆýăY~Ö,|'ăČŻ-îűL‰Ú32ĆQ¤Ť”ŤÁO#Î=¨ż—Â֚ݞ­k'äĐţĎËezüĺz+ç×ßŢą†Z~‘sŁř˘ó[±‘ŘŰ¤Č»ŠśüÇŽ™Ŕ«şŚŢłµÔ.ŁńN©ŞQ…ĄŠy±cÓ{ ~zÖ'‚ő› 7Ă^,´˝źË¸ľµHí×cě7dd Ł®(ţ·?†ußÜjV6š6±g:˘ŰG>Lńś …8'Îqü=y®Šíľč:f§·¨ëčď§i¶Ţc*9R\äŽG˛‘ŹqH&ŠW »]ŞN@ÎqíI@7ĂKmKÇUĄü)=´®áă~Ť„cüŔ®ĆÖ_ęZž­áűŤ&×JŠ*ŰęR\ጊp -€3×ÇlWđçR´Ńüi¦_ę2ů6łile'©‘­Mα<-ş)g‘ѱڂÄÍS#­zĹçűWü"÷ňô‹­"úžżÔ×9ŕď ^x˘ýáµhâ·‡s<ŚbBzűô?ýjŇřĄ­Yęţ!Š-)üÍ?O·K8\tpąËnqřSŽ˘Š)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@OüzÜŔťASĂ˙·đç@QEQEQEŔĚ7I#}ŘuföĄńMŽ™¦ęKmŁę'Q‰#lá6©“'!}±Žy  z(˘€ (©ě,翼ŠÖŇ3$ňť¨€“řÓI·d&í« ˘źq –óÉ Ë¶XŘŁ/ˇWA¤ř7WŐ4čo­RłËť…ć N î*ˇNSvŠ»§«Éśĺ«Żh7şĄř4 •ňäÓéYTĄi+1ĆJJč(˘Š‘…Q@UŤ:Î]BúKmľt­µw6Ńź­4›vBnÚ˛˝»®řWSĐě’îý!Ľ‚ RPß6 íô5…U8JŇVbŚ”•âîQEAAEŇi^ Őő=:ëTěógay•IÁ đ}Ĺ\)ĘŁ´UÉ”ăy;Ý«Żč7ş·â eŻ— ~ĎO­eR”\¤¬Ç)+ ˘ŻhŘÜj¶ńj×kdí‰&EÜP`ŕăż8­?xZMlâxďtű´ó-Ż"$úoz‘śőQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Í˙¶˙đ/çPTóÇ­żü ůÔQEQETđ˙Ç­ÇüůÔŰĂŞÇr#ŘÇ÷a@-śc·Lć¦Í¦•í§‹t}tOCaĄÇk6‹q—:ąfHŘ ç°ÉÇĐS®53Lřmá)ő--59s:ŲEÎć8ęx}MP×|I¤ÝZxé şÜÚśÖÍh<·`FşŽ0=qXľ"Őěo< áŤ>Ţ}÷–~źĆ76G$`ńéšQ„šJWßô˙1üy§ézV±˘jzm}őĽW†Íă®Jg°#ó®ŞűÄB|7ÓoĂVŻi%ë˘Ů™›j0 óŚçŹÖ¸źęöZžťá¨¬gódłÓ’ ĆĆ]ŽČä ýGŁŁj©ŕht-kS—KšÖí®QnÓ+‚_©Şpn1rľŹĚfžµ¦ÁŻÜßK ŰÍg*•K&”„ńČ8Éč:ďţ&kşUž§mׇmo%’Â6IžfS9€jň­Nh/çŠĆçív¨ÄG?–SxőÚyŢxšëĂ(‚ÓP›\–Âţ%…­Íä ę0Ă’j§ÍkoĽcŁÉáę:Ő€ĽBŤw”9%ľ\Ž€>”ý~ŰGÖĽý˝¦i‘éwv·BÚh˘rČę@ óß‘úŐŹ†âÉĽâőŐHěŘ[¬’"î)–`đpqíU5ýCCŇü˝ł]ÇŠěµ#Ái~¨Dč…Ľ¶S‘9ôüŞ}r˙HÓü(4-íďŢ[Ź´Opb1Ż~‚“ż?Ďđ ,t:~—˘ô‹9ô¤{Í+í2NUĎ„óúW9â‹[t˙ ęvvQŮý¸H˛Ă%rŽ<úć´í|EĄÇ{ˇČ×XKm%­Ą>[|˛#oN~ŁŠŔÖuKiü/á«[iw]YyćdÚFÂÎ ňFµLTążŻ1¶¬iüHżąłř‰5Ä–×Ę1Ë„SʦIüë?Ă6żđ–řŇ5ÔŰ‹†igŘ6îŔ'Ó8ýkˇÔ.ü'®kë·úŚ>Ôk‹·fŢĘĆáĆ1ţĎč~ µÓşÓl^˝đ™cÚyM g8ÇQëNđ>©aeý©gŞĘđ[_Ű<äBŢYőŔç˝9E¸µć ęgëWÖš­Í¸Ó´¸tě|Ąc°rOć˝O ŮXęvúJř^[Ű"&ÔK°mÇ« t=«Íő›m>ÂęŁęgP\ng6íÖ¦­všŽĄ kš‚j×ýí€eSqb‘ą%€Ć‡8˘iŮ[oGĚćL6^ńśöş…şŢXA3DęýJvn;]Łáí+ĂZ†Ąwĺ_Es„Ňâ$Á€míŹ@Oq\ľ–t‹żu9ĺ·ŇĂ™?yşGu„$Éî~µŇ\x®ĂÄpjz~¶VÎĐź3OF[ěĺF ś×ńö˘\×_+ţjpëvV“i‘Mu,ůK¦r1· CůŐjúuÍΡk‰µĘܰ7K),Hc“ŽśÖ?†5ôźŘßL Eˇ/\t8­/ŰčR=Őţ•­=ĚóĚdű3Zşm I?1ŕâ©Ĺ)ÜW÷MχÎmĽ㛨¸A A‡+ůţ•çńˇ’EEęÄ]ÇÂíBÄcAŐgÖÚĚťş$;s˙}ČW9â]˙÷صE(‘6 ®¤ś0?ë[v÷°xsMń5ʆäŃ–aş$’ěČÁ˶Čî9ţŐ‰oáű]Câ\úPO*ĹgrQ0Š ŔţUąc¬hš÷‰t˝EôýCűe¤Ť/“¸7“×sřV4ÚÄz'ĹËéTĽ s"H“´‚>źŇ˝:žÍÚNÜĽÝO3χ:şW˝żuü?oŞÚęP?†dŇ<^K[ Íóč­źZŔřg¨ZC­ŮÚK¦Ĺ5Ôł’—Lä4co@;ô?ťIzú­˝äńř‚˙Pi‹kTFPźď±ęs~Ô#ŇĽAc}2łE ś/\t8üë9ÔŚ*Á«yěúůiú—9S’×ńýMŹęú}ÍΡk‰˝ĘÜ07K!,Hc“Św­‘¦Úę_ü>·šťľžIĘ´Ŕ˙9ŕb°Ěću{;}/PŤ-omő‡.Švç'ĺ#đýk¸·đţ‰Ş}—ÄQl¶Ńb˝í°')"cäÇ#üšă5{*ŢęÚ=3XűdRK+[Ľb.zŕň}xô®ą<]Ąé×vz=Š ü8±nYŁ!¦/÷¤Áăü}ŞhňFRö–¶žz˙—qŐçir^˙vźçŘŔđĺ…Ż‰Ľikc+łc8ÚŠ ź| ýMuŻáű}V×Rü3&‘äBňZÝoŻElú×%˘jV>ń˘]ZLךlnĘP«aŽ„‘źÇĄzú­˝äńř‚˙Pi‹kTFPźď±ę]Ífîď·ő÷QIÉZö˛¶˙×Ţ'… ÓbđŁęÚl7“ E-ÇH²ŹO©üj÷‰´˝%tŹĹe§Çm.“<;& K8‘°AĎaž? Ăҵ[(<Ö2ͶčęQÜlÚÇäsŚvéÖ´uť{M¸¶ńŠCsąµ mÚŘyl<Ŕ¬ văř˘2§ěí¦Ţ]źë`qź=őßĎş˙‚HŁEŃüˇj7ZDW·—U!ÜŞň}HëY^=Ó¬mfÓot¨Śş…˛Î!Îvŕ~b·Ą¶Ňîüá¨ukç±ÉÇ8Č>ůĘ=r9ö®ÇZ­Ťüú}®’Í%•…şŔ’° ąN=…*É*vvÚ6Ú÷¶ľaJîz_w~Ĺ›źů%źö?ú-«žĐb¶źXµŽú+™­Ůţxí—tŹÇ@=Ít:%öŹ}á˘ë˛iď×Úc™aiC|¸ÁęJO _é>ń€•/óOňŚbčBP©a×i玕›Śe(Iµmô‹MĹM$ďŻős¤ţõŐlµ(fđĽš@†–Úä“’W osř÷®sŔ–ZlúfżuŞÚ ”´%UÜTçćŕÓ85±¤ęZ.Ź6˘óx–çR–âÚHÓt2măÎrÇň×9á}NŇÇBń˝ÔŰ&»·T…v“Ľ‚xČuď[IĂž-ŰŻnÚmˇśTůd•úwůď©sU—AŐĽ+5ĺ­Ąľ—©ŰJŞ I˛fC'ý+RM"=Wá˙†Äš•Ť€ŚÎAş“`|Čz~UçUŇë:ťĄĎ4 fÝwjÓ“iw6G$`ńéX´eĚä–Ţ—ŐΛ\Ş/Ż­´fvŻĄÇ¦_Á_Ůß«€Ĺí_zŽqďÇë]ţŞžÓĽet(¤K†Ž9%201— Ł·PsžćĽş"T' `MuŢ#Öl/>"ÁŞ[OľĹgĚ»p»wž0{QF¤b›In·×Mo¸T„›I·łűô0ĘUа!Áµ%t?ˇHŠş'Ў°Ňăµ›E¸Ëť\łH$lsŘdăč)׎™¦|6đ”ú––šśąťbŠY ˘Ťçsu<>¦§Ű^Î+Żép<Ş®ÉĄ^ŤéĽXË!‰%ČÁaśŚg=Ťu^<Óô˝+XŃ5=6Ě >úŢ+ĂfĚq×%3Řů×U}â !>é·Źá«W´’őŃlĚ͵ůĆsÇëMÖvN+pŐĄg­i°k÷7Ňč6óYĘĄRÉĄ!"µŕ/íí3LŹK»µşÓE–GRžüŹÖ‡U)rŰȬé–3ęWđYÚ…3ĚŰP1Ŕ'ëU«OÂóý›ÄşTŮŔK¨Éúný+G˘Đă›@ÔNż˝1/Ůěfň';†Cd ß’*ľŻĄÝi3Ĺ ęŞÉ$K2€Ůů[Ązž§jaÓuý5G7ň^ÝîŤÖąO^Ámńf¸µKËkUHĽ—bˇŔŚwçô¬ˇQÉ—(¤`ęZ–>ź¨=Ő´‰x ĆůtúŠĎ°łžţň+[HĚ“Ęv˘Oă]g‹áӦ𮉪iúlVu$ÁŇ6-¶'éúŇü2Ô,áÖě­&Ó"šęYň—Lä4co@:‡óŞç|Ť‹•^Ç<2[Ď$3.ŮcbŚľ„Vîô««M2ĘţdQmyżĘ!'iÁČí[Ţ2Őô뛝BÖ  k•ą`n–RXÇ'9­Éď´ý?Ŕ>š˙NMBLĚ#ŽG*Š7üÄă©čÖ“›˛ÓpĺZžo]{|<הᣵSčnT>>Óllî´ë˝.#­ýŞ\I'a=@ý+§řˇé÷Ţ$–{ťzÎĘS ŞK (çŠN¦Öę5îyĆĄe6ť}5ĄČQ4Gkm`Ă?QU«[GšÇN××íđÇ`’߆\ăz˙:ëµi^˛Ô5+ż*ú+ś&—$† olzú{Š·>]”nyÝŮxD‚úÓTÔnldÔZÍPChŚGěO\sŹçVü[ˇÂ|.ş¸ŃŰFĽŽŕC,‰WR8`Nxüé:‰K”9]®pTW©iú^cŇ,çŇb‘ď4Ż´É8v WÁ·v8™ÇëJ2|ĽŇŘW˛9š+ĐěWĂţ(]RĆËG[ ­ŕyí®BKmţđ>ąťŕ«M-ü9ŻßęÖBčYůL‹¸©É'ŚŽ€śíOÚiŞSŤ«vZuÝô7RÚÂdŽŮ<É l_^kŞ×`Ňő_&·§ié§ÜĂuöicŤ‰Vsž~Łő­ęÚ{hĘŤkkgo0˙¤ŕs»Ó>Ţ´ťGËtG[gEkëWÖš­Í¸Ó´¸tě|Ąc°rOć˝O ŮXęvúJř^[Ű"&ÔK°mÇ« t=©Ę§.čo±ätWDa˛đ÷ŚçµÔ-Öň š'WęSłqÜ čµi^˛Ô5+ż*ú+ś&—$† olzú{Šn˘Vó‚°łžţň+[HĚ“Ęv˘OăQĎ –óÉ Ë¶XŘŁ/ˇWcđËPł‡[˛´›LŠk©gĘ]3ŃŤ˝čzΫřËWÓ®nu X4H-®VĺşYIbCśtć—;ćĺ°YZćW…|?yâ]b->ŔĚ7I#}ŘuföĄńMŽ™¦ęKmŁę'Q‰#lá6©“'!}±Žy®«áó›oxćę.&CaÁ ĹţĄyühd‘Qz±V¤Ť˘˝:öiľ&±đÜš2Ě7D’]™9vÁÇ##ßÚ±-ü?k¨|KźJ ĺX¬îJ!ĆA8Ęşe…’vM7{|ÎxâWjĘ×ůeOag=ýäV¶‘™'”íD źĆ˝1ü?oŞÚęP?†dŇ<^K[ Íóč­źZŔřg¨ZC­ŮÚK¦Ĺ5Ôł’—Lä4co@;ô?ť?ŞňÎ1“Ńú˙{{Á¸­QÇ\C%ĽňC2í–6(ËčAÁĐi> ŐőM:ëTěňçay‚“‚AŕűŠłă_OąąÔ-`Ń ·ą[†éd%‰ rqŽő˛4Ű]Ká߇ÖóS·ÓÂI9Vç< S§BrW˝—§_1N¬”bö»őéäqúö{ˇI _J _.@ý>••ZZ˝ťľ—¨F–·¶úŚaC—E;s“ň‘ř~µÜ[řDŐ>Ëâ(¶[h±D^öŘ”‘1ňc‘ţMDh:’j[Ďő)ÖPŠrÖçšŃ]7‡,-|MăHŕ []śĂĆÔPH\űŕgęk­Űę¶ş”á™4Ź"’Öč3|Ĺz+gÖŠxYTNQžż×O;3Ë(®ßÂi±xQő í6Ɇ˘–ăĚ$aYG§Ôţ5{ÄÚ^’şGâ˛Óă¶—Iž“%śHŘ ç°Ď…5…n÷[_óŁ®”ąmýL󪱧Y˨_Cim·Î•¶®ćÚ3ő®ŮF‹Łř7BÔn´Żo. ŞCąU 9äú0Ö˛Ľ{§XÚͦŢéQ-u eśCśě=ŔüĹ)aů#ĚÝömy1ŞÜĎ•+ořőß ęz’]ߤ"D JćÁ=ľ†°«°ą˙’Qi˙aC˙˘Úąí+iő‹XšÝźçŽŮwHütÜÔŐ§$ˇŐ/Ätćů[—K”(ŻSţõŐlµ(fđĽš@†–Úä“’W osř÷®sŔ–ZlúfżuŞÚ ”´%UÜTçćŕÓ85o %%ď~ý X„âݶýN>şM+Ášľ§§C}j}žlě/2©8$¸«ş¬ş­áYŻ-m-ô˝NÚUQM“2 €y8ĎéZ’iężü6$Ô¬lfr Ô›ćCÓňާ‡M»űÚ]YŰ­şŠuť•´ÖÚú~ż ŢčO ß”ľ\úc=>µ•Zšľ—™ g~®µ}ę9Ćż­wúŞxkNń”z!Т‘.8ä”ČŔĆ\6ŽÝAÎ{š•Cť˝yRik®ţ…:Ü©u<ëD†ĆăU·‹V¸{['lI2.âůĹiřĂÂÓřrkgÇ{§Ý§™myů$Đű{ÖěLׯě˘$ÇĚŠO\gŚţŘů†óŕwď†M–­˛#č ô3\ň‹‹iô6MI]{ETŚ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šžořő·˙:‚§›ţ=m˙ŕ_Π Š( Š( §‡ţ=n?ŕ?Π©á˙Ź[Źřó (˘Š(˘Š(˘Šžřő¸˙€˙:‚§‡ţ=n?ŕ?Π Š( Š( Š( UšÓGľřká85­AôâZvŠŕBe^$;”Ď9űW1ńYÓµ+Ť2ĎEg’ĂMµ[d•Ô©Ž§žĂő®~ďV˝»Ó,´ű‰÷ŮŮîň#ÚŁfă–ä ž}jŤc \®í÷ü@ë>&jö:×ŇëLźÎ€[GmŚż0#Tü®GáßŮę7Ďn›’PŁť¬Čúg?…sôUŞk““ ™g}á? Ç«_čÚ¬ÚŤĺÝ»ÁmoövAoďׇŁk6Ţ}:iöŢV;‘Ć?» lăşg5ÇŃR¨®®ŕz6»âM&ęÓÇIÖćÔć¶kAĺ¸ó0-ÔqëŠĹńŻcyŕo iöóSóüřö0Ůą˛9#ŹL×'E¤ŁkZXŻĆú˝–§§xj+üŮ,ôä‚q±—c€29?QĹhčÚ†Şx ZÔĺŇćµ»k„”[´ĘŕĆęk˘ź˛\Ş7Ř :ś6Đ_ĎŤĎÚíQŽ,¦ńë´ň+Ľń5׆ˇvnÖRňÄë¸cnzîsÖ˛őNŇoitsfň ‰Hö‘´psŚľµÍQMSH…S†ú×Gń S´ŐüSsy§Ëç[ş WÚW8P\Ý\şÜWŇĆç‚/í´ĎŘ^_Iĺ[ÄĚ]ö–ÇĘGA“Ţł5)RmFęXŽčŢWe8ĆA$Š­EÖá},u^Ő4Ř´Ý[GÖ¤x-/Őť·–Ęr2>ź•O®_é……˘Ý˝űËqö‰î F5ŕ`ĐWEOłW¸ů´±čVľ"Ňă˝Đäk¬%¶’ÖŇź-ľY ‘·§?QĹ`k:Ą´ţđŐ­´»®¬Ľó2m#agy#ÚąĘ(TŇwţż­AÉžŹ¨]řO\Ö!×oő }¨× nÍ˝”ŤĂŚcü+źĐüAk¦xÜjŃZů6GJ”ŤQÁ®bŠJšJŔĺÔô [ż řq5;Í+R–úęę†<†Aoď׉ˇjv–ľń”ómş»ň|”ÚNý¬Iä ĆąŞ)ű5Ő‡1ŇŰęv‰đúëLi±z÷ÂeŹiĺ6śăG­;ŔúĄ…—öĄž«+Áml`ó‘ ygמőĚQMÁ4×qsšÍ¶źauŃő3¨.73›v‹kÓ Ö»MGRĐ5ÍA5kŤ~öŔ2©¸±HÜ’Ŕc ĂśW›ŃIÂýFĄcsK:Eß‰ŚşśňŰéaĚźĽÝ#şÂä÷?Zé.×If’ĘÂÝ`IX\ާžÂ±.u;»ť>ŇĆy·ZÚîňShwžq“řŐ:޸ŽhňĹt^ş!SŁĘů›ďřť†‰}ŁßxDčşĹěš{ĹuöćXZPß.0@úźŇ“ĂúO‡<`%KĆĽÓüŁş”*XuÚyăĄrT¬C\®Ęë¨Ý=#IÔ´]mEćń-ÎĄ-Ĺ´‘¦čdÚ Ć3śĺŹä9®sÂúťĄŽ…â+{©¶Mwn© í'yń8ëŢąŞ)ĽL›VIZýúüĨ+;˝ířtşÎ§isŕÍ·]Ú´ĆdÚFÝÍ‘É!Bxă\Ž!µ>×!Ó'?Ö€9ę(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'›ţ=m˙ŕ_Π©ć˙Ź[řó¨(˘Š(˘Š(˘Š(ĐľčÖX> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔxŞ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQETö_ńôźŹň¨*{/řúOÇůPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@WMđŇĆŰRńĆ•i Om+¸xߣa˙0(™˘˝^Ö_ęZž­áűŤ&×JŠ*ŰęR\ጊp -€3×ÇlVOÂ˙[jV:έw¦ľŞÖ*‹obŚWÍ‘ł×‡­yőę:đÜ ŕĹ×F‚Úˇ Ȇk`ĤG nqúűT6°č>đ‘¨ęZ,Zµţ¬ňK!Q)ÇĘ@8==ůö 5˘˝ âF—¤YÜř]ô[A­ĺ¤s’K‚F gľ .Ń´űO‹öÚ]µ¤qéíuj†ű¤6ÍĂńÉ =˘˝ XęźntEŹÉÓRwfŽ3Ś"®vŹ©Ŕük§—Â֚ݞ­k'äĐţĎËezüĺz+ç×ßŢ€ŘÓć¤ńęئ™\xNă@ŐÄź+'ú‰¸ÉďôşĐ!§iÚ•˝ěöVćX¬ăóg`ŔlO^O=J¤Š]ŐW–c^Ăđă\ÓÂÚúŻ‡í‘¬´ĐnJÓ0CqĆp}zןkšľź«j-¦č°iKaÖ) ů„‘‚rJ×»ř[â›xÝ…¤3˛ âťKăéžkudvGR®§HÁŇ˝[Ć—Ű|vłx$hÜÜZ!*qB>„),4‹ G㦡c{kÖŹ4ÎŃ0ŕť…łůóL)˘»†šUŽĄ®ëPßŰGLńś …8'Îqü=y«> łłŽâךţ¤ň4“)XA8yÉéž;Đ›Őét‹č´xuY-ČÓćĹۆĆr1śö=«˛ř“ŁiţńŤ{k§­n˘K©tůXü¬挞Ŕôöćş«˙čńü3Ó/źĂŹg%óĆ–Fc¶6ľpq×ůÓĹk{XđÔş_‡ô˝Yď-&ŽüebŤňńńžGóô5jÖ âí#Ł@l7ýźćŰŚnĆzóŇşŹĂĄ\ř#ĂÚΙ¤Á¦Éy,ĘéáX¨äý3řŇĎh®ëáö—Ą.‡®ř‹]µűljƱ[*®îp3Ź}ż™«>#łŃuĎ˙ÂI¤i‹Ą][] iŕŤË#‚gň?ZóĘ+Ô@đöŕ ęך ŤýŮ•Hy +ç,Ýr@©¬?ŠF›ayĄ_č°›{=NÍ.„$!=†{`ŹÖ€8Ş(˘€ +§ń>©áëíIEŇd˛ľą™Ä‡=ÎyÉÉĹVđŃđČŠřIWW2nWŘ<Ľcľíýţ”EtÚóx8éÍý‚šđľÜ6›Ď+ËÇ|íç5ĚĐE: ¨ °ěâřOHńÔz đä2ÇrŃÇ,ĆV"řjú ‚NsÉô¬çS‘Ú×Çh®ëGđőśWD¸Ś\XĄĚ‰±˙‰v1ţ•«m/őGTĐgŇí´¸â­ľŁ%É ]N9Ŕç®:v¤ë%˛żP<Ší|¦écFÖőýnÔŢA§,k¶ňˇÝÎH÷ÇćjÇm4}gŔ˙đé:réw6÷BÚx#rČŕŚ‚3Ó¨ýiş©JÖň‚˘˝‹KŇ<>Ńhv:,2=öŹöąn°pĘąăĐžyúW!ă«]=ô/ ëu„Vţ9–Xb$¨1¸PF~µ1¬Ą+[úţeě:6“¦M-…•żď§Ó' ’ęa’\·Wt9ŕŠçü-áËřŻ.‰wş˛ŠI”$ťŔRW8ďŇ’®µÓm@ó곦ŘÜęWĐŮŘÄeąíD Çńâşź‡Ze–Ą¬k_[¤ŃçĎ,jßÂęWő«ź 5;(‰©˝”·\2¨mđ¶WžßZ±¤jöv·7sj:T:‰ť·$…v’qŹ\ţ•wâE…®›â©í¬!X XĐ„^€•­9ź5‰¶—0ě´ë»čnĄµ„ɲy“@ŘľĽŐUÔśWĄřVÓŰ@ÖTh°+[X;y‡ý'ťŢ™öő®/XÔlµ»f°ŇâÓ•crŰůëÍ(Ͷեk•5­.ëFÔd˛ľU[Ŕ,FG?ŤRŻ\ń=Ţ||4Űí.¤»hŁ–áä!°BĐŹ~k͵ý=4ď^ŘFÄĹć5'®ÜńúQN|É]Łcr?Áeá_íźjÉîbv°ł ™' |¤ú.qřŐČW |q•ŹŽ^Üq µ´QĆ˝€Ć­7á–ź¤\čţ(ĽÖěEäv6é2.â§?1Ŕ#¦pkBNŠďőąü3®ř&ăP˛±´Ńµ‹9ŐÚ9ňgŚŕd)Á8ÎsŹáëÍmřkĂPXx/MŐ"đËx‡QÔŮŐś„‚0H8É˙JňZ+şřťá›m#XÓM¶{8µ(O˛ČÄ$' ą=ą­uz…ż„´Źiľ“ĂńÎ7Â’_4¬$2>ČÇ ädgűSĘ4Hln5[xµk‡µ˛vÄ“"î(0pqßśVźŚ<-?‡&¶q”Ę–ńB]ÎŞ0ŞěôŻQĽŇlt¨,–×ÂßÚúkÂŻ-ěnZFĎRéëŘ}*Ą>[ Fç”Ő˝KN»Ó&Hݎ0Čč$PH9SĐńW¬ď´Ű jęoě϶X¶ĺŠŢĺö”äIĆ1ř×ońYÓmŻíáąĐ­îĄ{(ŮeiX8cµ'6šIбĺôWYŕŰ 8iZľµ«Ű›¸lvűЇv8#đüęĆąkĄjľţÜÓlN¸‚ä[Í 9d`FAúŹÖ›ž¶].qtWsoŹ ř?LľľŇ“RĽÔšC‰$*ăŚwéůűUO6:u™Ń¤Ňmü.l–lI9î}ńB©wkŽ—9+ÓuÖđÖ…ŻÚŘKˇC,sÇO3JĂË ÇĘ=şçŢą[Ť?K‡ĆÍgM{Ą ~QfDŽęFB©žN?:Q©~€ăcś˘˝Oű×U±Ôá›ÂŇčâkk’[$Ż@ŮęOăßëX~·ÓađŁę7Úl7ł E-ÇH²ŚôúźĆ’Ş­°ů"ŻęZMŢťoe=Ň(Šň/6V+ý=+¶ń6•¤®‘âH¬´ô¶—Hž“%śHŘ ç°Ď…gÜ#j˙ 4÷Śo¸ÓŻ ľ;ě~GęT~*—ł-ŽfűI»±Óěo.UVŔÍĚ u$vę*…v_H펑4űh­€í¸Ś“úŹĘş©<7ec©Űé+áyolD›Q.Á·¬1Đ öŁÚŮ&úŹ’ďCČč®»IđÄüB}wvµŠWÜs†dPHSŔ5bmSš”7Ö˛iI¦F6—1ł;3†;ű˙őę˝§d.SŤ¶‚[« ·Ť¤šVŁ%‰ŕ]?‹ü1gá›8-çŐă]gS=¬Kň@…s‚ÝŰ8ôúUźq,ż´ă!|×ÜFŘ®g]¸’ďZż¸–’YÝŘ“žK˛J4QEQEQEQE,UŘ#nPH ŚdzŇQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@tu+MĆšeţŁ/“i 1‘ö–ĆQ€ŕz‘\ĺsZš;ťbţx[tRĎ#Łc‰šë>kú}–›¬čÚĹÜö6Ú‚ˇŽî$Âęsś/8<~^őĂŃ@Ż‹eŃm´Hě¬5ËýoPywI;HQ@ł“ďźZҲżđç| ĄézćŞú]î”ďµü†”JŚŮ ßQ^qEzWĆ -Ń<%&ť¸Z®šŤńÎÎ6çß­k­[ÁšĎ‰lĽ[y«ÍksŽI´˙łł3Jۆců•ĺÚ¦±ŞCeüţlvP‹xĹ]:ĎÔóT)Űhľ2Ž×âdž#ž'łM!xĆ ,lŕţ«¨Íá›;]Bę?ꚡ•ZX§›F=7±ęáÇ­yĄ€éĽşŹw˝{u§\¦ŇöÄDÜçp^}?Zéü_â 2? -z޵ĘĚ.e‰”B tą?™ęzW™Q@źĂŤkKÓ†µa­Í%µ¦§hmţĐ_Ë<óĎsY垍§_ÚbëT„á¤Ű<;=0Ýx¬:(ŘuÍSÁ7ž6_ËŻĎpŃ4r%”6R)-ůŘŚé\†…ăµř•˙ %ÜL –yH×’¨ŕ®®\WEzĄľˇá/ Ĺ­ę:.­&Ą{¨A$ÖâÝ“ÉW9;‰ë‚ˇăĄs~ Öl4ß x˛Ňö.âúŐ#·]Św°Ý‘0:ޏ®>Š+Ô“ZŃuźčvRx–çAźMڤĐÇ Ś&éó ¤dńźÄ×–Ń@ĎĹ oJÖAMî[ěěÄÓ+cď9 ńÖµŻi­c¨=±·f Dp*ŽśŠĺ¨˘€úř˙Ţν§ĆQxa>"˙hęú¬¶—6F)$¶ňÄĹB˛•aÓ°#ÚĽMIVuŠ»¬ę·şÖˇ%ö§7źu źh\ŕ`peR›ś“˝·©ŇĽ÷w7O˛5٦ĐÄ“óž+JĆ˙ĂŢ đ†—Ąkş”š]ćÎ#—ČiVDc’8čxźNőçôQě´Jď@:ĎZ݆«u§ZhŢciúmŞŰE$LuluôëIĄĂáVđFˇ%ýÄëâ%ôxŔlĆ: c®sĎéžRЏĹEYĐxR¶Ň|Oms'—iµŇVÚ[ˇ=q]eŹ‹´ČɢÁFŔĺsÔJm'~Ö$ňă\Ő*i]™ť$ť˘ü=¸Ó\_> 'í<¦Ŕ3śc¨ő­?·‡ô›ű Z÷]1ÜĆ˝ŻŮ$8%YqĽdwĎJâ(¦átŐ÷.¦ç‰-4fҵs¨4˛1tű3ŰuęÝkŞŃî<=§ŢZßiľ&ľ°µBŻ-ÄîX÷RGĘAúóš(pşµÁJÎć—‰oˇÔőűűŰd1Ă<ĄŐHÁÇ©÷=k¨ńLJĽEµôşÄ–W±Z,-lÖ®ű™AčĂ’k…˘‡ ­Đ\ÇUŕíSM‹MŐ´}jG‚ŇýP‰Ń yl§# séůTúĺţ‘§řPhZ-Ű߼·hžŕÄc^ýqÔQěŐî>m,vZnłŁßxfÓJ×­ŻŮěťš m6’ÁŽJśô˙ë źâ›!}d&ţĎB!=c”ý:~Ďhž%Őô8$‡K»ň#‘·°ňѲqŹâ©jšŤŢ«v×Z„ď<ě0Y˝=čJ¦ÔŻĐ|ÚXÚř©ÚjÚňÜéóy°‹xÓvŇĽČÁ›ŕ ^×DńwWű„6ŚČŁ&2GŢüő®rŠľEËĘO6·=#IÔ´M]Ećń-ÖĄ-Ŭ‘¦čd Ć3śĺŹä9®KŐl đkXË6ŰŁ©Gqłk(çíÓ­rôTŞh|Çw¬ëÚmĹ·Ś’ťÍ¨KnÖĂËaćl·n0=qP|7ÖôÝ5ď­uąLvsyR©ŘĚ<ČÜ0˙‘\]{5ËĘÎ÷45ťEŻőŰ˝@eťĄ\öăôĹwŽĄ kš‚j×ýí€eSqb‘ą%€Ć‡8Ż7˘›‚v+'‡uŰ}'ĆI©ć6aÜvß&ĆdžädŇ–éĐß\Ĺ|ú¤’Ł-­©…ăňô,ÜgäWEw¸)žÖSĂţ,Óu9A1C'ď1×c¬"MküEđ»éwm¬XMÖ‡¨L^ŢxÜËm#ŰźË׊ă)ţlžI‹Ě(¶í™ůsÓ8ő«$eQ@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPRÝ"¤ěŞ0Łʢ©ďăé˙ĺ@QEQEQEQEQEQEQEQEYÓlnu+člěb2ÜĚv˘ăřńCvµ%Ě[\Kë˛XśŁ©ěŔŕŠ»{Ł^Yi”č˘Öű’CNÓ‘Ú•ĐÔQE0 (˘€ (˘€ (ˇAfuźđţUO{˙Oř*‚Š( Š( Š( Żá~źiŞřÚĆÓPg¶u´mĐâ6#őŇé0řkÄŁYѬôE˛–ÖŢI­o¬Îĺ2ß\ŽťEb|˙’‡¦˙»/ţ‹jŮÓďü-ᱬę–ś×W÷pÉM)„±ä3t88çÓÖąjßťĄ{Ů[ď`e|9°Ňn4źŢkVBî;+t•qSś·Ž™ŔĄÖfđ޵ŕŮďěě­tŤ^ŇeAoů3Ćp2ňqźNŢőGÂ˝ŽźáĎZŢOĺĎ{l‘Ŕ»ď`[# `uq\ťh ÜŰwÜC´‡CđÇtŤORŇVżŐF ,…V4CŽ0<ŹĎÚ™â-K‡Ĺ^źM€¦™«ůg$ěÜŕ2ç®0ť7ţń„4˝+]Ô¤Ňď4ĆqľCJ˛#‘ÇCŔúw¨üCâ=.çĹ]9¤NŹäD&‘N]UfÇ^ëY®nn·×ţ&©‡, Ö§_Z±Ňu·Eó‡ŕîőÇ8JĹ›Â7ćĐŁVŹN%dC‚Ę´©ÇҢׇ¤˝ń}…·ĹɦąŹŰxrY/5-^{»›‹'ŮŃÓhbIůĎßjö7žđĆźo>űË??ĎŹc ››#’0xôÍ>E%Żżź`'ř‰ŁX[j:EΉŮíµ[XîIłvÉíČýk»“Âş~źŞŰh©á ŻěDźT20}ÍŐĆ:žqý+Ďüg­YßYx\iÓů“XŘGĂc ’.8äsÓ¶Eu¦­áżęqë7>$żÓ•‘ Îś‘ČX°ap3ŹOʢJ|Ş÷ëßäO…|7eĹi4;č…ŐśO2…“ř€RTśwéT~i–Z–±¬E}n“Gź<±« ©\Ö«xgÄ6ş7Ź"ŐÖ;b˛¸+#ď“Ë`W$÷ ţŇA}á_ E­_hú¬šŤĺýĽ[Űýť“ÉW븞¸ ~USçZkŞ@eü-ŃěuKŤV[«DÔ.ím÷ÚŘĽ›Ěsž}°=ą¦řŕY&ťOákŤ VpÉź&Dď׿Óó¬ż.…$—Që—·Z|ĺAµĽ„·9Ü'·ë]'‹5Ý9<48µÉőűĆą ‰be¨nOćzž”ĺi×ń˙†Î)Đ˙­O÷…tž‡Ăsj“Ż‹¦–+A 1Ý‚ův‚zgĎËäĄëýťŰ‰ÂĂ’ąŕź|WH·âŇăâ=˝ôšŐ”3¬öě->a+·ęqÇÖ¸o\ĂgńRžęŃ/!K—ݱPüÔ~…[ń·§Ţ|I¶Őmî7Ř$öîŇěa€»wž0{V~©&™¬řÎţiők§Ď+şÜYříňő浓Onç58µnnĆŹŚ!Ӧ𦉪iúl6]I0tŤ‹p­ÉúS>iVz”ú”—6«}soű{6“`•ąĎ>Řťj_˙Â+wá˝/I˙„ ±iÍű§~ö'§lgÖąŻ &×qj··6Ž1öKČ”¤Ë(çž?ZÄÓn kř÷/řŔZ-„k7‡'ѵ0üĎ•"~=ţ•˝ŕm[Ook*ş, Ö¶ÎŢa˙IŔ9Ýéś~µźâmfÁ<4xµ‰µ»¦¸‰äŤ”D tą?źsY^Ő4ű/í[=ZW‚ÚţŘÁç"ňĎ®=轤.W*{~fvµ}g«\Ű.ťĄĂ§Xä,“Á9®Ţň é>#¶đÔş*Üî1Ĺ5ăJÂMîę:ĺ\6ło§i÷pT:Š˝śŰ´[X­v×:‡…5]~ßÄwZ”Ö× ĺÉ-—ĚYĐ a‡ŕő©DsŮZö׹‰¤řbŢ_͢NĚö‘Lůç‘A`?­˝ü9ŻÜęńCˇElö¶’É,ŚC’;7Cřšćí|P`ńŰkëdy™ŚY䣸úŕţuŘřbM Ą×ĄŃ,őĚ–3I,·ABF8ůź>•Q·Bjs%wŮÇ€ě´ÉôĎ]jÖ‚é,ŕIQw9Ëpéśš]V]Wđ¤×¶––Ú^©k*¨&É™@<śgô÷Ş~Ő,ětŰ]MĺÍwn© í'{xČuď\ÍEě¬iĘÜ›;Ź [Z˙b,Öţ»ÖošB$yQ}ާ§j‰ô +č+Ł[ŰjKËi!'Ë%Ŕe˙>ő2ęşV©ám"ŇMv}k),I°—$|Ăn2~ľ¦ˇńąĄ\ë^–ĘęIm¬R%™ĺFŢ»\Oś ńš­,fąąŻëÜ×ÔˇĐm!Ő¦]ÝŽ™|°*ďlH®ď§8Jf‡¦[i^ŇŐÁgŤzíÝěűčÖ>ł®é×~$Hn75ĺüsŔ60Ţ€śžś~5-ߊlmţ(ľąlíq`J©eR _(! ň§ut%YŻ'úÁđâygÖ5Ń+—éó´€˙Čäţgó¨|gĄ?‡|A«Ů ˇf"d]ĹNIo—# $}«BŢďĂ>ŹU˝Ňµ9/î®ŕx Čdňxž¸Ŕ¨|-Â>)]EÝ-X@®č2S,Ŕ6;ŕŕăÚ’č˝J“ŃÉyëvúVŻŕżí­;NM:ćÚä[ËlY\Áçę?ZÖđ6­§·‡µ•]k[go0˙¤ŕîôÎ?ZĆÖď´m;ÁĂDŃď[P–{q4ţQŤWô­Sđ6©§ŮjŮęŇĽ×öĆ9ż–}p9ďBv8Ţ}ĚÍR˛Ôd…¬4¨tĺ@C,n[ż5čwşE†•’ÚxWű_Lh彉ËČŮę@={ĄyÖ»i¦YĎé:™ÔbeËąˇÚsÓ­vš=LJtűË[í7Ä÷Ö¨Uĺ°xťËë‘ňzt4Ł»¸ęl­Çţä¬4»]c_žÚŇňŰLµ%ž7Ôeň€xRyçü+°ř‹h4ox[HGzç^[ťĐ¶XťŞÝţ÷é\G‰ŻáÔüA{mŽĺ.ŞF=Oąëř×yu¤Ţk´¤F.ľĂ5Ä—J®ˇ˘ůň ôçń Ţ;aERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETö_ńôźŹň¨*{/řúOÇůPQEQEQE=ďü}?áüŞ ž÷ţ>źđţTQ@Q@Q@tmRóFÔ#ľÓfň.ŁČWÚ#ˇ5MŘ»ł1Ë1É5%Ň*NĘŁ 1üŞ*,Żp (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ŻńÍm’6§Á"·u/kú•ś–·š‹Ľ :Ş"n„¨ĎŃM6‰qOV‚Š(¤PQEQEUË]NňÖÂîĘŢm–×{|äÚý§#’2? §E15}Š(¤0˘Š(©`ąžÜ8‚i"0Ű®áčqÖ˘˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š({ßřúĂůT=ďü}?áüŞ (˘Š(˘Š+KĂş-ç5Xôý5Q®d ƶړĎáYµÝü˙’‡c˙\ĺ˙Đ `ÚřWUąÖµ *8^XŁÉ2ł€ˇ ÷ę1XUďZlk¨kżđ’ŔÍW@śM· ž2Šăů~FĽÓáŐĄ…ĹŐëŢh·ÚŐĚQokź,±Ď20č:z÷ BŠő/xzŐüšáШĂr ’ܶD#†ęGäkgIŃĽ:đh6ZÉŁ}®[€ĺ\2®xô'śźĄxĄÝřćÂÂëG𮩥iđéňj‰,oDěÜŽŞ?Zď$đ–ť§jÖşx6[ý9‚%ĆŞŇ6ýĚ9aŽĂ<ăúP„QZŢ,Ň—Dń.٦ٗŽŢfDcÔŻQź|Z>'Ő<=}˘é0hşL–WĐ 31ŕgąĎ998 bŠ( Š( Š( Żi]Ö­<Ů"łÇ•`0ŁţuF¶ŇŢK»¸mˇË3¬h ĆI8ëűIl/fµąf…Š8 ď^‡(Đ´iú$zXi!–Ţy„Ić¤t#‘‘ďíTm,mµŠ·v×±,Đ<ÓFčp¤ŠËÚu¶–2öťmĄ®ptWKŕ« [íCSŽî•"˛–DřXúÔŢ łÓ§ÓµËťR×í)i Č«¸©ÎOŽ™Ŕ«sJĺ9Ąs”˘şÍNMTđĚ×v¶¶únĄm*¨%Ďś‡ N3ú{Ôľ·¶ţÇY`đĺÖŻzÎDŽęD(ľŠGSřRçŇö}/cŽ«Oatštwď’9ŤdČÁaŰÖş/i¶š6±§\AfŃÁq\Ig#”çćLőÇoη®őŤ5|erÚ»[˝Ű"Ű[jś›=i:š&–äşš&–çšÖ¦ŁŁIc¤Řߵʹ‰v ĆůtúŠbßZ kí‡NÚn'ě›ÎÜcĎ^ĽÖďŠáÓĺđÎŤ©XéńY=ÓĘ‹}ÖŔäý)ą4ŃNM4ŽFŠę<#c§Ť3VÖ5X ÔV* ÜT;1ŔɇçSë6Úf§áA­iÖ"ÂxnĽŃ#–Vdź¨ýhçÖÁĎ­ŽBŠîŃôź蚅ΓĺĺÁ”îUHy8ę@ŔZĚńÎźeiuau¦Da¶ľµK9ŘOaúP§wkťÝ¬sTQZž´¶żńŤ­óě¶’L9Î3ížŮ<~5mŮ\¦ě®eŃ^âkK8Żaľđ¤¶(e‚îÝ‹`˙ cÓ˛ü ŁA{k©ßÜYI¨EAŞ1c±=qÎ*=˘µČöŠ×9*+·ńN‹đŇężŮ/¤]Ç8ŠX2vş‘ĂzsÇçQŰGĄh>ÓoďtÔÔo5rW*±˘śqŽüŹĎÚŹhšĐ=˘kCŚ˘¶ĽF4›‹ëi4ŃÇ:)’Ďî¤=TÔWWw‡tżAáŮtq“RÝ´¬{‚úŽ”9Ű ÜíĐóŞ+±Đ4;TřŠt›¤±É*íâXŚăđ«z|zą«§ÚéBÖK[y&‚äHYŰo7×#ŠD„ę$puutË–ŇS żdIĽ‚ۆwc8ÇĐÖďěôôҵ}cT¶űZY*,p!YăźÓó­-JćĘďáÄÓXZ 5mA|ČUË(}‘žÄcŠNzŮž¶GEwľŇ­˙áKű]5›ç™’XŮńä¨éňŽąëř×5â“fuűťq§0Aç[Íź•űíĎ8¦§wa©ÝŘ}ż…őK‰ěbŠ$/{ žd Éô¬CÁ®ĆĂĹŃ[_h“›yJéöŤnŔóČý+ާ.ˇ.ˇEUQEQEQEQEQEQEQEQEä’{ŃEQEQETö_ńôźŹň¨*{/řúOÇůPQEQEQE=ďü}?áüŞ ž÷ţ>źđţTQ@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEP]oÂÝ^ÇCńťĄö©?‘j‰ gŘÍ‚P‚z×%Ez—Ăoéš_†5}3Y¸17ďĚŮł˝HeůAÇ }k;áöą¦Cá}gCľŐ%Ń®/$I"ľŤşcĺ;yŹoĽkϨ J×ő­/‡w:%–ąsŞ_µâĚdž)xŔÎÝŮÂŚt'9Í\°ńn‰˙†ä’÷ i˘5śçĘ’R¸ Óž{Ž=ëĘh »_Ö­'đ‡„-,§Ý}§} Î›ye¤V^HÁÎ;f» WXđϵ8µ»Źjb˛!şÓcI7V ă¨đŻ!˘€.kÝj—SÚ‰…»ČLbgŢű{nnç·â{_ A˘é2h×7‹¦nă•H qĎaśŚxüĎ1EQEQEQEQEĐëZŤ­Ď„ô (eÝskçyÉ´Ť»›#’0xô®zŠM^Âjö:ę6·özZKć5µŠC(ÚF×G#źÂ®éwšE˙„ăŇuKů4ů`ą3$‚•\Óë\Ťą¬O"µ‰ďŁ‚Écµźí+’ě)Ľzŕň+®×n4~ kŮui,ď"µXšŮ­™÷2ч&¸Ş(q˝†ă{jvŢ­á_-ű:[0]Đd®Y€lwÁÁǵWÖ/4› IĽkůf¸Í7”c`ýë\ĺ¶Łumcug»mî¶ůÉ´ŰNG$d~R—&·dňjŰ7m|%®ÝŰEqo§ČđʡŃ/ ô=jžŻ˘j:?•ýĄjĐyąŮ¸»ĎCî*šU,ŽěŇ<ŽřŢěŘ铚ĄÍ}J\×ÔßńÖŁkŞkkqc/›‚4Ý´Ż r9«xGVMÄ·Ň«ćÁܤžQ‘]äŽ:đ®euĄŇßNYqfŇůĆ=Ł—Ć3śg§˝T¤ˇÝ‰SîÎŹĆ˝­őőŚz^óiaA¸Á}żĹŹĘ·µ CBÖŻÓT¸×.ěw*™ě’7$1…aŔÎ+Ϩ§ěÖěŐ•ŤKitٵ˙2ůnł^Cś>éó‚OsÓ5ŘYjšN‰gĺř†çS‚h(lšg¦Kp1ÓµyÝJ C”Ť/ ߦ—®Ů^̬ŃĂ f ×ńZ>'DwąľÓ5†ąži‹ý™­™ †$źđq\ĺÜu¸Üuą»ká-vîÚ+‹}>G†UŚyˇëUu=RŃ$·}FŐ .IŹqvÜgˇ÷ž&•@ #€;4Ź#ľ7»6:dćŹzú‚ćľ§ˇ]ężń §&ÔeŠmŃĽ–žCpÝÓ¦sŠĆ‡_¶˛ř.±i¬Ěîr ‚Qýs\Ą•4‰TŇ;¨nü= ĹŞ]išŚ—·7ĽĂä˛yAżĽO\qůV7†ő[=_·ą—d×P*B»IÜAŁJ]OC˛Ő4ťÎ˙Ëń ΧĐ4PŮ4.ĎL–ŕc§jÂđ†«gme©éš”ňÚÁz¨Vâ5$ÄĘr8ăü+˘—łVdű5ft~ m. 6;{=RëS»gÜň¶äŤWĐ)ę}ęőĄŢŤ¬řkOÓµ[÷Ó®¬ÂIä™ŃŽONý?*㨣“MÇɦć×çŇ…őşh°‚ŐZgśulźĄu77ţÔőË\ę3[λ$–ËČf,č0ĂŚp?úŐç”Pá~ á~§[ ëöŁâÖ/ŰŰ;ĘÄ•,T }Ş·ő;M?PÔ弗ËI¬ĺ‰ŇrĚFÚąş)ň pGQáCN]7UŇu‰šŢŢůP¬ę…¶2śŚĎ§ĺVuKÍ×Ári:móÝ\}¬LĚвůpHĎAĐrsĹqÔRpMÜw:Ť4gÓ˘oí›­TF"G ̲.xĆÜc·SIăÍ^ÓUş±[9žč[[žęDÚfo\ýfąŠ)ňkpäÖá@É4Sˇ‘á•$Śít`Ę}éTYÚüLĐôŻ ť'N±Ť˙´ľĚ˛ŢČ\X€ ä1üEqkTÔ.ő[éo5 Ţ{©qľGęp0?@*­QEQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQEQEhř{FĽ×őX´í9Q®e T;mO?A@ÔV®‹ _k7w–Ö(Ť-¬/<ˇś˝EePEŮ\|7×ŕŇfÔ]- ´0‡+:’.ăÇŇ€8Ú(˘€ (˘€ (˘€ (˘€ (˘€ («ÚF—u«O$6H¬ńĆe`X (Ćť Űq7mĘ4UëÝ.ęĘÂĘňtQŕc !qśŽÝEkŘř+Yľµ†{xŕhĺA"ţůAÁäf“’Z¶'$µl樭]s@ľŃD&ůb\…Ů ~ĎO­eSM=PÓOTQE (˘€ *íΙsm¦Ú_ĘŠ-®‹0$í8´ą•ě.e{h˘Šc (˘€ ($ÔÖ•ć‹{g­&•:(ĽgD –Ć9üEBş3h­k_ßÝj÷dk»%ĂH OëQĽ®(˘¶ô&áyýj\â·bsŠÝś­µŁxgQÖ ylVDĆwĘŞs€z­MŞřCVŇě庼H(±»)#$źŤń˝®ń˝®sôWC¦ř?VÔl!Ľ¶ŽŮŘZeRpHčO¨¬˝_J˝ŃîľĎ¨ŔĐËŤŔ#ÔÁ¦¤›˛`¤›˛e*(˘™AEPEPEPEPEPEZł°şĽ†ć[hŚ‘Ű'™) «ëUh˘Š(˘Š˝¤iwZ´ňCdŠĎfV€ÂŚgůĐÝ·vÜŁE^˝Ň,Ż'E^0Ŕ’ČíÔU¸'p˘Š(QEQETö_ńôźŹň¨*{/řúOÇůPQEQEQE=ďü}?áüŞ ž÷ţ>źđţTQ@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEP]ĎÁOů(Úoű“č¶®şż…úµ–‡ăK+ýRo"Ň54›±”`8POR(żđ_‡lt­GÄ7Vľ °Ôe}:áZŢĽ€•9<ôÇă\·Â˙[jV:έw¦ľŞÖ*‹obŚWÍ‘ł×‡­Rř­éúN·®ÜjT76ÄŰ·;2•Śŕőâ¤řyŻéöZnłŁksŘŰj †;¸T“ ©ÎpĽŕńů{ÓcÇ^ĽşčĐ[@Ô!ąÍl”‘á€íÎ?_jÎř]˙ Ź˙ŘoäjŻ‹eŃm´Hě¬5ËýoPywI;HQ@ł“ďźZ‹á¶·¦éWZ­¦´ňCc©Y=«Í–1çľ=3úP%nOaX?öŤu|!Łřö·†`•.Ú(ĺśČĂĘ/€/aĐ“śň}+ÍőÝ7A±–Í´-yµGy1"›G‡Ë`ĺş×©xŇ/ Çń!u=cW–ÎęÇĘ‘í|†q9P °éŘí@Gă-.=Ĺžť†Ţb¨[®ŢŁ?«Ţ'Ő<=}˘é0hşL–WĐ 31ŕgąĎ998¬˙j«®x—QÔŁB‘ÜL]ő ĐgßV‡‰í|1‹¤É _\Üj.™»ŽU )Ç=†r0 ăó(bŠ( Š( Š( ¶öq€iţÔ´řôýSIÖ$x-o•ť·–Ęr2'·ĺLÖÓ@˛ŃŇÓLęí&÷»1´atţzŐ}­nWÚÖćăh·şß‚ü-Ś%ń$áßřcCÉöë\÷‹˙ł`ľK "%ňíË’ăř¦~çé˙×ö«ňxŹěžđôZeŰ­í›ĘóFËĺAěŔŹ­RńŤÎ™¨^Ũ鏶K•ßsmµ‡—'|`íýiA4őŰQA4őŰS®»Ň¬´ČlĹ·†µtć…^KČÜł¶G$ŇĽâüŔog6i"[ď>ZÉ÷•{ď]Ć“>cwm{§řŽöĆÝ Ľ–O±cÝr89úä|E{Ł®_^[ˇH¦”ş©ăÔűž´éŢáN÷3«Żřs}iłgk.ť×2O”ą.CF1Їˇüë­/ ߦ—®Ů^̬ŃĂ f ×ńW5x´i5x´kx·T°¸ąż¶F‚Ţŕ\07+!,pÇ'9­™Żl,< áąo´őż“3ă‘ʨţbqÔôŤ`řž ŢćűLÖćy¦/öf¶d*’~cÁĹ7ZÔmn|' YC.ë›_;ÎM¤mÜّǥgËt‘ź-ŇKúЛƺeť˝îť>—†ßP¶IÖ"s°·lút®¶OYŮjPiKá©o,ČD›P.Ű·e†:žŐÇxŁT¶Ľ¶ĐE”»ä´˛H¤ůHÚă·#źÂ·µ CBÖŻÓT¸×.ěw*™ě’7$1…aŔÎ)5+"Z•‘ĆëöLÖŻl•‹,˛+¤gŚűâ¨T÷ňÇ5ěň@$3’‚FÜŘí“ÜÔ˛ŰSu¶¦×‚˙älŇżëá?ťWń?üŚş·ý}Í˙ˇšŹB˝]7Y˛Ľu,J®Ę:8­żÁ \É}¨ŘkN÷He[VµprÍ’7ôîj^’ąI<3omýޞÁáË­^őś‰ÔQ}ާđ¨Ľi¦ÚhÚĆťq›GÄIq%śŚ~Sź™3׿:şş–™©xkKµ“Z›I–ÉYd‰"väýá·ż×ÔÖwŽ5; Gű%tŮä™-íV&2) őĎSô¨Wć!]Čč®őŤ5|erÚ»[˝Ű"Ű[jś›=k—đí…·Ľ_@µł•‹´Q±;T.p őÇëW4»Í"˙Âqé:Ąüš|°\™’A J®éőŞÔmĽ?⸮˘•®ě˘vO0&ŇčA zuÎ=¨JÉĄ¸%dŇÜëB·Ôíu_Ări^D/-µÎćůŠôVĎ\ÖítĆĐ5ŰíRĐ\‹O)‘w9$ń‘Đ€j[Óˇ[[ÝÍ˝}~Τ[Ű*Ľ{Iţó Vv‰¨ÚŰxW_łž]·7^O’›Iݵ‰<řŇIŰîťľâţµ™©xA5‹ °¸†çěŇǬ6ç<ýGëO¶ŹJĐ|1¦ßŢ驨Ţj ä,®UcE8ăůźµfÁ¨ÚŻ€îtć—Ź|&XöžShÎ1ÔzÖ…ĄŢŤ¬řkOÓµ[÷Ó®¬ÂIä™ŃŽONý?*m4­ŇăiĄn—1ĽNt‰.á›C RÄX?ş~ę ę+~ҵ k—čĐYĎd‘‘$f$łßéúÖ‰$ŃŢöŢmbŤRIŘĘÝß§é]&—˙Í†Ź«XÂFdűzĆ»ţĂ Ů´“ÓľsíN_ Ü%đ­ÎoÁşTz×­,® –}§€ ÇăŚWbúľ§k¨Âţ“Jň!ym®w7ĚW˘¶z湍úÇĂž,·ą´şkű(řiF2C) }3řâŻ^ť ÚŢîhőëëöu"ŢŮUăÚO÷ő”îŢ‚ťŰЇŔe¦ˇ6 ÷Ë{q;ŕ´i6 [ëíÇçLńXµ[(Ö_ͤj!ř+ź*Dü{ý*‡†—H‘îVş¸˛—ŰÜÄ nů“Ú·ŇôíoĆŮÚýˇ4Ö%±)a ą ‘Ç$~TɵVđp—ý1oŚĆ=§„ŘFsŚu>µ[²hž µľ™YáBUÂőÚALć˛Qi;¨´ť·:K%ĐĽHş••ž’¶3AĎo:HIm˝\Öw‚lôéôírçTµűJZB˛*î*s“Ŕ#¦pjýµ×‡|>šŤŢ—¨Ë{ss ĂC'”Ôž¸ĹcxoQµłŃ5ű{™vMu¤+´ťÄÇŽ˝éYŮÚýggkô-ęrhz§†f»µµ·Óu+iUD .|ä8ňqźÓŢą:(­b¬kŘtëę+ŐuíÖ0^>Żg ÂxZľw’6ŕ}N8ú×”ˇĂ©=®·^Ö,nľ!A©Á>űž2laÂíÜpF{ŐM˝<ČšméŮ™^4˙‘łU˙݇ţu©ăůü+˙^ŻüĹbřžęßę6Żľ fgFÁúj÷‰5[Í@·¶—|¶°2L»HÚIr9ü(ł÷®Iűż×C#H˙­—ýwOýVÇÄ?ůµ?÷×˙A‹§H°ę˛Čp‰*ł@ÍhřĘößQń5őÝśžeĽ¬ >Ň3ňĐóÚŞŢđíďÜéćŃgÖ< áÁo=¬>WžIžP™ËöőéYţ:ş·v‰¦GwíÍ”L&ž6Üą8ÂßţUCZÔmn|' YC.ë›_;ÎM¤mÜّǥsŐ‹Ýů“˝ßVß‚m ľńE…µÜbX$f ‡ˇůI¬JŮđmíľťâk»É<»x—}¤ăĺ# ç˝i/…Řąß•ŘčíßĂ7··úDş|6 CzóĹÔŕž9ëŹÂ¨xF‚ö×Sż¸˛“P6Š‚+Tb<Çbzăś W5¨Hł_ÜÉĘ<¬Ę}A&·ü!ŞŮŰYjzfĄ<¶°^޸ŤI12śŽ8˙ ÍŨčC‹QĐĐńN‹đŇężŮ/¤]Ç8ŠX2vş‘ĂzsÇçL‚='Dđžť{{¦&ˇw¨´źë$*ăŚwéůűVwKMŽŢĎTşÔîŮ÷<­ą#Uô zźzżmw˘ęţ°°Ő/ŢÂëOgÚŢIHŚrqŽý?*ZŮ_k“­—křÖĂOµ›Dm2* ›T”‚I-“ßß˙é–vߢ°‚K3=ş†q† ‘řäÔźZ<>Ö{„Á [şííź|VŚú‡†µ-rŰÄ7:ڶ÷ě’[/!´‰Śaşc˙Ö¤›˛~ ›I?S* Öűâ4ÚP_*Éf|ŞŠ śË¸úľ§k¨Âţ“Jň!ym®w7ĚW˘¶zćąť3ÄioăvÖĄ‰Ľ™&vdŚüĆGĺWoN…mow4zőőű:‘olŞńí'űĚzCRş )]řL´Ô&ÔâŮon ‡|Ť&Á+}}¸üéž+«eËáů´ŤD?sĺHźŹĄPđŇé=Âj×WRŕ{`Ťß r{Vçµ{%đ˘é1ęÓk&q/ť$l˘% -É˙ëš§~q»ó—üŞX WQ¤@ŢË37Ň09Ϧ}«ŚÖďí/䉬´Ř¬A ±ąmŢüÖ—5+?í;MNG†ŢúŘĂç"–Ř}p+3ZµÓí'ŤtÍDę•Ë?Ńm9éÖśb”ă¤ÎöďJ˛Ó!łŢţŐÓšy/#rÎŮJó‹ó˝śŮ¤‰oĽůk'ŢUě˝wLúŤÝµîźâ;Űt*ňY“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQEQEQEQEŞĹX2śr*î·«ßkšŚ—Ú¤ţ}Ó€ö*ä€:U(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ÝöŁu~–Éw/¶Ńb@Ú ŕsřŐJ(˘Ö¬QE (˘€ (˘€ (˘€ (˘€ (˘€ (#­QEQETö_ńôźŹň¨*{/řúOÇůPQEQEQE=ďü}?áüŞ ž÷ţ>źđţTQ@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEPZ>ŃŻ5ýV-;NTk™CŰG“ĎĐVuw??äŁiżîM˙˘Ú€*k_ß3ĆŻ=łýÄ™ĺA=GÓŽ+Ó#ÝęÚĘ4µ&žvé UAß“×ńď@EvŢÓ´˙|FŽŢ+E±Ň¤f"#‚#E$ úś ýN+¶—Â֚ݞ­k'äĐţĎËezüĺz+ç×ßŢ€† ÔMˇĽéÂakĆÁ67ôç8ă®k ń˙ü}é?ö ‡ůµ sSŠ{5ŰţrÁÂMnĽÎ^Šé<-ecýťŞjşść+0 ÜT;1ŔɇçSjöúvŁá«ŘY‹˘¸K9e`FAúŠnşSĺ·[_ĚJqćżťĽŽVŠë<;żöRËsŞŢ3îęDH=ަŁń~ťk¤ęÚ|đÚŕž$ťí$cňśüÉžľÔ,Bsä·ä7A¨sÜŔ{”°Žő˘"ÖG1¬™,;zŐjô;­[O_YÜ6‹@×L«oć¶ŕüŮë\ľ‘cżâXႵ·‘·˛+dF€dŕźóÍM:í©JjÉ_đJ 8ĆíŰń(Üé—VÚuµěę©É",°ÜŘęq×J»˝~ĘŰÄwW ¤jqJöqb+1@#_î±ŕţ^•‘ŕë<Éő}D iŕ9_ůé'đŻçý(†#÷nRß·®Črˇď¨Çn˙›25M.ëKxRő9%ŚHp,é‘Ú­řGC—Äž!´Ňˇ•biÉĚ„gj€Xśwŕ*MfťBÁüCs2±¸ą0ůx9^2?+¸řKáĄ]Óu±¬é“4qI/Ř ›}ÉĚl6ěěy­©IĘ:ďÔƤTe¦Çâű NÔVßBżžůšIcهŚQS[ř3ZžŮ&[xŐ¤]éĘ«#P¤ÖT’ ťu¤1”YnKĎ`[ˇ®×ÄV¦OÝj?ÚG-­ĺĽin[÷ŚNTzrZŢM]śuŞĘ2QŽźŇ˙3ϤGŠFŽE*čJ˛‘‚ę)µ»ăĄ âíP(Ŕósú ¨’ł±µ9sĹKąoJÓnő[µ¶°…¦•»€z“ŘSµť.ëG˝6—Č©0PÄ+>â–ËVĽ±˛şµ´ĹÎß4Ż @Ďě9­ß‰żň3˙ŰĽĘŞË–ýLÜ檨˝ť˙C”˘Š* ÂĄ´¶šîć;{hÚI¤;U©5u_ ˙äk‰ż‰ačvš¨®f‘ťYű89.…]GÂ:˝…ś·2ĂÇ2ĄW1˙ĽsőŢx2Ëěעo·Ăsöű ŢX‘˛ÉÓ‡÷çô5ÁŐN)$Ńť’“q“˝ľA[ş_…u=NĆ;»U€Ă&vî™TđHčOµaWCŕ‰´‹m[íŰ•XĆaĘ]ůęŔzuĄ›ł.ł”`Ü7ôąť­éz-âŰ_˘¤Ĺ€¬‚Híô5ź[ţ7łĽµ×KëˇvnPOę0LÝ:V)+;”ś ¤ŘQE&…ýG˝Ön|ĆEÜěHUQęI©µ­PŃŇ)/#SĽ$±¸tcé‘[^]Ţ×UdXLłŰÄŇ€¶9>śš±uh,Ľ¬Y‹¨®ă·ľŹd±ś©%Fqůăó­T)ČëÉT·KŰňÖ˙3˘ŠthŇH¨€ł±ÜšČë.YéWWvw±"‹kP ŽĚdôÔűUôťSLÓŁ±°đŔÖ#´ąR$™<’ÂYqą{~Őçúť”Úmüöw ˇb­‘ő¤áĘsŃ®Şßđô+QE™ĐݎřwSÖöźn^4ęěB®}2zšČ®ÇŔšµĺÇ4M=ć"ÎÝźdKŔ$«źSÍ\nĚĆĽ§9CˇČKE+Ćă ŚTýE6¬ęň»˙®ŻüÍV©f©Ý\(˘ŠC4ôM÷Z3 ň±»|:ç~†§ÖĽ3©hÖ‘ÜßGĂ#ěVIdŕžßCYúX´mFÜj,ëgĽyĄ;}«¬ńäbóOłÔ´Ë¨ćŃPýž(Q y Ž„¤ă­h˘ś[ęsN¤ăUFú?/׹ÄŃE™ŇQZľŇŽł®[YçllwHŢ9?çŢšWvDĘJ)Éě.´««]6ÖútT‚ä‘Xn`:śuÇż¸Ş5ßřŠĆ×Ä×wŁę±JöPí†ČDQDkýÖ'ňô®ŞqĺzĐ«í#®ý‚Š(¨6 č­ü­Ďl“-Ş©uŢ‘<Ş®ĂÔ)?ΰě¤HŻ ’UÝH¬ËęäWˇj:ö±ă(5]6îlĄ’9#ťfŚ2»sśŚ1őďZB*G5z®›I4·ŐţGśËĹ#G*˛H„«+ GcM­Ż\CwâťJklڏt$ üH&±jł±Ľ$ĺ'Ô(˘ŠEz7†5M^Űí±"Á»h’Wú ő¬ýSNşŇŻÖţËÎ9 ÷vŤK^M7G„XIXQWĎRÇúýk_Ć—0Ükúe”r‹Ź°Ĺ¬ł}ÁůżĎ®kNX¸ÝʤŐNY[ŻË·ŢS·đfµ=˛L¶ń«H»Ň'•VFˇI¬íÚÁµíőéçł´–gŤ7:>¸ŘřŠÔÉă;­GűB(嵼·Ť-Ë~ń ĘŹNOë\ĎŽ”/‹µ@ŁÍĎč)Î - ˇZSiKŞż¦ßćXń׆SĂWö«mx/,Ż [›y¶í%LŹóÖąŞőßh â-ĂZ“ęşn’LŽ1m8Ť›nNäësü«Č«#¬(˘ŠWmĚX÷9¤˘Š(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(®Żá~­eˇřŇĘ˙T›Č´Ťd &ĆleÔŠĺ( QѵřFMCTÓő«ŤcR–"Š´xPnţöáý Äř{­iVúfąˇëóIme©Ć€\"ňťI 9î?*âh ˙ÄÚž‡Ąř"? ř~ůő)%şűUÍ×”c\Ś~ץX°żđç‰|¤éî¨úMţ–Î#ŔdY#c’8ď€>ťëÎ( ›Ć—mFÎ BÂŇÚ%I.X0k‡îÄźď]®©ńŃ>"Ďs Ëßxjî·¸‰•öm*Ś űr3ë^IEvšŻĄřOâ*_i· {Ł#˛‡Teo-ÔŚa€9\ţ8÷­}Fo ŮÚęQř§TŐ ¨ÂŇĹ<ŘŠ1齏P?=kÍ(  Żj±hž)Óu…f†ŢPήÜ`ăó­ŹÚřfY/u=Ä]Ý\Ü~ČÖn›C1'ç8f¸Ú(»đŞřrM_^ř{\F"i]’UĎŰŚqާ®x¦|Tń†ą{ĄÇ§\I{ö+a —˛&Ćť˝pp}˙\=Óé¶ľ_O}}sń §c1Ű<ääcź1EW[đ›ţJ‹˙][˙@jä©đË$¬ČńČ˝ ~4Ńř÷BÔôŤrîăQ´x!»ą™ŕf ďł‘čĂó­_„zĄyâť7T¶´y,-®vË0#výsÜ~uĹÝ^]]íűUĚÓíÎß1Ëcéš[kűËT)kuq ’±ČTëÁ  ţ0˙‘·[˙Żé˙ôcTňęÍŕtń'úZŢ™Ś{OÜŘFsŚu¬'v‘ŮÝ‹;–'$źSIS()Zý5*3q˝ş…v7óhZőľź5Ţ«%…ĚÉnń›fąäő5ÇQSRź;Nöh¨TäMZ靆u ¬ő=/T•⵼ ¶uBŰNA#ݧĺRę÷şe—†ĆŹĄ\˝ëI?ź4ć2€?…rôTş ˚コ\Ą]¨ňŰĘţGfş†ť¨xwM¶“W›K’ÍJÉÄĚ$ÉűĂoŻ©Ş3ÔlŻ˙˛×OšI’ŢŘDĆE!˛=sÔý+›˘”pńŚą“ďřŽX‰J<­vü§MşŇŻĽ1—©^˝Ś°\’A 0#¦ÖŞh:Ť®‡â&‘dk«4-"©Bčxȧ®+Š~Á{Ęú>‚öĎÝvŐu;>} Ăň\_XjRß\´lCäŮž2ÄđqXş7ot‹i`´ňLR6öFźĆ˛(ˇPŽĽÚßż:ňÓ—Kv:­oÄ «xR'x…úÝď1ÇQłi鎦§řC$1|DŇâAnÇqŤ€‰ WE]:q¦­*T•GyŚ4ŤO@ń§S¶ň$–fž/0uŢpFJŰ»ąđ槭ŮϩËnůI%˛ňşŔaĆ˙Z¸‹‹™î ›‰¤”¨ÂďbŘ5mXç©IMŢö/k·˙ÚšĹĺîŇ‚y =‡aůUív= 4˝5´‰¦{ÖOô•pp¨őĎJâ—6ăöiZÎÖ54K=2ífţÔŐNžWŮÚ]ýsÓ¦8üëÇ3hz¤˛ęZÁ’ĺcDKoł8ÝŚwĆOá\eÔ¬­beJóSćzz‘Ű|5ĐtÍN=oQ×ŃßNÓmĽĆTr¤ąÉŹe#⸧ »]ŞN@ÎqíW Ő/môËť:‡K+–Vš!Ś93ůU*`­Źę±čÚő˝ÜčĎÜ’뵆8ţuŹE4ěTââögig>áá}w§ęr_ÜÍ ĂoÉłwv'®+“ÓEłjÂýť- ‹ć˛Bçś~^ŠnW"ąo«mő4üHšdz´«ˇČňY`m-ž¸çç­d<;©čÖŢÜ˙eß[îH°®x„tŞ”ů§ESw»}>Gkń3CŇĽ6tť:Ć7ţŇű2Ë{!rAbÇńÄU­SP»ŐoĄĽÔ'yîĄĆů©ŔŔý޵Á]?°ôë»N÷Z1\ĆX˝·Ů]±ÁxqĐćą *Ł.Ws:”ý¤yoccÄi‘܉t˝LßyÎí ň//G^ąÉü« ţÂҬ~&µ}ľ«}rb´;Č  ŕśwű­ůŠáęíî©{{ggkupň[Ú)X#8Ä`őÇä)7wrˇUkÜĄER(ßđÜş<–—¶:Đňm¦ĹŹyČŔçüjŢ·}¦Yřj=Hą{Í×hšŕĆQIĆ0çÓň®VŠľ},bč§.fß{t;o†ş™©Ç­ę:ú;éÚm·ĘŽT—9#‘ě¤cÜWäb«µIČÎ=ŞäĄíľ™s§CpéerĘÓD1‡#¦*ĄPlłáZ=ZŽâáíŮZ)BőÚèý+ŠiŮÝ8)ĹĹěÎ×N¸Đ<9%Íţź©ËtŃ2[Ăä4{7q–'ŠÇđ6Žş÷‹4Ý:PĆĄĚ pv(,Üö૚N©{¤]ý«M¸{{ŤĄ<ÄĆ@=zÓrą0§ČŰ˝Ű/řŇ-6ßÄ÷öú$e, “ĘLąbĹxc“ęsřV%““EI WKˇjVz6}<nÖ®q…?ąŚőlă>ÇÓŢąŞ*“¶¨‰ÁMY€ś’k·ř™ˇé^:Nťc˙i}™e˝ą ±AČcřŠâˇ‘á•$Śít`Ę}éV5MBďUľ–óPťçş—ä~§ô¤˛­Q@׆o4; Ľk«}VąĘÍ7ŮžFDÉůT‘ś˙LsZµľźaqnúN§ýˇÎć&‹acŻZʢ­ÎęÖ1ŤY9]ëéţW;Ë»źjzÜZěúś¶ď”’[/!™‹¨`ŕő«ťš;Ďx˘q¦Ű4·7r3Ç OSÇV-> Ą·”IŹŁ##ńJ|ÁNЦď{ôůń™D:†k+§Űm´¸ˇ¸ŤB0ĎĎô®gŔÚ:ëŢ,ÓtéCf—2ÁŘ łsŰ€k ÝťË;brI9&­é:Ąî‘wö­6áíî6”óőëPl_ń¤Zmż‰ďíôHĘXA'”™rĹŠđÇ'Ôçđ¬J'&Š(˘Š(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( wgbĚrĆ’´4´éőXcÖ®f¶°;ĽÉbMĚĽ`}qZľ:đĘxjţŐmŻĺ•ä so6ݤˇé‘ţzĐ5EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPA‚0Eé\É+ąŕ±&›@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQEW®řË@_hŢÔźUÓtşdq‹kůÄlŰrw'\źĺ^]¤i—šĆˇŽ›Ou.vFŔ$ňxč v˙”C¨h6˛ş}¶ŰKŠĐä# ńü˙JóĘ+wŔÚ:ëŢ,ÓtéCf—2ÁŘ łsŰ€iľ4‹M·ń=ýľ‰K$ň“.X±^äúśţ‰EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSŮÇŇ~?Ę ©ěżăé?ĺ@QEQEQET÷żńô˙‡ň¨*{ßřúĂůPQEQEQE> Ą·”IŹŁ##ń×vw,ěY‰É$äšJ(擪^éjÓnŢăiO11^µLňrh˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€X†Áµé]Ą•äĽÄ±úšmQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP]÷Ž<-áß ÚSSľ“Xhcš8Z!±ś°›ż*ŕkĐ>6˙Č×i˙`řöj`ržH¸żdńÝĹĄ§–JĽ ˝‹ä`cÓ­?~µđÖłmkaq5ÄÚĄČy@ ó㏠®^˝ăGü‡ôźűAüŢEvţÓ ˙„a/­´”Őď^fYQźýRŽź(ëëřÖą%ŚzĽ[é“ZÚg´ Čđk×S“Š[zJŚT›ßÔÎ{”°Žő˘"ÖG1¬™,;zŐjô;­[O_YÜ6‹@×L«oć¶ŕüŮë\ç‡c´Ő|alŹh‘ÚLç÷‰mŇŕđl:KlמbŮÁ [Ë•ČůŹa‘YŇčpßxľ˙NŠňĂL†7}˛]ËĺĆ?w<ó]7Ä[AŁx ÂÚ@š;ĐŹ<ÂňÜî…˛ÄíVď÷żJŢ2抗s G•µŘŕôŤ.ëVžHl‘YăŚĘŔ°QŚ˙:/t»«+ +ÉŃDŚ$0$…Ćr;ukÂúşč··Ľm –ÝáOBŘÁý(ŐµuľŃ4{Ť•ěVEf'†ÜŔŚ~•ĺÍägysyôWĄXéş1M*Ň}.7{˝3í2LU'ŹLŕţ•Îř¦ÖŇm/AÔ,-#´{ĺ‘(É+”` óő©Uv¨›µŽ^ŠőI<=ge©AĄ/†ĄĽł!m@»nÜq–č{W*Úř{Ä—ö÷VI¨A 4H’ą^ŕ†ČďŹçDj)l¨Ą±—¨X]iÓ$W±¤t($©čx§Úi—7Z}ĺě(¦ŢÓošKFăÇzîüw«iÖ÷Öń\h\HöhË+JŔ 9ŔzVo‚$¶‹Âž%’ú=ş˘ ·yÜp2:qKťňóXJŁĺć±ÄŃ]†µ›©xA5‹ °¸†çěŇǬ6ç<ýGëO¶‹IĐĽ1¦ßßi«¨Ţj ä,’TE8ăůźµW>›źMŽ2Ą´·’îîh@2Ěëq’Nt>1Ҭíîôéô´1[j0,Ëůdőôé]$ŁBŃüY§č‘éa¤†Xsyć'vqĐŽFGżµ'SMÔÓDp2é·1jÇMu_µ‰D;w n'ĎÖ­ÜřwP¶‡Q–XĐ%ŞNC‚ŘĆ=zŠ·âKiăËË’ ŢůđŮ©őÇwkâ– űNhäBHůśŕţBťäí`Ľťš9j(˘¬Đ(˘ŠŰ·đľ©q=ŚQD…ďa3 ”9>•x5ŘŘxş+kíso)]>Ń­Ř>bAĄdř3J‹Zń­ťÁ"ÜĎ´ŕ8üqŠ…&®äf¤ŐÜŚJ+±—Rđơ íłé‹§lF6·1ł;3†;ű˙őę·„ltń¦jÚĆ«şŠĹP$Їf8#đüčçŇíźK´rôW_¬Űišź…µ§X‹ á¸óDŽYXF~Łő©aŹIĐü)¦Ţ^鉨]ę%Ďď$*ăŚwä~tsů źMŽcQÓ.tčíéUVę[0ËŘF" rBž€šč$đőť–Ą”ľ–ňĚ„Iµí»qĆXc íSí,“bö¶IłËí`’ęćx@2Ęâ5ă$ś ÓąđîˇmŁ,± KTś‡±Śző_@şŠž0ZDłş}YU˛?V–Łâxîí|CÁ"˙iÍI SśČU6ô¶Ĺ6ô¶Ă| ŁhÚíăŘęş”Ö7“:Gi˛-ęěsĂzs·¸ëXÚî›.ʬ^iÓ˛Ľ–Ň´E—Ł`ősÁ7eń†Ť7’Ól»‹÷i÷›ćŹzę>(xalőŤcT:Ţ—3Épdűźý!w·BžŮü…YgžŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETö_ńôźŹň¨*{/řúOÇůPQEQEQE=ďü}?áüŞ ž÷ţ>źđţTQ@Q@Q@zźĆ} S›P‡XŽŃŰM†Ćyň0§$cĎVťyeZ›Qľš ×—2Dp 4¬Tţ  ´MP×/×I¶{›…C!E  €O'ÜWeń¶6‹Äš\r.×M.`{_5Á[\Ďk!{i¤…ČĆčةǦE73ÝHći&p1şF,qé“@ú"é akÜéZ’±áY•×NDާMşŇŻĽ1—©^˝Ś°\’A 0#¦Ö©řzâËJńmĽÍuľĘ÷ţ[ ĂiíäÖ{i+»;ţ!íťâ쮿B{ů[ë‰#9G‘™O¨&®hÖzmŇĘu-Pز‘°}ťĄßëÓĄfQZ8Ţ6NĆjVwjçcă94MVęçQµÖ NQB[ý™Ćâxŕ ĚŐďí®<1ˇÚC.ë‹o;ÍM¤mÜŮăđ¬+(PPQWnŰmÚÝŤ']ÉÉŮ+ď÷Üßń6Łmym˘­¤»ŢÚÍ"“ĺ#kŽÜŽ čm5]#Yńť|öWżÚÍ$jʸňwňzđ9ü+ĎënŰĹZŐ­śv¶÷Í®ŐQd®3YÔĂŢ)CĎ­·ůSÄZMĎËĄö"ńqÄú¦?çá˙ťw7ZMć·đ{@Dbëě3\ItŞę/™Ź źN^bîŇ;;±gc’IÉ'Ö¤‚ć{pâ ¤8Ălb»‡ˇÇZé„ybŁŘçśą¤ĺÜŠŠ(Ş$îíőý5/tYç oĄµ´§Ëo–B¤méĎ^ŁŠÄŐµ+yĽ5áŰkyw]YůćUÚFÂÎ ňFµsôT*ijB‚Nç ę†…­_¦©q®]ŘîU3Ů$nI c ĂśW ,s^Ď$A9($mÍŽŮ=ÍAE8Ă”#Sµ×n4~ kŮui,ď"µXšŮ­™÷2ч&˛ôMFÖŰÂşýśňíąşň|”ÚNí¬Iä Ćąę)(+X,¬t0j6«ŕ;ť9ĄĹăß –=§”ÚsŚuµˇiw˘ë>ÓôíZůôű›}’y&Etc’8čz~UÇQC‚t~/Őí//,"Ň·µ¦źĂ¸Ár;ăň®†ďPđÍ˙mŐ“Dń­ôĘĎ ®®ŇČúg5ŤE&®¬ÄŐŐ™ŘË„ôřŻn"˝}NIQ–ÚŘÂńůdô,ÜgSÂZ–źźŞi:ÄŹ ­ňˇ˘–ňŮNF@äöü«™˘§“K6O&–lëu«í*ĂĂEŃîžůĄ¸óć¸1×€?ARŰÝčşÇ…´űRýôű­=źky- ‘äăú~UĆŃG"¶áČ­ąÔř×TÓďdŇ?˛%gŠŇŐ"Ă)H<‘Éúq[†ˇˇkWéŞ\k—v;•LöI’H°ŕgçÔQěŐ˝š˛'ż–9Żg’ ‰ś”6ćÇlžć ˘ŠłC˛řUŁj:Ź‹,/,-üË{丰5ÉőöĄexîHfńž·-´‚X^îFW ĺŽqíšÇŠćxc’8f’4“‡Ub}GzŠ€;o†ş™©Ç­ę:ú;éÚm·ĘŽT—9#‘ě¤cÜWäb«µIČÎ=ŞäĄíľ™s§CpéerĘÓD1‡#¦*Ą@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPJîÎĹĺŤ%^Ń!±¸ŐmâŐ®ÖÉŰL‹¸ ÁÁÇ~q@h®‡ĆźĂ“[8ž;Ý>í<ËkČ‡É ţ‡ŰŢąę(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š‚IŇŠtŤľF`0 'µ6€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( Š*Ţ‘§]jú•˝…„~eÔíµ dőęh·ó çŔďß ›-[dGĐ˙čfĽö˝ÇOmáďéľ‚ć;‹őśŢ_4G*ŽA3߯ţ:=kΨ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š)đË$2 !wŤÇFS‚?eQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQO›oť'—÷7żJeQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@WMđŇĆŰRńĆ•i Om+¸xߣa˙0(™˘˝^Ö_ęZž­áűŤ&×JŠ*ŰęR\ጊp -€3×ÇlVOÂ˙[jV:έw¦ľŞÖ*‹obŚWÍ‘ł×‡­yőę:đÜ ŕĹ×F‚Úˇ Ȇk`ĤG nqúűT6°č>đ‘¨ęZ,Zµţ¬ňK!Q)ÇĘ@8==ůö 5˘˝ âF—¤YÜř]ô[A­ĺ¤s’K‚F gľ .Ń´űO‹öÚ]µ¤qéíuj†ű¤6ÍĂńÉ =˘˝ XęźntEŹÉÓRwfŽ3Ś"®vŹ©Ŕük§—Â֚ݞ­k'äĐţĎËezüĺz+ç×ßŢ€ŘÓć¤ńęئ™\xNă@ŐÄź+'ú‰¸ÉďôşĐ!§iÚ•˝ěöVćX¬ăóg`ŔlO^O=JŁ^Ĺđă\ÓÂÚúŻ‡í‘¬´ĐnJÓ0CqĆp}zלř›XÓőYí¤Ó4K})b:E!q!ČÁ9€6l~xšóNŽî;H“ĚMńĂ$ʲ8öSÓńĹq×0Kmq,´sDĹ`©őýJ;kz˙…µČ­5čc]ş}É ÁÓź“<ř{÷Ż;źQ¸¶ń„מ'±[뤕ľŐm(‡lÎŃε&±á©tżézłŢZMřĘĹĺăă<Źçčk˝ ÇpéW>đöł¦i0i˛^K2şDŸV*9?Lţ5ĎxCT±Óćš+Ýf[†E…$rĄ<Îr?*稯Nř©…¦iúE­Žż!Y®ÝËä-ÜśŹË雞đÔ ÓuHĽ2Ţ!Ôuvug! ŚN2ÇŇ€<–Šíţ*xv×CÔ´ůě-¤ł‚ţŘLmdbLüKĎnź­qQEtţ'Ő<=}˘é0hşL–WĐ 31ŕgąĎ998 bŠŢđŃđČŠřIWW2nWŘ<Ľcľíýţ•c^o9ż°S^ۆÓyĺyxć€9š(§B•ä€E{¸ľŇ˙„‡IÓ—Ką·şÓÁ–GdžťGë].—¤x}˘Đě.tXd{íírÜ`á•sǡ<óô¤ë¤Ż`ycVţR¸?­7U+ż+Ëi¶7:•ô6v1nf;Qqüx¨®`’ÚâX']’ÄĺOfWuđ“S˛ÄSi0Ďw-ÁhďČh†Ţ€t=çU|w­éwWzťťż‡í­nÖéÁĽIXłç'Ç4{IsňŘ.Šô;Ht? x7HÔő-!5kýQ¤`˛ČUcD8ăóČüý«/â6‘§Ř\é—Ú4m –§j·+ |˛z€OnEŞś­oéČUí;JşÔ-ďfµUd´‹Î—, ę=jŤuß?{w¬Ú—:dčżţµsvWCJîĆXđΦN”<ĄÎ¦ ¶ůÇÍŚuôę+4ŮČş‰˛vD”Kä–fůAÎ2O§˝{%”J÷úM÷t‰D$ú±«0kËtŤ^ÎÖćîmGJ‡Q3¶ŕ$®Ă’N1ëźŇł…G+•(¤Wńú&¦öRÜApʡ·ÂŮ^{}j -:îú©ma2GlždÄ6/Ż5ąń"Â×MńTöÖ¬,hB/@JŚ×Kŕ}[OmYQ˘Ŕ­m` íćôśwzgŰÖ››PRZ‡*ć±ćŠ 0©8«šÖ—uŁj2Y_*­Ä` Á‡##źĆ­ëŤ–ŁwlÖ\ZrˇĂ,n[=yŻDń=Ţ||4Űí.¤»hŁ–áä!°BĐŹ~iĘm5 ”S<Žşřü#—…¶|A¨ 'ą‰ÚÂĚ&dśň“čąÇŕ{Vż§¦ťâ+ŰآśĆ¤őŰž?Jë~8ĘÇÇ/n8†ÚÚ(ă^Ŕc?Ö´NęäžEwß ´ý"çGńEć·b/#±·I‘w9ůŽ3€3K­ĎáťwÁ7…•Ť¦Ť¬YΨ¶ŃĎ“¶đßÁáůĺ޲Áµ—Ě÷=TńŘâ—3ć°YZç#Etţ °µ·đw†îŕ…RâäOç8ęř`jţ«ĄXĹ{ŕÔŽŮo ®Ďď 0É?ZŻhżŻ ĺ8š+Ô5(tHui—A·c¦_, ľcb@ÜßNp>•VK·ńţże-˘Íemfó¤EÁÚŤÁëüDTŞË°ů9˘˝WN°Đő­ěX"mbŇFfWoܲ‚đţ^őÇx*ŢÎk›¦şŇŻ5YŃ‚Ţ; ząŇš¨šz ”ćč®˙ĹÚ, áDŐż±›F˝ŽŕC$;]HČ`ůëQÚ&ŤĄřKŐo4ďŻ%žHŔw*¤yluŔcŢŹhšşAË©ÂQ]WІГé–Ź";„\X‰wŮHĘžŕă·JÓŐ<-osăm*-2=şV¤‰p›z*—ýE?hş‡)ČčÚMޱq,(Ż,q4ĄK•Î=O=)4M&ďZż[;W©o™‚€ä’k¦Ň5;;/‰±O§Dićăěę©÷Jł?‰ů«GM˛˙„rO^cgŮPÚ@ëŁ|¸ü6źĆ¦Shj(ó˘0HČ8ô˘»/č_ZjšŤÍŚš‹YŞmó‰ëŽp1üęß‹t8O…×W;hבÜeq*ęG éĎť7Q)r‹•ÚçEw±i𦙨_i‰©_j,ä,®UcE8ăůźµax¬čŇÝÁ>ş8Ą4¶ě÷2wPOQMNîÖŤ‹ľđ™Ö­®µBő4ÝÓk©vIţĎ?¨®zůmŇúálťäµYDî0Ě™ůI¸Ĺw~%sođÂpGÂ\O<˛cř;źŔţ•çµb (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( ş?‡:•¦ŹăM2˙Q—É´…ČűKc(Ŕp=H®rŠą­Mα<-ş)g‘ѱڂÄÍuź5ý>ËMÖtmbî{mAPÇw ’au9Îś?/záč ×Ųč¶Ú$vVĺţ·¨<»¤ť‹¤( ŮÉ÷Ď­iY_řsÄ>Ňô˝sU}.÷JwÚţCJ%FlŻ8˘€=+ă–čž“NÜ-WMFxçgsďŚVµÖ­ŕÍgĶ^-ĽŐ浹„G$ÚŮŮ™ĄLmĂ1Ŕü‡JňíSXżŐ!˛Šţ6;(EĽb®ÄgęyŞŔí´_Gkń2OĎ‹Y¦Ľc–6Äp ŐÔfđÍť®ˇuŠuMPĘŚ-,SÍŁ›ŘőđăÖĽŇŠ@tŢ ]G»Ź^˝şÓ®HSi{b"ns¸/>ź­tţ/ń™˝?oZĺf2ÄĘ!P:ÜźĚő=+̨ ĎáƵĄéĂZ°Öć’ÚÓS´6˙hD/ĺžyŔ繬Ťv×FÓ/íFŐ?¶`ywŰ4 ~é ×"°č RTđ úŐ®żm¬ÍĄ¤N“6š¶ĚY]pp¬1‘ďר®_TľÓĺË L&R ( •^çó®VŠő}Hř.÷ÂZ>†|\Čş{Ęâoě鉓{éŽ1źSY? ď|7ŁjŤî­¨,7‘|–Élň¨ÎA“jŽ˝8$u5çÔP[âŰ=˘žţËĹRęú”˛îxŢĘH‹g«nn? ŢŇ5˝'Yđn™¤jőÎ…§3„™#vIccś¤r8ú{ךQ@Ťî´ąőbŃ.Żo-á+\ÝHÄĘýĘ÷Gµs´Q@tţ'µđÄ.“&}sq¨şfî9T€§ö9ČŔ'ŹĚóPAáŹjžŠxô¶€,ĚüČUů™«> ńÖµŻi­c¨=±·f Dp*ŽśŠĺ¨ źúř˙ŢΙB’¬ę9íž2‹Ă ńűGWŐe´ą˛1I%·Î&*”«ťŐÄé%łŠkŻŢ±¶˛k‰$$©bŞU‚ä('=:W-¬ę·şÖˇ%ö§7źu źh\ŕ`pR¬!BŃ´źKoW™.5[١mŃÉ;şśc ±"şëT:VłˇëňÉoe¨Ş¸D/ĺ:ŚÉíů{×Ek()G”ëÄ:–‡¦x0xwA˝“R’k‘sqtb1Żyě?ZÔ˛ńNŹ˙‡¤{Ě%¦ŠÖ“)ţYJ§<÷WŃQěSVlĂRÖěĂž ‚6ϦĽďs R0 ŞŔdŚ€zfşÝK\đő犭ő÷ń]đ¶ó#“ű9`“(WÓo8óŚ×‘QIŃOŻÄćŮŘ|U›^…š}=®îU ˛2•ČŚçŐ©÷…|1µ}Łę˛j7—öňAooövO%_®âzŕůW™QMŃO¨ţÔâŃĽM§j«40JÂőŰĐăó­ŰxrY/5-^{»›‹'ŮŃÓhbIůĎČŃTáys\@±żđ÷'¶ąż“Ë´Úé+m-€PŽž¸®~Šą.ef ŮÜôËi‘Üx˛In1ö†/cű¶ůÎÇAŰŽ6őÇZâô"ń&:¶°tćRlŇďĎËұč©TÔofS•÷;żËáífňëTł× Ü”P–żdn ÷ެżę–_Ú–z¬Żµý±ÎD-ĺź\{×1E šĺĺ¸sksWXµÓ,®ŕV¦uÜî`h¶śôÁë[ž#Öl/>#AŞ[OľĹg·s.Ć.ÝÇgŚŐÇQO“¸®kx˛ň ˙ę7vŹćA,ĹŃđFGĐó]׎l?á4Ňańf‹$rI¨]Fظ ĺ°zŚgđĺôřĄ’"Ć) )VÚqzíT••„ő:ßë6o†ĽYi{?—q}j‘Ű®Ć;ŘnČČG\WEézF·¤ë> Ó4ŤC^ąĐŻôćp“$nÉ,ls´ŽGźOzć©nş ÝőÜ6ń€n®¤bd~ě ýŃí\Ýěún»áßx·EŐźIŐNĽŇE"ű8`@ó ęBŽ{t®#ĆZ}αń;U±ÓĐKs=ă".ŕ2{ňxěj>(°Óˇ°´ŐZ+XPG,1ĺTvÎÜţµÍ}¦´µÇť'Ú–2n;‰=Nzó“L@ńÓŰx{Áşo„`ąŽâýg7—ÍĘŁ@L÷ë˙ŽŹZáôE±mbÍug‘4ó*ůíËĎ8ŞTRwĆŃhpř‚dđÄŻ.švłgďc3ÉZҸńúG„Ť”»ď4וćM¤mË‚HÁČĄrR”T·v;_‰Z杪ęZtÚ,ŢdpEň2ímŮƧ¨ęZą¨&­qŻŢŘU7)’X aXp3Šóz*=’I$ö;:_ ęÖv^4KéZX´ćiڤČÁH±É<Šébńn‰Éś†‘‹i˙#|çĘ1Üp®+Íh˘T”ťŘ)4t^“B–ŇöÇ^Ýnómh/Q ęŹřÖŽŻ}Łé~›DŇ/¤ÔĄąťf–cŤŕß\eÜ.ďpćĐí¬o4Mkš~—«ę¦Üéîĺ%ňL‹"1Ét?áŢŁ×uí:çÄÚ±gf!Jęrʬ luéřń\m{5{‡1ŰkćťqgâD†ăs^_Ç4c č ÉéÇăW'ń”Ţ9×őşÍťŐ‹C ž[üÎcAŚc#zŠóÚ){%ý^AÎĎAĐ|EĄÚę>–{­‰cm4wËc±6žŁ¦jŹuk´ WIĽż“KšéŐă»Dféü'o8ăő5ĆQG˛AĚÎçXÔôü6•iŞĎ¨]›µ”Ľ±:îÁŰž€{śő¬˝GS´›ŔšFťŮĽ‚âG’=¤mśăŻ­sTSTŇ ŻLĐ5—˛řcqu:¤[Ľ–vRžżĽÁ8úr ó:»>©y>™o§K6l­ŘĽqzś“Ôő˘p治ъ0e$09v5č><ń>›ŞhŦĘZîîT¸˝]Ś»Yc Ś‘ĐtĎJóÚ)Ę M7ĐIŮXęü¬YZŘjš^§q5¤Ę…nbRLN§ ŕsŹđ÷¨üFÚL\vÖZµŢ«zŇny[rD‹čşźzć(ĄČŻpćŇÇmgy˘kžÓ´Ý_P}6ďOgËä™Dc“ÓżOʱ˙ÂŢΩa©Íuw AdĐ2KC7CŽ}=k–­ůÚW˝•ľöWĂ› &ăIń-ćµd.㲷IQw9Ëpéśš]fo ë^ žţÎĘ×HŐí&TńĎ“#Ňî|QáµÓšA¤čţDBiĺŐXluč>µšććë}ŕŇjxrĘ juđĺ«'PKt_1±(~ď\sô¬YĽ!cqń~m 5hôŕâVD8!| űAúś}*-sÄZ]ŐŹŠŁ‚ësŢęQ\[Ź-†ô“ČăčpjKßŘ[|\“ÄŽ×:kmFeB¤©…PÁţU1ŚŇvľĎô˙‚#vO Úë6z­´ž—Dű<-ťŕvůŠôWĎ\űű×7đ“S˛ÄSi0Ďw-ÁhďČh†Ţ€t=çRęxjŇÖţć/jZ›JŚ-lĐIBzocÔĂ5ÉřCS‹Fń6ť¨N¬ĐÁ(g ×oCŹÎŞ0r„—ůŚÝńŢ·ĄÝ]ęvvţ¶µ»[§ń%bĚCśśc×Cq¨éšgĂo O©ii©Ë™Ö(ĄŞ(Ţw1ÇSŔękńť·‡%’óRŃő绹¸¸2}‘­6†$źśđqMńŻcyŕo iöóSóüřö0Ůą˛9#ŹLÓäRQJűůöš5…¶Ł¤\čýžŰUµŽá`$‘7lžÜŹÖ»ą<+§éú­¶ŠžšţŔ„IőC#ÜÝ\c çŇĽ˙ĆzŐťő—…Ćť?™5Ť„qL60Ů"ăŽG=;dWQŞjŢń§łsâKý9YÜéÉ…‹‡8ôüŞ$§ĘŻ~˝ţ@dřWĂvQüV“Cľ]YÄó(Y?%IÇ~•GáÖ™e©kÄWÖé4péóË·đş•Áýj·†|CkŁxň-]c¸6++‚˛>ů<¶rOrĎá]$ŢđÄZŐöŹŞÉ¨Ţ_ŰÉ˝żŮŮ<•~»‰ë‚ĺU>u¦ş¤_ÂÝÇT¸Őeş´MBîÖß}­‹É°LÇ9çŰŰšoŽ’iŃ$ţ¸Đµa' ™ňdNý{ý?:ËđrčRIuą{u§ÎT[ČAasťŔr{~µŇxł]Ó“ÁC‹\ź_Ľk‘0¸–&Q Đäţg©éNWöťř`<â€pA®›Ŕ0řnmRuńtŇĹh!&"›°_#®ĐOLâ°$hbľf€mŇBPH0YAă?Q] z=ňCâýRŰYđö­¶±.Ű+µ/?!<řc×˝břNŃőžGŕNí/Ú#u — { ٵ\TđlÚ­ľ±©6ž‘˛JÖ nĹ•—+:ŹÂł­»¸łńn™%˘—vFP·~Gô­?Š7ń\x‹ěRĎNAo/@z·ëÇáFś·~~^›’xĄÚ?‡Ţ‰#=ŮGBC üxţtď g´đ¤˛ťňI§GąŹSÓŻćiÖ7šąá];LÖ5Ón´÷}’ů&E‘äŽ:đďYţ4Őěµ-CN·Ň·µŤ„ mŽ0_ń×Ň›ŰîSćJŰ\ëu…đΙă(ôS Ĺ"\4i$¦FY|´~G®y5Ç]-—†ĽY¨ŰÜXG©[DÍG+•Ç ‘Ü?î|W‡SÇźoŐ5)-n- R=ż’Ě& ¤0éŘí^iâMEumzúý˘O)eSÔŮü(ž‚˘ą»ěw˙µ­6×P·†çA·ş•ěŁe•Ą`Pŕ;W?đăJłÔ§Ô¤ąµ[ë›x7ŰŮ´›­ÎyöŔüęßn|;â8mŻĄÖ$˛˝ŠŃakfµwÜĘF “X>]G¸MbîćĆlmu,#ns¸}?ZĽ®Ť©Ů^˙?ëî4|`-Â5›Ă“čÚ~ çĘ‘?˙Jé~ři`×tÝlk:dÍRKö&ßrs »;k#ÄÚÍ‚xć©ü!’ľ"iq Ť7Hc¸ĆŔÄ*eą­+ňęrÚŚľ~ˇu0C™+>ĂŐrIĹW­ďčš–‹®Ü.«mä<ň<±üŔ‡RǑҰj Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(©ďăé˙ĺPT÷żńô˙‡ň (˘Š(˘Š(˘Š»Łj—š6ˇö›7‘uBľĐŘČ đA ŞnĹÝ™ŽYŽI©.‘RvUQŹĺQQe{€QEQEQEQEQEQEQEQEQEQEQEQEQEQEkKÔ.t»čď,d\ÇťŹ´621Đ‚:‚i^y¤–V-$ŚYő$ňM2Šb·P #¨˘ŠC-ęÚ•Ţ­|÷š„ľuË€ö…ÎĐUJ(¦$­˘ (˘ÂŠ(  n.g¸*n&’RŁ ˝‹`z ÔTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEĄáÝóĬz~š¨×2eŰFÉçđ¬Úîţ˙ÉC±˙®r˙č€0m|+ŞÜëZ†•H/,Qä™YŔPŚ{ő¬*÷­65Ô5ßřI`f« N&ŰĐOEqüż#^iđęŇÂâęőď4[íjć(Á·µO–Xç™t={Đ!Ez—Ź<=jţ Mpč@ÔaąIn Ű"Ăő#ň5ł¤čŢx4 ­ dżŃľ×-Ŕr®WřĄŠ[ ¶(UŰM2ćëOĽ˝…ŰÚmóI`Üp8ďT«¶đD–ŃxSIJ_Bg·_!š ŰwáŽ{qNo•]9r«Ł‰˘» b 3Tđ€Ö,,Ââ o,q±e`FAçę?ZݍéÖ×~ Óő=>IáŰ]ŞdîoáoÇŹĹ©)‰LĺęÓŘ]&ťűÄE¤ŽcY20Xvő®Ĺv¶:%Ţ“d–±É=´I-ď'÷®pJAŹç]ޱ¦Żě®[B·kw»d[c+mSóg­'7ŁKr]GdŇÜóZ+˘đí…·Ľ_@µł•‹´Q±;T.p őÇë]KčVúť®Ł řnM+Č…ĺ¶ąÜß1^ŠŮëšr¨˘ěÇ*Š.ĚóJ+¬đ™i¨M¨=ŲŢÜAř-M‚VúűqůÓźđţUO{˙Oř*‚€ (˘€ (˘€ ë~ęö:Śí/µIü‹TI>Ćl„Öą*(ÔľxĎLŇü1«éšÍÁ‰żxÖdĆÍťęC/Ę9óëYßµÍ2 ë:ö©.Ťqy"IôhÍÓ)ŰČ{}ă^}EzVż­hq|;ąŃ,µËťRýŻc$ńH»ĆvîÎcˇ9Îj凋tHŻü7$—¸KM¬ç>Sü’•Ŕ^śóÜqď^SEuÚţµi?„ëí;ítŘĂË-"˛ňFqŰ5ŘjşÇ†|E©Ĺ­ÜxŁPÓ‘ Ö›I¸°°ŕg@?…y sX¸†ëTşžÔL-ŢBc>÷ŰŰsw8­żÚřb I“@ľą¸Ô]3wŞ@SŽ{ ä`ÇćyŠ(˘Š(ĄŚ€ęO@E%ÖřW±»ř§o>ű%ž2laÂíÜpF{Ս⋨oĽC¨]Zľř%™™d}5—EJŠD¨%cµ×n4~ kŮui,ď"µXšŮ­™÷2ч&ąĎ ߦ—®Ů^̬ŃĂ f ×ńY´Pˇea(YXčüOďs}¦k s<Óű3[2 I?1ŕâ·Ą·Ó.Ľ áČuK×±$ĚcDd• zäsí^}Vî5«‹ [)ĄÝmk»ÉM mÜryĆO>´śŠâpz+ěnxşú×UľÓ,4]óAk ZÄě6™8ÎáÖ˘˙„+Ä?ô —ţű_ń®tAÁ'Ú&˙ž˛ßFź+JŃ+JŃ7Ľ;˙˛ ŻŮŰ2än+”8űąő‹¨Hł_ÜÉĘ<¬Ę}A& f,ı$žäŇSK[Ť-ntţŐlí¬µ=3Rž[X/U ÜF¤™NGś…GâŇŕÓc·łŐ.µ;¶}Ď+nHŐ}ž§ŢąĘ)rkqrks˛¶»Ńu ŘXj—ďau§łío$Č$F98Ç~ź•/ÄV„µžá°Cî»{gßĆU»íFęý-’î_1m˘Ä6µAŔçńĄÉgt.K;ŁąźPđÖĄ®[x†çQ–Ţâ=’Keä3‘1Ś7Lp?úŐ¦xŤ-ünÚÔ±7“$ÎĚ’Čü«š˘…M-SKC˛˝:µ˝ÜŃë××ěęE˝˛«Ç´źď1ęcřit‰á5k«‹)p ˝Ě@°Fď9=«ŠjZăPŇ×;ojöKáEŇcŐ¦Ö.Lâ_:HŮDJ@[“˙×5›ŕÍJĆĎűNÓS‘á·ľ¶0ůČĄ¶\ ćčĄČ­`äV±©©éöI{oo˘ßťHË…ĎŃa‰Ŕ\5^˙„+Ä?ô —ţű_ń®tAÁ'Ú&˙ž˛ßFťźF;KŁ4mě˘ÓµÔµń3GL‘‘˝A\ßÔëěµM'DłżňüCs©Á4 6M €3Ó%¸éÚĽńłÄ’{“IJPćÜR‡6ěŐŃ,´»´”ęš±ÓŮHŘ>ĚŇďőéŇşK ę÷wZť¦´^ࢄ¶ű+ŤÄ>ńŔµÄŃMĆî÷»ÜîĽ?wˇ[xQíF°týFď"ćOł<Ś'¤ F;÷?‡/«ŰŘXÜĂý“©}˝q¸ą˘ÚŮé†ëY´Pˇg{‚…ťîzˇ¨hZŐúj—ĺÝŽĺS=’Fä’0¬8Ĺr1XĎ­ę×éóM’Î¨î „ĎROSȬĘTvC”b§ÔRPĺŘ#]އţŻ˙Đ2_űíƬřGPҠе»ZáážR¦Ä,x'-ÇdµĚyóĎY?ďŁQÓqmY‹jŇ:íf÷I°đ˘čÚMă_I5Ŕ¸šo(ĆÁúÖ­ü,ą w¨ŰÝ }?Čîč†6óé\5\łÔ®ěí.í­¦ňáşPł –¶q‘×µK‡şĐś=ÖXľ}OUş˝—;§ľ=ař č´»Í"˙Âqé:Ąüš|°\™’A J®éő®FЧŐŠqMXßđţŁmá˙Ĺu­we˛y6—BČSÓ®qíZw§B¶·»š=zúýťH·¶Uxö“ýć=@®6ŠNw…ÝÍŻ .‘#Ü&­uqe.·ąÝň'µnx‹W˛_ .“­6±rgůŇFĘ"P:Üźţą®&Šnw »…QTYÜaiV? Zľ‰ßUľą1ZäPpN;ýÖüĹpőv÷T˝˝łłµş¸y-í¬śb0zăňJ€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š({ßřúĂůT=ďü}?áüŞ (˘Š(˘Š(˘´|=Ł^kú¬Zvś¨×2†*¶Ž'ź   ę+WEĐ/µ›»ËkF–ÖžP΄Ź^˘˛¨˘Šě®>ëđi3j.–†Ú Ă•ťIqăé@mQ@Q@Q@ˇm¤^\éŹ)¶I„‹wś`cń^č÷vzČŇîěş&7Śe±Žzw®…ĚŚú+Ş× –[mOÚΰ5]>}.úKK°‚dÁ;0äg¨úŇROf%8˝™RŠ(Ş((˘Š( rj汦\éďg|Ş“ €ŔŽFG"‹Šý tQE (˘€ *Őť…Őä72ŰDdŽŮ<ÉH m_ZŞ$ÔŃq\(«šľ›s¤ßÉgzŞłĆ`ČČä}jť ßPNú…Q@Š( Š+RĂF’óF˝ÔVćÚ4µ ťđíźACvÜMŰs.Š( aEPEPEPEt6>Öo,˘»ŽŇ Wr%U,=pMsÔ”“ŘJIěQWn´Ë›m6ÎúeQow»Ę!'iÁăµ;…ĘTVŚú-äéńĘ­~đ|ă1ŔĎĄlŹk…K­¶Ž§í ŹçR络Věĺh­¨Ľ5¨É¬M¦*Ăö¨“Ě`e]¸ăżOâ Ţ×Ń[zpĽţ´9ĹuśWS•˘µôOjи6)-ąBň9Ç_ˇĄÖĽ7ŞhФ×ÖŰ`s…•:çÓ ńO™^×2˝®cŃEĘ (˘€ (˘€ (˘€ (˘€ (˘€ *k+Yď®â¶µŚÉ<‡j dţ4Éâx&’)Wl‘±F_B WEP0˘Š’Ö .®a·„,®#PN2IŔ č­{źęĐę2˰uIČpp[ÇŻQY&žÂM=‚Š( aEPEPEPEPEPEPEPpIŔŔ˘•€ BťŔ­%QEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP÷żńô˙‡ň¨*{ßřúĂůTQEQEWsđSţJ6›ţäßú-«†®Żá~­eˇřŇĘ˙T›Č´Ťd &ĆleÔŠďüáŰ+Qń ŐŻ,5_N¸V·ď %NO=1ř×-đżĂ–Ú•Žł«]鯪µŠ˘ŰŘŁódlőÇaÇëTľëz~“­ë·…Ç• Í…Ä16ĆmÎĚĄGă8=x©>kú}–›¬čÚĹÜö6Ú‚ˇŽî$Âęsś/8<~^ôŔŘń׆ŕo.ş4Đ5nD3[%$B8`;sŹ×ÚłľČ#Ćżö›ů«âŮt[m;+ r˙[Ô]ŇNĹŇAĐläűçÖ˘řm­éşUÖ«i­<ŘęVOjóFĄŚyďĎLţ”É[€ÓĆdŹĆ˝Ł]_hţ=‡Ăíá%K¶Š9g20ň‹ŕ‹Řt$ç<źJó}wMĐlełm ^mQŢLH¦ŃáňÇ9nµę^4‹Â±üH]OXŐĺłş±ň¤{_!śNTB¬:v{P‘řËKŹDńF§§@š·Şë·¨Ďŕj÷‰őO_hşL.“%•ôĚĚF$8îsÎNN+?ĹÚŞëž%Ôu(ФwE=Bô÷Ŕˇâ{_ A˘é2h×7‹¦nă•H qĎaśŚxüʢŠ(nËZ[o M¦ynd{¤¸8ý*j‰­k×Z„q´i1\+‘… ý+*ŠJ);’˘“ąÖé_ňMőżúú‹ůŠÍđM¤Ţ(°¶»ŚKŚÁô?)56ź¨ÚĹŕťRÂIqw<ńĽqí?0dçŞţ ˝·ÓĽMcwy'—oď´ś|¤t÷¨ł´ł´ż®‡Gnţ˝˝żŇ%Óá°HÄ‚ל†.§śńĎ\~‡ŕř-&¸ąkť2ďS™0ۧa>®G t¬}BEšţćHÎQĺfSę 5ÓxGT±‹BÔô»»é4ŮnY].‘ tţ·ź˙Y¤ÓŚtč[ńV‘đÂjźŮ ¤^%Ŕ…áÉÚęFCĎZ†Ú=+AđĆ›{¦¦Ły¨3˛ąUŤăŚwä~~ÔjÚŽ—eŇíu9Ż®ŤŇĘ^HŮw ¸ůsĐsž´ŰK˝YđÖź§j·ď§]X3„“É2+Łžťú~U*ö×k’ŻmvąŹâS¤I{úhâ–0ŇŔŮýÓ÷POQ]lj|:×Ţ6»Ô5%hth#IeôpŞ>QîMpţ%—H7EˇFÂŢÂ<ÍfníÓô®źPń…şřŇyâťî´KÖŁ`ŰJ•SÜnyő§%-9BJZrög=¦¦ź¬řĆŢ$łÓ¦›5la@ŕg=NĎ˝t^!¶´łŠöď Ki†X.íضđ–=0k–ňôh|HQç–çFŢy*áHă‚3qž9Ĺu–Z¦“˘Yßů~!ąÔ๩&…Ŕé’Ü tíDďu`ťî­úžwEVĆç˘ř3T°:®ŁH€5˝–fo0˙¤`sźLűW«_Ú_Ü۵–›‚Ż ±ąmÜőćŻř3R±łţÓ´Ôäxmď­Ś>r)m‡×łµ{m:Îę¦jFţ"2ďä4[Nz`ő¬ŁI™F)IžâK­řči÷şJÜÉtŃG-ĂČABŔÚ@=ů®WMđě=}Ůͬs8$˘‚@ý§řW±»ř§o>ű%ž2laÂíÜpF{Ôř‚ÚËâ ÚĽE¦łiś’ ‚QýsřTĆ2KNÄF2QÓ±ľúľ§k¨Âţ“Jň!ym®w7ĚW˘¶zćĽŇ»+Óˇ[[ÝÍ˝}~Τ[Ű*Ľ{Iţó WWNć”ď¨W{á­*ßţDżµŃÓYľy™%ŤźJŽź(ëžżŤpUÔh)Ł>ťlÝhú˘18Ve‘sĆ6ăşšu6 ›ţ)6gP_±i×suĽŮů_ľÜóŠß´­_ÂÚĺÄ:4sŮ$E$I‰,Äwú~µGÇ:µž­{§Ą­ĂÜ-´ —n…L§<śu˙őšŐŇ˙á°ŃőkřHĚźoX×Řd6’zwÎ}Ş·żĚ—đ­ďó8˝.âK覺µK¸W;ˇv* ŽŁóü+ą¸ţĆ_ M¨ŢčVöRÜ©K$YťÎ>˙=ŕ˙úĆy» mßÄđGu¨ť!~g›ÉdÜqť»y8Îlřť´=bękÇń6YP¬ëa TP>T·ÖśőkÄ'«[ţ%OhĐ^Úęw÷RjŃPEjŚGěO\sеâť#áĄŐ˛_H»Žq°díu#†ôçŹÎłü!ŞŮŰYjzfĄ<¶°^޸ŤI12śŽ8˙ ŹÄ ĄÁ¦ÇogŞ]jwlűžVÜ‘Şú=O˝'~pióśĺ:42H¨˝X€)´¨Ĺ]z©Č­ŤŹD»‡Ăş_ đěş@¸ÉŽ)nÚV˝ŔÁ}GJć'˛ŇôŻßYęßk’ÎdCnWy9sž:WKsáťO\·ńÎŁ5Ľë˛IlĽ†b΀c 8Ç˙­\V»ý©¬^^…('”¸SÔĂň¬`Ꙅó˙‚wž5 ‰ôѨǪłý†?'É)8Î{őÎ+Íkˇń¦Łk©]iŻe/°ŘĹ ť¤aĆěŽG¸®z®śméĆŃ ô tË}KŔľ:•µ€ŹĎÁź?>_·Ó­yýt:ÎŁksá-Ęw\Ú™ĽäÚFÝÍ‘Î0xô˘i»X&›µŤŃ,  E©2G§Ć˘Dű®Ƣҿä›ëőőóOĹšŤ­ý¶†–’ůŤma2Ť¤mqÔr9ü(ÓőXĽŞXI..çž7Ž=§ćŚśă)>Tż­ÉIňĄçúśőuľ0˙‘oÂżőę˙ĚW%]‰5[Í@·¶—|¶°2L»HÚIr9ü*äµEÉjŤ_ŮľˇáOÚÄń#ÉäҶŐby?…Ir‘hÔ4ŰËűk›»ÉPĹy‚0%ʧOĺďXÚ&Łkmá]~ÎyvÜÝy>Jm'vÖ$ňă\őG+mßą<Ť·}®QEjjz6¶ŢŃ5Ëk)4XĄŽhăiĄiXya¸ůG·\űÖ-†a{ăÓĄŰN&Ów—†Ę݀ï¦j§Žµ]S[[‹|ŘD¦íĄy‘Č[Â:˛hľ µľ•YâBUÂőÚAž ÉE¨ÝocŁu˝ŽÍô+}N×Q…ü7&•äBňŰ\îoŻElőÍsŢł°]3WŐőKoµÇb¨#€±™‰ţźťX˝:µ˝ÜŃë××ěęE˝˛«Ç´źď1ęUđ†Ł§&źŞéZĽÍoo|©¶uRŰI# séůT«ň±+ň˛Ţ©“{ŕ‰5K9-.~Ř"p°_—8\ö<V~»cmoá/]C ĄĹŔ›ÍqŐđŔ ÖÎĄ„&‹Ką{¨—P]ó4e7¶ÁĐ@Ć*Ą•ŢŤ¬xbĂMŐoßOą°w)'”dWF9#އü)§×Ě{ů”üU§[Ű[xě¬r\ŮG$„žćşů<=ge©AĄ/†ĄĽł!m@»nÜq–č{Wă ^ÖúúĆ=/y´° ‰Ü`ľßâÇĺ[Ú†ˇˇkWéŞ\k—v;•LöI’H°ŕgź5š•‘m˘ÚÇ㡤^JE˘ÜË‚Ę2@'±<Ć·ĽCmigě7Ţ–Ň °]۱lá,z`×%m.›6żć_-ĎökČs‡Ý ^pIîzf» -SIŃ,ďüżÜępME “Bŕ ôÉn:v§+Ýwş2ľßZC¬ŮÚ˧E5Ě“ĺ.KŃŚtˇč:ĹşĄ…ĹÍý´4÷áąY c†98éÍdřný4˝vĘöefŽ0^¸ďŠŃń<#˝Íö™¬5ĚóL_ěÍlČT1$üÇŠ§§rśRťÍŻ iV˙đŠ%ý®ŽšÍóĚÉ,lřňTtůG\őükšńIł:‚ý‹N¸Ó ó­ćĎĘýöçśV†‚š3éŃ7öÍÖŹŞ##…fYéŔ űrŔá@*ŤQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEmuĄŇßNYqfŇůĆ=Ł—Ć3śg§˝T˘Š,+Q@Š( Š( Š( Š( ®i:Ąî‘wö­6áíî6”óőëTč ňrh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š(  -:}Vő«™­¬ď2X“s/\VŻŽĽ2žżµ[kÁyeyÜŰÍ·i(zdžµÍW®řË@_hŢÔźUÓtşdq‹kůÄlŰrw'\źĺ@EEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPNI'˝Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQEsHÓ/5ŤB+6žę\ěŚ3€IäńĐíţ3(‡PĐmetűm¶—7ˇČFăůţ•çđM-Ľ˘H$x¤©¦»łągbĚNI'$Đç´u׼Y¦é҆0Í.e±Afç·Ó|i›oâ{ű}2–Iĺ&\±bĽ1Éő9ü*†“Ş^éjÓnŢăiO11^µLňrh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*{ßřúĂůT=ďü}?áü¨ (˘€ (˘€ (˘€ (®űÇđď†í )©ßI¬41Í-ŘÁÎXMß•p4V݆ŕŇ./ŮcŘdPE^Ň4»­Zy!˛EgŽ3+ŔaF3üč˝Ň,Ż'E^0Ŕ’ČíÔRş˝…u{h˘Šc (˘€ *Öˇau§L‘^Äb‘ĐH r§ˇâźi¦\Ýi÷—°˘›{Mľi,ŽčşÜW[”¨˘ŠQRÚ[Éww ´ fuŤ8É'€"˘®K¦ÜĹ«5Ő~Ö%íÜ1¸śc?Z·sáÝBÚFYc@–©9 cőę)s!s#"Š(¦0˘Š(˘¶íü/Ş\OcQ!{ŘLđ ĺÎOĄb $ÓŘI§°QEĆQEUÝGLąÓŁ´{ĄU[¨DńaĘž‡Ú©PťÄťÂŠ’Ö .®a·„,®#PN2IŔ­;źęĐę2˰uIČpp[ÇŻQI´´ŚŠ+§đ6ŤŁk·ŹcŞęSXŢLé¦Č·«±Ď éÎŢă­ckşlş>±y§NĘň[JŃ^ŤÔSFŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(©ďăé˙ĺPT÷żńô˙‡ň (˘Š(˘Š(˘Š+Đ>6˙Č×i˙`řöjóúő?Śú§6ˇ±ٶ› Ś(óäaNHĆ3ž¬?:`yezĆŹůé?ö ů˝qú&Ť¨k—Ťk¤Ű=Í¡˘P@'“î+˛řŰEâM.9k¦— °=/š@Tđö™ü# }m¤¦Żzó2ĘŚ˙ę”tůG__ưµÉ,cŐŕ’ßLšĐ&Ó=¤Ä€X@ďV´EŇÂ6ţ׹ҵ%bÂł+®xĆÜc·zOj¶şťÍ’ÚL÷?f€D÷.»L§×ýf¸ Ąíšw{÷˙†ô±Ů7d­nťżáýntZ¶žľ ł¸m®™VßÍl)ÁůłÖąĎÇiŞřÂŮŃ#´™ĎîÚxĎ^ŐgMşŇŻĽ1—©^˝Ś°\’A 0#¦Ö©řzâËJńmĽÍuľĘ÷ţ[ ĂiíäÔ‘šŠw׿ËúÜ©OžPm«iŰçýllŔţĽĽľŇ¤±†Ĺ8†ńç;·)ă9ăźOÂą­úŇĹĄ7šlWÁń´;•ŮŚúz˙J«"Ë}q$g(ň3)őŐÍĎMşYNĄŞR6ł´»ýzt­Ő5»·gnďţ ‹¨ç%d®ŻŮŔ.řîĘßOńööq,PŞ!˝Tf´€Ňtż h××dwww@C9U 7SާëIă94MVęçQµÖ NQB[ý™Ćâxŕ ĚŐďí®<1ˇÚC.ë‹o;ÍM¤mÜŮăđ¬bĄRť8»ůîş3YrÂsjŢ[>¨—Ć}Ą˝Ý„úlf/­Ňq9ŘOoĺ[·phV!´Đ_KáŁI.L„9vÁzr2=ý«žń6Łmym˘­¤»ŢÚÍ"“ĺ#kŽÜŽ čm5]#Yńť|öWżÚÍ$jʸňwňzđ9ü*&¦ˇ+čźßŇĺÁÁÍňŰVżŕrčpßxľ˙NŠňĂL†7}˛]ËĺĆ?w<ó]7Ä[AŁx ÂÚ@š;ĐŹ<ÂňÜî…˛ÄíVď÷żJâü\Ań>©Źůřç]ÍÖ“y­üĐ‘şű ×]*ş†‹ćcČ'ÓźÄWu-aöG]&íÜâ[|˛#oNzőV&­©[ÍáŻŰ[ËşęĎĎ2®Ň6pW’0x«©_úó2Š•×őÜí$đőť–Ą”ľ–ňĚ„Iµí»qĆXc í\L«káď_ŰÝY&ˇ,Ń"Jĺ{‚#ľ?ťtz†ˇˇkWéŞ\k—v;•LöI’H°ŕgÂßË׳ÉDÎJ sc¶OsNšop¦›ÜôęÚu˝őĽW$=š2ĘҰ(p•›ŕ‰-˘đ§‰dľ„Ďn˘hmŢw Ž€śRk·żµěş´–w‘Z¬MlÖĚű™AčĂ“Yz&Łkmá]~ÎyvÜÝy>Jm'vÖ$ňăIGÜ· ”}Ëző¨4ÝK ¬XX%…Ä7?f–8Ř•a·9çę?Z}´ZN…áŤ6ţűM]FóPg!dŞ˘)ÇďČüý«6 FŐ|s§4¸Ľ{á2Ç´ň›@ÎqŽŁÖ´-.ô]gĂZ~ť«_>źs`ϲO$Č®ŚrGOĘ›M+t¸Úi[ĄĘž1Ҭíîôéô´1[j0,Ëůdőôé]$ŁBŃüY§č‘éa¤†Xsyć'vqĐŽFGżµs/Őí//,"Ň·µ¦źĂ¸Ár;ăň®†ďPđÍ˙mŃ­Ř>bAĄdř3J‹Zń­ťÁ"ÜĎ´ŕ8üqŠÄ­źjɢx‚Öúeg… W ×id}3š‡'Ëą›Ť“ĺÜŘ—Rđơ íłé‹§lF6·1ł;3†;ű˙őę·„ltń¦jÚĆ«şŠĹP$Їf8#đüę̰xOOŠöâ+×Ôä•m­Ś/–OBÍĆqU<%©ińéú¦“¬HđÚß*:)o-”ädOoĘŁě»\ź˛írÎłm¦j~Öťb,'†ŕ[Í9e`FAúŹÖĄ†='Cđ¦›y{¦&ˇw¨—?Ľ¨DSŽ1ß‘ůÔŐö•aá˘č÷O|ŇÜyó\ĚkŔŔ ©mîô]cÂÚ}Ž©~ú}֞ϵĽ–HŚrqŽý?*5·[\ZŰ­®;âĹ!đňنXÂ1c’ô×A'‡¬ěµ(4ĄđÔ·–d"M¨mŰŽ2ĂĎjĺTMź*9[čAńSĆ H–w@Ż«*¶GăŠŇÔ|OÝŻbX$_í9Ł‘ #ä sů çoĺŽkŮä€H"g%Ťą±Ű'ą¨+n[ŮłnTěŮµŕ›Ź˛řĂF›Éi¶]Ĺű´űÍóÇ˝u<0¶zƱŞoK™ä¸2}ŚOţ»ŰˇOlţBłţhÚŽŁâË Ë 2ŢĆâ9.$,Ťr}}éY^;’Ľg­Ëm –»‘•ÁČ9cś{f¨ł Šíľč:f§·¨ëčď§i¶Ţc*9R\äŽG˛‘Źq\S]Š®Ő' g8ö ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*{ßřúĂůT®ěěYŽXĐQEQEQEU©µéˇ0Íys$GŁJĹOáš«EKms=¬…í¦’#Łb§™\ÜĎu {™¤™ŔĆé±Ç¦MEEQEQEQEQE·mâ­jÖÎ;[{ćŽ×j¨Ť2׬J*eĎI+•Ę °®í#ł»v9$ś’}jH.g· šHŚ6Ć+¸zu¨¨Ş$(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šą¤ę—şEßڴۇ·¸ÚSĚLd×­S<śš( Š( Š( Š( Š( Š( Š(  bąžäޤŤ$áŐX€ßQޢ˘Š»©{o¦\éĐÜ:Y\˛´Ń aČéźĘ©QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEPFZ(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*ö‰ ŤĆ«o­pö¶NŘ’d]Ĺ;óŠŁEt>0đ´ţšŮÄńŢé÷ić[^D>Iô>ŢőĎWˇy†óŕwď†M–­˛#č ô3^{@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ íą‹ç4”Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPVôŤ:ëWÔ­ě,#ó.§m¨ą'ŻSU)đË$2 !wŤÇFS‚?ô/=·‡Ľ¦řF î/Ösy|ŃŞ9Ď~żřčőŻ:˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ *öť¤_jV÷łŮ[™błŹÍť±=y<ô=*ŤQZŢĐ/|G~özhĚ‘™O› A´:ꍠ š+˝o…&P %ˇ7+Ípr)GdnŞH4”QW´í"űR·˝žĘÜËś~lě ‰ëÉçˇé@h˘Š(­Ż xgPń,ÓŦ ¡źÍ'ăŚÓËMÖtmbî{mAPÇw ’au9Îś?/z`lxëĂp7] h„7"­’!0ąÇëíPÚĂ řcŔZFŁ©h±j×úłČq,…Dh§)ŕô÷çÚ˛Ľ[.‹m˘Gea®_ëzËşIŘşB:Ťśź|úÖ••˙‡%˛ńmćŻ5­Ě"9&ÓţÎĚÍ*cnqŽä:P$>±Ő>0Üč‹“¦¤îÍgE\íSř×O/…­5»=ZÖOɡýž–Ęô9ůĘôWĎŻż˝q:/ŚŁµř™'ç‰Ĺ¬ÓH^1‚Ëâ8?…ję3xfÎ×PşŹĹ:¦¨eF–)ćÄQŹMězřqë@ľh¶µĆŻ-Ý’jWv–áíl^M‚f9Ď>ŘÓć¤ńęئ™\xNă@ŐÄź+'ú‰¸ÉďôşÖG‚W@‘îăׯn´ë’Ú^›śî ϧë]?‹üA¦GŕA ĹŻOâÖąY…̱2T€·'ó=OJŐřq®iŹám}WĂöČÖZh7 %?é!¸ă8>˝kÎĄˇiš”ňř“L}B٢+&ÖČçŽŮçÝ+«˝‡Âš/Š-|).‚·[ŚPĎ|ó0“|€`€?Ţjňx¤hĄIď#Q^«w©ř7Xń%ŻŠnőYínSË–kłł‘ĆqŹ”ő©Ô‹Ť–­k÷ô3ĂžÓí|uâ6ţÜ^ÚXÚĎ$jä‚v•*r;ŕ×C¦iľŐ.ô+ěh[\˛•Ý•Ű÷ €ŕ Ď|/|ňÚ'ŠlźĆ"ŐŻÜŰEiq@©cą±µNĐyŔëŇ´|9âŤĎSđl·7{#Óí'ŽäůN|¶`ŘzŽ™¬ç˝u˝żGúÎřÖĆ{«Ć»ŃŻu›ăŢÖ>YnyŽ@éëŢşč6ÍŕŘőŻě&е®D[‚vČ„d0ßůˇŕMkN‡ĂZĆ‹{©K¤Oxé$w±Ł7L|§o8ăő?ŚúÇđţăF˛Ön5;Óxł&‰×pŔns…îsśŐË›Úi}üöü€Ëń>›gkŕ_ ^[ۤwWB:AŐö°?J›ĹÖVL>ş†Ć&Y¬b¸ąŹ$ ĎäűôüjŢť}áýÁşfŹ­ęoĄÝé˛9Ž_!¤YŽHăˇířw¬Żz݆­}aoŁďm?NµKX¤q&?‹źNľ•QćrQwë˙ÚűÄB|7ÓoĂVŻi%ë˘Ů™›j0 óŚçŹÖ¸Ď é¶^-ńě6˙eZ|ĚŇ5ĽNNŐUÎĐzňGëW´mCAŐ< …­jrésZݵÂJ-ÚepAă ő5™á]^ËÂľ8ŠňÚ÷N…Ú3*ĆQťHÜň:çŐ1‹Š’ŤďŻp:m=|3âőŐôë 4Ůí­¤¸´ąŽVbá?Ľ®G\×W¦YßxO±ę×ú6«6Ływnđ[[ýťBűÄőĆp"ض±fşłČšy•|öŚe‚gśV”wv˝ĽŔĄ^˦Mä6‘­ÉŇí-Xú–ťUżL×›řÚ-Lž•ĺÓB®Ölýěry#ë[Óx–Č|<Óě"›:¤S.řö7®ĚqŹî÷§V.V±pv㨳ü7ŁXcí7r0úK´~•%»éׄőë4;{+‹â)"HĚIf#<ý?Z«ń+ZÓµ˝^Čé“ď´Ž#ąö2á™ÉnĐÖŽ“˙¶ť˘ęúxń)j ůźa”y{I=;ç>Ő¨+Ţ˙đGÔâô;ë]>ńĄľÓâÔ"(TE#•ä|ŮCů× |@ÖtŰkűxnt+{©^Ę6YZVÎí^y¬[ŮZß4Zméľ¶1Ç“Üm<×[â ŹxŠ kéu‰,Żb´XZŮ­]÷2ч$ŐM'%/óz4;ŔrZĂáI žŮ<†hŢC Ž€śTä^«ŕÄÖôý=4űnľÍ,q±*ĂnsĎÔ~µźˇjv–ľń”ómş»ň|”ÚNý¬Iä Ć‹}NŃ>]iŤ6/^řL±í<¦Đ3śc¨őŁ•ó7ćŇĆďĂç6ŢńÍÔ\L † Ă‚‹ü˙JóÚîľj ë«8¶¶Ö`¬íŃ$ŰźűčţBążčŢŐ †¤¨%Ú$FF ®‡8`Ö¶ ô˙Iá ř˘ËL›ĂvÓEuMq;ĘTBă*:qŚ“žőĚi^ҵ?ŠŤ˘Ů\­ĆŚČ$†PŰŁ żhaן—=z÷Ş?ő› sıÝésůöâÖ8Ëleů†r0ŔŁđű^ŹĂ~+˛ÔnžÝ7$ˇFNÖ>™đ J—Â֚ݞ­k'äĐţĎËezüĺz+ç×ß޸˙‡zn”š&żâ nĚ_E¦¤b+fbÝÉţżSWőĽ3gk¨]GâťST2Ł Kób(Ǧö=@ü8ő¬o‡Ţ!°Ómum'[µ¸¸Ó5(Ődű8ăeÎëú `lkpč:źĂ+ŤoKŃâÓď>ްȪĺ ¤ö ŹRk–řyu%§Žt)"$3^Gçł°Sú]Ď?łcř9*hÖ·–öCRUFĽŔ’s·%Î8ö˙€Ö?Ă=ZË‹5ą˘µŃl™¤Ff¦‘x «×Żňâ€9ďP¤8×#mOµČ@ôÉĎő®zŻkşjÚŐţ ŕ©şťćÚNvîb@ü:Vî—…[Á„—÷Ż•˙Ńă°Gč1ŽąĎ?¦PřQ˙#˝—ű’č ]…Š­îŞÚě@mÔtYĽÜt&Őqüż*á>jVšOŠ­o5 |›dW űKc*@ŕzšÜđ/‰ě4˙jš~©7–Řvµ;˛]H+Ŕ8äľµĎV-¶Ń¤µ™KŔ:$Öš¦Łsc&˘Öj‚Db<Çbzăś :·âÝáuŐĆŽÚ5äw`ÜJş‘ĂzsÇçYľ Ö,­l5M/S¸šŇ ĺB·1)&'Sp9Çř{Ô~#m& .;k-ZďU˝i7<­ą"Eô ÝO˝6ĄÎrťVŤ i7¦™sqiŘ'ŇâgLśyí LţfąŤ_K·Ó´- űmĹĚţk÷*ʰ§ZĐ‹ÄÖpxÂŃ%'T‚u ›[ýZĘd8ÇP;Ő?şŐާ­[>Ź/™iy °ŻÎ]™¸ zŠQRćÔ¬Xř‘sgńk$+-Ż”b=—§L“ůÖ†má-ń¤k©· ŇϰmÝ€N¦qú×C¨]řO\Ö!×oő }¨× nÍ˝”ŤĂŚcü+źĐüAk¦xÜjŃZů6GJ”ŤQÁ§ňY-R˝ŮąbľńBę–6Z:ŘMoĎmp’[o÷őȬ=ÂÖăÁ~#»š{›c•!ꛟłkwáź&§yĄjRß]]@đÁČ" ýâză˛|ŞiĐŘjÚNł+Ái¨":©o-”’ ž˙Ą öv˝´˙‚umajßnďÚ7‰~"Y{…Ř?Z×DŃüˇj7ZöüJvąĄ6©áMJëY4¤Ó#KŮť™‡@Ăý˙úôßq,ż´ă!|×ÜFاKôčo®bľ}RIQ–ÖÔÂńůLzn3Źň+ŔúĘxĹšn§(&(dýć:ě`UŹäI­iŰĄţdHŁ®ÜIw­_ÜLKI,îěIĎ%ŤQ®Ďâ/…ßK»mbÂh®´=BböóĆŕŕ¶[iÜţ^ĽWZQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@T·H©;*Ś(Çň ¨˘Š(˘ŠżŞkú¤6Q_ĎćÇe·€lUŘ ŕ ýO5BŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(«Özµížť{am>ËKÝľ|{TďÚr9##źJŁE '¸Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>Id” ’Gp‹µwíĐS( Š( ´toPĐ/ţ٤\}žçaMűľSÔa«:ŠŰńеż$I¬ßÉr‘Č›U\(>őŽŇČń¤o#´iťŠNBç®jeQEQEQEQEQEQEQEQEQEQEQEQEQE˙6O$Ĺć?”[vĚüąéśzÓ(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€X†Áµé]Ą•äĽÄ±úšmQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEPEu ôűMWĆÖ6š„ =ł¬…Łn‡±¨®—I‡Ă^%ÎŤg˘-”¶¶ňMkx%fw(q–úätę+)ŐQv°_Ew?l4›Ť'Ä·šŐ»ŽĘÝ%EÜTç-Ŕ#¦piu™Ľ7­x6{ű;+]#W´™P[Ç>Lńś …<śgÓ·˝Ż˝Ë`8Z+Đí!Đü1ŕÝ#SÔ´„ŐŻőF‘‚Ë!UŤăŚĎ#óö¦x‹AŇáńW†'Ó`)¦jţDĆŮÉ;78 ąëŚçB¬Żkwüóú+Ř5H<9eµ:řrŐŽ“¨%ş/Ř”?w®9ŔúV,ޱ¸řż6…´zpq+"ľP} ýN>•1®ťîżŻéç5gM±ąÔݎł±Ës1ÚŹăĹzĚžµÖlő[i<#.‰öx[;Ŕíó诞ą÷÷®oá&§e,,¦Ňažî[‚ŃŢ3Ń ˝čzÎŹmx·Ş…ą‚Kk‰`ťvK”u=WotkË-"ĂRťZßoňH`IÚpr;WGă˝oKş»Ôěíü?mkv·N âJŇ98Ć9®†ăQÓ4φŢźRŇÓS—3¬QK!TQĽîcާ€ÔÓu$”]·˙ <ŞŠěţ"hÖÚŽ‘s˘Cö{mVÖ;…€’Dlݲ{r?Zîä𮟧ę¶Ú*xBkű'Ő ŚsuqŽ€gśJx¤źpycVţR¸?­7U+ż+ĆŃ]ĎÂÝÇT¸Őeş´MBîÖß}­‹É°LÇ9çŰŰšoŽ’iŃ$ţ¸Đµa' ™ňdNý{ý?:~ŐsňX"Š*KU s °Č.ŤhMiŕ~ęĹ.cµE.ôŤĺUvŔ˙ZĺćŤá•â•Y$F*ĘĂÔí~$ę6f¸·¬¶ľQ„ö\"ś}2OçYţµ˙„»Ć±ŤM†.ĄźËw`éś~µn*öF1śąyĺµ®sW˘X݇ĽRşĄ…–Žš|Öđ<ö×ČImżŢ×"±4 >ÖăÁ^$»š{›c•!ę™lQĘR©ÝL娮˘ŰOµo‡wí ›ÄÔK/p»ăő­€4MÁšŁuŁĹ}{reRĘ©ÎIÇRúŇĺRŰ.¶<ţ­É¦ÝǦE¨<$YĘć4—#‡QŽ˝«¤ńĄŽ›¦ęşFˇ§ÚcywfŐă®JçĐŹë]-ć·Ą§€l.ŰĂöĎl÷n‹jem¨Ř?08˙9¦Łşl—UŮ4·<®Šéü5§ÚxźĆ‘Aöqie+ŘťŞ«ť ű‘ú×\ţ¶Őm58ÂňhţD/-­ÖćůŠôVĎ\Đ ŘĺUEŮžUEv>˛Ó'ÓźđţUO{˙Oř*‚Š( Š( Š( ×ŕßü”=7ýŮô[VÎźáo ŤgT°Ôćşż»†H ˛hL%Ź!›ˇÁÇ>žµçÚ6©yŁjßiłyQä+í Ś‚Đš¦ě]ŮĺäšĆTą¤ŰzŐřCW±Óü9â‹[Éüąďm’8cě dd Ł®+“˘ŠŃE&ßp=Ć˙ĂŢ đ†—Ąkş”š]ćÎ#—ČiVDc’8čxźNő|GĄÜřŁĂk§4IŃü„Ň)ËŞ°,ŘëĐ}k˘ˇQW˝˙¦ ëž"Ňî¬|U[ž÷RŠâÜyl7 <žGCR^řľÂŰâäž ´vąÓ[j3*%L*„€ŔňŻ:˘…F+úô˙ =P“ĂV–·÷1x›RÔÚTakf‚HŠÓ{ ~®OÂśZ7‰´íBuf† C8^»z~u‘E5M$Ów¸wŚíĽ9,—š–ŹŻ=ÝÍĹÁ“ěŤhé´1$üçŠoµ{ĎxcO·ź}ĺźźçDZ†ÍÍ‘É$żÓ•‘ Îś‘ČX°ap3ŹOĘĽ¦ŠNОłŘ§Ă>!µŃĽy®±Ü•ÁY|ž[ą'ąçđ®’ ď řb-jűGŐdÔo/íä‚ŢßěěžJż]ÄőÁňŻ2˘‰RR{Ńř9t)$şŹ\˝şÓç* ­ä °ŤąÎŕ9=żZéźđţTQ@Q@Q@Ý"¤ěŞ0Łʢ©ďăé˙ĺPPEPEPEĄáÝóĬz~š¨×2eŰFÉçđ  Ú+v×Âş­Îµ¨iQÄ‚ňĹI•śÉżQŠÂ Š( Š( Š( Š( ŠĐ¶Ň/.tÇż‰Ű$ÂĹ€;Î01řŠŹUÓnt˝FKĹU¸Ź€`G ĎĐŠW[ ëbťsWÓnt›ů,ďUVxŔ,9Ź­S¦ťőď¨QVµ ­:dŠö#Ž‚E•=•¬÷×q[ZĆdžCµ2.· ­Čh§ĎÁ4‘J»dŤŠ2úpE2…Q@Q@Q@Q@Q@Q@U«; «Čne¶É˛y’@Úľ´lh˘Š(˘Š(©¬­gľ»ŠÚÖ3$ň¨€“řÓ'‰ŕšHĄ]˛FĹ}8"\eQ@Š´öI§G~ńi#ÖLŚ˝j­¸QEnčŢÔő‹E¸±HZ2ĹFéUNG±¤Ú[ijĚ**[»y-.ć¶,.Ѹ8 ŕ˙*·m¤^\éŹ)¶I„‹wś`cńî‚čϢ­ęÚuĆ“¨KezˇgŹ€lŽ@#źˇR„î Ü(˘ŠQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE A$éE:Fß#0“Ú›@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEÝü˙’‡c˙\ĺ˙Đ p•Öü-Őět?Ú_j“ů¨’}ŚŘ%('­zn›ęďü$°łUĐ'mč'Ś˘¸ţ_‘Ż4řuiaquz÷š-öµs`ŰÚŔ§Ë,sĚŚ:ž˝ëŁřmă=3KđĆŻ¦k7&ýăY“6w© ż(8äĎ­g|>×4Č|/¬čwÚ¤ş5Ĺä‰$WŃŁ7L|§o qí÷Ť04|yáëWđJk‡@:Ł Č‚KpNŮŽ©‘­ť'FđëÁ Ř]hpK%ţŤöąn•pĘąăĐžr~•ĎkúևûťË\ąŐ/Úńf2O‹Ľ`gněáF:ść®Xx·DŠ˙ĂrI{„´ŃÎsĺ?É)\éĎ=Çô‰ă› ­Âş¦•§Ă§ÉŞ$±Ľłr:¨<ýkĽ“ÂZvť«ZčiŕŮoôć—«HŰ÷0ĺ†; óŹé^mŻëV“řC–SîľÓľĐgMŚ<˛Ň+/$`çł]†«¬xgÄZśZÝÇŠ5 1YÝi±¤›‹Ś+qÔřP›řłJ]ÄşŽšŽ^;y™ŹR˝F}đEhřźTđőö‹¤Á˘é2Y_@€\ĚÄbCžç<ääâ±5‹nµK©íDÂÝä&13ď}˝·7sŠŰń=݆ Ńt™4 뛍EÓ7qʤ8ç°ÁÎF<~eĚQE·e­-·†¦Ó<·2=Ň\€~”ĎꉭxŽăPŽ6Ť&d±ÉPżŇ±éc :“ĐK•'ryRw=OÄ—Z1ńĐÓďt•ą’颎[‡‚…€ ´€ {ó\TÂĎ@ń6ˇĹ’jń;Ä‘ĘĺqČÁČďŽ?˝â ^Ćďâ :ťĽűě–xɱ‡ ·qÁě{V7Š.ˇľńˇujűŕ–fdl‘ô<ÖPŤ¬ĽŚáYy§Žőm:ŢúŢ+Ť ‰ÍeiX8JĆřs}iłgk.ť×2O”ą.CF1ЇˇüęmvăA×ŕ¶˝—V’Îň+U‰­šŮźs(=p2kśđÝúizí•ěĘÍ2`˝qßF>ĺ…űŤŢ-Ő,..oí Ń ·¸ ĘČK1ÉÇNkAWFŇĽ#˘j:Tw——PCHUHy8ę@ŔZĘń<#˝Íö™¬5ĚóL_ěÍlČT1$üÇŠŢ–ßLşđ/‡!Ő/^Ä“1Ža}ţTë‘ϵÉ-˙vIořö1ÖňL‚Dc“ŚwéůRüEh@đűYî 1në·¶}ńBż7Ţ%~m|ČüC¦YŰ|FŠÂ,ĚöčbĆ.Gă“D ­÷Äi´ ľU’ĚůT=A8–+V}CĂZ–ąmâťF[{öI-—ĚZDĆ0Ý1Ŕ˙ëV™â4·ń»kRÄŢL“;2HF~c#ňˇs5§oÄ3ZvüN™ô+}N×Q…ü7&•äBňŰ\îoŻElőÍ`xL´Ô&ÔâŮon ‡|Ť&Á+}}¸üękÓˇ[[ÝÍ˝}~Τ[Ű*Ľ{Iţó V?†—H‘îVş¸˛—ŰÜÄ nů“Ú„ź+ź+/ř¬Z­”k/‡ćŇ5üĎ•"~=ţ•ąŕÍRŔčZşŤ"ÖöY™ĽĂţ‘Î}3íTżM/]˛˝™Yن@Ě®;â´|Oďs}¦k s<Óű3[2 I?1ŕâĄĹsÜ—§sBÚ-'BđĆ›}¦®Ły¨3˛HUQăŚwä~~ŐSĹ–6nˇĄ_ŘŰćĆňąű3± s’™ëŠłiw˘ë>ÓôíZůôű›}’y&Etc’8čz~UCĆz­žˇqeo¦ok+u·ŤÜ`ľ:ś~U1ż7Ţ(ß›ď:‹˝cM_Ů\¶…nÖďvȶĆVÚ§ćĎZâíĘ˙ÄQ´¶sGe$™6Öż;ăus×&¶4»Í"˙Âqé:Ąüš|°\™’A J®éő¨<'¨éú‹ Ď;OdÄ·+8p§‘˙ס.Tí¸Er§mΗűŰS˛Ô˘—Ă2é"kk’[$Ż@ŮęOř×ŕżů4ŻúřOç]>—¨húTš‹ËâťB[‹i#MĐČŚg9ËË­qšęéşÍ•ă©d‚UvQÔ€yĹNÍSłDž'˙‘—V˙Żążô3VlµĄ¶đÔÚg–ćGşK€ŕđŹŇŻx– ćKíFĂZw¸šC*Úµ«–l‘ż§s\µ\m$‹Ť¤•Í_j‰­k×Z„q´i1\+‘… ý+*Šî?°´«…‰­_DďŞß\­ň¨8'ţë~b­++"’˛˛8z(˘…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEQEQEQEQEQEQEQEQEQEnăQş¸°µ˛š]ÖÖ»Ľ”ÚÝÇ'śdóëU(˘Â°AČ8"¤űDßóÖOűčÔtP1Y‹1,I'ą4”Q@Q@[ľÔnŻŇŮ.ĺóÚ! ChPt©E‚Š( aEPEPEPٞŁ> âźçÍ˙=d˙ľŤGEQEQEQEQEQEv÷T˝˝łłµş¸y-í¬śb0zăňJŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(§Í·Î“Ëű›ŽßĄ2€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š({ßřúĂůT=ďü}?áüŞ (˘Š(˘Š+GĂÚ5濪ŧiĘŤs(bˇŰhŕyú ήçŕ§ü”m7ýÉżô[P7˘čÚÍÝ嵊#Kk Ď(gBÇŻQYUí^ đ펕¨ř†ę×ÄŚŻ§\+[Á÷§'žük–ř_áËmJÇYŐ®ô×ŐZĹQměQŠů˛6ză°ăő¦źWeqđß_I›Qt´6ĐŔn¬ęH@»ŹJŢń׆ŕo.ş4Đ5nD3[%$B8`;sŹ×ÚłľČ#Ćżö›ůŕ(§Ű€ÓĆdŹĆ˝Ł]_hţ=‡Ăíá%K¶Š9g20ň‹ŕ‹Řt$ç<źJ@xĄłă-.=Ĺžť†Ţb¨[®ŢŁ?«Ţ'Ő<=}˘é0hşL–WĐ 31ŕgąĎ998 bŠ(  m"ňçL{ř‘M˛L ,XĽă˘÷G»łÖF—p¨·eŃ1Ľc-ŚsÓ¸«vZŇŰxjm3Ës#Ý%ŔpxÇéPř«TMk^şÔ#ŤŁIŠáXäŚ(_éRś®BrąŞ<®,"¶Ú:ź´.?ť`jş|ú]ô–—aÉ‚v0aČĎQő®‹J˙’o­˙×Ô_ĚVo‚m ľńE…µÜbX$f ‡ˇůI©Rjíô%I«·ĐĢ»ËwđÍííţ‘.ź ‚F$ŢĽä1u8çŽzăđ¬?Ái5ĹË\é—zśČ™†Ţ; őr9Ą>}/bąô˝Ž~Šî|U¤@|0š§öCi‰p!xrvş‘ŔóÖˇ¶ŹJĐ|1¦ßŢ驨Ţj ä,®UcE8ăůźµŃ5 ˝˘jčă&®keΑ~öwĘ©:H ädr*ď‰N‘%ěčaŁŠXĂKg÷OÝA=Ew%đë_xÚďPÔ•ˇŃ Ť%–cѨůGą4śík©k\ňę+MM?YńŚĽIg§M6jŘÂŔÎzśźzčĽCmigě7Ţ–Ň °]۱lá,z`ÓsłµÎÎÖ<úŠ(«4-YŘ]^Cs-´FHí“Ě”‚ŐőŞ @Mz/5Kˇję4[ŮffóúF9ôϵqúµýĄýÍ»Yi±X*đË–ÝĎ^j›mXÎ2mµb¶Ż¦Üé7ňYŢŞ¬ń€Xr29Z§^©âK­řči÷şJÜÉtŃG-ĂČABŔÚ@=ů®WMđě=}Ůͬs8$˘‚@ýĄ—WbŤK«ľÇ+Ez[čVúť®Ł řnM+Č…ĺ¶ąÜß1^ŠŮëšóJ¨ÍH¨ÍH(˘»€4}'Â:&ˇs¤Çyype;•RžN:0Ö‰JĂ”ąNŠę¶cçÖĚăč®űEŃbµđÍŤúho¬Ţ^3–ŽŘtÍcřóGJľ´’ҶŠî1·rI‰»Ż<úSUvQ7c™˘˝čšĺµ”š,RÇ4q´Ň´¬<°Ü|ŁŰ®}ëŠń­­ž·wź2OhŻű§G 2:ă8ü(Śůş3ćčgQEu±ÓĆ™«k¬ę+@n*ŕdŹĂóŞ“ĺWź*ąËŐÝ#KĽÖ/®ź›1±©$×E¬Űišź…µ§X‹ á¸óDŽYXF~Łő­_>„4ÍTĆšťtçűY%0W7—ď隇SÝşDJĄŁtŽ?\ĐŻtCľ;;vH¦3Óę+.µ5ĆŃĂý†—Ę9ó~ÔTúcË«Ťí©q˝µ.imέť’«O&v‚Ŕ'ź §iş]ÖĄ5ÄV¨¬đDÓI– ¸ÉýkoáŹü޶I?ô[WAáťÖÂăYš ^ÎőÚÂu1CťĘ89úqŹĆ˘sĺm:ś­ŁŹŃ<5¨ëVÍ=ŠÂČŻĺťňŞśŕ‡ę*}W¶—g-Őâ@±EŤŘ™I tük'H˙­—ýwOýVÇÄ?ůµ?÷×˙Aď.k ąsX}Ź‚µ›ëXg·ŽŽT/Fj†µáűíČűjÄ<âBl?Lztę+_áŹüŚŹ˙^˛˙*ĺ"˙ZźQBrći‚rćiťCř_R@·…ś ěYÓwĺšćn!’Ţy!ť9cb¬Ś0A«Ó|S O?Ť[RţѱłZ&/$á]B¨Ď…q~8Ô-őO_]YĐ1UVĆ7a@ĎéSNnDÓ›‘…EŐř&ĎNźN×.uK_´Ą¤+"®â§9<:gf´”ąUÍ%.Us”˘şÍNMTđĚ×v¶¶únĄm*¨%Ďś‡ N3ú{Ö–‹˘Ĺká›ôĐßYĽĽg, ± 8č;š—RËR]K-QŔŃ]GŽ4XtÝFɬŕ{hď!Y>Ď!$Ä炼óé[÷°x{Oń%ź‡źHY@x’KŁ+.Ř#Žă‘‘ďíG´VM´VMqEvÚN“c7ÄÉôé-‘¬–YTDs€’+;ÁV·Ú†§Ü+*Ee,đ°#őŁťťnsTW[ŕm Ű]NţâĘM@Ú*­Qó‰ëŽp1VĽS˘Ä|4şŻöKéqÎ"– ť®¤pŔśńůĐę+ŘN˘Rĺ8Š+˝đÖ•o˙˘_Účé¬ß<Ě’ĆĎŹ%GO”uĎ_Ćąý~[µ¨$·Ň¦łTÚ×s’`r@îP§wd5;»#1ě.“NŽýâ"ŇG1¬™,;zŐZô«˝cM_Ů\¶…nÖďvȶĆVÚ§ćĎZätx¬uŹŰGäcńĄ¶›hQ›i¶Ś:+Đ|Cmigě7Ţ–Ň °]۱lá,z`ןUF\Ú•s+…h[i—:cßÄŠm’abŔçüEgÖÝ–´¶Ţ›LňÜČ÷IpqúS•úŻĐĎŐ´ëŤ'P–ĘőBĎ7Ů€G?B*Ąjř«TMk^şÔ#ŤŁIŠáXäŚ(_éYTFöÔq˝µ (˘ÂŠ( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(©ďăé˙ĺPT÷żńô˙‡ň (˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ ęţęÖZŤ,ŻőIĽ‹HÖ@ŇlfĆQ€áA=H®RŠí>ëz~“­ë·…Ç• Í…Ä16ĆmÎĚĄGă8=x©>kú}–›¬čÚĹÜö6Ú‚ˇŽî$Âęsś/8<~^őĂŃ@Ż‹eŃm´Hě¬5ËýoPywI;HQ@ł“ďźZ‹á¶·¦éWZ­¦´ňCc©Y=«Í–1çľ=3úWEtzî› ŘËfÚĽÚŁĽ‘MŁĂĺŽ0rÝkÔĽi…cřşž±«ËgucĺHöľC8ś¨ …XtěöŻ V*Á”ŕ‘Wu˝^ű\ÔdľŐ'óîśĎ±W Ň€,ř»U]sÄşŽĄŽâb觨^>ř´R:{Ö5<ŞÍw'•Y®ĺŤBEšţćHÎQĺfSę 5ÓxGT±‹BÔô»»é4ŮnY].‘ tţ·ź˙Y®FŠSV E5cłŐµ.?ËĄÚęs_]Ą”Ľ‘˛îqňç ç=i¶—z6łá­?NŐoßNş°g '’dWF9=;ôü«Ž˘—łVÜźf­ąłâYtyZl-áŚ#ĚŮfîŘ=?Jéő[ŻŤ'ž)ŢëD¸Ťaš6 ´©P…=ÁöçźZóú(pOqşiîlyz4>$(óËsŁo?Ľp¤qÁČ8ĎâşË-SIŃ,ďüżÜępME “Bŕ ôÉn:vŻ;˘‰C›v‡6ě(˘Š˛Î“Áš•Ťźöť¦§#Ăo}laó‘Kl>¸ť«ŰiÖwPŤ3R7ń—!˘ÚsÓ­fQSË­ÉĺÖç[â ^Ćďâ :ťĽűě–xɱ‡ ·qÁě{RCâ k/3jńšÍ¦rJ‚ FdőĎá\ťą­ňłV·•ŽĘôčVÖ÷sGŻ__ł©öʯҼǨĆŃETcaĆ6 ču­FÖçÂz”2îąµóĽäÚFÝ͑ɓńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP»ł±f9cIZ Ztú¬1ëW3[XŢd±&ć^0>¸­_xe<5j¶×‚ňĘňą·›nŇPôČ˙=hš˘Š(˘Š(˘»Ý#ÂŢ ˛×5ýNú×í3<*°DeIöĎA\M’Ű˝ô w#ÇjdQ+ Ë*g’®3@Q]żŠü1˘ŮxJÓ\Đu »¨gşű6'Ś'EbN1žŐÄPEfŇĆćî+‰-â.–éćJA*úĐÚZ±¤Ţ­EP ˘ŠŇżŇ^ĎK˛˝k‹yč#GË/ÔRrI¤úŤE´ÚčfŃEÄQEWWଠŰkjwúĄń±ŇôäWšDMěKgĂްî­mĺÖšÓH‘ç·’a»Ę6ł‚p3é@(­{źęĐę2˰uIČpp[ÇŻQY&žÂM=‚Š( aEiě.“NŽýâ"ŇG1¬™,;zĐ+•h«šF›s«_Çgdˇ§“;A`“ÉöQV ő_ _ ”QE («şŽ™s§Gh÷JŞ·P‰âĂ•=µĘTVÝż…őK‰ěbŠ$/{ žd Éô¬CÁ¤š{iěQE1…V…¶‘ys¦=üH¦Ů&,ŢqŹÄP݄ݷ3č«z¶ťq¤ęŮ^¨YăĆŕ#çčETˇ;‚w (˘…UŐÓ.[H}L*ý‘&ň nÝŚăCEě+ŘĄEP0˘¶íü/Ş\OcQ!{ŘLđ ĺÎOĄTĐaÓ¦ŐaŹZąšÖŔîó%‰72đqőĹ$ÓŘI§±źEtľ:đĘxjţŐmŻĺ•ä so6ݤˇé‘ţz×5LaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPćf‘G@Ä e+±wf=IÍ%QEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚§˝˙ʧü?•AEPEPEP^»ă-|EŁxkR}WMŇBé‘Ć-ŻçłmÉÜťr•yv‘¦^k„V:l =Թ٠g“Éă 5ŰüfQˇ ÚĘéöŰm.(n#CŚ3Çóý(Ď(­ßhëŻxłMÓĄ aš\Ęb‚ÍĎn¦řŇ-6ßÄ÷öú$e, “ĘLąbĹxc“ęsřP%Q@­Éđ˙ý„%˙ŮëĎëÔÓBÔµďÚEŁÝKě®Ę¤ .\g’=kĚm­ĺşşŠÚ/<®#DY‰Ŕťwzźü‘-#ţÂŻ˙ ˝cxNµżšýç·[Éŕ‡t¬űŤőöţµÓřŻJľŃ~éVzť»[Ü®¨ĚQ'+đňénó¦©s=¤¸ Á`Ťß r{VUÓtÝżZ )«ţ%ď e´ŤeЦү÷đW>[§ăßé[>Ô¬Ž‹Ş¨Ňˇ žeo0ţ˙séźjŁŻę–káĄÇŞK«\ÄľsŁ(Ť@č s˙ë5źáBĘÓűF×R‘á‚öÜĂćŞîŘ}p+‘Á΋şz?>˙yҦˇYY­W—ü1ź¬^ÚŢÉYéńŘŞ‚QËn÷ćşýa´ Y·ł“GŽXćŽ6šF•†ŔÜ|ŁŰŻă\~±mck4k¦ęnŚ®Yü–‹iôÁëWüi¨[jZÂĎe/™…vŇĽĎQZĘî)^Ö}üľfqź"“v˝×o2ő°ŇüK0"ż°ŤÉEó2®¤p7Lţ•Łâh¬dđYXÇf÷/(uF-÷N'éXd6·‹őßŮ ć_,ÉŽ8ŕs]učđíÎ…§iżđűHŢgŘä;÷6zvĹ$ˇ»k}Ö}´ÜtýřĎdžŰouß]еӛCÖŻu+_´}—ĘdŠś’xČč Ŕ4í^;QđŞjÖ6Kcęln>ęl“Ŕ3ĹsńÚk{u¶‰ü°©$'îŰŚš·`š˝­aoĄ‹Ym ’x.D…ť¶˙{ë‘ĹdxJóOŃ|gň^o°„ČÇ”Ăp(@;y#“Mđ~§i§ęś·’ůi5ś±!ÚNYŔŕ{Q(ęÚň EݵŮxFÇOf­¬j°¨¬UA¸¨vc’?ΧÖm´ÍOÂZÓ¬E„đÜ y˘G,¬Č#?QúŐo jZ|z~©¤ë<6·Ę„NŠ[Ëe9“Űň©ő«í*ĂĂEŃîžůĄ¸óć¸1×€?AMß›úŘnüßÖÄđǤč~Óo/tÄÔ.őç÷’ŠqĆ;ň?:oÄs ]Ú[s§ˇŚ1É Ř‹{˝Xđ¶źcŞ_ľźu§łío%¤#ścżOĘŞxăRÓµ¤¦•+<6Ö‹ ¤#±ĎSŹJQO›_1E>m|ËV.ŠÚűDśŰĘWO´kvŹFGé\uI “Z¨Ą±ŞŠŽÁEv˙4=+ĂgIÓ¬cí/ł,·˛$ č9 \E2‚¶ěµĄ¶đÔÚg–ćGşK€ŕđŹŇ±(¤Ő÷Iîkř›Q]wÄW°ĆŃ­Ă UsČÂ…ţ•ŐjŤá˝WMçH[Ł·m#o€;€€çĽýŁ«ŻU9ßj7×5Xő«íBX‚›‹ 1vP0qŹđ¬ä­eĐÎJÖ] Očö:·Ś–žM8Č쯂¬Č ![Kˇx‘u++=%lf‚žŢt’Ű{0>ą¬][´Ňü`ş”Í€‘€…NJˇwî3šŘ¶şđď‡ÓQ»Ňőonnax`Čdňz“ץ+ß©2˝ú™ţłÓÓJŐőŤRŰíid¨±ŔX…fcŽOδµ+›+ż‡Mah,Őµó!W,ˇöF{Ž+/Â:†śşn«¤ë5˝˝ňˇYŐ le9źOʬꗚ-Ż‚äŇtŰ纸űX™™ˇdňŕ‘ž äçŠ$ź7Ě$ź7Ě»˘č±ZřfĆý47Öo/ËÇlH:ć±üyŁÁĄ_ZIiŰEwŰą$ÄÝמ}*îź©iÚ—†ětëÝRm*ęÉś,‹:ČŚsÎŢăüő¬?Ë`÷¨š\÷7FLÓ±&Fî@=µż6ŁŤůµ6¬<]µö‰9·”®źhÖě1 ŚŹŇ¸ę*摦^k„V:l =Թ٠g“Éă 5ŞŠ[(¨ězŹŚ´ńŤá­Iő]7I ¦G¶żśFÍ·'ruČ9ţUäUč”C¨h6˛ş}¶ŰKŠĐä# ńü˙Jć| Ł®˝âÍ7N”1†is(Š 7=¸¨Ł ŠŰń¤Zmż‰ďíôHĘXA'”™rĹŠđÇ'Ôçđ¬J@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@O{˙Oř*‚•Ýť‹1ËJ(˘€ (˘€ (˘€ŇŰĘ$‚GŠAёБřŠk»;–v,Ää’rM%sIŐ/t‹żµi·oq´§ČŻZ¦y94Q@Q@­őŰx„v÷—1F:*JĘŕ VGdutb®§!Á֒бsyt.®®&@rI }y5^Š(˘Š(˘Š(˘Š(˘Š(SH×ő=")#Ó®|”vÜĂb¶Oâ TÔ/®u–¸˝™ć™¸,ŢžžŐZŠ•N*\ÉjSśšĺoAŃI$2,‘;G"ôe8#ń˘YiI]žF9fc’Oą¦ŃTHQEQEQEQEQEQESˇ‘á•$Śít`Ę}éM˘€-jš…Ţ«}-ćˇ;Ďu.7ČýNčU˘Š(˘Š(˘Š(˘Š(˘Š(˘Š)đM-Ľ˘H$x¤©¦Q@ îÎĺť‹19$ś“VôťR÷H»űV›pö÷Jy‰Ś€zőŞtPy94QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=—ü}'ăüŞ žËţ>“ńţTQ@Q@Q@^Ń!±¸ŐmâŐ®ÖÉŰL‹¸ ÁÁÇ~qTh ‡ĆźĂ“[8ž;Ý>í<ËkČ‡É ţ‡ŰŢąęô/0Ţ|ýđɲնD}@Oţ†kĎh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(d ®Ár‚@lc#Ö’Š(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*Ţ‘§]jú•˝…„~eÔíµ dőęjĄ>d†A$.ń¸čĘpGă@…ă§¶đ÷tßÁsĹúÎo/š#•G €™ď×˙µçTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPEPEPEPEPEPEPEPE=…ťĆˇy Ą”/5ĚĚ#AË‚ŠěµŹ†ţ#Ň´Ůog¶†Hˇ¦XeŃŚg$†k’ł€Ý]Án®ŇşĆÎrq’{ ŠŠŘńf'†ő‡Óćş·şeE2ĘóŰŘÖ=QEQEQEQEQEQEQEQEQEQEUÝ?J˝Ô-ď&ł€Ë¤~lěדüŞ•@QEQZQč—˛iö—¨Š`şźěŃĂ%ýíCinmµ?†u(.µ+ybA&ź–ś`)Śzđjhď®jBÎ+-ء}ó6ŽßZ\ĘמĆeůă0Í$e•Š1RTäÇҬI§]ǦE¨<$YĘć4“#‡QŽ˝©ÜEJ*ÝkŚVV*­q&J†`Ł€Içč*›)V*zEú”T–ĐKuqń´“JÁd±<+§ń†,ü3gĽú˘\k¬ęgµ‰~H®p[»gźJĺ(˘Š(˘Š(˘şhÚn»u5•ö¨4ë·Ú-Ótr9<«ݰťsôUísI»Ń5[Ť?PŹË¸…¶‘ŘŽÄz‚9F€ )QK0QÔś ŘŐ|5©ézĄ®źy ­ĹÎŃŮmŁź­&ŇĐ,cQVu+)´ëůěî€YábŽČëU©îEPEnč>Őu»fą˛…Ů[o›+„R}zŐ gI˝ŃŻšÓQ„Ă0€Č!‡¨#¨ĄĚ›µÇgąFŠ(¦ ˘Š(˘Š(˘Š(˘Š(˘ŻĹ¤ÝËŁMŞ")ł†Q¶áÇăÓ‘ÍşMÝΓw©F«öKR«#–8ô®‚Ĺ (˘Q@×Çá,Ľ+ýłâ @Y=ĚNÖa3$䔟EÎ?Úą (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š 8R°S¸Áő¤ Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(®›áĄŤ¶ĄăŤ*ŇţžÚWpńżFÂ1ţ`W3]ĂťJÓGń¦™¨ËäÚBĚd}Ą±”`8ž¤Pik/‚ő-OVđýĆ“kĄE•mő).pĆE8–ŔëŚă¶+'á‡-µ+gV»Ó_UkE·±F+ćČŮëŽĂŹÖ¸­jhîu‹ůámŃK<ŽŤŚd$k¬řyŻéöZnłŁksŘŰj †;¸T“ ©ÎpĽŕńů{ÓcÇ^ĽşčĐ[@Ô!ąÍl”‘á€íÎ?_jźÁZ đZ­—‡ˇń§-Ă$ńI.<„ĆßôĎÍí\ď‹eŃm´Hě¬5ËýoPywI;HQ@ł“ďźZ›Â«áÉ4x|E{áíq‰¤UvIWŢ‚T»hŁ–s#(ľ˝‡BNsÉô®Gâ_,5Í[FŹN¸’÷ěP,2^Č›vČçßń5ÜxŇ/ Çń!u=cW–ÎęÇĘ‘í|†q9P °éŘí@N“ŕŰKŹŠóxzWsa ÎÍÎĆp\ţC?ZŘÓ—ÂŢ3Ć™§č1é“ÚŰIqiu„— ÇĚ0:äuĎéXZ_Ť ¶řŁ/ĺ…ĹśÓ8d,#a´¨ŕÖŐ•˙ü$šľŁ˘jÓj7—–ďµ·ŮŮ!ń÷‰ŕŕř”›đîÇF x›SÖôő˝>KûВI?.G@Nö§ř’ŰEÖţ'´­.=*îÚđZÍLJ8#9úňż­exgY°˛đ'Štë™ö^^ůgŹcűX“ȉ–zÍ„ /´wźŚşŠÎ‘lnSjŚîĆ:Ćs@G‚´;Aŕ8µ[/Câ-N[†Iâ’\y3Ś/ľ韛ڸ˙Ga>»ZV‘uŁÎę©=ĄŔŔY ęąç—ҵ<*ľ“G—ÄWľ×šEWd•sĆ6ăc©ëž(řťâ[-[RŇ•s%ëiöëŢËĆťÁÎpF{gń4ŢIá-;NŐ­t4đl·úsKŤU¤műrÆyÇôŻ>Óf·đĹ&3‡žŇĆâHň/±”€~ 05ÔjşÇ†|E©Ĺ­ÜxŁPÓ‘ Ö›I¸°°ŕg@?…q:.«˘ĹăGĽŐ,ĄşŃĄwSíćHŞxV'ą~´ÖÜh×öcW×üŻĂ©[Ü#µÔ +L±·Ěw#g=ůŔ>ťë‡đ¶±§i-ru=ßV…Ř&§—Śç®Gĺ]ľŤuáIŞizěúĄĚÖď ˝§ŮŮ1»}ÇQíô5ĹxkMĐŻ˘ťµÍy´§V5Ź6ńÜĺzP§ĹÍ2ËIń¤öşmş[[,Q°Ť:Wš˝đňćÇR’ËE_ Yę7™c%Üł2áwY€€ő«.<+â ëÍfÇÄlמR¬vźb”*1÷ČTŢÔ|/eŕW±_+WľČ˝śYË+„É€1ŽA=OŕĎ|G:%ĎŠÖĎÂÖŃCo3F~I$ÜrG· gÚ˝O iÚv­kˇ§eżÓ"\j­#oÜĂ–ě3Î?ĄyżkĄiw¶­áý`ęŠ>vŰ4;­z«¬xgÄZśZÝÇŠ5 1YÝi±¤›‹Ś+qÔřP›řłJ]ÄşŽšŽ^;y™ŹR˝F}đEdŐÍbâ­Rę{Q0·y ŚLűßomÍÜâ©ŇćŤ5Ą¶­i6Ąnnlă•ZhAÁuĎ"ŻřĆűIÔuŮn4 ±±eP!lśrp 隡Ł%”š­˘j˛É J˘y#eLňG˙¨ţ5Ć0h¶ÚěŃřjć[ť8(ÚňťŘä ‘řPŽ’ŢtÚÉâ#}·÷¦ŘĂĺç?Ă»śck/ć@3A˙Ňęb-§Íű~Ěç¶ÝťľµŻ¤|C×´ť6 7µđ.Ôßn¬qśňOÖ˛ĽOâ]GÄłA.¨Đ—…J§—N Ď8  ZęţéöšŻŤ¬m5{gY FÝ#b?Q\Ąvż˙äˇéżîË˙˘ÚłŞíNMvoI‡Ă^%ÎŤg˘-”¶¶ňMkx%fw(q–úätę+#á͆“q¤ř–óZ˛qŮ[¤¨»Šśĺ¸tÎÍjé÷ţđŘÖuK Nk«ű¸d‚ &”ÂXňşséë\ď„5{?Ăž(µĽźËžöŮ#v1ŢŔ¶F@Ŕę:â°I¸»^ÚÁöł7†őŻĎgek¤jö“* xçÉž3§“Śúv÷«6č~đn‘©ęZBj×úŁHÁeŞĆqĆç‘ůűWžW Xßř{ÄŇô­wR“KĽÓÄrů *ČŚrGséŢ®pĺIkk˙^`"Đt¸|Uá‰ôŘ išż‘1¶rNÍÎ.zăů×AŞAáË(5©×Ă–¬tťA-Ń|Ćġř;˝qÎŇążřŹKąńG†×Ni“Łů ¤S—U`Y±× úÔşç´»«GÖç˝Ô˘¸·[ č'‘ÇĐŕÖ|ł|·żô˙Č ž"ŃtÍ?â„úcŰ]>˛«}žŃwČCFbŚúś}+­˙„zĎYÓőh'đ|şŰŰĽö—e›q+Ń_=IôçżÖ˛×Ĺú<o5ż5ĄÓ'ŚD· e”‹¸)ŕ‚:Tú.­ hsęŹ?ŠîőYnm%Š=đJKcÎrÇ× ç4ĄĎe˝ě»˙_xLJ4Ű;źř¦ö{t{«S“!ꛟZ-4Ű7ř[}¨´o“RXVná6)ÇćM?Ŕzľ—ť­hşěŇ[Ůęq …ü§BH$qČüŞÇ‰5-Mđd~ĐŻ_Qy.ľŐqtb1®BŕĐ~^ő«rć·šű€č>ëZkxk]UĐmŐ­4ŕnJŇđCqĆpzzׯjZÍÝŞéš<_đŽBÁÉ#äqŠÔř{«é¶Ű:ĚŇ[ÚęV†ßĎD/ĺź\OSY:í®—¦^۶…«ťMŢÎmšŚ ÖĹFŁßńĐoađ¦‹â‹_ K ­Öă3ß<Ě$ß  ÷‡CßÚĽëĹZbčŢ#ÔtřÜĽvó2#Ą{g߯B»Ôü¬x’×Ĺ7z¬ö·)ĺË5‡ŮŮ‹H€c 8ÇĘ?úŐç~&Ô˙¶ĽA¨„1­Ä¬ę§¨÷Ć)Qćľ·Ű[÷2˝+Ŕ0‹˙ ŘÄÜý“ZŽ˘ěĎô5â¸|+…Łż‡®'“RdlW €p3śŚśôăsá˙lt}+[Šţo.Y=°Ř͹¸ÇŽŁ­kY7 †ú›şěćOëş±ű×ö RĆţU‡đö]'PÔ,t{íŢyd2nşiă…f~¦ę~ ±źá˝†›ŮÔ•Ő&ŹcpŠÎAÎ0zŽýé| ŢŇoě5kÝtÇsröżdŕ•eĆń‘ß=++Z »ÝŁ“-¶«ąáYaŠ|‰Ŕe ÷Ĺz=ć·ĄŻ€¬.›ĂöÍl÷l‹jem¨Ř?6q\O‰-4XK¤ëPy]‹§Ůž-ŻVëZÚMř>-VÔ$ÓĄ·ą3¤‚•\xŔúšąĄ$źů“.‰~ÜCuńÚkkeµ…Ä…aV$'îŰŚšą§¦âőŤ:ŰI[I­`’{{ˇ!g}§o®AÇ˝cx:÷MĐüoÄ—»ôčLŠ.|¦BŰ‚G&™ŕ­VĎMÔőIŻfňŁžĘhŁ;Knf#íJQwmvCOŁ.ü‰eřŤ¤‡ ć¸â6Ĺs:íÄ—zŐýÄÄ´’ÎîÄśňXŐďë)á˙işś ˇ“÷ë±V?‘&µţ"ř]ô»¶Ö,&ŠëCÔ&/oÝ3QęÚÍ…ÇĂ=IŠ}Ú…µÔ˛KĆT–ÁÎ0zކą(dhfIc8t`Ę}Ĺ{¤žÓ´íZ×CO˧0D¸ŐZFßą‡,1ŘgśJát?ŰMńUü=tÍ%ŚH[ś3˘©eŽç€qď]«¬xgÄZśZÝÇŠ5 1YÝi±¤›‹Ś+qÔřW ř–=Çi­YĂ<–«+˛o‘Ł`W–=[?Z`vŢ“Â~'˝× Ăvö’YŮÍ%»¬ŚDЏŠŕŔŕţ&Ľ€޵î“ĂŤqâIü=a©ÄeÓć–iŻU"~í1ęryţíywĽ-yâ‹÷†ŐŁŠŢ=Ěň0U‰ ëďĐ˙ő¨ŁřĽ˙j˙„^ţAţ‘u¤BňS×úšóÚě~)kVzżb‹J3OÓíŇÎ.rĂŰś~SŔ0řnmRuńtŇĹh!&"›°_#®ĐOLâí·ü|EţřţuěŢ,EŐuĘ€n4}NŰ8ëäĘ#?úňŻs _±Ű¬ż#0ä®x'ßčPřłM‹âMő˙Ú7č÷q¬o'–ß‹·á—;Ö5bŰşč\Ů”eŇ"×>+]ŘÜ5Ă´›N UÇăŚVĂř~ßUµÔ  I¤yĽ¶·[›ć+Ń[=s\ě>#µ±řŹ6łi¬^gÉU ”`F@8=óřT÷­ [[^O/ő‘H¶µA$e ţű T5-=JÚ‘řcFµŐ´ ű:•Őă†gç- .H?Žjö˝Łi–ŃxŽúŢŐ>ËökWłá ˝Hü‰Ş?µűĎWŹP”Ł:,¶Ăkʡ°8ui5­~ĆëŔ:m„“¨‚‰p›Xa#ß·ś`ýáĐÓj\ţBV±6—>™â YhwZŠé—–R;ĆÓÝM¸“Éěy˙őÖW‹ Ömµ++zA0‚5KwP6´YŔĂ éßšµa†u]ÎŰł¤j6ůY$qž§ńţMCăMbĘń´»=%ä–×M€DłČ¸29ǧŞ?‚{·ÓađŁęÚl7ł E-ÇH²ŚôúźĆ­h>"Ňíu K=Öı¶š;ĺ±ŘĚĎQÓ5ŹĄę¶Px5ěe›mŃÔ’ăfÖ? P Î1ۧZV–Ú˙MŽčÜń6•¤®‘âH¬´ô¶—Hž“%śHŘ ç°Ď…Q𭵯ö*Íoá›˝fů¤"G‘H…ŃHęzv©5ť{M¸¶ń’Csąµ mÚŘyl<Ŕ­–íĆ®*EŐ4­SÂúM¤šäú<¶*RX’'a.Hů†Üsőő4.n[?×°is3â&ŹmĄjRY[˝¤wvë3[9$ÄÝ×üű×C®·†´-~ÖÂ] cž8ÚyšVXn>Qí×>őĎxűUÓő?ěuŇî$ť-­.Ň© őĎSô¨> jvš¶Ľ·:|Ţl"Ţ4Ý´Ż r0@ŞQrI?16•ě]Ó,ôKo2iňy7şLÎaŠ@ű‚î© $—?Z“Ađü~Łâ µ¨ÖşLl6?I Â~ÔW¬Q)!Č#¨5é_5‚ŢŇíÚ! ÝÝÔá@\ýH˙ÇiÉ4ŇOq+Zć?€ŹŰôĎhÇ“siçÄ˝·Ćr1ůŹĘ“R?Ůż 4ËQňË©\˝ËŽĺWĺű)¬ŹꉣxšĆöv+ąYN Â0 ś¸Î ąăýVÇQÔ­bŇ$ß§YŰ$ĄsÜś ü(q|öé¸_Ý7´- +O Xjč ­ŢŢł–ŽŘPťĎůéXţ=Đ`Óu;cÚÇ} Éöy &'ryÇOÖ®iÚ¦›Şx_OÓoµyô‹»p’¬lë*1ÎÓÔ{ú{Ö‰nl?´ ţǸşąŠPgąbLŹÔAíJ<ÜÚŤÚÇY«?†<=¬¦…uŁ-ÄQŞ-ÍăČŢ`,Üô+„Ô"µ]Vh´ůZ[?4¤`A+ž2zîu+Ź kÚĽzĺţĄ-»2ˇ¸±03e`0ă?¸MVkyő+™l`ű=«91Eśí^ÂŞ—ťĹ#¶řă+˝¸âkhŁŤ{Ś˙ZóúőŘÂi¤ĂâÍHä’ PşŤ±pAË`őĎŕ+ËëRŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(˘Š–é'eQ…ţTQ@Q@ ¬U)Á"®ëz˝öą¨É}ŞOçÝ8źb®@(ĄQ˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ »Łj—š6ˇö›7‘uBľĐŘČ đA ŞTPŐô`+±wfc–c’i(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ›'’bóĘ-»f~\ôÎ=i”PEPR[O%­ĚW6ŮbpčŘÎÍGEu·ŹĽO«XËgŞÉ%´Łk˘Ć‰¸zŞ=«šYdHŢ5‘Ö7Ćĺ±Ó#˝2Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š®jÚĄćŻwöťFo:mˇm €:U:(·P (˘€ (˘€ (˘€˛DXĹ#ˇe*ŰN2P}©”Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPSŢ˙ÇÓţĘ ©ďăé˙ĺ@QEQEQEQ]_Âý>ÓUńµŤ¦ˇĎlë!hۡÄlGę+ĄŇađ׉FłŁYč‹e-­Ľ“ZŢ YťĘeľą:ŠĘuT]¬—Ń]ĎĂ› &ăIń-ćµd.㲷IQw9Ëpéśš]fo ë^ žţÎĘ×HŐí&TńĎ“•‹7„,n>/͡F­śJȇ/”h?SŹĄLk§{Żëú`yÍYÓlnu+člěb2ÜĚv˘ăřń^ł'†mu›=VÚOˢ}ž–Îđ;|Ĺz+ç®}ýë›řI©ŮAâ )´g»–ŕ´wŚä4Co@:‡óŁŰ^-Ĺj€án`’ÚâX']’ÄĺOfUŰÝňËH°Ô§E·Űü’vśŽŐŃřď[Ňî®ő;;ŰZÝ­Óx’±f!ÎN1Žkˇ¸ÔtÍ3á·„§Ô´´ÔĺĚëRČUo;ă©ŕő4ÝI%m˙Č*˘»?š5…¶Ł¤\čýžŰUµŽá`$‘7lžÜŹÖ»ą<+§éú­¶ŠžšţŔ„IőC#ÜÝ\c ç҇^)'ܢ˝Âľ˛Źâ´šôBęÎ'™BÉü@)*N;ôŞ?´Ë-KXÖ"ľ·IهOžXŐż…Ô®ëMŐJďĘŕq´Wsđ·G±Ő.5Yn­P»µ·ßkbňl1ÎyöŔöć›ădštI?…®4-XIĂ&|™ż^˙OÎźµ\ü–˘ŠÁ´Ş´đżud—1ÚĆľbďHžUWaěő®bx¤‚gŠdd–6*ĘĂÔô»ä‡ĹúĄ¶łáíZ;mb4]¶Wk^~Bx#đÇŻzĹđťŁę˙<ŹŔ&ťÚ_´Fę.öGjŃĹlŚ#QŮąt8ş+«đťiŞj±Ţ@˛¤V3Jż…\ÖŻxNßL‡Âo¨ßi°ŢĚ5·a# Ę3Óę•—*‰5čţ'Ň´…Ň[ۨő Fămł7Xă^¤}H#ńązŹÚ+ا xKV×-šćĘęŰ|Ů\"“č3ÖłuŤ.óGľ{=F ëÎ Č#±uÓřĄÚ?‡Ţ‰#=ŮGBC üxţtď g´đ¤˛ťňI§GąŹSÓŻći¸«É˝vwü&Šő]a|3¦xĘ=č1H— I)‘‡–_m‘ëžMq×KeáŻj6÷ęVŃ3F‘ĘĺqČ äwŹĆ‡ujólŚmOM»Ó'Hoá0Čč$U$©čxŞ•ę?µ­6×P·†çA·ş•ěŁe•Ą`Pŕ;W?đăJłÔ§Ô¤ąµ[ë›x7ŰŮ´›­ÎyöŔüčq÷¬…Ż“šHă«cÂ:ľ$ń ¦• «NNd#;TÄăżńZţ0‹aÍáÉômL?sĺHźŹĄtż |4°kşn¶5ť2fŽ)%űoą9Ť†ÝťŹ5-YšF\Ęçâű NÔVßBżžůšIcهŚQXUcQ—ĎÔ.¦có%gŘz®I8ŞôŠ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€rI=袊(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š( ×ŕßü”=7ýŮô[VÎźáo ŤgT°Ôćşż»†H ˛hL%Ź!›ˇÁÇ>žµçÚ6©yŁjßiłyQä+í Ś‚Đš¦ě]ŮĺäšĆTą¤ŰzŐřCW±Óü9â‹[Éüąďm’8cě dd Ł®+“˘ŠŃE&ßp=Ć˙ĂŢ đ†—Ąkş”š]ćÎ#—ČiVDc’8čxźNő|GĄÜřŁĂk§4IŃü„Ň)ËŞ°,ŘëĐ}k˘ˇQW˝˙¦ ëž"Ňî¬|U[ž÷RŠâÜyl7 <žGCR^řľÂŰâäž ´vąÓ[j3*%L*„€ŔňŻ:˘…F+úô˙ =P“ĂV–·÷1x›RÔÚTakf‚HŠÓ{ ~®OÂśZ7‰´íBuf† C8^»z~u‘E5M$Ów¸wŚíĽ9,—š–ŹŻ=ÝÍĹÁ“ěŤhé´1$üçŠoµ{ĎxcO·ź}ĺźźçDZ†ÍÍ‘É$żÓ•‘ Îś‘ČX°ap3ŹOĘĽ¦ŠNОłŘ§Ă>!µŃĽy®±Ü•ÁY|ž[ą'ąçđ®’ ď řb-jűGŐdÔo/íä‚ŢßěěžJż]ÄőÁňŻ2˘‰RR{Ńř9t)$şŹ\˝şÓç* ­ä °ŤąÎŕ9=żZé›u§»ě—É2,Ç$qĐô‡zĎń¦Że©juľ•˝¬l Khäq‚ř•ËĐ ÔQÍĄSIÜőßÇáÔńçŰőMJK[‹CŹoäł © :v{Wšx“Q][^ľżE(“ĘYTő¶ VÔ®őkçĽÔ%ó®\Ď´.p08‚ŞS”®*tů»ÔďźđţUO{˙Oř*‚€ (˘€ (˘€ îţ˙ÉC±˙®r˙č¸Jë~ęö:Śí/µIü‹TI>Ćl„Ö€=7MŤu wţX٪艶ôĆQ\/Čך|:´°¸ş˝{ÍűZąŠ0mí`Sĺ–9ćFO^őŃü6ńž™ĄřcWÓ5›~ń¬ÉŤ›;Ô†_”rçÖłľkšd>Öt;íR]âňD’+čŃ›¦>S·8öűĆ><đő«ř%5Ă Q†äA%¸'lG ÔŹČÖΓŁxuŕĐl.´8%’˙Fű\·ʸe\ńčO9?JçµýkC‹áÝΉe®\ę—íxł'ŠEŢ03·vpŁ ÎsW,<[˘Eáą$˝ÂZhŤg9ňźä”®ôçžăŹzÄńÍ……ÖŹá]SJÓáÓäŐXމٹT~µŢIá-;NŐ­t4đl·úsKŤU¤műrÆyÇôŻ6×ő«Iü!á K)÷_ißh3¦ĆYi—’0sŽŮ®ĂUÖ<3â-N-năņ¬n´ŘŇMŀƇ8ęü(ÍüYĄ.‰â]GMG/ĽĚÇ©^Ł>ř"´|OŞxzűEŇ`Ńt™,Ż @.fb1!ŔĎsžrrqXšĹÄ7ZĄÔö˘anň™÷ľŢŰ›ąĹmřž×ĂhşLšőÍƢ雸ĺRśsŘ`ç#ž?2€ć(˘ŠŰ˛Ö–ŰĂSiž[™é.Ŕ?Jg‰uDÖĽGq¨GF“2aXäŚ(_éXô±IčĄĘ“ą<©;ž§âK­řči÷şJÜÉtŃG-ĂČABŔÚ@=ů®*ag x›P‚âÉ5 xťâHĺr¸ä`äwÇŤ^ńŻcwńNŢ}öK<dŘÅ۸ŕŚö=«ĹPßx‡Pşµ}đK326Čúk(FÖ^FpŤ¬ĽŽÓÇz¶ťo}oƉÄŹfڞ´¬ śĄc|9ľ´‡Yłµ—NŠk™'Ę\—!ŁčCĐţu6»q ëđ[^Ë«IgyŞÄÖÍlĎą”Ś85Îxný4˝vĘöefŽ0^¸ďŠ#rÂŚ}ĆŤoę–7öĐhĐ[Ü †ĺd%Žäă§5 «Łi^Ń5 ť*;ËË(!¤*¤<śu `­exž ŢćűLÖćy¦/öf¶d*’~cÁĹoKo¦]xĂę—ŻbIÇ0Č>˙*@őČçÚ‡d–˙;$·ü{ž8Óě­fÓď4ČŚ×öË8‡9ŘOP?Jćk§ńuő®«}¦Xh»ć‚Öµ‰Řm26qśĂ­E˙Wč/ýöżăWZ+™—Z+™x&Ň ďX[]Ć%‚F`Čz”ščmßĂ7··úDş|6 CzóĹÔŕž9ëŹÂ±|;˙˛ ŻŮŰ2än+”8űąő‹¨Hł_ÜÉĘ<¬Ę}A&“\Ň\Ň:_hĐ^Úęw÷RjŃPEjŚGěO\sеâť#áĄŐ˛_H»Žq°díu#†ôçŹÎłü!ŞŮŰYjzfĄ<¶°^޸ŤI12śŽ8˙ ŹÄ ĄÁ¦ÇogŞ]jwlűžVÜ‘Şú=O˝Kż8š|ć׆´«řEţ×GMfůćd–6|y*:|Ł®zţ5Îx—ěMŞF,ôëŤ9¶5ĽŮů_ľÜóŠ˝ ¦ŚútMýłuŁęÄHáY–EĎŰŚvęi|q«Új·ÚzŮĚ÷BÚ‰î¤M¦fĎ\ýfšż0+󝬞Ó|\š9Ń#‘'hŇIL¬<˛ŘhüŹŻ&°4ď ŰĎă÷Ѥv6‘Ęů9ůŠ($ ţBşÇ 'ŤÍöĄ¨Ém=©ŤŢ%›Í ¤0éŘcÚąKÇŽß[xźěňJĺ}ŕŚüŔÁ¨…í§b!v´ířš–Kˇx‘u++=%lf‚žŢt’Ű{0>ąŞµÓ@×oµKAr-<¦EÜTä“ĆG@N«¶×^đúj7z^Ł-íÍĚ/ y žPoRz㍢j6¶Ţ×ěç—mÍדä¦ŇwmbO `~5VvvżB¬ěí~…ýj 3Rđ‚k aq ĎŮĄŽ6%XmÎyúŹÖ®řkJ·˙„Q/íttÖožfIcgÇ’Ł§Ę:çŻăXpj6«ŕ;ť9ĄĹăß –=§”ÚsŚuµ>‚š3éŃ7öÍÖŹŞ##…fY%[I5HŇĂNźN¨YmćĎĘţŮçÝIáë;-J )|5-噓jŰv㌰Ç@3ÚąOë6şŤîźöŢäÚ@±µÔ‰´ĘŔç8?ç“[†ˇˇkWéŞ\k—v;•LöI’H°ŕgťě…+´żŕśnż`4ÍjöÉX˛Á+"±ęFxĎľ*…iĹc>·«\G¤[Í6K:ُ.=I=O"Ż˙ÂâúK˙}ŻřÖĽÉhŮŻ2Z6Zđ™i¨M¨=ŲŢÜAř-M‚VúűqůÓźýz˝©xj źé‘iÉ·LÔQ.1—ýEeř×T˛ľ¸±¶ŇŮžÎĆÝ`I`ąN>•Ńhz»Yü8¸ą™?Ň w´ł”őýć ÇÓ“řTľeÉ|Ę)śÝÖˇĄÚřšúh´¸.tđLq@\ŞŚ7çŻ8?ťtţ;Ő´ë{ëx®4H.${4e•Ą`Pŕ=+Íëµ×n4~ kŮui,ď"µXšŮ­™÷2ч&ŞQIˇĘ)4ĘţŃ ˝µÔďî,¤Ô ˘ ŠŐŹ1Řž¸çkĹ:,GĂKŞ˙dľ‘wâ)`ÉÚęG éĎťgřCUł¶˛ÔôÍJym`˝T+q’be9qţKMŽŢĎTşÔîŮ÷<­ą#Uô zźzNüŕÓç6Ľ5Ą[˙Â(—öş:k7Ď3$±łăÉQÓĺs×ń®kĹ&Ěę ö-:ăN`η›?+÷ŰžqZ hϧDßŰ7Z>¨ŚDŽ™d\ńŤ¸Çn¦“Çš˝¦«ub¶s=ж·=Ô‰´Ě޸<˙úÍ8ßś#~rŐ‡‹˘¶ľŃ'6ň•ÓíÝ€#ć$‘úWE@$ÖŠ)lh˘Ł°Q]żÄÍJđŮŇtëßűKěË-ě…É:CÄWL ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*{ßřúĂůT=ďü}?áü¨ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ­Üj7W¶SKşÚ×w’›@۸äóŚž}jĄXVH9Tźh›ţzÉ˙}ŽŠ+1f%‰$÷&’Š(˘Š( GQEkTÔ.µK×»ż—͸p>ĐąŔŔŕ: «EZµ‚Š( aEPEPٞŁ> âźçÍ˙=d˙ľŤGEQEQEQEä‘Đa”{Sh ´Ň2á¤r= L˘Š*äÚ•ÜÚm˝„“fŇ-a@Á=N@ÉęzŐ:(°¬QE (˘€ (˘€ t2<2¤‘ť®ŚOˇ)´P­SP»ŐoĄĽÔ'yîĄĆů©ŔŔýŞ´Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÖŠ(˘Š(˘Š*{/řúOÇůT=—ü}'ăü¨ (˘€ (˘€ (˘€ ž÷ţ>źđţUO{˙Oř*‚Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(­hךţ«ť§*5ĚˇŠ‡mŁ€Içč+:»ź‚źňQ´ß÷&˙Ńm@Ţ‹ _k7w–Ö(Ť-¬/<ˇś˝EeWµx/ö:VŁâ«_Xj2ľťp­oŢ@Jśžz cń®[á‡-µ+gV»Ó_UkE·±F+ćČŮëŽĂŹÖ}]•ÇĂ}~ &mEŇĐŰC¸rł©!î<}+{Ç^ĽşčĐ[@Ô!ąÍl”‘á€íÎ?_jÎř]˙ Ź˙Řoäh€˘źnOaX?öŤu|!Łřö·†`•.Ú(ĺśČĂĘ/€/aĐ“śň})â”VĎŚ´¸ôOjzt ZyЎn»zŚţŻxźTđőö‹¤Á˘é2Y_@€\ĚÄbCžç<ääâ€9Š(˘€4-´‹Ëť1ďâE6É0€±`óŚ ~"‹ÝîĎY]¢ݗDĆńڶ1ĎNâ­ŮkKmá©´Ď-ĚŹt—ÁŕĄCâ­Q5­zëPŽ6Ť&+…c’0ˇĄJrą Ęć¨đ¸T°ŠŰhę~иţuŞéóéwŇZ]„& ŘÁ‡#=GÖş-+ţIľ·˙_Q1Yľ ´‚űĹ×q‰`‘2‡ĺ&ĄI«·Đ•&®ßCŠď-ßĂ7··úDş|6 CzóĹÔŕž9ëŹÂ°ü¤×-s¦]ęs"fxTě'ŐČä”ůô˝ŠçŇö9ú+ąńV‘đÂjźŮ ¤^%Ŕ…áÉÚęFCĎZ†Ú=+AđĆ›{¦¦Ły¨3˛ąUŤăŚwä~~Ô{DÖ‚ö‰«ŁŚšą¬i—:EűŮß*¤č 0#‘‘Č«ľ%:D—°Oˇ†Ž)c , źÝ?uőÜx—Ă­}ăk˝CRV‡F‚4–YŹG ŁĺäŇsµ®Ą­s˨­ý54ýgĆ0Fń%žť4Ř«c 9ęp}ë˘ń µĄśW°ßxR[H2ÁwnŰ„±éMÎÎÖ;;Xóę(˘¬Đµgauy ̶Ń#¶O2RWÖŞ€Iu5čľ Ő,…«¨Ň oe™›Ě?éçÓ>ŐÇę×ö—÷6íe¦Ĺ`«Ă,n[w=y¨Rmµc8ɶՊھ›s¤ßÉgzŞłĆ`ČČä}jťz§‰.´c㡧Ţé+s%ÓE·! h÷ćą]7ð\xőôgg6±Ěŕ~bŠ ô”j]]Š5.®ű­éoˇ[ęvşŚ/áą4Ż"–Úçs|Ĺz+g®kÍ*Ł5"Ł5 ˘Šď|5Ą[˙Â(—öş:k7Ď3$±łăÉQÓĺs×ń˘RĺWĄĘ®pU©aŁIyŁ^ę+smZ NřvĎ ©÷ő+žËKŇĽK}g«}®K8Y‘ ą]äämÎxéP§~†jĄú±đvłyeÜpFJ»É*©aë‚kžŻJń«řlO¦ŤF=Uźě1ů>ILůĆsß®q^kE99+°§'%vvëLą¶Ólď¦U÷{Ľ˘vś;U*ô tË}KŔľ:•µ€ŹĎÁź?>_·Ó­9K–Ă”ąlrč·K§Ç*"µú#ÁóŚÇ>•˛<®,"¶Ú:ź´.?ťXřŤŔşQĘ“$z|j$Oşŕq‘ěj-+ţIľ·˙_Q1QÍ'Ń<ŇqM‘xkQ“X›LU‡íQ'ŔĘ»qÇ~źÄ+AĽ®(˘¶ô&áyýk•®·Ćň-řWţ˝_ůŠrrM+ŽNIĄs'Dđöˇ­ b‘˛Ű$/ P3śuú]kĂz¦Ť M}m¶8YQĂ®}2˝ŕ›7Ô<)â[Xž$y<€VÚŁ O'đ©.R-Á†›ymswy* ‚O0F±ôéü˝é9ľkćů¬p´QEjlWŁkmáÝ\¶˛“EŠXćŽ6šV•‡–Ź”{uĎ˝bŘhľ=:]´âm7ypń¸l ]Ř :úfłUW±š¨š˝ŽNŠô·Đ­ő;]FđÜšW‘ Ëmsąľb˝ł×5ŕ 2ÓP›P{‹e˝¸‚đZ4›­őöăóŁÚ+6ŃYł“˘şź‹U˛ŤeđüÚF˘‚ąň¤OǿүŞčÚW„tMBçJŽňňŕĘi ©Ď'HëOźKŘ9ôNÇEu4Ó,áşÓ.t¨Ľ‹}FÝfŚzŚúr+vîé~ òéă&8Ą»iX>÷ő(öšhÚitŹ:˘»CµO§IşAqk’®×ţ Î? ·§Çˇkęş}®”-dµ·’h.D…ť¶ńó}r8ˇÔHDŽŠë<¦Zjjql··Cľ F“`•ľľÜ~tĎ‹U˛ŤeđüÚF˘‚ąň¤OǿҎ{”|ţ÷)ËQ]ö‹˘Ĺká›ôĐßYĽĽg, ± 8č;šÇń揕}i%¤mÜcnä“w^yôˇTMŘJ˘nÇ3EzuŢ•e¦Cf-Ľ3ý«§4*ň^F坲9 •çć{9łIßyňÖOĽ«Řz#>m‡ ólAW´Ť.ëVžHl‘YăŚĘŔ°QŚ˙:Ł[Ő×E˝¸ťăi¶ď zĆéU+ŰAĘöĐ«{ĄÝYXY^NŠ Ľ a!$.3‘ۨŞ5±«jë}˘hö++جŠĚO ąücŃŰQĆöÔ(˘Šc (˘€ (˘€ (˘€ (˘€ (˘€ (˘€Űs=Îi(˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š({ßřúĂůT=ďü}?áüŞ (˘Š(˘Š+«ř_«Yh~4˛żŐ&ň-#YI±›F…ő"ąJ(´ř­éúN·®ÜjT76ÄŰ·;2•Śŕőâ¤řyŻéöZnłŁksŘŰj †;¸T“ ©ÎpĽŕńů{×Evľ-—E¶Ń#˛°×/ő˝AĺÝ$ě]!DFÎOľ}j/†ÚŢ›Ą]j¶šÓÉ ŽĄdöŻ4jXÇžřôĎé\}Ńëşnc-›hZójŽňbE6Ź–8ÁËuŻRń¤^ŹâBęzĆŻ-ťŐŹ•#Úů âr 2aÓ°#ÚĽ-X«S‚E]Öő{ísQ’űTźĎşp>Ĺ\€08PJłâíUuĎę:”hR;‰‹˘žˇz űŕ Đń=݆ Ńt™4 뛍EÓ7qʤ8ç°ÁÎF<~g˘€ (˘€ (˘€:?Qµ‹Á:Ą„’âîyăxăÚ~`ÉÎ1Uü{o§xšĆîňO.Ţ&%ßi8ůHč9ďXÔTň«5ÜžUf»–5 kű™#9G•™O¨$×MáRĆ- SŇîď¤ÓeąetşD-ÓřNŢýfą(qMX%ŐŽĎVÔt¸ü.—k©Í}tn–RňF˸mÇËž€{śő¦Ú]čÚφ´ý;Uż}:ęÁś$žI‘]äôďÓň®:Š^Í[r}š¶ćωeŇ ähQ°·†0Ź3d›»`ôý+§ÔŐŔŃSěôµÉözZćý…¶‡oâx#şÔ Îż3Íä˛n8ÎÝĽśg¶|NÚ±u5ăř›,¨V u°*(*Űë\=8]Ţăp»˝ÎźÂ­ťµ–§¦jSËkęˇ[Ô“)ČŕsŹđ¨ü@Ú\lvözĄÖ§vĎąĺmÉŻ SÔű×9E>MnšÜ)QŠ:şőS‘IEQgˇÜßřgS×-üAs¨Ío:ě’[/!ł Ă1Ŕ˙ëW®ß˙jk—ˇJ ĺ.ő°üŞŤ1‚‰‚‰ĐřÓQµÔ®´×˛—ĚXlb…ÎŇ0ăvG#ÜW=EҲ±QVV čuťFÖçÂZ ”2îąµ3yÉ´Ť»›#ś`ńé\ő5{W±ĐřłQµż¶ĐŇŇ_1­¬#†Q´Ť®:ŽG?…~Łk‚uK %ĹÜóĆńÇ´üŔ“śbąę)r+X\ŠÖ č|I¨ÚŢhš˝´»ĺµ’eÚFŇHă‘Ďá\őÚ»Lm]¦t:&Łkmá]~ÎyvÜÝy>Jm'vÖ$ňă\őP•® ZáESĐřëQµŐ5µ¸±—Í„AnÚW9UĽ#«&‹â [éUž$%\/]¤qůçđ¬z*yW/)<«—”ěŻN…mow4zőőű:‘olŞńí'űĚzXţ]"G¸MZęâĘ\os,»äOjŢ… -q(ikť·µ{%đ˘é1ęÓk&q/ť$l˘% -É˙ëš·-ľ™uŕ_CŞ^˝‰&cÂ# űü©×#źjóę·q¨Ý\XZŮM.ëk]ŢJmnă“Î2yő©ö{Y“ěöł6Ľe«YÝÝiĐi,Ďk§Ŕ°¤®¸ŢG|·®oü3©ë–ţ ąÔf·ťvI-—ĚYĐ a‡ŕő«Ď(§ěŐ¬?f­c­ĐuűQńëĚmíťĺbJ–* >Ő[Áúť¦ź¨jrŢKĺ¤Örći9f#í\ÝůܵáĄŇ${„Ő®®,ĄŔ6÷1Áľ@äö­ĎjöKáEŇcŐ¦Ö.Lâ_:HŮDJ@[“˙×5ÄŃC…ÝÁÂîçg§ęZvĄá»:÷T›Jş˛g "Ćβ#ó·¸˙=kÄ’Ř=ěi¦Mssh¦ťŽdnäĐ{VE(YÜ,îwúLúŤÝµîźâ;Űt*ňYźđţUO{˙Oř*‚Š( Š( Š( ˝wĆZř‹FđÖ¤ú®›¤…Ó#Ś[_Î#fŰ“ą:ä˙*ňí#LĽÖ5¬tŘ{©s˛0@Î'“Ç@k·ř̢CAµ•Óí¶Ú\PÜF‡!gŹçúPžQ[ľŃ×^ńf›§JĂ4ą”Ĺ›žÜMń¤Zmż‰ďíôHĘXA'”™rĹŠđÇ'Ôçđ  J(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( §˝˙ʧü?•ASŢ˙ÇÓţĘ€ ˘Š(˘Š(˘Š(đM-Ľ˘H$x¤©¦»łągbĚNI'$ŇQ@4ťR÷H»űV›pö÷Jy‰Ś€zőŞg““EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE0*Ä0 Ž=¨§Jí,Ż#ýć%ŹÔÓh˘Š(˘Š(©ěżăé?ĺPTö_ńôźŹň (˘Š(˘Š(˘Š*{ßřúĂůT=ďü}?áü¨ (˘€ (˘€ (˘€ ďĽqáořnĐšťôšĂCŃÂŃ ŚŚĺ€ôÝůW^ń·ţF»OűĂ˙łS”đÜEĹű'.î--<˛UŕMě_#ÍiüCđíŻ†µ›k[ ‰® žŐ.CĘo·}rőč?ä?¤˙Ř*ćô€óú+·đö™ü# }m¤¦Żzó2ĘŚ˙ę”tůG__ưµÉ,cŐŕ’ßLšĐ&Ó=¤Ä€X@ďXFşśśRŰĐÚTb¤Ţţ¦sŘÜĄ„w­˛9ŤdČÁaŰÖ«WˇÝjÚzř2Îá´Xşe[5°§ćĎZç<;¦«ă d{DŽŇg?¸ Hiă={TÂĽśe)FÖżŕ\čEJ1ŚŻ{~'?O‚34ŃĆT»Ë“ÔźJěŕŢ^_iRXĂbCxóťŰ”ńśńϧá\ÖŤ}ibŇ›Í6+ŕřÚĘěĆ}=Ą\ją'h»ü•%Ż%oÝoM}'P{I&†fPř›#šˇ]Žě­ô˙ĎogĹ ˘‹ĐeFkH 'Kđ¶Ť}q¦Gwwpd3•Ru8ęq€>µ*˝©ÂV»—ů\§Fó”odżÎÇEt~0Óí-îě'Óc0Á}n“‰ÎÂ{*Ý»B°ń ¦‚úX— Ird!˶ăÓ‘‘ďíCÄ«&“w»ű·‡wi´­oÇcĎëµ±đ¦—a×uýR[fĽóÎbŢ\®GĚ{ ŠÎ—C†űĹ÷útW–d1»í’î_.0űąçšéľ"Ú Ŕ^ŇŃŢ„yć–çt-–'j·˝úVń—4T»J<­®Ç¤iwZ´ňCdŠĎfV€ÂŚgůŃ{ĄÝYXY^NŠ Ľ a!$.3‘ۨ«^Ő×E˝¸ťăi¶ď zĆéF­«­ö‰ŁŘ¬lŻb˛+1<6ćcđŻ.o#;Ë›ČǢ˝*ÇMŃŠiV“éq»Ýéźi’`ě2©ÓLąşÓď/aE6ö›|ŇX7;×wă˝[N·ľ·ŠăD‚âGłFYZVÎŇł|%´^ń,—Đ™íÔ@Ím»Îă‘ĐŠ\ď—šÂU/5Ž&Šě5¨4ÝK ¬XX%…Ä7?f–8Ř•a·9çę?Z}´ZN…áŤ6ţűM]FóPg!dŞ˘)ÇďČüýŞąôŘ|úlq•-ĄĽ—wpŰB–gXĐŚ’p+ˇńŽ•gow§OĄˇŠŰQfXçË'¨Ď§Jé%ŹâÍ?DŹK $2Ă›Ď0‰<Ă´Ž„r2=ý©:šh¦š#—Mą‹V:kŞý¬J!۸cq8Ć~µnçĂş…´:ڞĆ,RrĆ1ëÔUż\ O^\H†÷ĚŔď†ÍO¨řž;»_İHżÚsG"GČçňď'käěŃËQEfEPÝż…őK‰ěbŠ$/{ žd Éô¬CÁ®ĆĂĹŃ[_h“›yJéöŤnŔóČý+'ÁšTZ×ílî 6ć}§€ ÇăŚT)5w#5&®äbQ]Śş—†5omźL];b1µąŤ™Ůt 1ßß˙ŻUĽ#c§Ť3VÖ5X ÔV* ÜT;1ŔɇçG>—h|ú]Ł—˘şýfŰLÔü(5­:ÄXO Ŕ·š$rĘŔŚ‚3ő­K zN‡áM6ň÷LMBďQ.y!P§cż#óŁźČ\úlsŽ™s§Gh÷JŞ·P‰âĂ•=µR®ÓâĹ!đňنXÂ1c’ô×A'‡¬ěµ(4ĄđÔ·–d"M¨mŰŽ2ĂĎjźid›µ˛Mž_k—W0Ű–W¨'$ŕVťĎ‡u hueŤX:¤ä88-Ścר˘úĐ|Tń‚Ň%ťĐ+ęĘ­‘řâ´µÇwkâ– űNhäBHůśŕţB©·Ą¶)·Ą¶ŕmF×oÇUÔ¦±Ľ™Ň;M‘oWcžÓť˝ÇZĆ×tŮt}bóNť•ä¶•˘,˝¨«ž ¸ű/Ś4iĽ–›eÜ_»OĽß0{×QńCĂ g¬kˇÖôąžK'ŘÄ˙é ˝şöĎä*Ë<öŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(©ďăé˙ĺPT÷żńô˙‡ň (˘Š(˘Š(˘Š+Ôţ3čZśÚ„:ÄvŽÚl60ŁĎ‘…9#Îz°üëË*ÔÚŤôĐfĽą’#€QĄb§đÍM˘hÚ†ąxÖşMłÜÜ* )…y>â»/Ť±´^$Ňă‘vşip«Ř‚ů® Úć{Y ŰM$.F7FĹN=2(ąąžę@÷3I3ŤŇ1cŹLšßŃHkŰű^çJÔ•w Ě®ąăqŽÝéµOĂ×ZW‹mćk­öPČßżňŘnHo&°¨ŁŘ«I]ŮßńlďeuúßȲß\IĘ<ŚĘ}A5sFłÓn–S©j†Ĺ”Ťěí.˙^ť+2ŠŃĆń˛v3Rł»W;ɢj·W:Ť®°ZrŠßěÎ7űÇVfŻmqáŤŇw\[yŢjm#nćČç?…`ŃYB‚‚Š»vŰnÖěi:îNNÉ_ľć˙‰µkËmm%ŢöÖiź)\väsřWCiŞéĎ4ë粽ţÖi#VUÇ“¸7“×Ďá^[vŢ*Ö­lăµ·ľhŕŤvŞÓ }qšÎ¦ńJ}mżČŇž"Ňn~]/±‹>'Ő1˙?üëąşŇo5żÚŇ#_ašâKĄWPŃ|ĚyúsřŠóv‘ŮÝ‹;’NI>µ$3ۇM$AĆcÜ=:×L#ËÇ<ĺÍ'.äTQEQ'woŻé©{˘Č×8K}-­Ą>[|˛#oNzőV&­©[ÍáŻŰ[ËşęĎĎ2®Ň6pW’0x«ź˘ˇSKRw=PÔ4-jý5KŤrîÇr©žÉ#rIV â¸[ůcšöy ™ÉA#nlvÉîj )ơrť®»q ëđ[^Ë«IgyŞÄÖÍlĎą”Ś85—˘j6¶Ţ×ěç—mÍדä¦ŇwmbO `~5ĎQIAZŔˇecˇQµ_ÜéÍ./řL±í<¦Đ3śc¨ő­ K˝YđÖź§j×ϧÜŘ3ě“É2+Ł‘ÇCÓň®:Š8#Łń~Żiyya•˝­4řÝĆ ‘ß•t7z‡†oüCiâ µb›to%§Ä‡\wtŔŔéśâĽîŠ=š°˝šµŤ?ÝC{âBćŐ÷Á,ĚčŘ# űk2Š*Ҳ±iYXÝđ6Žş÷‹4Ý:PĆĄĚ pv(,ÜöŕoŤ"ÓmüOo˘FR <¤Ë–,W†9>§?…PŇuKÝ"ďíZmĂŰÜm)ć&2ëÖ©žNM (˘€ Ůđ†¬š'-o¦VxP•p˝vFGÓ9¬j)5uf&®¬ÎĆX<'§Ĺ{qëęrJڶÖĆŹË'ˇfă8ŞžÔ´řôýSIÖ$xmo•ť·–Ęr2'·ĺ\Í<šY˛y4łg[­_iV.Źt÷Í-Çź5ÁŚĆĽ ú –ŢďEÖ<-§Řę—ď§Ýiěű[ÉiÇ'ďÓň®6Š9·EmΧƺ¦ź{&‘ý‘+˘Źf¬…ěŐ‘=ü±Í{< Lä ‘·6;d÷5Uš—­QÔ|Yayaoć[ŘÜG%Ä…€®Oݰ=++ÇrC7Śőąm¤Â÷r2¸9,sŹlÖ0đ´ţšŮÄńŢé÷ić[^D>Iô>ŢőĎPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄH”S¤mň3€I8©´QEQETö_ńôźŹň¨*{/řúOÇůPQEQEQEQVôŤ:ëWÔ­ě,#ó.§m¨ą'ŻS@żo>~řdŮjŰ">€ '˙C5çµčľ:{ox7MđŚ1Ü_¬ćňů˘9Tr žýńŃë^u@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPO†Y!I Ľn:2śřÓ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( §˛˙ʤü•PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE˙Ů endstream endobj 181 0 obj 63345 endobj 182 0 obj 98576 endobj 176 0 obj << /Font << /Font2 12 0 R >> /Pattern << >> /XObject << /Image22 179 0 R /Image23 180 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 183 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 184 0 R /Resources 185 0 R /Annots 187 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 184 0 obj << /Filter /FlateDecode /Length 186 0 R >> stream xśµTÍNAîńFÝänĽ˛$6ýSýwÔ FIĘČŚ&DbpŃ/â«řľ źÂŻgťŢ]!˛ťŢ®ú¦««ú«Şž–ŠňxÔ ¬Ö§4!%•ŇÉG§¸Ý1ŻcS^NÉzĽjÍ›A1ĘÎBCsJţ?ˇ1ťÁÉ„¶7_N…“gl5|H«RT6Yş8ľ•«:Ú¤W““n=µÇęť–Ě4;›9€NAgpŠ5Ćl]‡ ¶6u™ťÚŘł;H-µ˝’Wö2:ÖÉa“Ô6izţS0ŽŢU!ç ëLâü“gÔ´µs~öÍĂĆü‹TÍć5a:#=SÝ%­ţHoiCĽŻÖÄ•¸ŞŽČfĘ6ÄŻĚRuŮKâgµ7"ľţ^Ő÷~ď#B¤í¶˝j­Ú­vńaďĎ&#zGő zZ˙ĎK•pXL 7ŰQý9;[‘‡żŐ…‰)°T .Díl[5)u6¨˝qŃI\Ł)ěK´(Č»r0Ţlű d­MG—JžY¦¸Ô Tl=?=<ţd¶Ď§¬­ ¦;Ŕ·Łyk ,Ł»†4‹ĐÍ&ŕ|•Ť—ŤŮmYl.Ňě &ŤH ki¶ tŚą}[ŚűN%yÓů4ÍéZnFÖ*ôn‰ü,ĄŻ§á\¶)Č1~ł hy/“`Ô\Č‚^Xĺ{çhűyÓŇŕ$mľ›żŐc—ÇoĂ„f endstream endobj 186 0 obj 631 endobj 187 0 obj [ << /Type /Annot /Subtype /Link /Rect [ 63.785435 61.39882 237.98407 78.19882 ] /Border [ 0 0 0 ] /A << /Type /Action /S /URI /URI (https://rss.com/podcasts/oat) >> >> ] endobj 188 0 obj << /Subtype /Image /Interpolate true /Width 2024 /Height 706 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 189 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔÂč"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ňŹřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â(˙…Żm˙BďţOţ"Ľ®ŠőOřZößô.˙äń˙â+Óţ ›o‰ßŰ?čßŮŮŢOü´3ůžg™ţî1ĺűç>Őňĺ}=ű˙Ěĺ˙n_ű^˘Łq‹hqWgŞ˙ÂŞ¶˙ ‡ţ@?ü]𪭿č!˙˙^‘š3\ľÚ}Í9Qć˙𪭿č!˙˙Gü*«oú˙ä˙ĹפQG¶źpĺG›˙ÂŞ¶˙ Źţ@?ü]𪭿č#˙˙^‘š3G¶źpĺG›Â޶˙ ‡ţ@?ü]/ü*«oú˙ä˙ĹפFhöÓî¨óřUV˙ô˙Č˙‹¤˙…Uo˙Aü€řşôš3G¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]𪭿č!˙˙^‘š(öÓî¨óořUVßô˙Č˙‹Ą˙…Um˙Aü€řşôŚŃš=´ű‡*<ßţU·ýň˙âč˙…Um˙Aü€řşôŚŃš=´ű‡*<ßţU·ýň˙âč˙…Um˙Aü€řşôŚŃš=´ű‡*<ßţU·ýň˙âč˙…Um˙Aü€řşôŠ3G¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]'ü*«oúä˙ĹפćŠ=´ű‡*<ßţU·ýň˙âč˙…Uo˙Aü€řşôŚŃš=´ű‡*<ßţU·ý?ň˙âé?áU[ĐC˙ ţ.˝&ŚŃí§Ü9Qćß𪭿č!˙˙Gü*«oúä˙ĹפŃG¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]'ü*«oúä˙ĹפćŠ=´ű‡*<ßţU·ý?ň˙âč˙…Um˙Aü€řşôŠ(öÓî¨óřUVßô˙Č˙‹ŁţU·ý?ň˙âëŇ(ŁŰO¸rŁÍżáU[ĐG˙ ţ.—ţU·ý?ň˙âëŇ3EÚ}Ă•m˙ ŞŰţ‚ů˙ńtżđŞ­żč!˙˙^‘š(öÓî¨óřUV˙ô˙Č˙‹ŁţU·ý?ň˙âëŇ3EÚ}Ă•o˙ ŞŰţ‚ů˙ńtÂŞ¶˙ ‡ţ@?ü]zE{i÷Ty·ü*«oúä˙ĹŇ˙ÂŞ¶˙ Źţ@?ü]zFhŁŰO¸rŁÍ˙áU[ĐC˙ ţ.ŹřUVßô˙Č˙‹ŻHŁ4{i÷Tyżü*«úä˙ĹŃ˙ ŞŰţ‚ů˙ńuéQí§Ü9Qćß𪭿č!˙˙K˙ ŞŰţ‚ů˙ńu颏m>áĘŹ6˙…Um˙Aü€řş_řUVßô˙Č˙‹ŻH˘Źm>áĘŹ7˙…Um˙Aü€řş?áU[ĐG˙ ţ.˝"Š=´ű‡*<ßţU·ý?ň˙âč˙…Um˙Aü€řşôŚŃG¶źpĺG›ÂŞ·˙ ‡ţ@?ü]/ü*«oú˙ä˙ĹפfŠ=´ű‡*<ŰţU·ý?ň˙âéáU[ĐG˙ ţ.˝"ŚŃí§Ü9Qćß𪭿č#˙˙K˙ ŞŰţ‚?ů˙ńuéŁ4{i÷Tyżü*«oú˙ä˙ĹŃ˙ ŞŰţ‚ů˙ńuéfŹm>áĘŹ7˙…Um˙Aü€řş?áU[ĐC˙ ţ.˝#4fŹm>áĘŹ7˙…Uo˙Aü€řş?áU[˙ĐC˙ ţ.˝#4Qí§Ü9Qć˙𪭿č!˙˙I˙ ŞŰţ‚ů˙ńué9˘Źm>áĘŹ7˙…Um˙Aü€řş?áU[ĐG˙ ţ.˝"Š=´ű‡*<ßţUżý?ň˙âč˙…Um˙Aü€řşôŠ3G¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]𪭿č!˙˙^‘FhöÓî¨óřUVßô˙Č˙‹ŁţU·ý?ň˙âëŇ3EÚ}Ă•o˙ ŞŰţ‚?ů˙ńtÂŞ¶˙ Źţ@?ü]zEŁŰO¸rŁÍ˙áU[ĐG˙ ţ.“ţU·ý?ň˙âëŇs@4{i÷Tyżü*«oú˙ä˙ĹŃ˙ Şßţ‚ů˙ńu颏m>áĘŹ6˙…Uo˙Aü€řş_řUVßô˙Č˙‹ŻHÍŁŰO¸rŁÍ˙áU[ĐC˙ ţ.“ţU·ýň˙âëŇhÍÚ}Ă•o˙ ŞŰţ‚?ů˙ńtÂŞ¶˙ Źţ@?ü]zFhÍÚ}Ă•o˙ ŞŰţ‚?ů˙ńtÂŞ¶˙ Źţ@?ü]zFhÍÚ}Ă•o˙ ŞŰţ‚ů˙ńtÂŞ¶˙ Źţ@?ü]zFhŁŰO¸rŁÍ˙áU[ĐC˙ ţ.ŹřUVßô˙Č˙‹ŻHÍŁŰO¸rŁÍżáU[ĐC˙ ţ.—ţU·ýň˙âëŇ(ÍÚ}Ă•o˙ Şßţ‚ů˙ńtÂŞ¶˙ ‡ţ@?ü]zFhŁŰO¸rŁÍżáU[ĐC˙ ţ.ŹřUVßô˙Č˙‹ŻIÍ{i÷Ty·ü*«oúä˙ĹŇ˙ÂŞ¶˙ ‡ţ@?ü]zEŁŰO¸rŁÍżáU[ĐC˙ ţ.—ţU·ý?ň˙âëŇ(ŁŰO¸rŁÍ˙áU[ĐC˙ ţ.ŹřUVßô˙Č˙‹ŻH˘Źm>áĘŹ7˙…Um˙Aü€řşOřUVßô˙Č˙‹ŻIŁ4{i÷Tyżü*«oúä˙ĹŇÂŞ¶˙ ‡ţ@?ü]zMŁŰO¸rŁÍ˙áU[ĐC˙ ţ.ŹřUV˙ô˙Č˙‹ŻHŁ4{i÷Tyżü*«oúä˙ĹŃ˙ ŞŰţ‚ů˙ńuéQí§Ü9Qć˙𪭿č!˙˙I˙ ŞŰţ‚ů˙ńué4fŹm>áĘŹ7˙…Um˙Aü€řş?áU[ĐC˙ ţ.˝"Š=´ű‡*<ßţU·ý?ň˙âč˙…Uo˙Aü€řşôŚŃG¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]'ü*«oúä˙Ĺפњ=´ű‡*<ßţU·ý?ň˙âé?áU[ĐC˙ ţ.˝&Š=´ű‡*<ßţU·ý?ň˙âč˙…Um˙Aü€řşôŠ(öÓî¨óřUVßô˙Č˙‹ŁţU·ý?ň˙âëŇ(ÍÚ}Ă•o˙ ŞŰţ‚?ů˙ńtźđŞ­˙č!˙˙^“FhöÓî¨óřUVßô˙Č˙‹¤˙…Um˙Aü€řşôš(öÓî¨óřUVßô˙Č˙‹¤˙…Um˙Aü€řşôśŃš=´ű‡*<ßţU·ýň˙âč˙…Um˙Aü€řşôŚŃG¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]𪭿č!˙˙^‘š3G¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]đŞ­˙č!˙˙^‘š3G¶źpĺG›˙ÂŞ·˙ ‡ţ@?ü]𪭿č!˙˙^‘FhöÓî¨óořUVßô˙Č˙‹Ą˙…Um˙Aü€řşôŠ(öÓî¨óřUVßô˙Č˙‹ŁţUżý?ň˙âëŇ(ŁŰO¸rŁÍ˙áU[ĐC˙ ţ.ŹřUVßô˙Č˙‹ŻHÍ{i÷Tyżü*«oúä˙ĹŃ˙ ŞŰţ‚ů˙ńuéŁ4{i÷Tyżü*«oúä˙ĹŃ˙ ŞŰţ‚?ů˙ńuéQí§Ü9Qć˙𪭿č#˙˙Gü*«oú˙ä˙ĹפfŚŃí§Ü9Qćß𪭿č!˙˙K˙ ŞŰţ‚?ů˙ńuéŃš=´ű‡*<ßţUżý?ň˙âé?áU[˙ĐC˙ ţ.˝&ŚŃí§Ü9Qć˙𪭿č!˙˙Gü*«oúä˙ĹפfŠ=´ű‡*<ŰţU·ýň˙âéáU[ĐG˙ ţ.˝#4fŹm>áĘŹ7˙…Um˙Aü€řş?áU[ĐG˙ ţ.˝#4fŹm>áĘŹ7˙…Um˙Aü€řş?áU[ĐC˙ ţ.˝#4fŹm>áĘŹ7˙…Um˙Aü€řş?áU[ĐC˙ ţ.˝"ŚŃí§Ü9Qć˙𪭿č!˙˙I˙ ŞŰţ‚ů˙ńué9˘Źm>áĘŹ7˙…Um˙Aü€řş?áU[˙ĐC˙ ţ.˝#4fŹm>áĘŹ7˙…Um˙Aü€řşOřUVßô˙Č˙‹ŻIŁ4{i÷Ty·ü*«oúä˙ĹŃ˙ ŞŰţ‚ů˙ńué4Qí§Ü9Qć˙𪭿č!˙˙I˙ ŞŰţ‚ů˙ńué9˘Źm>áĘŹ7˙…Um˙Aü€řş?áU[ĐC˙ ţ.˝"Š=´ű‡*<ßţU·ý?ň˙âč˙…Um˙Aü€řşôŠ(öÓî¨óořUVßô˙Č˙‹Ą˙…Um˙Aü€řşôŚŃG¶źpĺG›Â޶˙ ‡ţ@?ü]/ü*«oúä˙ĹפfŠ=´ű‡*<ßţUżý?ň˙âč˙…Um˙Aü€řşôŚŃG¶źpĺG›˙ÂŞ¶˙ ‡ţ@?ü]𪭿č!˙˙^‘EÚ}Ă•m˙ ŞŰţ‚ů˙ńtW¤ćŠ=´ű‡*?1(˘Ší2 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ úwö*˙™ËţÜżö˝|Ĺ_N~Ĺźó9Űźţ׬ë| ¨î};š3IEq‹š3Iš3@ š3Iš(sFi Í¤Í f“4”f€šLŇfŠ\ŃšLŃ@Í&i(怚JJ3@ š\Óh Í¤Ł4ąĄÍ6ŚĐć—4Ú(ŮŁ4Ú(síFi(Í.isMͤ͠Ł4ąŁ<ŇfŚĐćŠLŃš\ŃšLŃ@Í&i(Í.isM˘€4f“µĐłIšLŃšvi3IFhsFi3Fh٤Í&y˘€š3MÍąŁ4”PłFią˘€4f’Švi3ëIš3@ͦćŠ\ŃšLš.h¤Í fŚÓhÍ;4™¤ÍąŁ4”f€4f“4f€4f’@ š3Iš3@ š\ÓsE.isMͤ͠Ł4ąĄÍ6Š\Ňć›Í´f“4PłIšJ(sFi3E;4™¤ÍěŃšměŇgÚ’Š\ŃšLŃšvi3Iš(sFi3Fhsͤ͠Ł4™Ł4ąĄÍ6Š\ŃšLŃ@Í&i(í@ š\ÓyŁ4ąĄÍ74PćŚŇfŚĐć—4ÜŃžhsKšm f“4”Pć—4Ú3@Í&i( Í.i´f€>´ą¦ćŚĐłIšJ2hsFi ĄÍ74PłFiąŁ4ąŁ4”PćŚŇfŚĐćŚŇfŠ\ŃšAFhsFi3Fh٤Í% f“4™˘€4f“4PłIšJ9 f’’ŚĐć—4Ú(sFi(Í.isMŁ4ąĄÍ6ŠvhÍ6Š\űQšJ3@ š\ÓsFhsFi(Í.hĎ4™Ł4ą˘“4f€4f“4PłE6ŠüǢŠ+Ń0 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ úoö-˙™ÇţÜ˙ö˝|É_M~Ĺßó8˙Űźţ׬ë| ¨î}9š3MÍ®#QÔf›š3@˘›š3@˘›š(ŮŞš–ŁgĄÚ5ÎŁu µşőy\(úsßÚąĎ^5łđ~š@'Ô&[Űçď´ŢŠ?^źOš|Gâ OÄwćďVşyäçjôHǢŻ@*áMËR[±îşÇĆŮ»%„7wě?ŤTF‡ńnJÄ˙…ě›ń˙ólőűg?–Ęđú+ogs3č˝ă?‡ď$Xďŕ»°cül˘DŠóúW˘išŤ–©h·ZuÔ7VíŃâpĂéÇjřµĽ9â OĂ—âďIşxdărőIŁ/B*]%Đʱ(®Gá÷Ť¬ü_¦™# BĹą?wýĄőSút>ýe`Ő´e˘›š(ę3MĎf€P]Ý[ŮÂf»™!ug8•âAˇZn`$ą“ýTYëî}y&«Ş]ę—&kŮšFţü*=íTŁq6zE÷Ź´Č­´sÜ‘ü@m_ĚóúVwü,uÝ˙ ł·×Ď˙ěkĎ(«ĺDÝž©aăí2v söÄ˙”~#źŇş›K»{ČÖłG4Gř‘˛+ŔłW4­RďJąŮLŃ·ńŞĂĐŽôś;ç»ŃX~ńľ»iąqĘŢĹžžăÔVÖk=†;ëE74fŽĎµ¦ćŚĐ¨¦ćŠuÜŃšvhÍ74f€@¦ćŚĐ¨¦ćŚĐ¨Í74f€š)´f€FiąŁ4ę3MŁ4ěŃMÍ CłE74gš;4f›š(ÔSsFhÔf›š3@Ł4ÜŃšuÜŃšuÜŃšu¦ćŚĐłFiąŁ4ę3MÍ QšnhÍ;4f›š3@ÍÜŃšvh¦ćŚĐ¨¦ćŚĐ¨Í6ŚĐ¨¦ćŚĐłFiąŁ4ę)ąŁ4ę)´f€E6Śń@ÍÜŃšu¦ćŚĐłE74f€E74f€GÖ›š3@Ł>ÔÜŃšvh¦ćŚĐ¨¦Ńšu¦ćŚĐłE74f€(¦ćŚĐ¨¦ćŚĐłFią˘€E74f€š)ą˘€š3MÍ QšnhÍFiąćŚĐ1٢›FhÔSsFh٢›š3@ÍÜŃšuÜŃšuÜŃšvhÍ74f€šÇń‰´ÄXż†Ü‘•ŚťÎßEźĘ¸_‰˙źIśčžmaÎÇ‘Fá =ďü«–đÇĂÔŐ-.5˙j>~KC?;Çg~N{`crj’]Iľ¶GA©|oŇarş~™yrńHË?OĽk;ţ·ýKżů=˙Úé4OXiZÄ©¤čÖ"Đ"+l¦B=AűÇŽä×OĄxşĎÄ ÚÜA47(Łoš§Ę`měN~•RI+Ř·Ni\ćá{˙Ôą˙“ßý®“ţ·ýKźů=˙Úëg]đ6Ş\'˛ŠĆň\”–Ôů|‘‘•ű§źjň/ř/PđĄČóČą±“ýUÜcĺocýÖă§ĺšPť9čCM‰˙ ŰţĄĎüž˙ítÂö˙©s˙'żű]x•·łŹbnĎm˙…í˙RďţOöş?á{Ôą˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKżů=˙ÚëĨŁŮÄ.Ďm˙…í˙RďţOöş?á{Ô»˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKżů=˙ÚëĨŁŮÄ.Ďm˙…í˙RçţOöş?á{Ôą˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKżů=˙ÚëĨŁŮÄ.Ďm˙…í˙RçţOöş?á{Ôą˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKźů=˙ÚëĨŁŮÄ.Ďm˙…í˙RçţOöş?á{Ôą˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKźů=˙ÚëĨŁŮÄ.Ďm˙…í˙RçţOöş?á{Ôą˙“ßý®ĽJŠ=śBěößř^ßő.ä÷˙kŁţ·ýKźů=˙ÚëĨŁŮǰ]žŰ˙ ŰţĄßüž˙ítÂö˙©s˙'żű]x•{8…Ůíżđ˝żę]˙Éďţ×Gü/oú—ň{˙µ×‰QGł]žŰ˙ ŰţĄĎüž˙ítÂ÷˙©s˙'żű]x•{8ö łŰá{Ôą˙“ßý®Źř^ßő.ä÷˙kŻ˘Źg»=ĆޱmŃ}Rě1ü¶ ęô‹Ő¤Xćž]>făkµI˙xăŠůŽŠN”GĚ϶#‘$Ť^6WFVSG¨4ě×Ęľńî©á;”DvąÓ ~ňŃŰŹr§řOéë_LhÍ–˝ĄC¨i˛‰mĺz©î¤v"˛”JNć•›š3P1ÔSsFhÔSsE~eŃEčQ@Q@Wşüýźő/GŻâWźIĐ·‰ĺâ{ˇţÎ~ę˙´AĎ`z€´¶žňć;{HežâFÚ‘D…™Ď ’k˝Ńţ üCŐŕI¬ü-|#şn-óĆs‰N0zţ÷ĽáĎX­Ż‡4›k4zE]Ň9Ć2ÎrÄňzžőŃPŔóţÎßă@SB†SśmKčúňâ¸ď|;ń†˘3k~Ô­`ĚĆŃŚdśşĺGž˝kô¦Šü«˘ż@~&|đźŽ"2‹TŇ5@»VîĘ%\ň9tŔŔĎ ˝+ă/‰ź ĽCđďTű6ąjM¤ŚEµě|Ĺ8‡řOű'}0h‹˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ݦb˙ůśíĎ˙k×ĚŐôÇěa˙3‡ýą˙ízηŔĘŽçÓYĄ¦fŚ× ú3MŁ4ę)™˘€U5[ř4˝6ęúí¶ŰŰFŇ9ö<{ŐŠó?ŹÚ›Zx>(؆˝¸ ŢčŁqývÓŠ»°3ĂŃoüC«A¦éP4×S:(îĚ{ÜŃáí˙Ä:´n•Ou1Ŕ˘ŽěǰÍzľ»«éß tY|?á™RçĹ ţ˘|ŹöWĐúÝO4ě™xĎĂďáÜé3]ŰÝÉ7I8ŚŕçˇĹbRČď,Ť$ŚÎěK31É$ő$Ói­á}rëĂşĺ¶Ądy |Éś őSěE}oĄ_ÁŞi¶·ÖŤşŢâ5•±çŢľ2Ż˘>ęmwá ¬¤bZĘŕŞű# ĂőÝYUŽ—*'¨fŚÓhÍ`Pą¨oncł´šćvŰJ]ʰ©kř™x`ĐŁN Ä ÷G?ĎŇ»ÎőŤFmWQšîŕüÎx^Ę;T©(­4´1őŤN+(ćŠ4‡ túš‡T°ąŇ老˝ŚÇ4g‘ŘŹP{ЍŚQ•‘а9kľÓŻ­Ł6•¨Ăwn~d<ŻfÁŻołąŽňŇc•©ö5ŕUę_ ď ú1É·”ţéçůć˘k©Hě3Kšm%f1Ôf“4™ ć“4Ú(٢’’€šJměŇóM˘€—4ÚNôú)ąŁ4´f’’€šLÓsK@Í&i(Í.MQ@ KM¤Í:—4ÚLĐč¦QšvisMÍ%;4Rf“4ę3MÍěŇÓ3K@¤Í&h QźZe.h٤Í% ĄÍ74PŃšLŇf€E34´ěŃMÍ&hôS( QšJ(ŔŇSihsFi);ĐłFi( Qše-;4™¤Í´f›K@ KLÍú3L˘€šJm-;4™¤˘€šJm.hsKšfh fŚÓihisL˘€Fi´´îi)( fŠgz\Đ©)3E.isLŁ4ěŇć›E.hɤÍ€QIE:’›šZvh¦fŠ}&iąĄÍ;4™¦Ň怊nhÍ;4f›FhôShÍ.k“řťâřEĽ/5Ě$}¶säŰýň>÷ŕ2~¸뫯 řĹ+ëźô} x!E.‰ÉËśľ®ĹQZę Ąđű@ş´Hő{űKwtwÇ4ąĆÓ†Čă%gźCő®ËÇ–’ř‹B¶—L•-mĐ•’-ă=ńÔćź®kŮéZ^Űydž#óyń‘ł 0p=z Ă:”w‹Á<Ď&ź?ÉÂíČ<ůó\S•GWąTW,ą› ßHđśPyŇKuw*äL¨_ŽŮ®•ŁŽ Ř58ľNJ2wo”duďúW;µ¤éSÁ¦ÚŮ»­˘ËÝÎ~ęă©É­9u¨®^mÜ™¦ÎÔčĘv’2:ŽEuĹékîvÎ=Z4&µżŇtŘď/&Éď s×ŐÝ2îËÄş9Ó.˘qRł¤É°Kž~_ˇ=¦Ň˝ß†mdÓ^XY:†2H‘Ŕ¨Ľ/umk­Ë,rjn<µ.¤m=[,O#Ž•ËR7‹ľŚänç‡řëĂsřSÄwlÍľ1‡†OďĆzŻP}Á®~˝Űö‚˛¶˝Ň­oík›)r€1„qÇę>¦Ľ"»čTöąVŠJú'ÄŢřgá=?J›^Ó.ÁľL«E4­Č XźźŹĽ+k\GÎôW«üTđ‹ĄřfĂÄţą–M*ĺ•LrŘ VRFGLyÍyB©c…źj˘’Š@-Úü0đ Ţ;˝˝…/~Ŭa̦0Nő=Oá\χŕŽç_Ó`ťCĂ-ĚHę{©p  WĄ||đţ•áĎXÚh–iio%’ĘȬÇ,dqžIěĺ^j'}©€QIE ŠB$‚;RAÁz(®çÄ~ “áŢ“‘k*x™~Ő! čw’OĘA8Ŕ=ąĎ  ±Â‚O  ŠJîĽ}yໍCO ZK˘‰ţ–Ěvä1<3nÉČă€5{Ăöń^kÚmµÂî†kŁuÎ2ĄŔ#?C^őâ˙ |*đžŁoc­XÝĂ,ńůŞÉ,î䌜7¨=©¤ÎôW§|Zř§x{LÓµ˙ Ý=Ć‹|B¨s¸ˇeܤŕ€zň1ďW<ý©l´˝RďOđľ†u4_lş›ËFa‘•@ eĎ9%I…}-E|=Ş~Óľ>»Ţ-F‘` eL6ĄŠŹOťËň¬y?hʉŤ*şëń"ŚeĆß őĘúĐß4WÂVż´źÄX_2_X\ ¶K4éňă­uÚíc®E ţÝđć›t›ą6r˝ąŹďÉëőöë@_Ö?‹|7ĄřłAşŃőŰU౏\2ž žĚ§łĆĽ·Â´ŹµÝ±ęS\č—'wËyc8é‡\ŽG®9zgŘ´űŰ]FĘÍ>ć »I—tsÁ ‘z«úPçĹ?ę|_u˘ęĽ@ů–·8Ŕ¸„“µÇˇăv ŽzžBľíýŞ< ž+řw>©m6­˘+\ðrńqć©öÚ7}WŢľ Š+ę_†?˛ňŢię<ľą¶šeÜşu¦Łqć9ćçîĆ:śŕ|µE}Ű{ű5ü;¸¤6z…«#|7ŚH'żĎ¸d}1ëšńżŠł6§ Y^jžż:­Ś Čmg “DZݯ€@ ĎŽ@>v˘Š(˘Š(˘Š(˘Š(˘ľŤđWěČţ'đn“®ÂX¶Ż¨Z­ĘŰ˙gď ¸d)4g·8Żś¨{{K›”•­­ć™aRňаEÎ:sPWß?łf­áżřSúJi7°5¬gűAXŞ2OźťźëĆöŰéŠřçâ{işĎĹMpřPE%…ĺń˘/•±ĺČÄă·?Ťq”WŢľř!ŕořn6×ě4ýNň4]ßj*­n3€ß* =23Ž¤×Ž~Ô:_ĂŘü+¤ę>_ý­ŻŚ2ľ“4dlŘX‚±ť˝vöă#Ö€>m˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ݦ?cŹřL?íĎ˙k×Ěőôżěg˙3‡ýą˙ízÎŻŔĘŽçÓŁ4ÜŃ\FłFią˘€Fią˘€^/űGîňü?Ź»™óőýŢ?­{6kĚţ>éŤyáocRZĘŕ3{# §őŰW‰ ě|óE%ŇAď_ ĽŻřUÚ—ü+ýźđ—í˙Lóńçm˙¦]±Ź»ďלW…\yżh—íüýÇĚó3»vyÎyÎj»˙jđjZTíÔ' ŽŚ;«ŕ÷ëüVŃeń†bKo[¨7úp8ó˙Ú_Sč{ô<Őn‹QK"Ôf›š3@ͦŃ@ͦćŚĐłE74PłFią˘€š3MÍ fŚÓsFhŮŁ4Ú3@ÍÚ3@ÍÚ3@ü(Í6ŚĐłFiąŁ4ę3M˘€š3M˘€š3M˘€š3M˘€š3MÍ fŚÓs@ fŚÓsFhŮŁ>ÔÚ3@ͦćŚĐłFiąŁ4ěŃšnh fŚÓhÍ;4f›š3@ͦćŠvhÚ3@ͦњu¦ćŚĐłE74PłFi´PłFi´f€š3MŁ4ěŃMŁ4ěŃšnh fŠnhÍ;4f›š(ŮŁ>ÔÚ3@ͦćŠvhÍ6ŚĐł^ŻKŮoPxč+˝ńž©kˇř^ďWVY-"ͶĺČŕ(Ó'ňŻšőŻk:ŷ٦ťcŽXD “ęG${tĄC ä®Ró;‰®ők›űőѬňʼn[{md,HÎ ĐźQš˝đÇD{]y.5íRŮ/oj $ś˙v0NOá\׾kzüZÔz¬z|3"ăš?)\qś`ç5Ńx×ŕăi_ńRéž!™ÚÇmܦů‹» ü®;ś{×jĂ$ü‹x†Ő‹Ö^+Y Ő´y®ŕ˛ś^Ü”váw€0ĎÍŽ:V¦“c%„ž}ä3ĄÄqł¬›ĂŤý‰aśŽµáwR„ž]Ű$ţ´¶zĄÝŚë-ĄĚĐJ˝'*Gâ*ŞŕŁ&Úv1Rg´řóG[?‡úގ$Čív±ç%›ÍR~śfĽB¶őOë:味ԮŤÄ*”1“Ú°ëRtŻ&-}Qń5ĽşG‡ŽĺÓËoł7˙u7gi˙vľVŻ˘ĽUâ?†^0Ó´uÍvéĹ0˘&^X(`vs÷Ej‰e_Śń5˙Ă-&óÂsŰ7„-Ęf(Ń•Á˘’[’8 €rrsÚ߀ő vŰÁZ\^đzÇ#nŻu“ž2Ęw†lśű€3Ű–ř‰ăßGáĹ+XľdŇ+(Ú~ď’Ř$‘˙ÖŮŐĽSŕżř+GµŐµëÍěVkH#cż  Ap{g‘L?hýÚ -Y°[jWŠëČű®ŰAÎ{ŕäg©®ßÇž&Ň< xR¸ŃˇżÔž/*ŐN`*…Űv:/lţµć_|aáĎx?ĂÖ^¸}Öl[I«D6€XŤ¤ŚÁ5Ćżčž%Ńü1‹{ö™lăuť|§M„¬`}ĺű§¦zR¸•đ+Ć’ř‘uK±ŠÚ+Wk…drĹŚ˛»x3ŚűW™č׋ń3â]­ýô–ZvPÇ+s•}’®dŹ™‹ţ5WŕgŤ4ďk·żŰ,ńŮŢĨfT-岜ŚÎ9=3Ú˛Ť°Í$˛+Ś$Ë•€ě/ ŁűD\é“ęz~Šşh}vő! |ŘÄqyŚŹrŰłÓŻSVĽeâ‹/„iš†ô‹in$„M<ódŰ’G%‰SߏO;řăâť/Ä~0ÓőŢ ´D2Ý6¸‘ŰŁ{Šëď|Mŕúm„Ţ1ą¸Ňu‹TŘí ?s†ÚŔ©<€pFOâŔ«ń_OŇüOđăMńÖ›b–7’8K„@0ŕ±Cśc$2đzy펷Ä^%¶đ_ĂOj±éV·š‹ZÁ *ŕGAfČĎ~=kÎ>*xçE˝đ퇅<ŤІiťJů„gĎRI$Oęż|[˘k_|)Ąé—ľ}őŚq-Ä^S®Â°…<˛€yă‚i\Mń'‰´Ľ ¦|@}Ö}]ăXŕ9Ăe±Č[ôĆMsß/--Ń5>Ьď|ÍVÖHšh<§BŁóÚyaĐÖÍżŠĽăß é–6˝şŇµ]=|µ¸H0 íaČPH sŇ?<9öŹXřŹPÓí¬5ř¤Xď±\6G^ü…#<€HŞâŽ?x)ŁŤ´C%T ţé+’ř™¨ř-t» 'Á¶Í<6fÔ¤ÜÇ?/8Ürz‘Ć݇ÇŔWŔ^ Vaúä”Aá?ůtoúý‡˙CôĹ­Áš®żeqâÝv]:â;p© :®ř÷1Ď*O\ŹÂľjđőÄVšţ™spŰ!†ć)°N8$ŕsĐWwńßÄúGŠ|Kawˇ]ýŞŢ+Aż”é†ŢÇ`B([ Üř‹âŤİxwÁ—f™Ě1ąC*÷Ż$ Ä’}«ĽńłčžřEĄA¨A˝mË{WLym/–ádęFÝëŰë_.W«řÓĹş&ĄđoĂş•ÚI M”ë°,nĚWiĺ‡CŢ‹čĽ™ŕ… ă´ř﵋ÇŰîÁbŞ öRÇž•© ę–_Ľ1¬ÚjÚ]˝¶Żd ¸‹ś ´‚y®Îý9‡ľ6đíׂdđwŽD‘X-otŠNĐ[vĐH`ÄpFun<[ŕżř_RÓü q>ŁŞ_®Ö¸“‚f* ŕ1ŔQÔó@Ew#Á?đ¬®ÍŃźţď3÷XßÓpĆ?nÜç<çđŁĂcÁ?đ€k?ŰfřI˛ßcŰżtlĆ>\nÎwvéHgEvţ >×á*3Ť[aűÍ˙ÝănŢ7nÇŢăŤpô´RQH :}íÎź{ ÝŚĎĚ,9ŕ©Ĺ}Wđ“âM·Ś¬…ťńH5ČW2F8üiýGoĄ|—V,/ntëŘ/,fx.ˇ`ńȇHî)§`>ëÔ/m´ë)Ż/¦H-ˇRňHç@ď_)ü[ř“să+Óib^ Ěqž Ä˙AŰëYţ<ř“­xĘĘÎÎřÇ´* ‘Ă&AĐWM»‰!h¤ HdžÂ¤gÔ_K·Ń÷őÄż—šřý+łÍbř?MmÂÚ]ŚI ş+Źöń–ýI­ŠäzłD8Qšnh¤łE74Pć•Q^‰QEWĐ?±Ž…ˇń˙V›%´»2bä;3žß.ńÇ'=p??WŐ?°×•żĆy#ĎĹž;}ś˝qźÂ€>«ŻÔe˙ßř†óP}GV‚Ňâc0ł,yä¨b¤ă=;Ć{×˝×ĚźµĄń-PŇĽ+·d´Eą˙k9ýkĺ+?ßý›|_á¸ďF1x†ÍrXZ![…đ|Ł’ŮáKçŚ Ö7ě÷ŞřłGř§ŁéZߤSŢFş…ŽË0ä Đđ ¦HcČăč}Ďá·í=˘jţUźŤm±ŻNíp†’ŮϸĺŁüwĺ…} nÖ×)ĺłC2Ë1Ď # :×Ň€îÚËY­®ŁYmćFŽHŘd:‘‚±ż1;ń~—~׾$Ö şÎ›É lv`O?C]׌>?xźĹ_φ5(­ÄÓ·z„#Ü mÁv( ą g1“__j~đÄ+V¸¸ÓôMj7ëwnQźGĆwwő÷í_>ügý›˘Ńô‰őżM<°ÚÄŇÜŘ\ąw* dÄBäśd•o|‚€0>|Ń~$ř:óXŐu-FÖx/ŢŃRŰfŇ«m“ąIÎ\ţBş}/öXřĂVŽűVąĂVě«i n.IŤXž›UU™—8ÉÚxk°ýŠä–jżö—˙DA\—íMń{[ŇĽPŢđ˝üúrZÄŹ{q1ĚŇ:ď®9 ˇČÁ$‘Ú€:mWöTđ”Ö…t˝cZ´ş …’fŽdĎ«(E'đa_2|Qřw­|8×OÖÖ'Žu/ms ĘL€ă#¸#ŚÓ#Ř×eđgăG‰ôi–ú޵}©hw,^Lf1«aC«1%vđp0×Ó_´ß‡ˇ×ţkNń©ąÓ•o süĎůˇqřŠř«áĎuź!M'A„Ćů®$ČŠţó‘ú§µ}= ~Ę^·€w[Ő/n8ĎŮ‚ANFbyď‘]˙ěóák_ ü(ŃŮURăP·MBęFȡ€'áTÎqĎ5ňoÄźŽ-ńn˝=Ćť«j6”Żţ‹gg9˘Ś`»& 6Fy$Ň€=Ć_˛ťÓ¤—ÁúŐďŰr°j;e ˘®ÜüŁqĎáâ_ >ËŻ|X‡Áž'Z\Ş%űB¦ß1 Ć\NGńEüú”ĘćÖćášIŁ•W;K“’ĄUşçśsÖşOÚóLąŃ#ĐĽw ^\iúÄ6IíŁ´nŽĘI1‡űÇĄ{ß…4H<5á­3E´’Ymě-ŇÝ\n`Ł8fľxń?ěĂáť#Ăz¶Ąµ¬É-ť¤· ŚbĂBŔ“§í˙ /nu†>˝żž[›»Ť>%šV,ÎĹA$“Ô×Á|oyk5µ×Šő™mćFŽHÚéČu#zhŮľ~ĎšŽ>i^"Ôµ}N ›Ó6bˡ%xÇU'ř3řŇ|řAŁë^*Öo„ľ×Dp"ěŮ8‰÷ ŕŻ}ĽăkÚżeĎů!>˙·Żý*–ľ`🵝#ö‚{/S»´łżńJGu 2•I×íxĂÔaühě˙޵ńׄob±—Z>Öďü=«Á©iS´Pś‚:0î¬;ÜVm ŤĎř†Oř‚ăVžÖŢÖY‚îŽÂ’ú’O95‰IZľĐ5/ß ]*Ůć~77DŚz±ě)6áŤçÄ:ݶ›f>y[ć|dF˝Řű_YéV0išmµŤ˘í‚Ţ5Ť°çŢąßx6ĎÂ:iD"ků€óîëţĘú(ýzý:¬×<ĺĚËJĂłFiąŁ5ÍCyo夶ó Ç*”aějLŃšđýcO›KÔ&´¸2fŞuě~&Đ`×-6¶#ąAűąqÓŘűW“ęšmŢ—pa˝…ŁnÇłP{Ö±•Čh›@ŐGŐ"˝H"ťăÎNśŽŁŢˇŐ5 ťRöK»Ů “Hy=€ô°ŞtU´RUÍ/M»Ő.6P´ŤüG QęOjv‘§ÍŞjÚ@>g<¶8QÜšö»;xěí"·€b8”"ŹaY^Đ`Đív®$ąő’㯰ôłšĘNĺ$:ŚÓsFjF:ŠLŇfh¤¤Í(¤Í&hŮŁ4ÜŇć€4f›š\ĐćŠLŃš.h¦ć—4 Z3IšJvh¦ćŚĐľ”f›š3Í;4SsFh٢“4™ QIš3@…ͤÍ&hěŃMŁ4ěŃšLŇfŁ4ÜŃš:ŠLŇfÍÜŇć‹E74f€E&i3@‡QIšLĐ1٢›Fh٢›š3@ÍÚ3@‡QMĄÍŠLŃ@ š)3Fhh¦ćŠu™¤Í:ŚÓsFhŮŁ4ÜŃšuÜŃšvh¤Í BŃIšLШ¤Í bŃMÍ fŠnis@… u¦ć–€MÍ.h´f›š3@ͤÍ&hŮŁ4™Ł4´f“4™ QIš3@…ͦњ:ŹĄ74f€š3MĎ4f€FiąĄÍŠnis@ĹŁ4™Ł4\Ńšnh c¨Í74ą ÍÜŃšvh¦ć—4Z3MÍ c«”ř™áźřJę@ôǡŻ?˛·\Ç?y‚ţgôĹ/†ë®4š®†Şšž3,<źÜz7čkÁĺ‚çLÔ;¨d†â&˘‘v˛‘ěk˛„˘NÇŮš=¬VZeĽ(Ş‘F€Đsźďm"ŇľÉr-šŇĺq8ȑà ŚŁ8ďÜJp­ą űôÎ ×řŤăÝGÇ7¶Ň^õµ°""$…Î2I=IŔü«Ž˘ E%€Z)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ®˙ŕď…›^ń$w—źěűą#‡~Şžüň}‡˝fřŔşźŠ®QŃßM÷—N8÷ ?ţžµôž¤YčZ\:~›ŠŢ!Ç«ěOrk9ÎÚ"’4sFiąĄÍ`Xą˘“4f š)ą˘źšÔQEzEP_C~ĹšĘYř˙VŇä`żÚ;Đ|ĎŽżÝg8žŐóÍt_|M?|kŁř‚ŮKµŚáŢ0pdŚ‚®™íą öÍ~™W-ń Çš€4ő]<1ĚĆ8cŽ&‘ĺp3´Ŕŕu$zÝŃő+]cIłÔ´ůDÖwp¬đ¸ţ%aZĂńď€ü;ăË{_Ř}®;w2BË+FŃ’0pT‚:ÇOA@3Ş~Őţ…Řiš­tŔiŢ8A÷ŕ·żéřa˙Ă\˙Ô“˙•oţÓ^ѤüřwĄ¶mĽ)§ą˙§­×=ó˙- VÇü+Ź˙Đ›áżüÁ˙ÄĐ‹i_µŽ)ÚŢÔíF9ű4ŃĎŹö¶{צxwâ_ĂżŃ&ťţźw,ěĘ4íJ®ç¦H0Ä†íž ô8_|ř{®ˇűG†l­dĆŘjWßáOâ x˙ŹżehÚ9®Ľ«­Ť˙*F (䌎ă$c$˘ń÷ěżáÝfäÝxVú]Vl˝»!žţč,âG`{w„t8<3á}+Dµ‘ĺ†ÂŮ-ÖIYö€7LőÇAĐq^Oű4ŘüGŇ­um?â\.ťlQ,ľŮ2Ë.ńťÁL`c©ÇMĽf˝ş€4‰ O,αĊYťŽÔ“ŘWć'‹ő5ÖüY­ę©ť·×ÓÝ Ś<ŚßÖľâý¦|uľÜŰC)]SXWł¶ű]T®$şÇ,0E| @~Ń/ĽIŻXčúL^uőä˘(“8=ÉěÉ'°˝ âwŔßxHĺ[vÖt×Qţ—c7–Üe]q•ç€z9ÉŔâ|âÝ[Á>!ZĐ&Hobyut?yH=Ž1‘čE}oŕoÚwšµĽQx˘ Ťű!Y‚™ŕ5Ňu CM˝Iô‹»«KĽ€’ZČŃľrÁSž ~ WčfóáLJî%’W*× HŔ–i.9ö$ź`j~.ü/đö–ÓYëšRBw„[ťŽIĆÄ^ $ňp9Î{×Ę?>/\üMÔŕ†ÖÝě´ &f¶‚B<ÉńćIŽ3Ž'“śĐŘß5Oü#đäŁĘš4ŘígE9‘<·Sř©ç5đGÄjŢń%Γ¬Űʆ7a ÁŤ–;”‡BzŽť:"»ßő†—SŰMę:ÉÝ%§™´Ć˙ߌž=ďč+ę‹?Ś ĽUbźnŐôÝĄ™|ŤR…N9áĆ0GpqŰ®E|Űű)ř.˙[ř•a­˝´ë¤i[ç{‚„#É´Ş nç'$ đľőë¶Ćą Ń45uűUÝďÚŠç‘hËČÇ´śŹşzóŽ—Ĺß´€Ľ3¤Ń(‘ĆH}ÔP{Ô’{Đß?ä‘řCţÁčż:'˛ą‚ęâÚh%K‹feš2§1•8lú`×Őźł—Çiľ´đÇ‹.†™q`-®]Y˘š<–°ÎÖ#ś Žx®»âÇĹχ«ŕO[iúĹĄî§ŞióÚF¶qďwy"(ĄŘ 2ąÉ펣»ű.É đĎý˝éTµň^“˙'%e˙cjé`Ż{ýźľ,ř#Ă 4=#[×áłÔmLâh^I]ÓČ㤫Áďë_:iÚÎźÇ;mnK•RxŤoărľ1śmç¦hëŻÚĂţH–Ż˙]­˙ôr×ĂľÖn|;â7X°8ş±¸Ků ¬;‡Řšú·ö‰ř§ŕż|)Ôô˝^‚ňţY`d…c‘I "“Ë(|„‘»¬ŚĚ±®ç d(Č>$©úăÝ Űâď†ĹÖí;x/¬ĺ‘C›ĺqřಟ©Ş˙u»o†ßîÓO—ěď ˘izp ŢSbă Ę¨f˙€žCČ~ĆÚĆĄđâňĆú9Mžźvcł™‡XndľÖ$˙ŔĹy§íźâă¨x·OđĽ|Ť./´LA´Ň@>€&ÓŰ;Ď |ĺEPEPEPEPEPEPEPEPEPEPEP_J~Ćßó7˙Űźţׯšëé?Řăţf˙űs˙Úőť_•ĎĄsFi´f¸ÍQšn}(Í:ŚÓh QMÍę«©iözť«[j6ĐÜŔÝc•Ż=ýęĹ 6ŐţčnĎc5ÝáV üźÖ±?áG¦ü˙o¶ßO±óůďŻdŁ5\ňî+#Í´ŹşŁ«ßÍw|ĂřY„hçőŻAÓtűM2Őm´űhm­×˘DˇG׎ţőc4RroqÚĂłE6ŚŇ٢›FhÔf›FhŐ Ý´p®˘I˘=U×"¤˘€9Kďéł±ki&¶'°;—őçő¬˙řW‹»ţBgžG˙e]Ýź3 ĄŹ4Č5Ě“\‘Řť«ůZéí- ´…aµ…!ŚtT\ “4PŰ`:ŚÓsE Fią˘€E74f€š3MŁ4îhÍ6ŠvhÍ74P¨¦Ńšu¦Ńšvh¦Ń@ͦćŚĐ¨Í6ŚĐ¨¦Ńšvh¦ŃšvhÍ6ŚĐłFiąŁ4ę3MŁ4ę3M˘€E74v f€i´f€š3MŁ4ěŃšměŃM˘€Fi´PłE6ŚĐ¨Í74PłE74gŇ€š)ą˘€š)´f€E6ŠuÜŃ@ͦćŚĐ¨Í6Šu¦ćŠuÜŃ@ÍÜŃ@ͦŃ@ÍŃFh٢›Fh٢›Fh٢›FhÔf›š(ŮŁšnh fŚÓhÍ;4Sh QMÍěŃšnh Qšm fŠnh fŠnh Qšnh Qšnh fŚÓsFh٢›š(٢›š(٢›FhÔf›ÚŠp4f›š(ŮŁ4ÜŃ@ͦŃ@¬ŹxoHńA5{®Yïч"µhŁ`<«Qř+ĄJĺ¬5+»`†EY@út5ť˙ ;ţ¦ü’˙í•ěÔUó˸¬Ź˙…˙SţIöĘ?áGÔĂ˙’_ý˛˝›4fŹi ˛ ń$űlĺ|i—x‰Ř˙©Ń/umZámě,â2Í#v°Éčä’ä×)ń+⯅ľ[źí›Ń. FSO¶!çlŚ‚W?(÷lL×Ĺ>+ë_uR×LÖz4L~ͧŁĺSý§\`““ر'$ý@+„˘Š(˘Š(˘Šúö_řĄŕďxPÓ|O¬}†ö]NK„ŹěłKĚQ(9D#Ş·Ďă˙üCĄř«âĆ»¬č7_kÓn|Ź*o-ŁÝ¶ŃľVŹ™HävŻ?˘€ (˘€ (˘€ (˘€ (˘€ (˘€ úöař…ŕOiÚ´~&’ćŰUż”+ܵ±–©ÚfćÎâŮůprľś|őE}ÍăÚ'ŔÚ‡)đÝĐŐő §Čµ‚Ž0ǡve őĆO·9ŻŠ|A«ŢkúĺţŻ©Éć^ŢĚóĘÝ·1Îě@;gŃ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}%űĚß˙nű^ľmݤcŻů›żíĎ˙kÖu~Tw>“ͤͮ3AhÍ%ąŁ4™Ł4ą˘“4f€4f’“4ę3MÍ.hsFi(Í-™Ł4ąŁ4””ěŃšLŇPłFi3I@Ł4™Ł4ąŁ4™˘€4f“4f€ŚŇf’€š3Iš3@ š3MÍ-.hÍ&h Í¤Í&hŮŁ4™Ł4ąŁ4””ěŃHM´f“4”ěŃšJ3@ š3MÍ.hsFi3Išu¤ÍąŁ4”PćŠJ3ë@ š3Iš(hÍ&hÍ.hÍ74ą Í¤Í˝¨Í74ĽĐćŚÓsKš\ŃšLŃš\ŃšLŃš\űQšJ3@ š)3E.hÍ% Í¤Í Ł4™˘€4SsFhŮŁ4™˘€4RfŚĐŃšLŃ@ š3MĄÍ.hÍ6—4ą˘›Kš\ŃšLŃš\ŃšJ3@ š)3FhsFi´ą Í¤Í&hŮŁ4”f€4f’ŚĐćŚÓsKš\ŃšLŃ@ š3MĄ&€ŠJ3@ š3MĄ Í¤Í&hŮŁ4™Ł4ą˘›š\ĐćŚŇQ@ š3IE-¤Ď­ Í”f€4f“4™ fŚŇfŚĐćŽÔ”™ fŚŇsIšvhÍ&hÍ.hÍ&hÍ.hϵ&h Í¤Í Ł4”PćŚŇfŚĐćŠLŃš\ŃšJLШÍ74ą Í¤Ł4´RfŚĐćŚŇRPłFi3I@ͤÍ%:ŚŇfŚĐćŚŇfŠ\ŃšLŃšZ3IšJvhÍ&hÍ.hÍ74´ąŁ4™˘€4f“4™ fŚŇfŚĐćŚŇRPłE!4PćĺQ^QEQEQEˇ˘kZ¦…z·z.Łw§Ý’ŰLŃ·Ó ôöŻOŃżhŻşl+š­˝ň©7v¨ÍŹBĘ?‰Ď˝yďţÔ~<–%DµĐa`¸.–˛OŻ2źĂČx›ăÄÂ`şńŬç˱U¶Ď±dí‚q^mE9ٝٝ‹3’NI4Ú( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ľýŽ˙ćn˙·?ý­_7×ұçüÍßöé˙µ«:ż*;źHŇf“4f¸ÍQšnhÍ;4ShÍ-.ią u¦ćŚĐ©3Iš3@˘™š3@˘™š3@ÍĚŃš~hÍ34f€GăLÍ ŃLÍ ŇSsFhů˘™š3@ÍĚŃžhô™¦ćŚĐčÍ34f€š3LÍ ŃšfhÍ>ŠfhÍ?4S3FhôS3Fhôf™š3@ͦf“4&hÍ34f€E34f€šZfis@Ł4ÜŃšvh¦ćŚĐ¨¦Ń@˘›š3@Ł4ÜŃšvh¦ćŠu¦ŃšuÜŃšu¦ćŚĐ¨¦ćŚĐ¨¦ćŚĐć–›š3@ͦćŠu%&hÍ;4SAŁ4ěŃMÍ Í-74f€E6ŚĐ¨Í74f€Fi´PłE74Pż)ąŁ4ę)ąŁ4´ą¦ćŚĐ¨Í74f€E7<Ńš\ŇÓsFhŮŁ4ÜŃ@ÍÜŃšvh¦Ń@Ł4ÜŃšuÜŃšuÜŃšvhÍ74f€š3MÍ fŠnhÍ:“4™Ł4ę)ąŁ4ěŃšnhÍ:Šnh QMŁ4ę)ąŁ4ěŃšnhÍ:ŠměŃMÍ QMÍ fŠnhÍ:ŠnhÍ:“4™Ł4ę3MÍ fŠm ĄÍ74@Ł4ÜŃšu&i3FhÔSsE:ŠnhÍ;4SsE;4f›FhÔ~4Ú3@˘›š3@¤¤Í fŠnhÍ;4SsFy Rf“4f€FiąŁ4ěŃšm Qšnh QMŁ4ěŃMÍ QMÍůÁEW bQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEôě{˙3oýşíjůÂľŽýŹ˙ćm˙·Oý­YŐřQÜú?4f›š+ŚĐvh¦Ń@ÍÜŃ@Ł4ĚŃ@ͦQ@Í&i´w fŚÓhÍ:Šmń@ÍĚŃš~hÍ34f€š3LÍ ćŚÓ3FhůŁ4ĚŃš~hÍ34f€š)™Ł4üŃMÍ&hů˘™š3@ͦFhů˘™š3@Ł4ĚŃš~h¦fŚĐňh¦fŚĐóE34f€š)™Ł4ú)™ĄÍ:ŚÓh Qšnh îŁ4Ę(ůŁ4Ę(ôSA˘€Fią˘€š3M˘€(Í6ŚĐłE74f€š3MŁ4ę3MÍěŃšměŃšm fŚÓh Qšm QMĄ Í¦Ń@ÍÚ(ŮŁ4ŢôPłE74P¨Í6ŚĐ¨Í6ŠvhÍ74PłFi´f€š3MÍěŃšm fŚÓsE:ŚÓihhÍ6Šu¦Đ(ŮŁ4Ú(ÔShÍ;4f›FhÔdÓh Qšmę3MŁ4ę)´P¨¦ŇĐćŠm fŚÓh fŚÓh fŠmę)´f€š3M˘€š6ŠvhÍ74f€Fią˘€š)ąŁ4ěŃšměŃšměŃšnh fŠměŃMÍę3II@ͦŃ@Ł4Ú;ĐłFi´f€E6Švh¦ćŠvhÍ6ŚĐłFi´PłFiąŁ4ěŃšměŃšnhÍ;4Sh fŠJJvh¦Ń@ͦŠ(٢›E:ŚÓsE;4SsE;&ŠmůÉEW bQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEôoě˙3oýşíjůĘľŚýćl˙·Oý­YŐřăąôvi)3FkŚÔ\Ńšni3@ÝFiąŁ4ąŁ4™¤Í;4fšM&i€ěŃšnhÍ;4f›š3@ͦњvhÍ34ą fŚÓsFhŮŁ4ĚŃš~hÍ34dĐóFi™Ł4üŃšfhÍ?4f™š2hůŁ4ĚĐ ?4f™š3@ͦfŚĐóFi™Ł4üŃšfhĎüŃšfhÍ?4f™š3@ͦf—4ěŃšnhÍ;4f›š3@ͦćŚĐŁu74f€š)™Ł4ú3MͤłFią˘€š3MÍ ć“4ĐihsKšnhÍ;4MÍěŃšm Í.iąŁ4ěŃšnhÍ.isMÍ Ł4™Ł4ąĄÍ74f€šLŇfŚĐłFią˘€4f“4f€E74Pć–›š(٤Í%ěŃšm f“4”f€šLŇfŚĐłFiąŁ4ěŃšnhÍ:ŚÓsE;4™¤Ł4ąŁ4€ŃšvhÍ74f€š3MÍąĄÍ6ŚĐłFiąâŚĐłFi´PćŚŇfŚĐłIšLŃš\Ňć›E.isMÍěĐ 74f€š3MÍ QMŁ4ěŇf“4f€—4Ú3@ Kšnh Í¤Ł4ěŃšnhÍ83M˘€šLŇfŚĐłFiąŁ4ěŇf“4f€šJLŃš\ŃšLŃšvhÍ74f€4ą¦ćŚĐłIšJ3@ šZnhÍ:“4”f€Fi´Pć—4Ú(ŮŁ4ÜŃ@ š\ÓsFhsKšnhÍ;4f›š3@ÍÜŃšvhÍ6Š\ŃšLĐ .isMÍ fŚÓsFh٤Í%ěŃšnhĎěŃšnh fŠmůĎEW bQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEô_ě…˙3gýşíjůŇľŠý‘?ćl˙·Oý­YŐřXăąôfi ¦ćŚ×!¨ę)ą¤&€š3MÍěŃMÍ&hÔf›šLĐóFi™¤Í>ŚÓ3FhůŁ5hÍIš3QćŚĐóFi™Ł4üŃšfhÍ?>ôgŢ™šLĐ™÷Ł4ĚŇf€$ͨň(Í?4f™š2(ůŁ4ĚŃš~hÍ34f€š3LÍ&hĎ˝Gš\ĐóFj<Ńš“4gŢ™š3@Í÷¦fŚĐóFi™Ł4üŃšfhÍ?4ąhÍH ¦FhůŁ4ĚŇ怚)™ĄÍ;4ą¦fŚĐ!Ôą¦ć“4 ~ii™Ł4˙­ÓsFhŮĄÍ2ŚĐč¦FhÔSsFhÔSsFhÔShÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:Šmę)´f€FiąŁ4ę)ąŁ4ěŃMÍ QMÍ QMÍę)´f€E74f€E74f€E74f€E6ŠuÜŃšuÜŃšuÚ3@˘›š3@˘›š3@˘›š3@˘›š3@˘›š(ÔSsFh٢“4f€ŠnhÍ:ŠnhÍ:ŠnhÍ:ŚÓsFh٢›š\ĐŃMÍ Qő¦ćŚĐ¨¦ćŠuÜŃ@˘›š3@˘›š3@˘›š(ÔSsFhÔSsFhÔSsFhÔSsE:Šmę)ąŁ4ěŃMÍ QšnhÍ:ŠnhÍ:ŠnhÍ:Šmę)ąŁ4ę)ąŁ4ę)ąŁ4ę)ą˘€E6ŚĐ¨¦ćŚĐ¨¦ćŠuÜŃšuÜŃšuÜŃšuÜŃšuÜŃ@ťtQEw…Q@Q@wGŇŻµ›řě´«Yn®źîÇÉÇ©ôçŠö_ ü&Ó7đ¸h4¨U%Ý&Ć%OÝ`Ç·;×׼Í­źůţŻ Š( şř+Sńś÷qi2ZŁ[*łýˇĘ‚ cúW1^Ýű0˙ČO^˙®1čM@'"ädleIÔx“Ŕú§‡Ľ=¦ë7ŇZ5ĄřC‰Ř¸Ü›ĆA=ë°¸řâ‰'‘ÖçIĂ1#3?Żű•Ńüxł“Nřká{)Ę™­ž(\ˇČ,°qí‘@E{ŹđÇBÓ<=kŞř˙Y“N7`­â!Yr2ʱ'ČŠÇř‹đę G·×Ľ=¨KCćŹ= #‚ ă Áâ€<ŢŠö‹/…ž_ húţł®ÜXÚÜA×Ęă,ąÚśuĎ×Ň­ę_ü<‘Űkľ#hĽ5°É<Ҳł`ănĆIÇ#ó  ˘˝_Çß ô}?Áéâ_ j’ßięTH%e|‚Űw)r‚?–*§ţéoáaâ_ę’éşLŤ¶~ňNzô=pp'< ó:+Ó•Ď|dđÖ»¨|HÖ.¬4]NęÚO'd°ÚHčŘ…ÁGá]ŹĂ­2˙Jř#ă5K+«)™oGqFĹ~ĚŁ8`2>Ô«ŕťcá˙Ť5IôÝ3ÂvĐÍ ;4úuş ˇ•N ’s–ó÷‹í!°ńfµgj»-íďg†5ôU‘€ŻCýšäzż˙°lźú6*ç|máO\řĎ_žß@ŐĄ†]BáŇDł‘•ÔČÄ@Áw @˙›Z˙?óý^^˙}gu§ţĚŹkm5­ĚxßŃ”uÍîFAäpAükŔ(˘Š(Żnýä'Ż×żô&Ż«Ú^Ż©i-#iZ…ĺ“Hsm3FX™ÚFhő߉uŃu0Ö¦vŔrzýkÖţ4Jňü)đ|˛łI#y Ěç%‰€’Iď^IbKIä“WŻuŤNúÎKÝFňâÖ yPÍ;:GµIŔŔăŠ÷ŹŠ^˝řŹ˘h×… Wq¤l1P®í˝2@Č ‚3éT|Yk˙WŔÄđţŻ4OŞ^Č6B­»oďCś{:ôÉŻѵý_Dßý‘©]ه9e†VUcę@ŕŐmGPĽÔîŤÎŁw=ÝÁ2O!vǦM{7ĹáFř0dŕ›oýôjŚá™´îO2€đ!ëÇnµ}JîĆ+˝Bň{81ĺA,ěŃǵIŔŔăŠWÔźL]5ő ĆÓ”ĺmLěb9á3ޤž”ëÚ?đÍzĎ´ç˙FÇ]_†5;Ý_á’|-cĄęZ…H'ł˝\€TqČŹ“Č&ľvŹVÔŁÓ_NŹPĽ]=ÎZŐfaç%3Č»Q¤ęÚ†ŹpgŇŻ®lć# ˇ#Đ㨠tńµçŠ,>_¶ągáÍ*+Łä›(ca#nĆ •rĄ¸Î;ë_>Ö†±­jzÔË.­sy"Ś)žBűG¶z~ź@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@} ű%˙ĚŐ˙nźűZľzŻ ˙dÓ˙#WýşíjÎŻÂÇϡsHN)ą¤ÍršÍ!4Ňi ¤łIšni ¦‰¤Í34™ “Iša4ÝÔüŇfM!j~i7Te©7P›¨-Qn¤Ý@îŁuCşŤÔ.ę7T;¨ÝL ·Rn¨wQş€&ÝFę‡u¨mÔn¨wQş€&ÝFęu.ę›uŞÔn  ·Qş ÝFęźuŞ Ôn  ÷Qş ÝKş€&ÝIş˘ÝFę›uŞÔn  ·QşˇÝFę›uŞÔn  ·Rî¨7Rî  ·Rî¨7Rî¤Ű©wT;¨Ý@†ĄÍAş”5Mş—5jpj—4ěÔ!©CPŔŇP†§f€%Í.j iŔĐ€ŇQć—4&isQKš“4ą¨ÁĄÍšPi”Rú) Ńš:”ni(üŇÓA˘Ž˘›š(ěŃMŁ4ę)ąŁ4ęJJ(ěŃMÍvhÍ74P¨¦ćŚĐ1٢›FhÔf›š3@Í%&hÍ:ŚÓsE:ŚÓhÍ:Šmę)ą˘˘›FhÔSsFhŮŁ4Ú(ěŃšnhÍ;4SsFhąĄ¦ćŚĐ1ÔSsE:ŚÓsE.iiąŁ4ę)ąŁ4ěŃšnhÍ:ŠnhÍ:ŚÓsFhÔf›š(ěŃšm fŠm cłFiąŁ4ąĄ¦ćŚĐ¨¦ćŚĐ¨Í74PłE6ŚĐ!ÔSsFh٤Í% c¨¦Ńšu¦Ń@‡QMÍ QMÍ Z\ÓhÍFi´f€š)´f€Fią˘Ž˘›š3@ͦćŚĐ!iiąŁ4 vh¦Ń@ÍÜŃ@˘›Fhę)´P1ÔSsFhę3MÍěŃšm cłFiąŁ4ęLŇfŚĐ!ÔSsFhę)´f€š)´P#óÖŠ(®ó ˘Š(­/ë7~Ö­uM9•n­Ř˛o ‚ô ‘Y´P­Âřń?üřhż÷ć_ţ9Yú˙ĆOkZ=Ţ›4lÝFb‘ŕ‰Ăí#ÎG#Ž•ć´Pď|Q¨xGXţŇŇĽ“1ŚÄÉ2–GRA €AęëÚ»ßř_'˙ź ţüË˙Ç+Éh ˙Ću˙h˛iwŃXAk++IöhÜÁYŹţŔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEôěžq˙ Oýş˙íjůöľý”ći˙·_ý­YŐřXăąôi ¦“Išĺ4ši4Ňi  M&šM4šqjBi„Ň ¤ÝL-M-@-M-L-M-L SKTe© P…©7T[©7PŰ©7T;©7PۨÝPnŁuMşŤŐęMô>ę7T¨ß@îŁuAľŤÔ>ę7U}Ôn  čÝU÷Ńľ€,nŁuWÝFú`XÝF꯺ŤÔ€±ľŤŐ_}éc}Şľú7RĆę7T¨Ý@ďŁuAľŤôcuŞľę7PŤÔ»ŞľęPÔ>ę]Ő_u.걺€Őę]Ôcu(ju(jś5(j€585Oşś  J€'ś @śN˘””vj iŔĐ€ÓłQN€$Í(54ą  Ł4Ę\ĐłJ 74f€š3MŁ4€xh˘Šď2 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ÷˙ŮOţfŹűu˙ÚŐŕď߲ˇÇü%öë˙µŞ*|,qÜ÷üâšBi¤×! ¤ÓI¤&M8ši4ŇiĄ¨ÄÓ SKSI¦‹SKSKS PËSKS S P…©ĄŞ2ôŇÔŔ”µ4µDZšZ€&/Işˇ/Iľ€&ÝIşˇßIľ€'ßIľ ßIľ€,o¤ßPoŁ}OşŤŐúMôŔ±ľŤő_}éc}ęľú7ĐŤônŞŰéwĐŤô›Ş ôo  ¨ÝU÷Ńľ€,o÷Ł}WßFú±ľŤŐ_}čĆę7Ôčß@7Ńş«ďŁ}XKş«ďĄß@7҆ŞűéCĐ€ÔˇŞľúPôd585VN @SUpÔŕÔ€°ś  N @†§¨CS  Á§P†§@Nˇž %ś D 8“4 Ô`Ó  ĄÍF ;4üŃMŚĐ1ŕŃLÍ.hęPi™Ł4€~h¦ć—4 ZZnhÍ4f“4f€ŚŇfŚĐ1sFi3FhąŁ4™Ł4ą˘“4fĹͤͤ!hÍ&hÍ0ŚŇfŚŇ٤Í&h Í™Ł4ąĄ¦ćŚĐ1h¤Í BŃšLŃš\ŃšLŇfŽŁ4™Ł4´RfŚĐ!hÍ&h Í™Ł4´RfŚĐćŚŇfŚĐŃšLŃš`-¤Í Í™Ł4€\ŃIš3@¤Í&hÍ.h¤Í¦ŃIš3HÍ™Ł4ą˘Ńš.h¤Í Í¤Í´RfŚĐ!sE&hÍ0ŠLŃš@-™Ł4ąŁ4™Ł4´RfŚĐ©3Iš3@ š)3FhąŁ4™Ł4ąŁ4™Ł4\ŃšLŃš-¤Í Í™Ł4\ŃIš3@ š\ÓsFhsFi(Í-¤Í RRfŚĐ1h¤Í BćŚŇfŚĐćŠnis@ĹÍ™Ł4´RfŚĐ!sFi(ÍŠLŃš-¤Í¦ćŠLŃHĎĘ(˘»Ě‚Š( Š( Šôχ o|QhşžĄ9Ó´’r¬W2JR đűGň5×ĎÁďĘÖÓmľ¸Źď0igÉëňsí@ E{őż†~řŔ­ľ…zl/ś’ş;7%Čo˘őçđň˙^ÔĽ¨îłqc!ýÍâ!Ub9ÚÝxÍr4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE￲±˙‘ŁţÝöµx{ßě±˙3?ýş˙íjŠź w=ôši4„ÓI®CAI¦HM4š`ÓI¤&M)4ÂÔ…Ş6jqjD#ŤYöQ“[ţđëj*.nËGmü uđÜZYŰŮĆ#µ…"_öG_©ďI°<Ăű7P#"ĆčŹh[ü)§KÔçÂďţü·řW¬QG0Jt˝Kţ|/?ďË…4éz—ýď?ďË…zĺsŹ!:VĄ˙@űĎűđßáM:V§˙@űĎűđßá^ÁEÁcÇŽ•©˙Đ:óţü7řRdęôĽ˙ż ţěTQĚóţü7řW°QG0XňĄj_ôĽ˙ż ţáĄj_ôĽ˙ż-ţë”QĚ<”iz—ýî˙ďË…8izŹüř]˙ß–˙ őŠ(ć Sý›¨“ctýqođŞě6+"˛0ę`ׯTvv÷‘ěş…%_ö‡OˇíG0Rž­[~#đëięn- Imü@őOńφ¦€ÔđjÔđhpiŕÔ©ŕĐŔÓ¨A§H AĄŁś H (5Ä×^×ű1˙¶µŔ[ýž=«ę»ŽOţůĐ/Žž8šóU—ĂZLľN—eű™ÄGi2§ý”#őÚĽ†Żk¦S­ęäśÜIćŮ·ţµF€X«RCGjú áVżÄ/ ęńF뫨aŢ—ÎéśĎ÷•ç©Č÷ĎĎ•č˙ł˙™˙ *ÓË,Č›~2»O_^q@&Ża.—ŞŢX\­¶™ánÉRFyúU:ěţ1m˙…—®ěŰŹ9zzě\ţą®2€ (˘€ Öđχő/j‰§čöćk‚7p¨˝Ů‰č9¬šöźŮ»Q±†ë[ÓĄťmő ÄŚŰą#,vBç¸Ü;ţ‘¨üńEĄ“O ş}ÜŠą0C+>Ăr€1^_$oŹŞÉ"¬¬0AAí‘ř+â'5KŤ[G»ŹV$?˘Vs( ňѶ2Ýđ 9ë…𷇵Oľ3şK‰ťš{ŰQ<üŁ1 ŹŠíĽYŕ? k~;ĽĎ%‡Yż*ĐÚBč…@EPAÉ;sŰŻNôó…ĐřóĂ2řKÄ×:T҉•xĺцAÇcŰę+ž Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˝ëöZ˙™źţÝö­x-{Çěą˙37ýş˙íZŠź w=čši4„ÓI®S@&MÔdĐ“Q“A5RŐ{@±ţŇŐa€çËűŇýŃ×ü?Ě-]wä =ô„|ʨŁčI˙C¶ETEDUF…-T (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘˘»¸KXYOĘż™ö  h¤S¸:ihUŃ‘Ŕea‚q^]ŻŘ˙fj˛Ű®|ż˝şz‡á^Ą\GÄT =Ś€|Ě®¤ű?ÄÓŽYZž¦«©©Ő`x5šzš@N <„ršp54ŕhPiA¨Á§H ĄŁťš~h¦ć—4ěŃšnhÍ+ÜřrČiZĺ»ęZF6 !^ęá—ý’F=qĹuSZ|ńŤr—K§K!ůŁV{p ôR6Źřŕ•ôÂŻĽ5©x·Ä¨ö’<;98++ŚŚd36ĐŇŁ¶Ôţx>Cs§'ö•ücrŻ1ĎlÂďÖĄđÇĹëjך?Šlm­ô«ăĺŔXîUŤ˛“ëýáŚĚxV·¨Í«ę÷ş…Éc5ÔÍ+dç9ÇáŇ©W˘|WřsqŕűĂwd}fý܇“ ?Ŕ˙Đ÷úםĐEP^—đźÂ‹ôíZÚâęXuřԵޙ0Ç€2pÝyčGć•-´ó[N“ŰK$3Fw$‘±VSęé@Dü-đ?Ż_1ŃX:Muçŕí(2JóŰŚÔüC¤?Ĺ˙Ag$+¤WěĎü2:}üzî%›ßâ—ţ-ńˇfmou˝F{b6´opÄ0ônyükY‘!*ŔäpA §txĽtşä‘Éá˙ iĐC»ë !¸8ÚMÜűăň®CáĆ‘¦xÇÇľ*Ôučěu «w äJI`]CrGĘ:ä|ßJň»żxŠňÄŮÝëzŚÖ¤aŁ{†!‡ˇç‘ő¬Ý:ţóL»[­:ę{[…ű˛Âĺ~"€>©řdúÓI¨ [Ăšo‡íAQo´AB ÜN qÎZóďŮÉÚ-'Ĺî‡k˘DŔú˛×”IâĎ˝é»:ć¨.ŠěóVéŐ¶ç;rL󊧧ëžšł®ť¨ŢZ,˙ëD´bNż{ž§Ż© —á±mŁ|CÓ.őT‹ÄŇżđRˇ‰ú‘“čMw>;řSâ-cÇ×WÚw“&ź{0—í-(H8ÎW98íŚńŠń*Üłńol¬Eť¦·¨ĂjŐŤ.žŇ€=ÂŢŹÂ˙4ť554Ôť Ľ’Şí*Ć'ů[“ócŻz‹ĹĚá˘ŕä˙ČNČuí«Ě-/®ěďîŇęx.Ô–Y˘«‚x$0çąüéójWÓj#PšöćKđęâĺĺc(eĆÓ»9ČŔÁĎ GýŁ?ä §ýyG˙ˇ=ymZÔµÝNăí•ĺÍäűBů—´ŤĐd’qUh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Żwý—żćf˙·_ý«^^íű/˙ĚË˙nßűV˘§ÂÇĎv&šMÓ ®SA ¦1 šŤŤ j641¨ŘÓc]źĂS“©Ű?ýš¸v5Ű|29ţŇ˙¶_ű='°ĹQP0˘Š(˘Š(˘Š(˘Š(˘Š(¦ PĘc 7¸ŹAMş™mŕy_˘ŚÖ3ϨÜI!ÉdÉüĹK•šCJęçCEU(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+ńŃ–ëÉSňE×Ü×LěK€d×7šŠîäÉ&OÓ9¬Ş˝,‹‚ęuöŕ#¨QüŞJŔ˘µ +‰ř”qýť˙m?öZí«‡řptßűk˙˛S[㕪E5]MH¦¬ jE5]MH¦€'ž B¦¤O˘ś J 8p4&i٨Á§gŠ@´ę3MŁ4ę3MÍ fŚÓsE:ŚÓsFhÔf›š3@Ł4ÜŃšvhÍ74f€š)ąŁ4ěŃšnhÍ:ŚÓsFh٢›š(ŮŁ4ÜŃšu¦ćŚĐłE74PłE74PłE74P¨Í74f€E74f€š3MŁ4ěŃšnhÍ:Šm QMÍ fŠnhÍ;4f›š3@Ł4ÜŃšvh¦ćŚĐłE6ŚĐ¨¦ćŚĐłE6ŚĐłFiąŁ4ę)ąŁ4ěŃMÍ fŠnhÍ;4f›š3@ÍÜŃšvhÍ74f€FiąŁ4ěŃMĎ­ěŃMÍ fŚÓsFh٢›Fh٢›š3@ÍÜŃšvhÍ74f€š3MÍ QMÍđ=Q]ĆAEPEPEPEP Ř|QŐ!đEç†ď­áżŠXZŢ)ćcş$#˙kĂéÇ\^}EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWşţĚ?ó2˙Ű·ţŐŻ Żtý˙će˙·oý«QSácŽçą“Q±§Q±®SAÔliXÔli€Śj&4¬j64Ö5Ü|/9ţÓ˙¶_ű=pŚkąřZsý©˙lżözŔw”QEf0˘Š(˘Šd˛$H^F Ł©'ú* ;¨îŃž”ĆOµOBw˘Š(˘Š(Äłl´H‡Yź ˙ëâ˘đÄ_$Óä(ţgúTZôrÜ\ąQű¨#źrý_•jčđů|KŚ1ŹăY%z—.ö‰vŠ(­H (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ­-ä)pnÝ+m^qőŞZŢĄödň ?ľaÉţč˙§á»vyŢéóŔ'ą=Ď˝Cź˝ĘŠQŇěč¨˘Š˛JÚš»ŘĚ‘]†Đż—¤éío©ľîV4ú’?ýu»FsR⛸Ӳ (˘¨A\/Äó¦Ű_ý’»Şŕţ)uŇ˙íŻţÉN;‰śRš‘MWSR©­XSR)ŞęjU4†N¦¤ SR)¤ŔÓÁ¨§@NŁś H 8Śp ć—4ĚŇć—4ŔyĄ KLÍ;4´f›š3@˘“4™ fŚÓis@ E&i(Ôf“4f€—4ÜŇPłE&i3@Ł4Ú3@˘“4™ f–›šLĐłE6—4ąŁ4”f€ŚŇfŚĐŃIš(hÍ&i3@˘›KšZ)´f€Fi(Í.h¦ćŚĐłFi´f€E6Švh¦ć–€4Rf“4ěŃšLŇf€š\ÓsE.hÍ&i3@ÍÜŇć€4f’Š\ŃšnhÍ:ŠnhÍ;4Rf’€š3MÍ.hsE6—4ą˘›FhÔSsFhŮŁ4™Ł4ą˘›K@ E&i3@ÍÜŇ怌ÓsE;4RfŚĐŃMĄÍ.h¤Í f“4Ú\ĐŃMÍěŃMÍ.hhÍ74ą Rf›š(Ôf“4PćŠLŃš\ŃIš3@ E% ÍÜŃ@˘“4”ę)ąĄ Í¤Í&hÔf›š(٢›š(ÔSh ‚袊î2 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ÷/Ů“ţfOűv˙Úµáµî?ł7üĚźöí˙µj*|,qÜ÷j64ăQ±®cA¤ÔliĚj&4Ö5s‰Ť1 c]ßÂŁ˙!Oűe˙ł×ƻυu_űe˙łŇ–ŔŹ@˘Š+2‚Š)“ÉĺDϵ›Ś“@ß^Gg™)碨ęMróMq©Ý*žXś*ŽŠ?Ďz}üww7ʲ¨38áÎŃý+ Ňôô˛‹űŇ·Ţoč+j;t/H˘Ĺ•şÚŰ$IŃG'Ô÷55VŰQEQE5ŁVVV« ëNQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UÔnÖÎ٤<±áWÔŐŞŽH•Ř9U. í'µ'äämŕšţř«gy9v#ĄuÖđ¤¬qŚ*Ś ‡OłK8ŠŻĚí˱ęMZ©„9}J”®QEY!EPEP\ĹSĄ˙Ű_ý’»ęó˙ŠçŮ_ö×˙d§ÄÎML¦«)©”Ö‚'SR©ŞęjU4:š‘MB¦¤SHdĘiŕÔ@ÓÁ¤ óN˘ž H 8T`Ó Ňć -˙6+ˇ˙„řT?đ—ý˛_µo˙Qłgťĺ}sžhĎh®‹áöŠ˝żöi8˙„ŹţÝżö­EO…Ž;žÜĆŁcN&Łc\ĆXÔLiěj&4Ä1ŤDƞƢc@ c]ďÂcźí_űe˙ł×ź±®˙á'][ţŮěôĄ°#Đ袊̠˘Š(( Ž9d‘Wçs–cÔÔ´Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@V^Ą«ĹjĆ8‡™(ę3ŔúŇm-Á+š”UM.I¦µÜcsťŔŚŐn„ď¨y÷ĹžşWýµ˙Ů+ĐkĎ>-ś'ţÚ˙ě•QÜLŕÔÔĘj˛š™Mh"š‘M@¦ĄS@©©Ô*jE4†L H B¦ž J ‡'µVř‘˙#˙żëţoý ×IđW©âŤGTŤő-COňa_šÎM…Ă ·Ž:P?Ľâ5‰-nm`ţĚĘ$$îČoş@#ř qőîżł•±źOń}˛6 ‚(Á=˛%_Nřaŕ˝UćŇôżË>»ťŰJ˸\rôc@%Ez7€ľ&łăŤ[ĂÚěÓŰIa ąkr>fŞ:Á źĘ§ńď€4_ ččk©wŻ›„Ť­¨6#gŞýî8äŕ{P™Q^Ň>ř'Gţϰń7‰n±zŞPZ‘ĺ‚NĆă9$gÚąOxű â>™áŰ›—–ÎţhDs  ţ[ľÓÇ 0 ţ‡˝p4W·x“á/†ü?m{q¨ř‰ŕ_%šÎdŤWUĎ9ó€?kšÖ<§·Ă+_čWS°Únˇ”©ňůÚřŔ†ÇáÍyµčÚ/4óđĘ÷ĹzĺŐÔÄT yÚąČ'—Čă°ÍyÍQEQEQEQEQEQEQEQEQEQEQEíßłQ˙‘ŹţÝżö­xŤ{oě×˙3ý»íZŠźÖç¶1¨ŘÓšŁc\ĆÔliĚj64Ä1ŤBƤcPą Ř× ü"ë«ŰýžĽńÍzÂέ˙lözRŘč´QEfPQEQEQEQAéY7şÇp–ňŰśś”ucJćµ®R}nîLě+˙dŤ%Şj7Ťűą'Çv.@¨ö©ě‡ÉÜë:ŃPYÂđBI^VîÍSÖ„…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dfŠ(˘ŁąG’&HßË-ĆědŠČÖµ_/tÍűÎŽĂř}‡˝gés^J$”b<źď{ łŽ%Ľa†[d8,O.{⺣XŃQU ĹEÉŢE¶’ĐpŠ(­ óż‹˝tźűm˙˛W˘Wť|^ë¤Űoý’św85*MJ†µa J¦ SR©¤ęjE5ÔŞhe4đj%4đi p54áH ćś*1N€$—4ŔiA f”nhüŃšnh ćŚÓsFhŮŁ4ÜŇć€4f›š(ŮŁ4™¤Í;4f›Fh٢›E;4f›E:ŚÓsFhŮŁ4Ú3@Ł4ÜŃšu¦ŃšvhÍ6ŚĐ¨Í74f€E6ŚĐłFiąŁ4ěŃšnhÍ;4f›Fh٢›E:ŚÓsFhÔf’“4ěŃšnhÍ;4f›š3@ͦćŚĐłFiąŁ4ěŃšměŃMŁ4ěŃšnhÍ;4f›FhŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsE:ŚÓh fŚÓh QšnhÍ;4f›š3@ͦњvhÍ6ŚĐłFiąŁ4ěŃšLŇf€š3MĄÍ.hÍ74PłFią˘€Fi´PłE6ŚĐłFią˘€š)ąŁ4ěŃMÍěŃšnh fŠnhÍ;4SsE:ŚÓsFhŮŁ4ÜŃšvhÍ74PłFią˘€E6ŚĐłE74´ąŁ4ÜŃšvh¦ćŠřVŠ(®Ó ˘Š(®óŕgü•=ţŰ˙č‰+®óŕgü•=ţŰ˙č‰(řç˙%O[˙¶ú":ď?ćÖżĎü˙WńĎţJž·˙l?ôDuŢÍ­źůţ ŕgü•=ţŰ˙č‰(řç˙%O[˙¶ú":>ÉSŃ?íżţ’µľ2xk]Ô>$kV.§um'“˛Xm$tlB€ŕČ#đ ›ţmkü˙Ďőx={ýőťÖźű2=­ý´Ö·1ă|SFQ×7ą‘ÁńŻ Š( Š( třÇţ…ą<µ°˙ČOGĂŹĹ_5Ż XĎ:Ş»8V8Ü +)>Ä©R{WŤ\ëťÎź…ÎŁy5ŚXňíäťš4ŔŔ“€MW˛Ľą°ąK›‰­®îË ”eúÍ{ßÂj~¸Őőď¬-Ôǰʯ‘¸1c´‘ü8©ÍAđFć wNń¶ź¬3ßłČ{$—8ôŹĚWŤk#ÖµÖ=WU˝»‰NBM32ëŚă>őFÂöëNşK› ™­®îË ”aô#šú?ŕ‡µoÜjÓkk op8’9î N[Ž‘Źé\çěěí›ăCµŃb`}דÉâßIvn›]ŐÉ]žbÝ:¶ÜçnAéžqT´ýcSÓVuÓµËEźýh‚vŚI×ď`óÔőő4D’I$’O$šô˙Ů×ţJ˙Ż9š×—Ő­;Q˝Ó.>ѦŢ\ŮĎ´Ż™o+FŘ=FAëŢ0řAâ][ĹZ¶ˇhÖgşş’h÷ĚAÚĚHČŰ[t;ż řĎÄşV˘b7PA˙-·/Íó ˇăżđ™xźţ†=k˙Ą˙⪴^#Ö὞ň-gRKąŔηN$€ł“ë@Éű8Ć%¶ńteĚaĚ*\DĽÔ ľřAń徣©"°±.Ât”7ť•*0 s“8ݰŐő-9'M?PĽµIĆ&X'duűŘ<ő=}MY“ÄÚěšwö|šĆ Ö[vyáĘmé·éíŇ€=Çáî©m¬üvńUí‹+۵™DučŰ${¤×‹ęČš‡ŹŻ#ľźËŽăSt–b~ę´¤ü¬˝3SżŇ§i´»ë«)™v3ŰĘѱ\‚TŽ2ĺUĄ‘ĺ•ä•ŮärY™ŽKÔ“ÜĐÓZ®‰qá˝oI±đoô—ł*­6§sv‹ćů‰bCÎI9ϱ~+ÉgđGűđčó^)'‰őŮ4Á§>±¨5]ľA¸m›»ŚôöéP]ëšµĺäwzĄô÷väf–áŮă ämbr9çŠôÚ2G(ŚÄŞYĆzrÇúŐ˙Ů˙[ŠK­GÂzó,u8ťŁCÓ~Ü:ţ)˙ ŠňťGP˝Ôî>Ń©^\]Ď€ľeÄ­#`t$śW¤|Ô´ËŞkšĺěQÝĹŠÖÜä»q–#ާGÔĐ˙Źš´cIđ~–vŮé±#Ę ˙Ü >árŕuăŐ{[Ô®5Ť^óQĽm×R´Żč =°éTh˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Żlý›zxŹţÝżö­xť{_ěÜäb˙·oý«QSáÜö¦5q5ć4ĆŁcOcP±¦!Śj&4ö5š`FĆ˝ ŕ˙]_ţŘ˙ěőçnkĐţőŐ˙íŹţĎS-‘EVeQ@Q@Q@ŞZb]KľâYXUú)4žŕťŠ–ú}¬ä…3ęFOëVńEҰQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@˘¨jŃł[’Ó´qˇćojMŮ\ţ±¶R0uŇ?í·ţÉ^Ź^qń‡®‘˙mżöJ¨î&yę™MWSS!­ ,)©PÔ jU4†N¦¤SP©©€&SR)¨TÔ€Ň 4ńQOŠx4ŕi‚ś <QL—4ú¦ć”@:ŚÓsFhLŇf“4f€ŚÓsĹ.hhÍ&hÍ.hÍ%€4f“4f€4f›š\ĐŃšLŃ@ š)3FhsFi3E.hÍ&hÍ.hÍ&hÍ.hÍ&hÍ.hÍ% Í¤Í Í¤Í Í¤Ł4ą˘“4f€4f“4f€4f’ŚĐŃIš3@ š)ąĄÍ-¤Í Í¤Í Í¤Í ˘“4f€4f“4f€ŚŇQšZ3Iš3@ š3Iš3@ š3Iš3@ š3Iš3@ š3IE.hÍ&hÍ-¤Í Í¤Í ˘“4f€4RfŚĐć—4ÜŃš\ŃIšLń@Í™Ł4ąŁ4™˘€4fQš\ŃšLŇf€š)3FhsFi(Í-¤Í Í¤Ł4ąŁ4™Ł4ąŁ4™Ł4ąŁ4™˘€4f“4f€4f“4f€4f“4PćŚŇfŚĐŃšLŃš\ŃšLŃ@ š)3FhhÍ&i3@˘“4PĂQEv™Q@ixwY»đöµkŞiĚ«unĹ“xČ9GˇŠÍ˘€4ĽE¬Ýř‡ZşŐ5Vş¸`ϰ` ĐiÂe«˙Â˙·™ö^ýřŮóýýűsž›ąé\ÝĄáÝfďĂÚŐ®©§2­Ő»Mă äA„+Ň?á|xźţ|4_űó/˙Ż%˘€;˙|U×üU˘ÉĄßEa¬¬­'ŮŁp_ f”%™á­rËÄz%®«ĄČd´¸RT‘‚$Gb"´čŘŠ( Šáľ%|G±đšz_ŘÝ]}´HSČ*6ěŰśäŹďŹĘ¸Żřhťţ€şźýő˙V©É«¤+¤{uâ?đŃ:'ýu?űę?ţ*Źřhťţ€şźýő˙OŮO°ą‘íŐIő(SŽÄ·ďť oAőë^UŁüvÓ5}NŢĆÓDÔĽé›h%ŁÂŽäóĐjÜדK~׌ÄN_x#±íŠóńا…q]_ätĐŁínĎW˘Ľ‹_řÝa j&ÇPѵ™U[ĚŤ“c‚:Śž™Čü+;ţ'D˙ .§˙}G˙ĹWl"ęEJ;3ťű®Ěöę+Äá˘tOúę÷ÔüUđŃ:'ýu?űę?ţ*ŻŮO°ą‘íÔW˙ĂDčźôÔ˙ď¨˙řŞ?á˘tOúę÷ÔüUĘ}™ÝEx‡ü4N‰˙@]OţúŹ˙ŠŻcŃoÓUŃěu‘ŁŽîťQş¨e ÷ć¦PqÜiÜąETŚ(˘Š+Í~2őŃ˙í·ţÉ^•^iń›®Ź˙mżöJ¨î&yŇ•M@•2Ö„“ˇ©”Őu©”Đękˇđ/üŤzwűç˙A5Î-t>˙‘łN˙|˙č&…ş°ń.“â źÉ>–fŽl‚`Ş0ŁÜ1¬Żkşťźî­­ofŠ©…CŚeA5źŕťI`ńL3ßJO›ąYNâ8$ýxükFŐě/3xř[@‚t±ąŐ¤``'¶1ÇĐšçő]Ůë‘鋉R<§ż¶9ĎŇ·5Źęw^$šh¶YĄó<íŕlçë‘Z:îŻiŽtÍλmĂ$ŻŮK9>Ůť'ŐXw)ËámŃ’Ň÷Vdżp02‚}±üČ©~%FBiŹ™€‘F;ź’Łń/…5˙Kqk彼ĺ[Ě.Îäu=;Uź2­­Ö+|ëłö€(iµdôR¬^Ó,-ˇ:ö ĐĎ(á€ô9ÇŻJËń‡Ž›wj¶Ó¬Ö÷Dť'O§=k{Ć%ÖąqkĄ¸…â Ťŕc’sĎ×ô¬k烈©iv÷·Ęípʲ ŕ ŕuôě )GĄ†™Ł˙ć‡o<6Wz”ĆúP0rzv?©¬y|=4~$M$Hó•—ĂŚç®Éíf°Ö-­ô˝Ń-Ň÷N °ůÎsŹ\ÖWŇâOY­śńÁqĺ)G“§ńqřô¦â» 2˝Ćˇů—ęrE{ĺŚäĎä?źçW~[XŞĽë6í@«+Çžw•kG Ú”—6Úö—DS‹•# î;Ž9ë\ĎöŽ=~ę5|'ř°ĂúQd¤ˇ•â{{+mD‹ “8|´„‘ň¶Oáá˙Š€˙×ţb˛ĽC§\iÚ”‹t yŚÎ„09\žkSáßüŚţ¸·ó ăŘÖÔô-~}Fć[k°<ŚČżhaž8¬] GţÖ×/-5ĺó!VÜęŮ%•‚ő5±Şh:üú•̶×e`y‘~ĐĂž8¨üm=źŠo ş`Ó¬y9%”őüj­®Á}ŹĂ7Ú ”şŁüŕ"‘€}:rʵŃ$ĹQi·şIYb8$m$ůV§ü"š‡ü$ľ~SěľťçoĆěôëšłuuĎÄk! ˇŤőÚÄ˙:9W`ąŽú şńlúj\HČw–O™±€OÔäâ§˝ŃtV‚ěXjN·6Ů ·ÄgŔô«2Çw'ÄݰO 3¨÷ąĂŤ‹‘×˙­[Ŕu=>űű{MŠŐáRVpAĎzŚ`P˘ťĹs“đ߇ƥ·—“ýžĘ. ń“ŽĽž€zŐůü3a{e,Úë\IůŁr >Ý XĐjţ ¸Ó-ťVé;IĆ~mĂóéV<%ĄÜh {}Ş•‚0۸6psž?O­ +MŮĎxg@ţÖĎq/‘gß~äă$sŔŔęk«đ¶™Ą[ę\é7ÍqĚnŚA#$ô•ťáfMWĂšžť¬W.ĚáOcđČĹXđN{ĄßOq|0ŃŐ-Č9ăéúÓŠÚČLçlôy5źŢÂŤĺÄ’»I!Ú7Ö´âđţ‰¨4–úVĄ+^ '>VÇŕ3řłŕë¨ă×ő›W*˛Ď#÷wĂ6GëZ6C]N$°ŇíQýř\ôĂf’а\óyăx&’)Wl‘±V„pj<ŐťVv¸Ô®¦s3ČÄó´óÔgśULÖEÍÜŇćĹͤ˘€4f“4SsFi)(ŮŁ4Ú3HQšLŃš\ŃšLŃ@ Fi´f€š\Ó( fŚŇQš`.h¤Í% Fią˘Í¤Í&iěŃšJ3@ š3M˘Í-74”€vhÍ% Í¦ŃšuÜŇĐć—4ĚŃšu¤¤ fŚÓii€ąŁ4ÜŇŇisLĄÍ04f’’Í”™ QIšJvhÍ%%;4f›š)€ěŃšLŇRŮŁ4ÜŇć š)3Iš@;4f’ŚĐćŠm.hsFi(Í.hÍ74fͤ¤ fŚÓsFię3Iš)€ąŁ4”f š3IE.hÍ6Š`;4SsKš@.hÍ&hÍ.h¤¤ fŚÓsE?4™¦ŇÓsFi3Fi´ShÍ0š3MĄÍ.h¦ćŠř‚Š(®Ă ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Żgýť?ća˙·ý«^1^Íű:˙ĚÁ˙n˙űV˘§Â5ąěŤQ±§µFĆąËƢz{‰Ť0#cQ1©Ô-@Řפ|ë¬˙ŰýžĽŐ«Ň~ ˙ĚgţŘ˙ěôĄ°Ńé´QEdPQEQEQEygĆź‰©ŕű?ěí%’]vá23ȶCül=}âxŕ¸ĹÉŮ ö6ţ"üJŃ|—rĆďSaěˇa»ˇcü#ő=ŻšŘćş”cM]‘vĎ#Ćpö¶´ß x‡Téú§p‡řٶrżž1_bx[ŔžđÂĆtť*Ý.cí22cďĽň>Úş| ‡_˛)ńÇĂßŰF^_ ęˇG÷m™ż®vîŇćÎO.ňÚky?ą4eň5÷ţ*®Ą§ŮjvŹm©ZAwn˙z9ă§đ4*ýĐr hÚľŁ˘^ ˝"öâĘă¦ř\©#ĐúŹc^íđďăĆůb±ń˘*n!WP…pýtAü×ňď[~9ř¤ji%φ$ţËĽÇ1-n˙Í—đČöŻśüG j~ÔßOÖ­$¶ąNp܇^̤pAÁäUű•µ‰÷mµÄWVńĎm"K Š`zGZ–ľEřAń:ëÁ—©c~Ň\h37ĎV·'«§ő^˙ZúŇÎćËXnmeI­ćA$r!Če# Źb+žppe§rj(˘ aEPEP^?űHřłű#Âé˘ZČVóTČ“Ăűß÷ŃŔúnŻ\¸š;x$šwXáŤK»±ŔU$“é_üFń4ľ.ń}ţŞĺ„Ţ]ş1ű‘/ =˝Oą5­(ÝÜ™;#Ôf?›}FëĂ7nLW9¸µÉádQó¨ú¨Ďüú×Ńőđ&•>—©Úßپ˛iVhŰŃ”äWÜ~×­ĽMáË ^ĚŹ.ć0Ě çcôdüřUVŤťĹĐآŠ+Ďý¤|3­x†ăĂçDÓ.Ż„ qćSvĚńź®ĺ^/˙ ×Ćô-ę_÷ä×ŰV±Şâ­b\n|O˙ ×Ćô-ę_÷äŃ˙ ×Ćô-ę_÷ä×ŰU{wŘ\§ÉžđÇ‹<3msqmáMF]Na±d–#…:“îN?Aî+ÔŁ ±Cś¶'Ô׬ę'$uň›ůň~µóŮ˝śă+jîzX6ůZ<7Çęę¦{-NÜ.Ą§Ü(˙…kă/úő/űňkë˙[Ëgá Úć6Šxl`ŽDa‚¬#PAą­Š*'QĚiX(˘ŠĚ ˘Š(Ż3řĎ×G˙¶ßű%zeyźĆŽş7ý¶˙Ů*ُ™ç Rˇ¨ÔËZN•*š J¦“©«ÓËo*Ëo#Ĺ*ň®ŚU‡ĐЬ¦¤Z@Zžâk©Ś·2É4§«ČĹţ&TKOS@ëZśVţDw÷K %8Đz §śśšx4\ ő[ô¶ű:^Ü1Ź,HvăÓ”ˋ˛ĄEą¸šeŚaŽX/Ó=: ©N‹zËSľ˛B–—s‡’¨äʡ–i'•¤šG’Fäł’IüjiEBM[P’…ďnZ%ĆČqÇJ†{»‹™D—3Ë,€`<ŽXő5[4 Ńp4&Őő ŕňf˝¸xÁV~ľµR)^)Hť‘Ôä2śřÔy˘•Ŕłwwqxę÷SË3€dbÄĆ’ÚćkY<Ëi¤†LctlTăę* ŃšŃţŮÔ˙č#{˙ŰükcÁZ¬VÚŐĹΧrG™ _2BX±Ę÷ú ĺłFi©4î5nµ{Á=Ěv÷· nŇ1UY z φy •e‚GŽEččÄřŠŠŠWwąžKŹ=ć•§Č>ab[#§=j{­Vţę*ćňycţëą ý}jŽhÍh.%·”Io#Ĺ čČÄřŠšóQĽ˝]ÝM2Ž@w$©ćŚĐ°Í$ !‘ă‘z2üEZ}_PyD­}uć€ŢkdNľŐC4f‹!•ÚS!v2¸ą<ç×>µn}_P¸ÉžöâHŹZBAúúŐ Ńš.łE6ŚĐ1ŮŁ4ÜŃšvhÍ74PłFi´f€FiąŁ4ěŃšnhÍ;4f›š3@ͦњvhÍ74PłFiąŁ4ęLŇfŚĐłE74f€FiąŁ4ę3MÍěŃšnhÍ;4f›š3@˘›š3@ͦćŚĐłFiąŁ4ěŃšnhÍ;4f›š3@ š\ÓsFhŮŁ4ÜŃšvhÍ74f€š3M˘€š)ąŁ4ěŃšnh fŠnhÍ;4f›FhŮŁ4ÜŃšvi3IFh٢›š3@ͦćŠvh¦ŃšvhÍ74f€š3MÍ fŚÓsFhÔf›š(Ôf›š3@ͦćŚĐłFi´PłE74f€š3MÍ fŚÓsFhŮŁ4ÜŃ@ͦćŚĐłFi´f€š)ąŁ4ąĄÍ74f€E74f€š)ąŁ4ěŃM˘€>#˘Š+°Č(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+Ůgoů?íß˙j׍W˛~Î˙ó0ŰżţŐ¨©đŤn{Ť©äÔm\ĺŚj…ŞF5`FŐš‘Ş4Ť«Ňľ uÖíŹţÔŻ4jôŻ‚˝uźűc˙µ)KaŁÓ¨˘ŠČ ˘Š(˘Š(ťń˙‰íü!ákÍ^ähĆČb˙ž’źşżNçŘ_ęúŤŢŻ©Üę„Í=ÝĂ™$vîOň€ě+×?iż=˙Š-´(Y…ľť’AžWýn?Ţ5ČüđńŚíí®ť:Ô}˘čÁPxOřŔúgŇş©Ąó39jězWŔ_…Ń<ţ&ńşÉĽ±¶dc´¬;˙˛?Jú ŞŠU€-sĘNNě´¬QEHŠ( ąŻx7LńžŚö:śad0\¨ůáP}=GCú×KE4ěî€řCĹ~ľđĆ»s¤ę‘í¸„đĂîşźşËěGůÍ{/ě×㇊éĽ)¨ÉdÝ%‰oán­Đڰ÷Ö»Ú#Áë®řMµ‹X‹jZX2ezĽĆ®>÷ŕ}kĺ» ąôűű{ËG1Ü[ȲĆĂł)Č?Ąu&ŞDĎágßÔVW…uüAáÍ;V…BĄä .Đs´‘ĘçŘä~«\ŤXĐ(˘Š(˘Ł¸š;x$šwXâŤK»±ŔU$šň/ÚGſُCµ ÍS"@:¬üß÷Ńů~›«ć}MąÖ5kM:Ĺ7Ý]J°Ć¤ŕn'űJŮřŤây|]âűíUËůŰ-Ńż‚%áF;zźrkŐ?f/ ů×w^'ĽC˛ ŰZ^ ó¸úţޕֿw?‰žUń Âłř7Ĺ:LîfŤBÉ ŰqćFÝç}ÁŻQýüZmµ+Ż ŢH|«śÜZü2óŻâŁ?đë]źíá/íż .±k5ö•—m˝Z÷˙,úőŻt«űŤ/SµżłsÍ´«,l;2śŠď 3ďş+Âőż‰Ľ7a«Ú`Gubłĺ·FSô ŹÂ¶+‘«Q@Q@µ/ůÜ˙×&ţFĽ tŻYľRöS¨ęcaúW™%ŚŹĄKzŮ‚ŕ—ń©îtQEb0˘Š(˘Š(˘Š(˘Š(Ż2řÓ×F˙¶ßűN˝6ĽÇăW]ţŰí:¨î&yşÔ©P-L¦µ$ťMJ¦ SS)¤2e5"š…jU4*š‰iŕŇPiÂŁś(QJ 0p4 xĄ)A¤©A¦ć@˘›š3@Ł4ÜŃšvhÍ74f€š)ą˘€š)ąŁ4ěŃšnhÍ:ŚÓsFhŮŁ4ÜŃšvhÍ74 vhÍ74PłE74P¨¦ćŚĐłE74f€E74f€š3MÍ fŚÓsFhÔf›š3@˘›š3@ÍÜŃ@ÍÜŃ@˘›š3@˘›š(ŮŁ4Ú(ÔSsE:ŚÓsFh٢›š3@˘›š3@ÍÜŃšvh¦ćŚĐ¨¦ćŚĐ¨Í74f€š3MÍ fŠnhÍ:ŚÓsFhÔf›Fh٢›š(٢›š3@ÍÚ3@˘›š3@ͦćŚĐłFiąŁ4ę3MŁ4ę3MÍ fŠnhÍ;4f›š3@ͦćŚĐłFi˘ŚĐłFi´f€E6ŚĐ¨Í74f€E74f€FiąŁ4ěŃšnhÍ;4SsFh٢›š3@Ł4ÜŃšu¦ŃšuÚ3@˘›š3@˘›E|OEWaQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW±ţĎó0ŰżţŐŻŻcýžżć?˙n˙űR˘Öç°šŤŤ9©Ť\ĺŚcQ5=Ş&4ŔŤŞ'5#TM@Řץ|ë¬˙Űý©^fŐéźúë_öÇ˙jR–ĂG§ŃE‘AEPGÔăßŇŠˇâ šßAÔ¦O˝´®>ˇ  ‡ĽW©ľłâmWQ‘‹›©%śáKŁđ…}ű0čŃÚx.ëU#ý#Pą+»ţ™Çň˙}Ż—G"ľŃř1j¶ź ü<‹üVćSőffţµŐ[HŘÎ;ť­Q\¦EPEPEPwG<C2ŠE(ęz2‘‚+ái‡Eń&©¦âŇćHF{…büF }ĺ_|} ř­­Ć7ů.~¦'ő­č=Z"G˛~Ěz—ÚüqdÎKXŢ:¨=‘Ŕa˙ŹŻ_Żť˙e ]x–ü…mßůWŃU¤Ę[QYŚ+Çi/dřb=Ö@/5<‰pyH_űčá}Ćęő뉣··–yÜGJ]ÜôU$źÂľ%řâcâ˙Ţę—"Z»ůp ąhá^c#žçž¤Ö´Łw~ÄÉŘĂŇtůő]NÖÂŃTÜ\ȱ¦ă€ =IěR}+ëßŢÚhZ~Ź h‹›K}´Î9|źęI'>őă˙ ĆŽđÎt}>év ˛ŢÜŞĺŰŹ”`ź®ă^‰dţ]ěÝdVýkÇÇćSöžĘ É}˙đęhňó=OVš$žŠdWŤÁVF ×Äß<.ţńŤö—ŹômŢmłz&űżĺOşšűrĽŹöŤđ‘Öü&şĹ¤eŻt¬»m/ űăţĂ}z×±FVv8d®q_ł'‹~Ë©\řfňP!şĚö™í(:ţ*3˙>µôŤ| Ąj:VĄkc!ŠęÚE–7™NE}ÇŕývßÄްŐíŘî˘S9(ÝOĐ‚? ŞŃł¸˘ÍŠ(˘°,(˘Š Q‹L‚=,Ř(>IR¤÷9ďő«ÔT¸©n†›[|XŚEń#ÄŻÝK’Łđ˝›öS˙ż˙_I˙ WŽ|^˙’›âOúűoé^Çű)˙Č_˙ݤ˙Đ+˛jÔěg÷:(˘ąK (5ŹŞë b¶ĂËÝş…˙IÉGV4®h]ŢAjąš@3ĐIü*->ü^Ľž\l#OăcÔý+š´¶źQ¸'$’~yµu––ékĹůGSëQ9kĐm$MEV„…Q@yŹĆľş7ý¶˙ÚuéŐć:čżöŰ˙iŐGq3ÍVĄZ…MJ¦µ$ť J† Z™i ™MH¦ˇZ•MJ¦·4 jş˛‰--[É?ňÖC± őü+¨ř{áç†=SUŹz7Í-ĐŹď0ďě+Ó8Uěý+HÓľ¬–Ď,O‡:™\˝Őo@ĚöZٍx'ZłBË w*9&ÉüŽ üzlŢ!Ńá“Ë“RµĐ 8üŞýµÄ7Q m¦ŽhĎFŤĚU{8±]žĘČ쮥XF˘˝‹Ĺ~¶ÖíŮŃV;ĺ$ŁŚű7¨ţUă÷Ém<Î…%ŤŠ˛žÄVR‹‰IÜ@iA¦ŠHÇć”e(4 vhÍ&kÓĽ1áť&óA˛¸şł4‰ąČĂ<źCN1ćŘMŘóLÖŻ‡4KŤrí˘„q Ý$Ś2SíSxŇĘßNץ·łŹË„"ą'’=ëGáîµm¦]\Azâ(îíôgůÓKŢł č đdú]‹]Áp.cŚfAłk(őśŠäó^©âßéŃh×0[ÜĂq<ńŐb`ŘČÁ$Žśňš&’z ͦњ’‡fŚÓhÍ;4f›Euľđlú­’ÝĎp-˘őcfćaëÔ`VWô;Ťíbť„‘Č ŽE ëÇcţ5ŢxCÄz|š5µ˝ĹĚVóŔ‚6YX(  ëĹs_µ»]NâÚŢÉıÁ¸´ˇ'Ëő­cËtJnç%š3MͬʚžÂÖkëČ­­×t˛¶ŐÖ«fµ<3¨¦—­ÚÝĘ Ť Ž A?­ q<˙§[BŃ_$—gË)…'Đ6Ąpň+G##©WRTÔöYüI¤Ehn>ß®2>Űz׏j?kżąąŰ·Î‘¤Ű铜UÍ%°“dYŁ4Ú* Fią˘€Fią˘€š3M˘€š3MÍ껦iwşś…,mžR:‘ÂŹ©IůúŹđŻŐlfÓu ­.ď#ldt#±QYNŁNĺlŃšm©(vhÍ6ŚĐłFi´f€šLŇfŠvh¦ćŠu¦ćŠvk¦đĎ„çÖ­ÍËĚ-íňU[nâÄuŔăŹzĺó^•ŕ?X¦ŹŤÜńŰÍ yŚ8$ś‚xĎ5PI˝DÎOÄŢ¸Đ¤ŚĽ‚ky8YcźB;Vk·ř‰®ŮŢÁŤ”‰>É<Ç‘T`=úšŔđu”‡-­îăó `ĺ—$tRGO|Q$ą¬=51óFkÓĽEáŤÓC˝žŢĚ$±ĆY[ĚsřšňüŇ”\wîvşO'»±Iî®Ĺ»H»–1âéžGĺ\Öµ¦O¤_˝­Đ€Ü¬˝Oq^ĄŁřźLĽ°ŽY.ŕ‚PŁĚŽG T÷ĆzŹĄy˙Žux5m`=ˇÝ H#Śn9$ź§5rŚRĐI»śţhÍ74fł(vh¦ŃšvhÍ74PłFią˘€š–ÖşşŠ@2JáŽIŔ¨3Z>˙‘L˙Ż˙ô!B­˙Nµ˙›łý+đ΢š^·kw(&4$6:€Aţµę“ř“HŠĐÜ}ľ\d*0.}¶ő­ ˘Ö¤¶Ď‘Z9$]I Šnj]Bçíw÷7%vůŇ4›}2sŠôo xgIĽĐlî.¬ĂÍ"nf20Ď'ĐÔF<ÎČmŘóLÖŻ‡tiµËą ‚XădMäľqŚŰëSxŇĘßNץ·łŹË„"ą'’=ë[áwü†nżëÜ˙čKMGŢłô!Ôüw§ŘOw%Ô ‘.⫝̸źŇąJöoȵ¨˙×#^/šsŠ‹ĐIÜvh¦Ńš‚‡fŚÓh fŚÓhÍ;4ShÍ;4f›š3@Í&i(Í;4f›E;4f›š(ŮŁ4ÜŃ@ͦćŚĐćŠJ(âŞ(˘şĚ‚Š( Żéš>§Ş—^ťyzSď}š“o×h8ŞőŔx"‹á†”ń˘«ĚÓ<„ĽŢk®Oŕ ~ówü!ľ'˙ˇsZ˙Ŕřš?á ń?ý š×ţË˙Ä×Ú4PĹßđ†řźţ…Ík˙e˙âh˙„7Ä˙ô.k_ř/˙_hŃ@żüJŠYü;¬*’M” ˙|Ö¤†Áµ}Ý_$|k‚+‰úâ@ŠZ' âh‘ţ$“řĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Ĺű=˙ĚţÝ˙öĄxí{ěů˙1˙űw˙Ú•řF·=Ş6§5FŐcZ˘cOj‰ŤFŐTŤQ51µzgÁ.ş×ý±˙Ú•ć-^›đG®µ˙l?öĄL¶=FŠ(¬Š (˘€ ««[Í.ňÔuž‹ţúR?­ZŁé@źEJ¬0Ă‚+ěŹwßnř[ˇ±9h‘ŕ>Ű$e ňßÄŤôkZ{Ś*\łÇŹůć˙2ă¬+Úże­|K¦jš¬<Č$pŚňQ°¬>€…?đ*몯 Ł8î{˝ +Đ(˘Š(˘Š(˘Ž}(ŻŤ>8_%˙Ĺ-vHÎV9RĹ#T?Şšúű[Ô`Ńô{ÝJôí¶µ…¦rxáFqő=+á Nö]KR»ľ¸#Îą•ć|y“úšŢ‚Ý‘3ŢżeG â;ÂĆ0D¸˙ˇ ú ĽÇöuŃßKřoo4ɶKůžëž»NDĎă^ťYÔw“)lQQÝOµĽłÜ:Ç J]ÝŽ¨$űb gţŇ>-ţČđĽz¬ĽŐ2$ÚŘ)žďŁňý7WĚšuśÚ…ô–Ëşiś"Źs[źĽM/‹Ľ_«9"o.ÝĆČ—„\r}É®«ŕއćM6ł:±ć(3ýďâoŔqřšŇ˝e… ć÷ýEN¬ÔOHĐt¸4m&ŢÂÔ~î%Ál`łwcîMwZ.†/|;+ň>řöŰÇäy®wN´{ëŘmŁë#`śtĎĺ^§o ApÄ0ˇ@öó¸ Ţr©S_ógŁ©ěŇŚGŻÝ¦ÍMĹ*‡ŤÔ«)čAŕO˘˝ăĎ>#ř™áwđ‡Śo´ĽłgͶbsşűżĺO¸5éł'‹¦Ąuá«ÉŠď3Úî?ňÔ™GŐFŕ'Ö»_Ú7ÂŰ^]^Ö0ot¬ČŘ^^÷ÇáĂ{޵ó—sĄjV·ö2®­ĄYcqŮ”äWZýä ögßtV?„5ŰřoOŐí8Žę ĺ¸Ý~±\ŤXĐ(˘Š(4Phâź‹ßňS|I˙_mý+Ř˙e?ůë˙őôźúxçĹďů)ľ$˙ݶţ•첟ü€u˙úúOýşŞ|qÜ÷:(˘ąM®bó˘)˝ ^µ‡Źç\Uˇ¶S€ ů›ßÚş*\T·v#††0‘(U©(˘¨AEPEP^_ń·®‹˙m˙öťz…yĆŢş/ý¶˙ÚuQÜLó5©’ J•MjI:š•M@µ*Ň2Ö·‡,?µ5»+<˛Čcű˝[ô˛şß†;Oڬ·uŰ&ß®Ć˙ëÓZ±Ý,qŞFˇQ@UQĐÚĽźâ‰gĽÔfÓmddł¶>ÓŹ1‡\űĆ+Ö«çKÂĆös'ß26~ą­j;+ #A­=X»ŃŻâÍČççB~W„VP4ńX^ĹBi×qßŘAwúą8ĎlöŻ8řĄ§¬ť˝ěj¸RŻŽě˝˙"?*ęľ>łÝÓ/ʦóY6˙dŮâóÎ>›NĄo-crâĂđűN’ÜÝ]‚Ę«Ú|>FżśÜ\ȶjŘŚ oqÉ=9í]ݧüzĂţâ˙*çĽ[⸴&H#‹Ď»q»i8T§ü(qŠWavDţŃŮ6ŻÚUżĽ$çőÇřŁÂW*_íyÁla“ę==ë Đ||.ďc·Ô­Ň#Yc'źP{{×qÓŽíčükÓ¬g76Vó•ÚeŤ_™Ĺí°3\đŤž±¨5ÜóÜ$ŚÂÇÜWáŹ[jÚµý¬ň̉oťĄ1“ócśŠę|Mă4mZK4łIB޶âäuô¬Ż†r™ő˝NR6™~=2٤ů\¬ öâXéš5Őä7-$J W==ë3Á~µ×mîdąšhĚNČç#ÜWuăůu÷ţ„+áOüxß˙×EţT8®d‚úę^EňNžRĎ&$iH*‹Ďsś~u«kŕM&(€›Ďťű±}żą®jqid·“)`V' ®?Hńô—:ŚP^ÚG2°@čÇ+ž9ëM¨'¨jČüGŕe‚Ůî4v•ĘňĐ?ĚH˙d˙J±˘x n’jŇHÓ0ÉŠ6ÂŻ±=ĎŇ»şâĽOăVÓ5'ł˛·IZ.$y Ć}8Ć:°»e‹ĎéRĆÂݧ‚L|¤6ŕ¸?ă^y®é75ń¶şśnG^Ž=EzÇ…µÄ×tó8ŹĘ•d‰ś€}Gµ`üT[Jł¸ÇΓlŮ”źý”R”SW@›˝Šđe–©˘Ű^Mqr’J *…p0Äz{V7Śô+} ćÚ;ieJ…‰“`ű ô˙Č©§˙şßú®Oâ±Ĺý‡ýsoçJQ\·ő5żá^éßóőwůŻřQ˙ ÷N˙ź«żÍ²ábÝĎ„÷Ů®§Âš˝ţµ \ÜÚEokŃKźoozk‘čTf½ӿçęďó_đ®NëC‚®˛J`.‹Ľăw*¦;׬_]Áck%ÍÔ‚8cf5ĺ–ZŐĽoz¨cI']ŞO8źĘ‰Ĺ+lé˙á^éßóőwůŻřWáŤ[[’Ęy$HŐY·&3Á˘˝’Ľ·áçüŤł˙×9?˘QI LŘżđ¬vs=¤÷R\>Z1\íž*m3ŔQB§PšYć#‡jʧz즑!…ĺíDRĚ}ë^y'ÄY~Ö|»Í®z3ťä}z mF;‚»/jţµ{vm.Y#śtI*ŢŮę+În"’Ţy!™JKe=Żw˛ąŽňÎI1Ę×>„WšxţĂ‹ Žď:wbĹ ©śU®33Ă^»×ş Şś4Ě3Ď Ív±xJXŔ’[§~íĽČbş}>Ň+ (mm×lQ(Qďďő®GÄľ8}ô––$ĎÚň9;CwJ|±ŠÔ.ŢĹk݇跛{™Ń›Ćő ăźj±qŕ >8$quvJ©a’˝‡ŇŻřKĹ‘ë’5´ń.ŐwUÇ|{űWE{˙s˙×6ţTÔbŐĐ®ĎÍšnj{¦öÜ?Ýó?LÖžŮáý=tÍÖŐTTýÜňOç\×Ä?K`©§Ů9IĄ]ň:őUč÷<˙“]­x˙ÄÇĹ—şúlýzŢnŃĐ…«9ârrzšžÎî{+„žÖWŠUčĘqUłFkC×-mAÔfcŮG\}Oň®ÄşäšU2HçlqŤÇú Q‚JěčŚ+ď‡ö/űÄńKŰy żČ‚ĂáýłÚFog¸KŽwŞ2íÎ{qŇ«XüD”Ý(˝łŚ[“‚b'rŹ^zţ•čQH’Ć’FÁ‘ŔeaĐĐŐ%l ´x÷Šôh4mb+Ky$txŐÉ|g$‘Ř{Wa˙ ÷N˙ź«żÍ°~$˙ČŃm˙\˙BjőQŠmg§xćv˝žE¶YbEĆöPx$ôúV¤ţŇd¬Fâ'Ç ?ˇŞţ*ń™Ňµ˛ł·IdŚ1śśFpö­Ź ëéŻY<ž_•4M¶D#ž„~ż•4ˇ{»ž[âçD˝ň.0ĘĂtr/GĐűWCá? Ůë:@»¸žá».Śqő˝ń6ÝeđúM´o†U!»€x#ů~U'Ă_ůWţşżô©PJV čs'đ˝®“6śM;‹™|¶ŢG#¦˝vş†l4I^k6Imß)č0aüMŰ˙dLăĚřőĆÓW<'âÉ5ÝFKW´HBDdÜž„ t÷¦ąT¬Řčő+Dż°žÖVeITˇ+ÔW›xËÂöşź öÓO#<ľYŚ`žĂÚ˝XĽ:~—sv¨Â…ö“Ś×–ř›ĹRk¶q[˝˘ÂO3p}ŮŕŚt÷§RÝB7:=?Ŕ–:}´ďstX•Čp úVSxkOŹĹI–âŕFńŤňą-׏@kĐô?ůé˙őďţ‚+Î<}q%§Śâ‰"HÝO¸ć”˘’¸&Ůż/ĂŰ-ü««Ż3nâ¸Ďlń^k*4Rî;ë.ˇű’ qížŐĺô˙°ř‚IPb+ˇćŹ÷ş7ëĎăJ¤RW@ßx}5닏´<‘Á Ź™1’Äđ9ö·użéš^•sx×WGĘL¨%yn€tőĹnü?°ű‡!v’ä™›č~ďčükâmëHÖZTÉ+ ý”~yü…©Fě/vr~đőŢą3yŽ8yp=‡©®öÓŔšLQ9žwîYöŹŔ ßŇ,"Ó4č- lk‚Ľ{źÄ×âOëżÚ3AĄZĎĽLPH-ËÇSČ#”ůTVˇvË÷ţÓĺŚýŽi­äí“˝×őŻ=Öt»­"ôŰ^&ްĺ\z^‘ŕÍoRż–Km^ÖD‘WzLb(žAížjO– wáé'ŰűëR$Síś0üąü(”SW@›Lň\ÖŹ‡üTgý|Ç˙ˇ ĚÍhřp˙ĹC¦×Ěú¬Vĺĺ^âC˙§˙_2čF˝ÂĽ;ćţ*Oţľd˙ĐŤmWbbgćŚÓkcÂzhŐµŰ{y0‚^O÷G8üxŤb•ô(ÓđĎîuh–ćĺţÍhyRFYǰô÷®Â/hČ€:O!ţóHAý1]1) Dť©/Đ(çú‡Ä6[¦[ 4hŕ<¤ĺ˝đ:Vü±ŠÔ›¶YŐ~ŰĽlÚeĂÇ'd”îSřő­yőő¤ö7R[ÝĆŃ̇M{…üA˝jîbž2‘“śgˇ¸¬Ź‰ZZ\é"ý÷öÄGR„ă ţu2‚jččÎĂşÖątc·ÂDźë%n‹ţ'Ú»űOéP ™îą/´~VGľűo†ŕ s%ą0·áÓô"°>*Ůóc|ŁÖ?Ş˙ěŐrŠĺş%=LOxv=z[“q$‘Á ŽS,~ŁĐŇş—ř{§í;.î·cŚ•Ć*Ňđ ‡Ř|70Ä—ĚߏOĐ čUŐóµÁÁÁčjŁmAłŔ¦Ťˇ™âaŃŠ°ô"»o ř6ŰTŃ⼻šxŢRvŞŤ ă¸ö5—ăÝ9­ĽNţR|·x‘îÇ‚??ç^©§Z­–źmlť!ŤSëÖ˘ŐÜmžq«řbÂË]Ó4č®.Ü“ć+•^}*Ü˙…{§ĎŐßćżáXrß}żâL.§1Ç8‰>‹ÇóÉükÓęŁî&Ůć~đµ–­oq=Ü“ţćsD`çŹzô"ŽcŠ (UQĐĐW”č^+“BŽęÝ-`ó´›‹ă:{W©ŘÎnl­ç+´Ëľ=23Nť­ ™­řFĎWÔîyîŘ! ăî+›řqÄşŚJIXâeőáŔ­xĆMV{4łIB޶ă!F}+á¬Ţďĺ#H™ńé—“·2°ő±Ţk–o¨i7V‘2«Ě›An‚ąë?é‘Fżi’yäÇĚwm\űĎë]MĺÄv–“\LqH]ô5Ŕ/ÄY~×–±ŹěąčďÇץTąSÔJý ZĎ€a04šLŇ, dE)7°=żó§VG(ŕ«)Á¨5ď°J“ñśŁ¨e> ŚŠň?Ëmâ{ťŠeU“ÔŽOć EH¤®Š‹9ÜŃšnh¬ŠFiąŁ4ę3MÍ-.h¦ćŚĐłFiąŁ4ěŃšm fŚÓhÍ;4f›š(ÔSsFh٢›š(ńuQ]faEP_Yü ˙’Y˘Űý%|™_Yü ˙’Y˘Űý%w”Tw%ĽM3mŠ5.ÇŔ$×˙ ŹÁźô›˙d˙ éĽ'â8|IĄ%ĽB¶WŇضňâů†;Ő»^đÓâ?†´;Mu5+Éck˝Z{¸€Ű1°\éţńľ…âąî!Ń.ži`Pî&LqžEtµňgÇ?ů*zßý°˙Ń×ÖuňgÇ?ů*zßý°˙ŃĐEPV,lîu Č­l`’âćSµ"ŤK3`*˝{‡ěő§ÚYhÚ˙‰î#Mh­yţTŢř÷9>Ţô‡cđ;ŢY¦Ómd#")fbĂŘíR?S\W‹Ľ%¬xNń`ÖmĽ±&|©PîŽLuÚˇÁ©5żř‡XŐ$ľ¸Őo#±dHfdH‡` 1ů×A≗ đ$ZŻb·W¨ÁľŢň|Ăiŕ…ÇŢĆA9ç4ç”W¶i_tkż čúŐć·5ŚŰÇqvó2PËś) c’9$ÖđâĂZń¶ĐjÂ? imó_–W2 ąŔaňđ2IíÇć4W°7ĂŻ xŹJľ—ŔĺŐĺýšîk{•Ç™ÁŕeŚăČĎW=đŰÁ:lu W_Ő†“cÄžYcq’yÎČěrNprËLżľ†yl¬®®b€n•ቝcś±އݎŻKń'ĂßÜx6ëÄžŐîomm ĹpĽŕc8ůT‚r+Đ>éáî lu‘Żmę’۱ĺGmÜÝs@4Q^¦řŰÄ_.´o j&}YýŔl&ŐĎLdî$ÇOjéí~x]ąźIđ߉î¤Ö˘V#ÍŁr:ăäî±őć€%‹PÔ5˝LXiV şR„yŤĆN3ś;ŕúVö»đóĂ·Ţľ×ü ¬\ŢEc¸ĎĘő l|ŞAçs@KEzJřOÔ~·‰ôK«©o­ÇúU´…J®ßżŚx0ÉéLđo4ýCŔšŻ‰üAuumim¸@°•RŁÜ¬BŹ|Đ?ü ׿𯏋~Őmö-Ű|ź›Ě˙YĺúcŻ=iÚ—€µ Zx¦[‹Vµ¸+UŽő p§¦NGoĎř˙“`?ő×˙në›Öü)ŻÁí+]žˇ!šQ‹7“0!bŔ•\px 4Ą“ÉŻ]łřyámĂşM÷Ťő‹Ű[ťQCB–ËňFć;[ #'Ď|fłôĎřfĂâKiz¶ż Ć’±  š Wç“ză ˝1Ć <ÔtŰí2U‹R˛ą´‘—rĄÄM#ÔRľý˘tÝkq¨]jM·ş-µ#ˇ—“Śg€[żjůň€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ öŮ÷ţc˙öď˙µ+Çë×˙gďůŹŰżţÔ¨źÂ5ąëíQµ9ŤFŐcÔmOcQ51Ş©˘jb#zôď‚ó˙¶űRĽÁŤzwÁş×ý°˙Ú•2Řhő*(˘˛((˘Š(˘Šů÷ö đł°řžÖ1…Ň쏮ccú®ÝŻđ/î<'â‹^Řnň[G˙=#<2ţ#§ľjűk[Ó-uť&ďMÔ#ÚÜĆc‘}ŹqčGP{_řű—ľ ńĆ™| ;ŕ&Śž{úŽÇ5ÓJJK•™Éu>×ѵ;MgJµÔté„Ö—1‰#qÜ_CŘŽĆ®WČ˙>&Í໳c©oźBťň꼵»ăQÜzŽýG=~®ŇőMVÂÝ:â+›Y—rKeXV3‹-;–¨˘Š…ZúúŢĆ%Ô«öĎSôëŤŐüS=Ćč¬A‚.›˙Ś˙‡ůćą«â©Đřž˝ŤiŃ•GˇŇëZž›oC|ë!<—“˙ÖŻ?Ľš7¸sh%ŽxW|‘UÉ,Ĺ’O$“\ľ»âëM?V˛ŇíĘĎ}q§©[XÚ!yçpŠ=3Üű§ŘWŇÚ.Š4­­”‹[p"F7·R~§’k•ý›<·Ď}âB3ä(6¶Ľă,Gďň;ŕMé^ď­éöÚÎŇXŕIC>8€z{ó\9Ą×÷SŃ~đŚ,Ő=__ČÍđ>źĺÁ%ěŠCIňGźî÷?źň®®™ I IJa@ě)őt(Ş4Ô'Ď' ˘Š+bMMĹ*‡ŤÁVV5ń7Äß ?„!şÍĹ©fé 2ŹŞŚ˙ŔO­}%_iw÷:^§kc'—um*Ëz2śŠű‹Áúőż‰Ľ5a«ŮźÝÜĆ—űŹŃ”ýřUVŤťĹĐ٢Š+ÂE€>)ř˝˙%7ÄźőößŇ˝ŹöS˙ż˙_I˙ WŽ|^˙’›âOúűoé^Çű)˙Č_˙ݤ˙Đ+ާŔgĎs˘Š+”Đ(˘Š(˘Š(˘Š(˘Š+Ëľ7uŃíżţÓŻQŻ-řß×E˙¶˙űNŞ;‰žf•*Ô jU5©$ëR©¨¦SHdË[Ô—â Ć8HĺϢžô&±V¤S@N)  ©AëÇ>!řzm3VšöËXÜą}ŔpŚz©ôçĄo|8ń|R[E¤ęr„š0ŢF8;)>Ł·Żóô9%FI]`« ‚+v”Ń8Šż¤i×Z­ęZŮĆ^F<žĘ=Iě+Řćđ~,ľci±ëň3(üĹjŘiöš|^]Ť´P!ęqźŻ­BĄÜ|Ăt›ôÝ6ÚÎ#”…çÔ÷?‰ćĽ÷â˝úËibŚ’¦GÇbÝä3ř×gâÚč6eĺe{¦ş„XúźAď^){u-íÜ·7 şiXłsNŁŇČ"şź@ZǬ?î/ňŻ$řŹ‘řŞá¤ÎŮ ôÚó˝nÓţ=a˙q•RÖôKjŽú-Ĺ>ă©Ă/ĐŐJ<ĘÂNdž,ŃÇ–‘Ř*Ô“Ňľ@B€Ç$O­`hľŇ´›‘qrK:ý×™·mú­oTHÓĄ»ąa…*ç—nŔR„yV ÝĎ$ńł«x«Q+ÓxP zî‰˙ kú÷Ź˙Aá7Wss,ňśÉ+—cîNM{g„o÷Ă–FÁŠD±ľ;2ŚšníŽ[sńţF™żëš*ŇřS˙!+ďúâ?ô*ëµĎ iÚÍȸş¤Ŕ-c zäĺ~ ‹\Ő#_ş‰´gĐ5­Ná}ŻĆ˙ň*ęîýVÂŹřńż˙®‹ü«{Çň*jîýVÂřđż˙®‹üŞźĆ…Đ˝ń;ţE±˙]ÓůňŰ3ţ—ýt_ç^Ąń?ţEĄ˙®éüŤye™˙Lţş/ó¨©ńŹ +ÄŰÔתM%˝…›<… ¶…~@§ŰĂĽ ±ÄjŞŚ*Ž·Ł[ë0¤WŹ0‰N푾ĐO©ő§ň­ÝĎ-ńw‰%×.¶¦čěŁ?»Ź×ýŁďüŞ·„?äfÓë°ŻB˙„ Fôą˙żźýj冝•ńÎŇÓ”˛!ŽO+šÍŧvUŃę•ĺź?än›ţąÉüĹzťy_Ăżůç˙®rčB®{˘VǢř‡ţ@źý{K˙ đŞ÷OČż©˙׬żúŻ ÍM]ʉíŢ˙‘cN˙®BąŹʰřăD’L_,’{0ó]?żäXÓë®â©Ć·i˙^ă˙Bj©|"[žˇ^â[9¬uËČ®YÔźâRr zO‚üM­g˝Äu×k+őţ!ëď]ĺ•­ę…Ľ¶†p: 6>™§%δv<»áµ¤Óř‰.[É·V.ÝąRýJő;ßřóźţą·ň¦Ä¶–"x–„ă@qĆNöëďřň¸˙®mü©Ć<ŞŔÝĎ 1ÁÜŃšć4=ëFľ]GJµ»B›'›¸ük’řŹ Iv‹©ŮŁ<±®ŮQFI^Ě>źËéX>ń2é2›;ćĹ”­˙óÍ˝~†˝Z7Y^6 Ś2NAµĐ­4gł>|§Á ·$PFŇHç Ş2IŻl˝đî“{)’ćÂňX ¤ýqŚÔúv“a¦äŘÚE ‚Ę>b>˝j=“+çôżéăG†F÷,ň#A=‡cŽ•›…gá˙i ™$óŚź$€e~BČő'Óµvş®ŁmĄŮ˝Íä#^»@;šń­S]ąľ×†©ť’#†‰z„ růő4ĺË ]žŢŕ”`§ GŇľ~•)^9T¬ĹX Žµîz«o¬iŃÝ[0Ă :wFî gk>Ňők“q2IÍ÷žŰ»ę"śăĚ´ěp ă‘üO&vG—8íŚ2+Ő5&TÓ®™ţâÄäý0j¶‹˘ŮhĐ4v1mÝË»ł}MsßµŘěôćÓˇpn®ŕNůúôúf„ą#¨·e߇R¬ž¶U#1»«}wü¬ŹŠ¶sKmeu–ŠĘřţŘÁý?•sţńh÷oovHłś‚[Ż–ŢżO_½e+C!IbqÁ2°ţ´+J6Ńž4˛*FĄťŽ’M{¶‹o%¦Źeo7úȡDnsČ4[éş}¤†k{;X_©t‰TŹÇf cž$–Ś«„zÓ„9DÝĎ0ř•˙#M·ýpOý «Ô«Ë>%˙ČÓm˙\˙Bjő:QÝŘńOźřŞ5úëýu_ zjżöË˙g®SĆň4ę?ő×ú ę~tŐí—ţĎYÇă)ěnüF˙‘Văýô˙Đ…GđÓţE•˙®Ďý*O˙ň*\ľźú¨ľ˙ȰżőŮ˙ĄiöÉčfüX˙Źm;ý÷ţB˛~ČĂq˙^­˙ˇĄjüY˙Źm7ý÷ţBąď‡7‘Úřš5•‚‰ăhA>§ĚT?ŚĄ±é.˙‘gR˙®-^%š÷ű¨#ş¶–ŢuÝŞQ—Ôó/řjÇD±‚{#6é%ÚC° ÇU"ޢ‹=C˙.ź˙^ń˙č"ĽËâWüŚí˙\“úצčňÓ˙ëŢ?ýW|L˙‘ťżëŠZu>ŽçGđ»Só¬gÓ¤ožćGţéëůç[4Đεgl±ŹŢĹ2óčŚ@oč ň˙ jŮ:ĺ­É8‹vÉ?Ü<ËŻá^âFG"{ŃłŁ$1* (vWŽĎ©ŤGĆŃ^9ýŃ»Źn¸ú ôOę_Ů޸*q,˙ąOÇŻéšńpr2 MGĐ"ʎ«›¸ń¦Źoq,2É2Éaĺ85kÂzÜZŢ—›‡ÚcfNá˝~‡­Sń¬5{“sşK{†űÍor=kFŰW˝D_č¬p˛NO^"5źŻxÇH˝ŃŻm ’S,±2¨12ElxoÂÖzŹ,Ló\8Űć>8€v®{âcé–ö© vÖ˙Ú2°mę 2Ż©#×§>ő-É+±«\óĽÖʆĎüT:gý|Ĺ˙ˇ ĚÍhřl˙ĹEĄ˙×Ô_ú¬ĺë^â_ůµ?úů“˙B5îu™6¤Ď3Ë.źnň;f)É'©®‰Ç„ěxvkŻř\ę ö4ľ(č3ÁëÝ|?čZ|s$[t PvŽ+'NđV‘ctł„–fS•0*ПƺZ!ĆÝĎ)řˇ˙#őîżúW#]oĹůă˙Żu˙Đšą Ę)lw? /Ľ­JćÉŹË:oQţŇ˙ő‰ü«¸ń6”5Ť)í2‹ŁôÁ?–kÇtă§k6—yŔŠ@[ýއô&˝Ü@ äőĄ=U‰–ä2ĽVVn턆É8ě €®3áư÷·:ś·ď$ܨúś0˙ĐkCâ=˙Řü:đ©Ä—L#îő?ËŤyׄ5ěßŮÎÇ—ňßýÖăôëřQ)ZHĐő}kGMGPŇîN3i1vĎuĆô ż­Z×/Fť¤]Ý“ĚQ’żďt®*íq?=.ŢÍOÍ<›˛żýr?*ą{©±-N'Â$·Š4âI$Ě 5í•â>˙‘źM˙®Â˝ş˘–Ă‘óýŃ˙I›ýóüëÝ4_ůX׼úŻ ş˙Ź™żß?νŻÂW‰{áË #`ĹbXß™F *[°‘ç?˙äi›ţą§ň«ż żä5u˙^ç˙BZěőß iÚŐĘÜ] ’`ˇKFŘČąą†h"ń.ŁçjDĘ3čQĘÔîĐíâ˙Ăúˤvz—1É#mPřÚTžŰ†1î1ŢĽŠŠőÍoŕv˝©"čóÚ\Ř3’ɱ•{ę=FsíOřŕ˙ x+ŔÖö—l·^*ĺeŽFů‰\ă` Ś“řăĎlĽ_â;_łZkš”0´"ܸ =<~‘us=ÝĂĎw4“Îç-$¬Yű“É lřź#§ŔŻ˘± ˙f |@Ƨř©,ţ×t[1fú°‘®a†ésˇ‘TnĆWÓ"ĽRëWÔ®ěa˛»Ô/'łTÎÍxTś 8Şö—3ŮÜÇqi4°OĘI•e> ŽE}-ŁÜřÚÎÓQ˝Ô4 č[Ä[ÍxÎ$®LrsíĹr <=¦_řCZńöE®µ­¤Î°ŮK‚‹Ŕ mxŤµÍ*ÇIśŰÎcł´Ź`HöpXdŕ’đĹr?#ű„|]¦@éö©Ój«}čŮAúfĽŠOër­Ňɬj,·cÜľ&ĆgćăŽ{UM7Q˝Ó.EĆ›wqipHQ±é‘@Íđ9ž9Ö|;®,vÚ”đDZK€Ý´prŻś{W_ŁĹăĄ×$ŽOř[N‚ŘżXI ÁĆвnçß•|Ő{y}|÷··SÜ]খBÎHO<?*Ň»ńwŻ,MťŢ·¨ÍjF7¸bzyZOßK©xŻU»ťí$–IŰsÚgĘr8Ü™çŻ[ý›ťŁŃĽVčpĘ" ŽÇl•á5MÖ5=.9“MÔo,Ňly‹o;FĆŕĎS×Ö€55/ř›Sµ{kÝnúHaăó6†‡Čúצ~Ěß{Ä˙őĘý©^!W´Í_RŇĽßě˝BňËÍIöyÚ=ŕgÚFzźÎ€=cெ´»˙ ëZĚşdαlěYNA^2đxů‰#'űĽw®úĹőy>xˇµ˝ĂFŮÜlí#ňđžIůdňH>ť+ć­#WÔtk>“}sg+ 3A!BĂĐ㨩äń.ą#]Öu"n—lůşŢ®ĂsČÁ#Ö€;˙Ů˙ÄKcâ9´+Ü=†¬…67 HÇŕFAü+[ăµý®˘hţ Ѳ–Đ žaśśdíú“ąŹŕkťř!u éőÎłâřmšÖ"¶Ń¸%™Ř°Ŕě2?ŕUĆxŻZ›Ä^"żŐnrćRáIű«ŃWđ€=dɰúë˙·txŁţMÇB˙®©˙ˇ=x÷öľĄý—ý›ýˇyýťśý—Ďo+9Ý÷3ŽĽôëDşľĄ6›ź.ˇxöśĄłNĆ%>Éś§µ} á©<[§řoB´»Ó4Ďčע¬żÍ xwo`ôí‚kĎ>/é:7‡~$XŤ%#·…–+‹cű±6óśŮ{űפřź\Ň-Ťľ—«ßZŔr|¸¦e\ž¤ ŕzĚąžk©äžćY&šCąä‘‹3ROZ÷?Ú3Ă×÷˛Zř‚Ő#“LµµXćH2¤Éňśwxé^ZRkÚĽšWödšĄóéŘěÍ;đ@Űś` fĐEPEPEPEPEPEPEPEPEP^żű?˙Ě{ţÝ˙öĄyz÷ŔůŹŰżţÔ¨źÂ5ąëŚj6§µFŐcŁj{TM@ cQ5=Ş&¦"65é˙żć7˙l?öĄy{W¨|ë­˙Űý©S-†ŹS˘Š+"‚Š( Š( ą> ÓĽkˇµŽ »&LµµĘŹš=Ǩ8ţ ÔQM6ťĐ xÓÂZŻőf±Őŕ+’LSŻ1ĚżŢSý:Žő/ őÜs^ăo€7vď%Ď„nÖćű%Ë{+ôoÇS]ޤ­"ZŘéü+ń÷D˝Xâń ¤úlřůĄŚyŃëÇĚ>?Zďlüá}JtďéFR>UšŕFA÷ _kľÖt zÖ—wdOC4d+}ˇü eStbö&ʬüEĄAŢę>'Ňçś*EpŤř}îpÚźŹü?bŤ¶óíR‰nĄłřôýkÁiđĹ$ҬPĆňHÇ }€Ż:Y5K™¶t,dҲ;Ź|HÔuhtĹţĎ·=X6eořoĂó®&—ĎGąźp*W;‹g·ľkĐĽ+đwĹşô¦±:]®3ç_e ú'Ţ?őď˙~h>)r¨oőUçíw 2‡Ŕ˝ëÉ÷®ÚtčáŁËMĘS¨ď&p_>=´°kŢ,©m`˙Â{<׸^Ýý+ߨ˘ł”śťŘ%`˘ŠŽćx­mĺžâEŽ”»»P2Iö¤gţŇ^,ţČđĚz¤…o5<ůţŢ˙ľŹ@ŐóFŤ¦Ükµžťd»înĄXŁäă'Ř*Řř‹âi|[âűýU÷]ö[ŁąđŁňäű“^Żű1xLÉuwâ‹´!a͵¦GůŘ} ˙oJë_»žě÷_ h¶ŢđýŽ“d†Ö €Ťçřű’I?ZŐ˘Šäą QEQES&Ť&‰ă•Uău*ĘĂ ÔO˘€>$ř›áwđ‡ŚŻ´Í­ö]Ţm«°űŃ7+Ď|r§ÝMzWěÉâĂk©ÜřfíĎ“u™írxYů”}Tgţ}k¶ýŁ|$5Ż bÖ=×ÚV]ęĐľ?čÖľ^Ňď§Ó5+[ë7)sm"Ëz2śŠëOÚ@ÍčĎż(¬oëöţ'đ݆ŻfWËąŚ3(9Řă†_Ŕ‚? Ů®V­ˇ Ph Ňâź‹ßňS|I˙_mý+Ř˙e?ůë˙őôźúxçĹ˙ů)ľ#˙ݶţ•ě_˛™˙‰˝˙_I˙ WUO€Î;žéEW) QEQEQEQEW–üpë˘Űý§^Ą^YńÇ®‰˙m˙öťTw<ĹMJ¦ˇZ•kRI–ĄSP­H´2ÔŞj©ŇU5Ôčž6Öt´X–eą…z%Ŕ-ězţµĘO&ÖŔzTćŰóéq–ő?-µCQř‰ŞÜˇKXŕ´ř”noĚńúW¦ś*śäE›‹‰®fi®eyec–wl“řÓ¨Á§ źEZǤ?î/ňŻ<ńŠőĹ—đŔÉ-·îĎ•(Č"çr+´µÖ4Ák:Ť!Ať}>µäţ=ž+ŹŢˉ,MłŚ‘{ŠŢnËB»/ċ֌¬mŃýY‹ËŠäő}^÷W¸óoćiű«ŃWč+:–±ror‡fµt-~˙D”µ”crŃ8Ę7ÔQYRNĂ;ĎřX÷ţV•Ż™ýě¶?,˙ZçôOÝč×—6ŃŔňN0ÂE$uĎ"±3E7&ĹcŞŐ|m¨ęz|ÖsÁh±J0Ĺëž2ÇŇ©ř{Ä÷š SGi»¬¬ĽŐbF=0E`ŃG3˝ÂÇIŻxş˙[±·PŰ${Ăć5`r3ęÇÖąř¤1ČŽŁ%H#>Ő›oqťŻü,][ţ}ě?ď‡˙â«”Ô.Ţúú{©‚‰&rě€ ôŞÔ™¦äŢâ7Ľ;âkÍ)’Î+wYX3yŞÇôÁ&żâËírÉ-®â¶HÖA 1+îO­s´QĚí`:ť'ĆşŽ—§Cgo ŁE!K«9$ó†µG\ńŢłwmquđ}Ń9ç$Ö&hŁ™ÚŔvżđ±uoůö°˙ľ˙ŠŁţ.­˙>ö÷Ă˙ńUĹQOž]ÂČíábęßóďc˙|?˙X—> ş¸×ăŐŢ8Ę!Bťś tÎZĹÍś› Żü,][ţ}ě?ď‡˙⫟Ńu«Ť#RkŰd‰Ąe*D€•ä籕Fhćl,u÷ľ=Ő.ěç¶’ !Ń´lU Ź›Ţą,ÓsFhm˝Ŕë4ĎjZ}„AfŃ»Tş1${á«?TŐn|M«Z}łěđ1Űd(şś“ëXyĄÍĎ`=FĂáĺ¤#uŐäňĘ:Ŕ@ęZ毮V·zzî ž+„©*ŚŚ~•˛ŠkÝÚÜŕ| Ąę—żö¶®gÄhV39;ž8 Ć:ëüOv¶:üî@ÄL«îÄ`~¤Tú†©c§Ć^öî@Ă7'č:šňżř¤ë’­˝¨d±Śänë!ő?ĐPÚ‚°·9|Ńšm¬ š×ŃĽG©č˙-ťÁňżç“üÉůvü+4f„ě Ań"áTyútNÝĘHT~ ÔWݤB-lŕ„źâf/Źĺ\&hÍW<»ŠČ˝©ęwšśţuőĂĚý·č: §šJJ‘—ô­VóJ¸ó¬fhśđGPĂĐŽő×Ű|HşTćÂŐ$)úk‚¤¦¤Ö±Úę_u+ĘZC¨?Ä>vBxý+ŹšY&•¤™ÚI噎I?Z‹4PŰ{Śěü'ŕčő«˝š÷deŠăL°#Ôžž˝;ÖŹ4-OĂËľžôÚíĨ®X†ţńQĆ?ŐÎx?Ä’č7l4–RźŢF:ýáďüëÖ4­oOŐ"W˛şŤÉę„áÇÔkH¨µćKąĺ‘źëň-«=쑱ĂoĘĆ?Ţč+×tűeł°¶¶S•†5Ś\ fĄ–XâBŇş˘ŽĄŽqŢ*ńµĄťĽiR­ĹŰ y‹ĘGďžçéV’†­‹sŹńýňÜřŞŕÄC,bÜuýI{ţ.­˙>ö÷Ă˙ńUĆ;3ł3’ĚÇ$ž¤ÓsXs;Ýbć§}&Ł=Üę‹$­ą‚úf´<;â;˝ícŽóöîóTśmÎ1‚=MaŃšWw¸Î›Zńގ¬iďgs ŞDäcVžěi4/ßč¶ŇÖWŚ1lȬNOŃ…sY˘ź3˝ĹcwÄ^%Ľ×Ło#·A %|Ą#9őÉ>•ЬURA‚;S(¤Ý÷±Ó|}ŞÚ±N°Ýăt€‡?RôŞ>&ńMν PÍ0Ĺo2NqަąĚŃO™ÚÁc°´ńö©kk ĽvöE"EE,ŤśŽ~jÁ×uiő›ówt‘$ĄBâ0@Ŕú“YąŁ497¸Xvk­˛ńî«ki şĹi"Ä:1b᫢’ml3oÄ^#˝×ŚlXQaÎŐ 8ääźJĆÍ74PÝ÷Ý…őÎźr·S<3/ń/ň>˘»?×± [»(faüHĹ3üëͦ¤ÖÂ;{˙zŚń˛Z[ĂlOńňě>™ăô®>ćâk©Ţk‰Y\坎I¨3FhroqŽÍOctöw°]DÉ ‹"†čH9ŞÔfŻü,][ţ}¬?ď‡˙â¨˙…‹«Ď˝‡ýđ˙üUqTUs˸¬Ž×ţ.­˙>Ö?÷Ă˙ńU•â^ë¶ńCw˛,oĽ•Î1ÜšçčÍ'&ÂĆ®‰®ßčұ›j1ËFÜŁ}EuüHś'ď´ŘťýRRŁňÁŻ>͡I­‚Ç_«xóT˝ŤŁ·ŮĆx&<—˙ľŹôą2Ä’I$žy¦fŚĐŰ{­ˇk·Ú$ĺě¤ďÄüŁ}GőŐÂÉźËŔÓ˘ó=|ÓŹËÖĽţŠšŘ,téă]UuS~Ć,ı2ť ŕśđ9ÍĎŚµ _N’ÎćEŠB 1« ń–>•ĚQš9Xzł#BUČ ŕ]n™ăÝVŇ!ŔŠí@á¤?ć:×E µ°µ˙Ä-FxŠZŰĂlOůvLńúUkę¶v‘۬v˛„ç•Xłsś“şą*)óľácWÄŐĆąx—WqÄ’,b0" Or}k34ÚZ–î1k­´ńö«kk ›¬H3Ł sóu®C4SM­„mx‡Ä7šóÂ׋  ±=O$ú ÇÍ6ŚŇnă;(ľ!jŃĉäŮ>Ős#dűźš°ĽA­Ýk—‰qx±«"lUŚ džäúÖUÜ›ÜE˝6öM>ţ ¸UH[r‡‚}ń]Wü,][ţ}ěď‡˙⫊Ł4)5°X’G/#9ęÇ'§ˇk÷ú$¬ÖRŤŚrŃ8Ę7ÔQYRNĂ;łń˙ĘÇŘ­|Ďďe±ůgú×;˘x‚ëGÔ'»¶Ž–e*ÂE$rsĆô¬lŃšnMŠÇY©xăRÔ,'´š 5ŽeÚĹŰ-\®iąŁ4›oqť}—ŹuKK8-˘‚ČÇ k–FÉ`gćö¬={X¸ÖďľŐt‘$b0@ŔĎ©>µ™Fią7 ‡fŠnh¤1Ôf›E;4f›š3@ÍÜŃšvhÍ74´ąŁ4ÚZ\Ńšm Qšm fŚÓh fŠmń­Q]faEP_Hüń¦mŕkM/PÔí,něÚ@Ëu*Ä4Śŕ©l÷±řWÍÔPÚ?đ™xcţ†=˙˘˙â¨˙„ËĂô1čżř˙_Q@h˙ÂeáŹúô_ü‹˙ŠŁţ/ ĐǢ˙ŕt_üU|]E} ţ3đş©câ=g‹ŘÉüŻ–>(k6ľ ńć­©iěZÖWEŤĆ੟ˇŰźĆąj(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ż]ř˙1ďűa˙µ+Č«×>ĚwţŘíJ‰ü#[ž¶j6§µFư,cTmOj‰¨ƨš¤cQ9¦m^ˇđ7ţcöĂ˙jW—5z‡ŔÎşßý°˙Ú•2ŘhőZ(˘˛((˘Š(˘Š(˘Š(˘ŠkĆ’!WUe=A°oüáťA·^hTŻ×qµLţ`WAE4Ú“áÇ pŃřoLČçć€7óÍt6e†ž»l,mmWŇV1úV衶÷QE†QE_R±¶Ô¬'˛ľ‰fµť Itu=Aö«P˙ ÇÁô.i˙÷ĹtşF™eŁéńXévŃÚÚEť‘F0«’IýI«”Sm˝Ĺ`˘Š) (˘Š(˘Š(˘ŠdŃ$Ńx€ËĽ?÷ůjŽ·á]WD´[›řQa,r8l돥{ĺgx‡M]_E»˛|fT!IěĂ•?ł¦ş çĎ ÓÁ¦ČŤŻŠUĐ•e=A¨±(×Đ´KínYcÓăW1¨f,Á@ÍmÂŻĎďę×ođÇLű‡á×^7š}vôQůsř×]ZĆšjě–Ďźőť&ďF»[käU™8 Á¸$ŽßJě4˙‡3ؤ·w«o;.|ˇíľÄäsU~)Hbń]ĽŠ)nŚöf®÷Oń^Źyb·ú \´rČ”ú`őü)F1»LgŤëuĆ“¨Kgv–3ÔtaŘŹj§[ž7ŐáÖuů.-AňDhÄ`°˙2k 5›ßA‹šŃĐ4ą5ťN;(dHÝÁ!ź8ŕfłk©řk˙#m·ű’č&«»/Ý|=ľ·µšvĽ¶+ ÉŔĎĄqUďúĎüďżë„źú ŻźłU8¨ě ŽÍÚ3P3Ąđ×….uűIn-î!‰c,‡ÎIŔ=ľ´x——:śWʲI候ÎpOĄv ä y˙_ű*Ńńkţ@vźőň?ô­yW-Éľ§3Łx"óUÓ ˝ŠęÝPHV#ŹOjĚń7‡çđüđGq4r™T°)ž0}ëÔ|˙"Žťţëčm\ŹĹßůi˙őÉżť)Fá}N ŚÓh¬ŠE74f€E74PłE6ŚĐ¨¦ćŚĐłE74f€š)´f€š#Ą6ŚĐ¨Í74f€š3MŁ4ěŃšnhÍ;4SsFhÔf›š(Ôf›š3@ÍÚ3@˘›š3@$š)ąŁ4ěŃMŁ4ěÓŁS$«*<Ô¶§ý&÷×ůĐo˙ Ţ˙ţm&˙ ăµ;6Óő ‹IYár…—ˇĹ}^âó˙>§˙]ŰůÖłŠKBS(Y[I{w ´e`Š Ç&ş?ř@őßůáýý‘áwHüE¦ĽŚ¨‹:ĚpĎ­{oö®ť˙?öź÷ůĆ”"žălňźř@őßůáýýżđëżóÂűú+Ö­ď-nX­µĚ30"9? –GXŃžFTE,Ç żgnĎ˙„]˙ž0˙ßŃYú׆ő-Ů'żŤ7}€«†ç˙Jöoí];ţí?ďň˙ŤqźŻmntKU·ą‚V‘[ҦPI\iłĚęţ‡Ą\k:ŠYÚ˝†âÍŃTu&ł«¤đłŤ®y·,FbgĆvr?N?ZÍZúŚŘŐľÜZX<ö—‚ćH×sDcÚHqÉÉö®˝łWń^“c§É4w\I´ůqDá‹ŮÇAőŻÍTŇ[E74f c¨Í74f€š)ąŁ4ę)´PłE74f€E74PłFi´f€Fią˘€š)´f€Fią˘€E74f€š)ą˘€E74PłE6ŚĐ¨¦ćŚĐ¨Í6ŠuÜŃšu¦ćŚĐ¨Í74P¨Í74P¨¦ćŚĐłFią˘€š3MÍ fŚÓsFhÔSsFh٢›FhŮŁ4ÜŃ@˘›š3@˘›š3@˘›š(ăŠ(˘şĚŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˝oŕ'MwţŘíJňJőŻ€żó˙¶űR˘Öç­ŚÓŤ1«Ć5FÔö5STmOj‰¨6ŻRř×\˙¶űRĽ±«Ôľő×?í‡ţÔĄ-†ŹV˘Š+‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š*+‹­ăß3…_ç@ŃX˙8¶‡čÎzţµ¬áíĂÝWnv¨ĆJ’nČn6,ŃEB (˘€ F`ŠYu$Ô·qÚBd”ýr}«žćçT¸XůĂ•Aď˙ר”ÔtŤÎ® ăťKÄÁ”dT•¤ omKČQŚúűÔµkĚAEPEPEPEPEPEP^UńÓţ`źöß˙iתו|tëˇ˙Űý§U ÄĎ.Z•MBµ*Ö¤“-HµÔ‹@-_ŃŹüM¬żëşčBł”ŐýţBÖ_őÝ?ô!@MS!•&BŃ0e ČHőRA4ú⼫o×üEĄJß4w’Ď?Ý.CĎń®†ěAĹ|PŇżłĽF×® ĽhôßчçřÖ…`ú¦Żies4I—©?€ÉŻ^ř—¤˙ixfY#\Ďh|ĺÇ\Ľ?.\żÁí/Ěą»Ő$_–1äĆO÷Ź,ŹÎ˛q÷¬Uô=B(ŇR8ŔXŃB¨)-¦K‹x§îŽE§Ô‘X?Ő˛Ľ3rČŘšÜGőn§đ­/ ˙Č»Ą׬_ú­o­‰<ËâĎüŚŃײčM] 4Ů ŤÍÝćYA8+Ü}+ťřµ˙#<_őěźúW­Y˙Ǥî/ň¬ŇNNĺt<'ĹzlZ>˝sc»ÇÜ3ă'*o­jřOÁ·Zâ ™źěÖYáČË?űŁú˙:łâ}<ężd˛É +ÄގDjOč zÔG)(4PŞŞ0(Á6Áł’Źá抱íctíýă ôi ŹFń˝őŤĂĽ ^9q¸eHÖł5ď˘ÚúH4»hćHŘ©–F8b:ŕŢőąŕďCâ$/Ůď#ŠnČeő§çTąod-M˝gţ@÷ßőÂOý×ĎČ­#Ş"–v8PI>•ôµ˙ {˙úá'ţ‚kÍ~éiu©Ď2†[P`Ž7¶yüýiM]¤4\Đ>™aYµ™Ţ"Üůc#ęÇůζĄř{˘Ľ{PÝFßŢüĹtş¶ˇ•§ÍytÄEÉ©=€÷5çmń2ăí9]:/#?tąÝŹŻOŇ›QŽŚZł°đ†‚ţ¶»¶3 ŁyĽÄl`ăh#׊Ĺř·˙ +Oúůú WW˘j–úĆ›ĺˇ>[đTőR:\§ĹĎůZ×Č˙ĐZś­Ë -Íźȡ§şßúW!ń{ţBýroç]Ă˙ů4ď÷[˙Cjăţ/u8I‰¸üiKŕÜć<7 ^k×F;P$˙Y+}Ô˙í^‹cđóH†0.ž{™;’ŰŕřšßđÖ—ŹŁ[Z"€ę»¤?ŢsÔ˙žŔW%âďë±jRÚčÖ“Ç Gi[—.{ă ŚRQQWa{—/ţéSF~É-Ĺ´ťŽíëřĎë^w­č—¤jJ|–9GŃ×<‘ďí^‡ŕźj÷·†ĎZ´”eK$朎njV—ŹôäÔ<3vJ-ş™Đúmëúf‡ŐĐ\ČO‡[˘˛ŢŢaA^Gýó^â}/ű[¸˛VfŤ(ÍÔ©ŠőŹjÚ´f9’ä?ü§éŠĺ>.Říą±żQĂ©…ϸä3ůQ(®[ OS#ŔŢŹÄj’ęIb†ަ=Ň“Jžm>a-Ř$2#/$ăźa×BQ»l5&ohE6fSýá)Ír~)đšu´—zdŻqc/ŹťG®G_Ň™ x»Äwz´ 7]ÄîİŚžyŚzć˝d€AdŐIFKAjŹđž™ł®Aepî‘Č–Lg…'żŇ»‹ď‡vŮ\IĹăĘ‘ł"ü§sŔéX^·źÚÝF)gAô€Ż\Ą¦µgťč˙"6ęúµÔ˘V1Á€Ř’kŤń>”šg§Ó¬üŮUJÝË1eS^—ŻxçMŇŻÔ$·3Ćpţ^©ôÉďô¬ß, ńVŁŻů,± D…°?ńębôAvSĐ>ů‘$ÚĚÎŚF|Čú·ř~uĽţĐ™6§Sýá)ĎëĹiř«TźIŇĚÖvŻsrě4T,ő8íÇňŻ?¶ńO‹bąKm4ŃçšÓP3M¨ÇK¬_xm6ÝîôŮZćÝ]|ę=xëúW4˛*FĄťUP2I=«č{)ĹÝś3ěxüÔ±Ćr:ë^sĄéPi˙š E†šě \ăđÉüŞeĐ-h?⬺ĚÎŇ‘ź&#€ľÄ÷ü?ZŐ¸ř˘KXÖâţňIźçščµqvtË‘¦•›•»Ýřńůםizď´=@Éâ/Ą± ů™ŹvÓŘ«tëďŚU5éajĚxjçĂÓ¦çó­e8ŽP1ϡŤsů®ăĹž7¶Ö´ąlb°uW ¬Ż Ęsśřuď\5e+_Bĺ '€z‡ľŕIő™ž"Ă"°ĽOňýkŤđŐĺ­†ąiw~ŽđBŰĘ çu#ľ z…ĎŹ4q¦Ď5¬ĹîQ2ş2–=ąĆ?Z¨%»qçŔZĚy3ýď4ćąźü?{KgąŇ%’tA–†@7ăŘŽżLU;Ć^%ąÔĂ›Ą-Íş@0G¦@Čúć˝z­(ËajŹđÝ„z¦·ie3:G3Y:Ž ăňŻA“áĆś±±K«ÂŔW“ůW;¦Ű-§Ĺ¨·NT€H­zí(E5¨6yî‡đîn’kHÓ0ÉŠ"_b{źĄ[Ôľé˛Ŕß`–kyńňîmĘOżzĎŐľ#Ľ:Ś‘XYĹ%ĽlW|Śrřî1ĐWq ęqkTĐ)U©ę¤ůÓJ/D-O Ôěn4Ëům.ÓdŃ0ÎAîö«ľĐo5볢…DćI[î ˙jęľ/Ű*]é×J 4ń±őÚAú®ßšRhúµ˛¨•)Ç%Ď_đü*=ëúV_ô¨Łi–ćy;ťÁŕřԇû@]2âXĺB$¤2¶Lă#ő«Ţ0ń”ZâŇŢqv@f°¨LűűU xýuřěőtĺ;RDo—w`Aéšżs`Ôď+Â<^â¨Ô˙ë»:÷zđoČŃŞ×vţtUŘ"dć—4ÜŃšŔŁĽřG˙!›ßú÷˙Ů…wţ+˙‘kT˙Żi?ô^đ‹ţC7żőď˙ł ô˙ČłŞ×´źú ­áđ÷"Gy O›r»_ČÚŽČ5-jtëk ™Ňęě´Q3€Jŕ ô®cŔ޶ń×iu,ŃUHňČç$úé^µ­˙Č˙ţ˝ä˙ĐMy÷Á˙řűÔ˙ÜOćhq\Éô-ęaK_ř–ÜN÷”5—häś đ*őŹĂ­.(€»šââ^ä0Eü˙ě.î"´µ–âáÂC—f=€Ż7şř™7ÚOŮl#ű8ď\Qq#ýšË8’ţ»Gőţu.µáŐ˙„ůtČAH.d(Q÷PňŘúaż*őČŇ+KeH$1&Ttt¦0»ÔmśĽŃ#Ś+ĄÄ­ýć”úbłµ‡6˛DĎĄÜIŁ’ťĘ}łÔ~µ•©ř«ĹŢ3YYÜ[[ň µÜH÷$~•Ůx3X˝Ő¬eť«ŰÝB@$ĆP8=ż5K•é`Ő3i=…Ü–×qćŚá”סčţÓďt›+©.®Őç…$`Ąp ńĹ;âŢś†ŇÓQEÄŠţK‘ÜHü?ťuţ˙‘oJ˙ŻXżôJ0WłÎţŮ“X–(î$ŹOŚ/ďîÄdĐ~5kSđ&‘fl÷\Ţ4ë%”ňŔăř}@Ťvö·gˇÚ ‹ç`áYĎ ç^+ń´ľśZ[Ď±Ě˛Ł±ĂźJŚA]›Çá¶›Ž//?5˙ ňë^ÚćX%’'(ĂÜúK»Ký:Úî?»4jřôČé^GńMx|_"B™7›dŚĺ¸?řđ?ť)ĹZč4Ľ!ŕ«}cF[ŰŮî"2;ăGäzć¬ř‡ŔV¶5ŐÝ•ĹĚ“B»öą\:ô™Ż@Ó-OÓm­#ĆČc ź\MNDwvĽR/Ô2‘WȬ+ź:W¨Z|8±kXZâęíf( Jŕ69ŹZät}żá8‹L°ÜŮî‹ó~ ~µě×· ig=̧ÂŤ#}ÍD"şŤłĹ5m /‰äŇ46ŕ© —#9ĆNp8úWm¤ü9˛Š%mNâYć¨?©úń\ß‚ĽGc¦ę—÷ş¨”Ü]‰É%łÎy8ü«¤ń?Ź-˘ÓPčS¤·26 2ĺŹ\ÖňîÁÜż?€49Ş%ÄGűÉ)'őÍpľ-đŤĆ‚˘â9>ŃdN7ă ‡°aýkˇđ'µíKWHoUîlÝX´¦ ˘>  Éăń®Ű_¶[ÍţÝ€!áp3ëŽ犮U%thňxzŰÄÝĄÔłF!U#ËÇ9'ÔJč5ź‡Ăeť2k‰n™ŐUd+´y' Ô˙ăďS˙q?™ŻMf Ą€ d“Ú”"śA˝NĎᵊÂ>Ůyróc“ŐQů^y—qy¬=…„m,‚FQô©=«Ňoľ#ip\4vđ\\*śyŠôĎ5gáŢźztÚžĚM}#8,9TÜp?ŻĺCŚ[˛ ˛Ž“đćĘ(•µ;‰'—şĆv ţ§ô«·ôIP–âěÉ&žiţ7×u-7ʶŃí%–y{J".gŮŕőţµáßx‰ucŐm.'¶‘‚łbĄ2zđâźşť¬-N{Ĺ~»Đ—wÚ,ŘŕJŁOŁŐŤĄŘÜjwŃZZ&ů¤8Ôźa^ű¨ZEe=­ÂîŠd(Ăëßë^}đ¦Ő`Ôő„”´Á¶!ě2ŰżP*\5Í+áŢź *ueąý퍱ÓżëRß|<ŇfŚ‹WžÚNÄ6ńřţ"µü`5sŁźě‹­ăv1»fqžůĹqú/ŠőM &ŹÄÖ×Ň!Ç”Í{Śśd~uMEhе8Ý{HąŃ5´»śnG^Žľ˘łł]?ŚüS’Ý#˛0X‘#I’Aę1ŹaŢąlÖ.×СsFi3E!ŽÍ&i3FhsFi( Ł4ÜŇ怌ŇfŚĐŇÓsFhsFi( Í”PćŚŇfŠ\ŃšLŇP¨¤˘€>;˘Š+¬Ě(˘Š*Hˇ–\ůQ»ă®Ő&Ł®ĂĂ‘ěČX±>ü‘]ův c*şmŮ%qĄs7gĄ¬˙÷ěÓ†ťzzYÜ˙ߦ˙ ô(b«°Ç^´˛:Qűl1^ zXÝűbßáNF¤zi÷ź÷ĺżÂ˝fŞě1W<˛šqűL›ž4t}LNťyÔů ţD‚ `Šú«Ç|}CâíA#PŁ(ŘĄźÔšóńXXŃŠiÜąĎŃEÄ0˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ŻZř ˙1ßűa˙µ+ÉkÖ~˙ĚsţŘíJ‰ü#[ž°ŐSŤ1«ĆQµ<ÔmLCÔMR5DÔő?]uĎűa˙µ+ĘÚ˝OŕOüÇ?í‡ţÔĄ-†ŹW˘Š+‚Š( Š*‡.f˛Đµ«Ußq ´’F¸ÎYT?1@zÇŽ<3Ł_µ–§­ŘŰÝ.7DŇ|Éźďcîţ8­­sK´Ńżµî/í“LÚ­öŻ0đÄwtÁ$ĆĽËŕW†ô]OáňjZ•…ĄýţŁ,Íu5ĚK+±ŢĂ`qŔęs^};µ§Ă˙ŠZł±Ň´íJ!j¤äG›Śţż©ďZň&ěMĎ|Ó|wámNö+K MšęS¶8–uÜçĐ曨x÷ÂşuěÖwÚöźÔ,RHäVAâz†•yâ˙xsLĐ< >™wď¬K »B °``xnsŰšężi +OÂ6×ŘZGy.Ą’á!U‘ň®NX śă˝Šö čz$~:đĽš|×É®Ř8]b’a(Ú¬Ů* ő8?•[ąńN‡k­E¤\j–‘ęrí lŇí»îŕ{×™ţĐše†™đĹ—M±µłY/a.-áXĂÚz×ńf)“â–§©ÚˇyôŤ>ÓP@?Ř–0F'đ˘0L/cčOĹ&—ŞŰ麆©io¨\mň­ä}Çjŕ{EřŁDŠ]J9u;U}5CŢ)qč[ŇľtńEňxźâ=§‰­˛l?·¬4ëWőTźőÚôĄŁü\ř”5ěü¸ ˘p {BdîŚcÖ‡M%pąÚ˙ÂÉđoý šgýţoTńφ4«é,ő-rÂÚę'É_řo˙]n?’W­Ôµd0˘Š*FPÔîç‚6đł2]†Ćą¤ŽëP›#|ŻÜžü+®ş¶K” )m™ÉPqź­>(Ł…DˇtVr“ŐčR•ŚÝ3HŽŘ‰%"IzŹE5«Ei%˘%»…QL˘şťmái8‡R}*ZÍq÷ŤuyzTa!ű±ú čt­9,ŁÉĂLßyż ©í­#†Y%i\’]şýµX¬ă ;˝Ęrľ(˘ŠĐ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ż)řë×C˙¶˙űN˝ZĽ§ă·üŔ˙íżţÓŞ†âg–­Jµ Ô«Z’Jµ*Ô+R­H¦´4oů Y×t˙Đ…g-_Ńżä-c˙]Ó˙Bôíx_ö©Ńľ$]ŢdŇúU“Ý ß§?…{Ą|çâżůuŹúü—˙C5­M,J>Š!dŹ Ś> Tt& MK+\ůjĚŮ=NI<˙/±~ęßÚž]ł=Żî×îźË‘®‡SĽŹOÓîo'?»‚2çߥZ×QQńgUű^ąŚm­ć˙}ą?¦?Zô˙ ČąĄפ_úŻžď.dĽĽšćvĚł9v>äćľđ×ü‹šWýzE˙  Îí˛™ć˙äg‹ţ˝S˙BjőË?řôýĹţUä_?äh‹ţ˝S˙BjőŰ?řôţąŻň§‰‰žy˝Wă+nÇ }ü^‹:łA"ĆvąRúWŤxćňKwp¬…áuĎ|"ń^µ˘ęvÚĆťĺ›îŤÇ#şę}Ĺ8˝Z|÷"4r4r)WRU”ŚGQ]wÂȤ“ĹJń˛8śąÇ#ő"˝[đf‘«Ý5ĚŃË íË´,qő ‚3ďZZ‰a˘[´Z|;7rîÇ,˙SR©´ĆŮ6µ˙ k˙ú÷“˙A5Ćü u:Uú o~…xţF»-kţ@×˙őď'ţ‚kČ>kÉŁk%n[mĄČ»Š…Ź·'óŞ“´–ÇyńN)dđ±h+ČĎü<ŹćExćkčécŠćŽEYa‘pTňĺ[áî†n|Ý—3ź(Kňý:gőĄ86Âh¤OLď’\3&GQµA?ÇáQ|]˙źý|Źý«¶¶‚+[xŕ·Ťc†1µQFÄü_˙ ˇ˙§‘˙ µ6­ nlü?˙‘?N˙użô6®Wâ›*kş;?ÝQ“ôÜ+Şř}˙"v›ţëčm\wĆůéßőÉżť)|·=Ją«ďhö7“ZÜI:Í aĺȤ𿳣Ǹűmş„•ORżçKâ_iúě˙hv’Ţë2GŹ›Ó őŞmµx‡©ř˙Cc…’ŕźA ŞšŻŽ´Kť.ň估ş(1’TZđmŽrnVI..qµ]ŔG|_zÉř úU®™µ­­›SśŤŚUĎ,Hüąő©nI]††gÂ-Ceĺíž%Q*qÁýü«¸ńVŚşć¶¬@"d|úpßřéjń ęŮzýŤŮ8D?ěžčM}D5VWĽ¸ŠÂÂk‡b‚2ä@:Wđ·Y{ĺÔ­®[3y¦ä{î?7ëŹÎ­üTÔ~ÉáŃl§]ČěŽOôŤyç5/ěßŮČÇJŢKýŹçřQ)ZHĐőÍcEMCYŇ/Ž3g#3{Śd~Lćjo_˙fh7×`áăŚě?íő"´ëĎľ/j]…ť‚šg2¸Ý^ęJ©h›©Âř_F“^Őă´FŘ/+˙uSőäĆ˝†ĂĂú.Ťm˝-mÔFąi曩,zWťü'»ŠÍ ĄU§„¬d÷`AÇĺźĘ˝;_ÓFŻŁÝX™ ^rŕ8ÁúŠ%kŤ™řăBŠU‚Ţg,˘8ĎÔŕWO^uá˙‡rYępÝj7QI.cŽFIč3^ŠFGJ¸ß¨™ĺ^˙’­s˙]î?“W¨ÝIäŰM((…±ôĺľ˙’Żs˙]î?“W§j_ňş˙®OüŤ(lÁź;;łąg%™ŽI=IŻWřDĘtµ|\’~…WČ×’ćşď‡ôz>¬đÝ0K[ ôFtźnHü}«(;2™ęšîµi˘[Ç=ů‘bwŘ ®îqźčkţ˙=g˙żFşNÂ×U±{[ČİH:zz{ăWážž.75íɇ9Ů…Ďç˙Ö­ź7BUŤ#ăí L—Fa<×âżEsâ5MŘQ6ł.2A9z`â˝jâĎNL\Án,`O»*‚Ş {×”hč—ľ5•nm"]:rRÝB«dm'žř©iů­*…Ŕď‘^ĺŻř{N×QüDşp˛!ÚĘ=3éőŞÚ„´­>Ö7’ŕ fmĹ~ś*]7qÜ߯ń‡üŤ:§ýwoç^ő^ ăůuOúřoçN¦Á"ŚÓsFkŽűáü†Żëß˙fč>,˙‘cU˙Żi?ô^{đţCWżőď˙ł ô/ȱŞ˙×´źú ­ˇđ÷<‡Ŕ_ň7iżďźý׹ׅx ţFý7ýó˙ š÷Z)ě99ŢN×7sÎä—•ŮÎ}IÍtß ˙äl‹ţą?ň®HžMuź żäm‹ţą?ň¬Ł¸ŢÇ­kňż˙Ży?ô^{đ{ţ>ő?÷ůšô-oţ@ş‡ý{É˙ šóßżń÷©˙¸źĚÖŇř‘=ÇÇ‘I7„µ$„űp;ţ€×…ćľ’ AÔä®ţčw&`“ Ɏ'Â~D~§ő@™‹đv)z¤¤ ÔqÁa¸źË#ó­Ď‰Î«á€ÝZD őÝźä tZuŤ¶›h–ÖQ,P§EĚúšó?Ššěww1iv®-Ű|Ätߌř?j»ěî|˙"ž™˙\ż©®+ăr ý>R’bepźĐŠí< ˙"–™˙\ż©­[L´Ő¬ÚÚţ,Däg‚§ÔĆ›WŤf|ó^űáX¤‡Ăzds‚$[tČ#qҲ´˙č¶wK>ɧ*r©3‚ ýük¤Ľą†ÎÖ[‹™8c]ĚǰĄňęÁ»śvĄ,đµ´°q‘jW>‡ĺü뵚AO#B)bÉâĽR×ćąńCk ®łŤOe^€ţźĆ˝łEÔíµŤ:+ËG ŽGu=ÔűÓ„ŻphÁ˙… ˙ĎY˙ďŃĄ?ĐČ$Ip@ę|“ĹVŐţé·×o=ĽŇÚ9d@ çŘv­ż řvËA´’`Ň4§2I& oo§µ 48żřłJÖ4µ˛yZc"° »Ż ˙ȵĄ׬_úŻ5řˇ&—ü6şuµş\&ZáâP9ě§gąü+ŇĽ-˙"Ö“˙^‘č”~&cÎ>-ÎÍŻŰBIٸ {–l˙!ůWšěľ,˙ČŃý{'ójâóYĎr‘ë˙ u´čZ1ËÚČ@ě·#őÝ[š¶Š—úŢ“|Ř˙Cg,=r>_Ȍך|-Ô>ÉâQnçÝ!Źţ9ČŹĆ˝’µ†±%îaxßQţĚđÍěŞq#Ż”źVăô?…Vřu¨˙hx^Ü1̶ÄŔ߇Ýý®_âţŁş{-9„wç…˙Ůż:©đ“Rň5‹‹8K”ÜŁýĄçůůRć÷¬ĐôtTŹĹsę㼷X±ţÖy?QY_ő±ři S‰.śF=vŽOňÇă]uyĹŤCíôVjr–±ň?ÚnOé¶śô@·)řĂ#_»–K˘Ée7í8.ǢŹë^Łö=@´óŚ–Żc(É?SÉ5Ęü»Ř_YĺDë(—ĘčGë]Ť<>Ţ!Ó#‚)Ä2Ĺ'Ą†TđFçJ*Ńş¸šŚ4ŤCS†ĆĘIf–RB‘ Ŕ'śăҶďżăĘăţą·ň®CÁž :éľ˝¸I®•Ťc*ç‚rzžŐ×Ţ˙Ç•ÇýsoĺUŰP<Űŕ÷ü}ęî'ó5Řxňf·đޤčH%qčĚ˙:ăľ˙Çާţâ3]gÄoů5űg˙٦?=ĎÍ{Ç‚Ů_ÂşaNžHŕţµŕąŻNřUŻÇövŃî\,ŠĹíóü@ňWëžQMŮŤťVąâŤ7DşK{ö•ddŢ6ĆX’:ţź˙ A˙žł˙ߣZľ#đýŽżn±Ţ«LůrˇĂ/˙[Ú°tź‡š}Ťôw3ÜKsĺ¶ĺŤ”ĎlúÖŹšú BËx˙CV*Ň\: Ż9´ńéž+ĽÔěFřfšBcnŁ18>‡ĄzŻ‹ŰJ¶ŇfşŐ­­ćÚ¤F$PY›(=*ŕ~[é…ŐŐ¶Ąk ·\I™’ ÷tăůúTĘ÷JăGoĄx×EÔst-Ą=RăäÇăÓő®Z¨2¦9ˇq؆VËxŻÁvşµĽOYM@ŮŔö :źŔţ›Ă¶×+qt&i™NÔjă=3Üçôi»Ů‹CŚř“á¸4§†ţÁvó6ÇŚtWę1ě@?˘Š+¨Ě(˘Š+»đşgG·?ďčF¸Jô_¦í Ô˙˝˙ˇö2Ir×—§ę€×µ·idHăRÎä*Ô“Ú˝ ×á˝ďŮĂMyn“c;$búŐÍřRX¬őë çŔ‰%‰tĎáÖ˝ŃX2†R ‘GC]yž6­(ÓĐ/ÓĽ ©Híö¦ŠŮTŕŰË{€;}qPëşŃŮLŰd…ŽEéźB;őzçxňq“Ŕă8 ‘@m]nŕ{ÝgÁÚ§ ş¶Ž×OgY"}ŰŰj+`cŁWWá?†zWü"°ř‡Ćúłé¶7hcŚ…b§î’H9$r9úwÖÚ•ˇüńBč‘Ôtۨ渊S‚GîŐJ’1’ ú˝(ćší|đ×^ńu±»±H-ěrT\\±Ur:…qëŚ{×_HYéÍăżšF›á}R;;‹T‰.#.T3*Čűy·Ě89â€<“Ćß u˙Ú‹»ä‚âË!MĹł–T' `@#>¸Ç˝qUęž'‹Çţ đ„ú6¨]v*×€>@Ç”dOŞü<řso­čSřÄş‰Ó48É ë€Ň`ŕśś€3ÇBIâ€<ÖŠőí{ᖉửgŔZĚšŠZ‚ŇÁ) Ä“Ś ăśÍSřwđßOń_‚ďµ{˝J[)ŕťăÜvůHŠ¨Ĺ›#<=ÇJňÚ+ٵ?…Ţżđ…ć­ŕÝr{ů¬ŃžA#++í+€ ©ÇLçőÍs ţ/Šlď5]Zűű;E´$<ÜÄ śŔc$úţ@{E{¦đźÂ"ži´?]]ŮD6ş&Ď1¶ń-αs©ŢËiŁé`™ž1™ď88ŔRO·đçÔWˇřÇÂţ‹Ă#[đŽľgU—Ë{;ÇU™ą(0¤ă ăśń^y@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@zÇŔůŽŰý©^O^Żđ'ţcźöĂ˙jTĎáÜősQšq4Ƭ ŐSÍFÔƨšžŐPm^©đ#ţcźöĂ˙jW•5zŻŔŹůŽŰý©J{ ŻEV%Q@dyS'“ʉÜ)m ť«Ôű 6ĚĎÂŰ­:ćôxKĹZއ§Ţ1y,ăŚHŞOR„‘·ę9÷âŻÉđżMO‡—ž±ąšĽu–{ÇI$2±cÓű c·óč‰6̰¶›z%a…>b=qW"ŐŐî¬íŢŢhä¸Bŕ8ĆÜg¨ü+8âá'e"Ý-ŃcF±n‘eb®d°$!ČÁmŞ8ü+â?ăń¶‡›-ă٬W)qć,aÉ*cŢ­ąµ(âŐ °(ćIP¸aŚ gü*‚ř<’¬:}äÂ7(Y‘CÄBW¨*r} Ľ!Ť|64‰nŢÍ|ä—ĚXĂź—±«ÍxŘÔ´¦ŇŢ,aóžO1]}…Éş¶´2@I?$ 1^qâ‹CAľ– ď xb-kÁ€ç`H <ç´’÷H’łÔ,~[YřAÓ#Ő$?Ůš ÔĚľHĚĚůHÝŔŔ9=*mkárjW^+ťu‰­Ű_ňD!Ęp>o{T×RËĂëŞę~ÖlŻ’É`şG#RŰŔ'îđGÖ·|wâëoZŘĎym=ÂÝÝĄšq•f rrG-_żqhršgĂoévYiŢ>Ômí ]‘Ĺś`(˙ľŞmKᮡ/‹oĽAĄř®óL»ĽŠ8Ąň­•˛z–îT•ľŢ7ł_ëzµ¸7]—ۤ—+µ×jś/9ĎĚ:ńPxGâ—⏠ßëv1΋b®g¶|y‹µK‡ÁúúW–ᡡŕýUŃEßöż®µż7g–g‰SĘĆsŚs‘ůU+˙Új^=_j˛­âEköh,e…Z8ý[’rynÝýŞ8ľ"čĂŔ6ţ,˝ÚŘĎ‘LJÍą”(ŕ“´ž˝:Ö·ĹŰxníżáÍoE±»pŢ]ÁÉ=7z~´Z[††ćĄŕ >Očšö‘äéW:q`éonˇn¸*Ŕc篰¬/…ú¶—u¨É˘řŇűO†öĺîž­PŤĚ}ŰÓđ­ďřöęöú=–—¨kÄŃůße˛ŹqHňFć=†A˙ëq›ńĹ—‹ľŰv·V•‹ş˛»M˛DNp~śóŠ/$®z˙Ă{ígţë‰|Sw©¤ vß u/#;»ŔŔV×…<5®i“\jľ,˝Ö 1ó@¨ˇ˛l‚yř×]EO3Ř,QEHŠ( Š( Š( Š( Š( Š( Š( Š( 0$€A#ݵC}p¶¶˛JßÂ8§°¬Ď Ęó5ŰČĹ™:—+4‡m.mQEB (˘€ (˘€ ňŹŽÝt?űo˙´ëŐëĘ>;őĐ˙íżţÓŞ†âg–-Jµ Ô‹[Lµ"ÔKR- %bŇf·¸Šd´nÓ ć« zĐˇŹŠšßüúéż÷í˙řşă5 ·żżą»*Ë<Ť+±ÉÇ·5HSĹ ·¸…ĽM}áą'k…ÄŕI”‘ÇCÁň:Ń×üuŞkzkŘÜÇk.Ac °'8ĺŹÇĺ\§Eݬ$»[şµť•˝¬Vö8#XÔ˛>HPĎÍí\@§BmlżőËť~ýnď‘câ @Ŕ$÷'Öş8ľ%kÄ-´ü( 3ö˙× NÍĚ,hkz¤ÚΩ5ýŇĆ“K·pŚĽ(dźJ“EÖŻô[.ź;FOŢNŞ˙QY`Ňć•účPüOľXŔšÂŮßyY”~\Ö]ĎŹµ‰ő+{¬Â©,; Ś·9<޹њ®f;‹Źú´öňBöÖdR‡ůÁţőqY¦ćŚŇm˝Ŕétjş,K R,öËŇ)†BŹcÔ*Ý—âuń¬-’Oď33ËŹç^{š3B“Ac®°ńîłi5̬`¸yČ'ÎRBă PŔŞŢ#ń}˙,ٵĽ†Ő#I€Ä¬@#»9®k4fŽg°Xë´oęzN›Ť´m …2#9$󆵙â_]ř†he˝ŽÚ%*˘% O|“X™Ł4s;X,Y˛Ľ¸±ąK‹9žü®‡»}?âfˇ aolŕą#řÔÉúőçů˘…&¶żľř—¨M-ť¤äđ‰rżNô®&úňâţĺî/&y¦ĽîrjµˇÉ˝Ŕvk´¶řʬAo" MÎŽXŕc'ćë\NhÍ µ°~%ńçg†[Ő…<Ą*«!y9'’yéůV8$GS3Fi7qťĘ|JÖUL @ĆLo“˙ŹW9ârë^żw˘5p‚0±‚źR}MdćŠnMî+Ĺ+Ă*I˛H„2˛śGq]Ć—ń'P¶c˝¶Šě¨Ç™»cŻ~•ÁfŚĐ›[Úkż5-JŮííăŽÎ'b„ł‘éžß€§[üGŐŕ‚(–ŢÁ–5 #äŕcźš¸śŃš9X۵ń Ő·źYŽ(>ÔěĚP©Ů–%ë öm<˙Ű7˙âë‘Ő/¤Ôµ ď&TYfmě űdš§š3I¶÷ŮŁ4ÜŃšC6|7ŻÝx~ęYěăŢDŘD ‘ŚŘŹJŮÔ~ ę·ö“[جsˇŤŠŁ‚ăć®74fź3Z Ĺí#P—JÔ ˝·Tia;”8%Oçz×Y˙ 3X˙źm?ţýż˙\.hÍ MlóÍhhĽú&˘·¶‰ĘŞT A+ô"ł3E!ť­×Ä]ZćÖh$·° *b¨ůÁăć­/ń÷©˙¸źĚלf»˙„·¶¶—Z‘»¸†Č›L®<ž™«‹nJ䵡Ýřîę{/ ŢÜÚČŃOŚ«ŻP|Ĺ®ÓâfˇAn¬íç`>ř% úőÔ|@Ő4űŹ_Ĺo}k,­ĺáebx˝5㪜šzGc¬x˙WÔ"ha1ŮÄĂĂťçţz~®G9¦fŚÖM·¸Ď{đ/üŠZgýrţ¦ąĎ"Ô4 ~Ѭd_-íňńH2ŤóßáZŢ Ő´č<-§G5ý¤r,Xdy”Éę ®'âĹݵޯfö·΋ Dá€;ŹVŇ~î„­Ëźđłď<ĽgŰďőŢŘüżúőËkţ%ÔµÖn›)ĘĂÚ€úăżăšÄŁ5““{•aŮ­ZľŃ® Ú|í?yz«}EffŠC=ßâ}ŇÇ‹Ť6űÉ!AůťgjßőkŘLV«šž­Kţg§ŕ+ŠÍŞçb˛$ggrÎĹ™ŽI'$šëě>!j¶66ö‘[ŘŕŤcRČů üŐĆfŚŇM­€Öń·qŻ_‹»Ä…%#Ä@€IîO­e曚3Kq–,®dł»‚ć°¸‘Iő5ŮÂĚÖ?çŰO˙żo˙Ĺ× š3M6¶ˇ­j“ë”·×{˛c! 0géQé—Óiş„–Äy°¸uÝĐűcTóFi\ëţf±˙>Úýűţ.ą Jö]Fţ{Ë‚<Ůś»mč3Ř{ULŃšm·¸ôëëť:í.l¦hgNŚżČúŠîm~']¤!ntřeľ’đÁŻ;͡I­‚Ç]«řďTÔ. eA 2¬˘Î©n=HČéĹ[o‰ZĂ)Sk§ŕŚÝż˙\6hÍĚ,nxkÄw~’w˛Ž3ÎRqŚôÁµŁ­xçRÖ4ɬn`łHĄĆă0a†ڱô®JŠ9ť¬łJ®ČĘČJ°9i™Ł4†vÚGÄMVĘ5Šíb˝AѤʿć:ţ"ŻÜ|Oşe˙GÓ`Ť˝^B˙Č ó¬Ńš®v+#OZÖŻő›.ˇ;HWîŻEO ŞVóËm:Mo#G*ĘępA¨sFjn3ľÓľ%ę0DöÖ˘ßËcőĆGč*K˛ÂËgc »‘ŤěćB>WžŃš®v+"ÍíĺĹőËÜ]ĚóLüłąÉ¨3MÍ©ěŃMÍěŃšměŃšnh QšnhÍ;4f›š3@Ł4Ú3@ÍÜŃšvhÍ74f€š3MÍěŃMÍ fŠnh 袊ę3 (˘€ ô˙&|;hß˙Đڼ½gŔ‰ź Ů÷˙ô6ŻO*•ŞżOŐ ›pĹ^ŕmsÉEÓŻě'ąíźá>Ţ•ĆĂ]†:ô1*5cË"nz®§}źjÓLsŮW»Jóű™Ą˝şyçl»Čz &¸¸Ľ(nĄiJ .îŐ41W›Nš˘ĽÉ”®Ĺ^ńTcÇş ˙®_ú)+č¨cŻž>. |BŐGýr˙Ń)\őçĚ‚ś}Q\ơ^Ýű0˙ČO^˙®1čM^#W´˝_RŇZFҵ Ë&ćÚfڰ3´ŚĐŁÜ|ń\“ČęÚv‰ż>żî×KđÂĆm/áďÄ+ ťľ}©ą‚M§#rÂŔŕúdW‘˙ÂeâúőŻü—˙ŠŞqkÚĽIv‘j·č—ŚÍr«pŕN[ďçć''9ë@ëđ?UŹCřK¬ęsĆŇÇiw4Ą«b8řŞ_tŘ>"x*ĎĆ:öş´­Ĺ¶ě–\yI'ÜúW‰Űęú•¶ź-…ľˇyŚÄ™-ăť–7$r ŕô•?L×5m*)#ŇőKë(ä9u·¸xĂRŚĐŃZ>§¬|*Đć𞟥j—vqGo=ĄâçiDÚvĺ€ Ŕ<žA¬/7ž&±řepşí݇tČďDl`Ť„żxT‡*[Śź@:çŠń'YÔ´yÚm*ţęÎVáš Jn‡M_XÔu™ÄÚ­őÍäŞ0­<…öŹAž”îž%Ń®>"ü+đÜľhĄ¸±DIm‹„ů‚eç€Ag5sGđĹ÷…>řŽËTdű\ŃOpŃ#e ‘Ć~\ńë^¤kZžŤ#>“¨]Ů3ý㬛ľ¸<ţ5,ž"ÖäŽę95ŤEŁşĎÚÜąqŹśgćŕĎjĘŻj˙…r/|+¤ëź /î~ŘĘ~Đëd„2ˇ†ĐĄH#g?źŠÖŽ‘­ęš4ŚúNŁwdÍŤŢD¬ľ úoímŕć·Ä¨çş–9"·WHůd·ń6üśóŽąăŚ?Ůźü ‹DѦ‰u; ?y6ÝÄ;0ýŕ٦Ex®Ż­jzĚ«&­¨]^şçižRű~™éřTZnŁ{ĄÜ‹Ť6îâŇŕ yHQ±é‘Ú€=ďá®yđŰÂŢ"ŐüVb¶YŁP¶Ţbą%C` bŔ dü=$~Ďţ+ |ŮÇőÎ:ň-g^Őµ¶C«ęWw›9Q4Ą‚ýŕTVúľĄm§Ëao¨^Ec1&KxçeŤÉ¨8=ĺ@ĹđźřD|d3Ç”8˙¶rQđ¦k?|3ŐĽo#´ÔÝ™âÝĆđH`Gs‚¤vĹxîź«ęZl3E§j–‘N1*A;F˛ź0ž§Ż­wż /ü>‰}˘ř¶Ţ;K™›0ęJ™uÁŘAzp}Ŕ=Gŕ瀮Ľ¨>«i-íĚ@%˝»–ÂĺÎ@=H?ťp?SÄ‘_x†óĂ|ľS;Nącşs–*W¸8Éć¶­5ď|8ŇőIĽ?«Ë­ëw‰±Žđ¸nHäňIŻÓµÝ6ě]i÷sÚÜŚâXd(ÜőäPĽ|LÓ,ő?†Wî· Aˇk±H«©]ňŕ`ŕAcČĆkçÚÓÖuí[[d:ľŁwyłî Ą,čł(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ŻWř˙1Ďűa˙µ+Ę+ŐľĚoţŘíJ™ü#[žŞiŤN4ĂX1©ŤOjŤ¨ŤQ5HŐP˝Sŕ?]sţŘíJň¦ŻUř˙1Ďűa˙µ)OaŁÖ(˘ŠÄ ˘Š( ŃE`]Čĺe˙^í˙łU}z9¦ń6ž–Óů›mÝŽjčŇ»K–ŚŃv«äđ?É4=¤]Grń<`„|ž®Iaĺ$Ő÷•ţZ*‰4ü¬s Ě.±[ËŻ´Čcb`\ 7‹Ě­|mµ%łQpŔˇ@Ů>ĽšëÎÝîŇéŁáŐ|śĎřš¨úîÎöY‰$înOçYĽ$“ş}[ÝőK®ĺ*É­$Z°WKTYg˛î}y·Çßůřcţö˙ú ץŮÚCgŠŮqť “üę®·˘iÚäVńę¶©r–ó-ÄA™†ÉŁpG©®úO–×9ĺ®Çť~Ň*ĎŕÍ9c}ŽuXB¶3´í“šă~.č^'Ň­t)ĽCâŻí›wŐaD‡ěI×ĂŮSĎŚ{×»kş›ŻŰEo¬ZĄÔJ'Dfa‡ÁŕŹSIŻh:fżë‰tL'Ś30Ű ŕŹSůÖ‘ť¬KW<˘Oů,ż?ěô\UŔé6—^đ•â˝5ôÝZĘ}?U„1á™äXĺÇä? }"|7¤VűRű}şöł\Mął$xiÇ@:zQ†ôĽ:t(ěbACµ%Ší$’2Nz’zÓU >:µ·Ăo…şĄÖN‘e©3]śeW3’ EĎŢ»żŚ>+Őtm9u=2ëÂ÷ş9´V÷@Í4˛÷´€9íÍzU·‡t‹mh‘iđd…)öWÓ’GÍžç5cđżÁv7‹uoáűO9X2™äP}BłúQΛ» 3Žńm–›âY%†żwáď®śŽł˘ââ?6Á–ŽIă=Č8«ż uíUügâk“éú•ŐŚi'öť¤J†O»ňądüĂÜ#šîüšÎד^O »‡jgÜóŹÖş>"Îű…ú÷¬c¬Ű-éĹQ[QEQEä˙˙ć˙m˙öťzĹy?ÇŹů˙Űý§U ÄĎ+Z‘j%©V¶$•jE¨–¤Z@J)ëQŠx  <ŚSĹ  8`§@ś 0R@ÇKšhŁ4ŕisMf€š3IšLĐóKšměŃšnhÍ;4f›š3@ š)3FhsFi3FhŮŁ4ÜŃšZ3Iš3@ š\ÓsFhsKšm Í™Ł4ąĄÍ74f€FiąŁ4´f“4f€4f“4f€4f“4PćŚŇfŚĐ!sKšnhÍ4ą¦ŃšvhÍ74f€šLŇfŚĐć—4Ú3@Í&i3E:ŚÓsE:“4”f€4ą¦Ńš\Ň曚3@ͦŃ@ͦњ.isMŁ4 vi3Iš3@ š3Iš3@ š\ÓhÍ.hÍ&h Í¤Í f“4™˘€šLŇfŚĐłIšLŃšvi3Iš(ŮŁ4Ú3@ͦćŚĐłIšLŃšZ3Iš3@…Í.iąŁ4 vi)3FhsFi3Fh٤Í&h f“4™Ł4´f“4f€š)ąŁ4ěŇRfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇQš\ŃšLŃšvi3Iš(ŮŁ4ÜŃšvhÍ74f€4f“4PłE74PČÔQEu…Q@z€u­:= [›¸mć„°"g XA?Zó +jťs!5sßbÖ´q×UÓÇýĽ§řŐ¸µÝuŐôá˙oIţ5󽼱˛—ArźJEâ uÖtĎü Źüjä^#Đ]oKö÷ř×ËôV2®äOł>ŞOřułkşVĎq“ůfľxř‰ŞŰk^3ÔďěXµ´ŚŞŚF7E\ţ;s\ĺ‹wa˨QE‹ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ő_ó˙¶űRĽŞ˝WŕgüĆ˙í‡ţÔ©žĂ[ž¨M0Ňši¬ j6§µFÔƨڞŐPf˝[ŕ?üÇ?í‡ţÔŻ)jőo€˙ó˙¶űR”ö=bŠ(¬J (˘€ (˘€ (¨.®ˇµMÓ8QŰÔýOEs÷zń9[Xđ?Ľ˙áYË%íü»CÉ!=ŔĐVn˘ŮjR‹;ŃT4˝yG¨ĎAďßőŻJ·đ_†ěaé¶ät-1.OâĆ©A±\ůôx5îÚŻĂíú#äŰIHâHŚŔOäľ,đÍ熯DW8’ŢLůS¨áǧ±ö˘PhiÜÄ”S;5m g¦:ńY^†Ňă_°‡Q`¶Ź*‰2p1čO`OěŔĎŁ5ětŤŰÂĎ4vÖÖ×1˛ H±ČĘńÔc'đŻÍ7];ŹÍ¦ŃšFiąŁ4ę3^ŰámA—¬ÖÖłG,§™ÔÝŹ›-Ô`çéŠń[‘Üʰ1hŚ{®x5N6ĆfŠnhÍHͦćŚĐ¨Í6ŚĐłFią®˙ᏅěőŻ.őX ÖčDQ.ć\·Rx# ÇçM+»ÁfŚ×ŞřďÁZeź‡f»Ň- 3Ű퉷'CÔž™Ďá^Qš%Á;ŽÍéż 4Ť;QŇ/$ż˛·¸uźj´´qTl´ËřŻ5‹ZBlÁlBPlşĎO­>] śhÍz/Ĺ­*ĂM‡L6p[™@ŢRÝ€¸Íqľµ†űÄZ}µŇo‚Y•]rFGÔsIĆÎŔfQš÷oř@ü7˙@Ń˙ä˙â¨˙„Ăô ÷ţOţ*ŻŮ±\đśŃš÷oř@ü7˙@Ń˙ä˙⫟‡ĂşM·ÄU°ŽĆ#fl|Ó„¸Ý»ů‰ĄěÚ žSš+Ľřł¦Ůi·ZjŘZĂn°Ťçu®Ą«; u¦ćŠ@;4f›š3@Í­ŕű85ŘZŢGć[ĘřuÉ=Ç5ěđřoţŁţ˙É˙ĹUF[v<'4f˝Űţ? ˙Đ4ßů?řŞ?áđßýGý˙“˙ŠŞölW<'4f˝[Ođî“Ä[›±‰¬ÖĂÍI—·/?15ńcNłÓu+°µ†Ý^XFˇA;Ş\,®;ś>hÍ75·ŕ»{+żŘA©ű+ąÜŕ1ÁÚÔŕT­@ĆÍę˙´­&×BŠhmíí®Äˇcň!qÜ:ú~5ä٧%g`C¨¦Ńš@:ŠnhÍ;4ShÍ:ŚÓhÍ:ŠnhÍ;4SsFhÔf›š3@ͦњvhÍ74f€š3MŁ4ěŃšnh fŚÓsFhŮŁ4ÜŃšvhÍ74f€E74f€E6ŚĐłE74PłFią˘€š)ąŁ4ěŃMÍ fŚÓhÍ:ŚÓsFh٢›š(ŮŁ4ÜŃšvhÍ74f€š3MÍę3MÍěŃMÍ fŚÓsFhŮŁ4ÜŃ@˘›FhŮŁ4Ú3@ͦćŚĐ¨Í74f€š3MÍěŃšnhÍ;4f›E:Šnh QMÍňUQ]DQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@z§ŔßůŤ˙Űý©^W^©đ;ţcöĂ˙jTĎa­ĎR4ÓJi¦°(i¦58Ó 1Ş6©Łj`FŐęß˙ć9˙l?öĄyKW«|˙çý°˙Ú•3ŘhőŠ(˘±((˘Š(˘Š*–ˇlÓŻîb€Čxó$PvŹĘ®ŃCW×B†<4ěeoN‚µŁŤ#]±ŞŞúŠu”Tvm…QLAEPEŠ(Şłę°dI2dvźŇ¨ľ˝n¤…ŽV÷ŔÖĄÉ-ŘŇlآ©i÷ëz[dR(^¬Ŕb®ÓNű «QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š+3Uąş …Q#df ¤Ý•Á+šJ‘)iQGv8¬éµËDű›ä?ěŻř×>‘ÝßČHJßŢ=kŘčAH{¦ ţÂôüMeĎ)|(ľT·4¬/>Ř…Ň7E¶9úUşDUE  ŔĄ­W™ (˘Š`ä˙?ć˙m˙öťzĹy?ÇŹů˙Űý§U ÄĎ)Z‘j5©¶$‘jE¨Öž´€‘kwÁzHÖüKcc &'}ŇcűŠ201řÖ®çŕóŞřÖÝZýqźä 5¸3Ö°öęŁs¦ir€|µ™•ľĄF?‘Ż SzŘHčü'â›˙^ĆŃJďfXy¶äĺXwĆzzöżXAâo Ę‘ âhDöíßv2§ú} Żś…}#ŕÄx<%¤¬ß+ d'=†3ü©Ă]ž?ŕďMâ[)î"ĽŽžYVBŮŕţµŻađĂPžęu¸»ŽŢŢ7(’l,Ňc¸\Ž>¦ş,ݤęl nÉŰh¬ßŢ6Ôlµ©4Í&QnćHf#8č#ß9˘ŃJě5*k ďmmž]:ń/FLF?-ŹÓ’ ü«źđ‡…ĄńˇsjÓý‘­€2Ś’9ÁČ滿†>/ĽÖngÓµFĚ‘ů±Í´) 8ă¸ýk+âĺç…üVo4YEł_ŔS±X3Aę;R´wA®ÇŁ6’‰á·Ň-ßj}”Ű#·=WnOóŻń&Ńő=*ĘKČĺků<µ`„ů”dúýęőŮ/nZřIţ”, űđ>˙—»8éÖĽrĎ_ÔµßčgT¸óĚ7q„ůq—\ôĐUNŔ‹ţ.đ]懤‹ŰťEnQcTÚxϦM?@ř}q¬hÖú„wńFłBÉ#Ź_jíľ.Čž˙őÝ?­_řo˙"N™ţë˙čmG*ć°_CŃ~]]Z¤Ú•ŕ´v,{Ř}NF·5źŻ|<ÔôűÉ…ôS8Ś2.Ҥ˙xsďš‹Sńţ¸ÚÄł[]yVë! ŔWh<ĆOůé^Äu4í2ź(µűNĚ˙±»’‹Ř5<îŰáSµ¸7:ޤär©ĺęHĎé\Šü3{á»”K˘˛C&|ą“Łc±ô>Ő§¦xű\:ÜÜ] y@x6»Ič8Čú× |X…eđlîÝa–7_®íżÉŤ+E­SŚĐĽy©č]ĹŞ,0Ü.óÖÇăĎ=+#ÁŢ—ÄĐÜÉÜpT†BŮνkŔň&iőÇúšńÄ:¦’¦™t`YH.+dŽťAˇ¤¬m˙ Şëţ‚pߣţ5SWřqq¦éwWݍC"Á¨Ś‚p:u®ŁáÜŢ#ŐWűGWż°ň"‹ĘE2ź\…ÎëüéüPńlvöóh¶%^yWmĂő©ţ©ý>˝Łk†§žřoĂ×ţ ş1XF6.<É_„O©ţ‚»µřRľWÍ«7­ř˙Đ«­đŽ›ý‘áxěâVąx<â ĆůsÉü‡ĐW.‰ăé/M×öY3«s„ŰzcđŁ•%°\äüWáK˙:µÎÉ­\íIăéźB;çs_Bë2ęžžŰS‰>ÔÖIJ©ČGâ+çśÔÎ6ŘiŽ$2O ÷í&ü)ŕ´ó€Ú,ŁűÎy#ó8ü«Éľi_Úľ*¶ą†Űý"OO— üńú×§|J´Ő5 ,t‹fśÍ 3Ę0«Č‘Ôăň§dŘ™oÁúšřŹÂ±Éw‡‘Ő ¸§ˇüÁńŻ Ö¬KŐ®ěeÎč$)“Üv?ÁŻRř]ĄkZ,÷¶úť“Ăk2‡V.¤cÜұľ2é^Mý¦©ü“Ż•!Ţ^‡ńú 9k‚ÜŮř/˙ K˙úř˙ŮEgXÉhźę˙ú*´> Č˙ţľ?öQYöňZgúżţŠŁ˘¤˙?ăßI˙z_äµĺjĹH*H#ˇęăßH˙z_äµĺY©źÄ5±7Úg˙žŇ˙ßFľđKđž”ĚI&É5óľkč˙ČŁ¤˙׺ӧ¸™ŕ s>ăűéz˙x×eđ’F“ĹÄ»3ł8É9î+‡có­vż?äm?őî˙Íjc¸ŮŰx÷Â×~%Ô´ńnńĂo?™+ó‚HŔąâąëď…—ŰłYjQĎ(ňä‹făěrksâ—‰/tH,íôŮ<©n73K€J¨Ç>ąý*?…ž$żÖEí®Ą/žđ…t€A{VŹ•ĘÄëcČ® –Öć[{„1Ít=AEuŢđˇ­@·72 +WŁ:îgˇxăÜÖ߉ôX5ŠÖVŇ(ň®"YĄŤÁCd®Ŕ?í<_µ.–ţ1Ĺ+<…‚”Lt_ĺRˇ˝ÇsŚ˝řTâlµ5y@áe‹h?'•yÖ§asĄßKi}ŠxÎ źćq^­á=/Ć:n­j7?i±s‰V[Ź0ę3Č9Şźl#ű-† ¨ˇĚ ø ?CůĐâ­t žV¬U) Ž„Tźiźţ{I˙}‡4™¬Ć}á˘OôÖ$’lĐä˙¸+çĎ´Ď˙=¤˙ľŤ}áŹůtĎúňOýWĎĄN‚G}đyÚO\bÇěmÉ9ţ4®łÇ^»ń.łfĐÉŃBCĘÜóž€w®Cŕ×üŤ7őč˙úWQńKÄ×Ú7Ří4Ů<™& ď(Ŕ?Ť5n]C©Ť¨ü,ąŠÝžĂPK‰TdFńy{ʱÉýk‡Ó4ąŻ5Čtą‘;Ëĺ6ń÷ľEzŻÂĎßkp^Á©IçKnU–B$6x8ôÇëXšÜ Ć @šńH@őĆ?Ą'Ňh.břĎÂzź ĺÖ .J! ´äpOsíV­~]\čqj1^ĆŢm¸ťb’Ç+¸/^˝«¨řÍ˙"ͧý~/ţ€őŇxna´Ůec±ŤČú 4ůUě8 7ám̶ˇďő·™†|´ŹĚŰő9Ąs~-đŤ÷†ĘI3,öŽv¬Č1ózŘŐ…řŻ L]5Č0ďÉ·Ú6mţďLţ=kÔĽ}]ř/Q,!*ät ‚)Z-hž%ˇč÷şÝč¶Óá2?Vc őcŘWvź f0ĺőhĸű˘WóÝý+¦ř[¦ĹcáX.GźvL˛7¨É >ţfĽű[ř¬Ýjr˝…ѵµV"(ŃTńŘś“úQd•Řěľę2Ľësu 7Ú¤)a ĆwÇÓđ®NëFąŹÄiăí+)…vŚn>ľÂ˝«ŔZôž!ĐVćáUn#Ĺ&ŢČB?Zä<7,ü[ŐDäs*Eźďä䛊ŇÁq¶_ ĺkpךšÇ1r8·?RF*ç<[ŕ»˙Ä.Ňć̦T*O÷‡o­zŹ4 wUş‚}Q0Ç`Áć´6OĚŕžG_JäüUâ/ŮéJÖtřŁIcňžw̸îąďD˘—@LóěŃšLŇf˛ěŃšm.hsFi)3@ͦ斀ŠměŃšnh QšnhÍ:ŚŇfŚĐćŚÓsE;4f“4f€4f“4”ěŃšnis@ š3IšLĐłFiąŁ4ěŃšnhÍ;4ShÍ;4f›E;4f“4™ fŚÓhÍ;4f“4f€4f›Fh٢›š(ŮŁ4Ú3@ͤÍ&hŮŁ4ÜŃšvhÍ74ą ÍÚ3@Í™¤Í:ŚÓsKš\ŃšnhÍ;4f’“4ěŃšnis@ š3IFhsE&i3@Í™˘€>M˘Š+¨€˘Š(©a·š|ů1I&:ěRqůTUŰřiBčĐ,Xźs¸ŹéAťZśŠç%ýźy˙>—÷íżÂŹěűĎůô¸˙żmţč@ I<*ČÓďHČł¸Çýro𡴷9ľ´×CÍ?łď?çŇăţý·řQýźy˙>—÷íżÂ˝/ű:÷ţ|îďÓ…E=ĽđcφHóÓz‘źÎ’iő­ľÇś Ŕ2m.˙®gü*żNµéUĂx…Bk7!@ ţ%A¦mJł›łFmQA¸QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW©ü˙×ý°˙Ú•ĺ•ę˙ć5˙l?öĄLöÜőM4ăL5CM4ÓŤ0Đ 1©ćiŻVř˙1Ďűa˙µ+ĘŤzŻŔůŽŰý©S=†ŹX˘Š+‚‚B‚II4R7N(ŚşµšË`ßî‚jłköăîÇ+{ŕëM»Ň§»ź|’Ä‹Ř"śŇ/‡âţ9ÜýăY7SˇvŁ_€źšö Ö­¬ës Ë`§¦ĺĹV¶Ň­ ÷°îüţť*ő\TľŃ.ÝŠ(ŞQEQEV6· H0żj‘ŹDO¸>ĽVÍšş°Ó±ĘA˘ÝÉ÷Őbíđ­+m lĎ#J}Ŕ­š*8ˇó±±˘ĆB¨čŕS¨˘´$(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*í˘śŻśöô Óň©¨ U  (€ RŃEQEQEä˙?ć˙m˙öťzĹy?Çů˙Űý§U ÄĎ*ZzÓź019ËÁ Ę?áŘűŠô[?‹–Ć1öÍ.d~ţTüńZ^2ÜZ˘‡„ľŢČî5˙.(#`ßgVŇc±#€?:ě>$ř‚-@–Ţ&Q{t†(uU<öŔéď\ž­ńfg‰“JÓ–'#‰'}Ř˙€ŹńŻ8Ôoîµ+É.ݧyçs–v?§°öˇÉ%dîzçÁ/ůjőó˙˛ŠÉř•ŕýJ}r]OL·{n.‘ڞ0tęAĆ:Öř#˙ +˙úů˙ŮE7Vř‰.‡â]FÂňĐ\ŰE ˛6ÖPT0zűSÓ•\:ŤřWáKí.î}OSŔÍŠ(›ďrA,GnüMsß5îüMĽ.ZÂńŮÉ$ŹËm_Öţ*M=łE¤YycΕú.1źŻĺ^m4˛M+Ë3łČěY™ŽKÔš–Ő¬CÚÄ×ţŠ|3Ϧ„NqËEüëĆ´Í#PŇ:_öW[_łyżh˙cněmüqš4Żpg bÓm˙ë˘˙1^ăńKţD‹˙÷Ł˙Ń‹^žTńÉŚě`ŘőÁ®çĹ_˙·´9ôďěĎ#Í*|Ď´oĆ›G§­i& ôŹČ—Ą˙×ękË~řTx‚ő®.ĎüKíoPy‘ş…ö§ü‹úÄźěť×OţĘóĽ„Ůć}§nď|l5›ŕźÂ1gqŘ>ŐçHwťłctŐ6ť®ž©âű­NËJ[XI-Ë®ĹhÔ…}~ľüźĽđ¶ż S]]é÷4’HÄ$žkł˙…·˙P_ü›˙ě*¦­ń?űGJĽ˛ţČňţŃ Ĺżí9۸ślç­q}A\ď|/ýłŕëw˛śGqö$¸1ĘÁ÷ÁúWžÝę_mo łýµß8 Şş7¸`¸Ĺsń=˙‡.YěŮ^#Ě…ůW˙î+ĐâĹ™‡/¦\ ş$?ţµÉ­XXźUłńmź‡žúăÄQ#¤&Iáxăî†äöéÖĽ{5ÔxżĆ·Ţ#_ ˘Ú؆ȅ%ŹmÇżé\®j$ÓŘhöźúWŮ4/ä\Kx˙/ű‹?]ߥCŞüN¶±Ô®mcÓŢu†C&6 ‰ÄákĄ%•–Ž!ňáň˘ssť¸9őŻ8,I$ś“ÜŐ9YZ"·sÖĹ23¤ĘsçŹţ&şßééŻřNć81#4bxî@ČÇÔqř×Ď5č^ř•&“ŁZŘM§}Ą ]‚_´lĘ獧 Ŕü(Sľ’»Á_ůß˙×ĎţĘ+>ĂţKT˙W˙Ń5ŤáĎš6  ŇwEupgTűF<°‡îóYÖţ,ň|jţ űíÄźłů˝2›~ößÇĄĘČ,vżăßH˙z_äµĺ5ŐxăĆđ”Gfżaű/ŮËůŰ÷nÇű#+“ÍLťŢCł_DxţE 'ţ˝ÖľuÍz.…ń/ű+G´±ţÉó~ĎŹÚvîÇ|l8§“ÔLó×űÇë]·Á˙ůOý{?óZáÉÉ&¶üŻ˙Â9«›ďł}§÷mĎ3g\sśJQvcgeń·ţ?4Żúç'óZŹŕźü„ő/úâżús~7ńWü%ZIö?˛ů ËŹ7~ěăŘcĄ'‚|Q˙ĹŐĚßcűWś1ćěŰźCUuÍqt;_jQé_4›«† ·Tv=c"çđÎ ężť5%v‚Ć–wă˝SRŽŢYîí!Ďď&šŃT ďŐFOµRř—·c­¶­¬Go#™#AFF7űXë[7źŕ±i’™HŕÍ  ÎJómsWĽÖőĽÔ$ß+páTzŘRm[FĄFiąŁ5Ϣü1˙"n™˙^Q˙čľvÍz—ń3ě:5µ‡öO™äŔ°ůźiĆě g+ÎłW6ť¬$ŽűŕĎüŤ7őć˙úUżŤňÓżëčUĘx3Ä_đŤj˛^ý›í;á1ló6c%NséSxŰÄ˙đ“ÝŰOöO˛ů(So›ż99ĎAE×-©Őü˙Źť[ýČż›TŢ#˙’˝Ą}"ţµČř#Ĺđ‹Ëv˙cűWÚŚy»6ă>Ç=iú—‹ľŰâű]wě[<Ťż¸ós»ţ-Ľuô¦š˛AmNűăGü‹6źőřżúÖî“˙"§ýW˙EW–řÓÇđ“iŮ˙gý—ËKżĎßś+ chţ÷éWí>$ýźĂńiźŮ[Ľ»aoćý§ÂíÎ6ţ™§ĚŻp±çůŻ ü_˙">Ł˙^§ůWĎYŻBÖ>$˙hčwwöW—çEĺyźhÎ8덿֦ +ÜÖ|&ÖbľđęŘćË*T˙H#óÇáď\Ö·đÇP:”­ĄMnÖ’1e1V@{qëU<ŕ˝FúŇ bËUŽĐťĆ#,ŕ‚F Ź~)n~ ř˘ĆW˛»‚Ýní%ŕ!óôĄUŐ—0z™ŕí|;˘Ą“Í”±’W±ÇOl? ňë˝óÄ>Öa°ž%†c)i‚zŚÎq^ŹŕÔż°Ţë\y ĺÔÍ1pUpí÷sŹzńëÝzâ×ĆWş®›(W7227Ud$đ}Aĺk Gc¨řĹžż[;°š”&xOÎ1Č ;Ç95Úx™#ÔĽy%üIk39Ťů18]Ăńą;?ŠöćÜ}łM”L>S‚¤ţ<ŹÖąŻřöë_¶6vđ K6 şîÜĎŹSÇÔs$· nh¦ćŚÖ#š)ąŁ4ę3MÍ QšnhÍ:ŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ QšnhÍ;4f›š3@ͦćŚĐłFiąŁ4ěŃMÍ QšnhÍ:ŚÓsFhŮŁ4ÜŃšuÜŃšvhÍ74f€š3MÍ fŚÓsFh٢›š(ÔSsFhŮŁ4ÜŃšu¦ćŚĐłE74f€š3MÍ QMÍ fŠnhÍ;4SsFh٢›š3@ͦćŚĐ¨¦ćŚĐłFiąŁ4ěŃšnhÍ;4SsE|ŁEWQEP]dž˙ä o˙˙ĐŤpőÜxoţ@¶˙đ/ýĐsâ~¦đ҆ÖíCFXţ!IßWáŹů[Ŕżô]íyřĎŤz=++Ĺ ‰pHä#ţú«Y~'˙Ďü˙B…/Ťz™ĂâG\?‰?ä5q˙˙ĐEwĂř“ţCWđýW°zŘo̢Š)Á]„Ľ«xŻH»żŃ沓ěī۴Ś%Î206ăžÜú×!]‡Âßż„ ŇnuÍP:n‡#Ě řęA<:g'ŠÚŐľhZ®w©řZ—Q{@L–ňĚŘŔ©ă#šńęé<á+ŻëéÖ7A,p4ĺ¦Î ŁĎĚ+oá‡Ăăâ伿Ô/>ÁŁYń,üeŽ2@'€Á$ôČü=káO†<)§ř†çRđŽ»& Ý­§†VVe,ĘC *ńňÇ>´ó~§hú~Ąug#+=ĽŻ 2ô%IŹĘ«W˘hž źĆuřDâÖÂÖęi.nÎŔdlîp"kˇ¶řwŕŻ%Ő—|Is6Żn…ö\‘đq‘ň/ă śqÖ€őbÖu 683®ľĺ ăňcůW›šąˇęshÚ˝®ˇm̰>í§€Ăˇę2?M]XgÔ4UTµÖtČ/¬d Ł>ę{©÷z°((˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+Ćľ8^¬şÎźf§&YŰŘą~J?:ő}oTµŃ´ŮŻŻ¤ C>ě{(÷5óną©Í¬ę÷Z…ĎNű°:(č}áW­ÄĘBž)˘śµ©#ŧňŻ3Í&i3I¶÷٢›š3HfŚÓsFhÔf“4™ fŠnh fŚŇf“4ěŃšnh QšnhÍ;4f›š3@Ł4ÜŃšu¦ćŚĐłFi´f€š))3@ͦćŚĐłFiąŁ4ěŃšnis@ š3MÍ fŠm Qšnis@ š3MÍ QIšLĐłE74ą Í¦ć—4´f›š\ĐćŠnhÍ:ŚÓsFhÔf›š3@Ł4ÜŃšvhÍ74f€FiąŁ4ěŃšnhÍ:Šnis@ š3MÍ QMÍ QšnhÍ;4f›Fh٢›š(ĺZ(˘şH (˘€ î<7˙ [řţ„k‡®ăĂň·˙čFźđť?†?ä9m˙˙ĐMwµçÚ ńŰjÖňĚŰc‚}2ţµż­x†8ŧ¸yOY1żOS\XŠrťD’čy5bĺ-ОüO˙ ;źřţ„+–Ó5«›;‚Îí4lręÇ9÷ő·®ę¶w:,‹ Á¤—n¸ä}:V~ÂTçş“ěÜdŽB¸Čjăţ˙ Šî+‡ń'ü†®?ŕ?úŻHô°ß™ER;‚Š( třÇţ…ą<µ°˙ČOGĂŹĹ_5Ż XĎ:Ş»8V8Ü +)>Ä©R{WŤ\ëťÎź…ÎŁy5ŚXňíäťš4ŔŔ“€MW˛Ľą°ąK›‰­®îË ”eúÍ{ßÂj~¸Őőď¬-Ôǰʯ‘¸1c´‘ü8©ÍAđFć wNń¶ź¬3ßłČ{$—8ôŹĚWŤk#ÖµÖ=WU˝»‰NBM32ëŚă>őFÂöëNşK› ™­®îË ”aô#šú?ŕ‡µoÜjÓkk op8’9î N[Ž‘Źé\çěěí›ăCµŃb`}דÉâßIvn›]ŐÉ]žbÝ:¶ÜçnAéžqT´ýcSÓVuÓµËEźýh‚vŚI×ď`óÔőő4D’I$’O$šô˙Ů×ţJ˙Ż9š×—Ő­;Q˝Ó.>ѦŢ\ŮĎ´Ż™o+FŘ=FAî)đÄ ďjwZn®ńYMpňBP‘6ˇb@ŔéÇj­đ?K˝Ńľ*k¶«‰/˘˛c3‡/ąšH›;Ź^µĺźđ™xźţ†=k˙Ą˙⫲ř)â›M3Ćzާâ}M”ĎfŃ›‹†ißz`É {ÂC‰~řŹĂłEo©»ĽŠ§€U‚ŕý2ĄO Ç­jüđ·á}vűP×;`öćŢ8VUrůebß)#oךůöĘîćĆĺ.,®&·¸NVX\Ł/ĐŽEjKâĎKv—Rkşˇ¸E(˛ § Şq<ź\Pł|Ő-ăńwŤô†hRúęęI-ÄŁ+&Ö}qqéšÝĐżá:K릺Đ|+ŁC1űaŚ•lzm“ wÉĆ?JůśÜÎnÍŃžSr_Ě3o;÷ç;·uÎyÍję>+ńĄgöKýkP¸¶<äť7מôĎ…×&»×|S¬xvçHťŢf–âÁ‹…¸bĚĘcÎ6‚KIďČ­ż‰šež§đĘă]Öô4-v)cU+ľB\ Ü,pyÍx>ť¨^i—Ks§]OipŁHd(ŔzdUťg^Őµ¶C«ę7w›>ŕšRÁ~€đ(2Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˝GŕŹüĆżíŹţÔŻ.ŻQř%˙1Żűc˙µ*g°Öç¨SM-!¬ i¦śi¦€i†ži† 4ĂO4Ó@^ńFˇá«Ł%‹†…Čó`~Q˙ŔűŠőÝâ^¨"‹ąÂsŐ&®}qůâĽÓMKŠcąôÚřźA`Ö´Ě{Ý ţ´ÂM ˙ĐoK˙Ŕ¸˙Ćľb"šE/f>ź˙„źA˙ Ţ—˙q˙Ťđ“čôŇ˙đ.?ńŻ—¦‘Głcę?řIôúiřřŇÂQ ĐsK˙Ŕ¸˙Ćľ["Š=š źR˙ÂQ ĐsJ˙Ŕ¸˙ĆŹřJ4úi_řř×ˤ"Źf‚çŐđ”xţşWţÇţ4ÂSá˙úé_řř×ĘŘŁ{4>©˙„§Ă˙ôŇżđ2?ńŁţź˙ĐwJ˙ŔČ˙ĆľUĹŁŮ ąőWü%>˙ î•˙‘˙Ťđ”řţşWţGţ5ň¦(ĹÍĎŞ˙á)đ˙ýtŻü Źüh˙„§Ă˙ôŇżđ2?ńŻ•1F(öh.}W˙ O‡˙č;ĄŕdăGü%>˙ î•˙‘˙Ť|§Š1GłAĚ}Y˙ O‡˙č;ĄŕdăGü%>˙ î•˙‘˙Ť|©ŠLQěĐsVÂSá˙úé_řřŃ˙ O‡˙č;Ąŕdă_)âŚQěĐsVÂSá˙úé_řřŃ˙ O‡˙č;Ąŕdă_)âŚQěĐsVÂSá˙úé_řřŃ˙ O‡˙č;Ąŕdă_)âŚQěĐsVÂSá˙úé_řřŃ˙ O‡˙č;Ąŕdă_*bŚQěĐsU˙ÂSá˙úé_řřŃ˙ O‡˙č;Ąŕdă_)âŚQěĐ\úłţź˙ĐwJ˙ŔČ˙ĆŹřJ|?˙AÝ+˙#˙ůSbŹf‚çŐđ”řţşWţGţ4ÂSá˙úé_řř×ĘĄĹÍ1őWü%>˙ î•˙‘˙Ťđ”řţşWţGţ5ň®)qGłAsęźřJ˙A˝/˙ă˙?á&Đč7Ą˙ŕ\ă_/NŹf>źoč* :Ö™Źk¤?Öąýoâ^§Ł IţqŃ!\ű±ăňÍxáG" ›Ţ*ńFŁâ[ˇ%ó…… ň N?ÄűšÄ‚ś*Ä8S…4S…[˘Š+¤€˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ŻPř'˙1źűc˙µ(˘¦{ nzu%V ďHh˘€Hh˘i¦Š(¦›E””Q@ ¤˘ŠJCE)´Q@!˘Šc (˘„˘Š)€”QE-%PJ(˘%S QE Z(¦RöQHĄ˘Š`%(˘Š)h˘€ Rh˘ŠZQE´´Q@ŧ ( Ą¨˘€)Š(iÔQ@˘Š)˘ťE´˝¨˘€N˘ŠJZ( ĄíEvĄ˘ŠQ@Q@Q@˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(QEQEŠ( Š( °˘Š(˘Š(QEQEQEQE袊(˘Š(˘Š;ŃEPh˘€ (˘€ÔQEQEQEQEQE/jCEP(˘€ (˘€ (˘€ PEPEPEPEPEPEPEPEPEPEPEP@˘Š(˘Š(Q@Q@…PEP@˘Š(˘Š˙Ů endstream endobj 189 0 obj 103635 endobj 185 0 obj << /Font << /Font2 12 0 R /Font5 28 0 R >> /Pattern << >> /XObject << /Image24 188 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 190 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 191 0 R /Resources 192 0 R /Annots 194 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 191 0 obj << /Filter /FlateDecode /Length 193 0 R >> stream xśµTKNÜ@µłŁ2™A¤§?UýY‚R‚)’%ĹĎŚâkpŞ\‚eVY䩲ǟLHhpËîî§®zŐď•\Qd|h¨‰çó%T •Ö&ůHë›{>$Óś§ŕu^ö«) ,JŘŘČw'pĂ$L÷Ëď‹™†ů3XyCDgC9ť˘vÉÁjţ*Ş\íÂWŐ€ÉÔLőŕ´&D2 1€Ar˘“` FŔ+˘Łëc{¬ŁR[uűU-m»‘˝Š„&RĆ%ŁC« –0ńÂłî:Ä DëČ&”â ÎQ¬`zt{soř <Š«ż}Mü’UˇhL+.঳‡ěgţeµ\ăěG~śý~÷˝ĎGŮŻü8ßËwňQ~z:3(>ĂÇb›%!EĹFá?uŤ'P\ Ů *>ç*E—¬¬}aO-±Ę¨ě!nźj¨Ťë‘A m3éÉnÝýÖô¶•Ĺr‹Eqj#€/;ý´śÍ/-Áám§Ë/*E„@ÜşĄM—]‡•ĚDĚşŘ.xExä­ügŃABš&Ń!yŻ´y*¬—Ä÷’ČřZ,îŹ endstream endobj 193 0 obj 443 endobj 194 0 obj [ ] endobj 195 0 obj << /Subtype /Image /Interpolate true /Width 702 /Height 78 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 197 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔNľ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůú§˛˙ʤü•ASŮÇŇ~?ʨDQEQEQEQE:8ŢRDhÎ@É 3Ĺ6ş}ţ%~Ô5Ä÷gěžřţ"?Ďjć(Â71™1ŚÇýiµÓř‡ţ%žÓ4ˇÄ˛µÎ=ĎÝüöĚPE*©f :“Ší/†…¤jqé7p•Užé¤!`@™ĎŔ⨭§‹­iě´Ç«HD,N7Łô«“xWU†ŇK‡qÜčQęE 0諚V™wŞNb˛‹{(ÜÄŹRMK«h·şRĆ÷QŻ•'Ü‘2źÄPu«Ąhúś{xŃ`o™#…ú ő¨.ô«»MI,nbň$`äŕôĹQ˘»|?ö/·ů§{†Ňăľ+—OąMDŘ÷ÜîٵěźcL ´VŐ˙†u;+W¸–dŹý`Ž@Ĺ> V- (­}?ĂşŤý¬W6ń§‘!#{8P0qÎh"Šą«i—ZUĎ‘{Ç#p ä0ő´ đ®­5˛J°(.»’6aę  :*h-gžímb‰šá›`Ź9ô­™ü%«B$-ecBîV@Bă’˝`QZZ—s¨ÎZŐ!$«2ĘáAç§=zTŢ,YWZ”Oi¤W1BA^ťx  z+WJĐ/µ;v¸#Xmó%p źAšŠ÷HĽ˛Ô"˛ąŚ$Ň,6¶NĎLP}ŘËŕé˙°ŕ(‘}żÍ;ŘĚ6”Çń\âiWO«fŞˇşÝ·†3Śő¦+ro ę°ÚIpđ.#ť‚ę=H¬řt뉴ŮďŁUkxX,‡w+ścŹNiNŠ·ťq.ť=ňŞýš Ě[žŔwëU(˘ť4’*FĄťUP2I=«°Ňô3e˘5Ýć‹=íëĎĺ¬ ąv&3»Ţmˇo-ƲđA`Ö˛»[Q’TŕzţŤ[żđľ©cj÷B†8ů“c†)ő”Uý+HĽŐDßaŚHb°Üäŕu©µ]˙K·IîcC ťˇăpŔCŠĘ˘ŠTu¦h(®ßX}Ă^m6M,˘™V 7sŹĆ°ő] áń<šU‰ó aĺî8ŕ®ěL J+ro ę°ÚIpđ.#ť‚ę=HŞV—wŞÜl˘ŢĘ71'Gą4€ĄEijú%ö’±µÜ`G'Ý‘2“é‘V`đľ§=˛OQ˛É•Ě™O   J*ö«Ą]imş ‰Wr28e#ę*ôŐ¦¶IV×rFŇě=@4‡E]Ó´»ťBíí UYË#Ć^ü×GŻřFh¦FÓŇ%„B¬á¦ÝÎq“L>ŠčĽ9Ą.§˘ęţ\[Ä1Nq·,síÓÖ¨jÚö•RÝ"dádŤ)>™€Ě˘µt˝˙S§·Ťvů’8PO ĎZ©as§Ţ[¸Śs p{ç¸=ĹU˘Ż]iwVş¨ÓĄUE• ‘–Ć9üE2M>ĺ5#aĺîşĺěSś·Ö€*Q[·~Ő-­ĺ™Ł‰ÄCt‹™G¸¬*(˘¶ŕđľ§=˛OQ˛É•Ě™O   J*ö«Ą]imş ‰Wr28e#ę*ôŐ¦¶IV×rFŇě=@4‡E]Ó´»ťBíí UYË#Ć^ü×GŻřFh¦FÓŇ%„B¬á¦ÝÎq“L>ŠżĄiš¨›ě1‰ @€<śµ6« _évé=Ěhas´•ʬňŢ-ŞDĆŕż–#Ćěă »wá]RÚŢYš8śD7H±Č”{ŠÂ Š( Š( Š( §˛˙ʤü•ASŮÇŇ~?Ę€ ˘Š(˘Š(˘Š(§EK"G,îB¨ɦŐý ň?U‚îâ&™";‚)ĆOoČó@Ţ4‘mžËH„Ś@>;ČÜ“üż3T<-`5-rÚ‰O™&zm^N~˝?Ď˝ą{ËÉ®%9’W.Wô}U4ŰE&7W1ůI&p‹óţ”ŔŹÄZÔő›«¬ĺđźîŽč+:Š)čHYPž5ÔxÎÂâďĆRE dµĎ—ĺžÇĺ9ôâąZÚ·ńF±oh¶Ń^°ŤFŐĘ© zFicÂöŻeăK[iŠ™"‘•¶śŚ…5V=ZçLׯnˇŘň;ČŚ$†óśYö—·—«w…n–@c“Ôó×­C#´’3ąË±,O©4ŐřHĂ˙î»çG,«Ë¤M‡+“Đţu ýĺ»xU­ěl.ă´7ÄÓ8e Ž@8ô¬-7PşÓn<ëš1‚F#Ü MŞë7ú®Á}9‘Sî¨P ~€6¤¶˛±Đ4ĆŐţénI1H8˙>üŃăŔ?âNU$Aö5ÂČrŔv޲¬ňŇŢmHYiš‹ÎĐşN@ŔÔ·ĆÖ˝÷‰5këV¶ą»-pŔ"©o©˛(®—PvŇ´ÜHHőÁ?ă\ŐY’úâKlŢLŰDĹ‘6Ž ëĎZ@X»Ő%ľ‹O‚čGĺÚ ŠŔ•ăŻ>ŐŘx‚{(<[˝•ô× ĆФ[c?úőçŐłmâ}bŢŐmâĽaŤ«•RTzFi­ Ü,źüéb6í$’~íú«<|ŐŹ iÚŤťĆą%ěRƆÖUfp@vë‘ëßó®2&ÝrŤ$¬™pZNIňk°]VÂĆŢî_í«­RâKv‚4xÝBîÇ?7ĐP=5Ň|AţiÎ6'ţ‚+3JÖµ %d]>ăĘ[äVÎ:u¬^řźW˝µ’Ţćď|2 2ůH2> Pë+ŘWĂÖֺޝröFh.!lääsÁďU|W`,¤˛hngšÚxCÄ'?4kýÚ­¦xRÓ 0ŮÜ•‡9ŘĘí‘ĹUÔu ­JăĎ˝™Ą—ÉŔŔôp(néYĽdTńłÓUĽ˙#M‡űÍ˙ š©ĄëšŽ—%…ÓDŚrWhaź\j$ÔîÓSţĐY±y¸ż™´u>ŘÇé@#Ő®tÍzöęŹ#ĽÂ@H`O9ÁgÁW ýˇ6źrŃŻă0·ł ţźŤ`Hí$ŚîrěKęM]ĐšŮ5‹I/eň­ă;¶ éÎ8ç’1@>(C¤é~ŠóFn.1ÝŹ~?Ąrő^ż:žŻuvs¶GůsŮGô¨RQŮ]«©Č`pAő®¶mFřx ĹĺĎśoŠ™<ÖÜFĂĆsśW#VZúá´ő±2˘¬žhMŁďcĎ^”ąŕiž[Is#I+ů݉$ě=ϵOáąMCY7A‹YDĺşn÷÷ë\´2É©,.É"ĘĘpA­K˙j×ö¦Ţćńš÷”*®ď©š`^đł˛h~"*H?gQź®EdCŞO‘q¦€†ŢgąHÇN}…Ek}qkÄ0I¶;… (Úŕ>˝? ­@,ëę)(ÔRĽń^ąťâ)Ő4Ë)n#ŘVyT–ÎĐGĺXľ»šűĆ–—7/ľi$bÇţkP˝¸Ô.ŢćňO2gĆćÚp08RY]ÍcuÍ«ěš3•lŽ1ĐÓF=ZçLׯnˇŘň;ČŚ$†óśWü<$ řmÁ3Bő+“źÓ5ÍHí$ŚîrěKęMXÓu˝2ăα™ˇ“$`‚=<ÝE‘~Ë篋wűĽăőýkfŘ‘}ˇŕ˙Ě%żô\v«¬_ęĄ ýĂJî®ř XżWÖ|4#;ĺLc?^´««m˙„gĂ%ţîgĎÓx­ßOe‹cw˛ľšôÚ€+` `c§˙^¸iďn'´¶¶–MĐ[îň—mÜryęyő­oëö«oăÔm\Ş’ŁĐ3@uůLúŐä­ @Ď!&6꧸5­ăµoí6Úv›8đqÁë\Ű1v,Äł’ORkZjĐŮ}‘/ěű6mdVůqŚdŚĐď»'„üDPqü J!bß§ rřmĎo”V×Z\ZĹ&Ř.6ů«´Ř9ő… }pş{X‰1jŇyĄ6Ž[ÎzĐWpö ŕíŢŰÜM2ܸP­»ľG×ő¬ß]ý˘m4µ¤öË Şg9g@x5źĄëşŽ—GerR69(T0Ď®Ş·÷·÷-qy+K3ucţx ·^¶™ţ"ŰŤŠÉ,.¤ €ą?ˇŞřňâ{MÄépĺcĹ€A–j•ż‰ő‹{Amë•v®UKč3Yp\Íor·Ęé:¶ŕŕóšë ¶Óő‰5Ó…ţť¨,o$Š_(}Tž˝kŚ­«ĎkvĎ×gËq‡ ŠĄ‡ą±hŻ@¶$_hx?ó oýןŐőÖ/Őŕuź FÎĹůSÇO×­jęŰáđÉ»™óôŢ+wÄŮAâŘÝ쯦˝6„Ĺ Řé˙×®{ۉí-­Ą“tűĽĄŔwžzž}kFŰÄúĹ˝ŞŰĹxÂ5W*¤¨ôŚĐ]~S>µy+BĐ3ČIŤş©î kxí[űFͶť¦Î<pz×6Ě]‹1,Ää“ԚևĚ´6_dKĆű>Í›Yľ\c#4{ÂÎɡř© ýťF~ą‘©ý«"@ű/šsźLÖ…—‰µ{Xí­nöCÂŻ–‡ú‘šUÖő U#[űŹ5c$¨Ř«‚~€PżohÎc¶#č:vĆsY¶’ęVŢ,ľÓ©G+ŤpwÝ=łM·ńF±oj¶ń^°ŤFŐĘ© zFk.™áş[Ąuť[psë@lÚ~±& ÚpżÓµŤä‘Kĺޓ׭qđÄóJ‘DĄärTI=«^óĹĹÝłÁ5ŮňÜa¢©aî@¬›i䶸Žx¤±°eaŘŠuí¤öW ÜM«ŐZˇ«:ŤýÎĄt×7’y“0śŔöZQ@Q@Oe˙Iř˙*‚§˛˙ʤü•AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE˙&O Íĺż’a}§něgőĹ2Š{Ĺ"F’óᯉ-4Éďdµ‰–/$I(i}vŹnq×Ú°ü7áÝOÄ—­m¤Űů®‹ľFf =I< ÖŹÄ÷ţń¶ł¨YůRÍ,ÓĹ"Î ++9Î@#ĐWIđĽÚřĽ\ŰĎp¸„Íł•ŁÉč}>ö}ł@w‰ü#«xm!—Q… ´ÇĎ ‡ŤŹ¦GCő«>đ.ąâ 5ďě!‰mClWšP‚Fô\őçŹJč5˝NĆO†’ŮčÚ.§׋"\ÝH®‹'p§ééďVu}3PÖţxMtKynŁ‚I–x BĚąÁ Ŕą˙j?‰<7©xnKXőh–)."óU@ô>†±«Ňľ4EqđĽ7­ľę=5VÎrăúćĽÖokţŐt-2Â˙Q‰ŢőAŚ«†## Řâ°k[W·×"Ó¬V[ńdÉţ‰ö‚Ű6ăř3ŔÇNŘ tÍTŐRGÓ4ë»µŚ€ćY“ëRjÖtëcq¨iWÖĐ’hÓ’+kŔę­ou»Ćř{ć_ݡ“÷Ľ~V?­]ńr¨Ń\ŹĎ­ťëţ†ć\7=~f#Šá)T`Ł©8¤§Áţľ?÷‡ó Đ|0ń7›,fÚÜ:”Ô8ĺőëץs:n‹{¨ki¤ÁŰćvŹËíĂ(9ÓˇŻJńĽ:|hŇÚ$”ćKs Ť€Ťß†wfŞŘ•?Űf1öą:zůmźÖącV\·}®9wđďÄVşl×’ZĆV/$K*´Š˝rT{sŽľŐŤáĎę^"Ľkm*ßÍt]ÎĹ‚ŞRMiĹâKíĆ:¶ˇiĺK4˛Í‚`YX3śä=lx%f“áĎŚŁ±Ý‘B}ăă»ôÝVĺ8ĆďËńťń/„őo$2jP'‘1ÄsDáŃŹ¦Gz˝iđű_»°ŠîŢ&€\D‚eŢč}ÔqůÖ¤I4n~ÖQµ56ÁűŤŁ;}ľ÷ë]VšHŐ<'‚ä]ýÔJ¬Ňű˙<·Ä~żđô–ë¨,EnĚŠH¤¬;ň=+^Óá×î¬cąKHÔČždpI2¬®ľˇIţx«~#)˙7€ŚŘ1ćëv}<ŐÍv>1»Ň­~#A$şNŻuŞ©‰íšŢ`ŔW3YŮ%ľżĘ´?ßëZśÖ‰]D¬Îł¸Źnsß'Ąw1řkq ÔRh‘[Çj¶ŞŇ‰.FLśî#'§JâüipnüWŞNöŻhňNĚĐ>7!î;ćş?Ś1ą×tÉ1FÓaĂc÷»ŐIÍĘ6v¸řĂ©ŻxSÄ~MšÜjqىÁMĚwsś$Ö/‰|#«xv'Ô"ŚŰLp“C t'Ó#˝oř.G‹áÇŤZ6*Ĺm×#б~DÓm]¤ř/z®K,z˛„ř~E<~góŁšJoµŇüľđn±ŻZ5Ý”1Ą˘¶Á4ňŐ›Đg­fë5ţŹ©ť?R·h.†0¤‚=#‚=ëŃnĺŃăřcáfŐlŻn­˘Ę$›Îwdu<ăń¬?zŹÚîôúmĺ„vöČnČ/$`ü§ŹĆT”ĄĺŻŕ;¨xzţĂÄI˘\¤býŢ8‡rřŰĎâ*)ôKřµćŃĽź3Pů>ZrŢ™éřסřÂÂćoŤ–.É,öł#ÁEٸçĐm5‘{yymń†ňëG¶7×Q^HVţ<~[¨ŤVŇô¸u/‡^ °˛žĺâ·™m×|© ęî€u$…qőę––:/‰§Ö[D]cCÖŁ†IçF›ź™őäúăéÚĽÂŇÚk˨­­cig•‚"(Éf<*éMĘę[zޱ¸řcko®¦¨× ŕśČŠĺ[ň¸ť_K˝ŃďžĎS·{{””~¸=˝z.—~–_ĹĆ ­Ň]ZĚBŽę9öÎáEVŐ¬\-­ÎSƶZ‡žÖŤî,YHĎÎÇ©4¶ľ×®lŇá-ŁS"ďHžUY}B“üëcâ]šé×>ł†K{U‰‰î±źČVߊ®´ŰoE$šn§q©[´€Ż€0c§\ţ5 r˛·ůUÝĎ4˛Ň//>Ü"ڞ‰¦™íeU8<ăŇ® jeôĄ&u0ZŰç0}8"şM ŕŢüDŐˇ{w¶mF+꤮H>ůZęŕ*%g8ŰáÖ`?Ů_˛˙ˇ)§*­?ëúÜ8ź YŘ[č^"˝ÔôřŻĄ°h•QśË<ŹóĹ.«c¤ęŢź\ŇěMžÖuŠX„…ŃÁÇ#=ů*Ţ /ř˘ęKxn‚yĹ:îGËČüsSřňöKĎh×:\pŰhóń5Ľ$ă<v돦})]óü˙@Ó”ćt? ęşŐ«\ÚE[ŮćÍ EfôëYÚľ—y¤_=¦Ł C:ŚŕňěA]ÝÔšZ|=đăjV—wŔĘ?Ѥ÷˝‘×®?ÇńŐđş¸ŃŚš}ŐśpŰ*/ÚH/$`đť\g'/!8¤ađż-¬-´cÎÁXÚU˙śţ’š%ăëͤ˝ŃÎäO=;W˘ëşV«sńFĂPµŠW±- ĄÂŚĆ±€7 Ý9ů¸÷®Çźjŕ ź´?óĄ ą=ú˘‘©ă+Ý;AŇ-ŻtŰ qe[›w Ň‘×v?ÎkAŃ/µŰ¦·Ó˘Ȼݙ‚ŞRMtň·ü+ Ť§>eÇoúhjż‚oć±¶Ő„šd·ú\Ń*^ÉSó‘řÓM¨;o˙W(ëľÔôKhînăŤíť¶‰ˇ:çĐăĄt^đ,·ş=íÍäpłKj$ł"|mr27xíÖ«kzfź/„« ÜjŮ-ŔŽK;¦ůwcď.8=˝Jg€UźGńR ,çO8džµ.Rp˝Ć’LÁ×´+Ý XR˙ĘÝ(,ľ\ú}+f?‡Úűą_"8Ęî™Fţ3…ő®L‚:‚>µÜ|L»šŰĆsÄç}˝Ľ/{Ďó«nWI2R[śŢť j†«>› !oa Z))ůzęj-H»ÖoŤĄ’)”#;omˇTu$ž•z?ܟǯJ‘¤ţj»¤@… ¤ “ÔgżzíüEi†´˝T´u'YeŠĐ©éŤÎG·'ňĄ9-;ŤE=NŔú*xĹš~—+ŠiË×j©cŹŔÔř‰ây5K×ŇlŁŠ×C°”ĄµĽhĘĺw“Üž?Ćźđre‡â6’\ŕ7€űŘÖąťzÚK=nţŢe+$Sş0#Ö¤ŹĂ]wíSĂáMf8ît[ćh‘YFčdnŚ­×9ţuÇëúsiĺţží¸ŰNńnţđţ"´ţÚIyăť8A,·qĘp3…F @iżgKŹë’Dr†îE×Ň€9ú(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ žËţ>“ńţUOe˙Iř˙*‚Š( Š( Š( ®i•ŢŹ¨Ă§KäÝÂIŤö†ĆA‚čMS˘€$ąšK›‰g™·K+vĆ2IÉ'Őő­:ĘÇR»3[YŚDĄTcŚH'sXÔPEPN…• č&›EzWŚ>#ę+â+ćđΨßŮł*m&ÁŘ˝r9Áiú­îźŞ¦ĄipË|Ś\LŔ9Üs’wSÖ©QQ Q‚˛@>âg¸žI¦mŇHĹŘă$äŐí [ÔtĂu¤Ý=´Äm%@!‡ˇ ţ5ťESI«06|Eâ}cÄMö˝ëN±ň"Żľ>ô±řŁXŽ[Ióilm!>R|±‚˝9ăąć±hĄÉZŔ]»Őo/4뉷ÚŮoéµFÍç-Č9#ľkrÇÇţ&˛°[857˘ěBŃŁ2@Äfąj(p‹Ń #Ľ˛4’3;±,ĚÇ$“Ôščí|uâKm,iĐęoö1#DŚBcÉRz{×5E7Ëtë=^úĎM˝Óí§Ůi{·ĎŹbťűNG$dséŠV˝MM%'Ćź$Âv‹bňř9ĆzĆqThŁ•v{ĂŢ.Öü? ĂĄŢŕs¸ÄČ®ąőÇáYÚĆ«{¬ß˝ć§p÷..Ř€Ŕ©QIF)Ý-@ęlüâk=5l`Ő@‹± EgUô FkźłľşłżŽöÖy#»F޲ónőÍV˘…­VĄńÄşŤŚ–—:‰ňe]˛l‰¸ô$kťÓď.4ëč/,Ą1\ŔáăqÎŇ:uŞôSŚc…X Zż×ő'ľŐgó®XÝ´(t*+ťNîęĆÎÎy·[Ůîňh7ž@ÉäwŞtS°:Ö·¨krĹ&©pgx—bЏ€­+?x‚ŇÉm`ÔD‹µ "ł(ô Fkś˘§’-ZĂ»-XęV:Š_[LËvŚ\H@c“Ôśç={Őµń¨ŁRěăQ˙ŹŻ‘y×ŰŽ§¦+*Šn)Šěąk©ÝÚé÷vPM˛Öďoś›Aß´ärFGáN‹Wľ‹H—KI˙Đ%q#DQOĚ1Č$dt Q˘‹ ąłˇřźWŃ"h´ëł,wŮU×>¸ ăđŞ:¦ŁwŞŢ=ޡ;O;pY˝=ôŞ”QĘ“˝‡w±ŢřrűK´¶ÓĄżń]ţČ&m=a¨e9 žČúW=sâ+¤ńMŢłĄą¶šY]•V*­Ř‚éXtTŞi6ÇĚΫţ‰˙č'˙’ńń5‘¤kÚ–‘y-ÖźtĐÍ/úÂ!ůĎ ŚVeÔ"´°ą™ł®x›V×"Hµ+ł$(w,jŠŠ®üjž‘Şßh÷iÓn ±´˛€r=<ĄE>T•¬{šZ湨ë“G.©qçÉíS±W9ţ*WS»Ő®…ơ7ť0@›¶…ŕtU:(QKa]€ëé]OŽ5{[ŐŇôý.všÂÂŮcW*Ë˝ńóaú×-E7iŽúX’Öâ[[®-ÜÇ4Nz«k¨ń‡Šm> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙ŔtÖ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ůúŠ(ŞQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEQSŘZË}}oinšy$ŕncúš‚ŠîáŐ”4v` NĆĺqí»Ółuö‡„mVňŐ0ąĎđBŚ”›čŔôOè7ĆŤ-˘INd·08ŘÝřgvkř’TřďZŮŚ} ôőŔĎë]7Ś>#ę+â+ćđΨßŮł*m&ÁŘ˝r9ćňČóJňĘěň;fc’Äő&łˇ $ś»ˇ©hzž™giwe,×kşpăţG˝t^žK_xšâ¶XĄ´‘ˇäV&łâm_YÓ¬¬u+ł5µší…J¨Çä’qĆMQ·Ô®í´ë»eŰktTĚ›AÝ´ĺyĆG>•´ă̬4ězgŤă…ü u¨ZŕC©]Cvţd‡ć§ó¬ű©4´ř{áĆÔ­.î-”ŁH+î?{#Ż\~5ÄÉ®j2h±é/rNźoXŠ/$őĆz“ެh~'ŐôHš-:ěÇ Ć6UuĎ®8ü+%IĄo2ůŐÍĎjÇűWĂ×&ÂęÉlâŚĆnH/"+¦»mVÄ}¦÷DLÄÔ]ÝŕwlĆT˙ă­^?Şj7z­ăÝę´ó·›ÓĐŔJľŢ)Ö[SµÔô›»Xü¨¤ňÓĺ\Śc©ę(tť•şš6µČ/u݉ńčň»ŠB";öcËP8>ż-kh׳x˝o´ßiń™­íŮÖřEĺÉ(ţ#ý8éÓÓĎ’ţé5|“ş]ů†_5NârOł©xÓ_Ô¬šŇęýŚ0á#T.= n›Ń!)#oŔ&ŘxGÄ˙h†i—™c¶ČÉ“Đúu϶j WPµ˝®™Ą_Ĺ`n„‹qpá”>0@8ôţµËčúµöŤuöŤ6ĺŕ”Ť¤ŚGˇV5ßjšď–5;Ł*GĘ PŞ®ÓöošáÍĄŤÝYŘ|-ĐĐ1×r’=H-ŹćkU×.ő;-6ÚäFÂ3N †#ŹĽsۦ*ĽÚťÜÚ]ľť$۬ŕrńÇ´|¤ő9ĆO_Z§UŰr[=zÖÖcRĐüY6>Ď ›Ëv{ bă?\ś˙Ŕkř{zoţ$EyuŹ6všAžĚUŽášćíµíNŰG›J‚é’ÂbKŵNsŚóŚŽˇŞóËmŇçXv‰«ItĐIĐ’UePz–ă×úŐ ÝËaŕ^îÜ4¶ň&zd0<űV>Ąă-wR±k;»âĐ8Ă…ŤT¸÷ Ypęwpé—|smłť•äŹh;čsŚŹŔĐ©»käÇku«ÜëžńýŕŤe{¨l`…P€$˙“TĽEÍđóÂŇĥ㍧ŤČĂŕ~†ąxµ;¸´ąôčćĹśî$’=ŁćaĐçýjö‡âŤ_C…áÓo pąÜceW\ú€AÁúSömmßôd÷6~##Amá«yF٢Óc‡ŞźČ×eáńu†,¬î% Ĺľą{ËÉîe?<®\ţ&şâUŕ¨ăéq©É˝˝|Ąéúăó®j(ÚY8Ágr@îM0:]ţ%~Ô5Ä÷gěžřţ"?Ďjć+Ąń¤‹löZD$ěbńŢFäźĺůšć¨®¦Ú=;Hđý•íĺŠß\Ţłá]ĘŞ*ś‡ç\µtÚÜo/ü?$jYÎF#±-Ŕý gx‰4ß´C6’ŘŠhĂĽ9'Ęnë“WÁú»6<ĆWtŞ7qž+/SÓ.4Ńoö ŞÓĆ%Uݎ­Ď\KíĄFůá†&Ob9ţt΋;“{ö1 ›ťű<Ľs»Ň´ďü3©ŮZ˝Ä°Ł$ër)ő´Ľ+~Ú—Ž"»ąXÖYC gag>•6źyio6¤,´ÍEçh]' `ę[Šć´­2ďTśĹeöQą‰ ¤š›WĐďt¤ŽK¤S ś,‘°e'Ó"´<;iŃu+ëąîŢŤŕ¶m¦L˙{ŰźçWŻŤłř Í”AöŔTLۉ8äŽ:őč= ²]i×SÜ$l^Ü=±†<Śú~5«iW:SĆ—~^\68oĺZŢRÚvľŞ cfp^őÎÄ•<ÁňîĎĄlÁá]Zkd•`P]w$m ĂÔXŽŚŽČęUÔŕ‚0AôŻ@ńöPx¶7{+éŻAŤˇ1H¶Ć:őëŤ×ĺ3ëW’´-<„ŰŞžŕĐ ÜŇ,íćđć·q,a¦€Eĺ±ęąb a×Wá;§˛đî˝qĆΞIEܧć#‘@"ł€ř2kĂűHĽ‰;íÚ+S²izŚég>Źô„łKć6\¨ëŹz/őu?K4ńÂŚ·ˇ‰6Śm§ăTü˙!×˙Ży?•PľÔl®&¶{}*+t‰÷H‹!"Q‘Áôč:ß¶źH›@ĽÔN‡h$TŮć·9Ç9®.şM;ţD][ţľ#ţb€ĂŃŮjţ-…É"´7î÷ëÔfŻi)¤k÷riăKs•cŃJÍ‚=A¬˙ČŐgôýÓ¤ń;@ł.ť§ŮŮĘŕŁMťřö=¨ťaµ=AĹ%R«˙„yďü=¤Mak4žižV}ŁďarOô®SÓît˶¶˝ŹË” őČ#ÔÚÖ݇|>€ť¤ĚH÷ Çó5'Š®—ĂŞ[÷’ŮĆ»›ÔúţtŔ©oá=Z{u•aE.»’7+°úVm†›s{¨‹S$°Řçn*ëÚ; _ÚÚĘ5KÍB9#{Ę1žLghĎó¨ô±Ź‰ŇăţzË˙ ÂąđĆ©mb÷RŔ»#uWz‘TôŤ&ďVť˘˛Ś1Qąś*Źs[~•äÔµŤě[Ěł™ź=ÎGřšo‡Ă·„Ľ@¶ŕ™u˝väçôÍÚÓĽ+4·(»aREmŔˇQĐŽ1śÔÚSišž›©(Ňb†kk7•e1%€ëŹÖ˘ *ü;o40Sz yţîŢߎiž Rđk€łµ„€(ęhš­Č<+«Ml’¬ ®äŤ¤Řz€k0TópÎ}+ľńöPx¶7{+éŻAŤˇ1H¶Ć:ő臲±¸ĽżK8S ĹB·Ë‚:ůVśŢŐa´’áŕ\F7:Ôz‘Wô‰L˙ŇV… gťÉŤş©Úr fG«\éšőíÔ;Gy„€Ŕžs‚(Š(¤Oá]çyîŻě'–Ţ;v–$ÁQ3vŐ®Óo˙fŇţ÷·ď:zúZÓđŤőٲÖTÝNV1Ź0áéřW;%ĺĹÔЛۉ§Uoůjĺ°3ĎZ`jAá=^ke™-Ôo]ĘŚŕ;ĄeŮX\^_Ą”)‹†b»Xăuň®ł^Žíľ"[´aČ2Bc#¦Ě ţz˘´*~&6ĚcíÓ×iĎë@SxWU†ŇK‡qÜčQęEaÖÄzµÎ™Ż^ÝC±äw‘H ç8"±éWX›¦řoIąźKŠî[ź3{4ڧĺlvú×']śş„6ĐĚÖ÷›üěyĂ;pý©™âŤ>Î];PÓŁx`ĽF&lě# íÍ*x?WfÇ“8Ęî•Fî3ĹgëZ˝Ć­,M2ÇQ.Ȣ‰p¨=…lxââX|Gm*7Ď 12{Ďó xY\›ď±\ÝoŮĺăťŢ•§á}RĆŐî&… qó&Ç SęhřRýµ/Ewr±¤˛†8Ať„qźaG„ĺ5 dÝ -e–é»ßß­cézî§ngµXüˇ'–YÜ.ďő·ţÔ,,Úćć$TGŘŕ8,§¶@ő­-0ăÁÍŹú 'ţ‚+OXćŰĆ9˙ž¶˙úsZ^©ŔÓŰĆ‹;|É('Đg­WąŇîíu±¸‹Ë¸f “€sÓőÓÜ=‚ř;E7¶÷B ÷.+nď‘őýk/Ĺ×Fĺ´đlç¶Ű„O<ĺť{Ń—ÁÓ˙aŔQ"űšw±m)Ž;âłü5ĄŁx˛-?QŤ$QĽ:†Č$!#‘R]+7€lŠ‚BŢ6p:pj?Č×gôýĐ7žÔíí%şxËŹćuWz‘Ú¨iZeŢ©9ŠĘ-ěŁs@ =I5»ŕé^MKXŢĹĽË9™óÜ䉩<$a˙„w]óŁ–UÄeŇ&Ă•Éč:ĂŐ´[Ý)c{¨×Ę“îHŚOâ* › íě­nĺP!ąÝĺrNÓĹnßŢ[·…ZŢĆÂî;CpM3†PŘäŹJMf6“Áş‘©dC21‰nčhúÂ{(ížá@[ıŕç*kRßÂz¬đG*Ç™r#Ę0úTţ3FŠŮRĹ)ę?Î+Jií5=NŇ fĘţÇV!#Yan˙ÂŘ=9ô .x¤‚gŠd)"1VSÔL«şÝłŮę×VňĘfxä ČO-îj• 54˝ ÷S·3Ú¬~P“Ë,î Ś÷úŠ[˙ęmss*#ěpSŰ zÖ–qŕćÇý“˙A§¬smă˙Ď[ý Ö— _ęp4öń˘Ŕß2G ôëUît»»]Eln"ňî‚€Ä`äŕôÇ˝t÷`ľŃMí˝ÄĐ ýË… Ű»ä}ZËńuŃąm<9í„váĎ9g^Ć€4eđt˙ŘpHľßćťěfJcŽř®q4«§ŐżłUPÝnŰ€ĂĆzֽҳxȨ$-ăg§«x+ţF›÷›˙A4Má]VI.Äcs p]G©WCŇîuËZ¤/ä•fY\(<ôçŻJš=ZçLׯnˇŘň;ČŚ$†óśXŕĐ@,YWZ”Oi¤W1BA^ťx¦é>Ô5H{hŃ`o™#…úZ˝ńřI§88Řźú§ëk#x7@0‚`Přé»w˙Ǩ SÓîtËŁo{ŽP3ŚäęzÔ·đž«<ʱĦEÜň€Ě>•[\MMĹuRIňG’2¶qĎç]ÓÚjzť¤Í•ýެBF˛ÂÝ˙…°zsé@\ńIĎČRDb¬§¨"™Wu»głŐ®­ĺ”ĚńČAž[ÜÔwVV°A5ĚS ŃłRµQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ţ˙ÇÓţĘ ©ďăé˙ĺPPEPEPJ¸Ü7gnyĹ%«â-Uu[ČŢ(Ě6đıE9ÚCˇ^C§ę°]ÜDÓ$GpE8Éíůj…5íËŢ^Mq)Ě’ąsřš†Š(­=+]Ôt¨Ú;’‘±ÉBˇ†}yVebţöâţĺ®/%ifn¬ßçŠ]BúăPśMy'™ PąÚ§J­E>^RX]’D9VS‚ j_x“Vľµkk›˛Ń7 *–ú+"Š˝Ąj׺S»XÎcŢ0ę@`ßPjKýwRż·h.îLł*U@ČŕcŹ ¬Ú(Öť¨]i·}”Í ¸ĆFGˇOŐu[ÍVT’ţo5Ńv©Ú«řT¨  ›oëö«oăÔm\Ş’ŁĐ3XěĹŘłĚNI=I¤˘€ łőĹ˝ĄÍ¬Rm‚ăoš»AÝ‘ĎQřUj(Čľ¸{X‰?ŃZO4¦Ń÷±ŚçŻJ,/®4ůĚÖ’yr+ť đzőŞÔPVcľ¸ŽĆ[4“ҰgMŁ’:sÖ«Q@4űŰŤ>í.läňçLím ă#Çz®I$“ÔŃEQEYžúâ{;{YdÝľď)v·''ž§ń˘îúćí-ÖâMÂÝqpŐZŠŰ>*ÖLhźmo—m‹¸ăÔă&¨ĹŞŢĹŞF9±xIc&ŐęFÇJĄEY˛żą˛’Y-dŘňˇŤÎĐr§¨ćźĄęwz\ćkŚNF‚=Áâ©Ń@Z†»©j<7—&H™Ă•*Ł01ÇŇŞŘ^Üé÷"{9š)@Ćĺôô÷ŞôP†«­j˛Ćş…Çš#$ŻČ«ŚőčĄY¶ń>±oj¶ń^0ŤFŐĘ©*=#5ŤEX´Ľ¸´ĽK¸$+p¤°rž§ź­C#´’3ąË±,O©4Ú(˘Š(ÍťőĹšN¶ŇlYă1H6ąOQĎJ­Eł‰ő-´W®"Q´eT=#5ťiyqix—Vň¸RX9ŽO^żZŻE:Gi$gs—bXźRi´Q@Yžúâ{;{YdÝľď)v·''ž§ńŞÔPVu ëŤBq5äždBçhť*µře’ RX]’D;•”ŕZ—ţ$ŐŻíM˝Íă4'ď(U]ßR5‘EYŠţć+3h’bÜČ&Ű´}ńŔ9ĆjYµkŮ–ńdźpĽ*Óü‹ó•9¸ü*ŤĄĄëşŽ—GerR69(T0Ď®Ş·÷·÷-qy+K3ucţxŞôPŽ—®j:\l–M1É]ˇ†}pA¨âŐobŐŁŘĽ$±“jő#ŚcżĄR˘€,Ů_ÜŮI,–˛lyPĆçh9SÔsK¦ęZmÇťc3C&0HÁ{ÁŞ´P†«¬ßę»ôćEOşˇBř ~•®ę:TmŤÉŽ69(T0ĎŻ#ŠĚ˘€'ľ»¸ľą{‹ąZY›«5jĂâ˝j$˝;Tm‘Y€ú‘šĂ˘€,Ź4Ż$¬^G%™‰É$÷¦ŃEYŠţć+3h’bÜČ&Ű´}ńŔ9ĆjYµkŮ–ńdźpĽ*Óü‹ó•9¸ü*ŤĄĄëşŽ—GerR69(T0Ď®Ş·÷·÷-qy+K3ucţxŞôPŽ—®j:\l–M1É]ˇ†}pA¨“S»MOűAfĹćâţfŃÔűcĄS˘€#´’3ąË±,O©5JÖµ %d]>ăĘ[äVÎ:uł¨  ›ßę÷¶˛[ÜÝď†A†_)GÔ ‡J×µ-*6ŽĘä¤lrP¨aź^G™EXż˝¸Ô.ZâňV–Vŕ±ţCҵ!ń^µ ^ťŞ6‚ȬŔ}HÍaŃ@–GšW’V/#’ĚÄä’{ŐËíVöúÚŢŢęs$6ă®ÇnÝŁEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@Tö˛ß_[Ú[€fžE‰8ŕ~¦€ ˘»†ř_â5e C±ą\F{nôĎúŹZäőŤ6ëGÔî4űřü»c¨9ôĆ S˘Šéü?§ÚÜř?Ä—sÂŻql ň\ç)ą8Ą'Ę®4®sWOźjßnu ›ĹÔ"^r`8üÍUĐĽ)ŞëVÍsiilh–i+Až´ąÖ­‡+0¨«úľ‘{ŁęËP„Ĺ? ‚„ÔV˙ü+Ďy’!·„:ýŐ3(2pËëÖ‡8­[VÎFеo§ÝÜjKa ׌ć?+;‡P}+ąĐ|seq¨¶ąk °%ڬڒ (ÚFpr3D¦Ł¸(¶yĺ×xëJžňËKżŃ ş’y¶–•źAéX>"‚;ojp@!ŠęTEC ZÚÁm.gŃ[ş…u]jŐ®m"Ť-lóf"łz ő¬í_KĽŇ/žÓQ…ˇťFpyv ަ¤›µÂĎr˘+;@Yŕ2IĄ’7ŠFŽUd‘ VV Ž Šô}XüđúŰEšÖ©3Cm,Š[Ƥ‚@=É_Ô~<Ď…´çń&ż3ŢĘpw\\ĘHÉ<đ $Niç(Żl·´Ž×ű.ôm!mçcö$‘;ËapÄĺŹ$gĐW-âż`[ËX#†A?Ůç·ŠPęçk/$¨8?)čiŘ<˘¶nm¦¶¸h'Ť’e8*G4«§}O·ż€ ’h÷ĆÜeKči=Ů‹EwzĆ•¦Ăaâ׆ŐK;R ýŘ,ź­p•1—0Ł.aâ) FQÁ}§úf™]ŹŠâQámD_–iGŰnG}ÍÂô€ŞţÖ.-#¸†ťe„O‰Ws©ô”ծĦ­vs´V–·˘ŢhĎŢ,x™7Ćń¸uaß‘ZVŢ Öî-t¶E2.ô‰ĺU‘—Ô)4ůăkÜ|ńJ÷9ş+GIŃď5Ké,íŐxÔł,¬ Ď|ž•ŐřźŔÓÇů•íqó+Úć-Řř#DÔL±jvö7Đşş,W(öÎŇą+ś›™rЇyůW˘óĐ{RR»°)&ÚDtWMkŕŤrâŃ'Kx×Ě]éĘŞě=ţµ •Ě×ëe.n™ü±0wgö¦¤žĚ“ٕ讒÷ÁZÍĄ¬ÓĽPȰ®éV)U™|ŠOYZ_jwqß²ƖrH “Ă `˙:\ę×BçVş9Ę+Łń •Ąż†|;qo ¤÷ 1™Á9r¬Ďë\ĺ4î®RwW (˘ÂŠĐĐt‹˝wT‹OÓŐZćPĹC6ŃŔ$óô·đ˙Ä:Lş„ö±ůP®écYU¤Ťqś˛Žś~5.q‹ł`r”Vχ|5©ř]dÂł5¸Rę\)ů‰úUźř7XđýśWwđĆÖ˛˘Xdˇ˝:wŁž7ĺľ s´WIáĎë^ ´k»#[PŰłHY˝zŐ˙jZ~»‘{oäŢĘę¬Ă ¸áH=1žôsĆöľ dŃ]›|6ń ˛†ŽĐ0ÄěnžŰ˝3Űę=iţđę˙ÂƇE×­VO/ĚYacHŚr?RęÂͧ{ÄŃ]n©ŕvËN¸ÔÖ?łĂ—’4”4‘/\˛öăń©ľx>_ßŰÜΑIĄ¤ć)ÔͱĎËž^㥬\®Euţ/đEţ‡öŰҶ매ĺc 8g [ ‘צ+kÂ?ĺżĐďîď˘Ţk1-ÚädńÔu¤ëAGšŕyµłâ/ ßř~{xµ#|ŕ”ňĄ88ç:Öđřaâo6X͵¸t(3¨2pËëׯJ§V ]°8Š*Kd¶¸’ ŃŁš6(čĂH8 Ôu`WOáý>ÖçÁţ$»ž{‹a’ç9MĚAĹiö­đćçP0©Ľ]@B%ç!6ŹĚÔsˇňśĹ»ˇxSUÖ­šćŇ(ŇŘ6Ń,ŇV>=jŽŻ¤^čú˛Ô!1OÁ †ˇu\É»\,÷(Q]wü+Ďy’!·„:ýŐ3(2pËëÖą»}>îăR[`vĽg1ůXÁÜ:éIN/f 4U˘˝Ađ=͕ƢÚĺ¬2Ŕ–2˛2H$ŁiÁČ8ÍexëJžňËKżŃ ş’y¶–•źAéSí­kaňľ§#EhxŠíĽA©Á†+©QtU@wC𮫭ZµÍ¤QĄ°mžlŇVoAžµ|É+±YŢĆsWŇď4‹ç´ÔahgQśA#‚+ˇŹáöľîWČN2»¦QżŚá}i9ĹjŘYł’˘şŹé1Ďă{m7W¶Ü Č˛Âür¨Çś{ŠšăÄ:2Ćľ´eC}ˇ¸÷éIĎ[%p¶—g#EihZ%ţ»tÖúlc¨Ü䪣ԓSëţÔô‰ďáQ Ľ$±¸t'Ó#˝W2˝Ż¨YÚć5Đi>ŐőK/-"‹ě˛–G”(\ç§5C^Ńo´+Ńm©CĺČWrr¬=A)&ípłÜĎEg`¨ 3I4˛FńHŃʬ’!*ĘĂÔ^Ź Ë>CâhŁ“ZŐ&hmĄ‘C xÔHą+úŹÇή®%şąšâáËÍ3™Źń19'ó¦":(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( µĽ˙#n‰˙_ĐčŬš–Îć[;¸.­źdđşÉ`¬AÁ㨠]ń;0Ňüu‚ä3q\—Ćoů):żý±˙Ń)XW^%Ő®˘ľŽ{˝é}2Ü\-ůˇŕqôSZŐo5­JmCS›Ď»›äÚ«śŁ…t€%Ô´=OLł´»ż˛– kµÝ Ž8qŚ˙#ŢşŻ_I¦řKĹp¤O$_g!e]ĘrĚ9ŤsšĎ‰µ}gN˛±Ô®ĚÖÖk¶*Łc’IÇ5J×S»µ°»˛‚m–×{|äÚý§#’2? ™Ç™Xqvw;mSWźZřeqqsĽNşŠĆě\l§Ż5¶zv™á]őą5KŐ» ,6đJ~™ţ#»ů× şťÚé/¦,رy|óŃËăÎ3ĐtÍii~.Öô»gezRÝNQYö} źłiYw+™u7ţ&óĽ6V9cÉ0˛śşŚđúŐźĎ(ř˝g‡a˛{d_`vä~§ó®'UÖµ ZHQąiŢŮ2€@ÎyŔçęhĽÖoď5…Ő.gß|¬Ž%ŘŁq´ŕ qÚ…M¤ŻćGyˇě_Ś÷@ŕ,Ű~»˙^©|=Šů5›•bĆa>á˙-3Ć}ţőq˛j—˛j§R7 /Śžoš )ÝëDZsăź\†ę«FŃ2^1×އN[.Č‘[ŔÄé8˙IOçQxş)#ńN±ć#.nĺnF8.H5•ʉ$LÉ"ĘĘpA­ë˙kÚ†ź%•ĺů–Ú@ÔÄ€z…ĎoZ¶ź5Ń7V±ÓÝIĄ§Ăß6Ąiwql Łý@_qűŮzăń¬OŢ›ĆŇAÓî¬Ö+Qi Ľ>é¬ÍÄúľ‰E§]ác¸ĆĘ®ąőÁ…QŐ5˝Vńîő ÚyŰ‚ÍéčŕĄLiµ+”ĺtvţ$Fąř=áKÁ)mq<2cťĄťĎĺúÖ/€%µ:…ÝŤűྀÁĽ0]§!‡'§#Ť;ÁŢ.m ÚëNż˛‹RŃ®Č3ZHqóqó)ěxé\íě›ű‰,Qˇ¶iÄŚrU3Ŕ'ľ+bWşŇl%˝đúMkŞÇ(fPYĎ-É;řô;˛:ŠÍńsYŮi×ĆąŽďVą´S‘•Ef!€* n3Î+Ź´ń~żimö{}Ru‹á¶ŹbFGáYSß\ÜLŇĎ3Ë+łąÉ'Üšëí|D‚ŮňŐn5q¶Ţvô˙k×çÖą}RćYîDňČÍ3ĹÉç5Wí˙{ô1c–94€{\LÂ@ŇČD„ËűúÖż4Á«xŽŇÝĆ`VóeĎM‹ÉĎ×§ăX•Đx{\´Ň4íB1k;Ţ]Ĺä™VPˇTžqňśqŹ^ťŞe{hLŻm ž*ÔαŻŢ^g1»â?d/č+şł$j>Á?ňýמyšwüúÝ˙ŕJ˙ńşÔO”’ÚEaíŕ6Ń:?–21·ýW=zžje ¤‘2…ŇHą®˙„CÂOą›ťŮôóşoÜéöţ8ŤßNÔ®5ch@WŔ 1Ó®á.uH.l­-&Ší­íwy)ç Ű¸ĺąääúÖ­§ŤomlÖÖoDH»WtŃł(ô bÍ'MţdşoóüLoĚn|A3[µł<ĚÍőSÜ|ÖßĤoíkÚv›°qÁë\űĎ`îÎö÷ŚĚrIşRI˙żu·oă¸4˙°Ç-ďŮvö4Ń7ËŚc&,ô÷Şqz[ˇN-ZÝ Ľí‡ĐĆ#hç :vĆěć˛,fŐí׫E3"\çpůxéž•j×Ć×¶¶Kk ×Â%]«™ŁfQčŚƷÔ-íďîďŇĺ[x”].ěúçËĄ´¬Ĺ´¬Î˛ŢÓKפŐK]KIŐ'–TgĚmýĺ'Ż_\W˛DI‰Ů %N2=+«żńµĺőŁŰ\Ixbmp’ÄĄ‡ˇ",×+1ŚČL(éev GâţTá·"Öâ4˛:";ł"gj“ąëŹJ˝ˇčşŽ»töÚM«ÜÎdeR3Ďąź]—‚ĽGiáĎř…‘Ük‘-˝° ÂŻ;›wnąüYˇÇ:”vVűĘpyÍ%PkđoţJ›ţěżú-«gáÔWŃxŁĹ-z˛*-ťŔş.8ݸ}úźÎąŹ†š­ž‹ă++íJo&Ö1 gÚ[F€ ęEźŽ5űí:]6]IŢŲ¤lPĚťldŚ{ýkš¤%)4¶i~ k|<‘â🍚6*ßbA‘čwü뙵ń忆Ż45XZĘęU™‹]X÷Np3´gŠ­§ę÷Ú}ťí­śţ\¨#ťv)ŢŁ8##©éŠŁZ¨jŰę řŞ9ĺřaŕóh¬ÖŠg„B˙.}ţýiř¤JşďĂ´ĽČ˝X-ĽĐßx|ë×őýkŠđ÷‹őĎ@điWí wŮ×> 08ü*Ťć·©^k ŞÝ]Ľ·čë"ĘŕĄNFLLbłTĄ-=Ĭł|oÉ˙Ä=ýëB/ů8yÜ˙ŰQ^YsâRę;čçşÜ—ł-ĹŔňÔoqĐđ8ú ”xŁX":čĽ˙‰©3ůIýÝźw~ď*}„¬×“ý?ČGUđĘâYĽAâa+–i×/ ?ÄwOć:ÂřdqăÝ?óßúÇҵ‹ý*ââ{ ü©n"hdmŠŰ‘±‘Č8č:UKi嶸Ž{y9Ł`čępTŽ„VľÍűŢc4ĽY‘řźW#)űdżxcřÍtß ‘¤ĐĽd‘©gm4á@É=k[ńžż­é˙bŐ5qm¸6ĂkČčrÖł´MgPĐď~ץ]=´űv–PGˇ ţ48ĘPĺ{N%+<{0ę=ëŐüo ß4¶‰%9’ÜÂ@ă`#wáťŮŻ;ÖüE©ë÷–óë7_hxFŐo-S ś˙ŮřĂâ>˘ľ"ľo ęŤý›2¦Ňa€1×#‘Q57%eŃţ€s?Jźë[1Ź´ž¸ýk7RĐő=2ÎŇîţĘX-®×t28áĆ3üŹzĎ–GšW–Wg‘Řł3–'©5ݬř›WÖtë+JěÍmf»aRŞ1Ć9 dśq“[ĹrĹ :?_I¦řKĹp¤O$_g!e]ĘrĚ9ŤMŞjóë_ ®..b·‰×QXŔ‚=‹Ť€ôő減]NîÖÂîĘ ¶[]íó“h;öśŽHČü(]Nít—ÓlXĽľyŹhĺńŚçč:fłtîďć_6–:ůlôí3Âş3ërj—«vXmŕ”,0ý3üGwó§|L çxl¬rĆ ’ae9uŕ1ő¬ /ĹÚŢ—b,ěŻJ[©Ę+"ľĎˇ â¨ęşÖˇ«Ię7-;Ŕ»#fPĎ8ýM% s]’µŽŰĹłĘ>/YáŘlžŮŘą©üęmbügş™fŰőŘúőÁŢk7÷šÂę—3ďľVGěQ‚¸Úp8ŔíL“T˝“U:‘¸a|dó|ŐNď^8ŁŮ;[ĘÁÍ­ÎËáěWɨx”ܬ3 ÷ůiž3ď÷«śđ1ĹúFN?ŇSůŐ›źřŠä0—P%Z6‰”D€zńŽľőÎE#Ĺ"I2H„2˛śGB*”^·ę&Ö–5|]‘ř§Xó—7r·#$ě.¤ŇÓáď‡R´»¸¶QţŤ @ݏý쎽qř×1ă-{PÓ䲼ż2ŰHşĎPąíëPh~'ŐôHš-:ěÇ Ć6UuĎ®8ü)8IĄä4ŇfźŹďMăi é÷Vk¨Ž?´^DtŐ߉—s[xÂÎxśď··…ăĎb9ţuČꚍޫx÷z„í<íÁfôôpŇ—UÔîőkˇq¨MçL&íˇxÔ-o!9nuŢÔćÖ~'ÚßܤI4ŢaeŚĽBĂŚ“éTu/O2Ý[#EUpńď[L0# ç­sÚVŁuĄ_Çya/•svľĐŘČ đA Ş®ĹÝ™ŽXś“Gł\×m×Â+,žńZY‚nH‡!~ńMÇ?¦ę#YSá,˙i ¨Ú‚7wFqí÷żZĺô}^˙FşűF™rđJFŇ@čAŕÔúďuMuŁ:ĄŰL±ýÄÚGŕ÷¤ŕůĽŻqó+Úł°ř[ˇ b®ĺ$z[ĚÖ­­Ýj–:u­ŇŲÂ3L î*q÷ŽyĆĄW›S»›K·Ó¤›uś^8öŹ”ž§8ÉëëTęŁnKw= Ä×?Ľ)q%-®'†Ls´ł±üżZóÚęĽâćĐ­®´ëű(µ-ě5¤‡72žÇů•Î_Ľ_\=śm«HĆ(ŘäŞgĺúбQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQEĄ*±+t¤©ć˙Ź[řó (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šž÷ţ>źđţUO{˙Oř*‚€ (˘€ (˘€ žořő·˙:‚§›ţ=m˙ŕ_΀ ˘Š(˘Š(˘Š(®î?…~'w+äZ©Ú7NŁĚă8__ĺ\%zWĆű‹?i×0ąó-m`’,ôß΀81¤_¶±ý”-%:Ź™äů|Ű˝?úý;×A­|;ń‘¦Ë{qo Â38‚ev´ôÍo|7Ö_^ř»§¨¤ÜÜ$„,jB†cŚ“ŘőĄ˘jš]•öĽşO‡uÉo^ŢXďDł+ŞÔ°ú˙Z`y×…ü3©řžńíôUĚkşGv =Í^׼ ­čZd—ú„0­ŞJ"’†ŢHČ+Ž˘ş/†đOŕOŘi€¶Ł,p•Eű΀śëĆGăV/´íGLř đę±KŤ©+ÇŞU‘Aädî?ŤyuˇˇčşŽ»töÚM«ÜÎdeR3ĎąAÔŁ˛·ŢSÎi”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@O7üzŰ˙ŔżťASÍ˙¶˙đ/ç@QEQEQEV†ą¬ßë—‚ďTźĎ¸#±WĺYôP¶—3YÝEsk+Ă÷Ät=ý¨Qą2¨–ÚžaEoÜxnâOÝhzv$•%uŚ»ʨ'“ëS^ř#\łÓ$ľšŮ<¸†édărWµ¬~Ň=ÎjŠë<ái5ŰŘ.&HźNIĽą”˵Źŕuî*?řB÷Gű]Ů ¬af ÁKaxëÓr»\=¤yąo©ËŃ[Ú„őMjÍ®íR$µVŮćÍ @[Đg­R×tkíđ[jPůrޤĘËęĄgkŤN-Úú”`†YĺXŕŤĺ‘ş*)bI,RC+G24r)Ă+ }ŻEř]u.ťá_j;cÔ-­â1NT€–Čă°ü«Ďďď'żĽšîňS-ÄĚ^Gn¬OzEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPŕ˙_űĂů׬xŢAľ4imJs%ą„ĆŔFďĂ;ł^M *ĐMzGŚ>#ę+â+ćđΨßŮł*m&ÁŘ˝r9…XÉÉr®Źô{§ăŰlĆ>×'O_-łú×-‰/´ęÚ…§•,ŇË4r e`Îsô‰§ę·ş~Şš•ĄĂ-ň1q3çqÎIÜ=OZ«q3ÜO$Ó6é$běqŚ’riŞZ뵬{ŕ•šO‡>2ŽÄvD ÷Ś{ŽďÓu$ŃüąűXeFÔÔŰî6Śíöűß­r·¨č7†ëIş{iÚJ€CBAüjÇĽO¬x‰Łţ×˝iÖ>Q„U÷ŔgŢ“§.o+ÜQÓI§„đOü‹Ż˙ ăüKĎ<O­×ţŤZçăńF±¶’%ćŇŘÚB|¤ůb#zsÇsÍSąŐŻnl,,§źuµŽ˙ł¦Ĺ7[2r@ëšQŁ$Óţş˙‹ă[™—ău†ŮywľĘväăÇó®?â0Ç:Řé,k>ű^ÔŻµ´Őî®|ÍEeŘŁ ÚvŽ0;U]JúăRľžňöO6ćfß#í'č8ާMĆ×č¬iń†7:î™ F(Úl8lp~÷zÉřdqăÝ?óßúmŻŽĽImĄŤ:MţĆ#1h‘Lc*OOzç­§–Úâ9íäh捣©ÁR:Da%—‹"’?ęâDe?l—ď ®·ÄŃÜżÂ_ •ÚÜK7™‘¸»mĎţ=\î·ă=[ÓţĹŞjâŰpm†(בĐä(?­oŹˤř?Ă–Ú ůŹP¶óÖę?+*>W;†áҦJvŽš§ú|T¦źá$»Č»]1<Ŕßxtëú×#oˇęw:<ú¬Rľźm’p>U<¨ő­Zű[ż{ÍRá®.Xą€ pŇ­Ůř›WłĐ.t[{˛šmĂn’-Şsž¸8ČŚ˙ZÖś\b“WáOüŹZű˛˙č¶®—Âľ&»Ö.ő»K‹{(ăK Ü40„bA“éÍyľ“©]é7ńŢiňů71ä+í Ś‚ĐšvťŞŢéł\Ke7—%ÄM ‡jťČŘČäqĐt­ă;Η3lé|!a řkYŐ/îoĹ„e"’ÚÍö™łý˙öFďçZšŁYIđ˛VÓm®íí~ŢĄĺĂvŚ•8éýs\n…ŻęZ’6™rbŚ:• ­őbĄŐţkŹńçüŽ:żý|5OŤüCś6ŃęN#‹IE-ĐFHă˝a_ÝĎy5ŐŰů—1wl“ôQ)'°S„˘Őú+wÄؤk˝UF1¶— ‚Ý˙ůŐŻaáý˘§\BeŽŰ#&OCé×>٬7Ćž Ól㵳Ô] ŚaŁGÚ=`N+;JÖu &ő®ôű—‚vÎćŮőO™^âöräĺ:ŤWP´=®™ĄjXˇ"Ü\8eWĆéýišł°řWˇ b®ĺ$zŕ¶?™¬{Äz¦»ĺŤNčĘ‘ň*ë€5RmRňm.ßN’mÖp9xăÚ>V=Nq“×Ö“Ő7§­Ë—şőÎĄ‘ox"éăËŤÔĹr>ńĎ8ÇlWaâ«+™>.Ú´p»,łŰČ„ ¨LźĂĽŢşK_x†ÖÁláÔ\B«±IE,ŁĐ1ˇK¸ĺö|˙¨ŃY_ă\ĺH#Î~Q°ŞŢŽň?xÝ¬Š«i8¸.8Ýy÷ëú×?ŕ-RŰLńu­ţ§1HWĚ2HAc’Ś;džM7PńŽ·ya&ź-űµ›eHÚˇ™{ŘÉJKs7NWĺ]żźđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEPóÇ­żü ůÔ<ßńëo˙ţuQEQEQEt ¶GŐZöŕŁXĆnűŽóçđ¬[ë—ĽĽžćSóĘĺĎâkˇ—ţ%^ Ž>—ś›Ű×Ę^ź®?:梍Ą‘#Św!TäÓĄŃ˙âWá]CQÜŞ˘©Çř~uËWM­Ćňř?ĂňFĄ‘<äbB[ú­â« [k‹9ôô1ŰŢ@ł,dça=ŞAŕíc{ˇ†0ËĐToă™›]:,‹đö_8­x [żÝçŻë\Ĺ TłIĹv÷čš~ł‡&š'-˛9.ZBscÄW *Đ0&»-~Úgř‰H؉%…ÔÁP'ô4ŔÁ›F™üC>—g‡‘deMÇ'źŔT—>Ő-¬^ęHdcs¨pY©ąĄ°o‰Ň•9lŁ˙jÂipšľ´n€-¦ó‹tÎ{ţ´ÎiZeŢ©9ŠĘ-ěŁs@ =I5.­˘ŢéKÝFľTźrD`Ę[ž0˙Â;®ůŃË*â2éaĘäô?ťCynŢk{ ¸í Ŕq4ÎCc=(ŤŹ†µ+ŰX.aŽ?"`J»H8çńŞóé—~Ż Ąü[şäg!”ž úV¦¶ě<áôí&bG¸n?™©üBĹĺđ˹˵¬Y'©äP®ˇáËâ;WŠşpŽF™8:ţyZĺüC`Ä×6Z|`XăN{ ÝÖő›«Ţé‘ěű<÷1łá÷2ĎCSZeߌîmąőňčÎßřgS˛µ{‰aFH˙Öä SęKáMő[¨Ą‘Q¬ÖM’&ÖňŇŢmHYiš‹ÎĐşN@ŔÔ·‹áů´˙úëý $×|=u¦ý˘r"«!Tġ›ńÇZ‹OđîŁkÍĽiäHHŢÎ sš«­Ł&±|H>{őíŘÔ‡€ô¤í7=pOřĐ6­¦]iW>Eě{ŤŔĂÔßţĘľÓ|=~'±˛–7ŚűĂ«ˇ_i$׍ť˘HÜ2çÓŠµá‹ą-!Ô7ŘÉwa$anB pr?±ŞXŮÉáäÍy¨#ŰNxÝŽŁÔĚŃE:-ľjoű»†~”€ÚÂş´ÖÉ*Ŕ şîHÚ@‡¨±‘Ô«©Á`é^â ě ńlnöWÓ^BblŚ t˙ëׯĘgÖŻ%hZy 1·U=Á¦ ˝¤iWz´í”aŠŤĚÄŕ(÷5Ő…Ő¬MsÇĂtlÆĐxZ9.|;ŻŰZ×N±«Ő”? ţt—¨řPÓ­ćę4XC„ ®bFAíYU×\ÚÝZ|?1Ţ#ĆĆđ2ŁŚ]ľťąÍsV7Z„Ć+(iî*Ł ő  ÔPARCŕE .iZtúťĂAkłxRç{…ČOÖşMÂ3E26ž‘,"g 0ÎîsŚšăëĄńÚ·öŤ›m;Mśx8ŕő¦>•ĄÝę·(·˛ŤĚIŔQîMK«č—ÚJĆ×qźvD`ĘO¦EjřxHţńŰ‚f",…ęW'?¦hE‘~Ë篋wűĽăőýh˘Š)˝oá=Vx#•c‰L‹ąĺ}+:ĎK»»ÔţÁxşËŽq‚:˙*ꦞÓSÔí ÖlŻěub5–ďü-ÓźJ­á¸Çâ·šc+ŁČľc[ä<źz`sš~źq,ŃŰ*–Š6•˛qňŽżÎĄŇ´kÝV9žĆ!'”T0ÜůşuúVׄ-ĺ‚űYi‘‘ał•\‘÷O~†›á••Ľ/â!bĺ"áză-źÓ4•«čWÚTQKuůRp˛#\údTÖ>ÔŻm`ą‚8ü‰ł‡iţ5z ëđö4Ťx<¬ýqúţ´íaeočEË»3¸ăúĐ©§\éwfŢö?.P3× ŹPkN ęó[,ÉnŁzîTgŘ}*ç‹Xôsţ´Z'®=˙ZąŻGvß-Ú0ä!1‘Óf˝@ť•…ĹĺúYB¸f+µŽ0GP*қº¬6’\< Ćç@ຏR+VĐ©řŰ1Ź´?O]§?­cG«\éšőíÔ;Gy„€Ŕžs‚( h/ŞÝE,ŠŤf˛l”6±ă<˝Ĺ3]đőÖ›ö‰ČZ¬…S†lÇj?Čͧ˙×_čj¦¶ŚšĹđe ůďÔ´h•S˘Űć¦˙»¸géH ¨<+«Ml’¬ ®äŤ¤Řz€k:ĂN¸ľľp…[‘˛C·‘ÔsŢ»oOe‹cw˛ľšôÚ€+` `c§˙^ą]A®.üO+ZÁ$R\e#ţ%|˙Ť0+Ůé—rÝGaM˛–Čv„Ç\“řţTÍ+L»Ő'1YE˝”nbHG©&»Ź–›D»K…§ŠDţŇň† Łź¦Géěk#ÂFřGuß:9e\F]"l9\ž‡ó  =[E˝Ň–7şŤ|©>äÁ”ţ"­Aá}N{dž(Łe’1*/72źAW/ď-Ű­ocawˇ¸&™Ă(lrÇĄlŰ/´<ů„·ţ‚hŽŐ4›­1á[•w##†SřŠŇÖ7şc ˝•Fţ3ÇŻZ]gţE ˙Űý V·ăş?¬Ę+ňńČţčĆ ć€9}:â :ćeżÓÖ菓ˑŠě óŇŻřÎÚÚÚúĚŮ@°G5˘JQI<’Ţż…VńnÓâMGn1çž˝ę˙ŤŃŚúS…% „@68=Ć€1ô­2ďTśĹeöQą‰ ¤š›WĐďt¤ŽK¤S ś,‘°e'Ó"´<=iŃu+ëąîŢŤŕ¶m¦L˙{ŰźçWŻŤłř Í”AöŔTLۉ8äŽ:őčOđîŁkÍĽiäHHŢÎ sš©«i—ZUĎ‘{Ç#p ä0ő¶uaŕ=);MÄ„Ź\ţ5‘¨j“ßÚŮ[ÎmŞŃ€9#ŽĽűP…ż„őYŕŽUŽ%2.äG”aô¬Iâ’ ž)¤ĹYOPEv“Oi©ęvk6Wö:± Ë wţÁéĎĄrşÝłŮę×VňĘfxä ČO-îh•fęÂęÖ&ąăŠaş6aĂ ­HŠ( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€'›ţ=m˙ŕ_Π©ć˙Ź[řó¨(˘Š(˘Š(Ą\nł·<â’ŠŐńŞş­äofxbX˘ŚśíˇĐŻ!ÓőX.î"i’#¸"śdöüŹ5BŠšöĺď/&¸”ćI\ąüMCEVž•ŻjZTmŤÉŽ69(T0ĎŻ#ŠĚ˘€,^^Ü_]›‹ÉZYXŚłWMŻx¶ěj×GG˝?c.ßÝŽĐ7 Ž•ČŃLwgvwbĚÇ$“’MkCâMZ/˛%ă}źfͬŠß.1Ś‘šČ˘Q@^&Őěmc¶µ»Ů c ľZwęFj S[Ô5EŤoî<Ń%~E\Ŕ ΢€.\ęww:żš]×a•í•Ć8…Awq-ÝĚ— ľis6Éü**(^jĐŮ}‘/ěű6mdVůqŚdŚŐ-7Q»Ó.<ëš1‚F#ĐÁŞ´PýWXżŐJű†”'Ý\đBŠ(­«kZ hŻXDŁjĺT°€‘šĹ˘€6|% Ź­îďĄ+ď.ä9*GnzšmßőK›6ł’íšŘńŤ ľ„ă&˛(  Znˇu¦ÜyÖ342cŚG¸<›UÖoő]‚ús"§ÝPˇ@ügŃ@gľ¸žÎŢÖY7Ao»Ę] mÉÉç©üin5«kçK»ěČ/”  t9üj­fćúâćřŢO&ë’Á‹í‘ÓÇj'żşžüŢÉ3}¨°o1p§#żZŠ×ľń&­}jÖ×7e˘nU-ő VTR<2¤‘1I†VŢ›Ejj> Ôő+_łŢÝaČm»r=ŔÍT’úâKlŢLŰDĹ‘6Ž ëĎZ­E*±V §ŠŢ˙„Ç]˙źďü˙XPË˝Nňęü^Ď;ˇŚH )éÓrűÄşµő«[ÜÝ–‰†**îú+ŠąĄęwš\Í-Śí°Ă`÷Š›U×5 U;Ű‚ńˇĘ P \Y´PEPÍ·‰ő‹{U·Šń„j6®UIQč ¬vběY‰f'$ž¤ŇQ@ݵ[Űëk{{©ĚŰŚF¸»uüiÚF—áĄÔ$ÓÔ)ýôjĚséÍgŃ@Fą©YŤě·ÓęIqçÉ<ŞWřqŽyô¬=/S»Ň§i¬f1H˰ś‘ô5NŠWfwfrK1É'ą¤˘Š+^jĐŮ}‘/ěű6mdVůqŚdŚÖEkMÔnôËŹ:Ćf†L`‘‚ô đj]WXżŐJű†”'Ý\đBŠ(˘ŠÜ‡ĹzÔ0,Izv¨Ú "łő#5.f_iżÚ7oó3ónÎsšŠŠ×żń&«jmî®ËB~ň…UÝőŔć¬h˛iş6¬‹;Ey)Á€NJ±'ścó¬ (GUÖµ Uc[ë"§ÝPˇ@>¸­kIc éé—E.ˇóDÉł#˛3‘řW1E0,ę×:ŤË\^JŇĘxÜxăĐŇ´ ń>± ¶ŠőÄJ6ŚŞ’ $f±¨¤‹KË‹KÄş·­Â’ÁČ rzőúÔ2;I#;ś»Äú“M˘€Ź ©$LRD!•Áw­-GÄžĄkö{ŰŁ,9 ·bŽG¸¬ş(˘Š(fŰÄúĹ˝ŞŰĹxÂ5W*¤¨ôŚŐ FęÂěÝZ˶ŕ‚7• yëÔ}ę­rÇR»±žYmf+$ŞUËÁër 7NÔnôŰŹ>Ęf†L`‘ŚčAŕŐZ(CUÖoő]‚ús"§ÝPˇ@ü"ëęđ:φ‚#gbü©Śc§ëÖ¨Q@e˝žkk[i¤Ý¶ď)v·qÉç©ükĄ×Ľ[v5kŁŁŢź±ČoîÇh†GJäh¦»ł»;±fc’IÉ&µěĽM«ŘŰ$׬± ©ElNA¬z)LÖ/´Éd{)ĚfOľ ‚ęűýwRż·h.îLł*U@ČŕcŹ ¬Ú(Ě—×XĂfňfÚ&,‰´pO^zŐj(  Č|W­CÄ—§jŤ ˛+0R3X˛ČóJňJĹärYś’OzmzűU˝ľ¶··şśÉ ¸Äk€1Ű·_ƨŃEQEQEQEQEQEQEQEO{˙Oř*‚§˝˙ʧü?•A@Q@Q@O7üzŰ˙ŔżťASÍ˙¶˙đ/ç@QEQEQE<ßńëo˙ţuO7üzŰ˙ŔżťA@Q@Q@Q@ëž:żđĎ…Ľ@úbř>Ęč,hţať“;†z`×m§Éâß5ľ…c ›\e˘¶ó>D ą#qú@4W_¨ü:ńźŁË¨ĎmŠß,i(i#\g,żOƱü5áÍOÄ—Źm¤Áć˛.é* ő$ô  Š+˘ńGµ E úŚQµ´ÇjO ĐźLöTáC «)čAî84—Evv ‚Ô7ŔlČ]ß{éZ÷ź |Ii¦O{%¬L°)y"ICH«ë´{sŽľÔĆŃ]‚Ľ9¨k·­.ť¤˘Íă’Hîd® $z´ć¬üP[„ńlËy¦Úił“0Z°déÁČ“ô NŠéü3ŕmoÄVMyc QÚ+lO Efôµ•âPđö˘Ö:¬ŔÜ92ö Ž˘€3h®ÚÇáŹď, ¸Xm˘3§™2Ϋ#ČăükŹ˝µžĆîk[¸š+\¤ÝU‡Q@Ń[Ú˙„ő] L°żÔbD·˝Pc*áČČv8¬(˘»/xB[˝.îâĺ"f’ŘIjDŔaŹ#pŹĆł«V4•äÍ)Ň•WhŁŤ˘´5ŤëH’4Ľî»7OĄjGŕ­iŰo“’2»ĄQżŚńëC­M%'%f ŤFÚQwG7E_˛Ň//5_ěآĹŕ,ĄíÁPIţTÍ7MąÔeš;UVhbi_-Ś*őţuNq]IP“čS˘ŻiUćŻpa°„ČĘ71$QęI©uť ˙HXŢň5ňdá%ŤŁ~"—´‚—%őł—/5´3(˘Š˛Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPT÷żńô˙‡ň¨(˘Š(˘Š(©ć˙Ź[řó¨*yżăÖßţüč (˘€ (˘€ (˘€'›ţ=m˙ŕ_Π©ć˙Ź[řó¨(˘Š(˘Š(˘Š(Úľ'xÓWŃăÉšâ&†VŘ­ą‚ĂqĐt«>ńFŻáą%m"ě²ŕH…C«ăÔißë-§KđbvŇ,ďmlż´TĆ·n“–Sýß뚡⸮¤řAŕó »[‰%ó6ŚŤĹ›nńęĺuźkúŐŚ–zž ÓÚČâCŤtĆ@öTú?ŽüG¤ZÚŰXj&;keeŽ#ŽNxÉç×§j`oü\&źáĽČ˝]1<Đßx:ţ9¨ç†IţŮů(ŇyzągÚ3´yl21ů×®kúî ÷ş­Ë\\° ą€ pŇ®řwŚ߇#–=ýíŁ”îtŘ®¤úá  ˙‚ˇâ%€śţ\ľXaü[ôÍtz&©ĄŮ_kˤřw\–őíĺŽôK2ş¨=KŻőŻ6Ô|CŞę:Ňę÷wŽÚŠ•+:*ˇzchµu%Ő´×°ľÔK[Č6Č$C ô$hkÁÉyđËĆ–ÖĘdś}žMŠ2v†É?’š-ŕ’×ŕ}ë\!Ś\ęŠŃnŢ6Ż#ţů?•qŢ×µ?^›­"éí¦#k =9¬ř›ĹzωZ?í‹Ć™"9H„E>¸sîh­ńLW2|đ…]­Äły›FFâí·?řő?âpd‡Á ©˙Ż[ţШ\îýZ‡ţątŹxjŰĂúŹQµó–ę#Wk>TĂđé\Fą¬_ëş^ę·-qrŔ.âŔ€>”ěŢ3ĽŇm>$ŰÉ6‘¬]jŕÄÖŻm0ŕ€«éśçń¬\żŽ’Ü=¬–o#ÎÍ܍圎ůÍr¶?|Qc§­”Ły(»ĽhÎĐ1¬='ZÔ4ťXjv-đ,|ćPä–wrhşřYq4Ţ&ńH–Fq>ťrňüM¸r3ůÓ|}6—đ»\żµ Om¨ŰJ™éČyö®IÖő "ęâăO¸ňf¸‰ˇ•¶+nF °ät)°köú5Ö• űl.]d–-Šw2ă8Čč:ôkÝzďÄź ĽQ©j%™ďmÓd@„U]€ '߯sVo%ŃcřYáWŐěo®ěÁ”˘H$›Žwgąů±ř×Á¬_ÁŁ\é1O·O¸‘e–-Šw0Ćq‘Đt5ŁáĎkľŕŇŻŚvěwť×> 08ü(kâž oŰCK˝°XlÄq›Â Ëđž?µcQŤĺř'ŁŃś&§&íŁ8áú×­j÷ÚÝűŢę—/qrŕí€:{ Đđ÷Ś5ďŰÉʍ=Ľ.Ű™ #®}@`qřRKá +ńFCżţąµG‰ďü;ămgPłňĄšY§ŠEśVVsś€G ¬üCŞGâ®%Ö5BćO?Ë_ĽF ŰŤ˝Ąg\Í%ÍÄłĚŰĄ•‹»c$äž(ŞŽ˙qYľ5ßüqF>>ą`¬TA8ăî×7áĎë~Šhô[ßł$ĚAĺ#䎟yM]Ő>!xŁUÓ籿ÔüŰY×l‰öx—pú…€7|_ňü*đcY«5’™„Ű@“v>˙ó®ĆpxŠ4ŃÓÄŹ¸›eű*±]ë Žsţ÷5†üiŻxrÝíô«ă»Ć'EuÔ? ËÖµ{ýnýŻu[—ąą`vŔŔ€ě(Őn®ôßxM´ń^‘¬i%eŽ®m_Śçĺlv' 8őŻ4ńŽź6—â}JĘćéîĺ†R¦w$ł÷çľ1[6żüWmf¶Ńꄪ.Őw…ÔĽFOă\ťŐÄ×w2Ü\ČŇĎ+wc’Äő&€4u{}r-:ÁµeżLźčźh-łn?<ŚtíŠÉ­ťgÄúľµ§YXęWfkk1”ŞŚq€I$ăŽk€ ę|ĄôżŞ‚ĚlŽęz×-VôÍFďKąűE„í ¸Ű‘‘čAŕÖu çąĄ)¨M6T ŽŁ×xţćX(Ö5CmwxÍ űʨ«»ę@沩BMµ Y¤˝,iNĽRĽ÷Mż[› 0 ř‡ĎŠYWÚĺ2zNą¨5Űvđ[Xiױٛë<îCăŹOë\ţ—©^iw>}„í ¸Á#čAŕÔúĆą¨ëXÔ. ‹Ý@ˇT~PčKÚst˝÷}»®˝ź/[[eůŤĐô]G]ş{m&ŐîgD22© çÜŠ ęQŮ[ď)Áç5Řř+ÄvžđďYƱyŰŰĽ*óą·vëźŔW]g(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuO7üzŰ˙ŔżťAEPEPEP˛:!P~eÎ:ŠŽ˝*k«[‹I]A,FvČ…Oäh(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( §›ţ=m˙ŕ_Π©ć˙Ź[řó (˘Š(˘Š(˘Š ‚:Šôý{U»×>Ă}­H.ŻTň˘¨ «°ś×ôŻ0ŻPđľ¤|;đ–çQŽÖŰPkťLBĐ]©’đ™Ý·=xëî=(Ë諚ĹůÔő)ďÚÚÔĘAňmŁŮŕňŻn•6ĄˇęZe•ťÝý«Áox»ŕv#÷ä 硝fŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=ďü}?áüŞ ž÷ţ>źđţUQEQE<ßńëo˙ţuK#©‚ć\ç󠨢Š(˘Š(˘Š23Ó˝v~&ńfťsḴéo§éâ´Je—Ěyü;wě+Ś˘€Fš5•ŠFX`3žN+¬řťâXŃ<»kH~ěCŽýĎň®v€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€'˝˙ʧü?•ASŢ˙ÇÓţĘ  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ďăé˙ĺPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE˙Ů endstream endobj 197 0 obj 8805 endobj 198 0 obj 29480 endobj 192 0 obj << /Font << /Font2 12 0 R >> /Pattern << >> /XObject << /Image25 195 0 R /Image26 196 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 199 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 200 0 R /Resources 201 0 R /Annots 203 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 200 0 obj << /Filter /FlateDecode /Length 202 0 R >> stream xśµXËn#EíîE¤Ô7€f“ŚBĄŢ‰  b$¤–fA@˛€I„ś2Ś+ţ€Ç†oć"Á†E”ŕÝĚ* ˙ÄpnµÝݶ;ž$nwÇv÷íę{«Î=uęVÎä‚Ńů~ua„Ĺď·§ěŚ .„Ś.XaR‹Ĺ{4˘źS¦ťőN¤×GÍŤÖş±…ú>aŹŮS9cŽ~< vü"(úř`´D ®E BGÍžß+Ô {ň}‰ó¬I¦Hé„[协­=|žbX§˘äÖŐ¶QË&ŁĹÁ…†µ~ąmlÝ„óÇnAš¨¸µÓÜÉčçHLÇ[ČÓÁg§Ăăď•g?K][‰čŚDc)µq©×Jˇ<ڵmÔ˛)ÝÔVżŰŘj<(¨3ľ5W‰lłúE·µő*2ą÷ŃŞ0#dôĘš " ™H”¶*ęűG%\”ĎŮÁ§ĎžľP̢!•Oć‰NYĹťaeĹâň;öŰÍţÚcŇyvóýě:»Ě-ţËËbÜzc™żSŚ÷Ř׬üś}RöŮ/m"XoŁ_ęÝî+ horUjĄ¶XE]ŃQ»Š.3Ó¨1yíťL¦Ů{ŤĺîIk‚Ő 2 ±16mfźE¤4S®BĘ-!%A=ç”±ŔŚ»6PĹďĹů ¬űz·>%cÎ1ńăÝüÁÓS‚älŇćÁ<čPK•´.ÖđĂŤ E\JAńS晕ZµŚŁĆ% Ú[í( őűÝÖ¶$ąA'"f˘w–¸™úăp*–Ú»^ÇYĆ%ßĘŹŽčď“ĺeqQ\äYľM†­|˝*Îł×€kćĂüŚSw˛Ij„ź!ŢĽ@łů6î0Wp˛O€«8ťx<» îČpŢăŐĆÍ"\‡YdôŚÍ·ÖĘ’ăšŐclŤJîÉhćŘtµĺ€¸÷ô•Ü[+´e"qŘą9üGOs¸Ë;Mäcâŕ~{&Ż ©VŤ  ­c¸aTç5LóG ú%âçż`\’ąÄÓĂŰ }U?Ś€Ú† Lw?ÖEÉs&… ! '÷qnö”ĽNďŮ7´4ş7XśÇë"…ŮĚŁŚć†ˇ@ˇ.!dâś´hÝA)/ąńÖtĆ+k&ęućg`UyLŠ—·ăčŞNčŕxTĘůîŻ;ĆT{B<%ü†>+”»Ţ°ô[>W˙öC·ż¤żaIŞW,pá–üě=,ý×XËö‰ČŮúYˇ €|¨ĺŃőĘó…R©ŕýRE0/hXËż@%0Iš7â]ĄÇ„błľOPcWW×xž$ň貧 bĐ&7Ĺ?ëcîđH{ÓKŹŁÚ B îÝěľ;ˇŻkÖ´wI•UĂid#1y—ŕöî›ć“Tˇ ’/JBžÁĂß“~đ×> >> ] endobj 204 0 obj << /Subtype /Image /Interpolate true /Width 698 /Height 1026 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 205 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕş"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ń (˘¨AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEĄ hzŽż~¶zUłO18áPz±<ő  Ú+Ńtď‡zuÁĽŠăĹÚxşł·{›„µ…®8Ó‰`@8ČŕsY:§®˘ÓĄÔtKë=oO‹™^ÍżyőxĎ#ő BŠ( Š( ŠQÉŔ­=oAŐ41lu[9mľÓ–-ăďč}AäP]Q@Q@oJÓ®őmB>5ÔÄ„Ś7`yćF»DWxe’ěô )¬ßřĂ:—fńG¦ťb¶É– X@?0ůą 2R®ľk Qř-á|U¨Í§Ř,±u2l|/ÝnĹ»v®KÄţ1đ®…đţăÂŢ ’{ĂtHšâT sŤĚI ’@ŔŔĆ(O‡Ţ+yâ…4;˛ňˇ‘8+Ç$ç¨ëYZG‡őmbú[=/O¸ş¸‹‰5ÎÎqÉč?÷ŹŤ~.Ö<3Ąxrëě­u4˛*‚Ä LAŔůŹéYúNŁs῀XŃťSRĽťžk•\Í1By`UJ@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEč,ąo řrÇĂ:y0ÜÝ@—z¤«ĂHÎ2±ýŐ»çëź?Ż`ř‹âÓa¬ŰLžđíí­í¤70\ÝŘů’:•·s‚1ě1@őČ4Oíż´E$źnÓ'±Mů]öŕśöâłô f÷AŐ!żÓf1OüwVÁô¨]'Ôn®§·µţüďĽgdIś“÷Tgđ­ox›űÖX?±4=G{ďó/í<ç^Ŕ9t  ßôűHŻěu}*!ź¬[‹¤t‰úHčťrčżoMĆŤáf´´˛ş’\˝µ¤^\q¬¬ €ą8áI>äםPEPkáiôoi Ż]<†´ěËecś¬y˛˙0?q&‰ă?ís¦xŐĺľŇďd2Ź2ZHĺ¤~ŐGč:GHđÄąŃn$—[´Ü÷6^,đńzŕuLŃ𗆮ĽG~ńDËoiů—Wrń:’}zŕwüÍ0(ë–1işµÍĄ˝ä°ÄŘKNREĆAź>ůŞ\ŹO‹VąŹF–y´őlE$ŔqŽIß8öĹP¤EPM%ĽŃÍŤ±°dt8*GB­z,zŽaŽçÄ—‹¤ëjęábúôó×·żˇč<Ú»Żx6Ĺ´¸ŻüW©dĹ}ű˝=HËHǤŚ;F=xÎzŽ2™ă˙lůlaĐlţ[[E˙ĐßŐĎéź©<ĹiřŹCľđö©-†ĄÉS•aĘČ˝™Opk2€ (˘€ (˘€5ußęş÷Ůżµďdşű2yqomúO“ÉĹeWUăŻÂWý›˙Ű{±ÂbýŃÎţžĂcÎ2y®V€ (˘€ (®»Nń·Ř¬-íáđĹÇ’<Ű‹ ň>;±ÝÉ÷ FŠí˙á`ÔĄáü˙öTÂŔ˙©KÂř-˙쨢´üA«lß‹Żěý>Ăʱ‡ĘŹŚóŚžyëě+2€ (˘€ (˘€;Źx÷ű_áö•áŹěß'ě.Ťöź?výŞĂîműާĄpôQ@·ÄŹ˙ÂiźŮßbűn™óüĎ3vŢ~čÇÝ÷ëW>üH“ĂZLú6©§EŞčÓL g¨zŕ÷Ż=˘€=7Ĺ_&ń.—oá čđéZtň,bÜn”–W€‚Ý}}k«řąţřYŕý:yRÖh›j8%Y#l}‰×…C,Ę’Âí¨Á‘Đŕ©‚cSę…îĄ0›QĽ¸»” žV‘±é’hÖbřż¦ßEk?‰<)k¨j¶ yW!”dŽsĘ’ĽóŢą›ď‰ÚÍĎŽˇń,i2BžJ[Jy]Ôúç9Ď®=+‚˘€=¦OŤ4÷ú_…-mő»„Ű-Ó:óîHPĚ8dt®7á˙Ä+Ď k÷úŚÖë~ş†MĘ3l,Ű‹n’{w®"ŠÝń¦­§ëzô·şF••ję [ĆF2-€ô¬*( ź$Ź&ß1ٶŤ«¸çĐ{S( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( »_ë:^­ ÇáßČđE°ÔQwbzŁĄ üż,qTP°xÁŤńŰÜi÷ö·š=Í­Ľö·*Ęň>Ý ä‚:ĽZçí<9¤xVA}âëë[»Žč´›9Ť#‚V*űwýźŃ@^"ÖnµýfçRľ`f™łµ~ę(ŕ(öłh˘€ (˘€-i—÷Z]ü7¶<0¶ä‘O ˙Qí]7‹|ssŻX%•˝Ąľ›m#y×qŰ ™»»{{~§ŚqôPEPEPýňßOŐ­®ď,’ú[s[»mW㌟Lŕăľ1RxŹ\ľń©-ţĄ.ů_…QÂĆ˝•G`+2Šč® đŐÄ« ·ŤŁiä;PI¦É–=bŘ޸íwH˝ĐőIôýJĚGv#±¸>´źEPEPEm_ř_[ÓţÇöÝ2ć¶8K}ëŹ1Ž0ć(ń?†5 ÜĂąfm¤™<ČţupĂż*Hâ€1h˘Š(˘Š(˘Š(˘Š(˘Š(­m+Ăşľ­eqw¦é÷6ÖůódŤr'?…dĐEPEPEPEPEa-&{7şTýÂ0BŮ}1@č«ßŮ:†3ö+ŹűŕŐY˘’)4oŽŞĂ€#˘Š(˘Š(˘Š(˘Š(˘¬\ÚMm2L›VeŢś‘ëU袥‚ g/äĆϱw6ŃśZp´śÚŻ)ľÎnţŮ (˘Š(˘Š(˘Š(˘Š(˘Š(©c‚Y"’TŤš8ń˝€ásëQPEPEPEPEPEPEPEPEPEPEPEPEPEP]<;ö mOM¸űv“p…ÁŤűŁŹá5ĎVď…ĽA&‰<±ËşÓnFË«Gű˛/¨ôaŘĐžđďŰěnu=Jăě:M¸ ÎW&Gě?×=[ľ)ńšÜńGB×M¶-mîĆľ§ŐŹsXTWŕOů'ţ7˙·ýŐŔWŕOů'ţ7˙·ýÔŔŔ®˘ËÇľ&˛´ŠÚßTq KµE=2ĘMrôPŁřGÄşź‹uŘt?MöźyčđF ‘0e*^1^źđ›ţJ•˙môS×PŔő/|/·ÔĽ7˙ Š5QĄin3@ĚąĆâ[€ éÁÍCńᤇăń‡őUÔôv 3ą82đFxíúvŢ.Ó®üOđ/ĂźđŹF÷?eHX Ë3lŚŁ$†íí\ŁŕźčßźSÔµ9l¬23ĄÉ,ŠNçe>îOŢÁ¤ˇ|iŤ¦Ó| Jđ»Ü˘‰ᜏq\§Ć_ jrxËCÓ†§y«Ţ^E˛#pv|Ä`ÜśW_ńţ=ľ˙×ä_É*˙Ťî`´řÝŕą.™V3±‚Ç3U˙ÇŤrCá'†,g·Ó5ݵÉÔm… (ÜzaO'žśŚÖ“đ±ÇÄgđÎłu"EöfąŠćĚPpqÜę+Óŕr0{y˙j€8?ü3źÄž&Ö-čŰiZeËÁ%Ë®Y°ÄLŕdúWEsđŹEŐ´Ë©|â5Ô/-ľüNČĘÇ2¸ŰśpyŐx§áßÚFź"¦§&Ły´nÁů×ja•ašĹýźĽ5­hşî­«Z\ŘYĄą€­ÂŢűČĎPžzs@řŤĂż$ŠUŐ¤ ¬0Aňză>ü9·ń‹q®kÚŞéşD$®ŕWsc«xQž;äע|/¸ŠóĂź®m0Mys$dt*P‘úĹř}á] Çášř˘÷C“Äň?f@_h/N1’pMaxËá…Ťź…Ä^Ö?´ôřą>3·8%Xppz‚_Ňţéwž ҵ۝měcťk§źo—~ďNs´ žýúW}}3Ü|Öe}=^ÚR–H1µĽF äô®_ƬGěíˇ€H[ďÖ€9ßü-±Ňü&Zj ńVŞt˝>Aş ©ŰśfnOAŽé<(Ĺżg XHUś öůÁ«~%Ňo<[đ3Ă‘řu~Ó%˛@d†6ĺö!Fä78ö  Gá“oá-_\ł×$˝‚d¸´xv”tTÎúî 8ý+Ĺëč˙ č:—‡ľř‚×XFŠâH.fXX‚bRʎ?Ť|á@/NµcMž+kčfž/649)ëéúÖ»kĐßoŹWµĹśĆŃđéíL~·5?ô_iÖ˝bnú~‡ôŞ÷ó®­Ş@–Đů1ť°Ć˝ńž§ó§ř¦a&±$iţ®(ôŔ˙ĐŹ‹/îíµ4K{™ŁO)NŐry¨őg’ëĂ—Łý$JUŚ\đ«ţ!Ö®4ýJ(˘Hš?-Xî\“ÉďYţ/ó. ­ěr3ŮĚź =÷çĐĐ"Ľ:M¬ĎŞÝ<áą#EÜŘő5_UŇĹź‘, ígű’ŹŔÖöąu ii9Óbş†HWl¬OěÖ~Żq;é¶q¶ž––ćMńÝz玽ó@ÇŢčz~ź>Űë÷Eo¸Ş™lw'ń¬Í_Lk "1Č'‚aş)}ęŇń­´ĂUYv1ŤĐ q‘ŰüúÓďżĐ´ťˇ‰C+)ęvyüčŃě¬Ö5ŐoŚW7yq¦íźZ©}ŁÍoĽn˛­Ć<©F¬x˛Ţa­I&ÖhćÚc`2ŔoRŽâ+m Ö?ř˙@\) Éý?J…´}5n ›jL.Ç1ázg˙ŻX©nďx¶Ŕ‚ĺüĽ©ČÎqÖşTš-GPű«Ąíş'kM ę}˝ůŞz-’[ř’efÝ ž÷-ě8k‘>ˇâ±µ*Âąč$ý9ü©WFÓ¤¸6‘jDŢtŹä-éšO Ü |BňJ@’př?íĆł#Ónäż6‹ yŕŕĆ=óéď@ľ…íîőHexí¤R=ÁM`“ţ¦źíy~~Ď'?/Nµsð´z¤Rcz[:¶FA˙Čš˙ő÷˙˛Šl:M¬ĎŞÝ<áą#EÜŘő5_UŇĹź‘, ígű’ŹŔÖöąu ii9Óbş†HWl¬OěÖ~Żq;é¶q¶ž––ćMńÝz玽ó@ĽŃ4ë Ż.÷Pd ‚Š©“ŹSéÎjĄÎ™ †­7wěΡŇT\ävăëRxËţC˛˙şżĘ¤ńůtrçŮ(OGh/¤u•ţŐňß” uÍsu»ă(ÜkR9VŘʸlpx¬*»¤éňjW^R0Es»tUő­[mM˝¸Yj,ňóLnĘÓ<,<Řő+T O4Gžýxýi<5§]®· <F±]™HŽ”®ŤçßŢFfZÚ» &aŘ?>*c¤YÝA+i7Ť<±.ć‰Óiaę*ůFą˛ńĽ´âčľŃŐ—w˙XŐ?E"jMrŕ¤ĆĆG#qÓüúP!š7ü‹ÚĎŃ?™¨¬´Ű?°­Ţˇz"G8Hăý}*}$ kD °ăń5 †ËMҬî$˛7“\Ű™Tö e_LŽŇŢ «IüűY˛Áv5n]ĘÖ iď/š8ćŤX(L±$dţŠłŻ3?†l™í’Ű3dD 6?ĆŞxŁý^–?éŐhWYŇÖČŰÉo7źop3ôýjŰčö6kjwć+—؉¸'Ö¤¸uŹBФ“OĐ53ĹRkMRKÁJ2)`xP2¶ą¤®™ Ł ĽÓ0bHéŚůÖEtž)…íôÍÖ$nz—Šć袊)QEQEQEQEQEQEQEQEQEQEQEWGŕ˙ íĐ]XǨi×Č©qlň÷m9Rr9ü뜢€;˙řKü)˙BGţUĄ˙âh˙„żÂźô$ĺZ_ţ&¸ )čQx÷IÓ·Ď xV; Gc$W/$Ţ^á‚BpkĎh˘'…SÖ»ý%ćđ¬÷:çŤ|g˘©EH†$*ź™ŽĐ­|łEoĹâťJĂĹÚÖ‹s-”÷É/ËĂ1m¬AZÔńÄĎkÖ/g{©µuŰ$pF±ďä ăŰ8®2ŠßĐ|]®h:m݆“}ö{KĽůŃůHű˛6žYIzUŻ x÷Ä^·{}"řĄ«Ćd@}FG…rÔP]ńĹwú}í•ć®óZŢdLŤ 0 ·*0B÷ĹÚĺ÷‡`Đ®ŻĽÍ* ľ\R »z|ÁwľµEoÚxż\´đäÚ ˝öÍ&mŰŕňç''ć+»őŻOřWc ţ?đŚxÎăJÖć{;DBB0ÉČÇĚÖĽFŠú3Ĺú­·„ţkn­âÖµíSx%HÝ—PźtµUWŰź­|çEQE{Eş†ËQŠâtgHň@\g8âŞM#M3Č˙yرúšeböň{Ů„·O˝Â…ÎăđĄűuÇŘ~ÇćfŰví…AÁö=EV˘€4,5‹ëü»iĘÇ×iôÍEu}q}p’]Ęd`xĎ}T˘€:ŤwZş´Őć7 Äʧ 3ŽŐÎÝÜÍw1–ćF’CÜÔ4SNÓ\Ôm ĂpDc€Cc隥5ĚÓ\ĺ•ÚlçyVVÝóö9ăýjŰ·[ČncźUŐ`kXNŕ«&wžÜcšă(  Ż2js^Z»Dď#8#ĐśŕÔ—ÚŐýě^UĹÁ1žŞ (?\Vu€± ÜđŰÍO¶)±˝pqҬŘk7Ö1yVó‘P¬ˇ€úfł¨  —šťĺäB+™ŚxµŐÜ÷B!;ď Dŕ (íĹW˘€,Iw<¶°ŰHů†"J.ë]÷‹oŇuÚبȑö”=řçĘQL ĎÜDÉei Âv·BPrŽ3ĎáXtQHŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠÝżđě°čşĹśéye 9ŤpmäţăŹä{ţ#8TQEQ^­¦jמřyáËŤ ă¶ąÔžéîfň•ŮöHFX1Imă›­LµŹ‹ĘęZDădŠ"Dx˝ ó `yUčá bž6*™ŕ6•) {śóTAŁÜx’(ĽEiywbcÝZ+3îÇ Î:ô jŠŃĽ±yŻ/äÓ,îÍŚS0RŃ’c]Çhr:b ˝°Ľ°1‹ëK‹c"îA4l›‡¨ČäPZ*ëi:ŠYý­¬.Ö×óŚ,ďc×x?Ă~­ŕ/j÷bo¶iʦ Ż…ääw бggu}7•em5Ä˝vB…Ďä)·v·so – —¬rˇV h«V:uî Ě¶w7%~đ†&|}p(‚ĄZ„3YMdŰ‘Et˙-ôkoü9g{gd!Bc»VWßÎH Î:u÷®b€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€;†Ú?Űý—ĘţĚŮ˙´¨ň{î÷Ćqţ®Ä?ŮßŰWŘľoö~óĺyťqţéžqŚŐË˙K6kŁŮŔ–vQ€ÓŰ&âOďąţC·ŕ1…@Q@Ź«É4đOýżčá\ĹvÚf“y⟇ž·Đ’;›ť5î’ć5Q“|”áăü+Ź˙Đ+˙&"˙â©ČWO¤˙É4ń·ý¸˙čăV?á\xŻţ_ů1˙SęzMç…ľxŽß]Hí®u'µKh|Őv}’c…'ŚP”×KđßH^ńĆ‘§]‚mĺ›2/÷•T±ŽÜ~5ÎÄĘ‚RDy wĹwšÎĄáż řËEÔü <÷pŰ*É8›p Ý ‚Ŕ•'<`fţ)řŻ®é~5¸¶ŇL6ú>ťpm’ĹbP˛*§'ÁéŚqR|3Ő¬µßŤ©©işöt7ĘÍpŔ>ÎHŔO?RjMFßáŻ5¦ńĆ»5’Jâ{ť8Ŕw3đX üçęy™áoxrËâßöÄ0&‘ ¤Oabcü UA9'ňâ€:?‡z“čţř‹¨ĹrËmreŤd]ŕ¶ŇG±Áü+áĹíçÄ–łx˛q}źo%ÂĆŃ"©ÁR` ©ˇxźGµđ—Ź,§»Ůs©ĘZŃ<§>`Ëw¨ëŠć~x řGĹvÚ›Fe·ÁŠt^­uǸ €:¸~3ëĂÄour#źFve:nĹUňĎnÁ9Ç~*ŇđťÍ­çĂż‰7:}ŻŘíf*ńŰîÝĺ“´n)±iß ­µV×[’âȱ‘4źł¶wü§Ź»žÇR+7Gńn†žńŐ®N“T`llŇ6#hÎ@ qޤPuáí[Ňľč‹ŕ©4ű=CQŚ]^^\˛‡ €UW*Aŕăžő9Ş?tÍFďá\·^.}>}{Nť<››gÉ2©xđ8ŕć4ŤkĂ>.đf™ x˛úM+PŇň–—«ôd?Âp8ŕÎ>čçµexŇ?é~‹Mđě’ęÚÁ“tš‰ÜŠ‹Ć@č88çśĐ[ń Äwżí4_ řQ’Ëm˘\ÜÜŐžgbG9uRIÇ č+Žń?Ś˘ń…Ţ-Κkî±Ü]Ł \ ŚeqÇLőă&ş[ťSÂ?´Ť-üIŞľ‹®Ř –_+rÎßő g‚OZç|i¨řNôK @ 'VąÔ^2Ż9{dާ§~:PßÚţJ4żőëň5ćuÜüd×tďxÖKýăí6†ĐI±“F\5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWk¤Mcâ­2ßEÔLVšµşyvÚ˛ŃIýőëÉęW:uě¶—±476×Fęůď@¨˘Šě´YÝhVú¶»®G¤Ű];Ą°ű3NŇě8c…#*óxOż·ť|3âHő]B42 Fł{v‘G]ĄŹ'Ú§Őżäšx'ţßżôp®vÖâkKî-¤h¦Ť#©ÁR;Óśthݑԫ©ÁR0Aô¦×§˙ÂÇń_ýň^/ţ&ĄŐu;ź|>ńŢąĺ\^i’[=˝Ŕ‰QÔHűr qŹóŇ€<®Š*Ţ“§Üjşť­…’y—72Ł_r{űRĄZŇôű­WP‚ÇO…§»ť¶ÇőcřרÝ|=đ~źzš&Ąâ׋Ä.áaĚ !+qř°?LŐ]SÁ áŠ>Ѭu+¨ĺąH¦k” t{<ą7ź”p2(Í5 +ť:ö[Kč^ ›l‘¸ÁSčj˝{§Ś<'á żßÇŻř–[mVţ}ŃŰÁV-Ř #'Ž:ţ5Ééż żâč7…5K©/-ĄK@×nĺ89ǡúóz˝¤iúÍĂÁĄÚKu2FedŚd…ý9© č0ę^:·Đ¤šD‚KĂld\n3éž+Ňţ詣|\ńŹm#J–ö3BŹ&?<}qő ˘˝r×áçďo›BłńlŹâ%paýĂH:¨8çđbkĚ5ť6çGŐn´űäŮsm!ŤÇlŽăŘőJŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ×H†ÇÂşeľµ¨®ők„ó,,óącĄ“úëÓ“Ô/nuŮnďei®%mÎíÔźóÚ«Q@Q@Ź«É4đOýżčá\Ĺih>1łµĐ­ôťwCŹV¶µw{cö–˘ŢrĂ*A<ŐßřKü)˙BGţUĄ˙âi]>“˙$ÓĆßöă˙ŁŤW˙„żÂźô$ĺZ_ţ&©kŢ1łşĐ®4ť CŹI¶şt{“ö–ťĄŘrŁ,<Đ$2Ojďü§ÝřSâo‡Źí%±>WĎ\gz˛©˙ľúw®7häWF*ęAuWCŞxŠűĹşŐř«Rs …¦X—÷Qç– ¸Éî{˙*@t7đ7‰'ř…©A›uqöË·–Ö61•v$ýç=1]çŹQŁříŕ´vÜËmnĄ˝H–^jWŃ|U$k‡ńŇO ş€·Ü)™¸Ü$Ź÷‡á\/ĹŹC7Ä ˙ ^+˙eŰEW*©tflŚäócÓŠęü4ęż´–¦€,Ó“Ôůyţ†¸ź YÜŮücÓŇîŢXę„"ČŢyę+•“Ĥž!:áĽuŐLžoÚ;şgřc§«řďĶ­¦ęw—¨×Úü{ʰ *sś‘ŚÄb€'ř´Ě>%kĚ Ü.x9éŔŻdÔ&Hżhí,HpdÓŠ/ąŰ!ţ•óĆŻ©]ęú•ĹţŁ/ťw;o’Mˇw ÂŻjŢ)Öumn^úůßR„(ŽtUڮӑŤ ôÝř7ÂÚĘ|eC.ťsV×ŇO$­AÝĐçŚ}k­đB—řýâĺSµŤ´ŔCľ*ókżŠŢ1şŽÝVŰ䲸)cs[ĺçéұmɨËĆ)-Ľsu©–±ńy]KHśl‘DHŹَP>aTuoů&ž ˙·ďý+¦@ţđ‘v)ăb©žiR’ąĎ5CĶłŃ%Ő´=j-^ÎŢEŽă4níbr ă?ý|gWO¤˙É4ń·ý¸˙čă@qW­4}Jö=žťyqŕÉ ę?1U`ćxń›óÝóóóÓŽyöŻ˘ÄźîFźqg“áŤ.UsČ›XąůI¸ÇÖ:E˛Î°EŹ36Ń©,O¦=jäZ.«7ťĺi—Żä’˛íÎÂ;7~5ěŢ4ł·µý Ľ;%´h†ëČžMťË2çňQTľ%|L×ôO]ŘhrĹiee /%XLÄbäŚňIčGç@YáXědń„zÄŘ4ˇfŠÜ#@=}9§xľ=>ßÇŁAso§¬Š+DŠ03y랼ăëÚýĄśżüâ EżöŇĹs,jř9úĂ?Jó‹_ňR5˙úů?ČP#EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPí˙Ą›@µŃěŕK;(ŔiÄm“q'÷Ü˙!Űđ¢Š(˘Šőm3IĽńOĂĎ[čIÍΚ÷Isš¨Éľ@ĘpÄqŠţÇŠ˙č˙“ńUćSÓ˙á\xŻţ_ů1˙SęzMç…ľxŽß]Hí®u'µKh|Őv}’c…'ŚW”Ń@4kÁ§k7Ą<ÁmÓ-ő­DEw«\'™agťËí,źĐ^śžˇ{s¨ŢËw{+Mq+nwn¤˙žÔŔ­ERŃőoů&ž ˙·ďý+ťµ¸šŇć;‹i)Ł`ČępTŽőŃjßňM<˙oßú8W1Lżţ?Š˙č+˙’ńń5.«©Üř«á÷.őĎ*âóL’ŮíîJŽ˘GŘË•Śž•Ĺ×O¤˙É4ń·ý¸˙čă@tŇ:˘)gc€ d“č+Őá˙…ô­-ümâIlők”ö{h·AéĽí?Óż¦kĎ<3q §‰4«‹’ÝĹ$„ô úWą|OÖ-´ż8»đ¦®·*Ť ńËţP1ÂF1Śô÷¤šëľ¶đ׌´ë oPfĐď€xµCŔnr3ךŃ? ď?ác˙Â?ćżönß´ý·h˙Ź_MŮů~Ľô©>/\k‹xkO˝đäzAH™,ŕ†q)u}€.Đ2¸ _jő#o7ü!Ŕ˙Úăţßě­Ű¸ÎÜ˙«Ý鏗×Đ‹hžÓ|Căkí3JŐŇÔ7·,»ť•ÉÎ=ą5ĐEđ÷Âľ łÔÁž#¸»Ôěă2n"Ú˛čvŽ ă<ö¬ď…Óő+żOâ ;›Żěh|çÄHy\nĘŕrHŰŚzšôź„úĽ®±ý—ŕË]Ę^ě.d-‘÷mäŽzP—ü9đ%—Šôfţ÷Rk°2~đĺŞK3}>•·mđÓĂšî–ú‡†ń鎵꺏‹/|9đ·Ásč:„q^)‘%@Uňą' §>ŐâÔPGâĎkŢ+(5«ć–Îä…$j}p:źs“TŻüCŞ_č¶:EÝ×™§ŮmâňÔlĎ^@Éëܚɢ€;]⊴-=l¬őöČ»cYăY<±č DZ⹽wZÔuíEďµ{ą.®˝űĐ8ŘVuŢŮ|ZńŤ¦ś-#ÔĂ…VYaG÷çńÍqZ…íÎŁ{5ÝôňOs3o’IKŻEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVí˙‡e‡@µÖ,çKË)YĚko'÷#ßń Š( Šőm3VĽđ·ĂĎ\hOµÎ¤÷Os7”®Ď˛@Ş2ŔńŠKoÝje¬|^WRŇ'$Q#ĹččTSʨŻ@řH»ń±TĎ´©IÜ皡â[Yč’ęÚµŻgo"Çq· v±9ńźţľ8ę)T`Oőˇ‰«KpđG¦_<ń€^5·rĘBF2)ťE=˘‘%1:2ĘŇ„`éŹZş4MTĽ¨4Ëâń.é[ľPuÉă@ôU‹;;«éĽ«+i®%ĆvB…Ďä)·v·so – ‡XĺBŚ?@ŃWăŃő9%Ž8ôëÖ’DóV%—űŔc‘ďQÁ¦ß\]5µ˝•Ě·+÷˘H™ś}@  ”T—Km3ĂqĹ*2HĄYO¸5fËJÔ/ăg±°»ąEűÍ ,ŕ}HJŠą¦i÷ŽŁťĽR´®áHD,Tg=+§ńź®<-âX´ů{Ë2b v 1¦XýÜäŚţ4ĆQ]÷ÄĎ ĆRé~˛˝ą ŽBZVśŕ{W ,o Ť¨É"ś2°ÁĐŠevËJÔ/ăg±°»ąEűÍ ,ŕ}HZ(%–u‚(¤y™¶ŐIb}1×4,¶óCp`š#ś¦6RLuĄ»µ¸łĂw°JJJ…[C@ŃW®tŤJÖŘ\]i÷ŰśbY eSźr1Th˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(±řgýŁý±/Ů|ŻěÍźń0űGúŹ'ľď|gášçüCýťýµwý‹ć˙gď>W™×áž™çÍ\żńłhş=ś ge 8Ť˛n$ţűźä;~TQEčú·ü“O˙Ű÷ţŽĚWm¦i7ž)řyáË} #ąąÓ^é.aóU7ČNŽ1P¸ń_ýżňb/ţ*…túOü“OŰŹţŽ5cţÇŠ˙č˙“ńU>§¤Ţx[áçíőÔŽÚçR{T¶‡ÍWgŮ!f8RxĹy¦“˙![?úěźúŻqř×ăígĂľ(ŹMĐ&K!ĺ$óĘ"ViXäwŔ +Ă´źů Ů˙×d˙Đ…{ďĹ˝7ÁÚ׊„Zîł.Ť©ŰB›Ę.“Äyôa–ĐŇ™ř€đř‹Ă~ ńA:ŤÝŔ¶şň×FV#?š6=ʵiüqńεŁř–MHž;KW·Vś¬JÍ1`AÉ ń´Ĺr~>ńnŹx|?˘xsĚĘÂi+de±Śúö’xéY˙5Ý;Ä^5’˙F¸űMˇ‚4ld䑆Đ[¨ë3ü<řgá¨ü:ßSÖŁ7w†5gŰ…;FF?Śř÷9¤ąÔeřđ‹UżÖŇ)5ťUhîÂgCŚŽ:nă§Ő ZđĎ‹Ľ§h,˝}+PŇň¶—˘=ĘČ{ŔGtÔ>(×ü9ˇx xBęmAŻ&ŢŢş«śuzqŚňs@_ÄďjţŃü)…2ZËqa’Íĺ«;UÚĽÇ,>&xăUŃ´ j:'Ůěou›D»Ľ™!ViDÂäŔÜk…řŻâ/^·đŇé7^{YŘ,3Ź-“c€8ů€ĎNŐÄŤLÖ|?ŕŰm6çÎźOÓ– •ňŮ|·  ĘžFEtßí×Ä“|<˝¸DŠ÷Z·Ž;‰#\d“?†öĹwž&ÓĽee}meŕ›­#KŃlŃV8]×t‡’ŕ©Çáׯ~<ŹĆŢ(±şĐüş=×™}¤[2ŘyR Ęž™é]µ/€üw·­Ëˇjm‹Ëv°r2§' óŔ Đřź-Îâď ëšsÁg¬joŤ©WF`P7Qßv3×U_Ťúţ©˙ äZÚŰű+uĽżgڸݜç8Ďë\'ŽoĽ3ąd|hémh«ľyYżŇcćÚÇǶI9TôČ \ń6ťă++ëk/Ýi^‹fбÂ8—N?˝{ń…âý:(~(x Shí˘Ôݤőm2SnOżŢĆO`+Z—Ŕ~?»Ź[żÖĺе6ŤEĺ»DX9SŚ€yŕrúţ·áť+ĆZ5ç‚ěĺ[M5ăyfvlÝ ž§I'đőÄr(¶‹n3Đí1Ŕăśţµó“X‚xµ{ʆ/Ľŕ»­_MńMć ˛#´čăa»=qŚŹSŠń;ŮţŐy<ű?6F}‹Ńrs@ŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE-´¦Ţć)”cpŕř9­ßř˘oëíŞ\ŰÇm#F±ůq±# ßšçh Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Šít‰¬|U¦[躉ŠÓV·O.ÂóVAÚ)?ˇţ˝y=BĘçN˝–Ňö&†â&ÚčÝA˙=čµQ@–ŕë;­ ßV×uČô›k§t¶fiÚ]‡ p¤`Ĺ^oé÷öó݆|I«¨F†AhÖonŇ(ë´±äűTú·ü“O˙Ű÷ţŽÎÚÜMisĹ´ŤѰdu8*Gz`sŽŤ˛:•u8*F>”Úô˙řXţ+˙ ŻţKĹ˙ÄÔş®§sâŻ‡Ţ »×<«‹Í2Kg·¸*:‰c.T1ţzP•ŃO†'žhâ‰KI#UÉ8˝jăáß„´[»]'Äľ'ž ruRRun™$=ÉĽRȨ®¬x"ţo·†,ç‚ć0¨¸ŤłĚgyĆqÇQëĹvQü<đuΨúź‹e.PîL€rąĆ3˙?ťyhč:.ŁŻęÇGµ{«˘Ąö)Ôäwľře©ÓZż:uÎŹ0ŠGăË Éf9ç3Ĺ[đ†‡ˇÉńM˛đg‰5-Żo)šíc«x”úĐ•ÜÁ-­Ě¶÷cš'1ş7U`pAüj*ô˙ü=Ĺ‹âk‹˝RX'°ş+çI‚¤nbÎůöőb/‡ľńµÜ> ń$·şµŞ ˝Ä[Ŕtŕ~|őą (˘˝żŕ-žŚ4ýq廸]LÚH—PľX˘ďŽOµrZ‚4Żx¶{?jÓ6‡kn../n"Ă(îŕs˙× =˘˝/Rđg…/´-FóÂ>${›­=|ÉaĽQ‘{ě$/?ź§Ż4 Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ×H†ÇÂşeľµ¨®ők„ó,,óącĄ“úëÓ“Ô/nuŮnďei®%mÎíÔźóÚ«Q@Q@Ź«É4đOýżčá\Ĺih>1łµĐ­ôťwCŹV¶µw{cö–˘ŢrĂ*A<ŐßřKü)˙BGţUĄ˙âi]>“˙$ÓĆßöă˙ŁŤW˙„żÂźô$ĺZ_ţ&©kŢ1łşĐ®4ť CŹI¶şt{“ö–ťĄŘrŁ,<Đ'głÝÁ ·úůR?/ĚN'Ďz÷;˝fâ÷X˛Đ~#x%oŻÝV1{j2ĺN9}3Ξ+Á«˝˛řµăM8ZG©‡ 6¬˛ÂŹ ďĎăš@w~ Ń,<ńĘďI¶¸Ě3Ů0¶óY‚¶Ň}@VǶ+ËíĽâ+ź¶Ś¶SŤAd!ťĂÉŢ_8Č=ëăSľ¸ŐRšîgżi<Óp\ďÝŘć»>-řĘM?ě‡TŤ¦e…„˝ŹÔs@G„ě.4ź‡źl.äGą·ŰŤî€9ďéX?ł˙ü”»?úă7ţ€kʰń&­aĄę:u­á[MGţ>˘±—ţA#Żb*/ëz‡‡µ4Ô4{ŹłŢ"•Y6+ŕĂ?Jö/‡Ö7:ź…~%ŮX©{™¦tŤGV??Ëřôükťř˘jqřú+é`žÚŇÂ9MËĘ…e …9ď’=Ş×ĂmjKO‡Ţ8Ľ«¤Ě“ĆŰ‚ą~N@ú×/Ż|Mń^·¦µ…î¤VŮ×l‹ k´@Ďŕ0 vçŽűĹ^8kL0ąµťáAŐsŚÄ~uËü.ŹĹZN˝{u iţt¶ÖäŢZÜ|…â'8ÚH$ťĽ`~Ľň:µ¨čŠ_č÷Okt ¨uÁČ=A ŹcZ÷<ńŢ%řżňµ1‡ĚŠ5PP \`ŹŻô I¶Ňü?ńBÖ®?á—Ăşť”/0¸Ź+ 0ÉÁŕŁ‘ŚŹZđęěüIń/Ĺ!°{+ý@-¤GkqîG8öÎ+Ś Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( śÎÁQK1čɦս+PąŇµ/¬¤ňî!mČŘϱB2(Ą8#f JŻR»Ů4+?mÔ´·±şĎüL-$m«¬©ţĎ·jĚń.łeo§`xtĵX5ĹËžîAüGŃAč)ÉŃE€őm3VĽđ·ĂĎ\hOµÎ¤÷Os7”®Ď˛@Ş2ŔńŠKoÝje¬|^WRŇ'$Q#ĹččTU[ţI§‚íű˙G ć)Đ?„|$]ŠxŘŞg€ÚT¤îsÍPń­¬ôIumZ‹Wł·‘c¸Ä Ä[…;Xś‚xĎ˙_ŐÓé?ňMc Ô ş9©üxŻdřáâmbßKĐlˇ˝u¶ÔtŐ{¤Úż˝''ŚŹĂ€ń{«;›Aş·š"îC"Ü=FzŠsŘݤ0Ęöł¬SśDć2‡ý“ßđŻNřë˙ľ ˙°Z˙%©jg„ôťe~Ó<·»ĽËUµ`Öŕg–9>ťŔ®FÎÎęúo*ĘÚk‰qťˇsů öďřĂ^·řUá{ču[˝@H—Rl_Ţ ĆáYúŽł?Ăφ~ŹĂˇ-ő=j3wqxcV}¸S´dcřŔď€sšńű»[‹9Ě7KìrˇF©áҵ –†ÂîA>|˘°±ó1×oţë:Śż~j·úÚE&ł˘J­Ř@¬čqqÇMÜtŕĐÔ|S¨x[ŕÇ„ćŃÚ8Ż.Ä'dѦXťąă’ĺ@y5†Ťmđţsu¦j‘x–;Ż,ĚńşÄŁ#ĺ9ŕv<çÚą›/PÔÚÂĆęéSďagŰőŔŻUľÔ.µ_€—÷×ň™®§Ő÷É!n?/8VîŠß.Ľ-¤Eáë-;Ă:uĽc÷’şŹ´qĂÁĎ^y9ÎhÂí­[űN[¤xŘʱş0ÚĂ'Đ×UńoĂ–>ń„šn–%ÂyŤ¸äžk¸řál«ŕ»ůţĚú…Ě{.f·ĺ$d1ňq–l{W?űCÉF—ţ˝bţF€<Ί( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ç#Ç»Ëv]Ăkm8Čô>ÔĘ( Š( VÓ4›Ďü<đĺľ„‘ÜÜéŻt—0ůŞŚ›ä § G¨?á\xŻţ_ů1˙^aE0=?ţÇŠ˙č˙“ńU>§¤Ţx[áçíőÔŽÚçR{T¶‡ÍWgŮ!f8RxĹyMW¬x»Wđż‹ü§]OŞËgŻiv"fb;ea€pF9ďÍy=€öYu_xךx—WąŇőM*Ü@űb-ć¨daH9Ú¨Éâł~)x›Ăš·Ľ?Ąřng+`ěľLá‘Â’ÄIĆx'­yeëzż…üKđÓMŃuÝV]/QŇ|Ć‹Yz㨎A¦čú׆|]ŕ­;@ńeëéZ†—•´˝îVCŘţ8ű ćĽ¦ŠőkţĐĽ ?…Y›şîě}+;ű:óűKű?ěŇý·—äíů·zb«+20d%X‚5Ú˙Â{7öo™ö8żá!Ůöí<|ţWÓűý·zSĹ,:¶ö†ńn5„ÝGůanË»ąő¬:s3;rY‰É$ä“M¤^źńgţJ«˙lżôRWW§üY˙’Ş˙Ű/ý”Đ:&µ¨hwfçJş{yŠí$A„A­ďřXţ+˙ ŻţKĹ˙Ä×!Et ßč^×&Š%Ô/ă¸K—Ť rV qśĎřaá{/kÓiw·S[HmÚX<|θůN}‰?…_ńßü“˙Ű÷ţŤZç|¬`ř»IÔó„‚u2öĘ˙řé4Ńü-đř»YÔí5)¦łŠÁĆá!lçŹáoĘŁđ?Zńv­¤ę—Ű[ii+\Oo^Oá^źń ÓáţŤ¨ŢéäyúƵÚl8ůl„}7+ßu/Ä4´đç…|WŻYČľo‰|ˇçřZ?›Pd4€Áđž—a«|ą‚÷PţĎÓSid¸•w2Ć1ŐŹőĚëŢĐçđ}×<­M¨ĂdŔ\Ĺ<{X91śôäw«p?gKŚş Ďćµ²OĂĎË“gÇá-Sđß‚´áxuďk˙b·ąr[Ú$§ŢĆqôÇý*/řNĐěô}gJŐZűĂÚ„‚?<¦$Ź×Žüě9Ĺt‘iľđwôV ż/őHĽÖ’F>L'´đ@?6ĆN5sâ´˛Ďđw@–}"Éąl˘]˘5+.8ăŽĐń¦źářcáŘî5{Čě#Y ŚË-;`đĂoĄy÷‚ü§_řjçÄ~(ŐMѢ—ČO*=ňHÜtŕńÎ:ý1[Ţ4¶žóூ䴆IŇ&“Ě1)`ź{®:t5SŔz§4ÜÜÍ Űë^¸‡†V Uú’ËÝzŕŹp Żx;GµłŇµO ëB˙K˝@Ë.xŰ8űĽ:öă®k?âw†-ü#â—Ňěç–x–“|¸Ý–úWgă/č/á7Ć:N™sˇżŰ&ł›8qžŞÓ#gŠ>&đŽ——-łrJä.c-Śíăß˝kjź| ęŤ¦ëţ*žŢöVýĘ$Yˇű¦C´€O^ÝéĽinöź>[ËŹ2ŁŤ±ę¸Ś^ŐŰâ^ RĆća}"˝»Ga *Áǵsž=đť×őÓ§ÜČłÄč%‚tˇčqŘńČ®n˝[ă¨ű$^Ň®%Y5 5R䓜(çńVŻ) Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˝ _é:ŽÉő˙ ǨěT–ĺ/ä‡ĚÚ0 PÎyíß˙Â_áOú?ň­/˙Gü%ţ˙ˇ#˙*Ň˙ń5ŔQLŹĆ&˙Ř`µ±ŹOÓ¬Q’ŢŮ$2mÜrıä’qůW9E€Ů×üO¬x† u‹ÖąŽÉ pŠ»@űŁ““Ĺ݉őŤWG°Ňµ Ó5…Ţ-Š»€ ăŽI¬j(Y|CŞ/‡A_ń*i|ó–ż×v7vő¦éZţĄĄiú•ŽźsĺZę(#şO-[ĚQś HűǦ:Ö]×řcâ7‰Ľ5b,´ŰńöAť‘MČ?ÝĎ#éśU/řĎ_ńŠŮë:‹][,ŢzŁF‚3Ć ă8®vŠéü=ăŻč\şv›~VĆ@ŔĂ$k"®î¤nËšg„Ľk®řOĚ]óˆCąáuŚqŚŕô<GĄstPCâżëž+xηzÓG&8•B"PsÍiŘ|NńmŽşm¶¬âPÍ3˘ú#5ĹŃ@ď„üO©k<-.»|˛ĄśńĹş˘@{~¦·üiń7Äz/‹uËSŚŘýˇĽ’cI6dv’|úŠň:(Ö§wŞ_My¨\Iqu3ny$9$˙žÝŞ­PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE©áÍ*=gRMy¤˛!ňZQňĽťžŮő  ş*Ρes§^Ëi{Cqmtn ˙žőZ€ (®»á=ŤľŁńG¶Ľ‰e€»ąF¬lĂ#ż*(‘˘˝Aľ$x§qŮ©*.xU·‹ =ËMÔ‡‡ŃľĆé~ÎvÍyGѸăń  tUË˝.ţĘšňĆęŢ'űŹ,,ŠßBG5ĄĄĹěâ;yn&<„‰ ±üAEYľ±»°”G}k=´„d,Ń”$} v^(đĆź¦ü8đηl&űn Î&Üů^3ŚÝ(„˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ĄČÇZJÔđ櫍© ÖłŠîXĐů+)ůRNÎG|zP[âĚÂa˙ ?üŚ|}›oúß#ţ›~¸ď˙ŹWźUťBöçQ˝–îöVšâVÜîÝI˙=޵Űü˙’—Ł˙ŰoýőÄW]đžúßNřŁÜŢJ±@Đ»Z6Q“Ű–FŠěῊwšjşç†[°ĂÔ|Ôźđ®cE‹,˝qČÔÇ ĐEđ»EÔ,ľ6©áe˝¨ÎÉö«¶ɉI\.Aç+ś\öĹikVą¨|8×íüwq¦ŢÜÚB×V70:™•KpŁĐ:‚Ey÷‚üC j^ —Â>/š[;uźíw±¦ď)Źb>­ĎŁśM~ÓŔ†.íl/$ń·><™ŔhŇßߎ~9ÉĹuzŹŠu |đśÚ;GĺŔx„ěÚ4Ë·\6AǰŔÉă5‡đÄ:_‡Żuą5‹ŻłĄÍÁňŮ÷9#ĺŤkřSZđöµđâ/ kzĚú$ö÷ 2L¨Z9ÜpŘę>n„Ž‚€:żz¤ß/źĹ—Z~ˇ«XÜĆŃOlCVt\6ÁĂ7n®OÇźňE|ţüźű5O­ęţ Ň~ęţđţ©-ĺěłÇ)’H]|ö…Šś`žÝűáx·Ä:]˙Ă é—^fˇdÎn"ňŘlÎqÉ={@}EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEĐŮxwűKĂŹ¨iwhĽ¶$ÝYíâg‡_ď_J稭_čwzö -­UQľYꄉVcŘU}b KmNâ:ĺ®­Q¶¤Ĺvď㓏Lć€)V—‡4{Ť\´Ňěʉî_hfč I?@ ü+6»‚˙ňRôűm˙˘^€,·Ľ,ŚUün»ÁŰĄJĂ>Çw5â˙ \xvX$Y’÷Lş]ö×±.AÜü,;Šmnh^,Öô+w·ŇŻŢY·(®3ę7ŹÂę ńÄű‡ť¨$ŃçćŤíâÚăĐázW5ńSN¶ŇĽ}«ÚXı[«ŁŞ(Ŕ]Ń«a–\ ÷¤ Vtë­Jú;{©›dq Éc^§ĂďÝjOˇZxşW×Á1ŚÁű–uPq‚~ŤW~ čV:OŹî-uyĺŹÄVO,QŰ*f6MśľězŹc@mâŻë~§]´[o´‚br98ĆxRzd~uĎץř§F·ńWŽm´ß ëÚĄŐIJ›x¬ŘîÉÇtzzZ1|>đ]Ö¤ú§‹Ą}|ĚąiU'čÔätW˘x#áËk^%×tMZw´»Ó˘f1´¸ ’>éČ9ôŞ^#đ߇–ëNÓ(’ďY·Bâ9â۸뵰8÷őé\Ç</îŻäÔ.—LŇôŃşňćUűť~QŰ<Ąq´W¨Ďŕkz5ő×5éµ Ë2KksFuJđÓéĹyuQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEwHÔ®ôŤB+Ű LW‚:PGp}*•Öř‹Ĺë§›-"Â=2Ţŕů·‚.łÉßžËč+’˘Š+·ř/˙%/G˙¶ßú%ë­/kąiŞY…3Ű>ŕ­Ń~ ‘řĐę+ ořYŘłř!w“·U•F}†Ţ)?á/đ§ý ůV—˙‰¦küh˙’—¬Űý•e|cád`Éŕ…ÜFíVV÷y®GÄzĹĆż®]ę—D÷/¸ŞôP ~čż Î>x÷ÜOäjŻěósżÄ “˛«Ďi,Qn=_*Řü•«Ó|CŞişEţ™euĺX߀.bňÔďÇNHČü¬ŰyĄ¶ž9­äx¦Ť#ˇÁR:iívzÇ—â¤Ó-~Ů&­Ăk+µČ}Ĺ0ÝKŕ«ËË˙Ú ęăS±[ ƉĶË(”!ŞýáÁÎ3ř×˙ wĆ_`ű7ö˘çóĽ„ó1őÇëŚ×+˘ř‡UŃuŞé׏ wfwU‘ŽďĽNŕA'Ö€=ŕĹĚ˙őť•^uąŠ-Ç«ď ŹÉZ´ěőŹ/ĹI¦Zü/˛MZ)†Ö WkűŠ`3şĽcí—űí«3Ą×™ćů¨vůÎF:sé]żü-ß}ěßÚ‹ścÎňĚÇ×®3@˙oo/ľ"xňçR˛[ ÖÓ±%şĘ$˛ŞŹĽ8=3ř×ü#ą‚ÓâF…-Ó*ĹçËt ĘĘż©‘Łx›XŃ®/n4ë׎{ŘÚ;‰VF‘IÉÉ`y'żZÇ‚8"€=ŰĹÚ´6^1ĽÓ§řkg}w,ěcź’nC;;çžx9«şEöĄ}ńçN:Ö—™wśńy1Î&  9 ¸zç§µy˝‡ĹźYiâŇ=LHŞ6¬’ÂŽę1ýâ9üs\őŹŠµ«ľąo'ö«îÝq"¬„ä`đŔŽśtăµnřMŹü.+““«źűhkÓt´7ľ8ř٤ÚČ©©^Ú•¶ŕ’ĎŐÖĽ"ÓU˝´Ö#ŐmćŮ~“yë.Ő8|ç8#{cbOjĎâ×>Ű"ę¬ţa¸Ś;±Ž€Ó¶1@^đOu˝^[)`¸€1‘ç ǎűÁçĄzGÂY#O‡^,˛M:ß[Ľ·ş=‰l‰ÓĺýĆ#ŽHµÄjß<]Şi­cq©…×d†•Ć9Ë‘řbą}[Ô´ ő˝Ńî䵹®ôÁČô đG± gđw‰n¤–úëĂ ěí¤·…„҉Ä?.y\˛€zgŐŕőÚx‹âoŠuý=ěou–˛ ˛$¬~`ô$sŹl⸺(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘źo+ŤŘöQ“@ ˘­Oawn»§¶š5őd UZm5¸“O`˘Š) (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š }đ»C´}KM±ąđőě’ę¶Mw6łkÇmjĂ D@…óŐ—Žr>v†)'™"…I]‚Ş(Ébz+čÍâęÓJŠÚ9ĺyk±¤ś888 ŠęĂAÎę.ĚĺĹMBÎJč؆ÎĚxkÄz‘±¸×¤ÓFÁ§YĽÄţô9Ćŕׄ|KÓcŇőKHííĘŢhĺmĺŚ,Đ™fŽB:˛ź—žŻh¶™l]źK†=>Y9™ísL竹’p?*ňż‹đĚ÷–w{ˇ biz€ůÝ´úóÖ¶ÄBJ.s# 4âäˇó<î®EĄę¬ ŤÓ¬ůňŠÂÄIŽ»xçđŞuîz§‰ő |đ”Ú;¤7—âűA@̉–$.x!*óĎDńs§_ ϱ›;‘w˙< MżţůĆj;Ë;›Ě7¶ó[ĚJL…C^çâ/j°ü*Đxg^Ő'Ő Ü–í2 RËűĎO÷ýhËlt˝CPWk «ĄOĽa…źo×®řnÚŃ|Oeo®ÚÝ˝§śx"Sć‘č\çkŮtVřuám"/YiŢӭ㼕Ô}ŁŽ† FzóÉÎsW¦¶ˇYŇ•ěa^‚­^Ö>†f Ą€ d“ÚĽ{â^«öÍyŕ¤[xŁEaČY’Ćůpk”–âiWlłHëčĚH©/ď®u Ź>ögžmޛ߮Ŕý+Jř§UrĄˇž ©>fő+W ř·Ä:]˙Ă é—^fˇdÎn"ňŘlÎqÉ={^}Erťg{®kúe×Âh\îÔí.Ą’x|¶´„Äm<0č{Ń«ëúeÇÁí C†çv©m|óK–Ăj&ěm?xt=낢€=łÄWţ ńüvˇ©řšçH–ÖÝcšÁ˘,ŁÉAŚdç¨ĎqLńŚ|-&żđýô‹·]7GbłoŠMĐ ňÂçŹáOL׋Q@ǢřĎA¶ń÷Ťu)ďöŮj6ϬžL‡ĚcŚ Čü@®Cáµ§řÇ6š†Żqö{8ă‘ZMŚř%('ݵqtPmáŹřDőęóx˛îx´Ů ˛@Ń+|ě_#8Ž2@Ç_Čéü7ń&ťagŻhZĹťÝ߆o>y%Š=Ďo€íŽźĂĎb+Í«©đ/ŤuOsöH şłşP·· ” ţG“ůň {ÂđU‡‰f·úŤä¶ěň\ÜDZaňŹ”rI»Wś|4ń>“eĄęŢńJ¸Ńu0ÎŤwd'˛śó‚ŁŠ±{ńRH´»«? řLĐŤŇ•škeůČÇbÇëŠóZöM'Pđ_äľÔt=b]s[–ŠŮDER ÝŘôě3Î}†kÇ‹1f$±9$ő&’Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(®çDđ}•ľ•Żâëą­-g­¬íŔ7 ýîxU÷=}¸Íß´ř#ýWü"÷{:y˙Úć}výÚ`yÍŢëž·źC—]đ”÷7zt$‹‹{„ÄĐq’r8`3Î:{óŽ Q@V°đö¬|’-{QţÓ“ěz›—’ěôxĎ*űĚA:~‡'Ĺ^!ţŐňl¬!űŤkĹ˝˛˙čmęÇúýI`kÉ˝§fGö=ÍÂGh:4Óü"ß |;ĆŻy„k!±™`%§lmăô® -6äü›PţŐ˝Â˙ËűG’NGÍëžţ•µăKiď> ř.KHdť"i<Ă– ÷şă§CPĂ˙&é?ý…óZŻeŕ IĐ,5k“i˛ß®ř-mâ.áqś°Á=Ćxă¦sPř÷áöźáżÚkš~¬ÚŠ]ݬPş€˘dv×wË[4]G^¸ĐµÝÖ{ý.{ăOł#IĺIä™ ?")śV÷ÇR~ÇŕŃž?˛×ŹÁkKS¸Š×áŻĂ;›˘ęä'˛¬„źĐPlźĽ/ářm ń·‰%łŐnPIö{h‹é¸í?™Ç|tÍej__Lń΋ŁĎx.4˝UÔŰŢ·㑑‘ę9®|rŃ5Cńćńm§¸µľXÚÚHи`WhÇ|Çľ{×ivŤ¦OđźFż\jČ$‘ ů˘S´?ËţhŠńŻ‚ü'áh5YüCq6ą-oh‘äź”HÁHŻ=E&źŕ- KĐlu/k’éŻ~»íímâ/&Ěg-Á#·n=sX_Î~$ků˙źŹč+×~$ëvV±hş‘đu¦żasfžUăvw ÷N:‚=r}(Éţ ř)|5ŽŁ¦_.Ąˇß‚mî@Áű­ďţŠâëÖ>&ęz”ţŃí¦đ¤:”÷>}ľÉÁ9Úů_/®wnĎřדĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP{ˇřŢŢ}- Ű\ÝéĐśŰÜ[ľ&ŚĂž3ÓߌYű7‚?Ö˙ÂQwłŻ‘ýžţgÓwÝŻ9˘ηă +}*}#Â6“ZZÎ6ÜŢ\n.űĽp«ě:űsžŠ)· ř§YĐ,Żí4›Ö·‚ővNˇTär2 2=~•Řü(ÓÚâÂúm ĹCGń `±ŰLBE4`gśçw~Üc§9Ż3˘€>€Ő/oü9áËă_ZęZ¶ĄfÖv––ňŘ0$>đ$ă°ä׊ŻuEđăh"ëţ%M/ž`ň×ďúîĆîÝ3Y4POáďx‡@ŇĺÓ´Űň¶2#Ywu#p8ţ\Örř‡T_6‚.żâTŇůć-~˙®ěníÓ5“E{o„4˝\xZĹüăhQťsyexęžKž»T†Űýzć¨üYÔałđN—áŰťf=c[†öňxßxSµĆ í÷ŔĐtäP¶»âS^K%Ő®ľĐ¶q Z®ÄľP3Ó˝Ţ!Ő/´K"ęëĚÓ¬‰h!ňÔl'9ů€Éęz“Y4Pkˇ|Nń^‰¦-…–Ą›t]±‰˘Y cŃIˇČ¬)|K¬MâőÉŻ¤“UŤÄ‰;€ŰHé€F0=1ŠÇ˘€.jÚ•ŢŻ©\_ę2ů×s¶ů$Úqúü+ˇđ·Ä/xb×ěş]˙ú'$A2 Iî3Čü+’˘€6|Oâm_Ä÷‹s­Ţ=Ë *‹€Şý• ƢŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šítź…ľ2ŐôŰ}BĂEi-.IµÄIąOC†`p~•%÷ÂŹXÚKsqˇż•îm—HŘöUrOŕ+ę߇kź‡ľ˙°]ŻţŠZÔľR6•YQ›?(`OéJŕ| E}ńÓᥬ±Ýř›Ă(Q‘ZkŰo-‘H´‹0{‘߯^ż>Ó˘şŻ‡ž¸ńޞöÉ2ŰYۧ›urĂ"4ö÷?ĐžŐŮ „żhţĚű~Żćłű@źÝîÎ3Ó÷ŰŹzň:+¨ř‡áüŻ}ŠIEĹ´¨%¶¸D?Ôw˙ëÖ,NĄqjn`Óď%¶Q“*BĚ€}@ĹQ˘¦µµ¸ĽCiłĘy cř ťtťEí^ĺl.ÚŮ3ľQ \uÉĆR˘¶Ľ! Oâ]zÓNĚEš@’L±@˙~"§ńW…o´\ižMͤŢL3 vQ9˙dsź &€9ę*ói’Ă<­§Ţ 8•Ě-¶3ţŃÇŤvZ¶•á»­Â6Z=ާiëĂçÚ)“{¨Ęú·#Ž ?˘»xN]?Ć:ľź Ř_\YYş¨dŤĄ+”VäďX~±ŹPń6•atCqypvł…?C@tW˛x“Hř_áínëKÔ#×~Őn@-/*`ýŻ8ń‘đůŐSţ1x4˙(nXßćdçđĆÚ¢Ż6“©-źÚŰO»Ďśa`˙{ŞhŤ#Ş"–v8 I>”Ú*íö—¨X"=ýŤÝ˛9´вúdWOáĎ^k^ŐµĄyâ6j­żŮ™ŤČ?Ý9 4ĹŃRO ¶ó;™ –xmć’±ćHJ¦}OA@QWo4­BĆ$–öĆîŢ'á^XY} ŐXŁy¤XáF’F8UQ’O° Q^đĂÁK­x˝4ĎYß[@öĎ2†V‰‚˝2:sOř?ŕŰoj·7ݵËé6¶í62‰6†{ô9ŕPžQ]7ŹäŇßZOě]çE· Đ\–ŢÍ“ó|Äŕc= s4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE÷WĂĄ˙‹yáűZ˙č•­ÖZĆřr?âÝř[ţÁVżú%ky–¤g)ńqŕŘ2ë˙E5|=_s|GńoĽO˙`»ŻýŐđÍ4&zĎĂíń|ńĶńôĚüă÷xý דWiđÇĆ1řSRşŹP·7Z=ü~MÜ#“·ś0ń’1Ü]AĐľ­ŔÔďMží˙aňŰű™Űśvţ˝éĚx.ŇűĹ3đî›â ‹ë‹&oÝ­ÄŚĂËUÜU7tR+¨ń_Ĺ}{LńťŐ¶ŽđŰi:|ćÚ;! luC´äă#8ěF+Äż$˝ńî—­i¶Ć +lv¶ÍÇŢÎ:Ŕ ŢŐ­~ř‡VĎŻÜX$ďćÜéţCo.yl8ÉÎqž§‘@m¦“ggńżEÔ´čVu]:K¦ŤFr§'ăëšç<;ń'\ąřŁ–ŇBş,—mf¶K …DÉUÁĆsĐőőŞÚÄ]*óâí¶µxíc˘ZZµĄľčŮ]§Ş‚rI?†+„đö«eiń&ÓU¸›e‚j>{KµŽy9ŔéŰ ÓD¸źĂźîtÍ"Soes¨Ą‰TaťŰyžŐwV×őMC㝎—yvŇŘYę«äDU@NťŔÉükŹÖ|OeĹ×ń‹›ľIÔ…*]3€Ř9Ćz×M®j^O:GŠôÍrI„÷ë5Ü/Ź!@ĺ±·=GNzń@ľ1xçZoë>¶ž;}!Ęh#‰yś333’I:rµż‡´9aH™çbş–lq…ĎôŇüHÓţMămNM{YŐíő6dó˘‚ QNĹĆĂŰëźřgáíVř®Öút“_h–›ľÔ 4¤aŔv=» ĺľ(j¶Zߎő]GK›ĎłťÇ&Ö]ŘŤAá€=AíLřqâá[jm–ßkE'[ŤB÷C}I6É`˛© ăíÉ zž~•ÉřZ-Ă?µű2öÖˇ˘Ćť,¤˘‘Â6ŃŘ}â°#˝eÇŁ|/]HëâźOŢdag?s goôď\熯Ľ7ŠuUÖtÉmt[Ą)fÂGv´= śŽ{ŕăµw~/ižÖ!ń5­źt‹”ââ=¸·ÁáŔPĐôŔÇZá·‰µţxžT˝q&–¶gjţčz9üsLÓőŹ ř ĂÚÄ_®5éďˇh˘´‘g#'°ëĎ9>•Íü,ń‰k˘řĂŢ$ą’ÎÓTE r[c śęLps@©¨]jş„÷Ú„¦k©Ű|’ăëĹz÷ÁMDiń–˘aIÚ×dÉŚ©eV+źÇÇřwOđT^/Ô­µÝVytHŁo˛ÜĆŚ<Öă®#ŚöÁ#óí> ËĄŰř'Ćͨ,˛čűŐ%ăç1ĂěéÖŻ"‚î »ńŢ úb—B»đ'Ăůn5­/Y›\ÔÚ&[8<’ľ^î2ÇÔđqś Âřyâí-lőÝĆĆ—¬7śÓĆ™1KśîŔő GEw<}¬ř‹Ä“éşüÉ{Zxf1ŞĽd@ŕúVGŔ=wRZöźö¦űťŚ“ÁŃ„rs»8ĎçWĽ }đűŔĽ“Çâ5 ›„1ů˙g}¦sŹ”’@ü»wâ~x‡Kđüž :˝×ŮĹŐCîŮ÷9íňŹĆ€9 \Ô|AöÝbĺ®n¶óBüŁ ŕŢłh˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€;}#â·Ťô}2ŰOÓµçŠÎŮqFÖĐɱGA–Bp>µlüfř€ća?řo˙ĆëĎh ×Wř§ă]_M¸°Ôu×–Ňá r˘ŰCĺ=FUÁú×EQEQEQEQEQEQEQEQEQEWM x¶}ÂúŢ‹´REŞ#11č;ő®fŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘µ|7¬>‰©‹•†+™LSC*‚˛FzŻ·Ö€2¨®§Äںٮ·áćiôiŽO/j˙ÜoC˙Ö'– Š( Ő>xĹŃ]t|« ö¨zßtďřU~2˙ ?ţMC˙ĹÓSĂľ(ĄĽsµÉ_쉎§ZĂľĹ|są€Č_쉆O§Z`đ»Ć(ŚíŁáTdźµCÓţű®*Š)Q]—ĂĎ˝íŐíâéú=‚oąşqÓ©Ŕíś ű~5ÚxoᧄߍxÍŘ|=đ[řŞ[Ë‹«ÄÓô‹ó.®ÜpŁ“Ű8é]ü>đö˝Ą^Íŕ=~mBúÍ ’Z\ÄQ¤QÝrţ‡ś(Ë(˘˝+Â>Ňuo·őmbM:nZ9بeűŁ,IzóZ+×%řiáËť*-LńAMÂęiâýäd`ŞÉ$‚;޵“âďčÖţ_xKX“QÓă”Apł&×F8öäŽî yÍ麀4=/@±Ôüw®K¦µúď·µ‚"ŇmĆrÜ:ŽÜdsž+â‚Ă–Ö:¦•~şž…ţ˘ä Ýv°őŔ?‘ŕb€8Ş˝&“‘«%¤«§K'’—|Śüü úđ*ôh:W‡ě5/k“i˛ß®ű{X",áqś°Á=Ćxă¦s[źô{}஑kc|—öMމ ¸AŤčÉ)Ł8ü? ńJ(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ŐđŢŽúަ-–h­âU2Í4¬ÇęŢ˙Jʢ€:źköífş'‡• Ńˇ9f<=Ó˙}ý˝˙XZŠ(˘Š(µOx8"†đ6ćżµć>˝)ßđ‘ř7ţ„Oü¬MţÔřŁăEEÖ0Ş0Ůaé˙|P˙|bčČÚĆU†ű,=?ďŠ`â/`ľÚÄ`7öĽÇץqTQH[řwi.»đ‡Ĺš&–wjž|wpŇ Řp>»}~µŁű=řgY˛ń]ÖŁ}csgkłBLń´eŮ™HĎBkŹřOcow©]´~$} YHÇŘ›!RV=C1ę8/|çśb˝SI»Ö|/=Ćąă˙Ů]Ç–¶vňć9Ç!@\ś SČ 'áý´ÚÇÁĎi:V_SÎb_Ľńü‡×î7‡zO€:eő§‹nµ[¨eµÓ¬íeűDŇ©E>\žüřWśhŢĄáýAo´{ą-nTmܸ ŹB{ßń/ÄŹxŠÉ¬ő GŽ0ńCĆę@ÉúgŹ.‘¨ęš†·e§Nt¨ćmňŞü±ääôČ®úGěéqďŞćµÁŮř§YłđĺÎmzɥܶů!ÚĽôČÝŚ€p2íő¨—Ä:˘řq´u˙¦—Ď0yk÷ýwcwn™ ďE˙“y×˙ě.źĘé:~­E{w~f†8tOçżű1\‡…ľ!x“ĂfÓKżĹ§%a•Ф÷\ôţU‘â?ęľ$˝zŐě—SµK`*Ź@Ł~€=#ăľźw¨ŢhZÖź—MĆźq<@˛«dśqÓ!†=p})Ţ1Ó/4ꀶÔ#x§:—›ĺ¸Ă"˛ĚŔŘŕçőĆř_â'‰|5eö=2˙ýglSF$O÷sČútŞZ˙Śő˙X}ŹXÔćŰĎűNĆŤ$ÁČĆ Î=¨ž˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Hˇ’_őjMIö9˙çźę+Z$ƨ˝§Sěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ©ľÍ>ÍţD»:îŘqůÓQoa6–ćŘç˙ž¨Łěs˙Ď?ÔVŬ3ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠÇű˙óĎő}ŽůçúŠŘ˘€1ţÇ?üóýEcźţyţ˘¶(  ±Ď˙<˙QGŘç˙ž¨­Š(ěs˙Ď?ÔQö9˙çźę+bŠĂ–"˙X¤Tu˝* #dn„V QE (˘€: (˘Q@Q@Q@Q@Q@Q@Q@Q@Q@߀­"ŠÁ5Yü={Ż´w±ÚGk`€HňZg8$…Ŕ= @Że˙„wO˙„đhżjýÉO8&áćcÇ˙_ŇĽËáË]iú2HŹ-´ÎĆT*ŰXˇŔ Ç888őĹt{ăóţÖmâ:8Ä=W9*=3ĎÖ˝Pź*”ŤLňëT‡;ŚÖ©˙Há<{k¶ŞÁáëݤ˝’Ö[[ôG ‚ł!Ŕ![$u*y"¸Jő?ÍuŁ<ŽňÜĚŚ%rĚY‚ sÎF}3^Y\µăË.VîÎĚ<ąăĚ••Éá´¸š%†ŢY"ŹÝąé“Úźuayh#7V—‰>ç™.ď¦G5éß oŰKđ'‹/˘Ž9%·Ů",+¸´‘ěp ŇđGŚ5-cÂ~%»Ö<‹ëť%ęŮĺ‰~W*řŕ8+úÖAă÷z}íśi%ݝĿÝibe ô$sQÚŰOw0ŠÖ g”ň4,ÇđęţńŁâßřľßÄ%ßŮ-DđąŤU•°ç° Ś~5Oᔞ&>Ľ·đľ—mË'ĎŞĘŔmĆ>\6sŹaźZókË;«)w–Ó[ą ,eäk˘ń}ž‘˙ü9§ę0Í4ĚłŁfG8ĆÜőďÓŽŻGń˝¦Ł7›Ćń5ÍŤö§gpŤÖä ˛®ÁĂŇ™Ż˙Čĺđăţ¸E˙˛ĐŹÇ¤ę2™DZ}ŰŽ$Ű ‡ßŽ*Ťz˙Šţ k:_Ä)l¬dŽ-:ŢáQ­ÄK‰s‚ĹŽ3’IčkšřŃc—Ź.ţĚhŇfUÁ?Ž3řĐ WKÔťěn– ,† IéŚWYđwJµŐ|gŰŁĂk Üůl2®ČďËgđ­}âvµâűtşh¤Ň®®fb]ŞŚŔ g#Ż^hÍn šÚf†ć)!•~ňHĄXwäť´Ëő´űSXÝ lgÎ16Ě˝ŚWŻI¤Úęßő1|‚X-aK“ †+ `;ڰ?…aißő»ŹÄÓŮŁEč†HŮĎá\•QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEĎ×A\ý Š(¤EPAE6'F®˝§S˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ľř}ŞGäMgs!ďRŽěNá´ą=Ŕ^§N•ŰW‰Gq4vóA®°Í·Í@x}§#?Bi¦Y í.Ű}3]”±|‘ĺkc†¶ÚK™=Îëâ&˘˘ŢÚÖ0ČĹť ĄJdw;ąťzŠŕŞV¸™­b¶iXŰÄĚŃĆz)n¸úăü梮z•Is3Ş•%J*)ťÇ„uÝ;Ođ'Š4뻏.ňőTAĆ;đyń"™ŕ}oOÓ<+âë;ëŹ*ćţŮ#·MŚŰŘ 22︮*ŠĚĐí| ­éú_‡|YkqĺO}f"·]ŚŰŰkŚdŢqZţŐ´=_ŔQřgXŐfŃć‚v•eT%%qĂc¨ůştćtP©jú§…4χ§‡´=J[«ą&ŽBďŹ9ˇ$`×·z]_ĹZ5lj|w ćë}:Ö鼧YĎÉéŰ5ĺ”PIâýJÓPńÍöˇg/™g%Č‘$ÚFWŽpFJŰř«č~!ř…mv.ÝôvXŁžhăe` ťŘÓŰó®Šď¬5Ť7Ă?ŇçÂ)q¦"1`–0ů‚ädó‚>ž•˝¦˙Š-Żô÷Ôfľ’ĺ|ť9˘*‘ĘXśŽ€śă'§zó=W»ĐµX5:@—śŚŚ‚ÁwWs˙ AᯠđĆ‘¬Ŕćě/;±×¦Z»âo˙Â1ńłPÔJ`ÄqL‹Ôˇ…3Źp@?…$6,őt×[™íŇO>=9`;˝:g±Ŕ÷Ż5Őu ťSQ¸ľľÉs;—v=ĎřUJŮń†¶ţ"ńî¨čc°Ř„ýÔŽkŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(®~·ĄqlíĐ Áˇ€QE€(˘Š’)¤‹ý[R}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻEXűd˙óÓô}˛ůéú ŻW´]=µMN 4q”źŚŕIýTbç%îÄÚJě‡í“˙ĎOĐQöÉ˙ç§č+et;¸ä]#V[ˤ]ÂDX¸$ň}«ců›6¶üíŰŽs銺”§NÜÝ{4˙!Fj[}˛ůéú >Ů?üôýl¶ih‘®ŻŞĄťÓ®ăĄ*Lx>Ő™­iíĄęsŮ»‰ D|Ŕc €GčiÎ…Jqć’üWâ·_1F¤dě~Ů?üôýlźţz~‚­čú©­%ËéV3Ý­˛†ÄąŘqźČţU™X–Xűd˙óÓô}˛ůéú ·§hZ¦Ąaw}cc<ö–ŠZy‘r±€2r~5™@>Ů?üôýlźţz~‚«Őű­P´Ó-u›9˘±ş$C3.LuÇĺ@}˛ůéú >Ů?üôýW˘€,}˛ůéú >Ů?üôýW®˛ăáçŠ-´TŐn4§ŠŃĘß";Č ňgw$ŚgšćţŮ?üôýlźţz~‚´u k:v·‘y§ËĄ0S Ď»¦0H= gjW:uě¶—ĐĽ16Ů#q‚§ĐĐöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^бöÉ˙ç§č(űd˙óÓô^Š’Y¤—ýcQŃEQEQEQEQEQEQEQEQEQEQEQEżŕ_ů¬ŕúVořţF«řţ€ŐŃ„ţ<=Wćg[řrôd:•uÝÖžě.¬Ę:Şđ[;ş^+Kű~×műţŢ˙W»oÉźůéŹďvĹVđüŇ[řo^šd• ±VSČ>a«Űö?´ľĆ?¶ń·§îó˙=që]tśiÓŤĄfŐÝőęŐך±ŚŻ);«˙Ă-üŚí{Jş°‚ŇëPv7W…Ý•ą+Ť˝OŻ57Žżäjľ˙€č OńŇ\xoAšwg•ÍÉfcÉ>`¦xëţF«ďřţ€µăÂ|›^ď‹eSmÉ_ĎóG§~Í÷éöŢ*şş!`‰-šF=ćLźÂĽűâ—‡żáń¶ˇeíµvóíńÓË~@C•ü+¤řS˙"Ä_úđŹůK]¦¤Áń/Ađ~«rę×:D˙fÔ7—Ťáź\ź÷ŰWžtz•†ţęšK¨]Jmćţĺ{©xČţoüבř#ÁÚV§ˇÝëľ%ÖÓNŇíßËŮgo§${pIç·5ßiľ!˙„šűâ•ú>ëa¤É ż§–© }yoư<'Łh:7Ăh|U©hskדÜ<"ÄG†[ËÔÔPW‹Ľ ¤ŰřI|Ká=^MGLID3,ɵăb@ôČăÁ­ŻŮ\ę_ügaĎu4®‘Ć%ŹÍ[šíŰ_ü ÖîG‡­ôy.b0Ű›|Ĺó#ůĎ99ÇjÖđçŠě|%đëÁ:Ť·™Áx ŕón¤¶Xzö϶~”äţ8đ†›á[;+Ô&Ľń<ˇLöđb‡=łŚ“Đ߯Vëü?𾥿ŤĽI-ž­rţĎmá=7ť§úwôÍTń—‡Â4ÍNćw»Ńnď#»ŠńŰ~äŢ7r~㻯‰úŶ—â§~´ŐÖĺQˇľ9c?Ę8CČĆ1ž€ôÁ\xOđߎ,¬üE©;h÷Q‰ěď-âÜ&äaHçńö#žk±řćúlšňD5ÝF-\uK ! [;óŚnďרĎ|MľŐ.5/[jž‹DŠßfŠ;&PřŔnݸÁőö¦|o˙’ąű–˙΀/ęú}Ć™ńçB¶şÔ®µ)>äŤŘ9ă€+3_đĄ×‹ţ1kö6Ň,Ç)–âáĆV$dý}tž5˙“ŠŃ?޶ţµ±ái˘?>$Y x®®ç‹tV˛6Ń8U!źCąAúĐmđűÂZńą°đ—Š$şÖˇVeŽâ-±ÍގNŕź^•ĺWÉo<Î…%ŤŠ:žŞAÁ˝żÂž šoô†6j–Á›™äŽ ł śăńŻń,ň]x‹U¸žo,·rČđ† #bä•uÇLĐmQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@^ŃuŇő8/†"~RqAô5FЍÉÂJQÝ ¤Ő™»u¬Ůť2ćĎNŇĹą)ć1ť¤ČS‘ÔqÍaQEUJ˛¨Ó—O$ż!F*;¶şÍÓ-¬ő,^ bţ[ Ú<9=<Ő kPmSSžńĐFe#ĺ8?AThŞťyÎ<Ťé§EÓEëa(E;ŁSJ×ő-&ĂQ˛Óî|›mF1ŇyjŢbŚŕd‚GŢ=1Ö§ĐĽS­h6wÖšEűŰ[Ţ®ŮĐ*¶á‚8$§ň0!X”V%šš>˝©höş…ľ›säèBmîWb·„G ă©ä`Öź„ĽsŻřQ-÷e»¶ć‚D„úŕô?LW1Euz÷Äk¶7vZž¤ełşei!ň”‚8ČĐÖU˙uKýÇH»şó4ű"MĽ^ZŤ™ëČ={“Y4PäŢ*ÖgđÜz ÷¦]*2!xŃŠr0änéÇJŮĐ>'ř«BÓÖĘĎQl‹¶5ž5“Ë€‘ś{+Š˘€55}{SÖ5a©ęw’\^‚‘ńňă  Ŕbť®x‡T×5qŞj·^}đ ľZŻÝé€?Jɢ€7o|[­ßxŠ vę÷~«SţR »z|ˇvţ•ř‡V6ąöŮUi<Ăqwtč†1Y4Pw¨|Xń…öśläÔÄh˱ä†%GaŚ}ŕ8ü1\%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEFŇ®u{¦·łŮć*;Î2őP„¦Ôb®ÄÚJěˇE\ŐtëŤ.ń­®Ô ňś‚Ą_ľđΡe¦ë…‰a ¬Fďd€8üjŐ Ź™(żw"y㦻”UÍ/NźRšH­¶îḢqÇŻóŞu-%'ł*ęö +Ń>řkBÖôß_řŤnŤľ— sŁľÖÚC–ăżÝµĄřoáĎ‹.†› jµ†©"·‘ö•€Îý2:TŚň+Ń~x*ÓTńÖ«ˇřŤeĹ„ł_iŢ’*đqÓ“úUÝ˙ çź1ţ4ĺ´UËô·—V¸ŹJYZŐçe¶Wr…ľ@}ńŠő‰ ¬Ľ7ŕ‹]JÂI$ż¶hăÔ2ůPYG vůü yÓü4ŃmGźľ#Ýűq’sé]8:‘§^3›Ń3*ŃrHíő6?\é—ŠŁĚĐÜöTźę?ńęwŠ/űÁúŚŃă`”"źP˛źŇą=3Ĺ3iđę1Ç~Ôí"řňçžśöôéU×^ŰáwŃţÍťÇ>w™ţŘo»ŹoZő:‹„¬ő’wőµ—ůśŞ„î»&­éÔŐđn›wmr×3DDrÜr#Źc\ÖŁ§]iĆyŚĘ›ÔÎ=ý+OĂž&ąŃRH‚‰ `JĆÇ[Ô{zŠČżĽžţęK‹© Ęç$źä=«Ď«:.„có/řŇ:!©¶ö=[ŕm¬WŢńÝ­ÍŇZA5śq˝Ä++(,yµłŕźč’_.łk¤‚ĺ,a ·ľö9íęN+†řwâ 3HđźŤlőź&çQłX­SËfó,÷‡\u¦|"ńt×ĺ‹Uoř’ßĆa»RĄ€8m z‘ŹF5Änuź5C®|Wń§2ĹÝĄÄ»z•S,x€â±ż˛ľĐÁŻß‘˙ĆęO‡φĽ+ńXęźń#’ÖHm®|‰ !™)]»˛#$v÷¨áře˙CĄ÷ţI˙ÄPoZZ×Äx a¤°°fş,ă¨SňgßqSřő] Gń­ŻxŇ×Äzl¶úF´Ś!‘¤F•ů€InŐkÎ4/h^đWŠ`Ńu7›Yż¸k{VHŽ-ÁÚŻ»Tłc9ÉĘh^5×4ÝfĆö][Qž(&Y'ąvWPyR Ç#"€6ľÚËeń{Kµ¸]łÁ,ńHľŚ±HüĹs4˙‘Ç^˙Żů˙ôcW˘MâO [üpłń–ˇť&Ein%ň$\†'B6íÜrvžűÔÍFÇá…Ţłw©]řŁQźíĽíVŽśł+’ť9Ĺ7Vo7öwŃÍă1tÔŠŰsĆdăéŤßŻOń[Çâ-_]đ]ÉP÷Zdw–dö•IţˇĐń/‰^4·ń XéZ%«YhpŰo\ôÜGn:rzźZŮńĎŽlOĹ-+ÄZÁş·´†%r#dÝ‚Á× ĺXŹĆ€,|+€řSĂ%ń…ôE.-ŘÚ#‚šHĎďUOÚ–ńFŠX’NŹ$÷ů䩾3řÓGÖí,4Ż JNYdĽ¸+Fgbz0řžß7µbü`×ôßëş]ĆŹsöaÓb·‘Ľ¶M®É`=G=(Ň~.Řř"çÄÖďâťWS´żűac¶Ś2”ÜŘ?póś÷Żńť·†­®­×Âw×·&VşMĄ[<ňŽ1^›ă»ż‡~1Ö"ÔnüWsm"[¬#˛”ŚNyOö«„Ö4ĎZk:2işýÝţť,Ä_ą¶hÚpW*3[¦qŠÓýź˙äĄŮ˙׿ô]Ź‚|y«k?eĐ/ ˇÜ5ŲŮT$häcŚž'šćü1«xGĂĹî—}*ř~8]DŇFď‡)‚ ¸Ś÷Ĺbx ]Ó´ŻŠ°k÷VśłÜ9›c6$NĐ ä°íŢ€;˙xóY˝ř®Ţ•ŕţĂiç´K1 …Ž4WŰŚ˙Îxëřdü:Ótý/Ĺ^9ÖdµY“ĂÂv¶„€TĎő0l×/á{MÓţ-®µwsĺé‚ňâ_;c•í;@Ď;‡jŃđ—Ť4Ý'Ç^$}AMLJő©'Žbçc;m§śaŽG^}¨ ř_ń3_ÖĽsk§ë“Eyizíµ JľCYJŕg¶9Íy—Źżä{ńý„®ôkW§xX|9đo`Ö!ńÚ’Dů ‹pĂź ’@$tzwUâűČ5kW¶oć[\ŢĎ4O‚7#HÄGu  Š(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€:ĐěíB¦§«%µÉPÍŔŇmĎ ;Ó˛ô_ú˙ä›˙ŤXńLÂßĆ74i*ŁFJ:‚¬6/ąýŤký¬5ěo/í]8˙®xúöôâą}¤¬›‘ě}^›“Ś`ťťşýű™«ˇŮÝM3VK›Ą–&ŁÝŽH÷®~şo L.6˙‘†o÷S˙AQ®§(¨ěÓu‚Ć Q[(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Ščf–ŇS˛í'ńř×J…W'QÚö˛ÜW[>ąXuaßęn”ŔŕűôýxüjŢł Ń´ôâGťq+I!ÝSůŕÍŃ,VöŕË5ä6ńÄĘÎŇ>÷ů}řŁÄš€ÔµifŚ“á#˙t‰Éük9Cź­˛Őú­ż?Ŕ/ˇwOµ˛µĐFĄsj×’<…n!SÎ*ý̦ÝÉö(­#2®ĹEĆá‘Ďż˙Ząí7V˝ÓC IĘ+• OĐÓ®ő›ű¸ĄŠâŕĽrYJŽÝ1Ç…)áŞJ§3îžďnÖŘ.¬_ń_ú˝'ţĽŇŹÇމ˙^‹ü…cÝŢOv!o Ť8 :(şĽžé Iäް Ž1€0ľśV”čJ<—ű7üA˝ÍťţAşýq˙ gŤżäa›ýÔ˙ĐEe\^Ü\EsIą ]±Ś´R^ÝĎ}pÓÝ>ůX[túQJ„ˇ(·Ó›ńwîW˘Š+¬˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šč4Oř‡[„M¦i72ÂßvFľŚÄřP?Etß|C˘BfÔô›ˇ_˝"€čżVR@ükź Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( çŔzMŤľ™wâmn¸µµAijßvâr3󲣓ëř`·\ń©­ÎŇ_ÝČÉü0©Ű@ŁWî˙ä–ř_Éűźhşó±ýýănŕ5…|=ý«ç^ßÍö=×›‹–˙ĐŐŹőúŔÖřtuH¦“PţŃ’ÇCµćęIčÜĎ0§†cÓŰ?LâüDŇtÉěŕń7‡"0i×34Ű‘0ä`‡8ířŕIâŻ˙jů6VýŹFµâŢŮô6őcý~¤Ëi˙$·ĹwÜűEŻ“źďď;±˙ 9˘Šéľé0kž:ŃôűĹÝo,ۤ_ď*©b>‡n?@c&•¨=™ĽK ¶´Q“8…Šë»«ţ±†é°řŠĆřŮJęŇCl$‘@*:‘źOCŠô|W×´ďÝŰé­ :E„íl¶>Jě‘•98ČÎ;8®‡ÇlŤńÓÁM„ŚŰ[P1ćË@›ŕ»oü@˝Ót%ĽÓt€Í˛[‹vs¬ $ç9ĹaiÚ\±”lśkŰ<9«ÝřGŕťőŐ‰Ż­ő9 ŽGPÁĄ€=ńś}jźÁăwâďk>"Öš-GTÓíWěţxTC!Ý´ś mëŽ3šňK­'Q´·Yîě.ŕ¸K *źˇ#JľźđÝ·ŤeŐ¦‹ĆWş.ˇˇ]«¤öá×ämFGA‚z{×Î>#łŹNń©eݵ԰ˇÎrŞä ΢Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˝řw«i“ŮĎáźĘ`Ó®fYŕą"aÁÉ=3ŰńČÚřŠ5H¦ŹOţÎ’ÇCµâÖ8ĆčÜĎBÆc×Ű?\ůEt'ŚĽC˘B!Ó5kˇ_»čżE`@ü)ݎřwTÖçXě-$dţ)mŤ©cŔ§xóV±·Ó-<3˘N·¶˛îî—îÜNF>_öTp= śmoĆ^!Öá0ęzµĚ°·ŢŤHDoިţ5ĎĐâeA)"<ŤÄ ;â»Íj˙ĂľńŽ‹¨řiďÜ+ʲ†ůźˇQJś8ĎŔUŤ>ňăNľ·ĽłĹs‰#qü,A¤®k· µ v]kSţصÔYĽËť$ŔW|˝Á㌞ż0ü+C↧k§|eđ¦Ł~ßf¶‚ÎŢI~RŢXó%'€3ǰ®ţâOŃô˝F`C]Ć€·=p΀.ř{ÄZVń âę×^B]5Ü0ź-ź{™[ĺSĹrżu­?Ăţ9´Ô5{ŹłŮÇŠŇlgÁ(@áA=}«Źži.'’iݤ–F.îÇ%‰9$ÔtéţńvŠ’ř—Bńó kĽ«mŘŰúć©ü-ńU§†ő;Ű}b›FÔŕ6×jŁ$ś6;ő Źzâh [¶Ň>hÍ.Łu®ÜkPo'O29$pŚsőŰ^StńÉs3Á“ 9dŹqmŠO'“Ž™¨¨ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠÚđ߆5ŹĽé˘YýĄ Č<ÔM çxŚô5»˙ ŻĆ_ô˙ɨřşâ(®ßţ_Śżč˙“P˙ńu…âO kx[łű3N Śy¨ű€Ć~é8ę(Š( Š( Š( Š( Š( Š( Š*Ö—§Ýjş„:|-=Üí¶8׫Ć€*ŃW5m6ďHÔg°Ô h.ŕ;dŤ%N3ŰŽ„U:(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠÚđŢźŁßĽă[×?˛1·ŮăĚ'9)ă~u»˙çč{˙Ę<ßăX^Ô4{śëzöş¸5ű[Űůdg'ĺçŹĘ·á#đoýźůX›ü( Äš~Ź`đ \ţ×WČßd{,Ś`|ÇśóůV-v˙đ‘ř7ţ„Oü¬Mţ…âMCGżx‰ˇ˙d*$_µ˝ÇN0~aĆ9üč­é:}Ć«©ÚŘY'™ss Š5÷'żµU’'µwţÓîü)ń7ĂÇÄv’؉+ç®3˝YT˙ßD};ĐÝ×Ăßé÷©˘j^-xĽBŕ.Ŕ’±Ç‹ôÍ`xűŔMá˙iZ—$·—7¶ńżĎŹőŚě¤ »ňç5?Ťü âIţ!jPE¦Ý\}˛íĺ†uŤŚe]‰żA€yĎLWˇxĆx´˙Ź^kŮbŘÇvčYšeţú"€9Yľx7KľŹF×<[$Zëb‡0Ćç cŚ~d~® ĆľĽđ—&Ň(«ŇD=zt# ÖĎÄ ëâ©llnn'»»y (…„ŠěJ~„é]_Ć]dčľ6đăB–÷:†—c›ÎŃźź•€#ë˙ăµÚřżÂ6šW„|?â *ćk‹]EJÍćc÷R÷F=ĂŹř iÝü]ŐîmfôŞĘŚ„­ŁăçëZż ˘>0řyŻx=ś ¸ol‹Ç# {dăôËŢřB×Ořegâ;Ű™Ňţúă˶·m( ůŹ~ŠOâ+_Ođ…Ąč6:—޵Ét׿]öö¶ń“f3–ŕ‘Ű·ąŁă¦ˇ×l<;`qc˘ZĄş¨ţůźĐ(úć˝âN·ek‹©Zkö6iĺ^1'gpźtă¨#×'Ň€<·ĆľM }*ďNż†…©°X.”`źşĂ¦qüŹŇx·áç„<),ńë$şIŢ"ö–éçn8/…8˛;tëé'Ťő=J řjÚo C éO~“Űěśź›+ĺŕÎíŮ˙ĘýˇŹü\i}­bţF€"Đ| ˘Aá;OxĎYźO¶˝b¶°ŰĹ˝Ř ňx=qžť;óŠ—ţë}+Ç>:ĽfÓő9­îáeYá眯ăÔŹPGŁ ë:Ţŕm2ßÄž·×<7rwZ`Ď'=@lrÇ€zŠ×ąđ¶‘¦x»Ŕšî‰kq§E©]®ű ‚wFx9䎼Śúb€8MwÆłńVűB¶ş–öíî µŐĎ'hPK¶@? ®Ť>x.}M´oĘÚř>XĚą2Ş0NxĆďnĽVď…®!ö×ă•Ő$¸Ib„źďáŹÁMy®‰áMy<{i§=•ČľŠń ʰá@|™7Üžô­ŕφŇjţ'×t-^w´ĽÓˇ, dfČÚI#îAőÁ­]7á×…5áu§xwĹ2]ë¶č_kö)ë·ŽF{‚zć»»KŘ.ţ+xĺ­H>N’"wSŐŐF.ź…ywŔGÄË ±MźűŕĐžËE+Ç"•t%XÄu¦VŹ˙äaŐ?ëę_ý ÖuQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEmxoÄúdžžwŃ/>ĚÓ€$>R>ŕ3ŹĽ:šÝ˙…©ă/ú ä¬?üEqP׉0„éâÚĘŇ;A2«•,ÄÜ|ŘϵyýÝŮüXńŤ¦ś,ăŐw*Ť«,ŁČűÄső95ĹŢÝÜ_]Ëuy4“ÜJŰžI,ÇÔš‚Š+SĂşöĄáÍD_č×FÚč!MáľSÔaĄeŃ@5 ËŤBúâňňS-Ěň4’9ęĚNI®—Â߼Iá‹_˛éw˙čś‘Č$U'¸Ď#đ8®JŠÜńеźj1^ę÷Ď<đźÝ ±óź•@ŔíőÇ5[Ä:îŁâ-Hßë7?i»*ɱSĐa@™Euľř…â? ŮýŹKľÓ$¬2 uBNI\ôćŞj>3×őz×YĽÔ^KűV ”]±ç„ĆßÓžőÎŃ@ÚĹýöł&­srçQy¦tńĐŤ¸§jë%řµă)t˙˛WhĆÓ*‚B?ŢÇę9®ŠŘŃňŢ#Ŕyˇdń"€(ŃVc°»–ÜO¬ď?–$XÉRßÝÎ1źj[í:÷O(/ěîmKڍš&MĂŰ#š«EMkm=ÜË ¬2M+tHÔłŔU‰tŤJ)&ItűÄxSĚ‘ZűĚ1Ŕŕň}(ŤbÎÎęúo*ĘÚk‰zě‰ źČSnín,ć0ÝÁ,Ž©*ař†ŠëĽ{o AŽ|=c¨Ú4–Ű®Mâ°ŢÜ`®z÷äqÓĚÚY]^vÓÜE}ŁÔă   ôSáŠIĄHˇF’G!Ud±=ęČÓ/ĚóB,®ŚĐ®écň›rVŕ}hťn}6úŢŐ.g˛ąŠÝţěŻ*7Đ‘K6— šÝÍcu«t™á`‡ţŚP:+»ŹĂ{|!—ÄdMý¤·ßgÉ·ŽŢĽ× @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ú7ü‹:˙ý»˙čfŹ \„Ô>Ç0/mz<‰Üô?PiŢQu¦ęÚ|l‚ćách•›¶¶H÷©¬ü9®ZÝĂq’—‰Ă¨iS<üŐÍ6Ż$˙­Z„făNPMŰ{kŐţ…ÜżP‚¶ÖCÉŤ}ÇSő&ŤgţEťţŢ?ô1V/<;®]ÝÍq%’‡•˰YS'·ÍPř‘E®›¤éň2›u‘ĄUlíÜّޔĽRţ´ ńšŤIM5}ݧUúýtß t5Ďhú}âî·–mŇ/÷•T±C·Ťs‘2 ”‘FâHń]ćµáß xÇEÔ|4÷‹nĺYC|ĎШČ%NgŠę<“{Ĺ_őí;Ć·vúkC‘a;[-Ź’»$D%NN23ŽÇŽ+wâ&“kâŤ>°™1g=„LŃŽ>EiźoÓ ŠÉ×n>jěşÖ§ý±k¨ły—:I€®ů{Ç=~ařTß5Ét?ŠžÖ-â[m> $ö2Ką=¸$P/üW×´ĎÝ[hď ¶“§Îmٞ¦ÇT;NN23ŽÄ`bµ|I¤ŮŮüh𮡧B°CŞnš5ÉäăÜ`ýsT5k_†ľ!ŐźÄ3ë÷ ;ů·:ŰËž[2sśg©äVN§ă«câĆŹ¬ľëMOxâ‹r’V%$–*ąç$đ;b€6á¸Ő-ľ7xŠ]C‡WľÁ<ÖÚ-ňĎ“Ŕüyě+˝đ¶źâ˦Ő,\gąÁĹyöŤă}/xÇí7łÁĄë‰ĺŨ@Ś/”€ŔcpűÇ·P+CÁw~đ.­stşđߌmŻGIüŘ/íă-öyNÁęG\äŚWaáCá[ořÚĎÂOwvL•îonSnâcpOôďŢ€1µ f‡ź ü7‡BA©ëQ›«‹Ăłă vŚŚŔç5ÉxŻÇ­âż ZYkV+.łk&SRRŞY9Ę• ďŘőÖöŹ­řgĹŢ ÓĽ?âË×ҵ 3+iz#ܬ‡±ôŕAĆvšĘńÄţ ÓĽ7o˘řX J˙ÍßqŞIVÇ÷W {tăľhWăŻüzř7ţÁkü–°> kŁBńíJŔZޡ͞|c˙ŰřfµüwŻřsÄZŹbkéÂŇÖ8/Ţ8ś4wpô<Śţ5ČxŢ= ßÄłŻ„§š]1BÝóŘç€qžć€=/Á~‹Cř»®Oxľ^™ˇ$—ŠÄaB°&?ÉI?U§|Ö_VńŹŚu{Äí$ťŁ~FÝŮ ôĆj|Iń8 ´űĎ,C«x‚bŽ‘,~‡8ú=y˙Âé~¸×›Wşű:ÜŘ41-źs“ŔůAÇă@ĎÂ_ęľ.Őőť;Äźgľ˛ű]¤- …BޏPä|ÝóĐT ëúg‡> /Pattern << >> /XObject << /Image27 204 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 206 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 207 0 R /Resources 208 0 R /Annots 210 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 207 0 obj << /Filter /FlateDecode /Length 209 0 R >> stream xś˝W;ŹEî$Kîß`Ë‘O·hi÷ű‚dNś„4ˇ~śĐúq†Ŕ ŽČLDÂ8›ô"ř›ů"‚űůŞÇs3»;^Î7kOk·gzş«ŞżúŞşćHh©µOš§<úďŠ#ˇ¤R:‡ä•+3Vź1‰ş‡Â*ËçÝQ>:ş™‹•ú?_‹GPr$n}:r8SâÁĐ`蓳:¤U9)›­xúŕRŞĹýŹĹWhG=Mşh* bŤVYÉě˘ĐÚş ‹“ś¦Áó±yoĚiš±nm7v®’”ÚÔ˘ŰÝhŰę˝—Ö‡d„É2ĆěMjáĎŃx—q»Š)’ ’±ŢŔ ŘţY őSqëóÇŹ~4Âc"]IÔ÷—ÝšIŤ‘Á‰şńY}Wܻ췉О ÚegĽćü*ßá¬Z|t­Z°?ńV·o÷ńę;e'ͬ)ß©ńŤ¨ż·ëmÚę“•Éyí×,Ţťú{Ňö?đnr·ŽÉ7 ›lgŰsî Í»ˇhcĐe¨]׍Ľ»ŁÁ¤ä­2B;/µń9wsÚß*RVĐ ˝jť }ŞŐqµ@ű»k“tłAş‹`¶VT€7ü&hpm"\nČQ- o®‚%.»+ťÔ*†8 ¸úŞŔż)ş}>#˛źůţDŘb XyTĹ„+čfĽĆëľĂţE_łvB71ş1»OăËÚĂ.«!¬Ř+(>íĐâlÉŢ™7Ţ€dś´&‡5>\„›űHŰCbʸü‘L~~9@±’ź¦|ŻŁ@o„¸Wý5HJ÷>ëlŢϦi7Z9I‚óRÜţZâv|Ôzéť÷82‡Ô Çn‰¤m.N@o}|Ë×c·ŘB!xڍŔ8Üţ ˇ[ŽSöČŁ#Y†€@ŞŤĂxl‡ÄŐ††ŕôa$W/ŮuBhźß¨^łëĂaś &ei”Žţýl±CDć|Wˇ›€„˘.[KĂßň)Ňn©fř3 ô|‚B±MÂ8¨˛Ů©ţ¸Xl2@Ł$ڍ׬Ř^TZ9/ ˘<)…J˘'ťťTÇ[!ÝtBđ—&h)K $‘7/ĘDśvu?ŘYyłí«KÚtL›ć|ü‰ďńçOÓîä¤9cóUL ©Áša8ÇB™¤ÍÁH§‚—]rÖ«m9k@:9ëßş¨Ź~g·»*‰ÉgĄÖľćž-Iř˛46; ÉX8´–¨˝QĄ «Ň–RKy…ťn ń!éýđ Ž7ßWC,ĘC´3PÓȧËkĆ#ď‘’,ĚČ\ř«ŠÚä;D endstream endobj 209 0 obj 971 endobj 210 0 obj [ ] endobj 208 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 211 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 212 0 R /Resources 213 0 R /Annots 215 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 212 0 obj << /Filter /FlateDecode /Length 214 0 R >> stream xśµUÍnÓ@öú€”y†˘ś%UŮěÎţA€•*!Yęr€&BnK ‡^xžŁı/—č±çĽĚÚńO"+@[Ľ˛˝óywżŮofÖs\@lOĘŽ†ŢďOa‚ !őFčbĦMâë”5ΊbzŢ(ŚÓ±“Æź38‚3"™Ăřiţy60ýB oçµ’ÄÁ•^¨ ŕbz'ŞśěÁjó“,ŠFˢAđ H©´ĺ z-#Xcy ÓRÚkć6XMI•ŻÔmz…´•ßĆpe¬GŔŔť }%pht Ž%Ů…ó.†ŔŁ2HnďĎ2Z"»€ńË󳯆ĆËCv˛Öi[ YłěĽ…aňťłIrËvŇźéMň=J–#† ô†Ž@—ö2ůU[¶q6Hn“%Ťí±]vŔú鏼ě5ĽČrÎeÚÜČp٧ČőŐ·etËXáËPVŮĐ‚ňr*¸2ÚŐĽů÷řkĂj-ARϡSÝ›:)@[ęd;­4·±în¦m\¸…K ähuŚéUz]äW|ěłCÖK¬Ď2B/É—E„3úz@Ŕ–,Sa-Ë®Ů.Mí±AzŶ˙·›Ř&ŐžKĄT—jµ3qT"¤ *íoäréÚ˘LűęK,…ű;—¦ds.łî»l;Ĺv˘,ˇúËČî—z÷¨;hâ]ý ĚäŢ á;˝©kď>Ű”Bó¸pxŕ˘F:°eQťF)·:ŮŃĹŤ­±Ľ…É`$j.T<Ű«Ém°ő?ů‹íżD/u@nĚJ%čĐäôĎíE Ś_ťN¦ŃÁóó•X±ýO}„¤ endstream endobj 214 0 obj 641 endobj 215 0 obj [ ] endobj 213 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << /Image27 204 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 216 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 217 0 R /Resources 218 0 R /Annots 220 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 217 0 obj << /Filter /FlateDecode /Length 219 0 R >> stream xś­S˝n1ŢÝŽy¤T [ŽíńßH4 AÄIH–(EJNh¸Ŕ#PžňĽÄ•T)ňt0łËŢŢ-'~’[Ë癹±?óŤç`”w:ĂiĎë‹#VZ Ék×fŚ}N’ĺ0řt»˝«}tb40räwOáAć°{Ży3Ű×př–¬ĚĆP¨)i$„“ĂKAÍŕŕ<á1_A2-R;řXk4iE.‚1č‚jAlrF‚ËXłsĆ„.6ěbKHĹÔWw°ÚŇöެŢ+ô!Y°¤b$oS_~ŠÖ;b#pŮuLQ$H˝ĺkđÝďg>"źŔîĂ×Çď,xN”/A>X—•ĆŞŕ wšĺ—đ &ĹűrZC[«Iq±f?.÷Ëkećą·Çn®ĹŹšK+—·Ëiµ(wjŔ_~ń­řZîplĘŰnröY Ď!?‚y›4"zE&Ä߸LjČŻě/…˙S#|'‡%ěÚC$Z 5C(b ¦ őű†Č˙·÷Xň¨-畱žhČéç¸P6t… őF§ÂşÜŐiőąZ°’wY9ę”c_˘§Ő§ęű ŮeqŤłJLcđĄ>W!řy~Äę°*‹¶U«/lŢŕfĽÎ˝L]/o KÖ§°ń[!g´Sr0ŤČ}rĹą<±UNňVŻĚ Q9ŤŃo˙÷'%ă'ůD8ă endstream endobj 219 0 obj 521 endobj 220 0 obj [ ] endobj 218 0 obj << /Font << /Font2 12 0 R /Font3 13 0 R >> /Pattern << >> /XObject << >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 221 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 720 405 ] /Contents 222 0 R /Resources 223 0 R /Annots 225 0 R /Group << /S /Transparency /CS /DeviceRGB >> >> endobj 222 0 obj << /Filter /FlateDecode /Length 224 0 R >> stream xś­TÍn1¶s@bnäÎH*pü˙sAˇ–.‰p€&B›–<ŹĂ[đ}†>3Ţnvł T©ş–×ögŹçó7c/A TU+¶ź°)¤TÉG'm^Ńă"j`Ľ ^fó˛h邥N ťýç0†ct˛„ŃăňŰ|*aö=hŞ!ZŁĐ‡02Ei’Óٵ\Íáh°,[žTö” n«BtJX@YgHtbSP®°˛…Yk\…5¶ ¶rINM¬ŐmzYÚz@­ő":«’ĂEB™¤d¨őOA;›°ăQwb DmśN–Č?)pŹâF»'Ç?48\H_„âh=® «ÓÂ[(Ş źá Ř~ź3öëyďŚ˙ä·ůdÂoőÎŘ/ţzYĹČď±ó<Á§ĽčýÂG(^Âłâ&z…ŹÁ]˘9Bń•ś]!ę˙‚l7:K-®BldTN É+[Cű”ÁÚ´µ˛ę¦7ďäKˇŁQŃAĄŹM*rÓµÁsŹ^,¦ł/:ÂÓ“•D˙ŇA+ä”sî"_‰o*ČÇ\†V† ´}˘;„RÎR^X飮ÖlćJÇSLř$…DQBÄ kв…â=µŃDç%Űî¸m…Ü‘vÍ«›¦H0Vię7^$íĆ#ĄŘÎR¶ÇĆXŮ;v—ő±˛·ě ŰgĎÝĂ˙{śąĂ^!Ög»yf±DĆl2aý:Í×ŐŔ'×$­śO«nĐa;u®B7+µťNÍnŐŞŰ AV–@üÖOÔ m–:‰H°ľďĄqËŠN±ýh›„!öţZ/•żUŕh endstream endobj 224 0 obj 617 endobj 225 0 obj [ << /Type /Annot /Subtype /Link /Rect [ 432.0866 294.1449 638.1708 310.9449 ] /Border [ 0 0 0 ] /A << /Type /Action /S /URI /URI (https://prometheus.io/community/) >> >> ] endobj 226 0 obj << /Subtype /Image /Interpolate true /Width 2048 /Height 1079 /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length 227 0 R >> stream ˙Ř˙ŕJFIF˙ŰC   %# , #&')*)-0-(0%()(˙ŰC   (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ŕ7"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ú¦Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š:V}Ö·ĄZHRëS±…ÇU’áţDŇrQÝ•JnŃW4(޶šŤŤçüyŢ[O˙\ĄVţF­Pš{ Qqvh(ŁĄg\ëşMł•ąŐ,baĆ׸E?©ˇÉGv8ÂSŇ*ćŤZĎPł˝ł»·¸ôĘEäjÍ §Ş‹‹łAE…±I5Z;ű9\$wvî瀫 $ţ´6(·˛,ŃEÄS&š(|ň$iÓs°ő¦AuopH·ž)Hë±ĂcňĄu°ů]Żbj)˛ČĆ^WTAŐŕƢ‚ňÚáĘÁq ¬pŽăđ˘ë`Qm^ÄôQE1ĹŐ˝ľß´O[şopąüé`ž)Ó|¤©śnF 3řRşŘ|®×±%÷0[ăíEzopąüęEeu ¤2‘AČ4îv¸´QQOsľ>Ń4Qg¦÷ źÎ†ě 7˘%˘‘X:†RHČ äPÉ{kľ\·0$źÝi?•+¤ -č‰č˘Šb *n­âG,ń$‡˘ł€OáSQq´ÖáECÝĽ“ُ‰ĄĘ+‚Ăx¤šňÖŮ=Ě1ż]Ż őĄt>Y^Ö'˘ŞiŘĎíŻýý_ńŁűNĂţmďę˙Ť.eÜ~Î}™nŠŞ5+ŇöŰţţŻřÔ¶÷0\nű<ŃK·®Ç ŹĘš’bp’Ő˘Z(¦Čë3ČĘŁ%ŕ dŽ˘˘‚ć €MĽŃƮà ŹĘĄ˘÷MhŠ( AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPLšT†–V )fbxu4úă~-_=—§HÉ pëGˇä˙*έOg7Đß E׫K«±ÁřÄÚÇŚő“¦h>jZUŇëýç=‡µméßáňÔµ)LÄr P©ëúUď‚ÚTvúÚ‹(ó®$*ŽBŻ˙^˝¸0řUZ>Öľ­ţµŽĚe„›Ă`ýŘÇO6Ď$ľřOs¤ş>Ş7ŇU(G¸e˙ ő;X–ÇOŠ'•™ Ś)’FÉ ¤ŐŠĺ~'^˝Ź‚ďÚ3‡AöcúfşUxXĘp] b±ŚéŃ«+ëm»žwâ/jţ2ײô#"Zn*‹Ţ;»JÜÓţŰTę”Í1ę P~'9©ľé©•y¨˛Ź:i<ĄnáGoĎů ôĘćĂaŁ^>Ú¶­ťřüÂx9ýW îĆ:y¶xî˝đÚűG‰Żü=},ĎÜcű˛ăý’:ý8®‡á‡Ś¤Ö•´ÝMľ‰rŽx2¨ëźq^^® đßĹHć¶#3¤ˇGkđĂńÉüéU¦°sŤJzE»4V»ÍiN…}f•âúéĐöŤgţ@÷ßőÂOý×Ěş|×70ßŰ‚ T†í»¨ˇŻ¦µźůß× ?ô^á'ű_Âľ"ŤtĐçŹę»˛?,Ôf0s©ě˙\†¬iP«)íx§óĐ÷m*ú-KM¶˝·?şž1"űdt«Uç?µo´č“éŇ6dµ}Č÷˙Żšô9ĺH!’Ył@+ѡUU¦¦x8Ě3Ăb%GłÓÓˇĺuF¸Ľ±Ń-rÎ?}"ŹSÂŹćP| ˙ž«˙\“˙B5KÂńż‰Ľ]¬ëS ĹrJ3Ř•!ä?J»đ3ţBšŻýrOýדNN¦*5^Í»z#éëÂ42ęeĽToęÝÎ×âŻüZ§ý˛˙Ń©^;ŕ}Eô?é×re`”ícء%IüÇé^ĹńWţD-SţŮčÔŻ/»Ň~ŐđÇNÔŁ_ŢÚ\HŽGtfţ‡™«Ç){u(ďÄË&”>¤éÔÚsqűâŹ|čh®oáî±ýµá[9Ýł›Ásřś~F»Ż‚?ň)Ü˙×ë˙č ^F™âUI}¤Ůőź$pŚ6KçkżĚÉřë÷tŻ«˙Jô? Č·Ą˙×´úŻ<řë÷tŻ«˙Jô? Č·Ą˙×´ú®Ę?ďU=ĺâ˙ä[CŐš•ĺ~î•őé^Ż^Qń×îé_Wţ•y‡űĽż®¦Yűě>“=Â˙ň-i?őéţ€+Ä>(«7ŽŻÂ[x˙pW·ř_ţE­'ţ˝"˙Đyn°Ş˙"G‘¦ŤX„†:<Ôaí™<ýž*´űFOńG]đ·ĹŰšGŮ.ß7ö +y‘;7×±˙ë×o^â+ŻxĘ+ŰM”Ťľ1ŮýčĎÓü {N“¨[ęşt¶oş—rúŹcî+lg$éTř˘rf¸XBKGřsŐy>¨ň?ŠňPôď÷a˙ĐëŮëĆ>(ÉCӿ݇˙CŻg©ÂŻ©yźű¶ü/ô<[ŔżňV/˙ë­Ďţ„k±ńwĂř|G«›÷ż’(©°F§ă\wä¬_˙×[źý×´Öx:P«IĆjęěß5ÄŐĂba:NĎ‘1⏆ĐčşÖ šŚ’´*Ăç×5źŕOĹâ}2ką/žÜÇ/—µc žĎ_ző‰ň%jîć+ ŕŹü‹wőňôYË IbU;ic˘že‰y|ë9űĘV˝–Úé˙ m-oaš]BIŁFËFb0ôë\¶…<ľńü–—,E¤Ťĺ9=2~Vü?ƽμűâ˙‡†ŁŁ®§n™şłűŘ´}˙#ĎçZâ0‘ĄiEYÇS›™ĎUĐĹĘńš·§cĐAAäóŚÚůŽÚŐży6luŰžń<ţá˙Ś!—ÁÓI©Iűí11!'—Oá?^ß_­rľ°›Ĺţ2¸Öµ%Ý/ć•í»řč?ĄŠţÚ§Oyţ ¨°X/ŞV©[˝Ú_‹éţqč_´ řv$‘qw>%÷Éč?]EW}8*qPŽČńkÖ•z’©=ŘQEfAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^}ń®2Ţ…ÇD¸\ţ × Ö'Ť4†×<7yef]Ńgűă‘ţŤa‰ť)Ev;0UL*KdĚź„˛¬ľ µ ŚĆî§ëś˙ZěkÄţxž= ö}+Vc? ă\ť0Ţ€ţ•íQşHăee= śYŕŞĆĄ–ëCŁ7ĂNŽ*M­$ęáţ1ĆĎŕÇ+ś$čÇéČţµŰ;¤c.ĘŁÜ⳼MĄ®µ ^éě@3FB“ه*0+jđs§(®¨ĺÁUTq©-“G1đjU„R7G;†üy®ęĽGá—G†µ‹­+XĚĚűIoůe(ăźcÓ?JöČÝd@ń˛˛žASk E:)uZyÎT±R“ÚZ§ę:Ľ7âűGÄ8ă‹ć`!L\˙őëŘuÝfËC°’ďP"(ČQ÷śúÜ׏ř"ÖăĹľ>}Zĺ12ý˘CŘ÷ô€5–=©ňŃŽíťY,]i‹ž‘Š7Řö]gţ@÷ßőÂOý×™| ĺµ|úG˙łW¦ë?ňľ˙®č&ĽËŕWŢŐ˙íźţÍW[ýćźĚÇ ˙"üG¬33O#ÁZňXÎţXôąůOŕqůíţ-kLđ´Fظ˝o%G}˝Xţ\~"°ţ6é%­lőh—扼™ô<©üë”›P¸ń×ôK7 ¶8Ö'Ď·.ß§é\s›ˇĎ‡Ź]ľg«JŚqľÇ=˘˝ďűwcĐ|ŁŤ+áüŇ:ââň'ťóÔ§hüż™®gŕgü…5_úäźúŻTÔcX´k¨ĐaÝÔ@וü ˙¦«˙\“˙B5ĽéŞu¨ÁtąĹJłÄa1Ue»kó;_Šżň!jźöË˙FĄe|7±ŹSřjöR˛v•9í“Á­_Šżň!jźöË˙FĄVř?˙"LőÖOý ´’Ogüż©…98ĺnKuSôG%đ‚úM3ÄZ†‰tv—$=¤BA–*»ń§Si¤Óô[rK» ]GsŃGęk;â]ĽžńĹžąh¸YŠĘ@ŕ^~#™ŁÂřżâDú´Şße¶>r«vÇŹŻ¸ů¤˘đťoo–ç­É TYŁřyo˙o-,u>,ÓGřY-Š˘@Ţí¸gő¨ţ˙ȧs˙_Ż˙ %küP˙‘#Qú/ţ„+#ŕŹüŠw?őú˙úWW*Ž.))ć)ąĺ•'-Ü˙ČÉřë÷tŻ«˙Jô? Č·Ą˙×´ú®3ănź$ú%ĄäjJŰJCă°n‡ó­j|.×­µ?[ZyŞ/-WËxÉůJtÚŽ.iőJÁ^.¦WJQו»ůťyGÇ_»Ą}_úW«’Ä;šńŠZ˘x‡ÄÖšn”EÇ“ű Pä4Śz§­Vc$¨¸őfy9K§Ň7oî=oÂ˙ň-i?őéţ€+˵ů-p×xżô^ą§[ =>ÚŘbXÁőŔúW‘ę˙ňZŕ˙®ńč§­ kÍ•IJµvşĆG¤xË@‹ÄZ$Öo…|đąţ?Őćß µét=j]UĚI$…?üł—¦>‡ü+ŮkĘţ0řd•]zĹôÂÜăłţ?*xĘn b)î·óBĘë¬^żĂ-Ľ™™ńGţJ›ţě?úŻgŻśďuą5ÝoEžŕ´D"†F?ÄCőüŻŁ*p3U'RKfŃyÍ)QĄBś÷IŻČńo˙ÉXż˙®·?úŻiŻđ/ü•‹˙úës˙ˇöš¬żřrőfyďńáţúśÇÄżůµ?÷ó…đGţE»żúů?ú­ß‰ň%jîć+ ŕŹü‹wőňôD˙ß#č:_ň*źř—čz%6DYchäPČŔ«ĐN˘»ĎůÇĆz$úîtčYü‰đńŘŢ„đĐ‚? ÷?čiáýŢČ`ÍŤó0ţ'=Őć_żä|ÓëŢ/ýőíć`¨Ć5Ş[¦ÇŃfŘŞ•0”źÄ®üÚ˛ (˘˝3çBŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( /Ć?ě!Ľ¸ŤőmY5`ÄSůp?ZőáŔŠ+J8xQż/S ^:®-Żim6˛±ČxÇŔšŘÜ+KücÎEČo÷‡zâÓŔ>-Óóź©ÇĺÉŮF>„q^ÇEEL*’浟‘¶6ÄЇłM8öjç‘Z|0ŐŻîVM{T_,uĆG#ĐŔýkÓt=ËC°[M:!C’z–>¤÷5ˇEU-:.ńZ÷3Ĺf5ńIFŁŃtZ" řZćÂć 4±˛zAČ|7đ•ď…ÍńľšŢ_?nß$±Ć3× z×mEi*Q”ÔŢčĆš”éJŚ~Z˙#?Ädz΋y§Ë€'ڍ'ř[ŞźŔŕ×!đďŔłřoP¸˝Ôf·šfŹË‹É$…üÄäx­wôTĘ„'5Q­QTń•iQ•żv[ŢÄn,®!RI '¦HĹq_|}á‹ËŮŻg¶•gEU–$`çś]ÝĺF2š›ÝORť)юҵţF'Ť4™µß ^iÖŻsMłkHHQ‡VçúT^Ń.€WaŕżŮřrAu,żkżĆ…vŞş?­vTVtđT©Ë›wćo_6ÄV§t“ŢĘ× ŕŻĽqń-y'µ«"9B[~€xĆ?Zďh­ęRŤ[)tw90řšw'OŞ·É…2x’xdŠe©VSĐÔSč­tíŞ<Ťľ_C®-ŝݠ˛IĮͼ(9ÇÝÇë^ąE…<(ß“©ŮŠÇVĹňűW{áż_é~6şÖg¸µki^fTBŰţrHÎF?Zô (ŞĄJ4•˘g‰ĹTÄÉJ¦éXÇńv—6łáëË gŤ%™@VŁžřł~xrëĂZLö·˛Á,’Ld"HĆîĄuTPčĹÔU:‚ĹTŤ‡_ w (˘µ9Ď?ńĎ‚ŻüAâ[MFŇâÖ8a‰–V`Ä«±8Ŕ>µčQYB”a)InΊؚ•ˇ sÚ;QZśáEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^sńŹÄÖ<7máű¨­n5=AlÚI#nDZ5čŐä´ňZÍŕ›-ŢćhµäHáĄa‚{“Çă@ ń.Łń'Á:{ë7׺N·ĄŰn"ŽФ‘ůúţéşn»c{ŁéÚ‰™ †ýPÂ%` ,2Üőü«ËĽWwăżé2hVľţ²ş!n.Ż.C6ŔA :{ńUţ8čçLđGt}>wŚĂ©CoÆËq»ëŢ€=r sK¸Ô[OQ´’ůA&”ëĹ7SńŹĄĚ"Ôµ;;YOD–eSů\Ýż„ô/h7ş¦“¦ĂýŁeg,źiaşYBNć<ňEq˙ĽŁř‡Áéâ/ZE«jš¤’É$·CyP®zt'ń c¶¸†ęšÚT–&WF â*…Ç4{ko´\j–QÁĽÇć4ĘáÔg=Ey§Âč›Ă_üQá+I$m%![ëhٲ!ɨöůÇĺX?ü¤ëçÄš–»j—ë§5´ĎóG0ĚÁ}NĺçÚ€=»űcMűŰ~ßkö?ůíć®ĎĎ8ĄŇőm?UŤ¤Ó/m®ŃN †@řü«ĂĽŕŤ*o‹Ţ)Ń."3hZvË,‰„<§%{ăq¶ěô›/ ||Óí48ÎĎRÓ¤i ‹„,ą ăţ(Ö5-NÇK„M©^Akŕ4ŇóŁNÔěu;s>źyosęńHÄW€jšĆ›Şü]ńľ*Ó5^ĎKŰmgionÓGç,Ę;śg®OĄ^đl°EńfÜř[DŐtÝP¶hď­î-Z8w€pŔý}hŃt˙şM׌5}K«8­ě#Ť…ËN‘Ű;”văŠÄńµqÇ? ÚĹ~éĄO¦Ë4‘‰1ü˛Ç±č9ö®Ážđő×ĹďX\höRYZĄ±‚Ź( Ú;f›ń+ĂöşĎĆßčΦ;§•hâ;v†BSč@ÇŇ€=‡O×ôŤFá °Ôěî&Šefü­ 掚YäHăQ–w8{šńoŚ^ŃĽ/˘éZׇl!Óoí/ˇU’Řl,¤ŕ†ÇZ_ʍ“^đ®…|—’é7,×Y©i'Uţ$P¬işţ‘ŞLĐéÚťťÔ«Ő"™XŹŔ·5í¬7PŰMq\Mź.6`ń×˝|ĺă)ôrşeď<-­i:Ý•Ę2Ëžń«ÇŃ•˝{~ľµÝxĘF›â˙Ăą$]®đL̸čHPŞ^Ţ[X[™ďgŠŢp^F Łń4——Ö¶VĆâňć ů’8UüÍyĎí@ř]{źůíó¬ß‹Z-ýŮ𦪺TšŢʧŤ×šr7. Ś6;ăÓŰŢ€=7LńŹŞHcÓu;;©đĂ2±ü­:ó‡·_u­j;żéÖÖí˛°0<^LÉ‘†ůz>µéôĚx(jbmkűSZ´ŐíŹä,mÓ'·¸ôö«×)ĐmúÎźŔ81´ę?Lךü+¶ąĽÓ~%ZŘĚ`»›R»ŽGđ9ŢżA®gÂmá O‡@ř‰áqa©î(÷×0ďŽá˛~a é@CĹ"Kɫ٠«)Č"›sq ¬5Ě©H2ÎěÄÔDvÚ]¬:`ŚX¤j°ÎWf8ÁôĹywĹxOţ!řG—2:é7eŐÔjĹ|Đ!I¸Çă@_üSj˙ 5ëźëµÜIi8.™™čxŕ‘]Î…>|;§Os'&Ö7wsß`$“^AńçŔ:ťđöďTѬ!ÓîlÚ-ĆÜlŁ:©VŻ$“ă­%·|¤fäZj~XşŔ™$‰2€]Ăň \°ńŤ¨]kVĘâŕË8ćVoČş—Ö˛^˝š\Â×Q®ć„8ŢŁÔŽµó—ŤĂňčp·|)®išĺ›ŁÚÜŧĽgÎćď]G‰®çСyok čóHÎĽ·â>-ř­áŻ ĆwYX©ßĐăîţŽą-WZÓu_‹Úűř§KÔu{,‹[;K{vš8Čŕł(ő ž}}¨č 7R±Ő ó´Ű¸.˘Î7ÂáÇé\ĂíJöďâÄ K›©Ą¶µ–ÜA±+Cçhíś ăüqżĹëF𦋪隡Ąä3Ú´Q,ЬĘŔ@?ßř/‘ńCâ„ŔdĆÖďŹ\$†€=#T×tť%•u=JŇŃ› šUR3W,îíďmÖ{9âžčń°`^5đwÂş_‹´›ďř˘Ú=SQż»”)ą„Q©ŔP:sřb¬ř>Ń<ńŻPđŢ”]tkű~–岰ľpBú úP¨ÜkšU´SKq¨ÚG/ĺČĎ*€ŤýÓĎ_j›MÔ¬µ8<í:î ¨łŤđ¸qúW‰|;đŽ—â/>7ą×-Öö mAÖ+yNc IË•îpüęüš]·ľ7čqh -tÝnÝŇ{Dű›×ř€íü?‘ő ]Ôő;..Ąyokŕ4ŇóĄÓu+-R?N»‚ę›ápăôŻźő-oMŐľ.x†_ézŽŻg¦7Ů,í-íÚhâ#†fą ž}}«OŔ—Űü_¶>Ńu]3AÔ-ÝnážŐ˘‰dTfVđ>čŤ{V©¬işJ«jwÖÖŠÝ ŇĎç^}Żë˛ÍńsÁđ麉“Mą¶™ťa—1ČGBqÁ¬OčV>:ńÇ‹µŻš‚ŮÝý†Ň †R%^§oOO×Ö«\ř^ĂĂ?|8şDBŢĘîÚIEşź’7můxőÍ{ťs>ń ţłi}ić§Ů­bűöŁ!ţĽ~UÓW•|1˙’‰ń#ţľ˘˙ĐZ€= ăÄ=µ¨ą¸Ô죷,PHÓ(RèÎzе§ßŮę6â}>ęOâpĂóá˙Ľ¤k–ZÖ«®ÚĄű&Ą5˝ĽSüŃÄŁ H^™%żJŰđ6ťoᯍ^"Ń´…0isYEt-ůÎ3ůţtësK<ł:Ç ł1ŔÔšâüńIń ębK›K_ł_5¤§ť@\8Ô’? ě/ěíő 9­/aIí¦]˛E ʰô"Ľ_ŕW…´+ű?Ü^é6sĎk­ÍńcUT@ tZÜđ|pń­î ŃépiŃH#–LF„…Éç]ţ—­iz©a¦j·ezeGĺ^7¨řjĎÄß´F©oŞ!šĘĄ’ád;ŢŁ'8«;Đ´ßüAđ÷†­cÓž÷P[9ŇÜmY#, ‚:tc@Ë}ymanÓŢÜEo őy\*ŹÄŐ}+YÓuefŇďínÂ}ď&Přü«Ä~%ęÖš‡Ć(4ĎYßę.™h&V‘|É3¨ě2? ;ŐUş˛‡â‡5řwXŇ•ĺű> ŤdńC$lF 8Éçé@CŐ-SVÓô¨„šťíµ˘Ť43ůŐÚńoč¶^;ř‡âÝSİ­ôZuĎŘ­-¦ć8€ÎNއ8­zö›©XępyÚuÜQtß ÇéI>«§ŰÉ:O{oŔˇĺW€ô'ŇĽ‡WŇ­üń‡Âňxu>ËcŻy–÷6qśG•Űóí÷‡ĺďUď|9gâ_ÚW·ŐTÍc ”2˝ąl,¤"€w9Ĺ{—¬éš¶ďěËű[˝ż{É”>?*±{ymcnÓŢĎŻW‘‚¨üMx·Ä­ ĂŔž&đź<1zsI|¶—0Ŕ6¤±·\ŻN™Şź5{kď‹¶:N»k˘iö˘v˛´ÉćČ܆eG#ň÷ lҵ­3Vt»ű[˝ź{É”>?*–}FĘ ¤Š{¸#–4ó]@ Ż÷ʵx×v0ř÷ĂzŹü9¬iLnŢůM“Ĺ‘1$cdó[~)đý·‰hX,uĎbşRĎ4!…c…lu ăÚ€=sL×´ŤRV‹MÔ¬î¤^« ĘÄ~Ö•x—Ĺ? é>Őü!¬řrĘ-:ëűM-źěă`‘‚ű¸ükŰh®GńŁsń{ZĐe•›m`“ĆC–PN]ĺxVĄ‰dřëŻM§Ăv4řüÓz¤©LŻLwÎ(ÖĽm¨\i^ŐŻěŘ-Í˝»ÉqP|;Ő.uŻčş– ę÷W6Ë$Ś'ÚĽŰĆÖ˙×ÂZ±Ő/|<Ö"Ýüĺ†7Wă#­W×5»­ öjŇ%°‘˘žâÚq"ś ś~Ťzčń.oľĆ5kµço•ç®ěúc5ˇwuogťw4pĹ»ä`Ł$ŕ šůŇęßÁ‡Áʦ[xG^ţŇ[Ýß˙g¸”ÍŚ‡-ţ÷n­o^ę—źł}Ľş˛Ď¤˛ÂŚfRŻ•”NyĎJö¦×4ĄÔ“OmFĐ_9ÂŰů«Ľńžťiu]kLŇv˙ię¶›ľďť(LţuËřáţ…˘Ůi÷¦Ę;ť`"Ë%üß4­!śžťzWŹxS^Ń5­w_Öü]ˇjzÝĚ×M¸ŽÍ§ŠáG`qŹňhé;;»{ŰužÎx§…ľëĆÁ”ţ"¦Żř/4–ţ=×ět­;S±đĚđ}ŞŢ+¸5ŠPĘ ®zgqăÚ˝˘âhíŕ’iÝcŠ5,îÇ@ęMeÝx—C´¸ň.µ{¦Î6<ęĺšŇ{Ő®^hĹş®ó!a´/\çŇĽKí ®ŁĽ¶ŇĽ/w«,¬ÂK‹['“,z•ý{)ż.¦ąýśuőžGqµěH_¨P‡ő `şńŹj`:Ą”F|ĚŁ~zcžjĆĄŞXip‰µË{XŹFš@€ţuĺü˘Üř3JÖu›DÔu+„YVkźźĘP~E@zcĘjzŢ›Şü\ńľ)Ňő^ËLaigionÓG30Éóëí@@iş•–©ť§]Áuqľ?J·^ ŕ[íţ/Ű hş®™ ęî—pĎjŃD˛*3+xükÝnä·•#mŽĘB·ˇÇ€3/ĽMˇŘ\ýž÷W±‚ůç$ę­ůf´íî!¸f·–9aačŔ©ükçŹÇ xHÝi<0EÔ·ßÚóCçE8cĆ[řk¨řł{i |#´łđd‘A§ßζńIn˙(ŤÉfĂ{źë@ţď\óé\]¦­w«~Íšżö„­5Ĺ ’ĐČÇ%Â8Áü…{%×´k[”·ąŐl˘ťŔ*Ź2‚AéĆj]K[ŇôĹC¨ę6–ÁĆWÍ•WpöÉŻ0đ×Ă?Ý|.·—Q±KťNóO^KóJ˛2nnÁröźđ7ÁÚG<©â;TŐ.ćf…ë2yQ/W=;еZÜCuMm*M Ś«ŁčEQÔĽAŁé“¬:ާgm1č’ĚŞ"kËľ\·‡ôZ[ł5¶‘{)¶F9Ř6d/Ó"¸ź‡÷޸ĐeżńO†µ}oWÔ$’YLÜ@ާ|úPÓËŃ,şÉ «)Č#ŘÓ«É>I{ ľ˝§Io¨C¤[ÝÓ–ö6GXXś/>Ř®—ă>łs ü6Öo¬\ĄČD‰u]î©‘ô h~hv÷źdźW°Žç8ňšu ź¦jőíőµ•›]]OP*îŢîüëĎĽ5đŻÂ­ŕë[{Ý2›«›uy®ÜfVv,·'ŠÁřGzß„u˙řŠ$ÔŕŃ/¤‚p»ř€ëčAÇÖ€)|4kŹlÖµŢŰj2Ý3C¦Ű\**Ƨ;vu#ţíşŤő¶ťe-ÝěÉ ĽJYťŘy7ěç i-ŕŤ?Xm:Řę‰,ˇn¶0WŻĐ‘řפxÇNłÔü5¨Á¨[Es…Ü$‹‘¸) ýA  o‡ţ<ÓüWŁ[]I5­­ěňH‹içřW q×3X>ńEă?ŤgSŮekx‰Ú%ÂF1ĐgĄQýźĽ7˘ËŕM+W“L´mMfś‹Łó$`9úqXŢđŽ›âO‹>7¸ÖŕvÖ· Go!ĚeŘrÄw >¦€=ŻLŐ,5HŚšmí˝Ň­ Ŕü©u-NÇK„M©]Ákŕ4Ň­yé~ř÷ Á D¶Vzť”żi·‹Ř¨|~ zç5moNŐ~/ëňx§LÔu{,‹[;K{vš8Čá™”zO>ľÔďúnĄcŞAçi·p]Eśo…ĂŹŇ­×x"â+‹ÖŤáMUÓ4=BKČgµh˘YY•€<€~5îÓÉĺA$ÎĹ-Ź   Z®·Ąé;µ5KBÝŇŞgó®3âö»Ź…z¶Ą ę#růa.-eΠŕŹc\—ÂO iŢ5McĹ^+uKË›é!‰.>dŠ5Ć_\“řď[4-3Ă˙őŰMÎ+Kft”ÇŔÜdLźĐP_˘ř—JEŇ"ÔµkHďe´…™eťC±( '&şEthĂ«)B2őŻ.đ—Ă/ Iŕ#¨é‘]_]Y$ł\ÍóIą“<7lg”źő˘řS7öÝ×úś×ď,ÍŇ q‚~‡Ţż‰ô$şϬX,äăË3®sůÖŤŐÝ˝Ął\ÝO6ëŚČ쌜~¤Wk’ü;şđž§o xZöp-ä1_CbřWáüĆä€{çĄYÔŻ'˝ý”|ë™ID1&ć9$-Ҩý dĽń&‰gp]ęÖ0ĚŔGťA9öÍi5Ä+lnTŢdÜ6…őĎĄy—…>xjŮťGM†îöîŃe–ęaşRĚąČnŁăéXßîfźŕ.˝ň<‚ÍomŁf9;Iő T»ń&‹g/u«X“їť@p{Žy­kn I­ĄIˇq•t`Ŕţ"ĽwீtGáîź©kz|:…ĺâ6^äoňĐ1UUĎAž=i~Ü7†ôßVĚíi¤]JöČÍťa;G·ęZŹt}6ŕA¨j–VÓ‰,Ę­ůIâ+śx[Tą´”dYË$rFÝö"ľ{đ ď†'Đ$ĽńG†u}oWżw’âďě/*ś“€ŤŘéŢşŹ…2ęx#ĆúmĹ˝ü:UŞNtáy#™Ž~ŽÄšíţ ę7ß ô«ÝJé晕̓Lů'z“] >*Đ'ąű<:ΞóçZÜ)9úfĽ—@Ńő={öl·°Ń űc‚Â0Ű|Őe“>ŕĺKák݇w˛Yhú熢Đő¨¶Šî…śc•“ľHď@ĺUěď­/Ze´ą†f…ĚrÜ6ĆŽ:°Óµy†§ŹÂżüee;¬ď­†¬™ŕ ŢĚ“@ĄŁg=ě¶pÝA%ÔC2B®  ÷GZs_Z-úŮ5Ě"ń“ĚXKŤĺ}q×ůżŔóŢé~9Đ˙‘Ăźö·˙Ńk@öw¶·«#Z\E2ĆĹĆá¶°ę;Ötľ*Đ"ş6Ňk:zÜŹ,Ü.sôÍyÂËK˝GŔž9´Ó&ňon/®ă‚@qµČ öç˝axROizu·‡Ľ}áuŇőEýŰÜÝCą'oď‰{PĐfh–8Č‚nŢXmÇ®k;OńŤ¨Ü›{ RĘćqÖ8¦VoČňŻŽÚ„6–Đ-…Çö5ěßľŽČy @ż"ă®A®KĆňčRi6Óx'šޕ®ŮJ’[ĎžńäČcߊúZ¸ßř÷NŃ|]¤hrMlZěHg‘¦ öp c>ä“ůWM˘ÜKwŁŘ\\ˇŽy ŽIŚb ‘ŽÜ×řëĂš4˙Ľ1Úm«Ç}ŇÜ«F™†yoS@Ăiiyiö«[f¶ç÷¨ŕŻyŞVľ%ĐîîţËk«ŘKsśyi:–ĎÓ5ć,˘ł˛đ·„4D]3NŐő†ql6…†@úç>őĄăʆŹÁ7ßŮZl6¶P4Ö÷Pü˛+ ČËu9Ç9 P¤wXŃžF Š2Xś+”řS«Ükź´kűÖ/rđí‘Ďń8ĎăŠĺ>:Ís}/†<5Ä–öúĹčŠĺă8cĆ@üčż¶ń>…ux-mµ‹ nIÚ"IÔ±>Í]Ôµ;..ĄyokčÓHÎąÝ;áÇ„télĺłĐí#žŃÖHĄŰ— ˝ n§ń®ĂÚ=§Ź~*ř˛ďÄ‘‹Ë]ăµ´´—×vě±_řëí@»¦j–¬F]6ňŢî1Őˇ8•-Ƨcm$±Ü^[Äń'™"Ľ€_Sč+Č|MŁÚxâ…/ü7˛¶Őek;ËH¸Ťúa‚ö<ţޡ׼;iâ_Úí5Dil"Óy!Ý…”‚B†ĆN őý;[Ňő4‘ôýFŇĺcsŞŰGľË/h÷×fÖĎS˛žäuŠ9•›ňĽSâ/4Í?âW„ětHŽ™i¬n·ĽŠŐŚk$jA#ÔqZ_Ľ'˘řcNеXC§^Úę0 ’Ül.¤ŕ†ő d¸˝µ·š(g¸Š)eÉDw¶N>•RÇ_Ň/îšÚËSł¸¸Ss+7ä y_Ć­1uĎřN–I#ŠęYSmm„ ŔŮ\ŹĆł~:x;Fđ߇tťSĂVqéWń_Çš×äm¬­ś‘Ôä~´ě­â-o…“j¶"ěśy&uÝźLf®^ŢÚŘB&˝¸ŠŢ"Bď‘ÂŚž&Ľ›â'ĂŻi µítč“Pł¶óÖđ­i bÝNMfüT»–˙ŕ/‡nî´Ó‹)‰ÎIPM{“˛˘3»U$ôŞ®§bÚyľ[¸ 3‰Ě}zT^# x{T'€-e˙Đ x®ť˙&·q˙^ď˙Ł(Ůo|G˘ŘĚ‘^jÖ0JŕY'PH=;ŐťEÚ]é쮢…Ú1\2!ÚpçÔµç^ři᫟Ř6­¦Ĺ{}yl˛Ou7Í!f\đǦ;cұľĎ;|ń%¤ň´«do ±ÎGś}2Oç@›ŕ|<1eý«©Űę—›Nű»¸üž†Ą›Ĺ e›XÓŇă8ňÚu ź¦kĆSYşŃfk4ů WW;mRE8(C’?Gă]߆ľřJŰĂöq]é×— Ľ·ŤŇ;‘’sőô ęöţŇĆ:öę"ţüŽ~f Ňő˝/V.4ÍBÖě§ŢĘ•rîünÚm·‹`[ÉĐ–µłHÚWnßqzŹ­yŔĽŇ`ř·ŕűź č·ş*ÜHđN˛Űu#wż_ĺ@ˇŞ|AÓt˙ŮřvI­‚InóOpó!a÷PöÉÁý+®ŠúÖk!yĚ/hAa0qłąé^/¬řgE¸ýˇ,lçŇí$µ¸Ó^ybhÁW“/óÜńÖťńľk]-ü%áx-§‡B¸™ä¸µ°CąăBĹQęXô [Ó|AŁęw ť©ŮÜĚ˝R)•›ň´ëćźOŁ5ťŤ×|+­é:í”čńMžń‚˝Ăzţ5ôvť3ÜiöÓJ…$’%vR1´ ÝCQ˛Ó˘ó5 ¸-Łţô®~µ—¬iş˛łi—ö×j˝L2Çĺ\_Ä»˙&§§Ăâ«a¨ęQ+5˝¤q4φĆIE˙w˝pšÖ™ĆĎż‡4{ÍŢöŢhî!š Ë…$ż€ s›R±‚Y˘šîä…<ɤ˘úźAPišö“ŞČŃéş•ĄÓŻU†Ub?kČużŰx›öžËQÜöiiq4Y‚[FćŐ?ÄŹi^ń75oŮŧ\I¨­¬˘ÜlY‡p>ź­{í嵌 =ěń[½^V âkĘţ7x©‚lîĽ3¬!í(cy,çí*ůÓPřÎÍ<]ńŻKđö¨Lš5Ť‡Ű^Ű$,˛~÷¨áZç˙hhÚ.ŤĄjš-”V.oŁ‚XŕR@CHé‘´óď@@ÔWwPYŔÓ]Í0ŻŢy(‰©kÇ<{j<_ń—Fđľ˘ît[[#{, Ř>[ę0ő PŇüAŁę˛´Zf§gw"ňR•üĄŐ5Ý'Ie]OR´´fč&•PźĚÖv—ŕßhgPŇ4{KK¨âdB;{ŹŇĽ×ŕ߆ôżéWţ*ń=¤Zžˇu Qp7¬(¨< ö{;»{ŰužÎx§…şh‘\[¶Ó‡`;Ďá^ańŹEMCÇ~Ńmd{;iDđ í+ ąG§Ę®ĂÄĐĽ5đűĹ?Řze˝›>“pŽńŻĚŕDŘÉęh7ÇWş®›đBćéőuąŐ#7_Ú6ťŕeHöâşÍ'Äz]ľ•¦E¨ę¶‘ŢIo+,ę’ٱ5ĺúźüšĚőĺţŤŇxKáw†.|dš–›ÝĺŐ˛Ľ×rs)fČnŘĎJô©î!‚Ů®&•#W{HĚëźJ[yâą&·‘%‰ĆUĐä0őĽÂ÷×r| ń¶—{;\6“ö‹Xän»Aůć˝SáWü“źעPăkrÚÜÜ›ëo"Ř•šO0b2;Ř×3đűÇúw‹4¨îd–ÖŇęYä‰-LŔąSŽĽŽkŠř[§Ů꺏­µ x®mΫ3ä]ĘH@Aü Kű=xoEźÁVZ¬ÚeŁęQÝM˛ĺŁ×@ÁöęÚ¦Ż§i(Ż©ß[Z+t3H?ťMa}k¨[­Ĺ…Ě70’Dá”ţ"ľx´Ö´}WâŠ5hÚ–µök¦ł´†+Vž(Q śf¶ţÎÖź/ˇđţ—Şiţľ¶24VíqĚ rąŕwŤ{Mާc5Ě6Wp\KlŰ&HÜ1Ť˝†­×?áŻiÔuKÝ*Ž}JO6rŇÉ<Đdšč(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ż<ř± jzŢŁŕé4»V¸K^+›‚G—#-Éü+Đč Ľűă©kÖŢ]&Ő®×UŠâ`FȰ-ɢ˝ІöÚ;Ë9í§ˇš6ŤÇŞ‘üëČü-ŚľZϡ[h ŻéI+=•Ä$lŞÇ;\1ő潊Šóż†^ŐíuťkÄţ(G«ę…T[ÄŰ„‹žç§ĺNř- ę~ŃuČu‹V¶–ăWžć%,­ş6T¸'ĐţUčTPźx_BÔ¬ţ.xĂWąµhôëŘ­ÖŢbĘD…c@x#˘Ť_AÔ§řѡkQZłivö2Ĺ,ű— Ä63žăµz äÚĆâ_ xűPń/„ěV°ŐU~ŰcćpăŁ)={ţfşo xĹľ®Sđłi:hBZiîś·`WgEy%ýʉĽ'ń7Z×´Ť ő­;XŽ âU&EpOµ_Ô4Mb˙ă„ü@tçŠĆ 9Ňĺ‹©ňde“ä<äňŔd W¦Q@ĆťQń„błŃíšćä^C!@Ęż*¶I䊇⇅5]NăD׼2Ń sG“|qĘp˛ˇűÉźë^‡Eyµ·‹ĽsrđŔľ{y‹$ł]§–ą94˙ŠžÖnuźxŹĂVÉy}¤HűíY™‘öđ ăŚνŠđ݉vţ<řáDz‡Ă'M¶…ÖS×ŇÎĂ€ś2O&˝Äšż‰44Ó†Źáă«Úů!gΩ$l`x"»(Čl4]Ä˙ôŹ_x}%xqĽWŕmCL >Řщ`9űł/̸>äcčMuTP—üđÎł§_[ńl-nů’¬ĘĹbEŔäÔ˙!UőťÄ~ńöˇâo Ř&­cŞ*ý˛ÇĚęăř”žŻâkÖ( 7Âľ ń>Ż«ěŐ<.ÚFš#$Ë5Âł—ă(íÖłĽáýFÇâŽďő FŽĂRx>Í!e"PŞá¸#¨ëŠô:(Çô |8şÔtí7D:ţ=Ă\Z´3*I nŞÁ±‘Óüš×đ‡5ËŹę^0ńd1Z_\D-­lŁpŢDC±#©˙^“E|ůŕËĎé>;ńµţĄ®ŻdÚ‹Ĺqj˛äVęO‚F+ŞđŢâ?üH‡Ĺľ)°UĄ„&+"áß'?3cęOĺé]G<)uáÝ_Ä·w3Ă*j—¦ć1rŠ{÷®Ć€<źXĐĽIáj>$đĄ‚jÚ~ŞŞo,|ŔŽ®?‰IëëřšéĽ)ŻřźWŐĘjžm#M“ćÍp­#?GnµŮQ@D4ĎřĆZŐîŁ˙m蚼‚v†9U$‚^ýzźĺéPŮčţ0Ö~*h~&Ö´¤˛±Š)!é2»[¨9ä±cÓ=+Řč Ľ÷ŔZ§¦řÓÇ·Ö­®ˇqŰHYONČëŢ˝ Šŕ~ čZ–á˝FŰWµkiĺÔ§ť˛¶Q¶ŕđOˇ¤±Đµ(ţ4jzÓÚ°Ó%ÓŁ…'ܸ.:Śg?ĄwôP^;á _ř\ÖtčĽ9&©Ąę]Ĺy Č»7ŕŔžŔ ö*(Ďt­S‡ăVµ­ËjËĄĎa1ĎąpÎäc9ě{S~)hžłâ?\é–Ť<~Ş—LG—d%ą#=LעQ@_㯠kÚŽm|gá"Ľş}šňĹÜ!š>Ř'żň©ˇřźĹÚžŻiĎäÓlK¤\\\ˇÚ1ü*9'5ŢQ@yEΑâ_xŰVÖ<9¦ gHŐČ’âŐ%T–)Gń.zŽĽ{űW«Ń@UŁč^#ń_Ä x¦Ĺt« - ŮX™ä.Ý]ăÓňÍëRkÖżµ›ß ZE}5˝”&kGp†XĘ(“Ŕ ŕ׼×§xRę×â~­âgžkyişD3˝J€ =±ĹqךOŠ~!x·Dź^Ń›DĐt©…ÉŠYUäž@AǸéšŐń÷†uŰOŘxËÂEw{&ÚęĘFŰçÇěOđéÔP˘xŁĹú–­iǤӬ‹¤\\\ˇŘ1ü rNj5Đu/ř^-®}•ż˛ż˛>ÍöŤËŹ3x;qśôöŻA˘€<÷ă©ë¶Ţ]&Ő®Z×UŠâ`FȰ-ɢ¶5ýKĶŢ2Ńm4­.+Ť p~ŰrÇćóÓž;v9®ŞŠ+Ď´]R·řÍ®kSZ˛é—zCű— ᔑŚç±í^EaxîĘăRđv±ge–ć{gHĐ71x®Cţ[ŤoটáťE~ɨĹj Cĺ^Fqůqë^™EyN•âo:^ťź¨ř2MBöý®¤ÍŤÇ'‚{Ő^˝â…‚ÔiËýµ,É%¬R‰ 1  ôŠ( hěmăq‡XŐHô W’Ři^)řuŻjĂ@Ń˙·<=¨NnR(ĄT–ÝŹQĎQŰđě4P/ŕÝcÄ:Ľ×oŻhŘöĘČ8’G<ç pJ˝ăM&M{š®—ž\·P4hŮĆ é[TPŽxRëÇzG…í<5gáíníâű:ę :yţšIďŽć§đW„5ť#ŕĎt »SýĄ2ݤ({ąHRp3ďř×®Q@×ĂM:ďHđ‡a¨Â`»·¶T–2A*öGĆk‰<%ăíGÄž°MZĂUU7–>`GWĤőőüMzĹĆřSÄ'Őő}š§†HÓDd™f¸Vv~0ŽÝkŻśČ°HaPŇ…%čN8§Ń@Y¨řŹĆ:†ťu¦ß|=iĺ•<µĚmgŚśžź­T¶ř[yqđf? ßÜĆššHn˘`IH¤ÜH_¦ S^˝Ey4š÷Äi´6Ň…ŐZ/%µs“ÓLg>ř«~ĽŇľ ^xgNS{©I 3m y’łnlŹŻĄzŤ…ˇY\[xÂĆxĘ]ǧG Ç‘ĂŔ#=:ÖÁMPđ˙Ăű=?X¶kkÄ’BŃ– @'ŽA"»Ş(Î~řfúŇçĆńk6­ ¶©zÍ ,§ĚŚ©ŹĆż­dТđů×ôx¤vł¸·™Q‘Xçk}I?Ť{%ŕýG[ÔěćźÄBéRoÄPyÂF+ެGÓüo G⏠ę:<ϰ]Gµ_ű¬Tţ`Vĺäš^±ńEĐŁŃ_¢úúŢ?&A.Bŕp®ŔśôíŢş†ąđ§…. ż™n5ké$ąştű»Ű°˙=I®ęŠŕţ hzʇĽk§ë6Íkx’ČÍ`Äxä+µż·ű]ŤĹľvůŃ´yôČĹOEy´ń_„˘ÂÚŹ‡[îd)©E:lłÉĎS[źô-KLń§Ť/oíZ[űµ’ÚBĘ|Ĺ®ČükĐ( <ń.©Ýübđ¶łojϦÚZËóîPl g'¨č++YĐ|Gá?j&đť‚jÖ:˘ŻŰ,|ŔŽ®?‰Iŕúţ&˝bŠă|+âęúľÍSÂí¤i˘2Lł\+9~0ŽÝk±u¬¬2¤`ŠZ(Ć4=?Ć µRËIŃ?·´ »–ş€Ĺ2¤łu ü˝ëcĆ–ţ%ń‡Â}^ÚăB6z´ň(†ČN¬ĹˇÉlŕ˝Ć{W§Ń@š´ÖţÓífBłÇgN™čÁ#óŻ+Ó<­]|Ö|?qŮ5)îĺž$waĽ2ä‚F+Ůč űOŽu_  ŰřM4—k_˛Kw,čbTŰ´ěPrIÎŁ“Â:áýśĎ‡˙mlQö]ëźřů×8űĽőŻe˘€2ü?m5Ż…ôŰYФńYǦz0@üëĎ| áŤcNřQâ-&öɢÔ.¤»ha.¤¸uÂň9ú׫Q@źÂť.óEř{˘éÚśŢňŠÉ •;ŘőŽ„V/|1}o«xäjö­ ¦©vL,YO™R ěĄTSěp*XĽaăÉcHŔoߤ’í ÷9Îq^›E"d¨Ülr­y§Äý\_xsŰ”šp’)­7„fVî üJôĘ(Ě|cˇë^:𦟨EdÚ'´ŰżµYĂpęß2ž2FG8đŞî§ńÄşş~\÷iä\ßKrŤ!ኀrr3ôÍzí‘á/xkOŇ`békŹqţ#ÜţuĚü[đť˙ôý:óA‘#Ö´«umć}×#řOä+˝˘€<ëEń_ŤŻ/ěmoĽÖŠŇŞÝ\µŇăLüĚ “ŚŕVvĄ˘xŹÂ=ÔüCáŤ=u}7WU7–BEIEčĘO^§óŻV˘€<¦ÇFń'ŚĽuĄëľ%ÓFŹĄišÖÍĄW’I«1c§Ő­mˇjIń®ď[kV[ékĎąp\6vă9ý+Đ( <ńŢ©ę_Ľ©YZ´¶VĘ×2†P# pNOáS|dĐő{ĂvVÚEł\Ďü32† „VäňEw´PžřÓAÔőř'Płµilě$‘®d  F ŕpNOáIńĂAÔüEá;;MŐ®®P†fEe\ “ɢ˝Šć~#i×zŻ€5­?O„Íy=«G`ą˝2x®WÄ> Ô5Ď‚z^€`Ő­m-ČŤŘq,h2ązŚ×¨Q@I¨ę߼C Í˘ &›us‚âţk„1(# PI$g™¦YxS[ŹŕŢ{ĂBĘ-·®I/śg8éď^˝EeřVÚk/ iv×HcžhŃĐv°PâĽűáφ5Ť+áçŠ4íBɡ˝»ší ş’áÓ Č8äúתŃ@SĄř ÷Sř†58ţĹ©,{3ĺČŻąrA#§ĐÓt|BÓ4Ř4ËżËČD·It‹€púW¬Q@Mâý#Ä_Ä»Oi:(Öak!m-şČŞđ°'•ĎůëTo´Żx—â…uíGF[ :Ć䏳yĘňD¸É‘ÎqĎL ôŻg˘€<ŻÇú?4˙‰O‹ü?¦kE «Z\Z¬[ć˙{ô©|m ëľ*Ň4iÖcMń.—+MťĂ†Ę“‚…‡…ńŻO˘€<Î/řîuŽđĂtpIŻDľ§ äŠôĘ( !×´řsâ˝ďŠôŤűvÎţŮadIUd€QĆď÷{zše®‘âýkâ—‡ĽK¬éQŘéöë,BÝfWhŁaśç’ÄŽqŠö(ϬtJ?Ž:†¸ö¬4©tl——Mńť¸Îz۵;âĆ…©krřXév­p,őD¸ź Łd`·$~•ßŃ@gńĂúí§Ť´ĎřVŮ/® €Ú]Y3„2Ĺ’FŇxĎ'ô®WâE—ŽĽ}ĄÚ"xléÖ–—)1·’áY›¦G8A=ű×»Q@y—Äo k‘xżKńŹ„ˇŽëP´„Ű\Y»ó˘É<Ŕ?1ý+Óh /Âľ!ń6±Ş5 I¤ŘĽňÜ+üa@şó\ž…a⿇zŽźĄhm®č3ÎÓÚfT’Ç•`ŘČŻ`˘€<ÓŔ>×.ˇŕÝzĘÎ3-ÍĹ„đÄ€ąÚ6sÇ$ŠŮ˘€<ž÷ÂÚĚż!đňY7öŔ¶HÍľőČa $g8éďLÓő_>đőľŠľ]Bî„ßĹp‚6`3)9wúW­Ń@iŕ߇“éß u] SťSŐŁ™®%!$uŔçľ8?ťdxb˙Çţđí·‡WÂbâćŮL0ß}Ą%rpÇśńé^ĹEyÁ k‹â+?D#žîőäY‚$V@ sÖ¨|-‡ĹžŰá›ď˝Ĺ€»vMJ)—`ŤŽI ś˙Zőú(ČäŇ#ć€>¬Ňu+=_O†űM¸ŽćŇaą$Śää|gńKĂĽ6z…ŰKx>ô6뼧űÝö®ŕę>ř)¬ę—JńŤÓÝY¬řDjcа?Ď˝rßłż„t˙ßëď‰ MEâ”K˝ZGË30<1úĐŻř3⯆Ľ[©&ź¦Ď:_8%"–"»°2pzt»ĘçtŻxwFÖ_VŃô‹K+ö„úػI fą†÷ĺńެľ.‹nŚy¬`Ü6ě+Éőţtéұ±jť[›ýSV.»5ýľ“q.ŹkÝúĺC$›ÎFrݸɠ¤N×¶«rÖÍs¸Tó FAĽ'÷±×ôű[.ŕYífŽx[;dŤ)ÁÇ{×Í—ľ!ń)ĽńʉßHµŁD®.3ösŔ*źŢÉ+]Ţ•­ëţřXŇęZ%¤+§E [ŞÜnó·™›ĺ99ühĎ]˘ĽŽăâ7Š,ô[ŢxjđÜ»˛ÜfuŤČĆ0r1őčÖş–žş×l•gŽ;Cu'ĆÜŚĐĺäÚ?Žüeâ]. KĂž¶{={Ü\lódxGěFOĄoxżĆ÷š9ŃtÝ;Kű_µE –ŚűV.2ŰŹ çň .wtWťhž7ŐíĽ[káßipXÝ^ˇkK‹ywÇ!ůNz?Îk+Ä?5ű]cĶÚN‰ksmˇ”yĺyŠ’‡=±×ůç­Q^cáŻZ˝˙48uM"M7\‰ä±u”ĽQ‘Ľc#šµŞř×Xľń-î‰ŕÍ* é,p.î®eŮl„c© .z%FÓDł,M" Xd!a¸Ź\WŕĎÝëW:®‘©éëaâ9w=¶ýÉ"źşĘŢ™Çć+Ďu«˙‹z“iję‹e †ş&7Lś’ŘŕűP=ŇyRd–VŰjYŹ &ŞčÚ­–µ§E¦NłÚKť’(88¬gÖ.<%©ż,í­.ü™@ŽŢS"íŘpr@ç­yGĂŹř¦ËᵼšÎź`®e–y¶´¸$°Ež´Ď|˘ą+_éďđú?\ŠŃˇó<äîÎ6S¸bąY|uă;}ţź [®†ÎhĹÇúBĂ×y\zs@\őz+ńźŹÓGđ†ŹŻiP%äŤĚP¨‘ŠíWV9ă¸ŰŚVźÄOËáM č-’᤺Žßk±PgŠęh®Câ‹ßÂÚnžÖ¶bóPÔ'[khKíRíÓ'°¨Ľ=©xŐµ›{hş|v†ÝqkpXÄB’®HÇ´ŰFĹ\W*’ýáő«´ AEy-żü[ăťVÁ÷–zV‹§LmÍäĐůŻ;´1Çň«ţ ńf·kăiĽă?łÉ~Đ™ěď ]‹pŁ’ ö8ţ‚OK˘Ľq†´t?x§Ař…cáŻÝÚjPjPĽ–·PĹĺ0e*@ö R¬ť7\‚˙YÔtءť%˛ÚÝ0­źCZŐÉřkZĽľńŹôű†Cmdc€¸#9ÎO~•¤#Í>ßćg9rĘ+żůeĺÚżâĎMi§Kkl-n^ňHłňôT ëÁ$ý+gÄÚţ­¤GŁč¶>Mď/FÓ#.cď>??Ę´xi)r]\ÍbbăÍgc¸˘ą]ÇĹ–úŚ/«jÖwVg>liÖqő®Ş˛śy]“ą´%̮ՎsĂž)ŹYŃő @ÚÉYÉ"2˝›`Ď_JKźĂ$ń VÓ4*›Ä2|Ś~`µĚü4ťí|âEqq"ägąjú•ĆŻđZćúô«\K,UvŹő€t®ąPŠ©kȋȫKŮŢúٳдű‘ycorhš5}ąÎ23V+Î4eńĄ÷‡í/,ně,⩆ŐâÜΠqą»f¶|5ăőÝj×ńyŘď[×űĘ;g׏Ʊť®âď­´6…t쥦—:ę+δűŻkšgöŝ協2$mâËŰ-ďWíĽ[>ˇđ÷PŐáEP´GIŚ…‘zţ<<–Í=mč Ń­/ęvÔWźxn÷Ĺľ$·±Ô’â×OÓÉ\ĆŃnyÔűg˝®Űx–çPۤ_ŮYX„;ĹľBÝúńŠ™Qĺ—+’ksG™EťĆx?[Ő_ÄZ–Ż<3ÝZĆłGŮ•e:.*÷M^Ƭ¤ífžćýGs6Ňt™őYuM>ołˇ–KU·Â•ś7^•ÄKűíSáĽzŤ”ŃAi4*÷Ë>â =‡Z¸áď(®efěL±MŮÝ+žŽŽ˛"şĘĂ Žâ–ąźZëŰŔú¦ŁmshĐ/—pěe8ÉďĹtŐŚăĘěťÍˇ.ev¬s1ń®ťá9-“Q†úSpŻŮ­Ú\cqÓ­réńŻĂ;ÂęÍ2 ´bÍ‹(÷éäÔ^IŕŐđĐ>6ű?Ę:‚ŤŤc⍍§„á׬ě.ć‚KŐ˛ňćS#;°GNkĐëČ˙iył”.vj6=pŇęrüN¶Đ§ńÔ4¨Ľ¨MÁҾϜ +ż®ŕ=čŃř¦?ę·÷XňĄ·‡Ëůw/QëšôŹę#WĐě5ŚÄ. I‚ť»†qšż^+ŕ¸ţ"jľ Ó/4˝GMÓ,âµU¶µ’ßĚi•Ff=3ŽŐŰü-ńU׋Ľ&÷—qGŁm<–“ŞýĎ1ä{|€;:+˵;?‰ńŘ]j\ŃăšiVĆ+]ĘŔvď<ć®YřŢďTř3wâ›tŽ F;9dŔU‘3În3ŠôZ+Č<9yń#ƶÖlµ=3I†Xó -mć4Řţ&' '=+kŔ5ÔXŽŐ­VWeň™÷ޏsĹşýż†t+ŤVîć†e ]ĚrqҸŻŮĎţIm‡ýv—˙B­Ď‹zíď†ü ¨jz["ÝĂłat 9`€:ËIÖćÖĐ2¬¨ žEK^ińĆ:®•oá‹.[;K˝dŞ5íŘýÔ?(=:d“Ĺiř{LńÍ–µnÚľż§jZQÝç(µňäm#ޏëÚ€;Šĺ|ăń»âM5-Ł] bĺ÷yĽ°ČăîţµŐWĎ~ “Äó|IńţźáY--|ÝE¤žňĺ »€{“»ô ˇ(Ż0đ牼G˘řňŰÂľ2–Ö÷íń4–WĐGĺď* *ËÓ ?äÖv­ă]|JÖ<'áÔµg ‘\Lź-¬`|ěŘűÄ–Pz'‹üKmá}:+ËČ.gŽI’°&ćŽ>Ő¸§ ZňĎjţ)đw‚lĺÔ5K[íV]F8šu· ľS6íőëÍi|Lń~§¤]hÚ†ˇ†]{Wr±4Ă)ŹĽä{JčĽ{â5đ—„ďő··7+kł1Ú[sŞu˙fµôۡ{§ZÝ…Ř'‰%Űśăp­x?Ć8üs¤ü?ż‹^Ô,5}2íŁŽWŠ)íŘH¬§Ž ’»]·‹üU}áżx^ßFŽŐuA¬nR< Ëßqď@•ExźŽµ\Óx’ÎćŢúĺ-¤?bQä–=@î+Łń§Š5Ý´ éOm}âťO ÜH›cE\–¨öŹjôš+ȵ-Ć^Ô´»Ź_Ůk%őŔµ‘ŕ€Dđ; ©ă¨ŕţUŻń ĹşÄ>&Ň|+á%·ţ׿Ü=Äëą ‡$nÇsň·ĺď@ź|^ž đúj’Z5Řk„ËWŮ÷9ÎĄuUó‡Çüe¦ř^ŇĎÄ—ÖZ­„÷hës >SĆęĘ@ŕ‚ ü«čńŇ€+ÜŢŰ[Oo ÄńÇ-Ă…°\’ŻbĽ;â„%—âĎ…!¶Őm!´Í` 8]ĹĆ~bxúWUâżë^đlMŞMo¬x‚îăěö‚Ľµvno·ë‘@ŹEyŞ~(hZ4šĺĆ©Ąßýť<éôÔ¶ÚX+ő$ ţUčž× ń7†ě5{U+ÔaöŞzřĐż˝¶ÓíšâúxŕHälIŔŞž'ŐF…áÝKUhŚËenóÁĆí śg·Jň˙ÚIuořGlšÖň´Öą‰$„ĆK´›ŽÓ»?tzVωl|IgđăĹ˙đ’ęÖš€m:_+Č·ň¶|ŤśúĐmám\kţÓőU„·q Deł·=łZ•á˙bř«řKźGÔtÝ&Â[Ĺ$kÎřž€źJěľřŢ}sÂşĄç"ŽÚ÷HšH/ tě]Ĺ€íĆxö úŠńýVń˙Ž´ů5ÍPÓ´m1Ý–ÎŢX­*©#,ǧ Ž+¬ř[âëŹi7i©Ŕ¶ú¶ťpÖ—hźwxîľĆ€:mwT·Ń4‹˝Jô°¶¶ŚÉ!Q“č+7Á^-ŇüeĄ=ţ‹#Ľ)!‰„‹µOĆ©üY˙’mâúôjóżńIř«KÓÉŮaâMÚözyëďRwĆ€=źÄÚĺ—†ô;­[TÇinrIÉ;’H¨|#âKč‘jşIÚHĚŞd]§*pxü+Ď>0îń?‰´BI·ËjWř="Śő<}H«żłÎ˙řUVľNĐţuĆÜôÎöÇá@źLžXŕ†I¦uHŁRîěp’My†­kń6ŰM»ÔÎ»Ł¬#L,cµĘ°PNÝÇśŕVwŠĽE«řŻŕLšćź=˝Ź›k żŚˇbę FT=łĎŻ€=zÖâ»hî-¤Ya‘C#©Č`{Š–ĽÓá-—‰ŕĐ4›ťCXłźH6@Ĺj–Ű]xrÝń\׼Săď[ÝÁ¤\Xééeq$sjC»yÉÚŠ˝8\dűŠő=CÄÖÖ>*Ó4-îZćýD•1¨Q“¸öé[µçwşţł¦üDđ‡‡î.aš;«)ńÄ@%Dĺ‡÷A#8¨n|a¨ř_â!ŇĽW4_Řz-§^l"aÖ7?¦~ž´éTWťřĺό|I©jVěxFÝŤ˝¨1Ť÷N:¸oî˙ú˝kŃ(˘Ľ/Ŕ^(ř…ăý ¶›ua¦Ął˛M},Ě­Ô*Ż@ęk¦ńwŠüAż¤x;ĂfÚ]~{q5ÝěÉáP9mŁąÁ?ő N˘Ľ‡UńŚ~ßi×+ľ˛Ö4+©„O·cĐńÔ…nüHńv©§júO‡<+ 2ëš™,Ż8ĘCęÄ}ü¨ĐhŻ×őźř+m[_ż±×4S*Çv"·<Ž:ŚńůV§ĹŹęž‡Ă3řu"¸ţҸňü§ëC(Ú3Ű’(Ó(Żń^ąńŔ¶Vúöµ¦ęzq™RćÎ<łoî·_ÄÔúµ÷Ä•đĚľ)ŠűL·!űXŇţϸ±»Ď;¶ý(Ř+ń÷‹Â6W/h×"ćé-‚‡Ű·qëŇŻř;Y!𾙫ňÍÜ )Oî“Ô~uçż´ŤÁµđŽ™py‡QŠMżŢĆN(Ö¨Ż&Ő⍞Ź.şo4’aŹí¤­ą$ ä®ţĄ€Čă©­‹ß‰đü.‡Ĺ‘[ď’uTŠŰ=fc·oÓ9üz rż|^ž đňj’Z5ÚµÂAĺ«ěűŔóśJâ5+݉š?‡Ď‰.µ-.á"Aq>–¶řŰRőČKă~·oâ?‚úVŻh Ăww[Şś8 ý#đ n(®âwŚo´tŤĂÖńÜkÚ´ž\^R%˰üCé\÷5/>±MoVÔl5˝67Qwo¸‰˘Rz©qď@żEyΩăËořJ(fŤü;®Űź Č®ĺ;˝ÁVĹ?ú·‡|kge¤„m:Ń"›SĘ!^@ g·ő c˘Ľ˙âOŠŻôÝCšg‡ĺŚ^k€dŢ<…qöÎĺçë^€:PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^ űYČA˙®ď˙ ×˝Ö^˝áí#ÄĹ·§[_$D˛ ÓpR{ŠńżŚ?ňo^˙®v?ú&¸űʆöúŹÁm3Äz,u{ui§ IóÓ<ńę0ç_JjŇu&.űO¶¸Óá #·‘2‹´ap=‡gNÓl´Ý=,l-b‚ÍU… íŠó/†ţ'‹âOĂ[ý"wHµhíšŇučW ‡ż¸>Ő埼iĂMkWŃĽWoqk®7°BĆ)#9 Žă5ô†Ťá=DĽ{˝#I´łąpU¤†0¤ÔRkŢĐ<@áőť&Ňî@0HÁařő   üRđ犼BtŤî§Bә𑀤9ĂgźJ_üMĐü[â+íMŽń.mC6ůŁ$ pJIëęnčĐ|?#IŁi6–r0ÚĎ`1™§čţŃ4mBćűKÓ-­nîsćË`¶NOë@ÓŞjă>!ť^kÍU‡Mű"<óĽ°y»ŃW8Śt®ÎncjĚżł·żłšŇöžÚe)$n2¬cAHůžŰEńú?…´źíXxŠíµ ŰüѲĹÜç‘ČăÚ˝+âĹ®Ągđnţ jö+ëŐuÝ4qyjFţÜž‚˝4M1.ěî–Ćqg†Ţ@śÄ„`Şú ć~2éwşÇĂýBËL¶’ćéĘm‰IĂ Đ9řżDąř ŢEÔ/5ŐŚv±Ű+ …R»Ů9ü«vöŇkł[]YŁŇpÝAŮĐÖ¶•ŕoĆöz„ş%Ô’4-!d8'Ó9®šňÖ ŰYm®âI­ĺRŹچ¨4 ć~"§Ă…Î3ř‘“\źŤ.˘Ń>4xkTÔŰĘÓçµ’ÔNü$ră'¶ră^Łcioag ­ś) ´*8ĐaUG@WÖ4Ť?Zł6şµśväçdŞgÖ€<·Ç—ÖŢ ř­ŕktşžĘvą¸hX0DĘžHöSůŠĎa˙/ŚőĆýZőř_DđńčşmµŁH0Ía{žµ?ö•żQ°[îÔ@ggúđ3ŤŢ˝Oç@Xň{^.~cţ}‡ţ“ŠÉđŢŁżŹ<[§ř›RľÓŻžůîmü»Ć·Y˘rH# yŻo]KS§cnś»m>OőpľśqPkţŃĽÔ&K{W˛–,‡jîÉă?®űAđćŹářÝ4m:ŢĚ?ßň“ľ§˝M¬hÚnµn Ő¬mď!!f@ŔP•ĺµ÷‡u)lî"ž?łĘ7Fá†v2+‰řLř-[iĎţ…]Ţ—ˇéšNź%Ž›comg!%áŤ0­‘‘ô©l4»?N}•¬PY*!E€zŚP„G§Üę?˛ý˛YŁ;Äď3*ňJ¬îMnéžđ§á¸Żdń%úŮËóR]U€PGĚŚ¤ńŽAëzf™eĄééc§ZĹof™Ű k…$ž=É5?ĂĎ OvneĐ, Ĺ·ĺđO®:P+Ĺ}7O°řGˇ.„ď.‘gé!%żvwŤŮôˏΦřßâm&űĂš5­Ťě3\ßA*¬N„;Ž:@ükÖ'Ól§ÓNšÖ±dňĚÍľ¬[OřZŇŠ ĹQ™\Ź(rá@ěSř¦řwXŇll|Mx–eÜ5¬¦_-„€ =ń\>•©xcâ6‡˘XxžOé×ű–X&a$ ÜX~…zľ· ézíŞ[ęö0]‡*˛®vźQéUt h>•ĄŃô»kYX`ȉócÓ4Ľżx}jíRA–Z»@¤xÇÁ}JĎ·ľ#đ¶·qťő˝óÍžÁDŃžŚ¤őŕřÓˇş‡Ĺż´ ŤöŚÂâĂC˛t¸ąŹ”.ÁŔP{śżčkŇő˙ č^!dmkKµĽtW–0XŻZ·Łhúv‰köm"Ę 83ť PMžmđÄř[źŽ9óaúIăŻů-˙żëť×ţ€kѬ´Ť>ĆţňöÎÎnď7˘áĄ#¦ăß©˘ëIÓîµ;MBćŇo­'eËG¸`ŕöÍ^®ÁňQ|cţô?ű5wŐVŰO´¶»¸ş··Ž;‹Śy˛(Ă>:gó­!5Éw_©śŕĺ(ľĎô8źŕ}‡]=˙´¤ţBˇńÄë˘üBđîµxÓÂ=Ľ’ă"2ŔŚźűë?L×y§éÖzrʶ6Ń@˛ą‘ÄkŤĚz“ďO˝´·ľ·h/ Žx[ŞHąµöëÚąŰGţV2öŮ(_Uţw*Űëš]ĚđĂo¨ZË,ŮňŃ%·ŕj4ÍoNŐ.Ż-¬.–iídĘOâ9éÚ«éžŃ4»ˇsa¦ŰAp2ŠĽŚúU» &ĂOąş¸˛µŠ®[|ÎŁĎżćk9{=msXűM/cĎľȉâúíu˙ Uu˙’ ˙őÇ˙jŠô«M*ÂÎÖ{k[Hb‚rĆHŐp·\ýi‘§Ť/ű8YĂö cČŰňc9éő­Ţ&.\ÖęźÜ`°íF×č×ŢsŢńNŽ<#g<×°Cä@XŮ€d*9ëšäĽ/¦]ężüS418mJi&·NěĎS‘^wáMňŕOsĄZI(ţ#­ŁHbXâEHĐaUF‚§ŰĆpZ¶žľCö2•”މ[O3ČĽ¤xSSđý»Ýj0^F»'‰Ż=¬:ńž•ż}§hÚoĂ]y<=7ťi"HěâO0ŔźŔWKá=Pą7šU¬ł1Érśź­^M*Â=5´ô´…l™JáH=F*§‰Ri¦÷˝‰†ĹZËk\ˇŕP4< ˇĹ˙ Šáěž/xź^ŹÄşĽö±Ů\4PYĄÇ’»?1Ç^ŻPµ·ŠÖÚ+{hÖ8bPŠ0€V^§áťTąűFˇ¦ŰO?÷Ý9?_ZŠuŁIľżz4ť)8Ĺ.ź‰Ŕ|<ţĎ˙…ť¬ ťě–Ëj;1mŘtÉőŻ@·ŐôýoűJÇO»Yn-ÁŠeŤ„‚;Ž µkĄXZ\ ím!†a’ł9Űô¤°Ňl4ű›«‹+Xˇšĺ·Lę0\űţf•Z±¨ůµ˝•żŕ…*R¦ątÝ˙HŕľkznŤqŁjsGg¨Z\>řć`„‚zŚőďW>*^Úę’k)⸇íQ.řŘ0Č~Fk¨Ő|5ŁjÓ µ:Úyzodçó©°´żěĹÓľÁoö` ź.sśâ­Ö§í[;ŢäŞ3ön•Ő­anF<=(>Ęô ňű-VűGř'os¦1IŚÎ†@9E2¶HŻ_hѢ12»JöÇĄTJ°N:|6Ą‘Ťśśž>¦˘•hÁY«ęźćUJR›şvŃŻČňďiţ˛đ•ĹĂkžˇ,$BMŰ9‘Čë´©öˇŞŁIđ6 ŠX‹Xφk´˛đ®…c#˝¦•iş•bt<ZPŮ[Cd¶qAÚŞěůBúbµx•Ą®ě署Ă=oeum ­[ÓĂĐ\-ě(mD’ŕěU_‘íVĽ9Żéž$ÓPŃ.–ęÍ +/#¨ÁІËÂú%‰¸6še´_hC»Sď)ę§ŘŐť FÓô=lt‹H­-U‹ă=MrĎ•ĘńŘé‡2ŤĄąˇ^Kŕßů8/ל?Ę:őŞˇoŁéÖڵΧś1ę*k…\<€cžýĺPYćߴЇđU‚°NĄ ÷סx»ţE]cţ˝%˙Đ XÖ4Ť?Y·H5[8náG*J»€aĐýjÝÄ1ÜA$3˘ÉŠUцCÔđKßů5ëŠčÚôŤj j>Ň4ŻÉdâݸp„Ł%OŻ5Đ·‡t†ĐĆŚÚu±Ň€Ŕµ)űĽg=>´ÍoĂ.ąk ¶­¦[]CÄK"g`öô %Ň]ĽńAĐü1ŻË«hú‹2M§É(Ú¨0aĐżŻr¬=ÂZ‡ä2hÚMĄśŚ0^8Ŕb>˝kr€Ŕű _úŻ$đ&«}˘ü ńΡĄôČ5{¦FĆvü± ŘöŻw´¶†ÎÖ+kXÖ("PŠ0G ©¦čšf™iqkaco˝ÄŤ,±˘®ěbGr@â0ŘxMĽşćżâ[Ý[Sž×Ě1ý˝˛Ó2çËXÁŕî8ĹYđwü›«˙^—_Ö˝CNđ'…ôíD_YhVݩܲ,C*}GĄiĂ éPhňé0Ř[¦›(e{eL#ę÷  Ź…€/ĂŻ0>Ɵʼűáoü‹_ëúď˙EšöK+K{H­láHmâP‘Ć  vŞXčz]Ś7‘YŘŰĂă3Ü*&¬Ă·®h‹ýź@ t|¦_ýŐ“đöqń ⬠pŇKčJJ+Ô4­6ËH±ŽËL¶ŠÖŇ<ěŠ%®NNÖ™c¤éö×·–vĂuzĘ×2˘áĄ#8,{ă'ó ž>xw—·úWŠ/ŻtívĘęD’˝hÓ<2ŚăŘý=ëÔĽáďé®Oá[ÓwtđůwMöŁ9>µŇkŢđöż8›XŇ,î¦cĆ7~uoDđţ“ˇÚÉm¤iöÖpI÷Ň$ ëë@7ěç˙$¶Ăţ»K˙ˇUŹÚţI^­őŹ˙CÜéUŽŤb–zU¬V–¨IX˘]Ş ëĹ.«¦Ůjö2YęvŃ]ZÉŤńJąVÇ<ŠĺuŘ|-©xwIŇĽ[%ęĐĄĂ„bBŚ•>Ľ×¤HŢ ř“ č^×ĺŐ´}D˛Ía$‚cj pÁ‡@:ţ˝k[đĆ‹®[Co«é–×pÂ1Č™Ř=˝)š„ô»>ŤĄZYČĂăŚ#ëÖ€6ëÂţř‡NŇ>+xţĎR¸ŠŐ®ďݢ’VÚ¬Uß+“ßćĎá^éX7žđőěwQÝhÖR­ÔĆy·DůV>ôçZćŁm⟎>·Ń&K¨ôĺžîxŽĺL©Âäq×ń«ŢţÇŚ›"ÎźÄW xsGđô/‹§[Y#ňŢR`·Ô÷«úNźmŞ\ę0ZCýĘ„šu\;Đ@{űBČĄ§ŘNß˙BŞ.SĂ˙üâC)Ą"Ék4ä|±3 }=}z–­ĄXjöé©i Ô(âEIWp :­?SÓ¬µK'´Ômaąµq†ŠU §đ 'ý ĽYŁKđâóN´ľ·»»ľx„i‡!VErÇ÷źRŮ~hw3#­ĚÔŰ\«ög*óŽŔvúW{eŕ/ ŮAs ¶`‘\®ÉWĘzç8>ŐŔü^¶k_xfmZĆćďÁVŃšÚÚ2ę’ ŕşŽ«Ť¸ú©ĄĹˇkš®“/‰ţ"ŮkFÎE–ŢŃJB­ čXg$Ôtë$ř‰ámW_7 áů­g¸ĘçiÜ: O¶k;Ç~ ń‡§Ňüቮő‰đ°< ä|Ĺ«ŮĹPFN:dµ{¨é\Í·€Ľ+me-¤: ‚ŰĘC:y@î ägé]5y/ĹK¨tߊ_ďď¤X,Ő®¦s…Rvc'µ7㌩6—áßéĺo­4]R;‰ü†ň‚ éôťzfą˘işőźŮu‹(/-ó¸$˸ę=)š>ĄhÚciÚe„ö,IhU~V'®G|Đ/ăxv^ßĂ©ÚÜ,ö̰E†yY†BőÎO>ść¤ř-Ą\h˙ tk[Ähć1™YŞďbŔ~µˇiŕ Z_ ËmOŽäÁÄCę+§ +ýŁ_C6Ö1Ă} ą8<Ö÷ʵ};Vřgâi4Ëë{´:lÍd ÁCĹu÷övÚ…¤¶·ĐGqm(ÚńČ»•‡¸¬m/ÁžŇíom¬4{H-ďS˸ŤS‰Wź”űrh—Âe đŰĂÁ@ě‹ŔŻ?řqa.§á6ßëî/î#Śz±Nç^Ícgoag Ą”)´+¶8ĐaTzPizFźĄ5ÉÓ¬á¶72¦1®<Ç=XűĐĎß |?ŕÍSĂ1Á­ę7–ŐŁĽwVĎ~Đ`†8!r8Ć?×®ü6Đü1ŁŰjÂ7_jŠYżŇ$űGťűŔ:gךż­xĂ:ÝŮşŐ4[+›“ÖFŚn?S޵tm#OŃlĹ®“gĄ¸9ňáPŁ>´ńgţI·ëѫμ[cqÁĎř—N_ôýÖÎé}ÓË@Ŕűt϶kÚŻěíő 9­/aIí¦]˛Fă*ĂĐŠŹű2Ëű$ie‹ű8Cöłíů<ĽmŰŹLq@[đ©źÄ“ř§Ć×<Ú­­ú¤:~'úV/5[ýöq»Ô4ž/!iĘ63ł÷¤ü5íšv™e¦éÉaak˝š« k…őăń¨ôÝMÓ4çXYA‰ÝO›ŻôáňiŢ˙…~Úεâ[Í[TžÔ¸S~Ä´ĚĽ"Ć1Ć1VĽ-Íű/_$JYľËpp8Iýz†ťŕO 麀˝±Đ¬!ş"EeO·ĄlišU†•§-†ťi µ’äc\ Ď^=ó@ŻÂÝkMľđ‹ĄőĽ· f˘YđTrëĹa~ÎjuRę÷űđ•Úi> đľˇ¦hö–·Ś ™cLżťiéM†ŤlöúU¤6Ľ†VH—h.z·ÔŕPśřłţKÇ?ëŇç˙A5—ńdËńÄ–žŃV2-›íz…ë.ál (÷9ÇŁŢ˝j}&ÂăT¶Ô§´…ď픬3˛ĺĐ zf—˘éşT÷SiÖP[MtţdďŕČެ{ő  ྸałźÁÚ¬Ii­h§Ë1¨Ú&‹$dúf˝ Ađ‡‡ô šmHł´™† ‘ĆcëZšŤ…¦§i%®ˇmÍłŚ4r¨e? -řéâm2űÁhz]Ôúž«,PŰÁ ß Xă ăó" ř“fl®>ZJ2đß$mžy+Đ´OřoCşűN“ŁYZÜv‘#‡Đö­=GI°Ô¦µ–ţ҉-_ͤ\ŰÔzóďÚ7ţIm÷ýv‹˙B®źĹ# µ0:eżţŠ5µ¬iVÍ‹Yę¶ÝÚ±˘•w)#§<ö°Ofö“DŹlčchŘ|ĄHĆ1éŠä~ É0đ÷ý{ćk—ýĄd0ř;N”'SP‰‚{8ŻTÓ¬mtŰ(lě ŽŢÖŰQŚ*Ź@)šŽ™e©ý¬W Vh„‹ťŽĽ†â€9|CđŇx&ďU‹Tµ–9-Ĺqć;•8M˝sž=»×–j~żOŮ·JI ™žÚéu "\‡ň‹6 ůü+ŮźŔ^}Gíí éćëvýţHë뎕ŇCBŞPŚmÇôĹxž™á†š¦…é×nĽ‘"ËŞ˛íăŔž>•Ćm?KŇţé6ž3J[ČžÝ÷ďÜ­˝łžůÜkŃćřsŕů®ÍĚžÓÚRwĺ 뎕ł¨čNĄ¦E§_éöÓŘDTÇ (»F° 2ř¸˙Ř?üâ«´ě»g{[‰@Č‹p8'đbŕ5wăG‹4‰~ŢXX^Á{{©…‚Úw3’G8«Ó/m-ď­d¶Ľ‚9íäxäPĘĂÜV&‘ଠč÷żkÓtK{r$H†GÓŇ€<ëâ~‹sŁ|%đÍěk˙ ý’\çˇPŞß†qUüŁ/Žü3ăÍjt?ń>‘âµ.9Xă˙Vď á^ϨY[j6SYßAŬ˲H¤V„St˝:ĎJ±ŽËM¶ŠÚŇ<„Š%®NxŕŻ.|eńM»˝G áÍ$[6îžq%˝OçIĄÁ®\k0ŘšťÂ–ŕ/ÎŔOĐĘ€4袊(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*6… Ď#éRQ@y ďGžő-ä^B{Ńä'˝KEr/!=čňŢĄ˘€ąžôy ďRŃ@\‹ČOz<„÷©h .Eä'˝B{Ô´P"ňŢŹ!=ęZ( ‘y ďGžő-ČĽ„÷ŁČOz–Šä^B{Ńä'˝KEq‰ˇČűÓč˘Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0@#ŢŠ(©'ÜE_ Ĺ:Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š( :Ń^űRßŢXé:Y]Ü[ťĂd)ź—ľ {•Ô׊ţĚţ!şľŇ5mTžio,§ßűç,á[‚ <đAŻ<ř˙â˝FóÇ÷vşUíÔ6şd+ů˛ ىÁő`?*ú¶ŠŕţęńŘü Ň5]ZyZ8m łJÁ¤lr{“\Ë~Đž>X´Ö,ăÎ&ß®7ç†hب®C\ř éľ _‹ż6Âo’ܢ’d‚Bc±ŕőéŠň†_T}˘ŰĹĎ{swsr˘ŘÁEn0NGjú†!T– É'µqz˙Äť@ńT:ŞóÁq,>žČ<”\1ů›9töô¬‹‰>ńľťâK 8ő!gke#Ď?–©ş2;>lçĆ@ E´»¶ĽŚÉgq ń´´Né‘SW‰üÔĽ1áďřRđđ×/mmćWąYâŹÍűżÂˇ±€9<滏üJđďŠ4ŤGQłš[x4ńşán”#"ă;° ă¨úŠí(®Âßt/Zę—V6Úśvšm»\ÜO4*UA$ 1$ŕŚv­?‡ľ<Ň|wiw>Ž—Qý•ÂH—ąä‚FzęĄ}‹š¬eZ–çî­cë:Λ˘[¤ú˝ő˝”.ŰUçp źNh)~k˙zŹ5˙˝^wńq†â[¨5;¶-č·ŇáůKy{€2ÜcqÍzm—‹4_ě‹ «ŤjÁ–ă÷K0•BI 0ĄĐé|×ţők˙ząíĹţÖŻZÓJŐěî®W¬qČ ?O_´5}VĂG¶[ŤRîHÄaĺm ±č>ĽP>k˙zŹ5˙˝\Éń·†żµĆ™ýłgöâŰ<Ż3ťŢž™ö«ş˙ôĆŹ­j6Öj˙sÍ|ú¦€ĐŮó_űÔyŻýęËŃu˝3[µ7:Eő˝ÜŕĽNßҲ—Çžk¤¶]{O39 /ś:ŽŁ4‡Sćż÷¨ó_űŐ‹ řŹGńśčÚŤ˝ç’q'”ŮŰéš««ř×Ăz=ďŮ5=fĘŢäuŤä_ݧă@htžk˙zŹ5˙˝YÓjÚ|:SjrŢ@şz sp\l ëšó˝â®™?Ťu«+ý[M‹F‚46“ďĚc÷†îô‡ŞůŻýę<×ţőyďĹ}zH>ÝęţľÚXFĐÜŔŮČ,A­=7Ćţa°ąÖěż´ž(ĂFŇŤŰĘŽľ{Pš˙ŢŁÍďUk»¨,í¤¸»š8`Śny$`ŞŁÜÖ&ŹăOk7¦ÓLÖlîn{F’ ź§Żá@htžk˙zŹ5˙˝Y÷ZĄŤĄý­•ÍÜ1]ÝdA 6L śô—š­…•íĄĄÝÜ0Ý]’°DěJGPŁżQ@XŃó_űÔyŻýęČ׼A¤č$ÚÍý˝śnp¦WĆď ďQřÄÚ7D‡EÔmď<Ľ6JýEˇ·ćż÷¨ó_űŐ“­ëúV„°¶±¨[Y,ÄĚÎqqꍫĆâjnL‹äó<Ěń·Î}1@X±ćż÷¨ó_űŐĘÇăß Ë7•ż§łě2q0ĆŃÔçđ­=ÄV˝k%ΑÜť®ń¶BźzC_ÍďQćż÷«‘?ü".ţĚ|A§ůąĆ<ŃŚúgĄnjšĆťĄiâűQ˝‚ÚĚŇ8 ĎN}č /5˙˝Gš˙ŢŻ*đ‡ĹM2÷Uń ZŢ­¦ŰÚŰ^ě\¸_6,ś6sĎAÍzZÝ۵Ľ!µ1ů˘\üĄ1ťŮôÇ4…Ż5˙˝Gš˙Ţ®ZóÇžł†Ţ[ŤvĹ#¸]Ń0ËśgŽŮ«w®ivzTzťŐý´:|YnŔF Đď@hjyŻýę<×ţőqž»×ZÝĚ^"¶Ö­eąÝ@Ű…˛Â]ÖtѬ (ŢŔ5"ž`¶.7•őÇĄiůŻýę<×ţőfÝku®§m§\^ÁőŔ&Ć÷¸~€°˙5˙˝Gš˙ަVąăhW+m«jöv·ĺĽp¤v ‹ÍďQćż÷Şžź}k¨ÚGuaqĹ´)$LX{Y÷Ţ'Đě$ĽKÍRŇ´ Ó«ČŚ7LŹzCsÍďQćż÷«@ń&Źâ&›FÔ-îă„!ŤľćzgÓˇŞ ăĎ =ÔÖëŻiţl —pŕĽôâ€Đę„Î\Ő”mʬ»»{űH®¬¦IíĄ]ŃÉʰő´m˙Ő Ń%˘Šňü;ł·ŃńΉâÇš.iRî™mn#1Ę×iíô žŠĺżŐ­ôý×öŻrŰ`–ęŐŁŽSبßĐ‘22{Q\F°4Cń[@777Ë­‹YľÍ ä˛m;‹{ă?Ą;Äź´U“Lq}} ,66ćS?Ţ<ůĐkQÜÜCkĎu,pÂ-$ŚT{“Ŕ¬OřłMńe¤óé_iQĺK&FĆqĎŹLÖGĆŻů%ž"˙Żý™hł†Xç‰%…ÖHśWCĂÔôúň/ |TđŢŤáMÎVľą{{8’wµµigstăŰ5é Ó5ťnÂĺn4áMćF3‚OŁ(VŚŚă#>•çW_|+ ­¬Đ=őă\GćmmËĽk’2ă8^ť3W-Ž˙g)qýżý– oőËĎűŮ"€;š‚KËh’âąH™Ŕv©©®SĹô jK§]Ésu¨•Üm¬á2şŹSŘ~uÂ7Š4ż|gđŤÖ‘3˛Çk~xôčWâżÚ†µ§Ý=ÍÖŁ·{[YBet­ŽâkGÁţ/Ň<]i,ú<îÍ l–P¤‘źFS@AöŰ_¶ýŹí0}Żn˙#ĚöúíëŹzăüIń;ĂÚ¬údŤy{}úج 2żŢ=q^×´˙|}MCIËnÚ>ÓąJ˛°nUä@ŮEAuŤ”÷w„0#HĺT±Ŕ8“ôäřĹmsŻk˨ũ=ąT˛H¬ŮŚhět$ó@ÍEs/ń·áD·ţÖ¸“í0ŰC’WĘ?™ĹTđŻÄ}ÄšŹöułÝZjn[kŘLNăŐ{΀;*(ŻÔ>-Ákń:[[öŃ­í8íťç>`1ť dgĄzÝĹĺµ´°Ĺqq RLvÄ’8S!ôPzźĄO^1ńK^±›Xřq­Čďo`nĄ´čP˘í_Ľ"ş;oŚ>šö8%{űXĄp‘Ý\Z´pą?íÜ@‰ERŐő[K›QÔ®c·˛…w<¬x·Ö¸ť;â˙†//ŕ¶c¨ZĄĂ†ććŐŁ†Bza»gßčtP r yoĹK»> ü>Š ‰ŁŽ[â˛"9ĆW‚Ző"@ęh=+Ç~2A.Ąń ŔúOŰo-­od—ěÓ4dڧĄfüCđŐ÷Ăť|GáżꥭćA%­ĺÁ–9Tśc€=Ұ€~µç|k{ˇx_L49×5—ŽHŮs± ńëČÜÖvźđ.m–xY˝Őd¤–;¦DF=”zP«QXľĐáŃ“OţĐĽÔ»0ší÷ľAź@(ń/‰tß ý€ęŇ´K{p¶Ń°\€íÓqě=čjŠăĽ5ńDń&ĽÚ^Ž·ł¬âëěĺ``˝pÇŻĺU5ߊľŇuI´ő7Ú…Ô-Ťą”D}đ?*ď(¬? ř«Hń]]č—BdFŰ"2•xŰŃ”ň+Äż|= jʦČ×—Ú„ë ±€ĘŃ˙˝Đ¦h¶˘ą˙řĂFńm´˛č× ď Ű42ˇI"?í)¬MO⯆të»űIfş’öÎslöĐŔ^Ga×hGżÝŃ\źĹŻ \é·m{4*=¬Đ0źqčrXý3V|-ń'@ń&®t»V»µÔ —H/ 14€rJúńĎ­v”Q\‡Šľ čľÔ†źv·×ĺžEĄłHÁOCžťŹzëę {Ëk™fŠŢâd„í•#pĆ3čŔt?ZÂđoŤ4Ept™e[łAĆ€7¨¬;Ďé¶ž*˛đôŤ+jwq´Č™UAžXöčkÄ?|;˘ę“iěoo® ˙^¶6ćQűÇ@Ő“áŹiž'Ň“PŃ®öěJś‚¬Ś:«Č5­@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x'íe˙ }ţ»żţ^÷^uńŹáőĎŹ¬´č-/ˇ´6˛3“*Ý‘ŽÔĺ˨Çđăă;ß\“™ŞŘyÎ{nh÷~{×˙®Téň]ü'ńGŠďW7ZžĄ#pË6=‹?ŕ"˝·â·ÂɵÇüFđÔţ,đáŇ`şKd–hÚge'tjrT{äĘ‚–ÇĎ6z"Ăŕť6M"ížŇF»Ô˛c$ĂŞ€1–^Ţ•čôý2ţ×Ŕ¶ÖÖ˘×O»Ô2aůx A^Ä× iŢko^x‚YŁhšÉ,­ U?şPAoϸ˙Źv-©]x:Î9ÚŢIµ«*Ś”;FúÄ_ô«? ęÚ5¬V—Öş„QˇB—BySŽŁŠąűG§™ŕtɵFGn§ŹŔţ!ÖuÝ.çĆZͭ厙 š-ŕŮćČ:3ţUżń7“xĂĂđéÖ÷1ŰŮësřLŢŰř?LÖFˇ$Ź-ĺĺŕJw ‚§ÁţuëPxM×â˙ež)-n¬ĚŰ•9ŕŚ’z`âąËřŁÂĎsmŕÝrŃ4‰¤2ĄµôC =v‘Ú€.ü$đ櫣řQÓ|Eg VŻtŇ[[y˘eHŰťąî¬?é:tźéQEö¨ő"˛MIĺ¬ě«›°;Í'Š<7âÍ^ÖČiŢŇ´›Ű)V[{«{ŐÜ›{c × xŁŔńkţÓ4é.ZŢ˙NXÚÚň1Ěr"źˇÇO§ĄfE˘|CžH!˝ń6źŞ2™$·µÄ˛¨<Śž}±@¬TńŢákü?.0wMź®ĂQüL#ţŹĂÁž~Ń)˙Đkâ7„.üFÚUöŹ~¶:ľ™7›®»”ú‚? Ă_x‚˙ĹúuýrÚććÂL´1BQv ďśäźj‹âf¬Âu¤x›OŇc×lí-ŚX;CeŽńž3óű浾xŹCÖ5­BŢŰC}\Š0. –ŚÉž9Ehx«LńtşÂ^xcZ´·¶ňDoguô, ;Á‚^ŐWÁ~Ôt˙_x‡Äš”wúĹÔbäDz8Đv’üKđV™ă84řőkůl–ŐÝŁ1˛ŤÄźĽ=«{Um|%yoH¬]Źp##5Ęü\đ׎m´Čěďâł6’;±‘IݸOĄuí§»xtéľ`Ţm~ĎżgfÜĐ϶şź'€ľJÖ°™n5mł>Á™ĚŮ {Ś? ď<35–‡ăß­*$eĽ0ÜȸP<Ľ¶úĐ·řwu†Ľ#¦řKč—˘ęGŘq(ŢÍéÖ´‡ÄÚç‹®Ż.í5ët·ňĐŃ€…IĎŻ9ŕţŃs¬řFĺô?‡št:ąŽ[‹„ŤĘ~p»µ×|TŐ~h«¨˘](óS€Ă +…ëč•iŕ?¦‚|9/‰­WCbVŽß˙»»·ó®ĎáLJ%đźětiçK‰-̄Ȁ€wHÍĐ˙˝@#‡řM¤é×'ńňOcm"E«:ĆŻ!ćŕz ôź"ÇáŤIB˘ÚČ€ÓĹq×>×ôß꺯„uËk8ő9<ë‹{«1w÷ ŹÇó®ÖęÎâď@’ĘâT7Rۤ•W \® éžÔ óOľŃźáýťőő„ww›Ů䝡 3Đ`tő&˝=t«ÓbÓţÉ ˛‰U@Q@č0}+/Ŕ: ž𝆑<é<–ĘTČ€€Ů$ô?ZźĹúíŬKáËëK;€ůvą„Č ă ő #ŕěQÁâE,q&¨ÁUFčXřÝakRĺlµť.E{K€9rOú˘;é˙ת^đOŤt;ýJęĎÄFýFăí­ĺ»ăž+{[đm×|c§j:ÝěRčúzď‚Á€Óqóżc˙Ö÷4ćľ"x†ăTńf±r·>!–SĂ·oŘĐt@§¦Ď9ŻRżÔltĺFÔ/-­UÎĎ* cí“Ír’ř2k?'ô¨­ávj6¬¤¬ţŚ1ŃżĂÜŐO‹ţąńÝŽť­ě6†ÖGrdB۲íô g{©,+,.˛FËąYCc^AđSI±×ˇń6µ¬ŰCy¨O©Ë´čj*©ÓďČW©xsOm'AÓôůd{h"ę0Ś×ţń…­ęw~ Ö­m,ő'óeµşxŤ˙ĽżçóĹVř3ӞܟΝ˘x^m;Çzćľ÷1ĽZŚQƱ;“orh⍕§‡>xŠďC´†ÎâćŽWŕŹ@Çó¬OřCBŕsů6p,éér·Fó&ĐĹ·{’:ôßŘYęšý–¦@˛šYXśm\rsíÖĽ3Ĺz]Ţ™đŢęÖoYßxv(±i ! łr=Ŕś¨88‡µg¬ü(˙’qáďúôZí­˙Ő ä>ZKcŕ-Ţá&KH÷+ $gßšŤtMwY]řZ},[]y·!IrqňśuďÁŕć€{…sż˙äžxŁţÁw_ú%«˘+3Äúkk>Ő´ČäXžöŇkev ] äý3A'7đOţIo‡żëß˙f5Ččú}˝çí/â)n"IÖÂ)cÜ3µŠDą5čŢФđĎ„tÍy’y-#ŘŇ 7$đÖł4ŻOeńCYńS]DĐ_Ú%şŔîBˇIéüó sâÄIŹţ\˘…śę^Qp9*qÇŇ–˙ţN/L˙°LźĚ×Oă? Mâ {Ă7đÜÇ i7‚ĺŃ”“ ăéŇ›qá9Ąř›iâu‚&µ0m;‰=óŇ€9=CĂŢ+đg‹uŤÂPZjú~¨âk« NÉU†~ă~'óéĆkŻř{ăŮ]Ékk-•í¬ľ]ݬˇŤýýz}«/PŃţ ÇŞ]>“âM9¬%´qÝÚnhAěĆqďWţř1Ľ*š•Ííűj¶§7źwpWj–ç…‡&€+üo˙’Uâ/úŕżú1j÷ÂÍ*ÓJđ‹ś){d•Čł0É'×­\ńö'‰ü©čĐLIwE‘Á!pŔňŇŻřzÁ´­ O°‘ÄŹmB]Ff€<żŕŚ1ÝxłÇšŤâ‡Ő˘bfnYćŔŹĐSüg v?<q`;«Č¦Žä(ÇO-ëŹéZú߀µKOÝx‹Á:´ZmĺęâîŢâ/2Ź÷±Ř÷úçÖ§đ—om|Q/‰ĽUŞ.©­ü|¸öEw =}ýĎ­a|7†;Ď‹ţ>ĽľQ%ő´Ă q“d»őŔŁâĺĽVźü¨ŮŞÇ©KxĐ3(ĂIË}@ÉüëoĹż˙ÂMá U4˝^Hü«„–=đÜ/űC×ůT~đĄ/‹!ń/Śőhő=BŮ6ZC^\0{ëĎZĆą°‚óö“Ťî#I>Ϥ,g ¸€SPü^Ó-/~(|>[QÄ·,˛d}őRę+¶_ Ě>'żŠ~ÓÖĎČÚwd19ĎLS|[áőĎxcXŠę8ŁŇ%i6RL™Çöé@÷í_đ‡iól_2 JÜĆŘĺ~lq^ť&ÉęT*ĺţ$ř^ohiö÷1Űş]Eq˝ÔBăŠęb]‘˘žv€(ËĽG˙'á/úđą˙ĐZˇŐ<=âżxżWń„a´Őlu6Y.ě&;%qżůôé]^§á9Ż>$hŢ&[Ö y`hJťÎ\zw¬íOGńüzµÔš?ôăa3–Ž+»]Í=Ďă@_|ecâë[Óoi-Ťý¤ž]ĺ¤Ë‡ŤÎzžý>Ő[ăWü’Ď׿ţ̵'ĂĎ?…ŰT˝żżmCXŐ%]ÜmÚ¤Śŕ*ö1­Očrx—Â:žŹ É—qyk#‚Bň }(3áFźgođŰD†˘1MjŻ 0ěĂ-źZ྆ţ%X[gě×7@Î@Ěm?!Zö^ń¦Ł¦ŹáĎ[&›łhűM¶é!Čů¶7¦rFzWMá_Ááż^hV·[‹´”Ďu ćI]pXţź•sżł†•iiđĘĆö(P\ŢÉ3Ë&>c¶F@3é…–ňrWßöú1+®řmáą|#ŕ˝?D¸¸K‰m|ĚĘŠ@mŇ3ô?ďb«Aá9ăřĄqâŁu‚M;ěB §p;•·g¦>Zäţ Ă׉|s©Ü¨mHęFÍË,c8ĐźËÚŁń%•­żíá«{‹ ŰF7X>ýż ÔŐ|­iţ,˝×Ľ¬Ă§I¨öË[|ȤaŃ€őëůźZ‹Fřs«Ĺă­?ĹZÖĽş…ühé:ů[)EŚ€|Çžą  MGS|lŐoo,®5(µ‹ThEšů’Ŕr˝pHëZ˙tíKSř™®xľăN¸Ňôë›U´† ¶IH*w•í÷Zç­¬µż|CÖµď jcAs1Ą+ćĽÁI䡴aÖĽaáZ‰Żk–úíž®Ĺ0-Ö9!ÇľP8É€9ż†·~+>"ńvˇ čşnŁu& É<×w\‰Śá@ô˙=«°đG‡|UÄëďëZmŽ›kwiĺK¬áĂČ1†#×W5‡ú˝‡Šou˙k1éłßswkq™ Ťýěv=˙ë]ôĎZŢÜ\ř§\·ľG@±ŰŰ[Ň3ž[=I Göw†9´-gS™AÔ®µ~ĐíËpxŞş}ťµźí-yöTTó´Ď6EQĽă?žükROř‡B×ő+ďkvÖVšŚžtöwPy˛¬¸éRřGáÖŁŁřńĽO©kCQąžŐŁąÝŇd'řqŔP€=¨ŇëË>˙ČŮń ţÂíýkÔȩ̈đ?‰4źꚯ„5«KkmRA-Í˝ÜfąR?ÍđÜ1_ţĐľ%—PQ%Ĺť’ E~v)* Ď˙4˙ŹÇoŕÝNŘ*j‰ŞĹ r(ů™Xňąô­ßxďPńź‰<;©Ť3Ä0Gĺ<Ťř§_G_óŰŇŞéľÖ5/Řëž8Ö!Ô$Óů´´¶‡ËŠ6ţń©˙ëP¤×”Ű˙ÉČÜ˙Ř˙gJőjóĎř#VĽń}§‰ü+ŞĂaŞE ·•n"߉éŹóĐP7Ćűu/|?´ą@đË uaFŕţU±ńęÖřM­f$ýĘÄŃń÷ŹN «:Ç„5]nďÂş–ˇjך<Í5ÉHY‰îŽÝ;ÖĎÄ?ËâŻęZ,ĄĽ·jŞ$pH\:· }(Čľ.Ow7€>[F‹:]5»Iݵ$qm }ă[2Ó~ řŁĂ3h·>ĐŕŔńŢs ŽŐÚëŢ´×üaáÝFR%ł†Šę!± PăőăĐÖř•˛YiâÝÁrlĂM·ńă>ôÝřVÚňĎĂ:M¶¦Aľ†Ö(ç!· á@n{óšóż‹_ňQľ˙Ř@˙5ŻT·GŽŢ4–C$Š 3‘ŤÇšäĽeáő˙řcTŠę8cŇ.|÷Ť”“ ăéŇ€8Ť–÷×ü“x¶WÎÓ®ÎSť§­ckZV¬ź4=âfµ>©˘Ý~ňŐ˘U†śEüä{רxŻÂë~5đĆ·ÔqE¤<Śń2’dÝŽ‡·J±ń'ÂřĎĂo§´‚ ¤q-µĆ9ŠAĐńÍq_ĄŹNń·ĂýJó §Á}µŘýÔ$Ś1úuü+×Ç##ĄrZ§„‰|‡âŮRęčFÝ@6ź1x.z_©®[Nđ—Ä]Ől4żYOcŰ^Zď‘°ĎÇ4ęŐä´U˘_éžł›>]Ć«-ŹFŕ˙:ô Újv:,kş€Ôu,dąĂe‰(…büCđśŢ*(‚ę;°_ÇvŰÔťáH8ď@·vń龸‡L!X-ŘCcp§Wű:[[ŻĂ/#Uk«ąĺ{‰Hůť·‘ÉúW¨0 ¤0Č<kË đü5|| Ż[Zi·˛™šÎň1bsÔˇí@<5zoí â;m1B[ĎcóÄś(…==O_ř/ěŮOáŤSSşők›ů>Ó#ž?‰5Őü=đ8đÄú†Ą¨_>Ą®ę-şćí×đ‡řJǸđą˘xQÔü ¬ŰXC¨ż›qeu™ňyeÇN¦€2Ě)§~Ňp.š˘5˝ÓŻ8€H$zĺVŁřIcżľ#ŢÉ´đ^ăb2T3HN?ď‘]_< .‡¬jöą¨SÄĂcÜlÚ‘¦~ęĂů źÁ>źĂľ'ńf©5ÔSG­\¬ń˘)0 ś_żúP Ú]¤ź´ŻšđFYt‘p2żňÓvÝß\T˙#Hľ+ü:¸ŤBĚ÷2FÎ%~^?ńăů×X<'0ř Ţ*űL~AÓĹź‘´îÎěîĎLSŮZËńWâ%䨏w ĚqĆÄrŠĹËcęU*č< đúďĂž/ż×Żu†Ô®/­‚Nň&Öi7d‘Žŕf/ĂmoNń>±â/ř‚;MJúvo-áß D@ů\z‚3‘@xţ8ěľ5řęÍB]Ý á¸)ÁxŔĎćhř{wźy +Úü áŘĽ)áM;F…›x˙y ó$',߉'đĹqcá˙|9«_\x]·ł°˝Ë%ŤÜ>dhçşúPü$đĎ´Ox—P×,­lmµ6I’ŢÚ`č® g·˝FąŹ i~$µ˛Ô?á"×#ľĽ¸„ĂŤ-ř#ß’>”߇Z.·ˇh“ZřŹW}Zí®D™Éb¨q…Éç¨'Ű4ÔŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEŮzâ«_Óő«TP4ěTň_űż­gęš –«5śÚ…˘O%śžt Çý[úŚۢ€ąSÉîţ´y/ýßÖ­Ń@\©äż÷Z<—ţďëVč .Tň_űż­K˙wő«tP*y/ýßÖŹ%˙»úŐş( •<—ţďëG’˙ÝýjÝĘžK˙wőŁÉîţµnŠĺO%˙»úŃäż÷Z·Er§’˙Ýýhň_űż­[˘€ąSÉîţ´y/ýßÖ­Ń@\©äż÷Z<—ţďëVč .Tň_űż­K˙wő«tP*y/ýßÖŹ%˙»úŐş( •<—ţďëG’˙ÝýjÝĘžK˙wőŁÉîţµnŠĺO%˙»úŃäż÷Z·Er§’˙Ýýhň_űż­[˘€ąSÉîţ´y/ýßÖ­Ń@\©äż÷Z<—ţďëVč .Qš×Î…â–0ńş•e=<\ĄźĂ Yß-Ýľhł«nRrŔ\Šîh .Uą<Ś~5ej€)h ¸QE(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Šŕőo†:UŢłuŞi×Úž‘wvŰî …ÁŤdcÔ‘ëVĽ/đďEđţŞuU7Wú©EÝěĆYŽ éĹvTPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE‡ă/éŢŃ%ÔőiaSµUFYŘôP(rŠůń~”ŃŃFFq‘źJ(˘‚@$ďEP##‘EP=hČÎ3ÍQEQA “@Wśx3WńÝߎµ;_éŰč(Č•P‡ĺÁĎ9súPŁŃ\®ˇăť*ËÇ6>5ő+¤ŢĄFU8c†>¸SúWU@Q@PHHQA žQHÄ(Ë©Ą Šóť/WńÜżîěotČcđ˛—Îr |­»9$÷ŻF Š8 âąßř»NđfŚ5[Ě14‚%HĆY‰ôŃQUô۸ő :ÖňÂ+’d × üęv`żxŰšZ(Ż9ř}«řîűĹ:¬+Ó!µŇŁÝöwTťÜrw zĐŁQE‚8 ĐEČ Źj(˘ĽŁăďŤuźéşLú ńD÷2şH^ ůdu W˘łü;u-÷‡ôË»‚ ÓÚĹ+0 2xúšä>*üK˛đ6ń5«ŢęW#tVęŰFĐqą›đ ţŠđť'ăWU˛¶Ő|<ŢJ±Äë˝ ÜxĆĺÁý*˙Ĺżëţńţ…ĄiSĹťÚÄeG‰XťŇm<žśPłŃE"°oşAúPŃE `I‚GQé@ ExŻţ ëö?,|5oqŇešxĚ*X†?7ZöŞ(˘Š(¤V 2¤í^/đ‹âżâok:^­<2YŰ,†5HUHĂŕr=¨Úh FA{Q@) 2¤ę( Š23ŚóéEPHN( Š  f™;‚F^ޤŹĘ€ExĎŔkŢ3ĽÖc×§†U¶Ž6ŹË‰S‹g§^‚˝zPҢ3 =Í-ÇúłUhEź=}Ź=}ąYĽ_¤E6ąÍ :4bKĆŘp€‚@ąŔéZú]ô:žťm{mżČ¸ŚH›×iÁ¨‘§çŻŁQ篣Uj( |őôj<őôj­EbĎžľŤGžľŤU¨ ,Yó×Ѩó×ŃŞµ‹>zú5zú5V¬Żíý;ţ?ě/8˙iů?hň¶źąśg4‘˝çŻŁQ篣V'őTĐôýRhÚXí!i™ňŔ‚Ź ęŃëş Ž© mwq Uň ö4‘·çŻŁQ篣Uj( |őôj<őôj­EbĎžľŤGžľŤU¨ ,\Iúu§U8¸‘~µr5`˘Š(QEQEy˙Śţ"˙ek©á˙iskZű ÍoÚ‘/«¶8 @˘ĽăMń?ŹWQ´‹Wđu¸µž@Ź-µŢL ÷`}*üT‡Âl4BÍłçŠ9$˝óbÜĚ9\tGzôÚ*9e ló&B<3\ßĂŻż‹|.š´öÉhL˛ĆQ_pŚäé@Eĺ—u=kUą˛đ‡ŰWŽŮ¶M{<žT!˝­t׼U}«Ieâ_ &ťÄ]ná¸ó#c6ă®hł˘Ľ–Çâ/‹5ŤGV‡@đĄµĺľźtö­#^l$čWŇ»Oęž#Ôščx—C‡JĘ1ÜyľfsžĂă󠚊Çń^żká˝KűŔΠ„DN®Ç ®q|Gă…nG…˘00 #űOď1ůV°Ł)®e·­Ś§Z1|ŻKťÝČřŰ]żŇ´].ęŐEĽ÷QG"8 ´7Qő®ąNT™AĆ*O©Qš“q]Š(¨,(˘ąO‡:ŐÝϨ:Ľ‘ÝĂOD[h D]Łďq÷˝Éëźză>;ř˘ëÂ2é-ä^]ζ±HŁ<†faď…?‰Ż3đ÷ĆŹčz4VĄá‰®ď-PB˛±xÉ 07.Ó“řŠěĽkĄk?ţ[Ď5€¶Ö’_µÇj®vî]Łw<«Çćq|,Ő'ř{˙ «ksťQˇűpBNí˝sż9ÝŽkŻđżŚoüQđĹ#SťćżÓíŢ#9?3©\©'ąę3\”_üImđüř)Ľ9söńًŤ­¸'LlŰ×g5ŮxgÁš‡†>x™55B•­ŔË  ;÷Ç˝p_|«|Bđťä—zĺÄ6c2ÚŰś˛™ÜN3î9ëQü-ŇĽAăĆąđ¬ÚýÝ®‹d ň ;ąČPŁľ3Î3ާŻSý›­§·řuŞ%Ä2DćâBĐ©? ő®{ödłą¶ńO‰šâŢh•Ł\¨?9éšÍř6ŁáŹ‹zŹ…dĽ’[5i˘tÉŘ̇‡±#ůÖwڱń÷TŇ4]F{)u VŐ¤G#lf5-ú ń[ŢłşOÚ[Vťí¦X ÷HP…(x/TřvúFą˝uqrçĚ›%]d<ň:ő®źăýťÔ˙<7$ÓIÁo–D$ßżq[żµ=­Ĺχô1młąbDh['µeţĐš¬úŹĂŹę[Ú9/Qn!Ç/·ő®ÇĹ8ýž]ðě¸ÎěóŃ{×1ńKĂZž±đKÁňiö˛Í6źgnóB«ó…0('x#‘\Ť×ŤĽKâO‡Ká Ü‚[‹ˇ¸ć4çî0xÍtßf•żg»Hĺēዎ˝r_ | ŞüFđőÄwşíͶ™`ĺmáűędnIĆÎk°řwisěéâ($·™fi'Äl„1á;Vçěżm=·‚ő¸†HXŢŠTź”zĐ=ű2ęú”:ţ»á»Ű™&¶µŚČĚXFĘánzžžŐGŕäłMń·Ä1äĄČ1;~qÎ*×Ŕ ;>,xŞIíćŽ6Š}¬č@?ż^„Ô¬îˇř߯K-´ŃÄVăČ@?8ď@^Łŕé/~9Ká›˝^îi%›~˙4¤|Ěőü>•Ő|břw/„<ĄŢi÷÷WFĘvIćc´ís•$ن?ŕB˘řşŻľ:ÂRş\×–lÉ4;AŰ ňDl»€8 çôŻbĐď˙ág|;Ô٦I§Gz$·ČĹÇÝ|;ŕôí@gń?Çßmř# '"űVŰ›[ć/ő‡ţúÚ?뼫h? ü˘ŮřŁRű%ţ ŤxâD‘Ë3cŹ”`m…x€Ľ={®|AÓ<7xY ±ą1?…[/Ź®?•}eâŹč({gÖěäŰ)H˛Äm}y÷ĆOé^$řA©Ţřz˙í0Çs m"+¦xăć×hŢŐü[đÖoßës·Ř"uł¶|° QśńžkÔ>0xOOđ˙Â-NÇö r\C!Ž<ą'xćźđęÚh˙gű^cmr62ÝűPü5đç>)h×Z—®âŇ´ ŰćÜí’őóŚń]'ěĂ«jkšÎuq$–°¦ôŤ‘†ÁŰéšŮý•­n-|?®‹%„µŇ$Bąů=ëö{˛şâWž{y˘FI6łĆ@?Ľ÷  >*hľĽń•ôţ#ńäńdŤ–Q+Ü9^2wÇťű:ë÷Vž?ąđý¶Ł5î‹,rçnWę§î’:˙ő«™đ©›Ŕţ2Ô×Ĺ›[şmŃĆ$LüűłĽdŰ˝k¤ř?§j–˙ÍƧ¤ľšŇÇ4¦ŹjF2 cÁPß M)ý¦őHĚ®P\Oň–8ééXŢ4Í÷ÇíOIĐőě§ż‘-ZDr6ĆbB˙ 'ŠÝđ­ťŇţÓ¤ím0€Ď9;O˝(w_đŐăěÓyy>fĂ·ţ=ëŇ€9_xPřIăÍM/VžarC'*XoĂ# ň?Ćş?Ú‹MśMĄjňjAsű´łcű¸p –Qę{ŐĎÚjÎćçĹžk{yĄUŤ˛Q űÁ×µűIčz†©ŕÝćÂÚK…ł“3,k’ŞSÇÖ€6~ |:ŹĂ[ëkŞÜ\›ŰɆEÂǸăžÝ+Ě|qˇx.mUźYř<÷M#bD{ź+ŃKŚŽ:c5Ú|>ń¶«ă ^x^-{ 4g‚;Ňç Źbŕy穯-řyzŢ—SÓő?I«k‘tYňŰ‘‚ ‘Śó‘@÷ě»â-BęóWĐîŻ%ş˛·Moć1>_Í´…Ď Ўű<Ď,źüF˛JěˇeŔf$¬©fÝ/QÓ|{âő;)m%[b¬¬PŢbäÓň¤ýź,î­ţ&řŠIí¦‰eĂ:ď=MrÚFź¬řźâ׉<=§j×6·——&íŃĎú¤‘Ž?2=ęŢ•c¨ü/řĎaŁŮę3Mi<‘*%Ťű2ôČ9®‡á ťĚ_|M4¶Ó$Lo6»! s:ă™ńRÎę_ŹÚ,Ń[LđŹłeŐ QÉď@ţĐ>-¸ĽńĚ>mJM7F€GöÉqÉp– ˤ`z×ÚÎźŕOi÷ľń-ĆŁlÄ}¦)"xĂ ň¬űWwńăÂ:•ŹŽíü_§éźÚv.#kJoĂü%@çŘűT:oŚtm_Q°˛Ó>BłÍ*$Ź${–0X Ŕ÷ďŹzţ©ŻxÇIđ–—rđZΑ3˘¶Ń#ÉÓv:€âą/‹˙ŻĽ ¤i‘˙kË}¦Ď!ýÓ‚R…ę{ŚţUŮ|}đö­¤řŰKńnŤfóŰƱ†ňÓw–ńž±çŘ×3ń[Ĺž!řˇŘN<5uc¦ZK†qşMň°íňŽ0c×­}5ŕďůt?úń˙E­yOí ŕM_]źO×ü?\ÜYG˛KtĺČ ¸2ŽřÉâ˝_Â*Éá=\ae Ś|µŻ<řĄń Ä^ ń, e˘˙hiB¶Ć|ś€ăđë@ß>6¦ˇo˘řľĐYß3–ŕ )~€2žTćą˙ÚţJ×…żÝ‡˙GçőwÖ~-xóNşÓĽ8Úg•±fĐ6K»2@éŢş_Ź67RüRđłCo4¨‰gD$ KÜŠďľ:X隆•aŻâŁ Ŕ˛"cö„ÇO,±ŕă&ľ{˝ľÓĽâ}:÷Ŕ^$şľŹ3ŢÁĺH nR+Ľý˘ôŤF/éÚĶßi>\cb‚Tíl˛:fąOň]řť4ÝSIđsčÚ< öt1Â7K!ä“€ á}?hŇ?hżę–躏<–ϨEçLŃ6Ö`NA€NsRř_ŕDú6«¤ęGÄ3 ŕ•%ąHMŔrUXŕôúU_ÚÂZĄý¦ŻéňÎÖp¦X×,€a•±čJłáŻŚľ ×5MKŹÂΓÍqWW;(BŔ;Ú6ń“É8 Cân§o˘ţĐÖú•é+mi%ĽŇ8 Żxn WăgŤçÔu+‰-|=§°Qo›p!Î9oţµCń'@:ßímkwiq&źq-Ľr˛©ÚW?5;RŇő_ŁľŃí®nü={ÉHÔ¶cĎ̇ýĄępG˝}/mV¶Ń[Ű˘Ç HF¨~óĹÍ_Xń—Ĺ8<§ŢÉkb$XYVb»™˝ĐWŃş}Ü7ö6÷vĚZ ĐH„‚ dpzWÎômsÂ_ˇńŽ•c%Ő«Čł†E,ˇ€ÚČŘé‘üč˝řuđ…Ľâ„ÔâÖçą¶2´)ąĎś9ëßâ> đĺ˙Šţ!k:Eގ%…ĽĎ1ş’>­sňűäăŠö5x¦řG$Óôő‰Ţiť™đ@ůFv€2kŠřgsĹ?É=´ŃĆË.Đ€yęh#Âqj ľ6ŮřvŰQ–âÂćhá‘ "H8%z¸ô÷ŻBří¦hzŤîśuヘl‘°’ÉY¤2óň¸Ť{ő#ŇąOYÝ?í'ŁN–Ó4"âÔ™ŁץbüW°ĽŃ~26ł«čóęşT’$©ŇRT ąÁč{Äđέoá?‰ÚT~ ×nu &ćhc”ş4AöÖVSŚă¨5ŮţÓw÷šŚü;q§ÜIÄPů‘˛žŚqő®_[]C[ř…áťn >‹ĄKsVŃET”í€9ůşă ďŠę?iŰ+›źč om4Ę ”ڰ?µs˙ľęľ Ń´ďI®ÜÜę“\*Nů!ă‘”°!ł“Ť¤Wuń7XşŐ˙gť/S¸‘ľŐ?ŮÚGS‚[8&¶˙iËy®~ŰĄĽRJ˙Ú±©cŤ’zW1âűK—ýštXŢfś3BX|Ç·Zĺ4ßjţ/řc'е-ryÎÖO±ÚżĚľT®:ńť„~¦»Oţ3ľ‹áo®µ¤şţĆVxLŚXí ¸.OlŠč~[Íěč`x¤YżłŻ‡–T†ÉiqĹq˙łö6§ŕ/éWqKoößÜ"ĆčČĎ4çMƑ㠍KRń˙‹nlď™±n‚%÷Ď…QŔW§ţÎ,Ô/ÓYĐoď$Ľ¶µ„Ëm$ŚXŞçA<㡵pŢ•ţŢ_é~0đHŐCIş9 2‘ÇĘŘ ©â˝ŹáĄm®&ł{iátQq:ˇÝ(9Č'8Ŕč(‚ý”˝ç‰‘X©h"ŽÜż5čźľj~ Ő5{­GXűr^w$w¶‹·âk‚ý–m®¬®üJóÚÍň"* î ż5Ţü#ř­xËTŐ­µ}XEj$Ь0IĆĆÝÔ÷ăĐĐĄÜ«?ZçĽSi¨Ţi-‘Şe܆ öŹ)dÂŽŁ 1] ÇúłőŻ0řߥĹqŕë˝C}ř»µŹeĽv˛˛†g!Fŕ˝@Î [6Özőß„Zřk®ăÄú¨´x  ŔÉBq>QŔÇZôŻOâo|<‡Č×öř^Ĺ2ýž4ÄXGŚczóÖąŤ?ᵼž2đćŠňjKmťöŰÖ¸ )3ŃNâ:WQńÂŔh˙ të;4ĆŢňĘĺÝŽN2O'šÄ×5đV—kâ[ÝűN"}¶ŔŔ‰«vBF:gů×gń?[şÓ~ęZľŤp`ąX˘’B‚@gAĐ‚:ó˙ř¸řçĂ6ŢĐôÍ@k’F—Ď"Űí9mÍÓGjěľ.X´?5KuyLVđġW$í‘O€24-+Ç~ Ҭµ™ĽQýź$±¤‘٤ É·ďśrO_Ć­řÓZ×oüm§xCĂ×˧ĘößjĽ˝‡e\‘…ŚńúŠî<,Ą<3¤«¤ZD#ůy׍Ţ üS°ń\–—EĹźŘî^Ë´, Ă;`ŹČĐ2Ć…Şëţř‰eáŹj‡V˛Ô y-.dŤRDd•luŇą-c_ń‹iľ,ÖíĚxö©SĆžű dřJWÔŮ.’»ĂúdŤ˝}čkÇ~-˝ŽÇÁúË[Űę÷¶ţ`Ú¤ĽRm;NAǵ]ř·®ęZż‡›Ją6ćëTŽŢb[teX•äAҲ>2ŮÜ/…ü;Şiş{´«Č.žÖ$ć8ĆŔÍüEńbřÂăĂ ˘iúXÁ¨Ç$×۲ä Ż‰=:P]ńÄşŽŤ{áí6ĂPM& NgIőPD*»}xÝÔúVż4­bŇ˙íř´ëşSĆF×D$?!—·ZoÄŤsBÓ–ÎËĹMĹő…ĐfóRßÎH™q÷±ČÎx#Ҹ/‡V¶2|Qű_ěďí|:-]™‘’'áÚźOÖ€=Ö?ő‹ő«7¬I+ýČÔ±úš­úĹúŐ™ăYˇ’'ĺJꎠ$x‡‚ô źŠ±ßř‹Ĺ¦˘–MrđŮYZÎcHŃO\zűőâ¶|u©xcâE˙‚ݵ ŤCN6żl±–á‹Iäe =úŐ‘ŕmyţťKĂ~*±ľ‹tóŘŢŰŔҤ¨Ç§ËĐńźÄćµţĂ⟉:ŹŤnln,tŵűŠ\.×dävéúűPIĎxOAÔcqźZĄđŁ]Ľ´TđG_ţ&úDl v˙–öřůY}püô¬O^Kaű9ë7ä‰Wí`qŚČGő®‹ăW…ď'‚ŰĹžuí'ć!3ĂüKď€OĆGĄAđoHţŘř5&›¨Äđ‹ÇąGVR îsÎ tż´ë}7ក–¨«çŰ-Ě„ugq¸“ďÎ? í+ĂĽă Gá˝§ü#5Ňu¶´f[;űXĽÔxó;sĆ9ě@Ĺzü{§xłP¸¶Ňěµ4ŽŢn.mü¸Űś`dç?…yWĂĎ7†u_ŰŤXÔüÝZY<Ës"Żl:+Ř<âsâ{k™N‘©éžK…Ű} ŚľFrąę+‘ř!ĐÜxĎΊH÷ë22ďR7 EzŤsž?đëx›ĂĎe ˘+…q,LÝ7ÇŰšŔµńÍö‹$Vž4Ó&łbB ؆čśúäźjęĽOŻ'‡í"ąšŇęć&}ŤötÜÉîGĄq~)ńŤ§´+ť+GŇő Ë»µňŐ^ßjĆOń}+¶„e8¨Ę7Ź~ÇiFrŚ­.ÝË˙äI´-"Xť^7Ô!ee9ó[ľ/łµĽÓb†±6—jŚ ĽswŚ}ŇMr~/Ó.¬| á»UĄ¸·ş·Y6 Ř#­'ÄKočú†łi=އ ${Ő$ÉäŻ~ß•T šŠ‹Ű™ÎÎM­ěd­ć›ˇx·B×'Ľ‚ęŕAunÓ™‚@ÝéžJßńmĹţ˝ăk YŢKef}˘ęHN×qéźNźťakבk>!đĚş&Ź,eµüjn>ĎĺbĂ€:ŕÖ¶ĽZ—žńŐ·‰ˇłšďO–łÝF]=ńřČÖÍ{ŃoâłßżC$ýŮ/łu·n§CáĎYčĆćÎóPpP«G4ĺź\zםxSŤčSézR¬ÚÝőü‰Âdą«ŃôXk·˙e°·ľČBí$°”EöÉď\„üąámQž&¶ŐEă´ĘTĺ Γ˛—Ö<żRę+¸ű?Đôo hŹ˘éĺn®Ą»ľďži¶[Đg ą\6âë¨ü%©Üj¶7Şi·ź®m ŕ©ďśV÷‚őďřIĽ3e«ýŽ[/´©>Dży0Äz Ž2:We%7ĎąŮIĹÁrěmŃE™ QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE…¶â ·®)h˘€hÝ»w­-PEPEPEPH.pĎ\ Z(˘Š(˘Š(C 0z^ńboĹ ”^…Í· UIN#wNőč4P”üřouá!{«ëî’ëwŁiĂnň“9#=ËôőęÔQ@Q@Q@T ‘Đâ–Š(˘Š(˘Š(UF@ÂŤ«»vď\sKEQEQEŠŠąÚ gĐRŃ@=(€ÔQ@0@#ĐŃE"ި€ ´Q@ ± Š(¤TU$ŞźAKEQEÁäQE"¨Q…aKER2†`÷Ą˘€ (˘€ (˘€ (˘€•X|ĘÔRŽ:QEBç ňqKE2e-­T«Ô…TőP ťŠUÉ|IđÍ׊´k[;)ˇ†H®â¸&\ŕ…9#€y®ëb˙u*6/÷Wň w3ŃŔÝ€ ÇZ}]ŘżÝ_ĘŤ‹ýŐü¨b•!Ś‘W¶/÷WňŁb˙u*˘Ş ; Z»±şż•ű«ůPĹ*k*¸Ă¨ačFjţĹţęţTl_îŻĺ@s@` Z»±şż•ű«ůPĹ**îĹţęţTl_îŻĺ@s©»ví«»×Őý‹ýŐü¨ŘżÝ_Ę€ć(ĐŞa@ĐUí‹ýŐü¨ŘżÝ_Ę€ć(˛†`ô4ŠŞ Ź@1Wö/÷WňŁb˙u*« “ ÇAVčP&î#(a†ŹzZ( AEPEP**ýŐč)h˘€ (˘€”0ĂGˇĄPa@ĐQEQEЎ~čč)h ‚#"Š(Š(  î€>”´Q@=((ě(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (¨§ą‚Üq4qÓ{Ďç@ŃH¬C)HČ#ˇ7Vó»,Ĺ#/PŽ •MEPEPEPEPEPESUÔ¬´Ť>kíNć+[H†^Y[jŻ8­[˘±âń>‹/‡ä×"Ô`“IŤK=ĘĘ psŽ 4hÚĆŹ.«¦ęͧDXI?*ŞTdç8č lQY~ń“â+i.4MB ŘcmŽŃ6vźB;VĄQEQHĚK1Â’hh¬xżAńŐŶ‰©Ew=¸Ě¨Qśw˝M¤xŁCÖoîl´˝RÖęîŘâX˘|•çŹ>”±EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^űY˙Č?@˙®˛!^˙^ űXÂçGЦÖwR} _ţµ{…żäLŇ?ěţ‹ŕßłA ăßłí­{„üI¤·Ă}3Pkűd·‹OŚJZAň2Ć)÷ŠńĎŮ}M׊ĽQy°ý™ ‰č7ą ŔéőźŹPǬ\Ůx{Ă—z´Vä‡Kł88$(FăÜăé]·ľ!Ůkţ˝×ďlî4›["Ë?Ú 2v‘ÉęAÉŻńĂ˙řúóĹŐVăNůĄf‰Ô˛ÇśĂî¸ÓĄX׼owă:IJÚĹowiu ]}ťv¤ŠXŘíÎ3@×´ifźNđĄíΕa®šm„R>›ż*ôKéşź€nüSĄŁĎom3ŔÄ#«ŻT=pyťx_Ă-ÇzßžŰĂZŢ›Ź#ň =ŰcprG¨'Ű?Ťv_üAˇj˙.uą­dÔôk„ŤÄ+'’ç2÷°pUşý+Ç =´_u·ľ·76«-Á’ŰK®ĹČĎo­gřGţMwYúO˙ˇŠ±đ‹ţMóÄ?ďÜ˙čµ  ź:¶‡ĽA} hÓŘÇjĆYR[Ż9Ą*…‡Í´cŽ•B?ÚĘ}7u§‡o'ÔË‘öT›*cć.ô˛żgżů&^4˙q˙ôKRţÉÖp2ë÷o´ŕÇb2Bňp(Đ>üW°ńÝÜö e.ť©Äžg’ň Ô­ČĎ ŹĎšĚń7Ćx,üCq˘řoB»×o-ÉYLo±A_Ľ‰Ç®p? ăKÚKSŠ ’čm^Ý&©i2ęž řÍ®Ĺá[8üC)óÂŤ´¨cśę§@ŕߍ“řŁÄ6şU·….–I$T™ŇçxK]†ÁŔü+Ř/?ăŇ÷ůWŚüđ.»Ąř—Vń7‰ [;‹ĐűmËľć$=+ŮŻ?ăŇ÷ůPÎź˛˙üŽ>'˙®_űR·> _řnçÇşěz&>źvŞűć’ěʤoÁ »F9ć°˙e˙ů|O˙\żöĄEű9˙ÉNń'ű’čĘę5ŹŹP¦­siáĎÝjđŰ’u›`ldŤÇąü«l|ZŠo‡W~$]Q‚Hć6«ż{·9Ď÷r@éŇĽŰ^đ‰< yyâo‡úŞĎĄaĄ&RV<çkşę?Ąwń´ž7řEâ9®ía·˝µ†X¦®ÉL‡¶yČö  áOĹ˝cO76úŽź¨kŤur›fóŽ Ś}Ó랢˝;â'Ć ? ëŁDÓô©ő}PcĚŤ$بHČĂqÎ1ř×/ű(IĐuĺg@ËqOA´óSüSře¨ęŢ+›Äľ Ô˘]Z2¦kq(Y€ ‘Đăę>|R>,»ż´şđőö›sg¸“soMŁŚd… žĂŤKđ»â|^<Ôő;4ŇĄ˛k1˝]Ąó®qĎŰšĺţüEŐµŻŢxoĹ0DÚ”11űP@®Ű IŽ ç¨ô5ë:$ş$’] M=äű˙˛˛ý­żÖ€5h˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+#Ĺ^Ó|SŁM¦ků¶Ň`đpČĂŁ)ěEkŃ@ 'ěç§˙wŻŢ-ą9ŘbRqéś×Şř3ÁšO„4'Ó4ŮR\™es—‘ĆI®’ŠđËŻŮúÝçźěţ$ľŠÖf,Ńy`÷čyÁŻDđźĂÝĂžąĐ˘„ÝZÝ‚.š~LŮçÓŰ+Ż˘€<>ďö}°[ą[J×ďěí¤ëĐŘ™ČĎă]Ć…đîËFđ÷…­ďnÍćK‡°fŕ+¸˘€8˙†^ŔzEÍ…µě·‹<Ţqy)cŹĄvQ@y­|/µŐ>#[řąő)㞍ŸŚ;sžqOřŁđÎ×âú|·ZŚÖfÍ]@Ž0Ű·×'ýšô (‘ř“ŕü<¶đŃZßÍx.™X™.Üjîh 4łřqmáßj^5Šţââŕ¤ó}Ć’Ęx9Ż Đ4˝'â/5˝cÄ>!ÓĽ9<“o3,{ň9#sŰź|×ŘÂjż Ľ©Ţ˝ŐĆŹM#n)Ę>¸P‡ü7óĽ=ńšĂGđ¶»&ŻĄČŰn"|§]¤¶GC· +ę™S̉МR3ő¬? x?AđÂżö›«¸ĂH]‡¦ăÎ+z€<˙áżĂ;_ęÚ•ő¶Ł5Ű^®ÖI# ćĎ4Ďü0µđwő ^ßRžĺďĆ.[wPkĐč  “ö{¶V’;__Ĺh犑čyÁŻJđo4Ź řf}ÍX.w—”üŇ–]§>śvŐŃ@˙ ó¦&©çŰëw‘Ű 7Ľ°HÎ3źÖ¶ŠIü+ĺ/…şćłgńK“Nąąyî®Q']äůĘOͻ׌žhíĘ(˘€2î|C¤[C,łę6Ńdž',ă‡íúÔú^«a«BŇé·pܢśg_Jóč~«âď]jVń]y["ŠU ŞX’[iă<Ę®\Ř[xsâž‘ý“[A©Âé4 &WśŕtíůWd¨SMÁ7tŻĺµÎH×›Jm+7oĆÇsq­i¶Ćä\_[Äm°&ŢŕlĎLýjM?T±Ô,ŤĺťÔRÚŚćPpŁy5çZ¦·ńcÄ?Ú)çŰ[¤1ůŠ ńÍ^řź Vz>‘˘éŃGegz±Ę° EŰÔŚSŹĘ—°‡4`ž®Ďđ¸ýĽůe6´W_ŤŽŞßĹz Ĺض‡V´y‰ŔQ äúĐÖťýí¶źl׳¤)»śž•Ëx“ÁzxVîŢ :Ö†xćH¸e\‚[©éÎk‘Őµ ő?±Ovĺć ±=X,ňĐ…K87kŰď Vť;©Ą{\ôyüO˘[Ţý’mRŃ.3‚†AÁô=…?RńʦL±_ę6ĐJŔŚă8=+•»đvŤĂéŘ[›‘g曓2y›s»w^´Ď‡>Ňnüks¨ŮAyux…¤štřč'‘€J:*<×z;©UË–ËUsľ¶ž+kyX\nWCĂŘÖUçŠ4;+łkuŞZGp Aô>•çŢÔn4ʆ#{i5•ÄŃŔ{¦vʎ$Ő ¶ť†"‚ăÁZťüł¦é.ţĆ\ČOń+ă8ôĹZÂ$ĺ}Rv!â›Q¶Ť«ž«Żkvz>Ź.ˇq•ăš&Ł ç‰5ÍKSđíţą)¸0Ćc¶óŁ…Gđŕ‚Ć?É­ď%Ô>8żk=QŇ´k¨w§‘AŽś`gž*g…P‹×TĽ­ţeCĺ%¦ŤůÜô[+ű[ď;ěwÍ乎M‡;XuŢŹ·Úh}‡íýłg™äçćŰëŹJâţtń'ý…%ţtÂAřÔ1ŰMţ¦łtśŁ}•Ífá[wc«Őą®R-CĂ«sŤá ťJÜEd6±=píĎňĄ íM= ťudŕÖ§¤}®ßěFđOµd2†v’séŠÍ»ńN‡h±ŤRŐŞ2ůČ=ţ•ÁxWúę1m±GvřG—ś~d֟à ix:ÎćóO¶ş¸şRÎóĆă$3ĐqÚ®T!O™Í˝ŤyÔĺPKUsĽ¶»·şµ[›iă–݆á"0*GÖłnĎí ?+±*9đ!ůP¨Aµ$ýŰ_Ď@uä“‹ZŢŢZť®•â-#Vŧj÷ťÜăéF©â-JśC¨j6ĐLFv;üĂę;TŮ:^‹Íţť¦Ú[Ď óCˇ ㏠Ż)đUĺłŘ\Ţę^Ô5»ËÉťäşű'ś„g˘’éE:©y+Ůz\*V•;EÚďÔö«[níŇ{YRh\e] ţ5µ¨Á¤i7š…ŃÄŃ4Żô5Ä|)ŽöÚďZ·}:ţĂK2 m"şŤ—něä ý3ö‚¸{o…Z±Śd1FHôiƵ?g7Í©OÚAI˘×ÂÝSXÔü7sâOŢm·ľv¸¶¶*Ş–¶ŕśrNG9$ńŠčî|Sˇ[y>~«hžr‡LČ9ˇúU FŢ;O†“ŰŠ-0˘č#¬†ľŃî<kq}§Ű\Ü]Ł3É*`2@žGt«§NŽso{hDęOź’ ĄÎŇű_Ňl-âžďQµŠ)†čŘČ>qę=jÖźi©[ ‹ ®!'ălŚúWšü'đć›sc¨\j±^ĽW/mÚH#E=<I«˙-ăÓ|kâÍ:Ń|»4xÝ"uI üAWR„#̢ÝâE:ó—+’ŇGCá&’8µ7şÖ“SUąrËýĂô«w>'Ń- ‚iő;UŽqÎüďĆEq˙żä âĎúü¸ţF«ü$đ¶™sáµFŇۉ…7 $¨<UR””¦ökoBaVmF0[§ąčRjú|RĽRŢ@’$^{+8ŹűÇÚ“JÖ4ýZ9dÓnâ¸HŽ×d<^u®čÖúĎĹřlî6kbŻ$@ŕ8Rp§Ű8ü«Gâ„Ph^ –ŰF¶‚Ĺ/&Hdň#=sʦ*}„ŚSÖVůí攤֑ąÓ˙Â[ }«ě˙Úö~nqŹ0c?^•­uuĄ«ÜÜĘ‘ŔsHÇ\×8ţđúč-§Ť6Ű-ľ–<ÝŘűŰúć¸ý2î{ź:´W.dkQ-şąç*§ŠJŤ9ë÷KďVpŇilßÜz%Ç´‹{¨-¦ÔmÖâ}ľ\{ňÍ»§őČxgĦźń#Uđ®żt×i2Ý6vESĺwŚí?Ą^ř}á]*ßĂÚmíĹś7:„ŃĄĂÜLˇÜ1'¦8éé\÷Ĺ Z|Rřy}ÄĎtöÄŽĄX`ţ1¬ŞĆ—,zR”Ąiu=^Šl®#‰Ü‚B‚ŘN+Ěßă–ŽĘ|?âbTă"Ç˙˛¬ŤN® ă˝ÄÖż uŮ­Ą’”Cµăb¬3cč;ÂĽăâÉ} |<đé‘â˛Ő¤‰nJśnDDůI÷ݟ·ţ$|=đĎü+íSěZEŤśö6ŻqđB© dRܰ9Ç9 úçVÓíu;]:âîď®0Â͆Nŕişľ·¦hćÜj—ĐZ‡ňâó_nöôŻńŁ{uđ×á÷Ťç/%ö™v‹<ťÝ7•É>ű?ďTźmgńďŤ/m´çf¶đö’×héĐĚűXÄ˙|š÷}[T±ŃěšóTşŠÖŐHY[ éÍ[FŠĘr¤dQ^â­dxßDřqĄFwkLłÝ(äm‹‡ţ‘řWoâ/‰Ú~¬Üé“hÚőÄ–ä)–ÚÓ|m•žzĐřßâ>ťáźčşKOhĎu9[Ćy?ăÖ<}㎄“ßŢşH|QˇĎ¦ FRŃěL˘Ź{Ąř˙Ĺzüţ&ńmŐŚqÝýźL¶µ»®ŔNpAíĎsšŢřµÝ玴™ôż#LKŘÝtë¤ "Ü*Tä ţT|đţŤuuâćşŇ4ůšßV’8L–ČĆ5r8€2őíkGńOÄ[Ť+Sń\–^Ó­Qaű-ŘAq!ĆI~wcúWá­5´źŰYZř®K«´ě&™<›ĺnAóIďׯľ+—đφô9~5řŞÎMM{Hm`hŕkT(„’«Śô­ eTýŁĺTPŞş& É@…ŻxŹFđú#ëZ•­¸%p }SOеý'_ćŃu {ŘĐáĚOť§ÜvŻ"řs˘XřßÇ~0×|Ko Ö·bŇÚ …‘ Ďđž:ŹĆ˝FĐô­f]Nµ±I<‹oŤXŽ3Ĺr_î&´řS®Mk,̢Ża™ăKâş xY ńč®ŇŰ’C˙#g1}Oô¨hů$Z÷ŇýsźżäMř˙a;/ýĐŞkz۬ÚΡmg)™Âî>ĂżáTôŹxwWIźMÖlgˇ–LJDXČÖ¸ŠşŁŤ´ż.„Őăü;˘]kž5Z>›0·Ő6CćZŁyKÂäp>•ěűFݸqŚcŚP„xŰÄz_Š>%ÇŁ_x§ě>µłó^K; ‚i‰ĆŇă תiFđ‡…-ĽÝXť1Fčîď® Čů¸ĎŻ:˛đކßďě[FÓM’é+ ·6©ĺ†Ü>`¸Ć}čŐ´Ë_|w‡BŐaGŃ´]3íY‘™‰AŤ˝1ó= ôíĹšż+EŁjÖ—r¨ÉŽ7ů±ëÎ*őŢ«ai{ ĄŐÜ0ÜĚŚńĆîe^XŹa^Gń«Ăúo…ěôŹřvĘßMÔlo#_ôHÖ!*1ÁR™ńIO|Mđ.™q$‘ŰÝÇ0›ËbĄŁ3.}Ŕ#ń TĐüO˘ë×čÚ•µě–ŕD-»nzsÓ±­YĄŽžY¤HâA–w8 =I5›ˇxsFĐ—EŇěěw¨W0B¨ÎMÄrÝO_ZŹĆ:†Ź¦řrö5ĽđćĄŕőĐţßÚÚ¬[áÔNž°Ş`Ś>ţ¤{äÖ—ÄÉĄ˝ýťü;$ň3Ë ł ää“·'Ö€=VďÇ>łÔ ŤÎ»aҶ֌Ę>SčO@kf˙Qł°ÓŢúöć(lĐiť° ‡5Â^|:đÄî-NŤdÓ-“;\TĚdNýřÝśű×.ĄĽý•YÜ»‹vŹ$çĺIĘŹĐ ő}KĆţÓ.–Úű\±†rŘŇŚ€FFqÓń­ëiáş·Ž{iRhd’HŘ2°őuŻ9đĂĎ ÂżÓVűG˛»şĽłI®.'‰^Fw@Çy'ŚŐËxUşŃ~xŽKY\ɦÉu»’ Ë9 PÔüsáŤ2řŮßë–0Ü©ĂFe©ô8éřÖě7vóŮ­Ü3Ĺ%ł'˛ŁR˝răćż Ľá·đť5ţ“ewžâââ%‘ŮśdᏠ}>˝káJÉŁ]x˙ÂńĘňiÚt˛5°cź-X7ËüżĐŻiZ•–­d—zmĚWVÎHYbl©Ç^i¶š­…ÝýŐ•­Ü2ÝÚăω[-zdv® öx˙’[¦˙×I?ô*Ąđŕń‹â<Ŕ?ô*î.Ľgá»K6ş¸Ö¬c€JĐ–2Źľ¸Ęă®FGçW´MsK×mŤĆŹoy ś…Ăm>ţ•ă<%¤j×~&Ő5{{é#Ô¤‚ąŚH‘÷$)ă'#źjŮđ¶ťiá˙Źş¶›ŁÁĄ…Î’·/oÚĂÂŽSůФëŢ#ŃĽ>ÚÖĄkeżî d›č:š~â 'ÄI6‹¨[ŢÇĚ/’¤ôČę;ד|=Đô˙řëĹúç‰-ŁÔŇóěVĐ\(xăUď´ńŘc>őŇüM‚ĎÁ_ µűŹ Y[é˛Ü¬mcڶ88 ŽçÇ~¶Ô Śúöž—JŰ Ăĺ>„ôťmę…¦ťc%íőÄPZF4ÎŘP Ŕ9üE|ő˘&žK›áŽ˝u,¶ĂĚľiiBĽČ˛c#“‘Ň´ČÖ#ý™őK[ÝŰÝŰŻ”©u#ůbTŰĂsŚP¬^xăĂW«iu®éń\ĆqžFOAřŐŤkĹş†ń¦­«ŮÚĽŠäe===ëÓ~xq>>“i-äšqťîŢ Óy› d?QďT~x?DÔţŰjšÖťm©ŢŢ4ŇŢF&dŤƨ»ł´ťż  _ÓďmuHî¬."¸¶e%‰+¨¬}_ĆžŃď~Ç©ëVV÷C¬O Üż\tükĚţÝ·‡ü'ń=ŢFŤ}v-’v„V ~‚ą_‡—zjř\ËŞ|=ÖuűŰćygÔźç‰I'î9éŢ€>ŽÖ§O7ëqYĚŢz°)łÝźLsX—Ţ9đĹŚ6ňÝë–1ĄÂď™AŢľ¸˝ëËţE«Ů|7ń݆Ą§jVt0Ü>źôLڱĽrŁpč0Éő«˙< \ü;˛Ôu-*Îţî÷yi.ˇYJ¨rˇFŕp8íë@¦šć”úAŐWPµ:h]ĆäJ<°>µÇx↍â8fw–v—Fńííŕ2|Ň ĆÖÁîsX tË8ŻĽáö·Šm&ÚřyvÓ(t”śmÖŁĐ|C¤x‚'“EÔmŻQĘ|•úŽ˘Ľ7ŲjőA«ř{Pń–‘EmgmnfXÉUbě¸Ç%Ź'ŰŇ­hfďţÖ‹©xwÁşÖ§Ě­˘˛X´0¸ áhÁÁÍ{ĺb^x·@ł‚âk­^Ę(íĺ0JZP6Č9+Ź_jŰŻ řcá]/]ř‘ă«ífÎŐ´ľ)S¨tVfbÍ´ńś*аč>"Ň5řžMQ¶˝TűţS‚Wę:Š]{Ä:FI­j6ÖJ˙sÍp }S^hšM—‡>>éŃč¶ŃY[ęl†x P‘–S×hŕtɶ« ÷Ĺ_k>ÔüJ¶R KX µ7ŰÔ•Á=łď@ńĄkúNݧÉ}¦j×V‘gĚ’'&N}8çš±ĄjVZ˝Š^i—1]Zą!e‰˛§őâ ‚ě|\:?„őŤ ĂÚ…ŁE{Ĺ›E pÚ;cę}j/ ëďŕo|BŇ%­Î‘u!´Éç÷Ľ!ŮĂ~4íúFµ¦k"sĄ_Av .O)÷loCOłŐ¬/oîě­.ášîĐ>˙É,Ö>‰˙ˇ —áÇt=#ĂúUěš}˝Ö±$Iu-ôč$ĘĂq!Ď#“Ú€:M{ŇĘ.µŞZŮ»ŚŞJřb=q×wIŐ,u‹%»Ňîá»¶c$.gÓëí_;ř_X·ľńW‰őŤoÁş§‰®^őŕŠH¬ľŃŻ@ €ŐÓ|#‹P´ř•­5ʇµ}ĂW° VÚî٢Ť&~îF~noĄn| »¸ş_}¦yfňőyU7±mŁ'ž‚»[ĆľŇ/ŤžĄ­XŰÝH2ż_OĆĽ·áĆĄ6ŤŕωZŤ·úű[ëącă8`çŠç>ÜéqřE?´ţëZíÝîégÔžgóIcĘąţ#˝}% Ä3ŰĄÄ2Ç$»ÖE`TŹP}+śźÇţ‚ďěŇřNgip ŻJâ~ Ü]hž ×SĹ·şf‘gpďnşŚL…-ČÎßr==k ÷Pđ†§áťBßĂ/î¬^6ߦśgç7Ěpyëš÷I.­ă´7ROŰó Ěŕ \gvzcëť¶řá+›±m4öť y }‰âĽÇBŃ5OţÎZnź(kĹl˘HřŞJHŚź§NÜ ±áÝsÁOucˇx·ÁöľŐâ*±}˘ÍUÇB˛žHęx>¦€=ŹSÔě´«&»Ô®áµ¶^˛ĘáWó5CAńV…â‘4]RÖňDdŤţ`=q×ä5!wńoEŇď´‹íkJ˛´űQÓí"2dbß1QÔëëYú´·řĂĂz§„Ľ®hw6÷J·NşsC°’ ¸éžM{–˝âmĂᵩÚŮ—ĺVWzÖťˇxŹF×ŐŰFÔ­ovrâ+őEy_Ž´›Í â5ÇŠŻĽ4z…mčkˇ®ĘŘ‹·Ę–Öż]ŽJX{%ĚŢ÷·MÎK@Ńď­Şß·˛Ź+‡GÄó»éçKđ¦ťe}—s {]wÁϨâ·(¬ąß//ťÍ977ČáĽák|9®išÔ>Rß\ĘĂk«Ś Á<Ő xĎĂkĄĹĄ[jÖ°ĺ`¸YÄgo`A˙>őčôVżX“o™&™źŐŇK•µcźŽ×TÖ<+uk­Ç­íĘ:l‰·*Ó'ůÖG?á%Ób´Ńµ]&ł¶B‚ń'*>ďËÖ»z*=ŻşăegřěµR»şüNOáîŹ}ŁŰꫨB"iďdš<8l©< $Z5ňüM›W0Źěö°ň›ÇßܧÎ{ŐÖŃMÖ““—pTb˘ŁŘóÉ4ox_^ż˝đÝ´Žť~ţl–Ż FŤýA?çŰŠčĽ5yâ+Ű™ź\Ó-´űPŁËE—ĚrŢřăĐŃD«s«I+÷ę(Ńä~ëvíĐó¨4˙ř[YŐ[EÓ`ÔôűůÍÂ0ŤŁs×9=)|7 x…<|uÝn86ĎlCyN Äs\ž9éÍz%o&žŠíY˛V)­]“˝Ž2ëVńŤµĺÄ+áŰ[Ř7°†TąTsĆŕ{ăéS|<đýć‰i6ĄäÇs}9¸h űçřEu´T:׏*I\ĄFŇćm»uëíMöÄ>ĂqFÓ"¸] ±+¶Ňµ­n‚ö˛I»ď~§›éš‰n|¦řY‚ŚG"g{XÖ+•Z÷8/ęgĹßă{=Ży%‹ZÉ@+2®Ň§=9çžÄV˙ôűť/Â:uŤěb;b*č6Ię8ďShŇ´ ‹ůt›cnoĄó§Q#/ęś/ŕlSç|śť/qr.n~»ŻĂ˝"÷GÓo˘Ô"I-ä’  *OQřsFľ˛ń·ő BZ^y~Kďv<‘ř×]ES­&ä˙•F)Ev8ŻhZ†›¦x‚Čr]ÜÍ$#zťĘŔŕđxükCáÖ—wŁxNŇËQEsmĘ62}GŇŃNuĄ;§Ô!F0ł]GűűţqŐü‘ýźö/'ĚŢ>ţzc9ý+OĆZ~$Đ.4ç-› ă;\t?Jۢ“«+©-ĐŐ(ŮĹěĎ<űOŹł˛Î•hn6y_Ú?iqÓ~Ţą˙8«ŇxRk†÷Z†./$‰˛r|Śry=?íhŞx‡Ą’ZÜ…AkvŢ–3Ľ9m-–§[\®Ůˇ·HÝrP"Ľă]?đ’|uŃ, ;­´ęá—$a…R{AŻX¬Ť Ăš^…=üúmąŽ{éL÷ĽŚí#žä±'đéX·wsd¬¬kŃE†Ç|^ŃoüEđďWŇ´D÷×/.2ę™Ű*1ĺ€k±˘€<űĆž Ľń‚ôk{I’Ó\Ň„S[;¨‘T¤ŽÇ}…súŘř—â˝ü?sˇŘiÜޡöµţ-¨yôţUě4P¬ř*ŢO…·˛ŐlĽ ń™ćV?đ0 cüđ~ĄáÝQÄUÔ%r—WýÚ.ÔRGLţuéTP‹|1řu¬č?®ďuXŔŇ,’hôĆóU˛BßtŽ <⽦Š(Î>-řg[ÔďĽ;®řb8nuáĄű,®J­·ˇĚ&ó>fĺ8Űśö<ăčP]řoĹľ ń–«¬x.ÎŰVŇőgÜYK(Ťă~y1ÉÁ÷Ć8Íw~ ľń.ˇou7Š´«m-·o S \rX‚GZé( ;âţ‰â/‡z¶•¤B'ľ¸ňĽ¸ËŞgl¨Ç– t±~!x[WÖ<5á M>ŘK>ź}k5Ę™v"! rNĄz]ĹřżVńž™¬Łx@´Őô¦nŕE*É“ž˝±ŽĆ°üáßŢüD¸ńôűMýÚÇi˘G|‘ó;Oĺé^ˇEyŽ—ă?řË]—DŃmőť#W¸ÍĘÄĐ·9ÎOż§aÍzň(ĄĆŽGˇĄ˘€8+Ojqüf˝×ŢÜ *M1mÖo1rd 6ç?Ž*§Ź|)­§‹l|aŕď"]RͽŜí±nbô Đ®:xçŇ( !ľŃÓµ;Ťzxîőť^fžő“î çĺ˝O5ŢQ@-á}?‬gĐ4ť ËX°Y™­/écÚ¤˙“źó޵ľxGÄZ‹|O¨ř“É‘µ!‚x\wËg ČŻS˘€<˙ŕď‡5OiúěZŸîµ9n"E}Ѹ?)8čx4ř<=©ŻĆ»Ź5¸ţÉ}$Z‰ĽĹÉ“x8ŰśôqŠďh "˝đăSWđeť¶­Ąę¬$¸±–QG'÷$zź^˝;×A†˝ăo k:oŤ4Ë}!n€Kd‚Q+(Ćw1Î=+˝˘€Ď€ >`8 Ç­zťrľsFçöyfá÷üĽc=:ÖWÁíPđçĂÝ3KŐá^ÂÓŚ:ľ7Jě9RGB+ł˘€<ëáׄď´ăăhuËa¶­©Ď4@H­ćBůç‚qÁčy¬ ËâĂř$Ń´˝×Ä:2;5¤ßiI“ť¬ ţźŤ{%ĹÚŻŠ5Żk°ř‹O´´Ôî ž+kkyC­3Śî'ľ*o„Ú5÷‡ţé^­†öÝdF63#0äW]Ep^đř§Ć—zŚ+]Jé$¶a"¶ő8#Żzćü ¦x×Ŕú•Ţ‹‰m©h—7íp—Ër¨cG#q*NN鎹ä×°Ń@s¨kß,uKŰxĽ%e©Y™źě·^¬YŹ'nđÝńŚô©ţxWRđí®Żw­-´šĄŃąk[SŕÝłô®ţŠäľ+h×Ú˙€őM7J„My: “z’sţ?𮯫ř/Ă}…¨’ęĘ{gť Š»B¸äś{W¦Ń@}ńĂz–µăßXŰ,Öšmášé‹¨Řą^pNONŮŞ>(𖱣řć×Ĺ~ f’ŕůZť‡±¬ÉýđXźëŹzôú(ËĽYáé~6>1đT0\Ý]B°ßéó¸O4!łŚŕý»Öż…őŹęzÔ#Zđĺž“Ą*±•ÍĐ–F8ŕ(×EwTP^đĎĂš¦‡â/ÝjVâ(5ń=ł ·§ÍÎ8ę:⽊ŕőojWt]r(i–ÖRĂ,»Ôrxs“ůV.·áĎř_Ć·ţ#đUµ¶Ąk©öÝ>igxţ%'˙×Đ׫Q@W„5_ęzą>!ĐlôŤ-c8ŕK+żn‡uě+ŚřđŰT×>(YęP©ĐŻ<©ź1FLGˇRrrˇG˝˘Šň˙Ž>Ö•×Q@iđßÁ·¶:W‹´˙ZíőkŮŮTH­ľgĺ'üÖ7‡­>!xŃ´M?F´ń“7Ů.ĘÂę¤ç ů÷Żd˘€<˙SŃüG㇮ťâ{=7TşĎ“2DCžrq\í”ď|7…ßBÓôDŇMHÜ«¨ŹnŇV59ÉäW±Q@_ŕý+ĹŢřS§Ůişu¤şíĽĚŇZĎ2íhË1 08Ď#˝dxŁOńÇÄ+k=/SđÍŽ‹kÂM-ä—k+®ÓźFÉŻg˘€<Űâő‡×4źxAámoN‡ěďçjÜĹĎěy>ťzńShşďÄ-CVł†ű¶:eŹ>Ő<—bCłľŔ_νŠŕüE­xëL×'M+Ă6šľ”Ř0Č·b)ŽCgßÚł~ř[^µńOÜx¦ăHąo[Ăč¸aŹo1ń‚v’:ćşş( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠF`ŠYU$ž‚˛ôß躝ܖşv­cusŢŠŐ~Đ­Q@ĘŢřűB´7 $ó4đĚa0$Eťc8śő«ľń^•â‘4ůś\EËÁ*u¸?Ň´tj%Ěâěf«AľTŐÍÚ+›Ôük˘i—7¶÷—“Ú2«Ć–bĂ (x«Z‰´ëÍ ővi-lÍr»ÁÇJ)ĄvUvąµEqp|Iđü“Ş»ÝĂ «q-»,gńířŠčµ˝nËFŇ[RĽýmůŁłžĹŁR-&·VM§±ĄEq×?ü=ŃÍpńµ®1ţ÷řTşźŹô Śbi®Š€Îmb2*Ď'ĄWŐę˙+·§üČë(ŞZF©g«éŃ_ió¬ÖŇ ‡tę= swź´ k™"Y.gHŰkĎăSţ÷Ă51Ą96’ŐUa›{ťŤÎxŹĹ6Zo…ŰU‚S2L„[´HX3HĎ ăľ+?ŔŢ3·Ö­,-fűKjOé\ŔU ÎĄ5BnvŃ Ö‚’…ő:č. ¸ mćŽP§kl`Ř>‡ęZň_ř§Lđýľ±ëĘ÷j2”†ËąëĐ}kĐ|9âm3Ä))Ófc$\IQÓę U\<é·¦ťÉĄ^5×^ĆÍÎxĆZF‡v-.dškĚn0[Ćdu§°«ľńťâg›M·–vÉ©WCčA¨t¦ŁĚֆЬąSÔÖ˘łtMnĎYű_ŘYŰěł4n\aÇ\RrËţ˘î·y>~Ýż.ß­O$®Ő¶Tő4č¦O*Á ’ÉťĄ›€f©čZµ®ąĄĹ¨X35´Ą‚–]§‚Aăę G+µúu{u/ŃY¶ZÝťî­§@Înl¶ůŔ®ČČÁďX748.$Š1{t±¶×–ŢÜş)ú÷ü*ăFrvH‰U„UŰ; +>ŰY°¸Ń—UYÂX”/ćHĄ0¨<×;ÄŹËr‘™.Ł…Űj\É,Dý{r(ŤĘöO@•XF×{ť•™®k–:%¤7ň†iVe†ćŹĂÍféţ5Ň5kű6É®&›÷Ë| “óĄ ”äą’Đn¤ĺoSĄ˘¸ŰŹÚSČ‘}¶ć8ŰkMąhÁú÷ü+¨Ňďíő;o,ÝžŢeÜŚĘT‘ô<Ń:S‚Ľ•‚5a7h»–¨Ż>řĎâ ˝+Ăöšnĺ5mfĺl *pȧď8úp?ŕB·RďOđ^ĄYę7Rţ[q<¬\łŕ’ĚÇńć˘1rvE9(«ł¤˘¸č~#xzKÄ€Íq;lK‰ e‰ŹłR:˙â&grń4·˘6ÇšKF‡Ý»ţ­~ŻVöĺf_XĄkó#Ż˘ą˙\i·ž»¸ąąi˛ÂÍo÷¶žâťý±¦č~Ňć–iMś‰ 0ČŔ–;”m-řu5*›kMďbťDž»ÔW5§xÓIÔµĹŇě Äň±aç$GĘĘ‚OÍřT4hÚyžE•áňc´…—Żžćź°©{r±{jvż2:Ę+ďÄú]–‡oŞŢĚÖöÓ¨hÖD;Ű# m9¬í+ÇúŁ{¦ű‹YĄ8]Bc@z~t•Ť6Ýh'fβŠËÖőë [4Ôe1}­Ěq¶>\ŹSŘV kşWŤ­ő O–ú3$-‹´FŚFVČ=qIR›Ź2Z Ô‚—+zť•ç_§‚3ßčµ…Q@ –D†6’WTŤFYŕîj¶ź©ŘjJçNľµ»pć VM§ßŠńOÚĹއáÉ%»6˘ůSŽ8śŹ*BŚ9Á'<⻟^x/CđĹ濤[.ʦ9 <“DŃłČSÉęqŽą öŠó‹/Śž¸»Ž)dż´†FŰŐÍ«$,Ţíő W[âźiľŃĆ©ŞĘËf]#ďĺştí@TWcń+Ăú‡Š#Đ´ć»»¸whüř &ŔAŔôÍv”T1ÝŰKs-ĽW˝Ä@"W“=2:Šáµź‹>ŇőI¬·wł@Űfk+s*D{‚ĂÓŰ5Ď|/Ő,µŻ‹~2Ô4»…¸łžŢÝŁ‘r29ěyŘаQ\'ĂwĐ­ÓÄłi×’Ćš„Ťvׄ€BçřqŢ©Mń—ÂÉ3WTą¶VÚn łf‹?^ ü¨Ň(¬‰|I¤ĂáÄ×®/)â ĺR™SÓ‚3“éŚ×%Ą|_đΧŞAelš§ďäĹ;Y°ŤÉé×óč”V%‡Š4Ű˙j^·y٧˘É:”!@`Áď÷…;Yń.ťŁęÚV›zň-Ö§!ŠÜ* SÚ€6h®GĹź´ _Ą…ä—7.˙˛ŮÂe/©Çń57„|u˘ř©.Îś×1=˘†ž;¨#śŕ’xě{ö ˘Šó‹ŹŚžŽgX§wnŚU®­ě٢ČëÉÁ?€§|KÔ<7«x/HżŐoďŕŇî/!’Ţ[Tew|1PT€@Ŕ=GĄz-•â-{LđΔ×úŐÚŰZ¦sd–=€’~•Éé|/¨ęÚ;ŢŘ´í¶/mŚqČ{Üřâ€=ŠÄńOŠ4ż Ĺe.±3CÜëo…Č {±ě=ë““ă/„Ł»´·ÂضÁ{öGň ˙{®=ń@ŹEcëŢ%Ňt-ű[SĽH¬H$¶üô $šć4oŠţŐ5K[‡U¶šéÄp5Ĺ“*ČÇ‚3Ź©ĹwôQ\—‹~ č^żK÷»šýH-ímÚFÚsÓŹzëh®gÁľ7Ń|^·IšQqoŹ:ŢxĚrGźPĄgjß<1ĄI ÝÜßiłźěÍn–‘ßůę1ߥvôW3Ťô_řD“Äw“Ia¦¶pn“kç8ĆŃ’IÇV™ń·×Ń[I%ő™¶Ĺ5ĺłG‡ŮąÇăŠôJ+Ĺ'Ó|3śÚ«Č©u:ŰÄcBŮvéřVŽ©}™¦Üß]–öń´˛!@Éâ€-Q\ŐĎŤtkoEâyei2*şż–waŽË\ţĄń‹Âv7RD%˝ą†3¶K›kfxP÷ů»ţ E˘©iş­ŽĄĄE©XÝG5Ś©ć,ŔáJúóÓń®OŚ~[ć…'˝–ÝcŢGjÍź÷şăÜ P}kymwć}’ćü¶ŘţS†ÚއµO^Iű>MÄ^/šY"“W‘ŃÔä0<‚+ŃüRí†ugŤ™m%*ĘpAŘy©ExWĂŹźřOŐ¦ń/-ďî±xď_‚@ŕšč~xźRhüU¤řŽěŢż‡§)öĽe¤ŚnÎ}HŘ:őJ+ή~1xN+;9ášňí®TşĂon^DPĹrâňzŢń_Žt/ ZŰK«ÜşKr†Ú8ËÍ'ŃGó8ÓŃ\g…>$ř{Äş‡ö}¬·ş–Úň¸ő^ÇéśŐĎřëAđΤ–ZŐٶ•ŕk…&2Ŕ¨8ŔÇ%łĐh§˘¸â×…u[Öµk›‹ ¶4Š/ˇ0‡U$ÇOƢ·řÁá9µ(m ×±G3„Šę[VH]ŹL1çń#čtVv˝­éÚ—.Ł«ÝÇmgÉ‘˛sč“ě+‘Đţ,řcVŐ °^ŮÍpvŔ÷–ć$”öşsďŠďę+«- i®ćŠWďI+…Qő&ĽĂâ§Ä¸ü3ŻhÚ]™¸›´{Ö[vaäă•RGĚÇ ńśbŞüPń=‡Š~k×zb],Q:DÂâÎTđnEzę2ş+ŁV‚=ikËl~.x[LÓl-$šňăČ·Ť&žŢ٤Š6 »ăŰ5čš^­cŞiQjVQÍc*y‹08÷ĎOĆ€/Q^suń—ÂV÷oË}=Ľo±ď!µfO›©ü®łXń>•ĄxaüA=Ç™ĄŞ,žl#~ĺb#zŠÚ˘«ŘŢĂ}§[ß[’mç‰fBFÖ} dč~-Ň5ťëUµ¸)ck#Ç,“.ÍĄ>÷á@ÔW›ŚŢó2UkLŕ]­“ŹľzăđŻE¶š;›x§„“¨IR¤‚28<ŹĆ€$˘±/ĽQ¦Ůx«Ođôď ÔŻ˘iaP„©U NOoşiŢ+ńźám+űGVyŰĚXł;ŕq@4W;âďh޶‚]^wpq Fd’SěŁúÖ…>#hž%Őłm#ÔmŻŠ—X®­Z<¨ęsȉ ĘŠăŇő›[ýBâÔâŕX[Vßsp8ö« ř‹ˇřľőí´eľbŠY¤–Ů‘1‘»¦yé@•çúĎĹĎ izŚÖb[Ë×¶Ď%ťłIG¸-Ŕüł]†¬éúţ—٤\ĄÍśĂ)"ä~Aö<Đ… íÔ66s]]?—(d‘đNŐ$ŕWž˙Âĺđ ™w¶¤–Ą¶‹·˛qç×ô H˘±môđFŰî VxT÷ů»ýFhŃhŞvšĄŤŢ”š•˝ÔO`ńů«>p»1śçµpżđą<"o%žő­•¶5ęÚą€ăďuÇľ1@ý­ĺµâ»Z\C8F(Ć' µ‡PqĐÔőĺ?łÜ‰.Ťâ"exßV™•”äOW©Ď,pBňĚëH 3±ŔP:’hôWšÜühđ”WO-¨ÝB‡k\ŰÚ3D? üuľ!ńfŤáÝ=SWĽö˛€c ŤľBF@ ŚçŰwĹnŃ\…ńcĂľĄ ‰’ňÂâsEőą‰e>ąž+ˇńG‹4Ź ›í«n—’ă®T2wĂ»Eyîźń{—ş¤V^}Ýżśţ\7ÍRžŘcÓńĹ6˙ㄬŻZžňXü·»ŠŮš9ÇŢďőТQXşď‰ô˝ÿۗ““¦ť„KîČrź§"ąKżŚž¶Ľ15Íä–ęvµäv®Đ黿Ô(Ńh®\řŻám&ŕĂö‹›ćU íc™#dĂŽ‡×5Ńéţ%ҵ ťvĆçĎÓDm)‘Täę0yČô  š+;Ú͟t[]WMgkK•-uÚHɏ«hľ&ÓµťSV°±yăL—ɸ „ŢÇżJÚ˘ĽňŚŽŮ$†{Ë©Y™~ĎolĎ"í8$Ž€gÔó]|eŁxÂÖi´[–v€…š¤‘ÓrźˇçĄt4Wšř_TđÖ‰}ăŤFÖ÷Rť ľ'PI#i<ą70Ű$g#ňíXßţ/Úę‰4zÂ_5ŐĹ󥸊в¤eľE,8ČĎ4ětV/„üM¦ř«M{Ý"I(ĺh]dBŚŽ˝AĄ0x§Lo7†ŁyTHĂŞˇ*Šznnǧâ€7hŞş¦ˇiĄióßj3Ą˝¤^I\ŕ(ŔĹń“ĂLËŐ–ÝŰ tÖ/ĺ7¸ďúP¤QXz—Š4Í;YŃô»—”]껾Ěd´r{u7ŠĽAaá}mWViŇ"ˇŠ&ăÉŔâ€5¨®Ä>/Ň<=§i÷ڤϭô© Oł RĂw Ŕ<×2ß<"·˘žńmËl†Ő„çűÝqďŚPŁQXľ$ń>—áíűgP™żłţ\IďČn„cµrş‡Ć Y_< =äĐĆŰîfx˙˝ßęč”UK]NĘëKMFŢę),?4NäŰëšŕgřĎá(î]MB{dm­yŁ4#ńęGĐP¤ŃYŰúkxr]v •źLŽÝîLŃ|ŮERN®âąź‹Ţ‰¬ŇŢ[ËÉ.U\%µąsn›ű§Zô*+ĆeřĹiÄ‹«GűiĐŕ´Ř-»O»–Ć7ÁÇá^ąĄ_ĂŞi–·ÖÂAÄk* «`ŚŚĐĐŞ(®?âĎĂžÔ. $^J˘ŢŘ/S#đ1úźÂ€; +Čľ^ęzVˇ­xCÄW2OfRî%bĹŁ‘A Ř?3]ď‰|aŁxjöĘŰZşű1»Ń»)Ř.ă“ۧ¦€: +Îěţ0řRăQ†Őäľ¶IźdW¬‘9=0zŹÄ ę|Oâť+Ă1YK¬\y0ÝĚ ŽLeCO'°Ŕë@tWś7Ćo­ŘŤćż[fm‚ő­@}ó×ř®öçQł¶Ó_Pžć(ěV?4Î[ä Śç>”jŠóeřŃá&¸ _Q[BŰEëY¸óëŹÂ»sÄšfŤáą5Ű©÷é‹'›ßąX€Ç^˘€6(Şö7°ßiÖ÷Öä›yâY‘µ†GCXÚOŚ4ťW@˝Öm$”ŘŮ´‰+4d0)÷°;ĐCEyŐßĆ/ Co-íé’5•–ÖŮśÄČßŘlćşď xŹKńN”šŽ‰r.-í'YuVh^Šŕ|CńcĂ.§%Kw}uŰ*Ů@eźBx–k~ĎĹÚ5Ď…‡šäŰéEKnŁ+‚AHÎr1Ç^ÔżEyć›ń·ڌ¦[ŰUť‚CqslŃĂ!=0ÝłďŠéĽSâ˝'Âéc&ł9‚+Ʉɷ*ŚĺŹaŽô»EyĺŻĆ O©Ghn.áŽGĹu5ł$21ôcüČŤOă„ôűÇ…®/'Š7Ů%Ő˝ł<(sówü3@‡ETR˛źKMJšÁâó„űľMÎěúb¸&řÍáwĺů·Ć×~϶‹Vň3ţ÷\{â€="ŠÄńŠ4­CM_PśýŮeoCÇozĺoţ1řNÎíâóo§‚6Ř÷pZłŔ§żÍßę E˘¸ßřçNĐĽúݬÍp·±´1ł‡b¤‚p>QęN+/á—Ä{?Řiv7?lm]íCĎ+Ű2DX.X†éŠôj+ÎŻ>0ř^ ™b·ţŇľŠ&(÷–Śń)~n3ő®ßBŐ¬őÍ*ßQÓdi-']ČĚŚ„óŽŚë@¨¬żëúw†ô·Ô5yšU`ąXŮÉcĐ śšĺ´_ŠŢŐuk};7ÖsÜ¶Ř ĺłF˛žÁOřâ€;Ú+Ä>-Ńü=¨YZj÷?g{µ‘Łv Ą±íŔŞńţŤâ»ë»}%ovŰGć´ó@cŤ—8Ę“Éü¨­˘Ľę˙ă„í/ee˝ąŠ&Ů-Ő˝«<({ĺ»ţ×y¦jšĄ„ş|éqi:‡ŽT9 Y˘ŞjÚ…ľ•¦]j¬RÚÚ6–F8P2k‚żřĎá+H-ĄYŻn|čÖV[{rć=7ó€}˛MzEź¦kZ~§˘C«ŮÝFút±ů«9;T/rsÓ9ĎLW'Ć_Ąď’.îž ű âŰ9€ăďc§¸ E˘ą9ÓĽ%áżíçyăch!Bë!ŔÁ,8‘É5ťđźÇ âm"ÖÚóío«¤mĚŹlcŹ$ôSĐă ~čVw5˝;ĂÚTÚŽ±t–Ö‘}çlśžŔÉ'ĐW ?Ćź Ű2}ŞŰY‚9?ŐI%‘ /űĽäЦQ\íÇŚtk? ÇŻęÉe§Č2żhڬ„çl듎•ŤáÖőhtčŢňÎę~ –ć!7˛žźž(»˘ąßxĎDđΡei­]g»I7e%A““ŰŰÔ×=ań·z”6Ť%ő¨ť‚C=Í«G„ôÁíř@‡EgëšÎź érę:˝ÔvÖq ´Ź“ř9'ŘWŁü\đľ§©Ácć^Ů˝Ăm‚K»fŽ9IčvĎľ(Đ(¬x·GđÝćťm¬\›vżó<§+ň €Ü{}áYţřŁxłSąłŃŇőĽ”ó<é`)®qň“Éëé@u2yŁ·…ĺžDŠ$™Ý‚ŞŹROJóËżŚ~·šEŚęW0ĆJ˝Ä6Nc\uÉ8ýhxďT˛Öľ뺆™p·séŇ´r/B6ź^Eu’ę6QY-ä·–ÉhŔťĄP„lăš´##‘^ ăźů6ţ˝í?ŻZµńFšFW¨Ţzôě*|QđŢ…ŞI§I%Ýíô_ëb±€Ęb˙xđöÎhą˘°Ľ%â˝Ĺ–Os˘]yËŰ,lĄ6ôe<ŠÂÔľ*x_OŽďĎşĎorÖ†Ţ8KJî µ{ŽG=(ş˘ąłăM/ Câ;餱Óe]Ëö”+'RÚ2rqĐV>ń[ĂZÖ«śŹygq9Äl·1,§Ń[¦~¸ ňˇĽ»¶˛€Íyq Ľ ŕÉ+„P~¦˛ĽYâť#ÂzzŢkwbݶF€yŃTrkĆ~2üDĐĽQđîňĆÉ®íď|čť`»€ÄΡą+Řţtô^”ŮdHŁi%uDQ–f8{š!˙RźîŠđďÚĹ62Üčţi®üʶ«j)NF1…nąŔĎA@ϧęš~¤é×Ö·aČ™dŰőÁâ®WšřkXđ7†´EÖt‹ 4ËMBĺ,™šFg۸7AÉć¶4/ú˝â/ě}!®îdůżŇV ;záĎ_ËŮQ\'~*xkEŐ%ÓšKËë¸N&Ks/”}đ3ě+ˇđ§Š4ŹićóD»ƧlŠT«ĆŢŚ§hjŠóűď‹~´ gşšć ‡¶khmŮĄ,¸ÉűĽő$T°üXđŚş;jPpO(Ű[Ďßýß/?^žôÝŃ\‡ţ!č>+żšÇO’âř—y¶ş„Äĺ}Gců×_@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ĺë]FóáľąŚŢĽ#j§Ţe îWpŻ“ţéÚĽ˙4…Ňáťn!ąF…#Ë@~mŢśg­}ÁLHcŤ‹$h¬z @˘Š(ÍţÚŰż‹<]rĘ­r—A#•RXńő#ô©ĽAvź|=-Ş…šę}ĽnQśţ{V†4ŤVçÄž$Ô4E-.âĽ1Ż4şšYţ@Ó±b®Iţč”ţ…t×>ń^Ł`4˝K]¶ţÎ ,’E%‘bzV·‰<(—Ţ ]Lt¶Ž0ŠŚŕśóŽçůŐSś)rĹĘţňdÔ„Şs5{­ {§[Cđćk5‰<•°ű¸ęvg?\óP|,ł‚éá"LN…äăďO_Z߼°yôlÔ;ŰC™ŰŚÔ>ŇäŃ|=e§M"Ë%şl.ŁÖ.Ąé¸ß[ÜŮSµDíŇÇšxrilţxłě¤©ŽćdL!AÇáWĽţ&‡ÂVvúw‡ô٬d‡;Úä =KZęĽ'á_ěť#T°Ô+ݧ’F Y…üQ FÖzµjÚvI‰.âÜŃŘ]R­ s%mď­űy±Ą8ň·}­ĄżR¦“ŁęZ'Ă=~×V‰"cćÉhá¡QĆGľk«ř}˙"F‰˙^©üŞ[M&ňoϧë·ßl¸ť]d™ »=++Áú't6‚ĆçR´ąŇ c_(‰qŘgÚ°śŐHĘí^÷őô6„9FÉÚÖ˙‡2~YB˛ř‚ób™ÚţDߎ@ńúÔÖQ¬/|Ą%Ów8Îäć·Ľáů´užhĺ77Op» zŇGáů—Ç’kĆhü—´ű7•»9>âŞUbęMßFżČQĄ%N Ú¦y˙‚îu˙íźŢéZUĄěďvRYgźc¦3…ßçµt~Ńőčüsu¬jZ}µŤ˝Ě$H&Ć0qVuęVZőέá]F;9.ů¸·ť7Fç×üűÖż‡,ĽA ÔÓkúť˝Ę2…H ‹bˇőĎSWV˛’rŤµVëň"•šŚŻŁň·ů_ ?ćdő—ůÔ{Őľ5JéŘ>ÇŻő©ä𶹥ë…߆u;h`ľ6X.bÜĎVĄđď/´ßn_jbňi`eś•Á.OđŽ@b“”/)ón†Ł;F»2śşVżá-sSÔt+huM:úS<ÖÄí• $ť§ń>żJŮÓüWý©áű‹íL’{ŘĄËe#™[<äŕÔséţ3Šî±k|–®ěŃý˘ ´jOޏ÷Í_đo‡mt×Mw}y)žâb0Ź ě*'(8óNÍéµőő.’•ŁtµŢÚz¬µ]gPłÔŁŐ´?ěŘ–ŮĘżÚ›Ž:c«|˙’§˝7ţŤjě¤A"20ʰ Źjŕ,<)â]Oi kV©¦É!‘âĎză·ô©ŚŁ8J:GTúůú•(ĘRÖZ5ÓËĐ<%¶ož2\ĺ[ËCŹ÷@5KOŹÄ·’ŘXG«č(ĚááůfŤO\Ž˙çšÚđ§đőţ«pÚąkÔ_Ţ8ů÷˙Ä“Q6“ăw·’Ńő˝9âu(g6˙ĽÇáĆ ŐÎ.M&śtŢý’„”Si©kµşłâV±­ŕ:çI´ĽşD*~N~SéČĹM¬[xłUđüşSřsLŽÝăŘ…nGîýŐĐ'‚¬á _É$ŹĽďâNíß™¬ëmĆö–ËgżbĐ Ú“ÉoşP˝˝‰úćśjA+A­Ţ˙ ĄNmŢIę–ÖýNÇÖ7vź ô SjŽî(¤· €sôĹzte´Oö|¬VţQ‹1ÁüëĹ޻׼;§XÔ76óÇ4“Čżë ©Đ’k¨ąG’ÚXâ“ˑ޸ÚqÁ¬*Őć„Uú¶mNź,Ű·DŹ5ÓĎ>Ů5¬ÖęÚ L̲Űü˛Ć¤’r;ő˙ëסjVš¶“o{§śŰJąAŚc±í\¤şGŤ§µ’ĘmoN0ČĄłâB§ÓŚăÚşo hĐřC¶ÓmݤHAË·V$䚪î2Ź3kšýAJ.É>_3Î~#âOŚßcś~ĺLÎąţ˙ŕµ±ń†şµđýĽŁ1Ë©FŚ=AˇńÓN¸†×CńU‚3Üh7bi{ÂŘŢ}đU ×I®iËă-7@żÓ.˘ŃÜE|¬rw çë,<Ô*)3LD\鸢·Ĺ«XWáĺň¬H>YŚŤż:Ž?kBĘÂÚ/‡‘Ű,Iäť<\pIL“ůŐżhŇxĂWšd¤RO·ŕ0Á»}*ÜvžM<şď[aţŮ ·5J˘öJ7Ö÷ü‰tß´r·K~gť[±o Xçě?ô|EO3áf„™Ćál3őJé!đ•ÄŰÆć#9ڧť·–ĎN´˙xR}[Âzn“ĚQËjaÝ#†Ř¸8®Ö‚šwűMüڏZße#ĄÓěmôë8mlâXˇ‰Bިě+€řG§Ű›Źj µÉÔ$„9*Łž=>őzEsľ đüŢRŽyŁ”Ý^=Ę”m =ř®hTµ9¦őv:'NóKEsÄń%ßĹO[]¨kXížXŃş2{~¬|d¶‚O\Ü:ŻÚ-䍡|r p?kWĆ>ţÝ—6—Mg©Ůľű{…DZĹc]xO\×ç¶Oę¶ňéđ8ŰÚDSÍ#űÄÖôçÂnVĺéóýLjBVśoÍ×ĺú?‡űNĎŔŃ^ĺŤÄ¨%Ď|Şf˝Fc‚$ŠXăA…UW;âŻɬ^čs[Ë)§\y̬Ě8ŕcé[šĄőľ™§\ß^Č"¶·ŚÉ#žŔ Ć­E(E.—üÍ©Sqś›ňüŹ1đîţ7ü@ŠőmÜăűĺźÔšôßęZnŹ%΋Ą˙j^+([o7ĘÜ äîÁé\ŔŰ;«Čőßj´rë·m,*ÝD ťż‡aě+ÔëśÜó?řLüy˙Dđ˙ŕÉřŠďôK›«Í&ÖăQłűÜ[műü¶ôÝš»Ey/ĆĎůľ˙Ře?ô8©><Ź´ę^Ó®sý™s©˙¤ đÄmÚýôŐÔx÷Â%ÖĽ+{os)Łß-ÜŠŕ“ ‡ţZżă˙ ZřË@:}ĚŹ© šŢâ?˝ ŁĚŹĆ€ ř™¦ŘÝ|;Öíîa‹Č†ÎGŚmFU%qéČăŢ$žâóö`Ńń™¤ócŚ3u*˛:Żţ:vš‡‚đnˇáý;ÄĐǨƗ:ĄÜ—PMäî ÔŚV5÷†~#ęş\úNĄâM#ěWbšxí•ĐŚ0ôí@µ+/ÚüĐ|5ÖíĽbÚ+'ŮQ…ÚĽcÓ[â‚äń%Ž…k§MśZeäWYN6'đ¨8®‹Ĺ:kë>ԴؤXäşáWnŠHĆMyśşńŹÁź %ŤÚA©YEճʻşŚŢßť^Ň<ŞiÚÎź˘üBĐ–ÂîâQµýąßo+ž®ÓČîzö­eđlj4ĎčZW‡u«{=CNEI$xwĹ8 ARČć˛äđGŠ|IŞéSř×Y°’ÇNťnRÖĆžc©ČÜÇ·ęć·ľ<ĽÔsŠĆđLšŁ|wŐ[łł˛ľ—MF–+I7ˇä`“늳đÇI´¸ř±ăÍJxRK.„q3 ě’Gąâ¶üđö˙Cń´Ţ#Ôµ“©]]ŰągM¤Éźá€ˇB€=ż Řđw….4ř›Sšć)cŐ®Ѣ :ä>1˘ŢüBř{¦ß é“]Hďű˛8)Śţ©®—ă>ťewđĎZ[¸ăŰdDʏŔŚcÓÓń«˙<Śt`iŢŇúŇQ=ĄÜcć‰Çô=ǰô®KSđ7ŚüOm™âĎY¶Ś¬ «eInţń<óĹrž3ą¸şřEđć{Öf™®­w3H“ô˝â<‹€Ľ@ň*ŮJI˙€š©ăżYřźÁɡ@˙a[bŤhŃŽ"dQŹLq\¦§ŕřŹJ}#Ä~)łţĚ)µľÉo¶IČé˝éśghžńüší‡ý{Ă˙ˇ×®řwE°¶đuŽ”–Ń}‹ě‰G´aÁAśú“\¶§đţîďáż„öşŠ$C9S°•lôë^e ·˛‚ ăT$wŔĹ|ýá{Ë?eÍ^HĽĹ2F8!ZESú^żđűK°·ř¤YA Mi%˘\rä“ëśÖ_<4O‡Sř[Yš+Čç2‰ @*ţ™î+KđOŽôm;űLńUšč«”ŠY-·\E짦hżěĺV¶>)‚Ü Z«˘cű `WĄř·ţE]gţĽć˙Đ s Ľ/¬ő[WĽ[¸înĚŃ6ŕŔÝďëŠëu«FÔ4{ë4`ŤqÄô”Śţ´áź 4źz‡€ôÔŃuý+NŇG ÎŁ'=W˝ zŕ»_x#\†+‰o/®ŕ–k»ąxi_aíŘp=Ím|<đüŢđ†źŁÜÍňŰ) $`…9$ńšŮŐmš÷KĽµF ÓÂń=e#?­yźěߤÚZ|9·ľŽűUä˛4˛cć 1P3éĹAˇAˇűCkňj*$šĆÁ>ČŻČ@J‚Ŕzóú×kđÓĂSxGÁÖZ5ÔńÜKrdڧsďő¬ŻřďRń§‰|3© /_·O(»¦ř§Oî¸˙=˝(ăä[Ëá-VÝV=R-V(b‘F•ł•ϧ›ă+5Ź>K¸ÖDŽŇI¶0Č,ąÇäyü+NĂŔzćŻâk gÇZ˝˝÷öyÝkgiČ•˙ĽsÔôü«sSđ¤÷źôź%ĚKoem$ sîJâżh=6Öö÷Ábx”™55Ž9(ŘČúq[_í-˙áTj*!@ 14@ l!ŔăÓŠŘř‡áŹÜřzKk eňݸĽ p1Ţ®|HđäŢ,đ}öŹmŇ~!xËA]6çÂÚM±IH§ŽőKDTöç¸â»ßxxfÇO–éíoěv=µÜ]c‘F3ô¬X´/‰Ďvłř«KHW®cłf_Äc?…düPKµŹ…±Ţót—Šłsźś,{ąú溏źňK5Ź˘čB®üKđdţ,Óôć°ľZ¶›8¸¶ť—rîÇ Ź|řU _ÂŢ(ń'€u=ÄZžśú…ËŻ•42˘(ÇŢÎA Áz5•Ź€ô˝:+xľÎlŁ.щ A¸ź\’Oă^7áű™ěfż}‘4sËŕňĄU?ˇ5ďÚe«YéV–ŚÁšR"á!@Ďé\‚|4_xwX–+Čn䙤1‚×=9î(ŚđąńşřĎL°đ~‹.•-¨U-z¬żxŹSÖłőë>ýť5Ý3_Ť#ž9÷D‰ p±´‘2=÷WMĄx;Ç޵ţĚđď‰l%ŇP‘ľ·Ý$+é‘Öşáá›­SŔ—Šu&Ô.nŁuží#Tä±*BŹ—ŚqÚ€-řE€đ&ŠŮůł`9˙¶K^kđ—G‹Äß µý-Ą1Ç{{r‚@3·$`âŻXř#ǰhńř|ř®Í4TŹČóٶ˙HcA=8ă=G­lř7ŔÚ—…Ľ ˇéÚ˛C{$ňKov©»ËŤąrxć€9‹x›áĆ•›ă=CĂöʰ&ĄaÎÄč7ˇëú~5ě6p_ŘŰÝٸ’ÚxÖXśtea#^cŞřKÇţ"Ó$Ň5ďéI¦Í…ťímH–EÎqϧµzNŤ§A¤iZm aoi A㓵T“ëĹyŹ‹xýˇüOO°M˙ ËSţŃΫđůś˝„ëóf¶ľ"ř&ëÄWúN±ˇęCN×4¶& ]7#)ę¬?ĎS\§‰ţx»Ć6±˙ÂKâK3%»‡¶·¶€¤ äe›ą8ééšßř‰á=gQŐtOxZ{Q¬ijʰ].c™Xr3Řţ]zŠwü~ú‡“@ń>Ť&Ťâ#4aŽčçP2v7^ÄăŰ©­Oéž-–îÖăšͥ¤qDz[k¨7¤‡űŮęăY:‚5›ŹZřźĆZ­˝ĺí”MĄ˝śF8ŁÜ$ç“Ă­Źu=sXÔađ7†#żKY|‰ő ›Â8ËcëřV/ÂWľ˙…ąăeÔí­­.Ú(^h-_tjÄ/ ÷'9>äÖŤ—<]á­GS_ëÖiW÷ ra»·ŢŃ;’?!íŔâ¬xcÁň|=ľń'‰ő NMM%˛3ÎĚż˝yséŽjĺ~x‹ţ[ßxRŇŻµÔĽyľŃaś%ÝČ GÝ?_ZŮđ6•«ř{áż‹µ »f±ąż’âö \üĐ©^3čúŐ‰ŕ?x»\†˙ĹńZ ®·p÷_e‹ťÄd– ô®“Ŕţż/Žużx¶îŰWű=§ž.â&A* 0PGôĎĚü%¸ńť—€ěW@đľ‘ycqľFą–đ+ÎKś—˝ż ěľ řk\đÜZňëvŮCwvn-íáH‘ś¨Ç@8…RÓĽâď KsoŕŻZ.Ź4†D´ż„ż’O]¤źjîĽc®XéňŹj±ęW˛H\•}§›ĄąŠ[§š&ÇĚđˇ˝ń×ŇxŹGµń‰yĄę ZÚę3ă¨÷ă­Sđf™c§řKL´±†%¶ű2pa˛2IőÉ5ŔřʵŽŢ˛ÔTIg¬łĂň­ ôöŔ?…;KđÄM ĹtťĹv ¦Eň@÷6ˇĄ‰=Ç?Žk˘ńßßĶÚ]Ő¶˘ö^ Ó{{äQ÷¸ÎáčHé@´5•¤ß ŻîćD[›'Š[iqó#ůŠĽpH®sâśÚúĂHußö‹¸üŕÜîĘ)9úÖÍSâ«›(ĽqŻZM¤ÚĘ%6¶0üö “ţ}«¤ńż„eń˙†¦´žx´›±pČĘ~eW(śýŁlíĎÂéĎ’Čš#6sŽ? č5Ý&ĘßáöźĽbÖ=)€MŁg?\óźZ±ńCÂóřĂÂ=­ÄVňĘčÂI*0sÚµőm-ď|-wĄ$ОMhÖÁČŕ›sô ń#łţË6EŽH†ÜäQ^‹â "ĘÓŕîˇaĽbŢ%ʨQڬDőČÍgę//>Aŕô˝·[¨Ň57NõĂtëÚ»-gJ’˙ÂWşBH©,öOj$#€JĎŇ€9}µżÂŤ$¤)›¤’IŽßľK°ç×€s? TGđżĆF17w‰ŽŠ1Ň˝+Ŕľđn›Ł\MňÚĆČŇ ![,OúÖo€Ľ'‡´mgOż¸Šá5 ą§Ě`Ś$ťąď@|9řWáüĎ˙ĐÚ°>H’ř÷â;FrżÚEsî úŠMŔľ8đÝ›čţń=”z/Ć=¶ů V9!ONäýkoᇀ%đMִͨŘŻť]Áó2Ě[Ü’M`ţÍú}Ľ>ÔďR%űL÷ň«ÉŽp§gŇ—ÂQĄŻíă-ÔGéńJĘŁ±ňŽńăů×]đÇ—đüÚ}ŐÄW÷2N0@ŽqÍEĄxBâĎâ–łâ—ą‰­Ż­Ů`ďRˇ9'¦>CůĐ3đ[ţG/‰öoýJ“ör˙‘*÷ţÂ3˙1]€ü!qá˝wĹw÷1LšĹń»ŤPcśŕçżÍX>đ?Š|)­\ÇáífÇţ뛿´=˝Ě%¤Ś– G|q@ú éŕ_‹úî—p|­#Z€ęVäôYŕ~ż%«?m%Őnv±vËožĐˇŔǶF?ŕKö“±†űNđôVÎÉ®Ë{äZĎĚČă{ăî~žµę~ҡм?§évăZ@±|Oârh‡Źü6ľ.𮷢´ćÜÜŞě—ÚĘÁ”‘Üd מŮřżÄ>łµÓ|ˇÇ6‘ČT±ůŁ`.ô?ĎŹĄzoЬµ;ýh4-Diş‰*Ń\Ă…Á‚Ĺyţ­ŕßř¦Äi^(×ôĹŇ]ÔÜ +b˛ĚČ<@éŠoÄ)RoŠ˙ e‰G!¸enÄ„UĎÚ.EO…š€c‚ňÄ«îwý+OÇľ}zËF}üéÚžŚá¬çeÜĂţ+•ńWĂźxÓL{ř’ČyXkx-`)|Śł÷Óôű{xŤZ˘öŤ® Śç×5GHđ.•§řţVVšĹâd•ۆvnK{ó\ťŻ‚Ľ{¦iAŇüUf4p¦(¦–Ü›Ł?Â{t=»cŠç>ć…żěabÖ†ú;cśŤľSôü…vßô›K†šTöđ˘Ív†iź3Är ŃŇĽk˘ü9Ô<1ĄĘwÝÚĎÜĘ9y$B»Űąz Őđ‡/†Ľ!¦h÷$ŇÚE±¤@B·$ńź­pÚOüś†ą˙`˙öJőŠóźx'Z“Ʊx«Â:Ą˝ž Đ {®ŁßŠ:tü?!Wőť Ĺ—óř^hučížĘU}IaRädn{‚20}h·Ż řµŞßë?´mFŇĄÖcŃÔ.­c w$m8ŔÇoâ5îG§kŚđçđţ§â WSąŠďRŐ®|Ć’0@HĆv§?SźĂŇ€<»Ä>#×,~!řĹš×…§ĐmP‹ ©ZäL˛FçŚáWrOzé>0ŘAŞ|Dř}it«%Ľ—L]O!€!°}Ž+żń˙†ăńo„ďôycyÓ÷R0ČG*kš˙„U¸»đ=ŐţŁm,ú+;lÎÚ÷ŔĎz>?ZÁ'­T´I<§÷uzqĹs? MGÂ^·ąăąÔmcá“ůפ|FđôŢ*đvˇŁ[OÜ… $€•`yÇҲ|a૝wLđµ¬7pÄÚEä23‚D‚1‚;šłńNÂÔü.ńż‘† 4 B«• vÁĽżÇW7 đÁńoo"ćâÚ’;LJ8>ŮUü«ÚĽ_ĄI®x[Vҡ‘b’ňÖHÜd)e#'ó¬4đ-˝ßĂK ë V8#4C]NC®{@:†‘¦Éá9ôÇ‚/ě߲”Ů´m ŻőŻ ŇçžoŮ{XI‹4p\´P’sű±2ćZ»‰<ăéôoě ĽUeý‘°Bg[sö–‹¦ÜôÎ8Ďë]zřJŹŔ ᦞĐKŚo,NKžŰ·s@ü"ŔxElüżŮ°˙Ű%Ż-řjë'Áo:«OxAő­kxö ?źŮ¦Š‘ůtvßé,ch'§g¨ő­Źx|>Ő|7öČĄk¦›Ę— ®07{Žôż4Űk…Ú3A+ÜĆÓLŘĺرëëĆá\çĂrtŰŻŠQŘ(E·ľťáŤG B± ôoh’řoÂ^Źq*M-¤^[H€…c’xĎÖł|á)´oĹ—7O±xnQ˘śđső {öv±´‹áŐ˝ěJŹww,’\LFY›q&łżhĆśi^±´†9"ąÔŃZ;R9ǰ&¬Ů|?ń_…/.ÓŔÚý¤ĔQg{ńîźJčµ\x›Ŕ‘čŢ*Ô~ÓŞ+Eô„Ů&âTŞŚpđ /ĆšwÄx^măÂZ4¸_.HďTŠAQřcńŞźôËźřC~ézÎ Č˝†ŢăćÝ“łžőÓA |OŠŮl‡Šôł ‚é­7M·ń'Č­źř6óĶţDľ‰eŇîăąšITć]ŁčIć€3>=XÚŹ„úŚkj–ţYĆĚ0•Şt›+„2éńŰĆ-†ß&Ń‚|¬çëžsëZĽ;7Šü!}ŁŰOÜI*0Aíô­ ´·“²iBE5‘µßŽ2Sn~”áW÷—0ţËBaćşŔä|†s‘źC€?č`ŹÇW^ ŹEÁÚ!Ó%´&/G*W†ÇŻzě|=ŕ(mţ§„5ąę#Ç$‘K– ąîÔV™áOş’ézG‰ôŮtč†Ř$»¶Ý,kŘ{ţ9 OÇZ>© ~Îş^şŞ·Ö×*¤…óX¨Čö"˝–]ÂÓÁ’éŰD,cłh|­Ľź˝sŢ7đ^©âʇ1h:¬RęAŁyo%ŹjČT’NŐé]ĹÔ&k9ˇń”öČĹxŻ„ťźöcÔwvŘÝ(ö5zĂ8ëá^o&vK¦ĆŤŽ¸)ŠŻá//á«řSSąIıK’Â|ôĎÖłüáox~Ů4‹ťvÂm^(`"tČ!9éňśćô„ńoÂkl¤Ňá×ü-Ľ˘k_’â%'$˛÷ú~µęŢÖ¬bH8‘Î y‡ĹŰďÝiÚ,ţ Đôí6Ôah^+Ż6UlôčzGÄŹŢxŽóGŐt=A4ýkJvh$‘7ŁĆCĂő5ĚřáĎŠüX–łx—ÄVŤ=¤É$öĐ„`ĺ‹w,GŇ€#řϦŰëĽcxˇí¦ąa"Ś ‚AúăŮüT‘ô߆zóéę!híSËÚ:qřRxłÂWߌ<1¬CsQi2´’FŔ–ÚşťJĘ FÂâĘń–óĆc‘Ou#€<[Ŕ2řÚŰŔZe–•áçK–Řďxś0Éf§<×[đ?ĂzĎ…Ľ+q§kŃ$Oö–’ŇQ U q‘ďYzW‚|qáh[Nđ·‰,_G L_Ű—xA9Ŕ#·éí^áK-ZĂHXĽA©.Ą¨gyÖ1ŕôP äh DŘ|3ż†#‰ďäŽÎ1ęY˛Gýň­Uotm?ŔźďáŠÄ‚ŔůÎTn’G$ź©ý+kâOn|asáőK¨b±°ĽW¸$ËŚ=·uő«?±: )úW/sŕř›ě–ž8ń$:E»‡{{(<¶¸#¦óţ~”Ęř–K•řáM"bâçUšŢÔâIoäç^őcn¶¶VöčXŁTzŠâţ$ř*çÄV:7öÔ6şMŔšŰĚLÇ€1´ôÓxf-^&5ńĹ­ĆŁą‹˝˛Lg€ö  ö†Ó®.Ľm}–đé—iw420Q"1ĎSĎOzŔń¦łsń/JŃôťĂÚśn˘ą{«¸|¨íŃzá»őí[?ç}di ł}»X”H“»íHDgq'סâ¨kšWÄo řvăT6¶ąŠÂ1 šÎ<:¨ű»¶çőÍAńµµń·4ű+XoČi%Kk‡ŮŇ.Đ7oëPüAŃľ!řĎJ·ł¸đΕg$,Ń\C|ĄĐŽĂźóŠęotOřZ>Đ5Y%m3XT[»kżĺ”ť˙ŕ'Ę‹}âd­ ľ(Ňă·FdĐYŹ6EzŚ}±@_lRř•đâÓRE;1™!Šŕ‘ôČ­żÚÚř[~ÍîâhˇÜ•µâźÜk>7đÎąĚQäł´‘°;źpíVľ%xjoř>óGµž;yg*D’Taíô 7řŰ-ĺČđ śGv'ąGű<ϲ9¤v«CšwŹ4ż>0đăi7>Ň-€tx§ŽőKBTňţŤwŢ6đEżŠü1k¦Ü\=˝Ý¦Ç¶ş‹ďE"Śd{V Äď--eńV–°®Ü­¦feüF3ďŠćţ+iM}®|)Ó5•ď#ĹpąÎâ;ąďČŻ`ŐŻě|;ˇ\_\…‚ĆÎ"ěz(ěé\çŚ<uŻx—Áúśwq"č“<łSş]Ű:c§Ü?ťt^&Ń ń¤Ý1Xnâ1ł(É_CřóËx§Äz3ÜřÁ¶0h·Ĺúč)•ńlQĆćüĹżfťpŔ†đś€9®Lđ?Ž ŃcđěŢ)łŹCHüŹ6 l\ů=6<8Ď_zÖĐ~O¤ü/Ő<&·‘<—"uŠb>vî÷­q9˙“aŃ˙ëŢÓůŠč>2A&Š<5ă[4-.Ź:-Ŕ^Żŕ0ţźŤjř‡áýŢ©đ–ÇÂ1ŢŰĄŐĽpˇť”ě;1ž:ó]GŚ­ôů<«A­8M?ěnłż÷T/Qî:Ź|PžkŻŽľ0čî&Ň4kq©LĂ•wlŹÉřf˝†Ľ‡ökĐd°đ|ş˝ŕcu©8*ĎÉňmAôë^˝@=đűO·›ăŽďeŤ^h4Ś‘ť»€É•&§¤Y\ţŃút“[ĆĹtÖ¸Á^ ڍcî3ú ě|-á+ŤĆľ&Ö幊HugFŽ5rmćť7….$řťoâs·ŠĹ­L8;É'9ĎLP+ń†$ŹÇ®‘BÜh4{ŔäŻČpj][ţNGE˙°čÉkŁńĎ„®ąÔ0ţęöcq)ĺ‰`řçńŻWŤvÄŞyŔĽÁ|â jú…Ď€µ‹KK ů ŇŘŢÂ]#ry)ŽŰůĐ=ôßÚ3S·Ó•c‚ďJóîcAżr᏿řŐEśľ9ńÖ«4)%ÜwţDNĂ&5;‰Ç׏ʺďx"_ꎳ¬ęS×ő îvíUQŃPv?!éSř ÂwÔ|GsqsËŞ^}Ą {Đ ńÖKé|kŕ{+HoCÍ,Ék;ěŽYnĐÇó¨<ŁüBńž‘ Ť×…ô«V†eš+ŻTĽdvע|Fđ\>1Ó­Ńn¤±ÔlĺÚ]Ç÷˘qý+ź‡Cřť*Çouâ­.(T€÷Ů+ŽýF?A@šě ¨|vđuŽ´Ą¶f±Ę´Ŕ1'óQ˙|Š·űNY[Mđě]K}¦Ţć1ă‘“‚?*é~"řOÝéş¶‘~tÝ{MbmîvîVSü,;Źń>µĘxłáÇŚ|iĄ›xŽÇ0ÖđŰ@R2ÝŮűž:P°ĂţĄ?Ýĺ?˙ä`ř˙aq˙˛×« ÚŠľÇx˙Â7&ÔĽ5sos Ą^‹©‚KŽ8ďĹs_´uşÝřKJ·“;&Ő!Ť±čr+ĐŤ¤z?†¤‡I·Ž!mlŢLh  …ăő¬o‰>¸ńn™§ŰZÜEnÖ×±]3H .r;×ZéŠňĎŮĆÖŘ|¸Ôu=NřęZö˘ŔÜÝÚGaţŇ€9€Ú}żöďŤőŤMĎö›Â®G* “€}Éý)ŢŇlżáˇ|KqöxüČ­#‘>Qň» ~:űšëţxFă²kíss˙Ú7ÍvžX#`=Ž{ÔšW…'˛řŤ¬řŤîbh/­ă…aîR˝Éé@ź‹bHh/Í„’kIÖFďŻÖ˝j¸ÝwÂ7—Äoř’;’ßM†HŢs– §z쨢Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(#BĐmôkťFky$vľ›Î7cíZôQNRrwbŚTUQE†QEQEQEQEU{;ŰkŃ!´ž9„lQĘ6v°ę X¦Ő·ď°QE€(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠlŃG4OȲFŕ«# †¨"˘±ł¶Óícµ±·†ÚÚ1„Ћ߀8=QEQEQEQETÖv×öŻm}o ÍĽČ[ꧢ€ QÁ q@‹Q¨TD ŘS袀 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ eÄ1ÜA$3˘É ŠQцC) ŹJ}ćń|&°˛ó"ѵÝK˛v,mmoPgÓŇşOx/GđŚwŮQH×$îfrňĘ}Řýk¤˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ I|lą+FGQKEpľřk¦izüzŐíöĄ«ęP‚°Ë9—Ęěçüó]ŐPEPEP;ă_ Ůř¶Ú éf‰lî–í xĺ”Ďnk˘˘ŠÁńż†-|_áůt›ůeŠ \´XÝs޶áŚE q®HE 3ě)ôPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP5ă_é^/†ŘjBhî-_}˝Í»ě’#ě\ë|&Óď5×u˝{W¶F -îďŁ$tČŻG˘€"µ·†ŇÚ+{hÖ("PŠ0€T´Q@Q@Q@Q@Q@q^.ř{gâ˝Sí®§Ş›"6źÁXŻrµÚŃ@YŰCgi µ¬kĽ(#Ž5  `RŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq÷?4¨n.-نňâöšłĂwlc,íÍ_đ׋týzćkXV{kŘF^Ţá68¸®ká”PxÂ\)ąJą#¤±ăęGč*_„‡âφä·O,,Äu(3ŚţµŰ*Tůť4µµďňąĹµ9UFô˝­ó±ŻŞřëIÓ/ď,§óÚîŮ‘1¦ć”°ČÚ^µvŰÄÖ‡Ăňkń\iöČHeąMŻÁÇO~ŐĚxnŇ~.xžćD ,Ä#$}ÝČ3ŹĘźńçĂđÍ˙rj(&Źţ´{*nq¦–é6ţWµ¨ˇ*ŹĄ×ăbŇ|GÓ€In,5;{ -Ô–äFsĐçŇşw_łŃôCŞÎZ[O”†‹ťÁşůŃâ›{i|/©EpmĹłđG qů`W—Ü<˛|€ĘIĂíRş% QN•:¶i[TľđťZ”®›ľŤýÇaqńK´‹i¨I`§iĽH•éÖĄĽř¦FĎö{ÝF(Ŕ2Kk tN3ËtéWo¬á‡áäÖŞ‹ä®žWn8ű•_álĂŕ=-QF]¸ęI9ÍKT”ů^ŽŰŤ:ĽĘ7Z«ěmčzÍ–·ĄG¨XKşÝł’Ü#¨>®jÚjĽÍkg¨ÝÚBĹdş‚Ń®:śúW'áç’ßáw‹Ĺ¶FŰ™”ŮHPLÖ§ŁńbřNÂ=2ßD6/S{ľâ]Ř}kG‡„9›ÚöŢÄ,DĺĘ—kís§ńŠ­íĽ$Úľś&şIš-´ŕňŢ€cśŐ/xŞ]ZĂN·şłÔMËB —R@Dn@ä†éÍfiú ˙‡ľëöš“@]üŮcX•U*8äů®źá÷ü‰'ýz§ň¨śiĆ›˛ľ»ü‹„ŞJ˘»¶›ĽQi˘®±lÖ÷wwrj¸‚Ú"í·=OĄwŢńM‡â+a47V˙ëmçMŽľř®ká´j|CryŻ"Ç8ńúÔ–¨±üj»(/¦e±ßćOđ«­NsVŐ+ßî3Ł)ÂwŃ»ďŚě4˝HéńAu|«ąá´ŚąAďéW<3â[Ĺ1ł2G< ¶X&]®‡ÜWśřř…ő_ÜhńiŻ3Ţť®ťŽ¸§ZéĽ7 kĐřÖă[ŐĹ„i=ż•"Z»Ě1‚A‚•Jŕšľ©wëčU:Ő&Ó¶ŤöýN›@×muż¶ý‘ddť­ßxÇĚ:ăÚëÖŁÄĂCŰ'ÚĚ~qňíú×1𣯉GqŞK‘řÔBEŤ…T䦝µ˝Ź_ę*©Î=•ËUĄÉwv5ő/Y[jW6vwÚŚöç}’"â3čO­kř{Z‡\´yŕ‚ć Ź±’â2ŚĐ×)q ëţŐő GĂ Ë[Ů óYLv¶ă’v·ăZ:_Šo5Ýć}OU¶”C-ĄËěŘŮçš'J.)ÓňÖ˙šT’•§çĄż&uŐĆÜřţÎ'æj·BĹdš;c°cŻ5gOÖ5Ëk{ŰżiÖ¶vvđ™CA6ňH폥géš×Šuű5˝Óôý:ÓO”ş‘‹˛úL)ZîI5ę9Ő˝”]źˇŃZř†ÂďĂ’kV˛4–QÄó6Ě‚HÇŻ˙ Mš%“O˛Ôo—hi Ľ„~Äú×9ŕOÂ/Ž0ďéţ«µuż íăŔšYŤB™ČŘîKkIҧK™µ{; µ*ň¤íus[AńŽą¤¶ˇ`ěЦC« 22AµĎĹńLąOłÔ/e —ŠŢÍŹ›3Ўđüîüm ±­ŰmQĐpßáSü·Ž/Q@’k‰ ·sü¨•*pćm^Ö·ÍjÔź*N×˝ţLé<1âKŰË%‰‘^Ů,R®×Cî+;WńĆźc©É§Ű[Ţj7‘¬ŽŇ"ű>¦ł<0ľWĆ7G `zŕŃđu#:6©9ÝÉ ťŹ\Ś`~ż­)R„yĄkĄm=Gł•Ł}u×ĐčĽ3â}?Ä"eł2GqİL»]>˘§Ň5Ű]V˙Q´·Y–2ůR–űW%p‰Ć›o˛­>žZŕ(Ćâ ź|ů ›á˙*ń=~Űś~t§F*.K˛áVNJ/»_ŇÝkö¶Ţ$łŃdY>×uJ„—=OüÖn­ăť+LŐ®ôŮÖᯠ㌱°Ż±u·VřĎáő•ł“?””ÍŢ9~5ëŇş‚đÚFČObR1üŤ8Ń‚W—ňßń±2­6íć·áswDń­ŽĄŞ®›5µĺ…ë‚ŃÇuBăÚŻxźÄúw‡#ß»´ÓE Kąßč+ťńú…ń¤PźlŮ»ľ8Şűçăc Ŕ[éűíĂ €ŮŹŔµ ”%iŰK7oAşłŤă}n•ýN‡Ăľ,‹Zľ6MÔläŘd怏ŻăUuiö×óÚYÚßj2[śLm!.±źBkĄÔÝăÓnŢő« •Ç®+Ę~/†·čé-“;;Ně$-śŕ}(§NśÓť¬•´¸TśŕÔ/vď­ŹLđöąeŻéëy§HZ<íea†CčGjÓ®/Ŕ^Ő´ŤWY»Ő~Ć‹|ë*ÇlÄŞ·;Ź zŠí+ž´cµtoJR”’ł (˘ł4 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€<‹Ăćˇâ^é:¤šuě7¦=Ű7¤yĂ/Ôu®ĂĂ~’ĂZ›YÖ5ÔµIbČSbĆľŠ2kgFĐí4‰ďć´ó7ŢËçK˝łó{zVĄuVÄĘM¨ěsRĂĆ)9n`i^6)Ö5Ź´‰ ±Ź+f6mëžsôoÄš%Ż4™l/Aň؆V_ĽŚ:0÷­J+RNJWŐ~†ĘśT\mŁýNoëW¶‹§ę>&’m,`4inGQضkgÄ^‡SđЬĺp(EFŮżhSž™ü룢­×›ißmHT “VÜŁwaçč’iţfÝđ|ÍąÇËŚâˇđĆ”tM ĎN3yćÝ6y›vîü2qZ”V|îÜ˝ 9ůşśß…Ľ-‹¦j67­äWłÉ+ѵ€zśýk×ÁšÎßĂţ#kkĬŔ$1çĐć»Ę+EťŰľćn„,•¶1¬tiF.›ŞßK¨<ĘË$̡I ŘŘ¬Ż řkWĐeŠÝµÁs¤ÂŽÝ Ăz Ůí]u>ÖVką^Ę7O±áE~†çíją{ŚěŰ·qéÔçëD~)ăY5˙´ä=ŻŮĽŤť9věűtĹoŃC«&ÜŻ¸*QI+lqš§.·>­áÝUôË«Źőčc߇×5©áÍ'V±ąš}cZm@ş…XÄB4OqÉć·č¦ëNQĺ’üĨĆ/™_#‰ąđvŁk«ŢŢřw[:z޶ůˇx|ĹÝ݇#źá˙6“âa­KŞKwpđ”›ÍŹ—r~đ9ŕcíÖ»:*ľ±RÖż—A}^˝Ž>ă@ń*ŢNÖ>'Ům+ł*MjĆ ÎĎjÓđ—‡cđő­Âý˘K««™ ×Č0]Ď|v­Ú*eZRŹ/ODTiF/›ő+ę6qj—gCcЊ⬼­[YŤ0xšA¤´F°&ĎîîĎZďhĄ ˛‚˛ ŇŚÝŮĘhžM'Âş¦‰Ţčď<ŕ’ůŚ:íŚóŹĂ5ŻáŤ(čz –šfóÍşló6íÝÉ=2qÖµ(˘Ug;ó=őŇŚ-ʶĐç4 &ă]”Ý ´ć2ăËŰĺä:ó×Ú§đf‚|7ˇ¦śn>ŇVG3fĎĽsŚdÖĺJ¬¤šoĐ#J1iĄ·ę`é~6>'Őµ´ďĘ‹ĺlĆÍľůçň¬«Ż]Úę×WţŐŰMkŁşxZ!$lŢ d`×gE5ZiŢţBt`Ő­ćs>đ˘č÷×ZŤí䚆«sÄ—.ÜE…SÔü!|şőÖ­áý`éóÝ€'ŤâóČă=F vTQíçĚĺpö0ĺĺ±Äi>–ÓĹzíŢŻ-ĺäjâc$xó2ĄF9ů@ĎNkZĂÆ×Ćš–˝ö Âň‹ČňńłhQťŮçîúw®†Š%^rÝô·Č#BŮużĚÁń‡ÎŻŞčעçÉţÎźÎŮłw™ÓŚäcőŞľ-đ’kw–ş…ťäš~«mÄW1ŤÜzŢşŠ)F´ăk=‡*P•î·9żčúĺĄńźY×~ß‹ Ŕsęy沏‚o´Ë뙼-­6ťĂ—{i"ó1îĽń]ÍJĽÓmuňVű„čA¤źćď÷Z&“©ZXÝǨë^ÜĎť˛ůa\cĺüjżĂíPđ߇ţĂ«jňę×>k?Ú$ ‹É'˙×]-ś¤äîÍ#dQEHŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ľ«ăߍµŹéÚTÚÂŹq+$žl{ř5ęµŕźµ—üôúî˙ú f7ÄŠúV™o¬ę:,3é2Dłů‹eňŘ (ĨÁkÖţřňĎÇš$—VŃýžňÝ‚\Ű“ť„Ž=ÁÁÇĐŐ˙,ođăDYÂN“pÝ ů+ś×„ţËĹ—ÇÚúZ“öhÇŰ"UŮú Dř^§­é–s˙Ď9î‘ň'5ó˙ěć ř›â0§Ă.§ďEpbŇ řĆú/‰z5ýč•Ű|±ĚQ÷ĚŠxꍠł,o­5 qqaṳČOâ8¬«ĎxjĘčŰ^xI‚ŕ仍XpOäw÷Ú…ţę×îćx®çT2Č{;AŕBä ĘřEđ‡BńGˇÖ5ą.žîńäŘb“hŚ+üNA<úĐŃ unö˘ĺ'‰­Ęî‡őĎLVU§‹Ľ9yx--5í*{˘p"Žî6b}šđ˙Ú&Sáo řošCÉťĺ¶ü`|Řë’I>őGâ/ÂM+Ă? b×l..?´í–ťËĺdŢʧ¶ =…}#}i§ZµÎˇu­şŕ4łHFx'ŠKMBĘňÄ^Ú]ŰĎfA"x¤ rwŽ0*ůű\ÖîµďŮíWîŇ\$ŃŔÎÇ%‚L'ß®Ăá ýźcf8Öô“˙–€=/LÖtÍUdm3QłĽXţů·ťd őÁ8¨SÄz$–3^¦±§5ś-¶IÖĺ !ô-ś^ű+˙Č/Äßđý×đcÁÇš•őŤíýĹľ‘fňÇĺälŞă<síď@Z wI:RęÚv_Ů­ĘÝÔDyÇŢÎ:Pi~(Đ5iüť/[Óo&˙žp]#·äkÁţ>x2űHđdží48î®t=5$IďbA ŔzäŚöüiźGĂťcÄÚLö¶—šVżlŰă¶šc$38cÔŽ psë@Cjşľť¤@&Őoí,˘'î&XÁüIÍ#ZŇőÚM#RłľEáŤ´Ë \+ĺ/ëvşĎĆ;ÖńLw÷šEśĎµł}Ş0ŚÜ“Ká›ű]7âΗ{ŕ»ZÇJšXâ’´çć8aÁ9^‡“@^WÍż|q®ß|J_hzüzU‚”ÎłŃXŚł;ŽôÍ}!* #tlí`TăĐ×ɇ‚´h~:Űř]"—ű&IUY §v {ŹÍ×­} đĘÚ÷HđŁÉŻx’kt­"ŢůáăXř?Cß˝méţ,đöŁwö]?]Ňînç”7Hě~€kç˙Ź‘ŤxoÁ#Ëm¤ů~s)rŰ٤*7ŕ`ś{Ó~.|-Ň|ŕË-gFžé/a’4•šLď'ř‡÷N}(éKR±Ňŕęw¶Öp–Ú$¸•cR}2OZ­uâ-Ň{h.uk¦ąÁ‚7¸@ŇШĎ9öŻźţ$ëW> ýžü7¨_±{§şT‘ĎW($]ßS€k[á»MSKŃüW­j“_1IˇŤXlUC… “ÓÚ€=ş=oJ“Rm>=NÉŻÔm–u2‚:ŤąÍŽ·ĄiłÇŁ©ŮZM')óŞ3vŕÍ|óáĎů:˙úůź˙AĄýĄ?|83ȉx˙¶”ôEöݦé÷Á}¨Z[O7G4ĘŤ'8ůA<ţMĽSáőÔMkš`˝i€Ý&üúmÎsí^űUď:˙‡DlUĚ/´‚ńX˙~éľđ>Ź«ŘÍpÚ„ł"\ĽŹĺ¶@ěA­}'©ř—BŇ®VßSÖtŰ9ۤsܤljü—vŃYµÜ·ĄŞ®ó38×wL{×ĚW˙,ŕŁxľöćę}vH–éĄy YÂ…Á˙dŽ}k¸ř+§/‹ţ Ýhšśó i&’čß2(*Ăô4ě:fĄcŞÚ‹ť2ňŢňÜś `H¤ýGĆüXń>Ąá8´=B͢{ß$ŰÓ8Ť»Ű˝iü9đ]źt7Ól.'¸Y&3<“c%€: Uľ0č˙Űu«e]ŇG ť>©ó h×Äß·…Ľ©ęĐűLq„· 2 ŚBŻńśţźđwĹw~,đ™ąŐB®§o;ŰÜ*®Ü0éÇn yŐţ®|{¤ü2Đ÷y†ńÖâüz¬kç뵿1[zn ž ř§ă 9Ź—geý«xĐ|Ŕ}y?đč|âťOÄ?§s4šVukHé0É?ĂŔ÷®çĂ?Ľ?â}E¬4™®^çËi1%¬‘ŤŁĺ€čᤛD×n|AŞ‚±jłĹ—sPIč+Ńí.­ď!ZOńʆSřŠđ~ŇÎwbp?Zőř‚ÁĽ9®Ť3U´{č,guX.ČŚ#bČ"¨|Ô.őO†z%ćŁq-ÍÜ©!yemĚŘ•ŔÉú\çŤ~xfËŔ:‹i– k}efňÇu!*„śśó?ZÚř ˙$—Ă˙îK˙Łž€;Ö!T– É'µs)ń ‹xg\ţËŐm^ú I]D ÎŚpA®[ăĺőĐŃtmĘv€ëém,Šp|ľ¤îqUüuđ»ĂV^ÔI°KKë;V’;¨ÉJŻ;ŽyČÎ~´{—ÚÖ§đBĆňŰWŠßY–Ü‘}zŮP|Ň2ÄűqůWy¦Ěöú¤şĄÜJ°!šĺHXÝ¶Ś°=0z׋Ď˙& ?ëŐô¤Użčúž§đŰŔłŮYM©iÖQ[ͧÄŘ3Çĺ¦>¸Á˙ľłÚ€=rÇ\Ňu LvťŤĚřaťţ@Ő›ŰŰ[L×·0ŰÄ:ĽÎ3^[ŕ6řm­kVłhşt:vąhw-´ŃfCŹLá±íšĚ‹JâĆ/Câ Óé:¤6öeBä ±ůĎé@że«i×đĽÖ7ö—1 ËĽ3+ŞŹrfŢx®aYmĺIbnUŃ)ú\nˇá Ă~ń$Úť “ÜXĘ$ňó‚6?ťEđ;ţIn…˙\Źţ„hµ‚îŢâYc‚xĄ’¶EGˇô tŞwZöŹgsö{˝V ˙çś—­ůšó…‰,Ţ3ř©´ž\Ď}¶7ţë(đ5ÇřB ř~ 4_‰ţ’ŰWyźvŁt†H§Éŕů§ňďšú0ÜB-üó4b nó ¸őĎJ§e®éÓlµK ‰GđEpŽß5濼6÷ô{oZ›ÝÎá&–ĘŢOřřŕü‘ÇřT^†šŢŻgýźĄEĄëÖ¬-n#0ʬ?5wŠ5ořO_:­™ŃľČ1aÇś$ĎßőĹmj•Ž›“PĽ¶µŚđyUüIŻ6‡ţN2ăţŔ«˙ˇšĆđ^‰eńĆŢ,ŐüOۢÓďZÂŇÚRLqŞž¸ő8ě¶W–·Đ‰¬®a¸„ôx\:ţb›.ˇgL˛ÝŰŁ@”4€Áč[ž?ńé´Č~üeĐ`đţë}'^ŤăžÍOîĂŻńŰŞţµOţ›?ţĐž)·ŐCMa˝ĽĎm¸„•ĽÂjÓő]?R tëë[°˝|‰•ńůą^+â]NđgĹ_]xnÝlP™ína’)r?ĐWµAčhČ~ k÷Z§ÄŤ;¶^!ţĆÓEˇşşş‚UW-–7śůסxnŃ4˘^kSj1 Č/o%•<Ź›¦1ŢĽžóÁŢŹp鍤ڛ 4ź´<~V»üß^]ń^™oâ?Šú/' ‡tÝ8]›HتɵTű ő­?WÓu"ĂNÔ-.ĘýáĘřúŕŐ‰n`†X˘–hŇIsĺŁ0ń×˝x·ĹĎ iž ŇlĽUá8KżÓîcWç ,lŔĂż8ýi~4ŰË®ř“ὼÉj×Ď:´‘ś2«,%€?LŠőčuť.y'ŽJĘGKL©:“K đ>µr ˘¸…e·‘%‰†UŃ)ú^{â/hř{â‡Ń4č­Ą}*xŢQ’Îg©=j˙Á_ů%ľ˙Żs˙ˇµv][Ü4«ńJѲpJCŽ•V}oJ··[‰ő+( bUdyÔ)#¨śfĽßŕéηńô?ú W/đ'Ŕú?t-GRń¨żŮ}-˝ĽS1)Ś1*;XţTîŇj6QÚ ©/-ÖÔ˙Ëc*„˙ľłŠ[ ű=B6Âę ¨łŤđČ~bĽ+áďôËßř«GÔVK˝H¸ÍĄŚ®LHĎÎqߊÚđΗmá_ŹWZ^ІŰL˝ŇĚďl¤ě`řĚвU ígLÓÜ%ţŁglç˘Í:ˇ?™«őăZÍßĂ |A©I&›&·©Í!7 mo%ŔVč@#ĺ:@Ľo-…ˇşűD_f ¸ËĽmÇ®zW1ŕiľ(°’ŕMmm'Ú¤·Žťw8S€ŔućĽ˙ŕÍµŽ«á˙čłŰË.‰ëy·jADĆŕ¤vÁÔż<% Ýř`jw:]´š„:„Â9Ů~e ß.>”í5ZîţÎËoŰ.íí÷tód źĚŐšň˙čÖ^,—U×uŘVöIn^8RL•Ť@mNš’r“ŃT¨âÔbµfĘęw2|VŠÎ+·{ÓüÁľP¶zÖćś5řIµ/´jÓXm_&Ů1ćDp2[őüë†Đtx4OŚ/kgąmM“INŔq=łšÔđČ'â§‹@8&(°}>E®ŠŤ˝ßĺ]<Îzsw÷ż™őň;KťSOµ”Eu}k ‡ř$™TţDŐ¨äI9ć ¬ÓHIfoZĄ0ÇĆ{`: ,˙čFŁŮÂM¨7˘fžŇqIÉ-Z;™î!· g–8 »Éô¤ą¸‚Ö#%ĚŃĂęŇ0Qůšá>2Č/D˙°ś_ú T¬g˙„JÔď4ůµM Ţ6Y­˘äŁäüű{ńŹĘť: J-˝ďř uÜ\’[[ń;ë=BÎ÷?c»·¸Ç_*@˙ČÓnµ; IwwÖ°9č˛JŞOŕMrţ ˝ĽkďC WŠ…”u®T×e—ˇęşŚ;Ňd–[‹†xőC$n¤ńČűżçĄTpéÉ­témI•v˘žšőč{RÇ4aâut=NAüi&š(4Ň$jH» ô¬ď [ivşDIˇy`b] mrry®WăYeđhhÉ.c*AĆkSS¨ˇÝšÎŁ…7>ČěßR±Kźł˝í˛Ď˙<ĚŞňÎjĚ˛Ç m$®©Ś–c€?âćřsˇľ„öío›ÓMă121÷‰úÖ¦Ą>§đFúK·/4Q4%‰É!Xc&µTa;8>©}ćn´Łu5Ńż¸ôąu(eŽ)o-ŇI1±UłÓ<Óîď-lÓ}ĺĚ0'÷ĄpŁő®3ŔŢÓWHÓő+ř~שȋ1žRISŽôŠĘđÖ›oăřP×c1YÜť ‘śzńúš=Ś.őŇ;˙Ŕm;-5{Á=*Ú㠍ĖłE4gřŁpĂóŮ/-Ł2‰.!S@ÎŔ}}+ÎĄ˛ŹÂ?4ô€a°ŐUŁšŘ”0ÜăőŞÇD·×~/k_«IgşJńnÂČŔ(PŢ˝I¦°ńŢúZ˙Ť„ëËkk{~=6ÚúŇę#%­ÔF˝Z9řŠm¶ˇeu+Gkwo4‹÷–9ú€kËő˙ ŘŰ|AŇ´í<=¦ź¨BĆęXŞČçŹgÇźáÍOĂšŽ‰n¶S}ą!+ :’2ę?kŇRz­4üĹíć“mlő×ň=>Y(ËĘ꼖c€?‚ĎPł˝,,îíî őň¤ ŹČך|NÔ˘—ĆN“© —Ň3q<6ęYĄnpGó5“©^iVúĆ‘{á 3PłşIŐ'_ł2$‘4C ÍŢďîń\˛k˘űĎJÔîŢę?ďÁ"¸üÁŻÓtË_|M˙ ›­7C+mkfäěˇb;ňţ#Ň›â­&×áçÄŹ _řj?˛Zę÷BÂîŇ2|· TnǨݟ€=‹QŐ,4Ô ¨ßZÚ)čg•PĚŇCŞéóÚ=Ô7Ö˛[ ËJ’©@=Č8Żńµś7ÄëýgĆş αáëQ-®cS*ÚÔ˙>Ů®ĎÂÚ€µ_j’řfÖĘ{ ĐżhŤ3ڍ%ASĘă&€4ĽăÍ;Ĺšk\‰mí¤7RA 0Ţŕ+cŻ>•Óꕎ›}BňÚŐ§•PĚ׎~ĎĐîü%Żs¦[É©A}'—pËó®Ň6ăé\Ôç‡őŹx–˙Ćş~ŁŞ k¦łł‚+fš(‘ ńĐśPŃ–—V÷,Ö“Ĺ<-ŃâpĘPꮟ¦íţĐľµµÝ÷|ů•3ôÉŻřS}§Ĺ BĎĂvz•Ż…Ż-ĚŢEÔ Ĺ2’ąéßóö§ü*đöźńďÄ>(ńT ¨Ě÷ĎkSRPĎŁřPT5«©ľ8ŰXA~ňiRi-0…$ĚlۆŚűפׇřcĂ–ľýˇĎM –/ĄĽŃDX‘HĘ®z óř׸P—|/ń ňë~:ţŰÔɵłÔĚP›™p±.[žŕW¤ŮßÚ^ÁçŮÝAqüôŠ@ëůŠđ‡ÓXŽäÇă[)ĄZřăN‹cˇ)·ŇµŰyR{@IŤYŔ~ő bµş‚î-¤ńO8†¦›»av-MÄ?j+¸CĽoǮ޸Ż+řVăÂľ5ńGçm–Č˙Ú69éĺ7Ţé•ýiż aoxăĹ^5¸…ćűŽ{"cq†Ń˙}P¦x’î[jw–ä ­íĄ• •IʸźÜxßZĐíu;mGK :–X䀎„ŽHúW_ă?ůőĎúńź˙@5›đ·ţDţą·ţ†ŐŐˇEĘÉ»őô9¦śŞ¨ÝÚß©WĂ^,Ľ}u´ŮĄž¨|OĚsjÚa¨ÂX¸ż¶ţÍű?6śy»ň~oĄrź¶ŻŤĽĐ˙ÇŃťÁ#®Ü§_Ěţµe˙䳯ý‚Çţ„Őnš’犵Óv„)´ů$ďf—ŢvWšŤ•‘ňňÚÜž‚YU3ůšš ⸌Io,rĆz20aůŠňkŘl´oëřÓJšîÖîbö×Ű ‰}”ÓŹÂş[ËŤ+Bđ©áO%ae.ŤČp3řqĹD°é%k»Ű^…Ć»mßK_Ôë.5]>Úo*âţÖ)¸ó*·äMZ2Ć"ó ¨ŹÜOőÍp^đ&‹7‡­n5KE˝˝şŚM4Ň’XłsĹWńĄŞßx“Ă^Fh4–BňƇ• ôâ—±ź,^׾ťÚÍGšK{[ćw–şťŤä…-/m§qŐc•XŹŔžiâ„ šXă.v¨fqôµç~?𖙤řrM[Cl/ôň˛Ç$$ŤĂ Mń•Ű_ŰxéĆk¸ÝľĄiĆ„ggŁżŕ®Ľˇu%Ş·âězD˛$1´’ş˘(Éf8ń¦=ŐşBł<ń,MŤ®\9éX?äFÖëţb¸żî?4M‡ ţŤčqSJ‡´IßwaŐ­ěŰVŮ\ôó¨Y‹±jníĹÉé7źĂ9¦\ęš}¬˘+«ëXd?Á$ʧň&°ü;ŕý3M† ±—UŰ˝®ä%ś»Oë\ŹŹ˘Ü]ŮřďG]Ë;0Ô%S$rxů‡J¨Q„ŰĺmŰďdδánd•ţăŮc‘%@ńşşC)Č5UuKąű:ßZ›ŚăĘ®ďË9®ÇW–Ţřp‰á§Xín$G$-ś+eřř×1|ž˙„u­¬´ťQu$Ź1Ý}•Ăůś“őާ…ç\ÚÚöŰóLO+ĺŇöľ˙‘í”V®îŻĽ'¦Ď¨M$Ţ0IŚ‘řVírÎ<˛q}Ëš*K¨QE%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xďíáŤgÄÚfŹ…§ËzđĚí ŚŹ”÷"˝ŠŠů¨ŘüaÖ4 1§éŃŔ–¤Ť‘–ŤT.˛O sŚf˝[ŕ˙ĂŘü˘Ě’Ę·ťŮV¸•GĘÎÔ_a“ő&»ú(Á> x?Ä:ŽőëíSLšÖŢxdXer¸f2:Îńˇń;WŃn´=sÁ¶z‹H†5»0 Ëž7Ś6Đè {WŃ”P…ř3á>¤ż u˝Wt‚˙Q‘n"LäBÉ‚ąÇ©űćü)˙ gÁ:lš—ˇĄĹ°‘š'’1 ŚžĄ`1žy­}1Exďćúߍ~čŤw"ŮDUb‘ů×#€sřW Şi˙üS ZxWQŇDV0”Vť€S _»˝·Áŕvôíć:ŹĂg[Â6S+]Ş žĺĽý˘˝ĆŠóŻŠŻŤôťFĆoipęz{DËs‘†ůłÁŕÓßŐĺţđGŠĽMń?Oń§ Űř~ÖÚâ+‰%Řcnŕd’ÍŚĹ}+E|ýăßřźAřŢ/đ]ş_ \Ęöä†# ĄISĎzčĽ#­üFÖ|M`ş·†ě´ť!uìXfé–cßĐ­zýW„ę^ץýˇmuŘôÉ›HY‘ŤÎFĐxőĎZ÷j(Ę><|<Ľń…ĄŽŁ˘0ţհܢ2Ű|Ô<đ{0#Ź©Ż;×4ĎŠž;±±ĐuŤ*;[Kv]ó˛„@Ŕg;Ž+éş(Ĺľ)xţ?„š/†ü9k.ˇ5”č[fo•Ë7'»7ë^đ»O»Ňľč–:Ś-Üm’6ĆTäńĹu4PÎŢ?đ_‹ôŠ2xłÂVBý%“ĎPí¤Ś2şäučkĹ^řŤâťwO×ő˝(4Ď"'Ůŕ xÔĐ“É=IŻ©č ýˇ<%®řŹ]ĐgŃ4ŮŻ"•Ł#ĺůîkoăLJuoxN±Ń¬¤»»Žć7xĐŚ€<źR+Ő¨ -Ô|=ŞËű?&…”‡VEölŤŰ)#®;ËřmŁxŻÂß5k{M= ń–I-ˇ”+ťĽśŚă=Ĺ{5Äü#ąńU×…ÚOĆSQóŘGąÇ‚ÁxÎsřWi",‘˛Hˇ‘VˇťEx‡Áʇú݇|o«ÜęĐJ¶6bKm9Ü‚ÉÜ> ήţĐ> Őü@4{˙[É5ěfKIÄdäČĽ“žĂćđ*ö*(žO [ÉŕUđäź$ČZ’?‡ĺĆ>kĎ<'©xÓŔşL~żđ˝Ćłˇ)kyg*áŁÉ 0>źĘ˝’Šâ/ĺ׬~­^§Ex—…­üIđ÷X×íŁđĄĆłőŰÜA}o*‚Ŕ’@rzuüóZß ´_ŮřëĹ:×lŁŠMBŢ7FűŁ “óę2kŐč *ÔüUâMGNąÓu‡WSĎ"˛`ĘŹ=3“Î*Ť§ÂýBçŕ˛xjúxâŐVV»„ĘDű‰ źLřšö:(Ë4˙xŢŇĘ;=KŔ÷—Z”j§†tJGłŰ5ŁńĂšŻŚ< bŃEžżi4wŃCż*˛(9MÝř'ńĹzä:ÎąăŹřjëD‹Â3X^Ü@ĐĎu<Ëĺ(# ·’yë]gÁí.÷EřqŁiúĄ»Ű^B’ "|es#‘Ó؊쨠â÷…oΩö\ŤŮóĂc®:s]Ú—<1á? ŧřvMTÇgW‘G(I!eŤŔ<wô®ňŠń«Ť;[ń§ŽĽ=Ş ľ›)š{ˇQ,ĂŹę>ľµk^ŃüEá·Ţ(đΙýŻ§ę‘ŞŢYŁ„‘7.~™üMzÝĆčZ¦ŻâËZÓXđěú5¬˘iĺ Ň7 ~uĹx7Pń§4ü8ţ›QšŮ™-îáťD.¤äĎ#­{=ä_™`)ú׉|G­č×Z]÷Ă›©neŤŁÄ˛Ł@ Ý»®;ú×­Q@e Áâ_ü>Đě­´­ÜĆX]EÁZ%<Ť¤đqұ5‹sÇ~'đőĘxV] tűĄ¸šţĺĐHĘ:ĆňA÷Żh˘€<ö-Q&ÖM«˙f6”° Ž6—ÜNßZĆţÎń€|e­j.‘&µˇjň}˘H`uY`—ąç¨<˙‘Ď­Ń@S čľ ńWÄ[_x–Ăű&ĂNÇcdîBÇ«6>ąüő­hz•·ĆŻjóÚHšmݬ ç]•#ü*ôZ(Îţ#hš–§ăoŢXÚ<ÖÖ7¦K™Ť~^Oĺ^‰Eçsčš‹|s·Ö–ŃΖşOn8Ú$ÜçoŻqPüBđţµmâý/Ć>·KŰËXͽՓ0Sđ&‹¨é˙›˙*-+)~Gá˝?Zđż€î~ĎiÚ™‘¦ŽĐUňőç©|S’ęóáÍŁßB-îĺ’,c˘1ę+Ňk›ńö…qâ lí4L’fLăŐR¬ťU9w˝Č©FÔścÚÖ9űŤkĹăHm0x~FÔŚ~H˝YÄxÇ™ýqëSż…®tß…—:-˛}˘őá$Ş’ 5ŢŽ˘§ë [•%­Ëöż3oKŢ‚KmO‚t),p"˛žÄ•Ç _Â^&Ôď´­=ő-/R:HŁ`$ŠN¤óÔdźÎ˝ ŠŐqoK§ąR¤¤–¶hŕ´­3V×ücoŻkVgOµ±B¶¶ĚÁťŚnl}OéVôm.ö‰zŢŁ-»­”öČ‘Ęq†#nGčk˛˘©×núik PJÚë{ś†·¦^Oń Bż†kH!‘e”c OJoÄŤ.÷SŹEď1‚ţ9dŰŹ•GS]ŤŁY§ŘÔ—s‰ń¶‡©niľ#Đ&ľłS–ěqćˇĎúň?jžÇÄšíĺÝĽ?đ‹ÜŰŁ8Ë4Şr1Öşú(ö×ŠŚŁ{˛´ś˘ís…ńŤ–©gâÝ/_Ňě[PŽš F°{ŚÔ^4¶ÔüG˘hrÁĄĎ ɨ$˛@änD†O>â»ú*Ł]®WmPĄA>e}—â‹ynü;¨Űۡ’i eEI#ĄrŇřRăVřaaŁÎ>Í HĘř]{W{ED+J (ôw*tŁ6Űícłń7‰ííRÚ÷Âר™b•Drü^Ů«~6ŇuxFßĘ‚8µHdŽéa-s•Ďâk±˘«Ű%%(Ĺ&…ě[‹Ś¤ÚgśkZŹŠ5ýăKĂŇŮK,Efši^ś…ő'§ăZZöLJü¤ÇoĄ5Őô?,ÖĆ@¬,I¦zWkE7]8ň¨«^ýD¨5.g'{[ˇć#‹Vń‹XŰÇáą4÷Šu‘Ż.YA@:…Ç'5×ßęÍżŠ4ë]=&Ҥ‹3ÝîF玾÷9®‚ŠR­t—.Š˙ăFÍ»ęíř„Zeŕřˇ6¤`o°››ŚnÝŇłEžłá/ęwznśúž•¨żśŃÄŔIťĎ=AŻA˘…]őWV°ťŃë{ś“¦jú÷ڎ׵«OěűK8ĘZÚłrOVl}•wÔQQRŁ›],]:j őąçż ô]GKń'Ť.5 W‚ÝDÍníŚHśň*-kCÔ§řéáýj+IK·Ód†[Ť¨çÍŔ=˙~učôVf‡”jú6żáwţ&đćśÚľ›Ş˘‹Ë4p˛G ysÔqźÄűS-ôżxëÇZ6±®éOŁhş;yđ[Ěᥚ^ˇŽ:@ü˝ëÖ¨ ^ń_tÝbęĚř6ďRÓón-eR$ţ%=9¬ź…~Ôí|Aâ]sQÓSE¶Őv¬:z0bÎXă€ÄשQ@7𵞑’ÜLG|Ś Ł Ćyö®Błń7ĂMgY´ÓôµÍúäÝ[µ´ŠŻ á`}°? öj(Č<)ĄxŞóăń6˝ĄýŠÎ{Š8Ö@ţ@ČÚ¬ĽyŹ …aą/<Ę?‹ní’*ën>:x&Ł»ş‘AÁ•-ŘŻřšď|7ŻiŢ$ŇŁÔtkqhä€ŕČę=ëŽđ—ÂŹ iŢ´łÔ4k;۶‰MĹÄńîvr9ĂuQžĹt3éřkÁsŘx*Öî-âci Ůu-śŕ’r@%axăÄIáO ßër۵ĘZ&%mĄ·:Ż_řxw‰µż‹ţÓF·«ęVbŮYwŰ,p¶ĐO€ąÇăźzéüaâăŮĎQÖ$‰ažTŤ%Ť~čuťDZëřĐđçĹńxŰĂ‹«Chöehü·pçĺďuáß5ř´VÖÖĚÁO–ŚdU8.ěŕŕŔP¤Ţ|N·µř›Ž™+M#Ş}«ÍFSwÝÇőŻCŻ“´+­fďö„Ň_ÄÖńŰęép±Î±Ś+‡Ô`×¶|MoO¨ŮŰř¬áł’2ŇÜHŞZ7ˇ/‘‚Ťz-óχ>"xÓĂź-<7ăk‹{řî]z˘»řVV@3Ď ÖżĆ?‰ZׂĽy¦[ŮȲif–{cćO‚7‘Đt o¨îgŽÚÚYç`‘D…ÝŹ`IŻ.řO¨|AŐµű«ďÄmti­K[[ůH\˛ííżîîę{×EńuőÄđ=řđę[4­ 9ű°í;Š˙µ@Çí §µüéžÔ/mѰf$g ëîE{m»´°G#ĆŃł(bŤŐIŇľOřmâɵ _ĂOjşbÝ@52!fŹ'!w~îî®ÓĹ|]â/Üřcáੳ;ŁÎQYśˇĂ\Ş3@˙Ex'‚>&xŁHńĚ~ř‚‘É,Î#[€ŠŚŚßtü +)úf“âgĹ/řSâ„úm–Ë­=aŹËł1.ZGN>`7Ž3@ůEyŻÂIü{wu¨Üxě­äD6°ůq C“źş3ÓI­ďŠÚÍ÷‡ü«jzT˘ŰtS” ‚\‡#ˇ ˛Šů§JńÇĹOřYőČŽßO ..–÷Ü0ůŽ)^~<ŕw ľ$_x·ÂËj4Ö4ŘY̸YŇU¶ô#‘Ň€=nŠňŮóĆšďŚ-µ‡ńÚܵ»Ć#+G€AĎÝ=+?Âľ>ń ˙Ç+ß]^#éËp«’€€ŞJüŔg·­uvß­çř›/F™(š7)öŻ4m8MßwÖ˝ľNńö«aűBęrxzŮ.uW¸1[ŁýÝÍ?A“řWKeń'ÇńŶ™ăö†âŇé—vŘŃ|µcŤčČ@îhŃüyńBßÂ>,Óô9´Én^ńQ„Ë(P»śŻLsҬ|Eř—cŕ}WL±Ľ°»ş{Ѹ48ÂŤŘďÔűW’ţĐ_ňX<9˙\­˙ôsWSńďĆLJ|Eń ńĽŢńşĂ. 7®cURX Ř;p¤śsš§Ä˙/ÄťoĂş1‚ńšęK[8žN†ČśzśPŃŐOTŐ,t}JîXYÂ+ĘáAcŰžüůűMř‡ăĎ xţĂEńĚŃ]Átń«*5Ú®pčzž•Göž˝×›]Óěď錖B3–vŔźßśĆ€>šFWEd « ‚;ŠZň j~<đç†5Ť[ĆMoyekb˛ŮĹ@K] cÁxcĆMu=QˇSp«ŚÇ=(řJ4ĎřKO†Ě’.©ä} !B“Ô7CŢ™ăé>Óâ˝×&xˇ–AlBä¶ č>•Â|TŘżüâ5ůciŽťpßěżÝϰ%ŞŹĹM4xçâ.ťá}Çěöz|÷sü.ĘV3ř6ÓřP±Asö‘ÝDá ‘ŠýŠ‘*É🉴ßXĎwŁĽ’[Ă;[ł|ŇîÜÍ}*H{É4¤°óü…zŐăÚ¶§ń;Ăş)ń&ĄqŁÝZB˘kť28Jăţ ®@÷?Ťzʇµk}wC˛Ő,óä]D%PÝF{§JÉńg‹#đî±áű -vŐîÝ]\(Ś€9#ő®šĽsăýĺ͆łŕk«qsuô†(IŔvÂ?:w‰5ʉŇŰÄ:µÎŤ}a©¸±††4$•şçśrM{ …¨_ęZ‡„Łżđ˛ZµőĚ1Ín.óĺáđrŘôRMy߉uź>´ZÖő 'SÓ<ôŽćŢ+sŤXă*Ý{÷Í{ 纏‹5-/↏¦]´GAÖ-w[dT·~ÇţNřĄâ­OG˝đţŹáĂöľ«v#DŢ1÷›ŽsěhĐ(Ż2ńŠ|G«řÎ x(ŮÁ%”BKíBé7É誽3řţ”x_Ĺ^"ŇĽnžń±´ąžę>ĘúŐ6,€g*Ă׏AúЦŃEpšő§Ä+ÝZčhúžŤ¦é¨p^,’ r4ÝŃ\'Âżę^ MgOńP&ݤ\ýžv€a$8`;t5Ôx¦öm7Ă:˝ő±Q=µśÓFXdnT$d}EiŃ^/ŕýwâGŽ<=o©i—:N—‚›ĺ„»\¸<śrv®«á·ŚŻőë]jĂ\·ŠŰ^ŃßËąXł±ňÖúí4ßQ\GÂj)đ¤—úłF× w, Ć›FŐ#Stoęµíf‹ű>ÎÖ)b0Ű ä÷ë@~ńd~%ĽÖíâµ{sĄÝ›FfpŢaÄ8âşjůűŔ×*źĹľ5Ó|$,mÔžiď®Ô¸Lś*ŞŽüÎk´đ§‹d“zśúb˝GĂË©¦‹jşô–ňja~öęV2rq€}±@4Wń?Ć—ľ}3JĐ-#Ľ×µI<»häÎÄŮ€ę?úôĎ XüE·Ö-d×µŤ"ëNb|řb·Úč1ĆŇ ţŠâ•“­ř‡Ç~ş—Š.4íkD’UŠäŰĂĺ=ľă€GLŹ® ö +Í>+řëPđżü"÷,IwŁ3+Ĺ·&UÚĄBžŮÝZţ ·ńąÔďĹwÚwŘĺŹ+ek Lq€XŚś ÷ ŇŠČńn»máź_ëą0ÚÇżhęǢ¨ú’ă^mˇńCPĐG‰m®4x-Ú?´ÇĄ´$–Źż\‘î(Ř(Ż"Ö>&_ řcĹzjG•=×ŮőHdMĆ<ťą¶?\Šëţ(xŻţ?^ęö̆ä¨KmĂ »t8ď“řP]Eyn˝ă/iš†4+X-®|e¬FüĹŰf*=ď’}޵ßügŕm[KoÝiú®Ť¨N-ŚÖĐůoo!űľ™*őş+Ě>"řĎÄ7Ž4Möö×M©[ľŘćLđÄŽv’Eex‹Ä>=đ–—‰/4˝WGžá`ť-ŕ1´;»©ă°=s@˝wwof¨×SG Čâ5.ŘÜÇ ő5xźÇŻřHZđ˛YŢŮG§Ë¨GöT1’Âp8w=äŕZŢńOĽUŕÜßkwnٍËrŰĽq4qDŚż® zućú]źÄ•¸˛ş“^ĐŻěĄticŘ2FJ2ă"´ńN‡©§ÇqĽŚĘtŘŔĹl×›ř#ÇżÂCâťtD^‘Ýa@°ŘSŔ¬ťë⏉ô赫;ÍI´śyYIö)Űq žG¸ü(¸ń‹#ŃüU čŹhňľ¬Î«(p{Fyćşjń‹÷ş¦›ă\[ŰĂ{¬®ôX—+“2…ú…Üs×§ząâMoâ'‚¬S]×.´}GKY‘n­ „ŁD¬ŘĘ·^¤s@ĹEEi:ÝZCqvJ‹"çĐŚ× Ţ(Ôôď‹ĂÚ›Dt­B×ÎÓŘ&ÖŁćR{ô'čEwôWź|AńV©eâß řsĂ­˝Ôf/pŇ&˙.űÇ@Çđ¬ÝOĹ^(ń/Śu-ŔćĘÎŰLÂÝęHdůĎEQÓ±ězv S˘ĽĂ@ń_‰4OZř_ĆâÎŕߡ{-BŮ6 ꬽ3ř޵­Łx—P»ř­®č4_Ůöv±K †ÜŔg'˝w4WńĹ–âźŘií·ŐoZ 鸕:ßx×{@ć>-ńwoüm'„Ľ˘]ŰÄ%Ľ˝ą]Ë@ ë‚=z×Eŕ»OZKvž,Ô´ëř¶ŻŮŢŢ-·sťÝ:v ˛Šó=JßâGu{§ˇZ¬[ž;4·/˝G@Xç’= KĄřîóVř?{âh˘ŠßS·‚]éŤČ˛ˇ#€{=čŃčŻđÖ«ń'Ć^´ŐôË˝'JŁX ˝ĂŽr®·áGŠď;Ôît_jú•‰QsmnŇF]r2=EŐ.uŻhş•ńSuuj’ČQp7“@ÔWšxOǍ΋ă}CRD¸-äńÁI´˛ ČÔűÖ_‡/>#řŁC·×´ÍwAŠ˝,…ľĺQýÖnN}y _˘¸_řżPđ·‡ô¨Ł¶‚óÄş‹Çk +‘¸ă9Ú őük×5Ď>µ[ńÖ—Şčţb%ÜđůocŚ«qś9ţ´ě5 ×vđO 3MM1"$fÁrNz[;îí ą€ć)‘dCęČŻřŤФřĂá¸m5>ë3iŕÂĹb\ Ţ`ţ&>ÔîTWžx§Ĺzż|Ƹֺ®˝q?‘l–čcGfé‘×żŻŤ¨Ü|SŃ4™5Ű»˝ö8WÍ›LŽĄS© Ýrąüh×+ Ĺľ'˛đ˝˝śÚ„w2%ŐÂۧ‘ň»źj›Â:íż‰Ľ7a¬Y‚!şŹ~ŇrTçü+šř·â;ďXč˛iŢNëťF+y<ŘĂü¤óŹCď@ĺÁ|Lńťö…y¤čžµŠë_Ő\¬ 6vDŁ«°{ţGŇąÍo[řŕKxu]işÖŹć*ÝGo—$źĽ¤c?ŽhŃř…â»­2_ľ’Đ=ľ­©A Ť$ał•ĺ}Zˇń'Ćšţăť EĐ-­îŰRÂĹ(Çď2@bĂťŁ©€Đ¨Q^=Żëž?đ9˛Ő:ąđuÝíŐ¤–łE$—+·,±•7qOý“Ô kMŽMâ˙č˝rËĂz5–‹6‘i§[æ̬’[˘á\ź\Š_xwHđ弰hvŮC+ou3c ź~ .~8řŤzf;ˇÇýuZÇřSâ/‡µŘ§ó¦řŹÁ~ń%ÂO­iV×S Ú$a†Ç¦E|¤đxvßâƉ帟JK»uLIóxÜF@ă éÚ»źÚO‹ŢG•–Aî<Ú÷?řB<4?łń˘ŮŹěöÝkµ1呎ů­M¬xOBÖu+}CTÓ-îo`Ç•3ą0r1Ď­nV/ŤäOÖ˙ëĘoýÖŐEuoÝ´¶÷$†U(čz2‘‚(ÁżdŻůx“ţ»A˙ ˝rŢŐíţ|k×O‰°ZNgŚLľÜ:>$1Çsí_GřwĂ:7†ăť4-> $ś†DĚGLţf™â/ h~$ ý·¦[^2 +Hż2ţ#šůËWÔář‹ńßLźĂË$¶‘ĽCÍŘW),ä@ëÖ´ütŞ˙´ć<ŰcţŕŻ|đď…ôO#®‰¦ŰYďűÍüÍő=i—~Đ®őčő«ť2ŢMV2ĄnH;ĆŃßµnWńŰţIV˝˙\Ó˙F-wµÁütV…zę¨,LiŔţ5  řAń?CđżĂ­CJŐDżG–Hb,&ÜŁ `×µOű5é7w:o‹o6ň®-Ť´yčÎCĚ~uŃ|đNâ†ÖrëÚDÜLäRşgŇ˝źJÓl´‹ě´Ëh­mcű±Ä¸€>`ýźüs˘ř/űrÍ%ˇ›cF|—}Ěąp ŕň:ńIđS]kăójH¬‰t×2¨n lWĐ:źĂß jš‹_ßhv’Ý3ng+ŤÇÔÖŻYřKA˛ÖWV´Ň­aÔUv ŃpBíŰŹNśPÍşć˝máŻÚ:÷Uż m »ýéUÜULawcŰ4Ď‹~#˛ř‰ńD·đą’é%şIĺ˛ďf|ô R+éüáËŤJďPźG´–ňíJĎ+¦ă śýGá˙řoĂ׍wŁéÖ×$ć*ĺ€==(Âľ?®ß‹ľ\çŰŚ˙Űf«_´˙üŽ^˙®G˙F ÷=gÂZµ©A¨jş]˝Őěćpw(#úš]{š.mî5ť2 ÉíĆ"yĘ çŹĆ€<ö𶏱ń–¬‹Ú”GËą;OÔôý/ă/„µK˝2ÎÂććkëéR”ĆĚqó1qěMwZĆ“a¬Ů5ž«i ÝłuŽUČ˙ëVŹđďš=üwşv‰kÔgrI‚JźQž”Ő×ĹvzŤ¦üAÔ´Íwao®«ř٦řłML%Ú—ă§šŁkőOż5îľđ_‡|99źEŇm­g#i‘W-ŹLš»âi>#µŽŰ\°†ößĚD”d+`ŚŹŔšńŻŮ{Bw¶ŐüOx¤Ëw)‚n¤—oĚřň-#Ăú›ăťGEńýĹÝ„0»F·©?0<Á;Xr+ě­#L˛Ńôčl4»hí¬áGc ą$źÔ“Yľ#đ†âFWÖ´»ką`Hë†ę9 řg |;ŹÇÖCÂÚơ©[ŁÎąB" ’Ł?{¶kÁ@ÚsVČÎ.®ČýkŢ<9ŕĎxrf›EŇ­­fa´Č‹–ǦMIká-Ó^“Z¶ŇíăŐdfgąî%şž˝čÁ˙h_ů*Ţ˙výV˙kt»đÔĺO”Łv8Č*q^۬řOBÖő/µ]2Ţęî yRČW#Ť\×tM7_±6zĹś7–ĆŮ*äę= púOÄŻęŢ»U¸{Č,¬Kč>Î˙*p¤|ŔÉěkŔü{cŕ›(cÖĽâ9ŇěH Ůě‘^3ę¬@+Źňkéí#Ŕ~Ň »‡OŃíbŽí<©Ć ó9ÁĎjˇÂĎĹp&OÚn Hüł@χľ'E ü-ĐuŹ©®®ËD†8Áyv“ó:cšôÝT¶Öô‹MJÁ™­nŁĆX`ŕúŠ©Żř_E×ôřlum: ‹X1FW8ÇéĹiŘÚAcg ­śI Ľ*8Đ`( ăľ’Ú§ĂmI˘ĎłŰuACĎéźĘ°>Ď7‰uOřÂń É{$vŃŮQF@ükÖî­â»¶šŢć5’ Ç"7FR0Aü*®‰Łéú‚Ůi‘ZZ),"Ś`dő4óŤ-nlüsŞxŢ2-5ÝZÚőp>]§qqřť‡ţkŃżh})ĺđ›ÁŻm§]E,« "©#Óë^‹uáý*ë[¶Ö.,a“S¶]‘\0ůsŔüÍiKMG*+Ćăk+ ‚= ´đgĂÝSD[ßřJošÂX÷7ť«…cÁş{^§á;OŇĽ5§Ůh˛tŘâC—ßą çżZĂ“áčÜ7‡ěüÂw‚~™ĹuöđEmp[ƱĂ„DQ€ t€<żă †ń—ðĂ#űEřü¶~:É'ńýrOý•ÖjZ6ť©ÝY\ßÚG<öNd·wë¤~B¤Ő´Ű=_NšĂR·K›9€Dý?ă~4×ő='Ŕ?ě4űöŇíu8­`şżS yqŚŰ‚N}«›řÉŁxcDđ´ki®ßjšÍıějă*YŮs€8Ŕ'ąŻżđö“¨h±é7¶O§DЉ®UBŚ.=0+&Çáď„ěm.-­´;5Šŕm”Éaśă=q(™řŤÍuđöÇV°ń0ŃLWаë…wéĎáY/“Ç˙o4řŠĎĹ·÷şjj!.,gŠäۤś`©n„ú}ękąđ÷‚<§x˛ÂćËZžóY3Aş™°?/\Wsâ čţ#aÖôű{ÄO»ć.JýQTĽ;ଠřrčÜčÚMµ­Î6ůŞ lzdĐDÄ…%FHZđ?oé—ú׍üWyo4sş¶ź˙ŮŁ·Eő\ţľŐďµĘ_ü;đťţ¦Ú…Ţ…g%Ó6ör¸Üޤt4çżłŁYľ·ă¦ŇÚF±7Py-#fOŢŕ’y5ę><˙‘Ä_ö¸˙ŃMW4ÍMŇîn§Ó¬á¶–ëośŃ®7í.~€š§ă [Á!NťpőɨĎżg˙hçáÍĄŚ÷ö¶÷V&A,rȨŰKÝ‚y=}Ş/„˛ÂAăoëöY:mÓĄµĽŔ”¨l‘úßT˙…žđîżđĎĂ×ŢŹoqt±8óHlyŻÁÇZőM+MłŇlcłÓm˘¶µŚacŤpyOŔ-oM°đ®©§j¶Ö—–zŚćXç•c!N0ÜžťGáP|7Öí|AńżĹ÷Ú|‚[3oQH˝.‘ę2Ązłŕ kZ^ęZ-¤÷NrňÁc©¦ř{HŇď Öť§ŰŰ\–ń.ßtZň„^ ÓlS’lr=‰\ďYžž6Ńď5Ďř˛ň’ga˙Ůă¶UđÎyö˝'F´·ąġrËô'Ąy÷Ä«6˛˝řYe0ŕ»Xźż*±ü«Ů«?TŃtíVâĘ}BŇ;‰¬¤ómŮúĆŢŁňˇ@'Ç.çVřc¬ŰŘĆŇNŠ“l^K*8fđţÁx+Âľ×|+ex|G©BţJ­Ä/Şů~S†OAžžŐďČ_ü4đ}ýë]]h6m3ťĚB• }Ŕâ€3-üˇ]|-˝Đ<98şÓ®VG‚c(”3Ô0ăď ó ęłüAÔ<á»Őv&éµ%p~c mŚőČ ź©ŻˇôŰ ]2Ę+=>ííbHŁUKKđŢŹĄjWš†ť§Áo{xŧ•BNNhÇţ6iÖ‰ń7ÂúŽż-Őľ…4Om-ŐĽ†6…ţl|Ă ägŰ5­7Ăď´{źÝNTh]Y\;çĺÚ;źĄz®«¦ŮjÖOi©ÚĹul˙z9T05Îiź ü#¦^ĄÝ–‡iÄmąí>Ł&€9ź˘ŹŽŢ\d-ŚŘĎăKűH˙É:Oú˙ůšôKŤO¸ŐíµIí#}BŮ E9űȧ¨kz6ť®Ů M^Ň;»`âO.N›‡C@cńÎTµŹŔ÷— ˛Ú R3$‡˘ü˝Ďŕ*ď%·_…÷Zeß‚<@÷—WkhŹ0™dV<”ľľă­{5ç‰ô‹?ŮčEukÄ2CŤŰr€I;€ŔáOSYúĂ˙ hw‰w¦h¶ÜˇĘË·s)öĎJ©cá+“ńB˙Ĺ:Ŕđ‹Eµ±ŤX–Oďłd`Ăő4ÚWÍ_¤şđďŚüWáý5 v· 07»í~}Îďűęľ•¬»˙é:†«g©ŢŘC5ýźú‰Ř|Ńý(Č>#Ŕź u k¶(ĆŇŢŃô©öŹĽ<ł´źÇźř _đĆ–úoě÷¨I8˙IľµžňRG%ź'źĂęzö‡¦x‚ÄYë6q^Z‡ĺ†pSSK¦ŮËĄť6KxÚÄĹäqňěĆ6ý1@çÂ% đËĂAFŘŁ?Ąq˙ ăóâ‡ý†nż›×«iÖ6ÚmŚV0¬° Hă^ŠŁ [OĐôÍ9ŻÚĆÎ(ZţVščŻüµvÎXűśšńN¸Ő?eű«k5g›kČFK”1đ˝áçŤK¤°ČňČŽ§!†Ě‚äkSö‚˙’EŻŰżţ”G]„Ú—5Ţťs-”->ž6Ú>9„c_ĂŠźYŇěµ­6m?U¶K«9±ćD˙u°Á‡ęü(?˙Čż¦׬_ú®㮝:č^$Ó—:†r·KŽé‘¸n™öÍzL$ÇJ8Ô*¨čĽĎ⯎¬áÓµo i0\ßx†â?˛-´vîU|Ĺ1b6‘µ»Ďă@~Lľ2ńţżă@¬lăE°°Ţ1…Ŕ,Ď­CđëQ¶đÇÄŻčzÔÉi=őÂŢZ<ĚfL€ÇŚň8úúWyđ×ĂCÂ~ Ót¦ öăß9^†F徸<~{Ä~Ń ÄNWĚ^WčzŠĂľĐ<;ÂhÚe˝ŞÜ ˛íŢ={rhČ´» QđřŹĹž/Ô/®ĺ€Ęń D˘Ł‘Äk<ńŠo€?łnľW;quŚőí^ŁiđëÂVzż·Đ¬’ĺ[z¶Ü…> t­{éú=Ć•„)§\2ۨů\·ŢĎÖ€1ľ>řpŹô45Íü˙ŹźŘjOýWĄiÖ6ÚmŚV¬°(Hă^ŠŁ°¨4­OŇčé¶‘Ű›©Lólţ7=XűĐGÄËy.ľř‚(Fç6r| ˙Jç~ř·B·řWŁMuŞŮŔ¶v‚)ÖIUY+×)»–ÂPeÖFî8=óŽ=k×î¬í®¬ŢŇ楶uŘŃ:‚¤zbąH>x2 ˇqf$pČ$ôÎ(©ŇíˇłÓmm­I6đÄ©'$¨ý+Ëţ#ÝA§|bđ%Ýô©®Ë̲¨€Iŕuë ˇT*€v¬Ďř{JńµÖěaĽ…NĺYÝ> ö 6řůűÍ@׬ȺµŇ58ćźÉ`ŕ.G'ŕĆşxßĂđř÷SMJÖhg¶a $Š^FeŔPąÎyävç5ŃhŢŇ´m ézm”0Ř6íĐc*Ůëzć±­~xBÖü^A Y-ŔmŔěČÔĹSř#ĄÜi 4KkÄdŁĚQş¨wgňaX_´ü‚ü5˙ax?ťz° x§ĹMzÓĹšî‡á­ .®5]]>ÓţŽę„l1,@pNFxk┫áď‹> ń=řeŇ‘dł–\ecfWźOżźŔŐďŽ^$ŇßŔ7mĄÝ˝ĺö¨V h ‘dg$Ž@§ż¸ŻJÔ´űMRĘKMFŢ+›i9WršÁŃ<á}ô^iz-¤ ĺd ’żLô >řŤdúm‡Â›żÖ[jvp·ŐBü«GĆÚŔ€Ś˙˘Üźü‡-z>«ŁiÚ´–rjV‘Ü=śÂâÜżüłtaďE΋§\ë6š´ö‘ľŁh¬N~ôa¨'ó ö…˙’o7ý}Ű˙čÁ^‡a˙6˙őÍ•A¬é6݉łŐmcşµ,®c“¦AČ?ť]EŠŞ0Ş0  %ř…wŹń§ÁžŁ*A`bž™ÎY•€ÉíÉGöńF–ţ˛Ň-/mîon/"Ç ‡ŘŠrY±Óť gŻ>•ëkÖ_dÖ,ˇĽ·Îŕ’®p}GĄcY|<đťťśö¶úšĂ9S +’ŰX0çŻPá@Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ĽÇă=íŐž©ŕU´ąž›[†9DRĄ†U±Ô{ô×uŤä`¨Ł%ŕUl5; CŘ/mn¶?‘*ľß®ă´?ЬXiľűMŇŁŢFÚ‚EŚĂÁŔ8Ăsž‚»ß…öžţθÔ<¦µ”S‘ ĄătfŮśpßďíh¬(|S¦IâŮü7ćJš¬P‰ö„ć˘Óţ&řr˙CľŐ!–đCdTMZHK}Đ9Ď·ăŠí¨Ż"řcńnÓ[‚ ]`ÝRîńăGlĆ5Vl ,8ŕMzž­—¦Üß]oň-ă2>ĹÜvޏjŠÉŇ|C§jľŹ]´ź:kÂÓůŚ1…\îČíŚĘ«x7ĹşOŚ4ÇľŃ%y I mć!Fčh~Šćôßčş…Ž±{ Ă­¦•+Eu3ĆB«(ÉĆ:ăÚąČţ3xE®kč`vÚ·RÚ:Ĺź®2?*ôz+Äţ'Ňü3¦A¨jÓí&™!Iw Íś;py®Nďă/„-ŻZąĽ’}Ťw«4 ˙˝Ü{@ŤEpź|yi᯶Ąe7›syű GtcóŚŢťđďâťâ¨m,â7gR[T’v’Ů‘ `nÁ<Mw4VŤüKgáOĎ©_™6ڤklĺ¤ 8t<ś ă>üPłńŽ™a¨5Óës†ó[0‹#'ďté@ŁEq~+ř—áĎ ę?Ů÷“Ďq¨ [YÂetícôÎkOÁţ1Ń|]m,ş%×ŃK RHĎşźçŇ€:(® XřŻá­6ţćŃúţKVŰpÖVÍ*D{ĺşqíšďh®GÁźt?ÜË‹öÇňÔł<–ě‰ôÜxĎ=+7Zřąá]'QšÉçşş’Ű3ÚŰ´‰ô-ÓňÍzĘë9Ѭ||GÁą±tĚ- lĺŰ€29ëśc˝rź ľ([x‹NŇ´ýQî_^¸2‡e¶aĂ9_q÷ühŐh˘Ľ÷Tř˝á]>ö{o2ţĺ b“=˝Ł˛!$ÓÚ€= ŠÉÓ|¶8*U‘żşŔň l““Ŕ Šó˝Sㄬ/ĺµK‹»Ă m–[Kv’4#ŻÍĐţ­ëŹč1řIĽKٹҥ É•ę9#9é@5ŤÜ7ÖP]Ű8x&A"7Ş‘kCń¶‡¬éş–ŁivRĂO‘ŁžâeŘ€Ž¸'¨˙@-翼q}iĽŠ_b]Kjë p>cČä ëüIâM7Ă–6÷š¤Ĺ-ç™-ŃŐw ÍÓ§n:ĐĹçw|)ĺĚK{r–ĘÍ$đ[3E…88n˙QĹw>Ąk¬iVšŤ„žeĄÔK,MŚeHČČě}¨ĺç^-ń?†üGŕ˙A=íě6|‹oyqo ­¸p‡řą?Zë Ôtݶ÷×7žV›ş7ź9çf îIô  š+Ď4żŚÔ5(,ÖâîßĎ}ĎqlŃĹ!=0Ǧ}ń]<ľ(Ó"ńd’ISžĚz~8 A˘Ľęëă'­ŻŚ yrđ‡ňÚí-ť 8űŘä{€Euş˙‰4Í @:Őôçű8l"X†ü‡ )íČ  ŠdóEo Íq"E ł»Uäמß|dđ}Ąá„Ý]Mś=Ě6Ěń)˙{żášąńBöŰRřI­ŢXOŬÖ{ă–3•`Häíˇ–9âIa‘$‰Ćĺt9 =Aiőç~ńN™¤xcŔúEü’Ew©XĶçaŘĚp[ ?â+łńłeáíçTŐ$1Z[®ç`2zăw4ŁEUŇŻˇŐ4Ű[ë`â ÖTókm## ôŞř“N›Ĺ7GęPB.vˇNhfŠĹń‰´ßÜéjRH’j3ýžÜ"Ëń×Ó­gřĂÇş„î!µÔç–Ké—zZŰDe”Ż®AőĆhŞ˘ą_xóEńlóŰéfí.`PňCqnѲŚă9<~µCÄżĽ5áýNM>âk›«¸×Gg—Ę˙xôJîh¬Ż xMń.•ŁŁ\­Ĺ«’3‚ ‘Ô0ٱ  ´V^—®Ůjz…ýŤł?Úl_dĘčWÔzŽ*+é—#›CŠf:„)˝“o¸ĎŻ"ŻŮËUmö‘îlŃYwí”ýľŚîćúxĚŞŞ¤€Ł<“ۡ¬­kÇš“|örË4÷˙¬[hŚž_Ôô§S“˛B•XE]ł©¨íç†ć1%Ľ±Ë8ÜŚ~b¨éZ˝Ž·Ą}łLśM3‚=ÁkÍľxĂHĐ|mm{,Żre‘Ľ#.ŔnęqŔüjáBR‹˛Ő5§ŢD«Ć2Wz;ë÷·Efx^Óµű3sĄÜ QN×R ˛B"źŻkşš÷×ćAn„(…ĎeÉ.n[jkĎ^kčhQQ[ĎĹ´w8hd@ęÝŠ‘kŚń&·ˇkŢą–k»Čl"şXZhP†.ŕzŽG5P¦ćěLę(«ťĹGPÔ¬´Ť,Ţ_Ü,6±¨Ëż$úqÔźjŔŇľ hZ•üVi,đK1ÄFâ‹!ôühŤ)É9E]Ua”ž§[EeŰk¶7őÎŚŽâţŢ1+Ł.SŽAďÔTW%Ó-üG‡,Äj uPĽsž őâ—ł–Öóů´Ž÷ň6h¬ÍK\˛Óµ+ †´Ţ±XUW9ÇR}iÔ¸´“}JM=Q\—‚fŇ­t}^ăN»ş¸¶ŠîWť§*áA`¦1QĎńĂŃĂ ‘Íqpe]ű!„ł ˙kÓ§JŐĐ›“QMüŚ•h(§&‘ŘŃYş·aŻŘ‹˝26,íl‚OˇĄ.ż¬ÚhZ{^ęE·V Ě[ŕg«>IsrŰSNxňó_CFŠdr¤¬¨ŔĆ˸7luÍcéľ)Ňu "ăTŠăe„ Uć•J ŹLőˇBOTĘ+vmŃ\\ü;,ę†[˘cµg’XĎăŰńĐëšĺŽ‹ĄFöCö@ToŚnÎzcRŁR-'©*´$›OcNŠi‘D^gđíÝřVE—‰4ëßK­A$†Â5gf(CazńR˘Ţ©ä–Ť›4W%7Ä .m­âš{‰gŮ…†"Ű7tÜzĄu´ĺNPř•…‘źÂîGđĚŇ,2Ç#Fv¸V©ô>•%y_†üI¦x{ZńSjS2ĽşyqF…ݱčó5ÜxoĹZWĽĹÓ§o>.^TٍőÁíî+J¸yĂ[iÜÎťxĎKëŘܢąÍKĆš&›s}oyrÉ5™U‘6X°Č ëĹYÓ4ŃôŹł­Ě“=ĹÄbT·Š"ňm= żźĂ~*Ó|BóG`gB2ńÍ !ů~´Ý)¨ó[BUX9rßSvŠĺuźčzMô–rË<óĹţµmâ.#úž•µĄë6:®–5 ÄÖ¸$°Ž Ž űPéN+™­ŞÂO•=M +Źşř‹áű{KyÄóJg ËQp$ŽÜÖ›c%ÄżîÍźěm¦Ç"ĆĚv‚[Ó¦xŞöIą+í˘ÚQw;*+‘Ô>!hVwrŰ«Ý\´-¶F·€şˇô'ü+ ŃuKMgNŽűOv{y2˛9‚=jeJq\ŇVEƬ$í©zŠâ~(x´řoIňěť—R1’Şąä“ÓŰzi>!Ň5U…îㆠ™ĚM*y\ő<ĄB|ŞvŃ“íáĚá}QÔQ\ľŹŞiZ'í/–ââM2(ĆŮdR\‚qČŞ·_<9mrbk™Ýá§ŽhÔýG_Ă4{ ɵŘ{h$śšGeEršŻŹ´ :Q¸’劇?eŚČO ’8­íUłÖtřďté„ÖŇt`1ŹPAčjeJq\ÍhTjBO•=K´W!¨üDđýŤä¶ćiç1˛<—D>çü3]6™k©ŘĹya2Ím(ÜŽ˝˙ŔűQ*S‚Ľ•F¤$írÍź®ęöş%Ľľó|Á?v…ÎO°®q~$ř|Ëeݤ`‹şŮ†I˘4g5x«ŠUai;ť‘âéž¶Iµ;Ź/Ě8Ž5RÎçŘ ˇ řăEÖŻEśËŰ ¤W1Ëý;§Z)¸ó% :°RĺoS¦˘±µżiz%äÚťÇó#H¬Ęvázóý+&Ăâ&y¨–â•¶ĆóÂQöÁ˙’\Ę.ŔëS‹ĺm\ëčŞZĆ«eŁX=ćĄp°[§Vnr}“ě+Gńö‡ŞjŮÇ,đO/}˘‚CěĆŇś—2ZU!ĘާWEVe…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yOÇ/ů xţĂĐčB˝Z¸ß^ąń=µ¸†Ňőďd—U ŕcżĚüv˙‡ě5ţ„µëĆ|EđŤĎŠn|;-­Ä0Ť2ý.äóŞp1ߊěčĘ>3DÚ·áż۩Ο8¶Ľ#Ľ{ý ?ťGŞěńŹĆÝ.Í—Mđő¸˝“©™đPč'đ®ßâD6ř\MY‚Yý•Ë1ě@Ę‘ďśWű9čRŘx,ę×ŰÚóTq i9o)FÔëě3ôĹCđćŻţ0xňúý—ÖŹ0o1FAűľ™Ŕ˙&Ź‹VŃXüDđ©b«Ą5Ű[ČÉÁ–?—Ż®2:ŮńGµAâĂâjéÚ¬±ůWPÜGľ…2~˙ZŁĐ< «ÜřşřßU‚ţöŃ6Z[[FRsÔóÎÎxRËţN+Q÷Ň#ţu_ă´Š5źFOÎÚş°Ŕ®­Żx/VĽń]ź‰ü)©Ăc«Ă٤K„ÝŃä>żĘąýCᯊuýoHÖĽGŻÚOycw‹o E!H”î`Ľd± rhŘkĘä˙“ŽOűý «Ő+ĘßźÚ9qÎ4Aźoť¨~ÉPř†;ýŞ?ý«řÚE?<?:ŰLÄzČÖ†ąŕźŮxÎűÄ~ Őm-ĄÔVîÚň2Čĺ@†>•KIřoŻé>+×uŘoŻ`Ţ.G±J‹ ÉÎhń‡|Qáźę>,đ…˝®« Š.ě&;d@#{ă?Đ×OŕXx˛;ôŽĆm;Uµ!o-'P·?Ä=řúU-gMřąw>…­é2ił6číďmÉ0qĐÁ#ęjo‡ţ ĽĐµ_Y×uÔ5˝PŻź$QěŤUF¨úcň  ?٧ţIużý}M˙ˇW§ÝŰÇuk5ĽĂtRˇŤÇ¨#ĽËÁŢ ńgµcŁęútžkŻ;Éž"fD',ŞGr8Ď?…z•|Íi¬Ýh˙ Oă™tÉě/!´¸¶ß­&ďž6ÇËÇăůĐO‚5+/ü´ÔőČ^âMBC3BŞ Ď,¤¸2Ĺ…ŽIďű“^łŻčö6ŢżŇŇŢ!g‹Ć#Ú1€ś~I˙ĐŤv—ö±ßXÜZÍź.xÚ6ǡŻ;řá?řJk},ęúu׆ŕv(­„9;AéÔűĐOěé wV#ŐîÔ>­>©*M#( @ö嚤ş4ßÚ3L:r˙´4ůMâ§°¤†#×*µ~ďŔšö‡âMCWđ«ii˘ŢeÍŤěEâßÝ—Žçń=¸­xóK×ďĽGâ]Iu=zé<­ń¦ŘáŹű¨?ů}hşť ČŠŰY”€Ţ‡kÁ~řŞ/ÚëŢÔ´kűÝFŢúGg°„Lłn×ükŰ|CŞE˘hwÚśęϤ-3*ő âĽSŔ^ńĄîźsŻx{ÄPhvzÔÍz¶†1pFăĆY”óŚPĎ4­cÂźüQywnÖWłEw}¶y÷d¨ÇcÇOaX_ .|eeŕ[Hô/é—¶7ť®%˝UiÉ'%üą®»áÎżŻ]řŁÄ>ńuĹ®©-ŚjĆęÂW«č}=j¶›ŕ_xFK‹_ëÖ'E‘ËĹk¨D\ÁžŔŽżźá@üáÍwĂ~ń´:őśVQ\¤÷ĐG2Č©ş&Ü…­˙Ů÷ţI˙m˙ô˘JŢđ揬˙Â;}eâíR=Jęń¤ đÄ#Xăd ±@§Ěr}k—ř{áx>â -5}:ëĂĘî¨Đ‘8VÉÚAóž˝čѵ Čtű‹Ë§ŮooK#z(&ĽËJń—‰ç>MÔ/ ăŃů×—hŢ ńŹÚx—OŹD\Ć“‹rn2~ęöÎ;ţ´•đAśü%ńjHv]]ŤŠr«ű•ČŐĐţÎzuµ§Ă;+˘A5ŰČňľ9l1ôŔ>źÂľ×t3yÇۧťá”ç*ŻEßÇ^2q[_ |9?„üaŁ]Íó[ďÝ$YÚrÄńž{Đ!đŽ4¶ř‰ń&ÖŰÇy$j0a&®»â…ĹĹŻĂÝ~k2DëhűJőŕţ„ŐořRçCńw‹uyî!’fh¤‰;Ł;łţđé]]í¬7¶sZÝF˛Ű̆9ş2‘‚(Śř/§YZ|1ĐŤI‹›a,ÍŽ]Ű–ĎŻ9…qźt{{ŻüNđĚJŚň"¤cîŁ:¶ě~ź•ié~ń·…mćŇü%â+Ł33B/ŕ/-ľzŕü˝«­řsŕŘĽĄĎ\˝îˇw)žîéĆ ®ĄyŽă´?ćťrçűgF•ôµ_â;Ž##đ$Ŕj—Ä]o üĐ4XÇďnnc{ß›hyć źLŕgŃEv řPúźÄ¸őřď!ŹI’X®n¬Č9’XÁúwĎ>¦»źř^ËĹţąŇ5ɸd‘>ôn:0 5ńŻŹuż Ühŕ}9!ňŁŮ~źą |¬Ł=AÁŞt«ë_‚žҵÁ¶ő/-ŕ›xux®ŽĎĂßě,ÓN¶ń>“%´cdwS[/Až0O×5ąăźę&𮕦›řšňÖꉮ%R›3žŕśĐE§'†ż±Ł¶Ž;·0Ń@Jŕţ>őăţ ńDž řyâÝR“vˇáŮd†ĺ§qбĎĐ׺ ÚŠ=+ĘĽwđĄüMă›]^+Ř Ó¤hNˇlAĚţ[qŚqÓŽhźÔtĐ?fËä¸í—qĄÝÁ=KĽŠyü1Kń–[–đ/¬­âY’ęćÝ^m«)0Ś{kÔ>"xzoř3PŃlĺŠ nUU@v®ßJ©â[ř“Á6ÚôĆ9­ăŹĘą‹¬r Ŕa@Ťl<⯠M˘OŕÍ*Ţ ĺIň R*3č1řÔ~:´ľđŇ|6ń˘1{¦ËŤëÜv˛ŕň=ŚűÖüĹ(­–ÄxźHň”mmkşmľĽŚŹQř×Săź ÉâŹ\črÜŻŰ$Š=·.0<Ô ‡ă¦Híë@1âí6jŢ:ń=±b4O*ßOqČÝr?,˙Ŕë¦:¤~:ř‘ŕQ ßki§ŤVaÔ aA÷WwđóÁËᮇy"\Ë/×R.q#>sמ…`ü"řk?ďőK«ŰČnŢŕ­ü°ß»Śpső(ÓjľĄh—ú}ͤ„ŞODHęŻ>đŢĄ¬üFń…ü··/¤ZJ,m­Ě„ĆqĽ…霎ľć˝PŠiěn"µ›Čťă+¸ÎĆ#Źjń­&çĹ 4żěíOF‹[đµąr·v\KI.§Ż^˙÷Ő/Ç]VĂ[řAĄj:C°žú‹ ·1ŽŘ#ö­›ŻüMľÓgŇŻE°Ď°™Ez÷Š´™uźęšD2$s]Ú=ş»çj–R2}«Í>'č˛čłáŇ.eIeµń;Çś7ď—¦~´čŃ´Ĺđ†ś-á:|–H6Ś0(2Oç^3ŕÉäŮçĆěĚĐZÜĎöO‘°?Oă]5Ź„<~ž‡GÓŮ ŕ"˝[ĂIŃĽ!§i7Żże´Ky]~ëm\ĎjňOŮďĂp {_סw–Ć ^ĂMfč#ŢYŠű}ĐÖ€=Ę’R(Ô*"…P;^_ĄÉĂë>úTĚW©×žřĎÁZĹĎ‹mĽQá-N V8>Í,w1ďŠhó?ĎJÇřă"Źü>Śźťµ]Ŕ{™ţb­xßÂţ"±ńşxËÁâŇňčŰ k‹ž7¨îŤëůtďśV}ďĂoëšöŹ®xŹ_µ¸˝±şIĽQ…"$/,N95Ôx—NńĐץ»đÎł¦Ť>EQö;Ř Ř yçŻZ‹Áľ<‡Äj6w:LúWěáß5¤ë’F8ÚŘőĽĂŕ˝˙ŚađŐĹćá˝?T—2<÷“Ţ,rHŮäNxţµéţ đf©câ{ďřŁS†űWą[ŞŰG˛(هsXëŕ/xcWľźŔ:Íśmä†g°ľşFç©R;~_Ť/ÂxŹFń'‰Żu˝6 6ĎRdš;x'Y\Î0xŕ×SńZââ×áĎ&ł,&ŚS‚ŕźČš›Áv%łŽîOjÖú„ó2’ŢBr9Čëé[×Ö_ŮOiwËo:äFčĘF ?ŕŢťeiđËC[XŁŰqj˛Ěq÷Ýąlúó‘řWđŇ!a­üQŇě†Ý2Ţ@ТýÔfI7ůĘ´4żřßÂÖ˛é>ń‰Ń‹1‡íđšÜBňöÖ|?đUż„ôK‹G¸{ŰË×2Ţ\Č0es×đ  OŮçţIF•˙].?ôsŐ‡î˛|hř‚Črż@ę*=+Ŕľ7đ°»Óü'â=4ićib[Č7ÉăÎŢ1ý=†Mk|5ř{uŕí{YľąŐ?´ ZI:»7l'Ôđ Hłű‹µW…ôęłB˛2ä˘'Ó“^Č8é\Ă \řV e.®!śß_ÉvžX?*±ŕ÷®Â€<ňţhü;ńJKÉŹ—i©XłČŰŚs˙ލ®BĘ9ě"ŇĹq*O;ČŇK"ç O×Ř ÄŹÂZću'„ő;xě®\ČÖ—HYQŹ÷H˙?Z~Öš ÖŇ×˝´ôűĹ즹gŻ[Ú×××îŔZ6±¦ęzőΧc Ť˝ć%ŽĄŞÜç¨~Ú[Çá7ąDO>YÜ;cž8şŹŮëpÁruýBąĄ?"ĂÄŚc ă'ń®O@đo‰<3cĺčšĹˇ2üÓESřrá^›ăß Éâmlˇ™"ąŽU–9_8džÄÔ¶ŠßÁk ;+/ŮŚ.ŕpXç-ůśŃ Dc.»?KÜ'‡”¤×M×­¬sÖ&żńOíq0’×M±RŤŰ|9˙ľMz r|'7…¬n’îâ;‹‰Üéśs]}sb%+AÝ-Š’ŤäµzžeđűţDŹ˙×ĺßţŠZÔř3g łž8ÔKrň<ŤŽ[Ę?EsĂ>¸Ň|?­ióO É}<ŇŁ.pˇĐ(ň­hŇřĂZeÄ©,°o˦pw;7­mZ¬e(˝Úü™•RŚ˘ä¶OóG=đţ5·ńw‹ŕ…BB·(ÁGk®×ôŘő}ňÂP6ĎN{Çó¬Ďh3išţą¨K4oˇ"ş*ç*Ç5ŃV5§zśŃ}ż#jP´9d»ţg‘Űřžko…·v2ţÖµé{’pýó‘őľ2ŇŹáO č’[˝ÜkvAáăwę[ň©%Ńmőڞý•‹ZŰ„»şA÷DŔ`~=ÔšďĽYáűohňXÜłFr9SďFăˇËčk®UaNqkg«ů˙‘ÉR© 'şŃ|żĚ_éösř^úŇhcËaqÂŕqŹLWęMqđŃî gýŃ+ú]5džü]¨iăJÔ5ËA§IbůŇ'ˇ=+ˇÔĽ/gwá# DZaŽ6•#ˇ÷ćł„ăJÉĘţňf“„ŞÝĄm5euM)ÝŽa$źmµćľ˙’%¨× ŹäkQ|5âŰ­=4ťC]µfÁ’C羅űą>ÜgůÖ†Źá;‹Ýh qĎ,r˘ĘÚ7gďJ<”ănkęľíG.z’ż-´~„ź ôëk/éŻH˛\D%‘ńËĎ&şĘĚđÎť&‘áű >gY$¶…cf^„ŹJÓ®j˛ć›—™ŃJ<°KČóź‡V–íă/Ý2+\-ŮE$r«’x˙=©Ţ"Ž;?‹>žÔšęIÂńąFpOůíO‹ÁşŢť­jz¶Ť«A ÍÜěćc-!äß ç‘WĽ9áKřüBú÷‰/ŁĽÔByp¤K¶8—ŰőüĎZě”áĚęs_K[ĺc’0ź*‡/[ßçsAÓíîţ0řŽââ5‘­ăŚÇ¸g˘ ŐźŚ?˝µĐ­$$YÜ_˘ĎŽ2?ÄÖî‘áéě|e­k/4m ň˘¤c;—hźĘ®řł@¶ń&Ź%…Ó4dńĘźz7ţ_CQí˘ŞÂMč’ü‹ö2tĄµmţaâ=>Î ^ÚM bŐ`l.ŢŚ}+ĚäK›ŻZF¤r×ZlŢtlzíY¦+¤¸đß‹µ #đŇ[ÜČđf´›‚Tcîź ť;ćŻh>-ŹW‡RŚŘËa­ZBZ[yG<0{ŚÔşÍ—ŠĆ­-Ć‹©XýŠ@¸¶ş‹;8#žző¦ř_ĂW¶ZÍîł®^Çw¨Ü Ź&ŘŃaXąEÓ÷Úm-7żŁ6Q’ź¸šMëŰŐ?Ă[źÁáö—IĐěďRâWi.%ą îŮç ×CŕťXŇω¦Ő,ⲷĽlPĹ(uVĂnĆ>˘¤‹Âzî{rŢÔ­Ł°¸s!´şŚ˛ĆO÷Hí]‰a­&źzšîˇ ÝÄů ĺG±"ĆÖ•«)s8ÚĎÖ˙ägF“Ź*•î˝-ţg9đ_M¶Â¦őcSss4›ÜŽphN?ZôŠI8#Ç5…ŕ}oxv:âXĺ‘زg3ßë[Çppk—>z˛’}Nšä§µĐóK[ř î–ÖÂ=_CyZlÄvÍ'śŽ˙ŻÔWqá˝^Ë[Ň!˝ÓAX‘°®Ň¬ Ź\×6tߢInşĆ™,M'’ćôf·| §‡4D±YšwŢŇÉ)Üěy8íZÖq”nÚrňëęgEJ2˛O—ϧˇĚ|r˙‘ ×ÔÉ«­ń_ü‹:ŻýzÉ˙ š­ăo݉´ ´ö—ÉrÁă|d3íTtí3ÄshÚ…Ž»{e9–ÜĂ ‘!$YżN”Ł(şq×gůŘn2U%¦ëňąÉęňBa˙®)˙ˇ×[>™kođŢ{4…+§1Ŕ^­ĺ“ź®yŞ÷>ą—áÔ~‹•ŤSÍ ěáłő®ŠćÁĺđôşxu=©€1é’›sU:©ěţÓ‘0¤ÖëěĄůśĎÂ+8"đ“¤kşă{Hq÷ľb9ü`ř:i,üă˛ü¦ŢňäDřFŃŇ»Żhňč>˛Ón$Ie€0.™ÁËßëTĽ#á§Ńěő{{Ů"ž;űą'ÂgXžüSucÍ6Ýî×ć(Ň• ­k/Đ㼠7‰m|)i—áË ‹I”±•NKŇş?…ú.©˘Yj0ę¶él’Üy°Ä’P1řU; x›ĂĆ[o ęö­¦łŽČËłŘţ}«¬đ宩kbË®_%íŰąmńĆTvP1Ňťz©©rµgëqP¦ÓŹ2w^–4¦• …ĺ•‚F€ł1čŻ>Đ"—Ćž&mzńHѬXǧÄÝ$aÖB?Ďé]Źt]C_ĐŽź¦]ÇjdyĚůůĐňńďŹĘ˛ôÝ'ĆVÖö°_čim`~VtącÔ’“üüJĽŇšM>Uř˛ŁD—źYo:Úث۫r=X{äšoĆxb‹IÓ5đ—Đ^ƱH>ö$ŚţţµâŻ ÜjZ…ž­¤^ -bÔmY îIű¬=:ţužľŐőťZÎďĹş…´öömćEikTfőlÖ°©hÔrŮmýw2ś%Ë*vÝďýv(řÚÖ;˙^Ší!WfB8$`â®|g†6đL’â• 0Ż=«cZđü÷ţ-ŃuhćŤa±WŤťÍ»Ň¤ńŢ…7ü;6ťm,qHě¬LăíQ ±RĄ®‹üĘ•&ăSM˙Čăľ'Iwqâ/ ŰAmŢć2­ĽŻ±$qŽ ¤ńmŹŚŁ§|Qđ¶…lŃ‹ B9ZpS,J†#·A@ĺQ@Q@Q@Q@U}BV‚Âćhńľ8™×> @(®7á/ĽQŕ+ [UhÚîg”9ŤvŹ–FQÇР쨢Š(˘˛|GŻŘřzÚŢ}E%ĹÄvŃ„%ÜŕVµQEQY6ÚýŤÇ‰nô8™Ťő¬ q(ÇĘŽ>´­Epľ2ń6ŁĄ|@đ~‘hŃ‹=M¦“$íŰŚÝMwTQEQEQEaxç^ xSQÖ#¶Mi˙(ľŔÜ×}(vЧ˘Ţ6ŁŁX^É”÷6ńĚŃť…”gľ3W(˘Š(˘Š(˘Š(˘Š(˘Š(˘łô­Z×T–ö;Ff6s$$`n=zÖ…6švbM5tQE!…Q@Q@Q@Ž×š ńBÚ :IyşÝČLVĹ7 JáEă­RçFđ­ýý‘Qq ‚…†G,OĆś"ç%ÔR’Ś\źCzŠçďu-YtM2çL˛KˉĚ~r“´*‘ó0®€tć‰EÇpRL(˘ąoÝć‰kĄIbČâţ;y7.~F?Ęś ç%š„y™ÔŃEśu‹AŻŤsĂąŔÎ:úÖŤ6šÜI§°QE†QEQ\żÄjďCŇěç°dKw-ąw|­śŐBrQ]IśÔ"ä΢ŠE9P}«Çú­Î‰áýBĨą„&Âˑ˪ž>„ŃąÉEu ÉB.OˇĐQU4yŢëI˛¸—d°$Ť’ š©¬^jvúŽ›źb—łHVćBŘ1/b?Z[| ä’ą­EP¸Ő­`Ö-tÇfűUĘ4ă ×5~“Mn4ÓŘ(˘ŠC (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ +'ÄÚýʇtăw¨9 NÔŤFZFôąüQ⻸ĹĹ—…6ŰTMrŘzăV°Ł9®e·ž†S­ľWżŢw”VO†u;˝WO3ędşlęĺ 26ěă¸8Vµg(¸»3HÉI]QHaEPEEw#Ei4‰÷‘‡Ô çľk7z÷…áľÔáÝÔ”]ŁŕqV Ü\ú"\Ň’ŹVtÔQEAAEPEPErş·yyăis˛K%ÄŕŤË““ŢşŞąÁÁŮ˙W&SWAETQEW/y­^Eń ÇHFO±ÍhÓ0+ón޵ÔUĘ6żRc5+Ű QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yOÇ/ů xţĂĐčB˝ZĽŻă|núŻ€v#6Ývp3¸P?ńóñÍâ ]>Ł©ćűRŽÜĹöŹÝ Qş5ÇĘÝó^·áOĂá˝0Ů[^_]ˇrţeěŢkäöÎÁ|sŤßPđ6Äf۬ÄNqó-zµy_Š®®Ľ-ńDÔšćoěmm>Ĺ4M!1Ç0áHFŢž†ŹŠwWzĎŤ<-á6ęhňý˛őŕrŚ!^ŮŚň>¤V÷Ć-ĽAŕKříň/mÚíŘuśńďŚ×#đ:KŻëzÇŤµ8öK2GcěˇoDZ<ţ4—ę?>"ëZCę×Úw‡t@‘ĽVRyo<Ťž§đ=sŚ{ćmµ†<Đmmukë˙ ëNmÚ Ů|Ć‚AŚ=şŽžůíNžú_†źőÍKTłą“ĂşîÉŐĽFA«ž\źÓę;ŤNOŠ?đűh–wKáíCs5ěńÖY0ŞÓëÉ  ë;Ë“ńűP´7UŇŁqó°6ză¦j/Ťw·Všź‚VÖâhDş˛$‚7+˝rĽuťăó࿌0ř“Rµą}öŔZ˝Ä1—ň¤RzíŠćüâĎřM ł#g‡ŽĘ(7âEÜźü'ŁřoBŐnmßS»16Łw&ů Ś‘ą·`cŻ\pďÍr~!źDđ…„ZçĽww¨jöŇ!šÖâďÍKĄ' 6ŕzçśôŻ@říáŰÝFĎEÖ´ŰÔ¤Ńî„óYçEXm?{§#КŇÇ ć†1„‘Żź öEŃP¸oLíÇë@Ť^ GJłĽQ´\D˛ăÓ#5çÚýĺĘ|tđÝŞ\L¶ŇXĚĎrĎ$t5čö‹ÚÂ!CA¶0»B tÇlW”üQšo üDđĎ‹%ł¸¸Ň ŽKk¦7·ŹÇô  Ź÷—6^¶–Îâ[yŁ—‰Ęśr2;VGĆ˝FęÚăÂđ^ßęw†. ű«"CîÂí Ă äýyô®gâ˙ŤŁń®‰gká«Bm:Öö+‹»Ç€ĆťŞ<’KçđŻQńŹŤ4o +ŮÝIgyL«mçEÇXzţ€3ţxKDµżŹYđωő=BÇaV·{ß:"O¨Á† ř}ys?ÄżÍq4Ă4"$g%S)Řv®GÁ‰ĄŢ|\˛ľřue{m˘ůý¦ć'ŠÝ‰(PÝóŰň®§áÔnżţ"3#iˇÁ#ňP#đßĂšźŽâÖŽ·âZ-"ĎQšmígŘ]ó’Y9úôďŇ|9‡†~&ë^›SşÔ4µ¶K»StűŢ<ă#?źN8®üŤăđţş$FRu‹‚7 qňÓlăqűCę2mźŮŤŘ㯭axwM?|Yâ×ń«©G›zÖ–Ö6׉Ôń×ÖŹ‚8˙„·ÄŤ6©©_ čŰŰI%Ó4N¬¬ečH®KÄwúĎĹO\ę¶Zťě¤PÉ °!°ď0©lđ~•ęĽMŕű¨eĐĽ-iq¦O2˝ĄÔ[$qŔ/śťÝ»ć€:W’Řx\ą¶%fŽŇB¤uĎëXtË};ᎎđ*ů·hnfp9wf=~đ®×W°‹TŇ®ě.ÔÜÄŃ>=bĽ[Â(żřU xgĆZuëé°HĆËQ¶É#pxę3Ň€:ˇńF]FÚÎăMÖ-Ţâao5©E,N:šˇń˙TńÄ=;ŔúVˇ>›fmÍÝýĹ»m‘—ś =‡Žďjć~!řĎNńÖĄá{/ A¨ÝKm©Gq+}•ŐU:gÖş?p^řWâN™ă,çĽŇͱłżXsÄ9Ăă¸äß>ô‘ă-óáDV>#đö±Ş]X$ëő•ěţjĘ­Üp0}ë{âvŻŞjţ'đďü?&ž5Uk‹›¸¸u…A8¨Č§^LÖŹĽKĹ;{/ řBŢňX§ť$ĽĽ’Ž8#SßwS[tűýĹžńž•c-í®–Ťmw#.!`Wpđý0(Ćž˝řq¤/‰Ľ-Żjň˝śŠ×Vדů±Ď8<`ő§ń;_»Ő&đN•g¨OĄŘkďľâćŘáp¤ nÄî¬ßřć đÇ-/îď5UžY-Ú4·ŚX±?O§^ißRĎLđg†ôiÖ)Ń'‰$Ť1ö® }łď@ţ?đm݇<_á+/W־ϫ^-˝Í°ľbűK\Ł©ü«¦ńU˛Y|iř{m;$6łF­#nb0ä÷>őÎxSĹ|=®A{>ŹâKłű¸ďµHŚ‚ xŕî$uě+Şń3|ođŃđ&;וÁVÇ4…ăźÁâ‰w~Ö:­ćŁ ęđ3Ű­ăďxd^ ö:ôâłµMwÄźüE ZkWz~a†[–…ÎđˇF?»¸ž~ź·˘_Kńâ݆»§ŮÜĹáýX®'ڧť# őý9ëZţŤÇÇ?ąFm-đÄpx  ~8üaˇxbúňMCVľń]]Č$’0ÜłÓ€8ďUµß†z‡®uŤĹé×í"7 ,·;’RŁ, ăˇÁęO˝t?t ý[@°Ô4hMĆŁ¤]­âBżzEyGżCřV>-Řë¸Ó´-?SźÄ°›ułű+°Úrzq“@˝ń/Po‚vý€Xµ›ö[0T#—%Y€?î’lŠ/>ßiľźQµńN¸|G»Hň=Ćčdmą*TŽW¨äŐo|<Ő-ľéšMšyÚΛ"ß4qňY÷32/©żľőzçâýŽ«áŮlôí3S—Äw´BÄ[7Ë!9n›G'4…á{‰­żeË‰íĄ’’;‚Ż`|öčEz˙dyĽáůfvyO·fv9,Lk’O­y‡´KÍWöp›J†'űl±ÜŞĆx%„ĚqúSü)ńgNÓ|¦éR隬ž!ł¶KO°%«$ˇFˇÇÔzPż…şôö^ ńŽ«4×"ÂöęP$rÄ*vŚöâł<ŕ‹ďč±x—Ĺ^"Ö{âe‚ 9ü¸áLü  Ó'ÁÝóSřoâÝ'RŤ ˝»ąą·”7đ».äj/|Gµđ^†Ľcc¨Ůj:h1)Kré*ÁR?ý^ô[ă?„#˛Óü Ź«ę÷nŕ°&[’A‰2GĎ_@=+§ńv¨x#áλ'„ő bňúMŚ^ćo>H“ 9Ź´“í×µTř˝w.ąŕOřŹM±»{{kŘožŹ¬`ő+Ű˙Ż] ô+ź]k0jWVÖ®‰:%« w|gđh‰đ7†<1âkk[˝ĆşéŐÔ,“©ľÄ›ş¶PŚăŻ ţ5îJ6¨''&ľrńţ§á?Éi?€ôëďřKÚć7Šk[G‡oÍó‘âŹxqěšęűRĽ˛,€BŽXŚr ÝůPc_>h~µÔ>.x›M›Yו-íă”N—™ËÍ·‘_A׋j:ě>řϬj:ý˝ÚišĄśk ĚP™r‘qĎŻé@~1i·©ă/‡zfŤ{4Xšîśď‘GîÁb{śgšgÄ ^|=ĐWÄţńµ-ý¬Čg[ËŹ29Á8 ®őţµ·ăK”Ôţ%ü4ż´YÚ_>Eb„`ČíZż´4ź µ5ŤY›||(Éű€3>3xÂęÇNđţ™§ßŤ)ő§_>ôśxxÜAěyëí\//4_Ak®x/Ć÷Z•ü ¸˛¸»óVĺ Ă|¸^˙Ąv|?ysĄxOÄ6ZjęHµŐ‹FÍ…ĎĘG=çžŐ^|3¸Xc·đśrŢĘÁ~Ęş*o {·­XřÁŞk/«xţË·µşżwU9;FőQ–'źJÚ¶đä ´=kÄręÚ®­{›4źl›r;ŽF22p:š©ń."|{đçÉ„¬iu'Ę«€hăÚ»ŻčÇÄ>Ő´•`Źwnńٱň“íśPčˡř‹DţŘńGÄ+»o\*Ç ç—±ţŮŹäEwź 5 >$ü/ÔtÍrᤖ9_O–ęĽŇ5íş‘ý•e,­ŤŞŰ—#~ŐőŔçÚ€8oŤWZE—†¬Mîˇaá“ Pş˛âE@PHčůÍhřÂZ j6şß…ĽUŞßYǻ̷kß6) RuŔ#Îp+ ń׌ôź 5´őĄÔ¶wŠŔËż›ăř\{çĐ×–xxiZ‡Ĺ˝ű᥍嵀ý«"ÂđŰÁŔÚq϶:ă(č ňĎčź_¸şńOŤŻěŁ•TçĄú±$/$äóśwŻS9ÁÇľmđNĄáß ęšú|CŇ.nĽJ×®ë,öFŕȇBd 99ŕG4ÚüÖ$—Sń>‰±.±¦iň#YÝJűŘŁĆîřĹsż|;©xěkźŰ~!ŐˇŃ쵡†ŢÖ}…ßvIf9Č€×§}Ź‚˙j—Ç~4»şŇ¤Ň–é`–+W@…# íČŚdzÖżŔ8Ţ=ÄDe'Y¸##P/‡CPđÇÄýgÂjwz†”-RîÔÝ>÷Ź8ČĎçÓŽŻ]Ż-µŤ˙á˘/źclţČA»uőŻLľY^Ęám›lć6·ŁcůĐśt} űJęMoĹ·‘NěY! ôy5'ĂŤVćűÂzÄSݵٲ–X˘¸',é·*sß˝s Ôô L{}cGžo‰zÉićÉ#“Ŕ GĐü(¶ť´ĎĂwnmf–ńĂFF6e†kÓ«ZrRékmřm))TN=o}˙[á-Ä×> µ–ćY%É(,ěXźś÷5KCóµřÎĆ[»”„¤H†91eNJzĆđOŠ­Ľ%ŁË˘ëÖ×°^ŰLűUa-ćr0Gţť*ďĂI®îüeâ{ŰŰImäC"Ç Á ómĎľ1SR›‹«;iÓď[ ŠJś/Ż_ąîeü:đĄ˝ôúĽ’jśf×PhÔEq´89n95±«µç‹§¬˛D…Ś.ôĎăW77Qż/wđبŞiyűߎäö÷>×´™lďîî´{é…Ľđ\Éża?Änąü)Ţ2ţŇĽř—§iV…ĹśWVdJŃ7E‹čp¸Í3Uż˙„ű_Ň-tx':]”âććęXĘ)Ç;F{ńŹĆ´őcń“Jp§hÓÜgJm4çńr»ţ—I¦ŁđÝÁ±âM'Qđ†§ĄëĚ5 ł­Ôž`V8ůŔŕg©ü*Oř~çÂZTzî™­jrŢÁ*yżh›zČ ÁČôö­ďčÍ«xPŞ“Ť@ÓŠ“ă łřě"–>d|źâB¬›§~»ůꥪ[¦ŢZ%·MOAC.«6“ +,“Ĺ ŚíÇ*Xô?Ąyľˇq¦ř{VŇn<3â;›Ů$şHn-äąóCŁu< V—ÄH¶_ř^ďU·žç@…Ú#ŤKűx$~_‘¬żj:v®4”đÎŽc±¶˝‰ćş[QäśzäţXxY.©ßµľbŻ;·Ń«züŽŁĆ“Ď©x×Gđű^ĎeaśUß‹÷‡SĐ­îâ3Ä®d•-±ö€1ĆŢŕü©ž×ü#ĄęčÇSł˝ąÄBęý '=·dăµůŁIJ)ěô_¦ă*®2kuŻčlůó'Ĺč­DŇýśiŮňËťąĎ\zÖZÇ{ăĎęöňę7Vz6âłl27#$÷č~śV“ŁÂçŤöťżŮ¤gu¬«[çđ‹µźíKk†Ňu)|řn!BáNOó#đ_Éńr«}úüË“ţo‡™ßîĐíü1áčü?ńC{{uŚ ‹™wěöťńWţD[ýĹ˙ĐĹixkÄ–^"K‰4ô¸BÁKËŔÄúfłľ)«7€őP ’Qxý±\đćöńçŢččź/±—&Öf/Śî&¶đ—†MĽŇDZćŮXŁČÇN)~#Ë©řnÓIĽ’Ö[–x‹©ŕ0[Č‘QřĺĽ%ဪċ«l€:qWĽ^Ś|}áL:|µŃNË•˙Âw|Ëü?™‹ă MáMëÚVµŞ5լ҉ç޲†`§Śzžů«˙îV]ĂwRŠÚ…ĽŚO¬Mk|[V‡şŞ ,ÇĘŕ ˙Ëd¬?‰6ÂëÂ^ŃťîÝ]@ěPEąňJ[ÝţHU˘ˇĎíeů˛d˝şńö´ŃéóËmáŰ1,±9GąqŘČZôEP¨Fćş˝‹x^ŹXŇ sˇÝŠöÚ1ź,öp?Ďë^‘ŃÜAиx¤Pčákź•˘áđôýoćoB÷j_ŇŢG’?† »řŻyc&ˇ©…k3qć­Ć$É+ňîÇÝç§Ň·Ľc-í™Đ<+Ł^ÜC%ćQî™·J#^§>§×ÚŞx‚ů|5ńA5}F˙ł®lĽ4q– ŮqôýjÇŚĚ×Oá˙čĐKw ™f’%B˘nřëÇ?ťu^R”¶¶ťŻcžŃŚfŁ˝őďk”ĽKዯ i/­čƤ×6„<±ÜK˝%\ŕäcŢ˝Dľž‘g|«´\D˛mô$r+ĎĽWă|O˘É˘řjÚňćú÷¶čJ—#;‰ăŰŇ˝C±ţĚѬ¬·ň"XÉȚ¿7ł^ÓâżÎĆÔy}Łö ľW3ücc îťÝëi6Čű¤–)D[Ć>éc^} ͆…âí |7ŻÜ_Áwp-îmä¸óF€ß­h|GXíümŁŢëÖó\řy!*QPş,ą<‘ôŰůVn­e«xŹĂ2xIh4Ë}B ×"ŘD®Ĺ‡`+zj ú¦źkĂÖšsvѦ˝áŤ˙KŻřÖŰĂ6włYYÇÚ®ŢÚě3€üGç\÷Źü5/‡­ôłg©_\iŇŢIJAu'™µóĘqÇq[Ţ*yü3ăŰ5´Óé—ße¸h—qŹAÇŕ?ZĆńď‰ÓĶÚtZ-­Ü¶p^E$÷/E8UęyÍ:<éÓᶾżćMn[O›âľžźät/ŻćÔ4_iw/i&˘ÄË:}ĺŤzăŇążľ}ÂWw:v«¨Ë(·PÜĘ$WĆă»ĐüB†ęĂVĐĽGkm%ĚV’â8Ć[cż‡5‰ńĹöţ#đĄÝ†mypX,—4%V$V É=ň,?:ö|›uűúü¶~Wí9÷é÷tůîzO‡?ä^Ó?ëÖ/ýW3㋉ˇńW„ŁŠi$ąpę¬@aÔw®›Ă Ź逌kţ€+–ńâ3x·ÁĺT._$ś ĺŁüWóü™ŐWřKĺůŁ_đä7ímäżÔ‚ÝA$ĺÖ|4|ź•8_jô˝NM+OŽŇ)®&Hó‡ť÷ąúšáükuý…ăÝ[»‚gÓ„’D›¶Ó"»ŤS¶Ö,#˝±gh;K!RqěyŞ®ç*p}-řęEÔšëĂCŹÔ'ąĐ~'ZK$ň¶™«ÄbŘÎJ¤«Ž íůš_ÜO©řßCĐ­&–8ă?l»1±\ č§¸ýkCân–úŹ…ĺ–ß‹»p·pW“úf±ţ‰µ›˝[Ĺ©¶KÉ0ü(€?Ař¸´éűn©[çÓđü‰’|ţËŁwůuü2"ďÇ+Ő­çÔ.í4}5ü…ŠŐöą&‹ayŕŻišhżąĽŃµ@É\ľö‰Ć:Ä~t‘ŢźxżW}JŢs¤joçÇseÂ?p@˘;‰f1×Ó?Ť]f˝–÷×ôůW“Ú?kµ´ý~fN§®ę§Ă­?\ó$Ž÷N»ăË;w…8lëkKâ}ýćˇm¤éz$η7Š×9Ť%29¦ŻřsÂóÁđć}*ýqwv’I"˙uŰ?+źřEÖ§Ş>ˇ¨#ěŰDÓáÜ=3“ůV©ÁsN?ażÇoÄÉ©ľXKí%řořµŹKqđ’Ňć X_ÝěĂ)ů·ç xîBźÎˇńtZĄ¶»á+OÔ'·šX$ O f÷=qY6EĎü,X|>ѰŇí/źQ^>]¤óŔ®·Ĺ¨Çâ_„Ř)*\8ýÚrJ=TźŢ´˝8·.Ť/ÇSĆŢÓc×4Ť_S’â SÍK‰·¬ žr1^©Ť\t` qźUźŔ·a±ŢśžőŘÚ˙Ç´?îĺ\•dçN2–÷ˇ×J*%íeúž{â8×Rřą ŮÝa­­íŢuŤşĂţň®·Äšü:P<ö·wV*ĽEČÇ®+žř…ŁęRÓ|IˇEçßiů@:ÉÎqęy<{Ň[üOŃ ?éßÚÜ·$é‘Z8:‘ŠşJÍ©Şrš“łnéšşOڬ5MTÔm˘ťcÓŐšT•v¶UI#ô®WĂ>ąńŽ5ÍwVÔRK¦f‚iv$Kś {TźlŰVÓ~~YVÚĎŇ÷˙#CŔú˝í†Ą­čĹËݶľtSąË´^„÷ĆGçYžŃîĽwúÖ·©ßĂo$Ě–ÖÖ˛ěTU8ĎO_ĺZ>ÓîµmW^ńˇlö±ęKäA ĺăďďůVw„őĺđ<‰-îaXfw¶ž8‹¤¨Çŕ_äiř6î˙Hń^ˇá‹űąobŠ´ÚË)Ë„ČIď×ô¬Ď icĆżÚ×úΧ|$ŽéáŽg1¬ :p;ÖŹă[ń†Łâ‰­Ąµ˛hµ¨mgPA-ŹÂ¸—şŃ¦ń>»>Ąe¨\«ĎµJ?şdŢÁ&Ş1nRĺŇVW·~¤ĘVŚoŞ»µűt:?…ö†K=zękË˧¶’[hÝć-.ßO_z_k- |—QŤCKH#¦âřüNkÂŢ}˘]éÚ2Zhµ¬©µĆAůşśóď\÷†4Iµż’éŃ ·.îцă,Ż?cńĄ)s9{EeÍ»QĹ8ĄěÝß,ľý ¸!Ň®´a¨^xŇĺuçŹÎȹ£ă!văđŻDřw­ÍŻřRÖöëh˘ŽŚTă?ʏ­Ä>˛Óa´ń‡ă¶ÔíĐG*6ś¬\ŚŽţőčŢšÎçF‚}:Çě6Ňĺ–Žz•˝j1Mň٧ľŹOŔĽ*\×MmŞ×ń0ţ&kWş^—ikĄ?—¨Ü-´Rs=Çż5[Nřz–ł[]K®kŢ#«Čßhů_‘ޏ?Z“â–—{y¦Řę\Fk˝2ĺn–%,<ýÝ;âN‘zöĐ-˝úŢĚëČ9V''¦D9ý’ö^w.|žŐű_+Ľk¦Ř]Ü[Í«ř†çL´T+äGp!6sžzšćĽ} ‡ŹN“¤kjzEĹ©” eó<§ ?‡ëUu)tí/â>«să9n-ĺEűŹ –5^ă˙śÔú ŔÔ>(Y_Úioa¦˝“ÇnZ!šĺ°:r![F4Úz«y[ţĆSN˘kG;˙Ăţ;~'řĽž‚8ţ9\Ĺ¦Ł§x®öţ÷Ä~$šÂ”Çki ţ^ŐÄx9Íu>ŤŹÄĎîRŁ€ŽË\ÎŚtŻÝŢé~+Ń#’?9¤¶˝6b`č{g§]Ű{GmöÔR˝•öĽ·Ű} ď†ä’ęş®„×˙ÚVÖ’Úč¶ćd$pO|d~µ…đ÷E˝ńf“<šľ±¨­”´qE ŰK7RXśç¨Ĺvţ Ô´=Nką4(Z$ATĎöE„Iśđäă•đQ<%pJź¶ÉÁ쵟*ś’łÓő.0ćp‹wZţŕV»ŇĽ[¬řz{Ůď- ‰. iŰs('gńťĄXÝxűXŐŻ/ő+Ű}*Ňsmook&Ě‘É'ŹqůűVľŤ˙ k[b§i°ŚguZĹĐuuđ­«éšÝ˝ÂY\ܵյĚqVÜ#Ź ŁVܡń4żŕ†‰%?†ďţÍ'MşŇ>,ŮŮ\_O{Y»[É9Ë„$ü¤÷Áş?išeΠ“ë^#ą°·ŘڥЉIN:šŔŇő9µĎŠ–ZŠYÜÁ`lŢ;w™6™ęŘě2j’\éZGŤµŮ|ee$óK6ëId·3'—Ř(çÚ©ĆRš}Tzoą*QQkŁ—]¶4ľj"jz-Ž©.§¤‹qq’IĽˇA˙ŔżJˇ¤Xę~%ńo‰´é5[»m* Ći.C“’A=Šłŕ™ëâŤíęiŻai>žL´a2ĐŔéśÔřrŚľ+ń±e á‚G^d˘Łäć’ŢËď¸S\ü±{]ýÇaˇé‘hú\60K4ŃĹś<ÍąÎI<źĆŻ×%ăŻEá+ť)´ű›żí0˙Ë>śűőé]my­¶îĎE$•QE†QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyżÄmCĆWď}áß ř{\ jŇ\€Fď—dާ§Jë|áč<-áŤ?Gµ;–Ú0ńŤîyfüI5·E# ö4 ; ( €Ŕ†ÔE@ °Ą˘€ (˘€ hŤ–ˇŹSŽiÔPEP*Ş.BŹ@1C*ş•u b3KE"¨P€č-PPŢÁö›9ŕŃ™cdŢ˝W#5âž2řy¤É Ż—WŽ9]⼵»XÄ ž¬ ’?ʶĽáżę?gńźŠmm´ÇĆÚÚĆ<Ć˙°ă¦>ŘçÔh † ±˘ŠDEA„UQč)h˘€UPaT(ë€1KEŠŞąÚ däŕW—xçDńźńÇĆ™µZ}–[6”FńňNä'=séëë^ĄExĎ‹ăń·Äm5t6đÄ:ť,ÓÝ]Ý X üŞ9ţ~˘˝{M´K :ÖÎ"Z;x–%-Ô… ţUbŠ`ŚŠDEA„UQč)h Ľďáf…¨iZ·ŚdÔíŻu6řĉȯD˘€T(@t–Š(¤ ˇ‹ŹSŽM-RPĹ‚€Ç©Ç&–Š)6®íŰFî™Ç4´PMdG ş«Ó#8§Q@"" Â*¨ô´PR4LěE\őŔĆkřVÍĽo˙ <˛Í%ęÚ HăllŤrI#Śää÷ď]R:+Ś:†„f–Š(˘Š)«+TPÇ©“N˘€ (˘€ńŁ]鑜S¨˘€”2Ŕ{BŞ˘…PŔb–Š) ©`J‚GBGJZ(˘Š(˘Š(6®íŘ˝qKE…A Ą-PRA :dtĄ˘ŠP…Q@Q@=(€‚Š(Ďő=?ZŃf „ž •Ug©ŕó^“Ek Ľ±qjčĘtतť™Äx?BŐO‰µëŃÁkqu‰-amŰc–>Ľ í袦ĄGQÝ•N𦬄(¬A*  ´QPXRPŰ‚ŤŢ¸Ą˘€”0ĂG˝-PHʬ0ŔčE-ŔQEڎ†=éh ‘”67qÓ"–Š(˘ŠFUb7(89 -PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEOPŐ,4×¶MBňŢŮîdŔ%)‘ĎE\ő>ÔrŠĚń»¦řsJ—QÖn’ÚŇ2vä’z:“ě+/Áž8Ńü`×kŁ5É6ˇLžl%8lí#>»Oĺ@=Q@Q@Q@J][O‹U‹L–öÝ5“̎٤G^~`˝HŕţF®ĐEPEPEPEťa­éş†Ł}aey×–D ”üŃ“Ó4ŁEPEPEPEPE#°DgnŠ2kEń†Ť¬xfM~Ú䦕róL»6…ęH ‚ŠĄo«X\i ŞĂwiÍś.3„Ůëšĺü;ń7Ă~!Ö“LҦąšy7l!„o·®€;Z+…?|*Úúi÷s\ÜĽëlKÇćÚp㯥wTQEQEQEQEQEQEQXţń&ťâ/·f;żŘ®ÖmË·˝@ő­Š(˘Š(˘Š(¬{i×Ţ$Ô´+yęz#ÎĄ0pÁďÁ±@Q@Q@V=˙‰4ëéşÄŽ5 A]ŕP™ $äöŕآŠ(˘Š(˘Š(˘«jz…ž—e%ćĄu Ą¤xß4Î$’}ČŤMŃÜAĐ:ÉŠNCČ úP袊(˘Š(˘Š(˘›4© O,¬4RĚÄŕ9&€EUÓ5 MRÍ.ôůŇ{wÎ×^‡j›M;1&ž¨(˘ŠC (˘€ (˘€ (˘€ (˘€ +4kVg^:8vűp‹Î+·ŤżZҦâÖâM=‚ŠĚşÖě­µŰ="Wa{vŚń(^PIÉ˙€šÓˇĹ­Á4ö (˘ÂŠ( Š( Š( Š( Š( ŠÎŐ5Í/J*ş–ˇklĚ2Y±Ă­&™®é:ٔӵK—%#”üşŐrJÜÖĐžxŢ×ÔҢŠ*J (˘€ (˘€ +6-jÎ]v}!ľŰ bW]Ľ=9ükJ›‹[‰4ö (˘ÂŠ( Š+;UÖ¬ô»›/–KÉD0ás–>ľ”ŇrvBm%vhŃE†QEQYÚţ±iˇiŻ}¨3-ş¤Şääś)¤äě„ÚŠ»4h¤V ˇ‡B2)i (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+Ę~9Č[Ŕö˙BęŐĺ?żä-ŕűA˙ˇ Ŕý ďu‰µOŘb 4ń¨Ća‘®Srqű˛˝TsŚźZőĎ ]ę÷şg›ŻéIĄŢ* I–Q´t9RGá\ÇoůxţĂQčK^±@tž1’ŰâZxZúÍb†ćŰí—A˙Ö㪑؂ôőŁâڤđ»čö¶Vk}¨ę—Ko öŽxÜN=H¬Ž–3[éz_Šl›Ý ĺg8ęŃŻÓĄgxzę|c}bÝĽí'CłE·nĆiW$ţ‘řP÷‹> ÝÚxxoÂş,šÖ´±ůł Ž(ý¦?ÔŽŁ˝3Ă?ŻdńL~ń†ŠÚ.«:y–Ě%E0ô ;ńę ÉřjńÚ|_ńýĄá };Ĺ4;¸/8ö|^x®~ |?˛µ`Ú’^<Ä/,‘|ą'Đ~†€;ýk·aív˛¦m yţ,qůĄńÖöřIĽdLçTYJČ]Ę#ß?ĄtÚ·‡îî>2hzę[łY[éŇĂ$ŮW%¶Ź_ă5ŹŞ|T»‡Ĺzż†ô­mGV¶™c·Ž'Ŕ‘vĺťÉá@ăóŻTŻ$řu găOÄ Š"”7  gůPţĄă›ż x)5oi_dŐe”Ăťo*ČŇ9?( äöúńX˛üGń‡%Ą×ŚĽ&Ún‹s"Çö¨îC n›ÔGăŹéY´LSSÁR‹łcnş€ďfńnů\9ăDZ­ wᧉuý"[Sâ ÜŘLşť5pŘ ‘'¨ëH˛Ć’FÁ‘ŔeaĐ\¶ĄâĆłř…ĄxhZ«-íĽ“™÷r»sĆ? č4{?ěý&ÎĚËçy,^f1»ĹyŻŠařůá&”…Yl§D'»`ń@_Äź·Ľ?¤–«t^ć;}…¶ăvyĎáTüsăy´ ť#MŇ´·Ôő­S& q EUÉf?_Đ×5űIßC„4»Fuóî5(J&yÚˇ‰lzt®ŁĆž ´ńu®›'Űn4ýVĹwÚŢ[źž<śŽăţ4†5ď\ëieâ? ĄŤłŁ7Ű!şYqŘ€IÉü*?ę–7~;ńŤ­®“ĄŐ¤‘ îü×\‚ެO ř‡Ĺ>ńŇ„üa5®§ünÖwđŤ®vŚá×č?úćťđăţJŹÄoúíţ@ôżŠzßf»˛đż…^úúŇgŽwyÖ8cPÄ/ĚŘËŹç]Ă˙Ďâ_RĐő˝)ôťsOĄ€¸ue8äő˝sXżłÜHš]@ŢúÍĆă델Ą±ý˘ő,qť"2}ů  w><Öő_jşg‚´µŇä0ÜÝ\Ü“ĚQGsÁź|yŻxŻZ»´»Đ ±‚ĆC ă›^'ÁŔŰÜ:ô®OA›_đ÷Ä_éž ‚ËTµ’ŕ]\-äžO‘+ä•?0ô®÷ᇄďü>ş¶Ł®\A6±«Ďö‹oź-1ś*ç®2hąbB’O§­yu獼t¶×öţtÓŕÜÄOv˘fQÔ„ëۦ>™®ŰĆÚçü#^ÔőžÖ‘Xún=}˛kĎ4¸ě TýkŐoŻ,ÂÝË$GNű;6FÓĎđŻđü›6ą˙^÷ú h|@Öoźŕś ˇč •w` ĎÂŞÚ&GĘňŮö«±ă /‡+ ‰-ˇÓÂŰĘ—ń ®Î\Śç§8ëI¬ÉłŻýSůŠîtďů%Đ˙Ř'˙iPžţΗZÔ^±¶ţ†=F–FÔ…ÂngÉę™ÝÔc8í[-ń_Öď/Źü.u]6ÎCÝËp± Xu ýi> $Ňü†;lůď ŇÇŹď|~µÇüđţżŞř.&Ń|lúdqJé%’Ř,†&Ď9%ÁçŻJőOřćŰÄŢľÔa·{{Űëwe!ů˘‘A8'ĐăţÇhßµ˙XDŢđ›ßÜ &ěĽâ8˘mÄ Än%@?Ťkx_Ŕ“řBÓĹ÷·zŮŐnuH ĘM°‡k*ąĎ sťŢÔßŮŇăř[bč 4łÎÎGsćü€  ?xîműNŃt­*MWÄwÉ˝m#p«Ç,Ězż–r*ź‡~ j#Ĺ0x{Ćšö-ýÚ´‘&Ĺ6?„žËŠă‘×űeŕqĐGŹüGâ¨~/x~ÎĂF.°,íioöĹQx ŕ»s…ĆŢZőĎ ]jwšDSkşré×ěX=şĘ˛…đw/#ĽëĆ„'Çß k0úáëÖh“ř‰ăkOé°K-Ľ·—×RyV¶ýé[úβ|7âo^kpë^ [>á7 vŚb', “ŰZĂřź,V<y¨°M=ZTŢç ˛…Éú•Ż^$“@7‰Ő-ÂĆf#©E$gđĎô¬Ź‡QO7„>%Ĺiź´=őęÇŽ»Š¶*‡Â/x‡Vđ5ŚÚ'ŽžÂÝ7#Z%‚ż’Ů9ďߥz6‹ńÓZđˇâ(g°ŠCqg!ĂE*.Jý}ţ˘ąť#â_ŠeŹ$Ç­:ŰŔŇř3Ŕľ;yő“ŞM¨ŰK4ŤöqĆůŕ3uÝíŇşŃ$_ Ľ<ct,ÇÜ—bh÷ĂĎĂâýâń­žĆęŇV‚îŢCţ©×“ĎĄrĐ|IńżyzŢ đŁjz]¤¦&şšáaóXuŘ ×¶qšŁŕävřŁżÉęc5·ű=Mm'ÂÝ6+r˘XTť;¬žc sźµŻřH>.xĎQ6“ŮI%˝şIo8ĂÄč2źˇS]n»â_¦±wi x8ÜŰ[ś «‹´Ťeă?($\ďĂű›Yľ8|AšÍ•áB NAeP˙ Mđ~Ąăö—Íľż¤yÍ6đZ¬˛˝ŮŚóŠěľřŃ|[¦_É5”–Žź1‚ęŐÎJ0CĎäkŤŃţ,ë^%¶ňĽ+áWżÔcfűH3†…Ű’qš­đ#?ŰßÁ˝kň.Łä€ §÷ż6Ö—ěŐ qřöEPMJmÍÜŕ(ę:l—éÖ˛_B°]ĽJÓD­Ž@Ü ÷ÁČ©Ą,±»"ďp śdúfˇšöÖ ­ćą†;‰ŐĆÎ?Đu5b€<EńWŤćřĄâołxt\ÜĹ Q5_˘­˛!‰ÚIÎxő«uŮ4?‰ľŐŻ,f’ĺ-&ÝgĆWBˇďó0­o0};IşB.bąYLDôÜ?ŇşĎřÎ×ÂZU˝Á‚KŰËÉ6v°ýéśú{{Öí řex{‹›r?ďę×'ń‚ ™Ł4Őx_Äţ ąŽţűĹzčZL0yńĘó«»á”Ž=@®n/‰^)Ôě%ÖtÉsářËšK…IeEęĘť{vń®§ăSÍđĎÄ lÉöbp˝Hgô®áKŞx+GąŃţ Ľ6FŮ M9ÉŔÁBwňAâ€:/ŢEń/ŕĺüžŤç{ČÓlÖD‘Xˇí‘ŠźÄž-›ÁöĐôý.MK\˝…a‚Ř8EA,Çüőć´>ř3ţ} m4j_Úçi|Ď'ĘÚHcqô©<}ŕ«/­›=ÜöĄ‘2Z^[¶"qž;ŽřĐO kţ2¸Öâ˛ń…#˛µ‘Xý® µ‘ˇ“íÚ»Šň}Ä*đżŤ´Ď xľ{]VŰQWűüCl™^Î?Ď^¦˝]ŽźAšá5ďřĆ=fęĎĂţ7vÖäµÜ]$I/ůA źJąđăĆŁĹÖÚ„w62iÚ®ť7‘wjí»a9ÁĐáż*ăĽ)©xĂâ2^j–zô:Ťí 0Cj%•‚ž¬ĚFůĹVř |qń Zýµ[ş )_›Šł üV×|Q ±x_Âmy{Ś· ÷ 1Śüż3c$óĹu_Ľq7ő OIŐô·Ňµ˝;kvpŕ©čĘGůé\×ěŃŻ‚őIŰTę¦?™«Z´qĆt¨‰˙ľ–€=J«jޱi—rI•fFčŔ)ŕýjÍgjÓE>…¨´¤Š •IF´ńĹTUÚž†„őÍ:Ĺ«hôëŃÜĹČ\1z’ťfÚxżÄÚ”+{ĄřU¤Ó›”i.]‡¨˙C\ÄÉ#ü€Ć U3ýß4˙\W«řzh'Ь$´e0nmWeXĆź4­y­oĐăĄ)TĺŤí˘zXÂńŠ®ěőK=#JÓ î­<>{Dd‘/»˝ĺVü;Şk×W˛[ëz ±UMË2N秨ĽUáXő»ČoěďfÓőktŰÄ\üĽś0î95ťámsY·ń4žńŮç¸X<řn ăzç0őüŞ9a*~âWK]ďňč_4ăSßnĎm­ţgY¬Ü]Zé—iöżkşEĘCĽ&î}O óφşĎî,€ţĘ6’]Čeş{•2yIÉĹzeÇú‰?Ý?ʸŻÄ L[ÉśÔÓiQ•Őő_¨ę&ęĆÎÚ?б®řşę=uô_鍩ę(i‰p‘ŞĞôľńt÷çö.ż§7Sd/Ţ%“´ŽřÉü++ááŢ6ń…µŃíîĽÔ ÔĆKŹlŁĆĺn>"řJ R ÔR™$ŰÔGÔçđµöpćöVé{üŻ÷űIňűKőµľvűĎD®_[Ö|A©%¦ŤáăujÚeťcFČÎ}:WQ^uŁę^!ń•öŁ%†Ą‘¦ÚÎ`UX’ąÎO…Ţňv˛ďĐŢ´­h«Ýö·ęořCÄď­Í}g}dÖ•“šۇ=5™?ڵ;ýVîĎÂÚ)Ô#´m“O$«nîO5•ŕxţ x¦'ľků(Ń® €XĎŽ:~ˇđm‘t čʵĹy śwÎzšŢtáMĘI^ÖÓ[křśđ©9ňĹ»oۧŕexcU“WřŻ4×rŮ\ÇcĺK„¬cÜr9®Vń}ëkóčţŇŽĄul¸‘¤ gÓ'˝fXËż"¤­YţđúbźđĽ¤Z÷‹­ćŔĽţĐw`x%w6ÓüjęF?ięM7/=äő2"ŐîµO‹~MGN“O˝·†d’&`Ŕć9*GQ^±!eŤŠ.ćąĆOĄyÖ·$/ń«Ă©S"[Ę$ÇcĺÉŚţčő†%§ČҶź«7Ă&ąÓw×ôG“éz÷Š$ńĆąäčÂy‘#Fµkµ €1śsž=k­ń/‹Gţϲ‡O’ó[ĽPRŇ6)Ç9oAĎĺY~ |Rńj“óăţ´ÉŮm~4B÷d*\ić;rÝ7ç=đ m5OXíő×CąFKy[ÓRÄ>3Ô´íNŇ×Ĺz/ötWm˛+ĺ oFÁ8üëş® ă,‘ Am‘öąîŁ/ńn’Óů×sj¬¶Đ«ýŕ€®+žŞ‹„f•ŻŔč¤ä§(7{XäüSă6еë}54ůo%¸„´Ků™ó€żNĽŐ&ń¦ŻĄjqř›Aű ĄÜ‚$ž9Ö@¬zgŃ«"żĹý°­śŚ=Ź#úÓľ1˙Í™î5H˙Ç«hFťá‰nc9T´ćĄł6ĽaâxĽ; ˛-Ľ—w÷o˛ŢÚ3Ëžçč2?:“ƚľŹ=»x«Bű Śî\E2Č#'űŔPř ‹o‰ţą» ZĽ č$ÉýyZĐřÁ4řů&+ćJȱÔ¶ŕxüĄN÷ ă~nż;ičśýů)[—§Ęúú—ÖżëÝ©Ć4â śowúŘ%)ÉÍ©ZËô7­.#»µ†âş)P:źPFEcřßYmÂ÷ú„ct± XÇűlBŹČśţ‘§ÚkW~ đđе(l]m"2b߸lŞ^-ŃuŰŹ‡Ú­ľ§{ˇzĄgŚĹĎ•H$`u8˛…(Ş‹™«_o™¤ęÉÁň§{oň$đo‚´ó¦Ĺ©k°®ˇ©Ý¨šI.>`»ąŔŠč¬|3ˇŮji}caoŇ©PŃŚp}şUo ę~$𫸩\†€C2Łaô®BëC·đďÄ/ C§Ďvc¸ó ‹,Ěŕŕq×ëZ>z“”e&žşzą)Ć2ŚSZkętŢ$ńlÖZÄz6‰§>§Ş˛yŚÂ$kţŃ?ýj‡HńŤÚë°čţ%ŇΙyp3¬ăúdt5GĂL¶˙ĽMÉyăŤá-üI´túJŹâ‹$úď…-` ß}´:…ę©ĆOÓü)ŞpćTíş˝ţW©>WRű;[çcsĹ~,:NˇmĄé–O¨ę÷ ˝`F }Xöč*ĄcăBÓYµÓĽS¤f˝ŮŰÉ(’6nĘHÎjˇfV×ă]˙ÚČćĹ~Ě[ż ?ď–§|c+5†‘g nšő<>đ÷ýE§ Ć›[«ßúě©;JĄö{]Íżřžm?W´Ň4›żŐ.¸BáwcX©ăÇâ84K­ Ů/e_1qs…dç$ýŐŽMΛăíűDhĺŐnch ¬Ü#Ć$îĎ?JŃŇ4-cQńt> ńŮmͬF+{kw/Śç–oÄÓŚ)Ć RKUç{˙śŞJn)˝ţV!Ňó˙ ‡WĎ_°Ĺü–®jŢ-ľ}r}'ĂZQÔ®m†n$iGţîOz©¦ÉcÖ?ëĆ?äµÍřCLŐnüCâh,őöÓ.VůÚHľÎ$2Ç Ë*ą#/z]"»ţ„óÉ{±ë'Űő;ż x ëWz~ˇfÖ˝Ż2Ű3nĘ˙yOqĎę+¦bIb’kŚđ˙îôď¶µ¨k‡Pąh %M¸Ś‘Ć9 zcŇşO$’hZŠ@ •­¤\í8®ZŞk‘č˙®§U'5}kýv8őńľ««ÝÜ/„ôż´Ę5̲¬jäw$źJčżµµ8ü3ýˇ.‹)ÔFŘcÎěuý~•‰đjh$đ-¤qób’A0ĹÉü«?ş|ŇüŘîC=7MČmoÁät:ŠúW?ń3NŐl<0$ŐüD׍$ȸcV9ĎçŠÝń˙ü…<˙_ń˙JÖ0Šqśm­öżo3)NMJ2ľ–ŢÝüŤĎx hrÚYÚZIŞ]śAl‡Ţ'°¬Ý?Ć…¶·k¦řŁHţÍ{Ľ‹y’Q"3t‘źçX^.¶ş—â¶ž°ęŮŹ5ˇX. Aţnr :Öť˙u]F{'Ő»äŁăü´ŁÜj`ţtˇ m»­Ç)ÎÓź6ĎckĆ>)Oý’Ţ Y/u+ĆŰ´gű“ŘWń3^ÖdđĽ–:ţ†Ö&wCŃʲ! ä©Á88­ý}’ŚZ·x=«¤LÝá¸úóúŠ“ăt§‚™$+ćĽéĺÔyÇáWAF¦ąnŢ·ů‘]Ęp¨ďkio‘ÔëZ…杤E6ź§K¨Ü6ÔXc`¸ČęIí\ŮńŽŻ¦jV0ř—BV×’’h§Y1ěŘÍMâíwRµÔ4]D0Ĺy¨ţ‘0Ü±ŞŽp;šäţ$Xj6ú8Ő5÷Ô%’ő Ăä,``°Á'Śăń¨ˇJ2˛šZß˝˙ČşŐe¸7§ĄżĚíĽgăü1¨iĐMlóGv˛§-•ĆňMEgâmZ >˙RńŚtí>|ŘČ”;ąÎ‘םă¸Ň_ Yeó%8>Ű+·Ő,­µ>{;Őm2ěpN2˝fýśa Ç}ţţ…®yNv{m÷u8Ëox®ęŇ+űo +ŘʢDé|‡qźOjî w’ŢDňÝ”LçiÇLךęV> đ ^iZŠę%ľ7Ú]Źť8ůXőľ†»ű-RÚăO˛ş’Hŕh­ČŕHÎŃž¦•xĆĘPJŢWün:•ÜfÝüířX˝EW1ŇQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE⯠Xx–ăHšţK”m.ío!°ťN@l‘ÇlVýĎřŻÂv'›J“P’ĺMş[¸|–. 6AČă¶+ ˘Šâľ'xŻAŃĽ/¬[ęW–’ܵ»D,ĽĐdveůFĐr:źJĄđ/ÂďáźÚ-ÔF;ëÓö©”ŽWwÝSô\~$×MwáŢkŰzEśú–Tý˘HĂ6T§ž209ö­Ęä|eŕ ĹWp_\5Ý–§Äw¶2ůRčN#đ¨üđďGđÎŁ.Ą—š†«"í7·óy˛čĽ?ź˝vTP#ă_é>-ąµ»ş’îĎQ¶ŠňĘ_.E™ÁȬk_ţŠ{K©îµK­FŢĺ.…ä÷äbĽ„$®6ç°Á÷ŻG˘€ çô_ Xi$Ö5»i.ZďT*gY]Łhř“]™â= Nń“6›¬Ű-ͤ˝TđAěA‚=Epp|ŇŁ)ëŢ#’Ĺ+h×Ëǧ Ň˝>ŠlH±D‘§Ý@}s~7đN“ă-×SĹ=ło‚ćŮöKö8?Ęşj(Ě˙áLř~h$•]ł![»›ňFÂepĆÇzÝńŹ€ě|O=ťĚš†§§ÝÚ!Ž9¬§ňÎßCÁÍuôPá_‡:O‡ős«5ÖŁŞj»6-Öˇ?šČ;…ŕúÖ®‹á[#^ÖukY.çUeyÖF¨ŔÚ~$Öýá ŘřRÎîŰN’âHîn^éĚě‡ld Çdž­-|O{â»´ËŞ5ź!Ü<¶ 2ÎI÷®–ŠůżÁ:7…Ľoo{âxmőۉ›Ď·K”´ŕ ĽŔęťm|,éßo´żj·šź†RĚ˝ĂK'›räckcĎuëŠőSŔ~Őo^óPĐtů®\îy @>§OÖ¶4ť'OŃíE¶•eogośůpFg׎ô&§cm©é÷WŃ,ÖłˇŽHŰŁ)Ż<Óţ h6’GşŽµw¦Ćű×Nžë6ůô*Čöüó^™EbřCĂV>ŃĆ™Ą™Ť¨‘ĺR ŽHŹJĐŐtëM[N¸±Ô`Ií'R’FýµEyť—Á˝ÚXŇMCZąÓcmë§Mw›~ąÁPG¶~இKđ•¦x&óÂÖŇÝ˙fܬěΦ@®Ü}8®®Šćî|§\xxUĺşp€AĽ:ů»GľÜgđ­Xt¨!Đ—IVŰ-żŮ7mŰ·9Ć3ŹjżEbř?Ă–~đýľŹ¦ĽňZŔX«NÁśîbNHwô®[[řO˘ßęóęZ}]\Óg\yk!îHÁçé^‡Esđ^źáÝűOµ¸ľ¸ą3Ďu7™#»sś`qíW|á»? hil“Ék ;+NÁś–bÇ$:źJÚ˘€9ŹxFńŚ®«©qĚ7Vď˛Xľ‡ÓŘYřaa¤kÚ”ÚÎą©OlwB·—[‘O®®úŠŔµđ­Ť·ŚŻ|K—ţî·‘ ,*ăÎxő¤ń?„ě𽏇ďu{«).MN´L%`@lc €0>ą®_RřE˘\j·7ş}ţ±¤}©·O …Ď—‡ąÁü«Ń¨ OÂ^Ń<'Ş]_h©AŔöź®+Đ袀8oü4Ň|E®®´·š–—ŞlÉqa7–eQŔÝÁä2;}iż‚ô÷×|?«Iqz÷z$ oi‰B„Éňä¶rćşj(Ćłńf….•©I®·[𥆳â-Yş’ĺn´¦fc`‹uÜ$ţWAE6DIchäPčŔ†Vzó[Źš(Ľžm'TÖôfmĎmeu¶<ű ťze‘á_ŮřgGŹMÓŢááF,^y7»1ęI¬ŻřËĹw6—S_ęV–ŞR9¬gňÎ$k¬˘€8ź |7Ňt`jŇ]jZ®¨«±.u Ź5Łöđ1ú×mEć×ôI5+«›-KZÓ şróÚYÝl‰ÉëĆ3őü«˘đ‡ôoßjW:$rÂ/ÄBHK‰ĺ‚Ţ3“¸“’rk§˘€9ďxNĂÁÚTú~—-ĚËp×,nY·0€8ůE>×Âö6Ţ0Ľń$r\ű«u¶t,<° ‚Îxő­ę(CŁ#taX𥖇¤ŢéöÓ\IŰ»;HŔ‘¸cŚt®‚ŠĄ9%dÉpMÝŁ'Fđý–• .Źy삲ś†,’AŔżĄs_đ¬ô´w[mGV·µs“mĆéÓ8®îЏשÚ{‘*4ä’kc—×<iŞ^Ev—úŤ•Äq,;í§Ű•3ĹXđç„ôý ćk¨žćęöQµîn¤ß!™ăŠč(¤ëMÇ–ú Q‚—5µ ä`đźk­6ˇay¨Z—Í{hfÄLÝyé]uˇRPż+Ür§Ű™lsľ#đ†ť®]Çy#ÜÚ_Ć6­Í¬›‡ÔRřoÂ:vs-Ü-qu}(Ú÷7Ro“€öĐŃOŰO—’ú ŮC›šÚ…q·ßtŰŤJâňÖóR°7tŃÚϱ÷ă­vTR…ISÖ.Ăť8ĎâF‡ü'ĄčÓ\é‰$M4K!lŻËź›×'<’k?Wđ›©Ëos§\Íţ´ŮͰIîF5×QT«TR澢t`×-´9­ÁzV‰Ş%ý‡Úq …·ľá&I%Ű#%ąőÇŠg<§kŹö‚ĎycŤ­=¤› Ź~ uQíŞss_Q{rňŰC”ŇĽ ¤éš­–ĄÝ˝í¶óćË c)e*KńĎă®®Š*gRSw“ąP„`­c–ń‚l5ŤTjks{c|T#Ëi.Âŕp3ÁíĹ[ÖĽ+¦ë:e­ťđ™šŮTCp! îő8çŠŢ˘ź¶žší°˝”5Ós“Ň< ¦ŘjQßÜÜ_jWQŞkŮĽÁ¸×YE§RSw“¸áÁZ(ĘźBµ›ÄVúÓĽÂęšPĂa®F3źĆŹhVľ!±ŽŇőćHă™f&î\㨸 ăđĹMŁxMÓuHµşÔ/o"˙V÷SîŰôÖşÚ+_¬UjÜĆ^ÂťďĘ`x—švż$3Üíď!˙Wslű$QéźJ‡ĂŢ Ó´kăć]^ęmryŽŁŃxâşZ*}´Ôy/ˇ^Ę\ÖÔÄń/†tďGŰ–Dž®!m’Gô5GDđFť¦j+¨K=ćˇ|Ëy/c˙wŠęhˇVšŹ*zĄ.fµ<Ł\ŽÇÄź/lůÇňŻVŐ´-/W*u; {–^¤@HüzŃĄh:V’Ĺ´Ý>ÚŮČÁxăúő®¨â”RZč¶čsK ŰoM÷ęGk‰.uµyľ×™-ËĚ­§Ę&‹c ďdr>­z):Ő»`¨Á+$cř—ĂšwíRJ&&3ş9cmŻő±´ßYŮßŰÝMŞj׍nÁăŽ{Ś #§WcE­8Ç•=*0”ąšÔÉ›Aµ—ÄĐk¬ó}˛slŞlŰ’rF3ź÷ŁÄšŻ-`‚őćD†eťLL,:g ńÍkQRŞI4ď°Ü"ÓVÜÇń7‡4˙Ú$Š>čŰtRĆŰ^3ꦹ÷ři¤Ü[Éýć§xě6¤łÎ˘ěńůî(Ş…zV‹&TiÍŢHÁń7…´˙Án—†xĄ·9†xk§ăŠÉt‡Ś}®ăP»ą®.g4‹´çhČŔĽWiEŻR*É„¨Ó“»FN© ZjZĆ™©Nó ôňĆ ŚťŘÎáŽzv"­k:lľ™=ŤŢń Ă cm¬9Ďđ«”TsËMv/’:éąĂ§Ă‹Ř—Ú¦±{j¤o=ÎPăÔţwĹŢŇüO>‰%Ü—6˙Ůů-»…|ż)ă§Ę?_Zę誝YÔřˇN0řPQE™aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Gń4|MOO/„&Ť4d…XgĘČ`>oĽ3^ąUµ?ůÝ˙×˙ĐM|Áŕď|Uń„—) ę+;[2nŽŔ9ÇQěkÝĽ+âx­m4ÍĹZĄŞř©‘V{rŔ39é€8äcĄyě—˙ľ#˙®p˙6ĄýŁěäĐüsáĎۡđ®ŔlüÔ˙ă´îZď‹4ć;}gUµłžDó%lą#?5cY×ô­Î+­Zţ [yH $Ť€ÇăđŻ–ţ$¬ľ>ńżŠ5 V-mŁŘ« ‹´˙}3šgŤµůüe ü<ĐíŰ}ËB°¸'“&˙%IúíĎă@«ńzkŤOPđíŢŤă+=&ÎDŢ©$ΞhÝ÷×îôćşOŠ_ˇđ'‡í䉭ďuIJ*@ď‚ËŽ\ČW“ţŃöQişĎ¬­Ć!¶µ öV*łűNh–iú&łu’!–]ěw"ÇŔŰśŔP˛ř_Çz»§C,zĄşËqsÉÄ9¶Iě ĹqţřŃĄj^+Ö,u¬ět»RE­ÓČs>Oz»ŕŻ…ţ˙„NÖ_ě¶ß©éđ‹Łö™y®‹ŹgŚWŤü đn…âŹë¶Z噹¶µBbA+¦ÓżT‚xő ©.5}>ŰK•ĹäX'wH=kGńç…µ‹Ő´Óu»)îXác‚ßLőŻýĄnÚ×\đ˙†­„©¤ÚÚ¤‹lIbXŻ~¤*ŕgÔ×!ătëË]<řOÁúŢ‘{nFůHţ`ěŮç"€>¸×GöĹü~y+šŘŢG§çUŰĹş ë±čßÚ–ÇTsn­–Î3Ž+ŔżhË«ďxîü2ŢÍoćLvź0Ć…¸íÎkĽřWđŁIŇŕŇ|Gw=ÝÖł$BŕłIň"tĆ2xnąë@‰ŁřŁDÖoîl´˝NÚęęŰýlq¶JóŹç[5Âř'ᎋá ~÷VÓĄ»’âä 3‚¨ ÉĆĎ>µÔř’ęK/ę—P˙­‚ÖYSę¨HţTŇ»°›˛ąĚßxŹWÖ5Iô˙ Cn"¶b—…Ď1ŁwU©üę°_ÄŬĽS¤ęW ɵxC{eN•`Ě’Yü?đ¶—k)5{…K©“‚C‘ź~?*Đń…Łč~(đ…¶—kĽŇ]1vRK2€>ń=y5č¨F>ę]ú_n˙đ=ĘR÷ź—[oŰţ ŘxKÄKŻ[N˛ŔÖš…«ůW6ĚrQ˝Źp{WŁOâĎę:çŘ5č­"˛˝’Ý#{en8畹¤í˙…©®|lű"ltó;gßn+•đ~©­Xęž'ŹGŃN˘Ż©ĘZO9P!Üx9©„ćpKdő¶—ő*so•I˝ÚŇúŰĐé|'â b?\xsÄ //:FŃ"÷Č˙놺™µ˝2f–kűtŽ1HĹÇĘßÝ>őĚxW@Ődń=ĎüEäĹvńy0ŰÂw×Üúńúšç<áë-gĹŢ'¸Ő"0Ű^¸Ž 9Źs3eŠô'TÎť97+ÚÉ^ÝüŠ…J‘J6Ý»_·™éđęVSiâú;¨Ť™„Ű€\g~µZĂÄ:FˇqäYę6łMŮA“ôő®+ĆöPŢxźĂD[}&RóI #b°P[nnçV~"ř[J¶đ­Ĺö›gŤĺ€C5şŰĐ‘×ń¬ăFźş›~öß}µ.U§ď4—»żçˇÜÝ]ŰÚy_iš8ĽÖŘ›Î77 ÷ŞPř‡Hšóě‘jVŹsťľXdźJóď’ɬř7ÂŹ+2IyufY'ő«|-Łéľž}> {›?-Łš5Lî–ęz÷ކę“Ő» Uçď8­ąŰ]řHłşű5ÖŁkůĆĆżĄi«PĘAR2<ŕěü#ŁÉŕ0nlˇšî{?>K™4¦F]Ű·žzšĹ:ĹŐ§Ŕř®c‘„ĺóČöőúTűËH>¶·”ušésĐ[Äš*Ýý™µKA>věóG_J‹Ĺţ ·đć‰q{3FfT>L,Ř27@ç^l!Ň…żł“Áş»\xşű 21÷÷ă= TÚĚ3ü’]rŃĆŁk˛4{±*/ś‚FG}+U†‚”oµěfń3q•·µÎößÄZ®‰3Z]Ŕ×fͦhŁ|˛|ĽţDâ±>x†Î×ŔşTšÎĄO/›Ěň|Íűׯ=«WLŇ´ű? ‹KX.$Ó°ňĹ «6cä“Ď5Ëü#đ¶•qá8u BĘ ÉîYŔ7$ŞĹp ôäřÔňÓörŢ×_©W©í#µě˙CŇm. Ľf´š9˘nŹńŞš–ąĄé’,z…ý˝Ľ‡®ŕʸ߇đ¦•âi¶ą[+yVHâÎBdgó®WÁş…ťÜWşžŻá˝CY»Ľ™‰ZyńŞöUČŔĹ%…Mľ©[ń‰v]Ý˙Ú-î`ą¶[‹yŁ–#dő¦Ů^[_AçYĎńdŤčr2:לü9KË[ß[ ?P˛ŃťLÖ±ÝDČśä ˙ž+OŕÇü‰)˙_˙čU(();íoÄşuÜÜU·żŕvq^[Ku-´sĆ×dŚ™Aé‘T/|GŁXÜ.ő+X¦iGÖąŤßĽTŞpL úq\î,Ľ&×6ž1đúÍÓł LŔ&Wđ‘ÇŇ®8x·môZuÔ™b$•öŐëčw~4Ö^×ÁWúžŹst@c™q÷€>Ţ´ÂDšo€¬ő˝MŚŽlâ•đ0d‘”p>¤ÖGŚ—M_…7ßŘb§EäýŢdţą¬/‡? <4Gú°-7ý<ŞŞTŁ5żć·™5*Ę.R_Ë#ON¶ń·mWP“XHŠaľhŕŢBöÉ5cDńµ¤x–ņÍČ&Ňö!´IŽÄźÇ5ÝÁłČŹĘÇ—´mÇLcŠŕ~)®íKžY˙HţŃ]ľ»xĎô©§5V\Ž*Îý6ŕéGťIÝ[®ç ŃEĆvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@A}Kcqc.ń˛¨ő$TôPŠţĎń„nu§ńźö5¸HÄGÎŽMÄĎÜcŽŁ­uü'uâ˙Ke¦@'Ôa™'·BĘą# ڱ|¬zšďč ř'đçTŃ|?âX|Qkök˝Q~ΪҤ‡ËŘrŮRG%ľż-rßţx—Hń펥âM7ěö6Jď¤Ëŕ…V'ą?…}'Ex§ÇŻx‡Ĺ^!Đ®t?íP[!·ťm;óŃÇĄmünđ>ĄăŘA¤Ş6ˇbâA ¸_0mÁPOýxŻP˘€<›ář‰osŹ‹l˘¶Ń­-D111—f\ÎÖ$đ:â¸;oüFđ7Śő;żŮCyovĚ©)xĘ”-¸V`Aô­ă~k>1Ń´]V!‹Ĺ6P*L…‚¬śîŔaŔ!łŽÜÖT7żn-ă°eĄł®ÝáČ˙k;Źč {Íăź´­ÓFĽÖż™źáíĎB†e´ó^YßĚšiź|’7©&±ĽŁßi7^!{ř<Ą»Ô$ž˝[rpx'ŤuôVÖM4ú›ű(Ý5Đ+Źđ&ŤĄęž$šţ*;ËĂ,z¶őËsÁ8ę:×aE(ÍĆ.+¨ĺ))>‡'ăŻŢęRiúž‹$iŞéďľ!' î¤öÍbë1x»ĹvkĄ\é1i6r0űLí:ČYG8P <ףQZCâ’˛vŰČÎt›wjűůś_Ť|?uuaáë]&6;ŘdťWlj0O$gđ­zmŢŻŕýBÇN‹Îş”&ÄÜ8u'’@č ttTŞŇN/¶Ą:1|Ëą•mi:xZ6L\­šÄS#ďĆ3Ó­sZ?„çąřgŞ§Ů®J¶Fŕűq*r µwTP«J+N÷J2ßµŹ>ÓőiVqŘOářµ…B%Ěw(Şŕ ˙…lëÚVĄâ?\i÷ëľ§q%Q˛ŠĘá”gţuSu®Ô”RiÜJŽŽ-¶¶8żMâ9´©t˝[D«›D“‰Ń„ŽUÜgžśU˙‡eŢŹŕÝ>ÇQ‡Éş‹ĚŢ›c21‚GB+Ą˘‰ÖrMY+»˙_xáK•§{ŰOëî9?h÷¶ž1ń%őÔ-/3 ďSĽđGăXšvźâ_\][hútz¶Ź4†X”J±Ľ$öäôüëŃ覱[¤Ó·ŕK ´łi«ţ&†îu»ô»mN†Â3´CJ$b9ݸŹL~5Čč6ž+đ|W:eŽŹ©fÓ4N'TŔ=šôş)*Öżş¬úLnŤí«şęp> еÝ?ÄúŢĄ¬$&KŘ‘•ăpW?.3ž8Ĺ>ăUń|ÖóŮ\xV ťÔ§.“Ę`{Oé]ÝNż4ąĄöďÓć%C–<±“_w_‘çÂZŤźÂ»˝0—Śąq0 pv‚ŘW@ľ]GŔvš&¨›YEŕ‚c‘Pră‚+Ł˘¦UćţűüÇŹÝo‘çš|ţ5đőşéí¤Ă¬AŮ ĚsŞ˝sVt]XŐ|C»â± /lµ±îçř‰éšî¨Şx‡­’Mő ´»m.EW9¸QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUmNţÓK±š÷Q¸ŽÚÖÝ$˛6EYŻź?jíbâ(t]"'+o6ůĺý⸠źĚĐIń˙Âv÷&;xŻîy‰P}ĆNk¶đOŽ4ŻiWWÚ2Ü”¶;dIcÚCc8Źá\%¶›đűᆦŮx˘ŢÖkۨ·ĽÓY™ĚŤĆě|§Ŕ®Żáćąá-GIŐŔˇ#‚ÝĽÉ• x€v ÷{zPO†?‡Ž5]RĚisYýgĚfÜÝŚ85ŘĹŻéRë˛č±_ŔÚ¬Ić=¨oťWŽHüGç^-đWĹľ(ń%÷Šmžţ9îa€µ¨ťB˘É¸€[hÍyׄmĽg«|UÖcŇ5[h*ÖO‹tßřEˇ‡TşÜ\]Ě»–Ţ.zç‚/Zôš+Ç5Ý_Ĺ˙ î4ýC_Őâ×t ćXn›ěâ) 'ř† ČëůW±©  ©Eq˙Ęţ$r3•eCúzתP)ŕOOŻFmEżöeűŮvýżĹí]]|÷đîę^$ń®źáËű}*ÍuiĺžňH|×,X€Šą9®ÓÂ^$ń‘ńĽâűoŢ{sse}{ €g!‡üżď@ˇEy˙€ĽE©jľ;ńžť{0{M:ác·M l=űŇř—Ä:Ť—ĹĎ č–óÓŻáťçŹh;ŠŁ‘Ďn@ ţŠňÝW\ń‰~$_řcĂúŚZE–›n%¸ąň„’HÍŚŻéY^Ľń‚|U¸đΫâA=˝¤+tm—÷čqň·÷O'ň g˘ĽgGÖx¤ř˰k l-L’:ya·ckc­mëzť¶Ť¤]ęWĚVÚÚ3+2p==ëĎfóź…v'ţ›Ď˙ˇš±ńęŰR›áöĄ-ގµ¤P“s ‡{N7.lü˝űźÁ^2ń‰®l®O…ÚÓA» Éy%Ę– ł® óÍzyĂŻí? |<µ×5Ýio4x´x®"´K`Ť ĂÝźăŽŮ5“˘Üx÷Ĺş'ü$6ţ#±Ň}ŇZiŢ@pPgŘśóŹJöj+řoâ»Ďx.{ ‘[ë6Ď%¤ óť@Á˙täÎąŹÚ|@Đ´Íj_ŘÍsi\=’ÚŤ•FXNOí@±yu•¤×Wr¤6đˇ’IáQ@É$úbťmŁ­6ľ¶˛Ô¬Ľuey»HľČ¦"§… ç¦{W=ń>Ç_—âç„a\H~ŇÓ2-»Pn$gç''ÓîTW”ř÷]ń'‚<)¦Á6­ow¨ßß vÔć·ňă·FîTÓž~µ©ˇh~2†ţĘěřÎ×SÓŮÁž6´rwŘŔšô*(˘€ +řIâGÄř‰µI„¦ÓTšÚ(Qz)żđ‘j_đ»çěżěÁqĺm'śĐ Q^1¤ë^'ńĎőë{Űh §]=´VbÜI+$nl‘éÚ»GÔµOxRÔüYĄ=šł¬ÇĺďR=I ~4ŮŃ^3lßµ/ÂFľ%°µťă71éb)ł [9Éč üPľ0𫾭ĺy3>čć‹9Ů"ś{ŁŘĐîĄk¦XËy¨O˝¬C/,‡ Ł8äýMC¬ę+aˇÝę1¨•a¦Qśg­y—í'¤|ŇŰ_¬:x–$žŰĘÉ”—Něđă«N+_Óü¬I­ëÉ©Á&šDQ-¨‹Ë;=rsÇÖř#]>&𮝬î=ţXlí䎿…nW|(°ńĆ»ŕ=6M7[¶Ń4Ȣ¶AmćĽűI˱'»#đ®ßáW‹5-^Ó\±ń0…u-ĺ­î&Śa$?6?úPˇQ^3ˇjŢ/řޱ¤ëöş”%hěáhŹ(S÷ź$bşŹ„ţ/˝ń :¶—®,cZŃç\Ľ_rPsµÇýňxö÷ ú¸|Uđţ‘«>•n/5]I ź ”ˇA#żÓ8­ŠúÄúĂÍnţÍĘ\¤#qŐY\Źqśţźđ{@°đßĂý:éUâňŮo.®|Íąwr}4ß |Qҵ­z M;VÓőÁ1ÇwlS8?ËŇ·ßÄŃŻŤ“Ăźb»2µŻÚľÓł÷XÉĎŻVĂÇľÔďíílőË ‹ąd(Ż–,{ ɸń§˙ ™|?®śÚWÚna»?€â€;hµ9u¬#ą‰ŻaE’HC|Č­ś=đk']ń]†‹â GşIŤÖŞĚPTŚî9ă­x˙†tŹÝüWń…µżŠ#‚ţŢ8<ű걩PTÝňźSZ_5Đ\ŚŠöz+Šř9®_řŹŔV:–­(šîFpÎ á°8SÁ^"Ôµ?‰2ŇŻ&e§…şmníŮçżA@~ńqńYÖµ˙ŮׯiĂnß·żµuµóżĂ|S©ë>.Óü9¨[éVi©Ë,÷ošĺ‹FG`Nk»đwĽAĄřň_řşâé%·76WŃGłÍްěqźĘ€=6ąďxž?ǨĽVWvźcşkR.nň1Čü롯,đ/ŚőkŻ řËTż"ňm.ňt‚0¸ůQâ€=NŠńŻÂiă nÇĆöPĎ8/ö8íŇ.~ăsε~%řŁ]đőż…ôŻm-oµI<›ťRX˙urBű–ďéůz…ÂřsDń}–­mqyâŰ}WJl™ckPŚxăkGZ‹ÂŢ!Ôoľ+x»Fą6źa oĐ6–E'žü“@ýçţ9ńĄĄüBđn™g0K=FYá6¸Ç=«?Ć>(Öµ/Gŕď ][ŘKi˝ż™CůJq…Uőĺ?jő +ÉôźxÂŢ;Ó|?âmR jÇVVű-äqŢ9ްńÓóŻUť]ˇ‘ap’!XŚ…8ŕă˝Ao¨ŮÜß]YAs—vˇ ń+eŁÝ’ąłůUŞů˙ŔşGŠď~ xę+OĄµĺĽÖés9˛'âM¸]ß(‘ăÝAđů†â[ű1*á»ó|3ŠőŞ+’đÖŹâť;OÔżµĽA§}4gěÄŰůqÂř8ÎHÎ+Žń-ŻÄ B»ÖĄńuŚ÷6‘™ŢĹmĆę9* 9éí@˝Eyć˝ń éż ,ĽO°’ňú(Äg+öúMPŇ´‰71ZßŢř˛ŇÚi6É%’نD®ěőŰÔ\x°ĂńÓÂ˙eOh×^~îíŠę«ÉµŰ¨,~>é÷Wr¤6đčó<’9ŔUÉ5ˇŕÝ{_ń·‰%ŐlÜŘxBÜŕVŚy—¬:·=˙Őë€I˘ĽŽ_x‹Ćľ/Ö4ß ę¶ú&‘¤?‘%ŰÄ$’yyÎ c ţŢ´~řźX‹Ć:ŹüQqőě‹«kŘWhš.ČěyţtétWč~ ńĎ‹ĽCâ Hľ¶°¶°˝púŚ‘o(ť%^ç†9ôý}AµĽ˛Ň-mő;ß·^Ć–ăfĎ0úăµ_˘ĽŰÇľ&×&ń†źŕ˙Ľú…Ä&ććňeÜ ‹8ČĎËëXÚޱă‡ú]ŢżŞĹŻh7s‹ißěâ) cĐŚcůcŇ€;Ż>/ÁúL7/m%ÝŐĚËommYAžÝ)ţŐ|A©}§ţ-tť›LD\,ľfzôéŠó?Ťö:Ôţ#đ¬±k0­ĄĆ «g¶¶Źśśü˙N+Öü1cŞiúg“­ęk©Ýď-ç¬"/—Ś  žśĐ˝GR˛ÓVżąŠÝg™`ČŘß#}Őć˛|â#áO _k"Ü\`§Ë-·vXżŤy—ÇË]aüAá/#UXm'ÔbKxDňebBsóuéĹhüOÓµŤ;ŕ˙c×µ…ŐgfŤ’E·ě]ËĆ9ć€=SLąűnťku·oťÉ·Ó#8«5ăşťńU𵞫kŻYéÄŰ+ŰiÂŰx*ĘÉęF;qšßđ_Ä5ÔľOâťZ%I,’Ap±ôwAü>›˛?@‡ExĆ—/Ähđ‘CâK 5ćS5¶š Ą;bs“ô®ëáŠĎŚ|'Ł4B¸äk{Ôđ$\gÄëh®ăW5 ř}KH”Et“FˇŠ†ŕžx5SÂPx×W˝±ń±«ŰŘis~űű"87hi~A¤šµ^'ű@¦©scá»»]QbÓ®u xă¶ňrVB„…łČű¸ŻLđ–™®i±ÜŹki«3•1¶ů`g= Îxü¨˙µ‹}GźRĽ4íÜdňÁGęk–tt÷VšťĽ/ŚK%± Ď|ć¬ü_˙’yŞýb˙Ń©Q7‰Ľ?kŕ»xŻŻí$?bD0ĚvŤŁžµ×Jś]5'ŰvÓärŐ©%QĹI$•őůť}…ĺ˝ýśWVr¬¶ň®äučEO^Yáéµü¸ĽŹ0Nć€0ÎÄfăó?Ťkřhř§_[ băP†ĂOr’-šĹąĄŚwfí¸:™áůyťŐ“°á˝•µjçyEyűjšďŠúo!Ç’#1±éŽOżĺZ^1×u×l)-ő‡‡|?ö‰…őô:‚6ý›Ś1ž; µ­'Śôť}jMbÖW<él…ľ/RgśSö P‹M&ďónă9&ť•ľG˘Ń\v·ă!cŕ{]j(AąĽTH"'Ź1˝}† ü+R“Ĺş.”u™µ«KłOcĺ»{€Ůę*#‡”·vÖĹ˲żSҨ®Ĺ>'¸] ĂÚŽ”ţR_ÜB0ín˘şŹ\ËeáíNęÝ¶Í ¬˛!ĆpÁI”•ŻÔµV.öčhŃ^}{â­FĎá–ź«‚Ź}q±W_•7óč1W4Í7Įַqx˘Ţîeiěăi^űH>•NIą4µ·ÜB®›J)ľżyÚŃEyÎŻŻx†o^xFh@xQÖYW"Ýq–o~ ~5©:ŤĄÓRęTTŇo©čÔW«ęzźü*ňj«ŞęsÎ#·cŚe€Âă=°Meę˛ř·AŇ˙¶fÖ­/ĽśIqd" »sČVÎx­#‡rŮ­vó"UÔwOMüŹJ˘¸ř¶ęĎš.±Ł|żkž<Ł€rĄX•?ĹG©Aăk-.M_űZÚIcO9ě(^ĄCg’ö“m+č'I´“v=ŠăŻĽmâńQ’d"=<Ě•#č?•gýÇ?هQ:͸ĽŮćýČzgfď^ß_Î’ ţÓK[kÜnşű*ú_CĐh®oÍ/É5ëX^!:V7Ü“ě3š]2ĂÄ÷p[^ÚřŞÖádÚÎźg0z€AŁęí&äí­Ű¦ŇŠľ—:[ým,őí;Kkiä{ŔÄJ‹”MŁ<šľ×–Ë|¶FdM”Eź¨8'™®g]Ö/m|{áÝ6@´»ILÉ·ďRG?…r—:Ü˙§‚e"ąű:KöpBĆX|›sî9ö«Ť$›vŇ˙‰2®âÝ•ő·ŕzĹĹxŻZÔô+ #K´–;Ívýü¤™ÓjńŚą_ÄVn¶Ţ.đ­‡öĽÚ¬:­ĽD‹sĚ)8ĘśÔÇĺmV»y•*ę7Ńéż‘čôW ăßÜiţŃő}ü·SĆJ2ČTťľÇŚS$˛ń›i×”ÚĽ1Mä´‰c…8ČŹÂ…‡|ŞRi\uĚăÝŽúŠçĽ#âőoŰę·.ŞÉűI鵓ď,ţ5Káľ«¨ëşeÖ§¨¶!žvű4{@Ů?ݧáPčÉ)7ÓB•X·şęuŐĚřďĆz‚ěm.µ8®e[™ĽÖÝ71lÓ>ŐÓW’~Đ·Z[ř>âáÄpC­Ă$Žz*€I?•dj]ô˛äâ?ü?ă^ť\}·ÄĎÜÜE łyĄ`ŁvY‰Ŕ+źńGüE®xőü#ŕůŕ° ďŻĺŹĚŘ0Ş=yŻĄz…ärkž*đŠt{?j0ë:«'ŮŇěB"’{éÓőô©>"xŻÄÚÄ}3@đĐ‚FÔ,ŽĹ|‘ącűĆ=p˝?-5)!„Ëq§›mŠŁě`zŻ^@Î)GŚuźřgŻřIţŇ?¶<˝ŢvÁŚý§gNźwŠőÚ+'Ă7“^ř[KĽ¸m×ŮÇ+¶1–( ?ťp˙ümu?€5ý{ÄyßŮ÷— ¨_‘í_Ěţ´éÔWŚčŇü@ńV†ľ!·ńźĄ€e´ÓL!”§;C±"řÎ˙CŇt-8ćń´Ëż>Dŕnsř°ăßÚ€=ŠńďŹ> Ňż6żm­ÁnCÝŮ5°ŚĎ;[9âŻüPńĺÖ›đűDń'‡\ĽžÚęčŮK>‡Śő*+ȵ«O‰~¸ń x†Í.aܶ–¶Łb¨)Ľś’·řŐď|A˝á‡‰´čbŽňôD…¤ŽÇʰ4éôWšhÚ7Ť%{űoŮęÎČóGöEŘČHݰ‚yĆq^—@ČřżLń^ˇ¨Ä4=zĎIÓ_Ľf·ó&2dôÎ1ŽőÎř+^×ô˙w^ńˇoŞ©´v·‘ F+śŔ}ĺ@ˇExßö˙Śő˙‰%đΉmegfčćîXw´(TaU{’Iëčj捭xŁĂ4ď x—Q‡W±Ő!w·şťA8 }1řŠőŠĺwQ‡#Đ^‡¬x‡Q·řÇ hQL›ug4˛Ç´|ĚŞÄţ€;ę+Č.őďřźâ· iÚý·‡ Ó6,hЉ&şÎrĂ$p0?1]Ž‹ý·áŤVĽń~±§ ˛˘’<¶ŞIz“Ň€:ę+ĆĽ1/ÄißŰÖÚĺ¶§ĚíöKe¶–Pq–$Žŕţ]+[Ćşç<5˙=ś·ńMw{z-ďeH€YGn´éôW5ń'TşŃ| ¬ę:|‚;»x Ćäg#µq^+ńĆŻ¦ü9đuÝĽĐA}­%˛O:ţîÜş)gař“řőŞ+Ď´-ĆPj6WOă+]SM. ÄmhrwŘŔšÂÔu˙x‹â>ŻáÍ;^¶đôz§–ňÜ’9+’8ÔP­]Kö{if(î#BűPeŽp­cř3Ä1ř§@‡T†ŇâŃ%fQë†8Ígh6~%ŃôťTřY·ÔŮ#/k,pyl¸RNáőĹsľ ńŐÂ|“Ĺ^ “íŔ˛3`ŢCmEüIń O˘Ľ‡Głř‘â-=u|Ei§Kpžuľś¶ˇ“iĺC1=ÇÖµ|㫿|=ׯ.b[]wHŽx®”HY\Céę zMâžşřăß ŰękŻŰhđ.cB¶˘G¸e<»răĐ×Cđ÷ĹúĹÖ‘âkm~8î5}FŤš0 Jś{â€=*ŠńŹMă/č©­YxŇĘÎiY±ŠŐ]aÁűŻÎsř~uëz"Ńümá­'Ăm }J9¤Ë•ߦs@©ExŹ‹µź|9}>ţ˙U¶ń ĄÜ†·ű?’VB>P¤gŚŐŹIńžo]köW_g(÷:rZâ5V`VÎN3׏Zöj+źľ¸ŐuŻAuáąí¬ő ¸b–7ąRč°N@ępOă^qâ­CĆ>ŽËWľń5¶łdn«V¶•V8Ęŕ“@ĎEyŹĆ/ë~ĽđĘx}RYŻîLJÄŁ=ą"˛ĽZ>!řGC“ÄsxŽĎQ[bŻsb-B&Â@;[98Ď·•{ć-ń~Ą¤ęţ Ö#ę›`»„¨>[¸Ę¶z÷?÷Ď˝hücń=˙‡ü?i‚ĂűgRşKkQ€y'ž?!řĐ}EAaĐŘŰÇu/ťp‘ŞÉ.1˝€äăÜÔôQEQEQEQEQEQEQEQEW†ţÔ>»Ô´Ť;Y˛‰ĺŇuA’¨Ř;±čýkÜ©C)VÁ˝|ŢźüâOZĹă=<É­Ú[QŚ%Ô¶ÜR:góެţĘßňńwý±˙ĐdŻdąđ'….nL÷Ňd™ŽYŤŞ|ÇÔńÍliú]†›lmôë+kXXŕ‰QOŕ|ůű.ČŐâoúć?ôa¬/ ř‚ËŔ˙|Iyâ6 vžî=Ëb7ËąN8 ~µôÖ• húDŇˤéVRĘ1#Ű[¤eűň@ŞúÇ…4 jĺn5mOĽťF“@¬ŘôÉĹx—í!¬ZxŔ^Ő4ćf´ąąwڞí$m#§á^§ŕ H›Á:’év/#ZFYš$ťŁ’q[÷~Đď,-ěnô}:{;ő0IlŤî©…hŰA ­Ľp[DĂ…HăPŞ t‚€>kýťŐSâ§UT”:ćU 5¨| űCę:–·±Ů´˛îuBNÇNă8ýkéM;ĂÚ6™w%Ö›¤ŘZ]KťóAní““’O4ÝkĂš.¸Pë:UŤó' Ó®WčHČ •ľ!ř®ŰĆ?tŤKNŽQ`’ŰŰĂ$ŠWĚŰ $ăęŐÔ~Ő%×Ĺ~1.é»\g'ď­áoşZ#čšc%ˇÍ¸6¨D' üĽ|ĽÓҬßčş^ˇyow¦ŮÜÝ[śĂ4Đ+Ľ|çĺb29ô ›ľ5|PŇ˙ŘL˙!^Źq¦XÜß[ŢÜY[Kym‘ ďłĹž»XŚŚűRŢi¶7ł[Íygoq-ło…ĺŚ3DŢŞHŕűŠómcţNA˙°dßÖ¸˝OGđőŹĆ=~,°Új.,n|÷Š<ŽIR3׿L{׾ľ›búŚzŮ۵ühcK“2*ž 62µG«čúnłoäjÖ·°ç!."Wţ4çžđ˙Ă‹oŮ6…qúŇxBŢÉ1N Ň˝F±ô_ čZ¦]G°˛”Ś QôČ­Šđż„~)ŇôořÚĂVąŽÍ§Őfš&;RL9C28üęęjPxÇăŢ™qˇ¸ąÓôk&[‹”ĺ7¶îďÔν>ďÂú ÝĽ]hşt°É#LčöČC;usÇŢ>˝jÖ‘Łéş5·Ůô›k(3’Dęq@Oá-^ÇĂ?üqk®\ÇdײGqĚv¬‹ŚđO˙CTďĽKaâ/ÚÂ_Ů3 ›kHn"3 ůŚ2ďŽ+×uŻčÚćĎíť*Ęř§ n!W+ô$dS­MjúöĂÄĂ_ń â=ÄÎí•{ŻJäôůě<3ăMń @»żşşş/g|Öfć?'˛.rđ©í,˘ńgÄŹjžđÔú>›¦ł=Íě–żf8PżĹßó  żi˙ĽU5ơý±m§jŃ ykp!™Yx;űÜŹJÓř­jzĎ….N«t÷«mw%˝˝ă. ÄkŚ5t·~đµĺă]]x{J–áŽćwµBXúž9ükvÖŢH Xc†XăPŞŁĐ@qńďVÔ4ż iâÂî[+{«č༺‹ďEÎH=«Î~)XxMđ<ɡݾĄ¬LÇ'ÚŢvYŘgcŰ˝}{gmk%µőĽ76ň ĆżŢa ?1řמ|9Ň~ę>·]rW˛ŐíÁŽîď儇’púWĐ–ÖđÚŰEokpÁăŽ5 ¨ `Ú±uOxoVşűNĄˇi·W¬’Ű«1úśs@mâ94ż ü!Ö/>ËdądńJŇlŞ»Äž€W?âKŮü?ą¸‡S›YÖî-XBÍxňČň˛ýí€ŕyéĐWľ[i–şŘm¬­˘˛Á_ł¤J±ŕő@ĹféŢđć›<“XhZeĽ˛¬ŃŰ"’QÓ§µyy‚KŹŮgË… żŘ7` ś,Ů? 5Ůx?\ŇőßZŘi—öóŢ6›ĺUÁu"=§#ŻS]ťĄŤĄť’YÚ[A˘.Ő‚8¢Ź@ŁŚVv“á}Gľ’óJŃě,î¤ZX TbQ:Pš|ńv‡¤|<‡LŐµ+{+Ý:iăž)Űc ČĚűߥ3ྯ˝ńÇZť°qorń4E×idä+cÜô«˙xsPľűeö…¦\]çq–Kdf'ÜăźĆ´­tË ;™®m,­ ¸*É,q*ł…2p:PšüoŤ9ţÝźů ÄřáĄŘĹă˙ k~!†i<>Đ›;—‰Ů|¦ÜĹX• ó~•ěş~›c¦ů˙ŮövÖľ|†Y|•<Ç=Y°9>楼µ·˝·{{Č"žhĺ@ĘĂÜńé<-đ’fµŤŻ"ť®$T†1¨Ę坎w©Żg®OđW†4뵺°Đ4¸.îYŮ)ö8ă𮂀<šŔűIjdŽš:cóZźöŠŇn5¤öĐ=ÂŘܤňÄ„ĺŁ7JôuÓ,S}Il­† éĺµČ‰|ŇźÝ-ŚăŽ•l€Ŕ†Ôń ᡤ%é˝Á"nhćÔ¦ Ľr¬»úÔźôë'ÁŢŐ|? I˘č÷±Í…bř…ż‹žO ~uéxÂ’Ý›™<9¤´äî.mS“ëÓ­oh ·ŮĚ1›}»<˘ŁnßLtĹy§ÄŹ>—áî¤,u+{»‹ŰVŽ"mÎwă¶IĎĄs—SßţËEjŤ$«h’íQ’BÎţ€šîĽYá-Lđ‡gŇt=>ÚíěfĂÁlŞů(x ţ¤ř3Gđ·ĂńM+ r`ýöę ei|5mđęĘáµKs4v)ŮŐł! BőÎkŠđ6›uŻ~Ď:í­¤ln游uŹą!•±ő⽆ßÁľ·Ôô—Ř;„«jőzŐÓôű=6‡N´·µ…śČRÂ)cÔŕw>´ŕŢŇţꞲ“Sť¬ő(bXîá›P–"˛(Ă»ş ŻCĐÇ4Ęl%¶_ ÜÎbw•ÚHÝĎŮô®Rđg†u;łu¨h:eĹÁ夒٠7ÔăźĆŻľ‹Ąľ—ýšúu›iŘÇŮŚ+ĺß8ĹxOŚíô/]cáĆľaż’ĺű*Ţ:+€O /đ˙*éľ(^ǦüIřw«jl-ě˘3¬Ň·ÝFd~µčZ_Ľ7¤Ü‹Ť7BÓm®Č–;u >‡Ą«iVšµŐl­ď-ÉĎ—¸4ĎřŹ\đ}ţ“ĺîťq§^9‰LŚ6u‘žÄdW•Ý ?Áž4đú|>×äş·Ô.„WBÍçĆőaýŃőć˝”xKĂĂJgö&śtđĹĹą·RŹńc}éÚ7…´S.‘ŁŘYĘF ŔŞŘôČ ÂSĄź d:¨‡Ď(#%U=Ű ­ĘăĽ9álŐëÇ…´ju›VŃ´űÉ—¤“Ű«·Ó$gŐf×EŇí.˘ąµÓlḊ/"9cU’<“°2$śtć€<ßĹ|Wqq|ú˝¶ź«BĚ­ymp!™x9ŻNâąť=µĎ|ńNź-Ěšś¶·,îĘŕÝGŠůľBś}Ezíç‚™ă%†że3Çđö‘0›KŃ4ŰI‡I!¶EoĚ Őó¦ŘťLj&ÎÜę?(\ůcÍŮýÝŘÎ9ŇnXĽńÇ ŞĘÇ©`$úšń?éŢ ˛Ň/|IŕßEŁęńˇš%±¸ů.¨C©é‘Śgś×fşĆ…­x#Aâ!łŽçR¶ůwCfćXá<Ű­t–Ţđ­µĐ¸·đć“Ŕî¶©ňźQÇ…ik:•­ŔęúmĄěI÷VxUÂý28ü(Ć4–·đ§ÄÍ KđF˝6Ą¤ęĹŢžeóŇŮGF Ř~ŁNk[LŐ,Ľ7ńßĹŰWŮĹ©[A%´˛ťŞűQAR˝sž+©µł¶´łŽŇÖŢmc]‰ h}ެUđG…’÷í‹áí(\†ßć TÎď^ť}čĚ>"xjŰĹżtÍ*ţiⵓLw“ÉmĄŔ$…ϦqůVŻÂÝjëÂúÔľń+b{|¶™rFâËőâ;sę-¦Ř¶¤šYŰ›ôCÜÇŞz¨lgŐöʦęV×7ú}ĄÍͱĚÍ »DŮ$dt(çżč±ńç‰ôź mndş7sµĚ¤±±'ŞQúúW¦xCđ —‰Ą›Âł$ú´pĺnä›ldŽą$uÚkZ“®F©¬i¶wĘżt\DŻ·é‘Ĺ&‹áýCV6—ecżďxU }HĐźüűWÇG˙l?ňŻS޶:mŽž÷ cgol×ćLaŚ!‘˙ĽŘźsV¨ÇüQw„ľ8Xëş©1i•‡ŘţŇGË än=‡OΫükńźâm?Jđż‡n"Ôµ+ëŘś­»˘ä–$tç†k×ő MJŐ­µ X.­ŰďEk˛éw°]Ƣ0Í †—SÎ+Ńő MFŇK]BÚ«i):·Ô+6ÓÂş¦›>ťm˘éńŘNŰĄ·ë˛Cزă§z±á‡t°¶Ź˙Aáż4‹Ťwös×´ë%-s,Ó4j:±]Ť·ńŰŹĆľ‚Š4Š5Ž$TŤUUŔUm/L°Ňm~ÍĄY[Y[î/ĺ[ı®OS€1šđoi_ 5? Zľ«3YęP§—u ÷ňÄĘăňî}+ÖţiŢÓĽ<ĂÁĄ[Kšáä.˛4¤áXĺ‰?ÂáVµ/xkT»7Z†¦\ÜL’[)fúśsřÖĹŤťµ…Ş[XŰĂmnś,Q E_ PšţŇ?ňKîżëâ/ç^Źký*ÇÂ{|´jzmŽ«hmu;;{ËbA1\F$BGCĹYPB¨€jůłŔ: żÖt_y–ZÍ˝ă˛4—rB’Ä~é`3×ôŻTřyŁxÇXż›Áň¤×Â5K‡[—› O–$v®«Zđމ®:Ć•czË´đ«‘ô$f¦ŃôM/E…˘ŃôëKŰ–[x–0ß\hĹ~iSë|a§Ú ×\Ü×űĚ0@üqŹĆ©ü=Ň~ę^¶ţŮ•¬µXË»†{ůb*ă®păé^÷¦é–:\/›gmi±vH"XÁcÔ_zĚÔüá˝VěÜę:›spzÉ%ş–?SŽĂ🆼%qŕ­ONđ¶×Ńő‘%u‘¤MˇI‰éůWŤř}ŻĽI/‡>ęJůŇ5 Z˙¸0DrŁ>ů*>˘ľ–°˛µÓíRÚÂÚktű±B~€qPÁŁé¶úśÚŚ}¤z„Ăܤ*%qÇ ŘÉč?*ňżŚúŚËâď h—ş”ÚW†Ż7©á/q·aÓţúö®3â-Żl5/ ZřQÍŐđÔ yć[‡ś"nŔ Ä‘’HüŤ}«i:~±kömZĆÚöß9ňî"ąőÁďTí<+ YÚ []MŠÜH˛ůkl›wŻ!±ŽŁ± Ç Ť_óýŰŻýj÷í ˙$łR˙®Ö˙ú9+Ľ¸Ólno­Żn,íĄĽ¶Ď‘;ĬńgµČϵ;Q°łÔí×Rµ‚îŮČ-ń‡BAČČEŢ˙‘‹¤ťNwÚÇ-ńDŕ-T€#Ŕ…lxX፠€,á˙Đ^»¶‚ňÝໆ9ŕq†ŽE ­őźi IH©ŞŞ0€ —?ÝňyÜĄŢsůXó_ŰxkÄŢ!ҵyVŐ®.šî %8Y˝ -Ýě>'řť¤ )Ľűm*7’iÓînnŮďĐ~µŢjZVźŞ"®Łemt«ÓÎŚ6>™éRXXYéĐů6°[E×d(~•łŻąŰŢjŢ]®b¨JĘ÷SżźsŠđř˙‹˝âŹúö˙@J5Ďů,˙ŻYżô®Ú;+XŻ%»ŽÚş’e@Ŕč u=YZÉyܖеÜ@¬sĐ 7QÖ—·\×·Ů·áb˝‹ĺµúßńąĆ|Vűľ˙°¤É«â…Ś?´űý}$:EÍ·eWeČ ĆJôŠôű»+[Ď+ívĐĎĺ8’?1laÜgˇ÷Ą»µ·Ľˇ»‚)án©"†Sřtń‰.×üESĎwŢßŔAˇř íöBĺąiWČQxîKçŽ7RxŽî 3âŢŹu ‚ŮěŢ1+đ»ľn3ů~uŘŘxsEÓçYiVPL::Bˇ‡Đ㊵©i–:¤"-FÎ ¨ÁČYŁ ę3Ňź·\Ú¶Őš×Ě^Áňč’wOO#řźq埆¦¶•&…őX°črPy®—Çň%ëźőç/ţ‚jňčújÚŰŰ _łŰ¶řc1)XŰűĘ1Áç­\¸†+$†â4–«Ł¨*Ŕő˘łö«ÝKŁýKTźĽßSČüG§M{đŹĂóĹJ–l“J‹śđŔ‘ʍ«öúgĂË­9nZĺV&\˛I{&G±«Ňŕ·‚ŢÝmŕ†8 AµcE@ôV[xW@k;hÚy”ś–0/_^•˛ĹifÚŐ˝<ĚžÎé'˘ZůwÄKk[čsiÇM˛ą†UŰ–Ä}AÉć´|oâýřFý,ďbąžîݢŠ8Žć;”Śă¶Ďá]«Á $hJí1•HôÇĄgZxwEł‘äµŇ¬bwX¤ 2QÓĄDkBËť=˙áË•Ýň5ޱÎx^ëK¶řkŁ.¸đ­śń,GÎ)'$ůć5ôď j}×5f2Ďp¨útrů±Č¤óÚ˝NM+O’Áld˛¶k%X K°}Şú‡´}6_6ĂKł·—űń¡żĐ Çśtm<Ëśîű:őőé[SÄrÁA¶­ŘĆĄią¤ťűś'ĹXí,Ľ  -sd—q< Ů]ŚG^MtVđťŐĚ7±I$°HAů÷0Ć1řŐ_‹3iZ"AšŚ_*/@˝;WS˙ć‹ößµ˙dŘý§;ĽĎ!sź^ť}ëG8{89ÝęČPź´’…¶G›ßčŃü°…bcwnßkhńČRěÝ>Ś8ú×f|u ľ€u·D‹w’Xy›±÷vúçŠę°1ŚqY'Ăz!»űQŇ,>ŃťŢgąĎŻNľő›ŻźÄ][ÓĚŃQ•?ᾉkär^Km'ŔM?Dp[^ÎŇ2Ě>\9Ŕ{Ö‰âŇĽ8°ę^ ŐŚwŹ*c ľdsdň6öŻ[şµ·»·h. ŠhŠOŕj…‡‡4]>q5–•eĂŁ¤*}8ŞŽ%)9»ëÓˇ2Ă·m:ő9oß<X`§$z|†«ę¶úWƸÔ%[x'ÓĚi#ś)lŽ3ř沈µšî©mˇ{AJČ ¦zŕő¨µ='OŐQSR˛·şUĺDцŰôĎJ׎‰­-oÄ©Q–­=oŔáţ Ζúdž„(Ťh.^dýÝż=BT§ďYü[ţZyă› 4ďřRĘŕbX® Wpv¶EzµW˝±´ľDKŰhn:‰P8VĎCďQęúŚ:Vź-ĺĘĘŃD2Â4Ü߀¨ťGU(Ű]áMSn]4üń ]řv˙]đ˝’6ÍfXäłÇ@á‡ôü+Óo/´źřF5 Ś:}’$E–$ôč:’y®sGYü]ăxµÉl§¶Ň´řŠZů鵥sŐ°{súWs«i–Z˝„–ZĄ¬7v’c|S(e89z×;¨Áď××ţË 7%·OAú}ä…Ť˝ĺى-çA$n;©ĺßŃ%OG"‡F× VVäő[x"¶·Ž xŇ(cP0Ş@ĄA¨i–:Ź‘ýˇgmuäH%‹Î‰_ËqŃ—#î+Śë+GáÝ9ăҬUÔ‚¬ PAúWG¨Űř/ă~±.¸ßf°×mŰÝ?ú˝éü$öďúW±Ő=WK°ŐíľĎŞY[^Aśůw >¸"€<Źâ†±că/řSĂžť/î"żKë‰ ;’$@G,=r*ŐÖŔ˙†„Đ2:i2cţújô @Ň44eŃôË;˙{ěđŞú9«¦ŘɨǨIgn×ńˇŤ.L`ČŞz¨ldj·^[űA[L<;ŁęĐÄҦ•©Es:¨Î#ÁăŘăóŻR¦ËKG*+Ł 2°Č#ÜP›xďâ†ćř©=–Ąos5í›Ç ¶é t#•ę1śźĄrÚe”Ú‡ě©ö{T//Ůd($%Ë9Ŕú)Ż@ń'„t ;Ă ąŇô=>Ţńě.1$ĘŻ“t gňŞßâxľh1O#„—(ë‚?|ýA  ř‡á«O‡tňj¶âX,’#ěČ]SBőÎEqź ôűź|ńeĄŞ7Ú®onŽKmŤ±Ź^1^Ă|5 /˘Đ4´Ľp™mP0>ąÇ_zÔÓôű-6)#Óí-íc‘Ě®°Ć3ž¬@ęN4ŕ4ż†Ú§…ě˙¶&{=ZŢ1ä3ßË/…Ü3Ó8ŻGđčđ'‡üw6—5¸đěÓç’IXŮÉ A-źjču?xoU»7ZŽ…¦ÜܲKn¬ÇęqĎăWĆ‹ĄŤ,éŁNłqű/’ľV?ÝĆ(„? ŃÔ´Ë R‹S˛¶Ľ‰H©€q@YđsÇZż€ě4ÍRţ ?PÓÁ<ËaµŹ8>ß®jŤZ…´ú‚üKi(¸Ňmµ5‘ćŚâú|¤~Učş§ü9ŞÝ›­KBÓn®OYe·Vcő8ć´Ž›btá§›;cbgŮüĄňöúmĆ1@]ń›ÇZ ˙u-;Q‚ňîú ‘Ĺo8$ǵ´«ż §Âß Xř¶KAiy¦Ű˘-×Ýf)ëŘ×Qeŕď X‰ĹžĄÂ'R’lµA˝OPxéíVď´ "˙M‡O˝Ňě§±…BĹo$ É*ăŇ€%Ü]0Kx®ăyô ł^ˇ§ŘÚi¶qÚiÖĐZÚÇťŔrrp’MG•§ŰËw$6±ÉvspÉ1éóś|ߍxżŤtĎ6óÄ~ń :>¬eŽKŚ XrŁ÷>ë]–…ăŘôφ:żă&’ î”#í–vÉ ŰG÷€ řÖü^đ¤W_iŹĂšJÍś†©ÁőpjźŤĽ"ţ&Ôü:^X“MÓnľŐ4$ĘT|Ş;c#źjë”îPŔ‘žkĘĽzřŰŕ<Śţęzőj©q¦XÜß[ŢÜYŰKyn†w‰Yă®Ö##>Ôçäáżű A˙ˇVĎÇů%>"˙®+˙ŁşýCM±Ô–%Ô,íî–'F'Ś8GdpG­>ţÎ×P´’ÖţŢ›iF:0ëČ<ńj·¶~řw§‹ů´ÝPHăÔ.á;YT"`ně0XţŐÍ|^˛đNťáë{ L׺ŁÍ´«tó”ŚY‰$ ôŻŁ.ôŤ:óM}Ý…¬ÖB‹y"VŚĐ#UOxrŇÎ[Km LŽÚR ‘‹dÚřé¸cźĆ€8O‹`|6ČĎüMţ«]Ćźů%ľ"˙ŻoýWUy¦XŢĎm5ĺ•´óZż™ËłDŢŞHŕűŠ’úÎÚţŇK[ëx®mĄ^)P:0ô đh€ŐĽ<Š( Š( ŠĘ´ń™wŻ]č¶÷Jú•¤bYˇÁĘ©čsÓ¸­Z(˘Š(˘Š(˘Şęš…®•§\__̰ÚŔ…䑺(jŠâĽ1ńIńř·±łŐc‰ŁiVęâÔÇ *Ś’?ΡҾ(čzľµźĄŰj—I,˙g[¸íIvq÷łÓßÝŃEQEQUu=FĎJ´k­Jęë$®~µĘGńOÁO?”ľ łÝśd’çŚPkEdk%Ňt} kב¦švíťrÁ·tĆ:ć´˘¸ŠKxçIĂ"†FÎĄKEA}w…ś×w’¬Vđ©y$nŠsMÓo­µ;/l&IígPńȇ†˘€,ŃY×ZŢťk¬ZiWqG¨Ý«4óH$‘ůĘ´h˘ŠĂŐ|Qa¦x“IŃ.DßlÔ÷ůW+ň‚Năž:PĺQ@V/‹ĽIcá]ęZۉ/Ý.ćË2(jŠÇÖ÷ĹÚ—‡!˙hiń$ł@k#<ýáÚ€7¨˘Š(˘‘ÝcRÎÁTu$ŕPŃUu[čtÍ2ęúçw‘mJűFNŐ8¨<9¬[xDłŐl‚Úé‘ů Źq@4QEQEQER#+¨d`Ęzr+ Âţ)ÓüI>«ś' ¦Üµ¤ŢbůÔqĎ#ŠŢ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠĎ×ő›JźRŐ§YĂŤîA8ÉŔŕsŢ€4(¨-o-î¬aĽ‚UkiŁYRLŕ2°Č?ŽEO@Q@Q@áżéţ!żÖm,â]*äÚ\yŢ o<Ź”ÖőQEQEQEQEV>'°›Ĺ×A7ö„-Ă’ż&ÓÓ= Ü Š+Ć$±đž‡.«Ş Ť¬lŞDKą˛NµEck&Ň´eÓŽ§t-˙´$X­Ă);Ř㎝ElĐEŐ™•X˝@=(h˘Š(˘°µŻéúFż¤h÷bswŞ3,Čë¸çŠÝ˘ŠÁ°ńNź{âíOÉ˙´4ř’Y‹ µ‚‘ž~đí@ÔQEQEQEQEQEQEQX>5ńVźŕíűSV›o5býĘlśăŚŹJޢŠ(˘Š(˘ŠBę)`ňy4´QEQEQY6>"ŇďµŰíÖédÔl”4đŕĺéĎC@ÔR+«3`Jđ@=)h˘Š(˘°őŘi^ Ňtkˇ7Úő2‹•ůFNăž+r€ )7®ý›†ügnyÇ­-QEQEQERo]ű7 ŘÎ3Î)h˘Š(˘Š(˘Š(˘Š(˘Š(˘Š N ŠEeu „2žA ŇĐEPEPEâOiţÔ´[+ń9›V¸ű5ż–€€ůQósŔů…oQY7>"ŇíĽGkˇMt«Ş\ÄfŠ ˛ 󞝏ĺZÔQEQEQEQEQEQEQEQEQEQEQLšE†‘óµ±Ç ¬źxŽËĹz:¶–&˛–U®Öŕŕń“@4QY>ń—â8.&Ńî–ć;yLĂŽŁšÖ˘Š(˘Š(˘‚@“€)(e ©äx4´QEQEVVźâ 3PÖµ &Ňédż°Űö€9MĂ#žő«@Q@Q@Q@Q@Q@Q@Q@Q@pĽ|޸ѷY}Ş Ů&|Îĺ ;’p+ĽŻ*ř˝Ëăo‡« żÚYÁő#ůP˙…őĎL×wŢ,Ň,4ť";vť6Ě^TÇ$?8ŕgµs¶~:ńŻ,ĺŐü/á«'ŃU›Ę7s2ÍpŁ©P8­vźmg˝řâ+{E-<–3UęÇiŕ}zW—|*đŐî·ŕ}6ăLńć­i'–Ö°ěŰĘúĐy¦|@Wřuâ]> \YG šÖSţ®T(O§#źzç4?řŰĹ:<ź†Ľ3bm61îç+ćČÎ#€ä}*Vđm·~xÂŢ×R—P7QË<’H!ö`Ž+Sŕ>ŁguđłF[y# lŹĘ(áÉ9úäĆ€4ţxŢč·wWía{a#E{nç>S/^}:×3aăĎx©înĽáű4xdhŇćţb¦r:•Ś~µ‹đý[\»ř§yĄ¶ű;Ů VîťÂ8$zç"şź€ö· 4űxťVâͤ‚â.Ť†'‘î?Ťhx Ç©â;}RNÉôÍ_J$^Z±Ý´ üĘ{Ž+žŃ|măŹض­áŤIţÉge]ܰ–@3ÁTž S㍵KWÓ˘‚+y&qÝUUąéÁSůSő/_x^;˝[áŢľÚ| 4ď§ÎŢe«ŕgŚý߯ë@>=ńŢ—đÚ=S[Đ줻ibYl'o65%ŔëŽqÖąźŤÚ®ż 無Óí-–ĆmB١c1YÁFĂřS§5WÇľ$“Ĺżíµ‰áÍ5Ě"D^›–\=¸­_Ť,±§ĂŮ…Ť5›ff=qÉ «ţŤW@𶧬řęĘÎÉmpcK9LžfxžĺÍGă?Sé?ŰxSOţÉ)ç, pßhhúävÎ9éVżh«i®ľÜInÖÚćĺ3ň‚~ ţÚişŢ›/„`ŐVâěﲉKîůB…ä~(|yo}đŇçĹzTAü¨YĚśmu8(Ř®Ă^;ńo‹Ł°Ľđ÷‡¬ÓJo-nnnĺ*Kqćů`§pőĹr^·’?€>1şee‚öććâ Śe0‹‘ř©ü«ŐľF‘|4đŇơA±‰°=HÉýI  zą×Ĺi#M´ŠK[X¤7ż˝”>V>‚˛n|wâo^ÔtďhÖ—iĎĺ\^ŢĘR6“űŞ3ůÔ>ľ:xČ)Á6ůŠâ~hşŚľ"°Ĺş–‰m¨ĘÓY@ćIĎ\ŕŹŔzШxÇo­I«iÚíŹöfą¤äÝ[«nRČu>„1X:/ŤĽoâ›Ő|1 i_Ů%Ůbw %Śđ@łáÇá˙ßkwž ąŐo® ĚnB´`qč+ Qř{á„»Őľëí§C†ťôůŰ̵~3Ć~ď×ő LĐ./îô‹iő{4˛ľṵ$›ÂL÷¬Ož1‡ÁÚT3›gĽľş”Aij‡YAžÂźđĎIJx·Á–ĹÄ"¦ ˛*ôܤ‚G·Ćüi‘4˙řWĽ;tŰ[ćIť‡Ę…€ĂŰ4şźŽ1xźGÖ]m ÖÚ;«9¤ůQnůsÓťÄ}W·ńcŔľŐôťg_˝·i58lśÇ(™€Ę)+Ŕ8  ‰Úťź…ţĽöÚeŤő•ą†í%‹n࣏nßJă~8ęúňiľŽÂŇÚ-:âîÝŐÄÄ3Ë´‘^Éďě+Y˙“XÓ>±˙čó]ĆĆřWŔň9ŰęvŰô»jßńĎî~x ř˘ÂĆĘEµo$ZLd 0sśôíTţř×ĂV4 [Ýn ­UdŤĺ”ú]WĶ đű_*Ac~‡Úą_…ľ đĹ˙ĂÍę÷@Ňî.eµV’Y-‘™Ď©$s@şÎąĄëźü.‘}oyv÷ í î |ą85ÜĹâë‡ř§7… ´BÚ;v'ÉŢNGéŽk†Öt=+Cř÷ŕ´m>ÖĆ9-îÖŢ Ź—'' dK_ÚMľĐËÚtp"ÜqĽç·ýň*ęţ!x˛ Íáä·¶Šq©ę1Ů9rFĹcŤĂë‡řËŞ¶‰ń/Á7ńÚËy,BaĽzG`UT}K źă¦Ło˙ €ôĺ• ÉÖ!ś 9!źĚÓ~-^Úé˙<s~Ę–é+v8 IŔ'ĐA  ş§Ź|_áŹ#Pńo†ěˇŃ$‘c’[K‚ň[îŕĎźĄzťĽÉqsBÁŁ‘C«ŕň+Ďľ=_Ú[|0ŐcžD2\„†ÎKąaŚý3řW[ŕře·đ¦Ź Î|ä´‰_>»Es˙Ľo7‡otÝ#FÓ˙´őíE‚ÜľŐUYʧ_ĘĽËăżâˇáX´ßh––Ëuu‚ęĘbéą[%AĆqô®«ÄsG§~Đ^¸ża˝Öžöđ;đľnOő=??i+ëHĽgk,ngż„™çĺÉ-ŹLqřŠÚńö»‹iá%“M´ľű]ě0pąňI_ľżí w‹Ľg«[xşßĂÓmŻ5W·űTŹw)HăLŕtäž+ ăü{řţÂĐčŇřăŔşwŠu/ˇż¸Ó5ëDŰ夛dUä€G§_ĚĐŻj-¸˝¸ĹzE…¤)hî-',®sÓiäqĎZĺŰâ‰\zç ­rúOÄŻ3á<ž2Ôě•7łÂÇ·ěQ“Ó$ІÓÄf‚ŢôxoE’Ň`®!K¶…=2ztöŞôŰ _ŕťľź«˘=•ËKŠÍ·9~0}sŚ{Öol˙íw:n±BKk«i6Ka‘‘Xž ׼EŁü@ń-ô:˛Éj×ר»dvlóôő  ‡~"S»ńa:}žžš}óG$Śy¸—~+OńV÷7^ đý‹éČŃ%ÍüĹLäuÚýk3áő´·–­íÁ3Ky2 I(ŘĐ~Ďz…­ÇĂ :ÖE¸˛ya¸‹8(ţc7?PŔĐżĂĎ˙ÂPş…Ąő‹iÚÖšţ]ŐŁ6í§łÜW)ˇüHńWŠ%ż´đׇm$ą˛¸x§¸¸¬* w,@ÉôĄđ$±ę|i¨éä=”pGlҧ*ňŚgźQ‚*ĎěřŠş[Z¸$úýŃ@Ţńľˇ¬xTđď‰4ČôíjÁVB!rŃȇ©?QëY69ńoŠ.u |˘iʦZ\5¸–úv+/\Ś~4Y˙ÉĹęúDÎź«|;’ßQ»×|ŻÉŁŢ\±šXC -¦n§+Óž}qž1@×…nőkÝ!%ńźź¸«Cľbŕ>őŻ\/ĂÉŻřF}G^k[Y¬¦{{™…„•ţ OWoo4W$Öň$°Č#ŁVˇuću]A4˝#ĂÚ<Ć ˝vím ŞpU óřŚűfş?řĂ>Ňc¶‡O´!T ..YĺnĺúúW'ńî+‹Ľ7â{xZhô]A&ťTs°‘ţük±˝·đ÷ÄO IJȗÚUÁYG—!S‘ČÎ9wCŇt=6âęMŇĆŢ[Ť¦slŞ ă8'Sů×'ŹśŹĚW/§|Oń˝}¨é^đý˝Î©gu$r<˛‚8†ł»îăÚş|?Śg×®ĽCy«j2Ú›wAŘJxôÚ+#ŕhŚĄ 7¶ł"“ęŚ3ůĐWŞj~+´đî›%ž‰iy­Ď…ąO˛999$v®rŰÇ^$ŃüW¤i5ѬmˇŐ_É¶ą˛°q…`}ČŤ;Çšţ»qăý/Â: ôzPą¶7S^´aŰ‘µqž?Zâ> i“i>đ­ç‰Żµ›¶ÔŁ‘˘ą+†ô‚Ž™çň «Ä_ňr>˙°LźűZ Ńžć?Ź?{ŇKµÓ`1#ś+8Š,ěMOâ/ů9 ˙Ř&Oý­Nđ§üśGŤżëĆŰ˙EĹ@WĂźřau  [kČĺxn RvŔűóÓ|asâ_řŠĘ XWIŇä%ČbZY{ŹL ĚWźkZÂü0ńÇ‹Ka,µ‹6Ô-±şčWńcšî>é Ꮗvłj2,S\+_]Ë) ‚üĺ‰ô öĽsö–Ôu‹O$6pÄşdóF“\y¤I»$… éňç>Őëz}ő¦ĄgŢźs Ő¬™)4.ÁäW–ţÓ€ź†ńü$űpôł¨ÝxžçÁ^(˙„§NÓě•ldň>É9“wČŰłžťż:ă>řŹĆw>Ňá𯇬汳‹Ęk‹ŮĘuŘnŮŻSń̉/5ljŐѬ% ©Č#a¬Ż‚ȱü/đřA€mĂ©$š“á׍ăńfŹ{=ĺ©Óď´éZز#aśśúp#\ŐźŹ<_âeąľđ_‡¬¦Ńˇ¤s^ĚČ÷ęT cő¬?ZĎzźí,Ô›™Ż.˘‰GRÇÎ~uKŕ燯5ĎZ>›ăŤSO0łG-”1 n'<óÖ€=cáç‹áń†Ť%Č·kKŰiM˝Ýł¤F{ŠŐń.µiáÝóUÔ­µ˛olu>€{“Ĺs˙|„[Vhµiő9ݦYf’P ‡úw;«7ö€´žóáv¨-•ÄRV 2v†ć€2íč[•8=b®ŕTj5HĚÚÔ ź`ď@~ ń¶Ą⫿ ř§K‹OÖ í`ĽS&@$ĐóPëţ:ŐçńedžüĄA¨_Z {»‹© Cz/“řŐ Żů8»űżó®7Âú-ÝßĹ_iăÄ·Ú űÜ,čm˙IL±Ď>›‡ýôhŇ<ă{űß\řkĹZlZn»bxÄ.^)ăţň“ţx5…˙ 3_Ô|I­xĂÚ7šťŤÓIJI!XR%ă{źRxŔ­máŮÓüekŻj>'ľŐoŕ…ˇEą ’‡ÜТxzMRmÝőč-ŕÔýôvěYç±5Í|DńĂřfăNÓt»ÔőÍE·µ ´`uf=‡˙^»jňM™űBřf÷QeŽŇăMkhds…ówżőů—óÔxSRńÔú˛Eâ}K¶°tf3ZÎĚČG@A'5Ť'Ź|GŻëz…—€ô[;»]>C ×·˛•FuUν5ÝYJ‡]Ěz×”~Ď3Ĺmˇk<ěR˛Ô%ĆÜ?'†#ĐŕţT˝ŕO\k:ĺ÷‡ĽC¦Ť/_ł]íľčĺOď!üEaÂÇńŁâÍwĂľĐ-®Żl. k4˛•‰cn|ö\Ë­űJE.śÂDÓtŁۧ!\—ŕź_ťEYřL‹˙ â3ăćűx\űe¨ Š!ŹXźĂWŢFń^ĺň!‚oÜ:Ivc÷@Ţ´´źxŠÇĆš‡üiŁYٶ˘¬mn,ĺ.…‡U9ü?1ëUíŐOí#rHA˙ ¦|Y˙’ťđĂţż.?öŤ_ńżÄ-KBńŐŻ†ô˝u‹Ë5š 9Sćaó@\ć˛oţ&řŹÂşś~4đô oľČÚtĄüÉ;FAîI>őgSEoÚGIÜ3·Cb>ľd•ĆtWńŻĂ`Ă#ű]ô8čÚŻŹ|cá·˛ľńG†ě ŃnfHY­® Ën›»~•ÓřĂĹÓhz÷…ěm­âš-bŕÄîä‚€r?:Çýˇä™Ý×ÍżţŚZĘř˘ëm®ü5şť‚[ĄŕFv8˛.(»ř‰â |+ŕÍKZ¶‚9ĺ´TeŽBB¶]Wś}k Ć~=źĂżôź­śSIvmüČK(‘7};U_ÚR¶´ř[ŞA,¨&»1Ĺg–>b±ÇহżŠ`7Ŕ˙ Đ˝€˙ČtŻăOĹĄ>»…¬Š©çyR\´şî p9Ć+WĹ~2´¸řC'‰ŕÓŕľ¶š˛] ˇ%•oˇĎĺ]?‰/‚µE§Ę˙¶fĽY?äÓ#˙u˙ô­¨_ăvł¬Ź‡CiövĐi—˘ÔĚë) ŚpëŻ÷r>Őł­xÇĆžđŰęÚŢ…Ą‹Xe…XApÎŢ[d3}GËůšÉřĂ˙$KĂÍŮ^Ä“č6W©ęşu·<1q§ĘU༶ňň9+Á ë^ µÓ<'sŻ3+ÚĹmö…ç‡ă*3îHŤTřw­ßř“Â6:ľ©k¤×jdXŁ$€™ůO>ŁźÄW„Ĺ«Ţk~Ň>JĚš¬zˇÓîpyŃśîüđúVŇŢ+KXm­G(±Ć‹ŃT ?@‡Äo/„ÖÂŇĘÉőkQ.ÖŃ7złĂ‘PřcTńôúĽř‹BŇ­ôů--µĂŹŽś×+ń hôżŽţ Ôµ&Ř=Ľ,ŹÂ‰>q×ęéů×±y‰7®ONzĐĎľ×5ë/řűNđľŹýěúĽŇ´·l†%8äŽI$ôŻCđŤőKŻÍáŹipéú˛Áö^ŢBńL®3Đ˙¬o‚¨żđ—üI||ßŰR.}·ÉRë_ňq^˙°\ßÉč¤ńF«ăµgáťĘâŘF®o/. ©'Ş…äc×˝UđŤ5 c_Ő|?â=2=?YÓŐda …ă‘ ꍮkGÔĽKăďř‚5öĐ´˝.ăěË ´jfóó1n@ă·ôŞ Ń!řăâ+tŐ®5s’D÷S°f,6ĺr8ŕńřPÉřŤâ CĹz߇|= [ÝßXÎTM,Ĺ"Xń÷śú“ŔŻřWÇ:ËxÔxWĆM˝ŽĄ4âÚ[Y Ç*Śäsônýޗ´_řXżß7ŰPgŰ™âďů8˙bźů=K­|GÖ!ř…ŞřOEĐ⿼…"kw2”_š5v2ŔníSi>8ń‡Ś4íĆş=ťŁjA…­ÍśĄ°ÚAÍPđ˛űFxÍĺl-ń˙~á©ţ-ČýđçţÂG˙e  ŻxŢëHÖě±˙`¨żĄ‡Ćţ+ń©ŞÇŕÍM’ÇN¸kWšúfV‘×®cŤ&™˙'¬Ř*/ć*]oáŰ Zď]đ>˝6Ť©\1’dFo3çťËÓ®}h´đťćł{¤ůľ"ÓˇÓďòˇ—ĚRŁŁďé\_í˙$şűţ»E˙ˇVŻÂ?^ř«Ă÷o«G ßŘ]˝śĎܨpüë+öŚ˙’]}˙]˘˙Ш׏őčôXüšeť˙Ű/aZára'hŢżí Ôž2ń®©eâŰO xcL·˝Ő§€ÜłÝJR(Đ}9'Šçľ2}ď‡öůĄu~:đ6™â»Ű{Ĺ˝źN×,×ŢZ˶Dôäţ´h:§Ž^[ČuÍLFH Á-˝Ń #öCś‘źZóʇ:ĎŽ® Ňíő BÚ1%Ô×2ŠňÇ$ň;׬kZΡńÁ^%ŇŁÓő iťł›â•YNO^ÇŠč~Ę–?üa|Á/g¸[đ^#’1ëĂ-CńöÖoŤŢ¶‰Ńîagiś•ůö:đKťkSŇ~?ř®- KţŇÔní­ăŤöFŠ"YϧďuäľEoÚ+ĆŚG̶6ř>ź»Š€44Źëö>.Óôčö¶rj ý–ćÎRńłá ô«Ţ5ńĹćťâ+O řcMMO^¸ŚĚË#ěŠ˙Ľć±ľ,˙ÉBřs˙a˙˛×/®éłÍűA_ŔúíŢ…-í‚ýšć flmýß?î“őZí´/ëVľ,µđ÷Ťô«k «ä-gqi!xĄ#ŞóĐţ=ĹWńGÄŤKLńŐ׆4˝j7Í ohĘîf勞@ĄO†’ż4ŤKWń~Ą¨Ë§ÍćAŔLdőëůTTjß´F˛äËĄFôÉ  ›Źęľđeޱă‹K{´”Gµ“–óIű«’O=X7ľ:ńĆŤ§G®kž±ŹCůZU‚v7ˇţ"ô¨żi›iĄđ~•p¦E¶¶ÔŁyÝLjU€Ŕ?V%řy®č¤Kń W»ÓnâÉ!GB3@ť¦_A©éÖ·Ön$¶ą‰eŤ‡uaZÍńuţ±§é©'‡´¤Ôď^Q”óyj€ó“č1úÔľŇ"Đ|5§ivóµÄ6°¬i+c.CĹq?|G­§ŚĽ?áMę-6MM^I/¤@ĺA8PxÎţ$P2xçĹ^×4›očš|6”ÂŢ;›)™Ľ·=×ô­˙¦đw4{ôÓ|5äÚ‘“ć4€€Ş;rOZóĎŠú\ú5ď…-ő_ę÷“jqH-î …U ˝9`?]ÄÖOŤ>Ţ3µn}p(Dń‰-4íSTńÎť§ézu´tg”Čř$7=zcëśÇ>:Ôt–×´Ż XťDŽiŘ\Iţ Ąoüs´¸˝řSŻĹh¬Ň’R]‰"łăŞOá\—Ľ+}®ř;MşÓţ jék%şˇ†0›b `§áŇ€=;Áľ#´ń_‡m5{ Â)ÁŞ08e?C\í9˙$ĎţßbţM]ŹĂŹ Űř?ĂͦŮßI}Nóy®98qî+Žý§?ä™˙Űě_ɨKźřëű1µËO Ú'ś"’äýĄ˘ë»€qÎ0k¨ŹÇšK|?-,ÂĂĘó ěăg×µđ­ýË^YŁ´N\$ňNWĆMn«ńu+EŐ|?Ł›\,ŹmrÁáSÔśç8®3ÄšżŚ?áxX[ÚiÖâ>V´·{“±âf`dcَޞ­ß\ř—á~§ŁE6·ýąáëŰĄłX®ą¸‡=0zţC˝hë.±ţŇZ!‘‚†ĐŮTž2|Éx HĐ%Ô¦Ňmä×-ŕ¶ÔH>lP9t_ăőăČxĎĆšťŹŠ¬Ľ3áŤ2 Ý^âpÍs.ČŁAôäž+ľ=+‹ń×´Ď]ŰÝ}˛}?[ł_Ü^Z˶HÁÎťh_ j>1źT’ŰĹ:6źml#.—V“–˛>]§'őíLřsâ돶ş.m˘ű:ůíË$ď HÉĎ~+ťđg ń5ě¨{_µ[ŢĆ»\(Ďßĺ?§­Ađ"D‡QńĹś¬«s±+4dňćý(«>,ś|PO }š/ł›wçäďČ c1Ífé!–çâ‹´Ű Ä^ŘÁ$ŕě{’G 펂°,µ{˙ÚRtµ‘$ÚSDĺNpŮRGáš·ŕ_ů.>:˙®P1đÇXńĹĆżâŮl´Ý6ęGÔ±v'ąe°ČÚž úW xÇĆ×ö~$·đ×…tČő-nHüé<é6E~¬E`ü‘Ä?"fA«ą*O8ÜőĎęZ]ÍĎÇ˝fÔř‚ďBšöÖ7¶– f`2~„ăÚ€;_řëW‹Ĺ±xkĆÚ]ľźu’Î{Y Ĺ6:Ż=ăMńŹuiĽ_?†|ĄA¨ßÚ {ąîd+ 9Çu<І†n|OŁęÚż‹µJăO—Ě‚;€ś÷*>¸ý+7á\ŃŘüYř‡azá/n.Rx•ř-Xńř:šĹÔu­gPřÇŕ›/éQéú…´’śĂ&řĄVFÁS×¶1^ňŮ vŚśp+Č<}yk7Ç?[Dč÷0ů¦@J†VŔ?‘Ż` łÖ¦Ş‘ŘĂ'Č$ŔßótÖąď:ÇűIř¤HÁLš\A3Ćî!éůʗǒǦ|kđnĄ~Á,f†[U•ţęHsŽ{g P—ţ=ńo…$´ąń·‡ěcŇ'”D×63 é¸çôŻT†Tš–& ¨eaĐČ5ç´%ý¤ 5Yťâőâ†Ţ,üÎţb·@¤˙úëµđťĽ¶žŇmîGk¸=A 2(›ń·ŚŻ´Ďéľđîźöµ{źɲ8ŁŤÍŽzůW3/Ž[›Z+K[”Źp ±'’pMXń_Ž5(\źN¸ö>•ÚXü6xĽW¤ë:Ż‹5 NęÁ‰‚;€ś‚9s@Žť¬řâ_‹ş÷Ů´­1ďⳊ6µ’čůqÇ÷”†îNîxŻqÓšĺě-Úţ8â»1©•#mĘŻŽ@=ĆkĚĽ:ëíâĄv ĎanT÷°«śWŞĐśëţ7ÖćńĄĎ†<ĄÚ]^ŮÂłÜĎ{)D@q€äőć·|%¨ř¦ăí©â­"ĘČ¡˘–Örë/\ŚF>µ—ă/XřYţŮҵ;Ť#Ä0¨ŚÝZÉË`p{ńúzÖĂŻkłř“]đ—‰f¶˝ľÓbWKŰq"°Üň({áW‹'ń§„ŁŐîí˘¶•Ąxü¸‰# Žy¦č>-¸Ôľ!ëţ’Ú$N†9e's–Çt®cökš5řrmŮŐg·»•eByCÇZ«đŰQ·Ôţ6řââŇE’ q‡SJ°  m>%x“Y×ő­Ăľ¶¸ľ°ş’/:YJ±)Ŕ,ĽNxµŕ˙jw>+“Ă.ŇâÓuŹ+Î… “|S¨ë·=úţFąź‚wÖ±üBř…e$·rß™Iĺ•^@qô$~usÄ×ę´'„íěX<Ú}¬ň]çb˛0ţcógQřŹ­·Ťőo čzWÚ…ąS´Ą&2í!í‚T uÍZŃČ<»”ś´ÍÇË•÷ŻHż»†ĆĘ{»§ (dv=€5Ë|!–9~xpĆęŔZ"śň8"­üK´šűŔýµ¨-4–r©8 3MńÇŤüMm&§á_ Xcna ßNVIŔ8Ę€@­u?–;Źľ1·ľ`—°A%±~<Äą ëŚcđ5[ă5ĺ´ź>Z$×QęI#¨<…2Fh©ŐőřŕřŢhgLł’K‹_2ţú0<Ď•OˇŮúŐ ˙ř‹Tńf­˘x3H±źű,„ą¸ľ¨,{*Ś^jŹääĽ/˙`™öµjř§áíľ©®MŻřkY¸ŃućůešÝ÷$„q‡^ýG·JÝđÖŻ®f_ÜřÇN´Ó  /ľ ĽÄt ’ŢŔb¸Í3Çž5ńJIá Xť9Xĺż«ĚpýjĄ¦˝Żx‹Á^>đöŻä\k]´°yöŁĺź({zńŚ{×QđCQ˛Ľřg˘­¤‘ćŢ/&T”pNA ńڵM|%îťoćŻp¶÷1y…„Žvžő˝ă˝r_ řCTÖ …&–Ň/1crB±Čăë\?ĆÉRWŔ·’:‹hőe &~Q‘Ç?…iüyÔí¬ľk+,±‰.Qa‰KrěXtú źÂ€Ä&Ňü!áÍB 9nu]sËK{o3laŮA9cŘdUŤTř‚5kXµ­Hű­‰&µąmĐŹRsU¬<1¤x·áo‡4ÝkŹôHĄŃöÉ„2ţ­`›Ď|:ń‡§_ë#]е+ŹłF.úL'ëŐ‡×4µŞxŰÄ:‡‹ő=ÁşMŤĂé~Óq})UÜĂ8U=ú×OŕŰďŢCrľ)Ň­l'‰€ŚŰMć,ŁG§ç\˙‹>[ëäş÷‡µ‹Ť_ŔI.-ź+!$^ü? oÂĎ랥®č>#kyőEFş·IŽ™ăšî5ťJŰGŇ®µ çŮmm–FöĽĎOńŻŹuÝ<ë…´˙ě†Ë—WO2ă=¸®“ă-¤÷ż őčmUš_#~Ő$ « ő[ď‡ú-ݬń t´Es¸UĂé‚ róüQšďáµ×‰´]5ZîÂQő•Á;ˇç Óž2Ó5Ý[ëö“xU5ŕŔYµŻÚ˛OA·$Jó/–¶Ţ ›âĘÇżFŐµ ’<Ź–TmŮ#ęő®%µ›Ë_\|8N°ua¦ ĎĚmŘîÝôířЦXüM–/†ăĹ:Îś±˝Ô퍤 wL3„ëÜ ©¨xďĆľ´‡WńG†¬bĐŮ”Lmg-5ş±Ŕ,ݵe|uŃ×IđŹŕ·’K]?M˝Š9's €řöĹl_ü8ĽÖôw†÷â­w¦Ü ,Ë(ëÁ>ť küFř‡…4ŤUµ/,uŃYąČ®íĘ;śv«ÖĽa¬jI>ݎŮiş±—Ź2–¸ÝÜ3źĄq?ttżü?Ň’SsoĄ !Ű:…ĆxŻZń6¤Ú?‡µE"ó^Ö•SűÄ”Ćßkź^k§Ó|/ĄĄ¬.Áćč™&őŔę*÷…ĽtxĘ×PeŠćö8ä¶găĚL)Âúń˙ šěĽ=}âŰ›MN?éZ}H Š[I‹‡899Çç^[đcÄ,ŰŘxOB´¸ŠŐßÍşľ˘3ťŞ_­{Ö˘ęl.Ô2–±Ŕ<ô5çźłśjź l6ŚnšV>çukü8ń´ľ(—UÓőM?ű;ZŇäÜŔróś?¬ß‡ž*[˙ x—S·Ň¬¬ZÂćç÷VăjĘČ»·7ąďT>˙ÉhřôůVGÂOů&ľ:˙Ż«ßý@řăOhń_xgĂzxŤYĄ»śŞ3Ž«ă§&şź‡~6oiú§öť—övĄĄJbĽvĺ^ ܧňŞ_ŃWá^Ť´cpr~»Íc|.….>!|S‚Qä»…{04.™ăŹx˘ÎďSđ–…¦ť&^8ŤěÍćÜmë´çëZźüe­xÖÂ}CQ±±µ˛V1 …ŘÉĽu AÍy˙Ă+ŹEa­é~Ô´ĄŃ-ŻĄ†Ţ]Díš2y$ í“‘žůŻWřiá8Ľáôčî~×3;M4˙ßvëŹj«ń‚˙WÓĽ ©Ď˘Á „Bţ|’I´ĹÓ–QüGÚ±ţ_xĄü;ˇ&§§éŃčK`….–ŕ´¬ Ą”ńĎzčľ,~ř”Iű ĽĄQđ"ďzU˝«,ş@‰JžŤĺăůĐźŹüQâ«»Çđ&‡c>•m)‹í—ň”0ë´ c˙Ż]Ăß?‰nu3U°:n»§0Ű·)Ł)î?úŐű9ŢŰżĂİ ©yeq,w7 ¬X‘‘ôăđŞľxő?Ú ÄÚ†žÂK;m9m%‘9S)dă>ż#~TšWÄŻř‡PŐ4ż řzÖ{ë—ŽI¦¬ 8B{–$7‚·Ľă›ű˙]xgĹZ\zf· ~r¤ßÉę¤×3đP´ňč·żÚ&}¤ŕ˛dŽ=pô*µŞÜǨţŃ<6 ˛>ź§żÚŮ9Ű»$)÷äĆ€:? kŃß|Eńv4ŰKw°nşŚbI÷)?9öíXŤńÄž!Öoí<ˇZÝŮŘÉäË{{)DgBŹçQx!Yţ.üJTűĚ–Ŕ}vOŮÎîŢ? ę:[Č‹©YßĘ.b' ’xb=ü(WYńƵáĎĂ}â Öî.ŤOÜž‹Ż­I§jßSQł]SĂÚ3YM*¬­mtÁáRycśçščĽa hţ+ŃźKÖvĽ7ĘV@¬®;©őŻ4Ôn|Iđ·QŇ]l뾼şKQ ß7?ÂÝH€=ŞŠŞÚŤ’ę `×–âůĐȶćUóGV śăŢ­PEPEPEPEPEPEPXÚ߆ôíkQŇďŻă‘®4Ů|ër®T÷ëfŠČÁé^©|%đĹćˇ5ä1ŢXË1Ě«gpŃ+źp+Đ(  Ä~ÓĽ/đ§_Óôš;˛Ë!Ü噯$“ß\ź€~xw_đ&…¨\Çuosqf˘smpŃ »|ŔpkŮn`ŠęŢH.cIamtqĂĐŠK;h,íŁ·´‰!‚1µ#A…QčRđxwK‹NŃí–ŢÖ>Š˝ĎrOs\ľłđłĂ:¦§5˙“ugq?úď±Ü4+/űŔq]Ő‹ ř_GĐtWŇ´»4‚ÎE+"ŽL™%ŹRk’_žPŃÔšëkö×ňľ›sŇ˝Šçµ_hş—†˘Đ&µňô¸ĘŠ)Ť§#‘ďSř›ĂW‰t_ě˝^ßδăhÎHčAěkjŠćü/ŕÝ/ĂşmÝŤ±ąą¶şâT»Ě ăyíŽŐĎżÁď ´­oVŐ›y´[§“śýÜ⽊˽ĐtëżI˘5¸ŹMxĽŹ*/“ č1ҬhÚm¶Ź¤Úi¶*ËkkĂfÉ Ł'˝\˘€1ěĽ7§Yx’ű]‚9ˇ{Ĺ3%JŻLՋ⏆ţńĄýŁwo5ľˇŚ‹YLNßR:×eErľđ‰áČďVĆ9ä{Ôňç’âf‘ť}2~µ„ż<.ˇ˘ ©‹Fëj/_ĘúmĎJôz(®—§ÚiZ|:| ¬+¶8Đ`(¨µÍ"Ă]Óe°ŐmŁą´”|Čăő‡ŢŻŃ@ađŹÂ¶—pLđ]Ý$4P]\Ľ‘&=śWWâmĂÄšúF©5”ŰwŞ1Cň°a‚:rjŃ@®4ËkŤM.UchđvPÜěŰ·ŻŇŁđć‹gáí×JÓŇÎŮJƮœÔű“Z4P¬|)đÎĄ©Í¨$WVW3śĘlî çľ@­˝ Áş>‡áű˝O†Eł».Óîłąe IcÎptTPo‡4[?č¶şVŽ–vŔ¬jěX€I'“îMiQEařŻÂš7ŠěÖŰ\±ŽĺS%đéţëEr+đcÂűDrľ©,¤/zĺ>ŻJ˘€9»˙h—ľŹĂr[2iíŰnTŚ6áĎ^µoÄŇüA ˙cę¶ţ} IĂ)Q€AěG­lŃ@މŕ HŃu-.˝šŇýr‰îČPIű˝OJč4-*×CŃí4Í=Ym-cĆ·ŁÔ÷«ÔP%˙†4Ű˙éşýÄrGOFH9 G~ŐOx#Dńk[ɫۿÚm˙Ő\Bć9zâşj(‚±řOá[G·ZÜKu Â\­ĚłłČ]W,{gµnxŹÁÚ'‰/­®µ«AtöńÉ+±Ű‡µ7„ü ˇř^ęk˝6 ^öeŮ%ÍÄ­,Śľ›ŹntôP7‡Ľ5§hęSi±ČʍOö‰÷9lż¶zW=¬ü-đÖ©©M}äÝYĎ9Ěßc¸hV_]Ŕq]Ő“áŻi~Ó†‹h–ÖŕäÉcęORiľđćťá«k4¨Ý#¸¸{™ąl»u<ý+bŠĆŹĂzrxŞ_¬riɶgŢvě>^•ÉÉđĂ&iZ&Ôŕ†RYŕ†őÖ3žĽ^‹Esrř+CKá­<Ť*EÚŃÄŘ=AÎ}r+[CŇí´]"ÓM±V[[XÄQ†98¦ŻQ@ÜAĚAqK ŠUŃ×*ŔőµçłüđŁ\É5¤wÖ>aË%­ÓƧđ˝ŠĺĽŕ=ÂWÜhöň-Ěë˛IĄ•¤vÎ2}ĹTń7Ă_řT:•ÄŰj ÷®-&13ýqÖ»J(›đŹ‚ôŹ -×öZNdąÇť,ň´ŽřéÉúŐĎ xwOđÍŚ¶šR:C,Í;rÇsžMlQ@¶ţÓmüUuâăjw0¬9s´ Ć>^ť…exŻá߇üM~·÷ĐK Łi¶”Ĺ!äu®ľŠć<ŕ}“ÜÜi‹p×7 Y®&i€ä š˝áŻ iŢĂKŽD· u6÷-— Fz:VÍĚřÇŔú/‹MĽš´2 ‹|ůSĂ!ŽDúY–? |1g-¤ëm<—v×)v—2ÎĎ)ué–<‘í]͉uáŤ6ëĹ–~#–9©i·‰ĂˇěĺzĽj4Đt}#_ŐĽRäĂws[©¤ě˘ŽqĐ`(ć·é“ĂÄC:,‘HĄ]d0=Aâ><›Křťăß hz,‘_ZXČ×7÷q|Č‘ńňnÎ1ő5é,5GŔš¦ťˇŔ%Ľą@ Ä9$'đ­Í/IÓ´Ů4Ë+{Dn˘Âçň«´•á="=Ăzn•ݵcú9?žjOh¶ ŇgÓuh{I†Bb+FŠăü=đóEĐ´íFĆŃ蘆ľ‡Č‘&ąg śŚ.~ďŢ=+ˇĐ4›M GµÓ4ĺe´¶M‘†mÄ­_˘€1+ž+ťRŮÖň!„ąĚré¸u®ŞŠäĽ)đ˙DđĆ ÷ö"î[ÖCšćáĄ`ľ5©ˇxoNŃ/µKËäYő)ľŃpYËţõlŃ@bxłÂÚG‹4áe®Z-ÄJw!Ψ#ĄmŃ@_…ľč^ŐSQ±7˛ÝF†8Úâ大¨ÓĽIđăĂÚţ¦ÚŤÄ3Ű_°ÚóÚLĐłŹö¶ő®ĘŠÁđ—„´o ZÉ‹h!2ťŇĘÄ´’öňj]ĂZn‹Şjş…Śr-Χ/ťrYËÜôşÖÍŚžÓ“Ĺoâ%ŽOí7¶ű)}ço—q·¦r4šß†tÝkWŃő;řäk˝*F’Ő•Ę…fŰśŽ˙tVŐŤ/†´é|YŢ9?µ"¶6ŠűÎß/$ăoLäži5ď éşîˇ¤ŢęČÓésý˘Ř«• ů‘ß ­Ş('Űń6ún¬Žö®ęä#•9Rä{ŠŹÄ~Ň|GŁ /WµÚ.6‚pĘ@Ŕ ő¶¨ <‡ŕ˙…SĄĚw†XĚA®nZC˙±ž‡Ţş-cÂNŻáë-ö)ZÂĚÄbU‚<±…ÉďĹt4P–‘]ŘOg0& ˘h\´Ś~†ąńŕmx$xSÉ›űy§w._ďuűĆşz('QđxsűúÜM¦ůK–ÇŞSźQÍsşF‰áʆvŇÜÉ©Kioq¶%7×ec$*éß§ĄwOTŇěuXVNŇ ¨‘·ŞL€o^{ó@KđľĘ|Nń'Ž ¶ňôŇÂÚÉĘăÍ!B´ę˙ú׳TvĐCkCmE *"…čI@ţ)đŢ•âŤ0Řkv‰soťËžŐOPkĂ_ ´j°jfúKů÷-"ĆÇ×oEbřĂ:n{«]iŃČ“j—ęäł– ä’Hôž)n<5§\x¦×Ä2G!Ôíˇh#pçhCśü˝;šŮ˘€8mwáw‡5ŤfmRHîínç˙\Ö— “ęiř{Ŕú‡u!}ŁŮ}šqn-ŽÖ8e [$wlžµÓQ@ú7†ôíTŐ5 ä[ťJA-Ág$µ6űĂ:mý~â9ŁcE !B¶s‘ß©­Ş(ËĂmźŠµÁSľŤbťË’ĄT(^…íoĂzvµ©iW÷ńČ×dľ}±W*qÔwé[4P‹Ľ#Łx¶Ň;}rĐL#;Ł‘IWŚ˙˛Ă‘XşÂ˙čúµ¶Ążąş¶mеÍÓČ#=2®ćŠĆ‡Ăzt^(źÄ źÚS¶îűÎҧ+—şřIáÉďn.ő+qpí$±AxčŽXäđ z ›áÝNđî—źŁŰ%µŞr{žäžçޢńW‡t˙hňizş;ÚHÁ™QĘśŽśŠ×˘€0őď izéŇŽˇŤý›2Ü[ír¸uĆ3ëĐVgŠľčľ%ŐRĽ7_*üë[†•ĹuôP1á?h~¸žçL·‘Ż'’ćy ˛0ôÜk?^řcáÝg[—V•.íŻf˙\ö— ›ţö+·˘€9Żř#CńbCý±j^h?ŐO‘>Ś9Şřo řVŹS¶űl÷Ń©T–ęĺĄŘÁĆk´˘€9OxBńUÜ7šŚÇ}Ú—6ň¤Ó#­TŇľřgKż°ľµµ›í¶r´Épó3;±ůÉűÜv®ÚŠ+ËĂ:mźŠuARżŤ"ťË’ĄT(^…µEck~Óµ­SJÔ/Ł‘®tÉ|ëb®Tă¨ďŇ«řżÁÚ/‹­â‹Z´´G1JŚRHţŚ9®†Šâ<=đĎ@Đőh5( őĹäňžćĺ¤Ů‘Ž­č<7§C⋏GRžßyÚPtăĄlŃ@ő +mFĘk;čR{i”¤‘¸Ča^˙ k¡™Pj)jNM˛Ţ8‹ţůĎJôŠ(+h¬¬ŕµ¶M@‹kč `ČVŚĽŁxľYÚKvÝŃ9Iű0®ŽŠá-~řZ]ÖÓĎpł$˙išvyw!ĘŤÇś{WE©xoNÔ|A¦k7QČo´ŕâÝîąëfŠGUtepX`ĐŠóËŻţ–ęi­’úÉf;¤ŠÖé㍏ű˘˝ŠÍđî‰cáÝßLҢ1YÁťŠX±ä–''Ô’j/xwNń>ź–±Ml“$ác,˝3ę9éZôPž]| đĄÍÉv·»Krţa´K—śýĚâ»”Ó¬ÓMzŰD,D~PoÉłĆ=*Őç|đ©–CęĐHw5Ľn‘źĂ5»«xAŐ<=c˘Ďo"YXmĽ©Y3ęs]UĂčż ü;Ąępj.ďníů…ďno,ú€NhřËŔú/‹šÚMZEͶ|™ŕÇ"{dv®žŠÎđţ‘oˇiiÖo;Áv´ňä’rÇ“É5…⿇Ú/‰µ4ÔoMäČ‚15­ĂDĹ}+®˘€9Ź řCđµĚ÷ZmĽŤ{0Ű%ÍĦYzn5CÄ_ Ľ;®ęŇęsĹsm{(IJZNŃyźďc­vÔP'á߇Ţđ¤Y´Q@ĐnŢNĺb -ž§ŽµĄ§xkMÓĽE¨ëvŃČ/őUť‹’¤/LŐµEpúßĂęÚěş»Çwk{1ĚÍkpŃ O«ë޵|aŕ˝ĹŃDşŐ§™$'1M‘>Ś9®ŽŠâ|9đÓ@ĐuxuK¶Ü_BŠK«–“fFö«~-đâ›ČŻ5%Žú!µnmĄ1IŹBGZęč /Gřgá­&ţĆúŇÖo·YČŇĄÄ“3;±ů‰űÜí(˘€9|>ĐĽS¨C¨_ĹÝI/ń 9šHÄyçyéŹ^zg5ôF§¤iÚŞŞęV6×AzyцÇçI¦čÚn—źěë [Rx&(‚źŇ€2|aŕťŢ¬Z–žőSÄĹ$O`¨řgáľ…áíY5;_¶Ď}”In®ZR őĆkł˘€9ü=ĐĽQ©C¨ßGq üK°\ZĚbrľ„ŠétË(´í>ŢÎÜąŠˇv,ÄŽIęjÍÄř‡á¦…­ë3jł5ýµôŘÉktŃoŔŔČŐ­á/hކdŃíŠ<ÍşY¤rňH}Řňk ˘€8[á?†5JâôĂwk%Ënť-n$÷ĘŽ+gĂ>ĐĽ3¨Ü^č¶źf–xR Ä®ŐéÇŻ©®–Šđ?ř7Gńgüwý«‚km]Ś3Ă!ŽDÉ|á‡nzŻü˘xMç—J‚Cu?úۉä2HţŰŤnŮiÖv2\Igk \?™3FLŤę}O5j€ÎŢň{¸-ˇŽę| eUź2{ŐŞçĽ]ŕíĹqÂ5‹bňŔsńąI#ú0ć©x[áîá˝@ępM> FŃsu)šE8'§W]Eb]xcMąńe§ĺŽCŞZŔmâpä(C»9^‡ď׹‚+«imî#Y!•J:0Če#’Šăř^ĘâĘĺ-§’ňŇĺn’ćY٤g^Fć=G+ş˘€1.Ľ1¦Ýx˛ĎÄrÇ!Ő- 6ń8r!ÝśŻC÷ŤsúżÂßęZ˝ÖĄżQµąşs$˙e»xÖF=I×wEbxWÂÚG…¬ÓFµÇ#n‘‰,ŇV'“\ĆŁđ‡Â·š„×qĂwfóśĘ–— ?ŕ+Ш z÷Áş%ď…ˇđőŐ—L…#FcąqІëźzç`ř?áDI–â »°ń´Kö›–“ĘR1ňgˇ÷ŻC˘€9MoŔ:ł˘éşeÜS4Ő jńĚČńđŢŔU]ᧇ´mRIcşĽľ‡ýT·— 1ŹýÜô®ÖŠáµŻ†©¬\ęlú…­ŐËoÚÝĽBCę@5»áO éł’ŰE¶ňVFß#ły«1äÖ厪čĘŕ2°Ád^}yđ‡Â—3J]ŰE;n–ŢŢĺă‰ĎşŠô*(–ŤĄYhşt6]´vÖ‘ $h0˙^±dđ.…'Ś“Ĺ jÇWAĂď;s·nvôÎZéč  š®ťi«ióXę6ńÜZĚ»^7Wż|*ż ŹŮsźł}±üݦÜôŻI˘€05Ď i:Őľ—ô.bÓ%I­•®ÖQźQŠÜžî!’‘^)«« †¨4ú(Îář=á8nK¬f/ćCrţA9Ď)śbş]+Â:F•¤jZeŚ – ňĽŃ†8ýŕĂţčç€:VýťáíĎĂú=¶—¦«%ĄşíŤY‹>µ“ă/č^/0ɬZ±¸„b;ś¤Š:ăpí]=ĘřSŔš?† ăŘ}ŞInĐG4—´ŚTgŚžťMjx[ĂöѢŇô”t´’ŞîXäśžMkQ@ş_†tÝ3_Ôő›Hä[íGoÚą íéÚ Ń<¤čşN٦ŘE*Úę$“†±%Ć·ĐŃ@žĐěĽ9Ł[ézZ:Z@Ev,FNzź­s^ ŃWÂş/‹őß A)ÖŻăóäËÜęW¶77ÜPyĐÎŢĐţj·Ô|EŞÁ&Żpľm鸹ňťf<¸ŰĆ9ÍtŁXőß.„÷oáč,}Ř-Ź›nyÇ˙Z˝6o h3ÜćŃěbr\Ŕą?ĄkA Vń,PF‘FĽEŔP][Ĺum-˝Äk$2©GF Q\‡…ţh^վߤŘݶąf‰wuÂô®ÎŠâuď†>Ö5Iu†ćŇîc™žÎv‡ÍőÜ©5»áo é^ÓţŢڭĽ$îcśłźV'’kfŠđ_†ľ ŃĽW˙ Dş¤R­Őľµ0Šâ r(*Ľn«Ő|ŕťÂ+9ŃíŘO9ĚłĘĺä~ü±­»>ĎOóľĂm żśćI<µ ˝ŹR}MZ  m/Ăzv™ŻęşÍ¤r-öĄłí \v Őâ?…ţ×µfÔć‚{[÷űóZLŃú⻊(І~ E˘.>ÉćĺNŢ`”őmÝsQčż ü;¦jV÷ě—w×Vçt/{pÓĎb8WsEs—ŇgńĄżŠ$ŽOíH"1#;pA#××GEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE˙Ů endstream endobj 227 0 obj 214488 endobj 223 0 obj << /Font << /Font2 12 0 R /Font5 28 0 R >> /Pattern << >> /XObject << /Image28 226 0 R >> /ExtGState << /Alpha0 10 0 R /Alpha1 11 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 12 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MUFUZY+Comfortaa-Bold /Encoding /Identity-H /DescendantFonts [ 228 0 R ] /ToUnicode 229 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MUFUZY+Comfortaa-Regular /Encoding /Identity-H /DescendantFonts [ 232 0 R ] /ToUnicode 233 0 R >> endobj 28 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MUFUZY+ArialMT /Encoding /Identity-H /DescendantFonts [ 236 0 R ] /ToUnicode 237 0 R >> endobj 50 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MUFUZY+Arial-BoldMT /Encoding /Identity-H /DescendantFonts [ 240 0 R ] /ToUnicode 241 0 R >> endobj 229 0 obj << /Filter /FlateDecode /Length 244 0 R >> stream xś…TËŽŰ0 Ľű+tÜ–čg€Ŕ@±‹9ô¦ý[˘SŰpśCţľ2Ç»M|P$ČXCŽ8¤ż^}7«řÇ4Ř#ĎŞíz7ńe¸N–U箏 )×ŮyEňkĎőĹ>řx»Ě|>ôíí÷*ţé/ótSOźÝĐđ§(ţ>9žşţ¤ž~ż=>^ÇńŤĎÜĎJGUĄ·>Ń×züVźYĹö|pţĽ›oĎ>ćă×mdE‚ .cÇ—±¶<Őý‰Ł˝öźJíżřOqď6çQM č ď“÷ű§ž$Źńy´NMµ ă€ATeRHŚyĚíĎ“Fh‰;Żîi+hĄHřÜ‚va‰Ś…–µ`»*XS™‚­E˘DMjÚA0KĂ‚5” öcMéVĐ&BËa"#(‡ ç@)P ôK[‘7zÍ–7z•KŤŢít%o€PVnň†Ä$Ck^쨡U˘‰ÓPč°D*]1)[p…:ZĄ&`!–š\d‚ЍË/VůňA>ßĘ— ­m´ô—jĽÄ@°;©p5Z™Hź3ÔŔNjďŻFŰ«Q# ©Á¤4•,Úĺ!icv‘µ É%$ݵ+’HÖń üţNËBYöŢǶ˛×iň‹J–Łl¨e7u=ěĎq—(ůţę‰ endstream endobj 231 0 obj << /Filter /FlateDecode /Length 245 0 R >> stream xśíY{x[Ĺ•ź™+K˛l˝Ą«ç•,]Y/˲lY’ż?â8ń#Žp!Ä&Ź%BŔ u`ˇ%ˇşĺUeÓR¶Ű„-t-٦d—f P`!lR %Ůđ} v—h,í™Ń•#ɡ$]ŕŻú|?ÍťÇ=sΙsÎĚ\#ŚR vDPlŐĺ[/›żŘsZ&â5«ÇWŚńŰGţĎ·@[r54(î‘Í…ú~¨űVŻŰĽĄď…Bý]„Ô?¸|ĂĘű_ů— čş !ůÁu+¶l䶢U-ń7Ťo\-żĺF¨O˛Ye¨!2Č©‘9ő tĄ×źĐ×'ăž:ެ7ÉĹÔˇ 5“\áŃ{ڬžj%‰zżč•C«ČZč:F®ÓĆAÍfŔ‡ V«á}“Ëe2ą„Łř»éµĎëy—M/čCˇŻ×ńˇŢXŐś€5d+ךmz˛Gołé§zô¶söµŮ’nĺőB3Ż|w(Ň›Íúšî€Ż#\™¬2©|=J 2řůhbBV¦E HĚSů\ś“ËS)ŹĄËé*Ç6­×§Ćö2AĐ:ä§ś§Ž@ߌ9Č÷EqjąłZŻ%«§îŃé^ĽaÔž9Ižç,(ŠP—7 Š·PÖâ"T̠݀G4&SIf°~zčÖ5MMknY¸`C˛”sř •M«"‘ŐMńĄahU*“_Sµ¬»}dŃmëZQąZ]j´qš olц¶ö ‹jD·šłń*ٞ*rچV®¬€Ç\üpďrńxżĹé´¤7b7+ŹáďĐŇĹ“Yo¶˙ŹĂlv|j7óŕžóÇźŕqáŮ»Šx¦_ç]tMÎX®ů|l— $˛N§~7Ă’ý K*J“˙:ö-*ŰĎ-Îb›ÚÉŮl©š4=f7™ě‚e­Ëq żűŚţ4<ą‡¬Łë© q-~~AŢ•Ž Y ÔĘnZN-e† §)wôpWrźć5ý>}O’fŚ÷卷`Č’ÂPp*ÇĆĄĂŤ¸VOn3ď2Ą?Ő;=Úô”IZçÔ­äJgN6b.™:nwEÉÔ{ą9Éë0§ł`ÎýĘ»yAŕ­:üxV}•E‘ž/ÉośÚKÄśĄĄ¤sęHÖ(ďKXtćŮ7—2D~ŤŕIH*~1ëĽĎömîčŘÜw§ Üí»Łwf§}ŐüŢMíođ.Ľ!Ř]ë äőŕgWquˇNOůqŕsż“,ŔQ†ĽĹ(“Ó”3dŇ锊U§ü9•Ĺ®wĘá(st‚ěAÓŁŞS§|Ná0ň¬*Ľ‘Üď MS;É2­IŻźz¬ňV SăF‹UOÖOÝa´Ŕü­™Ódśr\8»–Ó[‹HFÎEĽr¶z%`·DĘFĂ­˝›çônëďźě ĚŮśFŁńşˇšš!lŕă° ëÝ60pmoďµŰzGkGÉ‘ÚÚ‘db¤v‰Ŕß»Öw”¨ ¨n ˛`vÉk¦çeŮ* ľŁă…ŰzşŻhş4 Q4^MmoĽ?R=ĽÎ«ÖË4séÔC×öTWC]ĄĐÔ×,jL.ŞŐÔ\™FÔĚŻ`zĺyä/ś÷LđÍĐ/ěßÖ;gsoÓW€8ěťěĎSZ–Őł6Ś5,C7€ęٵ‹0oí˘dbqmN×.еŘŇ4Ó'< ‘™ęĘńŇáë{»®čßŘd7Ą×áď„°ż»®q(\wAŁ»Ă¤Őz˘÷ŽËz¶ -ÜÖÓµuŔhtÖ Dë–¤R‹ë,Ú2\¦ő©^ĐZBl­ÍHśÎ ŇIÍ Zsg¶hĽËčjĽlÍ>• nçUf»Ýü1ýqZđsׂnŚ-JĄFb±‘TjQ ‚Ťf2d)Ű%ü¨ˇ‰‚ť‚9{N1§ę)v+µ,:ţ/„{˘áÎ`[ËÚŮ]ëÚ„ô€Ôu@ŕń2ż¨ŕ…gţdă\ŃŰXٶrVÓ¦á“t~ŠuĎć…LŤŔŢőÉýV ÉąřÇŇ~‰ž'âĚíniŕň ĆVŚévŠČ¤Ě{ŔD'Y\á‚—+!Ě)#/˙çV×VŞ5D›ŢÉ;<čę_uż¬ćžíÄčŃú4iż'»é€©ŢQ˘ćtśťAşJ*a7üxYTQ ófásőŰH§ßÉóN'o3Ůü®Řp’ximęHeڶKkÂ-%AŕâCMĚ{€;úNŻľx XSCc4:t”xvz¨ §˙F·çoYÍx¦Y.'ôl¶3 ŇĹ,š–Ä-‚w¬izr~ś—Źé´špíô”n1-č ţú& =ÁĽĂŮ©đĂ\ÁşÝÜ4ÖÜܤŕôĽşý˛¦:«ÝnµŮlxqóň†€CŁ…0㛣é]Đ´Ďj·ŮŇV;;%ťĆ§@«8Ó)?奒yg¤Üf—˝ŢńąĂ:ötOx´%zS@Łď‹ÎjÁ¸©|ióĹńŮ—ą4D§‹hmłü‘cC˛o‰żvą¬ĘŁ ©u%ZŁÇďrE4¦ÁYń9žpĄN,/Sj¬—`,eÚhK0:/Bm§ĽžĽÂ⌞?ÎŻ…ŰöÔ FiF*Ľ›Ç~‚îďĐźř)ü& ä´LŇyűA™?’A⛎*l&iŻK&â oŞŔ⸝Fá2·şj„Ëšű¤@)ÉÇɆ^Ń;Ë×:6«¤0R0*˙re€e˘s:Y˝¦s”Ü©Ô F›ňZq˘Äj6Ůd+´WküNSŮť2»^ç”­R].s5xŻ;`¶ĄŻĆ·Ó›qz;Ţ ¸Óť#tmK]c¤Y 4%JŔ÷»JfßÎOĹpsĽśf…úTʢ)&¤ĺ×Uĺ#ľź¨ Ď[5»í{µŘ–^o˛hv%żŻ}«ëĄˇ ‚Z#Wô˝¤«´ë_°{Íg84˙YřĆa•®Ľ`í’ŚŽ„H îç6Áz1·Đó©QÎ,Aťňý^•&bµ¦ŞjSúĄňĄFŹęw*­Ńč-}CUrBnŞ"? Ś‘©A7ścŐFüQTB™^`A;Ř——3!;ěđÉ‚ł8Šč•N23ÎĆâ}«éşńXO0iöTř¬•łCÂfęL§čĎcŇj»ĚřľuÍĽß1X Âü®´Ńě:ă]éž‚]ŁşĚ ´}Ť~ťX’÷%e 9…`Pżˇŕ !Řg-0öa"ĘüäŃO7 9y荋:Řg÷˛3­řD ČçHä·)Ë9´ÇmÂĐ{pOP ÓAŕž€§8…PˇńĽŻ9R&;ű÷śü©č‰:vÖp·©mwĂXhŮ0ŻcĽÉ×´›ś&A(´Gŕů¬5-‘ŠŃ×^Eě^Ű’ZŃѰ°ŁÂ<ÇĚ {¦ŐÇHŔ!ô~śZj8o˛K%Ka6NëÎüŢ—˝M/a_zrWž śB®–۵vwYúUąc^µ|¨ŃÁEC«ÓĐH3<ú+Ďú˘”ôRl*PâßBçÜŻł”6464j=ĄĺkRqąó¸Ö8ńţÄÄű›E7ŻSúőÚ××–«Ů­Ů˙0Í1Qź˘ŰBŔ`·çÜŤĽ ʧÖČaWőhsC©ĺ¸‹W—›_RéŕŠ¶™rź0jc8Ó‰žDk V™vɤÚҧÓ+ J…Ęgs{yŹŻ  ÁA·{ëöÎŽ*ę1xpë†÷!҇ëč©={ާâ±íł¨eť^ŻĚăą«°Ęu ş`ć°‰Ů9ŠŞŔ9Ŕ+¦gĚúÝ`âulďg´µůT Ą^©×éüŢűDa•xD/úAťPŐŃiÔU3ŘÉN˘oq™‚Č$˙VóŁő8CzčY„zőô¤\n—b^”x;uÇín“ĹąÝěv›·;×CŐ´Ýě˘Of޵ťEpućyšsٶé3N –$%}ýä-^‹ŕö]4 úY‹m­Ň͉^ťpŰ%‰e}Ă ŽÇ"I‹ĐÉtézŻ/¶¨>9s4Tx“îÖ†ć Ł·kí:ÖŢ^Ť¦fIKçúćŮávŻżˇ^´×ŮÓłtNx˙J\P[‰ÖÚ[|mކ&OCc*vźN©ŐVčďkęů/&“č-¸ÚĹŐ€@&Y@4>`ݰűä®w^Y®mţqܻЂ±ŃňMwĎ@&’>*;%;cĺÔ×ŘĽÇ]q€J™ČéźČN1NyÜjrŞ$űPŮ— î÷HKA^Ec\)j?+´Đ§…s˝T’˝hě čú™sŻ‚9W! -q ĆŢś-q,óŕ$<« |ĘĹ8@RęžPţžlBŐ ß7aŕ°Çaݵäéů^ç«AB«Ëľ‰ÚÉcCV˛žĎ†GQýYA×v!Ľw¬s¸Đ÷CnDCČ ¨Žě„ňóđ6JŕAÔúU@–Ęâb”\ĺٰđjĺ|Ňóş/AĽ©>SÎÝ ŰîĚŕ=E#€1 2@  GÁ÷ł} ýd«C?˛Ăw±;s¤řJŔÔÍp›Tn\‚T°†Ł¤HĺW´Fd?j`Č­Yť´^Y´â·Aţ30枉âŕl‘ˇfĐŐT ĐkŕK)Čk¨|Ş‘ź8PÉç‰R8‚T˛r€ üf°râ1đŁ#(Čňü;“ ˙e1q:Šlů9X–D!r7Jq—Cźň†„HÍňâ*)vJą¨TĘ)Oeţ‹‚»ęăpşëŕţ x.\ăčřýP®…|ó8´qH-{"›Ż¤<ß&ĺô÷iŽć®CZŮCĐ˙¨‹ăáť2Ŕ‹(Ŕrßo‘†lĘĽGž>Y™É»Y9ą‡aČ(•d“ň “' ¶wP]ą0ęČß© ¸fȵĹvrpNG¦'đ˘v¤ş°~šŰ¨?Ţí+Ŕ×4`wŠ2).ňâ›S!/ŃŁŞč…q}Čye”üTzo—ä×wXěů2Ç(89ôQ_Y űŮ/Đô pPR_&WÁ¸G‰KˇQ.ü^–|?›żš˛9rŤů§ŕ¤qôw€Üożo÷´Hds'‘g mřÔJ2ŹĂŘ‹‡ dä®”ň¤)a˙ 0y(vgsÓ•Öóňk.ÇͰC.ľ%č»V›ĘĆ6‹şfÔ—/‚óŃSČŔüöśo˛3ÝßwŁňé˝\ëI×i8ë·ä jc~K}ă稉ůěßĂ8ęż”˙ŢĚrnUf9řărîŢĚ÷ČÎL5ś×~Äü“úÔýĚżZÉ“ Őý‡đ<†/Ř™®Ó‡&@'šOŐŹ»Ąq‹ł:rąŘş®„ú‡€:–kFąŮđF"ç”žČü]AÎĄ< źÉ@çĄm“€Ů¨Öo>¬ç‹[‘üˇtD°wjTăźA~»Ć®‡çůČ>!ŕ-/ţę;ˇŢyŚ» ś°â1e”7´Č…ţ·ěŹżD€şqđ«ŰR‘HŰńÔ‹·A~Ýűţ‹(‚eâCČ ĐżAż‰;ôűn ~@Ry‘Ű•y‘ěËĽÄę‡Ŕ/g^BÇQ·ÁąÎc+2§Ń^eo¶Ţ• úi¸Đý “Ίr¸u‚\L6úÉ[Ë4Ćhiź›ľ>Ó‚lŔ ĹYß!°ăßB݇¬0^Î52˙BäÇČÎđuXkŘâ4Ľź;_í‚˝ |Ď+A›™ţ§™Ť¦ĺ…¶üö|H6sçĆCěŮ9K„śH}öđź}°ľűŔwÔżh<]ÁęAn)r”¸ŔV‡d ˛r7´ďBúL!ë†\őč=ëOů/…u¦PSů3iÚĆlv Śßîű÷0YvdŇ´”˝ĆÎđ°o> /FontDescriptor 230 0 R /CIDToGIDMap /Identity /DW 725 /W [ 0 [ 625 703 ] 2 28 0 29 [ 777 ] 30 38 0 39 [ 700 ] 40 58 0 59 [ 625 777 ] 61 65 0 66 [ 871 0 0 304 ] 70 93 0 94 [ 982 830 ] 96 131 0 132 [ 623 ] 133 140 0 141 [ 688 ] 142 148 0 149 [ 661 ] 150 174 0 175 [ 737 938 ] 177 194 0 195 [ 675 ] 196 223 0 224 [ 601 ] 225 229 0 230 [ 703 ] 231 233 0 234 [ 621 ] 235 254 0 255 [ 367 675 ] 257 261 0 262 [ 683 0 0 302 302 ] 267 283 0 284 [ 569 0 0 300 ] 288 292 0 293 [ 938 682 ] 295 299 0 300 [ 675 ] 301 330 0 331 [ 703 0 703 486 ] 335 339 0 340 [ 543 ] 341 347 0 348 [ 401 ] 349 352 0 353 [ 682 ] 354 375 0 376 [ 728 ] 377 380 0 381 [ 557 539 ] 383 397 0 398 [ 631 ] 399 678 0 679 [ 238 0 195 0 0 288 0 547 0 195 ] 689 693 0 694 [ 469 0 0 273 273 ] 699 710 0 711 [ 234 0 292 288 0 188 ] 717 727 0 728 [ 293 ] 729 759 0 760 [ 547 ] 761 795 0 796 [ 731 ] 797 819 0 ] >> endobj 230 0 obj << /Type /FontDescriptor /FontName /MUFUZY+Comfortaa-Bold /Flags 4 /FontBBox [ -212 -289 1272 1264 ] /Ascent 881 /Descent -234 /ItalicAngle 0 /CapHeight 781 /StemV 80 /FontFile2 231 0 R >> endobj 233 0 obj << /Filter /FlateDecode /Length 246 0 R >> stream xś…UMŹ›0˝ó+|ÜVxl)B޶ޔC?Ô´?l“"5€9äß×Ěx·K*9H‰ňâ™yăyĎ89|: ý"ňďóhŹ~]?¸Ů_Ćël˝hý©2@áz»DDßöÜLY’Ź·Ëâχˇłý^ä?Ââe™oâéŁ[˙!ËżÍÎĎýpOż^ŽŻÓôÇźý°™Őµpľ …ľ4Ó×ćěENiĎÖűĺörţEüĽM^ aŕfěčüej¬ź›áäł˝ O-öźĂSg~pwë’łÚŽaxý Ż+öw3Su¤,ˇć0ú¶ůa,…ăh¬ßĹű˘XpXY2ŚTš˘h)¬`¦Ro(Š{ŠĐ…UDjÚR%Ł&M¨<…©ŽŁ]zO:RtDQ1…’iŠJSXĹP°ˇP÷OWD±cBĹCÜ5ڎV22„,Ź[?ĐĐńF=çęzn]3˝gzý@ĂŽ(@FŠ­†ĺČHA‚Ü1" !N·Ś¸um“ô€42ŔX7­(`¤ Eˇdű™´˘P’FP˛w $] щ†Ĺ„†F šOžŮŚ˙#4ä0GkĘ5Ü…‰]TuęŚC´źIźdűáŽÝTČMQsWŁ= ¦@Ď› &Ä ##ŢAA`ËÂa—n´Ą‚ز'±JĘŚ-{QXőzč“–)ěJëŰ/ed´–ĂČşčâî%ˇ."2rmŤú=ýú_ď™·ŰÁ^ç9\ tŃŤ°Ţýŕßî«iśÖ,úü čňG endstream endobj 235 0 obj << /Filter /FlateDecode /Length 247 0 R >> stream xśíZy|ŐťoFŮŇHš‘43’|J˛%߇dI–%źňÇGśŕ„ÄIHâ„@É.ý´„–6Ąˇ%|ÚŇ…eJŮJ9ÚĄ…҆(Ma[Z G( eI,íď˝ٲJh)5ďóÓ›7ďÍďýÎď;„BÔ†TwáĆťko}~a Ţ\ŽPˇ{Ýš•«ĺĎ-= Ďá]dĽ0ÔőBű9h—¬Ű´ýŇÚŘ]h˙/Bć[7nľ`eó‰(´« Ä=żiĺĄ[Řťčy„Bë`|ń–©5[Öq_ü´Ż˘łęP!¦ź5#+ĘCE¨ˇm^Xl„ϡçB{Ś-›÷/^´˙˘ÖŠ]ÔÁČݧa|GGçŽńP‰×¨s9fC- j…'Ŕ 6TmBßÂdkµ(ËâýŁ×®‹ĹÖ];şoßň}ĂĂđ#‹DŮŘúkFGŻ]ë^Ľ˙Ľóö/ ß˝Ŕ·xnôAdAĽÍ{ ¬ńAQ„Ô"#­ÔSřnŇVŮK˘UNýN9ő†l%ŕďţ}Ŕ?ď/ńwp …°¦,gXËŠ0Źë‚¶őKâcy&«ůB‚G:;?é ˇ=ÜDzL”ĎÖcSÂV«]5 ˙,P4k’ޞ̚Ä"±5°(ăß’_B)§¬ZĚń4n$őt;őB{ ŢŞÜŃ}ŔÝ<—ű Ż™ďÉw0ľlÇŔřb9˙ ĽČ2Ť ŮĎ9ěLN¶=UU=ĺä©eŇŘ2ŮAU÷UTöV3eüAÇd‹* »8—dI˘`žŁĄ‚ˇŕ(ÄŤÓ„GĽx$ ˘"¦^4).Sę¨CQ}ď^ĹÜâ Ň“ŃĚ8žľÝîdé§ď€HPm{ćĚź3çËpĆ6˙B źAźň(Şe,Ó_d–e ÄíÓw€ˇÔ(c—C”Ů NĎF™šq á&gřGc×mÇ7\76zÝĆx|ăuŁ];ĆęęĆvtu«µ1±‘ö% şżţÜKş».9·ę®n¨3Y>Dq´č4¤ă|>řµĎËô§ű§ÚÚ¦úÉňˇĐpuőpčŞVűÔ‚ľ­íż‡`Z/ĂĂ5€¤ŤĚ€¤a„Öü ŃHPQd‡óę?BCćťcŐOJFĹZ”c­n«:żdq÷îťžĆŇÎj!OŻłX j\ľd]ó9ĽĺâĄÍăőľW(Ě1-Ją'ŰĽ±rŁíâ‰Č’X!‰«¶ćŔzV+…Ŕ2X…5 PqŹ  Ę©—‡C`ĘÉ/¤ÎëÓnAažtXIŰę@${Ň'gUd˘X0“7g@—í"źěL®‹C2ICW Ý—ă_QpĘŹŹ‡BăńLkřňnŕ/"|ř¨¤ÖOŘ)vź=2óµĺhž˛!xŔ&‹¤ű‘Á.ń’ţ;ĘaV2ó2{ŹňˇH¸gô’şďvŢĄ—lćßťĹfqúrf›Éb6O_Ă\ĺö(Ó‚]—M_iµAT5§O2ë™2¤ě4ÄSiµ™8ňrÔ›z°c8Ş€ń‚…»zúö íîĂEÉmíMËÂáeM±ĺ‘Čr\&Ęö¸¬‡Ţá=}}{†ť˝Ű’Ý‘ńÄD4:‘Ż´Kâ·†¬oÁ®¤űż]»ÎîŰćË7ÂĽ’M”<›’Tá¦ĺáđr ˇaąľw÷ >f“$[ęĄÚ*F·:ł*ŘžhîÍKçh­EďĚß_J| ą§@o ůf°KŰ·Ó©!…Ř9)z‹U®›č¤KiĽ@şT°Ű¬'ż’ źěžŚĂîÁQŢW›Â6 ?c·Xív«ĹŽhD—i]–A«9mđfĐKKb5ś9vľŮ íęęÝ3 6ŔŐ-›C—L¬Ů\ś[°,Ń8.¨í˝|Q|YCòxś†±Âžžž=‹śýŰÚńůąą_RYŐq°)÷™‘+`Wx˘ąyE8Lě&˛Ži–Ň˝‰5 tÉśý‰ž¶4|t˙Fß{挺‚x]”$|ł(׎„ę‡j˘LŰd{Ď–v9Őˇő‡íĐ/it‹ňqYŔş–á2GEë±řÔ˘Ô)8áč€ QJ§‰\č)ć}ÎŹŤđıˇS$Š&áůĆwúNjż6¸ćĺRi“vé¬!1 č%ˇů…ç|\ĘikÖ µxňČ„ůÔ~`&ĄVšóŤÇ#Ż™B8 =W)‡$2ʑӭ˘¤ź`[]ę->$ě1Ť4»„ŮxŇbíą˛VaíËsYm.GŐ`i˘Ľž¬Ś÷šWŘ rŕR‚âÚBʓƇzÁ33&ŰSlł(÷7µ á.ܸŞ%ľ,$M‡2î¤]ĂQ0‹ô€Š{/îJ®ml\Ű•ú% ż@‹ Qëio» ÓKp“DČé$X˛ň¬˘…©ýđ(ů¨¸Č ä–ufEĚdÖ™ zńđž^H áÝ˝¸o7Ŕ3dIi=I+Ň7#ş#‰«@%] dćJ"ä‘^Sơ®‚ …}ŢL0Ăŕ° “›<Ň+YkÁ›•Ç38™z FWf/Fj&SÍ2¸élł ’=ÄĽiŘé{6Ş«Ď,GŚśFYČL&ögVXRe§ML}ďZÉyc1ŐT= Áě×íbă+šj‚śÎž'6Ž…ü6‡Ă„GZV5ş]V#őžÎÚÔa‡ %}©rÝĂÄÓ'ń Đ,Dőʆľhöľ-łđ©×&2ŮŰ‹cW|{‰Ig¶ťCuý¸spÍDd<’\YhÔYř"“«Ł2ÚájŽ.+Ť®Ô—•ń…&ŁÎ”_*)©5 ĂŃP§·&`ÎĎ5čů‚ĽjŻâuçňµ­Ąµ=e =p3óši$‚Ď”±xö@JZuáĹu¨r˘6Op8m©?YkšüÇń4a”P;¬”sÖ -ôrάĽóws! ťcrÜKDI¶uňFŠLpچÁ:r&KťšI<ţŞŰR2ůŚźčąŇK¶wÄöt{GVX–Ă’“˙g´Z܆#ĺĎs‹‘{™wăŁf·Á`4§BřG–\ÎǧĘÜ„ŮŰßÎjżř‚١»‰łHf‡ţjů ťÝşËÄ«Śy˛s“În6Kě~ŹÎa1áźą ,VXçżaKjţZGJU™,Đu[j‚7l„“>ŘPŮ9ĎjA µ•96ţhT1pö@”Š`Ś·ćÜUx· ŰD‘˙FŢCfť”Z/رéÁĘĂąÇęď2ą˘ sŚ?wżbΗřŁň„|Á‘o~=ö ë‚/s¤bH$¤mLSLČE!@.ŃŮ€ą(çź1®Ě=côZqŇęńZS—[Ý9Ç F«Őmx9‡űÎęaž.¶X<ÓŤJÚkĹ?†¨SA«›î@ż@?|§Đ5KÁŢpěJ$‡oöio+ŢŢÚîóám>_ęójíöâ«RŠţáWČ/ČÁsY«Š+çî˝NGĚ‚ţÉht˛`}4ş~ Ňíőu‡Ă]>_×ÄáËvŢ3±âžKw^18rͲń}‹F®_ľob˘$–Y ‘–®ĘíĘ3Şz€Äńeµ)W”M–ŻęM:Q"W_đéewčĂ «ÓmäDŹQ;HKxUŞĽŔŔYžv—е˝ÚE‚bµ®ÂŇdeEW€Ü $.lo_“J¤4Â1őúËĘăµyIŘ6•WöV“ÄIN¶$&»<‰¨3uÔiĄw/QX_ňYj=ĂÝ‹*‡úŽJő!Bi¸UŐ˝ąÍ!ŠŽŞ…µçT¨3úâ%˝‰ŠŽRI±UmMçE=‘âPgqëEúćɤčtŠ5}•c]ő}ĺ ěkň…{1őÔçű¦’É©ä¶^ňRí‡_EŔ6â5Aů>tÁá ňAŤ 3Ťä˛ŹŽe–B`®ęśln†C1ý­é«¨č«©é­¨čýڟͲUÖçÜN:747oHÂŔŢŠţÚÚţĘJň[ÝřzÉ–oN˝t¨5}б±ťż–äéś“ĚéÇ&{¦;RdTO:NĆĺTždr2›×wTu——uWWĂoOuôś`đś(üâĐXÄ.ĆEo(‰q§®ucgÇşDb]GçĆÖîę:U™şj<Ť†G¸~, &=1ź7\ †{IVÓ'Đh ŕÝĎdţ^±Ńéő)NŻGđ:]^źSń©c'Đ=h-ŮÁŞc#äŠ)óŤ…1šlv‹Ýâqú…|ďm¦\«+ßasÚŃUX[‘ß.†ý{Ěx=S ó3÷|°qĚ×O ‹ĐEf‚źsφląçEŮiuz˝N {±@Ó”{Uať^ŕ«>É‘»˛¬żĽ|XjŇ—ŮSaXJľ˘Fźż«&Ř ëú†°qY{ RÂĺ |ľ{e[ŮrOA¤#h÷—÷Ö’%¶k}"vA[ă`{I~wžM¦ry] FĄ8†nŔw{/Κě|§x<8ćqi:`äI߇ď|6S{ką K ·PRrq“ÎÁËCęI˝cĐ#łVďsś:Á‰§Âi˝Ö¤k‘¶‘ŠŞSH*dÎgy›!ŢÔç]‚Ě]Ôĺä7yËηwîÉô‘Éš™?ąh¦“˛,ňÍÄę77ÝL łĽ~Ú$Ä7SoT§˙Źů&+g­žŃhfĄ$‰É­NĎAM\^ÓÓ€vďC.~PűDĂđČ’ĘĘĆPuÜĺĆŹń:ŢíJ5—Ö CĂ5¸ â_\qő&CK«ň˛™gĚ6j—DŰ6µvx{üĺÍ1QŘťj3Ëf·?YĽ°@żjAťż=^ŘćmMEÚęńzŢä6е“řź`®F˙ÍĽ??oČĹYň3W+®‚—RŚČhŘ­ą_ýĘU«‹VXď"–ý-ĽA/”v‘ú•˘žˇtUę¸î}Ý r±¦ţĂäo0gHź—®:u·î}Ę)뻎يĚ#Čň÷&öQ$b@«Y„ZÎH ô왚ą­ţDi+ňčÜ0ç’IŤeűO´>Ëé?ýžY¨ő•ŇďB]ŻőżĎ2ÔŻ3kQ5Ąkˇť”ÎÓęŐL?ĐAÄłG`ľŘ\bžŃžoy> ڎ”´¶î Ô¬9V«20“đ|&ş5ť‘o»á»k‘u>±!čű„ ěeeďDÂ|bG5ĚUFE?CusčvÔüi®W%sśY ő™čq Q3 śúĽö§2|’˙‚śăĚíéi _cšZÄé€r±'ýÖ”> u”ô3-ôôŁ|x˙;\ľ-CLřj„ݨ¨ŻŁu7>źĎ~›Ě=ŹÍ<*>bBQJźukţúř˙äź%sć™ÉCń3’5ŕ0Jŕëc>˙áż •#3ó+ČżůT‚Ę€„ʤRĐ9›~ř8 ôÄÍĐgó^†8:üÎ˙rň?(­…<íD®l ÖéPłEŘAčÓ9¬Ń÷`ť8BqXĹŔ ‹†)˙•ţ!v´IŽ˙-d‡€g5Đ"GĆ˙ýŢĘ„wYtTĽ˘ϢV‚íÇ Fł«U÷eč˙ę&g=č·˛· |Š}OÂ|«Óo3ß>nUfŞČÉ^ă@FÝ(<ł06' ŹFt !şÂn{aöHx°qŔÚůvĐ08Ł#%‹čPë'ŘFâń˨ťY ±¦Gő„đ»Z^dĺ7kC>†A•sâ!ă  b8[Ž3wÍäÓx‹hîŐĄCémč#±ŇëŮchú†ŮgŹö 0î r°gŔďa-ö—Ŕ7KP\Ă„·iÎßkúčďąń~.ĐqŹĚ] ąóhf°e¨ĘÜc›ľ ďAFöb '%ç~MB·«BuUŰ3řšÁ¸3ŘAÍ„Č·Ş'şP¬%9B|Fbů<ägţŮ©ďaŤČÄ&Ý#őýN-fÉúýŔř)ŞĹ˙ٰ&’¸…Ř`÷ىYö 0v5ř™đż?˝…HoxÜÂާ‘«ŇUěęô=4>I¶ bú¬Ű]ŹÔQ¨+Ŕ'‘Sük@ŹĂéáiä›°ć6‚mI úŕ\ó8ś€÷˘AĽxîEAđQIżŹ P=ý…L KČŚkP;‚ń~•Ň?cďL˙„y$ý­"·C>­j‡!R‡€Ę€ŕ´Jn|čxňľ¨ ä[Jĺ!†Eá|đ÷^*‰3ö[Źc¨(€~ŤęáŰB„Ň1x®Ý—fÍK¨z^»’ÝžC "Ëô/UyËYĄC+SgYnÂďĚĆKKÓ_,žˇbžť-lîßTˇ\É>1[tîyĄm¦lůĺŢł*ďüuE_Ł_źUţU+ż>ŰÂąą-YĺaZžâŽt18i‰g•k Og•ţ–’†˛5綬rbnÉőĎ”ó?Fą*÷™b4c§••˙(˙(ZąÎř ń}Ó鳦'yĘgQvň7ń_§ĺYţYs”ú¬2HË%ć[gĘYĺ9('Ě',ĺ–UP6üťĘW>ˇňçŹS¬ćO«h÷’ëĐ8ŇŁČ0ďNR‡đ8ýą{tűĐ˙ĎÇŔ endstream endobj 232 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MUFUZY+Comfortaa-Regular /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> /FontDescriptor 234 0 R /CIDToGIDMap /Identity /DW 699 /W [ 0 [ 625 703 ] 2 27 0 28 [ 695 768 ] 30 34 0 35 [ 770 ] 36 38 0 39 [ 692 ] 40 58 0 59 [ 625 768 ] 61 65 0 66 [ 844 0 0 278 ] 70 83 0 84 [ 614 ] 85 93 0 94 [ 981 825 ] 96 100 0 101 [ 921 ] 102 131 0 132 [ 612 0 921 618 ] 136 140 0 141 [ 662 ] 142 148 0 149 [ 655 ] 150 153 0 154 [ 819 ] 155 175 0 176 [ 938 ] 177 194 0 195 [ 677 ] 196 222 0 223 [ 707 595 ] 225 229 0 230 [ 707 ] 231 233 0 234 [ 614 ] 235 254 0 255 [ 366 677 ] 257 261 0 262 [ 677 0 0 289 289 ] 267 283 0 284 [ 572 0 0 282 ] 288 292 0 293 [ 947 677 ] 295 299 0 300 [ 677 ] 301 330 0 331 [ 707 0 707 458 ] 335 339 0 340 [ 539 ] 341 347 0 348 [ 402 ] 349 352 0 353 [ 677 ] 354 374 0 375 [ 553 740 ] 377 380 0 381 382 548 383 390 0 391 [ 549 ] 392 652 0 653 [ 571 378 581 585 647 627 579 0 593 ] 662 678 0 679 [ 216 226 195 0 0 266 0 547 0 195 ] 689 693 0 694 [ 469 0 0 256 256 ] 699 702 0 703 [ 391 ] 704 708 0 709 [ 469 0 234 0 281 279 0 167 ] 717 727 0 728 [ 293 ] 729 759 0 760 [ 547 ] 761 795 0 796 [ 720 ] 797 819 0 ] >> endobj 234 0 obj << /Type /FontDescriptor /FontName /MUFUZY+Comfortaa-Regular /Flags 4 /FontBBox [ -212 -289 1272 1264 ] /Ascent 881 /Descent -234 /ItalicAngle 0 /CapHeight 781 /StemV 80 /FontFile2 235 0 R >> endobj 237 0 obj << /Filter /FlateDecode /Length 248 0 R >> stream xś}SŰjĂ0 }ĎWř±{(±ťô2†Ń1ČĂ.,Ű$¶ŇÇ8éC˙~ŽÔvë 6ä"éčKHé®|,m7±ôÍş‚‰µť5Ćáŕ5°öťM„d¦ÓÓÉ·îk—¤!ą:ŽôĄm‡¤(Xú‚ăäŹlń`†î’ôŐđťÝłĹç® vupîz°ă‰RĚ@žk÷R÷ŔRL[–&Ä»é¸ 9żŹŁ&Ńt=]­Á×vIÁĂQ¬x G%`Íż8§¬¦%3ÎżňŃ_µGž,đp.ąB랬µ˘$D‰k¶Ö ŚkBoŐ_ q#ŃLÇI…@„†8©0Ëę8©ĚĎÚó'*ÚŚ а›‘Ń…rř+!o$2ę`FJ+jd¶&ç–śYĽPÂ6qĄś$r*f-P)§î®NNWÚnLr)ămk¨¦&G´¸&ťçm^‹Ë0ë÷aŽqwp€çŃí,\ÖË nÎÂçI€ endstream endobj 239 0 obj << /Filter /FlateDecode /Length 249 0 R >> stream xśś˝ |TŐő8~ď}ëĽy3óf_“L2™É2 „@4OVŮ· ˛a+*j( ¨hwÁĄŠ˘%@Ŕ€ökj­Ö*…¶˘«Đ—(_›R2ó?÷ľy!`ű˙ôű›É}÷Ľű¶{Ď~νo‚0BČ‚š‡´™+—GźŚ|đ´<†8qÎ’ą‹Ţ˝±ţ€OCąaîő7Îąű˙„l Mť:oöŚY' WíBP ú-ňŁ!0®Őč´‰h*´Ü‰ĆĂW€öp0Ó‚ĘŃ“€‡'Ń!8w şD>Č|nCwp‚«î@6T€®@cŃbt7ľ:łMGÇůµ¨ ]Ťn@KpS¦.sOćţĚ3čçč÷ŰL'˛˘š ßC™o„?gţ‚zŔ[ĐĂč8ľß˛éđ”&8óq´=ÂĄxś™›9 =ČG?>đh:„ŰHî>}Žx57îňt¦9óśA)4=‚âľx8ɦgFe!ŠmôôWÂĺx žLJČbň·ÉđÄŢđť…ćľ‚»‚“x?QÉaîi~'NĚIźČŘ" ô(zý Ű`¤QĽ ˙żŹ˙N“kÉŁäoÜüóüĄ0ękĐ"t7Ú‰ţ…]¸?‡§áyx5^ŹďĂăCř>E® ÉBň-7Źkä~É‚ď~żVX'Ü%žJץßH˙!ýŻLźĚ:4řa ô~ zFvFÂ÷8ú°ŰáĹůxľľ·â»ńSx~·ŔSŽŕżá/đwřźřAđIä“řĆČRňňyچďň5ůós\’ëËŐpőÜbčŐzn3|÷qĺCüa>xî#l¶ ;„ťÂëÂiQ•~*#ůÝóOw–v~’Fé é­é=é–Ě_‘h,äˇčý ř.zoŽŰ…ţ„UŔ]—âËńŐ€™kńÜW&oÇŹŕźłľ˙ż Xú }¶‘ësOŇ— "cŕ{ ™MÉfr?i!śÄY9çĺJąá\Š›Í-çnä¶rÍÜ»ÜÇÜ߸3Üyřfx…Ďă řźä‡ó×ň+ř'řĎůĎ…éÂ;§˘".׉­â˙Jý¤ËĄ±Ň8)%Ý+í—Ţ“€;Ťöˇ—Q·>Á­á†rűĐ=¤‚’ß“ß?_‹fqŁp*Ů7[p )V‰É@<ťć€ë7É6r† äFá‘xZ@zw=ü PŐđżFíü«0¶ßĂťW‰*ľ•|+ŞhF¤žů®źäŢAǸăXâźDń öăvň7¸ŕ—üĺBĘçCżŕń-hŠrNŢ|<żza"îżç2#Ł‹Ş¸żŁµh!ů3j9ހijřąčTWŁĎŃł % b©čĹo“ůüFâĆ-đĎĂčŞq!ćş§¸GÄoɇh:Ě+čîEčýaň nZŹç܂֡ĆĚtŁPÇ˙ĎEžŚâü Đn«ą>|>Ô·V™:m?H÷AĐWpŁ %śs5đĹ$ĐŹŔ÷!Đŕá^Ŕ‚ŘZúçN}đ¤‰Wčµ—_V3p@u˙Şľ•}z÷*ďŮŁ,YZR\”Ć ňŁyą9‘p(đűĽ·Ë©9ě6ŐŞXdIxŽ`T646¬!Úśhhć±+ŻěA÷c3 aF·††ć(4 »řśćh;-zń™:ś9ç’3uăL˝ëL¬EkPMʞčĐX´ůĐX´OWđÝCbőŃćvŹbđfŰÎχ ˘Có†D›qCthó°•ó6m·ŰmUÇĎVz”ˇÝŠ@+@ÍţŘ’ÝŘ9fń°› Ůťjņ mƆĐ4sńˇ3f5ŹW7tH8?żľGY3<3v]3Š jv$Ů)h0{Lł8¸YbŹ‰Î§ŁAwEw—µmÜÔŞˇë’ę¬Ř¬ÓëšąőôÎ$rBl丩uѡ˛¸9ń˘=ăx˙®cY¨Ů=¸Ž “,DÂ; L9˝ëdşS§6óqřSĎj•dŕJÖ‚ŁĂšµ†+Ťm˝’ź˙_^Ôš9MŻbՅ˲ÝlĽxŕEűuOÝČA‡ÁTŽś8uăFĺ˘cŔjĆGd+ŕx4±.?:¸MÉŚĂ_k¦­?-őáfP6žüg4ew/:1ś…ëáCąłGŮ0Pt7‹E‡mlŘ8Ł5Ót],ŞĹ6 Ż“×7.Ú`2Nkćŕ]áća›ęWóđ ‚íŽá ăvëxĂ„©u46L¬ŰC0Ü0¨~w!«;EHg­„¶ŇFşĄ;h$†Aî!2;?|@G¨‰ĺY۟يk“Í6Śf¶ŁM3Ű´ńF›ÎÚč‡ęÁëşsÉúŔŤ3[@ŕ±Kĺ;óťqŘ`0şçŁ\Űy]@çP”oŁÇë2źEÂźŔB—ˇ~ř2ý·7y—ú–úoęySů:ßłĺ#ykÎÓ>rgůÚ~dmäö|ŇâĂ ţůÄçŐ} ÷Bî1YY–CV„–†É tłŹlôŻ “罿𑵹Łdٞ6BމľYDů^“ˇ7=d~ż>2ß?»‚Ě.Ç“+¦÷#Ă*¦ć‘QľAaŇ+TťGáÂ(A=zäöč©((ěóĺxŁ>_4zPéáQ”‰ W–äŕ¬áu9±kÜKÜŰÝ\ą[w÷_rî ŕ@+™ŞG‚—ç.ŤćŕśţýK®ŮnĂ¶í˝Ż‰JXZPŐřP ©ťIµw¤ÚµŽÔÉŽöTźDµ'ŰkŰ×Ű{&í·hoHöšővZi5 čÝ §~üAŮ:.б‚˘DßĘ~U ş­čĆ\ŔýŞü˘äóK ÜŻ_ßĘD¬@ôz|~ŚEZWôéÇŞ˙ăM˝}á®_Ětřń­ŻĄżÂRŹŕ+˝ĆĎnşqQ:wĹĐk‡Ź‹áQéý÷Ďąç§ă^zić̇V?ĽáŁ KďtűŻ[×üáôîşĺĹm«×M»wwÇĐyµ#Ż˝fHÁČŇÎľřá)[FÔ·ÍÎZťG€ŇşLWŠi.IÖ´V\±młËPëNi›ýÄi\”㸝ŹobHę<Ó®ťiGµ5µ5tü8Aś•UýŞ*D ľ^ ăă[~?ję«kn,ş,–ÄÉô¸Wń÷ŘţͱÎsGę7n}ĺ—éĽtô˘çĎÖŐbR¬‹˘aä˛Đ(Ű8 u ÚĆ]cÝÓ˘idß·8 8Ůbł1ŕkݡ(d’Ăžg'ö]Ů>&ásI?Ý1ä¬,JŔ·Â^•F:×ŕd˛ŕ˛˘›ÖĽ:uÔáô8|˙őŐ[7NýăąÎcߤżKËĐËŇźŕµ +hô>Äg§ŘŠÇę ĚŐ‚\ÂÁűKĆ@”°|Ţí jŰ­OR–ęHuśÔÚk´TK·Z»ÖŮŽť®ęŢ˝*úVx=˘TÔŻ_ŐţCc§ô©şjĽ+1*8c<÷ x©ëṊëBScÜ|â·Ăńíü“˦`„íĆí:tQű“ůśTf94áâ2źěńT“ÖĚ'zÔSý ‡ ·ŤŰĹn%Â8”‡î"§ăĎďo{ďMpç­Ł]3°·^č™LÝbp{2éĹ?ż9]ľ> w ł"ĽŽO0íŇ_Źň% kx®‹<ôĽŐ"Biţ¤śĹJ#ÜąîOqQ ˝{ąa”0®ţСóĎÁ`H¦4W˝pîl'9PŐA“”ÖĚyXZł-‚ đč~ É2ÝŠ<ÝJrö¤łşŐj…c"ÝÂąĆ>QéÓý+($*t+ůč±cV‘=Xa÷a[‹ťÝźÁ±Ý| Čţ®% ||*R CŻWUq’EĄ[m˵^Ú\yžĄAŰŔmÖŢŢŰ´ÓšUęńd2V›gmÖţˇţĂö»…Wyoç x^µŮeQ’T€eŇŢtÄU%“PTR=ppmóŇ6.Ę«¸Ę’+r®Č‰­d‰nA˛ú…Ö‹ÄV„±Uw©Q4[âĆŹĺóÇyn3ŹůVŚuëXµM:®r›U¬Ň}Í!–ČmR“D¤ź9Ţ˙Ŕ f ü€˘ˇ ÖŢŽµ5ˇöÚ“5”÷Ű)˙$Ö÷ °šÝY]˝^{ă űo¬ŚŘkdłuÂČć\0a-Ľ“Ą™ÓŔÍß÷‡O=^ÚČÄú?}bŔ—1.źsçs‰"QâHĹHÝÇ;;}ňCüż+TĎĂŻ¦‡©xëźÜ}µw[ßżţr˘TŠď8€x T‰Ő*Nâůa±É±9±e–Ű-âüĐ a‰e™u­°Ö*ů,\ ¨4×—ÜwĘdĂS-”K( ‡m6€,nWniiI Šää¦órsťH´fŇěŠezgt› W˘JőśŘšůLŹSE'ş¨–EJGQ¦˝çĘUâĸy·¸y·8˝››Ţ-žP#ônŞBďˇR,˘wPCeĐzQ®ť^‘«ĐłsŁ h”^üt†éYĐ«8ŰÂĚD śÖÚ ”JśNU‘A†TM'lkFłýQí°éČ O:khqU—×hť5ŐĺĐ謆Ŕ.5U0p» g~źŹjGşµ“ÎďSĹle"~KźŞË‰o%‰ď,›3÷Ž{§4ýjSúgř˛5ýŻ9ě§O¤?‹®I ž:`â–Mé—„őf_ólEŃ«Msw7ôćĆ;}sFŤX\rn»¤ö_8lüŤ˝©Öś“ů\X Z3}»o&YC°AS6ÖSúµŠ˘>¶™h ZžÓ„nĎŮŚvr?·ŕZloŮŽ “9˙ČqÚ]9Îś®T,v–F˘yĂm“=SĽ“ó„…97»îr=Â=l$˛?Cv8ŹÚÝČBšG ńTAď)®†g¶éC‹«5Â|Řť«rá\ޢ%WˇDcĘó3ŇůéüŚtţDTĆ Ţ”UÚK9;(2Z̧ €tPSQŰîd†C©F@v/Ĺ~‘ŹR]…}xđL¨SBĽuGř–×/K˙úÓöôŹîÂ_˙ .řZĹë?{ţďÓ}¶îéżŇűŰsżÂ7üńSŹĎíăÄ0çĎÇ.;lr$űg>Ě'“ĄđYS”ăýŕ•¸ĽüĎďÓĎ`ř"ŕň'đ;§ŢZż|Ůč›î;tGz7®ľď罇ŽzđúŃ/Ąßzs®ľ.}řŤçŇéçgôy©_ďˇ_<űŮżJsaěOnŁ3VÔ˘{E!W–% qT§Ę™ŞÄ`ŘA Ä`űĚëäěëŻwŠÂÁÎgÉÔłĂČŢÎQĐÓ×}ks.Đ„Ť‡c["ŃQqRÖM˙ˇ ş÷îdţ»@‡Ë±->×B8|Ngx Ę€€÷ß¶·˙e•¬®¨4꽌ş¸Ä¨cqŁÎÉ5ę@Őz©M«Ś ›…]řÜ÷B׌řr¤Ł±č8:ŤW7#ŽťÎ…Ytm˘űÝT0™ĂÎĐý˙~}7‹3xzÝž&đĘSőŤKk:»Ľ^@g-łÜć‡âóµ×©[ OVOyޏő\® ŞZ¶ (RúŠý”áĘn÷'­T>ä>łDĺśŃbażQx˙R÷ĺß牅˛–Ĺ•_ÉEéÜ’˝jµ‹¶î…}9[ó´ÎauŰ^—ʶ˘_„gĆă—É–`đ2.‹b‘ăů¨ xö€©EODEAá1ĐTF˛Â+F|+ ;z x»Đ,´ '^¸J¦mÖ^ŽBĽŃ,qR+Y§çţ;.˙żú®ß]°J;h“Ľ`Ü;!8Ą*Ő$5”kjhíEăš‚:äi:HÖjäZµ„!jˇáĂźű×ďi2ŽîśŢ«:)OCDę¬5»łRÖěZĄ…BŠ<…ŚG×_ ,P_wZ ™eÁjž–‚p50Ő'ű}úŞEŠk««Z.đTóş§šâ~_@ou·p¨žŢ7.M%Ť›(«ŕ| ’sëëäĎXę|ü4:Ďś ,!tţâüCäł/Ó<Ő_Ź/ĺQ»Š_ÝϲęÔ> ¸¬¦2‘ŞÂKęçPH†¨3*É@_™H'[xB,’ĚsL© ›Z޶€–ŁMQQLůş´śŕ˘ýé * B*jĹQëXku‰µÉ*Xĺ.C®2CÎ4ś :őßYtţÇJ®Ë˘wÄd*IŐhµĆŽKµ„°Ć°|Ďäú[Ţ0)ÎeNĽ „–ٰAŚŞÔ*E[d}X5Ś»m˙°jYďc€}Ş% 3uý÷ěc€´5fdl¬±jÉîâ¦űűÝć`€^ ~ż»‹îYB&ýčŞ[ě|ě-Ž|ë|Z8xn ŰŮa|Óą&Ă;ç;Î6@§őÜŮÎ…2R陦MóđV5×a·#ŔđĄ\¦±r™dŕűýÔăv%ÝrRXf᦬±@„*šĹr(Âđ ŘôÚůlLzm˙W?ěÇľe°»Ă~!m4¬Ń(Ăg7ťKf‹Ŕ/`Nw.„9$?ß p—żMJîuýýőߤßNoŔ7żúDęęŢ·§ďÚ]ł÷/z%ÝŮů"‡7Ý6}­×F#śşĚ=Â7Â{tŢ?­oą6±-A‚*/±Fř<ęÚxň<1±TčáO& 5ţ‰«…«ý#)aR¬.±X¸™»IŘÄm¶ G¸gĐNî(:ęű}ę˙4ŠIT* ř”p`kâh‚ŹűJ•ľęÄŔČĐĽˇ±‘‰Érťs’wjdjÎäĽ)Ń)ó…9Ţ…‰›÷DîI|řK"h `okć˝=ájŔŘ{zŻp5đJ…O8_1''>‰ůś;$ş„ÂÜ\GäÂ\É2É2ÉęJX„î%–Ű4ln#€Ó,v ĄŔ( _F 羊„˘ĄMĄ¤4źńB>ă…|Ć ů t+s0­z=ÍşÁ6XŇŃv…´©3Ł:şgÚkYl›ő-ýŐČYˇ˝­˝ťĘ»hic §—Ćię˝HěćҨ Zű9+ ľČ©ˇŠ>U‰"ţźë—V?ńřÓży+ýę®f<ôíwđ°ť7t~¶cŃÎż¸ďĂôßpř/ó¦O›ýx*ąľúćimxú±ń¬żJ˙üŘľôń»ËSŹáę=XůYú4śśţ}ŃŔ Ő­Ó3źó_źß‹üć*b ÂA“­Y β— h9A¶ ±­ÍL2©&`5 „©:ľŚ)Ůó‹ŘłíLn&żŚ[Îóń˘ľ\ud07Bş:ghŢÂaE¸zizΔâ;ÝöĄ3•ĹB›@ŠL ĆÄÔ8Ůâ&0"Ę/Ă(TlK’B®(ŢĎQZ>5:96)~˝umˇ}ŽgvŕFëM¶›·h+ —Ĺ×q­wÚ6:îÖî(\żß¶Ő±Ő›kčY˝G~ÂN„,‰ś@¨$äâűôN Ů Ť¶7†ď “pÜgë‘[ÇqÁ'PÎ3Ň®ą=,ąą>Ž…#Iŕ’”ŚĐ*\ăŻ.o7ľa˝GĽĐnł ů‘śÜ°,‰śŤłNéVfÇä¬űÎt=˙fZłó¦őJ3˝čĺýwO8µŔŐ8™úLc3GµŮđ©ë“ďĚďKóÄťÎá7¦Ă‚íĄ—ÎţÎŻd>gq§«ş’pÔńuňŰ2ďkÍF •ü@y•ĽŇń¬pĘ!©8[É+{D‹ÇTň“+8łźŽŢ“ ¦Fşü3˘eó'ôžTK“TÔ‡Łľ±>Ňŕ[âkňqľcćYîŔtfîÓÜ+&˙*]ć^aNšb:iJ—“¦¤ĽÔI»v1üöQZ*ŐŘÝŢ·ó~I”ÂN12ŕy|4­éä^ź•>÷ŢďÓg—Ľ>üĄ[Ţß/<żűăôů§ďÁ¶/¸1ç÷Ľ¶ďş×±‡ĘBŇJŔj€¬>€™4íhV6B»áŽ šähÍtfp]čč­ĆŚÂ I<›sâŘĚaá™XslKÔěeĚ8¨Č†Ć­˙^‹ŐĆf±Ţč ”p–¸jÔĎYíę†;G¸†ęĐgťkJ@{H~ČA˛JłBá`Ň[)TŞC„!ęHďDa˘:Í;KĄ.ô.–«7{‚WĺvATć 2uűjé‡ę„›µ ChÉ %BF®Ĺfw8TŹŰĺňúüx5{ŇZu9i­OőĘ–(|ütĆ( Čr®7ŕńz.ŐbÉőşt9U‡#Ş9=šćtYT9ŕN Xş$pÍá°@üH O—ËéDrČďiWXđ8E*l˝Pt$ŕqűŁ4S ¶â»vď0t_(8Ş3čě ;هÎň¸đT¶Ś-ýÂ1ť•2 xöŁgO'­~TŃé˙7`Só† uß@Lč€Đ 1á—B§xč ÖČć84–˛@Ń•)Čđ˛CË^Ut8‰‚KS¨Ë™ď&ő¸Â ^JT.¨Ü8†éLĆO¤o~ëxa¨ż‚ý_ţqL,Ňăł_§ox%ýN‘ä÷¤ßľ®}pËW…Ü'ťˇô×˙¸«…ű©MŃŮĂĎ=M=Ř«2§ř9*FUd‡^f±YJ¶Pi‰­´´ÚÖĎ[P:˘4eK•.°Í/mčµŃ¶®äߣˇçmŢbsФjľ …ž ľPĽ?řJńÁĂĹô~\,ńá\*N*Ĺ.×…éĎľT}ڎPž?/,+­¬ć«ËFđW–M–ë“säůÉ•ęzőmőŰIgUĄóZyaĄżOľ'pmÉâR)·×ÚďµołgěÂ6ű.ű·vÎŢ5ÁkWł+ľ4×tčůš&ÂŞDě˘ĂŰ•0;‹píöço%/č¶@›—Űâ‰D$ÔŐu4´Héá¬%3´,:ÉcÖ™*vÝNď†D¦čăů…Tof©Ż ˝YČSÍVHS°V+:úř 5±~šf˘°•LÓíE:Jh‰h˘WbWB¨Ęl>8Xď›@‹Ă˝«Yś«ěUÝVM¶Wăj?ŔBzk?›÷ÇĺĚ(g §ś)˘ňÂ×ÄĂ"ÉkE"zQôĐsDc ÝÎ’*K@XRĄýYD&ÚŮd$Ë‹˝ű_Č ‚bn4|ŚdBč䦪»´6‹Ň’ź~J5őÉdm{gň$Íw»¶ŃpĎŞ™kFćĐtjd‹kŻQĹľ}+‹¨·!]NóáóŇU5±'Jvb,¬“¸šYězuř˛+ű.<6W ÝpŰŤ9ÍŽÜąá…±šĹ_đjÄÝ‹§÷Y4ŢS‰śµ“†íĽcôšŃ»-TWnčqY}c ń®‘úŚ«z®:}îŽËú㏋#Zń¨ň+¦Ťąě'TšÖ4Ń܉†rđŰúÍXP…B_a¨ Ôć5瑼Ľ‚HEdPdIŢćÚ=`“#l‚s‡W]ä)P¶ZjĚL°6đ‰YN§·d-›”¦Śs°ň"&kv=^xýŻ˙ôţë?ť3 x鸱Šż¦ŻVo‹Ű*mClB_OßČ2Qď™™Kf ł-3= ‘¶Ľ÷„ŁîŹźş?ő|ë˙*ř)Ó-ľĽĽd*¤‘!Şť¤ž¤ĐÖÓ7€ôµŤ$CmĂ<#"S”ɶą¶OĹĎ}gq‡]Ă^ÎnŐ s¬’Ňá.R:߿̔NĄçw/3*Ćťó„‹™ 1A\ÓŽ8±ćÔť Î&'č%Ęą†vrş¨Jp2sLő”S¤|îdÚĘÉJG§ťŇŃIóQ””Nsô&HË]Ś\Śľ.Ć ®B‰%X$ŤyM:,—2OůcŚÄIąL~Ý“r ąb<Ă )Äx&[9¶›¦ˇQ2 Cş” k¬aá7hśš“Ů…– ަ1š¦/5l`٠Πy{ĎUĂőźýĆmGW,xomĂÖň˝ťŃW¬üůŽ›W=ąî‰MçžŢ†ąŤă® öłĂëÝßýęÍcďľA-ŇH°Hą iĽŔOčţ<ń’I\JHY&Ygs …Ĺ–ŮVŮk¬©d¨:©Ź§PN„n‹\ g=gB|o×€`ďČ®Qˇ+"ă\Óă#3\‹B3"«ÄUŢ3äL@C>ě°ůýc}4ä|Çfm»F4ŤG $/P)15{›ÎHĄ@oqZđSCséB#˝ě×mŕ±đĐfdE |ÉHlŁ·˛•V6۰-”GçŁâ‰JZżLÝ <śçٶa:˝‘ŻÂP¦ŮŐ"Ś´BI/,­4imH˝ˇ˘Ýčat7tE„QśÍŠRş_laRI¶ŕ$´śiěŇ©Ľ“L/¤j:k˛‹ł«žŘlŤ©h 9=R>‹Uq~‚97Ü5Ëľ9đEú[ěůËQlÇçO){îą©ó§öź|çęçńd˙Ó-8l¨Š‹Óź¤Т»ÎĂ[Ö ž÷,µ9n`‡&áOČŹKô\Ź;‚ĺÁ^A=¸$ř¨úíy›˛ŰšmA>HŃŞ‡ň*sd§:" ö’¤ÇÍs"R¶y°'ăf8të|v)C¦_5\Lqä~Ěfeööî_Éfg’‘ĽĘÍu*˝AÝŇ‹<,WRĚr%TžQY6Kň]6çďÉćüżdf€ĎBg^f^ůÓŕ«ř ĘGg°‚Éä™îG§l: şcRמlOŃdJ ]hŇ![}ŕŃś˘Eeđ{5‹+Śś˘#Ś!ř*]ł'A—V8c}+úVVѤčiަ˝Ţs϶mîĐÚ•WO÷ď3~ČáĂÜ#›V›âz\Öpݦós@ňĄÇq_‚äĺ˘Rü˝Áj—߲!`Ç+›?:}Ăî~ő¦gg´ýľ|řŮ[Vďxé¦U;ęBăâ}fM­jľ ×|üĆ›j:żŕűĂ«vrĄh{íÝ_żůk*µëâN±¬Ţ–Č"ĺőÓ9ĺ: Ľâ|_n(wĐĆł&Ż?Xé—ťŞÓĂ 9"‚ä±*ŞisU“Ül9h)Ë*Ĺ-zEżĘŚ·Y°Ź\źÎŰł­‡ÖB#X'[vÇĽyKžgˇ‰}Fh‹‡še˛­´OtˇŰ?łź­ĐÍR%•ý*›}§}d‰o»ŻŮ—ńń>âa¤ö0’zń=qc6W^ť¦«ŮŁŔ˝'Ď&ţ˛s„gu?ÓĽądĄŰśîY#@„©ÂÂŽŃŢácݷƤą^Ą1Ůq1ëTŤ€f…ž°‹v)nŐ0¶É !ÍϬA bŚe-,ăíuĆśŚô˘×ąľĺÖ¶•żٲbáŘ»k řîţÔ3Źu^Kž\ó„{né|´Ă n ]ë‚$üś$Ę…ô`vůą’ÍXź7“  Ď"$–Od©GŽmE¶•Ř.î4]éNsˇ|§ąPľSĎa©G¨ql+˛­Ä¶ŘŘě“m¶ě“)Ŕž<€ÍZôŁčcŮlŮni¶´YŽ[N[$dÉł,±4Y¶e›NX2%Ďţ»ÄÎ"Ňéo˝{ę­‰‚Č+˘żŤßÎ7ómü ^lăOóńQţěńĽęúä,ůyF~^ˇĎ癡ŕMCÁ›éuÖO…˛?Zľ” –‚% ˇ¶=‰ÍĚôĄÝç8.ţ°×€ŢZZZřŻ>çĺçŽQ)] ›*¶ri”nëNË‹č—]­ÔŤZQ¦š.¦ÇE4 ŇD`g«“Şú«”*űuŻŢF]`¬bŇă *Bž°M8.đc`sZŕň„%B“x-…p†¸Ń;1±ó‚­Ű†pDn¤»ě}AörşÉC~ÖJËYmNld2ćTG–h41 ( h"(»˛‰í]úˇŇµ¶…-r2tˇ‹#;€ÜYm¦u[‘`NČ1Ń1° „L Ç|™$ba™€jÎŘLŔnp›6T3— 8MŔmŞbÍ\&ŕ4›9g.›hŇ?룬¶Ę8’?iů«˙Ó¨pT8%~9łÂQ ÇĹr#˘—? ‹±PPSŽÄńćřö8‰űý!{|ł;yB±){'ËI˛ĘC é¤ \?%¦“°@JeËF:Í%ÝÂ)śŇsĚ™0­`Ěoă0{@¸ëaö€0 ĺťôa¦©Ă,â†Ö´a2Â*}TŘL|†éŠ©±ŰÇ™13‹ă#ÓôÉCµh čOz+5ć?jćzŘú˛váĽéAvčf –d6 ă­xŐŢüá{ F¶9ÝrH©îo5ĐýN6§Đ¸ÔX,V[3Jk×čR„n‹\íŞÇťđ¨Î0vŮĽ¦ů0ýţ˙¤l€ő˝l.ŐĎŢdÖ…9 ÝíĚ“}ž]°ňÁĽ[÷Ä {cÓ/_ň@Kݬ«× ŕ[F_{]ÝÁ]ű;‹Čă×_;`Ë3ť’=«VŤ}äľÎł^Ĺg I>Ľ[w śč&;´VíďÜçîÓÜ·ČÓĺ5Ŕr7jř!íHŕD ࣲÇîńąŔ«Ŕ˘Ď¦ŘěŞÝdZ»)qöěĽ5@…ćIWaeţ„•ůÖ.ÂĘÔµ€ť‘}K„ł(­¬t†–1‡UÉfĎč,Ece.‹Ăźut€Ş­2ę[NČ’Ŕö@s -Ŕ8Ráő1ľń1ň1îń1}w¦ĹéĚ®ü·.…r‰KáěćRđYíÖ¦».uQFűµ3Ý'Č 'ŁąH‹VŘôn ]·ŇĺgřD§E‘IáD-áíaěP\Y†ˇë™ÁçhdŚ‘MswăŠőO­ř¸áɱšŇRşđĘeĎń‰w ]2ŞĎ-ťËČş]q˙»ťěťŚ!™S|Pކ‚řµýŢ@vyÎ)&ÚŞfS(ȸ$%¨Ż”'‹őň\qľ,Wj\|}Cµ‘®‘ľˇéÂtËx-ĺJůĆ ‹,ł´E®EľYź`ŻElÓ¸‰ÂDešz=7[­\Ż*ţ/9AQuźkî0gźż×ÝĚ!, ł8#ĚXG˘‹3$–ďÉf4ÍÔ4X4NJ)ÉH&0 M·Ć+{IIšĄ‹HËŘz ©÷qĐVôŚE4U°ť±‹Ý‰eLc/DŞť†§ěM,ÄŞ(¸%˛úiKäcüˇĂă¨b"Ą»›ń!ę˘éfSq‚ÖLťI¦RóK#‚a¤y!ş,Ô2A`ąN¸ÎÂă[ŕ™tkUŔČX\ş‡Cžąó7aßÍ_Ýu<Ý~`Ďúu{öޱ~qă˘{V¦˙Úy諟â\l{÷ťw˙đ›w~ť]źžĎçW¸P.ŢŞ/WµÚeÚHŤŻŤ6GI^´DŤĺôńöÉ”ł$ş9*đ_ĺż*\/OS§ű§‡Č ŐůÚ"˙Âp[ôOžŹ‡ţ”{Ňs2÷D4őĹř¤–ôöĺhĂř«´©Ú§ÖŻrŇšŐiç|:]!ú"v+˛M†š ¤ ‘G±,<˘`MŃ•ĄIᣌ-˘zvĹŔgş•-"+ŘÔ…BăÎěcęBˇĽÝ—­&XŽÝ¤"› 4’€FB0ŽĐżź“0§"´nSÚESg.ťŠ`Óś đŮTDŢđŞľh.˘k*"ŮqňÇłĆz¶ęî“nÓřĽBĂÍ"'׍âëźp˙Ľ G¬8~óÔ{{:ź]ąjçsË—íNĎ~ąqܸM™‡žNź»ëęťç¸g˝ńÎŃw~÷ŐW¦çs'€îŠŕUúőV’$Ąd$ąQk˝µÁ‘ÁÍąŰs…Jwe¸6w{Hx‚{Bx¦{f¸!·)÷=ń¨ë3ń őË€VB Ô¤·šôUGaęT2ź|¨~ř»ď‹ŕgáóÄy›'±JvŃáŘ~{2éÝ=ßźM> š v`͡;M>—%rĹ,ůŕčJ>8XňÁÁ’ŽVc}ݧÔp+EăôÓpËťŚěNFp'#ľłđGYßîł…Lß°,IJ u)däsr/Í/dÓ Ýr ffˇŁćǤEŤŘ™ťč—M'\”ó-+}pŇ/Óß.ţÓ­żi|Ş3˙ĹU˞ݵrĹÓéůD8÷ÄŇöôÚgď9;{éС_żőŢűoQOů î›@W'úDUîĆŹc|%?źŔĎá—ó˘Ĺ)[d‹Íí´Ř'c+D¤XŠ7ËX.ş±›d‘Ó]˙9:םÝL©Č”ĺEţ— ł•ťH6t×đ7ţ]€~RKu,ĄoRQ|ŃU,NCÚŰëí·ĽA±·”ľFúŇpbl[lrc‘ $L n…&3Č7(ęm,Ň.đ °\eR8ą`vÁjË=–Ű źuď,{ťłYüˇ€ż×Ȳ÷ýBL"Dë•Ŕtyşeş2Ý:]ťn[ /°,PX¨ l-‰–"]dWXŇŻpŞRoť•UĽ<¶Ľ°©đgĘcęýĹ–méőŚňĽútŃ3Ĺ{żIřŠÍ˘Ŕb&PhŮńŠćDsP˘9L‘†Hźč®Üę©rQ\UřP4áĺ­=sB4ŃX,cÓ4ÁÚŕŕµÁ]ÁĂAŃĚ .ňyÁ{$řKŕ/đ#›Đ=ôt ëhř&k˝×¶×ă«d3ôĺŚ{NĎą>‡äDĽo¬“`±˙gf|˙™î¦lÄGzZóB8TÔÝĘ>ôňľ,Ă0¶TZ>ʉÁ(˝2ĄWŮj… ËáÓŁ@űd’2ßíg‰—ÂR¸ŃľHő‘R\JźIŻ/ĄŞ„Ţ´ÔÔ)ĄĆ-tě§w) ±ä•V6ôiëCjű4ő!}č$G! ˇ ă÷¨|„ŤqKí[”qa´ĐÁ¬‹őÝÍ*·łz‚©<;ÓiF–“ý0Łŕ8Â4"(Ř;;'Z¨űË×`„“íKG›K1’ÉF:3Ń-i§ó–P×¶7˛…4§«BiŐőÚžßđSő˘ą1ÁS–pj.Í­qb-F–b)Ś…°ÉőŔnľ=F1›*—(a\\dQÄ$FyZőhŤ—ő؆…@ĄÉ5kÖ n“fbRčIî*ꎋE= ýi•-6…/]ŐĎň±µ{wŢĽzUßřĎŢ|xĚýKď›pË/§:›ŐeóW/đůĘĂ·żöŕäůoŢrřC|YdáŇŮC.‹â}F¬=üĆâĽä•7Ď Śź>ľ*Éq+…W¬ž>uŰ”©n-Ě|GJ…‡‘ç@j6ü·v{›Ď$M@aŻ%*-”K&ĐÄ«6sȧY’|!ÎęĐ P¶]äž(†{˘âŚ$µ m–HMŇf‰GŕÔn—šĄ6é$JÔçˇjX2||ÇV IF¤–)3ÂĂ]¦.@bÖk6‚é Y€¸ßî9—dmŘŻšÔ“Ô˘µÓ5ŞÔ˘9+*´·Ť aź¸ßͤ“(Î*'ť8aë/‰şşćşëËnż}ďľ}îdqî“Ű´Ëg?EfnÂŇőé»7uţlTYfŐ@Wź żĽŠ×@!:ŐçőW’¨ŰWé ťş<•I7.”Ý>»}V0`NŔŞđ™q©Ďt2|]q©/đÓ2ĢS?‹Ký.6ѵRËĎŚ—ż+"ő{˛SŮ ·źĄ+üĆ«€˛Ś·ů±t¶َÓ!˛$´=ÔĘ„xş‚ćß)U5›xď2¤Ś,QËË o1 ©ĄËfsî Ë´Ó'2űiaѨ…%¸-Ł%Ö˛Y쇝†QeK\j cĘ„9Äkv›ĂF—uŇŮ!ôäŐ0˛ÉÎ0˘giéđSŕĘěÜtQ‚­Łő3QěGa®vőŃkžŁY[¬ÎĆŤ»g`Ëc-W.ÓwążsďÝ˝‡Ź›pďR}îP4Dg3€˘ éwÉĆÄ˝ą™‹^e6‡D!âË&?;LŮ:­3Q Z·1~AFŠ,bQA‚E0 ŮeĺÉŹi®¤>mřĺľFÎj…š4›łÚâsE*eş!đĐ˝Păl­Đ¬›%7żÆ–‚x%ňÁöŽé·÷¬DQŘ8ÔTlI(Ő¨Żr%®LĆ“I˝\g™çůň|Ë*ôürŁĽĘňe=^OÖqwJ䍖ÇŃC–ű”ŃSĘ/ŃËŇnĺmôĺ:Ş|Ťţ®śCJ G źRŚJ•2éŠEĐ]ľJS™]×kńС#çč¶D1Ë@qAŰXB±ÂZ‰ ¨VşŇîă$ŕʡäˇ$*§Ë|)~ô*E’ĺ¸EńX, ≫vEAбW” ‡°P®bµ@ÖuÝŇd!–Vާ MŇ-Q˘ăë—¤lŮ v¦:Sˇ@űÉTöşVŕ:«é{•ÖÖŇ7˛«ü.|PŞľ+Kf®uW`ü‹ôő˙s2žH~} }źčĽ}îâ‰+É##/"$Ľ ść®ĄëmłśfÄől,‡®K'ěm#Ťĺ/c „­eăş%Ţż4ŢmÓĄĹěűgÍ<đYcá·a]ćąë€$fSČßŃ«Éě[.ňŮ—@Î_Čž±~:ÔlF»Ă|3<{@Rł¶ćLL‡!*΂ěSćäĐ)cşÁ5g-Đ'ćôĎ'{/Đä˘ń3Ć V1Mż×˘Úq7+…śQŐ8ĐÖb7ćcÚôr 9u¶Ż89ŚTpı薱©ěçkT'&ĽÂ;•l¶Ů°ENđ2ŇŢ?¤˝—´_GqŘŁżvJrTrş\IAň‚d:ÇmvŹÍf—!HO*˛.§/dŐ "Xrń˛Ă©Úm¬{.°ŁôJ¨~q9č›§ŠçŚfĂôçšlś­?§+Ń1 ^¬Ü¦Ą•LŇ-cśx±ó6'}Ťe’nŐÜŔć¶8Đ@ĎíĂgÜgć0?88Ş#• € TĄ˙ţ€¬jr˛í±ţźţ -¦edsŢ„ş[TŤ’W3' Ö9ě™#-¨—# r|÷Ď~ęG6WN¨ŁÖďČn©f ůF6W°Ą„rćÄn)j´ş˛?‡u€Ţh?DpoĐGöH˝č÷ ţä ń¤®›w]çg×93'ö*Q>Šúg_.<ťÝí˝ý®jTćb/…îvÓ7ëͤTŇx±‹ľ.Y±÷ýź>T%3Ťěöł÷¸"ŹLżrđůZľâůŰú^¶Wşĺ•çK>ýčIçďČ ť˝sĚ9wڬŢwţ0čjx˙ şZ#ţbFVW µ,ě}}6ˇĘöł6ßëŔV‘'‘6`l řĺIĆŰěGŽÂ/;\ŘQ4^™¬žęŘĘo•¶?âhÚÄ6é‡ĹˇűŞCśŰâµ…´ľx€u ľÇ*—»¦đőR˝µÎţ ~HyČú2iUkýťý]íwÔňŰGÚ§ŠË”Q«Š\NGŔţˇH•¤ťBR"˛·Ĺ)g%“ŮWhć"'É E‹Ŕsŕî;Ŕý˛a‡Ă¦YÁ$6+§jŠč E{˝i!ZY<Y8b{Ó†mq•ó¨*§X,GD(U)c\Ř5Âv«Z 8f–[u¬đËş8Vlbżů6X·Gą[IÁ@öçj–mIu†ě˛ö©ÖŃţYę"±`żű—ezúűvßáX/3f7¶P±_Ă”k˛ĽŐbäT[ŮËë9ŐjżšB÷÷äWkěí/o5.ČŻ¶č‘®ź+¨głôĺBĆ`×+üÔÂWĽ„řöôĂ}şg¤,ľ÷ô}ř®ŹŹ HAŠqú‡á˝UśK«ťżÇWŐ§SÔęç§Çqß'…ČB§Ćňcý/‹ŘÖÁg§^;ôr#ĺĎ&^ŮV5Î0&ŘÖf8ěŞ9Ąk0ŁÚťsŹłr‘ Ă%ZE·îrD­şÍ2e°<ú88 j´bů,fćÂ{şú}Q¤şŘ3ٱKát›”Ź÷ŞÔčFR-.ź-ŕ*˛©E¶~j?[_űĂNk±«Ř}ĄŻŢUď®÷ÎwÍwĎ÷Ţ(®´ÝčĽÉs“÷ŰFç&×&÷ťž‡”ÖWµWś=_*ź{ţiëÔ~đd"ą&ëúÜÖHw qÜîŕÁ®îů6W×;_U‡Şnw0čq»ă.Ĺ;”wÜŞx¬VĹM_챊ô(˘EHy䵉´’Ú}Ŕ…îi%uk­Kw‘k]Żą«ÚďŔhhXˇ‡¶ô¨ÚKŁrcŐŚJT8co9]*Nj[ÂŃŐ ČyťôW[éŹ ´Ž“Aídޱ=ĐÚ„45YW6ŞĂžĺÝőŚQAKŰA;@;ľ±ű)dÍśÂÝuŁ'óÉţŞjĄ ŞÚNôÂ[í,0~aˇž†Rô×4˛|ÚÍ=Mş‹ŚUaUěý¬¬{ ¦âĄŰ<Ëj®ô;‚5˝čőŹ“yÉż·¤Żż˘°×ęÉ•éąĎkĹ…á…Žľ¸óákVŻ$ Ďýv× ú ě7ˇđ2Ź{YQŢÄá şÝ"ľK×ő´Bťňśń›µ¨Ľ˝w/wöçei|¶hËĽů[¶Ěź·…ü~ţĚćů'p˙ S…?Á˝üčĎúômÁ]Aň­ô­›—Ž»Éaé°›Ľ&˝ć&»¤]n˛MÚć&÷J÷şÉ­Ň­nrN>ç!×Ë×{ČTyއ¨˛ę!·,AlEśă;÷±ŰVkl¨Ć†éO¤–»K·I÷Jś„Ýý=5v›ZF]÷‡*í+°Ô_®!ŐpÜ˝“` ń9#_E§C蛯ČÖŞMŐtÖ´kěçX´ě/†Â˘Żö›¸´±±7f?8…˝1şTłĘ/ŠR~7{~-ťVVUÉáLă?_W3¶dÚ” `j8÷-ĽÍ0ő‘>šaę´|ÚC°Ś=ä„tÂMŽHGܤMjs“f©ŮMž’žr“űĄűÝä§ŇOÝd‰´ÄMfËł=d‚E-ŔyOź@ąŚź…FĂ>†~NZĐ#tĘ(V–e:ůÇĐv®ő‡c7‰[ałß˝ˇśAĺäkÔCŚŁŰ€ż†Ŕý×@yîyŠńĂ,4žßę ţSĆCë l‚g}kâ‰âö×]ÇĂłÎS‰€ë'@ti‚r=í<żśâśŇONWĂą'áśé´@»ź;ĺIz ˝îĎňáSjôśs7ŕőÔ</íYźe {î„"BÉŇʧPž‚˛Ę(#ˇĂł<—cü €Ž†˛Îŕ×ĚŮ.ţ|ýę»LţĽ„O^ÂźęĄ|yiÍl čwSNˇwšă§ú‘ę8Ş#©žŁzĆ<˙ŇşŰőÉ ŔÇTBSłr]-WA˙–•}ĐĂ@ď)™Ś8,óśŘ’ŮÁą2;Ä>˙ŠyĆ˝ŞË¦ÖeŇY{ZbÚRŁYM;*T EY}ö Ó7ߡťĚúgwˇŰ„s@wЬżŰł2ř„~/ä珠M0Ž ·äÚˇL§8a´@(@íµ‰ÜŔ3µEwٵÜGŕ/Đk+“Ů‹Z4úţ6k›JkÚ&LAO‰_ˇ>ü$еmhĄíĄ˝ĽŮd/艣¨7˙<śăE ś·ťá@GĎ1ľ ×.— p!ÍDđěh8‡ŢďIvŤŽ\Y|<ĂpÁ®_„ň0ĹÜSô˘ńĚźř m&ˇ) COJMčIqČśí€{ü®›Dű×…˝Ţ‚¦|mÝ´tbü?5sŽŰ ăYz ×8Ú‰Bŕp!űŢбë©üp/ ĺq čaęOlAů$*.DwCŰÝčIxî]Đv;Čo/Ý;áúĽ¬ŢFđě;ˇť^[K}ę#Py‘t䛀X¨źĎçľ@OrWˇ ŔÇWČ[w ŔŇÔiĚ…ŇŰ(l˙ÖlŮdÖ¦5Îç4t m'čŹđ+BjCđkĐ|~2ęĂőŮu˘ü@V@Źrt-˙;ô(ߊţżöÎĽŞâÚăk?Î#Á!8É9äđŚňś„$<‚ Ź$Ą%Pđ…5Öë…c}RQ¬ôł*µ —C˘‚_Ą˘ ‚íZ•*Ukk­E©Ú"’}˙kföÉa“±Ţď~˝ß!ţöš™=łgöěy¬Y31+Ůoö Fď˙4tKßO•®˙ţ©Ö‡ôwŃ5f5[ŃöP˘ąßé\÷˘ťä"ý1n=ÉńDO[łs ébeµq”YŻŔ[MÁ7EyŮ}JyQÖh9í2vP>ńžü\¤ă8ćC4őtäIŮ6]ż‡6őú4Á¸ľ§=aµ ^ËLŠő›#´›Á0s= n{ä/Ŕé‡î6‚Ţ·ăŮĎC6ąĹÖŽFz Ťd‰°µŕAđ˛}/ΧŁđX\}­–SüĎ`®Ú§V ㌏z‰üFšZ- ÚâĆ˝śŇ=K)Ý€đl¤sř]}Ńźžˇ\¬tU¦3Ăcę1űŽö÷€Ěř Ž‘–jnřÚeűşŕű.ßőű7ę)Űu×Y‡!gi‡(ŸmŔ?ţv}Úß á«E¸ăűˇ­׹3Üéw~×®üzŐĹb·h{¸źĆ3fâ§ß»‡Ć3îpď…ÓýćĎş –k¸LhN÷»§ŃFĎEYűpô9őďÇ8®HźDţ4Ök z•11ő:’ëŐX#ďŰßÇţ.Îďň…Ě}429˛ rŠ-cű¬łß:Ă챤Ł8Žľ1Ľłgţ}g/xěţßÎK#´U܇ˇ‡AŹ<ýä[ü{p'1–|Y6bšů[„aön’ŕNEŘw !:ńÜ×!ü ÄŇÍľ´^é•˝¶MĄőŞçUÉô'^"úâS°E¦?± \÷'óů‰ßC>ů â˙énüĄĽ˛ţĄŕ9ř?„˙*P ÷}=!‡€ é`X9múŤËŽ×_UBg™‡rúŮćyłs ń•Ąý=»Îµ†ýý»’16‡”ő€5Ó;Đű"±kź3­ql‰ďŮ‹9Ó: ťňÖŁY—eýYčŹJŠő›Đc‘/Qş-Ywfý•ugÖ_!6—(ĎL^ç‹r©y#vlŐ>Ąµ ôUňJÄ9®°öaěIFűţ kŁÇř»Yk?ć®dĚu­w?|ţ,ČĎě9Í[Oc»Óľi˙ŮΑ_cN-TÔ9č,ÜćĹdĆ9ź-]ÍÝ_{.ďdŽŽť§˙Uż=ĎŰ$ڧBƲZ§^zšĐ…ż+=÷lýN˝ă¬ý˝Äö;9íľłíŮúLęĹŃďÎ^[Ď´ëţvśý8Úß”uT ĆjÝ€ńúż•0GY÷#l™÷K*ô>E…đ?0o¶}YĎ÷ ×i÷°}›˙˘^Ű÷áO1_q«ő]µgg»eý\臨31ŢÇĺ§0¤­ŕjű[óyż®cÖĺu®Yk}fî°K9‚ľ ž‚?ţdŚĹéîTŚŰ!úŰă!!1ľOo·ńY'Ý7‰8S„my MÂ8Ťym_ÖŻ„MŻŤř˙‰Ëű(·bőŰv:ř{˛mČ`{‰Ő¬ěssÝÇ0ÎĆ|Ŕsňť%ö„®4ŮŽ{Ś~dtŁReCN·mÉlźâůĘ=ŚR„#ÖŽü.ťkΡRPdĘ}Ş™l1ţ(öjîd»»q1=§ö·"‰›hm‹´Ö[OĺŢĺbżéăaşa{Ýůbe¦=ŻňśŘíŹm™}˘6MőÎNť@”oMe{Llľv:o9ćŇcÂ%í]č6ăęĺ~…őyÇöNëe÷\¨ćřĄŃ9ßi§źCÓŤeX÷Ů6ŮŤ‡čRó ęŘY;/ÔËÉÎt![7{¶°őÉý¶Aőه+őüř^“ů›ą’Ї“ůű[ŰMą?WbŢř:ő6Źi{űslłő×-úč5č+hćj±‡w›q­Ť"ÝUrßĚ]ŠP®H·‰÷Žlčöv¬÷Ě™ô°«Yôtk;äuúËbŹ1Yíö6WŇ aÓlßĚ4 »ő@sŔ÷ß?WĽ»’˘®BH—Śuż#Űć†áž×«l¤*®çY*÷„Đ^»QૉrŤĹĐ_vb¬óáŰMÁwM¦[Ťw(ŰĽ€ć©TĎhĺÖ>íCHhęŚţ„żůCń7RkyOŘŢW“öi:!Ř ]¨˝\f>ŁoŇú©}ÂĺÎ’n„Ť¦mű›hc g˝Nč?BŢ%TŻ7#Źő( ň1RĐ˙ ÍĺŠ*ź‰ćlô±S™ŕiY8A8Ë<'*ĽŹ„ł,q‚đ’ĘŃYĽÎĘŃYxĐ Âß@9:{nŽ„眡|N^qĺ謞sť <÷ ĺ¸Ř Â/v–ăÖ±m»±6}ňwjľ˙r*$Z_ŰŻŕĆúÂZ üżSń~ °ţµ~°V¶Jó,^ß ůW€uµ5˝ť¶=>yĂÎÇZ Y2/N۶Cć-Py¶5Éô'ź‚|ÉáĎďËüDŢ<ö¶@ć€5ęýîRůFdŮŰV·ÇoóÉwé"íX¸éýUí´=#±vAţ`»č‹Ş\ěÎVőÁďü,?«}\ /Ě53ća®N÷l’Ňüš*ĆÜý§ĚU׊ńđ]zBŚwĆľqTčN‚ň•°ŢŔc¸kľ·«sA?™%öó®4ŹË|z»ţHuć5Tjl^<ă-ňű2x6ŹŰ¬s+č" ö*ĹžďťÜHw&>-ô—ÄI7˙„ňţ„Z±f»ËUMŇ»=ĂŕżóúŁtŁë?č&ďŐÔęţe=H 0_ůÝu4Úő}šdŻmÝWS‚ëčJz¤yž!ßDó}ň%Ü ˝î5ŞDťŤ˛óŽîÝ{(áĄ}E´?đe>*ĘŚňB3±¶N·Ď ¸ľŤ:©ĺąXě9ýśL¬ŃÉus÷dčI€îU@w%dŇz÷çx7ôÔ|±/ż@ŐýpŢň|‡ÎuÝIA{íî~ő<mÉűq¶=şŰŁćBˇ/¦‰}-eJűĽß¦•|V©×ŘzTT§P6‚¨ÍÁ~Hž?ŁďŻdŚľ!m ;ˇźö¤|ŢÇ6§Teűx;Ń–”>ëiĄ)r#-pßAU®‹P/=¨Ęł‹Ň<)“ő3ŹGčuWóí:]´Š‚ř6Tżp_š¨úř„˙<)ű#÷/}a'רđ+ŔÍ`‘ĽĎ÷¬ĺŇ}ň¨|ľ¸włŚýĐâ=8=ĆVó¶D¬C±zŞ:KuÇi˛}ďžŰOy—ň+Úиó™Şöřťr5äBŰ=ďmôŃű‘6ܶ픦<ź˛LJˇ˛|\Éźr[c]Ď)ťçW:;Ďr=Vö3[žzîĹ–—*ŚžËéBĆž“i—–ĄüÝżŞíNŮÜúزóŇ&×.ݧ­źbĄř&d(=–ő÷)bźźĎćśč®ďŁ śĘ,†Ďt„3 ăąęT”žß)îUHĽ~'Öß”ů‰őâCĹĆа–ćťXt|ľ®ÔýňޡωĐ˙Ďę€<čÁŢ4!Ý<žhŚç¨ânËběz·ëŃ®ĽŰűxď…Ń2Űů«çţ«ßń_ý.ßÔ{ź©ě±¨3z¶äł{îËŤď#ř»DśĄŮD=nÔë°ěU¬fĐWúđY%c>ÚÓ|q^1šć´vpÖ¦Śň«ó7n74;O¦ě|öGB5ŐŹgľlž˛žÄą©{ýÎŘ.Pc_nB%=ŞÎÉúylÁĽËý|¸ů<-8U糪äzÚÚ€yŇ…ř©®%T®żlýÔuÄʭ—\ˡ äu›bŹb˝Ôý¬-ę¤[śŢD?ŹkŰl†ă żđ¸Ň·YŹ˝NŇö'Ţ^.{ě5ţ‰÷8A˝ĹůŇX_Wš‹°¦_D˝Ťqúď7—Q1ĎĆHčV|ććFu^–moAJ’P/•Ć1ý›Ď×đą ÎäđwÚŤ9€ăďéíőý@a_şăř›ägpOśéÁ3ř¬ëEV®ihÓwşőkăAČIŠ‚kPŢY´HżŤ† °~ úNO„,†;2Ô€‡ÁR:W„ź@;ůńaÂ˙ ¤ k{ÂŽ+VJřľXooŁzčÄőxžŚwP¤‘¸©^űĄČ«Ţ(ÁóOÇJÉ€FaôTn7îߎt­rýÎvŽ/îŮqÚă¸>˘ňÄTîîVX-®b«Eű€Ć™µ”ŠošFŕ[ďSëÖŁöÔ–µţ˝şó\€˝O®¤ë)Z了şNB?8Śvp„Ćą>§‡\E4Đ]‰yěIâ¶4đÚnź'g‰ZűlŰ·Ť»šz&Ľ@ń ‰ĎoŘRßĚżţ÷ť)ć#q–^címłÔČÄůiŮׄžë)Ą[ŃŹËÁ$uî{ÜŠľgĘsŞÍÇ)KęqĽ†jCmYÜŞ06DmŻ,ůL·-Ą "©ő¤ţ^×ZŁxŻBŻäóZ"í·äşÔb{őŹŰ,ŽŮz€ůżŢßŇűPťíuu6Ł«ł§ůĎrOĹyvŁ«ł]ú{.]í—ˇ­˛Ž\ŽyĄŐ˝É:˙łŕ‡_cL˛,a•úÚ Łúö¬A'S®˛‰˛ť4ăW¶ąRŘôďĎŁ›J¤mŢúRýž°§˛mŽőR#SüDő{ üü)Ę~+~o"j§=źfňXËcŞ3řl7ÖioęylŃ÷Đyú—r Ň Ç"a—,AK„n}°SJ(A?ď˛Zb$[{ÄÔ]ŽYáyÍ<žaţ•ăU–ŃGŽ_ú9éo!ŽÍ§ŕ/ĽWĂëi±¦ćó?sÓrśc!Ű!῏"×OÉÜů÷`şŇ—”nąŮ!wز+˝PĄŮ¬Ňś_íÝ`.é!ćäiźíŤ®»ÎgŁßë•I¸Ď:H»žoŰŰĹwÂ7’{űšs]Ŕű9ümí5˝´›µ‘u1Os=ţ zY"ćÝ©"Śqbż§ÁúT•“×'˝ŃNý최˝Ö k®ĄÇŚď@Îg’Ä|˙\Ěúö1Fś!ŮCŹ‹łĚ{ń&ÉyCĚ!/€×ŔŻÁßŔ!i§:ů:˙î×Kt=´ŽĎ´mwF}í¦ďTęín‘úЦëŘ.Îđď0âw§l6ˇ_ń8ŢŔöńop×čé ŚËĆ(ŻyéYĐŇ9ž>D ąD‰7uűśččVIxßäk‰R6Ąľ'IŢNF¦¤×˘Ţ+%>h¤Y&ňŹ—ôĎţjäaĺ6ď9čQ>ľß0LŁ7ťű 4SĚ[#ęŰą—h ęe\w˘ń(sČGTü)Ńř'˘~'á}¦ ,Sń—l šńW˘ŮÍ˙>T›˙^Ô #Ş­Ť'Nś8qâĉ'Nś8qâĉ'Nś8qâĉ'Nś8qâĉ'Nś8qâĉ'Nś8qâĉç¬Đř/ZŃ1GʇtJˇţżľšOvűąHßN3ŚMÁL˙kĎčĐŤAŤůYţíĆ#«q¬?Ôlä4Ąő,L.jđ´q ŕşl­Ŕ¤:#á)¸.a°´‚×€›Wľ‹Á:p„ďY†Ż1ŕO)`ôFÚŢ(c˛Ń‹Ž äǵLu`XÜ"‡,ËA+řXÜ ˝ď?eďŐx·MW\U(Ľ—Iďśo oÓě)/š.eédmŚŚvîů2xX‰”†H™–Wf™T¸ł8ĂČŔKf ŕ×âŞéż˘dM#?­7zRč†[…„Ś´¦Ü`áşVĂ$ÍĐ ŤęÉoí4´Ć¤ÔÂâDÝŇŹRůőżéÉ;úGMÝS ×OŃߡ- ú;řůţZ®á:ǵ¬­`?8 ÜúüĽŤź·ô·(Y˙=€"PÖVpxôß㚢ćÖ"®ě.ş~×ýMĽÖ›¸&ëoŔő†ţŠöߍŁFnŽüĺđç)GŻľĘ‘–Qج˙¦ńř ´¨ ľ4ZÔŁ?Ť§óŚţŤyçú›ŤĚĆq‹üÍú»M|˙úâáúŠ%9€śPT‚ąŕZŕ†ë\‡( îëA •ášú^đ 8DĂATŻţZ#˛iÖ÷7KüĹú>ýEę…UIČWôÝBľ¬ż äČlČ˝úîĆl?wĂ}BšČČÜwéĎ7ĺ¦ů­âT˝uçǵi ¬n˝UďßXďOĂCvĐ^/!f#} äFÚŕĄĐţPp`€/Á1Â…ËşŔş  >đxůĽ÷~¸řĽm%\| Ţt \| ^µ.ľ므‹/ÁÚ:¸řś6.\šőµĎćđŹšvĄ(NÖo@-Ý€Zşµt™ú üCÇM.ŰCŤŁĆÖ„ň ö‡[´đsZř-ĽA Ď×ÂË´đ-ZxśľT çkaźÎÖÂ!-ĽC»UÖBOźâĘÔÂ{µđSZ¸A µpžÎŐÂmT¨Yď×8ůÉz?Ôh?´ů~ZqÝ,á !R żŚÜ;›e˙¦ÁEŇ?lLáââIú.$܅ϰ‹Ţ&>Đ.4Ł]xČ.< ×"Pv‚ŁŔnÄŻ×d\ @¨ËÁQŕĹ9 tZ¬Š¸E¬@zűô]ř鏟~zżPVŠ/%?e’±Ę§%gkÓ˛­l}edQZŞ7µYKÚöʤţ#‰Šô{őU”…qź’«Źgů›µ;üĹ=µS¶‰V§Ť¦ –y5˙ňyYžO>}3daŁo’%7‡ř[´îśj›˙¸ď=˙ľfÎ?űvřh6µF˙A„lŢć?ŕ[áßSĐěEČsÁf ˘% ˘n÷]ŕjŻz n¬iô/c±Í˙źľ‰ţ+}âĆ|yăŇřBÉţK‚µţIx^©ďr¨ĎÜć/ň]ę'cŤŕ4ŰüĂQ„|éŚÂň‰Ls˛ĹgŽjÖ††xđT{¦yFz =C<ý<~O–§Ż'Ý›ćMńv÷žăMôz˝nŻéŐ˝äMo¶Ž„ňů/<¦»Ĺzä_éÖČâ˙OÁܫӊô0*ôŠŞ­"˛sU\|^•Ó¬%NŻŤ¸rJ´HZUĚ(‰\_Ńě±.‰ŚĘŻx*żU˝UÓî­AhDż«YŁŐÍšĹA·÷Ť¤M¨ŢNš–zű=}YĽýžšĘĚXZ”Y”6>utyi—ąęóg^3OqgE¨¨ŞŽlĘŞ‰˛ĂĘŞ©¬® ̩ޮÓ>.+Ý®}¢¦z»1^;Vv ‡ăKkj*šµY"´O-ćĎ‹‰™ăQŔ›-ă­‘ńňńrY ^Bĺ‰xy "ž©qĽ­ ąeĄ[ssEś^jqzbăěÍCśĽ<'#L{Eś˝aŽ/˘ř|’íQ´>äQ|ZeV{”eE4Ę ‘“ˇµÇńÉ8IGě8IGç KüÔóKň󵦱5óć”ÍĎ)››S6ĚŤÜ˝taf$|y °u^ ßDŚŕÜËç-dyŮüHMÎüŇČĽśŇŔÖ±s:¸=‡oŹÍ)ÝJsĘfToťš_Ú864¶,ç˛Ň𦉕çŹ:%ŻŃĽÎŻěŕa•ü°ó9݉Ł:¸=ŠoOäĽFq^Ł8݉ˇ‰"/mĽ˛z«—Jj&Ě‘˛Iď–ö:·ożš’Ś”kÇ‹Ć;¶_沾-ĐVž nů5‘srJ"I€o -Z̷ЧřVw'«[™ËĆöëۢ=ˇnĄ 85§„ň—\ßp=e–-*•˙5ŕ‚–\Ď.Żů ťýĂ˝˛Hč˛Ň†%D‘ÁU‘˘éµŐ[=„ÎĺWŠŚ±Ăşu+k¶vĘŔaÆŤČaă8,!AE<ýű_ݤřËĚa}G“ĘÖ–PCŤÉ®ˇc(Q‹wťS[Ý]Ч‡†Ľ`–Ż5ŘĎPĹ–ŐžżłÍ’ë•KŐĹ%eJ$i°«$úŹ++?ZcKđ@ú_:Ĺp endstream endobj 236 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MUFUZY+ArialMT /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> /FontDescriptor 238 0 R /CIDToGIDMap /Identity /DW 556 /W [ 0 [ 750 0 0 277 ] 4 8 0 9 [ 666 0 333 333 0 0 277 0 277 277 ] 19 28 0 29 [ 277 ] 30 35 0 36 37 666 38 39 722 40 [ 666 610 777 722 277 0 666 0 0 722 0 666 777 0 666 610 722 0 943 ] 59 67 0 68 69 556 70 [ 500 556 556 277 556 556 222 0 0 222 833 ] 81 84 556 85 [ 333 500 277 556 500 722 500 500 ] 93 134 0 135 [ 350 ] 136 178 0 179 180 333 ] >> endobj 238 0 obj << /Type /FontDescriptor /FontName /MUFUZY+ArialMT /Flags 4 /FontBBox [ -664 -324 2000 1005 ] /Ascent 728 /Descent -210 /ItalicAngle 0 /CapHeight 716 /StemV 80 /FontFile2 239 0 R >> endobj 241 0 obj << /Filter /FlateDecode /Length 250 0 R >> stream xś]PÁjÄ ˝űsÜ=,ę^z BŮRȡŰŇ´`t’ ŤĘÄň÷ťî: ĚóÍ{> stream xśí}y`TE¶÷©ş·űvÂ’f Y€îĐ$,!&D lBgC1#„Ő\ÜČ“Eee„ . Š`Ä@étĂâGAÁQô©“qWŕÓ}@rżß©{;4Í6ÎĽ÷ýń˝îđëSŰ©:UuŞęÔB‚bh>iäž4{¦÷äŕ§?@ČDĆř*~y‹ë«Ýŕţ‰Čń—_Ţ|ç w7Lş‘¨Ĺ¤Y9uJůäúëŢ»•¨ĺTřűNE@ëąńťáŻ‚żËÔ[fŢ‘·}w{ř_%ę3ůćé“ĘÉxöQňě3ő–ň;*Úĺ鳉î\ŽôފۦTüýĘĎăáµúłcuPx–:čiÔČü,„ĆićgÇT~C$:Z°?AÚLÝ„—jÄ jO?‰DŃ‹†‘N?˘¦[¨Ą¶4†VŠÖÔ…âi, :ҤÓR±Úśm~M—ŃC´Î|Q,07"ţAú#ý >ÖĺĐp¤KSčkís*5'ÝOÍh ŤńTNďáçČđ0=Bżw™?ˇÔ¶´ů ˘\Ę5_6OQZŞ/wŠyVĐNá4'™Ó¨u¦J™nľgţ•Ҩ”ž¦Í)]ÔéWP ÝD i•HÔţףô[jÍĺµZľc7JFăčVşť*i#˝!Z‹bÇ!ÇwćŻĚ/ÉIm¨dšF_‹>â*ůŚŢÜl~@h;íA}ů§Nź ?ëĐ8Ä\cţÚŃ‹"Vě/;˛4Üc>e>OÍ!O/´Čp”3‘i/ýťŽÉyć<ş‚FŁä×DGáihń÷d˘ś+çjďĐ%¨íµv=IôČÚI/ˇmţ“ęésŃV$‹+ĹD±B“Íĺdą_[­mŐŢŐ…ţ;´·ŹRŃF3éÚF˘}´_8–(7Šéâ7bŤ¨—yDţ¨»ô{ő“z#­±ľń¤9Üü(‰~AshÚöiŞˇ­ô¤ctśţ!ܢź*žQ/ŽČŮYŽrĄ|F>§ ×Vh/ë}ô<ý&}źţă׎%FąŃxj}ăĂŤĎ5ľmľhľ Ýi‰üÓh(ZôhĹ3´›ŢAîďÓGô ëň(Ć‹ëPĘ ±H<"ž݉·Ĺ7¨%©źÎr ,@©Óĺmh§ňaůJߏźňů‘<,ĐZg­ŻöÚSZ@«Őh_čn=MżD累ĐÇë&z&Űqąc´cc“ăŽďśś“ťÎŻŚĆ}®?5ôhř¸‘§6k ».hŇ´ÄZZ˝ßŠ>x-ú$®§ďŃ I"Et…ÜýĹPQ$®W‹kı@Ü/«Äj±N<Ź Ň€ěé2WŽ–ĺrŠĽOŢ/—É­řŮ!÷Ę÷ä!y’·×|ZşÖK¦Ť×&h·˘3µąÚ}hŮÚFmżöŽöĄö•v˝Ö^ď¤ĎŇçčŹéĎę[ő·żpÜ‚źuŽÝŽ:ÇŰŽSŽSNéLrvpf:otnp~b8ŤľF±±Řx×8îŞDHŹLÄě$7ʶúčsčűô¸IĚ M⨠î9b˝+ăµŃâ>d®“şĂÄw č}2]Güţô!}ݸVoˇß…ů©–V˘G7Ó_Ĺďč„pG0»iŤĘ1Ë,…ľ/$žő®Ĺ8›‡ńäfç~Ú*śĹsśő9ôý}íŘŤĘĂLúeă4}­ţ©™cf`„a”ŃŚ»©t9FĚçĐ’—ŕgß5é±K˛1Ş‹iEhçë‘z=zđ^Qɵ{ĐaÔ»Ąč'g˘’z67űÉiÚKXcL„WaőJ¦ËÄ@Š8ÔŁÚ‰Ô§qdxGhz@üYIńśbŢŻÝŢx3˝IżCźřőŮF‘?wŚČŕË Đż_NźŢ—f÷ĘĘĽ$ŁgzŹîÝş¦ĄvńuNńz:uěś”Đ>ľ]Ű6­[ąăZ¶hŢ,6Će8ş&ő,ô -óŇĘzšďŠ+2Řď+G@yX@YŔ‹ ˇg¦ xËT2ď™)ýHyCDJż•Ňß”R¸˝hPFOoˇĎŘWŕóÖŠń#Kŕ^Vŕ+őŽ*÷UĘ˝\ą[Ŕť’oaÂÔo@”y CgO­,,+@vŐÍbó}ůSb3zRul38›Áh﫨í ĺí TKrµ€P$_Aa ŃWŔ´ÔÂňÉâ‘%…É))Ą="’ob€|y¸t•„ňU1g~ŔPĹx§qmh‰·şg]ĺŇZ7M,Ko>Ů7ąüš’€V^Ęe´JGąös>K8íEć­óKîŹMÖ* ¦yŮ[Yyż7P7˛$<6…żKK‘xeęвʡ(z)±h´ĄÉ…Ą%±Ezą&\+«~S|…RvŁ7ăËóM­Ľ± ]“T Qw¦“’üŰÍzJ*ôVŽ)ńĄ†$űJË :T·ĄĘQwÖ$ú˝‰gĆdô¬v·˛¶şeśíhŢ"Ü1Ą)NąTrvŤjjYÁů†A!ŢI^HRâCťúń×”~T9©’áS*ŔŚ™É/«tŕpć8RÝ>oĺ đ=rfHąâLu˙@ěd=iR5ćÜôô@ʬ"F>ú2Vţ>=g×Ęľľ ·ÍGĹhŰňŇ™hţ”îŕ%µ~šO`ţČË雷ÉAňg¦—dÇÔ…bÚŤĺůˇ&ö24y+±ŃŢ.ŕJkúçŽoS8u@@Ä_ zŠ_4ÚW4r|‰·°˛Ěnۢ1gř¬ř~Mq¶+Đ&żDK–¶K&k*JyMSbö”4č©řçTJ=9 A)U€đ ¸Ë®°ľKcSRÎËSk¸ÂjÍďK‘Ól¶”égúžá?Cşć•äŐÓdŃń••±gÄ ĹTY9ÔçZYVY^kÎźčóş}•ŰĺłňŮʊ²P‡Öš;–$†.-E%¦ŠPVIyŐ>±hdµ_,=ľd»;™EcJ‚RČü˛ĽŇę.+ŮSĹŻBeS(űĽěŁ"EJ—ŠJŢî'šŻbu ü“j©0W(LФZi…ąU>0c¸óřU`PŢV)ťF­âoC˝QŁXCo”čr:Ą¶K¤Q ŚáJHw˙cPĂ áîď]Ő0†Ŕí>…Ż^Y)­RZĄâKŔŔ8ĺŐęNůt’ĽzLÚ#/Óơ¬¸dÉ~D™GEćŃ^YmŔ†âżd3†Ĺjű«ů™6ż>nĐ®D—ZÝ×}:HíÚŢ,¸íĉS nruAÚ@Xćě–ÁŤĂ)ßM'Nśă&;ĽéÓ˘ÔiÉţ66R­ö&Uč3¨50ÔčHĄŽ×iĽř’®AÜM@ľÖ{ĘÍ4égÁ?ôaŮßl@úqŔ:ŕRŕ* \mc4 ž˝ŔFäq=çŁč§tٱŹ.CY¬ĘGăčQÄýĆŮź&r8ĘZŠ<|p?†đ5ÎŤ´îU/ĺ´Š2˙8şń=á~Ř1Î4Ťed Śŕn@x<ĘeMCů3ôćQ¸{ ďażt,č[Ţĺţ”yT]ąŽ‹ŮŤö™‹đŔ(` 0íĂüYŕóŔż îf+´9ĐR'ęŚ4`@3P~ľ]oRőF=šęů•LçĆX–/‰ëő5°8&[$–ť°˘.UýÇun ”ű(íŇČőr|nţČ€ćB˝vŘß˝\dn„śC[iüŮŔ …$ô'hşö=ú`+Íq®¤§N˛đJ•G(É™J9hżä50yľ˘ôa2Ë`őčźSň*nDŮ{CíÄm˙čפ=Ĺ#íz0 m° ¸ŤĺCů™Üćč÷ŸĆß!m=Ę)b LŹęnő+Í˙ /ˇĘ±úÁ˘âoD›>ě^fBPzfC嵑4ąŃ<ÚHö+X߀2 ?§Aů±H«ô:ĂşÉúÁşáx]éęh–ÝŞ Kě1s ř'‰@7çfşĆF7¤ĺö™Č:Ëă%”7ëëL*ťľIéý®'ëT}ÄQG#YU.t+DyÜ!ß;™bĆ2=®Tu_Ĺú˘Ü.¬k<yLŘ´8¬®=í1Ňüť”®CC4ÔMt?=Ž<Ç9W@OÓpý˸ăNЇPżíC}tě ´t᪣îčËŕ},‚®bĹŤ(ëA}Úâ ­QízPvÖ ‡c“ůµÄ^Ç&9WąĎ˘‘uVSFxÜĎ ˙W ßsl˘ŕţĆqĐ4Qź‡xL‡Eŕ Q„ů@WşXĺşIÔcÉŤ-î÷ŔtÝO~ĘÁ5Do‡Q*ÂÇ:/Wóîrä˙ş8LËĐ_ż6Ú‘Oűs#Ę’ďa}8Đ«Âôč ť‹ÔĄ ék$eťáyÔšq·Ř |`ăoŔ'ĐÇ+€ËymŕůY­Łe–ľšG›ôs/=ú@H?#ô´G„~‘zIymáů]­-§cY¨ţn„cNçřfÚr?J?Nłőîpo]M­śÍvţyĚ}*ěS+ŽĂăé7Đ»L}1ýÖQM%ÜW\ŮÇ|űc>É5źÖţ„×O ÎŘÉ«6¨ŁŐJź·Ć<Áő3R{‡†úq€ykČk·ÇJŐuŞŤU:ڶŕ<ťď*{‡ţIşŰKŹ»şb~ú’ Ě%ެjşÚĺWí®«őúcci‘Ł­ů_J˙7›¦vcč0Ć¦ŞŁ%:ÓjŚĄEŞ},ş„ÇŹvÚ±Ž ~c”=q:ţ ÝćÜDKťuĐ»X ˘ßŁ.7Q?¸Wč›Ě“H[<ËFřHeźđ:ĺ7đx1ę(ÁđŁ|¤a”ý‡rµĎ!ďĂ´sI®ë0=íôR–G6;˝,(˙<`.°Ô‚ s[T¤ Ź»9\Nˇ=B™‚Ç‚ţ;Ś˝Ő”«=K±ú °ľˇ2“î׆CďŽbÍĐčnöë=©›v”Š´źÔúsż#–rTşx¬ă_Q±^ ţ:š¬i˛fÂť< }źŁ–Ć;&ÁÎşůŘ}ÁCĹÎ%pgš›9ť*ă'3žˇßIŮŠ/ JÖXćua2?ŠZÝ}`yá——em’Ó–ń\ň©zrľŕSiţ“rŃN©m)—Ń& J~;ĽŽćŠ•ć´ëĐ\î×çŠE@1 ësi-hč7ŔAŕ `đô>´yż ZĂű†ü=ć.PÄ?Ľ|Š —s®đpč_;ÂýŽlęĎ=1§÷<3NĄ_K˝ő;0g™;ÚlŠe8[RwĂEÝĺ'ľżŁýFźŽ´ŁH»L>YaíčŻc¨?@ă˙ |F˝L1ľ2x}ţwäűW€ţťüRµ]˘tč+Řä†ůŠŘE׉zóćs'ĂňS’jϵÔ*ÔO_¤Â#úşŇ—Ű<2îAŚ?˛_/ćGľÓÂŇŚlň3ôŹ‘ôc=đ3ś¬c=Ďö7•{>ڎŢh§ˇúČňÉŮ~§›2˛ţU˙‚ş2šüc¨;Ó2ж>ÚzC~B) mâF©ôaíZÂíŞŐ1ŻâWýŇóČţ/éŻb>ú 6óJФác6rÜF†…ć’sĄ‰YçËó˙'`켼üń´čą č*ŕ&ŘtďŔŢŔV}ű¬7iQĂ"˘“/ťşóÖŕSĎ!l,Üi 6 «ŃÉz¸+÷.°¨Ň“éŰ®L„żĐâmXoç—jń3ß X;'űZü'ďVĂý-;ů č# ? }|Ą °N-í 1}8ő6ü¬ű§_óĚS™ŕ_ Ěf{äűĐ˙^zžýÇ?K­3şVŮś7rńOÓP^„Fî5Bý1ÚKśEív€Í÷#lďsÁ=N˘?˙ËĆ÷Ŕ·úbł6ĄˇěhزĘćfűѦĘŢ>¨ěIaź)*ʶ3ŰŻl;łý ú„Úçí‡<3čĽĎWr…Ö‘°ąUö¤)@Ľ Ě{”Ź4†<ßaî‰ĂúúlËĺ ű ó: ć›X»â0çî»Ě@÷ÁßkYLhM Í­gͱgŻi˙Łţź»Fţ kęÓ" żÁFd|¦ŤÎŚČµřçâbk÷żĽ–źgŤ_§˙]hť!f0e3 ?äöźm—FÚó_ĚÎýąţH»#Ě_͸@ĽňGÚ%!$Ί?[÷,{& ă-„q÷sqš§O7ßŤ× ‘ă¸iĽŮ~ç<* CTl nGşKí}—n¬ć^ß\§(ŰőeĂ˙‚z ćłÔZűĚĄb+léŐŰ‹…đú>•¶ÄFéĹô9RoŮ>Wö!ÚLÉľ}ń=eÖ@5pKS_c‰˛÷hXyyź«}fţ€Ľ~8ź-x>Š}ŢmĽß?ţ8ĚĹÉÎjęÄçj˙]‡ýë§_§i§ĎřĚgŤJsŤ:[ţ€†cžż{âéú§ćfu‡“€­Ćmˇ{u¶ö}—’ĚgCĆ·|÷c>gźĎŤ3°§±Î\ę¤î!¬łřÉH;‰Ď¦äßřÝ’:CN°iźOńzĺě®Ö–açČ€R˝/őúŰ÷T´Č{ťâ]˘îdNR@ŽĆń]XěFz$ćuzÄ…úÄŚŁ5FZŁßFÇ U.>Cî@+x˝ ­«hűĆsśýńYf—°3MUçH›@É×ójs]xą!>W>Úf”u7dźł_жA>9@đ=đĹąĎ;Í}öąç|{Ť˙eÓšyNż–.Ń»«ň¬3Y¬ŮŽćȧą’]µq¤,ˇ˛Đ. çł…B¶‰}FĹ÷l ě;¸Ţ@[;lڞ réčŻ|f渟ôJ%7šŻ6ĄÍ¤ÎßR:[ÉręÖ˝]2p“6 äŚŃ÷©­:“|WÝá-´1zş^Ý™VgaŁś›>w4iÚę‹ÓŔŘj‚ů…ľ e1Ô˝źůŞŤŐúHĄź‰¶n&ë?Q‘ľAéLkűN0N_pŰU@GűÚÁwoę~OQŐV‡Ńî•4BŐ‘Ďć6AoŃ>ÚZu>8!”Ö5„Ć‹ˇŻ[ ; PîPň8WßS‚łěĂJÔ»Ľ h‘ü;e3Äć'R‡‚04˘l–9ćâ»_ľ¶ďŐfŹ >|·uśÓ©´Ö].ŁCn)ö=aČÝĆr«°7l·±> Hgţ 8)ŹňÉ!ň—ë˙X2inčjŔ3цtä;@ýj´Ő™ČŹx™fFáLS#a‡'EáLó"đĽsČqľtç“ă|ái‘@xÚçË× „ű. _Q$^ô3ä8_;w‰»\@Žá‘@řđH90?mvcŹúŻźX«ďĺ7†—Nž‡ű^óŰżÇN7ő4řczlĽ—ĆzlžFž—e¶łßiÚĺ7Á} ôr«,ćmÜi•­`—ٸޖőEĐ߇ůYv”Ýř‰Už*r4î°ěóq¤Ů˙@»Üg-ąŰδË#«ŽŠďŮÓ01üLĚă \·Ń§Á˛7bďo>eŮLŤµv[®łĘmŔ>ŃL2ěřE§çÚ}â/1ĆňZí’DLy®Usî4j¶VÝnßY˙†ç;'¤ŃQG'l8äËvĎáj?‰y_í'˙˘îŐ'+tÁ:ň.üCUĐĂ–7ďŁn\†ş—™ÁďYĚulshďŇH†˛5ęÔZťËëAěeT꙾§$äźlĽEKť×ńűµć53¦Â˙KŘ|GfĐl×ZZjBĽFC±^ĺ‡ÂC{[çBÓtô¤f!ęú•o"ü>ň9’ČÇĺ}ĎtrBe7ÝÝoć}®ęwÖťeNĄżP2C^ĐV ÉˇwŞMöbO®QOuçô âµp¶Ç¸:EÝŚŘŰhQŚ¤ÇŚëŐŢ} ţ$ő{/Á÷OÎ?SOÇ˝Ô.´ww~€v˝}hS> ť8ÖĐăú䵆Ľę^Ë>h˘ˇ<řľí0­ć·‘vMČŽj˛oě3‚¦2ěú0ĺµ3¬ţІŮÖ™B5]Íwc|ʧ쎒‰ďńř. ů\§ěŻÁtť1kës4Ôů*ĺ;ňa§_Iů®$ňĎP"ŰgĆ ĐM¶×ř ÇKŽŐ„1n棟ö‚Ţěń=Îs6ŰsÇ(+\ŤM„5˙lm9ó­I­ű~eĂň˝˙a›~dÓ7Y×ŘÖ‹¤‘ďWÎ÷žĺüv¬=ÎBôĚw/‘´´é]ÎE¨öNć\ôź=»S÷ő§Bôě÷ö™\µíňČw8§éC°Ó>¶íŘ–Öą"-Sos.€¦7\ÇÍcÎăás$ŔozÎg'¤ëDd»á7¶ĺöÜ—łë×2u&ăĺµŢ€nćź—é†3m>s´=ó;X~SÔÚYCc´FşűĺzsĚIď™_0PÖ}6öÚXaŮ~ćkŔ+öI˙]8´K¨î(Ąkl{›íŘŰ,đëh?-WÓIXÂŘëęVŽţŽSöËcí1ěÁ-e{A­q4Śß%Á¦l©ŢÜŘű~uöđwP )h—1úCęÍčh…Ż‘ŽßŐęMŽőNi¤ł ŤÔëŐűëÍ/żőý+p ĽG`sŽ=ý¶†ó`{í"íS´#ćmö¸°śµ§AÇZĐ5Đ»°Gż 6ęÇp€Nď z;pÜi s€ Ŕf;üW”íh‹Ľp3°—Ö·YTł÷Őjo˝ß‚ćE—o Ý}Ô[CŘ@,0ُ̧ăňTşlů5ĘřĹjɶ;q.k˙®ÎŽŮqˇ4y§Ó8ŽŇĐŘU°©Ú‹ÍŽ\s‡řš:écřýŮ@O6ň~čEŰŽÂh5Gkůüő¬wˇ{r›:öPÇC”팧ŽD*Â^ ׇu¸„şaţá÷×c­=Q#ďí¦ň{b~K¬´Î˝íóqĺv Kb`ź#žě7ÇŠĘM?ą«ÖNő–^°ő¶É˛ČÔűiڵťk”Ń2ă)Ř’OŃ{.*·ĎşZńşwu&Ôťň¬7T&hăs <Fcnh:{eĘoÚX·l[ÓoÖâůÍ•™ĂwÚeü^Kń^ ćÚmx%ň]v˙´Ťůfă˙őýVäýÔůî‹.ö6ăbo5Îň˙Ě;•Č·{Ëq1˙Yw0ą/Ó?5_fšçQŁ#»ÍŔkÜ č˛‰¸ K)HwŻücöC¬'Écź‰&#Ľ-毶úOJ˙î·ň}žŞÎ\ůlľ"ě÷–Ŕv˝íRm‡ů*Ďsę"©3ËaagµąMç´i¤šk1§ÚgµËxź¦ć X'Ď3<‰ď( žgÔąäLřS¬y‰Ýr6FĂp#~5Oń¤]žëvšłÔśÉsŹCĚWš¸ţol`’źÚď-9äW|WÓř^sźäµIÍťŇĘWťCÂm˙> Ż}ün˝ér/f/ŮöeČĆ|5Ň1»iö†#2ľéçŻüÖöÂëoý΋˝ď˛ßF;/Uű5ď /“ĂÎß{ŰgνU-¦VS’ĎÚh4ťű6´§G;ýŃ~[˘×[Pë4·ă—j®t­*sś­wNe×đţŽ÷­»{ďÚËĹŰşŐ u[‰upżó·×ű]|ßbă· ő†d/=ˇŢ2ďĺ˙‹Ł±é˛ląuŔŕĐ™hřŁ˝Ź›Đ´ÚNX‘W;“ţ>9]ţ19•Nt ±|.Îŕß+`đ}Q4{O·ß ÜEQüŻĆĘ(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š(˘"Š˙Őü­č ˘ÉI’ܔɿŮk ’ Éę1ós[h›i €H|{*@#ż¶ąĆh‘íŻmÝVŃ`|zövłŽ—ŞđŚG˛çďŇ6Ńőt)‚7Çrđ¦A¶˘—´hf/E.+Úh›íÉM[& )ÎvŤžvN´‰ţ €¦mĐÖ‡zĂ3Č(.·­ö ŞçÇ÷~Ŕ4H˙ ęň }k‡čęéšć\üÓŠ+Y{\qřvó-Ŕ~ŔAÓńý$`\ë·Ž¤¶N{*čö¸scµµ4Úă'yűŞ·j›ÇjâÚdűsÝÚŁT H hWQ ‘í °­ ‰äEÁŚ^Ş ‹jb[f»‘~ „^A– Č*| ĺ÷ś~IM›xÎţŢ`\+Ĺ÷«`VoËQăNČ.F+ÜAB›˘ÝJ>ňhsA;Ní:Q›L-”śţš8wö|”7ɇhí¨;˘sµxĘ-Đ’(Y%›li•3+Ř­G6jśŻ%¨$qZ ę ęŇŚ`¶Ç»Só«Ć_TÓŚĺ[t·Ë~I[¨Ô©ć#U{OÜKZ,z6VŐdLML‹ěĺąÍµ1¨ć4‹2 ´ň­*Ł[Č(·•V¨u xÄݤu¤v CµNŠ>«=ECA×Ô¤uđÔíÔV\q¦(~°ĄZkZ´Ě®ËŤŃ#6 =€x@ľĽ&­_6ĺ¦iÝ( hăypÍSJ_ W%z­=U‰žŞ„P•Đ>Ň#f1Ňdjs¨B»ť–OÂÍjŐ.Ý®]şeo×µ4Ś{'šR 4©&¦%K–lÝF%K¨iŢ2{ČKÚ čů äé×fÖ´OČžľS롪ҳ&!™*‚P×—´öV×€1ž»ä%­‚¦ŁÖ)ŘÎČőŔĎŠě!!߸‘ä;ň w7˙őgEß´é>›ľeQłN°…ü3ÓúÜňsdv˝üž„KĘťňĘò–ĄďËí4ôü“A·^ ş#˛ÇS+kk@ űę`‹x®¬|%ži;<©¶Ł}˛íhźť›*˙ _¦Čâ/ ]@_–uÔt7hhťśI{@_}h čV›ľ*w±ŠËĺ6ęZlÉ"‚“-A'“çdůŠ3=»äór%!ésÁ´$„n¨Iëâ‰Ű‰ü„|FÎ vô´ÎŤ•O‰ń=UŃ!¦ÔZ® ćp&Ë»Ľžírą\îOČń§ú3üëµ¬Ô¬Ś¬őš7Ő›áÍń®÷ćşĺ@ž”żr ľsČ+ˇ=€X.őś@nęÄő’4ßUĘU†ď ĺ"|»›bżS®!r!Ť$ň Ěć÷Žď9ŔŻ€»€»UČL`p;f“ pT€ŁŠŁŕ¨G…â¨PĄĎŁ eŕ(G™â(G8ĘŔQ¦8XŢ2p”)ŽbpŁĹŠŁĹŕ(G±â(G18Ї~přÁáW~přÁá‡_qřÁá‡_qd# YŕČRYŕČG8˛G8˛Ŕ‘Ą8Ľŕđ‚Ă Żâđ‚Ă /8ĽŠĂ /8ĽŠĂ 78Üŕp+78ÜŕpĂ­8ÜŞfĚQŽzpÔŁ^qÔŁőŕ¨Wőŕ¨G˝Ľ˝Z;űX€ĺX(–`9–`9 X€ĺXŘUź©CBmćó€ůóÖ·Ľuŕ­SĽuJ˝fĚGpGpŔPpŔPUŕ¨G8ŞG8ŞŔQŽ*ĹQĄwŔ?_)v×Č{D‰ k­ś/ş+:ŹŽ(:—)z7U+z­WôW´@Ń9”Łč픦(ňSt&y\"čɉˍÇ0¸< lv†ríţ ˛ŹżłgŚ0ž4¶» ÇŁŢqÎÎ'ť[ś»ťŽ-Îz§ôć&ËjĹÔBŞďyřţŔ"‚ď!Ę5DöFą˝1ĎöÁOoŮŰßę¨÷Űb±»‡ŘŇC<ŘCäĆČË…®f:/ĺH.JüÍÓ{9i]cfz`Ű‘öž`Z_O­Ře‘îţtĐ#@5°XäŮ@ xTX¤/ńw¶łÜtR/Ańń° [·rů·Ëb}Ík-(†ËéÚ |;]ł@j]G€Ľě:Ń“#¶QW¶ŠÄ čąM [‚žĎýśE6=;A6=˝A® v˝dB°ë>On 1–<:łŽ±éhԛ騠g’Ť zş¤»¦qę((±ÝE }šjsu±Jň=A:=ý9µ‹şrÇ 'e(ńS­}»]”čÂßĚsÔó°çŘŁaˇď{kuý©µbś?Öł+c-çz‚ą±śëCµML_đ¬O]ěYŤĽDę6ĎcžK<dÔşĽ r/VE= Ľµr“żŤgľ'Ë33ă3Ď Ď•žrĎ(ϵ©z®ńěb1©T”ČMŰ<ĹČpj‘ô\žZ«DęąÓă÷tőô÷îâöĄ~Vľ9»¸(Ű*˝'Ú·Gj-ëřŘśZŃĘßĂřÎXnL0ňچĎčlt2:m]­]nWKWsW¬Ëĺrşt—t‘«m­YďO翉ŰÖ©ţ4®Sço]ąÝ’żŐ˙čĂŘ%éJ ´ŃŠdŃčMIú¨˛4q:ŤÇJÓ¶[(MŰnH“ţo~¦äĄ‹š^łćľÂľĚW8( ,™=5!0˘×[=w–ý×áÓĘ&NšĘ´|J`–oJA`®ŻŔ[Ýë•sDżÂŃ˝|ŐôJá’ęWüS ‚˝ü˝ }ĺĄ5C•äžQÖ⦲Jť#łAśY —5$÷Ńą=„ËĘĺ˛rą¬!ţ!ެÂi¬÷Ĺ%Ő.Ę+ͿƢ5˛Y,t¸,9Ą4/Ţ]1zűŔ”„ąÉ;t¨Yzi ą//Đ਌܌\ŽÂ8㨖ŽłŁćLIŢ!6ŘQn·ňĺQ¨i‰úŚ, ¤Ś_ÂŞđ—ź»ĎfđGE'Pá´ü¦~ÂSŇŚs~fžë3kÖ¬ü5+}QQ Çč˘@ß‘Ä0PTYA)Â. …iš «Ž‰)¬5ë™!ÄL.Ž]é"-čŹĹ®ËUÎ*CňVafMRÇěé/aź`'ofŞíłĽ˝¦s*ď_fÖdö±(¶«LI)Ů(ˇ&¬LS-ęo•ÇňÔĺËsŞR«2ŞrśݶžőĽ”3×k43}F¨!ŕśYŠĆ†X\ŢSÁUÁUěHO/Mź!T{ťÝŘ"ÔčM ;ĂÎu†Ę~f¨C¬đv&č «ôY!¶Y6“ŠśĄ¬L,_Ó×é|D˙É># endstream endobj 240 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MUFUZY+Arial-BoldMT /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> /FontDescriptor 242 0 R /CIDToGIDMap /Identity /DW 556 /W [ 0 [ 750 ] 1 256 0 257 [ 333 ] ] >> endobj 242 0 obj << /Type /FontDescriptor /FontName /MUFUZY+Arial-BoldMT /Flags 4 /FontBBox [ -627 -376 2000 1017 ] /Ascent 728 /Descent -210 /ItalicAngle 0 /CapHeight 715 /StemV 80 /FontFile2 243 0 R >> endobj 244 0 obj 508 endobj 245 0 obj 5226 endobj 246 0 obj 583 endobj 247 0 obj 6581 endobj 248 0 obj 363 endobj 249 0 obj 25128 endobj 250 0 obj 234 endobj 251 0 obj 10948 endobj 1 0 obj << /Type /Pages /Kids [ 5 0 R 18 0 R 23 0 R 29 0 R 34 0 R 39 0 R 44 0 R 58 0 R 63 0 R 68 0 R 73 0 R 78 0 R 83 0 R 90 0 R 95 0 R 100 0 R 107 0 R 112 0 R 117 0 R 126 0 R 135 0 R 144 0 R 151 0 R 160 0 R 167 0 R 174 0 R 183 0 R 190 0 R 199 0 R 206 0 R 211 0 R 216 0 R 221 0 R ] /Count 33 >> endobj xref 0 252 0000000002 65535 f 0001001232 00000 n 0000000000 00000 f 0000000016 00000 n 0000000142 00000 n 0000000279 00000 n 0000000444 00000 n 0000025244 00000 n 0000001104 00000 n 0000001123 00000 n 0000001142 00000 n 0000001180 00000 n 0000946402 00000 n 0000946555 00000 n 0000001214 00000 n 0000017372 00000 n 0000025201 00000 n 0000025223 00000 n 0000025445 00000 n 0000025614 00000 n 0000026324 00000 n 0000026284 00000 n 0000026304 00000 n 0000026511 00000 n 0000026680 00000 n 0000027624 00000 n 0000027584 00000 n 0000027604 00000 n 0000946711 00000 n 0000027825 00000 n 0000027994 00000 n 0000028415 00000 n 0000028375 00000 n 0000028395 00000 n 0000028588 00000 n 0000028757 00000 n 0000029904 00000 n 0000029863 00000 n 0000029884 00000 n 0000030091 00000 n 0000030260 00000 n 0000032376 00000 n 0000032335 00000 n 0000032356 00000 n 0000032578 00000 n 0000032747 00000 n 0000095186 00000 n 0000035745 00000 n 0000035766 00000 n 0000035786 00000 n 0000946857 00000 n 0000048011 00000 n 0000081454 00000 n 0000086885 00000 n 0000086907 00000 n 0000095122 00000 n 0000095144 00000 n 0000095165 00000 n 0000095432 00000 n 0000095601 00000 n 0000097686 00000 n 0000097645 00000 n 0000097666 00000 n 0000097888 00000 n 0000098057 00000 n 0000100225 00000 n 0000100184 00000 n 0000100205 00000 n 0000100427 00000 n 0000100596 00000 n 0000103064 00000 n 0000103023 00000 n 0000103044 00000 n 0000103266 00000 n 0000103435 00000 n 0000106189 00000 n 0000106148 00000 n 0000106169 00000 n 0000106391 00000 n 0000106560 00000 n 0000109494 00000 n 0000109453 00000 n 0000109474 00000 n 0000109696 00000 n 0000109865 00000 n 0000141035 00000 n 0000111152 00000 n 0000111173 00000 n 0000111193 00000 n 0000141013 00000 n 0000141252 00000 n 0000141421 00000 n 0000143138 00000 n 0000143097 00000 n 0000143118 00000 n 0000143354 00000 n 0000143523 00000 n 0000145690 00000 n 0000145649 00000 n 0000145670 00000 n 0000145906 00000 n 0000146079 00000 n 0000159868 00000 n 0000148038 00000 n 0000148060 00000 n 0000148263 00000 n 0000159845 00000 n 0000160102 00000 n 0000160275 00000 n 0000160708 00000 n 0000160666 00000 n 0000160687 00000 n 0000160882 00000 n 0000161055 00000 n 0000162225 00000 n 0000161995 00000 n 0000162016 00000 n 0000162413 00000 n 0000162586 00000 n 0000179426 00000 n 0000163195 00000 n 0000163216 00000 n 0000163237 00000 n 0000176689 00000 n 0000179381 00000 n 0000179404 00000 n 0000179648 00000 n 0000179821 00000 n 0000219812 00000 n 0000180611 00000 n 0000180632 00000 n 0000180653 00000 n 0000209619 00000 n 0000219767 00000 n 0000219790 00000 n 0000220051 00000 n 0000220224 00000 n 0000243585 00000 n 0000220875 00000 n 0000220896 00000 n 0000220917 00000 n 0000236102 00000 n 0000243540 00000 n 0000243563 00000 n 0000243821 00000 n 0000243994 00000 n 0000274582 00000 n 0000244591 00000 n 0000244612 00000 n 0000244633 00000 n 0000274559 00000 n 0000274787 00000 n 0000274960 00000 n 0000312940 00000 n 0000275606 00000 n 0000275627 00000 n 0000275648 00000 n 0000305039 00000 n 0000312895 00000 n 0000312918 00000 n 0000313162 00000 n 0000313335 00000 n 0000331115 00000 n 0000314138 00000 n 0000314159 00000 n 0000314180 00000 n 0000331092 00000 n 0000331337 00000 n 0000331510 00000 n 0000363649 00000 n 0000332003 00000 n 0000332024 00000 n 0000332045 00000 n 0000363626 00000 n 0000363840 00000 n 0000364013 00000 n 0000526925 00000 n 0000364562 00000 n 0000364583 00000 n 0000364604 00000 n 0000428126 00000 n 0000526879 00000 n 0000526902 00000 n 0000527133 00000 n 0000527306 00000 n 0000632060 00000 n 0000528015 00000 n 0000528036 00000 n 0000528224 00000 n 0000632036 00000 n 0000632265 00000 n 0000632438 00000 n 0000671682 00000 n 0000632959 00000 n 0000632980 00000 n 0000633001 00000 n 0000641981 00000 n 0000671637 00000 n 0000671659 00000 n 0000671890 00000 n 0000672063 00000 n 0000726630 00000 n 0000673389 00000 n 0000673411 00000 n 0000673616 00000 n 0000726607 00000 n 0000726835 00000 n 0000727008 00000 n 0000728099 00000 n 0000728057 00000 n 0000728078 00000 n 0000728287 00000 n 0000728460 00000 n 0000729221 00000 n 0000729179 00000 n 0000729200 00000 n 0000729426 00000 n 0000729599 00000 n 0000730240 00000 n 0000730198 00000 n 0000730219 00000 n 0000730428 00000 n 0000730601 00000 n 0000946197 00000 n 0000731296 00000 n 0000731317 00000 n 0000731507 00000 n 0000946173 00000 n 0000952898 00000 n 0000947008 00000 n 0000953925 00000 n 0000947594 00000 n 0000961451 00000 n 0000954131 00000 n 0000962659 00000 n 0000954792 00000 n 0000988515 00000 n 0000962868 00000 n 0000989067 00000 n 0000963309 00000 n 0001000604 00000 n 0000989266 00000 n 0001000854 00000 n 0000989578 00000 n 0001001058 00000 n 0001001079 00000 n 0001001101 00000 n 0001001122 00000 n 0001001144 00000 n 0001001165 00000 n 0001001188 00000 n 0001001209 00000 n trailer << /Size 252 /Root 3 0 R /Info 4 0 R >> startxref 1001534 %%EOF client_golang-1.19.1/tutorial/whatsup/Makefile000066400000000000000000000015501461713521000214070ustar00rootroot00000000000000.PHONY: help help: ## Displays help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n\nTargets:\n"} /^[a-z0-9A-Z_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) .PHONY: init init: ## init $(MAKE) stop go test -count 1 -v -tags=interactive -run ^TestPlayground ./internal & # count 1 is to avoid cache. .PHONY: stop stop: ## stop init @curl -s http://localhost:19920 || true .PHONY: run run: ## run whatsup @go run main.go -config-file=./whatsup.yaml -address=:99 .PHONY: metrics metrics: ## get metrics from whatsup @curl -H 'Accept: application/openmetrics-text' localhost:99/metrics .PHONY: whatsup whatsup: ## ask what's up @curl localhost:99/whatsup .PHONY: test test: ## run acceptance tests go test -count 1 -v -tags=interactive -run ^TestAcceptance ./internal & # count 1 is to avoid cache.client_golang-1.19.1/tutorial/whatsup/README.md000066400000000000000000000001051461713521000212210ustar00rootroot00000000000000# client_golang Tutorial: "WhatsUp" See [slides](./ContribFest.pdf) client_golang-1.19.1/tutorial/whatsup/go.mod000066400000000000000000000045671461713521000210700ustar00rootroot00000000000000module github.com/prometheus/client_golang/tutorial go 1.20 require ( github.com/bwplotka/tracing-go v0.0.0-20230421061608-abdf862ceccd github.com/efficientgo/core v1.0.0-rc.2 github.com/efficientgo/e2e v0.14.1-0.20230421070206-d72d43f3b937 github.com/oklog/run v1.1.0 github.com/prometheus/client_golang v1.18.0 github.com/prometheus/common v0.46.0 gopkg.in/yaml.v2 v2.4.0 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect go.opentelemetry.io/otel v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.6.3 // indirect go.opentelemetry.io/otel/metric v0.30.0 // indirect go.opentelemetry.io/otel/sdk v1.6.3 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect go.opentelemetry.io/proto/otlp v0.15.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.56.3 // indirect google.golang.org/protobuf v1.32.0 // indirect ) client_golang-1.19.1/tutorial/whatsup/go.sum000066400000000000000000001453711461713521000211140ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bwplotka/tracing-go v0.0.0-20230421061608-abdf862ceccd h1:WukrqDL9VxKSoSC6HkEoAwQNuj5N49CPIEFsYtNBEKM= github.com/bwplotka/tracing-go v0.0.0-20230421061608-abdf862ceccd/go.mod h1:tZEa2D7ZMVaxzB8RoMdvASCwSHWb5kyb8G7mRbJcIMA= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/efficientgo/core v1.0.0-rc.2 h1:7j62qHLnrZqO3V3UA0AqOGd5d5aXV3AX6m/NZBHp78I= github.com/efficientgo/core v1.0.0-rc.2/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps= github.com/efficientgo/e2e v0.14.1-0.20230421070206-d72d43f3b937 h1:id4ofFoEdjDgOvGhRi24PozN2kzsIriHDKc+HP6ipHo= github.com/efficientgo/e2e v0.14.1-0.20230421070206-d72d43f3b937/go.mod h1:plsKU0YHE9uX+7utvr7SiDtVBSHJyEfHRO4UnUgDmts= github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b h1:ZHiD4/yE4idlbqvAO6iYCOYRzOMRpxkW+FKasRA3tsQ= github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b/go.mod h1:OmVcnJopJL8d3X3sSXTiypGoUSgFq1aDGmlrdi9dn/M= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/minio-go/v7 v7.0.45 h1:g4IeM9M9pW/Lo8AGGNOjBZYlvmtlE1N5TQEYWXRWzIs= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= go.opentelemetry.io/otel/exporters/jaeger v1.6.3 h1:7tvBU1Ydbzq080efuepYYqC1Pv3/vOFBgCSrxLb24d0= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3 h1:nAmg1WgsUXoXf46dJG9eS/AzOcvkCTK4xJSUYpWyHYg= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 h1:4/UjHWMVVc5VwX/KAtqJOHErKigMCH8NexChMuanb/o= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3/go.mod h1:UJmXdiVVBaZ63umRUTwJuCMAV//GCMvDiQwn703/GoY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3 h1:leYDq5psbM3K4QNcZ2juCj30LjUnvxjuYQj1mkGjXFM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3/go.mod h1:ycItY/esVj8c0dKgYTOztTERXtPzcfDU/0o8EdwCjoA= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.6.3 h1:uSApZ0WGBOrEMNp0rtX1jtpYBh5CvktueAEHTWfLOtk= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.6.3/go.mod h1:LhMjYbVawqjXUIRbAT2CFuWtuQVxTPL8WEtxB/Iyg5Y= go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= go.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs= go.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0 h1:h0bKrvdrT/9sBwEJ6iWUqT/N/xPcS66bL4u3isneJ6w= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= client_golang-1.19.1/tutorial/whatsup/internal/000077500000000000000000000000001461713521000215625ustar00rootroot00000000000000client_golang-1.19.1/tutorial/whatsup/internal/acceptance_test.go000066400000000000000000000041331461713521000252370ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build interactive // +build interactive package internal import ( "fmt" "io" "net/http" "strings" "testing" "github.com/efficientgo/core/testutil" ) func TestAcceptance(t *testing.T) { resp, err := http.Get(whatsupAddr(fmt.Sprintf("http://localhost:%v", WhatsupPort)) + "/metrics") testutil.Ok(t, err) defer resp.Body.Close() b, err := io.ReadAll(resp.Body) testutil.Ok(t, err) metrics := string(b) gotErr := false for _, tcase := range []struct { expectMetricName string expectMetricType string expectExemplar bool // TODO }{ { expectMetricName: "whatsup_queries_handled_total", expectMetricType: "counter", }, { expectMetricName: "whatsup_last_response_elements", expectMetricType: "gauge", }, { expectMetricName: "build_info", expectMetricType: "gauge", }, { expectMetricName: "whatsup_queries_duration_seconds", expectMetricType: "histogram", }, { expectMetricName: "go_goroutines", expectMetricType: "gauge", }, } { if !t.Run(fmt.Sprintf("Metric %v type %v with exemplar %v", tcase.expectMetricName, tcase.expectMetricType, tcase.expectExemplar), func(t *testing.T) { // Yolo. expLine := fmt.Sprintf("# TYPE %v %v", tcase.expectMetricName, tcase.expectMetricType) if strings.Index(metrics, expLine) == -1 { t.Error(expLine, "not found!") } // TODO(bwplotka): Check all properly. }) { gotErr = true } } if gotErr { fmt.Println("Got this response from ", fmt.Sprintf("http://localhost:%v", WhatsupPort), ":", metrics) } } client_golang-1.19.1/tutorial/whatsup/internal/common.go000066400000000000000000000062151461713521000234050ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "flag" "fmt" "net" "os" "strings" "gopkg.in/yaml.v2" ) const WhatsupPort = "99" var ( WhatsAppFlags = flag.NewFlagSet("whatsapp", flag.ExitOnError) prometheusAddr = WhatsAppFlags.String("prometheus-address", "", "The address of Prometheus to query.") traceEndpoint = WhatsAppFlags.String("trace-endpoint", "", "Optional GRPC OTLP endpoint for tracing backend. Set it to 'stdout' to print traces to the output instead.") traceSamplingRatio = WhatsAppFlags.Float64("trace-sampling-ratio", 1.0, "Sampling ratio. Currently 1.0 is the best value to use with exemplars.") configFile = WhatsAppFlags.String("config-file", "./whatsup.yaml", "YAML configuration with same options as flags here. Flags override the configuration items.") ) type Config struct { PrometheusAddr string `yaml:"PrometheusAddress,omitempty"` TraceEndpoint string `yaml:"TraceEndpoint,omitempty"` TraceSamplingRatio float64 `yaml:"TraceSamplingRatio,omitempty"` } func isWSL() bool { b, err := os.ReadFile("/proc/version") if err != nil { return false } if strings.Contains(string(b), "WSL") { return true } return false } func getInterfaceIpv4Addr(interfaceName string) (addr string, err error) { var ( ief *net.Interface addrs []net.Addr ipv4Addr net.IP ) if ief, err = net.InterfaceByName(interfaceName); err != nil { return "", err } if addrs, err = ief.Addrs(); err != nil { return "", err } for _, addr := range addrs { if ipv4Addr = addr.(*net.IPNet).IP.To4(); ipv4Addr != nil { break } } if ipv4Addr == nil { return "", fmt.Errorf("interface %s does not have an ipv4 address", interfaceName) } return ipv4Addr.String(), nil } func whatsupAddr(defAddress string) string { if a := os.Getenv("HOSTADDR"); a != "" { return a + ":" + WhatsupPort } // use eth0 IP address if running WSL, return default if check fails if isWSL() { a, err := getInterfaceIpv4Addr("eth0") if err != nil { return defAddress } return a + ":" + WhatsupPort } return defAddress } func ParseOptions(args []string) (Config, error) { c := Config{} if err := WhatsAppFlags.Parse(args); err != nil { return c, err } if *configFile != "" { b, err := os.ReadFile(*configFile) if err != nil { return c, err } if err := yaml.Unmarshal(b, &c); err != nil { return c, err } } if *prometheusAddr != "" { c.PrometheusAddr = *prometheusAddr } if *traceEndpoint != "" { c.TraceEndpoint = *traceEndpoint } if *traceSamplingRatio > 0 { c.TraceSamplingRatio = *traceSamplingRatio } return c, nil } client_golang-1.19.1/tutorial/whatsup/internal/playground_test.go000066400000000000000000000077541461713521000253510ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build interactive // +build interactive package internal import ( "fmt" "os" "strings" "testing" "time" "github.com/efficientgo/core/testutil" "github.com/efficientgo/e2e" e2edb "github.com/efficientgo/e2e/db" e2einteractive "github.com/efficientgo/e2e/interactive" e2emon "github.com/efficientgo/e2e/monitoring" "github.com/efficientgo/e2e/monitoring/promconfig" sdconfig "github.com/efficientgo/e2e/monitoring/promconfig/discovery/config" "github.com/efficientgo/e2e/monitoring/promconfig/discovery/targetgroup" "github.com/prometheus/common/model" "gopkg.in/yaml.v2" ) func TestPlayground(t *testing.T) { // NOTE: Only one run at the time will work due to static ports used. e, err := e2e.New(e2e.WithVerbose()) testutil.Ok(t, err) t.Cleanup(e.Close) // Setup in-memory Jaeger as our tracing backend. jaeger := e2emon.AsInstrumented(e.Runnable("tracing"). WithPorts( map[string]int{ "http.front": 16686, "grpc.otlp": 4317, "http.metrics": 14269, }). Init(e2e.StartOptions{ Image: "jaegertracing/all-in-one:1.35", EnvVars: map[string]string{"COLLECTOR_OTLP_ENABLED": "true"}, }), "http.metrics") testutil.Ok(t, e2e.StartAndWaitReady(jaeger)) prom := e2edb.NewPrometheus(e, "prometheus", e2edb.WithImage("prom/prometheus:v2.43.0-stringlabels")) testutil.Ok(t, e2e.StartAndWaitReady(prom)) // Write config file for whatsup app. c := Config{ PrometheusAddr: "http://" + prom.Endpoint("http"), TraceEndpoint: jaeger.Endpoint("grpc.otlp"), TraceSamplingRatio: 1, } b, err := yaml.Marshal(c) testutil.Ok(t, err) testutil.Ok(t, os.WriteFile("../whatsup.yaml", b, os.ModePerm)) testutil.Ok(t, prom.SetConfig(prometheusConfig(map[string]string{ "prometheus": prom.InternalEndpoint("http"), "jaeger": jaeger.InternalEndpoint("http.metrics"), "whatsup": whatsupAddr(fmt.Sprintf("host.docker.internal:%v", WhatsupPort)), }))) // Due to VM based docker setups (e.g. MacOS), file sharing can be slower - do more sighups just in case (noops if all good) prom.Exec(e2e.NewCommand("kill", "-SIGHUP", "1")) prom.Exec(e2e.NewCommand("kill", "-SIGHUP", "1")) // Best effort. fmt.Println(e2einteractive.OpenInBrowser(convertToExternal("http://" + jaeger.Endpoint("http.front")))) fmt.Println(e2einteractive.OpenInBrowser(convertToExternal("http://" + prom.Endpoint("http")))) testutil.Ok(t, e2einteractive.RunUntilEndpointHitWithPort(19920)) } func convertToExternal(endpoint string) string { a := os.Getenv("HOSTADDR") if a == "" { return endpoint } // YOLO, fix and test. return fmt.Sprintf("%v:%v", a, strings.Split(endpoint, ":")[2]) } func prometheusConfig(jobToScrapeTargetAddress map[string]string) promconfig.Config { h, _ := os.Hostname() cfg := promconfig.Config{ GlobalConfig: promconfig.GlobalConfig{ ExternalLabels: map[model.LabelName]model.LabelValue{"prometheus": model.LabelValue(h)}, ScrapeInterval: model.Duration(15 * time.Second), }, } for job, s := range jobToScrapeTargetAddress { scfg := &promconfig.ScrapeConfig{ JobName: job, ServiceDiscoveryConfig: sdconfig.ServiceDiscoveryConfig{}, } g := &targetgroup.Group{ Targets: []model.LabelSet{map[model.LabelName]model.LabelValue{ model.AddressLabel: model.LabelValue(s), }}, } scfg.ServiceDiscoveryConfig.StaticConfigs = append(scfg.ServiceDiscoveryConfig.StaticConfigs, g) cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scfg) } return cfg } client_golang-1.19.1/tutorial/whatsup/main.go000066400000000000000000000131751461713521000212300ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "encoding/json" "flag" "fmt" "log" "net/http" httppprof "net/http/pprof" "os" "syscall" "time" "github.com/bwplotka/tracing-go/tracing" "github.com/bwplotka/tracing-go/tracing/exporters/otlp" tracinghttp "github.com/bwplotka/tracing-go/tracing/http" "github.com/efficientgo/core/errcapture" "github.com/efficientgo/core/errors" "github.com/oklog/run" "github.com/prometheus/common/model" "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/tutorial/internal" ) func main() { opts, err := internal.ParseOptions(os.Args) if err != nil { log.Fatalf("Error: %v", err) } if err := runMain(opts); err != nil { // Use %+v for github.com/efficientgo/core/errors error to print with stack. log.Fatalf("Error: %+v", errors.Wrapf(err, "%s", flag.Arg(0))) } } func runMain(opts internal.Config) (err error) { // Create tracer, so the application can be instrumented with traces. var exporter tracing.ExporterBuilder switch opts.TraceEndpoint { case "stdout": exporter = tracing.NewWriterExporter(os.Stdout) default: exporter = otlp.Exporter(opts.TraceEndpoint, otlp.WithInsecure()) } tracer, closeFn, err := tracing.NewTracer( exporter, tracing.WithSampler(tracing.TraceIDRatioBasedSampler(opts.TraceSamplingRatio)), tracing.WithServiceName("client_golang-tutorial:whatsup"), ) if err != nil { return err } defer errcapture.Do(&err, closeFn, "close tracers") m := http.NewServeMux() // Create HTTP handler for Prometheus metrics. // TODO //m.Handle("/metrics", ... promClient, err := api.NewClient(api.Config{ Client: &http.Client{Transport: instrumentRoundTripper(nil, "prometheus", http.DefaultTransport)}, Address: opts.PrometheusAddr, }) if err != nil { return err } apiClient := v1.NewAPI(promClient) // Create HTTP handler for our whatsup implementation. m.HandleFunc(instrumentHandlerFunc(tracer, nil, "/whatsup", whatsUpHandler( apiClient, ))) // Debug profiling endpoints. m.HandleFunc("/debug/pprof/", httppprof.Index) m.HandleFunc("/debug/pprof/cmdline", httppprof.Cmdline) m.HandleFunc("/debug/pprof/profile", httppprof.Profile) m.HandleFunc("/debug/pprof/symbol", httppprof.Symbol) srv := http.Server{Addr: fmt.Sprintf(":%v", internal.WhatsupPort), Handler: m} g := &run.Group{} g.Add(func() error { log.Println("Starting HTTP server", "addr", internal.WhatsupPort) if err := srv.ListenAndServe(); err != nil { return errors.Wrap(err, "starting web server") } return nil }, func(error) { if err := srv.Close(); err != nil { log.Println("Error: Failed to stop web server", "err", err) } }) g.Add(run.SignalHandler(context.Background(), syscall.SIGINT, syscall.SIGTERM)) return g.Run() } type response struct { Error error `json:",omitempty"` Instances []string } // whatsUpHandler returns all services that currently monitored by Prometheus. // It uses prometheus client_golang client code to request PromQL query against given Prometheus server // to return answer. func whatsUpHandler( apiClient v1.API, ) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() w.Header().Set("Content-Type", "application/json") var upResponse model.Value if err := tracing.DoInSpan(ctx, "query Prometheus", func(ctx context.Context) error { res, warn, err := apiClient.Query(ctx, "up", time.Now()) if err != nil { return err } if len(warn) > 0 { return errors.Newf("got warnings from Prometheus %v", warn) } upResponse = res return nil }); err != nil { // We return OK status, so browser can render nice result. w.WriteHeader(http.StatusOK) // NOTE: Pass-through error might be not always safe, sanitize on production. b, _ := json.Marshal(response{Error: err}) _, _ = fmt.Fprintln(w, string(b)) return } resp := response{} switch r := upResponse.(type) { case model.Vector: for _, s := range r { resp.Instances = append(resp.Instances, string(s.Metric["instance"])) } } w.WriteHeader(http.StatusOK) b, _ := json.Marshal(resp) _, _ = fmt.Fprintln(w, string(b)) } } func getExemplarFn(ctx context.Context) prometheus.Labels { if spanCtx := tracing.GetSpan(ctx); spanCtx.Context().IsSampled() { return prometheus.Labels{"traceID": spanCtx.Context().TraceID()} } return nil } func instrumentHandlerFunc(tracer *tracing.Tracer, _ prometheus.Registerer, handlerName string, handler http.Handler) (string, http.HandlerFunc) { // Wrap with tracing. This will be visited as a first middleware. base := tracinghttp.NewMiddleware(tracer).WrapHandler(handlerName, http.HandlerFunc(func(writer http.ResponseWriter, r *http.Request) { handler.ServeHTTP(writer, r) })) return handlerName, base.ServeHTTP } func instrumentRoundTripper(_ prometheus.Registerer, clientName string, rt http.RoundTripper) http.RoundTripper { // Wrap with tracing. This will be visited as a first middleware. return tracinghttp.NewTripperware().WrapRoundTipper(clientName, rt) } client_golang-1.19.1/tutorial/whatsup/reference/000077500000000000000000000000001461713521000217045ustar00rootroot00000000000000client_golang-1.19.1/tutorial/whatsup/reference/main.go000066400000000000000000000235041461713521000231630ustar00rootroot00000000000000// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "encoding/json" "flag" "fmt" "log" "net/http" httppprof "net/http/pprof" "os" "syscall" "time" "github.com/bwplotka/tracing-go/tracing" "github.com/bwplotka/tracing-go/tracing/exporters/otlp" tracinghttp "github.com/bwplotka/tracing-go/tracing/http" "github.com/efficientgo/core/errcapture" "github.com/efficientgo/core/errors" "github.com/oklog/run" "github.com/prometheus/common/model" "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/tutorial/internal" ) func main() { opts, err := internal.ParseOptions(os.Args) if err != nil { log.Fatalf("Error: %v", err) } if err := runMain(opts); err != nil { // Use %+v for github.com/efficientgo/core/errors error to print with stack. log.Fatalf("Error: %+v", errors.Wrapf(err, "%s", flag.Arg(0))) } } func runMain(opts internal.Config) (err error) { // Create tracer, so the application can be instrumented with traces. var exporter tracing.ExporterBuilder switch opts.TraceEndpoint { case "stdout": exporter = tracing.NewWriterExporter(os.Stdout) default: exporter = otlp.Exporter(opts.TraceEndpoint, otlp.WithInsecure()) } tracer, closeFn, err := tracing.NewTracer( exporter, tracing.WithSampler(tracing.TraceIDRatioBasedSampler(opts.TraceSamplingRatio)), tracing.WithServiceName("client_golang-tutorial:whatsup"), ) if err != nil { return err } defer errcapture.Do(&err, closeFn, "close tracers") // Create registry for Prometheus metrics. reg := prometheus.NewRegistry() reg.MustRegister( collectors.NewGoCollector(), // Metrics from Go runtime. collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), // Metrics about the current UNIX process. ) handled := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "whatsup_queries_handled_total", Help: "Number of queries handed.", }) lastNumElems := promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "whatsup_last_response_elements", Help: "Number of elements in response for the last call.", }) _ = promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "build_info", Help: "Build information.", ConstLabels: map[string]string{ "version": "vYOLO", "language": "Go 1.20", "owner": "@me", }, }, func() float64 { return 1 }) handledDuration := promauto.With(reg).NewHistogram( prometheus.HistogramOpts{ Name: "whatsup_queries_duration_seconds", Help: "Tracks the latencies for calls.", Buckets: []float64{0.1, 0.3, 0.6, 1, 3, 6, 9, 20}, }, ) m := http.NewServeMux() // Create HTTP handler for Prometheus metrics. m.Handle("/metrics", promhttp.HandlerFor( reg, promhttp.HandlerOpts{ // Opt into OpenMetrics e.g. to support exemplars. EnableOpenMetrics: true, }, )) promClient, err := api.NewClient(api.Config{ Client: &http.Client{Transport: instrumentRoundTripper(reg, "prometheus", http.DefaultTransport)}, Address: opts.PrometheusAddr, }) if err != nil { return err } apiClient := v1.NewAPI(promClient) // Create HTTP handler for our whatsup implementation. m.HandleFunc(instrumentHandlerFunc(tracer, reg, "/whatsup", whatsUpHandler( apiClient, handled, lastNumElems, handledDuration, ))) // Debug profiling endpoints. m.HandleFunc("/debug/pprof/", httppprof.Index) m.HandleFunc("/debug/pprof/cmdline", httppprof.Cmdline) m.HandleFunc("/debug/pprof/profile", httppprof.Profile) m.HandleFunc("/debug/pprof/symbol", httppprof.Symbol) srv := http.Server{Addr: fmt.Sprintf(":%v", internal.WhatsupPort), Handler: m} g := &run.Group{} g.Add(func() error { log.Println("Starting HTTP server", "addr", internal.WhatsupPort) if err := srv.ListenAndServe(); err != nil { return errors.Wrap(err, "starting web server") } return nil }, func(error) { if err := srv.Close(); err != nil { log.Println("Error: Failed to stop web server", "err", err) } }) g.Add(run.SignalHandler(context.Background(), syscall.SIGINT, syscall.SIGTERM)) return g.Run() } type response struct { Error error `json:",omitempty"` Instances []string } // whatsUpHandler returns all services that currently monitored by Prometheus. // It uses prometheus client_golang client code to request PromQL query against given Prometheus server // to return answer. func whatsUpHandler( apiClient v1.API, handled prometheus.Counter, lastNumElems prometheus.Gauge, handledDuration prometheus.Histogram, ) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { start := time.Now() ctx := r.Context() w.Header().Set("Content-Type", "application/json") var upResponse model.Value if err := tracing.DoInSpan(ctx, "query Prometheus", func(ctx context.Context) error { res, warn, err := apiClient.Query(ctx, "up", time.Now()) if err != nil { return err } if len(warn) > 0 { return errors.Newf("got warnings from Prometheus %v", warn) } upResponse = res return nil }); err != nil { // We return OK status, so browser can render nice result. w.WriteHeader(http.StatusOK) // NOTE: Pass-through error might be not always safe, sanitize on production. b, _ := json.Marshal(response{Error: err}) _, _ = fmt.Fprintln(w, string(b)) return } resp := response{} switch r := upResponse.(type) { case model.Vector: for _, s := range r { resp.Instances = append(resp.Instances, string(s.Metric["instance"])) } } w.WriteHeader(http.StatusOK) b, _ := json.Marshal(resp) _, _ = fmt.Fprintln(w, string(b)) lastNumElems.Set(float64(len(resp.Instances))) handled.(prometheus.ExemplarAdder). AddWithExemplar(1, getExemplarFn(ctx)) handledDuration.(prometheus.ExemplarObserver). ObserveWithExemplar(time.Since(start).Seconds(), getExemplarFn(ctx)) } } func getExemplarFn(ctx context.Context) prometheus.Labels { if spanCtx := tracing.GetSpan(ctx); spanCtx.Context().IsSampled() { return prometheus.Labels{"traceID": spanCtx.Context().TraceID()} } return nil } func instrumentHandlerFunc(tracer *tracing.Tracer, reg prometheus.Registerer, handlerName string, handler http.Handler) (string, http.HandlerFunc) { reg = prometheus.WrapRegistererWith(prometheus.Labels{"handler": handlerName}, reg) requestDuration := promauto.With(reg).NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Tracks the latencies for HTTP requests.", Buckets: []float64{0.1, 0.3, 0.6, 1, 3, 6, 9, 20}, }, []string{"method", "code"}, ) requestSize := promauto.With(reg).NewSummaryVec( prometheus.SummaryOpts{ Name: "http_request_size_bytes", Help: "Tracks the size of HTTP requests.", }, []string{"method", "code"}, ) requestsTotal := promauto.With(reg).NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Tracks the number of HTTP requests.", }, []string{"method", "code"}, ) responseSize := promauto.With(reg).NewSummaryVec( prometheus.SummaryOpts{ Name: "http_response_size_bytes", Help: "Tracks the size of HTTP responses.", }, []string{"method", "code"}, ) base := promhttp.InstrumentHandlerRequestSize( requestSize, promhttp.InstrumentHandlerCounter( requestsTotal, promhttp.InstrumentHandlerResponseSize( responseSize, promhttp.InstrumentHandlerDuration( requestDuration, http.HandlerFunc(func(writer http.ResponseWriter, r *http.Request) { handler.ServeHTTP(writer, r) }), promhttp.WithExemplarFromContext(getExemplarFn), ), ), promhttp.WithExemplarFromContext(getExemplarFn), ), ) // Wrap with tracing. This will be visited as a first middleware. base = tracinghttp.NewMiddleware(tracer).WrapHandler(handlerName, base) return handlerName, base.ServeHTTP } func instrumentRoundTripper(reg prometheus.Registerer, clientName string, rt http.RoundTripper) http.RoundTripper { reg = prometheus.WrapRegistererWith(prometheus.Labels{"client": clientName}, reg) requestDuration := promauto.With(reg).NewHistogramVec( prometheus.HistogramOpts{ Name: "http_client_request_duration_seconds", Help: "Tracks the latencies for HTTP requests.", Buckets: []float64{0.1, 0.3, 0.6, 1, 3, 6, 9, 20}, }, []string{"method", "code"}, ) requestsTotal := promauto.With(reg).NewCounterVec( prometheus.CounterOpts{ Name: "http_client_requests_total", Help: "Tracks the number of HTTP requests.", }, []string{"method", "code"}, ) responseInflight := promauto.With(reg).NewGauge( prometheus.GaugeOpts{ Name: "http_client_requests_inflight", Help: "Tracks the number of client requests currently in progress.", }, ) var base http.RoundTripper base = promhttp.InstrumentRoundTripperCounter( requestsTotal, promhttp.InstrumentRoundTripperInFlight( responseInflight, promhttp.InstrumentRoundTripperDuration(requestDuration, rt, promhttp.WithExemplarFromContext(getExemplarFn)), ), promhttp.WithExemplarFromContext(getExemplarFn), ) // Wrap with tracing. This will be visited as a first middleware. return tracinghttp.NewTripperware().WrapRoundTipper(clientName, base) }