pax_global_header00006660000000000000000000000064143440636400014516gustar00rootroot0000000000000052 comment=2b1482ca847867cbf24abde4d68e8063611e50d1 sindresorhus-got-11d2e83/000077500000000000000000000000001434406364000153665ustar00rootroot00000000000000sindresorhus-got-11d2e83/.editorconfig000066400000000000000000000002571434406364000200470ustar00rootroot00000000000000root = true [*] indent_style = tab end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.yml] indent_style = space indent_size = 2 sindresorhus-got-11d2e83/.gitattributes000066400000000000000000000000371434406364000202610ustar00rootroot00000000000000* text=auto eol=lf *.ai binary sindresorhus-got-11d2e83/.github/000077500000000000000000000000001434406364000167265ustar00rootroot00000000000000sindresorhus-got-11d2e83/.github/ISSUE_TEMPLATE/000077500000000000000000000000001434406364000211115ustar00rootroot00000000000000sindresorhus-got-11d2e83/.github/ISSUE_TEMPLATE/1-bug-report.md000066400000000000000000000013341434406364000236600ustar00rootroot00000000000000--- name: "� Bug report" about: Something is not working as it should --- #### Describe the bug - Node.js version: - OS & version: #### Actual behavior ... #### Expected behavior ... #### Code to reproduce ```js ... ``` #### Checklist - [ ] I have read the documentation. - [ ] I have tried my code with the latest version of Node.js and Got. sindresorhus-got-11d2e83/.github/ISSUE_TEMPLATE/2-feature-request.md000066400000000000000000000005671434406364000247230ustar00rootroot00000000000000--- name: "� Feature request" about: Suggest an idea for Got --- #### What problem are you trying to solve? ... #### Describe the feature ... #### Checklist - [ ] I have read the documentation and made sure this feature doesn't already exist. sindresorhus-got-11d2e83/.github/ISSUE_TEMPLATE/3-question.md000066400000000000000000000002631434406364000234430ustar00rootroot00000000000000--- name: "� Question" about: Something is unclear or needs to be discussed --- #### What would you like to discuss? ... #### Checklist - [ ] I have read the documentation. sindresorhus-got-11d2e83/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000003741434406364000225330ustar00rootroot00000000000000#### Checklist - [ ] I have read the documentation. - [ ] I have included a pull request description of my changes. - [ ] I have included some tests. - [ ] If it's a new feature, I have included documentation updates in both the README and the types. sindresorhus-got-11d2e83/.github/funding.yml000066400000000000000000000000641434406364000211030ustar00rootroot00000000000000github: [sindresorhus, szmarczak] tidelift: npm/got sindresorhus-got-11d2e83/.github/security.md000066400000000000000000000002631434406364000211200ustar00rootroot00000000000000# Security Policy To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. sindresorhus-got-11d2e83/.gitignore000066400000000000000000000000611434406364000173530ustar00rootroot00000000000000node_modules yarn.lock coverage .nyc_output dist sindresorhus-got-11d2e83/.npmrc000066400000000000000000000000231434406364000165010ustar00rootroot00000000000000package-lock=false sindresorhus-got-11d2e83/.travis.yml000066400000000000000000000013701434406364000175000ustar00rootroot00000000000000language: node_js after_success: - './node_modules/.bin/nyc report --reporter=text-lcov | ./node_modules/.bin/coveralls' jobs: include: - os: linux dist: focal node_js: '14' - os: linux dist: focal node_js: '12' - os: linux dist: focal node_js: '10' - os: linux dist: bionic node_js: '14' - os: linux dist: bionic node_js: '12' - os: linux dist: bionic node_js: '10' - os: windows node_js: '14' - os: windows node_js: '12' - os: windows node_js: '10' - os: osx osx_image: xcode12 node_js: '14' - os: osx osx_image: xcode12 node_js: '12' - os: osx osx_image: xcode12 node_js: '10' sindresorhus-got-11d2e83/benchmark/000077500000000000000000000000001434406364000173205ustar00rootroot00000000000000sindresorhus-got-11d2e83/benchmark/index.ts000066400000000000000000000116621434406364000210050ustar00rootroot00000000000000'use strict'; import {URL} from 'url'; import https = require('https'); import axios from 'axios'; import Benchmark = require('benchmark'); import fetch from 'node-fetch'; import request = require('request'); import got from '../source'; import Request, {kIsNormalizedAlready} from '../source/core'; const {normalizeArguments} = Request; // Configuration const httpsAgent = new https.Agent({ keepAlive: true, rejectUnauthorized: false }); const url = new URL('https://127.0.0.1:8080'); const urlString = url.toString(); const gotOptions = { agent: { https: httpsAgent }, https: { rejectUnauthorized: false }, retry: 0 }; const normalizedGotOptions = normalizeArguments(url, gotOptions); normalizedGotOptions[kIsNormalizedAlready] = true; const requestOptions = { strictSSL: false, agent: httpsAgent }; const fetchOptions = { agent: httpsAgent }; const axiosOptions = { url: urlString, httpsAgent, https: { rejectUnauthorized: false } }; const axiosStreamOptions: typeof axiosOptions & {responseType: 'stream'} = { ...axiosOptions, responseType: 'stream' }; const httpsOptions = { https: { rejectUnauthorized: false }, agent: httpsAgent }; const suite = new Benchmark.Suite(); // Benchmarking suite.add('got - promise', { defer: true, fn: async (deferred: {resolve: () => void}) => { await got(url, gotOptions); deferred.resolve(); } }).add('got - stream', { defer: true, fn: async (deferred: {resolve: () => void}) => { got.stream(url, gotOptions).resume().once('end', () => { deferred.resolve(); }); } }).add('got - core', { defer: true, fn: async (deferred: {resolve: () => void}) => { const stream = new Request(url, gotOptions); stream.resume().once('end', () => { deferred.resolve(); }); } }).add('got - core - normalized options', { defer: true, fn: async (deferred: {resolve: () => void}) => { const stream = new Request(undefined as any, normalizedGotOptions); stream.resume().once('end', () => { deferred.resolve(); }); } }).add('request - callback', { defer: true, fn: (deferred: {resolve: () => void}) => { request(urlString, requestOptions, (error: Error) => { if (error) { throw error; } deferred.resolve(); }); } }).add('request - stream', { defer: true, fn: (deferred: {resolve: () => void}) => { const stream = request(urlString, requestOptions); stream.resume(); stream.once('end', () => { deferred.resolve(); }); } }).add('node-fetch - promise', { defer: true, fn: async (deferred: {resolve: () => void}) => { const response = await fetch(url, fetchOptions); await response.text(); deferred.resolve(); } }).add('node-fetch - stream', { defer: true, fn: async (deferred: {resolve: () => void}) => { const {body} = await fetch(url, fetchOptions); body.resume(); body.once('end', () => { deferred.resolve(); }); } }).add('axios - promise', { defer: true, fn: async (deferred: {resolve: () => void}) => { await axios.request(axiosOptions); deferred.resolve(); } }).add('axios - stream', { defer: true, fn: async (deferred: {resolve: () => void}) => { const {data} = await axios.request(axiosStreamOptions); data.resume(); data.once('end', () => { deferred.resolve(); }); } }).add('https - stream', { defer: true, fn: (deferred: {resolve: () => void}) => { https.request(urlString, httpsOptions, response => { response.resume(); response.once('end', () => { deferred.resolve(); }); }).end(); } }).on('cycle', (event: Benchmark.Event) => { console.log(String(event.target)); }).on('complete', function (this: any) { console.log(`Fastest is ${this.filter('fastest').map('name') as string}`); internalBenchmark(); }).run(); const internalBenchmark = (): void => { console.log(); const internalSuite = new Benchmark.Suite(); internalSuite.add('got - normalize options', { fn: () => { normalizeArguments(url, gotOptions); } }).on('cycle', (event: Benchmark.Event) => { console.log(String(event.target)); }); internalSuite.run(); }; // Results (i7-7700k, CPU governor: performance): // got - promise x 3,003 ops/sec ±6.26% (70 runs sampled) // got - stream x 3,538 ops/sec ±5.86% (67 runs sampled) // got - core x 5,828 ops/sec ±3.11% (79 runs sampled) // got - core - normalized options x 7,596 ops/sec ±1.60% (85 runs sampled) // request - callback x 6,530 ops/sec ±6.84% (72 runs sampled) // request - stream x 7,348 ops/sec ±3.62% (78 runs sampled) // node-fetch - promise x 6,284 ops/sec ±5.50% (76 runs sampled) // node-fetch - stream x 7,746 ops/sec ±3.32% (80 runs sampled) // axios - promise x 6,301 ops/sec ±6.24% (77 runs sampled) // axios - stream x 8,605 ops/sec ±2.73% (87 runs sampled) // https - stream x 10,477 ops/sec ±3.64% (80 runs sampled) // Fastest is https - stream // got - normalize options x 90,974 ops/sec ±0.57% (93 runs sampled) sindresorhus-got-11d2e83/benchmark/server.ts000066400000000000000000000007131434406364000211770ustar00rootroot00000000000000import {AddressInfo} from 'net'; import https = require('https'); // @ts-expect-error No types import createCert = require('create-cert'); (async () => { const keys = await createCert({days: 365, commonName: 'localhost'}); const server = https.createServer(keys, (_request, response) => { response.end('ok'); }).listen(8080, () => { const {port} = server.address() as AddressInfo; console.log(`Listening at https://localhost:${port}`); }); })(); sindresorhus-got-11d2e83/documentation/000077500000000000000000000000001434406364000202375ustar00rootroot00000000000000sindresorhus-got-11d2e83/documentation/advanced-creation.md000066400000000000000000000067351434406364000241430ustar00rootroot00000000000000# Advanced creation > Make calling REST APIs easier by creating niche-specific `got` instances. ### Merging instances Got supports composing multiple instances together. This is very powerful. You can create a client that limits download speed and then compose it with an instance that signs a request. It's like plugins without any of the plugin mess. You just create instances and then compose them together. To mix them use `instanceA.extend(instanceB, instanceC, ...)`, that's all. ## Examples Some examples of what kind of instances you could compose together: #### Denying redirects that lead to other sites than specified ```js const controlRedirects = got.extend({ handlers: [ (options, next) => { const promiseOrStream = next(options); return promiseOrStream.on('redirect', response => { const host = new URL(resp.url).host; if (options.allowedHosts && !options.allowedHosts.includes(host)) { promiseOrStream.cancel(`Redirection to ${host} is not allowed`); } }); } ] }); ``` #### Limiting download & upload size It can be useful when your machine has limited amount of memory. ```js const limitDownloadUpload = got.extend({ handlers: [ (options, next) => { let promiseOrStream = next(options); if (typeof options.downloadLimit === 'number') { promiseOrStream.on('downloadProgress', progress => { if (progress.transferred > options.downloadLimit && progress.percent !== 1) { promiseOrStream.cancel(`Exceeded the download limit of ${options.downloadLimit} bytes`); } }); } if (typeof options.uploadLimit === 'number') { promiseOrStream.on('uploadProgress', progress => { if (progress.transferred > options.uploadLimit && progress.percent !== 1) { promiseOrStream.cancel(`Exceeded the upload limit of ${options.uploadLimit} bytes`); } }); } return promiseOrStream; } ] }); ``` #### No user agent ```js const noUserAgent = got.extend({ headers: { 'user-agent': undefined } }); ``` #### Custom endpoint ```js const httpbin = got.extend({ prefixUrl: 'https://httpbin.org/' }); ``` #### Signing requests ```js const crypto = require('crypto'); const getMessageSignature = (data, secret) => crypto.createHmac('sha256', secret).update(data).digest('hex').toUpperCase(); const signRequest = got.extend({ hooks: { beforeRequest: [ options => { options.headers['sign'] = getMessageSignature(options.body || '', process.env.SECRET); } ] } }); ``` #### Putting it all together If these instances are different modules and you don't want to rewrite them, use `got.extend(...instances)`. **Note**: The `noUserAgent` instance must be placed at the end of chain as the instances are merged in order. Other instances do have the `user-agent` header. ```js const merged = got.extend(controlRedirects, limitDownloadUpload, httpbin, signRequest, noUserAgent); (async () => { // There's no 'user-agent' header :) await merged('/'); /* HTTP Request => * GET / HTTP/1.1 * accept-encoding: gzip, deflate, br * sign: F9E66E179B6747AE54108F82F8ADE8B3C25D76FD30AFDE6C395822C530196169 * Host: httpbin.org * Connection: close */ const MEGABYTE = 1048576; await merged('https://ipv4.download.thinkbroadband.com/5MB.zip', {downloadLimit: MEGABYTE, prefixUrl: ''}); // CancelError: Exceeded the download limit of 1048576 bytes await merged('https://jigsaw.w3.org/HTTP/300/301.html', {allowedHosts: ['google.com'], prefixUrl: ''}); // CancelError: Redirection to jigsaw.w3.org is not allowed })(); ``` sindresorhus-got-11d2e83/documentation/examples/000077500000000000000000000000001434406364000220555ustar00rootroot00000000000000sindresorhus-got-11d2e83/documentation/examples/gh-got.js000066400000000000000000000026711434406364000236060ustar00rootroot00000000000000'use strict'; const got = require('../..'); const package = require('../../package'); const getRateLimit = (headers) => ({ limit: parseInt(headers['x-ratelimit-limit'], 10), remaining: parseInt(headers['x-ratelimit-remaining'], 10), reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000) }); const instance = got.extend({ prefixUrl: 'https://api.github.com', headers: { accept: 'application/vnd.github.v3+json', 'user-agent': `${package.name}/${package.version}` }, responseType: 'json', token: process.env.GITHUB_TOKEN, handlers: [ (options, next) => { // Authorization if (options.token && !options.headers.authorization) { options.headers.authorization = `token ${options.token}`; } // Don't touch streams if (options.isStream) { return next(options); } // Magic begins return (async () => { try { const response = await next(options); // Rate limit for the Response object response.rateLimit = getRateLimit(response.headers); return response; } catch (error) { const {response} = error; // Nicer errors if (response && response.body) { error.name = 'GitHubError'; error.message = `${response.body.message} (${response.statusCode} status code)`; } // Rate limit for errors if (response) { error.rateLimit = getRateLimit(response.headers); } throw error; } })(); } ] }); module.exports = instance; sindresorhus-got-11d2e83/documentation/examples/runkit-example.js000066400000000000000000000003731434406364000253630ustar00rootroot00000000000000const got = require('got'); (async () => { const issUrl = 'http://api.open-notify.org/iss-now.json'; const {iss_position: issPosition} = await got(issUrl).json(); console.log(issPosition); //=> {latitude: '20.4956', longitude: '42.2216'} })(); sindresorhus-got-11d2e83/documentation/lets-make-a-plugin.md000066400000000000000000000151431434406364000241610ustar00rootroot00000000000000# Let's make a plugin! > Another example on how to use Got like a boss :electric_plug: Okay, so you already have learned some basics. That's great! When it comes to advanced usage, custom instances are really helpful. For example, take a look at [`gh-got`](https://github.com/sindresorhus/gh-got). It looks pretty complicated, but... it's really not. Before we start, we need to find the [GitHub API docs](https://developer.github.com/v3/). Let's write down the most important information: 1. The root endpoint is `https://api.github.com/`. 2. We will use version 3 of the API.\ The `Accept` header needs to be set to `application/vnd.github.v3+json`. 3. The body is in a JSON format. 4. We will use OAuth2 for authorization. 5. We may receive `400 Bad Request` or `422 Unprocessable Entity`.\ The body contains detailed information about the error. 6. *Pagination?* Not yet. This is going to be a native feature of Got. We'll update this page accordingly when the feature is available. 7. Rate limiting. These headers are interesting: - `X-RateLimit-Limit` - `X-RateLimit-Remaining` - `X-RateLimit-Reset` - `X-GitHub-Request-Id` Also `X-GitHub-Request-Id` may be useful. 8. User-Agent is required. When we have all the necessary info, we can start mixing :cake: ### The root endpoint Not much to do here, just extend an instance and provide the `prefixUrl` option: ```js const got = require('got'); const instance = got.extend({ prefixUrl: 'https://api.github.com' }); module.exports = instance; ``` ### v3 API GitHub needs to know which version we are using. We'll use the `Accept` header for that: ```js const got = require('got'); const instance = got.extend({ prefixUrl: 'https://api.github.com', headers: { accept: 'application/vnd.github.v3+json' } }); module.exports = instance; ``` ### JSON body We'll use [`options.responseType`](../readme.md#responsetype): ```js const got = require('got'); const instance = got.extend({ prefixUrl: 'https://api.github.com', headers: { accept: 'application/vnd.github.v3+json' }, responseType: 'json' }); module.exports = instance; ``` ### Authorization It's common to set some environment variables, for example, `GITHUB_TOKEN`. You can modify the tokens in all your apps easily, right? Cool. What about... we want to provide a unique token for each app. Then we will need to create a new option - it will default to the environment variable, but you can easily override it. Let's use handlers instead of hooks. This will make our code more readable: having `beforeRequest`, `beforeError` and `afterResponse` hooks for just a few lines of code would complicate things unnecessarily. **Tip:** it's a good practice to use hooks when your plugin gets complicated. Try not to overload the handler function, but don't abuse hooks either. ```js const got = require('got'); const instance = got.extend({ prefixUrl: 'https://api.github.com', headers: { accept: 'application/vnd.github.v3+json' }, responseType: 'json', token: process.env.GITHUB_TOKEN, handlers: [ (options, next) => { // Authorization if (options.token && !options.headers.authorization) { options.headers.authorization = `token ${options.token}`; } return next(options); } ] }); module.exports = instance; ``` ### Errors We should name our errors, just to know if the error is from the API response. Superb errors, here we come! ```js ... handlers: [ (options, next) => { // Authorization if (options.token && !options.headers.authorization) { options.headers.authorization = `token ${options.token}`; } // Don't touch streams if (options.isStream) { return next(options); } // Magic begins return (async () => { try { const response = await next(options); return response; } catch (error) { const {response} = error; // Nicer errors if (response && response.body) { error.name = 'GitHubError'; error.message = `${response.body.message} (${response.statusCode} status code)`; } throw error; } })(); } ] ... ``` ### Rate limiting Umm... `response.headers['x-ratelimit-remaining']` doesn't look good. What about `response.rateLimit.limit` instead?
Yeah, definitely. Since `response.headers` is an object, we can easily parse these: ```js const getRateLimit = (headers) => ({ limit: parseInt(headers['x-ratelimit-limit'], 10), remaining: parseInt(headers['x-ratelimit-remaining'], 10), reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000) }); getRateLimit({ 'x-ratelimit-limit': '60', 'x-ratelimit-remaining': '55', 'x-ratelimit-reset': '1562852139' }); // => { // limit: 60, // remaining: 55, // reset: 2019-07-11T13:35:39.000Z // } ``` Let's integrate it: ```js const getRateLimit = (headers) => ({ limit: parseInt(headers['x-ratelimit-limit'], 10), remaining: parseInt(headers['x-ratelimit-remaining'], 10), reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000) }); ... handlers: [ (options, next) => { // Authorization if (options.token && !options.headers.authorization) { options.headers.authorization = `token ${options.token}`; } // Don't touch streams if (options.isStream) { return next(options); } // Magic begins return (async () => { try { const response = await next(options); // Rate limit for the Response object response.rateLimit = getRateLimit(response.headers); return response; } catch (error) { const {response} = error; // Nicer errors if (response && response.body) { error.name = 'GitHubError'; error.message = `${response.body.message} (${response.statusCode} status code)`; } // Rate limit for errors if (response) { error.rateLimit = getRateLimit(response.headers); } throw error; } })(); } ] ... ``` ### The frosting on the cake: `User-Agent` header. ```js const package = require('./package'); const instance = got.extend({ ... headers: { accept: 'application/vnd.github.v3+json', 'user-agent': `${package.name}/${package.version}` } ... }); ``` ## Woah. Is that it? Yup. View the full source code [here](examples/gh-got.js). Here's an example of how to use it: ```js const ghGot = require('gh-got'); (async () => { const response = await ghGot('users/sindresorhus'); const creationDate = new Date(response.created_at); console.log(`Sindre's GitHub profile was created on ${creationDate.toGMTString()}`); // => Sindre's GitHub profile was created on Sun, 20 Dec 2009 22:57:02 GMT })(); ``` Did you know you can mix many instances into a bigger, more powerful one? Check out the [Advanced Creation](advanced-creation.md) guide. sindresorhus-got-11d2e83/documentation/migration-guides.md000066400000000000000000000132431434406364000240330ustar00rootroot00000000000000# Migration guides > :star: Switching from other HTTP request libraries to Got :star: ### Migrating from Request You may think it's too hard to switch, but it's really not. 🦄 Let's take the very first example from Request's readme: ```js const request = require('request'); request('https://google.com', (error, response, body) => { console.log('error:', error); console.log('statusCode:', response && response.statusCode); console.log('body:', body); }); ``` With Got, it is: ```js const got = require('got'); (async () => { try { const response = await got('https://google.com'); console.log('statusCode:', response.statusCode); console.log('body:', response.body); } catch (error) { console.log('error:', error); } })(); ``` Looks better now, huh? 😎 #### Common options Both Request and Got accept [`http.request` options](https://nodejs.org/api/http.html#http_http_request_options_callback). These Got options are the same as with Request: - [`url`](https://github.com/sindresorhus/got#url) (+ we accept [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) instances too!) - [`body`](https://github.com/sindresorhus/got#body) - [`followRedirect`](https://github.com/sindresorhus/got#followRedirect) - [`encoding`](https://github.com/sindresorhus/got#encoding) - [`maxRedirects`](https://github.com/sindresorhus/got#maxredirects) So if you're familiar with them, you're good to go. Oh, and one more thing... There's no `time` option. Assume [it's always true](https://github.com/sindresorhus/got#timings). #### Renamed options Readability is very important to us, so we have different names for these options: - `qs` → [`searchParams`](https://github.com/sindresorhus/got#searchParams) - `strictSSL` → [`rejectUnauthorized`](https://github.com/sindresorhus/got#rejectUnauthorized) - `gzip` → [`decompress`](https://github.com/sindresorhus/got#decompress) - `jar` → [`cookieJar`](https://github.com/sindresorhus/got#cookiejar) (accepts [`tough-cookie`](https://github.com/salesforce/tough-cookie) jar) It's more clear, isn't it? #### Changes in behavior The [`timeout` option](https://github.com/sindresorhus/got#timeout) has some extra features. You can [set timeouts on particular events](../readme.md#timeout)! The [`searchParams` option](https://github.com/sindresorhus/got#searchParams) is always serialized using [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) unless it's a `string`. To use streams, just call `got.stream(url, options)` or `got(url, {isStream: true, ...}`). #### Breaking changes - The `json` option is not a `boolean`, it's an `Object`. It will be stringified and used as a body. - The `form` option is an `Object`. It can be a plain object or a [`form-data` instance](https://github.com/sindresorhus/got/#form-data). - Got will lowercase all custom headers, even if they are specified to not be. - No `oauth`/`hawk`/`aws`/`httpSignature` option. To sign requests, you need to create a [custom instance](advanced-creation.md#signing-requests). - No `agentClass`/`agentOptions`/`pool` option. - No `forever` option. You need to use [forever-agent](https://github.com/request/forever-agent). - No `proxy` option. You need to [pass a custom agent](../readme.md#proxies). - No `auth` option. You need to use `username` / `password` instead. - No `baseUrl` option. Instead, there is `prefixUrl` which appends a trailing slash if not present. It will be always prepended unless `url` is an instance of URL. - No `removeRefererHeader` option. You can remove the referer header in a [`beforeRequest` hook](https://github.com/sindresorhus/got#hooksbeforeRequest): ```js const gotInstance = got.extend({ hooks: { beforeRequest: [ options => { delete options.headers.referer; } ] } }); gotInstance(url, options); ``` - No `jsonReviver`/`jsonReplacer` option, but you can use `parseJson`/`stringifyJson` for that: ```js const gotInstance = got.extend({ parseJson: text => JSON.parse(text, myJsonReviver), stringifyJson: object => JSON.stringify(object, myJsonReplacer) }); gotInstance(url, options); ``` Hooks are powerful, aren't they? [Read more](../readme.md#hooks) to see what else you achieve using hooks. #### More about streams Let's take a quick look at another example from Request's readme: ```js http.createServer((serverRequest, serverResponse) => { if (serverRequest.url === '/doodle.png') { serverRequest.pipe(request('https://example.com/doodle.png')).pipe(serverResponse); } }); ``` The cool feature here is that Request can proxy headers with the stream, but Got can do that too: ```js const stream = require('stream'); const {promisify} = require('util'); const got = require('got'); const pipeline = promisify(stream.pipeline); http.createServer(async (serverRequest, serverResponse) => { if (serverRequest.url === '/doodle.png') { // When someone makes a request to our server, we receive a body and some headers. // These are passed to Got. Got proxies downloaded data to our server response, // so you don't have to do `response.writeHead(statusCode, headers)` and `response.end(body)`. // It's done automatically. await pipeline( got.stream('https://example.com/doodle.png'), serverResponse ); } }); ``` Nothing has really changed. Just remember to use `got.stream(url, options)` or `got(url, {isStream: true, …})`. That's it! #### You're good to go! Well, you have already come this far :tada: Take a look at the [documentation](../readme.md#highlights). It's worth the time to read it. There are [some great tips](../readme.md#aborting-the-request). If something is unclear or doesn't work as it should, don't hesitate to [open an issue](https://github.com/sindresorhus/got/issues/new/choose). sindresorhus-got-11d2e83/license000066400000000000000000000021251434406364000167330ustar00rootroot00000000000000MIT License Copyright (c) Sindre Sorhus (sindresorhus.com) 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. sindresorhus-got-11d2e83/media/000077500000000000000000000000001434406364000164455ustar00rootroot00000000000000sindresorhus-got-11d2e83/media/logo.ai000066400000000000000000013103731434406364000177300ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[5 0 R 27 0 R 48 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream application/pdf got logo Font: Hero Light Sindre Sorhus Adobe Illustrator CC 2014 (Macintosh) 2015-05-08T21:45:33+02:00 2015-05-08T21:49:52+02:00 2015-05-08T21:49:52+02:00 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A6/5888eZ7zzOn5f+QREv mJoVudZ1q4X1LfSrV/sOU6STydY0PsSKGoVQ9v8A846eQ7qlx5tlv/N2qt8Ut9ql5cEcj19OGJ44 0Xf4VoaDviqy5/ILTdJU3X5d63qPk/Uo/jiihuJbrT5GHQT2ly0iuvyO3h2xVnvlCTzXJ5ftT5rh tYNeUMl4ti7SW7FWKrInNVZeagNx3pirE/zF88+YI9csvInklI5POGqQm5mvZ15W2m2Ktxa6mWh5 MzfDGnc9ewZVBW3/ADjv5GuwLnzhLfecNXYVl1DVLqegY/aEUETxxxp/KtDQbVxVq5/5x98r6dW7 8iX195M1hPiiuLC4llt3cdBcWs7SRyp4rtiqN/L7zzq+q3+p+RfO9tHZ+cdMh5zfVmZbe/sZDwW8 tSCGUHo4rVW8Psqqpf8AQvf5d+Oq/wDcVv8A/qtirCfzC/KLyno2t+SrTT59Ujg1nWVsdQU6netz gNvLJxBaU8fiQbjFWbf9C9/l346r/wBxW/8A+q2Ksp8neQ9A8owXMOj/AFrhdsrzG6up7o1QEDiZ 3fj17YqyHFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8t/wCceLf675Nu/Odw K6p5y1C71O6dt2WMTvDbw13+COOP4R2rir1F3REZ3YKiglmJoABuSScVYt/ytj8rP+py0P8A7iVn /wBVMVTvRfMOga7atd6JqVrqlojmJ7iynjuIw4AJQvEzLyAYGmKvO/yVhOpa359833Q5Xupa9cad byN1Wx0ukECDw35VAxV6nirsVeWfnNANL8weQ/OVqON7p+uW+l3TrtzsNUrBMrU+1xbiVB74q9Tx V5r+bn/KTflt/wCBGn/UJPir0rFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq8s/5x4u1svKN55IuTx1fyZf3WnXcbbM0LzPNbTgfySRv8J70xV6kyqylWAZWFGU7gg9jiqQf 8q88gf8AUs6V/wBINt/zRirDvyksLGw88/mXaWNvFaWkWq2git4EWONQbGMkKigKNz2xVZ+T840X zb578j3ZKXdvq02uacrE/vNP1PjIpjr1EclVYjufHFXqmKuxV5X+cE41rzb5E8j2hL3dxq0Ouaiq k/u9P0zlIxkp0EklFUnuPHFXqmKvNfzc/wCUm/Lb/wACNP8AqEnxV6VirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVeb+f/y819/MMPnryHcxWPnC3jEF7a3HIWeqWy9ILkKd mX9h+vQVFAQqhLb8947Clr5z8qa55d1JPhl42cl9ZswG/oXNsHEg2/lxVbc/m95m8wo1l+XvlHUb u6lqq6zrMLadpkNf92FpP3s3HqURQcVZR+XHkWXyppt4+oXzar5h1m4N/rmqOAoluGULxjQfYijV QqL4fdiqB/Mj8ur7XbvT/Mvlm+XSPO2iBhpt84LQTwtu9pdqN2hf71JqMVSm2/O2XR1Fr+YPlnVP Lt/HtLeQW0moabJTq8NxaiU0p8RUrVR4nFWrn87pdXU2v5f+WdU8xX8nww3k9tJYabHXo81xciNq U+IKFqw8MVTb8t/y7v8AQrvUPMvma+XV/O2t0Go3yAiCCFTVLS0VgCsKbe7Hc4qzzFXn/wCaGl6l e+Yfy/ls7aS4is9fWa7eNSwiiFpOC70+yvucVegYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk7eZbZfMS6L6TeoRvNXYMU5gU+WC3XHt GI1HgVv3/C04wuxdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVYJN/5Mof6yf9Q4yPV5af8Axp/L/cM7yT1LsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVcSACSaAdTiqQ6h578p2DFJtRjeQbcIazGvh+7DAfTl0dPM9GJkEpb82/KgYgC5 YfzCMU/Fhln5OfkjjCvbfml5PmID3EluT/v2J/8AjQPgOkmE8YZDp+saVqKcrC7iuQOojcMR81G4 +nKJQlHmEgozIpdirsVdirsVdiqhe39jYwma8uI7eIftysEHy3wxiTyW1PTNV0/VLb61YTCeDkU9 RQQOS9RuBhlAxNFANsPnB/5WUPdkp/0jjK+ry8/+NP5f7hml7fWdjbNc3kywW6EBpXNFBYhRU/M5 OMSTQeptfb3NvcxLNbypNE32ZI2DKfkRUYkEc1VMCuxVQvr+ysLZrm9nS3gT7UkhAFT0HzwxiSaC 2lP+OvKP/V0h+8/0y38vPuY8Qd/jryj/ANXSH7z/AEx/Lz7l4g7/AB15R/6ukP3n+mP5efcvEHf4 68o/9XSH7z/TH8vPuXiDv8deUf8Aq6Q/ef6Y/l59y8Qd/jryj/1dIfvP9Mfy8+5eIO/x15R/6ukP 3n+mP5efcvEHf468o/8AV0h+8/0x/Lz7l4grWnm7yzeXCW1tqMMk8h4xx8qFj4CtN8BwzAshPEE3 ypLsVdiqSeaPN2l+XrUSXJ9S5kH7i0Qjm/uf5V98txYTM7IMqecj/HPnyYkH6vpfKnUx24p27mRv v+jM793h97XvJkumflDoMCqb+eW8l/aCn0o/uWrf8NlEtZI8tmQgE6X8u/Jiig0xKdN3lJ+8tlX5 nJ3p4QoXX5ZeTp1IWzaBv54pZAfuYsv4YRqpjqvAGM6n+UV3bN9Z0LUCZENY45jwkFP5ZUoK/wCx GXx1gO0gxMO5R0f8w/MGhXo0zzPBJIi7GRhSdAf2q9JF/wA65KemjMXBRIjm9Psr20vrWO6tJVmt 5RyjkXoRmvlEg0WxWwK7FXYqwTzh+Y4srhtK0NBdaly9N5AOao524qo+2/4D3zMw6axcuTCUu5Kd P/LbX9bmF/5lvnjZ9/SqHmoe38kfyFfllktTGG0AgQJ5s/8AL/l7T9BsTZ2PP0mcyMZG5EsQAT27 KOmYeTIZmyzApjN1/wCTIh/2P/JnKerzOX/jSH4/hZL5j8v2mvaa1hdSSRxlg4aIgHktaVqCCN8u x5DA2HpiLec3nkrzh5Vla/0G6e5t13dYhR6f5cJ5K4+VfkMzY54ZNpBr4SOTJvJv5j2etMljfqtr qZ2Wn93Kf8iv2W/yT9GUZtMY7jcMoytmeYrNAa3omn61Ymyv0LwFg44kqQy9CCMnDIYmwgi2Pf8A KqPKP++5/wDkaf6Zf+bmx4A7/lVHlH/fc/8AyNP9Mfzc14A7/lVHlH/fc/8AyNP9Mfzc14Apz/lX 5SSCR1jm5KpI/enqB8sRq5rwBhX5ceVtJ1+e+TUFdlt1jMfBuO7Fq1+7MvU5ZQqmERbOf+VUeUf9 9z/8jT/TMT83NnwB3/KqPKP++5/+Rp/pj+bmvAHf8qo8o/77n/5Gn+mP5ua8AV7D8tfK1jewXkMU pmt3EkXOQkB1NVNNuh3yMtVMikiAZTmOydiqVeZ/MNroOky30/xOPgt4a0Mkh+yv8T7ZZixmcqQT Tzjyl5XvfN2pS69rjM1kXNBUj1WB+wvhGvTb5DvmdmyjGOGPNriL3L1mGGGCJIYUWKKMBUjQBVUD oAB0zXE22r8CuxV2KuxVKvMflrTdesGtbxAHAJguABzjbxU+HiO+WYspgbCCLS7yL5UvfLlndW9z dLcCaQPGicuKgChPxd27/LLNRmEyCAiIpk2Y7J2KsF/MnzfNp8SaNprH9JXYHqOn2o42NAFp+2/b wH0Zl6bDxeo8gwnJF+Q/I0Gh2y3l4ok1aZaux3EIP7C+/wDMcjqM5maHJMY0y/MZk7FWD3X/AJMi H/Y/8mcj1eYy/wDGkPx/CzjJPTuxVgnn3yBHfxvq2kp6Wpx/vJYk2E1N6inST375mafUV6ZcmEoq v5c+dH1i3bTdQb/cnbLVXbYyxjap/wApe/3+OR1ODhNjksZWzbMVm7FXYq7FVK6/3lm/1G/UcI5q 8x/Jf/erVf8AUh/W+Z+t5BrxvU817Y7FXYq7FXYq7FXknmuefzb55h0S2ciztHMJYdBx3nk+YpxH y982WIDHj4jzLUdzT1Wzs7eytIrS2QRwQKEjQdgBTNdKRJstqtgV2KuxV2KuxV2KuxV2KqF9eQ2V lPeTnjDbxtJIfZRU4Yxs0peY/l5YzeYfNF75kvxyED841O49Z/sAe0aDb6M2GplwQEA1xFm3qua5 sdirsVYPdf8AkyIf9j/yZyPV5jL/AMaQ/H8LOMk9O7FXYq8m8/6bP5b8zWvmHTR6cdw/qMB9kTD7 an2kU/rzY6eXHAxLVIUbeo6ffQX9jb3sBrDcRrInjRhWh9xmBKNGi2hEZFXYq7FVK6/3lm/1G/Uc I5q8x/Jf/erVf9SH9b5n63kGvG9TzXtjsVdirsVdiqD1q/Gn6ReXx620LyKD3ZVJUfSclCPFIBBL z/8AJ3Ti7ajq8vxSMwt43PWp/eSffVczdbLlFhAPTMwGx2KuxV2KuxV2KuxV2KuxVh35rX5tfKjw qaNeTRw7deIrIf8AiFMytJG5+5hM7In8tdOWy8o2hpSS6LXEh8eZov8AwirkdVK5lMBsyjMdk7FX Yqwe6/8AJkQ/7H/kzkerzGX/AI0h+P4WcZJ6d2KuxVjn5haYuoeU75aVktl+sxnwMXxN/wAJyGX6 aVTDGQ2Sz8pNRa58tPauatZTMi/6j0cf8MWyzWRqd96IHZm2YjN2KuxVSuv95Zv9Rv1HCOavL/yY cC91NO7RRNX5Mw/jmfreQa8b1XNe2OxV2KuxV2Ksa/MeRo/JepMuxIiX6GmRT+By/Tf3gYy5IX8q olTyhCw6yyyu3zDcf1LktWfWsOTL8xmTsVdiqX67rlnommyaheB2hjKqVjAZiWNAACVH3nJ48Zma CCaYr/yuLyz/AMs17/wEX/VXMj8lPvDHjDv+VxeWf+Wa9/4CL/qrj+Sn3heMO/5XF5Z/5Zr3/gIv +quP5KfeF4wmGg/mPoOtalHp1tFcRXEoYx+siBTwUsRVXfsDkMmmlEWUiQLKsx2Tzj853YWWlp+y 0krH5hVA/XmdouZa8jN/LiLH5f0xF+ytpAB9Ea5iZPqPvZjko+Z4NXl0s/ouVo7mNg5CGjOgBqqn x75WXA7Shmli/dGpD7QgPKnmtdQUWV6QmoIKAnYSAdduzDuMQXF7L7U8b0T2yD7f2slwu6YPdf8A kyIf9j/yZyPV5jL/AMaQ/H8LOMk9OkXmfzRBpEPpRUlv5BWOM9FH8z0/Ad8BLqu0u046cUN5np+k ofyWddmgmvNSmZ4Z6G3STr3qwH7KntiGrsc55RM8pJEuV/jkn2oRLLYXMTfZkidT8ipGSiaId0Xn H5LS/Fq8RJ3EDAdtvUB/hmdrhya8b07MBsdirsVUrr/eWb/Ub9Rwjmry38mf+OnqP/GBP+J5sNby DVjer5rm12KuxV2KuxVjv5hwNN5N1NF6hEf6I5Vc/guX6Y1kDGXJL/ynuVl8pLGOtvPLGfpo/wDx vk9WKmiHJmWYrN2KuxVTubW2uoWguYkngf7cUih0NDXdWqMIJHJUB/hbyz/1aLL/AKR4v+acn4s+ 8/NFB3+FvLP/AFaLL/pHi/5px8WfefmtB3+FvLP/AFaLL/pHi/5px8WfefmtB5/bWtra/nKsFrCk ECV4RRKEQVsamiqABUmuZhJOCz+N2H8T1PNe2PPfzltmbSdPuQNop2jJ/wCMiV/40zN0R9RDXkZZ 5SulufLGlzA1rbRKx/ykUI34rmNmFTPvZx5JtlaWK+a/KjXLHUtNBS/Q83RNi5G/JadHH45Eh0Pa nZfH+9xbTH2/tVfKnmtdQUWV6QmoIKAnYSAdduzDuMILZ2X2p43ontkH2/tSy6/8mRD/ALH/AJM4 OrhZf+NIfj+FOvM/mmDSYTFCRJfuPgj6hAf2n/gO+El2XaXacdPGhvkP2eZSHyx5Yn1Kf9L6vV0c 84436yn+Zv8AJ8B3+WAB1XZvZss0vGzbg779f2fjkzwAAUGwHQZJ6pBa5dC00W/uSaCG3lf6QhIy eMXIBBYH+S9uy22q3B+zI8MYPugcn/iYzL1p3AYY3pOYLY7FXYqpXX+8s3+o36jhHNXlv5M/8dPU f+MCf8TzYa3kGrG9XzXNrsVdirsVdiqhf2cd7Y3FnL/d3EbxP8nUqf14Yyo2peZflXqD6Zrt/oF2 eEkpPBT/AL+gJDqPmu/0Zn6uPFESDXA709UzXtjsVdirsVdirsVdirzH/wArZ/n/AMsGZ/8AyH/H e1/xPTswGxj/AJ80ltT8rXsEa8po1E8I78ojyIHuVqMu08+GYYyGyQ/lDrK3Gjz6W7fvbJy8a/8A FUprt8nrX55drIVK+9ECz7MNm7FWK+a/KjXLHUtNBS/Q83RNi5G/JadHH45Eh0PanZfH+9xbTH2/ tYY+vah+lk1J+P12NeNSNuSpw5EeOC3nDrsnjDKfrH6qZH5W8qy3sv6W1cGRZDziik3MhO/N69vA d/l1IDuOzOzDkPjZt73APXzLOgABQbAdBknqXYqwr819ZWz8uixU/v8AUHCAdxHGQzn7+I+nMrSQ uV9zCZ2R35b6S2neVLXmOMt2TdSD/jJTh/wgXI6mfFM+SYDZk+Y7J2KuxVSuv95Zv9Rv1HCOavLf yZ/46eo/8YE/4nmw1vINWN6vmubXYq7FXYq7FXYq8t/M3Q7rTNWg8z6dVKunrsv7EyfYc+zAUPv8 82GlyCUeAtcx1Z35W8yWmv6Wl5CQswotzBXeOTuPkexzEy4jA0zBtN8qS7FXYq7FXYq7FXltvcQX P5zmWBxJGGZOa7iqWRRh9DKRmwIrBv8Ajdr/AInqWa9sdirx7Wba68jec01C1QnTbglo0GwaJj+8 h+an7P0Zs4EZcdHm1HYvWdPv7XULKG8tJBJbzqHjceB7HwI7jNdKJBotoKIyKuxVJ7ryppFzqqaj JH8a7yRD7Dt2Zh/nXBTrsvZeGeUZCN+7ofenGF2LsVUrq6t7S2lublxFBCpeSRugUYQCTQV5FAtz 5986+q6sul29OQP7Fuh2X/WkP+e2bI1hx+bV9RewqqqoVQFVRQAbAAZrG1vFXYq7FVK6/wB5Zv8A Ub9Rwjmry38mf+OnqP8AxgT/AInmw1vINWN6vmubXYq7FXYq7FXYqpXlpbXlrLa3MYlt5lKSRt0I OGJINhXkWq6PrvkLWRqOms0umyGiuwJUqT/dTAd/A/SM2UJxzRo82ogxeg+WPPGi69GqxyC3vqfH ZyEBq/5B2Dj5fSMw8uCUPczErZDlDJ2KuxVZPPDBC808ixQxjk8jkKqgdyTsMIFq8382/mPJesdH 8sh5ZZz6bXaA8mr+zCOv+y+7xzOw6avVNrlLuTvyF5GTQoPrl5STVZ1o3QiJT+wp8f5j/madRn49 hyTGNMwzGZuxVLfMGg2OuaZJY3a7NvFKPtRuOjr8vxyzHkMDYQRby/TdU1/yBqzWN/EZtMmYsVX7 Ljp6sLHo3ip+nscz5QjmjY5tYJi9U0fW9L1i1Fzp86zR/tAbMh8HU7qc188ZiaLYDaOyCXYq7FUJ qmr6bpVo11fzrBCvQsd2Pgqjdj7DJQgZGggmnlWta9rnnvU00rSYmi05DyKtsCAf72dhWgHYfrOb GGOOEXLm1kkvSvLPluy0DTFs7b4nPxXE5+1I9Nz8vAZgZcpmbLYBSbZWl2KuxV2KqV1/vLN/qN+o 4RzV5b+TP/HT1H/jAn/E82Gt5BqxvV81za7FXYq7FXYq7FXYqsmghnieGeNZYpBxeNwGVgexB64Q aV595g/KO2mdrnQ5/qsleX1aUkx1/wAhxVl+muZmPWEbSazDuShL781fLw9OWKa6t16c1F0lO3xp ycD5tlvDhn+KR6grL+bXmNBxn0qIyVoaCVN/kS2D8nHvXjLR/MPz7qH7vTtMCctg0UEsjD6WJX8M fy2OPMrxFqPyP578xSrLr14beEGvGVg5HukMZ4D6aY+Pjh9IXhJ5s78t+TtE0CP/AESLncsKSXct GkPsD0UewzDy5pT5tgjSeZUl2KuxV2KoTVNJ07VbRrS/gWeBv2W6g+KkbqfcZKEzE2EEW861L8sN b0y6N75ZvWJXdYi/pTAfyhxRWHzpmdHVRkKmGBgeimnnv8wNH/d6tppnVesskTIT22kj/dn7sfy+ OX0leIhV/wCV0vwp+iBzp1+sbV+Xp/xwfkfNfEUn/MDz5q37vSNM9JW6SxxPKRX/AC2/dj6Rh/L4 4/UV4iV1h+WvmLWLkXnma9dK9Y+Ylmp/KDuiD5V+WMtVGIqAUQJ5vRdI0XTNItBa6fAsMQ3YjdmP 8zMdycwpzMjZZgUjcgl2KuxV2KuxVZOheCRF+0ykD5kYQrzn8qNC1jT77UZb6zltUKLGplUpyYMS eNftD3G2ZuryRkBRa4B6TmC2OxV2KuxV/9k= proof:pdf uuid:65E6390686CF11DBA6E2D887CEACB407 xmp.did:9fa28b47-4c62-4038-9043-956c78b3ed20 uuid:d1e42c04-3cdb-ba4d-a392-757ab43c8ee9 xmp.iid:8371700e-157a-4940-bf59-8401dc1338a2 xmp.did:8371700e-157a-4940-bf59-8401dc1338a2 uuid:65E6390686CF11DBA6E2D887CEACB407 proof:pdf saved xmp.iid:16bdb7a9-88d3-420f-acce-43f9589108f5 2015-05-08T21:21:15+02:00 Adobe Illustrator CC 2014 (Macintosh) / saved xmp.iid:9fa28b47-4c62-4038-9043-956c78b3ed20 2015-05-08T21:45:33+02:00 Adobe Illustrator CC 2014 (Macintosh) / Web Document 1 False False 500.000000 230.000000 Pixels Cyan Magenta Yellow Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 0 0 0 RGB Red RGB PROCESS 255 0 0 RGB Yellow RGB PROCESS 255 255 0 RGB Green RGB PROCESS 0 255 0 RGB Cyan RGB PROCESS 0 255 255 RGB Blue RGB PROCESS 0 0 255 RGB Magenta RGB PROCESS 255 0 255 R=193 G=39 B=45 RGB PROCESS 193 39 45 R=237 G=28 B=36 RGB PROCESS 237 28 36 R=241 G=90 B=36 RGB PROCESS 241 90 36 R=247 G=147 B=30 RGB PROCESS 247 147 30 R=251 G=176 B=59 RGB PROCESS 251 176 59 R=252 G=238 B=33 RGB PROCESS 252 238 33 R=217 G=224 B=33 RGB PROCESS 217 224 33 R=140 G=198 B=63 RGB PROCESS 140 198 63 R=57 G=181 B=74 RGB PROCESS 57 181 74 R=0 G=146 B=69 RGB PROCESS 0 146 69 R=0 G=104 B=55 RGB PROCESS 0 104 55 R=34 G=181 B=115 RGB PROCESS 34 181 115 R=0 G=169 B=157 RGB PROCESS 0 169 157 R=41 G=171 B=226 RGB PROCESS 41 171 226 R=0 G=113 B=188 RGB PROCESS 0 113 188 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=27 G=20 B=100 RGB PROCESS 27 20 100 R=102 G=45 B=145 RGB PROCESS 102 45 145 R=147 G=39 B=143 RGB PROCESS 147 39 143 R=158 G=0 B=93 RGB PROCESS 158 0 93 R=212 G=20 B=90 RGB PROCESS 212 20 90 R=237 G=30 B=121 RGB PROCESS 237 30 121 R=199 G=178 B=153 RGB PROCESS 199 178 153 R=153 G=134 B=117 RGB PROCESS 153 134 117 R=115 G=99 B=87 RGB PROCESS 115 99 87 R=83 G=71 B=65 RGB PROCESS 83 71 65 R=198 G=156 B=109 RGB PROCESS 198 156 109 R=166 G=124 B=82 RGB PROCESS 166 124 82 R=140 G=98 B=57 RGB PROCESS 140 98 57 R=117 G=76 B=36 RGB PROCESS 117 76 36 R=96 G=56 B=19 RGB PROCESS 96 56 19 R=66 G=33 B=11 RGB PROCESS 66 33 11 Grays 1 R=0 G=0 B=0 RGB PROCESS 0 0 0 R=26 G=26 B=26 RGB PROCESS 26 26 26 R=51 G=51 B=51 RGB PROCESS 51 51 51 R=77 G=77 B=77 RGB PROCESS 77 77 77 R=102 G=102 B=102 RGB PROCESS 102 102 102 R=128 G=128 B=128 RGB PROCESS 128 128 128 R=153 G=153 B=153 RGB PROCESS 153 153 153 R=179 G=179 B=179 RGB PROCESS 179 179 179 R=204 G=204 B=204 RGB PROCESS 204 204 204 R=230 G=230 B=230 RGB PROCESS 230 230 230 R=242 G=242 B=242 RGB PROCESS 242 242 242 Web Color Group 1 R=63 G=169 B=245 RGB PROCESS 63 169 245 R=122 G=201 B=67 RGB PROCESS 122 201 67 R=255 G=147 B=30 RGB PROCESS 255 147 30 R=255 G=29 B=37 RGB PROCESS 255 29 37 R=255 G=123 B=172 RGB PROCESS 255 123 172 R=189 G=204 B=212 RGB PROCESS 189 204 212 Adobe PDF library 10.01 True endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 54 0 R/TrimBox[0.0 0.0 500.0 230.0]/Type/Page>> endobj 50 0 obj <>stream H‰l•AŽ7 E÷u ] 8¢$RÒÖÃ+#0²È±³°çþ@UÕÝe h ªHIä'ÿ§úåÏ×ôòù5§¼¦íç–S©9YÎi��_ÿl§ÛËë_9ÝÞS–â•çèÊÓ[MéýÆò'–¿½o?n~šÊlÒ{IªMÊ´‘nß·Xù¾íU×J¼µ¤·‡c ©Ó/ŽÉ†9ÙX%ÛL³H›qŽÈ£ÝÍÛ],_Ö‰Óž‡—uÆŽÍ]f·#{î‘ͧä¸ùîEœTu=÷ÞE«¦=ËÔ†Y¥ð&ÖkÄjÆ× ™½§Ý‹”\Ó®&äjÎ�*,‘O™‡ÇǪÏcG ¡ÖKˆRÄÔ)LjŸO ¯ýޝ^ G«oÛ×íË–éM�++ñìõdìÉ”j–VÇHÕ‚P½2å L± DÒ�,*¹…ÙÅYìP54Js§¡š¡ÇË*iö–”°6IC;Ú@Ûƒ �îiC!šÈ…š4è¿‘HZ?#¼QrÅ¡¤…È6¥FµŠúL1é’*€aû¶Ñ®îN8]š˜°¨¨û”6WP°h¬xÊ AîÆnä¤ 3X'X¨Ô|IÈ•G»,H'ÕdUz´�J艠ú(pPi"+ëÈp 2h�º€oðX¤bì‡Ý­E�ëú&…‰v^ Y˜¡m†²Žu'Æ(tˆ‰ÖPæ ák–§/Š0†h„�M_X&ÞqãY¶gŧ}[WôºNìÌçùÿc¾Yå ®ÌdG•Þ±z9Þô>î¹|ÿ¦—üNûmÙW¢ÂKîãw×9㳈ëY}h”ûpc\Êu�Çer ò°�>stream 8;Yi\b7VZ8#_l!I$u]H78Js@!40+/JPis8H41f)u*;nat+%b^@>C>NAYIsBeCe(': bna*C9hr]N^3/h4%J%`/b]ZuIk-_3]I5QtnKu%mJetb+-Sl1]\@Y&CIE;$?;3Q-W] V#1e/=^]OqB"PaF-C=]!\J]5$UtP"NhPt0"TWf"tji3`bO_$1=%hP,Qho<=88OSs1 aR?Ah-aps3N!KGn+Wp#Vess;kZSSWJbV`H6/":*To4>]0=fZ$Y4.eD-S.FKPSEi8f "+"ssh6EmT^"m7hSZI;Ko,"s^rk%kA!+Lm;"o~> endstream endobj 55 0 obj [/Indexed/DeviceRGB 255 56 0 R] endobj 56 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 48 0 obj <> endobj 57 0 obj [/View/Design] endobj 58 0 obj <>>> endobj 53 0 obj <> endobj 52 0 obj [/ICCBased 59 0 R] endobj 59 0 obj <>stream H‰œ–yTSwÇoÉž�•°Ãc [€°�5la‘QIBHØADED„ª•2ÖmtFOE�.®c­Ö}êÒõ0êè8´׎�8G�Ng¦Óïï÷9÷wïïÝß½÷�ó '¥ªµÕ0 �Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^�i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ �V�³)g�B£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±Z�L®Ä„?â_øóyxg)Ë”z¥�ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ß�Þô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ�;ÂA4ˆÉ 䀰ÈA9Ð=¨- t�°lÃ`;»Á~pŒƒ�Á ðGp| ®�[`Lƒ‡`<¯ "A ˆ YA�+äùCb(ЇR¡,¨*�T�2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°Ž�Sàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4z�BgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p�0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"E�ÒI2’�ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷�?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@� æP+¨íÔ!ê~êêmê�æD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒ�Ó¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™�˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…�EŒ…Òb�Å~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X�[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„�Æfm“�Ž;'_9 œr�:œ8Ýq¦:‹�ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%�—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† �ž�kï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»Îå�wW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™�™üšhšÕ›B›¯œœ‰œ÷�d�Òž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª�««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½�¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 51 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 18.0.0 %%For: (Sindre Sorhus) () %%Title: (logo.ai) %%CreationDate: 08/05/15 21:49 %%Canvassize: 16383 %%BoundingBox: 88 -320 528 121 %%HiResBoundingBox: 88.5918405504581 -319.78815515496 527.273245834404 120.785820007324 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 18 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 70 -355 570 -125 %AI3_TemplateBox: 320.5 -240.5 320.5 -240.5 %AI3_TileBox: -83 -519.5 700 39.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -179 133 1.0909 1448 862 18 0 0 -4 38 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-80 -540 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 62 0 obj <>stream %%BoundingBox: 88 -320 528 121 %%HiResBoundingBox: 88.5918405504581 -319.78815515496 527.273245834404 120.785820007324 %AI7_Thumbnail: 128 128 8 %%BeginData: 6288 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD04FF7DFD052752A8FD08FF7DFD0527527DFFFFFFA85227522752 %275227522752275252FD54FFA82727A8A8FFA8A852F852FD06FF2727A8FD %04FF7D2727FFFFFFFD06A82752FD04A87DA8FD53FFA8277DFD07FFA852A8 %FD04FF2752FD08FF2727FD08FF527DFD59FF2752FD0EFF5227FD0AFF2752 %FD07FF277DFD58FF7D27FD0FFFF8FD0BFFA827FD07FF527DFD58FF277DFD %0EFF5227FD0CFF277DFD06FF277DFD58FF27FD0FFF5252FD0CFF7D52FD06 %FF527DFD58FFF8FD07FFFD0552A8FFFF277DFD0CFF7D52FD06FF277DFD58 %FF27FD06FFA87D527D7D5227FFFF527DFD0CFF7D52FD06FF527DFD58FFF8 %FD0BFFA852FFFF5252FD0CFF5252FD06FF527DFD58FF527DFD0AFFA827FF %FFA827FD0CFF277DFD06FF527DFD58FF7D27FD0AFFA827FFFFFF277DFD0A %FF7DF8FD07FF277DFD59FF2752FD09FF7D27FFFFFF7D27A8FD09FFF8A8FD %07FF527DFD5AFFF852A8FD06FF7DF8A8FD04FF5227A8FD06FFA8F87DFD08 %FF277DFD5BFF272752A8A8A8522727FD07FF7D2752A8A8FF7D52F87DFD09 %FF527DFD5CFF7D52272727527DFD09FFA87D2727275252FD0BFF7DA8FDFC %FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFD1DFF8A8AFD7DFFA85F3BFD7EFF5F66AFFD7CFFAF663BAFFD7D %FF3B66AFFD7CFFAF5F3BFD7EFF3B66AFFD7DFF5F3BFD50FFA9FFA8A9A8AF %A9FD27FF3B65AEFD4CFFA884537E535A5353537E537E7EA9A8FD1BFFA8A8 %53A9FFFFAE663BAFFFFFA97E84FD0DFFA87E7D7E7E7E7D7E7E7E7D7E7E7E %7DFD077E7D7E7E7E7D7E7E7E7D7E7E7E7D7E7EAFFD12FFA95A7E537E53FD %077E537E537E7EFD19FF7E7E535AA8FFFFFF5F66AFFFFFAF537E7EA9FD0C %FF537E537E537E537E537E537E537E537E537E537E537E537E537E537E53 %7E537E537E535AA8FD10FFA87E535453A8A8FD07FFA9A97E7E5353537EA8 %FD13FFA97E53545384A8FD04FF663BAFFFFFA9A8595A537EA8FD0AFFAFA8 %FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9537EA8A9A8FFA8A9A8FFA8A9A8FFA8 %A9A8FFA8FD10FF7E7E537EA8FD0FFF7E7E537EA8FD11FFA87E537E84FD07 %FF5F66AFFD05FFA87E535A7EFD1AFF7E53FD20FF535453A8A8FD11FFA87E %535A7EFD0FFFA85A537EA8FD08FF603BFD08FFA8535353FD19FF537EA8FD %1EFF7E7E5AFD16FFA9537E7EFD0DFFA97E53A9FD0AFF5F66AFFD09FF7E7E %7EFD18FF7E53FD1EFF7E5353FD18FFA8537EFD0CFFA87E53A8FD0BFF663B %FD0BFF7D5A59FD17FF537EA8FD1CFF7E7E5AFD1BFFA9FD0CFF7E53A9FD0C %FF5F65AEFD0BFF7E7E7EFD15FFA97E5AFD1CFFA85453A9FD27FFA8537EAF %FD0BFFAF663BAFFD0CFF53547EFD15FF537EA8FD1BFF7E53A9FD28FF547E %A9FD0DFF5F66AFFD0CFFA9537EA9FD13FFA97E5AFD1BFFA8537EFD28FF7E %547EFD0EFF663BAFFD0DFF7E537EFD14FF537EA8FD1AFF537EA8FD27FFA9 %7E53FD0FFF5F66AFFD0DFFA87E53FD14FF7E53FD1AFF7E5359FD28FFA853 %7EFD0FFF603BFD0FFF7D547EFD13FF537EA8FD19FF7E53A9FD28FF7E7EA8 %FD0FFF5F66AFFD0FFF537EFD13FF7E53FD1AFF537EA8FD27FFA87E53FD10 %FF663BFD0FFFA97E53A9FD12FF537EA8FD18FFA87E7EFD28FFA9537EFD10 %FF5F65AEFD0FFF7E5A84FD11FFA97E53FD19FF7E53A8FD28FF7E537EFD0F %FFAF663BAFFD0FFFA8537EFD12FF537EA8FD18FF7E7EA8FD28FFA853A9FD %06FF8AFD09FF5F66AFFD09FFAEFD05FFA87E7EFD11FFA97E54FD19FF7E53 %FD29FF7E54A8FD05FF843B5FFD08FF663BAFFD07FFAE3B3BAEFD04FFAF53 %7EFD12FF537EA8FD18FF5A7EA9FD11FFA8A9A8A9A8A9A8A9A8A9A8A9A8A9 %7EFD08FF7E53A9FD06FF5F3B5FFD07FF5F66AFFD06FFAF3B415FFD06FF7E %53FD12FF7E53FD18FFA87E53FD11FFA854FD0F53FD07FF595AA8FD07FF3B %3B5FFD06FF603BFD06FF8A3B3B5FFD07FF537EA8FD11FF535AA8FD18FF7E %7EA9FD11FFA8A9A8A9A8A9A8A9A8A9A8A9A8A9537EFD07FF7E53A9FD08FF %5F4160FD05FF5F66AFFD04FFAF3B6560FD08FF7E59FD12FF7E53FD18FFA9 %7E53FD20FF7E53FD07FF7E54A8FD09FF3B3B5FFD04FF663BFD04FFAE3B3B %5FFD09FF537EAFFD11FF535AA8FD18FF7E7EA8FD1FFF5A7EFD07FFA853A9 %FD0AFF3B4160FFFFFF5F65AEFFFFAE3B4160FD09FFA87E7EFD11FFA97E53 %FD19FF7E53A8FD1EFFA87E53FD07FF7E537DFD0BFF3B3B5FFFFF663BFFFF %8A3B3B5FFD0AFFA85384FD12FF537EA8FD18FFA87E7EFD1FFF7E7EFD08FF %537EFD0CFF5F4160FF5F66AFAF3B4160FD0BFF7E7EA8FD11FFA97E54FD19 %FFA9537EA9FD1DFFA97E53FD08FF7E53A9FD0CFF3B3B5F663B8A3B3B60FD %0BFFA87E53FD13FF537EA8FD19FF7E53A9FD1EFF537EFD08FF7E5A7EFD0D %FF5F413B663B4160FD0CFFA9537EFD13FF7E53FD1AFF7E5353FD1EFF7E53 %FD08FFA9535AA8FD0DFFFD043B5FFD0DFF53547EFD13FF535AA8FD1AFF53 %7EA8FD1DFF597EFD09FF7E53A9FD0EFF5F418AFD0DFFA87E7EFD14FF7E53 %FD1BFFA8537EA9FD1CFF7E53FD09FFA85453AFFD0DFFAF84FD0DFFA97E53 %A8FD14FF535AA8FD1BFF7E53A8FD1CFF7E7EFD0AFF7E5A7EFD1CFFA8537E %FD14FFA97E53FD1CFFA85453A8FD1AFF7E5A53FD0BFF53537EFD1AFFA853 %5AA8FD15FF537EA8FD1CFF7E7E53A9FD18FFA87E53A9FD0BFFA9537E7EFD %18FFA9537EA8FD15FFA97E54FD1EFF7E5A53A8FD16FFA85A53A8FD0DFFA8 %535A7EFD16FFA953537EFD17FF537EA8FD1EFF7E7E537EA9FD13FF7E7E53 %A8FD0FFFA9537E7EFD14FFA8537E7EFD18FF7E53FD20FF7E5A537E7EFD10 %FFA9595353A8FD11FFA8535453A8FD10FFA87E53547EFD19FF535AA8FD20 %FFA87E537E7EA9A9FD0BFFA87E535A7EFD15FF7E7E537EA8FD0DFF7E7E53 %7EA8FD1AFF7E53FD23FFA8535A537E7DA8A8A9A8FFA8A87E7E5354537E7E %FD17FF7E7E535A5384A8FFA9FFAFFFA8A97E7E535353A8A9FD1BFF535AA8 %FD24FF847E535A537E537E537E5354537E7EA9A9FD1AFFA97E7E535A537E %7E7E537E5354537E7EFD1DFFA97E53FD28FF847E597E537E537E7EA8A8FD %1FFFA8A87E7E537E535A537E7EA9A8FD1FFFA8A9FD11FFFF %%EndData endstream endobj 63 0 obj <>stream %AI12_CompressedDataxœì½ë’$·•&øþ±?d&� CŽ;\;¶f™õH-©îÖZ[­TLQÕª ­X”Vûôû}ç~<2“EÉÙfÂÈÊ àp\Îõ;?û?>þô£›Ïßüéþ#wÃÏ~v~{ÿìÝ›·¿:ȧ‡ß¼|ùõWïÞò£Ÿò‹ƒIÇ�n~“?+ ÿõþíW/Þ¼þÕÁäã(•wüöÏ?}ñúó·÷‡Oß¼ýË×_ýâðó_ æ/Þ½¼GÝË7_¼9>{ñ‹ú8|ÿòìjÆüË1üÒ„ƒ5¿ò«Ÿ½þÛ³¯¾zñÿ¢ÒD—>;½ùúõç/^qzóÿüê�óá#gÇC°ù`¬Aõÿ|ñÉýWM›c˜Löc£Ùàf:¦œM&ø)âÛéh“³¨uÞ�]�h²Ç‘Ÿ£ßË›ç_¿ºýîã·ožßõÕùÍË7o¿úÕáü�g¯¿{öjžþïû—/ßüýpzùìù_ÌRøìîÅË{LÈ«gïÆqzn~cìg§¯_¼üüŸ¿~õ§û·œ8~ê>“ÿå+t…^ù;?NŸýæ>ùôþÝ;¼žÇþä×§õ(𡔟ÿû'÷_¼�ÕÂŒþÇ/J·oß|ùêÙÛ¿â»iÄ«‡püÅØ  þpÿêË—˜~™+Ìå1>²žÿ¬ÿ(mñ:Òî£ìLc@¯ãÁMµÅ2M÷{qÿ÷_þùÍë{�‹›·ï>Õ•Ä�ú­ùäë—÷oÿåõ‹wdäG“ÎÆïÞ|~ÿíçïß½|&“ Å,ÿ×xöö‹ûwXþ7/¿~'›2×'`²ûì÷\1£øý—÷¯ÿðæ_eŒ™4a}ÜÁÇiœ8´|ÈÑbmäùƒËóSÍòíœ]±£ú„„5ú«öû·/¾xñúWeôü¨ëùë·/>_–3ÙCÖÿÉ{1`þ3Ùq²ÓS?™ä'EƒíííS>ÑIÀ|¾{wÿºL væùw«­6÷)^åöõçç7¯¸¨_ñøa�½ÆöÃ!Öºùw©Á׿þR§Eþþ ëÿñÛ¯ÙçðÏR“?ûøåרúõÛ7_ù›×~3ü\‰Í¿Þ?EÁùüðû?ý'þÝ�íøÃÛgÏÑþžÛ€€|ù‹»ÃË�i%¾)ÖÿöåþÏ8·Ë×õÓÛ×»ùæËU·Úîñþ>~ùìõ³·ù|îî·/þ†šg˜ž¥C6¼÷Ç'ôˆÍö%¦Cú�&Mï4XU=þ OŸs—¼=œÞ~ýÕ_xóæåüˆmÕüåcù”íÏøøÙ»¿€8ß¿þü«¹sýsé•+¢Ÿ=©? àõï_kÇýÈKƒvä dú�o6öïíYówöžƒÊÿ]žq~öòå‹/Þ>ûò//žï=f§~~Þºî›lã¼úÓ›—/¾zµìÞÕ'?{ûîÅó—÷Ÿþã«w÷O¡eMo?¢wå�?ØæÓ¿?{÷ü/¿}ñ§·3çõÏ`ØpÈ>ýúÅ»ûe†Þ¼ú’¬ÔáÓ¿<ûò^Þ ¶ütî0|†[`Mç?úè� ÀÄÃéõªþ×oŸ}þw øÂ_¿yùùýëÃ'¤ôÃæ/ÜŽépú|ø÷a,ÅHñ‡Ÿ}vz;ü�alLS쪸R|)Aþ«%ò¿ÿ¬KšK&‡°*7«rB9—rY•ÛñnïjÙ lýcWÅ­Šß” e�’‰(IþÍ«2mÊ�9Íå<—“¹ Ô¿.þ¸•�.æn]ÖS'ƒ«?nUüªYýǦUÉKùÿͪœ´ ÿ×ÞZ^[M·YO¿ZÕemQ†yyýj‘uU׫›Qø/W5oÖwZ­0þ?”¥®‹}š—Yÿå*ß®Wÿןqw­í°Yh‡uå¿\Y®q”’e•S³Â7¥l×kÉn¥\šU¬u²†Ëš±è"Õ%›Êba�†²F\«s))·¥Ü±Ô“Å—Y¯¥‘Uòeâ³LèIÉ�Ì�•—�òz“¼ÊEFlÊ£l a�çò9Ö9ç]t RáäN(w‡Õ6"œ>ùì'ãOþâoý&Ò|ˆ!…)Ü„S8‡Ûp7`@»ÔÇcÌqŠ7ñÏñï° ¦Á§�bÊiJ§tN—t‡}b²ÍòaÌ)Où&Ÿò%ßæ;ì;Ln‚L‰BŽû4�§Û雯܏nâM¾™nnnN(ç›ËÍ­ì$‹ð§pJ§|šPu:�O·§;ì.3Èl»³?‡3pžÎ7çÓù|¾œï°ÙŒ¬‚¿„K¼`p—|™.§Ëùr{¹»±.îÖ߯Ût›o§[<ëö|{nooï¸#î0awáoz‡±ßÝ à‘wøæ]󃵱šóß·«rY•óªœVåfS¦Zü/¯JZ•¸)aUüª¸UÁîl)[¶ßq=ôÛõÏeSÎZùç´*7«2­JÞ”´*qUÂpæâ7Å­Š]³*ãRê”å—õè×?çU9i‘“¹YÇíêm׬®Öv‰¶Ë‚¥V«±]‚íÄo§»Ls3·2£C7™e 7³·�±Í<ÍÛ²ƒèÝ€üå›B@nƒö+~Átœ¦�Í<%ÐBêpÜÇwØLÓ ÔvÊyá� À>;�bƒ‹û;ä‚9<¥�꜈vñv áýöÎ{�Ÿ@èÈ}Ùw þ&޶ñ-ÖøŒ‹áDÆ5CÀ…ápqðwØn¬Å —Ê„Ë%ùˆkÆãº±¸tFìû[ìŠ3.¢\HyÀÍ]ÀåpWð*wØ¡,oQ^«¼h.7^įކTvfhK+¶«­¤”^êäßxóOÂ(§ÞAöÕÇI7ÒAýúòe²v! w+R¯$a¦ ØP›io+ÙrGÈíý�ŒœKÞBANo½‰Ê]Ä«· ˜y6ï»ù²‹ØeyçºsóuÇË/σ+ùgOvÿV?ßY‡õ^4óŒ*—ZÙìK)ÊaU¥DURä" W%F9éC›ëñ®j‘eû·§¹r¨õô®ìIÏqéûÓšf@,%Ì ‚E7äÖtxüdâ·Y-±¨§šãXäeX)µÖJ®ÓîqX†Na¸wR:¿ÍñV:Èo}†:Ç?ü±ûÎ;ÜcQ×ÒO/ÿ(?ÒË?• )Cß ·1É/~ÃÎÒÏÝŠãHŽÃ®$ 3d ‘€ˆ@‚T¢4Ф2ÐY”?*åYrE¢$t†t9(‹*É" 9w"_ø|?CRYˆÒ�UiHä¡K‘‡N"e‘‡(‘r™¡Ew"áR,RÁˆ¢Qш‘áÈÈQº é,e$JI OeSB%'äЈjæVÄ¥ Ä% L™(4QlJ>ˆàDÑÉ ¥E|º+‚õI˾�œy·$ü[d{Ç#üÓBÅÉÓêZ,\šrfY(?Ì”ºãºV5ZÑ¡á ºF}®Q�¥9‰ç:­y€ÆlˆJ!,Ã4e‡’„­ê“äC~bׄ´�;Ž rËkÿ £Ðyˆ#}yÐ�MtA0c Û (0ˆµô�Å +á¦àt�€³Çµ“lðâï¾ZŸ  +R>¶›„qœVÓðâûÙó6³CÇxjiú7~ûäzQfdšŽ ]¸B,¶�ÐËé2;šVÑ}Òß¿}þ—Ÿÿb¨¿ S;;Žc4`&¬c`8·¤³)�‡ÉãDŸJú•‚æmW–_\oï8mlÛë¡íUƒTÚ^]¯…èâÅÍ8®¦æ=@ç»ìœËæãѹšð�^`ûŒo²5>ýë?°/ø|Ñë¦ø•s¹+üŠ-œJ(–ðTø’›ÂŠ\Ö. …ÍðÅ‹|„ðÐà"LñôÂ\ÒGð$Lå�è•™ŒÂFÞy+ü]É1*·x#zâKë«î¯Õ–¨–5°�‹‹ë°:Tß_ñ'˜Ý)Ã5/Û½Ÿë~Ôk³G(ê<Ñ/«Ï�xÝÌ~7­Š9ÿõÀ)>8¢d¾-n8ç ;Í~EOô*Z[õgÚ§“µÛÉâxrV>yå|âg¾xª(]' @Å•rO®þ§"í¨÷i ‡’ 嚀y 0sÆfE€ ÅÕô’Ô³‚ÓZþ(VìÛÅž][ÿ;»ç¯Ã1Ô”SœóÍlÛqslÆò¯Ûüë ù­ŽüaŽØP³¨â°‰Ù¨‘©ü_íMúuXþ³±N]Š“‰Ü—1º¬¼üWŒ_±xùÇâÅ 6²%C,hÃʳ9rËQsâJÕ3Ù1âr…Óÿð³¶.µ–¦kv©bç^§ÌlÐZ›¶zSzo�÷Õ>Öšðû¿Öÿ¶¿¯? 5Öd *òW½~®û¹ÍïnXýácßÚ¸ïí°ÔϾCg%Ô¹[œ–Y]fxY„Åv·ñi>íø4§âμ¸2Wæâ¼¬”^nxÜñƒÐ†¹èõªO¢ BO\¹òõÒßÓofczbU êƒp‹Uý"ƒÓkO/¾zõÍ—ß|ýÕ P¼�åÄ58”{p}®ïµ×ñÖïxëy<ûÊøÛzë}|Íÿøäaåôø^n�F©ò^¤AëOÿ@¨Áb3)V”aö°o}ì¯ûÙ¯<íKY9Ú�øÚ_ß•¹Xž7ûaåg¿ö²ç�zW4’úfÚÿiÞ³ºk'¹ëdïeûF¹ —MìŠ3©Òru¨ú¶L×yå%¢›e(;<•]EXEI¯Pp½(Ô£@·ý­l}Ùüê=³gÞmƒiÚ²oC¶­Y¨ ·Ù »ÙF‚t!8C‡ÓŠì‡ã´!9sXNJÒGæ¬CK ÏqÃÕ�Ý�GÎ Nΰ{xN+3är~Öghu’6zßã&'t~4“O"Kg*öib¦ì©Ãé ú’ÇQäíÑ€Ž#X(>ªþÏ­ô<£h�ÂtEë9MGô¸¨”ØQˆ¶-Ç8™1�K©¹ò¸ï F�t9Õ>ïµ^�æsÑçÅ#ø¹¼¼ç}мGòäS6�¸°ø=ëî-ƒÇÚDí­ô¿(éä)œñÍGTx.jL¬A\)ÜBÄsÌ¢Ãÿ~ŸªÚQÌ„#3>o³¨Š‚›2U”Ódqñòì�ìÌHÏ®¤-GÎy^)h©¼>Nͦ)�œŽ!ŒkÕ÷ûÔo¤´úúÕ«û·Ô[é/¢-úÌ]ÙÞ5ïºsN³KmõÅ=ÍAê·U@R'}Ê Uˆ ³¤’fyd‰4®¡âk�c ¡zXEçÙ‹z øV�kõ¿¾.Ù‘íEÜVò† öÓJî8†á¶Ê÷�ðÅ»°8hK?"ã“mi|‡Ä$î‰*îW‘ÿT¹�rT ¢²Ô¶ÄE•C(½†0µ²$aár)S)……ï3Ë3{~T'¿ÙÇ{˜ƒIÜ\Â\–Ÿ4—<—›¹œ–2Äóª,Þ0[“èÚÍÚlŠ[™»!ù¹„MérS¦�r3¤›®œ¯”Ëe6ëû>%¢Bù¦E6ò�íwQúù%J>Íqò§å”šm¼W–CyZ¢ýy‡"ôobÆä˜Ý­¤øÅuc*qj—•>Ì×óA-ØPÎÄY¬÷ãLJ8}¥æMÙη¢ñâv¢Ü eoRßu’�xá¬nVöÑâ²q#.eýÄ—ÙˆÌåD Y5\YTêÔp‘­íÖX´[At[ê¢1Í—¢c'´Â*/º-2ÕÓ¬Ýߌá÷ŒÅAcZi¶ÎµOµòmñó�}3†Æ9#вxÀU' •+W·ÅÅmqn“µ'�¸qe›:G¶�ÃÆÊsmöYS™oë¤V™ßÖ­÷Aëý]ÏÃŽ×Ù®·ÙZ:è½Î–2ìÈ»¬Op`õûž®×¼\,¢1ë˜úM_ãèküü;_ǰ —çÈI‡†"-¢Î‚4På—EVYá·!ð+�chßab-ˆ/BøZüž…ïµÔ=ìÝûŠ Nàn¤í"o;÷VäÞ Ý[±;…sš/»0ÌÂ÷"€WÜΰ8ãJ¿[‰ã·³ø5GíõÁ7ËÏ4—<—åîZ®á0¿”¡Hï‹ oW’¼YKô+¹~)kyWÖsXIŠçM9uå¦){?yrº-»7·(Ô®—™ –_›â¿q‘l˜ÜwQ¾9šÂÃx Â<41Ì=¦Â6’y‹«°FV(&ÐaV‹®U¢·e›.êÐ�2T-¢³M´ZEoêú¦²>:¡¶‰5:ÏÐ Sqä�hÑ‰Þ¦Ë 'þ$Û*fÂ$Ìi5«zt1o�ÄK$RÞ6 %ImÅv’t+ôj˜4 S’f5j(ìù£4P§*ZÕ»rÉ]D»z.”b²¤AKÊÕÐ% ^R±BŒ=ÃÅtW䥞JäN¢“½)zÙØ´mŠE’(BŠsƒÈ>5dÜìÄ®^‹^­qPÛˆõi(â×´b@¯­/Åï°×0öþ§�3½Þ¸¨2tݾOyÈRÜ”òÆ=e¿¾¸Ç„1C¸scÄ«�¢Ù™ÈÙf Ø>6ß•°Q€ø�Ȭïh¼{>о‰–á_^¿~öêþóÃ壃ùŰ÷áâMµƒìf™e…îe®ãS(ÌÅ]E©Š»yëj¾ëØ:™«Å^­õ7ßrˆ'ÃìX>m�‘‹ªÄwÂVx×X†ß¾ÀiÐ7(Ê�§¢Ž<à1?,ïóôŸÊ€,�õloæ{(n6Ã]Kˆ×@RöüݰLÿö€ˆ¾3¢›»a�!ú€ÈI? ¸xe‘p>�ÔM.zŸ’ÎYpvJ«�ªºc¯�S»¤Ò�ꆽS¼KE*IÄ*Ubr³¡$ªÆoiÉBOlQ-T%-jV„¥þ,{tKW6^C­sT¥0CGd®{¥4gx"zŒÍex¨ò=ʃ4î½ÊO~~“È¥'ÿ<ÔáÖ§ÜuJ˜´Ñ�Ñ0ë`6x¬ë,ѩҥrEÕ(‹¢KÜX”1J\J–sB-×ÝÌyÑp¯ ðw¹]”„h�ÇõàÄä®þ$%ÔÖ«a—NŒí¡¸h�̨�_%Un¶´¥EC!CçÎF‹ðXŒíZê!¯kYéU5¦-ŽŽ"< "A-rÒZZK7[�¤eZW?ê]~Ù)=F“گNjÎöÉÅ?¥ OkvŽO-ÃÓ›þ—é°*Ñ.¤õ {6Ý:b<_ `ÀQO¢‹¢ 3ðï„]&9ªÀ¨£ö‹&8šßÔô¦õÓ°ƒPÑüľ6ƒšçT#í†9Àà)€æ-¤ù j¾Ä Å6VíbÕ&æJx�™Ma—U�ÁÍ ³o1~‰ák(v¯jôÚ¼ª¹k1u-†®µ™Ë-6®amâÚ˜·ZãVkÚºbÕ³Ö5£ÖƤõ�=k¸fÎÚ3e=Áz%q[O-ç§”áiÍ®h¢vÊðô¦ÿE:,8I?Q�Ÿ(ÈOäGx>üþDA~¢ ?Q�ïùüñw¸ÆxÛ͇ùôi˜OÖã¨ãàiš¼�1ú)Ùi4Î{;I8W0L6킙𡄭¥øI¶Þ™‘^fÜĶ=éÆK™¸c«ÿ1 ª˜ï‰�dÜ!0IxžÖFü¦¦¶ÇQÍ‘ˆç�Ñ,8t´Ø~?¡×`1ªñèì”v¾ß¶˜¿ŸÒŽÇÁúãoét`÷�,�\u:˜owîKãÖ}µÈ}yséÊù›í¦uÝæÏCŸÎ6¥ññ‹SÍX\ì/³o}ŸN.÷±IU•¹N�™Vtël²ëL²MùÑu³À+�g´ÒEËVö‚.Åv}6k« öü0Š'FEšS€•Ì[s®± .³À!åR…Aú¶ ÖdÔÅœœ%™F9cì³I/xpꊻ©Æª|×ñ0ò„¡FÃ<Ôû7piÝö?GÛl©s^9[nˆd[ñÁ}5ÝÞ^w›½^¼mƒ¾†QÓ«õv†_ÀÃ*u¦bžÉ  ᤫPÒæ;ÎðÞ7%FT÷­5ÖÝŠ DhOÅ!k“㩲ßÇŠÅ9Ë­bÔi†ÌCÔ@tbo~[bË]ñ bŽ\ÇW Dîò¿©EpZc8Yq¡ű¢â8­‘œVÁKõè¥9oR ^Ê5xé»rÁÞ?mOwÁnöö‡@Ù’õ¹QÙ÷ˆõw yi¢Ô†ßž–³ÁZ¹0÷׈/£_ƒ¯Fûõ÷íNyÞ=æy>;#,VŒÅuž€êr\xcÙz]N‚ê½8ÍnÐú…ÛÙsz\¹-_­_Æ�|aƒSz.ÞNŽï©ø¸rNõ W2$}_XÎÃ:*¸EãÚÃã2;x\‹k˜C+«\Xƒ{k@¯Þ—›&ß°«„ò^6t”n(‰àj|m�Ò´K”¦>wyFØ}’}l~ÚBW‡&"Ô– 4ÎäU×G´Ñ„éVÒßM’÷Î� æ�jè còxö(yí&Q=;tq‹w0(^ê˜Á�bc¹dIJwÂŽÁÞ3àßy#Éæ¸4uñ>_÷„¼Ï�‡3•l%m®ÿ_ð¹óqZAÅÎOæØŠêx�œm šM €�%>b±pXÇ)̱JäÜÆq{'“Ët³¥œDÉ[âGVÁ#ûá#q~Õ´q]Vg×6oØ`—,ã»F [=ûŽë¬ý9×ÍÅE³sYÜ»©:¬ÍÌjñ0»r„î. ûØí ~cAüÅÎâ'æÄ7Œ.a·âæÅ鋎^ôërâ»5‰K]­è#¥#+˜àÕxÔÃbîƒbî@bjðáÛd/ÈÛ§ŸFö^#[1©Ì®a%¡¥� ü ·†ºÞË’M‹`ÛÐ £É ¯¤@uFOn*æm#÷”OhÀ Vp•¤æÇ5*e†ýÒ‹§e7âŒ2ð;þãî5(K�å´‘u#Çd„ÁM¸¼Å˜0H$ºMÆû¤OæE{œøªË<ý˜F¥j¸Ô@TGdŽä[~,f«fTºŸFBJƒ=Mö’ÝX9×X;ýâ7Hv`¶ìÕ1f;¦„Ã�±i¹*]œÇ?ÙÎ~ãùVÂ�ß“íüÆê%@qÄ+Ë%ùÇ�$þ¨—"Ó~Ü(2^Ë ®¯¼Ñma†\Qý�Ý™†¢õ¹ÌZsÖ¬¾d­Xç­˜S½­3½­Òd‚€Ûü˜MjÌmZÌu É6%æ*9æÂöá,¾O+wÃ7K²øxùá;Tm°B¼oc'©é¥~WxüÂÝWÎþ4C÷9ÁÁL¶.Œ›àF(çF>¾ÀôÍy*|Á£¬êº³pw%JÀŠ¢ÎÏ’+0ÌJ:} PŸ5�h*Ôd.¨ŽK´ã⌿2v6ð‹ÙtÅ])a·ø!ûÝß· ïÿÕï¨CÝ Îd߬)\4x…rMå¿iõyM@³‚«Ù¬+×`ÿëÿóßuò„q•Faó¤X™÷úù©Ã'|¡$WqÏà2«�äµn…ÍŸp¼Éà[aîÉÚ“±'[O¦^5cš`ÍÏ‹·Û5v~ÅÐÏ,ý¥xmÝ”ì$šÁdIC䆒%¥$S©Yæ¬DKÞû9ãý&Ý}Ýò3îp5ϽëÊUœ©uº|VÛòá×ò;ïPUpg±$±Ø�ch.- Ï2c³<œ,k˜CÅ­²qcW9­ áª]¥Â­M+&�C±¯ÜÑK±²œ‹¥å4Ç�׋d�^~VÇCƒ4ì»â®»_†+æ}Ëðþ_ýŽ:TO¥Åµ¶EUk”éü—ª÷RžA×h àítI¾ñ Ð- ¨`Ö°77—uäÜÖk´ ÂÛMß};\‹èë<ÏžVÎÃã.j߬üð®»?8Wü!:|P¶®Tì'³é³r¬³sˆT4즶‰žîS×t©£Óp®‰òr±Ç9…Ò’&¯$NÚã2 µ—ä1$÷N,1w%@m1·ù†}JA»mÖ{å犿M‡û"‚¿"S‰cèD�NXi0ä×N�‹ô3KDà |_ï.ÅÍ×ÛEùE×>—@Š“Ha©@Ÿzaõ¬0Zô‹¹ Âõ� Ìi*AjZ°L©ÚÕ  *v©Ö%2â ©Qù?Õæ*ówf¾O8¾Âç‘¿#WG6ŽÌÛ�ÈäÃÜ÷…ÿS‡ÝÏV>+ ÃüGÍéf�o+VW47§ˆÛJšÓ°5s#j¦��ZJU¾åÄt?ßK‡‹×Òà–2ì¦ls®Å™YÊéfQ¤¢¡ø]¯ÓµœW^×w³› ™a?]I6WàŸ­Tá?«õxm?~È‚ÜC¯.À«’:eš­…[ À³ tYÑ,1 ‰ä·ÕìÈ?4Wüm:¼";\)Eâ:¤V¶ÂÌJÎÙK�2,™RJ9D¢%!Êí ›hœñ‰@(ºf5_ÛÌã&iìy•0ÖŠ±9Üh¢Ø›a£Ê¶E‘�ÅÞ{ýµ‹oÀ€©¯VW¢œ+þ>([ W*® 0·{2Ï" «¼#KY T‹˜UñDY,3BZ“ Eˆ»Ye'9o, [ÛBÍO²¸–ÆbJ(ƃ¡z˜vy×½nlr®Ÿo/�¯cEò O�¬* A _¬ø=cOÄΛ–?i*æ ”�´¢’?š�V6Ïÿ(1Ð…ÑNÙ�“³’²�^öÆÒj˜ø­èém jlBžˆ4§¹Ç¼[%Àã3:|×vjÜÁ§#®‚åå¾×§j&¾ï|:s:XL›÷ú OùVFðg4 ¿ï]¿®ö^~2<·÷­‡WëãeVỷ‘·Â¯‰–kn¹úÿ%Að6½òÂJºöïaí3#·ÌK0•sÞûê!ýͤ‹XÜ T§%UF‘‹ÑƒŠ¿÷:3ÏÝ*QiŸšgZ%Ý&çñsr;\ÍϳhnVj82Õf‹¤�{|Š9“ÊrR-Žm8¤“ó¹feŒcwX׌]û;7HÙè šã‘ÑX\lCŸzé}d¢nzã$‚fWìâ�¦Æ—|ßÿûõÿíNÿnØGø)î㧸�Ÿâ>þ÷§½sŽO»XFó„XÆëÙSŠ$ÿ«âæ›÷I{ýII&êÑYã-©ñN)¿¦ÇËsz¼%A^MK^“�7wá¡õ›3ðÁž †ºìC›=}­þ[íÑ´ËŠ¦ðP¼íÕXÕrülâöaž0î�U÷UÃ6a¶W£k—sYÛæÈéF»T{�à_'ù›£pýyê-òÀézÚÅô¤Œ0m&yƒ«7eÂÄG_œS±ÏGõ#qe,cLj[ÓI=•-硽úr5'xs |×±Àÿö—ïîÿûáôòÙó¿ânþü>rkõ*Þ÷Ì®5tÀê5-C…U_Cª_æd¿Ûœ KýLÁÛ£nW13Ûxžëi`ÖI`NK Ï· Q:¯2»HŒÒðþAJ¥ÌPÇ�¸U6¾™µ¬³¼wÞ²AU WvJŨ%Q´n–‡¿ ?„…I”ª¸p[Ò‘?!ŸGƒÃ_4Üi·ŸÖ'zߨ°-ˆÍ’T¨+ºìÀá¸ñ»Ê7ìl„M8¡Øª×a�1¼nƒUR†‡¶Âc‰¶iŠÉcÈß.¯Ý—áýÃðV[dµQ†+é§¶ÀGßÇ_øþï¯Ã=+êÚTº¶B¯¨Û°CÜvd¢]„ý-¾~ z¾eÔcÒ¸Ç%ìqxÿ¸Çb;©ºF5îâœ�-ÀÕíÄÕ‡Iø~êÖÝ”€Ã7Q¸Î~§Õë´”^ˆÒ¡(r¥t)½< ¦t RZ"&‡o2©ÈÅÃZb&‡÷šïjúÞÄâUM‡j§»ˆ,í`•ý´~Ú ?m…Ÿ¶Â5€Âï¯üPOøPª2|ðÙ?¿yýñۯ߽xýÅG­äöuÅðÏ_²ÆiÍÇÏÞ½»ûýÍË|õÕ3ˆòå—Ã4§è<-ý>Fw°Þidgà�Ãö h¾BâÞAolém:RŸ†!L˜ph›d©Œ-a_Œ1Cüw<† ÃÇè�ÇÚtÄÜí.ù#Ä3ë—I q€ÁE fôa‹FÌÄÁY}%VÐgSð•Ãä@"ÐîPiðlÍ‘½`›fƒÃÓ¬:žBD6t7Á÷-*¶c@{°ü X�µ/Ç#'gÂTàe1ñÈ´�‹õ0(DKoŽŽsÑ}Ã…£¯�™#d¼±ô±qê,تè¡#‡�^"À-/›ƒ Ø«1–Nâq2�Ø€u ŽÃäIÞÂ#²÷˜ÄàŽ$§& S$˜ �¥LŠ,”£@”¦ÃGæˆË‚ëîò[›’IƮ†À b ¨À`±¹'ì^²B´?ì€ÈÝâI¯M8˜TfÃdO|e,|æ(±{}�Ï}’ â°ÅK'$£"ðcobâ°ùäH""�ãJDE& >÷º©<6#.�ƒǘ]ÙTÎ3wQÑMBĪ ÝŠbb4ôäâ!ú#�˜0$‹±ðñâ>ˆö¥v‡Sf,wnL¦O‘ÀY–ŽzS¬)ˆv6ºÃ·QÒç‚á–Ç* ·ˆƒ…Í]‰ιá£cpp#¦?a¶3¦)û#ñVI(ôhÌ*և׾î*¼Ô1Ž˜[ì:: ‰ÕG…ã¤j¯Ùz8¶”žxš—@t’ÕÓ&}aGFݘ,P¢h$̵ãºåDb3’T^%]ìåÏBc/²Y3Ác-ÏbIä÷…¼¼Ú«ÄÉ!j²lÿ \·8!*8 V¦–9Ù©‹Æ+•ÏõTà-À·¡.°FËw@x°Ò8�”ýÝêMEY=õÛJœá)ò[ÍcpÈ0_¶[­˜�ìê}–/µ³3?æÊ´ÕÙAÄt�ämÄãzHçèÕn¥×ƒäp*Á1r§€ýõ‘sB¨•V–w¶|­Ðý…ce<ö$ñA�–oy¥=¼zLóy›vÖÔÙ#xì¯î!æˆaoh¥B{k_hþV;ós®L\�Ùÿö/øß¿<™ùÍWà=¾¼öîþóÏðåAöÛýîØÄó›/ÿñÙ›? óë·o¾þrõL‡ŸÿâðÇ{”Á‘—Ø¢àþÅ!TfE�bÀ�Ñ��(ØÀxÕL(2Ïf㴸˸$³án ãâó,L"ˆC"™ñzŽûJÂòЄ��¶ \ˆä7TÌôóÂ[¾æ‹Ê¤£d ®+•¸¥ ¶6¿vB‡oeªW]Í!DW1•oHwm%H2kÇÁ¤ƒ±dRq'CâÃÕŽá™XZŒ‘[õ€i;Fªx#îBÞµ] y’—oeèá´Ó¸öN‡l�3_œc�D9æ¾ÅD/àú*m%®¡Ý dÞ„Sÿy]¶-•Æ ‰u•€µH¸JÙbcà®xµ[ ¶Ÿw?*ð�Ç ŒrYrBàÊŸ:3̑٧nŠsS.µ£ØçÁ�e·ôÝU”ÍdSi°k3GÔ>fT²9i\Èh?ü¹qûÂs÷W¦iC;öŽ+xƒì#ÕÑà@EÔÅ:ª®P¯Ÿ€›‹lƒ‡XJÂŽµKun|‘ðÉÆ›Úëyµà$±ÐèÛá 8CžŽ(Aï]ÒZ0O¨ׄm x{\ê ÉF0TOÈE‡È“HfwÏãèÁaaJ@CôrÁ`%@|èR%›R˜Uø#>LØoè;yp "MfP"0Ð=âõXp©ÚÙÌé²nä |œÁ9€Àâ™APrƒ-àÉ á2Ã3AÞ(LŸOšÅ™\ªŒ'¬"‘D‘Ó‚ÓÇÈ3ÙÏÀ |=gÁ¿Áó>�/Ý¡RÒ‰ƒÅñäÏÁëѨ#ƒŠ3æ'7’¹Ä=Íî®Ì{Ñ&a¦1žØ[f±Ã^íÕqÉ·bÖŸ‰Ï!Ãá…qVxT,î@œm¼ gS¨Ÿ?¯+ ®“+ ö~ù gÛZ½ÖÏh+ÊÀ´³¶›6,Qó”Äåõ±Y­ÐÞš×Y¾Õ¼ÿü”ý9Û>s¸ùò‡¹ %Ò‘Æ?l„ âØm¥ m]À㽃)€L„·�œŠÁpï�¼è½‘Ch±Mç ½Ï ÊS’I£8\®¾…Õ…<%4™À4.Ïi+Êà´»¶2©>=ôÏ�Ððo?ºR¡Ýµï4«™„ù1û·˜…œŽºº?U58?!YÞ¨Ø&Ø2q¯ÅˆÛLeL¤få9m#¹p\”ð ¡ŒKîdv“eŒ–œ~ÐeÜãØ ŒK¶¦“ûà¹#}0ºU±OÁˆêe¹ý€$ŠÀ|°ªxAÞ*4>:QÅ[ÃÓ#„§žƒ LæTøUÎþ$ ÖŽå&±ƒ±&ª4yrŒ(óö$bxò(¨5ÒMâ�0êòúˆÉˆ“pörû‚³w�Ý—#…-F6<_¤‰¢f¦n.ààã(�Ôí`wyÚ|¬ånM¤E¸À&Ú‘FèÈ„àÖ/„€Á;b)qù&L˜ç€Û{Áñ3ƒÍ0�ªœ¼F>fœº L4Ëä�ZÃá$.ÏH=%7}+ÊÉØ‘—.Xôl Vnp4‘s.º .†N:ØÑ–D²kP©'_„C:Q¯´Ó�Ū€¬€ÕNT)/#è*šÐt­°NN."PÝtØ„ûHݼ¡BsïEšúœn>ºnº©lGòØŠÔ TV˜7SÊBÚÀâH`ê¸×díp,À†d kE“Ú´÷qœÆ‘-@ô#v∣…�†Ø”f¯AR !ØÔD^K·h׊”›·3Î09ï�¡€ŽPd”Ð.‡�WjZè“ÜÔÂQJïô¾�ñ`È›½±t-vß©kÕNM7”nv[¥y=Anuå àŒ=èUÄ^—±«dü*û§NI¶Õàq<ß4Q)�ƒ ¼4Ö£VÔ»ÚËÂ�‰ù˜¿s9)ß²zNWQF÷¼ˆm¥;’-:ôϱœ?»3ºR¡OûNó·ÚY¨Ï¹6w�JËß¿YŽúÙ1’F 7lÖµŽ,í ÕþFÝç“8ÁªJ\ìoà¾À¢Yë}¼68j @)À€…7àTÛ•TÛE‰±ਟ °� Þãic�ã³ c&ª›¨N�-pdõ•ÅdÕ?§¹úÑ­Lcó«Ì�Ûwž»¿2Sÿ{Yľ;(&68�`d]@Ÿ‹i“ U}µq·­@3Å­¢õ¯Oʨ4|nÔÞ‚,¹� ¸xÊ€õóÌ1M”÷…ˆO#Ýi°Ú¸Ý&H-�nqdq]±$«£äàŒ«ßé¡véÆó…ö¤0Ò§qTÉ£R;�{Ìà¢#OR?WŸjJ–ÏÄ'$qÛ+ú›‹ÃM[1MFUá7•$#¶¦ÀÒC tâÈmŒ!ƒÂN¢ûö�La\h¥·{:‡ù˜…l‘d»¸óõneMq™� @ÿœG×¾Ñ÷§Q�ØK��r>¼ÀÈ2äÙ¢k…;AM�xŠ_}pœuB¤œâ^C?1*!èj�¸§��T˜ô-táéþC"G×Ó°×�-¾8`¯Ç¸;–¶EûNÕ/£i•Ôk0�ÔùC?*û ¶RÙFnîî�Úú¤vnº~úUhÇòè:ýø„—·R?§â­ÃÝáv½ ©ÚŸ‚w›hö½[!»q8�“ ðpÁÿB Ú�Æ4Ú#ݲv Á"™°­„Óí= ú5�Z ZÅipKɯE:Š’áTÔø мIŽ6�‰ï�É’ ñ"K6Ñø×z%R£„—£ÞÚ8¬Ñ¾{"µÛD‡¢vßö½Ÿ"ïr�H\h:‡E²�Ôja´˜;[ËÖs‘<§!-—Š­¿ãÈÆ8•ÔöŠnïËH³f�·x‹ê¿Ùº(R3Iƒ9ZÙ,Ö…Ö»^q$ó†�Ðq¯ëƒv(¼ùˆ<»ÍµI7ÃÕõQô�¸\Å-Ýñ�têæ�è\÷�!E:”Ñ �{¹ Ô+’¾…^|¤ôî‘F!¿ï)Úzª³¨­§Rç&Iq�å8\Ú™IÏÕŹˆ–ÊEÅq,®Ltyì§ÞƒÒ�C©ãFf*§âK)æ\?òq¨&àÆ©’ËDû– Ä�w}ë]IûÀd¯G‡¥°½Ÿ%· ¶;å¤0ÎNÁ­Ã¥¨ÙhV¦š�i˜:ÏK;:Jò`¯p!£ïÞÄElLÈz ÇqßÓŠS™X¦™R«÷É”qµø G‡ÛÆ9“¦rE­s&‘ýeéóÒ¤Õ_4gž‰Þp…uþšà´!:ã óŽAõ^[;nZKU,¸ynZ:NKNˆ*=Ì®|¥så¤ED(Ñër±·u>�´%:F6zš»±å«s'µÁÞl ‘z¥©÷òìî–GÜ=Ù^iûHõ‹Ù÷ûäeä=æÝsR�é@i"Ò Æ£q„{wˮŮSèN?�£çÎPºÍ+í:Œòr$¢(î8ñ2oÆBE6.OE6ÏcÿN]‹=_Ò�nºÙí†òØ*]u3‰Â{ò�G�ysÅß”&7¯VlGg€Þñçìˆé½;kÅ®ãéò­­éÎóÚͰ÷\Qyx‚رéÚã{—TK}u­Ý KÅ®Kêò­n–Úç=6Ù?Iä»g8S¼#Õ“¼ôi…Ǿ¦|�å,Þ8©heGÆÕñn‡d3‚¼ƒuÃ8¨Gi¶¦ÞVpªqscÁ-•÷øTLˆÖÙ’avêèª máaÖ9‹ã)D·3¹¸!˜d¦Qˆ^ãàÞ¨®Œ¸#¹ÜlB°Ü‘º_¾�º^DFú¥¾…ªK]ñ˜Åå9rÀ]?tMå ‰ªc>ÌŠ vшkH¹Ó±bÌ�†È1‘(°To¡�Ë“p±ò±øšã;ák½’'�£å“äzVŸ :é>º:�fÔQûJUo ´ËáQ£Þ=`²ÀƒëLßÊ(+Kˆ2|.sè ‚+“ ¡_<�=ËF|Ur„¾…ê&A,•û‰±ÿ;­@ÍÁs“¯£W�õ;Cè[4¯¢Oj[a*åz‹%ŽuýXö<ïºn(]‹=MúN«F#ß ¥Uê÷o´gèg¦ï§[ƒn(�­Ò~(Â÷ïÎäC¹Øxjêé$jT*“§Â9÷­’ê|#×$�\¾¸OSC�dT�™Aâ­Rj¢bQûÕõI7¢'àVØë‡—a OÿŒ~ M}ó:õŠÜ´™ÔÊ©›ôRÚŽ¼òDZÂàÑŒvoÓ¶¨žW›Ié»éæµÊcëóc ~°¼2" ˆ�Y‚“*#Ý-}±3Ùp¤XL&(�^\* úÑá*g§nPx_ Šgšcê�HäðÂÕI–ppuôŽ—ËD…xõHä“]W½#˜«‘mãp+qÛ€á DW@e·l¼ÌÓE„Ñ%È!-ÀÇSzÅK2� ‰}Åžêe+nàïíE Ò�|�DFY#‘QâžBM7K(¸d²(�dwzÚ‰(|Ñ~àI0ñÅTQ‡ñ0þΫ5ƒ¹W¨¤ÆâxŠÿ´Ò9Z: }+“<‰÷ ŸDx{ñÊW¿#ê4‚î6Gp<ì6¿Š7¥tÃVàÅéŽINLOÑâJÎÅ7ñ³µô¥”i‹8»ê¯›ŠãáuC]v/MÙ×p¾숥¹óAg=“ˆ5-Žä³h׃U€*e~œŽ­=Ó¨s0u† ù!œ?O]€»¢÷„eп6‚S—¸}’¸FàðÒ°Œ(<"( "„™Â¢Û…¸Ý9´‚˜ä5Ef@“ø GîIÌ¢“�`¯Æ†ðà><~­¼¥‘Œ¢!ƒŒ©ÅG��øFö˜x^í·*¦:Z¢œub¡€Hy¶qæ4j(Ÿ k‰Ï½š9(@�õâٶГëJX%ÎXJ;­(¼�GU.4 ÒÒ=Y5(ÊÀ}fˆIµªÌ´ÅDú)±q¦˜—›5ÈJihìÈÝ×u“&åa´$n*ZÓ‰¨´ AVØ)cÜi¡ª“ªÊ�wúñ^§J'›+›dIB걌ΰøA�°q¿¾Úm69czÀ(X¬ÌÐÇ̆۞vn{ºv ç*Ûüš5%œxÓB .61Œ=!‘Ibú~ƒÍOpo(mƒæ…ô9m£p$v&�—¨i?ì „ÖðÀó—¢ófï…šú nbº~Ú¹í†òÈ Ížè jê¾Í *(BV–T33¶äÕ~«©8ó0dÈi ²ú‡g¦,´bN„Jêë™\W\¨NØÄl†Ôoµ 4.Ì0†•ÞCF]:únp)Ù fJ¹Vw†Òµh^©>©i•T Fcv�Òv,Œž CP¤—Ž3ý+µ ôAíÌôÝt³Û å±Uš×[¤�žpŠmLÔ@‰Aµ`>t­(`%1¦�ѧ&‹W™ ŠA­†™’9!Ä Ý¹R–À³®¢^‚ ãÄmé&¶óuÏÌ|”þÉì� kѾ‰>©kEŸ\)îlõ¼lÇÂH8ÊÛõ Êßz§6¯]ÛöÓÚ>æÑ‰¯KD§LS9ÚQx$”б‚R¨-\ißÊS¡&›÷"µãŒ{ ¯Eã,7•hü@\b&`ãHGp'¢7e—¾…^ï4¤Ò¯Kld;­$Òœ!rž™êŽ]�e§EóNú¤®•U]J`N;J@ýXèxéŠã¥øÂuïÔ´x^f¯™›®Ÿn~›±<¾NóŠ:ÆÀÐ- ¬€Õ@fAŽç“ �è‚¶�èÇA]O»N×N²6Ê![Uv$ª Èó0PŽé¼äµH}‹çEB–P/´ˆÂíõý0¸ŽÚZìÙ8ú�!t-Ú7©ÒdÓª˜C“øú¡€eJÉì¼I©PÍòþµq7«ÍS›õŸ™­`"÷*é¸ÀFÚªv°È¦S!CNŸà =ÙkjXpjÑ1µ0-& ™T3`†�|Ë1iб¨Ü§OJ|ÆìÀdÄ*Љ÷)z¼,ˆ9 Z¥#-.'çÝ)ΰÛ¦0gqÑÅxN”YW;-~qæÀZ-±½z:©Ñ´{ -Æ�êÀŒ8t·ˆZä”ÜtQ‹óŒ¿9Ïô¥w=´$d¼['oÛ‡—¸å¥·ÀQü[ôñTË0"au‹ºcGU±Ç;®J‹W%’T”3ªNWÜU×âyÝz+°¬�n˜­�¡´-Ú7ªZë¦UÖ ÒŽã–ÐŒÛPýÙ¿HÛ¢ja¶Ò÷ÓN|À# ²oGû¡!½ÄËÜŠ€è-yÛ‹Î: »ìp°xÌ™•š§,‘ç-ŒV×B-¤ ×N? €×2„®¢y}@× 2é1e¬\M®Û!$u£íß‹Nª{•¦E5ö6SÒõÓNf7”G–dæè®ÅˆÇw¢~tkœÈðc¥�·E/Ù¶‚øFq¤£IíXÌ‚ùD¦š'TùI ÂH¯ —™*6ö-”šâžõrÑ1ÓÕN7nT o˜€Èï  kѾH½Ø·­è©‘Ý(ž!¨�Øf($ž.¬’Ý0ï¼QÛBU!:Ý·»™ìðèŠü�ždÉuP�2‚S™ ö›(pM‰òA.¦ޤ7D‰ÉÍŒpÀ UÏ‚tæ“„²ÍêŠ *œ¸ôë�7ZÁþoáá(ZƒMWòlÛ Á‰ëZ¨(­€qý×[ 8jóTii·r;-&S5�‰ÎÂEÝ´É ƒÄV¦•e�èBÅ‘h]Žü�j:y9Tg 3Ç .�ËL‰2õ rÜ£¢Ã¡õ`ÓN‹H[ddôÅlµíAb&ÛÄÛȇdŽ1Þ¤FühAæº*‰oAæúnZt8�F�þs#¶«3;-ª“Š몆½keŽRÛ‚ËYq†¦Æ‹nãÔ�·àrŒÖŽ2c‘þAÕüÜ€ËÑ9U|/èz&˜€-¸�J¬„µINpxZp9êXe¸°¤oh°å:&a—Žî�`Ö`ˉ¦«+šÚ|�2DZŠê–¹ ‰Ù<Ñ5Êé•Ð�Ëq³*we˜–Çô(sd� Cñ¨;vö³…›£‰L‚¶Z¸9²èòŽž†ÜãÎuD¬qGkñÎx.ð ×o8Æ}:®¨g.B" =�¬Ð”:à¶úy=¶Ø·åK `ÜÎóº͸õ]«b á>QOÙ �ˆbˆL¹óm}Pûú}7ÝvCyl)fµd jF8Ok2ØÄŠ-ÜÁ½µ�:Ä8Mq×u¹»f×"(ò¦#8d±ì´¢‹"8�{v†Bmže çLð=L[×BŸÔÀ½íôÓ ÆíŒ¥k±ûN]«nnº±´ÓûÈ"ͫق§ñ”'y8Á„â´�@'V ú Üp¢ºkaÛLæu+އ F®}kT®`×õÒ‚Íõé[4/ô|Ø­�/MÅ ®4cêÑëÄÅEžžÑ{/´m \7-m/Ý̶yt…UŽýð8w»P𮃈è�ï:ˆˆo#¢ÃÂë0":P¼#¢ó‡ß‰è`ò:�ˆ/¯‰è€óvA":½$¢ƒÒë@"*¦Þ.6D®×�Ct0{-8D羿 Ñ¡èuà_Ñ÷±ÑE t3Û¡óu(3Lß8D‹××aCtÀ}-HD‡à·‰èü:�ˆŠä×aCÌ�~{�3¶_‹QAþ:ˆ ÷· Qqÿ:à‡ Øá=T(À]˜‡Š Ø¡;TpÀÔ¡ îB9tp�-”C… ì:üÀ5„C‡ØA8t@‚}DU )¸‹áP±;ô†d°CohÑwÁZØÁ»¡Åì0'úm0J­·‹á°ÓªNè@ý:ð…páì»i±û¡ô-vvZ5À ÝX:ð…ö•v!º™Ù馛Ýv(�®Òš•Üàûíb8ì´j0* `aèÐ×Ð fáò­åpç9]‹„�V[4…~‡¡÷ ½a~ɹq7-íc›Ý=cFA'‹‘„ƒMÅA¡oE»y l±@õ‹�ŽAArF Zòrõ‰!:ˆ2€*@÷¦¾…šå*«GÍÉd÷úÁ] Z*†»àÌÞXºÍ;ÍÀm+�jáÛÀóOYmñÍXŠ0Äþ“÷Þ©i¡Oêæ¦í§Ÿßv,�®ÓL;¿wóT“ðWüÎK¸ç CS.ãhضÅâÑ·2DÖµ²]ÕxL�NÙæ£“mÎ|¢µ¹ Â�‰6õ-ªùX¸`Ú–Ç1ïõc4¾wTžO÷z]}óÏ‹§GÓÊib /{ØI xEÃ1D"ºdöoÔ´Ð'Õ é¾ÞÍd7„ÇVdÙ<ß¿aƒá £ XÚ ÔÕ: ”�éSðj¿]¨¸ÅAŽ’ÑŽ°�^be³8df�Lhf5WˆE�´!œm Õ¡�š)/ÚQ­m7‹.°"ä¡ÒÎHúÍ)gضšTgúDº¡ AšärÆmAãW÷Fm }£fbúnÚ¹íGòØÍw¼ÏE¶$X9%²Í¤Î„Ÿƒ¼9£\4­¸ó˜~]ü E@¢âžV3G1‹ƒ•T,Œ¨3’z€!+ÇlW¯3Ìhhz÷S¦3n§°ÊtQÂ…O™zg]ƒæm*�ߵʤ͑ÇÁi öv$ôµÈý[èÇÚi;õ+;Ü<ì±%øá® Ó^’ç©”QÛµÆÒ»ªcC߈ÐôŽò´mi">uB¢†�B¿§7Ä"sDWOžq ]ýLÈÅý‡fKÛ7â œ(æy¦7�cÞ�£kѼNµ�w­4åv7/àÁýðõózÏ5ï^¿ÔO­>å‘)_6Ç÷®l UÌS6ªÊC|—AMHñœèu‚!Íâ=�D=ਫ âŒä8$‰‡›¬Ä©ÒžEÕ\0ŽW_×@U€¶_ÎdŠá«A¦öù}‹æ5j€OÓ*AH§M|š”úëèíD™ 7¸xA÷ãoZ¨˜ utÐc¨p@Ü"ŽEfÊ#ÉС½£�z|1zȈ>«…£CdJWÐÄèe5Z׃ˆyAGq=vX¨½]Ä0ŒmœJÄÁ(L(ØØ…E†•Ñ8· KÎï{|°4)Æõ°`¢è)öç Œ¾>tëš8 CסÌ ]ÞÁ*Ž’²“èÚ8itmŒf Œ1¶Âõ´¸`Ã%Š¿A»º©·n™¾PÁîc-• Ìvq’MÙ"t1sÏÀ.ÀW¢÷ž`4• ï–™‚¾}ÎR±ƒxµT6€YËs¬­et;P]Ë;µßšg¡yÎÕ¹{ÔÅóû�Y´û\¬¨¨[ÔjÍH[y‹­•'ÕÍ�Zà>˜±¶Ò’œ¯v>‹ž�†ëÕ¢fQéÓC\‘Hfâ@H.Uº}%è“pY-Šዯ `¹½š±‡¹÷q­ÆÈŠèP&[ð«,ÕxWP«h1葪ly�WŠéœcÜG¥b†Þ½:Ϩ#y|ƒAåËCö�§$¹Nƒ5tÍ;„)TI$ü®Ïh ¾‡“ÊåMZ)ž)˜ïbG¡7%Ò2Šëá|�v¾…ë‚nø*vbì± r*ÛpÊHÂ'Ìg"âIwƒ%ç®}Ú=Œ[ªÌKÈ ¯¶ƒï´T6`J’ y = ¹ç÷Aœx’EÒ}‰PvÆô�Y*v �–ÊiyN©4n�iy£¦r™ƒæ1Wg®N0�ÊŠ)´·´T¶ÐFâ4´ŠD�½tR ²{2Ó’Ò‘ûh@©Vìâ&ÕÊ£¨>§ƒ7*ƒÛG*/ÔÖ-3Ð<åê¼Õ‰u’¦ä îÑ\Ù‚ ‘¢É¥Ðâ�üŽ¢ÅÛƒ9¢ VÛ/‘G¿ïö1µbh©l …êc Ñ<¤nÑ<þÚfž…¶¯kÓSç�©ª�x»ï€-• þ×�nÖtP¬y·�<¤ç§�oÑ{;¥�çÌ;P§Vìé,•[žù1µgÓ Ùg~�Úfž†¦¯kÓ³ç¥ÊèËt?‰âèhöAúV-†³�ˆ‘¾§Žë;í£(0°À$ÛWâ®`ŽŠþ�sÅÄÀ\Ù"ÌÏiÁ æÑí!"ô/×¶ê'¨}òãý^*›’ôíé#`OoÞ~ö‡7_~†þïÞ¾y}}¥íåÅ+äÅýWŸý¯û<Öú·÷~×víè7H=X³Ã/?¹¶;ª/ï?ûŸ÷/¾øKùf8üò7¯ßí´üøíýß^Üÿý³OÞüý«òE¸ áöágüÛ‹Ïßýå‰�8¿yYÆ«½rŽ>¾ûüþõ»e’üµ®ùϳ?a²¾¿}ó|ùN³´·ÃÏn~ã>»}ýyéBÿ>ÝñâuùäW‡ŸÿÓ‹¿ÝÿbÐD[uû Ÿ�¬ÅÉŸº XïÁSk& «ÐX‘\›JËòÿ?þ½Ó~9t¦©ñðOøõ?ñáßñ¸Ãïÿþãásíàcd$ísæxÆGsøí^«î­~»<硺ÝÞ_ÓSszöü¯/^¡{è“ûçï6köpæÅÃïåw"ÐXMY0Qˆ¦¯aç eLµ«ø:`¤c¦ÕŠÑZ^´vvj  5ˆÃnºEjžèñÈÛ™ê[†DÊJ7²’I/ g4º¡‚Y:XÀè³Â¨•N/ô¨Tðù|N!"ÐAüÌfÉÓ=ꣃÄ‹þÈ Ú+„b«pÌ��xP]rÔ{ÄZ À’ñþ0 ¥×ôŽÎˆ3Þ©]t„˜3'}É"ÂÙ1©ÆW–Tõ IÓƒ29Z·¥‘Ò°$dÒ7ÇWAÿQa�è0PA.ÌÞÍ W¥3é�qýìMî0wôr7p ÌÌ1Ë:»¢Û"£É UBL®T8;O˜€1%¥`BP_˜;ÙPO<º‘ċסB¨¥2GC_:РVæ <CŒøÉè8êbRÈQqXƵ91Uán$ДÔÒ£"'*¡©>#ê£8Ö\’;­|4¢d¢c·ôãÄ›O•Pࢼ°Ûã¨Ï‘ÔÕ¨gNm‘ }éÁOÖ2´¢Â€­F�«F+¾%[%yp¨Ò¼Qå¹ôÄp|’Õ�$ºg‘4Hć꣕¡2ÀUdK¢\C2&NÓˆ‘ ô 2¹hpÆ¢ÿeÏØ:Lë¨#áÛDSC1މ)†E¦‰| D`ý:^" á fòý T=j†�Ø$�c¦“Xuß’ø[Zö%¯‹=-42àFúáþà5¢f'Mh@´ º©´ðÚBò,qÅ’fNS*­h Oa}ÒĬã—�c‰NL5¾j2™JCš¸j|'™ðNVó‰gŒùf +ö0$”(H  ŒA[Ñj ðC^ᇈý¤IT¥ô$™lÔÆ*Æò†Ûó~ŽH3ÊÜ2Ž-Œú*LÏÉ7r RTMævdþE®2“Å–*�ð•i"î1vñœØéIŽ9è]õ<¤_t¾™b�7šÐR½°&Æ ªFšo²ÀA8f˜gF$qœdúL9aV¢!‹)“~�Ô/YBF)ô).Pn¦ø2Ò�Ÿè7i£ãñ•Y6©Y’BtaQCiA÷*ÃŒë“8Á¬SD‹L¹!ðêcè0GÇ©Àw…KZFŽ-F1æ0!Ó$ÏÅc«³0-34éÒW˜æž7yŒ¢ˆKbh›(T‚.’# œ“„üªÔáT`Ž'º}øºôI“œ< -&�$¡Ùt"yqA&à1¦ƒ©Ÿ4`VÂDŽъe|¬É„¨íH0ÏD�í]Is©+L#˜z^RãfÕ;•$þxÌÊ%áæÉ.�Ñ$"ÎzxÕ‰‘æšP]Ð’¼xcÉ—bT\ä‘{�94/Ÿûª’¢3�ÆD4:VîLp @ÛFñ±ÈÌIHô1ÑšƒÉÄ€-ÉâÄI}ÍyÐ,�Nô"ÇN Ï]§°™Š* *�ƒ“%ã[TTA§ ò‰X1«D(/ÊJ&ƒöôË@ã¢u ‹("™çùÀ¶¢DàZ @<·ÄqÒ^®¸82½¨×o΃t'Áàø<�©£¨<†<šTxbe¡‚�[Tƒî�ÙŽm“ö˨:¢X1ý¼O´dê!ÂèÁœi-dŽ;zff5èÌ9‰Y •¦uv"m±•$Û+µð¹ÂâR�kæèJ~F¨O¯+•ã8i¦+ñ6ðTÔ`‹ÐL1eM’.܂ۭ‘ŠX§}d¾†µƒ×áåÆJWºG‰�· ã[zËšv Ÿ¬êóŸ—=aÈ\zæhÇ딌»�Û´�ô‚â·S�GìH¢‚¤Iux:M¦ LÏH}9AýlÉœ¡vtŽk’~84GIKD¦Ê•†?VhgV’ ²’~Ñ�ÑSI×A.Ô’+Ê·èú úpY´ìãóUg#Lèa¤¯1«F´;¼¢‰�ů¸‚‘�É�{®¬TX_'�®ÒVÌ@‘ž‹i,À“#Ó ±ç¼u÷nEóî%A¸ãEê¨ùkÜ$Ý–²@ÃP��SXeÔ,Ž›�\ øV°«Ìé[ òä›ÈΤ„sD{¶™*ë@5ÄZ�Õ8ø¨û@ÌøuH¤¨I*FZÛÇe’ Ç5ö„œq†"™©ãe¤RLÌQäAРâVºK•0êè&ZÙY1M2% GLÜ’L$hüECGW‘8˜ßÒÊy•uâÔáäÔ%†ðXÒ´&×7+a§p�O <Ÿ âF ~N€ ^&æï Ž)1–ÀÁL�0Ë…ð $J¹÷Tò’»ÁàŠÍœ„†Öo&ÀŒrek%¨!Eܱ¤€N¹z•+&qˆo |¥;K²NŠÒ­ø?ÈVLíGŠC¸(YDq¡]ä:‚äñ³šÏ|bvšÈ'zÙë6$�¿“ÔX¬ h*Èä΃Ú>"¿MáU d’h¤Q_yÊ ü‘Øê#!,iK’y‚ÊF3g£ÇJ'ÊJð[Ùˆ¡ÐÐz@—=j´)È’J2=XEë¥ÔKßUHÎbläÕ#Ÿ‹g( ŽH"!gèá5zk&a@r%Óÿ`•1ÄJÖ ™º× ð€0ë–aR!Ë2É綤¸Pþ“i°7†ÂUqCtبô£`™‚†¥Âû FPf®$ÞPEÈcEPWU«0μÕ+öõСgÈÛÓDåœpøäeèÐE´Z ·;:1—ЖKŸ€ ’\*žåŒ#ÝŠ#Y)¿|+X=–` ™‚õq*9¦ÍÊ‘ÓîhÒaF™séLmF‚!}RB+˜0Ä:'^(}mè¡�&R‘`Oâ\:­RXaCbI&¹ÏY)Ž:ô<×N®¸›ÖŸj™ðŒúfvfjSê(„0Mä<�TNI¿% à¬0—Ç(e½$v-0vh’±ùj*f¹¥•¥_g%¨•JÖc^VÁìÎç™/ÌŠ‚bxŠáV-„A}«ßnŽÎâ6�›!Æ-Óó2rö—PoTÒ¦O#[°ÅÐ4ÉÎÃ�ie©$I$(Ý*4íi/cÅŽ"bêÈK‰¬ß$u©˜­0çüÛÑL:áÎa;Z�œW~N§'ïÛ‰ð¤BÔÕ ¡É�&’!#z Xõ¾”ì›Qü`bNa¹2?Ro!þ)mqRY¡†ÝH=A–ë‚hÀ¬/—ÚIyk3‘x•é°dÇäïÕŸ+hÈ¥Öh怸•Ë��HÆ ¢Ï]CÍ5Ž4½p Ƥ”R¬À–ÒßW¬ûç¢?1\ hè[D‹¦að#…,Næ‘£þS®#_ð…$ oàAgÀ¡�� KöçU4<®X …?BdY"l’FS£¯äR°�T£ÆÙçUÝOX'ªûy±²2‰I(+Jz$G‡Á±B’�9º$Š®¢^øFúÌÝÉ)��^ÚQX 1—±"‹;¤!¯wPô™I»£ÐÌî@LYgÊàM¹z!P�$Ì…š•™W�0nºc F]Oey¥ÛÒ‡Pµå‚*@‘ì–™”ٳ⿔ôUéâøª™H4’ʇZR¹S�V+dl  „ˆ"ö7Ãò-PO⥙cö × Õ—b2S"ÙjCÓî,R!N +l#U¦xer]ß =�”[“ô­ÔŽ#m'ôYrU`¥ÀP9ò,³Ò‰½,—˜ð‰yâõ[rkb :€@Üdä‘4w7%‰f`ÃJÝŸ¬ÑÄdòœ4x'Á•fwY=ªR®ˆFF¥%ì_zï‰ÑWô2 Û‰Z(÷T@b 3¡8èy©Lº†"ÉaÁñ>úD*ïøDúãð %#‰´¹M¹ëS´”ɇη¡Í2~&4Ž9_HOp«EÆÀ±BRQ[ªÅ£ózØ2­¬”Ý™(ƒÊ³5®|ËHÙy|n%ƒ›‡çºfÌ"NÌ™(lYî ‰”"XšF)Cltú B™W~°«ÌEÙ- @dñÀV�àÿ©:åµèÆ¢ºOtJ®ëa.b ¹3ñ®_)Jšˆ×¦zV4âätº úÅÕÈ�¶’6ê`è ¦# _%êëÈé´ÇÏ3ï’ÄÓ< `5 °R�÷Œ9&NfÓ‹§`QTVr+PƉá"p£T—aröø ï«:1Q£*.NVˆKϘò†$ÓMÒ‹ýâx,þÖ8øÜi|BpªË·w|Î¥à6±¹|N@ù$ù\dŸ,÷s¾PNFsFÐ_SÔµŒ^÷¢”e–uqØað­š”ŒáfÅ�&àâÓscyI uI“ʪòDHùeª L‹K¤RŽŠ‰Ř7ÑPÊT ÷Ø?Bñèw$Ý�4ÌÝ�¼~QÉDÒRi“Ú )6áoa¥Z\’Z}¹Ãû7ÊjSJf$�ºP‰4I\ÊD)™Q„QC*.Õ”‘ÉõÇE·ÀM*‘@XõÄÔÑ6UñÉaÏ+Èš#H ‚zóˆ '°VDU¥ó½^8äD¬ VZŠUdõ‚‘7¡0]V,^êÂëÅ�?*Ä)D‚ɯΣâÇ–_ÚʉL>"ÙbŽÉsQÙ …ivGi)ˆUPVŠ·UT@Pnxn$%Ò$�ZqkT¡&d@ìgØÕ£v*h«p½´ 1kƒc‚0’îâ &@  xd9™™Y|p<ÕÍQìj†L™Õ™º·•–Ê7A�aÒÒa^î:8Ýa‚„;éºh®Ü#aÜgöA� ö ƒŸ —EÖ65Œ¾ø¤¥rQ²‚Ú ñ2Å¿j¤jw¢Œ ê®d“,?N¾%9‚1Ý*”Ã$ãÆ\š‘ÁSivçãäE¢ò’ÉU`ìÉ;y�Cˆ%Í)oq©¬šJVJÇĬVµo•/8'0™ |<ÛD·Õ0ÑüàòÀúC#jÉ7g8©˜QOuQù¼êwÔ ¢iV•’À@mfVð}hNPßͦ‚°„¡ÚºJÚ¡ƒšàÀDÒÀäb¥í_\#°ÏN©LUI4Qç˜ÿ€¯I³1m5̉Sâ²cÁtžÐ‚Šp)ÉA%ø,9²ï!èVÂ×5rP¦a®ÊݲfªY’ÄT Ô1ï. ù™‰Îc"TÒ`øõ8¦âÓ, ;ŒÿÝNÊŸ`‹Ë‰AˆtLòeæ­ÓKõ }bb‡(½^§ÍD`#°e)Ù@|“™ Ë9í‚I…Ø3çYR%´bÒþƒ,=Z€¹/°+QY$Š+ÚÂŽFZ2¹OgîD$Õ/`ìX�ò°(×yú¸_&Ôê„&I'‘Ž-¸S¥�Ú\É+í„/ÔþéÏoæ\!¢pQg¤Bmk£L4ŽÁ"„t¶ð{Í¥pÔÌP“J ¬®´FLÙÖåè˜À`˜–Ñluœl¤ÉÊ×Ï $’Œ±L•@£‚I%¯‘‘‚Ã5ê¾Xœ4;�>ɨðÅ\Ð¦È í YéˆÞŒ de;œœ:ñ¤æÝl%ƒ%3L‰i¦šS^îγƒ°n4Ž×J”÷¤`nD�Tß6JŸ«¶5âS‘}Ÿ#hY—¤”�&ªíñŠNTŠ #�(Ê Ä,Ü%Ì¡'-Àu0ˆP\®C<$0ý’…L­£0µÁϹÇc±4$ŒgÒV^[I•€lÑNºEE¸0ÇAîò’mœ-Ä„‚¶Å“‰WVdVÁi~’ˆ´´5š¤ý.OgÖ‹Þ-D�4’60K?N‘¸è�P*&jBP1ÖÜuT«9vHd‰ÉL�l /IQçŪés,èNâð!ä!i’¼Q�-i™v ¿ž­ðût÷�³ÅN(¶¦Ò`\ª—)ñQ–.Æ5¢�4(Å& %Ýš÷“B_'Á½ÂnIQÑÕ>Ntuîêb¾qj¾g�x�`×(ªÛhVbÈùy1dR–Á•AEŠ´0êÞ:ц zkÂ¯Ñ þí˜ SùŠ$mÊ¢ý•úD8VÔ #+ëÁMI8–Eá�R¬9dc99T˜ñ² Mzž�‚ñLpv&±"ÓC$I N1Z¸”5Ù�°œžÚ\ñÒð|0€âU^RjŠ�çLáì™÷y¶’ë€æLîmºø�›!`x®7¯ 3½Ý‚@Ž*6<©é9XLÛF὘SÁò—åM^¤^Mlám<‚õz/0@Túñ<À“)³&JèÆ(É(†àHT穉™b²t“„³a+l]V¨T”n(˜²…>S(õ^–ŒõYR3Ѓ¬(xrHpüX5lôéR˨!ê’z>Ù ®\6Œº�%ÎÁÓoÔ܆lA 1�S—†�1‹ûda»˜xzÒÈ"q%Å*@ݳxO‘}æè P³—«Dßzñ¯ÀÑåXHoœ„²©õ>Óçè)!†ÏÙÀ™ŒË}ëµÒ:�TשÜ48ü5®¦Td—õ]‚ømMõ^K‚4ÖaW±.i7EZ˜†ŠóÅU÷–+A9}6™ü¸±}MôJX[°¿nŒþ9—Öp%c¹ÉØa@Æ)êP°Ô…pcõÊñ�ØJŽ€wÌ],¹PWIOB’¦‡Ó¡ºI¦?“ñ|jsœqÝÕÚ¸]VÆ8Ùˆ–. 3:‡‘B}¢AT™ýÆí ´Ç€ÛÓw5΀:Å7¤™ Ctá¡�!syÏTÒèѰQÃÍK�@kxLrkû¾‘…Ñp­’�¢SžK,3i¥Æ}êì.ä/ǯ8ŽŽªóo¶˜¦¸æ¶À~ìÅykݨ_ì?QÙ3,ÓRªèôfÍcþ¬Ú�È<4Q{š_€"@lýÒŠÐ?!¬yI춤C ¸Qe,g#³™—Ìš÷4]|¥GšIÀÂé&2TÄý7�‰^¬NôÒ=£Äæª~Œð‹Qwä~Y_ÁX&èpWîqJmãxz¤Õ#~Àq[��’‹7¢¹1�ù Ø$kÊ/)kÿÂ&¼,¡�tHz5Tíuíœ@ $ŒN+ر¯1§PsË‚¿Í£æÁuOÌì2ÚΕ•<ßg(ô侑e™O“‘`ßq:#ž¬ñCæ²I —‘Ai‘üéTí;Ò,)Þàù»�óãÓ³<œ4Ž“½Ýwÿ³‰ ¥‡K€±ð\F;eÙÜb·ˆ=òás™ŸÑøÝÏ2 yuf/Ä-û—=ÃágCqÝâ½�È»1 øÛsed3 ]+…܉¥pL/¨å•ë†®Òæœ ߉aB[]hï&®lNÛà’A*=EƒÏ}6xøUø¢Ix(z¬s©‡�Ög°Ÿ¦a†=B›ƒ mþ°§<=Ý ¸1ÊœSx‰pñŠ…à±3ezôæ¶yþ G!ÄHj°�Œµ¤)�ÔB>\Ó®!q\%AŽSQ% >ÂF¯ˆi*aYë¨oŸÓn"�cC¬ùw°)öæYjZ¢‚šyu@`ÏÐŒ†½÷¢1з…ýGh½ˆßì×bÔ‘õ¢@wÆO îHÍÙŽ= zì |*Ö�/ÿœ»KîS ›,´Aþ°^¼â@´@R)G�OÉF!½-D“HΑG°AzÀœ`É4p·7§à�0ÅÙ–»!äÛ)‚v|rЦ¶´eYùûz�$`¹Ú–Ïš`Ê ÄP¥Öç2Ÿ‡‡S‹ï|! [ÆTpÉ Ôò*€–+ՑާÌB­ÇuHÎ'Jб˜n7*¸êù'=çü%¬m ‘ûmŒ9ÌÄ¿•¸¸ÔT¢Õmžî—¶©›~ù.ð©¹dùH¡*Dþ�O-ßw�M^ýëá‘$÷æHGíäZÊžì�9t6„¡ÊOßÂÏÚ×¶¡¨ípÇ Žd#7H�ZÅ„g¾Ç÷d|,*Íu›ªÃõ\n~‹©-✢ôhÐÑÂ+ ÔX‰:…ÚECÌì�à+�ë^�O]}%òØ3Ì•›ÃÊód£dÊì„Ë�ç¡Vÿ°+¦2ÂìbÙü Ç‘ DœIÀ*þ¹¬„WàŽVLzŸDÔJÅt¾â”ÒÕÙcýrR9qö`=6ñÒݰŸO ›@Ù«H’—Å;ü×È cšðl^åyçïð^}§Ù>Û®ÅÍ5‡ÅŠÍ¥øÂ÷¾R«¦—€¦^f÷Cñ"bfƒAf%~à!uA6й·€‘€ˆ³ù'*%2uñ ݽ¾(4‘穈2ç_«>ÊqÕn Öt߯9“Ú”cRž §PœþB¡†+Ô•t… ¿åµG×"ÕŠ¹Á„3½"Þ}Ïæ»>öYnô«%�SvÕ‡•¦¶#½/¢ã›ç?\ãY+÷½é&P í8³º«·&ϹÂ|SöÆ1UJ—L’,‹­ç1ï"{c³(ÎѼ2@bÕûnâK•)Äy'Ä—³»Ùé*á¨pÍÆv‚‰·ÂO•P3‰DE’VZÔ^v9ÌÏ §zq2tôø!ó-›[<ð@®êiáëæ–NÚïíþð7A·²2›ËŽ7@a 0 ¥Ž¹9é5´ L|êŽÞ¡OÚÐòûð XÊÛ34}wè!FHö$n�Çü—Ýxè+T¶ÙÌ,k³ä>IÏ 4 ¬ÚÖTÇýçÎûWˆ¢Uô-àâ~~5|‚Ö¬PWèþ3¸µl5@™ˆW¾ô\inÌŽæ\¯5ÀÏl%Úl¤2ÕàÏ »ÎÕaîÊŽZ$ÛŠ›˜BìWÂÌ Ç/îoÝÊ@n·£&©å~ïU+.Q¢™mdæiK1Ÿ”ªÜ´ ¸L§ƒS:îrƒl;‡›/C¦±Q`ï2Y1ËK€Ü=žÕõ¾=ï»OÂëœÖ‹FƶP¶é¼šâñÑ®2 ª` “gÝ âO�¾iaf0”%‚Èë#èle>gé%Ÿ�· �34®6JÓ»”J!¦YDoWplpF';ÍbCÚø ²kP€Þ8*™SuVW©2#ΙÇÁvìñ€ÍQJ9aÛ["NwºáI«<%ÑŠ:ó¥L�¢¾J‰>BhèIáÝé‘Ãt3ñm£j&}•3ÃgŽ5þRb¾†Ä|�Ó¹·¸O—T—Ÿ!:i…÷‹k`�p ˜óZhBRcáˆã—×ûÞ bÿzÑ ùA½ Š9㞇¨3T —{@BåˆÌÛ¹LZ%ÕDÿj”méN§”AÚ`˹o>Ú”F¦n¯‰6œÅgj[R ES‚<”Ç2A6¨ÒxKœÍÜýl ”á×64¯m�ç�ÀWÑ踮 " )˜“�!¤AïÁ ¼ß½­­Øå‚ãòç®98{’ùÀ¯Q›"˜&]´)A`½Yæ€ónܹp-àÁ8c“¨1±|JJ]TŠÝr¼ #…0ÌÐÞÏGž„FhÇç*àïË¿ƒ6Ó¶¶«œc��ýêÈ…™àÒìE±SÎgõRê˜×ólsÙQ»v~|íMÁmj×ÊŒsýÚ©‰š]£÷ˆ'C"NÓœçv¦æ\ׂPÒœ“kYÚ±°‹t fÛ™NÆ Vèüuç%9æôä`2Ëj^—C"´$¨’Ãé—¤HŽÀÓCYNJ¼ Îü¢ ³}EvVŠtqöàëÒÐ¥Fƒ­Q˜ îHÙ$€9\È.Üåƒùõ2­ã¶jí‹T�u:S5#Äìç~ò U¯H†ÇN1’Pm;Y•Á£µN ¼éWj|J¡ŒŽ tÞà+Ån�SMy¦õªA] ƒ¹ÑO±Ù "f6°¸s|Ǹ¾b4P45ƒ²�“è§ë''&/í@ ËKk»BG¸d7®’S'ãÕA)g§8—`-åóNTè Žõ�w�Â?MŠÄ¥˜D€h¸º(1‘mxì’>� ºÑõÂH³ó(¨4EÚýŠðLÇ@<¯àF¯€néÅ’ãTe·îí@Z¸Ì ÃF_lâÞÞJa©Žñ´öwLLl�QØkѰY�4ªÞU²8 †fC¨EÏ Žƒ3Œãjƒdÿ¡§±£À¯oj(E5Ñ\�ù–A*¦}¤^“úGt�bé¼7’™´°?fL�j �粓¥<·¸æ¹Û–l2æ_¢NÏ“D}} ßÝt‰_9€0ž6F>c‡VG°)êÊøþîænW¸~�†ûÛ¿Ó1tŽáÿðë?þÏþ÷þ×ÿý×ßþýßÿ§üÇÿö/ÿåOþú~hÂýw;€†QÀ=jh5ÍkP.¨P¼ü—Õk€¢@¦x+¢&h=TxÅÕ=Ò}Ì`i•�ÙLØ£†‡¡’#G�"1¢$t Ó±^¨†Ùk¾*«×é¨Óý"=ªÌS(K: NÌl:W$›ÜΞ2z,øØ"÷…%¤ÿœîÃ<Ö­ˆë‚‰Ÿtø£[@$Éà�<æ~·‡ºYQê{Qòüè<šJÄÌ_šûOç¹Ö8´-sˆvÒ „þ«!æ¶7��¼ ¹(‹ã!Gv�KÖlerôO˜!R¥Â�4àùÕLŽ%ÍË2â%>È�P¹ÄêÔ_…O'”ƲÚìÕ�ø¸ÜAŇ»ʘ�ëŠÒ¨Jô!ŸýÎ A×zD´‡T!¸Vó1µÓ£Æî*˜»G_âUi´T¢èRB‚¢C>ü‚ {çáb¦«\1õ}5 ¸“±CFï”Îi¥òë8z¬O{ï^Ä£/Õ�VÅšJ%*TzÕVSÈïô¡à‹Œ;e�vv•ÆH{rïðÀìA7¥"<»Ÿ$�㓚¼Û6­p;ûì h­IKœ%òs Ê„´4Th¦óH°]‹%7Œ¤�x–‡~¨=îXŽªAi'uÚnYÉúÌ);�[«Ni'ÿyÊ“�-¡ÝO9Àæ§àÑ Öb@9´†Ø2kîr'ÜÓÆ�8ÀÛ™¨DþÖ¹ôZ1C�'ûéÂ+È*“^¡¡iÏx_a#&¨å®›p0#%©Q«L\5«Œì™xC ™Å?ì¼hKa1«˜¶{B7„-ÏHÍs!5‡.ÔÇ>‹æ0sî<˜NågÓoÖ‰5„™dŽÀ¦»á±¹V�}­®p/ìA^*³ñ„.ÒŽµf³½L�|é„y|ÊÁ'$Æ¿ˆÎ�?³25;ƒ”1X ¢ºáÊl€m§©ÎgQ‹»Kusà�гëÙcxÖeôG(-�L~Æ8Ê+Ó&¹E"ÈôHlª |óðÄ¥#ŒvŪ+T|´5Øô�ÓëQVÈ�Ï\wC`q˜EÎWgBZt,©«°×ë “Ê¦#�ŽCï°*Ðrïa’£6{ª†©)$õ;È(°øz¬¬·æ(4Í)Vï†9åÈ�B>ç<1úRcÏÇd5–Rá'|Ù XGÆB|™¶Œ ‹ÅĆ9i¾ü(ð�0Âä8ÀqŽƒz:Žø_IΦCG‹$Ê#^—ÆÚÉbcoeúkQBxaê)¸éVØã{DqpGàø,ÞUñ}…õ–YrqüTzðÑ‹ØÜé9QYEfNQ™Ôç(ÝõÚJŽM-éÞ · ª´ä4˸ŠÅ¾!8O4P¡�2öu‡wE *�4�â´ãSÜn¨„Õ½† /€#£ÇŠâk‰Ìzœ®Æ7·×s•]öÖ x’ɆBâ‰) PGŸ sëjM$N÷Ù˜W.»,uŸy‡>'g($%U(®n Sx7ÄKº¶�)HLÈö§òJ`³ðŽû}ù»ÑÒ��ül5@I qA¨]ðj¦�Ï—xËU6¶^¤JU^ki3Ÿ0$�´±Mb¾gÓª\9š¹ô � n²o¯+ â²€D(UׯHíµÃaÓ‘2Êl°:'DMHr”ŽÇ[1ÉcÀݳѳU?ÁBÃQŸ £'Åü"]–ãà(r÷ Å,|)ªXöÌe|nˆ:aýg„h–9½ŽÀG¯y]¾»à Íe’9¦sˆ“üš&Í_y™’xÒd9P˜tB“Ï€cÙmW Äñ~,ÝE8 5áÈjͱÖ Ñ +‡M(&B°R…ðdõÆŽ²ÁúGš_̱6\òQ«ð Ì J„ٱܓ£  ¸•£ TüDf{\"ê–a7ãÓûŠ(É4WtA¨¤oˆš9üÃr`‹þfl]$%eèËÁèŒ ÷¼;GˆaÎë ÎY„ªÀÆ3�c£"ë×µè- Ö˜ŒŽ˜�aÀIäš©šOp#sëCª§§Â{Gì°R;ï÷WÛ?¤iz €ç[Nœ{¡ùÙq…Lî!a†{¤em Õ9/o0»_aÀ‹4îWCÉ€ÐXJ"tÏš­Ô�ÈÜ wƒcÝõ¤œ=¬¾eµ�òM/Òe…¶ !Em‹tW‰�MBe‚‘‚cà“›s\©E8½Ù m@y‡�dÍl[ f°ÀÏ×µ Ís¼ú«Å]øp)óÃÜ;+ÏÿÝ/uvA˜'4šÕ‹ËÍzBœÎ6Ä6†�빆H• M�y°•îÕ"ï²êÜá-L˲t’ ŽåEédöhu¬—?"€,{’•W-Ù â&údèí¢b_ �$!ð¹(F8;R0v©™sN5�ÏI÷75ZiFîÝ3öF¡}1ï‚\¶²t‹„(�Z"]=µF=›LAU4!2çRãÂ%-d¦Ùo]§HõÕp÷¬N–µþúÔ‘v¥�ŠUWˆEµê6ƒTà=ß=È]Pfg•6nþ»sôl>VM²@¡ÈçXJk¢8ƒIó—“1Í�²/§(}²øM[(¦Ÿðÿ;CônnŸ†æ×„<5”F„®Ïm�¿*6€!%LyÎÓ9D1Â~ÊÌf¨Ì!ã27¼j†‡�‚!A2B›vFÃÛ’Å^4¿" Ú¾ÈØÎh†¿B;2N™H¥[Y†isÕ·4­Eø#K�ÿÏ+ |å ` å¹ïøzýÏ]°¿±,\5ê?dV´@¡kOx&Kµ'4,KR–œÉãVª¶5éSœÐØÐiÅŽËP0e9L>ša%-�E¡‰ÉÚ+—[x�Z`V� ðõëï@“5öc®wÝ/ J‘©ZÏ스™L¹-Ö¤2CÅÚasÙm}••ªÍI¥-ý¿À^ŠŠ6EVêw[Xq, 2À»Ê‡Ö"Æ µçÐSuc*ÃþTÐ|IÓà¨uïÓõ!l—@�™47PäÒx¤mâ-Ìi¤ ‹í\–ÐwÙOvÁœóu8ékfÕà kÄkÑÒ£®x®‹’�Âlq"Hi™ù’w³Ú7_�: #�GÌ” [yÑRzT <]nbɺÑ(~Ü:©ŠQrËñ©k5¨’ Sux/ÙPÛÂ÷çF“I>‘ïä Gº¬äß"†àtšÌÓu)ª36’€Úœ%Ø`J_[Át[)�î.ÜHù “`ýAöß¡…š÷ŒŠ"§šø8°’ñææž¡º¼‰9ŠÈÈð©r\õ{≯çôÊÑ ‡Öû`®‚sïo£"g‚¨³ Î ¸y\Hc ÅÛBŠÏ 0§ÈßßE×Á†‚²[á¤Æä—tÞUö¾„ü’»Få(_Å;W þš¡Ó®¹-¸O�Ûé²àì%8‰™žÃW® =λ2§™*ÂJ.Eoð�è¶ž"0òžu¥Gú[DÖˆ¤à¾45î(g³ÍÈ[à˜€î¹*•å•Êó\\ø6žjÆòcîÓ18É¢LúøX¾ òÒçþn$?•ÅÌ#‹ ¼æ mÿ3AtÙPÔ»< ¹÷p!×#Ù«¼…ªG�¡ru¼Š¼ªe)p¶Fûó{�‘@ÃHZß4‡]]ªÚ�Ay�x�3ŽcÏØ-Ò¼9lmC|ª´å_;£Ðêñ¤7nY0©–ç6?+‡(GfŸí͵ˆÆÐóZrೡ‚U­•ó8©ýÆþ P|�Ü~œ�²(Èù«›©’ôC¬ÔBà\$µÍ.iáßËÒÒoð£ˆF0æc”1yqd:³  =¤ã"|*Xá\QG'|Ê%&Ë&p¨ÅÅm¬&]›1`O^¹Y[̱φ 6 .+4°lŸG4¤=ÌòŠÛg#ù¿Ka^Tƒõþm±4Ó°¯NúZÃ�ý°ìºö�+¸399\@5K )­7ê:ô­`3½xŽ.Nâ@Q*Pm|ÏÆ6L¹Àù³94féµ!Ó¢íÓ5Öß~œÁŽ_yÕ‘öY*›=[¨ª„hµÅÙ0'O¿ôLÁw³u;¡À$^ÕC9Ÿ €þ™bk #ëŒó'ª³«a·Ò£`/ Õ¯Nÿ¥Œï±V;öéY(YÕÃ7+N%zfúÍ[൅ÈB§H4‚ ´‹îÇQˆ®®âHUŸ&¦¨‚å�Æß¼öaz¡xW»ï“ %å·� P€Ñx„“»zôÉ.šÝØÆÆñÍW÷ «ç@ßÁ½PXLSëì.èo(䤞‚=(joÜÞZyŸì.`cÅ4§`#.ÂJQܦ¤ïÂ)^:âS_¡$‰‘"e$‚bCµh r‚9Îä¨ÊbZÒ8À]i¨#oYOusÖgcŽÆ, ‰¼ï{�ÈS�ìX²3R€:Öâqö�‹íÎ\[ éÌͦØeJ7 ÚŠšbJùæÜÕ[&wÀ»Gî2vYm½ôU‘îœJµºu³ 7ŠÌ!ó˜ÝÖPgb¦£fmfbÇu››âx£4ý.ÊðÌQŠí�œáËœ–mVèˆVJ^üš×V‡*ðPžgŽ ø©‡æ`V�‹;­ò·ºÂóFʉ1¥í³a²¡çáßEØF;^k„ý^.௚p`Uf­ðôpP-QE×ÅùÊøVÌ9v{Ä¥}ÚÉõɪìKF¾¨[[§U^4Bƒ#v]Uö|µš¨ž0EJÙ” ³ª^uH1¶¥’IzñBÿ·>„ÃQk6Ò¿ví6.qþ±sêå5ÔÝ`@~QÈöl²R÷Å-«°âÜ®b€x$HYEè=éLkÝJx¢>Vs`2BLds+:"�Êž‡ht£€#&w]TEøªªåãüú;°zÇrF!¡¾1ÑùêñÊ\3™§z(¢î3^   1õØÂVWlðuÁ›:λð)åw®*†Ê ˜D:Ôpc—py<ß2‚æQ‘Ô<¢QÐCš×–ûS6ˆ˜CoþÒc9m<8;Ó+,y$„z[â¯WŠL=Z I¹SÚ̻ۜA@—Ïxê:¢6 u8´™Cþj8^쮯ƱMç©K‡Gëå°\;¡±Ýˆ�x2é�U9æk”®‰ó†ÞÃOÃÅÃZ GO7×Z ô,ܽm_óòØÉ "¦åô´>%‰—Tüî�梺§«áµ™^~ŠðõâŸâ(ÁÅz~±ò`ÌÕ߇>©ÿÜŒ«#�Õñ­Ä©Yæ‹TÕÛž æ¦TÌbg®À½£ãf}ØB Ôïb踧AÐðIn‡ã±ªc²)X_àŒeÖvO†WŽZÂlLG|ª-ú§8Ãj‘B+K×F}xg ŸùšÛ÷éÝ ´¨N¦‰åÒFXuFµŒr¯õy,¡:'˯ÛY 8¨(Z8é7Ì=KÒ–[ ,Œ”º‚=ŠöÓ`%i6৺¬ÞãÏUh )@ †³ž ²'›ÛA$$ip¯W˜ˆçì7–xò>� Ý©³�t�m‡‹*'…ôŠmШ4¼AJH [€*ŒË5YL´KÁþ× çè"N…]Qã™»–!Æ‘¢t¡0Î|Â×6¶“rƒE\…~P#‘­Ò[›Ë×JWàÚgÔGȘJg.KÚ›ÈÎȧ“BäñäM?õWfÙ9w6|†R”KTfGT3r{ ßlœ9$ÄÜE°¸j.Þ¨Þ#EüŠ|ì9¼\?š“â{ƒôO”qÀÎyy(Òõýõ(Ö²ìHj® üÚ@Óë²0%´Å[)–kNÒñÆ‚‹‚ô¶솸÷gdÿ‰#´©Éʧ˜7�éœo…"�hfJ.��x¸ýÐ#Ö‚–·•äèÑ8ø¢Ps5Û"h¬ìY ¾·A±§†îÔ-ƒpE±cö"~ã„jžï ¹ *Œ„f�嬆�$�ã‹B¶¢gþ4 #Pã¨AªÕ“PÌ"Üy³zÊÒ€3Ó—�èX”SE³â+h´„$é:ØUN± \‘h“ Fò�àÚQÙÖ¨ì;ÃkâagZÂË@8’¾zœy•ïÆô[hœ‡=0Ó¥¥EA<(J>¶¹ŒÏ¥êPK ÔíM% ³<À>d¨Ž²°ÈÒê5ˆ,–‹ ±Ñ¹"~ѽTb‹6TQÑ?Àª„¤©S±’çN±÷•š: ;­"ï¥îiV|�4˜±1G¡ø²àœôN§£Ìü[<4µf”Hç)F~eÓ”RŸ�t|;ƒ^oe»êU‚�ÏeöÂÿ© )Œc„UпÓãÌÑc®þE½Íóv>Z<¨,-…—?s: u»BëT á" žFçÒǪyçvh�»}ƒg|Ɔ}?›�L™ÛÀÒ´> Ÿdn•y¶¹Ðåû4¸¦`0��ƒb1O´Eò1�™ × u—;º÷*ןAÄk¸­•°Ö9†›d•Œå«]VQO£˜è�?çØÖ‡U#w•ñ‘fýad¢´Ô 9<‚ˆºxÀ`‡Úºþ½î“Û”d1_ûziz{n5U26§ øÈðP¿´V�ŠàïmüþðWÜ]ÊÍÿkœèwÎsþú�ÿ§?ý¿þö?ýçÿéþüçú÷ýãþ?ÿø_þéßþéþüOÿõ�óq–Ÿûý�ÿðÏÿúÇ?üéßþ¯?þéûãÿ_ÿùÏÿÿÿé¿ýÛÛ÷^¿þö?üú_ÿ—¿¹þÛßü$6pþòù–Œ'ü3Ô�ƒÌÑ*æLÖð0Ò$¡Ñ‚P;`¾—[UàÔ-FPÿ]‚·ØÀù&5€ºYË·Õ`Xü0€½¸5,Öo‘Ïl�ð¿@q׿×b–u!>9fª§"´=ß*ä�Ðû`cŽJÔ°áØ Û‹2›Gà8ä6{·!8rE:iDe?Â匴·™8:‘OYWle«q8EÞ×g–d'Õ,Î;C+þÖN(©*.õP¦ý & 2ŠÉa°t.°ã˜M”ª½b6Aªüì¥÷ç¥UÏq‰Ú—{ úcW{ä$ˆ4AµÇ·=ß,ûôíu_p}åg‹ûÂEÃDùt¶/dÒ·¡}RÜ~ö±&Q!ìë‹�¾]ë«!e3«‡)Ûsþö¨½þmMO‰ã*¿ãHOÚ=åþmD�Öç¶—3  �óϾóUˆlþ¶›¯ÜÓÔ¾]æmhõgsùªåiùö”ç{$}8ÉWp×Ïòœ˜Vá�5·í#ÿ°‹'Ÿæ=þÉ%^NÅ”&’Ó§t’óå¿ ÒV?ãÍ–vŒNÄå§!ú… ,2äË}åw¶ûùEÛÞMÏ9Æ\°½ÎÉ@³œÈ-¿™†ëC5ß íÞ„”µÛ"œò7ÁÉÓ\)ÌÖ·!8$ë'KW ¨X’Þì¿‹BDívýÆŽUc›}‡Åá»ÇwÑ"àåñ]T³¹nkoþÆ…óéè}Ÿgy »€ïFÞ…}*Óóÿ;¯9zÛvS .¬áÖM@K:ûéÖmJáºMºS‹ç¾½¹?ãä]: ¢5!ÏÈï–Ü(‰¨÷Nܨ˜×Ònn¢ÖŸ§ï¶"åǸí¶Å<åt»lóD’žæÚìV‹R á©Í÷ ɸM±kŠíàÃ@[}jLœÖ±RbÔm»l��¤Ÿ6ÙhÑ*ҽܱ‘a…¸M±�Æ ÎùôÂÆ¯ö ÀÕ4.¤žõñçÐ{âax�%{xc+5Uîy¹[ó7Y»§©u10·—µïçy[Xß>œ«‹Jçí\=÷ʼnèpVW)Ò›O5øÆò9*÷T5(ÆmOÍ–€»þt¥&xkå6£f&ABc›QÓÌSxzPs)Ü£m= îBìvœ®ÅÊÓgšCËOZÎ,ŸáEm ‡éîÓÓVš0“«ÝnÒ0«Ho7iÜXñŸ&Ò£œdÃ<"ùªí­Ñi.o^Ñbc�Û,“èb6캽¡ñkfr~ZBãA‰ÒÅr‚v#–óm�A¨/òÃ÷žMfV_vÏ€Öz»<ó7ˆ¸§¹s"`›ãb{:§(�l'g>šþðoÎ"qÒ¶mÎÂHÒíÖœ¥¾›4ƒhIGÝÞÌ�XÖu¾Í�Èy½91S&Où>Z×-öö]ï©ë›ßòopkêö[f�‹'´–|dlË»»2º õaªÌFéè//å#øäoʘl…srsÊË/ùpš{º$³0¡ ·]’!�±PÜæÈÅMÎÓ/cÖ…Û™Rvi/+ä+L4Þ�•ýv@F¥Ü¶ÇéX«ÑcIaijÜ&ÇöÉéenL±.¾õen ˜¬><�‘}ª×ËÊxÿýt0ÞǶqñ‰•e>Œ!jé–­Ž’YÞÝýH¹]‰ï¿fÄûØö FÊ…³ÞÖÃk˜=‡/¥>Ëm4œ#); cÍ ’æé,|CÑ·µ0hXŤ·¥ð!û!�7+aÞN±µÛCøï„"€þØîÁ‡J|á&}O8ȹµÀ……Y0QUî·G°U¥Z߬�ñÚC%jYÏÁâx[3™ŒüîÌ*È:äÈñpÿÛø—Â|ÔÓð—{i0²�~ÜÊeš,§_rLŒO‡ßðŒ9_ƾÇò–Ú~¾d¼òx³ñ¥°SHº-÷^àÃjÈ…i/ó[Ú§W/+ ænÛ¢¡XV“íÌ‹ërÍùÍ�—µß¶sÑ'SÄzûðò÷Ð ïUçç4êø-×]ðSaŒ{1ÆrWãñöØ%Ã;y[ër�ƒ7Ú8ÐfÈ„=�t÷±íŸ ²tÚÌçã QFúEî€ÍXÙ&¹`혷7.í)¼roK\Žqó·n^ú�ÛpYªo¶·@Ì4³]n·ˆ~^ßò8&»m±¶nSÚoK[f67Ë”¶’Ž7úp°%`Wb#™JÌ¿ýj÷ßO›ÚûØr§­,~b}†¬; %Ï¿Ó<ùóGSZÊ�*>I¬¤Û”ö,K{¥�h¼®oSZ@{×ÒÛÙ^´g^@ŸVº†_^´|ŠÄʶ =yÍDo#@™¶§ë»­�ÎòíKƒ¥£VCFúË{öTó©rþ9q÷þ³÷,C%>*ËÃöã›ØÙ�'¯|Ñùí=kt èq´ô³÷,×›šS$=?¼gõò• ñëúöž  -°+îãGZJåYCà¹î¯âœ®œVyùÈåpùæA«!) $,órnýò µ×wúÜ–¾Z�™Š<™O Z´xáJüƒm8Ïæxð¾¬h}à Äýú¶¢õ#‚Éd­�ܾ#i$‡ßa!ûÓŠÖb»Ôù€²úaEë`¾”%–~¶¢¥”m ~¶$Ì—-Cà ®>—-€�ŸV´ñ†¡(u̱GÄö“­ ˆ½sXæüt¢ÕíMÜ>s¿iù¶¨'^8©�?;Òr‘\|Ñò[…´Pxù6¢õJô©GÌŸiõ'#ZAçÂô/j#õÛˆ–¢�¥§…úx3¢µ‡sf*Ëböˈ6àííÛÖUÜ2¥>ýg願æL¥äŸ�hõM½¸‡Tð—-é~kCÖêz;ÞœhM‚73£µÈŠûɉVÓt‡Í-oüÉքäeññ§o#Ú«b.Ð~öŸEØ¢Áò�Å^.¥ôm7;αNÿe7Kcqzó›õ3ýÛe–/¹çÓ\–œã�Aÿá)kFœ *>™OYn• óžQ3L?zÊ^×oa<üi%{‘﵊ñá K�ò,?ûÆ’­?Jû¶‹â‚Ë·K, Û`öËv�F9Ê·), $^¿Ü`£âš6�EãR7²OïW³ÑD|`ð(ü|y¿ŠúCÐÞ¡ýgïWïxrpÆù´~ulUjæ�oýÛú¯E��OÇ×K-­º�^É[È\þ®ü]ÚÓÕ•#ˆZl3WNpDN[W �óͺõ>göΑÇËÃ5jqŽŒ˜V·‡+³´ ·ýÀjâúÙÃÕe¸©zŠ_®Ž =„’ò·™«ÏɪG±Ìþôrµ¨·€¢©ëíåjᱡ.)·—« ø:ÐÀÞùiæÕm'�yM%ßf®QYŽâ!�×mæ•íUÀíz3såNo![§Þ^®Êt €L6ðÛÔ•»$û¶£ô éÛÔ•¹Spáœ;EmSW¥˜ê€Ã’J)UŸ ©8¢”ŒŸ¦®6ªCd¥ºoSWaeÇÈI¥ë6u¥AÉg|3@‚>]]iÔ"¶ƒšªçíêjƒñÈ�‘Wº]]m¨ªüÎ%­Õ7WWùJ Ä)Ø»l{WÖlT@˜æÁGÝö®¬bç²Õ¤Ë?|^ƒÓ”§ )›åóê§Œ9秬&-Ÿ×Ó<1Jž�pyóy¥1�ŠƒÎ“CµJŸ×/&Tø¼žÚtìkŸ>¯4͇á9nŸW¤Øwxñ·Í«ÇAär¼–òfóJ "œ}¹»B’÷¥jˆ�¦sÛ¼‚¥Šõ|Æ#çš ¶¹*�jÝa!‡«Ïv~=õ®$(MÇ4�¹ÖšŽ»5�cïöt~�F‚•ÙHNp;¿ú5Y…LÆíüJC‚—¶àÂÓù• Z Ìæ¤Bf;¿†‚@ 6†Ëù•�‡^Иiļy¿†ÌÛ�ùÒùö}�_¾Bô<#¬1nXˆ¥2ì`-Pn{:ÀÊ:Uú ¡¦ÑoXœ$fCR/,`=®ŠHbIëoV°6 ¸ãÅiù¶‚ r«üÚùbõ˜J߬`½J ì³ÇÈ9Ê©_^°ÁjýÁ–½j6¬ŸdL»°_Õ§¬ûb™PL*bN?<`yt²>(—ovØ›,¬íãŒ0àËú•Ƴ¨‡(ôåKé é#}{ÁÚÍS:œíúÙ Ö^鈆[ûò‚õJœOÎ#ÐÖŸ^°�³åqÍØPýìˈ'+ïü§¬´[ˆU+€on°ìÁ€™™ŒÂöXÝ?¼UïCËSu‘ŽÛWO²OÕ^£`z÷aoÑ_Æ©ûï‡_ê}hÙ¤Îkœ³ÝQz{adºQ/a9Ûo/ÔÁ:sŽÛuq?ŸÞ§|Ælò²< Ⱥ�N‡*?éÍàtþÁ`Û×TXHTgô5EĽ‰§�©Ž‘zVâ>$¯Û½”Úk+ož¥º®óö,åo`@Ûª´‡+èÓ ´ „³|I©Ç’Ûv¤ÖgS{³!m²çmCÊk8“ŒíPOQ†º�†±Ç¸MGÙšzÞ^£-|îa1ꡜngQ>¢Ûå2Å‹@ðÏËPO“ÜoQp}.-ÚTAñ0TÏÛçÒD�TcÍWúö¹4«¯£ÖËÞ’Ü4H�íj‰‘üƒmf)%<•7K4(¨!lëÊð£·Û±²+=Rߌ*9–ÑZJ@B&QG…Þb'÷´¥�¥kÛQö°³Û.”Ý"Zz3Ÿì8¶�|{Nö²WËi’0‰ §Ád§LFœ³ &{‚pYÕX²­úÆÓO |JSÛF²EÕd›G*��RíÃ3’c(Ë*’3\˦qò[PïÓR,+�›¥„Õ©9ä~û@rå, OHèËÀâ·ý£Êt)Ý®�X%0?ÝÙᤸ&aA5µøz;µqÚ›§#©†ê:î'Ê ¸·ƒ#Ëoy7‚�•·üÁq“KÝ6�8ÿ�Ñ}º3¢"äk™2Ö}¶#^HˆO FޱsÛŒ`Y�¶i"Ø`m×Ö‹µ›h;.Öü£ÇgPÄzóWDðŽ2ùöWÜ{®í¯3zâÓVýS¾g»)BžÈ�]rƒÁŽÂØÓD‘c¼:Û;±º˜ŽÛ2‘ëÈA@ºQiЙ–S"Щþâ1 À˜K³Eä—^‹¢ �‰½,v› "§„‚×ÓûðZ›Ùí}¨†W\ö¶/äïý-ÛµÐâ¨bEí“mZ¸«—Û«’<~ O‹BTVÌ8,gB]z¹ ¯ãçéCHµVéŒù;3AUÛÕ³¥Ú╇·Ù:!u/¯l®‘í|3"´ÑÒî ¬ÜF„§&gɆtÞ}ÅÜ%Ä7©ùÑóiDHã¥$Ú¡œæmDH4sÄÈрп�×ì*N«C|}Ã2 ¤AUè>aæÛ€P2(ErÞÔ˜ž„„„AŸc…4ŸÛñY)“ur Û€p¡ÓF ÓB¿òå¢K8\‚!Òn·¡%«Jó™bÔ½ /¸Þ׿žÿà%¸áúVºÿ—h¬òE?Ý©îlJíÓd�¸å\Õ‚/oÁK7Œ¨Y¼Y Ò@ÖìËI�Ó¹£ýÉ@P™Øš½Ù^×bÊ~ºüEJøwLƒ€ê×?áóãçMóQmŸ&�ß‚‡I {>ð˜Ö4s\ΛI |pusÂD’â×§I Yð%uòeÝg&<^ò¹ƒ8–àJn+�F&<-DÇ›7 [£l¬v35¿÷­ôÍ0HìÆŸs–˯/K@{ Rêì\¾…Ÿž€ž×I'©¼›úhÜ!¤ u{›~šZEˆûÕ¹ÊèAþ¬áœÜÑ©;Çm (\•1¤úÞ-­âg‹%Üîm HCJ ¾BœÖno@7VIÔÂ*oÖ€FÀéåHÕS­‚eh»CˆiXÞF€^¾Os®VXËPŽ7ö˜ ¦È«,=u(YP†–r'@�}ç|DÞv;ÚàpJ–Úíèâ¬ZžË› Qüì‚ÖøíHƒ¢P³!é…»œi@ír¢»®7'@sBÞ ,²Ž¾�EÅš§�VQn#@gû!a—¢ëÍÐT‘Ï ºN½ ™@ ³nÀ@ûä@û\ùÍP)ѳòìeÈ;*‡ ïê¸M)]®õ"Sÿ|3Tn¶ û›#>çÛ�’³Ûû/  "?> o&€"T•:Æf9F[¤AðÁPQyyz2E!ƒ§ ’�ŽF<¥ÛP¿U²/ðLévä>ˆv%4oÞÁ²²7ÞÆ"NÆËÖH¹È&‚œ3ðï7qwÁC8[©/½?EDÖðZÏÛù�’µãºÿéüGcÑåà]kËù-q¦æŠ‘ò¢èê5RêëžïToÎúP˜Ò(ÝÎ4 Hc‡•oã?�kÊ0sòÓøOÁnæ�Ù84Ûù/”¼í.„+oç?O§CÊüš®=�ÿNùˆX°eœÓÀ6þCÝ(ŠÄ'(írÿigá×Ì7³œOß?QçµPãº}ÿ¼(í�3OaÛ¦ñ¾"Š,>üþ8—¤‹}¿ýþNõ¤‹VX«sŽ"é;òaov4j¶=ýNü¦¢ÜöôûzŸž~¢‘€¢µ�þìô›#‹ã£?¯¦¨ãˆxÝÚÀ=�þ¤ ùB²/�ñz3ú£GTæv ¯oÚúç0eÂÌðaÃ#_¿Tz•¼_âBoŽÒUÌôsêêééø÷Õöåøgø… Åüõm,ù7Ç?Ÿü€$5Ÿ|_È«/ë?zÅë‹PçÕ~më?Âêb>•ºroÖ~TBÖÙ6~ýhýg/Ç/z_‹tðtþ ; ¦´n•¬üpþ“ÔâÒ{‰šýÑøO‘«!ʰ)Ö7ã?°Ä.:s«‘òqW;^Æê7&5 A!¯ìÓøÏêgT�¦è߯*Á¢®)õlyø9ÍùÐ *@/s¿•!³·�]%ê!_>wÃOö~¯ÆW¿‹|ÞÕ§77¿ßMmüU³(óFë“ñ4ï e»óöì#+b^m[õQÜlåÝ¡�Š�D‰eÌׂT|ûñ��Ñ{³á›Ç,ÌmëbûéÔ–bÎvh#^+=mc6ÐôÒó~lü<âªmÃÆÏ=µjUÔ’¨»=]רÂ@Üfk"Õ¸GM ™¼§µZÓ˼ߎj[k©µ¥¾÷ôOÓSžó,Û´[ëhÙ¥e¹Î7—´rðr›£a�1k™¢ÕÕ½§š*“è-‘.þþ¶�ϪęüfxƱ|½|Δ–lé¶7«z œoöfå Ðív5#.Na¿eU ÑüÓÇLÀaÏ·}òŸ¼8˵Œ;¹çiVƱc¹Š±¦`¼3x«7Y¶~¾Y’m9×íD–UKÛ€Œ?¿êá;ÆÝ84¬ÝXfè…šªà¾¬ ]~3CìB¹“È)–�m%†”Eµ§ƒ˜LíToã°�s¿n¿0 9­¿¹„¥ÚBÛŒ¿ÏÑnO0þžáñ›X¢(~Ô—ºÈµlã¯ê$˜Þü¾´Ë]ǰù¼y„›WˆCÌÛŸF}s÷ª7å5am$"Þ^^d¤Iô=-¼.¥ÒΗsWQhèeØÅ¼ÃèåÓUCr÷öé:×’¹ì¹ å|3åbnl3.è*Ô²·«¢?÷aÂ…8à=¥d(ÄÞ……h+û›ãÈÙú2Ú"Ã_¢ÅPRãÃVk,4o7-ù=ýe£u¬äw÷,r|¹¼L³~3`¾­²€ÉœíÝ!‹â5^ÆX¿0íöÚ  ! — VŽàe»_¥µ2oÓ+Õ¬E¯+€‘­ßWì®j˜‚…³Çùah…o¹}¬@MR1uºÿS‰ãa[@Àžo»*ê¢l·_Õ¡ÂS”·OµÏ°{\FUÏÝePõçþ5ƒh¦MBø§À¶Dg/`Ë7o÷)€ 2$¦S¤r @l¯)”¾Èm‹)…öÊõæ,Å,¤¦iÝšwc¶�÷w÷¨šBx›F¡®¹½¢ͤæó°ˆª5D6w‰ �eÓïËã �ËV¸ ¡ÆyÃaqŒ¹Íž. ‰ÓöxÂÿ%Zog'ji¬zÛÐ 6¼RÛ«( ðOû¦ÁÜë`¹6…™Pº}—úˆêðÓ¤‰l3ñÅ>ÖF�@¶%ÓþûéÄ´�m¦¾V×m¥ÔUí|÷]‚]‘º½�ª¥ší²tÿý0WÚǶ§’~RW¹­”úR|:(A/QÀs'!ª¾f')²ªë ÖqÜ6I]¸æË‰¡�ã3wMG ”·Òȱþn $Pî- q·ó _…p—0¦ç—ó‘‰ñóÍïh,mÕmsdÊv´ÛÞˆLjio¦F&åkÙ^F^B·Øµ.1oÎE[¬v;�È_FEc½„?ú ±(¢^*zBCÝäúmtí]ͧk�: uüì´\¯¾\‚¸~‡>¼�`<+ò“% æS,³÷ùr3÷itŸùÛŸ±1 ËîgX°­·™Ïž:žæ>P*Ro·§Ï8ãA|yñô²ôȲòic)ø6R«½Ä¦‡q�Œ¥Q~öëA}!Ò/›e)á¡~Úóô|ºòtèxWù6ãa–É÷åÁ3B’þï�fu£}[î´c™|:íÜ ƒ�×±ðÕiKNõ˽¤›å ›/;a˜å×—‰tâ­!ÿôÎ)Ê „†Õ—eN¹bôe•#¯ýà�S”7úõ£1ås»ó<ýpÊØ&68eÄ”ö£ûM=cÑû2½¡8_ëmu#0¶ÿŽÃ P vÛØÆ½âêŒ(�K™}á´ç%âÿæ_SR¿lkŠ4œÌ|ºÕ2gÿ~Ì4äüƒIMI!1þô¦)È=üdIäq;Ñ|Fzø+F‘ÿ¿ÍÿK4T5$![§0" Ø€ÑCž»„%�½”z¨Ã]ç©V?î†Èöå¨ëË ˜=T¬±Ç¨�d­fîôôzSØÂóÏQôB„¨ Cd‘pã›1’«h[x)X;áüÅä<ÃØšæØfS×®ðÄš{«¶�ÃLp>#•cl€P;ƒ:Âûµ5z�VLO°VÌ x‘'Öã_™` øPÅLk÷(:¸ f „zZsxÅ£†W¢{}…q>ÀNà\pzï jgØçm)¦$9|³ŽŒ×¬«:õiCœÔ%:51LãvÿRñ²_d[±|œóã\i;¢W�� Ï B Æ’e.YÍÍôªhõ" �7�â¢ÑJÝš3gW�5…è’®IÀ�E8@{]ÑÚæì1êx}O­6{©šf¯J¼ÕæÖ‹( r¶%Æ3@#^ »v¾©hùu.4×Ia²Úƒò=׊fÈ]£ÉÏs.RÞtDú fMžCØe® U‹HRbÝäG耑TGù§Škž#mZ+�½™¿­¦SPßÜ2ÄÉ’VÈññNz j¡×H�Ê8Yl°ò‰¬ŸvkШZQs¥‡hCQjà:S``å°n&ô™sK"厒3V@¾€Hyæ¯g£_ �i𻥰õ}M [ “öÈ^¼².(å¶ðR¤994¯u¼Äñà =!Õ¸O+j©bØÜâ´•Â=:7lãýâ¦aõœ{H AŒÂ³ ¼.úÜ®Õó�–ø‚ÆŽ”u‹µËJìR£WcQÊbð¾ëœï„Õ§è°Ž{¹ðjsª™óÕþ¦3¾©m]'ËóJÑ€žû½£ùHgø Ï}nŒRX4‹qèùØN²ÿ¼)µ¯ZÆËèMaŸt„A•›P¯)Z1‹°ŸÛ*¤Bg 1ŒUPbÌ“£û²&´//P¼lŠÅn_ä¾çþè’ÃŒMà YäS- ”¹`¾èQ’ト·Û#œEÓüAuõ8½y¦û›L+Z²­¶©�3txai™«9n®\'H„‚©,«=à:Ðã€ÙvsÐô�硌6ïE¸”÷-®³¡˜„S’MsçÛœ9HžÌ>£é®4€üºÊϳsÛAmƒô@xeœÍa>š¡¬Î ™ù¿ *FÐÒVØ_Q%zp�œXÀ#´†€¤‰™·;ì™9omŠT=Pk0¨³ø;eý|;» OƒdȪÐAr ÇAsêhh Ó|¾Ü-Ór½N�â½(VÐ ½Xâ †)Þ“çɸ_Îúã&5¨˜OùõWY=¼w›àeÓ<£õ¿V]Ïùf#¢§MsE §Ê=ÁŸ˜È\çr€/¹çÃVæò¦Ê‰‹h§,E8evŠG´3n˜Oü % Èy³*r!Rqž�ªgËy]“ÖÏuNÄ, } 5zv"È^þôóûR ÃXßò ýŠ·¶,oýŽÔ)ëîNÅg ªñì�ðeœâÀ9´jpµ¾ˆ·\x÷w}ÑÉ ¯î5=�rEŸÌ3.øt~9 iDä¦è1x�ÂLLÑ!ô¤Ö7•PT+UÙ_:\£yéÒ©×4»¯ƒ'�‚m�q^±¶l—~ܪF#f¬ r�,©õ@º®Ç”uÓÐ ¼ô°·qŒøxéŽK{E>»á£/’:¬tO8(Û?á 6C!Ï‘¢—ËÉœ@Ïx/® ªó¦ÂU¥G�ã†Q¥‹Žã§�XpÜçWø€r‰›K­ÜâüQA²-ƒù¨•Þ§_ú†š£åãÂþq�^Á¥h}+<È Ï«TÑíãA~Ø s{ÜÈ*ŠÇ2|HÄš·©}&Ô“pvÝõs]ý…Óêåd8¨ZW81^} äm!`b}j%°e‚Áõ>•ïˆü4Ë_m,éùþ!®(ôBMa.{sûrÐ+ŸdŒíÁîÂi„k�¹q·Ì½ŒÂkéÈ,ÛanÙ*ê–>¦“ØóÙIp5�àòÏN��“_ÄK§£ÇÀd~ž†Ê3=d�0‘¼öJˆHXóËJ�wÄ !Âw¦�k¨PÈ\yy*ÏåZ©v\ÚÆœK+œkÏâѱa5â ©‡Èx%|<×jÌ׃`äF ̼ÁæìÒ<И˲Qe…Þoä’¼¯È„Žˆ; z‰;CÊ£¶e^¿wüÚ²<{�S´‰6¢÷·’›R3Ž8Y1gŒ'9]kAœ=rH;Âý€0”±u¸èÕY›f¯¹ºž«‘=\x¾PÓ ²‡5®AC"r(ÿûKæÓ¢‡Ô€ÙC\ýÿ.ýÓÁYœ> ›ºÂ\Ò—üX»Ü6/;Å‹SÝ5ç�KEoþ­†~tÏÎWçµjùll¯éHsú°ÍšÍ‰+Ql;u¸ãh Ý}ç»Ç˜™�°3™a*`BžÕ �ÕóShþ­ __B¨¤² ½NË”ó`ª¡Œ·¥‘”8b¶7¦Sã�‡A~4Œ@w )¶„Œè¶c~³�¤ºÓ²ÌoFœ ,\”s'Ûón…@åVe.ƒùa�Züžº%ä´Œs½xã°Q=t��ÞJ¼ásTe/“H¬tôP`‰Éf†L6×¹µ‚¿/(>?†ã·,­wì9«÷²­-ëÒÅ™[D'ƒÓšá’{†õ.ç&Ÿ§µ—aÙ�ÉV®OöPfTÂ�t0GÍ©¦ #V1ÂAÞéÌNqƒ™áͰûœ�V#u”Ùjbþyv$¬¿dHâ˜×Ëjäï/'©vÅ:ˆ¯nYSèÈÃ#‚AÓ ‹þe5Š~ž7­©�I¯AöaP$§vO ‘ḉ¬µô @#ð¹ÝKP~Æð/æRÓ^;g¤óé…Êxô":m(Xçø&5Zè¡O9 ¸ŒaLçK=È«±õ½TÏ×Ú&©€Ÿ¶†"ú^ÈWWƒ½®Çî—;Û"ùü¦’¢$r±vΟ4Ê{_Í1ë…òdÿîét­a/èç•ÎCež¹ ÐCý²Ü=ê„–šCXºñÔ³d(qèpn9E­Ý96Œrål¸t¶ùWÖ&ô H–@8|ÿúŠÔÓ�|=¬‡ù“šzï™BŸ©sùëÞ1ÕËà2X; ïÙ)ùpÛ<çΠ3òc�s¸aH@k|Ñ_tme�·µFð"-—uõ`wfîê~ÓCd>CÀЧ™v}ôhTs¹»ŠÍˆª®§Äçp!¼”ò&í|2sÚ >M¤¹ŽîRMe$öÊéµüÔc„ƒØœ´ •��ºS†—ùú(REªó5®[Å”‰»§9ðãL`¥xrÊdωáH²ÕrèÇ2óö-IDBCAÈ„ÂÙ|/|T6ñíB„?G=Yr´¯:„C)æuþ-.¦ð q ۨ˶�è SÂp©S´Ï†‹DêlÈz(·%LÅ')@1|ÝÍÇ†ÏøócÌð"/S]ãYVJøq“Úf]8 xŒ *Ž.ŒxÖ{#)ÂW2»]x$‘ÔUo^z ÛJŠõQÿ`;¬ç‡µqè€Y™´öÐgö€‰k�憊ÒÓæPÑ+îâPíÃ^±OMÑYø¾c5àUD©)ô¶ Ò Ó½Ä5®íÀ@³|Ý©¾g”(Þ(ÄP€HÐh©�˜ê‡ž4�œdï5´ V>$£*¸:¦wòÊK3“tj0;ÏáÅ17�‚yA¬TAHKˆ<Ü&paÆ6ó†N…8N-ðKI’S÷9òèóåï[èø¤L5RVÕ/¢Æïübżºô×¶ø=œ�é²Ä)ðïTÂúŒ5“ ‘Ù ‰ÎíL#T”u‹œ9³ÛÀÍ'3çš2ef76Lü¤ :òfwD9;äÄ�É N“Ù�=úö9˜òbÛvÃl rœ¢–¤t¡ŽJY•)@Ád¾ˆ<_¤>hž;‹vîg9W\ˆÜ•v_mí«+¹äêËFI”µº!)VêCB‹‘¥ŽáRÈÁ$‡aÞê¼æ .gi|k+•c+Õ^«ÕˆÕŠ`î¡Á{;µ«)›Û]ùàw�@ø¡#£ Š÷‡ó�†#ï9iRýB$ŸmhžÖiØOÕ–/V[é­¹O`:Šo ¾Ï�WÌàá1%t÷§ý<�%­+ÌØ¢x‘¡ Ýò#ä¾ó)@J©?Žƒt�¢à$I—²Œ�\ æ|ÜÎ}ž´Î£­ ‘mÒï )6Òã)¤Ç·8½ºüÇ92Îséœó°xIábæ²Aü‰�JH˜GuMS¦Ë±;óÏÛ~ ™±Q—+!9aÆ Wd—aº6χnìä)_-£¸„CŒ^¢Â&½Ý2MƒXÆ$*ãÔ$»Î“ÜÌNdr] xçôõœôú²«R…²Ÿœki\5c±¼9ÃMø4º(ÍFÕÀŽôð5›G�¹'s«Z¯¥b3žv`Ä¿³Å”3PÄ sÖU¡d¿éH‹lÖ.Ù 9}g=…¼B—*�Çâ`­÷ù[8H+‚Ê:Ű_ª¦¤ûŒ¨åž*$$s°GÖxì«ÇŒ öa–6÷úê5VñSˆC܈¨e£»�b×™F faGI¸2ü?ÚcF\i ¬•«ü:ÉÊÀcu­-~¯¾º¬£ã§r0Öù?«Ž¿ÜfבpÑò*‘˜0­�*Ÿi=*°å‡y éïkyYÔ›‚²­hqràJÆbÚà€Å¶Ó[PÂÁ È¥6•uŒM\wš‘c:÷² ®‡Bc16FHOƒÚ$hrÜ92X‘t˜Á� ¢ Cp;DV&6¯û¬¹ëÀÔb‡«)£=ϧі!@unõd÷£„æÂF8MlXÍWÆÅÛ7çœ ¿Ò´¦….P Öúã A7N¥MgßJ( ô®ïÔшåd†Ä¸®šÂCzmê2̽×êp“E ËÚO†‡~.KF&‡ŒŒ„£š^ºÆ.¬97adò²ñ› ¨xçÚò¢ÁìB l—¦Us/}a±nR÷0û 9iaÍõ+$õ°S²¿(åÍJ7`ÆV7äIjØ Àú¢R‚|€ßˆS°’�+ßvJ?0es�;êE„· /sýI[YJêz웾{@-5kFe¿<ß½@À1Z@ÛŒ(S¨Å$æ\ý@§$Ä"ùÈïe;wR4!úZ9ýŒ@Ö¯Á”)iž ƒ`û{�\žc €E0†�8‹ÔKÓ…z9 ±šX§#heï…ÄÉîËǸòap—9‡Û+Hª›>^–¥%;«×Y62¤§æyYØÿ¢ÑÕN®1y•TüÐÛÀ¿&­#Æ X¢ ·,Úõ°1Ÿ~™›X?=·¿]¿œ¹sÈMr|nYÜów�o÷ùU±ÀJ LÆ�çרiö¨ày½¼¸jÖC�§3¾ø`ÆÎdv)œ«# ¥dÙ¡ÁÉý¥\<7÷šF3#¢n $í�ƒì¢3wÖà3<±Ô9‘R á3,î?¦5ÝOG¬šHá"�TÌÈ7Ïï<“¡}N§õó¦ã€Îx¨´r¤šâ—xó—œe›§ãM^fö*¤!ã~"½ÂR…åfi³:&v .ʈù€dÕ£~Iö`ÜãóØçoáÍKvýññx"Šmž4PĶA€ã¼2éùÎ�ε ”É7;Ñ”ùû�jÎÍb(}CV.dEݧe¿0À13T€¥ë‘V]yžø‚âOH"$e�K!ßÃkÈ0"7‡qÅ�-é-ïC�fÀh859ŸH=R ô1w¸ ÄÚú¾gÇo«ŽÎ½Fô*l]è!NŽ™¬øÂPx9£AüåƱ«ìÅO9Æ®MÛ‹˜´H÷äš>½êÐäˆÇì ÖÐ|xrʹ®nÃ^ý“lýƒ‡!×›Nòq¨¤¯­ÐÏ‚­�k¢èk¢~„ÈaÁâ‡Î<`Ê3ŒHõ…uqÆ.3.l@?Ѳ7C‚S(Ô®äàSbÆ& =�:A‰üÅ¢-ò3Žöè׆¢ä€ïÍFõ&ZJU:ùa-ÖH ‹–åÃáNÕL[ô8£á…�ï!Á)sdgb"ûñÃgƒ2N�<œç±G‰³5Ásq©[R×Ü9çû±ñ-m½1ˆ['Óy¼ ðã¼îÊ%Ö‹Ó�`/*ÿ%«©®Ð»�Í/ëåaYrÄs�Dé1�Η±Ôæ±fÊ4Ôú02Ò<DZݽA“a²ˆ?Je É•fˆÍ�kGCA Ê�=Ø�ÍM:ÄQkdg �¡Y®í…E§„ÔÒì„­½ ¸yñhƒÅiHGÐ#��û¥æb;Ó_Ј�Y!ƒµCH ø tR ÊWy&ØIa–,²iä*�k–îfØ‚ˆi9náÐha…f”¯�Òúlx‚ÖB)o-p5s¹†Cf¹»g1uLYžro_Àm×À²8nËÈâŸDÝuÜôK15øÀ;nËêÕ%ÕØT‚Xºhµ¬O{`¨JÄ”£*�–nj È,™Ãðý2ž¡«I¯^㛊Ƹg{÷׿©‰/% Â",ŸX¾Ë+iÌ"‡`40DîQq'‰;;ÖtZ@�ëtà4UÊìñ “ ¢µŸN%÷ËÓ! öa¤åÑ7ß½¬þ#° ŒÁ&Z±ëêÇ%ÉɈBG³g ù„þV‰¥‰2wwuO¸'>&\Œ¯™À5ÂÈö2�IMj Û´—ô¿ ¬N40OñÐÙÔðÐo€Öy„lço׺Ñ\=½ÕÍw2-EU@‰¯ª+mMh7 ˆóL;Òú�’ŸXÑ V*3Ó1;;ÌøÂeEVŠý<µÅ&‰^Äš|X„4Tñ¹m¯ 7{ Hir$^vE¢¢ñµâ”¾½3Üų¸ÌÍI«ÆLämœ 0n‹¨™ŒK#úœîá€ó~;ì“Ñ™1׬St…]cŸ?â™qVó<¼¬¢’çè"ÖÔI2Ö©H cNبù‹j•ÿ/"™ú7›¹óÚ?löá Óêu×�QžæB'£Q+²ûÚ°~Ì,ª=ÆUWÌ6ÇYÞó†F1sâã»W56F�‘å“ëØ;{ŒâÊMâ¾8æð¬hªÌ[5g¸ñËœ]“Ú‚ ¥z†äò|?È³Ò Ecëðð’¸áº¤±>ºo&B(B´™�è‘B"^‹d†£Ôƒ¶¨KJ‹Ô 3œù‡ ò=†ã HÒ|’TyÙØÏ_\U­aå•D–k¡œ’uî]’wùÔ•�õ Â«ŠŸÔˈˆ#n¥§5©}±Åi2[æïèq^ ÜþnNçdá!8¦Œ¿1×ô"Ú —^PiÙhó¦òøâÊ#'tÊR@€‘â rÂNsîÓ�´zĘËÙV©ªËð�ïÑþ0�!%ZÊÑd•µ[% ‘M¼§0GùApÁС yÄT`¤H—çºe»íl ZAQ¤se·)³I)b°Íö„"%»f²Mk³ù0‡iÒ¡Ibtb÷ØR‡ç™¤Ëj%±ÙéªÑDÂHÙ%¼E œ± `Ž‘Z$wv²Z!r·çYʰꤡf$£.H-€¡DjÍe|~DÕøxôÈÞ»&\.ÑÃò==æâ@Jj{Û&—4yšêÛ‡ŽžÓÆ?Ž)=³FôÀÕÓÀ’ý*lËþr*ôNšXšØ™ÛªÖ´²¥«ÏØœ)Ê…¼¸³+±JH“Õ4_AÄr -v‚cK7ˆ�¦Æÿ¥ô�,a�#&í†uÃ^\¨>_m�Ï%Ö3+5Í ù9êf]É–¨êènEƒz0¿Rvêg·¢(ùdAÈ<òzñѲÓÖ—t<´²9qŽsq,tïCâ¨ͶHf'‡¾™–)ˆ€ø•üBÑÒ(6Ð�rg¢Š~g DY äÄȈi®ä UÊÙ¸Íd&/ô­�Ü$[œª¦Åê%ànD¾66>�íòœ>Ï#x]p1Š!:&ž{ÃÅ0ˆ#ÁŒû™šˆt ØÃaƒ¿(£VÓ�}\ð DQ‚õì9f%Æ|öˆ|AŽ=:`ÙöS/"eræÞ%�@ê’©’Š+°â³N$`$”mûÕI™†CÔ"´DünÞ*6ÔDÅ!zÀêçp̢̲ðDcôï1êr`)¿?žÂT6DŽ·¢„±Ö ™dÁ~öˆ(3œ1ûÖ½P½¼áêsóQBê›9oÄY<ÿÔ\ÞTàçÕ ªÒ…tü>ÿˆE‘}‡Ð@z]Fæ.2NÓ´ÏYTÆËÏ)î|T±cùÅêÚ ¬-¨W›©|M“Ô3ûH|üæà‚b^ctƨ³§Dz4ŸÙ1¹V¸Bg]=Rô¸ $£,F&‰=qpÚ@ÈiÇÂ:ºëCvöèYóbövЇ…�*‚. Ì'iã…H·K*±õ9nYº>Šš¢v`Ÿc‡w4Ës<ÈHêªa€¡6H¢² éhÌq¬æ ¿_ ‰C‘Ín¡/½ Óy9g "IàÕ FÀÓ-è’Z½…ûµxZàÔJ ‚as!uß"s ‘¢›aö›Â¾¢�E‡5/…u›KÙä48é¢ë€šb†+ØåÌÁ„�ôÎT5‚`–l‡9Œ±V3�i×}G¡�7À\ Pÿ7äŒô-�.ÝhxÂA§J•!”wá8›—B‡bǼ¾ÔŸÕ`Ù×}Dv‹^‚ñk¾ãìUL|pÈÅ|“釈ÂaHÌñã 8B|‰†_pæ ƒö%»«Q�_½j€ÒdZÉWoú]VÐçþ§Ç7k¥5{¤Ÿ v žxù%ÐpQoe�åÐkM»§ú s£›E *ƒ&ö¬Í4^5¼´z8»Y}êK´$ɲ ¯Šœöò,�ÜŒ#i*‰SÞz�Qé?‚‡ O•°Ô¢@zÂX¿ý‡¼-Nÿ‡Yw{ÕïÏa«Ž�—œ¾ƒüfô@Ç_æûý”*[Á@ÔíãE› 6î KcЏ®`R:�A£Ã¹Üœ›}«ú¼ÿp’”f�9™ï¿ F¤=®0ÓëðÜÈ öÄ\‘ñGt�ÐØ ž"¾Øû|¯³|0‚Âë ð±„Öì÷»/J˜#�ëm° ´F’bôœWñƒã:žå­G,´DoÐ[Ž�\?�çê«¢Aè‚?�†ŽüæjÈ€nmAë�¼lë1XšÉ~•py—S�í—ldzàœ�Žô$PÃÇ¡w‚Û6{¨E·vjÄ÷WD¢‡µá?8/-LéEº³HÌ€L·ÀÇ2¨f�–®8È…0^βΑìna}µtRŸ—P‡5Šû£øÜ¥5Ô€¼k»=¬Ü}7`m²K¸›ô» ÷Ñë í%)ŒÒk§ /V®…ËB¾xÆÚ&ÞÑÒלBup–7 cë,krcI$™éªßSëfí¥…°„2È V"@��~£r(.l#”›#?cF1,ݨ€dš›}Ï£ÝòÆi¢¡BzïÊæ;JP‡f�S¨ç(/�Lyߤå•à2Z = "Àsƒ³h±St•,¸Hµ_<ö>p±aA„§¥&eý’¨¼ä0C-(‚éÑÃþ…]Žà±*=ÁKÌÀ5g1\„¡ûûQ Œ*å�åEΓTÇ õ•ȸ׮n̆–P¢%Q¢7ƒ�pŸÁ°,’mó)±„¶Àò¹'jôâÃ!Èœ(*ç °ËBfP¶°à3ïnP/Å1¦À1î$'É }HÖœ}ckdqˆ¦fC‰ÃH±p�­­‹WÞ‰D‡–2pýÄëJàÝ?ã@‚Yy¡KóˆrÄÎFO‰‘MòsDýçÿ1�ð‡•wPéî[.ÄŸÁ¿ö)]¸ƒA8wÚcN øD(Op o¡i¸ß^Íá0_.ýà—(œzq[îø­<¥áÄæ$JÅs@ èDNS‹Ba¡ål¯ChÖRimiY ͤ¥H’k¡Èü)G\£ãÈ‚|š¶Ï㻦Ú€Ö§O–b(”¢'δ®s¾ƃPß`9ð ÁbðnøNÎæºÈ!.“ÊS­@ÜœˆµQðsg°GçÆß­í!,í«ŽÔÒª6Íù€8'iìA•I]²&ÊÈ�ÊD(îÊ}€7wihùñ÷2€5f7ºÖ†G±dÇG»À&~Jìž|D(qÎìsµöÓRÇú"É™³nÝ´/èþœÐZüWYäcÐÒ£«Çý6ç%¸2G°QŠ‚è!¦8§©'Šk…™¥ùÎ%²? ©¨Í2_®šóz93¶º]j꜕„@�«\WÀ#t'©Eo­nš 5Ž<-ÙJëÙãßð˜ï^c…×s¯•–þ—�SPŸ!^;ÖοÀ_Y[DlBËS" wû›t4CdË0/¨€Ngä±)SR˜sÉÁx¾ŠÇ<ÖzLùÀ v,2æ¯}¯pWPÝ­.쮳ðœ? TÉUW©qѤ 9á@TPJQat<)~3ê kè ¢ÔA µ¬3ÔÙ°]–·–k-u¥£Æ¢% ´UŠÓ‚ÐBë,^u `Ù|ƒÆù�‹9ØdYÂ"ôÆ£Ä+¿û ÙWTB$]S[ p€»Õ¹ë0Ùôú��Rï·X³—U@ceWÓ´Í�9û×׋Ã,ïZ_`"V˜F9è7P‡Ž¨E¯ä•p™ÏŠgøábq†wæqÙ#z¬Ñ J¦Þß#—mÞ$D,ã;‚°@DužK1ž9jÐJ"ÅüÐb_VÕ‘NÁp²äK…ÓŸ‘øn…¥±D¾ªìÇб€�ƒâ! ³ib«B0ÜT\o|s2{ÕWêû¾Ö,ŸF/jUH³t©y ÷Y,§è —^’JT8†ôõM"蓸¶j½Ø`Ðë±`Ä¡èu­+fTsÅ*�—#`g¥™Ô"öT–�ÕAˆæ¾³m}§¢{¼ ŒA$%_~Eæ»)v “[>&0Xη¡àâòw\kI(?,Û$¦:N^âgH´š?Ü#‰i…N% L'‡p/Ôñ×�ðX®£.Õ–æªßïK?âÐÉrÆÊN lù¤¢“ÛB,é” hÖº²j(d•EܳÖÜXw{t09;l(¦DÖðF-á¬öM í›0B]I!´’Òð1u„Èbš¡¦$…°4#ŠlÕЖªÛ¾“ìl–Èš’29t#Ù4ð …Áù EÜÌ¡ötʯê%H¶U(Dªcå‘^(�lH*^pÃJƒa�i�Œ¯®Ú…ä…*Ý‹ZYívŠ€ä�ÈèÂML\qÅ]KPÉbËqü߬½Û®.Éu¥÷|‡uc@m ¶2Ι—RYnË®n ‚Ý-Á0 ´Xê¦!²вÐoïøÆ˜3þUkím€‚ÕŽŒ•"#fÌ9A˜žQKjÛo<• �?‰ë¯òmÚÞšXºGäðƒU™šdé~úN~]rpQb?¬Muž¿€æËu¢ÝcÖÄIw¨+7f^1<àG‰óK])HvJ€Þ& ï^û*B�»Z½ÌÔÈü|ñΜ/(løÞÛ?'â,÷03¢kÓöbÇ@¾D“�‡?"2®M›€¸§Kw=ÍúÑPC¬•_\a…d<ׇÞ£á/qáý¡A»ù|ž'¦N …Ó"ã�´?á.J0_¡ Ì/"ÔèòïÈjÃ:qjø¢ý-Dû[¤ýEDDMQo¡»^ÞY Ë›¡X¢$�X|L+„¤L"9饹o Lõ’#Ÿ àwEþmM�F<9õà  G1£EЉØG­V~î—® „L•DÔKúm½„‚á‡Ü3ųB{a›é_’¨5¹o³�ž‘DƒSð0§Ž¡nÀÈ�vjŒ)[péËð'JW�™~ÒC«Ÿ$ŸLî{J-‰?ò!Ó„”:@'k¹‚¤"¤?iï^ƒo#™^ɉ8}AœBú¢]å|:®R¼ fY=­ó+È4Âgò&ä¾€¹Ãr–Òà™ÿR)áÝC"œy~Pù"½¼‚"²ŒwWÑH÷YÙ¦ÓÃ$��ðâO¯iÁpí³0žêa^e ¯!³÷.D—$Q„Ù˾3UÍuï>‹0dw #Aq9ßú`Ö³|.-‚¯—Þ³W7êìŠçkÁñ0øìa½ÿ¼‡Ìi`v³’5æNÞ�[†Ž4`BDILù9^·ó`ˆµé~ÈÈêedõ�É =ø~�ŵa:–DtN·Ø¸Æ–‚ù#Ëo=§$[ªµÕ|‰û+y\zºDqÖŒ{%Ñ�*•ê³|-†^‰÷5\{û6ëXœþ¹ä «ºš'ËzÎ`ìn—“o‰ôÂG™5(Q%(Qìp KsSÖù�ý© m|©fñ\N`ï_º½´HÀ6ÆkÕ�Pv0(0¨È^Ã!° ÇöÆ‚NiòÅ z†»Wéw`M#íí F$F@Ú0 —£e(×Pg@@ŸÌá§!pz‚±Å%Ÿq("òfØ…à3@rÈ^è—Å�»�×ñŸú]ì=ÎÉä’£Ôè$õº¼Q×¾|Œ@^×0ßá1tê~ˆ±]ÔƒD¤i� l]»%ÙU`0ÈIú­ÜFZuv:w‹x²hO5ä%kÅX'Ï#b䎬,U»Êé¡/—ÄÁÎ`9ù©‡aÛ’êùÊŸƒqÆ”�ò.ËL³½ÒOq�Ø{WèMûY‹åj—¯I¬½4uZÃãÐDSAƒ$°UD3Gâ–)«$£½Áš²°„* DÇžò«\ËžeÇi)9Æ�4—Ä@´ÚY7V!Þba Î2Ñ@øÝyí ÷VI‘6 o„šÏ4k÷iÛYåòÝAìVR'ïZÀÂÄ‹ÅJ‡VQ;ÐäRö³†É1�ñC—žÊt²w`=’xB†GLŸ±¤ûú“<þxÆŽÆÁeÜ™ó{H©ZÔ|1¹Mmúh�w™Exi…Š·Ò £4\êÑ{»×eÐ##u õ¤0=ËÌ%Ý—‹|ÿP·š/‚ªc³-]zTiR*£9WE–Z3½X˜ÐIÔƒØ÷~åæXXa8µb4ã衤�vµ„ÿÈ×Ü|šŠ@›wábKéÏy¥8ko¬ à)³¨‡˜äejòô(üR‰ziq(Æi ž¼}·nYà•ŠJ‚>7)ö FÞ�—%ý§¸Ê"£‚4ÏøÔ«ºT*ç9C‡tñlY]ÛòÝTÜ }KÕòâNö¬”Ï=<‹Ežç$)¸~:O‹d~W�Ø_v]ú²÷¤v¯¯õÀÈIWB°œ�?özF@lw˜E*ʉ¯V×J(³ºÒíó,&´~S�=”dPu¬†¿-™ÜÃVµ�+ ãtʧn :óhYn{M`á�û®È'ä!ŸÀxÕ8ÐXgÞ»s>cší™ŠG½¼"6×}”¨9ÖUØ+¸'bЀMwvÆyáˉ´Ã=¹ÑLi�`ç"ºœÎ€�šYBÔA±k5ÒÞ ®Å#£úHôÊ•|–"ÞEðx ~RÓlEÊž²Ò1د-�7ŽÞUîì`gbŸë´´áL”ÑM 9p(_u¤*ø|[‹� ½ ™Ô¡ã‰3KSB6Œ›¤z¾¬™Be*£=HŠ#HŠ‘ú£™4zQ’°”DUö|�ØaÎ×cb‘ÒHêP̈lú¸ÈX/q~õõP£P>Wˆi?r.‡Z´É™¥äÆÑíQ”Àèq6NÌBtÓFÌ»aÝç]˜~ÿ„üfnÅÓï žµ k ËäFj*ú—&9ô°š¸¨Þ�GîŠmÆù¥sÔ•Ø›êU$DAÆ»ZÇÇ©²=p®âtã³޳¤‰÷pP]ý¥z‡L °´wb)¿£â-Š©b R°å`,èƒßÂã-Å-*ÿ^•Ɇ2?­éFwzâØ…qìžÖFË”@ ô!ÑÛC×çÎ ½èÍ»…MPÀëðkðŠ(´Añ&01²(šG0è™=4i"§—Ïã7B‚ä¶À�0/ .ùôEúëÕ=óU%jÜÀ5gn”‚`«úˆ+ÞŠ‡r)ض^�[xb�U=1í3eÓÄ ûÞO½Jð°Ñi!Y" Óý¿ †üHôUp ¡Ý#yœÚ¼!"wÏטX% y§òN·•9böx“z‰ÍÀNý€’ÚEúõê¡úH‡ —ÑCKÄTÙ׫djwî+)0⪧�jj�ˆ=ŠN¤‚€HFc|ˆ5L$:3mÉÄè ¬+%ŽeÉ*YŸt,8¤Ó½NÃÄtž "e�Ä8—™~"žÀ,1†T]BÌž2aî»j/$"â%Q·Q7ûrFå¬ó#ðÚm™ZäqŒ:)z(½ Lõ¡Ç�µ”F�N2æÓy®šø0+öslɯ6ûÔ£ÞÆy�¢íIÅýÜkZ‡±n(gFU}iÿ)[26±Öù|û£ÉÐ?eV±¹ÉŠÂÂú.ÙÊÆ£ûC¬½SŠ�#(Ù½ƒ�a´³ø±ë*"à£ÀgVÅ-"—Åöà2îµÃžCœ£4�ã9`”Ú£r¼WUÝU¿¸k¹UUØ_¬eCïÐj,Ã5 ˆ€sØ¿Û9dcqêBu:8Ç‚«&t££Núð—L!Óé]íâd/ p·³µ“ò#[¾µt¨IKpŒ$¡y}õô ŽÝã²mö‡«t!Šž �Àë`ЯÏûÝ}L"¯K&åŵ¬½Ù‚¾!¤–DUæDÛÚúÕ ƒd5#ñL‚ ‚êEç~!€ve”Kœž6õbºQS`¯Š»+‘×Q·Þ; G’zÊû{ø¤2X%É�ŠuôÄS¬~Š%}hä8‚S÷[Ôr¶€²G‘ ò² ²F”Ρ烢Sêé� Tó »¼i+±§—o ÄíŸËÈxK«9=âìxÝåm ä]}¥“±G `—¯<ŽÛ4à©ï�Ÿ{ D€£›NìÈŒ0t„°�v-²èŽ*Ší²(«=r0ÄZVJ~’Ó'ýãi¸óìpSû¯g]þkÕM0 Öp¡6ÆH6ŒÇò²‹5wö ’_åÑãŽ=©|¹›Œ5(êY0ÚÄŸÚeõ+Yp@©J\oŸ'ŠÐuÀC2²h*�hÇ�$¹“58fhQ �¯„ÄÈXìžž«‡}5`”µn±}x—SÏš–¥]¿Ù£™†ËŠ …È:HW>Ð'ô2Sò¶3ó¾È»j< &I¶²y‡Ô°´I³çü&¨ôšrÆ#ó+Ú°t¹cß—¤. ‰�v;ö ±J�0N– <“ÞG³0Š(Ù÷þHº‡½"M2�‡7u�RG_R´‹�à*¯„Íù]L§A_6àµS`t( %pV �“r·¸×DÃ7ìµ AÓ „ꤣSÛf£‘Kº«}K–g}ñaÖ’>À—qNc8e.Ä9ó¡E½¥¸®ÐAëœW¶ƒ±Êm6’óU«‰'z`¨J&cò ;—ÐÆ^ZùöÔsŒÒoˆ‹Lpte¼"½&>ñÏn³Â{Ç�£¶½ÎehßXZVL�]“–öŒ—µÂ„‡šÑKP⮚`P-›¼ï¶+¢á`úµ¢ƒØÃ°R5çUWfss¾ã®ÞD[¬’ºàjÈ–+Rþ?55ì�–SqêIk5‰Ua =ôáË:~I –² biV We³ÎÚûW|ɪKÎ9†ÿ�È ’çòxÖw“$Ë?�W»O¹D ¨xá]û|±!†òHS*Ñ,øÚ4['›ÆÖß_ÆùÞ‹m†"ð8ÒSlиâmÑs]?)ˆpTÂè!´¥$š4¿“ |ù™£X¥¨— ‹$�¸¿%¦!_Ÿäö€¶ –ûØ´{÷�º£ŒÌF˜'Š_UO½ÔŽ ò¾� ÷èÕ_7u‘^!â›VÂOŒðm>'(pºk��¶�Rî¬KÔÊ´æe�Ê{ ±oŠ”Y Ö0À“¬Æ¾•á°Eó¸ÓZÜ,ólØê‘l`TH~¼J¡ÌŠÝl"Æ’:¨Î#"ù¬R›³¤w—%És‹à`ö›•ªùb…h†i×ÃL®^<½†LÑ_:�Ì7w�ÑÚ ÆR_×´¿‚ Å»GÂCÕ•b2ª©JÞ÷êöó)Ê# PŠûÚlkžBY#2)ß<ÝBõÑŒ8yøÎq²ßd;Ù¦—÷>¾'jHžmS@fBo7ô9�æl`oÓ>M,jSˆìw2ãNR¸F ©nR›f�­¬§í³>木;¡h1-ðÌ„ð[œºÇª&â~—{tºÏ±r´ØCOB�½ä·¶¯GlÙÝC ±)èµQ¨q'R€ÙíÓòË MTŸ4R‘é�ÌÚÅ^ª—"¦ýNªãrM+Ï%ïp ç¨BT‡¤Ÿà+nYP§»ý8dº;Á!G˜öeÊ“ ÎËv"ÙÓK¬òbÍ^�¹LO¹f(­Êe£¤‹ŠªFêE’^3lA~â^bZÿP�Ëáêr®F(·fJôBÙx_äÒ‡–o…|bú·,;Ÿâ?.>Êu úªÑ<ó g4¾bù/Ø¢L¡û^Âˮɓi¨Êš—Í¿dóšÅ\ n´#lvÅFðqr Z…ͱ )Ê�kZ$sœ¸M¢�°7ôû”Õ¦—°˜âkÚôÁ.ŠârØól ¶B—Õ¦xJÙxG bÂâ9£Ð Z(8ŸçŽm‰bêNüéóG!à&Þ(NkZ`)šsOó�.EäŠÕ%�Yïq~¼¦ŽO„ÄývH¼$@· H¨º¤ ÈLËiò£"S4zÇóvŠSÎw Ù÷´'1TQ‡.¸\a~’»*Ø/K’KöP û´’ÎÃî {‚}¥sZ@îéõ„j‚ö 잤Ú"«”Þl•ÒrÖ½»Ã­A¡>ùÔkS/PhôjÑër„ÕÍú š0—·wæ`É1gºÌ¤[‚9´{Ô{˜×ö”×qdGRrØ�WÚÑ“šR‰ÔŒ6¸0 .O‚Êíéi¿¢'<›ží£ìSW̹™“å�bµI¶c%Y~2˜)ðöjii`ÚäÈW‡5ËÙ�=Ó4[ã€1Ê9 %m¾ö=F¦&¿L˜=Ïh˜ ë >Nô¬,h°zoô1dµl~—ÈÎ`,—U×ÿ!²‘ôÊîÕ5ÑÐ Ò/{!±ë:B¨ ß> W¹ýª®°îÐÒ2´¨u~@*)ÿó öFD9©7WyX]b?�Õ·±éµ·?ž)ý“æe­*„(ZwÖΧtìŒÊnrsYæBËÆD•yŒ¼†¼YW–ø²…ظî(ÃÂl 8ƒ·dʺ'H *ž^ÎÑ I£}TãÞ³¦‹7õhb×­n«»!'U°Þ1<°®¢‡´�Ø¡µW , üòÄO£×m0™ˆ° s½§`¹³&”z€­ví‘Q–,þ%Ë]‘â[/b@ípX‰ÁuÃ~Y ¿<3a­SÅ×Sr|³[ÚZKA¿÷輚9Sr¢«i?PLb�ªÜÀ@Y< ‘-°øl¯›Ëq™;†è„äÖ²ó³ün�»×Çø*{Q²oêâqÅ�œGŸ+°7… ó‹,¢ŒeWùòQ/ÇÒZZ¦Ï#ýëg3,ì�~(.Ýîa÷~ü‰’¯.ˆ@ÖóKÚ,Éz‡MÎ&4»—t8E\¹˃ÁÖ?ŸG=Ä“ÀQ� ˜«¥*ÉèØ´òÆ$¬vh4uUå²ÒÜïBE^,‡ªU® ü€èYüÚjëY}èá­ô[ÿ1g~å<¨EJ.OÙŒnò'äC*ÅÚ}êB縞“|ìö£’]¤ÀŒ� ¯ß M(6µšbS,7¤Ú5�ûŸz8qs Šˆœ”>?�G¸KQŒÜéQ(Éí—éïpÝGÖY>öÒ;R¬ÎÜb}R0Ü·9®"ýÁ¼­UìNsiBz�Žô-Ä€²r7/¦0 D/%ë æM·ÕmÀ[—ÒžÓ,÷ž²©3FÉ�>bôj–çÅ[0>íTo0ŸT h+Ë�$� ”e„Þ^3Ò{÷JŒ|ìá_ZviøÕÕ8OÈiö.貸ËX49ò"×Cñèч³Ÿž°hÀfuD&HSÔÓœƒ|¢®NQ\€†&+#ž�ä�øîõÁV[ùyÙz0‹|�ÂÔ�¢qƒIì³’S¯qå(™§ªÌßnWDøÔ  él•R‚86¥Õ‚´ÄemÍ– þÜhŸþKw�S•áaš¹Ý#Ô�Ì€/ÁaänÉ}R.~qíµ}ÞãV+ÍsÛ}G7Y:ž!É"m©(J?ˆ ã›rq" |YûFòè;‚ú6¦'xÀàìJR\ÔUB|ÿ�ñk¸Ì{ûoW a.vMcAdà­ö‘"R%ªîôé^*´×H¡ ‰ÃU �ßYõe�::ðš‘Ã#o�]^ïL/nû1`�$ð((ÀK[°ÙÄ2寵$!åÕzx^<ö¼�r—&;ë%?QYiQ ·+ &‹¢Ãt»cCdÔQì…sÍD ôúe%ÆÚ î”ÑFžæáŒx€"z‰óg,±¼2.<˜»�<¥Ÿ,ê?ÌŒ*Äl%"±xJM¤¤Ä­ûþ€`‚{ƒ!ñš«Úªg [ÌE¿ê’O=l$ç[õÐ̳{�³9¿£­VV~û"$)×/åUÕ¡Êïä&®vVA„lͯ_ŠØgTg ŸäD=�€.ý²Y8B ÊŽ?ågŸu ×XœÔªíôÇ•õS¿™âz6[òÈÕå&bý×r½b_‡†1[\ÔáY»1þÜÃ+*Q˜ „û É’íãy…U Ù±Dm÷ š+–¸CCSN�æmË©�„Bz¯JÅãÿÀVk„[Ãe¥@\8t`ù¯%i²’ÎÎnç¶„àD _ÚQ½MÅDÀ{ V‘ÆNí–Zòm$°ä–]Ä” ÿ{céã˜�§Ðû»ÓûKé’ý NRGŒâ£˜éUµ9…uá ÐÒo/[’zøÔ£†ä/Æ¿×qfüÔ«XUJ"ñ¹h¦ •xÎPÔ{ ¾õ"ø™Ä�IÏq¦ŽV±…ô¸ ,«DD›6¨³ÆºI0[Lv3k \ô´´€QwÐ×ð¡Z©5ˆš'áî\8CºbiˆU/fË~‘ňHIjøí™q�ô+¿íW~Ò‹¿!`²ÎïÈ6swB鯽t½0vnk ¤²{HRP¸2­)pXFp=éeYè5A}Ùï¤žÇ ±2ÛÕ¢ùUÎK³Të¬?¶£++ð?»}=ÉÝв6©�ºO5nëˆÃ–ÐÆE®@aä46œ�@<'™RöWšœ¼ŒŒÏ¨RÛþVØáj/°¢—3LžôC§*¡CƶnîìN—¶Ñ»ƒ4R`ÍË�£D b�¥½P/I~<‚'Eq>Ǥø’}�HŠÕÊյeÔŽ+,#W¬^äq¤  Wûã…úaÆ"KG›1·°„ù)ø¤úqzR'¡ñX-Ã� M GõÒ•êè½Õ·ŸM0|û'ÌbH_ïOq¢Ÿ9Oyûó¿üñÇzû³¿øë¿ùåþðÃïûý_ÿó÷ûÃï~øå~øÕ÷û|–¯÷û¿üõo¿ÿöÇßý·ïüÇïÿêW¿þÿÿý�ÿò»Ÿüîóögÿîíïþó/ŽJà¿üâk‚�åM/Ç" Ñ�D¹cî8ž %€ýeP!C7RúP‚CP*ÆoBèóŸ!xËOä%“iå"WXšPœa.ûe©.ˆš;Å!>°y �þ+I“bË© ¸ç½;B—ÕkˆÙ>%´�ˆ§Ð—ÞsÂþH¦4?ïÛ ¥„ $&ÈIåü�7,mË)1¤pÆ�‚$vM{¸±°Iøï¾ §AÏBàbôé-‡¾Nv@iQ%’í àê—ö'˜�¿ÉÛX™°Àpi£­ôaAòä!ÉVãIr§K·"’º#’¹ABžfKWôi…©~,à®ö®À�­³Ñ}‚y+�˜} $E( «”ó 0"Õéù6¤waŸ3Ç·eìxbû¯¦]ldâ¢@°ÂËîBVšµ,aö]ê2íyoÊdä×33ù:( yøq1oª•pb�ú`m(¤ÕÌß.Áß¾ãt�nSÅñû üUó*EÊ.’oáÀØÓ6ƒ·\3:s¢O„?,=qc—»lÑÞô`Å›Ðz׎چ‚oÿEº£“$?¹Ä‰íb’ú&™®¶®Ó¥F9ߤ Ùm(ÓBÕo®ï@YUÀñˆ.`Qd6úØ`ð¬{‘e®Y ‘k©Ô‰ ÇAÛcåtóW…ª‡”ÿsZœ°‡Am2^DŽì!9jr•œ´Z˜@&¤QHÒÆx|`Ê7Ž%Ô_îuøJÖ”ãŽx>stream c!äU4¢æÝÖ8Îûš{ô@á†Ò¯ñ á¬ô‰•F uýýÜoYP"pKF·î�×Uß(\Õl> ð^ Êç�ôŸÐh¢åtM•‘ô*ÀO—Px—¼9Y ÊÙ6/d]š5¯¬r\»Ý>®bq•µß•pu‹YŠ_ã>à-õ’Ê[ȳ®Ç³%€2¸Š¥ —8Þ˜«ÖwÙT`Û}ÙõÔݎº>?±úÅ£Ú®â¿Dƒ^®T_±íÀñߟߨó™>_™¾# MËn1–Ø£š´ßÛ#ܤ#0¶ªÈsJ\Š âöTðÒct9û¢‚¾å\\ä"º$ÝîרœúL‘Áf‘Áˆ^vQ©«�b¾AQj…œ…´âÁ©RUâ.BAÂ6³�´r} º„�…¸Šû ¨K�”5ŸÏbUÚW()*�;qúöúF.\8é[&nr<º.ذ…Ϭ tÆËä2‰ØEÍ~=iL>;èŒ[ß§`;c¿°Ðã!ַ윥ˆn·DJY5m“ÕkÔS¬å¸G¶’†tOüvß…¦Ô°<ŠÚ›õ‘ÓÍs¨x="UÈ1¢t¯uEg¬:°ÊÒ�sE¢ìzÅv`äÈbÑ»@vñ€ÝT¨~ë(U—¥ �&ÁnB×0j”ÑkÕæ~:/iµŠŒ÷xIu©jYí?¤êî98§ ¢ ‘¿÷êðÓ]]þ ¼Èe专L ÞäzuIN[NÔ.9ˆ�¾uU£Y*x{Øæ Ò/{TŒno®,ÿt™§€Ú-k/&Rþj¨~Ê%<�”\¤Î�5B�Su=Äùƒ°ûú­aûe u!"#Äœ&5#!�#£ú¸à‡ÊŒ´ãÝÍ_WNf?° z èkKóîÿP}ϧ"FïÏñ²d¯¨ÐÙsHˆñôxƒHm“ƒUq³â@o)]/jhKùõ�h‚!¬ðE`.Oñ%¡fÍï.íWÑ?½¯.Ûjrûi–>B�rÀ:Á;Ú¯ƒ@|NÃ[D�Ò‚))›ÐËà™UÂfâ»껥05Û9Òx�¶a·´·áGŠ!ÖKÍÝH�–Gø;T7 ߉°ok¶[Äç>ªkhÛõÖ±‘ä‹üx°÷øT�Z $½Ü}`P> o‰ÏïV–Éo}:¨7¡ƒ®²=ôÿ½ Ó¦h¼"ý]@uk80‰ú ä=d®F�¯ÆÌ>V™ ¸#¹ú~åÀ­ê¼ÎvùlO ÞöA¤Ð¼‘¶ºó­üÑc‚A à>> {çÀµ õ”®-ñäîøÐ{žÚ4ûtÕeúNI}2 RpÝ7Âh4õàC¶J.7¢—¦T $ŠK$îp*­ ;G2#J÷ùGwy|ÝvéªþݹZÄìw‡æÊcS£1ƒr©ªúª ÞR� Ò ¨s‘)¾(ûÉÐa�¡ÍíGÃb”õ‰»¸>±w$)+,ç€#¥ýåä<ÿÄW…=¦– ëo¡XB„DEGΗ Óž«™d/©Õ¦Š%Iôà<Š˜&ìñeù@þˆ�kWÁ FÉídz#Õ·¦ÕÀ÷KŽ=›·™§S<%¤ñ³ûîG¦|‘äjÁw¡”.xúíʹû  úÕqi"¯9¥¾ªÝ Ô'ýÈŒ°�bá6@ÿp@ 9KÉN¥æL�íÏÀ§³¬0©)ý‘(}»yŸ…Ä=õeÆ4Wc*iõOÊ(þà›°ÌÇr¸?ȳŒ·&|¬•/�V€b¹ç†&I3iZh¦bGTÃþRnA¬ÎSÖ¶_šo°„"%qáê÷Û(ÏçŠã€\¶ÏÇ.’—£ÚçL<î!Ùn<[&JG�Å1åÚŽkPxÈÔMºÄ òußäD’û1¨žHªÝ8Ì_Þa›¹3a³¾ì·T· ôfÃð%¬Lz˜ù+q w(Á[QÃÙ(íäé¦×|$–åêšä/íÖid ÌÚt6Í}Ý ˆý’v@ãE» AjÕЃfG¹¿'Q1€"ô‡âÃLi˜7i‚îð~FÚ—¯«O»°èz{qZÂê3‹]ÍÅ.eO¿¨¥(W+ä…×aìz�Û^Ž¢»fB¬OЃ¸DÂÓTp¤Ém°’»|=®Ò‹r¬mÓEasú¯šß³gE쀸¶GÄTà•ŽÀÙÌdY–ºãm§ÍÎø»÷î‚Q&í<Ð\üJ0'‘1Þ‘y^¡�þDVN™]W/´¨U)-ëS»î�}O›ŸÿFÛ|«¿®¡~/ùaŸEŸ¹N’mC“)OC3Ø[­ñË#ÑÕJn÷×÷80R¤àFèÙ/$ÖÔIÔ­=7|aµ|Ln•7… ¬•�‰>œ_ƒ‡Hþ 93Ú:/!ûßòj…õÀw^�™‰ŽÞjy/éÓ\@¾¼Eºµ«Ø {iyûFðK1õ¢ãÁ9è]nPKUt†•-x(gGáDR±¶=°c ¾ov,·»†Ju$‰¤ïÓ¼î$«UC'Ï…ò™(RêÕUd®KMU"!s‡ |âPîÕº1¡!yŽÚÇŽ•ªÌ(ÑùE¥´“/N‰ddªedŠ„“KhÇíåÿÒ¤5l«„þ_³Î¦T[�×(×(gÝ.©šGÚçÒ£Ã�ô±•£ò ßåc ErY!' ørZXPV%ÞÄÞ5`'.ÍÓ=n0œÔ~<Z«(Æ{§ÁL£^·{IÆ�â¬@|­‰•¤†¬%”ûº íÅÉp¤p²aÞìÔÁ}‹€7“°(�PíȵHð m»ôçM¾iˆŠA¤Û= ÷x–zäÂÊ“–YÜÀ;Îs 8¹¿<&aD{$Ìñy¼¡iã1-NÈ>({·�¤-�•{­NóÇrÅ4½PŒ“6ÝmŒ’iƒR» {Š•»%Á�”˜$ªC’áã¨HQVh€!.pUŒJß*KúB„›Ä£|`ÁÅÙO™ ÛL­@#°æ ÿÂâÎKíRe~P-…á�GLŽ{K$”G�Ç$Óªn(Œøþ Ÿ3Ò¶z#|pTxð� Ô&z®Ftf@±`@}‚`R1�’@ PìCÚñÆ]à¡^"ô´JÞÕÔNïŠ|¼þ2¨œK§ž¶%ù=À “¾×ŠsŠÞQØÓ¾�OÎÀwÄ�'yß7éÜËP‹[Jÿû}âr€’ l#Š Y&�®SÓ/î˜iÎCM“b¦€ ÌíÀ„Äò¥ÜJ´�¬�`N¢Mï=Åß‘†0B5ÃÌ@Á|c±T�E¿‰(U~ˆ•±y(j~§27 12ºÚ1X$3ú OÀ*zÃåéQBwø HûrØPžL(Ó”m µûýÉp |Z•áïŠ2ë©i¶n÷”–8ØITò3F2°U]S¹lq’H“"‚êääÄè©ëí½H Ëd¨-”§›6X#XÏ�êÑ…Ew 11%öar£HsJ]­à«mV•…à@«bIì‘I}ƵHye®Ö@ƒÎâdk¤�¨FÚôÜ’\pÃL ®„^dðtšÆRÁJ)lûåä¢T í°f>ÓYJÖ¤Õ«k"b7n…Dß»üHn_' pBЧšªq‘;”œQ© {w²§óùD�=~`£˜rô0Ÿ¤uÚgé*CÈcáP@¡;Jäö±`hz9�6PrÈ"G�CÖÞ9ÄË)æ€ ½6“ ª) þK±¶žg_hRÍD,3=÷UÝÒv ëi”ŒÊ4-Òåï=N®ùÒ€¨RŸ¾Î0uOlÂZ%(À3 EC›ìF-XÞ¡Üæ´d&„»‡Ä­u9?·¥!iŠŒº}˜Y‡…®GÊ/‚fKÍ�ùÃì<Ò.ôXÒY§Ç�eÛ^�§ ‚†y`.òN‚‹Y†vî X éú²j±ß™²ØÊ‹?`ê� %ÏšÁÒJ1ä о¯f�¤�ž¨XÁ¡†‚C8¼Ž*÷0Z\Rtô½Ï££È›`gê^º%´Ì`Õ,ËË;ouK9òØ“B‡`O*ý”›Œ©�c©ÚùQ ‚­ˆ"¹Ÿû­Ö`�äÜü"±(Ò9j&lëÌu%~éñŸ[µo!®çëÔ�ìݳJŠtЦfwÝw"ÕHPév¢Zn1P Þpe0×C[–úM­ž'”AÛóÄ¥D3õBÅH{ú‘ήyÈ„�d�ð»Ø½%º×Ь„û€Ï#SW²œâ„7[8R¹’*仉Ÿ›°lbªª¡Òù!ñoèuÝ3d¾[È|ßö•À;—R†IÕ-J}(YH½lZ’ÛÎÕ·ŒœýÃÄ]Ø«K›æÒ!9/Ïè�[´té·RµÚ•í9FäRxJU»Ô=ö=5Æöeål#]Q2!ÈN›—,¯jØJJÞQòÔ×@äs›.â]÷b^�t$Z)’e’JX‡\õä ­Ðu¬¼NÃH¥A�Åt˜‡jˆTÞ:‚èðî!­X²Åç0o¡”>Ï/I>†^BQS¶Ð±¡Tœ$;µ§œ�1Ÿds±Ðy"%*†()Ö�Mvãêq<’¥ÑTuÐ,&ˆcÅ*wÚ´î×Äã#Š ˆ¶£ˆç û矈+2929SÏõeféiØ·cd´v.ËzŠm ±WþŠÃµ [‡cØeǰ´4¥BÕåŠ+0yÈ�³h…M—£$2ÇWwÕP!¿B…|ÝQÇ’¾Õ«Çêá eÔÃkŠKÒKÚ%l‚½,Àq)Y+[®•…Q½™ ]9$×ß$�[€6Fßijû¼gˆKØôºÕS¬�–ƉôDSŒäoZò¥ÐÅDgÀ �tk¢"wSéž�^%ò°TBFR‹Ê�äâ‘­Ò=·5lìñ§ë·Ô<æÑ)trD¦ G©QšW8ÑUÄ@Æ%ä�lŽfع9L|ž×}=Þ´´œzÁ<ˆtu¡×3œ BàZmF‘m‡+‚±WïBw�V«kJ½ª€²DÑ—!”õÓïëø‡-èÄ \£¤£�^zOêaÕqv¨Ž‹ôñG³Œ'IÄÆ:EìÙŸµ�¦ Æž—ó‘°…(Y@±D\Ò&–•\çn¬°ÙµÕÌ~â.àB1!üºÖêû-IšžÑmsnbI¢?Jé»Zh0ŠtwX¦ ]ˆ%MÙPwãNWü€ ¨¨Ý—Wt+)iŠ?Ž[��Þ*\2ïÒõàŽÑmúªt†G¾¶0â%ëVÎT)²µÀ(ï¯�°’Â~{nÞ÷ šõº­�¨¹ ©–‹ X`4ñq‚À<Å`à-�À–6¾IÅ�§˜ÞeçOp™ O‰çù|/aT(X‹u<�ßû­‰OG€Bš‘ …^¡†ãp¬òžƒ8 ¥'ªéÖ;”c(Hˆ\9¤ÿ8�ªË³í¯¥ú :(Æ4ýâ’Ÿÿjö@[ò3ÓæÅ-–I™dï‰ÏnÛª¬˜Ê™Èñ5 …¼­¸»�´?§õôÏoVãa�Ñ¢�@#{Œ þR™í!ø:x™Ÿ(ÎdSö`HÊa/GÚ-³»D¯^ 9~8 ÷:?ô靨•/ x*÷¸£L‰¶žÀ¢¤+(þ&q°‹÷µ„ð­X»ù…û ë)O¤±ç å#«~_¦Jé „& €Öv;I*EäÔVѽÿñûa§ÑÎÙ $~ÂÃéß=t Žk[ÕÀ Õ“d°ôµ“ Ü ”|Yg÷[JqOW`”Ö pAÔ±j ÷Øt=‰š¾4¶[Ë’.Žgí vmfq±r(ŽÔ÷䀨.zêÂÈŠ.×T£¢8Âh„s¥Ó­å6c€1ÂdVI,Ä�æÓ•tŸÅxoŽ ÃÁECap´ûV†©¨6[TÝ”YÚö]»l^©áü‘Ä– Æ*1Hwè£rÀ *¦žsþc!JýÍ’„~c¶–c»$,åÑ:ˆÐÎ Ê&vÂ=àº�îcC–W#öáeË…¡[»Q<ªG@vô[u`„»ƒD{ùrqßf‘Ø›sVÞ¤ù;üËúI‡íöû³ âŒóóÈé>Ë�¸«të/©­)j/!!ø†´Ý™Ÿ?´ë dXʶb„xýÕã\19BMæö7èÂ"£Àn‹oðÆ´àöû²¹Y@f˜ñ+êÉ;˜UX|'9(#á…ÒSϳÕeëÒP vCó(¢’Ñ:†,>áŽIôUí²yW‚UhžbˆâZ�à™*7Õ׿1ð‘%¤©XÆ^“¢%-{þ—²ˆµ.•‘RbÞç�É J’‘”™òü26}|ÆVþ¿rÓ{úݧ öŠ ø6“í6iièe#…'-ƘméÚÉ=:%Hª¹…½d9ö½Mç‘�ÕÂïŒ_2Ö¿¡k™¡Å8„™6Ùç®v�:|P;!)Õ‹ÿÆü¡¬¼|^Å%ÈûNÇÒê¾;¨d”]>b¬á+$Möå:O˜`O—i ˜[ø‹è¬ó^Hê³€vÁÖ~v¥zòi©ü²QXÀëð *©Ú¢Uc«•_!è…9Œ+÷$¨Y�×LtÅk.©üZƒñW$b/=T"Hê´áâpßá;blAKx �g%Æ‹ÍÜAúïªz¾”~%“ņP2÷Í_ ¾!à/‹ !äî%°±/rê]—f'¾2G€ò ‹†™B†ö»®% ¹âaj–ƒ^($ »Û)@˜*Î%(OùG·W߯FL’Ÿì�[ðŠ^RŒ¯àM-;‘=÷Já T‚‰d4ôÐXøòú^ hÏQW�ðB*,ìÀæ½Æ‚ ·`@]oeÎ@‹öRœ5ÌØè$NåœÁU„Î[~ ão°±"Þ€-N@`Âú¹Ç)Ö6%«ámø<¶èÅè¼Â\˜�Cè=;þÉÆƒ„ìþ6ökrÆƬ ºñЬªÛ1 ÷îC²30¾ìÏò1åNà¡Ä<¶¥=—Ð}|<�(RRw*üVéC� GÏ×AaE.fÇß0¯uƒknñ@¼ë“,=êdÓ-Hn:¢ ê»$tôú%Ýð2Ä›nœ¿"Ìu®ˆçbZ›‘"užô;d{TzQ�óe� Ðâó*òPØëÒ¾‰²Ç{qe`ŠÄ–û‚h=UÕŒ)ÉnމطûË©ôû)¿ þŠÈ.ÈX†;’-º4'$x2hòÄ\¥ê(®ƒÕHÔËZŸØxÏ3Y}èuGˆØŸ«Æê*ésª¼òþ…|¤­Û¾ÛôP’âAζ;‰5 [Þ"¨aFˆí¼T¢£–:%€b»(¥ w(Í>�ˆDlJ—¼Ú8c÷˜ÆNÞ¹í·$ sÚ²56r!ëí9¯×Q©ÀIoÔ³ ƒòL@—e�5#Ba,˜ Ùq”}“:lxéÈ;{ß&4B1pnãõfÌ»¤ë„ykQ #á…9„XSñË š W�äÒn†Ó#¥£n›‰ƒ½ŠA}ä e­É¿"=ù~j›q‰%KõÇHŒ»„ƒ–fM²Öû M芊T·µ¸Þæ6I`‚|•#G²4£rP•”½÷(š†WÐîãÚâvé­õt–;NºlÓãaQ{t æÓ÷\DwàÇG6[°9 ˜0HÃ�…�=ÕœŸõŽnöJ�80^'{Ì£QÐÑŸ˜:Ñ+uNÆŒøÙ\šà÷ûÒHÍ€"EF-ÄšnQ$Í6‡¡Ìê#Le=”Ô¥ xU£¨ž'ðÓ%,#„†…�šë ž> Í>�(xš«%鹚ô X¸ç&^ÒS ©uYÎ<)0t²qÐéœ!ªòÉvоåúg÷®AÁ¸M”lj‡<Ì%Þ!t_Íá—@ŒN$@¨kV”‡›J2ÉŽ1â¯føIÍr·D*uNžQ3÷LÄ1¥ÈV8HÁnOpB­Ið)Ö°Ø’"ó®þ)¬¢rFT&Ä)‡N7ñâæ¯¤¶òµÓ¡Ü€¶�j?¬0­fx®É`zÎ'…EzÈ ¯ a:>»’:êö\Ù³%•µo�dòÕ‘¹º€Jº®îR¤l¬ä°ŠíCƒé/é!+œ´P8)=¯Î3šDIœsÝÏ}òWƬÐ_”I×�ø�;ÄŸYÁÃG‰èLkÁŠ"ÜÕ½èKn`}E7`HïÒ¼U±nDl9"W¨‹±î¶ã;nQ³Ú*Ÿ ÀЕ|í²5˜Ï—Ì£=™Ç\�+è î[“öì°…õö\-dá ´?B*‘í@¦CÄð§;q½ƒqéj̸Ƈ²¯,Ôo  *ÖóɰÝ2?Ž ¢„ïº}w.rK‘ˆUoºt·°r /‰Ô îÃ;,WS¶ïææÊ0O’º× £&qÍ¡¯ŠÏ±ó¸d™+²$x^DbÞ‰ìw9_Nõ~(äfN`ÿrYG¿¸Ê)w1hV|Vó>” `~R›¥Ð'cÔ™�¦ÎàV †Ã«­ï£Úˆr~º¦Ì×í šÑrÔºé%¼ –9tMŽ%ä0LK€ƒ…ÁT°¨ ž’`¼³‹2ÈÈUƒ-{g J ¬KþVî%íœ.ÉR‡2:`\¦(tÀY¾òqªÅH-(ybŸ/bØM�éHFºaê þ©_žà&ž {FÂ,H9L�LH¤ µ3“+sЂ)¥�…û —>O£·õà˜ˆE ŸÞ¯V¢Ä(­R<²5ˆñë¹¼Öº‹{æ•;4öç ù¦žêå+†D$GƒCÜ•^‚õKBnïëj Ç3�Eä?…Ò¥õ2ØJ$Ââ'ÞÏ¿ñÁaá³Ç«9®ï×~Ø,¨ÌÎÒC]±WÑŽ¡Üvá~l'êøÉmËMµIð‰jU»2]±•,†@¤Ê¹¤08�œËëðÚ.çŽD@“†Jp ÕÚéâ¬v·,EÜël û¼eÅþဧd$§ ¦}åÏ Ê']¾²·Hù‘%(’üÊgŒë´9"’;¸A}¿$®‘àfm†ìa ÙÃæŒhƒ+²Gû IÒ©@ÕÎ×øC¤X~D^ÊýÚÅ|ÙÚ½¤ïÂÀ”cØv’Tðk€<´Ê¨ŸñUí ¾p\ëçi†z­ˆ‰”iñȇƒ >hz„B_!æw¼v2iz˜Oz"9¦Ù°ÊZzt!@ F-Üy”Àßè±#„µ»Ÿ*u�O=ÒåÛøYX·•RŠ©ò,£ñ¦€Þ´ sCoqª3[€Äƒ#V†.Qeº¨!r7¢¤¼úô¹ì¹.‚<4°Ëº]{$)ÃÅw*k5â=E·—€Blr—p÷üŽ4š×|™/²ôpÎx‰óŠu?aÌ4ïX5ÊsÉl>�}‘ó‡D!Ãj„Îd©ÿAÅÔkƾÛ}~Ï‘O 5�2;Öz2Ý´‡„4Ñîç©£ë%hæå½ãi].kwÈþsøÏ5ˆ!‰„„’4‰¬Ù²ÉQ¾uB¦ ‚ÏÖÝO­ãkí)oHT4×y$F¿{TÑÉèÁGŠ:•6–`æGçÀ�Á=üvÒò$¥o. WÏ%vûµR)Á>=­ËHE'-yÄ Œ%õºýWRܤÌ|{{he¨½×'ƒ—ˆÁK�ÞÊY®æëü2…2 묧›+ö´ücÉ[xojð’x;E=Ì‚Å*>þÔÕ­K^d>ÿrüBªQZ;2’th½e¡Ù;\OÌ«bÊ~òÓ�{¹Ê×3Ò„îs¯êºÒV.ã�¨÷ â¤[ïÈÚ~šk³ª’íY}ãÏ=üKÊ$Èg±(¥ùé<5©7<@}Åû³½×»h¼¡+³ƒÅ6r¢�ƒ¨× :&æérÒ×—ÕebÐ�)Û%/Ë�3•l‘šz˜ˆ“Ÿ5ŠçòÏFoÖ’‰ÙH$ŠR¿ˆxE ó‚(N²¨�l„²oÃaÀ¼ò-uË>0æ�3Õ®¼˜4s^ÜÈvŸzL)\Ñ#PÅÍÃÛ9ÃËIŸ<­lQH9’Æ�w©²£ÁÞ ]©­HZ—a¬å ÛOαTlœ�uâ{Ä —�‹üKÕØUm®a@¾H*ò%+ëš×rÍë²r»J:l@ì=YwE‘ðôíÈîÛøÞ6?sPõ5#ÒòÔ O±"^La­¼í$À¾ÓæR°¹)lùÛÖÉÖIgÑ�¹æ˜ÚT ¶’èQàAfÓ@ñîOÛI(·E�¸_ï×÷²+,9=q‡°3ùK¶Î€8·âz„U¿>†bÞSæ—䜗É.Ü+.cÕ÷#š¢¯î–¹ÏK z^0¦aXÙ¾yñ$;ÄoVGÇ+Æ uœ›*7õ’ËêØã³h¨§ÐÇýuY9È—˜À¤Y«%6lúÊÄ9M�yÐäîšþÌP×.l¯QS‰_x¿ÚÒ2õ•ö¢‹Ác•gT‹í˜Àÿˆt+Sš¸pÃòâÜ"wŽç–b3¥¹æÒÜ�ìÛ”º3Gç�N•dàN¦æ>Öé!ŠW¬Ü¥ ¯Nbâ|4�¦\Q£Öaر”ö¶�õ'Eú8â—™•¤±“ç,“G2#xýÉï·µ‚Äì—CÚ"Š–®íÃ`ˆ_ò§³ÏqeD~IKöm5*D<`»ÍÚRƒOVÇ!@/íSk6;ú6ÝxO2÷ª±�”yÓQ’/?ö*ÁÈë”ÍŠ!tŸñ€ºó7þv¸Éâ3¢tµ‡Ì ¢†Ö¥Þx^yO5f“½³òjU�ª·‡žàop!¶0r ®¦s á ÄØ|HYý+8‰X®§W]†yò8a�Ή � �zЊwà"ìDED�Øƒê ÆÌmfy9_ ;ðY“¢D³VqG——$7Zc¬Øð°ÀÃ͹‹îHZYÆh»b¡}îÐ#¡ì�(SUî´.›©“lAuâ s§½+ÞæëBt˜4K�T±ªÛ^»n«’/½GÜhy{D^ œO•®/V:±»¢*¥¼�©Å‚²K�¢Ñë`�vé™ê Q^<ÿ`ˆÚÞ~6µø'Íb2f°Aüd’L«qXx為ÜRÿÛ£ò�Ç©ñÊ0Ú4}QÝ@�E-´Ú,µc3!¦:›3I-²”§W�•á¢TYŠßáS"~\ìó“îEyé2þD_!{{éÀÉûaH3…6fœéÀð„–5¨™lºU€ÿÚÙ–Ì�?^ƒT˜eÉ¥ô\Üþ~¼D¨Ô‚¬<±�>ŒŽÙ�äŸå£ÛJ–îa¦û�!&z”µ®aA-²Xpw†)ØÂ£€o%p‘®¸¡?©½AÛÔqí¥¸ébIhyÜ H$p΀ª/�»’˜IybÊ5µçÙ,ìÈ/t錂 šÖcš’$Ï Í¯æ+§`¾Ü=iåéd3¦ºÇþÖÖé�}º¯‡Z€¥mlFÎŒïûCÞMfÊLe‚û"õ_ßìÂh.¶ñU+îAÛD,ñ«)Òš3šªš×c�˜|„ÓØA8‰C©ÓôXLnËâÀ)áw,AIE%°© =”ñ¨n ú8ßš�ôM‰nå°öŠ9X4 d¹¤9 pz°báÀžÃšÁëT±8pǶmDù$Àä5²Û‚Û…EĤˆDR[ÐÈDÅèÉÄX›žì!Äí9¨ %:(<[WuÈ|–aT»aß{T ÓM„ÝïÕõ,Þìœ/Z¯”ê3�Éí^ö= .Êí?Áçé�~Ôà`ŇÑÓ‡Ùø~ $õÒ§¯Î—:g#Ili0¶DWÍk/}NuõÔ7D.Cu¤ÒIJûJìBÒ L·£¨ß_ÒàEÎZÕ�YÒXC¾”·þíK©Ð%劅‡ª±µºøJíxl±zé t€v ËV†\Mj�-©ö™¿p-e”8à¬mÖ|ú„ÏŽ�s×áiÄsÚ�Ág(³ð(òœÐ¬ÒÑtÂK%Í´Iì’�FbwÏ옩i›i”±—ÏÝU�];ÿÖ•xv&;² 3uð&Œ|ñ¸EàdÔã€È­ ’â|“o¬@D+¸‹{ks…Àÿñðãà�ÿ'rCæ~—üað:(Lé‰î5ÕáºYŸu&ÿ½4šÛ0¡l¸KãúX"Ø$¤Byã~ó·o!ZéÙ€.ï„[-OÒ�dÎÁl´¡¨¢™¡VªkªÇ£Im�ƒÎÇï�IX6ñWFÒ,Ð�â ñÂPí?Xñü«br?M‹åïŸR%�Ñ~ûùû’. 0ø§ˆúƒl@à_wl8Ð&`PûµÔb;ü9ˆ•¶GX¡°<´â††æ©J°+c„CÇA²%CæV!m!ã *Í ´Tâ²v†Š¢û•Ô8híþYˆx¨²Ìü`û%ÀŽ7_$kÍ`_ÝÞqO ‚›Bì=øS—l»þ=¥K¶Yªä(YÇç…‚j%íwødþüq! *YP"&• "õÞ~Pv’Jƒy˜’8„f—Ê‚H¼iûÂA9Dˆ’ :ô4¼ÜÀÐ.† ªŸp ¤,’Šñ á§T‚ZÔŠt{N·›¼„ˆL…—1/hÑŠv�÷!îdÎ F¦/A <ôªÐ‹—Ã+…{¥¨¶T��ë'\jì«f é‡5ûÖ:$Zº}B€O`ZÝ‚ÇÁq»¯šlÊM-u�‡Ðê—̱¾hKoYãÞ,kÜÔ|—0}QôCÚ!¥,K}ÂÛÅ‹ �ø})_‚\z[úÒ3Rµ_¤§æ™šk±�!þ—˜¾ÐÞD)^ná¥<É%’XE”>–æ;8ÍNË?[ �O)·~šRÄ>»˜4C‘@ ¸º¢7áÅ"ÑAÍúdžôbqXøjv|[µ€°ÆË'6¤»Ùðiß1#Îq‘vûŠQ¥ÑK‚Àwd–MçC9 B„¬<"h8v`¶|A•Fˆ;äa.4}%\èd ¸W?—øSæX�•èc2 ]Qû´ê’ÌP‰HSU —6+ 7dSšP‹è6_Áû}ƼM"_ÚÔ•UrÙO‚;Ä1G5„Õí/°°Ù¨ÇQÕ±çŒ]®96öë¶Óá ë28wûg²\·~Ç(ÖJl½×qí‘å§*Z]Î2ÂsQÃŒ nÞM¸ßbtš ú�ù¡Góáúx4 \po櫾À¬ü[sWIX¹Ûî'nhŒÂ)¯šuIWÔ]Ë­KÀd)é ƒÍjòœ*ÎRftÊû­-þ@;ÿÝ>²èò”ˆŸPrÞ;³ ™¶îýðWt¼£T¨\31^º­ÜÒžrϳw"Óæ�VæhýNo/˜EüóÅ?ÐvæŠ�ÁǃˆiHUã~Ì Ϳײ×jYú V²–¤‚ËN›W8÷¿Nq½ RYÀ¹†s†~…ë7è^/&½çóÁ›�ɲ ãô¯^æQu`êÀÍÜþÄN©Ð´pãtÆR•†RP¢[tI¡Ø•ß’âXþğètà-‰"8hŰTåesSàÈ›˜.�š'pfÓ �óåÝ#6âOz«!¢ÜÞÔÞ|‹"¦ïqBŠL¨Ž¢‘"î6(w¨SÜiZx #ª¾BÙß�Vê»› Ã?5ÉUˆá5ÿ6PéOT;ñ)߯’¾@ xÌÍ×ã,ò`„›R�ʲÖÏm—¬½Zaõû&ŸoaP‡C-Še¢úǤGæ^l³Þ”ôÃa±a$ßIL@Åþ¼˜Ø¥÷N¦ˆ5œX¿YLÕŒš'À“<ëé,F¬ØèÙÈþd¥–ÿ ÀßÓb·ö„çÀ ϱ^š¬B¯XA@DK³Â«)‚ÙË*QX<‹³cæux~wV9ºJynqM@’t¤Z¡óð]�ºÑ[½WV8¯r‘bÕ“ëëÐAË´^ûöo=‘VâÀ~ö(‡¹ïÖ¥%º÷Y©ÁÂ� K IMÏ«J¦ƒa­maA EtÚ´K’¢:=ÊÉ+[®¬Q\E¢èÓzhq=z\�tûÈu ÅŠ®ÂšïE˜ïÝ>gdRï„+÷Ë&S0Öà…ÜÂë…6ÛŸö\ÊMæŒüé€#bM«Œ ©*ÓúÉ,giîÚC̳¡ïرÃô2úñ@LÉvYÿxÌ8I/ª;¶z×rr[m†Hp —†ŽAÄq Ý0£ã Iuþ-�8„›„oÄgª-ª—�ª]êè\ÐìB ü‚òhö³ AÒ¶ ˆy#¸Oîáú ©QÞ)w>y˜1$V ‰=Ì+|Ý[:ìw-¦\¨¡û„GÎõò”ˆƒÅu îÁñ '=©JŠo]ýRb¯ Yn£¥%�ò;¼ÙäðÊäbñq çûÊ‘L»oƒ¹U^.$6Èm*]ªÎ×Ô‚Lâ(í¢¢$0?Š’H)�Ô±ÔŽZz½­ò„HûÔ…P†ÿîŤC^©4[} û§€x’�²ËB˜zu€zX€ÞžqUÀ(†.�d‹#êȲüD$ƒ¸·ººÓ�°_›s³âå:D-ìÑ“­²Áf[ ûÐ[¾žPTŸv p m4Nž¯å ë+íŠÄHX.€íƒðDÞœb4]Ù(€Å€6””\Á‹Ð ¡¢ÄºJ:“ç!À9OI"¸ë¯ÐµÕ#–—$|›kÈØ)æý{šaë²cYãín+”Âæî·ÊÙwßþ w+Ò·øSœègÎSÞþü/üñŸÞþì/þúo~ù‡?üðûß~ÿ×ÿüýøå¯ûý·?þî¿}ÿã?~ÿW¿úõþýïü—ßýä|ÏÛŸý»·¿ûÏÿ¿ÎÌ™~üý÷ÿÛ�¿û~Ÿÿüý�¿ýƒÏùó}ÿ‡_ÿ† ùõÿüýÿòÃûc½¿ûáÿðñÔD�þüoøåW/ê×ÿôÃ÷ÿÓ¿þ/ÿ5þp¼ýù_ÿö_éù7¿ÿáÿùõÿúýßþø¯ÿœ¿�:44Íûù‘ÿüë_ýá¿þü�oü§ø�qýìYyFóÃïÿá‡ßþáõ�úÏ�šÿ÷Ëÿk_‡Þïw?þÃëo>¼Ú¿úÅ÷ݾÿ«ßþ*NÁ¿ÿþþ?þøÛ¿Ùcî{Ø}ó�›ÿò‡ÿ²Ÿü»¿ø�¿ãÈí#ùûùçÿšçù³ÿý·¿ýåo~øÕÛúw¿¸Þþbÿßßýë/¤âò/¯ÿW^ê*×Ûÿ¼ÿãÿÞMÿúÖßþÃÛÿñ^o¿â¯þöß þ�À·=Á’7Ø/ù74C¿aÎx5÷¡yG–Ø÷á$?Ó|NòÛ×5þ¯¿`‡ºÈ�Þ¸»Â¹$¬QcÝ—ìÀEYØÁúÕÐÃÆßŒR‰’Q²¢�ˆ%Æ£-âWFÞ‹Ó¨á]‡=¯ýÝ/?ÜÛ…äžÛÇÛCÍä©ß¢_5^l€Ü–Ñ�…òÜ·q|êÜÜÙ¸||~ñsßýâu`¹ÜYhßÞ¼ã:Ku3ß77¢U?ÉòäF,âï–×±ÈâÅü¢‘ŠïŽ8Õ�¢•~ê)Ïë …â î+oúÁIÉOÌv4Æ9ÑÑ;Ïá�aϬ¶è‰psü~�&R•ѯÔןßòÖc*—´N# ‚¸§xà°¨”i‰æÑF^~?÷OÀà¼îÿÃøÖ¯¦‚j¦<ÉqÅ~Í(wGóôû¥qåûBÍé-N�=OËOO™¿uA´Éÿ�ߺÏpœv鋯ú£{žûÕx•h$ðü6O°Öé=;±ŸÏ‰xøW?/ EY¿^Ä>÷süM6g#’;Ñ„nj4îO#/?¬a%ÈoóÏÑépóŒ‡ó¸æâƾ}õ÷ÿèÛ�óÕ,¡º|?‚ZFï>ãmôÍÞ»ÿÍWt!’à|r#'LäCW|”ƒW4žÉA6Ž4B?ѳ÷xteØ»•-žôήF¢ñÎOúÝ—NsN-ä#²-§±�ÔWo 3,9H†dѬ¢ª›ËãGYÄí�w÷Y4Î;N!µÁhD'Ö�EAÞW.æBêN-Ë�ü7Ñ\®Ú`éÞ¢ ±ßóW4"Aéw÷ä¢ù n´Í¢ï…½Œ«'¨"ᗀѯsúmgßü^ÇWoá5zP�ð)H¬æà™uÅ÷½·F=V‹Ç¹7Ï'_¿j6nÌ ùãió•ÞdŸã:À�Å£  7wO4’’ˆ×Ô²mÔxGë)1�ü¤ùF *ÿ¾öh¯“þôâÊqœ>x©µXxÕÜcÄ+U•�9´+=�3¾-˜}i2’òUp‚zúÞëüX}w‚÷W�—ö [à)–X‹*sWŒ*ŠC'È©÷ˆ÷� ø[6^ñ> k|nl¹Â~þ¹øTqoñBÿ&›A@FóÒÃWã*_i¬#ŸÆä€y¨¹Bì‹Æ•?¦oæ«W�Hð9'�’ô¥¡R�Ò»‡ ZÄnÌ€ÁÖ£mÄGÃW×b\ ±rù)¾¨)ãî?]e>_À듽ªgGVÅüÂ^SãˆO¦žË„lÑXóÓ@Ðèí«ç�$ÓIHýêý›hÎ�ÉíÖ­hz&7¾/7ŽvÎã\Úé[ÏéÒ~'&!šë̾õ„œ8ÄD#€ÔhlåœàÃ…Åx#4yE¬¢xâ7Ñ\®› Å…ÑØZ|ÐërEcLðsdÞ·×zŸ·x_±{,@œ¼Ùú|ïãÀü9×9Ñhx¢»h«ë}Äö3SE4·ÜdR Ë¾¹p‚3×ü\¸òŽ;Œ–lœŠ’ðÕ;x} 6½2>«Ÿoà&‘éf6cßEs®û|Úg`Î+ó:ÅWÏ?ˆÞ×Èà÷®w L”¶Î>õfóø]6_}½{%qŠ8·ÄCçÛWÏ›w(Àæç;¬_¤wëà!¶T4žÀzßÊF¹Ø¹ñz7�ÐtsyiÆ Î÷U¯|ýº¨ß~ýÂ^_‚�â1�sù0¾½€|ôÿo÷ýÉyÿÓþAåhþûQx›ôÔñËo¢y¯L%›o ô‡éèÜTLRå^O~—¹3Çô®÷xÖÂÿº/ùTžh»ê¿„eÞù{0Âñ¤b!¢»o"~«9î¢t:{6ö|Ô·<st]bU¬ÍhÄDãÈoò¹rËv¿ÿ¨õ�ç9jîщÆz•Œ­Ä³_'´�3‡Ð¸Gýú[ÊÔRò³Ž9–ÆèY_¿ž\®wsàkf»¯‹÷ò^N1½8Üëda�éùëËÛÁ~R_ј™¥«çÄ|Åá–óÇ·êNb�ø¶oÔóZµ6Æ æŒ�K!ýSãõœ671Ë1¶Ûlq§ŠœÜˆsCœtœ?v—? -¹.h$å9sP)uñúýçl®ç<·ÕÏ×¢˜(ÕÝÎTÿd£$•_=ó¼õÊÍJYž„n ÌåôöÄÍR÷ÍLÚsÖ•{¾—WÜòw.™åœ`Ìœ^Åuñ Æ™ý‘:ŠOKõ¸¬é5À±±§RZžs‚½Ï9ë³Óv¸PHö[X±÷/rYéš×s‚«µœ÷™’ýl;Û®ü¹˜s°È¾-#Øý9`ž–¯²ä™2º÷'`7j^�B“ø¡qzÎÙÏ jñCdHÆ“¥˜92óÒïl¼æUÞ5æ ®ë¼*v¾/`ç=N‘±Ý-²Þú0@ë»[”ß|ÞúnØ£}•]ŠÒñÅ]Ít‹Ÿzb5»t®•c<†…½¼V/³˜ÞÌÜ9f—hJ'J»ïX¾_ Âõ%²×ë•Ô„Ft<ßÈ–sھη�àçNz�û_™täïûÊæá¤ãn|%浡ˆžÏÌÕ¹“<Á+U—ÒõÚ,‰ä°²�¥¯ä—�ë`\ì~ÜßEs+9!?ų¹&§|%ÏK1 œ¼`‰„Ì÷|-3->ç°JÞ°—¤…ºI^Z‹­Ç‚K“E„»Ê*ÀÍmæ×�Ñã’éöŠ×{õ…7LÆÕàãâÒ“ÍFÆÆ�µ•œ9á$FÑ�I™’CYÒU-›)Û»±žÉ:Å`'Ï$�^Þ9AKx—Œ$W9 0«]6�6Š~âί‡£½fÐù ÎPò­­êä‚,fr‘¾Ö·ñ÷e�—ùx^”4ÓsÆ£g5^¹6\+4îi÷e¤%¿‹æ×,š›áu�Ää2RÂ�¥ç‡ò˜Žáä±W‰š~¾ôL3¡ ½ÎXsöàÏOEêñÌ>ÀŸ|fSEæ3Oät?Á®ãïç“}¯ë>¢W¡‰nGÎièQÄ HHöx\¤s¿‹Ö‚P¹[‡§Š)ŒÃy²ÌÝ ¾ÎãÎûZÆ>E4xç ®3ƒ°Fq‚³# “|JYó̶WŒ£) @~¦1]OIæ@bÒˆœp²Ïk�óf�;J7Ž6Î*âQÀO�Àói’O¡�rrðžÖβ•“ó(-ó¬‘꣱ßùÄì('¨#Ïû8JÀü/>ÿÛS…sÙ~ýÐܼ/“°u^Ø88A‘ç¥ egÅ~åñ&rågöÈ•ŸÆšÕØTÑó:_®¦@Q€È`u<™Ó™2aÎ7vÇËmœÑî€yÏ^ãÎzÊ=W­ˆ=¤ß›aõ$¾sc»rÐõœÕøû³ÉÅÎáéºJÉ¿U’°uŽ”“S$ÆwòzbRuŸ�Ôu}‘f`Ì]ù…]®ÅŨ÷¾×™–•¤�Ƴ³&à8'wŽ í±ÜØË}>›s|Dß}y‚¾Îù�{J™WjL‹+â†\ÅÄëÊ;À<Ñ̃g!dÄ~Í­^¹gec�ÍW©'NŠl\»Oq9\M.!ÏÌ¿‘©œœ=Æ<™ ˜V¿q·ÿ$ZÍÄù¥…½ÿTG)äçôáºH›c擯q©›Ó+ÐwÑ\ÎCÌšÆú1±ˆ+J$áòíŽ×§pçßÞ¯œÇ�'TÒ(>�Lwˆ]9§ƒ(¡í:9ž`l}ƒà9Î÷ -^ðòæsC‹TÜÕü 3èAa¿Ÿ´ß•a½¸my‚Ò²Ü#âÜs>ÙÈaCØj®)ÔË�ûvñ$š"#}¼K%<‘àK¶o4füÛ®«5’Thb9¸Ï¿Ï¸¾Î�3å­3»9çAß â‰�uäô¬±•'¸Zήµ:Á —‰3�E™z7ÎÈÑF|è÷òŠ™žkv�§ëã5ª‡žy¬ÞY¼âïçk¬¶ü­+6ÞÕ“g-÷‰f®%à'ÏnKÒMnì'r$ᛟÏñ!€ÙÎbà9óŒ’W�·/÷jó¤Múkν –úÆIÔ{žåô‰¶q ¯ý&©Õ“M>ézà 9,sÕQÑâäžw¥ˆ¼¯×ãnÏÙXF°�ãlTVîvs�Ióö6÷•p^Ÿ‘®Å�3ž(çš'`±É4_æï°Ï0�„6"’쨈ÚO‘û>Oëªù÷'™1f?�ýLW-÷í}¨t�rÇ�)«a•“WȾ͜2ÆÊØ¡An=ëNsÒIÆu�€âÉÆ0ëî§6Ößå¿rÍØ�UŠ˜ �QÃ@î$ô(û|HgWw;~’•Ü1à8_Ø…—ÎIäÈ�–ƒò‹Ú¯ð^Y¹©õ9аç•ñŽï£¾Oï·ØÒÒx¶ö¯�‘à'Ó èâìÙ±N>™~ªèX‰žZL·Î÷\î™�ãÉ^™Ä÷77uʰ}ͯ�GŠVÙüÊ,ÕñêûTåð#ãçjÙ´±‰ž-N¯˜©Þg;!§q~Ì:Wɾ±¡>ß9Y¿J5¶1¯æÏ�{røOÑ7#ÑéèÄ�-SûÇfËÆ²j~ç0òÇJ9pÚ5òÇê‰ý[Ôöèy²ƒ1Óå¤c"“�¾Ä‰ÛÛ,ÙØNÎà•Ÿ�ïa‚ã²|Qß/81ýY—"Ûz_P¥8ù«ëä”ГxN±$2õ£8ņ’MÏÌyržWÆåäÚJÍ;Ȱm:Ááž ž\ï6Û4Ÿ9©”¸-öÕ'‹8¼\Iü”`žÜ ÔñûìŽ�Í@�жuNÓ…©ÑÝ:‰™Ç™NÐrö•®“çù4Æ oPI< ¼Ìb Ðr Ô¨¡•·8ç•3_­í±\`ÿ.šWàŠfÀa*9żýuƒÊ>9çEßyÖR²¯˜QÑx¦ù *²@XZŸ 8Å+É·kÏ=NMØé8™Òr }•�væ†ôÎÚOþò̇—3Xn T ¢k5§ÓvfŒòB.“¯ÝØÏÌY§7Eéq­ªr$à™Ð“šgÎCsøÓDxó¬T‰#äs\´f•(ÜÅôJKÏSD–ˆÇÁ�ž>%›ºæ<�©wɇ"c^7>=?+<ÎIï@N¬¿ù ÜužÊr™ï'ç–yxýØHÔþ}~lœû/QïÞ�ýļõý úÙü–XüÊ´ÚPÌ7çíÉ4œPÜyt…ß­êÑ·%n~t£öË8Ûg”Üs—T„ÊGƒEËwѼZNå X*òÍŽÆUãÑìY$æŒ@îçy_u1í™ó/�þuÎzà-ï0¸ã]©êŠòxÑž:®@t߃{÷Dpßóˆ7«Ö°œ3C0@4Ƙ°ë§gËþ;� (ÊÇ�=-ƒÎ™<œ¨Î–¨>ý…CÆÙ&?ûÌ×K;õ ñšIN”pÏç€Aq¶æâI½×³|Ù¡÷«˜Z dÇÖ"궈ωÙ}ç«®ä�¼läó‚“@c$uù\ó)´wÅ�öœ €k�³\|ÏÍ×ây~å:eØ�ÆpF£}ØAá�{2DýTÑd�›Se0Ëûšçø¨Ó��ø©ÕãhÛ>v¡ô]õLÔó4ž²E[ýu‚W1EË�h �TB$¹ÊEa7×Ôzâõ.á^š÷J0GïÄn*uó�°Zw,«ªïÇT%„ø}˜,3Á^rP÷`f­ùûì{¢¨L’\’À8ëMM¼jq_ïQ°O;ñά§ë™©Æý‚¶ÝïŸ@¾g±©Ù7£8Q… g¿_ó÷ÈÀàº]“ˆIq$™â>¼¡Ì:ü ÃâU"×l'IåDKkæIå‰wz¿.@~Õ¾þqدê_‹l=g=9¦þ"#Á‹Îóèþz·2EÄy­w¥3D�ãïIíäŒö¼HeÊðÅ HÄõ>ÅRæ!‰=È\Ëýº®22í ™'.ö¤HŠÓ1²œEÒY»H#ÝI#qò]Þîªq]íùú«�áRs`jMx —\™&LRD«gªõÅ•èWÒ™îÔÉ,O ëcÄÞ9ª(“£{´Üδó÷/õŒÚû%áäøý>ßá6³DEe¬ZFÍ !ƒù¯p5â£íyýãu¯w ~rÒ'€À/F=MO÷—L�y³b¡»1¡È¬–w6Îç0×N–æq¨4ìI½ü”“ž.ç¸oB—€ål˜¹ÆéÚá·ñ÷ª[ªYsEž6Ëæ¸Æµþj~'‚µò�gÓ¿øúɘyQ�ȧä49’¯RPjZE,κM¿×Õñšégºdâh]ÊÆÜšK‰9_y}1fê)ŠMC3b±ZíÜî•�YùWAx¾N°òÑ”ëÎõú:|‰yQÍÉé@©›\okDêóK�² ¿‡¼Ò�HϨOÏw{ya™”RÈ‘÷•(�ƒ>UsÐô Õ–~@Ó`ÝÝîä;êå îÃÕª'rC7.~kµŒ3D›Î3� ö…SçÉän!«7¢ýž`ùI²X]^XÄd[9£��ù"L¸u".Áå?âú׌ëîÿ Ã.ãÄy€eì-zŽ™ÒJî­®ó_u=ío’Ž#|àw±ëÊ"ä;æž šùl£°SîCj÷yýÝ«W^ɺûÙ0Ç�JêïÃsC2hœ[Y#Qs²ß•¡È4Û‹D¿ÌÉÓ½¦ø¾¸Nôµþ¸èô¤æ'~õÿ;Wj]C4¶ :Ë)‹‘)|NÀPCÐdp…ˆP4®'³4{×{Ÿ¼ø[Oìa±€¹Å⩞¹Ì½j‹ô�¯I>J;{2ˆ´=Ó¢õɇˆ­èÉ€j'â±^Jæ`A4Žèòć¹uŸm%©Ùuh”G¼ƒ„먹*Æ7Djöl,¯ ˆ×npÊëcÉóÞwÒëæ«Æ1`|8FüF)ë× ÝFÉœ÷ @,þ“qžÆGøç"cGÎ{&y5³pÒ�Îù «ßÞ=Ȭ\ó £˜J)a&qpÜï ã°Te‰ž³f€ö«¼¼sÊè™K¨àˆîñé ž³'I¸ Ešž¡o·s‘›ˆ.’É÷{]f�ï÷Ñu½N�Ùqp%4–3˜ƒ òóYzgYïC2#Qس±F>e¼#ÔÐùÄ_õMJóã|:ùlê©–Ï“¾[PS5c­L4SðqŽ×:}ïTYè£ÀLŠs?H%ár0öîR¤”{ÜB®°\Ö^b/ä ²ä0Ü!{Ϋ™¸ýšR€›×�YVAM*ôŒ0È™Wõç ^[¶“"ëмáÀØ�õ|º¢f%š$ÉÃ%¤8AÉéþ€oÚ‰]†s©y‚y�É#jÏB–Ì«¯qÊ£ol5X1î“ÑøÓ�ªzn*²FÔú»M˜"zŸ¶Ÿå�ýkþyÏ?�e¦|ÍÍ©b�üëÌÔÇþÇ�™ûÖ=tã}eà!Ù•<¾¬9%>y©wÍH`Ĥ¬ž©+ÒO• `Õk¿^h«•ϪF• /¦×è~ATÆ g†¿Êhl§1&å&Š\N:µ¡kœc`ÆjÅ Öý>¡‘͙ՅI:ÁYBí2¬ç¼#Çs»=sW$Ýh¬¹SɈŒ³füÚr_Éï?©”t竇;­ð�Ql+‰z´×| ‰Aú]4�v¾Û€É¶yÒŽ<¹H/Š„ÞGÞײÍI\XnÚ{ ¹ ·‰-•O¦Dã+¦|Ñiž'šÁôØ�Ï‘b ÒöóÒó: îÑ®%—ŽEã9Ás6ò»ùîy]«æßÞ–åÞ;ú‘?§ŠûÚô7Ü4ÛÙõÔµ� Åñ=º¸Îò%ã�“›Óñ—þîw~ «x{Á NL8£ŒAc+'ÂIøéu²]/}®þâh‡mÊ7ÿ–… ÞüÀ¢À%¾¦hË=ò E™žnò9O2õݻ湂}µÿ‹¯žâ!h¯‘IÚK3êOnTûyÞ²îèg Í„ûÖSès%Ü÷«âí]ÖRòÂnì€uÅ ±|à/$Í'w’%oõ=êY¡sú>=_?¶£Ã‚jô}•±ñ~sÏ~r¼/LÑnNðÉK·Š³)å�ÜØN5îZõ…úî�GNO¹1ǯ¦$�½Ž\…e‚ጃÍUÜ”Òã�ˆÆÉŠ÷q²/©U‡SÕufŽžûF|j΄’Ð6õ=2Tûÿ)úöS5QòñƒùKæ!U5qc/¹Mn+ãA4K…Ç Q©¹˜£h*ÜUØ) U+_õ Î 3)x‹á&ƶµ^8zÌ\˜|0—ú¾XM +]ƒk16ÖN™úap0¸9Á©<êû%‹4š¨½Ð(ÜS¦š°?æ?‚x ¾b3Y¯J°&ÂóÍz Œ4Õ®p~�(ÂùCê˜õÊs01R£¼ÛÑT{ÍóÍÅ}«n£¾�y/£‡‹D®×4k]iæš´#Ü(òQ¡~†ÀvĬ[¨Ú"–o5”ª4Š\V¬‘a.†<�mKÑL.º‹„LK3y¯”cC±”ŒT �â _7%WeÔVÃKñj²¡ÑPŒ¿iœ¼fàP0ëÍ·ð}¡øŽ™è0Ò„\ÍñiÉBTO³ÅÓø¼Ÿ³9 YôãêêF8¢\ó0ÍH›öŠgi‘�¹a/"(€osCõž[õ]5…: QÔÚ‘57S”µÎ\|H߯ö`nÔ;ƒG.0#h]Œr ‹2×î—ƒ‘5ê'ŠŠ#áÚº”ب«�ÍÄꜚ¼ è«¡£šk{ m@ÜÕDÀRÍN_¸R„iÆb63¾V ù˜lkz+ÝÌG7Tp2�¦¡XÎÎXÜì+UoÇÔ4šŠ@S£:q (¡§L„Fc!J‡÷…®×4km‚T€FQK ú 5 åK ~bsÐÓ¦"þ5®”žÆI -b E[Í͸WDPÛæ&"Ã%YÕMÚ2¨xÿªúëà¥ÖŽë©…”iM áÏ7Жǀf3qqjŸe$:”4[Ìàd+CSQT„í)ÐU š›Š×þ9¬ M&ÞÒjAÜ,A±¡‰?þã Ä vz7JHôºÖ¸p*˜÷Â²æÆ½¤B.†Ë…<øè=�� ¸ð¬±Hm­,™˜ž'Ôœ4k�iòVÌMDϬLmû„ok ‘�´cnÚÛ—¤©¦ EØL„‘–ši‹»™‰ã"*äõö: á`sðK‰ -bjT½·±› ×ÊÅD3Á“�Úœ a72Ü@ëÖ t\+nbÙ<3íÄŠ Û\&V®ÒÚ¨Ñ'´«`· šŸLL“¾nÖ+¹ÑÐLmŠÍe½ ‹úoÎçZ¨*d.«K�h‰Š—Kh¥&*èŠY}r¡vf¯$ ±½)sg4gh” Þ4œ7ªiԞΠr9>)FXõÚ€s(Í…I45SCyov¡ÍØ€SE8d®Ñ-Ð(7»¥æ¯pBž6)P*8l Y¹Ñå¦bPœF†æb³™Tð¬ ZJЋaD©¦V‘Kµè­°"4 S+¹f©ið‡Ú�-ljSBdjñ–ËÄ�ך´QõMq>�Í5îuh4ÆLM„»"�/xãĸ>÷VØy…çQÝ1(» ѦØ‘›õ^cÍüÀ 1Tc¬¶þr3q¿¢Tí¼^®¹�ܬ_V_k.îZ’‰å=¡ª¾± wÆâ¶t¹¦dŠU¨�Ü\¬¾"«ÉÍ{¥|KÅðË?ÀÄD,¦ª±“ró…Â~MlOnÖ«œ—¹¤†q1ê iy€`´Xè§Ðl&‹Áeǵƒ+6Ó”0ƒ;h+£©™9>«S¬Ãi$0'¹™‹Ô–›”›‰çÙô*è Æ„]br±ž„ö µœpÿzM³™ønf†jÿ•œGÂvXaÇ\©-ä)&®Ë5Ùæêh2WàÚ:˜š:µ¨Q¦Ý{+–5y÷¨bÛ¯i”‹õ¢5dWQmEA�DËeêud†âµb=s™pWq�•6X.—õª-$êÈÁˆ5È &3A&O¸\*έ™zW£F{ˆ›w¥šÜûÿ˱b9(ËÊMÕÑpõëj*J Fmé,¼¿a¹FÉ5JÁ\ÜVŽ+aj˜=4jJ…™««&ˆêR&VùÓ*@7› ûwå‚Â,¢PQãC9}a¤š+åb…OC£‰°OÖ\äÚrmª™ˆÅà¸_q_9B B£©¹XƒÒÌT{Sqíbw£ºQ»Û_)ÉÇbyœû¨¾�‘èv7Â×ð}3m!z�‚*<‰Û ñ)ËÚbm‰3ê]%Vª†xpš·(Z¸W ´›#Í�Řˆ5gÌ4V8Ù[£KŒ´=Ðîö“šŠ½5ÔÖ®2 �›‹5Xdâi`rÃ^¥lp¥[͵FBÍ?¡èT—‰UôÄtrÍQZæbÁ†¿–'§‡¸ 12X¡�¯Z­l –ÒûošEVÔ»ÑÜøoåZ^¢Ý¶-$^ü¡².>µmÁø“¦´£pñõz]«Ý}Ûë®zM {LÉÛö¼5Ífâ¦eSMY8(ÜX(élªIè~l">ÎH¬«n¤¦âVUáZ¡È‹±f£ÜU¦mK`‰»ÍÔ; 4Ý·Êšhö+ÿõ„w3Q 6óx “0or¹àyB!Ð(zk„ »Ð(:ìpeõå¹�PÀއ� T&²,\óÍT¤ÃZB%$Ä [ç ÑT Î‚G7 ¨S&î«WßÀø¯Ó|¥F"OýÓÀàÌU1ÔÈö_(§·Ð,&÷šk° n½µšth4ýCæŽÈØ´Ç¥h\ÖøaBö��ôß)Ÿ±ˆÑ„À&½"•5yàa­Æ2m³™±ø0‘2™j_áÏ´[8îOû2þïgö™!xaw‚!@Åí”ÆâN�¿Ý”ñ×ÍÚj-BVÁ…:>³}ÄEãÆÖ–“Å´Ò[lþkcã^§¼ax¹þïï±^<çíOE'„sÞ ­DÓ¬a((:�+µkÅBè&½jNG-Â¥¦fâ÷ÅÊ/š­WõB8ùíO„“ߤ"Ì0«q¢fmù.¡ž4ŠÚM„SˆAý@pðˆ;ŸEÍb±/¡¬=n@œ‰¶äÂßGÐVþ3Ñä–ãï‹Ez7ŠUŒzßà�ýZ¯=é�µÜ„ó�„�ÆÐ,ZµxZLÑ„°šXPØL&S$H /N!íí™WMN½æþR'Ê[Ól&¾¡°!ÍØLÜña¦NÛÕ4Š{ùÔ_7ÊkÒ"ŒÍĬ3uêÉß>¿×q6šUf®ÎªÕé$TG¼ ¸V8ã¿×Q‚æbJ'4Êz]¹àï�½ùÛn­ÕÖ]5† %Â! †â‘‚]…-&b ba›êH¹L(Ì$˜pcó^ðS¨ò×ç Ga(&–¥3ÎVúH(õ&VQÇÍâ�”ÿ;n[`ņf½ªchÏ/øëã´‡åþéz±bu^LîÄ~ˆ•L5?¡ÑL„IÔðwý¨­—�kUÿ?h&’fñ'3±X•xØÜ_îª=ZJfªå±FÚ£¥d"ƒÂ¥µÄS"¥Bm(¬'…[Ê\c-ÿz[A ªK"©ÿ ÎP5‚Zñ⑤æâ yæ"éÊÂÃ�Å7ÑV:ýïÖÖŒÎO0ê]˜^8Oè¯zl¬^jÃi(öØH :i̶P?@n"î^öˆCñÑs¥)P70]Û†FÚíÿ&Ú�oÂÉ¡F¢‹J¦-ùó—Ži-�L›^f*œ±›õåFbðRíÐÂ×j}ÆR¡ŒŽ6i B,…™˜p)d¦@£˜ˆ¥¡d퀠·MÔ‹ÜTô7z ÍFbðPÌzM³‰6P“²‰¯ãšÿõ¾Â¥êÔRµÍ“‰g C•9¹¸úL´»ÍÅ -Æâ)"½‰ =e½ ¤Úב‰²¥êÂÜBµ>m´úõ“õâzZĉ«J ‡i·¾‰{< €°‰6\m$œ‹gd(äcáÔ›¿½­`»äbÉk�÷ß[Ól"rý„h4$AŠaT™Fï˜Â4û#DÖ\«� ÇÊÕ5 4Âh*ÜõO=0ªa¯8 Þ]ä­iÖ}‹·„ ™!Ú³Hq ñú¿¿ ´rˆÜ`öŠüÃo3–®5·[¹Ùi™P€›•C` ³ÿfuã2gW÷Íhž­Ü¼ÙÁÛÙÉ· æ9p¨{"œ@od°Ôýnd`ˆÿ£ÂÐ?,Ð/¨)ÄÀÈÐ`ƒË8Á—l†,037u„^�"CxY´*`:V¸eý[`#ˆ±ºQûÅ¿mÄßÝ Ýò…÷‘Ú­r÷rþZý+~5‡ôVCÐ@P«‡,Záìîè¼|½Î€Ú8„5Zƒßaþ ÝÜÌP|oÙŠÈ>£×pû_ Ñ|Aó-ô\#s„KX_nsü`>¾j ]ö…*¡Ú€OªšÊE�ç¼›üôXt-Y9�õŠȸ…õçb &py ùøzÎ/a(ã=�öŠ?Y�ð¬oÌ 6ªhß0•‹*ÏÂõ¡ùc8·ÐþŒK@_տ䡼?z~PÖH&0c8é=ˆñKJ:‡÷µ%œú(U%ë¨CmòÔc�ƒú‘N~ú”«__Æ=¨íìßW©rÒ±QÒ¥ƒ—.íŸ?‚ HN¸õ%\ýõI—@}�-í5€óMª°sѱUØ÷±e6õ¡œ‚ûRžèý}ÂrQyã¸Ìsø¸-S)�°þÖœ{Ò1HŸõNŒß=­eQ2žqC÷AãÀÂxúgŒ`ƒ2Gð1u“ÙÄ–/é˜ê/È Ô¡T`j/E‡Ž&]ãú[ó›um|tiߨÁtDéX&ºb[ú–5Š I�Ç$¦p<Wñ˜5œr êËù¥ c}ãüvžºm¯cźèXñ®:–”3’ENbiíÒÇÊÆ¡Ï:+NBpz¶hÞ•´—Ž•ÉézV²Á‚“¬[£�XÑn:¶¬·®½áˆÆý{½-Y¹b½ÄÊvS¥{\Ò=e Ò=m bS¨¾ ã¥c©pécié Q¨è&.}×lÐE|HúH¤ R.¾ú ca¶`ÜúÑþñC¸ˆ¬1l@Ö&¬p Z2ôØfÐ'hMLàÒ[g²©Ûgð‰H–b*¿`Cóðúa“‡Ñ C¡/ áÅc™à¬‘ðN°–¸ä­ÓØìó™œ}séâs&dÉqC6i ºGÑxÀ3ð;[;îMåYÀ$ÔM¦ü⃠±±HîÒZ§cYLožNç[ħ¶Íà£ê'«¶|‰ž5ÖéÒ—ñMJ‡æ�bЇHF¤ Å6=¬t¬r3{Ÿˆ�”WÔ¬S‘®¥}+|Ñü¹é*í¼±®Ãý†ù@ßa\‚úÁx�naýl)UÒ¡åŽì‚GÌ@É(i¨Go Gë=¼?ãÖŸ@zQɹë~Aò?ˆFóÍÀzp ìGy¢ç£Æ:*$¿¾©ƒY„טèÒñTHæÝW‰°€Ò9TŸÜœ6˜�ß:•ÎØ?‹M=0› )C:êÓH—Âz�5i¸�7–ߠб,’Ý›rÖìz’²÷Ó'xg]XOð.`—¹ô¦ /9¯PŒ9ïØA\Hæ(õ{�Åtd(²å1ÆUNÂòŒdþsz_R:°í?ë¨ðŠ lhþh°ß€í`ùÈâñ\4Âqa…c¹°ŒQ|Pòp.8sØ`� ÐQØþú#™Aº ëXXCÑeÀ–Â<°ai#ùĆ/¹ÄzaÐß°^a]2!Y#9ÔWX7\2ÒU)[¾äj¦@?alÙˆ²ñ ‡|ü¶iLÚî™l|å$è#ÈŒ#²³é̽³éìƒs©Â㋨¬³é¨ê tT9ÂÄUá'èL¸ŽMß>ƒŽß2™ Ⱥd�KhœJ#Ù&KÎsi;g²‘H—£±@ò5 t?å�ô�Ò:ªd�ºý+&­m:Q6°è=Æ7aœ>Ë€?’Ùàœ‘ 7q[`â¥GtÒé>„—‡2 h�!} º�‹ÈËú$ !‹"ýGzôƒ±�è4¦#T›‘½@ö•EkŸñ €Çú�{r^[ˆ€nÄë ý t`&ûøB²ò†œ*8µˆ,¿,¥rŽÌeÃòG³>éCéˆêñtƱ¹Tõ£ïèÂk¦´wîPKÐÓžºlxÑX6oÿ¦ðð"6ïðBØþÐÌ‘À³¨ÜƒóÈâc‹ÈüCóéŒV¤K @F¹°¬+ñ'${$™=ŠŽTëQ:ýñB:kß,*}ï *¡~œ‹d%y(~?¿ÔaØ>'oŸF§!ûŽôé=@éÚWéâ‡9›X?•Î;2Ÿ�©�Dù£ùs�ésý£ýÓ†Ò>C©È¢1 Z\rÛW´oæPЩ¤²¯è »LŒmñ8ô&â ·4Ò=n€­½�®Â%Dt%Ø ­,Ÿ©[¿²¦\úØ [nÉ¡Ÿˆ«ÀïÖ´·Ž â_ }ìÆÜä¯�í)Ø�ô#s©â«R²æÆ×LúþÙt@ú02ÖyÑh:ácü{þ(&m× *÷Ø<:©íK*ºr<]6ŽŠ(C…�¦bk¿€]?�ðÉ¢p Ñ·¢ÜõÒ!<’Ò!…£(¿´!J·°¾6*À¤øC N¦BúÛ%¢`. w$X0 ˲`9Ä7°¾ JÎnŽÄDä�VÖÞùšªïZŠù·{ølÑü*k|­¬íú†(81Ÿ�¯Ÿ ò‰u@r£èÀÕh,¶Bœ` èd·†�|NÄó�ÞáÙ€ù7ð1U“84lT®ÚÎ"û ûzc$ËÐ*ºh,pXál‡†ûÏx!Þà1cd;iM;Â(H÷ »ˆÖ/È$è!õCø¬XS Ÿ™”Æ/Ù$$»èo¸o©ÍÓ”5åŠú‡ß¹{g�ý¦\‚úÂz‡çÀÚaB G3ÉÛ¾¤�¬a;ç¨G:éÃ:ƒq�g’þ)h®g¶óÒÎH!{G 9"÷WëÐê Àe•v~˜ëÁÚ‚õ ãdž¥�}J#K»#Î�lé‰Ö�sX_ÙcÊá=$Ÿt@ÎpÒÍ'g6(k¤•q¾ø’BßH;àí^:6´+â!Ȧ#.懞~Àg0ÏHg�MFXx›y`.¬/°Ít(’Sÿ,4‡©C@÷>$<õ”.¾z '?=l2‡)ÝÃú*œõ­8´/·eý6 Òß¹9ia¤g|�ݬkI:é>㦰óÕ¥ÝÐÚDÏžN»Gõg\Âú�ßáºal<â¸Ihާ¥î˜AÖ>üNY÷ä[¼¾@�Åä�W6Üÿ–j}o¡Øñ�•¶u/äTJ+º¾â ,ƒá%cÎþzÖ4ׇBïB–þ`J\0¦ƒrG*�üõÁ‡ÃøD‚5ÀøÅ ½‰ùpLøP—®@Ü¢l²*aߨÁœOè@ÀŸ\Dú(à3LpÒ0Ê;v ¬)Ì×F©/‰°)ã;˜AØ2ñ´&¸è /§7}EÔßùލ¾nN‡d�&È2ŸZõ%›Ù2‹,½"%¶>[N4¿\¦Øöj)QuÍœ.8gŒtæ4Æ3u0ØZÂ=¢ŸÒ=ª^>ð*YqÍŒ.¼hJGUŽ|HºGög·�•7åDcÇ÷€g™„¦)tLýD*ºN�2ŽÎ¥ÊoÉéÚGK˜úöåLí�¥hìMA7`»_= x)UzÒa«9Ø.ÅVÁ$m5Àø}جÃó輓 ©²«2‹� ø2@.6¬S¨ù:’+XSÀË ÄûáïàŸ¼ÁçDü‰ükÉ=øyÀŸ@û¦eo!Á&z‡ܫ܄ô§cD_àtL$Âvaecé bŒ­ߜ᠗ï€OX±)Hd’òHÈøåGëC×–rÔ¡Ýc0þÃY§˜þ ›„�·àP> ûêø¨’/À·‹ý�QEã¹Ì½sٌݳ9à�ÞÃ' ¬ÇÆTOd‡q¾Ñƒ™äº)Êš«fÊ]Ÿ-ˆ½Ÿ6*ZÞ/!£ Ç€üYqž:à—%\"ûŽƒ±‚±Çëé ŒÏ#�ÿ–NÂ>}ð!e윃ýIØÿSö˜4ü2”{`_|}AàKAxñu& aøÆù dS?F”ƒŒe}~Ezs(Ä×™ô=ˆ?6aÎ<óuŸØA,Ò�|Ò¶¯è‚C á=ÙÔ-Óô;Qû[:{ïl*¢`4†øKHÆð¯R!)Ãi46H/ÑYæÐI�S1Bߥó�.¤[ ˜ˆÆ/ Â|�� ³�Ì#^.¡Êî™S‰ÍSÀ.2‘5¨’c†ÊÆÇ‹ÕWetêÖ/©à¼‘„²yAç¤4À:`«ï.%kÛ¿%êÛ¿£K/™ÁûNÎÅÆŒg ÷-¤ �,dr÷Ïc¶LlO#¹Å.÷ÔBoEùMSEcç7À«YϘ�ä&}àëðu°“7�¸¬kŒ¥ÂŠÆàu€æ°èÀÀ€…)¿¬alD•š¯gÇ>F¤sÁ^PÁ¥�î›EœZÈdžË„”�¥\BûÁß™ˆŠñ°¦TUàÓcÃWŒeг›|ôÀÇÊx#yGú|d Äáa½°® &ħoÕðõ¨Aà¯Á¾B¤ËèÔÖ¯°�¸›kP?60v(È&~<ĉ騒ñDéICr׋õì¡'*¢õíj:¾v¬…K|?Ú%¶?é€0ˆc€p:& $Ø-> ñèˆüqÀÏ!6Å!9ä‚3FòÑ%__á¿ä��ç²Gb_ŒWBíTàÊØ_î—8” G¼áзàÔðõ!À± oà[@c2™Io›�¸óÌ›cÐüÁßoÆ>à| k²wÏNÏäž:‘¨ºjFœ_Dåö™NN þ@¹…÷ß'øŸÐ®Áýìë§—eÊš[r*óÀ,Ò7w(Ø4ð]³›÷NØñ%·Ãì4æ’Ȧsi-ÓÉêKæd>â•ÈfS^àöC6%XéÒ©\õ½elÝ£ålÚÁ9€1@�(КGzk ^×È®QÅÈvUþ £Ê.ÈÀï…ñmDÕ8˜3¢ü’TÙôb±bÛçe6Í/¾ø:`Sàëà3b=Ñš÷Žø‡Aú–)p> ˜¯¦þ6d˜ ÉÁ|û“�<0¹Ç°Y»æp å“XÌ×ó0_gÒ·Ï„>b¾>DàÀó@‡"=L]D–Ÿ3% N,ß:ø)1WC¸sõØÊ‰cª'QÙ{°.$êî|Moé\I4t-F˜dè=ày°N±ÏÖ+n�R嬼‹…c|å$eÍ3ÛퟗÓqÛ¦X+W¶TJH?=Œï½R‡°AHGŒCk½oÄ X;?b⚦&&ìA¯ëó±�SÙšö¥L}çrx?Ê+qØPÊ=?({$âlS™¼óA¯R�÷—ÕˆcçÂ>WàglÆŽ™Êºûß*[߯Plÿi¥¢êŽŒLc–¼k¦*±Î€÷M ² ؆-8lH•_1£êï,¦ª¯}:¿'²©tÉ1ĉ°)õ  ˜†‡+¸ÖÇÖ06dùyS,Ÿ™»gAŒ†ÎØ‹>»fR¹gÐñm„OÊ`kˆ�*Ýu@¿r M0�`“À¯AzDõ§¼)Âõ!¶@;#îƒæÇ»s�á¾�ÿ!áp¤»8¤ÛA/‚ä�.:a„ýFA9#�ÒùçÓ[ºV).›ÓéõlRõ6ñˆ¬³UH÷bÎöôKd æL`ÙhqQÀæÖU���õ¶�Bܓیì4’5¬'ƒsGá8p{�¼ž°=®j�ºk:�}h®Z¡ç£qĘ12w,’<â˜C#n˜ÿ�‚ì¬Y¬KAw‚ýŒ€x¹ aðÁ߀Ÿãëq,±f2Uz˜Î;³û#¼cž;Éù¥Wy¡5à¶Yó¶ÐÔ‘LjÉdªíñzl?BkÇ®·æ%VVœËÄsÐ{PÞ‘§°^¡ÀæU¥4L‡wSŒ&?`\¢úCŒ•-8mÊ'ïšÅ"ìB‡ƒ�q"ðy&µNƒX›³c.Yyܬ½ù UtdUõ\ËÅ"šut®²ò¾Q}GNæ�G%×OŽ1îFxbf £ø´¾‘Îß,èOxWdïpÌ�@ú�i~²–Øòr)…¸-à]ÀC<Ä0�N¡Ý¼õ!WüDÀù)ŸŒ!Øÿ¿#>¬pÕ·´uéc±’Ÿ§áŸ2„p�ìgÃyá<[´vI´æ dÛÁŸ9 €£T‰5*dG���µ÷åÒ†Â1ð_"LEUßý–Í>±|à*4fdÍÍo”Í]K•5·å¶M�ßNߥÂÛW¯•XYXJˆ«Ûö}hG}>©ÖtÄ®6Zòëõ,–Oxï�Ö3ø%]‚±obç ›˜Wû&¡Ü‚û�‹~�ô øQ˜°|ðÝLcs¶#ŒÚ6‹KFü båÞj_ŸÖ<“OÝ2â²X¾!¾x­1.õ%él$¿H.yŸÔ¡Ø¶5ïà<ªü¬ûíýÕ¹4è©Ô3ÁÖƒßp3š3Ré䫹! Ÿ!®Êú#ùDr†ôØr¶éÁZ2²røR6*œú(T�ºXfÀ™;ð=? 怋+šhŸPó¥}tÞÐeœOÌ` Ù8Â~³È�* q ׈þ”³_ì_ˆo˜ Ü|»°ŽÀÿŽñoòîéXî|2‡‚a N)_/!»—’Eç�°¿?(u±íÕ X§tPüˆ?Áúå°*ö l+åÜrx€S#¬= écàæDÓƒ%LfÛLð?2À…7K+KÉÆõVÄûûÏ�øðaà~„_öPЋ֬»ÎšÕ¤dÅ×ë$˾[#Y·�’€¯ÕÖñ°ðʱTÒ·¡¹£ †÷ ó�ù+²™à/´eÜt€¿a_ ðrÄ#ظêI`3“ƒÝÎËÆ#þŽÆ…*:a¨l~º\±çýZ´¦¤ç­»æÛå˵–’²ë[’–ŽhœÿgæƒØíz R²~!¡Ý¢ú«B‹Æ‚¾ÆþI·Ðþ0ß8®á¸YÿtñÕ‡±b½�ýA:�ñ‰D¸c=„±Eñq)[uþ[¬s‚¯adºø¤1U~N8“Žì‰ì Ò dùqcì³�Î�ã¨I5G=L1¢[[(�½ 1UÒåé�ÓÙ¦»kø–'¶Ü¶–ds÷*eÍ=s2©u*¬:s×Leõ„ýΘ’U7åTÍÃï�?C¾Åº�v’�¬�×<™*8½üP|ÆöÙ|JÍ—ˆNƒ5¤J(G|4gàZUtîà‡v¾IÃ(W4.A}I{w]‚õÐÁxbÂÈΓU·¾¡+®Êi„;±Ï k×lÐ#˜sF”�ãRö΢_¬ ·½± ¶|\ ~i6qçWLtíD²µ{±åÉÌy‘;ùaèqK¤/†ã¼ˆð¢1ÀËÁ\ø/]tÄðøÐ8—Ðþ¼O:Âùa!öɤl›F–Ü�Ò1Û&)½S‘!E#‰À‚á Ÿ6œ»Îê•–’¥ËWKÖ®¶–XÒ8 ¸“lx°˜¨C<4´t ø°l dk\ýúb>‘wÔr¾@FI· ¾4âÒðî\ã­ÕTñE)‡lö½‡çŽÆñ?È别˜¼RÙpÿ;z답dë«ÕTÁáù 3Jf“ãä«Ïy‡ ä\}ûñ�ýùèšÉ\Áž…LÑqc.0}øÖlÑz" ÷aM>ºr"¹P€]Cû�¯ÍFÉK¨M^z\HÁò% ç"¹y:è*�W¬‡Ðºa+ÎÊ™â fªøF˜Oð¿³�s†t —Z? á�ŠÊ†Ô®.Kf[ç:˜_ÊÁ[ëÚê[‹ù¶;6LÃÝtùYèªí‘�½kø.q>HXîhÈ!übvTr‹•¶g:UrƘ¨ø=ÓüÚ‚m}fI´}X­ÜÖ±„Nk�1Â-¦ŸÂ-¬¯Ò#i™~x¦²áÑ·dMÇ·âe §øŒ-3¸¼= ùÄÂIؾ#[ÆìžÏ�2å²öÎÃ8ð²8·é{˜+²öê·LÝÝåtã­ådãí%0¿à{&‹/Cì†�©ŸÄ¦ì™©¬}ü QtÉ�J;<“Ì;5ë¨ìƒs¨Â3FTÖΙ€é06‡8à}$�«BWÞú–®½·8Q>xÄë�÷àõXòö�L0ågÌÙ†ö5TÛóuü�üî.†Ì=9� ¯GŽTúg…„­£¯ž5eßÇÉ)p á´^¦�^cÐú_Ä‹,- \ºp!Ÿyh¡*eÛ Œg²F@¾Y‹lyÝíåLÁœÏ1;¤_…X/W3‘FÜæGYyQJ•7âÒ÷ÌæÂ+°|�s¤J®ü’OkšÁç^9jLÓ0ûÞÁœ>ûأ˿>Ž}A™#К†c{Æ/j�:�=|txê:oÇjgûæÌ}'Õ‰[žtæ¡9ëV¯—XÙpœË¶åæ ¾¹}#³í�…²þ‚9誥s5YzUÆ$4Oe"Ñû€Ï=ªt`ðÿãx,šSÄ©ÆB\TY‰¸)ÂáÜ®'„rÛó¥ŠÆ›_“ù»fSÉMSÕñ‰­“‰€üádhéh*óô\&íø\´ÖGa•Ó2|^\RÍT°™S€¶ü˜Œ*¿h6 üy|â �À…€§2…ÇŒàïtý¥ô–ö•˜Ÿ4v.…˜ UxÚ�Jß7“(>2Ÿ¨n—S™'æÒ1�“@++®šRM¯VBÞÏFR¶R�gP7•…¼x~Þá…lÕ�%ì–ŽÕdá%#�ò@œb©ÀÑÁ—öq$vO;ápâ¼쾓͎·Ka-�ùgRaõ㨀¤!À5�/á8p@îp¬‹ãê&+k/˜“[ž.y·@xÐbÅz‰¥‚—ذȾ#;Ïmޤ;‚p:åÔô;óŠÙ¤âI`»pìrË çÙE&çÐ<6ëÈ<>¾ùKˆ þLÃ@Œâ+h.!W tàU(²�~Ið¯ß-fT‚xôÎélÁ Ð\4š§ ”á€k1Í9 ÜeÈ.ž…ýêà7QÕ>^C¡ù`bj''_äûØ…Œ³÷‹ÆEf�e3Zf"mºæVÙÚ¹Buô¦³ýÅËáÔ�§ ˆSm°PHÀ6a¾¾�保¨Üƒs§7!›ž¯¤¶>XI6Æ1ÿˆâqࣣ|’‡àlö®ÙDÕe3²¡c1�ø+Ž %×!>}xð EõM3&a»á�4Pé•6ÉÈ$*eß &÷À|à tR-â*SÀÏÊæ£5vòñ ö. +ÎHÁfó)m3û þUÌi3[fRµ7su÷V±õ÷V�[âøøW@‡*_,avtZ“ÛºWÁóÁ k…jx´”ÝÛAA&^cà?B²ˆpÛ|&wçàÝ�» y‡tÑI#*÷À\:e×W�#Àç�¢£JÇaùÏ=µ�‰n˜rú¸ÕܵšÎÞ9‹‰­›D%ïšF% uV6šˆ.¾È…!#ÊÆØ:éCÌŒA¶p»µcƒ°"øž”Œ«äÃîù¤‘�#6#Nä«þLÚaðǃL©sÕ°<²d<�töS }Á¤ì™ÁÄ«s>€§fG<çèB.cÎátÎÞ98?â GÙ¢q*ˆïAl|�«À%5à¼rÄqÎmæ§ÙàS"½ûád�×€ÞÀ:8#|¢«'ò¿‚¯–O(�Ìeíœ ù½TÙ)SŒ™AV·Þ·`övŠæ‹qŽÂæ¤Á�c9*ØïXs÷kð™0ÉÍX·'†õ•¶kÎù½|Éæ�»W9 ¯U„yÁ'NYÀ&nQ¿SÂÖ/©¢ •M÷¿WÖÜ4#3vÏ ÃËÆ@NR2šNCÿ®¼lŽã? 5S ‡“KÜú%¾7Ò� #"*ÏI•åg�°ß$­m:ä‹€ä„É>4Ÿª¹ø Ÿ¹k.Î郗¥·Í@œÁˆMi4€çcŒxZ‹RÀ/xm@8%ðîÈŠqðÁ9ýEßÖEú‰‰­�qOˆùQ®ØîÓ^¡ýqnkLÃ$ˆÑ÷!“‡à¨_ÚûͺÀ“lì\u”KÇ·0ù×Mw0ÑM“°möI‚ãñ¼—.Æa›#qÈ‚¾RçK$a/~ðVð¥¦ï™…ùFîáy�÷ëtĦq%ðd¯@>¸¼#Flöá0·³†X=‰Öø1!~ þBÈñ?RË4삘)Ò½8–>,øÂthÚ¬GCQ? Ö 2ZpÔÙÄYØŸq®ä-HÆË'c}]x”-:d’Ÿâ3¦p �wh>j›œ òÃÈŠddóÓÊÖ§ËÁJ%o›J'm5€<+ðõ(koË™ÜsFØ/�Öäë߯87g÷lˆ+î}CÔ^“ƒnÙ†ý�/‚î1ŸIß�óe!¾q^ði@>YvÉ”l{³VQ×.gsGŽî8W|Š»†õΤï›ÍFÕMd³Gr%ãÁW„ÖÀ Š.ÂûFpì?´b“€ s™Ûç`Û�ùGÍ$üwϤA´G þàu÷ø��‹~4…�‡:§ÞÑG|K¶v>ºà3Vnލt ï«„\Ÿ„Át|ãdªð‚1YqÛ Ö‚Ò.Hñz[¤cCn.à/‹ÊKÇTM€¼ºà¬‘z Ê&€MÅ}†¤œ“ ÉÒ;fDõ]ìæ�n¹†ÒfdãÃ¥DÝ�oÈ’Æ8†ã�³uö BLâŽà3NiœŠñ²gDãíïÉÊ3R·òIʇŽ…8?›`øÓ¨¢³&DÕ53°ýDÕ%YyÉŒ*9lz™¨FzÛ:d3Z‘ÍÞ5cZd³!ç“ÉÚ7Ûþ–î5ŠæŽÅTZË—p-øõ]ßBLŠ,¸düEYs_δ<ÝH¶¼YCÔ=ùË}þÑ…dÅQwçd³d ‡!ŽŠø±)ø¼Ù”íÓAÿ€Íá2Σ‹Ž.Â>Ð-Ï–Ó;ŸXµw¾&3Z¦AÞÄc�ÍúØÞ!ŽM4½ZFly³„*º)…qý9¬TÑ2´l4Y7žNÝù¹åù2¶¹sQwÿìo„}]ÀA æ xü‰Û H¹% Ä{UâwMãb·N…2ˆ»#Û¾ç$ƒÎ;ŒpÄ)CŒ9wÐI»§Q9‡ç(ËÑs³†W�U� ¢ëÇ“ ;¦*Ko™(wþ¸†Üý~£íÎ_V*ÿ{#qþW;âÂçMä‘4¹ýÇuÊÖW-WÒ{_Ûr';]ùó�ü¸:6SǺ9ªùÍjºòÚ7viõ3TÞ‘ƒÀ/�sWј‘Ùû�L¢OÞ)Cº±c¹jû#¡í»©éŽÒaË-¶êêb�A>(´*¦�1ðJ¢îÁ·àŸaóϘ@^Qÿà[$Ëf˜s"lO·¾\Oµ½]G5½_I5<_qø�µw¾Åz®©k1ÙܽR±¥ó{eå-ì—¦ó�/ýI´¼X º…ªïZ‚xÅ ¶õÑF�3.sÏ\ìKÅù¢û瀃Ÿtê®dÑÉEdù ™²ùå2¢©sÙÒ¹†më´dZž¬'·t-S6<þúþ軲öÞ× ' ×Ä–K w„ÜþÖ‚ÚÓeÃzÂP^*m›Þ}¯¨yöµ²í·UÔ©7vìÕ—ôånoîT—+uèÅìAt-¿¿ÝŽÞש`÷u¢ï=S²‡;ìéC¯(¢ð¦QxÍPYùÄܦí§Åä‘W4ªÝ“?òÀ° ¿£]I¶¼]«h}¶¸ ˜=¡q*U~UÎÕÞ]ÁzÆÐûÞ(¨ª{_ã|˜´Ö™TÃÓeŠÒ+†„_ÆàÝdC×b»ƒ÷œìö?p&›YE\6dSÏf³N/¼MÕ>ZŒcZÇçƒ=ÆþNçð¾À颫2°¡‡”ß4g3O,€üUÓ#+¶éÍZðAQig"þ4žŒo�L&nŸªL92ͪú‘‘ÕÁž•ŠSÿVç~å•—ÿé@^üÕEqã7ÙÞéq$Ÿýży™N=ý1†¼ûÖ�¾ôÞ ÆNuçV"w·=†9óÎ…<ñ‘%O}à¸3�½T'zÛxà¨jn·ákî¯äë­¡;W Ýó Ì+Qpr>Uÿl ·­ËÚ~Û#‚­¾ŠÍ>¹¸¢}bí4>:‚}@êH»¤–L1ÄŽÏJ›!yûât`©]/,©Ý¬éÃÏiúðS†>õb{ò‘+sö¹ »óA´~\EÔ=þFÑüj ½ë… }à9E¡9Tøh©ÜÿËFj÷gkbÿGkzÿ ’<ðÚ–>ö”evqü‘v'û³×Ø£÷ì©­/V)~«Üúz)ú,™£ ~0¹#·½ZÅ4?³€x-Óöds£j{;¡Ú}—¡šÛW[:—€î£›�þ«ï\ 1 eÓËÅÊ–·Ëlw|ZAn¿–ÜýzƒrßÇõĞψ}Ÿ-©ãTô©wH¼¡‰3Ÿyúü[7öÈ«Mì^ôŽûŸÌ‘Ç*îh×&úèSŽ<ðÊ|̶‡~Ù 8üËF剟HúÂgWÅåÿØ+ÏüÂ0·žq·îEÙŸ¿lòÚf~ÿ=µ½kÕúv-ô�.¾` ¶Û„�ˆ³ŸyæðžÞòa�tÁ¦�×íéúçËm6yëZ;é)}s†B,Ôîâå0Õé;¾ì�7vÌáw*nÏ –o{FðÛ“LS—Ûúf#ÝòÆ‚Î:>�Š(Kg˜E–^—�ÿ=S ø…MGë¼ðº”Ýú‚mz¹–Üòf¹mÛÏK5ä6[ýΦíß‹­.÷(m:{<oÿ'”ûð0—ùð*CÙþ³Ñõsõþsùþ×þÓõ|§·K=žï®ä>>Êcß¼ÌVu?ηu»ÔíùÙZþѽ4ŽùÃ/›˜ o<¸ë�#Tçžø³ûŸòª}íöGn{o:w!ÌáØu?îà•²õ畊ºg_3;_ÙªŽ´»Ñ{Þ)‰ªrðÿ�Ϙi}ºé!+Õ¶ ‡½÷œív?Pß$›^¬¤Aš»W“ûžÚp‡;íÙ³=ø³O¼ûÿµ^yìgyòƒŠ¹üÜ�¹ðÚƒ:õNE{O3§_8ÒŸ{P~t&/p¥n¾ñ£n¼ó¥®üäN\ú—3ñïvŠs?3Ä¥¨Û¯}ùç·2ø72Ù{·£¨Ó/ÈýodÛ§µÊ†çß)›\ë�:ØMÒG_pÜ‘Núàšj{¶NÙÒ½œi}f©:v×ä[uò¶'³ï)Eî}mMîìÞÀì{Nr‡:˜SψݿX(÷Þ@ïy®$¿°U{Mgß«È ¿8Ó×ÞøÒ·»¨¯}¨»/©{ÝþÄ™�uä5¶‰8óŽ%¾T(�½W0»òb§õøióª3ÕîÃ�bîÓ“|¯ê¼—áðúj‰ÇËýuÞÏvÖ¹½:Tíüþ\%ûñA&÷ôn*{«=Œ<ÿÞž¾ñÌ�îzoÿæJ‰Ó»³žÏ÷Ôúv5U=®«~X]îßÑPåù¬­Üîã…êÓÛdEûï^6Gÿµü?\@á(6®e*Ñør1¹ý£½íƒè6°]ŠøÓS­?˨KŸÜì_\)p|~¡Ôáá¥lçîSNÝç+˜û�‘Š«¿9l<Ô³Ô6åô4§È¾,ì$$é¢ÃÆîþ’;üÈѱû|¹÷ó½õA[·º?=Zg÷øz&Ø5zoÁnï°f£qúáF°ý£ Yªówè��VüÞ§,èúEG¢×ó¶J$s•µ7RʳnfW€ :¿9Pf÷ébÿãåÇ·GK£•b™l»_vàf\ÙÖIå¾]�<’[çׇËÜŸï©ä?ÜËç>tå8½:WN=ùns¤g=ÑöÛjEÝëo¨ä3Ém?¯±?ÙÈŸèvW¶üÏ eþ�…6%÷*NÿJ©žÝÏré>]íöâD�Ý»ûÅÌÓ'‰Ü«Ç›Þ\+ã_ÝÏ¡®w{+.ýhg{ü_VŠSoêÚ3/êî³ Eû¯nÔëGñ0'N¯N”³nEYþÇjËæ&V­åþ{ñÆ =ël:ÿåáý´¥jË�ÄÊÚ»IÕ9íµIíùu�]�u.¯Uò?ß-â~z–Çüø<‡ýõYŽÓ›£e�5Ïv”;¼?^lûàßnVûþµœÚõ³%wø²óW3™GçÑWM»RmoÖa›{ð)ÏìBøoçS¥]Ë#ßðÜ‚®½û=QqMFlÿ¼š;÷ÌÛîî­DþÖÝXæÄ[Eë?–)J®/Ræ_^`Szc‘òä'%ÿðV’ÛËSµ®¯Oרºoå²/ÛSí>Ý* Ky˜[Ÿü0·®á~BUêÃÜ-üÓëéä£ç�®•&<)lLœQQü$±¢å~\i[{Lñî»±%è}ËÒïd•çÜÈ*˹›Qú¸²bÓÛ£%ôÛ·ÉäÍ>Ôé�ü©'^ü¹'¾üå!Ü©'îô�.’ÞÕeÍ~îȲýÔNÿò*Ý»kG�×¶ß®íõÞ]{øîYäõŸôP>õ8ZÿÒãoýïž ú×û)ôo÷S”?ÿ»ái·¾¬s–Õ¡žÕÄ•;q×»"ìÜÏôxz .æAYcÙ�ôº–Û‰UU[ø7÷r˜Çñô£‘ì£{ ü»'ùþOšëãî—ÔEÜ«ªÝ})©üØ•¸’°ÇÕHgŸ®R}¸SìøæR…ËëÕÁ]õ[²em‰o/®ózÞZIýóuÙÝüé@ºóN±Ë›#•ÞÏÛªƒ»ªª*'V¥>Ê®e~ìÊ"^ÿEtÿió°ÇqãÕž�ë~’¯/¬¿.Ǥµ×{–Ú¼úm3ûû½¼ô»Ù•M×K‘Ý+Ý}5±4õVN‰wgs‰K÷®êÃÇdúñÛêü�ÎÈŽ»Òݱî/ö×$?È«;p9¾ôÜ�è’×Ê÷]I@ßM(=y%®tëµä çWÈÆ¾¿Z ö5ënvÕÉk±¥¯Gµ!�uó^xÁ§Î�¼ÏèséºäGÙ•Š}Ž[û´ÇÆú·ž ×W{Ê·=‰­¼ÚZxâIdéá'‘eù�© ìo·sÙßîå€=tøt¹ÔöÃ?‚×�îY²1:Øj7_Ýö�:ßÙróeÓ¯¿—ÈäË$Ʋ¥CÓï$ dK$†2KÉbeLŸ•Q'F¬lýß9«õ¬"~~{«¨dë¹ôòÝ?$—_Ê*¯º�YÞt)¹´ðbNEÂ>­UÌ»·™v¯ï»=ß_…pQMá­ÌÚ-WR«¶ÞH,ß�pCÅ�”*Ày¶ÿñ´û|¡hëÝøòsH¿�ê+Ú÷,¬pß‹°búßO26ìøQjV:|ù:V2o’�dšÞXÉTÉXÉ$É(Éèc€~ŸÛÿ É¢/fH–-c%k¹(�ÕªDݯ¿%%3GL’L”L@WM� Ñ+®ó…d¼ž�dRÿ™ƒQ %Ó&™JæÌY,‘ZùJ–eܳæLÏ7î÷0ŠWÿD\éqb®üäkß}­´íJrå¥+1ÅW®Ç_¼YtòZLIý�ÄŠŠ[©Ué÷rêïÔÖ_I­Ü‹ç4±´úZZeñ�ôŠMïN–*»%ß¿Kˆê(ªlï -xü4$­¡å¿ß'Z<é±\³ã÷…kbv�´o¾!öÀØu¹× ,vül¸öð¤G{¾¶¨|4s‰�»dºÁ"É´ñ_I ÆNGï0F2D2H2X2@2}†¡�“Œ–莑Le Ydf-ùÞ¾HwIèéÁKk>M^ÕÙ³ÚêçžÍ6¿÷„Û}8SÀ¾{�Ít|Jb;ߤro^丿ÜS™v?·ºæJjYÓÅäÒ�—“J‘^,k¹”R~üzlé7¢‹·]O,Cú¸ôôå¸Ò.Å_ºS¼åvbyÙÝÔê®®àÜž×¾…??¯ÿý}@ŽWwcñÆöx®¸Ü#]žüèï¸ð>F_/—Ìši ™¿`¶d¥ƒŸÎÚ”íc-’ZF¯t�Ð�1Õ@2\2TÒ_ÒO¢/ÑÃÿé£÷ÒEÿõ‘èhþ­‡Z£·ˆ®ê‹þ¥‹Û£ÿ¦ ™#14f%ßÙ:+öõÌcÞ_M*=›SZu:»¬ôbfiÅÅ̲ŠkieU—ÒË·^J)Ûv1¹ìÀ…IJ3ãK�\Œ/9~>¡d?Z›û®Ç—ºWvåVTqƽœú—îLæ§Ç™ÊßLyZQy¾ Ùàg!…�qk^÷lüÎÎC2{Âl$‡#Qÿ¡oýP¯tð[ÀÜ Bèi‰öð÷?ÿO¿ \ #0DÒ¯Ïôs¨¤¯ÎPô¯1’ñ#æKJ�$+Rï�µùˆìƧžX¤£œ¹÷]9žOwVµ]H.»t1®¸åJRYÛµÄ2¤cŠÏ^�)J¾›WåðöDaÊíüj�Íc—cKö_‹+­ºžRæù¼µŒùýiýÏŽ¬ØŽüêû/ƒò‹»âJ,ÿÙã½¢ü‡I&ß­— ƒÞ¡?î_ÔCø}z§ÑHâF¢ßà÷>y›?ÿ¯~»ÞïÝýs7Ýo Z‹ó¾÷’,Éz6fåîž¹?ö¸ÑÝoSU/îå9>=]âþtGyh{UUØÃòÊóç–E2 sXu9½æñðùäòs—âð¼�.=~1¾ìÉõØŠîÛÑ%ÜçëÙè~.ë»{h«÷=^¶¿õ„¯½Ñ³êë�.’h†þÿþ¼£ŽfDàÿõ5c6¶ßÿÇÞ{GE•mû¿‹¨D%" ( Q9CUµc2ˆd$KÎ(QÉQ²Š`¶ ­v›m#Š9ÛmÛmê|B÷¹·Þš‹îsûþî}÷wîïýçfÔ((¨b‡¹fX{Íïgš1Ã-tOGë ïNp{­ô¤¿¿••r³{ÛŽs•-‡.”´ž¾TÐrêbQÛ©«ùG¯å·ž½TØúŹ¢Öó ›·_«h*­kÛ6RÑZ{{KËîQ\wÝÎmÚ?’ߨ=RÒ"úI™â~^¹Â­ì ±SÄfÕE W Éªˆ j‘½øÏ6§Jο±Sxþ?�aÌ5ñïÇ‘±76UÈ÷ðÚxü¥ƒ½ªšŒ 4f"sSWd³:­îWu¤t§~ø:7ø›Ok†¯6Ö^¯l‰y¾»êá„Ç}-�—A]‰s¯æ ü¼ù~skÔËá&x}øFAãmœ³?ºŸQ?–ëfÔu=(l}{¬ ç2§ôºq–f“ÿ_Ͻ:~üùXÿx ŽWí÷ß�·&93Úø i㯠dôŽyÔ1¤öû±j‘ñg2q)š·*9l<¨á¾_i+ùF™þü“º¤;­MW¶;ŒÜ×|ÿbÑŽ— ZâkøèjÁާ_õ<½‘¿ãþ­ÜÖóW Z±}¶œº\زãjY‹Ï¥|Éz9š¤gDÆÖçþ·ÛÇùßmpLZ¿_SMü5žÿü…c¢¡š>G‚æ:¦¡e².•µ»•–~?(#ÂØÒ}¦¢åàÙÒÖ³ŠÚ¯\*ÜqëRQïÈõüîÏ/¶¿\ÐÜ{¹´)÷vc3<ŠFk›q|oj½SÜöúàvï¥Ïü9Kÿ×Ç1æ ÕÈ>«ý險üþ;mü[üe 2MR³DTLðu2Â>ÉÇøiÈHcš >é«Y#­h²‰'š·¾9l¸ átI¹ˆ{s)ç-M8@Lh.¸]×*ûn¤:ðýÙÚ˜§;›°�i>�}e/#àk 'ß…}ëåë9MÏž¦7îÇ5gƳÆ¿_”áîý_Í^í-G“Õôÿ/×ý_ ?ÿ/`œêa¯Çd:~š¬¿ M1v@fF+‘é${db¸ë-FÆã!C�…Ⱦ×^‚Ltñß™8¡™KÃ�}à5×a¥�à•2*âÉÁ𨻻ê 7;r¦´yŽ}/¾(xv©tç—× ûÞ\+Ùõí­Â�ïî ¼¹Ÿ×ûìNÎŽ‘‘¼.¨»œo+WLPûÿÆ?þááø O�ëeªa… ÔMñOðU„È�㧪9ö%ÓÐ$ud4n2Ò²EƺKÑd W4Ýç~îùh)×£²œïS]]ý��ß�ÊPþ› yíç*›?ù¬¼ãÚÅÂö[— ÚoQ¸ãöͼök—óÛ¿ø¢ ýȵ‚æKØŸž»–ׯ·Ü(mry©tš·Èé},øMðÚij�ûýûñÄ�hýþýD|M5f )ø:™Ù! ;df±™ÏrC–ÖBdf-Ff3…ÈÔÜ Mšî…,æ°ÈÖ§­Î}®çxE¹HöÕ™¼†3µÍ$oùbkóÉËM87ki»^Ò„óÌV¨=]Âù ÎÅnÜÈm~ðE~óWóšñ16ùþ¬ Y½MÕz™Ž­ÿåã?9žxuòý˜ƒÚ$™€&©NFfÚ6ÈÌ`2Ÿ¼Ͳ•£9+ãÐ »üˆFæó¤È|�&ϦÐäi4ÉÔ M™âI~·HÔŠÖä=ÐsûJéáÿVúäHyÂí¾šŸU5ßü¼¤ãÑ…â×/íÀ1¾ýÂÕܦ¯næµ½Íi{w?«ýýƒœ®û7óv@Nêý«Rn½<àuÍ`ÿ'�mÂïÙãX̃±7ö;=ü[d¢i†Ìuf!3ÝyÈÔp!öÍs‘‰�-«�™ádj´­#Çfa„,¬ehÆ¢X4×»Ù…Q[µíµ�ã1¥�óuå ÿ‘‡* ýülIû½K…m�ðuº7’Óür$¯ÆÜ—rû_ÞÍë}ù(»çÊH®%*ê](×Κïõ¿¶Í±cEäúA<3T5C†j¸BÂãÊ�9cµiøµiH_à øa4ÎMÒ]€�m)21[�íÓ Û¤?š²4Y®H@Ó�sÑ,ÿ*4—ëDsén´$ô´êší�´~D¹„ys==írÏö’/*¿¨i¼�s¯»øØNÜÈk9‰cÜÈõÜ–—#¹m¯oç¶¿Íi¿øE~kò½ÎF·+ÊÕf¦üË×í�ñþ"•±š)2ÕœŽ�i ¶GcüºŽØúc¿Sµ@¦Z6Øâk§³ûM;dn²M›A!ëeÑhöº 4Ó½Ír)@ÓÖg"K·Íhª[²5¢Å�;UWU¼˜àxJ9WðN¹�ýEÞ¦ë=5Åë?;±µëîç¥=/”\¼XÐ5ö[í)O:Û/ã:áÑ­l2)ýî\¹ã!å,3³Eÿr,W'¹äˆ8z©ãX¦c…}¿52UŸ�ýü4l‘“ˆmá/cU||ÓÑdkd¤3ûFü˜8™cÿoí�¬lƒ‘ÕÂ4}I š¹6ÍôoDÓ½«‘mÄAUû²:ë*g¸¶›óNßÌiüênfÝ÷²:ß=Ëê¹u/§«ûfqcÀ¯ß¤ÚJ3þ¯×l,þ�Ÿÿð%c¹°¾Z:x¬ãkhFÆjS‘é„EäZ™Zº`ôAS°N]*GS³Ø§ø#ó™ÞÈtŠ2�îŽL¡ixÌÔ ¥Ñ‡Õ–o¬ç0¤4[?ª\ê4ª´þô[LÄ“¡­W«:/•·`ßÙvçÒØF[ŸÝÍÝñõýœî7sz~x˜ÝýÍ�üÞW£¹0—Ôäõ\)°¶Zù/]7µ?ùÇ1ÿ¡��gºs‘ÕT'4ÝÊ ‡#2›æ‚}Åzd2û�ÉöØgâq†Çš…Ùd>e²4uD3Èrƒf,�B6n…h¡¤-Úp\uiÑ­ñKêži;œTN]ÓÿëçËÊ¥¯•Éϲ_ž(+½ÐаílmÓí‹¥W/ç·žºPÔ"ù%Dð¹Ò;à(®/.ÿÂ}ù¢(à•2Öý¦r�ã–«F¦z3þÇã‹mZ$;/©M²,ˆÐS�¾N& s�g-‰@óÜ3Ð,ûP4k®͘¶Ybinh‹ó–!‹)+qN)@Ó0húb)ší”„ú× …L;²Ûð™ÚÒºWº+?UNqz§\ïò•ÒÙÿƒ2BðFÍ}û¶4òÙ�ú؇ƒ­a_mŒ}²§½ïü–öî [ÛãžíþözsÁƒÆ¾[·6o;šY×y½¤Ùó­’^â›ø?›&9=›'"Sâ?tHίCž!i¬a‰s <M‘¡<¬�±¾-2›îƒ¬×ãü8ñŒúÚº·“ÖîUN[ÿ™ÒòÉõ'•sÖôüÃÌ¡é�ÑÊí¯ VÜÒ]•~rüÚÊÛNÇ•s](�¾W& ¿WÆó?^- ~û鶤'�MPÏAM¹æI¨]/´|~-·qäfvÃÓ9ÍïGó»ïßÈë ~|šã’Ã|ø÷Å6µ~�å`Ÿ�›Ž3G ÑŒù>ÈÖ#ÙЙhND=Z�s\Ý¶âŠæÒÊZËJ®Œ_”~J}QîY�åe·´—W=Ó]^ñHwyîµñ+2.Žs(Õs>©´u~ \³~¿ÒÚ±ö™‰Ë°rŽÇ¥‡Ï#¥Ä÷¥RêûTÉ‹?(ÓÓîµ5BÎǵçÎùwêÛŒyù9#ÐÓ�ï{ÊÓÇ~”JNYϧ©XÏYû?Ø¥*¹fà×'™â|x²#2™æ†Lm„hŽs"ZH•¡T9Z$­CË¢÷ªÙ×Þ×_3¤´\_Ÿ;ÊåÎw”«Àÿ­®~h°"jPm‘´ Ù)šUVÅîÕX[0¢¿®â¹‘SÛO®'•Kq~âéóe�èשÜ�W‹}¾QòžÕ7-}›ŸÚ·_µ¡�ü&äo~“,ýüç ôÁßü%ÿpâ†ÿ=@zâ—`îôÁü±7rÅÉ{Q²KÏ“`½“ÿUe€£¬ZÍXíŽ{0#Ípütœë/ES­Dhúü dmƒf»g"[Q)Zà™‚®�Bóíh4g�²±qG VðhU­²2ùä¸U›¯j;÷ÿÛ ÷»Jï‡Ê¿7Ê`êÇ_ò"¾Ü_/ýáZ¹øçŸ3$?üšåó\Éyþu�wÏë>û”v~#J¡à¦’�*ƒ%�ßÇsOäp_Ý+ {óYkèës-Òᆲf¼ÏÝPÊ%w~ÝÈ}ý¢¤øîö®Ñ‘ÍÛKFk[]º?LŸaµâ_°KU¨Úpî�Ç>N#�™ÈÜ|šµ,-õˆEöT ZEç Õ1]ê«®¬ÿB9ÏýW¥H¨ü°IúýéꯣYÿþÓ&ÉßïeŠ~{šáÿwåF÷_”�”"Ÿ_”rߟ”aì÷¯Kü^+ƒR†JÞ+³¾VÆn)9ÿ3JOaÓK[aÉaKAß7vâÑ¿‡3o¿-§Ì½TFûÿ¶BXqÌJ´ãÁrzèOæÓœ¸íæªî̪ëì æÈýéñk2ù­«ÙÁ�.U󧾿º?¸² £ölÍ‹ØãOÙà§çªåßܪŒ(Ù%«éÿö¸´±_œ f�&Ž·D†úÓq½MŸçƒùe"û˜êö[në®9ðoS]î(Wãñ$ð<§\ëYzÆÔ3¶O۷਩ïy¥;ûôvVôWû:.mcß?)–¼}³Ùÿ²R ¨l6ÄoPlJÑä—êû¶·ö½ªôæ_?)åž<Ï–žê%’"ÿ� uáÞ¬£öþê%I¨Õ—„di° WòG¾–ÊÎ?�åξ å®>‹‘ÝI Øó~�dïÏnÔà+z×wnü©¯Bè‹?†øœQ:ºnÚ£3}Î:Rgÿy3Ä1cÁ" ZÅUª8åž�àzGéèó�Rðƒ2É÷�2ûk™Ç]úÇŸ‹èŸ?ûbßàµyÈ`¥£Z±j òOHÖ8úÆSúäZ~âóÁ¾Œ§í=aoŽ·Ðß½/Œ*yïÝß-ô©¸`é÷©ÒQp^éïß÷j©°áôlá§¿zÒŸ}ÉRŸ¼ �ú›•Öf$LRó � J£Ft’@¿ ×’é|¼šÝû³¿â“4ÅåûiâÞ«%ñ[t2: }“šu×ø%¡éfv$F«‘ùt•ßíRMTÃqmò24Ç^‚V*ªU[¾™âtF¹Àå‘r�÷_• ɯ_eÓ¿½,æþö¨2øýÙF¸÷ǽ{^ hMÂ�q®Ÿ(ç{}«dp}¹æè¼ß+9ß×J^x_äwð¾á¹^¾AÈÓEŒDAˆ£‚TC¢³tC {gó­7×rÕ'lý}EÈ~úä0Ó­�ÇÜ)ÈÝÙQíí¤çndN¿âÄ­—–ÐÉUÈúóá·¾dMtt®š¡ Z²|Ï+7¾÷µ;[v)Ó÷ÚE¶ÿ)ÇÞ}�"½ú4‰Úý7Wªþ¼­øÈOÞôåáÌ£7©‚¯•aî£J§õ[o®ŠP[¹a�úš {4œ¢‡Ç¹§Ÿ˜àVxÊÈsÏO¶Ì‡÷E°'ÿ^ýêÍOÙ~G•ë…m¯ ~\)8ªt úu]@Z‡Áš5Žh‘Õ´ÔÜI<=PH\¢vÄæÜIa9åS O,àÈ�nÌ•—Q²ÑÑñ§‰�üÅ[¼ÿ¯n’ꣳ%9U†TÝîÙô¡'²FóÌ·¡‡~sW�›Mo˜, ÍÕ‡¦jH¢’4Hß˞ׂ S·/>L£Î¼gE-7‹ªOÎôXáßõv±wÁqgY¾êbGš�có”ùëÑ §`dR¯â´í¾©ûa¥­Çå:�‹øqûý¾og»0òHnÖö/Üe°}hz@uŸ¥°ñàLAÿ;ÁзâÚ³s©¬¾Étj›—Ù=™ÉÝkÉdí³`âªô<]¼�ÛšuHä�ã•Hˆdò`U‰"X•)ê0·]^"n¿´T¼ã’Ýöé2ÉŽ Ë©Ýo\Ø£/9úó/y²®rkçt¶°Ç’zï!?}ocàÈhaèí Õ�7¯çË/ÞKïýà}Tv£± u‹Žwñà$÷­gÍÖ…–©-XM¡IzVÈh<®pj³X€œò/Ot{ªtõþVÉÒ?~WD¿ûk¾è‚’ اtæulÀç2µTORz]Òk‰ý€:Wª š‚~ŽnÈ}¹=ò_ï†x6šô í¸¢=ÖA “y�yâß`¿ÁwZPí#Ë©Úã6Låá9ì–#s¤ϼCïʹÖ.{Û$èÁ`ªÌ¡û_93�÷×Ðu§Jvç"þ’‘}{¯ZñôVUÀþs’õš‹;G–Q§?°�O¯W½¿ÒÄýò¸Rü«2SôWe*Žgq^¯””×1åJ¯ô቎‚ä!Û â×ùxûä›Íü­WiÌ©Ÿ9Ir«�ëz/$#Ò£Qñ™ UuÊÆ[,G+gÍGëæ-CþÎN(Hª–šg‘œg’˜?Q‘U;™îþb5¬óåO> ¢Ž)¢†ðíy½NRÞoIU [3^ `]­dßÏ—Ë$ßÙÓûþÍWÔ:º„ÞÜmJÅek1Y�“Ä}�W3ûÞûRÃïÝEÝ£ËEõæ ú¿Y!<®tQºúÿºÊwß¿­ðÝ«´s¿¤tðx§ô÷þ‹RæñAéçýHéë{MéãNép]É Î*}|·�¶ò‹Ï×ôMP ‰Wóöò@«æMCÎööÈ[à�è°4M6)_44�#|QH²:ø 6§ÏœÂç–®Ø9�è�TôÏ–çV™²ñEºlFë$IïƒÕTÏóµLÙ.+&¿ÃŒ)h1“`_(?{;&äæ™2úÌ×2Iù¡â¬í†téÑ™²SÏÃäwnÁ:HŵkYÌ¡wbqï³ULÙ¾LJƒ¡¤úsáe¥ˆúðc.äE^§•kÜsN¸%ìÑöH;6Á=y�®×QårÑwÊtXË'º£ õ/4ñô DnŽ~ø˜Ü�˪õÈyÕj$IÈÒb÷¾ôç‡ é�§Ž’Ä|m¡X� ']DóHŸ£½h쮇^�û¯ËHnqŸh`Hv>]cŽªÞ;‹NÞªOen3dj�̓þyßcè=à†ŸäŸÝŠ”"—{Âí~çÍt¾\+éþr ÛÿÁ Ö|J¯=Hü›»¨ÿ¥µýÔKf¿aH¯Ëæ¦ÐÏLmÝ7ƒ*Ú1….ìµ�T¶ö>´þÕ%`ïOë:F v¾_á?ôÓ*ÿc8—½ªŒþCpõ¬ïÑ¿¯”î2ä· wþ¼Š>þŽh±L˜Ýf$Ù¼c’$­Î@ȇ«8®X…ìgÙ µ‹W _<î証ñÐËZzò´ #Ðb§Î,¢‡_{I?¹/å�>à¹ÃÏþÀ1³ç­Õp–)è4ç2&q¹½æLv'ö·�fÔ–�i0E{ß¹P—^I¿¸O�øA$Úû³‹xð»õâ¡�™ß2ÜÕ‰üÅ1⽿8K’+õ™”R}ª`§…¨ë‘=sæ[…üÙÝò¨¯Oìà¾~X(<«ø¦tóoy»À/︩³òfUýÓ»'SzˆkNÏö—%ªŠB³4$AéêBz£ª“ƒ‹Ðzœ�Щ•%ƒ_;Á¸ñçU@3t‹Ù�uEjµ±¬ö³e|ÿ¨'Ý7â(é¿»ŽÝùÜ4 ïÊÅÃ߸Ðå{¬˜¼ÖÉlÉÀ4èõ‚þxnëNkÐç ýâLNÜã¡ÎÄ'»»C®_,’î~ëÏV¾€Ùzf.µë½sò/î{±F²ÿêð7~tÍá9tN�1•ß>Y”Ó=IXqhš þÚAÆn#/Eºª;§â#ËRЩª¾Â0Ij‹¡hS�¾Óz4cœš„ë¦E†S‘ËjWäâ°ùùˆ±@¤BÉ£Õ'qËDixŒ��ø/Џ2}ÐÝ’'êó‰9ºÐ3Ì Þó• •z® ê/,”du›PMW–ˆß9Ò¥g«K(‹Q¥°­J�¿ ‘~.§w}ïç‘j¸¸ˆ)ê·¤3·±[†g‚v uâ]€àø_Üÿäpä×€á׉«Î•ì·gwN’Ä—éÀuñþ˜PŠ 7Ûº ]q|6•R¥vO•š}¥â ›5}pæ-�#‰4M�)è· ;9°�ÏA7ôŒˆžÐá§´dß;wèíb:GWS»ž8QƒÏ\ _œÆ>…)è¶`Ó·Ñéµôæ&cI3Žó{Þ;Š»ï­ ØûÎQrô��:ÿZÁ|þZNŸ{Ä]ü2’:þN,:ø«;}ú�T´ï¯ÎTl©Ž¬" JTƒþ-zÏ^òÓ7Þ¾R¨¸1’Ëœ}#ûwwñ§JAÍ•™âH´Àt&š¯7 ?[ w_‰¢6kŠ7nÖ MT§ÂÓ5ÅŠuGg7´ûÏu+��J®ÒgòuDÁª+øø4mYj¹!aFEejq¡ñê|lšh%ðC�…²C�eÌᯨ² :£ÆP<ðÐ�ÙõÚt ™ôj>g»)3ðÐE~êZDèÕÓ…Qw?i:3’Ììzç=h\ÑÁLÓ}{¦æè\¶¼ÏŠ®?·˜©=4ç sEC?:ŠZ®/ Èj6îž"¬>k-Nn7pqÃõ‚Ýj´f… rrðD~¢0è³Å”iÙͶEÖÚÆh¦žZ0Ñ­ÅùäW�=Ó¥Û�,‚ž<ùÖ¶\û�µ�eÃsù xu‘„G¬"Z�h #¹t¢´¨Áœk>±Œé½²NÒ;ºçÒ¶pýÅwìćðâ}K‹w=_ &©rpèúÓ ©WSÝW³;ßx’±^{Ȇٲs:Õ:²œ=ð"€ùä…®-sþU0{éE8}ò5ƒc¢U¼ÇRS¬% £U=Üäî(@й�*O'mŸHç LÝ(:"oœ€‰Â¾#N•ÞÔ`€ma*SŒµ—Bß 3ôÞ‡­8<‡ŠÉÓ¢’Jt™‚>Ïá|°Å„Éló‘µÇæSÝ·V3½Ïœ™}¯|Øý_ è=߸½íƒ¯ý™O¾CŸ†¤÷éIã[Ñð;Gè‚ZÖ|3Ÿ¿Sˆw~X+j¼b+êÿi5ì?�Q:AŸ£ÅT™#|ïDíúà º™Tõ¡ÙTÅ'³$M׋ú¿qîûe½8­ÝÐÃ?-›³ÙÏ@ö3¡Õ‹—"WWWäåë�\=qlÃù±w‡¼ýäé.@žÞB$ �W“d4‚ö øèÑ­EÐúcéPUJ„}®Jøq­Vp}O]éþgN ÙM%è0U{f²{ŸúËŒJÁvÙŠAk.¿} hbñûH¤ÇÊùcÏeÌ�oÔàwnÔž= 'Œî¸· Î!_XgFWí²ï¸fÇ|ÀŸ~&>ð7QÍ9IÍÈaßû€¾·â²}Ó„a9B>QÕ[¦" IW§¶ë‹6fk®Zb�M��V/wFë}±ß#`D‚6¼lË^y÷5wiÛ­uÀ]:Ð+I(@À ÂÃÌo0ƒ^Ð}á+wΆ>R¦2¹M¦Lq—¥¤ûéjzÿjø;wºî3[vs‡)ƒ ϦU’ž¼Üö)$¿iüb Ѭ:6—j>³˜n8½�)žNWœ)Þõjuø[æð7Bjç�.Ô–#Ö —!R$© ˜ ª¢ Lu*ºB'¸ <öÏ Å: ©'ÊÔ�=Ф7Žgs{ÌÙŠc6Tëƒ`_ ù‹óŠ©LRõ:±BŸŽÍצb²Çƒv$[rÀZ²ãñ*Òƒ\÷©­¤çæ*è­Äñ/P~üNì±\qv4ž¿ðp}øÛIÛ�e,Žý’mŸÎ…ÞDè_c.|*þÉIœÛm*Nn˜()°þì(zç ù¶Mgñž�A L™¤sY˜*ÑiiY&ê}`OçõO ÊPw^ãƒÖ,X…\W{b»!1�IJPUI8®- ué„,mQd’:0(‰ÆKXš�ÑhÌU�Zš> ëªHk0‘EfŒŒÌÔ’raªòÈ -Eaÿ ¶cd5h=�6�ÛfJWì™Aõ?^ÇôÞwd÷<÷†>W®z¯ è ÒýOœ¤ûî‹™COEâ=oœDûp¦O¾e¤—ŸÄIÏ<ÝÀî{-ïyìÈn´fó'SuGæI|ð"½Ë'¿‘Iÿ†ëŽûKÅi TZ£!Õ÷n�dàízºùš�¤òÈ,:¯ËL\~t†$½ÍÈÉÉÙ/´Cîk}p<�õ%ãg{ÄŠpU¢ùQº›ht21iã@3•Ø%ö›lÃa[fðKªd-ŸV2‘KÈÒáKÚ,éÆÓ‹Øí§ÒMøÿ }ç&Þýõz® ÝœÙ\gÌ•œ ¬ :«Þ˜Íj1…8Éæ·™M�͸Lǹxñ®il^›Ñ’ÌlœDÇgiÑñÅ:Do§òSòœºÝ€ŠÌZóðèÃ�*ñ†,M蓽=®òø\¾ú³…tB±n¦â/D`ÏT\‘—×mãE<ü�‹øÀ;j÷7ÎÔà{7Iﳵܖƒ³AÛt ˜�—. ±ÚCtÛ˜†55ôʃ|áÇ~.aO¾�3Ÿ>çÄ»ß91Û>�ºs7$m_,£½õ£|ï%i¾¾”Êí3ƒy5IF‹]�}fß³µ�CP�÷VAÿ8èùƒv¤X†ÇZH¬µy»Ì Hú_®¥›®.£"‹Ç{{ð¸rG¾><â’+'r[f€6%W<0 ŸK.½Ñα8&g¼80E]§ÌºsÔX=  $­šÇÕ}¶´u@ï“h\ôOíQ¢¥�c…¸ãò2qÿ“5x<:0-'—°í—VÒ]#«ù�÷¼åCÄÜÀ-fç7fÏ·žôÁ¯ý¹S_òwïe)ž_¯R<¸Rý÷ÁÏfpÇKÁç2¹-“ñصcö½ñ…^\zÿ¯>âÜ!37­³_�$±UºLï×Îìà×^ /FôM‘T›)Im5„\Ôݘ­�ômˆndÙžÙ„Çž3ŽO¬žHX››L@S¸JÀÃX§8~-’?p_ º0LH$~½l"h¢Ó{ßz‹w¿qm3ªí¡=\_ТfƒëÊÄr}¦ Çœ)Âq×,öLv“ —¹Í˜Én6¡ p}”ºÍ€IÝnȤÔðqEºtb©�c0pq�B8 ²8U6£Þú[©�wNÔÀKGÐñàŠz¦VQ-®sÚ¯Ù_ øxÀå6h ±©%@Ã…Ùÿ¥/â‰Lv䑜Ûÿ@ 5hFÃÜ ÑªÚgÖ÷X�ÖÝt~)hÏ„Æu=üÞ‹þà!î{¾Æ h˜qÀŸIÊ×åŠ:-!o¡v}ãÊ–°în®e &[±{Ø(hhPq¹Zþ"9øUÐ|—lLÓ”Dç�§ ‡§â±íÈm92Ç_ŠÜÖy ßQ¡©|ñŽ© #:@L\�0°@Ÿ�I(×G¤jxøpÈ��RÁç´‡@Ó•NR-–ègï¶&Z*ð¼eh6_10‹¯>4Ÿh¥TšC5Ÿ]B˜";_yÈö= B?¹qâLrð‘áÜÀc/¢G�¯5wô)#»ü(Aþòæ–à—ë W´Jdï±Ð—<IÓg %¸‘ì¸a/îÿv­¤úó9¢�¥ã]œ„hÍü•È × éDâfb‰®/ðˆåñªÂ�duA(ö›¡ˆ ÍÐí©°ö Þ�]‰vZt±hE·4ôÙŒ:czcê8ˆÛòOn+BŽÞˆæêO.]:ÐT¢ÚÏ/c¿1G~ wýèÀ”¶ {¦ç” Ÿ-fSëŒdá*�ë±eû­!ÎB]-‰SmjÓ=ФRj'Šãò°Ï,Òac±¯K«4äAo2³}²$2MÃÏÇ@ ‡@'™0Ö°=Ç æ)ÐÂqhŒqÚa.­h¿¹ÂtḀƒ ZÜ|ž9 W‡c˜Ó˜FÖ® uÜ"¢•Zc :† õ!é´ø„ <ÕÆsË ïâŽ<'×�N*Ô•E©QA1cÜFÐXƱR²ct%›Öj,�ƪ°Ø72á*lDæ8ˆ!ln»�Z1AKÒâ°Xr€y´Q•èlõYBŒ€Å_È#:$QøE¸N1áóëÍ€‰ñ8¬tl¶Ì“ ùhUœ#¨H²4™”&2kœ˜‹&:Ehåç6˜r»fâº}=è&²;x2½·¹†KˆæÝ¶Ol�Ù ì>ÙÞû’�Ï/¤„Ÿù,#pÿ¨‚hC6ž_cTÒ~Áb9ÿù³þêóxèÓƒt\™ `ìË6ª1i 8>öX0I5`®ŠÎj3�ÁWªâ¸Æ­š³¹­÷C¢°t ±cøšOíÂ’ÎiôÞW>üÉ�ôé¿p‡”îô–£³HÜ>YVûdjC²†¯P„€; }õÀ€Efizx‰øEÂ)Ãy›]‡czž6°9éðuÐÅ$¼Jl_  %óˆ ‰Vç“°�¥–Ld“ðXÊë0hI·¶%ºÌ8‡fC4ˆ^Uí±E²šƒ¶ ËÌ*6*^têØö+«øšýóAßpŒo˜§+KÚ2xÝÀ× »®;°ýw\ 7ÍPÂÍÎo5Lé¡ÇRÅ©»¥²tǵ•0†�M@ás ÜTÐLe2Œ™Ø2IXа2¸ÔÂØƒq)äBT¨�š„%TÒkÅl*Óáüû;Ðþep­GbyZ�h½ËІ¬ o¦¸Ý¸O„é Ç�ëÐJV—Çàm1›¶N`ÒŒà ÛRV~À†èIÁS?•èõz+`޾¡E{pa²¶ƒ&£@ºǶ1Î!“R=tÒÙ-‡ç€ov"èÒsq�¹ÍŠün+E~‹%Ô`tøñ@_?$á‚T@�â&èm�7è Óá‰DrËÐ,ië…Õ\ûõ5ÀeÍQ€íWœr½Ö ¥)î:¿œ;ô„’ Þò Å­ˆV#L|]‚†n²Ò�;ÞØ¯:0]¹}„ì¶ãóéÔb=Ððg“‹õ�u Ïl|žäæ0÷Àï´Ígˆ' 3Æ” Og7÷O‘DlÖÆŽA—�îûÖ‰m¹¿ Û�Ô~|V·9Ñ®xè"é¹ã5/0³`^ŒÌÕN›—w=p­7¶ï™3Ûy{°ø Ùã�묦çÖzÉÀƒµ  s"ÄÿÂy.ßkÍt=['ïyäÅô}åŠßﺊÍ5¦\è& ÷0ç$Û~l Ó7ê$¼+ ¼ÇH»ï¸Ñ7V³•«?b Zw\É>k½*ÿd®tàk~è+!³ó{7ªïå:®ìÐ,2\>dMôí†_Çn‡Ë>yHo¿¸�ÜÇHª›H%lÑ…Z7×€À]pT@‘Ki2âñçI`Æ`»±‘ª¾žb¢w lÐ/”W[¬(Ý5›K©2�&TN”f·›±]÷×Ëzïz²õWìdYÛM‰2ÄWлÞT¨Œ3îwvÕŠó²ƒ/…²ȦZa�åì,È£hÙ&ìcÕ¸Ðí0…ã•çvO•§×›‚ª"·Õô`!ֿ޷ ‹OXx™e|Ã{ÙŽûî��w½¥í#Ž„å�X¦¯Èjž"¯<¶_�ÉÀØH×"l¼_òŒ1-nvûÐ\îÀ¡ôüh”âìõxÐâöròFþ¾ô˜wÿˆ»|÷íé®û~TßÕÕD‹jÊÞ§ëq ½4¡‘m*ЧBpn…ó_Â^Äu�ã hÓËKúgB¬½@fë‘Ùtl¥®84Mêà—H‹†§K öN'ŒËò½s WÍ"’Gl;2Î!Ø–˜‹S.Ø¿lÇ=7E×/YÅñ�ÿJ¸p•:X…�¸Ì+`5à¸ÌÔ#uŸ¼Í4.ñùÖ®¡¬ Ÿ¯O|d§‚Ž:ÜC‚8FñQªlp¢†,¹xÑàl9½\Þ}ß+°wÔ4wAçxGÔögÍ×í!§Û´ƒé®kéú+K˜²£³™Ús¸¦:lÃV™Kízì(?5zæLªüôÈѾ.tÝ™…̶ˋØÍ]ÄÇsîÓ±…Ý–0¯|пvÛÿ¸'^nÞÈà ûU‡óÐ •?xsò„"}&"^â"áf%V+æß à *[ Æ�,¹`_ƒã h¬‚.7agaÿÕw×C:t_|ìàWÞ’^œÇ;kC±¶84Uز.FMÂF«‚·<¾D_U Œ¢)’¦ÉMÛ]¢©¼up&úÜÀ€H+›nàÌ(zøc…°�Êô ·°x÷ÌÀÔêIAqyúÀT‘níŸù‡·´b÷ljè…‡âäµÈ ëçs¹£/°oW!ã4µM.Ñâ®<0‡ð°Áì|æÁ?îz$æú¾rcqŒ&ì,³ g(»} °³$ò0ÂÎ’ý‰�%þÎêC¸¿åïK‘\iŒ�UJX„m“œ§l †'º´SAÿlïv–¬ó‘+ßóÌ•Ø1ã"6VU‚m Xóð°6×N‚|ZZÔ; ö‰‹ÌÓâ³Ç_^Þqß•ï}áÜ:Þ£*fÃT¿˜á{fƒ�!:ˆ5Ãó¹ÆÓvÒî»n «Ëõ¿ð�G¦ëÉzóˆîöódM§ì¥ÛÚJ«Ì#̶ҎiÌ®»î°öæJA‹›K­5dðgߌëºë9)ÌJ£òµe1y:°n„°±Jú§Ã| aÿæõ[2)['P¡ñê„å„c&‰‘°³zî:óý÷«ÚxeÀÎ^2ÔfÿÁÎ*cg)p½£ñE‘Z;‰KÕ„± þ²M5†��Ï•µM%<³ÍMfŠœífØN†ØÁ‡fŽ#ì-üþÀ´m&ð~Ð[ÿóû¡Ž—•öÌÍmÂìƒ\£éÂ*y÷—Àò½ó¤Ù5& û ¼g‚Ýrp6³ë­;?ø­td� l<ò~;a€iÿÌNºu×ì1îz’:°�?ó�pÏË�â‘€WõK‘�‹P�Úæ³ýÅ2Llû ¶îâÈ%ùør½a0òóe�¯¿1ŠH5yV•‰¢dÇtà C]NئwÊØÀÜaÁ–ïŸö°¦jVjß·^\ùeÀ›v–?¬•äU��%a8Ä; Û8ø'ÂÎòÂÿ?€ý.O©2’¥M ŒÉÐ Š*ÖF#– É†ÅkHãpüvöÉ|ÅÀL` C�Ì�׬st×y}-ð]¥é�&Šü>+`Tð½·Ü χû�S�67áníšÁôŽ:Al!Œ„rœwì°àÒñ1—£ÿ6ηFœ¹Mòè|� ŒF³Àl\×WÚÈoK{ïK¥»Ÿ iÐNî¸cOØY„ß¾w6Õq‰°³Øö›„�•Ûì,5‹²xU.—%hu6õÖ=„�%~2°³ŠÆØYò?³³âÿ`g¥Žc£Ô(×–2œ·CÎ ìøü– ï ü ÈI€&O+Çã³ÑØ äý¸îà#ñûƒ6ªQt˜ p© g Üxõ±ùäL œ—Œéïž)ÃçR›¯CødQ)ã€ù-Ín3£›/-c‡_ûHzž¬þ!©ëËiü€Z�Ô ±)ãéàP5_/)Ѹ&Ïã/¤�X¢Êo®1†yDˆ?P¿ÁçÂp§©0œÿä´šq5ŸÌ^°¹}Ü%ÈÇK‚ ßf£Ò°?®7“Uî±–/É+qÜæÁŸlÁ>×2|FaþÁz+jçS'~×3_ÂÎ�ô˜ -ñ?ÙY鿳³R´„�µ¡´î´�,¹|¢X¬û¼m¸W*Ïj˜,«Ý» °¤wf`rá[“z<«y2Ñcï¸ê@x8—†hÙ¯€°É'ó›·ãÜkx&ÄA¶ãÚ¾gÔ�麶Žn?¿ðd. Öç�Z¦Ç Ž‹køl)hÉúGYÅÑÀ%•íºïÏ7}¶<0­Ôˆ �QWlÌÒÆõš×v} ä`®eÇø’cì,†°³î¯ãw¾ò‘= €5ÈPFB�.‘;N™®AE�ÿƒ�óKÀ |¥-½³d5le…ÛÍI|/ì°â¶ï›/møÜN^qx°+¥ ¹º°V Æ8Ì›È º­ØæKÇøŸÛnLY§ü-Ä)ð¸jŽ-–o=4O–·Ý |±Þ¥ü-àÜsí§íÙîŽ0¿Fî¹K° ûަɲä:cÂpŽ)$¬{Ea—_Ñg ÷/¨]>¢àœ²e}Vlt––˜ W•†©Bì$ù/húgÖû¸³(@¢Â†n֔ǖëC}+ÏÚ>˜'à“¹m‡æËúød¸W±!g<ø|.©\b!%�WŠCT„°æÇÈ¥ ŽÉs»¦’‰ãáìœ'®Û`}Ì—ŽñK­™í'A[ßj.¦ñäbàÈ3›'>X^‡%Ä�À²âdÕGIq­ ˜ßc ׎q¨p …<µþ”°ß  L`ðà\üäš°îXÀ`_ÐcÌ`8ßÀ¨ƒ<„m:¶˜o¾¼ rE¸¯ìxà¢ç‡­?±ˆØ&°e²I,šÍwÞrûäú_{Âý:Yÿ}ŸàÁ;<‡ý'pé~ÀOŒP%è’žiü¦ò pO® Ÿ£ ÷¥˜†Ï—Ðm×W;K>ü˜‘ì|áì,vÛþ¹ÐóÁ•î™ÁåõY€–5CæœÏÌ%ì,`…À|V¶Ïò~|Løx��U<ÆÎâ›?]ζ_X 1‚Ì·â˜/Ïk·$¹&öûÀl�|˜i=mÇ×áã.ï�ΗöM'¬ùÒÁY²ÆS˹Öó+ ×î¹$—(òp} ¿Š!®{ĉï½ãF÷ެ¥wàϪ=6xvÀùÞ“¬òÄByf›«Á×îŸs²}÷hÈ‹ÈÜÆÀSGªóÒ ÂwÂ5©5*�.à;®­ã[.;@ž$#Z‘ªÎ§kœ�,±P8¨²è myZ¥1×sÓ%°ï¶�°d6×™@.@ãz(@ˆëu ¶mFŽ€aóÆÀ£�y ’ƒÎi¶¶<·ÝØ]PóñùÝ–ÀÜàKwÏ€2ÏT4dÍ‚½Âüe|®6Ÿ˜¯ yaÀ`[’Vœ÷3ã=®P� K'ù>ä`Ò²ÃsØÖk0'"-íŸÌoˆß,öqÀ‚ó õ(ñ‹E­À¬&}.õ——^Pf5a Ê3ª&3¾6�‡òõ8nã ò}±�¼¨´×ŠÅçžÔFÀÃÍÄljíôw¦»·íȘÓ�~$“U°}wœ¹À8u‰ˆGpÿŠ0jò¦ÆpÞ ‹-Ö%ó bg±�g—‘º­°Ý‚¯;±òqI×ÝUP¿K"25%8ÇgÓ;L€•&-ÿ�ʼnë><ާq°³Jº§Ûˆƒ1Õv†0ÖeÅ»¬Ç>·o*Ø©�C]½gWwÄ–m?g�ml×x–ä,dΪzh.|aÕa»ÇÿrâÛ€;…Ç([ƒkù¾»ë¥îÒô�¯|¨îXc÷ÜeU'’u“ùø÷ÄÁ'®nŒ8~*!ôà•ÅîÑfà¶3®‡œ`ŸÁÉr»,ñµÄÇ€Ïý–þY°Ö�‹Ì/-;0›ÔÌí礙 &bÅFUçÔ„a]8`Ü-Ûظ„�R•Hqn(Fb‘1™ã ?†ãbZ¿Xó¸ž'¦ä*„å‰ÿ—tK¿5ð­`ýaUŸZH·ÜXÌ`Ê‘>\ËÂ\£¬-8ŸÒÚO±5ŸÌ‡¹|ˆÑlT®%OTŽ2ÜC—–œCø(ä^/0©:§g æ¶¡—Œ¯;k÷¬óæ0Á.ÊOÌ“•ì�jyA�¬¿ášÎ�å–d ΖW}b vO®5Ì7�«¨c*Ì]óý÷½±ÿ^È%èñQYZlH’†4­~¬ëa÷½ô—|$•îz$`ÛGWfÌ!îô±Ål×�µ\ç�u²-{æ¦90oqÎGrÖêƒsa}!øiA«90°ØæÓËè]O]¨ö+Ëáþ.Üo&½Ž1%:$&UíŸ~r)iF‰ÉSrš§È‹»¬È=!ìßéös˩擋àügêy±4Vø„©‚ã ñye]°†eáÁqãü‘Ä<îÙšý6,ÎÏqݲ ò ‡ýÎC™Èìq°ß°öŒÝýÌ€4Ì[︽†m:¿ ÆÄ/¶rÀšíyì k=eû1lý;⫳·›@Î ŸK| ¾–°öxO°.€Ä=˜»‚º¿ëªøTro:8\ ê^ˆ±ðùLx¼¬É€¹pà±A›4Ä¢À1&bVËd`ªÀ1Á½1&b£ºŸ·Îi¥ˆß„íî1§o3㙺PZµo.Ì¡Â=HÈ¥IEú„‰…c4äH°oò²¡9ÒÆ3+`~FZ†íüÈ\.£a¬‰`csµ¥À±ÄŸþ+§s ÄI)°ìãst`þ’oø|90�?X[À†Ëj� u6¹�œ‹¯/0È€—WwÈò­f{éNk\£>Ü;_NX<]×€]ï!õÔªØn!Ýýt½ãîjðyÒ*œKW bí¶Ã¶tß'Ùž»bàÄÀ½zÂúJ­0$kO`®ÖUì·áÊp^ |cøüp—ûtÝXI7�[Jîé¤ãضƒÇØ߸ÜÜ„ùX;œÝl6–#wL…uT×’;ñåƒ3©Ð ‰|“ÔÀ­‚œ˜plÖvgšLyœò°ÞªbÏ,Ya“9¹WÖt| Û}}×tÞîÓ3¡9šn£ µDz’�VTÇ{ø|r¿&ÛC~—9Œ1®tÀŠÞ¾ß†ê¾æ@µ_^Aµ^´ƒ^T6&[ ø˜ll†–tËÎY„kH ÷Ìà7â[¨#Ëh1V¡XÚ8åªwbz`>Ø$®¹táÞøàMI2uØMåúÒ´j#¾¨û¨. 2χk&Roà÷Á9¾´ÀG„Ä‚<j¨wá¼Cž÷[9l³\\¦±m`Lãs&-êž kyø¸lmÄóÆ“Ë!_žÔƒ°fKV:` k7`\Á~Àýbiz« ÔÎà¿!�$Üô”JC²æXðéÛŒq3&qx¯Ø§p™�&Àt&o[‡g‹ŽðÊà>]V¥1ÔIÀ®ƒ±MÎø‡mGç“õÀ•ûfÂzWà&ƒÖ Âø"9>·à¯äù]SI\ª>lK˜àø˜¹­=3ˆ�V춦·�šOWŸ˜Ë¦7C>GŽ Ö½tÞp€ñD[‘ À  }¹NòÉWþÜÐW~Üàsºvÿ&2MúC ÿÃ×npzp˜KÆ#°ãËõÉ~“q}|‘òãöqû¸}Ü>n·�ÛÇíãöqû¸}Ü>n·�ÛÇíãöqû¸}Ü>n·�ÛÇíãöqû¸}Ü>n·�ÛÇíãöqû¸}Ü>n·�ÛÇíÿçmÖ,·¸0×àä`=ÖSo–“×ò@ü³(xSrx’ž¿Þ¬ÀENIÉ®Q¡ÉQñqÁIVðëçKy¹Z9XÙøg„'.´ œkµÚÊÆÉkÉâ@üüÛ¹V ðŸ.^¸ÔÎj‘(<8ÆÊfìC­ð¯­IQ‘QqøEqhpLøØŸ®Æ= va%ì‚sRʦ Âàdü–¸±�Ãñ{þÓË6T\\plx˜yÕ ¿lµ|®Þb+'ü`Óà›p½ü´Äj1ùb3ðÞø›�ø¥4«%‹­ü¬¤òÅVað÷"=[û•öK¬ìW-_b ?,[¼pÅʱŸ}ÿüóòìûÏ¿ÿ?&÷ÿ?%Ž�Z÷¨˜p‡±oÉÑü~žmæâýa=ô¹†§F…†»øq>V¬¿žÔÊ–œ?²óðÍŸöaÙÊ…ËÛÛ[É­–àŸW,…£Ûð/¾~ûû»~Zie‡÷`ÉJr¦ì¬ÈèÍšEölÃÁÊnÉŠöz¬—¶§ƒÜ\ü�—ƒüÄa*B&R~|ˆª€ VñUñD¨xúðÈÝU„¼}¤H$Ù "ÏÓ„¾IIDަ$"[S–ª!”%ªº9 Ðú5žÈË�Cþt´Š¿"QÕ_­êîÍ"W§äé.D ©&”oP…oÒNP£b µ%Kµá™>¢@ä'A #%MV—„�¥«û’ÿí ÇŸ!Fnë½ð³p‘ªÐGkÞ}}ƒÈßpQ*tD†&h£È3«'�’"¿c*ôæCï,Ñý�)Ð�jÒ+³©ÊúU¡ßÖ2C§¼¸}ô®@%’¨.…~kÐP‰ÉÒ­YÒ³Y{d1ôyBO›£M4-ð³tc¦–44OêMAŸŠh�ÀßCOÓ†ôñ|Ä&ME\‰¾< ÿÿ”JCÐ8artˆÖBx¦¦z”i… % U}#Ð*`Â5 Gú�¹ð$MÐÞQ¢‚cÔ¸¤mПCG¥hÒ‘ID“4½¸èl-è¿MV±$Hˍ°Ðß��?>S[–]k*«ž+ÏͲ(&4E´ȱ—ïž%‡¾Ý øs ÏÎgÒV¢‰”Ûe)-Ú=�Ëí˜Â¤”é³Éµøõ:#.£Î˜‰Ì �SX.!O—hpä´š‘uåD§Ô€œèEÈo�½Q°Ÿ¬íüèÀh5š R½E¡‚§A?ªX«&ÁÇC‡âsŠmM7W_ýª ËD•jSQåÚ’�t Ѐª IÕ@KÓÛ_Œ ›ÝTkš¨æíÇ#gòƒ~Ùà M>®f—¼Í€�-Ñ•°ñªÀ|P$«yá¿ór­ß Ð>‚ý�#q`ª:#OPg"Ò5eóuä±yºÒ”²‰�¹u`sÓ¤Yu&°~]‚�4}»±,g‡¹¼ × ´äiÕÆ ÷Hô±2*ŒÁ~¸˜4-:*MS¶¹c >¿æRйÈmµ�5�[%­;e'Ï­1ƒ¿á°ípqéZУ@´NŠºHßý˜ÆAÇ4°ùÀÌz3Eb¶ž<)]Gž^i DãaS¡>hP0Á›4@ÏteèÀ(5&4NƒèLFçi³I¹ºÐŸ©Èi±€¾a>¹H_‘£E4‡ò›Í¡‡K–^cÌÇäh36i‚ÎéíÁ¶OGÆ©³á‰ !!MǶ‘Zf=øòŠýó¥5GÊÓšMøØ\6>GìúAßzKHß_F£ 雈)ÖÛ”å÷N#:ZÍ—Vòí#k /’ËÓž`‹tÅr|-°=�^ædlÏÐÏ[Ú?´..[›ô®d–Ê º¦q)å¹�iãIo ôÑâëFúû"b4¸ìs.¶HGȇ«º;zcéŽD oòTuŸ &á£ñµLV§ðCÄoTõóç‘¿;ÆÄQÄ© šð4<æCU„”�~+ì迲a¹ã Ÿ‡‰-ÓM?ø!¦ÀDª]f| ÐÍ¥6q‘…Zby’üй€žfit�èL�ë³zÿÆzµA¿øIltÆx鯉,AM,Ã~40^]º±PG–¾}’<©ÊP›­#‹ÎЂÞVEf�  ½™šÐ7Ëeo#½g Á½÷øúhÖ¾Dï'½ÊX–\a½ŒD›/µq¹NÙM“ùš“‹ wz»¡·Uš�Ï+hZ`ß ý'ò²½6òm'–Ê·î�+#Ú;g˳¡Ç>_—ø@ì?Çú€±OÆ>zoÀ®HŸ+¾Vltæxèc›‘§@/,ég†^•¢�3 Wˆô»¦”{Ã~YžZe$K.7�&åë�ŸƒÏ":[pͳjH/*éߺk–¼dhŒ5YéΙ ™5Ö/8hMúÍJú¦Éò:-@»GQ¸Ûšü/ÐIHÌÓåó;, w�ôO—õÏ�B� ô™ä6šñ›ë&=aÐ�ÉÕ&¢]Üi ½o|N�©4¥pŒoЉ¿ Zb°¯´_K°GèÿÁ>ìô.ØÈX è�� °+owòö!Є’°Ø=iäç«@¿û$:4IC"�PÿCt "ÓÇ�ý€o–oT£ÃcÕ¡—ÚG Al˜*¾Y“‰ÊÓ�\øß W6F¥k@ï0Œ-è¹"}RñExŸ«&°p|ñ%ºÒÔj#Ð/�ÐÐ�&ׂN —«¢d1ªRèÉ,Ц‚ÕAïƒèªâØKt%°/!‹ÎÔÍiRñð� ]ÊnÌÖ‚GYy�5ôAƒÛ⣱}âëIú¨òÚÌAçús¹È¬ñD�,m;éT”îžMz¯ñu“eµ˜�åÝÓde3q~` E²-³dU‡€o’mÙg¾Hž¶Å´µØˆ Ò†Çä|Ô¦qÐë*Û\9Iº©Ò€Ï¨›º"D× ´ f7AÛlè…”a[‚>[èSÄã‡hÉÝ6¼/`™ & Çc ú\¥UG�Þ†sË ¿ úÑ o ò¢½“·Ã>ôÈ¡‡•M„^Â|]i¶;è[ܲs&h=ËËöÌ’gw[Bÿ>þ_¦0– gŠO(Õ=zÒCZ¾›JõILÏh2…±ÂÄás¿YzÿˆOžt ¨à|ý6�aðud¿ázà÷@ß9œÐS³ `6°Q8.lÌÕ½Z&0Y� ÉÔ�&ÐØ£±_¤dQª�¿@/$èl€®hØ‚ž»Ì-vw' Ò°Öšµ ÅVPQééŽE7bØIˆHw#!eïpŸsæ¼÷¹ç»÷þïwîï÷Áon`-¶Ì9Ç;Þ÷yÞ1æó@.l#ô´–Žy·ƒ yºkä­ÄÏCžñžÈÚÆÍd}®dâê÷°¡o7³§'ð OŸ�Ù„)ˆ‚殃gÍñ½óÈXÏóƒ.ÖN?ËS_Z¡qµBõ ÍG±]ôl©Û•Å�« ï0&GåAS ã¥Ë ñb“å8ˆM1èÄ^ò™:ŠøYN4Ž€ƒð3­h¼!F@³?Ÿ ÏáÂ=Aóë° ,$<í<žgÅÚ �£`¼ÎúN†{)‚œ‡õË/O„yÄ^úYc÷Ãó¦3 µzN(NÿzÎÎ? �0$‹ê?�Æ ×|¨ý—|§Ï­¬G|5èlãg`QŒŠ­Cp®ÄÇEÿ©¬�ÿ4ðÈ€< *Ø;Àïö2ðF`\“æb½�³ñõYzMÂõÙãêBЫ�|:²ðl4in‰9–È-i>”·žgf΢ñ;â8ÆÎtràYWð/­Q±Gö"ÖÂw"äTÐÕƒ¿�Ÿaw†{®ÈBÞDâ´»écÎcøàUa~qäJ¨B4ÿq|z¥/2ḃñP-7£¯ˆ«À÷Fì)9â_ñ��ÖXøë¹V5 õ‹Ÿ—õ¾³|@c?}ácü}ð4áåëK˜À‡«@›qˆ™ >aàkÃX‡OgœfÃA9$Ío%ÐI¯>âaà+ðŒåå à“ž‘LŠ q2)Êßæ¶£€v�è|È4¨V@}#¾�ó%hžv'´ šŽµ!’ZT1ÿ>f3×D4¾dBÍNÐæ§B¯ÝxˆOœ-ð¬>Ρq³€Ë’Æ–˜ëágÚÑü„û'²öžŠ}P�e�!Î�j}̓ÃÖ#)T�Á§ â“=0¼(à>óð†ÄU(“aÐK\çFo?)Çc� r\ôòÀ7÷ ŸÁ8£œ5aá1"ß»+a~AmMYö¬ß$¬wŠr?àCÚôÄpÒÜb¸à�åp\ÎùN"�Y� ]ÐEä!^>¤h5zôi÷q”‰ÕpCàë¢Óòô!9àcÀ§à¾ Œ-äAkÐ"žÎ³ }Øcte\ÇuGc8Í+g x,�‰�»ñü‚<æ<“L®ÞÍdõi r~Sç'vìmM¬ÿ1h1Cpøìp#V< <áèÈ×›Ù�ü�¬UàTòÐÙÐÃ� ˜BKÇñ�71v ƒ âÒÑsA—Pza ûñâ3—ÆþÛzO>, —s sĵF ú c-¹ˆ°%h Y‡(€.øœ`ýËKá3p®E5 c&Çs#<ë3YtÈq4Ä&èE•œóĽ:Ð~†Þ.îwÚ‡ÍûÞÒx a¸ î“ëa-”ón“°.°Gâ/d|ñ6òúGmêÖ ¾ ³O…¶�ñg(>!}YÐø÷ kÂÃS ¿Ê\ôœ ºâØ/Çïî ðGÆü ô«ƒ¬?¡mÊlÀ‚0^P'Xÿ¼Utò{&ªj;ã–ñ ÔE¡]ü,&âáz2¥AüÀX¯ôÌ… ©ÔqTó¬ÎñLS‚y Š«T¥jwSIµ{ØÈÂmX¿å4ćç‘SÈLaèíµàŸ:EX� ´à@—8\àÓµp¿²ÒÍ‚”æ]X£ì„ãXúà™À×àëP'n‚þ_zùKY‡ÍÀó� `-È!€� 3–~“D¶±C|ý‚ïdÜcD9êhS /ß^F‡<]+ôÍ])¼(S`Ì/�‚÷±O:7©mì�&/º7â Ñ  �+8ž7§åAoHˆò-ôȈÃÃ|±kBïôŸ|Ý~ôkp¯å2Ö+kîw;b5 ´½!6…ÐÇûé1AE>YO_ïÐÝo”RY4AC÷/� ÖÜi4mŠ0ˆÙ¹áÀé„ç‚§BÝ’ØGƒÎ�"ðsX›£8ÄšX Ó ùÓ-ehºbmOèÀýrMÀz�?µü&Šl¯Cøò-ÖÅâë€cÁ¹aMH—¸yBïì%ˆ;¯À¼Ù�ß�¦Õ4ÜcιÆÿÆJàô€ÜÕ�©ØâmLÈ«uL`ˆi÷ÉâÌQ›QXÒ#màöÈ…QÆnI ©è¢­àSÃøÞ]F[N„š½kÑiĽ]s�s” Nc.‰j:è¢�Œx%ªÙ Å&[ʃçøR‰ãªö‰ëÕÀ{0äð­t<¯Q]cÂQíŠy½•‰ÊÇÚ�ßÚÆ*˜�¯x[ ®|ÜÇËèØý_Ì#E÷ø:öª8�æü)Û±X—å[aèƒõ"÷$%±kò|ă�V#`PÐwÇýð9Šx¹‰ |´|Á'ó6Ä•@û¼…èÄú½ˆ¯oaÏOÂý}Ñ™òu6äÞZðL‚þàt˜«€�†ø:̧q w�××Ð8Bœ»¤/;GÏÅ|Ýñuð™@c‹ûÎ^Y‹1_†×Î;Lú]]Žõ’ Ï„=&²—S*ÕEÙu†Â[Í$“Ù¥%H|³{LC÷üÂâæçˆ,ä)ñYù!-UÄýQƒ¹ çžÀ×S„€5—@ÿ úÐOBñ |¸Fäw}…ØU6W„ùzæë ! çˆù:ô�OσŠò0ø*Ò²—›Á zëЧÄ\ áRÌÕA£z ®qsðPB¹�J¬Ø ^uTr‹2Â$C“Á<Å=Û“ÎãHéaì1!ú� ðXg�¯übD"®l@´©åO� ¯ "+”‡íBÁcBda;æö/qNû01eymÈcB_«*LjVƒëÍq¨¡Œ9úûVþSAÇ 4µ ¯‚_ ‡8và}ÜsÅšt>9KÉÄêÝdVß~ðýŸi1`"¸g×—JÝ•$î!6Û`ÍCÙ›mLR…2÷vÖµ„ë]̈‡›Xì/™¤„µA“ëö‹³ŒàÞвW›q|úÞXk4¬Ï­eX»-ðùÖ%[‰:ã9ÞÖGÉcr�_Å®iJ0ŽP“ ¯A· µ¤©ÍX[òýUÀëÝ�7àsƒþÃy„ÃQî£Üyk¹¡øÃŠÐ7ý<Sà Ú¶ØcÂ;IéŸ~à18¤÷õò‹]<æà1Á". ØÜH_Š1Ô˜�PÄ endstream endobj 65 0 obj <>stream =Aob çÉ �Óð:pûã¶x>áºsì\ÖëúbÖÿþÊ¡ü…þ>hóf´ T­4X?Àq#Àø+Ö3¼³ æ,Î¥�;¡þF@¼\а ÖúGï?Ç¿�×ãç�+ô|îGœrxû4XzO–žDsàè阷a�‰ˆyLvƒ.®—ÀcBBŠ S°žs´ÄíÆNÿ¦Ÿ³Àc®Mú—Ç„¹ýè!�Ìg›%×—‰vam GŠ8ô<ݳb—€œ•àmF'”îbÂòÖ� ü.è)³~V’1ÕÛÀ‡jH?;iô«ðàn„×aÍ r”ÄÍo”3¡7‹µíÀWÙÔ¯¹�§ˆ0£Q‹J}¯Ê n‹õhPÈ)à±{% OœŸ9ã3÷à{ć‡/�0à›ÓV§¡ç)ÛÔ1»Qà3ûøhîÒh΃$ô“`Ïà(ð„¿àDÐc@¯�­`à@x�ú—S1q•»Eþ�×b?tÏèøÒ]dF‹*_¾ƒŸÖ¼pô. ÞÖ×ÔÂÄÕùÔ?=&” 7ÀÚ•¾�„0Òáø„¿…½¢ /i~÷f`íbójÐ× hï=[‰Oö2ÐaÅk姆z]’ËK±þõ¥�CºÅFc<€æxAÿStÅ/ŠKɯ‰¸µ5èöVÁ}û³C{+XÈSà�‚j=ô�±�ú¥€©ä!‹á°7{Pœsû�‰”j5QZ�m£ø—Ç„@z^Ç ô!íg¾� ±ó¿zL¸yL ‡="PÜH­:b;š9|v$î/¸$Ïîˆ} Ð<‚þ;Æ¿7ã¸;ã;òx¯’)Ý*tJ§*öjî÷[yM¢®tí‡yÊZ¹L€õ'˜¿bœ‡Â±ß ª­Ì‰ £apjðvï,ЧÒjT°¦:h¤¢ŽÊúº†âýÀçÀúðaà~”¥ÿDÈ‹àGz@“&öïÔ!öí9@€'+ôZùÇÀ,F|€¡okXðïÆZµÀ_QÍ„~!øàaOè/Pðx@509Ô à¼  ÷ë„f´ª nöi¡9µ<¶ÁcÂ@ ôÅ�‡ÁÁ§Y<�ÿƒ¦5ö˜Ð¦ ]Š`�Ú�–‚—Ê׸?yôÒho¼®avzþjn1î•è$ª?à‹{Æ~uäÎC[„?Ú"Š}µçEÀœÐëϯð'ÙË­€3AwÆr-{´qH¿4x&^Gu�W‚uT¬÷ž·�ÍlÐ]ÈÛ°†"µF¹Ü;e±(­ò€$³‘/¾Òa@gtj�ñU۱ǚ'¬ïõ¥d\>ö˜ cKw`� ÄŸa¿…޾1¡/:#>Kà;}(ì³í¿¼[°Ç„ë�Ç„ø_=&,þò˜°I›“§DÇå0Þ…5aTç騲]ltñáNÜ3ð»¾ò朶QŠbÏ[˘”Žýì•m*u@úÒ"·k‹„ sè¬N ðoÜ´´�/Áþ0t`ïͳ“ñ¾›°ÀË¡\ø/x‚þƒšØüÒhÉïIà�kŸ WKG¼ÛÂ:^™KžòºðÔù�ÉŸ<ñ19MuBUM“ÐÒ4" Øãx=p'�\£ úµ ‡=,>~F–#1Ÿz°ö|AŒÒG­F²ˆKõ‹SÊ4™ð‚-bTÛpïÝ&p:^ÿƒ½Π›¦D&WïaÓ;´°ÇDHîjˆòŸÖ?=&Î�–`�‰›kA£_|Þ{ ôÖøh>Q°÷aM‰CÌ ì…ÜxäÒ(èµñH Á<9\|1dÖ¶‡=‹!WA¼â<zªÑ/vÃó·I]R”`<¡ÿ^�SÄ^I A#Yóx=s½Å@x¥YƼªp®�+S–dWð„É•ûYÙ‹­�˜ìzmÐt†Þ%Þú¨~9+€ÿ†5»¿<&ì1Q·W˜Ñ­-Êj3 ²û5É+M*ìå¬Å°ÆCu%8j=’<î>æ/� :¾i·ñ2ÈSðƒº¹Vâ:×wTË„!7V ÞnûÝZ…q0àT;ðÞ”ïa¬è„âÝÂÄJ56¥L�N)W�ñ…Þ3^°ÖnDà—íys)™Ð°‹ +\Ï\Î]J=]�s”ÿ½àaÉø][ ˜csX‡¼þ ٘²ÝlB• pÚV¦¼Öë�÷àùXöí¡˜Êžo%×`²Ûu$wkL%7Z„tà“U´M‚"m:•<ë?Ö øfÃ�“aF(N�ƒ0 ù²òšÍoèEÁz‘�6EÀïaŸ„ %¾÷×J=¯,Áxæœßد¾¢Är5aHþ&¼ŸÖìÀ·ôçZ/xu‚ÿ*ŒS°…‰x´<&Ä6Ѹ=Øs$õˆY ¹œ¶D�»öt ašäy¸÷}  ÞSp�ÝA6ø8îa€æîyÏIx�ÇÚ{*ôÁ¡·"‰«VÅ”ìâì¨~ÛÂþŽÛ+%^éK g�ý*ñ:´ÿTè€'$”³‚¹V«'|^}Hú¸ìxBêhêà)Œ÷²¥–î—dÔê ¯Ôh“IùÛ±'$xpGo­}оÆëàW…0ôÿ‡|1g³ U€uQ2qS„ÃÅ×)òJ»*xL€¯9ã‘6h}"}u.x2x¯3¾ÏVb� ›Ài˜Gd.‡ž—Ø=~>ö˜ðò˜Én ¬Á�°¿Ä ñ×%ìç†x*Ö(Fï³ÉUªlj­:æ')ͪ°f>@à“G…ÿ>ysÿé“—Ö¥û~ôyô�9Þg�8_ûàïƒÖzl…Š(µI“-Ü÷b¯ �W¬¥G‡^ÔCÄ‘D7k)ÓǯÎHVâå|P…¹@¿XËX')‚–>pMàKxø\àdœ‹�ç�6;�Úªñ®�ð ö~]ìWÊ¡úŽê¼ø´Ã8)Ôð$=a5 ò»älÞW,rŸ‹õ•aíö–ÁžT… Íì—·Jâ’±Ö„ÿb_7X£„õ4–°W ràðã[ºO½þ£ŽcDVˆG_[, y¼ òön�sð Cü5 k?Cì²6~¸¯}iBÃð»:&ÌN½(Øïc|)DÑÄÒe’ØÎ_kêÿô„„±%³š÷K”6)(²aî¶ `�JO[@@mÂ| z;à xo%øÜÒiíêàÛI'7*³[E>wVˆ<³a�^Xó· W„sÆc^ƒý� ñW¼.ä‘8üÐ�OâJ·�OuÊ},yòò8#sÏÛKÀ_{Õ»' ®ý‹ð/� ¨°/äÖ:úù¨ÙÏì%€ýþê¯bN뛹”Ix§,N¬Ò%Uí§Óëþé“Gÿå“—Ólô_}òêUÁ'öaâ9ý#‹Xo>ðÚ ì%…ê?ì;O#ì»äy}ì?BÖ>RÇàÓµB‡ä9�€›1-š¬ÿµeØÒãúB🦬£¦Sá3 ×{ahÛ¨üÃV#`ÍLˆj9à(Qz“ŽaEè=‘Â#r°pö€DuüÑÀ+ú™ì „= 1i5´W ÷ÀÁK4øÁܧ@ù€§fG<ïÑ…½Œ¹kÀÃï‚õXG9xq¬SÁú¬ A�ö*ˆÝ“•ð¾rðƒ€58ðóE8êRÐ4úÔùQx� ª‡Àk°î9äàŒp8ÄÍ/9èÕJ\#ç‰ý®­„ý½ xBf†XM¯Ö?UAF‡2Þ£pÚ}<ì1„=*¸ï_¹z& i�s;pb˜_—¯/Ã{þ ïŸ / Ä=`ïŠsÌ\yi4ÞÛê˜<Öh�ûPçÁKY¦@[^ž^àÀ“À³”<ް´K–’0¸d3à¡CÚ\\›Ï¸MÀëñ’“ò‡�¶'FõëËãýî¸ß‹ÿðVè¥zß\†ùF`î*ì…â ûÀÑøûÀ^+Tg�߀7ŠqPÞ‘î[X³†µzìE}LX¿„~!ìñ…>¿{æBÜ‚5S”{ñZ>ô°àÿC8ƒ½ty Σà¹kÍ£!Öcÿè§Ã:—Gê"ìwù:ôñfQØý Àã†ú‰qóÁWžÉ~¯M¦5+ƒ'¤ðBÐTæŒã88g„cö€�¬jÚ…ÐéøZáz7€Ø…ü½m åS2¥Jú*øšœÑ¹�Ÿ|0ŠŸðç›±¯vÐýÕèµÀÙ`øÝЭûɬV5è…2Wæ³îéJ°Ï z=dBùaàË ¸/�æì×¾�qnÀ�å°VŒýÞÞî€Ü± Ï{À~ôo¬zßÀûea}Öy¡§ûqè¨ÂÍtv�– ±v‡ð|àÊìÞ+ =EX»†ù.ô¾½\dŸ8{½ØFÌ„^šKð:�C~n¯ý_ ›Ž½¡Q~û^]�k?æñsñû'ÜDZÇ=ñ�÷¨s {Q �&0>>´§ÞìÌpè-ñ�ÏÈCϘ<í8–B~„=¬LØ›Mô¥¨éŒ]âLÖëÚ":µ}Ÿ(£YüÖq¿žëkž€‡¡_àvE Ö™£îcñ³*.׊�ÒçÃ2ì%ž°'rpP.ÂO×cÌáv]‰u¿±� È]AÊÐßÌj«@Z…M¡’fÒ®9óÉȲMäµOè}úük_Õ¹?ô©Wߌ©ü�é¼~–¾úI‡Ìú´ŸÊPgouóÅOš�H^Õ[Š_7�fvŠ™ŒM6æí.ãËIK¤§ìÆA_ï]E÷ <$Ñ<]& zºžMiR“^­§L³+DÓ*HÓÔ2ž(¶Xû[O—:&à{ ¼’J¬Ù ýQðóM°/ƒJªÙ ^B˜s"lÏf½×e²?è0i}êLrû>X7�ü�pžKkQ¦Ác4µy/S†ûÒlð£u�?©ÌuÈ-LR‹ øF‚ïÄ™Ø÷æJÜKÅûEff<_Y¯ëKè°'ëhÙ»­dÆû}TZó>:³ù€(»Ù@˜Ù¨ ¾‘drÃ8GèßÀ¹“ U;!N ®©ÔØ;B_ý ÍÜlá�÷4s÷=ÉOëÝ+ˆoÛIf×`žö‹ŠßŸc‹:O‰Ÿ¶aî·1›è@¿+¹SkÌÞnˆn7£ÿ¯�å6™°÷»*´túv=Ó¸�—ýY™Îëb%OkOHòjÌËHrjI:óƒ– «M¸x+Á^FV¼CœP¹_x¿MÈÞî0±U;‡|K³–2É­û‘oÖS–>€wÓÉ-ÊÆ÷ªß©9Lg|Õ CŠÖƒ¯®ÈïÙZìé–P¯Œ×´|­†zŒû�‡mFdÊ·B Å8DVº]äûx 쑦ՊÒz´ Å\¾·ñ§™´KÖ<Úíê|Ò3o¡a\ýÃ{œºàéõò›„,úÝ”.øf.x÷·ƒü ÎŒnûb/ìyïÍ´~r¤+?X²…}'áÞI+ÊÜÄ•µŽÂç½æôãý´_,~ÞpRú¤î”ñÝ3iF-O_­.Iª?À¤4ïG¹gŒ+òd5“Ô¦"¾Òbdr¥ž%µkˆüŸ¬®hâ–°Pâ<Ëäœ×Tc÷Ì%ÂpX;~�ýŸÀÖé >2×; ˜ýFln;Ëæ¶ Ù§EOê�_´›‹®uPTÖ€•ذK�Ñ¥Â^ïà±wÛ�!ywÀ€¼óUŸ¹ñшº3`ÄÞé é»Ý|öa«Ht¯E,É«=dò¢äœèA• “Þ¡!H©ÛM¦w«¢CbŽ y½âbŒ¾Ò¥!ÌhÓ†õZavĦ¾ôj-%½Q)d2j5¨ÔfÈ}lÊIÍʰfA¦½W&3?ìãç öiÑ7ºõÈÛºÔÍ�zÔí�Ì£~)û´å�–zþQ¾úpT”×uPt ]ã�vJ˜× ?h9È>hÓw»xÐcæßÿª'ÈýªO>þL³ù�ŠþnB>ÿ*–µY‰ËªìM^½½`òäíiÉ�*)sµE�Éú çƆço†Z€ë ÂGÔ‹�an�„Mí×`Q.8x­Ä„MjWã<%odf5<-a-Ô¸ ÈZú¬ÂBt·ÇX˜Û+ßìI²Û(ÉÕZ˜Ö¢-ÊêÑg3{´Y¿G«À#‹õ¹»ŒŽ,ÙŠ}IÃó·~y£yZ²E”Þ¡-J{¯E§ö¨ñ³¿¨ âûwðÒ¿íáeÿP6,âH^3wBðáÏKâþº@a—Yûå ÕòÅšéûèN÷}s• –úp/òxû�ñ@}�¨ç½¿´³!ؤ«<òhû‹I}•'º�búõ׃Âüžãâ’[éËÆ³¢;­éíZÓ¼òS_æ[›>,±ß«‘’Y_Ô‰m;…׺øÒ¼Ú£ìÍ^’Š­Ùý?è ³ZõQ2”^©˜Þª:l|£F |“NëPg!2:5éÛ­ù°›¢^ôIéü¯‡Ù·=lyç9æ]÷¦òýy¦ªó,õ|@Ìäu3P›¨ç½"êÞ{ù°O ¼×"¤ š1 ­V®f/ãþwáâÁÆ A gÁ«åÌ©ÆÏ˜†N[æuïa*瓆j¨]ôLàe°¦‰s9Â¥P _Å «Yûöw5an§DRTqÑüÑ‹‹’ø: &øájþÍïšä­o:‚—ŸòñÍÏþMUÓ»•Ÿøm§(yPKšÕJšÞ­>.-*¶1.+v=ø®ÈÝ$¿ÔNü¼ö¤äV³H”Ýa„±Ê•^Mài4ªslz¿„[ÅöWæ âj· ò~5$K¾™Ñ½Ÿ�ÅŸÞŠK…ŸÞû±¿vû ?5ú±_û¼™�>ñ@Yðñ¶ìÈ3-i2¯ŠÀ¸ðòË1G;oʨ�ß]Ä}ÍÁGÞß�5éy)þÐ(éhö§ë:/¢ûiÁ¼4g_d}ßG¦ ¨H^4Y˜–;Iµ¾úp„¾?H1OºÅâwMÖ&­%Aâ²{áë–S¢’¶s’â*Iiµ£IuÁeÑ»+ÉË: Ñ›: q~ÓYöe§9ýºë øEŠÇÊS’‚RKqa•%ÊyÆFÝ;ùþ÷—ðbk7ònÿC�÷„3¢ŠûŽˆÚ¼¤Ýå!Ò¾êQw“�°¯ÅGÜÓ@·½·ã—þÍ”_ú§ Yú«¹ òË1úýG{á`£¯äSu¨y÷ƒñ§æ ºòýYúe�”¹Þk@†½YO‡¼ZGEÕm¥®}Ô�×DÏÍ�_V\�¾(·�æV–Üi4–Þ¯63¾SmʧÊ÷|¶�wÈn¤ž¶1AÓær"§ Ĺõff�¯d§Úo%Y5¥§k}�hÜPâ u�½ÕB‰®6‰rÑ}zýî‚I}¾ŸôUå9öZ³¡äV«ò ÛÑäv²=;Å\LÂ;O™_©4Äàáž»Qƃa’OE!fDÚ×Gâ˜Ì.u‰º[ê•þÎ]fÑ’-Aq{¸;7êXûÍIU°¸¿%àP×KÓ8`ÃËãt©ìïš‚Äî]ŒÇã¥ô•/LžÔž—<î îµÁ‰ç[RÍ»ïÇH¾T†‰?· ?µˆ¾µêyu®)%þx[ŽÌ´ïQ8¿æÇQÃÛ¨1׿ˆsÛP�Ðú>XņoìÊd÷èàš{¯U"¼ŽðßµVÒ8³^ In×f*÷RÑo·RW?jŠ_¶�2®,s“”U: 0dý¶OQ²Ž .ZË|·Ž|2HJêÊÜ�¾šp¤ûY¼´³,Pô¾ÖËx°,âBSb¢g]`’G]`brµk¬W]`ª¤µÄ›®o?oÚÿ6Òµ14Å»Á':¼Ñ-:³Ú92»Ö1üF¥SºÞ(ï ?YÀ;¿¨€JÙ¥†˜èƒD°>xÐ¥ýg˜g¦’§�'%/-$E5ÅO�±w[höz‹‘èc“�³a¿vyŸjɉ?Ûr%Ù¢åjÒ©–›É’Î?ºäó ^éß$‚ÚÇȪ¿7xÃê½à4 Òº·^ù¸Sô¶íÂÁ%²C=/dLë{¦¤ë4SÚa‰ðó1qF³!“ó^Wt¿V*|[qÖ¤ñµß±öÛq‡:Go¿ŸhÕœ–n×ëUãåÐTå‘Yáy»Î!"¿Î:´¬ébpqµmXa¥]Xi­uHU�uHú¹¢Ê&¬´Ô><¯Ì1"³Ì5*¨Ì7Ö¢1-ƸÿUˆh Ö߬ûq$Yÿ§%ÿ1Ç£îÿƒÏÜþÆgôŠD; ¯~4dR¾ª‹¯vÑ̽o´°¬ó‚¤·9HØÕêÅv½÷�ô×…Š?U„ÒÜ„Ÿ;ü¤ý¥a&½U‘Lk—ÿÙï|òé{RTP{RÚüÎ[Ò_bÒÿ&Ò­689 Á'õ|KÖ•C]Ïd’ÞbßÃ=ÏbŽv߉;Ò}3Ú¦5"&¤ÆCv·Ú!²¸Î&¬°Ñ:ôU“uhúš_oš_gú´Ú>"Í»Ô*WYz¹«,¹ÂMæU#ýTlPÆ ÃJWð¯rªÂ{"q^ÿAɽn3qQËY“Òw“Æâ@ÓŽ’Ñ›&KAö€™Ñ§&Înˆ¶–5]¢šüò‹™¤¶Î3 Ò?Õ¹&2Õ´­8R˜ßv‚¼þ»6?±a›àê æq¯HØÜäfÕ”œr²íf’Io1Ê…ùÑ&}%⯠!‡zre¶Í²Ä„:—ؘ:÷D‹Ö¬dIÿ»¶³ÞõXç�x÷æÀ�ÿظ:—ÈÕápÜ©rˆx„Æée¹}ä‹çا%N²;¥N‘±eQÇ;r¢D[„Í^ÒšêË‚öSâÒ:kÑ»FkqE�=Ì�È’Ë(®ýe~~Ñ.Õ¡±I%1þ‰tףן×Ä?ŠòSP¹o|l±Wtz±‡Ì¡> ÅWRRh¥OÒqtnÔÀ ³ÞNÏà5§'hùn ÿö©¦Û©!Õ�9�5A9m73Ì»r£ÙÆ [aEùy÷ºÐL'8^VÙEܨqŒH¯p‰¸[kQÜh–Úè}¤çN õk�«áî˜Qß?Nñ¾sÉMú;VGÄTùÄÄ—ºGe{DÙWEE[6$G�mH‰>Þ’)ýPlÖó4Rò¡)Dò¾)PÒÒæ'|øë!êÆßu„Ï~=lÖ\u¶9+õLKv‘÷wbö>�:ôái´ðc‡ùá7¦·ÇMô­:èHç-™YßÃH£î„QËàú}�Ý‘Î{±® W�ëó/¼âtô³¾mÑ÷<_ß&iª�cÒtýäæ Fˆ¨Þ.Ç]WcC›ÜcãjÜdæÝ7#�~ãÎëuqƺ8±N?'Ñéã„Úý£7È™}åÎýà¬ØoÕžì÷jOòË'½VN¬Õ¼Ìð>§I½ùqH\ÒbkRSí{¼õn¢cMTJT…wbf¹[¬mSlª¤§*@ØÐäÂÖw؉ê«\%½�Ág3’œ«#m«bnºË¾qްnˆC9ûY¬´¿"ܬ§0Ú¼;7æBKRª½_ªKmxâÉö¬æ÷îËtg§£°§ åΊp󞼘SíÙqZbccÜb½êý„ŸZü¨îÏöTç7;^g¦_ÌéëÜÜ¡;S'8g®V §Êëú~ZôkU�w¥LZ‰[$ª{‘7ŠÝ"½Ê"N5gD˜w^�`ú<؆¶Ì«O‡Q?Â6u:ë¸ïQ”x·È%òå;‡ˆÜ"WÙí7®èÿu�|òÆ92ý­Gôá.TcûŠÃ¡¾úUúÇ>yëYPâ–�rVi•MÈ`óÅ �è(F¹Î£Þ?FðÇGg­VŽgô�³:ÒuSv¥Ñ)¦¸ùRèãF»ÈÜF»¨àf¯dÑ÷ò@Ñ÷ª¨‡¦ƒE‘üþß.è<ãTô‚'iµ�ßor^n_Llß§MlÞ¹—غc±q«*±~óbÍVbýVB™t¦nÿxŠzÖßVhÔsÔ—g§²°ˆô—Þ²¯=¢Â ýd±ù¾²´B�ÈЂ€èË;œiÊŠö~ð5î® ?Ú~'á¢øÐ2ß„Ô7^±éïÜd97DWxÆÎã7ýý„ñÇü°ôJÙK”ßž6Y‡Ýn³½ÝaÎþhôÑËù´ÅÀ:r²šŽˆX5W‰X8\�˜O(s‰iÄlt(¡ïWŽžM¬›½„Ø·ODh‰íå4¥nò;wÓÄÒ)s‰9Ä,ô[³ˆ ò Äd¹ÙÄÌáJÄÜÑK ¥ik‰…s7+V([ -ˆ}>•3<çvéUsBAןVÔî�ðÍg “η‘ÙoØû$’ìüõÝ×ëjßSÛ|)¤¡õb0šCñä�>7íFÎà@ίk8^Ÿªm“1YÏ鮂Nà[%íœ/ëµrÿ¾Eû·S;¦~© ï±Xi±pæ"BIa1º†Äb1žCŒEÇ$ô“"1�P’ŸA,ž¦D¬ÛfDì5 “W¹ôl¼jüà<�fNÓð wš÷+gcÜÿܧ* žýÚé+üÜàKþúÉõbktÌ«TƒÛ.†F7;Gèæô÷'–ÏZŽâp*:8·Qè¬äðUÀØŒCœé0â?>àýÿü!‡¯~îÀbÔ°)èëDb¤ÜDôÓ bæ”ÕÄÚ-‡ˆý^Õ ¼T79'”£‹ûZN´^‹ÍÎ÷ˆ*,pÏ|ã•ýÖ- å˜ðÅŽa•A±¦‡z–ÇAl>,rЏóÖ92¶Ä3êD{V”ð×Öö÷&?§¦à¸ê÷VÁá-οs§öË^ÏÝ´G—P?]Ãh|þ#ÑÂ÷Ð5MG7}ßû/WóŸ?†á«û×ë†>aìÆ¢oš‹«öž$TüÚf¨ßàVêpGÙÎ^ÒŽª ³ÖgÇZsd—jcc­ëd1¯^!,‹bÆ0¶È[ã˜ûÊCö²Ð�äÒG.Q�%NÑ�åâ�%þèß3×íäXÃ>î$ÿ;g£õŽÓØ©oNLA#ôÿú®Qîç�ÿŽøyÏF-!.Ô'Öj\"öºVORïæPŸÊí¬J“‚^úÉn¿öˆ~Rà"{œïó¸Ø9îþ[çè®ÑE/Ý¢_å»F…¼õ�t­ � .ó�ªð–eV"ÞUáy£Ì9"©ÌCÆûÊYi¼â¶ª{Ýš®jn+·níVb¦Ü$ƒcðYüŸ1'‡ï¿<ŽSøúŸ¯a(G¢÷Gá¹74‡áïáµÑèsʪˆ™Ä”‹‰9Šû‰å»N[MÓä48 òs—£iÏÃÀœb׈ ?ÙÉÖÌ(àÃ�©2ÀeÀ+öŠòE_mk£¢�µçDÂë9ï\"*fo¨µº֡‰u®±f}¹‘_ˆU/…Žš7kæÿï½ŽŽ½Ö¿^ƒë•ÿùÞÐu�Äwf,ºCcÑç$<{‡2êP’ÿy­cðüS˜¼‘X¹ã±óø­7¸5‚Îúpë½Ð³UéÑ‘o|pžiL�ªÍwKxWè]�ư¡Ø%¡¹È-¹ù�sBm¹cô«7.Ñ(>e� ]e Å^2�AN²AYB̘0 Ï­ÿ./üo?þºÎÿî®iÌÏ1‰>Gã럄>QMœº™X°L@¬P¹Hl'Û“ÉÍÓûÌ™n¼é�ôÜWvë…gô‹×n±o \Ê ÜRÊJœ“žºÆæºD¥zF:VDDÁáV…ê{dt•{ä¡î[!ÚeœÎªeÿ××1” åñ9Ëÿ˘ûùÞXôî8ô9eØLb†üêç÷£qóóûÉhG,$f£qš3m31Wa31kî^bÎubÞ"CbÖ">1k±!¡8G�˜±@‹˜»Œ!Öè„»['¨¼áÖ‰ß?w …qK‘OÔ£B—H„Íd1%‘gF÷¸]€ð ÂbïÞ9FÕ9G;E¡kŒÔýÆÜq"XnѦ�¨¶Nþ·¯ òähœ†ãï‡ràЋÑÈ$b†ÜLbÖØåĬ)ëˆ93÷KÖHˆeÛO 7›£ã1g¥ˆ˜³�"f.%‰™ó ˆŠêÄìÙð{ëxÑÄn§º êï9Mý>î°YÓÝË©� Oý£JŸyÄ5¼vO()pK@5>öu±cäûR§˜�J‡˜þZ»Ø�:‡ÄÚR§À¤Ú?8É¢-Fÿ«1ƒóŸ„1Ú¤Ÿèq¨æÁÜzozw ¡0r1gÜbÖø•„âÔµ(7¯ ¦¬Aóo1kênBqÚnbú´½øÚæ.7!æ. ×�"Vhû›Ý•ßÜ=E%—[¾¯„Ûªÿ‘;r¤þª/`Ðg/Dc7nÊ››‰9 {‰ù IbѦÄÒ½ÖÄb Wb‰š 1_Ù†˜§nKü¢nG,çEë�3ävø¶MRyÌ­0èçŽ »‹œÎ•$ºçG„=}à“XýÌ3¹þµgz~¾‹ 8Cp¹o¬US|l!â åö¸)úøò²ÊmnɬYëþíZ>c-Àˆ¨z GµlœÊý‹Åá QžŸ�"rŽÍièsºœº¾ÄÌq‹ˆiã ÜˆŽÉ+ …é(ÿ/Ò&”Ö˜Jk͉N‹÷8‹õ#ˆÚÄó[rÛ¼êÆí½Å-TkäT>%éxîy¦&-8ôU`Ô­ç‘•¯\e èÚJó�ß”:D¼¯¶ ýTgßßb—\^ã�˜Têaô£ç‘õÿŭ0ðüüW.ÂÂcÐh�Csm:ÃYø˜.ÿ ¡8i+Åyj(uˆÙ(Ù(!~YÏ œ¢OÌY¬M(ÎV%hŠëMˆù;Ñœ3 $6ž¸#¿%¤qÂΫÜ,åJn£j%·ÍðëŸ'Í›®úøû‡Ç\–¡Üó ai£Ñ-ÕŽ ]µI½õÉŸëí“zªœS:+¡—©ÕÊ,RÚþo�›ü¿äÇ¡ü1] BãWJ¿¨ ”´Ðu¨³æ«¡\¡L(ÌDùcæ6”3ÑúT~chçøí¹Ùªýœ²Ú{nŸþ gnÐË�`?ôyi¹vª>+úP×ýˆSMÙ±©¯¼c“^ûÄžn¾š`ú¡$Ê¥."µ¼Ü6¤¯Ò&4¾Ä#ê@Gmеü¯m$¾ž ¸6O&qþ‡1ÿ8ü0äËé#æ! 2ÍGEbê8”ˆé׳苔>¶|>|Ohߌ=׸ùÊO¹å€'•qËv'ÿmÖÎÈÞiÛCº§ìp)¿ãÒ£Ñ{ü*¦¨æq+ö×qªFŸ¸³†Ÿ¸3Â/Å^¦}ƒÏ6ÅGŸNXóp×BÙ³·Že¥öáÍï¢*�“jß9Å‘_šÔœßMƒùý߉Í1?k9Ä' cÅQsˆ¹SÖ Wék4-‰å” ±Ì<ŒXí�7|�ýÞ�ÙäñfôºK�‡¯s|1b‹WùØ-þ-ã·ø6ŒßâøvôVëüQ;=*'ì{Ä­ÙWÇíV¾Á-R jQPËá–iÖqš: œ@·�é6sBþ wébML`¸®l„��«Âb hCBKoz’ëÍB*÷‹ÀÀãÖleáÅa‹–íùâR�äõŠÏT!æ«ŠË ‰eû,‰µ¤±š¼L¬…›N\“ßT;q÷Unžò 4>UÜ–}UÜÈ»ê§l=–%¿NäOl–F ÛqêÚˆ=.e÷ú¶NS�ù:wÿ#n#Â't~åLx?/°_ŠÝuz8á�€ÒyºQÍË CŠ—Swÿ4–öœ=ûv”ºõ§¾ ýoªlÎ?ŒD¾›²O>› s{%ÒG5ÇÄ­ga¿“~1g¤"�Ÿ.ÿ?×=è‡ÀL›:zÂú‰_”xÄ‚U&Ä¢m'‰¥6Äž'±ú€±vÏ1bÕfŠX¶Z�X¾\ƒX½UHl%†m?ÿhÔÛâ±ûÒþ¾P£šSÓ®çŒôz9SòËw'óŽa¢Ïo/ó¿}³|þa§Óʱ²~[­�ܽZç:·Y¯Œ34(åh^%g*h8Ã6Õ9°ïk\õ>�6ë~)}ì ë¬yï8‰ êÇq¶«Íý:$±²Ì6Ä£2(Z-ipÁB¥­ÿF\ÊkCØÍ3t�ÓÆ-&æÌÙJ,ÙdDlÔà6(ç4 š9S^7g)øÓ^ü­&ˆýòÞ[ï§¢o|BNuÓvB[C�€ç(a#™Ö¤B‡¿Ú ²Ë˜+>6E蜷ˆÎþCG˜7`Le}Ö¤Ýo.àÛe)꘎Z½Ñ�˜3añéýGlÊ#œ…0Ö¤åÄâ-Bb³q’Üî öi�ÿöÆóå áwî”ᯜ…þ'î°N#Êu©_Αºï8=ÃÎL0ÀÙuq' Ê9Vÿ9wÀ0²}�¡Ç�y©=›ù•¦û>¸ð?rÖ¼vî„nΟ[ }s•x u[¨«ŸÐY~Lé2ôùj2ñÅVún­‘(ï­XR^loÚP |ÜeÊ& îgÂ+·1�E똼fÆ´ùe€¤§<РŒc6ì¢þÛë‹òâ$ù¹ÄäÑóˆ© ½…X°R‡X§gCl;ysø6ïŠñ»oþýµ*nšO^r{x>WçV«5p{µ㤂ïí©?ÛÝÙßüL^DÀÚÛßêA×õ]¤Þ|;L¾ú]Ìž×5¹KÊZœÙ¼1i›¤ £ªChíÜA0|†€ýï¼ø²Í†�ÿ¡iÿvï’ßDxZ“¿‘Ìî× ïöñ15[Nq3YÏä_Ä~iKÙØ²ÝÆYõ´´¨ÔƤ¬ØSú¼î´0·C,Ìiã‘Y]ûÉØÒ-|ÿ uÎG�‡õ¶éÃ'àÞÁ¿~ÀX*L^Aü²R�X­cA춸9jÿ=n•ÖŽFüò(ôè´8V·›Ör&z·þ¶S÷°ã-]‟0â™,i"wð„Ýx3×”¥ÂèÒ=lÀƒ5úºá8†6³ Z²ÂäNuaJ·öb#�Ú­&¾ÑÌ2ÕÝV¢âæ³dæïûɰWkøw¿jS…ƒ‡é†Þ ]Ü!�JNUÙ§têŽ#éòÛ�fß}4{„ꉜQ—LRw}<í@ö×5ôà€ìÅq® K {¿ÚëÝç” cº×¦ÙnpŸS7ºúc¯ÑŸ)»w«ë”fçÌ!4‰ƒ§-ÇšÛ:Î8äpy6<'ft÷‹:ý¦ý˜¸²Ò�ÿðWÿî¯Úü¿© î/8øO%C3—R·› ðÍçÌŒnÿ©Î÷¹”²MŸ)0sÉ7»0BpììüÜKv·�Éã Kãüú‹äó†'{·žðh‰AÚàVýľõÚ.y ûÄÎrëU¤ÄRT›g¯R&ªš›† S ®UԸíÑ|ÍíÕÌGÇ}”÷S?,Õp¿9Mó|ÔX}×+ F!W¤Î3Œ¸µØ ­n³ÁÕ;ùA/V�v©3© 1ÓX›¤™´ãµy´Ýõ¹ôiÿ Ô´õÝ{ ž6ªWñ ×äyÔÕMÉ“šãÆe•®f¯ŒKKœ%ù5Vükƒêð\i1Ýà‚÷8m÷¬>/fí5ó’_½‹$fLP"¦�F|ñÐåë UçÂÉêÍÜ~íC}ùèFõÿæÌ{Í1F×9UC§¸éFGѽ¼à9Aöd%å‘2å�áôiÏñ )¨§¢NhlÙFè+«Bæ~Vkǹe/2±Ÿ)4àÐûF(oÐîñsÉØ²-dPÞrÚïÎ2Æûî2Qz‹¶YVµ„�.ÛÉÚÏ€g0耛˨´Î}t|ín*ôÉZAæG5IN-þP m.÷7ºñwU�[Ê~|Ù&òÉ cÜ\âk2ð&’ýÞèÇÿÁÙð~ã. zvZ«“#µr¹íZ—r&«$4ÅG‡éÅ7®fšzl…å�éÇßXÁùè)û•µCž)�ŸÑð}ºœô¼\›/!¶/YEì]¹‰Ðß§J˜ˆÍä]pšj~ÞiÚAKçÉR» ™TRÑ.Øç+|Ô`BæuðȜϚ¼ìËióHÿœEôÍNØW+¸þMƒÓ¾I÷quýﺼèÊ ”m’"yÚ~ m1ƒŸÚ¸‹¾> Kæ hð’*·ðÂ^¯0HëÙj˜ÇiÞåöëçüØ¡{ýï[u¯q›5 ¸�šýœ¾ö¯œXs�ÓÓnàtußr:ú/9£Ž5xÁéè?QÒ;ã{¼Ö}n ï#w öòñª83}—,…:Æ„ºŠº&uBm‡2±oÇ.B`a7†¹Ö®/Ìi4¤Ò›U–Îc ùRžIçQBBzÆa<‹Æ\©×2¾Q"ÆÏầ*�† £Yæpm uÞg"i<•Ê] ÏŸHRõáÙ6§É@ò´üˆ(¯I"É­?ÈfökÓñí{I»™´AuØó)z[wžwëw ^ZûN2äñJAøÃUüÜoºF…’zUSupõ;9S4nzZ·¸MzÁ ‹uÍÜF(+š†B_rIžw!j²ºŽˆØ³M�Ð9 !4U´•Õ› Í=û‡¼h„gä44õ ÕÝû-u}‚o@"©™¼éY»‰&n©‹M=®®€gƒ$nasáGöj»®é�ª£¢»ïÅü«ŸÕŽÑ ”Ç•_éU‘%È‹ÑÓøgÆ ®ü©"Éo9ÏÜé¥ñ³.¶ Šð<3és}!é–0›rM™+ð½³È0¥~³á�jF×¾*Å•­7Èتõëý\„e‹9£Ê¿IŒŠÿÆèÞÿc—�ç•Yβi†ßvPyý”QlÛ&Cû˜iÛ„‚‹¡S …‡‡©lÝAl[²œØ³~+¡‹æuÌi4<ËZz’‹¾Ó@‹� ¾ŽÊéÖÝ« ï× Ù;-´ðfŸÎîÓ"ì¡]âç°6á3XÇ”9´}<Ê·ñ³Hïôù0y×úÕÈ‚NQQíòÁgïÚ75~ÖGeþÕ/ûèh¶¸ÍR˜ßv’íû>Áy¿‰´•çDÒ%c./±aýüƒTÒR}ùX׃¶«ÞÕðg ÿ”S×—õ­ÖsÊSܧŒÐ¦-åô/%M6Êå4ù�O–ê‹-åxfv#&—†RÇåTwª¢ù·ŽPFx„ºà7Y�Õ¥ óFŸ5š [Ì´.½0]ôt“0­ò•Z¦"H«ÞËd´ é­j ?§G�ºœ­D;EÏd<Òçó^ð|<등ôyÌŠž;œn¼oÙ”™t°$ßM”Ù§Ï<[Mû<_A^P¥u ù©m»7>k’wzô¨À;Ë(‡Ðé¤sìLžCÒ CßÛó þ?öÞ2:ʬÛ÷­($!‚{pww!�"UõøS•„q!înĈ»áÝÐ ´½­4Ú4Ún¯ï½ÏûÞq÷]ÿYMï÷Œ3Î÷ËýF�Q RIÕóÌ5m­ùÿÕºÐ+epœ›1ÙÜ•‹2óPÓ-¼øDóÞ�fúÄãŽÚ#uÎ;=5sFŒÓL`uÓJÇ™š=[]4{¶lÓôð"b/½Ÿg· .Nlé%(ŠgŸücT±t· qyrlæ(Ì KC�®ÝP/¼4rõï¯Ð§wNäš>^­úm_t~X]Þj„9ÇlU¹öÍ!õâK?𷽸Ž\Ã+…üÞ|jí8±ôÔ‘/»¶€K¨p€ÝsÅæ`®Tw8ÍÚƒåaî^�^I²r{§ó­_oÛ^ì‚n6ôŒHOèâs^æ7WÌv m÷·rÏœ¹¡{0/Î3Ÿ"ävN“kÇñÉÕcù´¦ñúc,Îÿy—®óÑ&ŸÓ¿íÒ_ùÍ›{ïG£ðî�þÎ/~Ò߆p×~ÓiÏÿ§+ó7E{æìæ"‹ìJþfÞ~±˜ßâ‡ÿîf¸ù$Ì÷ÞÇyÆÏïf ·1x_ý\uoý—§WÕÇóöéB4Ë&ÍÓ,µŸÅþœ®q= j´¡iÖº°4kŸ€XK.(ÙZgL°Üµ{¯fóŸ;6l!_á ÄäØiýƒÍ+äè$[5±Ä‘˜Q¡©6R@´¥™d­ùäSoõÂSU¸øƒWÜ:�O©rÔõ=Ù" ü¸º†BråX9³v’Ð÷d�áÆ§ÁŸÜÌ }x¹ÁïÖÝxaà·}˜A“òÏÏšoª®,Kzœøú;«„ê ‹Yž°X{ò»´Ç?[é“~ÌQ›78Õ»òö\]|ËØ={Y½°n«fÛ†=ç-û5µ�f˜³ÔFÛ¬[°\3×v¼fžý8Ͳ1Ó5ÛYþ�üÊ7·k¶R{i%fò G¯/—Zl÷->µXö‹¶Ôêe�h ·$-B°0â‹Æ(ù Ó¤c×× ÝïÐwßßÊréå¸ÿºÖëtÿî&]ø™× ¼ÜŽ‚W>ܾþæ ®ýÉV®óÉV±ÿ—ý´Ö«/,Jûgs'î®Ͻò.¿ÒãÞ ï}ï/~ø*ˆûG�ÅÄ-\Áð ]D��n¾ÏUиîòÒxAç>4w$W;†Ïì› Ý(>8{„—Ê|G”9¤a,³…™B{V¸s+ÂÉ?{ˆerÙ6\\á(!·‡Åó ,<>QHm2ùÈê«K¹Î/· Ý/v g¾÷Ï~çÅÿ´—ô¶Ïÿè)\þI‡9 }÷ómúÆ[˵§~Û…9 Ô²8ó-¼û›Q×ÿ—íÚÆ�—k{ÿ¹ïŸO)­�δ*.-ÔýÙ™øËnèfr•pe—çë›>]¥íýi‹÷™ß©KjqÜçé¯Y»p•fùø9š�óVj¶®Z£qqqѸðÔ¸ìg±�åÇî>’ÆÝSÐìwõÒìw÷ÖxD[èS¡=ÿ‚mh-BëOäÌ9-ó=\�9ñãN¼¿AêyîÂ÷¾p†f7“k'T ÏO?÷4œ»¯ÀvŲ¡¹RNËThbÉg¾Ò+מä«/UáÜÏ^ÜÐ_÷rÃÿ؇™0¾õÑf\C9¯n _10W×þé:áü/>òÍouçþç>mÕ�Eúª»Ë¼{~ÙèÓóë]ñ™YÞ�™VÞr¬¹»>ÐÌûP²%Së  Ë°Þ¼z£fåÌš­ëwköí<Àü¦NF$´áÕÒÓ‹ �Ÿº*Í_îw :tÐ+Ôê�/AC<Ìœ†)˜õ‡î‹\Þ¿s¤,̲š& 3ô�Ï·ògÿâÁ�ú«+_÷Îr1­u’ÀžÐ‹“*i&/«e*å7�ZMº‚WsÇn­ân®ŠOÍæËÎÏÓ |¿ƒ»ø³§pñ'o®ÿ{¸ÒKs¡—¡5ÆYx ‡Íµ~©–\x™�¸ 2óÏ1vÐÔÓù¥ZAgú�üἑbV×4±ìê"îÄW`_ÐüeyÅL!®r4[æÀGæØr#¡)ž›«oº™f�ëÞZ®ïúb3f+Yüó5\{(_}j0Þ¾-¿ÿä0ñg}óçkEûõ5o-Æl"æ×„÷¿ Оú§³.«s’.¾aŒ>¿oºnèßvéNþ¶ù³Íݺá솘>$Î = /5МtZZî®Õvµ‘Ïî�êã—b¹{›‡f۲͗­û™]j5ž:^£SÌõA¬¶ŒÉÅǤÛjCâ,Á $�—À$+>¥q¼Tqc4} ëjLj˜¨†¤Œô IµQ¤@sCHŠ�1¯wŽØzw+´ž �Ág5Oâˆçp½OwÝ�w‰Ã/Ý1ç*Už^=A¾÷™³ræ±N¸ð\«þÅY{öï»ù·”�žE)·žÏüè¥~ºK,š+æ4Næê.-ÑŸû‹Í.¿ý“ª¿ø±ºãñ]RÃX.©Ñ‘ëùm‡¾ï×�ü±O×éË/Íç³;¦èJ®ÌÑ'7�svöÔl\±Nãºý€O°¾t:ö'‹=:c�9i~ ’F§‘4š©d—ÌoŠ — Cßîãzïn—“ ÇH1évraó ¾ñæJ±öÆ ¾‰ý¾“Ý«üa§”Û2MH«/�ŸÖŸ^?^L?> qRÌižBš:i¬Lf¹xÁÀ,1»y iI¦6Nà£Ómøè;ÒÛ)ký™X;– É­y¼søÐ¨ÒN·Æœ4ôö¤òk‹åÊwVð1£|¸@3O�¯öÌEåÛIÙ�Ó°^t§þºGwî·}ÜàO»¹¡?ïÕw¿Ø.•ž_mwè}ßì�Æ´‡øf“†5wòû}ÒЫƒâÅ—zñíWá­—’nð7g¡æ­¥Ð�CÜÐ7ÿi-wá׃ܹ¿¹é�}¶†ËꙂ¾š>åø8¾’ùÌžÛ‘Cpm�6c~zþÐŽÔ©l­Š´àÒjÇ¡7 ïýf;ßôÉZ.¤`¤û>™ÕA®š²FŠ/#•öÍ�6¥TÐ7‹]ˉRrãx\c]DæH�o‚¥6 Ê̾íþ°z  ¤Tž\"Õ½³Ú:Ðû$�ëÜÞYÐ%-m+t­­Õõ>ÛÆÖãáøÛ«Å–7ñw·Êý�Ü '¿ÒI}_îúì†ÞÏŸÿÁSºñ­¯üðQºñågƯ>.Äü½ÿ·S¤kOø\!ëød¶v× g~9€Y\þìzè²NNÙ»�×ìØ¸S£�¬%tÿ°[úÁ úb\nÏT}ÙÕyúÄŽÈE]wƒÙê«�¾ éF/ cPæ9¶r ±Òš&BS\%ððëŒ×> ‘Ï=ÖAF8¾^<šèüé_Ýuƒ¿8CÛŒk~²÷Zt`¬®Œ-qr»¦ ù,βúBd¾BÈhš(¥ÖŒ2ŽMärY}”X3VH¬uêÆÊQù£øØ"{žÅ`pqÁ !¨e.¦Ô�Ç|+×÷›3×÷Í.èxHù]3‰UTÍ꜖O7‚/>¸¼`3AcHL, áì·äëÏTõÒ×éìW:ÔÐŒFï„4„*Î,Kºœ õÄ7½·Ú3`ƒð¬NâOýÙ�;õ—}ºž—[±f a&�?—3JÊo›�¼…øÉE,:7Ü]VË &H,œ…†•eã©5À'˜Có]–d­ÏÉç�šÉÖö.©ôÒBOïÍÞû4|d �h%´Ï„Ž8t€„¨\;0° O(Ä”Øë‚­öyHšƒb¨»3 =MWÞ?ÎZ2"égÎ%-üYzr�\Ö7_®¼°”´RÊ/,äŽÝ^ML‘þï÷©g¾â.|ýV¼ÿ¥Ïƒ¤¾§n¤GÁîµtå¹ ~ôuŒá›/Jý¿ù ³rÐ*QÏ?1—ƒ¾é�zVƒèÛ?ߨëýy»¾òÝ…Ú°¢‘{œ½5Û–nÒ¸±ššN7c G�Ømî}(ÞÒÃ+€ùÍ��b í©À–÷Ý}[?p!í´ð;hE�[ }1¥n<–8qÛpùžñЕÏÃ¥ú·WA—šJ\Ë{k…‹Ö —þ¡óøÇ¡èâ\hØ •,§lxg•˜X7ÎG 2C®'Ÿ�‹8‹ºZw(ÊÚþÜ‘R{hr ÕctQÙÌgæÛ‰‘Ì×%•;ÊЛLm™¬I²:x�Å@½¤�N21Ö˜=�c…Þ#-!‡LŒÓÖéàHIù£å´²qÐeÄçZÜrÙ™…Ыc1ÌÙ¤‘50Zwà‘fTbÕxèBëCßûõðˆ žjã�µÈ»¤K/é>ðqy£ô~¡œ_„‰Û�e+õí÷7‰I'Æ{)‘æ>"ó�B�™œ:1DÌj™Â'–�öö�$†´.0’®˜g>~a椳‘ß319Ч·¬áÅZ�_ÄꔉrNý0±ÏÁaå#3lÐ'ó–ÃÍYŽ`¦L·ªÆ !é#tR8éIÐÊÏj˜$• ÌcuûNè&Šý_íºïí’®¯&Í»šËËÁì»O=ýXèÝ÷‚n½“â{ö¾‘´!ß[‹5ªoyb¹üî‹Cò'/£1§‡:®‚Ÿ?óeaBR‹�]Ó…¸ªÑèUñéÍQ#ИíÚv@³yá&ÍÞ�5ÚÀd+�!ÆÂ�Õ®{ö{³\šå�J(ñ·½õþfÐä†þ4ôK¡ýÏÄ[éøsþÐ+9¥z¼Pqn!| t›øcŸ­7œýJ6œ~!ÈU——‘vaaÛ,þô÷òÛ¯|ù›ÿ!ù\ø/W¾ôÊ|Š;à“¥·LæÇ[ðÖjÀ�Å\=pÚ�të}nZ ü"qÊX fÔ±˜žm 6'a ]LâU2û‚&”—NÖ‡Â-å8fc‰…cÄ8¶–²[§�Gí"¥æârÒef9´x(ÆŠôªª¯®T«Î/‡.˜Ubh´5têÄ–�7ËUg—BßÐÄ7Ì¥Æ•Ž¯| ¾ã³-bïƒ=ÈÍ JÜìœÓ ƒ©\xªo< SÎ?ùÖO7a ƒMÀ±k n*4S…Ô†ñBd±�>0Á ¬ )±�›°1¬Koé�–bM,¡Ân'áH±ƒÖ�å'ÌßAûW`µÅò¤ºqÐzWóOÎ%ÞLAËtpŸˆéŠÏÏêh¥ƒÕ¥c1¼-áÈÑÑBrÃ8bävÎPKÎ-"=)ô9¯­”{ﻪƒ�½•®G®bÓÍ5°K™=±gŽx.4°IìúÂõ 2ôÊ“ë}¶SÊleשa<˜2úާ›¹á¿»BsB×ùb3_zr¶œÝ6 ïÍÍÅ•­'Q#„Ùqa¹6>J”9œbÍEàZ$Y¹yI¬æÙ£Ù¸`½fóò š½ÎÐåáH‰ƒþP„%q΋Ûç(5'—‚;(ýâ.œüŃb}ßsgÒb*>=O -¶óm9¶þ´ì~@WZªº±œo{ºM®¿»Zqà¨áž¡—m"qð»}Äú3Bö©™ú¨R;>±Á‘‹©´ç§Z{‰þfÎÛ]4Û¶îÔ`OÈ“ 1ËZ`B׳]Ðñ¥kÄêZo­¨áƒ"­À¨Pëoo$ZB¥#±iÙ:ǵPûî�¼IÎ9>:òR|¡õ; ÚYÞ•ë D§Ú²¿Ï$½¾ ¿z W~áµ§ÿ¾GH¯MF/%ŒÅ6çPH¨�t±ôâBø°¡K/GYùf›nÌét2æŸ�Œ??îkæqà F/ù™A�qz[Ðâ†Þ0kEú“¥'ç+'Þß*µ|¶ \VhŽÚ¯,”ʺçBKS×ñÞzéÂ3Nzì-C‹ÛnALv_üN~!*}Ü™_Ý"ô=q‘Î|å-Ö\[Ê'ØCÃ_Œ/pëŠÑÙvÈÍÑ{� ú� ùŒx�1¡ðÔl1­wª>8ÍŒ=3Æ@—�ïùÙY<þx3³!'Ô~rzç4Ò®ë{²Gßõ` j^0³Ð£>\ÑÐlؼ¡ã+Wh½‰=/v‹m÷v€} Î ®X3B×—;õ}_m‡N(z"äq�KNÏ:^ì0t}í&ô|çÂ^¿ºÆ´ªIRÀ+¬{ôœÔÚ««…žûÎêÐCoß¡G‚Òù`/ßúùf0[¥úKË¡u'ž™KÜ«’Ë‹•¾<ä“ßy ýÛËõ|³C*¾0ŸúÇ%'璾ݩW^Æ«÷‚ÔËÏ|ùÚVÐ>F\Ý.¦tj]V‚»î%6ƒ¢”Ð4Nf?Ÿt$ÁŒav§CÌìבÞ1Ø*Ð/4T^]e,X %TŒUbÊÇ(-SÄŽÇ;Õî‡ûÅú�ש鵓H ñz×GòÀ8“~ggq'X^vþoõú“@ÒTËëšñš�…<ŠW�0i!Å@S´u>¯!«s¦!¹~4P�Y'f@±–˜,ÞBŸXx©Åcå†�7ªí�]}Ûº+-wwË;¶ØÁ˜~lª¡üê 0¾|ãÁØH¶!6{_†“·X{r±tî+oå½û¡ÆÛŸEC‹ÛÍÙ]ãy€7iq÷Þu5 ÞóQäz>ÙJZܨ)»Ÿïd5ôh¢Q�ä:p‡XnÅò_b/²:ƒgñÚô†ÂÞyˆõÐ Ž^ZÀG–�Ò$Y¡î¿DÉ?5[É==›—%§"W€få5—–à¶tR”9¸|°µýÑ^cÇ37µìÚ2ä¿z)È̇÷77À¼«�Åe¡þ*Õ=r|�#4.Ùõ¶×Pí`׫ý™‡ZvctÔ±‡„8ÆÉ¡æ¢¬•_0š48�ß\oè|ìæÛ}ßš»ÐyïˆëcþìØg눋�Ù9 ÚÁ|Ç«í|ýÇ«…â+ „ê;¬¦º¸H,¿´˜xºËpãnpÀ­[‰†›wkÏüe_wk…PóÑJ1­ƒ|,˜sاó:g ¯>ôïÀî{_¹€{â¶×]³o/ó«Z‰å¡~f¯ys†˜|!8Ú q‘¸Y±•cÁJAÿ�¡6Xwj|îh¹ŠÅAh¬B—›ØYÌõ<ܧœ|¬…Ÿ8ô�»¾›å1`g.°Õ$Z‚-«—",ôb¸9ô¸ Ñ…†Ð\;0NHSöP’µDš¶¹£HSùèÐ<úÜ`@$�‡œc×WÁX!¶qL±q çù&VNð‹ÊvSE9Ú;ïµ·R6¸€;ùjŸñíOCü>{/KºòJ€Í¸»xkLœ¦æÉà‘wù¹…ÄÆè±O>õÌÛwàk�ÔóÝ^‘Åhbg±˜Mœ¡Œ–©`gé �ÄÎRÿ…�¥?õ×=¨±¿åy€£\ÉÄÎ*"V±mâ³íÁ¦ 6<éÒöÍ„þ3lï5;KmûÚEîzáBvÌÖ¸VŒ4×3Ûk¯QÁjH«ž€|ZÉïž…÷$…dÛHA#À—7´>v‘»_¹‚{À‡àõæ:1ÐŒø-`†— /€�!ĪSK¥Æ›ë”·{¡«+õ¾Ú�G¡ãÙNóHwž«ÿ_tç§ý¡;ß÷ƒ«áê‹€€�î䨃O¼Äªs‹©oÎCáà,>±Þ‘úŠUW— Çß[�^¸6(ÁZÇ2ËË× ½O¼pÏqÞ 9'ñŠÁÁQ 6ש�”ë‘6÷áXkp‘ˆWt`¼µÉì&¹z<´Ï•Á‰�UÄ®íkvVØY,¿‹ÉµWóNL‡f¬!�ŽßÙYbD‘�–åÁ]ô^ 4 ìwù²�"­ µ,™m†Á^+‰�ÇâõDâ‹Gs¡a–à3AÓ›t¯�ß^OZÜàl±8�§otÉðê|3ꦪGO.’?Ø$A‹»üäBð¯ÔÁG^È‘±—%d°œ)ªÐN5iq¨õþÒ™ó:×xßÕ–C³çшß™fcê§ãÞ3 ì(5:ÃÎÄÎj˜!?ñ@PJ;˨ñöÏ$i8]Øw/ qH�L¶ý��5ì,Ò+}ÍÎ ÊiÌìš©ÔÝZgÌ?µ@eñŒtøÃòl‰Û•Þ:•ŠéåãÁ±4ä6Í€–¾!ƒùBv_•Ð;²ïºÛðzG›^Ÿkz}fÏ hVþÅhf«É%c GûøvÞu÷oèIuSïÃ?tçù׺ó§ŸkÿwÝù¯wCwÞø6Î^¼RÓÀÐT3Û§+¹}³ô!ÉÖèIèÃÒFH ÕŽˆñàfyr‡Ì¼x?3=8j§çÊõ_nBž+§wOEüÛ�L³Ö ~fZ­¢avbIÖ#…£‰ÅžT4VÍižaHª3ñÚ°æ�^Z"ô>s—ýEË{À–çÜËC¯9°w?±³t’j¦þ`gÍF�1ÑËÓ¨ñÜ«eñ%ØñÉ”:Ò’ncM±Q‚FÈÁ©#á£Áâ&>uvãT5·yü§�jƒxO¼ vm¥w6‚ñCúô åŽÈ[U–ë3?°Dmº±Q©9¿\©8·„˜mE­³„�‡®8{ƒ^)´¸¥ÄjG�ýLðÍ¤Ž‡ÎÈIÑTBslÕˆl;œ!6Vaïlô[ˆý›Ý;CH8:š ˆ¶$–‹™#_³³ºî–{íG/å5; ñVI¨{–Ó+ǃWvxɨÍþ›�•obgY½ïa‰øbL¬ž &ZcíBÃ_=Råˆ>×�ß<“xfiMSŒ™µS˜œŒØ!¤Ž ö{½oRÍD¼zëÿúzÔñjQ×hn³¹FÓû› �ïïñ-9½DɨšÝgðž‰[z~�0ð««<ô³tdÁŽ�^Ïb'zBË;딣 LÜõ8K°Á@?{^9Yã%™Ô)o)Ø µ#úÙž:U&¶Ä|†X÷Ájä’rt‰½�·¿æàAsÀS«Œ!†ôЉÆÂöÙà £.'¶)âNɹEè ¶äì|hØãLjVîÌÏnRÃ�µà̓�剳’’¯9ØYzAÒ`g1‡"v–û}ì ö»!¡bœš˜?Æ7"ÅÎ/´ÀŒF90ÆZ Œ¶R¢Xü»‹ùd¹¬oˆ`¨Qï\³¶û;¤¶Ï¶ƒïª$7N4æô8�Q!w¹y>ö9�SA››ø„G;æÝ÷�[ˆ‘PÂòŽÜöéR2ûŒàrôÞcùÖÝÝÆ¬¦é†ð;¿”Æ)¾¬®/Zdº§7ž~¬(ƒ/½yh'·>ØHì,â·Ÿ^Àµ~Hì,±å‹-ÄÎÊj;ËÂkQ�6—rf@«›ØÔG‡‰�e?ì¬|;Ëð¯ì¬è×ì¬Ä‚o¨'²ÚRey;r^°ãsÚg@ßü ä$`�’JØúlœ¶½žÕr{½_˜Çš�K…œ�¸?x}åÕ¥ôSƒå%&�ãÁy*»–JdŽñÉBF€ù­d4Oá�}¸V<õ£‡¾ëÙVð9¿ œ/çÙµÕ ‘ #yÿ‹nŠF˳š<(s¾ÇÓ›Ó茇Ìå´ªñè#"þ ~ÃÏEÜi.�å?™'¦HU——€W6·‡«^ãá¦× ßC“˜?®Ÿ¢–/Ë—òJ·eø“RæsY-#§Ôóç­¸þçÎòÀ‹Ä΂FzDŠ�îvVòïì¬#±³Î®Pên®SãKÆèôþfxïàmc¯Ô�Þ0Y­>½Ì·°{žo|>ñ­©O?6™ôØ[?ÙB¼‡À¥!-{ð ˆMÞ8YN«e¹×©yˆƒbë§Ûä®û{…ŽOwð-ïmžza8ŸCµL—>—ÔðÎhÉãÜ£Zve¸¤êÀcO¹é�õ¾IEãÄ€KcXº-«×¦KÍŸmC&±ZÖÄ—4±³bg=Þ!÷|áƒ3Ȩˆ…“;ŠÎ¡ I¶âBóG¾fg¡¿æñ•J»ç«Uç–«yµÓ(¾çµ:Iµg–* ï®3”]\v¥“5 gŰÆÑ71äv:‰Ç®¯1ñ9Þ]Gܘâ6'|/b‡WÕÕU†£–¨ÙµSà‹¼þP¨%ø[àÜK-77Š�_íB�öÜÁÌ­c¾·i²_7žÎyĺ7æu8Ée=s±! v9ÿ5‡k*÷8‰áé6:1È\ïhŽØIù/4ýS«Æ{¸Ší!31 ÍÚYâ€úÖ�^;Ìød©æÂRµ÷«ƒ¤ƒŒ½ŠÃ™#áó¥¸ÄBÎmá­;dæ�3?,ö —B3dṳÉâqvÑóduΧ¡_jâ— Íj߆¶þFÔ\BãÛ«À!0¤›L|°ìÖˆ;¾Å­äÔÊ++V«‚�ƒþ¦‰)\åhâP±Š<µþÆ:°ß� –KÀ? ×Ű€a_˜±3׌:ä!bÓÕUò±�6#Wľ Øñࢀó#Ö__I¶ ¶LÅ¢rÛ—»`ŸRï�û±_§ö>öðz KÌ‚KçuüÄ`sâ@vÍ’�”ŒÆž>î‰�i‹})¡áÝÕ|ógÀÎ2œz*èû_í;K¬9»3RÑð)»g:´¬ê9ßZLì,°BÐϪ`öYÒË>û¼`g˜ØYò±·Ö‹-ïoBŒ ~+‹ù†ì–”k2¿f òaáÄÍurûÜ%ݳ增ÙÄš/š¯6ÞX/�xoqm±ç_<Ö˜Íê0üÊN.’:ï:ËÝöòÝw·óíìgU_] ž8à=©å×WR›§Á‘VrõÙ¥èi¨gñÈ‹¨·Ñ÷|×öáâ;±‹j�ò+ËäÖOwÈÇ?Ú‚<ÉKë¯á�‰–’²5z>jlž8¨jxŠ­!©|¼ÔõÅßž{ÞÄ’I«›ˆ\€gõ��7«×õ̶ƒ #ô�Á£A_ƒr0âœfزZ¦ƒÝ…šOÎéœæ†\483&ÔgÊ?9W„½¢�e+ÇæŒBF fKJåù¥ØÏ Æ{Tž½˜Lù>r0¥øâBñħ[ÐQŠzç€ù�ø-2¶®+êQò‹ù'¦ƒYMs.õ­'^Pj%1P )ˆÁÌî òP¹žÅmV£!ß'Ž ò¢¢n'‘]{ª�ÀÃMeŸ“ÙéïLw{©æÒ2ô4Ô‹_«†‹÷�bσݒo”¥^+k°EŒšœ†©Äøç yXdÁ(ê'ü ;Kl¼½–ê¶¼–érÝõÕÈÇõ7£~×§ZëYŽ/&·N+M)ù�ÅÉê>¶ŽgI¯ÙY…�³Á6’°¦šoc]-˜kú¹=3aT ‚C]9¼Pª»´\l¹³‘ÙØf©ñ6å,Ô³ª<¹?ƒØpÅÌîÙïC.@¾ Ü)¶FÅ*VË÷<Ü©œ{Èóç¾óà:ïnÁ;칫×WйɔœÑò¹G:ÿ럄_»pþã`ãà}¡ïÞnV9ã=éY3ؽdŸ�]ûÒÞù8ë&…d�TŠÏ- š¹åÎ%µa¢Îf.°œšÖy}Nàn‰Ì~`ãz1Ô\¯÷e¹¡N£Ó5BpêäÇø\‰?­G_‚Õ“#tœÁŒXžìw)¥½sÁ·Âù%bUÞXÁÿ|=˜#`ÊÑœ«eÑ‹C"¬ÀÚÂõTªßZ)V]^Š^>b´šeÃb-ÁQƺR|~!ñQh¯Lª¶Yଡ·�Y2¹îö:ìYó=LØEÉõ%jáéùàPr»œpþFjºcÊ-i -0T\^»§{�~x\ù­3Ñ»–{»3ÿ½BŠËµ—CÓmÄCqVJRýœëÏ|ãi8ÿµ¢ |í%¶ÜßJÌôˆ;}u•Øñùv©íójéðBbšƒyËr>ÊY+Ï/ÆùBø%÷Ä40°Äc7×òÏ÷p-¯Çþ.ö›iÖ1¢ÐŽbRÅÙ%ðóÈ¥””±”§d›j(èp¢=!æßù–;ë¹co¯Äõgõ¼N‰4¿‚˜*,®�Ï+îÀ–…Ä Âçfù#ŶîŪ³‹D–Ÿ³ºe-ò ­ÄüËC…�Œxß8{&¾Ø �¾uû½mbÓ{k±¿Äò¾¹b×ÓÝ8멞ýZëß_G¾:£v"rVü\ò1ì^âì%xO8@q½+ÔýŸ8çÒÞ´�ê^ÄXü|!(Ú g2Ð §Hô;b¥Óúš˜ˆéÇ'ƒ©‚Ï„½1!8Ìò »Ëi�|„Ùö˜“kÆ™xæo­P*Î,F{�È•¸|bb±� ïÍP|r¡Òxkú3J1³?öþÔ’K‹¥”† 8!FfÙ*)àX²Ÿÿ•Ù6qRË>:ÓýK¹áÝõ`?¬-°áÒOLF�MûÈYìþ‚A^^Ý…åÈGˆ[ f{Qÿ\V£Ÿ{çðåÄâéøl ØEx Õ{¨U™Ý"‚ï|¾ƒo¸>O©`¹¸Jˆµ5—ó=ÏœÕá‡:pb°WO¬¯Ä2G:{‚^#Ε�]$³¼|cü?ü¸Ë=·ë;>ßÄ7ÝYC{:É,vÀvØ3ñ�[§Ñ> ú8;œqlŠ)Gn�‰s\ÇÇ”;É%Có¸€+½áˆj p«�s€ '¦×²8Ó4Ifù§ŒóVeÃóÕ¼¦i´WÖtmµØùÙ©é½�ا2­½¤03î0‹e…ýN\ëÇñói¿&“ÙCNÇ4¬1©¨Ï‰¯=»ˆëüt ×òÑîÄë0‹*FdØ€�)F¦Ø(¥ýó‰‡3$yÃsä0C#óìÔ”ã“À*TÀÒfù¨TÙÏ|è¹¥°IVs�ÂÞü xSJLª�x¤ÄAIª'ç÷2Õ1�ú|¬f¢zƒ½×|i/­ÆGÇi�G£6A½‹ëŽ< û­³Y)*Õ†lŒivÍ”üΙ8Ë#Geتˆç�o¯G¾žêAœÙR‹úæâìÖÞö‹•äQ;Ã#�$nzB¹#�9 >¹f<‹cã)΃÷Ê|Š”Ú8Lgâ ã¼bV+1»Uä>àÜ¢G›V6ŽXMäƒßZMœWôLXŠ5.Õ^7ù#°O™�#ÎX±è³³5¦$±k—ÏìŒÕ'È‹`ƒ¬Z+4¾»÷9¡Ðúý ö9‰'~(øÃèó Ož\2–öJYN>›Òÿä æè„d–oã,m1»nGO-‹ŽxeاK/�: ì:¬mºð5W–Òyàò3ópÞÜD0q^ë‹rvmᯠ93).U^\NLpö™¥£]sÈNËçò57–ò•׋É�ã‘ÏÑgù—¶Ï·`=c+$Æ œpíÉowè/ç)�üî 4ôÒƒ¯>»PI²Æ|ò?vïæƒÓÃâÀbZ�`F—8Ðû¦u}må½y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼y¼yüÿü˜?oT ‹¼¿½¸ß~¾³Ûz_öÿZÿ#ñAqöžöó}W:ÇÅ»„ćFGùÇ¥8mÁ—ă87§-N‹ø§Åù®ò]½Êw±ÓV§EÎnìoììŸ;-cß»jÅšuN+µAþN‹L?Õ‰ý³“W\hHhû¢.À?"Èô­[ÙÓ~ùÆMkW¯X³zÕz§�›×¬]±nÍÆ�N‘øòúM+Ö®Ú¸á_¾�/¯£ÿÁ—×Ò7üþåÿþ!ÿ‡/ÿ÷9l/ØGÙûØovZ´ØIìW99ÙÇš®…khDÐÓ_w±wüû…a߸ÚIÜg¿Ò%(14 hÏAÉÃIô´WœV9Ñ6ýÇé�··‘ýÂÕ«VlØädpZÍþ»a ûWñðÿ·°oyý¢ßÿØä´ŽýþÕ›ØV±¿â•«ìçϧwˆ[¹ÅiÝê 6Ú‹n¶ûÝÍÞ=5nÍA] ™·bŽçAù�¹çoæé`vÐ+Øl¿‡¬quÑjÜ=�VØL”m�1G}p¦µ>8ÃZ˜hå­ÆšïuöÒìܶ_ãæ*i<ùp3Oc¬¹§>ÜÜÕ]Ô¸8ûhö»zk �æm8l® :båãcÁEæÙêÊl½‚R­<´¾šƒ^‡4�}ÒÄ[êƒ Fhý’-=||éw»ûØÏÐiöîtcj5>Rˆ9ÆpDýÀ?ú)ÔŒN±†”‰!µr$‹Œ9­31J�QW’é�ȵÃÈ3�¶©‹ñRŒãè1Æ1 -³0j‚qHþP¬¥‚ñhHžD¤ÛB–F,«/­ÂX&FÈäÈL[’ `*a©6J $Jê'ANФIðýA:œbmŒ*t0ıߟPîI!&ÓŽ¤‚R­u)æ�fœ`9"H �±V)ÄØ°g ©l-'i8ÿ )®f,ÆiøÐk>$Ž$d Á%…gØ`\ª:½Ÿ™N>d&b?œ}þèT[5£z’Zvj±!§gF‘}ÔP3! Á Ò ôÙKç0f{˜ýŒ…âzÆKFY3”üÁÙRVëT!¡ØAŒ¯f_¯'¥Ô�BrFú¢, Û*Åd�"ÉŒÌSè8IÖ�¥k‚Ñ�œS1Ê„ãót\R ì÷ð¾á¼ägyDoCˆ9d´!Ãìålæ­õ7óðV5�\Òa4AŠ 9ǃÍAà öë5Õ)‘zöyøvMÙÿC s¯Ë ÆK!ë*„Ùr¡%¶úCÉV�îö‚|©—¿Fo ³€ô¥»§NƒñiñHõXŸ€X ÷ƒ²f÷>/ÍAŒ·ú§XËQU£¥øš±bdá(½mDƒ�1ÞÂ�}ŸÛHóú™Aªï’D:ßDKÁc)'[«a9v†ÈìQJBñ߬:ØÜ,%½n"Ž›ëÙçeïÁ\I®¯f¶O3äv;AÊÀ�T9òŒ$g•R6ö#E$Ùð¡IÖjZëTv}§)�¥È:1]mº³Y©»±Î�U5ß#1Û‘¢’m0R@Ò$ù4&o’$h�›÷M­ŸbŒÍ°7Ä%Û’ËÇC²€$Žä9@2Bð?bùAÈÀð¾¡B@”ÉB†gÛŠqY£0NiÌ<>c¾r|¾ƒœiCA9ǦaäJM®/GdÚ ‡�XC–‹Fq˜íó!Q–bP¬$”df‰Åc12o(;»T©º´Â�tl¢™e'FgÚÂÎ1Æ9"Œ‚И^JãDsˆ(ÛTsºg‘ìÕ±7É-w·aŒQÊ2IE±ù£tv/˜=Ðèq<³gŒßõÎ�”áÜ¢2liÔ$µÐÑ�Û1KJ(#…%�¤QŒ½²ûFãxÁVRF×4)2ßÎ[2wÝåÎ|¤«F+°õfH´ÔÊ1z9œÝËxKŽ=µr˜ùAOYãé!š6Æ( ’Œ Jbk>ÀÌ›3j ·Š÷¹V10kÆo„ÈâQ�àÃÏñæÍ|„3’QfŸ#ËRbÃ8)$ÏFgˆ³Àï€,F�•ð\;ÈBÐý èži´r“À‰á)#•°B;½c¡S™õ�¶TÂòìÔäÚ †¸ G52ÃN O±Á(ª1µj¢€Q‡TkŒ¹J54*É ŒÊ³ûcKh vHž'¹b¼_æˆÑC’ÒKlœ@÷)£i²\õöJŒ:b£¨J »®� `¾ã"†âÓ‹ 5×׎ž^¬’”CÿCFâsF‘dþÓ4¶Ë|2ó™•�]ÑX*»WbxêHŒ�Ãf Ic1ºJãÇ-ÉÑOM(KöÆü²!±bœ_2V‰Ë±‡ŸÃÏ"Y,Üóô*¥1ï£ó …'çc­©Eýó qeïšKãa…=³Ôì¶é�Ú1æ Î¥ßYƒØìQrNëtŒšÑ¸sqï#} Éjœ"§ÕM ù_ÈwGdÙ6†¤†Ûf`TMά›¤$ä�Æú†¬+ü*¤¿ð^y#»—°GŒë0Ÿû„<…i…Q7ÈBÀ®Ü]½4î´H8éEf‹ûyÍÁF�^f¯g>‰ˆ³Ò‚ÍáHv $yì¾YïfÁEZbôÙÃK¯ñÍ… 4k!4Û²¶øÝ�—‡�ñ~ÉVõÅÚˆ�5Eç³÷\1ZÄç‹.¥$VŽƒÜdu y¡ÄW9BÖÏÍeŸ†S#̌̈́äÚr~±–�ç T{I‚ùBø5<Õ J\ÁhøFH�Ša6ITKºæblþ¶%‡3ûd÷“Æž²›§A–ã´RHúH’Kª¥?cÑà•f÷MM?>Å”tÎR‹ûæ±ü`$…ÔÒ¾ùjÅÅeðMjé™EðE†¤RGHa‰Á1V4¶ÅÖr 9ôÈŒ¦ªiå”#åc唺 �!2H f4aìlF ùÌ–0‹±B¶~Hú�dÖØ{�=¤6L„¤>ÖÆR•ŠKËhä¶áÎZŒca| cNÈgH*'»}~6äÃ1r*Æbô/g”’Íìãj°ÅÒþy�f6Ï7dtÎÀ¸=û]“°–0â$Ç9@>žFÞ!½{¤È�bzJÓ$¬!Š]ûè4[Œê‘Oe¾² œ »‡I¾ŽÞ7î{ ÆÄq= ®�f@,ˆ¡,.„eÙB^Vð�·”¥ZCV ’x<ó‹œjŽü£‹�Å€ $g!€'å:Ff¿1Å£H ³i²˜T6£Ï˸ d+!ªd¤§¤£*Å—‘ì[@¼•Ä|)�†²5鋼Œ°ß„1¾®… šdNÒÌOŠ~±V¼!È$ËÍ> â2Ƹit?"™ò@52ÛŽÆDés7L¤>2™Åò,–æ4O'{†4 ûwÜ{øAúÞ¤¦‰È… )B>*õÄdñ¹î!I¨d²<.¥n"I2%ŽQËÆ‘ü³ ø(Š¿qÌf0‹5”yl �`C~*¥ÄÑ�ß5[ÍïtÂø.�1²õŠu ™IŒíaÝ@~E!9‡¶™xŸ$yjf‡�»£ÑÅÜfS„mü1¢Zv~d“!A%–_ZYlH` ÂgÒH%Fs{f`Ì”Æ'™­A:Òá�\1Iš1_ή³¯qðý�€ã ì ‰Q|r.$X0‰Ü~OŽÉ³Çx!Ù@³ÙÄJG’LÄ×âóí¹°Ì‘Bó}�¬ÅH}[cÌÓ¨=$â ì!�Ç3ÿ'„�kƒ'| »¦c�Q,^°øª@/<ÙÆ4ÊÞCÕÍ•´¶X ßHë�ý|r¹âíBóç›ÅÚwV’´påµ%4¾]ê ¥µN–޾µDl}²]ªût�YåॅŸ·PRë'*Õ—ËuWWb4œ®]aÿlŒßCFޤ�ŸŒdùe»¯ ,~±õ¨¦Ÿ˜j̘_¿#ú¶€åK%�y¸½Va>¶©BÖ5ùè8ÈÒè%»�ȃh•ÝoØ$&hœc³¸&l}�l Ë…ä¨;ŒŸ’|îW\Ù\K>�äÆK°Ž¤äßc,ò~Œ‡Âf �ù%f§¯Çòñ^ht™å�‹ÿ»_óû“ËQgAš€ä#k®,ƒ,6�¬2USjÉWÒ3©ÂQJ¯¤ü($OHê¿üÂB  ļÎé$ÏWè@Ÿ/¶x4Åç“s /ÙWŒ2sÁ±Tc)ù�³¤êkË0~,Ʊû’5÷ï²6MnÒ jáð\)¦Ì>2xø4ržƒkÛ0I‚ßd5ìRÛBhŽ�h‰à$+øJÄ ™­²Ïâ¾¹>b°™–År/•ýÉjüÝGŠ4ײúK¯š°$‰ðz µôÚHóÒxkéÅEÀ@ŽF™“X~L¯'—œ™/V½µ’Õbfód`½€¡SÆ‹ÙíSñä3;§…Ys t¬ ’íbl‰=�Zc´9rRzò¬&32ÿœ69¤v”øÚqd,V >ª¬Þ  ¿¨l;9­z‘'ÒýŽ‚Å,äüÈ ߢ²û 9г,¾È,¾ÀSÎÁl™%™õi”›å-‡XAR˜¬nO³¥\„ÅNé÷¯“¬ ¤’Øú…MÂÑÈðï¯ÁzÁš‚–‹ºg“\û7zoÅýs€¡€¬9_u~!â7$ȰÞñ{°v Q™‘ÙÅ9Èe&Xa�‘”û��åײšÙ7Â5£È⬠Fëɇ¶NA-ËùÆR­G#èl}âú))¥Ž„)`1V e5‹IB8[A)Ö<‹ÇÀjÁ>¥#•c€ŽÀuÆèº·žÕ*¼ŸzIÈ ñÞ_ÔíæZ)„Õ!aæ�·æ‡úÈÏpŸ™ÏBLf¹°�Rvi Öb3$`¥¸òÑ$OÊ|?òCÁ?Ü’ ޱÔÆZR<8R6š M±†ä-d µ¬.7Éú%X¢7!DØñ~ –ިו( /!Ðõê)\7½oŒ$I2–ÕéRhÆHHê20¹¬Æ-`÷yZñ©ù@"pO·Ñú‚˪™Ìu=Ü&ýê®?õ?öê:¾Ý )L’ë‡ ¦6NÐÅYúHªnBÓûë¤ÚÖH UŽ\`œz8�¥À�c³FÁoR=œU� «¥OL‡Œ 1‰å1£Ôèd[äŸjZé8Ô3@¦@ÞkŠjVk³Ér��6$±ÜR@)µ!#, ÉU&7L _Ëb%”Àî™Ï6Éñ Í“j¯­”Iйp4IÀÕßY'öÿ°_:õʇxI² $íS<ù5ÉÈÉ·¢�®=³=Ø5ò.øNÄk )P[ìûá+ÑŠ-uà§� <9AB½#ð”dvÌ ©i–ã@*…|4¾�åÕ@�k|Ñh!*×k ¶I>–­õ>þdqÁÍÕCƒû®÷K±Bý ¬¬iý$ZIi½l.…çØÂoĶ ÿÉ?Ê™ÿ�!㉔ãÙZi>ápæHŽÕÕ>¬¦ñÖùj|ä3’•d_‡ï3Û J·†t$êuH½sJœ¤ù áǧZcêýŽXÒc>}KøNVïYRü£8_hdúÈ‘Qw°X=9ù*HQ4ÞYO2G�ø@ÍÈj\H0§_/ü¦ãÎýǾáËuÀj`£ŽóÒ c  d߄𷖉ñ%£‹ø@ö»!‘‚¼ö˜Ûíô”Êâ-zOÆœ¶YÈEá¿!Ìêõj,Ë ·‚¼ÓÌ"–“…´ $p©^/v„T-¡ÊN/¢ú7»m†šß> y,z†jZõDCj½IV1³n åË¥½sùÎ{Û }”T>ýL’(n™­” .š>^Ï÷½ÚÃ÷·›ðŽ-Ÿn’jï¬�¤¡^< ±ˆ.4c°DÈW…Ÿn”ê>\'e4OF~(„¦�„ì¸ÐüÅf¾ûÙ’Tb+«sš˜ÙaÊŽ^_"¿»Yj²Kî|¼Gn¿ç ¹“d!‹+¹­ÓQ—’t$+—€@)ès¢ü˜=•ò«K¥ê›+ÄcŸlp÷ÔkÐË€]ôЛêufWXS„á`u?Iȇ%�D¾¡ ædõ¤Ïhm2»GŸý)¦ÔAfu dÉÑ·CÞËbþ3 Í5$� A$%4Pn-ÇTŽ�_F¾ƒž0dÛa“�q—c«Æ}®Ì¥Ð,9îè%0k$lòŽÈC GЍW©fôv©ß™Q?Y-;o’ó@Ér¸Ä‚1ÈõHº$>4ÉøvÌäÚ>ÙÈ�ù«;þ/žúÁ_w u`Þj¸9ú²�äF‡kEîXçÌOP~™¨Ü¦éÔÓGéèéÅÔO¢þϱ©�E_RË2z} 襰|ƒÕë�!BoÜ�Àb*òÇ´ã“MrC,e~’j¨RÈþ�[Üò}’¸C½�m§@â±``.É“‘$QÏÈ5B>ÆbZíx)…Õ/IGÇ¢¿*&�� 8ámÊ/-Θê'ÈM×\_äžœÖ=¹ îâ„Tqm©ÐõÝ.ñ؃Mb~ÿLÄE9½mŠØøÖ*®ûë�ÀwIÅ}³ÅÄjG>ŒÅ¼–çõ:a(­÷�…öÇÛøÎÇÛ¥¦�6’ÜJì£È^É®�,×]XÜd…H> Òm�ÑG WõÎ \oýñ/Ö黟o%I±ð,[áP´êuõ:â$Ë›ÐÃ-oO¹TJýZìÞ ×‚AŒ\XŒ-­¤µ˜êõIJ1Ôcd>ñRÒrÉ……Bí;+䲫Kä¤ãÅàäøwÂJ°÷fLk1Iè²k£&ž˜)[ý! j¢, $3‹™žÕðX/JHš ö„ ¥}¿×ëvè×P¯�ù2©xh.õQ»…$Œ€7lSFïw$ßts•pæÛÊ•§F~èç}�¼}�„�‚³G þ, 8b‰šN>R㈸eÈ8YšI¨Ï±7¥2;$ +È*Ãæwφ+Iq¢W€ë•×Nòš¿Kï9(©¬®cùü-ÉX™êu{ÔXxo$á˜Û:C.žÏjçÅT7g±ûg’ G=Ô|ð5g— ¦—+¯.ƒOä[>Ù(Ö¾·R¬Dî›.óúA<œ:‚d {g#?‘BGøæwÎáOüi°2bÙ¥…BL•bz×J«½óNÍ–sN9!NS-Éb:dÌ€;jX]Éb6¤Óôj¬QÀH©­v+Oö‚~¸H›ÓºfqMl`±«ùý â±Hê�òÛ´–I¸gÀ€E©øënmÿ·Û^×ëÈyŒìš¢^'´D8[ó‘i¶$£Éü­\w}•RÐ餿uÍbuð\H+"…;õk€%j¼³V¬z{°ˆÀ:SÝÆj%H$t<ÙÁêõõRtÍhêï+ÑÔëRíå@¡ÿ†<k9�©^Çzɶƒ<=í¯±û;ñÍ훣朘Nõº?«×�…`÷–úÎÅCó¨^Æ×â3äò“‹HÞ}&BB Ï—»ïïU†¿ò–Ï?çÄÁÜôo&$D(»æ�,fyŽcÁ«q&éSVû3†µ‰÷‰ÔëÈ©P?"�DäªÐÏ@?‰Ùƒ\õÖr¥üÌb5ïøt…êõjª×!ùŠ÷Hõ:zˆ¨'PçÁ‡2? ¢püÎ:àËÐ[GŸ’j5–—R­I=ôòZ§‹@1_ÈwÜÛ´ßõb'ËILH–“a�RÏ6"ÇŽ3Bù$�èRÎÀLŽÕÊ^œFð�ý Ql¯$0?œ^; H%&Ík‡p#9½3‘ó~ðk&$„ÒöØYî|¾Ÿሡb0ûý Ž�ƒü*ð"|+«±«®PÏ•$䎞ZÀu<ÜÆ ýêL/°Ð*r"\³Â3 ŒùN†˜Ø&r’(<þñF±óÞN±õÓ­$C‰Ï ËÆ·ÖJ„ƒìt")Ï®¯\Ô¡¯}pm„ãï­#û,;»{4ÒÑó Ij­êÖr)w؉�.åƒýQ.ÔþUÍëuÂ}DLB_CË IYÎ?Õ { &LGÝDÚï®zk5½7ôâYÎ|—Ê|;ü"I¯1û#ä!úF�»c6Œ¤h QÚéô¢Hˆ*“jû°4ZOÔCÏi™.Ÿ™'U\Ybò_ì÷CJ9czÕDH›aÿ€jhV!' ?I~ðâR¬Yò¥ð�ˆÿÈX]nd¹ Ió³C}NßO{‰m3 ™*UßZIýˆÈl;äó„Uˆ-cŒ`kàp”Õm„„hœ!}€âG2��··ª!›Â~N8¤¿Óm�§·ô;b �ølÆ×HˆàŒ‘&YËw× Ï,TXî"¥¢GÊj"ô< †æŽ¥òÔ È„ö/¶Šõ×VY‚ï…ü±T~} ×üp#°Q&¹ëÎèWÑòn–¯cÏ >ÊPÄÖ7ó™èÍ’0Èþ)´çˆÜÿÔ�ïùÎYdµ-ÉDz|²�ð)@bà¬úD¨ùÅè£öÔÀßY=¬J¶òÒ›¹ïÐó4›M,ÎèØÚØšºý$œY@„#ð¨‰Ðc`_·†´/j Úã@ÿ’åTbëýmJÅ�„`×Lhûb+×ÿ™kûr³®÷ùväiè]z³|ÛsŸ!!ô¬V×ñ !œà°wåéeÐøPÈ>ñ»턾dp"õf°wÛ¤ºr˜‡G ‡¥ ¾gþ}Hå¡�ü¬áèðBȦÒ^y¤©×e(é_@rÕɵL2É#)`k ˆ ô?•hf¿Ì. ÑÅÔ?Cl­¾L(êÛÇ™ÎVHðSÀ™°X�¾3aÏ“+¹ÀKœ !dÄ‘üÿFBt?Ü£ô>rÒ›'½FBè�ñd3èC¦WM@~$î�šó¯Hˆ‚Å8B:0»1¦°($m¤gMý…Ü®Y¨ ;ÀÖúï”ÿž�Gv]æ?T*×ýã.¡û{g¡þ½ÕÔïO(Íüà‚u*%äÚcÿ ëW%?Ô0‰ð4,¶Šá‰#q†55Pl@]Aœï}´‹$Ð!iŠZˆ?lîåí¥ñ<à­au¿êì FíÇÇV8À/ºŸ qÙâ¡Ù½}¿UôZu¡@y5O¶}3ìaáç &iYÔ¯,f¢_l!8Ð D]l'� ,f"'GÜ@Í ¹J\’õì¹GîW7¶¦Ö‰ $„—äÀ}ÍðÔ ’FÔÿ� &$„» 9àÁk¤Ã#�@o0MýÉÃÉ#q¿i_# ÊŠþ Ž±ÂµR"XüÆ6:ÃŽI$?D¹EÃÛë•–÷¶‘_DΉ^'] 7׈Çïl@ž ™DÜSøáøÛkLr£5“iµ Í û¨$ÏØpmµ4øµ;døá·±‡bLa¾¼´{žÒ{¿að©NøÖKèÿÞ•k{°‰�l�Hegp­Bhùb3!!XýŒóž¾O%ÚX$`ч",vQÛl V ‘gBB¨ÿŠ„ˆy�„H°üB-x%Ìœò]ì ³8/´ÜÝ*�ød³ÄòNꔟY?B5gÚ±IjÑù…b÷·.ÒÀOî|ÏŸ�Ñ—VòOÏ•3Û§ Cß»·F5/¤¯Q/á|{*3®p �‹H­Ÿ€ºý#Ôê¨�ðDþ‡šœ<Ò]:È*ì}B^Vhü|½”50�‹,¶ƒŒ;_;ö©UCÍ÷íõÒ8ïÙ§qÛç£ñ’Âh?y§Ðõh'äf!_Ž–Ž~(Öšê‰êëkpæ 6*N°–X-�Ï®vßÝ'6|¸^e±�zï©Uãiÿg9r ÛÚëÄu=Ü.õ}ëFHˆÚ«Ë`3ÜHˆ”ß‘ñ# „„8·’új|éXôÖtl=ñ8{ÂrMCfó4ÎB!o I�^›–3hÄC–jR풢Ǚ‹ÂþyðU°WòC�?=q{³ÜðÁFcn·î'úï@GÀ§¨Å�s i¬o¾±J<óÂKxî�û ´ùÚÖ»; Ã÷´r×}éøí ð âðwH0£wIçA gZ~j1êÔߨ³{�„ ñÕ¹ÿGweè•?üÛ>nàÙ.©dhöxøÃY#ô‡S¬¹°›×H¡íÙ6•ÕeðSàªÏ­0ä×M§øÎb™\{v™\ÿÎ:µüüRʃ‘°ØAg{˜¿Ç½Ú?Ù&wÜß#ußÝ#t¹ ÷½g¡áÃ5Ø»Q€·.:·€kÿz+_ÿÑ*±äê¡ú�eä£*./rR,?½9忨‡@¾\BÁà<©ùî6©ýÁ.ÔÌNQƒˆ,`ëeüšÌÖ7zQØ/òrç5ø>ª°¼ÐPve…±h`>å3GÊÇâ¼0JÇ—{äÚÖÒyìÙ3úû^/КÀ¥âþpÍ®ß^ $„šz‚zèàÌ‘±°y¶¡¤w¾¡òêJœé0å4]3¨÷Ž>PbéXê±gŸŠzœz�È�/M{<)¥Žèƒ£·bh}¸Wiþl»©fgñ; ç;.,1÷ÍGÏžð’´]ሎRõ©ÅâéÇå[�7î†áè±ï€`:ËÖó…‹¡ÿ±§<ðÈ�ëü`!�Ìnúd¤ñ!UMûÀK±ýÆ‚Õliu±/Ê5³Ú”åáê™§<7ð�3�À�‹…½³Lû}3ø#5c€JËÞ]BHˆÔªqTGU.BÏK-h›EHˆBB9þÖ`H2Ÿåþ†Väu;~�Õ©$)Ìþ]êzà,õ<ÞKõI÷sgì™Û¬ßð¿`í¦ÿ�µëýa/Îýxj“t8�3蘥à\~?¤Ñ[îíRzžíê>Z�ëÛ¡=! u°—н4ÄCV#)çóþ7Þ‹6¼õ0P{êgg¬¡æö 1¥s¤ïQk¢^¢}à#UcÈçtÌ€”ºÐórìÝ�åƒî./ªUX|gq^�Ê´3"Ž!ž0þÝWI犕‚†é$‡Œ½#œ-ÙeH)—_[jÈíŸ�=!ä¿„aÃ%öWؽÄY1øäÀ穱£©×8ËFIhduôéyJí�µð„Z’<È0V¿V^%©fØ®”ZN}uôMŒí_ïž^ÎjŸ†š½(œ÷ñM®�ä›;ZM¯˜Hø¿#qo¹¡ç.Æë_ù}ø§TñÒK=ö©ºë5ˆMT¯¡·„cÕå%ÀÒ ½ßìfSèzºSjüpƒrôâb¥hh.!u±çŸÖ0 =:1ºÐžö`ÿ Á³ú•ö… ;f_ŽzBßúÅF`åøÈ[.¢ÄŽÙÈt±èÂ|à  -_ÐÎj•3å×HÄ œÇ«=¿\8qk=b¶¡hx>r¿×ýUªiˈíŸïT;¸*�\„¾¯þÀÚ ¯±v§žûüïX»'ÎÀÚá&­1ô�˜-’<|ÕéÅ„~bñç� "LRÑ™¹8#| ”Ñ4‰ì¿ê�rf×4Øüj3±ÿÅ>©âôBB8ž™\4Ÿrl<ŸÙ0½œ…ÒŽMÐ%XaÏLf±y”Ò÷ÌCf¹"zOœbŽó°ÈûÙÈâpf@£Ÿ)…³ÜýxØd‚é¬õÀ�þ¬¹¾œúÌ_‰*g5˜Î| NAÎÎê :£‹³Œ•W—9@烰߀}”CIVاÂþö†Ð£ÀYµ Ë‰Î•߀=8 ÂÊX•\=NˆŒAgdXS^ßl±þÒ ®÷á®í‹�Âѳó…Ôcp&„#bÿO¸¦Ûë”Y7 Òùô³�ÓA¦üâb¾ùÎzîøíÕÔ7B*ú¨úÈ„™¬¸² 8pCÙ™%t¦çÀqvk§ôü|¾ï'yð׃rÑ•…t¾ø,äe¥ÃóYͰ’ˇfu[‹ë‘¿ÐÚÀ>*jJÔÝé'&áIgúëY~ƒ\œìöiØ÷ÄžŸ’Fq÷XˆHIg[³º¦c�µôññ‰Bl‰=Ðݨ“€åÂX.�;ä$×|¶y‡œÙ;�bst¾=íÇ",(‹J·SY<$9x:/Q@ý^ú=¨[ÑK-=·�ê�ª«K ]’‡sàìþÅY+gQߥÃìC­¾¶Z©¸º÷{ÖØ«'tú˜Ø¿D¿g|Ñç/œC}!ì™2ßK{ùèaáu,Ï�’KÆ’" {ͰÑÚë«€~:ö¹ {æž þºîÆ:¥þÊjÔq¦~bë,`àÅáïܹÞç;�p”«Åè,;¼g–ÇlöUFLK¬OŸŸ‡Õ°]øô¶yæO¹î;ÑW¡Ï”ÃÞðï5Ì~n­# võ•eìk‹Q³á|ð4BÿKnèåôBÅÂ�YRAŸÎY¡×õ¹Y®º³šúÒlmà¼êmÊs+Ï.Â^1áÙÛ?Ý ßÛÆ¼΋°Ÿ±L.=Kçe±¿€}^ô4pG8öÑ:aø'7}ÇãÍr|ÕX> ”ÎJ¢§ˆ½k¬w¹ôÂ"%£c¡YÒ'£WÄÖÀ|Úʬ§¹ÚûO®O(gæßÔ²“‹)öSýÑ6�þ=¼ÀN +¢'�Q͵ÅYôÑô¾a¦3õÑ–è-é|£-Ð3梲l¹�Tk`Ä�)‘r»gˆu¬N|¹kø1V×›ë˜�E^Œ³¹„ Ã~YFÍD �p.Eª½½Út ŽMAL¥÷Œ3H•7WM÷6Kõ<ó­°kœõ-èšKu)ò`?XM¬½¶{Ц~ÀÀ< ±ÔòkË¥Æ�6PΊ<,µa=éœÜ•¥”¡/Ìâ%ù…ÜΙ°©îöZ ¸¨Éìž]×EÀƒ«$ cBã�5´‡‚ë]Ù7Ÿz‚ؾ#zÆEݳ(bñŒïþr‡Ð|k=í[E;u†}~¥æÒJôÓÄúÛk�T%$}ËGß×xuü2ßÊü4Å:�±˜}f1å´ÀLT~a1ÅþÁï÷ëûŸíKgã{Ñ?Ôw¾Ø†=)¡ö£Õ¨_¸¶‡›åÁ—žÂàOûùާÛÈîk®ù¶�︷•Ŭ ðÃØGeõñ:ô¼•¢“óàsÔ²ËK¥úë+© Ìôé§Þ|û½-ÂÑÁ9„z@¯*,ÊŠâ.½?ìæ{~Ú%Ö±×þgXÅú�× ÉÇÆ‹é“¥âÓs…žov+ýÏ�NýFÌu¡Áž'òaô òœ°(.°¥Y•Ü3sÔì¾Y8CFè :p&>¸ú*Ë#ÞYE9Gþ'©àì±òêbî8û½ÈYS[&r õcùÌÎÉBÞ©Y\ÓݵÜé¿íÎþê©;ýϽú«ÿéÉ¿÷o¾ü=$\ûMNþ̓ú› ?øç½ÒùuêÍç!†÷žÄªï?‹ßú^ûÚ'5ºÕ·¤s¾12Ý} :»Ê®��l�.”«ßY%u?Ûc<ù„÷¾§ê½Çù÷ÜÕ*-Ÿì$=Ì#×õõv¼GôoðÞ¹ö[`'°k¾çÛ]8;"œüÙ]<÷B T´xé;N×ûË}Û«-Ü𿻊ïüä«|òÝéOßGªï¼¯¼åsìɾ×pñ±¯tá¹^¹ðœ½î§\}æ']ùAäë¾XÍ×}ºŠk~ºI;ü÷�µ$Ã;�à × —1œzÌ ƒ?»é‡^9£V g ÄãŸlVÛï»ÈW^ÉÒ…Ÿôb˃-&Ìèбëån}ÓÇ«øØ£ö¨»…®;}/?ô½ø(Hèÿ§«Pû§UÀà*åï® [û“�´§uôíeˆÇÔï JµF=(Õ²1”ò�ã_lRÊn,Çùcïo¥÷'7ô Ä’Ë Xý4YÈš!䟜Å]›ãÝúdµ÷åÿÚ«ç?õü�3púŸþ‡ÿ¬ÿüÿ>¤»÷_«dÈ?}W*¾ü[–pÿçXé£_#píŒ÷îæ«÷gÉ·~ nüYÞùMUo}a¼ùU¤ï¥GÆþÇZCÛý†Î'ûÅîç.Ì÷lÅ}åko.;_íR^øø <á•Îo\•Š›+P+úå·Ï1dÖLñ;Rìè[08_nÀÞñmÂ5ã‰}:ÄGñÌ·^âÙß|¤«ßHÒÕ—²ô燔›OBäÛß+§¿åù¡?»ò_oÕ÷ÿ°K:ó­Vºô�(²{È]ú³wñŸžâÙ¿úðÿì#]üV.ý¨“Þz©(—_¨†k�ýnvD¹þÀOìûÖUßýÕ6®ïGgöÜ›kß_»„� ?¸Êý¯Ü±_+ Ûô4ž|ÌÏÞ—ÅþÇ®|Ïó]ð}R/ó�ÏwbÏ‚ëýn'7øónÝ©¿¸'uÎþxðÿeí-À›jÖ½ï©áÚÅÝÝ]*ÔÛ$M²4R/(ki©;P×TR ‚(î¥Pw7¨ þÏÞ{}3‹ç9g¿çœï¼{_×›\‹¤ISÖÌÜsËdÍï�Ý6Æo~4Áoä’�†¤ÔÓèú(üùG õªÿ°è~�¥èlcANßo–Š´[R:ÄÄ�>ZcÜûj",üÊÁ&¨¢�‡„oÿnŽ=ÿJÓ•�gÅ•µnæ¯JÍŸ”—ÔJɼv2§ß�S´Å6®ÀüñQBöI¨Ì!] úËkeæTZ—6ßÒ^ÉÔê¬2’ Dß…š½yë,}Ví ºÓgFHÅ7ß‹$¹�¸$¯™ ³Ú E9}êjŸ!üh ’´¢.ÝYAÈʶ³2¢1EÛPþ"ºçyTÙ6Qö{CQÖ"³O[�ûES˜<´‹Ÿým?÷ÇÞ[ã·1G…ýœ5†ÑC=—°†/'ðö/ÎäàG?bð›�d¤,ºÿ®ìH×�DñpS¸¨ïCˆ´»9¼§Jv¸ëEФ©6ö£˜xýÕ’.ê;".k>/}ÙrJTÐ!‘Þn0·¸_eoù²ÈÙâaÙIñÝz)–óEG˜Ú¹›¾Ö#�Þo8LÝÀpyý.´þ‡ÖŒéœôC<é•z¡Å­Z³õRToYïu(d —»õˆÛ|qa›¹èEãÉ‹{aÁïÆØÃ/BâÉ�”~Ûu’.ê=B>�)úÙ{+êM×²è“ ñvèYÑw’,p ß}¶Ã‹·Á_3¾üBãÅŸ,Ȫ^IWå%Éûò Qm•ùìƒQÐ/$rG °ô®}ØåOÑ| ïvÔƒ÷bñý6 ên EævaW»µéœN®ôaÍ!dßÒ'UGéÛ$q«×”¸ÖmBßî"Ä÷Z-è§]ø�¯†XÁGêf†¾`{qüÅ ”(újC•ö9PUݧÉòÞd͇3dm÷)üù°˜¼ßK¢Ø„?áw?±‡ƒBún;M¼i³&›;ÎÒ=m�fCå1â‘–pa;ãÀo`lñ–ÏŽds÷yòõ€ žÿÉ€ˆ†1Ô5a&ªËÐwš¬/‡y)Šh½Š]¿ŽíïÚta·Dò¶ÚÉöÑ 'Ir£.ñp­àæw=ìÖ7#áËÏ$öx˜äþª)LØ.Hý¶[”>b ÍéÀ,îÔ‘¾-q1«,ñ±,ëg^Tá*~ÞpLr«M$Ê}oÊæ*WôP�FÀ8GeÀœp»ØíÊ)y}€‹E¿ÛHD¾Ú€Ç5nǯ}4B¯‰žµØš½¬v”¾¨r�ÖØH Z̤÷ê¬Ì ê,ȇ]bêñ)ö´—¢^vØŠÞ´œ¿h:.~Üi'zôÞ +øn‚=æ“0þR/;mÅ55n¢Æzoi[í%‹Þ’Ø# Rí;¯¥î¹—d3ø2Q4\$î¨ U68¯Í©òΓT{½·yß»Xë� G»n¦8´g%�mNMrlLŠ?Õš.?Ú™o6\IŽôû ~9Æð» ZÿŸŽRy]]€g|8@ä RW† ‘oC±Kèýl/ããv²xä°ùûw‘V]E2‹Æâ›î§ Öݯèº6WaÉw Î=FSðl1ßÚu”‰¡ [E‘ç�EâÂ&+«îWñö]·ÒζfgÛuŠÔÿ8Ì»ý»6yý W\Ø ãü°ô` Y²å®dnŸsïvHèë0ÿ»Ö�™]mJÒ» ©”šýxBév<øe§½YM¥¯¤²Æ“~Üo!ÌùUK[¶‹x»Ž/+߀=Á$�•~‡?´<8.´æRü¹æÄËþ±T¿?Q1t‚|6l!yÚrLò²ÅAò¶ÞIü´ÅŽºÓNP×ÛME[ƒ#Œ õµç¢}{~ò©ö+éíyiöí7Ó%ÝõÁDÙç£üŠ¿I„ ?ì°Ú¿á¾cx&/]nVï6Þ•�»E¥�Ž–ýeñÖ}/âÉŽ~7²¬ç8Yñþ$ÌŸíÄ—Ûxdþcѽ)]Z}ʼåu°]×í$ë÷�ãŽtÝK=Û–•íÚ*“ևĹ7GĆׯ^­ö–Ýnt�-jtŽªluŠ(©;]\ã]ÑàY[ïY ®®u‰®¨p‹¹_é{µÒ'.¼2HîÐ’•h6ô*R4ÜbÕûX†5ýqRð˜áã÷þ! o�D¢‡Ý–tÞG™ñUGœ×C�w¿te·£d -œîé¤z>øK†£ÄŸª£ˆá~_úóû`éPE´ù@­Œìèq<ûM€=ý€‰Þ4“¶•_” ÕEš½“ù6D¤‡6_Ê<ÓžsźçY¼d $ȦïYâáÞ‚¤C½7\:b#ëýãïÔ¹ËJ]¢‹[œ£^µ:G½…�EM.QE�.QOëÜb á¼Ë¬õ‰Ï®ò‰O¯ö�¬ M”~zÁ­dh^tÅ*A£I߉ïYJîöZ‰ß¶Ÿ2¯(ó3o) ³x_+z×zR˜;¬�]Ôç¶ Å»l$o[ÅÅ0&¿üb%ih ­ Éôª—eZt–Èè¢Î£Øõß ©Í;„y_tÉÇ"º­Õ÷lkzƱΛiæ%Ð%˜–ÅŠ¿6GZ÷ÆŸo‹OMiô–'6ú¥:tä¤K†Ê#©î&»î‚d¿¶°ÿæyR£·ìF�{ : jÝcÁqzYå&{Qæ%Zæ_Pá)“WúÇyŸ'úØJ¿o ”Ö×] ßtÙ‹+�Eå-Îâêz747de ]‡ÄW'øUGɽë¢äieþ‰¡Õ!©DO¿·ékFÀoeކþ)¼*(Y^˜�]âïÞí+--ªæRÚxnøðˆ—É;Æ„ûš1¶?‰þ¶}ëíÌȺ°ü°úð|‡Î›—m{ ¨–êótuտƨ«hœÐñ²Ö5öF½Glvµwì�·Ø’çèÌ�„C}‰ø/}>¼~ÆÎtðöüïŒöý“—ùÐã�ºXyhí¥Ää ¿¸«%þqnµq '›ÓãN5g$iÏ•IûßFXõ=•Iú[#%ZÃ$í�ÁôÃ_¬ñ7¢ŸýbcÕVwª-'óD{nÊ¡‰–Ïã¬ûŸ&Ðß_Âúu!ú|EßêÂuߊ·|(3}Ï5m9D|¨w=Ô}WîÓ›gÖTt�ûŠ1âä|ÛÆ y¼€ã’¦ÊõH›ÆIoÛdZý»èñ8Ú“'�jõ“'ÕûÆÛöÞ”™þÊœ1éaÌŒû±Ñ#1dhÃ!†4a¬L¿2§L0g©ouÔ÷ºìËO“Fl×¶‚w�ÑÃßý°—µŸ7¯¯ :Òq'Õ£>.#®úbêÕ*_ùùVy¦¤¯6”nnõ¦šÞ»Ššj}$-§Z.§yÕŦž¯•§Ü(ö‹øÎ+Ö¹9 úìgréPuŒU_q‚moa¢c{ZfHSp¦wCLê±®œDò·Þ Dw·Ý× }guŒmßýDû®Ü$Çv¹<±ÙWØ’BjÆ{?»áÝß\ù�Œ§„áÝÙe%Ÿi‘?× ŒÑä÷|?.ú¥6übMHbV™¯ Æ=Ù�_Y`eh¬}ÛåXÛîë±äа?ÕÜž|õÉÆñCTk·§Ýû‚dÿúðÔ;o½e/ËÝc ßúÄß~ç?ë#{òÎK–]êŸ`Ócì`I НÁ5!ò'¥ž²7eîѹÐgUÔºDŽ´9…„G ôuþM!‰Âß?zt0|ÓïÌÙC=7㯴x&–´�‹zÜâ*+lq�‹h L}¯ }¯ EñÐbä­L0ô«£Ñ3Fƒã1Yï°ƒÒAó3Šûb°SËlݽlߥ6o×·îë¶k€�Û¹àæ¡ ãöxªNÎßVé61ºø—÷^ž•ѱÙ//ÆßxíS// ŠÏ*ö—E½ M¸s‡­9rz ?Ȭ·&æpW�æEÉQ•A)™ïåÙå¾ñù0oH¨�£|ë[Pê%“—Äíʉ£é¥~k öl�Hªûp6"¦Ý+–ûc0þõÜ-ûŒÁ Óaưç? ž!z>¶i´8Uø =Wøo­ù¯7¶uÿÜnxGc7þ½ép.®Ù hwN×¹Á¬æ 3‡©îþ@éûÚp«Žg±vùñçärçÆøÄW¯`. m�¡üíÅx4Ž…¯üã_{±ã†|é£7Þq-ež ÝUî±â�e!ðïÙw3o�9&øÎ¸”3º»9¶`*¡ÿ×7ÔFÅ?{ý«ògŸÍ½ ,^ÌëuÏ�ý>u“uz}üS•ëÙŠ´ˆ”—Áñ·_û'™¥þWú«|.Õzg4xf´×º§TVz¦¢ºK«šÙ>Yéÿ�üË¢ö¡<�—ºÊB0UYþ4Ž"Šü0~*Î�¾d˜®¼¨�^ ÔÆ®Ó&l3ç‹VÂÜO× l¦Ò¶Ñ™Š{Bû¦š|a¬è¾×žò—ÁqwŸ^H*-ò‘W{Ë«ßú¤TWxÊK‹½äoßzËï”zǽ�þôe©g±Ì_óÌT{Ü~󘋕—{Ä5¾õŠ{[âÛ(3þÆXî:¡¸dËn[§üËíB~r ë”Ùç?}àÏ98ŽÍF&ƒéŠ3Á¬q+Á¬©Àœ™ûÁ²u°bçq°x«-<Ž‚9«E`ÎbÌ\Ž�™ ¸`ºº˜=[Ÿ}o?ìõlœ¨ó�Ñã 26V­w.8Tg†¥< ‰«xæŸÔüÚ/¥ì�o Œñò×%²ž‰Ã5î‰C ®òáF÷Ô† Ï”“þ`$K¶™þ[c†Î2›£Mþ3{üóÐÜûùÞDøîT0cÔ,0gü20kÂj ®ºúæU`ÆÔupþí³T÷uµ½`šÚ~¶msWšƒ¹KÄ`ñ{°Ê0lµ¾£´+¢wªF!³R«ŒÙÎùÈ:Ô”„rÐg/üåõo|›á8ÕWºÇuUz&£9÷¾Ñ#««Î3£«Ù-ý]¥'¬%‚¢µ™}ËÖüÛ¶ù³­€?ÏTgU%X!Áy¥çÜ4¥ðµ`ÃÉðP½LŸ°¶m3˜1k;´OMh“0{³9˜·Ý,ÒòË8!`• Vái`“ÕŽ‘¿N?PÉl"ÊÎ9§Gú¿�‰ ~[s¯:ضåžñ�`Œ«,óˆïªôHì­ö�wոˋÞz%œ©OŽÕyÇì™5yö¿+"êUXÜ­çþ²šW>ñͰmE^1O*Üc?Ô¹D}jtMjwM¯ªwOM«ð‹5ýÑç¸Näü³Ÿ9ðþü—/ù™ �…£5εip g±Ç4¥ù@}òv¬ÔçiC4³¡Îß,ó7’ЧpÀœ¥†@}¶&P_¤ Ô7šƒ»áœ3 ›�(m‹l™¸;�™u †Ù¬YÃìà}ýã˜mkÞ¥ ’�˜ä7â¡ïL|sih£ íu)= îiMî韛ÜÒúj½2ºk<ÐZ’Ì ƒá.Y¸ó_7¥ò�?ýÇ$ؘ}LXÎ׋Àvh€Y ´¡¯8fÌ„þcæè3á<ƒsm`Îìý`žº˜»˜ æ­ ÀâÍv`¥ŽX/ÌßWÜì[5fSTû¸Ý�˜ù{³~ÌÖ*f6ëõ2\áçvW³®�¯cb"^„˪‹²Kн¿ö�T~·ä>c MïÁú¢ø»%õ¾Ó×´›±×­`ök\,QSŸ¸øm×ÏØ6–Í‘—ÇfY(BÏSá8͘¼Ì�ñxÙ&[°Z×,Ûa–­âƒÅ ö�yÐ_ÎQ]ó¶€¹³wœ’ ­%À¢�"°\óXÏ ë 9Øzø©Òæ¨î ;2³5‡˜Ú-ÎcË`ŽRýƒ‡ÚoFÛ7å$X÷Ü‹µoÍ•g¾º(O{}I~¼-/Å¢¿,λ16³ªê|ä`�KTr™œþ ƒo2>ù¿¶mÛž‰llžÔYÿ1žÍùdz�(AþršÊ<˜ƒÌ…óQ¨ª c!˜6i˜µÈ,9óã“Ï•÷E Nßw�Ypà)³å“1+ö¦ÿmÖnÙ€ÚÎÈÞ©»¼«&ì:÷h̾à꩚÷™UMÓOÌ)Þ'æý¥$ÐbðaÄ©ÖdªçPMŽrÍG¨v-öŽVê[YáÓVî7\ã•ÖP}is×ö*WC>ù÷Å6ÇþË‘}¢ÌX}ô0wêz°x�X§w¬Ä]À Ûh°Öý¾òº w£6—�Ýâÿn̆s�•7x¼PÙX5n[Hû„mAͶy”ŽÙî\4z·ÍD­GÌ:­Ffï�Ì�ðöÚùÌ ½FFϨ™w1"ã6†Œ0çœêcQ΂ڕ sg¯ÚèD.Á&Zñ4$×Ûh¼ð‹�ëköÚIaÉŠ}ÿ‹]*²c†üútu˜ÏÔ3èõ•<°Bë$X�‚µØ°A¶½¦´#¼aÒÞª·¿é8…®wâ”0¦âP¥iJÿ{ÜCë!h¦©ŽYsýÍ`þB>X´Æ,Ùq ,×uëø`­þY°~ŸX³+Öꀕ+uÁÚí4ØŽ…*ì<óhô®ó%ã´²þ¾X·ŽÑ6lbLM ìËwOÛ÷7¢EŸK/¾}s~þájÔÁPú9¿®5Lï]kt�ÙjRÉð¸ Á¯a,„-Ã'¨ÖFwêC½�õÀÓ«Þ—ñ¢�ïC‰Æag~9#Öþ8BõtúûÕE¦ÖTž�ô¯ OÐNY´xáöÁ.QÕs8Ï`;ÕÆ/sæl˶˜‚Ízö`æváî`ϱTå]1¥S¼eVëþ`ø\4yÀhpÌŽ*jnÙ uuÚG‰®cIJZ5ˆ˜W›D®—çŠ�GO¥½î/!r7¢ï›á9Ÿõ¿›‹®9êF¶a£×næ�9—þ·µ ÿ´M%˜gÁkòJ°t ¶š¥)î ïRCþïàgv¾Xò¾3ö¼_Î'ÆÆ¨ú‚FãT1˜q9cÂkf¬„ÃŒ«isŒ[ÅPœçŒ>OÖµŽç_0�›Ù·UPó» 1Øï-øÈ8󻘣Æùlç.ä§4nÃó>ëG(AbÅ&,êùZ,õÅvâNƒ©è~©XRUâfÑü&”~ÜcA¥�$cjv�ao7�÷ÛH‹¶—¡’¾ª0n%CnÚƒÿ�íýâd¥¹`ʘy@uÒ"XGo‹V� &.`DZ›Ê;.VOØ{óïóµk™=p>qõ_2ûôž«ëÛgŽ3ö¾§nüŠÑ%Ûª]�~¸ž,yA·ú ÎsŠ.78N�{â°2÷ôÙQ\¯€IÆñ÷——0†tokÕÚáλP0߀/KgeÞµ¿íÇ®ý0:„OZºª�1M;é;="ñ«6{êE—UÒ~L\^édš;¼_xí›–Ó­�_ù¨C?þ`‰}±4zÎh<�;~ÑŠýl�ýÏ7U3Ön‚]T°‚¦Ç‹Ék £�ŒÔô3sÊxˆ1ƒþZ̃qÿòÍÿ6âg }ƒÁù¼©;5ôÀö]›Çጊé½}Qk©×ÉŽœLç6yºõÀýxüã°·†¡ ¯~\oôzžÉCFƒûŠáp2»7óbž,ç=ü¡�?}ObwM…·3ÀœÕf§”ŒL…“Sb9Iˆ¿ï�1�HnÙC^ûÆ‘¾nu’78 2FöO\oꜤj|*nÂ^“S`Ѭ­lŒVb×Óþ´K0E Ƶ™[ÀŠB°Sª ß7[ó9³V»™Ùoø+#þøà†ÿÑåGýÖl1ü"}÷G uø�ƒNø»o6Ø«ßÄdÉÈqqc«Ÿ¤²Ý‹º?,ÆÎ§Í0Ò4»wR@tý;?¹r+ïñ?ôxÉ¥øç‚'¡}ÐÂÄ¢ÍXî�.qgP L¬ß&ôLšI¤Ïg-§ä•{ÍršéÛ óÊ’éóÆãtá{1�ßÉÇrzbòŠm‚�‹�ÎÄM@ß·MSžÈ®üó �åŒ)«ÀüÕÚ`­‘ØëpsôÁ»Ìƒ~†€õåa´Fg8ÌPƽ Ík`ÌMným·±�‡Š�±9Ð×S¾9 0sEË£®¬|2–Ó û¨Ðë8Æ|°cÑl°{é°«f]­“m½j:B<é¦ o6ágB&³×Ÿç³×DõKX9�B,Y:½[‡ÎèÕ%£_l&2{µÅ7Ú(²®÷¬¨¤ívõ·ƒXô«u‚;_ ñâ¢yÀ‘ÛÃXëÖ0š.U¨î:”­´óp®òÞù*šGóGëž{0YÇ籚~î×uÄȰ/ºÇ«>:øêfr�9ÀKìÝÈËþ²“{�Ñ1Íû±ßÔ)iêÞ½`ÃÂÙ`óœ9@¨¯,�Ÿg{Þcºµû…ÙhŸ˜é�/:Ä».;qM�»àá/|Á�_ 7~Õ†Þ[.tQÅ¢®.Ço·rÙk4Ÿ÷[™ÞþCGòr9~>{¦ÐÊc”ÀÊQEhwJ…Ý÷’ÛË5\}Ò¬¨É {>LòãË7òC-ãf�lç¤n4ô¾?CK쥸QC –ÃØ<{ͰXÓlµŒVÐŒhP×-`Öé½föëÁãôû™ýËuýnªé�‰Çñ¹2Ã42o‘ihæ<^쭥ܬƭܼþÝ‚ð«0×Ì™¸c¢å’6“ð¸6�p½>—82Q_ÛèìÝø†0^ñy@,±PJ- ߤ9‚ÄâMù›Í‚”7[ñć[„)¯·aW´É{]þì=Í^Wy)yé“>ÏÖ“<©?bVYãcUý:Ô¬¢ÌKRTVpmDí«ÀÜb§q/Ž7ôË™®{éŬýV�Jk÷``úÄ…@m ¬`ºr#hzOÑicö3$þå£/>ô«ÿ5Cš^g4yžIÓLþt ˜(Œ~²÷Ϙý€2q<`b šhèÝm;瀠ɣì^!–ç›»ÄÜ9f&Í}ø¾)ô„_ò\L^¹ ¿¿’.XA^¼³B”Ýnh•S'¡*wSnÓÑ "ôæ <«[‹HnØ‹G=Y/¼úQ[’ÿž÷ׇJÛªBLoü]Sè›1G�\¹{2B𵕙¿“Qß[‚?þ¯Œ#ŒgÇ ºÌ �Ùip.Š×è‰+˜$·¬%[ûÎÓUÝNÄão”ðLÂÔƒ �oØ=AOWb!�W $`ç²5`ÿê-€£¥ ÌÅVJÖŽžª¶g<Õ,OzM‘º†ÏÄÓÞîA×ùÒ�šÍ±ûïùXþg=~nï~á…¬yXHþâf7]W+¼þM—ŸØµE˜ôq~ýïÆü„šMøù4uì¸ÛXÂ5vº ³eq}ØËÖå§ÕlãG¿^ÅÍêÛλÏèòî09ù?v_ÿûvãkÌVÝ7Ìn½!†cø #ÖaL ›cãRƈó’12-c(î ÆÈ8âÉB“^£8VJ¦–'” ôÀ®Õ €ÖŽÀ�˸µÓ(ò”×ÄÐD:"H_„oyFù Ò=sûº¼ˆå�e-—x„¨“'|'�Î Ó…�{°ôŽ}Dà•…„WÒ,Â;~–úBÉ‹êc–Ïñç=bá…Û‹®‘ªxÀ½¥âÇÖ’Új_t¤´´Ô•¸=$d´ï"¯/&ÎÆ¨ CŸ­ä3|lä‹Ê‹ ž0{uÝOÕqȧçT8Y÷Lîƒ{Ì6þG準�_ËXq¼sfè™ Ø& ½ëÐÚµ\ǒ׺8t~ ÏnÓžôÇHÚ“ÎÇi =á>íE#¯4˜Ý(³ûpý2"†ðrÛ4ç°ÐkËð3—&a.ªDxáj´ÿD’ÙÂA{¨üV®äiÕ!ÑýV‰¤°É’º:dH$wí¦½ßKf�è k>E¥�gø·~ÓåguíÆ"¯Æ<\#(üflZüfR sª÷Œ%§›±€ãfbp‹ÙbÑ¼ÔØÊWåÀ.ÐãIGrN‰ï7EÇHöíÐFú §a4ÖnzûþÔ¢¡O(êêq€æ^-` Ã.DR+%‹S®“Ì}3—Zøç­B{ƒ$¾ÑsÑG*¯ËØ¢ ö°èα ï³¶Ð#aîe¾0û£†PV¶ sJPœ� ¼ò‡†¤¨ý Y0@°{]Χ¨£ýÌØ¥ë‹1ߔٸOÆ\aPÁ^FÓV^ÁmÓk_˜&Unä^ÞÎÉûº‹SsÙ†kZó7‰iÉßHã{¿ïá\™ÅõŠWã]þ¶ ¿?„›Ê;·ðÜÕ„çS¦ �¢¦òh�í»ÀŽe+Á¾�Û�1œw¸�ç´— ±ô$NAjˆÅŽÅ<߀ç÷ˆî6ˆè{�4UÐNÐ7[Dî ó`á�<‡r‰™NydÌ!Ü’¡¿Mž…]Ì^€æ!ÿÚ�6ö¦Û\ô¶áöà3Ÿí›¶ çãAÞ-âA?A•tž¤‹:� ®}מ žDœ ˜„y_žËOmÞA<ï—JÚë.Øõw?Þ’—|²õjšeY‘¯èê ‡ }¶–¸ô|veX“xÔM 2;÷ o|Öà úL𰂸{Ô4ÌK>“ïž6�t{7ºt×ùªš�ôœ¢.v\ÁHìªÄÅ�yÖ BÇxUþé¨Iš8`ñh50ÖMTçí=�öî½ÀĈËrˆ¹BsLrT‰ÕÅ9yqŠÈæ˜ ÛŠô_¤Ç'!î–ä”Ï$ú¤û´g˜Ê©7–ܯ±ßî�bÑ¯× ]Óf`²w›ø9CxÀ­ÅH«‹'>¦ˆA[Ýï²tHð+ŸtP?b1E߬y¸K¤y1)bb†L¹÷Ñ1-øªczçûAÓü/û!·óýo̸%Ož�ÆÅé�ñDí͇¶>º¿;2 Ù=x{1ÚW*8|~”Ìà ¹ 9)ÞYsñ¤æÝdr»âf#žË*hÅׇtÑÞ."¹fv¥UËi×FûÅqèSï´¹ä¹H5ü\øTü¼lš0ÆùÜa AZýNÓkCÂ{C<ìU¯”xÖ+Á_˜SEïa÷‡ü[?tñ'C"þõ_µ0û€ñ&”…Ïü¤Ú¿…ç~6�P·ûqÁ•Ž}HG�8<é.àÑOÖc)M{°´¦=äå}v®‡ß^I\¼¼K¨ÜFÞì4%îv ÑØ¯º-È7�6ø£^ÆÄݘ_î<Á1¿±\ü¨¢ž.t5¸€‹8÷vÞcðS‘Sp÷ìÙˆ…ÛzŽævÐwWÄOÇL…¶0ŸðƒGø›õhß ‘7lD¬ÀŽyŽÅNùO ¼3a<¿ óÁø„‹ì§� /\ƒ¥Uí!2ÚµˆëÝFä�\<·O‡åmßêåwûhŸ†0£m¯0öù:~þ�Ú„jYtÍ7ñlH*¸<²�ûn?ëëtþ¸sÀdá ÷±DÈ�œaMìʈâfb¡·—cAw— e¥ùY}»y׿8ÉUõ8`ËŠ�`Ý´Å`ÇÒ `ÏÆÍààÁƒÀÀ˜êÃØócCS r ¯Ëú†<À³:¡$tŽQEìAä_ÐmÄZD¬?·RÄøÐ÷`6Ь~\ÂëíTfÛA<«]1»1ïñDHîRòZGr³F„l— ÊYByÉg#&}½Q(ºß$¡ ;ÄÄÍ~.–óQËý¢‡ö„áIõ»PÒ>Q³ð�+K)¥[‰[¦ô“.kÁÍßôøa/W Ã*×ò2v˜fî^_À³vWáÑ' …Ö <ËsʘCä$þ·Q»6íæ/{¶i½ÆÐo ÒˆDlxñÅk+%i¥º¢ÄªýHw qè¯�/”S.X=L¯˜Yh¯?â¾ÐÁ——£}¤0Ì'‡ *\‰%4nGö…˜¿0¯˜Oœ �ŒŸ š„Û{�ÃŽ¹�AìHÒÿæaJË.vrÔÃuÂôŠ]ho%Œf’ûµÖta‹Dú¢æýºé0^Ðo*L,ßBÂØ/Œx¸ íMDû׈×ï­øù_5iê‚31S„¾Ùs9ß4yCZ(ß�¶©%Èý¢…X`ÂC§TКWl­ÈrZä•[ø�;pϬ٦æÎÊZ{�ÀÞµ»ÀÁ=úÐ.ù€#À�@l¥(´�µ¥ƒÏÜÁuÿÐ)e¤AÉ2^¬�TpçØiTÈ㵈郸®R§˜âCÎc̹ŒQÖŠ’CÎc¥>Y‹É¤Ê=ˆõ„ظG¢:”»ËjÙOd4h�¹†hŸ+zm%â âY­š¢ë âv_�; É¿ñY 4HˆŠ[�‹ž·&¯÷r¹-äÅœ%¤WìL,êÎjáÍvïò£>±°àXw4l8ÅLÅœbU±Ì¡ýÂìÁx\éVað�e¸gê,Á…{‹…çÕ459`Çú­@wŸ1@:žHëK €�0ö¤6Š,ó#à*Ëè$Ž9�FÌTÖ.¡ß$c Ö9ïõ°¬Ê}´“ÿÊÁu<íŸ8�}²�Œ|¼—Áÿ/àjÏÊ[>‡85� ¸µimà®ÑÓH×xu'I¯ÄY,Sç<¬ÏÁ\ÜïÊÒ3qË’t‰�ŽŸp‹ŸðÏòv‚®d#§b‡ÜF#Ö<ú Ú‡�U‚î£Ð>iÄÛ£‚ﯢCŸ®Çü&˜bÖ �@öŒ÷Oy¦ÍAóE�ÿQ[psH»Ú§…å ë3Ú÷Qo-GlwÄ) ²»´c ±‡ðÄŸ k,¯[�Êé4! :„ä£N ñ°ƒ\Ò$"®AÜ97„‰o·`·M°›Ÿ „qe›1�ÌYh]M识‡BŸ™Ù¾åXrý.´ñü;R †sÍÒ^ ;©†Ö„Y]ûpYÉì�ßC=ÖAºÀ؈Ô™à)ÔÅìňMIùe/€}9ƒ:; õ±à˜û�ÙYe¾Õq%¤Ù�'×ìFZ=ˆ $ Í[ME=ÝŒØ:ˆ÷É2®½³ ö(ËÒ†±B�T¼E�ÕºÎÇÝDü£M¤üÍN<µr}¹ÞP’×( ²«ôˆËµ:Dn¿>~«‡C=~oF×Õ»J;ÊB¤�ïüÑþ{‹¢ÎÔýò¹„GüL8w·×ŒÑ^\üÆ#�GÞ,=ìßqíC&=ZdN�â‹aÞ™³…A…K…Ž ª(ÕÕBš­fñmXnd`îrV�ÑÆ}4}2t «õp^61å‘®ÒÃC±Nz¿ô}³A€¸0„å!øzàÄDǯ  ®h"¶–Ø´�/bÑ!Íâ¬+O^˜Dx§Ï!|aœ…õ }á&›A¹DL#Üâf`Þ°>rŒ˜J8Fªg£¦ÒÇ}'à'&â0#]\¤Âꀊ�+’ÎÑÓÐþV,{HËîÒ@Ê7}>«Uëyé¤/†ôñ�./ÒfBŒ!ÒÑ2b¸7ÞÓZÅâ;ÍêF£Õˆ�ÖNX†PÈõ•ä…ô…ˆõ„Ë^mFì¤ ‚Ã: Ï6ÀòGô™{МA 3 éÏœòš@ù&ÏCy v¥ï ps ÒÝ5…µ ªÉ�tu1²QÄÐÀŽ{Œåð%È'("æ»ðˆÓ(áQÏ1¸Oþ|8·5¨‹wVpxV@g¿06¥få¨Bû¥ÌGqÄ"Ž{�GXˆOH8\˜(°uTÑ3¢€ i§ûbb!¦+nqJ±dH–Ÿ}u ËRA�ó–ÓAÙËèÐÛkXVJðíXÜ‹M¬¦Èån=ñõFÌêî;ÛÏÏXÜ)·¡²[ Xkê^!.nv�tU\´è*ŠB{å«D|«žDûò‘ƒPöt½Ö ”ò‚¬þ}ÂÐg+øGÆhkòÀÞ5;�¬ Ó‰�›'ý'#=bÉ Ežåe#®ô›V€´r…ØSÖò׆fIEYvÚQ¿ñˆ…tKCŸtŽš†q�â¶änµÔò^ùQ*úÑFÄ¥CL%Lþj Q0Ì'î|ð®|ÙM,A {"æ”1O7’ŽQj¦b”ë‘�7– 8‹êj�åqeÄöÇN_œˆ�ØÙð)‚ãžÐgúŽ'í¡¯s V¥oÒE>SxÈIÅÄÆ@!'™ÕXƒö„t¬ÐÚ#†XB0ýÔ8Mš‹t ('ßÉôù 5ÄeDíB:¨ˆÅM]_�xu0†iþdd]YŒXwH·ˆeF9†MCCÄúf5ïGú¬,ÒS�}¹å]Ô�vðS>„ævJ˜ù±Ÿº�ˆ± c¥0¥f'é”0�+²W4%¡o$lH[—Ñ(†�òY¸cÐdž™=«!-°¶gûiž™šQd9¾™óPŒ@9 ‡GÜò¤ Ò/‚uÊ Ú+zÒÄBñé°âöncÑ:�>ªs¡µë(âlØTâ�ëhu”åQˆ•ï£N]Y ëöˆ›H^nÔ'2ª5¨˜›Xæ]ÄÝuH³i÷‰¯5-Ÿ½>kóü©³Ù�)ˆŒ}µÍQ¡üõVËégí–tIÇ ´OÕðˆãJ˜[@_vD‰pŠ�ñ1}.q*l2Z«Â]g ÁXh¥ ±×ìZ±è0|ës*‰ƒ’¬]µõy0—†9¤ÈŽÕßæ -“ñ§¿±ÿq«3*ü�"nyZ…vŸF„Ü\�| â6áqeÛ$7iɵv‚»»–eú'/À¯uÑ�:Íð'¿P¦·]üâ½elÜAúd®ò™Øá3*Æ<>@º³h_=Ò€ãr¥gÀÈ/²:e0 Ý¢`L÷‡´9q›cʈ‹ÉêUBûBL(®€„åQeú´1Gÿ)ä)8—<“æ =Ä.E¬c¹Ì0‡&-TX^UxáqØ­uˆË…4«H»£§Ž”¿ÛE‡ÝXƒø†?õ ='ˆO]œ‚ôº‘¾žZ¶›ÌªÕF¹b†²ºÙ^ sSt»E$}\wDt«‰Ä“Jw¢9Œ´ 0Ø—H71S —˜i„}àx¡õY¤•A9ư›ÈÆÐ¼äQ– ØçQ¬–�ÆBâtà$¾9ÌO ¿Cì_Özl,wŠRC¬w±oÞVoÆO>é>±š®¨ý°nA¬t¤Õ%€1ém§/M&ÎŨ±ÞióÄn®dyRh�3öþ:«FW|µ�'J¯×%eO6#»¤á�¾3GñœH,ÚI¦Wh¢zP”ÓÉÁ²ZPîI°Ÿb¦!MajË.,÷³.bNÒÚwáóÑžÉsйÔ…ó‰ÄÑ€ñØﱦ¢ãŠ˜­ó(ìê '.km°cù6°kÝv £‰¸œ– <‹cJ¸S´*qéÆRÂ1l*âÄ#–*«#ì¤*v�BÚ}S‘ž9—#ˆûÄê³!>ô¯èzó[ˆÊ¨ÓF,fÖ7�rŸ L«ÚÍòžX�>‰°ä®ÝHsŒp™熢¬½LLq€lÏîÐƾ\�ü¤žžèësÒ»bÇÀ)|Ò�buœ�&³ÔBñŽM11Ð–ŠˆåÍ2¢O¸M Î�Å,Ϊ°Lyè©äâ½’ÔWZtäà Ȯ Û3*ˆF&”ì"ÓÊ îå>ƒÍµ‹wâå{‘ƒÄ;zŽØ?}Ò�„¬E¬C<©x—8·ž�çôè§/LZSfuÎS‹"òÖ ÝA2gÀ�È0bc}v›&Ëb ¼¶”´ Gõ‡ÁùLJã�¸ÒTØãuxrË^:ºrbÅ!54fh- ±‰È«ôXÍSèoH÷ÔÙ¤gÆ6_¶žJéР3ºô$mÆ’Œ&c"½z?ÒB9‡M£ü2 –!âè¡ëߘðÎžÇæÁ÷W“qeÛé´é¬.CIV=×<»–/º\g„ø‰p.¯ù&Í—xEÍEn&3Ê´èÔJmh›;Øœ æ6Dà•E0Ö­byzǃ&!ML<­e™3dDå ˜ u ´NŠxÐD`æ6~úâµeh}†ðÌŸ/<~q<9„NÄ»Œâ’ šû‚½{ô�;¤€´Ü ŒHoÕ@_¶�`]Ëã“·±WAâè;X ´³¡ª¬6-œç¨/ÄÙ5Ædü»�´WülÄ‘§ÎøOb×;ýR`Þå=ItÂe|>ŸåõÝä÷pþµÏÚ„kä4Äd䊎ÀØöSç�8:qÒÉ‹+�o@Ú‰ˆKOÙW1óˆ›+õJ[(õŠŸ‡j0Üùq3#c ¤Ì�ÅMÄÛB,nÄÆmNª°üÉ‹yËD ¯÷Pò²½H—1GY xÄ~…ù ”±±4©¯¶Q·[1qN�F,néQ%VÓŽ‹y^)Ê®5„~u7‘Ýt�ºÞÈ##î¯Áý&"†?yÆoÒ:F�ä Ïñ(7Gk”ßå…ˆùŒâ âŒþù‹ÈóY³…¶çG!�=3¦ .žÙ¯IÆ7ì‚6´Õ~´kÚ–]—ݤ-L¯Ý�j^¤™…ÖÅØu¸€œEÈæ%©�ºˆõFf¶k‘ÉÕû‘ö}Øm ÒõCZ3DzÕavã>Ä Ek"¬ÿEý|áÚ"µ}¿$½Ù€Èüp~^q¤çÃÔ)«Ó*hÞ£5'qdá&"³FSœSÇ3Ë©'Diµ:xRù.¤ÙJEßY‡Xw”ÿõ%¬îÕ…»«DÙ=FtÞqù“–ÙµŸ ¼½Œ]?¾�·„åÛåwr¥…Õ6â»­fxdÑzö{ŒSQS0‡‹P­k k@¤»Î¥+ "uV¦FÿÏr$‘f ´;>yHÑX_ÀòŽ‘¶ âJB 7J®,§Î†L9O¹Ég‘© Äuúdô»­b×Hu–…Œâ+â]Ÿö™„4Ψ?µ³°˜—Ýêâ‰4Y³L5Ÿôyig¡< Ÿ†þÐ^‰r@LÑ$uÔ^‰GÚ|ɹhuÄ@•z$ÌCâß!í2«ó Ò=1Ð1z:Яò)˜‡š+ü¥7'qð�DØžPAq‘ÕÍ::i¥ õwVÃÀÎm,šwâ3Þ“é0cq¹Yí,è¿2ëôDy |Äà#s> 3`ƒ´³û�X9*#mY!uLIHUD¤G½& í(ñ ·ñ?µ³b摹MFh}�rBÚYRÀã"=§ÑH§ }ï†ôÂPÛŸ÷§vÖL¤�ÅòJÿÒβq#uOŸ/Šz¾U꛿\ ãËá?â3ŽÕírMšÍj(ºOC:–oÙ<ÄÒ—¸A_ÇUdç7žµï¨ÛÑça<œüóóÞ??ïž91«‘}“' ­ž»0Ur){¹YZ¥¡EJ‡­›²êþƒ;�ÿÅ�¿ÖÆÿïÜùf-Ä�—>B×^tŠPLCšb÷”¹"ïìÂCçF¡5 á‘󣩳áª(Æ#Ý,f©ÀÅÍ„HGÍïÚ:ºj'Êsi׌Ù(þ!m?Üúü(a®Àç‹´eV‡õ´ÿdV‹Ý)`ªØ+qžÄ)ê§^šó—î¬&²Z"]"´¾(€yÒ–A:ç\#!0ÖÑgµ³”XAHü‡vÖ"´F„b"—#>Œ/¶Š(>Il\ÆH¹Ž•Ø9�ÙœMÛºŒA>iq³úÔž±³ÅÞ‰ó�ÿ$O¸ŒEñžÕ»€}K%¼Ü�4~X>ýÙ`U”·Ša®ýÀj±ìñQÄ­u¢�›«YͶ€¤Ä•:]tí Z+E,nÊ1\•€é›Q©uš('Ek€";¯qâcžãÑu#¬6–Ö"´ÞÂjÿzfÍ#Î^šŒY�Pfµœ`Ìdcä_ÚYéuZtV½>ZKùK; Å[ÑÙH5dÏ´kè4¤W†´³�^2ªÍþS;Ë÷§v–ÖûæÇ”Q|‘:†O§­G¡¹‹þâÓaª(B>Wâ›8ŸÕ3;/›%u�œ}àL;h+—Ѭöü¼™SÄ ôyÄ[ÿçÏ£:^�¾1·YÍ>”kÈ^ï’¤½Ö6»pmµÈ-lâ>#½gV öâ­åÄ•A]:§Ÿ‹8²H;i㱟‡±­ò§[E—®,ÿ©»~Ji%"ý´ˆ¾ó2ÁhÀ¥mM"À£lPíˆÖ³91@šØôdTÑ&”KÒ'.L4åYcsø€�R’¸†Ì�ú§,B:è¨.gµMQܹps%Z;`µ`/ÜX†öèšT³b×û ¨˜—[�Þ<ÒÎâ k%)3E¤�%$(@ í,hãÈ?±ÚYðÿƒÒ~—œ Q;úN1;æ<ÞÜÎo"Òh¤­F‘Ö'TDÇaüDÚ]Ð'ÓAÙK‘"ÒPc×Α®YrÍ~*¹lÒw�‹�!õÊ\ˆ4*èŒ*”ç£ï9PN…ØÜ¬>á¥ÔÅDF�&Š-¬F˜wx§Ì¥ÎÁ6"]ެj˜oUjI=ds%G½Æ›;ÇÎ2sƒu}pÎJINõÿÇÞ{GE•uÛ£3fQ[m1çœZÛnsÉUub ’$(JÎ9gŠœsÎ9+ŠQ¢(ŠÙŽ_¸÷þx{nô»ß o¼{Çø½ÿ<Ž(ŠªsÎ^{­¹ÖÞkN™êPƒ(V´™(À�œW·”jgQýöCSäy·©v—ûh9ÕÎ È…v––æ¢ä¢Éí ®nªMSIµ³”ÐO†vVh·v–òŸµ³\¾jgíîÅZØkÉ9’[J·óB;>¨`,ø½¡¿L-0åž(2?3FC[�þ=É;;ò÷–ZrÅ6 èR3PÝü}™™ôM ‚KºyŽ+&Iä^ŠÎAý¨>™½G/h~‹~9£™·r_ÈŠ›„þ¡ÜÒN ûËä�\�æ νVÖZ[6‹Œ™‚ää6þ½ð#9c®Úª)ø$CñùÞ5 èNË·üãŸ=ŠO<5zÐæ6Ø c 6ËàmÎ~ñÇi£¤¸ÊiÐò¥¸’Ämþ$šø\’Ë^©Tóû­äå-«…}­[¨v8Ò�¼ú˜ÿC;Ëó‹v–GÕÎ:2GL½´HÚ5È\f¥�s‡Þ6ÖJ•¾é#¥¤C³,ÂK&Yì ¥úÖ4÷ÍIùØóî/§z$A—†rÙC¯€j“gŒ|Rö:8 q�Ë{°B(®]Ï>øY‘{c 4ài- ûsh.S¬‡ëâÓ//—<ö=J±§gA—TÚ×`$¨//¶Ø1”³vê¡rðíKòµ1|NÕ `0žä²Ýú’ÝÚY,ÕÎjøY(ï0´šb2òª…áÜ_aÐËÌÎS[nÚû«vêKРúJÑ%“¥Ä£³¥�”Ñ4¾‡äéñ)‡gŠéW)cOÌ‚v¥èÐ{Å0ÇQ7Qéq™çtës\YDuc"óõðZÄz\‰gæ)cŽÏ�SFÁ‹øû­ö= ¿�{>÷ÒR®èé*Ô×èš;´ƒS‰ïU�”v¥£ÎN!Të^R¨'Ä–NÄú‹ÜåX£÷”‹,Õã}û˜s6š2‹mšˆ�ÿ‚Óß;q˜ÁŽ15ÛªÁYûôT:G @~«ôM Íød>ùøL©ì©!åAÆZÅvÿÞðù¼{ÔÄB¹ÒEËÄ|«† öü�Ø,…8¦ (üžÆHרÎ.jž$oÃþ4ÔK»õKöOdS.€[)r.6ãÂ<è(½3GR}°À¼±ˆ;‘yÔ?H §çŠ$W…ê›ÝšÂ‰Cºu¨H NM»¸ÚoÀT<KÀ?kbß ´€a_è±€f0î74ê€C8õ™yBæ�eÀŠXW�v!¨h,47„ˆŠ è1¡u¦Ð9Ø+ê—.}· þÀaT†Ø’˜pl&Ö3¨ÆûŽn›'ÅûÀ`b䉩\öƒå¨‰ˆe ù�øÍm!ÜWä£Ô/†f��f5ísI»³˜êy'P T¥WüpªÁLÆ8TH#q›ähÀûTǸ(¢D�#÷žæFÐÃõ&×Iìô‹¦»Ÿ|rjÒ‰FIy¢Vŕ֭á-vô�™ Ö¯¨FMPúwTã :oÀaÎaýi=៴³¸Œk iÞ’;FH=7x\VX¿ ù»ÌÖ»§Œ`|Î3OZibÔ-N’÷‘y<Žÿª�^4ÚF<æTÎUª±.…í›Øý¾¥ßÃh.ê„Ê©|êÉÙ\îõ¥ÄÆ–ñ×(f¡5«„ÓñT.’Ø=ù<`êÛ ;Eæ(—HrùÒú•âÑz…âèKyQõrì±Ãš»nÝ7é4P8úÄÜêÜ}Û³]­�ݳUUÔš²{kÖ�|h5ξH (KÆ’\¹÷Ñe“±×�· ì-F�BsæÜëËEït]s•ƒ&K05Õ°Ù«Ý-ŽØl\ÆÙkÊdš3æf*†µõî|Œëb³ï.F]‚䓽ÌåJ ªåI>KŒ.›}+ì_¢šD ç(².†æ4åhŸÉeQ‹â윴¡µ…û)&�ŸË%žš‰Z>b4gÐG®tëe¬¡‹‘ǦR}ºÖ MªüqÐYCm½dBêµEX³¢š‡¨aÂ.¢ÎÍ�ÂM†µ2¸XûoxõõnlIçÑþ)ÊøS³a÷t¬Qo‚WhÞ÷¨] e úÄÏá݃u{ß>ÜVwmqOÚpìëá·)�5Šâ¾Fc.·öGªÙƒÕ�>3�+|øŸÿðg)ºr*Õ4‡æ-Á|³&›Žý…ðbpöhh`q™—*öµ¬•çÞ[Œõ]¬7Ó^G§ð~4&Å™?,%z…¦8Å?ó;eX¡]"þ]‘{}±<óÂ\Üè¬#Ÿ7�5¡_A5UH\¡>/²{X¦RÝ \7Á�4F�yÏ%™Æ|Nò–…Àf<ñO‡²v~½pÞØ{ÆU´n‚ u낚œúÆBÌÄ/.nïD®¸i özJGY.íæ"ê«ýRt�Yñ¾ÔÇ�±ÄÞKè=a_�{¨]!ï/¼¿>•®M[Ùh!ïEŒÅû³6.ÚØ“�Z8tŠ8Ë�ÚæfÝšˆ¾Y#¡©‚kÂÚkëÐÃP3Á´"#ì$v�5fÏä¡Ýzæççˆñ‡§£†Š5H`FÑ=tÕÄ"1 禌<0U̸ºõ1’Ø9?)êätÞ+}8öDpÎ}E/èX’÷‡ÿòÏÿqR„–½‹?Ô/…ô+‹¡yDõƒ µm8ßì‘ȳé:r_h�A//õølàª[ Íöˆò‰$G¡úX;‡/§Z<…UË¡]„¿¡ùrUb·À@ЀPµü¬(¨ÿ>OŒ'XºJˆµÉ'f+J›WK•õæÐ‰ÁZ=ÕúÚ;„î=A­{€b�Lã# ®…¾1~†‚îriýO²Â‡?(Ô×Ð5O;`;dŽuëç�¦ë€¨G`ï°_æ¨nŒœ÷=öÈ ïQì$DíŸ$·öÒ–)wj!—€n04á8ßgÔ#‚?ì·Š­œ,…¨GÓµ2õÙù\QÕϼúÆR¬Ó³Öþ=�y ùvËÂËõäy÷–âýéz�?±‡ Âјc|Ä^=EÊ‘iò¢Ëå¹w–ȳo-B/*çä×ú˜œ³W1º|2ՇÒ�Ê ‚‰¡Î!ý$¯¬Ð*¡¥Mð(ŸPN|èÑ™°I’sõÇÚü ô¦DWï~ÜΨâž„¡BhñQ…ch��äL4ß ‡{}ic3ÆÔ\ÎG#7A¾‹ûœ„õVžØ,¿Ã»µmhL“{&†}�½<¿¾âyÆ…ÅÀ+ÐÓB>ˆ=[RÄމػ�y…óÀz±è™­‹Üþ8’ê¦{Ä ¡{Ž ï™<ŒÄ±a4ÎCï•øÞ;CšÎTOûò¨f·ì�[Ôh}b‡R­&êƒÏϧ:¯¨™Š9ΧœëöGÐ>%>Žê\A+uv2ÇÄ=äÞ…;#ù pl�ä@ ÙŒ+ó1ŽÀ„lÞ•%Byr�TO ú¡ÐF�urϨÁt­”`"賉åÏ ÑGÇz¼�½´‘ä¾Åœ-:ªW†u:߸aÈ“ ]‡¹MïüCòé™t?pÜáIØï ÝDhb¿ æÅäÞÂ_)ƒ ¿§q)áÄlª N®™�)ž@í4¶b¢"ùâLE¹éœgÆ0à9zmØ÷’ÿp9æÕزsÕ†N¸Ù�?ËN½4â¼4ä÷·(’ŽLeíöôDð»ÉÐé!q`:��Ðt‰@Ï›Îë³s»¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;þ>&O^¿cÛ:«]V:Ü&�É«7/¶ ?›YíÜeã®c¤3Ùbîj÷]ëì­wÙ»ì°r÷Ò[ާ8Ã-òÍëô–ëMÛbåeãn1Ïb™Åt½õ¦­Þ<žùòÛéz³ÈKçÍY°Ho®™�•“Þ´î7Õ#¿Ö3v··³ßAž4·¶r²é~é�ä¡3{鋘³pÞÒ%zK—-ž7gñ‚EKõœÿãÓ ÎY´`éR='<½ˆþ€§Òü—§¿¾‰ÓÿÞN:ÛuX�:¦:Ëô¦M×ãXù?}GîǸkÜ=vn7±ÚEÎG÷“klÈü‡§§Éwì°r¶Ù¦GŸÕ#Oë-™®3Oo5yp{ð��Žù2_oýÇy‘ôÉ7ä©=zóçéê‰ÊyzÛðz3œíÒù8ÑùÝ׿pÞœ%?tÿ¼åŸžO¿nùÇëÿóÏôõ;þýãÉ·îqÞ`ïd³¼û[z5_�\û|=n£ÎÜu6»í­mÖòzœ‘ŽHÎt6ÎîÿÉOô~.X¼`a÷Ç(õæ“O^²×¶ýôz܆/óåËz‹È§Ïÿ�Þ¥Ezø³y:“'Óóƒ‘.×[4É’¥:Üæ¾›6³Ìúµ†ÌfC–14ߦaÂÚiâa(lÕ4–[i™ZkÛjl2˜ ëÌ}‘1“m×0· ì‰N™­O™­_O³m»µM$7Íõ«�™•+61›7ðŒ‘ÂQÃHå¦i$sÔÜ Ï1ëV›2›6˜0 w3Qn×4³Ù©mjåª%wé+sˆèklã­m`fÁoe@hen½«‡Ì&¬—™¥gS úÙú¦JòæÌú•›ÉW3Æ”·ÓDC6ßoÙbI_cÊÛk(l½z‚¤Eé�0dLª ¼ïA€&^J@ìÜÍÜ´iggü`4΢ñ›ªÑhª ˇ&4z*¶ºõÑø 2'ß¾ ½¥Í£I'ç¡áÍq‚³_J®A¾ŠÞ}DW�¯¤�Q%]ÁëÑ\µÝ³·`»³§jGø¥;ù|�¸! [a]ýûQÒïžæh–V¨4䢵&ˆ–@šÀnsÓF³$¢y÷ž 7“óŒÜÊI‹wOŒF!…½GO…�;%ǹïè×�  ‡5—Yj˜ [58 8’ëwñî+ù%��bNW•ŽC“µ©d¯ÁZ{hƒ4‚^{TÅd%ˆ·“÷AÃ+î§{Ì`JÎP8V ­Ïä}ÇzDàv%‘çS‡ò^©ÃX» Þ¦ÊZ ¤å]ûS2ÿìQtƒ;%ã‰Lï š"‚²¿C“èF|�P�ÏQX8j)xKM?š(í4A‚icS[ 3+ ‰™”9š.x'JTi¸Ed !Ô°IÆ 1Ö\tÖ’‘ëQX“{J~Éçúu[4΂°–µ�è+·�ê+Ûê© Rrc³[12•ƒH=õ�Ì4†s;“›Z»ié Ìš�ÆŒ!w­¼z ;ò»’sÎáýeœ‹&Ä'LU»´6“×m^ ÒaK �0á<@¶dn±»«tíÁÚzö”‚ú)�û‹‘ƒ,RasãDßT]l¤—‘ë%ç )z¦ “ü F+ƒKô@Ò Ü“0 Ä“”¨Ë+vì‡wÚÓGa¿§§ä“÷¹¿£End�‘Ô×—‰©)Gá5<±~‡g4KPÒ•ÐBJÐM¶�76oá�6Jåæ§£t÷ì§ôŒ2J6±3dÈ0X«�Ú VÁ�ÂÂ^‹µÞ¡M /ûrîýÑ(ªòσfaWèÑÖ¿%? Ê�f2É3q˜àäߗݾ³'Çh“±}…ÝŽœ�›6È,DOb»#ƒ @{d¦˜xrŽrO¦®àÐ�sñï ;Gƒ"ˆ–ÐäB½2ti‡SXئT2ŽzeÞþAÈ­^�M> ›ƒu ío®$cAì�6Uï"öŒÆâˆ² ‰ Bu;üúÒ&ïð!ÊàÂq¼GÔ ÞaOoÚ$ƒ†^2n´ÑÐÖI›÷+Í;‡ö3l47¬Ò'>rcÆ’ù¦ÜÝÃLpÕ’ Žd,wõ�“‡™à ih$0F\·8�j‡%ñÙCæ¼µ†‰\Å€Hç"Zn[@/4±Î‘ýA.ˆ÷1‘oÓ0eí4(A4¹4có»Ó‡òv!}Ì•îZø n ¹Zt î :>hBìn‘&„œ8G¯Þ¢Cx?™äªe.?jáÒCté'y¦ WºÇ‘œýúIŽ^}Ðd«òNÔå­ÑÄáÝ ¼¼_2m‚HÈøô¥¢d(ñ�gü0iWì4UR’ÀÝÃé8ù©G ‰梉Mæh²½È}¹ñ½h„QFš¦L>·@shºDI*ʧ(ýÐìÔŸú@â?»’‰O&>M@°+ÚpKÆŠsôî�†zØŒrOØ`4åÒÆj4Í„–O@Óm¼õˆLí�øeåîø¡Ò®¨Á¢{�üÞ‹~aÌ}iS,m`�Ù7Y~`2æšQ> ä]Ý�‹û'ÒÆ·ðÒqR`þ�©B*&ÒÏaƒ[`!(o šèh#wdÙÍŠhx È%ø¤§ÄÆ &w èKq(‰rþX4á þ©#D���˜ß ¬…_©ÎU¡"c {D#ñ°OopvÎÚhâáìJƒ1£¿ÅŒ9•Œ#¶¸IÁnQ12�ü=ñI kwm™ÒVþ‡*Øyö‚ýÀ7ˬ´6Î=ÐÔm`,cL¹mš¬�OOÖ>°{ñ٠·�),=µÑÄŒ¹…æ/Ú°åJÎ9~ ‡ës ï/îN "%�ÌCÜ•8„…›×mdä’“¦ˆ† »à¾rK· ¡¯$öR‚ â á#$Gï¾ ÝÃÂ7‚D•sðëƒfK)ªx"²á`[‚#±O2ž´¡+0g4‡Ð(ÌÛùö¦Äh{Rhó¢*¢b m'ã&ùf�êÆEã¤È½“> ²$)zïd)þÄ,ø&)úð4ø"åžè! ùâl]µiC™À‚ýÎ^hº•|↋;ã ^©ÃApB Ö@Ò€xè§FCÝ4e*C‰-¡á “dþPR;J GÎöà�® ²*\ænÅø“³h3qúõ…h4Cc¸€g( P`ÁX¼7ˆÑÑL˹¡©1¨¿Hì�x°ÅèòI �VFVNVú�‘ù¬˜KhÞ\#€Ÿ6óƒTxgÄÓ½Ô#0WØäÞ»øôE"õ©Äׂ�BnåJÆo;%<†¯£ç�ñ ƒxÜ»›s* ˆGpö$.8ôq.k±«¿Õ»'£@ö§ ~Q.Ùk¿ )„ ˜™.ˆð XGEì×5²?%8ðW�äöÄFS·œ`¹�§6»#ª?Hµø˜SÅÈ“Ó(¡�õ.mžøRÚôJæ¤pÈ%a¿ÙºhÌ7Ág£IIˆŸä,Ý´J›nÂqr-ˆËhP§¤NžJÎ�ýh,½ît]Šá#=I, ˜0(g µg�Þ�ßcìáék÷¨u�…@–B}”wö(ÚÜHâ7°Æ�’Ãø番Kɦ<ÂI»c‡Rb'bðQ4þº›AÃ#|,æ�æ(Ú\b-¯¨!ÊÐâñRh‘“iƒ&™¯˜— ÐDC"æ ˆeDJT‘ÿ=Γ €x›Ø!ˆühSfpmÀ„mü£ù6öØ4Bƒ\‹‹;9 „ß 5Aƒ%¾ÂgÒfQ4Y—ŽE-m %¶R �¢ƒL¦›¬�ørr/ˆ} …ï¹-ç¦CÅ>"L¹ =�-à÷×4NRp'6»;a%ƒÄs»Buäþ½Ykâû@Æ ²€2Lj?¦$ Cs Ó¹Ÿ‚ø?Öqg/Ü<àKÈ=¬ÚA≯"þ=ût7·’sH¼4—Î-’À7ÒùF~_l#Ä_˜Ãæ<\Æ¥\žKI“ÎΠ�™.ÑxŸ¼‘|Ìù\Þ³ŸøÔ‹xçÄÆfðÓŽZ¢wš®˜tb¶�zf.šÞé½ /bäQGk:|éAÆÕƒÄ/2%ßìïT¡û&ÁWÁïp–Ûµ@îDñR,®-‰�ƒmJ ¬õŒ BGÚTJÆ8ˆ6×’ñ†�€<ƒ6Š£!÷„ÌJC°�°#¨k)É|ÆË=vG‰Ô£`ñž_b,p?_a3 }±±Ó¯„8Ú”M0$Oâ?KÆ‹Æ|Ä~ÏØ!ȳ@º@‰1“OÏá7mÆ%6*y¥P_I{â‡ð¾ñC!Ö? 2*bw|*D¸�¢1”xÄ=|½>·È�4>‡˜âøÚ¢I[nëFs,1´hŸtv«9w2~v½18?ö éB* =•Â+'ò®±àSAð‡Ï ÍôA¸·é#xøM’ÀnA"ÎÚõ1‡h†ímøJÄ �ÌjŸ‘{'šr¶f$–Kä+ÉUð½)ï¬iFò/™Ô-hBɾ6ØFŸ�ÒaÚ¸}b@vG›´÷|L¿O*DžÌ%žŸ 2nÎ?g$Ë °Ãy¥ã ¾ÃCá_4 "O l‡h‚9Éà p2zÎ-Jb$f*M`RúP�œLEü·­O/`�‰»R†R; ±ñQ"ùõ— 'ÜØOðIFI*ŠZWÓüÛÞ»�‰d|åO–C$@‘rqìaŸÔ„—èÁ‡WƒÄØŠäßÃ×�¸5ö œHÇB$fó7€˜F"ãr<gI|H|�¦˜ƒØ2_ñOÓ¥Mê·Ð8D0%ùt"yƒ£O_ŠEHìä¿ lW$›Šø r5Ìw|æÈ@Ä[£qDàÛ<´1Ï(IùLȶ‘œÙÂI 9#Gâ�‚1  >4orY¹…Íõhs=™Ÿ¸¢Wô*À@b,oOr“XG2l¼z*H<†`ì“ß™0¢¸ÏhÊ7‘‘\Ea©�Zp!Î�µ@Þî¤iÆÛ‘<ÄAÄ}0¢uà3Œ3ñYˆÉ ÷cOÎÀüBl¹-ï7�¯ß|ÈZ9ö�Ûºö�msëAãÁÎØ�r{¯ž óA£ÉË» =z 6Áîë§°ôèa‚|]Ü¡eÌnÓD>†| ÷MfáªrJJ†KòtÞÞ¯7È©Øn‚IŽFÆ8-òàdˆ=È ›VÐù?�ÑC‘Ï@ Äí˜S4W ¹6ÁH=AÔBmå‚-Arä•¢ ‚,®P"NÏôáÔ×’˜ñŠ `÷Ägw îŸÄ§œ�+P’éð�”ôþ(íú"®üÕ&þàsSž6JxJIk\#_S‚Ü�¡:Ÿ ÷žØì¸ ¾ñ¢È-X'òzøJÔ…Ü¢(¶ûô¢8˜À#m„+(.ð/KI´ Æ õÑxÁÕm D³»"²;‚ûb®Á6©�%sAB¾�¯$.lÞ`À`Üe–^ÚÈŸ!˜Û=vkCàdÙ2ÞV“w ê ¿ÍŸ‚úÈ )f$þCA2¼²tÉ\êÒAv»o9É«MINcbnÁ˜ Ö”0“<ßÇm'¶kãÛ¤˜È×Ab/ݵ@:rB…­wOÌC™åÎtŽ‹º%|'É÷zÐøGã|¸ÄQFFÞAbõ÷ÀhÔW�d#ãúbJàòäŒ$ǹ{è¹!wü½¹üèŸ[é�A0óyœ±¹Š ´Bh„vlòùYÜ®¨�ˆEŠmä³AþÜ { .у¨–Dâ-jOª üqÀ¢ðß A&ùz/É�àÉ÷ƒ<›øCÄrêCAZr_š¯G /Iˆ=4�æ¿�ùc¥Ð‚qÀ±¨J>IºJï´nÂHÿÔQ/G—MTÕüDE�öÄ F=“[DæŽc+¦²ê{‹{Ÿ¯U”¿\C…+süÀ§\_²FÁ1²?b-Ä{äö~½ ¸¼Êf?XʧÞ^ÄûåŒ>dí}{ƒP�Íy´LQÒü3%‹…xX@Ñhο°#Äœ›ÁeU/ã ž­ŠÖ 5«AÄÒMÆHâJpÞ䥔”dœˆKw Û«Gñ1yˆqgfòI—æp™÷—èÉÔ2`†²î|�Øæ!y?%ÇwØÓxCDÎIò'�ºÑ¹IìuÔx×èÉ[@¸Žºp¯|+ñŸÖ>=‘Ó�¬ äJ¼G:ÅÖ‚k øeàÔ„AH›A½à–8¢î朵&oÐGp�$n è Ûq%p¨rg­Õ�„µ]ZïôK)Åë&*AèL0Üî°AÀz””eWè@JP^ø½<ÿþRùáOúŠc�dïV±~©Ãa&’£&ê² ŽÃ½¢äô˜çÄOP|¬`õZÓG )æÐtZO¢õŸÌï@vŠº H¤Ôú%ïC¾îØOyeؾ‰”x�’-•N%ˆáAÎÌù¤ ã½Hþ²'f0ê«ÜžˆA 8§Â=q'§C¨™æO ÒN>7b‚‚OÉwÀ‚/Ä >þìL¶øå*.³î.´ü{ÄEÁ7—q~ž¼¤q%„ÉøÈ½ã¹ÝIC$æyœQ¦‡y æÕ®f V(Š~âÕw–R"™°�10e¤�z|„<@˜D‰á@J�äp‰—çà~˲-’•´üHÉÒú²[]´‘¯sÈ×' nB ÿ+q?ÅR^iÃé< c¬ ,̹Š}r»óõݱƒh�‘ø\Ä �d Qǧ²)—ç±gf{²t9[Ï^ø=Ì ç¦òÉí&&÷FÚ�­ ’^ÙVˆïìÐñ‘@ü-jd2’Ãc¾ˆv>}°&¤ŒÞû%_÷ë‡z ­_ÆGîŸHk„ÈÝì¹#0f8�Ȧlß§5få/V|Í×�yTäž"_§¢ŽdÎ;ûô¥¡Äß ©çæ‰aEzRHñ8’Oi$0(ˆæi½‚K×r‰fAð‚Õ4o#¹H!rÄ>û™äë‹y—ä�´¾/ºü#_çSNÍ�xêoÀ阫À@Ýù:æK`?ïÓõ52ް‹à½¤ ì14_·"ù:/ÈØÒºsäþI4_Æs»üq¦Qâ&Ô™¨ØEåd¡¤v½XùÔD8Ö"ç*^m–Þ[FÅ.ìÉ=ßF endstream endobj 66 0 obj <>stream °¸-Á9¢«–Br×ê&u%¹?ña˜›8ˆ _¦Bþˆ@ÉŸ@Ä…zêIÄ„Äó³Å¸ÃÓ¥�¬1"Íדh¾2[œ#Í×QCD>�<>”øa<²Y×A˜ µuÔ)i®Fp)ÍÕAˆZCHÞbNÄ* k–C4OQܺ’`’n± ‚É0OiÍÖ)¨Ÿ\eCÅ.Ä»€Ø;´ï{S9É•�å kåöEì"RGô ~Ø7eÄ.DWŸ~˜;TH%¨ì{`b…%üZ·Ø…˜ß°Z(jY‹ëù9b(gK>ß#~Õ@î¿ áEɱOÓš+%Ç‹98E^X¿B¾ÿÝ:CðZ&Â= ?JAæ7ñ™¨ÍR’=<[yÑ57ˆ›åM›¥/Ws$·¥Ä¸��>bØ+�:r~Î%F‡Öð=ɇe6žÚÆæ¶úëYÔ<5!ö­°÷íÁ ì0's—%s¢”¨'aÏpÄ)!¼€œ5ò|O�#¢k¨_LÅåÕ®ã/Ρ 䞱ù�~”—·®–ç?^f^Öòpj—&omÜLÅ.d$W7WüCìB¾kWFÆJÆt‹HíŸEE«P—´ÝMk3X;‡mÒ¼DŸÛw÷B KD~Oü ê( Db]eLåTÂÒµrçîZ—2ª| %âöLÞM ¼»7ÅdŽAüõOÑ…Ø/±K¥KäZ?ClM:EE^hÝÞ½{o?¡ëQw¦‚îž CäÛ\{`oÃØúïb%õkŲ'›Yßœ_Å.dª]ZÔfP‡ôM|± Œ�ôÏbaÝb$ÆQ± b7*/’ÙùôælÜ{ÒúBpñ8äŽTP�Ì#Ôß)þ ?2‰Ú�KìøˆÀÊK^¯bK:V³i7æÓz¿Gä@žWë0Oy�`¬?aþJÔ¥� Â;$¶rŽ»{crjˆÌAÄ Ä犲'«(¹;ÈZ‘ )¶k›3F[L’÷k ÏÁúòaä~ ·øð‹FÝ´‘eÖ-7`Öü´‰�8,j­æö)ËÑ… 1êfXÃÂûSÒ\ä¯$f¢^A>*.‚Z òr’Bl‚ÄL`rÄ ä¼ âÄ}¡„¥åmkeGßm&sj1ľ!va¼Dçx˜³<qIäÿ צbú,³Å@ÁðÛýz« *Bü5­On÷ì�ñ¦ëÖ;´éW[WmÜ+щÄôºøõSØí¦~ˆb‹ô ‹ÅÜ+¨_æD­âcé—pY×—g‚c ßÀf]XÐM¤š<’®£†åëa•O¦Ÿ�ÏW4êC`~k(*/âË£K&‰eµ›”MæÒ¾ÆlyÇy~ÝTì‚Ì>öðyÞ-*vÁæ>ZFÅ.HþŒýFŒ‘è¢ Á' ¢E¿#òÇCD†Š]„t‹]Hÿ,váúUì£'ki¯¥4)ÞÅš0‰ólnõ�|öýe<Á�´fwxüÍ9}2GHǦr%/Öñû:õ¥V£.-†š(øŒf÷wl€�ÍyAê�| ûÃÈƒŠ€º‡¢û"¼Ó†#/Gý¹:ò_ˆ“ÿ¡†&ÙzöVºD„Ö>AœËf<\Ìì#wŽì‚zÅ®”A°O3É^sãzcfõÚ�Ìæ�¦Œ1ï@×C�;Ùâ'+A¤ bvÔ°ÌVrëIó‰¤s °ç 6Ên÷èÉ“\×.•ToäÒo/–Hl£µwïÄatý{9‚@H[¦'/®ÿ‰ßûb3»H93 6#ÿ‡Ø…×±‹]½•TìâèˆH»¢£¶fNæ“{OÖTúçŒVb/p£�g/ÔÚÌäJ†ÛêÔCÚ“2œ’ìcÏExù$ø*Ø+õC v;¶LH¿µT\¢‡ñDý¢ð)RdÑ�5Ër.Îã· ûZ 0¾Í¢¾6¯z¥²²ÆL(®]Çg][ßÀU>Ó¹4j—t?ˆZãNG€ükv_Å.8*vñôg¡üµ¾¸ÿ¹±¢òýFù¾æU|ÔþIXãQlè%ÛîÕSîÖç«Ø›ß¼B"yü”ÂIGç(CSÇÐøNb™�rd–�vy‘wl&ÅÁÀ$vн=Äßc¬Ø‚û+„ÂÚµ|IõZ¶äñ*Œ/jÏlúíX»!Üqtм ñGEÚ�y\Ô™)lÒåYÔGÅŸš1M.îÐ`:ŠÍ±¼!ˆ°ŠI|Nõ ¾ nrÖ'KyÖë‘÷Ðù,�}{Ä&„¬«?ˆÅ ›¸ÊvåÉ'VÊ#­›xi&ë]0‚õH"w�€5skצœ¥†)±Sä Ád¾L€_ÈüF- ëEÆú ¯£‚1*cOÏQEì›LñÌθÁد� ±ðñZ!åÖBºŸkvPý²Ö ÑPÁb|ä9·sæCìBòΦ5Ô°çHž3^U6Y™pf.öttcšâ±´öŽ:ÐîèÁ´ÆîŸõòqZÃùﮈ�t�Ç+zêਭ(óê׋9U?uçì$~û`ÇñÊȽ“Q³§Â™t:~j§ä“Nç5 Wë·©.V;BœÒ`ãâÆt/[é£uÊò#aß}yÑ­¨8%ÄÀÕ÷—€ô$Üt=ÂY# þß-ÐAr6ŸT]¬‹ÊsHnJp¸t¸I!ß×¾bXçÂËÆu¯Oì«Ø™<"ð\ì•TìÂ;q(Í£*¦¡æ%…å�£báÝbbÖù%´ bû+=H>R¢G…åHžJÉ’ÉïùâºÕ|iÃzšŸ”´¬Æš ‰ اHÿ‚}cþ!ØWöj=öý™±Ý¤ètŸAá8ûðù }Ï­Y%–6odSïÌÇ}€íÐ5!ˆa-9:jiˆ‡$G�6(¬.ÞpQž¯ßfvðÍjÌ6ùÚΫhHý‘k"_¢ëÀ;Q_T8$ñliÛZØ»>Áƒúë¶PáT3‘Äwç¥þýTˆ#Guôèÿ®tO ûŠÅ°ô1”èkGØ[†=?$. ‰Ž;;S\>kBÀ¿T`k”X_!c‰½bð9À”ÜÂÒZÿö€>¢GÉ£MS..„ÿ£"[÷‡É_ÎPjØ.ïGëꨛ¨ 7qd<„€‚ÑÈIP‹Â~ Ï”–nÁ%ßx]JîÿEœc+ßß²Nuî‘�åí»ÞÜÉ6Ö© õe bÍ×PÛ�8eâ©ÜeËÚ×C@”-nZÉgÜ^"Æœ˜.FìŸHÅ‚±æï“>5:Î%\‡®Áþ“Ø…‚ä¯t](¼p„Ù‘OÈò-…`žÂ9¬¯Ü)ª±‘1\ÄñɺF2n)<û{á«Øâö㥛Íf_]Œ˜­Œ¨œ ì÷µ¾JsÚØŠ)\ÁÕRaݱ¨n»÷é?ûد‚}[Lÿ«`ß³ÕìÃ>L:ÇP?"¶H‰ïM§¢V$þcß!Ä•¨TÄá‰Ø#aDÞO=‚Úâå9‚ñhØür3®¼u#h*§ ?<BØ ¯Ìa ÿôᨵ`/ ë“9ÜÜÆCkf‰åÀQâÞf�`EÔžä‚�&öÃ÷Q1Jç ÔÑfÔ3yG‚=P�‡MztïU£5pˆš&Ÿ›MëÄ_@ìUHïÞó�<˜�ät�.ö2&œ™ 1º?ë XGÙºGëTXßÃÚjØ« …ëÑ}å¦ÀDÐb ŽòLÊ:ïêE÷È�xˆ¼†°Ã‡ gÄÃ?o4DíP«U†¨ÇJq‡f`/qJ`fØêÞz}»ÊÊ_¬¤{v„õÇCìQ¡uÇüÚ娙€\ŸúväĘ_Q‡§Ò=ðûÈg!ÊArì] ÊCç*3SÏÎ�´ZÚ}M!{Çsi'çÈËê–ç?ZÊÆ™ÌzgÇžˆn¡%ò3¢º¶ˆŠ"ù§Ž€(}o¡>wbº"çúbyÖµù´nq,—˜¨#SÍøÓ³ t®Œ=<ƒîéÃ>pì]Ä܉>6Y±·s�PñÎPˆ8=•î¯�0pYtåd’3̇@ €&y™‹‹�_èÜÀ:*rJäݾÙ#ð {úÓ¾Ö…¸O`Áh¬{bÍ�³ó¡qcÌ:yö¦{[ŠÇ`�¹�bD�³tY·(ˆ’#O‚xªÜ�`éàýzBrÕ"àÁ¿l �Í.¡:t=^é¤EqØß~‰‡”èžî—£õ^ú9È[QK�>:•æ‰gfRQ–ì'ヽV$Î"¿�H±)éì|1þÌlŒ-Ö¬±VOE1PÇÄú%ê…Øã‹:XÅZš)ñ½t-5,üÁ¼gÔ`êG!þ„µfØhʹyTõt¬s…—N¤Âkðש‰i§ç#�ë®'æ�ƒÀ=WùR_^Ö²â”Âî¤!œK@?œ3Á1?AÐV@LÛ�:Œ^+®‡ä°]øÔ¶ÄŸÊKêV¢®B¯)ˆœ„퓉ý¤_]D¾“NÏ"ÏMGΆýaÞaËÛÖÉ÷·­E-” ß7ŽÛ«‡}V¨õÈ /¯Ï§ui27°_ù6Ź G¦a­˜ ÏO|+ìûD-Š'Ò¼ø‚&$'cÎÎÄšbw=`ß$ˆ}Iqggów–PÌ æ�>‚>è>¹Ó3)B]˜ÄKê‚‹¾‡½ð©×BdŒÖ/‰Ý“û: § ‚Ø ÄÓØŒ‹ è îwÂÞÉ´&ˆ5!¬;¢fQ2Žâ'Ï%�fs®.¦ëV.‘ â†u~1ùä\ÔÓ¸´k !‹Ø¯È½³„ fœ™¿¬È#~šÆ:cö“˜}x:Å´ЀRÜñé4öWtl’•7¯ä¢*Æãµ¨ÊŠZW`MŠM¹3ù‹<¿~™PÑfÄVtnR6­ vŸ|bvK…5?’˜µ~ë¨$?^„š·q`übŽ{j&Ÿvn.­�B@ûP“‰¢ f9S1�ŠX Vå°C›Æ;ˆÓ”½Z£(í\Å¥=ZŒûÿˆ=¬\Ú½…¬gæ0ηp$yh"[Ú¾F,o1„ð;­7¢¯ 9Ö<�‡Q/ݧ‡u@n{X_Ú«|x‚¸wö�QQ#ˆ�`O2|pÒ‚#.Ï£˜#ô°vd—pfº<‹|.0«w®®Ü#m°Â¿h$rpœ\]½P~èó&öÈ;#óC¿­—�ù»‘âÆïŠ[Ÿ¶²gßóì�ÏòýŸ×)*>¬ç�½6—.µØ)oçÁ�QE“UξýP— {WÉ=ƒ˜%™§S…¤Ëóø’æµªÏV•5âÖ²¹Uiµ™˜{%^öH¦ ( ÷y¥¢ðÉ ÔgÄä« ±/CQôdD�hÎI°=¿ÿå®ò�Wön=Wܾë&x@ˆ‰ú¹²Ö•,ÄNK[~–çTÓº4Ÿ|a.ü§¢âÅzø®¨u,!;“b�ΠµTº_ôÄtø1|å#OfÓ.Íe³.‘—¿\£(kYÃV´l+[Œ…Ц-°”7þ„sDýç./¨[;�]+J_¬ÂÞöÀ}îh«D°¹“/åæeo–å?_.¯ücw¹ÓB¼ÿr'·ÃYºÜjÇ�~Î GɃ¼Vy¢Á‚?Þ"�·�¿{.Ï4[ò§_qŠÔGó©æÉsš~0«üe%{ö¯¼Üà¨<ûÄXFy°AÎV¼Ù,Ûÿ|5r%ˆÈ§Ý_‚JqH֣Ĩ‹³±ÿEUöÌD,ëÜŒuj ÉŸF²ÁûDz¡ÆÉ#ÎN0É{6ßäT×zÙå¿Ë×WÊïþÕŠ½ý»­ìá¿n5¯é²fŸÿê't¾ŒæÚ>°µoÜø;ïœpïT5Õ¡RmC€põ­-{ñƒÈ^~/IW�T—ž:[œ|b­*o0Sæ×¯W=ÛÄ•´¬#¾çGŒ«"åÒ,®èù*i_«©å¾g ±¨}ƒirEËЂ JÿäQ–;#‡X„ULÒ±v|� QA ëtˆ�ÜáÆÜ‘÷¦ü™vž?Ó&ð—_l/=³®µÛЇ^(û?lP6þ(+µŠ?üÂŒ?ÙÎqd å'?ËOüfÄùdª8ñÁ”?ñ‚eO¾6çÏ·‰â©VIy¶a›åµª�â¹:Knï‹ ²’§+ä{_¯&�U°9.åæ<Ø%lŒÝ÷jƒPþ\ëµBå Ø¦‘ê@ƒBu¤VàÊ6(J[VÁ÷ñeÄÿµ¬Äš…¼ìåJyÅ›5æ?®c¼ÛÌym(?þa‹âè'CÅñOÆÜ…÷*þò[â:yÅÕOJþÆ›íâÙW[ÅcäO´+„³�*é\ëVþ\›Äž|e†³ùéß eg~3’_ü…åo}²“Ýý7KùÕß¡ú¹‡T]çgyãÁnËKv(OÔ©¸­†Üþ7›qn|ú­Eˆ4®|¤¸öI)œéTò¥ï7ðÄl=Teɵ¯5Ûê¬ejíÑâšX µ¸}×Ku¥ÆU<Ùi!œy«’޾••ÏÊ�¬PÖª/îï4â+:õù¸ 3!ÖÅÇœœÊª«–P�Ôô[‹�_Äh2ÏS«‹{_è‹e/7³¥�kÍ+]-Ë¿Ìlïï?™Uþ}¥ÉÝ.¹YK—£ìÍ¿xJïŸ& ï_ÅÈ~uQ´þêŽûƾû=Dù±*yÛ›Sj‡ö#9Ò‡gIbçËxUGc²å«Çêíí× ”Ïê"È}”Ø›¿mnu:HU�>ªëMîâ‰6¥êxƒ¥ÕÙÇÎ[¯ßò²:_å&�z¢’ïÿu½¬ðùráÐ+sÕÙ†íüÑ·rEî“e¨ÿ¡f,ìo3"~ÈDµï‰ÌêX��Å‘'*ä›lÙ‹õ7Åñ¿½‹æ>¼ —>T';<¯T»´–eEÖ$æ¥?ŽÊÙÞq4Kñá¯ÁÒ»–d»—§s-;ª¥7m‰Ê-ñìÓŽ=ä~ºr7?Úò×?ÚÈöÿ±F^öa•òZ³«å�Ç�ª mÂ�7vìé� îÒkIzØìeÙV•$U·ú 7[�Ūç;•÷뼕�ê,ëoG‰[=”ןºŠ÷žºJ·šÝùë¶ìÍW[¥k�Äk�•·¹Iwê܈ϳ0-½Ü<þôd³Ü†fÇÿÏz³K]¦ŠûïìÄöÆHÕëÇ)ªwõ)âëæá]kŒÔÙœÀ>ékþè_­Ìý‹¥üÑŸ¶²Ú_íÙ—Ÿü„�M±ÊÏõ©¶¯ÏåHŸ[’ØÚ—îìõNwø­±<íÞ<6åÆ\EæÓ%ŠCŸ ðœx¥ÉÖâzÍnյǮª3µ6ÊMªÓõÖ'ê­¸óíñ¥J~ù5Ï_o³o7¹Hמí�.>·/¼°–ŸøÃP~îƒGâ/ý¹­T[ë'>}¬j©‹±z}?Ãáå‰Bçç‡ ·¿:�góîzŽøáI¬ÔV)V7x±7ÞYòŸ»ñ­O‚-;ïel{{-Û±ýh�kkYžGcaÞî§yYîÍŹŽÏ+³,>ÜJá>¾ —5üédvîo†¨ÿH;S‡ŠAã%/W²>èóûÞë÷!vÉ‚¯Œ3)ù´„»óq»å‹{)Öí·ÔVOïÄÛt\ÎÞÖq#[¨oñ•ÝÿÃÊèt×jóˆ+̶ùö4Ô·`XÖVS <2^:óÌÚºãF–sû±"�æ½{íÛÎZ4VÅ"®ñÇZâ�fSñ ¹O7î¶|v+Nu£v'¨ÅDy¬M„Ÿá_4‡:µWæ›Ë)x‘÷(>6hÓy2Óâãí4åç»)ÖoΩýž©©MV> Î<ù((sïð,×Ö’l%±[›×g2íÛ�æ(ß×%Kï[¶½ºžÅ5}ð6;ÛµEQùÇFYáë¹ð‹SØ}¿n²¼Ô°Ky±Ã^^ñ/ëäÉç˜eÔÏ‘]ù�S=¯�³í¸’·ýÅÅ|‹·õéB[S¨ôª1fkçƒLå«ú®ªÃYvç³…ù…¿™È.w*¸Ï�¸Ú粆߷s¯ŸcL¶½º˜%>©ö3=ó—�ÆåOšìÿ°ÌèÔßWÝê20kù›ƒs[EniMhNAmX^BCLAXCrá®Ö’BÛ×§s”¿Ö¦I¿·'ˆ¿?OØÖy.sgsI¾ÃóƒYVï.¤›?ùûv“ã[ËþÕX:óœÄù…Øs3ù”û �]¹ÊNsOµ)…Ãÿj“[T<“)‹Ûõù‚ÚŸÙ–(|Ú(]îlQ[ª¬® .¾±’íÿËYFÕ\yòÝÙfê‡så—>Ê•O«Ã¶¿¼\`÷úJ¾ª£:Q|Ùiñ±:cwsaaÄÓĢ𧉅Åõ!¹‘OK•mUÑì³ö]Vï¨CšRK¢c²Ó›B³+êƒÔ• éGj3ÈõfF×Äe%<ŒËL¨�ÉòlÌÉÞúæ\ÿæM8ûè½ w僕òr““òz“«òî“=Òå&{þd+Ën5?5Ç™ìòæ{íÜz0ß½u_±kë�"çÖ£ÅÊŽ'qlÕ/Žf�þU)kø»½¼îߌïu™^ëÚ`\öz±É¾OËÅÏwo}S•µ­óZ×öÆ�«zµƒ{ôÂ�àg{©¼Å„;ør‹xºA%<¨q·lºgß~É*® ÍŠ¬KÈQ}¾�l\Ý%˜¤=šn~ kµpêƒ(�}¿Uyêµµt·ÕÝòQU˜eÓýD«Uâ½f7Y凵òòwk¥Ê™t¾ÝFy·y·t‡Ääë¿Z+žF$ÔÆ—=Q—Z=¿¯n=w”þ«¾yaãRÙ�_7pߊBKs¨Gsq‰Óó£E–oï_x+Ûò]U†ô[cʶÎ3Y>-Y…Oƒssž†º¶í/V¾˜Âw< ±ï8‘Ö’XÞŸ›÷4X}¤Þ?�uþÈ8]ì§¾V”{¹*0ëÄ£@unux¦Ã‹ƒ™â§¶áEK¤êI}”p»ÝYzôÔK|Øä%Õ<ñÃÜPWE»ŽÏŠ«‰Ë«IÍ ®OÍ-ª ÏI¨‰/d_½ 6½ÙenÖÜå°�ø§¤Ç±ù¹÷#³÷ÞÏò–I쫨(µ6¦È�œ›âÃÇ Ã{]†Æ7» e­¸á½�›�—¦Ô'L|’tÐõùÑrÛWg²ù¦¡æñ®°§©'<®×ùfy�±·&8ãdƒ_Æý&¯´Ò¦€l»Î9Š?;CLÞtÙ›¾û?Îftí‘ÿñ9ÈòýÅä€úŒÜ„º˜œüGa™÷Ã3ýê2³Ý‹3ÝK²Z+Õª7w“­;/«•ošS”/›•­Ïã„ónSù7áÊŸ6Ö-Õ™î-ûK]Z+ ì^žÈÙúöjæ¶7—³…O/bäoþâͽí ¯O²ë8–eýî¼ÚôE—£iëG;öå_»ŽS¹!�,žÝŠ2¾Ñe`´ÿ÷ÅFñÇy 1(fTÜ2ß´æo¢âí«ÇWrS›Ãróž„fÙ¾>ª6ýK×.ÃW][ÞtIï»”ïºý÷]œáÇ.kÓߺÜMÿÞåÁÿ^ÁÿQ!ÿõ×@ö.iKfËT“Ó]÷þ¾Mªjõ±|RëÐv²0àIfIfMtaÅãÐ\ŸæÜReg]‚ÐØÌ?{á+>« Q¾mJvo*/ ªÏ(ô©Ë-8r',ëü½  ¯Æ<⳯äªÞפ[wÞɶ}}&gwkQiü³¸Òà†ôB§öý9Ü__G±Bg3ñ�5é¶�gsœÛ+óv·æææ4†æF>‹/>·Æ)^ÿâ§èøÝ×ìi—µÑý.#ƒS—mIÍi�|pÌæª®Õf¯þØ!þY—]ŸSVª&qO}ä~¨:²:!ù¥<öãp÷þC8ßøÆ‡»ñÙ†Äq;¾¹#Ðþʼnüð'I…'﫯?ôÏ8s7$ëø½ò·!êK÷‚Ô{„gÛ¼"1öÝýtÄ×¸ÚøÜKÕ·«üÓ*‰ÏzTç�ò±eOÒ'ò¸O|]ø³øÙß>mnë23ý£ËÃîÕѬ}M�9÷[ÐÓ?øë¼Ígþm±þ¹®åú9Ϧ¬2³g&éÍe&ŒœÈèéN"×0œÑaú1ý™>L_òH~Á cô´†3“†ê1s—š2?[¦i­ò¼ÒuþDZZº6šüÚµÃìÏ.o‹÷WSÄ·¯ã…æ�abKg¤Ôù"ÁþåÑœ¨úļü{‘™e·ÃՇ‰_̬¸‘u¡*P}ó¡ú¾ªÐLâ�ÕWî©oÞ J¿ó0 ½ôqhVfmd^këîÄ®×®©¿¶{ýùng‚SGIºÑ_»×ÝíZ¼6üæÐŸ$o�ùË×2S§è1³fOcÖ[¹inŽ8 «V1l½½�ÖäqzÌ fÓ›éÅh3=è?mr]Z䟣ùåçä™þäªû’Wõ$?iÑçú“ßëLgæ-™ñšëŽwÍÞÝS_KPç^‰ÏTߎUgߎÍÌ~•™{':kï�ˆÌ}·Ã3OÞ Í¼z;X}övpÆ…!'ÈÜ<^¬>}?(ó^µ_zL]B>ÿ[G¬ðKc¬üÏÏ!{Ú²sn´’ü|OjvKPö¦×]F?Y80ÓFM#v8„œ?έ9+Mz›~ä�3Õ`þýÀïÿó¡I¯¯ÄÐazi &_0=5�Ÿ†3#Ïbæ,ÞÆ¬‹¬×5û@âÆÇ®@â£l¤w­ Žm‡r+o…gÞ¹”^q/,³òAh&ñ1é××&åZ½¹˜ñ89¶yþn`ƉAêܪˆLÇöý™ÂŸm ü_›ã›“óê_z$§·eÿµËy]ÖÍ1 ÚÂèõN®¡7=ÿžä ñ½¹¦aÄâ†�ïð½Æ¹šÿ|hЫûçëÖ ÿ0v}Éû 'sqæÏN̪¸çÃ×éšaô¡k;ßñ&Rõ¢.ɺíJ†}ÛÁ,φÜ\¯§Y97n,Klc˜{7: ãxæFxÖõ;AtÜàK/ÜÎlª ÌîxìŸ!}ªŠ'ïg»¥£‹7y×ådþG—÷æ‡]–Ù2ƒÉýß>p�š_îþ×þrÏt{Mf&L0bælðd~©¸þu×&ÅçǾ�Š’ ®Çe¿ž}évpÖÅ[¡9ïå�~”}ívHöÝë¡Ù7n…d¦<ˆU‡Ô¦æ$WÇf'ÕDgUÔ’¼«&@}¤:(£¨:<Ëì·.� 7º–¬�<6lµ­�æÜ9K˜‘š© ö¡gñmN“Þ-j§øúŸ¯¡Û{’ß÷¢s¯{jÐïñ\oò¯ñª:ÌHf°ö$fôˆuÌ´™%Veš»6Èy`Õy>ñàý�Œ¤ª¸,§¶ŠLäîM¥YÀeÈ+ öÊŒ%_}2³íÛªñüÁ‡Á5³76x¥uc]¯Ô§!¹ÖïΨ ¾�V{¦ö;jäÿë½ïAÿ|­_ŸÃõj}ù]÷u÷¤w¦/¹C}É¿�töv{Ôn¤õåZûÐù§;h3c™#³Üá˜ö†#]³e�]^6m§RÝëöf«ïÅP;ti*Íl¸ZððNpö32†�÷ƒ Z< *hx�}ã^p6±Ï¬‹wB² îGf|ìRÎ_©d†ë ¥së¿ó ÿÛãëuþw®©Ï—1íIþõ¦×?�ü#1qÈ"füT3}Õf¡T¨ñSE×XÃ_ºlmšŽF]�Í:v-"ûÚÍÐÜ{·C ß-©® *ºr'$÷ì�àÌ’;ꀚŒL–¢_Ýe0sê‚ÿõut{C-zÎZÿ4¦_~×—ü¶ù7Xc$3\k,3PC—ŒÓPâ“F“?Žª=™Øc3@k"3¸Ï,f¤î&fÆÊ`fùö›Ú«owÍåßÞ$¸EMâbBfpMj¶ô©:Áâõ$§–r5ñ1™—ˆ¯,!a¾˜|ñ­wªüÕ­-žGHÎéÕš‘eøG—͆²—S~ÔW2#µüŒ ó_|%~þ/0OuˆWÂ5�è=™9`!óݰą̊¡?0#†/et‡,f†éÌc†õšË é7‡‚ïûÎgtû“×é®f&-ØÆ,µ¨ÔZw°kšqG—½mó±Dçú}©Àf'¯Fd�Ø÷ünØÞÖÛå/„”¾}¾ïÍã�ò÷uÁ{ß6–´ÖùTW"ïZSÓµd ÖÿÿøÕâú€S0^#´õ˜Á=F�Ÿ’QDä'ñSs4ñ%ã˜á=¦1C{Íb†ö™Í ë¿€9f3~Á~‚˜|±Æb¡TóÇ„ÎÁ†¿vY �7s¯Çežº•÷àVHîã;Á¹5wC jæ>¸”{÷npîÉÁ™·‰?½þ 0 Ïg=ŒP¯mïZ=cîêÿõµ|õ›ð}©gïõåûÞÔ�ôùòý 2Ž#´'0ß‘q=t3Fw3jÌÏÌèÉë™±M˜QÍ™Q“L˜£×3ÃÇofÆLå˜Ù©Ì�m:«îuÍ•^^ L¿š”IqËÝ˜Ì w‚Õ›eåT…« ÎÌFîqü6Á/‹=|�ùônPæÝû�™äÕ[~ïÚºÌ1YsâÂå$¶ú_üdoêzÐï»}`÷ìKÑÈ@f¸æHfTßįÁs™Ñ#f&ÏV2SØÁLXdKŽÌè"3z‚‚9EÎŒgÌ ±žùî»MôwsͲ™�OuÖ¿ìÚhô®Ëƺùd”kMibÁåøÌGWÂóo†TÝ- 1>÷æýõËG�9jýsÞ7øæ~xê_Øð(°˜Tÿï]ʉ‹MÿWc†óH1ÚÀ/è±;æaîuÿN‡üv0£Ûs3ºßdfTÿ̈!sˆožÎèžMæß2fÔ�̈¡+˜aC¦×6fš%3f¢ÄL˜ëÌL×�em;©µ,ùõàUgº¦­©êZbô©ËÎîÙ�X`Ð+×ÂsŸÜÉi$ãô¤Ú?³½:0sîÅÓ€²öúÀ’öF¿â{Õ�$—ˆM[û´ë§É37ÿ¯m³ûZ:~ˆgC4G1C´H†DæÕP2ç†i�#Ï�c�1HC{Md†÷ŸE®m£;j ±ÏÕÄ&�˜ïX2c—¸2ã×0“�â™é|>3]QÄÌ·¾¤¹"å/ÃWVwÍgßVyî¹Sœ~7==înbÆC‚½êɵ�{˜u�ĸꪀ¬öꀜ×5¹íµþ¹·îeïz’Ÿ±þ^×�£~÷?·¯ó þ‘j˜ÖfDÏñäš¾#ö8Œ<¯C"ö€îßiŽaFô™Fü!»~s‰ßüØ{ϰª®uï{R•ª"vQ{/(vA¤—µXköUè Ò‘ÞAº(Í RlØ5–¨‰5ÆÞ5ÅĨÙi»dïsÖ3þƒdŸý\ç¹Î{¾¼ßœ¹VP\mÎq�»Œ9îßß™1x3z,Ç8Í�e&,ËbÆy®eÆ»3£—g39Ì(�\f’ª™™¼Ëxaõ‹~®g “o «äW*\scg]长Æ�N¯k»ûqù·—Ë»¯\)Þ‚šaã­ê–´'Û[®’:áÑ­<º©ùáb¥ëQÃøaÃfþ¯c¹)͵�#’èeJb™•#ñýNÌÓ±ÄÏ�&9ˆÚæ@òŸ½ñ`r~c˜¡VNÌ@«1Ä7’Gÿ)Ì`{âÿ�|Ç題ãŒ(fÌì8fÜÒ"f\`33Æ·–™uÄØ¥â�Õ²#†±î� ®$Ž×}y¾<ñ^ׯ†Ku›�œ/ÛtûÒÚ-�ȹ}~¥¨éÜçùÍ_ÝÍnøóƒÜíožåî¼u/¿­ýóÒæ ß¾MŸ®Éúÿ³Þø¿þþ‡/éÍ…-ÈhY‘¹fOÆp}Ø›Œb†ô›IÇjˆƒ;±A?f8±ÃQst̨Y"ñ)�̈q¾Ì�ánÌ�1žÌ�Y!ÌèEdÎÕ1sb�™Ì«l³¨Ç0lùm÷ÛåÏÿˆ‹zÒ³®úZMÓöO*·ß¹íÉ¥‰�n}v·`Ç7÷óÛ_?Ìßùãüöoïu|}»kI›|žNŽ þWãfòoþ±×Ø’s!Ù‡õdÆq”3ÆÑ‡œ‡+3l´;ñË™ÁC‰ÿêB|&™gd®�¶„1|ã0Ä•9VÁ8L˜±sb˜Ik™l3sÕ)ã9%·úÎnxf¹èŒaÔ’®ß†¯¸j˜ãõÊ `|–üòtEù妦�6lúâJy÷µ«E[Ï^.Ù¢¾ùk˜âcƒoÐ R_\ý5LúòEIÐ׆xÏÏ Ë\«® b3ö<¯ÞØfA³CxIKše!Bg�qÜo3‚Äãñ³£˜)žYÌx—pfüd3vôRÆ�øËvÓÉ1o.3rø’S*˜1ÓfÌ, 3Á-…™XÇÌZçU™ÌiøÚzÁ‡†áno ËÝ¿2¬|gˆR¼6ÄJß}_ýìpcüý[#¾9Ñÿd_K祪–öËëZžöìýîÆæâÍ�·nåÔ;»aû�²ÍÞßøÙþÉÿã¹™Ó󱡱¹?3„ú+šó[ÑŸÈAà/íÍH2’ÌÇ!Œ�ŽŒ½ítfØ?Æi9É�“Ï›.mø~ÐÒ†ÑË?2LB>¹üŒaâ’�ÿ¶hÓë� ê_ XX|Ëza晾K×1Àí”aòÊ· ?R”6$Ê?]«ýþÃ�)O¶oB=‡š¹æÔ®W‹·||½ ùæçyMO?ËßüövQûýÏ [¹Ÿžæ»}6>þýc›¿ÇrØ'2ã!}F0#Ì`ÆNõc¦{%3“ølfbT#3-ÿ”éôêOÍç¬ÿÌbnÙ§}gfž5�YpÁl^Å-Ëy5ϬçU?²žWp½ïü¬+}•ݶYqÆ0}ÅÃ’å‡ N®ž vßo˜èõÀàå÷ÈÀú¿4hüŸdõ;CfƽmÍÈYp^ûHî\t§q›BP2>+ð4tŸÊüÉŸXEÙ‘áËå #§‰Kÿ»4¦c¿>hɇ‡º2ƒG{0C&)™‰+’™\3�«dfj˜¹±L\6Ü·]ÒcpX~�ŒÏüw áÿ×>0?f¯ÉLM ã¬ßl´0þ€ÙÒ⛶˪ŸtÛöóÈ•g sH~âí÷Cˆê·wéÒO×Jý¾5ÈÞµŸ;øo~:IYmüJùóoS5ÿ²Š?ò�@¶ûŸnÒþÿ Òœþ5T:÷c¨|òµNæ^Œö“ç)ØïxÍ䪭5±7ùŸãÖC0ÓìúŽ!¹þf”£Š35„qr‰c&xf3ÓUåÌ4ï4fÆÒfª3ÏLœæÁLšäÉL›/3ó¹Z£©gú,̹f¹¢ë?ÆzÞ5¸û>4¼6„r?ýZõå¡FÍ�×+Õ¿ü’Åþø[®ßsƒä½÷¯Ó|w¾šæwÐàpÓ T|nT· ¡ìã·‰Ò“ùÒW÷ÖF¼þhkø«‹[4?|Y+ŸY×fº°éú€å2LñüÍ RÞ­Ñüù\1÷×Û¹Aÿùóöï÷²UÿxšøwÃjÏ_ ¯ *¿_ :ÿŸ âŸ_•¼2„x×}2Ò/¾ÙÂ+jƒ¹ÿUƒ¯ú–!"pÿ?(‹ UŸ6 _¿)Ž}y°5úë£-©OºvÆ~y´-PÀˆ±fbãùÙÚý�xñÜk­²ëÏó<ÓÚ¬ÆM^Lë´ÿ×aKÆmÔfÂt5És«—øKf Öi»¨Ã0„ØÞï ¼ÿ_ þ¿"}5hW<5,r»e˜ëñ­Á#àï†UÙš7í¿UÔÜr»dSñ½ ÍšwK°†âKlÏó¢ÁÅë´ÁÙû–ÁSñÔªzeHfßþ#Oû˽ ÒO_Uœ6¸Ç»Í]Àøzz0è£Ä>F®ë‰«Ðti¶&w×HmBã¹è”“°ïï~ò©·ÁüÞ½„ÒÃcÔ¹{‡øEÕõ™6GÉŒ°÷ßÖ‚þË6MHžEr¬~“˜qódÆ9¸ÝxɆ—áÿVþHçK˜òWC¼ò/†¤À?"ý_ðÀÀÞ2pþŸ”� áì[CnÐ7†8Å-ƒxÞà­Üôrº²ì˜ƒ¢ó[gõí¿G ßW¬þÁ�¥ziˆõßÿ�ùÊ꓎ªæñ=?z ¾“ÔÛ>ŸÍ5œŸÆµ]˜/¿¤9u]«»u-/ôÑ'µòÙoB¥öw+ŦÛ.bÝŸfЧžŠ¡O/Öê¾½U§¸ig/æÿŸçeIüb?“‘Lÿ¾Œ�íRGÏcÆLñcfd3.q‡M]ª¾°^rø?F¹ß1,&óIá}ѰԻüüïøNKÿâCü/<ŧ_äÆ~up»þÝ'Å·OJÙï_ç^5(ë7Q$®2U¬I3W•Ûúo9åäÍà+¿zR.=yž¯¬<6ÊG¥aòL•þ¹Œ;ð››´Á– Ë5›.��£Ñ^z/]x.]{§ýìfFо·ËØ¿xp{¿vçwÿà!Ÿý*Œ¿òS˜ßyƒëÊ5û¬ÆL\Fëì?ìH̘6“eJë�Ü .ô[yÇàê÷ƒAô£!Åÿ�!˜øk­’Ä]þ§_Jø_Þ•úßà“Ó3`�«3ál&0)Õ,èÄkoÍ“ëEÉÏ÷vf=mÙñúÔþ‡·k· ²ïžføU_vøÐસd ìüz޲éÜ凿yó})r|Äý›—±m :8ÅÄ/ˆe8}œ å$�¿_Üá l¼X<ðK þò“ ýÕûêŽw‹ÙÄ*« ¬V;ÿ”ÍÖKR˜1ÜiŒ6¡ëéF¿Û¥Ó߄ĵ¡s™‰.,³@_käºåÛánç ÓÜ–ùþÕ gû*�ÿÇËRéo�Ö‡¾½ÐŒ{Ò›çeƒï3øO‰ä.ýM+^{— }ð¤TwóY‘tê­–ËiìçæÇø,ZȈj‘ÁþwÕö›Îʳÿé¥Ü~}¦*s½-ú ÙmWæpûÞx Ç¿W³ÛîÍc [‡Jå;Gi×wM�Zn. ÞûPÐÿéóì�›×Êõç$È'¿ÔÊû_¨¸½ß¬äZ>Ÿ§®94Ö/u³5î·Ù›Úеƒ?0–ƒûOfFMqg¦ù%1K’÷Yù�aªÏw�Ô—«°FçûÖ ù¿2ÈÊû†�€#ÿ\äY`æãÂx»«™ U#q!Æa±¹Öák;&È[?_*Õžžè¯b\Æ g�Á,ÁcòpÆs… õ\qÖ\z¸Z8÷µ¤ÞúÉl>µ¦Ý¾ÿ{º':¶ÀBÏ2KVÞùµ‡ÜñÊSl¼0Gè|å®=ôTï¾JÓ\{šÂíùÛJ®ñÒtõñŸ}ù«ï"…G¯Óß"}£½};_ýá_TêãñUú«[{b›_cÇ5ì™À}¢ {4Ïtôêš‹øœî¡lx�¹:<ÝŒ�I1£}/û^)BÎ~‘|åawþ­¨ÚòÙ,Uí™ñŠ®wóÛ¾Ÿå[|jð m‘ñ,W=3�ÄæáS—3cÝBç°F#·�÷‡x3L÷ºlXæu…ù6G¾õu†pö‰MÝ:`årF© eh�FõG“¸š³“|Õ:fÁø©Ì²)s™ÀnLˆ6Ü$"½Ð.*µp`XrQ}|ûŸcŸ¯|æQwêK·ÿG/Õ¾WËØÊ.®f¿“pøköÕ²ñTm{9—mýÁ…?øþª­·gó9íC¸„< !·y�ºóñbáà[nÿ[OUûíyªÆË“]ßÎWž2x*�Vîÿm¡ÿÁÿ˜ïÀàìù‰a‘×C ï_ Z¯w†ßGÿë¿À‹¿ IqÁàç¿ñœc@b‘y`x’IPX¢‰¯�³pÊhf…‹ ã«døˆ s1¥È Mèˆ@_D–j !æwŽàȵå«w�¡<�ê® º‚š!bb‰µ˜µuÛñ`1·óùR¡b·£PÔ:L(Þ2Œ%¾Pwዸ°ÏÏWðç¿Ñ²•GǪsëíøòã´gŸGèî|Q‚}�úë×s…£oÔêŽg …Šƒc…´&;¶öãIÊ«÷î§äE>ç K<óÏðHÚgé•q²Ÿgê>kŸ†yª ™ØË§ºc,Þ;ØÛ/˜ñp çäÁ¸/\άX¸˜a“r-Ä/åý�•|÷SW6¹ÈR©Ö3èIWñ2£OÌ·A/š¸û¡Oð¡ZÚ‡[Úé»ëérÌ9®öÀx>u�-—½ÑNØpr úOt��Ñ{ í¢Ð}t+Zsê‰Nwòa˜´ç�¯°ýåR¶ýË%b×;ìùÔ\�ª:ò7OU×ËE\ýÙ)lÓ‡SÕ'ñºú.àÉ©¾4„~m%ãàsÄ07`ã£qþá%fË—+/¥Ž Ôeš¨Ò7÷÷ðÓ0K]Ü?oãåêøNsf¼–®ìÕ¢‘�=½·%+�@F­à�>Ü$4%×6¤¤s\hYÏdôéJG¢ÇQêyézìÎ*Íñ¯´êžÝÙ‚­ƒù²Ý£Øî\ÙM7fs[ªk­ÙÝÿpÕ]y–*{-Ð^—œCÐÏÌ­;8–+Ù1œ_Û1’­>æ¤ìxè¬<ö›{Ð�Ÿ—µÞœ¥Øõv~`ÏÏ O’\öšAtûŸº kÿýOü}±¢|÷0EÑ–�Ê]¿,äO½áƒZ^ÌUæmÈæìÄf4 PÊ‘F®ó2.ã'1KgÍgüɼãc û¢— ,=]Fõ@°Ø¹¦ó3ùý¯|4Ü×È'ÈÒ±g‚|ø‰ZØ÷½×tzºP¼}„”Ý4H*è!äm'þvû0®ª{4æ¡êÀwC4ºŸÈ�þQ¥:ð‹»zïËÕ=?­N'H×^$ËW^Ä©üº‚M]o+¤•ÛrÅ»FªÚ¹ç¿ÓëžÝ­Œùæô雇k• ŠÀ� �[¾ŸPxjÈŠÀÆWH6ÌlïtÒ८;7!P›l¬ Ï5cC2M•üjc·EndþÍd–“|„O_ߟÝû�æM lf¸ÅbX’©>½Ö^»á£¹r×mo¾ó¦+Ûuw™¸ë¹7ú#wuêýߺó•û…­CŲîÑèõB¼´n—ø<á:ŸŸð¸g{ò“=ía7®”hö|(Ö~HY}t´¢ñúDEÖž�>úLcO.ÁÈO›k¢àÓ�ý•Flú;Õš[·å�ÌØ>™A¤nši7Šq_¼’q_´„ ðSP±‚ 1ât±&T'¹ª¿&2ÎŒ'ç ý}B…-¸[º”µ¶rr¾5z†¥½÷üu§n‡k�>×s�—g°¹íƒ¹MŸÎVí}ãÊ— ­.¥6Θ#¶ª9õ2L{칎ßýg\G®éÊL¡¤Ë�Ï®(Vív wúM�âÔ_<‚ŽýìtüוAûZ¦®92VUvÈA�·}›Xa…qñƒþ˜Rà7ŸØú`¾úÔ.­ÆvÏU‹¾Rõªs?’‡ù*t «É0Š»Fò­�‰ÛŸ¹‚› žå {ʳßx¢·KØ~{1·û‰·÷™;úÅyâS„âö‘bfý@>sÃ>g“=»™Äù}o]Õí÷xãÊžx£ä.½Ò ¿Òñ_‡HW¾ŒæN½Q«ŽüæÉŸ{£Qüë .¾Ü*@ 5R†$› ‹ß÷£�îÜÃÕÁ_|ºVÿÙÍáÂk�òäzª?4*ê>祎f¦ ÇLµM~Žd<ýEF“c®^�cžlÊEfš«õi¦®+<˜eÄ.›¿ˆê±q©5¶BR‘•*4ʱBN̰ԦWÚQͨ˜l )<ÑTŽÏ°+Aîy¬Ô}¬Ž}ÄU´Žä³êìÔÝ »_y�k(dÖ�óë‡ÝÝug¯G…_;·6æîM!ço¦ »ßx¡M*92VØtßE¨;1Y¬ìtä/Î6�Lò„ɪžŸ\U[nÌ ÊÝl§Z»g¸²ö‚“:µe€»©œ3Kæ»3n‹¼™U„ú,UqΦ3N–öÌ8›�Ì´þ#™¥$ÿ@~\¼sŒ¦þøLôäéÖ�ž.µÜY\±²’hªbeFÔÇšR!´0RËûkJšFH›OÏ:>]ÆvÜ^Lrééuëgõ±}¤£ßñêÝÏ—BGAHYߺ |ã¹Üއ‹¹ö‡‹Å]¯½é\ßpt’Pµk ·õæ<ñð‹ áƒ,ÆV¸ôu¨øÉ‹HþÌ+�ÄÄE\é>u\©…‚�5öòOW£ç>¦¸/ŸRߟÏïnUØG!Äß‘`̯i@la”PJ>™�¾¡ç­ŸX}l"WhÁ¥”Y Å�$ž%ùà–ÁBö¦^¹áäT®ýÖb¡ãÙ áà×~⡯ü¾o=(oûÈ«@áƒoÕèÓ`;ž.a›ÏOWíãŠ> Ô²Øó-|üF¯Þõn©ªùÓ骮ŸãûóYåýØÄ| ¡æøDvï[7n÷»àfrµG'pÕŒg7]Ÿ¥êúv‘òà¯ËÕ-v^�¡Ì܉³˜éöc—q3™Å³æ0+W®d|ü™•Þ$¶‘üØ7Hb|ÆÛSÁxû*ex¢ ›Õdö ü z´ÁZëOäÃ�9ñ=\¤1Õ�Ûzy¾Ôùt%ßõÌ Ìn.©ØJ¨Ù7N<ð4Pwø¶¶+Vïu’ŠZ†ƒ‰%|ÀjN=ÔÉ'Ÿk…Ãß)¸½?xpû~òBOßzo!®¡¼¶a_³ÛI½ãº³päu�|îe„úðß¼Tu'±u7§);_»u~¿H]qp´2"ßL)'û²FʰLS.©ÞVµ:Ï|álfæ¨ Ìây+¯åþÄoªhD‚ ¯­:0I×~ÝS³íÖ2è®�C^¡ŠÕ3A �¡z˜EMÃÐë~×ô‘’80J(Ø4D(ms`ÛŸ.æ½óãöÿàÉ7|4]Ìi"�xñbF­íÉ+hNó›æ?ͦ\Áš““¹ÍçgñMçfûÇðÕGÆ©w½Œ;ö] pì[%·ë'w®ê¸x*}ЉBXe¬ É6åb«­‚ Û ÿœTj¦ž:$Û œ=ðùUkûŠ;GˆÕ''q[̇}�ùKòŠQBJm?>¹Ú–�/²äâòú‚)–vbw<^H{�>œÎîü|!z+Iü Ö�º!Ÿ|¬Ó_¸�(_~¸Š?ö]»í³¹"‰ýìÆ'£7ýkÂå/ÃUûvS´Q§6õgKºGª÷þâªîy³ù±Íê}?­ Œ�N1Ú†BaL9--7çª:¸ð…]ÃB²LW,ñc–L[Ȭ\ìMìRŪyF­ 7f#Im™´ÖšOʵTE§˜Bƒ’2^"2Ìø¬f{©æì40}ÀuÕg4 ÖFgõ ŽÎ¶ÐHƺè, ýÚ®±bëÍÅ`=��ÁlÂWïËu=^&tÜw÷=÷EŸ«T{`x‚|×7ÍÁûjáèS•zßk7Õ¡Wðg¾4WŸ$hÎ?]%|¥Pï{ì*Víu‹š‡r ǧ°‡ßùÐÞå3ßjÙcÿ uÇý9ꌦ\F³×ùfÛýýr~óugvýññ|aÛ0u剱læ¶�nn�ŒË gÆs©?Oh}©Õä'‰=j}¤1e~”N!.£˜©Ô.‰ß›ŽMö~éÅuÝ\*g”õ—’r­ä²m|ó¹™býÙü&òy=?x¨÷|³\*n!ä4ØKåGÆAkƒÏm´s· Aœ‹¶ £L�Rf’\¼t÷h±pÛ0Ê’ÌnÄ'æZð‰¥V”·³þÃIôgzý.:¯Xóx úðÁ¨R¯Ê5GŸ4x{ÒúS“åÚ�fðI¥ÖA\„Q :˜�=s %VRaûÌõþÜÕ‡ßxq{¾]Áí}ëÁv<[*U™¶;8B÷Kw0ÖÀâ·õ2¬¹ž¯½¤½/ÄcÏYñÌ �ðásI½ç�›°ñéàÎ!n°Ûþ4—;ú}wøÏ>ìæs¸‚ÎaXWc³¶ äk‰Ïì|¶9·ýÞBô�ƒçv¤ZKæZX¼ —S?kl×Ë¥ü¦ks¹èÒ¾¾^2©ƒ<?™‘R×÷—ªºÇ‚M)•v�&×r°”Ùl�k¬ŽËï«N3U…'˜@³ƒß~{´zÀÒÔöL‘>š¶xŸ”q]Ü5ìQÊÒ&±BÝzu®ºëÉ2 [ÎÌ[>YÀ·Ý\,ïºç«ëy –ºoy »îxû¾óæ�|(�ý2X¾{/WÿüF�þÁ§e追r!K:õXŸ+lJ殳pðµ?zqùC¿ù© z†yxñÌ2—å _c-t|³BÜû�øb\qçp¶úä86}«rQÏÐl fÀ·¡ÜÈŠ}¨cd~9¹¶?ÕzÈÙ4Lyè*A±Nêz´|ø¾\!,šü¾¢?˜èü�ï}Õ{^»�mÆm{è‚ñ‹šB©+“+m…â�#„gI}!_!äm,eo´ò6æŠI}”¾q€�^o'¤5 �J¬ùäržÄ`èâB7„ê€jŒÅ¬F{ô·rÝoܸàxH%;GQ­¢ ¤Îi¹î}1èãA—ÚL` ‰éeýÀp}é/Ÿ~¢Õ¤“=P£F3k'”!Tsp’X¹Ó¬'~Ó¥9`Ï@„'u¿ÿ­·ÿ�—ºóùbÌ0Ì$èϤYK%Û�·p»¿])–v‚în©eP“AH¬Þ36 †—P`¨ÒÁ'ƒùήÎ0gc ûòk÷�"sÛUª:>1PÎx,óbüƒd† O7“KwŒG !¡Ø Xà I•6ê¨t3/?‰ cŒÈµp{LW>4Å,‘ò³÷8Q– ~VõL�«»Ç˵G§RVÊú£¹ÍfSM‘]_{i>àÂ?ø$&êôùÔÐãŸEJÝ�}(�‚Œµtâ© ½ú(I÷òóªÐ—WÐ+V‰öÈ=}ùÐc`7}4ƒ%5»ã3u×wKÙÚ�'ªV—÷uwS2K¦.`|HM¦�›ÉeÖþÐ#Ö%+ÃRMýáÄo†3bx–9ØS-—}ƒ[¯¬¤ì´ØR+°¢ [†¾˜Õ`ϯN­ûà }؉Ïb¥Æ3³À¥S‰k¹4W8öV%ÿI­ÜýÓ"¡ü˜öB-É)›>š%¦7 ÒF!×+9!΢®V‡%˜‚íÏ­©²#�KÛÐ_�PH|f‰•O|]Æz;¼Éì–¡lt†Y@‰�¬Ä€“L5Öˆ=AÇ k�XB$õjœ¶Ž„Ž�”QÒOΩ.#Î :¨`qËÕ'‚WGb˜[/#k÷X°î [D™Qéuöà‚õÁv=Z}ª =Õæ‹s‘wIÇŸÓqàSÖZ³!1&\H\¯n#Ë$V²;n/3¶Ú+4ñÆA"ñ�B¤‘•Ý1D,hƧW÷SÇS iuD<½Ð< YmL9%�ˆÈQ•2Ç%›A¿ˆÔ)ƒå¢ÆaÐÄB<‡+Ÿg�u2¥kLr#6"×\H« DçöQK±”S$�•_Ð4DªÞ=ŽÔíËÁMw=ð:¾p•šNϦ̻�L‡f'´û´î³a_N‹<ÿQVð¡Ûzʆl¾4s”m¹ìŒX.ü,L¾ö<}z¨áÁqBB‰/[m"d4‘ø¸s¤�R×kU|î¶Á¨üÙp#×%þ̉ �åŒ*"ÓL­K2ñ!µ«»·’äÒ$‡ÔÄPým%j&7øÓà—‚ýχ§š©ùhc>l�™œµÁ^¨9<>Ü&~ó�yºCdÝ�g‚\÷Á4Ê.,Û>š?ðµŸ|æE0î/RÐQƒ'_ub<�;Ð'ËmÊ­J5óWªè΢¯pªè\s/¿HuÊH æ5�˜^h mN>2Î\LªWIì L(…Zf„°XS9…ØXzY1…Ì¥ÂÖÐ#»H³ñØtÊe&9´–dFyUNÎÔÖ™.4«Ä˜DspêÄ–OÊu‡¦‚oØ«oXh­M©ê½nèkðm7‰]wÜ‘›�Ju³‹¶ŽSsô±FöîjÍ‘‡"ßz}æ0´ 8r-¡› fª�Ýd/ÄWX±ifÐÊ�Ò›¨Æ&l óR)…q«³Ì©–PY‡£°¦ÂVBòâïÀþH­GcyFÃ@°Þµ%=NTo¦´e$tŸ¨¦+ΟÔ-`¥C«KMbô¶„5ëú ™M©†Aq»ƒ¶òð$Ê“Â:gó©™r×mOížûJÍÎ{žâ¦ss`—2yàž9â¹°íÊqççn¨5{_r]O–Kù­ä:5ÙCS†m{¼�Û÷£'˜êög ùªž1ráöøn>+=É|!¶ÜŠ[]l¤I0梲̹8\‹ 3…DjwÆe£ÑNXwhœ�^7œx°T©ŽpFµ�6¿Ú} g®Ô0à>Q}6ð©ˆÅ~Ä<°…¤Ž»î`1Sß”’oͶßZDù?ç_‡ gþ¬á¶¿\Í1!©Æ–Ì c?R{ñ l�ï~îÎ6_œ?éåÅ2ÞÞ zWt 26ØCwŠê8A“Yj Þq§eÔr˜1XÞ”�˜g-%eZp¡if”)Oü¡´ýê]Û¥rý‡3a×BTªø`âÖk ÅöËÁý’ 6 ¦¹Ö¶« øŽÏ–@‡AWÜ8B[¶s tt5Ǧ�uÈ·^]¨ÝwOÅïýÆKXSiˆřR�óŠc5{¦BwPÜûÚWèyíGc}÷S7Êbª80NŒ©°c -92ÿTd<À•–êÎNç·?^"7Þt+:j3¬¥�M$îùÊ‹jž#æ·  ;FÐ|}ÃÇ3¤Ï]厗^ºŽ§þºŽ‡þÂÎ/–A Q“Ug/•vŽË=ìgßX(îv 9ÇúSSÄÍ7æËí_­”»^úêºî)Bºï¨4»îú�ŸHæò MIë(]QÃpMãÉ9bÇ�rÛMwb›.4'#¹�P±{ ‰u“)O/¡Úš˜|ûã¥âÞ7~RÏë¬[`�Ö„jÚ�q éù\Ôtßñ%~u‘Ðýp¥tð�RÜxj*Ÿ^j†¿˜Zj ­cü ­�›cíA*Ýåæ3â 8cBÙþ1bN×p6*Ç{$fô—�ïüÎMÜr!±!GÔ~rnûÊ®ë~èÎî¼³5/4³°.F×áÊ÷Ž�ÍëÚx‚õ&v>[!nÿb´äUy}¡ë­aç­ål÷ƒ¥à„bM„ú_\çÊNBÛ³eº��|„ίV’×»ƒû Ï©"…¯1üǚ“¶þäl¡ó¶›vï]eðÞ{‚¦ýŽßúÙBh¶J�ǧƒu'•t¢ºW•LÖtã'÷|¥výÙƒë|¹Lª8:ž®Wö8Q¾Ýþ ýÉ/"µ< æë¯Ì ÷1RúsIUÖ¨uƒH Ýu…´ÊD)mÓ@™¼?åHB3†Ø�JŒ6ö÷VSÞ1´UÀ/ÔÕžœ¥/ß=AJ« IZß_“×2Ll»¿\Ûq×[lüÔY›[?„²�_Á»^³ÖgÒïÚYÜV’—y©Ôž~A™jkw:ü¡�…<Š×®!þ0ÞDJS´uÎWWÐ>J—Ù8 T}ÁVð`k©æ‰·àâS-¼ìŠrÓ§.Ú÷=ƒ·ßõÕ´Üt¥ZÞɶúÜÍÃuëO΀ÆWp*462-¨6ù^º¬^·Xß3Y:ü@©¹t;FáF"XÜ>n¾L ?ßËâîºé©ÛóE�f÷ý®óÚbÊâFMÙñt9©¡ç€9ˆzD»¦Ø– #¹É©ö"©3xoÀ¦×•u�C¬/PXw|¿ÞZža†ºú%š’ýc4ÅÆP�ËÊ‘+€YDóˆ�ǧà¶ÔR‚1tù`ÿÚ÷<ômO|´Õ§¦!ÿe¥H£ >ÔH@Ü€æ´H\OÒºGNÝhÆ%¹ÞæÐ5Ô¶‘ëµã‰Ÿ¶úì pÔq qŒ“cŒÅÐd3mji?ÊàÜrnž®ý¾OpÇí@0wÁy†Þ×MüÙæÎT!¿}ØÁ|Û‹¥|ã§³…Š„ IMul’¸þødn÷cWÝÙ›QáçϧëÎÝ\¥:øÎ�o8?CØxu¦˜ÓF},4çpŸN\Ûî€u=è#€í±ëÅJèžøxø2^įª$’‡†ý¡7§K*±¢Í©nVríh¥`ý�jÄäY`ÞiS‹ûÉu$‚± .7ÕÎ"þ«ó®—¦ç¾ >qïW¾lÉc �µªÔRžn mYVŠ3aÅXcð¸u‰e¶º˜b+hœP¦lX†¹D™¶ÅÖ”©¼nï8|nh@dTô‡7tfô;@c…j'UØRÝÂÒ=ã‚Ók…$ÚBSE³®kÜ,nMõž \Ï /ý™ëÑ!7.H'^°ß•J¦W§iÛPèQ÷úé6üÀ®g^òþ'ÊàÝ�ÔRçW"‰ÑT;‹Älª3”×2ÚY¬.‚jgiÿM;‹Ýÿƒ;êCÜß ôçh®Ô«�UNµ¨¶Mj¡ ´)¨6<åÒv�ÿ¶÷‡v–vû£•òÎg+©“9®ã�Yb[КÇk´ÐjÈÙ0ù´¦¤c4¾“]h!Eæõ�¾¼®õþJ¹ã…'tøh¼>ÎX-FQýh†Wï›C9ˆuû§JÍçœ5íw=ÀÕ•º^x�ñ(´=YNbåÎs�ÿw~Ä¿¸óÝßxêN> ¿z±H»ç¡B¬;<™®Bç¡lÏh>½ÑŽ®+Ö�œ&l¹4káªÈ4S°Že’—#®ëº*0æØo…œ“êCšˆÚ(cµ6‚æz”ͽ*ÙºHT¯zЩæšxb7™ìÁ>×ìy@µ³ÊɵýC;«ÚY$¿K*¶Ñ®Ý:ÌX].‰{¿kg‰qåV*’¬d^Š0u䳂ÃL¤ðx3°–E=±ÍÕ°×Z;ª�Gâ]I­èÇŬ6…>˜Þ”{½åÂ<Êâ†Î‰Óx'Vö‡^]p^ÃpíºžIró•XÜë{&BÿJ»çž92îe y$gJ(³’czYÜT¨õö"Ê™…æ38×øÞŽN³ûѨ~o|ŽEï:p6ÕøÐÇYC;J›˜gÕ«�Õä î{è‡õA)ÚYzF©€žIFètá¾ô‡´ñ™–¿kg …vå•þ¡�™×WŸ¿s”¦á¼³¾dÿ-‰g”ÿz­%ÕíÊmN5s×ÛCÇRW¼É,}]ñ…d\51¥VÔ¾.ÌÇëI<ì×ûúâÞ×çw:€Y û‰­fVЭëžÜ~Ó7tÇÝ@Z7uÝýwžÿƒ;à©ê¿sç­w^{/^hÓ ¡©Íß1RSÜ=š�Î4Çš»:§�”¶Á1ºY�\˜‘‚1b¡£VzÀIn¼µy®œÛ1ñÚ~|D޹Z1R©4 ±SªÃº¦¬ÕbÏ( -Úæ ËhèÕkÜ_w|ŠÐõd%t‰°¾¨&y´e s®ðcoª�¥–´F¬ð/í¬1X#BLTê™@‰/QƈOºÈ쾺è\ ]L–…&2­�•Ý>ZÜTŸº°y¸¶x›ü§˜˜m�xOõ.ȵ•¶^t�ÆåÓ§­·CÞª%¹>ñS´›Îºh6™®©9<…j¶•·ŽvßõÄÞ¬•‚Å-¥o°È{BßLj»ë†œk€š˜"Km\¡ö�Pm¬²®1Xo¡Ú¿…]BÚº~\x¢)Õr"1“ÆÈ?´³vÞ]!wÝóÆZÊÚYˆ·š´ú�°g9·ÖzeÐ΂^2j³ÿÒÎ*éÕÎÒ“z?$ÎñEŸ¾a�‘n޹ †¿vM�r ø\]ɶQTÏ,gÓ0}~ý0â‡"vÈáÙ}¨öy}pÆÆÁx=xëÿþzÔñÚò�cÁܦš}È56]^¨k¿ì\y`Š&¯n0¸ÏÐ{¦Z°UG&»¿÷”÷~§GÚ±ÐÆ£¯'±kBËGΚu»'ôê®§˜B+úXÄ=¯Nfr¤q€ZÃ(¥(#ÔŽXÏTkhbKÄgˆ Wf#—”+m‚”¡L€¿ÀøªAm¢Ë­¬/Û1:è¨Ë©¶)âNåáIX; Z°•‡Æƒa�=¨Y¹ƒßùHMçBoÚY�Ø+)C;‹$F€v±qø'ª�åC>�< ý®K«¨M/é—eSj�F9"É\ŒH4Ó$�ø í.â“åêîqÐ@„†];‡®ÙöÛˤí7–BßU“ÙBpŒ '’ÚRKòvä¼ÐŽ/Úá¾7ô7�“@ L—QIægóh+ÐדºCŽ&¯YmÂñFÐ¥BÎ@uðúÚ“Séš$/éåï§%×R_dEõÉbÒú@ó[“·m¿ù“¹âþW~ìÎ'‹¡È…D›`9O¨Õh�ŸÖ— 7ñ÷Ñ0*žÔä‘ù}ðœ@%ǨõaÆrN�=ÖP¿á}±†Ýi.‚ä?ù[‡IuL�^´¹ý—Ô2rVÕüÃ~+n×S7y÷3ª�Fz\–…ú_ÚY™¿kg¥Yè©vÖ¡š†sÎÚÔÊþj6ÔßzÛ¸WªËmªÝp`ZpYǸàÔªoMëñÜÍC)�½õÚ"ªW@âti(ËzT›¼y¨œSOr¯ýãÅÖëKä�·=„¶ëËø–Kó¡O×°?‡Ö2;q^RÓGsÀ’ǾGmõ‰iÐ%Õî¾(oúh^pFù@1<ÎT¿:×’Ôk#¥m7– “H-Û«/Ù«�%Pí¬ûËä]_ûizža2ꪅ‘TlÍGôQEgšq1%}ÿÐÎÂú4¨¾RUÇxmÝáéÚµõ#h|_Ûê(ÕœªiúØYW}l´+5IÖØ+†9Žu]q»£¸ùôœ^}Ž��©nLÅvG<±C=®º“³tëŽNÑÖƒ/Öàõa1¦Ð߂νÔrÎElàŠõ5zÏZ‚Å Ä÷nªMm°§Îqk©Ö½~m›£\Ýé„ûj—#�8\S±¢ÓQŒÍµP‹‘Ælp„1b'ÍÁôÏ®³÷ó™ U˜‘žc®‹¯´E}«Ë­ Íødiãѩڮ”ƒŒ{«òûÂçK)•¶ˆ…œ.ÑD©3Rbω=È¥Çtm£hŒ$q�êìbÍ“ÔmØŸ†õÒ^ý’½NBý°õ]Ps ÍgfA‡@—½y(Õ+lu@Ü ®h¥þA[{b¦†ÔªÐÀÁúf¯¦p�]¯‰¡ÈSÏ:Cû yÕD�É%à�kbß ´€a_è±€f0®74ê�‡ˆ›NÎ’7_]ˆ\÷U ]èüˆ�§gRÛ„¶L�Eäí·\aŸR×+oܯÓvÝ÷ Ý{G–ˆÿ„.�"ú‰QÆTºlçhyMe?ÜÓǘ‰ù–¸/%4}<›ßvc>´³tû ì®®ÐÎ7šŒž©|ßX©°s$XÖ]s>?™jgA+ëY5Ä>+»È9‘ó…vVi¯v–¼ùÃybËåˆt½•Ä|]a‹Í5‰ß‡f òaaë9g¹�œweǹ¼s Õš/ß;^Û|vž´õÒªk‹{.©ô…¤>€†_uÏ$©ý¦›Üqǃ︹”ßAÞkÃɩгƒÎôž´ëOÏÐeo&DÅ›ÉMÅš†öà=y]Ûè~êÊmÿd>Õw"5­5ÖŸ˜&·^_&o¹ºy’BÊðútS)4Ók>Úäµ¶ÐAÕÆfYê2ÖÛK;?wîüBIµdr#àI=¤$õ:Kl[Ð1Ð0º1ôh°®As0ªsšg©+h í.Ô|rQ»47äò=cÑcB×™JzœDØ+Ö/ ,åä"käaT†Ø’¦öÈTÜÏ ï kmĈLšï#ÓT›(n½¾k"šò®±ÐüFü‰�ƒ¶®+êQêK¶Ž„f5ísi¼:�êe×R T]VÍ ªÁLÆy¨ÜHâ6©Ñ�ïSäEåŽ"¹ö´6‚n69Ob§¿kºÛH�OÚ†öØ#­îØm½Øyg…œ`ʪd÷¯¨FMQÓpªñ�7äañ¥Öt=áß´³Äæ siݶ¶e¤Üpz6òq¶íîBÔïlT¶9Kr|1³u0´Ò4•¿kq’º�ÌãÑÒÚYeíc m$aNm;O5Öµ¥»�zß·sì�ւС®Ý7Qj8>]l¹èBll¡Ô|�æ,tͪ¶g2ÞƒjÃU»'Ÿ‡\€ú6èN‘9*Ö‘Z¾óîrÍá»<ø+?®ýæ"ì±Ã=wmÍétßdVQ?ùð=uèék«£N�M ?òi”~Ïí ¡û‹¤rÃw†/Ò´9�±$ç@®}U×xìu“¢ ûj*O 5sËÅEšì¦Ájýjc�äÔTÃzm·#t·Db?°qVŒ1fÙ`’ªµJÏQÙ}�㼄­š‡u ROöQs:#ªåI>KSÕå}+ì_¢šDµggð[>›ÍhÊÑ>RËb-JŒŽ3ƒÖ®§fÇ3ź¦b-1ZŒ)°àtɦÐQÆ=tMÅ‘‰T…Þë…&ÕöÑÐYÃÚ6zÉä† Î¸gE5±† »¨<=E[v`¯¢ {X&RÝ œ7ÉiŒ ó^¬;4I$ù9©[æ"ŸPIÄ?‘YÊj„=b|�¥& :–äýá¿ò·GœÔ@Ë>1ß ë—rÓÇó yDõƒ µm¸Ü­CQgÓûÈd|¡A½¼†£Ó‘�PÝjh¶—ïr"5 ÕçÀ½sørªÅÓvc´‹ðZï¡V%v‹|ûÓeüŽ»‹áó45$—€®bíÆcÓùÎ'nÚ}wÕЉÁ½zªõ•^mG÷ž`­{€ªM’*H^ }cüþ ºË�w—²mŸ-à7]œCïéd’ØÛ!s¬W߸u½ˆõìÎÛ<¬7Gn…}\Û§4w’+÷Žã³ÌXÝÔЭBÎM81·žÄ™MCd’ÊØoU½o¼ví¦ô^Ù¦S³ÅöˤM—\pŸ^Ï7WH«�¸U$–•íräZ?uÁûÓû5ùÄŠÚF`ŽIåÝŽ|ý¡I\ûõE\ËÕùÜÖ+ÎèEãò, �)ÆgYhªv�§úpØC²vßXy5‰¡ñk­´Y[†@«P-m’�Jµ»ˆ=<6Ij.kÜ{ƒ�Þ”&)ÛJ\Si«É¨(—tÕ6’®ó‘š‰Öäu¸FЗVø©˜ 5Ç �Fm‚z×yî·JÄf¥„l jÛИ&×LSÒ> {yä„A^$5Ð\¡ùãÙGä„BëÇóå ä=ÈyR=1è‡Bë+9NòÍŠL ž¼ x²ãbÇIn>³g“��ì8� ™è“ãó-)}‚üԬζÐ$�NÒ8$)J%ÁóÑ}´*³¯µÆ\ŸPf«K!ŸŸ¶Þ4!)ߊR"³ÍÕè&æõFœ&Ü$"P„ˆd3t¢cXŠL1%[ÅI g"¥l€N>&Íœ�N¡ôз¤Ø< tJ‚žªfCŒÔr˜‘ˆNüXrþ‰Ù–Ú¼ C´Õû'ëŠ:G£ 9Hc$„§™�ª@ϽrÏx:lW‘÷AG(®gʺ”^TÐæ )Ù3F*h.¤UØŠ©ÈïJY öBtQß ]‚ ˆ­RR¡5¥eäoFw€SZMùzMÐ5P´u8º˜°sžîT¥�|kÂK!Æ #*uÑÆ hƒÀ¬Š2RªB�ü”Z´%5º¤8Jr ð×0P2ðftŽª5ñ&,9>œ\SòwP0=Vú3è,ÑUˆ)·äb*-Ù°L3P» —*BV¿ÚÔKß@5ƒÎiq͆AáÉ&¾2³ÂKÁ ³54Ë\N¨ë'¥n Æ—Y³b¢1Ô‚ô©&>äy>î ò†�R„ï‘:8ÝTÐ%™ Q™æÚÕEVºøBkMZEÿà‚ØÜhMnÃ`ì4gÉù’ï`¬É¬·×æï¡+îpÅ@—Qk2#%YeUÛÃ~¤¸ >&Ã\›Ó:œ\ß) ¶ŽÔnº¸PÓpÖYWP7 Ï‘ˆíH ™è& T’’6Ú!ßK#h ›În¦OγѥdZé2×ÛƒV@i kÖÚ‚!„®1y>8ÆDO0£DÈØBK1¥À�”úü-#Ñá+§–Øj¢ò-(¨hót[i3ëìå¸|KaÕs¹h±}>:ÁTŒL6íA“Il#½bºåuÕ‡¦jêŽÏÐel,ÇX‰‰ù–°stð�D„.Ú¡—Õ<˜v8Ä•ZÃ6µE£)ñjó' ä–›KÐÁ(ôR"„äkµŽŒ±ÚuœJì�·å]cAQ Jn y–´Ë$»ÌNWÜ6ZJ«ì/­ÎèK»HÐñJÆ�vâEÅ™Iy;GHñ%VJ9ÒØÓÕ—øHOF%�ù¦K7UÉI&¬KÆ2Õ”#•¼Ú8 PfýÄ^õ}‚ ¥ÅDf�9n¤äô H«ø~ µŠ}Ðy#ÄWXƒ¾‡÷QrFAB´%(“s@·²”Þ4PŠ^k¡Ö¥˜à3@¤@÷±&¶Ø D:>«Ñ¥×ÛU Ò$”ŽÄج¾šÕeV¬6ÉD­%~48ÑT³z­•6³~�.¥ÆNŸg¥�Ͳ@ª>»n°Ž.‡lst¸Jyi—hè’'ãcIU1È8P2Of�½6µÚ]‡”¢—Þ<ˆŽSÞ¦¡rÝ™™èrD6ºP5Y亂>A|/:Et&é6žž£[w`²–RvMÐ塾Țú@â?{;v‰O&>]2°+Ú‘JÆJŒÍsØŒ.£tºViç1ºJJv�EWíLM«@í�øe]zÍ@mjåMJ‘ üÞ‹±0æ¹u´k”vx¯Û=^WÖ3sM[¾kèV½�}{�hgXYçhmáö‘ ìè×îq¢Ÿ¢Ar¡µ\Ô:]f´Ó¹¢k¬Ý|è)h&ç4 ¢ä_�»ã ,©b ¥ ow@—šœß0D“¶¶æ7ˆ®ð« ~á»òz2–°GtêŸû™BŒŽ7C—ˆ°+_Oãë¯b@obEb‹Þ<à¯gX™¼žø$><ÅŒÕEÃÿPâ@tfØ|3ºÚ„�Œ7E׳Ÿ‚e‚Äc!2Ç\ˆ)´ÑŸ ²C)9…;ðÞ ‡£ÛTLF×_‘µ¦�Ø:Õ`‹U»Æ�ʬ«Ø7^—×î€N{òYC0—ÐÝ$'•Û‚O»ÝAÝ]SnKczÖ¦!˜+B¹ö‰9–èÒ£>•øZ¸Ð$2~«(¾Ž~oŒy :Äq=@>W‹z#¨+ˆ1$.¬.°YVN5•²ÍAT �'~‘ÓÆ#A×"ˆ 0�6 ò4×ÑûMª°¦€üMCÅŒêèzæH.ÀEfš •Ö NIëŽMÔTŸD‰oá©fñ¥´+”ÌÉ`äu /Â~Ó¶Fçº 41Ò˜RˆŸC’Íx]d/‘›œ â2:¸i×~\&͵ñ…V´C”žwÓ`šÂGf’X^@r¢m#©=ƒ Cþc?HŸ›±i0r!ÐD¨�ÊÞ:Œvÿ‘ø�ÜcHé)ù$�ËjLiLieýµéÕ)ùˆØ|�¿)ÄfЋ9”¿yí¾y*«ÒNW²sŒ¶¤Ý�»´ƒ‘ÌWÌK&ѱ‡yòІ’¶�Â÷¤„�©‰‚tG»‹·ÑEØÆ¿ºS«�L1ô)qýñI bƒú�Dü„ϤݔèB,ît@‡)íœ$¶j¨á ­ôÒ̈/'ׂØ×@ø~Ð_Å”Rª†QÑãú :!‘[ÀïÉIkmÐYHm …Ølz­¥%âw©%6Üêü¾B8ñ} Õ¢›~-™cÄÓ.{ÐÂKm@¿ã‰ÿb×ôÁµÁ¾„\Óú/H|Õ€€›iÑÛýI¾Cݹ™tn‘¾‘Î7òoðÈmäš33„mŸ-ë?šI©Âµ§¦ÐÎÅÄ*[)§u¨´îÃ)bëÃ¥RÃug)¾ÎV¡‚ŸŽ5Ñd7Öl86]n89]áôÚ•íƒÎ{ä(åÊ“ñ$¿L#ãšFâ™�ÚÜ­Ãõ%»ÇÁWÁïˆ!«L@?¢ùR%æjˆ�ƒmjAtÍ\7ÄCÚuIÆyí>%ã ]‚vR£cׄÌJL!¹�œPd…ÎSJA€�Âx¥T÷ǵÔÀçQÒx¥-æ‘”ù{ŒEÞ�ÎPØ ¨ˆ /;ý£#ß…v-“R"ñ_ ãEc>bfµê,P (9rã‰i bÓnUb£Ú¬zê+é#£ÆNÊ­5 øQÐN(åýщP1×¶�¤dŽ”2[z~Éýh|.ë ² üˆ¯èb梒i�¥)i-m85 �Çb ¿è‚¾|?mЕ ¥PAµeûœ¤¤j[øTðð´Û¼×¶iˆ¿IjØ-(ÛBL‘…ªQfð•ˆ2™ÿÔ>+º�‚Ä(#‰å -ùIjü9HŠ7V‘ú‹Õö*~P¨U§¦€ÊK;[«ŽM‚bhp´‹9ƒäÇôÏʕNjuN­ZÌß6Š^P ³šìÅÂÃñàóÛ‡A Ds¨ ¨I0ÐÚÅäJ¨u¨ô‰ÆÈIéƒ'5™žøï¨œ>È@ÙѤÖ¤v@b⣖ÔÔ_‚Þ—Ph%çl°§‡ögn´þŽÉ¶ 1‘Œ/·ãÞ"Pôùú³Ó@x‡}RPÖႼ”7äV¤&_CâV?Ø'òD:þP¢ 1 9?ò�[´d@�£q–ęĸašs[¦ê$ù�ƒi7É[h"9¥`Æ‘º!6Ç’æ"$vJ¿ÿžU@I"ó6 ?D»… æ æü³\Þ1†’ªÈ¿ÑïV±k,(@4çëŽLDü} 󟃹:9"±5ç@ÊŽH3Ã<£ò™ ò³¤fŽ3AÍ(’xÇCQ]õÔ‡¶C-Ë'ÓZ�vŸ“ù‰ë§Éª²£ $ÆJ1¤æ 1Iˆ%ó 2Ëœ'ñŠZ°OiMm¨Fà:£k]É’Z…1ÂZòB|7!u{œ±JŠ&uÈjc�í ðC× �Ÿaœ‰ÏBL&¹°…¦úøÌ/ÄfÐ_¥”õý(™”ø~ä‡Bh¬)•dÊF$›Òx°¦º“eÚ-†*R—÷ýÒL±6!$”Zñ!i¦JÔëš…aŒz õ®œdz#¥Å’:]ŠÉë šU¦˜Ô¸¥dŒ�§Uì5®íñ:¿àÇ 6åvÞ]"îýÞ—ÝÿWuÛ— AÁ¤¤~Ø`vó 62Å4HÒA½MØtÙYª¿2GJ«³ã"R̰†"怜\` ¿Iëá‚F¬¡�ZzëHõ$'HʳÖ&fZ"ÿÔæT D=µ�Í1§h­@jm’#™ƒdâ´.ƒä– eÕA Š$”T™Ù4ˆúZ³ NBsØ=ñÙ½$¾½ã¤úS3eJa.ëG©ðG��Å]ßxKû_ñ»ŸS"(¥º$UôC~M ²kJl Î@¯=±=Ø5ò.øNÄk¨R ¶âÈóá+±.”\e˯ÊéCóäi�vPv yA~›¥L“”ê£ñ<’WCÕ€’XSËû Å–˜k°MêcÉ\ТÞÇO|<ýŒ;’e†úв½ó'Ý  I³R”±[d ¿-Ÿ‚õÐþhÎHü‡ ‚Y[“¹ÔT>aU~_ŽÔÕA¤¦Qªƒ™ 9܈%ÉïáûÄUÄv#sÍA�D½Ê;§I1•ô>>*Ûó� YcJçñ±X·„ï$õž)�4ΗÙ@-ëÈ‘Qw�X= 9õU P4_œG G { f$5.è Â�âÑ7jîð_üù¦[ÎPÔÀ¹(ü7(Á¤^ï£M&ùH+ÈûA—&þ±œúPP]@¿¥õz…(µTE úÀ$ZÿnwЖì�<k†Úœ ƒuÙ�½DÅü†a4_®êrâÛ¿XJU�2ÖÀz&%?T´ŒÑTï™(lútßýÂ�ßõÕ ªìØr}�Tqh†rl…5b-Ôm¸˜¼>P$B¾*l½î"5|â,åmŠüPˆÉí ⸰íó…|Ç“e”¦ u­‚öb~[oްîôqËÍ…ÒŽ‡®rû}wyÇn •ôÒ I\)n‰º”R{@«D\‚úIi·#Í�ÉC³þäTiùâækó}Yk°‹?¶·^'v…9E8HÝOéñ«3ú"ßРæ$õ¨gtn»Ç:Ö¤¤*[™Ô- ’cÝy/FügxŽ9j:М@’Òšhn-'Õö‡_F¾ƒ5aÛa“ ¸ËÉuý¡z®Ã�¥˜ 9e]MDA_Ø&ÈŽÈCukÊéZ(ÍXÛ¥ë�y�CµÕGzI¨ãI—^Ú¹¥–¤–ô£ß²¶QÜök.ÜÁ|ù#ïÙ=ß» y ƒ`Jm¬1ÖeAãF‡kEéí˜çÄOÐü„¨âM#éš>Ö�Ö˜LדèúÏæá �b]”ek}iXK!ù©×A ÂÚ¸.�ÄTä�9[†ö’†HþJü$­¡ª@ü;<J;È÷)Ýõzb¡•tÇÒÝN”LFiD�cAj9ôb1§Þ^Ê"õKƺX_3ÊûƒþX{ ¸*·mm| v7¶ØÝŠ- Ò±`­õÖ*@»“�.•îî1QÁ•éî�{‡ûœóþçxÙûÜóÝ{ÿ÷;÷÷ûà÷n`-6¾ó�sŽñSÉãØç]Â8Ç5Qö�8²B•Š®ÙCÆÖìe‚ó·s�VNÃúp� ¶ó›%ò°”. £×9 º¶A}àpÞ/×Ãó†–lÆ7íæº‰�°K<3ø: |ü$ÆMÃÿ«³=‡¥,fpûÏ `-°!€� Óç<&‰­"†øúe÷É\ŒÛ\ðÐEZtýÁ Êïåz‘{ÖjѕЙ´ùÕQð>§(�ïMf1Ô=?Éå°™ÐÅVxÔiNËCg ¶·#bûE|Äj 䄤7’þäëׯA¼†‹b[Ƹ¥-áb„ÀÝŽ\]¸amŠ Ž÷§üb#u§]Oü¸AF¦õhB·Û¿Ô s»Ñ”)Æ f†§]ð� ~Kz- :Ò(?‡Ü”¯C®{tTû鿺¯r]8!VÏË1šë¬ùg×½‰bKÌë0þ{Ëu°âë€cÁ½qÝ"ç‹n¤/ÃÜyÇ›mñü uŸšÆÅ€ó�­ñ¼»8½È+k-ØD2¢p;í÷víØÖ´ódóú¨å(®c£Kâ"À'̑ˣŒ�b“aJ (C»?\A�õž> b×âÓ˜{;f,Ùg(‚Ÿæ¸$öéÐÁ ”Î(_Ì+±Ï†®iBÉ9yP‡)Idå~qL�¨„Æ;JÐÕœÛר¯Ñ�Øw…¿S¢Cr¹.¾µŠP€9P¡¦|ÚÏOnßó_Ì#ÃÏø:§*qïùSVc¹šØÞŠüŸl;Ç*Jãb¼º*…Nì\¼‰‚Þl¡½Ÿ­EDPtæxæJÐ¥T€¨˜º}˜¯ocÎøNââûâ3ÿäëŒß£õ nñ7Àé°W ñuØ/vã 3=—_ÃóëÄØ!i±Ä>lÇ×M1_E<·\ÜÙ-m)Ǘᵋ6E·Vr�� ÎÄ©A¤/ÅW¨‹Ók E÷›:µS[ó~'§q ?óC‹›cœ#>+OJÎËu=ÅÜÛ0Ø›pÐÝø:`*à�à¸îHЩ âOÂëAäýt�ØãÎ*‰cè<1Ç×}8¾Ý^á9¾1DàÀóÀ†b; ˆTè›­ \±uˆSr\ ãRŽ«C7=ˆ58FΣAíÛB2¦|¨Ê‘qÍÊ“ ©A`Lû”‹Ùž´GÈsjâQƒ5tÆ>e��¹2�@”é¹?Õ Ü&ˆ/a;lí§jâ³Vã`ïpJ#ö‰ “&`×†Ô ÄQ5ª¢Ø&5tJ›ãÿ’çTè8ݯÀ®‚²‰9¶÷c.æÊu�»™±œˆ©ÚC¤õ…^P„–&‚gærg¹Ì)FQzÖy"¬MÀ6\wÂÐ÷ÛéØre:òÃn®%Œ:X=ÝÂpJ�±Š\ϸÚ’´z#x6TèÛ­Üút¿»r4ÌÍû+¸.kÞ¯×1éŠä×ñF�%ŽÉ�}•8&*Â<‚O‚¸uüÚhè&K˜ZŽ€ÜÂ�B‡ÿL.ßíýtwo¸ˆq8¶]lÛÁ.r]×ðúãÔ!n�îðš/èBË©A܈Uü§„¨AxuæÿöÅ:Šã Á`. ØÜÈ@Æa ð3°Á7И{BgTXkœ�¼ì=�ËÓ·?nÅí'.†n1�q»³”ñ|¼zÈ~áºèf´öž ]Í ÀqhÌ�p_¹Îƒ™k`Ïr¶l'øÀ˜—Ë0¶áºòã÷€Ÿs¿Ï壿C·TÆçõ.qÊnàyNQáÜ�ɲ“x==‚ãmœDÐ|:½^�óWA BŠ %ˆ[S�Ï9]¿­ÇN¥¥?Õ fƒŒMö—„ùµÑC-_m•ºÜY!ÆØ…±„)æDótN[Ì)±xe¬2*ºd7�½ÔJàw¡ó1ãñd5^µ£†:]Ç·x—cÜ�ñ:äÌÀFI]ñþÆ6b³\:P@6µàrn þ!JnÐ&>ªÒ˜Ûr�c1‚Ž�`S@ j% NœŸ>ss€ï1¾:‚'0¦£NAÌSÔ°ÉcÖ£@êxïRxσj#Ä“ fp¨7‚2p"ˆ1à×GBW_à@\Žâ—SÑ‘{ÄžÏ×sÊø™QQ%»‰äfU"ªl§ ±i/à4ˆ]b¼m ©Í©A1W�ÿTƒPÛ¹+ž鉹õ ÿ§êqIóË\lrç°69^ �0�^1,1ð{lo Ž]ò€‡@çYéÍôÐ1•Ë•ŸŠuI¯'/ç:U_õ›1Ôaøòhà=ê@ÿŸÁë¯Ké·‰\ü |«Ï#N…‹ÛŸª­`ÀN�’ öõwæϯzM%�µ!œZħÿPƒˆ¯R'VkSÖá ©Aeå¹5qHkï€ïA æ@bÿ¯jÎCjØÇqjxÝÈ,0:b5š>|~$_pˆ[Ü‘SÀûâïþu¹»”[wgÜ'‚•T"¾K…ŠïP¥Þnââý—Ü&‘)�`Ÿ2—&@þ ö¯„³C� œ2 ö­ô‰Ë£¡†85¨°�Êt'«U¸îçÐ͸yTŽgÈCz†óþaÀs ?|¸yÎs"ØEPÕÒ¤Ð�]ºhÿ^-ê©k¯ð™ Ø q3ÈaÁß Ìu•þŠ}&Ä A±ŽS߀X ðrPì5ì3“ƒßÎ �*á¹p=“[Ô„÷ú´ñžÚjØ ÁÓ†NàÆÃàP õEàÿÐ}šSƒÐ¡�ž.‰˜£×FË@uÛk.>yôêh˜o.¯avz÷ÕüìxVâ“Øÿ€‚í™kãÈ#—9;Äa‹ÀgÛÄo÷pv0'Ä:A�+ðÅf:ô�àLè�s ¶� }¶y¨Ó¨ï,.�ê¥yT®3c`ö&&µ^:ðƒÝ†ŠÌÛòñKʼnZÒÔ�$¥�G%whQ•;85¼O÷;ˉÈ\N ‚Š(ÙÉ©A`þ õºÆÈ@|F‘@!âPœ"¶kÔ"PYáÔ ‡Ô $ÿªqö/5ˆK#)“cò¤ø¸‡w!'Œý<Qº› +ÜÉ`ÜÉÅ <î¬;ÂqN«‰ëýt|û&¥[‡LP…¸´Øéö‘Mô\*­C”Ö8Î ]¯�/A}¾8•Ìó.“¹ºË€ÀË!~\ø/¨wþƒšÄüêh陓@­ rŸÐY– *ÞÆØ¦Ì#N¹�ƒîäE¿É°>ù’cršê<¤ª¦‰´5��9ÎåCwRqÕÊÐi:—C K@‚òй‘Ÿðy²j¾`�RG/�d0—†±KâK5éÀ¼mì۸ػ¥÷t.ÿµöб5Q‘ˆ«ÚË$µksj~YkaÍÿTƒ°øS ââh)§qo=tÓ—\¼1bk¼ŸH¨=ÁXSj>W µP€�\±6>!EôÁ“Ã%Wüfp]è¡æÂ%y)Ø*X¯œ‚Χa9;E�¹ÛeñŠ0ŸÕ°)·ØÅÐÍXþ|#}§™'JiÒ…ùU)ÎÖF–*KÓËù¢¸ŠLhŽØ:½Nº/Cì’«�N¦«€ÿ†œÝ_j4§Q»O”Ü¥#Nkå‘éýšDJ£ s=m)äxÈ£¶£„G-FÇ�Çü¥AE5î‘`^vJ Ê >÷ÖK�üçqþû2‘ßݵ¢€—[%÷×p8ðö\m¶÷0WTtáQL…_ªFÅ—©ÀüBì™ ÌÛ ¹1([»Þ[ND×ï&ò7Ò׳–S>/×r6ÊóÑ*P›¤=n/LÇasÈCÞ¥çÔ¥Lxé&ºR8e:xäë�÷pû°<Ôíá5! }½CW£E§·éJV›Jï6‹(ïk(Ëhê’ÿTâ¼çDÈAÌÎ7¢M†áu „Æ8ï—Å`×DxC, òE<ÁïqŠ*Jݯ—¹¦,ãðÌ�)P¯ â˜25‘_rv 0úg®T5A)æ‡ÏÛF=ÛjË0.1¨9’¹„/’^O\&õÊÚ5C˜&n>{‡8ÐåS¸»Mèàã\ ºã^t�Äåx,nL…88ÄV¤‘Uêâð¢½Cœûo+¨ïx°Zê–´ böœ²$—‡öœ 1Pod|2VÑ·kôE¯«Éž—žõF]M=ê¿\-[BÉir��(¥Z‡ˆÍÝÁ©7‚Zvp¡tŇ.Õ\>”¥0F€øÿ�‚ælVþ3!/J„cnŠq¸äNI¤´©‚(�Ó.‰ ‡òIóÉ ¾“A%�vµšSƒ°ôžÆñ(¯Ô•ó’8G-äÔ \†Ô Ä¡O•@ñ�ë–�±¿ôæŽñŠœòæ©\7aü>W©Ê$Ô¨sü$¾Ir& ØŠvdàÿ¡h7v‰�êP÷cÀ§†º†su1 ÅP×ÿ>tE�(W'4jRþù›à9ÀÚárB ª¹TàèKˆ9’ø^ iúüíéÓªCüŒUØ ”oÎzÚ"VºÞ×¾Äå�/xOæl±}Ì|è¢N%´¨Áz×ÁxP瀧,ÊcÿŽý¼ä´Í8øP=qiØwéy/®®Xì8�ë„ ¹#¨-ƒšìEÐEÙ#{�Ô!yä„ÿr l�£„ü žK¨›ø”ó$çœ'q±þ£¶cÄ—‚0�¾½Tì÷| Ø?NeÔÈm@- óW¯,®K3¬]ÆÒƒ‹«CÜD]¯Êô"Ûè¹ÀI õ>ÆWýLÎ9L’X{Îäºßÿ©ÞsK¤5�=)9l’W`I?lBžJ_GˆÀ7q| b; Þèýh5(ÒR‰mê °IÅ5(3AyJâ›™«Ä®iK85]Èù[*@ŒŽ>ã2�ËÁþ‹‰ù+—r‰YÊåÀ'„‘%ÛAQŽ<å<–8y}^#óh×Ë@ šS•wŽÆ\%l�è/5ðP�çwözøl©kú2À~ÅW9N랺œŽ.V–ÄTjˆc+PIµÿT´£þR´Ëh2ú¯Švuª hu˜Üƒø^‹\gxïÛ«8Õ'ìÿ¡îÔ‡8…$×;K F”™kÁ Üú÷~¹^d7ÖØàftr³&ãy{§Þèrg1(E“!ÓI›Àk�ZÊ*d†àð¥�3a_8JœÔ¨+ÂXbO„èˆÔÃîãÔ±Ÿ%3P5†x&scˆÇÚ¼4T«ÆÅÀAõÓ÷É:.N�í¨¡Šl‡j>€§fÇ<ƒ«Ñ…ZF¯¬u 6ÀÕA¾ò(¯Œ€<ä÷ 71 ¨U�8Ç)ruå Ü98P sÇ8êªÏ4êÔÅQ\� ö‡Àk¸å`C€3Âe9Tß V+u ž/ñ¸½ê{iPoÌ k5©J”O…ÉíÊ\�ÂiçñPc5*\Ü1ªbÄL û"ªd;uóî2Ê2dÔD )áŸ9¥¦œ­œj��¿tÍçþ6(é@|Æ#sþf𳉋›€zÔ™›!ŽÌ)Lz>^ JàR÷;«¹š>¨‡ÚEØ;7î/#“ºˆRûôE®�Wpõ5 œ¸ìFú2Ì6�‚ ×)l0æx/nüÂí È£§Þm¦WÓ€ñ `]P¿±‹ž yOÈùÑG¬8¿sL�¼:š«mµ�›9Zà>äEP=�I�»>T»�'�º(qci‡4E‘oÑVÀ"›Äyœo>ã4�ËÇKOÊs8ì´õ8 ö‡\'x®^™‹÷rÿðVˆ¥Þ¸·‚ãÞYk8ÕG¨Çój­°Ÿ~*:x}H|²7‰=³ÖÁÜBÎrõœjÄ1! ñB¨ñ…8¿sêb..9Sl{¹\>İàÿÃ8ƒ¹z} gGA rͰFýžlä” žy.—„%œ2Økÿç[Å�7�Š'F.x:ý£‘ؤ ê�¢Ë>Sé3¶ãàž1ŽÙ Н"ði—ý§sc…ñ`nkì ĶIlO‰øJeˆ«pc²Ç÷Êï¾xý¾ÞÊ)`û<^‹_[œ êÃ@™†Jn9@¤µ¨A,”vIYÈ8')B�Äzˆè²�"ï7›¸¸4ÞP¯|›Ã¹^wWB®˜Sf�þ°l¬m8ïõ"øo¬ݸËÕËB~ò¼Ó€z*$+•Þ­-Œ©Ù)ºè=…4;ÆÕJBLr×°ßE7¬_‹™Ë©²XÍ‚XÞ˸<�Mwn„Ëý_ ˜Î©8cû&q¿µŠóýÿˆšÇ½ÂysÜ•»¸õcc¡âhBããC5õfg†ClI`|FbÆÄiÛ±ÄË‘   %ŒCü|Ú?w3V¶ö(�a^/'À6p1Ôærês�/»æ;T� .…ñËÙ4ô BfƒOåîj�¼^¬§‚Ë·ƒj,Çç±m…u u¢ÆÎqK8^ ø?0'ßÌ^9Å¡x@ÊRPÃ’xd¯c‚ò•8Ì 8Ì2P�»¸:¹Çk8qaì/9»à»Ö 㟳T¸¸ø%^÷ø¹®ePPÔ5P£‚žoær(ð¼½’–q1AÈ AÞbÆ®ñ 9ü„ý_¶� ½�Ë[�q›*g�çû>Üñ4: g ¨©rjôùJœr_PÖF°Ëd$¶Óœ¯Ã>ðföÙwVq˜&@)ÈãÁ*Î÷§vh “•éë©‹àw!~(ŒmÞ9)Ê/ð"ªj§(µÅ€JíÖ"cöpëÞ÷ ¨½)‘1å»±ÏR; yTÌ�·BÌ[ìzk)Øð9÷Gk˜€'¸((Lßn0$£ËwQ7Ss*«:~zçï@½%±s?™Ð­B”lƒçöjXé€÷[¨«!Óië˜YŒÛí%TBÛ~qr“>(£sñF8×rž€‡!^à”¢y@ú¨óXÃ�Å»¤…PCÆ©þ€:Ô$ƒ öÉÂ8âåFs8ÝQdœï.¦½²V¡øßÌj1“¸0…´‰�E9f,$‚K··?kQwû ·¿© ³~�o¿“¹ŸRÙý uë³.‘öù™: ÎÜïH^4‘¾­;'y×xš~Ú!¡“»5™ð»�¯Ç.“�²q ®v?3P{Äût…ÈçåF&¾QMv«Ž4M/L,'LJùâˆBeN™ø’ït™m4÷Œ�W’1Õ{ >#ö}½ê2ÈØê= úÃqNŒí™´�ztz�.�اNǵ퇼 \ TÄÙ¹Äfe Ô@šöá¥\\šñ}¶ì'™Ú®¶…ŽmV…GPÈ�u&q¿·š‹¥rõ¢™«ÀŽÁWÆíÎ2*àÅ*´X‰Hþ¸ŸLlÚO¥6i‰Ó›x¢Ô=Px$âê÷Â=Büî�ˆ®ÜëÖ5™Ð®µ#Ô­ú^3T¢é‡ Abï>aTë."ý‡ý²ÛX\øñSÐqJò²ùý¸•ÝÃþ]if�1ó I(~Єÿ¿VBœÕhÂ<î¤Iÿ’M¤ÿ‡�DxÃ~úe*»“‘¾¬9!Í®6,#ͨ!¨ÔmaZ«*p%PA‚Z:´p§$ºâ€èq«ˆyÐ-¤#*w )Œ¦-§ãZö ƒßo$ÏÝœ¼›ŠkV6~TyÈ8³ú0•üMƒò+Ø ¸b�Wë9õµè:e.§uóÙZðÇ\¼ó°åHàƒL@¡øP‡„–ì»?_õ/²Ä:Cqb·6Ä èë�–cþ4‹rH›O9ÝZH¸f/6Œ¬ÛdøˆU¾ü)$ß|—¿™RyßÍ…Å;((gͨ֯×DÝoÐ-Ÿm©ŠžsL~ßIxv²òR'IE�­èu¯9õ|@L½ì—H^ן”½¨=eü°ÚL–\×FU©Kcë´èø¦Øöì†y%ý^¬¥c[U$)ÍF&)u¤8¶MCìùb=pE§èÅRßÙ&ܦ;§.Bî8‡SjOÈÓ�¤ï´óè»ýFLVÃdµˆ˜—íÅ/ꎈrÚÌÅ·ÛI2m@ƒŒ©ß-LîTaî´ó™‡m4�ç�x8À#2¿Ðw?‘™FLf;E=ì0O[ÄâGÍivÍ!“œ¢ â'•&tR»†0¾v‘Ô¥Š/Xs´ß»�°.a�Q)�¢äVÈ׊ÒÛamÈnÕ�²»":¹FƒLhRÛÇ$bûÛ¤ 9 "ñ£2‘Ú³_�1x€ºÕ§MÝíÒ' è‘÷>é“>ñègý2æe/¶Ý ùú“”yÛsTœÝyP|�1³�e×Ë$Oš2OZ$ÔÃN>Ę�¿é ³¾Ï¿PLî§#‚¿›¯¿‰D¥­—$¥•×LÞ~¸lòâÃiif¥Œ¾Õ¬O§õhý1�¹[Áp~ã#2ç“T”Õ-eú5l Þ.2abÛÔøOÉ™]ê“� 5Î+°�½*?+~Øm,Êê•I¥é­¤ôV=%JlÖ§u0©Ý:ŒÇ³5 fÅÜ|¸‚ .RâDs·~ßÀûÜ¿h›8©]GœøQ›JèV¤UFõïä'}ßËOÿ©lXÀü&ö„°ç�«’þZoQçM¢æë²ù«Ý÷É™êûî(,ò=Ôó(øxÛÝpÉ@��¸û£§¬£Þפ³,øh[N´´®Ò?G õîÛAQn÷qIQ½•ìMÃyqf‹Tö ÆÄ4»ìÔÁ7¹¦O‹ÎIUˈ´¯ê˜Ö]¢Û�YvÍQæ^/AFTï„øÄŒEi-ØÊRª…¦÷+ß­–ߤÛÕX ÉšÔƒ¾$«ÉDœS{\šÓpJ˜ù»ñô«�zÑ/´�åv§_öʨ§}ŒèU»“×vœÎý|˜*è?B—tŸ£‹{ÏÒï¿#ó?L¾ûn,|óUDæ6¥ËºÎJÛJoJÛ‹ÝÅ•e×èWM©Ì!•>¨Mĵí%’?€ý@?ê ˜'íIv“)ó¨�¡Ó[u‰Ô5QZ+Oö´â¬oÙ‹²¢-4u¿ËˆºÝ¡/zÐFI7šŠ^¶™’w¿é™Ÿô™{m™Õ. žv‘dNŸŒÊýv˜ùÐ}–)ë¸@w�¡+>^¤+;Γ¯$tv ¾‰|Ý+&}Oû„¢GÍ"*¯é]ßrIÔÙäfÜ_(lð6³gù5¬9Ùðå2]ßaE¿ë=Lf|Ö¦°µ›¼ ršœ-ǸüÄ«øÕëø·ÿ®&Êê�J ʯ˜?˹"�ªÕ }Ÿ®Üû¡IÜÿ®+|ó…&žP‚ô_U…á½J‚˜ï»ÄqƒÚ²´ÂôaÕqYA¡¥qi¡ãÁâg“ÜkÉëš“ÒûMbqz»‡URz5�§QØÏ1IýÚ*I®¥ÌFÖlfÿbH}7£z¿ØK>{KK¼EŸ?z0¿t¹‹>7x0ßúnÐ}.’�Rßã­éÁgšCÝʽ#Ë®‡í¸Jüæ ékò=òñq„Iwq°¤§Å[ÚÞäIÕv\ÁÏó,ýnМy3xX˜öc?‘8 "Íi’Òæk¢wͧÄE­¤…•–Ò’*[“ª¼ëââæKÒ7µgÅïkÏJrÏ3o:Ì©w�%9õx=Vœ’敜“äWžÃ6ÏØ(¹k—Àóñ2~DÍfþƒ¨ó_°Fdaßq[½›¬«ÌOÖWå'îj¼)êk¾)énô¢Z?Z Jþf*(ùÄ(ùÅ\XñõõñÓ5Ñ`ƒ»ôs•¿yדpÉç&ªâãyêM·Œ¾ÓË#Þo¤üÞn Cj•ÈÛŸtá5ñ«sã7å—e9egeY‡¥™ ƲÇUfÆ™U¦ôÓ6 óü£ŒxÙÅ0oZÌÅy g$9u§%Ï[�‰Ÿµ›™?ô‰'|û_æM«¹¤¢âš¸¶ÚAÖTyÓ´«0èøÇ̘S­·cŽv>Ž<Ü÷&\ï8F¤þq€ð-^ϪZ/|õ�–µVy˜w¼Š<Úþ<ʸ·*PÔÒà$鬿y°ûCˆ´³Ê‹.ê8%Ìÿl,xö»¡ðe7Ih=IW´^Ö|?JwÕ9Àœê|*®.½f”õ«&/¹z‹aÚÀNƒG?• rY]~ÓïÇOµ¤F$”;…GW8GzÕÜŒv®ñ�¹ØcÞõ8\úµ"@ò¥ÕGô¹ÍKü½ÕëP÷“� �ñQÇ[3BMûž ª5|ð»}ç+O’ÕŠýü€¦ÈýÉƯp `W:½[—ó¹�Z¤¢;ÿÝn!ŒSë„Ò¸6&ºböA‰¼õISò¦õ”qE©“´´ÂNô¼ÇT˜öë~aPÑ·`?¸xñb��Ö–:ýø2úH׫(YG©·øc�›ñ`iÐåÆ˜×ZïX—Z*Ç·ZïiKÑ ª®í¢iÿ‡`Çÿøõ7ÜÂR«ìƒÓklïVØáñ†Ü(÷õ*öñª¸zµ><ì`Ï“ ¦§Ç…*é?C¿0•¾l8)}ÓpVZP}Eò²áó°™bî4‰?5zYKæ[ç�SÍQç›SâÎ6ߊ=Õ|/NÚQíA}9Á/ù›TXóóQù÷ã¼÷¬¡~«ÁKìÚf˜òi—øCëåƒ=E¡‡ºsBé–žktQçiº¤ýÆÏÇ$ÉM†tÆG=ñã™èCùy“†wÇÚDjr¼íqÌ¥¦Ä$ëÆà·jÏ›zß ŸJ· Ôr‡àµ6A¹µþ¥�W| «¬ò+¬Jj,ü*«-üJñÏå•–%%׳KmƒRKC|JÝ#Î6$†÷¿õÔxšu=&êþ8'xÎòÉÇÿо è'½bñÓŽƒ¢[Ÿ éøoê’[�ýè;%*í¸,ímòu¶¸1�]¤ýµþ’ÏåþÔ@�“èK»‡¬¿$À¤·2˜né´¼úM@¼üHˆójNÊšŠoHû«üLúß;ÕøÆyÕßL¸Øœ–r¨óU¨´·Ðýp÷«ð£]™‘Gºî…Y¶…ûU»„>¬² .¬µ Èo°ðÛhá_€¿æÖYúçÖZú¿¬º”…÷]B¥chR™ch\¹S¨[¥W¸ìsž/¯””¬ÜbUE�Ä’ìþƒÒG]f’‚æó&%EÎ& …Þ¦íEAâ÷�ç„éjDrŸš$½I(yÚvXZÐxY’�}ò›¯fÒšZW¯ ÏûêàÓÖÂ`Qnë âÎo:‚˜úíÂ[_5èç½bQS£Ó¥Æ¸ø“­÷bMz ±-Ì 3é+ ’|«÷;Ô�jÕ]ë^ës¶%-NÚ_ìÇtÔ9ëÈŒrnòŽv©÷Œˆ¬u¾[eWf¥MÐ3ù”¹GEº…%º„ÚÔ…àõë_q3ö8¾7r`Ð^ÿ=«Ï{Çê ›œƒ¿}ªñA‚_•w†wµOÆÙÖ{Éæ�YaLC¹•¨¼ì¢s­*Ì\o*­ƒîVÛ%•;=¬¹TØ`�Ð`v¤;3œü¥ÛѰ‡=fÔ÷�SüìâÇg{“þç¾¶UA^•7ãJœCR ]B®U†„�«� 9_v¼9=XÖSàkÖý2XÚÓè'ýØè-mnõ=ýåy÷ﺢW¿6k* 9ß”–p¦9=úÈÇÌðƒ½¯Cõ¼ }j¿IôüjI÷v;‰¿Wùé¸jÖ÷4ب�=aÔV¤ÓÏÒúƒ¬™Ñ7ö¼ÑOöó½Ê•ùQåJ|ýj§ßÂJôBšV>f5É÷?IŠš­Lª«Ü�·<Œ±­‰)¿“ZæaÕ‘ í®ôÕ7:0uíÖâºJGioƒïù†äXûª «Êˆè»ùΡOßÛYÔGb›ý*BÖ_hÖ�fÞ•~¹96Á³Î#Á¡&0æd[Z8ý[×uª£ÃVÔ݈mgy ywvø©¶ôÈËÍáõNnužÑ¢ÏÍd×—kdÇwk~-kfPÈè>Ü©ç1K×7cžv«ÊïüqZüK¥Ï� ÏðÄ"§`ì÷‚ï:»•z�jJ2ï¸D÷¸0õ=VôÛχ±?Â4vØkÏŒr©ö‰yXàü¦Ø&(«À1ôÁ{Güÿ:¿xoœôÁ%ìp'ö±}…�à_=*<#^|° Î+² HÇ6«¤ÒÒo°éŠÏ'|b[çRç.üý“½v Ë7úÁ^:Òy/4¥Á.¼°éªÿóëà¬ëß&·8ñ�2oñ�J/ð‡¦ƒÁ‚þ_/ë¾bU l|'i=+Àä¢Ü^�íØ¯ƒ¶îÚ‡”vîG›•TÑÆ­{Ñ:%´Q‰‡” ÛaêמOQOûÛ*�:VƒüÚnoW”ôæFèÝw.!�ù¡¹î¡‰ù.Áþy^a×1v8Ó˜!êíq7îª<Ú–�qQ”©{tÂ{·ˆ¤b§Ð ŒÂÊ]#ç ÿ~ÂøSn@R…Cèlß^6Z¸õŠX“}˜Vk°×ø8Z9{%^‡Sñýý�Âw%Ç�æf¾àN‡¡ÿø€÷ÿó‡7øMxШaSð׉h¤ÜDüÓ 4kÊZ´~Û!tÀ­j&û�AÖۨÒ¾f¯-·#Òs]BòóìSß;‡¤p Á6&0§Ð6À¥Â'´繿k™o$¬Í§vA™ìƒ#Š\CN´¥…ˆ~iñb~kô°kô�¬úxÉ7°Ù>ˆ÷{ê@è»y[öê!Åñ3ðFs÷?ß!|?�i:^qSñwðý°ÿ2šÿü1ŒÝ¿Ž{þ„¹‹ÿÞ ¼×ì;‰T'›’ƒ±� y�me~3š5ïZ´c? {´™‰¶M” ·Û«{ŠþWÖLÔýÎ.â�GÈ£—×#?ä:F”å;D”8F——ØE|È·�((pˆxøÁ!$ÛÓ7ìBáõÐb×`µ6VuõÕÿõXþ²›`#Ær–}ÔŸß�æìȘ?¿ŸŒçQaÄb4ÏÓÜi[Ѽ™[ÑìyûÐÜeêhþC4{‰Í^jˆ檣‹´Ñ¼4Z§ë�vÛ¶LPyÏn�||møÚ'„Ã-7Cžå;cl^äŒqfp�y¿`,V\lR[`RPh‚Ǭ÷�=¸ó„¯Ü’-»°o�üo� ìähÎ2 ç¾²�C{p,‡F&¡r³Ðì±+Ñì)ÐÜYûвuR´bÇi´x«9¾N ¹«ÅhîbÍZN Y yh†‚:š3G‹{o? í±«� þ‘Õ4èc›5>¼~¶<Á;ú¥gHÉ+—ÈúwÎÑEyNÑØÇG¼+´ þXb>PaÞ_c1PkSSb ˜Tç'+]²Íè5gpÿ“8Œ6éOô8äó`ï ½7¿;Í9Í· Í¿)L]�mó*4sÊ:¼ÿv¢ÙS÷ …i{Ðôiû¸±Í[i‚æ-‘ ÅN¡U:îh롇ò;}»¦¨d±+÷±JŸØ#Gên¹}•ãQ�ç^�空Ô&¤­Ô. ö\{­mb[•]|[ýµ¸÷¥v˜K¸¨Õ²{—­Ñþ_¯Í¡±"nþÀŸM•›�¦Êc†„÷Õ4¼ç¦Ë/į-DñNÂ×´QKÐŒñkñØ6£™³•ðúTÅkÒÍÙl‚æ+�E‹öÛ¢ežh…V‘±h“Ù ¹=~¿ÎP.e7Q½EW¯äÇù¹zxcìU…Çö¤Ø.ôöq¥E¶¡m¥¶á]å¶m6¹öa«£‚Ôß³»gOšóoÏÛ_û ì=xªéò Haä"<¦9x=NǯOÀ{âÐ{ró�˜•Øâ¹·ÛÍ­hîÌ}háb-Ùr-ßg�–j8¢ejh¡²%š¯n…¨[£•ü ´Ñ8Yn§{ë$•çì*^?{TÔU`w¡(ÎÛ97(àå“›1U¯\ãêÞ¹&åæ:„gð-s�¸Ô‘�yB}Ù5.)þôæºÊvÙìÙþm_>œÃZ€±÷Ž}Ù8Elû— …ዱ�_ˆWä nmNßÓåfâñ-B³Æ-AÓÆ-¶_“W£™Ó±ý_¢ƒ×™"ÅõæhѦ“hé^{´Ô -ÒñBëÌïËmw«·ï>»X­�UÁ8ø”´ýµë™êD_ÿ·Þ!÷_»W¼u ­Çc+ɵ|Qbô±ÊÒÿs­uT³u\YµMLl‰s�ÑÏîËëÄÿ×9ÂÀÿñó_¶d �Á³5ïµéxgs×tùHaÒn®æ«á5¨‹æàu¸`³-ØHc›b€æ.ÕA sT‘Â" ¤°Ñ-Ü…÷œ‘7Ú|"S~›_Ä]·ØÙÊìfÕ v»á·?Nš7Þºé^è•w=ÛÎð·Kã5Ö\eÝYcÛ[g÷¥îZlw¥}|G…-Ä’‚µ[XÞÅÿÖ¼Éÿ‹}²ñX0ú¿ ).PE‹µñ8TÐì…jØV(£™³°ý˜µÛL¼Ïð^›7{š;g𝠂æ-æ¡ù+(´xó1´RÝ­Æ£ G³å6;•�ÞäßÁå¹®I…ùöaÏß9… Jä½buŒc~‘ÿã ÓÞêdÔÁžÒ(a÷©Ü(œ¦0añÿ8®!ß6†C‡`%Çr( <ô4ÏÓÌIkÑ\ì�—m2G«5,вífhÙ*>Z¼p/š�íåÜ©ëð>o š7gÆ”<´h-…m£åªçÑzo´žŠ@[�¾”ßìß1~ÇSvŽj?«¬ö‘Ýo0ÈšózÙLOŸë‘æ{§êÒÂu>:Õ˜‘ðöFDì»›§›nE›ö…8Ô%”•YùõUXúG¹„hõ±ä&½sÿãØFrã™ÀùæÉH�³ã8Ì?Žû ìåôó1™‡÷£š:.E4}â:4{‘.Z¢Œññ¹×Ã÷ú÷ÍØ{›]¨ü’] xRù»bOÜßfï î�¶Ã¯kÊN‡²ñ;¯>½×£|Šj6»ê@-«jô™=oø™=#úZèfÚ÷Ô÷|cT0ð9àä€5ŸwÍw}õÁ6¨´äZ`S±MÈ@…}lM±]$ñµÉF;xذïÿÎÚó§/‡õ ÈXaÔ\4oÊz´x�.Z§y­$-Ñ ó´Ö&{ø:÷÷#7{�Ùâò~ô†«Ï‡o°Í±Í­lì6ÏæñÛÜëÇo³ý0ZÉ"wÔ.—Š ûŸ±ëöײ{”ï²KT|šgªe°+4kYMÝzV¨×ÆŠõšX‘`�½z¥:<0 Œ+cgûÊ€peˆ´õ÷#è§!½Ó$"³¾ y.÷ç(‹® [²bïÿ°.å¸9»>CãáY*hæBu¤°Ò­Ø­'ÜÐZâ:Ú öG[NÜ–ßîS3qÏ-v¾ržŸJvÛþJv'Ø¿Ý^uS”Ž¥Éo{¢­²�a;Oݱסtâ>÷–iªáßæxÆnÆøDK÷Ö„ÿsð2óµÐY·›iy•Ì× iZièW¸’|ø‡¡¨¤û¢øÕ÷£äý? „ISe2þa$~òÔyñÅT”Õ+•=«>&Ék9õN…¬‘ŠÄK~ºüÿì÷ ;mêèEëoF ùhÑ´dûI´\í㻢µZ—Ðú½ÇК­$Z±V­\©�Ö*‰�á5lÇÅg£vZŽÝŸø÷ÅU¬šNk¤ßËš_Ø™·ß ùp]ðý»…ðËOkÝ–ÑJûu­N\×ZÝ;ìVýRÖ�WÂRü ÖTØ0p†i¬µa>V;ê}fÖõ&Tü©Ý‹ª°à³RaåÏãLg«‹s•_LE©•ŸK…O˜Zìà¢ÅŠJÿƺ”Ö†±ÞgxœÓÆ-Esç*¡e[ŒÐfÍSh;á‚v’6h÷ɘá;?LQ.`Wküdù†ìàñçįÖFÿøvAø{µ%ÿ�& ƒßÙã?Xžæ–¯ûƒ•ê}cÑŸ»\ô»X-ï¼yº§‚ÆhšûŒÔËgueì!ƒŒ?vÚßž%xÂQý'ÚîDéxq±11îDûƒC}D:1‚x½I’QOÒ/z%†‰Ÿ·i\Š·tÕnާýwñ¼-PØŽ–¯`œ{m?õvÄ�ö‰»âY¼övh}aI½_ÙCz?ÙÃ:?XÉþ&v—j»E½›U×ÿ�=jYœQfQáìPí$|ã1¼ö4Þ°Û5Ÿ°[µÊX ^kÊïbÏ þ¸&ù^íÃ|ýxCÿ «b`|BNuˤ£¡Žà%Ô1‰�*TàÛMbëäy’ÓSDöÙK¨ôßuEÙÆdÚMÊùÞ"�uš‚®¹÷¨µ› ÑÜ KÿK,è?Ö¦<ÆYcMZ‰–n¡­Æ±r{|Ú¦�ý;ð…Û/ °§ aÏ|fë6`[PËe,¡WÌêÖ³fÂÖÚ¨“=É+cƒ×¬–apÛ:C—Ìù¼„î­‚ŠßS}=‚O¬¿�=¡—ñ‡’¡{–"?ºvyë‹õt�„—l"ü_¯%br”¨‡5FâìiYá5Óú~Ͻ¿/P«dwãýÄÓzÃîÕr}­ u*a¬žÃc½·¬ÝTn}âã�(Ù`ž/=Ðè,ìëµ2Ègy<�Þ™£Ãy.�äÙ»NÔ Í^¢WÈꈺ]™ÆÃë™ ´ùbdpÐb¸áí¿í#nÿÔžõ™(ŽgÿëÇTì3Ön¢�ŒÇ0UÛœI*YÝO¬Ìè {^¯Ÿ5ÆöZbˆý.ùõ»ù}ÐYÛm«[Sv¨h"¥�›�ÁÙ‹#Œ÷j‰?ØŸkIK°hŠˆ;Ô›J~päU°"�ÔOëuÝßÍ×ʪðÞ² › _,7|úS‹|ÙN�úŒ„~Ó&®„OŸ—×5"BvRžë“ý÷âçSQ »éÛß dï¯Èòk®âw ÏÜgd9Uï|Èø=úçÑ¢Ù[9-ÏÅÓ‡ý¹.G ÉòدÍÚ‚Vl¢2¯a*¡ÝsT_³kÕêÙ}:¿²2áÏ�×È?Úœ™ßê=Lr‚ ÷Çô·¸Pµ}WÈ÷ßo“Ð…ƒ§%µ�ÎÒÒf{&{@BXÅÎÔUÕEÚ»v"Z@#¨çG•n5|þMèøW=&Â9haxîf"½_ƒzØ'†WoÚEÎb\ãH<—3¥{ŒÓê(YA‰¥Ii¡«ìuíiQV»D”ÑÊ'Ò:%Ûžwë^ ù¶éÃ'p±ƒý€¹œ9yZ°Z ­Õ=‹öœ½7êÀ#v�vKa~ybt:,£×ÅŠ kXýûÛ¥wØv„¶ž ÒR #¾ b¹ƒ'¬Ç›9Æ/…•ìe¼ž¬3Ðã£í‹æ ]Kç¢=p­šƒ4öoGDDîVñÛºãÔ‹F–·‰¼è9‰«?ÏèÓãj¢OØŽ¡Ì,FB/YQ\‡º(¾KƒÈÙL%t©Iî61tU×%qaÓy"õ·DÀÛu‚‡ßtÈüÁÃT}ïe^'{H£‚UU¾Y2uç‘$ùGÓ‡ï9š>BõDÆ(�«O&©;>Ÿ¦•þm58àµ8öÕÑDï·kú�YeÃð®�†I_wð³êF·~î3º9eÏ´AqÚ�±Œ�EÙÞžOYß™G�öœ ¥¦�Ô÷ìC|ì¯ø†H"5•ÊLå(§È¹‚ðüM‚ˆ¼Í‚è¼­døÓ-ÂèwÛˆÔ^5úqC¾jqu•7£ÑŽqóÉ[šÒÕÇ�K+ÍÊßy—ÙKs«/ nªÃ¹ âZÐtÞåãtœÓfhÜÌ™½ÏÌM~ín͘ ˆ¦�Æ|óЕyHÕ>²z{@§‡¥É¯ŸœÈþ_íùïXÚè«jh9Ýè(~–—]'^¬&]âçc;0œ:í:z ꫨ#�mÛ‘�²:Ñ'¸³B\ï8§ô%&�³D<ÒÂïa»A9GÍ#"J·>Ù+)�Ìô�‡+ÄIÍ:fiUR&¬tsÍwœÁ ¼î­ ;öSQ5{Hÿë…©ŸÔ¤픤§ÚKÖTæit÷ïªB§ø¹‚¨Ò-Ä‹AÚ¸©ÈÝdà}0ó£ÁCð“µäÿÊ^Æþì´vKhg±;´¯fLVáDš’£Ãô£ÖÒ�ÝV¢²Ž+ÔóïŒðbØ”ÊÚÈ�oЏ3î/WžÏWê¤hDz5hßê-È`¿*2‘˜Éºl7Õü¢Ý´ƒçì'ˬ}f‘±»¡ÎWô¬Þ„Ènç_4ùé]û„×çžK¨{<¨«Þù®ÁoÛ"Œü´�¼ów=~XÅ&Ò*V�8}m e4C�а›º3 Gd hðc+¶ñÞ­â%v+f³†Ù?wêÝù»’Þmv«F»K³Ÿ5Ðù…•h²ú:õ¬žÞV×à «kTÄ2¼VWÏ÷…¢þû‘fgå�ž‘×ÑÖD;W/Dû·oG:<Dº2’>o?zh‚Žè‹ð^ö‚¶I˜KàgKº'/âú�¸'.—Úz*ÐgœÆÓa3„ñµ»‰¸–½”[Š"e9›r�-ĶPšS~ò`Ék7òu§DxýÁb�µßTÒõñRÉó–CÒÊr'¨ƒ”}ø`M=èâ›wRnwS—§ ½^­4ÌgùÄàW[ÀEÚ/Ø=6ϧ¨ŸM«y%k’ÆÅôñÚ�ÙmüOìU¨åãW²fi3µt�‘ºŠ>“:RÛ©ŒöïÜ�„g­ÇÐ·Û D †dR“ŠðœýXC� Á™t>)B²36à,�R§m|·HÂ�ÃuNP„Âä&eØs„×íeäÅ› Kß©”OÖj8"Mh0€³LF#Oú²ìˆ8»Q*ͪ;ȤöëPQm{…±í{èÄAu¨ù¨½È¿ÿ›?±má÷|µ0ðéAÖw=£ü?ýJŒ©ÚÙƒ¬)ž7}íûì}ßú¥zfN#”•yHÓPŠ ¤Wåù—C&«ëŠÑÞíjHWKŠ4U´‘ÊÚ­Hsï�!-Ñ9 M¤ºg?ÒV7@‰Ä23yÓóÖMœ–šºÜZgƒ¤NóàŒ#s«MÏ4³ò¨øáG‰àÖ5¡mØLÒ%e�0铊0¸hq%lšàŒ×xaÊ*ÒÜæ‹tf/Å�u±ŠV€óÌÄÍ;‹ §è9¤cü<¡{æÃøº­†™?ÕŒnS6Š,ÝÈKP2¸õm§AƲ…,ϨâoR£Â¿Ñz�ßÍsM™Í³�f˜ü}'™ÝOE´n1¼>Mh=CxÅŠ¡èð0¥�hû²•hïF%¤‡÷yÌn4œeƒ^zÒ+îÓ ;øz™Ñ¥-~T#=®1™Í”è^£€JïÓ&Ÿ¬£¢æ2–�3Ûø¹Ôµ(lo£f7’Â>äßîW#ò:LÄ5gˆ'_øüÛßÕiŸ”·¾î§žôPLaë9QnëIÁíû…=&R—\'Éóø1õÛ©×=2isÕõc�O¢™Î:GÖgð’U7í[«o—­°ßàÒ¡ÎÉ\��l”Åj ¼_,7�œ“ã›Y�š\nH—SÝ¥Š÷ߤŒñyÙc²0­Sö�c< zf@ßbúàÙá²Ë^Ó%>/·ˆ+´È„RabÕ>:¹E z@ÈîWIÝjäõtEÊ.lí’´ÎzÁùxæfòèÏcVðÚætí¨s�©±‹r�Ä©}´×«µÔÍ׫ˆ”UêY‡H�кGx÷‹&‘Ù­Ozg® mü§ö³ø6±3 Ý,ä|XÁ³H�¦-»*§Aœ¦+±–ç‘—åô  ^�Ê¿à?QUÙ-5 ÍÀ¼iÃÔHm÷¤¶kÒ×åq}ˆyB“a„ô„<§‹sîÆdñá“#H^ë3I÷ìåÄ%ω°î ·‹á\©à¨ÕH]ŒÃtxR$_‘§ç‘‘õ»è¨fè› ýŒ¸~B™M¤ðN¿œí¢¢*v)�ªDZ³œ'±M¡bçÑWý¦‘W}¦�VÁÓ…!ØÏ§¨b«wÝîW>î7$ÞvɨW]RòM¯ “Û~„ÈîðïÿÔ _ô‹ùw~ÝOœr§Ï˜349'ç·Èô/ÚÒuÇ�Ëß;ÊŠKm©œ^©aÖ?4OYž÷û¥š‚#h­ÂR´fÂBüuÒУÿ˜ÕHÁq«‘Ff熇¯ŽÈ. WÙ¯Žöaû¹Oi§ÇF\ôœH�µÇ75—_!:se¬äòõ©œfÔ1Ë1ŒÙ™á¢SWÆ@¯Ñ­CɃ •ÙiD¸EÎ#-¼§ ’êvQ)]šÐ×�ºê5Edã§@%Õ©IŸ07+|áx¬êQ ÉëÒ‹TJ¿&œAcœî/¦‚k¶SÞ�WÑ×É€7)Ÿ«0NXÅ¿õU…Z´ÁÈ:d*ß1uŽ¡WÎÁň)jê˜/lÝ�ö(©!Õ]ZHŸhœ³äŸt³uù:´dìt´tÂ4´vò<´ãÀWÆq‹Ä~7À™<éÍ'똈ʽÆn«D&g†ó…"DËN çz‚ÆE×Éb§À¹LÈ“-Tüû}ÂøŠÝK¯ƒùDVnd~Ñfô�‚”–½ £@�÷˜º dÀ‹õDtÝn"¶n7�Ü«ÅíuŸ+©É‹ˆ°Òmô½V#êQ«æ–zÛaJçµ&ŸuQØ'î"œÓç N:�á‘'ä45(¤¡ÂC<èsÌa4yÞo2i“4úF‘æv£xÔ1l;NË‘§àµ°€rÆ—OÞz8·BÝÐ¥Ý3W'íÆç]ÆS ØŸ?Àx0t&eë<zê L,G@Ÿ=èÿHuMÛÆÍ¥Ý³VaµJ°¾ ç/Æ ¨ó^“ÈsîÉSöc‰“×FCïHÚåÞatÃNî ²ÿÓu¸’�p¶û?civå!QVƒT–SqFô®î(™Ùc$ /ÞBcß/ô}º Î&Âù5ê]»?㛪À6VAp1ðÿcïMÃÛª®…a'f3¦”1ÀÊ™‡„ÉvBœØXÖ,Ç(¶ìˆÈ’‘å$  !”@f „ZJ¡#íåmK/-ehK)½½½÷¶½Óû¼Ï÷>Ï÷ý¸ßZ댒ìøÈ‰mIH뜥³÷Ùkí½×°÷Úk�ݲîÐ%žÃÿçVÏ‘¿×¡¾c³Îóâÿ®ÃX`-]é ¸¦ÑéOqZv}Ä7ïÿ\ö­>xÑwöŸXwãܪoP«fL¿ ÆesÕ|�¯ÊißÛ²ç¾3|=+NkîJŸˆ9()ÆKÇÒ ¾þ�ƒ½wÆôÁ¸® –>v~¤«ÿ”¶®å§†ƒã[»úO]pßÁ+»?šŽ±ž06†oÕÓßôm~ñJïÁßßìßÿÙ­�ÿx;žs n}y2Æôü¢6üÊgÿhö¼ø×ÚæWÿ»Î÷îßüá¾H†ø‡E�Wþ¥Ñóâïo ãÛû¿ÖyÿûÌ–ý_Þ|àõk0¶;Æ)ðúS=ÆXÃØC¾§µÖÞ#ÿ<;xø«y�7ÿØx÷«Vÿwÿô¼ð÷Zÿ#ß½ãΡÜhyúñÞ7þ6ÏûÚÍiyâCλêÀ…¸®ÖÒÿäy¾­À3|yêÞg>Uñü8ÆóÇØ‘ž̵…Ý'xïyô<\h9ø§›|�ÿœ÷vÝÊí³C`ͪj˜ª f¶œ|àЕ›2xÿ¡Ë�–ç—휈4ö$î=ÅÓÖwbs{òÌÙá{æãi˜«c…·¹.¸ýûÆÖÁxŸãzíÁË1ö(ÅÒYáÙýï9øÅ�0§ùŸ|— ìúÅ·ç£é¡ç>½½õÈçžà¡_Íö?÷›™þÿí6ßë™|ïŸÚBŸ|ºbÁ?|hÁç?[�çï£?ýQð;¿#Ïõ¯zò˜»‚ÿ•¿6àY\ß«ÿï\Ϫ#Îœí«ºY¾¥ª¥û¡3üûÿR8ü—9_Ì»öÀE-›ß¾ºeÉSç¢.:«s¶¶Ua|йñÅk(cìÞ“Cwo=›r=ÜóøùSó*a><”u ¾ó‹®ÐkŸy0.ŒaÀ7ž�1Ñ}/ÿívÏ ­ÅØfÞ§+cÿb,:ÌYàO€]y÷¦3ýk÷]ì_rì‹ð ÿÊÇÏ.d¢åç{ׂ}´ä‘süK=×ß·ýœPrݾ»7Tû@c^\ÌBy@#Éñ�þñ|«÷Ðßk½‡þt+Æñ®Ûwå*zìœ]¿�1¿æÇü¼˜› c –¬? c¸ø_ý§†Ð;_D"oý®5øêç´0f4®�P ¡‡^™Ø´Ï…±ž|�¿ÏaìÌ â;É÷Ò¿Ïñ¾ô³=þ8ç Æ0 bþ™ôš3‚ëž¹õïóÿ:#°áµ«0ïî`Ë M†9€›_¸Ç(ÆÐð&W�:¿¹yÂxŒùÞr×Ò“Z¯>ÅwßK—Áܾ5øÀ[×Îoj¯šyó쪆;BUÞö%B÷?{ÆÇ8@þäÚÓ1Æ'ô÷lªöt.™0{n°j^ >hq)Ƙ®¾húDŒ% øÙ/\E±Tðû�#ׄ6šÚúÆõ+eË×zŸøK9EžûçÙ‘W>÷¶ëâ�ïü0}ë—±à¡ßÏ¡xÐ×ÁoÿÁùàw=­úÇ¢úév<+‡±J"¯Àsù˜�¡åñï»[Àiyö—²çà¿ÝÔ²õ×6ßµá”úÚ¦ª¯Wªæ€M€1�HnÞ½þŒÌGÜšß´0sâÜÆvà›íU�öþ“0öTÇ®ŸÜÞ¶û§3(vÚâûOÇXQ˜·cèú·Oôݵäd”Û­ßúõ‚…ßþåâàŽwŒK‡1•¼»Þçýoþ{³ÿ­ÿíizþOóoxó*Œaïß :åcßgK¶ŸwG$6u½ÀÆW¯B9‹vµgaòDŒíïí} czû>Û“\ îÖªÔk•ª™·Ì«jîX6ÁÓÚs°]ëok]tÈpœòo7µDÇaLnŒ?�ñK1ö¿¯=3Áãëï[Ø;!ÔÿðDÿC¯]‹<ã6ùžøPl}õóPëË_úCÛ¾uÅ.\ÿÌå¾—ÿynèݯÚ|ßû‚w¼ñ?³||{ÉÌO¶b×ÞE™ MÍU˜wÏÕc¸æ®'ÍžÓ\…|‘ò”�X¹dúêÓ07§/–8ãbR¾J_ªÑªò/\|b( clÉú³i˜K«w_Œù0vQø‘7k(.3èÐ�…=(^ÕÃoO�l{½ãraΪ@QNWÄ쌕޹º< #0ß–¿÷Á³üË;�r¬Ý{idÓk“)ž®sîüÎÔÐÁ�gE^ø¬)¼ïÓY�Ç¿ÇḠÁ?Ü3Gyîú§J`ß?Ö¢=>üÕ|ïÁ/n Þ»èôØDÌ)Ó²ç÷ª÷Åÿž…1'<{¿T}¹"´ú™‹±msfÌ‚ù¨ò/Þpº÷®µ§ÞNŽ÷vöŸäM -–N˜Ó›§¾J¾F¬Rk¤ª™µ—sḦhâßÒçú|õjÿ’mç`œxŒ¥Jy„—n>7rïvÌÝwæ3oœ®Â¸O”Ÿ ãSE”y[(¸ÿ“zŒÅL¼)}ï-{5�âÿüð¯Qÿ»ÿö>ó§i˜sÌßóЙ07ÆÏÛkÞ¾*ƒ¾C¬oÙùc7òÉÙ³[ªn»­± ó]Q,}x"æ�¢™‹ña.»Ãëv_ÖºfûEáos�ýÖ…ö|TcS&� tÿÆç¯Y7…âé%7Ÿ‰91}{Sàðßç�üu®[à:)ƃöoØ™œÐ¶ê‰K¬ÙëZ°æÉKÑó-D>Þ6nnüª–à�ã0#ÊMŒ·…±¸1Þ°/v÷Š?ùÀ‘Iá§~2=¸ëÃ1/+Æ¥ðûôÁàæýWa,MÏž÷Åà_x#‡?k a,î‹O œ6Ð/wùÇ@øÐon¾:Íè·3‚¯|Þxä;×û–Ü_�1ü™ûÏÄ\ÇøH­>us\{Þÿœ c>£<Á8cþõ/]¸çàE-�÷œ„9ö@fœ�qù|þ­6ðäg*Œ!Ú~¡{/¦Øu‡~[ß²ï7ÓÐæÅœY¸.Fëp_�c¾uÏç³0Ö[àÀ—u�g~}3æ>-Zy æõÃ\3þ}¿º¥åÐç7aœP\!þ‹tÞôòUþ=_Þܺïwsüþ<Ê×c܇÷lûf°½wÎ{\sŠ<ú6ë?ðqmäð'Mm‡?õ‡÷þf¦o÷/UÌÙÜñV ƺ ®å*Ê{µé[S‡þ27täÏMþçþk¦÷ÀŸnn|c­o:rÅ·{髯oÿ:ùÖm¾Gê¦}Œôö³½=œ�¶î`bÞõÆà¢q1Ø÷øy!¨ŸâHbÎwÍ�®ñ ·y(Þ1æVÁø…­[ßflxþš`ßCç„{¶œ^¹ëÂÀžÏn‰ìÿä¶ÀŽŸ ‘�~“b!£|Åx×½÷�‰9΂zî,ïS —½þ§¦È;¿í ˜j÷í»ÔÈ�…z”/Ò ü°û„`ÆÝýMÄ·uÕÞËZ—íø&Æ@]°ê©K1,ÊZʹòãâS.¼åÏ =ö39òìg³Úžùäöð®�n¥\ÞwoèŽÌIán7Ëžˆ±ÏÃ/|9�rgmÚ¹³ÂÜY ßõ¬­ŽÜ÷Ô%3¶uÈ==wV ±áôfЃçÍh©ò;ÆZá]m O¶wOÀXË�06ïÂñºõ\Ê�rŒÖD2ÏòÆï:ó3aLoŠ{ýä�DŠÅ�y¶@Nã¿¶Ô¦³1_]ÛÊíE<29´ó§Jcqo9r-濊¼ði#êȸ—å_ :Srý顸‹›òíþxřŜÏçÛýð5³ýÑ(o÷=§jëÀË)ÇÇ‚ÅkÎÀÜQ‘ÔÊÓµÜY�]xñ·sq}0¸sg-¨jjÄ|&KOÆ<]¸ï†ùÂPEº—�¦çκsgQ¼R#wVlå) îÝwYxû…ë^º&òŒâðßußi”·kÅî‹(‡âŠ-1�eëÚÇ/ÅXú­+�B¿†ã÷ŸNã{û�$,òð,­üZ­ü½.ŘÕ8¾)«Ë6�Óúà¡kÚö~t{ôÙOæ“Ýtð3î¼Ïˆ;ÿòšóãÎÿ®ãÎ/x}/¾ £LÚ‘{Ÿ½$¼öÐå-]ËNÂ5‰–»î99Ø÷ð¹(ã1oÖ|ïÂq�¾;ǵ`µû_¾*´ãW 깡û/Bù‡¹ý|÷œäñß9®¹9\ãäDÊÃÚ»þ,ÊžtÃ9‘5O_Úºt»–¯ çüƒo]ç?øÅ ÌK„ë‹Ð{0· æ9oœÛRÕ0ó6Ê�å FƵøÍÜYWàÊÄÆù ªæÏlùÒ9åSklù)­]+Nm�÷ŸŽõ�ê\~ òhÌÅMù©Wï¼(²öéK‘RËOEyOù.€¶Á§~,cŽŠOß·å\Ô[# ë¸.òø{rø‘×k½vålÛ°ûrÿóŸÌBß\+ÅXÜÁ%Ÿë‡:1¿YpÏ'µ¨“â`8¾æ´Hbõéè7B¹±Ö¼×[(÷ïꃗúû<ËÛž:‘r9�Ì$iäÎÚ÷I]èà§·áZŠ‘; åm¸ïÑóp<‡Vl�ˆùÊ0wæKFÛÌÊ�µNË�µìý;'¢|Y°äáo„:–œ„scøGz·�‹:òÜÖuO_FùÌîyüÂ÷>z!ðÀ Pv„Ú—ŸL¹· |ÛÒGÎÇòoÝ^íøÈ†}WbÌmÊÙ‡ºÆã?Q[÷þ¤¾mÓË×…Wn;ã>c¾gÊûÀë×øŸÿÛ¬ÐákÄ8²˜;sãQy��¸àßõ}!üàó×hy×Ó'b®DÌ?€ë�¸ç5Ϫj ÅÆÏó„«š‚�ãÐvÄõìùžHæÄÏlÿ)‹ºd(µ©úަhÕ¼UÃüæ*ÿ‚®ZWöcóÍcî¬ùè+l�¹³ZüÁ*?æÎ‚1Žü‰rgÍ�÷Á?ÌýÞÚ÷Ðy‘%ëÎnKôŸ~güþjÌÑêè9)БšN‚üÄÜ]À“C›]�91‡­�c^³g>¾9øÌ‡7a~×ð²�ç/XsÀ…9*Bû5õ|Üç@� csS~Â÷\éßÿq-ÊÊ‘° ô޵Ï^\8b^Žƒ¿}룺«¿¤uñšÓïìßyaÛJ°ë·žÜzø×- ^þ,~á�M>Œ�¼û72å΢üí/_ãÝý”;+°ë§Qî¬U»0wÖ sq.FRãƒkž¿cuSnê_¤ÜY­˜?sg­ÓrgµÚsg¥ŒÜYKNö·ÅOðÀ¶Œ€ÞŽ:/æŽ_óì¥ßóo N‚¹ÀZ—n‚ù¹óbÌ­@åÁîuAù;ï:Áëë‡y©Pg ¼?X~ëÛ×Ó?Ì©z‰çø…«#@Ëp÷šÓ)?Y¼ïdÌù^ùô…¾'þ�¼ô/s[ö}1ózïì:ýË}ðm5²ºûNñEÛOh˜®jö�M»÷d|f~“·Ê³`áøÐ=Û&â:"Ê´ß°^\ÃÀ¼ÓÞÐî}êÂà¶o]‡ù*07÷ÜY-Usç´T¡¾ˆ/~¼ãÂÈ–'c._Ò+An‡�Ÿ<<l™PÿvÊù‡þVÞçþPzþËÊ�…1Òý§zÌÜYËôÜY}§. ÜY¯ºÃÛ¿'D2›Îö´DÇaÛ1ß6î•¶®xì‚ÈÃ/ßж~ÿÕm™u”ßšìñO\@ñØwÿ|å+9„yi(–=æ+ Üä;/Ýó(è^/]�r0°û7†ö}<Ó¿ç7ûv½/axZ Cÿ²eö¹¯àcßç0–<ú=F6ûÌKyþ³ù¡Ç¿/¶-Ýp^ =qâ‚»VœöÚ%Á§?¼u° زZ~I-w–Ÿrg}vs蹞>òå背öåÂèY{†¯sÕÉÍ]Ë&xãëN1rgáúæ üJìŸÙöZMä¾G/&ù~ßnWðÑW®?ö¡uó›7`îÊpϪ3ÐW ç8®›´®Ýë <ñ§åçø�@yc6>ãÂgQv„1×¶·™Ö߸.²úÑ ‘‡±üÂø‰˜ óÜw}OìýüV\_£=wÌ%¸v;ðÞÇ/ˆd¶O¤Ήû(×ý‚ûö¸B›\…û~´]^ÿ�iØxÀX¼âTO 6¾¥­c<ÊNÒ1¦ÿòmçÎ TÝѼp\ ýž“Z»7�‰ömëŠG/Àœ'È“ƒ�¼q}äàçó(2îU,º÷äùÁô¦3Qz[S'4yŽkBŸ�=¨K¡k]µç2’‘ ×(Ï.®y‚݆þi¸^ªå/9|•ÿÑw1¶¾Œ6—ç» æ!h]þÄ”lõîKQî´mÜMü!²õÛSÃ`«b\ßÔr o;WËC2õÔï ˜û õʉ‚9x@—@þ€º&ú�`.`_xÆs#½1Gê!�ÇßfBO| ¢®ˆû*˜;ó¢`žŸÀŽw¦ÒØÄÜ2+I]zæW·âø ü—Ûp¿.rð³¹Ñÿ �b^ºÆy˜?±s<å�^¿ïòP靈pOûÄŸº÷4Ü—ò?öÖ÷ô‡æÎj}é÷þ–羺sgyu žùnxñÊàê—`,k?­9ÿp åÎÂ\!¸žõŒÏM'ÀsgݯåÎ =ñ]1°ë' ÊZo™ßºz×¥¤kßÇœ-¨ûŸúžÚxoÚEhÃ�+(×ü†Ã“";߃O½¯P^[ÜsÉl‘»ï;ó F÷ŸÖºtËÄྫྷo;ðë&Ê%sÏöóQð�=tGØë-0¶ý­U˜Ã×�1 ®k�FyNWžÖºj×%˜» m¾Ðš½—bÎ�І®Ä3&´Î´îÈU¯¸~™ZuZèî5g F9``,…·¾~=îgPŽ÷ä}Õ�Že¤ï£Þøæµ�§~1 ×DÂ^‰9¿Q~€Çan!¤+Ú£Ä×=u 欦s.;>)_Ðò­”µµÿ¡oPfèÔCC;@nƒ�†ú>å±A½hÃ~WhO¶æÃ]xÂ8ÕsºWyë\Óˆ¼ù»Hë›/øM]°-ybKs¨ ÷¯(GÍšÇ.¢_˜ç õ°îûÏ õ[î¬ÀÎñd·Ý·ë’ÐöwXÔÇ[ö|¢¢ýÞÒ¹ü¤ÐñËvŸ�¹Ò›ô\œ`÷Á<¾¹%üÚ'>ßkžëÝûÑ4ô±Ã=÷ÈCï¸Éo²ÍY¡×>õDßùù]�ßy¯§ýõŸu.xáã;ü‡~]öP-¶yQdÕžK¡/ ý'¡¯[°kõ)á�¯]C6ó®O /ì|Ï‚»ÆûA§¦Ö÷raÞ­Œã-�øø––6Ð =UžæUþÎå'£~ŒxùŸú_"®K€=y²ÇÛ:Žry»Â¼ ó[¡ÿå$ÚúžÛ÷ä/EÌ9‚9åèœز¸èJLÀ\[HÏðÃß�Øö­ëq-et ¾êToëÝ'beÜCo|ýZÊ�B{½˜“ê™Ë1Ï®mãY²Ðö ¸gE9q ÇŦw®‹¬yæ¡n]»Ï…þ7ÁǬé–4�_ÓúзjpÜS_ãzæãZ·û2\»üìvàßî`zmu(¾âÔÀÂô„ðÒß@¿žÀ+šßúúïÂáçרõñtÊÙƒk”wúm&°ç—7ŸùåÍ‘^¼–ršcÎ[ÐùHgÝúúô/D^ûÔŘ+ðÄ÷xßó¨÷îú™ˆû»¸ßLgëO'™ôЫ×!ŸG]*Ü¿þÒSî}â¢Öû÷¸hOø»o×�EïïNEú`žu´ç=áîñ˜¿‚rª€\!ž·qú°\KyƒoÐIFÀ¼l{urôs°[xÔ'šƒÀŸ@õw­<Û�¾g�¾¼ súpÝúÙ_ßxü}çʯÀ–CWöý¾}=#¯þÎØñ�xõÊGÏG�ë%}‰¾—˜ï ýHîáÚÚý{~^‹<•ö¦£±ÐîE‹õûc© è“�kᘧ(pgïOs›–qÅ“`NÄ ÷Æü�w�8ïö9 Ó†«B½0.p�yÙ#çiùÌ¿ë?ôÊ\CÅ=HÔÃéugRN,�Ѩ#aÛZ7¹6¼ó‡®Ï„7ÂøƒöE6½5%ØÿØ7Ð'"нê´p?汄ú‘ÝûÌE('ØË>uïé¸~zì"æ<¢üA˜k síxê´³iyô/æ Ã|yÛߨA}„òVcÎö Ï]6 åçÀ½sä唋gχÓ0w–!{mU·¨aßÞ?Üì{ö“éÈóÂ�.�y•PÖ>òf�ïÀµ‘?ñ`žÜ«§\_K6ŸK¾'¸Öˆ>@›_�Üz-æ7Æ{äO˜wùÀ'7µìù¥â{üÇíé,Ù�c昖ßx÷Å´ˆëè;¼ò‰ 5y÷eèGàÝó3Ò�B›_ímïŸÐÒÚ{Ú˜· uÌ Xñ(șǿý3„þV›_œ¹ïñ‹i¯ìñï°�½Þ|ü}÷éýí÷žÔ¼kœwȲõϹ¼»&cý´_s/Œ‡5{.Æ9ÜpÈå{ôÕÉÞ½¿˜æÝõ�ä}ê§žE $VžŠù1Ýý§†xnå‡C’û^¼2tÈÐîûN�ô?ùMÌUÆ\Ú �·><ôµëqL‚Íuî½!Á|Sážå§z7�^ºõ¼ÐºƒÀ£ö\Bë|`3‘½å�F˜_ºqnsÕoêÑh› ½‹tG= ÷[ƒ0fƒÉå§ÒØÆÓ@³ðº½—¡/O(¹ò´Êó�¯`>-´Ñg+²áÐUè»�ó Û�ûÅáeO��¶3òoÔ#)ozß–sÉçsÁ/{d"ȱ‰$ç1ß+ð”àò�çcNgÊ'ŒþŠ«vSÎîê>˜ç×hïÙ|åj"ü]–ò¼âš è¡8ǃ�¾£ñ#Ì} <Žò\a®X\g‡9^ ´[ã ìÔ‹p ‚ Äûwþ€Å~D�пûRèa¨ð¤|b˜?óã:®“/Ûtí•‚N„ùÙÂÏývž£ó/}}i7Ý|éÌEGùÊpŸnÅ–‰h'aî:œÛDä�|ûzòÞòÊÕèïŠy1!ú âü"h‹üªuÍžËH.m}³†r‚ÎÁ÷]Iãtó WùyïzßÖw¦–휈úá†~/ÏürÎ'ʱÕÕ3ó„7ù§›[¾õçùÁ#ž<üǹ¾‡_½Ößµô$<‚úôÝ$ÌÓr` ÍGÌ=˜Út&µ›æõw¦þOåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•OåSùT>•Ï&Mš™ì˜ÍD«·UOª�#¶Á}s´7KWϯžÔ6µ6�™oÏÄSÉhºß5 A�y Þ93\Ó\“¢ý±tÓ&¶MqMwM®�Ã2mP~�âºeÜœàšÚ‹&\“µJ]ð³«1ïŠ'èi�&bÚ£Óá_u�¬ð¬›EÁ%«¼âæDŽuu#Xàݼ̉6pÁ"Ý ˜£t°UÉ `«’EÕþêdõÕªkòWÀ_íµ]=¤G]º¯wQS4íOšDj›ŸJ6¥ãÉL<ÙUS£�ëb€—ý‡êù=ø �…~òøfÏŠ'�¶SÍK )Rt~ª#†—YÄô ö²îD~ª�f¥ã û2±^$$ôW:šóDû¢x¢#KâïœkêœdÆú ÿdú{¨&³ 3iŠkª7o°êMve?º$šèÓž]ïÈ,:úÃÉh7= MÑŸ¾¡˜1Z‹w-Ê8FÉx|ÔqJ-¼+Öž©Kõ%; }u©eNì¤ñ�fzc™UfÔQuÞyýŽ1ê/j<†èLËÆ�Ú9mµ‰žEÑ6Ö)>ñxrLð™´¸XØd¦/½°/K¶ÇœRA+ê°c�÷ŒVNñIÇzûÎY¥ñø¨ã”Ly2ñLûrÊ«—žn‰'bÎ9dV™QÇ�sŠZ²¯»±=]Rfö"£Ï2݌跅ÑÞØ¬tìî>˜“ÎAN)'hDØ£ 20÷³ åX‹Cvb5ý(�1ʽO:í£TO,ͤҎ»Ç*PÔ¬0žb Ú>;êØxR}éöØìt´gQ¼Ý9Z`5†“§>ÕÝ“ê�g ˜;#ÑÒ’�6aêŒX§kzÅ,>Œ*&àXVLÀŠ 8€ (|�MÀÎt4ãÄüT¼·bVŒÀ16OÅÒ3/4UlÀŠ X±+6`Å•ìÍD“ÎgY~Á1Ø-Ë™ËzRÉØ0°´ –’¥RÃ2ð)[Z,•â6¦k¸Bºe¹c\–�¡*Ò”Š'3 …,0�ÌZeÌ£ÏØ]^•žvTžÛeªó km¡Ø7U ì«R1—†±�R,~¯e3ã ;tRS¾TÝwË5FÀBçâ¾DØXùGpìs]z�Æã! xùy±K&Ç=U*’©”£6Ô:^×®_M&c O,k/ÄÆÎ/8êC®Ùñš÷p‘Ì/8úój—•Ò“ÇpŠ¢÷sÜ9½…s£óMe$Ž÷L©ˆ£ñÞžD´=ÖKfæE{JO&uG¡*ÇÛÉ%a+9^ )Þ̸Œÿ\y—lÖ¥SÌéʹ¹a<^Ì £ØY_a±K€õÕãiÛyØG1²½…Ž­óRaÎÏÕ–`œ”fO±óÇoø@±Ì¾Î‚<‰:ã‰D!Îk‰1èVǽšI9ןRÅÌF:Ó©nç½B�Á"sÒñ(‹¶·÷u÷ íaÃÊ^dô÷ËK£ýC¨pYR,M$Æ´çG&9Æ©Ãy`)íÙ18=˜ŒEŸÌh�&Ú祜{×Û Œ¾I⸗b>çKÿÚÓ£Ò±RdãÆëçSû�2�ìR£Ži:F Ž‘ìèˆgâK ÀÏ,0F–I4ï.€‹�ЕÒ×^~n3JÅm¦ÈL!烬T–D*n3ƒ™2c³Ü^q›)9·ç¡ÓJÏofÔÓ+/G/vÙTqœ)"ùTqœ)Ç™ö²sœ)€S½ãŒc©4gÊHUgŠM&•ŸãL{ù;ΰ_Ç™F±³¾ŠãL1±½öŠãL)9Î0{Š�Œ¥ãL)l•ŽûO]Yè £®,á`…8¤U:£tƒ`”N_Œ\;ƶ e2²vNÛ ÔVتD™9±–o¸$çk´%[¨¬_':rE°ÿ\XÌÅÊþs‘ï?Ó°ÅhŽ™^Юì9Wöœ+{Εü"•=çÊžs~•=çÊžó€ÝSÙs®ì9Wöœ�ÿ’Eiï9wÄ;;ûœç4)ÆPàF’§ hÝYeFßhtÌóúÒ� j†[v¡QG®?–H¤–:Å0ïZ”�ßkÚ1`¬cs‹ïèÔgg}* Ö`Òù¼Ë+WÜœ¾È¥V�<²ŒÓ—ßœÆp¦w¥c±ät´±é`ÆÄ»RÓ—ÄS‰Xfz:Ö1=•Ž&‡Ú•¨¬ÍåàUY› ÁQÉý[Y›‹žr®gUè* t•ºa1wÅñþ_ty¼»/3DŽKû 3žõ1'9Æ)–€›‚Öçl%ÆlõgFœ,¬ä�cì;3C3Stf]z ·'Öcº  °e½jFR¹/Ù”Óz†óÂÆŒ,x*¿`1O9½±3—õ€M< ,­‚•Åœ±\ÌÑ—n´Å}e‡Öt*‹9•ÅœÊbNe1§²˜SYÌ©,æTs*‹9Ž˜3,±Üü’ŠheÊ£ÛI¥»4Už¡9ÊxÁ­,Þ£¿Jåj%Zìr´ݪØäh%ºU±ÉÑB�‚¯£-G€‚åS©tg%ªU%ªU Gµª�ÓæYíH-ýzç*ÇÀŽyU•D)íÃþ©ÎÎÞXÛžŽuÔ?¥2¯'<íBnت–5"ŽÓ£åå8=F\ ‘æÑ×ÊF>ë(•N†±P,�SÖËÚ#®üŒ8V`&9§Kã8ÇéO�þ%ï£E±B|²ÌÇG§¯‘©]ÃŠŽ»Ï¹Â5úV!˜8×�ÇB¶–?¾Öa¯ËqùCª,”¤.VYþ(îy¥”Ëò‡sD*Ë£Î*ËeÈÚ+ËeÓ/•å�"_þøÖhÄe¢8v–£ י޶g¢‰ù©¸óZa‡}l¼i”ñjwl˜—Š�Ly2ñLûë�vûŸn‰' ’Ufô*;!&ûºaØ.)5{‘Ñ÷®t;Žø³0Ú›•ŽÝÝK¶;7 rJ�þt9½¢e•`Ú%‰q;NÈ’I9n©âf&�éT·óž¡‡Ç@®UâC™šH‰Ä‡ª„‡rŒÔ†‡*@•¨DS¿J4¥‘]M*8šÒˆ¬$µô¥ö%`º”àRcyÆ�)Ë`)Ø%²<ŒÓi•eØ£.…”�ZU¼ÐÀrlË�w^qû 9Ç£è=Ð,e¥mˆÃåå½…‘q¨´•ÖbUÙÂ(µ- ÇÎA¥·ƒÁŒöÆ©²°b¯X�µ£bV¬ÀQÄ©b€[Å }+б‚VŽV`¹:²UìÀR´ÇÈ(=;Ð1j3°bVÌÀŠX1�ÕhËÎ ,£Š8–c’¢\ ÁB0)zSПJut¥£Î¥9Ú�哱Ê]º1)Fúˆl�ÂRÉÚW‰°Q&\¢Ø#lTŒ!GK9ˆ¬Qz<í¸Å mâBd— ëL€«åþž¶0m_<Ý¥�R=Ñöx¦Z‹�½™þ„óµ}ýéÑw/¤KeNÍÂ>+½)Už‹¦å¯öKü£b_.Œ?¹ÑK3ëË‘å•p~Ó͖ W(0¡¡§=Z€º�UfÔQsìæÑÛ—îŒ¶Ç Ã-»Ð¨#·tQ]¸Ô¿×8à“6s‹ïàÔ'g}*Ù›‰•ÓÎníæ–«˜¾£Ç"Ë8. Ë;f>Ñåñî¾¶"ÍçG½{%Ça§b ¸)hmÝVbÔñ"67–ÑŒFDÕš'–ÖPȦðE ˜¡ñ…]œ”žî7Œ$É¥¢ÿU”¤RW’ÊIƒp¬ð3²`�/¿àœí(Ë™ËzRÉØ0°´ V´§Šö4rÚSEy1åÉ£OåÒÕžÊsàŒu²t F•±y±ð†h:žYÔ+ ¸|)ñˆD<Ó�¥·•ƒ(t¡¯è™ƒcÝl±sL7"CxˆØŠ‘!b:Ùá‹Ù¤]<Ä“vDØ1Ó Ê4EOE„VDhñ«£Å.F�óºŠ-¶)r1ê¼GŠ\ŒÊоŽ´t–ª+I%‹X3*שV¢ù$‹eX”k$§‘XJOY.ÿ8Hå›Òoôãá–ÂnIišRŽíÔ…ªÇ)þ>Šöí~Uzì�u1ú]™§hÓ•sîh<^òºTø�]šç`#ã(ç3€_ƒ)e)ˆK;¤HcÙŸ­­)›˜"5޵õb*R΋r¥Ž£<]qéG[K† >ï.þíÊ‚ ªRa%ìÍ`ŸKŽÏä•Êdb�g¤/E|8|°T¦TikàØ3�ÎXzV<]v«GÅÀÅ‹¥Ÿ3Ñ…ÎéP kžœËñÆáî+lí/«ÌØëK¶7—S)»Áæ–]Œëë1ÜfW†ÛØ7öëÂÜêÆØQ…ì!<Ý’Ž&{;�g»(žÑ_¾+'Ú²}9j¦Ã<1QìË&Ã1&JÅÌ+á•òÆ«M$F|•Ž94<öR*cµDÝ@G¢ ÃIa5©vË´ÍLv˜©¬$"¤m~*ÙUP\Ÿ \ëŠ'í?TÏï¡:í'O÷ÂT¢zrmG‡kVtI*�L¤šqÕ¿ÀR¼ˆU÷Y_�ÕŒ[ReVUU�‘VãfE�NáDQ�8Ió|q³#+Ïò2' *$™…ãENX *ŠÄɂȨ ëç D«-š@?ÜÜwh©‹e\ó\áVÆÕ�Mk®®aܼMQ]ëVDAtuW×°’›Uv³"+¸j8Á-ª¼â§9V‘E‰X�wÕ¨n‰UXÉU_mÁXÎ-)Œìj¨Æ¢²¨BQŽq3 `€€"^ðnF‘ zVvóÇ„—TÖ endstream endobj 67 0 obj <>stream ÕNme¦W*ºNâ44• ¬ ˆË1nUáÛSª›$ßǹ9ÖUÕ0 ¾ŸUÜ,+ðØr“ 5,ë†×JÐtÁ­²’h=ÖP­¸y¬P«^Ĩ o½ˆ/û›Û«¤òøNóúOá,¬MAR9;ê¬ WHlƒ>ð­H²l‘»Cä9‹ÎõÕ&ÈèŽ *õ�(±"GÅxQ"#( 8ìƒD£zTFÁw¹yF”¨Õ ãT²ƒxt¦ô‹š¯ì2k¨ìFgY£uÇÞR TT D›2Á¨6¥€úºÛìzü´¾¬‘p¬ÖÒq"™4ªC€ñ! �î:‹Å®Ç%Š\²Å¡€v¹>$ŒovðÁ ©ÖhŽ:xQeQ�Ur@Ànìf#èáY¨�ýÇ“¹e±¹ƒ»GÂæÚ`,/ð[]"ÛÛ@™É #�OÝñŇ³Æ =A´ g ÐÉœ68m0ZÏë_ÜÑû&„8JCÀF!‡|ÐAÙÃATx wƒX{·2;œ·ÉÄä,ÀñGÇ­îøâf²’34€od Q¢64t¦ ENÐÐàG}`prñ`*g ™UxÜÀbm•‡ó6Wä¬e­áVw|q³ •Å�1˜ QÃ낃Õ« Þú.ÁÁ %8Àzàd‰¶uÍgx�¾!kªf­ýŒ€àŸºãŠ�¤:¼&8XMp°šÄà�¯¢v :¤àHîÄ\³uŽqüǸ ­S‚›}h !8xMp°šà`]:SпŠDpdo !8’º¨zçmŠ˜­QŒ€à·¡5ŠBp³Œ£ F“œ&8MZ0æWQÈ )—^y2ƒ…ßÑô³?S�•³*ÇÚFPf „OÝñÅGr*3 Ž$£ÿ-q‘Õ7CŠ‹¤-pTfXoÓÌN›öpÜÅÅP¸ ©I†›äT\0$-8’ œKãÚßâ�vº -)³qÓlS3K…8þ’b(܆V! ÂMr*)È’è®Ö Ñü"Ç0íkì%EîÔº°£-ŠÎ5®ìù™Í`ç¡0:³„á¢Ã;•ši!’TIBðúߢ‘BVO !'�°…ñÒÜ�`׎¿œ·!µ‡Âpã�Ê Íª]ÚV•Æ ´¿E"'ì Cʉä+²RÇË5ö·i¦¦ÅF@N �Û�ºCa¸ñNå„×ÜsÎöé`Ü*DZ06Eä9– /itgEÉôÑм¦Y:ó&˜û!v%ÄÜaµ�\¨Ÿ=º�ecу5¾8c‹ŸuÕöPck«7�õ3v²±kkß®Õ7qβã]X˪Óòmp9‹ê²Äs§‘=‡µ€í�³~ OAà‘³×TV)àöÊpնߥÊ9£ö8áPwœq°-” œÆ±²^w°x�c eéx·XºŽéTOGjéQ­-�,gLN׬átMk"ºí‹t˜¨;Ò`B€ ta)t¸F 7KQ¦“D‚^\ÂÔWk| w]U³"Ó Ó„éZ²hÕmA$«.f5óh ³*ãuªþŒÙ&@§ðè%ªY��œ1°7jÍ%úi 8‚'£¢%Ã<’¦Xç°ëêjÛÛûº›S3Ø >\ˆg TÌBÂ0"Èx´Óž‘Ýý`¬™ [/Z0,HÔÑ*† ½3Ì.SLÒKVßa9Në2A§Œj”ÇŠ•ÜT_­ä 3b aTj`)™T7qÊ¥�3 üGR‡•x…uK(KäCo€P@,•fÝ ÆÔȇÅU–}† Î0Nq#ßåAMS與Vf«°ŠBá$·ÌÃ#œ(I¬ªÒ±Uxµ(*2Ϫ2y“ß0J‰•<›z§›Nt1²È($'ÄI–æ)ËSDÑ�‹ 9^Õ"e8y05<üϱ0±P\àün^”T–ÍQS‹1ô4˜ƒÌJcDt œ,JT"Ȫs¼$˜4*ž}b±Ýˆè²<ì�‘d–Ą얡xJb¡6žT‘å…eYeqØÙ»DÉ § ¢îšdY[Á9nTTD`�òG™çYc×UÅz$d£HÅYæéQ‹õ¦HÏ‹ö.¦«ÀM$�`ÆMjëƒ" &klšqCÓ¸9ÚKqÅÚ Z�³IÆÅ–Ä)*d¿+0as ¢•‰ ®V<‚Åã¾y`ÑàÏ H{Nû_±�|ÁE ‘ØœIÔ–ÑLt0N®Ì9­ê˜?ÿ÷ýü_ü}ðŸÿçFç÷A^ù½ò{U1ŒÏ£ÿ>Ôü:¶²Ð<�) ;»Í`[3™Öü�¹ M%R]³ú–/ïw!_´)8“Ú��šjN[àzMáJgr–©ç$—ÄÒ™XGŽ®ÕO.6€æ³õ‰xO¨g9àñ^ÔÆ:,Ý´úœöh‘C<”:”_Æ›«HåDŸ± ýòº>£¶‡@�ô· Ay:FSÊÓ²l@›Reh/ÞIUäéZ6 ¥[iÑj²õ- fi\“Ú@çB¬ Õº@k-½ ´ÿÑÔ¼0.Ô(ê^êkô´¯ãHK'úפ¶Y4MhQ€–0Ó¾Œhº NÕÎqÕöeR.�WÅ—Ç,Û2ÏÄo\ØK/‰u´�Qצ=ÔkcV.5;WþfcÆÀõjAQ¡+$NÄuE7‚êò8Lq!yîT[{y²K@ ŠåÊâƽƒ ècÍ7Ûcp·Âh B #Âj¿€zÍ‹¦Ï�ãÛ΂èô³ÁLúeÁE«rƒ V,ú™-µÈgbc€,|µší÷:íò¨„¤‘¯JÙ¤³ƒ=jí”á‚”Åý�–èHf£¨0¼�p¼[TÁÆì�lȤš„¨™õ¸›ï¶Hf¶Ð"™‰…²ðÔêµßë$Ë£’LŽÀ‰Y"Ã"Ì«$ܨ’•;Éd7Ç˼�b2¨²]Jn”MѪ×Ð)f�LŠÙAˆ™Y¯�ºñj‹`fû,‚™8 K­Zû½N°<Ú�´eµÐ«6‚ÙA„ËZ¢[›ž,è°J–x`qþYÃ7óv&ˆM£p¹fÅ6€N1 dRÌBÔÌz ÜÍwÛ¦¥ÑB‹d&f1O½^Û½N²<êhRAW[(Úµ"Û5<”GE×H%RÝ (–‚gÜÛô;dSï¬Rº’fÕ«ŒwÛ”;20%Ù®Û±œa¶ê÷ ë‡^n,Å΀Øô:«”�¹Y¯ w×çS‡Hf¨'6’ 5Có1‘×µ#É ÊF2CÑ2Kª˜Y¯°‘ÌY$³�4ÔŒŠMä�—ÛH¦·ÐF2 ³”‰¹Q¯ `�,—:Yº›�dÈDÍPvLä �ÈF3Cq²ÑÌЮÌbºúeÖ«ßÛ(f@,‚Y /£RsãÅ6zͳÌ@Á,fâmTlË¥M–²fŸ–:Èš>ºœµ&˜®þØfhI6‚ª”YÌP¶ÌŠ €�d&È¢™ ¤áfTlbo¼Ü>/õ&Ú'¦Ž†51 Ü͉ỉ™C»vfÑŒ3)¤afh3ê†ÂcÌT‹,‚™º“2µ+£Z`Ì™³ƒ/³bsóåÁŒZô2p0 œE>ªÕv¯+—.vuÌ¢•1�2ÔkCÓ±he¨C© �É€•Q§qoÑÉ„˜d²A£N_ã­�Œ–Y42Ún@Llõ:m÷:�réa׿,Ådû¾†rcÑHW€,*’1T(£JãÞ"‘ 1Idƒ:F�ºúK- í²(¤XŒ› &®z•¶{�B¹Ô°+\… ˆ�Ž¡¨˜3N×e,  �E"C'2Ëè:“Y§~o‘È„˜$²A´em½N_ã­¶™¦·Ì¢‘Ñv³Œ�­Q§u¯Ó(—GØ8ø0£­ù·}`Š-+¹Z1Æ$Ï ¼l>ƒ í9í¯ƒ}`è•cÝÖ·ªŒÿÿǺ?Ö«²ÿ7®*ŸÊÇü 0†ªŽÏèüÇá~Žm³ÝÖ\“µ]ð„«1‡y @�–ö>ÇO­²)kîÄ´’u¼!¢ï¡æl‰hÐalŠhs·Er lŒ`ɼ­ ×álŽ D;-ÑRØØ1Stšë;Þ¸mØ8É�:ß:�‚lžt˜Û'T2o%ê| …ðÊÝD!àp¶Q¢ÝàDh{%ZÀ ”`‹… ÃØd¡r¹Û,Ù@ç-„TÞV A‡³Ù2åŽBå6ar lÃ`*¬ü�‚k+†JæmÆä@�oÇby2ΖÌ@ÔœÒlÕdoÖ`¦üíJã4¬ ,™¿e“u¾iƒÄò¶mÕÂ7n Úà`C'èxK�íó6uð$ó0¶u°XÞÆN6ÐéÖb“·¹ƒÀ·w Öà„`Û'èxã=}r·~(Ñ_á›?裔·ý“ t¸„¸äm!°ðM hu­"s(èx{Šåo°ð-"*–»I” tºMDØän°à­¢¨u4™–·…d°‰dÓ‰­Å ›J\ÈF’Mõµ…²�Ž7“,eØZ²éÂlJPë(„Íßh² Øj²©½Y„Îv“M¹Í"ìp¶œ,}7‹°ÃÙv€ZtÝ,ÂgCʦçfQ¶ðM)K�Í"ë06¦l nY‡³95­(·ÙŒ`ÛV6Å6‹¬ÃÙº²©¯Y”Îö•M£ÍfÃØÂ€^Ck³vʾ¹eÓdídÖ—M_µ“uX›\– k§já]ùtZ}µS´ð-0Kuµ´ðm0KCµ³ð­0KgµS²ðí°|ú ­¯Ú)YøF™©«Ú Yøf™¥’Ú Yð†™¥¤ÚéXø¦Y>u†VPít,|;ÍRNí„,|KÍÒAí„,|[ÍÒJí”,|k-Ÿ>ƒSrÐÐ%#íó¯í¼g¡§µoKuÇÏ@˜s„ HÒò‚[F³¸«R’<X2Ï£”Ü*/’ƒâáe�)öX~p¦8g$Š—GgÿUYÖŽ‡ð<ù�h串Cžc9ÍYus2Æîç´d†hJœ¦n0¨ÑØaTžX"¦,ÌP)†"Pݶšsq&WF+†Yº‰ FÀÐPmEP1[¨èÉ^™Åj¨f…‚šFåo¨¶ÈÄ‚Ñ'«”uPo‘õTN�=¹ ìæ%àt"ÍYÖ%ÈnYÄ+ ÃbÜ£R�C×MÆmõ‰ToLËüÝ8d<ºa¥7#ÒQÈJì* $„«þ.-¥–ªûä‰2�¨£ÿñV¢ LÁ‡Þ€Z&? Í£ýb” '(¼›K‹½£½EóÖžUÇe]c}ª–ÙÏö&Ûm 5s*™R�§X²@ðÓŒ!\Áöá¡aÀk¬‡kz'|iI1¤'Æ—Y@û±F!%ä¶ Œ³ŒS]¼höM�K»Q”Ðææ)ŒXžw æqm FmÞïâ$뺇Œ$ɤÁ„àVî»Û hî²”Zæ'D·‚+ôúø’´]Ðzc¼�~.K¸1 ¸UÔ6]TIÖvSè‘<€QGƒ–÷ ë-5¹í¨Ém*ž3ÎçƎ°¶µ“M�;¹jì”l¯¦[°îEZµƒh  ,H¿†¹ubðrò�–ŒËz3ýÖ@ÔB| [óa«Ú6²¿Ãöz«YõÕööÚQY¢E@`Y$/O0£x‰§C©Œ@¶:¤Á„p²¶cÚ�_L;l>F­ï6!Ô�Z  ÙìVÛ½­;u6ä½…ø&>c½¶&ëÞ¨ƒÅ�é¬ùÒœ[{u@fh!Pç•ú�Þ2Ô÷º7Ÿ®±*¢·(ðª©ÁM?ÜÊ¢`|²Õetã9Ä1ˆ‡ÜÑhŠU<§fë­õǼ'¹wÞT‘ÕÞ§ð¥»óÖìñä3r]æó®± s”ÖïU^Ñ“i ˜âJU`P2/’Ç…B›Ô¸è¯²ä¤Ú)”ÀJÖ#ªîïcVbŒµW› ¨_´sET 6@aYë= ½Úl‹ùŒÑZ³’\ŒÚ[�˜×à�3Ã5Í5¹=žnOÄÚø¶).:£½ ÏÃ�YÇô ó€§),9I2hhH.Æ V1(i&Œ6ûŽø£ìæ‘¡=x�A#c\rÈ·yèptRâ©ãÄ CÅŸex�Î<�!V4ßtIÄŸœs"" ¢¢Á�áÊ’¤y@[XÚM€i„)Üð[–q‘["‰–‹H}jÈ� ‡XÌ»a¡ “]È�Ñx ø«¤2x^D‘¨·j0ÁŒvÄ~“%žådžÁ Sý•XHE/2°¾`p“n-•U\Ê’1È15ãÍ$3¬âX•=H;B7hŽ@­žê$hôçVmG†‡ ݬ]6jÞµ#: Ð�8¯{XxÓ9�Ü.Öò íd(•ßÍäu]xGkÇ6rºZn]hg@-¬ ¥›—ºŒzvR›½oG«càÁxzHÌÃhC±.4�TÑ<Ý u‘»€vÀˆô-ñŒŠFèÛ‚Ì®r0X'YíÂ^›C£œÄøº"ãm¢›%7ìVQ<‰WQĵWê0OIÐX ÆM‰-qõI3tPWÇÐ-h¥ šq*¢¿.˜k<£¥"VÑ� s¼J”=K8AÑŠp¨`²ç½pÀÊäî†ça€Ûîë)<ê„sƒ bGJ4äA>£ *<Çê¡ÊÐ?V€wà$¦äpª¨ÙS0¤9–&Ÿ¦�àêÑbŠMi¦„(i¾4,h¼E•<ÊÕWÏ¢•ë^;�Ó :´O² ðv¨ #w÷àÉ f“$‘Y. ’× ºšŽeóäÏèo‰Jëç~�Íø Œ AÁ™J¡½`dF�Ck†TŒöB ŒÓ•RÌÅ«´5 £LÑ×€@Å�o–¨±,ËñfW÷¨ñ0 ‚ÓA’°KpÈE惖¼Eµt©ÐÝêZ¸%Š–§–JPJk/ˆ¼zž¦ƒ“K&"¿íô›¨9Xkeð… sÒ£nàÇHK,zÐ~Íó{ˆ4�¤1Udh¬Õ#y�VŸß�GwñD? è(#—;ðq(uŽŒ¶Ê–* `¹ò*ô=¦r—Em]„ÙÒÕ¥(¢‰«>š>ê¢d±­G²nÍ›õ†ÕÒü2œ±DƒÎ…æZ 'knØ,®¶3ä€�W¢^èTÍâJ ƒjZCˆB+‹´ãƒÆ¡ Ó‚ÊÙú+ã˜àTý%+ðbžJ @�Fª5΀4Ø ´#! ·¤ B°˜´4UÄ­Yx¥Õ€' Ô¸kE¤1!¸sRÁUJ† 8ôペ1÷ƒ @ÉI™6AÐ"äĨÉÆKòËj¾ ÂiµÚÆ2GnÿöÉhUŸW“Îúk}v’Šl$ÎÓ^ ë‹ñ"nƹ`¶É *ý^ ©„æ’PŒ7èÐè' E{…~Ok22&1`Q;ÇC f Àz‡1Z¡Wa42 \ž‚²hC ŠªæÍrº«–å~Àq¹^h XQ¢¶å·²HŽ ,eZ*øu,¹Â(äèC5ÏõCaäêF9̓l™–ó<0r¼Ð²†wwuþðÏšö‰“7­Ì §íÛgbÖ$­�š5kòg–�5�އ{.h®4z—²(ÏDÞFä\/t�Á|V@dÁÖ§ú9«OsÇ+([¢¨+ z—‚ö/ çm,ù*¼5^~?¡‘D®n$�l~iƒ�WýøJ?4„T¶Í^R%´©83³ šÅq¬ŠÇO%A@ˆÊ°’ÀàÂV’)]4FÍŸÆàë€oªfŽ{ãé|ˆU¢S{Ÿÿ£TwN­x§äÕ˜±J›³Ø`¤`Ð7.Žav1®´d·Ä–ejÓ±h[gª½¯w@{÷ž›ÑPW$0€Ér"Œ 2Ôa< "ØïXë¢n§£�™d·ÃY‰LsÃP�Pf]�Ú�µ…97†QUŠ·m~*I®hИššj+z·ý‡êù=ø‹¢ýҔ胿� gªµð®ºt_ï"×¼h2ÚK»Ó¨ýõ7—öc}4‘ˆƒ”ëYoןlLuñ®žŒÛÕœêKvLÍvŠ«¦zrv–9j‰ì‡EWUf%¢ãy �I ꢬ‡ëEÓí©hÂUãjŠ%Ûã ãqª¢C{4«@4sm/\'»úbƳzWåVOU@‘†€�<žX´{ê—[£7tPµ�s¯å5úÅÞv¸ÅXꨆkÿxôdÅ¥t&sÕÎi«KÃÀKĨ††øB˜BmõxRjC²¶vM)ôt%”éqÀÄ>>ð ý¯ý³4*æhmÖ«ùœ7ƒí�õ^f„Þ+Ò{±'èµ`pÓ‹TúßÁK�gÇ 4µp¸åÎ-€v °<Õeü��J�4Õ¥;1[ˆ5¯s¨/�^ƒÌkÄÃ>§sÐÒžkBΓr‰ -I£Œ%˜Á(qœ‰ j¿@Gz2ý‰XoõÔ¹ÉÔÒ$Ý€àœ\›èïí�¶ÍöLqM�­!4µ$ë’˜ñÈÔúTw΂YñÆuŸFýOº´4¨fèLÕ¹T㩾xo¤ V˜_ƒ'm_\@ uÑÞx»½x:µ8æ¼ÝE¯uM¯vMmЦ3`VŸJvôÅ3N�:J-ˆlÔ=-ÌÕ9oolæ’X²±ƒbå=-5#iJÞxf\a'µè —âAÉUÈ(S1�°,´ºzœo!áƒY„6[ã�Ìc@ ÄŒ" bÏ¢f(2’ø«¼(‰`fD”Y ÍBQ�‘X?zêú½(鑚éÊÐüɵÏPøi§N(hC®`j…°u‰X²ã8Qv*UVð,´ð°ÊŠHõÔ™Ëbí}Øú�Êæ1É$îN3<ö6äô£&'uvÙØÙÙËL¡¤¼^`N"ÑGFM*íŽö€º>U“`˜hH'ßä¬J] @J×ÌÎNpðtK<3†mÎAíq­ê9É^0À¦Œ ?ŸÜØ—ÑÞaú4̈÷ö$¢ýÚ­CfTjsæx ¯ã>xÇ‚»Óz ¯*²ÊÊ*­ˆÛ4¼åÆe3œÊ'ÇbÅ¥rRE´TDKE´TDË †C‘8îU$SàTˆd’GR2 (h¹ÕUŸJ'céÞã%r*5%ÁQû‚u³è«§ç4Äý¾ÞÁ†ye}«Ü×·†K ÊJÊ€ŒE)n•·2‹{6¢NÄð2#(*Ãñ'¢K„›áDF1D¨Ä¢ŸÐ4Ò•aUSQr«ÅTMÄÙsäM Òsš¹ãŽÆ…³´Ý-§B=Ÿ@ß4ûM~�Ø—Za_öURÊDpO/V8‰ÎIê}1×üX±ï+�1+AgH ³'‹¬Èr"‡‡Ê7+s²Ê³œdõ`x8BÊ–$®‚ ´IšãÉÂ`É5RóÝ"ÙcgXcA?‘‘dŽ0Ž!E¦ádN‘XLŠÆƒ‚ƒ%?nEa/K¼®( 9Äb脲¶´„ÚFCTŒMi¤}¾«©AO¶œè)I@™ÆšÀ©éG1[† ’%ÙðÎåíäãÉ/wyNV³!ƒÑc0– ù0S�ŠÎïHGœ½n�ÃtJ@-Oèèã¡z»3’Ͼ–)Ó —²V3¥Æò(*2Ï+ŒÄ°üQ‰00yeEa�)ª²‰fpžßˆlM_xƒL8>Ô:î‹„c2ßyIäF`%&8Kµ"�²Äq,'‹<ñOˆ/H* UàµùŸ38ñ„¹Å`#ÿdœ1Б½#©Xþ# Z•ÙÐ%^QeLaªÅÌc0"�(qª¤¨’Š‘Oô‰œ=Jð ¹]´�G˜�Y‚l$I%8’8±2”†J‚ (Š B8¼ Rôi4ȶx¯Š!VÅ<­D’írÕE´¯ .%äRK#:”*ë•ÍËÆ¯_”N�e[¼kQþeJÊÔ/‡‹£—9ê2–½•Á"ƒ.hå¿â˜œ†è¸ßŒ8TM›ë�!ÕÛH1®s •Œõöú¢é¸ËüÙ(œû+Õl–ͪz`‹ëxžOô0)à `Àá¼*L"Õ&»ÿ?{ï¹�<’5Œžð=09)! &g  Θh0Ñ„žéþñ­uîò\ÎÙU’@’¶ßé™÷›^ëq*ÕÞµkçª]5” &´§~&£ þE•0øI}8ë"k.Õ Ži•«ö>ë€UøRZsuyŠãüÒšt±À+YéÖ¥ÿ~1é/CÍÝ[å<ÿ[ØÇ}øø/1��Óq ƒàs£ûÀuBëp8»ˆví¢‰DOØÞnEp\o6ÀqÆŒ9Ê…�þE[xÐñKç‹Î¿$俥AØQ‰Êå~kWެKc‹Œ(2óÙdîäù ýçb»BßÑ)ƒèo¡Ùr´Ù”ªÿš™š�­…‹j49�fQîù¿f°™ þíÌÎÙ†þGÍÄÿŠm»gîIö`®UÎ"ýS„ÐI4ÿŽ[r)ùiNÿå’ÿY.nAüd’À¿´�à?wŽéà/Nñÿm¹˜ôz¹ºlŒ»ƒå?þ£Ò0ÿݼõo&ÎÛæ-ÿN& ce¬è@c(ü&±ËÌ?W]ÐÉáh¹^¶†ë�ànïOÇÚm†µF99Ûaÿu¡ý1\o…v¸×Þl1�%GzÊ7ÆËõ_Ò7ú›u_c‹ð¯Ì÷Ý-À›þ "°1ÝõÇè`&1Z]uû2š­º“¿ßÛÿuvtóO¦ù¯¾þéÉ4ˆ�TÏ¥AçÑ »;ñ_â’ MÐíŠdˆâ>š$BÿKú]GR!‚aøº‰ÅÐÕö4ÃQøø8”EYSt“ IxÆóYéÜOÕä}V¹þ«îê¹ÙòèèÃÿ¬åÃÿêÁ3=ø·ù­.þµ•I�ÿJ¯•:å¤þ'ø jçÿ­æ3üÚÝͶ¯ÕÚ˜ÌW³½jŽöÙ;$? ÿªeu52�ÂÌÖ@Ão%cÇ=fƒÃQ�'Ï‹¬ugÃívˆGXëýò˜ÏÒŽ_�˜‚](¿¨õ�Iìh�'Û!ÿì·eØL›WÿÔ&G=—¼¬&‹®²%À¡»—ðûl€d‚t0DÓà;r{/S|ûq8CšŠïmfÐí/T€qÜå!…wx!·BûÚÔÍB¿!– 0xmÞGRÀ˜¥0RJX¯ɆÞOýÙ_i9n Áɇ·Ì‡H–d@™d.”_G•IÂë‹vê8´ì�+ÐM�Mƒ€;8 ~x»Òý.¶]¡ð,YäKs$bùÒZÞ¥ p­Á×ÄÎ&<¦ðø(–äþTD¦0È{šÃëÙfjD„£âR±»c%Côe. ¯$£L@œE€°4ÚVË…‚üIèè€ ‰öà=Þ€$ôƒ¼Ú  ù=Þ!t&cˆ‚ *À\V"ƒp�n¸§p­’b¿%�´ÈE© `E³{NäÐËèUð½)ŠÂ¼äЕ~4ºK;ÄWê$Eÿ�€ƒ±�oóÇõ(G´QÇFš‹† ¨`ŠdÑ- |Õ LLº� Cƒ6l LH±œ(§w»“ò)Úc�hAÂ_@ƒ8 A‘4tOlpIƒœ¨'ŠÂÅAޤ‰.‚ !ŽÇ"(Ûr�ô‚¬’›Æûb%-ˆ ˆEÑ••$£��ˆ!Ki â!Ð$*`†DFðP•¥*  ¤ÿa¡•óŠ•B|@cF E¡A×I‚ÈÀ•Ãà9�/4¸<_@š¿µ‚b~‚ǧ„Jj‹J 3#ÅH‘ Š03 �ð®`ݾ@Ó É û‚|PX‚n5ñXŽŠé¹#> ¤ßI ’!Ð „-X ޽‡ Ð-¼¾ø!´ažD·úñwx„È@&„N@›áÑ�€RÁD"A)ƒG"€y1H#*Q–‚4?!¬jÐ6  ‚ˆô#Ž…� ˆ²À�¯JôdÕ6˜ù2ñPñÀÄz¬Èz0ad)EP¶,ÉW�0\D …÷üƒÙuŒ4ÌævŠ…§ X<‰"_‡ÂJ6 §ÇJ� DEÉ�ò„à=`Dt� VR " f]‹-Ò»Ó[YŒÄ…9éM’{°A†›È¢tžâ0Ø÷&Þ£àdótÈðlCÝbIp¼>8. eµÇÎ"#ÖN4Õÿ£‡nP†×8hì%ê_°z4Ë 2� ºe1PT=d�R÷¯«í7;ªî:Œ�¤ÑØ‚A‘»B ;A’ˆÎ¼½¾A‚Éܱ½o @B0ó ˜Âøv`ï Âu(¤¼€ ý’q—Šƒg-SœáÇŽ½&à`ÐÄ,  wˆªP�e+Alc•e€G N+�ôVsÈÚ¡=¢~AÞQ�`ipˆxÍ@w­€Í'yÛ£1ÌÆÀo<<`;˜�M�Àþ £â �†ŠòD^ÏHçÃØÐÐE–ª‚!¢‡x—Ô00èzÞ%AúD‚ Ñ�§AÞ%Q”íªÝ#g@Q†*j_Nô“À½°¢Q¶å�&~~à%t8ò Ñm¾x>ÀµDX3tÁ/–1i]+¯"h^¤ä*ESÚ[?¤Ÿ€‡^6º€ï6…C�AÄ‹Lˆy�çÜ1˜ ˘¬«±…‚¢ù£D¾‡¨€Cf…Cá@ErHñ¬M�‚3pì*\´™T^^#uiÌŒ)ºÛª¼�Aƒ;Ä1 p…\-\ †#t§7…t>¸ªËk9îH Y™ŠÙûÃ!¬u‚X×í'Á¿y¸Wºcä@�ƒgØÚ€CH!ÉG—j‡x�˜E5äÈ(QÈ b(¸�ÔÀºZ*°�ýÜ#Ïœ¤¬û¹½ßA£[€‘!1ºýf�Älˆ}j])Fá+æ¼%„Þ�BÈBH„�‚ãÚWúÈKSVh x�Q¯IBp�‡¢HðÊY�Q€ ÿt/96à"ÓA¡�\"l¢Hô]ƒ‡B옑†:²ÍÊÚ+ŒS‘ [ 6°gPOÀ/($&°Â§ ¤, 'iŒ‹nÌ…¬'‹UˆyP50×4¥êž2R+àö¬„„è‹5ªè¸ ‹�4#ƒ‚v^€kÐ ï0£à£áºwßȃ$ðÑMÀRhRH»`Ev|æ=£0¢ˆœ*Z„öfƒ”ˆxà½À3à­*‡rD0XÒ¨ÀÐÖvð4Ã{@bäMð"«êÝÒG‡Òù”z·Ø¹Ý{4Ò&!‚ÛP�—1Ü;0óÀe,Ë3°ø^?ƒ¿Ï�8K�´>°…‰§/äÛ*Å_=$±ç�cž}| q0Sÿ›"/ˆó7�K A9R¨à˜�à•#Ã;à$Ð�⹈>vû•f4´šn ¡ ä¹Jd*†ãÀÀ(k�L/f!tÖDç4ṟþ1  ËíQÎó1Jy ‡ $€·Ô¥”Šù›ö1N˜©hìDñښߣ…³TžK>¡$Éa©íÍ’7>ôјþyòUÔæðFuÝO'_š žäÝÍçb W.ßLµ‹Ür6..ëxŸò‰~¤mQgÚK²’ÐÒ+ß¿¢w¿ˆâ%¡)ïU:rëîŸø,ÑÚÇÿ@2‘w°‘!ßû”ò‚$Iàên†°èÒ�Ê0 1B�v�2‚·Í�3C¢:pPP4ŽyHB&/†~œ Ĭ }XÁ¢£rB l¡ ˆo@L�ÆEÞ//çHt�Agî u¤‘1¢#x÷ƒÚÿâeÃ�a ˆ^ À‡R~à<ూ[�¼e'%8Æà³ O†ÄÞ! ª"7D$ìCÒ²‘±†~áQâ°NCÙ$no¾Á]‚¦&�fÀq8x ÀÓ 뉽b¡ŒvÙ“7:ßù=AÞ‘Ùÿ“ºòè/²€¢±g™ÍI€cÇçl}È’‡�o� ­òL*…UàÏðg�({ú' [eœ[„¿¢¥`90`gÁ¡Äα&xUA–à© Ž ý áP ðü8 Ä�xøìþŸÌƒ Ðr_’�BwÔ£lŸî¡�ù€¸ð‚틬à€ÓÒHŽÆwú Žwiqì‰&œ/”¼Å³@b߇DןrhR�?‚ú„,XC@EùäzpÿO�%‚ÁÑr'௘DžÈ4òHC˜¡à_°š º'6Ä'±A €SWŸäò…ŽFtú1^ p¢éê�%ýמ�‰“µ8XbÇÃ_QŶ‡½ËÔr¶\_æÖËÝj¯l�• ¨U`tF:A¨8ʪen”g%ñv™Þgn¨}0 žÂv‚¦ûU”DA9"Ð…<Ë1Jç›; (¢Œñ!#vȹ}Ì„¦ØMéÇ!(è;â%ÌJXî1žŽ2ãüPРÀÞ(-ì�ñŒþ]Ë `HR–Â^ |©@ †B4¤ƒ… Þ02¸— 賈*à€£qòGÜÄ(n›=>OB6 ë NT•HÛAlE°(¤cù<9Zô2  ñ$ò‡ ˆC¨*SÈA*±PËs ˜ä×’ûµQq ôœKôÊ“ÍVºx,ßH{¼oGzÚŸÊ©‡�ŽÒëøŽÖs1Ôï\HÒ‹ˆQ7ÿ`´Ûn—‹Îò|¯k³ÛKv×Þm··ÿEq[±£¶\ݯäo¡QÈ÷ßkÝÅpÖIÍ–›!ß°*´ën‡ÙÉp6f'3t·b½�†ÜvÁQE„Y“íeª»Fn6ÆËÕ •ÄÁwD£< ßN;¸ÌvÿX®ñò°Õ©¼(—£6­„ùLÃÐæÃÅðë¢[…Åï—aüM~Á°ÿ¡R¾]†ª#—ŽÎg xìín·ëI8@¸ùןXƒÿù/éâú—´‚àa6X|qï‹øýÙîo-vØ›ÎÝõ&"¹¯DÚô�.ZUæÛ¢ß7íPÉ ßLÀd#ûöJ�År14@˜Ù²?ŒPFléù{ÇÕ›,€(i`lÀ�áöâôø¤­iúH R—†Æ?A—‚aü“³úŸ$èá? ‹:jú7s4Ø»írþ÷j²ÿ9> oºhƒ²y bFÙñ\.è°Tþ7Héfô�ckü7‹Áf6éÿ§ëb†¢7Z,E+?û]½ZcþÇd€�Z99ÓBÿW3 ”Ñ�¶$ÄÓAæÔèÆCስ“Ã[þ½ãóÒd%P ­úžߟF†öçß=ª`Ї¶‡O´ yjTÿ4¤yþîQíë´†Ñ[B¸;/GÛêz‘¥‘Q¿óoà`½ØXîÖýaÕýŠŠü�Þ•§RŠm»ë�á|”^ØÒF¦þø�¿Ùí­Ýæ(&»\Ï»ZT:äÑd6Ôm,¬´õ|(Rl×ÝÅfÕ…îú†4¶¼ýßÌ–,þÏ Àln‡8ãod�ÒÖï‰Só7ÂåLƲ0‡¶ÿæƒZ,+gÍ—¼ý¿ùà& ˜„Y·olΤ­ÿ ìíiÅû/ åFéïÆf¹ÚNæ“¿p�Ø¿ NQÿÝ(̇Ûî »íþ�Ðñ° „µ#2'i,H4$gÃá9À­CÏ¢»•Z/Whý‰¯t?v*ˆC{Šƒ'„Qµ%È9ˆ£¾› ×Rûpf&>h±"ÄcJ¬·½ew=¸$��e<¤¢÷!M-Qç pÄ¥—$ ëÃYsYçÁb4jËÍዟRü{è5’2þ©pA ca%òöxöŘrÂ8Ÿ+ÃÁd7¿¬7ËÙN(ÎÜÏb¢@’—û•0½Ý U¹.†ëËÚzˆm•�ãp¦M¢º¬ 7ãËzwJV^ þ š�½QÝmW»í‰wö§vª Wî.>vÝ�áem¹Ú­F¿ ²ßåt±ìO—íƒß¥ µ>©3m&ƒËÍä/¥B WÝc3™ïf]–jP'0–îvxÙCUË©žM€ºëŠœ×?X\´«:¨Ùæ’‚îD™Q #�´œ �Ñûôª;(°Ý¬–‚dr"1«‰OÑjŽo ”ýÔ�M ÁDá2±Û.÷948Œ\íj¬íÞ×bèºÍ–ä-d<ÙT‚*ÚÖAïÛŠ™ê.þènûÁ“2†À²³þcx‰ÖÖ/3ƒÉ¶Û›Ì&Û?å<^®7«!V{9`ÁR�µYw1ÄÕõø…ÆøIÿ­ìl¹\k¿Dµ-At`»B_*û©£\Y«»˜lÆÀº¸�>`‰Â-,Ãf'ë�ð †DõFF€bä“8I"ˡ£ M)zM²¥†³YæŸÛ½ù1ŒÅ¾‡#$ŒŽ½1ì/ Xl¦ ¾¹\IGΑƦŒ·¨Ç3fƒýÀå�Å=MjÝ5ñ¦±ë�MÈ.ÛMiÃÒðÏcö'.G{#²mY¡�‚ÁEF&÷@#åìr –Á\cµäý:YîuáÝ¾Š”J_éÏ&+�}´ZöOP( a7âü{"1t�N—Æ¢x–íG§%òÿ æHî>Iž »º_"ÈÍ–@‚úpµ›möækOÙìÖÒYt8ŒDª¬$ã#|„Äo€—²»ÙLT…Âi*ðôØ6²"wÛÉ%’îFne8dæ½á ¶^¢TÒž»(µ–íñ¤?V¶Ä[Xõôdò@¡àž‚jR!å4©¹P�Áúp``ž%°5Aã†ÕU·¿§?­Ù DC굨7Ããæ�à?ž ©€»4›,†—[0Zz|‚˜äúÀN‡)Õád!ߨ®d\^ãJ8—Ò aó83øs—�Ý cs‰‹..«¢¢ÛžÔ��~w6”³$tLuà,á¼H¢ƒ#èØî=P,E2: s÷‚ 9­¦xæ$mÁP�ÔéöÀ`'å`�ª–J™aƒOÍD–ÒfÜü<Áå"/YqÓn̳¤”ËIMB\žZîÄ Õæ5D«1Oˆl�»Ûu‘~»,ÿÎÔkyF¨1œå»[Pxå%0 ‰6’0K£måŸ iiKéã&Ú€€ ž"^7’Òʰ[ƒ,‰Rêë'ˆ�·§9K³Œõõ˜T‡2Úm[“á?`Z LߪšêF¶}™Bº¹¼£Ü#M†eþ¹Z®·¨YªÑИWÅw’å8n 2 ê'߬”/“Ýþ�‹Á¥$;*�žÕšæ8>튫êäéŽ/å_: Üþ~3ºMl$/KÂ1µ®™4Cd�Ã=€�o„*ºŽm;jWXôg»Áðò¡Rœ… zkãT’IÑ™$« ÄDŸÕÅ{%—þ3Ý6íÉb°üÇF•‡¤í€áÿ©  ä±ÌRrârõçÑ4(GAQ²yotÿ@Ä@'ÛÀ,(e€ÌÚePP¯ÌYo¾õ'Œ*tÖ[´`Ïz‰Qæ]Œ¼$¤Ì(⬷H5q;õ!Ï�žzisyð¶Î$:«à5 ê ¥œ.´x¯ î… HuõõPŽk9ùø= {D£ù¼»žn”ÍÕˆ.ï|·‚jÃù4aæ§ dµöáÍ·–Þã–}ÔT²=üÄœn¶3ßj5˜ÃãÙBªpŽ0ïÏ}âªÀr;Öã?IËþüÏ©ÜËQ4D›}öYÇ�O[ȤÐñd¬—ò©,ó‰d]dæû< :7o||I‘!šáöÝÅbyÐ]Çó€‰i¹�Ž\ó w‹þ‰&ÃJ< tmŠÒÿ\ùó«6Ð`#¤dÿ�2²Ë•6BÐv¹ìN4ØèpnÐ_ê6@ ]™ÙQ›`hˆ–�ô,è#>'ª Sh)I¥4Z~(• ösÔZ®•-÷¶JÑP¹æ¥¢xžÒç(hþƒ¼�Ä S6wÁš õû›‘}ìÂë6Úmq­nÅ„F»Åð£{ØV¤Ñ¨7Af@ â‡T±Z'£Å¸¾·Ñj2˜­Ö£å‘3rÜì j Ø ‰*7Ðz+ ¤�¶³áHÏFÈ�� 2¨o|Îêw+Ñ §ÚÊ:V7šx‹G¯»ÖcTÔn-9ºþDSäzLÀ½8y­§ Úø¨€æ€Ãò3�Ûgü80[t‡†ñ7xkv°ŒšˆoÄ+tÚÈ,�ºÓ±øPÀ5ë®|l'Œ?ÈPZ<7–'ŽM;ô¶�Ìt­j³é÷zηYÍÄíý¤º®ä›ugCqˆ'Û�O‘býqš\ÐFèGÍj &+a ¢þ�ñVâÍ|h™V»å…ó'ħ?[ûöv�?[O¯­h€WË­Žü¢– j 9x4û³^.ÛÞ¿5 —þʲpÂ/BQÊG‡xÛ}�”.{^¦×t"оȳP ê¦{¯E¥1‚ªÐAK©;ªG@›?âSÁ€BŒ´Z-å; ´" E3�¨rÃÇ\Úc@±‡0Aô» 7“�…„+O™ª­žÎÞ#¹ÔW‘xÈxË© �!uÕ.¹N�ã'#áß^ß{ß�¨'Ôìœç³=ùåÑwBl+‰¿¥I‘À!1W›üs8« ×èÖ¦oê“Åt¶Ù‚²Øïpüÿ¯þ„W6ýõhý%Ca1½DÇ I�ßg¢ŽVÜÇËä'¢æñ''"Ú‰FªPÒC„zh2™2»P­˜ì˜c1:í¯æC‘l׺Ž&£Š¥LGnM¦u›0Ù˜|=®Æ·¡I¶òòW°ú¸gm¹ò꯿þ2™œïi“Ée7›LŽ¢ù ”3Õ¿ÿ_ßHøpµF_› îõc¬wðÇÌ%ãÃÆÇ6FÏñÖë—>Øíøkæ½_(¢¯ü5I#7èk•oÜ|ê‡Ñ×>þšÞÑ+øà0£¾¯ÁÚç>9£èkóš³ûøìB�ÌõœuzKÃ'Ï-z;“šlš~ô#HûêÞ |ð’øi65\¡¯÷è«7óûr ]ø $©qo�¿â±„360?<ϦF¯Ñ¿Ø'v5Îôš„9{�Þ%|tùÆE'ýÞZ¢ùµ±f3I´v¼fzWáçôÈž·¦K;ú “ “¾°bâ»Ó˜Jè •¾zï-²þ×_¶ÕÕ:βÅÉÛô>>Q“7éÏcnq>.¬è/žb4y÷#aò\Ó'þGÉÓ«5�ÆbFtvwð�ð6ü\„aÚKoðót"¶5‡ÑìT;ð¤P?`ËanIÞ5n‚ôË­�Ì%Ÿê‰úàÆ–Ìø- ÂÇáûøzs§cÓhƶ|på’/ì{rxâ_�“¤„•½V�ÏP¿’álÓ¯Ä|ù±Ë^g U–-õ[©I4vg*e2þuÓçÜ™rö–¥¯vý¿þòO‹%“;¶]s…Åp¢á‰/R“�ÁöÂÊÍ_b¾ôpsÃežFÙd<|û9õ—Fn†›?“÷ l*‘Â&_ÍôÏ.Qz´Œ`&?ÝIoèî9]ìÖä,>£“³€µÇqþ͈N¬ûÒ= ½"ñ0ßry™hìLcw2C�r ríuÇSö^"èõ™Ó#ï �NV*1å”òsùæá¿L'é5Yüý¹É<ÈšLé6<»N™L7Å-ÂÓ,Ì•Óõj69o¾L®pÈ…yÏ+´$ÖñоY²Že�ø‹m{gîøÆùD�¼ˆ·M6“Ùö6Y<é[Óåˆ®-Z ïÛÃDÎ丙=›œ™ÆÒä*E|&÷�9iò´ÞZ&ïKæÓäëy�&ÿÇ$j"æµ;¹á†&Ú²½2Ñ»{Ö°]M¬ÇòfâÈÎÚŒWhS(ËäMá{Ó›)Òïà ™¢¶6gŠÅŠUÓM+úaŠ/H·)v¥M©gKÇ”±­¯LÙÚWÜ”·®^L…êÊb*yw S¹kí˜noÜNSÍÆLw½ÄÄÔ(TÓ=ñpojí>ͦ‡¥'czêDÇååáž3½ÝÍ^LïÍ€ÇÔkÕ¦ÁÃêÊ4Äʦñ²»5MmDÞ4?~™–U_ÎôÕo™¶*o6º;³e•¬˜mI‹Íì?ܛݩÂìÝXßÍD¥1Óde~a5>ÃEsðÖî0G‹sÌÞ½6Ç×�_æÔ¸Þ0gßJŒ¹ðZ˜™Ë/ùª¹:¨0æúìna¾ß¶šæGúyIÌÌæNÃÔ1÷æy)PæÉ=t0·¬^Í«Z°P¶ö{Öbn¬¯,6æflqNzm‹·Áæ-$ý´l´Ûœw7–ë÷Èȯ>YҷŪ%ß ²–r{µÔ^îKó3굩Òç…Õ²¨§Æ–�-ñqe®ÞŒ®ìžÔÇ•û-7¾""¥Ï«€é~~zé|]ÅJ+ÓU*MÚ¯òtÂ{Uq·WuÏ&zÕö…sW/þVíª¶<_�*¥ñÕô}³»Zms>«)²‹^X­¶‡Û²Õ½³¿XÉÛîÂÊnnëõ­-fM£†57¾[+¥¨ÓÚà|që£yû`}›M¿¬ƒÏ kýì¼×¬«Qn3 ºŒÍ>ÜÙ|¶ùÊÆpæˆ-\#ŸmñIÂqaµåØVÉVy˜.lM›'j{ºËõl]bÂØ>†�gÛ"ÝöÙv^gÛnÛ´½vïÐÿ`gZ¯>{ä.òbO––Œ½Pm ìµ—Ø�½=q¬ìo»qÅ>bÝöy¹Ð±o§ñÐöXÔäð�B6ĆÑÏàÖ‘ÉFÐŠŽæ¢as¼¼tûŽAqUvÌ’ëØ&Kf§=9ì;ý)wÍÉ•Ë1çÍÛÆçÌ}¥7Κo:p>SmçûÒTrNbM€âüš.kúËíòÙž-.ö5ýåºÉ3SWž¾ºîlË®ëq9|sA ôâšN^Ÿ]ÛeçÙít~¼º©à²ãŽäÍ=wú�¹o=é™»]yX»»æ�ÕýY úÜ[s�»°zKÒCe ·žkïòÙ“Ùd'žjcñ<¾ÖhOÿ�Îxæ½iÛk^4§^¯5æörao›¸ýj{K³ÑÒÛ ¼ÐÞ÷—vÅ;õÕÇÞÝÇás'Ÿ+>ÖÖ›ùâã@ñ•Z޶¯U¾¾òuK÷y߬¸˜ùÍEúÚï­×{þàÀð§vù75¼¥ýO÷Å7?0bÀÿU{ëGâš ï-Sâ&ÐÍÅmÍB´>Òm¢wGˆÀ%­GùÂJ’·N?m8Çd¡KTÈû%G‘=2µ$ùZ‹²~Mµ»©Ø23£J©·GêÁåËQàÞqÔWÙb§�鯂fç;� ¼ßÓ5.Y¤_CWqú³üdÌí*qaeüÛ”›‰^s6¦øè63®«-3|¼Ú0újpO]Û@¨Í™¹Tʸ÷W��¾÷ƒ|y\ër%oØ ùžg³IƒmÖ¶7sÌØ¯Ð£�s½0,r²`Ïro¥®£¦Ü`½tq›²-•j;x�ϯ‚¥T’ >Å"·ÁI)þ²TãTˆ–j¡¤­µ ÝeÆ×¡÷áÈ{ðÚvMïÂá¬Ù:ë&~ŽWáI3š¾°F®J³e„I岑tÚ¾‰4Ó¯åÈ ]´G¶]¢}M8,�ëxêsr]÷ ×Ýà‹óúkôôõÞ<¦¢1×À½íŽûÑNëª]tÌ“+­cÑtï5v[rb�§ Ì~l5YÙn¼ÞÔô&v»~½©®Êµ›nÖ“¾Y¯º¡¸¿šóÇm�7VS|0Ÿ®¦·×i‚î>O™ÁãG¢ýÑ%>íÝqÒ~=ýL†îvódiE¬“oÉœ%¹Z÷ÝÖ”ïÖE§T9–jl·ÅÔ¨—k¥¯vƒ4W½Ý¤‹UŸ/ýÚ'Ò«÷J#ã·Å&™dÐåÌÜ¿˜™‰kþ˜µ·?7ÙˆÊÞ§÷Ù^u»É™ÂÎh.à ¾å Î[€’{µö+¹/·s�'B¥T>][OóãL,?wÍ> žf)VH8�Ÿ…ûç~ªðÊ­‹Îu[Œ -îb£9~-Ž[ÃXÉQ}Þ”¢Oo­„t!З“mÙ\?–£*ya-7ì WyÜzþ¬8IS«›$S•æý„ª|&#¦[7÷1¾M°™çÛvÀr{;¿~IW}•l¤š~#¨ê³yç©~e¦ö5îZj…›—]­³}ÛÞ™^G»»`vi¾«†Ö ëÝÈÍ:ë�¨ßП\½ôßÔç·÷ņh»oäüõ^ã­ê\5Mæw3ؼ¹nÖÂŽjóc;êÝ»ú-Ë}ò¹¾jÄïî×ÍÈ´x‹’­Ê8Vi�l™Ï¶3Ù`.¬íÄÇè¾ý´šÛëQ,óÀæ_?ªnGäácZé?ºß¯¸Çôë}ïñõ™ >™º“ÑSx\¾yjzÂ˧yÆY~&G×s‰þx{¼õb/Îhßô’²Nž^^z«Ø«éÕg»°¾Fný×û»FùuÙœqoL—µ¼UMO£· çºïøîï3�‚ƒä:ý‡±ûÝÉvï©9}{Þö»W…ÞK÷&ÞjwŸâµFwW¨Ýõ"õZ­×´j½µ«Wïo·­ k¿±!ŸûËR¡;`=Ÿƒ»>±Ì[ÏÎ!S$ÃZô)9œ¥"õ�ÿê�ªí‡Ýh:ŠÓ4E>ª [çcºYšÆôÝ"2®ùç­ñlº^O˜gdrw~ž,nËà}~²µ~á³ñâž®> ÑiÈ6L[é7Ý|®º³ëÌ]pö¸#‡sóÃ<6�_7æó7*[\Ø!û"c'_}?]z8ßvYÌÓí帻^QDÕ²ª5:ï«¥ÛT¼°~ßc�¯v¡k^›hßp÷½¶Ö—Û8­£Ðÿ‰íÃYJjóKž—i\d®Ø`Ñèþ1¬ìfÛÉj6LÈ7Ð$sØä¤Öáaßœ^ÌÜTmÏîëvÔé>xŠ´­êMÆ×¹ù8ü±0³&�Þšt}›+ö>Ÿa-áø}.VanÂå{%¾Þõ¹l†ª­€Œ… 6éÏô‡‡¸ŠGÞ|®øµgµ‰oJ”ÿÂ�”Mk±Qq›üÈß•ã×̰áI¬ŸöùìG ÊƒG€Ç¥³Ö0÷”Û¦?_“Ì“×ñMy”ÙŽÝ1ֲ˦™«vòsfo_XÓ#¢ØSíìŠ �¸ÖÝóK¢™òµ´�JÛ…_ã×Óìk<¼ñÍÝi�u—uä£ +&Vö½SÝ¥G¯mÅ5áQr¼M�¹'RFŽw[ºO–¿â×àúðýÊ›ÔÛÇÛ>Ù¾PhdJzƒŸW‰†×²àqxèvÖЧÃÝÏôwŽÔ˜éD®VÚæNÞzÞQLtAøÎk-cºSôiâÎŒÊc2Iø»Üzrõž¼É™õÆî]»_v‰rÃö…ðwÆ#Å1Ñl¤õO,úö¹;Z‰ø!â‹NdáY˜Ü÷ØO7- grmš„')æ—¬D^Ï09ãjs~�ek×(§¥�?Œ*2 Ûæ Éu'b¯Š;Z|*Š@?^@�ÑðÔZvå¶�Á<Ñx/¦ý“¨#Ëw0²çÙD³²üˆ·š…n6¼{¸°^»‰ÌËž«ŒgyKemløæ|Êô§_6�Y—W̶g{ÔcÔž¨ÏV.i»»nÔŸ�áêc—/Qzl,ÀQ=¨pñy'ÞälÕTù«IÊL†Ë–%ìo2PÏf;NÓtîb"è)ž ³�žOe–Fò¶ Œhn™ñ4ûQ â]ûáÊ‹²4~*d×&w44jÒL—Jyoö:pâ§h,®ß¼Y‰[“³"áCsõ|�O.x3q1ñÖ�àO‹{¢ä˜gàÏ I”ÈA‚ÿT|Œ†àÓC ~ëÆ¥¿‘àKÞZv…KŽ�”øâ'|r†jøñmþ�ÿãXe¡ÝM>}¦ù&¨1‚B®2RôP#i?Ê<­ìB‚üþ�ât�°áQBÈA/ F÷ˆ¾‚«Ìÿ&t†G…¡ ·•$P>Z¾Æ´APp�ŽçÉÛÅmõÝßÀŸç„””|ã·¸HÅë; xz>ÙoÅ^Þû±È&JgjϘÅ4à±ì'‚2åDb¢Bóç˜H'9øv‡¯<¿`ÎA�e8à±ìçR>#S‚GÀG%<•~(ZŒqŠ-žLe騬r̳Š&±xzcJˆä�Œ5V%*æ ɘWY‘“U†É¿#ÀÛw!ÇFú.îsLõ@ñ¼ìÉÁC‘Ï*O;Ô#�#PBMTº£×�H™” žAüü RãLò‡ædœðÎ~âïðbø‘úbžÆR)€a;Ùªø  ƒ)Èti¹ºþI v/”X$ê£�¸•¥•Â`$š­Ò"'Éé…5gÍuÀ- 8X‰o²»³^g;Û¦+!j&w¦õ�M™÷JâNH¼e”$mwaÅ�ï¾€ vKB32K)ÉÚÁõs>kFS\䩜MÐÓ«"ŽärãáÂ\ .ãõŒ˜téæ‹‘BIv†‰ú¢qŸhl óŒ»ìwȟβñ�u%uç!øâž›_‰j*YC>Œà]Íe„�yaò‘Jœ .Ò¿¯'¸—b=]\»ÞÕ:Hò¯…D©}~²€Ù½ušÛT‡kÁõ+³I0Û/¾}ìàÓ�ô#ä]ˆ±êŒãî_‡¥ôènÓðOjÏÀ’™¯ïoÓ”ùY?Ò ….¬Ò`èÀ¡hh|„ý�¨fÓŸíNjòÉú#£¹õü[ 4‰½s\}°DÈyþ‘àÆ6f¯‡®€“…Îþ7E¬kŸˆ¥?¼ÎÀ{G­jO�Ý�)ÿ$ s%§“,™Ûû²‡@4ŒtjyL~J[Pò Ìó¼ÀœD´‚ [ŒçóƒÔò3ˆ,þ¿Üû— šK)ÐÀ�}ïÄBéÜ#7‚p80ûÒFpÓ]¯F”K½Õ!FV樧)ÌKjüb »c¹NGä¬WÌ ¯”œVÜàÚ×F™ £LË[rJEM‡ûDÌg0)y‹¨ýtÈv@ħû·!#+&ÀEwå»sß´º_"€&�”Í>ŽMò¾«‰Fnð ó]Sñ{SÏž�¨cG Ë�ðÐc7ãÍOrè”*@yëBÍM¦³"{ñȽÝ'I’Q�™92ÚÕ>Íûî#ψìKœlòÞ½vV&0.¬¡Yv9Òârß²)J¯´3ƒÒKK3ŠúòKPl–î1ÃÆIé• ‚¤÷89ë¬Í"Ùtà‰rÇ_]Ç=ˆò%Ý–%Ò›,wƘž0/1¶¸Kûê/Þɱ7QMÖœ]¤„Ô 0Ÿwõµœ¤ý‘¸HOûÐ?¾½#znär騠AÛÑ2óTr^��“9·L²º£Ÿ€ÔõMÆíbG‹uà;ÄJì•å+·¿&‘Q¾÷?d¥]ñ›�ÝC½ +¶Ø×žG6�û–Øn¡%á€8}Û‡ù{Ф‡«j»¬¥ÌXÐoTºÔ¬˜à¹Ö¬ÜCws•é‹×ô¨™]X3žee—ÄÏ™~mæT¸KBfòÃ:…2sÿm+Ñ,Ç‘†¼ÇÈ_;âkoh—¨Õý¯áÉ[p3ÞvÁ¼HÜÞEýÀ1e8(/÷ÙNdìW¥b_s˜äÚÓ3<<@sµK{«™oy„ß`ŠÁk^}y³ŽeÈ©xDöÊêÐÅÞ¾"”o½ÉÙœ¿LŸØX¸ú�¬BäñЄvh^ %¼[º4á&áÁ ÷uÜäÉ›&BOöljÈNÍt—L΂– Ay¾&ñpõn†'L¢aޏ¯ODûÏ 4éJ¢ÞŒó†e“šD+›x8kí²7ìC.u›jÝì½CV°/Üõ¤ÿœ.ôëµ$Ó¦¶Gÿf1�ñ âM9”Én'X˜D0Z‰�”®£ô‡å•áÂ+_ Ü¡‰ëÐöúPg£á1ÝóµóÊÚAÜ}�éùŸVrÏ›Ç,Ø´]5²‹­ãs¿dÞ>·}œƒ<¦gn›é%]Ž k¸â¦ŸͦÍ$c–›Â¾Û²�¥Ø¢Ì+añ닃ä-ÙTâ\ÄxáôXÚÓ ìs†<¶¡i"ÓLp¡úGˆyOÎa�IB³ 2]*9½ OsïžEiˆ’n¦ñëØª�6’-›JÃäÔ¾-&™Gó}>úÂØ �Tpód½8|/Ê´p áGf)•;6¾DÖ°ˆ÷$‚üÒžB‡.ÂdÐt›u>Ö¶‰Ò#9��–néÁ<ä‘®YfÐòÕéÇAÿòJxù>H$u¿zÁ+\÷íò3= géžkb •ß××ÙÄlaÆéP¿À죥¼ðmÊÿ’.•®ý¼«FÝ5¼Ù 9rdɺYœÐ¶4ÓÏF³‰X’µ®éBwf=Ò?³šhóZGºÔ—.Ì)Жrºöìj�Ù8±íÀœ/zY“ËCB{�Þ Q 9ô;ˆáMPÒ-ír8ùà’kroâÚUÜ*_}ˆÉ: óDhürkɦk•FÖºb@¹´‡q:ùÄdQpƒàÓÁÁÂkx ®aI%à_>~íõ9U¡ F¶J¿@£ },c–i‚q$ï3ŽMï)RI,bãyÂ3‚ë}Ô„Ò(')稩Úi/PÈ\J,ÇU—4rÒ“TÌöbÄ§Ëøûäû3^@sE¥»�ÜKΚ{ ¿Lw’ÆÛröf?~…]¼F‰üd6^Iûªãk ׯXÏ2ërzXpƒ+„ñ^lŒ Cý–°Çï¥#•¦ n¨lÄc>ðG<&5Û«Á(ë(åBÒIƼz÷bAf‰Fo5â£EŠ5$çæà§ÄSŠçW_¢Tì †Ò¦¯»\ä®ZK4v÷Ô±A ¬Ó…ùdf+9 glö½b i{Õðu(V”-êÓ-úÁÐÒßÏô–yï‰vM[û5Ó}/˜“s·Mb E“x7·0Óɺ½¢3‰Ü�”Q&1ïú—»p+Zd¬>?×ö‡¬m·&™]"ˆ´%19n2wAƒú2³äçg-ž. î¶é¢Ã‘EË ~Ý(1ëαk”ÙÚ &rqÞø±óZVó`7vm ¾ó$î\°�ý9)UÇÅÝ–(<ç®ò Œ”~3|ûÖÛeßߨ9â1z¿˜þ$e¥è0)QÿHÎy:X‰é3‡Gzd[YØmiÍvf>¿ ÊäÍó³±qqá7w­¹•óB;48L7ÁØíËÙ.ùÁÜf‹¶ €CWè>Ä7ÎsºT|ýJ¯ß̇ Ã>ÿ;&z´õñâgýªÍèÛèÝWù|¶³}õfãöaS¾ÇbAá5ŒÔÀ4ǽã ÀóärOÁæK¦×L´ÓÛD¡½öŠKÔY{+Íë)aJ2x..¬x 25~¾þÊ&jñU¸²Ù-å©A–ý"Cõt?Õ�¦]Ÿ»¦3ÃÌÓ¨�Ù§'q“H|#‹lSWÜ\þœÃj S¬öÄ5ßóþlz—ÀË’wàqؽéì"QûÙt&§‘k¯à (züר5‡�¼6:½3'άôØ œþ�hKáyÓ"PY Ý}¢¾,¿³±/çT2#'í×åŒç5 ñ>KÍÉYL,°½/ XìËUL÷†u�¶X>÷ØY½c¹ Êï'GÈFA�{³v}—¿×çTté+‰Q³£Ô�c‹øé𽝠ü ©÷ž¬•t@Ü|W÷¤‹¦!ßxE²­¯Q›„¬µÌ…}ïïP¹ÇÓÇ"=Z¾ºqêH5-¨úde‡›¹�oõ–(=9ƒ‡ÙG[ì™þÎü¬æéfˆö#ÙŽ§VŒeßO3³T˜my?ï©�qÖŽV½ƒ2”÷¬Ø\bùµñ£ÝÕôëäÑ"]­>(€p±ÛªÆ/ £ïÀÿ­dí9k6?߇E µ¯|é¢Û�Bžm¯2ýžg€v´©á×¹Ù†&¾ƒüµkY¦û•‹GÞ¼»D3Åu ê@„í÷vËÄ0{@Žï…v$"ñÈë}’[šdúõã•‚x¿1‹ûÅÎ@_Ô “k°ÌÍàr�Ãv$ŸÉj•è,Ý«ÐG{ ¸æÑ¹ÄI251=ÛA^Ü®þWš¸ò.°y˜R.b‚¹Üýû^eN­$-Û`W\ö.«+T²¶‘ì­#5KÆbm#Ç…éÆ:iG²›ögÚ*γZuâ!ŽÄ`Ù^ÖÒYá(Tü½ä;S%…£q0çqÝ�ã¹0›íp�ür})Í~£FV­Èa˜wø CÐ9º‹­°¹½X[Î&ýýéØj€¨nuPY.–ýñz9¦—ÿXð×!+S=DÃø‘òjçEˆàÕÕlž[wÿ<àYšˆ‡‹’ºc<œÉ��äJ;ì @M ¦ìðpÍY¸ß qgSR"¯‡�pYóèº;ݱ#:w·Ãæx7ï-ºñ¸¾SÃ�œE~ ˜vz‡Ñë ¨Æ΢ûƒd‡�kR ë›Â¥ê|þò�_UÝñ‡´g�_ëí?–ëiyœÅ‰\r�?´âOI º±!üÚNøºhc²)yA:>ƒàxÉ ¤'hœx!’§¹žÌÑ$´%…èŒê±:Rù?H>Ò2Ñ[þ¡?KuWüýZ“ÓJñf¤»Z ˆ—â* ‚òm—ð²Ð¶—àþ\nÇÃKáÈŽË�xð?ÆÃÅå†?ï¹»¸”úÒ¸†¦»A?œxñŠ9>›‹;—wöçrw¹ÇôfsÈÓƒæ»ûèNè[ Ï%Û¿ºü/·KÔEx9ÁÇÝv/gÝ?Ñ%z@0|�5â”Í®?Fèi|–Ê¡ÚH´ì–£øÉær·˜.`Ú}†Ý‘þz²2Æ¢ €ø�©ä‰£sÄÆàO!�Cç¼6Y·åÉB磽)Ék{èÚ Ý~L á\ÏÓÝŠîÑÆ(šzGÛì¥t|a¶™žznl»F¯õÎ÷’K÷¬6™ÂHî�kƒ ~å] Ô>œŸE©‘ +¨¼Nf1Ce‘£I²“·d�ŽŸ]`¨Ò_T+×ܱÀ;ç¾iõü„ß]ñºoÆ[}¢˜ë»0½p·ÿ„Dè›æ6™…rÓ¼¥í¦GÄclÿ”rGëìØä¤óQ“×o¯_XMîØôÚä¼} ™<ã 6³ÑD´OºÜ‚ðW‡÷h§Ekõ‘ø©wS¾Jzìã–ÆSGŸ’ðÚKS,=�…òWŸ 6¦W{š²ÇÌiEŸÌQ7–ü|Í͈�í1-Ò³¼Y¯#›Öúe,~¦Á“WŠÝsÖ:~çpÀ‹ä¡R=PyýšrÅ}t9¸sÇr&Û�l(³¬7Z@߀b¯�qãV4úør­U oìSM hÞ2ëùŸ@ÑJÐìµéyci=ÖÔ�ÞEí±p깨Ôé3×@ã «ëꆩ¨�•y| ²„«¢ Ôœ°W\Ýy«”È6ÛéP˜)XÖb­5 - ïDÎòt¯4ç�Û =߃P˜——Ï.+€­ÙíŠY¥#ÛÙ–ìeä³ú¸~¥Š·¨óxN}ÏL´’rPfya=b¥·ë¬&ÐÀ¬jÞjí®ßlÖ–Ð +¼›í³ ;Kc°J ›Ä+­4Ï,Ÿ—ê@¯ÍŽ��³­1P¼Ú(»Þ½“V§ãæùU ¨û:R×)k±|íž85 HÃ0�ÏD¶t]S%°9;Y™Ûô�P"»œ5�Ú*Õa½°�•y¹;Ë“ú¬Þ¶ ëÔßjPn¥º±ç:"y½ŽÐ +øš6êüX3/Ó¬ èSŒ(B4ê:i~úÅ1ÉF (Qž�†(Ò–2°h°’yëi}#ª³jChÉþTòù–kP€‚Á6*4§6V ´œcJŒÐg†hN  »m£œ{æ.¬ªcmÛ‰&ÐæðÖ?ÖZ Zoö˜(@áÁ–Cö–Ãt{£ ´ímÙ4�¶ŽˆE è„xòDAó«�õ¶0ü4õ]U ¯=sEè4<³@ìË ñö–`Ô�VÝæ• Ô»*ÐwúÁ¡ Ôüøæòc‹¬2Ök“i½ÎÖ¦¨ûHhªTÜm^÷høK©“vä¢%�†\¨`÷1د7_c `íy��5wx¹Í  žcImú­ÕI¥@ãåH3·+¤’»½q+T¡•¸êðBC½nÃE¹z¸#2™û,ê;V„V“}èàhv‡�‚;¨Â¨ßÛæ�Þ�%¯¨¹Ylòê�¾¹/—¥@©íÂD¥¶}”8i‹~¹°~>¤¯]¶hRx½Î¸E«Z›+žš¨Pa¤ý”§GVÌ‹.gšoƒêµ­5Ÿ™ë�G|ÚXk˜r<ÿ,>o)ør½ÙÑy:xïk?­˜fûÙW{Î\ù´ŸVwÓOí§�V(txzD1¢1Î$µßnÖ—Uͧ뭇�ZîQE'·î¹/ñù‹RЈÖGj§ý´}U»Òyʾ8Syž§µŸ>žÝÚO_§Žêáé1ÅÞ̃öÛooCͧ`Üc1µ§ÅH¦åíj¿õ�&C £ýô6F/u(FV¿ÂͧaÛjÙÑ|j²¹Sñig}D1ÓU%6Ÿ÷”ºÏDé¹üéJ�!5Sß¡6!JŠ­œ×+ÐO•… |ºõ¤ðé½x³�òÑfzJ¦’þb;méw£ôšl;ø”«Åý[{*ûð’¢7èÀb?X1IlñO¢='L£9ý¦.Ó}k3e�Ö¼¼ï…âÉHcÚ}çXµ¢8çQê�ù+Á…¢à‡2#ˆ½F×j@A£‡IM 8ÎÑÊZ.¬(Òy=€•}|Ñ ®íŠÖŠâ'ËÁ¢HçCš›I�^›œR LãJJÞZ€’Øl–Pˆ,�ÿ¿KË€ÆÈûŸ©eœ¯Ú@ÍÙ®Oæ�ÉÁbï_(ăàý¿k}ìh…±˜sW¬æX±÷¯\ð)ºZ@ë ¼×'#ðm©¥ ùrVºBO=ûO^Á]rEýÊÙ×hI§=ï®pB¿� -±³uÐ(‰Äðïg®ì˜:‡´L,”{HQö¢€ÈB+^1OçÇàüŸ”וڇëwèP½;ô[ý M@Ô€Ó�\nnyàSå 2²B1øû|µY±Ï¿s‰x'X Á§f[‰Mqiî ”Q X­‡?±•cп�s0«Jˆ~ãÈ”ô‰.üé>¤Qµb|`_Ðé«H©|¡úøÐŸSóg7«Íš}Ù "ùlKc•ñ!çõ¬ù2$j3H ?‡­sˆ¥Í 0–áfÚ>Õ™!f_’™×MN�îÖs9+â3 9 ºK(&§|gý;’CŒR>‘“¿A,…êɼÄ\rÕ“9¨Qö÷ã?s6=k÷ˈf¿æ³ñNÙ1í2(š.HÞVbÓÙÙA·W<{Ú©®`©|ËP¯»dI]q«J%Ÿ�Sš×¬6´#©<1´›ð]Egh¼ 9mX†ˆÈµå£gµ—1½QåJ6aöU˜=ó’ö*$Õü†„Â9)ŸïÅPÆç6ô§.Ø—c&Ë#Òüx>ad9Xi>w!·ÓI‡À6ÑŠ_:ŸÔQï,ù*j˜|¡« «vg ¹ëšsn¹Üe•&_Kê.NšŒµÓ—;ÿÄöà?‚Ä+#2¶8í˜OO¨•ŸPIöûˆ7²G:p?/øyœnïýG˜õh§*ÃvÍJs�þñÒ=ø`ŠéL ï)ʦ$wÊ “©ÞOVU>Ð|�#]ÉϬºC°w5=F™›·ú†ÉÀüâÆ€üÛNÍ,ÿI×{Ê)õô1±\R³+¬‹©"54kÙÊøC(!‡NÓVVë{pÂxàùÓwèNúü’æÓ�õ›ó'_±â‰Õòþ3´x‡G¯?ï̯�×ÅY�¿I1ò÷(Fý&ÅèŸQL0Ë£yŽ×�<1°w3úQÉ…ï˜J> T5‡šC«¥Ç¶7&öºT~ä呸O¤r{suf Œ×cUy,ù°µþ„:›uLŸ:İ۹7*Ô5ÇÒ9!Ɇ‘xÈ»8‰Š "'W�ˆšo ¨(|Ëo!"‘Ta�ïDlØ5os*&*�S×Xù–§»U¶ =Þ8Òkñç”Û×ÍÇÖ(/ò>ŒjZ¨óYÐ ®ÕCkQ@„±¼n¾4m¼Z<¬�’¦ØÇûø '̲šÐða^·ÛïŒ�¾i5+ü¼üˆè@òñI‹¬äZ _¾€õ¾9>én(±Ìpa�X†D\�@Àeëb7dq£qú*´Ú�ÒNd—p†d^”‹ø7r ôUØq¥‰Í…õœ ¢¨Lɪ'ŽR²jš^”{ðßã8 M&•Z 5D”fY7½±‹‚ÝÉâNR~k@¡/ZáÁªgétó>E¼¸k ïsa=A˜QØñd ¢Ÿ¯A> PG'c£¦ d™¹+í?v¥W%D1©3}€†+MßÜ»-'äå4S­J:kR'Í ,£x¾³ÈÛªyÂÇC ÿ\^V%l�ò¹ºET¬¤‘Qéñyé`÷öûÖ€”&OK\Xµ3œ0M&ù2Úw�…½° Ìi_¶tdè´8ÙbÄ—E‹UòýwüoºRwaXî�v“#$yKTÀèë>£ÖuÞ‘ùVÔYtûc�üÐøæ"…bÖÐ*ÏFO³åJ¡¼— «á~ J Z/âÞ¾Ÿ¯Tà^ŽíÞ¾fä Ë't–ò=5¢Øîë¤ÅÑ2¯Cáo¢ß|ú’£HT¡±hä½PgÄï˜ÄcŸC×)C¨\ãÓ$ec¡FJ•y‘: º­µ<Öhð›ŠFÛóØž’ å*ž¾FS]­Nmªø¾Fƒ®Ê» ëi5dD£ÁƒšéÇžÒÃýO4ÚAöaÞ~A£¡^Ž5š��ìçl�¶÷”ýü\£¡^D�¶Ï[J—^îë8ê¾€|Âô"h~ápŸW÷RVRQywº�ú‡–�Xƒ{®r�«Ÿ„Ñâ.˜ÐšÑèâêJ¹\ª±¾ZÍ¢Îh£jFÜm«&Ι—íÀÇ 0·ïâ7ú‘§´Ž{¹0ØÏ™[ Ôò0¸C!õIlÔ7IVxõ\regç%²ÜòýcJkøòul á·³£jõˆé1ÿO#¾¨‘‡Ý‰ˆÏ¸5<½›â¸5ìš{ߟƒ}yhÿ†³¦b Ï·b¨=ÿÞ¨ƒ~~àßK{m¡î^8ýÈý{-[¨µÊ#ök¨o åk|ïN¯Š5|0ºIÓ<¥ÎZÇJ÷aðP¢./[I”b&%æA µ2)ÚÓö(²}a5 ÝÐÙØ€@j˶4«�Mµ³èç¨í…€+(vVpÙYòy÷»ÔTsNH|:©ë3væá¸�ÒqYO»šJ³ÔÛ(̆ÒÛüNº…”ª‰HÁëSì];9%½�NðX¸øœ’&³<þân[èì{«7ªxÝ�¥òïdHzCùdq&�]ˆh.ý†6ßâÎ4\ ´Ÿ€ÐÉÁÊ8B}¹B�’&Gàý0'Å‹\A,ÐD”9õÈBV-Ç�žG\ú)Ûj\Xãþm²œY¿E;?©¡Ó¯ SœÞðí:ý :~…÷ç5tút¸¾òjèô+èäՂ߯¡Ó¯ »°þN �~ÝQµà7kèô+è@[þJ �~Ýqµà÷jèô+èd»~PC§_A'_I>}£†îäzåÏkè’�íµ¸Þ•ˆ®N‡½R¿N»ëÑ›S $·b'‘QJé×Ydê�[iì"ˆÕl›ßÙ «’é=M'�Ø6­´öò©³p†èÔÐßg¦¤“Æš8ª,“úã­E€�±"¼ÆB¾Æ÷~:µ‹ßéš½Ê9£ããsJé£ÌÕDW ¤¶¹O¾2b˜è'2WºòrNÑœ–۬ʮG»m¡ï‚²HæÜ¬ß[F¡ZUªk�nŠ~ôšŒ®Í]œHÃÐ ”�Ú…õ¬Í ZÅn'þ/ »�ÊÈô¢b·§ª=+]Ÿß8a´ôÃ5NNko¸1ÓÈ·`¹VæDt³§brCê!«zU2$ÆÂ^Œ’ÑÓ‹“E¦=êKÏI2”8;x@,��FgòE4F’½ßëäipý;îŒêA©±¥Õ‚çÕ�©¸]š³{²ŽO~tÁ7U+®ã �¨A¬ë0Pš&ß鍨Fq!BÉ¢‰Òaêó§YÇ'Ï`êÍpbþPS·æÝ°|rú51¼oyFgú§ ht¥¶?u¦ Â9x!›òkÓ­˜9—b:K!çSL¡ÑΤ"ñ»�}á=½²ê™äÃÛyŽ£º\mc’’lõŠ¡ƒ°ktqªZNÑ�ʺØöFõ,iµÿ9¡�“_WòUÑo{yý`O\MÐK¡æ•k˜Ú¡¾VÇ»tfZ³,ìD� ž!a�O‹O6:uâr—F]ÂP�ÛiÙ?MC!œÎ*�¢Jî´yÓZ“øÈƒTž”s—A?Re­ó³€½HÝ+¹©]ésÊÏ8pò‰ò£åqr­sä@îOŸsd´íùyþØëÖª‰?v–Ä H¼|ýE“N[·ý't:TŽ]XÏKï|¯2îÂzRçedö(É2½RgedtPRž©ò:ÊÈhDIòŒ }šúå™âY™ý‰Óª5_柦-æEIdñ�òé�%›±Ü…�òœ«0iÿæÐqå¼øãŒ *CSM<œwžRñ›EE**CûiFWçÉ32ZgÜ�"Là¬âœ «Öf—¢~yÎYÅ9h,áÚVY‡zso=±›Æˆ³ ¾œåç5‰%£;${®´¢–UéÇç†í-røÎñó24­-{8£h�CÃw&C[ŽùSºs͹áÍÀzuuG›fU½‹“uuçî]?Ž’a •�œÜ‹�hÃâdƒÛÖ*ë¨�Óçõ[+3Zwâ¼¾_ª‡ã×’”q¿]w>�}§Nm‡*ªdûÝz¸ŸìP5^§W‘ú{õp(âû�Jpýz8¹¶Ôêì§õpûS5 –j|¯Ncü/×ÃGâ'·ô}£îte½¡e�ÔÑyÅß­ûÁžH…o‰ŠÏ~kOäý!Œþ‰ì·–Fýw½=½ †Üßt'½ ›Œ~x¬îG¿ëÂx??¨±ãÔ�Á¥¼“g‘ââ:™*NÓ:ÇóãêX á7¹ªí"0&†çìiÐ>Ÿв](ÈËæ>fÒ«)þêmÊfuÁãOÂD8SOƒ¹f;,ûbË·Ý|q²GÖòõ–y¨žl |·?§½$®¨¸„ã8>Ò0»Ó¾%ImËíÑYjrVe�è9}êØÿc{­u�UÍž•âøýK¿°|Æž+íÒ¹ |rÏÕoÜ$§æýJÖ’~é&¹˜Ê=rßÍÂ¥�o‘Ô߃îEsi†\*ûúôï}ûµKä47Oï½qÃ%ƒ‘“7ª�Om2º¬Mÿ®ã(ùëÈß&º�­”Få%rò•Íûå4ÁëûÅj:%†(ïüã<ÌQ5�Z F¿WM§–ð’ÝÅù+Õtj)g•“'XM§¶D¹GñçÕtjµtZgÝ|¿šÎxÖú'Õt*]‘?;!D­šN­–N�âwªéÔÖiø¬õoVÓ©ÅÍr[ùÕtbíÕ¨ÚÚëϪéÔjé´jF¾_Mwˆª¥ç�ýv5�Úìâýߪ¦S«¥;ZMøq5�Z-Ö0¿ZM§6X^~µšî„§ôKÕtj]i®ð~»šN­«Ów Ÿ[M÷k;éžC±ïUÓiPì—«éÔjé ×X®¦SÓ‹¿^M§VKwqòÇs«é´kF~³šN­öK½þR5݉Sg©šNm†öì¯UÓŒ+XM§³òþ‹ÕtjR®{‘†SŠP œ5C¢Ÿ,ßQI½nz>yX8óè&Í( ú^˜ÎP8š…Oeáì ïâ÷Õ©9CÚÒ`a­óØî=4ñT@èÌ`½É…�Š“¦Ae&µ]rRÊæe`£ Ý“# $u öG1K¡À¯aýå=c©¿\KqNí÷*SÀ¼�ó©]7òÎ ]-kìÃÍT{«á[‹”ç»òñ wB{Wçýo,îâ^~á”ÜÏ™… j»;p?ê—k}£�Á•ˆ(ï€8UÊpB �÷U J¼ÔêDübP OÝpg¬¾ò§7Ü)kß IÎÙ7Ü}×?ï†;ÝÊÇï‹¡¬T[ýýœª'2zSÞÏê‰7åi‹áÏo¸SÕ0o°6~ÃÝ7N5GÕOu‡cœÒcíß+¬mc7G&/ß/¬mëGÕFïz~ùúÉùT’ÊGï/ÖB/jÙ¬3÷\ñýœ�Á<Ê�óýü¼°zÑ=î¼úvt]žöB´°µ†ß©b°Œ©³>Cøít^ëÂj@ aTÏš­)b’[±°Ãà±éŠ˜:kå¼|ûà9ÜÙé°ýÂ`àÞYJSkæ-åc'®„™lyψ+5×ÃYEL]¤~~�¾$J²SɇG¯²ÆUyÐñ·Cᦼ߫q}T«p=DçÖ¸&¦ú›f%+6¼h׸*wm|ëh*áœ+èlkÀ33àÃ<ªU¸~û¦<£×=êžÞ€n¤û•ëÅŠÔߨq=8ìh{my£º‡Dð#Q¡’ÉUŠ�¸H•õ5LžÎ ir5,úTjûJ�á˜r‚á‰.§RäÄìÒ¡r U ^›Ú—¿k~BJOù5wö«åJjèd÷°9zWõ©4——¦½èÝ8÷æÕJd“lU è…•¿ènAG:Zexo:@s¦€6Ð\ný(É\)Ëð,_ìîE«4M§.x¯K€îKÓ€b¸Ê12»×*à Œ]ñ¶k¥U„§]ùäý dVLYû÷š×*8d-Ö©¿ÕÓÚUŠ+ë1�‰°ÚX…"Ò�¢E¨éÅÂÞk‘׃�J*¸åc-سŠDÓ‹ÁãOb æn` Ý…u¬Z†Fz4W£&íÖ»ÎÔ*ÉŸðœ|ävŠ¢ o{ Ó©>Uë*ÖNq£�Â[­ÙæŠõ £Üén1[�¹eH»úGz´šê-fFoù:ycŒ¸Ðůòh—6�µµJÓÓÅç�ÛNl05šI:ÕT7 ©î„Ô¥“ýäÝ †«ÒÎÛZ¥Sæ>U•v?E<úã3º·•¸ilÙ40>Y� å;Ÿèê(Év|(Nl;�èÄoÉ‹Ú>­½âºWß«PV�žÅÑ�)8Ëü 9æG�²þå9ØÌYÉ-ý»ŸÞ2¿³nÍWך Ĭ'†¦{–�ÁüØ£gõ“¼–xGjæ%mdq÷ä�zê™e‰¶4Vø­Chå¶ó[G6¢®ö»´Tò0F¯äÞß@y|V\V±eZuµÚ�†éšv¿#gç”EœçG%wÚ»æÎKdՎ—Þ.g i'_nso äÔN]Päù�V·µoé5tF„dó±2[ùýB²ãóÇ~P~¤é¼IÏQ<äðtª·7E-£fÀ—#%Ó÷'Ju ¯N×ï.å\œ¨¡rã†J95 u 0ƒ²‚;ç–ßlü£Å}Uû~±s:{Ô¿¿û<Š�ªå9‹b'V.Ϥ Ñ~‡bÿmß½�ʲìý¼¨( Ý=Ù€A\ sŽ˜X.—õ;÷üsŸýûU÷$`@ïÙg»a¦è®®®Ü¡š=uÄbtýE5ÖÛ?ìq pÐ`VÊË·Ozp [5z51pE½ >ò·N—Oþî)À ¿/ζW`öà géQNz01Ò)ÀAé)-ò·Oz°3Fî`g±çê[ÿS€6Ý£ (_g€ÿ›¢|íœüÅ©­oåk‹,þÏŠòÅfá~¼(ßWuÞ¦(Ÿ¼¡}å£=4ýñ¢|=³p?Z”/öÌÈ�åû‘ú•_åë¸o¼R}|g…Í—wC�\ׯU¿8ÉõcwC}]×oð»¡F©ëíî†êYׯV¨ÓOþn]¿þUý¾u7TL]¿þé²^ç+‡­ë׿ªß œ<ЖžUýboiþF]¿QOrýÄnEï$×DêUÕo¸ú•½ëú ‘·¡®_ûœX�aèº~ÃïPýN]¿¸ãˆ_ï…¶®ßWœü3uýúºÄKkƒÖõàTÚÔõóÏoÅWõëÌó·®ßð<ö�º~qÇâÌ{{]¿þ­|]�oÔR¶~=¾Ÿ¨ë×ÿà{°b5b]¿þÛÜâo¡¾®_ÿH­{¯õ÷êúÅK´_Õïës¯ƒÕõëOÊp%q´º~ý7\'ºÂ”ïÕõæTÚO�{è¬ê×Ó·²®ß(²?x]¿¾Ç$s‘©#µÓÿ�!êñý@«æˆuýÂVâ–­‚(iĺ~ý«ú)Ù½®_ÿ\A"ý3uýz1»ªê×÷ÄÐuýú¯7Çê±oÔõfÁ÷ëúEwPwWõû~=¾aŠkö«Ç7‚FZ!!ñö† ®_ŸüWh_ú»öÔõîF�ïÖõëPfĺ~Áù­Ø&ÑèuДt\]¿þnŽÜoùuýúWõû™z|_�´ßhÙ¬°ßhuýüVâOáµç*¦®ß`‡ácsãߨë×ÿ0¼ª—4z]¿–Û«ê×K� [ׯU¿ÈÊûHuýú‡íñó2|]¿þUýFÈ[¶Sl°��#Öõ‹;óÔûLâwëúÅ¢Dß_Ý6?h]¿nÇ0ZÕ¯çYÑ!ëúÅLlD$Ò=w×EIùe]¿þb;ü±o×õ‹;‹¦�ûf‡¨ë÷õéÚŸ¨ë×q!zoÏ(uýùŒ­ê×k¿å°uýúqD$;Ú·èk÷Äe<»ë}ª[ n°ã#¢-;R»,&µ{Ú/µÛgã½Ê[¶\¬vì.GsX—éÇ6±'—-ØC¬³G‚lH‹m½„íˆEéì[Í)¤&?+‡Ë‡)<Û}õ@Ír«5/–KûçÇ™TúÙ6RS3¬šš~ÙÝN‰™ÝõÜìãÌr®4ߢýüû¿ÿN±ÊƫΪne‘UÏÏkl5ÿ¹Ãêöò)«ŸžÜ°õéw�íÎN™l·±°Ìöÿ]ß²ƒ©ç¿ì ÎߨÁë¯ v¸p½ÂÎ7~³óíˆ5Ö Ïìrz'Í.ç.²t¾r£0Õz_:·Zï/“k­Ï™�Ó÷ñ×å?š^w>½“�w/[%k*µ¾¿œvæjª¹5~p²Wšxn«“ÂhlL]îÎ8c{¿n ¹½êÖTi{®i傃€‰ôT­yV)Øõɘ’\•޽R­ûóbzó~}Gºû1b=]š½tS¹Gc»­dý]VÌÍÍf`Åâˆ%É�O²ËõÌvÿ‘æfo ü–-”Xuï°ÊVÇ_¶ZïÎá­ýYÍÔÖÖ�>�UÙÓß�éc“<Ž Ò0¸/Ç *r*™gïôµèib³6|¢ê ¥êç#eƒ¨¬NmZ�û…ÅÎÓ×¼÷µ¬iôU ~XÌUŽj„Í™¾pðº\¾¿*rV,™jE¬¿³!šäõ¹W‹³õT‹^å"#È×s7Á‹BôÅ…Ý ^„ý�ÃÒÜ-ùýmò�,ÒSJ?²âêütø”O—ù¬¾ZÎG^\M”çýkŽœíÎrD¬,4è¿O¼Øáò«¾°ŸÂ×­ÅéD:h¢!M"žV%½§!>ÍeÉ6¤ââ³ÙÈf‘®–ËË}’øº/›�Ö'ܧ|=Õ‹ë»:~»—Ë•ÆçÆåXÆsè@{bÅãz!èôÒïåT¶N +Å«¹É™»ç©ýê\ÅøÚOw¯mGG~ö(XMWÇçòÏ´(ÛS¥±¿½ì¯DÚÙv�ÕêâTsoeíÖ;ÙŠQqŸYöD8ñ"ûدÜ<¼¹¹2‚�_¡—×›°ëÍ(¢ÚÏøº_ôVÞñùˆñëúZŸN¹²ñÅë Qr׿êúJ÷?ݲ ojvd‹é€áëQÑûíÃ)ó?]ðÈì_ë—<|nõÈ‹‹”ÞPRy¹þ–öÆòðdIK£/;º3Û¼Èþ)ÿµª›Ë�θQ#$ŽÞ©45 ð�Ê:ø‰Vü8Ò‚No±t0EÆ=ÖC'B>+-¬²Ûôó ¼Ì—騣 ÏNW5íÅÈœ5ÇÌbGGG[KA÷™H0 9žfZÍAål¶ OΞrðÁJžfHëòLÐ�‹,Ÿž¿7té!øìÞøh£üøTX1;¸}ã<ô­à”m®³âfs¬«b´Ì\4‘N\EªGS5rù"›Y8%†5Vñ‚kmHîÙŸ—ÏušR3`¼ŸBÑW)êôHVdž_×}é…:ãëQl9û;ðzkçÚØ¿}éîÊbá2h°yì<¬¨j=çæVÞwÛ® ˆðyºá¨�¹ N[úµO‚!AùäöB’¬Ä'J’ø/ˆ0=!ÁBùí%º+.³ÒR$ð:õn;ñ§äk"¨�¬²SÝÞ|ðH >y>ˆèäb(G©—bE¡µ||�®|9ëÁÙéÓs©Ë�‘$� ÒDn^T÷Zç{b1 …þ xóÒ· mD‘ʲˆT~o6òƒðt"ru7Oçó=š””y-ª-{C_ÜÎd¼&®6Û›àà I mÙ á7a�‡³ñ>¶ú»ÜWœá莡-ÿ‚™'ÑÉc™Qy,;:�GÅ��ÎcÙÑylz€&ú6PˆðX‰6Ñ9Œ�IÙ›ÇØˆ³QŒˆk"Ý“}›NóI+ÖÙDaÄÙ(j,åÝ 5S¿ÁØí{á.‹lÔað8É ÌÕàÃßÄ!ô“‹ú×òY3æ×Ë9ÕD«dêm8ˆÞ6 j‘ûQBäGÁAjK1*S ­?G  -Å ÎM?;$X›Ÿü¼ý«hÿªw̾0ÚÞ›ùö¯í$2Û»2‹í_YûWÞ!/f;*\daaæ"bDs>MÈ—vî«{ 3'•Ö…v²T³6jå«»_ÿTVÁË'û ^Ìj–5*’‡®!È=W<÷`Ó¥oÇ~Fqý9Lã¹ÅKDö�2”Ïû5¹¼Ì%–üÌ€—70µ)ÿÏȫռHÜ´§eääá�J,�¶šÞϪEu©¬‹¦>§þ>yY£ŽP?ÌevÄûa.Aø"$e­KkÅ =í¯0±ö×'ÌFÖ‹ãëcAÂv#š°EÜ$l7¢ [DþŠ“7‚Tó“¹^³êÄÉêZI~}‘ÚÞÎ)�ëWN¼]‚† 1UÊÐV‚mM�ÜXeje›©ó•-~SÛ”¼foNN¹7WÇÕ\�QUIl‘µfnýN÷4Õ ËN8L<î¦+y7 Þ`¹`»†Ô0~BA¥Ò»VEƒœÄ^q€ãÚKôl‘EZäÅñ÷¹ÜþlË*íKöùmFf_Död7å'KOÃ4ߥ>17w©r�ÙÏÛ‡DÚúa>’j]©ÍOjŠD+'k*Ñ#Vn6½Õ„•Ç}á}ú<½�«t¢’½jxŸÄåMÙ@"-'‹Ôâ‰F5ë_Dã±ÎÔ¯Ÿ;^Û—Ù£€ÛN¢‰ßËÙÛÁ #�ÊëÈX.Seµö:«/ì}ì,?jwÓK[7ê+¿×R»aJ(¸ë°lÿ™ŒìîV!õôçZ°Ìp^”ÃÐ'ž¡vCMPÊÄô>­\Ý�ºyð´Ô‰ÍfyZò8v³´³w6U¹.,’²š£"•~RùãÕòe_år« Ó_’÷®'½|ޤõgÍiEÅ©ùÝiOSU?©mºêXâµpX¹R‰ÈæUCS&£ò–Í÷¹¶.õÅJá4'5U�õ,È…\©®h]÷ÈcØÕßYoË´W¯ê?æóW hƒ©¿ËT.ÑõÍ»Ídf|u5#‡‘á•‹™9ÿÙb^å-U®j‹™×¿ibÓX"ŠòµÌV~ͽ°Ž¥ Åв«óÓ¼6ñ¯¤ô˜R.jYGÚŠ�¼§ïî bÜ Íãdüf±èµ½ºÉÔ*Pdéiu_È|²ÌR©µ�—ÿ-%lÇæIÛ5y²¸óùØlm¶îïùÄl¢¸´ÆùþóíKµÕlî5ÿçcååæó©ùü‘œI—vËkkŽ¹Ò¼y¹m&å¹[óÒŽ\2 ãeÍõ^étɇË+ÜÕ‡ÚøÎüÕÊv\êL¶O½î½Q²½–HS=M—Ÿ¦ò¢º›ÊÔÞóôõX%š$e®&RU¾Z¾]f)º0´eñÚâܯ^û÷;I¤{£’Õkó”ãß¡ôþ\*Ýä¿ ³]úZõqxMwn~ˆ,ÛûküÑ[ ¥/V²ÒåÏ•“jóheüö³R>_Ý9²6Ê·c‹Å�¹_‹Å÷ÛÙª;þ°U9\Ô/fOêÏ¥Õǃ£3ø©k´rðÖ®²•‘HïE ïCP/Ãz1>D#X>ÍF_ø+±jà;k±mx¼àQg`ù�Âï�é6y]ÝÏ\¾C>úâÎŒ3‰ T  ²¼V¨’%ßàŠ!k ;ôu{ºm…ùú.G´Ýöäùfžñ4*™Zª¸)ÌS\°]ôü‰…5"Û¶×ìÍö¾lV—+°jýµÖh); ²£ )¶Wˆ®U.,Îm�Ò�{ k$²µêÜ7ì[¿·ëó¡@š[ÍÕóç.‘^Úýœ¸¯œÜnQH»ÇCþ矋žš;¾ÐƒEZ#ê9,Ø«<÷a»L±ÐaÑgûCé^ŸS.ç�û¶ìPîBz¡OzðÉPMTfŸhoʉ×bãFNüIàPž°à�ξ¸�q>Ñ£NÅÊÄ¿ûÏôÇrb ï®%Ò�œìv×ε°S}2»ID=ÇŸãCÊè�óà“ˆÂ­ßô̱�ìûølW/ŽË+9'[­VÖÙ÷ÉdÍë‹8T |£“¯¶´xÛ(—Åòq®œ$ó×z¢1ׂ=53ù"ŒÊáòÛ´åôJÎ…wâëÍ×¼Xÿµòyµµ‰ó Uwbç¶|þk¼Vz›xªûËÿ´.§–�¼)ûõäé,à«ûjìWV šrðFŒ­�‰XþΕ`³‰·m)+õáÏük‡¶Ü5dÛ´‹õÍ›xs± ¯õ¦;cO Zþºª=§ö�ýÙŸ9�Ýôøçbñ¬{öéiØbŒrÍÅhÕ‚R¨RÍäïæ}¿¢T ðÏi•å1‘VË´q‡·ÚZÓiÁ³bð ó’ߥXdŰ,£�tìgø~nHª0�·p›òëÌÍ>í«¨Ç}ÖPå¥îî¡&"»èT9¿¡ôNäšk4Þ"\„k¨Þ²¶G‚“( €MÛ½tê2ÀþD¸šÛ‰ Ÿ>r'$�Ú¥Ûw-½ô#Bgú{Øä÷â§$ešû­¦÷áu2ZQñ,JÅ(#©bkP§:£Ü8$/ªªtjå¿7=šh´F0/�MÈ3£ ãïgÇ¢¾¿»dàÙØ:{ž§Ûn'*m5zˆÅ ¤Üj¾ÇíM@\9èî„ÒÖKêkbIéïÁ/mµüí;ÆñSØ«­ß´í9 ø÷82ñí5K„ºžaTÛ}™ÇšC5ÑÝÀcjd;x™ÇŽ_FQ½hàº×íljRâ¤ß0þ~—”!�=|Ž6Ç�ÞâšHÖÄõÛ(8È›û›±Ä|6ŽÿÆJ|ÈRj~ßa<ŒÈØÇÏŸò´â(ÃhuÊÆð;Ë>ÇFÃád|ük‹,ÞÏÂ&RSw£M\_l‹Ü�Åuóí+J|�ÃßKµkËA)qýð>ª¶¼~þørBûÚ¡ë·N�õ“ûñåõg*úõf|¬íë丿½•RñäO"Du} #±ÍœN”~=Jåß^ë©üúѦreF>))Ž-z!Çü±nGð,r*´Ž,V�0âÛzñs »¯ˆEïJ*êVéɇ1M­uÈs CŠ*–n^52Þ§MyP$ë­„› eÖœ†TðÖä{ ê…ãû3~8¾ÆÂ°7º«°ÅNÚ)óår§\5ˆ×=�ô<2’Hÿà¡‘žGFä %?uh¤ç‘‘°—Ÿ:âwd$‘þÁC#=�Œ$Ò?xh¤ç‘‘ÄOéyd¤í4ɨ‡FzIüä¡‘žGFé��P¸Ú¾AcÊÓYKΔ—:QéÀ­�ŠGJ­É[Õ/Þ•¦ºÛš 4Õ»¯\4U"Ö4ÓȪL¡Ê�™391°–ÓŠ´'ž¶5y�v1‘¦;N5¹tIûèÖ·Z±Ç55³ÌL/~+-Ïóìù2X#™ö’€åôu¨“{kù}®©–àTF›F«³`´c­ÅÜmÊ—à8 ül)Xa†SOÕ‚i/©³@¬*éX+T¹Zf Û×Z‚c“ÿ[J`¶i1³Qy¾�.d&Òi<Ùm~|¾€ÙXnÞÝ?ׯþÛl%xRýÃðýµÝ$NR˜&¾˜ô´~�ÈHØ$Ï&ëÏ –\ª$Ò�âRëcåþæãþåùªõßä =:Z¯ï¯­$g’ê ü`6™J¬h¼ÊÒjƒ'‹Ë//�ôf·z˜¬üÏëKë#©úØ{I–ww¿†;¸¿¿~l¶Ácø Bÿý‡>4Ÿê?ÓôßÍÓl“ æ:ÌÑ ×bn’i–íZ†+nŽ!Ÿ0!¸ëºc=q· &\Óu„n)b¡�«K_þ‹/¿ðáý'i$ד§ç,yK¸ì$874ôèºÌ1 [ØIËÒ,ÇbŽcZ‚qn'Ÿœ1MãwÖ0ŽÉ¸É™ã8w¹íØ6wmaYIÛÑ ×à®Átf[ Âbø®»–‚puÍu…0˜ËL q“p\�q�Þ„× Ú×LÝẫº°DÒµ5 /-Ýd̵ ‚;š° Áu‰®ÀàªsW áÊpÃd–I¨ˆd9A?Â#5C0\3APÇ!LjE YL…ã GP…sWã–eš¶ÎU?º®ÙŽÁláØ¦lƒëÀÞ�åØ�~tSc®eF`8:vL�Æë­ //Eý0W³u cö°å:×n ×õǃ6¸Î Pµ�~惺aé\W0–fcÀ ”mÈ~0b¦»®.„©FŒ¶ ÖQS¨èf3³¯ÐLarGѾœp]°ŠŒ o�µæïe?.×,°!X‘†#gÐÔÀ½,ÀÀÁµl"�ÏœXŸˆ«øÀešã‚¸Â‡q˜&¸éغÍA0œq꘹ é¢cÛ6œ| ¼!/ÌU| ä]* d“ýÈi·"´%4�Év ˜v`ÑPt³…†áBF}liÁ²ºácBœ�†-a;Šó‰:`\¡�î ½¡ÛR~ê "¥ BéÄî„K,Œ¡qÇOêJV»`º! Œ¼Ç%ù%Dg?�„/Zq !\.$ßvÁÔ%oc@�ùž= KGWDçLÇA@*uÓàŽ�’¡6˜.úÖc`l0· ì}‚0GØ>7‚Ôt)W¬KVm¨Œ^ºA¸€M‡»J‰†Az!UÐI× öÌòå™´)øÔSÞ õ×·7‰?‰éýÀ:@u1ÖÁ´ü 3š• Eè' þä63u¥®˜M3ýå)N¨ 3ôº•:ÊͶ|D`llÓa-—Š–@C†"Á8™_qB@„ÁÍ@0c  €6ƒÍ2ü6:û�µ`–m[F ~;±u-ͺ Å塚®ÃVR^¾Rì¢`ڄ̰av=%aÒ`Il#2]&&XX¾éã6ô1T©íœ.ôc[:Ð7'Ý­ØÀ Ux7&_ò1O®€l�Ü6óF�°½à1;äD·�À �Šum—äsHV6Ar XšÒKåÈÈ`„u�¼#w ô,5Ô¬«îV€�k/x‚×� ©ô]nê¨}<4“Tl¤2<Äv ¡2Mܱ x&ÙÄÐH2“É=#i°šÜ4}5B&ÆÚ¤_y&�ø›Ù°ísf»‚ Ç5 _IÄ@@ä-ÆÖ—Ö˜~LH pÃ{ak8dÃùéñ—|Сj˜¦¾„€ÇÅ}? \LøvŽÏ'ÀÀ½€;»&Òè0ŒÎó&búé€('„Ð5Ó6Èëñ0u c™ìºï›Â±ÑMˆ’Ï`q0pm �0�ž}À4h°;Žî{?€à¶m{ò ¸íšNOˆôBèz¿VàeAÛCðÕ”Ä`Ò Ñ9¢KL ]àÂÀUv…ç’÷€¡ÞyŸvb :f:¦ŸÐ6.;þ¯Û=ø~–-t³w?_ó¥ÇÌûW’ë ùÜ&¬d&›<: C. µ hŒÐ6”�CQ’f‚;Äh"þPÏ@ eä9Zx·„Ü Šà†~©Y`*˜!¸ô�,`½t z„¨�•”k²cÍb{‹š³ Cà<‡…"´¼AQ"°­«çk ¶ór9hÕn¸°ó& 0 3“ˆt4x\:4yÊ��Z€ÙCÄh2#©ƒ².””§î"F醸IèíXàZŒÝ„YŽkÅÒ¤­E(‹C¥¤såÙ`˜UÄ’ºã‘xá_Ø.EÚ5‰~ –›/�:éG@�G„N|E #‡æÓT(ä 8Û< ÖÀô0´ŒhÊu©„'ø[‚ƈ©(�÷�AB‰2‹@L ^�3Ø$Õ:…~à úÑ$œµÙðà\�·�ԙЈ°ß6âqê ßĸP9„êP èÛB«è |R×C‡•3ɵ„1„K] ÔW0p$™IAˆp#PªˆÉ'¢»!ÀÀvƒ³A1âŠnt øi&y 3âǸA‘w‹°¤„Éàñ´Á�Da6y7àëP`-Ë )gßΉ@`ÊÒ·YzîÊ�h°Ö,BtrŽ ’ðZäD�µ T:žÀ±´Èßy,’x’W†(SÊ/ 7x“èË<ØzÛÿH¶9¼x;”0Ib( ^1œK9Wd·J6ž€¸«&‘ıÅ[¶‰pŸ\K΢ƒàÓdÞ-  Q d[‡³šUl´ ÿD]†ô{8&@ç&|Ý„ ([1q†lˆl ˜ ?BL’ÔpÊlðl3(& é³€‚�)òil�ÿ©;PˆPépø]rIHXÀ!0èx™DÁ=&ÝáÇfJRs,L®.$]q„ÝlDÍp]Ü$Â)š²WÌÀo1p²11Ð$ófK‡”Ò;@—‘ýĨð[˜.ìäXŽ4™% lB,Ã,„¾páJ‚ƒÀÀ} ±%)d�¡Å1ÔÈ'˜aQŠ È�æƒÒp,Êaäœì™ 1ÀŒ ɤh §à;C”�Ú‡ßÈàÁðW (WB˜2ý‡ (›’zàh×E¼ Tà9iÐ0…EÔ u%!àõ`Àq¢A“çÍe  4fI›*Áe· ¥¨‰%0fL¹y®�,á'"Ñ„ê±Í7˜Ã # F�ž¡a:˜„·`bPL /¸P`>ð9\TÊØ “ (²Óux)0†%�nW#•¦…L�f�Ì�ÙÂ�ežó}uGÝrÀÐ$�}&ÃÌ ˆÃ•$˜:‰‰€¶TO7Œ ˜$…ꃓ;=H>3FHÌgôBK BœeÄÅ€À�×è^ˆ£IaaWW� „´ àßBdÃA=vŒrpPa9\¨~$H€¡—ÁÕ ‡7ë1 &Ø–\ð»#LGâÓÔIézñ)´9¥)¦‘� H9ž‘F#É"c ö§¸Â„$cØÕ!ŒR³àwPŒÜX²ABÍÉçû0x ”uElïXV’ÄžÃi0 &¡/ˆ‚ñ’¹Gï…’“YJoÀ‚·f T Vh#(eNa¿ðt7¤VLC’J °ìÐÁ”3d+P|`J™KRW[ᢢÄâ®Ò>ˆ‰ÈHp0(ÐLê˜f¨ôn qÝS?0˜$ÛÐu4p²PãÀBoZŠ€ø ,TT ¹à¥E$²•£#Ã8V›â8r À P·À<Ælš28€'%áàÇÒm…#7Âx â ½ÃÇ!¿®¢ˆB¤óIãzf¢(#Z™€Is1Ãnì˜Àíà1]7¡Ê( A´±5�Ò&sÈÓ�³iR».ÙA}šJ†#Î1áÀdÔ©¥ö9óì¤yCøA3… Wr†„+iC3f´f@i„¤¤A‹À±�â× ’Nñ&“ô0¦ ÌiÓ]eÐá2bB,øÄ~páma›VœlŸqH¹Ãmbð AH¨ "LŽÑZ¾waQŠÓB|åd�'ÈCµ)»-ℊèÇÈ…M-hZFô#‰AL`º:g˜(—Œ3> endobj 27 0 obj <> endobj 36 0 obj [/View/Design] endobj 37 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 49 0 obj [48 0 R] endobj 68 0 obj <> endobj xref 0 69 0000000004 65535 f 0000000016 00000 n 0000000173 00000 n 0000044768 00000 n 0000000006 00000 f 0000364745 00000 n 0000000008 00000 f 0000044819 00000 n 0000000009 00000 f 0000000010 00000 f 0000000011 00000 f 0000000012 00000 f 0000000013 00000 f 0000000014 00000 f 0000000017 00000 f 0000365002 00000 n 0000365033 00000 n 0000000018 00000 f 0000000019 00000 f 0000000020 00000 f 0000000021 00000 f 0000000022 00000 f 0000000023 00000 f 0000000024 00000 f 0000000025 00000 f 0000000026 00000 f 0000000000 00000 f 0000364815 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000364886 00000 n 0000364917 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000047136 00000 n 0000365118 00000 n 0000045182 00000 n 0000050119 00000 n 0000047436 00000 n 0000047323 00000 n 0000046131 00000 n 0000046575 00000 n 0000046623 00000 n 0000047207 00000 n 0000047238 00000 n 0000047471 00000 n 0000050193 00000 n 0000050455 00000 n 0000051579 00000 n 0000058101 00000 n 0000123689 00000 n 0000189277 00000 n 0000254865 00000 n 0000320453 00000 n 0000365143 00000 n trailer <<07DD183D0A6845D89EFA3C7651D1C934>]>> startxref 365382 %%EOFsindresorhus-got-11d2e83/media/logo.png000066400000000000000000000056441434406364000201240ustar00rootroot00000000000000‰PNG  IHDRôæa‡œcPLTE€…»€…»€…»€…»€…»€…»€…»€…»€…»€…»€…»CÞ¤€…»€…»€…»CÞ¤€…»CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤CÞ¤€…»CÞ¤€�¨îtRNS€¿@ï` Ïß0Ÿ€�¯pŸPï0Ï¿@`�¯p PߟÈB§ ÑIDATx^ìÚË €0@Á-  QPA¶ÿ*ýÔà%ìL ïúbŒ¥_{TÂXóÑ¢Î|õ(„#?Q›è¢#:¢#:¢#úPÌzz»wvC~ÿ§Üè°{þÀÕ.J Y"¯F¥O))E)) ÿ'&)mÃèWØ™ —~ZD.Õ ÌáPô |uz~œBIðI$·Š®¨m²ò¤°•ˆ‡Á§çB�¦HÆÛ÷Ù5ô9%?仟N jÈñÌpÓÁîʸ_f }xëÇÉæ]A§C«“Éå˜1š#“"iXCÿ'c£Ì@ŸÓ©1ŸJny´r{ y\ˆt•âù‘hÎE7g’?˜×½øú‘{´‡‘#VÐå²ÑϲÛsÑíiäÒýÖšOR.ÿNN|t%Ø¿oOxŒÎÓ2„$¤z7‰nï×r7ÌêÁ™¢ÿ »ÚÏ|öK�]+ÙîGîø\YÉñ.ç91Ìiy>é»­™zª˜ÿ¨®§½Ò|\Šò¹9eFJ‹è�ÝÆ× +–râ‘øJ'vIs½H×9çÖN~­EºYt°Î]™ÕÇžoOó¸lPöÙû¼ÆÓ…þ ƒ“æj{uïì6së‚+Ò —°øXB]èw ò]Š+=o1—zY䡃]$„ú¢ƒ÷)¹ì¸Óo@åä¦[«Ò'„¹Ðï;8y¹g¥©æœøæûéüî÷BŸÈ¹¹ÞÇ£"™Çe@G¿/Lâ…ŽFšïºCpj“yTû<9áîÔ…WÒ’Ã&u˜›Ý— ~¡Þ7z̘ÚiÇ*‘l®Û �)±Pï�S ¬ŒÌ2„-Ì èëÕ3º9®„UîÞHhdèëŸVtŒ>ùˆ–r”žyæ@ÏS�Ý¢�ÑÃtõHyNÍ+–‡ž©Î;EWþ s¨g/« =GÝô‰>þ2×ö°Û8:‰@ÙWv :Ôuè�'dU%!‘†tÂF±7ô��Uµ­7;GcwèÊ#«êp8v$:–5Óú€ÛNµMîÚ‹®.ÔºLȪZÂ㱦CÑQªŠ¾Ð=²ª–à�8…›é �úáXFÛÃѱ¬kÕºÕØÀÖv»�³ãÑqð7ôƒ1Ðk û®àY tÜu°½ LîÕ%ú\¼è]Ô×D ƒ"èXádè(×l}‰.K¡£Xè‰>4�ètt…Tï]V·‹CÚÍåЙTûè¨�ê �­{)tP…öÑmu‰Ž¤› ¢ãª±}t^a¢ ŒÃbè˜_’j]×—è)Wãj}FW÷e:Y]á°mô±¾�9ô}ItìiCÛè ­«nvŠ£K\¹]t§¦ÂÙ=FGÕæÛFQ¯U·wgåÑŒ·VÑ1»Ç*ÛT=`~o³û\a=aŠ£c~w-£G̤Õ=—«Ê£ãâ¶Ut ì±&t‡d+ŽŽi¦]t[ÝÞýÏ@ÇÕÛE7žÌHäZqt”®]ôˆOXc•^çïí¢;(ÕÝÞgg cQ—Í¢×·¤c~=Ûœ©UtYÝ’ŽîOAÇ­æ¡Mtìãj,(øYè\M¢s´¬‘Í;зž ùVÑE…û8óp#õ÷·oß÷Aÿïü«•í{“è¼&tþhŸñã'ç_/; ÿóçÝV6:-¢#©êCÿmv¾yB�Œþýõ-þ÷9º¼Ð‹Åøý߯P߀ó×?îTÛèý[Oˆû¨—W¨o@‡ùëߟ{™6ÑåIèôŠéÔ7 ÃüϗϽxè:»A�†¾4ÿë}{ÔHùáÂ::Ièdsæ›F7{ Ç,íõ·Ïz Ô�N6g¢it¾z¢Å´Ú[Du ¯›—B¿ÐWºÔ�¢ôuó �zgttš:Ð×ͯ5�¦4úR= ý�;ók÷N‹9Ь ¡¯«¯£ßæ}£kV4žC׌¤t¢9¼¦ëp¦:ÎÞIê@'›Ûâgï::Aèó®î²…Ñ%IUÑèẵZ }:A÷_ æ<9ƒŠtª ]¢b"¨�fŽgäôõŒ\9t|;�¢t‚yOÃhY5èL£Qu “ÌqýØø#к*t�5• tš9ž»¿¾áR¯}!ªýÞüú.ÖOS:Þ KS_¢¿|Ë2ǘSm¢cû>Ô„°“£¨/Ñ_þÊ4Ç‹ ›Eñ «AÇk¿ ê@'™còÛEŸ°¨×ƒ>bQÏTÿÏ�`Ž%}jS©© }B¿çªß€N3ÇÛa[EÇT:ÖƒŽ‘èAès¼'´ƒ÷È%U ::>Y’ú;:É»ÈÞijB0¿ÔßÑ)æ¸ôÜûaEMè3æw‚ú;6Å�yvñèdëAG×ÛluÁÃmìã}ïCMè©Q·­æH�¹�_vЪ"ô@kÔm£9~­Œ5�ŽÂÔT„έQ·Mæ˜abÛè¸ÓækB7ÄFݶ˜ã×VCã訊M=èè~CP§š3©ÆÑ‘U¡³�Ú¨Ý#­ytHSEè6QnDs$ºg sì•«Ag‘,pƒ91Ñ;@ǧêAGªs‚:Á|1ÌÚGGª§P : ´%¨Ì%”Бê®"t›èG¢·|sæ�è= £,N¼tÆýLôG¶ù„«õ�ŽažB5è˜|� ¦ÕPê šSÕ cþKŽúnÐq’b=èL X/µ•å¬#tåKupúÓs®…&:¯zBg2•YÖ•ËH©©ÈªƒÁ•$ë � ©HZŬyT”XÖ•K8�ê ]¹iePååàpücɱÞÐYÐP?~ñÌxhíà½FÄ×:3éhõ ³+£áhuž0ùtˆÎ†ƒÕƒ& ¨;ÒÖ%:‹‡ªÃ<’öÉi>²–ÐiìÃqæŽPP£Î娻|%u-÷5—ä}b ¨Ÿ;³=±¯¥ž¦Zv‰A²ðª#ܲ¶ÐéêQíÖ¿1m)Œ$Ú4îÖ&ëèm¢£×¯îvꌰu¯ õîmšõ¼_t¨ïz×iÒ›×Î"=íUžbuŒŽµnϱ"m0‡úžS|p‹6õ�Žz1lêÅ"ª]–à¤ç�*5Œ  �™„HšÓ©ŒN¾ß$,ÝCz�£¸ÐYð ‘¼!’û”v,üù�Bv¡Ì+°OÙ}¬¦ÅÀjŸ7À8�ÝÆO~òõBÇ̌ЃÍñ @»m¹™‰Äò“Å…Žm7™'{ÉN4X‚w+ÿ1#Wçåçñ:böéCŒÓ*_àÇÊyØPthÑ£ƒO«i~¡£àZ†�æ³ôR’�:} ®vŠ™îò£xHó ýñ2ˆ‘ÏÒB[ʉ ` R´ EýüHÄ8|¢¹ÐÁN �ïÏ>@áFn䯡¤ä‡Ïž;\è`×$qÍíqmâ„6¡ø¼Ð3j¢6¡Qe_ߤٗŽ0䤖ç¶Du³ÄõJ¿~ud_=æá¹ÜrS±ÎUf|V<Î'|M,°ÂNñ1¼fÅŠ†šãêXtƒ<ã@ÓÏ �£÷Ü^ Fž5Í >ñö‚KÅÎXs¤œø[ÌR*vzX9ñ(Ä[™æ„?öÿvà€a�ýSÛフGw& ågM³IEND®B`‚sindresorhus-got-11d2e83/media/logo.sketch000066400000000000000000000431331434406364000206140ustar00rootroot00000000000000PK#’\0s document.json…R[o‚0þ/}¶Ã2À7¤�¸ì–±7gL…£c)ÔÔšh ÿ}G¬ÚmYöÖs¾kNz óRŠÍ†ŒH¥Êm­!|ÎÕâJ3áø™ÏÙ0Nix%”±qL£ Ó(ä<ÈƒØ ò1ŠÐ ®–ý*UR¢U­Z$•J*�Ðt6 +-ªíX7bÙ5ú‰Yö1­ë®ÃtÖÙˆb-J #Ç­Öò‚ŒI[Á®_.•†zÕ>ˆ=èÂì%Øv_ì›…’ßwo°3.UºZ§êæCh¨z U­u ûžîyîxŸS\u¿ûGèVù•|ÿ6YÛk9ÚÇâ¾x~Êk ¯°<^o@æ–eÒ4[#ŽÇ´0½ÝûMÎóŒsÏ£~˜1ü&·CGŒÑ Éâ0ÉS?ðéfÝPKÃKm¯ /E/pages/FDFEDD00-27E4-4413-9844-5AE97AFC2504.jsoní›[oG…ÿŠÁg‘èûÅo¼îHcãÍË"hq"qM‹I9vÿ÷ýj†¢)‰òŒg¼qXk†SÝ]]uꜚæ½_ÎWóí¶÷´w=¿(zg½Åú—õËÿç»g.Î&³éd¢TßÄ©ë;§m?'çú~8Íq8¯o¯×›Ý×»åú [|°z÷Îí'gëÍëùŽûÿùù¬·¼:_Ý,ŠÅwówÅæÙbu%,ª³Þör}³Z¼Ø,_÷žþ:_m‹÷g½_7ó×Å�ñ6ÌœaÎyj·™/¯žoÖ2`e¥|ì¬wY,/.w½§Vaö·åbw¹ÿ÷Ûr wüÆör;[-¯¯‹Å?×›åïë«Ý|u°p¸÷S�íó;w¾[Ÿ¿*G~Zn—/WLs·¹)ö ûn¹ÝMß^ϯX÷‹w×E9ðU¹˜Þs6â‰îU?ÛΖo�ÌmŠíò÷åÕÅøv�¬#Ø×Æ6ëÝ\–}ä»Ñ¦˜¿ú~¾}5¾äÁƒÉíîÝꮫ+lÖÕbRœ¯7¥¡ƒå×Ë�,€ÿõžj1¾›ov>‡/çÛñjyþêÅåf}sqyDzËG#^ð‰ëѧT >ŽTh¬î»4ÊýÑ$ û£lVÊD3´�¢ïÁG«[|rþr»^Ý슗¿W«þu¹*öwqЛ‹Þa¿ªáûÏ/‹×Õ§·ÄÿÒg½7Õîÿ(n]ó%ƒ^Gsz§Ã— zspâj}±¾òÕ£_uÄï<òÛËùuñ�“q?Ê:ÏF!I܃º3¯ûÃGý”r�ÝÐG¿ZÔÕ6 Ü!“ؤÉe¯½Õ>U©cä mâZ1ç*@:ýX�þüˆÕ‡ˆýQö﯋ÒàÕê^ÄÉ¥ž,uz5g¥‡ ;_¯Ö›;¦«+ àêúr^.úåêF삳ÚFã]V:Ï€î¢�ùRT>%c½ÉN³ƒ²Ü…Ü0ÁDçUNÊf£}|_ÍîCÝ[/·Å3|üöøÏ]qµ]îÞ•—®ç;2ðjvxJ®½XîÁ•‹¬ÿ¿\}>'`ï§jLv:ÖãYœ&¶ïü0ôÓXMûS= S=š5þ{§ê_‚0•ó'%âËõzU̯~¸.6ž(„Ý!¡–DÖzûáïë5ÿk¾XÞlGÅåüÍr}³©bXnÜ‹µó›Í›â¹Ü(·isUlªGË�Ê»³Íš=îý¡¹LÂlLòÙÚ�Ïž�¢1io\6!¤@¾¹÷½ýs߯UX¢ ɘÃ߯Êþ¢XÛ_*WõI¶ßŸµu€7‰"�i�£‹Ñh!«@|ZcÔ&¨j<ÐÜH 45þ™} Tö×똸LRùž\/(„©îµ2pn“m~è†*È[xá”ñönpQ :eêŒSže3Ľ%›ûKÖ&Ŭ²Q‰i@¯ö�Ô­ï(­÷cè)‡ì³ –�­ uX >Â]& §öÞœrW5;zÚÊÝÀ°*ÅF‘ýpÍMçØÁ ^@ÂÅ f¸L²´ÉîæFZdwSãí} „>eB:F›`]¾âÈÃ:Åk"AE�#÷T²AYäô $¾]n76ÞÁ :8—¢ Q…ŒÑdžµ'k’sXù¨úâÊyò’™odëʉ²}^E+Ä6™Ü0¤CÓ)¶wBrÖ«B°N\® ;Дèè±¶å™˜å£Æ2AŸtĈn·í§-µ]žèDYd i²I�îÍÑêì½ÕÂPiÜM>â¡Tº(³3 ˦QF6¶�øÌT¨_XÁù®OloÒ]ö÷Y2îDÅ:ÌÏÁ2V©ƒB9+-’nâM'øþgQbçÂøáØB¡«¹ª[Õu¸~÷·åÕ‚kÿºYUò¬a£$NBœåܧ «FIOcßM‰‚áxœ'³ôõª/g’Ù©Ìlví¨oç€L‘>¹J‰±†ÍùÚ+_uMLxö‹òlèü­iòg7MÀ�;?GM�’¼Ù7HÜ¡iâ«þJÚ÷[üß©i’Ól6qãi?OÒ¬ïœõýn÷Í(xïÆ‰‚2úŠÓV¨†ä,ÅATÈmÖjcé(kýQÿ$ Š>ð€!ÓUE_‡o=•/ÒS1.eï3‘ú™´®{f"ÌB+6U_CD"a@©%Ù)�ÖÁÙ!8J[ä&OSžIüV4Ä;T&š�º€™d+ÁÁ�ˆ Ô éĵUÖ M­ŒæÅ”e „ ÒÚ%‘éèlýq*&l›Êð–×L,ã£-)þ@ BEŠÆXÛÊ Šu"4œg!�!spÒL•slŸw ÛÅ¡lXÀ~ç)ŸgOú%ÑO†%°²dTÐÔÄ‚†€j–ŠÖ¶h¤X’Rå,(�þްy‰+ß®ñÀü\ÂÕÙb &VI|€B-z‘†>Щ±’0†ñ¨Tô VŽ¡ùË¢DÿGâ*_ÃK“S™r– öpíËX€”¦ì`&Æ8�ŸS»œÈžðÒ&—½é *é Êæˆ^ò’É�¤ÉlIYíÙ£ªz¸–dÓ(sM,£Á긹c>ÆœiɉTæ®!EBÕì¹ î´sF �­!úÚ"6Íx"� ÐŒ.0&29Eâ¦*$¤ŸÖµ¦<;hS�>“Õ{€`aý®jy Þ„lf ©e"°)D€Œ$ªDðZš£†4#ÆN.PèÉ=*ŠyÆ€OK<d¼—! ÜÖÕ pœ†¢×3d@|W:uIaA4#ÀÕq#¸Ê¡Ô`ÈQ) ¤˜¢k“¼ëkÉØOIŠ$…?yðÒ®|öe'ù¬QKÉŒ’gͱŸôÝ�_y4q}?3“Ç“<´_sK �}è#Ù‰ôhÉHà;«#s. 9s°î ʾ’Ø£rüÖRúBÇt2d7:Ã/dŽªÞ;äiÑÅ¢á]þ(k–ö‘œSÒG@-º’yÇh=:&ÙØòÍ|Þ ^åԞ貪N!ïåÀž—�)FËKbÄ�SŽaªˆHv°.P&Då\m �ÅÚ¤m¶Î8SyQ Š—)j”®7[ùaêÊC ø�5ì�J í’¦÷ÁrÇ‚ËÌ¥¨½´îJ�®Hd Ø!(… Õ¸@Dg–—À8�î»(冢sØkè0¬UƯP’Ö˜Lt ÐuˆÌ»e�š ^6Qޝ4@^ýFT[~xNÉ>¤´‘ý�þY5O#/ •ÖÖKwÁš–]iA�±ìh…}"dá§R\,µ›ŒœÄ’þ§ôø� ·ò�{¼Àˆ‡M”û§–"â™Ð4Þ—�PåÁI#-Î1e9w-M#%‡¢Ò#¦;4Q¤)%T ŽuÕI0ôˆ—ž˜NP•½®‰·c–lŒ$¨ÏÕ¹›“‘Ô¢‹Â>#X¯´#(±Ÿ= ¤õ2ÀÈ˰ JcmLLF`«kÀÎKÞ“…lÕ‹¹­&ÑAÔ4IÒ®�fÙoX䇉Uçõ Ž”pY|¬êÔHa™ÊZÅÚ .T�ë�×L;�,OØ{¢(y)¤kÏ”=ckÈ(bžYjoúD†Ó³¬‡9öíx<ì»±Ÿö‡Ã˜ûÓñt4"p‡v<üŠû§�9zYÕ0Oο¶–S%߄ŗh9×%Ç»¡¾rÀë쉔,;³7 x9}]ß…’V90…•$iG?n§M#ª±ùÜòá eÅ¢Æ)N°æãã”C3Ò¢1ßt†�¾ ਠ:å’¦dÛÈ '¾ÑÔJ»/D4³ÞÁ ÔQjŒMšT¹ê\eˆ@FÞ9Ô‘¢ª;IyÚÈ�iú¶ß†hfºÃÁyªxÒ²bS¾võEÖK¼K?6 EU¶j,âT—oÄ!M¦Ó©`9à §NP9ðb¡ræ±]øØ™ç“6î„×ò[Íæ÷™p/] eu_‚hn¥Í· šZïžï!ó¾‰T爯ßm)í…ÖÛ˜õ­öjà‰F_…hl½ƒ‚>5FíWNy¯åN�ßýÐwiàò@åòf2ßÍïRÚÃU¨Ø|[ pq³\%U~`ÐÏ® a7‹_¯Öó{³§Ÿíl¿ÿPKïq¥}… user.jsonË» Ð_1wÃÅK¡ÝKã`âæÞT‚$´4},þ]]Or2¼ÒxLnޡɰ ÞÝöß\ðïŸp, ú®·]'—Ú' ¯ W­­uÛ_¥ôÏÛ¸¦kða†2 ÃN¨¨ƒOJÓsˆ‡ƒÏ©J"”•Ô².å PK;~­ž meta.json��Okƒ0Æ¿ÊÈY%jBšÞd*;µ²�]F‰Æ6¬&’¤…"~÷½6:ØèØõ}~ÏŸ µvt@kDSYO;Æ ,M%åýЧK*™ÊqÆ{LqOQ„F±W¾0]á‚´Âu­'T—uU–Ç«HLHšÇ|EHL‹Š³¢¾Ï(&‹ÎˆA�]Œ»`â 2Ïs„ÎÊym Z§8�PoM€×ë.Z¢Ž"h©�:\^>Uœc ÿDÚƒ´0­í´Ù'þM…ö�/6§`½8«¸à!ˆ–Ú›í¦hš§çícªÖ)Íô¯a ÇW.Dq’ÁMžô€ê³?%ý½æ÷e~î.5´Ö]`¸ëoò‘ín'�ßPK ê–3‘3previews/preview.png‘3n̉PNG  IHDR ¬=ƒx–sRGB®Îé3KIDATxí}wtÇ™çG‘Hd0�9ç Š)Š”H%+ZѲdÉrØóÞ{wï]øcïÞ…]ßÞzo}{ïöÞÞíóZ¶d[’Eå)SsÎ €‘"g¼ú58Ð 0UÝ3Ó=�¾�ì™®îêª_ÕôWõÅq×#ÀX‚À§�—h_W�ÿîŸ4ŸnI�nÉs¸RFÀ�ŒcäÆaã6»�¿ox„ o´YõH®—pÌ€\7dÜ`7 p¶§!l3Ëû[Þ瓌€`äÇQç>[Ž@ý@WØg4ö„=Ï'?"À È�£Î}¶ ¶ù± z~°`äÀAá&¹aoÀÄ0:0Òˆ‹�h€Ù5#À¨`¤Æ‡KF€`,B€�EÀrµŒ#À0j˜©ñáRF *Xl|“Ï`ä³çîÆÖÅg~Š»`äîñãÖ;Þ9t`¸YŽB€�£†ƒã˜yg,¹'V!À È*d¹^F€`%Ì€”ðp!#ìˆn|—¿`ä¯ñæÞÆ ÀÅ h~Œ«`äêáãÆ;fAÎn™S`䔑àvx f?žNîŒE0²X®Öß0ò÷øsï�!À ÈN|#À0Œ€É02P®Ž �ç# �3 }Œø F€` `d¨\%#À: žŒ€>Ì€ô1â+�ˆÇž¨cÆ7øf@þsî1#À0Ž@€�#†�á5XçµåþX�3 +På:F€`t`¤ _ÀDŽ›aGŽßá?’ü×åá QWWu⯳—úÅ÷„„q¡B‘87~|"eNJ¡´´ñ~…Œû,‚‹,¾Ô·xšutôÒ•švñ×F-­ÝÃÌæÃéíˆjÐŒ(33…²Ä_ff*e Æ”••B“ &RrrbTõòMÎDàúõëÄmÎn•ûðªªn¥ŠªÖ¦d6õ÷RcS—ö7ºnì– ò3hæŒ,šY˜E3ÄqÒÄ £/ãïGàjm•^l¤ÒK�”””@?|榈[l…®¢²UÌ­LO3ÄžžŠo¾Áù$%&PJJ(Ë ýæü>„´phè:••7Óù õT\Ú ‰ÔB.ˆó´§¶®Cû;|´J{:Äv`H3Cš?7—²³SãÜ*~œb“C—ÊšèÜù:�é@4 Dñ£Á¢;_;©Uìà÷ÊQJMO‹äÓÒÅ4wN.%&º_ØiÄ®o.ÑÙ¢:ºví[ìíÄ›Ÿm iiÉ´|édÚ¶uM˜�D®d@X�ž9WK%â­(ÍxÇÖÚÖÞ£µíMŸ–I+—O¡eK&SzzòØøLÜhkë¡ã§jèäéjãŽÅj¼¼²…ÌË W,=g6[¸\Ñ¢=«»»_k/ÚŒðÂy´nM¡¶È‘6Æáo¼s†Ê.79¼•Ü<3À‹ó¦ækôƒ§Ö¸‡�Ñœ/‹#Ǫ©¹åšXØRôQøûüËš3;GcF‹°î(Ž£q¡¸�ޝ¦Ëb÷ �•‹—Ä ÈäHØé�&ü&Μ­Õþ&dÐÍ7ÍóiªØ­¹Ç¸µ±±‹™Ïè�õÁwH0öŽß55]£C‚cž:SC}}ƒžˆë0ø?þÂÈJvö¬lÏôÑi)¢Úoö–Q}}gDMƒ!K¤döèÊ•6eêDŸ>úô<}ùU)­^9�6n˜å ýcO”Æ@J0¸Ð`ìË€ ºÚõõ%M|ed• âe@¶Nb1ŒgaQ¬E¥�ï==ý¦aAÇpNÈ¿ñ7kf6Ý~Û\bFdÒÑ2ž@ ®Ö¶ksÂäMM zÝ#^­B\h„ Ä?x¸’ŽŠÞºµ…tÛ¦9Žv˜:e¢æÞ€ß;“€ncï8„Оý—59!|uÌ IShÚ´I”›�F…UZFF2M̘0ü'¾ÃÒI�À”:„¿tø±´·÷Þ8öh&Þõ �¦0¨ ¡oøý«Ç˜é ˆ�òj±køø³ šQˆ�ËÃ^°l„îÅ.°ºúm!¶�’“øí€?y…6Ü<“n½e–¦3’\nÛiy<ùØJzçý³š^À¶†ðƒã†@nN=úðra@“@ãÄ ßše}„ÝÁîâБ*�ùàÇ-¡S³ffQ¡Pöƒé@éŸeÿÕ\m£ªjñ'^|xù™aÑÃ;¢Èg1E?Yñ‹Oƒ>ú9üÍ;Òh|»v´ÑošO„mü—sž {^v²AÈÊa%q-vËÑPJÊxÚ~ûXØ�Á€`ºüî‡ç"–ÍF%99I(‰siñ¢Z8?/ªF .3�ÍÂÒÌ&⥛Ä+º—Ú4{V=xßÊa3nå�>{•¾øSiÄ&ù9bw¼Rüøa¡˜�»©ü낽` t/æ‹‚ �/®§’ÒF‚X8R‚;ÀƒßYBùùé‘ÞÊ×›€À / Õð:Å5«¦ÓC÷/1á)î©ÂVV=XìÙW.ÄW‘‰Ûà�¾ha>­]5ͱþ9b«‰?¬j ÇÇ‹æØ°¾ŠTŸT^ÑL¿úÍAºkÛaíTèž§–b×üîç4?£�Ä ãS8=Óèm†®3ÛÅ r±˜óø¼®ù-9V¥í¶ 5J\gí~ñmF [o›£‰AŒÞË×1f#`‚%v=ØýDB0X#˜ÎzarŠp8n!ˆqð¢ÃßµkýÚËãlQ­&²3*…øå“Ï/Ð…’zzø�e®°rŠÇøTŠèo¿w–Ú;‹6F·shýºt‹Ð�ŒöÌ}­S¿ÃÌø Á=‹#":ø6AÏZt¡Žžxt¥&rtj?ýÕ.GhCâ ¹-"8Xè|¶³D¬âŒïz²D̵͛fk/p#FqE1†‡Á|¦ÁðM1ʈð8¼8ï½k‘†G �wý­{Äúë=e†v”Âðdãú™š$½N$`½Ñvž~Ý|<ì-‘ê€ÂVæ$"8ìÙ_NÇNTÖ£à·tÏ� « ÓMWŸR‹à¦ ÜRW÷/ÒÆÇu±Ó'Ÿk?£ …òtË­s´«ÂŽŒî7ÞOŠU(v„ß콬‰éŒ0"(Úß;H0.è†ì²ÐÝŸx}‡æ›ïžÑózÏ„a v;9Å+¤Ž"8½~"²Æ½w-¤MÂâm·XÔœ8uUW´ ½,íá¡û–:Fª×W.÷qc@;½þö)‚¸Äá¥1 ˜�[Å$Fú¸¦@0¢']A ]ÚŽ¾+FÄqW„õÝÓO®¦)“'ªóôæð¯î8AØ=ê,Ùî»g1åå¦é]jj¹]>Cèà> n½e6},D¶°žÓ#ø Á í©ÇV±�‚X•;ÃÙ¢ÎIª� ‚ŒzÇ›§4¿I;BNÃôøá–šb�R± ¾À:éñG†ч³Jc=BÔï—^>J�w-V€^&„ïxE0=ÇEèyÀxøÐ²cÚS¾E¼-è†ú)8Èjè•Ãß`µùâËGè{‚ ±#t8„øœÙè{`ÆøD8V¾ôò1Ý“””¨É£ŸÿÁM¾d>ÁPƒýèÙu´ýŽù†,•`e·ã­Sš|p=^úŒÝóoÿpTw.ÁŸâÏz‹�ÌÇY¨¯X6…þÕÏ6iÆ;z-ƒh þì�à¹z×s9# –î€Ê.7k/E#–9p}äÁe”gQI,àY}/Ä8›7ÎÖa¾ûÁY]‘tl�çãñ¥—èry ýñ�“J_*˜æ¯;¶Îµ=gŽýûŸÐч n¤rxï£"¥ŒƒÞ&ímbg� LŒ€UX¶B2¯×Þ’Q†¡Â¿øñíåj$;ç§_{j'„¨;ÞR3«@Ü´MxûÁHµi§­HHgFãà;÷³Ÿl iS')«ƒþñË]¥âï¢ò:.Œ ?êyTY€ŠKèõ·Nëš‚BäöÈCË5çJ;•¶*€œR†ÐÇA,sb=‚µá©3Wõ.s|9ô‡¯¾~R ±þ~,p™;'Ç1ýqÚ(¤’Ç‚ÏÈ.yßÁrújwYðíü9Tï9?2'ÓÐ%!vC‚)=…®ŽtLƘQ˜©1!='\¬`±ÒS<rü¯l©8 �P…œÉ)ÐòüÍl¹áð`Aó�»i&ü�¸\²*`Ò ÿ"&FÀlLe@ðeyó�Óº¾S§LÒDJÓE°P¦È@<8¬øUVE�$~ªkœZ³ýW^;®d 060;v9U7§µ«§kVozþQ»¾¾HU޾�¿Gˆ€w9*ˆLc@šo†P㥧"üð™µZJÕu\¦F`’ȧqôC*jiíV;² Foˆ…ŒÊÔóè™ï­ñ…�˜Õƒ„´ÞÏ=½V83«SÄñ§Oˆu­ÆSU¿J§%$SÝìÁ2SL€ÿ(äôÈ•£"DâÅDG8¦Ø€çûó?X§¥œ�զǠd÷Ùy>+0ß—Q~^º`>«íµ¯~ÑÈzfßycÅnsJE~r>¢à§ªº¸Œ0…!$Š^PQ8—ÂJÉê\~R˜×‚©Ï››;¦ëyâE�À­n¢“§k´d„²6g‰T ÏŠþjle9༓�dðÀâ¹ï«±…nþfz‹MÙ3ø<#Œ@Ì Á / “kauq 3JÑ—W0w'ÖØ! eV´z²ýèŸjþ�XÄÀ�IF`:ÏŠ$ XœOndAD …¹¤’RÀ°å5ÙI™"C@¥ò_,l| 2øB¯FöOD"VQ¶Hôõý'V‹a̼Nõ.l¸y†öçF0�ßÎ�²l˜ðíyT˜ì»%!Ÿ;ÙÏðÌ��b ÂQæDŽÅÂû�ÓÂF¹q¾ÙÕf·‰f­Æ)j®€�o¿F+ÖgÄDö[¤f«Í‹õµû’Ä*.ºuóš/²Þ2ÅX>¬“àÜù:‚È”É$|¸Šš}ðI‘4·9†Ѭ¿÷ØJŽn`ÒÜôr5ˆt°ÿ`…´‹óçå‰T s¥åN,pó(€ç2È9¸Tôé%äFKKUŸ¸,~DÅ€ŽŸ¬¡ó"]€Šî¿w1Áð€‰P!‘òÉRO@ßóØÃËUU8²Ì-~@zàm¿}¾2Âz_߀– ]¥ÛÐ{†ŸÊ§ÐÑŽ˜ÁAp§ˆ¥"Dßu›õ•ª?\fÈÛ$ÒÈ ?䃒õß ç±P9=#eŒ‘˜ôP逮“ÿdp3 Ï…3š*4 Œ� ‹‰ÐC ­­‡®”^‚gº‘¼ ‚ à‹¸GJH�¿.�͹š˜�H�Ϩ0µ”W´ÐiE€KLP¬–ØÜ: x|j ØIˬÞà•ßÝ‹ÇÜÃ'ìA–q[n�-}øÐÐ}º³XZÎð߈ 3 -׌Hï«¢m" ÇwS!Äe ¶�•ŒîÞ¾ÀÕÖ“NH !Ã6Úó[„%¢*�ò!•<#`à èÀ¡ å{Ê䉴Iä gbŒ ðÙÎéeV»jÅTi¹ ¼$‚ àðÅB}!Â(Évµ²{ø¼0Ä€`tï¹™,&&ô>*›!æž�Fà‚ÈUsµ}ôé‘ïwмGî'/² ÒÜ*TYR@– ¢›½>”ÀÁ! »Êð`íêi,z‹nÎùò®½ûË¥ýž;'×Q‰å¤ Õ)ð&ûî4|ƒ�]F„a ¬e™=tw@ˆxpðH¥´(‹ï¼c�´œ �``Èr¥¦-øÔÈgì¤ïÚæ…Ý‘—PRR‚–ÅxdàF}@øžýBdÏÄè! Ë€à¡®ÊñG5öÓЃ™Ëì=Pø8æ¸`~A—Èä|– y„ë‘Ñ‘cÕÔÝÍ» >aÏûP§d@˜@‡ŽV…Å 's„ÏÏšUîVK;Ǧ#pµ¶ƒ.•5Iëݸ~¦´Ì}^Þ �Æ]Ûä’DHà ªî›µñn±’«L$Á,Ӌ榲þòùØ8¤åbç3{–wB7yŸý�–úcÎìé¤8|¬JèŽåïé�.àP<¡ƒ+e@ˆÍuüĕЫƒ¾!4ÇÊå¼û ‚„?*@Ö\•�È-žÚýx[<Ì[n�ü5ä3D÷-;¥¥0‡â ª¸¤‘Ú;ä)¶·nž«3¨*þÈhN§²Ü2H�ø�^"¿H°kEDS,be÷ðyÿ Ý9.×ý ÞÛŠåÞzaøgÈíéé‰Sò¼1`> ~ZÙƒ½ÕO½M± jlꢊÊV«›à�úÙax›EtâËå-ÒA]·vº´Œ �Ñ Ú5BïÈÈk»Y?½z~¡°^ÌÌ”û;YíÕ®s¿bD ìè¨Ø6Ëò³À`ÍÊi1>–o÷§lssÓ•ñÅÜŠ“ßösªwr‡±I¶[g²µíË€TA"—-™LHµÍÄE ¸´Az©Ww?^IH'¸QÈÿ%Ó{!6œÊeTU¾ýêC ÜØPÏŒA±Áêë;ÇœœX!½H~Û!4ϼ9r“lÄÿcbF#0f¤Jµ]P�¡´x]9gJJ¥ À˜%G˜ó3y�Õ ÑüåòfáS8è�Žr/LC`,*–çóXºØ›«UÓÐäŠÆ PrQ΀T+æ1ñ Ç#€PJ‰‰c^)Z»‡¨ô’|.8¾sñh ep!³¥NˆJš[®I¡^º¨@ZÆŒÀhúû‡¨¼¢yôé‘ïóææŽ|öÚ¿é€0~È„¬ŠfÁb8¯ÍòØû€TÖJùùé±?‘kð ÕWZ¥ÉÉ�¾}އBïŒT¿é€ý_´ ?ðqÌñ"ï€Æ`|Â÷‘**å¾?¼û ž*üÙÕ EFHÝ>aB’¬Øõçea®ï˜N.È“^�¸p�²01Fv@CCשúJø<-¸xñ"ùÊ&P�`Tó ˆÉ{d k¸¼<¹¤Då�ì=4¸GzŒ0 „Ê—ÅêÂJuê~aè�Éå¡ÈÏá*žO¡XyéÛŒéò7d÷øâ¼·@7�\\ÄÄDŠ€*¢Fv¦÷�Ÿu@˜+ª].ï€"ý5y÷zͰI±ÊË•¯d¼ ÷,àp¨ÊÿbÕèloí¤q ´5}&-J¶/ÔÏ8 †è:}ÙYNE¯‰ ÉtGúlš›l®¡QNŽ|‘ÑÄ; X~^žºWc@H›+#¯[+ÉúÍç£G EX:©(ÛÜW]ô‹†}#‰ßj;OOg-§ç³Vªšâ»²úÁkôßêöÐ…Þoƒ¾ÞVDÿ&w=Ý7q¾ixä*DpmmÝÚ8ù5Z„ d߆âQ)ŒóD 8&F T»¼t22’#©Îе/µœa>¸aèúuz¥å ýCÓaC÷›}‘EpW:éßÖ|Â|XýcÓQj’ûmEŠ�j—‹¨+ÝÝ‘VÉ×{MtíZ¿´k*e¢ô&.ð5Ý=òù +¨~ ü.þ£öRÛ˜�ýŒ¶Îê�úwWwR�§þëƒTÜÛmõcîKJJ XÐʨG1Gd÷ðyï! 1 ÙŠ!xØÎ{ƒnu�dó ÏMI±&éüdy6N0¡ÿÓtÄên‡Ôï$Pe;ý{Á|äÖ®hüÔñ!}ˆõKªb¬»…ž�i~´‚ƒÂøºW„£´4óE%ážÃ缅攌R,Š€ýãœU"\”üµÿa{ ýc™�¼%2d¬9_Þߦ1Ÿ¦µ^ÙT˜dnx¤”T¹3jO¯|ŽXƒ×êD® 'T¥)&�ì>ϨDp*ùX�[›2E×ààý¸2!ûYPY_«`>_RË`�Ú¹ÉÙš‚ò¢( U; Å{'ŠGyâ–ðÛOtMÚ‰$•¸$-M¾‚‘Öè‘‚âÒ:}¦–Z…ÅŽ› »‚ììTB8¥uk ãÒ•¾¾Aés¬Òá�Ï«·Aabü‡–ÓÒçƒ �£�»Nz�v³ŸÒ¾fú‹Ú]Ô>Ø«ì˜ÏßOÝNé æÿÖ'$ËÅ­}ýò9¢l°Ë %Â&—÷*úæ'©”�i©þÁ�-ª£·ß;=ª»iΞ«¥‹eMôÔã«,o]b¢¦Z ûœëÂÊJz.k…V½š k×XɄ촂» Œ þCÝ.êT[µ˜Ï¤„ – ‰L´�‡%$ØÍ¢-é2W! ª< ~�$û”G£;./.i +Š,¥fõBe¸2h1BÀ„žËVûÿ¼ß^Lÿ¯ù¨Y]vL=E¿ç/jÿd;ó ª±öë»E¡¦$¡ŒwÌ<ŠWC+‘ÁÁ¡xµÃQÏimSËÌÕØS[×á‘_ž˜ ßÁ$d„ ½ÛfR¾h,àLO½&vë’ëuñh«w>�î©ÆZ5G÷óÑû$¨Ä%>e@^?$‹znæTWî€â8§Œ2¡j>ff÷m©ëdOýǺ¯¨Û!Ì ¨° àØ–yâ´‡ $—Ū&�Ó:bf{¶Þ6WȨå«x3ŸïºTry³Ú¢ZÔ Ægè‹&ôNÛ2› ÅSt¬»–þSÝ×Ô3¤6mŽ×Î'€½j¬ý*‚ `îß_F¸Äÿ\’òe1àOÜü¹¹ô£go¢3Bqß&Äqnœ%ŠÏ.RÍ©¡¡øÏ)0!�Ê0LK±™s“vm¬ÿÉ—u±Özÿ¡îúyÝnê‘ T4oB6ýÏ)wÒ$|4^¤k•è?^íãçØ�€šÅI^o? c[P(Ò ãÏ­ôó_|i[ÓU»êþþø3 a„ ½-˜È,&¤Ufáû¯UÓ_×ï%„ÑQ‘ÌíéSŒµW% ªqÐ-sãJW·Sê ’T+‘~ŸÚê«!ãR=RÌíöxeBŸýyÎZ½n*Ë­Þí¹VE#˜ÏÀu5C·‹ùœÅX§¦Ê}„”Àr¡§HPÅæjk·ïeá)”}Ö™,E¹!ÖíìRû§X —�R9üsóñ›a úZ¤žøï˜Ïü 9q»@Ãc¬e¤š#²{ø¼÷HÀjUæ�ÞÙÙ',Y|¸/ôÞ8ǵGYY)ÊçA¯f'aBojLèDÔÍ´Šý|Ùy™þ¶a? êì|†™Ïö¸ê|‚ÁR�q²ˆ� Zø×ã§Ï~|Ój¦^²Õ,¦ÜŠÆOØ)}�˜1ADQ—[:aNcBEôë–è˜� è³Î2úeã]æ³@Ûùlײ�Ú5'Tcœ™©^ ØÕf~nü¸Á€ä¢U'»eü›ÌOtª—ŒjuϾaBo´Ñ Q2!3ûòqÇEú_�µD{ªz�À|Ð>ÕgM’¿oT}ó|™#!`PUÙ õÒ+{~Rp£B K±Êu’nÑz= &¤J ) ï‰ªÿ»ñ�4mJ ¾…r…Îg;eÄÑÔ:ðìÑGU4Õâdt=üÝÛh¦(2ºÞÚj¯¼ÞÛð{·wª9UWß騎ƒ �T~B`Bˆ¢ýgÙ«µkãõß[íèWMú‘ æóKÁ|¬ˆjM_ëäc¬ZœDó,¾Ç½Ü`@ò-qm½õ±ÃÜ ·\†@NNš¬ˆj®¶k«y3w Ò‡,0Æ„ÎiΪ?5À„ÌÐíh+¢ß4ëë OÈ£¿›º�ÒÇ™ŸRÁ |!—AwŒ1–Qv¶|nÈîñÃyß!¨^ÕWÚü¤ÕóÝÒ>N“;ñ¿¬¶N¾B¶´aŠÊ�ˆãv´ž£ß¶œTÔ2\k(žWZÏb>KSòè—ÈçãæƒÞclU>„nvðÖx¾ "4#„‚ü aŠÞ1¬W¤Î­ã]PD òÅDÓ§MRÆÓÃÂÆ‰d„ ½f� EÛ¿ßµž¦ßµœÒ½}YJ>ý�»¥� ÿÛÕ­À¢ Tc;ib MšhMþ!‹ºÃÕZˆ€Æ€:^µ*©¬jµ° \µHJJ ©S&J»VuŹsÊ(zÑ“� )xAì®^iÑO†¸"¥@0Ÿm”ê0æƒnUUËǶ°P¾3–@§=ŒÀˆ³Æ ÅĨTL(cÃ]‹Õœª®væ(Ðe#Lè�BL&cBшà~%¢/¼.vWz´:u2ý­`>)d>h{•bw;ÃÅñõÆ…Ë#G`„Í,Ì’ÞÍ; )4\ @`Ætùœ‚yGG¯ânû‹Œ2¡—Âì„"5Bø¿MG !€ôhmêúÅä;óIÔ»Ô–òv1¦*ßÁŠ÷Œ- æ‡ÚŠÀ‚Nf•„ECc—­ 击Õ½9_\ïøNaB¯Š�ô6ÁIFÔh:Lï‰áz´.m*ý�`>Ée>hÿù ò1ÕËêõßëå>ôC¥„xpÒ1>WT'-ãF …²9;+5\‘vîÜywÌ)#Lz›ß‡0!ý=ÌnÝà£öR)F�‚õiÓè¯ n§ñãF~²�"G‹.ÈÇtº°ŒäDtŽ.Û2›çÌÊ–6èlQ­´Œ KÈŠ„²ºÍÖÈØÒ†…)0„^ÄÂTtãÔ�Hsˆ¸nŸv\’_t£dCÚtúùä­Žg>^Œ1•Ñâ…ù²">¯!à?O ´tñdéDhj¾FWkÙ)U „E`Ùùœ‚âJd¶BOF„Tû0D´ÞÙQ¦Û›[óù«É[hü·Â Ý{ìº"UYÊwˆ÷—*æ‚]mæçÚ‹@‚Ì>S(�wAö–Ÿ>mê$R…åQ‰lœØ_£Lr2B.Ÿ¯:ËeÅ#ç7¦º†ù Ñ*‘*üÂØÿgdhùà BΩV)ª ƈ22–.‘‹á**[ ¢7‘&´·«JÚ¥Ý]•Ò²@˜Ï_N¾�’\°óA›;:{Ie-«Ú úì÷£¯�ƒ¿|©\d‚ë—Êš—ò‘0„€êå‘Í‘cò—µ¡Øp‘&m³6¥»‹ù ŸGŽU«Åo ]`´8ñ}îG`ÌH™(,—ö¬p¯¹qEsJe wôÄeúæ¸66‚‡YÁ„nMŸAY°Å5;À…ÔÛG�WK‘ÓÄo ѾôF.ð<cz¬Z±^.ofcÏO ó;¸rùTi¥×®õÑ©3W¥åN.0“ �ùüׂÛ(Q‹¹íä^‡¶ c×ÝÝz2è›jìƒ.ã�>D ,Z»zºÔ)í;XîC¨¸Ë± póM…GD¥—©±I%eÝšé4~¼3ÃI'£Ml„ü¦[f} ý84t]ì‚XŠ ÓC`ãzùœÂ½û”ãàZІ mv©Ø-0HûÈ߉‰ ´þæ�KùÈŒA ìW!6œ*pàñ“5„U+#`�üütš?/OzyyE •”6JËÝP óù/.ÔùÆ¡¸¤�**[_Ç¡Kž˜Á¹ÆÃ'F�2 \q«r4DŸî,©ˆ?0FØ´a¦ò²/v•vØn&#LÈíÌc„±RÑF�±VÝëÏ2wÏûhÆLÉ€‰ØM¹9òüíe—›è‚X11F˜3;‡¦L–'ªkúø”¸�TLÈíÌcsøh5‹ð\2ÒgÙ}|Þ_( Ø²yŽ‘Ï¿,¡ÁÁ!å5\È#pç¶Á_Ç|þfoõô Œ9ï¶á˜�˜L®¿Ù{Y:ˆûvçó¥å\ÀÐe@°áGuÁŽ dèðùpÌ›“C çËuAÃ/8ý@�áêvÚ¹`&äæ|Á|zzä~?+–O!83E†[ÁIðúÎÝ‹”~A{ö]¦ºúNÉÝ|š‹ÀÝw.$XIÉ"žjEjgÙ}N<&ôŸ 6»Úà €+Ò-¨B'Áäšw?´ø¨‡€ü t'Bi¬Z!w&C(Ž·ß;ãÊp*AÝä�qDºE8§ÊJîw?8Gýýƒ²K\uþöôY®‹p0྾A1&g•F"›7ÎfË·ÑÀñw)†îÞ.dº&$I+BÊîÏvê§–VÀ¾CàöÛæRZZ²´ßÍ-×:F&g €ßw‹¹Ë©\Tþƒ²ûø¼0Ì€2„'ûm·ª މ ’nJ0æßawFϱ Ù¶už²1˜S%Ýí¤ì K aízâT�²µ0.Q…[RÞÌ…¾DÀ0:×Ϥ©SÔÊÅ>9Omí=¾Ó)�†HTJÂBÉIt“Õ“]}ðq]»&Wz«î岨èêê£ÅïZE‹�*•‹ê^?•© dÙd½ŒOD (!a=öÝåÊØN°Žyí�“y1“=¨^N\¡>òÐ2JM/ /À7ß=­Ô=Ho悘¼No¼sZ,äIíà¡û–Äô¿Üì°õŸí°GÄ€ÐZ(�a§"XÄíxë¿0T YT†ÈħÏÊS@”ê4 ìA�Âô¨«Óúä•ö¼ÿñ9e¦Søü|÷AõÂ+Xp?ÌG b„&¬Y5M™3× oÐûá#Sœæ;u£8Õ?c‰á ˆŠNž®¡½ûËU—p™‰|³§ŒÎœ­UÖx‹ËÏ~]LŒ@4DÅ€ð ¬X33S”ÏÄJüO__T^Ã…æ Ð*Ò¥¿ùîå®Ì'?/ÝœZP˽w-R†~Â#w}s‰ŠD:&k8s®–¾ HE“EH¥í·sÄF\¦F j ¦Ç^®t&Ä£±bU%¬R7�K� Ðß?¤‰ÜÂÚ º{»:`ioï€èûqe> ›èɪË.7ķ¯Oöþ{âù11±"3B6ošMëÖÊê Q TÛÐÀµ|T#¿˜ß½rL÷ ÏtUÈõSì+…r{ý:u6M0`¬ÖñâdŠ ,b^{ó¤nè#üÖ×®žÛÃønFà¦0 Ôuß=‹i¡�U6,™àWà•_v̤öŽ^zéå£tµ¶]ùxd¤¼K'õ�²› a” 7§0�ðâÔÛÚÜG?þ|q=½þöi¥Ø X¾Ì˜´ÃÑ�åÆ9 Ód›O<²BKå­×à b¿ðÒajl’'´Ò«Ã¯åM" Ø‹¿?"°S§CŸ9#KÓ¥¸'̩DžQ‚*ú=ØŽ·NkIÒÜÜ_;Ú¾ÿ`½%¬'õrzÍž•íx#;ðãgƆ€i Í€—ýsO¯%½Ð*¸ÁK_xé�+ªÃW& ÎÞoóÑ uTP�AO=¾J×BÑÀ#m¿–q˜S³ff+Û24$RÄQLï}xNw%¯¬È'…°œã�ߘ^ ôyssé™ï­óInâØ,í&‡â1^˜ûb².^X [døo‰4Ÿí,ÑýèVæá €tg]ªL­Vª?~v�2´�Û JNN¤<µ†æ‹¡�:s•^üÃQ]&­W�—Ë[Zºé7¿?LçÎë/þãíé'Ws�Q/Oûfê(Ь”ž|l¥È!dLYyèH¥¶²¯U˜êöÛþ.¿úí!‚îL�–/�"^Ôk•i3ôêpj9v×ß/BXÈétc¿~ñ°ˆÆÑ¢w©ïÊ¡+ûµ×H ¹Rä{òÑ„�LŒ€$þ• +*†ü~ñ¢|‘ºw€®ÔèûkttöjáÞ±ÚŸ5#Û÷“–‚»E¦Ù÷?:§»ëÁømÜ0K‹Náå—|ƒ– Ê–¶nÝ ¼0N8-ÂÈt‰ šß©²¯Z1ÿ�V'~‡Ÿ|~A¹)£¥ßh8¬Záã§òÇrZÝОã'¯Þuáh’ȧ¤Ž*Ü}n>'Ï0gR¯î½k!e‰�=;w]b6Ešñ<È¢¡E¨ø¹˜ÔLGU³â/¿º¨kå†Fãq�Ho½áfµÉ²£:Cc°°yD¿DPUÌA¦~äX5•”6ÒßYBóçé‹ðTõ¹µ VnŸ|^L�’_p¿0Ÿ¶nžC[E²@&FÀjƉ©Xk[OUÕ­Z¬²aBl”°Úݶe忦½ÅÕ×]­íŒ§Ô°_ ômx/Y¬/–r50’ÆÃ(ã}2N©Fhåò©„‘*õƒ‘zÜrM§HcñÉg È—GZî[Fm£X¯�õoÍÕðî°öüéó7ÇúWÝ7Tà< £Dm6JX‘­þX•åˆT^¤f¡Þ%‚¶bçgt=P8=S˜Y/§œìT/Bb¸OM”ÿõ·OiV•FnB ðÍgkιNÌ�d¤z×@Œ ½êþCš\ïz”#Ñ$ô¶�V0Y‡3 PlãÊ€ðhì·¾Þ}‰öì/7ü²Å}Ðm€mÙ<×3/݆†.:t´JÓ}é‰'�º 0ãÍ›æñÛð9¿ÿ}vB‘˜ô#RÌ##«WôfÐíóiŸMªÈ�ž/H¯‘·ßõd£q±â;3 PTã΀�‡žã#!hi‰Ì/‹óó4eÝ!Ów›’þg‹j ÊÈH#:ççgÉ2š"Âà3�E/_èÎ"‰²�”"[Å¢f•°ør+#‚éÑãWhï�rCzžrˆh ý!S|€u¦,‚ ‹àâ3#OÁŠí›½etàP¥®'öÈMA°Š]µr*­]5�².Š‚Ü÷øÉ�ùÕYº & #ƒ;ï˜Ï«Ô(’#ò"}üéyºXÖ$¹"üé Ì%Á„`…ä±&L©�ŸªÑ2àêù‡�î5ü{î»gá7Ä?xеm; àf@õÑgç•©ƒ¯÷¡g7 –s“E$» «ðrÚ;=¼ Eä‡hýB<7è|˜Œ#€„jˆ¾Þ%ñ‘œyÁˆ– 㧉¥ ßÞA×roÝ÷IS4Ƴh¡{¢£�¿«FþÙ�Ö»¹{·Ý (Ðjì�A5ùuàÞà#V³`D!2wv¥¥�.¶ä3t[Øå”]n¢K‚é@¼¦_KÕ0Q¤¹€¸‘):àû&dĉ7ÜRRÆ‹9”32—ìÚ- rÁ%Ì«²f*+o"0¡H »hDEÇœBd &{P‰à˜Ù3&!OÅβüýB,+# T †T ô'x©ãX ³!55̘#%´AT›D0P´Q…5¥ÅJÙY©t‡0=_!ò,1™ƒ_í.Ó±Ôˆ¹ƒE rá@—.|‘¬ ööª&ùXÌ\L'R=éè6a·s»ðëaÝáhdâÿ�w@¡˜;jÜ4(ë�#ªˆJŒ\—ìsRR¢ð I¢4áÿü¥LOƒÂa«L0ûG‘¨+‘ŽìùÁçÁ$·xÌ*+¸NøŒ ª_ï¹$^ìÆÝTíÆ|ÁBfø/CËš.vÛ’“´pHPò�à ½'t€ÚŸ˜[pE`Þà?½„pª6—1ã Fßy:Že@�fâ oöƒÂ¯+C/Ä"XM¯¦ÀÈXêV+,·� œ¢±#ŠÄ-Ú>B‡Fÿ.0½ÈÓÑ>'ø>Ì¥Û·ðŽ'§|æPèH8ž7º•§®PqIƒ«CîOœ8A˜¾NÖ{ÓfÀLö p¥–‰W´¨Ð‘Z&ÚÓbùSá` ?9Ì)¤ã`r&|Cž< ‡§žXå̆[Ô*W1 P.ÃÊ ÊeYX‹ÀµN9Bß4»Áx`XÀN¤N™á„vEê4‡àŠÊÖˆ¤íìvÌóæäÒjÁt =ï í cÏÆÎ{·p= GÛ¶ÎÓœ£Ã•yõœ+Pð` Cè%aæŒÝQyE‹ÐÙ‹ \‡Ÿ!^ƒÑðÒ:—`N=Z`Ås¹ÎØhií¦S§¯R‰H[€ô FC#ÅöTãwƒÉÀaqá‚<ÍoÉ.Ë<ã-æ+ƒ@8²záÀ]2Œ�~ö“ žL¥ÜÿÑŸ]Ï€‚;ù:,ž d†Ùjm]§)–iÁÏ�}ÃÁ$šQ˜9Âtâaþ-kŸ�8wÏ¥aóç6áäj忦kºBì g‹ÔÐ)1¹œ 5FeU«¶k…D)2E:¿‘§ÐèÁƒoV´ ��ßZ §W˜NÃÂ-BË\5ÖOâÅ€cŽ"b·Óœ£éß#G Yì¶+ÄK/87ˆy¦dÖ.)!!A‹è1<¯Ò¨ /ƒf §ØIBgÈä=``©¯~%O3 Õ Ìa¡OêÖI==ýZäà~áËól8ë% ½�vfµ�ï))¼úTáê·2Ì#ÍL0¤vaRÝÛ ÓýfÖâsï�Ï�%kæÙ‰ßši‹9†Ý Q°ˆÁ†õ8~›Aþîïÿ¥,“/¸8›IEND®B`‚PK#’\0s document.jsonPKÃKm¯ /E/[pages/FDFEDD00-27E4-4413-9844-5AE97AFC2504.jsonPKïq¥}… Wuser.jsonPK;~­ž ûmeta.jsonPK ê–3‘35previews/preview.pngPKHýDsindresorhus-got-11d2e83/media/logo.svg000066400000000000000000000017451434406364000201350ustar00rootroot00000000000000sindresorhus-got-11d2e83/package.json000066400000000000000000000053511434406364000176600ustar00rootroot00000000000000{ "name": "got", "version": "11.8.6", "description": "Human-friendly and powerful HTTP request library for Node.js", "license": "MIT", "repository": "sindresorhus/got", "funding": "https://github.com/sindresorhus/got?sponsor=1", "main": "dist/source", "engines": { "node": ">=10.19.0" }, "scripts": { "test": "xo && npm run build && nyc --reporter=html --reporter=text ava", "release": "np", "build": "del-cli dist && tsc", "prepare": "npm run build" }, "files": [ "dist/source" ], "keywords": [ "http", "https", "http2", "get", "got", "url", "uri", "request", "simple", "curl", "wget", "fetch", "net", "network", "gzip", "brotli", "requests", "human-friendly", "axios", "superagent", "node-fetch", "ky" ], "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" }, "devDependencies": { "@ava/typescript": "^1.1.1", "@sindresorhus/tsconfig": "^0.7.0", "@sinonjs/fake-timers": "^6.0.1", "@types/benchmark": "^1.0.33", "@types/express": "^4.17.7", "@types/node": "^14.14.0", "@types/node-fetch": "^2.5.7", "@types/pem": "^1.9.5", "@types/pify": "^3.0.2", "@types/request": "^2.48.5", "@types/sinon": "^9.0.5", "@types/tough-cookie": "^4.0.0", "ava": "^3.11.1", "axios": "^0.20.0", "benchmark": "^2.1.4", "coveralls": "^3.1.0", "create-test-server": "^3.0.1", "del-cli": "^3.0.1", "delay": "^4.4.0", "express": "^4.17.1", "form-data": "^3.0.0", "get-stream": "^6.0.0", "nock": "^13.0.4", "node-fetch": "^2.6.0", "np": "^6.4.0", "nyc": "^15.1.0", "p-event": "^4.2.0", "pem": "^1.14.4", "pify": "^5.0.0", "sinon": "^9.0.3", "slow-stream": "0.0.4", "tempy": "^1.0.0", "to-readable-stream": "^2.1.0", "tough-cookie": "^4.0.0", "typescript": "4.0.3", "xo": "^0.34.1" }, "types": "dist/source", "sideEffects": false, "ava": { "files": [ "test/*" ], "timeout": "1m", "typescript": { "rewritePaths": { "test/": "dist/test/" } } }, "nyc": { "extension": [ ".ts" ], "exclude": [ "**/test/**" ] }, "xo": { "ignores": [ "documentation/examples/*" ], "rules": { "@typescript-eslint/no-empty-function": "off", "node/prefer-global/url": "off", "node/prefer-global/url-search-params": "off", "import/no-anonymous-default-export": "off", "@typescript-eslint/no-implicit-any-catch": "off" } }, "runkitExampleFilename": "./documentation/examples/runkit-example.js" } sindresorhus-got-11d2e83/readme.md000066400000000000000000002505311434406364000171530ustar00rootroot00000000000000


Got


Huge thanks to for sponsoring Sindre Sorhus!

(they love Got too!)



> Human-friendly and powerful HTTP request library for Node.js [![Build Status: Linux](https://travis-ci.com/sindresorhus/got.svg?branch=master)](https://travis-ci.com/github/sindresorhus/got) [![Coverage Status](https://coveralls.io/repos/github/sindresorhus/got/badge.svg?branch=master)](https://coveralls.io/github/sindresorhus/got?branch=master) [![Downloads](https://img.shields.io/npm/dm/got.svg)](https://npmjs.com/got) [![Install size](https://packagephobia.now.sh/badge?p=got)](https://packagephobia.now.sh/result?p=got) [Moving from Request?](documentation/migration-guides.md) [*(Note that Request is unmaintained)*](https://github.com/request/request/issues/3142) [See how Got compares to other HTTP libraries](#comparison) For browser usage, we recommend [Ky](https://github.com/sindresorhus/ky) by the same people. ## Highlights - [Promise API](#api) - [Stream API](#streams) - [Pagination API](#pagination) - [HTTP2 support](#http2) - [Request cancelation](#aborting-the-request) - [RFC compliant caching](#cache-adapters) - [Follows redirects](#followredirect) - [Retries on failure](#retry) - [Progress events](#onuploadprogress-progress) - [Handles gzip/deflate/brotli](#decompress) - [Timeout handling](#timeout) - [Errors with metadata](#errors) - [JSON mode](#json-mode) - [WHATWG URL support](#url) - [HTTPS API](#advanced-https-api) - [Hooks](#hooks) - [Instances with custom defaults](#instances) - [Types](#types) - [Composable](documentation/advanced-creation.md#merging-instances) - [Plugins](documentation/lets-make-a-plugin.md) - [Used by 4K+ packages and 1.8M+ repos](https://github.com/sindresorhus/got/network/dependents) - [Actively maintained](https://github.com/sindresorhus/got/graphs/contributors) - [Trusted by many companies](#widely-used) ## Install ``` $ npm install got ``` ## Usage ###### Promise ```js const got = require('got'); (async () => { try { const response = await got('https://sindresorhus.com'); console.log(response.body); //=> ' ...' } catch (error) { console.log(error.response.body); //=> 'Internal server error ...' } })(); ``` ###### JSON ```js const got = require('got'); (async () => { const {body} = await got.post('https://httpbin.org/anything', { json: { hello: 'world' }, responseType: 'json' }); console.log(body.data); //=> {hello: 'world'} })(); ``` See [JSON mode](#json-mode) for more details. ###### Streams ```js const stream = require('stream'); const {promisify} = require('util'); const fs = require('fs'); const got = require('got'); const pipeline = promisify(stream.pipeline); (async () => { await pipeline( got.stream('https://sindresorhus.com'), fs.createWriteStream('index.html') ); // For POST, PUT, PATCH, and DELETE methods, `got.stream` returns a `stream.Writable`. await pipeline( fs.createReadStream('index.html'), got.stream.post('https://sindresorhus.com') ); })(); ``` **Tip:** `from.pipe(to)` doesn't forward errors. Instead, use [`stream.pipeline(from, ..., to, callback)`](https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback). **Note:** While `got.post('https://example.com')` resolves, `got.stream.post('https://example.com')` will hang indefinitely until a body is provided. If there's no body on purpose, remember to `.end()` the stream or set the [`body`](#body) option to an empty string. ### API It's a `GET` request by default, but can be changed by using different methods or via [`options.method`](#method). **By default, Got will retry on failure. To disable this option, set [`options.retry`](#retry) to `0`.** #### got(url?, options?) Returns a Promise giving a [Response object](#response) or a [Got Stream](#streams-1) if `options.isStream` is set to true. ##### url Type: `string | object` The URL to request, as a string, a [`https.request` options object](https://nodejs.org/api/https.html#https_https_request_options_callback), or a [WHATWG `URL`](https://nodejs.org/api/url.html#url_class_url). Properties from `options` will override properties in the parsed `url`. If no protocol is specified, it will throw a `TypeError`. **Note:** The query string is **not** parsed as search params. Example: ```js got('https://example.com/?query=a b'); //=> https://example.com/?query=a%20b got('https://example.com/', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b // The query string is overridden by `searchParams` got('https://example.com/?query=a b', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b ``` ##### options Type: `object` Any of the [`https.request`](https://nodejs.org/api/https.html#https_https_request_options_callback) options. **Note:** Legacy URL support is disabled. `options.path` is supported only for backwards compatibility. Use `options.pathname` and `options.searchParams` instead. `options.auth` has been replaced with `options.username` & `options.password`. ###### method Type: `string`\ Default: `GET` The HTTP method used to make the request. ###### prefixUrl Type: `string | URL` When specified, `prefixUrl` will be prepended to `url`. The prefix can be any valid URL, either relative or absolute.\ A trailing slash `/` is optional - one will be added automatically. **Note:** `prefixUrl` will be ignored if the `url` argument is a URL instance. **Note:** Leading slashes in `input` are disallowed when using this option to enforce consistency and avoid confusion. For example, when the prefix URL is `https://example.com/foo` and the input is `/bar`, there's ambiguity whether the resulting URL would become `https://example.com/foo/bar` or `https://example.com/bar`. The latter is used by browsers. **Tip:** Useful when used with [`got.extend()`](#custom-endpoints) to create niche-specific Got instances. **Tip:** You can change `prefixUrl` using hooks as long as the URL still includes the `prefixUrl`. If the URL doesn't include it anymore, it will throw. ```js const got = require('got'); (async () => { await got('unicorn', {prefixUrl: 'https://cats.com'}); //=> 'https://cats.com/unicorn' const instance = got.extend({ prefixUrl: 'https://google.com' }); await instance('unicorn', { hooks: { beforeRequest: [ options => { options.prefixUrl = 'https://cats.com'; } ] } }); //=> 'https://cats.com/unicorn' })(); ``` ###### headers Type: `object`\ Default: `{}` Request headers. Existing headers will be overwritten. Headers set to `undefined` will be omitted. ###### isStream Type: `boolean`\ Default: `false` Returns a `Stream` instead of a `Promise`. This is equivalent to calling `got.stream(url, options?)`. ###### body Type: `string | Buffer | stream.Readable` or [`form-data` instance](https://github.com/form-data/form-data) **Note #1:** The `body` option cannot be used with the `json` or `form` option. **Note #2:** If you provide this option, `got.stream()` will be read-only. **Note #3:** If you provide a payload with the `GET` or `HEAD` method, it will throw a `TypeError` unless the method is `GET` and the `allowGetBody` option is set to `true`. **Note #4:** This option is not enumerable and will not be merged with the instance defaults. The `content-length` header will be automatically set if `body` is a `string` / `Buffer` / `fs.createReadStream` instance / [`form-data` instance](https://github.com/form-data/form-data), and `content-length` and `transfer-encoding` are not manually set in `options.headers`. ###### json Type: `object | Array | number | string | boolean | null` *(JSON-serializable values)* **Note #1:** If you provide this option, `got.stream()` will be read-only.\ **Note #2:** This option is not enumerable and will not be merged with the instance defaults. JSON body. If the `Content-Type` header is not set, it will be set to `application/json`. ###### context Type: `object` User data. In contrast to other options, `context` is not enumerable. **Note:** The object is never merged, it's just passed through. Got will not modify the object in any way. It's very useful for storing auth tokens: ```js const got = require('got'); const instance = got.extend({ hooks: { beforeRequest: [ options => { if (!options.context || !options.context.token) { throw new Error('Token required'); } options.headers.token = options.context.token; } ] } }); (async () => { const context = { token: 'secret' }; const response = await instance('https://httpbin.org/headers', {context}); // Let's see the headers console.log(response.body); })(); ``` ###### responseType Type: `string`\ Default: `'text'` **Note:** When using streams, this option is ignored. The parsing method. Can be `'text'`, `'json'` or `'buffer'`. The promise also has `.text()`, `.json()` and `.buffer()` methods which return another Got promise for the parsed body.\ It's like setting the options to `{responseType: 'json', resolveBodyOnly: true}` but without affecting the main Got promise. Example: ```js (async () => { const responsePromise = got(url); const bufferPromise = responsePromise.buffer(); const jsonPromise = responsePromise.json(); const [response, buffer, json] = await Promise.all([responsePromise, bufferPromise, jsonPromise]); // `response` is an instance of Got Response // `buffer` is an instance of Buffer // `json` is an object })(); ``` ```js // This const body = await got(url).json(); // is semantically the same as this const body = await got(url, {responseType: 'json', resolveBodyOnly: true}); ``` **Note:** `buffer` will return the raw body buffer. Modifying it will also alter the result of `promise.text()` and `promise.json()`. Before overwritting the buffer, please copy it first via `Buffer.from(buffer)`. See https://github.com/nodejs/node/issues/27080 ###### parseJson Type: `(text: string) => unknown`\ Default: `(text: string) => JSON.parse(text)` A function used to parse JSON responses.
Example Using [`bourne`](https://github.com/hapijs/bourne) to prevent prototype pollution: ```js const got = require('got'); const Bourne = require('@hapi/bourne'); (async () => { const parsed = await got('https://example.com', { parseJson: text => Bourne.parse(text) }).json(); console.log(parsed); })(); ```
###### stringifyJson Type: `(object: unknown) => string`\ Default: `(object: unknown) => JSON.stringify(object)` A function used to stringify the body of JSON requests.
Examples Ignore properties starting with `_`: ```js const got = require('got'); (async () => { await got.post('https://example.com', { stringifyJson: object => JSON.stringify(object, (key, value) => { if (key.startsWith('_')) { return; } return value; }), json: { some: 'payload', _ignoreMe: 1234 } }); })(); ``` All numbers as strings: ```js const got = require('got'); (async () => { await got.post('https://example.com', { stringifyJson: object => JSON.stringify(object, (key, value) => { if (typeof value === 'number') { return value.toString(); } return value; }), json: { some: 'payload', number: 1 } }); })(); ```
###### resolveBodyOnly Type: `boolean`\ Default: `false` When set to `true` the promise will return the [Response body](#body-1) instead of the [Response](#response) object. ###### cookieJar Type: `object` | [`tough.CookieJar` instance](https://github.com/salesforce/tough-cookie#cookiejar) **Note:** If you provide this option, `options.headers.cookie` will be overridden. Cookie support. You don't have to care about parsing or how to store them. [Example](#cookies). ###### cookieJar.setCookie Type: `Function` The function takes two arguments: `rawCookie` (`string`) and `url` (`string`). ###### cookieJar.getCookieString Type: `Function` The function takes one argument: `url` (`string`). ###### ignoreInvalidCookies Type: `boolean`\ Default: `false` Ignore invalid cookies instead of throwing an error. Only useful when the `cookieJar` option has been set. Not recommended. ###### encoding Type: `string`\ Default: `'utf8'` [Encoding](https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings) to be used on `setEncoding` of the response data. To get a [`Buffer`](https://nodejs.org/api/buffer.html), you need to set [`responseType`](#responseType) to `buffer` instead. Don't set this option to `null`. **Note:** This doesn't affect streams! Instead, you need to do `got.stream(...).setEncoding(encoding)`. ###### form Type: `object` **Note #1:** If you provide this option, `got.stream()` will be read-only.\ **Note #2:** This option is not enumerable and will not be merged with the instance defaults. The form body is converted to a query string using [`(new URLSearchParams(object)).toString()`](https://nodejs.org/api/url.html#url_constructor_new_urlsearchparams_obj). If the `Content-Type` header is not present, it will be set to `application/x-www-form-urlencoded`. ###### searchParams Type: `string | object | URLSearchParams` Query string that will be added to the request URL. This will override the query string in `url`. If you need to pass in an array, you can do it using a `URLSearchParams` instance: ```js const got = require('got'); const searchParams = new URLSearchParams([['key', 'a'], ['key', 'b']]); got('https://example.com', {searchParams}); console.log(searchParams.toString()); //=> 'key=a&key=b' ``` There are some exceptions in regards to `URLSearchParams` behavior: **Note #1:** `null` values are not stringified, an empty string is used instead. **Note #2:** `undefined` values are not stringified, the entry is skipped instead. ###### timeout Type: `number | object` Milliseconds to wait for the server to end the response before aborting the request with [`got.TimeoutError`](#gottimeouterror) error (a.k.a. `request` property). By default, there's no timeout. This also accepts an `object` with the following fields to constrain the duration of each phase of the request lifecycle: - `lookup` starts when a socket is assigned and ends when the hostname has been resolved. Does not apply when using a Unix domain socket. - `connect` starts when `lookup` completes (or when the socket is assigned if lookup does not apply to the request) and ends when the socket is connected. - `secureConnect` starts when `connect` completes and ends when the handshaking process completes (HTTPS only). - `socket` starts when the socket is connected. See [request.setTimeout](https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback). - `response` starts when the request has been written to the socket and ends when the response headers are received. - `send` starts when the socket is connected and ends with the request has been written to the socket. - `request` starts when the request is initiated and ends when the response's end event fires. ###### retry Type: `number | object`\ Default: - limit: `2` - calculateDelay: `({attemptCount, retryOptions, error, computedValue}) => computedValue | Promise` - methods: `GET` `PUT` `HEAD` `DELETE` `OPTIONS` `TRACE` - statusCodes: [`408`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) [`413`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/413) [`429`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) [`500`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) [`502`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502) [`503`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503) [`504`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504) [`521`](https://support.cloudflare.com/hc/en-us/articles/115003011431#521error) [`522`](https://support.cloudflare.com/hc/en-us/articles/115003011431#522error) [`524`](https://support.cloudflare.com/hc/en-us/articles/115003011431#524error) - maxRetryAfter: `undefined` - errorCodes: `ETIMEDOUT` `ECONNRESET` `EADDRINUSE` `ECONNREFUSED` `EPIPE` `ENOTFOUND` `ENETUNREACH` `EAI_AGAIN` An object representing `limit`, `calculateDelay`, `methods`, `statusCodes`, `maxRetryAfter` and `errorCodes` fields for maximum retry count, retry handler, allowed methods, allowed status codes, maximum [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) time and allowed error codes. If `maxRetryAfter` is set to `undefined`, it will use `options.timeout`.\ If [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) header is greater than `maxRetryAfter`, it will cancel the request. Delays between retries counts with function `1000 * Math.pow(2, retry - 1) + Math.random() * 100`, where `retry` is attempt number (starts from 1). The `calculateDelay` property is a `function` that receives an object with `attemptCount`, `retryOptions`, `error` and `computedValue` properties for current retry count, the retry options, error and default computed value. The function must return a delay in milliseconds (or a Promise resolving with it) (`0` return value cancels retry). **Note:** The `calculateDelay` function is responsible for the entire cache mechanism, including the `limit` property. To support it, you need to check whether `computedValue` is different than `0`. By default, it retries *only* on the specified methods, status codes, and on these network errors: - `ETIMEDOUT`: One of the [timeout](#timeout) limits were reached. - `ECONNRESET`: Connection was forcibly closed by a peer. - `EADDRINUSE`: Could not bind to any free port. - `ECONNREFUSED`: Connection was refused by the server. - `EPIPE`: The remote side of the stream being written has been closed. - `ENOTFOUND`: Couldn't resolve the hostname to an IP address. - `ENETUNREACH`: No internet connection. - `EAI_AGAIN`: DNS lookup timed out. You can retry Got streams too. The implementation looks like this: ```js const got = require('got'); const fs = require('fs'); let writeStream; const fn = (retryCount = 0) => { const stream = got.stream('https://example.com'); stream.retryCount = retryCount; if (writeStream) { writeStream.destroy(); } writeStream = fs.createWriteStream('example.com'); stream.pipe(writeStream); // If you don't attach the listener, it will NOT make a retry. // It automatically checks the listener count so it knows whether to retry or not :) stream.once('retry', fn); }; fn(); ``` ###### followRedirect Type: `boolean`\ Default: `true` Defines if redirect responses should be followed automatically. Note that if a `303` is sent by the server in response to any request type (`POST`, `DELETE`, etc.), Got will automatically request the resource pointed to in the location header via `GET`. This is in accordance with [the spec](https://tools.ietf.org/html/rfc7231#section-6.4.4). ###### methodRewriting Type: `boolean`\ Default: `true` By default, redirects will use [method rewriting](https://tools.ietf.org/html/rfc7231#section-6.4). For example, when sending a POST request and receiving a `302`, it will resend the body to the new location using the same HTTP method (`POST` in this case). ###### allowGetBody Type: `boolean`\ Default: `false` **Note:** The [RFC 7321](https://tools.ietf.org/html/rfc7231#section-4.3.1) doesn't specify any particular behavior for the GET method having a payload, therefore **it's considered an [anti-pattern](https://en.wikipedia.org/wiki/Anti-pattern)**. Set this to `true` to allow sending body for the `GET` method. However, the [HTTP/2 specification](https://tools.ietf.org/html/rfc7540#section-8.1.3) says that `An HTTP GET request includes request header fields and no payload body`, therefore when using the HTTP/2 protocol this option will have no effect. This option is only meant to interact with non-compliant servers when you have no other choice. ###### maxRedirects Type: `number`\ Default: `10` If exceeded, the request will be aborted and a `MaxRedirectsError` will be thrown. ###### decompress Type: `boolean`\ Default: `true` Decompress the response automatically. This will set the `accept-encoding` header to `gzip, deflate, br` on Node.js 11.7.0+ or `gzip, deflate` for older Node.js versions, unless you set it yourself. Brotli (`br`) support requires Node.js 11.7.0 or later. If this is disabled, a compressed response is returned as a `Buffer`. This may be useful if you want to handle decompression yourself or stream the raw compressed data. ###### cache Type: `object | false`\ Default: `false` [Cache adapter instance](#cache-adapters) for storing cached response data. ###### cacheOptions Type: `object | undefined`\ Default: `{}` [Cache options](https://github.com/kornelski/http-cache-semantics#constructor-options) used for the specified request. ###### dnsCache Type: `CacheableLookup | false`\ Default: `false` An instance of [`CacheableLookup`](https://github.com/szmarczak/cacheable-lookup) used for making DNS lookups. Useful when making lots of requests to different *public* hostnames. **Note:** This should stay disabled when making requests to internal hostnames such as `localhost`, `database.local` etc.\ `CacheableLookup` uses `dns.resolver4(..)` and `dns.resolver6(...)` under the hood and fall backs to `dns.lookup(...)` when the first two fail, which may lead to additional delay. ###### dnsLookupIpVersion Type: `'auto' | 'ipv4' | 'ipv6'`\ Default: `'auto'` Indicates which DNS record family to use.\ Values: - `auto`: IPv4 (if present) or IPv6 - `ipv4`: Only IPv4 - `ipv6`: Only IPv6 Note: If you are using the undocumented option `family`, `dnsLookupIpVersion` will override it. ```js // `api6.ipify.org` will be resolved as IPv4 and the request will be over IPv4 (the website will respond with your public IPv4) await got('https://api6.ipify.org', { dnsLookupIpVersion: 'ipv4' }); // `api6.ipify.org` will be resolved as IPv6 and the request will be over IPv6 (the website will respond with your public IPv6) await got('https://api6.ipify.org', { dnsLookupIpVersion: 'ipv6' }); ``` ###### lookup Type: `Function`\ Default: [`dns.lookup`](https://nodejs.org/api/dns.html#dns_dns_lookup_hostname_options_callback) Custom DNS resolution logic. The function signature is the same as [`dns.lookup`](https://nodejs.org/api/dns.html#dns_dns_lookup_hostname_options_callback). ###### request Type: `Function`\ Default: `http.request | https.request` *(Depending on the protocol)* Custom request function. The main purpose of this is to [support HTTP2 using a wrapper](https://github.com/szmarczak/http2-wrapper). ###### http2 Type: `boolean`\ Default: `false` If set to `true`, Got will additionally accept HTTP2 requests.\ It will choose either HTTP/1.1 or HTTP/2 depending on the ALPN protocol. **Note:** Overriding `options.request` will disable HTTP2 support. **Note:** This option will default to `true` in the next upcoming major release. ```js const got = require('got'); (async () => { const {headers} = await got('https://nghttp2.org/httpbin/anything', {http2: true}); console.log(headers.via); //=> '2 nghttpx' })(); ``` ###### throwHttpErrors Type: `boolean`\ Default: `true` Determines if a [`got.HTTPError`](#gothttperror) is thrown for unsuccessful responses. If this is disabled, requests that encounter an error status code will be resolved with the `response` instead of throwing. This may be useful if you are checking for resource availability and are expecting error responses. ###### agent Type: `object` An object representing `http`, `https` and `http2` keys for [`http.Agent`](https://nodejs.org/api/http.html#http_class_http_agent), [`https.Agent`](https://nodejs.org/api/https.html#https_class_https_agent) and [`http2wrapper.Agent`](https://github.com/szmarczak/http2-wrapper#new-http2agentoptions) instance. This is necessary because a request to one protocol might redirect to another. In such a scenario, Got will switch over to the right protocol agent for you. If a key is not present, it will default to a global agent. ```js const got = require('got'); const HttpAgent = require('agentkeepalive'); const {HttpsAgent} = HttpAgent; got('https://sindresorhus.com', { agent: { http: new HttpAgent(), https: new HttpsAgent() } }); ``` ###### hooks Type: `object` Hooks allow modifications during the request lifecycle. Hook functions may be async and are run serially. ###### hooks.init Type: `Function[]`\ Default: `[]` Called with plain [request options](#options), right before their normalization. This is especially useful in conjunction with [`got.extend()`](#instances) when the input needs custom handling. See the [Request migration guide](documentation/migration-guides.md#breaking-changes) for an example. **Note #1:** This hook must be synchronous!\ **Note #2:** Errors in this hook will be converted into an instances of [`RequestError`](#gotrequesterror).\ **Note #3:** The options object may not have a `url` property. To modify it, use a `beforeRequest` hook instead. ###### hooks.beforeRequest Type: `Function[]`\ Default: `[]` Called with [normalized](source/core/index.ts) [request options](#options). Got will make no further changes to the request before it is sent. This is especially useful in conjunction with [`got.extend()`](#instances) when you want to create an API client that, for example, uses HMAC-signing. **Note:** Changing `options.json` or `options.form` has no effect on the request, you should change `options.body` instead. If needed, update the `options.headers` accordingly. Example: ```js const got = require('got'); got.post({ json: {payload: 'old'}, hooks: { beforeRequest: [ options => { options.body = JSON.stringify({payload: 'new'}); options.headers['content-length'] = options.body.length.toString(); } ] } }); ``` **Tip:** You can override the `request` function by returning a [`ClientRequest`-like](https://nodejs.org/api/http.html#http_class_http_clientrequest) instance or a [`IncomingMessage`-like](https://nodejs.org/api/http.html#http_class_http_incomingmessage) instance. This is very useful when creating a custom cache mechanism. ###### hooks.beforeRedirect Type: `Function[]`\ Default: `[]` Called with [normalized](source/core/index.ts) [request options](#options) and the redirect [response](#response). Got will make no further changes to the request. This is especially useful when you want to avoid dead sites. Example: ```js const got = require('got'); got('https://example.com', { hooks: { beforeRedirect: [ (options, response) => { if (options.hostname === 'deadSite') { options.hostname = 'fallbackSite'; } } ] } }); ``` ###### hooks.beforeRetry Type: `Function[]`\ Default: `[]` **Note:** When using streams, this hook is ignored. Called with [normalized](source/normalize-arguments.ts) [request options](#options), the error and the retry count. Got will make no further changes to the request. This is especially useful when some extra work is required before the next try. Example: ```js const got = require('got'); got.post('https://example.com', { hooks: { beforeRetry: [ (options, error, retryCount) => { if (error.response.statusCode === 413) { // Payload too large options.body = getNewBody(); } } ] } }); ``` **Note:** When retrying in a `afterResponse` hook, all remaining `beforeRetry` hooks will be called without the `error` and `retryCount` arguments. ###### hooks.afterResponse Type: `Function[]`\ Default: `[]` **Note:** When using streams, this hook is ignored. Called with [response object](#response) and a retry function. Calling the retry function will trigger `beforeRetry` hooks. Each function should return the response. This is especially useful when you want to refresh an access token. Example: ```js const got = require('got'); const instance = got.extend({ hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { // Unauthorized const updatedOptions = { headers: { token: getNewToken() // Refresh the access token } }; // Save for further requests instance.defaults.options = got.mergeOptions(instance.defaults.options, updatedOptions); // Make a new retry return retryWithMergedOptions(updatedOptions); } // No changes otherwise return response; } ], beforeRetry: [ (options, error, retryCount) => { // This will be called on `retryWithMergedOptions(...)` } ] }, mutableDefaults: true }); ``` ###### hooks.beforeError Type: `Function[]`\ Default: `[]` Called with an `Error` instance. The error is passed to the hook right before it's thrown. This is especially useful when you want to have more detailed errors. **Note:** Errors thrown while normalizing input options are thrown directly and not part of this hook. ```js const got = require('got'); got('https://api.github.com/some-endpoint', { hooks: { beforeError: [ error => { const {response} = error; if (response && response.body) { error.name = 'GitHubError'; error.message = `${response.body.message} (${response.statusCode})`; } return error; } ] } }); ``` ##### pagination Type: `object` **Note:** We're [looking for feedback](https://github.com/sindresorhus/got/issues/1052), any ideas on how to improve the API are welcome. ###### pagination.transform Type: `Function`\ Default: `response => JSON.parse(response.body)` A function that transform [`Response`](#response) into an array of items. This is where you should do the parsing. ###### pagination.paginate Type: `Function`\ Default: [`Link` header logic](source/index.ts) The function takes three arguments: - `response` - The current response object. - `allItems` - An array of the emitted items. - `currentItems` - Items from the current response. It should return an object representing Got options pointing to the next page. The options are merged automatically with the previous request, therefore the options returned `pagination.paginate(...)` must reflect changes only. If there are no more pages, `false` should be returned. For example, if you want to stop when the response contains less items than expected, you can use something like this: ```js const got = require('got'); (async () => { const limit = 10; const items = got.paginate('https://example.com/items', { searchParams: { limit, offset: 0 }, pagination: { paginate: (response, allItems, currentItems) => { const previousSearchParams = response.request.options.searchParams; const previousOffset = previousSearchParams.get('offset'); if (currentItems.length < limit) { return false; } return { searchParams: { ...previousSearchParams, offset: Number(previousOffset) + limit, } }; } } }); console.log('Items from all pages:', items); })(); ``` ###### pagination.filter Type: `Function`\ Default: `(item, allItems, currentItems) => true` Checks whether the item should be emitted or not. ###### pagination.shouldContinue Type: `Function`\ Default: `(item, allItems, currentItems) => true` Checks whether the pagination should continue. For example, if you need to stop **before** emitting an entry with some flag, you should use `(item, allItems, currentItems) => !item.flag`. If you want to stop **after** emitting the entry, you should use `(item, allItems, currentItems) => allItems.some(entry => entry.flag)` instead. ###### pagination.countLimit Type: `number`\ Default: `Infinity` The maximum amount of items that should be emitted. ###### pagination.backoff Type: `number`\ Default: `0` Milliseconds to wait before the next request is triggered. ###### pagination.requestLimit Type: `number`\ Default: `10000` The maximum amount of request that should be triggered. [Retries on failure](#retry) are not counted towards this limit. For example, it can be helpful during development to avoid an infinite number of requests. ###### pagination.stackAllItems Type: `boolean`\ Default: `true` Defines how the parameter `allItems` in [pagination.paginate](#pagination.paginate), [pagination.filter](#pagination.filter) and [pagination.shouldContinue](#pagination.shouldContinue) is managed. When set to `false`, the parameter `allItems` is always an empty array. This option can be helpful to save on memory usage when working with a large dataset. ##### localAddress Type: `string` The IP address used to send the request from. ### Advanced HTTPS API Note: If the request is not HTTPS, these options will be ignored. ##### https.certificateAuthority Type: `string | Buffer | Array` Override the default Certificate Authorities ([from Mozilla](https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReport)) ```js // Single Certificate Authority got('https://example.com', { https: { certificateAuthority: fs.readFileSync('./my_ca.pem') } }); ``` ##### https.key Type: `string | Buffer | Array | object[]` Private keys in [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) format.\ [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) allows the option of private keys being encrypted. Encrypted keys will be decrypted with `options.https.passphrase`.\ Multiple keys with different passphrases can be provided as an array of `{pem: , passphrase: }` ##### https.certificate Type: `string | Buffer | (string | Buffer)[]` [Certificate chains](https://en.wikipedia.org/wiki/X.509#Certificate_chains_and_cross-certification) in [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) format.\ One cert chain should be provided per private key (`options.https.key`).\ When providing multiple cert chains, they do not have to be in the same order as their private keys in `options.https.key`.\ If the intermediate certificates are not provided, the peer will not be able to validate the certificate, and the handshake will fail. ##### https.passphrase Type: `string` The passphrase to decrypt the `options.https.key` (if different keys have different passphrases refer to `options.https.key` documentation). ##### https.pfx Type: `string | Buffer | Array` [PFX or PKCS12](https://en.wikipedia.org/wiki/PKCS_12) encoded private key and certificate chain. Using `options.https.pfx` is an alternative to providing `options.https.key` and `options.https.certificate` individually. A PFX is usually encrypted, and if it is, `options.https.passphrase` will be used to decrypt it. Multiple PFX's can be be provided as an array of unencrypted buffers or an array of objects like: ```ts { buffer: string | Buffer, passphrase?: string } ``` This object form can only occur in an array. If the provided buffers are encrypted, `object.passphrase` can be used to decrypt them. If `object.passphrase` is not provided, `options.https.passphrase` will be used for decryption. ##### Examples for `https.key`, `https.certificate`, `https.passphrase`, and `https.pfx` ```js // Single key with certificate got('https://example.com', { https: { key: fs.readFileSync('./client_key.pem'), certificate: fs.readFileSync('./client_cert.pem') } }); // Multiple keys with certificates (out of order) got('https://example.com', { https: { key: [ fs.readFileSync('./client_key1.pem'), fs.readFileSync('./client_key2.pem') ], certificate: [ fs.readFileSync('./client_cert2.pem'), fs.readFileSync('./client_cert1.pem') ] } }); // Single key with passphrase got('https://example.com', { https: { key: fs.readFileSync('./client_key.pem'), certificate: fs.readFileSync('./client_cert.pem'), passphrase: 'client_key_passphrase' } }); // Multiple keys with different passphrases got('https://example.com', { https: { key: [ {pem: fs.readFileSync('./client_key1.pem'), passphrase: 'passphrase1'}, {pem: fs.readFileSync('./client_key2.pem'), passphrase: 'passphrase2'}, ], certificate: [ fs.readFileSync('./client_cert1.pem'), fs.readFileSync('./client_cert2.pem') ] } }); // Single encrypted PFX with passphrase got('https://example.com', { https: { pfx: fs.readFileSync('./fake.pfx'), passphrase: 'passphrase' } }); // Multiple encrypted PFX's with different passphrases got('https://example.com', { https: { pfx: [ { buffer: fs.readFileSync('./key1.pfx'), passphrase: 'passphrase1' }, { buffer: fs.readFileSync('./key2.pfx'), passphrase: 'passphrase2' } ] } }); // Multiple encrypted PFX's with single passphrase got('https://example.com', { https: { passphrase: 'passphrase', pfx: [ { buffer: fs.readFileSync('./key1.pfx') }, { buffer: fs.readFileSync('./key2.pfx') } ] } }); ``` ##### https.rejectUnauthorized Type: `boolean`\ Default: `true` If set to `false`, all invalid SSL certificates will be ignored and no error will be thrown.\ If set to `true`, it will throw an error whenever an invalid SSL certificate is detected. We strongly recommend to have this set to `true` for security reasons. ```js const got = require('got'); (async () => { // Correct: await got('https://example.com', { https: { rejectUnauthorized: true } }); // You can disable it when developing an HTTPS app: await got('https://localhost', { https: { rejectUnauthorized: false } }); // Never do this: await got('https://example.com', { https: { rejectUnauthorized: false } }); ``` ##### https.checkServerIdentity Type: `Function`\ Signature: `(hostname: string, certificate: DetailedPeerCertificate) => Error | undefined`\ Default: `tls.checkServerIdentity` (from the `tls` module) This function enable a custom check of the certificate.\ Note: In order to have the function called the certificate must not be `expired`, `self-signed` or with an `untrusted-root`.\ The function parameters are: - `hostname`: The server hostname (used when connecting) - `certificate`: The server certificate The function must return `undefined` if the check succeeded or an `Error` if it failed. ```js await got('https://example.com', { https: { checkServerIdentity: (hostname, certificate) => { if (hostname === 'example.com') { return; // Certificate OK } return new Error('Invalid Hostname'); // Certificate NOT OK } } }); ``` #### Response The response object will typically be a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage), however, if returned from the cache it will be a [response-like object](https://github.com/lukechilds/responselike) which behaves in the same way. ##### request Type: `object` **Note:** This is not a [http.ClientRequest](https://nodejs.org/api/http.html#http_class_http_clientrequest). - `options` - The Got options that were set on this request. ##### body Type: `string | object | Buffer` *(Depending on `options.responseType`)* The result of the request. ##### rawBody Type: `Buffer` The raw result of the request. ##### url Type: `string` The request URL or the final URL after redirects. ##### ip Type: `string` The remote IP address. **Note:** Not available when the response is cached. This is hopefully a temporary limitation, see [lukechilds/cacheable-request#86](https://github.com/lukechilds/cacheable-request/issues/86). ##### requestUrl Type: `string` The original request URL. ##### timings Type: `object` The object contains the following properties: - `start` - Time when the request started. - `socket` - Time when a socket was assigned to the request. - `lookup` - Time when the DNS lookup finished. - `connect` - Time when the socket successfully connected. - `secureConnect` - Time when the socket securely connected. - `upload` - Time when the request finished uploading. - `response` - Time when the request fired `response` event. - `end` - Time when the response fired `end` event. - `error` - Time when the request fired `error` event. - `abort` - Time when the request fired `abort` event. - `phases` - `wait` - `timings.socket - timings.start` - `dns` - `timings.lookup - timings.socket` - `tcp` - `timings.connect - timings.lookup` - `tls` - `timings.secureConnect - timings.connect` - `request` - `timings.upload - (timings.secureConnect || timings.connect)` - `firstByte` - `timings.response - timings.upload` - `download` - `timings.end - timings.response` - `total` - `(timings.end || timings.error || timings.abort) - timings.start` If something has not been measured yet, it will be `undefined`. **Note:** The time is a `number` representing the milliseconds elapsed since the UNIX epoch. ##### isFromCache Type: `boolean` Whether the response was retrieved from the cache. ##### redirectUrls Type: `string[]` The redirect URLs. ##### retryCount Type: `number` The number of times the request was retried. #### Streams **Note:** Progress events, redirect events and request/response events can also be used with promises. **Note:** To access `response.isFromCache` you need to use `got.stream(url, options).isFromCache`. The value will be undefined until the `response` event. #### got.stream(url, options?) Sets `options.isStream` to `true`. Returns a [duplex stream](https://nodejs.org/api/stream.html#stream_class_stream_duplex) with additional events: ##### .on('request', request) `request` event to get the request object of the request. **Tip:** You can use `request` event to abort request: ```js got.stream('https://github.com') .on('request', request => setTimeout(() => request.destroy(), 50)); ``` ##### .on('response', response) The `response` event to get the response object of the final request. ##### .on('redirect', response, nextOptions) The `redirect` event to get the response object of a redirect. The second argument is options for the next request to the redirect location. ##### .on('uploadProgress', progress) ##### .uploadProgress ##### .on('downloadProgress', progress) ##### .downloadProgress Progress events for uploading (sending a request) and downloading (receiving a response). The `progress` argument is an object like: ```js { percent: 0.1, transferred: 1024, total: 10240 } ``` If the `content-length` header is missing, `total` will be `undefined`. ```js (async () => { const response = await got('https://sindresorhus.com') .on('downloadProgress', progress => { // Report download progress }) .on('uploadProgress', progress => { // Report upload progress }); console.log(response); })(); ``` ##### .once('retry', retryCount, error) To enable retrying on a Got stream, it is required to have a `retry` handler attached.\ When this event is emitted, you should reset the stream you were writing to and prepare the body again. See the [`retry`](#retry-stream) option for an example implementation. ##### .ip Type: `string` The remote IP address. ##### .aborted Type: `boolean` Indicates whether the request has been aborted or not. ##### .timings The same as `response.timings`. ##### .isFromCache The same as `response.isFromCache`. ##### .socket The same as `response.socket`. ##### .on('error', error) The emitted `error` is an instance of [`RequestError`](#gotrequesterror). #### Pagination #### got.paginate(url, options?) #### got.paginate.each(url, options?) Returns an async iterator: ```js (async () => { const countLimit = 10; const pagination = got.paginate('https://api.github.com/repos/sindresorhus/got/commits', { pagination: {countLimit} }); console.log(`Printing latest ${countLimit} Got commits (newest to oldest):`); for await (const commitData of pagination) { console.log(commitData.commit.message); } })(); ``` See [`options.pagination`](#pagination) for more pagination options. #### got.paginate.all(url, options?) Returns a Promise for an array of all results: ```js (async () => { const countLimit = 10; const results = await got.paginate.all('https://api.github.com/repos/sindresorhus/got/commits', { pagination: {countLimit} }); console.log(`Printing latest ${countLimit} Got commits (newest to oldest):`); console.log(results); })(); ``` See [`options.pagination`](#pagination) for more pagination options. #### got.get(url, options?) #### got.post(url, options?) #### got.put(url, options?) #### got.patch(url, options?) #### got.head(url, options?) #### got.delete(url, options?) Sets [`options.method`](#method) to the method name and makes a request. ### Instances #### got.extend(...options) Configure a new `got` instance with default `options`. The `options` are merged with the parent instance's `defaults.options` using [`got.mergeOptions`](#gotmergeoptionsparentoptions-newoptions). You can access the resolved options with the `.defaults` property on the instance. ```js const client = got.extend({ prefixUrl: 'https://example.com', headers: { 'x-unicorn': 'rainbow' } }); client.get('demo'); /* HTTP Request => * GET /demo HTTP/1.1 * Host: example.com * x-unicorn: rainbow */ ``` ```js (async () => { const client = got.extend({ prefixUrl: 'httpbin.org', headers: { 'x-foo': 'bar' } }); const {headers} = await client.get('headers').json(); //=> headers['x-foo'] === 'bar' const jsonClient = client.extend({ responseType: 'json', resolveBodyOnly: true, headers: { 'x-baz': 'qux' } }); const {headers: headers2} = await jsonClient.get('headers'); //=> headers2['x-foo'] === 'bar' //=> headers2['x-baz'] === 'qux' })(); ``` Additionally, `got.extend()` accepts two properties from the `defaults` object: `mutableDefaults` and `handlers`. Example: ```js // You can now modify `mutableGot.defaults.options`. const mutableGot = got.extend({mutableDefaults: true}); const mergedHandlers = got.extend({ handlers: [ (options, next) => { delete options.headers.referer; return next(options); } ] }); ``` **Note:** Handlers can be asynchronous. The recommended approach is: ```js const handler = (options, next) => { if (options.isStream) { // It's a Stream return next(options); } // It's a Promise return (async () => { try { const response = await next(options); response.yourOwnProperty = true; return response; } catch (error) { // Every error will be replaced by this one. // Before you receive any error here, // it will be passed to the `beforeError` hooks first. // Note: this one won't be passed to `beforeError` hook. It's final. throw new Error('Your very own error.'); } })(); }; const instance = got.extend({handlers: [handler]}); ``` #### got.extend(...options, ...instances, ...) Merges many instances into a single one: - options are merged using [`got.mergeOptions()`](#gotmergeoptionsparentoptions-newoptions) (including hooks), - handlers are stored in an array (you can access them through `instance.defaults.handlers`). ```js const a = {headers: {cat: 'meow'}}; const b = got.extend({ options: { headers: { cow: 'moo' } } }); // The same as `got.extend(a).extend(b)`. // Note `a` is options and `b` is an instance. got.extend(a, b); //=> {headers: {cat: 'meow', cow: 'moo'}} ``` #### got.mergeOptions(parent, ...sources) Extends parent options. Avoid using [object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals) as it doesn't work recursively: ```js const a = {headers: {cat: 'meow', wolf: ['bark', 'wrrr']}}; const b = {headers: {cow: 'moo', wolf: ['auuu']}}; {...a, ...b} // => {headers: {cow: 'moo', wolf: ['auuu']}} got.mergeOptions(a, b) // => {headers: {cat: 'meow', cow: 'moo', wolf: ['auuu']}} ``` **Note:** Only Got options are merged! Custom user options should be defined via [`options.context`](#context). Options are deeply merged to a new object. The value of each key is determined as follows: - If the new property is not defined, the old value is used. - If the new property is explicitly set to `undefined`: - If the parent property is a plain `object`, the parent value is deeply cloned. - Otherwise, `undefined` is used. - If the parent value is an instance of `URLSearchParams`: - If the new value is a `string`, an `object` or an instance of `URLSearchParams`, a new `URLSearchParams` instance is created. The values are merged using [`urlSearchParams.append(key, value)`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/append). The keys defined in the new value override the keys defined in the parent value. Please note that `null` values point to an empty string and `undefined` values will exclude the entry. - Otherwise, the only available value is `undefined`. - If the new property is a plain `object`: - If the parent property is a plain `object` too, both values are merged recursively into a new `object`. - Otherwise, only the new value is deeply cloned. - If the new property is an `Array`, it overwrites the old one with a deep clone of the new property. - Properties that are not enumerable, such as `context`, `body`, `json`, and `form`, will not be merged. - Otherwise, the new value is assigned to the key. ```js const a = {json: {cat: 'meow'}}; const b = {json: {cow: 'moo'}}; got.mergeOptions(a, b); //=> {json: {cow: 'moo'}} ``` #### got.defaults Type: `object` The Got defaults used in that instance. ##### [options](#options) ##### handlers Type: `Function[]`\ Default: `[]` An array of functions. You execute them directly by calling `got()`. They are some sort of "global hooks" - these functions are called first. The last handler (*it's hidden*) is either [`asPromise`](source/core/as-promise/index.ts) or [`asStream`](source/core/index.ts), depending on the `options.isStream` property. Each handler takes two arguments: ###### [options](#options) ###### next() Returns a `Promise` or a `Stream` depending on [`options.isStream`](#isstream). ```js const settings = { handlers: [ (options, next) => { if (options.isStream) { // It's a Stream, so we can perform stream-specific actions on it return next(options) .on('request', request => { setTimeout(() => { request.abort(); }, 50); }); } // It's a Promise return next(options); } ], options: got.mergeOptions(got.defaults.options, { responseType: 'json' }) }; const jsonGot = got.extend(settings); ``` ##### mutableDefaults Type: `boolean`\ Default: `false` A read-only boolean describing whether the defaults are mutable or not. If set to `true`, you can [update headers over time](#hooksafterresponse), for example, update an access token when it expires. ## Types Got exports some handy TypeScript types and interfaces. See the type definition for all the exported types. ### Got TypeScript will automatically infer types for Got instances, but in case you want to define something like dependencies, you can import the available types directly from Got. ```ts import {GotRequestFunction} from 'got'; interface Dependencies { readonly post: GotRequestFunction } ``` ### Hooks When writing hooks, you can refer to their types to keep your interfaces consistent. ```ts import {BeforeRequestHook} from 'got'; const addAccessToken = (accessToken: string): BeforeRequestHook => options => { options.path = `${options.path}?access_token=${accessToken}`; } ``` ## Errors Each error contains an `options` property which are the options Got used to create a request - just to make debugging easier.\ Additionaly, the errors may have `request` (Got Stream) and `response` (Got Response) properties depending on which phase of the request failed. #### got.RequestError When a request fails. Contains a `code` property with error class code, like `ECONNREFUSED`. If there is no specific code supplied, `code` defaults to `ERR_GOT_REQUEST_ERROR`. All the errors below inherit this one. #### got.CacheError When a cache method fails, for example, if the database goes down or there's a filesystem error. Contains a `code` property with `ERR_CACHE_ACCESS` or a more specific failure code. #### got.ReadError When reading from response stream fails. Contains a `code` property with `ERR_READING_RESPONSE_STREAM` or a more specific failure code. #### got.ParseError When server response code is 2xx, and parsing body fails. Includes a `response` property. Contains a `code` property with `ERR_BODY_PARSE_FAILURE` or a more specific failure code. #### got.UploadError When the request body is a stream and an error occurs while reading from that stream. Contains a `code` property with `ERR_UPLOAD` or a more specific failure code. #### got.HTTPError When the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304. Includes a `response` property. Contains a `code` property with `ERR_NON_2XX_3XX_RESPONSE` or a more specific failure code. #### got.MaxRedirectsError When the server redirects you more than ten times. Includes a `response` property. Contains a `code` property with `ERR_TOO_MANY_REDIRECTS`. #### got.UnsupportedProtocolError When given an unsupported protocol. Contains a `code` property with `ERR_UNSUPPORTED_PROTOCOL`. #### got.TimeoutError When the request is aborted due to a [timeout](#timeout). Includes an `event` and `timings` property. Contains a `code` property with `ETIMEDOUT`. #### got.CancelError When the request is aborted with `.cancel()`. Contains a `code` property with `ERR_CANCELED`. ## Aborting the request The promise returned by Got has a [`.cancel()`](https://github.com/sindresorhus/p-cancelable) method which when called, aborts the request. ```js (async () => { const request = got(url, options); // … // In another part of the code if (something) { request.cancel(); } // … try { await request; } catch (error) { if (request.isCanceled) { // Or `error instanceof got.CancelError` // Handle cancelation } // Handle other errors } })(); ``` When using hooks, simply throw an error to abort the request. ```js const got = require('got'); (async () => { const request = got(url, { hooks: { beforeRequest: [ () => { throw new Error('Oops. Request canceled.'); } ] } }); try { await request; } catch (error) { // … } })(); ``` To abort the Got Stream request, just call `stream.destroy()`. ```js const got = require('got'); const stream = got.stream(url); stream.destroy(); ``` ## Cache Got implements [RFC 7234](https://httpwg.org/specs/rfc7234.html) compliant HTTP caching which works out of the box in-memory and is easily pluggable with a wide range of storage adapters. Fresh cache entries are served directly from the cache, and stale cache entries are revalidated with `If-None-Match`/`If-Modified-Since` headers. You can read more about the underlying cache behavior in the [`cacheable-request` documentation](https://github.com/lukechilds/cacheable-request). For DNS cache, Got uses [`cacheable-lookup`](https://github.com/szmarczak/cacheable-lookup). You can use the JavaScript `Map` type as an in-memory cache: ```js const got = require('got'); const map = new Map(); (async () => { let response = await got('https://sindresorhus.com', {cache: map}); console.log(response.isFromCache); //=> false response = await got('https://sindresorhus.com', {cache: map}); console.log(response.isFromCache); //=> true })(); ``` Got uses [Keyv](https://github.com/lukechilds/keyv) internally to support a wide range of storage adapters. For something more scalable you could use an [official Keyv storage adapter](https://github.com/lukechilds/keyv#official-storage-adapters): ``` $ npm install @keyv/redis ``` ```js const got = require('got'); const KeyvRedis = require('@keyv/redis'); const redis = new KeyvRedis('redis://user:pass@localhost:6379'); got('https://sindresorhus.com', {cache: redis}); ``` Got supports anything that follows the Map API, so it's easy to write your own storage adapter or use a third-party solution. For example, the following are all valid storage adapters: ```js const storageAdapter = new Map(); // Or const storageAdapter = require('./my-storage-adapter'); // Or const QuickLRU = require('quick-lru'); const storageAdapter = new QuickLRU({maxSize: 1000}); got('https://sindresorhus.com', {cache: storageAdapter}); ``` View the [Keyv docs](https://github.com/lukechilds/keyv) for more information on how to use storage adapters. ## Proxies You can use the [`tunnel`](https://github.com/koichik/node-tunnel) package with the `agent` option to work with proxies: ```js const got = require('got'); const tunnel = require('tunnel'); got('https://sindresorhus.com', { agent: { https: tunnel.httpsOverHttp({ proxy: { host: 'localhost' } }) } }); ``` Otherwise, you can use the [`hpagent`](https://github.com/delvedor/hpagent) package, which keeps the internal sockets alive to be reused. ```js const got = require('got'); const {HttpsProxyAgent} = require('hpagent'); got('https://sindresorhus.com', { agent: { https: new HttpsProxyAgent({ keepAlive: true, keepAliveMsecs: 1000, maxSockets: 256, maxFreeSockets: 256, scheduling: 'lifo', proxy: 'https://localhost:8080' }) } }); ``` Alternatively, use [`global-agent`](https://github.com/gajus/global-agent) to configure a global proxy for all HTTP/HTTPS traffic in your program. Read the [`http2-wrapper`](https://github.com/szmarczak/http2-wrapper/#proxy-support) docs to learn about proxying for HTTP/2. ## Cookies You can use the [`tough-cookie`](https://github.com/salesforce/tough-cookie) package: ```js const {promisify} = require('util'); const got = require('got'); const {CookieJar} = require('tough-cookie'); (async () => { const cookieJar = new CookieJar(); const setCookie = promisify(cookieJar.setCookie.bind(cookieJar)); await setCookie('foo=bar', 'https://example.com'); await got('https://example.com', {cookieJar}); })(); ``` ## Form data You can use the [`form-data`](https://github.com/form-data/form-data) package to create POST request with form data: ```js const fs = require('fs'); const got = require('got'); const FormData = require('form-data'); const form = new FormData(); form.append('my_file', fs.createReadStream('/foo/bar.jpg')); got.post('https://example.com', { body: form }); ``` ## OAuth You can use the [`oauth-1.0a`](https://github.com/ddo/oauth-1.0a) package to create a signed OAuth request: ```js const got = require('got'); const crypto = require('crypto'); const OAuth = require('oauth-1.0a'); const oauth = OAuth({ consumer: { key: process.env.CONSUMER_KEY, secret: process.env.CONSUMER_SECRET }, signature_method: 'HMAC-SHA1', hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64') }); const token = { key: process.env.ACCESS_TOKEN, secret: process.env.ACCESS_TOKEN_SECRET }; const url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'; got(url, { headers: oauth.toHeader(oauth.authorize({url, method: 'GET'}, token)), responseType: 'json' }); ``` ## Unix Domain Sockets Requests can also be sent via [unix domain sockets](http://serverfault.com/questions/124517/whats-the-difference-between-unix-socket-and-tcp-ip-socket). Use the following URL scheme: `PROTOCOL://unix:SOCKET:PATH`. - `PROTOCOL` - `http` or `https` *(optional)* - `SOCKET` - Absolute path to a unix domain socket, for example: `/var/run/docker.sock` - `PATH` - Request path, for example: `/v2/keys` ```js const got = require('got'); got('http://unix:/var/run/docker.sock:/containers/json'); // Or without protocol (HTTP by default) got('unix:/var/run/docker.sock:/containers/json'); ``` ## AWS Requests to AWS services need to have their headers signed. This can be accomplished by using the [`got4aws`](https://www.npmjs.com/package/got4aws) package. This is an example for querying an ["API Gateway"](https://docs.aws.amazon.com/apigateway/api-reference/signing-requests/) with a signed request. ```js const got4aws = require('got4aws');; const awsClient = got4aws(); const response = await awsClient('https://.execute-api..amazonaws.com//endpoint/path', { // Request-specific options }); ``` ## Testing You can test your requests by using the [`nock`](https://github.com/node-nock/nock) package to mock an endpoint: ```js const got = require('got'); const nock = require('nock'); nock('https://sindresorhus.com') .get('/') .reply(200, 'Hello world!'); (async () => { const response = await got('https://sindresorhus.com'); console.log(response.body); //=> 'Hello world!' })(); ``` Bear in mind, that by default `nock` mocks only one request. Got will [retry](#retry) on failed requests by default, causing a `No match for request ...` error. The solution is to either disable retrying (set `options.retry` to `0`) or call `.persist()` on the mocked request. ```js const got = require('got'); const nock = require('nock'); const scope = nock('https://sindresorhus.com') .get('/') .reply(500, 'Internal server error') .persist(); (async () => { try { await got('https://sindresorhus.com') } catch (error) { console.log(error.response.body); //=> 'Internal server error' console.log(error.response.retryCount); //=> 2 } scope.persist(false); })(); ``` For real integration testing we recommend using [`ava`](https://github.com/avajs/ava) with [`create-test-server`](https://github.com/lukechilds/create-test-server). We're using a macro so we don't have to `server.listen()` and `server.close()` every test. Take a look at one of our tests: ```js test('retry function gets iteration count', withServer, async (t, server, got) => { let knocks = 0; server.get('/', (request, response) => { if (knocks++ === 1) { response.end('who`s there?'); } }); await got({ retry: { calculateDelay: ({attemptCount}) => { t.true(is.number(attemptCount)); return attemptCount < 2 ? 1 : 0; } } }); }); ``` ## Tips ### JSON mode To pass an object as the body, you need to use the `json` option. It will be stringified using `JSON.stringify`. Example: ```js const got = require('got'); (async () => { const {body} = await got.post('https://httpbin.org/anything', { json: { hello: 'world' }, responseType: 'json' }); console.log(body.data); //=> '{"hello":"world"}' })(); ``` To receive a JSON body you can either set `responseType` option to `json` or use `promise.json()`. Example: ```js const got = require('got'); (async () => { const body = await got.post('https://httpbin.org/anything', { json: { hello: 'world' } }).json(); console.log(body); //=> {…} })(); ``` ### User Agent It's a good idea to set the `'user-agent'` header so the provider can more easily see how their resource is used. By default, it's the URL to this repo. You can omit this header by setting it to `undefined`. ```js const got = require('got'); const pkg = require('./package.json'); got('https://sindresorhus.com', { headers: { 'user-agent': `my-package/${pkg.version} (https://github.com/username/my-package)` } }); got('https://sindresorhus.com', { headers: { 'user-agent': undefined } }); ``` ### 304 Responses Bear in mind; if you send an `if-modified-since` header and receive a `304 Not Modified` response, the body will be empty. It's your responsibility to cache and retrieve the body contents. ### Custom endpoints Use `got.extend()` to make it nicer to work with REST APIs. Especially if you use the `prefixUrl` option. ```js const got = require('got'); const pkg = require('./package.json'); const custom = got.extend({ prefixUrl: 'example.com', responseType: 'json', headers: { 'user-agent': `my-package/${pkg.version} (https://github.com/username/my-package)` } }); // Use `custom` exactly how you use `got` (async () => { const list = await custom('v1/users/list'); })(); ``` ## FAQ ### Why yet another HTTP client? Got was created because the popular [`request`](https://github.com/request/request) package is bloated: [![Install size](https://packagephobia.now.sh/badge?p=request)](https://packagephobia.now.sh/result?p=request)\ Furthermore, Got is fully written in TypeScript and actively maintained. ### Electron support has been removed The Electron `net` module is not consistent with the Node.js `http` module. See [#899](https://github.com/sindresorhus/got/issues/899) for more info. ## Comparison | | `got` | [`request`][r0] | [`node-fetch`][n0] | [`ky`][k0] | [`axios`][a0] | [`superagent`][s0] | |-----------------------|:------------------:|:------------------:|:--------------------:|:------------------------:|:------------------:|:----------------------:| | HTTP/2 support | :sparkle: | :x: | :x: | :x: | :x: | :heavy_check_mark:\*\* | | Browser support | :x: | :x: | :heavy_check_mark:\* | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Promise API | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Stream API | :heavy_check_mark: | :heavy_check_mark: | Node.js only | :x: | :x: | :heavy_check_mark: | | Pagination API | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | | Request cancelation | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | RFC compliant caching | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | | Cookies (out-of-box) | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | | Follows redirects | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Retries on failure | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | | Progress events | :heavy_check_mark: | :x: | :x: | :heavy_check_mark:\*\*\* | Browser only | :heavy_check_mark: | | Handles gzip/deflate | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Advanced timeouts | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | | Timings | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | | Errors with metadata | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | | JSON mode | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Custom defaults | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | | Composable | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | | Hooks | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | | Issues open | [![][gio]][g1] | [![][rio]][r1] | [![][nio]][n1] | [![][kio]][k1] | [![][aio]][a1] | [![][sio]][s1] | | Issues closed | [![][gic]][g2] | [![][ric]][r2] | [![][nic]][n2] | [![][kic]][k2] | [![][aic]][a2] | [![][sic]][s2] | | Downloads | [![][gd]][g3] | [![][rd]][r3] | [![][nd]][n3] | [![][kd]][k3] | [![][ad]][a3] | [![][sd]][s3] | | Coverage | [![][gc]][g4] | [![][rc]][r4] | [![][nc]][n4] | [![][kc]][k4] | [![][ac]][a4] | [![][sc]][s4] | | Build | [![][gb]][g5] | [![][rb]][r5] | [![][nb]][n5] | [![][kb]][k5] | [![][ab]][a5] | [![][sb]][s5] | | Bugs | [![][gbg]][g6] | [![][rbg]][r6] | [![][nbg]][n6] | [![][kbg]][k6] | [![][abg]][a6] | [![][sbg]][s6] | | Dependents | [![][gdp]][g7] | [![][rdp]][r7] | [![][ndp]][n7] | [![][kdp]][k7] | [![][adp]][a7] | [![][sdp]][s7] | | Install size | [![][gis]][g8] | [![][ris]][r8] | [![][nis]][n8] | [![][kis]][k8] | [![][ais]][a8] | [![][sis]][s8] | | GitHub stars | [![][gs]][g9] | [![][rs]][r9] | [![][ns]][n9] | [![][ks]][k9] | [![][as]][a9] | [![][ss]][s9] | | TypeScript support | [![][gts]][g10] | [![][rts]][r10] | [![][nts]][n10] | [![][kts]][k10] | [![][ats]][a10] | [![][sts]][s11] | | Last commit | [![][glc]][g11] | [![][rlc]][r11] | [![][nlc]][n11] | [![][klc]][k11] | [![][alc]][a11] | [![][slc]][s11] | \* It's almost API compatible with the browser `fetch` API.\ \*\* Need to switch the protocol manually. Doesn't accept PUSH streams and doesn't reuse HTTP/2 sessions.\ \*\*\* Currently, only `DownloadProgress` event is supported, `UploadProgress` event is not supported.\ :sparkle: Almost-stable feature, but the API may change. Don't hesitate to try it out!\ :grey_question: Feature in early stage of development. Very experimental. [k0]: https://github.com/sindresorhus/ky [r0]: https://github.com/request/request [n0]: https://github.com/node-fetch/node-fetch [a0]: https://github.com/axios/axios [s0]: https://github.com/visionmedia/superagent [gio]: https://badgen.net/github/open-issues/sindresorhus/got?label [kio]: https://badgen.net/github/open-issues/sindresorhus/ky?label [rio]: https://badgen.net/github/open-issues/request/request?label [nio]: https://badgen.net/github/open-issues/bitinn/node-fetch?label [aio]: https://badgen.net/github/open-issues/axios/axios?label [sio]: https://badgen.net/github/open-issues/visionmedia/superagent?label [g1]: https://github.com/sindresorhus/got/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [k1]: https://github.com/sindresorhus/ky/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [r1]: https://github.com/request/request/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [n1]: https://github.com/bitinn/node-fetch/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [a1]: https://github.com/axios/axios/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [s1]: https://github.com/visionmedia/superagent/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc [gic]: https://badgen.net/github/closed-issues/sindresorhus/got?label [kic]: https://badgen.net/github/closed-issues/sindresorhus/ky?label [ric]: https://badgen.net/github/closed-issues/request/request?label [nic]: https://badgen.net/github/closed-issues/bitinn/node-fetch?label [aic]: https://badgen.net/github/closed-issues/axios/axios?label [sic]: https://badgen.net/github/closed-issues/visionmedia/superagent?label [g2]: https://github.com/sindresorhus/got/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [k2]: https://github.com/sindresorhus/ky/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [r2]: https://github.com/request/request/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [n2]: https://github.com/bitinn/node-fetch/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [a2]: https://github.com/axios/axios/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [s2]: https://github.com/visionmedia/superagent/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc [gd]: https://badgen.net/npm/dm/got?label [kd]: https://badgen.net/npm/dm/ky?label [rd]: https://badgen.net/npm/dm/request?label [nd]: https://badgen.net/npm/dm/node-fetch?label [ad]: https://badgen.net/npm/dm/axios?label [sd]: https://badgen.net/npm/dm/superagent?label [g3]: https://www.npmjs.com/package/got [k3]: https://www.npmjs.com/package/ky [r3]: https://www.npmjs.com/package/request [n3]: https://www.npmjs.com/package/node-fetch [a3]: https://www.npmjs.com/package/axios [s3]: https://www.npmjs.com/package/superagent [gc]: https://badgen.net/coveralls/c/github/sindresorhus/got?label [kc]: https://badgen.net/codecov/c/github/sindresorhus/ky?label [rc]: https://badgen.net/coveralls/c/github/request/request?label [nc]: https://badgen.net/coveralls/c/github/bitinn/node-fetch?label [ac]: https://badgen.net/coveralls/c/github/mzabriskie/axios?label [sc]: https://badgen.net/codecov/c/github/visionmedia/superagent?label [g4]: https://coveralls.io/github/sindresorhus/got [k4]: https://codecov.io/gh/sindresorhus/ky [r4]: https://coveralls.io/github/request/request [n4]: https://coveralls.io/github/bitinn/node-fetch [a4]: https://coveralls.io/github/mzabriskie/axios [s4]: https://codecov.io/gh/visionmedia/superagent [gb]: https://badgen.net/travis/sindresorhus/got?label [kb]: https://badgen.net/travis/sindresorhus/ky?label [rb]: https://badgen.net/travis/request/request?label [nb]: https://badgen.net/travis/bitinn/node-fetch?label [ab]: https://badgen.net/travis/axios/axios?label [sb]: https://badgen.net/travis/visionmedia/superagent?label [g5]: https://travis-ci.com/github/sindresorhus/got [k5]: https://travis-ci.com/github/sindresorhus/ky [r5]: https://travis-ci.org/github/request/request [n5]: https://travis-ci.org/github/bitinn/node-fetch [a5]: https://travis-ci.org/github/axios/axios [s5]: https://travis-ci.org/github/visionmedia/superagent [gbg]: https://badgen.net/github/label-issues/sindresorhus/got/bug/open?label [kbg]: https://badgen.net/github/label-issues/sindresorhus/ky/bug/open?label [rbg]: https://badgen.net/github/label-issues/request/request/Needs%20investigation/open?label [nbg]: https://badgen.net/github/label-issues/bitinn/node-fetch/bug/open?label [abg]: https://badgen.net/github/label-issues/axios/axios/type:confirmed%20bug/open?label [sbg]: https://badgen.net/github/label-issues/visionmedia/superagent/Bug/open?label [g6]: https://github.com/sindresorhus/got/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Abug [k6]: https://github.com/sindresorhus/ky/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Abug [r6]: https://github.com/request/request/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A"Needs+investigation" [n6]: https://github.com/bitinn/node-fetch/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Abug [a6]: https://github.com/axios/axios/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22type%3Aconfirmed+bug%22 [s6]: https://github.com/visionmedia/superagent/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3ABug [gdp]: https://badgen.net/npm/dependents/got?label [kdp]: https://badgen.net/npm/dependents/ky?label [rdp]: https://badgen.net/npm/dependents/request?label [ndp]: https://badgen.net/npm/dependents/node-fetch?label [adp]: https://badgen.net/npm/dependents/axios?label [sdp]: https://badgen.net/npm/dependents/superagent?label [g7]: https://www.npmjs.com/package/got?activeTab=dependents [k7]: https://www.npmjs.com/package/ky?activeTab=dependents [r7]: https://www.npmjs.com/package/request?activeTab=dependents [n7]: https://www.npmjs.com/package/node-fetch?activeTab=dependents [a7]: https://www.npmjs.com/package/axios?activeTab=dependents [s7]: https://www.npmjs.com/package/visionmedia?activeTab=dependents [gis]: https://badgen.net/packagephobia/install/got?label [kis]: https://badgen.net/packagephobia/install/ky?label [ris]: https://badgen.net/packagephobia/install/request?label [nis]: https://badgen.net/packagephobia/install/node-fetch?label [ais]: https://badgen.net/packagephobia/install/axios?label [sis]: https://badgen.net/packagephobia/install/superagent?label [g8]: https://packagephobia.now.sh/result?p=got [k8]: https://packagephobia.now.sh/result?p=ky [r8]: https://packagephobia.now.sh/result?p=request [n8]: https://packagephobia.now.sh/result?p=node-fetch [a8]: https://packagephobia.now.sh/result?p=axios [s8]: https://packagephobia.now.sh/result?p=superagent [gs]: https://badgen.net/github/stars/sindresorhus/got?label [ks]: https://badgen.net/github/stars/sindresorhus/ky?label [rs]: https://badgen.net/github/stars/request/request?label [ns]: https://badgen.net/github/stars/bitinn/node-fetch?label [as]: https://badgen.net/github/stars/axios/axios?label [ss]: https://badgen.net/github/stars/visionmedia/superagent?label [g9]: https://github.com/sindresorhus/got [k9]: https://github.com/sindresorhus/ky [r9]: https://github.com/request/request [n9]: https://github.com/node-fetch/node-fetch [a9]: https://github.com/axios/axios [s9]: https://github.com/visionmedia/superagent [gts]: https://badgen.net/npm/types/got?label [kts]: https://badgen.net/npm/types/ky?label [rts]: https://badgen.net/npm/types/request?label [nts]: https://badgen.net/npm/types/node-fetch?label [ats]: https://badgen.net/npm/types/axios?label [sts]: https://badgen.net/npm/types/superagent?label [g10]: https://github.com/sindresorhus/got [k10]: https://github.com/sindresorhus/ky [r10]: https://github.com/request/request [n10]: https://github.com/node-fetch/node-fetch [a10]: https://github.com/axios/axios [s10]: https://github.com/visionmedia/superagent [glc]: https://badgen.net/github/last-commit/sindresorhus/got?label [klc]: https://badgen.net/github/last-commit/sindresorhus/ky?label [rlc]: https://badgen.net/github/last-commit/request/request?label [nlc]: https://badgen.net/github/last-commit/bitinn/node-fetch?label [alc]: https://badgen.net/github/last-commit/axios/axios?label [slc]: https://badgen.net/github/last-commit/visionmedia/superagent?label [g11]: https://github.com/sindresorhus/got/commits [k11]: https://github.com/sindresorhus/ky/commits [r11]: https://github.com/request/request/commits [n11]: https://github.com/node-fetch/node-fetch/commits [a11]: https://github.com/axios/axios/commits [s11]: https://github.com/visionmedia/superagent/commits [Click here][InstallSizeOfTheDependencies] to see the install size of the Got dependencies. [InstallSizeOfTheDependencies]: https://packagephobia.com/result?p=@sindresorhus/is@3.0.0,@szmarczak/http-timer@4.0.5,@types/cacheable-request@6.0.1,@types/responselike@1.0.0,cacheable-lookup@5.0.3,cacheable-request@7.0.1,decompress-response@6.0.0,http2-wrapper@1.0.0,lowercase-keys@2.0.0,p-cancelable@2.0.0,responselike@2.0.0 ## Related - [gh-got](https://github.com/sindresorhus/gh-got) - Got convenience wrapper to interact with the GitHub API - [gl-got](https://github.com/singapore/gl-got) - Got convenience wrapper to interact with the GitLab API - [travis-got](https://github.com/samverschueren/travis-got) - Got convenience wrapper to interact with the Travis API - [graphql-got](https://github.com/kevva/graphql-got) - Got convenience wrapper to interact with GraphQL - [GotQL](https://github.com/khaosdoctor/gotql) - Got convenience wrapper to interact with GraphQL using JSON-parsed queries instead of strings - [got-fetch](https://github.com/alexghr/got-fetch) - Got with a `fetch` interface ## Maintainers [![Sindre Sorhus](https://github.com/sindresorhus.png?size=100)](https://sindresorhus.com) | [![Szymon Marczak](https://github.com/szmarczak.png?size=100)](https://github.com/szmarczak) | [![Giovanni Minotti](https://github.com/Giotino.png?size=100)](https://github.com/Giotino) ---|---|--- [Sindre Sorhus](https://sindresorhus.com) | [Szymon Marczak](https://github.com/szmarczak) | [Giovanni Minotti](https://github.com/Giotino) ###### Former - [Vsevolod Strukchinsky](https://github.com/floatdrop) - [Alexander Tesfamichael](https://github.com/alextes) - [Brandon Smith](https://github.com/brandon93s) - [Luke Childs](https://github.com/lukechilds) ## These amazing companies are using Got                                             
> Segment is a happy user of Got! Got powers the main backend API that our app talks to. It's used by our in-house RPC client that we use to communicate with all microservices. > > — Vadim Demedes > Antora, a static site generator for creating documentation sites, uses Got to download the UI bundle. In Antora, the UI bundle (aka theme) is maintained as a separate project. That project exports the UI as a zip file we call the UI bundle. The main site generator downloads that UI from a URL using Got and streams it to vinyl-zip to extract the files. Those files go on to be used to create the HTML pages and supporting assets. > > — Dan Allen > GetVoIP is happily using Got in production. One of the unique capabilities of Got is the ability to handle Unix sockets which enables us to build a full control interfaces for our docker stack. > > — Daniel Kalen > We're using Got inside of Exoframe to handle all the communication between CLI and server. Exoframe is a self-hosted tool that allows simple one-command deployments using Docker. > > — Tim Ermilov > Karaoke Mugen uses Got to fetch content updates from its online server. > > — Axel Terizaki > Renovate uses Got, gh-got and gl-got to send millions of queries per day to GitHub, GitLab, npmjs, PyPi, Packagist, Docker Hub, Terraform, CircleCI, and more. > > — Rhys Arkins > Resistbot uses Got to communicate from the API frontend where all correspondence ingresses to the officials lookup database in back. > > — Chris Erickson > Natural Cycles is using Got to communicate with all kinds of 3rd-party REST APIs (over 9000!). > > — Kirill Groshkov > Microlink is a cloud browser as an API service that uses Got widely as the main HTTP client, serving ~22M requests a month, every time a network call needs to be performed. > > — Kiko Beats > We’re using Got at Radity. Thanks for such an amazing work! > > — Mirzayev Farid ## For enterprise Available as part of the Tidelift Subscription. The maintainers of `got` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-got?utm_source=npm-got&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) sindresorhus-got-11d2e83/source/000077500000000000000000000000001434406364000166665ustar00rootroot00000000000000sindresorhus-got-11d2e83/source/as-promise/000077500000000000000000000000001434406364000207455ustar00rootroot00000000000000sindresorhus-got-11d2e83/source/as-promise/create-rejection.ts000066400000000000000000000014751434406364000245470ustar00rootroot00000000000000import {CancelableRequest, BeforeErrorHook, RequestError} from './types'; export default function createRejection(error: Error, ...beforeErrorGroups: Array): CancelableRequest { const promise = (async () => { if (error instanceof RequestError) { try { for (const hooks of beforeErrorGroups) { if (hooks) { for (const hook of hooks) { // eslint-disable-next-line no-await-in-loop error = await hook(error as RequestError); } } } } catch (error_) { error = error_; } } throw error; })() as CancelableRequest; const returnPromise = (): CancelableRequest => promise; promise.json = returnPromise; promise.text = returnPromise; promise.buffer = returnPromise; promise.on = returnPromise; return promise; } sindresorhus-got-11d2e83/source/as-promise/index.ts000066400000000000000000000130061434406364000224240ustar00rootroot00000000000000import {EventEmitter} from 'events'; import is from '@sindresorhus/is'; import PCancelable = require('p-cancelable'); import { NormalizedOptions, CancelableRequest, Response, RequestError, HTTPError, CancelError } from './types'; import parseBody from './parse-body'; import Request from '../core'; import proxyEvents from '../core/utils/proxy-events'; import getBuffer from '../core/utils/get-buffer'; import {isResponseOk} from '../core/utils/is-response-ok'; const proxiedRequestEvents = [ 'request', 'response', 'redirect', 'uploadProgress', 'downloadProgress' ]; export default function asPromise(normalizedOptions: NormalizedOptions): CancelableRequest { let globalRequest: Request; let globalResponse: Response; const emitter = new EventEmitter(); const promise = new PCancelable((resolve, reject, onCancel) => { const makeRequest = (retryCount: number): void => { const request = new Request(undefined, normalizedOptions); request.retryCount = retryCount; request._noPipe = true; onCancel(() => request.destroy()); onCancel.shouldReject = false; onCancel(() => reject(new CancelError(request))); globalRequest = request; request.once('response', async (response: Response) => { response.retryCount = retryCount; if (response.request.aborted) { // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error return; } // Download body let rawBody; try { rawBody = await getBuffer(request); response.rawBody = rawBody; } catch { // The same error is caught below. // See request.once('error') return; } if (request._isAboutToError) { return; } // Parse body const contentEncoding = (response.headers['content-encoding'] ?? '').toLowerCase(); const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding); const {options} = request; if (isCompressed && !options.decompress) { response.body = rawBody; } else { try { response.body = parseBody(response, options.responseType, options.parseJson, options.encoding); } catch (error) { // Fallback to `utf8` response.body = rawBody.toString(); if (isResponseOk(response)) { request._beforeError(error); return; } } } try { for (const [index, hook] of options.hooks.afterResponse.entries()) { // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise // eslint-disable-next-line no-await-in-loop response = await hook(response, async (updatedOptions): CancelableRequest => { const typedOptions = Request.normalizeArguments(undefined, { ...updatedOptions, retry: { calculateDelay: () => 0 }, throwHttpErrors: false, resolveBodyOnly: false }, options); // Remove any further hooks for that request, because we'll call them anyway. // The loop continues. We don't want duplicates (asPromise recursion). typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index); for (const hook of typedOptions.hooks.beforeRetry) { // eslint-disable-next-line no-await-in-loop await hook(typedOptions); } const promise: CancelableRequest = asPromise(typedOptions); onCancel(() => { promise.catch(() => {}); promise.cancel(); }); return promise; }); } } catch (error) { request._beforeError(new RequestError(error.message, error, request)); return; } globalResponse = response; if (!isResponseOk(response)) { request._beforeError(new HTTPError(response)); return; } request.destroy(); resolve(request.options.resolveBodyOnly ? response.body as T : response as unknown as T); }); const onError = (error: RequestError) => { if (promise.isCanceled) { return; } const {options} = request; if (error instanceof HTTPError && !options.throwHttpErrors) { const {response} = error; resolve(request.options.resolveBodyOnly ? response.body as T : response as unknown as T); return; } reject(error); }; request.once('error', onError); const previousBody = request.options.body; request.once('retry', (newRetryCount: number, error: RequestError) => { if (previousBody === error.request?.options.body && is.nodeStream(error.request?.options.body)) { onError(error); return; } makeRequest(newRetryCount); }); proxyEvents(request, emitter, proxiedRequestEvents); }; makeRequest(0); }) as CancelableRequest; promise.on = (event: string, fn: (...args: any[]) => void) => { emitter.on(event, fn); return promise; }; const shortcut = (responseType: NormalizedOptions['responseType']): CancelableRequest => { const newPromise = (async () => { // Wait until downloading has ended await promise; const {options} = globalResponse.request; return parseBody(globalResponse, responseType, options.parseJson, options.encoding); })(); Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise)); return newPromise as CancelableRequest; }; promise.json = () => { const {headers} = globalRequest.options; if (!globalRequest.writableFinished && headers.accept === undefined) { headers.accept = 'application/json'; } return shortcut('json'); }; promise.buffer = () => shortcut('buffer'); promise.text = () => shortcut('text'); return promise; } export * from './types'; sindresorhus-got-11d2e83/source/as-promise/normalize-arguments.ts000066400000000000000000000052321434406364000253220ustar00rootroot00000000000000import is, {assert} from '@sindresorhus/is'; import { Options, NormalizedOptions, Defaults, Method } from './types'; const normalizeArguments = (options: NormalizedOptions, defaults?: Defaults): NormalizedOptions => { if (is.null_(options.encoding)) { throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead'); } assert.any([is.string, is.undefined], options.encoding); assert.any([is.boolean, is.undefined], options.resolveBodyOnly); assert.any([is.boolean, is.undefined], options.methodRewriting); assert.any([is.boolean, is.undefined], options.isStream); assert.any([is.string, is.undefined], options.responseType); // `options.responseType` if (options.responseType === undefined) { options.responseType = 'text'; } // `options.retry` const {retry} = options; if (defaults) { options.retry = {...defaults.retry}; } else { options.retry = { calculateDelay: retryObject => retryObject.computedValue, limit: 0, methods: [], statusCodes: [], errorCodes: [], maxRetryAfter: undefined }; } if (is.object(retry)) { options.retry = { ...options.retry, ...retry }; options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase() as Method))]; options.retry.statusCodes = [...new Set(options.retry.statusCodes)]; options.retry.errorCodes = [...new Set(options.retry.errorCodes)]; } else if (is.number(retry)) { options.retry.limit = retry; } if (is.undefined(options.retry.maxRetryAfter)) { options.retry.maxRetryAfter = Math.min( // TypeScript is not smart enough to handle `.filter(x => is.number(x))`. // eslint-disable-next-line unicorn/no-fn-reference-in-iterator ...[options.timeout.request, options.timeout.connect].filter(is.number) ); } // `options.pagination` if (is.object(options.pagination)) { if (defaults) { (options as Options).pagination = { ...defaults.pagination, ...options.pagination }; } const {pagination} = options; if (!is.function_(pagination.transform)) { throw new Error('`options.pagination.transform` must be implemented'); } if (!is.function_(pagination.shouldContinue)) { throw new Error('`options.pagination.shouldContinue` must be implemented'); } if (!is.function_(pagination.filter)) { throw new TypeError('`options.pagination.filter` must be implemented'); } if (!is.function_(pagination.paginate)) { throw new Error('`options.pagination.paginate` must be implemented'); } } // JSON mode if (options.responseType === 'json' && options.headers.accept === undefined) { options.headers.accept = 'application/json'; } return options; }; export default normalizeArguments; sindresorhus-got-11d2e83/source/as-promise/parse-body.ts000066400000000000000000000013131434406364000233600ustar00rootroot00000000000000import { ResponseType, ParseError, Response, ParseJsonFunction } from './types'; const parseBody = (response: Response, responseType: ResponseType, parseJson: ParseJsonFunction, encoding?: BufferEncoding): unknown => { const {rawBody} = response; try { if (responseType === 'text') { return rawBody.toString(encoding); } if (responseType === 'json') { return rawBody.length === 0 ? '' : parseJson(rawBody.toString()); } if (responseType === 'buffer') { return rawBody; } throw new ParseError({ message: `Unknown body type '${responseType as string}'`, name: 'Error' }, response); } catch (error) { throw new ParseError(error, response); } }; export default parseBody; sindresorhus-got-11d2e83/source/as-promise/types.ts000066400000000000000000000201171434406364000224620ustar00rootroot00000000000000import PCancelable = require('p-cancelable'); import Request, { Options, Response, RequestError, RequestEvents } from '../core'; /** All parsing methods supported by Got. */ export type ResponseType = 'json' | 'buffer' | 'text'; export interface PaginationOptions { /** All options accepted by `got.paginate()`. */ pagination?: { /** A function that transform [`Response`](#response) into an array of items. This is where you should do the parsing. @default response => JSON.parse(response.body) */ transform?: (response: Response) => Promise | T[]; /** Checks whether the item should be emitted or not. @default (item, allItems, currentItems) => true */ filter?: (item: T, allItems: T[], currentItems: T[]) => boolean; /** The function takes three arguments: - `response` - The current response object. - `allItems` - An array of the emitted items. - `currentItems` - Items from the current response. It should return an object representing Got options pointing to the next page. The options are merged automatically with the previous request, therefore the options returned `pagination.paginate(...)` must reflect changes only. If there are no more pages, `false` should be returned. @example ``` const got = require('got'); (async () => { const limit = 10; const items = got.paginate('https://example.com/items', { searchParams: { limit, offset: 0 }, pagination: { paginate: (response, allItems, currentItems) => { const previousSearchParams = response.request.options.searchParams; const previousOffset = previousSearchParams.get('offset'); if (currentItems.length < limit) { return false; } return { searchParams: { ...previousSearchParams, offset: Number(previousOffset) + limit, } }; } } }); console.log('Items from all pages:', items); })(); ``` */ paginate?: (response: Response, allItems: T[], currentItems: T[]) => Options | false; /** Checks whether the pagination should continue. For example, if you need to stop **before** emitting an entry with some flag, you should use `(item, allItems, currentItems) => !item.flag`. If you want to stop **after** emitting the entry, you should use `(item, allItems, currentItems) => allItems.some(entry => entry.flag)` instead. @default (item, allItems, currentItems) => true */ shouldContinue?: (item: T, allItems: T[], currentItems: T[]) => boolean; /** The maximum amount of items that should be emitted. @default Infinity */ countLimit?: number; /** Milliseconds to wait before the next request is triggered. @default 0 */ backoff?: number; /** The maximum amount of request that should be triggered. Retries on failure are not counted towards this limit. For example, it can be helpful during development to avoid an infinite number of requests. @default 10000 */ requestLimit?: number; /** Defines how the parameter `allItems` in pagination.paginate, pagination.filter and pagination.shouldContinue is managed. When set to `false`, the parameter `allItems` is always an empty array. This option can be helpful to save on memory usage when working with a large dataset. */ stackAllItems?: boolean; }; } export type AfterResponseHook = (response: Response, retryWithMergedOptions: (options: Options) => CancelableRequest) => Response | CancelableRequest | Promise>; // These should be merged into Options in core/index.ts export namespace PromiseOnly { export interface Hooks { /** Called with [response object](#response) and a retry function. Calling the retry function will trigger `beforeRetry` hooks. Each function should return the response. This is especially useful when you want to refresh an access token. __Note__: When using streams, this hook is ignored. @example ``` const got = require('got'); const instance = got.extend({ hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { // Unauthorized const updatedOptions = { headers: { token: getNewToken() // Refresh the access token } }; // Save for further requests instance.defaults.options = got.mergeOptions(instance.defaults.options, updatedOptions); // Make a new retry return retryWithMergedOptions(updatedOptions); } // No changes otherwise return response; } ], beforeRetry: [ (options, error, retryCount) => { // This will be called on `retryWithMergedOptions(...)` } ] }, mutableDefaults: true }); ``` */ afterResponse?: AfterResponseHook[]; } export interface Options extends PaginationOptions { /** The parsing method. The promise also has `.text()`, `.json()` and `.buffer()` methods which return another Got promise for the parsed body. It's like setting the options to `{responseType: 'json', resolveBodyOnly: true}` but without affecting the main Got promise. __Note__: When using streams, this option is ignored. @example ``` (async () => { const responsePromise = got(url); const bufferPromise = responsePromise.buffer(); const jsonPromise = responsePromise.json(); const [response, buffer, json] = Promise.all([responsePromise, bufferPromise, jsonPromise]); // `response` is an instance of Got Response // `buffer` is an instance of Buffer // `json` is an object })(); ``` @example ``` // This const body = await got(url).json(); // is semantically the same as this const body = await got(url, {responseType: 'json', resolveBodyOnly: true}); ``` */ responseType?: ResponseType; /** When set to `true` the promise will return the Response body instead of the Response object. @default false */ resolveBodyOnly?: boolean; /** Returns a `Stream` instead of a `Promise`. This is equivalent to calling `got.stream(url, options?)`. @default false */ isStream?: boolean; /** [Encoding](https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings) to be used on `setEncoding` of the response data. To get a [`Buffer`](https://nodejs.org/api/buffer.html), you need to set `responseType` to `buffer` instead. Don't set this option to `null`. __Note__: This doesn't affect streams! Instead, you need to do `got.stream(...).setEncoding(encoding)`. @default 'utf-8' */ encoding?: BufferEncoding; } export interface NormalizedOptions { responseType: ResponseType; resolveBodyOnly: boolean; isStream: boolean; encoding?: BufferEncoding; pagination?: Required['pagination']>; } export interface Defaults { responseType: ResponseType; resolveBodyOnly: boolean; isStream: boolean; pagination?: Required['pagination']>; } export type HookEvent = 'afterResponse'; } /** An error to be thrown when server response code is 2xx, and parsing body fails. Includes a `response` property. */ export class ParseError extends RequestError { declare readonly response: Response; constructor(error: Error, response: Response) { const {options} = response.request; super(`${error.message} in "${options.url.toString()}"`, error, response.request); this.name = 'ParseError'; this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_BODY_PARSE_FAILURE' : this.code; } } /** An error to be thrown when the request is aborted with `.cancel()`. */ export class CancelError extends RequestError { declare readonly response: Response; constructor(request: Request) { super('Promise was canceled', {}, request); this.name = 'CancelError'; this.code = 'ERR_CANCELED'; } get isCanceled() { return true; } } export interface CancelableRequest extends PCancelable, RequestEvents> { json: () => CancelableRequest; buffer: () => CancelableRequest; text: () => CancelableRequest; } export * from '../core'; sindresorhus-got-11d2e83/source/core/000077500000000000000000000000001434406364000176165ustar00rootroot00000000000000sindresorhus-got-11d2e83/source/core/calculate-retry-delay.ts000066400000000000000000000020561434406364000243650ustar00rootroot00000000000000import {RetryFunction} from '.'; type Returns unknown, V> = (...args: Parameters) => V; export const retryAfterStatusCodes: ReadonlySet = new Set([413, 429, 503]); const calculateRetryDelay: Returns = ({attemptCount, retryOptions, error, retryAfter}) => { if (attemptCount > retryOptions.limit) { return 0; } const hasMethod = retryOptions.methods.includes(error.options.method); const hasErrorCode = retryOptions.errorCodes.includes(error.code); const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode); if (!hasMethod || (!hasErrorCode && !hasStatusCode)) { return 0; } if (error.response) { if (retryAfter) { if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) { return 0; } return retryAfter; } if (error.response.statusCode === 413) { return 0; } } const noise = Math.random() * 100; return ((2 ** (attemptCount - 1)) * 1000) + noise; }; export default calculateRetryDelay; sindresorhus-got-11d2e83/source/core/index.ts000066400000000000000000002466151434406364000213130ustar00rootroot00000000000000import {promisify} from 'util'; import {Duplex, Writable, Readable} from 'stream'; import {ReadStream} from 'fs'; import {URL, URLSearchParams} from 'url'; import {Socket} from 'net'; import {SecureContextOptions, DetailedPeerCertificate} from 'tls'; import http = require('http'); import {ClientRequest, RequestOptions, IncomingMessage, ServerResponse, request as httpRequest} from 'http'; import https = require('https'); import timer, {ClientRequestWithTimings, Timings, IncomingMessageWithTimings} from '@szmarczak/http-timer'; import CacheableLookup from 'cacheable-lookup'; import CacheableRequest = require('cacheable-request'); import decompressResponse = require('decompress-response'); // @ts-expect-error Missing types import http2wrapper = require('http2-wrapper'); import lowercaseKeys = require('lowercase-keys'); import ResponseLike = require('responselike'); import is, {assert} from '@sindresorhus/is'; import getBodySize from './utils/get-body-size'; import isFormData from './utils/is-form-data'; import proxyEvents from './utils/proxy-events'; import timedOut, {Delays, TimeoutError as TimedOutTimeoutError} from './utils/timed-out'; import urlToOptions from './utils/url-to-options'; import optionsToUrl, {URLOptions} from './utils/options-to-url'; import WeakableMap from './utils/weakable-map'; import getBuffer from './utils/get-buffer'; import {DnsLookupIpVersion, isDnsLookupIpVersion, dnsLookupIpVersionToFamily} from './utils/dns-ip-version'; import {isResponseOk} from './utils/is-response-ok'; import deprecationWarning from '../utils/deprecation-warning'; import normalizePromiseArguments from '../as-promise/normalize-arguments'; import {PromiseOnly} from '../as-promise/types'; import calculateRetryDelay from './calculate-retry-delay'; let globalDnsCache: CacheableLookup; type HttpRequestFunction = typeof httpRequest; type Error = NodeJS.ErrnoException; const kRequest = Symbol('request'); const kResponse = Symbol('response'); const kResponseSize = Symbol('responseSize'); const kDownloadedSize = Symbol('downloadedSize'); const kBodySize = Symbol('bodySize'); const kUploadedSize = Symbol('uploadedSize'); const kServerResponsesPiped = Symbol('serverResponsesPiped'); const kUnproxyEvents = Symbol('unproxyEvents'); const kIsFromCache = Symbol('isFromCache'); const kCancelTimeouts = Symbol('cancelTimeouts'); const kStartedReading = Symbol('startedReading'); const kStopReading = Symbol('stopReading'); const kTriggerRead = Symbol('triggerRead'); const kBody = Symbol('body'); const kJobs = Symbol('jobs'); const kOriginalResponse = Symbol('originalResponse'); const kRetryTimeout = Symbol('retryTimeout'); export const kIsNormalizedAlready = Symbol('isNormalizedAlready'); const supportsBrotli = is.string((process.versions as any).brotli); export interface Agents { http?: http.Agent; https?: https.Agent; http2?: unknown; } export const withoutBody: ReadonlySet = new Set(['GET', 'HEAD']); export interface ToughCookieJar { getCookieString: ((currentUrl: string, options: Record, cb: (err: Error | null, cookies: string) => void) => void) & ((url: string, callback: (error: Error | null, cookieHeader: string) => void) => void); setCookie: ((cookieOrString: unknown, currentUrl: string, options: Record, cb: (err: Error | null, cookie: unknown) => void) => void) & ((rawCookie: string, url: string, callback: (error: Error | null, result: unknown) => void) => void); } export interface PromiseCookieJar { getCookieString: (url: string) => Promise; setCookie: (rawCookie: string, url: string) => Promise; } /** All available HTTP request methods provided by Got. */ export type Method = | 'GET' | 'POST' | 'PUT' | 'PATCH' | 'HEAD' | 'DELETE' | 'OPTIONS' | 'TRACE' | 'get' | 'post' | 'put' | 'patch' | 'head' | 'delete' | 'options' | 'trace'; type Promisable = T | Promise; export type InitHook = (options: Options) => void; export type BeforeRequestHook = (options: NormalizedOptions) => Promisable; export type BeforeRedirectHook = (options: NormalizedOptions, response: Response) => Promisable; export type BeforeErrorHook = (error: RequestError) => Promisable; export type BeforeRetryHook = (options: NormalizedOptions, error?: RequestError, retryCount?: number) => void | Promise; interface PlainHooks { /** Called with plain request options, right before their normalization. This is especially useful in conjunction with `got.extend()` when the input needs custom handling. __Note #1__: This hook must be synchronous! __Note #2__: Errors in this hook will be converted into an instances of `RequestError`. __Note #3__: The options object may not have a `url` property. To modify it, use a `beforeRequest` hook instead. @default [] */ init?: InitHook[]; /** Called with normalized request options. Got will make no further changes to the request before it is sent. This is especially useful in conjunction with `got.extend()` when you want to create an API client that, for example, uses HMAC-signing. @default [] */ beforeRequest?: BeforeRequestHook[]; /** Called with normalized request options and the redirect response. Got will make no further changes to the request. This is especially useful when you want to avoid dead sites. @default [] @example ``` const got = require('got'); got('https://example.com', { hooks: { beforeRedirect: [ (options, response) => { if (options.hostname === 'deadSite') { options.hostname = 'fallbackSite'; } } ] } }); ``` */ beforeRedirect?: BeforeRedirectHook[]; /** Called with an `Error` instance. The error is passed to the hook right before it's thrown. This is especially useful when you want to have more detailed errors. __Note__: Errors thrown while normalizing input options are thrown directly and not part of this hook. @default [] @example ``` const got = require('got'); got('https://api.github.com/some-endpoint', { hooks: { beforeError: [ error => { const {response} = error; if (response && response.body) { error.name = 'GitHubError'; error.message = `${response.body.message} (${response.statusCode})`; } return error; } ] } }); ``` */ beforeError?: BeforeErrorHook[]; /** Called with normalized request options, the error and the retry count. Got will make no further changes to the request. This is especially useful when some extra work is required before the next try. __Note__: When using streams, this hook is ignored. __Note__: When retrying in a `afterResponse` hook, all remaining `beforeRetry` hooks will be called without the `error` and `retryCount` arguments. @default [] @example ``` const got = require('got'); got.post('https://example.com', { hooks: { beforeRetry: [ (options, error, retryCount) => { if (error.response.statusCode === 413) { // Payload too large options.body = getNewBody(); } } ] } }); ``` */ beforeRetry?: BeforeRetryHook[]; } /** All available hook of Got. */ export interface Hooks extends PromiseOnly.Hooks, PlainHooks {} type PlainHookEvent = 'init' | 'beforeRequest' | 'beforeRedirect' | 'beforeError' | 'beforeRetry'; /** All hook events acceptable by Got. */ export type HookEvent = PromiseOnly.HookEvent | PlainHookEvent; export const knownHookEvents: HookEvent[] = [ 'init', 'beforeRequest', 'beforeRedirect', 'beforeError', 'beforeRetry', // Promise-Only 'afterResponse' ]; type AcceptableResponse = IncomingMessageWithTimings | ResponseLike; type AcceptableRequestResult = AcceptableResponse | ClientRequest | Promise | undefined; export type RequestFunction = (url: URL, options: RequestOptions, callback?: (response: AcceptableResponse) => void) => AcceptableRequestResult; export type Headers = Record; type CacheableRequestFunction = ( options: string | URL | RequestOptions, cb?: (response: ServerResponse | ResponseLike) => void ) => CacheableRequest.Emitter; type CheckServerIdentityFunction = (hostname: string, certificate: DetailedPeerCertificate) => Error | void; export type ParseJsonFunction = (text: string) => unknown; export type StringifyJsonFunction = (object: unknown) => string; interface RealRequestOptions extends https.RequestOptions { checkServerIdentity: CheckServerIdentityFunction; } export interface RetryObject { attemptCount: number; retryOptions: RequiredRetryOptions; error: TimeoutError | RequestError; computedValue: number; retryAfter?: number; } export type RetryFunction = (retryObject: RetryObject) => number | Promise; /** An object representing `limit`, `calculateDelay`, `methods`, `statusCodes`, `maxRetryAfter` and `errorCodes` fields for maximum retry count, retry handler, allowed methods, allowed status codes, maximum [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) time and allowed error codes. Delays between retries counts with function `1000 * Math.pow(2, retry) + Math.random() * 100`, where `retry` is attempt number (starts from 1). The `calculateDelay` property is a `function` that receives an object with `attemptCount`, `retryOptions`, `error` and `computedValue` properties for current retry count, the retry options, error and default computed value. The function must return a delay in milliseconds (or a Promise resolving with it) (`0` return value cancels retry). By default, it retries *only* on the specified methods, status codes, and on these network errors: - `ETIMEDOUT`: One of the [timeout](#timeout) limits were reached. - `ECONNRESET`: Connection was forcibly closed by a peer. - `EADDRINUSE`: Could not bind to any free port. - `ECONNREFUSED`: Connection was refused by the server. - `EPIPE`: The remote side of the stream being written has been closed. - `ENOTFOUND`: Couldn't resolve the hostname to an IP address. - `ENETUNREACH`: No internet connection. - `EAI_AGAIN`: DNS lookup timed out. __Note__: If `maxRetryAfter` is set to `undefined`, it will use `options.timeout`. __Note__: If [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) header is greater than `maxRetryAfter`, it will cancel the request. */ export interface RequiredRetryOptions { limit: number; methods: Method[]; statusCodes: number[]; errorCodes: string[]; calculateDelay: RetryFunction; maxRetryAfter?: number; } export interface CacheOptions { shared?: boolean; cacheHeuristic?: number; immutableMinTimeToLive?: number; ignoreCargoCult?: boolean; } interface PlainOptions extends URLOptions { /** Custom request function. The main purpose of this is to [support HTTP2 using a wrapper](https://github.com/szmarczak/http2-wrapper). @default http.request | https.request */ request?: RequestFunction; /** An object representing `http`, `https` and `http2` keys for [`http.Agent`](https://nodejs.org/api/http.html#http_class_http_agent), [`https.Agent`](https://nodejs.org/api/https.html#https_class_https_agent) and [`http2wrapper.Agent`](https://github.com/szmarczak/http2-wrapper#new-http2agentoptions) instance. This is necessary because a request to one protocol might redirect to another. In such a scenario, Got will switch over to the right protocol agent for you. If a key is not present, it will default to a global agent. @example ``` const got = require('got'); const HttpAgent = require('agentkeepalive'); const {HttpsAgent} = HttpAgent; got('https://sindresorhus.com', { agent: { http: new HttpAgent(), https: new HttpsAgent() } }); ``` */ agent?: Agents | false; /** Decompress the response automatically. This will set the `accept-encoding` header to `gzip, deflate, br` on Node.js 11.7.0+ or `gzip, deflate` for older Node.js versions, unless you set it yourself. Brotli (`br`) support requires Node.js 11.7.0 or later. If this is disabled, a compressed response is returned as a `Buffer`. This may be useful if you want to handle decompression yourself or stream the raw compressed data. @default true */ decompress?: boolean; /** Milliseconds to wait for the server to end the response before aborting the request with `got.TimeoutError` error (a.k.a. `request` property). By default, there's no timeout. This also accepts an `object` with the following fields to constrain the duration of each phase of the request lifecycle: - `lookup` starts when a socket is assigned and ends when the hostname has been resolved. Does not apply when using a Unix domain socket. - `connect` starts when `lookup` completes (or when the socket is assigned if lookup does not apply to the request) and ends when the socket is connected. - `secureConnect` starts when `connect` completes and ends when the handshaking process completes (HTTPS only). - `socket` starts when the socket is connected. See [request.setTimeout](https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback). - `response` starts when the request has been written to the socket and ends when the response headers are received. - `send` starts when the socket is connected and ends with the request has been written to the socket. - `request` starts when the request is initiated and ends when the response's end event fires. */ timeout?: Delays | number; /** When specified, `prefixUrl` will be prepended to `url`. The prefix can be any valid URL, either relative or absolute. A trailing slash `/` is optional - one will be added automatically. __Note__: `prefixUrl` will be ignored if the `url` argument is a URL instance. __Note__: Leading slashes in `input` are disallowed when using this option to enforce consistency and avoid confusion. For example, when the prefix URL is `https://example.com/foo` and the input is `/bar`, there's ambiguity whether the resulting URL would become `https://example.com/foo/bar` or `https://example.com/bar`. The latter is used by browsers. __Tip__: Useful when used with `got.extend()` to create niche-specific Got instances. __Tip__: You can change `prefixUrl` using hooks as long as the URL still includes the `prefixUrl`. If the URL doesn't include it anymore, it will throw. @example ``` const got = require('got'); (async () => { await got('unicorn', {prefixUrl: 'https://cats.com'}); //=> 'https://cats.com/unicorn' const instance = got.extend({ prefixUrl: 'https://google.com' }); await instance('unicorn', { hooks: { beforeRequest: [ options => { options.prefixUrl = 'https://cats.com'; } ] } }); //=> 'https://cats.com/unicorn' })(); ``` */ prefixUrl?: string | URL; /** __Note #1__: The `body` option cannot be used with the `json` or `form` option. __Note #2__: If you provide this option, `got.stream()` will be read-only. __Note #3__: If you provide a payload with the `GET` or `HEAD` method, it will throw a `TypeError` unless the method is `GET` and the `allowGetBody` option is set to `true`. __Note #4__: This option is not enumerable and will not be merged with the instance defaults. The `content-length` header will be automatically set if `body` is a `string` / `Buffer` / `fs.createReadStream` instance / [`form-data` instance](https://github.com/form-data/form-data), and `content-length` and `transfer-encoding` are not manually set in `options.headers`. */ body?: string | Buffer | Readable; /** The form body is converted to a query string using [`(new URLSearchParams(object)).toString()`](https://nodejs.org/api/url.html#url_constructor_new_urlsearchparams_obj). If the `Content-Type` header is not present, it will be set to `application/x-www-form-urlencoded`. __Note #1__: If you provide this option, `got.stream()` will be read-only. __Note #2__: This option is not enumerable and will not be merged with the instance defaults. */ form?: Record; /** JSON body. If the `Content-Type` header is not set, it will be set to `application/json`. __Note #1__: If you provide this option, `got.stream()` will be read-only. __Note #2__: This option is not enumerable and will not be merged with the instance defaults. */ json?: Record; /** The URL to request, as a string, a [`https.request` options object](https://nodejs.org/api/https.html#https_https_request_options_callback), or a [WHATWG `URL`](https://nodejs.org/api/url.html#url_class_url). Properties from `options` will override properties in the parsed `url`. If no protocol is specified, it will throw a `TypeError`. __Note__: The query string is **not** parsed as search params. @example ``` got('https://example.com/?query=a b'); //=> https://example.com/?query=a%20b got('https://example.com/', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b // The query string is overridden by `searchParams` got('https://example.com/?query=a b', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b ``` */ url?: string | URL; /** Cookie support. You don't have to care about parsing or how to store them. __Note__: If you provide this option, `options.headers.cookie` will be overridden. */ cookieJar?: PromiseCookieJar | ToughCookieJar; /** Ignore invalid cookies instead of throwing an error. Only useful when the `cookieJar` option has been set. Not recommended. @default false */ ignoreInvalidCookies?: boolean; /** Query string that will be added to the request URL. This will override the query string in `url`. If you need to pass in an array, you can do it using a `URLSearchParams` instance. @example ``` const got = require('got'); const searchParams = new URLSearchParams([['key', 'a'], ['key', 'b']]); got('https://example.com', {searchParams}); console.log(searchParams.toString()); //=> 'key=a&key=b' ``` */ searchParams?: string | Record | URLSearchParams; /** An instance of [`CacheableLookup`](https://github.com/szmarczak/cacheable-lookup) used for making DNS lookups. Useful when making lots of requests to different *public* hostnames. `CacheableLookup` uses `dns.resolver4(..)` and `dns.resolver6(...)` under the hood and fall backs to `dns.lookup(...)` when the first two fail, which may lead to additional delay. __Note__: This should stay disabled when making requests to internal hostnames such as `localhost`, `database.local` etc. @default false */ dnsCache?: CacheableLookup | boolean; /** User data. In contrast to other options, `context` is not enumerable. __Note__: The object is never merged, it's just passed through. Got will not modify the object in any way. @example ``` const got = require('got'); const instance = got.extend({ hooks: { beforeRequest: [ options => { if (!options.context || !options.context.token) { throw new Error('Token required'); } options.headers.token = options.context.token; } ] } }); (async () => { const context = { token: 'secret' }; const response = await instance('https://httpbin.org/headers', {context}); // Let's see the headers console.log(response.body); })(); ``` */ context?: Record; /** Hooks allow modifications during the request lifecycle. Hook functions may be async and are run serially. */ hooks?: Hooks; /** Defines if redirect responses should be followed automatically. Note that if a `303` is sent by the server in response to any request type (`POST`, `DELETE`, etc.), Got will automatically request the resource pointed to in the location header via `GET`. This is in accordance with [the spec](https://tools.ietf.org/html/rfc7231#section-6.4.4). @default true */ followRedirect?: boolean; /** If exceeded, the request will be aborted and a `MaxRedirectsError` will be thrown. @default 10 */ maxRedirects?: number; /** A cache adapter instance for storing cached response data. @default false */ cache?: string | CacheableRequest.StorageAdapter | false; /** Determines if a `got.HTTPError` is thrown for unsuccessful responses. If this is disabled, requests that encounter an error status code will be resolved with the `response` instead of throwing. This may be useful if you are checking for resource availability and are expecting error responses. @default true */ throwHttpErrors?: boolean; username?: string; password?: string; /** If set to `true`, Got will additionally accept HTTP2 requests. It will choose either HTTP/1.1 or HTTP/2 depending on the ALPN protocol. __Note__: Overriding `options.request` will disable HTTP2 support. __Note__: This option will default to `true` in the next upcoming major release. @default false @example ``` const got = require('got'); (async () => { const {headers} = await got('https://nghttp2.org/httpbin/anything', {http2: true}); console.log(headers.via); //=> '2 nghttpx' })(); ``` */ http2?: boolean; /** Set this to `true` to allow sending body for the `GET` method. However, the [HTTP/2 specification](https://tools.ietf.org/html/rfc7540#section-8.1.3) says that `An HTTP GET request includes request header fields and no payload body`, therefore when using the HTTP/2 protocol this option will have no effect. This option is only meant to interact with non-compliant servers when you have no other choice. __Note__: The [RFC 7321](https://tools.ietf.org/html/rfc7231#section-4.3.1) doesn't specify any particular behavior for the GET method having a payload, therefore __it's considered an [anti-pattern](https://en.wikipedia.org/wiki/Anti-pattern)__. @default false */ allowGetBody?: boolean; lookup?: CacheableLookup['lookup']; /** Request headers. Existing headers will be overwritten. Headers set to `undefined` will be omitted. @default {} */ headers?: Headers; /** By default, redirects will use [method rewriting](https://tools.ietf.org/html/rfc7231#section-6.4). For example, when sending a POST request and receiving a `302`, it will resend the body to the new location using the same HTTP method (`POST` in this case). @default true */ methodRewriting?: boolean; /** Indicates which DNS record family to use. Values: - `auto`: IPv4 (if present) or IPv6 - `ipv4`: Only IPv4 - `ipv6`: Only IPv6 __Note__: If you are using the undocumented option `family`, `dnsLookupIpVersion` will override it. @default 'auto' */ dnsLookupIpVersion?: DnsLookupIpVersion; /** A function used to parse JSON responses. @example ``` const got = require('got'); const Bourne = require('@hapi/bourne'); (async () => { const parsed = await got('https://example.com', { parseJson: text => Bourne.parse(text) }).json(); console.log(parsed); })(); ``` */ parseJson?: ParseJsonFunction; /** A function used to stringify the body of JSON requests. @example ``` const got = require('got'); (async () => { await got.post('https://example.com', { stringifyJson: object => JSON.stringify(object, (key, value) => { if (key.startsWith('_')) { return; } return value; }), json: { some: 'payload', _ignoreMe: 1234 } }); })(); ``` @example ``` const got = require('got'); (async () => { await got.post('https://example.com', { stringifyJson: object => JSON.stringify(object, (key, value) => { if (typeof value === 'number') { return value.toString(); } return value; }), json: { some: 'payload', number: 1 } }); })(); ``` */ stringifyJson?: StringifyJsonFunction; /** An object representing `limit`, `calculateDelay`, `methods`, `statusCodes`, `maxRetryAfter` and `errorCodes` fields for maximum retry count, retry handler, allowed methods, allowed status codes, maximum [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) time and allowed error codes. Delays between retries counts with function `1000 * Math.pow(2, retry) + Math.random() * 100`, where `retry` is attempt number (starts from 1). The `calculateDelay` property is a `function` that receives an object with `attemptCount`, `retryOptions`, `error` and `computedValue` properties for current retry count, the retry options, error and default computed value. The function must return a delay in milliseconds (or a Promise resolving with it) (`0` return value cancels retry). By default, it retries *only* on the specified methods, status codes, and on these network errors: - `ETIMEDOUT`: One of the [timeout](#timeout) limits were reached. - `ECONNRESET`: Connection was forcibly closed by a peer. - `EADDRINUSE`: Could not bind to any free port. - `ECONNREFUSED`: Connection was refused by the server. - `EPIPE`: The remote side of the stream being written has been closed. - `ENOTFOUND`: Couldn't resolve the hostname to an IP address. - `ENETUNREACH`: No internet connection. - `EAI_AGAIN`: DNS lookup timed out. __Note__: If `maxRetryAfter` is set to `undefined`, it will use `options.timeout`. __Note__: If [`Retry-After`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After) header is greater than `maxRetryAfter`, it will cancel the request. */ retry?: Partial | number; // From `http.RequestOptions` /** The IP address used to send the request from. */ localAddress?: string; socketPath?: string; /** The HTTP method used to make the request. @default 'GET' */ method?: Method; createConnection?: (options: http.RequestOptions, oncreate: (error: Error, socket: Socket) => void) => Socket; // From `http-cache-semantics` cacheOptions?: CacheOptions; // TODO: remove when Got 12 gets released /** If set to `false`, all invalid SSL certificates will be ignored and no error will be thrown. If set to `true`, it will throw an error whenever an invalid SSL certificate is detected. We strongly recommend to have this set to `true` for security reasons. @default true @example ``` const got = require('got'); (async () => { // Correct: await got('https://example.com', {rejectUnauthorized: true}); // You can disable it when developing an HTTPS app: await got('https://localhost', {rejectUnauthorized: false}); // Never do this: await got('https://example.com', {rejectUnauthorized: false}); })(); ``` */ rejectUnauthorized?: boolean; // Here for backwards compatibility /** Options for the advanced HTTPS API. */ https?: HTTPSOptions; } export interface Options extends PromiseOnly.Options, PlainOptions {} export interface HTTPSOptions { // From `http.RequestOptions` and `tls.CommonConnectionOptions` rejectUnauthorized?: https.RequestOptions['rejectUnauthorized']; // From `tls.ConnectionOptions` checkServerIdentity?: CheckServerIdentityFunction; // From `tls.SecureContextOptions` /** Override the default Certificate Authorities ([from Mozilla](https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReport)). @example ``` // Single Certificate Authority got('https://example.com', { https: { certificateAuthority: fs.readFileSync('./my_ca.pem') } }); ``` */ certificateAuthority?: SecureContextOptions['ca']; /** Private keys in [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) format. [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) allows the option of private keys being encrypted. Encrypted keys will be decrypted with `options.https.passphrase`. Multiple keys with different passphrases can be provided as an array of `{pem: , passphrase: }` */ key?: SecureContextOptions['key']; /** [Certificate chains](https://en.wikipedia.org/wiki/X.509#Certificate_chains_and_cross-certification) in [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) format. One cert chain should be provided per private key (`options.https.key`). When providing multiple cert chains, they do not have to be in the same order as their private keys in `options.https.key`. If the intermediate certificates are not provided, the peer will not be able to validate the certificate, and the handshake will fail. */ certificate?: SecureContextOptions['cert']; /** The passphrase to decrypt the `options.https.key` (if different keys have different passphrases refer to `options.https.key` documentation). */ passphrase?: SecureContextOptions['passphrase']; pfx?: SecureContextOptions['pfx']; } interface NormalizedPlainOptions extends PlainOptions { method: Method; url: URL; timeout: Delays; prefixUrl: string; ignoreInvalidCookies: boolean; decompress: boolean; searchParams?: URLSearchParams; cookieJar?: PromiseCookieJar; headers: Headers; context: Record; hooks: Required; followRedirect: boolean; maxRedirects: number; cache?: string | CacheableRequest.StorageAdapter; throwHttpErrors: boolean; dnsCache?: CacheableLookup; http2: boolean; allowGetBody: boolean; rejectUnauthorized: boolean; lookup?: CacheableLookup['lookup']; methodRewriting: boolean; username: string; password: string; parseJson: ParseJsonFunction; stringifyJson: StringifyJsonFunction; retry: RequiredRetryOptions; cacheOptions: CacheOptions; [kRequest]: HttpRequestFunction; [kIsNormalizedAlready]?: boolean; } export interface NormalizedOptions extends PromiseOnly.NormalizedOptions, NormalizedPlainOptions {} interface PlainDefaults { timeout: Delays; prefixUrl: string; method: Method; ignoreInvalidCookies: boolean; decompress: boolean; context: Record; cookieJar?: PromiseCookieJar | ToughCookieJar; dnsCache?: CacheableLookup; headers: Headers; hooks: Required; followRedirect: boolean; maxRedirects: number; cache?: string | CacheableRequest.StorageAdapter; throwHttpErrors: boolean; http2: boolean; allowGetBody: boolean; https?: HTTPSOptions; methodRewriting: boolean; parseJson: ParseJsonFunction; stringifyJson: StringifyJsonFunction; retry: RequiredRetryOptions; // Optional agent?: Agents | false; request?: RequestFunction; searchParams?: URLSearchParams; lookup?: CacheableLookup['lookup']; localAddress?: string; createConnection?: Options['createConnection']; // From `http-cache-semantics` cacheOptions: CacheOptions; } export interface Defaults extends PromiseOnly.Defaults, PlainDefaults {} export interface Progress { percent: number; transferred: number; total?: number; } export interface PlainResponse extends IncomingMessageWithTimings { /** The original request URL. */ requestUrl: string; /** The redirect URLs. */ redirectUrls: string[]; /** - `options` - The Got options that were set on this request. __Note__: This is not a [http.ClientRequest](https://nodejs.org/api/http.html#http_class_http_clientrequest). */ request: Request; /** The remote IP address. This is hopefully a temporary limitation, see [lukechilds/cacheable-request#86](https://github.com/lukechilds/cacheable-request/issues/86). __Note__: Not available when the response is cached. */ ip?: string; /** Whether the response was retrieved from the cache. */ isFromCache: boolean; /** The status code of the response. */ statusCode: number; /** The request URL or the final URL after redirects. */ url: string; /** The object contains the following properties: - `start` - Time when the request started. - `socket` - Time when a socket was assigned to the request. - `lookup` - Time when the DNS lookup finished. - `connect` - Time when the socket successfully connected. - `secureConnect` - Time when the socket securely connected. - `upload` - Time when the request finished uploading. - `response` - Time when the request fired `response` event. - `end` - Time when the response fired `end` event. - `error` - Time when the request fired `error` event. - `abort` - Time when the request fired `abort` event. - `phases` - `wait` - `timings.socket - timings.start` - `dns` - `timings.lookup - timings.socket` - `tcp` - `timings.connect - timings.lookup` - `tls` - `timings.secureConnect - timings.connect` - `request` - `timings.upload - (timings.secureConnect || timings.connect)` - `firstByte` - `timings.response - timings.upload` - `download` - `timings.end - timings.response` - `total` - `(timings.end || timings.error || timings.abort) - timings.start` If something has not been measured yet, it will be `undefined`. __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch. */ timings: Timings; /** The number of times the request was retried. */ retryCount: number; // Defined only if request errored /** The raw result of the request. */ rawBody?: Buffer; /** The result of the request. */ body?: unknown; } // For Promise support export interface Response extends PlainResponse { /** The result of the request. */ body: T; /** The raw result of the request. */ rawBody: Buffer; } export interface RequestEvents { /** `request` event to get the request object of the request. __Tip__: You can use `request` event to abort requests. @example ``` got.stream('https://github.com') .on('request', request => setTimeout(() => request.destroy(), 50)); ``` */ on: ((name: 'request', listener: (request: http.ClientRequest) => void) => T) /** The `response` event to get the response object of the final request. */ & ((name: 'response', listener: (response: R) => void) => T) /** The `redirect` event to get the response object of a redirect. The second argument is options for the next request to the redirect location. */ & ((name: 'redirect', listener: (response: R, nextOptions: N) => void) => T) /** Progress events for uploading (sending a request) and downloading (receiving a response). The `progress` argument is an object like: ```js { percent: 0.1, transferred: 1024, total: 10240 } ``` If the `content-length` header is missing, `total` will be `undefined`. @example ```js (async () => { const response = await got('https://sindresorhus.com') .on('downloadProgress', progress => { // Report download progress }) .on('uploadProgress', progress => { // Report upload progress }); console.log(response); })(); ``` */ & ((name: 'uploadProgress' | 'downloadProgress', listener: (progress: Progress) => void) => T) /** To enable retrying on a Got stream, it is required to have a `retry` handler attached. When this event is emitted, you should reset the stream you were writing to and prepare the body again. See `got.options.retry` for more information. */ & ((name: 'retry', listener: (retryCount: number, error: RequestError) => void) => T); } function validateSearchParameters(searchParameters: Record): asserts searchParameters is Record { // eslint-disable-next-line guard-for-in for (const key in searchParameters) { const value = searchParameters[key]; if (!is.string(value) && !is.number(value) && !is.boolean(value) && !is.null_(value) && !is.undefined(value)) { throw new TypeError(`The \`searchParams\` value '${String(value)}' must be a string, number, boolean or null`); } } } function isClientRequest(clientRequest: unknown): clientRequest is ClientRequest { return is.object(clientRequest) && !('statusCode' in clientRequest); } const cacheableStore = new WeakableMap(); const waitForOpenFile = async (file: ReadStream): Promise => new Promise((resolve, reject) => { const onError = (error: Error): void => { reject(error); }; // Node.js 12 has incomplete types if (!(file as any).pending) { resolve(); } file.once('error', onError); file.once('ready', () => { file.off('error', onError); resolve(); }); }); const redirectCodes: ReadonlySet = new Set([300, 301, 302, 303, 304, 307, 308]); type NonEnumerableProperty = 'context' | 'body' | 'json' | 'form'; const nonEnumerableProperties: NonEnumerableProperty[] = [ 'context', 'body', 'json', 'form' ]; export const setNonEnumerableProperties = (sources: Array, to: Options): void => { // Non enumerable properties shall not be merged const properties: Partial<{[Key in NonEnumerableProperty]: any}> = {}; for (const source of sources) { if (!source) { continue; } for (const name of nonEnumerableProperties) { if (!(name in source)) { continue; } properties[name] = { writable: true, configurable: true, enumerable: false, // @ts-expect-error TS doesn't see the check above value: source[name] }; } } Object.defineProperties(to, properties); }; /** An error to be thrown when a request fails. Contains a `code` property with error class code, like `ECONNREFUSED`. */ export class RequestError extends Error { code: string; stack!: string; declare readonly options: NormalizedOptions; readonly response?: Response; readonly request?: Request; readonly timings?: Timings; constructor(message: string, error: Partial, self: Request | NormalizedOptions) { super(message); Error.captureStackTrace(this, this.constructor); this.name = 'RequestError'; this.code = error.code ?? 'ERR_GOT_REQUEST_ERROR'; if (self instanceof Request) { Object.defineProperty(this, 'request', { enumerable: false, value: self }); Object.defineProperty(this, 'response', { enumerable: false, value: self[kResponse] }); Object.defineProperty(this, 'options', { // This fails because of TS 3.7.2 useDefineForClassFields // Ref: https://github.com/microsoft/TypeScript/issues/34972 enumerable: false, value: self.options }); } else { Object.defineProperty(this, 'options', { // This fails because of TS 3.7.2 useDefineForClassFields // Ref: https://github.com/microsoft/TypeScript/issues/34972 enumerable: false, value: self }); } this.timings = this.request?.timings; // Recover the original stacktrace if (is.string(error.stack) && is.string(this.stack)) { const indexOfMessage = this.stack.indexOf(this.message) + this.message.length; const thisStackTrace = this.stack.slice(indexOfMessage).split('\n').reverse(); const errorStackTrace = error.stack.slice(error.stack.indexOf(error.message!) + error.message!.length).split('\n').reverse(); // Remove duplicated traces while (errorStackTrace.length !== 0 && errorStackTrace[0] === thisStackTrace[0]) { thisStackTrace.shift(); } this.stack = `${this.stack.slice(0, indexOfMessage)}${thisStackTrace.reverse().join('\n')}${errorStackTrace.reverse().join('\n')}`; } } } /** An error to be thrown when the server redirects you more than ten times. Includes a `response` property. */ export class MaxRedirectsError extends RequestError { declare readonly response: Response; declare readonly request: Request; declare readonly timings: Timings; constructor(request: Request) { super(`Redirected ${request.options.maxRedirects} times. Aborting.`, {}, request); this.name = 'MaxRedirectsError'; this.code = 'ERR_TOO_MANY_REDIRECTS'; } } /** An error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304. Includes a `response` property. */ export class HTTPError extends RequestError { declare readonly response: Response; declare readonly request: Request; declare readonly timings: Timings; constructor(response: Response) { super(`Response code ${response.statusCode} (${response.statusMessage!})`, {}, response.request); this.name = 'HTTPError'; this.code = 'ERR_NON_2XX_3XX_RESPONSE'; } } /** An error to be thrown when a cache method fails. For example, if the database goes down or there's a filesystem error. */ export class CacheError extends RequestError { declare readonly request: Request; constructor(error: Error, request: Request) { super(error.message, error, request); this.name = 'CacheError'; this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_CACHE_ACCESS' : this.code; } } /** An error to be thrown when the request body is a stream and an error occurs while reading from that stream. */ export class UploadError extends RequestError { declare readonly request: Request; constructor(error: Error, request: Request) { super(error.message, error, request); this.name = 'UploadError'; this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_UPLOAD' : this.code; } } /** An error to be thrown when the request is aborted due to a timeout. Includes an `event` and `timings` property. */ export class TimeoutError extends RequestError { declare readonly request: Request; readonly timings: Timings; readonly event: string; constructor(error: TimedOutTimeoutError, timings: Timings, request: Request) { super(error.message, error, request); this.name = 'TimeoutError'; this.event = error.event; this.timings = timings; } } /** An error to be thrown when reading from response stream fails. */ export class ReadError extends RequestError { declare readonly request: Request; declare readonly response: Response; declare readonly timings: Timings; constructor(error: Error, request: Request) { super(error.message, error, request); this.name = 'ReadError'; this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_READING_RESPONSE_STREAM' : this.code; } } /** An error to be thrown when given an unsupported protocol. */ export class UnsupportedProtocolError extends RequestError { constructor(options: NormalizedOptions) { super(`Unsupported protocol "${options.url.protocol}"`, {}, options); this.name = 'UnsupportedProtocolError'; this.code = 'ERR_UNSUPPORTED_PROTOCOL'; } } const proxiedRequestEvents = [ 'socket', 'connect', 'continue', 'information', 'upgrade', 'timeout' ]; export default class Request extends Duplex implements RequestEvents { ['constructor']: typeof Request; declare [kUnproxyEvents]: () => void; declare _cannotHaveBody: boolean; [kDownloadedSize]: number; [kUploadedSize]: number; [kStopReading]: boolean; [kTriggerRead]: boolean; [kBody]: Options['body']; [kJobs]: Array<() => void>; [kRetryTimeout]?: NodeJS.Timeout; [kBodySize]?: number; [kServerResponsesPiped]: Set; [kIsFromCache]?: boolean; [kStartedReading]?: boolean; [kCancelTimeouts]?: () => void; [kResponseSize]?: number; [kResponse]?: IncomingMessageWithTimings; [kOriginalResponse]?: IncomingMessageWithTimings; [kRequest]?: ClientRequest; _noPipe?: boolean; _progressCallbacks: Array<() => void>; declare options: NormalizedOptions; declare requestUrl: string; requestInitialized: boolean; redirects: string[]; retryCount: number; constructor(url: string | URL | undefined, options: Options = {}, defaults?: Defaults) { super({ // This must be false, to enable throwing after destroy // It is used for retry logic in Promise API autoDestroy: false, // It needs to be zero because we're just proxying the data to another stream highWaterMark: 0 }); this[kDownloadedSize] = 0; this[kUploadedSize] = 0; this.requestInitialized = false; this[kServerResponsesPiped] = new Set(); this.redirects = []; this[kStopReading] = false; this[kTriggerRead] = false; this[kJobs] = []; this.retryCount = 0; // TODO: Remove this when targeting Node.js >= 12 this._progressCallbacks = []; const unlockWrite = (): void => this._unlockWrite(); const lockWrite = (): void => this._lockWrite(); this.on('pipe', (source: Writable) => { source.prependListener('data', unlockWrite); source.on('data', lockWrite); source.prependListener('end', unlockWrite); source.on('end', lockWrite); }); this.on('unpipe', (source: Writable) => { source.off('data', unlockWrite); source.off('data', lockWrite); source.off('end', unlockWrite); source.off('end', lockWrite); }); this.on('pipe', source => { if (source instanceof IncomingMessage) { this.options.headers = { ...source.headers, ...this.options.headers }; } }); const {json, body, form} = options; if (json || body || form) { this._lockWrite(); } if (kIsNormalizedAlready in options) { this.options = options as NormalizedOptions; } else { try { // @ts-expect-error Common TypeScript bug saying that `this.constructor` is not accessible this.options = this.constructor.normalizeArguments(url, options, defaults); } catch (error) { // TODO: Move this to `_destroy()` if (is.nodeStream(options.body)) { options.body.destroy(); } this.destroy(error); return; } } (async () => { try { if (this.options.body instanceof ReadStream) { await waitForOpenFile(this.options.body); } const {url: normalizedURL} = this.options; if (!normalizedURL) { throw new TypeError('Missing `url` property'); } this.requestUrl = normalizedURL.toString(); decodeURI(this.requestUrl); await this._finalizeBody(); await this._makeRequest(); if (this.destroyed) { this[kRequest]?.destroy(); return; } // Queued writes etc. for (const job of this[kJobs]) { job(); } // Prevent memory leak this[kJobs].length = 0; this.requestInitialized = true; } catch (error) { if (error instanceof RequestError) { this._beforeError(error); return; } // This is a workaround for https://github.com/nodejs/node/issues/33335 if (!this.destroyed) { this.destroy(error); } } })(); } static normalizeArguments(url?: string | URL, options?: Options, defaults?: Defaults): NormalizedOptions { const rawOptions = options; if (is.object(url) && !is.urlInstance(url)) { options = {...defaults, ...(url as Options), ...options}; } else { if (url && options && options.url !== undefined) { throw new TypeError('The `url` option is mutually exclusive with the `input` argument'); } options = {...defaults, ...options}; if (url !== undefined) { options.url = url; } if (is.urlInstance(options.url)) { options.url = new URL(options.url.toString()); } } // TODO: Deprecate URL options in Got 12. // Support extend-specific options if (options.cache === false) { options.cache = undefined; } if (options.dnsCache === false) { options.dnsCache = undefined; } // Nice type assertions assert.any([is.string, is.undefined], options.method); assert.any([is.object, is.undefined], options.headers); assert.any([is.string, is.urlInstance, is.undefined], options.prefixUrl); assert.any([is.object, is.undefined], options.cookieJar); assert.any([is.object, is.string, is.undefined], options.searchParams); assert.any([is.object, is.string, is.undefined], options.cache); assert.any([is.object, is.number, is.undefined], options.timeout); assert.any([is.object, is.undefined], options.context); assert.any([is.object, is.undefined], options.hooks); assert.any([is.boolean, is.undefined], options.decompress); assert.any([is.boolean, is.undefined], options.ignoreInvalidCookies); assert.any([is.boolean, is.undefined], options.followRedirect); assert.any([is.number, is.undefined], options.maxRedirects); assert.any([is.boolean, is.undefined], options.throwHttpErrors); assert.any([is.boolean, is.undefined], options.http2); assert.any([is.boolean, is.undefined], options.allowGetBody); assert.any([is.string, is.undefined], options.localAddress); assert.any([isDnsLookupIpVersion, is.undefined], options.dnsLookupIpVersion); assert.any([is.object, is.undefined], options.https); assert.any([is.boolean, is.undefined], options.rejectUnauthorized); if (options.https) { assert.any([is.boolean, is.undefined], options.https.rejectUnauthorized); assert.any([is.function_, is.undefined], options.https.checkServerIdentity); assert.any([is.string, is.object, is.array, is.undefined], options.https.certificateAuthority); assert.any([is.string, is.object, is.array, is.undefined], options.https.key); assert.any([is.string, is.object, is.array, is.undefined], options.https.certificate); assert.any([is.string, is.undefined], options.https.passphrase); assert.any([is.string, is.buffer, is.array, is.undefined], options.https.pfx); } assert.any([is.object, is.undefined], options.cacheOptions); // `options.method` if (is.string(options.method)) { options.method = options.method.toUpperCase() as Method; } else { options.method = 'GET'; } // `options.headers` if (options.headers === defaults?.headers) { options.headers = {...options.headers}; } else { options.headers = lowercaseKeys({...(defaults?.headers), ...options.headers}); } // Disallow legacy `url.Url` if ('slashes' in options) { throw new TypeError('The legacy `url.Url` has been deprecated. Use `URL` instead.'); } // `options.auth` if ('auth' in options) { throw new TypeError('Parameter `auth` is deprecated. Use `username` / `password` instead.'); } // `options.searchParams` if ('searchParams' in options) { if (options.searchParams && options.searchParams !== defaults?.searchParams) { let searchParameters: URLSearchParams; if (is.string(options.searchParams) || (options.searchParams instanceof URLSearchParams)) { searchParameters = new URLSearchParams(options.searchParams); } else { validateSearchParameters(options.searchParams); searchParameters = new URLSearchParams(); // eslint-disable-next-line guard-for-in for (const key in options.searchParams) { const value = options.searchParams[key]; if (value === null) { searchParameters.append(key, ''); } else if (value !== undefined) { searchParameters.append(key, value as string); } } } // `normalizeArguments()` is also used to merge options defaults?.searchParams?.forEach((value, key) => { // Only use default if one isn't already defined if (!searchParameters.has(key)) { searchParameters.append(key, value); } }); options.searchParams = searchParameters; } } // `options.username` & `options.password` options.username = options.username ?? ''; options.password = options.password ?? ''; // `options.prefixUrl` & `options.url` if (is.undefined(options.prefixUrl)) { options.prefixUrl = defaults?.prefixUrl ?? ''; } else { options.prefixUrl = options.prefixUrl.toString(); if (options.prefixUrl !== '' && !options.prefixUrl.endsWith('/')) { options.prefixUrl += '/'; } } if (is.string(options.url)) { if (options.url.startsWith('/')) { throw new Error('`input` must not start with a slash when using `prefixUrl`'); } options.url = optionsToUrl(options.prefixUrl + options.url, options as Options & {searchParams?: URLSearchParams}); } else if ((is.undefined(options.url) && options.prefixUrl !== '') || options.protocol) { options.url = optionsToUrl(options.prefixUrl, options as Options & {searchParams?: URLSearchParams}); } if (options.url) { if ('port' in options) { delete options.port; } // Make it possible to change `options.prefixUrl` let {prefixUrl} = options; Object.defineProperty(options, 'prefixUrl', { set: (value: string) => { const url = options!.url as URL; if (!url.href.startsWith(value)) { throw new Error(`Cannot change \`prefixUrl\` from ${prefixUrl} to ${value}: ${url.href}`); } options!.url = new URL(value + url.href.slice(prefixUrl.length)); prefixUrl = value; }, get: () => prefixUrl }); // Support UNIX sockets let {protocol} = options.url; if (protocol === 'unix:') { protocol = 'http:'; options.url = new URL(`http://unix${options.url.pathname}${options.url.search}`); } // Set search params if (options.searchParams) { // eslint-disable-next-line @typescript-eslint/no-base-to-string options.url.search = options.searchParams.toString(); } // Protocol check if (protocol !== 'http:' && protocol !== 'https:') { throw new UnsupportedProtocolError(options as NormalizedOptions); } // Update `username` if (options.username === '') { options.username = options.url.username; } else { options.url.username = options.username; } // Update `password` if (options.password === '') { options.password = options.url.password; } else { options.url.password = options.password; } } // `options.cookieJar` const {cookieJar} = options; if (cookieJar) { let {setCookie, getCookieString} = cookieJar; assert.function_(setCookie); assert.function_(getCookieString); /* istanbul ignore next: Horrible `tough-cookie` v3 check */ if (setCookie.length === 4 && getCookieString.length === 0) { setCookie = promisify(setCookie.bind(options.cookieJar)); getCookieString = promisify(getCookieString.bind(options.cookieJar)); options.cookieJar = { setCookie, getCookieString: getCookieString as PromiseCookieJar['getCookieString'] }; } } // `options.cache` const {cache} = options; if (cache) { if (!cacheableStore.has(cache)) { cacheableStore.set(cache, new CacheableRequest( ((requestOptions: RequestOptions, handler?: (response: IncomingMessageWithTimings) => void): ClientRequest => { const result = (requestOptions as Pick)[kRequest](requestOptions, handler); // TODO: remove this when `cacheable-request` supports async request functions. if (is.promise(result)) { // @ts-expect-error // We only need to implement the error handler in order to support HTTP2 caching. // The result will be a promise anyway. result.once = (event: string, handler: (reason: unknown) => void) => { if (event === 'error') { result.catch(handler); } else if (event === 'abort') { // The empty catch is needed here in case when // it rejects before it's `await`ed in `_makeRequest`. (async () => { try { const request = (await result) as ClientRequest; request.once('abort', handler); } catch {} })(); } else { /* istanbul ignore next: safety check */ throw new Error(`Unknown HTTP2 promise event: ${event}`); } return result; }; } return result; }) as HttpRequestFunction, cache as CacheableRequest.StorageAdapter )); } } // `options.cacheOptions` options.cacheOptions = {...options.cacheOptions}; // `options.dnsCache` if (options.dnsCache === true) { if (!globalDnsCache) { globalDnsCache = new CacheableLookup(); } options.dnsCache = globalDnsCache; } else if (!is.undefined(options.dnsCache) && !options.dnsCache.lookup) { throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${is(options.dnsCache)}`); } // `options.timeout` if (is.number(options.timeout)) { options.timeout = {request: options.timeout}; } else if (defaults && options.timeout !== defaults.timeout) { options.timeout = { ...defaults.timeout, ...options.timeout }; } else { options.timeout = {...options.timeout}; } // `options.context` if (!options.context) { options.context = {}; } // `options.hooks` const areHooksDefault = options.hooks === defaults?.hooks; options.hooks = {...options.hooks}; for (const event of knownHookEvents) { if (event in options.hooks) { if (is.array(options.hooks[event])) { // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044 (options.hooks as any)[event] = [...options.hooks[event]!]; } else { throw new TypeError(`Parameter \`${event}\` must be an Array, got ${is(options.hooks[event])}`); } } else { options.hooks[event] = []; } } if (defaults && !areHooksDefault) { for (const event of knownHookEvents) { const defaultHooks = defaults.hooks[event]; if (defaultHooks.length > 0) { // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044 (options.hooks as any)[event] = [ ...defaults.hooks[event], ...options.hooks[event]! ]; } } } // DNS options if ('family' in options) { deprecationWarning('"options.family" was never documented, please use "options.dnsLookupIpVersion"'); } // HTTPS options if (defaults?.https) { options.https = {...defaults.https, ...options.https}; } if ('rejectUnauthorized' in options) { deprecationWarning('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'); } if ('checkServerIdentity' in options) { deprecationWarning('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'); } if ('ca' in options) { deprecationWarning('"options.ca" was never documented, please use "options.https.certificateAuthority"'); } if ('key' in options) { deprecationWarning('"options.key" was never documented, please use "options.https.key"'); } if ('cert' in options) { deprecationWarning('"options.cert" was never documented, please use "options.https.certificate"'); } if ('passphrase' in options) { deprecationWarning('"options.passphrase" was never documented, please use "options.https.passphrase"'); } if ('pfx' in options) { deprecationWarning('"options.pfx" was never documented, please use "options.https.pfx"'); } // Other options if ('followRedirects' in options) { throw new TypeError('The `followRedirects` option does not exist. Use `followRedirect` instead.'); } if (options.agent) { for (const key in options.agent) { if (key !== 'http' && key !== 'https' && key !== 'http2') { throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${key}\``); } } } options.maxRedirects = options.maxRedirects ?? 0; // Set non-enumerable properties setNonEnumerableProperties([defaults, rawOptions], options); return normalizePromiseArguments(options as NormalizedOptions, defaults); } _lockWrite(): void { const onLockedWrite = (): never => { throw new TypeError('The payload has been already provided'); }; this.write = onLockedWrite; this.end = onLockedWrite; } _unlockWrite(): void { this.write = super.write; this.end = super.end; } async _finalizeBody(): Promise { const {options} = this; const {headers} = options; const isForm = !is.undefined(options.form); const isJSON = !is.undefined(options.json); const isBody = !is.undefined(options.body); const hasPayload = isForm || isJSON || isBody; const cannotHaveBody = withoutBody.has(options.method) && !(options.method === 'GET' && options.allowGetBody); this._cannotHaveBody = cannotHaveBody; if (hasPayload) { if (cannotHaveBody) { throw new TypeError(`The \`${options.method}\` method cannot be used with a body`); } if ([isBody, isForm, isJSON].filter(isTrue => isTrue).length > 1) { throw new TypeError('The `body`, `json` and `form` options are mutually exclusive'); } if ( isBody && !(options.body instanceof Readable) && !is.string(options.body) && !is.buffer(options.body) && !isFormData(options.body) ) { throw new TypeError('The `body` option must be a stream.Readable, string or Buffer'); } if (isForm && !is.object(options.form)) { throw new TypeError('The `form` option must be an Object'); } { // Serialize body const noContentType = !is.string(headers['content-type']); if (isBody) { // Special case for https://github.com/form-data/form-data if (isFormData(options.body) && noContentType) { headers['content-type'] = `multipart/form-data; boundary=${options.body.getBoundary()}`; } this[kBody] = options.body; } else if (isForm) { if (noContentType) { headers['content-type'] = 'application/x-www-form-urlencoded'; } this[kBody] = (new URLSearchParams(options.form as Record)).toString(); } else { if (noContentType) { headers['content-type'] = 'application/json'; } this[kBody] = options.stringifyJson(options.json); } const uploadBodySize = await getBodySize(this[kBody], options.headers); // See https://tools.ietf.org/html/rfc7230#section-3.3.2 // A user agent SHOULD send a Content-Length in a request message when // no Transfer-Encoding is sent and the request method defines a meaning // for an enclosed payload body. For example, a Content-Length header // field is normally sent in a POST request even when the value is 0 // (indicating an empty payload body). A user agent SHOULD NOT send a // Content-Length header field when the request message does not contain // a payload body and the method semantics do not anticipate such a // body. if (is.undefined(headers['content-length']) && is.undefined(headers['transfer-encoding'])) { if (!cannotHaveBody && !is.undefined(uploadBodySize)) { headers['content-length'] = String(uploadBodySize); } } } } else if (cannotHaveBody) { this._lockWrite(); } else { this._unlockWrite(); } this[kBodySize] = Number(headers['content-length']) || undefined; } async _onResponseBase(response: IncomingMessageWithTimings): Promise { const {options} = this; const {url} = options; this[kOriginalResponse] = response; if (options.decompress) { response = decompressResponse(response); } const statusCode = response.statusCode!; const typedResponse = response as Response; typedResponse.statusMessage = typedResponse.statusMessage ? typedResponse.statusMessage : http.STATUS_CODES[statusCode]; typedResponse.url = options.url.toString(); typedResponse.requestUrl = this.requestUrl; typedResponse.redirectUrls = this.redirects; typedResponse.request = this; typedResponse.isFromCache = (response as any).fromCache || false; typedResponse.ip = this.ip; typedResponse.retryCount = this.retryCount; this[kIsFromCache] = typedResponse.isFromCache; this[kResponseSize] = Number(response.headers['content-length']) || undefined; this[kResponse] = response; response.once('end', () => { this[kResponseSize] = this[kDownloadedSize]; this.emit('downloadProgress', this.downloadProgress); }); response.once('error', (error: Error) => { // Force clean-up, because some packages don't do this. // TODO: Fix decompress-response response.destroy(); this._beforeError(new ReadError(error, this)); }); response.once('aborted', () => { this._beforeError(new ReadError({ name: 'Error', message: 'The server aborted pending request', code: 'ECONNRESET' }, this)); }); this.emit('downloadProgress', this.downloadProgress); const rawCookies = response.headers['set-cookie']; if (is.object(options.cookieJar) && rawCookies) { let promises: Array> = rawCookies.map(async (rawCookie: string) => (options.cookieJar as PromiseCookieJar).setCookie(rawCookie, url.toString())); if (options.ignoreInvalidCookies) { promises = promises.map(async p => p.catch(() => {})); } try { await Promise.all(promises); } catch (error) { this._beforeError(error); return; } } if (options.followRedirect && response.headers.location && redirectCodes.has(statusCode)) { // We're being redirected, we don't care about the response. // It'd be best to abort the request, but we can't because // we would have to sacrifice the TCP connection. We don't want that. response.resume(); if (this[kRequest]) { this[kCancelTimeouts]!(); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this[kRequest]; this[kUnproxyEvents](); } const shouldBeGet = statusCode === 303 && options.method !== 'GET' && options.method !== 'HEAD'; if (shouldBeGet || !options.methodRewriting) { // Server responded with "see other", indicating that the resource exists at another location, // and the client should request it from that location via GET or HEAD. options.method = 'GET'; if ('body' in options) { delete options.body; } if ('json' in options) { delete options.json; } if ('form' in options) { delete options.form; } this[kBody] = undefined; delete options.headers['content-length']; } if (this.redirects.length >= options.maxRedirects) { this._beforeError(new MaxRedirectsError(this)); return; } try { // Do not remove. See https://github.com/sindresorhus/got/pull/214 const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString(); // Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604 const redirectUrl = new URL(redirectBuffer, url); const redirectString = redirectUrl.toString(); decodeURI(redirectString); // eslint-disable-next-line no-inner-declarations function isUnixSocketURL(url: URL) { return url.protocol === 'unix:' || url.hostname === 'unix'; } if (!isUnixSocketURL(url) && isUnixSocketURL(redirectUrl)) { this._beforeError(new RequestError('Cannot redirect to UNIX socket', {}, this)); return; } // Redirecting to a different site, clear sensitive data. if (redirectUrl.hostname !== url.hostname || redirectUrl.port !== url.port) { if ('host' in options.headers) { delete options.headers.host; } if ('cookie' in options.headers) { delete options.headers.cookie; } if ('authorization' in options.headers) { delete options.headers.authorization; } if (options.username || options.password) { options.username = ''; options.password = ''; } } else { redirectUrl.username = options.username; redirectUrl.password = options.password; } this.redirects.push(redirectString); options.url = redirectUrl; for (const hook of options.hooks.beforeRedirect) { // eslint-disable-next-line no-await-in-loop await hook(options, typedResponse); } this.emit('redirect', typedResponse, options); await this._makeRequest(); } catch (error) { this._beforeError(error); return; } return; } if (options.isStream && options.throwHttpErrors && !isResponseOk(typedResponse)) { this._beforeError(new HTTPError(typedResponse)); return; } response.on('readable', () => { if (this[kTriggerRead]) { this._read(); } }); this.on('resume', () => { response.resume(); }); this.on('pause', () => { response.pause(); }); response.once('end', () => { this.push(null); }); this.emit('response', response); for (const destination of this[kServerResponsesPiped]) { if (destination.headersSent) { continue; } // eslint-disable-next-line guard-for-in for (const key in response.headers) { const isAllowed = options.decompress ? key !== 'content-encoding' : true; const value = response.headers[key]; if (isAllowed) { destination.setHeader(key, value!); } } destination.statusCode = statusCode; } } async _onResponse(response: IncomingMessageWithTimings): Promise { try { await this._onResponseBase(response); } catch (error) { /* istanbul ignore next: better safe than sorry */ this._beforeError(error); } } _onRequest(request: ClientRequest): void { const {options} = this; const {timeout, url} = options; timer(request); this[kCancelTimeouts] = timedOut(request, timeout, url); const responseEventName = options.cache ? 'cacheableResponse' : 'response'; request.once(responseEventName, (response: IncomingMessageWithTimings) => { void this._onResponse(response); }); request.once('error', (error: Error) => { // Force clean-up, because some packages (e.g. nock) don't do this. request.destroy(); // Node.js <= 12.18.2 mistakenly emits the response `end` first. (request as ClientRequest & {res: IncomingMessage | undefined}).res?.removeAllListeners('end'); error = error instanceof TimedOutTimeoutError ? new TimeoutError(error, this.timings!, this) : new RequestError(error.message, error, this); this._beforeError(error as RequestError); }); this[kUnproxyEvents] = proxyEvents(request, this, proxiedRequestEvents); this[kRequest] = request; this.emit('uploadProgress', this.uploadProgress); // Send body const body = this[kBody]; const currentRequest = this.redirects.length === 0 ? this : request; if (is.nodeStream(body)) { body.pipe(currentRequest); body.once('error', (error: NodeJS.ErrnoException) => { this._beforeError(new UploadError(error, this)); }); } else { this._unlockWrite(); if (!is.undefined(body)) { this._writeRequest(body, undefined, () => {}); currentRequest.end(); this._lockWrite(); } else if (this._cannotHaveBody || this._noPipe) { currentRequest.end(); this._lockWrite(); } } this.emit('request', request); } async _createCacheableRequest(url: URL, options: RequestOptions): Promise { return new Promise((resolve, reject) => { // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed Object.assign(options, urlToOptions(url)); // `http-cache-semantics` checks this // TODO: Fix this ignore. // @ts-expect-error delete (options as unknown as NormalizedOptions).url; let request: ClientRequest | Promise; // This is ugly const cacheRequest = cacheableStore.get((options as any).cache)!(options, async response => { // TODO: Fix `cacheable-response` (response as any)._readableState.autoDestroy = false; if (request) { (await request).emit('cacheableResponse', response); } resolve(response as unknown as ResponseLike); }); // Restore options (options as unknown as NormalizedOptions).url = url; cacheRequest.once('error', reject); cacheRequest.once('request', async (requestOrPromise: ClientRequest | Promise) => { request = requestOrPromise; resolve(request); }); }); } async _makeRequest(): Promise { const {options} = this; const {headers} = options; for (const key in headers) { if (is.undefined(headers[key])) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete headers[key]; } else if (is.null_(headers[key])) { throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${key}\` header`); } } if (options.decompress && is.undefined(headers['accept-encoding'])) { headers['accept-encoding'] = supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate'; } // Set cookies if (options.cookieJar) { const cookieString: string = await options.cookieJar.getCookieString(options.url.toString()); if (is.nonEmptyString(cookieString)) { options.headers.cookie = cookieString; } } for (const hook of options.hooks.beforeRequest) { // eslint-disable-next-line no-await-in-loop const result = await hook(options); if (!is.undefined(result)) { // @ts-expect-error Skip the type mismatch to support abstract responses options.request = () => result; break; } } if (options.body && this[kBody] !== options.body) { this[kBody] = options.body; } const {agent, request, timeout, url} = options; if (options.dnsCache && !('lookup' in options)) { options.lookup = options.dnsCache.lookup; } // UNIX sockets if (url.hostname === 'unix') { const matches = /(?.+?):(?.+)/.exec(`${url.pathname}${url.search}`); if (matches?.groups) { const {socketPath, path} = matches.groups; Object.assign(options, { socketPath, path, host: '' }); } } const isHttps = url.protocol === 'https:'; // Fallback function let fallbackFn: HttpRequestFunction; if (options.http2) { fallbackFn = http2wrapper.auto; } else { fallbackFn = isHttps ? https.request : http.request; } const realFn = options.request ?? fallbackFn; // Cache support const fn = options.cache ? this._createCacheableRequest : realFn; // Pass an agent directly when HTTP2 is disabled if (agent && !options.http2) { (options as unknown as RequestOptions).agent = agent[isHttps ? 'https' : 'http']; } // Prepare plain HTTP request options options[kRequest] = realFn as HttpRequestFunction; delete options.request; // TODO: Fix this ignore. // @ts-expect-error delete options.timeout; const requestOptions = options as unknown as (RealRequestOptions & CacheOptions); requestOptions.shared = options.cacheOptions?.shared; requestOptions.cacheHeuristic = options.cacheOptions?.cacheHeuristic; requestOptions.immutableMinTimeToLive = options.cacheOptions?.immutableMinTimeToLive; requestOptions.ignoreCargoCult = options.cacheOptions?.ignoreCargoCult; // If `dnsLookupIpVersion` is not present do not override `family` if (options.dnsLookupIpVersion !== undefined) { try { requestOptions.family = dnsLookupIpVersionToFamily(options.dnsLookupIpVersion); } catch { throw new Error('Invalid `dnsLookupIpVersion` option value'); } } // HTTPS options remapping if (options.https) { if ('rejectUnauthorized' in options.https) { requestOptions.rejectUnauthorized = options.https.rejectUnauthorized; } if (options.https.checkServerIdentity) { requestOptions.checkServerIdentity = options.https.checkServerIdentity; } if (options.https.certificateAuthority) { requestOptions.ca = options.https.certificateAuthority; } if (options.https.certificate) { requestOptions.cert = options.https.certificate; } if (options.https.key) { requestOptions.key = options.https.key; } if (options.https.passphrase) { requestOptions.passphrase = options.https.passphrase; } if (options.https.pfx) { requestOptions.pfx = options.https.pfx; } } try { let requestOrResponse = await fn(url, requestOptions); if (is.undefined(requestOrResponse)) { requestOrResponse = fallbackFn(url, requestOptions); } // Restore options options.request = request; options.timeout = timeout; options.agent = agent; // HTTPS options restore if (options.https) { if ('rejectUnauthorized' in options.https) { delete requestOptions.rejectUnauthorized; } if (options.https.checkServerIdentity) { // @ts-expect-error - This one will be removed when we remove the alias. delete requestOptions.checkServerIdentity; } if (options.https.certificateAuthority) { delete requestOptions.ca; } if (options.https.certificate) { delete requestOptions.cert; } if (options.https.key) { delete requestOptions.key; } if (options.https.passphrase) { delete requestOptions.passphrase; } if (options.https.pfx) { delete requestOptions.pfx; } } if (isClientRequest(requestOrResponse)) { this._onRequest(requestOrResponse); // Emit the response after the stream has been ended } else if (this.writable) { this.once('finish', () => { void this._onResponse(requestOrResponse as IncomingMessageWithTimings); }); this._unlockWrite(); this.end(); this._lockWrite(); } else { void this._onResponse(requestOrResponse as IncomingMessageWithTimings); } } catch (error) { if (error instanceof CacheableRequest.CacheError) { throw new CacheError(error, this); } throw new RequestError(error.message, error, this); } } async _error(error: RequestError): Promise { try { for (const hook of this.options.hooks.beforeError) { // eslint-disable-next-line no-await-in-loop error = await hook(error); } } catch (error_) { error = new RequestError(error_.message, error_, this); } this.destroy(error); } _beforeError(error: Error): void { if (this[kStopReading]) { return; } const {options} = this; const retryCount = this.retryCount + 1; this[kStopReading] = true; if (!(error instanceof RequestError)) { error = new RequestError(error.message, error, this); } const typedError = error as RequestError; const {response} = typedError; void (async () => { if (response && !response.body) { response.setEncoding((this as any)._readableState.encoding); try { response.rawBody = await getBuffer(response); response.body = response.rawBody.toString(); } catch {} } if (this.listenerCount('retry') !== 0) { let backoff: number; try { let retryAfter; if (response && 'retry-after' in response.headers) { retryAfter = Number(response.headers['retry-after']); if (Number.isNaN(retryAfter)) { retryAfter = Date.parse(response.headers['retry-after']!) - Date.now(); if (retryAfter <= 0) { retryAfter = 1; } } else { retryAfter *= 1000; } } backoff = await options.retry.calculateDelay({ attemptCount: retryCount, retryOptions: options.retry, error: typedError, retryAfter, computedValue: calculateRetryDelay({ attemptCount: retryCount, retryOptions: options.retry, error: typedError, retryAfter, computedValue: 0 }) }); } catch (error_) { void this._error(new RequestError(error_.message, error_, this)); return; } if (backoff) { const retry = async (): Promise => { try { for (const hook of this.options.hooks.beforeRetry) { // eslint-disable-next-line no-await-in-loop await hook(this.options, typedError, retryCount); } } catch (error_) { void this._error(new RequestError(error_.message, error, this)); return; } // Something forced us to abort the retry if (this.destroyed) { return; } this.destroy(); this.emit('retry', retryCount, error); }; this[kRetryTimeout] = setTimeout(retry, backoff); return; } } void this._error(typedError); })(); } _read(): void { this[kTriggerRead] = true; const response = this[kResponse]; if (response && !this[kStopReading]) { // We cannot put this in the `if` above // because `.read()` also triggers the `end` event if (response.readableLength) { this[kTriggerRead] = false; } let data; while ((data = response.read()) !== null) { this[kDownloadedSize] += data.length; this[kStartedReading] = true; const progress = this.downloadProgress; if (progress.percent < 1) { this.emit('downloadProgress', progress); } this.push(data); } } } // Node.js 12 has incorrect types, so the encoding must be a string _write(chunk: any, encoding: string | undefined, callback: (error?: Error | null) => void): void { const write = (): void => { this._writeRequest(chunk, encoding as BufferEncoding, callback); }; if (this.requestInitialized) { write(); } else { this[kJobs].push(write); } } _writeRequest(chunk: any, encoding: BufferEncoding | undefined, callback: (error?: Error | null) => void): void { if (this[kRequest]!.destroyed) { // Probably the `ClientRequest` instance will throw return; } this._progressCallbacks.push((): void => { this[kUploadedSize] += Buffer.byteLength(chunk, encoding); const progress = this.uploadProgress; if (progress.percent < 1) { this.emit('uploadProgress', progress); } }); // TODO: What happens if it's from cache? Then this[kRequest] won't be defined. this[kRequest]!.write(chunk, encoding!, (error?: Error | null) => { if (!error && this._progressCallbacks.length > 0) { this._progressCallbacks.shift()!(); } callback(error); }); } _final(callback: (error?: Error | null) => void): void { const endRequest = (): void => { // FIX: Node.js 10 calls the write callback AFTER the end callback! while (this._progressCallbacks.length !== 0) { this._progressCallbacks.shift()!(); } // We need to check if `this[kRequest]` is present, // because it isn't when we use cache. if (!(kRequest in this)) { callback(); return; } if (this[kRequest]!.destroyed) { callback(); return; } this[kRequest]!.end((error?: Error | null) => { if (!error) { this[kBodySize] = this[kUploadedSize]; this.emit('uploadProgress', this.uploadProgress); this[kRequest]!.emit('upload-complete'); } callback(error); }); }; if (this.requestInitialized) { endRequest(); } else { this[kJobs].push(endRequest); } } _destroy(error: Error | null, callback: (error: Error | null) => void): void { this[kStopReading] = true; // Prevent further retries clearTimeout(this[kRetryTimeout] as NodeJS.Timeout); if (kRequest in this) { this[kCancelTimeouts]!(); // TODO: Remove the next `if` when these get fixed: // - https://github.com/nodejs/node/issues/32851 if (!this[kResponse]?.complete) { this[kRequest]!.destroy(); } } if (error !== null && !is.undefined(error) && !(error instanceof RequestError)) { error = new RequestError(error.message, error, this); } callback(error); } get _isAboutToError() { return this[kStopReading]; } /** The remote IP address. */ get ip(): string | undefined { return this.socket?.remoteAddress; } /** Indicates whether the request has been aborted or not. */ get aborted(): boolean { return (this[kRequest]?.destroyed ?? this.destroyed) && !(this[kOriginalResponse]?.complete); } get socket(): Socket | undefined { return this[kRequest]?.socket ?? undefined; } /** Progress event for downloading (receiving a response). */ get downloadProgress(): Progress { let percent; if (this[kResponseSize]) { percent = this[kDownloadedSize] / this[kResponseSize]!; } else if (this[kResponseSize] === this[kDownloadedSize]) { percent = 1; } else { percent = 0; } return { percent, transferred: this[kDownloadedSize], total: this[kResponseSize] }; } /** Progress event for uploading (sending a request). */ get uploadProgress(): Progress { let percent; if (this[kBodySize]) { percent = this[kUploadedSize] / this[kBodySize]!; } else if (this[kBodySize] === this[kUploadedSize]) { percent = 1; } else { percent = 0; } return { percent, transferred: this[kUploadedSize], total: this[kBodySize] }; } /** The object contains the following properties: - `start` - Time when the request started. - `socket` - Time when a socket was assigned to the request. - `lookup` - Time when the DNS lookup finished. - `connect` - Time when the socket successfully connected. - `secureConnect` - Time when the socket securely connected. - `upload` - Time when the request finished uploading. - `response` - Time when the request fired `response` event. - `end` - Time when the response fired `end` event. - `error` - Time when the request fired `error` event. - `abort` - Time when the request fired `abort` event. - `phases` - `wait` - `timings.socket - timings.start` - `dns` - `timings.lookup - timings.socket` - `tcp` - `timings.connect - timings.lookup` - `tls` - `timings.secureConnect - timings.connect` - `request` - `timings.upload - (timings.secureConnect || timings.connect)` - `firstByte` - `timings.response - timings.upload` - `download` - `timings.end - timings.response` - `total` - `(timings.end || timings.error || timings.abort) - timings.start` If something has not been measured yet, it will be `undefined`. __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch. */ get timings(): Timings | undefined { return (this[kRequest] as ClientRequestWithTimings)?.timings; } /** Whether the response was retrieved from the cache. */ get isFromCache(): boolean | undefined { return this[kIsFromCache]; } pipe(destination: T, options?: {end?: boolean}): T { if (this[kStartedReading]) { throw new Error('Failed to pipe. The response has been emitted already.'); } if (destination instanceof ServerResponse) { this[kServerResponsesPiped].add(destination); } return super.pipe(destination, options); } unpipe(destination: T): this { if (destination instanceof ServerResponse) { this[kServerResponsesPiped].delete(destination); } super.unpipe(destination); return this; } } sindresorhus-got-11d2e83/source/core/utils/000077500000000000000000000000001434406364000207565ustar00rootroot00000000000000sindresorhus-got-11d2e83/source/core/utils/dns-ip-version.ts000066400000000000000000000010071434406364000242010ustar00rootroot00000000000000export type DnsLookupIpVersion = 'auto' | 'ipv4' | 'ipv6'; type DnsIpFamily = 0 | 4 | 6; const conversionTable = { auto: 0, ipv4: 4, ipv6: 6 }; export const isDnsLookupIpVersion = (value: any): boolean => { return value in conversionTable; }; export const dnsLookupIpVersionToFamily = (dnsLookupIpVersion: DnsLookupIpVersion): DnsIpFamily => { if (isDnsLookupIpVersion(dnsLookupIpVersion)) { return conversionTable[dnsLookupIpVersion] as DnsIpFamily; } throw new Error('Invalid DNS lookup IP version'); }; sindresorhus-got-11d2e83/source/core/utils/get-body-size.ts000066400000000000000000000014571434406364000240170ustar00rootroot00000000000000import {ReadStream, stat} from 'fs'; import {promisify} from 'util'; import {ClientRequestArgs} from 'http'; import is from '@sindresorhus/is'; import isFormData from './is-form-data'; const statAsync = promisify(stat); export default async (body: unknown, headers: ClientRequestArgs['headers']): Promise => { if (headers && 'content-length' in headers) { return Number(headers['content-length']); } if (!body) { return 0; } if (is.string(body)) { return Buffer.byteLength(body); } if (is.buffer(body)) { return body.length; } if (isFormData(body)) { return promisify(body.getLength.bind(body))(); } if (body instanceof ReadStream) { const {size} = await statAsync(body.path); if (size === 0) { return undefined; } return size; } return undefined; }; sindresorhus-got-11d2e83/source/core/utils/get-buffer.ts000066400000000000000000000006541434406364000233610ustar00rootroot00000000000000import {Readable} from 'stream'; // TODO: Update https://github.com/sindresorhus/get-stream const getBuffer = async (stream: Readable) => { const chunks = []; let length = 0; for await (const chunk of stream) { chunks.push(chunk); length += Buffer.byteLength(chunk); } if (Buffer.isBuffer(chunks[0])) { return Buffer.concat(chunks, length); } return Buffer.from(chunks.join('')); }; export default getBuffer; sindresorhus-got-11d2e83/source/core/utils/is-form-data.ts000066400000000000000000000005221434406364000236100ustar00rootroot00000000000000import is from '@sindresorhus/is'; import {Readable} from 'stream'; interface FormData extends Readable { getBoundary: () => string; getLength: (callback: (error: Error | null, length: number) => void) => void; } export default (body: unknown): body is FormData => is.nodeStream(body) && is.function_((body as FormData).getBoundary); sindresorhus-got-11d2e83/source/core/utils/is-response-ok.ts000066400000000000000000000004431434406364000242050ustar00rootroot00000000000000import {Response} from '..'; export const isResponseOk = (response: Response): boolean => { const {statusCode} = response; const limitStatusCode = response.request.options.followRedirect ? 299 : 399; return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304; }; sindresorhus-got-11d2e83/source/core/utils/options-to-url.ts000066400000000000000000000031151434406364000242410ustar00rootroot00000000000000/* istanbul ignore file: deprecated */ import {URL} from 'url'; export interface URLOptions { href?: string; protocol?: string; host?: string; hostname?: string; port?: string | number; pathname?: string; search?: string; searchParams?: unknown; path?: string; } const keys: Array> = [ 'protocol', 'host', 'hostname', 'port', 'pathname', 'search' ]; export default (origin: string, options: URLOptions): URL => { if (options.path) { if (options.pathname) { throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.'); } if (options.search) { throw new TypeError('Parameters `path` and `search` are mutually exclusive.'); } if (options.searchParams) { throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.'); } } if (options.search && options.searchParams) { throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.'); } if (!origin) { if (!options.protocol) { throw new TypeError('No URL protocol specified'); } origin = `${options.protocol}//${options.hostname ?? options.host ?? ''}`; } const url = new URL(origin); if (options.path) { const searchIndex = options.path.indexOf('?'); if (searchIndex === -1) { options.pathname = options.path; } else { options.pathname = options.path.slice(0, searchIndex); options.search = options.path.slice(searchIndex + 1); } delete options.path; } for (const key of keys) { if (options[key]) { url[key] = options[key]!.toString(); } } return url; }; sindresorhus-got-11d2e83/source/core/utils/proxy-events.ts000066400000000000000000000007121434406364000240110ustar00rootroot00000000000000import {EventEmitter} from 'events'; type Fn = (...args: unknown[]) => void; type Fns = Record; export default function (from: EventEmitter, to: EventEmitter, events: string[]): () => void { const fns: Fns = {}; for (const event of events) { fns[event] = (...args: unknown[]) => { to.emit(event, ...args); }; from.on(event, fns[event]); } return () => { for (const event of events) { from.off(event, fns[event]); } }; } sindresorhus-got-11d2e83/source/core/utils/timed-out.ts000066400000000000000000000107641434406364000232450ustar00rootroot00000000000000import net = require('net'); import {ClientRequest, IncomingMessage} from 'http'; import unhandler from './unhandle'; const reentry: unique symbol = Symbol('reentry'); const noop = (): void => {}; interface TimedOutOptions { host?: string; hostname?: string; protocol?: string; } export interface Delays { lookup?: number; connect?: number; secureConnect?: number; socket?: number; response?: number; send?: number; request?: number; } export type ErrorCode = | 'ETIMEDOUT' | 'ECONNRESET' | 'EADDRINUSE' | 'ECONNREFUSED' | 'EPIPE' | 'ENOTFOUND' | 'ENETUNREACH' | 'EAI_AGAIN'; export class TimeoutError extends Error { code: ErrorCode; constructor(threshold: number, public event: string) { super(`Timeout awaiting '${event}' for ${threshold}ms`); this.name = 'TimeoutError'; this.code = 'ETIMEDOUT'; } } export default (request: ClientRequest, delays: Delays, options: TimedOutOptions): () => void => { if (reentry in request) { return noop; } request[reentry] = true; const cancelers: Array = []; const {once, unhandleAll} = unhandler(); const addTimeout = (delay: number, callback: (delay: number, event: string) => void, event: string): (typeof noop) => { const timeout = setTimeout(callback, delay, delay, event) as unknown as NodeJS.Timeout; timeout.unref?.(); const cancel = (): void => { clearTimeout(timeout); }; cancelers.push(cancel); return cancel; }; const {host, hostname} = options; const timeoutHandler = (delay: number, event: string): void => { request.destroy(new TimeoutError(delay, event)); }; const cancelTimeouts = (): void => { for (const cancel of cancelers) { cancel(); } unhandleAll(); }; request.once('error', error => { cancelTimeouts(); // Save original behavior /* istanbul ignore next */ if (request.listenerCount('error') === 0) { throw error; } }); request.once('close', cancelTimeouts); once(request, 'response', (response: IncomingMessage): void => { once(response, 'end', cancelTimeouts); }); if (typeof delays.request !== 'undefined') { addTimeout(delays.request, timeoutHandler, 'request'); } if (typeof delays.socket !== 'undefined') { const socketTimeoutHandler = (): void => { timeoutHandler(delays.socket!, 'socket'); }; request.setTimeout(delays.socket, socketTimeoutHandler); // `request.setTimeout(0)` causes a memory leak. // We can just remove the listener and forget about the timer - it's unreffed. // See https://github.com/sindresorhus/got/issues/690 cancelers.push(() => { request.removeListener('timeout', socketTimeoutHandler); }); } once(request, 'socket', (socket: net.Socket): void => { const {socketPath} = request as ClientRequest & {socketPath?: string}; /* istanbul ignore next: hard to test */ if (socket.connecting) { const hasPath = Boolean(socketPath ?? net.isIP(hostname ?? host ?? '') !== 0); if (typeof delays.lookup !== 'undefined' && !hasPath && typeof (socket.address() as net.AddressInfo).address === 'undefined') { const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup'); once(socket, 'lookup', cancelTimeout); } if (typeof delays.connect !== 'undefined') { const timeConnect = (): (() => void) => addTimeout(delays.connect!, timeoutHandler, 'connect'); if (hasPath) { once(socket, 'connect', timeConnect()); } else { once(socket, 'lookup', (error: Error): void => { if (error === null) { once(socket, 'connect', timeConnect()); } }); } } if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') { once(socket, 'connect', (): void => { const cancelTimeout = addTimeout(delays.secureConnect!, timeoutHandler, 'secureConnect'); once(socket, 'secureConnect', cancelTimeout); }); } } if (typeof delays.send !== 'undefined') { const timeRequest = (): (() => void) => addTimeout(delays.send!, timeoutHandler, 'send'); /* istanbul ignore next: hard to test */ if (socket.connecting) { once(socket, 'connect', (): void => { once(request, 'upload-complete', timeRequest()); }); } else { once(request, 'upload-complete', timeRequest()); } } }); if (typeof delays.response !== 'undefined') { once(request, 'upload-complete', (): void => { const cancelTimeout = addTimeout(delays.response!, timeoutHandler, 'response'); once(request, 'response', cancelTimeout); }); } return cancelTimeouts; }; declare module 'http' { interface ClientRequest { [reentry]: boolean; } } sindresorhus-got-11d2e83/source/core/utils/unhandle.ts000066400000000000000000000016731434406364000231330ustar00rootroot00000000000000import {EventEmitter} from 'events'; type Origin = EventEmitter; type Event = string | symbol; type Fn = (...args: any[]) => void; interface Handler { origin: Origin; event: Event; fn: Fn; } interface Unhandler { once: (origin: Origin, event: Event, fn: Fn) => void; unhandleAll: () => void; } // When attaching listeners, it's very easy to forget about them. // Especially if you do error handling and set timeouts. // So instead of checking if it's proper to throw an error on every timeout ever, // use this simple tool which will remove all listeners you have attached. export default (): Unhandler => { const handlers: Handler[] = []; return { once(origin: Origin, event: Event, fn: Fn) { origin.once(event, fn); handlers.push({origin, event, fn}); }, unhandleAll() { for (const handler of handlers) { const {origin, event, fn} = handler; origin.removeListener(event, fn); } handlers.length = 0; } }; }; sindresorhus-got-11d2e83/source/core/utils/url-to-options.ts000066400000000000000000000017471434406364000242520ustar00rootroot00000000000000import {URL, UrlWithStringQuery} from 'url'; import is from '@sindresorhus/is'; // TODO: Deprecate legacy URL at some point export interface LegacyUrlOptions { protocol: string; hostname: string; host: string; hash: string | null; search: string | null; pathname: string; href: string; path: string; port?: number; auth?: string; } export default (url: URL | UrlWithStringQuery): LegacyUrlOptions => { // Cast to URL url = url as URL; const options: LegacyUrlOptions = { protocol: url.protocol, hostname: is.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname, host: url.host, hash: url.hash, search: url.search, pathname: url.pathname, href: url.href, path: `${url.pathname || ''}${url.search || ''}` }; if (is.string(url.port) && url.port.length > 0) { options.port = Number(url.port); } if (url.username || url.password) { options.auth = `${url.username || ''}:${url.password || ''}`; } return options; }; sindresorhus-got-11d2e83/source/core/utils/weakable-map.ts000066400000000000000000000012771434406364000236630ustar00rootroot00000000000000export default class WeakableMap { weakMap: WeakMap, V>; map: Map; constructor() { this.weakMap = new WeakMap(); this.map = new Map(); } set(key: K, value: V): void { if (typeof key === 'object') { this.weakMap.set(key as unknown as Record, value); } else { this.map.set(key, value); } } get(key: K): V | undefined { if (typeof key === 'object') { return this.weakMap.get(key as unknown as Record); } return this.map.get(key); } has(key: K): boolean { if (typeof key === 'object') { return this.weakMap.has(key as unknown as Record); } return this.map.has(key); } } sindresorhus-got-11d2e83/source/create.ts000066400000000000000000000205211434406364000205010ustar00rootroot00000000000000import {URL} from 'url'; import is from '@sindresorhus/is'; import asPromise, { // Response Response, // Options Options, NormalizedOptions, // Hooks InitHook, // Errors ParseError, RequestError, CacheError, ReadError, HTTPError, MaxRedirectsError, TimeoutError, UnsupportedProtocolError, UploadError, CancelError } from './as-promise'; import { GotReturn, ExtendOptions, Got, HTTPAlias, HandlerFunction, InstanceDefaults, GotPaginate, GotStream, GotRequestFunction, OptionsWithPagination, StreamOptions } from './types'; import createRejection from './as-promise/create-rejection'; import Request, {kIsNormalizedAlready, setNonEnumerableProperties, Defaults} from './core'; import deepFreeze from './utils/deep-freeze'; const errors = { RequestError, CacheError, ReadError, HTTPError, MaxRedirectsError, TimeoutError, ParseError, CancelError, UnsupportedProtocolError, UploadError }; // The `delay` package weighs 10KB (!) const delay = async (ms: number) => new Promise(resolve => { setTimeout(resolve, ms); }); const {normalizeArguments} = Request; const mergeOptions = (...sources: Options[]): NormalizedOptions => { let mergedOptions: NormalizedOptions | undefined; for (const source of sources) { mergedOptions = normalizeArguments(undefined, source, mergedOptions); } return mergedOptions!; }; const getPromiseOrStream = (options: NormalizedOptions): GotReturn => options.isStream ? new Request(undefined, options) : asPromise(options); const isGotInstance = (value: Got | ExtendOptions): value is Got => ( 'defaults' in value && 'options' in value.defaults ); const aliases: readonly HTTPAlias[] = [ 'get', 'post', 'put', 'patch', 'head', 'delete' ]; export const defaultHandler: HandlerFunction = (options, next) => next(options); const callInitHooks = (hooks: InitHook[] | undefined, options?: Options): void => { if (hooks) { for (const hook of hooks) { hook(options!); } } }; const create = (defaults: InstanceDefaults): Got => { // Proxy properties from next handlers defaults._rawHandlers = defaults.handlers; defaults.handlers = defaults.handlers.map(fn => ((options, next) => { // This will be assigned by assigning result let root!: ReturnType; const result = fn(options, newOptions => { root = next(newOptions); return root; }); if (result !== root && !options.isStream && root) { const typedResult = result as Promise; const {then: promiseThen, catch: promiseCatch, finally: promiseFianlly} = typedResult; Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root)); Object.defineProperties(typedResult, Object.getOwnPropertyDescriptors(root)); // These should point to the new promise // eslint-disable-next-line promise/prefer-await-to-then typedResult.then = promiseThen; typedResult.catch = promiseCatch; typedResult.finally = promiseFianlly; } return result; })); // Got interface const got: Got = ((url: string | URL, options: Options = {}, _defaults?: Defaults): GotReturn => { let iteration = 0; const iterateHandlers = (newOptions: NormalizedOptions): GotReturn => { return defaults.handlers[iteration++]( newOptions, iteration === defaults.handlers.length ? getPromiseOrStream : iterateHandlers ) as GotReturn; }; // TODO: Remove this in Got 12. if (is.plainObject(url)) { const mergedOptions = { ...url as Options, ...options }; setNonEnumerableProperties([url as Options, options], mergedOptions); options = mergedOptions; url = undefined as any; } try { // Call `init` hooks let initHookError: Error | undefined; try { callInitHooks(defaults.options.hooks.init, options); callInitHooks(options.hooks?.init, options); } catch (error) { initHookError = error; } // Normalize options & call handlers const normalizedOptions = normalizeArguments(url, options, _defaults ?? defaults.options); normalizedOptions[kIsNormalizedAlready] = true; if (initHookError) { throw new RequestError(initHookError.message, initHookError, normalizedOptions); } return iterateHandlers(normalizedOptions); } catch (error) { if (options.isStream) { throw error; } else { return createRejection(error, defaults.options.hooks.beforeError, options.hooks?.beforeError); } } }) as Got; got.extend = (...instancesOrOptions) => { const optionsArray: Options[] = [defaults.options]; let handlers: HandlerFunction[] = [...defaults._rawHandlers!]; let isMutableDefaults: boolean | undefined; for (const value of instancesOrOptions) { if (isGotInstance(value)) { optionsArray.push(value.defaults.options); handlers.push(...value.defaults._rawHandlers!); isMutableDefaults = value.defaults.mutableDefaults; } else { optionsArray.push(value); if ('handlers' in value) { handlers.push(...value.handlers!); } isMutableDefaults = value.mutableDefaults; } } handlers = handlers.filter(handler => handler !== defaultHandler); if (handlers.length === 0) { handlers.push(defaultHandler); } return create({ options: mergeOptions(...optionsArray), handlers, mutableDefaults: Boolean(isMutableDefaults) }); }; // Pagination const paginateEach = (async function * (url: string | URL, options?: OptionsWithPagination): AsyncIterableIterator { // TODO: Remove this `@ts-expect-error` when upgrading to TypeScript 4. // Error: Argument of type 'Merge> | undefined' is not assignable to parameter of type 'Options | undefined'. // @ts-expect-error let normalizedOptions = normalizeArguments(url, options, defaults.options); normalizedOptions.resolveBodyOnly = false; const pagination = normalizedOptions.pagination!; if (!is.object(pagination)) { throw new TypeError('`options.pagination` must be implemented'); } const all: T[] = []; let {countLimit} = pagination; let numberOfRequests = 0; while (numberOfRequests < pagination.requestLimit) { if (numberOfRequests !== 0) { // eslint-disable-next-line no-await-in-loop await delay(pagination.backoff); } // @ts-expect-error FIXME! // TODO: Throw when result is not an instance of Response // eslint-disable-next-line no-await-in-loop const result = (await got(undefined, undefined, normalizedOptions)) as Response; // eslint-disable-next-line no-await-in-loop const parsed = await pagination.transform(result); const current: T[] = []; for (const item of parsed) { if (pagination.filter(item, all, current)) { if (!pagination.shouldContinue(item, all, current)) { return; } yield item as T; if (pagination.stackAllItems) { all.push(item as T); } current.push(item as T); if (--countLimit <= 0) { return; } } } const optionsToMerge = pagination.paginate(result, all, current); if (optionsToMerge === false) { return; } if (optionsToMerge === result.request.options) { normalizedOptions = result.request.options; } else if (optionsToMerge !== undefined) { normalizedOptions = normalizeArguments(undefined, optionsToMerge, normalizedOptions); } numberOfRequests++; } }); got.paginate = paginateEach as GotPaginate; got.paginate.all = (async (url: string | URL, options?: OptionsWithPagination) => { const results: T[] = []; for await (const item of paginateEach(url, options)) { results.push(item); } return results; }) as GotPaginate['all']; // For those who like very descriptive names got.paginate.each = paginateEach as GotPaginate['each']; // Stream API got.stream = ((url: string | URL, options?: StreamOptions) => got(url, {...options, isStream: true})) as GotStream; // Shortcuts for (const method of aliases) { got[method] = ((url: string | URL, options?: Options): GotReturn => got(url, {...options, method})) as GotRequestFunction; got.stream[method] = ((url: string | URL, options?: StreamOptions) => { return got(url, {...options, method, isStream: true}); }) as GotStream; } Object.assign(got, errors); Object.defineProperty(got, 'defaults', { value: defaults.mutableDefaults ? defaults : deepFreeze(defaults), writable: defaults.mutableDefaults, configurable: defaults.mutableDefaults, enumerable: true }); got.mergeOptions = mergeOptions; return got; }; export default create; export * from './types'; sindresorhus-got-11d2e83/source/index.ts000066400000000000000000000052351434406364000203520ustar00rootroot00000000000000import {URL} from 'url'; import {Response, Options} from './as-promise'; import create, {defaultHandler, InstanceDefaults} from './create'; const defaults: InstanceDefaults = { options: { method: 'GET', retry: { limit: 2, methods: [ 'GET', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'TRACE' ], statusCodes: [ 408, 413, 429, 500, 502, 503, 504, 521, 522, 524 ], errorCodes: [ 'ETIMEDOUT', 'ECONNRESET', 'EADDRINUSE', 'ECONNREFUSED', 'EPIPE', 'ENOTFOUND', 'ENETUNREACH', 'EAI_AGAIN' ], maxRetryAfter: undefined, calculateDelay: ({computedValue}) => computedValue }, timeout: {}, headers: { 'user-agent': 'got (https://github.com/sindresorhus/got)' }, hooks: { init: [], beforeRequest: [], beforeRedirect: [], beforeRetry: [], beforeError: [], afterResponse: [] }, cache: undefined, dnsCache: undefined, decompress: true, throwHttpErrors: true, followRedirect: true, isStream: false, responseType: 'text', resolveBodyOnly: false, maxRedirects: 10, prefixUrl: '', methodRewriting: true, ignoreInvalidCookies: false, context: {}, // TODO: Set this to `true` when Got 12 gets released http2: false, allowGetBody: false, https: undefined, pagination: { transform: (response: Response) => { if (response.request.options.responseType === 'json') { return response.body; } return JSON.parse(response.body as string); }, paginate: response => { if (!Reflect.has(response.headers, 'link')) { return false; } const items = (response.headers.link as string).split(','); let next: string | undefined; for (const item of items) { const parsed = item.split(';'); if (parsed[1].includes('next')) { next = parsed[0].trimStart().trim(); next = next.slice(1, -1); break; } } if (next) { const options: Options = { url: new URL(next) }; return options; } return false; }, filter: () => true, shouldContinue: () => true, countLimit: Infinity, backoff: 0, requestLimit: 10000, stackAllItems: true }, parseJson: (text: string) => JSON.parse(text), stringifyJson: (object: unknown) => JSON.stringify(object), cacheOptions: {} }, handlers: [defaultHandler], mutableDefaults: false }; const got = create(defaults); export default got; // For CommonJS default export support module.exports = got; module.exports.default = got; module.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267 export * from './create'; export * from './as-promise'; sindresorhus-got-11d2e83/source/types.ts000066400000000000000000000316331434406364000204100ustar00rootroot00000000000000import {URL} from 'url'; import {CancelError} from 'p-cancelable'; import { // Request & Response CancelableRequest, Response, // Options Options, NormalizedOptions, Defaults as DefaultOptions, PaginationOptions, // Errors ParseError, RequestError, CacheError, ReadError, HTTPError, MaxRedirectsError, TimeoutError, UnsupportedProtocolError, UploadError } from './as-promise'; import Request from './core'; // `type-fest` utilities type Except = Pick>; type Merge = Except> & SecondType; /** Defaults for each Got instance. */ export interface InstanceDefaults { /** An object containing the default options of Got. */ options: DefaultOptions; /** An array of functions. You execute them directly by calling `got()`. They are some sort of "global hooks" - these functions are called first. The last handler (*it's hidden*) is either `asPromise` or `asStream`, depending on the `options.isStream` property. @default [] */ handlers: HandlerFunction[]; /** A read-only boolean describing whether the defaults are mutable or not. If set to `true`, you can update headers over time, for example, update an access token when it expires. @default false */ mutableDefaults: boolean; _rawHandlers?: HandlerFunction[]; } /** A Request object returned by calling Got, or any of the Got HTTP alias request functions. */ export type GotReturn = Request | CancelableRequest; /** A function to handle options and returns a Request object. It acts sort of like a "global hook", and will be called before any actual request is made. */ export type HandlerFunction = (options: NormalizedOptions, next: (options: NormalizedOptions) => T) => T | Promise; /** The options available for `got.extend()`. */ export interface ExtendOptions extends Options { /** An array of functions. You execute them directly by calling `got()`. They are some sort of "global hooks" - these functions are called first. The last handler (*it's hidden*) is either `asPromise` or `asStream`, depending on the `options.isStream` property. @default [] */ handlers?: HandlerFunction[]; /** A read-only boolean describing whether the defaults are mutable or not. If set to `true`, you can update headers over time, for example, update an access token when it expires. @default false */ mutableDefaults?: boolean; } export type OptionsOfTextResponseBody = Merge; export type OptionsOfJSONResponseBody = Merge; export type OptionsOfBufferResponseBody = Merge; export type OptionsOfUnknownResponseBody = Merge; export type StrictOptions = Except; export type StreamOptions = Merge; type ResponseBodyOnly = {resolveBodyOnly: true}; export type OptionsWithPagination = Merge>; /** An instance of `got.paginate`. */ export interface GotPaginate { /** Same as `GotPaginate.each`. */ (url: string | URL, options?: OptionsWithPagination): AsyncIterableIterator; /** Same as `GotPaginate.each`. */ (options?: OptionsWithPagination): AsyncIterableIterator; /** Returns an async iterator. See pagination.options for more pagination options. @example ``` (async () => { const countLimit = 10; const pagination = got.paginate('https://api.github.com/repos/sindresorhus/got/commits', { pagination: {countLimit} }); console.log(`Printing latest ${countLimit} Got commits (newest to oldest):`); for await (const commitData of pagination) { console.log(commitData.commit.message); } })(); ``` */ each: ((url: string | URL, options?: OptionsWithPagination) => AsyncIterableIterator) & ((options?: OptionsWithPagination) => AsyncIterableIterator); /** Returns a Promise for an array of all results. See pagination.options for more pagination options. @example ``` (async () => { const countLimit = 10; const results = await got.paginate.all('https://api.github.com/repos/sindresorhus/got/commits', { pagination: {countLimit} }); console.log(`Printing latest ${countLimit} Got commits (newest to oldest):`); console.log(results); })(); ``` */ all: ((url: string | URL, options?: OptionsWithPagination) => Promise) & ((options?: OptionsWithPagination) => Promise); } export interface GotRequestFunction { // `asPromise` usage (url: string | URL, options?: OptionsOfTextResponseBody): CancelableRequest>; (url: string | URL, options?: OptionsOfJSONResponseBody): CancelableRequest>; (url: string | URL, options?: OptionsOfBufferResponseBody): CancelableRequest>; (url: string | URL, options?: OptionsOfUnknownResponseBody): CancelableRequest; (options: OptionsOfTextResponseBody): CancelableRequest>; (options: OptionsOfJSONResponseBody): CancelableRequest>; (options: OptionsOfBufferResponseBody): CancelableRequest>; (options: OptionsOfUnknownResponseBody): CancelableRequest; // `resolveBodyOnly` usage (url: string | URL, options?: (Merge)): CancelableRequest; (url: string | URL, options?: (Merge)): CancelableRequest; (url: string | URL, options?: (Merge)): CancelableRequest; (options: (Merge)): CancelableRequest; (options: (Merge)): CancelableRequest; (options: (Merge)): CancelableRequest; // `asStream` usage (url: string | URL, options?: Merge): Request; (options: Merge): Request; // Fallback (url: string | URL, options?: Options): CancelableRequest | Request; (options: Options): CancelableRequest | Request; } /** All available HTTP request methods provided by Got. */ export type HTTPAlias = | 'get' | 'post' | 'put' | 'patch' | 'head' | 'delete'; interface GotStreamFunction { (url: string | URL, options?: Merge): Request; (options?: Merge): Request; } /** An instance of `got.stream()`. */ export type GotStream = GotStreamFunction & Record; /** An instance of `got`. */ export interface Got extends Record, GotRequestFunction { /** Sets `options.isStream` to `true`. Returns a [duplex stream](https://nodejs.org/api/stream.html#stream_class_stream_duplex) with additional events: - request - response - redirect - uploadProgress - downloadProgress - error */ stream: GotStream; /** Returns an async iterator. See pagination.options for more pagination options. @example ``` (async () => { const countLimit = 10; const pagination = got.paginate('https://api.github.com/repos/sindresorhus/got/commits', { pagination: {countLimit} }); console.log(`Printing latest ${countLimit} Got commits (newest to oldest):`); for await (const commitData of pagination) { console.log(commitData.commit.message); } })(); ``` */ paginate: GotPaginate; /** The Got defaults used in that instance. */ defaults: InstanceDefaults; /** An error to be thrown when a cache method fails. For example, if the database goes down or there's a filesystem error. Contains a `code` property with `ERR_CACHE_ACCESS` or a more specific failure code. */ CacheError: typeof CacheError; /** An error to be thrown when a request fails. Contains a `code` property with error class code, like `ECONNREFUSED`. If there is no specific code supplied, `code` defaults to `ERR_GOT_REQUEST_ERROR`. */ RequestError: typeof RequestError; /** An error to be thrown when reading from response stream fails. Contains a `code` property with `ERR_READING_RESPONSE_STREAM` or a more specific failure code. */ ReadError: typeof ReadError; /** An error to be thrown when server response code is 2xx, and parsing body fails. Includes a `response` property. Contains a `code` property with `ERR_BODY_PARSE_FAILURE` or a more specific failure code. */ ParseError: typeof ParseError; /** An error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304. Includes a `response` property. Contains a `code` property with `ERR_NON_2XX_3XX_RESPONSE` or a more specific failure code. */ HTTPError: typeof HTTPError; /** An error to be thrown when the server redirects you more than ten times. Includes a `response` property. Contains a `code` property with `ERR_TOO_MANY_REDIRECTS`. */ MaxRedirectsError: typeof MaxRedirectsError; /** An error to be thrown when given an unsupported protocol. Contains a `code` property with `ERR_UNSUPPORTED_PROTOCOL`. */ UnsupportedProtocolError: typeof UnsupportedProtocolError; /** An error to be thrown when the request is aborted due to a timeout. Includes an `event` and `timings` property. Contains a `code` property with `ETIMEDOUT`. */ TimeoutError: typeof TimeoutError; /** An error to be thrown when the request body is a stream and an error occurs while reading from that stream. Contains a `code` property with `ERR_UPLOAD` or a more specific failure code. */ UploadError: typeof UploadError; /** An error to be thrown when the request is aborted with `.cancel()`. Contains a `code` property with `ERR_CANCELED`. */ CancelError: typeof CancelError; /** Configure a new `got` instance with default `options`. The `options` are merged with the parent instance's `defaults.options` using `got.mergeOptions`. You can access the resolved options with the `.defaults` property on the instance. Additionally, `got.extend()` accepts two properties from the `defaults` object: `mutableDefaults` and `handlers`. It is also possible to merges many instances into a single one: - options are merged using `got.mergeOptions()` (including hooks), - handlers are stored in an array (you can access them through `instance.defaults.handlers`). @example ```js const client = got.extend({ prefixUrl: 'https://example.com', headers: { 'x-unicorn': 'rainbow' } }); client.get('demo'); // HTTP Request => // GET /demo HTTP/1.1 // Host: example.com // x-unicorn: rainbow ``` */ extend: (...instancesOrOptions: Array) => Got; /** Merges multiple `got` instances into the parent. */ mergeInstances: (parent: Got, ...instances: Got[]) => Got; /** Extends parent options. Avoid using [object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals) as it doesn't work recursively. Options are deeply merged to a new object. The value of each key is determined as follows: - If the new property is not defined, the old value is used. - If the new property is explicitly set to `undefined`: - If the parent property is a plain `object`, the parent value is deeply cloned. - Otherwise, `undefined` is used. - If the parent value is an instance of `URLSearchParams`: - If the new value is a `string`, an `object` or an instance of `URLSearchParams`, a new `URLSearchParams` instance is created. The values are merged using [`urlSearchParams.append(key, value)`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/append). The keys defined in the new value override the keys defined in the parent value. - Otherwise, the only available value is `undefined`. - If the new property is a plain `object`: - If the parent property is a plain `object` too, both values are merged recursively into a new `object`. - Otherwise, only the new value is deeply cloned. - If the new property is an `Array`, it overwrites the old one with a deep clone of the new property. - Properties that are not enumerable, such as `context`, `body`, `json`, and `form`, will not be merged. - Otherwise, the new value is assigned to the key. **Note:** Only Got options are merged! Custom user options should be defined via [`options.context`](#context). @example ``` const a = {headers: {cat: 'meow', wolf: ['bark', 'wrrr']}}; const b = {headers: {cow: 'moo', wolf: ['auuu']}}; {...a, ...b} // => {headers: {cow: 'moo', wolf: ['auuu']}} got.mergeOptions(a, b) // => {headers: {cat: 'meow', cow: 'moo', wolf: ['auuu']}} ``` */ mergeOptions: (...sources: Options[]) => NormalizedOptions; } sindresorhus-got-11d2e83/source/utils/000077500000000000000000000000001434406364000200265ustar00rootroot00000000000000sindresorhus-got-11d2e83/source/utils/deep-freeze.ts000066400000000000000000000004371434406364000225750ustar00rootroot00000000000000import is from '@sindresorhus/is'; export default function deepFreeze>(object: T): Readonly { for (const value of Object.values(object)) { if (is.plainObject(value) || is.array(value)) { deepFreeze(value); } } return Object.freeze(object); } sindresorhus-got-11d2e83/source/utils/deprecation-warning.ts000066400000000000000000000004271434406364000243410ustar00rootroot00000000000000const alreadyWarned: Set = new Set(); export default (message: string) => { if (alreadyWarned.has(message)) { return; } alreadyWarned.add(message); // @ts-expect-error Missing types. process.emitWarning(`Got: ${message}`, { type: 'DeprecationWarning' }); }; sindresorhus-got-11d2e83/test/000077500000000000000000000000001434406364000163455ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/agent.ts000066400000000000000000000115141434406364000200150ustar00rootroot00000000000000import {Agent as HttpAgent} from 'http'; import {Agent as HttpsAgent} from 'https'; import {Socket} from 'net'; import test, {Constructor} from 'ava'; import sinon = require('sinon'); import withServer, {withHttpsServer} from './helpers/with-server'; const createAgentSpy = (AgentClass: Constructor): {agent: T; spy: sinon.SinonSpy} => { const agent: T = new AgentClass({keepAlive: true}); // @ts-expect-error This IS correct const spy = sinon.spy(agent, 'addRequest'); return {agent, spy}; }; test('non-object agent option works with http', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {agent, spy} = createAgentSpy(HttpAgent); t.truthy((await got({ https: { rejectUnauthorized: false }, agent: { http: agent } })).body); t.true(spy.calledOnce); // Make sure to close all open sockets agent.destroy(); }); test('non-object agent option works with https', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {agent, spy} = createAgentSpy(HttpsAgent); t.truthy((await got({ https: { rejectUnauthorized: false }, agent: { https: agent } })).body); t.true(spy.calledOnce); // Make sure to close all open sockets agent.destroy(); }); test('redirects from http to https work with an agent object', withServer, async (t, serverHttp) => { await withHttpsServer()(t, async (t, serverHttps, got) => { serverHttp.get('/', (_request, response) => { response.end('http'); }); serverHttps.get('/', (_request, response) => { response.end('https'); }); serverHttp.get('/httpToHttps', (_request, response) => { response.writeHead(302, { location: serverHttps.url }); response.end(); }); const {agent: httpAgent, spy: httpSpy} = createAgentSpy(HttpAgent); const {agent: httpsAgent, spy: httpsSpy} = createAgentSpy(HttpsAgent); t.truthy((await got('httpToHttps', { prefixUrl: serverHttp.url, agent: { http: httpAgent, https: httpsAgent } })).body); t.true(httpSpy.calledOnce); t.true(httpsSpy.calledOnce); // Make sure to close all open sockets httpAgent.destroy(); httpsAgent.destroy(); }); }); test('redirects from https to http work with an agent object', withHttpsServer(), async (t, serverHttps, got) => { await withServer(t, async (t, serverHttp) => { serverHttp.get('/', (_request, response) => { response.end('http'); }); serverHttps.get('/', (_request, response) => { response.end('https'); }); serverHttps.get('/httpsToHttp', (_request, response) => { response.writeHead(302, { location: serverHttp.url }); response.end(); }); const {agent: httpAgent, spy: httpSpy} = createAgentSpy(HttpAgent); const {agent: httpsAgent, spy: httpsSpy} = createAgentSpy(HttpsAgent); t.truthy((await got('httpsToHttp', { prefixUrl: serverHttps.url, agent: { http: httpAgent, https: httpsAgent } })).body); t.true(httpSpy.calledOnce); t.true(httpsSpy.calledOnce); // Make sure to close all open sockets httpAgent.destroy(); httpsAgent.destroy(); }); }); test('socket connect listener cleaned up after request', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {agent} = createAgentSpy(HttpsAgent); // Make sure there are no memory leaks when reusing keep-alive sockets for (let i = 0; i < 20; i++) { // eslint-disable-next-line no-await-in-loop await got({ agent: { https: agent } }); } // Node.js 12 has incomplete types for (const value of Object.values((agent as any).freeSockets) as [Socket[]]) { for (const sock of value) { t.is(sock.listenerCount('connect'), 0); } } // Make sure to close all open sockets agent.destroy(); }); { const testFn = Number(process.versions.node.split('.')[0]) < 12 ? test.failing : test; testFn('no socket hung up regression', withServer, async (t, server, got) => { const agent = new HttpAgent({keepAlive: true}); const token = 'helloworld'; server.get('/', (request, response) => { if (request.headers.token !== token) { response.statusCode = 401; response.end(); return; } response.end('ok'); }); const {body} = await got({ prefixUrl: 'http://127.0.0.1:3000', agent: { http: agent }, hooks: { afterResponse: [ async (response, retryWithMergedOptions) => { // Force clean-up response.socket?.destroy(); // Unauthorized if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token } }); } // No changes otherwise return response; } ] }, // Disable automatic retries, manual retries are allowed retry: 0 }); t.is(body, 'ok'); agent.destroy(); }); } sindresorhus-got-11d2e83/test/arguments.ts000066400000000000000000000324241434406364000207270ustar00rootroot00000000000000/* eslint-disable node/no-deprecated-api */ import {parse, URL, URLSearchParams} from 'url'; import test from 'ava'; import {Handler} from 'express'; import pEvent = require('p-event'); import got, {StrictOptions} from '../source'; import withServer, {withBodyParsingServer} from './helpers/with-server'; const echoUrl: Handler = (request, response) => { response.end(request.url); }; test('`url` is required', async t => { await t.throwsAsync( // @ts-expect-error No argument on purpose. got(), { message: 'Missing `url` property' } ); await t.throwsAsync( got(''), { message: 'No URL protocol specified' } ); await t.throwsAsync( got({ url: '' }), { message: 'No URL protocol specified' } ); }); test('`url` should be utf-8 encoded', async t => { await t.throwsAsync( got('https://example.com/%D2%E0%EB%EB%E8%ED'), { message: 'URI malformed' } ); }); test('throws if no arguments provided', async t => { // @ts-expect-error Error tests await t.throwsAsync(got(), { message: 'Missing `url` property' }); }); test('throws an error if the protocol is not specified', async t => { await t.throwsAsync(got('example.com'), { instanceOf: TypeError, message: 'Invalid URL: example.com' }); await t.throwsAsync(got({}), { message: 'Missing `url` property' }); }); test('properly encodes query string', withServer, async (t, server, got) => { server.get('/', echoUrl); const path = '?test=http://example.com?foo=bar'; const {body} = await got(path); t.is(body, '/?test=http://example.com?foo=bar'); }); test('options are optional', withServer, async (t, server, got) => { server.get('/test', echoUrl); t.is((await got('test')).body, '/test'); }); test('methods are normalized', withServer, async (t, server, got) => { server.post('/test', echoUrl); const instance = got.extend({ handlers: [ (options, next) => { if (options.method === options.method.toUpperCase()) { t.pass(); } else { t.fail(); } return next(options); } ] }); await instance('test', {method: 'post'}); }); test.failing('throws an error when legacy URL is passed', withServer, async (t, server) => { server.get('/test', echoUrl); await t.throwsAsync( // @ts-expect-error Error tests got(parse(`${server.url}/test`)), {message: 'The legacy `url.Url` has been deprecated. Use `URL` instead.'} ); await t.throwsAsync( got({ protocol: 'http:', hostname: 'localhost', port: server.port }), {message: 'The legacy `url.Url` has been deprecated. Use `URL` instead.'} ); }); test('accepts legacy URL options', withServer, async (t, server) => { server.get('/test', echoUrl); const {body: secondBody} = await got({ protocol: 'http:', hostname: 'localhost', port: server.port, pathname: '/test' }); t.is(secondBody, '/test'); }); test('overrides `searchParams` from options', withServer, async (t, server, got) => { server.get('/', echoUrl); const {body} = await got( '?drop=this', { searchParams: { test: 'wow' } } ); t.is(body, '/?test=wow'); }); test('does not duplicate `searchParams`', withServer, async (t, server, got) => { server.get('/', echoUrl); const instance = got.extend({ searchParams: new URLSearchParams({foo: '123'}) }); const body = await instance('?bar=456').text(); t.is(body, '/?foo=123'); }); test('escapes `searchParams` parameter values', withServer, async (t, server, got) => { server.get('/', echoUrl); const {body} = await got({ searchParams: { test: 'it’s ok' } }); t.is(body, '/?test=it%E2%80%99s+ok'); }); test('the `searchParams` option can be a URLSearchParams', withServer, async (t, server, got) => { server.get('/', echoUrl); const searchParameters = new URLSearchParams({test: 'wow'}); const {body} = await got({searchParams: searchParameters}); t.is(body, '/?test=wow'); }); test('ignores empty searchParams object', withServer, async (t, server, got) => { server.get('/test', echoUrl); t.is((await got('test', {searchParams: {}})).requestUrl, `${server.url}/test`); }); test('throws when passing body with a non payload method', async t => { await t.throwsAsync(got('https://example.com', {body: 'asdf'}), { message: 'The `GET` method cannot be used with a body' }); }); test('`allowGetBody` option', withServer, async (t, server, got) => { server.get('/test', echoUrl); const url = new URL(`${server.url}/test`); await t.notThrowsAsync(got(url, {body: 'asdf', allowGetBody: true})); }); test('WHATWG URL support', withServer, async (t, server, got) => { server.get('/test', echoUrl); const url = new URL(`${server.url}/test`); await t.notThrowsAsync(got(url)); }); test('returns streams when using `isStream` option', withServer, async (t, server, got) => { server.get('/stream', (_request, response) => { response.end('ok'); }); const data = await pEvent(got('stream', {isStream: true}), 'data'); t.is(data.toString(), 'ok'); }); test('accepts `url` as an option', withServer, async (t, server, got) => { server.get('/test', echoUrl); await t.notThrowsAsync(got({url: 'test'})); }); test('can omit `url` option if using `prefixUrl`', withServer, async (t, server, got) => { server.get('/', echoUrl); await t.notThrowsAsync(got({})); }); test('throws TypeError when known `options.hooks` value is not an array', async t => { await t.throwsAsync( // @ts-expect-error Error tests got('https://example.com', {hooks: {beforeRequest: {}}}), { message: 'Parameter `beforeRequest` must be an Array, got Object' } ); }); test('throws TypeError when known `options.hooks` array item is not a function', async t => { await t.throwsAsync( // @ts-expect-error Error tests got('https://example.com', {hooks: {beforeRequest: [{}]}}), { message: 'hook is not a function' } ); }); test('allows extra keys in `options.hooks`', withServer, async (t, server, got) => { server.get('/test', echoUrl); // @ts-expect-error We do not allow extra keys in hooks but this won't throw await t.notThrowsAsync(got('test', {hooks: {extra: []}})); }); test('`prefixUrl` option works', withServer, async (t, server, got) => { server.get('/test/foobar', echoUrl); const instanceA = got.extend({prefixUrl: `${server.url}/test`}); const {body} = await instanceA('foobar'); t.is(body, '/test/foobar'); }); test('accepts WHATWG URL as the `prefixUrl` option', withServer, async (t, server, got) => { server.get('/test/foobar', echoUrl); const instanceA = got.extend({prefixUrl: new URL(`${server.url}/test`)}); const {body} = await instanceA('foobar'); t.is(body, '/test/foobar'); }); test('backslash in the end of `prefixUrl` option is optional', withServer, async (t, server) => { server.get('/test/foobar', echoUrl); const instanceA = got.extend({prefixUrl: `${server.url}/test/`}); const {body} = await instanceA('foobar'); t.is(body, '/test/foobar'); }); test('`prefixUrl` can be changed if the URL contains the old one', withServer, async (t, server) => { server.get('/', echoUrl); const instanceA = got.extend({ prefixUrl: `${server.url}/meh`, handlers: [ (options, next) => { options.prefixUrl = server.url; return next(options); } ] }); const {body} = await instanceA(''); t.is(body, '/'); }); test('throws if cannot change `prefixUrl`', async t => { const instanceA = got.extend({ prefixUrl: 'https://example.com', handlers: [ (options, next) => { options.url = new URL('https://google.pl'); options.prefixUrl = 'https://example.com'; return next(options); } ] }); await t.throwsAsync(instanceA(''), {message: 'Cannot change `prefixUrl` from https://example.com/ to https://example.com: https://google.pl/'}); }); test('throws if the `searchParams` value is invalid', async t => { await t.throwsAsync(got('https://example.com', { searchParams: { // @ts-expect-error Error tests foo: [] } }), { instanceOf: TypeError, message: 'The `searchParams` value \'\' must be a string, number, boolean or null' }); }); test('`context` option is not enumerable', withServer, async (t, server, got) => { server.get('/', echoUrl); const context = { foo: 'bar' }; await got({ context, hooks: { beforeRequest: [ options => { t.is(options.context, context); t.false({}.propertyIsEnumerable.call(options, 'context')); } ] } }); }); test('`context` option is accessible when using hooks', withServer, async (t, server, got) => { server.get('/', echoUrl); const context = { foo: 'bar' }; await got({ context, hooks: { beforeRequest: [ options => { t.is(options.context, context); t.false({}.propertyIsEnumerable.call(options, 'context')); } ] } }); }); test('`context` option is accessible when extending instances', t => { const context = { foo: 'bar' }; const instance = got.extend({context}); t.is(instance.defaults.options.context, context); t.false({}.propertyIsEnumerable.call(instance.defaults.options, 'context')); }); test('throws if `options.encoding` is `null`', async t => { await t.throwsAsync(got('https://example.com', { // @ts-expect-error For testing purposes encoding: null }), {message: 'To get a Buffer, set `options.responseType` to `buffer` instead'}); }); test('`url` option and input argument are mutually exclusive', async t => { await t.throwsAsync(got('https://example.com', { url: 'https://example.com' }), {message: 'The `url` option is mutually exclusive with the `input` argument'}); }); test('throws a helpful error when passing `followRedirects`', async t => { await t.throwsAsync(got('https://example.com', { // @ts-expect-error For testing purposes followRedirects: true }), {message: 'The `followRedirects` option does not exist. Use `followRedirect` instead.'}); }); test('merges `searchParams` instances', t => { const instance = got.extend({ searchParams: new URLSearchParams('a=1') }, { searchParams: new URLSearchParams('b=2') }); t.is(instance.defaults.options.searchParams!.get('a'), '1'); t.is(instance.defaults.options.searchParams!.get('b'), '2'); }); test('throws a helpful error when passing `auth`', async t => { await t.throwsAsync(got('https://example.com', { // @ts-expect-error For testing purposes auth: 'username:password' }), { message: 'Parameter `auth` is deprecated. Use `username` / `password` instead.' }); }); test('throws on leading slashes', async t => { await t.throwsAsync(got('/asdf', {prefixUrl: 'https://example.com'}), { message: '`input` must not start with a slash when using `prefixUrl`' }); }); test('throws on invalid `dnsCache` option', async t => { await t.throwsAsync(got('https://example.com', { // @ts-expect-error Error tests dnsCache: 123 }), {message: 'Parameter `dnsCache` must be a CacheableLookup instance or a boolean, got number'}); }); test('throws on invalid `agent` option', async t => { await t.throwsAsync(got('https://example.com', { agent: { // @ts-expect-error Error tests asdf: 123 } }), {message: 'Expected the `options.agent` properties to be `http`, `https` or `http2`, got `asdf`'}); }); test('fallbacks to native http if `request(...)` returns undefined', withServer, async (t, server, got) => { server.get('/', echoUrl); const {body} = await got('', {request: () => undefined}); t.is(body, '/'); }); test('strict options', withServer, async (t, server, got) => { server.get('/', echoUrl); const options: StrictOptions = {}; const {body} = await got(options); t.is(body, '/'); }); test('does not throw on frozen options', withServer, async (t, server, got) => { server.get('/', echoUrl); const options: StrictOptions = {}; Object.freeze(options); const {body} = await got(options); t.is(body, '/'); }); test('encodes query string included in input', t => { const {url} = got.mergeOptions({ url: new URL('https://example.com/?a=b c') }); t.is(url.search, '?a=b%20c'); }); test('normalizes search params included in options', t => { const {url} = got.mergeOptions({ url: new URL('https://example.com'), searchParams: 'a=b c' }); t.is(url.search, '?a=b+c'); }); test('reuse options while using init hook', withServer, async (t, server, got) => { t.plan(2); server.get('/', echoUrl); const options = { hooks: { init: [ () => { t.pass(); } ] } }; await got('', options); await got('', options); }); test('allowGetBody sends json payload', withBodyParsingServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.body.hello !== 'world') { response.statusCode = 400; } response.end(); }); const {statusCode} = await got({ allowGetBody: true, json: {hello: 'world'}, retry: 0, throwHttpErrors: false }); t.is(statusCode, 200); }); test('no URL pollution', withServer, async (t, server) => { server.get('/ok', echoUrl); const url = new URL(server.url); const {body} = await got(url, { hooks: { beforeRequest: [ options => { options.url.pathname = '/ok'; } ] } }); t.is(url.pathname, '/'); t.is(body, '/ok'); }); test('prefixUrl is properly replaced when extending', withServer, async (t, server) => { server.get('/', (request, response) => { response.end(request.url); }); server.get('/other/path/', (request, response) => { response.end(request.url); }); const parent = got.extend({prefixUrl: server.url}); const child = parent.extend({prefixUrl: `${server.url}/other/path/`}); t.is(await child.get('').text(), '/other/path/'); }); sindresorhus-got-11d2e83/test/cache.ts000066400000000000000000000217671434406364000177750ustar00rootroot00000000000000import {promisify} from 'util'; import {gzip} from 'zlib'; import test from 'ava'; import pEvent = require('p-event'); import getStream = require('get-stream'); import {Handler} from 'express'; import got, {Response} from '../source'; import withServer from './helpers/with-server'; import CacheableLookup from 'cacheable-lookup'; import delay = require('delay'); const cacheEndpoint: Handler = (_request, response) => { response.setHeader('Cache-Control', 'public, max-age=60'); response.end(Date.now().toString()); }; test('non-cacheable responses are not cached', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Cache-Control', 'public, no-cache, no-store'); response.end(Date.now().toString()); }); const cache = new Map(); const firstResponseInt = Number((await got({cache})).body); const secondResponseInt = Number((await got({cache})).body); t.is(cache.size, 0); t.true(firstResponseInt < secondResponseInt); }); test('cacheable responses are cached', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const firstResponse = await got({cache}); const secondResponse = await got({cache}); t.is(cache.size, 1); t.is(firstResponse.body, secondResponse.body); }); test('cached response is re-encoded to current encoding option', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const firstEncoding = 'base64'; const secondEncoding = 'hex'; const firstResponse = await got({cache, encoding: firstEncoding}); const secondResponse = await got({cache, encoding: secondEncoding}); const expectedSecondResponseBody = Buffer.from(firstResponse.body, firstEncoding).toString(secondEncoding); t.is(cache.size, 1); t.is(secondResponse.body, expectedSecondResponseBody); }); test('redirects are cached and re-used internally', withServer, async (t, server, got) => { let status301Index = 0; server.get('/301', (_request, response) => { if (status301Index === 0) { response.setHeader('Cache-Control', 'public, max-age=60'); response.setHeader('Location', '/'); response.statusCode = 301; } response.end(); status301Index++; }); let status302Index = 0; server.get('/302', (_request, response) => { if (status302Index === 0) { response.setHeader('Cache-Control', 'public, max-age=60'); response.setHeader('Location', '/'); response.statusCode = 302; } response.end(); status302Index++; }); server.get('/', cacheEndpoint); const cache = new Map(); const A1 = await got('301', {cache}); const B1 = await got('302', {cache}); const A2 = await got('301', {cache}); const B2 = await got('302', {cache}); t.is(cache.size, 3); t.is(A1.body, B1.body); t.is(A1.body, A2.body); t.is(B1.body, B2.body); }); test('cached response has got options', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const options = { username: 'foo', cache }; await got(options); const secondResponse = await got(options); t.is(secondResponse.request.options.username, options.username); }); test('cache error throws `got.CacheError`', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const cache = {}; // @ts-expect-error Error tests await t.throwsAsync(got({cache}), { instanceOf: got.CacheError, code: 'ERR_CACHE_ACCESS' }); }); test('doesn\'t cache response when received HTTP error', withServer, async (t, server, got) => { let isFirstErrorCalled = false; server.get('/', (_request, response) => { if (!isFirstErrorCalled) { response.end('ok'); return; } isFirstErrorCalled = true; response.statusCode = 502; response.end('received 502'); }); const cache = new Map(); const {statusCode, body} = await got({url: '', cache, throwHttpErrors: false}); t.is(statusCode, 200); t.is(body, 'ok'); }); test('DNS cache works', async t => { const instance = got.extend({ dnsCache: true }); await t.notThrowsAsync(instance('https://example.com')); // @ts-expect-error t.is(instance.defaults.options.dnsCache!._cache.size, 1); }); test('DNS cache works - CacheableLookup instance', async t => { const cache = new CacheableLookup(); await t.notThrowsAsync(got('https://example.com', {dnsCache: cache})); t.is((cache as any)._cache.size, 1); }); test('`isFromCache` stream property is undefined before the `response` event', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const stream = got.stream({cache}); t.is(stream.isFromCache, undefined); await getStream(stream); }); test('`isFromCache` stream property is false after the `response` event', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const stream = got.stream({cache}); const response: Response = await pEvent(stream, 'response'); t.is(response.isFromCache, false); t.is(stream.isFromCache, false); await getStream(stream); }); test('`isFromCache` stream property is true if the response was cached', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); await getStream(got.stream({cache})); const stream = got.stream({cache}); const response: Response = await pEvent(stream, 'response'); t.is(response.isFromCache, true); t.is(stream.isFromCache, true); await getStream(stream); }); test('can disable cache by extending the instance', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const instance = got.extend({cache}); await getStream(instance.stream('')); const stream = instance.extend({cache: false}).stream(''); const response: Response = await pEvent(stream, 'response'); t.is(response.isFromCache, false); t.is(stream.isFromCache, false); await getStream(stream); }); test('does not break POST requests', withServer, async (t, server, got) => { server.post('/', async (request, response) => { request.resume(); response.end(JSON.stringify(request.headers)); }); const headers = await got.post('', { body: '', cache: new Map() }).json<{'content-length': string}>(); t.is(headers['content-length'], '0'); }); test('decompresses cached responses', withServer, async (t, server, got) => { const etag = 'foobar'; const payload = JSON.stringify({foo: 'bar'}); const compressed = await promisify(gzip)(payload); server.get('/', (request, response) => { if (request.headers['if-none-match'] === etag) { response.statusCode = 304; response.end(); } else { response.setHeader('content-encoding', 'gzip'); response.setHeader('cache-control', 'public, max-age=60'); response.setHeader('etag', etag); response.end(compressed); } }); const cache = new Map(); for (let i = 0; i < 2; i++) { // eslint-disable-next-line no-await-in-loop await t.notThrowsAsync(got({ cache, responseType: 'json', decompress: true, retry: 2 })); } t.is(cache.size, 1); }); test('can replace the instance\'s HTTP cache', withServer, async (t, server, got) => { server.get('/', cacheEndpoint); const cache = new Map(); const secondCache = new Map(); const instance = got.extend({ mutableDefaults: true, cache }); await t.notThrowsAsync(instance('')); await t.notThrowsAsync(instance('')); instance.defaults.options.cache = secondCache; await t.notThrowsAsync(instance('')); await t.notThrowsAsync(instance('')); t.is(cache.size, 1); t.is(secondCache.size, 1); }); test('does not hang on huge response', withServer, async (t, server, got) => { const bufferSize = 3 * 16 * 1024; const times = 10; const buffer = Buffer.alloc(bufferSize); server.get('/', async (_request, response) => { for (let i = 0; i < 10; i++) { response.write(buffer); // eslint-disable-next-line no-await-in-loop await delay(100); } response.end(); }); const body = await got('', { cache: new Map() }).buffer(); t.is(body.length, bufferSize * times); }); test('cached response ETag', withServer, async (t, server, got) => { const etag = 'foobar'; const body = 'responseBody'; server.get('/', (request, response) => { if (request.headers['if-none-match'] === etag) { response.writeHead(304); response.end(); } else { response.writeHead(200, {ETag: etag}); response.end(body); } }); const cache = new Map(); const originalResponse = await got({cache}); t.false(originalResponse.isFromCache); t.is(originalResponse.body, body); await delay(100); // Added small delay in order to wait the cache to be populated t.is(cache.size, 1); const cachedResponse = await got({cache}); t.true(cachedResponse.isFromCache); t.is(cachedResponse.body, body); }); test('works with http2', async t => { const cache = new Map(); const client = got.extend({ http2: true, cache }); await t.notThrowsAsync(client('https://httpbin.org/anything')); }); test('http-cache-semantics typings', t => { const instance = got.extend({ cacheOptions: { shared: false } }); t.is(instance.defaults.options.cacheOptions.shared, false); }); sindresorhus-got-11d2e83/test/cancel.ts000066400000000000000000000161231434406364000201450ustar00rootroot00000000000000import {EventEmitter} from 'events'; import {Readable as ReadableStream} from 'stream'; import stream = require('stream'); import test from 'ava'; import delay = require('delay'); import pEvent = require('p-event'); import getStream = require('get-stream'); import {Handler} from 'express'; import got, {CancelError} from '../source'; import slowDataStream from './helpers/slow-data-stream'; import {GlobalClock} from './helpers/types'; import {ExtendedHttpTestServer} from './helpers/create-http-test-server'; import withServer, {withServerAndFakeTimers} from './helpers/with-server'; const prepareServer = (server: ExtendedHttpTestServer, clock: GlobalClock): {emitter: EventEmitter; promise: Promise} => { const emitter = new EventEmitter(); const promise = new Promise((resolve, reject) => { server.all('/abort', async (request, response) => { emitter.emit('connection'); request.once('aborted', resolve); response.once('finish', reject.bind(null, new Error('Request finished instead of aborting.'))); try { await pEvent(request, 'end'); } catch { // Node.js 15.0.0 throws AND emits `aborted` } response.end(); }); server.get('/redirect', (_request, response) => { response.writeHead(302, { location: `${server.url}/abort` }); response.end(); emitter.emit('sentRedirect'); clock.tick(3000); resolve(); }); }); return {emitter, promise}; }; const downloadHandler = (clock: GlobalClock): Handler => (_request, response) => { response.writeHead(200, { 'transfer-encoding': 'chunked' }); response.flushHeaders(); stream.pipeline( slowDataStream(clock), response, () => { response.end(); } ); }; test.serial('does not retry after cancelation', withServerAndFakeTimers, async (t, server, got, clock) => { const {emitter, promise} = prepareServer(server, clock); const gotPromise = got('redirect', { retry: { calculateDelay: () => { t.fail('Makes a new try after cancelation'); return 0; } } }); emitter.once('sentRedirect', () => { gotPromise.cancel(); }); await t.throwsAsync(gotPromise, { instanceOf: CancelError, code: 'ERR_CANCELED' }); await t.notThrowsAsync(promise, 'Request finished instead of aborting.'); }); test.serial('cleans up request timeouts', withServer, async (t, server, got) => { server.get('/', () => {}); const gotPromise = got({ timeout: 10, retry: { calculateDelay: ({computedValue}) => { process.nextTick(() => gotPromise.cancel()); if (computedValue) { return 20; } return 0; }, limit: 1 } }); await t.throwsAsync(gotPromise, { instanceOf: CancelError, code: 'ERR_CANCELED' }); // Wait for unhandled errors await delay(40); }); test.serial('cancels in-progress request', withServerAndFakeTimers, async (t, server, got, clock) => { const {emitter, promise} = prepareServer(server, clock); const body = new ReadableStream({ read() {} }); body.push('1'); const gotPromise = got.post('abort', {body}); // Wait for the connection to be established before canceling emitter.once('connection', () => { gotPromise.cancel(); body.push(null); }); await t.throwsAsync(gotPromise, { instanceOf: CancelError, code: 'ERR_CANCELED' }); await t.notThrowsAsync(promise, 'Request finished instead of aborting.'); }); test.serial('cancels in-progress request with timeout', withServerAndFakeTimers, async (t, server, got, clock) => { const {emitter, promise} = prepareServer(server, clock); const body = new ReadableStream({ read() {} }); body.push('1'); const gotPromise = got.post('abort', {body, timeout: 10000}); // Wait for the connection to be established before canceling emitter.once('connection', () => { gotPromise.cancel(); body.push(null); }); await t.throwsAsync(gotPromise, { instanceOf: CancelError, code: 'ERR_CANCELED' }); await t.notThrowsAsync(promise, 'Request finished instead of aborting.'); }); test.serial('cancel immediately', withServerAndFakeTimers, async (t, server, got, clock) => { const promise = new Promise((resolve, reject) => { // We won't get an abort or even a connection // We assume no request within 1000ms equals a (client side) aborted request server.get('/abort', (_request, response) => { response.once('finish', reject.bind(global, new Error('Request finished instead of aborting.'))); response.end(); }); clock.tick(1000); resolve(); }); const gotPromise = got('abort'); gotPromise.cancel(); await t.throwsAsync(gotPromise); await t.notThrowsAsync(promise, 'Request finished instead of aborting.'); }); test('recover from cancelation using cancelable promise attribute', async t => { // Canceled before connection started const p = got('http://example.com'); const recover = p.catch((error: Error) => { if (p.isCanceled) { return; } throw error; }); p.cancel(); await t.notThrowsAsync(recover); }); test('recover from cancellation using error instance', async t => { // Canceled before connection started const p = got('http://example.com'); const recover = p.catch((error: Error) => { if (error instanceof got.CancelError) { return; } throw error; }); p.cancel(); await t.notThrowsAsync(recover); }); test.serial('throws on incomplete (canceled) response - promise', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', downloadHandler(clock)); await t.throwsAsync( got({ timeout: {request: 500}, retry: 0 }), {instanceOf: got.TimeoutError} ); }); test.serial('throws on incomplete (canceled) response - promise #2', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', downloadHandler(clock)); const promise = got('').on('response', () => { clock.tick(500); promise.cancel(); }); await t.throwsAsync(promise, { instanceOf: got.CancelError, code: 'ERR_CANCELED' }); }); test.serial('throws on incomplete (canceled) response - stream', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', downloadHandler(clock)); const errorString = 'Foobar'; const stream = got.stream('').on('response', () => { clock.tick(500); stream.destroy(new Error(errorString)); }); await t.throwsAsync(getStream(stream), {message: errorString}); }); // Note: it will throw, but the response is loaded already. test('throws when canceling cached request', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Cache-Control', 'public, max-age=60'); response.end(Date.now().toString()); }); const cache = new Map(); await got({cache}); const promise = got({cache}).on('response', () => { promise.cancel(); }); await t.throwsAsync(promise, { instanceOf: got.CancelError, code: 'ERR_CANCELED' }); }); test('throws when canceling cached request #2', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Cache-Control', 'public, max-age=60'); response.end(Date.now().toString()); }); const cache = new Map(); await got({cache}); const promise = got({cache}); promise.cancel(); await t.throwsAsync(promise, { instanceOf: got.CancelError, code: 'ERR_CANCELED' }); }); sindresorhus-got-11d2e83/test/cookies.ts000066400000000000000000000130721434406364000203540ustar00rootroot00000000000000import net = require('net'); import test from 'ava'; import toughCookie = require('tough-cookie'); import delay = require('delay'); import got from '../source'; import withServer from './helpers/with-server'; test('reads a cookie', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('set-cookie', 'hello=world'); response.end(); }); const cookieJar = new toughCookie.CookieJar(); await got({cookieJar}); const cookie = cookieJar.getCookiesSync(server.url)[0]; t.is(cookie.key, 'hello'); t.is(cookie.value, 'world'); }); test('reads multiple cookies', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('set-cookie', ['hello=world', 'foo=bar']); response.end(); }); const cookieJar = new toughCookie.CookieJar(); await got({cookieJar}); const cookies = cookieJar.getCookiesSync(server.url); const cookieA = cookies[0]; t.is(cookieA.key, 'hello'); t.is(cookieA.value, 'world'); const cookieB = cookies[1]; t.is(cookieB.key, 'foo'); t.is(cookieB.value, 'bar'); }); test('cookies doesn\'t break on redirects', withServer, async (t, server, got) => { server.get('/redirect', (_request, response) => { response.setHeader('set-cookie', ['hello=world', 'foo=bar']); response.setHeader('location', '/'); response.statusCode = 302; response.end(); }); server.get('/', (request, response) => { response.end(request.headers.cookie ?? ''); }); const cookieJar = new toughCookie.CookieJar(); const {body} = await got('redirect', {cookieJar}); t.is(body, 'hello=world; foo=bar'); }); test('throws on invalid cookies', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('set-cookie', 'hello=world; domain=localhost'); response.end(); }); const cookieJar = new toughCookie.CookieJar(); await t.throwsAsync(got({cookieJar}), {message: 'Cookie has domain set to a public suffix'}); }); test('does not throw on invalid cookies when options.ignoreInvalidCookies is set', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('set-cookie', 'hello=world; domain=localhost'); response.end(); }); const cookieJar = new toughCookie.CookieJar(); await got({ cookieJar, ignoreInvalidCookies: true }); const cookies = cookieJar.getCookiesSync(server.url); t.is(cookies.length, 0); }); test('catches store errors', async t => { const error = 'Some error'; const cookieJar = new toughCookie.CookieJar({ findCookies: (_, __, ___, callback) => { callback(new Error(error), []); }, findCookie: () => {}, getAllCookies: () => {}, putCookie: () => {}, removeCookies: () => {}, removeCookie: () => {}, updateCookie: () => {}, synchronous: false }); await t.throwsAsync(got('https://example.com', {cookieJar}), {message: error}); }); test('overrides options.headers.cookie', withServer, async (t, server, got) => { server.get('/redirect', (_request, response) => { response.setHeader('set-cookie', ['hello=world', 'foo=bar']); response.setHeader('location', '/'); response.statusCode = 302; response.end(); }); server.get('/', (request, response) => { response.end(request.headers.cookie ?? ''); }); const cookieJar = new toughCookie.CookieJar(); const {body} = await got('redirect', { cookieJar, headers: { cookie: 'a=b' } }); t.is(body, 'hello=world; foo=bar'); }); test('no unhandled errors', async t => { const server = net.createServer(connection => { connection.end('blah'); }).listen(0); const message = 'snap!'; const options = { cookieJar: { setCookie: async (_rawCookie: string, _url: string) => {}, getCookieString: async (_url: string) => { throw new Error(message); } } }; await t.throwsAsync(got(`http://127.0.0.1:${(server.address() as net.AddressInfo).port}`, options), {message}); await delay(500); t.pass(); server.close(); }); test('accepts custom `cookieJar` object', withServer, async (t, server, got) => { server.get('/', (request, response) => { response.setHeader('set-cookie', ['hello=world']); response.end(request.headers.cookie); }); const cookies: Record = {}; const cookieJar = { async getCookieString(url: string) { t.is(typeof url, 'string'); return cookies[url] || ''; }, async setCookie(rawCookie: string, url: string) { cookies[url] = rawCookie; } }; const first = await got('', {cookieJar}); const second = await got('', {cookieJar}); t.is(first.body, ''); t.is(second.body, 'hello=world'); }); test('throws on invalid `options.cookieJar.setCookie`', async t => { await t.throwsAsync(got('https://example.com', { cookieJar: { // @ts-expect-error Error tests setCookie: 123 } }), {message: 'Expected value which is `Function`, received value of type `number`.'}); }); test('throws on invalid `options.cookieJar.getCookieString`', async t => { await t.throwsAsync(got('https://example.com', { cookieJar: { setCookie: async () => {}, // @ts-expect-error Error tests getCookieString: 123 } }), {message: 'Expected value which is `Function`, received value of type `number`.'}); }); test('cookies are cleared when redirecting to a different hostname (no cookieJar)', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: 'https://httpbin.org/anything' }); response.end(); }); const {headers} = await got('', { headers: { cookie: 'foo=bar', 'user-agent': 'custom' } }).json(); t.is(headers.Cookie, undefined); t.is(headers['User-Agent'], 'custom'); }); sindresorhus-got-11d2e83/test/create.ts000066400000000000000000000204711434406364000201640ustar00rootroot00000000000000import {Agent as HttpAgent, IncomingMessage, request as httpRequest, RequestOptions} from 'http'; import {URL} from 'url'; import test from 'ava'; import is from '@sindresorhus/is'; import {Handler} from 'express'; import got, { BeforeRequestHook, Headers, Hooks, RequestFunction } from '../source'; import withServer from './helpers/with-server'; const echoHeaders: Handler = (request, response) => { request.resume(); response.end(JSON.stringify(request.headers)); }; test('preserves global defaults', withServer, async (t, server, got) => { server.get('/', echoHeaders); const globalHeaders = await got('').json(); const instanceHeaders = await got.extend()('').json(); t.deepEqual(instanceHeaders, globalHeaders); }); test('supports instance defaults', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instance = got.extend({ headers: { 'user-agent': 'custom-ua-string' } }); const headers = await instance('').json(); t.is(headers['user-agent'], 'custom-ua-string'); }); test('supports invocation overrides', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instance = got.extend({ headers: { 'user-agent': 'custom-ua-string' } }); const headers = await instance({ headers: { 'user-agent': 'different-ua-string' } }).json(); t.is(headers['user-agent'], 'different-ua-string'); }); test('carries previous instance defaults', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instanceA = got.extend({ headers: { 'x-foo': 'foo' } }); const instanceB = instanceA.extend({ headers: { 'x-bar': 'bar' } }); const headers = await instanceB('').json(); t.is(headers['x-foo'], 'foo'); t.is(headers['x-bar'], 'bar'); }); test('custom headers (extend)', withServer, async (t, server, got) => { server.get('/', echoHeaders); const options = {headers: {unicorn: 'rainbow'}}; const instance = got.extend(options); const headers = await instance('').json(); t.is(headers.unicorn, 'rainbow'); }); test('extend overwrites arrays with a deep clone', t => { const beforeRequest = [0]; const a = got.extend({hooks: {beforeRequest} as unknown as Hooks}); beforeRequest[0] = 1; t.deepEqual(a.defaults.options.hooks.beforeRequest, [0] as unknown as BeforeRequestHook[]); t.not(a.defaults.options.hooks.beforeRequest, beforeRequest as unknown as BeforeRequestHook[]); }); test('extend keeps the old value if the new one is undefined', t => { const a = got.extend({headers: undefined}); t.deepEqual( a.defaults.options.headers, got.defaults.options.headers ); }); test('hooks are merged on got.extend()', t => { const hooksA = [() => {}]; const hooksB = [() => {}]; const instanceA = got.extend({hooks: {beforeRequest: hooksA}}); const extended = instanceA.extend({hooks: {beforeRequest: hooksB}}); t.deepEqual(extended.defaults.options.hooks.beforeRequest, hooksA.concat(hooksB)); }); test('custom endpoint with custom headers (extend)', withServer, async (t, server) => { server.all('/', echoHeaders); const instance = got.extend({headers: {unicorn: 'rainbow'}, prefixUrl: server.url}); const headers = await instance('').json(); t.is(headers.unicorn, 'rainbow'); t.not(headers['user-agent'], undefined); }); test('no tampering with defaults', t => { t.throws(() => { got.defaults.options.prefixUrl = 'http://google.com'; }); t.is(got.defaults.options.prefixUrl, ''); }); test('can set defaults to `got.mergeOptions(...)`', t => { const instance = got.extend({ mutableDefaults: true, followRedirect: false }); t.notThrows(() => { instance.defaults.options = got.mergeOptions(instance.defaults.options, { followRedirect: true }); }); t.true(instance.defaults.options.followRedirect); t.notThrows(() => { instance.defaults.options = got.mergeOptions({}); }); t.is(instance.defaults.options.followRedirect, undefined); }); test('can set mutable defaults using got.extend', t => { const instance = got.extend({ mutableDefaults: true, followRedirect: false }); t.notThrows(() => { instance.defaults.options.followRedirect = true; }); t.true(instance.defaults.options.followRedirect); }); test('only plain objects are freezed', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instance = got.extend({ agent: { http: new HttpAgent({keepAlive: true}) }, mutableDefaults: true }); t.notThrows(() => { (instance.defaults.options.agent as any).http.keepAlive = true; }); }); test('defaults are cloned on instance creation', t => { const options = {foo: 'bar', hooks: {beforeRequest: [() => {}]}}; const instance = got.extend(options); t.notThrows(() => { options.foo = 'foo'; delete options.hooks.beforeRequest[0]; }); // @ts-expect-error This IS correct t.not(options.foo, instance.defaults.options.foo); t.not(options.hooks.beforeRequest, instance.defaults.options.hooks.beforeRequest); }); test('ability to pass a custom request method', withServer, async (t, server, got) => { server.get('/', echoHeaders); let isCalled = false; const request: RequestFunction = (...args: [ string | URL | RequestOptions, (RequestOptions | ((response: IncomingMessage) => void))?, ((response: IncomingMessage) => void)? ]) => { isCalled = true; // @ts-expect-error Overload error return httpRequest(...args); }; const instance = got.extend({request}); await instance(''); t.true(isCalled); }); test('does not include the `request` option in normalized `http` options', withServer, async (t, server, got) => { server.get('/', echoHeaders); let isCalled = false; const request: RequestFunction = (...args: [ string | URL | RequestOptions, (RequestOptions | ((response: IncomingMessage) => void))?, ((response: IncomingMessage) => void)? ]) => { isCalled = true; t.false(Reflect.has(args[0] as RequestOptions, 'request')); // @ts-expect-error Overload error return httpRequest(...args); }; const instance = got.extend({request}); await instance(''); t.true(isCalled); }); test('should pass an options object into an initialization hook after .extend', withServer, async (t, server, got) => { t.plan(1); server.get('/', echoHeaders); const instance = got.extend({ hooks: { init: [ options => { t.deepEqual(options, {}); } ] } }); await instance(''); }); test('hooks aren\'t overriden when merging options', withServer, async (t, server, got) => { server.get('/', echoHeaders); let isCalled = false; const instance = got.extend({ hooks: { beforeRequest: [ () => { isCalled = true; } ] } }); await instance({}); t.true(isCalled); }); test('extend with custom handlers', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instance = got.extend({ handlers: [ (options, next) => { options.headers.unicorn = 'rainbow'; return next(options); } ] }); const headers = await instance('').json(); t.is(headers.unicorn, 'rainbow'); }); test('extend with instances', t => { const a = got.extend({prefixUrl: new URL('https://example.com/')}); const b = got.extend(a); t.is(b.defaults.options.prefixUrl.toString(), 'https://example.com/'); }); test('extend with a chain', t => { const a = got.extend({prefixUrl: 'https://example.com/'}); const b = got.extend(a, {headers: {foo: 'bar'}}); t.is(b.defaults.options.prefixUrl.toString(), 'https://example.com/'); t.is(b.defaults.options.headers.foo, 'bar'); }); test('async handlers', withServer, async (t, server, got) => { server.get('/', echoHeaders); const instance = got.extend({ handlers: [ async (options, next) => { const result = await next(options); // @ts-expect-error Manual tests result.modified = true; return result; } ] }); const promise = instance(''); t.true(is.function_(promise.cancel)); // @ts-expect-error Manual tests t.true((await promise).modified); }); test('async handlers can throw', async t => { const message = 'meh'; const instance = got.extend({ handlers: [ async () => { throw new Error(message); } ] }); await t.throwsAsync(instance('https://example.com'), {message}); }); test('setting dnsCache to true points to global cache', t => { const a = got.extend({ dnsCache: true }); const b = got.extend({ dnsCache: true }); t.is(a.defaults.options.dnsCache, b.defaults.options.dnsCache); }); sindresorhus-got-11d2e83/test/error.ts000066400000000000000000000205541434406364000200540ustar00rootroot00000000000000import {promisify} from 'util'; import net = require('net'); import http = require('http'); import stream = require('stream'); import test from 'ava'; import getStream = require('get-stream'); import is from '@sindresorhus/is'; import got, {RequestError, HTTPError, TimeoutError} from '../source'; import withServer from './helpers/with-server'; const pStreamPipeline = promisify(stream.pipeline); test('properties', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end('not'); }); const url = new URL(server.url); const error = await t.throwsAsync(got('')); t.truthy(error); t.truthy(error.response); t.truthy(error.options); t.false({}.propertyIsEnumerable.call(error, 'options')); t.false({}.propertyIsEnumerable.call(error, 'response')); // This fails because of TS 3.7.2 useDefineForClassFields // Class fields will always be initialized, even though they are undefined // A test to check for undefined is in place below // t.false({}.hasOwnProperty.call(error, 'code')); t.is(error.code, 'ERR_NON_2XX_3XX_RESPONSE'); t.is(error.message, 'Response code 404 (Not Found)'); t.deepEqual(error.options.url, url); t.is(error.response.headers.connection, 'close'); t.is(error.response.body, 'not'); }); test('catches dns errors', async t => { const error = await t.throwsAsync(got('http://doesntexist', {retry: 0})); t.truthy(error); t.regex(error.message, /ENOTFOUND|EAI_AGAIN/); t.is(error.options.url.host, 'doesntexist'); t.is(error.options.method, 'GET'); t.is(error.code, 'ENOTFOUND'); }); test('`options.body` form error message', async t => { // @ts-expect-error Error tests await t.throwsAsync(got.post('https://example.com', {body: Buffer.from('test'), form: ''}), { message: 'The `body`, `json` and `form` options are mutually exclusive' }); }); test('no plain object restriction on json body', withServer, async (t, server, got) => { server.post('/body', async (request, response) => { await pStreamPipeline(request, response); }); class CustomObject { a = 123; } const body = await got.post('body', {json: new CustomObject()}).json(); t.deepEqual(body, {a: 123}); }); test('default status message', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 400; response.end('body'); }); const error = await t.throwsAsync(got('')); t.is(error.response.statusCode, 400); t.is(error.response.statusMessage, 'Bad Request'); }); test('custom status message', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 400; response.statusMessage = 'Something Exploded'; response.end('body'); }); const error = await t.throwsAsync(got('')); t.is(error.response.statusCode, 400); t.is(error.response.statusMessage, 'Something Exploded'); }); test('custom body', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end('not'); }); const error = await t.throwsAsync(got('')); t.is(error.response.statusCode, 404); t.is(error.response.body, 'not'); }); test('contains Got options', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end(); }); const options: {agent: false} = { agent: false }; const error = await t.throwsAsync(got(options)); t.is(error.options.agent, options.agent); }); test('empty status message is overriden by the default one', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(400, ''); response.end('body'); }); const error = await t.throwsAsync(got('')); t.is(error.response.statusCode, 400); t.is(error.response.statusMessage, http.STATUS_CODES[400]); }); test('`http.request` error', async t => { await t.throwsAsync(got('https://example.com', { request: () => { throw new TypeError('The header content contains invalid characters'); } }), { instanceOf: got.RequestError, code: 'ERR_GOT_REQUEST_ERROR', message: 'The header content contains invalid characters' }); }); test('`http.request` pipe error', async t => { const message = 'snap!'; await t.throwsAsync(got('https://example.com', { // @ts-expect-error Error tests request: () => { const proxy = new stream.PassThrough(); const anyProxy = proxy as any; anyProxy.socket = { remoteAddress: '', prependOnceListener: () => {} }; anyProxy.headers = {}; anyProxy.abort = () => {}; proxy.resume(); proxy.read = () => { proxy.destroy(new Error(message)); return null; }; return proxy; }, throwHttpErrors: false }), { instanceOf: got.RequestError, message }); }); test('`http.request` error through CacheableRequest', async t => { await t.throwsAsync(got('https://example.com', { request: () => { throw new TypeError('The header content contains invalid characters'); }, cache: new Map() }), { instanceOf: got.RequestError, message: 'The header content contains invalid characters' }); }); test('normalization errors using convenience methods', async t => { const url = 'undefined/https://example.com'; await t.throwsAsync(got(url).json().text().buffer(), {message: `Invalid URL: ${url}`}); }); test('errors can have request property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end(); }); const error = await t.throwsAsync(got('')); t.truthy(error.response); t.truthy(error.request.downloadProgress); }); test('promise does not hang on timeout on HTTP error', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.write('asdf'); }); await t.throwsAsync(got({ timeout: 100 }), { instanceOf: TimeoutError, code: 'ETIMEDOUT' }); }); test('no uncaught parse errors', async t => { const server = net.createServer(); const listen = promisify(server.listen.bind(server)); const close = promisify(server.close.bind(server)); // @ts-expect-error TS is sooo dumb. It doesn't need an argument at all. await listen(); server.on('connection', socket => { socket.resume(); socket.end([ 'HTTP/1.1 404 Not Found', 'transfer-encoding: chunked', '', '0', '', '' ].join('\r\n')); }); await t.throwsAsync(got.head(`http://localhost:${(server.address() as net.AddressInfo).port}`), { message: /^Parse Error/ }); await close(); }); // Fails randomly on Node 10: // Blocked by https://github.com/istanbuljs/nyc/issues/619 // eslint-disable-next-line ava/no-skip-test test.skip('the old stacktrace is recovered', async t => { const error = await t.throwsAsync(got('https://example.com', { request: () => { throw new Error('foobar'); } })); t.true(error.stack!.includes('at Object.request')); // The first `at get` points to where the error was wrapped, // the second `at get` points to the real cause. t.not(error.stack!.indexOf('at get'), error.stack!.lastIndexOf('at get')); }); test.serial('custom stack trace', withServer, async (t, _server, got) => { const ErrorCaptureStackTrace = Error.captureStackTrace; const enable = () => { Error.captureStackTrace = (target: {stack: any}) => { target.stack = [ 'line 1', 'line 2' ]; }; }; const disable = () => { Error.captureStackTrace = ErrorCaptureStackTrace; }; // Node.js default behavior { const stream = got.stream(''); stream.destroy(new Error('oh no')); const caught = await t.throwsAsync(getStream(stream)); t.is(is(caught.stack), 'string'); } // Passing a custom error { enable(); const error = new Error('oh no'); disable(); const stream = got.stream(''); stream.destroy(error); const caught = await t.throwsAsync(getStream(stream)); t.is(is(caught.stack), 'string'); } // Custom global behavior { enable(); const error = new Error('oh no'); const stream = got.stream(''); stream.destroy(error); const caught = await t.throwsAsync(getStream(stream)); t.is(is(caught.stack), 'Array'); disable(); } // Passing a default error that needs some processing { const error = new Error('oh no'); enable(); const stream = got.stream(''); stream.destroy(error); const caught = await t.throwsAsync(getStream(stream)); t.is(is(caught.stack), 'Array'); disable(); } }); sindresorhus-got-11d2e83/test/fixtures/000077500000000000000000000000001434406364000202165ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/fixtures/ok000066400000000000000000000000031434406364000205430ustar00rootroot00000000000000ok sindresorhus-got-11d2e83/test/fixtures/stream-content-length000066400000000000000000000000111434406364000243530ustar00rootroot00000000000000Unicorns sindresorhus-got-11d2e83/test/gzip.ts000066400000000000000000000075751434406364000177040ustar00rootroot00000000000000import {promisify} from 'util'; import zlib = require('zlib'); import test from 'ava'; import getStream = require('get-stream'); import withServer from './helpers/with-server'; import {HTTPError, ReadError} from '../source'; const testContent = 'Compressible response content.\n'; const testContentUncompressed = 'Uncompressed response content.\n'; let gzipData: Buffer; test.before('setup', async () => { gzipData = await promisify(zlib.gzip)(testContent); }); test('decompress content', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData); }); t.is((await got('')).body, testContent); }); test('decompress content on error', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.status(404); response.end(gzipData); }); const error = await t.throwsAsync(got('')); t.is(error.response.body, testContent); }); test('decompress content - stream', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData); }); t.is((await getStream(got.stream(''))), testContent); }); test('handles gzip error', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end('Not gzipped content'); }); await t.throwsAsync(got(''), { name: 'ReadError', message: 'incorrect header check' }); }); test('no unhandled `Premature close` error', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.write('Not gzipped content'); }); await t.throwsAsync(got(''), { name: 'ReadError', message: 'incorrect header check' }); }); test('handles gzip error - stream', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end('Not gzipped content'); }); await t.throwsAsync(getStream(got.stream('')), { name: 'ReadError', message: 'incorrect header check' }); }); test('decompress option opts out of decompressing', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData); }); const {body} = await got({decompress: false, responseType: 'buffer'}); t.is(Buffer.compare(body, gzipData), 0); }); test('decompress option doesn\'t alter encoding of uncompressed responses', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end(testContentUncompressed); }); const {body} = await got({decompress: false}); t.is(body, testContentUncompressed); }); test('preserves `headers` property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData); }); t.truthy((await got('')).headers); }); test('does not break HEAD responses', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end(); }); t.is((await got.head('')).body, ''); }); test('does not ignore missing data', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData.slice(0, -1)); }); await t.throwsAsync(got(''), { instanceOf: ReadError, message: 'unexpected end of file' }); }); test('response has `url` and `requestUrl` properties', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('Content-Encoding', 'gzip'); response.end(gzipData); }); const response = await got(''); t.truthy(response.url); t.truthy(response.requestUrl); }); sindresorhus-got-11d2e83/test/headers.ts000066400000000000000000000164141434406364000203360ustar00rootroot00000000000000import fs = require('fs'); import {promisify} from 'util'; import path = require('path'); import test from 'ava'; import {Handler} from 'express'; import FormData = require('form-data'); import got, {Headers} from '../source'; import withServer from './helpers/with-server'; const supportsBrotli = typeof (process.versions as any).brotli === 'string'; const echoHeaders: Handler = (request, response) => { request.resume(); response.end(JSON.stringify(request.headers)); }; test('`user-agent`', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = await got('').json(); t.is(headers['user-agent'], 'got (https://github.com/sindresorhus/got)'); }); test('`accept-encoding`', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = await got('').json(); t.is(headers['accept-encoding'], supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate'); }); test('does not override provided `accept-encoding`', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = await got({ headers: { 'accept-encoding': 'gzip' } }).json(); t.is(headers['accept-encoding'], 'gzip'); }); test('does not remove user headers from `url` object argument', withServer, async (t, server) => { server.get('/', echoHeaders); const headers = (await got({ url: `http://${server.hostname}:${server.port}`, responseType: 'json', headers: { 'X-Request-Id': 'value' } })).body; t.is(headers.accept, 'application/json'); t.is(headers['user-agent'], 'got (https://github.com/sindresorhus/got)'); t.is(headers['accept-encoding'], supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate'); t.is(headers['x-request-id'], 'value'); }); test('does not set `accept-encoding` header when `options.decompress` is false', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = await got({ decompress: false }).json(); // @ts-expect-error Error tests t.false(Reflect.has(headers, 'accept-encoding')); }); test('`accept` header with `json` option', withServer, async (t, server, got) => { server.get('/', echoHeaders); let headers = await got('').json(); t.is(headers.accept, 'application/json'); headers = await got({ headers: { accept: '' } }).json(); t.is(headers.accept, ''); }); test('`host` header', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = await got('').json(); t.is(headers.host, `localhost:${server.port}`); }); test('transforms names to lowercase', withServer, async (t, server, got) => { server.get('/', echoHeaders); const headers = (await got({ headers: { 'ACCEPT-ENCODING': 'identity' }, responseType: 'json' })).body; t.is(headers['accept-encoding'], 'identity'); }); test('setting `content-length` to 0', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({ headers: { 'content-length': '0' }, body: 'sup' }); const headers = JSON.parse(body); t.is(headers['content-length'], '0'); }); test('sets `content-length` to `0` when requesting PUT with empty body', withServer, async (t, server, got) => { server.put('/', echoHeaders); const {body} = await got({ method: 'PUT' }); const headers = JSON.parse(body); t.is(headers['content-length'], '0'); }); test('form manual `content-type` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({ headers: { 'content-type': 'custom' }, form: { a: 1 } }); const headers = JSON.parse(body); t.is(headers['content-type'], 'custom'); }); test('form-data manual `content-type` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const form = new FormData(); form.append('a', 'b'); const {body} = await got.post({ headers: { 'content-type': 'custom' }, body: form }); const headers = JSON.parse(body); t.is(headers['content-type'], 'custom'); }); test('form-data automatic `content-type` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const form = new FormData(); form.append('a', 'b'); const {body} = await got.post({ body: form }); const headers = JSON.parse(body); t.is(headers['content-type'], `multipart/form-data; boundary=${form.getBoundary()}`); }); test('form-data sets `content-length` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const form = new FormData(); form.append('a', 'b'); const {body} = await got.post({body: form}); const headers = JSON.parse(body); t.is(headers['content-length'], '157'); }); test('stream as `options.body` sets `content-length` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const fixture = path.resolve('test/fixtures/stream-content-length'); const {size} = await promisify(fs.stat)(fixture); const {body} = await got.post({ body: fs.createReadStream(fixture) }); const headers = JSON.parse(body); t.is(Number(headers['content-length']), size); }); test('buffer as `options.body` sets `content-length` header', withServer, async (t, server, got) => { server.post('/', echoHeaders); const buffer = Buffer.from('unicorn'); const {body} = await got.post({ body: buffer }); const headers = JSON.parse(body); t.is(Number(headers['content-length']), buffer.length); }); test('throws on null value headers', async t => { await t.throwsAsync(got({ url: 'https://example.com', headers: { // @ts-expect-error Testing purposes 'user-agent': null } }), { message: 'Use `undefined` instead of `null` to delete the `user-agent` header' }); }); test('removes undefined value headers', withServer, async (t, server, got) => { server.get('/', echoHeaders); const {body} = await got({ headers: { 'user-agent': undefined } }); const headers = JSON.parse(body); t.is(headers['user-agent'], undefined); }); test('non-existent headers set to undefined are omitted', withServer, async (t, server, got) => { server.get('/', echoHeaders); const {body} = await got({ headers: { blah: undefined } }); const headers = JSON.parse(body); t.false(Reflect.has(headers, 'blah')); }); test('preserve port in host header if non-standard port', withServer, async (t, server, got) => { server.get('/', echoHeaders); const body = await got('').json(); t.is(body.host, `localhost:${server.port}`); }); test('strip port in host header if explicit standard port (:80) & protocol (HTTP)', async t => { const body = await got('http://httpbin.org:80/headers').json<{headers: Headers}>(); t.is(body.headers.Host, 'httpbin.org'); }); test('strip port in host header if explicit standard port (:443) & protocol (HTTPS)', async t => { const body = await got('https://httpbin.org:443/headers').json<{headers: Headers}>(); t.is(body.headers.Host, 'httpbin.org'); }); test('strip port in host header if implicit standard port & protocol (HTTP)', async t => { const body = await got('http://httpbin.org/headers').json<{headers: Headers}>(); t.is(body.headers.Host, 'httpbin.org'); }); test('strip port in host header if implicit standard port & protocol (HTTPS)', async t => { const body = await got('https://httpbin.org/headers').json<{headers: Headers}>(); t.is(body.headers.Host, 'httpbin.org'); }); sindresorhus-got-11d2e83/test/helpers.ts000066400000000000000000000011601434406364000203550ustar00rootroot00000000000000import test from 'ava'; import got, {HTTPError} from '../source'; import withServer from './helpers/with-server'; test('works', withServer, async (t, server) => { server.get('/', (_request, response) => { response.end('ok'); }); server.get('/404', (_request, response) => { response.statusCode = 404; response.end('not found'); }); t.is((await got.get(server.url)).body, 'ok'); const error = await t.throwsAsync(got.get(`${server.url}/404`), {instanceOf: HTTPError}); t.is(error.response.body, 'not found'); await t.throwsAsync(got.get('.com', {retry: 0}), {message: 'Invalid URL: .com'}); }); sindresorhus-got-11d2e83/test/helpers/000077500000000000000000000000001434406364000200075ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/helpers/create-http-test-server.ts000066400000000000000000000026521434406364000250650ustar00rootroot00000000000000import http = require('http'); import net = require('net'); import express = require('express'); import pify = require('pify'); import bodyParser = require('body-parser'); export type HttpServerOptions = { bodyParser?: express.NextFunction | false; }; export interface ExtendedHttpTestServer extends express.Express { http: http.Server; url: string; port: number; hostname: string; close: () => Promise; } const createHttpTestServer = async (options: HttpServerOptions = {}): Promise => { const server = express() as ExtendedHttpTestServer; server.http = http.createServer(server); server.set('etag', false); if (options.bodyParser !== false) { server.use(bodyParser.json({limit: '1mb', type: 'application/json', ...options.bodyParser})); server.use(bodyParser.text({limit: '1mb', type: 'text/plain', ...options.bodyParser})); server.use(bodyParser.urlencoded({limit: '1mb', type: 'application/x-www-form-urlencoded', extended: true, ...options.bodyParser})); server.use(bodyParser.raw({limit: '1mb', type: 'application/octet-stream', ...options.bodyParser})); } await pify(server.http.listen.bind(server.http))(); server.port = (server.http.address() as net.AddressInfo).port; server.url = `http://localhost:${(server.port)}`; server.hostname = 'localhost'; server.close = async () => pify(server.http.close.bind(server.http))(); return server; }; export default createHttpTestServer; sindresorhus-got-11d2e83/test/helpers/create-https-test-server.ts000066400000000000000000000035741434406364000252540ustar00rootroot00000000000000import https = require('https'); import net = require('net'); import express = require('express'); import pify = require('pify'); import pem = require('pem'); export type HttpsServerOptions = { commonName?: string; days?: number; }; export interface ExtendedHttpsTestServer extends express.Express { https: https.Server; caKey: Buffer; caCert: Buffer; url: string; port: number; close: () => Promise; } const createHttpsTestServer = async (options: HttpsServerOptions = {}): Promise => { const createCSR = pify(pem.createCSR); const createCertificate = pify(pem.createCertificate); const caCSRResult = await createCSR({commonName: 'authority'}); const caResult = await createCertificate({ csr: caCSRResult.csr, clientKey: caCSRResult.clientKey, selfSigned: true }); const caKey = caResult.clientKey; const caCert = caResult.certificate; const serverCSRResult = await createCSR({commonName: options.commonName ?? 'localhost'}); const serverResult = await createCertificate({ csr: serverCSRResult.csr, clientKey: serverCSRResult.clientKey, serviceKey: caKey, serviceCertificate: caCert, days: options.days ?? 365 }); const serverKey = serverResult.clientKey; const serverCert = serverResult.certificate; const server = express() as ExtendedHttpsTestServer; server.https = https.createServer( { key: serverKey, cert: serverCert, ca: caCert, requestCert: true, rejectUnauthorized: false // This should be checked by the test }, server ); server.set('etag', false); await pify(server.https.listen.bind(server.https))(); server.caKey = caKey; server.caCert = caCert; server.port = (server.https.address() as net.AddressInfo).port; server.url = `https://localhost:${(server.port)}`; server.close = async () => pify(server.https.close.bind(server.https))(); return server; }; export default createHttpsTestServer; sindresorhus-got-11d2e83/test/helpers/slow-data-stream.ts000066400000000000000000000004511434406364000235430ustar00rootroot00000000000000import {Readable} from 'stream'; import {Clock} from '@sinonjs/fake-timers'; export default (clock: Clock): Readable => { let i = 0; return new Readable({ read() { if (i++ < 10) { this.push('data\n'.repeat(100)); clock.tick(100); } else { this.push(null); } } }); }; sindresorhus-got-11d2e83/test/helpers/types.ts000066400000000000000000000006701434406364000215260ustar00rootroot00000000000000import {Server} from 'http'; import {TestServer} from 'create-test-server'; import * as FakeTimers from '@sinonjs/fake-timers'; export interface ExtendedHttpServer extends Server { socketPath: string; } export interface ExtendedTestServer extends TestServer { hostname: string; sslHostname: string; } export type InstalledClock = ReturnType; export type GlobalClock = InstalledClock | FakeTimers.NodeClock; sindresorhus-got-11d2e83/test/helpers/with-server.ts000066400000000000000000000073421434406364000226440ustar00rootroot00000000000000import {promisify} from 'util'; import * as test from 'ava'; import is from '@sindresorhus/is'; import http = require('http'); import tempy = require('tempy'); import createHttpsTestServer, {ExtendedHttpsTestServer, HttpsServerOptions} from './create-https-test-server'; import createHttpTestServer, {ExtendedHttpTestServer, HttpServerOptions} from './create-http-test-server'; import FakeTimers = require('@sinonjs/fake-timers'); import got, {InstanceDefaults, Got} from '../../source'; import {ExtendedHttpServer, GlobalClock, InstalledClock} from './types'; export type RunTestWithServer = (t: test.ExecutionContext, server: ExtendedHttpTestServer, got: Got, clock: GlobalClock) => Promise | void; export type RunTestWithHttpsServer = (t: test.ExecutionContext, server: ExtendedHttpsTestServer, got: Got, fakeTimer?: GlobalClock) => Promise | void; export type RunTestWithSocket = (t: test.ExecutionContext, server: ExtendedHttpServer) => Promise | void; const generateHook = ({install, options: testServerOptions}: {install?: boolean; options?: HttpServerOptions}): test.Macro<[RunTestWithServer]> => async (t, run) => { const clock = install ? FakeTimers.install() : FakeTimers.createClock() as GlobalClock; // Re-enable body parsing to investigate https://github.com/sindresorhus/got/issues/1186 const server = await createHttpTestServer(is.plainObject(testServerOptions) ? testServerOptions : { bodyParser: { type: () => false } as any }); const options: InstanceDefaults = { // @ts-expect-error Augmenting for test detection avaTest: t.title, handlers: [ (options, next) => { const result = next(options); clock.tick(0); // @ts-expect-error FIXME: Incompatible union type signatures result.on('response', () => { clock.tick(0); }); return result; } ] }; const preparedGot = got.extend({prefixUrl: server.url, ...options}); try { await run(t, server, preparedGot, clock); } finally { await server.close(); } if (install) { (clock as InstalledClock).uninstall(); } }; export const withBodyParsingServer = generateHook({install: false, options: {}}); export default generateHook({install: false}); export const withServerAndFakeTimers = generateHook({install: true}); const generateHttpsHook = (options?: HttpsServerOptions, installFakeTimer = false): test.Macro<[RunTestWithHttpsServer]> => async (t, run) => { const fakeTimer = installFakeTimer ? FakeTimers.install() as GlobalClock : undefined; const server = await createHttpsTestServer(options); const preparedGot = got.extend({ // @ts-expect-error Augmenting for test detection avaTest: t.title, handlers: [ (options, next) => { const result = next(options); fakeTimer?.tick(0); // @ts-expect-error FIXME: Incompatible union type signatures result.on('response', () => { fakeTimer?.tick(0); }); return result; } ], prefixUrl: server.url, https: { certificateAuthority: (server as any).caCert, rejectUnauthorized: true } }); try { await run(t, server, preparedGot, fakeTimer); } finally { await server.close(); } if (installFakeTimer) { (fakeTimer as InstalledClock).uninstall(); } }; export const withHttpsServer = generateHttpsHook; // TODO: remove this when `create-test-server` supports custom listen export const withSocketServer: test.Macro<[RunTestWithSocket]> = async (t, run) => { const socketPath = tempy.file({extension: 'socket'}); const server = http.createServer((request, response) => { server.emit(request.url!, request, response); }) as ExtendedHttpServer; server.socketPath = socketPath; await promisify(server.listen.bind(server))(socketPath); try { await run(t, server); } finally { await promisify(server.close.bind(server))(); } }; sindresorhus-got-11d2e83/test/hooks.ts000066400000000000000000000611201434406364000200400ustar00rootroot00000000000000import {URL} from 'url'; import {Agent as HttpAgent} from 'http'; import test, {Constructor} from 'ava'; import nock = require('nock'); import getStream = require('get-stream'); import FormData = require('form-data'); import sinon = require('sinon'); import delay = require('delay'); import {Handler} from 'express'; import Responselike = require('responselike'); import got, {RequestError, HTTPError, Response} from '../source'; import withServer from './helpers/with-server'; const errorString = 'oops'; const error = new Error(errorString); const echoHeaders: Handler = (request, response) => { response.end(JSON.stringify(request.headers)); }; const echoBody: Handler = async (request, response) => { response.end(await getStream(request)); }; const echoUrl: Handler = (request, response) => { response.end(request.url); }; const retryEndpoint: Handler = (request, response) => { if (request.headers.foo) { response.statusCode = 302; response.setHeader('location', '/'); response.end(); } response.statusCode = 500; response.end(); }; const redirectEndpoint: Handler = (_request, response) => { response.statusCode = 302; response.setHeader('location', '/'); response.end(); }; const createAgentSpy = (AgentClass: Constructor): {agent: T; spy: sinon.SinonSpy} => { const agent: T = new AgentClass({keepAlive: true}); // @ts-expect-error This IS correct const spy = sinon.spy(agent, 'addRequest'); return {agent, spy}; }; test('async hooks', withServer, async (t, server, got) => { server.get('/', echoHeaders); const {body} = await got>({ responseType: 'json', hooks: { beforeRequest: [ async options => { await delay(100); options.headers.foo = 'bar'; } ] } }); t.is(body.foo, 'bar'); }); test('catches init thrown errors', async t => { await t.throwsAsync(got('https://example.com', { hooks: { init: [() => { throw error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('passes init thrown errors to beforeError hooks (promise-only)', async t => { t.plan(2); await t.throwsAsync(got('https://example.com', { hooks: { init: [() => { throw error; }], beforeError: [error => { t.is(error.message, errorString); return error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('passes init thrown errors to beforeError hooks (promise-only) - beforeError rejection', async t => { const message = 'foo, bar!'; await t.throwsAsync(got('https://example.com', { hooks: { init: [() => { throw error; }], beforeError: [() => { throw new Error(message); }] } }), {message}); }); test('catches beforeRequest thrown errors', async t => { await t.throwsAsync(got('https://example.com', { hooks: { beforeRequest: [() => { throw error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('catches beforeRedirect thrown errors', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/redirect', redirectEndpoint); await t.throwsAsync(got('redirect', { hooks: { beforeRedirect: [() => { throw error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('catches beforeRetry thrown errors', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/retry', retryEndpoint); await t.throwsAsync(got('retry', { hooks: { beforeRetry: [() => { throw error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('catches afterResponse thrown errors', withServer, async (t, server, got) => { server.get('/', echoHeaders); await t.throwsAsync(got({ hooks: { afterResponse: [() => { throw error; }] } }), { instanceOf: RequestError, message: errorString }); }); test('accepts an async function as init hook', async t => { await got('https://example.com', { hooks: { init: [ async () => { t.pass(); } ] } }); }); test('catches beforeRequest promise rejections', async t => { await t.throwsAsync(got('https://example.com', { hooks: { beforeRequest: [ async () => { throw error; } ] } }), { instanceOf: RequestError, message: errorString }); }); test('catches beforeRedirect promise rejections', withServer, async (t, server, got) => { server.get('/', redirectEndpoint); await t.throwsAsync(got({ hooks: { beforeRedirect: [ async () => { throw error; } ] } }), { instanceOf: RequestError, message: errorString }); }); test('catches beforeRetry promise rejections', withServer, async (t, server, got) => { server.get('/retry', retryEndpoint); await t.throwsAsync(got('retry', { hooks: { beforeRetry: [ async () => { throw error; } ] } }), { instanceOf: RequestError, message: errorString }); }); test('catches afterResponse promise rejections', withServer, async (t, server, got) => { server.get('/', echoHeaders); await t.throwsAsync(got({ hooks: { afterResponse: [ async () => { throw error; } ] } }), {message: errorString}); }); test('catches beforeError errors', async t => { await t.throwsAsync(got('https://example.com', { request: () => { throw new Error('No way'); }, hooks: { beforeError: [ async () => { throw error; } ] } }), {message: errorString}); }); test('init is called with options', withServer, async (t, server, got) => { server.get('/', echoHeaders); const context = {}; await got({ hooks: { init: [ options => { t.is(options.context, context); } ] }, context }); }); test('init from defaults is called with options', withServer, async (t, server, got) => { server.get('/', echoHeaders); const context = {}; const instance = got.extend({ hooks: { init: [ options => { t.is(options.context, context); } ] } }); await instance({context}); }); test('init allows modifications', withServer, async (t, server, got) => { server.get('/', (request, response) => { response.end(request.headers.foo); }); const {body} = await got('', { headers: {}, hooks: { init: [ options => { options.headers!.foo = 'bar'; } ] } }); t.is(body, 'bar'); }); test('beforeRequest is called with options', withServer, async (t, server, got) => { server.get('/', echoHeaders); await got({ responseType: 'json', hooks: { beforeRequest: [ options => { t.is(options.url.pathname, '/'); t.is(options.url.hostname, 'localhost'); } ] } }); }); test('beforeRequest allows modifications', withServer, async (t, server, got) => { server.get('/', echoHeaders); const {body} = await got>({ responseType: 'json', hooks: { beforeRequest: [ options => { options.headers.foo = 'bar'; } ] } }); t.is(body.foo, 'bar'); }); test('returning HTTP response from a beforeRequest hook', withServer, async (t, server, got) => { server.get('/', echoUrl); const {statusCode, headers, body} = await got({ hooks: { beforeRequest: [ () => { return new Responselike( 200, {foo: 'bar'}, Buffer.from('Hi!'), '' ); } ] } }); t.is(statusCode, 200); t.is(headers.foo, 'bar'); t.is(body, 'Hi!'); }); test('beforeRedirect is called with options and response', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/redirect', redirectEndpoint); await got('redirect', { responseType: 'json', hooks: { beforeRedirect: [ (options, response) => { t.is(options.url.pathname, '/'); t.is(options.url.hostname, 'localhost'); t.is(response.statusCode, 302); t.is(new URL(response.url).pathname, '/redirect'); t.is(response.redirectUrls.length, 1); } ] } }); }); test('beforeRedirect allows modifications', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/redirect', redirectEndpoint); const {body} = await got>('redirect', { responseType: 'json', hooks: { beforeRedirect: [ options => { options.headers.foo = 'bar'; } ] } }); t.is(body.foo, 'bar'); }); test('beforeRetry is called with options', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/retry', retryEndpoint); const context = {}; await got('retry', { responseType: 'json', retry: 1, throwHttpErrors: false, context, hooks: { beforeRetry: [ (options, error, retryCount) => { t.is(options.url.hostname, 'localhost'); t.is(options.context, context); t.truthy(error); t.true(retryCount! >= 1); } ] } }); }); test('beforeRetry allows modifications', withServer, async (t, server, got) => { server.get('/', echoHeaders); server.get('/retry', retryEndpoint); const {body} = await got>('retry', { responseType: 'json', hooks: { beforeRetry: [ options => { options.headers.foo = 'bar'; } ] } }); t.is(body.foo, 'bar'); }); test('beforeRetry allows stream body if different from original', withServer, async (t, server, got) => { server.post('/retry', async (request, response) => { if (request.headers.foo) { response.send('test'); } else { response.statusCode = 500; } response.end(); }); const generateBody = () => { const form = new FormData(); form.append('A', 'B'); return form; }; const {body} = await got.post('retry', { body: generateBody(), retry: { methods: ['POST'] }, hooks: { beforeRetry: [ options => { const form = generateBody(); options.body = form; options.headers['content-type'] = `multipart/form-data; boundary=${form.getBoundary()}`; options.headers.foo = 'bar'; } ] } }); t.is(body, 'test'); }); test('afterResponse is called with response', withServer, async (t, server, got) => { server.get('/', echoHeaders); await got({ responseType: 'json', hooks: { afterResponse: [ response => { t.is(typeof response.body, 'object'); return response; } ] } }); }); test('afterResponse allows modifications', withServer, async (t, server, got) => { server.get('/', echoHeaders); const {body} = await got>({ responseType: 'json', hooks: { afterResponse: [ response => { response.body = {hello: 'world'}; return response; } ] } }); t.is(body.hello, 'world'); }); test('afterResponse allows to retry', withServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.headers.token !== 'unicorn') { response.statusCode = 401; } response.end(); }); const {statusCode} = await got({ hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token: 'unicorn' } }); } return response; } ] } }); t.is(statusCode, 200); }); test('cancelling the request after retrying in a afterResponse hook', withServer, async (t, server, got) => { let requests = 0; server.get('/', (_request, response) => { requests++; response.end(); }); const gotPromise = got({ hooks: { afterResponse: [ (_response, retryWithMergedOptions) => { const promise = retryWithMergedOptions({ headers: { token: 'unicorn' } }); gotPromise.cancel(); return promise; } ] }, retry: { calculateDelay: () => 1 } }); await t.throwsAsync(gotPromise); await delay(100); t.is(requests, 1); }); test('afterResponse allows to retry - `beforeRetry` hook', withServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.headers.token !== 'unicorn') { response.statusCode = 401; } response.end(); }); let isCalled = false; const {statusCode} = await got({ hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token: 'unicorn' } }); } return response; } ], beforeRetry: [ options => { t.truthy(options); isCalled = true; } ] } }); t.is(statusCode, 200); t.true(isCalled); }); test('no infinity loop when retrying on afterResponse', withServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.headers.token !== 'unicorn') { response.statusCode = 401; } response.end(); }); await t.throwsAsync(got({ retry: 0, hooks: { afterResponse: [ (_response, retryWithMergedOptions) => { return retryWithMergedOptions({ headers: { token: 'invalid' } }); } ] } }), {instanceOf: got.HTTPError, message: 'Response code 401 (Unauthorized)'}); }); test('throws on afterResponse retry failure', withServer, async (t, server, got) => { let didVisit401then500: boolean; server.get('/', (_request, response) => { if (didVisit401then500) { response.statusCode = 500; } else { didVisit401then500 = true; response.statusCode = 401; } response.end(); }); await t.throwsAsync(got({ retry: 1, hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token: 'unicorn' } }); } return response; } ] } }), {instanceOf: got.HTTPError, message: 'Response code 500 (Internal Server Error)'}); }); test('doesn\'t throw on afterResponse retry HTTP failure if throwHttpErrors is false', withServer, async (t, server, got) => { let didVisit401then500: boolean; server.get('/', (_request, response) => { if (didVisit401then500) { response.statusCode = 500; } else { didVisit401then500 = true; response.statusCode = 401; } response.end(); }); const {statusCode} = await got({ throwHttpErrors: false, retry: 1, hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token: 'unicorn' } }); } return response; } ] } }); t.is(statusCode, 500); }); test('throwing in a beforeError hook - promise', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await t.throwsAsync(got({ hooks: { afterResponse: [ () => { throw error; } ], beforeError: [ (): never => { throw new Error('foobar'); }, () => { throw new Error('This shouldn\'t be called at all'); } ] } }), {message: 'foobar'}); }); test('throwing in a beforeError hook - stream', withServer, async (t, _server, got) => { await t.throwsAsync(getStream(got.stream({ hooks: { beforeError: [ () => { throw new Error('foobar'); }, () => { throw new Error('This shouldn\'t be called at all'); } ] } })), {message: 'foobar'}); }); test('beforeError is called with an error - promise', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await t.throwsAsync(got({ hooks: { afterResponse: [ () => { throw error; } ], beforeError: [error2 => { t.true(error2 instanceof Error); return error2; }] } }), {message: errorString}); }); test('beforeError is called with an error - stream', withServer, async (t, _server, got) => { await t.throwsAsync(getStream(got.stream({ hooks: { beforeError: [error2 => { t.true(error2 instanceof Error); return error2; }] } })), {message: 'Response code 404 (Not Found)'}); }); test('beforeError allows modifications', async t => { const errorString2 = 'foobar'; await t.throwsAsync(got('https://example.com', { request: () => { throw error; }, hooks: { beforeError: [ error => { const newError = new Error(errorString2); return new RequestError(newError.message, newError, error.options); } ] } }), {message: errorString2}); }); test('does not break on `afterResponse` hook with JSON mode', withServer, async (t, server, got) => { server.get('/foobar', echoHeaders); await t.notThrowsAsync(got('', { hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 404) { const url = new URL('/foobar', response.url); return retryWithMergedOptions({url}); } return response; } ] }, responseType: 'json' })); }); test('catches HTTPErrors', withServer, async (t, _server, got) => { t.plan(2); await t.throwsAsync(got({ hooks: { beforeError: [ error => { t.true(error instanceof got.HTTPError); return error; } ] } })); }); test('timeout can be modified using a hook', withServer, async (t, server, got) => { server.get('/', () => {}); await t.throwsAsync(got({ timeout: 1000, hooks: { beforeRequest: [ options => { options.timeout.request = 500; } ] }, retry: 0 }), {message: 'Timeout awaiting \'request\' for 500ms'}); }); test('beforeRequest hook is called before each request', withServer, async (t, server, got) => { server.post('/', echoUrl); server.post('/redirect', redirectEndpoint); const buffer = Buffer.from('Hello, Got!'); let counts = 0; await got.post('redirect', { body: buffer, hooks: { beforeRequest: [ options => { counts++; t.is(options.headers['content-length'], String(buffer.length)); } ] } }); t.is(counts, 2); }); test('beforeError emits valid promise `HTTPError`s', async t => { t.plan(3); nock('https://ValidHTTPErrors.com').get('/').reply(() => [422, 'no']); const instance = got.extend({ hooks: { beforeError: [ error => { t.true(error instanceof HTTPError); t.truthy(error.response!.body); return error; } ] }, retry: 0 }); await t.throwsAsync(instance('https://ValidHTTPErrors.com')); }); test('hooks are not duplicated', withServer, async (t, _server, got) => { let calls = 0; await t.throwsAsync(got({ hooks: { beforeError: [ error => { calls++; return error; } ] }, retry: 0 }), {message: 'Response code 404 (Not Found)'}); t.is(calls, 1); }); test('async afterResponse allows to retry with allowGetBody and json payload', withServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.headers.token !== 'unicorn') { response.statusCode = 401; } response.end(); }); const {statusCode} = await got({ allowGetBody: true, json: {hello: 'world'}, hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({headers: {token: 'unicorn'}}); } return response; } ] }, retry: 0, throwHttpErrors: false }); t.is(statusCode, 200); }); test('beforeRequest hook respect `agent` option', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {agent, spy} = createAgentSpy(HttpAgent); t.truthy((await got({ hooks: { beforeRequest: [ options => { options.agent = { http: agent }; } ] } })).body); t.true(spy.calledOnce); // Make sure to close all open sockets agent.destroy(); }); test('beforeRequest hook respect `url` option', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ko'); }); server.get('/changed', (_request, response) => { response.end('ok'); }); t.is((await got(server.hostname, { hooks: { beforeRequest: [ options => { options.url = new URL(server.url + '/changed'); } ] } })).body, 'ok'); }); test('no duplicate hook calls in single-page paginated requests', withServer, async (t, server, got) => { server.get('/get', (_request, response) => { response.end('i <3 koalas'); }); let beforeHookCount = 0; let beforeHookCountAdditional = 0; let afterHookCount = 0; let afterHookCountAdditional = 0; const hooks = { beforeRequest: [ () => { beforeHookCount++; } ], afterResponse: [ (response: any) => { afterHookCount++; return response; } ] }; // Test only one request const instance = got.extend({ hooks, pagination: { paginate: () => false, countLimit: 2009, transform: response => [response] } }); await instance.paginate.all('get'); t.is(beforeHookCount, 1); t.is(afterHookCount, 1); await instance.paginate.all('get', { hooks: { beforeRequest: [ () => { beforeHookCountAdditional++; } ], afterResponse: [ (response: any) => { afterHookCountAdditional++; return response; } ] } }); t.is(beforeHookCount, 2); t.is(afterHookCount, 2); t.is(beforeHookCountAdditional, 1); t.is(afterHookCountAdditional, 1); await got.paginate.all('get', { hooks, pagination: { paginate: () => false, transform: response => [response] } }); t.is(beforeHookCount, 3); t.is(afterHookCount, 3); }); test('no duplicate hook calls in sequential paginated requests', withServer, async (t, server, got) => { server.get('/get', (_request, response) => { response.end('i <3 unicorns'); }); let requestNumber = 0; let beforeHookCount = 0; let afterHookCount = 0; const hooks = { beforeRequest: [ () => { beforeHookCount++; } ], afterResponse: [ (response: any) => { afterHookCount++; return response; } ] }; // Test only two requests, one after another const paginate = () => requestNumber++ === 0 ? {} : false; const instance = got.extend({ hooks, pagination: { paginate, countLimit: 2009, transform: response => [response] } }); await instance.paginate.all('get'); t.is(beforeHookCount, 2); t.is(afterHookCount, 2); requestNumber = 0; await got.paginate.all('get', { hooks, pagination: { paginate, transform: response => [response] } }); t.is(beforeHookCount, 4); t.is(afterHookCount, 4); }); test('intentional duplicate hooks in pagination with extended instance', withServer, async (t, server, got) => { server.get('/get', (_request, response) => { response.end('<3'); }); let beforeCount = 0; // Number of times the hooks from `extend` are called let afterCount = 0; let beforeCountAdditional = 0; // Number of times the added hooks are called let afterCountAdditional = 0; const beforeHook = () => { beforeCount++; }; const afterHook = (response: any) => { afterCount++; return response; }; const instance = got.extend({ hooks: { beforeRequest: [ beforeHook, beforeHook ], afterResponse: [ afterHook, afterHook ] }, pagination: { paginate: () => false, countLimit: 2009, transform: response => [response] } }); // Add duplicate hooks when calling paginate const beforeHookAdditional = () => { beforeCountAdditional++; }; const afterHookAdditional = (response: any) => { afterCountAdditional++; return response; }; await instance.paginate.all('get', { hooks: { beforeRequest: [ beforeHook, beforeHookAdditional, beforeHookAdditional ], afterResponse: [ afterHook, afterHookAdditional, afterHookAdditional ] } }); t.is(beforeCount, 3); t.is(afterCount, 3); t.is(beforeCountAdditional, 2); t.is(afterCountAdditional, 2); }); test('no duplicate hook calls when returning original request options', withServer, async (t, server, got) => { server.get('/get', (_request, response) => { response.end('i <3 unicorns'); }); let requestNumber = 0; let beforeHookCount = 0; let afterHookCount = 0; const hooks = { beforeRequest: [ () => { beforeHookCount++; } ], afterResponse: [ (response: any) => { afterHookCount++; return response; } ] }; // Test only two requests, one after another const paginate = (response: Response) => requestNumber++ === 0 ? response.request.options : false; const instance = got.extend({ hooks, pagination: { paginate, countLimit: 2009, transform: response => [response] } }); await instance.paginate.all('get'); t.is(beforeHookCount, 2); t.is(afterHookCount, 2); requestNumber = 0; await got.paginate.all('get', { hooks, pagination: { paginate, transform: response => [response] } }); t.is(beforeHookCount, 4); t.is(afterHookCount, 4); }); test('`beforeRequest` change body', withServer, async (t, server, got) => { server.post('/', echoBody); const response = await got.post({ json: {payload: 'old'}, hooks: { beforeRequest: [ options => { options.body = JSON.stringify({payload: 'new'}); options.headers['content-length'] = options.body.length.toString(); } ] } }); t.is(JSON.parse(response.body).payload, 'new'); }); sindresorhus-got-11d2e83/test/http.ts000066400000000000000000000215471434406364000177050ustar00rootroot00000000000000import {STATUS_CODES, Agent} from 'http'; import test from 'ava'; import {Handler} from 'express'; import {isIPv4, isIPv6} from 'net'; import nock = require('nock'); import getStream = require('get-stream'); import pEvent from 'p-event'; import got, {HTTPError, UnsupportedProtocolError, CancelableRequest, ReadError} from '../source'; import withServer from './helpers/with-server'; import os = require('os'); const IPv6supported = Object.values(os.networkInterfaces()).some(iface => iface?.some(addr => !addr.internal && addr.family === 'IPv6')); const testIPv6 = (IPv6supported && process.env.TRAVIS_DIST !== 'bionic' && process.env.TRAVIS_DIST !== 'focal') ? test : test.skip; const echoIp: Handler = (request, response) => { const address = request.connection.remoteAddress; if (address === undefined) { response.end(); return; } // IPv4 address mapped to IPv6 response.end(address === '::ffff:127.0.0.1' ? '127.0.0.1' : address); }; const echoBody: Handler = async (request, response) => { response.end(await getStream(request)); }; test('simple request', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); t.is((await got('')).body, 'ok'); }); test('empty response', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end(); }); t.is((await got('')).body, ''); }); test('response has `requestUrl` property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); server.get('/empty', (_request, response) => { response.end(); }); t.is((await got('')).requestUrl, `${server.url}/`); t.is((await got('empty')).requestUrl, `${server.url}/empty`); }); test('http errors have `response` property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end('not'); }); const error = await t.throwsAsync(got(''), {instanceOf: HTTPError}); t.is(error.response.statusCode, 404); t.is(error.response.body, 'not'); }); test('status code 304 doesn\'t throw', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 304; response.end(); }); const promise = got(''); await t.notThrowsAsync(promise); const {statusCode, body} = await promise; t.is(statusCode, 304); t.is(body, ''); }); test('doesn\'t throw if `options.throwHttpErrors` is false', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end('not'); }); t.is((await got({throwHttpErrors: false})).body, 'not'); }); test('invalid protocol throws', async t => { await t.throwsAsync(got('c:/nope.com').json(), { instanceOf: UnsupportedProtocolError, code: 'ERR_UNSUPPORTED_PROTOCOL', message: 'Unsupported protocol "c:"' }); }); test('custom `options.encoding`', withServer, async (t, server, got) => { const string = 'ok'; server.get('/', (_request, response) => { response.end(string); }); const data = (await got({encoding: 'base64'})).body; t.is(data, Buffer.from(string).toString('base64')); }); test('`options.encoding` doesn\'t affect streams', withServer, async (t, server, got) => { const string = 'ok'; server.get('/', (_request, response) => { response.end(string); }); const data = await getStream(got.stream({encoding: 'base64'})); t.is(data, string); }); test('`got.stream(...).setEncoding(...)` works', withServer, async (t, server, got) => { const string = 'ok'; server.get('/', (_request, response) => { response.end(string); }); const data = await getStream(got.stream('').setEncoding('base64')); t.is(data, Buffer.from(string).toString('base64')); }); test('`searchParams` option', withServer, async (t, server, got) => { server.get('/', (request, response) => { t.is(request.query.recent, 'true'); response.end('recent'); }); t.is((await got({searchParams: {recent: true}})).body, 'recent'); t.is((await got({searchParams: 'recent=true'})).body, 'recent'); }); test('response contains url', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); t.is((await got('')).url, `${server.url}/`); }); test('response contains got options', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); { const options = { username: 'foo', password: 'bar' }; const {options: normalizedOptions} = (await got(options)).request; t.is(normalizedOptions.username, options.username); t.is(normalizedOptions.password, options.password); } { const options = { username: 'foo' }; const {options: normalizedOptions} = (await got(options)).request; t.is(normalizedOptions.username, options.username); t.is(normalizedOptions.password, ''); } { const options = { password: 'bar' }; const {options: normalizedOptions} = (await got(options)).request; t.is(normalizedOptions.username, ''); t.is(normalizedOptions.password, options.password); } }); test('socket destroyed by the server throws ECONNRESET', withServer, async (t, server, got) => { server.get('/', request => { request.socket.destroy(); }); await t.throwsAsync(got('', {retry: 0}), { code: 'ECONNRESET' }); }); test('the response contains timings property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {timings} = await got(''); t.truthy(timings); t.true(timings.phases.total! >= 0); }); test('throws an error if the server aborted the request', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(200, { 'content-type': 'text/plain' }); response.write('chunk 1'); setImmediate(() => { response.write('chunk 2'); setImmediate(() => { response.destroy(); }); }); }); const error = await t.throwsAsync(got(''), { code: 'ECONNRESET', message: 'The server aborted pending request' }); t.truthy(error.response.retryCount); }); test('statusMessage fallback', async t => { nock('http://statusMessageFallback').get('/').reply(503); const {statusMessage} = await got('http://statusMessageFallback', { throwHttpErrors: false, retry: 0 }); t.is(statusMessage, STATUS_CODES[503]); }); test('does not destroy completed requests', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('content-encoding', 'gzip'); response.end(''); }); const options = { agent: { http: new Agent({keepAlive: true}) }, retry: 0 }; const stream = got.stream(options); stream.resume(); const endPromise = pEvent(stream, 'end'); const socket = await pEvent(stream, 'socket'); const closeListener = () => { t.fail('Socket has been destroyed'); }; socket.once('close', closeListener); await new Promise(resolve => { setTimeout(resolve, 10); }); socket.off('close', closeListener); await endPromise; options.agent.http.destroy(); t.pass(); }); testIPv6('IPv6 request', withServer, async (t, server) => { server.get('/ok', echoIp); const response = await got(`http://[::1]:${server.port}/ok`); t.is(response.body, '::1'); }); test('DNS auto', withServer, async (t, server, got) => { server.get('/ok', echoIp); const response = await got('ok', { dnsLookupIpVersion: 'auto' }); t.true(isIPv4(response.body)); }); test('DNS IPv4', withServer, async (t, server, got) => { server.get('/ok', echoIp); const response = await got('ok', { dnsLookupIpVersion: 'ipv4' }); t.true(isIPv4(response.body)); }); // Travis CI Ubuntu Focal VM does not resolve IPv6 hostnames testIPv6('DNS IPv6', withServer, async (t, server, got) => { server.get('/ok', echoIp); const response = await got('ok', { dnsLookupIpVersion: 'ipv6' }); t.true(isIPv6(response.body)); }); test('invalid `dnsLookupIpVersion`', withServer, async (t, server, got) => { server.get('/ok', echoIp); await t.throwsAsync(got('ok', { dnsLookupIpVersion: 'test' } as any)); }); test.serial('deprecated `family` option', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await new Promise(resolve => { let request: CancelableRequest; (async () => { const warning = await pEvent(process, 'warning'); t.is(warning.name, 'DeprecationWarning'); request!.cancel(); resolve(); })(); (async () => { request = got({ family: '4' } as any); try { await request; t.fail(); } catch { t.true(request!.isCanceled); } resolve(); })(); }); }); test('JSON request custom stringifier', withServer, async (t, server, got) => { server.post('/', echoBody); const payload = {a: 'b'}; const customStringify = (object: any) => JSON.stringify({...object, c: 'd'}); t.deepEqual((await got.post({ stringifyJson: customStringify, json: payload })).body, customStringify(payload)); }); sindresorhus-got-11d2e83/test/https.ts000066400000000000000000000274121434406364000200650ustar00rootroot00000000000000import test from 'ava'; import got, {CancelableRequest} from '../source'; import {withHttpsServer} from './helpers/with-server'; import {DetailedPeerCertificate} from 'tls'; import pEvent from 'p-event'; import pify = require('pify'); import pem = require('pem'); const createPrivateKey = pify(pem.createPrivateKey); const createCSR = pify(pem.createCSR); const createCertificate = pify(pem.createCertificate); const createPkcs12 = pify(pem.createPkcs12); test('https request without ca', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); t.truthy((await got({ https: { certificateAuthority: [], rejectUnauthorized: false } })).body); }); test('https request with ca', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {body} = await got({}); t.is(body, 'ok'); }); test('https request with ca and afterResponse hook', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const warningListener = (warning: any) => { if ( warning.name === 'DeprecationWarning' && warning.message === 'Got: "options.ca" was never documented, please use ' + '"options.https.certificateAuthority"' ) { process.off('warning', warningListener); t.fail('unexpected deprecation warning'); } }; process.once('warning', warningListener); let shouldRetry = true; const {body} = await got({ hooks: { afterResponse: [ (response, retry) => { if (shouldRetry) { shouldRetry = false; return retry({}); } return response; } ] } }); t.is(body, 'ok'); }); test('https request with `checkServerIdentity` OK', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const {body} = await got({ https: { checkServerIdentity: (hostname: string, certificate: DetailedPeerCertificate) => { t.is(hostname, 'localhost'); t.is(certificate.subject.CN, 'localhost'); t.is(certificate.issuer.CN, 'authority'); } } }); t.is(body, 'ok'); }); test('https request with `checkServerIdentity` NOT OK', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); const promise = got({ https: { checkServerIdentity: (hostname: string, certificate: DetailedPeerCertificate) => { t.is(hostname, 'localhost'); t.is(certificate.subject.CN, 'localhost'); t.is(certificate.issuer.CN, 'authority'); return new Error('CUSTOM_ERROR'); } } }); await t.throwsAsync( promise, { message: 'CUSTOM_ERROR' } ); }); // The built-in `openssl` on macOS does not support negative days. { const testFn = process.platform === 'darwin' ? test.skip : test; testFn('https request with expired certificate', withHttpsServer({days: -1}), async (t, _server, got) => { await t.throwsAsync( got({}), { code: 'CERT_HAS_EXPIRED' } ); }); } test('https request with wrong host', withHttpsServer({commonName: 'not-localhost.com'}), async (t, _server, got) => { await t.throwsAsync( got({}), { code: 'ERR_TLS_CERT_ALTNAME_INVALID' } ); }); test('http2', async t => { const promise = got('https://httpbin.org/anything', { http2: true }); const {headers, body} = await promise; await promise.json(); // @ts-expect-error Pseudo headers may not be strings t.is(headers[':status'], 200); t.is(typeof body, 'string'); }); test.serial('deprecated `rejectUnauthorized` option', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await new Promise(resolve => { let request: CancelableRequest; (async () => { const warning = await pEvent(process, 'warning'); t.is(warning.name, 'DeprecationWarning'); request!.cancel(); resolve(); })(); (async () => { request = got({ rejectUnauthorized: false }); try { await request; t.fail(); } catch { t.true(request!.isCanceled); } resolve(); })(); }); }); test.serial('non-deprecated `rejectUnauthorized` option', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); (async () => { const warning = await pEvent(process, 'warning'); t.not(warning.name, 'DeprecationWarning'); })(); await got({ https: { rejectUnauthorized: false } }); t.pass(); }); test.serial('no double deprecated warning', withHttpsServer(), async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); (async () => { const warning = await pEvent(process, 'warning'); t.is(warning.name, 'DeprecationWarning'); })(); await got({ rejectUnauthorized: false }); (async () => { const warning = await pEvent(process, 'warning'); t.not(warning.name, 'DeprecationWarning'); })(); await got({ rejectUnauthorized: false }); t.pass(); }); test('client certificate', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); peerCertificate.issuerCertificate.issuerCertificate = undefined; // Circular structure response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const clientCSRResult = await createCSR({commonName: 'client'}); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, serviceKey: (server as any).caKey, serviceCertificate: (server as any).caCert }); // eslint-disable-next-line prefer-destructuring const clientKey = clientResult.clientKey; const clientCert = clientResult.certificate; const response: any = await got({ https: { key: clientKey, certificate: clientCert } }).json(); t.true(response.authorized); t.is(response.peerCertificate.subject.CN, 'client'); t.is(response.peerCertificate.issuer.CN, 'authority'); }); test('invalid client certificate (self-signed)', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); peerCertificate.issuerCertificate = undefined; // Circular structure response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const clientCSRResult = await createCSR({commonName: 'other-client'}); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, selfSigned: true }); // eslint-disable-next-line prefer-destructuring const clientKey = clientResult.clientKey; const clientCert = clientResult.certificate; const response: any = await got({ https: { key: clientKey, certificate: clientCert } }).json(); t.is(response.authorized, false); }); test('invalid client certificate (other CA)', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const caCSRResult = await createCSR({commonName: 'other-authority'}); const caResult = await createCertificate({ csr: caCSRResult.csr, clientKey: caCSRResult.clientKey, selfSigned: true }); const caKey = caResult.clientKey; const caCert = caResult.certificate; const clientCSRResult = await createCSR({commonName: 'other-client'}); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, serviceKey: caKey, serviceCertificate: caCert }); // eslint-disable-next-line prefer-destructuring const clientKey = clientResult.clientKey; const clientCert = clientResult.certificate; const response: any = await got({ https: { key: clientKey, certificate: clientCert } }).json(); t.false(response.authorized); t.is(response.peerCertificate.subject.CN, 'other-client'); t.is(response.peerCertificate.issuer.CN, 'other-authority'); }); test('key passphrase', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); peerCertificate.issuerCertificate.issuerCertificate = undefined; // Circular structure response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const {key: clientKey} = await createPrivateKey(2048, { cipher: 'aes256', password: 'randomPassword' }); const clientCSRResult = await createCSR({ // eslint-disable-next-line object-shorthand clientKey: clientKey, clientKeyPassword: 'randomPassword', commonName: 'client' }); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, clientKeyPassword: 'randomPassword', serviceKey: (server as any).caKey, serviceCertificate: (server as any).caCert }); const clientCert = clientResult.certificate; const response: any = await got({ https: { key: clientKey, passphrase: 'randomPassword', certificate: clientCert } }).json(); t.true(response.authorized); t.is(response.peerCertificate.subject.CN, 'client'); t.is(response.peerCertificate.issuer.CN, 'authority'); }); test('invalid key passphrase', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); peerCertificate.issuerCertificate.issuerCertificate = undefined; // Circular structure response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const {key: clientKey} = await createPrivateKey(2048, { cipher: 'aes256', password: 'randomPassword' }); const clientCSRResult = await createCSR({ // eslint-disable-next-line object-shorthand clientKey: clientKey, clientKeyPassword: 'randomPassword', commonName: 'client' }); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, clientKeyPassword: 'randomPassword', serviceKey: (server as any).caKey, serviceCertificate: (server as any).caCert }); const clientCert = clientResult.certificate; const NODE_10 = process.versions.node.split('.')[0] === '10'; const request = got({ https: { key: clientKey, passphrase: 'wrongPassword', certificate: clientCert } }); // Node.JS 10 does not have an error code, it only has a mesage if (NODE_10) { try { await request; t.fail(); } catch (error) { t.true((error.message as string).includes('bad decrypt'), error.message); } } else { await t.throwsAsync(request, { code: 'ERR_OSSL_EVP_BAD_DECRYPT' }); } }); test('client certificate PFX', withHttpsServer(), async (t, server, got) => { server.get('/', (request, response) => { const peerCertificate = (request.socket as any).getPeerCertificate(true); peerCertificate.issuerCertificate = undefined; // Circular structure response.json({ authorized: (request.socket as any).authorized, peerCertificate }); }); const clientCSRResult = await createCSR({commonName: 'client'}); const clientResult = await createCertificate({ csr: clientCSRResult.csr, clientKey: clientCSRResult.clientKey, serviceKey: (server as any).caKey, serviceCertificate: (server as any).caCert }); // eslint-disable-next-line prefer-destructuring const clientKey = clientResult.clientKey; const clientCert = clientResult.certificate; const {pkcs12} = await createPkcs12(clientKey, clientCert, 'randomPassword'); const response: any = await got({ https: { pfx: pkcs12, passphrase: 'randomPassword' } }).json(); t.true(response.authorized); t.is(response.peerCertificate.subject.CN, 'client'); t.is(response.peerCertificate.issuer.CN, 'authority'); }); sindresorhus-got-11d2e83/test/merge-instances.ts000066400000000000000000000116471434406364000220120ustar00rootroot00000000000000import test from 'ava'; import {Handler} from 'express'; import got, {BeforeRequestHook, Got, Headers, NormalizedOptions} from '../source'; import withServer from './helpers/with-server'; const echoHeaders: Handler = (request, response) => { response.end(JSON.stringify(request.headers)); }; test('merging instances', withServer, async (t, server) => { server.get('/', echoHeaders); const instanceA = got.extend({headers: {unicorn: 'rainbow'}}); const instanceB = got.extend({prefixUrl: server.url}); const merged = instanceA.extend(instanceB); const headers = await merged('').json(); t.is(headers.unicorn, 'rainbow'); t.not(headers['user-agent'], undefined); }); test('merges default handlers & custom handlers', withServer, async (t, server) => { server.get('/', echoHeaders); const instanceA = got.extend({headers: {unicorn: 'rainbow'}}); const instanceB = got.extend({ handlers: [ (options, next) => { options.headers.cat = 'meow'; return next(options); } ] }); const merged = instanceA.extend(instanceB); const headers = await merged(server.url).json(); t.is(headers.unicorn, 'rainbow'); t.is(headers.cat, 'meow'); }); test('merging one group & one instance', withServer, async (t, server) => { server.get('/', echoHeaders); const instanceA = got.extend({headers: {dog: 'woof'}}); const instanceB = got.extend({headers: {cat: 'meow'}}); const instanceC = got.extend({headers: {bird: 'tweet'}}); const instanceD = got.extend({headers: {mouse: 'squeek'}}); const merged = instanceA.extend(instanceB, instanceC); const doubleMerged = merged.extend(instanceD); const headers = await doubleMerged(server.url).json(); t.is(headers.dog, 'woof'); t.is(headers.cat, 'meow'); t.is(headers.bird, 'tweet'); t.is(headers.mouse, 'squeek'); }); test('merging two groups of merged instances', withServer, async (t, server) => { server.get('/', echoHeaders); const instanceA = got.extend({headers: {dog: 'woof'}}); const instanceB = got.extend({headers: {cat: 'meow'}}); const instanceC = got.extend({headers: {bird: 'tweet'}}); const instanceD = got.extend({headers: {mouse: 'squeek'}}); const groupA = instanceA.extend(instanceB); const groupB = instanceC.extend(instanceD); const merged = groupA.extend(groupB); const headers = await merged(server.url).json(); t.is(headers.dog, 'woof'); t.is(headers.cat, 'meow'); t.is(headers.bird, 'tweet'); t.is(headers.mouse, 'squeek'); }); test('hooks are merged', t => { const getBeforeRequestHooks = (instance: Got): BeforeRequestHook[] => instance.defaults.options.hooks.beforeRequest; const instanceA = got.extend({hooks: { beforeRequest: [ options => { options.headers.dog = 'woof'; } ] }}); const instanceB = got.extend({hooks: { beforeRequest: [ options => { options.headers.cat = 'meow'; } ] }}); const merged = instanceA.extend(instanceB); t.deepEqual(getBeforeRequestHooks(merged), getBeforeRequestHooks(instanceA).concat(getBeforeRequestHooks(instanceB))); }); test('default handlers are not duplicated', t => { const instance = got.extend(got); t.is(instance.defaults.handlers.length, 1); }); test('URL is not polluted', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await got({ username: 'foo' }); const {options: normalizedOptions} = (await got({})).request; t.is(normalizedOptions.username, ''); }); test('merging instances with HTTPS options', t => { const instanceA = got.extend({https: { rejectUnauthorized: true, certificate: 'FIRST' }}); const instanceB = got.extend({https: { certificate: 'SECOND' }}); const merged = instanceA.extend(instanceB); t.true(merged.defaults.options.https?.rejectUnauthorized); t.is(merged.defaults.options.https?.certificate, 'SECOND'); }); test('merging instances with HTTPS options undefined', t => { const instanceA = got.extend({https: { rejectUnauthorized: true, certificate: 'FIRST' }}); const instanceB = got.extend({https: { certificate: undefined }}); const merged = instanceA.extend(instanceB); t.true(merged.defaults.options.https?.rejectUnauthorized); t.is(merged.defaults.options.https?.certificate, undefined); }); test('accepts options for promise API', t => { got.extend({ hooks: { beforeRequest: [ (options: NormalizedOptions): void => { options.responseType = 'buffer'; } ] } }); t.pass(); }); test('merging `prefixUrl`', t => { const prefixUrl = 'http://example.com/'; const instanceA = got.extend({headers: {unicorn: 'rainbow'}}); const instanceB = got.extend({prefixUrl}); const mergedAonB = instanceB.extend(instanceA); const mergedBonA = instanceA.extend(instanceB); t.is(mergedAonB.defaults.options.prefixUrl, ''); t.is(mergedBonA.defaults.options.prefixUrl, prefixUrl); t.is(instanceB.extend({}).defaults.options.prefixUrl, prefixUrl); t.is(instanceB.extend({prefixUrl: undefined}).defaults.options.prefixUrl, prefixUrl); }); sindresorhus-got-11d2e83/test/normalize-arguments.ts000066400000000000000000000054571434406364000227330ustar00rootroot00000000000000import {URL, URLSearchParams} from 'url'; import test from 'ava'; import got from '../source'; test('should merge options replacing responseType', t => { const responseType = 'json'; const options = got.mergeOptions(got.defaults.options, { responseType }); t.is(options.responseType, responseType); }); test('no duplicated searchParams values', t => { const options = got.mergeOptions(got.defaults.options, { searchParams: 'string=true&noDuplication=true' }, { searchParams: new URLSearchParams({ instance: 'true', noDuplication: 'true' }) }); t.is(options.searchParams?.get('string'), 'true'); t.is(options.searchParams?.get('instance'), 'true'); t.is(options.searchParams?.getAll('noDuplication').length, 1); }); test('should copy non-numerable properties', t => { const options = { json: {hello: '123'} }; const merged = got.mergeOptions(got.defaults.options, options); const mergedTwice = got.mergeOptions(got.defaults.options, merged); t.is(mergedTwice.json, options.json); }); test('should replace URLs', t => { const options = got.mergeOptions({ url: new URL('http://localhost:41285'), searchParams: new URLSearchParams('page=0') }, { url: 'http://localhost:41285/?page=1', searchParams: undefined }); const otherOptions = got.mergeOptions({ url: new URL('http://localhost:41285'), searchParams: { page: 0 } }, { url: 'http://localhost:41285/?page=1', searchParams: undefined }); t.is(options.url.href, 'http://localhost:41285/?page=1'); t.is(otherOptions.url.href, 'http://localhost:41285/?page=1'); }); test('should get username and password from the URL', t => { const options = got.mergeOptions({ url: 'http://user:pass@localhost:41285' }); t.is(options.username, 'user'); t.is(options.password, 'pass'); }); test('should get username and password from the options', t => { const options = got.mergeOptions({ url: 'http://user:pass@localhost:41285', username: 'user_OPT', password: 'pass_OPT' }); t.is(options.username, 'user_OPT'); t.is(options.password, 'pass_OPT'); }); test('should get username and password from the merged options', t => { const options = got.mergeOptions( { url: 'http://user:pass@localhost:41285' }, { username: 'user_OPT_MERGE', password: 'pass_OPT_MERGE' } ); t.is(options.username, 'user_OPT_MERGE'); t.is(options.password, 'pass_OPT_MERGE'); }); test('null value in search params means empty', t => { const options = got.mergeOptions({ url: new URL('http://localhost'), searchParams: { foo: null } }); t.is(options.url.href, 'http://localhost/?foo='); }); test('undefined value in search params means it does not exist', t => { const options = got.mergeOptions({ url: new URL('http://localhost'), searchParams: { foo: undefined } }); t.is(options.url.href, 'http://localhost/'); }); sindresorhus-got-11d2e83/test/pagination.ts000066400000000000000000000355161434406364000210600ustar00rootroot00000000000000import {URL} from 'url'; import test from 'ava'; import delay = require('delay'); import getStream = require('get-stream'); import got, {Response} from '../source'; import withServer, {withBodyParsingServer} from './helpers/with-server'; import {ExtendedHttpTestServer} from './helpers/create-http-test-server'; const thrower = (): any => { throw new Error('This should not be called'); }; const resetPagination = { paginate: undefined, transform: undefined, filter: undefined, shouldContinue: undefined }; const attachHandler = (server: ExtendedHttpTestServer, count: number): void => { server.get('/', (request, response) => { const searchParameters = new URLSearchParams(request.url.split('?')[1]); const page = Number(searchParameters.get('page')) || 1; if (page < count) { response.setHeader('link', `<${server.url}/?page=${page + 1}>; rel="next"`); } response.end(`[${page <= count ? page : ''}]`); }); }; test('the link header has no next value', withServer, async (t, server, got) => { const items = [1]; server.get('/', (_request, response) => { response.setHeader('link', '; rel="prev"'); response.end(JSON.stringify(items)); }); const received = await got.paginate.all(''); t.deepEqual(received, items); }); test('retrieves all elements', withServer, async (t, server, got) => { attachHandler(server, 2); const result = await got.paginate.all(''); t.deepEqual(result, [1, 2]); }); test('retrieves all elements with JSON responseType', withServer, async (t, server, got) => { attachHandler(server, 2); const result = await got.extend({ responseType: 'json' }).paginate.all(''); t.deepEqual(result, [1, 2]); }); test('points to defaults when extending Got without custom `pagination`', withServer, async (t, server, got) => { attachHandler(server, 2); const result = await got.extend().paginate.all(''); t.deepEqual(result, [1, 2]); }); test('pagination options can be extended', withServer, async (t, server, got) => { attachHandler(server, 2); const result = await got.extend({ pagination: { shouldContinue: () => false } }).paginate.all(''); t.deepEqual(result, []); }); test('filters elements', withServer, async (t, server, got) => { attachHandler(server, 3); const result = await got.paginate.all({ pagination: { filter: (element: number, allItems: number[], currentItems: number[]) => { t.true(Array.isArray(allItems)); t.true(Array.isArray(currentItems)); return element !== 2; } } }); t.deepEqual(result, [1, 3]); }); test('parses elements', withServer, async (t, server, got) => { attachHandler(server, 100); const result = await got.paginate.all('?page=100', { pagination: { transform: response => [response.body.length] } }); t.deepEqual(result, [5]); }); test('parses elements - async function', withServer, async (t, server, got) => { attachHandler(server, 100); const result = await got.paginate.all('?page=100', { pagination: { transform: async response => [response.body.length] } }); t.deepEqual(result, [5]); }); test('custom paginate function', withServer, async (t, server, got) => { attachHandler(server, 3); const result = await got.paginate.all({ pagination: { paginate: response => { const url = new URL(response.url); if (url.search === '?page=3') { return false; } url.search = '?page=3'; return {url}; } } }); t.deepEqual(result, [1, 3]); }); test('custom paginate function using allItems', withServer, async (t, server, got) => { attachHandler(server, 3); const result = await got.paginate.all({ pagination: { paginate: (_response, allItems: number[]) => { if (allItems.length === 2) { return false; } return {path: '/?page=3'}; } } }); t.deepEqual(result, [1, 3]); }); test('custom paginate function using currentItems', withServer, async (t, server, got) => { attachHandler(server, 3); const result = await got.paginate.all({ pagination: { paginate: (_response, _allItems: number[], currentItems: number[]) => { if (currentItems[0] === 3) { return false; } return {path: '/?page=3'}; } } }); t.deepEqual(result, [1, 3]); }); test('iterator works', withServer, async (t, server, got) => { attachHandler(server, 5); const results: number[] = []; for await (const item of got.paginate('')) { results.push(item); } t.deepEqual(results, [1, 2, 3, 4, 5]); }); test('iterator works #2', withServer, async (t, server, got) => { attachHandler(server, 5); const results: number[] = []; for await (const item of got.paginate.each('')) { results.push(item); } t.deepEqual(results, [1, 2, 3, 4, 5]); }); test('`shouldContinue` works', withServer, async (t, server, got) => { attachHandler(server, 2); const options = { pagination: { shouldContinue: (_item: unknown, allItems: unknown[], currentItems: unknown[]) => { t.true(Array.isArray(allItems)); t.true(Array.isArray(currentItems)); return false; } } }; const results: number[] = []; for await (const item of got.paginate(options)) { results.push(item); } t.deepEqual(results, []); }); test('`countLimit` works', withServer, async (t, server, got) => { attachHandler(server, 2); const options = { pagination: { countLimit: 1 } }; const results: number[] = []; for await (const item of got.paginate(options)) { results.push(item); } t.deepEqual(results, [1]); }); test('throws if no `pagination` option', async t => { const iterator = got.extend({ pagination: false as any }).paginate('', { prefixUrl: 'https://example.com' }); await t.throwsAsync(iterator.next(), { message: '`options.pagination` must be implemented' }); }); test('throws if the `pagination` option does not have `transform` property', async t => { const iterator = got.paginate('', { pagination: {...resetPagination}, prefixUrl: 'https://example.com' }); await t.throwsAsync(iterator.next(), { message: '`options.pagination.transform` must be implemented' }); }); test('throws if the `pagination` option does not have `shouldContinue` property', async t => { const iterator = got.paginate('', { pagination: { ...resetPagination, transform: thrower }, prefixUrl: 'https://example.com' }); await t.throwsAsync(iterator.next(), { message: '`options.pagination.shouldContinue` must be implemented' }); }); test('throws if the `pagination` option does not have `filter` property', async t => { const iterator = got.paginate('', { pagination: { ...resetPagination, transform: thrower, shouldContinue: thrower, paginate: thrower }, prefixUrl: 'https://example.com' }); await t.throwsAsync(iterator.next(), { message: '`options.pagination.filter` must be implemented' }); }); test('throws if the `pagination` option does not have `paginate` property', async t => { const iterator = got.paginate('', { pagination: { ...resetPagination, transform: thrower, shouldContinue: thrower, filter: thrower }, prefixUrl: 'https://example.com' }); await t.throwsAsync(iterator.next(), { message: '`options.pagination.paginate` must be implemented' }); }); test('ignores the `resolveBodyOnly` option', withServer, async (t, server, got) => { attachHandler(server, 2); const items = await got.paginate.all('', { resolveBodyOnly: true }); t.deepEqual(items, [1, 2]); }); test('allowGetBody sends json payload with .paginate()', withBodyParsingServer, async (t, server, got) => { server.get('/', (request, response) => { if (request.body.hello !== 'world') { response.statusCode = 400; } response.end(JSON.stringify([1, 2, 3])); }); const iterator = got.paginate({ allowGetBody: true, json: {hello: 'world'}, retry: 0 }); const results: number[] = []; for await (const item of iterator) { results.push(item); } t.deepEqual(results, [1, 2, 3]); }); test('`hooks` are not duplicated', withServer, async (t, server, got) => { let page = 1; server.get('/', (_request, response) => { response.end(JSON.stringify([page++])); }); const nopHook = () => {}; const result = await got.paginate.all({ pagination: { paginate: response => { if ((response.body as string) === '[3]') { return false; // Stop after page 3 } const {options} = response.request; const {init, beforeRequest, beforeRedirect, beforeRetry, afterResponse, beforeError} = options.hooks; const hooksCount = [init, beforeRequest, beforeRedirect, beforeRetry, afterResponse, beforeError].map(a => a.length); t.deepEqual(hooksCount, [1, 1, 1, 1, 1, 1]); return options; } }, hooks: { init: [nopHook], beforeRequest: [nopHook], beforeRedirect: [nopHook], beforeRetry: [nopHook], afterResponse: [response => response], beforeError: [error => error] } }); t.deepEqual(result, [1, 2, 3]); }); test('allowGetBody sends correct json payload with .paginate()', withServer, async (t, server, got) => { let page = 1; server.get('/', async (request, response) => { const payload = await getStream(request); try { JSON.parse(payload); } catch { response.statusCode = 422; } if (request.headers['content-length']) { t.is(Number(request.headers['content-length'] || 0), Buffer.byteLength(payload)); } response.end(JSON.stringify([page++])); }); let body = ''; const iterator = got.paginate({ allowGetBody: true, retry: 0, json: {body}, pagination: { paginate: () => { if (body.length === 2) { return false; } body += 'a'; return { json: {body} }; } } }); const results: number[] = []; for await (const item of iterator) { results.push(item); } t.deepEqual(results, [1, 2, 3]); }); test('`requestLimit` works', withServer, async (t, server, got) => { attachHandler(server, 2); const options = { pagination: { requestLimit: 1 } }; const results: number[] = []; for await (const item of got.paginate(options)) { results.push(item); } t.deepEqual(results, [1]); }); test('`backoff` works', withServer, async (t, server, got) => { attachHandler(server, 2); const backoff = 200; const asyncIterator: AsyncIterator = got.paginate('', { pagination: { backoff } }); t.is((await asyncIterator.next()).value, 1); let receivedLastOne = false; const start = Date.now(); const promise = asyncIterator.next(); (async () => { await promise; receivedLastOne = true; })(); await delay(backoff / 2); t.false(receivedLastOne); await promise; t.true(Date.now() - start >= backoff); }); test('`stackAllItems` set to true', withServer, async (t, server, got) => { attachHandler(server, 3); let itemCount = 0; const result = await got.paginate.all({ pagination: { stackAllItems: true, filter: (_item, allItems, _currentItems) => { t.is(allItems.length, itemCount); return true; }, shouldContinue: (_item, allItems, _currentItems) => { t.is(allItems.length, itemCount); return true; }, paginate: (response, allItems, currentItems) => { itemCount += 1; t.is(allItems.length, itemCount); return got.defaults.options.pagination!.paginate(response, allItems, currentItems); } } }); t.deepEqual(result, [1, 2, 3]); }); test('`stackAllItems` set to false', withServer, async (t, server, got) => { attachHandler(server, 3); const result = await got.paginate.all({ pagination: { stackAllItems: false, filter: (_item, allItems, _currentItems) => { t.is(allItems.length, 0); return true; }, shouldContinue: (_item, allItems, _currentItems) => { t.is(allItems.length, 0); return true; }, paginate: (response, allItems, currentItems) => { t.is(allItems.length, 0); return got.defaults.options.pagination!.paginate(response, allItems, currentItems); } } }); t.deepEqual(result, [1, 2, 3]); }); test('next url in json response', withServer, async (t, server, got) => { server.get('/', (request, response) => { const parameters = new URLSearchParams(request.url.slice(2)); const page = Number(parameters.get('page') ?? 0); response.end(JSON.stringify({ currentUrl: request.url, next: page < 3 ? `${server.url}/?page=${page + 1}` : undefined })); }); interface Page { currentUrl: string; next?: string; } const all = await got.paginate.all('', { searchParams: { page: 0 }, responseType: 'json', pagination: { transform: (response: Response) => { return [response.body.currentUrl]; }, paginate: (response: Response) => { const {next} = response.body; if (!next) { return false; } return { url: next, prefixUrl: '', searchParams: undefined }; } } }); t.deepEqual(all, [ '/?page=0', '/?page=1', '/?page=2', '/?page=3' ]); }); test('pagination using searchParams', withServer, async (t, server, got) => { server.get('/', (request, response) => { const parameters = new URLSearchParams(request.url.slice(2)); const page = Number(parameters.get('page') ?? 0); response.end(JSON.stringify({ currentUrl: request.url, next: page < 3 })); }); interface Page { currentUrl: string; next?: string; } const all = await got.paginate.all('', { searchParams: { page: 0 }, responseType: 'json', pagination: { transform: (response: Response) => { return [response.body.currentUrl]; }, paginate: (response: Response) => { const {next} = response.body; const previousPage = Number(response.request.options.searchParams!.get('page')); if (!next) { return false; } return { searchParams: { page: previousPage + 1 } }; } } }); t.deepEqual(all, [ '/?page=0', '/?page=1', '/?page=2', '/?page=3' ]); }); test('pagination using extended searchParams', withServer, async (t, server, got) => { server.get('/', (request, response) => { const parameters = new URLSearchParams(request.url.slice(2)); const page = Number(parameters.get('page') ?? 0); response.end(JSON.stringify({ currentUrl: request.url, next: page < 3 })); }); interface Page { currentUrl: string; next?: string; } const client = got.extend({ searchParams: { limit: 10 } }); const all = await client.paginate.all('', { searchParams: { page: 0 }, responseType: 'json', pagination: { transform: (response: Response) => { return [response.body.currentUrl]; }, paginate: (response: Response) => { const {next} = response.body; const previousPage = Number(response.request.options.searchParams!.get('page')); if (!next) { return false; } return { searchParams: { page: previousPage + 1 } }; } } }); t.deepEqual(all, [ '/?page=0&limit=10', '/?page=1&limit=10', '/?page=2&limit=10', '/?page=3&limit=10' ]); }); sindresorhus-got-11d2e83/test/post.ts000066400000000000000000000221701434406364000177040ustar00rootroot00000000000000import {promisify} from 'util'; import stream = require('stream'); import fs = require('fs'); import path = require('path'); import test from 'ava'; import delay = require('delay'); import pEvent = require('p-event'); import {Handler} from 'express'; import getStream = require('get-stream'); import toReadableStream = require('to-readable-stream'); import got, {UploadError} from '../source'; import withServer from './helpers/with-server'; const pStreamPipeline = promisify(stream.pipeline); const defaultEndpoint: Handler = async (request, response) => { response.setHeader('method', request.method); await pStreamPipeline(request, response); }; const echoHeaders: Handler = (request, response) => { response.end(JSON.stringify(request.headers)); }; test('GET cannot have body without the `allowGetBody` option', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); await t.throwsAsync(got.get({body: 'hi'}), {message: 'The `GET` method cannot be used with a body'}); }); test('GET can have body with option allowGetBody', withServer, async (t, server, got) => { server.get('/', defaultEndpoint); await t.notThrowsAsync(got.get({body: 'hi', allowGetBody: true})); }); test('invalid body', async t => { await t.throwsAsync( // @ts-expect-error Error tests got.post('https://example.com', {body: {}}), { message: 'The `body` option must be a stream.Readable, string or Buffer' } ); }); test('sends strings', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({body: 'wow'}); t.is(body, 'wow'); }); test('sends Buffers', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({body: Buffer.from('wow')}); t.is(body, 'wow'); }); test('sends Streams', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({body: toReadableStream('wow')}); t.is(body, 'wow'); }); test('sends plain objects as forms', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({ form: {such: 'wow'} }); t.is(body, 'such=wow'); }); test('does NOT support sending arrays as forms', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); await t.throwsAsync(got.post({ form: ['such', 'wow'] }), { message: 'Each query pair must be an iterable [name, value] tuple' }); }); test('sends plain objects as JSON', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({ json: {such: 'wow'}, responseType: 'json' }); t.deepEqual(body, {such: 'wow'}); }); test('sends arrays as JSON', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post({ json: ['such', 'wow'], responseType: 'json' }); t.deepEqual(body, ['such', 'wow']); }); test('works with empty post response', withServer, async (t, server, got) => { server.post('/empty', (_request, response) => { response.end(); }); const {body} = await got.post('empty', {body: 'wow'}); t.is(body, ''); }); test('`content-length` header with string body', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({body: 'wow'}); const headers = JSON.parse(body); t.is(headers['content-length'], '3'); }); test('`content-length` header with json body', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({json: {foo: 'bar'}}); const headers = JSON.parse(body); t.is(headers['content-length'], '13'); }); test('`content-length` header with form body', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({form: {foo: 'bar'}}); const headers = JSON.parse(body); t.is(headers['content-length'], '7'); }); test('`content-length` header with Buffer body', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({body: Buffer.from('wow')}); const headers = JSON.parse(body); t.is(headers['content-length'], '3'); }); test('`content-length` header with Stream body', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({body: toReadableStream('wow')}); const headers = JSON.parse(body); t.is(headers['transfer-encoding'], 'chunked', 'likely failed to get headers at all'); t.is(headers['content-length'], undefined); }); test('`content-length` header is not overriden', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({ body: 'wow', headers: { 'content-length': '10' } }); const headers = JSON.parse(body); t.is(headers['content-length'], '10'); }); test('`content-length` header is present when using custom content-type', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({ json: {foo: 'bar'}, headers: { 'content-type': 'custom' } }); const headers = JSON.parse(body); t.is(headers['content-length'], '13'); }); test('`content-length` header disabled for chunked transfer-encoding', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body} = await got.post({ body: '3\r\nwow\r\n0\r\n', headers: { 'transfer-encoding': 'chunked' } }); const headers = JSON.parse(body); t.is(headers['transfer-encoding'], 'chunked', 'likely failed to get headers at all'); t.is(headers['content-length'], undefined); }); test('`content-type` header is not overriden when object in `options.body`', withServer, async (t, server, got) => { server.post('/', echoHeaders); const {body: headers} = await got.post>({ headers: { 'content-type': 'doge' }, json: { such: 'wow' }, responseType: 'json' }); t.is(headers['content-type'], 'doge'); }); test('throws when form body is not a plain object or array', async t => { // @ts-expect-error Manual test await t.throwsAsync(got.post('https://example.com', {form: 'such=wow'}), { message: 'The `form` option must be an Object' }); }); // See https://github.com/sindresorhus/got/issues/897 test('the `json` payload is not touched', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const {body} = await got.post<{context: {foo: true}}>({ json: { context: { foo: true } }, responseType: 'json' }); t.true('context' in body); t.true(body.context.foo); }); test('the `body` payload is not touched', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const buffer = Buffer.from('Hello, Got!'); await got.post({ body: buffer, hooks: { beforeRequest: [ options => { t.is(options.body, buffer); } ] } }); }); test('the `form` payload is not touched', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const object = { foo: 'bar' }; await got.post({ form: object, hooks: { beforeRequest: [ options => { t.is(options.form, object); } ] } }); }); test('DELETE method sends plain objects as JSON', withServer, async (t, server, got) => { server.delete('/', defaultEndpoint); const {body} = await got.delete({ json: {such: 'wow'}, responseType: 'json' }); t.deepEqual(body, {such: 'wow'}); }); test('catches body errors before calling pipeline() - promise', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); await t.throwsAsync(got.post({ body: fs.createReadStream('./file-that-does-not-exist.txt') }), { message: /ENOENT: no such file or directory/ }); // Wait for unhandled errors await delay(100); }); test('catches body errors before calling pipeline() - stream', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); await t.throwsAsync(getStream(got.stream.post({ body: fs.createReadStream('./file-that-does-not-exist.txt') })), { message: /ENOENT: no such file or directory/ }); // Wait for unhandled errors await delay(100); }); test('body - file read stream', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const fullPath = path.resolve('test/fixtures/ok'); const toSend = await getStream(fs.createReadStream(fullPath)); const body = await got.post({ body: fs.createReadStream(fullPath) }).text(); t.is(toSend, body); }); test('body - file read stream, wait for `ready` event', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const fullPath = path.resolve('test/fixtures/ok'); const toSend = await getStream(fs.createReadStream(fullPath)); const ifStream = fs.createReadStream(fullPath); await pEvent(ifStream, 'ready'); const body = await got.post({ body: ifStream }).text(); t.is(toSend, body); }); test('throws on upload error', withServer, async (t, server, got) => { server.post('/', defaultEndpoint); const body = new stream.PassThrough(); const message = 'oh no'; await t.throwsAsync(getStream(got.stream.post({ body, hooks: { beforeRequest: [ () => { process.nextTick(() => { body.destroy(new Error(message)); }); } ] } })), { instanceOf: UploadError, code: 'ERR_UPLOAD', message }); }); sindresorhus-got-11d2e83/test/progress.ts000066400000000000000000000124611434406364000205650ustar00rootroot00000000000000import {promisify} from 'util'; import stream = require('stream'); import fs = require('fs'); import SlowStream = require('slow-stream'); import toReadableStream = require('to-readable-stream'); import getStream = require('get-stream'); import FormData = require('form-data'); import tempy = require('tempy'); import is from '@sindresorhus/is'; import test, {ExecutionContext} from 'ava'; import {Handler} from 'express'; import {Progress} from '../source'; import withServer from './helpers/with-server'; const checkEvents = (t: ExecutionContext, events: Progress[], bodySize?: number) => { t.true(events.length >= 2); let lastEvent = events.shift()!; if (!is.number(bodySize)) { t.is(lastEvent.percent, 0); } for (const [index, event] of events.entries()) { const isLastEvent = index === events.length - 1; if (is.number(bodySize)) { t.is(event.percent, event.transferred / bodySize); t.true(event.percent > lastEvent.percent); t.true(event.transferred > lastEvent.transferred); } else if (isLastEvent) { t.is(event.percent, 1); t.is(event.transferred, lastEvent.transferred); t.is(event.total, event.transferred); } else { t.is(event.percent, 0); t.true(event.transferred > lastEvent.transferred); } lastEvent = event; } }; const file = Buffer.alloc(1024 * 1024 * 2); const downloadEndpoint: Handler = (_request, response) => { response.setHeader('content-length', file.length); stream.pipeline( toReadableStream(file), new SlowStream({maxWriteInterval: 50}), response, () => { response.end(); } ); }; const noTotalEndpoint: Handler = (_request, response) => { response.write('hello'); response.end(); }; const uploadEndpoint: Handler = (request, response) => { stream.pipeline( request, new SlowStream({maxWriteInterval: 100}), () => { response.end(); } ); }; test('download progress', withServer, async (t, server, got) => { server.get('/', downloadEndpoint); const events: Progress[] = []; const {body} = await got({responseType: 'buffer'}) .on('downloadProgress', event => events.push(event)); checkEvents(t, events, body.length); }); test('download progress - missing total size', withServer, async (t, server, got) => { server.get('/', noTotalEndpoint); const events: Progress[] = []; await got('').on('downloadProgress', (event: Progress) => events.push(event)); t.is(events[0].total, undefined); checkEvents(t, events); }); test('download progress - stream', withServer, async (t, server, got) => { server.get('/', downloadEndpoint); const events: Progress[] = []; const stream = got.stream({responseType: 'buffer'}) .on('downloadProgress', event => events.push(event)); await getStream(stream); checkEvents(t, events, file.length); }); test('upload progress - file', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const events: Progress[] = []; await got.post({body: file}).on('uploadProgress', (event: Progress) => events.push(event)); checkEvents(t, events, file.length); }); test('upload progress - file stream', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const path = tempy.file(); fs.writeFileSync(path, file); const events: Progress[] = []; await got.post({body: fs.createReadStream(path)}) .on('uploadProgress', (event: Progress) => events.push(event)); checkEvents(t, events, file.length); }); test('upload progress - form data', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const events: Progress[] = []; const body = new FormData(); body.append('key', 'value'); body.append('file', file); const size = await promisify(body.getLength.bind(body))(); await got.post({body}).on('uploadProgress', (event: Progress) => events.push(event)); checkEvents(t, events, size); }); test('upload progress - json', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const body = JSON.stringify({key: 'value'}); const size = Buffer.byteLength(body); const events: Progress[] = []; await got.post({body}).on('uploadProgress', (event: Progress) => events.push(event)); checkEvents(t, events, size); }); test('upload progress - stream with known body size', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const events: Progress[] = []; const options = { headers: {'content-length': file.length.toString()} }; const request = got.stream.post(options) .on('uploadProgress', event => events.push(event)); await getStream( stream.pipeline(toReadableStream(file), request, () => {}) ); checkEvents(t, events, file.length); }); test('upload progress - stream with unknown body size', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const events: Progress[] = []; const request = got.stream.post('') .on('uploadProgress', event => events.push(event)); await getStream( stream.pipeline(toReadableStream(file), request, () => {}) ); t.is(events[0].total, undefined); checkEvents(t, events); }); test('upload progress - no body', withServer, async (t, server, got) => { server.post('/', uploadEndpoint); const events: Progress[] = []; await got.post('').on('uploadProgress', (event: Progress) => events.push(event)); t.deepEqual(events, [ { percent: 0, transferred: 0, total: undefined }, { percent: 1, transferred: 0, total: 0 } ]); }); sindresorhus-got-11d2e83/test/promise.ts000066400000000000000000000053371434406364000204030ustar00rootroot00000000000000import {ReadStream} from 'fs'; import {ClientRequest, IncomingMessage} from 'http'; import test from 'ava'; import {Response, CancelError} from '../source'; import withServer from './helpers/with-server'; test('emits request event as promise', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 200; response.end('null'); }); await got('').json().on('request', (request: ClientRequest) => { t.true(request instanceof ClientRequest); }); }); test('emits response event as promise', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 200; response.end('null'); }); await got('').json().on('response', (response: Response) => { t.true(response instanceof IncomingMessage); t.true(response.readable); t.is(response.statusCode, 200); t.is(response.ip, '127.0.0.1'); }); }); test('returns buffer on compressed response', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('content-encoding', 'gzip'); response.end(); }); const {body} = await got({decompress: false}); t.true(Buffer.isBuffer(body)); }); test('no unhandled `The server aborted pending request` rejection', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 503; response.write('asdf'); setTimeout(() => { response.end(); }, 100); }); await t.throwsAsync(got('')); }); test('promise.json() can be called before a file stream body is open', withServer, async (t, server, got) => { server.post('/', (request, response) => { request.resume(); request.once('end', () => { response.end('""'); }); }); // @ts-expect-error @types/node has wrong types. const body = new ReadStream('', { fs: { open: () => {}, read: () => {}, close: () => {} } }); const promise = got({body}); const checks = [ t.throwsAsync(promise, { instanceOf: CancelError, code: 'ERR_CANCELED' }), t.throwsAsync(promise.json(), { instanceOf: CancelError, code: 'ERR_CANCELED' }) ]; promise.cancel(); await Promise.all(checks); }); test('promise.json() does not fail when server returns an error and throwHttpErrors is disabled', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 400; response.end('{}'); }); const promise = got('', {throwHttpErrors: false}); await t.notThrowsAsync(promise.json()); }); test('the request is destroyed once the promise has resolved', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 200; response.end('null'); }); const {request} = await got(''); t.true(request.destroyed); }); sindresorhus-got-11d2e83/test/redirects.ts000066400000000000000000000320551434406364000207060ustar00rootroot00000000000000import test from 'ava'; import {Handler} from 'express'; import nock = require('nock'); import got, {MaxRedirectsError, RequestError} from '../source'; import withServer, {withHttpsServer} from './helpers/with-server'; const reachedHandler: Handler = (_request, response) => { const body = 'reached'; response.writeHead(200, { 'content-length': body.length }); response.end(body); }; const finiteHandler: Handler = (_request, response) => { response.writeHead(302, { location: '/' }); response.end(); }; const relativeHandler: Handler = (_request, response) => { response.writeHead(302, { location: '/' }); response.end(); }; test('follows redirect', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/finite', finiteHandler); const {body, redirectUrls} = await got('finite'); t.is(body, 'reached'); t.deepEqual(redirectUrls, [`${server.url}/`]); }); test('follows 307, 308 redirect', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/temporary', (_request, response) => { response.writeHead(307, { location: '/' }); response.end(); }); server.get('/permanent', (_request, response) => { response.writeHead(308, { location: '/' }); response.end(); }); const temporaryBody = (await got('temporary')).body; t.is(temporaryBody, 'reached'); const permBody = (await got('permanent')).body; t.is(permBody, 'reached'); }); test('does not follow redirect when disabled', withServer, async (t, server, got) => { server.get('/', finiteHandler); t.is((await got({followRedirect: false})).statusCode, 302); }); test('relative redirect works', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/relative', relativeHandler); t.is((await got('relative')).body, 'reached'); }); test('throws on endless redirects - default behavior', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: server.url }); response.end(); }); const error = await t.throwsAsync(got(''), {message: 'Redirected 10 times. Aborting.'}); t.deepEqual(error.response.redirectUrls, new Array(10).fill(`${server.url}/`)); t.is(error.code, 'ERR_TOO_MANY_REDIRECTS'); }); test('custom `maxRedirects` option', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: server.url }); response.end(); }); const error = await t.throwsAsync(got('', {maxRedirects: 5}), {message: 'Redirected 5 times. Aborting.'}); t.deepEqual(error.response.redirectUrls, new Array(5).fill(`${server.url}/`)); t.is(error.code, 'ERR_TOO_MANY_REDIRECTS'); }); test('searchParams are not breaking redirects', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/relativeSearchParam', (request, response) => { t.is(request.query.bang, '1'); response.writeHead(302, { location: '/' }); response.end(); }); t.is((await got('relativeSearchParam', {searchParams: 'bang=1'})).body, 'reached'); }); test('redirects GET and HEAD requests', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(308, { location: '/' }); response.end(); }); await t.throwsAsync(got.get(''), { instanceOf: got.MaxRedirectsError, code: 'ERR_TOO_MANY_REDIRECTS' }); }); test('redirects POST requests', withServer, async (t, server, got) => { server.post('/', (_request, response) => { response.writeHead(308, { location: '/' }); response.end(); }); await t.throwsAsync(got.post({body: 'wow'}), { instanceOf: got.MaxRedirectsError, code: 'ERR_TOO_MANY_REDIRECTS' }); }); test('redirects on 303 if GET or HEAD', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.head('/seeOther', (_request, response) => { response.writeHead(303, { location: '/' }); response.end(); }); const {url, headers, request} = await got.head('seeOther'); t.is(url, `${server.url}/`); t.is(headers['content-length'], 'reached'.length.toString()); t.is(request.options.method, 'HEAD'); }); test('removes body on GET redirect', withServer, async (t, server, got) => { server.get('/', (request, response) => request.pipe(response)); server.post('/seeOther', (_request, response) => { response.writeHead(303, { location: '/' }); response.end(); }); const {headers, body} = await got.post('seeOther', {body: 'hello'}); t.is(body, ''); t.is(headers['content-length'], '0'); }); test('redirects on 303 response even on post, put, delete', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.post('/seeOther', (_request, response) => { response.writeHead(303, { location: '/' }); response.end(); }); const {url, body} = await got.post('seeOther', {body: 'wow'}); t.is(url, `${server.url}/`); t.is(body, 'reached'); }); test('redirects from http to https work', withServer, async (t, serverHttp) => { await withHttpsServer()(t, async (t, serverHttps, got) => { serverHttp.get('/', (_request, response) => { response.end('http'); }); serverHttps.get('/', (_request, response) => { response.end('https'); }); serverHttp.get('/httpToHttps', (_request, response) => { response.writeHead(302, { location: serverHttps.url }); response.end(); }); t.is((await got('httpToHttps', { prefixUrl: serverHttp.url })).body, 'https'); }); }); test('redirects from https to http work', withHttpsServer(), async (t, serverHttps, got) => { await withServer(t, async (t, serverHttp) => { serverHttp.get('/', (_request, response) => { response.end('http'); }); serverHttps.get('/', (_request, response) => { response.end('https'); }); serverHttps.get('/httpsToHttp', (_request, response) => { response.writeHead(302, { location: serverHttp.url }); response.end(); }); t.is((await got('httpsToHttp', { prefixUrl: serverHttps.url })).body, 'http'); }); }); test('redirects works with lowercase method', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/relative', relativeHandler); const {body} = await got('relative', {method: 'head'}); t.is(body, ''); }); test('redirect response contains new url', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/finite', finiteHandler); const {url} = await got('finite'); t.is(url, `${server.url}/`); }); test('redirect response contains old url', withServer, async (t, server, got) => { server.get('/', reachedHandler); server.get('/finite', finiteHandler); const {requestUrl} = await got('finite'); t.is(requestUrl, `${server.url}/finite`); }); test('redirect response contains UTF-8 with binary encoding', withServer, async (t, server, got) => { server.get('/utf8-url-%C3%A1%C3%A9', reachedHandler); server.get('/redirect-with-utf8-binary', (_request, response) => { response.writeHead(302, { location: Buffer.from((new URL('/utf8-url-áé', server.url)).toString(), 'utf8').toString('binary') }); response.end(); }); t.is((await got('redirect-with-utf8-binary')).body, 'reached'); }); test('redirect response contains UTF-8 with URI encoding', withServer, async (t, server, got) => { server.get('/', (request, response) => { t.is(request.query.test, 'it’s ok'); response.end('reached'); }); server.get('/redirect-with-uri-encoded-location', (_request, response) => { response.writeHead(302, { location: new URL('/?test=it’s+ok', server.url).toString() }); response.end(); }); t.is((await got('redirect-with-uri-encoded-location')).body, 'reached'); }); test('throws on malformed redirect URI', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: '/%D8' }); response.end(); }); await t.throwsAsync(got(''), { message: 'URI malformed' }); }); test('throws on invalid redirect URL', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: 'http://' }); response.end(); }); await t.throwsAsync(got(''), { code: 'ERR_INVALID_URL' }); }); test('port is reset on redirect', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(307, { location: 'http://localhost' }); response.end(); }); nock('http://localhost').get('/').reply(200, 'ok'); const {body} = await got(''); t.is(body, 'ok'); }); test('body is reset on GET redirect', withServer, async (t, server, got) => { server.post('/', (_request, response) => { response.writeHead(303, { location: '/' }); response.end(); }); server.get('/', (_request, response) => { response.end(); }); await got.post('', { body: 'foobar', hooks: { beforeRedirect: [ options => { t.is(options.body, undefined); } ] } }); await got.post('', { json: {foo: 'bar'}, hooks: { beforeRedirect: [ options => { t.is(options.body, undefined); } ] } }); await got.post('', { form: {foo: 'bar'}, hooks: { beforeRedirect: [ options => { t.is(options.body, undefined); } ] } }); }); test('body is passed on POST redirect', withServer, async (t, server, got) => { server.post('/redirect', (_request, response) => { response.writeHead(302, { location: '/' }); response.end(); }); server.post('/', (request, response) => { request.pipe(response); }); const {body} = await got.post('redirect', { body: 'foobar', hooks: { beforeRedirect: [ options => { t.is(options.body, 'foobar'); } ] } }); t.is(body, 'foobar'); }); test('method rewriting can be turned off', withServer, async (t, server, got) => { server.post('/redirect', (_request, response) => { response.writeHead(302, { location: '/' }); response.end(); }); server.get('/', (_request, response) => { response.end(); }); const {body} = await got.post('redirect', { body: 'foobar', methodRewriting: false, hooks: { beforeRedirect: [ options => { t.is(options.body, undefined); } ] } }); t.is(body, ''); }); test('clears username and password when redirecting to a different hostname', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: 'https://httpbin.org/anything' }); response.end(); }); const {headers} = await got('', { username: 'hello', password: 'world' }).json(); t.is(headers.Authorization, undefined); }); test('clears the authorization header when redirecting to a different hostname', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.writeHead(302, { location: 'https://httpbin.org/anything' }); response.end(); }); const {headers} = await got('', { headers: { authorization: 'Basic aGVsbG86d29ybGQ=' } }).json(); t.is(headers.Authorization, undefined); }); test('preserves userinfo on redirect to the same origin', withServer, async (t, server) => { server.get('/redirect', (_request, response) => { response.writeHead(303, { location: `http://localhost:${server.port}/` }); response.end(); }); server.get('/', (request, response) => { t.is(request.headers.authorization, 'Basic aGVsbG86d29ybGQ='); response.end(); }); await got(`http://hello:world@localhost:${server.port}/redirect`); }); test('clears the host header when redirecting to a different hostname', async t => { nock('https://testweb.com').get('/redirect').reply(302, undefined, {location: 'https://webtest.com/'}); nock('https://webtest.com').get('/').reply(function (_uri, _body) { return [200, this.req.getHeader('host')]; }); const resp = await got('https://testweb.com/redirect', {headers: {host: 'wrongsite.com'}}); t.is(resp.body, 'webtest.com'); }); test('correct port on redirect', withServer, async (t, server1, got) => { await withServer(t, async (t, server2) => { server1.get('/redirect', (_request, response) => { response.redirect(`http://${server2.hostname}:${server2.port}/`); }); server1.get('/', (_request, response) => { response.end('SERVER1'); }); server2.get('/', (_request, response) => { response.end('SERVER2'); }); const response = await got({ protocol: 'http:', hostname: server1.hostname, port: server1.port, pathname: '/redirect' }); t.is(response.body, 'SERVER2'); }); }); const unixProtocol: Handler = (_request, response) => { response.writeHead(302, { location: 'unix:/var/run/docker.sock:/containers/json' }); response.end(); }; const unixHostname: Handler = (_request, response) => { response.writeHead(302, { location: 'http://unix:/var/run/docker.sock:/containers/json' }); response.end(); }; test('cannot redirect to unix protocol', withServer, async (t, server, got) => { server.get('/protocol', unixProtocol); server.get('/hostname', unixHostname); await t.throwsAsync(got('protocol'), { message: 'Cannot redirect to UNIX socket', instanceOf: RequestError }); await t.throwsAsync(got('hostname'), { message: 'Cannot redirect to UNIX socket', instanceOf: RequestError }); }); sindresorhus-got-11d2e83/test/response-parse.ts000066400000000000000000000165671434406364000217020ustar00rootroot00000000000000import test from 'ava'; import {Handler} from 'express'; import getStream = require('get-stream'); import {HTTPError, ParseError} from '../source'; import withServer from './helpers/with-server'; const dog = {data: 'dog'}; const jsonResponse = JSON.stringify(dog); const defaultHandler: Handler = (_request, response) => { response.end(jsonResponse); }; test('`options.resolveBodyOnly` works', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual(await got>({responseType: 'json', resolveBodyOnly: true}), dog); }); test('`options.resolveBodyOnly` combined with `options.throwHttpErrors`', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 404; response.end('/'); }); t.is(await got({resolveBodyOnly: true, throwHttpErrors: false}), '/'); }); test('JSON response', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual((await got({responseType: 'json'})).body, dog); }); test('Buffer response', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual((await got({responseType: 'buffer'})).body, Buffer.from(jsonResponse)); }); test('Text response', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.is((await got({responseType: 'text'})).body, jsonResponse); }); test('Text response #2', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.is((await got({responseType: undefined})).body, jsonResponse); }); test('JSON response - promise.json()', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual(await got('').json(), dog); }); test('Buffer response - promise.buffer()', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual(await got('').buffer(), Buffer.from(jsonResponse)); }); test('Text response - promise.text()', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.is(await got('').text(), jsonResponse); }); test('Text response - promise.json().text()', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.is(await got('').json().text(), jsonResponse); }); test('works if promise has been already resolved', withServer, async (t, server, got) => { server.get('/', defaultHandler); const promise = got('').text(); t.is(await promise, jsonResponse); t.deepEqual(await promise.json(), dog); }); test('throws an error on invalid response type', withServer, async (t, server, got) => { server.get('/', defaultHandler); // @ts-expect-error Error tests const error = await t.throwsAsync(got({responseType: 'invalid'})); t.regex(error.message, /^Unknown body type 'invalid'/); t.true(error.message.includes(error.options.url.hostname)); t.is(error.options.url.pathname, '/'); t.is(error.code, 'ERR_BODY_PARSE_FAILURE'); }); test('wraps parsing errors', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('/'); }); const error = await t.throwsAsync(got({responseType: 'json'}), {instanceOf: got.ParseError}); t.true(error.message.includes(error.options.url.hostname)); t.is(error.options.url.pathname, '/'); t.is(error.code, 'ERR_BODY_PARSE_FAILURE'); }); test('parses non-200 responses', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end(jsonResponse); }); const error = await t.throwsAsync(got({responseType: 'json', retry: 0}), {instanceOf: HTTPError}); t.deepEqual(error.response.body, dog); }); test('ignores errors on invalid non-200 responses', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end('Internal error'); }); const error = await t.throwsAsync(got({responseType: 'json', retry: 0}), { instanceOf: got.HTTPError, message: 'Response code 500 (Internal Server Error)' }); t.is(error.response.body, 'Internal error'); t.is(error.options.url.pathname, '/'); }); test('parse errors have `response` property', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('/'); }); const error = await t.throwsAsync(got({responseType: 'json'}), {instanceOf: ParseError}); t.is(error.response.statusCode, 200); t.is(error.response.body, '/'); t.is(error.code, 'ERR_BODY_PARSE_FAILURE'); }); test('sets correct headers', withServer, async (t, server, got) => { server.post('/', (request, response) => { response.end(JSON.stringify(request.headers)); }); const {body: headers} = await got.post>({responseType: 'json', json: {}}); t.is(headers['content-type'], 'application/json'); t.is(headers.accept, 'application/json'); }); test('doesn\'t throw on 204 No Content', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 204; response.end(); }); const body = await got('').json(); t.is(body, ''); }); test('doesn\'t throw on empty bodies', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 200; response.end(); }); const body = await got('').json(); t.is(body, ''); }); test('.buffer() returns binary content', withServer, async (t, server, got) => { const body = Buffer.from('89504E470D0A1A0A0000000D49484452', 'hex'); server.get('/', (_request, response) => { response.end(body); }); const buffer = await got('').buffer(); t.is(Buffer.compare(buffer, body), 0); }); test('shortcuts throw ParseErrors', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('not a json'); }); await t.throwsAsync(got('').json(), { instanceOf: ParseError, code: 'ERR_BODY_PARSE_FAILURE', message: /^Unexpected token o in JSON at position 1 in/ }); }); test('shortcuts result properly when retrying in afterResponse', withServer, async (t, server, got) => { const nasty = JSON.stringify({hello: 'nasty'}); const proper = JSON.stringify({hello: 'world'}); server.get('/', (request, response) => { if (request.headers.token === 'unicorn') { response.end(proper); } else { response.statusCode = 401; response.end(nasty); } }); const promise = got({ hooks: { afterResponse: [ (response, retryWithMergedOptions) => { if (response.statusCode === 401) { return retryWithMergedOptions({ headers: { token: 'unicorn' } }); } return response; } ] } }); const json = await promise.json<{hello: string}>(); const text = await promise.text(); const buffer = await promise.buffer(); t.is(json.hello, 'world'); t.is(text, proper); t.is(buffer.compare(Buffer.from(proper)), 0); }); test('responseType is optional when using template', withServer, async (t, server, got) => { const data = {hello: 'world'}; server.post('/', async (request, response) => { response.end(await getStream(request)); }); const jsonClient = got.extend({responseType: 'json'}); const {body} = await jsonClient.post('', {json: data}); t.deepEqual(body, data); }); test('JSON response custom parser', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.deepEqual((await got({ responseType: 'json', parseJson: text => ({...JSON.parse(text), custom: 'parser'}) })).body, {...dog, custom: 'parser'}); }); sindresorhus-got-11d2e83/test/retry.ts000066400000000000000000000265651434406364000201000ustar00rootroot00000000000000import {EventEmitter} from 'events'; import {PassThrough as PassThroughStream} from 'stream'; import {Socket} from 'net'; import http = require('http'); import test from 'ava'; import is from '@sindresorhus/is'; import {Handler} from 'express'; import getStream = require('get-stream'); import pEvent = require('p-event'); import got, {HTTPError} from '../source'; import withServer from './helpers/with-server'; const retryAfterOn413 = 2; const socketTimeout = 300; const handler413: Handler = (_request, response) => { response.writeHead(413, { 'Retry-After': retryAfterOn413 }); response.end(); }; const createSocketTimeoutStream = (): http.ClientRequest => { const stream = new PassThroughStream(); // @ts-expect-error Mocking the behaviour of a ClientRequest stream.setTimeout = (ms, callback) => { process.nextTick(callback); }; // @ts-expect-error Mocking the behaviour of a ClientRequest stream.abort = () => {}; stream.resume(); return stream as unknown as http.ClientRequest; }; test('works on timeout', withServer, async (t, server, got) => { let knocks = 0; server.get('/', (_request, response) => { response.end('who`s there?'); }); t.is((await got({ timeout: { socket: socketTimeout }, request: (...args: [ string | URL | http.RequestOptions, (http.RequestOptions | ((response: http.IncomingMessage) => void))?, ((response: http.IncomingMessage) => void)? ]) => { if (knocks === 1) { // @ts-expect-error Overload error return http.request(...args); } knocks++; return createSocketTimeoutStream(); } })).body, 'who`s there?'); }); test('retry function gets iteration count', withServer, async (t, server, got) => { let knocks = 0; server.get('/', (_request, response) => { if (knocks++ === 1) { response.end('who`s there?'); return; } response.statusCode = 500; response.end(); }); await got({ retry: { calculateDelay: ({attemptCount}) => { t.true(is.number(attemptCount)); return attemptCount < 2 ? 1 : 0; } } }); }); test('setting to `0` disables retrying', async t => { await t.throwsAsync(got('https://example.com', { timeout: {socket: socketTimeout}, retry: { calculateDelay: ({attemptCount}) => { t.is(attemptCount, 1); return 0; } }, request: () => { return createSocketTimeoutStream(); } }), { instanceOf: got.TimeoutError, message: `Timeout awaiting 'socket' for ${socketTimeout}ms` }); }); test('custom retries', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end(); }); let hasTried = false; const error = await t.throwsAsync(got({ throwHttpErrors: true, retry: { calculateDelay: ({attemptCount}) => { if (attemptCount === 1) { hasTried = true; return 1; } return 0; }, methods: [ 'GET' ], statusCodes: [ 500 ] } })); t.is(error.response.statusCode, 500); t.true(hasTried); }); test('custom retries async', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end(); }); let hasTried = false; const error = await t.throwsAsync(got({ throwHttpErrors: true, retry: { calculateDelay: async ({attemptCount}) => { await new Promise(resolve => { setTimeout(resolve, 1000); }); if (attemptCount === 1) { hasTried = true; return 1; } return 0; }, methods: [ 'GET' ], statusCodes: [ 500 ] } })); t.is(error.response.statusCode, 500); t.true(hasTried); }); test('custom error codes', async t => { const errorCode = 'OH_SNAP'; const error = await t.throwsAsync(got('https://example.com', { request: () => { const emitter = new EventEmitter() as http.ClientRequest; emitter.abort = () => {}; // @ts-expect-error emitter.end = () => {}; // @ts-expect-error emitter.destroy = () => {}; const error = new Error('Snap!'); (error as Error & {code: typeof errorCode}).code = errorCode; setTimeout(() => { emitter.emit('error', error); }); return emitter; }, retry: { calculateDelay: ({error}) => { t.is(error.code, errorCode); return 0; }, methods: [ 'GET' ], errorCodes: [ errorCode ] } })); t.is(error.code, errorCode); }); test('respects 413 Retry-After', withServer, async (t, server, got) => { let lastTried413access = Date.now(); server.get('/', (_request, response) => { response.writeHead(413, { 'Retry-After': retryAfterOn413 }); response.end((Date.now() - lastTried413access).toString()); lastTried413access = Date.now(); }); const {statusCode, body} = await got({ throwHttpErrors: false, retry: 1 }); t.is(statusCode, 413); t.true(Number(body) >= retryAfterOn413 * 1000); }); test('respects 413 Retry-After with RFC-1123 timestamp', withServer, async (t, server, got) => { let lastTried413TimestampAccess: string; server.get('/', (_request, response) => { const date = (new Date(Date.now() + (retryAfterOn413 * 1000))).toUTCString(); response.writeHead(413, { 'Retry-After': date }); response.end(lastTried413TimestampAccess); lastTried413TimestampAccess = date; }); const {statusCode, body} = await got({ throwHttpErrors: false, retry: 1 }); t.is(statusCode, 413); t.true(Date.now() >= Date.parse(body)); }); test('doesn\'t retry on 413 with empty statusCodes and methods', withServer, async (t, server, got) => { server.get('/', handler413); const {statusCode, retryCount} = await got({ throwHttpErrors: false, retry: { limit: 1, statusCodes: [], methods: [] } }); t.is(statusCode, 413); t.is(retryCount, 0); }); test('doesn\'t retry on 413 with empty methods', withServer, async (t, server, got) => { server.get('/', handler413); const {statusCode, retryCount} = await got({ throwHttpErrors: false, retry: { limit: 1, statusCodes: [413], methods: [] } }); t.is(statusCode, 413); t.is(retryCount, 0); }); test('doesn\'t retry on 413 without Retry-After header', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 413; response.end(); }); const {retryCount} = await got({ throwHttpErrors: false }); t.is(retryCount, 0); }); test('retries on 503 without Retry-After header', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 503; response.end(); }); const {retryCount} = await got({ throwHttpErrors: false, retry: 1 }); t.is(retryCount, 1); }); test('doesn\'t retry on streams', withServer, async (t, server, got) => { server.get('/', () => {}); // @ts-expect-error Error tests const stream = got.stream({ timeout: 1, retry: { retries: () => { t.fail('Retries on streams'); } } }); await t.throwsAsync(pEvent(stream, 'response')); }); test('doesn\'t retry if Retry-After header is greater than maxRetryAfter', withServer, async (t, server, got) => { server.get('/', handler413); const {retryCount} = await got({ retry: {maxRetryAfter: 1000}, throwHttpErrors: false }); t.is(retryCount, 0); }); test('doesn\'t retry when set to 0', withServer, async (t, server, got) => { server.get('/', handler413); const {statusCode, retryCount} = await got({ throwHttpErrors: false, retry: 0 }); t.is(statusCode, 413); t.is(retryCount, 0); }); test('works when defaults.options.retry is a number', withServer, async (t, server, got) => { server.get('/', handler413); const instance = got.extend({ retry: 2 }); const {retryCount} = await instance({ throwHttpErrors: false }); t.is(retryCount, 2); }); test('retry function can throw', withServer, async (t, server, got) => { server.get('/', handler413); const error = 'Simple error'; await t.throwsAsync(got({ retry: { calculateDelay: () => { throw new Error(error); } } }), {message: error}); }); test('does not retry on POST', withServer, async (t, server, got) => { server.post('/', () => {}); await t.throwsAsync(got.post({ timeout: 200, hooks: { beforeRetry: [ () => { t.fail('Retries on POST requests'); } ] } }), {instanceOf: got.TimeoutError}); }); test('does not break on redirect', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end(); }); let tries = 0; server.get('/redirect', (_request, response) => { tries++; response.writeHead(302, { location: '/' }); response.end(); }); await t.throwsAsync(got('redirect'), {message: 'Response code 500 (Internal Server Error)'}); t.is(tries, 1); }); test('does not destroy the socket on HTTP error', withServer, async (t, server, got) => { let returnServerError = true; server.get('/', (_request, response) => { if (returnServerError) { response.statusCode = 500; returnServerError = false; } response.end(); }); const sockets: Socket[] = []; const agent = new http.Agent({ keepAlive: true }); await got('', { agent: { http: agent } }).on('request', request => { sockets.push(request.socket!); }); t.is(sockets.length, 2); t.is(sockets[0], sockets[1]); agent.destroy(); }); test('can retry a Got stream', withServer, async (t, server, got) => { let returnServerError = true; server.get('/', (_request, response) => { if (returnServerError) { response.statusCode = 500; response.end('not ok'); returnServerError = false; return; } response.end('ok'); }); let globalRetryCount = 0; const responseStreamPromise = new Promise((resolve, reject) => { let writeStream: PassThroughStream; const fn = (retryCount = 0) => { const stream = got.stream(''); stream.retryCount = retryCount; globalRetryCount = retryCount; if (writeStream) { writeStream.destroy(); } writeStream = new PassThroughStream(); stream.pipe(writeStream); stream.once('retry', fn); stream.once('error', reject); stream.once('end', () => { resolve(writeStream); }); }; fn(); }); const responseStream = await responseStreamPromise; const data = await getStream(responseStream); t.is(data, 'ok'); t.is(globalRetryCount, 1); }); test('throws when cannot retry a Got stream', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.statusCode = 500; response.end('not ok'); }); let globalRetryCount = 0; const streamPromise = new Promise((resolve, reject) => { const fn = (retryCount = 0) => { const stream = got.stream(''); stream.retryCount = retryCount; globalRetryCount = retryCount; stream.resume(); stream.once('retry', fn); stream.once('data', () => { stream.destroy(new Error('data event has been emitted')); }); stream.once('error', reject); stream.once('end', resolve); }; fn(); }); const error = await t.throwsAsync(streamPromise, { instanceOf: HTTPError }); t.is(error.response.statusCode, 500); t.is(error.response.body, 'not ok'); t.is(globalRetryCount, 2); }); test('promise does not retry when body is a stream', withServer, async (t, server, got) => { server.post('/', (_request, response) => { response.statusCode = 500; response.end('not ok'); }); const body = new PassThroughStream(); body.end('hello'); const response = await got.post({ retry: { methods: ['POST'] }, body, throwHttpErrors: false }); t.is(response.retryCount, 0); }); sindresorhus-got-11d2e83/test/stream.ts000066400000000000000000000271151434406364000202160ustar00rootroot00000000000000import {promisify} from 'util'; import fs = require('fs'); import {PassThrough as PassThroughStream} from 'stream'; import stream = require('stream'); import test from 'ava'; import {Handler} from 'express'; import toReadableStream = require('to-readable-stream'); import getStream = require('get-stream'); import pEvent = require('p-event'); import FormData = require('form-data'); import is from '@sindresorhus/is'; import got, {RequestError} from '../source'; import withServer from './helpers/with-server'; const pStreamPipeline = promisify(stream.pipeline); const defaultHandler: Handler = (_request, response) => { response.writeHead(200, { unicorn: 'rainbow', 'content-encoding': 'gzip' }); response.end(Buffer.from('H4sIAAAAAAAA/8vPBgBH3dx5AgAAAA==', 'base64')); // 'ok' }; const redirectHandler: Handler = (_request, response) => { response.writeHead(302, { location: '/' }); response.end(); }; const postHandler: Handler = async (request, response) => { await pStreamPipeline(request, response); }; const errorHandler: Handler = (_request, response) => { response.statusCode = 404; response.end(); }; const headersHandler: Handler = (request, response) => { response.end(JSON.stringify(request.headers)); }; const infiniteHandler: Handler = (_request, response) => { response.write('foobar'); }; test('`options.responseType` is ignored', withServer, async (t, server, got) => { server.get('/', defaultHandler); await t.notThrowsAsync(getStream(got.stream({responseType: 'json'}))); }); test('returns readable stream', withServer, async (t, server, got) => { server.get('/', defaultHandler); const data = await getStream(got.stream('')); t.is(data, 'ok'); }); test('returns writeable stream', withServer, async (t, server, got) => { server.post('/', postHandler); const stream = got.stream.post(''); const promise = getStream(stream); stream.end('wow'); t.is(await promise, 'wow'); }); test('throws on write if body is specified', withServer, (t, server, got) => { server.post('/', postHandler); const streams = [ got.stream.post({body: 'wow'}), got.stream.post({json: {}}), got.stream.post({form: {}}) ]; for (const stream of streams) { t.throws(() => { stream.end('wow'); }, { message: 'The payload has been already provided' }); stream.destroy(); } }); test('does not throw if using stream and passing a json option', withServer, async (t, server, got) => { server.post('/', postHandler); await t.notThrowsAsync(getStream(got.stream.post({json: {}}))); }); test('does not throw if using stream and passing a form option', withServer, async (t, server, got) => { server.post('/', postHandler); await t.notThrowsAsync(getStream(got.stream.post({form: {}}))); }); test('throws on write if no payload method is present', withServer, (t, server, got) => { server.post('/', postHandler); const stream = got.stream.get(''); t.throws(() => { stream.end('wow'); }, { message: 'The payload has been already provided' }); stream.destroy(); }); test('has request event', withServer, async (t, server, got) => { server.get('/', defaultHandler); const stream = got.stream(''); const request = await pEvent(stream, 'request'); t.truthy(request); t.is(request.method, 'GET'); await getStream(stream); }); test('has redirect event', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.get('/redirect', redirectHandler); const stream = got.stream('redirect'); const {headers} = await pEvent(stream, 'redirect'); t.is(headers.location, '/'); await getStream(stream); }); test('has response event', withServer, async (t, server, got) => { server.get('/', defaultHandler); const {statusCode} = await pEvent(got.stream(''), 'response'); t.is(statusCode, 200); }); test('has error event', withServer, async (t, server, got) => { server.get('/', errorHandler); const stream = got.stream(''); await t.throwsAsync(pEvent(stream, 'response'), { instanceOf: got.HTTPError, message: 'Response code 404 (Not Found)' }); }); test('has error event #2', async t => { const stream = got.stream('http://doesntexist'); try { await pEvent(stream, 'response'); } catch (error) { t.regex(error.code, /ENOTFOUND|EAI_AGAIN/); } }); test('has response event if `options.throwHttpErrors` is false', withServer, async (t, server, got) => { server.get('/', errorHandler); const {statusCode} = await pEvent(got.stream({throwHttpErrors: false}), 'response'); t.is(statusCode, 404); }); test('accepts `options.body` as a Stream', withServer, async (t, server, got) => { server.post('/', postHandler); const stream = got.stream.post({body: toReadableStream('wow')}); t.is(await getStream(stream), 'wow'); }); test('redirect response contains old url', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.get('/redirect', redirectHandler); const {requestUrl} = await pEvent(got.stream('redirect'), 'response'); t.is(requestUrl, `${server.url}/redirect`); }); test('check for pipe method', withServer, (t, server, got) => { server.get('/', defaultHandler); const stream = got.stream(''); t.true(is.function_(stream.pipe)); t.true(is.function_(stream.on('foobar', () => {}).pipe)); stream.destroy(); }); test('piping works', withServer, async (t, server, got) => { server.get('/', defaultHandler); t.is(await getStream(got.stream('')), 'ok'); t.is(await getStream(got.stream('').on('foobar', () => {})), 'ok'); }); test('proxying headers works', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.get('/proxy', async (_request, response) => { await pStreamPipeline( got.stream(''), response ); }); const {headers, body} = await got('proxy'); t.is(headers.unicorn, 'rainbow'); t.is(headers['content-encoding'], undefined); t.is(body, 'ok'); }); test('piping server request to Got proxies also headers', withServer, async (t, server, got) => { server.get('/', headersHandler); server.get('/proxy', async (request, response) => { await pStreamPipeline( request, got.stream(''), response ); }); const {foo}: {foo: string} = await got('proxy', { headers: { foo: 'bar' } }).json(); t.is(foo, 'bar'); }); test('skips proxying headers after server has sent them already', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.get('/proxy', async (_request, response) => { response.writeHead(200); await pStreamPipeline( got.stream(''), response ); }); const {headers} = await got('proxy'); t.is(headers.unicorn, undefined); }); test('throws when trying to proxy through a closed stream', withServer, async (t, server, got) => { server.get('/', defaultHandler); const stream = got.stream(''); const promise = getStream(stream); stream.once('data', () => { t.throws(() => { stream.pipe(new PassThroughStream()); }, { message: 'Failed to pipe. The response has been emitted already.' }); }); await promise; }); test('proxies `content-encoding` header when `options.decompress` is false', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.get('/proxy', async (_request, response) => { await pStreamPipeline( got.stream({decompress: false}), response ); }); const {headers} = await got('proxy'); t.is(headers.unicorn, 'rainbow'); t.is(headers['content-encoding'], 'gzip'); }); { const nodejsMajorVersion = Number(process.versions.node.split('.')[0]); const testFn = nodejsMajorVersion < 14 ? test.failing : test; testFn('destroying got.stream() destroys the request - `request` event', withServer, async (t, server, got) => { server.get('/', defaultHandler); const stream = got.stream(''); const request = await pEvent(stream, 'request'); stream.destroy(); t.truthy(request.destroyed); }); testFn('destroying got.stream() destroys the request - `response` event', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.write('hello'); }); const stream = got.stream(''); const request = await pEvent(stream, 'request'); await pEvent(stream, 'response'); stream.destroy(); t.truthy(request.destroyed); }); } test('piping to got.stream.put()', withServer, async (t, server, got) => { server.get('/', defaultHandler); server.put('/post', postHandler); await t.notThrowsAsync(async () => { await getStream( stream.pipeline( got.stream(''), got.stream.put('post'), () => {} ) ); }); }); // See https://github.com/nodejs/node/issues/35237 // eslint-disable-next-line ava/no-skip-test test.skip('no unhandled body stream errors', async t => { const body = new FormData(); body.append('upload', fs.createReadStream('/bin/sh')); await t.throwsAsync(got.post(`https://offlinesite${Date.now()}.com`, { body }), { code: 'ENOTFOUND' }); }); test('works with pipeline', async t => { await t.throwsAsync(pStreamPipeline( new stream.Readable({ read() { this.push(null); } }), got.stream.put('http://localhost:7777') ), { instanceOf: RequestError, message: 'connect ECONNREFUSED 127.0.0.1:7777' }); }); test('errors have body', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.setHeader('set-cookie', 'foo=bar'); response.end('yay'); }); const error = await t.throwsAsync(getStream(got.stream('', { cookieJar: { setCookie: async (_, __) => { throw new Error('snap'); }, getCookieString: async _ => '' } }))); t.is(error.message, 'snap'); t.is(error.response?.body, 'yay'); }); test('pipe can send modified headers', withServer, async (t, server, got) => { server.get('/foobar', (_request, response) => { response.setHeader('foo', 'bar'); response.end(); }); server.get('/', (_request, response) => { got.stream('foobar').on('response', response => { response.headers.foo = 'boo'; }).pipe(response); }); const {headers} = await got(''); t.is(headers.foo, 'boo'); }); test('the socket is alive on a successful pipeline', withServer, async (t, server, got) => { const payload = 'ok'; server.get('/', (_request, response) => { response.end(payload); }); const gotStream = got.stream(''); t.is(gotStream.socket, undefined); const receiver = new stream.PassThrough(); await promisify(stream.pipeline)(gotStream, receiver); t.is(await getStream(receiver), payload); t.truthy(gotStream.socket); t.false(gotStream.socket!.destroyed); }); test('async iterator works', withServer, async (t, server, got) => { const payload = 'ok'; server.get('/', (_request, response) => { response.end(payload); }); const gotStream = got.stream(''); const chunks = []; for await (const chunk of gotStream) { chunks.push(chunk); } t.is(Buffer.concat(chunks).toString(), payload); }); if (process.versions.node.split('.')[0] <= '12') { test('does not emit end event on error', withServer, async (t, server, got) => { server.get('/', infiniteHandler); await t.notThrowsAsync(new Promise((resolve, reject) => { got.stream({ timeout: 100, hooks: { beforeError: [ async error => { await new Promise(resolve => { setTimeout(resolve, 50); }); return error; } ] } }).once('end', () => { reject(new Error('Stream has ended before erroring')); }).once('error', resolve).resume(); })); }); } // Test only on Linux const testFn = process.platform === 'linux' ? test : test.skip; testFn('it sends a body of file with size on stat = 0', withServer, async (t, server, got) => { server.post('/', async (request, response) => { response.end(await getStream(request)); }); const response = await got.post({ body: fs.createReadStream('/proc/cpuinfo') }); t.truthy(response.body); }); sindresorhus-got-11d2e83/test/timeout.ts000066400000000000000000000364361434406364000204170ustar00rootroot00000000000000import {promisify} from 'util'; import {EventEmitter} from 'events'; import {PassThrough as PassThroughStream} from 'stream'; import stream = require('stream'); import http = require('http'); import net = require('net'); import getStream = require('get-stream'); import test from 'ava'; import delay = require('delay'); import CacheableLookup from 'cacheable-lookup'; import {Handler} from 'express'; import pEvent = require('p-event'); import got, {TimeoutError} from '../source'; import timedOut from '../source/core/utils/timed-out'; import slowDataStream from './helpers/slow-data-stream'; import {GlobalClock} from './helpers/types'; import withServer, {withServerAndFakeTimers, withHttpsServer} from './helpers/with-server'; const pStreamPipeline = promisify(stream.pipeline); const requestDelay = 800; const errorMatcher = { instanceOf: got.TimeoutError, code: 'ETIMEDOUT' }; const keepAliveAgent = new http.Agent({ keepAlive: true }); const defaultHandler = (clock: GlobalClock): Handler => (request, response) => { request.resume(); request.on('end', () => { clock.tick(requestDelay); response.end('OK'); }); }; const downloadHandler = (clock: GlobalClock): Handler => (_request, response) => { response.writeHead(200, { 'transfer-encoding': 'chunked' }); response.flushHeaders(); setImmediate(async () => { await pStreamPipeline(slowDataStream(clock), response); }); }; test.serial('timeout option', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.throwsAsync( got({ timeout: 1, retry: 0 }), { ...errorMatcher, message: 'Timeout awaiting \'request\' for 1ms' } ); }); test.serial('timeout option as object', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.throwsAsync( got({ timeout: {request: 1}, retry: 0 }), { ...errorMatcher, message: 'Timeout awaiting \'request\' for 1ms' } ); }); test.serial('socket timeout', async t => { await t.throwsAsync( got('https://example.com', { timeout: {socket: 1}, retry: 0, request: () => { const stream = new PassThroughStream(); // @ts-expect-error Mocking the behaviour of a ClientRequest stream.setTimeout = (ms, callback) => { process.nextTick(callback); }; // @ts-expect-error Mocking the behaviour of a ClientRequest stream.abort = () => {}; stream.resume(); return stream as unknown as http.ClientRequest; } }), { instanceOf: got.TimeoutError, code: 'ETIMEDOUT', message: 'Timeout awaiting \'socket\' for 1ms' } ); }); test.serial('send timeout', withServerAndFakeTimers, async (t, server, got, clock) => { server.post('/', defaultHandler(clock)); await t.throwsAsync( got.post({ timeout: {send: 1}, body: new stream.PassThrough(), retry: 0 }).on('request', request => { request.once('socket', socket => { socket.once('connect', () => { clock.tick(10); }); }); }), { ...errorMatcher, message: 'Timeout awaiting \'send\' for 1ms' } ); }); test.serial('send timeout (keepalive)', withServerAndFakeTimers, async (t, server, got, clock) => { server.post('/', defaultHandler(clock)); server.get('/prime', (_request, response) => { response.end('ok'); }); await got('prime', {agent: {http: keepAliveAgent}}); await t.throwsAsync( got.post({ agent: { http: keepAliveAgent }, timeout: {send: 1}, retry: 0, body: slowDataStream(clock) }).on('request', (request: http.ClientRequest) => { request.once('socket', socket => { t.false(socket.connecting); socket.once('connect', () => { t.fail('\'connect\' event fired, invalidating test'); }); }); }), { ...errorMatcher, message: 'Timeout awaiting \'send\' for 1ms' } ); }); test.serial('response timeout', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.throwsAsync( got({ timeout: {response: 1}, retry: 0 }), { ...errorMatcher, message: 'Timeout awaiting \'response\' for 1ms' } ); }); test.serial('response timeout unaffected by slow upload', withServerAndFakeTimers, async (t, server, got, clock) => { server.post('/', defaultHandler(clock)); await t.notThrowsAsync(got.post({ retry: 0, body: slowDataStream(clock) })); }); test.serial('response timeout unaffected by slow download', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', downloadHandler(clock)); await t.notThrowsAsync(got({ timeout: {response: 200}, retry: 0 })); clock.tick(100); }); test.serial('response timeout (keepalive)', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); server.get('/prime', (_request, response) => { response.end('ok'); }); await got('prime', {agent: {http: keepAliveAgent}}); const request = got({ agent: { http: keepAliveAgent }, timeout: {response: 1}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.once('socket', socket => { t.false(socket.connecting); socket.once('connect', () => { t.fail('\'connect\' event fired, invalidating test'); }); }); }); await t.throwsAsync(request, { ...errorMatcher, message: 'Timeout awaiting \'response\' for 1ms' }); }); test.serial('connect timeout', withServerAndFakeTimers, async (t, _server, got, clock) => { await t.throwsAsync( got({ createConnection: options => { const socket = new net.Socket(options as Record as net.SocketConstructorOpts); // @ts-expect-error We know that it is readonly, but we have to test it socket.connecting = true; setImmediate(() => { socket.emit('lookup', null, '127.0.0.1', 4, 'localhost'); }); return socket; }, timeout: {connect: 1}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.on('socket', () => { clock.runAll(); }); }), { ...errorMatcher, message: 'Timeout awaiting \'connect\' for 1ms' } ); }); test.serial('connect timeout (ip address)', withServerAndFakeTimers, async (t, _server, _got, clock) => { await t.throwsAsync( got({ url: 'http://127.0.0.1', createConnection: options => { const socket = new net.Socket(options as Record as net.SocketConstructorOpts); // @ts-expect-error We know that it is readonly, but we have to test it socket.connecting = true; return socket; }, timeout: {connect: 1}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.on('socket', () => { clock.runAll(); }); }), { ...errorMatcher, message: 'Timeout awaiting \'connect\' for 1ms' } ); }); test.serial('secureConnect timeout', withHttpsServer({}, true), async (t, _server, got, clock) => { await t.throwsAsync( got({ createConnection: options => { const socket = new net.Socket(options as Record as net.SocketConstructorOpts); // @ts-expect-error We know that it is readonly, but we have to test it socket.connecting = true; setImmediate(() => { socket.emit('lookup', null, '127.0.0.1', 4, 'localhost'); setImmediate(() => { socket.emit('connect'); }); }); return socket; }, timeout: {secureConnect: 0}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.on('socket', () => { clock!.runAll(); }); }), { ...errorMatcher, message: 'Timeout awaiting \'secureConnect\' for 0ms' } ); }); test('secureConnect timeout not breached', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await t.notThrowsAsync(got({ timeout: {secureConnect: 200}, retry: 0, https: { rejectUnauthorized: false } })); }); test.serial('lookup timeout', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.throwsAsync( got({ lookup: () => {}, timeout: {lookup: 1}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.on('socket', () => { clock.runAll(); }); }), { ...errorMatcher, message: 'Timeout awaiting \'lookup\' for 1ms' } ); }); test.serial('lookup timeout no error (ip address)', withServerAndFakeTimers, async (t, server, _got, clock) => { server.get('/', defaultHandler(clock)); await t.notThrowsAsync(got({ url: `http://127.0.0.1:${server.port}`, timeout: {lookup: 1}, retry: 0 })); }); test.serial('lookup timeout no error (keepalive)', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); server.get('/prime', (_request, response) => { response.end('ok'); }); await got('prime', {agent: {http: keepAliveAgent}}); await t.notThrowsAsync(got({ agent: {http: keepAliveAgent}, timeout: {lookup: 1}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.once('connect', () => { t.fail('connect event fired, invalidating test'); }); })); keepAliveAgent.destroy(); }); test.serial('retries on timeout', withServer, async (t, server, got) => { server.get('/', () => {}); let hasTried = false; await t.throwsAsync(got({ timeout: 1, retry: { calculateDelay: () => { if (hasTried) { return 0; } hasTried = true; return 1; } } }), { ...errorMatcher, message: 'Timeout awaiting \'request\' for 1ms' }); t.true(hasTried); }); test.serial('timeout with streams', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); const stream = got.stream({ timeout: 0, retry: 0 }); await t.throwsAsync(pEvent(stream, 'response'), {code: 'ETIMEDOUT'}); }); test.serial('no error emitted when timeout is not breached (stream)', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); const stream = got.stream({ retry: 0, timeout: { request: requestDelay * 2 } }); await t.notThrowsAsync(getStream(stream)); }); test.serial('no error emitted when timeout is not breached (promise)', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.notThrowsAsync(got({ retry: 0, timeout: { request: requestDelay * 2 } })); }); test.serial('no unhandled `socket hung up` errors', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); await t.throwsAsync( got({retry: 0, timeout: requestDelay / 2}), {instanceOf: got.TimeoutError} ); }); // TODO: use fakeTimers here test.serial('no unhandled timeout errors', withServer, async (t, _server, got) => { await t.throwsAsync(got({ retry: 0, timeout: 100, request: (...args: any[]) => { // @ts-expect-error const result = http.request(...args); result.once('socket', () => { result.socket?.destroy(); }); return result; } }), {message: 'socket hang up'}); await delay(200); }); // TODO: use fakeTimers here test.serial('no unhandled timeout errors #2', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.write('Hello world!'); }); const gotPromise = got('', { timeout: 20, retry: { calculateDelay: ({computedValue}) => { if (computedValue) { return 10; } return 0; }, limit: 1 } }); await t.throwsAsync(gotPromise, {instanceOf: TimeoutError}); await delay(100); }); test.serial('no more timeouts after an error', withServer, async (t, _server, got) => { const {setTimeout} = global; const {clearTimeout} = global; // @ts-expect-error global.setTimeout = (callback, _ms, ...args) => { const timeout = { isCleared: false }; process.nextTick(() => { if (timeout.isCleared) { return; } callback(...args); }); return timeout; }; // @ts-expect-error global.clearTimeout = timeout => { if (timeout) { timeout.isCleared = true; } }; await t.throwsAsync(got(`http://${Date.now()}.dev`, { retry: 1, timeout: { lookup: 1, connect: 1, secureConnect: 1, socket: 1, response: 1, send: 1, request: 1 } }), {instanceOf: got.TimeoutError}); await delay(100); global.setTimeout = setTimeout; global.clearTimeout = clearTimeout; }); test.serial('socket timeout is canceled on error', withServerAndFakeTimers, async (t, _server, got, clock) => { const message = 'oh, snap!'; const promise = got({ timeout: {socket: 50}, retry: 0 }).on('request', (request: http.ClientRequest) => { request.destroy(new Error(message)); }); await t.throwsAsync(promise, {message}); // Wait a bit more to check if there are any unhandled errors clock.tick(100); }); test.serial('no memory leak when using socket timeout and keepalive agent', withServerAndFakeTimers, async (t, server, got, clock) => { server.get('/', defaultHandler(clock)); let request: any; await got({ agent: {http: keepAliveAgent}, timeout: {socket: requestDelay * 2} }).on('request', _request => { request = _request; }); t.is(request.timeoutCb, null); keepAliveAgent.destroy(); }); test('ensure there are no new timeouts after cancelation', t => { const emitter = new EventEmitter(); const socket = new EventEmitter(); (socket as any).connecting = true; timedOut(emitter as http.ClientRequest, { connect: 1 }, { hostname: '127.0.0.1' })(); emitter.emit('socket', socket); socket.emit('lookup', null); t.is(socket.listenerCount('connect'), 0); }); test('double calling timedOut has no effect', t => { const emitter = new EventEmitter(); const attach = (): () => void => timedOut(emitter as http.ClientRequest, { connect: 1 }, { hostname: '127.0.0.1' }); attach(); attach(); t.is(emitter.listenerCount('socket'), 1); }); test.serial('doesn\'t throw on early lookup', withServerAndFakeTimers, async (t, server, got) => { server.get('/', (_request, response) => { response.end('ok'); }); await t.notThrowsAsync(got('', { timeout: { lookup: 1 }, retry: 0, // @ts-expect-error lookup: (...[_hostname, options, callback]: Parameters) => { if (typeof options === 'function') { callback = options; } // @ts-expect-error This should be fixed in upstream callback(null, '127.0.0.1', 4); } })); }); // TODO: use fakeTimers here test.serial('no unhandled `Premature close` error', withServer, async (t, server, got) => { server.get('/', async (_request, response) => { response.write('hello'); }); await t.throwsAsync(got({ timeout: 10, retry: 0 }), {message: 'Timeout awaiting \'request\' for 10ms'}); await delay(20); }); // TODO: use fakeTimers here test.serial('cancelling the request removes timeouts', withServer, async (t, server, got) => { server.get('/', (_request, response) => { response.write('hello'); }); const promise = got({ timeout: 500, retry: 0 }).on('downloadProgress', () => { promise.cancel(); }).on('request', request => { request.on('error', error => { if (error.message === 'Timeout awaiting \'request\' for 500ms') { t.fail(error.message); } }); }); await t.throwsAsync(promise, {message: 'Promise was canceled'}); await delay(1000); }); test('timeouts are emitted ASAP', async t => { const timeout = 500; const marginOfError = 100; const error = await t.throwsAsync(got('http://192.0.2.1/test', { retry: 0, timeout }), {instanceOf: TimeoutError}); t.true(error.timings.phases.total! < (timeout + marginOfError)); }); sindresorhus-got-11d2e83/test/types/000077500000000000000000000000001434406364000175115ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/types/create-test-server/000077500000000000000000000000001434406364000232355ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/types/create-test-server/index.d.ts000066400000000000000000000006571434406364000251460ustar00rootroot00000000000000declare module 'create-test-server' { import {Express} from 'express'; function createTestServer(options: unknown): Promise; export = createTestServer; namespace createTestServer { export interface TestServer extends Express { caCert: string | Buffer | Array; port: number; url: string; sslPort: number; sslUrl: string; close: () => Promise; } } } sindresorhus-got-11d2e83/test/types/slow-stream/000077500000000000000000000000001434406364000217665ustar00rootroot00000000000000sindresorhus-got-11d2e83/test/types/slow-stream/index.d.ts000066400000000000000000000000361434406364000236660ustar00rootroot00000000000000declare module 'slow-stream'; sindresorhus-got-11d2e83/test/unix-socket.ts000066400000000000000000000036011434406364000211660ustar00rootroot00000000000000import {format} from 'util'; import test from 'ava'; import {Handler} from 'express'; import got from '../source'; import {withSocketServer} from './helpers/with-server'; const okHandler: Handler = (_request, response) => { response.end('ok'); }; const redirectHandler: Handler = (_request, response) => { response.writeHead(302, { location: 'foo' }); response.end(); }; if (process.platform !== 'win32') { test('works', withSocketServer, async (t, server) => { server.on('/', okHandler); const url = format('http://unix:%s:%s', server.socketPath, '/'); t.is((await got(url)).body, 'ok'); }); test('protocol-less works', withSocketServer, async (t, server) => { server.on('/', okHandler); const url = format('unix:%s:%s', server.socketPath, '/'); t.is((await got(url)).body, 'ok'); }); test('address with : works', withSocketServer, async (t, server) => { server.on('/foo:bar', okHandler); const url = format('unix:%s:%s', server.socketPath, '/foo:bar'); t.is((await got(url)).body, 'ok'); }); test('throws on invalid URL', async t => { try { await got('unix:', {retry: 0}); } catch (error) { t.regex(error.code, /ENOTFOUND|EAI_AGAIN/); } }); test('works when extending instances', withSocketServer, async (t, server) => { server.on('/', okHandler); const url = format('unix:%s:%s', server.socketPath, '/'); const instance = got.extend({prefixUrl: url}); t.is((await instance('')).body, 'ok'); }); test('passes search params', withSocketServer, async (t, server) => { server.on('/?a=1', okHandler); const url = format('http://unix:%s:%s', server.socketPath, '/?a=1'); t.is((await got(url)).body, 'ok'); }); } test('redirects work', withSocketServer, async (t, server) => { server.on('/', redirectHandler); server.on('/foo', okHandler); const url = format('http://unix:%s:%s', server.socketPath, '/'); t.is((await got(url)).body, 'ok'); }); sindresorhus-got-11d2e83/test/url-to-options.ts000066400000000000000000000063001434406364000216270ustar00rootroot00000000000000import url = require('url'); import {URL} from 'url'; import test from 'ava'; import urlToOptions from '../source/core/utils/url-to-options'; test('converts node legacy URL to options', t => { const exampleUrl = 'https://user:password@github.com:443/say?hello=world#bang'; const parsedUrl = url.parse(exampleUrl); const options = urlToOptions(parsedUrl); const expected = { hash: '#bang', host: 'github.com:443', hostname: 'github.com', href: exampleUrl, path: '/say?hello=world', pathname: '/say', port: 443, protocol: 'https:', search: '?hello=world' }; t.deepEqual(options, expected); }); test('converts URL to options', t => { const exampleUrl = 'https://user:password@github.com:443/say?hello=world#bang'; const parsedUrl = new URL(exampleUrl); const options = urlToOptions(parsedUrl); const expected = { auth: 'user:password', hash: '#bang', host: 'github.com', hostname: 'github.com', href: 'https://user:password@github.com/say?hello=world#bang', path: '/say?hello=world', pathname: '/say', protocol: 'https:', search: '?hello=world' }; t.deepEqual(options, expected); }); test('converts IPv6 URL to options', t => { const IPv6URL = 'https://[2001:cdba::3257:9652]:443/'; const parsedUrl = new URL(IPv6URL); const options = urlToOptions(parsedUrl); const expected = { hash: '', host: '[2001:cdba::3257:9652]', hostname: '2001:cdba::3257:9652', href: 'https://[2001:cdba::3257:9652]/', path: '/', pathname: '/', protocol: 'https:', search: '' }; t.deepEqual(options, expected); }); test('only adds port to options for URLs with ports', t => { const noPortURL = 'https://github.com/'; const parsedUrl = new URL(noPortURL); const options = urlToOptions(parsedUrl); const expected = { hash: '', host: 'github.com', hostname: 'github.com', href: 'https://github.com/', path: '/', pathname: '/', protocol: 'https:', search: '' }; t.deepEqual(options, expected); t.false(Reflect.has(options, 'port')); }); test('does not concat null search to path', t => { const exampleUrl = 'https://github.com/'; const parsedUrl = url.parse(exampleUrl); t.is(parsedUrl.search, null); const options = urlToOptions(parsedUrl); const expected = { hash: null, host: 'github.com', hostname: 'github.com', href: 'https://github.com/', path: '/', pathname: '/', protocol: 'https:', search: null }; t.deepEqual(options, expected); }); test('does not add null port to options', t => { const exampleUrl = 'https://github.com/'; const parsedUrl = url.parse(exampleUrl); t.is(parsedUrl.port, null); const options = urlToOptions(parsedUrl); const expected = { hash: null, host: 'github.com', hostname: 'github.com', href: 'https://github.com/', path: '/', pathname: '/', protocol: 'https:', search: null }; t.deepEqual(options, expected); }); test('does not throw if there is no hostname', t => { t.notThrows(() => urlToOptions({} as URL)); }); test('null password', t => { const options = urlToOptions({ username: 'foo', password: null } as any); t.is(options.auth, 'foo:'); }); test('null username', t => { const options = urlToOptions({ username: null, password: 'bar' } as any); t.is(options.auth, ':bar'); }); sindresorhus-got-11d2e83/test/weakable-map.ts000066400000000000000000000011021434406364000212350ustar00rootroot00000000000000import test from 'ava'; import WeakableMap from '../source/core/utils/weakable-map'; test('works as expected', t => { const weakable = new WeakableMap(); weakable.set('hello', 'world'); t.true(weakable.has('hello')); t.false(weakable.has('foobar')); t.is(weakable.get('hello'), 'world'); t.is(weakable.get('foobar'), undefined); const object = {}; const anotherObject = {}; weakable.set(object, 'world'); t.true(weakable.has(object)); t.false(weakable.has(anotherObject)); t.is(weakable.get(object), 'world'); t.is(weakable.get(anotherObject), undefined); }); sindresorhus-got-11d2e83/tsconfig.json000066400000000000000000000003401434406364000200720ustar00rootroot00000000000000{ "extends": "@sindresorhus/tsconfig", "compilerOptions": { "outDir": "dist", "target": "es2018", // Node.js 10 "lib": [ "es2018", "es2019.string" ] }, "include": [ "source", "test", "benchmark" ] }