From d41366594f55b49cb5ced38d42195af2ac5eddaa Mon Sep 17 00:00:00 2001 From: mohamedmagdy17593 <40938625+mohamedmagdy17593@users.noreply.github.com> Date: Sun, 17 Feb 2019 16:46:18 +0200 Subject: [PATCH 001/327] refactor: remove duplication of act (#304) --- .all-contributorsrc | 9 +++++++++ README.md | 5 +++-- src/index.js | 12 +++++------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2a0be067..48b07d8e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -680,6 +680,15 @@ "ideas", "test" ] + }, + { + "login": "mohamedmagdy17593", + "name": "mohamedmagdy17593", + "avatar_url": "https://avatars0.githubusercontent.com/u/40938625?v=4", + "profile": "https://github.com/mohamedmagdy17593", + "contributions": [ + "code" + ] } ] } diff --git a/README.md b/README.md index 7ae254f6..fe43640c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices.
[![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -216,7 +216,8 @@ Thanks goes to these people ([emoji key][emojis]): | [{ container?: HTMLElement baseElement?: HTMLElement hydrate?: boolean queries?: Q + wrapper?: React.ComponentType } +export type HookOptions = RenderOptions + type Omit= Pick > /** From 912841077297b0e929111fe974cf2c2fac9c0753 Mon Sep 17 00:00:00 2001 From: Christopher Tran Date: Thu, 21 Feb 2019 16:41:02 -0800 Subject: [PATCH 003/327] docs: fixed plural typo (#305) --- examples/__tests__/react-context.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/__tests__/react-context.js b/examples/__tests__/react-context.js index 4c709429..b87c61c9 100644 --- a/examples/__tests__/react-context.js +++ b/examples/__tests__/react-context.js @@ -45,7 +45,7 @@ test('NameProvider composes full name from first, last', () => { }) /** - * A tree containing both a providers and consumer can be rendered normally + * A tree containing both a provider and consumer can be rendered normally */ test('NameProvider/Consumer shows name of character', () => { const tree = ( From 12d934abd14990d0164c83f1574b13f6d386ce3f Mon Sep 17 00:00:00 2001 From: Matheus Schettino Date: Sun, 24 Feb 2019 00:25:27 -0600 Subject: [PATCH 004/327] fix: move testHook to its own pacakge (#307) This removes testHook in favor of http://npm.im/react-hook-testing-library Closes #302 BREAKING CHANGE: move testHook to another library. Use http://npm.im/react-hook-testing-library instead --- README.md | 9 ++- examples/__tests__/react-hooks.js | 119 ------------------------------ src/__tests__/test-hook.js | 77 ------------------- src/index.js | 30 +------- typings/index.d.ts | 16 ---- 5 files changed, 8 insertions(+), 243 deletions(-) delete mode 100644 examples/__tests__/react-hooks.js delete mode 100644 src/__tests__/test-hook.js diff --git a/README.md b/README.md index fe43640c..16aba65d 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ practices. - [Example](#example) - [Installation](#installation) - [Examples](#examples) +- [Hooks](#hooks) - [Other Solutions](#other-solutions) - [Guiding Principles](#guiding-principles) - [Contributors](#contributors) @@ -162,12 +163,15 @@ Some included are: - [`react-redux`](https://github.com/kentcdodds/react-testing-library/blob/master/examples/__tests__/react-redux.js) - [`react-router`](https://github.com/kentcdodds/react-testing-library/blob/master/examples/__tests__/react-router.js) - [`react-context`](https://github.com/kentcdodds/react-testing-library/blob/master/examples/__tests__/react-context.js) -- [`react-hooks`](https://github.com/kentcdodds/react-testing-library/blob/master/examples/__tests__/react-hooks.js) - - Use react-testing-library to test a custom React Hook. You can also find react-testing-library examples at [react-testing-examples.com](https://react-testing-examples.com/jest-rtl/). +## Hooks + +If you are interested in testing a custom hook, check out +[react-hooks-testing-library][react-hooks-testing-library] + ## Other Solutions In preparing this project, @@ -296,5 +300,6 @@ Links: [good-first-issue]: https://github.com/kentcdodds/react-testing-library/issues?utf8=β&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A"good+first+issue"+ [reactiflux]: https://www.reactiflux.com/ [stackoverflow]: https://stackoverflow.com/questions/tagged/react-testing-library +[react-hooks-testing-library]: https://github.com/mpeyper/react-hooks-testing-library diff --git a/examples/__tests__/react-hooks.js b/examples/__tests__/react-hooks.js deleted file mode 100644 index fe616eb7..00000000 --- a/examples/__tests__/react-hooks.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This is the recommended way to test reusable custom react hooks. - * It is not however recommended to use the testHook utility to test - * single-use custom hooks. Typically those are better tested by testing - * the component that is using it. - */ -import {testHook, act, cleanup} from 'react-testing-library' - -import {useCounter, useDocumentTitle, useCall} from '../react-hooks' - -afterEach(cleanup) - -describe('useCounter', () => { - test('accepts default initial values', () => { - let count - testHook(() => ({count} = useCounter())) - - expect(count).toBe(0) - }) - - test('accepts a default initial value for `count`', () => { - let count - testHook(() => ({count} = useCounter({}))) - - expect(count).toBe(0) - }) - - test('provides an `increment` function', () => { - let count, increment - testHook(() => ({count, increment} = useCounter({step: 2}))) - - expect(count).toBe(0) - act(() => { - increment() - }) - expect(count).toBe(2) - }) - - test('provides an `decrement` function', () => { - let count, decrement - testHook(() => ({count, decrement} = useCounter({step: 2}))) - - expect(count).toBe(0) - act(() => { - decrement() - }) - expect(count).toBe(-2) - }) - - test('accepts a default initial value for `step`', () => { - let count, increment - testHook(() => ({count, increment} = useCounter({}))) - - expect(count).toBe(0) - act(() => { - increment() - }) - expect(count).toBe(1) - }) -}) - -// using unmount function to check useEffect behavior when unmounting -describe('useDocumentTitle', () => { - test('sets a title', () => { - document.title = 'original title' - testHook(() => { - useDocumentTitle('modified title') - }) - - expect(document.title).toBe('modified title') - }) - - test('returns to original title when component is unmounted', () => { - document.title = 'original title' - const {unmount} = testHook(() => { - useDocumentTitle('modified title') - }) - - unmount() - expect(document.title).toBe('original title') - }) -}) - -// using rerender function to test calling useEffect multiple times -describe('useCall', () => { - test('calls once on render', () => { - const spy = jest.fn() - testHook(() => { - useCall(spy, []) - }) - expect(spy).toHaveBeenCalledTimes(1) - }) - - test('calls again if deps change', () => { - let deps = [false] - const spy = jest.fn() - const {rerender} = testHook(() => { - useCall(spy, deps) - }) - expect(spy).toHaveBeenCalledTimes(1) - - deps = [true] - rerender() - expect(spy).toHaveBeenCalledTimes(2) - }) - - test('does not call again if deps are the same', () => { - let deps = [false] - const spy = jest.fn() - const {rerender} = testHook(() => { - useCall(spy, deps) - }) - expect(spy).toHaveBeenCalledTimes(1) - - deps = [false] - rerender() - expect(spy).toHaveBeenCalledTimes(1) - }) -}) diff --git a/src/__tests__/test-hook.js b/src/__tests__/test-hook.js deleted file mode 100644 index 4b54bfb8..00000000 --- a/src/__tests__/test-hook.js +++ /dev/null @@ -1,77 +0,0 @@ -import React, {useState, useEffect} from 'react' -import 'jest-dom/extend-expect' -import {testHook, cleanup, act} from '../' - -afterEach(cleanup) - -test('testHook calls the callback', () => { - const spy = jest.fn() - testHook(spy) - expect(spy).toHaveBeenCalledTimes(1) -}) -test('confirm we can safely call a React Hook from within the callback', () => { - testHook(() => useState()) -}) -test('returns a function to unmount component', () => { - let isMounted - const {unmount} = testHook(() => { - useEffect(() => { - isMounted = true - return () => { - isMounted = false - } - }) - }) - expect(isMounted).toBe(true) - unmount() - expect(isMounted).toBe(false) -}) -test('returns a function to rerender component', () => { - let renderCount = 0 - const {rerender} = testHook(() => { - useEffect(() => { - renderCount++ - }) - }) - - expect(renderCount).toBe(1) - rerender() - expect(renderCount).toBe(2) -}) -test('accepts wrapper option to wrap rendered hook with', () => { - const ctxA = React.createContext() - const ctxB = React.createContext() - const useHook = () => { - return React.useContext(ctxA) * React.useContext(ctxB) - } - let actual - testHook( - () => { - actual = useHook() - }, - { - // eslint-disable-next-line react/display-name - wrapper: props => ( - - - ), - }, - ) - expect(actual).toBe(12) -}) -test('returns result ref with latest result from hook execution', () => { - function useCounter({initialCount = 0, step = 1} = {}) { - const [count, setCount] = React.useState(initialCount) - const increment = () => setCount(c => c + step) - const decrement = () => setCount(c => c - step) - return {count, increment, decrement} - } - - const {result} = testHook(useCounter) - expect(result.current.count).toBe(0) - act(() => { - result.current.increment() - }) - expect(result.current.count).toBe(1) -}) diff --git a/src/index.js b/src/index.js index 70bf83c2..d2661920 100644 --- a/src/index.js +++ b/src/index.js @@ -31,7 +31,6 @@ function render( // they're passing us a custom container or not. mountedContainers.add(container) - const wrapUiIfNeeded = innerElement => WrapperComponent ? React.createElement(WrapperComponent, null, innerElement) @@ -72,33 +71,6 @@ function render( } } -function TestHook({callback, children}) { - children(callback()) - return null -} - -function testHook(callback, options = {}) { - const result = { - current: null, - } - const toRender = () => ( -- - {res => { - result.current = res - }} - - ) - - const {unmount, rerender: rerenderComponent} = render(toRender(), options) - return { - result, - unmount, - rerender: () => { - rerenderComponent(toRender(), options) - }, - } -} - function cleanup() { mountedContainers.forEach(cleanupAtContainer) } @@ -159,6 +131,6 @@ fireEvent.select = (node, init) => { // just re-export everything from dom-testing-library export * from 'dom-testing-library' -export {render, testHook, cleanup, fireEvent, act} +export {render, cleanup, fireEvent, act} /* eslint func-name-matching:0 */ diff --git a/typings/index.d.ts b/typings/index.d.ts index af09f778..06eaeeaf 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -19,12 +19,6 @@ export type RenderResult= { asFragment: () => DocumentFragment } & {[P in keyof Q]: BoundFunction} -export type HookResult= { - result: React.MutableRefObject - rerender: () => void - unmount: () => boolean -} - export interface RenderOptions { container?: HTMLElement baseElement?: HTMLElement @@ -33,8 +27,6 @@ export interface RenderOptions{ wrapper?: React.ComponentType } -export type HookOptions = RenderOptions - type Omit= Pick > /** @@ -49,14 +41,6 @@ export function render ( options: RenderOptions, ): RenderResult-/** - * Renders a test component that calls back to the test. - */ -export function testHook( - callback: () => T, - options?: Partial , -): HookResult - /** * Unmounts React trees that were mounted with render. */ From 8055fb52ded420178ab15729e26cc1184ffc24fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loren=20=E2=98=BA=EF=B8=8F?= <251288+lorensr@users.noreply.github.com> Date: Mon, 25 Feb 2019 21:30:52 -0500 Subject: [PATCH 005/327] docs: fix README typo (#310) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 16aba65d..2374b9dd 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ your team down. ## This solution -The `react-testing-library` is a very light-weight solution for testing React +The `react-testing-library` is a very lightweight solution for testing React components. It provides light utility functions on top of `react-dom` and `react-dom/test-utils`, in a way that encourages better testing practices. Its primary guiding principle is: From a06a6ecb434db03d89273fc3252812f912cd4bdc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Mon, 25 Feb 2019 19:31:26 -0700 Subject: [PATCH 006/327] docs: add lorensr as a contributor (#311) * docs: update README.md * docs: update .all-contributorsrc --- .all-contributorsrc | 12 +++++++++++- README.md | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 48b07d8e..076f4205 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -689,6 +689,16 @@ "contributions": [ "code" ] + }, + { + "login": "lorensr", + "name": "Loren βΊοΈ", + "avatar_url": "https://avatars2.githubusercontent.com/u/251288?v=4", + "profile": "http://lorensr.me", + "contributions": [ + "doc" + ] } - ] + ], + "contributorsPerLine": 7 } diff --git a/README.md b/README.md index 2374b9dd..890fa52b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -221,7 +221,7 @@ Thanks goes to these people ([emoji key][emojis]): | [
Michiel Nuyts](https://github.com/Michielnuyts)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Michielnuyts "Documentation") | [
Joe Ng'ethe](https://github.com/joeynimu)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Documentation") | [
Kate](https://github.com/Enikol)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Enikol "Documentation") | [
Sean](http://www.seanrparker.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=SeanRParker "Documentation") | [
James Long](http://jlongster.com)
[π€](#ideas-jlongster "Ideas, Planning, & Feedback") [π¦](#platform-jlongster "Packaging/porting to new platform") | [
Herb Hagely](https://github.com/hhagely)
[π‘](#example-hhagely "Examples") | [
Alex Wendte](http://www.wendtedesigns.com/)
[π‘](#example-themostcolm "Examples") | | [
Monica Powell](http://www.aboutmonica.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=M0nica "Documentation") | [
Vitaly Sivkov](http://sivkoff.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=sivkoff "Code") | [
Weyert de Boer](https://github.com/weyert)
[π€](#ideas-weyert "Ideas, Planning, & Feedback") [π](#review-weyert "Reviewed Pull Requests") | [
EstebanMarin](https://github.com/EstebanMarin)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=EstebanMarin "Documentation") | [
Victor Martins](https://github.com/vctormb)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=vctormb "Documentation") | [
Royston Shufflebotham](https://github.com/RoystonS)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3ARoystonS "Bug reports") [π](https://github.com/kentcdodds/react-testing-library/commits?author=RoystonS "Documentation") [π‘](#example-RoystonS "Examples") | [
chrbala](https://github.com/chrbala)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=chrbala "Code") | | [
Donavon West](http://donavon.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Documentation") [π€](#ideas-donavon "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Tests") | [
Richard Maisano](https://github.com/maisano)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=maisano "Code") | [
Marco Biedermann](https://www.marcobiedermann.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Code") [π§](#maintenance-marcobiedermann "Maintenance") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Tests") | [
Alex Zherdev](https://github.com/alexzherdev)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Aalexzherdev "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=alexzherdev "Code") | [
AndrΓ© Matulionis dos Santos](https://twitter.com/Andrewmat)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Code") [π‘](#example-Andrewmat "Examples") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Tests") | [
Daniel K.](https://github.com/FredyC)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AFredyC "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Code") [π€](#ideas-FredyC "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Tests") | [
mohamedmagdy17593](https://github.com/mohamedmagdy17593)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=mohamedmagdy17593 "Code") | - +| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | This project follows the [all-contributors][all-contributors] specification. From 75a98b5cc47d0e40e40486b30f87d4cd0085dd59 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds"Date: Thu, 7 Mar 2019 22:57:26 -0700 Subject: [PATCH 007/327] docs: funding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mostly just trying this out π€·ββοΈ --- .github/FUNDING.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..87ac4edc --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,5 @@ +# You can add one username per supported platform and one custom link +patreon: kentcdodds +# open_collective: +# ko_fi: +custom: https://kcd.im/donate From ca313f2ea36724561eb56d8f336e36b2a59ced4a Mon Sep 17 00:00:00 2001 From: MarkFalconbridge Date: Tue, 19 Mar 2019 15:42:28 +0000 Subject: [PATCH 008/327] fix: reorder cleanupAtContainer code (#327) Closes https://github.com/kentcdodds/react-testing-library/issues/326 --- .all-contributorsrc | 10 ++++++++++ README.md | 4 ++-- src/__tests__/render.js | 4 +++- src/index.js | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 076f4205..de679507 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -698,6 +698,16 @@ "contributions": [ "doc" ] + }, + { + "login": "MarkFalconbridge", + "name": "MarkFalconbridge", + "avatar_url": "https://avatars1.githubusercontent.com/u/20678943?v=4", + "profile": "https://github.com/MarkFalconbridge", + "contributions": [ + "bug", + "code" + ] } ], "contributorsPerLine": 7 diff --git a/README.md b/README.md index 890fa52b..d6c46844 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -221,7 +221,7 @@ Thanks goes to these people ([emoji key][emojis]): | [
Michiel Nuyts](https://github.com/Michielnuyts)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Michielnuyts "Documentation") | [
Joe Ng'ethe](https://github.com/joeynimu)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Documentation") | [
Kate](https://github.com/Enikol)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Enikol "Documentation") | [
Sean](http://www.seanrparker.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=SeanRParker "Documentation") | [
James Long](http://jlongster.com)
[π€](#ideas-jlongster "Ideas, Planning, & Feedback") [π¦](#platform-jlongster "Packaging/porting to new platform") | [
Herb Hagely](https://github.com/hhagely)
[π‘](#example-hhagely "Examples") | [
Alex Wendte](http://www.wendtedesigns.com/)
[π‘](#example-themostcolm "Examples") | | [
Monica Powell](http://www.aboutmonica.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=M0nica "Documentation") | [
Vitaly Sivkov](http://sivkoff.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=sivkoff "Code") | [
Weyert de Boer](https://github.com/weyert)
[π€](#ideas-weyert "Ideas, Planning, & Feedback") [π](#review-weyert "Reviewed Pull Requests") | [
EstebanMarin](https://github.com/EstebanMarin)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=EstebanMarin "Documentation") | [
Victor Martins](https://github.com/vctormb)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=vctormb "Documentation") | [
Royston Shufflebotham](https://github.com/RoystonS)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3ARoystonS "Bug reports") [π](https://github.com/kentcdodds/react-testing-library/commits?author=RoystonS "Documentation") [π‘](#example-RoystonS "Examples") | [
chrbala](https://github.com/chrbala)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=chrbala "Code") | | [
Donavon West](http://donavon.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Documentation") [π€](#ideas-donavon "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Tests") | [
Richard Maisano](https://github.com/maisano)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=maisano "Code") | [
Marco Biedermann](https://www.marcobiedermann.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Code") [π§](#maintenance-marcobiedermann "Maintenance") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Tests") | [
Alex Zherdev](https://github.com/alexzherdev)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Aalexzherdev "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=alexzherdev "Code") | [
AndrΓ© Matulionis dos Santos](https://twitter.com/Andrewmat)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Code") [π‘](#example-Andrewmat "Examples") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Tests") | [
Daniel K.](https://github.com/FredyC)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AFredyC "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Code") [π€](#ideas-FredyC "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Tests") | [
mohamedmagdy17593](https://github.com/mohamedmagdy17593)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=mohamedmagdy17593 "Code") | -| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | +| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | [
MarkFalconbridge](https://github.com/MarkFalconbridge)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AMarkFalconbridge "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=MarkFalconbridge "Code") | This project follows the [all-contributors][all-contributors] specification. diff --git a/src/__tests__/render.js b/src/__tests__/render.js index 0ffe1322..74adf5ea 100644 --- a/src/__tests__/render.js +++ b/src/__tests__/render.js @@ -57,14 +57,16 @@ test('returns baseElement which defaults to document.body', () => { it('cleansup document', () => { const spy = jest.fn() + const divId = 'my-div'; class Test extends React.Component { componentWillUnmount() { + expect(document.getElementById(divId)).toBeInTheDocument() spy() } render() { - return + return} } diff --git a/src/index.js b/src/index.js index d2661920..c07bd000 100644 --- a/src/index.js +++ b/src/index.js @@ -78,10 +78,10 @@ function cleanup() { // maybe one day we'll expose this (perhaps even as a utility returned by render). // but let's wait until someone asks for it. function cleanupAtContainer(container) { + ReactDOM.unmountComponentAtNode(container) if (container.parentNode === document.body) { document.body.removeChild(container) } - ReactDOM.unmountComponentAtNode(container) mountedContainers.delete(container) } From 4302cdd591039b274aabdee9f716c65c524db1c8 Mon Sep 17 00:00:00 2001 From: ViniciusDate: Wed, 20 Mar 2019 11:56:16 -0300 Subject: [PATCH 009/327] docs: add example for react intl (#329) * Example: react-intl example on examples folder. * Contributors add. --- .all-contributorsrc | 10 +++++++ README.md | 5 ++-- examples/__tests__/react-intl.js | 45 ++++++++++++++++++++++++++++++++ package.json | 2 ++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 examples/__tests__/react-intl.js diff --git a/.all-contributorsrc b/.all-contributorsrc index de679507..027204fd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -708,6 +708,16 @@ "bug", "code" ] + }, + { + "login": "viniciusavieira", + "name": "Vinicius", + "avatar_url": "https://avatars0.githubusercontent.com/u/2073019?v=4", + "profile": "https://github.com/viniciusavieira", + "contributions": [ + "doc", + "example" + ] } ], "contributorsPerLine": 7 diff --git a/README.md b/README.md index d6c46844..234eb7cc 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -221,7 +221,8 @@ Thanks goes to these people ([emoji key][emojis]): | [
Michiel Nuyts](https://github.com/Michielnuyts)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Michielnuyts "Documentation") | [
Joe Ng'ethe](https://github.com/joeynimu)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Documentation") | [
Kate](https://github.com/Enikol)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Enikol "Documentation") | [
Sean](http://www.seanrparker.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=SeanRParker "Documentation") | [
James Long](http://jlongster.com)
[π€](#ideas-jlongster "Ideas, Planning, & Feedback") [π¦](#platform-jlongster "Packaging/porting to new platform") | [
Herb Hagely](https://github.com/hhagely)
[π‘](#example-hhagely "Examples") | [
Alex Wendte](http://www.wendtedesigns.com/)
[π‘](#example-themostcolm "Examples") | | [
Monica Powell](http://www.aboutmonica.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=M0nica "Documentation") | [
Vitaly Sivkov](http://sivkoff.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=sivkoff "Code") | [
Weyert de Boer](https://github.com/weyert)
[π€](#ideas-weyert "Ideas, Planning, & Feedback") [π](#review-weyert "Reviewed Pull Requests") | [
EstebanMarin](https://github.com/EstebanMarin)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=EstebanMarin "Documentation") | [
Victor Martins](https://github.com/vctormb)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=vctormb "Documentation") | [
Royston Shufflebotham](https://github.com/RoystonS)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3ARoystonS "Bug reports") [π](https://github.com/kentcdodds/react-testing-library/commits?author=RoystonS "Documentation") [π‘](#example-RoystonS "Examples") | [
chrbala](https://github.com/chrbala)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=chrbala "Code") | | [
Donavon West](http://donavon.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Documentation") [π€](#ideas-donavon "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Tests") | [
Richard Maisano](https://github.com/maisano)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=maisano "Code") | [
Marco Biedermann](https://www.marcobiedermann.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Code") [π§](#maintenance-marcobiedermann "Maintenance") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Tests") | [
Alex Zherdev](https://github.com/alexzherdev)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Aalexzherdev "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=alexzherdev "Code") | [
AndrΓ© Matulionis dos Santos](https://twitter.com/Andrewmat)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Code") [π‘](#example-Andrewmat "Examples") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Tests") | [
Daniel K.](https://github.com/FredyC)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AFredyC "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Code") [π€](#ideas-FredyC "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Tests") | [
mohamedmagdy17593](https://github.com/mohamedmagdy17593)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=mohamedmagdy17593 "Code") | -| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | [
MarkFalconbridge](https://github.com/MarkFalconbridge)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AMarkFalconbridge "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=MarkFalconbridge "Code") | +| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | [
MarkFalconbridge](https://github.com/MarkFalconbridge)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AMarkFalconbridge "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=MarkFalconbridge "Code") | [
Vinicius](https://github.com/viniciusavieira)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=viniciusavieira "Documentation") [π‘](#example-viniciusavieira "Examples") | + This project follows the [all-contributors][all-contributors] specification. diff --git a/examples/__tests__/react-intl.js b/examples/__tests__/react-intl.js new file mode 100644 index 00000000..48fe0e0f --- /dev/null +++ b/examples/__tests__/react-intl.js @@ -0,0 +1,45 @@ +import React from 'react' +import 'jest-dom/extend-expect' +import {render, cleanup, getByTestId} from 'react-testing-library' +import {IntlProvider, FormattedDate} from 'react-intl' +import IntlPolyfill from 'intl' +import 'intl/locale-data/jsonp/pt' + +const setupTests = () => { + // Test enviroment run as server enviroment and should have polyfill to locale + // https://formatjs.io/guides/runtime-environments/#server + if (global.Intl) { + Intl.NumberFormat = IntlPolyfill.NumberFormat + Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat + } else { + global.Intl = require('intl') + } +} + +const FormatDateView = () => { + return ( +++ ) +} + +const renderWithReactIntl = component => { + return { + ...render(+ {component} ), + } +} + +setupTests() +afterEach(cleanup) + +test('it should render FormattedDate and have a formated pt date', () => { + const {container} = renderWithReactIntl() + expect(getByTestId(container, 'date-display')).toHaveTextContent('11/03/2019') +}) diff --git a/package.json b/package.json index 54f531f1..8220dcbe 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,13 @@ "axios": "^0.18.0", "eslint-import-resolver-jest": "^2.1.1", "history": "^4.7.2", + "intl": "^1.2.5", "jest-dom": "3.0.1", "jest-in-case": "^1.0.2", "kcd-scripts": "0.49.0", "react": "^16.8.0", "react-dom": "^16.8.0", + "react-intl": "^2.8.0", "react-redux": "6.0.0", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", From aed35f4ca085eebd968212343f8dfa8a68096796 Mon Sep 17 00:00:00 2001 From: Peter Schyma Date: Thu, 21 Mar 2019 16:22:35 +0100 Subject: [PATCH 010/327] fix(TS): update Typings (#331) Extend the typings of Query interface to match those from dom-testing-library. --- typings/index.d.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/typings/index.d.ts b/typings/index.d.ts index 06eaeeaf..53e8caf5 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -3,7 +3,13 @@ import {queries, BoundFunction} from 'dom-testing-library' export * from 'dom-testing-library' interface Query extends Function { - (container: HTMLElement, ...args: any[]): HTMLElement[] | HTMLElement | null + (container: HTMLElement, ...args: any[]): + | Error + | Promise + | Promise + | HTMLElement[] + | HTMLElement + | null } interface Queries { From ea3ef2f88959085cb97a3e76c096cdb2ecd7842c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Thu, 21 Mar 2019 09:23:08 -0600 Subject: [PATCH 011/327] docs: add pschyma as a contributor (#332) * docs: update README.md * docs: update .all-contributorsrc Co-authored-by: null --- .all-contributorsrc | 9 +++++++++ README.md | 15 ++------------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 027204fd..a3aa85b1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -718,6 +718,15 @@ "doc", "example" ] + }, + { + "login": "pschyma", + "name": "Peter Schyma", + "avatar_url": "https://avatars2.githubusercontent.com/u/2489928?v=4", + "profile": "https://github.com/pschyma", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7 diff --git a/README.md b/README.md index 234eb7cc..0326734f 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -210,18 +210,7 @@ Thanks goes to these people ([emoji key][emojis]): -| [
Kent C. Dodds](https://kentcdodds.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=kentcdodds "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=kentcdodds "Documentation") [π](#infra-kentcdodds "Infrastructure (Hosting, Build-Tools, etc)") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=kentcdodds "Tests") | [
Ryan Castner](http://audiolion.github.io)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=audiolion "Documentation") | [
Daniel Sandiego](https://www.dnlsandiego.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=dnlsandiego "Code") | [
PaweΕ MikoΕajczyk](https://github.com/Miklet)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=Miklet "Code") | [
Alejandro ΓÑñez Ortiz](http://co.linkedin.com/in/alejandronanez/)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=alejandronanez "Documentation") | [
Matt Parrish](https://github.com/pbomb)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Apbomb "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=pbomb "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=pbomb "Documentation") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=pbomb "Tests") | [
Justin Hall](https://github.com/wKovacs64)
[π¦](#platform-wKovacs64 "Packaging/porting to new platform") | -| :---: | :---: | :---: | :---: | :---: | :---: | :---: | -| [
Anto Aravinth](https://github.com/antoaravinth)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=antoaravinth "Code") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=antoaravinth "Tests") [π](https://github.com/kentcdodds/react-testing-library/commits?author=antoaravinth "Documentation") | [
Jonah Moses](https://github.com/JonahMoses)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=JonahMoses "Documentation") | [
Εukasz Gandecki](http://team.thebrain.pro)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=lgandecki "Code") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=lgandecki "Tests") [π](https://github.com/kentcdodds/react-testing-library/commits?author=lgandecki "Documentation") | [
Ivan Babak](https://sompylasar.github.io)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Asompylasar "Bug reports") [π€](#ideas-sompylasar "Ideas, Planning, & Feedback") | [
Jesse Day](https://github.com/jday3)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=jday3 "Code") | [
Ernesto GarcΓa](http://gnapse.github.io)
[π¬](#question-gnapse "Answering Questions") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=gnapse "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=gnapse "Documentation") | [
Josef Maxx Blake](http://jomaxx.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=jomaxx "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=jomaxx "Documentation") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=jomaxx "Tests") | -| [
Michal Baranowski](https://twitter.com/baranovskim)
[π](#blog-mbaranovski "Blogposts") [β ](#tutorial-mbaranovski "Tutorials") | [
Arthur Puthin](https://github.com/aputhin)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=aputhin "Documentation") | [
Thomas Chia](https://github.com/thchia)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=thchia "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=thchia "Documentation") | [
Thiago Galvani](http://ilegra.com/)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=thiagopaiva99 "Documentation") | [
Christian](http://Chriswcs.github.io)
[β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=ChrisWcs "Tests") | [
Alex Krolick](https://alexkrolick.com)
[π¬](#question-alexkrolick "Answering Questions") [π](https://github.com/kentcdodds/react-testing-library/commits?author=alexkrolick "Documentation") [π‘](#example-alexkrolick "Examples") [π€](#ideas-alexkrolick "Ideas, Planning, & Feedback") | [
Johann Hubert Sonntagbauer](https://github.com/johann-sonntagbauer)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=johann-sonntagbauer "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=johann-sonntagbauer "Documentation") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=johann-sonntagbauer "Tests") | -| [
Maddi Joyce](http://www.maddijoyce.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=maddijoyce "Code") | [
Ryan Vice](http://www.vicesoftware.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=RyanAtViceSoftware "Documentation") | [
Ian Wilson](https://ianwilson.io)
[π](#blog-iwilsonq "Blogposts") [β ](#tutorial-iwilsonq "Tutorials") | [
Daniel](https://github.com/InExtremaRes)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AInExtremaRes "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=InExtremaRes "Code") | [
Giorgio Polvara](https://twitter.com/Gpx)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AGpx "Bug reports") [π€](#ideas-Gpx "Ideas, Planning, & Feedback") | [
John Gozde](https://github.com/jgoz)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=jgoz "Code") | [
Sam Horton](https://twitter.com/SavePointSam)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=SavePointSam "Documentation") [π‘](#example-SavePointSam "Examples") [π€](#ideas-SavePointSam "Ideas, Planning, & Feedback") | -| [
Richard Kotze (mobile)](http://www.richardkotze.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=rkotze "Documentation") | [
Brahian E. Soto Mercedes](https://github.com/sotobuild)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=sotobuild "Documentation") | [
Benoit de La Forest](https://github.com/bdelaforest)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=bdelaforest "Documentation") | [
Salah](https://github.com/thesalah)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=thesalah "Code") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=thesalah "Tests") | [
Adam Gordon](http://gordonizer.com)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Aicfantv "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=icfantv "Code") | [
Matija MarohniΔ](https://silvenon.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=silvenon "Documentation") | [
Justice Mba](https://github.com/Dajust)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Dajust "Documentation") | -| [
Mark Pollmann](https://markpollmann.com/)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=MarkPollmann "Documentation") | [
Ehtesham Kafeel](https://github.com/ehteshamkafeel)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=ehteshamkafeel "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=ehteshamkafeel "Documentation") | [
Julio PavΓ³n](http://jpavon.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=jpavon "Code") | [
Duncan L](http://www.duncanleung.com/)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=duncanleung "Documentation") [π‘](#example-duncanleung "Examples") | [
Tiago Almeida](https://www.linkedin.com/in/tyagow/?locale=en_US)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=tyagow "Documentation") | [
Robert Smith](http://rbrtsmith.com/)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Arbrtsmith "Bug reports") | [
Zach Green](https://offbyone.tech)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=zgreen "Documentation") | -| [
dadamssg](https://github.com/dadamssg)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=dadamssg "Documentation") | [
Yazan Aabed](https://www.yaabed.com/)
[π](#blog-YazanAabeed "Blogposts") | [
Tim](https://github.com/timbonicus)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Atimbonicus "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=timbonicus "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=timbonicus "Documentation") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=timbonicus "Tests") | [
Divyanshu Maithani](http://divyanshu.xyz)
[β ](#tutorial-divyanshu013 "Tutorials") [πΉ](#video-divyanshu013 "Videos") | [
Deepak Grover](https://www.linkedin.com/in/metagrover)
[β ](#tutorial-metagrover "Tutorials") [πΉ](#video-metagrover "Videos") | [
Eyal Cohen](https://github.com/eyalcohen4)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=eyalcohen4 "Documentation") | [
Peter Makowski](https://github.com/petermakowski)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=petermakowski "Documentation") | -| [
Michiel Nuyts](https://github.com/Michielnuyts)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Michielnuyts "Documentation") | [
Joe Ng'ethe](https://github.com/joeynimu)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=joeynimu "Documentation") | [
Kate](https://github.com/Enikol)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=Enikol "Documentation") | [
Sean](http://www.seanrparker.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=SeanRParker "Documentation") | [
James Long](http://jlongster.com)
[π€](#ideas-jlongster "Ideas, Planning, & Feedback") [π¦](#platform-jlongster "Packaging/porting to new platform") | [
Herb Hagely](https://github.com/hhagely)
[π‘](#example-hhagely "Examples") | [
Alex Wendte](http://www.wendtedesigns.com/)
[π‘](#example-themostcolm "Examples") | -| [
Monica Powell](http://www.aboutmonica.com)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=M0nica "Documentation") | [
Vitaly Sivkov](http://sivkoff.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=sivkoff "Code") | [
Weyert de Boer](https://github.com/weyert)
[π€](#ideas-weyert "Ideas, Planning, & Feedback") [π](#review-weyert "Reviewed Pull Requests") | [
EstebanMarin](https://github.com/EstebanMarin)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=EstebanMarin "Documentation") | [
Victor Martins](https://github.com/vctormb)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=vctormb "Documentation") | [
Royston Shufflebotham](https://github.com/RoystonS)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3ARoystonS "Bug reports") [π](https://github.com/kentcdodds/react-testing-library/commits?author=RoystonS "Documentation") [π‘](#example-RoystonS "Examples") | [
chrbala](https://github.com/chrbala)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=chrbala "Code") | -| [
Donavon West](http://donavon.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Code") [π](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Documentation") [π€](#ideas-donavon "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=donavon "Tests") | [
Richard Maisano](https://github.com/maisano)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=maisano "Code") | [
Marco Biedermann](https://www.marcobiedermann.com)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Code") [π§](#maintenance-marcobiedermann "Maintenance") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=marcobiedermann "Tests") | [
Alex Zherdev](https://github.com/alexzherdev)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3Aalexzherdev "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=alexzherdev "Code") | [
AndrΓ© Matulionis dos Santos](https://twitter.com/Andrewmat)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Code") [π‘](#example-Andrewmat "Examples") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=Andrewmat "Tests") | [
Daniel K.](https://github.com/FredyC)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AFredyC "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Code") [π€](#ideas-FredyC "Ideas, Planning, & Feedback") [β οΈ](https://github.com/kentcdodds/react-testing-library/commits?author=FredyC "Tests") | [
mohamedmagdy17593](https://github.com/mohamedmagdy17593)
[π»](https://github.com/kentcdodds/react-testing-library/commits?author=mohamedmagdy17593 "Code") | -| [
Loren βΊοΈ](http://lorensr.me)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=lorensr "Documentation") | [
MarkFalconbridge](https://github.com/MarkFalconbridge)
[π](https://github.com/kentcdodds/react-testing-library/issues?q=author%3AMarkFalconbridge "Bug reports") [π»](https://github.com/kentcdodds/react-testing-library/commits?author=MarkFalconbridge "Code") | [
Vinicius](https://github.com/viniciusavieira)
[π](https://github.com/kentcdodds/react-testing-library/commits?author=viniciusavieira "Documentation") [π‘](#example-viniciusavieira "Examples") | +Date: Tue, 26 Mar 2019 11:08:43 -0600 Subject: [PATCH 012/327] fix(deps): upgrade all dependencies --- package.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 8220dcbe..6bcb30cd 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ "author": "Kent C. Dodds (http://kentcdodds.com/)", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.3.1", - "dom-testing-library": "^3.13.1" + "@babel/runtime": "^7.4.2", + "dom-testing-library": "^3.18.2" }, "devDependencies": { "@reach/router": "^1.2.1", @@ -51,18 +51,18 @@ "@types/react-dom": "^16.8.2", "axios": "^0.18.0", "eslint-import-resolver-jest": "^2.1.1", - "history": "^4.7.2", + "history": "^4.9.0", "intl": "^1.2.5", - "jest-dom": "3.0.1", + "jest-dom": "3.1.3", "jest-in-case": "^1.0.2", - "kcd-scripts": "0.49.0", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "kcd-scripts": "1.1.2", + "react": "^16.8.5", + "react-dom": "^16.8.5", "react-intl": "^2.8.0", - "react-redux": "6.0.0", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", - "react-transition-group": "^2.5.0", + "react-redux": "6.0.1", + "react-router": "^5.0.0", + "react-router-dom": "^5.0.0", + "react-transition-group": "^2.7.1", "redux": "^4.0.0" }, "peerDependencies": { From c0d2d6e08d88de092f73cd0f688e4e0b0fc0fc5d Mon Sep 17 00:00:00 2001 From: Ian Schmitz Date: Thu, 28 Mar 2019 15:15:44 -0700 Subject: [PATCH 013/327] docs: fix README.md typo (#334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Just fixing a small typo π. Thanks for the great lib! --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0326734f..d148af95 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ test('Fetch makes an API call and displays the greeting when load-greeting is cl expect(getByTestId('ok-button')).toHaveAttribute('disabled') // snapshots work great with regular DOM nodes! expect(container.firstChild).toMatchSnapshot() - // you can also use get a `DocumentFragment`, which is useful if you want to compare nodes across render + // you can also get a `DocumentFragment`, which is useful if you want to compare nodes across renders expect(asFragment()).toMatchSnapshot() }) ``` From d2479428271a6b6baff6d67e8e576fa30398239c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Thu, 28 Mar 2019 16:16:19 -0600 Subject: [PATCH 014/327] docs: add ianschmitz as a contributor (#335) * docs: update README.md * docs: update .all-contributorsrc --- .all-contributorsrc | 12 +++++++++++- README.md | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a3aa85b1..d4301b17 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -727,7 +727,17 @@ "contributions": [ "code" ] + }, + { + "login": "ianschmitz", + "name": "Ian Schmitz", + "avatar_url": "https://avatars1.githubusercontent.com/u/6355370?v=4", + "profile": "https://github.com/ianschmitz", + "contributions": [ + "doc" + ] } ], - "contributorsPerLine": 7 + "contributorsPerLine": 7, + "repoHost": "https://github.com" } diff --git a/README.md b/README.md index d148af95..2b127f7e 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -210,7 +210,7 @@ Thanks goes to these people ([emoji key][emojis]): - Date: Mon, 1 Apr 2019 10:20:11 -0600 Subject: [PATCH 015/327] chore: remove lint warning --- examples/react-hooks.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/react-hooks.js b/examples/react-hooks.js index 251644cd..2ef92b7d 100644 --- a/examples/react-hooks.js +++ b/examples/react-hooks.js @@ -23,3 +23,5 @@ export function useCall(callback, deps) { callback() }, deps) } + +/* eslint react-hooks/exhaustive-deps:0 */ From 89299e90542091b5c9227b6083f82ba6b98fd816 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Mon, 1 Apr 2019 11:33:06 -0600 Subject: [PATCH 016/327] fix(act): add try/catch around react-dom/test-utils require (#340) Closes #315 --- src/act-compat.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/act-compat.js b/src/act-compat.js index 8b76d157..f6e4a680 100644 --- a/src/act-compat.js +++ b/src/act-compat.js @@ -1,6 +1,12 @@ import React from 'react' import ReactDOM from 'react-dom' -import {act as reactAct} from 'react-dom/test-utils' + +let reactAct +try { + reactAct = require('react-dom/test-utils').act +} catch (error) { + // ignore, this is to support old versions of react +} // act is supported react-dom@16.8.0 // so for versions that don't have act from test utils From 7e6031f40c572b0a2cf5d285d84487d4e562a36d Mon Sep 17 00:00:00 2001 From: Alex Krolick Date: Mon, 1 Apr 2019 11:28:56 -0700 Subject: [PATCH 017/327] docs: link issue templates to docs repo (#325) --- .github/ISSUE_TEMPLATE.md | 4 ++-- .github/ISSUE_TEMPLATE/Bug_Report.md | 5 +++++ .github/ISSUE_TEMPLATE/Question.md | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 724a7df6..b43b3471 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -60,11 +60,11 @@ What happened: Reproduction repository: -https://github.com/alexkrolick/dom-testing-library-template + ### What you did: diff --git a/.github/ISSUE_TEMPLATE/Question.md b/.github/ISSUE_TEMPLATE/Question.md index 52790875..efd0d846 100644 --- a/.github/ISSUE_TEMPLATE/Question.md +++ b/.github/ISSUE_TEMPLATE/Question.md @@ -16,5 +16,6 @@ and feature requests so we recommend not using this medium to ask them here π - Reactiflux on Discord https://www.reactiflux.com - Stack Overflow https://stackoverflow.com/questions/tagged/react-testing-library +- Documentation: https://github.com/alexkrolick/testing-library-docs **ISSUES WHICH ARE QUESTIONS WILL BE CLOSED** From 5a88da27a87de869e40fc8abdf5a9483066e5ec2 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Fri, 5 Apr 2019 10:32:44 -0600 Subject: [PATCH 018/327] =?UTF-8?q?feat(act):=20Support=20async=20act=20?= =?UTF-8?q?=F0=9F=8E=89=20(#343)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #281 --- .github/PULL_REQUEST_TEMPLATE.md | 5 ++-- package.json | 7 +++-- src/__tests__/old-act.js | 45 ++++++++++++++++++++++++++++++++ src/act-compat.js | 41 ++++++++++++++++++++++++++--- src/index.js | 11 +++++++- 5 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 src/__tests__/old-act.js diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index df54e83c..e3b54b33 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -34,12 +34,11 @@ merge of your pull request! -- [ ] Documentation added to the [docs site](https://github.com/alexkrolick/testing-library-docs) +- [ ] Documentation added to the + [docs site](https://github.com/alexkrolick/testing-library-docs) - [ ] Tests - [ ] Typescript definitions updated - [ ] Ready to be merged -- [ ] Added myself to contributors table - diff --git a/package.json b/package.json index 6bcb30cd..f226d339 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "node": ">=8" }, "scripts": { - "add-contributor": "kcd-scripts contributors add", "build": "kcd-scripts build && kcd-scripts build --bundle --no-clean", "lint": "kcd-scripts lint", "test": "kcd-scripts test --config=other/jest.config.js", @@ -43,7 +42,7 @@ "license": "MIT", "dependencies": { "@babel/runtime": "^7.4.2", - "dom-testing-library": "^3.18.2" + "dom-testing-library": "^3.19.0" }, "devDependencies": { "@reach/router": "^1.2.1", @@ -56,8 +55,8 @@ "jest-dom": "3.1.3", "jest-in-case": "^1.0.2", "kcd-scripts": "1.1.2", - "react": "^16.8.5", - "react-dom": "^16.8.5", + "react": "16.9.0-alpha.0", + "react-dom": "16.9.0-alpha.0", "react-intl": "^2.8.0", "react-redux": "6.0.1", "react-router": "^5.0.0", diff --git a/src/__tests__/old-act.js b/src/__tests__/old-act.js new file mode 100644 index 00000000..5fee7fe7 --- /dev/null +++ b/src/__tests__/old-act.js @@ -0,0 +1,45 @@ +import {asyncAct} from '../act-compat' + +jest.mock('react-dom/test-utils', () => ({ + act: cb => { + const promise = cb() + return { + then() { + console.error('blah, do not do this') + return promise + }, + } + }, +})) + +test('async act works even when the act is an old one', async () => { + jest.spyOn(console, 'error').mockImplementation(() => {}) + const callback = jest.fn() + await asyncAct(async () => { + await Promise.resolve() + await callback() + }) + expect(console.error.mock.calls).toMatchInlineSnapshot(` +Array [ + Array [ + "It looks like you're using a version of react-dom that supports the \\"act\\" function, but not an awaitable version of \\"act\\" which you will need. Please upgrade to at least react-dom@16.9.0 to remove this warning.", + ], +] +`) + expect(callback).toHaveBeenCalledTimes(1) + + // and it doesn't warn you twice + callback.mockClear() + console.error.mockClear() + + await asyncAct(async () => { + await Promise.resolve() + await callback() + }) + expect(console.error).toHaveBeenCalledTimes(0) + expect(callback).toHaveBeenCalledTimes(1) + + console.error.mockRestore() +}) + +/* eslint no-console:0 */ diff --git a/src/act-compat.js b/src/act-compat.js index f6e4a680..7e4fbb9a 100644 --- a/src/act-compat.js +++ b/src/act-compat.js @@ -2,8 +2,23 @@ import React from 'react' import ReactDOM from 'react-dom' let reactAct +let actSupported = false +let asyncActSupported = false try { reactAct = require('react-dom/test-utils').act + actSupported = reactAct !== undefined + + const originalError = console.error + let errorCalled = false + console.error = () => { + errorCalled = true + } + console.error.calls = [] + reactAct(() => ({then: () => {}})).then(/* istanbul ignore next */ () => {}) + if (!errorCalled) { + asyncActSupported = true + } + console.error = originalError } catch (error) { // ignore, this is to support old versions of react } @@ -19,8 +34,28 @@ function actPolyfill(cb) { const act = reactAct || actPolyfill -function rtlAct(...args) { - return act(...args) +let youHaveBeenWarned = false +// this will not avoid warnings that react-dom 16.8.0 logs for triggering +// state updates asynchronously, but at least we can tell people they need +// to upgrade to avoid the warnings. +async function asyncActPolyfill(cb) { + if (!youHaveBeenWarned && actSupported) { + // if act is supported and async act isn't and they're trying to use async + // act, then they need to upgrade from 16.8 to 16.9. + // This is a seemless upgrade, so we'll add a warning + console.error( + `It looks like you're using a version of react-dom that supports the "act" function, but not an awaitable version of "act" which you will need. Please upgrade to at least react-dom@16.9.0 to remove this warning.`, + ) + youHaveBeenWarned = true + } + await cb() + // make all effects resolve after + act(() => {}) } -export default rtlAct +const asyncAct = asyncActSupported ? reactAct : asyncActPolyfill + +export default act +export {asyncAct} + +/* eslint no-console:0 */ diff --git a/src/index.js b/src/index.js index c07bd000..fe6b259b 100644 --- a/src/index.js +++ b/src/index.js @@ -4,8 +4,13 @@ import { getQueriesForElement, prettyDOM, fireEvent as dtlFireEvent, + configure as configureDTL, } from 'dom-testing-library' -import act from './act-compat' +import act, {asyncAct} from './act-compat' + +configureDTL({ + asyncWrapper: asyncAct, +}) const mountedContainers = new Set() @@ -133,4 +138,8 @@ fireEvent.select = (node, init) => { export * from 'dom-testing-library' export {render, cleanup, fireEvent, act} +// NOTE: we're not going to export asyncAct because that's our own compatibility +// thing for people using react-dom@16.8.0. Anyone else doesn't need it and +// people should just upgrade anyway. + /* eslint func-name-matching:0 */ From 180179e12239d7de7ec5bf5f572291cd9ec48d33 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Fri, 5 Apr 2019 10:49:08 -0600 Subject: [PATCH 019/327] fix(act): wait until react-dom-16.9.0 is released (#344) --- package.json | 4 ++-- src/__tests__/old-act.js | 4 ++++ src/act-compat.js | 13 +++++++++++-- src/react-dom-16.9.0-is-released.js | 2 ++ 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 src/react-dom-16.9.0-is-released.js diff --git a/package.json b/package.json index f226d339..ba558b87 100644 --- a/package.json +++ b/package.json @@ -55,8 +55,8 @@ "jest-dom": "3.1.3", "jest-in-case": "^1.0.2", "kcd-scripts": "1.1.2", - "react": "16.9.0-alpha.0", - "react-dom": "16.9.0-alpha.0", + "react": "^16.8.6", + "react-dom": "^16.8.6", "react-intl": "^2.8.0", "react-redux": "6.0.1", "react-router": "^5.0.0", diff --git a/src/__tests__/old-act.js b/src/__tests__/old-act.js index 5fee7fe7..d21c2bae 100644 --- a/src/__tests__/old-act.js +++ b/src/__tests__/old-act.js @@ -1,5 +1,9 @@ import {asyncAct} from '../act-compat' +jest.mock('../react-dom-16.9.0-is-released', () => ({ + reactDomSixteenPointNineIsReleased: true, +})) + jest.mock('react-dom/test-utils', () => ({ act: cb => { const promise = cb() diff --git a/src/act-compat.js b/src/act-compat.js index 7e4fbb9a..a87ee4d7 100644 --- a/src/act-compat.js +++ b/src/act-compat.js @@ -1,5 +1,6 @@ import React from 'react' import ReactDOM from 'react-dom' +import {reactDomSixteenPointNineIsReleased} from './react-dom-16.9.0-is-released' let reactAct let actSupported = false @@ -14,7 +15,9 @@ try { errorCalled = true } console.error.calls = [] - reactAct(() => ({then: () => {}})).then(/* istanbul ignore next */ () => {}) + /* istanbul ignore next */ + reactAct(() => ({then: () => {}})).then(() => {}) + /* istanbul ignore next */ if (!errorCalled) { asyncActSupported = true } @@ -39,7 +42,12 @@ let youHaveBeenWarned = false // state updates asynchronously, but at least we can tell people they need // to upgrade to avoid the warnings. async function asyncActPolyfill(cb) { - if (!youHaveBeenWarned && actSupported) { + // istanbul-ignore-next + if ( + !youHaveBeenWarned && + actSupported && + reactDomSixteenPointNineIsReleased + ) { // if act is supported and async act isn't and they're trying to use async // act, then they need to upgrade from 16.8 to 16.9. // This is a seemless upgrade, so we'll add a warning @@ -53,6 +61,7 @@ async function asyncActPolyfill(cb) { act(() => {}) } +// istanbul ignore next const asyncAct = asyncActSupported ? reactAct : asyncActPolyfill export default act diff --git a/src/react-dom-16.9.0-is-released.js b/src/react-dom-16.9.0-is-released.js new file mode 100644 index 00000000..33053dfa --- /dev/null +++ b/src/react-dom-16.9.0-is-released.js @@ -0,0 +1,2 @@ +// we don't want to warn until react-dom@16.9.0 is actually released +export const reactDomSixteenPointNineIsReleased = false From 30bf1c6e0e024c0dff8201f848f2c73209e1bdf6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Fri, 5 Apr 2019 13:42:03 -0600 Subject: [PATCH 020/327] docs: add joual as a contributor (#348) * docs: update README.md * docs: update .all-contributorsrc Co-authored-by: null --- .all-contributorsrc | 11 +++++++++++ README.md | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d4301b17..6d741407 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -736,6 +736,17 @@ "contributions": [ "doc" ] + }, + { + "login": "joual", + "name": "Joel Marcotte", + "avatar_url": "https://avatars0.githubusercontent.com/u/157877?v=4", + "profile": "https://github.com/joual", + "contributions": [ + "bug", + "test", + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 2b127f7e..eb92d5d9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -210,7 +210,7 @@ Thanks goes to these people ([emoji key][emojis]): - Date: Fri, 5 Apr 2019 15:44:08 -0400 Subject: [PATCH 021/327] fix(act): ensure that the result is returned from our wrapper (#346) * failing test * act-compat change * fix(act): ensure that the result is returned from our wrapper Closes #345 Closes #347 --- src/__tests__/act.js | 6 ++++++ src/index.js | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/__tests__/act.js b/src/__tests__/act.js index 49729f3b..5f3cbfb5 100644 --- a/src/__tests__/act.js +++ b/src/__tests__/act.js @@ -14,6 +14,12 @@ test('render calls useEffect immediately', () => { expect(effectCb).toHaveBeenCalledTimes(1) }) +test('findByTestId returns the element', async () => { + const ref = React.createRef() + const {findByTestId} = render() + expect(await findByTestId('foo')).toBe(ref.current) +}) + test('fireEvent triggers useEffect calls', () => { const effectCb = jest.fn() function Counter() { diff --git a/src/index.js b/src/index.js index fe6b259b..379fccbc 100644 --- a/src/index.js +++ b/src/index.js @@ -9,7 +9,13 @@ import { import act, {asyncAct} from './act-compat' configureDTL({ - asyncWrapper: asyncAct, + asyncWrapper: async cb => { + let result + await asyncAct(async () => { + result = await cb() + }) + return result + }, }) const mountedContainers = new Set() From 1d00c79408a77a88c620d214da4465369c1a51ad Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" Date: Fri, 5 Apr 2019 13:44:52 -0600 Subject: [PATCH 022/327] docs: add aledustet as a contributor (#349) * docs: update README.md * docs: update .all-contributorsrc Co-authored-by: null --- .all-contributorsrc | 9 +++++++++ README.md | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6d741407..282ef160 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -747,6 +747,15 @@ "test", "code" ] + }, + { + "login": "aledustet", + "name": "Alejandro Dustet", + "avatar_url": "https://avatars3.githubusercontent.com/u/2413802?v=4", + "profile": "http://aledustet.com", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index eb92d5d9..83916bb9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ practices. [![version][version-badge]][package] [![downloads][downloads-badge]][npmtrends] [![MIT License][license-badge]][license] -[](#contributors) +[](#contributors) [![PRs Welcome][prs-badge]][prs] [![Code of Conduct][coc-badge]][coc] [![Join the community on Spectrum][spectrum-badge]][spectrum] @@ -210,7 +210,7 @@ Thanks goes to these people ([emoji key][emojis]): - Date: Sat, 13 Apr 2019 19:31:17 -0400 Subject: [PATCH 023/327] docs: add cheat sheet (#354) --- other/cheat-sheet.pdf | Bin 0 -> 54406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 other/cheat-sheet.pdf diff --git a/other/cheat-sheet.pdf b/other/cheat-sheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3cafbc3a2c9fa9b7dd9a7b206fdb6c8288165b91 GIT binary patch literal 54406 zcmbTc1yEf}&@hO*OYm@k;O+!>cXz+IySux)yA#|c5ZpbuLvRajOY+|P|8J#stF}(v zd!|Nu+Go1^kje{-(lXL9!;${jzurG7y~&&YF$l*3U;x+}TEKC01L&oJHl|Ky0M?H# zMF731xs?;p;p1&(-~K+tS2wIukCms0%%2LIJre=x0hgk z-jD4wW?NlP8eMAJ#uci^I}5yukzElFo3Dbw7Pte)suK}u<*Z8in!8A^@1kA%OAW>q z1st%Kdo(0)_hAu6C{A-|4i}=Y*B2K3(P<^F#ZSR>%l;7O{7%p;N$~_;NB#rHB#3m= z+8(!1z9MsWDW$Lq<`@$tI0~@ug&Un %1ll@ag9 zkPt<|#R)bVmoHG3ErbW3)RP8p2s0awjY)a+m|(r`#Exk>+q+BH>UFD_Mmm4p#6MSd zR;sY|ec3j*dqlonFE&8KjmWoE$S+YUb{;8fV39gLJ?RMpJM!W5f4RJ9Lt$R`t$Nm5 z->`N~e(Iz?j6Ck7x?ixkIrr*n-9@cLttk|ChTSW)^L-%r$^O2{qhq~%mA2cVZe6+K>?v0+*&t+9<@9Xyy(#>x;;}9F zcj#-)#(8rKkKTosg;cAzUP@DkQMWgAvks1c9#1un*(qRBg8){8A9k>JtC46vY3-~) zdRibIYK>7b`h=K4XP)Dx7^*aWaO(;@4vK_`GLep9c1w*!CdEI%{%G^lY|*!-D*d=( zQy6`d28J*{1%B*yEhVp(F#{t{)|d`_B<%5$^6&QYqG4cEet|({sAXufJ2X?fLHz8K zrB^hhRN)PcFh=_gca-@ug8+oabVlFFD{$pBNHDg+pT4|F9V%_6QY5`?ITvFWi~H7X z<=o8&RNkW8(v9&8-gzBlS+6%;P73TplCsh{8mNAn&?x?&pd$TnrZCnaOJh0|{htNB zlu=|^g6Y{Y`gvLtwPyTg3r4EU(yqe>(~=?A=0p -YfpKXUhL4#<)Skv?rMd_uYxJU8Lz=x`Y7(#|GO?Ip^y+-k)QgPBYfM1=`i zXHcSv(PWUmTCWL1=zmcqMpZHsMh%=TNYhYYfK-6M?-EFU?M}7YRi;j#yj0OaB%?NO z`|-ZKW`mq5xo(Th^+3!q9KFOJ(2NjKgSs;KUFXgj+Wh5M8Y0h|Cxdt}p%4ocWq_er zM4@4wd&!7IfO*a8XP6NV0baNfHMTrW8eo %QD1Ssux GQzwvk1_h>jNL<`{Z>b>Nd#A=4*ju7;*XFNfjIxRZ@J zD^7pWPtWm9fSwTR;hgS}tZl)>h$8j!biwPsrfUAK+C#>l$K(@w;A@S?{pj#q;@J?t z##v4VT0wXn`I>P^IQkaINKi2^;3QF=hv;nlY?yL(jSdQKY%PXD9LAAL0lm9YMQ}&! z>E$!B5Fw62X4={pmR%4#gOt;}vBtD*t_ghd)K+-DOA7a~LhWqYu~);E_Da>&XiE|s z`fhibtRWJU`0qI1^M|qcp8Ho|568cdNKAYQq(G#HRG@(of^=w!)Q38P&ho5;XGEG~ zfH2}@)|pR?TFguU)=lloWWzJq-a&>IlHq)7d~<@j-O4sLW~qcpew$H3_(3W3BJ(pD z&6gmeZFB#EM48vWDPk0zlq%N_M1YEZ9%j=zxo)?RS(-6{WpVr6PSB`(GgX{o+StdZ zi=I8QK1LTv=hrNlh6IHjd{Alq(rdC8iSCBLRz53987G7sr^1M${^p`aS5e8F5xv&a z*+b*oPpEf>ywp;8Tv=JFCP%(-2YlQNy=}(~lQ5wgj$0;i&7~~(p`I{)TwA V7(#qcQtEnlj%`-t&V44N1Y{AJaqIzvJZ&Q}ud1JtJ$9+FTv>Fp^)ZvXc$ z-l$P?{w(w?Up$=rm@KFL{pux?#sa2oTL@JzLn|$GsNl2@I$qWEDj(l`8u(!xZ xn}*&s^!T9r z`}hnl%gOb*E9@uZ6mjD1w)b*DfxI0BnOOOGuZAF2)zI}2Q+3W1x6U$RknYa`Vyf?L z>*ieL#fwAxD~g+iq=qonLI|*lOji?AwstDdw)A_YY!Kz;a{ynvuYEyPIHzha> =={6zW^_u>HVxmJ;e(}O3vSZNskBR>Ak+C%il;&~339&s^<0iSv3 QgS2m+I6G3({m<) 7@Dz*r7$At1}JhYIx>`yI##_CJ@jXF4N2xM7L?%GIruw1yCZqT-*!pe4jtH z&o=jzvC#)8#LK}A1lsqTK`^jx=)NeQf7;gx&Wc?z=z4hWicv5=&IGS_fZPkPqJMM1 zE4OV)BiJraGMU1v9lPz+^rq0WURqs0Zmx2vgk&|s#@xQek;$G2YA4F&AXbrd=*o#d zHa_lID0JlOB;Z2y;vjRfw~YT0-#dUf_CRv=Zs_+u`VCg^6lu>G7DPJJ=GqBXKfg5v z#H93#{}u);K!NVyDBcgan3~k VMZofaAsvQg*0?{F(3ah`f;aivpEBA}x#}Jf?thK;pE8mejTDD&7E_m!T2xS$W#`4=lRt?zBPdl^ zNm6cpRJqXA`ngzI-uK*b1a;{wu>%-oL3=otQjDY F(H7gy>UGuyj{+8byNLx4{ec`K-1c;FOcYcK zkS<>7ajf1(x}Z*dfQU3z; *Oy>oT AGcVn zk;bOrJd!gkD4M<1g*O|Xo_D?D!aFV1Pn|IRXj?!(O{yk{G*0{YUW`ulNYKr3)-Q9* zvTpHy RCNkh=1}e S zqShq6h5? u1++6aFkyr8zQq90_aSl)nLO5_+cc7B00nj zfFRob9Sm5n?=y9DZlK=e^>twE+4x*RPT!rMYl?M)Y5;vy`^%3S|BNfz?j=FOYFZ!( zf`B+!^Rw{CdR;<3ulaUvVDAqoEMW;d)YUD)vfYELIDnmKWf9MT!Y*zf+aN0eMBfd~ zXyzHNM8% 0K)>Ir4#BH-s^%%VKn43I!gj7 zX@R5_0`a_zUE{e?Ro#3fav9&iwNGqW!iqb#LiOR&e#YWZ?t8uva!OqG?h3@LXXkbh zp)( 4`krCC=ani}jKagn%*6%ZRgcXy*C6jO++@(%6 zf*8<9x}k@RTqIdJ01Z(fshw;{DLycPVt$zz(cQajw2t*_(vY}3Jnb3ser;d_Pf7+B zdqsPX&|7;$0CD8Qo()hSybPk8-M*7mMC!ELy!EPA##|jKUYth=AkVoOlrXj3?j10}MGL0N=$LX~1>p*fX#n zmT3cx2ep_{%n+Q3k|5<3z9Jocw%=<};8d2odeWy4Ds`dTt3*xx{qDY7er416v#esI z!LT1f$jq#;XF}3pPGj(sO^ajUmF~Py=K4b(W@nd0)%eiQ9sp7`!|@0WCIUd9pv{yhyBC zBos%{un;^4%D@h?B9b!f&mg8esg?J*qOg_%-hrAHj9>`bhH`XbGK
CR33)m kmWnt#4_@mK0@jA z_9xiT&~_wP7VmR9_FF RX4^vu zN88CEa?S^ldXxdgk#aiRvvJG^t3p7qaX6LbY@zUPNknJ?>}G3kS-~OL%;rUa6yuWC z(-cY2FbKb+z`%O+01__!lrfW BusHiPT!c=H19&QKtA{Sw**X~-@i-3Q4LcA1__2FV*gV+$2Y-ijfN^bVB4 zGWHgl3ep7nkz7oM!c$Vu^HpOyzHga>p~)i>1b==4_kLj+p4%%WzY4q*BWx7#BQThO zEN)3_HbMtc_yvJsDraA7Ymnj@NQslxfJ?s4^%Md(O2J)W(}~slsp-6hf~Vs tkgfgrOq5E?iAXU#eiL+ch0=H85KBW%<-M@pW@ZSFV07^yd8L5qTv z*44#9M0j1S@53uyM87C=`#wYa&79rr$?Y(!5C2+%3cWQ$>17ayA`kR)ec(_Qs@m)Y z;o0A k6;2bXQs74+1P9AT?rqLIC%YDP_(b)YRDJSf z2+Y<_q?YI>AtY3LW14HW>u5yVUZa-$sV1tsPpyrHe`i|%eYXUc0I zk!TGFd>TjQes%fq!3|txZpIwm`>@-Vk@6=FtG3<%qj|SwX!owd(F#+6Rvf-WpDlln z)alQWfo{(#D1!|hes&Ua2cfW)<~lJrqfq)fa5LonjI#Q@(f-v|t>c;t_q+Q0CW5oa zb0w{|T)wqf;($lf!-8kc04m4PSrwbvgjUkwTWevV;yf6BNloyCr`7t;;VTqEwS|c- z4PCQ{!9XTzG%-TGla+@%*A@B~P3zIv<51d^?({h|)7*4O7$#04QH!e(itm{az4Q!5 zFl|c%nY%=TzwR n7GpjSk; z(!GBp6+n?iBlU$U#{B-iL2IftWqRO;jA1;IC5Su%j+(4V!yvp_e{V03z3zjKA=-1$ zM8#Ys76=w{1(3f)+Vl&MZI}_QqDO>F&@4m|R pRjYC(OnEu63 z;gc_$BZqAsi<1ph3}jy5Wf``X0UzBY`Pya@hu*P}@{mf5rXn%+5LBe*Q)SWk@f;UK zXy^&7X3qm=-IZaR4&6Q0#+=znjW~b9(U&NtBnd^ipFD(eCJI5wd3^R9T5QqwK4e*B zGdM0SlV(~uFRa;L6fz(h%$VR!DeA}TozP~fj5)C_kmv(|mV9xg?}7LRYr!y}fBd z>Gh}9NGcSMsVO3YJDf=NtJ&gnpWqG}YQP}~jv_ihp<)eQ`Hk|tVMiJ%_)9Sbh>nq8 zm?Nksp!5V6;zvIMH?CNZu*oe_fJQO|BL6O>=4YY4a-sd*6LkZeKcALnc6Pfgy40h_ z&i9DrM*wygv`YaWgDWm6P78)8hw`v?JmU;zXR2SV@|KuUtROy)I70U1w^^&6K?9W# z+ry>aJoA_}SRQ5JX=iShLUibIU#qqqcu1FC`7vUyBijC%Ql=8848hr}FMZ{4U($|> zdJ~Er^V5Df#j*NkxtFE+m6sI{NScHN99qGl4;QkO^&qNUYj?{yg2;&^G7KRJa2EqZ zsps%(Ak`YZ@;y1UAe!LTEys(^14zYZr_CeaRQl0v@ODjkCi2$fSotu?)VXu~^%&EH zYJ+>d#NPM8I0IYd |MSJP 4pgv z2|uvjpk%V_Fdi}*-Rqkm{ot4Cg&z#TNt1*|xyBSg!T2gLF${$b4B*bd5CN^OA3fEs z<4+bUGY1_fE{BQ3OoVvO)+Z0L!+q`bo;~gc8!vgUJ7VZe1jVwDNcE4FgEsz_NKw zGe$V|yqy^P?wUZu`kdJ>r#;nmZ0o(qWg#L)-kDxW1V=Pu8+wbrs>A?l1$vt9?|CH4 zT3KK6%A>Zj lBmR^i{=C_km>B+y{%JG)k4lBI zyB!cfFK=M__um0%;{;&-r)r@HbhLGLFakOP*#7AdvbAyg7 2&cFx=_)|C$ za%2Rs{{auj%L||vadQ$=a{4Hm{2def7-M4i2Ny9%7623De{E&}(;u2XN-biJOaP{T z2>1g)^aJI;1sP>!MgYe@Q T;w{>Pku%R-F*ZU2|||3Rl$ zayE4O+w+%O0D3iZ xCCA0DMLHK^><@EEWu}D 6<3ak$Vf^~Dj)StnA&%rDk*h!ad9!VxpOJ2-j%U^cY8fsy6Ey*pIa?g zdZHHr{P&PSaJrs*N!5N<38XHG!TIWXtuuy8R&7zWYkO9db&>SX3Y;zL3?^AnHLyA{ z$mB0yuAFg$jm+`B6I$!}7~MZSP>iI6++GyU+MrPsD6fjqqKfn44hHFv@;N&cKoMs5 z+{GX1US2VGEvB^jacO?dBRt^e#oXr^3CYA|%_V5^>GYs~kcL(|WQHF^>X|sgkkGg` zY8^33IW7ys{HB*a&nw&A7|<(+%hOk$?KJ;wrM1K_c6X)FbBVfE{7`V3NRz|4v#$)o zEn-4sAupI^op^Y#AdOo9PwGY|24q?zZgjVGl*m|k#1zf*6mm9a^l{(r;3eoc=haY7 zK`N7fET<&TY*w8Mrrq%;7BtQ^Sl;lc$i<+koAvsW-;AUVf*^6(eN#ntxR6ehVc)?k zDt#V)jfYg9 EZ*u3DOJi1wF( zQVtd@6IC$!qL_}6X70dOzDb|FZ$b {n CyqgW;>5fv&-0f-! z!!f=%ymyj9T`&K;V#8{P<@CGjt4U UKBeBKM0)#ck#8Nr> zMhWc2%&X_S!_y0aP~~IQ!$9JJ8t4%@)})+0VgN|wToZMwW*PCL5}7pC%j5IPVzp{W zRqS{PpgPs 28ZDOJYi7B> zpd+8HXD9nBPTKX~_Y56`@r68kjiKcwZQovS)f^lZ+8%=2#?_a@@8LuCabd~z5JL2F z-+aRwq;b5K7Y={*xX0CboM0?{Sw3HA2*orQMmK)nDdPzE`Pi@?!@5P-eERc8iOU NO4+KS)GCKVFfb_F6#>Wb9-aN&9mLV&(M_ zB>XHuT_g#*_ BjYJQ> ^GP`#Pu z+u_$EPgbOqfx)j%O=X86jc{9<%%z`!-%TbsTFm^&^@ll(DRBM@7xsd#HHlvEGh(-z zk@9mI6KX%IF{OX(_ZVg^+k3gr`?{~p;nZkQU(ost6G@TRLmkO*DO(|oVao1(UJ50X zeZwZGKZPoJOv-Cn>3=FB(l?e7_-XNu$K{8b!6?`iz<^FJjLrc?ol192sD0%-PV~!N zD9w3)>bMlRgR+ohT$~hsCRp5X6-qAu7MPh8&}Dt*fbM0+O>8RrE?kv4a5 &`%O@)!VYGhMV_EJ3%3CP0-9L zm|I0?Lg35NzX=Bk_ST5F@d@TXAMfsF8SKWvR-^1sbIXFY$iur>fpv^4b`|Im(mx3J zITV W>h{%OkQ+hzPvRe*(HcKG7AkY(Y;TUH-I z#sHj{LpffrB?z&j1HIa@Ad5>UOAYemhQ-U;d?)2N1e{R~12y8`XyZRp{F+tEgjJ_L z^<&7UM6@Jfiv`0NJ_Ui{)4GiM#$}Kusdc&?jDFpgMECl|eQ#*|iR0E+^|6%3(qFqn z{`Ap3UM3VIc3znz-@JLDQI<3S;y%m &~m+0kH zj#4*(% Xwg|KNN8}50){bp9JsM>V zQB+l8g+*7Uk{?L{*m~s^5HkE2 &XX3M4L8Wn$VUhZ6W7cEEV;FnD*U2R+qd~s9d(+Wyd89ByjAmO+bY_|> zmQ?lq{=FT1l1j9%%^!E{-CfWx2ddL`3YGEGw+%R@uJHHg3yCLNhEU`o2Wh+cSK;}2 zbR#&Ca+~joAbpVb_}F2fS=br+rSwqP@UuS%_161z>;Uig=ogm;7@WOPFb^^60wCiJ zXh_QN*9V)69sH4p(R>#{JA+Z&2I18YRZq_{domdcy)xH#bj=txW(e#!kudKwB%zsU znZG9|ELVVIIpv|e!su|!L?(u)+f#URsk~N<25Pt$N#@v79eAe`BU=4GNr3z?T|{gT zoz%py$bI-|4ed0sueRqCEkV `g<4c&^-(QwIYOWpPd(qN?4YRQK?-P@PrcB=*tk6&= zR`hzsqA-mO=@-lFe+N{fIBLJd27hDVZhLojR6Q^bOKdm;3Y>Z2GdjgBD-|n1?y+xn zjI*G0f=I~%k`eH~8l9&_NC{pcP;_h?i}K>Ak~3$7-EleE#WEG%hnntumz?^o+qsyF z4|aRP@;wS(+Qiu(rr G`t*(rH~cg3;GvvFYvsbMvvm#Ile^U(NG_vR+_k=R(@U;X2U9y(v##!l7qc>fCXE z5o_Q=+y_tl2t4Hkai^<(Hw^IB#Sgo2Vs95W5$LV_DW7SPmH<+ZjGTVi)6pKGm_AA8 zP?sQ=t>9IBz>&w5k#)oOW~OhUa+U@Wp$5k(!!Yyp-2(oZwvXnT9v`Z1z{&+HB{a;! zk zkrGdcaZKZI{m&4;_cvquMX+_Z{at)L+-(Psi918 sbC&NONdw~=b{_jX zZ6$6n)*0mH@gu*ubqE`>N6Vj&6*38oi;t>*m O{W=!sx9^pnhM(6 Qkh%ZXT|!tL@xsdME|K&tbf0($9e-5~>5n)**(mr5H||6a1}SY2QsZsh&Jdnu z_Zm-0p7Kt4<`GRl8M~B92T07X{D?R*c95?WmHN+Vrz+tRh8tARUl2>mvf 0mP_{jWm)zvhpRZ_*WDo@- zv%cY{{A^v;^KKg2W3wP)#DS4TKG_^vWmQZ&K!{d}y-6Oyc1b;u?H(K1>npE@zNzw^ zl!0p&tG0r5$5;FMW0^H7V1Vel5ZY6^EyCc?Ud1RoaU|k8=Tjm#=Y_hcwTB}a(ZJWH zBO0nD!>P6`1ArmNR{r1;KIC}H08y;)Pj%Rg9U><~WW$A+c5jXTFDEy`uMpZum9FVE z;}Jw 9R0CI)(OtG*d~}cpVL#3{x%@Q3L4i@O^wWOqMK%^^xo80M;*T z$a6t$?|lL38`dRzG!_id4B>jhKjjC6!VKR<%vlnC>AnyLIG9|hAAJ$FqH6%=EN7sQ z34NQXu8K5&&^+3Q{|$iP+r=!Hq=?YRlIE>m&X9iRgF*U;2giM2Whg@QUIYjRw%#EO zW{JMM>kTkyp<;fb9Eg0MXC&!*NDR=*$r2*izz)9t2qFvI;b$q$(^GPdLN^b_H|fF| z3jH!6##`X|Agz?6YnSPN)qi>Ad;t!&(27DNTH#}$M7WfXw!OFx>aGOyn9rAgxmv7| z9c&6c3zJ@Pis1j}QH6Merdvp){l6z+{s#Pik^syc9RDi|^EY$wf6Wa18=U`>mHGe5 z46rf$@65oT_Wx^U;GcBH-#H&Sp8u!Bz`ry8|0M=sy^ ;{ z{h->oaF@Ggf`IAgl7eEoID8y8MI$@pIlSkYa?EMy3=F%kk&pi&-}XhjCboY4v!y3s z<4!!`Z05`A?ntv9X{FlSLmha=vX>Id4*}w!cAif&Nlq|fQJ~HuD|@qct1^tu0 ;v&tGdoBA$V+k26)?zT`mb-=Z((%TpG|H%c?O8hzP)lcV!sGsbE&S)kMibPj)4m zQ%{?>^PGO_I{w_S`zgw4ZHs%CGFM`q^zmz)JFqyonA&BpIot1AR#d|O2L#m)66w*d z#4vT(>HEo!-Q&HRJDo}h*B)zV=XP8?lKU8CVHVR0r7hP!L1~mkVx2kDB;~Ff>*+cR zEG}GH000S%2*ZI0ca{jiL`;@IOmj`lq)5{0Thl0eeZ%2CLq}2u&dPYqoPleRVa~)W zLsm5Q!)Zh|HOnb|&oFUrV4=iV9GY=S^=3l_UAZp~ekKm-H;S0_7nQthN#i0>J7Y1g zO`UDFNBc$u8OGtAYNUnDUvA3byk8ls(+`rI(lhAh=73NsM9j>_DdySxT}ZYKoP<~q z_Hi)z{{Z8FG_+tB(-juASi>0&Lk8n_do4J8F%3Xysl=nKN5a`na?OTXWZ6%iL&E z+wVdcnTT6HVp^qaIAh`xF(Ds06$Uyc1e9RNTU =G&04Qnl@X_Z8|$ zpS8lh65V1x*o<=i*n~H=Pa9zz;z9Dm#llLnMEa%!8F``KhT+YM2D4d#C?H_?{8yvS zMva|GE2qst@B|S}{b;&nBUzKz lTTkSCLY{AFXXiP9z49xZ4Mww6Z-0lPOr#= zgrmT SA8jhTyVzKR*bJom<$$Acgxx4b)l-0n=oD2uMAbs4tU$8%}** z1C8A UQqY!A2;vx;fe`;Kxfcrh3;7Z^F zDhMQt1xK^gMOlO6jtwdkjmSo0CEA9wc#Kj>$q3CFo6Z4nxDUad@2kmxh%4*s(l4H` zU!gZVO*i)xo*hKbrf{MOI7W~TqL5Z7F*!6UUnNC<2rCAO{835>wR#d>7!XjTJU>yQ zW@>dlJFa!&dmpwooO3tu^F|i;*v=R;gk>j T$7MhK`Ne*Nrl9z=g>*{qNjQF{`SrLA?-C$ZCtkxR6*$+qtsPhrRz0jpK6!Lu0hoQwYNZ+Y%zev~DPpW^SM z1pipR#!3K3Y-jsGq;npW_9h#&p(*)et}%`^I~o<%6zMhnNL(=`mZ~ &(0+#onZ`q~Tlkl5b(1hlmhjE Jcy-DgD&j{m#)A^t_Tg&;W*QE`bCSkfQIsWonUY@^S9f3^WAHi-5e1~$W zlpZc|oANqFhm6CxUde =pocSSiuXRe0f0bo_!Ufpz)1Ik z;cWFn3(Ge<7$CuRW)T}H0t0kPIDsij2PGqYP8u0>)QSX{>x9pj<>Y)GZ{Y+}+*dOV za;IK*;X1U<&&%Wi2TG9A D>`Kgfutc7|(F{VMp4ZuDPgFy2F0?_gf zFoB6gu-CE`(m&h@u0LmD$-48&q?8YP38>VHHNPBS5x(7RTL%(u%oq|P`fz*z>c#L~ z)&FC{RFZ+PA6kk3;0Gh=7ohSHO^gg<;G|L|+UbUl+m~fWlA71|nNvI6=_E>+BineN zez%V0YhC|F5X*<%=%T=Xf*e*I3kt~s0+tx?FZ;ciMS3gfy&lgnFxyLi#&Xdc-H*=i zMO2<|JY2qNy?bsgib2^t2iKnoSgJv?1Xss?pz*O>vQZifikJelLWrfboG>!AjxxbI z^(YH-X7VKIg@sc5to?Y WNq^}1%BMyb6_5|}8afcj`_KT4D$*k9 zagVg;pO_!iV787BT?-aO$t91JGtJRC5?psHr4)}yikV4>Ua+>Tw;l1>ta@!)Yn}I4 zTTZViZkcLb+^?-+;^1dqfFt_#LeK>N(b5l`;8eGCQOODufQA*)GRbSo=|ffNaWz@& z`8%_@RUMYSgPu0aPWQB#@2@Ge0+v$#nJsUfn|IQdi>{srv3#9f? Uq%>9lO@`$oFj1woaS< zy^az6V>k3~82^|B1ckc4r)yM{REoq1Q)0iTi~A;#6v60b Vu^SLUCMzq9%bro~+MYN2 IZ5h&`Xq8(x) zE^U50Up!e{_ga6-tX;LcamM>Yp@+@!s^_{KIhM4RR-MU7NHrIm?Pj-o=4!L|d(G=m z_e;%X!>lFSU5|&*zniWj02n}}i2l=I%+|nNW5If9nfNt~bko!U7me*WK~FP{mE_9W zp1Z)euEpE4rf%C>L; {R ws-&GBY(+X_wt92Twhel`q-DZGN~eQ%Fh(jR?2B!uR{p$)E#$`7dI{gk!>En zx94SR`b#b8t$W`3i2x&!&)#lYHhnB%FYXK9x$_;BT5L{yoIY`a1J4lugKqoToylt? zJrQ%QbQfrtAT6glB{^=YHbeL5LaFFQuj_oPBD17dchF9~sOvfaEx;8Fmg;S1or>(i zt@n0)SAzWhwA7;+*s*P!=~?w|pUS#EC2O2l)rQ2cujmz-2Dys)*I(#Eo=f$>a %Hzj#fR{PTz+3-V8wLeCsdi#}x7Cr7YVkRJKjuP${C< zK_Na)3Tc0>jEXFb4{fU4!K3~f&XgFM$zhOL#p$<`iKe;zZAmA7W}4OeR^=#Kt(YCM zIvGsIXi?kFbHN*N0WsJ2>9Ou2R%7e=h&}gq xv{R_|NRxT{8l<|&l~EM*J%{Hv5hKdA&F z7C9@_83ZI69zC3OBQlk*lhW%TeT r;$ntz~Hr_mWwX$0(5svtyR$3BMLaGZ1qhK&PQ5!(9w9mC$5LSJ)ZH=UXoU~ zo38pwSX+7Z2QTjHEI{&qnB{kNk!>ZfM2u+(*pT-@@tA{53iw20^MoqtlpSL&cS&Ps zQ74_lvZqOf%7Dcx{@)dosFkxomDvl)oX0Zr(EYD7SyP`v7Dz)ExG1LEJ8!f9l@B-} z$|2Jh8C8{#Q4(kd;f?H`RtmoEepH!EWSLZC8M0;r*!HdYEXr!vbx6YX>{QicI1&NR znvsred3ZskTM@09#ayp3wGy3s7ClAgD^~Xm6Q!;RnYeBMjdW6Rcs-LuM4}Z?B44FE z+u|(y_;e3MU=A**O7d7a^|!^<$urw|6F0es%_g f|81Wk|p&2$zCfT21mx- z0&N3mWa5&;6|*RS;msAsS~3yUbOWk{EJFV67#f(1EnfUWw-#fL1%tJVU)Y=m-G#W- zFj+tOXCI5 OiP2FGIIaidzK~pdHi8U(`mRY-=h<<)YA C*W~maXjf#^uO^~kXhTuGkUPCq6teTwND@< z7qS0PQYn?r`5%>Wv+>okPf6?TD}i4X&P&~i+-zi$Qh^YNepFHV@PCgtcTxUH1AC!o z+qjD(E;}7JD`!cUt35ugZ1nO*i?fBn;mDhuH_=aTBedP|3Fx%UhF|DKKm8a^P#=j+ zE>Ne8PK@9vk4VhmC_no)C@czo;f?)1bX@>e{u@$s zQa)+|Iw^AjDgDY89?2u4A_hruogyl=N}VEl<$)!^%y7EUEEPS|fpBQ`L^y7bg=Ceh zxN{lk(kfE`)Q2^G+}>J#*eU+?Is~{jm(dBG6oIyldty=wjY)&zB2mf%;)n#b;J7r{ zbk>29xod5UJ6YnzDq82}_PT^-Ft{N8e{ODTX#ElbUjrL)y0=H`3ynRJ#={dH2ccDk zr3@OAeu%qADG!P_`KJ|dW-Lf9)#s4zljagMa*&VmWML^{mK+H4CLsMMsRyt>N4Dh$ z1CweIk*j0eirrfGzs5^eF8)@Y^laC1d-HUC6dnC7-tSvzERj?dme5B*8J==&Rvwjd zY*v2crb_KC>094E_{6KQn1fY>-x|-WjQk(;%L#TtM*aqg8Yiz1Tj971dz7a9I+gI{ zfkc|AaAi%ERI23WUEoun*vbyxb{~7+79Qmd2~eV_DvafYU2?Rrh)J@daQ;UpIL_yx ztY1E3j>O5T*4?Xix`ZcCAG|340n_$JIEUCsnbu#XdXN*tx0z@KO~i&fVKnfG#z=|) ziV-BmG>TNj#Z-zFTrmQ|v!fm3^g4EKu>&7UwY^M~oLy9rIOY7$)$f1Y&;Xn09=5H@ zV_OBA8ae0$oE~LbO33@2 zkatmW`=BHdagiWp5pn0x zI@|+c9`1B>;F-^c-&o`DeS!ZU*{k}ax_$qMEM(!?Us@7hx-mDu#f-I(eQBgRO)gNQ z{mYNcf|QI`kW{U#0NbDC4 ewW CC&-U*~Yr$fwpNFK@#?9Nx>2#X=Rvc zNcya3S~#@_!mG47+03&Q^5t+>x!Qm3)P9il`yrlxRfF0t&`agwtmr^^;9fHa9mibd zJ|%uh?|chsvsB2~FiaXgeoa0diz-qOs8LphkX#^7iI{vXUtT1abD>IW4#c^Us+tO~ zci}4~W}ZBetLFbd+Z0#}>n4iECt_-$A_`$ip(1W!s`49mD<_>y<&mwv%~S1;xs~O% z!S~HH^~9o-3`}i43&{VhpdfDUW nbA$7K?F*5_*+X|Q~PN1>rRGMUQcuS(q zIa~gS77^{YcG|<1{_%kZ+ep(0cP35!2vcTNqeQ%nq_v`rQe;_0Xzq*|VC?9#IxA_` z6`k(8Uyy2u2h$&m!Bg~~KT~l3pRwV`ok7ls7+s_!d@o`gUE@o=v~jU`d>QWuXH>;w zI&B3fXB{_VCkJ=I7p8g^stT3}HTGy^vE+KpzVV%Lc85|X)2nogBc-*a>p!*~y&e_6 zbioP@7XkXe!_Pn0l3Tb<$s@%j;8VuY+)Zf@_sKq1Ntgc5NP20 eWH( >)n3Kh^2A8 z)~$-2nuuCY)Loja-$_?Ptz*3f{wasTqMFHN+`p3cpSM%bA1;)L(S=JQI?1oe @xooe`2<7>`3uQ6{{)L_HW`h-&w84 z_uy;jb-no~BR_@P7K=F+tjReDrDe7*Kl1qh9Nc_Lr*EN-Cn7|w8^ki@Ydn j*TbtxYD%>4dw-zJ>ZC+c+tQIW0Jb{jYtGwp$1RC<;CkzlbZ4APVX2k^ z7XrG|sk!G8KGp7-DrxL){PymVB6UJhy;=}?yOo@ty8l&SH#It3CEP-GPXMy>rR785 zDDkc$WO#uNIm2M_q{P(1aGK57P7xvspQ^+?YR-?$lXS205(fI# !;P=KHP?q z`9g?vleCjz`q>MK*)Q99xPLMW;y#e_-@ukiy~_FH5tg@?BcK)9zf~TFJ!5F(ew@w` z)=qNm?ev_Y9XG`aq-Yuk(G(L<1<< |LG@>HFZYwxpn z?##8wQyn^}?Y$L?#x bL7$o5EbgWV!Qj }hM>x&jXH^x#c~5g zJQLQXYH}=NtVXODfxD@ap8{QNyHe5Amkm^o`fM$W&gVVkRVs;oyq T~JG0p1Ih<)?MFK*eVR Yp1{$dPUuUx&-HfeH=S{LD@$;0vnCtmO7>MpeO`fM0cY$=B|XoWI)D6i zGViMAeI6)#cMq72^|QW{-Pc~dJe&VGAxEq|pvEvl)VY5I6?@-zS>b=GHz%bnOP%Xs zQKcqGb*CzWQh2qZgk7cQw~#nOq;vD#L+-`0Otx$oW7ei<9__Ba)AiK};ugRBx_zVT zv6ZrgHH#hSvsd0>DpIU|$eMEbkQ~AUFQj=l*JNAv;yj p-&IuyS5h#wWJyAS?UvUnj%~zW& z7;xCLBH`z7UVMBn$!Jd_tGiY GF n4H|^+HoZ_kD`)+mZ`x@q$ab#+ z=dT$zT$7o|%CC$WE2h3oiGR&o*Z=x#_*45l+s4mPm892_Va8=&+x9tnV82!CjkaOt z=dAe`?$&^T>2s)Uanm0Z+%NrJZ28-C+*fE;v3qH{(mt>y)ItQe`a92{@9*pYYgoK! z5OYx(S|3bZ#1$u8f+BRtv jI8&7q2Q0;RpQ zLEdN1t9~PY>I>Er71VCRC0SIa-zsPOp`Gl=+Yedm-mB(Os0!4d{9}0OQ%H3gD!oeU zzclM!4lcGMou4cxgse+CA_pTnJ* Kt{^am(GkVXEweO@j;Q8r8GotW#*XtpJde z{&&NpRl@g`uv$Y^0Sv5PLaGA9li75R$ZK<@6-6B+LnV2DrZbiihzl+|dc3x}A8owy zW>=$R54P~+eJ*jFc6##9K(HisUmt1W6GUC}o3v~a-^nGFEvx@Rt#Ylzbbx0ik)6nd z`t_w7r}4ew*2w;F=Wf(EuWarPxq+)r$R#vB+UeY`S^I-i`4CQHI+-KhgwJk0A#ev_ zC1N5 G*yPqKZtOBb&U9~D~i=@TnfPg%~8S`jX*^E`yW&(`}R z3Cw)VBeVt0qnVRc5m+u$eLFLciIS&3yDykU-`AeyP1Uf*x`*~(Y%zg0vaa-VzbL;C zP7K58gkK_0*wu|yu5}oKVP6elq;c!Ck?6x7Nz%<>SK4GJvX-Zpf7iwfaQ14DwQwq7 zgBaOD5Wj0T1$p7pL8h3mdvN_|Z=M-K{L+M+-+-=^i|M0<_&!#cW{_5~x Gg05 zUX~>uUaewfXn4?UYk-aT(K)m~wy>Ul+Pb`)6tH=#(+}zFz*~h~ClXXts2nfTtPHyQ z1}m&zg_xkJqrr3L{7izbMr$F1Sy1RUfc8C#-cKbt6an*l8k^zsj|77S0EMtVQ|2H9 zL!A*i^AxiyX$Fx?Wn(o{FJe8bl7~UI_Wr0gjHNPo{j7V C!q?Hmx{kXj)f^W>l}z)JHBTL)|m=e4%V#=6-`FH=(jR?9-RX8Q<_<6TaX zU_sT*G0Ez>Phui;%d6SQYsraI4l>Cs&n!?a!LoHq!hm(Ik+MnLI+1;t-L- FIkpv Ma`w}ja!;s`z?cMv!}04*J8zK;K$ z(xmMq9}VWsLR6kYZOJ0p*Bqp5bjCD#!wOW4Qn<(HKC_u#8;75fwQw1-Q)c?JYqpE< zjqo8sKkFwl%+LrI(1;-`a}MG3mgyW^@S?QI)6MDiS* 1jr_+9k^j$rld|MZ8>5C}=;jrc9pL zfo3v4dw>6_A Io{!ap*Y#`l2)~H<|g9tV(p`8)4Dv6pNynGV?fW zF&a){y5^^8f|N5pM_{phov^8uj#=}`K?pXC3hFu3{4mHs))SMZz*kFWUTe!{1))P= zTF+@iRIdS_wvpzNu7x(8QtqLvYW`YK_4Cv>;=efiwm!JEyM#ad0lDAb1lAPNolSch z?yJh>YZ(?ZjH@wp4hbv)jU@roH~}XiA{|yx8uI+vRiE^t+F3M5F@y<&7xz}-JEg6S zoRAyGa%Ak&!58S$gh4YK6A5{839T*vk$C*B=RkdGmzF^`23^G&DPQ)s@m_%u+|Og0 z8Q;6cl0`cv10wapOWLsTt}Rfz$(YC*PO&IlQdE+<`T;C+r9@E$Gin6i6$*7doY;!j zVrbA@_6361$p&FH$R&ORHH%89idSOpQ@P~UWV7_1ozN%bWvhbmV@43MZHcm{k&&?a zoIVJVW0`jThs9KXZE53SW9I&A3)=6kSO2=0>d*aQ|F0~j`g4od|7bDQvRoYDELP_^ zL@4%!)}Vu&^hdHT8y_QJngofkE;~A1FDH7Gw2B}kI2c?gBy8N)+fFiK5>-J7=_1_P zK?qn9iLM}|0OXrdZt|DUY_2p43b*g(4|AH`Ws5!B$KK60?P}ht%nFz%K$nEY5(j#? zUw_keur@M$zY1kdo?bK~O*yBbF|PQDE7$L0c2@l@=`}Cnlr*ahO+<`A{Lt`l?x*SF z$J13o_k*4N>5eS ym=>ila{C~ur^p;z9Nt;e_PP#q7Z5NU~JGfol26W{6mori~*$#AcOiDX+_PG9rV z+fo|tKFy_vAxJ3vAS3t~vHOsIXHPlycP4#p3A0PkPG6hVDI5?q3-O7Z=^E7|uu=&q z6*xxvrrnj1+ F&+murc3awe)`$-k@%T!;tFCR^sRJ zK)i~zb!Z=wEytGXS(frU!bQ4%>$!6O%k5zq0>y2Ce%BeJtS`a&HXJMjYl(Q(d4O0k z=jrNZ@g? 5x=Qcy)~^wYQKE5WEa-sb?e=?gWv#9^5&X0lx(O5F;4B^3=9Fw( zyW0UPo#b|XF^Rka)G?&t%HZ&Hjl9_&8*T62J qUt)#|ZI391>XeZyPIhKx0 zNB-!7inVCca=k2u>s>Y1Ka(tq_4>qRoNUt01f5C($Dxs1CTx__h4l4~i!3)B(!>MZ zoKum|sgPU>W!M`ELo1%4vgy&L24fdPRquqUvP;MAxIpGnFC%qjcIhcX=P0TWYe3bo zoWrvR;BYU HOK;iGFc+NBeR_O|ExU@{P)S zIY5@Rq*K1NnTyF(8f|3`X-RmCV`&A)h{EiW-?ipOpm~gtzHl$+0sbupuU+Za9hdLn z5_5v7TWo|j5L|{)Ji}w7w_l{owIe3#Ut}=C*7P= i$!x>JCQwqA@=lf zP)eI$9E*)gVa9~7@wajAsj+_jfm|7qkttM#P7**vpgcJ~U>7{fKH{yX&neM*B!SUr zX9AXL(NuT1M7FWPAuIoZ9~h(K#IxcTf?_FW$WFtU*^9_6mys>#NyOgEyL5n1^JWQU z46$@){osKJjqk){*jwlrs^*Q} 4{;LP_}}#a@@@ zg3Z}u%(H8OHO<4i8vTega&m?bOWu2^9W*8%?hZ`j1Oiw6N9l39D0qrW=aXnQVm{@V zcq~~=P>c0S#Tf|t%!t-y36G8ClFL3RLHIkn=_SVFR*J%y5LrqkG9lZQ3}W)DF99)7 zz&xvad%E6`oPT$^?0p$*CTESeF)VMyWE%oYQ62a7f47B%Haz~;|LmEvDP2^B9bTG+ z<_PfVL&O`+iCyxDH(aY)6p}}c-b=kUHJjMZm%V`#L=AmfhlfPtAI7F5sk@C}-d#Fj zka#ThHMUWDEU`8UP I8l1}#Uu$1_SDmuVf!<;jo!JgOY!q5ZrR;X9PBkh zc6v6!g~r2 {jk{y{s|D=m8HW4s=nn>fF<3h3WVh z+SFzGN(@a-B!XbyA+xcu2J#t`;42-%8Ck{;8MbEfDO_Vr7&%-s6be06G$;4xX-C&4 zl?k-9l1Zx(Zvj z)0}!lQ&(uj0^5rKimOe>4l-3r#XtVp{Fz_@+%dcH*LQ)noK3!-1dA_-8G%^d3R_)v z7Qlw`EvcG aM(M7ev3RGF@izR)s_~MaZ$L ^&x{E&{%v#Paa74}-JxD(`^#H&+ntLJxh4OvX<`_{<+ZMQi4*QD zsF&mY!-osI_Y3sAjE32~x~G(qUlI2zP>>Y>lMz6xk3V25=ay_5h|6kr8dOalpb)+` zikJ)_4ez7zIdsm3B!|E8BzBPPjrApQ!0(N10W_R~{-$;ajCj*P?m!&z#*=0#0CXtS zQadW2gSp;jFP&6umbUIDoXg}X!$8}!)^zHa!tw(EQ^P6H Gw?JKUVurbsv44Dv`cPht1Aj6D+Gi#${`28tF9wew|x?(s#!-XQ^Mz2#L z1|4H^P&a;wGvWrh^IP;?XRu{1clj)42h5GWMtoJv-l0toc|GU`whiE#hol}+1H^{N zx`%Kpy+c_qM6Z2HBff)N@B2Rch(=_G&0dHB`>aMmhxfg)WkXwE6MSbB);UFw8o@Mi zY|y!)bd!EKgHTWI0MWo&vq==Lo8Bm}1poUsfIBZX%7Hv)KIql+y>8+UXSt1! nk)KTt8-XQ5w z(92H|WOng}_BjKIcvvdyiVmy;!&_ VN{BEQr?=&p_-GvD@rg+oRTbgfq>Aa%=r&7_-knW8g8?4F?0PD zgR{PFAo!OU97JC5o0s8#7K8tj*Z`hM+}y+3)LhEN*!#b1bRhYI0^widY!KPQ{|PpO z4n;C!%sxlyqHb{_APh4kx( Rb9_}8nk7B9mi`( tsp$*PwmOu zF3A}6J>j??_f1kB%A+ $>x#5a8OtOOqjQAy)_+;6=)U*H#_*qV2| z6ako9t>2EkY@HPgdaRl8Tp{kGTiqYQqG~31p5F5BlU==E#5lk1lSRL;EjlY?7@F7r zQu;VTB7*}Nhc(t IsU%#gkp4*U5CRe#H7 zb=si3f}%RJQbo4H)oS!EqB>X7w ypXgR$v3o7vsCfX^T(bQRWzM(O$oaEcZNNV`B%2gy%+EYzz zl@%q1g4R`CGi^_yhds*j-9;v1j>y 2x jJv3K>yeR0vT4|sn -~dppiR01*c4`gsru5d!R{ zbC56*1nl-Y(1-{hcGnmPNrW!Fz8*wQ1TVd593)NzewRPm9QsZ=Abm2EJ;8egcFJ4O z2rvPGxV``s;iqGcwuFGbK Fwp1aoy<8%xPymvCAW_1IUn0sU7K*KjuZ}kH?>(o>*ZM #Q>lAg_K8p{b#q2$LrNb_&l>cn){`AV(i-s zcCIfuX6B=gg%Oxgtu{lzDq2bMvT?w#KqwF-db78k01P0)3SUD5;u0Z+ZzKe96G4S< zp#^CX5r*#ofnG$IgKJ SbYsIRV}J zX cEH^co>Himavc#6k)1376ckU zl#@=4I&AM*Z)e2(Q2Tr898~Vjh#>A9*v2)uAn8|-asahnLCO(i^$JpTpw}x%)q@aU zL5c+=d<7|15dAAi&4K){AT =o63Mj^7)i-G<@%E2vtn`~%|N+n#Jgprnr z;Q%7Z39WH5B)lGN8%Xl46uVzaivX#JxzrN&f>|5_O%0vC9R{TX2IXNVQ)qXE?{s`L z(|32-GODWOY%D9?HDGr%i^tXC1S@}a;uMWJR=E5vM_a3ZwZNR!kxmHmvg<$^e_zc{ zT3D{gqajtNXhX_q{j%?*=N}7k)YMTOuouQ8i8hZtTvutY_O|;skC@WEXY{x37CU;6 zRmcX`Q5tt=J+3~fejbU?!h+VJalzAz8~5KtrH80RUPaE1 TyPnUA>2R*#z;`~Irh9Mf4Z9BT?X`%col?@_m?u%{wFc? zwWv1n8m;Vr&H{Ux;QQ${=q5V-_m_tuDOM_1Qx9M-P)|e`tG7O}R=PxBm2CIQ{vdJ^ zgP-Jphk#$-UBwq!cOiCWm#5*|IS6E*d?)cgCus &7WX9PRh!&gl~~zPn`L4S8GK zuswU$*Dh`B)_rh0dp3~G8*8;6H+yzxUC+#GJ=Pw+X_F-MW>?n@>^bC+H>I#B?oOrc z!77>CM!SXvMUj@_i#J(OKMuJvQ2Dy8%0WUnDJmV70kk|uFO@}NxF(W@SLZSowuDyG z9ju<{Gl`s47*=l2xZ!Nfytcv&gNjj`l3PA;XtQ }G~_LFESEaEB!?5Lx6tgIo?~vva{pbr31BTlEOc7=f}rlRMhM~CeOk0qCm;io zqV|PxGvAf49vM29d8My8@G7S1lmEJ+87A>aRCRma0P|O~X$X50qwof|6~Y{y(IY~v zGh++mMzb6TW$Q>Wy@i;8A~1U)9YgO_?FonD!Su^tA3m*cC-pJ8iCZ=iK=w2%Ie&xe zoJ)&dBx9%Z)Ez @SE$WJHF|us zbZu;b>n<0>ssBzX*J_k>>94u&2^__!s+j x#NH+F>LlOJJ_;_5(8pd$_8R-r2X=nsjB*MWz!o63(wS?3Vdvj=0H_ z3m#$BSQ6A$lk)YZEva`XN7%K{#0&GyKq`#OLl^3%r7~ZR$b|T<*d(8DliJp(4pOsD zMy}*3p!lM%D>g0{t*o4|4WeEK*Bq{2E#INQ{mQAq3e8bO{Ijq5*frP6RJyUkZhAbi zl&0n?gzkHcey}&mkt?cji5a)S@KRDyf=rB|yrP dQS;bz}A}xcDO$7B?`s$ zYPO%SX-W3 aQsm^?53&D W~>DT_MM>zN; zksZE>n5&?E!}48Xf3PQVpHsw;gWKmLBPxY6f~;S~+2zl~Jjl3A0%(((vrqOshWXdA zFXYMaS`~qmQ_h{Z_?Ys;p6EY>evm%Txqk^u)ysXPymF0PPb40|e(*&TXD8XsiAE1a zYie?cnx<)rGQkO@f)>cxLNP)M%<@&P((P150y&g(>2@X2O-u(dXIAjK#JnOCc*!CI z5xCqYJkR)QfP>18icj9b;!um)scgCL+l=vHJ_pku-589A5%H*9^UQ>IKB@F9H_AV` zM9p6cdLId25JXR4;K5pX_E8|MRV>nKF~A7oGf`o9WajTBNpKGCNU8VM48_LNkEE?; zah?@%8DDO #gj{aq=h@LazeUI=jw6Rs@eWneH(}w z3~di4ShxByT%;5RM>C!3#RzH4sGTO$4=8f#%!p!eG5%PTS>_7q^nS-xXkl5vkAd0T zs7SM+59 jzv-Nx7)LMXoUuxw2!{f4QY!{H>EP83rE3RvwpJEo1<6`vgu9=2qS^S>dT}Sp_ z$OtquqxBf|@dVA-?@09U$4pr!+r(yu3yvVa<~y~D`TaO^;pS}OIuhU(KA~gfBP};1 z|Cvl$Dk_gc4^~p4MUb}XIq=d2`vfCI3$5|*!P4&_=rvekWnug0B+hF__E(nnM_Tqz z7EUHpV-jXY&cD%H{^sEP-yZ(=ga4g)^k2`-{rAIPnK}P==Vtla!EArcNc}C!WBZd7 zR1rjJ$|Ult!RGMFCHm)7lByJlko3P}ysXf))KVM5&rwT^kN*yi7LV?OQ7oN`?gI(+ zIXEUB5?vM%PNX-Mp0?2g4UC|fwqQ>Opp9VS2z%2`9W^}MtW}-wvP&McvMh8vATYtU z+q#>1TgK)(jtIz5=l{%(Fbhtin@AT0hhV0pC~Kj{3kF|WozN*wWXQNJE+qx-g(Lv? z^z0KzK+?O2B-K6VdH?dE9!ivl7(k9+s|Mu~z}XuH)){rDs?7*6Q=)E2OQEAUdl&9* z&MX{W45_HOP6qzzi&Ik~1`Y-!k1v>V;iXrt8-N`|0-rsg6z0KxB6>uQ7ES@M`XX{P zfO8Is8Yae1%jZi8Bt`jA^2> M4NTPb6#a_b_Q=cS$L!*u zYgL1}Gew-CZqqe2oVjC%ol#iuY0{H~BE{%nEtrisle7f*LiPkQej<}WshGP95-qvT z;2$!b2(dvwU^kRy=EO}};k<1!xRViBvPiAkxl;*XSn^xmQKLkJ;Qo{ 2>0kIA$k)3> ++n-il zmpY-=UxngasN9WL4#%laoh#p4GAc)chz!KtiTw&kasK|^ 7w3lF)R8NuybXUl15`FjjhE{?FdA}Ou!_Nz(PWBDtCT_ zw+KcgaX7Z#13G@mQSO9bjYs~_>8#9Jlu&w<(CJH04G08-+ZqhJ22W`djfdGb3@fJ9 zmx?br8dI||3%2|u*OKKGO%QK|Mh9mIDL|M|j=&5AqTBXFw55-a6vJSYW}mq0{%p z>wnupO(GOUrVL9G8}eu*JqdeUOE@C}WFnkI_##O>W-Iwf+E58lER(s%pNyg642R;1 z-E=~J2YW8Hq4?nbL~6N&ujAeW;cRF{{Ig%Xk<_VoKvaoviTJ_e{Zw9;UHDNL?Te{K z4^PmkI`NiDb}6+xBu9|VqmlxWFH*xgY(&PFgZwWUv~x4-&BzjGjxVdey~2RaXxwP` zv 3PyO7 zcz$s|@OUVwO{5#02)V?D97`Vm7%?r;WQY88fv}(l7kEYeEh?!F2hbb%VGVHhvG_@d zq+D**oM#N+mD1^maSmsRK@af41`zr~11_IE)B6Y-`8B|tT4So>w?BJvpOb*$fB!%? z3`heY7$ICbgPnB3Kn9^Q6Nv-4;~`6Ww5ftGwV^G5O-5+c(8WerS}3%g*wt^2pdUL$ zz5`-`YHNgzh(9|S&H&>%jA!Uq!MAzDBB=1)!fD}PCXrgC$l(YZ5qG4d(&Xsx$w_IX zdC5dD2ldQYR3pnpXyfgrkuK<5FnL1s#D6CE4q_A$c)$0PWJ!)aDCjTc;Dx>x=dpss z4^tGIo+PXXFo STERS^ANK%CVr!V$M$s;NgR80O@#K2Ue)yF` z()E0);Vp-Yy+kU9IP4N!H_M8sbC%+M-*fJj6}P)~dA{uh)lN_~FtNsUM&-ryE2ftO zFM&{cg`Clvl_r}#>YY68+hg)Kq}d^5pQEmF Z&_uf zL*+@app1TbyK tGwxh8K$7)sYE7_8 z5BHeY=v`^o3~oi&EUFd#_tKft`Nqm~*`zPl#Y2->mD+jQCEn7P85VKa>LWUI(ovr{ z49ipxOXuEH2-=r?tMf?q_;%xREbtTOtKpuqTe-Wa8zip;@1ncnp&Khp2^3rSkR_wV ziBXQZ$9|%_y<1Z=UUPBtqnoa~@3q@i{{h9`_M!U0oB2Z{V|rWc)RaD*A>P5}u?PNc zFG$M|PQA5g?r$sO?(&3Gg@g@D4GTI9Uq1e_g!m>BE>hBE^B(%WRA^&<+d6rVc4#Kj z1pZC*%$t3-M4?) C>5yq=Y2|D@ z##8pg?AL5qnU!n;)(=#=abw1oH6sg_KiVuLE!HjI>+CHmES`5bcg}Z0b{@xwwZGHz zGfdIXY1eCA>160AR%h92+j_4?+H6}>)c!PbUpaXHHO9T*8vPLZ5Qp=DQ!f)dQztX* z8=`LDBH^OVVy1@~pHho_i-L#!O=(+Z+hF_DuMCKTwG$GLA6wrABiV;-lg-{;m-5BB zNyVDxm{x2iO_on46e37*MF(*7yU1Up&6 ;vm!FTHj}cPV$d7;hN; zQe{&!D-q|F=b R*V)h+Sl RK4_#@fTAM&L)kBOT mzO_F3~$J z{V1(%HVx_4eFtYt#h+!xp~6~23NP+lI43C(`7L5R;+H+Tx9U~Vu*`%>mg!D^R-AeN zc=$5LqaY)*gZa{XuSG8jKe=Fw?wJo6A5bE?B5cw5DC5%k9WS=Yd&r$tO<5^;NWCpx zR+Hmt4nMgmxM%9{U*E82THjAIDspAza6I23j^VZ9g{ex@M9}!Ewx1Pv&9=6`bFfjj zVG;`O0KTZAl4w!wVL!mn!{&avFR766O*qMH=WNs6Vxq;k4u9W^wK0#kj;G5iXeMcX zGE6uqJNh%X;$wEA|GR>>L&;g`)~sxS7A-R(I`qeb=i}PB({xes$H{LmtS|cY^c#&k z3aZtgio6ncQ#I3Xoi)14#qNLJCqB{D9a}PGKDUz8uch+b5&p{h*ks{~Gv?14$L6@` zXBKeq^brahArjk-0a3Tn7tLN}r=ToEF~k;rl|fN&>7AKgeRb*Or|MjrD2_<;KF^PL z^b56^hO`Dhn@8Oj`ps8mAt_R2vt>tQJLq?rI L$yrx{=-htn7eLtL$bqtt9tA8$+v3z>)E+k^TnaX%Wp!93DuiVOgSAh zN9;@5&6kIaLzS`1EG-i=UNbXCEI;dNu`ASPJWjKl8|)3w+WUD2n(ZI8ALUSjAR-|G ze`Q=89=}I}(M9$q`od@D-gp3eDJ>(QD%8^6ATslPGHvEZfZNmLN6Oriw;eIR?B`kP zOj8D~W2^W@_*C3X*37zw+AXYICq7@PWiznp5M|}~J?x~*Sn5njX0 9#(nl+1g#&*xC@!2W&LIT&r;fJ7%>E zwRzvq_39osY&x#Cv0W<;=yxsS+}577wdZ 7VpW D3t8Se%JVzwEO8Y7eh$s zH1|5>qWGz7dA`IEZIuYw3 ELUDX5Dt<0Euurapi vqQ<>6|AMeW z3xN3dOzn3f^O^~ GRR8l+01|JUR<+uw7jKjjD5 z{?rKgzmXPYfAoB(wtyWr(Z<#G9i5DX;tJmfj%12Y8Vgb-LMBKVJoE#lhd7iZCK`=~ z*}G0KsW38A2~33d!6x%?7pThpT`J-d+sn})3X=+s%ax4h0qxa=-G=!E%TxdPW`Ocj zFl4uz7FZB_z82=mVV52{#z^liI4&v}vKCn9x`hR#)SWo^%u|~{dU~mJf8EUqV~|
FeDN)({>EHLQv zsD4g)G?60`ouj>KcT~>Qh7GtO*U5ZS*PfydsJDj}-d- {ohdV-fZqr9j9yRz%aD;$wWw6-HCALdGmB@*Yjv^wb zPMAI4qP}c)@>q`z_0VVKcH*3e?5V5lCBuD)uxbh62WrJLn!$evoLvvZ<)nha3&^&` zv~o8D_=oT)H_E^aItl 5Y&GgV>xPR!9IJf}~L)K0+``gIfzj z)`|%J0Kki|`~dTKZ{q}*0s4H0R1D^Hg4To7>_l=xKn#)+h7awMV+LCRTEhmPp<)$? ze2K>{LP-~$LnY9G^%fIR=Ej8R69diUB?{kvr!2*#eg7q2Oj+RSts8zbtp59lJecn! z?9k6({vXiNz^9FoegM7&EmZRn!b)|ItciPJWx?QdF0RWqVhbWSbmOcOoB`-V47-zH zg$H3FCMC6C3C_hu iu7_v3AbX-BV{ zXc*6#$TH8SnWkyT s252NDJnt;P}e zcTmN{=|I{BqmX_iA-5xchYBji!ajdM>t Y32g#QqRzl_8{5Ov022 zCC5=Er%A5|zLT*b)29@mY$Ht?;x&_U!POQvP^u))B{8HxNfc5}rl!PHk|mT7T~Oqa zZ4&kt_7*EvMJjce(fX3soUNnOChjlm&m@(^mU@}GIaHBUmSCH5nCeTRlsup6nQF+G zOJxXRRQy%))CjK9CETS3EUebZmt3#!761_lWE7;BgqviTM3}ta;OJAKXiWqrHlQng z7T&L(q9`WC7o9Hlo@%UDsOSA@{*(EQ6j#yXbkcs`74cr%6`VPRx$ZXgHsLn@cHOWl zbT_ln9h)j%adc92OLW{N`%cru=ENdrm9@c3D^1EhtplxJ3R#Lp3Rp_q7kPEZS pC%>Zd_!GmVV9|1! zK!s^(ot9;xV%<1~ej=kTmq>$NgPNzPk{pv3lVO$0X}+LJZbfcUhg64d;Be=6lAlIV zBAH#K`H}e@#yQ4?>!xqNB$Q3k7U~r8^>dqkbB;V0+|;G4j>witl!+NqQ2Q~n^3JGv zqJ9F=cE^g6y^Nz}prCq5Tf1CxE{~^&f6%YcJM*3nK_E&iDjRzl+mQa4UX9_9o>-ek z8%oQ*{-FAy=Vxz*t-h)MK&Z{8Y2A3q^3Kw?EuGs9Qex&!Qdftv8OJM{mMV`BK$P%Y0hR)*h!BM;b3gK*Tx2nPI?n znRH%nBy>q&G-Hf5^m59dQD02i)H!?@RhW<2_2{+lUH&1k@Z9)Fha!iPAQd%`{3&S{ ze*(cEJhe(QL9?nM@z&(j=Jb;wuV92=j37q4M|+t+)1C1%__N2u^5y*5?!)|}5+pZd zIouw65u_xf28 0wj8#n {J}WVB8+ zNr?b9F#(n@xrfW=+o@%_u+5_l_{|eWHocE^M?YP@Zhsz`sEjx4(srgLA|QUViuw|P z(fxT_zVgbj$#WZWKB*<_F>$w_Za3y!|IYj=0W$SN?T1P6)L#7vQ<+K`ESXJkC6TXd z?zM&&z^%{8@yUfWY@a7Tk6C}HzpI}Xr7(`HrqgE=plW04VJ~DBYaX_qJyFLf5S~ns zr*_r0Xi1CxC4Vg)O`b{dUK^p#rgp_r$~<>iWfX1aYAa*QVdTxw< 4mcq$&nayf>npel^K;hmFjjQtGd&j ze$ggTmGw4;ab0A)K07SC<7JDw3Y*1LGK0x$laY f6e>l(VGv)ZN)dm zkDhBDu%1iH`^}eH=_c9+3*Rf(^eeVUFA6R|;)+M@8pgWLMkv;CW^whbrL}FcRW?$y zpAL!+fcSA4J8cKP4aeC(2Nvf$R_z0)!D1l#U<8RU30ngPZ M2fE|jXZdF4xk|Z`IlE&L`)f9x2OOW*uEl&Y%J!An3Y+dA zxk-7>HwNyAPje9Y7rZ0=zwA>z=iYq#t`n(~Kesd&@vVr{+E?Cpbw6l2`_1?p2BFLs zzpLn*^o+V;OSy@JajdLNo?Op>3(@|N^QZ`%FkVeJ!RGp{sqD(?%9RmdYL&rxlgsDD zw#O&+)H2IT9(_LlZ2z|7(C3&rqL!SGhDQO``(ID(+xDI6o ^{1GOgS+ z`)|j-WD`I{K|h=@w)?&qED7xUuRKq}d`2-48uj6Rwt6-_+AN@gSE9}NB2@7_dpB?K zx$WvGZ{BF4F5EIMv{8)dCFQ Hb)`H!Yo z0}1;_N_R>rxiLbXesE70UX=D0JFB-JE+79xQ2QE&zQ(VtoGkxXtnt?p(*F|E{-MzI z&zSb#$^x(QWv(Pl3g%|k#-fg1B)YFf3@#p46404{YmB*rD6d&anB=U@TtUiYf0PCE z|6V=#`x=oysvcs-ZpL jo|M;h@yo|DlB%O$plb!kRH6;@EjyBeyq6DZbh!)w@#oEcu(FLCE zuf-~k>JHYXj%Ma0Y=2U9OIo|Qx`|mCyO4n5d?tD0zuvI_DIWHEu`JBY%zwP-gEZCt zkr(`RqyJtm`E#xAe^(RHkMDBmAwdj1 hT&B^XC_|o* zWT6pfj6xoh>kEuASGzxdo3Cv;x_+Q-bCNiKCdi26M}4aK3 nS(x*NyOFkRj}{(5QC~(f4pO01EG;g%-HEK(Kt|7cqTPBb9;@~ zK3ab^bAp86m_$4*|4^CZ0ZHF6DHwbGsX6zGncrUpgava}61G2fGyV-e|6wgB`=4t$ z|Hv{~NI1A(&td&qb_4x>m8%ms|BYVIY5vqG^a7)!p;a(nGqW->vOtv{SD-fnK=fmh zP$cE3r9*Ff0`?oDXT;;VVV}TE>Jak)X#<^B;6>`JE^@SaPp~9oNlCegNsfRE9v2L{ zydAbBunVjUbXPSXJ1X-K04^r@X#<@(6?hI651kGN4fXP3zj*%m!iSstxb^aK`~1>* zk2tDxfhde(1dz;wW$TfJcCJPY4}%vb6K+)&aCYYJ7}Jzgw1A2a-dwE37rwe4U}E?c z`0x_D07E}M)Cq|W1)fJ_5%OY3f<8EH`T&V80yZj~ZWT|j1tkq54ut|i070x=O!l3g zvNVnQJ^FjWcpN0eutMSMQN$xe#4o{-!K0DEk@90NMOkUJzZC0CbS}9*>@VcPp!$zS z8YKZsScCN;zQNg%Y2f8eqTW8Q4jX;gP{oD8^^2B|9xX4H+<`73nd-%(?i(b5bf+MA zj|=fWHO?}qF!P(Kh=}4B*8s(U1Y3sy4N3sBj}pSa!}<4+y+W6blk+b)|JFeKcR2qy zu1xcts+^`cos6i0vYok?f}?{YgPOU$wWy<=*&mpN{}-=D!v5#(TnPsdD6Aboj#k0g zRMpYm*x{co|MYJxEFky&mxF_60cj`vA&>a#;W$BHef@d;{dcGS`xE~CO8&E9{ }S)#UzRrmS2X@P9K? zP9D&fg@3bBj#s< `I-SF4-|2g-={-@gIUq;Hp z4Z^^GYo+Gzl;klr34g7O{xWt7($~k-Pr%a ?dL;{5e8|KP@Mac2KRkd$$?k&olZu7H8?Y_VfaoxRm|`rN*{ zdh2^>aNl1+=2k8&Vd3$)8u1jNl^nOOVI-8PjM0LL$xu7-f{?_)K>KN{mI=mvcy$a1 z0o0Xax62#7oqDSG`BHA1ubuENr4+ ^x4n{JoO$7Y4PHJ!d&D=9qEMs#HqYGsck9HK&i;S2lOVn_)_ps3o5lR`k# z)d3xG;ET!I=3fmL{7#vQ_+c+Bs>0 guw- zLs4NSDu{8JzGb*INEm(mlTB34{%_JqiC@N!39rRp2ff hiFVphI?lcawyYFXi@4H%fK$8GRM`hABK5 z#{RQ-F1ga`R=@R-#n2iPY<8~)_nJ4f++0>-Lj;=lK=eLN-}^|1pzc2069;WEacF)u zOI-RKC#S-2sv63#T133{#fF>JR8^(LOO2lEdB;@30}PI^8e-ZX-hU8xPSY-=G@4RC zjFQ!YUi^faeAXDjXgP$jlkph@v5-Rb5Wh=cMRSeYC{4CErd Dpj(3@O_*k+GrgTs8)Cs=^S*gKDnbxB~y=nP!N_| zcu*RH#>Y$(TUwU*ddHHfnr07X1N%$Iq4TJR=8@_Rt~K346ws}u(e}yKhS*eX9MYIV zPQ6fu5KBPO8}#KTV05*0$|opUjz}dr@8q_4gLh_EflRd^xr8Blxcf)3>Eka=rvOPQ zS5a^E{N5jw&(dsjGhf=4P-aR7)wjMfVtML neoIU-BA=s4~oWzAEym{#*^3{g@9 ze6Cs QQV_Wi||s zbuX{7 s`^Np@-I)paPmQszBZd_~kEH>#+q}iZwZoc6*nzdgkNl0H5I=d|9 z^L9fb?wS^mkC-HGl8;K$qMu|?>QKAvMoPhwOGP?uZg*~U(ma8GHq&1E7b5J3ft!($ z_0OdyzwO=o $?v2_id#Ce^<(W$ge+ip}*u83s6A* zw^^o+vXnHA80M4d>>Ley3n+AV-0{W>Xx4QD`~bo}8F*w6?3W_*(M6=FxbHhEUy@29 z7Ru*qYZn$dmL=gTUMX96F}HoLR7A9)Q$ZAO-5Qhnfd9!;B4_m&A&IFt&F;zWY4)L- z`D=0P1eD=RDwK<~M%<;HMY6q%*jX1j)#k8%ug0FJq*;*4x`y+49yvOT4-cD)p0*u{ zXEAf_!kvjC^k++orjOy|_fLcnYE>7GtshbxEliKYqhj#}?%p&?FH9nWg|{{yVsCN| zKZkUETe8$VfK5E}b4rat2n>wK9*gQb?TYtj;t!bM*KLRbl?E>Q6ut!KNQ<1?%y7 z+((DD^Q|JD98s71a9~>;>H=LU=e(rkUeB5(&DPw@mU+BK_lJszvImtEMpalBjt--h zHEam0W{<`$N)fG-569Q`mo4ZtsSv4FfFp{yK}bgJ2jpm`7d8ayW{6GZ#2}*gGKe2X zO;HMDtm9@*CY+IkgA`n6@4lFY2W*fI ={a_f}IaSGFRd&c{6ON$RlcvFr~ zdnpGs%Q|1_aBnY=V@{tXCf*8eNQLuB4dt#(HxCwt*AiDDOq5Ls+&P(Sz^a)lh&p60 zMj55ArZx=Av>8Hg-eO`=U9_*X2ffF9qqk(%-tmOw+Y|a;(b(?|AsY@JJ-<{MAJkd0 z3ex>3j5w=J70N;8A|80yr?OZYavO)#KoqiZTl)ghD+MhZtW4Ifl&skcBUld~WxaH* z3LjcJN21JnP8S^J9j3lm=`LCIoGy!ns*t_D-P;`K=?iooZz>)nouUf@s$}6l7cCo^ zG^K)8U_8t44`@tqKHV#_Y1ghy#_H&`520yHM!OF!883(CS4XZCM+c)U$OTzTyjRXR zj6&eONU{;P8xbinDtw}l*kwscJ0!;-sTmcKa40!Rf}-Puf}$%rxJyZmtj5o Qo&mm5h%u$(zs|r!! z?$P^f(7iQ=weZ14Wobj>NPed%mLe=5v+P*CR$ 70W>1 zPmM8&O1GU=oBDi}Hx|}5XyI9e!ihL3XFS}VX6toy%`)gf5$m@y^Jbl8vSEzmwv`5y zuN=iw)2b9UJdbL^+Lu>#A@3fOa|NfSvrse-yV`oM&w32PebinL45D2*N*l@(WE?a; zxfci#WE{KNyE1vy=IY|$vh%A()hZX<+GTeO#s`;(;5qSqia6LR!SB~_f;xh7sIjG* z+$9-|HqQWeFsu(lA>KQqeC`|ZoH;XgCqxhH=`lfGQw2pMe(&pbq_Le1|5Tv0*~L;% z{L;n5z)#rQ@8TOI+i^DUt3$r}`rVBEr`5wzhJK~ 8yJ_y(d%M@wl&C)e}>8gvc+g(&-BNMK}S1N>0O{;p{M zB?116HYP17Eh{PaFC^LTs>@&U0|xMiCFy@A!+<#SpGp`Z&};Z-B@E_w73_Cq?DzC{ z73KT?5B2QF`QML!zxGF7nBVjKJFdUe|DOIM_ir`+LI16!zw`V^|JAM^sqa^Q|Nh|l z<@j&Q`i1ZB_5Zu{pMCXLtv_o2-#h|K`aksjrKEq=vS07?Cw2SpCdI#o>R*HH_rdqO z9qd1i(BDj9-wm4I=WKu2!kB=@B;YiKgOC-d!2+i#zpB|lCH7Ba*sogl-;7}}|9`b? zLcs4v(!XihKTLvuv!nukx0liXIZI(;2Yk2f{TE}{u%?GS&a8)@okIeczzZ<(Q&12( zkT@`jIIs>WQgKN_%7~A`5fHTTO=JV;v;!%| ^W=gWf40gnsPyX|}{RDm^)r#jVWh?4%}aShl=J53e22))#;2-5+y&= zW00U2jrKn`+NlZL_*LQ#dpQp-dae4Y@B3W^cYB4a?9&|~XY8&CY$GyTcx?C#p>|!} zd}y9(oF3eRP{V|+VDG(1LtS$)El_#+;KdGADY|3WGZb w4sI@A47l7P0Zi*2yl zW%Q;ba@vT&Bk@CwGDGp*+mNd&Rn;yk#T)Z^8XVJ1Olp;r@yh5DoJln!4iiS6$ST*k zl&pFGd!CXEv?}f^e3C_fGjI3a+?cHjs4oSz3B|jDpSB6-1wqlQw<@a-F(U)0vN;VE z_s=$Xx3j$EC*e#7r#%RXV7Dxx__dD%77@7e0QzPR?ip8wj|mGmMUNzw^v7H|E1|mD z7(VfLEfe$xF6k%5md{}e?Pb?uX-eAdZ#=o%aV9p|dgc`l&NB8Gb@_Mq+NnID%;KW` zm!aO7F3x3FdobL?hf#F8R*8tZT55jPf6Y5|`QTXtU1KCoZ;>Vuk=HsXt>5Hp9K0>v zo3-)aR88%Dbc}{x$_^QB?mEm?!k~NNiijIScd^VKf50fe+Yw)|!qZT4hF}}nUwsVx zcHNIQK`z63UDI2&=Jo}@G&6g1Y{H7h6}7tm)~wO4j>g4Z-?a|*!rTI%J8*Gy#4zOR z6xLW|&Ki~N#B^*!Dob1c+|1m0=6Kb1+n#k=-zL7guLV=xgJR7PGgoBuC8eYQ WUTq&k~-$8{oRt^ zj=mfdf9iihM*qGOF}u*j#h=vujVEJZn;K7w|CDCIOJAI~$XW5QZ<#